[
  {
    "path": ".gitattributes",
    "content": "# Apply override to all files and directories in the directory\n# https://github.com/github-linguist/linguist/blob/master/docs/overrides.md#vendored-code\n/src/windhawk/*/libraries/** linguist-vendored\n/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/app.css linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: ['https://ramensoftware.com/donate']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report a bug in Windhawk\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n<!--\nFor reporting a bug in a specific mod, please create an issue here:\nhttps://github.com/ramensoftware/windhawk-mods/issues\n\n⚠️ Before reporting a bug, please go over the troubleshooting page:\nhttps://github.com/ramensoftware/windhawk/wiki/Troubleshooting\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for Windhawk\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n<!--\nFor suggesting an idea for a specific mod or for a new mod idea, please create an issue here:\nhttps://github.com/ramensoftware/windhawk-mods/issues\n-->\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://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    Windhawk, The customization marketplace for Windows programs.\n    Copyright (C) 2023  Michael Maltsev\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 <https://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    Windhawk  Copyright (C) 2023  Michael Maltsev\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<https://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<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# Windhawk\n\n![Screenshot](screenshot.png)\n\nWindhawk aims to make it easier to customize Windows programs. For more details, see [the official website](https://windhawk.net/) and [the announcement](https://ramensoftware.com/windhawk).\n\nThis repository is used to [report issues](https://github.com/ramensoftware/windhawk/issues) and to [discuss Windhawk](https://github.com/ramensoftware/windhawk/discussions). For discussing Windhawk mods, refer to [the windhawk-mods repository](https://github.com/ramensoftware/windhawk-mods).\n\nYou're also welcome to join [the Windhawk Discord channel](https://discord.com/servers/windhawk-923944342991818753) for a live discussion.\n\n## Technical details\n\nHigh level architecture:\n\n![High level architecture diagram](diagram.png)\n\nFor technical details about the global injection and hooking method that is used, refer to the following blog post: [Implementing Global Injection and Hooking in Windows](https://m417z.com/Implementing-Global-Injection-and-Hooking-in-Windows/).\n\n## Source code\n\nThe Windhawk source code can be found in the `src` folder, which contains the following subfolders:\n\n* `windhawk`: The code of the main `windhawk.exe` executable and the 32-bit and 64-bit `windhawk.dll` engine libraries.\n\n* `vscode-windhawk`: The code of the VSCode extension that is responsible for UI operations such as installing mods and listing installed mods.\n\n* `vscode-windhawk-ui`: The UI part of the VSCode extension.\n\nA simple way to get started is by extracting the portable version of Windhawk with the official installer, building the part of Windhawk that you want to modify, and then replacing the corresponding files in the portable version with the newly built files.\n\n## Additional resources\n\nCode which demonstrates the global injection and hooking method that is used can be found in this repository: [global-inject-demo](https://github.com/m417z/global-inject-demo).\n"
  },
  {
    "path": "src/vscode-windhawk/.eslintrc.js",
    "content": "/**@type {import('eslint').Linter.Config} */\n// eslint-disable-next-line no-undef\nmodule.exports = {\n\troot: true,\n\tparser: '@typescript-eslint/parser',\n\tplugins: [\n\t\t'@typescript-eslint',\n\t],\n\textends: [\n\t\t'eslint:recommended',\n\t\t'plugin:@typescript-eslint/recommended',\n\t],\n\trules: {\n\t\t'semi': [2, \"always\"],\n\t\t'@typescript-eslint/no-unused-vars': 0,\n\t\t'@typescript-eslint/no-explicit-any': 0,\n\t\t'@typescript-eslint/explicit-module-boundary-types': 0,\n\t\t'@typescript-eslint/no-non-null-assertion': 0,\n\t}\n};"
  },
  {
    "path": "src/vscode-windhawk/.gitignore",
    "content": "node_modules/\nout/\nwebview/\nprebuilds/\ndist/\nwindhawk*.vsix\n"
  },
  {
    "path": "src/vscode-windhawk/.prettierrc",
    "content": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": "src/vscode-windhawk/.vscode/extensions.json",
    "content": "{\n\t// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n\t// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp\n\n\t// List of extensions which should be recommended for users of this workspace.\n\t\"recommendations\": [\n\t\t\"dbaeumer.vscode-eslint\"\n\t]\n}"
  },
  {
    "path": "src/vscode-windhawk/.vscode/launch.json",
    "content": "// A launch configuration that compiles the extension and then opens it inside a new window\n// Use IntelliSense to learn about possible attributes.\n// Hover to view descriptions of existing attributes.\n// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n{\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t\"name\": \"Launch Extension\",\n\t\t\t\"type\": \"extensionHost\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"runtimeExecutable\": \"${execPath}\",\n\t\t\t\"args\": [\n\t\t\t\t\"--extensionDevelopmentPath=${workspaceRoot}\"\n\t\t\t],\n\t\t\t\"outFiles\": [\n\t\t\t\t\"${workspaceFolder}/dist/**/*.js\"\n\t\t\t],\n\t\t\t\"preLaunchTask\": \"npm: webpack\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "src/vscode-windhawk/.vscode/settings.json",
    "content": "{\n    \"editor.insertSpaces\": false,\n    \"cSpell.words\": [\n        \"DUNICODE\",\n        \"DWORD\",\n        \"HKCU\",\n        \"HKEY\",\n        \"HKLM\",\n        \"Windhawk\",\n        \"cppbuild\",\n        \"cppdbg\",\n        \"localizable\",\n        \"opendir\",\n        \"userprofile\"\n    ]\n}"
  },
  {
    "path": "src/vscode-windhawk/.vscode/tasks.json",
    "content": "// See https://go.microsoft.com/fwlink/?LinkId=733558\n// for the documentation about the tasks.json format\n{\n\t\"version\": \"2.0.0\",\n\t\"tasks\": [\n\t\t{\n\t\t\t\"type\": \"npm\",\n\t\t\t\"script\": \"watch\",\n\t\t\t\"problemMatcher\": \"$tsc-watch\",\n\t\t\t\"isBackground\": true,\n\t\t\t\"presentation\": {\n\t\t\t\t\"reveal\": \"never\"\n\t\t\t},\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "src/vscode-windhawk/.vscodeignore",
    "content": ".vscode/**\nhelper_scripts/**\nsrc/**\nout/**\nnode_modules/**\n.claude/**\ntsconfig.json\n.gitignore\nCLAUDE.local.md\n"
  },
  {
    "path": "src/vscode-windhawk/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://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    VSCode Windhawk - Part of the Windhawk Windows customization tool\n    Copyright (C) 2021  Michael Maltsev\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 <https://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    VSCode Windhawk  Copyright (C) 2021  Michael Maltsev\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<https://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<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "src/vscode-windhawk/README.md",
    "content": "# Windhawk VSCode extension\n\nPart of the Windhawk Windows customization tool.\n\nhttps://windhawk.net/\n"
  },
  {
    "path": "src/vscode-windhawk/files/mod_template.wh.cpp",
    "content": "// ==WindhawkMod==\n// @id              new-mod\n// @name            Your Awesome Mod\n// @description     The best mod ever that does great things\n// @version         0.1\n// @author          You\n// @github          https://github.com/nat\n// @twitter         https://twitter.com/jack\n// @homepage        https://your-personal-homepage.example.com/\n// @include         mspaint.exe\n// @compilerOptions -lcomdlg32\n// @license         MIT\n// ==/WindhawkMod==\n\n// ==WindhawkModReadme==\n/*\n# Your Awesome Mod\nThis is a place for useful information about your mod. Use it to describe the\nmod, explain why it's useful, and add any other relevant details. You can use\n[Markdown](https://en.wikipedia.org/wiki/Markdown) to add links and\n**formatting** to the readme.\n\nThis short sample customizes Microsoft Paint by forcing it to use just a single\ncolor, and by blocking file opening. To see the mod in action:\n- Compile the mod with the button on the left or with Ctrl+B.\n- Run Microsoft Paint from the start menu (type \"Paint\") or by running\n  mspaint.exe.\n- Draw something and notice that the orange color is always used, regardless of\n  the color you pick.\n- Try opening a file and notice that it's blocked.\n\n# Getting started\nCheck out the documentation\n[here](https://github.com/ramensoftware/windhawk/wiki/Creating-a-new-mod).\n*/\n// ==/WindhawkModReadme==\n\n// ==WindhawkModSettings==\n/*\n# Here you can define settings, in YAML format, that the mod users will be able\n# to configure. Metadata values such as $name and $description are optional.\n# Check out the documentation for more information:\n# https://github.com/ramensoftware/windhawk/wiki/Creating-a-new-mod#settings\n- color:\n  - red: 255\n  - green: 127\n  - blue: 39\n  $name: Custom color\n  $description: This color will be used regardless of the selected color.\n- blockOpen: true\n  $name: Block opening files\n  $description: When enabled, opening files in Paint is not allowed.\n*/\n// ==/WindhawkModSettings==\n\n// The source code of the mod starts here. This sample was inspired by the great\n// article of Kyle Halladay, X64 Function Hooking by Example:\n// https://kylehalladay.com/blog/2020/11/13/Hooking-By-Example.html\n// If you're new to terms such as code injection and function hooking, the\n// article is great to get started.\n\n#include <gdiplus.h>\n\nusing namespace Gdiplus;\n\nstruct {\n    BYTE red;\n    BYTE green;\n    BYTE blue;\n    bool blockOpen;\n} settings;\n\nusing GdipSetSolidFillColor_t = decltype(&DllExports::GdipSetSolidFillColor);\nGdipSetSolidFillColor_t GdipSetSolidFillColor_Original;\nGpStatus WINAPI GdipSetSolidFillColor_Hook(GpSolidFill* brush, ARGB color) {\n    Wh_Log(L\"GdipSetSolidFillColor_Hook: color=%08X\", color);\n\n    // If the color is not transparent, replace it.\n    if (Color(color).GetAlpha() == 255) {\n        color =\n            Color::MakeARGB(255, settings.red, settings.green, settings.blue);\n    }\n\n    // Call the original function.\n    return GdipSetSolidFillColor_Original(brush, color);\n}\n\nusing GetOpenFileNameW_t = decltype(&GetOpenFileNameW);\nGetOpenFileNameW_t GetOpenFileNameW_Original;\nBOOL WINAPI GetOpenFileNameW_Hook(LPOPENFILENAMEW params) {\n    Wh_Log(L\"GetOpenFileNameW_Hook\");\n\n    if (settings.blockOpen) {\n        // Forbid the operation and return without calling the original\n        // function.\n        MessageBoxW(GetActiveWindow(), L\"Opening files is forbidden\",\n                    L\"Surprise!\", MB_OK);\n        return FALSE;\n    }\n\n    return GetOpenFileNameW_Original(params);\n}\n\nvoid LoadSettings() {\n    settings.red = Wh_GetIntSetting(L\"color.red\");\n    settings.green = Wh_GetIntSetting(L\"color.green\");\n    settings.blue = Wh_GetIntSetting(L\"color.blue\");\n    settings.blockOpen = Wh_GetIntSetting(L\"blockOpen\");\n}\n\n// The mod is being initialized, load settings, hook functions, and do other\n// initialization stuff if required.\nBOOL Wh_ModInit() {\n    Wh_Log(L\"Init\");\n\n    LoadSettings();\n\n    HMODULE gdiPlusModule = LoadLibrary(L\"gdiplus.dll\");\n    GdipSetSolidFillColor_t GdipSetSolidFillColor =\n        (GdipSetSolidFillColor_t)GetProcAddress(gdiPlusModule,\n                                                \"GdipSetSolidFillColor\");\n\n    Wh_SetFunctionHook((void*)GdipSetSolidFillColor,\n                       (void*)GdipSetSolidFillColor_Hook,\n                       (void**)&GdipSetSolidFillColor_Original);\n\n    Wh_SetFunctionHook((void*)GetOpenFileNameW, (void*)GetOpenFileNameW_Hook,\n                       (void**)&GetOpenFileNameW_Original);\n\n    return TRUE;\n}\n\n// The mod is being unloaded, free all allocated resources.\nvoid Wh_ModUninit() {\n    Wh_Log(L\"Uninit\");\n}\n\n// The mod setting were changed, reload them.\nvoid Wh_ModSettingsChanged() {\n    Wh_Log(L\"SettingsChanged\");\n\n    LoadSettings();\n}\n"
  },
  {
    "path": "src/vscode-windhawk/helper_scripts/disable_default_keybindings.py",
    "content": "import json\n\n\n# How to get these keybindings:\n# * Create Windhawk bundle.\n# * Remove Windhawk extension from UI.\n# * Run UI -> Ctrl+Shift+P -> Preferences: Open Default Keyboard Shortcuts (JSON).\nDEFAULT_KEYBINDINGS = json.loads(R'''\n[\n{ \"key\": \"escape escape\",         \"command\": \"workbench.action.exitZenMode\",\n                                     \"when\": \"inZenMode\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeReferenceSearch\",\n                                     \"when\": \"inReferenceSearchEditor && !config.editor.stablePeek\" },\n{ \"key\": \"escape\",                \"command\": \"closeReferenceSearch\",\n                                     \"when\": \"inReferenceSearchEditor && !config.editor.stablePeek\" },\n{ \"key\": \"escape\",                \"command\": \"editor.closeTestPeek\",\n                                     \"when\": \"testing.isInPeek && !config.editor.stablePeek || testing.isPeekVisible && !config.editor.stablePeek\" },\n{ \"key\": \"shift+escape\",          \"command\": \"cancelSelection\",\n                                     \"when\": \"editorHasSelection && textInputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"cancelSelection\",\n                                     \"when\": \"editorHasSelection && textInputFocus\" },\n{ \"key\": \"ctrl+end\",              \"command\": \"cursorBottom\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+end\",        \"command\": \"cursorBottomSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+down\",   \"command\": \"cursorColumnSelectDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+left\",   \"command\": \"cursorColumnSelectLeft\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+pagedown\", \"command\": \"cursorColumnSelectPageDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+pageup\", \"command\": \"cursorColumnSelectPageUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+right\",  \"command\": \"cursorColumnSelectRight\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+alt+up\",     \"command\": \"cursorColumnSelectUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"down\",                  \"command\": \"cursorDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+down\",       \"command\": \"cursorDownSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+down\",            \"command\": \"cursorDownSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"end\",                   \"command\": \"cursorEnd\",\n                                     \"when\": \"textInputFocus\",\n                                     \"args\": {\"sticky\":false} },\n{ \"key\": \"shift+end\",             \"command\": \"cursorEndSelect\",\n                                     \"when\": \"textInputFocus\",\n                                     \"args\": {\"sticky\":false} },\n{ \"key\": \"home\",                  \"command\": \"cursorHome\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+home\",            \"command\": \"cursorHomeSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"left\",                  \"command\": \"cursorLeft\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+left\",            \"command\": \"cursorLeftSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"pagedown\",              \"command\": \"cursorPageDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+pagedown\",        \"command\": \"cursorPageDownSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"pageup\",                \"command\": \"cursorPageUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+pageup\",          \"command\": \"cursorPageUpSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"right\",                 \"command\": \"cursorRight\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+right\",           \"command\": \"cursorRightSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+home\",             \"command\": \"cursorTop\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+home\",       \"command\": \"cursorTopSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"up\",                    \"command\": \"cursorUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+shift+up\",         \"command\": \"cursorUpSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+up\",              \"command\": \"cursorUpSelect\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+backspace\",       \"command\": \"deleteLeft\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"backspace\",             \"command\": \"deleteLeft\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"delete\",                \"command\": \"deleteRight\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+a\",                \"command\": \"editor.action.selectAll\" },\n{ \"key\": \"ctrl+l\",                \"command\": \"expandLineSelection\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"shift+tab\",             \"command\": \"outdent\",\n                                     \"when\": \"editorTextFocus && !editorReadonly && !editorTabMovesFocus\" },\n{ \"key\": \"ctrl+shift+z\",          \"command\": \"redo\" },\n{ \"key\": \"ctrl+y\",                \"command\": \"redo\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"scrollLineDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"scrollLineUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"alt+pagedown\",          \"command\": \"scrollPageDown\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"alt+pageup\",            \"command\": \"scrollPageUp\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"tab\",                   \"command\": \"tab\",\n                                     \"when\": \"editorTextFocus && !editorReadonly && !editorTabMovesFocus\" },\n{ \"key\": \"ctrl+z\",                \"command\": \"undo\" },\n{ \"key\": \"shift+down\",            \"command\": \"cursorColumnSelectDown\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+left\",            \"command\": \"cursorColumnSelectLeft\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+pagedown\",        \"command\": \"cursorColumnSelectPageDown\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+pageup\",          \"command\": \"cursorColumnSelectPageUp\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+right\",           \"command\": \"cursorColumnSelectRight\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+up\",              \"command\": \"cursorColumnSelectUp\",\n                                     \"when\": \"editorColumnSelection && textInputFocus\" },\n{ \"key\": \"shift+escape\",          \"command\": \"removeSecondaryCursors\",\n                                     \"when\": \"editorHasMultipleSelections && textInputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"removeSecondaryCursors\",\n                                     \"when\": \"editorHasMultipleSelections && textInputFocus\" },\n{ \"key\": \"f12\",                   \"command\": \"goToNextReference\",\n                                     \"when\": \"inReferenceSearchEditor || referenceSearchVisible\" },\n{ \"key\": \"f4\",                    \"command\": \"goToNextReference\",\n                                     \"when\": \"inReferenceSearchEditor || referenceSearchVisible\" },\n{ \"key\": \"shift+f12\",             \"command\": \"goToPreviousReference\",\n                                     \"when\": \"inReferenceSearchEditor || referenceSearchVisible\" },\n{ \"key\": \"shift+f4\",              \"command\": \"goToPreviousReference\",\n                                     \"when\": \"inReferenceSearchEditor || referenceSearchVisible\" },\n{ \"key\": \"shift+enter\",           \"command\": \"refactorPreview.apply\",\n                                     \"when\": \"refactorPreview.enabled && refactorPreview.enabled && refactorPreview.hasCheckedChanges && focusedView == 'refactorPreview'\" },\n{ \"key\": \"alt+enter\",             \"command\": \"testing.editFocusedTest\",\n                                     \"when\": \"focusedView == 'workbench.view.testing'\" },\n{ \"key\": \"escape\",                \"command\": \"notebook.cell.quitEdit\",\n                                     \"when\": \"inputFocus && notebookEditorFocused && !editorHasMultipleSelections && !editorHasSelection && !editorHoverVisible\" },\n{ \"key\": \"ctrl+alt+enter\",        \"command\": \"notebook.cell.quitEdit\",\n                                     \"when\": \"inputFocus && notebookEditorFocused && !editorHasMultipleSelections && !editorHasSelection && !editorHoverVisible && notebookCellType == 'markup'\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"actions.find\",\n                                     \"when\": \"editorFocus || editorIsOpen\" },\n{ \"key\": \"enter\",                 \"command\": \"breakpointWidget.action.acceptInput\",\n                                     \"when\": \"breakpointWidgetVisible && inBreakpointWidget\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeBreakpointWidget\",\n                                     \"when\": \"breakpointWidgetVisible && textInputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"closeBreakpointWidget\",\n                                     \"when\": \"breakpointWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+u\",                \"command\": \"cursorUndo\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+right\",            \"command\": \"cursorWordEndRight\",\n                                     \"when\": \"textInputFocus && !accessibilityModeEnabled\" },\n{ \"key\": \"ctrl+shift+right\",      \"command\": \"cursorWordEndRightSelect\",\n                                     \"when\": \"textInputFocus && !accessibilityModeEnabled\" },\n{ \"key\": \"ctrl+left\",             \"command\": \"cursorWordLeft\",\n                                     \"when\": \"textInputFocus && !accessibilityModeEnabled\" },\n{ \"key\": \"ctrl+shift+left\",       \"command\": \"cursorWordLeftSelect\",\n                                     \"when\": \"textInputFocus && !accessibilityModeEnabled\" },\n{ \"key\": \"ctrl+backspace\",        \"command\": \"deleteWordLeft\",\n                                     \"when\": \"textInputFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+delete\",           \"command\": \"deleteWordRight\",\n                                     \"when\": \"textInputFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+c\",         \"command\": \"editor.action.addCommentLine\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+d\",                \"command\": \"editor.action.addSelectionToNextFindMatch\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"shift+alt+.\",           \"command\": \"editor.action.autoFix\",\n                                     \"when\": \"editorTextFocus && !editorReadonly && supportedCodeAction =~ /(\\\\s|^)quickfix\\\\b/\" },\n{ \"key\": \"shift+alt+a\",           \"command\": \"editor.action.blockComment\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"escape\",                \"command\": \"editor.action.cancelSelectionAnchor\",\n                                     \"when\": \"editorTextFocus && selectionAnchorSet\" },\n{ \"key\": \"ctrl+f2\",               \"command\": \"editor.action.changeAll\",\n                                     \"when\": \"editorTextFocus && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+insert\",           \"command\": \"editor.action.clipboardCopyAction\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"editor.action.clipboardCopyAction\" },\n{ \"key\": \"shift+delete\",          \"command\": \"editor.action.clipboardCutAction\" },\n{ \"key\": \"ctrl+x\",                \"command\": \"editor.action.clipboardCutAction\" },\n{ \"key\": \"shift+insert\",          \"command\": \"editor.action.clipboardPasteAction\" },\n{ \"key\": \"ctrl+v\",                \"command\": \"editor.action.clipboardPasteAction\" },\n{ \"key\": \"ctrl+/\",                \"command\": \"editor.action.commentLine\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"shift+alt+down\",        \"command\": \"editor.action.copyLinesDownAction\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"shift+alt+up\",          \"command\": \"editor.action.copyLinesUpAction\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+k\",         \"command\": \"editor.action.defineKeybinding\",\n                                     \"when\": \"editorTextFocus && !editorReadonly && editorLangId == 'jsonc'\" },\n{ \"key\": \"ctrl+shift+k\",          \"command\": \"editor.action.deleteLines\",\n                                     \"when\": \"textInputFocus && !editorReadonly\" },\n{ \"key\": \"f7\",                    \"command\": \"editor.action.diffReview.next\",\n                                     \"when\": \"isInDiffEditor\" },\n{ \"key\": \"shift+f7\",              \"command\": \"editor.action.diffReview.prev\",\n                                     \"when\": \"isInDiffEditor\" },\n{ \"key\": \"alt+f3\",                \"command\": \"editor.action.dirtydiff.next\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+alt+f3\",          \"command\": \"editor.action.dirtydiff.previous\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"editor.action.extensioneditor.findNext\",\n                                     \"when\": \"webviewFindWidgetFocused && !editorFocus && activeEditor == 'workbench.editor.extension'\" },\n{ \"key\": \"shift+enter\",           \"command\": \"editor.action.extensioneditor.findPrevious\",\n                                     \"when\": \"webviewFindWidgetFocused && !editorFocus && activeEditor == 'workbench.editor.extension'\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"editor.action.extensioneditor.showfind\",\n                                     \"when\": \"!editorFocus && activeEditor == 'workbench.editor.extension'\" },\n{ \"key\": \"shift+alt+f\",           \"command\": \"editor.action.formatDocument\",\n                                     \"when\": \"editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor\" },\n{ \"key\": \"shift+alt+f\",           \"command\": \"editor.action.formatDocument.none\",\n                                     \"when\": \"editorTextFocus && !editorHasDocumentFormattingProvider && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+f\",         \"command\": \"editor.action.formatSelection\",\n                                     \"when\": \"editorHasDocumentSelectionFormattingProvider && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+f12\",              \"command\": \"editor.action.goToImplementation\",\n                                     \"when\": \"editorHasImplementationProvider && editorTextFocus && !isInEmbeddedEditor\" },\n{ \"key\": \"shift+f12\",             \"command\": \"editor.action.goToReferences\",\n                                     \"when\": \"editorHasReferenceProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor\" },\n{ \"key\": \"ctrl+shift+.\",          \"command\": \"editor.action.inPlaceReplace.down\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+shift+,\",          \"command\": \"editor.action.inPlaceReplace.up\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+]\",                \"command\": \"editor.action.indentLines\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"escape\",                \"command\": \"editor.action.inlineSuggest.hide\",\n                                     \"when\": \"inlineSuggestionVisible\" },\n{ \"key\": \"alt+]\",                 \"command\": \"editor.action.inlineSuggest.showNext\",\n                                     \"when\": \"inlineSuggestionVisible && !editorReadonly\" },\n{ \"key\": \"alt+[\",                 \"command\": \"editor.action.inlineSuggest.showPrevious\",\n                                     \"when\": \"inlineSuggestionVisible && !editorReadonly\" },\n{ \"key\": \"ctrl+alt+up\",           \"command\": \"editor.action.insertCursorAbove\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+alt+i\",           \"command\": \"editor.action.insertCursorAtEndOfEachLineSelected\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+alt+down\",         \"command\": \"editor.action.insertCursorBelow\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"editor.action.insertLineAfter\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+shift+enter\",      \"command\": \"editor.action.insertLineBefore\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+shift+\\\\\",         \"command\": \"editor.action.jumpToBracket\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+shift+f2\",         \"command\": \"editor.action.linkedEditing\",\n                                     \"when\": \"editorHasRenameProvider && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"alt+f8\",                \"command\": \"editor.action.marker.next\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"f8\",                    \"command\": \"editor.action.marker.nextInFiles\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"shift+alt+f8\",          \"command\": \"editor.action.marker.prev\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"shift+f8\",              \"command\": \"editor.action.marker.prevInFiles\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"alt+down\",              \"command\": \"editor.action.moveLinesDownAction\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"alt+up\",                \"command\": \"editor.action.moveLinesUpAction\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+d\",         \"command\": \"editor.action.moveSelectionToNextFindMatch\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"f3\",                    \"command\": \"editor.action.nextMatchFindAction\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"editor.action.nextMatchFindAction\",\n                                     \"when\": \"editorFocus && findInputFocussed\" },\n{ \"key\": \"ctrl+f3\",               \"command\": \"editor.action.nextSelectionMatchFindAction\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"shift+alt+o\",           \"command\": \"editor.action.organizeImports\",\n                                     \"when\": \"editorTextFocus && !editorReadonly && supportedCodeAction =~ /(\\\\s|^)source\\\\.organizeImports\\\\b/\" },\n{ \"key\": \"ctrl+[\",                \"command\": \"editor.action.outdentLines\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"alt+f12\",               \"command\": \"editor.action.peekDefinition\",\n                                     \"when\": \"editorHasDefinitionProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor\" },\n{ \"key\": \"ctrl+shift+f12\",        \"command\": \"editor.action.peekImplementation\",\n                                     \"when\": \"editorHasImplementationProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor\" },\n{ \"key\": \"shift+f3\",              \"command\": \"editor.action.previousMatchFindAction\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"shift+enter\",           \"command\": \"editor.action.previousMatchFindAction\",\n                                     \"when\": \"editorFocus && findInputFocussed\" },\n{ \"key\": \"ctrl+shift+f3\",         \"command\": \"editor.action.previousSelectionMatchFindAction\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"ctrl+.\",                \"command\": \"editor.action.quickFix\",\n                                     \"when\": \"editorHasCodeActionsProvider && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+shift+r\",          \"command\": \"editor.action.refactor\",\n                                     \"when\": \"editorHasCodeActionsProvider && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+u\",         \"command\": \"editor.action.removeCommentLine\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"f2\",                    \"command\": \"editor.action.rename\",\n                                     \"when\": \"editorHasRenameProvider && editorTextFocus && !editorReadonly\" },\n{ \"key\": \"f12\",                   \"command\": \"editor.action.revealDefinition\",\n                                     \"when\": \"editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor\" },\n{ \"key\": \"ctrl+k f12\",            \"command\": \"editor.action.revealDefinitionAside\",\n                                     \"when\": \"editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor\" },\n{ \"key\": \"ctrl+k ctrl+k\",         \"command\": \"editor.action.selectFromAnchorToCursor\",\n                                     \"when\": \"editorTextFocus && selectionAnchorSet\" },\n{ \"key\": \"ctrl+shift+l\",          \"command\": \"editor.action.selectHighlights\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"ctrl+k ctrl+b\",         \"command\": \"editor.action.setSelectionAnchor\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"alt+f1\",                \"command\": \"editor.action.showAccessibilityHelp\" },\n{ \"key\": \"shift+f10\",             \"command\": \"editor.action.showContextMenu\",\n                                     \"when\": \"textInputFocus\" },\n{ \"key\": \"ctrl+k ctrl+i\",         \"command\": \"editor.action.showHover\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+alt+right\",       \"command\": \"editor.action.smartSelect.expand\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+alt+left\",        \"command\": \"editor.action.smartSelect.shrink\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+h\",                \"command\": \"editor.action.startFindReplaceAction\",\n                                     \"when\": \"editorFocus || editorIsOpen\" },\n{ \"key\": \"ctrl+m\",                \"command\": \"editor.action.toggleTabFocusMode\" },\n{ \"key\": \"alt+z\",                 \"command\": \"editor.action.toggleWordWrap\" },\n{ \"key\": \"ctrl+shift+space\",      \"command\": \"editor.action.triggerParameterHints\",\n                                     \"when\": \"editorHasSignatureHelpProvider && editorTextFocus\" },\n{ \"key\": \"ctrl+i\",                \"command\": \"editor.action.triggerSuggest\",\n                                     \"when\": \"editorHasCompletionItemProvider && textInputFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+space\",            \"command\": \"editor.action.triggerSuggest\",\n                                     \"when\": \"editorHasCompletionItemProvider && textInputFocus && !editorReadonly\" },\n{ \"key\": \"ctrl+k ctrl+x\",         \"command\": \"editor.action.trimTrailingWhitespace\",\n                                     \"when\": \"editorTextFocus && !editorReadonly\" },\n{ \"key\": \"enter\",                 \"command\": \"editor.action.webvieweditor.findNext\",\n                                     \"when\": \"webviewFindWidgetFocused && !editorFocus && activeEditor == 'WebviewEditor'\" },\n{ \"key\": \"shift+enter\",           \"command\": \"editor.action.webvieweditor.findPrevious\",\n                                     \"when\": \"webviewFindWidgetFocused && !editorFocus && activeEditor == 'WebviewEditor'\" },\n{ \"key\": \"escape\",                \"command\": \"editor.action.webvieweditor.hideFind\",\n                                     \"when\": \"webviewFindWidgetVisible && !editorFocus && activeEditor == 'WebviewEditor'\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"editor.action.webvieweditor.showFind\",\n                                     \"when\": \"webviewFindWidgetEnabled && !editorFocus && activeEditor == 'WebviewEditor'\" },\n{ \"key\": \"f7\",                    \"command\": \"editor.action.wordHighlight.next\",\n                                     \"when\": \"editorTextFocus && hasWordHighlights\" },\n{ \"key\": \"shift+f7\",              \"command\": \"editor.action.wordHighlight.prev\",\n                                     \"when\": \"editorTextFocus && hasWordHighlights\" },\n{ \"key\": \"escape\",                \"command\": \"editor.cancelOperation\",\n                                     \"when\": \"cancellableOperation\" },\n{ \"key\": \"escape\",                \"command\": \"editor.debug.action.closeExceptionWidget\",\n                                     \"when\": \"exceptionWidgetVisible\" },\n{ \"key\": \"ctrl+k ctrl+i\",         \"command\": \"editor.debug.action.showDebugHover\",\n                                     \"when\": \"editorTextFocus && inDebugMode\" },\n{ \"key\": \"f9\",                    \"command\": \"editor.debug.action.toggleBreakpoint\",\n                                     \"when\": \"debuggersAvailable && editorTextFocus\" },\n{ \"key\": \"tab\",                   \"command\": \"editor.emmet.action.expandAbbreviation\",\n                                     \"when\": \"config.emmet.triggerExpansionOnTab && editorTextFocus && !editorReadonly && !editorTabMovesFocus\" },\n{ \"key\": \"ctrl+shift+[\",          \"command\": \"editor.fold\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+0\",         \"command\": \"editor.foldAll\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+/\",         \"command\": \"editor.foldAllBlockComments\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+-\",         \"command\": \"editor.foldAllExcept\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+8\",         \"command\": \"editor.foldAllMarkerRegions\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+1\",         \"command\": \"editor.foldLevel1\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+2\",         \"command\": \"editor.foldLevel2\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+3\",         \"command\": \"editor.foldLevel3\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+4\",         \"command\": \"editor.foldLevel4\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+5\",         \"command\": \"editor.foldLevel5\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+6\",         \"command\": \"editor.foldLevel6\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+7\",         \"command\": \"editor.foldLevel7\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+[\",         \"command\": \"editor.foldRecursively\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"f12\",                   \"command\": \"editor.gotoNextSymbolFromResult\",\n                                     \"when\": \"hasSymbols\" },\n{ \"key\": \"escape\",                \"command\": \"editor.gotoNextSymbolFromResult.cancel\",\n                                     \"when\": \"hasSymbols\" },\n{ \"key\": \"ctrl+k ctrl+l\",         \"command\": \"editor.toggleFold\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+shift+]\",          \"command\": \"editor.unfold\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+j\",         \"command\": \"editor.unfoldAll\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+=\",         \"command\": \"editor.unfoldAllExcept\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+9\",         \"command\": \"editor.unfoldAllMarkerRegions\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"ctrl+k ctrl+]\",         \"command\": \"editor.unfoldRecursively\",\n                                     \"when\": \"editorTextFocus && foldingEnabled\" },\n{ \"key\": \"right\",                 \"command\": \"gettingStarted.next\",\n                                     \"when\": \"inWelcome && activeEditor == 'gettingStartedPage'\" },\n{ \"key\": \"down\",                  \"command\": \"gettingStarted.next\",\n                                     \"when\": \"inWelcome && activeEditor == 'gettingStartedPage'\" },\n{ \"key\": \"left\",                  \"command\": \"gettingStarted.prev\",\n                                     \"when\": \"inWelcome && activeEditor == 'gettingStartedPage'\" },\n{ \"key\": \"up\",                    \"command\": \"gettingStarted.prev\",\n                                     \"when\": \"inWelcome && activeEditor == 'gettingStartedPage'\" },\n{ \"key\": \"tab\",                   \"command\": \"insertSnippet\",\n                                     \"when\": \"editorTextFocus && hasSnippetCompletions && !editorTabMovesFocus && !inSnippetMode\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"interactive.execute\",\n                                     \"when\": \"resourceScheme == 'vscode-interactive'\" },\n{ \"key\": \"ctrl+alt+enter\",        \"command\": \"notebook.cell.execute\",\n                                     \"when\": \"notebookCellListFocused && notebookMissingKernelExtension && !notebookCellExecuting && notebookCellType == 'code' || notebookCellListFocused && !notebookCellExecuting && notebookCellType == 'code' && notebookKernelCount > 0\" },\n{ \"key\": \"alt+enter\",             \"command\": \"notebook.cell.executeAndInsertBelow\",\n                                     \"when\": \"notebookCellListFocused && notebookMissingKernelExtension && !notebookCellExecuting && notebookCellType == 'code' || notebookCellListFocused && !notebookCellExecuting && notebookCellType == 'code' && notebookKernelCount > 0\" },\n{ \"key\": \"shift+enter\",           \"command\": \"notebook.cell.executeAndSelectBelow\",\n                                     \"when\": \"notebookCellListFocused && notebookCellType == 'markup' || notebookCellListFocused && notebookMissingKernelExtension && !notebookCellExecuting && notebookCellType == 'code' || notebookCellListFocused && !notebookCellExecuting && notebookCellType == 'code' && notebookKernelCount > 0\" },\n{ \"key\": \"ctrl+shift+v\",          \"command\": \"notebook.cell.pasteAbove\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"down\",                  \"command\": \"notebook.focusNextEditor\",\n                                     \"when\": \"config.notebook.navigation.allowNavigateToSurroundingCells && editorTextFocus && inputFocus && notebookEditorFocused && notebookEditorCursorAtBoundary != 'none' && notebookEditorCursorAtBoundary != 'top'\" },\n{ \"key\": \"up\",                    \"command\": \"notebook.focusPreviousEditor\",\n                                     \"when\": \"config.notebook.navigation.allowNavigateToSurroundingCells && editorTextFocus && inputFocus && notebookEditorFocused && notebookEditorCursorAtBoundary != 'bottom' && notebookEditorCursorAtBoundary != 'none'\" },\n{ \"key\": \"shift+alt+f\",           \"command\": \"notebook.formatCell\",\n                                     \"when\": \"editorHasDocumentFormattingProvider && editorTextFocus && inCompositeEditor && notebookEditable && !editorReadonly && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"openReferenceToSide\",\n                                     \"when\": \"listFocus && referenceSearchVisible && !inputFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"repl.action.acceptInput\",\n                                     \"when\": \"inDebugRepl && textInputFocus\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"repl.action.filter\",\n                                     \"when\": \"inDebugRepl && textInputFocus\" },\n{ \"key\": \"ctrl+shift+r\",          \"command\": \"rerunSearchEditorSearch\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"escape\",                \"command\": \"search.action.focusQueryEditorWidget\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"ctrl+shift+backspace\",  \"command\": \"search.searchEditor.action.deleteFileResults\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"escape\",                \"command\": \"settings.action.clearSearchResults\",\n                                     \"when\": \"inSettingsEditor && inSettingsSearch\" },\n{ \"key\": \"down\",                  \"command\": \"settings.action.focusSettingsFile\",\n                                     \"when\": \"inSettingsSearch && !suggestWidgetVisible\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"settings.action.search\",\n                                     \"when\": \"inSettingsEditor\" },\n{ \"key\": \"ctrl+/\",                \"command\": \"toggleExplainMode\",\n                                     \"when\": \"suggestWidgetVisible\" },\n{ \"key\": \"ctrl+k f2\",             \"command\": \"togglePeekWidgetFocus\",\n                                     \"when\": \"inReferenceSearchEditor || referenceSearchVisible\" },\n{ \"key\": \"escape\",                \"command\": \"welcome.goBack\",\n                                     \"when\": \"inWelcome && activeEditor == 'gettingStartedPage'\" },\n{ \"key\": \"alt+f5\",                \"command\": \"workbench.action.editor.nextChange\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+alt+f5\",          \"command\": \"workbench.action.editor.previousChange\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+escape\",          \"command\": \"workbench.action.hideComment\",\n                                     \"when\": \"commentEditorFocused\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.hideComment\",\n                                     \"when\": \"commentEditorFocused\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"workbench.action.submitComment\",\n                                     \"when\": \"commentEditorFocused\" },\n{ \"key\": \"alt+f8\",                \"command\": \"testing.goToNextMessage\",\n                                     \"when\": \"editorFocus && testing.isPeekVisible\" },\n{ \"key\": \"shift+alt+f8\",          \"command\": \"testing.goToPreviousMessage\",\n                                     \"when\": \"editorFocus && testing.isPeekVisible\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeFindWidget\",\n                                     \"when\": \"editorFocus && findWidgetVisible && !isComposing\" },\n{ \"key\": \"escape\",                \"command\": \"closeFindWidget\",\n                                     \"when\": \"editorFocus && findWidgetVisible && !isComposing\" },\n{ \"key\": \"ctrl+alt+enter\",        \"command\": \"editor.action.replaceAll\",\n                                     \"when\": \"editorFocus && findWidgetVisible\" },\n{ \"key\": \"ctrl+shift+1\",          \"command\": \"editor.action.replaceOne\",\n                                     \"when\": \"editorFocus && findWidgetVisible\" },\n{ \"key\": \"enter\",                 \"command\": \"editor.action.replaceOne\",\n                                     \"when\": \"editorFocus && findWidgetVisible && replaceInputFocussed\" },\n{ \"key\": \"alt+enter\",             \"command\": \"editor.action.selectAllMatches\",\n                                     \"when\": \"editorFocus && findWidgetVisible\" },\n{ \"key\": \"alt+c\",                 \"command\": \"toggleFindCaseSensitive\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"alt+l\",                 \"command\": \"toggleFindInSelection\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"alt+r\",                 \"command\": \"toggleFindRegex\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"alt+w\",                 \"command\": \"toggleFindWholeWord\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"alt+p\",                 \"command\": \"togglePreserveCase\",\n                                     \"when\": \"editorFocus\" },\n{ \"key\": \"tab\",                   \"command\": \"jumpToNextSnippetPlaceholder\",\n                                     \"when\": \"editorTextFocus && hasNextTabstop && inSnippetMode\" },\n{ \"key\": \"shift+tab\",             \"command\": \"jumpToPrevSnippetPlaceholder\",\n                                     \"when\": \"editorTextFocus && hasPrevTabstop && inSnippetMode\" },\n{ \"key\": \"escape\",                \"command\": \"leaveEditorMessage\",\n                                     \"when\": \"messageVisible\" },\n{ \"key\": \"shift+escape\",          \"command\": \"leaveSnippet\",\n                                     \"when\": \"editorTextFocus && inSnippetMode\" },\n{ \"key\": \"escape\",                \"command\": \"leaveSnippet\",\n                                     \"when\": \"editorTextFocus && inSnippetMode\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeDirtyDiff\",\n                                     \"when\": \"dirtyDiffVisible\" },\n{ \"key\": \"escape\",                \"command\": \"closeDirtyDiff\",\n                                     \"when\": \"dirtyDiffVisible\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeMarkersNavigation\",\n                                     \"when\": \"editorFocus && markersNavigationVisible\" },\n{ \"key\": \"escape\",                \"command\": \"closeMarkersNavigation\",\n                                     \"when\": \"editorFocus && markersNavigationVisible\" },\n{ \"key\": \"escape\",                \"command\": \"notifications.hideToasts\",\n                                     \"when\": \"notificationToastsVisible\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeParameterHints\",\n                                     \"when\": \"editorFocus && parameterHintsVisible\" },\n{ \"key\": \"escape\",                \"command\": \"closeParameterHints\",\n                                     \"when\": \"editorFocus && parameterHintsVisible\" },\n{ \"key\": \"alt+down\",              \"command\": \"showNextParameterHint\",\n                                     \"when\": \"editorFocus && parameterHintsMultipleSignatures && parameterHintsVisible\" },\n{ \"key\": \"down\",                  \"command\": \"showNextParameterHint\",\n                                     \"when\": \"editorFocus && parameterHintsMultipleSignatures && parameterHintsVisible\" },\n{ \"key\": \"alt+up\",                \"command\": \"showPrevParameterHint\",\n                                     \"when\": \"editorFocus && parameterHintsMultipleSignatures && parameterHintsVisible\" },\n{ \"key\": \"up\",                    \"command\": \"showPrevParameterHint\",\n                                     \"when\": \"editorFocus && parameterHintsMultipleSignatures && parameterHintsVisible\" },\n{ \"key\": \"shift+tab\",             \"command\": \"acceptAlternativeSelectedSuggestion\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus && textInputFocus\" },\n{ \"key\": \"shift+enter\",           \"command\": \"acceptAlternativeSelectedSuggestion\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus && textInputFocus\" },\n{ \"key\": \"tab\",                   \"command\": \"acceptSelectedSuggestion\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"acceptSelectedSuggestion\",\n                                     \"when\": \"acceptSuggestionOnEnter && suggestWidgetVisible && suggestionMakesTextEdit && textInputFocus\" },\n{ \"key\": \"shift+escape\",          \"command\": \"hideSuggestWidget\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"hideSuggestWidget\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"tab\",                   \"command\": \"insertBestCompletion\",\n                                     \"when\": \"atEndOfWord && textInputFocus && !hasOtherSuggestions && !inSnippetMode && !suggestWidgetVisible && config.editor.tabCompletion == 'on'\" },\n{ \"key\": \"tab\",                   \"command\": \"insertNextSuggestion\",\n                                     \"when\": \"hasOtherSuggestions && textInputFocus && textInputFocus && !inSnippetMode && !suggestWidgetVisible && config.editor.tabCompletion == 'on'\" },\n{ \"key\": \"shift+tab\",             \"command\": \"insertPrevSuggestion\",\n                                     \"when\": \"hasOtherSuggestions && textInputFocus && textInputFocus && !inSnippetMode && !suggestWidgetVisible && config.editor.tabCompletion == 'on'\" },\n{ \"key\": \"ctrl+pagedown\",         \"command\": \"selectNextPageSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"pagedown\",              \"command\": \"selectNextPageSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"selectNextSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"down\",                  \"command\": \"selectNextSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+pageup\",           \"command\": \"selectPrevPageSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"pageup\",                \"command\": \"selectPrevPageSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"selectPrevSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"up\",                    \"command\": \"selectPrevSuggestion\",\n                                     \"when\": \"suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+space\",            \"command\": \"toggleSuggestionDetails\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"ctrl+alt+space\",        \"command\": \"toggleSuggestionFocus\",\n                                     \"when\": \"suggestWidgetVisible && textInputFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"acceptRenameInput\",\n                                     \"when\": \"editorFocus && renameInputVisible\" },\n{ \"key\": \"shift+enter\",           \"command\": \"acceptRenameInputWithPreview\",\n                                     \"when\": \"config.editor.rename.enablePreview && editorFocus && renameInputVisible\" },\n{ \"key\": \"shift+escape\",          \"command\": \"cancelLinkedEditingInput\",\n                                     \"when\": \"LinkedEditingInputVisible && editorTextFocus\" },\n{ \"key\": \"escape\",                \"command\": \"cancelLinkedEditingInput\",\n                                     \"when\": \"LinkedEditingInputVisible && editorTextFocus\" },\n{ \"key\": \"shift+escape\",          \"command\": \"cancelRenameInput\",\n                                     \"when\": \"editorFocus && renameInputVisible\" },\n{ \"key\": \"escape\",                \"command\": \"cancelRenameInput\",\n                                     \"when\": \"editorFocus && renameInputVisible\" },\n{ \"key\": \"ctrl+shift+l\",          \"command\": \"addCursorsAtSearchResults\",\n                                     \"when\": \"fileMatchOrMatchFocus && searchViewletVisible\" },\n{ \"key\": \"ctrl+shift+;\",          \"command\": \"breadcrumbs.focus\",\n                                     \"when\": \"breadcrumbsPossible\" },\n{ \"key\": \"ctrl+shift+.\",          \"command\": \"breadcrumbs.focusAndSelect\",\n                                     \"when\": \"breadcrumbsPossible\" },\n{ \"key\": \"ctrl+right\",            \"command\": \"breadcrumbs.focusNext\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"right\",                 \"command\": \"breadcrumbs.focusNext\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"ctrl+left\",             \"command\": \"breadcrumbs.focusPrevious\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"left\",                  \"command\": \"breadcrumbs.focusPrevious\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"breadcrumbs.revealFocused\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"space\",                 \"command\": \"breadcrumbs.revealFocused\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"breadcrumbs.revealFocusedFromTreeAside\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible && listFocus && !inputFocus\" },\n{ \"key\": \"down\",                  \"command\": \"breadcrumbs.selectFocused\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"enter\",                 \"command\": \"breadcrumbs.selectFocused\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"ctrl+shift+.\",          \"command\": \"breadcrumbs.toggleToOn\",\n                                     \"when\": \"!config.breadcrumbs.enabled\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeAccessibilityHelp\",\n                                     \"when\": \"accessibilityHelpWidgetVisible && editorFocus\" },\n{ \"key\": \"escape\",                \"command\": \"closeAccessibilityHelp\",\n                                     \"when\": \"accessibilityHelpWidgetVisible && editorFocus\" },\n{ \"key\": \"escape\",                \"command\": \"closeReplaceInFilesWidget\",\n                                     \"when\": \"replaceInputBoxFocus && searchViewletVisible\" },\n{ \"key\": \"shift+alt+c\",           \"command\": \"copyFilePath\",\n                                     \"when\": \"!editorFocus\" },\n{ \"key\": \"ctrl+k ctrl+shift+c\",   \"command\": \"copyRelativeFilePath\",\n                                     \"when\": \"!editorFocus\" },\n{ \"key\": \"alt+enter\",             \"command\": \"debug.openBreakpointToSide\",\n                                     \"when\": \"breakpointsFocused\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"debug.openBreakpointToSide\",\n                                     \"when\": \"breakpointsFocused\" },\n{ \"key\": \"ctrl+f5\",               \"command\": \"debug.openView\",\n                                     \"when\": \"!debuggersAvailable\" },\n{ \"key\": \"f5\",                    \"command\": \"debug.openView\",\n                                     \"when\": \"!debuggersAvailable\" },\n{ \"key\": \"delete\",                \"command\": \"debug.removeBreakpoint\",\n                                     \"when\": \"breakpointsFocused && !breakpointInputFocused\" },\n{ \"key\": \"delete\",                \"command\": \"debug.removeWatchExpression\",\n                                     \"when\": \"watchExpressionsFocused && !expressionSelected\" },\n{ \"key\": \"alt+-\",                 \"command\": \"decreaseSearchEditorContextLines\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"tab\",                   \"command\": \"editor.action.inlineSuggest.commit\",\n                                     \"when\": \"inlineSuggestionVisible && !editorTabMovesFocus && !inlineSuggestionHasIndentation\" },\n{ \"key\": \"shift+f9\",              \"command\": \"editor.debug.action.toggleInlineBreakpoint\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"shift+enter\",           \"command\": \"editor.refocusCallHierarchy\",\n                                     \"when\": \"callHierarchyVisible\" },\n{ \"key\": \"shift+alt+h\",           \"command\": \"editor.showCallHierarchy\",\n                                     \"when\": \"editorHasCallHierarchyProvider && editorTextFocus && !inReferenceSearchEditor\" },\n{ \"key\": \"shift+alt+h\",           \"command\": \"editor.showIncomingCalls\",\n                                     \"when\": \"callHierarchyVisible && callHierarchyDirection == 'outgoingCalls'\" },\n{ \"key\": \"shift+alt+h\",           \"command\": \"editor.showOutgoingCalls\",\n                                     \"when\": \"callHierarchyVisible && callHierarchyDirection == 'incomingCalls'\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"explorer.openToSide\",\n                                     \"when\": \"explorerViewletFocus && explorerViewletVisible && !inputFocus\" },\n{ \"key\": \"shift+alt+f\",           \"command\": \"filesExplorer.findInFolder\",\n                                     \"when\": \"explorerResourceIsFolder && explorerViewletVisible && filesExplorerFocus && !inputFocus\" },\n{ \"key\": \"alt+down\",              \"command\": \"history.showNext\",\n                                     \"when\": \"historyNavigationEnabled && historyNavigationWidget\" },\n{ \"key\": \"down\",                  \"command\": \"history.showNext\",\n                                     \"when\": \"historyNavigationEnabled && historyNavigationWidget\" },\n{ \"key\": \"alt+up\",                \"command\": \"history.showPrevious\",\n                                     \"when\": \"historyNavigationEnabled && historyNavigationWidget\" },\n{ \"key\": \"up\",                    \"command\": \"history.showPrevious\",\n                                     \"when\": \"historyNavigationEnabled && historyNavigationWidget\" },\n{ \"key\": \"alt+=\",                 \"command\": \"increaseSearchEditorContextLines\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"down\",                  \"command\": \"interactive.history.next\",\n                                     \"when\": \"!suggestWidgetVisible && resourceScheme == 'vscode-interactive' && interactiveInputCursorAtBoundary != 'none' && interactiveInputCursorAtBoundary != 'top'\" },\n{ \"key\": \"up\",                    \"command\": \"interactive.history.previous\",\n                                     \"when\": \"!suggestWidgetVisible && resourceScheme == 'vscode-interactive' && interactiveInputCursorAtBoundary != 'bottom' && interactiveInputCursorAtBoundary != 'none'\" },\n{ \"key\": \"ctrl+k ctrl+a\",         \"command\": \"keybindings.editor.addKeybinding\",\n                                     \"when\": \"inKeybindings && keybindingFocus\" },\n{ \"key\": \"escape\",                \"command\": \"keybindings.editor.clearSearchResults\",\n                                     \"when\": \"inKeybindings && inKeybindingsSearch\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"keybindings.editor.copyKeybindingEntry\",\n                                     \"when\": \"inKeybindings && keybindingFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"keybindings.editor.defineKeybinding\",\n                                     \"when\": \"inKeybindings && keybindingFocus\" },\n{ \"key\": \"ctrl+k ctrl+e\",         \"command\": \"keybindings.editor.defineWhenExpression\",\n                                     \"when\": \"inKeybindings && keybindingFocus\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"keybindings.editor.focusKeybindings\",\n                                     \"when\": \"inKeybindings && inKeybindingsSearch\" },\n{ \"key\": \"alt+k\",                 \"command\": \"keybindings.editor.recordSearchKeys\",\n                                     \"when\": \"inKeybindings && inKeybindingsSearch\" },\n{ \"key\": \"delete\",                \"command\": \"keybindings.editor.removeKeybinding\",\n                                     \"when\": \"inKeybindings && keybindingFocus && !inputFocus\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"keybindings.editor.searchKeybindings\",\n                                     \"when\": \"inKeybindings\" },\n{ \"key\": \"alt+p\",                 \"command\": \"keybindings.editor.toggleSortByPrecedence\",\n                                     \"when\": \"inKeybindings\" },\n{ \"key\": \"escape\",                \"command\": \"list.clear\",\n                                     \"when\": \"listFocus && listHasSelectionOrFocus && !inputFocus\" },\n{ \"key\": \"left\",                  \"command\": \"list.collapse\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+left\",             \"command\": \"list.collapseAll\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"right\",                 \"command\": \"list.expand\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"shift+down\",            \"command\": \"list.expandSelectionDown\",\n                                     \"when\": \"listFocus && listSupportsMultiselect && !inputFocus\" },\n{ \"key\": \"shift+up\",              \"command\": \"list.expandSelectionUp\",\n                                     \"when\": \"listFocus && listSupportsMultiselect && !inputFocus\" },\n{ \"key\": \"down\",                  \"command\": \"list.focusDown\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"home\",                  \"command\": \"list.focusFirst\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"end\",                   \"command\": \"list.focusLast\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"pagedown\",              \"command\": \"list.focusPageDown\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"pageup\",                \"command\": \"list.focusPageUp\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"up\",                    \"command\": \"list.focusUp\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"list.scrollDown\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"list.scrollUp\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"list.select\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+a\",                \"command\": \"list.selectAll\",\n                                     \"when\": \"listFocus && listSupportsMultiselect && !inputFocus\" },\n{ \"key\": \"space\",                 \"command\": \"list.toggleExpand\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+shift+enter\",      \"command\": \"list.toggleSelection\",\n                                     \"when\": \"listFocus && !inputFocus\" },\n{ \"key\": \"y\",                     \"command\": \"notebook.cell.changeToCode\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook' && notebookCellType == 'markup'\" },\n{ \"key\": \"m\",                     \"command\": \"notebook.cell.changeToMarkdown\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook' && notebookCellType == 'code'\" },\n{ \"key\": \"alt+delete\",            \"command\": \"notebook.cell.clearOutputs\",\n                                     \"when\": \"notebookCellEditable && notebookCellHasOutputs && notebookEditable && notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"ctrl+k ctrl+c\",         \"command\": \"notebook.cell.collapseCellInput\",\n                                     \"when\": \"notebookCellListFocused && !inputFocus && !notebookCellInputIsCollapsed\" },\n{ \"key\": \"ctrl+k t\",              \"command\": \"notebook.cell.collapseCellOutput\",\n                                     \"when\": \"notebookCellHasOutputs && notebookCellListFocused && !inputFocus && !notebookCellOutputIsCollapsed\" },\n{ \"key\": \"shift+alt+down\",        \"command\": \"notebook.cell.copyDown\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"shift+alt+up\",          \"command\": \"notebook.cell.copyUp\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"delete\",                \"command\": \"notebook.cell.delete\",\n                                     \"when\": \"notebookEditable && notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"notebook.cell.edit\",\n                                     \"when\": \"notebookCellListFocused && notebookEditable && !inputFocus\" },\n{ \"key\": \"ctrl+k ctrl+c\",         \"command\": \"notebook.cell.expandCellInput\",\n                                     \"when\": \"notebookCellInputIsCollapsed && notebookCellListFocused\" },\n{ \"key\": \"ctrl+k t\",              \"command\": \"notebook.cell.expandCellOutput\",\n                                     \"when\": \"notebookCellListFocused && notebookCellOutputIsCollapsed\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"notebook.cell.focusInOutput\",\n                                     \"when\": \"notebookCellHasOutputs && notebookEditorFocused\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"notebook.cell.focusOutOutput\",\n                                     \"when\": \"notebookEditorFocused\" },\n{ \"key\": \"ctrl+shift+enter\",      \"command\": \"notebook.cell.insertCodeCellAbove\",\n                                     \"when\": \"notebookCellListFocused && !inputFocus\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"notebook.cell.insertCodeCellBelow\",\n                                     \"when\": \"notebookCellListFocused && !inputFocus\" },\n{ \"key\": \"shift+alt+win+j\",       \"command\": \"notebook.cell.joinAbove\",\n                                     \"when\": \"notebookEditorFocused\" },\n{ \"key\": \"alt+win+j\",             \"command\": \"notebook.cell.joinBelow\",\n                                     \"when\": \"notebookEditorFocused\" },\n{ \"key\": \"alt+down\",              \"command\": \"notebook.cell.moveDown\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"alt+up\",                \"command\": \"notebook.cell.moveUp\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"ctrl+k ctrl+shift+\\\\\",  \"command\": \"notebook.cell.split\",\n                                     \"when\": \"notebookCellEditable && notebookEditable && notebookEditorFocused\" },\n{ \"key\": \"ctrl+l\",                \"command\": \"notebook.centerActiveCell\",\n                                     \"when\": \"notebookEditorFocused\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"notebook.find\",\n                                     \"when\": \"notebookEditorFocused || !editorFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"ctrl+end\",              \"command\": \"notebook.focusBottom\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"notebook.focusNextEditor\",\n                                     \"when\": \"notebookEditorFocused && notebookOutputFocused\" },\n{ \"key\": \"ctrl+home\",             \"command\": \"notebook.focusTop\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus\" },\n{ \"key\": \"left\",                  \"command\": \"notebook.fold\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"ctrl+shift+[\",          \"command\": \"notebook.fold\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"shift+alt+f\",           \"command\": \"notebook.format\",\n                                     \"when\": \"notebookEditable && !editorTextFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"escape\",                \"command\": \"notebook.hideFind\",\n                                     \"when\": \"notebookEditorFocused && notebookFindWidgetFocused\" },\n{ \"key\": \"right\",                 \"command\": \"notebook.unfold\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"ctrl+shift+]\",          \"command\": \"notebook.unfold\",\n                                     \"when\": \"notebookEditorFocused && !inputFocus && activeEditor == 'workbench.editor.notebook'\" },\n{ \"key\": \"delete\",                \"command\": \"notification.clear\",\n                                     \"when\": \"notificationFocus\" },\n{ \"key\": \"left\",                  \"command\": \"notification.collapse\",\n                                     \"when\": \"notificationFocus\" },\n{ \"key\": \"right\",                 \"command\": \"notification.expand\",\n                                     \"when\": \"notificationFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"notification.toggle\",\n                                     \"when\": \"notificationFocus\" },\n{ \"key\": \"space\",                 \"command\": \"notification.toggle\",\n                                     \"when\": \"notificationFocus\" },\n{ \"key\": \"home\",                  \"command\": \"notifications.focusFirstToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"pageup\",                \"command\": \"notifications.focusFirstToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"end\",                   \"command\": \"notifications.focusLastToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"pagedown\",              \"command\": \"notifications.focusLastToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"down\",                  \"command\": \"notifications.focusNextToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"up\",                    \"command\": \"notifications.focusPreviousToast\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"problems.action.copy\",\n                                     \"when\": \"problemFocus\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"problems.action.focusFilter\",\n                                     \"when\": \"focusedView == 'workbench.panel.markers.view'\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"problems.action.focusProblemsFromFilter\",\n                                     \"when\": \"problemsFilterFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"problems.action.open\",\n                                     \"when\": \"problemFocus\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"problems.action.openToSide\",\n                                     \"when\": \"problemFocus\" },\n{ \"key\": \"ctrl+.\",                \"command\": \"problems.action.showQuickFixes\",\n                                     \"when\": \"problemFocus\" },\n{ \"key\": \"space\",                 \"command\": \"refactorPreview.toggleCheckedState\",\n                                     \"when\": \"listFocus && refactorPreview.enabled && !inputFocus\" },\n{ \"key\": \"shift+alt+r\",           \"command\": \"revealFileInOS\",\n                                     \"when\": \"!editorFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"revealReference\",\n                                     \"when\": \"listFocus && referenceSearchVisible && !inputFocus\" },\n{ \"key\": \"ctrl+k s\",              \"command\": \"saveAll\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"scm.acceptInput\",\n                                     \"when\": \"scmRepository\" },\n{ \"key\": \"alt+down\",              \"command\": \"scm.forceViewNextCommit\",\n                                     \"when\": \"scmRepository\" },\n{ \"key\": \"alt+up\",                \"command\": \"scm.forceViewPreviousCommit\",\n                                     \"when\": \"scmRepository\" },\n{ \"key\": \"down\",                  \"command\": \"scm.viewNextCommit\",\n                                     \"when\": \"scmInputIsInLastPosition && scmRepository && !suggestWidgetVisible\" },\n{ \"key\": \"up\",                    \"command\": \"scm.viewPreviousCommit\",\n                                     \"when\": \"scmInputIsInFirstPosition && scmRepository && !suggestWidgetVisible\" },\n{ \"key\": \"escape\",                \"command\": \"search.action.cancel\",\n                                     \"when\": \"listFocus && searchViewletVisible && !inputFocus && searchState != '0'\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"search.action.copyMatch\",\n                                     \"when\": \"fileMatchOrMatchFocus\" },\n{ \"key\": \"shift+alt+c\",           \"command\": \"search.action.copyPath\",\n                                     \"when\": \"fileMatchOrFolderMatchWithResourceFocus\" },\n{ \"key\": \"f4\",                    \"command\": \"search.action.focusNextSearchResult\",\n                                     \"when\": \"hasSearchResult || inSearchEditor\" },\n{ \"key\": \"shift+f4\",              \"command\": \"search.action.focusPreviousSearchResult\",\n                                     \"when\": \"hasSearchResult || inSearchEditor\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"search.action.focusSearchFromResults\",\n                                     \"when\": \"firstMatchFocus && searchViewletVisible\" },\n{ \"key\": \"alt+enter\",             \"command\": \"search.action.openInEditor\",\n                                     \"when\": \"hasSearchResult && searchViewletFocus\" },\n{ \"key\": \"enter\",                 \"command\": \"search.action.openResult\",\n                                     \"when\": \"fileMatchOrMatchFocus && searchViewletVisible\" },\n{ \"key\": \"ctrl+enter\",            \"command\": \"search.action.openResultToSide\",\n                                     \"when\": \"fileMatchOrMatchFocus && searchViewletVisible\" },\n{ \"key\": \"delete\",                \"command\": \"search.action.remove\",\n                                     \"when\": \"fileMatchOrMatchFocus && searchViewletVisible\" },\n{ \"key\": \"ctrl+shift+1\",          \"command\": \"search.action.replace\",\n                                     \"when\": \"matchFocus && replaceActive && searchViewletVisible\" },\n{ \"key\": \"ctrl+alt+enter\",        \"command\": \"search.action.replaceAll\",\n                                     \"when\": \"replaceActive && searchViewletVisible && !findWidgetVisible\" },\n{ \"key\": \"ctrl+shift+enter\",      \"command\": \"search.action.replaceAllInFile\",\n                                     \"when\": \"fileMatchFocus && replaceActive && searchViewletVisible\" },\n{ \"key\": \"ctrl+shift+1\",          \"command\": \"search.action.replaceAllInFile\",\n                                     \"when\": \"fileMatchFocus && replaceActive && searchViewletVisible\" },\n{ \"key\": \"ctrl+shift+enter\",      \"command\": \"search.action.replaceAllInFolder\",\n                                     \"when\": \"folderMatchFocus && replaceActive && searchViewletVisible\" },\n{ \"key\": \"ctrl+shift+1\",          \"command\": \"search.action.replaceAllInFolder\",\n                                     \"when\": \"folderMatchFocus && replaceActive && searchViewletVisible\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"search.focus.nextInputBox\",\n                                     \"when\": \"inSearchEditor && inputBoxFocus || inputBoxFocus && searchViewletVisible\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"search.focus.previousInputBox\",\n                                     \"when\": \"inSearchEditor && inputBoxFocus || inputBoxFocus && searchViewletVisible && !searchInputBoxFocus\" },\n{ \"key\": \"ctrl+shift+l\",          \"command\": \"selectAllSearchEditorMatches\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"escape\",                \"command\": \"settings.action.focusLevelUp\",\n                                     \"when\": \"inSettingsEditor && !inSettingsJSONEditor && !inSettingsSearch\" },\n{ \"key\": \"enter\",                 \"command\": \"settings.action.focusSettingControl\",\n                                     \"when\": \"settingRowFocus\" },\n{ \"key\": \"down\",                  \"command\": \"settings.action.focusSettingsFromSearch\",\n                                     \"when\": \"inSettingsSearch && !suggestWidgetVisible\" },\n{ \"key\": \"enter\",                 \"command\": \"settings.action.focusSettingsList\",\n                                     \"when\": \"inSettingsEditor && settingsTocRowFocus\" },\n{ \"key\": \"left\",                  \"command\": \"settings.action.focusTOC\",\n                                     \"when\": \"inSettingsEditor && settingRowFocus\" },\n{ \"key\": \"shift+f9\",              \"command\": \"settings.action.showContextMenu\",\n                                     \"when\": \"inSettingsEditor\" },\n{ \"key\": \"ctrl+; ctrl+x\",         \"command\": \"testing.cancelRun\" },\n{ \"key\": \"ctrl+; ctrl+a\",         \"command\": \"testing.debugAll\" },\n{ \"key\": \"ctrl+; ctrl+c\",         \"command\": \"testing.debugAtCursor\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+; ctrl+f\",         \"command\": \"testing.debugCurrentFile\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+; ctrl+e\",         \"command\": \"testing.debugFailTests\" },\n{ \"key\": \"ctrl+; ctrl+l\",         \"command\": \"testing.debugLastRun\" },\n{ \"key\": \"ctrl+; m\",              \"command\": \"testing.openOutputPeek\" },\n{ \"key\": \"ctrl+; e\",              \"command\": \"testing.reRunFailTests\" },\n{ \"key\": \"ctrl+; l\",              \"command\": \"testing.reRunLastRun\" },\n{ \"key\": \"ctrl+; a\",              \"command\": \"testing.runAll\" },\n{ \"key\": \"ctrl+; c\",              \"command\": \"testing.runAtCursor\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+; f\",              \"command\": \"testing.runCurrentFile\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+; ctrl+o\",         \"command\": \"testing.showMostRecentOutput\",\n                                     \"when\": \"testing.hasAnyResults\" },\n{ \"key\": \"alt+c\",                 \"command\": \"toggleSearchCaseSensitive\",\n                                     \"when\": \"searchViewletFocus\" },\n{ \"key\": \"alt+c\",                 \"command\": \"toggleSearchEditorCaseSensitive\",\n                                     \"when\": \"inSearchEditor && searchInputBoxFocus\" },\n{ \"key\": \"alt+l\",                 \"command\": \"toggleSearchEditorContextLines\",\n                                     \"when\": \"inSearchEditor\" },\n{ \"key\": \"alt+r\",                 \"command\": \"toggleSearchEditorRegex\",\n                                     \"when\": \"inSearchEditor && searchInputBoxFocus\" },\n{ \"key\": \"alt+w\",                 \"command\": \"toggleSearchEditorWholeWord\",\n                                     \"when\": \"inSearchEditor && searchInputBoxFocus\" },\n{ \"key\": \"alt+p\",                 \"command\": \"toggleSearchPreserveCase\",\n                                     \"when\": \"searchViewletFocus\" },\n{ \"key\": \"alt+r\",                 \"command\": \"toggleSearchRegex\",\n                                     \"when\": \"searchViewletFocus\" },\n{ \"key\": \"alt+w\",                 \"command\": \"toggleSearchWholeWord\",\n                                     \"when\": \"searchViewletFocus\" },\n{ \"key\": \"ctrl+alt+win+n\",        \"command\": \"welcome.showNewFileEntries\" },\n{ \"key\": \"ctrl+w\",                \"command\": \"workbench.action.closeActiveEditor\" },\n{ \"key\": \"ctrl+f4\",               \"command\": \"workbench.action.closeActiveEditor\" },\n{ \"key\": \"ctrl+k ctrl+w\",         \"command\": \"workbench.action.closeAllEditors\" },\n{ \"key\": \"ctrl+k ctrl+shift+w\",   \"command\": \"workbench.action.closeAllGroups\" },\n{ \"key\": \"ctrl+k w\",              \"command\": \"workbench.action.closeEditorsInGroup\" },\n{ \"key\": \"ctrl+k f\",              \"command\": \"workbench.action.closeFolder\",\n                                     \"when\": \"emptyWorkspaceSupport\" },\n{ \"key\": \"ctrl+w\",                \"command\": \"workbench.action.closeGroup\",\n                                     \"when\": \"activeEditorGroupEmpty && multipleEditorGroups\" },\n{ \"key\": \"ctrl+f4\",               \"command\": \"workbench.action.closeGroup\",\n                                     \"when\": \"activeEditorGroupEmpty && multipleEditorGroups\" },\n{ \"key\": \"shift+escape\",          \"command\": \"workbench.action.closeQuickOpen\",\n                                     \"when\": \"inQuickOpen\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.closeQuickOpen\",\n                                     \"when\": \"inQuickOpen\" },\n{ \"key\": \"ctrl+k u\",              \"command\": \"workbench.action.closeUnmodifiedEditors\" },\n{ \"key\": \"ctrl+shift+w\",          \"command\": \"workbench.action.closeWindow\" },\n{ \"key\": \"alt+f4\",                \"command\": \"workbench.action.closeWindow\" },\n{ \"key\": \"alt+f5\",                \"command\": \"workbench.action.compareEditor.nextChange\",\n                                     \"when\": \"textCompareEditorVisible\" },\n{ \"key\": \"shift+alt+f5\",          \"command\": \"workbench.action.compareEditor.previousChange\",\n                                     \"when\": \"textCompareEditorVisible\" },\n{ \"key\": \"shift+f5\",              \"command\": \"workbench.action.debug.disconnect\",\n                                     \"when\": \"focusedSessionIsAttach && inDebugMode\" },\n{ \"key\": \"ctrl+shift+f5\",         \"command\": \"workbench.action.debug.restart\",\n                                     \"when\": \"inDebugMode\" },\n{ \"key\": \"ctrl+f5\",               \"command\": \"workbench.action.debug.run\",\n                                     \"when\": \"debuggersAvailable && debugState != 'initializing'\" },\n{ \"key\": \"f5\",                    \"command\": \"workbench.action.debug.start\",\n                                     \"when\": \"debuggersAvailable && debugState == 'inactive'\" },\n{ \"key\": \"shift+f11\",             \"command\": \"workbench.action.debug.stepOut\",\n                                     \"when\": \"debugState == 'stopped'\" },\n{ \"key\": \"f10\",                   \"command\": \"workbench.action.debug.stepOver\",\n                                     \"when\": \"debugState == 'stopped'\" },\n{ \"key\": \"shift+f5\",              \"command\": \"workbench.action.debug.stop\",\n                                     \"when\": \"inDebugMode && !focusedSessionIsAttach\" },\n{ \"key\": \"ctrl+k m\",              \"command\": \"workbench.action.editor.changeLanguageMode\",\n                                     \"when\": \"!notebookEditorFocused\" },\n{ \"key\": \"ctrl+k p\",              \"command\": \"workbench.action.files.copyPathOfActiveFile\" },\n{ \"key\": \"ctrl+n\",                \"command\": \"workbench.action.files.newUntitledFile\" },\n{ \"key\": \"ctrl+o\",                \"command\": \"workbench.action.files.openFile\" },\n{ \"key\": \"ctrl+k ctrl+o\",         \"command\": \"workbench.action.files.openFolder\" },\n{ \"key\": \"ctrl+o\",                \"command\": \"workbench.action.files.openLocalFile\",\n                                     \"when\": \"remoteFileDialogVisible\" },\n{ \"key\": \"ctrl+k ctrl+o\",         \"command\": \"workbench.action.files.openLocalFolder\",\n                                     \"when\": \"remoteFileDialogVisible\" },\n{ \"key\": \"ctrl+k r\",              \"command\": \"workbench.action.files.revealActiveFileInWindows\" },\n{ \"key\": \"ctrl+s\",                \"command\": \"workbench.action.files.save\" },\n{ \"key\": \"ctrl+shift+s\",          \"command\": \"workbench.action.files.saveAs\" },\n{ \"key\": \"ctrl+shift+s\",          \"command\": \"workbench.action.files.saveLocalFile\",\n                                     \"when\": \"remoteFileDialogVisible\" },\n{ \"key\": \"ctrl+k ctrl+shift+s\",   \"command\": \"workbench.action.files.saveWithoutFormatting\" },\n{ \"key\": \"ctrl+k o\",              \"command\": \"workbench.action.files.showOpenedFileInNewWindow\",\n                                     \"when\": \"emptyWorkspaceSupport\" },\n{ \"key\": \"ctrl+shift+f\",          \"command\": \"workbench.action.findInFiles\" },\n{ \"key\": \"ctrl+k ctrl+up\",        \"command\": \"workbench.action.focusAboveGroup\" },\n{ \"key\": \"ctrl+k ctrl+down\",      \"command\": \"workbench.action.focusBelowGroup\" },\n{ \"key\": \"ctrl+8\",                \"command\": \"workbench.action.focusEighthEditorGroup\" },\n{ \"key\": \"ctrl+5\",                \"command\": \"workbench.action.focusFifthEditorGroup\" },\n{ \"key\": \"ctrl+1\",                \"command\": \"workbench.action.focusFirstEditorGroup\" },\n{ \"key\": \"ctrl+4\",                \"command\": \"workbench.action.focusFourthEditorGroup\" },\n{ \"key\": \"ctrl+k ctrl+left\",      \"command\": \"workbench.action.focusLeftGroup\" },\n{ \"key\": \"f6\",                    \"command\": \"workbench.action.focusNextPart\" },\n{ \"key\": \"shift+f6\",              \"command\": \"workbench.action.focusPreviousPart\" },\n{ \"key\": \"ctrl+k ctrl+right\",     \"command\": \"workbench.action.focusRightGroup\" },\n{ \"key\": \"ctrl+2\",                \"command\": \"workbench.action.focusSecondEditorGroup\" },\n{ \"key\": \"ctrl+7\",                \"command\": \"workbench.action.focusSeventhEditorGroup\" },\n{ \"key\": \"ctrl+0\",                \"command\": \"workbench.action.focusSideBar\" },\n{ \"key\": \"ctrl+6\",                \"command\": \"workbench.action.focusSixthEditorGroup\" },\n{ \"key\": \"ctrl+3\",                \"command\": \"workbench.action.focusThirdEditorGroup\" },\n{ \"key\": \"ctrl+g\",                \"command\": \"workbench.action.gotoLine\" },\n{ \"key\": \"ctrl+shift+o\",          \"command\": \"workbench.action.gotoSymbol\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.hideInterfaceOverview\",\n                                     \"when\": \"interfaceOverviewVisible\" },\n{ \"key\": \"down\",                  \"command\": \"workbench.action.interactivePlayground.arrowDown\",\n                                     \"when\": \"interactivePlaygroundFocus && !editorTextFocus\" },\n{ \"key\": \"up\",                    \"command\": \"workbench.action.interactivePlayground.arrowUp\",\n                                     \"when\": \"interactivePlaygroundFocus && !editorTextFocus\" },\n{ \"key\": \"pagedown\",              \"command\": \"workbench.action.interactivePlayground.pageDown\",\n                                     \"when\": \"interactivePlaygroundFocus && !editorTextFocus\" },\n{ \"key\": \"pageup\",                \"command\": \"workbench.action.interactivePlayground.pageUp\",\n                                     \"when\": \"interactivePlaygroundFocus && !editorTextFocus\" },\n{ \"key\": \"ctrl+k enter\",          \"command\": \"workbench.action.keepEditor\" },\n{ \"key\": \"ctrl+k ctrl+r\",         \"command\": \"workbench.action.keybindingsReference\" },\n{ \"key\": \"ctrl+9\",                \"command\": \"workbench.action.lastEditorInGroup\" },\n{ \"key\": \"alt+0\",                 \"command\": \"workbench.action.lastEditorInGroup\" },\n{ \"key\": \"ctrl+k down\",           \"command\": \"workbench.action.moveActiveEditorGroupDown\" },\n{ \"key\": \"ctrl+k left\",           \"command\": \"workbench.action.moveActiveEditorGroupLeft\" },\n{ \"key\": \"ctrl+k right\",          \"command\": \"workbench.action.moveActiveEditorGroupRight\" },\n{ \"key\": \"ctrl+k up\",             \"command\": \"workbench.action.moveActiveEditorGroupUp\" },\n{ \"key\": \"ctrl+shift+pageup\",     \"command\": \"workbench.action.moveEditorLeftInGroup\" },\n{ \"key\": \"ctrl+shift+pagedown\",   \"command\": \"workbench.action.moveEditorRightInGroup\" },\n{ \"key\": \"shift+alt+1\",           \"command\": \"workbench.action.moveEditorToFirstGroup\" },\n{ \"key\": \"shift+alt+9\",           \"command\": \"workbench.action.moveEditorToLastGroup\" },\n{ \"key\": \"ctrl+alt+right\",        \"command\": \"workbench.action.moveEditorToNextGroup\" },\n{ \"key\": \"ctrl+alt+left\",         \"command\": \"workbench.action.moveEditorToPreviousGroup\" },\n{ \"key\": \"alt+left\",              \"command\": \"workbench.action.navigateBack\" },\n{ \"key\": \"alt+right\",             \"command\": \"workbench.action.navigateForward\" },\n{ \"key\": \"ctrl+k ctrl+q\",         \"command\": \"workbench.action.navigateToLastEditLocation\" },\n{ \"key\": \"ctrl+shift+n\",          \"command\": \"workbench.action.newWindow\" },\n{ \"key\": \"ctrl+pagedown\",         \"command\": \"workbench.action.nextEditor\" },\n{ \"key\": \"ctrl+k ctrl+pagedown\",  \"command\": \"workbench.action.nextEditorInGroup\" },\n{ \"key\": \"alt+1\",                 \"command\": \"workbench.action.openEditorAtIndex1\" },\n{ \"key\": \"alt+2\",                 \"command\": \"workbench.action.openEditorAtIndex2\" },\n{ \"key\": \"alt+3\",                 \"command\": \"workbench.action.openEditorAtIndex3\" },\n{ \"key\": \"alt+4\",                 \"command\": \"workbench.action.openEditorAtIndex4\" },\n{ \"key\": \"alt+5\",                 \"command\": \"workbench.action.openEditorAtIndex5\" },\n{ \"key\": \"alt+6\",                 \"command\": \"workbench.action.openEditorAtIndex6\" },\n{ \"key\": \"alt+7\",                 \"command\": \"workbench.action.openEditorAtIndex7\" },\n{ \"key\": \"alt+8\",                 \"command\": \"workbench.action.openEditorAtIndex8\" },\n{ \"key\": \"alt+9\",                 \"command\": \"workbench.action.openEditorAtIndex9\" },\n{ \"key\": \"ctrl+k ctrl+s\",         \"command\": \"workbench.action.openGlobalKeybindings\" },\n{ \"key\": \"ctrl+r\",                \"command\": \"workbench.action.openRecent\" },\n{ \"key\": \"ctrl+,\",                \"command\": \"workbench.action.openSettings\" },\n{ \"key\": \"ctrl+shift+u\",          \"command\": \"workbench.action.output.toggleOutput\",\n                                     \"when\": \"workbench.panel.output.active\" },\n{ \"key\": \"ctrl+k shift+enter\",    \"command\": \"workbench.action.pinEditor\",\n                                     \"when\": \"!activeEditorIsPinned\" },\n{ \"key\": \"ctrl+pageup\",           \"command\": \"workbench.action.previousEditor\" },\n{ \"key\": \"ctrl+k ctrl+pageup\",    \"command\": \"workbench.action.previousEditorInGroup\" },\n{ \"key\": \"ctrl+e\",                \"command\": \"workbench.action.quickOpen\" },\n{ \"key\": \"ctrl+p\",                \"command\": \"workbench.action.quickOpen\" },\n{ \"key\": \"ctrl+shift+tab\",        \"command\": \"workbench.action.quickOpenLeastRecentlyUsedEditorInGroup\" },\n{ \"key\": \"ctrl+tab\",              \"command\": \"workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup\" },\n{ \"key\": \"ctrl+q\",                \"command\": \"workbench.action.quickOpenView\" },\n{ \"key\": \"ctrl+shift+t\",          \"command\": \"workbench.action.reopenClosedEditor\" },\n{ \"key\": \"ctrl+shift+h\",          \"command\": \"workbench.action.replaceInFiles\" },\n{ \"key\": \"ctrl+shift+j\",          \"command\": \"workbench.action.search.toggleQueryDetails\",\n                                     \"when\": \"inSearchEditor || searchViewletFocus\" },\n{ \"key\": \"ctrl+k ctrl+t\",         \"command\": \"workbench.action.selectTheme\" },\n{ \"key\": \"ctrl+k ctrl+p\",         \"command\": \"workbench.action.showAllEditors\" },\n{ \"key\": \"ctrl+t\",                \"command\": \"workbench.action.showAllSymbols\" },\n{ \"key\": \"f1\",                    \"command\": \"workbench.action.showCommands\" },\n{ \"key\": \"ctrl+shift+p\",          \"command\": \"workbench.action.showCommands\" },\n{ \"key\": \"ctrl+\\\\\",               \"command\": \"workbench.action.splitEditor\" },\n{ \"key\": \"ctrl+k ctrl+\\\\\",        \"command\": \"workbench.action.splitEditorOrthogonal\" },\n{ \"key\": \"ctrl+shift+b\",          \"command\": \"workbench.action.tasks.build\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.terminal.clearSelection\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && terminalTextSelected && !terminalFindVisible\" },\n{ \"key\": \"ctrl+shift+c\",          \"command\": \"workbench.action.terminal.copySelection\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"workbench.action.terminal.copySelection\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected\" },\n{ \"key\": \"f3\",                    \"command\": \"workbench.action.terminal.findNext\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"shift+enter\",           \"command\": \"workbench.action.terminal.findNext\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported\" },\n{ \"key\": \"shift+f3\",              \"command\": \"workbench.action.terminal.findPrevious\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"enter\",                 \"command\": \"workbench.action.terminal.findPrevious\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported\" },\n{ \"key\": \"ctrl+f\",                \"command\": \"workbench.action.terminal.focusFind\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+pagedown\",         \"command\": \"workbench.action.terminal.focusNext\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && !terminalEditorFocus\" },\n{ \"key\": \"alt+down\",              \"command\": \"workbench.action.terminal.focusNextPane\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"alt+right\",             \"command\": \"workbench.action.terminal.focusNextPane\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+pageup\",           \"command\": \"workbench.action.terminal.focusPrevious\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && !terminalEditorFocus\" },\n{ \"key\": \"alt+up\",                \"command\": \"workbench.action.terminal.focusPreviousPane\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"alt+left\",              \"command\": \"workbench.action.terminal.focusPreviousPane\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+shift+\\\\\",         \"command\": \"workbench.action.terminal.focusTabs\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported || terminalProcessSupported && terminalTabsFocus\" },\n{ \"key\": \"shift+escape\",          \"command\": \"workbench.action.terminal.hideFind\",\n                                     \"when\": \"terminalFindVisible && terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.terminal.hideFind\",\n                                     \"when\": \"terminalFindVisible && terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+w\",                \"command\": \"workbench.action.terminal.killEditor\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && resourceScheme == 'vscode-terminal'\" },\n{ \"key\": \"ctrl+f4\",               \"command\": \"workbench.action.terminal.killEditor\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && resourceScheme == 'vscode-terminal'\" },\n{ \"key\": \"delete\",                \"command\": \"workbench.action.terminal.killInstance\",\n                                     \"when\": \"terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.action.terminal.navigationModeExit\",\n                                     \"when\": \"accessibilityModeEnabled && terminalA11yTreeFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+down\",             \"command\": \"workbench.action.terminal.navigationModeFocusNext\",\n                                     \"when\": \"accessibilityModeEnabled && terminalA11yTreeFocus && terminalProcessSupported || accessibilityModeEnabled && terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+up\",               \"command\": \"workbench.action.terminal.navigationModeFocusPrevious\",\n                                     \"when\": \"accessibilityModeEnabled && terminalA11yTreeFocus && terminalProcessSupported || accessibilityModeEnabled && terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+shift+`\",          \"command\": \"workbench.action.terminal.new\",\n                                     \"when\": \"terminalProcessSupported\" },\n{ \"key\": \"ctrl+shift+c\",          \"command\": \"workbench.action.terminal.openNativeConsole\",\n                                     \"when\": \"!terminalFocus\" },\n{ \"key\": \"ctrl+shift+v\",          \"command\": \"workbench.action.terminal.paste\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+v\",                \"command\": \"workbench.action.terminal.paste\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"f2\",                    \"command\": \"workbench.action.terminal.renameInstance\",\n                                     \"when\": \"terminalProcessSupported && terminalTabsFocus && terminalTabsSingularSelection\" },\n{ \"key\": \"ctrl+alt+pagedown\",     \"command\": \"workbench.action.terminal.scrollDown\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"shift+pagedown\",        \"command\": \"workbench.action.terminal.scrollDownPage\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && !terminalAltBufferActive\" },\n{ \"key\": \"ctrl+end\",              \"command\": \"workbench.action.terminal.scrollToBottom\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+home\",             \"command\": \"workbench.action.terminal.scrollToTop\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+alt+pageup\",       \"command\": \"workbench.action.terminal.scrollUp\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"shift+pageup\",          \"command\": \"workbench.action.terminal.scrollUpPage\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && !terminalAltBufferActive\" },\n{ \"key\": \"ctrl+v\",                \"command\": \"workbench.action.terminal.sendSequence\",\n                                     \"when\": \"terminalFocus && !accessibilityModeEnabled && terminalShellType == 'pwsh'\",\n                                     \"args\": {\"text\":\"\\u0016\"} },\n{ \"key\": \"ctrl+backspace\",        \"command\": \"workbench.action.terminal.sendSequence\",\n                                     \"when\": \"terminalFocus\",\n                                     \"args\": {\"text\":\"\\u0017\"} },\n{ \"key\": \"ctrl+backspace\",        \"command\": \"workbench.action.terminal.sendSequence\",\n                                     \"when\": \"terminalFocus && terminalShellType == 'cmd'\",\n                                     \"args\": {\"text\":\"\\b\"} },\n{ \"key\": \"ctrl+delete\",           \"command\": \"workbench.action.terminal.sendSequence\",\n                                     \"when\": \"terminalFocus\",\n                                     \"args\": {\"text\":\"\\u001bd\"} },\n{ \"key\": \"ctrl+shift+5\",          \"command\": \"workbench.action.terminal.split\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+shift+5\",          \"command\": \"workbench.action.terminal.splitInstance\",\n                                     \"when\": \"terminalProcessSupported && terminalTabsFocus\" },\n{ \"key\": \"alt+c\",                 \"command\": \"workbench.action.terminal.toggleFindCaseSensitive\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"alt+r\",                 \"command\": \"workbench.action.terminal.toggleFindRegex\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"alt+w\",                 \"command\": \"workbench.action.terminal.toggleFindWholeWord\",\n                                     \"when\": \"terminalFindFocused && terminalProcessSupported || terminalFocus && terminalProcessSupported\" },\n{ \"key\": \"ctrl+`\",                \"command\": \"workbench.action.terminal.toggleTerminal\",\n                                     \"when\": \"terminal.active\" },\n{ \"key\": \"shift+alt+0\",           \"command\": \"workbench.action.toggleEditorGroupLayout\" },\n{ \"key\": \"f11\",                   \"command\": \"workbench.action.toggleFullScreen\",\n                                     \"when\": \"!isIOS\" },\n{ \"key\": \"ctrl+j\",                \"command\": \"workbench.action.togglePanel\" },\n{ \"key\": \"ctrl+b\",                \"command\": \"workbench.action.toggleSidebarVisibility\" },\n{ \"key\": \"ctrl+k z\",              \"command\": \"workbench.action.toggleZenMode\" },\n{ \"key\": \"ctrl+k shift+enter\",    \"command\": \"workbench.action.unpinEditor\",\n                                     \"when\": \"activeEditorIsPinned\" },\n{ \"key\": \"ctrl+numpad_add\",       \"command\": \"workbench.action.zoomIn\" },\n{ \"key\": \"ctrl+shift+=\",          \"command\": \"workbench.action.zoomIn\" },\n{ \"key\": \"ctrl+=\",                \"command\": \"workbench.action.zoomIn\" },\n{ \"key\": \"ctrl+numpad_subtract\",  \"command\": \"workbench.action.zoomOut\" },\n{ \"key\": \"ctrl+shift+-\",          \"command\": \"workbench.action.zoomOut\" },\n{ \"key\": \"ctrl+-\",                \"command\": \"workbench.action.zoomOut\" },\n{ \"key\": \"ctrl+numpad0\",          \"command\": \"workbench.action.zoomReset\" },\n{ \"key\": \"ctrl+shift+m\",          \"command\": \"workbench.actions.view.problems\",\n                                     \"when\": \"workbench.panel.markers.view.active\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.banner.focusBanner\",\n                                     \"when\": \"bannerFocused\" },\n{ \"key\": \"down\",                  \"command\": \"workbench.banner.focusNextAction\",\n                                     \"when\": \"bannerFocused\" },\n{ \"key\": \"right\",                 \"command\": \"workbench.banner.focusNextAction\",\n                                     \"when\": \"bannerFocused\" },\n{ \"key\": \"up\",                    \"command\": \"workbench.banner.focusPreviousAction\",\n                                     \"when\": \"bannerFocused\" },\n{ \"key\": \"left\",                  \"command\": \"workbench.banner.focusPreviousAction\",\n                                     \"when\": \"bannerFocused\" },\n{ \"key\": \"ctrl+shift+y\",          \"command\": \"workbench.debug.action.toggleRepl\",\n                                     \"when\": \"workbench.panel.repl.view.active\" },\n{ \"key\": \"ctrl+k ctrl+m\",         \"command\": \"workbench.extensions.action.showRecommendedKeymapExtensions\" },\n{ \"key\": \"ctrl+k c\",              \"command\": \"workbench.files.action.compareWithClipboard\" },\n{ \"key\": \"ctrl+k d\",              \"command\": \"workbench.files.action.compareWithSaved\" },\n{ \"key\": \"ctrl+k e\",              \"command\": \"workbench.files.action.focusOpenEditorsView\",\n                                     \"when\": \"workbench.explorer.openEditorsView.active\" },\n{ \"key\": \"escape\",                \"command\": \"workbench.statusBar.clearFocus\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"home\",                  \"command\": \"workbench.statusBar.focusFirst\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"end\",                   \"command\": \"workbench.statusBar.focusLast\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"down\",                  \"command\": \"workbench.statusBar.focusNext\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"right\",                 \"command\": \"workbench.statusBar.focusNext\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"up\",                    \"command\": \"workbench.statusBar.focusPrevious\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"left\",                  \"command\": \"workbench.statusBar.focusPrevious\",\n                                     \"when\": \"statusBarFocused\" },\n{ \"key\": \"ctrl+shift+d\",          \"command\": \"workbench.view.debug\",\n                                     \"when\": \"viewContainer.workbench.view.debug.enabled\" },\n{ \"key\": \"ctrl+shift+e\",          \"command\": \"workbench.view.explorer\",\n                                     \"when\": \"viewContainer.workbench.view.explorer.enabled\" },\n{ \"key\": \"ctrl+shift+x\",          \"command\": \"workbench.view.extensions\",\n                                     \"when\": \"viewContainer.workbench.view.extensions.enabled\" },\n{ \"key\": \"ctrl+shift+g\",          \"command\": \"workbench.view.scm\",\n                                     \"when\": \"workbench.scm.active\" },\n{ \"key\": \"ctrl+shift+f\",          \"command\": \"workbench.view.search\",\n                                     \"when\": \"workbench.view.search.active && neverMatch =~ /doesNotMatch/\" },\n{ \"key\": \"ctrl+right\",            \"command\": \"breadcrumbs.focusNextWithPicker\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible && listFocus && !inputFocus\" },\n{ \"key\": \"ctrl+left\",             \"command\": \"breadcrumbs.focusPreviousWithPicker\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible && listFocus && !inputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"breadcrumbs.selectEditor\",\n                                     \"when\": \"breadcrumbsActive && breadcrumbsVisible\" },\n{ \"key\": \"ctrl+k down\",           \"command\": \"views.moveViewDown\",\n                                     \"when\": \"focusedView != ''\" },\n{ \"key\": \"ctrl+k left\",           \"command\": \"views.moveViewLeft\",\n                                     \"when\": \"focusedView != ''\" },\n{ \"key\": \"ctrl+k right\",          \"command\": \"views.moveViewRight\",\n                                     \"when\": \"focusedView != ''\" },\n{ \"key\": \"ctrl+k up\",             \"command\": \"views.moveViewUp\",\n                                     \"when\": \"focusedView != ''\" },\n{ \"key\": \"f6\",                    \"command\": \"workbench.action.debug.pause\",\n                                     \"when\": \"debugState == 'running'\" },\n{ \"key\": \"f2\",                    \"command\": \"debug.renameWatchExpression\",\n                                     \"when\": \"watchExpressionsFocused\" },\n{ \"key\": \"f2\",                    \"command\": \"debug.setVariable\",\n                                     \"when\": \"variablesFocused\" },\n{ \"key\": \"space\",                 \"command\": \"debug.toggleBreakpoint\",\n                                     \"when\": \"breakpointsFocused && !inputFocus\" },\n{ \"key\": \"shift+delete\",          \"command\": \"deleteFile\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"delete\",                \"command\": \"deleteFile\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceMoveableToTrash && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"editor.closeCallHierarchy\",\n                                     \"when\": \"callHierarchyVisible && !config.editor.stablePeek\" },\n{ \"key\": \"enter\",                 \"command\": \"explorer.openAndPassFocus\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceIsFolder && !inputFocus\" },\n{ \"key\": \"escape\",                \"command\": \"filesExplorer.cancelCut\",\n                                     \"when\": \"explorerResourceCut && explorerViewletVisible && filesExplorerFocus && !inputFocus\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"filesExplorer.copy\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !inputFocus\" },\n{ \"key\": \"ctrl+x\",                \"command\": \"filesExplorer.cut\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"space\",                 \"command\": \"filesExplorer.openFilePreserveFocus\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceIsFolder && !inputFocus\" },\n{ \"key\": \"ctrl+v\",                \"command\": \"filesExplorer.paste\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"home\",                  \"command\": \"firstCompressedFolder\",\n                                     \"when\": \"explorerViewletCompressedFocus && explorerViewletVisible && filesExplorerFocus && !explorerViewletCompressedFirstFocus && !inputFocus\" },\n{ \"key\": \"end\",                   \"command\": \"lastCompressedFolder\",\n                                     \"when\": \"explorerViewletCompressedFocus && explorerViewletVisible && filesExplorerFocus && !explorerViewletCompressedLastFocus && !inputFocus\" },\n{ \"key\": \"delete\",                \"command\": \"moveFileToTrash\",\n                                     \"when\": \"explorerResourceMoveableToTrash && explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"right\",                 \"command\": \"nextCompressedFolder\",\n                                     \"when\": \"explorerViewletCompressedFocus && explorerViewletVisible && filesExplorerFocus && !explorerViewletCompressedLastFocus && !inputFocus\" },\n{ \"key\": \"left\",                  \"command\": \"previousCompressedFolder\",\n                                     \"when\": \"explorerViewletCompressedFocus && explorerViewletVisible && filesExplorerFocus && !explorerViewletCompressedFirstFocus && !inputFocus\" },\n{ \"key\": \"delete\",                \"command\": \"remote.tunnel.closeInline\",\n                                     \"when\": \"tunnelCloseable && tunnelViewFocus\" },\n{ \"key\": \"ctrl+c\",                \"command\": \"remote.tunnel.copyAddressInline\",\n                                     \"when\": \"tunnelViewFocus && tunnelType == 'Detected' && tunnelViewMultiSelection == 'undefined' || tunnelViewFocus && tunnelType == 'Forwarded' && tunnelViewMultiSelection == 'undefined'\" },\n{ \"key\": \"f2\",                    \"command\": \"remote.tunnel.label\",\n                                     \"when\": \"tunnelViewFocus && tunnelType == 'Forwarded' && tunnelViewMultiSelection == 'undefined'\" },\n{ \"key\": \"f2\",                    \"command\": \"renameFile\",\n                                     \"when\": \"explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus\" },\n{ \"key\": \"f5\",                    \"command\": \"workbench.action.debug.continue\",\n                                     \"when\": \"debugState == 'stopped'\" },\n{ \"key\": \"f11\",                   \"command\": \"workbench.action.debug.stepInto\",\n                                     \"when\": \"debugState != 'inactive'\" },\n{ \"key\": \"shift+escape\",          \"command\": \"closeReferenceSearch\",\n                                     \"when\": \"referenceSearchVisible && !config.editor.stablePeek\" },\n{ \"key\": \"escape\",                \"command\": \"closeReferenceSearch\",\n                                     \"when\": \"referenceSearchVisible && !config.editor.stablePeek\" },\n{ \"key\": \"escape\",                \"command\": \"notifications.hideList\",\n                                     \"when\": \"notificationCenterVisible\" },\n{ \"key\": \"alt+left\",              \"command\": \"workbench.action.quickInputBack\",\n                                     \"when\": \"inQuickOpen\" },\n{ \"key\": \"ctrl+tab\",              \"command\": \"workbench.action.quickOpenNavigateNextInEditorPicker\",\n                                     \"when\": \"inEditorsPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+e\",                \"command\": \"workbench.action.quickOpenNavigateNextInFilePicker\",\n                                     \"when\": \"inFilesPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+p\",                \"command\": \"workbench.action.quickOpenNavigateNextInFilePicker\",\n                                     \"when\": \"inFilesPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+r\",                \"command\": \"workbench.action.quickOpenNavigateNextInRecentFilesPicker\",\n                                     \"when\": \"inQuickOpen && inRecentFilesPicker\" },\n{ \"key\": \"ctrl+q\",                \"command\": \"workbench.action.quickOpenNavigateNextInViewPicker\",\n                                     \"when\": \"inQuickOpen && inViewsPicker\" },\n{ \"key\": \"ctrl+shift+tab\",        \"command\": \"workbench.action.quickOpenNavigatePreviousInEditorPicker\",\n                                     \"when\": \"inEditorsPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+shift+e\",          \"command\": \"workbench.action.quickOpenNavigatePreviousInFilePicker\",\n                                     \"when\": \"inFilesPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+shift+p\",          \"command\": \"workbench.action.quickOpenNavigatePreviousInFilePicker\",\n                                     \"when\": \"inFilesPicker && inQuickOpen\" },\n{ \"key\": \"ctrl+shift+r\",          \"command\": \"workbench.action.quickOpenNavigatePreviousInRecentFilesPicker\",\n                                     \"when\": \"inQuickOpen && inRecentFilesPicker\" },\n{ \"key\": \"ctrl+shift+q\",          \"command\": \"workbench.action.quickOpenNavigatePreviousInViewPicker\",\n                                     \"when\": \"inQuickOpen && inViewsPicker\" },\n{ \"key\": \"ctrl+r\",                \"command\": \"workbench.action.reloadWindow\",\n                                     \"when\": \"isDevelopment\" },\n{ \"key\": \"ctrl+shift+f\",          \"command\": \"workbench.action.terminal.searchWorkspace\",\n                                     \"when\": \"terminalFocus && terminalProcessSupported && terminalProcessSupported && terminalTextSelected\" },\n{ \"key\": \"ctrl+shift+i\",          \"command\": \"workbench.action.toggleDevTools\",\n                                     \"when\": \"isDevelopment\" },\n{ \"key\": \"escape\",                \"command\": \"notifications.hideToasts\",\n                                     \"when\": \"notificationFocus && notificationToastsVisible\" },\n{ \"key\": \"alt+o\",                 \"command\": \"clangd.switchheadersource\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+shift+v\",          \"command\": \"markdown.showPreview\",\n                                     \"when\": \"!notebookEditorFocused && editorLangId == 'markdown'\" },\n{ \"key\": \"shift+alt+f12\",         \"command\": \"references-view.findReferences\",\n                                     \"when\": \"editorHasReferenceProvider\" },\n{ \"key\": \"shift+alt+t\",           \"command\": \"clangd.typeHierarchy\",\n                                     \"when\": \"editorTextFocus\" },\n{ \"key\": \"ctrl+k v\",              \"command\": \"markdown.showPreviewToSide\",\n                                     \"when\": \"!notebookEditorFocused && editorLangId == 'markdown'\" },\n{ \"key\": \"f4\",                    \"command\": \"references-view.next\",\n                                     \"when\": \"reference-list.hasResult && references-view.canNavigate\" },\n{ \"key\": \"shift+f4\",              \"command\": \"references-view.prev\",\n                                     \"when\": \"reference-list.hasResult && references-view.canNavigate\" },\n{ \"key\": \"shift+alt+h\",           \"command\": \"references-view.showCallHierarchy\",\n                                     \"when\": \"editorHasCallHierarchyProvider\" }\n]\n''')\n\n\ndef main():\n    keys = set()\n    for binding in DEFAULT_KEYBINDINGS:\n        key = binding['key']\n        if key in [\n            'ctrl+a',\n            'ctrl+x',\n            'ctrl+c',\n            'ctrl+v',\n            'ctrl+z',\n            'ctrl+y',\n            'ctrl+insert',\n            'shift+insert',\n            'shift+delete',\n            'ctrl+-',\n            'ctrl+=',\n            'ctrl+numpad0',\n            'ctrl+numpad_add',\n            'ctrl+numpad_subtract',\n        ]:\n            continue\n\n        when = binding.get('when')\n        if when is None:\n            pass  # add keys without conditions\n        elif when in [\n            'workbench.panel.output.active',\n            'terminal.active',\n            'workbench.panel.markers.view.active',\n            'workbench.panel.repl.view.active',\n            'workbench.explorer.openEditorsView.active',\n            'workbench.scm.active',\n            'terminalProcessSupported',\n            'viewContainer.workbench.view.debug.enabled',\n            'viewContainer.workbench.view.explorer.enabled',\n            'viewContainer.workbench.view.extensions.enabled',\n        ]:\n            pass  # add keys with these conditions\n        elif when.startswith('!') and ' ' not in when:\n            pass  # add simple negation conditions\n        else:\n            continue\n\n        assert key not in keys\n        keys.add(key)\n\n    new_keybindings = []\n    for key in sorted(keys):\n        new_keybindings.append({\n            'key': key,\n            'command': '',\n            'when': '!config.windhawk.editedModId'\n        })\n\n    print(json.dumps(new_keybindings, indent=4))\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "src/vscode-windhawk/package.json",
    "content": "{\n\t\"name\": \"windhawk\",\n\t\"displayName\": \"Windhawk\",\n\t\"description\": \"Part of the Windhawk Windows customization tool\",\n\t\"version\": \"1.7.3\",\n\t\"icon\": \"assets/main-icon.png\",\n\t\"publisher\": \"m417z\",\n\t\"engines\": {\n\t\t\"vscode\": \"^1.74.2\"\n\t},\n\t\"categories\": [\n\t\t\"Other\"\n\t],\n\t\"activationEvents\": [\n\t\t\"*\"\n\t],\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/ramensoftware/windhawk-vscode-extension\"\n\t},\n\t\"main\": \"./dist/extension.js\",\n\t\"contributes\": {\n\t\t\"viewsContainers\": {\n\t\t\t\"activitybar\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": \"windhawk\",\n\t\t\t\t\t\"title\": \"Windhawk\",\n\t\t\t\t\t\"icon\": \"assets/tab-icon-white.svg\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"views\": {\n\t\t\t\"windhawk\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"webview\",\n\t\t\t\t\t\"id\": \"windhawk.sidebar\",\n\t\t\t\t\t\"name\": \"Windhawk\",\n\t\t\t\t\t\"icon\": \"assets/tab-icon-white.svg\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"command\": \"windhawk.start\",\n\t\t\t\t\"title\": \"%commands.start.title%\",\n\t\t\t\t\"category\": \"%commands.category%\"\n\t\t\t}\n\t\t],\n\t\t\"keybindings\": [\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+b\",\n\t\t\t\t\"command\": \"windhawk.compileMod\",\n\t\t\t\t\"when\": \"config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+alt+p\",\n\t\t\t\t\"command\": \"workbench.action.showCommands\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+0\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+1\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+2\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+3\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+4\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+5\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+6\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+7\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+8\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+9\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+f1\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+f4\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+left\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+right\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"alt+z\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+,\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+0\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+1\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+2\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+3\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+4\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+5\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+6\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+7\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+8\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+9\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; a\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; ctrl+a\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; ctrl+e\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; ctrl+l\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; ctrl+x\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; e\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; l\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+; m\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+\\\\\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+`\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+alt+left\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+alt+right\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+alt+win+n\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+b\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+e\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+f4\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+f5\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+g\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+j\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k c\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+\\\\\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+down\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+left\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+m\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+o\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+p\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+pagedown\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+pageup\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+q\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+r\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+right\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+s\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+shift+c\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+shift+s\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+shift+w\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+t\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+up\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k ctrl+w\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k d\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k down\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k e\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k enter\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k left\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k m\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k p\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k r\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k right\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k s\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k shift+enter\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k u\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k up\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k w\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+k z\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+m\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+n\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+o\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+p\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+pagedown\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+pageup\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+q\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+r\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+s\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+-\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+.\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+=\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+`\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+b\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+c\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+d\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+e\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+f\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+g\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+h\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+m\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+n\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+o\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+p\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+pagedown\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+pageup\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+s\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+t\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+tab\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+u\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+w\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+x\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+y\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+shift+z\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+t\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+tab\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"ctrl+w\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"f1\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"f11\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"f5\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"f6\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+alt+0\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+alt+1\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+alt+9\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+alt+c\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+alt+r\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\": \"shift+f6\",\n\t\t\t\t\"command\": \"\",\n\t\t\t\t\"when\": \"!config.windhawk.editedModId\"\n\t\t\t}\n\t\t],\n\t\t\"configuration\": {\n\t\t\t\"title\": \"Windhawk\",\n\t\t\t\"properties\": {\n\t\t\t\t\"windhawk.editedModId\": {\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"null\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": null,\n\t\t\t\t\t\"description\": \"The edited mod id, if any.\"\n\t\t\t\t},\n\t\t\t\t\"windhawk.editedModWasModified\": {\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"A flag indicating whether the edited mod was modified.\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"grammars\": [\n\t\t\t{\n\t\t\t\t\"injectTo\": [\n\t\t\t\t\t\"source.cpp\"\n\t\t\t\t],\n\t\t\t\t\"scopeName\": \"source.cpp.windhawk\",\n\t\t\t\t\"path\": \"./syntaxes/cpp.injection.json\",\n\t\t\t\t\"embeddedLanguages\": {\n\t\t\t\t\t\"meta.embedded.block.yaml\": \"yaml\",\n\t\t\t\t\t\"meta.embedded.block.markdown\": \"markdown\"\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t},\n\t\"scripts\": {\n\t\t\"vscode:prepublish\": \"npm run clean && npm run webpack-prod\",\n\t\t\"electron-rebuild\": \".\\\\node_modules\\\\.bin\\\\electron-rebuild.cmd -v 19.1.8\",\n\t\t\"webpack\": \"npm run electron-rebuild && webpack --mode development\",\n\t\t\"webpack-dev\": \"npm run electron-rebuild && webpack --mode development --watch\",\n\t\t\"webpack-prod\": \"npm run electron-rebuild -- -a ia32 && webpack --mode production\",\n\t\t\"compile\": \"npm run electron-rebuild -- -a ia32 && tsc -p ./ --sourceMap false\",\n\t\t\"lint\": \"eslint . --ext .ts,.tsx\",\n\t\t\"watch\": \"npm run electron-rebuild && tsc -w -p ./\",\n\t\t\"clean\": \"rimraf ./out/ ./dist/ ./prebuilds/\"\n\t},\n\t\"dependencies\": {\n\t\t\"fs-ext\": \"^2.1.1\",\n\t\t\"ini-win\": \"^3.0.4\",\n\t\t\"js-yaml\": \"^4.1.1\",\n\t\t\"jsonschema\": \"^1.5.0\",\n\t\t\"native-reg\": \"^1.1.1\",\n\t\t\"node-fetch\": \"^2.7.0\",\n\t\t\"semver\": \"^7.7.3\",\n\t\t\"vscode-nls-i18n\": \"^0.2.4\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/fs-ext\": \"^2.0.3\",\n\t\t\"@types/js-yaml\": \"^4.0.9\",\n\t\t\"@types/node\": \"^22.19.1\",\n\t\t\"@types/node-fetch\": \"^2.6.13\",\n\t\t\"@types/semver\": \"^7.7.1\",\n\t\t\"@types/vscode\": \"^1.74.2\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"^8.47.0\",\n\t\t\"@typescript-eslint/parser\": \"^8.47.0\",\n\t\t\"copy-webpack-plugin\": \"^13.0.1\",\n\t\t\"@electron/rebuild\": \"^3.7.2\",\n\t\t\"eslint\": \"^9.39.1\",\n\t\t\"node-loader\": \"^2.1.0\",\n\t\t\"rimraf\": \"^6.1.2\",\n\t\t\"ts-loader\": \"^9.5.4\",\n\t\t\"typescript\": \"^5.9.3\",\n\t\t\"webpack\": \"^5.103.0\",\n\t\t\"webpack-cli\": \"^6.0.1\"\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/package.nls.json",
    "content": "{\n\t\"extensionName\": \"Windhawk\",\n\t\"commands.category\": \"Windhawk\",\n\t\"commands.start.title\": \"Open Windhawk Tab\"\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/config.ts",
    "content": "// https://stackoverflow.com/a/45074641\ndeclare const v8debug: any;\nconst debug = typeof v8debug === 'object'\n            || /--debug|--inspect/.test(process.execArgv.join(' '));\n\nexport default {\n\turls: {\n\t\tmodsUrlRoot: 'https://mods.windhawk.net/',\n\t\tmodsFolder: 'https://mods.windhawk.net/mods/',\n\t},\n\tdebug: debug ? {\n\t\treactProjectBuildPath: String.raw`C:\\Windhawk-dev\\vscode-windhawk-ui\\dist\\apps\\vscode-windhawk-ui`,\n\t\tappRootPath: String.raw`C:\\Windhawk-dev\\Windhawk`,\n\t\tdisableMinimalMode: true,\n\t\tdisableEnvVarCheck: true,\n\t} : {\n\t\treactProjectBuildPath: null,\n\t\tappRootPath: null,\n\t\tdisableMinimalMode: false,\n\t\tdisableEnvVarCheck: false,\n\t},\n};\n"
  },
  {
    "path": "src/vscode-windhawk/src/extension.ts",
    "content": "import * as fs from 'fs';\nimport fetch from 'node-fetch';\nimport * as path from 'path';\nimport * as semver from 'semver';\nimport * as vscode from 'vscode';\nimport * as i18n from 'vscode-nls-i18n';\nimport config from './config';\nimport { WindhawkLogOutput } from './logOutputChannel';\nimport * as storagePaths from './storagePaths';\nimport { AppSettings, AppSettingsUtils, AppSettingsUtilsNonPortable, AppSettingsUtilsPortable } from './utils/appSettingsUtils';\nimport CompilerUtils, { CompilerError, CompilerKilled } from './utils/compilerUtils';\nimport EditorWorkspaceUtils from './utils/editorWorkspaceUtils';\nimport { ModConfigUtils, ModConfigUtilsNonPortable, ModConfigUtilsPortable } from './utils/modConfigUtils';\nimport ModFilesUtils from './utils/modFilesUtils';\nimport ModSourceUtils from './utils/modSourceUtils';\nimport TrayProgramUtils from './utils/trayProgramUtils';\nimport { UpdateUtils } from './utils/updateUtils';\nimport UserProfileUtils, { UserProfile } from './utils/userProfileUtils';\nimport * as webviewIPC from './webviewIPC';\nimport {\n\tAppUISettings,\n\tCompileEditedModData,\n\tCompileModData,\n\tCompileModReplyData,\n\tDeleteModData,\n\tEditModData,\n\tEnableEditedModData,\n\tEnableEditedModLoggingData,\n\tEnableModData,\n\tExitEditorModeData,\n\tForkModData,\n\tGetFeaturedModsReplyData,\n\tGetInstalledModsReplyData,\n\tGetModConfigData,\n\tGetModSettingsData,\n\tGetModSourceDataData,\n\tGetModVersionsData,\n\tGetModVersionsReplyData,\n\tGetRepositoryModSourceDataData,\n\tGetRepositoryModsReplyData,\n\tInitialSettings,\n\tInstallModData,\n\tInstallModReplyData,\n\tModConfig,\n\tModMetadata,\n\tSetModSettingsData,\n\tStartUpdateReplyData,\n\tUpdateAppSettingsData,\n\tUpdateInstalledModsDetailsData,\n\tUpdateModConfigData,\n\tUpdateModRatingData\n} from './webviewIPCMessages';\n\ntype AppUtils = {\n\tmodSource: ModSourceUtils,\n\tmodConfig: ModConfigUtils,\n\tmodFiles: ModFilesUtils,\n\tcompiler: CompilerUtils,\n\teditorWorkspace: EditorWorkspaceUtils,\n\ttrayProgram: TrayProgramUtils,\n\tuserProfile: UserProfileUtils,\n\tappSettings: AppSettingsUtils,\n\tupdate: UpdateUtils\n};\n\n// Set to a local folder to use a dev environment.\n// Set to null to use the 'webview' folder.\nconst baseDebugReactUiPath: string | null = config.debug.reactProjectBuildPath;\n\nconst currentWindhawkVersion = semver.coerce(\n\tvscode.extensions.getExtension('m417z.windhawk')?.packageJSON.version\n);\n\nlet windhawkLogOutput: WindhawkLogOutput | null = null;\nlet windhawkCompilerOutput: vscode.OutputChannel | null = null;\n\nexport function activate(context: vscode.ExtensionContext) {\n\tif (!config.debug.disableEnvVarCheck && !process.env.WINDHAWK_UI_PATH) {\n\t\tvscode.window.showErrorMessage('Windhawk: Unsupported environment, perhaps VSCode was launched directly');\n\t\treturn;\n\t}\n\n\ttry {\n\t\ti18n.init(context.extensionPath);\n\n\t\twindhawkLogOutput = new WindhawkLogOutput(path.join(context.extensionPath, 'files', 'DbgViewMini.exe'));\n\t\twindhawkCompilerOutput = vscode.window.createOutputChannel('Windhawk Compiler');\n\n\t\tconst arm64Enabled = process.env.WINDHAWK_ARM64_ENABLED === '1';\n\n\t\tconst paths = storagePaths.getStoragePaths();\n\t\tconst { appRootPath, appDataPath, enginePath, compilerPath } = paths.fsPaths;\n\t\tconst utils: AppUtils = {\n\t\t\tmodSource: new ModSourceUtils(appDataPath),\n\t\t\tmodConfig: paths.portable\n\t\t\t\t? new ModConfigUtilsPortable(appDataPath)\n\t\t\t\t: new ModConfigUtilsNonPortable(paths.regKey, paths.regSubKey, appDataPath),\n\t\t\tmodFiles: new ModFilesUtils(appDataPath, arm64Enabled, currentWindhawkVersion),\n\t\t\tcompiler: new CompilerUtils(compilerPath, enginePath, appDataPath, arm64Enabled),\n\t\t\teditorWorkspace: new EditorWorkspaceUtils(),\n\t\t\ttrayProgram: new TrayProgramUtils(appRootPath),\n\t\t\tuserProfile: new UserProfileUtils(appDataPath),\n\t\t\tappSettings: paths.portable\n\t\t\t\t? new AppSettingsUtilsPortable(appDataPath)\n\t\t\t\t: new AppSettingsUtilsNonPortable(paths.regKey, paths.regSubKey),\n\t\t\tupdate: new UpdateUtils(paths.portable, appRootPath)\n\t\t};\n\n\t\tconst sidebarWebviewViewProvider = new WindhawkViewProvider(context.extensionUri, context.extensionPath, utils);\n\n\t\tcontext.subscriptions.push(\n\t\t\tvscode.window.registerWebviewViewProvider(WindhawkViewProvider.viewType, sidebarWebviewViewProvider)\n\t\t);\n\n\t\tcontext.subscriptions.push(\n\t\t\tvscode.workspace.onDidChangeTextDocument(({ contentChanges, document }) => {\n\t\t\t\tif (contentChanges.length > 0) {\n\t\t\t\t\tsidebarWebviewViewProvider.fileWasModified(document);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\tconst onEnterEditorMode = (modId: string, modWasModified = false) => {\n\t\t\tsidebarWebviewViewProvider.setEditedMod(modId, modWasModified);\n\t\t};\n\n\t\tconst onAppSettingsUpdated = () => {\n\t\t\tsidebarWebviewViewProvider.appSettingsUpdated();\n\t\t};\n\n\t\tcontext.subscriptions.push(\n\t\t\tvscode.commands.registerCommand('windhawk.start', (options?: WindhawkPanelOptions) => {\n\t\t\t\tWindhawkPanel.createOrShow(context.extensionUri, context.extensionPath, utils, {\n\t\t\t\t\tonEnterEditorMode,\n\t\t\t\t\tonAppSettingsUpdated\n\t\t\t\t}, paths.portable, {\n\t\t\t\t\ttitle: '',\n\t\t\t\t\t...options\n\t\t\t\t});\n\t\t\t}),\n\t\t\tvscode.commands.registerCommand('windhawk.compileMod', () => {\n\t\t\t\tsidebarWebviewViewProvider.compileMod();\n\t\t\t}),\n\t\t);\n\n\t\tutils.editorWorkspace.restoreEditorMode().then(({ modId, modWasModified }) => {\n\t\t\tif (modId) {\n\t\t\t\tsidebarWebviewViewProvider.setEditedMod(modId, !!modWasModified);\n\t\t\t}\n\t\t}).catch(e => reportException(e));\n\n\t\tconst onUserProfileModified = () => {\n\t\t\tconst { mtimeMs } = fs.statSync(utils.userProfile.getFilePath());\n\t\t\tif (mtimeMs !== utils.userProfile.getLastModifiedByUserMtimeMs()) {\n\t\t\t\tWindhawkPanel.userProfileChanged();\n\t\t\t}\n\t\t};\n\n\t\tconst userProfileWatcher = vscode.workspace.createFileSystemWatcher(\n\t\t\tnew vscode.RelativePattern(vscode.Uri.file(utils.userProfile.getFilePath()), '*'));\n\t\tuserProfileWatcher.onDidCreate(onUserProfileModified);\n\t\tuserProfileWatcher.onDidChange(onUserProfileModified);\n\t\tcontext.subscriptions.push(userProfileWatcher);\n\t} catch (e) {\n\t\treportException(e);\n\t}\n}\n\ntype RepositoryModsType = Record<string, any>;\n\ntype WindhawkPanelCallbacks = {\n\tonEnterEditorMode: (modId: string, modWasModified: boolean) => void,\n\tonAppSettingsUpdated: () => void\n};\n\ntype WindhawkPanelParams = {\n\tpreviewModId?: string\n};\n\ntype WindhawkPanelOptions = {\n\ttitle: string,\n\tcreateColumn?: vscode.ViewColumn,\n\tparams?: WindhawkPanelParams\n};\n\n/**\n * Manages Windhawk webview panels.\n */\nclass WindhawkPanel {\n\t/**\n\t * Track the currently panel. Only allow a single panel to exist at a time.\n\t */\n\tpublic static currentPanel: WindhawkPanel | undefined;\n\n\tpublic static readonly viewType = 'windhawk';\n\n\tprivate readonly _panel: vscode.WebviewPanel;\n\tprivate readonly _extensionUri: vscode.Uri;\n\tprivate readonly _extensionPath: string;\n\tprivate readonly _utils: AppUtils;\n\tprivate readonly _callbacks: WindhawkPanelCallbacks;\n\tprivate readonly _portable: boolean;\n\tprivate _disposables: vscode.Disposable[] = [];\n\tprivate _language = 'en';\n\tprivate _checkForUpdates = true;\n\tprivate _alwaysCompileModsLocally = false;\n\n\tpublic static createOrShow(\n\t\textensionUri: vscode.Uri,\n\t\textensionPath: string,\n\t\tutils: AppUtils,\n\t\tcallbacks: WindhawkPanelCallbacks,\n\t\tportable: boolean,\n\t\toptions: WindhawkPanelOptions\n\t) {\n\t\tconst column = vscode.window.activeTextEditor\n\t\t\t? vscode.window.activeTextEditor.viewColumn\n\t\t\t: undefined;\n\n\t\t// If we already have a panel, refresh and show it.\n\t\tif (WindhawkPanel.currentPanel) {\n\t\t\tWindhawkPanel.currentPanel.refresh(options.title, options.params);\n\t\t\tWindhawkPanel.currentPanel._panel.reveal();\n\t\t\treturn;\n\t\t}\n\n\t\t// Otherwise, create a new panel.\n\t\tconst localResourceRoots = [vscode.Uri.joinPath(extensionUri, 'webview')];\n\t\tif (baseDebugReactUiPath) {\n\t\t\tlocalResourceRoots.push(vscode.Uri.file(baseDebugReactUiPath));\n\t\t}\n\n\t\tconst panel = vscode.window.createWebviewPanel(\n\t\t\tWindhawkPanel.viewType,\n\t\t\toptions.title,\n\t\t\toptions.createColumn || column || vscode.ViewColumn.One,\n\t\t\t{\n\t\t\t\t// Enable javascript in the webview.\n\t\t\t\tenableScripts: true,\n\n\t\t\t\t// And restrict the webview to only loading content from our extension's `webview` directory.\n\t\t\t\tlocalResourceRoots\n\t\t\t}\n\t\t);\n\n\t\tWindhawkPanel.currentPanel = new WindhawkPanel(panel, extensionUri, extensionPath, utils, callbacks, portable, options.params);\n\t}\n\n\tpublic static refreshIfExists(title: string, params?: WindhawkPanelParams) {\n\t\tWindhawkPanel.currentPanel?.refresh(title, params);\n\t}\n\n\tprivate constructor(\n\t\tpanel: vscode.WebviewPanel,\n\t\textensionUri: vscode.Uri,\n\t\textensionPath: string,\n\t\tutils: AppUtils,\n\t\tcallbacks: WindhawkPanelCallbacks,\n\t\tportable: boolean,\n\t\tparams?: WindhawkPanelParams\n\t) {\n\t\tthis._panel = panel;\n\t\tthis._extensionUri = extensionUri;\n\t\tthis._extensionPath = extensionPath;\n\t\tthis._utils = utils;\n\t\tthis._callbacks = callbacks;\n\t\tthis._portable = portable;\n\n\t\t// Set the webview initial html content and icon.\n\t\tthis._panel.webview.html = this._getHtmlForWebview(this._panel.webview, params);\n\t\tthis._panel.iconPath = {\n\t\t\tlight: vscode.Uri.joinPath(extensionUri, 'assets', 'tab-icon-black.svg'),\n\t\t\tdark: vscode.Uri.joinPath(extensionUri, 'assets', 'tab-icon-white.svg')\n\t\t};\n\n\t\t// Listen for when the panel is disposed.\n\t\t// This happens when the user closes the panel or when the panel is closed programmatically.\n\t\tthis._panel.onDidDispose(() => this.dispose(), null, this._disposables);\n\n\t\t// Handle messages from the webview.\n\t\tthis._panel.webview.onDidReceiveMessage(\n\t\t\tmessage => this._handleMessage(message),\n\t\t\tnull,\n\t\t\tthis._disposables\n\t\t);\n\t}\n\n\tpublic refresh(title: string, params?: WindhawkPanelParams) {\n\t\tthis._panel.title = title;\n\n\t\t// To refresh, first clear the html.\n\t\tthis._panel.webview.html = '';\n\t\tthis._panel.webview.html = this._getHtmlForWebview(this._panel.webview, params);\n\t}\n\n\tpublic static userProfileChanged() {\n\t\t// If we don't already have a panel, there's nothing to update.\n\t\tif (!WindhawkPanel.currentPanel) {\n\t\t\treturn;\n\t\t}\n\n\t\tWindhawkPanel.currentPanel._userProfileChanged();\n\t}\n\n\tpublic dispose() {\n\t\tWindhawkPanel.currentPanel = undefined;\n\n\t\t// Clean up our resources.\n\t\tthis._panel.dispose();\n\n\t\twhile (this._disposables.length) {\n\t\t\tconst x = this._disposables.pop();\n\t\t\tif (x) {\n\t\t\t\tx.dispose();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _getHtmlForWebview(webview: vscode.Webview, params?: WindhawkPanelParams) {\n\t\tconst webviewPathOnDisk = baseDebugReactUiPath\n\t\t\t? vscode.Uri.file(baseDebugReactUiPath)\n\t\t\t: vscode.Uri.joinPath(this._extensionUri, 'webview');\n\n\t\tconst baseWebviewUri = webview.asWebviewUri(webviewPathOnDisk);\n\t\tlet html = fs.readFileSync(vscode.Uri.joinPath(webviewPathOnDisk, 'index.html').fsPath, 'utf8');\n\n\t\tconst csp = [\n\t\t\t`default-src 'none'`,\n\t\t\t`style-src 'unsafe-inline' ${webview.cspSource}`,\n\t\t\t`img-src ${webview.cspSource} data: https://i.imgur.com https://raw.githubusercontent.com https://mods.windhawk.net`,\n\t\t\t`script-src ${webview.cspSource} blob:`,\n\t\t\t`connect-src ${webview.cspSource} https://mods.windhawk.net https://ramensoftware.com`,\n\t\t\t`font-src ${webview.cspSource}`\n\t\t];\n\n\t\thtml = html.replace('<head>', `<head>\n\t\t\t<base href=\"${baseWebviewUri.toString()}/\">\n\t\t\t<meta http-equiv=\"Content-Security-Policy\" content=\"${csp.join('; ')};\">\n\t\t`);\n\n\t\tconst dataParams = params ? ` data-params=\"${escapeHtml(JSON.stringify(params))}\"` : '';\n\n\t\thtml = html.replace(/<body([^>]*)>/, `<body data-content=\"panel\"${dataParams}$1>`);\n\n\t\treturn html;\n\t}\n\n\tprivate _getAppUISettings(appSettings: AppSettings, userProfile?: UserProfile): AppUISettings {\n\t\tlet updateIsAvailable = false;\n\t\tif (!appSettings.disableUpdateCheck) {\n\t\t\ttry {\n\t\t\t\tconst currentVersion = currentWindhawkVersion;\n\t\t\t\tconst latestVersion = semver.coerce((userProfile || this._utils.userProfile.read()).getAppLatestVersion());\n\t\t\t\tupdateIsAvailable = !!(currentVersion && latestVersion && semver.lt(currentVersion, latestVersion));\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tlanguage: appSettings.language,\n\t\t\tdevModeOptOut: appSettings.devModeOptOut,\n\t\t\tdevModeUsedAtLeastOnce: appSettings.devModeUsedAtLeastOnce,\n\t\t\tloggingEnabled: (\n\t\t\t\tappSettings.loggingVerbosity > 0 ||\n\t\t\t\tappSettings.engine.loggingVerbosity > 0\n\t\t\t),\n\t\t\tupdateIsAvailable,\n\t\t\tsafeMode: appSettings.safeMode\n\t\t};\n\t}\n\n\tprivate _userProfileChanged() {\n\t\ttry {\n\t\t\tconst userProfile = this._utils.userProfile.read();\n\n\t\t\t// First, recalculate UI settings, since the update availability value\n\t\t\t// depends on the user profile.\n\t\t\tconst appSettings = this._utils.appSettings.getAppSettings();\n\t\t\tthis._language = appSettings.language;\n\t\t\tthis._checkForUpdates = !appSettings.disableUpdateCheck;\n\t\t\tthis._alwaysCompileModsLocally = appSettings.alwaysCompileModsLocally;\n\n\t\t\twebviewIPC.setNewAppSettings(this._panel.webview, {\n\t\t\t\tappUISettings: this._getAppUISettings(appSettings, userProfile)\n\t\t\t});\n\n\t\t\t// Next, recalculate mod values which depend on the user profile.\n\t\t\tconst details: UpdateInstalledModsDetailsData['details'] = {};\n\n\t\t\tconst modsMetadata = this._utils.modSource.getMetadataOfInstalled(this._language, (modId, error) => {\n\t\t\t\tvscode.window.showErrorMessage(`Failed to load mod ${modId}: ${error}`);\n\t\t\t});\n\t\t\tconst modsConfig = this._utils.modConfig.getConfigOfInstalled();\n\n\t\t\tfor (const modId of new Set([...Object.keys(modsMetadata), ...Object.keys(modsConfig)])) {\n\t\t\t\tconst modLatestVersion = this._checkForUpdates && userProfile.getModLatestVersion(modId);\n\t\t\t\tconst updateAvailable = !!(modLatestVersion && modLatestVersion !== (modsMetadata[modId]?.version || ''));\n\t\t\t\tconst userRating = userProfile.getModRating(modId) || 0;\n\t\t\t\tdetails[modId] = {\n\t\t\t\t\tupdateAvailable,\n\t\t\t\t\tuserRating: userRating\n\t\t\t\t};\n\t\t\t}\n\n\t\t\twebviewIPC.updateInstalledModsDetails(this._panel.webview, {\n\t\t\t\tdetails\n\t\t\t});\n\t\t} catch (e) {\n\t\t\treportException(e);\n\t\t}\n\t}\n\n\tprivate readonly _handleMessageMap: Record<string, (message: any) => void> = {\n\t\tgetInitialAppSettings: message => {\n\t\t\tlet appUISettings: Partial<AppUISettings> = {};\n\t\t\ttry {\n\t\t\t\tconst appSettings = this._utils.appSettings.getAppSettings();\n\t\t\t\tthis._language = appSettings.language;\n\t\t\t\tthis._checkForUpdates = !appSettings.disableUpdateCheck;\n\t\t\t\tthis._alwaysCompileModsLocally = appSettings.alwaysCompileModsLocally;\n\n\t\t\t\tappUISettings = this._getAppUISettings(appSettings);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getInitialAppSettingsReply(this._panel.webview, message.messageId, {\n\t\t\t\tappUISettings\n\t\t\t});\n\t\t},\n\t\tgetInstalledMods: message => {\n\t\t\tconst installedMods: GetInstalledModsReplyData['installedMods'] = {};\n\t\t\ttry {\n\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\tconst modsMetadata = this._utils.modSource.getMetadataOfInstalled(this._language, (modId, error) => {\n\t\t\t\t\tvscode.window.showErrorMessage(`Failed to load mod ${modId}: ${error}`);\n\t\t\t\t});\n\t\t\t\tconst modsConfig = this._utils.modConfig.getConfigOfInstalled();\n\t\t\t\tlet userProfileUpdated = false;\n\n\t\t\t\tfor (const modId of new Set([...Object.keys(modsMetadata), ...Object.keys(modsConfig)])) {\n\t\t\t\t\tconst version = modsMetadata[modId]?.version || '';\n\t\t\t\t\tconst disabled = modsConfig[modId]?.disabled || false;\n\t\t\t\t\tif (!modId.startsWith('local@') && userProfile.updateModDetails(modId, version, disabled)) {\n\t\t\t\t\t\tuserProfileUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst latestVersion = this._checkForUpdates && userProfile.getModLatestVersion(modId);\n\t\t\t\t\tconst updateAvailable = !!(latestVersion && latestVersion !== version);\n\t\t\t\t\tconst userRating = userProfile.getModRating(modId) || 0;\n\t\t\t\t\tinstalledMods[modId] = {\n\t\t\t\t\t\tmetadata: modsMetadata[modId] || null,\n\t\t\t\t\t\tconfig: modsConfig[modId] || null,\n\t\t\t\t\t\tupdateAvailable,\n\t\t\t\t\t\tuserRating: userRating\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst nonLocalModIds = Object.keys(installedMods).filter(modId => !modId.startsWith('local@'));\n\t\t\t\tif (userProfile.cleanupRemovedMods(new Set<string>(nonLocalModIds))) {\n\t\t\t\t\tuserProfileUpdated = true;\n\t\t\t\t}\n\n\t\t\t\tif (userProfileUpdated) {\n\t\t\t\t\t// Set asExternalUpdate so that the file watcher will send\n\t\t\t\t\t// the updated data to the UI.\n\t\t\t\t\tconst asExternalUpdate = true;\n\t\t\t\t\tuserProfile.write(asExternalUpdate);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getInstalledModsReply(this._panel.webview, message.messageId, {\n\t\t\t\tinstalledMods\n\t\t\t});\n\t\t},\n\t\tgetFeaturedMods: async message => {\n\t\t\tlet featuredMods: GetFeaturedModsReplyData['featuredMods'] = null;\n\t\t\ttry {\n\t\t\t\tconst repositoryMods = await this._fetchRepositoryMods(this._language);\n\t\t\t\tfeaturedMods = Object.fromEntries(\n\t\t\t\t\tObject.entries(repositoryMods).filter(([k, v]) => v.featured));\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getFeaturedModsReply(this._panel.webview, message.messageId, {\n\t\t\t\tfeaturedMods\n\t\t\t});\n\t\t},\n\t\tgetRepositoryMods: async message => {\n\t\t\tlet mods: GetRepositoryModsReplyData['mods'] = null;\n\t\t\ttry {\n\t\t\t\tconst repositoryMods = await this._fetchRepositoryMods(this._language);\n\n\t\t\t\tmods = {};\n\t\t\t\tfor (const [modId, value] of Object.entries(repositoryMods)) {\n\t\t\t\t\tmods[modId] = {\n\t\t\t\t\t\trepository: value\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\tconst modsMetadata = this._utils.modSource.getMetadataOfInstalled(this._language, (modId, error) => {\n\t\t\t\t\tvscode.window.showErrorMessage(`Failed to load mod ${modId}: ${error}`);\n\t\t\t\t});\n\t\t\t\tconst modsConfig = this._utils.modConfig.getConfigOfInstalled();\n\n\t\t\t\tfor (const modId of new Set([...Object.keys(modsMetadata), ...Object.keys(modsConfig)])) {\n\t\t\t\t\tif (mods[modId]) {\n\t\t\t\t\t\tconst userRating = userProfile.getModRating(modId) || 0;\n\t\t\t\t\t\tmods[modId].installed = {\n\t\t\t\t\t\t\tmetadata: modsMetadata[modId] || null,\n\t\t\t\t\t\t\tconfig: modsConfig[modId] || null,\n\t\t\t\t\t\t\tuserRating\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getRepositoryModsReply(this._panel.webview, message.messageId, {\n\t\t\t\tmods\n\t\t\t});\n\t\t},\n\t\tgetModSourceData: message => {\n\t\t\tconst data: GetModSourceDataData = message.data;\n\n\t\t\tlet source: string | null = null;\n\t\t\ttry {\n\t\t\t\tsource = this._utils.modSource.getSource(data.modId);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\tlet metadata: ModMetadata | null = null;\n\t\t\tlet readme: string | null = null;\n\t\t\tlet initialSettings: InitialSettings | null = null;\n\t\t\tif (source) {\n\t\t\t\ttry {\n\t\t\t\t\tmetadata = this._utils.modSource.extractMetadata(source, this._language);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\treadme = this._utils.modSource.extractReadme(source);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tinitialSettings = this._utils.modSource.extractInitialSettings(source, this._language);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twebviewIPC.getModSourceDataReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tdata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tmetadata,\n\t\t\t\t\treadme,\n\t\t\t\t\tinitialSettings\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetRepositoryModSourceData: async message => {\n\t\t\tconst data: GetRepositoryModSourceDataData = message.data;\n\n\t\t\t// Construct URL: if version is provided, use versioned path,\n\t\t\t// otherwise use latest.\n\t\t\tconst url = data.version\n\t\t\t\t? `${config.urls.modsFolder}${data.modId}/${data.version}.wh.cpp`\n\t\t\t\t: `${config.urls.modsFolder}${data.modId}.wh.cpp`;\n\n\t\t\tlet source: string | null = null;\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url);\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error('Server error: ' + (response.statusText || response.status));\n\t\t\t\t}\n\n\t\t\t\tsource = await response.text();\n\n\t\t\t\t// Make sure the source code has CRLF newlines.\n\t\t\t\tsource = source.replace(/\\r\\n|\\r|\\n/g, '\\r\\n');\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\tlet metadata: ModMetadata | null = null;\n\t\t\tlet readme: string | null = null;\n\t\t\tlet initialSettings: InitialSettings | null = null;\n\t\t\tif (source) {\n\t\t\t\ttry {\n\t\t\t\t\tmetadata = this._utils.modSource.extractMetadata(source, this._language);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\treadme = this._utils.modSource.extractReadme(source);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tinitialSettings = this._utils.modSource.extractInitialSettings(source, this._language);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treportException(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twebviewIPC.getRepositoryModSourceDataReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tversion: data.version,\n\t\t\t\tdata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tmetadata,\n\t\t\t\t\treadme,\n\t\t\t\t\tinitialSettings\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetModVersions: async message => {\n\t\t\tconst data: GetModVersionsData = message.data;\n\t\t\tconst { modId } = data;\n\t\t\tconst url = `${config.urls.modsFolder}${modId}/versions.json`;\n\n\t\t\tlet versions: GetModVersionsReplyData['versions'] = [];\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url);\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error('Server error: ' + (response.statusText || response.status));\n\t\t\t\t}\n\n\t\t\t\tconst jsonData = await response.json();\n\t\t\t\tversions = jsonData.map((v: any) => ({\n\t\t\t\t\tversion: v.version,\n\t\t\t\t\ttimestamp: v.timestamp,\n\t\t\t\t\tisPreRelease: v.version.includes('-')\n\t\t\t\t}));\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getModVersionsReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId,\n\t\t\t\tversions\n\t\t\t});\n\t\t},\n\t\tgetModSettings: message => {\n\t\t\tconst data: GetModSettingsData = message.data;\n\n\t\t\tlet settings: Record<string, any> = {};\n\t\t\ttry {\n\t\t\t\tsettings = this._utils.modConfig.getModSettings(data.modId);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getModSettingsReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tsettings\n\t\t\t});\n\t\t},\n\t\tsetModSettings: message => {\n\t\t\tconst data: SetModSettingsData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tthis._utils.modConfig.setModSettings(data.modId, data.settings);\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.setModSettingsReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tgetModConfig: message => {\n\t\t\tconst data: GetModConfigData = message.data;\n\n\t\t\tlet config: ModConfig | null = null;\n\t\t\ttry {\n\t\t\t\tconfig = this._utils.modConfig.getModConfig(data.modId);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getModConfigReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tconfig\n\t\t\t});\n\t\t},\n\t\tupdateModConfig: message => {\n\t\t\tconst data: UpdateModConfigData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tthis._utils.modConfig.setModConfig(data.modId, data.config);\n\n\t\t\t\twebviewIPC.setNewModConfig(this._panel.webview, {\n\t\t\t\t\tmodId: data.modId,\n\t\t\t\t\tconfig: data.config\n\t\t\t\t});\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.updateModConfigReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tinstallMod: async message => {\n\t\t\tconst data: InstallModData = message.data;\n\n\t\t\tlet installedModDetails: InstallModReplyData['installedModDetails'] = null;\n\n\t\t\ttry {\n\t\t\t\twindhawkCompilerOutput?.clear();\n\t\t\t\twindhawkCompilerOutput?.hide();\n\n\t\t\t\tconst modId = data.modId;\n\t\t\t\tconst modSource = data.modSource;\n\t\t\t\tconst disabled = !!data.disabled;\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t} else if (metadata.id !== modId) {\n\t\t\t\t\tthrow new Error('Mod id specified in the source code doesn\\'t match');\n\t\t\t\t}\n\n\t\t\t\tconst initialSettings = this._utils.modSource.extractInitialSettingsForEngine(modSource);\n\n\t\t\t\tlet previousInitialSettings: Record<string, string | number> | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst prev = this._utils.modSource.extractInitialSettingsForEngine(\n\t\t\t\t\t\tthis._utils.modSource.getSource(modId)\n\t\t\t\t\t);\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tpreviousInitialSettings = prev;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\t\t\tconsole.error('Failed to extract previous initial settings for engine:', e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet targetDllName: string;\n\t\t\t\tif (this._alwaysCompileModsLocally) {\n\t\t\t\t\tconst result = await this._utils.compiler.compileMod(\n\t\t\t\t\t\tmodId,\n\t\t\t\t\t\tmetadata.version || '',\n\t\t\t\t\t\tmetadata.include || [],\n\t\t\t\t\t\tmodSource,\n\t\t\t\t\t\tmetadata.architecture || [],\n\t\t\t\t\t\tmetadata.compilerOptions\n\t\t\t\t\t);\n\t\t\t\t\ttargetDllName = result.targetDllName;\n\t\t\t\t} else {\n\t\t\t\t\tconst result = await this._utils.modFiles.downloadPrecompiledMod(\n\t\t\t\t\t\tmodId,\n\t\t\t\t\t\tmetadata.version || '',\n\t\t\t\t\t\tmetadata.architecture || [],\n\t\t\t\t\t\tconfig.urls.modsFolder\n\t\t\t\t\t);\n\t\t\t\t\ttargetDllName = result.targetDllName;\n\t\t\t\t}\n\n\t\t\t\tthis._utils.modConfig.setModConfig(modId, {\n\t\t\t\t\tlibraryFileName: targetDllName,\n\t\t\t\t\tdisabled,\n\t\t\t\t\t// loggingEnabled: false,\n\t\t\t\t\t// debugLoggingEnabled: false,\n\t\t\t\t\tinclude: metadata.include || [],\n\t\t\t\t\texclude: metadata.exclude || [],\n\t\t\t\t\t// includeCustom: [],\n\t\t\t\t\t// excludeCustom: [],\n\t\t\t\t\t// includeExcludeCustomOnly: false,\n\t\t\t\t\t// patternsMatchCriticalSystemProcesses: false,\n\t\t\t\t\tarchitecture: metadata.architecture || [],\n\t\t\t\t\tversion: metadata.version || ''\n\t\t\t\t}, {\n\t\t\t\t\tinitialSettings: initialSettings || {},\n\t\t\t\t\tpreviousInitialSettings\n\t\t\t\t});\n\n\t\t\t\tthis._utils.modSource.setSource(modId, modSource);\n\n\t\t\t\tthis._utils.modFiles.deleteOldModFiles(modId, metadata.architecture || [], targetDllName);\n\n\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\tuserProfile.setModVersion(modId, metadata.version || '');\n\t\t\t\tuserProfile.write();\n\n\t\t\t\tconst modConfig = this._utils.modConfig.getModConfig(modId);\n\t\t\t\tif (!modConfig) {\n\t\t\t\t\tthrow new Error('Failed to query installed mod details');\n\t\t\t\t}\n\n\t\t\t\tinstalledModDetails = {\n\t\t\t\t\tmetadata,\n\t\t\t\t\tconfig: modConfig\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\treportCompilerException(e, true);\n\t\t\t}\n\n\t\t\twebviewIPC.installModReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tinstalledModDetails\n\t\t\t});\n\t\t},\n\t\tcompileMod: async message => {\n\t\t\tconst data: CompileModData = message.data;\n\n\t\t\tlet compiledModDetails: CompileModReplyData['compiledModDetails'] = null;\n\n\t\t\ttry {\n\t\t\t\twindhawkCompilerOutput?.clear();\n\t\t\t\twindhawkCompilerOutput?.hide();\n\n\t\t\t\tconst modId = data.modId;\n\t\t\t\tconst modSource = this._utils.modSource.getSource(modId);\n\t\t\t\tconst disabled = !!data.disabled;\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t} else if (metadata.id !== modId.replace(/^local@/, '')) {\n\t\t\t\t\tthrow new Error('Mod id specified in the source code doesn\\'t match');\n\t\t\t\t}\n\n\t\t\t\tconst { targetDllName } = await this._utils.compiler.compileMod(\n\t\t\t\t\tmodId,\n\t\t\t\t\tmetadata.version || '',\n\t\t\t\t\tmetadata.include || [],\n\t\t\t\t\tmodSource,\n\t\t\t\t\tmetadata.architecture || [],\n\t\t\t\t\tmetadata.compilerOptions\n\t\t\t\t);\n\n\t\t\t\tthis._utils.modConfig.setModConfig(modId, {\n\t\t\t\t\tlibraryFileName: targetDllName,\n\t\t\t\t\tdisabled,\n\t\t\t\t\t// loggingEnabled: false,\n\t\t\t\t\t// debugLoggingEnabled: false,\n\t\t\t\t\tinclude: metadata.include || [],\n\t\t\t\t\texclude: metadata.exclude || [],\n\t\t\t\t\t// includeCustom: [],\n\t\t\t\t\t// excludeCustom: [],\n\t\t\t\t\t// includeExcludeCustomOnly: false,\n\t\t\t\t\t// patternsMatchCriticalSystemProcesses: false,\n\t\t\t\t\tarchitecture: metadata.architecture || [],\n\t\t\t\t\tversion: metadata.version || ''\n\t\t\t\t});\n\n\t\t\t\tthis._utils.modFiles.deleteOldModFiles(modId, metadata.architecture || [], targetDllName);\n\n\t\t\t\tconst config = this._utils.modConfig.getModConfig(modId);\n\t\t\t\tif (!config) {\n\t\t\t\t\tthrow new Error('Failed to query compiled mod details');\n\t\t\t\t}\n\n\t\t\t\tcompiledModDetails = {\n\t\t\t\t\tmetadata,\n\t\t\t\t\tconfig\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\treportCompilerException(e, true);\n\t\t\t}\n\n\t\t\twebviewIPC.compileModReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tcompiledModDetails\n\t\t\t});\n\t\t},\n\t\tenableMod: message => {\n\t\t\tconst data: EnableModData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tconst modId: string = data.modId;\n\t\t\t\tconst enable: boolean = data.enable;\n\n\t\t\t\tthis._utils.modConfig.enableMod(modId, enable);\n\n\t\t\t\tif (!modId.startsWith('local@')) {\n\t\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\t\tuserProfile.setModDisabled(modId, !enable);\n\t\t\t\t\tuserProfile.write();\n\t\t\t\t}\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.enableModReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tenabled: data.enable,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tcreateNewMod: async message => {\n\t\t\ttry {\n\t\t\t\tconst modSourcePath = path.join(this._extensionPath, 'files', 'mod_template.wh.cpp');\n\t\t\t\tlet modSource = fs.readFileSync(modSourcePath, 'utf8');\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t}\n\n\t\t\t\tlet newModId = metadata.id;\n\t\t\t\tlet localModId = 'local@' + newModId;\n\t\t\t\tif (this._utils.modSource.doesSourceExist(localModId) || this._utils.modConfig.doesConfigExist(localModId)) {\n\t\t\t\t\tlet counter = 2;\n\t\t\t\t\tlet modIdSuffix;\n\t\t\t\t\tfor (; ;) {\n\t\t\t\t\t\tmodIdSuffix = '-' + counter;\n\t\t\t\t\t\tnewModId = metadata.id + modIdSuffix;\n\t\t\t\t\t\tlocalModId = 'local@' + newModId;\n\n\t\t\t\t\t\tconst exists = this._utils.modSource.doesSourceExist(localModId) || this._utils.modConfig.doesConfigExist(localModId);\n\t\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst modNameSuffix = ` (${counter})`;\n\t\t\t\t\tmodSource = this._utils.modSource.appendToIdAndName(modSource, modIdSuffix, modNameSuffix);\n\t\t\t\t}\n\n\t\t\t\tthis._utils.editorWorkspace.initializeFromModSource(modSource);\n\n\t\t\t\tthis._callbacks.onEnterEditorMode(newModId, false);\n\n\t\t\t\tawait this._utils.editorWorkspace.enterEditorMode(newModId);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\teditMod: async message => {\n\t\t\tconst data: EditModData = message.data;\n\n\t\t\ttry {\n\t\t\t\tconst modSource = this._utils.modSource.getSource(data.modId);\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t}\n\n\t\t\t\tconst modSourceFromDrafts = this._utils.editorWorkspace.loadModFromDrafts(metadata.id);\n\t\t\t\tif (modSourceFromDrafts) {\n\t\t\t\t\tthis._utils.editorWorkspace.deleteModFromDrafts(metadata.id);\n\t\t\t\t}\n\n\t\t\t\tthis._utils.editorWorkspace.initializeFromModSource(modSource, modSourceFromDrafts);\n\n\t\t\t\tthis._callbacks.onEnterEditorMode(metadata.id, !!modSourceFromDrafts);\n\n\t\t\t\tawait this._utils.editorWorkspace.enterEditorMode(metadata.id, !!modSourceFromDrafts);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\tforkMod: async message => {\n\t\t\tconst data: ForkModData = message.data;\n\n\t\t\ttry {\n\t\t\t\tlet modSource = data.modSource || this._utils.modSource.getSource(data.modId);\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t} else if (metadata.id !== data.modId.replace(/^local@/, '')) {\n\t\t\t\t\tthrow new Error('Mod id specified in the source code doesn\\'t match');\n\t\t\t\t}\n\n\t\t\t\tlet modIdSuffix = '-fork';\n\t\t\t\tlet forkModId = metadata.id + modIdSuffix;\n\t\t\t\tlet localModId = 'local@' + forkModId;\n\t\t\t\tlet modNameSuffix = ' - Fork';\n\t\t\t\tif (this._utils.modSource.doesSourceExist(localModId) || this._utils.modConfig.doesConfigExist(localModId)) {\n\t\t\t\t\tlet counter = 2;\n\t\t\t\t\tfor (; ;) {\n\t\t\t\t\t\tmodIdSuffix = '-fork' + counter;\n\t\t\t\t\t\tforkModId = metadata.id + modIdSuffix;\n\t\t\t\t\t\tlocalModId = 'local@' + forkModId;\n\n\t\t\t\t\t\tconst exists = this._utils.modSource.doesSourceExist(localModId) || this._utils.modConfig.doesConfigExist(localModId);\n\t\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t}\n\n\t\t\t\t\tmodNameSuffix = ` - Fork (${counter})`;\n\t\t\t\t}\n\n\t\t\t\tmodSource = this._utils.modSource.appendToIdAndName(modSource, modIdSuffix, modNameSuffix);\n\n\t\t\t\tthis._utils.editorWorkspace.initializeFromModSource(modSource);\n\n\t\t\t\tthis._callbacks.onEnterEditorMode(forkModId, false);\n\n\t\t\t\tawait this._utils.editorWorkspace.enterEditorMode(forkModId);\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\tdeleteMod: message => {\n\t\t\tconst data: DeleteModData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tconst modId: string = data.modId;\n\n\t\t\t\tthis._utils.modConfig.deleteMod(modId);\n\t\t\t\tthis._utils.modSource.deleteSource(modId);\n\n\t\t\t\tthis._utils.modFiles.deleteModFiles(modId);\n\n\t\t\t\tif (modId.startsWith('local@')) {\n\t\t\t\t\tthis._utils.editorWorkspace.deleteModFromDrafts(modId.replace(/^local@/, ''));\n\t\t\t\t} else {\n\t\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\t\tuserProfile.deleteMod(modId);\n\t\t\t\t\tuserProfile.write();\n\t\t\t\t}\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.deleteModReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tupdateModRating: message => {\n\t\t\tconst data: UpdateModRatingData = message.data;\n\n\t\t\tlet succeeded = false;\n\n\t\t\ttry {\n\t\t\t\tconst userProfile = this._utils.userProfile.read();\n\t\t\t\tuserProfile.setModRating(data.modId, data.rating);\n\t\t\t\tuserProfile.write();\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.updateModRatingReply(this._panel.webview, message.messageId, {\n\t\t\t\tmodId: data.modId,\n\t\t\t\trating: data.rating,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tgetAppSettings: message => {\n\t\t\tlet appSettings: Partial<AppSettings> = {};\n\t\t\ttry {\n\t\t\t\tappSettings = this._utils.appSettings.getAppSettings();\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getAppSettingsReply(this._panel.webview, message.messageId, {\n\t\t\t\tappSettings\n\t\t\t});\n\t\t},\n\t\tupdateAppSettings: message => {\n\t\t\tconst data: UpdateAppSettingsData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tconst appSettings: Partial<AppSettings> = data.appSettings;\n\n\t\t\t\tthis._utils.appSettings.updateAppSettings(appSettings);\n\n\t\t\t\tconst newAppSettings = this._utils.appSettings.getAppSettings();\n\t\t\t\tthis._language = newAppSettings.language;\n\t\t\t\tthis._checkForUpdates = !newAppSettings.disableUpdateCheck;\n\t\t\t\tthis._alwaysCompileModsLocally = newAppSettings.alwaysCompileModsLocally;\n\n\t\t\t\twebviewIPC.setNewAppSettings(this._panel.webview, {\n\t\t\t\t\tappUISettings: this._getAppUISettings(newAppSettings)\n\t\t\t\t});\n\n\t\t\t\tthis._callbacks.onAppSettingsUpdated();\n\n\t\t\t\tif (this._utils.appSettings.shouldRestartApp(appSettings)) {\n\t\t\t\t\tthis._utils.trayProgram.postAppRestartBg();\n\t\t\t\t\tvscode.window.showInformationMessage('Windhawk was restarted');\n\t\t\t\t} else if (this._utils.appSettings.shouldNotifyTrayProgram(appSettings)) {\n\t\t\t\t\tthis._utils.trayProgram.postAppSettingsChanged();\n\t\t\t\t}\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.updateAppSettingsReply(this._panel.webview, message.messageId, {\n\t\t\t\tappSettings: data.appSettings,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tshowAdvancedDebugLogOutput: message => {\n\t\t\ttry {\n\t\t\t\twindhawkLogOutput?.createOrShow();\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\tstartUpdate: async message => {\n\t\t\tlet result: StartUpdateReplyData = {\n\t\t\t\tsucceeded: false,\n\t\t\t\terror: 'Update failed'\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tresult = await this._utils.update.startUpdate({\n\t\t\t\t\tonProgress: (data) => {\n\t\t\t\t\t\twebviewIPC.updateDownloadProgress(this._panel.webview, data);\n\t\t\t\t\t},\n\t\t\t\t\tonInstalling: () => {\n\t\t\t\t\t\twebviewIPC.updateInstalling(this._panel.webview, {});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.startUpdateReply(this._panel.webview, message.messageId, result);\n\t\t},\n\t\tcancelUpdate: message => {\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tif (this._utils.update.cancelUpdate()) {\n\t\t\t\t\tsucceeded = true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.cancelUpdateReply(this._panel.webview, message.messageId, {\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t}\n\t};\n\n\tprivate _handleMessage(message: any) {\n\t\tconst { command, ...rest } = message;\n\t\tthis._handleMessageMap[command](rest);\n\t}\n\n\tprivate async _fetchRepositoryMods(language: string) {\n\t\tconst version = currentWindhawkVersion?.version || 'unknown';\n\t\tconst userAgent = `Windhawk/${version}${this._portable ? ' (portable)' : ''}`;\n\t\tconst headers = {\n\t\t\t'User-Agent': userAgent\n\t\t};\n\n\t\tconst languageCatalogUrl = config.urls.modsUrlRoot + 'catalogs/' + language + '.json';\n\t\tlet response = await fetch(languageCatalogUrl, { headers });\n\t\tif (response.status === 404) {\n\t\t\t// Fallback to the default catalog if the language one is not available.\n\t\t\tconst defaultCatalogUrl = config.urls.modsUrlRoot + 'catalog.json';\n\t\t\tresponse = await fetch(defaultCatalogUrl, { headers });\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tthrow Error('Server error: ' + (response.statusText || response.status));\n\t\t}\n\n\t\tconst data = await response.json();\n\t\tthis._updateUserProfileJson(data);\n\t\treturn data.mods as RepositoryModsType;\n\t}\n\n\tprivate _updateUserProfileJson(data: any) {\n\t\tconst userProfile = this._utils.userProfile.read();\n\n\t\tconst appLatestVersion = data.app.version;\n\n\t\tconst repositoryMods: RepositoryModsType = data.mods;\n\t\tconst modLatestVersion: Record<string, string> = {};\n\t\tfor (const [modId, value] of Object.entries(repositoryMods)) {\n\t\t\tconst { version } = value.metadata;\n\t\t\tif (version) {\n\t\t\t\tmodLatestVersion[modId] = version;\n\t\t\t}\n\t\t}\n\n\t\tif (userProfile.updateLatestVersions(appLatestVersion, modLatestVersion)) {\n\t\t\t// Set asExternalUpdate so that the file watcher will send the\n\t\t\t// updated data to the UI.\n\t\t\tconst asExternalUpdate = true;\n\t\t\tuserProfile.write(asExternalUpdate);\n\n\t\t\tif (this._checkForUpdates) {\n\t\t\t\tthis._utils.trayProgram.postNewUpdatesFound();\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass WindhawkViewProvider implements vscode.WebviewViewProvider {\n\tpublic static readonly viewType = 'windhawk.sidebar';\n\n\tprivate _view?: vscode.WebviewView;\n\tprivate readonly _extensionUri: vscode.Uri;\n\tprivate readonly _extensionPath: string;\n\tprivate readonly _utils: AppUtils;\n\tprivate _language = 'en';\n\tprivate _editedModId?: string;\n\tprivate _editedModWasModified = false;\n\tprivate _editedModModifiedCounter = 0;\n\tprivate _editedModBeingCompiled = false;\n\tprivate _editedModCompilationFailed = false;\n\n\tconstructor(\n\t\textensionUri: vscode.Uri,\n\t\textensionPath: string,\n\t\tutils: AppUtils\n\t) {\n\t\tthis._extensionUri = extensionUri;\n\t\tthis._extensionPath = extensionPath;\n\t\tthis._utils = utils;\n\t}\n\n\tpublic resolveWebviewView(\n\t\twebviewView: vscode.WebviewView,\n\t\tcontext: vscode.WebviewViewResolveContext,\n\t\t_token: vscode.CancellationToken,\n\t) {\n\t\tthis._view = webviewView;\n\n\t\tconst localResourceRoots = [vscode.Uri.joinPath(this._extensionUri, 'webview')];\n\t\tif (baseDebugReactUiPath) {\n\t\t\tlocalResourceRoots.push(vscode.Uri.file(baseDebugReactUiPath));\n\t\t}\n\n\t\twebviewView.webview.options = {\n\t\t\t// Allow scripts in the webview.\n\t\t\tenableScripts: true,\n\n\t\t\t// And restrict the webview to only loading content from our extension's `webview` directory.\n\t\t\tlocalResourceRoots\n\t\t};\n\n\t\twebviewView.webview.html = this._getHtmlForWebview(webviewView.webview);\n\n\t\twebviewView.webview.onDidReceiveMessage(\n\t\t\tmessage => this._handleMessage(message)\n\t\t);\n\n\t\twebviewView.onDidChangeVisibility(() => {\n\t\t\tif (!webviewView.visible && this._editedModId) {\n\t\t\t\tvscode.window.showInformationMessage(\n\t\t\t\t\t'The Windhawk sidebar was closed, perhaps accidentally. ' +\n\t\t\t\t\t'Restore sidebar? You can also restore it with Ctrl+B.',\n\t\t\t\t\t'Restore sidebar'\n\t\t\t\t).then(value => {\n\t\t\t\t\tif (value === 'Restore sidebar') {\n\t\t\t\t\t\twebviewView.show();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _getHtmlForWebview(webview: vscode.Webview) {\n\t\tconst webviewPathOnDisk = baseDebugReactUiPath\n\t\t\t? vscode.Uri.file(baseDebugReactUiPath)\n\t\t\t: vscode.Uri.joinPath(this._extensionUri, 'webview');\n\n\t\tconst baseWebviewUri = webview.asWebviewUri(webviewPathOnDisk);\n\t\tlet html = fs.readFileSync(vscode.Uri.joinPath(webviewPathOnDisk, 'index.html').fsPath, 'utf8');\n\n\t\tconst csp = [\n\t\t\t`default-src 'none'`,\n\t\t\t`style-src 'unsafe-inline' ${webview.cspSource}`,\n\t\t\t`img-src ${webview.cspSource} data:`,\n\t\t\t`script-src ${webview.cspSource} blob:`,\n\t\t\t`connect-src ${webview.cspSource}`,\n\t\t\t`font-src ${webview.cspSource}`\n\t\t];\n\n\t\thtml = html.replace('<head>', `<head>\n\t\t\t<base href=\"${baseWebviewUri.toString()}/\">\n\t\t\t<meta http-equiv=\"Content-Security-Policy\" content=\"${csp.join('; ')};\">\n\t\t`);\n\n\t\thtml = html.replace(/<body([^>]*)>/, '<body data-content=\"sidebar\"$1>');\n\n\t\treturn html;\n\t}\n\n\tpublic fileWasModified(doc: vscode.TextDocument) {\n\t\tconst modSourcePath = this._utils.editorWorkspace.getModSourcePath();\n\t\tif (doc.uri.toString(true) !== vscode.Uri.file(modSourcePath).toString(true)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._editedModModifiedCounter++;\n\n\t\tif (!this._editedModWasModified || this._editedModCompilationFailed) {\n\t\t\tthis._editedModWasModified = true;\n\t\t\tthis._editedModCompilationFailed = false;\n\t\t\tthis._utils.editorWorkspace.markEditorModeModAsModified(true);\n\t\t\twebviewIPC.editedModWasModified(this._view?.webview);\n\t\t}\n\t}\n\n\tpublic compileMod() {\n\t\tthis._view?.show(true);\n\t\twebviewIPC.compileEditedModStart(this._view?.webview);\n\t}\n\n\tprivate _postEditedModDetails() {\n\t\tif (this._editedModId) {\n\t\t\tconst localModId = 'local@' + this._editedModId;\n\t\t\tconst modConfig = this._utils.modConfig.getModConfig(localModId);\n\t\t\twebviewIPC.setEditedModDetails(this._view?.webview, {\n\t\t\t\tmodId: this._editedModId,\n\t\t\t\tmodDetails: modConfig,\n\t\t\t\tmodWasModified: this._editedModWasModified\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic setEditedMod(modId: string, modWasModified: boolean) {\n\t\tthis._editedModId = modId;\n\t\tthis._editedModWasModified = modWasModified;\n\t\tthis._editedModCompilationFailed = false;\n\t\tthis._postEditedModDetails();\n\t}\n\n\tpublic appSettingsUpdated() {\n\t\tconst newAppSettings = this._utils.appSettings.getAppSettings();\n\t\tthis._language = newAppSettings.language;\n\n\t\twebviewIPC.setNewAppSettings(this._view?.webview, {\n\t\t\tappUISettings: {\n\t\t\t\tlanguage: this._language\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate readonly _handleMessageMap: Record<string, (message: any) => void> = {\n\t\tgetInitialAppSettings: message => {\n\t\t\ttry {\n\t\t\t\tconst appSettings = this._utils.appSettings.getAppSettings();\n\t\t\t\tthis._language = appSettings.language;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.getInitialAppSettingsReply(this._view?.webview, message.messageId, {\n\t\t\t\tappUISettings: {\n\t\t\t\t\tlanguage: this._language\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetInitialSidebarParams: message => {\n\t\t\tthis._postEditedModDetails();\n\t\t},\n\t\tenableEditedMod: message => {\n\t\t\tconst data: EnableEditedModData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tif (!this._editedModId) {\n\t\t\t\t\tthrow new Error('No mod is being edited');\n\t\t\t\t}\n\n\t\t\t\tconst localModId = 'local@' + this._editedModId;\n\t\t\t\tthis._utils.modConfig.enableMod(localModId, data.enable);\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.enableEditedModReply(this._view?.webview, message.messageId, {\n\t\t\t\tenabled: data.enable,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tenableEditedModLogging: message => {\n\t\t\tconst data: EnableEditedModLoggingData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tif (!this._editedModId) {\n\t\t\t\t\tthrow new Error('No mod is being edited');\n\t\t\t\t}\n\n\t\t\t\tconst localModId = 'local@' + this._editedModId;\n\t\t\t\tthis._utils.modConfig.enableLogging(localModId, data.enable);\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.enableEditedModLoggingReply(this._view?.webview, message.messageId, {\n\t\t\t\tenabled: data.enable,\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t},\n\t\tcompileEditedMod: async message => {\n\t\t\tconst data: CompileEditedModData = message.data;\n\n\t\t\tif (this._editedModBeingCompiled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._editedModBeingCompiled = true;\n\n\t\t\tconst modifiedCounterStart = this._editedModModifiedCounter;\n\n\t\t\tlet succeeded = false;\n\t\t\tlet clearModified = false;\n\n\t\t\ttry {\n\t\t\t\twindhawkCompilerOutput?.clear();\n\n\t\t\t\tif (!this._editedModId) {\n\t\t\t\t\tthrow new Error('No mod is being edited');\n\t\t\t\t}\n\n\t\t\t\tconst oldModId = this._editedModId;\n\t\t\t\tconst localOldModId = 'local@' + this._editedModId;\n\n\t\t\t\tconst modSourcePath = this._utils.editorWorkspace.getModSourcePath();\n\t\t\t\tconst modSourceUri = vscode.Uri.file(modSourcePath);\n\n\t\t\t\t// Get text from open editor if available, otherwise read from disk.\n\t\t\t\tconst openEditor = vscode.window.visibleTextEditors.find(\n\t\t\t\t\teditor => editor.document.uri.toString(true) === modSourceUri.toString(true)\n\t\t\t\t);\n\n\t\t\t\tlet modSource: string;\n\t\t\t\tif (openEditor) {\n\t\t\t\t\tmodSource = openEditor.document.getText();\n\t\t\t\t} else {\n\t\t\t\t\tmodSource = fs.readFileSync(modSourcePath, 'utf8');\n\t\t\t\t}\n\n\t\t\t\tconst metadata = this._utils.modSource.extractMetadata(modSource, this._language);\n\t\t\t\tif (!metadata.id) {\n\t\t\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t\t\t}\n\n\t\t\t\tconst modId = metadata.id;\n\t\t\t\tconst localModId = 'local@' + modId;\n\n\t\t\t\tif (modId !== oldModId) {\n\t\t\t\t\tif (this._utils.modSource.doesSourceExist(localModId) || this._utils.modConfig.doesConfigExist(localModId)) {\n\t\t\t\t\t\tthrow new Error('Mod id specified in the source code already exists');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst initialSettings = this._utils.modSource.extractInitialSettingsForEngine(modSource);\n\n\t\t\t\tlet previousInitialSettings: Record<string, string | number> | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst prev = this._utils.modSource.extractInitialSettingsForEngine(\n\t\t\t\t\t\tthis._utils.modSource.getSource(localModId)\n\t\t\t\t\t);\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tpreviousInitialSettings = prev;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\t\t\tconsole.error('Failed to extract previous initial settings for engine:', e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { targetDllName } = await this._utils.compiler.compileMod(\n\t\t\t\t\tlocalModId,\n\t\t\t\t\tmetadata.version || '',\n\t\t\t\t\tmetadata.include || [],\n\t\t\t\t\tmodSource,\n\t\t\t\t\tmetadata.architecture || [],\n\t\t\t\t\tmetadata.compilerOptions,\n\t\t\t\t\tthis._utils.editorWorkspace.getWorkspaceFolder()\n\t\t\t\t);\n\n\t\t\t\tif (modId !== oldModId) {\n\t\t\t\t\tthis._utils.modConfig.changeModId(localOldModId, localModId);\n\t\t\t\t}\n\n\t\t\t\tthis._utils.modConfig.setModConfig(localModId, {\n\t\t\t\t\tlibraryFileName: targetDllName,\n\t\t\t\t\tdisabled: data.disabled,\n\t\t\t\t\tloggingEnabled: data.loggingEnabled,\n\t\t\t\t\t// debugLoggingEnabled: false,\n\t\t\t\t\tinclude: metadata.include || [],\n\t\t\t\t\texclude: metadata.exclude || [],\n\t\t\t\t\t// includeCustom: [],\n\t\t\t\t\t// excludeCustom: [],\n\t\t\t\t\t// includeExcludeCustomOnly: false,\n\t\t\t\t\t// patternsMatchCriticalSystemProcesses: false,\n\t\t\t\t\tarchitecture: metadata.architecture || [],\n\t\t\t\t\tversion: metadata.version || ''\n\t\t\t\t}, {\n\t\t\t\t\tinitialSettings: initialSettings || {},\n\t\t\t\t\tpreviousInitialSettings\n\t\t\t\t});\n\n\t\t\t\tthis._utils.modSource.setSource(localModId, modSource);\n\n\t\t\t\tif (modId !== oldModId) {\n\t\t\t\t\tthis._utils.modSource.deleteSource(localOldModId);\n\n\t\t\t\t\tthis._utils.editorWorkspace.setEditorModeModId(modId);\n\n\t\t\t\t\tthis._editedModId = modId;\n\t\t\t\t\twebviewIPC.setEditedModId(this._view?.webview, {\n\t\t\t\t\t\tmodId\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis._utils.modFiles.deleteOldModFiles(localModId, metadata.architecture || [], targetDllName);\n\n\t\t\t\tif (data.loggingEnabled) {\n\t\t\t\t\twindhawkLogOutput?.createOrShow(true);\n\t\t\t\t} else {\n\t\t\t\t\twindhawkCompilerOutput?.hide();\n\t\t\t\t}\n\n\t\t\t\tWindhawkPanel.refreshIfExists('Preview', {\n\t\t\t\t\tpreviewModId: localModId\n\t\t\t\t});\n\n\t\t\t\tthis._editedModCompilationFailed = false;\n\n\t\t\t\tclearModified = (modifiedCounterStart === this._editedModModifiedCounter);\n\t\t\t\tif (clearModified) {\n\t\t\t\t\tthis._editedModWasModified = false;\n\t\t\t\t\tthis._utils.editorWorkspace.markEditorModeModAsModified(false);\n\t\t\t\t}\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportCompilerException(e);\n\t\t\t\tthis._editedModCompilationFailed = true;\n\t\t\t}\n\n\t\t\twebviewIPC.compileEditedModReply(this._view?.webview, message.messageId, {\n\t\t\t\tsucceeded,\n\t\t\t\tclearModified\n\t\t\t});\n\n\t\t\tthis._editedModBeingCompiled = false;\n\t\t},\n\t\tstopCompileEditedMod: async message => {\n\t\t\ttry {\n\t\t\t\tif (this._editedModBeingCompiled) {\n\t\t\t\t\tthis._utils.compiler.cancelCompilation();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\tpreviewEditedMod: async message => {\n\t\t\ttry {\n\t\t\t\tif (!this._editedModId) {\n\t\t\t\t\tthrow new Error('No mod is being edited');\n\t\t\t\t}\n\n\t\t\t\tconst localModId = 'local@' + this._editedModId;\n\t\t\t\tawait vscode.commands.executeCommand('windhawk.start', {\n\t\t\t\t\ttitle: 'Preview',\n\t\t\t\t\tcreateColumn: vscode.ViewColumn.Beside,\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tpreviewModId: localModId\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\tshowLogOutput: message => {\n\t\t\ttry {\n\t\t\t\twindhawkLogOutput?.createOrShow();\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\t\t},\n\t\texitEditorMode: async message => {\n\t\t\tconst data: ExitEditorModeData = message.data;\n\n\t\t\tlet succeeded = false;\n\t\t\ttry {\n\t\t\t\tif (!await vscode.workspace.saveAll(true)) {\n\t\t\t\t\tthrow new Error('Failed to save all files');\n\t\t\t\t}\n\n\t\t\t\twindhawkLogOutput?.dispose();\n\n\t\t\t\tif (this._editedModId) {\n\t\t\t\t\tif (this._editedModWasModified && data.saveToDrafts) {\n\t\t\t\t\t\tthis._utils.editorWorkspace.saveModToDrafts(this._editedModId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._utils.editorWorkspace.deleteModFromDrafts(this._editedModId);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._editedModId = undefined;\n\t\t\t\tthis._editedModWasModified = false;\n\t\t\t\tthis._editedModCompilationFailed = false;\n\t\t\t\tawait this._utils.editorWorkspace.exitEditorMode();\n\n\t\t\t\tsucceeded = true;\n\t\t\t} catch (e) {\n\t\t\t\treportException(e);\n\t\t\t}\n\n\t\t\twebviewIPC.exitEditorModeReply(this._view?.webview, message.messageId, {\n\t\t\t\tsucceeded\n\t\t\t});\n\t\t}\n\t};\n\n\tprivate _handleMessage(message: any) {\n\t\tconst { command, ...rest } = message;\n\t\tthis._handleMessageMap[command](rest);\n\t}\n}\n\nfunction reportException(e: any) {\n\tconsole.error(e);\n\tvscode.window.showErrorMessage(e.message);\n}\n\nfunction reportCompilerException(e: any, treatCompilationErrorAsException = false) {\n\tif (e instanceof CompilerKilled) {\n\t\twindhawkCompilerOutput?.append(e.message + '\\n');\n\t\twindhawkCompilerOutput?.show();\n\t\treturn;\n\t}\n\n\tif (!(e instanceof CompilerError)) {\n\t\treportException(e);\n\t\treturn;\n\t}\n\n\ttry {\n\t\tlet log = '';\n\n\t\tconst stdout = e.stdout.trim();\n\t\tconst stderr = e.stderr.trim();\n\n\t\tif ((stdout === '' && stderr === '') || e.exitCode !== 1) {\n\t\t\tconst exitCodeStr = e.exitCode !== null ? `0x${e.exitCode.toString(16)}` : 'unknown';\n\t\t\tlog = `Exit code: ${exitCodeStr}\\n`;\n\t\t}\n\n\t\tif (stdout !== '') {\n\t\t\tif (log !== '') {\n\t\t\t\tlog += '\\n';\n\t\t\t}\n\t\t\tlog += stdout + '\\n';\n\t\t}\n\n\t\tif (stderr !== '') {\n\t\t\tif (log !== '') {\n\t\t\t\tlog += '\\n';\n\t\t\t}\n\t\t\tlog += stderr + '\\n';\n\t\t}\n\n\t\twindhawkCompilerOutput?.append(log);\n\t\twindhawkCompilerOutput?.show();\n\n\t\tif (treatCompilationErrorAsException) {\n\t\t\treportException(e);\n\t\t}\n\t} catch (e) {\n\t\treportException(e);\n\t}\n}\n\n// https://stackoverflow.com/a/6234804\nfunction escapeHtml(unsafe: string) {\n\treturn unsafe\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&#039;\");\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/ini.ts",
    "content": "import * as fs from 'fs';\nimport * as fsExt from 'fs-ext';\nimport * as ini from 'ini-win';\n\nexport type iniValue = {\n\t[key: string]: {\n\t\t[key: string]: string\n\t}\n};\n\nexport function fromFile(filePath: string) {\n\tconst fd = fs.openSync(filePath, 'r');\n\tfsExt.flockSync(fd, 'sh');\n\tconst buffer = fs.readFileSync(fd);\n\tfsExt.flockSync(fd, 'un');\n\tfs.closeSync(fd);\n\n\tlet contents: string;\n\tif (buffer[0] === 0xFF && buffer[1] === 0xFE) {\n\t\tcontents = buffer.slice(2).toString('utf16le');\n\t} else {\n\t\tcontents = buffer.toString('utf8');\n\t}\n\n\tconst parsed = ini.parse(contents);\n\n\tconst result: iniValue = {};\n\tfor (const [sectionName, section] of Object.entries(parsed)) {\n\t\tfor (const [key, value] of Object.entries(section)) {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tresult[sectionName] = result[sectionName] || {};\n\t\t\t\tresult[sectionName][key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function fromFileOrDefault(filePath: string, defaultValue: iniValue = {}) {\n\ttry {\n\t\treturn fromFile(filePath);\n\t} catch (e) {\n\t\t// Ignore if file doesn't exist.\n\t\tif (e.code !== 'ENOENT') {\n\t\t\tthrow e;\n\t\t}\n\t\treturn defaultValue;\n\t}\n}\n\nexport function toFile(filePath: string, value: iniValue) {\n\tconst fd = fs.openSync(filePath, 'w');\n\tfsExt.flockSync(fd, 'ex');\n\tfs.writeFileSync(fd, '\\uFEFF' + ini.stringify(value), 'utf16le');\n\tfsExt.flockSync(fd, 'un');\n\tfs.closeSync(fd);\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/logOutputChannel.ts",
    "content": "import * as child_process from 'child_process';\nimport * as vscode from 'vscode';\n\nexport class WindhawkLogOutput {\n\tprivate _logOutputProcessPath: string;\n\tprivate _logOutputChannel?: vscode.OutputChannel;\n\tprivate _logOutputProcess?: child_process.ChildProcessWithoutNullStreams;\n\tprivate _incompleteStdoutBuffer: Buffer = Buffer.alloc(0);\n\tprivate _incompleteStderrBuffer: Buffer = Buffer.alloc(0);\n\n\tconstructor(logOutputProcessPath: string) {\n\t\tthis._logOutputProcessPath = logOutputProcessPath;\n\t}\n\n\tpublic createOrShow(preserveFocus?: boolean) {\n\t\tif (!this._logOutputChannel) {\n\t\t\tthis._logOutputChannel = vscode.window.createOutputChannel('Windhawk Log');\n\t\t}\n\t\tthis._logOutputChannel.show(preserveFocus);\n\n\t\tif (!this._logOutputProcess) {\n\t\t\tconst args = [\n\t\t\t\t'--pattern',\n\t\t\t\t'[WH] *',\n\t\t\t\t'--no-buffering',\n\t\t\t];\n\t\t\tconst ps = child_process.spawn(this._logOutputProcessPath, args);\n\n\t\t\tthis._logOutputProcess = ps;\n\n\t\t\tps.stdout.on('data', data => {\n\t\t\t\tconst dataWithIncompleteBuffer = Buffer.concat([this._incompleteStdoutBuffer, data]);\n\t\t\t\tconst index = incompleteUTF8Index(dataWithIncompleteBuffer);\n\t\t\t\tconst dataToOutput = dataWithIncompleteBuffer.subarray(0, index);\n\t\t\t\tthis._incompleteStdoutBuffer = dataWithIncompleteBuffer.subarray(index);\n\t\t\t\tthis._logOutputChannel?.append(dataToOutput.toString());\n\t\t\t});\n\n\t\t\tps.stderr.on('data', data => {\n\t\t\t\tconst dataWithIncompleteBuffer = Buffer.concat([this._incompleteStderrBuffer, data]);\n\t\t\t\tconst index = incompleteUTF8Index(dataWithIncompleteBuffer);\n\t\t\t\tconst dataToOutput = dataWithIncompleteBuffer.subarray(0, index);\n\t\t\t\tthis._incompleteStderrBuffer = dataWithIncompleteBuffer.subarray(index);\n\t\t\t\tthis._logOutputChannel?.append(dataToOutput.toString());\n\t\t\t});\n\n\t\t\tlet gotError = false;\n\n\t\t\tps.on('error', err => {\n\t\t\t\t//console.log('Oh no, the error: ' + err);\n\t\t\t\tthis._logOutputProcess = undefined;\n\t\t\t\tgotError = true;\n\t\t\t\tvscode.window.showErrorMessage(err.message);\n\t\t\t});\n\n\t\t\tps.on('close', code => {\n\t\t\t\t//console.log(`ps process exited with code ${code}`);\n\t\t\t\tif (!gotError) {\n\t\t\t\t\tthis._logOutputProcess = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic dispose() {\n\t\tif (this._logOutputProcess) {\n\t\t\tthis._logOutputProcess.kill();\n\t\t\tthis._logOutputProcess = undefined;\n\t\t}\n\n\t\tif (this._logOutputChannel) {\n\t\t\tthis._logOutputChannel.dispose();\n\t\t\tthis._logOutputChannel = undefined;\n\t\t}\n\t}\n}\n\n// Inspired by https://stackoverflow.com/a/27587200\nfunction incompleteUTF8Index(buf: Buffer) {\n    for (let i = Math.max(buf.length - 3, 0); i < buf.length; i++) {\n        const ch = buf[i];\n        if ((ch & 0xc0) === 0x80) {\n            // 10xxxxxx\n            continue;\n        }\n\n        const leadIndex = i;\n        if ((ch & 0x80) === 0) {\n            // 0xxxxxxx\n        } else if ((ch & 0xe0) === 0xc0) {\n            // 110xxxxx\n            i++;\n        } else if ((ch & 0xf0) === 0xe0) {\n            // 1110xxxx\n            i += 2;\n        } else if ((ch & 0xf8) === 0xf0) {\n            // 11110xxx\n            i += 3;\n        } else {\n            // Unrecognized.\n            break;\n        }\n\n        if (i >= buf.length) {\n            return leadIndex;\n        }\n    }\n\n    return buf.length;\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/storagePaths.ts",
    "content": "import * as reg from 'native-reg';\nimport * as path from 'path';\nimport * as vscode from 'vscode';\nimport config from './config';\nimport * as ini from './ini';\n\ntype FileSystemPaths = {\n\tappRootPath: string,\n\tappDataPath: string,\n\tenginePath: string,\n\tcompilerPath: string,\n\tuiPath: string\n};\n\ntype StoragePathsPortable = {\n\tportable: true,\n\tfsPaths: FileSystemPaths\n};\n\ntype StoragePathsNonPortable = {\n\tportable: false,\n\tfsPaths: FileSystemPaths,\n\tregKey: reg.HKEY,\n\tregSubKey: string\n};\n\nexport type StoragePaths =\n\t| StoragePathsPortable\n\t| StoragePathsNonPortable;\n\nfunction getAppRootPath() {\n\tconst debugAppRootPath = config.debug.appRootPath;\n\tif (debugAppRootPath) {\n\t\treturn debugAppRootPath;\n\t}\n\n\tconst vscodeInstallPath = vscode.env.appRoot; // returns <vscode_dir>\\resources\\app\n\treturn path.dirname(path.dirname(path.dirname(vscodeInstallPath)));\n}\n\nfunction getStorageConfig(appRootPath: string) {\n\tconst iniFilePath = path.join(appRootPath, 'windhawk.ini');\n\treturn ini.fromFile(iniFilePath);\n}\n\nfunction expandEnvironmentVariables(path: string) {\n\t// https://stackoverflow.com/a/21363956\n\treturn path.replace(/%([^%]+)%/g, (original, matched) => {\n\t\treturn process.env[matched] ?? original;\n\t});\n}\n\nexport function getStoragePaths(): StoragePaths {\n\tconst appRootPath = getAppRootPath();\n\tconst storageConfig = getStorageConfig(appRootPath);\n\n\tconst portable = !!parseInt(storageConfig.Storage.Portable, 10);\n\n\tconst processPath = (p: string) => path.resolve(appRootPath, expandEnvironmentVariables(p));\n\n\tconst appDataPath = processPath(storageConfig.Storage.AppDataPath);\n\tconst enginePath = processPath(storageConfig.Storage.EnginePath);\n\tconst compilerPath = processPath(storageConfig.Storage.CompilerPath);\n\tconst uiPath = processPath(storageConfig.Storage.UIPath);\n\n\tif (portable) {\n\t\treturn {\n\t\t\tportable,\n\t\t\tfsPaths: {\n\t\t\t\tappRootPath,\n\t\t\t\tappDataPath,\n\t\t\t\tenginePath,\n\t\t\t\tcompilerPath,\n\t\t\t\tuiPath\n\t\t\t}\n\t\t};\n\t}\n\n\tconst registryKey = storageConfig.Storage.RegistryKey;\n\tlet i = registryKey.indexOf('\\\\');\n\tif (i === -1) {\n\t\ti = registryKey.length;\n\t}\n\n\tlet regKey: reg.HKEY;\n\tswitch (registryKey.slice(0, i)) {\n\t\tcase 'HKEY_CURRENT_USER':\n\t\tcase 'HKCU':\n\t\t\tregKey = reg.HKCU;\n\t\t\tbreak;\n\n\t\tcase 'HKEY_USERS':\n\t\tcase 'HKU':\n\t\t\tregKey = reg.HKU;\n\t\t\tbreak;\n\n\t\tcase 'HKEY_LOCAL_MACHINE':\n\t\tcase 'HKLM':\n\t\t\tregKey = reg.HKLM;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported registry path');\n\t}\n\n\tconst regSubKey = registryKey.slice(i + 1);\n\n\treturn {\n\t\tportable,\n\t\tfsPaths: {\n\t\t\tappRootPath,\n\t\t\tappDataPath,\n\t\t\tenginePath,\n\t\t\tcompilerPath,\n\t\t\tuiPath\n\t\t},\n\t\tregKey,\n\t\tregSubKey\n\t};\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/appSettingsUtils.ts",
    "content": "import * as child_process from 'child_process';\nimport * as reg from 'native-reg';\nimport * as path from 'path';\nimport * as vscode from 'vscode';\nimport * as ini from '../ini';\n\n// ============================================================================\n// Field Descriptors - Single source of truth\n// ============================================================================\n\ntype FieldDescriptor = {\n\treadonly name: string;\n\treadonly storageName: string;\n\treadonly type: 'string' | 'boolean' | 'number' | 'boolean-nullable' | 'string-array';\n\treadonly location: 'app' | 'engine';\n\treadonly defaultValue?: string | number | boolean | null | string[];\n\treadonly portableOnly?: boolean;\n\treadonly nonPortableOnly?: boolean;\n};\n\nconst APP_SETTINGS_FIELDS = [\n\t{ name: 'language', storageName: 'Language', type: 'string', location: 'app', defaultValue: 'en' },\n\t{ name: 'disableUpdateCheck', storageName: 'DisableUpdateCheck', type: 'boolean', location: 'app' },\n\t{ name: 'disableRunUIScheduledTask', storageName: 'DisableRunUIScheduledTask', type: 'boolean-nullable', location: 'app', nonPortableOnly: true },\n\t{ name: 'devModeOptOut', storageName: 'DevModeOptOut', type: 'boolean', location: 'app' },\n\t{ name: 'devModeUsedAtLeastOnce', storageName: 'DevModeUsedAtLeastOnce', type: 'boolean', location: 'app' },\n\t{ name: 'hideTrayIcon', storageName: 'HideTrayIcon', type: 'boolean', location: 'app' },\n\t{ name: 'alwaysCompileModsLocally', storageName: 'AlwaysCompileModsLocally', type: 'boolean', location: 'app' },\n\t{ name: 'dontAutoShowToolkit', storageName: 'DontAutoShowToolkit', type: 'boolean', location: 'app' },\n\t{ name: 'modTasksDialogDelay', storageName: 'ModTasksDialogDelay', type: 'number', location: 'app', defaultValue: 2000 },\n\t{ name: 'safeMode', storageName: 'SafeMode', type: 'boolean', location: 'app' },\n\t{ name: 'loggingVerbosity', storageName: 'LoggingVerbosity', type: 'number', location: 'app' },\n\t{ name: 'loggingVerbosity', storageName: 'LoggingVerbosity', type: 'number', location: 'engine' },\n\t{ name: 'include', storageName: 'Include', type: 'string-array', location: 'engine' },\n\t{ name: 'exclude', storageName: 'Exclude', type: 'string-array', location: 'engine' },\n\t{ name: 'injectIntoCriticalProcesses', storageName: 'InjectIntoCriticalProcesses', type: 'boolean', location: 'engine' },\n\t{ name: 'injectIntoIncompatiblePrograms', storageName: 'InjectIntoIncompatiblePrograms', type: 'boolean', location: 'engine' },\n\t{ name: 'injectIntoGames', storageName: 'InjectIntoGames', type: 'boolean', location: 'engine' },\n] as const satisfies readonly FieldDescriptor[];\n\ntype StorageFieldName = typeof APP_SETTINGS_FIELDS[number]['storageName'];\ntype StorageLocation = typeof APP_SETTINGS_FIELDS[number]['location'];\n\n// Derive AppSettings type from field descriptors\ntype FieldTypeMap = {\n\t'string': string;\n\t'boolean': boolean;\n\t'number': number;\n\t'boolean-nullable': boolean | null;\n\t'string-array': string[];\n};\n\ntype AppFieldsDescriptor = Extract<typeof APP_SETTINGS_FIELDS[number], { location: 'app' }>;\ntype EngineFieldsDescriptor = Extract<typeof APP_SETTINGS_FIELDS[number], { location: 'engine' }>;\n\nexport type AppSettings = {\n\t[K in AppFieldsDescriptor as K['name']]: FieldTypeMap[K['type']]\n} & {\n\tengine: {\n\t\t[K in EngineFieldsDescriptor as K['name']]: FieldTypeMap[K['type']]\n\t}\n};\n\nexport interface AppSettingsUtils {\n\tgetAppSettings(): AppSettings;\n\tupdateAppSettings(appSettings: Partial<AppSettings>): void;\n\tshouldRestartApp(appSettings: Partial<AppSettings>): boolean;\n\tshouldNotifyTrayProgram(appSettings: Partial<AppSettings>): boolean;\n}\n\n// ============================================================================\n// Storage Backend Abstraction\n// ============================================================================\n\ninterface AppSettingsBackend {\n\treadAllFields(location: StorageLocation): Partial<Record<StorageFieldName, string | number>> | null;\n\twriteAllFields(location: StorageLocation, fields: Partial<Record<StorageFieldName, string | number>>): void;\n}\n\n// ============================================================================\n// Unified Codec - Converts between AppSettings and storage format\n// ============================================================================\n\nfunction splitPipeDelimited(value: string): string[] {\n\treturn !value ? [] : value.split('|');\n}\n\nfunction getDefaultValue(field: FieldDescriptor): any {\n\tif (field.defaultValue !== undefined) {\n\t\treturn field.defaultValue;\n\t}\n\n\t// Fallback defaults by type if not specified\n\tif (field.type === 'string') {\n\t\treturn '';\n\t} else if (field.type === 'boolean') {\n\t\treturn false;\n\t} else if (field.type === 'boolean-nullable') {\n\t\treturn null;\n\t} else if (field.type === 'number') {\n\t\treturn 0;\n\t} else if (field.type === 'string-array') {\n\t\treturn [];\n\t}\n\treturn undefined;\n}\n\nclass AppSettingsCodec {\n\tstatic parse(backend: AppSettingsBackend): AppSettings {\n\t\tconst appRawFields = backend.readAllFields('app') || {};\n\t\tconst engineRawFields = backend.readAllFields('engine') || {};\n\n\t\tconst result: any = { engine: {} };\n\n\t\tfor (const field of APP_SETTINGS_FIELDS) {\n\t\t\tconst rawFields = field.location === 'app' ? appRawFields : engineRawFields;\n\t\t\tconst rawValue = rawFields[field.storageName];\n\n\t\t\tlet parsedValue: any;\n\t\t\tif (rawValue !== undefined) {\n\t\t\t\t// Value exists in storage - parse it\n\t\t\t\tif (field.type === 'string') {\n\t\t\t\t\tparsedValue = rawValue as string;\n\t\t\t\t} else if (field.type === 'boolean' || field.type === 'boolean-nullable') {\n\t\t\t\t\tparsedValue = !!rawValue;\n\t\t\t\t} else if (field.type === 'number') {\n\t\t\t\t\tparsedValue = rawValue as number;\n\t\t\t\t} else {\n\t\t\t\t\t// field.type === 'string-array'\n\t\t\t\t\tparsedValue = splitPipeDelimited(rawValue as string);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Value missing from storage - use default\n\t\t\t\tparsedValue = getDefaultValue(field);\n\t\t\t}\n\n\t\t\t// Set the value in the result object\n\t\t\tif (field.location === 'engine') {\n\t\t\t\tresult.engine[field.name] = parsedValue;\n\t\t\t} else {\n\t\t\t\tresult[field.name] = parsedValue;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tstatic serialize(backend: AppSettingsBackend, appSettings: Partial<AppSettings>): void {\n\t\tconst appFieldsToWrite: Partial<Record<StorageFieldName, string | number>> = {};\n\t\tconst engineFieldsToWrite: Partial<Record<StorageFieldName, string | number>> = {};\n\n\t\tfor (const field of APP_SETTINGS_FIELDS) {\n\t\t\tconst value = field.location === 'engine'\n\t\t\t\t? appSettings.engine?.[field.name]\n\t\t\t\t: appSettings[field.name];\n\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert TypeScript value to storage format\n\t\t\tlet storageValue: string | number;\n\t\t\tif (field.type === 'string') {\n\t\t\t\tstorageValue = value as string;\n\t\t\t} else if (field.type === 'boolean' || field.type === 'boolean-nullable') {\n\t\t\t\tstorageValue = value ? 1 : 0;\n\t\t\t} else if (field.type === 'number') {\n\t\t\t\tstorageValue = value as number;\n\t\t\t} else {\n\t\t\t\t// field.type === 'string-array'\n\t\t\t\tstorageValue = (value as string[]).join('|');\n\t\t\t}\n\n\t\t\tif (field.location === 'app') {\n\t\t\t\tappFieldsToWrite[field.storageName] = storageValue;\n\t\t\t} else {\n\t\t\t\tengineFieldsToWrite[field.storageName] = storageValue;\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(appFieldsToWrite).length > 0) {\n\t\t\tbackend.writeAllFields('app', appFieldsToWrite);\n\t\t}\n\t\tif (Object.keys(engineFieldsToWrite).length > 0) {\n\t\t\tbackend.writeAllFields('engine', engineFieldsToWrite);\n\t\t}\n\t}\n}\n\n// ============================================================================\n// INI Storage Backend (Portable mode)\n// ============================================================================\n\nclass IniAppSettingsBackend implements AppSettingsBackend {\n\tprivate settingsIniPath: string;\n\tprivate engineSettingsIniPath: string;\n\n\tconstructor(appDataPath: string) {\n\t\tthis.settingsIniPath = path.join(appDataPath, 'settings.ini');\n\t\tthis.engineSettingsIniPath = path.join(appDataPath, 'engine', 'settings.ini');\n\t}\n\n\treadAllFields(location: StorageLocation): Partial<Record<StorageFieldName, string | number>> | null {\n\t\tconst iniPath = location === 'app' ? this.settingsIniPath : this.engineSettingsIniPath;\n\t\tconst iniFileParsed = ini.fromFileOrDefault(iniPath);\n\t\tconst settings = iniFileParsed.Settings;\n\t\tif (!settings) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst result: Partial<Record<StorageFieldName, string | number>> = {};\n\n\t\t// Use field descriptors to determine correct type for each field\n\t\tfor (const field of APP_SETTINGS_FIELDS) {\n\t\t\tif (field.location !== location) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip fields that are only for non-portable mode\n\t\t\tif ((field as FieldDescriptor).nonPortableOnly) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst value = settings[field.storageName];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Determine type based on field descriptor\n\t\t\tif (field.type === 'string' || field.type === 'string-array') {\n\t\t\t\tresult[field.storageName] = value;\n\t\t\t} else {\n\t\t\t\t// number, boolean, boolean-nullable - all stored as numbers in INI\n\t\t\t\tconst numValue = parseInt(value, 10);\n\t\t\t\tresult[field.storageName] = isNaN(numValue) ? 0 : numValue;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\twriteAllFields(location: StorageLocation, fields: Partial<Record<StorageFieldName, string | number>>): void {\n\t\tconst iniPath = location === 'app' ? this.settingsIniPath : this.engineSettingsIniPath;\n\t\tconst iniFileParsed = ini.fromFileOrDefault(iniPath);\n\t\tiniFileParsed.Settings = iniFileParsed.Settings || {};\n\n\t\tfor (const [key, value] of Object.entries(fields)) {\n\t\t\tiniFileParsed.Settings[key] = typeof value === 'number' ? value.toString() : value;\n\t\t}\n\n\t\tini.toFile(iniPath, iniFileParsed);\n\t}\n}\n\n// ============================================================================\n// Registry Storage Backend (Non-portable mode)\n// ============================================================================\n\nclass RegistryAppSettingsBackend implements AppSettingsBackend {\n\tprivate regKey: reg.HKEY;\n\tprivate regSubKey: string;\n\tprivate engineRegSubKey: string;\n\n\tconstructor(regKey: reg.HKEY, regSubKey: string) {\n\t\tthis.regKey = regKey;\n\t\tthis.regSubKey = regSubKey + '\\\\Settings';\n\t\tthis.engineRegSubKey = regSubKey + '\\\\Engine\\\\Settings';\n\t}\n\n\treadAllFields(location: StorageLocation): Partial<Record<StorageFieldName, string | number>> | null {\n\t\tconst subKey = location === 'app' ? this.regSubKey : this.engineRegSubKey;\n\t\tconst key = reg.createKey(this.regKey, subKey, reg.Access.QUERY_VALUE | reg.Access.WOW64_64KEY);\n\t\ttry {\n\t\t\tconst result: Partial<Record<StorageFieldName, string | number>> = {};\n\n\t\t\t// Use field descriptors to determine correct type for each field\n\t\t\tfor (const field of APP_SETTINGS_FIELDS) {\n\t\t\t\tif (field.location !== location) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip fields that are only for portable mode\n\t\t\t\tif ((field as FieldDescriptor).portableOnly) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Read with the correct type based on field descriptor\n\t\t\t\tif (field.type === 'string' || field.type === 'string-array') {\n\t\t\t\t\tconst value = reg.getValue(key, null, field.storageName, reg.GetValueFlags.RT_REG_SZ);\n\t\t\t\t\tif (value !== null) {\n\t\t\t\t\t\tresult[field.storageName] = value as string;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// number, boolean, boolean-nullable - all stored as DWORD\n\t\t\t\t\tconst value = reg.getValue(key, null, field.storageName, reg.GetValueFlags.RT_REG_DWORD);\n\t\t\t\t\tif (value !== null) {\n\t\t\t\t\t\tresult[field.storageName] = value as number;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n\n\twriteAllFields(location: StorageLocation, fields: Partial<Record<StorageFieldName, string | number>>): void {\n\t\tconst subKey = location === 'app' ? this.regSubKey : this.engineRegSubKey;\n\t\tconst key = reg.createKey(this.regKey, subKey, reg.Access.SET_VALUE | reg.Access.WOW64_64KEY);\n\t\ttry {\n\t\t\tfor (const [fieldName, value] of Object.entries(fields)) {\n\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\treg.setValueDWORD(key, fieldName, value);\n\t\t\t\t} else {\n\t\t\t\t\treg.setValueSZ(key, fieldName, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Base Implementation - Common logic for both modes\n// ============================================================================\n\nclass AppSettingsUtilsBase implements AppSettingsUtils {\n\tprotected backend: AppSettingsBackend;\n\n\tprotected constructor(backend: AppSettingsBackend) {\n\t\tthis.backend = backend;\n\t}\n\n\tpublic getAppSettings(): AppSettings {\n\t\treturn AppSettingsCodec.parse(this.backend);\n\t}\n\n\tpublic updateAppSettings(appSettings: Partial<AppSettings>): void {\n\t\tAppSettingsCodec.serialize(this.backend, appSettings);\n\t}\n\n\tpublic shouldRestartApp(appSettings: Partial<AppSettings>): boolean {\n\t\treturn appSettings.safeMode !== undefined ||\n\t\t\tappSettings.loggingVerbosity !== undefined ||\n\t\t\t(appSettings.engine !== undefined && Object.keys(appSettings.engine).length > 0);\n\t}\n\n\tpublic shouldNotifyTrayProgram(appSettings: Partial<AppSettings>): boolean {\n\t\treturn appSettings.language !== undefined ||\n\t\t\tappSettings.disableUpdateCheck !== undefined ||\n\t\t\tappSettings.hideTrayIcon !== undefined ||\n\t\t\tappSettings.dontAutoShowToolkit !== undefined ||\n\t\t\tappSettings.modTasksDialogDelay !== undefined;\n\t}\n}\n\n// ============================================================================\n// Portable Implementation\n// ============================================================================\n\nexport class AppSettingsUtilsPortable extends AppSettingsUtilsBase {\n\tpublic constructor(appDataPath: string) {\n\t\tsuper(new IniAppSettingsBackend(appDataPath));\n\t}\n\n\tpublic updateAppSettings(appSettings: Partial<AppSettings>): void {\n\t\t// Special validation for portable mode\n\t\tif (appSettings.disableRunUIScheduledTask !== undefined && appSettings.disableRunUIScheduledTask !== null) {\n\t\t\tthrow new Error('Cannot set disableRunUIScheduledTask in portable mode');\n\t\t}\n\t\tsuper.updateAppSettings(appSettings);\n\t}\n}\n\n// ============================================================================\n// Non-Portable Implementation\n// ============================================================================\n\nexport class AppSettingsUtilsNonPortable extends AppSettingsUtilsBase {\n\tpublic constructor(regKey: reg.HKEY, regSubKey: string) {\n\t\tsuper(new RegistryAppSettingsBackend(regKey, regSubKey));\n\t}\n\n\tpublic updateAppSettings(appSettings: Partial<AppSettings>): void {\n\t\t// Handle special side effects for non-portable mode\n\t\tif (appSettings.language !== undefined) {\n\t\t\ttry {\n\t\t\t\tthis.setInstallerLanguage(appSettings.language);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn('Failed to set installer language', e);\n\t\t\t}\n\t\t}\n\t\tif (appSettings.disableUpdateCheck !== undefined) {\n\t\t\tthis.enableScheduledTask('WindhawkUpdateTask', !appSettings.disableUpdateCheck);\n\t\t}\n\t\tif (appSettings.disableRunUIScheduledTask !== undefined) {\n\t\t\tthis.enableScheduledTask('WindhawkRunUITask', !appSettings.disableRunUIScheduledTask);\n\t\t}\n\n\t\tsuper.updateAppSettings(appSettings);\n\t}\n\n\tprivate setInstallerLanguage(language: string) {\n\t\t// https://github.com/sindresorhus/lcid/blob/958d38ff2b812d6854cbba2cae611e86a1d5ddf3/lcid.json\n\t\tconst lcidMap = {\n\t\t\t\"4\": \"zh_CHS\",\n\t\t\t\"1025\": \"ar_SA\",\n\t\t\t\"1026\": \"bg_BG\",\n\t\t\t\"1027\": \"ca_ES\",\n\t\t\t\"1028\": \"zh_TW\",\n\t\t\t\"1029\": \"cs_CZ\",\n\t\t\t\"1030\": \"da_DK\",\n\t\t\t\"1031\": \"de_DE\",\n\t\t\t\"1032\": \"el_GR\",\n\t\t\t\"1033\": \"en_US\",\n\t\t\t\"1034\": \"es_ES\",\n\t\t\t\"1035\": \"fi_FI\",\n\t\t\t\"1036\": \"fr_FR\",\n\t\t\t\"1037\": \"he_IL\",\n\t\t\t\"1038\": \"hu_HU\",\n\t\t\t\"1039\": \"is_IS\",\n\t\t\t\"1040\": \"it_IT\",\n\t\t\t\"1041\": \"ja_JP\",\n\t\t\t\"1042\": \"ko_KR\",\n\t\t\t\"1043\": \"nl_NL\",\n\t\t\t\"1044\": \"nb_NO\",\n\t\t\t\"1045\": \"pl_PL\",\n\t\t\t\"1046\": \"pt_BR\",\n\t\t\t\"1047\": \"rm_CH\",\n\t\t\t\"1048\": \"ro_RO\",\n\t\t\t\"1049\": \"ru_RU\",\n\t\t\t\"1050\": \"hr_HR\",\n\t\t\t\"1051\": \"sk_SK\",\n\t\t\t\"1052\": \"sq_AL\",\n\t\t\t\"1053\": \"sv_SE\",\n\t\t\t\"1054\": \"th_TH\",\n\t\t\t\"1055\": \"tr_TR\",\n\t\t\t\"1056\": \"ur_PK\",\n\t\t\t\"1057\": \"id_ID\",\n\t\t\t\"1058\": \"uk_UA\",\n\t\t\t\"1059\": \"be_BY\",\n\t\t\t\"1060\": \"sl_SI\",\n\t\t\t\"1061\": \"et_EE\",\n\t\t\t\"1062\": \"lv_LV\",\n\t\t\t\"1063\": \"lt_LT\",\n\t\t\t\"1064\": \"tg_TJ\",\n\t\t\t\"1065\": \"fa_IR\",\n\t\t\t\"1066\": \"vi_VN\",\n\t\t\t\"1067\": \"hy_AM\",\n\t\t\t\"1069\": \"eu_ES\",\n\t\t\t\"1070\": \"wen_DE\",\n\t\t\t\"1071\": \"mk_MK\",\n\t\t\t\"1072\": \"st_ZA\",\n\t\t\t\"1073\": \"ts_ZA\",\n\t\t\t\"1074\": \"tn_ZA\",\n\t\t\t\"1075\": \"ven_ZA\",\n\t\t\t\"1076\": \"xh_ZA\",\n\t\t\t\"1077\": \"zu_ZA\",\n\t\t\t\"1078\": \"af_ZA\",\n\t\t\t\"1079\": \"ka_GE\",\n\t\t\t\"1080\": \"fo_FO\",\n\t\t\t\"1081\": \"hi_IN\",\n\t\t\t\"1082\": \"mt_MT\",\n\t\t\t\"1083\": \"se_NO\",\n\t\t\t\"1084\": \"gd_GB\",\n\t\t\t\"1085\": \"yi\",\n\t\t\t\"1086\": \"ms_MY\",\n\t\t\t\"1087\": \"kk_KZ\",\n\t\t\t\"1088\": \"ky_KG\",\n\t\t\t\"1089\": \"sw_KE\",\n\t\t\t\"1090\": \"tk_TM\",\n\t\t\t\"1092\": \"tt_RU\",\n\t\t\t\"1093\": \"bn_IN\",\n\t\t\t\"1094\": \"pa_IN\",\n\t\t\t\"1095\": \"gu_IN\",\n\t\t\t\"1096\": \"or_IN\",\n\t\t\t\"1097\": \"ta_IN\",\n\t\t\t\"1098\": \"te_IN\",\n\t\t\t\"1099\": \"kn_IN\",\n\t\t\t\"1100\": \"ml_IN\",\n\t\t\t\"1101\": \"as_IN\",\n\t\t\t\"1102\": \"mr_IN\",\n\t\t\t\"1103\": \"sa_IN\",\n\t\t\t\"1104\": \"mn_MN\",\n\t\t\t\"1105\": \"bo_CN\",\n\t\t\t\"1106\": \"cy_GB\",\n\t\t\t\"1107\": \"kh_KH\",\n\t\t\t\"1108\": \"lo_LA\",\n\t\t\t\"1109\": \"my_MM\",\n\t\t\t\"1110\": \"gl_ES\",\n\t\t\t\"1111\": \"kok_IN\",\n\t\t\t\"1113\": \"sd_IN\",\n\t\t\t\"1114\": \"syr_SY\",\n\t\t\t\"1115\": \"si_LK\",\n\t\t\t\"1116\": \"chr_US\",\n\t\t\t\"1118\": \"am_ET\",\n\t\t\t\"1119\": \"tmz\",\n\t\t\t\"1121\": \"ne_NP\",\n\t\t\t\"1122\": \"fy_NL\",\n\t\t\t\"1123\": \"ps_AF\",\n\t\t\t\"1124\": \"fil_PH\",\n\t\t\t\"1125\": \"div_MV\",\n\t\t\t\"1126\": \"bin_NG\",\n\t\t\t\"1127\": \"fuv_NG\",\n\t\t\t\"1128\": \"ha_NG\",\n\t\t\t\"1129\": \"ibb_NG\",\n\t\t\t\"1130\": \"yo_NG\",\n\t\t\t\"1131\": \"quz_BO\",\n\t\t\t\"1132\": \"ns_ZA\",\n\t\t\t\"1133\": \"ba_RU\",\n\t\t\t\"1134\": \"lb_LU\",\n\t\t\t\"1135\": \"kl_GL\",\n\t\t\t\"1144\": \"ii_CN\",\n\t\t\t\"1146\": \"arn_CL\",\n\t\t\t\"1148\": \"moh_CA\",\n\t\t\t\"1150\": \"br_FR\",\n\t\t\t\"1152\": \"ug_CN\",\n\t\t\t\"1153\": \"mi_NZ\",\n\t\t\t\"1154\": \"oc_FR\",\n\t\t\t\"1155\": \"co_FR\",\n\t\t\t\"1156\": \"gsw_FR\",\n\t\t\t\"1157\": \"sah_RU\",\n\t\t\t\"1158\": \"qut_GT\",\n\t\t\t\"1159\": \"rw_RW\",\n\t\t\t\"1160\": \"wo_SN\",\n\t\t\t\"1164\": \"gbz_AF\",\n\t\t\t\"2049\": \"ar_IQ\",\n\t\t\t\"2052\": \"zh_CN\",\n\t\t\t\"2055\": \"de_CH\",\n\t\t\t\"2057\": \"en_GB\",\n\t\t\t\"2058\": \"es_MX\",\n\t\t\t\"2060\": \"fr_BE\",\n\t\t\t\"2064\": \"it_CH\",\n\t\t\t\"2067\": \"nl_BE\",\n\t\t\t\"2068\": \"nn_NO\",\n\t\t\t\"2070\": \"pt_PT\",\n\t\t\t\"2072\": \"ro_MD\",\n\t\t\t\"2073\": \"ru_MD\",\n\t\t\t\"2077\": \"sv_FI\",\n\t\t\t\"2080\": \"ur_IN\",\n\t\t\t\"2092\": \"az_AZ\",\n\t\t\t\"2094\": \"dsb_DE\",\n\t\t\t\"2107\": \"se_SE\",\n\t\t\t\"2108\": \"ga_IE\",\n\t\t\t\"2110\": \"ms_BN\",\n\t\t\t\"2115\": \"uz_UZ\",\n\t\t\t\"2128\": \"mn_CN\",\n\t\t\t\"2129\": \"bo_BT\",\n\t\t\t\"2141\": \"iu_CA\",\n\t\t\t\"2143\": \"tmz_DZ\",\n\t\t\t\"2145\": \"ne_IN\",\n\t\t\t\"2155\": \"quz_EC\",\n\t\t\t\"2163\": \"ti_ET\",\n\t\t\t\"3073\": \"ar_EG\",\n\t\t\t\"3076\": \"zh_HK\",\n\t\t\t\"3079\": \"de_AT\",\n\t\t\t\"3081\": \"en_AU\",\n\t\t\t\"3082\": \"es_ES\",\n\t\t\t\"3084\": \"fr_CA\",\n\t\t\t\"3098\": \"sr_SP\",\n\t\t\t\"3131\": \"se_FI\",\n\t\t\t\"3179\": \"quz_PE\",\n\t\t\t\"4097\": \"ar_LY\",\n\t\t\t\"4100\": \"zh_SG\",\n\t\t\t\"4103\": \"de_LU\",\n\t\t\t\"4105\": \"en_CA\",\n\t\t\t\"4106\": \"es_GT\",\n\t\t\t\"4108\": \"fr_CH\",\n\t\t\t\"4122\": \"hr_BA\",\n\t\t\t\"4155\": \"smj_NO\",\n\t\t\t\"5121\": \"ar_DZ\",\n\t\t\t\"5124\": \"zh_MO\",\n\t\t\t\"5127\": \"de_LI\",\n\t\t\t\"5129\": \"en_NZ\",\n\t\t\t\"5130\": \"es_CR\",\n\t\t\t\"5132\": \"fr_LU\",\n\t\t\t\"5179\": \"smj_SE\",\n\t\t\t\"6145\": \"ar_MA\",\n\t\t\t\"6153\": \"en_IE\",\n\t\t\t\"6154\": \"es_PA\",\n\t\t\t\"6156\": \"fr_MC\",\n\t\t\t\"6203\": \"sma_NO\",\n\t\t\t\"7169\": \"ar_TN\",\n\t\t\t\"7177\": \"en_ZA\",\n\t\t\t\"7178\": \"es_DO\",\n\t\t\t\"7180\": \"fr_029\",\n\t\t\t\"7194\": \"sr_BA\",\n\t\t\t\"7227\": \"sma_SE\",\n\t\t\t\"8193\": \"ar_OM\",\n\t\t\t\"8201\": \"en_JA\",\n\t\t\t\"8202\": \"es_VE\",\n\t\t\t\"8204\": \"fr_RE\",\n\t\t\t\"8218\": \"bs_BA\",\n\t\t\t\"8251\": \"sms_FI\",\n\t\t\t\"9217\": \"ar_YE\",\n\t\t\t\"9225\": \"en_CB\",\n\t\t\t\"9226\": \"es_CO\",\n\t\t\t\"9228\": \"fr_CG\",\n\t\t\t\"9275\": \"smn_FI\",\n\t\t\t\"10241\": \"ar_SY\",\n\t\t\t\"10249\": \"en_BZ\",\n\t\t\t\"10250\": \"es_PE\",\n\t\t\t\"10252\": \"fr_SN\",\n\t\t\t\"11265\": \"ar_JO\",\n\t\t\t\"11273\": \"en_TT\",\n\t\t\t\"11274\": \"es_AR\",\n\t\t\t\"11276\": \"fr_CM\",\n\t\t\t\"12289\": \"ar_LB\",\n\t\t\t\"12297\": \"en_ZW\",\n\t\t\t\"12298\": \"es_EC\",\n\t\t\t\"12300\": \"fr_CI\",\n\t\t\t\"13313\": \"ar_KW\",\n\t\t\t\"13321\": \"en_PH\",\n\t\t\t\"13322\": \"es_CL\",\n\t\t\t\"13324\": \"fr_ML\",\n\t\t\t\"14337\": \"ar_AE\",\n\t\t\t\"14345\": \"en_ID\",\n\t\t\t\"14346\": \"es_UR\",\n\t\t\t\"14348\": \"fr_MA\",\n\t\t\t\"15361\": \"ar_BH\",\n\t\t\t\"15369\": \"en_HK\",\n\t\t\t\"15370\": \"es_PY\",\n\t\t\t\"15372\": \"fr_HT\",\n\t\t\t\"16385\": \"ar_QA\",\n\t\t\t\"16393\": \"en_IN\",\n\t\t\t\"16394\": \"es_BO\",\n\t\t\t\"17417\": \"en_MY\",\n\t\t\t\"17418\": \"es_SV\",\n\t\t\t\"18441\": \"en_SG\",\n\t\t\t\"18442\": \"es_HN\",\n\t\t\t\"19466\": \"es_NI\",\n\t\t\t\"20490\": \"es_PR\",\n\t\t\t\"21514\": \"es_US\",\n\t\t\t\"31748\": \"zh_CHT\"\n\t\t};\n\t\tconst languageParts = language.split('-');\n\t\tlet languageLcid: number | undefined;\n\t\tfor (const [lcid, iterLanguage] of Object.entries(lcidMap)) {\n\t\t\tconst iterLanguageParts = iterLanguage.split('_');\n\t\t\tif (languageParts.length <= iterLanguageParts.length &&\n\t\t\t\tlanguageParts.every((part, index) => part === iterLanguageParts[index])) {\n\t\t\t\tlanguageLcid = parseInt(lcid, 10);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (languageLcid === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Special case: Use Spanish International.\n\t\tif (languageLcid === 1034) {\n\t\t\tlanguageLcid = 3082;\n\t\t}\n\t\tconst key = reg.createKey(reg.HKLM, 'SOFTWARE\\\\Windhawk',\n\t\t\treg.Access.SET_VALUE | reg.Access.WOW64_32KEY);\n\t\ttry {\n\t\t\treg.setValueDWORD(key, 'language', languageLcid);\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n\n\tprivate enableScheduledTask(taskName: string, enable: boolean) {\n\t\ttry {\n\t\t\tconst ps = child_process.spawn('schtasks.exe', [\n\t\t\t\t'/change',\n\t\t\t\t'/tn',\n\t\t\t\ttaskName,\n\t\t\t\tenable ? '/enable' : '/disable'\n\t\t\t]);\n\n\t\t\tlet gotError = false;\n\t\t\tlet stderr = '';\n\n\t\t\tps.stderr.on('data', data => {\n\t\t\t\t//console.log(`ps stderr: ${data}`);\n\t\t\t\tstderr += data;\n\t\t\t});\n\n\t\t\tps.on('error', err => {\n\t\t\t\t//console.log('Oh no, the error: ' + err);\n\t\t\t\tgotError = true;\n\t\t\t\tvscode.window.showErrorMessage(err.message);\n\t\t\t});\n\n\t\t\tps.on('close', code => {\n\t\t\t\t//console.log(`ps process exited with code ${code}`);\n\t\t\t\tif (!gotError && code !== 0) {\n\t\t\t\t\tlet message = 'schtasks.exe error';\n\t\t\t\t\tconst stderrFiltered = stderr.trim().replace(/^ERROR:\\s*/, '');\n\t\t\t\t\tif (stderrFiltered !== '') {\n\t\t\t\t\t\tmessage += ': ' + stderrFiltered;\n\t\t\t\t\t}\n\n\t\t\t\t\tvscode.window.showWarningMessage(message);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tvscode.window.showErrorMessage(e.message);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/compilerUtils.ts",
    "content": "import * as child_process from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as vscode from 'vscode';\n\ntype CompilationTarget =\n\t| 'i686-w64-mingw32'\n\t| 'x86_64-w64-mingw32'\n\t| 'aarch64-w64-mingw32';\n\ntype CompilationResult = {\n\texitCode: number | null;\n\tstdout: string;\n\tstderr: string;\n};\n\nexport class CompilerError extends Error {\n\tpublic exitCode: number | null;\n\tpublic stdout: string;\n\tpublic stderr: string;\n\n\tconstructor(target: CompilationTarget, result: number | null, stdout: string, stderr: string) {\n\t\tlet msg = 'Compilation failed';\n\n\t\tif (result === 1) {\n\t\t\tmsg += ', the mod might require a newer Windhawk version';\n\t\t\tif (target === 'aarch64-w64-mingw32') {\n\t\t\t\tmsg += ', or perhaps the mod isn\\'t compatible with ARM64 yet';\n\t\t\t}\n\t\t} else if (result === 0xC0000135) {\n\t\t\tmsg += ', some files are missing, please reinstall Windhawk and ' +\n\t\t\t\t'make sure files aren\\'t being removed by an antivirus';\n\t\t} else {\n\t\t\tconst exitCodeStr = result !== null ? `0x${result.toString(16)}` : 'unknown';\n\t\t\tmsg += `, error code: ${exitCodeStr}, please reinstall Windhawk ` +\n\t\t\t\t'and make sure files aren\\'t being removed by an antivirus';\n\t\t}\n\n\t\tsuper(msg);\n\t\tthis.exitCode = result;\n\t\tthis.stdout = stdout;\n\t\tthis.stderr = stderr;\n\t}\n}\n\nexport class CompilerKilled extends Error {\n\tconstructor() {\n\t\tsuper('Compilation was aborted');\n\t}\n}\n\nexport default class CompilerUtils {\n\tprivate compilerPath: string;\n\tprivate enginePath: string;\n\tprivate engineModsPath: string;\n\tprivate arm64Enabled: boolean;\n\tprivate supportedCompilationTargets: CompilationTarget[];\n\tprivate activeProcesses: Set<child_process.ChildProcess> = new Set();\n\tprivate canceledProcesses: Set<child_process.ChildProcess> = new Set();\n\n\tpublic constructor(compilerPath: string, enginePath: string, appDataPath: string, arm64Enabled: boolean) {\n\t\tthis.compilerPath = compilerPath;\n\t\tthis.enginePath = enginePath;\n\t\tthis.engineModsPath = path.join(appDataPath, 'Engine', 'Mods');\n\t\tthis.arm64Enabled = arm64Enabled;\n\n\t\tthis.supportedCompilationTargets = [\n\t\t\t'i686-w64-mingw32',\n\t\t\t'x86_64-w64-mingw32',\n\t\t];\n\n\t\tif (arm64Enabled) {\n\t\t\tthis.supportedCompilationTargets.push('aarch64-w64-mingw32');\n\t\t}\n\n\t\tfor (const target of this.supportedCompilationTargets) {\n\t\t\ttry {\n\t\t\t\tthis.copyCompilerLibs(target);\n\t\t\t} catch (e: unknown) {\n\t\t\t\tconst message = e instanceof Error ? e.message : String(e);\n\t\t\t\tvscode.window.showErrorMessage(`Failed to copy compiler libs for target ${target}: ${message}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate subfolderFromCompilationTarget(target: CompilationTarget) {\n\t\tswitch (target) {\n\t\t\tcase 'i686-w64-mingw32':\n\t\t\t\treturn '32';\n\n\t\t\tcase 'x86_64-w64-mingw32':\n\t\t\t\treturn '64';\n\n\t\t\tcase 'aarch64-w64-mingw32':\n\t\t\t\treturn 'arm64';\n\t\t}\n\t}\n\n\tprivate compilationTargetsFromArchitecture(architectures: string[], modTargets: string[]) {\n\t\tif (architectures.length === 0) {\n\t\t\tarchitectures = ['x86', 'x86-64'];\n\t\t}\n\n\t\t// Keep in lowercase.\n\t\tconst commonSystemModTargets = [\n\t\t\t'startmenuexperiencehost.exe',\n\t\t\t'searchhost.exe',\n\t\t\t'explorer.exe',\n\t\t\t'shellexperiencehost.exe',\n\t\t\t'shellhost.exe',\n\t\t\t'dwm.exe',\n\t\t\t'notepad.exe',\n\t\t\t'regedit.exe'\n\t\t];\n\n\t\tconst targets: CompilationTarget[] = [];\n\n\t\tfor (const architecture of architectures) {\n\t\t\tif (architecture === 'x86') {\n\t\t\t\ttargets.push('i686-w64-mingw32');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (architecture === 'x86-64') {\n\t\t\t\tif (this.arm64Enabled) {\n\t\t\t\t\ttargets.push('aarch64-w64-mingw32');\n\t\t\t\t\tif (modTargets.length == 0 ||\n\t\t\t\t\t\t!modTargets.every(target => commonSystemModTargets.includes(target.toLowerCase()))) {\n\t\t\t\t\t\ttargets.push('x86_64-w64-mingw32');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttargets.push('x86_64-w64-mingw32');\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (architecture === 'amd64') {\n\t\t\t\ttargets.push('x86_64-w64-mingw32');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (architecture === 'arm64') {\n\t\t\t\tif (this.arm64Enabled) {\n\t\t\t\t\ttargets.push('aarch64-w64-mingw32');\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthrow new Error(`Unsupported architecture: ${architecture}`);\n\t\t}\n\n\t\tif (targets.length === 0) {\n\t\t\tthrow new Error('The current architecture is not supported');\n\t\t}\n\n\t\treturn targets;\n\t}\n\n\tprivate doesCompiledModExist(fileName: string, target: CompilationTarget) {\n\t\tconst compiledModPath = path.join(this.engineModsPath, this.subfolderFromCompilationTarget(target), fileName);\n\t\treturn fs.existsSync(compiledModPath);\n\t}\n\n\tprivate async makePrecompiledHeaders(\n\t\tpchHeaderPath: string,\n\t\ttargetPchPath: string,\n\t\ttarget: CompilationTarget,\n\t\tmodId: string,\n\t\tmodVersion: string,\n\t\textraArgs: string[],\n\t): Promise<CompilationResult> {\n\t\tconst clangPath = path.join(this.compilerPath, 'bin', 'clang++.exe');\n\n\t\tconst args = [\n\t\t\t'-std=c++23',\n\t\t\t'-O2',\n\t\t\t'-DUNICODE',\n\t\t\t'-D_UNICODE',\n\t\t\t'-DWINVER=0x0A00',\n\t\t\t'-D_WIN32_WINNT=0x0A00',\n\t\t\t'-D_WIN32_IE=0x0A00',\n\t\t\t'-DNTDDI_VERSION=0x0A000008',\n\t\t\t'-D__USE_MINGW_ANSI_STDIO=0',\n\t\t\t'-DWH_MOD',\n\t\t\t'-DWH_MOD_ID=L\"' + modId.replace(/\"/g, '\\\\\"') + '\"',\n\t\t\t'-DWH_MOD_VERSION=L\"' + modVersion.replace(/\"/g, '\\\\\"') + '\"',\n\t\t\t'-x',\n\t\t\t'c++-header',\n\t\t\tpchHeaderPath,\n\t\t\t'-target',\n\t\t\ttarget,\n\t\t\t'-o',\n\t\t\ttargetPchPath,\n\t\t\t...extraArgs.filter(arg => arg.startsWith('-D'))\n\t\t];\n\t\tconst ps = child_process.spawn(clangPath, args, {\n\t\t\tcwd: this.compilerPath\n\t\t});\n\n\t\tthis.activeProcesses.add(ps);\n\n\t\tconst stdoutBuffers: Buffer[] = [];\n\t\tconst stderrBuffers: Buffer[] = [];\n\n\t\tps.stdout.on('data', data => {\n\t\t\tstdoutBuffers.push(data);\n\t\t});\n\n\t\tps.stderr.on('data', data => {\n\t\t\tstderrBuffers.push(data);\n\t\t});\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tps.on('error', err => {\n\t\t\t\tthis.activeProcesses.delete(ps);\n\t\t\t\tthis.canceledProcesses.delete(ps);\n\t\t\t\treject(err);\n\t\t\t});\n\n\t\t\tps.on('close', code => {\n\t\t\t\tthis.activeProcesses.delete(ps);\n\t\t\t\tconst wasCanceled = this.canceledProcesses.delete(ps);\n\t\t\t\tif (wasCanceled) {\n\t\t\t\t\treject(new CompilerKilled());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst stdout = Buffer.concat(stdoutBuffers).toString('utf8');\n\t\t\t\tconst stderr = Buffer.concat(stderrBuffers).toString('utf8');\n\t\t\t\tresolve({ exitCode: code, stdout, stderr });\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async compileModInternal(\n\t\tmodSourceCode: string,\n\t\ttargetDllName: string,\n\t\ttarget: CompilationTarget,\n\t\tmodId: string,\n\t\tmodVersion: string,\n\t\textraArgs: string[],\n\t\tpchPath?: string\n\t): Promise<CompilationResult> {\n\t\tconst clangPath = path.join(this.compilerPath, 'bin', 'clang++.exe');\n\n\t\tconst subfolder = this.subfolderFromCompilationTarget(target);\n\t\tconst engineLibPath = path.join(this.enginePath, subfolder, 'windhawk.lib');\n\t\tconst compiledModDllPath = path.join(this.engineModsPath, subfolder, targetDllName);\n\n\t\tfs.mkdirSync(path.dirname(compiledModDllPath), { recursive: true });\n\n\t\tconst windowsVersionFlags = [\n\t\t\t'classic-taskdlg-fix\\n1.1.0',\n\t\t].includes(`${modId}\\n${modVersion}`) ? [] : [\n\t\t\t'-DWINVER=0x0A00',\n\t\t\t'-D_WIN32_WINNT=0x0A00',\n\t\t\t'-D_WIN32_IE=0x0A00',\n\t\t\t'-DNTDDI_VERSION=0x0A000008',\n\t\t];\n\n\t\tconst backwardCompatibilityFlags: string[] = [];\n\n\t\tif ([\n\t\t\t'chrome-ui-tweaks\\n1.0.0',\n\t\t].includes(`${modId}\\n${modVersion}`)) {\n\t\t\tbackwardCompatibilityFlags.push('-include', 'atomic', '-include', 'optional');\n\t\t}\n\n\t\tif ([\n\t\t\t'sib-plusplus-tweaker\\n0.7.1',\n\t\t].includes(`${modId}\\n${modVersion}`)) {\n\t\t\tbackwardCompatibilityFlags.push('-include', 'atomic');\n\t\t}\n\n\t\tif ([\n\t\t\t'classic-explorer-treeview\\n1.1.3',\n\t\t\t'sysdm-general-tab\\n1.1',\n\t\t].includes(`${modId}\\n${modVersion}`)) {\n\t\t\tbackwardCompatibilityFlags.push('-include', 'cmath');\n\t\t}\n\n\t\tif ([\n\t\t\t'ce-disable-process-button-flashing\\n1.0.1',\n\t\t\t'windows-7-clock-spacing\\n1.0.0',\n\t\t].includes(`${modId}\\n${modVersion}`)) {\n\t\t\tbackwardCompatibilityFlags.push('-include', 'vector');\n\t\t}\n\n\t\tconst args = [\n\t\t\t'-std=c++23',\n\t\t\t'-O2',\n\t\t\t'-shared',\n\t\t\t'-DUNICODE',\n\t\t\t'-D_UNICODE',\n\t\t\t...windowsVersionFlags,\n\t\t\t'-D__USE_MINGW_ANSI_STDIO=0',\n\t\t\t'-DWH_MOD',\n\t\t\t'-DWH_MOD_ID=L\"' + modId.replace(/\"/g, '\\\\\"') + '\"',\n\t\t\t'-DWH_MOD_VERSION=L\"' + modVersion.replace(/\"/g, '\\\\\"') + '\"',\n\t\t\tengineLibPath,\n\t\t\t'-x',\n\t\t\t'c++',\n\t\t\t'-',\n\t\t\t'-include',\n\t\t\t'windhawk_api.h',\n\t\t\t'-target',\n\t\t\ttarget,\n\t\t\t'-Wl,--export-all-symbols',\n\t\t\t'-o',\n\t\t\tcompiledModDllPath,\n\t\t\t...(pchPath ? ['-include-pch', pchPath] : []),\n\t\t\t...extraArgs,\n\t\t\t...backwardCompatibilityFlags,\n\t\t];\n\t\tconst ps = child_process.spawn(clangPath, args, {\n\t\t\tcwd: this.compilerPath\n\t\t});\n\n\t\tthis.activeProcesses.add(ps);\n\n\t\tconst stdoutBuffers: Buffer[] = [];\n\t\tconst stderrBuffers: Buffer[] = [];\n\n\t\tps.stdout.on('data', data => {\n\t\t\tstdoutBuffers.push(data);\n\t\t});\n\n\t\tps.stderr.on('data', data => {\n\t\t\tstderrBuffers.push(data);\n\t\t});\n\n\t\tps.stdin.write(modSourceCode);\n\t\tps.stdin.end();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tps.on('error', err => {\n\t\t\t\tthis.activeProcesses.delete(ps);\n\t\t\t\tthis.canceledProcesses.delete(ps);\n\t\t\t\treject(err);\n\t\t\t});\n\n\t\t\tps.on('close', code => {\n\t\t\t\tthis.activeProcesses.delete(ps);\n\t\t\t\tconst wasCanceled = this.canceledProcesses.delete(ps);\n\t\t\t\tif (wasCanceled) {\n\t\t\t\t\treject(new CompilerKilled());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst stdout = Buffer.concat(stdoutBuffers).toString('utf8');\n\t\t\t\tconst stderr = Buffer.concat(stderrBuffers).toString('utf8');\n\t\t\t\tresolve({ exitCode: code, stdout, stderr });\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate copyCompilerLibs(target: CompilationTarget) {\n\t\tconst libsDir = path.join(this.compilerPath, target, 'bin');\n\t\tconst targetModsDir = path.join(this.engineModsPath, this.subfolderFromCompilationTarget(target));\n\n\t\tfs.mkdirSync(targetModsDir, { recursive: true });\n\n\t\tconst filesToCopy = [\n\t\t\t['libc++.dll', 'libc++.whl'],\n\t\t\t['libunwind.dll', 'libunwind.whl'],\n\t\t\t['windhawk-mod-shim.dll', 'windhawk-mod-shim.dll'],\n\t\t];\n\n\t\t// Make sure libc++.dll from previous Windhawk versions is also\n\t\t// up-to-date to address the \"Not enough space for thread data\" error.\n\t\tif (fs.existsSync(path.join(targetModsDir, 'libc++.dll'))) {\n\t\t\tfilesToCopy.push(['libc++.dll', 'libc++.dll']);\n\t\t}\n\n\t\t// Do the same for libunwind.dll.\n\t\tif (fs.existsSync(path.join(targetModsDir, 'libunwind.dll'))) {\n\t\t\tfilesToCopy.push(['libunwind.dll', 'libunwind.dll']);\n\t\t}\n\n\t\tfor (const [fileFrom, fileTo] of filesToCopy) {\n\t\t\tconst libPath = path.join(libsDir, fileFrom);\n\t\t\tconst libPathDest = path.join(targetModsDir, fileTo);\n\n\t\t\tif (fs.existsSync(libPathDest) &&\n\t\t\t\tfs.statSync(libPathDest).mtimeMs === fs.statSync(libPath).mtimeMs) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tfs.copyFileSync(libPath, libPathDest);\n\t\t\t} catch (e: unknown) {\n\t\t\t\tif (!fs.existsSync(libPathDest)) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// The lib file already exists, perhaps it's in use.\n\t\t\t\t// Try to rename it to a temporary name.\n\t\t\t\tconst libPathDestExt = path.extname(libPathDest);\n\t\t\t\tconst libPathDestBaseName = path.basename(libPathDest, libPathDestExt);\n\t\t\t\tfor (let i = 1; ; i++) {\n\t\t\t\t\tconst tempFilename = libPathDestBaseName + '_temp' + i + libPathDestExt;\n\t\t\t\t\tconst libPathDestTemp = path.join(targetModsDir, tempFilename);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfs.renameSync(libPathDest, libPathDestTemp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (!fs.existsSync(libPathDestTemp)) {\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfs.copyFileSync(libPath, libPathDest);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async compileMod(\n\t\tmodId: string,\n\t\tmodVersion: string,\n\t\tmodTargets: string[],\n\t\tmodSourceCode: string,\n\t\tarchitectures: string[],\n\t\tcompilerOptions: string | undefined,\n\t\tprecompiledHeadersFolder?: string\n\t) {\n\t\tlet targetDllName: string;\n\t\tfor (; ;) {\n\t\t\ttargetDllName = modId + '_' + modVersion + '_' + randomIntFromInterval(100000, 999999) + '.dll';\n\t\t\tif (this.supportedCompilationTargets.every(target => !this.doesCompiledModExist(targetDllName, target))) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet compilerOptionsArray: string[] = [];\n\t\tif (compilerOptions && compilerOptions.trim() !== '') {\n\t\t\tcompilerOptionsArray = splitargs(compilerOptions);\n\t\t}\n\n\t\tfor (const target of this.compilationTargetsFromArchitecture(architectures, modTargets)) {\n\t\t\tlet pchPath: string | undefined = undefined;\n\t\t\tif (precompiledHeadersFolder) {\n\t\t\t\tconst pchHeaderPath = path.join(precompiledHeadersFolder, 'windhawk_pch.h');\n\t\t\t\tif (fs.existsSync(pchHeaderPath)) {\n\t\t\t\t\tpchPath = path.join(precompiledHeadersFolder, `windhawk_t_${target}.pch`);\n\t\t\t\t\tif (!fs.existsSync(pchPath) ||\n\t\t\t\t\t\tfs.statSync(pchPath).mtimeMs < fs.statSync(pchHeaderPath).mtimeMs) {\n\t\t\t\t\t\tconst { exitCode, stdout, stderr } = await this.makePrecompiledHeaders(\n\t\t\t\t\t\t\tpchHeaderPath,\n\t\t\t\t\t\t\tpchPath,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tmodId,\n\t\t\t\t\t\t\tmodVersion,\n\t\t\t\t\t\t\tcompilerOptionsArray\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (exitCode !== 0) {\n\t\t\t\t\t\t\tthrow new CompilerError(\n\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\texitCode,\n\t\t\t\t\t\t\t\tstdout,\n\t\t\t\t\t\t\t\tstderr\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (stdout) {\n\t\t\t\t\t\t\tconsole.log(`Precompiled headers stdout for target ${target}:\\n${stdout}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (stderr) {\n\t\t\t\t\t\t\tconsole.log(`Precompiled headers stderr for target ${target}:\\n${stderr}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { exitCode, stdout, stderr } = await this.compileModInternal(\n\t\t\t\tmodSourceCode,\n\t\t\t\ttargetDllName,\n\t\t\t\ttarget,\n\t\t\t\tmodId,\n\t\t\t\tmodVersion,\n\t\t\t\tcompilerOptionsArray,\n\t\t\t\tpchPath\n\t\t\t);\n\t\t\tif (exitCode !== 0) {\n\t\t\t\tthrow new CompilerError(\n\t\t\t\t\ttarget,\n\t\t\t\t\texitCode,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (stdout) {\n\t\t\t\tconsole.log(`Compiler stdout for target ${target}:\\n${stdout}`);\n\t\t\t}\n\t\t\tif (stderr) {\n\t\t\t\tconsole.log(`Compiler stderr for target ${target}:\\n${stderr}`);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttargetDllName,\n\t\t};\n\t}\n\n\tpublic cancelCompilation() {\n\t\tfor (const process of this.activeProcesses) {\n\t\t\tthis.canceledProcesses.add(process);\n\t\t\ttry {\n\t\t\t\t// Needed for Windows: https://stackoverflow.com/a/77421143\n\t\t\t\tprocess.stdout?.destroy();\n\t\t\t\tprocess.stdin?.destroy();\n\t\t\t\tprocess.stderr?.destroy();\n\n\t\t\t\tprocess.kill();\n\t\t\t} catch (e: unknown) {\n\t\t\t\tconsole.error('Failed to kill compilation process:', e);\n\t\t\t}\n\t\t}\n\n\t\tthis.activeProcesses.clear();\n\t}\n}\n\n// https://stackoverflow.com/a/7228322\n// min and max included\nfunction randomIntFromInterval(min: number, max: number) {\n\treturn Math.floor(Math.random() * (max - min + 1) + min);\n}\n\n// https://github.com/elgs/splitargs\nfunction splitargs(input: string, sep?: RegExp, keepQuotes?: boolean) {\n\tconst separator = sep || /\\s/g;\n\tlet singleQuoteOpen = false;\n\tlet doubleQuoteOpen = false;\n\tlet tokenBuffer = [];\n\tconst ret = [];\n\n\tconst arr = input.split('');\n\tfor (let i = 0; i < arr.length; ++i) {\n\t\tconst element = arr[i];\n\t\tconst matches = element.match(separator);\n\t\tif (element === \"'\" && !doubleQuoteOpen) {\n\t\t\tif (keepQuotes === true) {\n\t\t\t\ttokenBuffer.push(element);\n\t\t\t}\n\t\t\tsingleQuoteOpen = !singleQuoteOpen;\n\t\t\tcontinue;\n\t\t} else if (element === '\"' && !singleQuoteOpen) {\n\t\t\tif (keepQuotes === true) {\n\t\t\t\ttokenBuffer.push(element);\n\t\t\t}\n\t\t\tdoubleQuoteOpen = !doubleQuoteOpen;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!singleQuoteOpen && !doubleQuoteOpen && matches) {\n\t\t\tif (tokenBuffer.length > 0) {\n\t\t\t\tret.push(tokenBuffer.join(''));\n\t\t\t\ttokenBuffer = [];\n\t\t\t} else if (sep) {\n\t\t\t\tret.push(element);\n\t\t\t}\n\t\t} else {\n\t\t\ttokenBuffer.push(element);\n\t\t}\n\t}\n\tif (tokenBuffer.length > 0) {\n\t\tret.push(tokenBuffer.join(''));\n\t} else if (sep) {\n\t\tret.push('');\n\t}\n\treturn ret;\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/editorWorkspaceUtils.ts",
    "content": "import * as fs from 'fs';\nimport * as path from 'path';\nimport * as child_process from 'child_process';\nimport * as vscode from 'vscode';\nimport config from '../config';\n\nexport default class EditorWorkspaceUtils {\n\tprivate workspacePath: string;\n\n\tpublic constructor() {\n\t\tconst firstWorkspaceFolder = vscode.workspace.workspaceFolders?.[0];\n\t\tif (!firstWorkspaceFolder) {\n\t\t\tvscode.commands.executeCommand('workbench.action.files.openFolder');\n\t\t\tthrow new Error('No workspace folder');\n\t\t}\n\n\t\tthis.workspacePath = firstWorkspaceFolder.uri.fsPath;\n\t}\n\n\tpublic getFilePath(fileName: string) {\n\t\treturn path.join(this.workspacePath, fileName);\n\t}\n\n\tpublic getWorkspaceFolder() {\n\t\treturn this.workspacePath;\n\t}\n\n\tpublic getModSourcePath() {\n\t\treturn this.getFilePath('mod.wh.cpp');\n\t}\n\n\tpublic getDraftsPath() {\n\t\treturn path.join(this.workspacePath, 'Drafts');\n\t}\n\n\tprivate initializeEditorSettings() {\n\t\t// Flags for clangd.\n\t\tconst compileFlags = [\n\t\t\t'-x',\n\t\t\t'c++',\n\t\t\t'-std=c++23',\n\t\t\t'-target',\n\t\t\t'x86_64-w64-mingw32',\n\t\t\t'-DUNICODE',\n\t\t\t'-D_UNICODE',\n\t\t\t'-DWINVER=0x0A00',\n\t\t\t'-D_WIN32_WINNT=0x0A00',\n\t\t\t'-D_WIN32_IE=0x0A00',\n\t\t\t'-DNTDDI_VERSION=0x0A000008',\n\t\t\t'-D__USE_MINGW_ANSI_STDIO=0',\n\t\t\t'-DWH_MOD',\n\t\t\t'-DWH_EDITING',\n\t\t\t'-include',\n\t\t\t'windhawk_api.h',\n\t\t\t'-Wall',\n\t\t\t'-Wextra',\n\t\t\t'-Wno-unused-parameter',\n\t\t\t'-Wno-missing-field-initializers',\n\t\t\t'-Wno-cast-function-type-mismatch',\n\t\t];\n\n\t\tfs.writeFileSync(this.getFilePath('compile_flags.txt'), compileFlags.join('\\n') + '\\n');\n\n\t\tconst clangFormatConfig = [\n\t\t\t'# To override, create a .clang-format.windhawk file with the desired settings.',\n\t\t\t'BasedOnStyle: Chromium',\n\t\t\t'IndentWidth: 4',\n\t\t\t'CommentPragmas: ^[ \\\\t]+@[a-zA-Z]+',\n\t\t];\n\n\t\tif (fs.existsSync(this.getFilePath('.clang-format.windhawk'))) {\n\t\t\tfs.copyFileSync(this.getFilePath('.clang-format.windhawk'), this.getFilePath('.clang-format'));\n\t\t} else {\n\t\t\tfs.writeFileSync(this.getFilePath('.clang-format'), clangFormatConfig.join('\\n') + '\\n');\n\t\t}\n\n\t\tif (!fs.existsSync(this.getFilePath('.git'))) {\n\t\t\tchild_process.spawnSync('git', ['init'], { cwd: this.workspacePath, stdio: 'ignore' });\n\t\t}\n\n\t\tif (fs.existsSync(this.getFilePath('.git'))) {\n\t\t\tchild_process.spawnSync('git', ['add', 'mod.wh.cpp'], { cwd: this.workspacePath, stdio: 'ignore' });\n\t\t}\n\t}\n\n\tpublic initializeFromModSource(modSource: string, modSourceFromDrafts?: string | null) {\n\t\tfs.writeFileSync(this.getFilePath('mod.wh.cpp'), modSource);\n\n\t\t// Remove windhawk_api.h from older versions, it now resides in the\n\t\t// compiler include folder.\n\t\ttry {\n\t\t\tfs.unlinkSync(this.getFilePath('windhawk_api.h'));\n\t\t} catch (e) {\n\t\t\t// Ignore if file doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tthis.initializeEditorSettings();\n\n\t\tif (modSourceFromDrafts) {\n\t\t\t// Write the new content after initializing, so that git won't stage the draft changes.\n\t\t\tfs.writeFileSync(this.getFilePath('mod.wh.cpp'), modSourceFromDrafts);\n\t\t}\n\t}\n\n\tpublic saveModToDrafts(modId: string) {\n\t\tconst draftsDir = this.getDraftsPath();\n\t\tfs.mkdirSync(draftsDir, { recursive: true });\n\t\tfs.copyFileSync(this.getFilePath('mod.wh.cpp'), path.join(draftsDir, modId + '.wh.cpp'));\n\t}\n\n\tpublic loadModFromDrafts(modId: string) {\n\t\tconst draftsPath = this.getDraftsPath();\n\t\tconst modSourcePath = path.join(draftsPath, modId + '.wh.cpp');\n\t\tif (fs.existsSync(modSourcePath)) {\n\t\t\treturn fs.readFileSync(modSourcePath, 'utf8');\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic deleteModFromDrafts(modId: string) {\n\t\tconst draftsPath = this.getDraftsPath();\n\t\tconst modSourcePath = path.join(draftsPath, modId + '.wh.cpp');\n\t\ttry {\n\t\t\tfs.unlinkSync(modSourcePath);\n\t\t} catch (e) {\n\t\t\t// Ignore if file doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async toggleMinimalLayout(minimal: boolean) {\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tconst thenableArray: Thenable<void>[] = [];\n\n\t\tif (minimal) {\n\t\t\tthenableArray.push(vscode.commands.executeCommand('workbench.action.closeSidebar'));\n\t\t\tthenableArray.push(vscode.commands.executeCommand('workbench.action.closePanel'));\n\t\t\tthenableArray.push(vscodeConfig.update('workbench.activityBar.visible', false));\n\t\t}\n\n\t\tthenableArray.push(vscodeConfig.update('workbench.editor.showTabs', !minimal));\n\t\tthenableArray.push(vscodeConfig.update('workbench.statusBar.visible', !minimal));\n\n\t\treturn Promise.all(thenableArray);\n\t}\n\n\tpublic async enterEditorMode(modId: string, modWasModified = false) {\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tawait Promise.all([\n\t\t\tvscodeConfig.update('windhawk.editedModId', modId),\n\t\t\tvscodeConfig.update('windhawk.editedModWasModified', modWasModified),\n\t\t\tvscodeConfig.update('git.enabled', true)\n\t\t]);\n\n\t\tawait vscode.commands.executeCommand('vscode.open', vscode.Uri.file(this.getFilePath('mod.wh.cpp')), {\n\t\t\tpreview: false\n\t\t});\n\t\tawait vscode.commands.executeCommand('workbench.action.closeEditorsInOtherGroups');\n\t\tawait vscode.commands.executeCommand('workbench.action.closeOtherEditors');\n\t\tawait vscode.commands.executeCommand('windhawk.sidebar.focus', {\n\t\t\tpreserveFocus: true\n\t\t});\n\n\t\tif (!config.debug.disableMinimalMode) {\n\t\t\tawait this.toggleMinimalLayout(false);\n\t\t}\n\t}\n\n\tpublic async exitEditorMode() {\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tawait Promise.all([\n\t\t\tvscodeConfig.update('windhawk.editedModId', undefined),\n\t\t\tvscodeConfig.update('windhawk.editedModWasModified', undefined),\n\t\t\tvscodeConfig.update('git.enabled', undefined),\n\t\t]);\n\n\t\tawait vscode.commands.executeCommand('windhawk.start');\n\t\tawait vscode.commands.executeCommand('workbench.action.closeEditorsInOtherGroups');\n\t\tawait vscode.commands.executeCommand('workbench.action.closeOtherEditors');\n\n\t\tif (!config.debug.disableMinimalMode) {\n\t\t\tawait this.toggleMinimalLayout(true);\n\t\t}\n\t}\n\n\tpublic async restoreEditorMode() {\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tconst modIdConfig = vscodeConfig.get('windhawk.editedModId');\n\t\tconst modId = typeof modIdConfig === 'string' ? modIdConfig : null;\n\n\t\tif (modId) {\n\t\t\tconst modWasModified = !!vscodeConfig.get('windhawk.editedModWasModified');\n\t\t\tawait this.enterEditorMode(modId, modWasModified);\n\t\t\treturn {\n\t\t\t\tmodId,\n\t\t\t\tmodWasModified\n\t\t\t};\n\t\t} else {\n\t\t\tawait this.exitEditorMode();\n\t\t\treturn {\n\t\t\t\tmodId: null\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic async setEditorModeModId(modId: string) {\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tawait vscodeConfig.update('windhawk.editedModId', modId);\n\t}\n\n\tpublic async markEditorModeModAsModified(modified: boolean) {\n\t\tif (!modified && fs.existsSync(this.getFilePath('.git'))) {\n\t\t\tchild_process.spawn('git', ['add', 'mod.wh.cpp'], { cwd: this.workspacePath, stdio: 'ignore' });\n\t\t}\n\n\t\tconst vscodeConfig = vscode.workspace.getConfiguration();\n\t\tawait vscodeConfig.update('windhawk.editedModWasModified', modified);\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/modConfigUtils.ts",
    "content": "import * as fs from 'fs';\nimport * as reg from 'native-reg';\nimport * as path from 'path';\nimport * as ini from '../ini';\n\ntype ModSettings = Record<string, string | number>;\n\ntype ModSettingsConfig = {\n\tinitialSettings: ModSettings,\n\tpreviousInitialSettings?: ModSettings\n};\n\n// Field descriptor for automated parsing/serialization\ntype FieldType = 'string' | 'boolean' | 'string-array';\n\ninterface FieldDescriptor {\n\tname: string;\n\tstorageName: string;\n\ttype: FieldType;\n}\n\nconst CONFIG_FIELDS = [\n\t{ name: 'libraryFileName', storageName: 'LibraryFileName', type: 'string' },\n\t{ name: 'disabled', storageName: 'Disabled', type: 'boolean' },\n\t{ name: 'loggingEnabled', storageName: 'LoggingEnabled', type: 'boolean' },\n\t{ name: 'debugLoggingEnabled', storageName: 'DebugLoggingEnabled', type: 'boolean' },\n\t{ name: 'include', storageName: 'Include', type: 'string-array' },\n\t{ name: 'exclude', storageName: 'Exclude', type: 'string-array' },\n\t{ name: 'includeCustom', storageName: 'IncludeCustom', type: 'string-array' },\n\t{ name: 'excludeCustom', storageName: 'ExcludeCustom', type: 'string-array' },\n\t{ name: 'includeExcludeCustomOnly', storageName: 'IncludeExcludeCustomOnly', type: 'boolean' },\n\t{ name: 'patternsMatchCriticalSystemProcesses', storageName: 'PatternsMatchCriticalSystemProcesses', type: 'boolean' },\n\t{ name: 'architecture', storageName: 'Architecture', type: 'string-array' },\n\t{ name: 'version', storageName: 'Version', type: 'string' }\n] as const satisfies readonly FieldDescriptor[];\n\n// Map field types to TypeScript types\ntype FieldTypeToTSType<T extends FieldType> =\n\tT extends 'string' ? string :\n\tT extends 'boolean' ? boolean :\n\tT extends 'string-array' ? string[] :\n\tnever;\n\n// Derive ModConfig type from CONFIG_FIELDS\ntype ModConfig = {\n\t[K in typeof CONFIG_FIELDS[number] as K['name']]: FieldTypeToTSType<K['type']>\n};\n\n// Extract valid storage field names from CONFIG_FIELDS\ntype StorageFieldName = typeof CONFIG_FIELDS[number]['storageName'];\n\n// Storage abstraction layer\ninterface ModStorageBackend {\n\t// Config operations\n\treadAllConfigFields(modId: string): Partial<Record<StorageFieldName, string | number>> | null;\n\twriteAllConfigFields(modId: string, fields: Partial<Record<StorageFieldName, string | number>>): void;\n\twriteConfigField(modId: string, field: StorageFieldName, value: string | number): void;\n\tconfigExists(modId: string): boolean;\n\n\t// Settings operations\n\treadAllSettings(modId: string): Record<string, string | number>;\n\twriteAllSettings(modId: string, settings: Record<string, string | number>): void;\n\n\t// Lifecycle operations\n\tdeleteConfig(modId: string): void;\n\trenameConfig(fromId: string, toId: string): void;\n\n\t// Bulk operations\n\tgetConfigOfInstalled(): Record<string, ModConfig>;\n}\n\n// Unified codec for ModConfig parsing/serialization\nclass ModConfigCodec {\n\tstatic parse(backend: ModStorageBackend, modId: string): ModConfig | null {\n\t\t// Batch read all fields at once for performance\n\t\tconst rawFields = backend.readAllConfigFields(modId);\n\t\tif (!rawFields) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst libraryFileName = rawFields['LibraryFileName'];\n\t\tif (!libraryFileName || typeof libraryFileName !== 'string') {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Build config object field by field with proper typing\n\t\tconst config: Partial<ModConfig> = {};\n\n\t\tfor (const field of CONFIG_FIELDS) {\n\t\t\tconst rawValue = rawFields[field.storageName];\n\n\t\t\tswitch (field.type) {\n\t\t\t\tcase 'string':\n\t\t\t\t\tconfig[field.name] = (rawValue ?? '') as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tconfig[field.name] = !!rawValue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string-array':\n\t\t\t\t\tconfig[field.name] = splitPipeDelimited((rawValue ?? '') as string);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// All fields should be populated at this point\n\t\treturn config as ModConfig;\n\t}\n\n\tstatic serialize(backend: ModStorageBackend, modId: string, config: Partial<ModConfig>): void {\n\t\tconst fieldsToWrite: Partial<Record<StorageFieldName, string | number>> = {};\n\n\t\tfor (const field of CONFIG_FIELDS) {\n\t\t\tconst value = config[field.name];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet storageValue: string | number;\n\n\t\t\tswitch (field.type) {\n\t\t\t\tcase 'string':\n\t\t\t\t\tstorageValue = value as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tstorageValue = (value as boolean) ? 1 : 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string-array':\n\t\t\t\t\tstorageValue = (value as string[]).join('|');\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfieldsToWrite[field.storageName] = storageValue;\n\t\t}\n\n\t\t// Batch write all fields at once for performance\n\t\tbackend.writeAllConfigFields(modId, fieldsToWrite);\n\t}\n}\n\nfunction getSettingsChangeTime() {\n\t// Unix timestamp in seconds, limited to a positive signed 32-bit integer.\n\treturn (Date.now() / 1000) & 0x7fffffff;\n}\n\nfunction splitPipeDelimited(value: string): string[] {\n\treturn !value ? [] : value.split('|');\n}\n\nfunction mergeModSettings(existingSettings: ModSettings, newSettings: ModSettings) {\n\tconst getNamePrefix = (name: string) => {\n\t\t// Treat each option individually, except for arrays. For arrays, only\n\t\t// consider the prefix before the first [index] - if any settings\n\t\t// already exist with that prefix, don't add any other settings with the\n\t\t// same prefix.\n\t\treturn name.replace(/\\[\\d+\\].*$/, '[0]');\n\t};\n\n\tconst existingNamePrefixes: Record<string, boolean> = {};\n\tfor (const name of Object.keys(existingSettings)) {\n\t\texistingNamePrefixes[getNamePrefix(name)] = true;\n\t}\n\n\tconst mergedSettings: ModSettings = { ...existingSettings };\n\tlet existingSettingsChanged = false;\n\n\tfor (const [name, value] of Object.entries(newSettings)) {\n\t\tif (!existingNamePrefixes[getNamePrefix(name)]) {\n\t\t\tmergedSettings[name] = value;\n\t\t\texistingSettingsChanged = true;\n\t\t}\n\t}\n\n\treturn { mergedSettings, existingSettingsChanged };\n}\n\nfunction getModStoragePath(engineModsWritablePath: string, modId: string) {\n\treturn path.join(engineModsWritablePath, 'mod-storage', modId);\n}\n\nfunction deleteModStoragePath(engineModsWritablePath: string, modId: string): void {\n\tconst modStoragePath = getModStoragePath(engineModsWritablePath, modId);\n\ttry {\n\t\tfs.rmSync(modStoragePath, { recursive: true, force: true });\n\t} catch (e) {\n\t\t// Ignore errors.\n\t}\n}\n\n// INI-based storage backend (portable mode)\nclass IniStorageBackend implements ModStorageBackend {\n\tprivate engineModsPath: string;\n\tprivate engineModsWritablePath: string;\n\n\tconstructor(appDataPath: string) {\n\t\tthis.engineModsPath = path.join(appDataPath, 'Engine', 'Mods');\n\t\tthis.engineModsWritablePath = path.join(appDataPath, 'Engine', 'ModsWritable');\n\t}\n\n\tprivate getModIniPath(modId: string) {\n\t\treturn path.join(this.engineModsPath, modId + '.ini');\n\t}\n\n\tprivate getModWritableIniPath(modId: string) {\n\t\treturn path.join(this.engineModsWritablePath, modId + '.ini');\n\t}\n\n\treadAllConfigFields(modId: string): Partial<Record<StorageFieldName, string | number>> | null {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\tconst modConfig = ini.fromFileOrDefault(modIniPath);\n\n\t\tif (!modConfig.Mod) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst result: Partial<Record<StorageFieldName, string | number>> = {};\n\t\tfor (const field of CONFIG_FIELDS) {\n\t\t\tconst value = modConfig.Mod[field.storageName];\n\t\t\tif (value !== undefined) {\n\t\t\t\t// Convert string representations to appropriate types\n\t\t\t\tif (field.type === 'boolean') {\n\t\t\t\t\tresult[field.storageName] = parseInt(value, 10);\n\t\t\t\t} else {\n\t\t\t\t\tresult[field.storageName] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\twriteAllConfigFields(modId: string, fields: Partial<Record<StorageFieldName, string | number>>): void {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\tconst modConfig = ini.fromFileOrDefault(modIniPath);\n\n\t\tmodConfig.Mod = modConfig.Mod || {};\n\t\tfor (const [field, value] of Object.entries(fields)) {\n\t\t\tmodConfig.Mod[field] = value.toString();\n\t\t}\n\n\t\tfs.mkdirSync(path.dirname(modIniPath), { recursive: true });\n\t\tini.toFile(modIniPath, modConfig);\n\t}\n\n\twriteConfigField(modId: string, field: StorageFieldName, value: string | number): void {\n\t\tthis.writeAllConfigFields(modId, { [field]: value });\n\t}\n\n\tconfigExists(modId: string): boolean {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\tconst modConfig = ini.fromFileOrDefault(modIniPath);\n\t\treturn !!modConfig.Mod?.LibraryFileName;\n\t}\n\n\treadAllSettings(modId: string): Record<string, string | number> {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\tconst modConfig = ini.fromFileOrDefault(modIniPath);\n\t\treturn modConfig.Settings || {};\n\t}\n\n\twriteAllSettings(modId: string, settings: Record<string, string | number>): void {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\tconst modConfig = ini.fromFileOrDefault(modIniPath);\n\n\t\tconst settingsSection: Record<string, string> = {};\n\t\tfor (const [k, v] of Object.entries(settings)) {\n\t\t\tsettingsSection[k] = v.toString();\n\t\t}\n\n\t\tmodConfig.Settings = settingsSection;\n\t\tmodConfig.Mod = modConfig.Mod || {};\n\t\tmodConfig.Mod.SettingsChangeTime = getSettingsChangeTime().toString();\n\n\t\tfs.mkdirSync(path.dirname(modIniPath), { recursive: true });\n\t\tini.toFile(modIniPath, modConfig);\n\t}\n\n\tdeleteConfig(modId: string): void {\n\t\tconst modIniPath = this.getModIniPath(modId);\n\t\ttry {\n\t\t\tfs.unlinkSync(modIniPath);\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tconst modWritableIniPath = this.getModWritableIniPath(modId);\n\t\ttry {\n\t\t\tfs.unlinkSync(modWritableIniPath);\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tdeleteModStoragePath(this.engineModsWritablePath, modId);\n\t}\n\n\trenameConfig(fromId: string, toId: string): void {\n\t\tconst modIniPathFrom = this.getModIniPath(fromId);\n\t\tconst modIniPathTo = this.getModIniPath(toId);\n\t\ttry {\n\t\t\tfs.renameSync(modIniPathFrom, modIniPathTo);\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tconst modWritableIniPathFrom = this.getModWritableIniPath(fromId);\n\t\tconst modWritableIniPathTo = this.getModWritableIniPath(toId);\n\t\ttry {\n\t\t\tfs.renameSync(modWritableIniPathFrom, modWritableIniPathTo);\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n\n\tgetConfigOfInstalled(): Record<string, ModConfig> {\n\t\tconst mods: Record<string, ModConfig> = {};\n\n\t\tlet engineModsDir: fs.Dir;\n\t\ttry {\n\t\t\tengineModsDir = fs.opendirSync(this.engineModsPath);\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn mods;\n\t\t}\n\n\t\ttry {\n\t\t\tlet engineModsDirEntry: fs.Dirent | null;\n\t\t\twhile ((engineModsDirEntry = engineModsDir.readSync()) !== null) {\n\t\t\t\tif (engineModsDirEntry.isFile() && engineModsDirEntry.name.endsWith('.ini')) {\n\t\t\t\t\tconst modId = engineModsDirEntry.name.slice(0, -'.ini'.length);\n\t\t\t\t\tconst config = ModConfigCodec.parse(this, modId);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tmods[modId] = config;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tengineModsDir.closeSync();\n\t\t}\n\n\t\treturn mods;\n\t}\n}\n\n// Registry-based storage backend (non-portable mode)\nclass RegistryStorageBackend implements ModStorageBackend {\n\tprivate regKey: reg.HKEY;\n\tprivate regSubKey: string;\n\tprivate regSubKeyModWritable: string;\n\tprivate engineModsWritablePath: string;\n\n\tconstructor(regKey: reg.HKEY, regSubKey: string, appDataPath: string) {\n\t\tthis.regKey = regKey;\n\t\tthis.regSubKey = regSubKey + '\\\\Engine\\\\Mods';\n\t\tthis.regSubKeyModWritable = regSubKey + '\\\\Engine\\\\ModsWritable';\n\t\tthis.engineModsWritablePath = path.join(appDataPath, 'Engine', 'ModsWritable');\n\t}\n\n\treadAllConfigFields(modId: string): Partial<Record<StorageFieldName, string | number>> | null {\n\t\tconst key = reg.openKey(this.regKey, this.regSubKey + '\\\\' + modId,\n\t\t\treg.Access.QUERY_VALUE | reg.Access.WOW64_64KEY);\n\t\tif (!key) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result: Partial<Record<StorageFieldName, string | number>> = {};\n\t\t\tfor (const field of CONFIG_FIELDS) {\n\t\t\t\tconst isDword = field.type === 'boolean';\n\t\t\t\tlet value: string | number | null;\n\n\t\t\t\tif (isDword) {\n\t\t\t\t\tvalue = reg.getValue(key, null, field.storageName, reg.GetValueFlags.RT_REG_DWORD) as number | null;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = reg.getValue(key, null, field.storageName, reg.GetValueFlags.RT_REG_SZ) as string | null;\n\t\t\t\t}\n\n\t\t\t\tif (value !== null) {\n\t\t\t\t\tresult[field.storageName] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n\n\twriteAllConfigFields(modId: string, fields: Partial<Record<StorageFieldName, string | number>>): void {\n\t\tconst key = reg.createKey(this.regKey, this.regSubKey + '\\\\' + modId,\n\t\t\treg.Access.SET_VALUE | reg.Access.WOW64_64KEY);\n\t\ttry {\n\t\t\tfor (const [field, value] of Object.entries(fields)) {\n\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\treg.setValueDWORD(key, field, value);\n\t\t\t\t} else {\n\t\t\t\t\treg.setValueSZ(key, field, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n\n\twriteConfigField(modId: string, field: StorageFieldName, value: string | number): void {\n\t\tthis.writeAllConfigFields(modId, { [field]: value });\n\t}\n\n\tconfigExists(modId: string): boolean {\n\t\tconst key = reg.openKey(this.regKey, this.regSubKey + '\\\\' + modId,\n\t\t\treg.Access.QUERY_VALUE | reg.Access.WOW64_64KEY);\n\t\tif (!key) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\treturn !!reg.getValue(key, null, 'LibraryFileName', reg.GetValueFlags.RT_REG_SZ);\n\t\t} finally {\n\t\t\treg.closeKey(key);\n\t\t}\n\t}\n\n\treadAllSettings(modId: string): Record<string, string | number> {\n\t\tconst settings: Record<string, string | number> = {};\n\n\t\tconst key = reg.openKey(this.regKey, this.regSubKey + '\\\\' + modId + '\\\\Settings',\n\t\t\treg.Access.QUERY_VALUE | reg.Access.WOW64_64KEY);\n\t\tif (key) {\n\t\t\ttry {\n\t\t\t\tfor (const valueName of reg.enumValueNames(key)) {\n\t\t\t\t\tconst value = reg.getValue(key, null, valueName, reg.GetValueFlags.RT_REG_DWORD | reg.GetValueFlags.RT_REG_SZ);\n\t\t\t\t\tif (value !== null) {\n\t\t\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\t\t\t// Add `| 0` after every math operation to get a\n\t\t\t\t\t\t\t// 32-bit signed integer result.\n\t\t\t\t\t\t\tconst valueSigned = value | 0;\n\t\t\t\t\t\t\tsettings[valueName] = valueSigned;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsettings[valueName] = value as string;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\treg.closeKey(key);\n\t\t\t}\n\t\t}\n\n\t\treturn settings;\n\t}\n\n\twriteAllSettings(modId: string, settings: Record<string, string | number>): void {\n\t\tconst settingsKey = reg.createKey(this.regKey, this.regSubKey + '\\\\' + modId + '\\\\Settings',\n\t\t\treg.Access.QUERY_VALUE | reg.Access.SET_VALUE | reg.Access.DELETE | reg.Access.ENUMERATE_SUB_KEYS | reg.Access.WOW64_64KEY);\n\t\ttry {\n\t\t\treg.deleteTree(settingsKey, null);\n\n\t\t\tfor (const [name, value] of Object.entries(settings)) {\n\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\t// Add [...] `>>> 0` for a 32-bit unsigned integer result.\n\t\t\t\t\tconst valueUnsigned = value >>> 0;\n\t\t\t\t\treg.setValueDWORD(settingsKey, name, valueUnsigned);\n\t\t\t\t} else {\n\t\t\t\t\treg.setValueSZ(settingsKey, name, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treg.closeKey(settingsKey);\n\t\t}\n\n\t\tconst modKey = reg.createKey(this.regKey, this.regSubKey + '\\\\' + modId,\n\t\t\treg.Access.SET_VALUE | reg.Access.WOW64_64KEY);\n\t\ttry {\n\t\t\treg.setValueDWORD(modKey, 'SettingsChangeTime', getSettingsChangeTime());\n\t\t} finally {\n\t\t\treg.closeKey(modKey);\n\t\t}\n\t}\n\n\tdeleteConfig(modId: string): void {\n\t\tfor (const subKey of [this.regSubKey, this.regSubKeyModWritable]) {\n\t\t\tconst key = reg.openKey(this.regKey, subKey + '\\\\' + modId,\n\t\t\t\treg.Access.QUERY_VALUE | reg.Access.SET_VALUE | reg.Access.DELETE | reg.Access.ENUMERATE_SUB_KEYS | reg.Access.WOW64_64KEY);\n\t\t\tif (key) {\n\t\t\t\ttry {\n\t\t\t\t\tif (reg.deleteTree(key, null)) {\n\t\t\t\t\t\treg.deleteKey(key, '');\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\treg.closeKey(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdeleteModStoragePath(this.engineModsWritablePath, modId);\n\t}\n\n\trenameConfig(fromId: string, toId: string): void {\n\t\tfor (const subKey of [this.regSubKey, this.regSubKeyModWritable]) {\n\t\t\tconst key = reg.openKey(this.regKey, subKey + '\\\\' + fromId,\n\t\t\t\treg.Access.WRITE | reg.Access.WOW64_64KEY);\n\t\t\tif (key) {\n\t\t\t\ttry {\n\t\t\t\t\treg.renameKey(key, null, toId);\n\t\t\t\t} finally {\n\t\t\t\t\treg.closeKey(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetConfigOfInstalled(): Record<string, ModConfig> {\n\t\tconst mods: Record<string, ModConfig> = {};\n\n\t\tconst key = reg.openKey(this.regKey, this.regSubKey,\n\t\t\treg.Access.QUERY_VALUE | reg.Access.ENUMERATE_SUB_KEYS | reg.Access.WOW64_64KEY);\n\t\tif (key) {\n\t\t\ttry {\n\t\t\t\tfor (const modId of reg.enumKeyNames(key)) {\n\t\t\t\t\tconst config = ModConfigCodec.parse(this, modId);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tmods[modId] = config;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\treg.closeKey(key);\n\t\t\t}\n\t\t}\n\n\t\treturn mods;\n\t}\n}\n\nexport interface ModConfigUtils {\n\tgetConfigOfInstalled(): Record<string, ModConfig>;\n\tdoesConfigExist(modId: string): boolean;\n\tgetModConfig(modId: string): ModConfig | null;\n\tsetModConfig(modId: string, config: Partial<ModConfig>, settingsConfig?: ModSettingsConfig): void;\n\tgetModSettings(modId: string): ModSettings;\n\tsetModSettings(modId: string, settings: ModSettings): void;\n\tenableMod(modId: string, enable: boolean): void;\n\tenableLogging(modId: string, enable: boolean): void;\n\tdeleteMod(modId: string): void;\n\tchangeModId(modIdFrom: string, modIdTo: string): void;\n}\n\n// Base implementation using storage backend pattern\nclass ModConfigUtilsBase implements ModConfigUtils {\n\tprotected backend: ModStorageBackend;\n\n\tprotected constructor(backend: ModStorageBackend) {\n\t\tthis.backend = backend;\n\t}\n\n\tpublic getConfigOfInstalled() {\n\t\treturn this.backend.getConfigOfInstalled();\n\t}\n\n\tpublic doesConfigExist(modId: string) {\n\t\treturn this.backend.configExists(modId);\n\t}\n\n\tpublic getModConfig(modId: string) {\n\t\treturn ModConfigCodec.parse(this.backend, modId);\n\t}\n\n\tpublic setModConfig(modId: string, config: Partial<ModConfig>, settingsConfig?: ModSettingsConfig) {\n\t\tconst configExisted = this.backend.configExists(modId);\n\n\t\tModConfigCodec.serialize(this.backend, modId, config);\n\n\t\tif (settingsConfig) {\n\t\t\tif (!settingsConfig.previousInitialSettings && !configExisted) {\n\t\t\t\tthis.backend.writeAllSettings(modId, settingsConfig.initialSettings);\n\t\t\t} else {\n\t\t\t\tconst { mergedSettings, existingSettingsChanged } =\n\t\t\t\t\tmergeModSettings({\n\t\t\t\t\t\t...(settingsConfig.previousInitialSettings || {}),\n\t\t\t\t\t\t...this.backend.readAllSettings(modId)\n\t\t\t\t\t}, settingsConfig.initialSettings);\n\t\t\t\tif (existingSettingsChanged) {\n\t\t\t\t\tthis.backend.writeAllSettings(modId, mergedSettings);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getModSettings(modId: string) {\n\t\treturn this.backend.readAllSettings(modId);\n\t}\n\n\tpublic setModSettings(modId: string, settings: ModSettings) {\n\t\tthis.backend.writeAllSettings(modId, settings);\n\t}\n\n\tpublic enableMod(modId: string, enable: boolean) {\n\t\tthis.backend.writeConfigField(modId, 'Disabled', enable ? 0 : 1);\n\t}\n\n\tpublic enableLogging(modId: string, enable: boolean) {\n\t\tthis.backend.writeConfigField(modId, 'LoggingEnabled', enable ? 1 : 0);\n\t}\n\n\tpublic deleteMod(modId: string) {\n\t\tthis.backend.deleteConfig(modId);\n\t}\n\n\tpublic changeModId(modIdFrom: string, modIdTo: string) {\n\t\tthis.backend.renameConfig(modIdFrom, modIdTo);\n\t}\n}\n\nexport class ModConfigUtilsPortable extends ModConfigUtilsBase {\n\tpublic constructor(appDataPath: string) {\n\t\tsuper(new IniStorageBackend(appDataPath));\n\t}\n}\n\nexport class ModConfigUtilsNonPortable extends ModConfigUtilsBase {\n\tpublic constructor(regKey: reg.HKEY, regSubKey: string, appDataPath: string) {\n\t\tsuper(new RegistryStorageBackend(regKey, regSubKey, appDataPath));\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/modFilesUtils.ts",
    "content": "import * as fs from 'fs';\nimport * as https from 'https';\nimport fetch from 'node-fetch';\nimport * as path from 'path';\nimport * as semver from 'semver';\n\ntype ArchitectureSubfolder = '32' | '64' | 'arm64';\n\nexport default class ModFilesUtils {\n\tprivate engineModsPath: string;\n\tprivate arm64Enabled: boolean;\n\tprivate currentWindhawkVersion: semver.SemVer | null;\n\n\tpublic constructor(appDataPath: string, arm64Enabled: boolean, currentWindhawkVersion: semver.SemVer | null) {\n\t\tthis.engineModsPath = path.join(appDataPath, 'Engine', 'Mods');\n\t\tthis.arm64Enabled = arm64Enabled;\n\t\tthis.currentWindhawkVersion = currentWindhawkVersion;\n\t}\n\n\t/**\n\t * Converts metadata architecture strings to DLL subfolders.\n\t * Handles special cases like x86-64 expanding to both 64 and arm64 when ARM64 is enabled.\n\t */\n\tprivate subfoldersFromArchitectures(architectures: string[]): Set<ArchitectureSubfolder> {\n\t\tconst subfolders = new Set<ArchitectureSubfolder>();\n\n\t\t// Default to x86 and x86-64 if no architectures specified\n\t\tconst archsToProcess = (architectures.length > 0) ? architectures : ['x86', 'x86-64'];\n\n\t\tfor (const arch of archsToProcess) {\n\t\t\tswitch (arch) {\n\t\t\t\tcase 'x86':\n\t\t\t\t\tsubfolders.add('32');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'x86-64':\n\t\t\t\t\t// x86-64 means \"64-bit\" for compatibility, which could be\n\t\t\t\t\t// either x64 or ARM64\n\t\t\t\t\tif (this.arm64Enabled) {\n\t\t\t\t\t\tsubfolders.add('64');\n\t\t\t\t\t\tsubfolders.add('arm64');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubfolders.add('64');\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'amd64':\n\t\t\t\t\t// Explicitly x64, not ARM64\n\t\t\t\t\tsubfolders.add('64');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'arm64':\n\t\t\t\t\tif (this.arm64Enabled) {\n\t\t\t\t\t\tsubfolders.add('arm64');\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unsupported architecture: ${arch}`);\n\t\t\t}\n\t\t}\n\n\t\treturn subfolders;\n\t}\n\n\tprivate deleteOldModFilesInFolder(modId: string, subfolder: ArchitectureSubfolder, currentDllName?: string) {\n\t\tconst compiledModsPath = path.join(this.engineModsPath, subfolder);\n\n\t\tlet compiledModsDir: fs.Dir;\n\t\ttry {\n\t\t\tcompiledModsDir = fs.opendirSync(compiledModsPath);\n\t\t} catch (e: any) {\n\t\t\t// Ignore if directory doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tlet compiledModsDirEntry: fs.Dirent | null;\n\t\t\twhile ((compiledModsDirEntry = compiledModsDir.readSync()) !== null) {\n\t\t\t\tif (!compiledModsDirEntry.isFile()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filename = compiledModsDirEntry.name;\n\t\t\t\tif (currentDllName && filename === currentDllName) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!filename.startsWith(modId + '_') || !filename.endsWith('.dll')) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filenamePart = filename.slice((modId + '_').length, -'.dll'.length);\n\t\t\t\tif (!filenamePart.match(/(^|_)[0-9]+$/)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst compiledModPath = path.join(compiledModsPath, filename);\n\n\t\t\t\ttry {\n\t\t\t\t\tfs.unlinkSync(compiledModPath);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Ignore errors (file may be in use).\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tcompiledModsDir.closeSync();\n\t\t}\n\t}\n\n\tpublic deleteOldModFiles(modId: string, architectures: string[], currentDllName?: string) {\n\t\tconst subfolders = this.subfoldersFromArchitectures(architectures);\n\n\t\tfor (const subfolder of subfolders) {\n\t\t\tthis.deleteOldModFilesInFolder(modId, subfolder, currentDllName);\n\t\t}\n\t}\n\n\tpublic async downloadPrecompiledMod(\n\t\tmodId: string,\n\t\tversion: string,\n\t\tarchitectures: string[],\n\t\tmodsUrl: string\n\t): Promise<{ targetDllName: string }> {\n\t\t// Generate a unique DLL name\n\t\tconst targetDllName = modId + '_' + version + '_' + randomIntFromInterval(100000, 999999) + '.dll';\n\n\t\tconst subfolders = this.subfoldersFromArchitectures(architectures);\n\t\tif (subfolders.size === 0) {\n\t\t\tthrow new Error('The current architecture is not supported');\n\t\t}\n\n\t\t// Collect URLs and target paths\n\t\tconst downloads: Array<{ subfolder: ArchitectureSubfolder; url: string; targetPath: string }> = [];\n\t\tfor (const subfolder of subfolders) {\n\t\t\tconst url = `${modsUrl}${modId}/${version}_${subfolder}.dll`;\n\t\t\tconst targetPath = path.join(this.engineModsPath, subfolder, targetDllName);\n\t\t\tdownloads.push({ subfolder, url, targetPath });\n\t\t}\n\n\t\t// Collect all URLs to fetch (DLLs + versions.json)\n\t\tconst versionsJsonUrl = `${modsUrl}${modId}/versions.json`;\n\t\tconst urlsToFetch = [...downloads.map(d => d.url), versionsJsonUrl];\n\n\t\t// Create HTTP agent with keepAlive to reuse connections\n\t\tconst agent = new https.Agent({ keepAlive: true });\n\n\t\t// Fetch all URLs in parallel with shared agent\n\t\tconst responses = await Promise.all(urlsToFetch.map(url => fetch(url, { agent })));\n\n\t\t// Clean up the agent after all requests complete\n\t\tagent.destroy();\n\n\t\t// Check all responses succeeded\n\t\tfor (let i = 0; i < downloads.length; i++) {\n\t\t\tconst response = responses[i];\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Failed to download ${downloads[i].subfolder} DLL: ${response.statusText || response.status}`);\n\t\t\t}\n\t\t}\n\n\t\t// Check versions.json response\n\t\tconst versionsJsonResponse = responses[responses.length - 1];\n\t\tif (!versionsJsonResponse.ok) {\n\t\t\tthrow new Error(`Failed to download versions.json: ${versionsJsonResponse.statusText || versionsJsonResponse.status}`);\n\t\t}\n\n\t\t// Check minimum Windhawk version requirement\n\t\tconst versionsJsonText = await versionsJsonResponse.json();\n\t\tconst versionInfo = versionsJsonText.find((v: any) => v.version === version);\n\t\tconst minWindhawkVersion = versionInfo?.minWindhawkVersion;\n\n\t\tif (minWindhawkVersion) {\n\t\t\tlet currentVersion = this.currentWindhawkVersion;\n\t\t\tconst requiredVersion = semver.coerce(minWindhawkVersion);\n\t\t\tif (currentVersion && requiredVersion && semver.lt(currentVersion, requiredVersion)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mod version ${version} requires Windhawk ${minWindhawkVersion} or later, ` +\n\t\t\t\t\t`but current version is ${currentVersion.version}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\t// Write all DLL buffers\n\t\t\tconst dllResponses = responses.slice(0, downloads.length);\n\t\t\tconst buffers = await Promise.all(dllResponses.map(r => r.buffer()));\n\t\t\tfor (let i = 0; i < buffers.length; i++) {\n\t\t\t\tfs.mkdirSync(path.dirname(downloads[i].targetPath), { recursive: true });\n\t\t\t\tfs.writeFileSync(downloads[i].targetPath, buffers[i]);\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\t// Clean up any partially downloaded files\n\t\t\tfor (const cleanupSubfolder of subfolders) {\n\t\t\t\tconst cleanupPath = path.join(this.engineModsPath, cleanupSubfolder, targetDllName);\n\t\t\t\ttry {\n\t\t\t\t\tif (fs.existsSync(cleanupPath)) {\n\t\t\t\t\t\tfs.unlinkSync(cleanupPath);\n\t\t\t\t\t}\n\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\t// Ignore cleanup errors\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\n\t\treturn { targetDllName };\n\t}\n\n\tpublic deleteModFiles(modId: string) {\n\t\t// Delete all files for all architectures\n\t\tconst allSubfolders: ArchitectureSubfolder[] = ['32', '64'];\n\t\tif (this.arm64Enabled) {\n\t\t\tallSubfolders.push('arm64');\n\t\t}\n\n\t\tfor (const subfolder of allSubfolders) {\n\t\t\tthis.deleteOldModFilesInFolder(modId, subfolder);\n\t\t}\n\t}\n}\n\n// https://stackoverflow.com/a/7228322\n// min and max included\nfunction randomIntFromInterval(min: number, max: number) {\n\treturn Math.floor(Math.random() * (max - min + 1) + min);\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/modSourceUtils.ts",
    "content": "import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\nimport * as jsonschema from 'jsonschema';\nimport * as path from 'path';\nimport { InitialSettingItem, InitialSettings, InitialSettingsValue } from '../webviewIPCMessages';\n\nconst modMetadataParams = {\n\tsingleValue: [\n\t\t'id',\n\t\t'version',\n\t\t'github',\n\t\t'twitter',\n\t\t'homepage',\n\t\t'compilerOptions',\n\t\t'license',\n\t\t'donateUrl',\n\t],\n\tsingleValueLocalizable: [\n\t\t'name',\n\t\t'description',\n\t\t'author',\n\t],\n\tmultiValue: [\n\t\t'include',\n\t\t'exclude',\n\t\t'architecture',\n\t],\n} as const;\n\ntype ModMetadataParamsSingleValue = typeof modMetadataParams.singleValue[number];\ntype ModMetadataParamsSingleValueLocalizable = typeof modMetadataParams.singleValueLocalizable[number];\ntype ModMetadataParamsMultiValue = typeof modMetadataParams.multiValue[number];\n\nfunction isModMetadataParamsSingleValue(k: string): k is ModMetadataParamsSingleValue {\n\treturn modMetadataParams.singleValue.includes(k as any);\n}\nfunction isModMetadataParamsSingleValueLocalizable(k: string): k is ModMetadataParamsSingleValueLocalizable {\n\treturn modMetadataParams.singleValueLocalizable.includes(k as any);\n}\nfunction isModMetadataParamsMultiValue(k: string): k is ModMetadataParamsMultiValue {\n\treturn modMetadataParams.multiValue.includes(k as any);\n}\n\ntype ModMetadata = Partial<\n\tRecord<ModMetadataParamsSingleValue, string> &\n\tRecord<ModMetadataParamsSingleValueLocalizable, string> &\n\tRecord<ModMetadataParamsMultiValue, string[]>\n>;\n\nexport default class ModSourceUtils {\n\tprivate modsSourcePath: string;\n\n\tpublic constructor(appDataPath: string) {\n\t\tthis.modsSourcePath = path.join(appDataPath, 'ModsSource');\n\t}\n\n\tprivate getModSourcePath(modId: string) {\n\t\treturn path.join(this.modsSourcePath, modId + '.wh.cpp');\n\t}\n\n\tprivate getBestLanguageMatch(matchLanguage: string, candidates: {\n\t\tlanguage: string | null,\n\t\tvalue: string\n\t}[]) {\n\t\tconst languages = candidates.map(x => x.language && x.language.toLowerCase());\n\n\t\tlet iterLanguage = matchLanguage;\n\t\tlet foundIndex;\n\n\t\tfor (; ;) {\n\t\t\t// Exact match.\n\t\t\tfoundIndex = languages.indexOf(iterLanguage);\n\t\t\tif (foundIndex !== -1) {\n\t\t\t\treturn candidates[foundIndex];\n\t\t\t}\n\n\t\t\t// A more specific language.\n\t\t\tfoundIndex = languages.findIndex(language => language && language.startsWith(iterLanguage));\n\t\t\tif (foundIndex !== -1) {\n\t\t\t\treturn candidates[foundIndex];\n\t\t\t}\n\n\t\t\tif (!iterLanguage.includes('-')) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\titerLanguage = iterLanguage.replace(/-[^-]*$/, '');\n\t\t}\n\n\t\t// No language.\n\t\tfoundIndex = languages.indexOf(null);\n\t\tif (foundIndex !== -1) {\n\t\t\treturn candidates[foundIndex];\n\t\t}\n\n\t\t// No matches of any kind, return the first item.\n\t\treturn candidates[0];\n\t}\n\n\tprivate extractMetadataRaw(modSource: string) {\n\t\tconst metadataBlockMatch = modSource.match(/^\\/\\/[ \\t]+==WindhawkMod==[ \\t]*$([\\s\\S]+?)^\\/\\/[ \\t]+==\\/WindhawkMod==[ \\t]*$/m);\n\t\tif (!metadataBlockMatch) {\n\t\t\tthrow new Error('Couldn\\'t find a metadata block in the source code');\n\t\t}\n\n\t\tconst metadataBlock = metadataBlockMatch[1];\n\n\t\tconst result: Record<string, {\n\t\t\tlanguage: string | null,\n\t\t\tvalue: string\n\t\t}[]> = {};\n\n\t\tfor (const line of metadataBlock.split('\\n')) {\n\t\t\tconst lineTrimmed = line.trimEnd();\n\t\t\tif (lineTrimmed === '') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst match = lineTrimmed.match(/^\\/\\/[ \\t]+@(_?[a-zA-Z]+)(?::([a-z]{2}(?:-[A-Z]{2})?))?[ \\t]+(.*)$/);\n\t\t\tif (!match) {\n\t\t\t\tconst lineTruncated = lineTrimmed.length > 20 ? (lineTrimmed.slice(0, 17) + '...') : lineTrimmed;\n\t\t\t\tthrow new Error('Couldn\\'t parse metadata line: ' + lineTruncated);\n\t\t\t}\n\n\t\t\tconst key = match[1];\n\t\t\tconst language = match[2] as string | undefined;\n\t\t\tconst value = match[3];\n\n\t\t\tresult[key] = result[key] ?? [];\n\t\t\tresult[key].push({\n\t\t\t\tlanguage: language ?? null,\n\t\t\t\tvalue\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate validateMetadata(metadata: ModMetadata) {\n\t\tconst modId = metadata.id;\n\t\tif (!modId) {\n\t\t\tthrow new Error('Mod id must be specified in the source code');\n\t\t}\n\n\t\tif (!modId.match(/^[0-9a-z-]+$/)) {\n\t\t\tthrow new Error('Mod id must only contain the following characters: 0-9, a-z, and a hyphen (-)');\n\t\t}\n\n\t\tconst paths = {\n\t\t\tinclude: metadata.include,\n\t\t\texclude: metadata.exclude\n\t\t};\n\t\tfor (const [category, pathsArray] of Object.entries(paths)) {\n\t\t\tfor (const path of pathsArray || []) {\n\t\t\t\tif (path.match(/[/\"<>|]/)) {\n\t\t\t\t\tthrow new Error(`Mod ${category} path contains one of the forbidden characters: / \" < > |`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst supportedArchitecture = [\n\t\t\t'x86',\n\t\t\t'x86-64',\n\t\t\t'amd64',\n\t\t\t'arm64'\n\t\t];\n\t\tfor (const architecture of metadata.architecture || []) {\n\t\t\tif (!supportedArchitecture.includes(architecture)) {\n\t\t\t\tthrow new Error(`Mod architecture must be one of ${supportedArchitecture.join(', ')}: ${architecture}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic extractMetadata(modSource: string, language: string) {\n\t\tconst metadataRaw = this.extractMetadataRaw(modSource);\n\n\t\tconst result: ModMetadata = {};\n\n\t\tfor (const [metadataKeyRaw, metadataValue] of Object.entries(metadataRaw)) {\n\t\t\tif (metadataValue.length === 0) {\n\t\t\t\tthrow new Error(`Missing metadata parameter: ${metadataKeyRaw}`);\n\t\t\t}\n\n\t\t\tconst metadataKey = metadataKeyRaw.replace(/^_/, '');\n\n\t\t\tif (isModMetadataParamsSingleValueLocalizable(metadataKey)) {\n\t\t\t\tconst languages = new Set<string | null>();\n\t\t\t\tfor (const item of metadataValue) {\n\t\t\t\t\tif (languages.has(item.language)) {\n\t\t\t\t\t\tthrow new Error(`Duplicate metadata parameter: ${metadataKey}` + (item.language !== null ? `:${item.language}` : ''));\n\t\t\t\t\t}\n\n\t\t\t\t\tlanguages.add(item.language);\n\t\t\t\t}\n\n\t\t\t\tresult[metadataKey] = this.getBestLanguageMatch(language, metadataValue).value;\n\t\t\t} else if (isModMetadataParamsMultiValue(metadataKey)) {\n\t\t\t\tfor (const item of metadataValue) {\n\t\t\t\t\tif (item.language !== null) {\n\t\t\t\t\t\tthrow new Error(`Metadata parameter can't be localized: ${metadataKey}:${item.language}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresult[metadataKey] = metadataValue.map(x => x.value);\n\t\t\t} else if (isModMetadataParamsSingleValue(metadataKey)) {\n\t\t\t\tfor (const item of metadataValue) {\n\t\t\t\t\tif (item.language !== null) {\n\t\t\t\t\t\tthrow new Error(`Metadata parameter can't be localized: ${metadataKey}:${item.language}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (metadataValue.length > 1) {\n\t\t\t\t\tthrow new Error(`Duplicate metadata parameter: ${metadataKey}`);\n\t\t\t\t}\n\n\t\t\t\tresult[metadataKey] = metadataValue[0].value;\n\t\t\t} else if (metadataKeyRaw.startsWith('_')) {\n\t\t\t\t// Ignore for forward compatibility.\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Unsupported metadata parameter: ${metadataKey}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.validateMetadata(result);\n\t\treturn result;\n\t}\n\n\tpublic appendToIdAndName(modSource: string, appendToId?: string, appendToName?: string) {\n\t\t// This function can be made more generic in the future, if necessary.\n\t\tconst search = /(^\\/\\/[ \\t]+==WindhawkMod==[ \\t]*$)([\\s\\S]+?)(^\\/\\/[ \\t]+==\\/WindhawkMod==[ \\t]*$)/m;\n\t\treturn modSource.replace(search, (match, p1: string, p2: string, p3: string) => {\n\t\t\tlet p2New = p2;\n\n\t\t\tif (appendToId) {\n\t\t\t\tp2New = p2New.replace(/^(\\/\\/[ \\t]+@id[ \\t]+)(.*?)([ \\t]*)$/m,\n\t\t\t\t\t'$1$2' + appendToId.replace(/\\$/g, '$$$$') + '$3');\n\t\t\t}\n\n\t\t\tif (appendToName) {\n\t\t\t\tp2New = p2New.replace(/^(\\/\\/[ \\t]+@name(?::(?:[a-z]{2}(?:-[A-Z]{2})?))?[ \\t]+)(.*?)([ \\t]*)$/mg,\n\t\t\t\t\t'$1$2' + appendToName.replace(/\\$/g, '$$$$') + '$3');\n\t\t\t}\n\n\t\t\treturn p1 + p2New + p3;\n\t\t});\n\t}\n\n\tpublic getMetadataOfInstalled(language: string, onLoadError: (modId: string, error: Error) => void) {\n\t\tconst mods: Record<string, ModMetadata> = {};\n\n\t\tlet modsSourceDir: fs.Dir;\n\t\ttry {\n\t\t\tmodsSourceDir = fs.opendirSync(this.modsSourcePath);\n\t\t} catch (e) {\n\t\t\t// Ignore if file doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn mods;\n\t\t}\n\n\t\ttry {\n\t\t\tlet modsSourceDirEntry: fs.Dirent | null;\n\t\t\twhile ((modsSourceDirEntry = modsSourceDir.readSync()) !== null) {\n\t\t\t\tif (modsSourceDirEntry.isFile() && modsSourceDirEntry.name.endsWith('.wh.cpp')) {\n\t\t\t\t\tconst modId = modsSourceDirEntry.name.slice(0, -'.wh.cpp'.length);\n\t\t\t\t\tconst modSourcePath = path.join(this.modsSourcePath, modsSourceDirEntry.name);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst modSourceMetadata = this.extractMetadata(fs.readFileSync(modSourcePath, 'utf8'), language);\n\t\t\t\t\t\tmods[modId] = modSourceMetadata;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tonLoadError(modId, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tmodsSourceDir.closeSync();\n\t\t}\n\n\t\treturn mods;\n\t}\n\n\tpublic getSource(modId: string) {\n\t\tconst modSourcePath = this.getModSourcePath(modId);\n\t\treturn fs.readFileSync(modSourcePath, 'utf8');\n\t}\n\n\tpublic setSource(modId: string, modSource: string) {\n\t\tconst modSourcePath = this.getModSourcePath(modId);\n\t\tfs.mkdirSync(path.dirname(modSourcePath), { recursive: true });\n\t\tfs.writeFileSync(modSourcePath, modSource);\n\t}\n\n\tpublic doesSourceExist(modId: string) {\n\t\tconst modSourcePath = this.getModSourcePath(modId);\n\t\treturn fs.existsSync(modSourcePath);\n\t}\n\n\tpublic extractReadme(modSource: string) {\n\t\tconst readmeBlockMatch = modSource.match(/^\\/\\/[ \\t]+==WindhawkModReadme==[ \\t]*$\\s*\\/\\*\\s*([\\s\\S]+?)\\s*\\*\\/\\s*^\\/\\/[ \\t]+==\\/WindhawkModReadme==[ \\t]*$/m);\n\t\tif (readmeBlockMatch === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn readmeBlockMatch[1];\n\t}\n\n\tprivate extractInitialSettingsRaw(modSource: string) {\n\t\tconst settingsBlockMatch = modSource.match(/^\\/\\/[ \\t]+==WindhawkModSettings==[ \\t]*$\\s*\\/\\*\\s*([\\s\\S]+?)\\s*\\*\\/\\s*^\\/\\/[ \\t]+==\\/WindhawkModSettings==[ \\t]*$/m);\n\t\tif (settingsBlockMatch === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst settings = yaml.load(settingsBlockMatch[1], {\n\t\t\tschema: yaml.JSON_SCHEMA\n\t\t});\n\t\tif (!Array.isArray(settings)) {\n\t\t\tthrow new Error('Failed to parse settings: not a valid YAML array');\n\t\t}\n\n\t\tconst schema = {\n\t\t\t\"type\": \"array\",\n\t\t\t\"minItems\": 1,\n\t\t\t\"items\": {\n\t\t\t\t\"type\": \"object\",\n\t\t\t\t\"minProperties\": 1,\n\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\"patternProperties\": {\n\t\t\t\t\t\"^[0-9A-Za-z_-]+$\": {\n\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t{ \"type\": \"boolean\" },\n\t\t\t\t\t\t\t{ \"type\": \"number\" },\n\t\t\t\t\t\t\t{ \"type\": \"string\" },\n\t\t\t\t\t\t\t{ \"$ref\": \"#\" },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\"minItems\": 1,\n\t\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t\t{ \"items\": { \"type\": \"number\" } },\n\t\t\t\t\t\t\t\t\t{ \"items\": { \"type\": \"string\" } },\n\t\t\t\t\t\t\t\t\t{ \"items\": { \"$ref\": \"#\" } }\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"^\\\\$(name|description)(:[a-z]{2}(-[A-Z]{2})?)?$\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"^\\\\$(options)(:[a-z]{2}(-[A-Z]{2})?)?$\": {\n\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\"minItems\": 2,\n\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\t\t\"minProperties\": 1,\n\t\t\t\t\t\t\t\"maxProperties\": 1,\n\t\t\t\t\t\t\t\"patternProperties\": {\n\t\t\t\t\t\t\t\t\"^.*$\": {\n\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst validatorResult = jsonschema.validate(settings, schema);\n\t\tif (!validatorResult.valid) {\n\t\t\tthrow new Error('Failed to parse settings: ' + validatorResult.toString());\n\t\t}\n\n\t\treturn settings as Record<string, any>[];\n\t}\n\n\tpublic extractInitialSettings(modSource: string, language: string): InitialSettings | null {\n\t\tconst parseSettings = (settings: Record<string, any>[]): InitialSettings => {\n\t\t\treturn settings.map(parseSettingsValueAnnotated);\n\t\t};\n\n\t\tconst parseSettingsValueAnnotated = (value: Record<string, any>): InitialSettingItem => {\n\t\t\tconst actualParameters = Object.keys(value).filter(x => !x.startsWith('$'));\n\t\t\tif (actualParameters.length === 0) {\n\t\t\t\tthrow new Error('Missing settings key');\n\t\t\t} else if (actualParameters.length > 1) {\n\t\t\t\tthrow new Error('More than one settings key');\n\t\t\t}\n\n\t\t\tconst actualParameter = actualParameters[0];\n\t\t\tconst metaParameters = Object.keys(value).filter(x => x.startsWith('$'));\n\n\t\t\tconst result: Record<string, any> = {};\n\n\t\t\tfor (const paramWithPrefix of metaParameters) {\n\t\t\t\tconst param = paramWithPrefix.slice(1); // remove '$'\n\t\t\t\tconst paramParts = param.split(':');\n\n\t\t\t\tresult[paramParts[0]] = result[paramParts[0]] ?? [];\n\t\t\t\tresult[paramParts[0]].push({\n\t\t\t\t\tlanguage: paramParts[1] ?? null,\n\t\t\t\t\tvalue: value[paramWithPrefix]\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (const key of Object.keys(result)) {\n\t\t\t\tresult[key] = this.getBestLanguageMatch(language, result[key]).value;\n\t\t\t}\n\n\t\t\tresult.key = actualParameter;\n\t\t\tresult.value = parseSettingsValue(value[actualParameter]);\n\n\t\t\treturn result as InitialSettingItem;\n\t\t};\n\n\t\tconst parseSettingsValue = (value: any): InitialSettingsValue => {\n\t\t\tif (typeof value === 'boolean' ||\n\t\t\t\ttypeof value === 'number' ||\n\t\t\t\ttypeof value === 'string' ||\n\t\t\t\ttypeof value[0] === 'number' ||\n\t\t\t\ttypeof value[0] === 'string') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\treturn Array.isArray(value[0]) ? value.map(parseSettings) : parseSettings(value);\n\t\t};\n\n\t\tconst settingsRaw = this.extractInitialSettingsRaw(modSource);\n\t\tif (!settingsRaw) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn parseSettings(settingsRaw);\n\t}\n\n\tpublic extractInitialSettingsForEngine(modSource: string) {\n\t\tconst parseSettings = (settings: Record<string, any>[], keyPrefix = '') => {\n\t\t\tfor (const value of settings) {\n\t\t\t\tparseSettingsValueAnnotated(value, keyPrefix);\n\t\t\t}\n\t\t};\n\n\t\tconst parseSettingsValueAnnotated = (value: Record<string, any>, keyPrefix = '') => {\n\t\t\tconst actualParameters = Object.keys(value).filter(x => !x.startsWith('$'));\n\t\t\tif (actualParameters.length === 0) {\n\t\t\t\tthrow new Error('Missing settings key');\n\t\t\t} else if (actualParameters.length > 1) {\n\t\t\t\tthrow new Error('More than one settings key');\n\t\t\t}\n\n\t\t\tconst actualParameter = actualParameters[0];\n\n\t\t\tconst key = (keyPrefix && (keyPrefix + '.')) + actualParameter;\n\t\t\tparseSettingsValue(value[actualParameter], key);\n\t\t};\n\n\t\tconst parseSettingsValue = (value: any, key: string) => {\n\t\t\tif (typeof value === 'boolean') {\n\t\t\t\tparsed[key] = value ? 1 : 0;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof value === 'number' ||\n\t\t\t\ttypeof value === 'string') {\n\t\t\t\tparsed[key] = value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof value[0] === 'number' ||\n\t\t\t\ttypeof value[0] === 'string') {\n\t\t\t\tfor (const [i, item] of value.entries()) {\n\t\t\t\t\tparseSettingsValue(item, `${key}[${i}]`);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (Array.isArray(value[0])) {\n\t\t\t\tfor (const [i, item] of value.entries()) {\n\t\t\t\t\tparseSettings(item, `${key}[${i}]`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparseSettings(value, key);\n\t\t\t}\n\t\t};\n\n\t\tconst parsed: Record<string, string | number> = {};\n\n\t\tconst settingsRaw = this.extractInitialSettingsRaw(modSource);\n\t\tif (!settingsRaw) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparseSettings(settingsRaw);\n\t\treturn parsed;\n\t}\n\n\tpublic deleteSource(modId: string) {\n\t\tconst modSourcePath = this.getModSourcePath(modId);\n\t\ttry {\n\t\t\tfs.unlinkSync(modSourcePath);\n\t\t} catch (e) {\n\t\t\t// Ignore if file doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/trayProgramUtils.ts",
    "content": "import * as child_process from 'child_process';\nimport * as path from 'path';\nimport * as vscode from 'vscode';\n\nexport default class TrayProgramUtils {\n\tprivate trayProgramPath: string;\n\n\tpublic constructor(appRootPath: string) {\n\t\tthis.trayProgramPath = path.join(appRootPath, 'windhawk.exe');\n\t}\n\n\tprivate getCleanProcessEnv() {\n\t\t// Return the process environment, but without any environment variables\n\t\t// that are specific to Electron or VSCode. This is because the tray\n\t\t// process might run another instance of VSCode, and these variables\n\t\t// might cause problems (e.g. ELECTRON_RUN_AS_NODE=1).\n\t\tconst cleanEnv: NodeJS.ProcessEnv = {};\n\t\tfor (const [key, value] of Object.entries(process.env)) {\n\t\t\tif (!key.startsWith('ELECTRON_') &&\n\t\t\t\t!key.startsWith('VSCODE_') &&\n\t\t\t\t!key.startsWith('WINDHAWK_')) {\n\t\t\t\tcleanEnv[key] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn cleanEnv;\n\t}\n\n\tprivate runTrayProgramWithArgs(args: string[]) {\n\t\ttry {\n\t\t\tconst ps = child_process.spawn(this.trayProgramPath, args, {\n\t\t\t\tenv: this.getCleanProcessEnv(),\n\t\t\t});\n\n\t\t\tlet gotError = false;\n\n\t\t\tps.on('error', err => {\n\t\t\t\t//console.log('Oh no, the error: ' + err);\n\t\t\t\tgotError = true;\n\t\t\t\tvscode.window.showErrorMessage(err.message);\n\t\t\t});\n\n\t\t\tps.on('close', code => {\n\t\t\t\t//console.log(`ps process exited with code ${code}`);\n\t\t\t\tif (!gotError && code !== 0) {\n\t\t\t\t\tvscode.window.showWarningMessage('Communication with the Windhawk tray icon process failed, make sure it\\'s running');\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tvscode.window.showErrorMessage(e.message);\n\t\t}\n\t}\n\n\tpublic postAppRestartBg() {\n\t\tthis.runTrayProgramWithArgs([\n\t\t\t'-restart-bg'\n\t\t]);\n\t}\n\n\tpublic postNewUpdatesFound() {\n\t\tthis.runTrayProgramWithArgs([\n\t\t\t'-new-updates-found'\n\t\t]);\n\t}\n\n\tpublic postAppSettingsChanged() {\n\t\tthis.runTrayProgramWithArgs([\n\t\t\t'-app-settings-changed'\n\t\t]);\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/updateUtils.ts",
    "content": "import { spawn } from 'child_process';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport fetch from 'node-fetch';\nimport * as os from 'os';\nimport * as path from 'path';\n\nexport interface UpdateProgress {\n\tprogress: number; // 0-100\n}\n\nexport interface UpdateCallbacks {\n\tonProgress: (data: UpdateProgress) => void;\n\tonInstalling: () => void;\n}\n\nexport interface UpdateResult {\n\tsucceeded: boolean;\n\terror?: string;\n}\n\nexport class UpdateUtils {\n\tprivate _isUpdating = false;\n\tprivate _downloadAbortController: AbortController | null = null;\n\tprivate _tempFolderPath: string | null = null;\n\tprivate _tempInstallerPath: string | null = null;\n\n\tconstructor(\n\t\tprivate readonly _isPortable: boolean,\n\t\tprivate readonly _appRootPath: string\n\t) { }\n\n\tpublic isUpdating(): boolean {\n\t\treturn this._isUpdating;\n\t}\n\n\tpublic async startUpdate(callbacks: UpdateCallbacks): Promise<UpdateResult> {\n\t\tif (this._isUpdating) {\n\t\t\treturn { succeeded: false, error: 'Update is already in progress' };\n\t\t}\n\n\t\tthis._isUpdating = true;\n\n\t\ttry {\n\t\t\t// Download the latest installer\n\t\t\tawait this._downloadInstaller(callbacks);\n\n\t\t\t// Start installation\n\t\t\tcallbacks.onInstalling();\n\t\t\tawait this._installUpdate();\n\n\t\t\t// At this point, the installer was started successfully\n\t\t\treturn { succeeded: true };\n\t\t} catch (error: any) {\n\t\t\treturn {\n\t\t\t\tsucceeded: false,\n\t\t\t\terror: error.message || 'Unknown error occurred'\n\t\t\t};\n\t\t} finally {\n\t\t\tthis._cleanup();\n\t\t}\n\t}\n\n\tpublic cancelUpdate(): boolean {\n\t\tif (!this._isUpdating || !this._downloadAbortController) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Just abort the download. startUpdate() will handle cleanup.\n\t\tthis._downloadAbortController.abort();\n\t\treturn true;\n\t}\n\n\tprivate async _downloadInstaller(callbacks: UpdateCallbacks): Promise<void> {\n\t\tconst installerUrl = 'https://github.com/ramensoftware/windhawk/releases/latest/download/windhawk_setup.exe';\n\n\t\tthis._downloadAbortController = new AbortController();\n\n\t\ttry {\n\t\t\t// Create a random subfolder inside os.tmpdir to avoid DLL hijacking\n\t\t\tconst randomFolderName = `windhawk_update_${crypto.randomBytes(8).toString('hex')}`;\n\t\t\tthis._tempFolderPath = path.join(os.tmpdir(), randomFolderName);\n\t\t\tfs.mkdirSync(this._tempFolderPath, { recursive: true });\n\n\t\t\tthis._tempInstallerPath = path.join(this._tempFolderPath, 'windhawk_setup.exe');\n\n\t\t\tconst response = await fetch(installerUrl, {\n\t\t\t\tsignal: this._downloadAbortController.signal\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthis._downloadAbortController = null;\n\t\t\t\tthrow new Error(`Failed to download update: ${response.statusText || response.status}`);\n\t\t\t}\n\n\t\t\tconst totalSize = parseInt(response.headers.get('content-length') || '0', 10);\n\t\t\tlet downloadedSize = 0;\n\t\t\tlet lastReportedProgress = -1;\n\n\t\t\tconst fileStream = fs.createWriteStream(this._tempInstallerPath);\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tif (!response.body) {\n\t\t\t\t\treject(new Error('Response body is null'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet hasError = false;\n\n\t\t\t\tresponse.body.on('data', (chunk: Buffer) => {\n\t\t\t\t\tdownloadedSize += chunk.length;\n\t\t\t\t\tconst progress = totalSize > 0 ? Math.floor((downloadedSize / totalSize) * 100) : 0;\n\n\t\t\t\t\t// Only report progress if it changed by at least 1%\n\t\t\t\t\tif (progress !== lastReportedProgress) {\n\t\t\t\t\t\tlastReportedProgress = progress;\n\t\t\t\t\t\tcallbacks.onProgress({ progress });\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tresponse.body.pipe(fileStream);\n\n\t\t\t\tfileStream.on('finish', () => {\n\t\t\t\t\tfileStream.close();\n\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\tcallbacks.onProgress({ progress: 100 });\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tfileStream.on('error', (error) => {\n\t\t\t\t\thasError = true;\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\n\t\t\t\tresponse.body.on('error', (error) => {\n\t\t\t\t\thasError = true;\n\t\t\t\t\tfileStream.close();\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._downloadAbortController = null;\n\t\t}\n\t}\n\n\tprivate async _installUpdate(): Promise<void> {\n\t\tconst tempInstallerPath = this._tempInstallerPath;\n\t\tif (!tempInstallerPath || !fs.existsSync(tempInstallerPath)) {\n\t\t\tthrow new Error('Installer file not found');\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet args: string[];\n\n\t\t\tif (this._isPortable) {\n\t\t\t\targs = ['/PORTABLE', '/AUTO_UPDATE', '/LANG=1033', `/D=${this._appRootPath}`];\n\t\t\t} else {\n\t\t\t\targs = ['/AUTO_UPDATE'];\n\t\t\t}\n\n\t\t\t// Run the installer with appropriate flags\n\t\t\t// The installer should handle restarting Windhawk\n\t\t\tconst installerProcess = spawn(tempInstallerPath, args, {\n\t\t\t\tdetached: true,\n\t\t\t\tstdio: 'ignore'\n\t\t\t});\n\n\t\t\tinstallerProcess.on('error', (error) => {\n\t\t\t\treject(new Error(`Failed to start installer: ${error.message}`));\n\t\t\t});\n\n\t\t\t// Wait for the process to actually spawn before resolving\n\t\t\tinstallerProcess.on('spawn', () => {\n\t\t\t\t// Unref so the parent process can exit\n\t\t\t\tinstallerProcess.unref();\n\n\t\t\t\t// The installer will restart Windhawk, which will close this\n\t\t\t\t// extension, so we don't wait for the process to complete\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _cleanup(): void {\n\t\tthis._isUpdating = false;\n\t\tthis._downloadAbortController = null;\n\n\t\tif (this._tempInstallerPath) {\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(this._tempInstallerPath);\n\t\t\t} catch (error) {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t}\n\n\t\tif (this._tempFolderPath) {\n\t\t\ttry {\n\t\t\t\tfs.rmdirSync(this._tempFolderPath);\n\t\t\t} catch (error) {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t}\n\n\t\tthis._tempInstallerPath = null;\n\t\tthis._tempFolderPath = null;\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/utils/userProfileUtils.ts",
    "content": "import * as fs from 'fs';\nimport * as path from 'path';\n\ntype UserProfileType = {\n\tid?: string,\n\tos?: string,\n\tapp: Partial<{\n\t\tversion: string,\n\t\tlatestVersion: string\n\t}>,\n\tmods: Record<string, Partial<{\n\t\tversion: string,\n\t\tdisabled: boolean,\n\t\trating: number,\n\t\tlatestVersion: string\n\t}> | undefined>\n};\n\ntype onFileModified = (mtimeMs: number) => void;\n\nexport class UserProfile {\n\tprivate userProfilePath: string;\n\tprivate userProfile: UserProfileType;\n\tprivate onFileModified?: onFileModified;\n\n\tpublic constructor(userProfilePath: string, onFileModified?: onFileModified) {\n\t\tthis.userProfilePath = userProfilePath;\n\t\tthis.onFileModified = onFileModified;\n\n\t\tlet userProfileText: string | undefined;\n\t\ttry {\n\t\t\tuserProfileText = fs.readFileSync(userProfilePath, 'utf8');\n\t\t} catch (e) {\n\t\t\t// Ignore if file doesn't exist.\n\t\t\tif (e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tlet userProfile: any = {};\n\t\tif (userProfileText) {\n\t\t\ttry {\n\t\t\t\tuserProfile = JSON.parse(userProfileText);\n\t\t\t} catch (e) {\n\t\t\t\t// Ignore if file is invalid.\n\t\t\t}\n\t\t}\n\n\t\tuserProfile.app = userProfile.app || {};\n\t\tuserProfile.mods = userProfile.mods || {};\n\n\t\tthis.userProfile = userProfile;\n\t}\n\n\tpublic getAppLatestVersion() {\n\t\treturn this.userProfile.app.latestVersion ?? null;\n\t}\n\n\tpublic getModRating(modId: string) {\n\t\treturn this.userProfile.mods[modId]?.rating ?? null;\n\t}\n\n\tpublic getModLatestVersion(modId: string) {\n\t\treturn this.userProfile.mods[modId]?.latestVersion ?? null;\n\t}\n\n\tpublic setModVersion(modId: string, version: string, resetLatestVersion = true) {\n\t\tconst mod = this.userProfile.mods[modId] || {};\n\n\t\tmod.version = version;\n\t\tif (resetLatestVersion) {\n\t\t\tdelete mod.latestVersion;\n\t\t}\n\n\t\tthis.userProfile.mods[modId] = mod;\n\t}\n\n\tpublic setModDisabled(modId: string, disabled: boolean) {\n\t\tconst mod = this.userProfile.mods[modId] || {};\n\t\tif (disabled) {\n\t\t\tmod.disabled = true;\n\t\t} else {\n\t\t\tdelete mod.disabled;\n\t\t}\n\t\tthis.userProfile.mods[modId] = mod;\n\t}\n\n\tpublic setModRating(modId: string, rating: number) {\n\t\tconst mod = this.userProfile.mods[modId] || {};\n\t\tif (rating) {\n\t\t\tmod.rating = rating;\n\t\t} else {\n\t\t\tdelete mod.rating;\n\t\t}\n\t\tthis.userProfile.mods[modId] = mod;\n\t}\n\n\tpublic deleteMod(modId: string) {\n\t\tconst mod = this.userProfile.mods[modId];\n\t\tif (mod && mod.rating !== undefined) {\n\t\t\t// Keep rating but delete other properties.\n\t\t\tthis.userProfile.mods[modId] = { rating: mod.rating };\n\t\t} else {\n\t\t\tdelete this.userProfile.mods[modId];\n\t\t}\n\t}\n\n\tprivate isModDeleted(modId: string) {\n\t\tconst mod = this.userProfile.mods[modId];\n\t\t// Consider a mod deleted if it doesn't exist or only has a rating.\n\t\treturn mod === undefined || (Object.keys(mod).length === 1 && mod.rating !== undefined);\n\t}\n\n\tpublic updateModDetails(modId: string, version: string, disabled: boolean) {\n\t\tconst mod = this.userProfile.mods[modId] || {};\n\t\tlet updated = false;\n\n\t\tif (mod.version !== version) {\n\t\t\tmod.version = version;\n\t\t\tupdated = true;\n\t\t}\n\n\t\tif ((mod.disabled ?? false) !== disabled) {\n\t\t\tmod.disabled = disabled;\n\t\t\tupdated = true;\n\t\t}\n\n\t\tthis.userProfile.mods[modId] = mod;\n\t\treturn updated;\n\t}\n\n\tpublic cleanupRemovedMods(currentModIds: Set<string>) {\n\t\tlet updated = false;\n\n\t\tfor (const modId of Object.keys(this.userProfile.mods)) {\n\t\t\tif (!currentModIds.has(modId) && !this.isModDeleted(modId)) {\n\t\t\t\tthis.deleteMod(modId);\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tpublic updateLatestVersions(appLatestVersion?: string, modLatestVersions?: Record<string, string>) {\n\t\tlet updated = false;\n\n\t\tif (appLatestVersion && this.userProfile.app.latestVersion !== appLatestVersion) {\n\t\t\tthis.userProfile.app.latestVersion = appLatestVersion;\n\t\t\tupdated = true;\n\t\t}\n\n\t\tfor (const [modId, latestVersion] of Object.entries(modLatestVersions || {})) {\n\t\t\tif (this.isModDeleted(modId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst mod = this.userProfile.mods[modId];\n\t\t\tif (mod && mod.latestVersion !== latestVersion) {\n\t\t\t\tmod.latestVersion = latestVersion;\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tpublic write(asExternalUpdate = false) {\n\t\tfs.writeFileSync(this.userProfilePath, JSON.stringify(this.userProfile, null, 2));\n\t\tif (!asExternalUpdate) {\n\t\t\tthis.onFileModified?.(fs.statSync(this.userProfilePath).mtimeMs);\n\t\t}\n\t}\n}\n\nexport default class UserProfileUtils {\n\tprivate userProfilePath: string;\n\tprivate lastModifiedByUserMtimeMs: number | null = null;\n\n\tpublic constructor(appDataPath: string) {\n\t\tthis.userProfilePath = path.join(appDataPath, 'userprofile.json');\n\t}\n\n\tpublic getFilePath() {\n\t\treturn this.userProfilePath;\n\t}\n\n\tpublic read() {\n\t\treturn new UserProfile(this.userProfilePath, mtimeMs => {\n\t\t\tthis.lastModifiedByUserMtimeMs = mtimeMs;\n\t\t});\n\t}\n\n\tpublic getLastModifiedByUserMtimeMs() {\n\t\treturn this.lastModifiedByUserMtimeMs;\n\t}\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/webviewIPC.ts",
    "content": "import * as vscode from 'vscode';\nimport {\n  CancelUpdateReplyData,\n  CompileEditedModReplyData,\n  CompileModReplyData,\n  DeleteModReplyData,\n  EnableEditedModLoggingReplyData,\n  EnableEditedModReplyData,\n  EnableModReplyData,\n  ExitEditorModeReplyData,\n  GetAppSettingsReplyData,\n  GetFeaturedModsReplyData,\n  GetInitialAppSettingsReplyData,\n  GetInstalledModsReplyData,\n  GetModConfigReplyData,\n  GetModSettingsReplyData,\n  GetModSourceDataReplyData,\n  GetModVersionsReplyData,\n  GetRepositoryModSourceDataReplyData,\n  GetRepositoryModsReplyData,\n  InstallModReplyData,\n  SetEditedModDetailsData,\n  SetEditedModIdData,\n  SetModSettingsReplyData,\n  SetNewAppSettingsData,\n  SetNewModConfigData,\n  StartUpdateReplyData,\n  UpdateAppSettingsReplyData,\n  UpdateDownloadProgressEventData,\n  UpdateInstalledModsDetailsData,\n  UpdateInstallingEventData,\n  UpdateModConfigReplyData,\n  UpdateModRatingReplyData\n} from './webviewIPCMessages';\n\n// Message types:\n// * 'message' is a message from the webview to the extension.\n// * 'messageWithReply' is a message from the webview to the extension that expects a reply.\n// * 'reply' is a reply to a 'messageWithReply' message.\n// * 'event' is a message from the extension to the webview.\ntype MessageType = 'message' | 'messageWithReply' | 'reply' | 'event';\n\ntype CommonMessageBase = {\n  type: MessageType;\n  command: string;\n  data: Record<string, unknown>;\n};\n\n// type MessageRegular = CommonMessageBase & {\n//   type: 'message';\n//   command: string;\n//   data: Record<string, unknown>;\n// };\n\n// type MessageWithReply = CommonMessageBase & {\n//   type: 'messageWithReply';\n//   command: string;\n//   data: Record<string, unknown>;\n//   messageId: number;\n// };\n\ntype Reply = CommonMessageBase & {\n  type: 'reply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\ntype Event = CommonMessageBase & {\n  type: 'event';\n  command: string;\n  data: Record<string, unknown>;\n};\n\n////////////////////////////////////////////////////////////\n// Events.\n\nexport function setNewAppSettings(webview: vscode.Webview | undefined, data: SetNewAppSettingsData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'setNewAppSettings',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateInstalledModsDetails(webview: vscode.Webview | undefined, data: UpdateInstalledModsDetailsData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'updateInstalledModsDetails',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function setNewModConfig(webview: vscode.Webview | undefined, data: SetNewModConfigData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'setNewModConfig',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function editedModWasModified(webview: vscode.Webview | undefined) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'editedModWasModified',\n    data: {},\n  };\n  webview.postMessage(msg);\n}\n\nexport function compileEditedModStart(webview: vscode.Webview | undefined) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'compileEditedModStart',\n    data: {},\n  };\n  webview.postMessage(msg);\n}\n\nexport function setEditedModDetails(webview: vscode.Webview | undefined, data: SetEditedModDetailsData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'setEditedModDetails',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function setEditedModId(webview: vscode.Webview | undefined, data: SetEditedModIdData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'setEditedModId',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateDownloadProgress(webview: vscode.Webview | undefined, data: UpdateDownloadProgressEventData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'updateDownloadProgress',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateInstalling(webview: vscode.Webview | undefined, data: UpdateInstallingEventData) {\n  if (!webview) return;\n  const msg: Event = {\n    type: 'event',\n    command: 'updateInstalling',\n    data,\n  };\n  webview.postMessage(msg);\n}\n\n////////////////////////////////////////////////////////////\n// Replies.\n\nexport function getInitialAppSettingsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetInitialAppSettingsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getInitialAppSettings',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getInstalledModsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetInstalledModsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getInstalledMods',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getFeaturedModsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetFeaturedModsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getFeaturedMods',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getRepositoryModsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetRepositoryModsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getRepositoryMods',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getModSourceDataReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetModSourceDataReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getModSourceData',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getRepositoryModSourceDataReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetRepositoryModSourceDataReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getRepositoryModSourceData',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getModVersionsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetModVersionsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getModVersions',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getModSettingsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetModSettingsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getModSettings',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function setModSettingsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: SetModSettingsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'setModSettings',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getModConfigReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetModConfigReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getModConfig',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateModConfigReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: UpdateModConfigReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'updateModConfig',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function installModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: InstallModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'installMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function compileModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: CompileModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'compileMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function enableModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: EnableModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'enableMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function deleteModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: DeleteModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'deleteMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateModRatingReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: UpdateModRatingReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'updateModRating',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function getAppSettingsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: GetAppSettingsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'getAppSettings',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function updateAppSettingsReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: UpdateAppSettingsReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'updateAppSettings',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function enableEditedModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: EnableEditedModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'enableEditedMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function enableEditedModLoggingReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: EnableEditedModLoggingReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'enableEditedModLogging',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function compileEditedModReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: CompileEditedModReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'compileEditedMod',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function exitEditorModeReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: ExitEditorModeReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'exitEditorMode',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function startUpdateReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: StartUpdateReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'startUpdate',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n\nexport function cancelUpdateReply(\n  webview: vscode.Webview | undefined,\n  messageId: number,\n  data: CancelUpdateReplyData\n) {\n  if (!webview) return;\n  const msg: Reply = {\n    type: 'reply',\n    command: 'cancelUpdate',\n    messageId,\n    data,\n  };\n  webview.postMessage(msg);\n}\n"
  },
  {
    "path": "src/vscode-windhawk/src/webviewIPCMessages.ts",
    "content": "// Message types:\n// * 'message' is a message from the webview to the extension.\n// * 'messageWithReply' is a message from the webview to the extension that expects a reply.\n// * 'reply' is a reply to a 'messageWithReply' message.\n// * 'event' is a message from the extension to the webview.\nexport type webviewIPCMessageType =\n  | 'message'\n  | 'messageWithReply'\n  | 'reply'\n  | 'event';\n\nexport type webviewIPCMessageCommon = {\n  type: webviewIPCMessageType;\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessage = webviewIPCMessageCommon & {\n  type: 'message';\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessageWithReply = webviewIPCMessageCommon & {\n  type: 'messageWithReply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\nexport type webviewIPCReply = webviewIPCMessageCommon & {\n  type: 'reply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\nexport type webviewIPCEvent = webviewIPCMessageCommon & {\n  type: 'event';\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessageAny =\n  | webviewIPCMessage\n  | webviewIPCMessageWithReply\n  | webviewIPCReply\n  | webviewIPCEvent;\n\n////////////////////////////////////////////////////////////\n// Types.\n\nexport type NoData = Record<string, unknown>;\n\nexport type ModConfig = {\n  // libraryFileName: string;\n  disabled: boolean;\n  loggingEnabled: boolean;\n  debugLoggingEnabled: boolean;\n  include: string[];\n  exclude: string[];\n  includeCustom: string[];\n  excludeCustom: string[];\n  includeExcludeCustomOnly: boolean;\n  patternsMatchCriticalSystemProcesses: boolean;\n  architecture: string[];\n  version: string;\n};\n\nexport type AppSettings = {\n  language: string;\n  disableUpdateCheck: boolean;\n  disableRunUIScheduledTask: boolean | null;\n  devModeOptOut: boolean;\n  devModeUsedAtLeastOnce: boolean;\n  hideTrayIcon: boolean;\n  alwaysCompileModsLocally: boolean;\n  dontAutoShowToolkit: boolean;\n  modTasksDialogDelay: number;\n  safeMode: boolean;\n  loggingVerbosity: number;\n  engine: {\n    loggingVerbosity: number;\n    include: string[];\n    exclude: string[];\n    injectIntoCriticalProcesses: boolean;\n    injectIntoIncompatiblePrograms: boolean;\n    injectIntoGames: boolean;\n  };\n};\n\nexport type ModMetadata = Partial<{\n  version: string;\n  // id: string;\n  github: string;\n  twitter: string;\n  homepage: string;\n  compilerOptions: string;\n  license: string;\n  donateUrl: string;\n  name: string;\n  description: string;\n  author: string;\n  include: string[];\n  exclude: string[];\n  architecture: string[];\n}>;\n\nexport type RepositoryDetails = {\n  users: number;\n  rating: number;\n  // ratingUsers: number;\n  ratingBreakdown: number[];\n  defaultSorting: number;\n  published: number;\n  updated: number;\n};\n\nexport type AppUISettings = {\n  language: string;\n  devModeOptOut: boolean;\n  devModeUsedAtLeastOnce: boolean;\n  loggingEnabled: boolean;\n  updateIsAvailable: boolean;\n  safeMode: boolean;\n};\n\nexport type InitialSettingsValue =\n  | boolean\n  | number\n  | string\n  | InitialSettings\n  | InitialSettingsArrayValue;\n\nexport type InitialSettingsArrayValue = number[] | string[] | InitialSettings[];\n\nexport type InitialSettingItem = {\n  key: string;\n  value: InitialSettingsValue;\n  name?: string;\n  description?: string;\n  options?: Record<string, string>[];\n};\n\nexport type InitialSettings = InitialSettingItem[];\n\n////////////////////////////////////////////////////////////\n// Messages.\n\nexport type EditModData = {\n  modId: string;\n};\n\nexport type ForkModData = {\n  modId: string;\n  modSource?: string;\n};\n\n////////////////////////////////////////////////////////////\n// Messages with replies.\n\nexport type GetInitialAppSettingsReplyData = {\n  appUISettings: Partial<AppUISettings>;\n};\n\nexport type InstallModData = {\n  modId: string;\n  modSource: string;\n  disabled?: boolean;\n};\n\nexport type InstallModReplyData = {\n  modId: string;\n  installedModDetails: {\n    metadata: ModMetadata;\n    config: ModConfig;\n  } | null;\n};\n\nexport type CompileModData = {\n  modId: string;\n  disabled?: boolean;\n};\n\nexport type CompileModReplyData = {\n  modId: string;\n  compiledModDetails: {\n    metadata: ModMetadata;\n    config: ModConfig;\n  } | null;\n};\n\nexport type EnableModData = {\n  modId: string;\n  enable: boolean;\n};\n\nexport type EnableModReplyData = {\n  modId: string;\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type DeleteModData = {\n  modId: string;\n};\n\nexport type DeleteModReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type UpdateModRatingData = {\n  modId: string;\n  rating: number;\n};\n\nexport type UpdateModRatingReplyData = {\n  modId: string;\n  rating: number;\n  succeeded: boolean;\n};\n\nexport type GetInstalledModsReplyData = {\n  installedMods: Record<\n    string,\n    {\n      metadata: ModMetadata | null;\n      config: ModConfig | null;\n      updateAvailable: boolean;\n      userRating: number;\n    }\n  >;\n};\n\nexport type GetFeaturedModsReplyData = {\n  featuredMods: Record<\n    string,\n    {\n      metadata: ModMetadata;\n      details: RepositoryDetails;\n    }\n  > | null;\n};\n\nexport type GetModSourceDataData = {\n  modId: string;\n};\n\nexport type GetModSourceDataReplyData = {\n  modId: string;\n  data: {\n    source: string | null;\n    metadata: ModMetadata | null;\n    readme: string | null;\n    initialSettings: InitialSettings | null;\n  };\n};\n\nexport type GetRepositoryModSourceDataData = {\n  modId: string;\n  version?: string;\n};\n\nexport type GetRepositoryModSourceDataReplyData = {\n  modId: string;\n  version?: string;\n  data: {\n    source: string | null;\n    metadata: ModMetadata | null;\n    readme: string | null;\n    initialSettings: InitialSettings | null;\n  };\n};\n\nexport type GetModVersionsData = {\n  modId: string;\n};\n\nexport type GetModVersionsReplyData = {\n  modId: string;\n  versions: {\n    version: string;\n    timestamp: number;\n    isPreRelease: boolean;\n  }[];\n};\n\nexport type GetAppSettingsReplyData = {\n  appSettings: Partial<AppSettings>;\n};\n\nexport type UpdateAppSettingsData = {\n  appSettings: Partial<AppSettings>;\n};\n\nexport type UpdateAppSettingsReplyData = {\n  appSettings: Partial<AppSettings>;\n  succeeded: boolean;\n};\n\nexport type GetModSettingsData = {\n  modId: string;\n};\n\nexport type GetModSettingsReplyData = {\n  modId: string;\n  settings: Record<string, string | number>;\n};\n\nexport type SetModSettingsData = {\n  modId: string;\n  settings: Record<string, string | number>;\n};\n\nexport type SetModSettingsReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type GetModConfigData = {\n  modId: string;\n};\n\nexport type GetModConfigReplyData = {\n  modId: string;\n  config: ModConfig | null;\n};\n\nexport type UpdateModConfigData = {\n  modId: string;\n  config: Partial<ModConfig>;\n};\n\nexport type UpdateModConfigReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type GetRepositoryModsReplyData = {\n  mods: Record<\n    string,\n    {\n      repository: {\n        metadata: ModMetadata;\n        details: RepositoryDetails;\n        featured?: boolean;\n      };\n      installed?: {\n        metadata: ModMetadata | null;\n        config: ModConfig | null;\n        userRating: number;\n      };\n    }\n  > | null;\n};\n\nexport type StartUpdateReplyData = {\n  succeeded: boolean;\n  error?: string;\n};\n\nexport type CancelUpdateReplyData = {\n  succeeded: boolean;\n};\n\nexport type EnableEditedModData = {\n  enable: boolean;\n};\n\nexport type EnableEditedModReplyData = {\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type EnableEditedModLoggingData = {\n  enable: boolean;\n};\n\nexport type EnableEditedModLoggingReplyData = {\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type CompileEditedModData = {\n  disabled: boolean;\n  loggingEnabled: boolean;\n};\n\nexport type CompileEditedModReplyData = {\n  succeeded: boolean;\n  clearModified: boolean;\n};\n\nexport type ExitEditorModeData = {\n  saveToDrafts: boolean;\n};\n\nexport type ExitEditorModeReplyData = {\n  succeeded: boolean;\n};\n\n////////////////////////////////////////////////////////////\n// Events.\n\nexport type SetNewAppSettingsData = {\n  appUISettings: Partial<AppUISettings>;\n};\n\nexport type UpdateDownloadProgressEventData = {\n  progress: number; // 0-100\n};\n\nexport type UpdateInstallingEventData = NoData;\n\nexport type UpdateInstalledModsDetailsData = {\n  details: Record<\n    string,\n    {\n      updateAvailable: boolean;\n      userRating: number;\n    }\n  >;\n};\n\nexport type SetNewModConfigData = {\n  modId: string,\n  config: Partial<ModConfig>\n};\n\nexport type SetEditedModIdData = {\n  modId: string;\n};\n\nexport type SetEditedModDetailsData = {\n  modId: string;\n  modDetails: ModConfig | null;\n  modWasModified: boolean;\n};\n"
  },
  {
    "path": "src/vscode-windhawk/syntaxes/cpp.injection.json",
    "content": "{\n    \"scopeName\": \"source.cpp.windhawk\",\n    \"injectionSelector\": \"L:source.cpp\",\n    \"patterns\": [\n        {\n            \"include\": \"#mod-info-wrapper\"\n        },\n        {\n            \"include\": \"#yaml-settings-wrapper\"\n        },\n        {\n            \"include\": \"#markdown-readme-wrapper\"\n        }\n    ],\n    \"repository\": {\n        \"mod-info-wrapper\": {\n            \"name\": \"text.windhawk-mod-info-wrapper\",\n            \"begin\": \"^//[ \\t]+==WindhawkMod==[ \\t]*$\",\n            \"end\": \"^//[ \\t]+==/WindhawkMod==[ \\t]*$\",\n            \"beginCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"endCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"patterns\": [\n                {\n                    \"include\": \"#mod-info\"\n                }\n            ]\n        },\n        \"mod-info\": {\n            \"name\": \"text.windhawk-mod-info\",\n            \"match\": \"\\\\/\\\\/[ \\t]+(@(?:id|version|github|twitter|homepage|compilerOptions|license|donateUrl|name|description|author|include|exclude|architecture)(?::([a-z]{2}(?:-[A-Z]{2})?))?)\\\\b(.*)\",\n            \"captures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                },\n                \"1\": {\n                    \"name\": \"storage.type.class.doxygen.cpp\"\n                }\n            }\n        },\n        \"yaml-settings-wrapper\": {\n            \"name\": \"text.yaml.windhawk-settings-wrapper\",\n            \"begin\": \"^//[ \\t]+==WindhawkModSettings==[ \\t]*$\",\n            \"end\": \"^//[ \\t]+==/WindhawkModSettings==[ \\t]*$\",\n            \"beginCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"endCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"patterns\": [\n                {\n                    \"include\": \"#yaml-settings\"\n                }\n            ]\n        },\n        \"yaml-settings\": {\n            \"name\": \"text.yaml.windhawk-settings\",\n            \"begin\": \".*(/\\\\*).*\",\n            \"end\": \".*(\\\\*/).*\",\n            \"beginCaptures\": {\n                \"1\": {\n                    \"name\": \"comment.block.cpp\"\n                }\n            },\n            \"endCaptures\": {\n                \"1\": {\n                    \"name\": \"comment.block.cpp\"\n                }\n            },\n            \"contentName\": \"meta.embedded.block.yaml\",\n            \"patterns\": [\n                {\n                    \"include\": \"source.yaml\"\n                }\n            ]\n        },\n        \"markdown-readme-wrapper\": {\n            \"name\": \"text.markdown.windhawk-readme-wrapper\",\n            \"begin\": \"^//[ \\t]+==WindhawkModReadme==[ \\t]*$\",\n            \"end\": \"^//[ \\t]+==/WindhawkModReadme==[ \\t]*$\",\n            \"beginCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"endCaptures\": {\n                \"0\": {\n                    \"name\": \"comment.line.double-slash.cpp\"\n                }\n            },\n            \"patterns\": [\n                {\n                    \"include\": \"#markdown-readme\"\n                }\n            ]\n        },\n        \"markdown-readme\": {\n            \"name\": \"text.markdown.windhawk-readme\",\n            \"begin\": \".*(/\\\\*).*\",\n            \"end\": \".*(\\\\*/).*\",\n            \"beginCaptures\": {\n                \"1\": {\n                    \"name\": \"comment.block.cpp\"\n                }\n            },\n            \"endCaptures\": {\n                \"1\": {\n                    \"name\": \"comment.block.cpp\"\n                }\n            },\n            \"contentName\": \"meta.embedded.block.markdown\",\n            \"patterns\": [\n                {\n                    \"include\": \"text.html.markdown\"\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "src/vscode-windhawk/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"module\": \"commonjs\",\n\t\t\"target\": \"es2019\",\n\t\t\"lib\": [\"ES2019\"],\n\t\t\"outDir\": \"out\",\n\t\t\"sourceMap\": true,\n\t\t\"strict\": true,\n\t\t\"rootDir\": \"src\",\n\t\t\"useUnknownInCatchVariables\": false,\n\t\t\"moduleResolution\":\"node\"\n\t},\n\t\"include\": [\n\t\t\"src/**/*.ts\",\n\t\t\"./node_modules/vscode/vscode.d.ts\",\n\t\t\"./node_modules/vscode/lib/*\",\n\t]\n}\n"
  },
  {
    "path": "src/vscode-windhawk/webpack.config.js",
    "content": "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n//@ts-check\n\n'use strict';\n\nconst path = require('path');\nconst CopyWebpackPlugin = require('copy-webpack-plugin');\n\n/**@type {import('webpack').Configuration}*/\nconst config = {\n    target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/\n\n    entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/\n    output: { // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/\n        path: path.resolve(__dirname, 'dist'),\n        filename: 'extension.js',\n        libraryTarget: \"commonjs2\",\n        devtoolModuleFilenameTemplate: \"../[resource-path]\",\n    },\n    devtool: 'source-map',\n    externals: {\n        vscode: \"commonjs vscode\" // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/\n    },\n    resolve: { // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader\n        extensions: ['.ts', '.js'],\n        alias: {\n            // Workaround for https://github.com/baudehlo/node-fs-ext/pull/104\n            './build/Release/fs-ext': './build/Release/fs-ext.node'\n        }\n    },\n    module: {\n        rules: [{\n            test: /\\.ts$/,\n            exclude: /node_modules/,\n            use: [{\n                loader: 'ts-loader',\n                options: {\n                    compilerOptions: {\n                        \"module\": \"es6\" // override `tsconfig.json` so that TypeScript emits native JavaScript modules.\n                    }\n                }\n            }]\n        },\n        {\n            test: /\\.node$/,\n            loader: \"node-loader\",\n        }]\n    },\n    plugins: [\n        new CopyWebpackPlugin({\n            patterns: [\n                { from: 'node_modules/native-reg/prebuilds', to: '../prebuilds' }\n            ]\n        })\n    ]\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.editorconfig",
    "content": "# Editor configuration, see http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\nmax_line_length = off\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.eslintrc.json",
    "content": "{\n  \"root\": true,\n  \"ignorePatterns\": [\"**/*\"],\n  \"plugins\": [\"@nrwl/nx\"],\n  \"overrides\": [\n    {\n      \"files\": [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n      \"rules\": {\n        \"@nrwl/nx/enforce-module-boundaries\": [\n          \"error\",\n          {\n            \"enforceBuildableLibDependency\": true,\n            \"allow\": [],\n            \"depConstraints\": [\n              {\n                \"sourceTag\": \"*\",\n                \"onlyDependOnLibsWithTags\": [\"*\"]\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"files\": [\"*.ts\", \"*.tsx\"],\n      \"extends\": [\"plugin:@nrwl/nx/typescript\"],\n      \"rules\": {}\n    },\n    {\n      \"files\": [\"*.js\", \"*.jsx\"],\n      \"extends\": [\"plugin:@nrwl/nx/javascript\"],\n      \"rules\": {}\n    },\n    {\n      \"files\": [\"*.spec.ts\", \"*.spec.tsx\", \"*.spec.js\", \"*.spec.jsx\"],\n      \"env\": {\n        \"jest\": true\n      },\n      \"rules\": {}\n    }\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\ndist\ntmp\n/out-tsc\n\n# dependencies\nnode_modules\n\n# IDEs and editors\n/.idea\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\n\n# IDE - VSCode\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n\n# misc\n/.sass-cache\n/connect.lock\n/coverage\n/libpeerconnection.log\nnpm-debug.log\nyarn-error.log\ntestem.log\n/typings\n\n# System Files\n.DS_Store\nThumbs.db\n\n.nx/cache\n.nx/workspace-data\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.prettierignore",
    "content": "# Add files here to ignore them from prettier formatting\n\n/dist\n/coverage\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.prettierrc",
    "content": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"nrwl.angular-console\",\n    \"esbenp.prettier-vscode\",\n    \"firsttris.vscode-jest-runner\",\n    \"dbaeumer.vscode-eslint\"\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/.gitkeep",
    "content": ""
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/.babelrc",
    "content": "{\n  \"presets\": [\n    [\n      \"@nrwl/react/babel\",\n      {\n        \"runtime\": \"automatic\"\n      }\n    ]\n  ],\n  \"plugins\": [[\"styled-components\", { \"pure\": true, \"ssr\": true }]]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/.browserslistrc",
    "content": "# This file is used by:\n# 1. autoprefixer to adjust CSS to support the below specified browsers\n# 2. babel preset-env to adjust included polyfills\n#\n# For additional information regarding the format and rule options, please see:\n# https://github.com/browserslist/browserslist#queries\n#\n# If you need to support different browsers in production, you may tweak the list below.\n\nlast 1 Chrome version\nlast 1 Firefox version\nlast 2 Edge major versions\nlast 2 Safari major version\nlast 2 iOS major versions\nFirefox ESR\nnot IE 9-11 # For IE 9-11 support, remove 'not'."
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/.eslintrc.json",
    "content": "{\n  \"extends\": [\"plugin:@nrwl/nx/react\", \"../../.eslintrc.json\"],\n  \"ignorePatterns\": [\"!**/*\"],\n  \"overrides\": [\n    {\n      \"files\": [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n      \"rules\": {}\n    },\n    {\n      \"files\": [\"*.ts\", \"*.tsx\"],\n      \"rules\": {}\n    },\n    {\n      \"files\": [\"*.js\", \"*.jsx\"],\n      \"rules\": {}\n    }\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/jest.config.ts",
    "content": "/* eslint-disable */\nexport default {\n  displayName: 'vscode-windhawk-ui',\n  preset: '../../jest.preset.js',\n  transform: {\n    '^(?!.*\\\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest',\n    '^.+\\\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }],\n  },\n  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],\n  coverageDirectory: '../../coverage/apps/vscode-windhawk-ui',\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/project.json",
    "content": "{\n  \"name\": \"vscode-windhawk-ui\",\n  \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n  \"sourceRoot\": \"apps/vscode-windhawk-ui/src\",\n  \"projectType\": \"application\",\n  \"targets\": {\n    \"build\": {\n      \"executor\": \"@nrwl/webpack:webpack\",\n      \"outputs\": [\"{options.outputPath}\"],\n      \"defaultConfiguration\": \"production\",\n      \"options\": {\n        \"compiler\": \"babel\",\n        \"outputPath\": \"dist/apps/vscode-windhawk-ui\",\n        \"index\": \"apps/vscode-windhawk-ui/src/index.html\",\n        \"main\": \"apps/vscode-windhawk-ui/src/main.tsx\",\n        \"polyfills\": \"apps/vscode-windhawk-ui/src/polyfills.ts\",\n        \"tsConfig\": \"apps/vscode-windhawk-ui/tsconfig.app.json\",\n        \"assets\": [\n          \"apps/vscode-windhawk-ui/src/favicon.ico\",\n          \"apps/vscode-windhawk-ui/src/locales\"\n        ],\n        \"styles\": [],\n        \"scripts\": [],\n        \"webpackConfig\": \"apps/vscode-windhawk-ui/webpack.config.js\"\n      },\n      \"configurations\": {\n        \"development\": {\n          \"extractLicenses\": false,\n          \"optimization\": false,\n          \"sourceMap\": true,\n          \"vendorChunk\": true\n        },\n        \"production\": {\n          \"fileReplacements\": [\n            {\n              \"replace\": \"apps/vscode-windhawk-ui/src/environments/environment.ts\",\n              \"with\": \"apps/vscode-windhawk-ui/src/environments/environment.prod.ts\"\n            }\n          ],\n          \"optimization\": true,\n          \"outputHashing\": \"all\",\n          \"sourceMap\": false,\n          \"namedChunks\": false,\n          \"extractLicenses\": true,\n          \"vendorChunk\": false\n        }\n      }\n    },\n    \"serve\": {\n      \"executor\": \"@nrwl/webpack:dev-server\",\n      \"defaultConfiguration\": \"development\",\n      \"options\": {\n        \"buildTarget\": \"vscode-windhawk-ui:build\",\n        \"hmr\": true\n      },\n      \"configurations\": {\n        \"development\": {\n          \"buildTarget\": \"vscode-windhawk-ui:build:development\"\n        },\n        \"production\": {\n          \"buildTarget\": \"vscode-windhawk-ui:build:production\",\n          \"hmr\": false\n        },\n        \"e2e\": {\n          \"buildTarget\": \"vscode-windhawk-ui:build:development\",\n          \"port\": 4201\n        }\n      }\n    },\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\"{options.outputFile}\"],\n      \"options\": {\n        \"lintFilePatterns\": [\"apps/vscode-windhawk-ui/**/*.{ts,tsx,js,jsx}\"]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nrwl/jest:jest\",\n      \"outputs\": [\"{workspaceRoot}/coverage/{projectRoot}\"],\n      \"options\": {\n        \"jestConfig\": \"apps/vscode-windhawk-ui/jest.config.ts\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/app.css",
    "content": "/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n[class^=ant-]::-ms-clear,\n[class*= ant-]::-ms-clear,\n[class^=ant-] input::-ms-clear,\n[class*= ant-] input::-ms-clear,\n[class^=ant-] input::-ms-reveal,\n[class*= ant-] input::-ms-reveal {\n  display: none;\n}\n/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */\nhtml,\nbody {\n  width: 100%;\n  height: 100%;\n}\ninput::-ms-clear,\ninput::-ms-reveal {\n  display: none;\n}\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n@-ms-viewport {\n  width: device-width;\n}\nbody {\n  margin: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  background-color: var(--app-background-color);\n  font-feature-settings: 'tnum';\n}\n[tabindex='-1']:focus {\n  outline: none !important;\n}\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin-top: 0;\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n}\np {\n  margin-top: 0;\n  margin-bottom: 1em;\n}\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  text-decoration: underline dotted;\n  border-bottom: 0;\n  cursor: help;\n}\naddress {\n  margin-bottom: 1em;\n  font-style: normal;\n  line-height: inherit;\n}\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n  -webkit-appearance: none;\n}\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1em;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\ndt {\n  font-weight: 500;\n}\ndd {\n  margin-bottom: 0.5em;\n  margin-left: 0;\n}\nblockquote {\n  margin: 0 0 1em;\n}\ndfn {\n  font-style: italic;\n}\nb,\nstrong {\n  font-weight: bolder;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsub {\n  bottom: -0.25em;\n}\nsup {\n  top: -0.5em;\n}\na {\n  color: #177ddc;\n  text-decoration: none;\n  background-color: transparent;\n  outline: none;\n  cursor: pointer;\n  transition: color 0.3s;\n  -webkit-text-decoration-skip: objects;\n}\na:hover {\n  color: #165996;\n}\na:active {\n  color: #388ed3;\n}\na:active,\na:hover {\n  text-decoration: none;\n  outline: 0;\n}\na:focus {\n  text-decoration: none;\n  outline: 0;\n}\na[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\npre,\ncode,\nkbd,\nsamp {\n  font-size: 1em;\n  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n}\npre {\n  margin-top: 0;\n  margin-bottom: 1em;\n  overflow: auto;\n}\nfigure {\n  margin: 0 0 1em;\n}\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n  touch-action: manipulation;\n}\ntable {\n  border-collapse: collapse;\n}\ncaption {\n  padding-top: 0.75em;\n  padding-bottom: 0.3em;\n  color: rgba(255, 255, 255, 0.45);\n  text-align: left;\n  caption-side: bottom;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  color: inherit;\n  font-size: inherit;\n  font-family: inherit;\n  line-height: inherit;\n}\nbutton,\ninput {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\ninput[type='radio'],\ninput[type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n  -webkit-appearance: listbox;\n}\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\nfieldset {\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 0.5em;\n  padding: 0;\n  color: inherit;\n  font-size: 1.5em;\n  line-height: inherit;\n  white-space: normal;\n}\nprogress {\n  vertical-align: baseline;\n}\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n  height: auto;\n}\n[type='search'] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\noutput {\n  display: inline-block;\n}\nsummary {\n  display: list-item;\n}\ntemplate {\n  display: none;\n}\n[hidden] {\n  display: none !important;\n}\nmark {\n  padding: 0.2em;\n  background-color: #2b2611;\n}\n::selection {\n  color: #fff;\n  background: #177ddc;\n}\n.clearfix::before {\n  display: table;\n  content: '';\n}\n.clearfix::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.anticon {\n  display: inline-flex;\n  align-items: center;\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-align: center;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizelegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.anticon > * {\n  line-height: 1;\n}\n.anticon svg {\n  display: inline-block;\n}\n.anticon::before {\n  display: none;\n}\n.anticon .anticon-icon {\n  display: block;\n}\n.anticon > .anticon {\n  line-height: 0;\n  vertical-align: 0;\n}\n.anticon[tabindex] {\n  cursor: pointer;\n}\n.anticon-spin,\n.anticon-spin::before {\n  display: inline-block;\n  animation: loadingCircle 1s infinite linear;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-fade-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-fade-enter.ant-fade-enter-active,\n.ant-fade-appear.ant-fade-appear-active {\n  animation-name: antFadeIn;\n  animation-play-state: running;\n}\n.ant-fade-leave.ant-fade-leave-active {\n  animation-name: antFadeOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-fade-enter,\n.ant-fade-appear {\n  opacity: 0;\n  animation-timing-function: linear;\n}\n.ant-fade-leave {\n  animation-timing-function: linear;\n}\n@keyframes antFadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes antFadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-up-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-up-enter.ant-move-up-enter-active,\n.ant-move-up-appear.ant-move-up-appear-active {\n  animation-name: antMoveUpIn;\n  animation-play-state: running;\n}\n.ant-move-up-leave.ant-move-up-leave-active {\n  animation-name: antMoveUpOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-move-up-enter,\n.ant-move-up-appear {\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-up-leave {\n  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-down-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-down-enter.ant-move-down-enter-active,\n.ant-move-down-appear.ant-move-down-appear-active {\n  animation-name: antMoveDownIn;\n  animation-play-state: running;\n}\n.ant-move-down-leave.ant-move-down-leave-active {\n  animation-name: antMoveDownOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-move-down-enter,\n.ant-move-down-appear {\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-down-leave {\n  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-left-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-left-enter.ant-move-left-enter-active,\n.ant-move-left-appear.ant-move-left-appear-active {\n  animation-name: antMoveLeftIn;\n  animation-play-state: running;\n}\n.ant-move-left-leave.ant-move-left-leave-active {\n  animation-name: antMoveLeftOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-move-left-enter,\n.ant-move-left-appear {\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-left-leave {\n  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-right-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-move-right-enter.ant-move-right-enter-active,\n.ant-move-right-appear.ant-move-right-appear-active {\n  animation-name: antMoveRightIn;\n  animation-play-state: running;\n}\n.ant-move-right-leave.ant-move-right-leave-active {\n  animation-name: antMoveRightOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-move-right-enter,\n.ant-move-right-appear {\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-move-right-leave {\n  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n}\n@keyframes antMoveDownIn {\n  0% {\n    transform: translateY(100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n  100% {\n    transform: translateY(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n}\n@keyframes antMoveDownOut {\n  0% {\n    transform: translateY(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n  100% {\n    transform: translateY(100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n}\n@keyframes antMoveLeftIn {\n  0% {\n    transform: translateX(-100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n  100% {\n    transform: translateX(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n}\n@keyframes antMoveLeftOut {\n  0% {\n    transform: translateX(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n  100% {\n    transform: translateX(-100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n}\n@keyframes antMoveRightIn {\n  0% {\n    transform: translateX(100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n  100% {\n    transform: translateX(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n}\n@keyframes antMoveRightOut {\n  0% {\n    transform: translateX(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n  100% {\n    transform: translateX(100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n}\n@keyframes antMoveUpIn {\n  0% {\n    transform: translateY(-100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n  100% {\n    transform: translateY(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n}\n@keyframes antMoveUpOut {\n  0% {\n    transform: translateY(0%);\n    transform-origin: 0 0;\n    opacity: 1;\n  }\n  100% {\n    transform: translateY(-100%);\n    transform-origin: 0 0;\n    opacity: 0;\n  }\n}\n@keyframes loadingCircle {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n[ant-click-animating='true'],\n[ant-click-animating-without-extra-node='true'] {\n  position: relative;\n}\nhtml {\n  --antd-wave-shadow-color: #177ddc;\n  --scroll-bar: 0;\n}\n[ant-click-animating-without-extra-node='true']::after,\n.ant-click-animating-node {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  display: block;\n  border-radius: inherit;\n  box-shadow: 0 0 0 0 #177ddc;\n  box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);\n  opacity: 0.2;\n  animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);\n  animation-fill-mode: forwards;\n  content: '';\n  pointer-events: none;\n}\n@keyframes waveEffect {\n  100% {\n    box-shadow: 0 0 0 #177ddc;\n    box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);\n  }\n}\n@keyframes fadeEffect {\n  100% {\n    opacity: 0;\n  }\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-up-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-up-enter.ant-slide-up-enter-active,\n.ant-slide-up-appear.ant-slide-up-appear-active {\n  animation-name: antSlideUpIn;\n  animation-play-state: running;\n}\n.ant-slide-up-leave.ant-slide-up-leave-active {\n  animation-name: antSlideUpOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-slide-up-enter,\n.ant-slide-up-appear {\n  transform: scale(0);\n  transform-origin: 0% 0%;\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-up-leave {\n  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-down-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-down-enter.ant-slide-down-enter-active,\n.ant-slide-down-appear.ant-slide-down-appear-active {\n  animation-name: antSlideDownIn;\n  animation-play-state: running;\n}\n.ant-slide-down-leave.ant-slide-down-leave-active {\n  animation-name: antSlideDownOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-slide-down-enter,\n.ant-slide-down-appear {\n  transform: scale(0);\n  transform-origin: 0% 0%;\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-down-leave {\n  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-left-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-left-enter.ant-slide-left-enter-active,\n.ant-slide-left-appear.ant-slide-left-appear-active {\n  animation-name: antSlideLeftIn;\n  animation-play-state: running;\n}\n.ant-slide-left-leave.ant-slide-left-leave-active {\n  animation-name: antSlideLeftOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-slide-left-enter,\n.ant-slide-left-appear {\n  transform: scale(0);\n  transform-origin: 0% 0%;\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-left-leave {\n  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-right-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-slide-right-enter.ant-slide-right-enter-active,\n.ant-slide-right-appear.ant-slide-right-appear-active {\n  animation-name: antSlideRightIn;\n  animation-play-state: running;\n}\n.ant-slide-right-leave.ant-slide-right-leave-active {\n  animation-name: antSlideRightOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-slide-right-enter,\n.ant-slide-right-appear {\n  transform: scale(0);\n  transform-origin: 0% 0%;\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.ant-slide-right-leave {\n  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n@keyframes antSlideUpIn {\n  0% {\n    transform: scaleY(0.8);\n    transform-origin: 0% 0%;\n    opacity: 0;\n  }\n  100% {\n    transform: scaleY(1);\n    transform-origin: 0% 0%;\n    opacity: 1;\n  }\n}\n@keyframes antSlideUpOut {\n  0% {\n    transform: scaleY(1);\n    transform-origin: 0% 0%;\n    opacity: 1;\n  }\n  100% {\n    transform: scaleY(0.8);\n    transform-origin: 0% 0%;\n    opacity: 0;\n  }\n}\n@keyframes antSlideDownIn {\n  0% {\n    transform: scaleY(0.8);\n    transform-origin: 100% 100%;\n    opacity: 0;\n  }\n  100% {\n    transform: scaleY(1);\n    transform-origin: 100% 100%;\n    opacity: 1;\n  }\n}\n@keyframes antSlideDownOut {\n  0% {\n    transform: scaleY(1);\n    transform-origin: 100% 100%;\n    opacity: 1;\n  }\n  100% {\n    transform: scaleY(0.8);\n    transform-origin: 100% 100%;\n    opacity: 0;\n  }\n}\n@keyframes antSlideLeftIn {\n  0% {\n    transform: scaleX(0.8);\n    transform-origin: 0% 0%;\n    opacity: 0;\n  }\n  100% {\n    transform: scaleX(1);\n    transform-origin: 0% 0%;\n    opacity: 1;\n  }\n}\n@keyframes antSlideLeftOut {\n  0% {\n    transform: scaleX(1);\n    transform-origin: 0% 0%;\n    opacity: 1;\n  }\n  100% {\n    transform: scaleX(0.8);\n    transform-origin: 0% 0%;\n    opacity: 0;\n  }\n}\n@keyframes antSlideRightIn {\n  0% {\n    transform: scaleX(0.8);\n    transform-origin: 100% 0%;\n    opacity: 0;\n  }\n  100% {\n    transform: scaleX(1);\n    transform-origin: 100% 0%;\n    opacity: 1;\n  }\n}\n@keyframes antSlideRightOut {\n  0% {\n    transform: scaleX(1);\n    transform-origin: 100% 0%;\n    opacity: 1;\n  }\n  100% {\n    transform: scaleX(0.8);\n    transform-origin: 100% 0%;\n    opacity: 0;\n  }\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-enter.ant-zoom-enter-active,\n.ant-zoom-appear.ant-zoom-appear-active {\n  animation-name: antZoomIn;\n  animation-play-state: running;\n}\n.ant-zoom-leave.ant-zoom-leave-active {\n  animation-name: antZoomOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-enter,\n.ant-zoom-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-enter-prepare,\n.ant-zoom-appear-prepare {\n  transform: none;\n}\n.ant-zoom-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-big-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-big-enter.ant-zoom-big-enter-active,\n.ant-zoom-big-appear.ant-zoom-big-appear-active {\n  animation-name: antZoomBigIn;\n  animation-play-state: running;\n}\n.ant-zoom-big-leave.ant-zoom-big-leave-active {\n  animation-name: antZoomBigOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-big-enter,\n.ant-zoom-big-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-enter-prepare,\n.ant-zoom-big-appear-prepare {\n  transform: none;\n}\n.ant-zoom-big-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n  animation-duration: 0.1s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-big-fast-leave {\n  animation-duration: 0.1s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,\n.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {\n  animation-name: antZoomBigIn;\n  animation-play-state: running;\n}\n.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {\n  animation-name: antZoomBigOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-big-fast-enter,\n.ant-zoom-big-fast-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-big-fast-enter-prepare,\n.ant-zoom-big-fast-appear-prepare {\n  transform: none;\n}\n.ant-zoom-big-fast-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-up-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-up-enter.ant-zoom-up-enter-active,\n.ant-zoom-up-appear.ant-zoom-up-appear-active {\n  animation-name: antZoomUpIn;\n  animation-play-state: running;\n}\n.ant-zoom-up-leave.ant-zoom-up-leave-active {\n  animation-name: antZoomUpOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-up-enter,\n.ant-zoom-up-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-up-enter-prepare,\n.ant-zoom-up-appear-prepare {\n  transform: none;\n}\n.ant-zoom-up-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-down-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-down-enter.ant-zoom-down-enter-active,\n.ant-zoom-down-appear.ant-zoom-down-appear-active {\n  animation-name: antZoomDownIn;\n  animation-play-state: running;\n}\n.ant-zoom-down-leave.ant-zoom-down-leave-active {\n  animation-name: antZoomDownOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-down-enter,\n.ant-zoom-down-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-down-enter-prepare,\n.ant-zoom-down-appear-prepare {\n  transform: none;\n}\n.ant-zoom-down-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-left-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-left-enter.ant-zoom-left-enter-active,\n.ant-zoom-left-appear.ant-zoom-left-appear-active {\n  animation-name: antZoomLeftIn;\n  animation-play-state: running;\n}\n.ant-zoom-left-leave.ant-zoom-left-leave-active {\n  animation-name: antZoomLeftOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-left-enter,\n.ant-zoom-left-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-left-enter-prepare,\n.ant-zoom-left-appear-prepare {\n  transform: none;\n}\n.ant-zoom-left-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-right-leave {\n  animation-duration: 0.2s;\n  animation-fill-mode: both;\n  animation-play-state: paused;\n}\n.ant-zoom-right-enter.ant-zoom-right-enter-active,\n.ant-zoom-right-appear.ant-zoom-right-appear-active {\n  animation-name: antZoomRightIn;\n  animation-play-state: running;\n}\n.ant-zoom-right-leave.ant-zoom-right-leave-active {\n  animation-name: antZoomRightOut;\n  animation-play-state: running;\n  pointer-events: none;\n}\n.ant-zoom-right-enter,\n.ant-zoom-right-appear {\n  transform: scale(0);\n  opacity: 0;\n  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);\n}\n.ant-zoom-right-enter-prepare,\n.ant-zoom-right-appear-prepare {\n  transform: none;\n}\n.ant-zoom-right-leave {\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n@keyframes antZoomIn {\n  0% {\n    transform: scale(0.2);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@keyframes antZoomOut {\n  0% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0.2);\n    opacity: 0;\n  }\n}\n@keyframes antZoomBigIn {\n  0% {\n    transform: scale(0.8);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@keyframes antZoomBigOut {\n  0% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0.8);\n    opacity: 0;\n  }\n}\n@keyframes antZoomUpIn {\n  0% {\n    transform: scale(0.8);\n    transform-origin: 50% 0%;\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    transform-origin: 50% 0%;\n  }\n}\n@keyframes antZoomUpOut {\n  0% {\n    transform: scale(1);\n    transform-origin: 50% 0%;\n  }\n  100% {\n    transform: scale(0.8);\n    transform-origin: 50% 0%;\n    opacity: 0;\n  }\n}\n@keyframes antZoomLeftIn {\n  0% {\n    transform: scale(0.8);\n    transform-origin: 0% 50%;\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    transform-origin: 0% 50%;\n  }\n}\n@keyframes antZoomLeftOut {\n  0% {\n    transform: scale(1);\n    transform-origin: 0% 50%;\n  }\n  100% {\n    transform: scale(0.8);\n    transform-origin: 0% 50%;\n    opacity: 0;\n  }\n}\n@keyframes antZoomRightIn {\n  0% {\n    transform: scale(0.8);\n    transform-origin: 100% 50%;\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    transform-origin: 100% 50%;\n  }\n}\n@keyframes antZoomRightOut {\n  0% {\n    transform: scale(1);\n    transform-origin: 100% 50%;\n  }\n  100% {\n    transform: scale(0.8);\n    transform-origin: 100% 50%;\n    opacity: 0;\n  }\n}\n@keyframes antZoomDownIn {\n  0% {\n    transform: scale(0.8);\n    transform-origin: 50% 100%;\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    transform-origin: 50% 100%;\n  }\n}\n@keyframes antZoomDownOut {\n  0% {\n    transform: scale(1);\n    transform-origin: 50% 100%;\n  }\n  100% {\n    transform: scale(0.8);\n    transform-origin: 50% 100%;\n    opacity: 0;\n  }\n}\n.ant-motion-collapse-legacy {\n  overflow: hidden;\n}\n.ant-motion-collapse-legacy-active {\n  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-motion-collapse {\n  overflow: hidden;\n  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-affix {\n  position: fixed;\n  z-index: 10;\n}\n.ant-alert {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: flex;\n  align-items: center;\n  padding: 8px 15px;\n  word-wrap: break-word;\n  border-radius: 2px;\n}\n.ant-alert-content {\n  flex: 1;\n  min-width: 0;\n}\n.ant-alert-icon {\n  margin-right: 8px;\n}\n.ant-alert-description {\n  display: none;\n  font-size: 14px;\n  line-height: 22px;\n}\n.ant-alert-success {\n  background-color: #162312;\n  border: 1px solid #274916;\n}\n.ant-alert-success .ant-alert-icon {\n  color: #49aa19;\n}\n.ant-alert-info {\n  background-color: #111b26;\n  border: 1px solid #153450;\n}\n.ant-alert-info .ant-alert-icon {\n  color: #177ddc;\n}\n.ant-alert-warning {\n  background-color: #2b2111;\n  border: 1px solid #594214;\n}\n.ant-alert-warning .ant-alert-icon {\n  color: #d89614;\n}\n.ant-alert-error {\n  background-color: #2a1215;\n  border: 1px solid #58181c;\n}\n.ant-alert-error .ant-alert-icon {\n  color: #a61d24;\n}\n.ant-alert-error .ant-alert-description > pre {\n  margin: 0;\n  padding: 0;\n}\n.ant-alert-action {\n  margin-left: 8px;\n}\n.ant-alert-close-icon {\n  margin-left: 8px;\n  padding: 0;\n  overflow: hidden;\n  font-size: 12px;\n  line-height: 12px;\n  background-color: transparent;\n  border: none;\n  outline: none;\n  cursor: pointer;\n}\n.ant-alert-close-icon .anticon-close {\n  color: rgba(255, 255, 255, 0.45);\n  transition: color 0.3s;\n}\n.ant-alert-close-icon .anticon-close:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n.ant-alert-close-text {\n  color: rgba(255, 255, 255, 0.45);\n  transition: color 0.3s;\n}\n.ant-alert-close-text:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n.ant-alert-with-description {\n  align-items: flex-start;\n  padding: 15px 15px 15px 24px;\n}\n.ant-alert-with-description.ant-alert-no-icon {\n  padding: 15px 15px;\n}\n.ant-alert-with-description .ant-alert-icon {\n  margin-right: 15px;\n  font-size: 24px;\n}\n.ant-alert-with-description .ant-alert-message {\n  display: block;\n  margin-bottom: 4px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n}\n.ant-alert-message {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-alert-with-description .ant-alert-description {\n  display: block;\n}\n.ant-alert.ant-alert-motion-leave {\n  overflow: hidden;\n  opacity: 1;\n  transition: max-height 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), opacity 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), padding-top 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), padding-bottom 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), margin-bottom 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-alert.ant-alert-motion-leave-active {\n  max-height: 0;\n  margin-bottom: 0 !important;\n  padding-top: 0;\n  padding-bottom: 0;\n  opacity: 0;\n}\n.ant-alert-banner {\n  margin-bottom: 0;\n  border: 0;\n  border-radius: 0;\n}\n.ant-alert.ant-alert-rtl {\n  direction: rtl;\n}\n.ant-alert-rtl .ant-alert-icon {\n  margin-right: auto;\n  margin-left: 8px;\n}\n.ant-alert-rtl .ant-alert-action {\n  margin-right: 8px;\n  margin-left: auto;\n}\n.ant-alert-rtl .ant-alert-close-icon {\n  margin-right: 8px;\n  margin-left: auto;\n}\n.ant-alert-rtl.ant-alert-with-description {\n  padding-right: 24px;\n  padding-left: 15px;\n}\n.ant-alert-rtl.ant-alert-with-description .ant-alert-icon {\n  margin-right: auto;\n  margin-left: 15px;\n}\n.ant-anchor {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  padding-left: 2px;\n}\n.ant-anchor-wrapper {\n  margin-left: -4px;\n  padding-left: 4px;\n  overflow: auto;\n  background-color: transparent;\n}\n.ant-anchor-ink {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n}\n.ant-anchor-ink::before {\n  position: relative;\n  display: block;\n  width: 2px;\n  height: 100%;\n  margin: 0 auto;\n  background-color: #303030;\n  content: ' ';\n}\n.ant-anchor-ink-ball {\n  position: absolute;\n  left: 50%;\n  display: none;\n  width: 8px;\n  height: 8px;\n  background-color: #141414;\n  border: 2px solid #177ddc;\n  border-radius: 8px;\n  transform: translateX(-50%);\n  transition: top 0.3s ease-in-out;\n}\n.ant-anchor-ink-ball.ant-anchor-ink-ball-visible {\n  display: inline-block;\n}\n.ant-anchor-fixed .ant-anchor-ink .ant-anchor-ink-ball {\n  display: none;\n}\n.ant-anchor-link {\n  padding: 4px 0 4px 16px;\n}\n.ant-anchor-link-title {\n  position: relative;\n  display: block;\n  margin-bottom: 3px;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  transition: all 0.3s;\n}\n.ant-anchor-link-title:only-child {\n  margin-bottom: 0;\n}\n.ant-anchor-link-active > .ant-anchor-link-title {\n  color: #177ddc;\n}\n.ant-anchor-link .ant-anchor-link {\n  padding-top: 2px;\n  padding-bottom: 2px;\n}\n.ant-anchor-rtl {\n  direction: rtl;\n}\n.ant-anchor-rtl.ant-anchor-wrapper {\n  margin-right: -4px;\n  margin-left: 0;\n  padding-right: 4px;\n  padding-left: 0;\n}\n.ant-anchor-rtl .ant-anchor-ink {\n  right: 0;\n  left: auto;\n}\n.ant-anchor-rtl .ant-anchor-ink-ball {\n  right: 50%;\n  left: 0;\n  transform: translateX(50%);\n}\n.ant-anchor-rtl .ant-anchor-link {\n  padding: 4px 16px 4px 0;\n}\n.ant-select-auto-complete {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n}\n.ant-select-auto-complete .ant-select-clear {\n  right: 13px;\n}\n.ant-avatar {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-block;\n  overflow: hidden;\n  color: #fff;\n  white-space: nowrap;\n  text-align: center;\n  vertical-align: middle;\n  background: rgba(255, 255, 255, 0.3);\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n  border-radius: 50%;\n}\n.ant-avatar-image {\n  background: transparent;\n}\n.ant-avatar .ant-image-img {\n  display: block;\n}\n.ant-avatar-string {\n  position: absolute;\n  left: 50%;\n  transform-origin: 0 center;\n}\n.ant-avatar.ant-avatar-icon {\n  font-size: 18px;\n}\n.ant-avatar.ant-avatar-icon > .anticon {\n  margin: 0;\n}\n.ant-avatar-lg {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  border-radius: 50%;\n}\n.ant-avatar-lg-string {\n  position: absolute;\n  left: 50%;\n  transform-origin: 0 center;\n}\n.ant-avatar-lg.ant-avatar-icon {\n  font-size: 24px;\n}\n.ant-avatar-lg.ant-avatar-icon > .anticon {\n  margin: 0;\n}\n.ant-avatar-sm {\n  width: 24px;\n  height: 24px;\n  line-height: 24px;\n  border-radius: 50%;\n}\n.ant-avatar-sm-string {\n  position: absolute;\n  left: 50%;\n  transform-origin: 0 center;\n}\n.ant-avatar-sm.ant-avatar-icon {\n  font-size: 14px;\n}\n.ant-avatar-sm.ant-avatar-icon > .anticon {\n  margin: 0;\n}\n.ant-avatar-square {\n  border-radius: 2px;\n}\n.ant-avatar > img {\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n.ant-avatar-group {\n  display: inline-flex;\n}\n.ant-avatar-group .ant-avatar {\n  border: 1px solid #fff;\n}\n.ant-avatar-group .ant-avatar:not(:first-child) {\n  margin-left: -8px;\n}\n.ant-avatar-group-popover .ant-avatar + .ant-avatar {\n  margin-left: 3px;\n}\n.ant-avatar-group-rtl .ant-avatar:not(:first-child) {\n  margin-right: -8px;\n  margin-left: 0;\n}\n.ant-avatar-group-popover.ant-popover-rtl .ant-avatar + .ant-avatar {\n  margin-right: 3px;\n  margin-left: 0;\n}\n.ant-back-top {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: fixed;\n  right: 100px;\n  bottom: 50px;\n  z-index: 10;\n  width: 40px;\n  height: 40px;\n  cursor: pointer;\n}\n.ant-back-top:empty {\n  display: none;\n}\n.ant-back-top-rtl {\n  right: auto;\n  left: 100px;\n  direction: rtl;\n}\n.ant-back-top-content {\n  width: 40px;\n  height: 40px;\n  overflow: hidden;\n  color: #fff;\n  text-align: center;\n  background-color: rgba(255, 255, 255, 0.45);\n  border-radius: 20px;\n  transition: all 0.3s;\n}\n.ant-back-top-content:hover {\n  background-color: rgba(255, 255, 255, 0.85);\n  transition: all 0.3s;\n}\n.ant-back-top-icon {\n  font-size: 24px;\n  line-height: 40px;\n}\n@media screen and (max-width: 768px) {\n  .ant-back-top {\n    right: 60px;\n  }\n  .ant-back-top-rtl {\n    right: auto;\n    left: 60px;\n  }\n}\n@media screen and (max-width: 480px) {\n  .ant-back-top {\n    right: 20px;\n  }\n  .ant-back-top-rtl {\n    right: auto;\n    left: 20px;\n  }\n}\n.ant-badge {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-block;\n  line-height: 1;\n}\n.ant-badge-count {\n  z-index: auto;\n  min-width: 20px;\n  height: 20px;\n  padding: 0 6px;\n  color: #fff;\n  font-weight: normal;\n  font-size: 12px;\n  line-height: 20px;\n  white-space: nowrap;\n  text-align: center;\n  background: #a61d24;\n  border-radius: 10px;\n  box-shadow: 0 0 0 1px #141414;\n}\n.ant-badge-count a,\n.ant-badge-count a:hover {\n  color: #fff;\n}\n.ant-badge-count-sm {\n  min-width: 14px;\n  height: 14px;\n  padding: 0;\n  font-size: 12px;\n  line-height: 14px;\n  border-radius: 7px;\n}\n.ant-badge-multiple-words {\n  padding: 0 8px;\n}\n.ant-badge-dot {\n  z-index: auto;\n  width: 6px;\n  min-width: 6px;\n  height: 6px;\n  background: #a61d24;\n  border-radius: 100%;\n  box-shadow: 0 0 0 1px #141414;\n}\n.ant-badge-dot.ant-scroll-number {\n  transition: background 1.5s;\n}\n.ant-badge-count,\n.ant-badge-dot,\n.ant-badge .ant-scroll-number-custom-component {\n  position: absolute;\n  top: 0;\n  right: 0;\n  transform: translate(50%, -50%);\n  transform-origin: 100% 0%;\n}\n.ant-badge-count.anticon-spin,\n.ant-badge-dot.anticon-spin,\n.ant-badge .ant-scroll-number-custom-component.anticon-spin {\n  animation: antBadgeLoadingCircle 1s infinite linear;\n}\n.ant-badge-status {\n  line-height: inherit;\n  vertical-align: baseline;\n}\n.ant-badge-status-dot {\n  position: relative;\n  top: -1px;\n  display: inline-block;\n  width: 6px;\n  height: 6px;\n  vertical-align: middle;\n  border-radius: 50%;\n}\n.ant-badge-status-success {\n  background-color: #49aa19;\n}\n.ant-badge-status-processing {\n  position: relative;\n  background-color: #177ddc;\n}\n.ant-badge-status-processing::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 50%;\n  animation: antStatusProcessing 1.2s infinite ease-in-out;\n  content: '';\n}\n.ant-badge-status-default {\n  background-color: #d9d9d9;\n}\n.ant-badge-status-error {\n  background-color: #a61d24;\n}\n.ant-badge-status-warning {\n  background-color: #d89614;\n}\n.ant-badge-status-pink {\n  background: #cb2b83;\n}\n.ant-badge-status-magenta {\n  background: #cb2b83;\n}\n.ant-badge-status-red {\n  background: #d32029;\n}\n.ant-badge-status-volcano {\n  background: #d84a1b;\n}\n.ant-badge-status-orange {\n  background: #d87a16;\n}\n.ant-badge-status-yellow {\n  background: #d8bd14;\n}\n.ant-badge-status-gold {\n  background: #d89614;\n}\n.ant-badge-status-cyan {\n  background: #13a8a8;\n}\n.ant-badge-status-lime {\n  background: #8bbb11;\n}\n.ant-badge-status-green {\n  background: #49aa19;\n}\n.ant-badge-status-blue {\n  background: #177ddc;\n}\n.ant-badge-status-geekblue {\n  background: #2b4acb;\n}\n.ant-badge-status-purple {\n  background: #642ab5;\n}\n.ant-badge-status-text {\n  margin-left: 8px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n}\n.ant-badge-zoom-appear,\n.ant-badge-zoom-enter {\n  animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n  animation-fill-mode: both;\n}\n.ant-badge-zoom-leave {\n  animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n  animation-fill-mode: both;\n}\n.ant-badge-not-a-wrapper .ant-badge-zoom-appear,\n.ant-badge-not-a-wrapper .ant-badge-zoom-enter {\n  animation: antNoWrapperZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n}\n.ant-badge-not-a-wrapper .ant-badge-zoom-leave {\n  animation: antNoWrapperZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);\n}\n.ant-badge-not-a-wrapper:not(.ant-badge-status) {\n  vertical-align: middle;\n}\n.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,\n.ant-badge-not-a-wrapper .ant-badge-count {\n  transform: none;\n}\n.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,\n.ant-badge-not-a-wrapper .ant-scroll-number {\n  position: relative;\n  top: auto;\n  display: block;\n  transform-origin: 50% 50%;\n}\n@keyframes antStatusProcessing {\n  0% {\n    transform: scale(0.8);\n    opacity: 0.5;\n  }\n  100% {\n    transform: scale(2.4);\n    opacity: 0;\n  }\n}\n.ant-scroll-number {\n  overflow: hidden;\n  direction: ltr;\n}\n.ant-scroll-number-only {\n  position: relative;\n  display: inline-block;\n  height: 20px;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  /* stylelint-disable property-no-vendor-prefix */\n  -webkit-transform-style: preserve-3d;\n  -webkit-backface-visibility: hidden;\n  /* stylelint-enable property-no-vendor-prefix */\n}\n.ant-scroll-number-only > p.ant-scroll-number-only-unit {\n  height: 20px;\n  margin: 0;\n  /* stylelint-disable property-no-vendor-prefix */\n  -webkit-transform-style: preserve-3d;\n  -webkit-backface-visibility: hidden;\n  /* stylelint-enable property-no-vendor-prefix */\n}\n.ant-scroll-number-symbol {\n  vertical-align: top;\n}\n@keyframes antZoomBadgeIn {\n  0% {\n    transform: scale(0) translate(50%, -50%);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1) translate(50%, -50%);\n  }\n}\n@keyframes antZoomBadgeOut {\n  0% {\n    transform: scale(1) translate(50%, -50%);\n  }\n  100% {\n    transform: scale(0) translate(50%, -50%);\n    opacity: 0;\n  }\n}\n@keyframes antNoWrapperZoomBadgeIn {\n  0% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n@keyframes antNoWrapperZoomBadgeOut {\n  0% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0);\n    opacity: 0;\n  }\n}\n@keyframes antBadgeLoadingCircle {\n  0% {\n    transform-origin: 50%;\n  }\n  100% {\n    transform: translate(50%, -50%) rotate(360deg);\n    transform-origin: 50%;\n  }\n}\n.ant-ribbon-wrapper {\n  position: relative;\n}\n.ant-ribbon {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: 8px;\n  height: 22px;\n  padding: 0 8px;\n  color: #fff;\n  line-height: 22px;\n  white-space: nowrap;\n  background-color: #177ddc;\n  border-radius: 2px;\n}\n.ant-ribbon-text {\n  color: #fff;\n}\n.ant-ribbon-corner {\n  position: absolute;\n  top: 100%;\n  width: 8px;\n  height: 8px;\n  color: currentcolor;\n  border: 4px solid;\n  transform: scaleY(0.75);\n  transform-origin: top;\n}\n.ant-ribbon-corner::after {\n  position: absolute;\n  top: -4px;\n  left: -4px;\n  width: inherit;\n  height: inherit;\n  color: rgba(0, 0, 0, 0.25);\n  border: inherit;\n  content: '';\n}\n.ant-ribbon-color-pink {\n  color: #cb2b83;\n  background: #cb2b83;\n}\n.ant-ribbon-color-magenta {\n  color: #cb2b83;\n  background: #cb2b83;\n}\n.ant-ribbon-color-red {\n  color: #d32029;\n  background: #d32029;\n}\n.ant-ribbon-color-volcano {\n  color: #d84a1b;\n  background: #d84a1b;\n}\n.ant-ribbon-color-orange {\n  color: #d87a16;\n  background: #d87a16;\n}\n.ant-ribbon-color-yellow {\n  color: #d8bd14;\n  background: #d8bd14;\n}\n.ant-ribbon-color-gold {\n  color: #d89614;\n  background: #d89614;\n}\n.ant-ribbon-color-cyan {\n  color: #13a8a8;\n  background: #13a8a8;\n}\n.ant-ribbon-color-lime {\n  color: #8bbb11;\n  background: #8bbb11;\n}\n.ant-ribbon-color-green {\n  color: #49aa19;\n  background: #49aa19;\n}\n.ant-ribbon-color-blue {\n  color: #177ddc;\n  background: #177ddc;\n}\n.ant-ribbon-color-geekblue {\n  color: #2b4acb;\n  background: #2b4acb;\n}\n.ant-ribbon-color-purple {\n  color: #642ab5;\n  background: #642ab5;\n}\n.ant-ribbon.ant-ribbon-placement-end {\n  right: -8px;\n  border-bottom-right-radius: 0;\n}\n.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner {\n  right: 0;\n  border-color: currentcolor transparent transparent currentcolor;\n}\n.ant-ribbon.ant-ribbon-placement-start {\n  left: -8px;\n  border-bottom-left-radius: 0;\n}\n.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner {\n  left: 0;\n  border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-badge-rtl {\n  direction: rtl;\n}\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component {\n  right: auto;\n  left: 0;\n  direction: ltr;\n  transform: translate(-50%, -50%);\n  transform-origin: 0% 0%;\n}\n.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component {\n  right: auto;\n  left: 0;\n  transform: translate(-50%, -50%);\n  transform-origin: 0% 0%;\n}\n.ant-badge-rtl .ant-badge-status-text {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter {\n  animation-name: antZoomBadgeInRtl;\n}\n.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave {\n  animation-name: antZoomBadgeOutRtl;\n}\n.ant-ribbon-rtl {\n  direction: rtl;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end {\n  right: unset;\n  left: -8px;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 0;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner {\n  right: unset;\n  left: 0;\n  border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner::after {\n  border-color: currentcolor currentcolor transparent transparent;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start {\n  right: -8px;\n  left: unset;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner {\n  right: 0;\n  left: unset;\n  border-color: currentcolor transparent transparent currentcolor;\n}\n.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner::after {\n  border-color: currentcolor transparent transparent currentcolor;\n}\n@keyframes antZoomBadgeInRtl {\n  0% {\n    transform: scale(0) translate(-50%, -50%);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1) translate(-50%, -50%);\n  }\n}\n@keyframes antZoomBadgeOutRtl {\n  0% {\n    transform: scale(1) translate(-50%, -50%);\n  }\n  100% {\n    transform: scale(0) translate(-50%, -50%);\n    opacity: 0;\n  }\n}\n.ant-breadcrumb {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-breadcrumb .anticon {\n  font-size: 14px;\n}\n.ant-breadcrumb ol {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ant-breadcrumb a {\n  color: rgba(255, 255, 255, 0.45);\n  transition: color 0.3s;\n}\n.ant-breadcrumb a:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-breadcrumb li:last-child {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-breadcrumb li:last-child a {\n  color: rgba(255, 255, 255, 0.85);\n}\nli:last-child > .ant-breadcrumb-separator {\n  display: none;\n}\n.ant-breadcrumb-separator {\n  margin: 0 8px;\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-breadcrumb-link > .anticon + span,\n.ant-breadcrumb-link > .anticon + a {\n  margin-left: 4px;\n}\n.ant-breadcrumb-overlay-link > .anticon {\n  margin-left: 4px;\n}\n.ant-breadcrumb-rtl {\n  direction: rtl;\n}\n.ant-breadcrumb-rtl::before {\n  display: table;\n  content: '';\n}\n.ant-breadcrumb-rtl::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-breadcrumb-rtl::before {\n  display: table;\n  content: '';\n}\n.ant-breadcrumb-rtl::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-breadcrumb-rtl > span {\n  float: right;\n}\n.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + span,\n.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + a {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link > .anticon {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-btn {\n  line-height: 1.5715;\n  position: relative;\n  display: inline-block;\n  font-weight: 400;\n  white-space: nowrap;\n  text-align: center;\n  background-image: none;\n  border: 1px solid transparent;\n  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);\n  cursor: pointer;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  user-select: none;\n  touch-action: manipulation;\n  height: 32px;\n  padding: 4px 15px;\n  font-size: 14px;\n  border-radius: 2px;\n  color: rgba(255, 255, 255, 0.85);\n  border-color: #434343;\n  background: transparent;\n}\n.ant-btn > .anticon {\n  line-height: 1;\n}\n.ant-btn,\n.ant-btn:active,\n.ant-btn:focus {\n  outline: 0;\n}\n.ant-btn:not([disabled]):hover {\n  text-decoration: none;\n}\n.ant-btn:not([disabled]):active {\n  outline: 0;\n  box-shadow: none;\n}\n.ant-btn[disabled] {\n  cursor: not-allowed;\n}\n.ant-btn[disabled] > * {\n  pointer-events: none;\n}\n.ant-btn-lg {\n  height: 40px;\n  padding: 6.4px 15px;\n  font-size: 16px;\n  border-radius: 2px;\n}\n.ant-btn-sm {\n  height: 24px;\n  padding: 0px 7px;\n  font-size: 14px;\n  border-radius: 2px;\n}\n.ant-btn > a:only-child {\n  color: currentcolor;\n}\n.ant-btn > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn:hover,\n.ant-btn:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn:hover > a:only-child,\n.ant-btn:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn:hover > a:only-child::after,\n.ant-btn:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn[disabled],\n.ant-btn[disabled]:hover,\n.ant-btn[disabled]:focus,\n.ant-btn[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn[disabled] > a:only-child,\n.ant-btn[disabled]:hover > a:only-child,\n.ant-btn[disabled]:focus > a:only-child,\n.ant-btn[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn[disabled] > a:only-child::after,\n.ant-btn[disabled]:hover > a:only-child::after,\n.ant-btn[disabled]:focus > a:only-child::after,\n.ant-btn[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn:hover,\n.ant-btn:focus,\n.ant-btn:active {\n  text-decoration: none;\n  background: transparent;\n}\n.ant-btn > span {\n  display: inline-block;\n}\n.ant-btn-primary {\n  color: #fff;\n  border-color: #177ddc;\n  background: #177ddc;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-primary > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-primary > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-primary:hover,\n.ant-btn-primary:focus {\n  color: #fff;\n  border-color: #095cb5;\n  background: #095cb5;\n}\n.ant-btn-primary:hover > a:only-child,\n.ant-btn-primary:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-primary:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-primary:active {\n  color: #fff;\n  border-color: #3c9be8;\n  background: #3c9be8;\n}\n.ant-btn-primary:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-primary:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-primary[disabled],\n.ant-btn-primary[disabled]:hover,\n.ant-btn-primary[disabled]:focus,\n.ant-btn-primary[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-primary[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-primary[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) {\n  border-right-color: #165996;\n  border-left-color: #165996;\n}\n.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled {\n  border-color: #434343;\n}\n.ant-btn-group .ant-btn-primary:first-child:not(:last-child) {\n  border-right-color: #165996;\n}\n.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] {\n  border-right-color: #434343;\n}\n.ant-btn-group .ant-btn-primary:last-child:not(:first-child),\n.ant-btn-group .ant-btn-primary + .ant-btn-primary {\n  border-left-color: #165996;\n}\n.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],\n.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {\n  border-left-color: #434343;\n}\n.ant-btn-ghost {\n  color: rgba(255, 255, 255, 0.85);\n  border-color: #434343;\n  background: transparent;\n}\n.ant-btn-ghost > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-ghost > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-ghost:hover,\n.ant-btn-ghost:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-ghost:hover > a:only-child,\n.ant-btn-ghost:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-ghost:hover > a:only-child::after,\n.ant-btn-ghost:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-ghost:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-ghost:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-ghost:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-ghost[disabled],\n.ant-btn-ghost[disabled]:hover,\n.ant-btn-ghost[disabled]:focus,\n.ant-btn-ghost[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-ghost[disabled] > a:only-child,\n.ant-btn-ghost[disabled]:hover > a:only-child,\n.ant-btn-ghost[disabled]:focus > a:only-child,\n.ant-btn-ghost[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-ghost[disabled] > a:only-child::after,\n.ant-btn-ghost[disabled]:hover > a:only-child::after,\n.ant-btn-ghost[disabled]:focus > a:only-child::after,\n.ant-btn-ghost[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dashed {\n  color: rgba(255, 255, 255, 0.85);\n  border-color: #434343;\n  background: transparent;\n  border-style: dashed;\n}\n.ant-btn-dashed > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dashed > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dashed:hover,\n.ant-btn-dashed:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-dashed:hover > a:only-child,\n.ant-btn-dashed:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dashed:hover > a:only-child::after,\n.ant-btn-dashed:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dashed:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-dashed:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dashed:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dashed[disabled],\n.ant-btn-dashed[disabled]:hover,\n.ant-btn-dashed[disabled]:focus,\n.ant-btn-dashed[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dashed[disabled] > a:only-child,\n.ant-btn-dashed[disabled]:hover > a:only-child,\n.ant-btn-dashed[disabled]:focus > a:only-child,\n.ant-btn-dashed[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dashed[disabled] > a:only-child::after,\n.ant-btn-dashed[disabled]:hover > a:only-child::after,\n.ant-btn-dashed[disabled]:focus > a:only-child::after,\n.ant-btn-dashed[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-danger {\n  color: #fff;\n  border-color: #a61d24;\n  background: #a61d24;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-danger > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-danger > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-danger:hover,\n.ant-btn-danger:focus {\n  color: #fff;\n  border-color: #800f19;\n  background: #800f19;\n}\n.ant-btn-danger:hover > a:only-child,\n.ant-btn-danger:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-danger:hover > a:only-child::after,\n.ant-btn-danger:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-danger:active {\n  color: #fff;\n  border-color: #b33b3d;\n  background: #b33b3d;\n}\n.ant-btn-danger:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-danger:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-danger[disabled],\n.ant-btn-danger[disabled]:hover,\n.ant-btn-danger[disabled]:focus,\n.ant-btn-danger[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-danger[disabled] > a:only-child,\n.ant-btn-danger[disabled]:hover > a:only-child,\n.ant-btn-danger[disabled]:focus > a:only-child,\n.ant-btn-danger[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-danger[disabled] > a:only-child::after,\n.ant-btn-danger[disabled]:hover > a:only-child::after,\n.ant-btn-danger[disabled]:focus > a:only-child::after,\n.ant-btn-danger[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-link {\n  color: #177ddc;\n  border-color: transparent;\n  background: transparent;\n  box-shadow: none;\n}\n.ant-btn-link > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-link > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-link:hover,\n.ant-btn-link:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-link:hover > a:only-child,\n.ant-btn-link:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-link:hover > a:only-child::after,\n.ant-btn-link:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-link:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-link:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-link:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-link[disabled],\n.ant-btn-link[disabled]:hover,\n.ant-btn-link[disabled]:focus,\n.ant-btn-link[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-link[disabled] > a:only-child,\n.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-link[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-link[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-link:hover {\n  background: transparent;\n}\n.ant-btn-link:hover,\n.ant-btn-link:focus,\n.ant-btn-link:active {\n  border-color: transparent;\n}\n.ant-btn-link[disabled],\n.ant-btn-link[disabled]:hover,\n.ant-btn-link[disabled]:focus,\n.ant-btn-link[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: transparent;\n  background: transparent;\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-link[disabled] > a:only-child,\n.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-link[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-link[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-text {\n  color: rgba(255, 255, 255, 0.85);\n  border-color: transparent;\n  background: transparent;\n  box-shadow: none;\n}\n.ant-btn-text > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-text > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-text:hover,\n.ant-btn-text:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-text:hover > a:only-child,\n.ant-btn-text:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-text:hover > a:only-child::after,\n.ant-btn-text:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-text:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-text:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-text:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-text[disabled],\n.ant-btn-text[disabled]:hover,\n.ant-btn-text[disabled]:focus,\n.ant-btn-text[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-text[disabled] > a:only-child,\n.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-text[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-text[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-text:hover,\n.ant-btn-text:focus {\n  color: rgba(255, 255, 255, 0.85);\n  background: rgba(255, 255, 255, 0.03);\n  border-color: transparent;\n}\n.ant-btn-text:active {\n  color: rgba(255, 255, 255, 0.85);\n  background: rgba(255, 255, 255, 0.04);\n  border-color: transparent;\n}\n.ant-btn-text[disabled],\n.ant-btn-text[disabled]:hover,\n.ant-btn-text[disabled]:focus,\n.ant-btn-text[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: transparent;\n  background: transparent;\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-text[disabled] > a:only-child,\n.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-text[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-text[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous {\n  color: #a61d24;\n  border-color: #a61d24;\n  background: transparent;\n}\n.ant-btn-dangerous > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous:hover,\n.ant-btn-dangerous:focus {\n  color: #800f19;\n  border-color: #800f19;\n  background: transparent;\n}\n.ant-btn-dangerous:hover > a:only-child,\n.ant-btn-dangerous:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous:hover > a:only-child::after,\n.ant-btn-dangerous:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous:active {\n  color: #b33b3d;\n  border-color: #b33b3d;\n  background: transparent;\n}\n.ant-btn-dangerous:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous[disabled],\n.ant-btn-dangerous[disabled]:hover,\n.ant-btn-dangerous[disabled]:focus,\n.ant-btn-dangerous[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous[disabled] > a:only-child,\n.ant-btn-dangerous[disabled]:hover > a:only-child,\n.ant-btn-dangerous[disabled]:focus > a:only-child,\n.ant-btn-dangerous[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous[disabled] > a:only-child::after,\n.ant-btn-dangerous[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-primary {\n  color: #fff;\n  border-color: #a61d24;\n  background: #a61d24;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);\n}\n.ant-btn-dangerous.ant-btn-primary > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-primary:hover,\n.ant-btn-dangerous.ant-btn-primary:focus {\n  color: #fff;\n  border-color: #800f19;\n  background: #800f19;\n}\n.ant-btn-dangerous.ant-btn-primary:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-primary:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-primary:active {\n  color: #fff;\n  border-color: #b33b3d;\n  background: #b33b3d;\n}\n.ant-btn-dangerous.ant-btn-primary:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-primary[disabled],\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link {\n  color: #a61d24;\n  border-color: transparent;\n  background: transparent;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-dangerous.ant-btn-link:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-dangerous.ant-btn-link[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-dangerous.ant-btn-link:focus {\n  color: #800f19;\n  border-color: transparent;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link:active {\n  color: #b33b3d;\n  border-color: transparent;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-dangerous.ant-btn-link[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: transparent;\n  background: transparent;\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text {\n  color: #a61d24;\n  border-color: transparent;\n  background: transparent;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text:hover,\n.ant-btn-dangerous.ant-btn-text:focus {\n  color: #165996;\n  border-color: #165996;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text:active {\n  color: #388ed3;\n  border-color: #388ed3;\n  background: transparent;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text[disabled],\n.ant-btn-dangerous.ant-btn-text[disabled]:hover,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus,\n.ant-btn-dangerous.ant-btn-text[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text:hover,\n.ant-btn-dangerous.ant-btn-text:focus {\n  color: #800f19;\n  border-color: transparent;\n  background: rgba(255, 255, 255, 0.03);\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text:active {\n  color: #b33b3d;\n  border-color: transparent;\n  background: rgba(255, 255, 255, 0.04);\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-dangerous.ant-btn-text[disabled],\n.ant-btn-dangerous.ant-btn-text[disabled]:hover,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus,\n.ant-btn-dangerous.ant-btn-text[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: transparent;\n  background: transparent;\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after,\n.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-icon-only {\n  width: 32px;\n  height: 32px;\n  padding: 2.4px 0;\n  font-size: 16px;\n  border-radius: 2px;\n  vertical-align: -3px;\n}\n.ant-btn-icon-only > * {\n  font-size: 16px;\n}\n.ant-btn-icon-only.ant-btn-lg {\n  width: 40px;\n  height: 40px;\n  padding: 4.9px 0;\n  font-size: 18px;\n  border-radius: 2px;\n}\n.ant-btn-icon-only.ant-btn-lg > * {\n  font-size: 18px;\n}\n.ant-btn-icon-only.ant-btn-sm {\n  width: 24px;\n  height: 24px;\n  padding: 0px 0;\n  font-size: 14px;\n  border-radius: 2px;\n}\n.ant-btn-icon-only.ant-btn-sm > * {\n  font-size: 14px;\n}\n.ant-btn-icon-only > .anticon {\n  display: flex;\n  justify-content: center;\n}\n.ant-btn-icon-only .anticon-loading {\n  padding: 0 !important;\n}\na.ant-btn-icon-only {\n  vertical-align: -1px;\n}\na.ant-btn-icon-only > .anticon {\n  display: inline;\n}\n.ant-btn-round {\n  height: 32px;\n  padding: 4px 16px;\n  font-size: 14px;\n  border-radius: 32px;\n}\n.ant-btn-round.ant-btn-lg {\n  height: 40px;\n  padding: 6.4px 20px;\n  font-size: 16px;\n  border-radius: 40px;\n}\n.ant-btn-round.ant-btn-sm {\n  height: 24px;\n  padding: 0px 12px;\n  font-size: 14px;\n  border-radius: 24px;\n}\n.ant-btn-round.ant-btn-icon-only {\n  width: auto;\n}\n.ant-btn-circle {\n  min-width: 32px;\n  padding-right: 0;\n  padding-left: 0;\n  text-align: center;\n  border-radius: 50%;\n}\n.ant-btn-circle.ant-btn-lg {\n  min-width: 40px;\n  border-radius: 50%;\n}\n.ant-btn-circle.ant-btn-sm {\n  min-width: 24px;\n  border-radius: 50%;\n}\n.ant-btn::before {\n  position: absolute;\n  top: -1px;\n  right: -1px;\n  bottom: -1px;\n  left: -1px;\n  z-index: 1;\n  display: none;\n  background: #141414;\n  border-radius: inherit;\n  opacity: 0.35;\n  transition: opacity 0.2s;\n  content: '';\n  pointer-events: none;\n}\n.ant-btn .anticon {\n  transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-btn .anticon.anticon-plus > svg,\n.ant-btn .anticon.anticon-minus > svg {\n  shape-rendering: optimizespeed;\n}\n.ant-btn.ant-btn-loading {\n  position: relative;\n  cursor: default;\n}\n.ant-btn.ant-btn-loading::before {\n  display: block;\n}\n.ant-btn > .ant-btn-loading-icon {\n  transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-btn > .ant-btn-loading-icon .anticon {\n  padding-right: 8px;\n  animation: none;\n}\n.ant-btn > .ant-btn-loading-icon .anticon svg {\n  animation: loadingCircle 1s infinite linear;\n}\n.ant-btn-group {\n  position: relative;\n  display: inline-flex;\n}\n.ant-btn-group > .ant-btn,\n.ant-btn-group > span > .ant-btn {\n  position: relative;\n}\n.ant-btn-group > .ant-btn:hover,\n.ant-btn-group > span > .ant-btn:hover,\n.ant-btn-group > .ant-btn:focus,\n.ant-btn-group > span > .ant-btn:focus,\n.ant-btn-group > .ant-btn:active,\n.ant-btn-group > span > .ant-btn:active {\n  z-index: 2;\n}\n.ant-btn-group > .ant-btn[disabled],\n.ant-btn-group > span > .ant-btn[disabled] {\n  z-index: 0;\n}\n.ant-btn-group .ant-btn-icon-only {\n  font-size: 14px;\n}\n.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn + .ant-btn-group,\n.ant-btn-group span + .ant-btn,\n.ant-btn-group .ant-btn + span,\n.ant-btn-group > span + span,\n.ant-btn-group + .ant-btn,\n.ant-btn-group + .ant-btn-group {\n  margin-left: -1px;\n}\n.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) {\n  border-left-color: transparent;\n}\n.ant-btn-group .ant-btn {\n  border-radius: 0;\n}\n.ant-btn-group > .ant-btn:first-child,\n.ant-btn-group > span:first-child > .ant-btn {\n  margin-left: 0;\n}\n.ant-btn-group > .ant-btn:only-child {\n  border-radius: 2px;\n}\n.ant-btn-group > span:only-child > .ant-btn {\n  border-radius: 2px;\n}\n.ant-btn-group > .ant-btn:first-child:not(:last-child),\n.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-btn-group > .ant-btn:last-child:not(:first-child),\n.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:only-child {\n  border-radius: 2px;\n}\n.ant-btn-group-sm > span:only-child > .ant-btn {\n  border-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-btn-group-sm > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn {\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.ant-btn-group > .ant-btn-group {\n  float: left;\n}\n.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn {\n  border-radius: 0;\n}\n.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child {\n  padding-right: 8px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child {\n  padding-left: 8px;\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-rtl.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn-rtl.ant-btn + .ant-btn-group,\n.ant-btn-rtl.ant-btn-group span + .ant-btn,\n.ant-btn-rtl.ant-btn-group .ant-btn + span,\n.ant-btn-rtl.ant-btn-group > span + span,\n.ant-btn-rtl.ant-btn-group + .ant-btn,\n.ant-btn-rtl.ant-btn-group + .ant-btn-group,\n.ant-btn-group-rtl.ant-btn-group .ant-btn + .ant-btn,\n.ant-btn-group-rtl.ant-btn + .ant-btn-group,\n.ant-btn-group-rtl.ant-btn-group span + .ant-btn,\n.ant-btn-group-rtl.ant-btn-group .ant-btn + span,\n.ant-btn-group-rtl.ant-btn-group > span + span,\n.ant-btn-group-rtl.ant-btn-group + .ant-btn,\n.ant-btn-group-rtl.ant-btn-group + .ant-btn-group {\n  margin-right: -1px;\n  margin-left: auto;\n}\n.ant-btn-group.ant-btn-group-rtl {\n  direction: rtl;\n}\n.ant-btn-group-rtl.ant-btn-group > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-rtl.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {\n  border-radius: 0 2px 2px 0;\n}\n.ant-btn-group-rtl.ant-btn-group > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {\n  border-radius: 2px 0 0 2px;\n}\n.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:first-child:not(:last-child),\n.ant-btn-group-rtl.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn {\n  border-radius: 0 2px 2px 0;\n}\n.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn {\n  border-radius: 2px 0 0 2px;\n}\n.ant-btn:focus > span,\n.ant-btn:active > span {\n  position: relative;\n}\n.ant-btn > .anticon + span,\n.ant-btn > span + .anticon {\n  margin-left: 8px;\n}\n.ant-btn.ant-btn-background-ghost {\n  color: rgba(255, 255, 255, 0.85);\n  border-color: rgba(255, 255, 255, 0.25);\n}\n.ant-btn.ant-btn-background-ghost,\n.ant-btn.ant-btn-background-ghost:hover,\n.ant-btn.ant-btn-background-ghost:active,\n.ant-btn.ant-btn-background-ghost:focus {\n  background: transparent;\n}\n.ant-btn.ant-btn-background-ghost:hover,\n.ant-btn.ant-btn-background-ghost:focus {\n  color: #3c9be8;\n  border-color: #3c9be8;\n}\n.ant-btn.ant-btn-background-ghost:active {\n  color: #095cb5;\n  border-color: #095cb5;\n}\n.ant-btn.ant-btn-background-ghost[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background: transparent;\n  border-color: #434343;\n}\n.ant-btn-background-ghost.ant-btn-primary {\n  color: #177ddc;\n  border-color: #177ddc;\n  text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-primary > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary:hover,\n.ant-btn-background-ghost.ant-btn-primary:focus {\n  color: #095cb5;\n  border-color: #095cb5;\n}\n.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary:active {\n  color: #3c9be8;\n  border-color: #3c9be8;\n}\n.ant-btn-background-ghost.ant-btn-primary:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled],\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger {\n  color: #a61d24;\n  border-color: #a61d24;\n  text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-danger > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger:hover,\n.ant-btn-background-ghost.ant-btn-danger:focus {\n  color: #800f19;\n  border-color: #800f19;\n}\n.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger:active {\n  color: #b33b3d;\n  border-color: #b33b3d;\n}\n.ant-btn-background-ghost.ant-btn-danger:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled],\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous {\n  color: #a61d24;\n  border-color: #a61d24;\n  text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover,\n.ant-btn-background-ghost.ant-btn-dangerous:focus {\n  color: #800f19;\n  border-color: #800f19;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active {\n  color: #b33b3d;\n  border-color: #b33b3d;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled],\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link {\n  color: #a61d24;\n  border-color: transparent;\n  text-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus {\n  color: #800f19;\n  border-color: transparent;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active {\n  color: #b33b3d;\n  border-color: transparent;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  background: rgba(255, 255, 255, 0.08);\n  text-shadow: none;\n  box-shadow: none;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child {\n  color: currentcolor;\n}\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after,\n.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\n.ant-btn-two-chinese-chars::first-letter {\n  letter-spacing: 0.34em;\n}\n.ant-btn-two-chinese-chars > *:not(.anticon) {\n  margin-right: -0.34em;\n  letter-spacing: 0.34em;\n}\n.ant-btn.ant-btn-block {\n  width: 100%;\n}\n.ant-btn:empty {\n  display: inline-block;\n  width: 0;\n  visibility: hidden;\n  content: '\\a0';\n}\na.ant-btn {\n  padding-top: 0.01px !important;\n  line-height: 30px;\n}\na.ant-btn-disabled {\n  cursor: not-allowed;\n}\na.ant-btn-disabled > * {\n  pointer-events: none;\n}\na.ant-btn-disabled,\na.ant-btn-disabled:hover,\na.ant-btn-disabled:focus,\na.ant-btn-disabled:active {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: transparent;\n  background: transparent;\n  text-shadow: none;\n  box-shadow: none;\n}\na.ant-btn-disabled > a:only-child,\na.ant-btn-disabled:hover > a:only-child,\na.ant-btn-disabled:focus > a:only-child,\na.ant-btn-disabled:active > a:only-child {\n  color: currentcolor;\n}\na.ant-btn-disabled > a:only-child::after,\na.ant-btn-disabled:hover > a:only-child::after,\na.ant-btn-disabled:focus > a:only-child::after,\na.ant-btn-disabled:active > a:only-child::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  content: '';\n}\na.ant-btn-lg {\n  line-height: 38px;\n}\na.ant-btn-sm {\n  line-height: 22px;\n}\n.ant-btn-compact-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl) {\n  margin-right: -1px;\n}\n.ant-btn-compact-item:not(.ant-btn-compact-last-item).ant-btn-compact-item-rtl {\n  margin-left: -1px;\n}\n.ant-btn-compact-item:hover,\n.ant-btn-compact-item:focus,\n.ant-btn-compact-item:active {\n  z-index: 2;\n}\n.ant-btn-compact-item[disabled] {\n  z-index: 0;\n}\n.ant-btn-compact-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-last-item).ant-btn {\n  border-radius: 0;\n}\n.ant-btn-compact-item.ant-btn.ant-btn-compact-first-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-btn-compact-item.ant-btn.ant-btn-compact-last-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-item-rtl) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-first-item:not(.ant-btn-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-last-item:not(.ant-btn-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-btn-icon-only.ant-btn-compact-item {\n  flex: none;\n}\n.ant-btn-compact-item.ant-btn-primary:not([disabled]) + .ant-btn-compact-item.ant-btn-primary:not([disabled]) {\n  position: relative;\n}\n.ant-btn-compact-item.ant-btn-primary:not([disabled]) + .ant-btn-compact-item.ant-btn-primary:not([disabled])::after {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  display: inline-block;\n  width: 1px;\n  height: calc(100% + 1px * 2);\n  background-color: #165996;\n  content: ' ';\n}\n.ant-btn-compact-item-rtl.ant-btn-compact-first-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-compact-item-rtl.ant-btn-compact-last-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-first-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-last-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled]) + .ant-btn-compact-item-rtl.ant-btn-primary:not([disabled])::after {\n  right: -1px;\n}\n.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-last-item) {\n  margin-bottom: -1px;\n}\n.ant-btn-compact-vertical-item:hover,\n.ant-btn-compact-vertical-item:focus,\n.ant-btn-compact-vertical-item:active {\n  z-index: 2;\n}\n.ant-btn-compact-vertical-item[disabled] {\n  z-index: 0;\n}\n.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-first-item):not(.ant-btn-compact-vertical-last-item) {\n  border-radius: 0;\n}\n.ant-btn-compact-vertical-item.ant-btn-compact-vertical-first-item:not(.ant-btn-compact-vertical-last-item) {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-btn-compact-vertical-item.ant-btn-compact-vertical-last-item:not(.ant-btn-compact-vertical-first-item) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]) + .ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]) {\n  position: relative;\n}\n.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]) + .ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])::after {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  display: inline-block;\n  width: calc(100% + 1px * 2);\n  height: 1px;\n  background-color: #165996;\n  content: ' ';\n}\n.ant-btn-rtl {\n  direction: rtl;\n}\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child),\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary {\n  border-right-color: #165996;\n  border-left-color: #434343;\n}\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],\n.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {\n  border-right-color: #434343;\n  border-left-color: #165996;\n}\n.ant-btn-rtl.ant-btn > .ant-btn-loading-icon .anticon {\n  padding-right: 0;\n  padding-left: 8px;\n}\n.ant-btn-rtl.ant-btn > .anticon + span,\n.ant-btn-rtl.ant-btn > span + .anticon {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-picker-calendar {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  background: #141414;\n}\n.ant-picker-calendar-header {\n  display: flex;\n  justify-content: flex-end;\n  padding: 12px 0;\n}\n.ant-picker-calendar-header .ant-picker-calendar-year-select {\n  min-width: 80px;\n}\n.ant-picker-calendar-header .ant-picker-calendar-month-select {\n  min-width: 70px;\n  margin-left: 8px;\n}\n.ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n  margin-left: 8px;\n}\n.ant-picker-calendar .ant-picker-panel {\n  background: #141414;\n  border: 0;\n  border-top: 1px solid #303030;\n  border-radius: 0;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel,\n.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel {\n  width: auto;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-body {\n  padding: 8px 0;\n}\n.ant-picker-calendar .ant-picker-panel .ant-picker-content {\n  width: 100%;\n}\n.ant-picker-calendar-mini {\n  border-radius: 2px;\n}\n.ant-picker-calendar-mini .ant-picker-calendar-header {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-picker-calendar-mini .ant-picker-panel {\n  border-radius: 0 0 2px 2px;\n}\n.ant-picker-calendar-mini .ant-picker-content {\n  height: 256px;\n}\n.ant-picker-calendar-mini .ant-picker-content th {\n  height: auto;\n  padding: 0;\n  line-height: 18px;\n}\n.ant-picker-calendar-mini .ant-picker-cell::before {\n  pointer-events: none;\n}\n.ant-picker-calendar-full .ant-picker-panel {\n  display: block;\n  width: 100%;\n  text-align: right;\n  background: #141414;\n  border: 0;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td {\n  padding: 0;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th {\n  height: auto;\n  padding: 0 12px 5px 0;\n  line-height: 18px;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell::before {\n  display: none;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today::before {\n  display: none;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today {\n  background: #111b26;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value,\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value {\n  color: #177ddc;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {\n  display: block;\n  width: auto;\n  height: auto;\n  margin: 0 4px;\n  padding: 4px 8px 0;\n  border: 0;\n  border-top: 2px solid #303030;\n  border-radius: 0;\n  transition: background 0.3s;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value {\n  line-height: 24px;\n  transition: color 0.3s;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content {\n  position: static;\n  width: auto;\n  height: 86px;\n  overflow-y: auto;\n  color: rgba(255, 255, 255, 0.85);\n  line-height: 1.5715;\n  text-align: left;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {\n  border-color: #177ddc;\n}\n.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value {\n  color: rgba(255, 255, 255, 0.85);\n}\n@media only screen and (max-width: 480px) {\n  .ant-picker-calendar-header {\n    display: block;\n  }\n  .ant-picker-calendar-header .ant-picker-calendar-year-select {\n    width: 50%;\n  }\n  .ant-picker-calendar-header .ant-picker-calendar-month-select {\n    width: calc(50% - 8px);\n  }\n  .ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n    width: 100%;\n    margin-top: 8px;\n    margin-left: 0;\n  }\n  .ant-picker-calendar-header .ant-picker-calendar-mode-switch > label {\n    width: 50%;\n    text-align: center;\n  }\n}\n.ant-picker-calendar-rtl {\n  direction: rtl;\n}\n.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel {\n  text-align: left;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th {\n  padding: 0 0 5px 12px;\n}\n.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content {\n  text-align: right;\n}\n.ant-card {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  background: #141414;\n  border-radius: 2px;\n}\n.ant-card-rtl {\n  direction: rtl;\n}\n.ant-card-hoverable {\n  cursor: pointer;\n  transition: box-shadow 0.3s, border-color 0.3s;\n}\n.ant-card-hoverable:hover {\n  border-color: transparent;\n  box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), 0 3px 6px 0 rgba(0, 0, 0, 0.48), 0 5px 12px 4px rgba(0, 0, 0, 0.36);\n}\n.ant-card-bordered {\n  border: 1px solid #303030;\n}\n.ant-card-head {\n  min-height: 48px;\n  margin-bottom: -1px;\n  padding: 0 24px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  background: transparent;\n  border-bottom: 1px solid #303030;\n  border-radius: 2px 2px 0 0;\n}\n.ant-card-head::before {\n  display: table;\n  content: '';\n}\n.ant-card-head::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-head::before {\n  display: table;\n  content: '';\n}\n.ant-card-head::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-head-wrapper {\n  display: flex;\n  align-items: center;\n}\n.ant-card-head-title {\n  display: inline-block;\n  flex: 1;\n  padding: 16px 0;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-card-head-title > .ant-typography,\n.ant-card-head-title > .ant-typography-edit-content {\n  left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.ant-card-head .ant-tabs-top {\n  clear: both;\n  margin-bottom: -17px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n}\n.ant-card-head .ant-tabs-top-bar {\n  border-bottom: 1px solid #303030;\n}\n.ant-card-extra {\n  margin-left: auto;\n  padding: 16px 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n}\n.ant-card-rtl .ant-card-extra {\n  margin-right: auto;\n  margin-left: 0;\n}\n.ant-card-body {\n  padding: 24px;\n}\n.ant-card-body::before {\n  display: table;\n  content: '';\n}\n.ant-card-body::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-body::before {\n  display: table;\n  content: '';\n}\n.ant-card-body::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-contain-grid .ant-card-body {\n  display: flex;\n  flex-wrap: wrap;\n}\n.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body {\n  margin: -1px 0 0 -1px;\n  padding: 0;\n}\n.ant-card-grid {\n  width: 33.33%;\n  padding: 24px;\n  border: 0;\n  border-radius: 0;\n  box-shadow: 1px 0 0 0 #303030, 0 1px 0 0 #303030, 1px 1px 0 0 #303030, 1px 0 0 0 #303030 inset, 0 1px 0 0 #303030 inset;\n  transition: all 0.3s;\n}\n.ant-card-grid-hoverable:hover {\n  position: relative;\n  z-index: 1;\n  box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), 0 3px 6px 0 rgba(0, 0, 0, 0.48), 0 5px 12px 4px rgba(0, 0, 0, 0.36);\n}\n.ant-card-contain-tabs > .ant-card-head .ant-card-head-title {\n  min-height: 32px;\n  padding-bottom: 0;\n}\n.ant-card-contain-tabs > .ant-card-head .ant-card-extra {\n  padding-bottom: 0;\n}\n.ant-card-bordered .ant-card-cover {\n  margin-top: -1px;\n  margin-right: -1px;\n  margin-left: -1px;\n}\n.ant-card-cover > * {\n  display: block;\n  width: 100%;\n}\n.ant-card-cover img {\n  border-radius: 2px 2px 0 0;\n}\n.ant-card-actions {\n  display: flex;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  background: #141414;\n  border-top: 1px solid #303030;\n}\n.ant-card-actions::before {\n  display: table;\n  content: '';\n}\n.ant-card-actions::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-actions::before {\n  display: table;\n  content: '';\n}\n.ant-card-actions::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-actions > li {\n  margin: 12px 0;\n  color: rgba(255, 255, 255, 0.45);\n  text-align: center;\n}\n.ant-card-actions > li > span {\n  position: relative;\n  display: block;\n  min-width: 32px;\n  font-size: 14px;\n  line-height: 1.5715;\n  cursor: pointer;\n}\n.ant-card-actions > li > span:hover {\n  color: #177ddc;\n  transition: color 0.3s;\n}\n.ant-card-actions > li > span a:not(.ant-btn),\n.ant-card-actions > li > span > .anticon {\n  display: inline-block;\n  width: 100%;\n  color: rgba(255, 255, 255, 0.45);\n  line-height: 22px;\n  transition: color 0.3s;\n}\n.ant-card-actions > li > span a:not(.ant-btn):hover,\n.ant-card-actions > li > span > .anticon:hover {\n  color: #177ddc;\n}\n.ant-card-actions > li > span > .anticon {\n  font-size: 16px;\n  line-height: 22px;\n}\n.ant-card-actions > li:not(:last-child) {\n  border-right: 1px solid #303030;\n}\n.ant-card-rtl .ant-card-actions > li:not(:last-child) {\n  border-right: none;\n  border-left: 1px solid #303030;\n}\n.ant-card-type-inner .ant-card-head {\n  padding: 0 24px;\n  background: rgba(255, 255, 255, 0.04);\n}\n.ant-card-type-inner .ant-card-head-title {\n  padding: 12px 0;\n  font-size: 14px;\n}\n.ant-card-type-inner .ant-card-body {\n  padding: 16px 24px;\n}\n.ant-card-type-inner .ant-card-extra {\n  padding: 13.5px 0;\n}\n.ant-card-meta {\n  display: flex;\n  margin: -4px 0;\n}\n.ant-card-meta::before {\n  display: table;\n  content: '';\n}\n.ant-card-meta::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-meta::before {\n  display: table;\n  content: '';\n}\n.ant-card-meta::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-card-meta-avatar {\n  padding-right: 16px;\n}\n.ant-card-rtl .ant-card-meta-avatar {\n  padding-right: 0;\n  padding-left: 16px;\n}\n.ant-card-meta-detail {\n  flex: 1;\n  overflow: hidden;\n}\n.ant-card-meta-detail > div:not(:last-child) {\n  margin-bottom: 8px;\n}\n.ant-card-meta-title {\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-card-meta-description {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-card-loading {\n  overflow: hidden;\n}\n.ant-card-loading .ant-card-body {\n  user-select: none;\n}\n.ant-card-small > .ant-card-head {\n  min-height: 36px;\n  padding: 0 12px;\n  font-size: 14px;\n}\n.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-head-title {\n  padding: 8px 0;\n}\n.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-extra {\n  padding: 8px 0;\n  font-size: 14px;\n}\n.ant-card-small > .ant-card-body {\n  padding: 12px;\n}\n.ant-carousel {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n}\n.ant-carousel .slick-slider {\n  position: relative;\n  display: block;\n  box-sizing: border-box;\n  touch-action: pan-y;\n  -webkit-touch-callout: none;\n  -webkit-tap-highlight-color: transparent;\n}\n.ant-carousel .slick-list {\n  position: relative;\n  display: block;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.ant-carousel .slick-list:focus {\n  outline: none;\n}\n.ant-carousel .slick-list.dragging {\n  cursor: pointer;\n}\n.ant-carousel .slick-list .slick-slide {\n  pointer-events: none;\n}\n.ant-carousel .slick-list .slick-slide input.ant-radio-input,\n.ant-carousel .slick-list .slick-slide input.ant-checkbox-input {\n  visibility: hidden;\n}\n.ant-carousel .slick-list .slick-slide.slick-active {\n  pointer-events: auto;\n}\n.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input,\n.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input {\n  visibility: visible;\n}\n.ant-carousel .slick-list .slick-slide > div > div {\n  vertical-align: bottom;\n}\n.ant-carousel .slick-slider .slick-track,\n.ant-carousel .slick-slider .slick-list {\n  transform: translate3d(0, 0, 0);\n  touch-action: pan-y;\n}\n.ant-carousel .slick-track {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n}\n.ant-carousel .slick-track::before,\n.ant-carousel .slick-track::after {\n  display: table;\n  content: '';\n}\n.ant-carousel .slick-track::after {\n  clear: both;\n}\n.slick-loading .ant-carousel .slick-track {\n  visibility: hidden;\n}\n.ant-carousel .slick-slide {\n  display: none;\n  float: left;\n  height: 100%;\n  min-height: 1px;\n}\n.ant-carousel .slick-slide img {\n  display: block;\n}\n.ant-carousel .slick-slide.slick-loading img {\n  display: none;\n}\n.ant-carousel .slick-slide.dragging img {\n  pointer-events: none;\n}\n.ant-carousel .slick-initialized .slick-slide {\n  display: block;\n}\n.ant-carousel .slick-loading .slick-slide {\n  visibility: hidden;\n}\n.ant-carousel .slick-vertical .slick-slide {\n  display: block;\n  height: auto;\n}\n.ant-carousel .slick-arrow.slick-hidden {\n  display: none;\n}\n.ant-carousel .slick-prev,\n.ant-carousel .slick-next {\n  position: absolute;\n  top: 50%;\n  display: block;\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  padding: 0;\n  color: transparent;\n  font-size: 0;\n  line-height: 0;\n  background: transparent;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n}\n.ant-carousel .slick-prev:hover,\n.ant-carousel .slick-next:hover,\n.ant-carousel .slick-prev:focus,\n.ant-carousel .slick-next:focus {\n  color: transparent;\n  background: transparent;\n  outline: none;\n}\n.ant-carousel .slick-prev:hover::before,\n.ant-carousel .slick-next:hover::before,\n.ant-carousel .slick-prev:focus::before,\n.ant-carousel .slick-next:focus::before {\n  opacity: 1;\n}\n.ant-carousel .slick-prev.slick-disabled::before,\n.ant-carousel .slick-next.slick-disabled::before {\n  opacity: 0.25;\n}\n.ant-carousel .slick-prev {\n  left: -25px;\n}\n.ant-carousel .slick-prev::before {\n  content: '←';\n}\n.ant-carousel .slick-next {\n  right: -25px;\n}\n.ant-carousel .slick-next::before {\n  content: '→';\n}\n.ant-carousel .slick-dots {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: flex !important;\n  justify-content: center;\n  margin-right: 15%;\n  margin-bottom: 0;\n  margin-left: 15%;\n  padding-left: 0;\n  list-style: none;\n}\n.ant-carousel .slick-dots-bottom {\n  bottom: 12px;\n}\n.ant-carousel .slick-dots-top {\n  top: 12px;\n  bottom: auto;\n}\n.ant-carousel .slick-dots li {\n  position: relative;\n  display: inline-block;\n  flex: 0 1 auto;\n  box-sizing: content-box;\n  width: 16px;\n  height: 3px;\n  margin: 0 4px;\n  padding: 0;\n  text-align: center;\n  text-indent: -999px;\n  vertical-align: top;\n  transition: all 0.5s;\n}\n.ant-carousel .slick-dots li button {\n  position: relative;\n  display: block;\n  width: 100%;\n  height: 3px;\n  padding: 0;\n  color: transparent;\n  font-size: 0;\n  background: #141414;\n  border: 0;\n  border-radius: 1px;\n  outline: none;\n  cursor: pointer;\n  opacity: 0.3;\n  transition: all 0.5s;\n}\n.ant-carousel .slick-dots li button:hover,\n.ant-carousel .slick-dots li button:focus {\n  opacity: 0.75;\n}\n.ant-carousel .slick-dots li button::after {\n  position: absolute;\n  top: -4px;\n  right: -4px;\n  bottom: -4px;\n  left: -4px;\n  content: '';\n}\n.ant-carousel .slick-dots li.slick-active {\n  width: 24px;\n}\n.ant-carousel .slick-dots li.slick-active button {\n  background: #141414;\n  opacity: 1;\n}\n.ant-carousel .slick-dots li.slick-active:hover,\n.ant-carousel .slick-dots li.slick-active:focus {\n  opacity: 1;\n}\n.ant-carousel-vertical .slick-dots {\n  top: 50%;\n  bottom: auto;\n  flex-direction: column;\n  width: 3px;\n  height: auto;\n  margin: 0;\n  transform: translateY(-50%);\n}\n.ant-carousel-vertical .slick-dots-left {\n  right: auto;\n  left: 12px;\n}\n.ant-carousel-vertical .slick-dots-right {\n  right: 12px;\n  left: auto;\n}\n.ant-carousel-vertical .slick-dots li {\n  width: 3px;\n  height: 16px;\n  margin: 4px 0;\n  vertical-align: baseline;\n}\n.ant-carousel-vertical .slick-dots li button {\n  width: 3px;\n  height: 16px;\n}\n.ant-carousel-vertical .slick-dots li.slick-active {\n  width: 3px;\n  height: 24px;\n}\n.ant-carousel-vertical .slick-dots li.slick-active button {\n  width: 3px;\n  height: 24px;\n}\n.ant-carousel-rtl {\n  direction: rtl;\n}\n.ant-carousel-rtl .ant-carousel .slick-track {\n  right: 0;\n  left: auto;\n}\n.ant-carousel-rtl .ant-carousel .slick-prev {\n  right: -25px;\n  left: auto;\n}\n.ant-carousel-rtl .ant-carousel .slick-prev::before {\n  content: '→';\n}\n.ant-carousel-rtl .ant-carousel .slick-next {\n  right: auto;\n  left: -25px;\n}\n.ant-carousel-rtl .ant-carousel .slick-next::before {\n  content: '←';\n}\n.ant-carousel-rtl.ant-carousel .slick-dots {\n  flex-direction: row-reverse;\n}\n.ant-carousel-rtl.ant-carousel-vertical .slick-dots {\n  flex-direction: column;\n}\n@keyframes antCheckboxEffect {\n  0% {\n    transform: scale(1);\n    opacity: 0.5;\n  }\n  100% {\n    transform: scale(1.6);\n    opacity: 0;\n  }\n}\n.ant-cascader-checkbox {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  top: 0.2em;\n  line-height: 1;\n  white-space: nowrap;\n  outline: none;\n  cursor: pointer;\n}\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,\n.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner,\n.ant-cascader-checkbox-input:focus + .ant-cascader-checkbox-inner {\n  border-color: #177ddc;\n}\n.ant-cascader-checkbox-checked::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 2px;\n  visibility: hidden;\n  animation: antCheckboxEffect 0.36s ease-in-out;\n  animation-fill-mode: backwards;\n  content: '';\n}\n.ant-cascader-checkbox:hover::after,\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox::after {\n  visibility: visible;\n}\n.ant-cascader-checkbox-inner {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 16px;\n  height: 16px;\n  direction: ltr;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  border-collapse: separate;\n  transition: all 0.3s;\n}\n.ant-cascader-checkbox-inner::after {\n  position: absolute;\n  top: 50%;\n  left: 21.5%;\n  display: table;\n  width: 5.71428571px;\n  height: 9.14285714px;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(0) translate(-50%, -50%);\n  opacity: 0;\n  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n  content: ' ';\n}\n.ant-cascader-checkbox-input {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  opacity: 0;\n}\n.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner::after {\n  position: absolute;\n  display: table;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(1) translate(-50%, -50%);\n  opacity: 1;\n  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n  content: ' ';\n}\n.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner {\n  background-color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-cascader-checkbox-disabled {\n  cursor: not-allowed;\n}\n.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.3);\n  animation-name: none;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner {\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343 !important;\n}\n.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.08);\n  border-collapse: separate;\n  animation-name: none;\n}\n.ant-cascader-checkbox-disabled + span {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-cascader-checkbox-disabled:hover::after,\n.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled::after {\n  visibility: hidden;\n}\n.ant-cascader-checkbox-wrapper {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-flex;\n  align-items: baseline;\n  line-height: unset;\n  cursor: pointer;\n}\n.ant-cascader-checkbox-wrapper::after {\n  display: inline-block;\n  width: 0;\n  overflow: hidden;\n  content: '\\a0';\n}\n.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled {\n  cursor: not-allowed;\n}\n.ant-cascader-checkbox-wrapper + .ant-cascader-checkbox-wrapper {\n  margin-left: 8px;\n}\n.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type='checkbox'] {\n  width: 14px;\n  height: 14px;\n}\n.ant-cascader-checkbox + span {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-cascader-checkbox-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n}\n.ant-cascader-checkbox-group-item {\n  margin-right: 8px;\n}\n.ant-cascader-checkbox-group-item:last-child {\n  margin-right: 0;\n}\n.ant-cascader-checkbox-group-item + .ant-cascader-checkbox-group-item {\n  margin-left: 0;\n}\n.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner {\n  background-color: transparent;\n  border-color: #434343;\n}\n.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner::after {\n  top: 50%;\n  left: 50%;\n  width: 8px;\n  height: 8px;\n  background-color: #177ddc;\n  border: 0;\n  transform: translate(-50%, -50%) scale(1);\n  opacity: 1;\n  content: ' ';\n}\n.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner::after {\n  background-color: rgba(255, 255, 255, 0.3);\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-cascader-checkbox-rtl {\n  direction: rtl;\n}\n.ant-cascader-checkbox-group-rtl .ant-cascader-checkbox-group-item {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-cascader-checkbox-group-rtl .ant-cascader-checkbox-group-item:last-child {\n  margin-left: 0 !important;\n}\n.ant-cascader-checkbox-group-rtl .ant-cascader-checkbox-group-item + .ant-cascader-checkbox-group-item {\n  margin-left: 8px;\n}\n.ant-cascader {\n  width: 184px;\n}\n.ant-cascader-checkbox {\n  top: 0;\n  margin-right: 8px;\n}\n.ant-cascader-menus {\n  display: flex;\n  flex-wrap: nowrap;\n  align-items: flex-start;\n}\n.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu {\n  width: 100%;\n  height: auto;\n}\n.ant-cascader-menu {\n  flex-grow: 1;\n  min-width: 111px;\n  height: 180px;\n  margin: 0;\n  margin: -4px 0;\n  padding: 4px 0;\n  overflow: auto;\n  vertical-align: top;\n  list-style: none;\n  border-right: 1px solid #303030;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n.ant-cascader-menu-item {\n  display: flex;\n  flex-wrap: nowrap;\n  align-items: center;\n  padding: 5px 12px;\n  overflow: hidden;\n  line-height: 22px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-cascader-menu-item:hover {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-cascader-menu-item-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-cascader-menu-item-disabled:hover {\n  background: transparent;\n}\n.ant-cascader-menu-empty .ant-cascader-menu-item {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: default;\n  pointer-events: none;\n}\n.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),\n.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover {\n  font-weight: 600;\n  background-color: #111b26;\n}\n.ant-cascader-menu-item-content {\n  flex: auto;\n}\n.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,\n.ant-cascader-menu-item-loading-icon {\n  margin-left: 4px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 10px;\n}\n.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,\n.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-cascader-menu-item-keyword {\n  color: #a61d24;\n}\n.ant-cascader-compact-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl) {\n  margin-right: -1px;\n}\n.ant-cascader-compact-item:not(.ant-cascader-compact-last-item).ant-cascader-compact-item-rtl {\n  margin-left: -1px;\n}\n.ant-cascader-compact-item:hover,\n.ant-cascader-compact-item:focus,\n.ant-cascader-compact-item:active {\n  z-index: 2;\n}\n.ant-cascader-compact-item[disabled] {\n  z-index: 0;\n}\n.ant-cascader-compact-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-last-item).ant-cascader {\n  border-radius: 0;\n}\n.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-item-rtl) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,\n.ant-cascader-rtl .ant-cascader-menu-item-loading-icon {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-cascader-rtl .ant-cascader-checkbox {\n  top: 0;\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-checkbox {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  top: 0.2em;\n  line-height: 1;\n  white-space: nowrap;\n  outline: none;\n  cursor: pointer;\n}\n.ant-checkbox-wrapper:hover .ant-checkbox-inner,\n.ant-checkbox:hover .ant-checkbox-inner,\n.ant-checkbox-input:focus + .ant-checkbox-inner {\n  border-color: #177ddc;\n}\n.ant-checkbox-checked::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 2px;\n  visibility: hidden;\n  animation: antCheckboxEffect 0.36s ease-in-out;\n  animation-fill-mode: backwards;\n  content: '';\n}\n.ant-checkbox:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox::after {\n  visibility: visible;\n}\n.ant-checkbox-inner {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 16px;\n  height: 16px;\n  direction: ltr;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  border-collapse: separate;\n  transition: all 0.3s;\n}\n.ant-checkbox-inner::after {\n  position: absolute;\n  top: 50%;\n  left: 21.5%;\n  display: table;\n  width: 5.71428571px;\n  height: 9.14285714px;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(0) translate(-50%, -50%);\n  opacity: 0;\n  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n  content: ' ';\n}\n.ant-checkbox-input {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  opacity: 0;\n}\n.ant-checkbox-checked .ant-checkbox-inner::after {\n  position: absolute;\n  display: table;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(1) translate(-50%, -50%);\n  opacity: 1;\n  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n  content: ' ';\n}\n.ant-checkbox-checked .ant-checkbox-inner {\n  background-color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-checkbox-disabled {\n  cursor: not-allowed;\n}\n.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.3);\n  animation-name: none;\n}\n.ant-checkbox-disabled .ant-checkbox-input {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n.ant-checkbox-disabled .ant-checkbox-inner {\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343 !important;\n}\n.ant-checkbox-disabled .ant-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.08);\n  border-collapse: separate;\n  animation-name: none;\n}\n.ant-checkbox-disabled + span {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-checkbox-disabled:hover::after,\n.ant-checkbox-wrapper:hover .ant-checkbox-disabled::after {\n  visibility: hidden;\n}\n.ant-checkbox-wrapper {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-flex;\n  align-items: baseline;\n  line-height: unset;\n  cursor: pointer;\n}\n.ant-checkbox-wrapper::after {\n  display: inline-block;\n  width: 0;\n  overflow: hidden;\n  content: '\\a0';\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled {\n  cursor: not-allowed;\n}\n.ant-checkbox-wrapper + .ant-checkbox-wrapper {\n  margin-left: 8px;\n}\n.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type='checkbox'] {\n  width: 14px;\n  height: 14px;\n}\n.ant-checkbox + span {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-checkbox-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n}\n.ant-checkbox-group-item {\n  margin-right: 8px;\n}\n.ant-checkbox-group-item:last-child {\n  margin-right: 0;\n}\n.ant-checkbox-group-item + .ant-checkbox-group-item {\n  margin-left: 0;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner {\n  background-color: transparent;\n  border-color: #434343;\n}\n.ant-checkbox-indeterminate .ant-checkbox-inner::after {\n  top: 50%;\n  left: 50%;\n  width: 8px;\n  height: 8px;\n  background-color: #177ddc;\n  border: 0;\n  transform: translate(-50%, -50%) scale(1);\n  opacity: 1;\n  content: ' ';\n}\n.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner::after {\n  background-color: rgba(255, 255, 255, 0.3);\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-checkbox-rtl {\n  direction: rtl;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child {\n  margin-left: 0 !important;\n}\n.ant-checkbox-group-rtl .ant-checkbox-group-item + .ant-checkbox-group-item {\n  margin-left: 8px;\n}\n.ant-collapse {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  background-color: rgba(255, 255, 255, 0.04);\n  border: 1px solid #434343;\n  border-bottom: 0;\n  border-radius: 2px;\n}\n.ant-collapse > .ant-collapse-item {\n  border-bottom: 1px solid #434343;\n}\n.ant-collapse > .ant-collapse-item:last-child,\n.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header {\n  border-radius: 0 0 2px 2px;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header {\n  position: relative;\n  display: flex;\n  flex-wrap: nowrap;\n  align-items: flex-start;\n  padding: 12px 16px;\n  color: rgba(255, 255, 255, 0.85);\n  line-height: 1.5715;\n  cursor: pointer;\n  transition: all 0.3s, visibility 0s;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n  display: inline-block;\n  margin-right: 12px;\n  font-size: 12px;\n  vertical-align: -1px;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg {\n  transition: transform 0.24s;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-header-text {\n  flex: auto;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra {\n  margin-left: auto;\n}\n.ant-collapse > .ant-collapse-item > .ant-collapse-header:focus {\n  outline: none;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-header-collapsible-only {\n  cursor: default;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-header-collapsible-only .ant-collapse-header-text {\n  flex: none;\n  cursor: pointer;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-icon-collapsible-only {\n  cursor: default;\n}\n.ant-collapse > .ant-collapse-item .ant-collapse-icon-collapsible-only .ant-collapse-expand-icon {\n  cursor: pointer;\n}\n.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header {\n  padding-left: 12px;\n}\n.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header {\n  position: relative;\n  padding: 12px 16px;\n  padding-right: 40px;\n}\n.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  left: auto;\n  margin: 0;\n  transform: translateY(-50%);\n}\n.ant-collapse-content {\n  color: rgba(255, 255, 255, 0.85);\n  background-color: #141414;\n  border-top: 1px solid #434343;\n}\n.ant-collapse-content > .ant-collapse-content-box {\n  padding: 16px;\n}\n.ant-collapse-content-hidden {\n  display: none;\n}\n.ant-collapse-item:last-child > .ant-collapse-content {\n  border-radius: 0 0 2px 2px;\n}\n.ant-collapse-borderless {\n  background-color: rgba(255, 255, 255, 0.04);\n  border: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item {\n  border-bottom: 1px solid #434343;\n}\n.ant-collapse-borderless > .ant-collapse-item:last-child,\n.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header {\n  border-radius: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item:last-child {\n  border-bottom: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content {\n  background-color: transparent;\n  border-top: 0;\n}\n.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box {\n  padding-top: 4px;\n}\n.ant-collapse-ghost {\n  background-color: transparent;\n  border: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item {\n  border-bottom: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content {\n  background-color: transparent;\n  border-top: 0;\n}\n.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box {\n  padding-top: 12px;\n  padding-bottom: 12px;\n}\n.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header,\n.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-collapse-rtl {\n  direction: rtl;\n}\n.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header {\n  position: relative;\n  padding: 12px 16px;\n  padding-left: 40px;\n}\n.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n  position: absolute;\n  top: 50%;\n  right: auto;\n  left: 16px;\n  margin: 0;\n  transform: translateY(-50%);\n}\n.ant-collapse-rtl .ant-collapse > .ant-collapse-item > .ant-collapse-header {\n  padding: 12px 16px;\n  padding-right: 40px;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg {\n  transform: rotate(180deg);\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra {\n  margin-right: auto;\n  margin-left: 0;\n}\n.ant-collapse-rtl.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header {\n  padding-right: 12px;\n  padding-left: 0;\n}\n.ant-comment {\n  position: relative;\n  background-color: transparent;\n}\n.ant-comment-inner {\n  display: flex;\n  padding: 16px 0;\n}\n.ant-comment-avatar {\n  position: relative;\n  flex-shrink: 0;\n  margin-right: 12px;\n  cursor: pointer;\n}\n.ant-comment-avatar img {\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n}\n.ant-comment-content {\n  position: relative;\n  flex: 1 1 auto;\n  min-width: 1px;\n  font-size: 14px;\n  word-wrap: break-word;\n}\n.ant-comment-content-author {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n  margin-bottom: 4px;\n  font-size: 14px;\n}\n.ant-comment-content-author > a,\n.ant-comment-content-author > span {\n  padding-right: 8px;\n  font-size: 12px;\n  line-height: 18px;\n}\n.ant-comment-content-author-name {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  transition: color 0.3s;\n}\n.ant-comment-content-author-name > * {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-comment-content-author-name > *:hover {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-comment-content-author-time {\n  color: rgba(255, 255, 255, 0.3);\n  white-space: nowrap;\n  cursor: auto;\n}\n.ant-comment-content-detail p {\n  margin-bottom: inherit;\n  white-space: pre-wrap;\n}\n.ant-comment-actions {\n  margin-top: 12px;\n  margin-bottom: inherit;\n  padding-left: 0;\n}\n.ant-comment-actions > li {\n  display: inline-block;\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-comment-actions > li > span {\n  margin-right: 10px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 12px;\n  cursor: pointer;\n  transition: color 0.3s;\n  user-select: none;\n}\n.ant-comment-actions > li > span:hover {\n  color: rgba(255, 255, 255, 0.65);\n}\n.ant-comment-nested {\n  margin-left: 44px;\n}\n.ant-comment-rtl {\n  direction: rtl;\n}\n.ant-comment-rtl .ant-comment-avatar {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-comment-rtl .ant-comment-content-author > a,\n.ant-comment-rtl .ant-comment-content-author > span {\n  padding-right: 0;\n  padding-left: 8px;\n}\n.ant-comment-rtl .ant-comment-actions {\n  padding-right: 0;\n}\n.ant-comment-rtl .ant-comment-actions > li > span {\n  margin-right: 0;\n  margin-left: 10px;\n}\n.ant-comment-rtl .ant-comment-nested {\n  margin-right: 44px;\n  margin-left: 0;\n}\n.ant-picker-status-error.ant-picker,\n.ant-picker-status-error.ant-picker:not(.ant-picker-disabled):hover {\n  background-color: transparent;\n  border-color: #a61d24;\n}\n.ant-picker-status-error.ant-picker-focused,\n.ant-picker-status-error.ant-picker:focus {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-picker-status-error.ant-picker .ant-picker-active-bar {\n  background: #b33b3d;\n}\n.ant-picker-status-warning.ant-picker,\n.ant-picker-status-warning.ant-picker:not(.ant-picker-disabled):hover {\n  background-color: transparent;\n  border-color: #d89614;\n}\n.ant-picker-status-warning.ant-picker-focused,\n.ant-picker-status-warning.ant-picker:focus {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-picker-status-warning.ant-picker .ant-picker-active-bar {\n  background: #e6b239;\n}\n.ant-picker {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  padding: 4px 11px 4px;\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  background: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: border 0.3s, box-shadow 0.3s;\n}\n.ant-picker:hover,\n.ant-picker-focused {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-picker:hover,\n.ant-input-rtl .ant-picker-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-picker-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-picker-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-picker.ant-picker-disabled {\n  background: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-picker.ant-picker-disabled .ant-picker-suffix {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-picker.ant-picker-borderless {\n  background-color: transparent !important;\n  border-color: transparent !important;\n  box-shadow: none !important;\n}\n.ant-picker-input {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  width: 100%;\n}\n.ant-picker-input > input {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n  flex: auto;\n  min-width: 1px;\n  height: auto;\n  padding: 0;\n  background: transparent;\n  border: 0;\n}\n.ant-picker-input > input::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-picker-input > input:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-picker-input > input:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-picker-input > input:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-picker-input > input:focus,\n.ant-picker-input > input-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-picker-input > input:focus,\n.ant-input-rtl .ant-picker-input > input-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-picker-input > input-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-picker-input > input-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-picker-input > input[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-picker-input > input[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-picker-input > input-borderless,\n.ant-picker-input > input-borderless:hover,\n.ant-picker-input > input-borderless:focus,\n.ant-picker-input > input-borderless-focused,\n.ant-picker-input > input-borderless-disabled,\n.ant-picker-input > input-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-picker-input > input {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-picker-input > input-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-picker-input > input-sm {\n  padding: 0px 7px;\n}\n.ant-picker-input > input-rtl {\n  direction: rtl;\n}\n.ant-picker-input > input:focus {\n  box-shadow: none;\n}\n.ant-picker-input > input[disabled] {\n  background: transparent;\n}\n.ant-picker-input:hover .ant-picker-clear {\n  opacity: 1;\n}\n.ant-picker-input-placeholder > input {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-picker-large {\n  padding: 6.5px 11px 6.5px;\n}\n.ant-picker-large .ant-picker-input > input {\n  font-size: 16px;\n}\n.ant-picker-small {\n  padding: 0px 7px 0px;\n}\n.ant-picker-suffix {\n  display: flex;\n  flex: none;\n  align-self: center;\n  margin-left: 4px;\n  color: rgba(255, 255, 255, 0.3);\n  line-height: 1;\n  pointer-events: none;\n}\n.ant-picker-suffix > * {\n  vertical-align: top;\n}\n.ant-picker-suffix > *:not(:last-child) {\n  margin-right: 8px;\n}\n.ant-picker-clear {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  color: rgba(255, 255, 255, 0.3);\n  line-height: 1;\n  background: #141414;\n  transform: translateY(-50%);\n  cursor: pointer;\n  opacity: 0;\n  transition: opacity 0.3s, color 0.3s;\n}\n.ant-picker-clear > * {\n  vertical-align: top;\n}\n.ant-picker-clear:hover {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-picker-separator {\n  position: relative;\n  display: inline-block;\n  width: 1em;\n  height: 16px;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 16px;\n  vertical-align: top;\n  cursor: default;\n}\n.ant-picker-focused .ant-picker-separator {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator {\n  cursor: not-allowed;\n}\n.ant-picker-range {\n  position: relative;\n  display: inline-flex;\n}\n.ant-picker-range .ant-picker-clear {\n  right: 11px;\n}\n.ant-picker-range:hover .ant-picker-clear {\n  opacity: 1;\n}\n.ant-picker-range .ant-picker-active-bar {\n  bottom: -1px;\n  height: 2px;\n  margin-left: 11px;\n  background: #177ddc;\n  opacity: 0;\n  transition: all 0.3s ease-out;\n  pointer-events: none;\n}\n.ant-picker-range.ant-picker-focused .ant-picker-active-bar {\n  opacity: 1;\n}\n.ant-picker-range-separator {\n  align-items: center;\n  padding: 0 8px;\n  line-height: 1;\n}\n.ant-picker-range.ant-picker-small .ant-picker-clear {\n  right: 7px;\n}\n.ant-picker-range.ant-picker-small .ant-picker-active-bar {\n  margin-left: 7px;\n}\n.ant-picker-dropdown {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n  z-index: 1050;\n}\n.ant-picker-dropdown-hidden {\n  display: none;\n}\n.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow {\n  top: 2.58561808px;\n  display: block;\n  transform: rotate(-135deg) translateY(1px);\n}\n.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow {\n  bottom: 2.58561808px;\n  display: block;\n  transform: rotate(45deg);\n}\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight {\n  animation-name: antSlideDownIn;\n}\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight {\n  animation-name: antSlideUpIn;\n}\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight {\n  animation-name: antSlideDownOut;\n}\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,\n.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight {\n  animation-name: antSlideUpOut;\n}\n.ant-picker-dropdown-range {\n  padding: 7.54247233px 0;\n}\n.ant-picker-dropdown-range-hidden {\n  display: none;\n}\n.ant-picker-dropdown .ant-picker-panel > .ant-picker-time-panel {\n  padding-top: 4px;\n}\n.ant-picker-ranges {\n  margin-bottom: 0;\n  padding: 4px 12px;\n  overflow: hidden;\n  line-height: 34px;\n  text-align: left;\n  list-style: none;\n}\n.ant-picker-ranges > li {\n  display: inline-block;\n}\n.ant-picker-ranges .ant-picker-preset > .ant-tag-blue {\n  color: #177ddc;\n  background: #111b26;\n  border-color: #153450;\n  cursor: pointer;\n}\n.ant-picker-ranges .ant-picker-ok {\n  float: right;\n  margin-left: 8px;\n}\n.ant-picker-range-wrapper {\n  display: flex;\n}\n.ant-picker-range-arrow {\n  position: absolute;\n  z-index: 1;\n  width: 11.3137085px;\n  height: 11.3137085px;\n  margin-left: 16.5px;\n  box-shadow: 2px 2px 6px -2px rgba(0, 0, 0, 0.1);\n  transition: left 0.3s ease-out;\n  border-radius: 0 0 2px;\n  pointer-events: none;\n}\n.ant-picker-range-arrow::before {\n  position: absolute;\n  top: -11.3137085px;\n  left: -11.3137085px;\n  width: 33.9411255px;\n  height: 33.9411255px;\n  background: #1f1f1f;\n  background-repeat: no-repeat;\n  background-position: -10px -10px;\n  content: '';\n  clip-path: inset(33% 33%);\n  clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-picker-panel-container {\n  overflow: hidden;\n  vertical-align: top;\n  background: #1f1f1f;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n  transition: margin 0.3s;\n}\n.ant-picker-panel-container .ant-picker-panels {\n  display: inline-flex;\n  flex-wrap: nowrap;\n  direction: ltr;\n}\n.ant-picker-panel-container .ant-picker-panel {\n  vertical-align: top;\n  background: transparent;\n  border-width: 0 0 1px 0;\n  border-radius: 0;\n}\n.ant-picker-panel-container .ant-picker-panel .ant-picker-content,\n.ant-picker-panel-container .ant-picker-panel table {\n  text-align: center;\n}\n.ant-picker-panel-container .ant-picker-panel-focused {\n  border-color: #303030;\n}\n.ant-picker-compact-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl) {\n  margin-right: -1px;\n}\n.ant-picker-compact-item:not(.ant-picker-compact-last-item).ant-picker-compact-item-rtl {\n  margin-left: -1px;\n}\n.ant-picker-compact-item:hover,\n.ant-picker-compact-item:focus,\n.ant-picker-compact-item:active {\n  z-index: 2;\n}\n.ant-picker-compact-item.ant-picker-focused {\n  z-index: 2;\n}\n.ant-picker-compact-item[disabled] {\n  z-index: 0;\n}\n.ant-picker-compact-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-last-item).ant-picker {\n  border-radius: 0;\n}\n.ant-picker-compact-item.ant-picker.ant-picker-compact-first-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-picker-compact-item.ant-picker.ant-picker-compact-last-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-item-rtl) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-first-item:not(.ant-picker-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-last-item:not(.ant-picker-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-picker-panel {\n  display: inline-flex;\n  flex-direction: column;\n  text-align: center;\n  background: #1f1f1f;\n  border: 1px solid #303030;\n  border-radius: 2px;\n  outline: none;\n}\n.ant-picker-panel-focused {\n  border-color: #177ddc;\n}\n.ant-picker-decade-panel,\n.ant-picker-year-panel,\n.ant-picker-quarter-panel,\n.ant-picker-month-panel,\n.ant-picker-week-panel,\n.ant-picker-date-panel,\n.ant-picker-time-panel {\n  display: flex;\n  flex-direction: column;\n  width: 280px;\n}\n.ant-picker-header {\n  display: flex;\n  padding: 0 8px;\n  color: rgba(255, 255, 255, 0.85);\n  border-bottom: 1px solid #303030;\n}\n.ant-picker-header > * {\n  flex: none;\n}\n.ant-picker-header button {\n  padding: 0;\n  color: rgba(255, 255, 255, 0.3);\n  line-height: 40px;\n  background: transparent;\n  border: 0;\n  cursor: pointer;\n  transition: color 0.3s;\n}\n.ant-picker-header > button {\n  min-width: 1.6em;\n  font-size: 14px;\n}\n.ant-picker-header > button:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-picker-header-view {\n  flex: auto;\n  font-weight: 500;\n  line-height: 40px;\n}\n.ant-picker-header-view button {\n  color: inherit;\n  font-weight: inherit;\n}\n.ant-picker-header-view button:not(:first-child) {\n  margin-left: 8px;\n}\n.ant-picker-header-view button:hover {\n  color: #177ddc;\n}\n.ant-picker-prev-icon,\n.ant-picker-next-icon,\n.ant-picker-super-prev-icon,\n.ant-picker-super-next-icon {\n  position: relative;\n  display: inline-block;\n  width: 7px;\n  height: 7px;\n}\n.ant-picker-prev-icon::before,\n.ant-picker-next-icon::before,\n.ant-picker-super-prev-icon::before,\n.ant-picker-super-next-icon::before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: inline-block;\n  width: 7px;\n  height: 7px;\n  border: 0 solid currentcolor;\n  border-width: 1.5px 0 0 1.5px;\n  content: '';\n}\n.ant-picker-super-prev-icon::after,\n.ant-picker-super-next-icon::after {\n  position: absolute;\n  top: 4px;\n  left: 4px;\n  display: inline-block;\n  width: 7px;\n  height: 7px;\n  border: 0 solid currentcolor;\n  border-width: 1.5px 0 0 1.5px;\n  content: '';\n}\n.ant-picker-prev-icon,\n.ant-picker-super-prev-icon {\n  transform: rotate(-45deg);\n}\n.ant-picker-next-icon,\n.ant-picker-super-next-icon {\n  transform: rotate(135deg);\n}\n.ant-picker-content {\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: collapse;\n}\n.ant-picker-content th,\n.ant-picker-content td {\n  position: relative;\n  min-width: 24px;\n  font-weight: 400;\n}\n.ant-picker-content th {\n  height: 30px;\n  color: rgba(255, 255, 255, 0.85);\n  line-height: 30px;\n}\n.ant-picker-cell {\n  padding: 3px 0;\n  color: rgba(255, 255, 255, 0.3);\n  cursor: pointer;\n}\n.ant-picker-cell-in-view {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-picker-cell::before {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: 24px;\n  transform: translateY(-50%);\n  transition: all 0.3s;\n  content: '';\n}\n.ant-picker-cell .ant-picker-cell-inner {\n  position: relative;\n  z-index: 2;\n  display: inline-block;\n  min-width: 24px;\n  height: 24px;\n  line-height: 24px;\n  border-radius: 2px;\n  transition: background 0.3s, border 0.3s;\n}\n.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,\n.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  border: 1px solid #177ddc;\n  border-radius: 2px;\n  content: '';\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range {\n  position: relative;\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range::before {\n  background: #111b26;\n}\n.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner,\n.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,\n.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner {\n  color: #fff;\n  background: #177ddc;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single)::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single)::before {\n  background: #111b26;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start::before {\n  left: 50%;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-end::before {\n  right: 50%;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range)::after {\n  position: absolute;\n  top: 50%;\n  z-index: 0;\n  height: 24px;\n  border-top: 1px dashed #0e4980;\n  border-bottom: 1px dashed #0e4980;\n  transform: translateY(-50%);\n  transition: all 0.3s;\n  content: '';\n}\n.ant-picker-cell-range-hover-start::after,\n.ant-picker-cell-range-hover-end::after,\n.ant-picker-cell-range-hover::after {\n  right: 0;\n  left: 2px;\n}\n.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start::before,\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end::before,\n.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start::before,\n.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end::before {\n  background: #06213a;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner {\n  border-radius: 2px 0 0 2px;\n}\n.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner {\n  border-radius: 0 2px 2px 0;\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after,\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: -1;\n  background: #06213a;\n  transition: all 0.3s;\n  content: '';\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after {\n  right: -6px;\n  left: 0;\n}\n.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n  right: 0;\n  left: -6px;\n}\n.ant-picker-cell-range-hover.ant-picker-cell-range-start::after {\n  right: 50%;\n}\n.ant-picker-cell-range-hover.ant-picker-cell-range-end::after {\n  left: 50%;\n}\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child::after,\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after,\n.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after {\n  left: 6px;\n  border-left: 1px dashed #0e4980;\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child::after,\ntr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after,\n.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after,\n.ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after {\n  right: 6px;\n  border-right: 1px dashed #0e4980;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.ant-picker-cell-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  pointer-events: none;\n}\n.ant-picker-cell-disabled .ant-picker-cell-inner {\n  background: transparent;\n}\n.ant-picker-cell-disabled::before {\n  background: #303030;\n}\n.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner::before {\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-picker-decade-panel .ant-picker-content,\n.ant-picker-year-panel .ant-picker-content,\n.ant-picker-quarter-panel .ant-picker-content,\n.ant-picker-month-panel .ant-picker-content {\n  height: 264px;\n}\n.ant-picker-decade-panel .ant-picker-cell-inner,\n.ant-picker-year-panel .ant-picker-cell-inner,\n.ant-picker-quarter-panel .ant-picker-cell-inner,\n.ant-picker-month-panel .ant-picker-cell-inner {\n  padding: 0 8px;\n}\n.ant-picker-quarter-panel .ant-picker-content {\n  height: 56px;\n}\n.ant-picker-footer {\n  width: min-content;\n  min-width: 100%;\n  line-height: 38px;\n  text-align: center;\n  border-bottom: 1px solid transparent;\n}\n.ant-picker-panel .ant-picker-footer {\n  border-top: 1px solid #303030;\n}\n.ant-picker-footer-extra {\n  padding: 0 12px;\n  line-height: 38px;\n  text-align: left;\n}\n.ant-picker-footer-extra:not(:last-child) {\n  border-bottom: 1px solid #303030;\n}\n.ant-picker-now {\n  text-align: left;\n}\n.ant-picker-today-btn {\n  color: #177ddc;\n}\n.ant-picker-today-btn:hover {\n  color: #165996;\n}\n.ant-picker-today-btn:active {\n  color: #388ed3;\n}\n.ant-picker-today-btn.ant-picker-today-btn-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-picker-decade-panel .ant-picker-cell-inner {\n  padding: 0 4px;\n}\n.ant-picker-decade-panel .ant-picker-cell::before {\n  display: none;\n}\n.ant-picker-year-panel .ant-picker-body,\n.ant-picker-quarter-panel .ant-picker-body,\n.ant-picker-month-panel .ant-picker-body {\n  padding: 0 8px;\n}\n.ant-picker-year-panel .ant-picker-cell-inner,\n.ant-picker-quarter-panel .ant-picker-cell-inner,\n.ant-picker-month-panel .ant-picker-cell-inner {\n  width: 60px;\n}\n.ant-picker-year-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-month-panel .ant-picker-cell-range-hover-start::after {\n  left: 14px;\n  border-left: 1px dashed #0e4980;\n  border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after,\n.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start::after {\n  right: 14px;\n  border-right: 1px dashed #0e4980;\n  border-radius: 0 2px 2px 0;\n}\n.ant-picker-year-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-month-panel .ant-picker-cell-range-hover-end::after {\n  right: 14px;\n  border-right: 1px dashed #0e4980;\n  border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after,\n.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end::after {\n  left: 14px;\n  border-left: 1px dashed #0e4980;\n  border-radius: 2px 0 0 2px;\n}\n.ant-picker-week-panel .ant-picker-body {\n  padding: 8px 12px;\n}\n.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner,\n.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,\n.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner {\n  background: transparent !important;\n}\n.ant-picker-week-panel-row td {\n  transition: background 0.3s;\n}\n.ant-picker-week-panel-row:hover td {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-picker-week-panel-row-selected td,\n.ant-picker-week-panel-row-selected:hover td {\n  background: #177ddc;\n}\n.ant-picker-week-panel-row-selected td.ant-picker-cell-week,\n.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner::before,\n.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner::before {\n  border-color: #fff;\n}\n.ant-picker-week-panel-row-selected td .ant-picker-cell-inner,\n.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner {\n  color: #fff;\n}\n.ant-picker-date-panel .ant-picker-body {\n  padding: 8px 12px;\n}\n.ant-picker-date-panel .ant-picker-content {\n  width: 252px;\n}\n.ant-picker-date-panel .ant-picker-content th {\n  width: 36px;\n}\n.ant-picker-datetime-panel {\n  display: flex;\n}\n.ant-picker-datetime-panel .ant-picker-time-panel {\n  border-left: 1px solid #303030;\n}\n.ant-picker-datetime-panel .ant-picker-date-panel,\n.ant-picker-datetime-panel .ant-picker-time-panel {\n  transition: opacity 0.3s;\n}\n.ant-picker-datetime-panel-active .ant-picker-date-panel,\n.ant-picker-datetime-panel-active .ant-picker-time-panel {\n  opacity: 0.3;\n}\n.ant-picker-datetime-panel-active .ant-picker-date-panel-active,\n.ant-picker-datetime-panel-active .ant-picker-time-panel-active {\n  opacity: 1;\n}\n.ant-picker-time-panel {\n  width: auto;\n  min-width: auto;\n}\n.ant-picker-time-panel .ant-picker-content {\n  display: flex;\n  flex: auto;\n  height: 224px;\n}\n.ant-picker-time-panel-column {\n  flex: 1 0 auto;\n  width: 56px;\n  margin: 0;\n  padding: 0;\n  overflow-y: hidden;\n  text-align: left;\n  list-style: none;\n  transition: background 0.3s;\n}\n.ant-picker-time-panel-column::after {\n  display: block;\n  height: 196px;\n  content: '';\n}\n.ant-picker-datetime-panel .ant-picker-time-panel-column::after {\n  height: 198px;\n}\n.ant-picker-time-panel-column:not(:first-child) {\n  border-left: 1px solid #303030;\n}\n.ant-picker-time-panel-column-active {\n  background: rgba(17, 27, 38, 0.2);\n}\n.ant-picker-time-panel-column:hover {\n  overflow-y: auto;\n}\n.ant-picker-time-panel-column > li {\n  margin: 0;\n  padding: 0;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n  display: block;\n  width: 100%;\n  height: 28px;\n  margin: 0;\n  padding: 0 0 0 14px;\n  color: rgba(255, 255, 255, 0.85);\n  line-height: 28px;\n  border-radius: 0;\n  cursor: pointer;\n  transition: background 0.3s;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n  background: #111b26;\n}\n.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner {\n  color: rgba(255, 255, 255, 0.3);\n  background: transparent;\n  cursor: not-allowed;\n}\n/* stylelint-disable selector-type-no-unknown,selector-no-vendor-prefix */\n_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,\n:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,\n_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,\n:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell {\n  padding: 21px 0;\n}\n.ant-picker-rtl {\n  direction: rtl;\n}\n.ant-picker-rtl .ant-picker-suffix {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-picker-rtl .ant-picker-clear {\n  right: auto;\n  left: 0;\n}\n.ant-picker-rtl .ant-picker-separator {\n  transform: rotate(180deg);\n}\n.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child) {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-picker-rtl.ant-picker-range .ant-picker-clear {\n  right: auto;\n  left: 11px;\n}\n.ant-picker-rtl.ant-picker-range .ant-picker-active-bar {\n  margin-right: 11px;\n  margin-left: 0;\n}\n.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar {\n  margin-right: 7px;\n}\n.ant-picker-dropdown-rtl .ant-picker-ranges {\n  text-align: right;\n}\n.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok {\n  float: left;\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-picker-panel-rtl {\n  direction: rtl;\n}\n.ant-picker-panel-rtl .ant-picker-prev-icon,\n.ant-picker-panel-rtl .ant-picker-super-prev-icon {\n  transform: rotate(135deg);\n}\n.ant-picker-panel-rtl .ant-picker-next-icon,\n.ant-picker-panel-rtl .ant-picker-super-next-icon {\n  transform: rotate(-45deg);\n}\n.ant-picker-cell .ant-picker-cell-inner {\n  position: relative;\n  z-index: 2;\n  display: inline-block;\n  min-width: 24px;\n  height: 24px;\n  line-height: 24px;\n  border-radius: 2px;\n  transition: background 0.3s, border 0.3s;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start::before {\n  right: 50%;\n  left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end::before {\n  right: 0;\n  left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end::before {\n  right: 50%;\n  left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after {\n  right: 0;\n  left: -6px;\n}\n.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after {\n  right: -6px;\n  left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start::after {\n  right: 0;\n  left: 50%;\n}\n.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end::after {\n  right: 50%;\n  left: 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner {\n  border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner {\n  border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after {\n  right: 6px;\n  left: 0;\n  border-right: 1px dashed #0e4980;\n  border-left: none;\n  border-radius: 0 2px 2px 0;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after {\n  right: 0;\n  left: 6px;\n  border-right: none;\n  border-left: 1px dashed #0e4980;\n  border-radius: 2px 0 0 2px;\n}\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover)::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child::after,\n.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child::after {\n  right: 6px;\n  left: 6px;\n  border-right: 1px dashed #0e4980;\n  border-left: 1px dashed #0e4980;\n  border-radius: 2px;\n}\n.ant-picker-dropdown-rtl .ant-picker-footer-extra {\n  direction: rtl;\n  text-align: right;\n}\n.ant-picker-panel-rtl .ant-picker-time-panel {\n  direction: ltr;\n}\n.ant-descriptions-header {\n  display: flex;\n  align-items: center;\n  margin-bottom: 20px;\n}\n.ant-descriptions-title {\n  flex: auto;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: bold;\n  font-size: 16px;\n  line-height: 1.5715;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-descriptions-extra {\n  margin-left: auto;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n}\n.ant-descriptions-view {\n  width: 100%;\n  border-radius: 2px;\n}\n.ant-descriptions-view table {\n  width: 100%;\n  table-layout: fixed;\n}\n.ant-descriptions-row > th,\n.ant-descriptions-row > td {\n  padding-bottom: 16px;\n}\n.ant-descriptions-row:last-child {\n  border-bottom: none;\n}\n.ant-descriptions-item-label {\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 1.5715;\n  text-align: start;\n}\n.ant-descriptions-item-label::after {\n  content: ':';\n  position: relative;\n  top: -0.5px;\n  margin: 0 8px 0 2px;\n}\n.ant-descriptions-item-label.ant-descriptions-item-no-colon::after {\n  content: ' ';\n}\n.ant-descriptions-item-no-label::after {\n  margin: 0;\n  content: '';\n}\n.ant-descriptions-item-content {\n  display: table-cell;\n  flex: 1;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  word-break: break-word;\n  overflow-wrap: break-word;\n}\n.ant-descriptions-item {\n  padding-bottom: 0;\n  vertical-align: top;\n}\n.ant-descriptions-item-container {\n  display: flex;\n}\n.ant-descriptions-item-container .ant-descriptions-item-label,\n.ant-descriptions-item-container .ant-descriptions-item-content {\n  display: inline-flex;\n  align-items: baseline;\n}\n.ant-descriptions-middle .ant-descriptions-row > th,\n.ant-descriptions-middle .ant-descriptions-row > td {\n  padding-bottom: 12px;\n}\n.ant-descriptions-small .ant-descriptions-row > th,\n.ant-descriptions-small .ant-descriptions-row > td {\n  padding-bottom: 8px;\n}\n.ant-descriptions-bordered .ant-descriptions-view {\n  border: 1px solid #303030;\n}\n.ant-descriptions-bordered .ant-descriptions-view > table {\n  table-layout: auto;\n  border-collapse: collapse;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label,\n.ant-descriptions-bordered .ant-descriptions-item-content {\n  padding: 16px 24px;\n  border-right: 1px solid #303030;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label:last-child,\n.ant-descriptions-bordered .ant-descriptions-item-content:last-child {\n  border-right: none;\n}\n.ant-descriptions-bordered .ant-descriptions-item-label {\n  background-color: rgba(255, 255, 255, 0.04);\n}\n.ant-descriptions-bordered .ant-descriptions-item-label::after {\n  display: none;\n}\n.ant-descriptions-bordered .ant-descriptions-row {\n  border-bottom: 1px solid #303030;\n}\n.ant-descriptions-bordered .ant-descriptions-row:last-child {\n  border-bottom: none;\n}\n.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label,\n.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content {\n  padding: 12px 24px;\n}\n.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label,\n.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content {\n  padding: 8px 16px;\n}\n.ant-descriptions-rtl {\n  direction: rtl;\n}\n.ant-descriptions-rtl .ant-descriptions-item-label::after {\n  margin: 0 2px 0 8px;\n}\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label,\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content {\n  border-right: none;\n  border-left: 1px solid #303030;\n}\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label:last-child,\n.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content:last-child {\n  border-left: none;\n}\n.ant-divider {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  border-top: 1px solid rgba(255, 255, 255, 0.12);\n}\n.ant-divider-vertical {\n  position: relative;\n  top: -0.06em;\n  display: inline-block;\n  height: 0.9em;\n  margin: 0 8px;\n  vertical-align: middle;\n  border-top: 0;\n  border-left: 1px solid rgba(255, 255, 255, 0.12);\n}\n.ant-divider-horizontal {\n  display: flex;\n  clear: both;\n  width: 100%;\n  min-width: 100%;\n  margin: 24px 0;\n}\n.ant-divider-horizontal.ant-divider-with-text {\n  display: flex;\n  align-items: center;\n  margin: 16px 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  white-space: nowrap;\n  text-align: center;\n  border-top: 0;\n  border-top-color: rgba(255, 255, 255, 0.12);\n}\n.ant-divider-horizontal.ant-divider-with-text::before,\n.ant-divider-horizontal.ant-divider-with-text::after {\n  position: relative;\n  width: 50%;\n  border-top: 1px solid transparent;\n  border-top-color: inherit;\n  border-bottom: 0;\n  transform: translateY(50%);\n  content: '';\n}\n.ant-divider-horizontal.ant-divider-with-text-left::before {\n  width: 5%;\n}\n.ant-divider-horizontal.ant-divider-with-text-left::after {\n  width: 95%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right::before {\n  width: 95%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right::after {\n  width: 5%;\n}\n.ant-divider-inner-text {\n  display: inline-block;\n  padding: 0 1em;\n}\n.ant-divider-dashed {\n  background: none;\n  border-color: rgba(255, 255, 255, 0.12);\n  border-style: dashed;\n  border-width: 1px 0 0;\n}\n.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::before,\n.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::after {\n  border-style: dashed none none;\n}\n.ant-divider-vertical.ant-divider-dashed {\n  border-width: 0 0 0 1px;\n}\n.ant-divider-plain.ant-divider-with-text {\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left::before {\n  width: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left::after {\n  width: 100%;\n}\n.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text {\n  padding-left: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right::before {\n  width: 100%;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right::after {\n  width: 0;\n}\n.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text {\n  padding-right: 0;\n}\n.ant-divider-rtl {\n  direction: rtl;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::before {\n  width: 95%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::after {\n  width: 5%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::before {\n  width: 5%;\n}\n.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::after {\n  width: 95%;\n}\n.ant-drawer {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1000;\n  pointer-events: none;\n}\n.ant-drawer-inline {\n  position: absolute;\n}\n.ant-drawer-mask {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1000;\n  background: rgba(0, 0, 0, 0.45);\n  pointer-events: auto;\n}\n.ant-drawer-content-wrapper {\n  position: absolute;\n  z-index: 1000;\n  transition: all 0.3s;\n}\n.ant-drawer-content-wrapper-hidden {\n  display: none;\n}\n.ant-drawer-left > .ant-drawer-content-wrapper {\n  top: 0;\n  bottom: 0;\n  left: 0;\n  box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.32), 9px 0 28px 0 rgba(0, 0, 0, 0.2), 12px 0 48px 16px rgba(0, 0, 0, 0.12);\n}\n.ant-drawer-right > .ant-drawer-content-wrapper {\n  top: 0;\n  right: 0;\n  bottom: 0;\n  box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03);\n}\n.ant-drawer-top > .ant-drawer-content-wrapper {\n  top: 0;\n  right: 0;\n  left: 0;\n  box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.32), 0 9px 28px 0 rgba(0, 0, 0, 0.2), 0 12px 48px 16px rgba(0, 0, 0, 0.12);\n}\n.ant-drawer-bottom > .ant-drawer-content-wrapper {\n  right: 0;\n  bottom: 0;\n  left: 0;\n  box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.32), 0 -9px 28px 0 rgba(0, 0, 0, 0.2), 0 -12px 48px 16px rgba(0, 0, 0, 0.12);\n}\n.ant-drawer-content {\n  width: 100%;\n  height: 100%;\n  overflow: auto;\n  background: #1f1f1f;\n  pointer-events: auto;\n}\n.ant-drawer-wrapper-body {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n}\n.ant-drawer-header {\n  display: flex;\n  flex: 0;\n  align-items: center;\n  padding: 16px 24px;\n  font-size: 16px;\n  line-height: 22px;\n  border-bottom: 1px solid #303030;\n}\n.ant-drawer-header-title {\n  display: flex;\n  flex: 1;\n  align-items: center;\n  min-width: 0;\n  min-height: 0;\n}\n.ant-drawer-extra {\n  flex: none;\n}\n.ant-drawer-close {\n  display: inline-block;\n  margin-right: 12px;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: 700;\n  font-size: 16px;\n  font-style: normal;\n  line-height: 1;\n  text-align: center;\n  text-transform: none;\n  text-decoration: none;\n  background: transparent;\n  border: 0;\n  outline: 0;\n  cursor: pointer;\n  transition: color 0.3s;\n  text-rendering: auto;\n}\n.ant-drawer-close:focus,\n.ant-drawer-close:hover {\n  color: rgba(255, 255, 255, 0.75);\n  text-decoration: none;\n}\n.ant-drawer-title {\n  flex: 1;\n  margin: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  line-height: 22px;\n}\n.ant-drawer-body {\n  flex: 1;\n  min-width: 0;\n  min-height: 0;\n  padding: 24px;\n  overflow: auto;\n}\n.ant-drawer-footer {\n  flex-shrink: 0;\n  padding: 10px 16px;\n  border-top: 1px solid #303030;\n}\n.panel-motion-enter-start,\n.panel-motion-appear-start,\n.panel-motion-leave-start {\n  transition: none;\n}\n.panel-motion-enter-active,\n.panel-motion-appear-active,\n.panel-motion-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active,\n.ant-drawer-mask-motion-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-mask-motion-enter,\n.ant-drawer-mask-motion-appear {\n  opacity: 0;\n}\n.ant-drawer-mask-motion-enter-active,\n.ant-drawer-mask-motion-appear-active {\n  opacity: 1;\n}\n.ant-drawer-mask-motion-leave {\n  opacity: 1;\n}\n.ant-drawer-mask-motion-leave-active {\n  opacity: 0;\n}\n.ant-drawer-panel-motion-left-enter-start,\n.ant-drawer-panel-motion-left-appear-start,\n.ant-drawer-panel-motion-left-leave-start {\n  transition: none;\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active,\n.ant-drawer-panel-motion-left-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-panel-motion-left-enter-start,\n.ant-drawer-panel-motion-left-appear-start {\n  transform: translateX(-100%) !important;\n}\n.ant-drawer-panel-motion-left-enter-active,\n.ant-drawer-panel-motion-left-appear-active {\n  transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave {\n  transform: translateX(0);\n}\n.ant-drawer-panel-motion-left-leave-active {\n  transform: translateX(-100%);\n}\n.ant-drawer-panel-motion-right-enter-start,\n.ant-drawer-panel-motion-right-appear-start,\n.ant-drawer-panel-motion-right-leave-start {\n  transition: none;\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active,\n.ant-drawer-panel-motion-right-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-panel-motion-right-enter-start,\n.ant-drawer-panel-motion-right-appear-start {\n  transform: translateX(100%) !important;\n}\n.ant-drawer-panel-motion-right-enter-active,\n.ant-drawer-panel-motion-right-appear-active {\n  transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave {\n  transform: translateX(0);\n}\n.ant-drawer-panel-motion-right-leave-active {\n  transform: translateX(100%);\n}\n.ant-drawer-panel-motion-top-enter-start,\n.ant-drawer-panel-motion-top-appear-start,\n.ant-drawer-panel-motion-top-leave-start {\n  transition: none;\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active,\n.ant-drawer-panel-motion-top-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-panel-motion-top-enter-start,\n.ant-drawer-panel-motion-top-appear-start {\n  transform: translateY(-100%) !important;\n}\n.ant-drawer-panel-motion-top-enter-active,\n.ant-drawer-panel-motion-top-appear-active {\n  transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave {\n  transform: translateY(0);\n}\n.ant-drawer-panel-motion-top-leave-active {\n  transform: translateY(-100%);\n}\n.ant-drawer-panel-motion-bottom-enter-start,\n.ant-drawer-panel-motion-bottom-appear-start,\n.ant-drawer-panel-motion-bottom-leave-start {\n  transition: none;\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active,\n.ant-drawer-panel-motion-bottom-leave-active {\n  transition: all 0.3s;\n}\n.ant-drawer-panel-motion-bottom-enter-start,\n.ant-drawer-panel-motion-bottom-appear-start {\n  transform: translateY(100%) !important;\n}\n.ant-drawer-panel-motion-bottom-enter-active,\n.ant-drawer-panel-motion-bottom-appear-active {\n  transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave {\n  transform: translateY(0);\n}\n.ant-drawer-panel-motion-bottom-leave-active {\n  transform: translateY(100%);\n}\n.ant-drawer-rtl {\n  direction: rtl;\n}\n.ant-drawer-rtl .ant-drawer-close {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-drawer .ant-picker-clear,\n.ant-drawer .ant-slider-handle,\n.ant-drawer .ant-anchor-wrapper,\n.ant-drawer .ant-collapse-content,\n.ant-drawer .ant-timeline-item-head,\n.ant-drawer .ant-card {\n  background-color: #1f1f1f;\n}\n.ant-drawer .ant-transfer-list-header {\n  background: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-drawer tr.ant-table-expanded-row > td,\n.ant-drawer tr.ant-table-expanded-row:hover > td {\n  background: #272727;\n}\n.ant-drawer .ant-table.ant-table-small thead > tr > th {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table {\n  background-color: #1f1f1f;\n}\n.ant-drawer .ant-table .ant-table-row-expand-icon {\n  border: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table tfoot > tr > th,\n.ant-drawer .ant-table tfoot > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table thead > tr > th {\n  background-color: #272727;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table tbody > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-left,\n.ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-right {\n  background-color: #1f1f1f;\n}\n.ant-drawer .ant-table tbody > tr.ant-table-row:hover > td {\n  background: #303030;\n}\n.ant-drawer .ant-table.ant-table-bordered .ant-table-title {\n  border: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table.ant-table-bordered thead > tr > th,\n.ant-drawer .ant-table.ant-table-bordered tbody > tr > td,\n.ant-drawer .ant-table.ant-table-bordered tfoot > tr > th,\n.ant-drawer .ant-table.ant-table-bordered tfoot > tr > td {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table.ant-table-bordered .ant-table-cell-fix-right-first::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table.ant-table-bordered table thead > tr:not(:last-child) > th {\n  border-bottom: 1px solid #303030;\n}\n.ant-drawer .ant-table.ant-table-bordered .ant-table-container {\n  border: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table.ant-table-bordered .ant-table-expanded-row-fixed::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table.ant-table-bordered .ant-table-footer {\n  border: 1px solid #3a3a3a;\n}\n.ant-drawer .ant-table .ant-table-filter-trigger-container-open {\n  background-color: #525252;\n}\n.ant-drawer .ant-picker-calendar-full {\n  background-color: #1f1f1f;\n}\n.ant-drawer .ant-picker-calendar-full .ant-picker-panel {\n  background-color: #1f1f1f;\n}\n.ant-drawer .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {\n  border-top: 2px solid #3a3a3a;\n}\n.ant-drawer .ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-active {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #1f1f1f;\n}\n.ant-drawer .ant-badge-count {\n  box-shadow: 0 0 0 1px #1f1f1f;\n}\n.ant-drawer .ant-tree-show-line .ant-tree-switcher {\n  background: #1f1f1f;\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-danger {\n  color: #a61d24;\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover {\n  color: #fff;\n  background-color: #a61d24;\n}\n.ant-dropdown {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n  z-index: 1050;\n  display: block;\n}\n.ant-dropdown::before {\n  position: absolute;\n  top: -4px;\n  right: 0;\n  bottom: -4px;\n  left: -7px;\n  z-index: -9999;\n  opacity: 0.0001;\n  content: ' ';\n}\n.ant-dropdown-wrap {\n  position: relative;\n}\n.ant-dropdown-wrap .ant-btn > .anticon-down {\n  font-size: 10px;\n}\n.ant-dropdown-wrap .anticon-down::before {\n  transition: transform 0.2s;\n}\n.ant-dropdown-wrap-open .anticon-down::before {\n  transform: rotate(180deg);\n}\n.ant-dropdown-hidden,\n.ant-dropdown-menu-hidden,\n.ant-dropdown-menu-submenu-hidden {\n  display: none;\n}\n.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,\n.ant-dropdown-show-arrow.ant-dropdown-placement-top,\n.ant-dropdown-show-arrow.ant-dropdown-placement-topRight {\n  padding-bottom: 15.3137085px;\n}\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,\n.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight {\n  padding-top: 15.3137085px;\n}\n.ant-dropdown-arrow {\n  position: absolute;\n  z-index: 1;\n  display: block;\n  width: 11.3137085px;\n  height: 11.3137085px;\n  border-radius: 0 0 2px;\n  pointer-events: none;\n}\n.ant-dropdown-arrow::before {\n  position: absolute;\n  top: -11.3137085px;\n  left: -11.3137085px;\n  width: 33.9411255px;\n  height: 33.9411255px;\n  background: #1f1f1f;\n  background-repeat: no-repeat;\n  background-position: -10px -10px;\n  content: '';\n  clip-path: inset(33% 33%);\n  clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-dropdown-placement-top > .ant-dropdown-arrow,\n.ant-dropdown-placement-topLeft > .ant-dropdown-arrow,\n.ant-dropdown-placement-topRight > .ant-dropdown-arrow {\n  bottom: 10px;\n  box-shadow: 3px 3px 7px -3px rgba(0, 0, 0, 0.1);\n  transform: rotate(45deg);\n}\n.ant-dropdown-placement-top > .ant-dropdown-arrow {\n  left: 50%;\n  transform: translateX(-50%) rotate(45deg);\n}\n.ant-dropdown-placement-topLeft > .ant-dropdown-arrow {\n  left: 16px;\n}\n.ant-dropdown-placement-topRight > .ant-dropdown-arrow {\n  right: 16px;\n}\n.ant-dropdown-placement-bottom > .ant-dropdown-arrow,\n.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow,\n.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow {\n  top: 9.41421356px;\n  box-shadow: 2px 2px 5px -2px rgba(0, 0, 0, 0.1);\n  transform: rotate(-135deg) translateY(-0.5px);\n}\n.ant-dropdown-placement-bottom > .ant-dropdown-arrow {\n  left: 50%;\n  transform: translateX(-50%) rotate(-135deg) translateY(-0.5px);\n}\n.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow {\n  left: 16px;\n}\n.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow {\n  right: 16px;\n}\n.ant-dropdown-menu {\n  position: relative;\n  margin: 0;\n  padding: 4px 0;\n  text-align: left;\n  list-style-type: none;\n  background-color: #1f1f1f;\n  background-clip: padding-box;\n  border-radius: 2px;\n  outline: none;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-dropdown-menu-item-group-title {\n  padding: 5px 12px;\n  color: rgba(255, 255, 255, 0.45);\n  transition: all 0.3s;\n}\n.ant-dropdown-menu-submenu-popup {\n  position: absolute;\n  z-index: 1050;\n  background: transparent;\n  box-shadow: none;\n  transform-origin: 0 0;\n}\n.ant-dropdown-menu-submenu-popup ul,\n.ant-dropdown-menu-submenu-popup li {\n  list-style: none;\n}\n.ant-dropdown-menu-submenu-popup ul {\n  margin-right: 0.3em;\n  margin-left: 0.3em;\n}\n.ant-dropdown-menu-item {\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n.ant-dropdown-menu-item-icon {\n  min-width: 12px;\n  margin-right: 8px;\n  font-size: 12px;\n}\n.ant-dropdown-menu-title-content {\n  flex: auto;\n}\n.ant-dropdown-menu-title-content > a {\n  color: inherit;\n  transition: all 0.3s;\n}\n.ant-dropdown-menu-title-content > a:hover {\n  color: inherit;\n}\n.ant-dropdown-menu-title-content > a::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  content: '';\n}\n.ant-dropdown-menu-item,\n.ant-dropdown-menu-submenu-title {\n  clear: both;\n  margin: 0;\n  padding: 5px 12px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 22px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-dropdown-menu-item-selected,\n.ant-dropdown-menu-submenu-title-selected {\n  color: #177ddc;\n  background-color: #111b26;\n}\n.ant-dropdown-menu-item:hover,\n.ant-dropdown-menu-submenu-title:hover,\n.ant-dropdown-menu-item.ant-dropdown-menu-item-active,\n.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled,\n.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled:hover,\n.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled:hover,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled:hover,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled:hover {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled a,\n.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled a,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled a,\n.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled a {\n  pointer-events: none;\n}\n.ant-dropdown-menu-item-divider,\n.ant-dropdown-menu-submenu-title-divider {\n  height: 1px;\n  margin: 4px 0;\n  overflow: hidden;\n  line-height: 0;\n  background-color: #303030;\n}\n.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,\n.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon {\n  position: absolute;\n  right: 8px;\n}\n.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,\n.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon {\n  margin-right: 0 !important;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 10px;\n  font-style: normal;\n}\n.ant-dropdown-menu-item-group-list {\n  margin: 0 8px;\n  padding: 0;\n  list-style: none;\n}\n.ant-dropdown-menu-submenu-title {\n  padding-right: 24px;\n}\n.ant-dropdown-menu-submenu-vertical {\n  position: relative;\n}\n.ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu {\n  position: absolute;\n  top: 0;\n  left: 100%;\n  min-width: 100%;\n  margin-left: 4px;\n  transform-origin: 0 0;\n}\n.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,\n.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title {\n  color: #177ddc;\n}\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight,\n.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight {\n  animation-name: antSlideUpIn;\n}\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight,\n.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight {\n  animation-name: antSlideDownIn;\n}\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,\n.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight {\n  animation-name: antSlideUpOut;\n}\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,\n.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight {\n  animation-name: antSlideDownOut;\n}\n.ant-dropdown-trigger > .anticon.anticon-down,\n.ant-dropdown-link > .anticon.anticon-down,\n.ant-dropdown-button > .anticon.anticon-down {\n  font-size: 10px;\n  vertical-align: baseline;\n}\n.ant-dropdown-button {\n  white-space: nowrap;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading,\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading + .ant-btn {\n  cursor: default;\n  pointer-events: none;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn-loading + .ant-btn::before {\n  display: block;\n}\n.ant-dropdown-button.ant-btn-group > .ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only) {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-dropdown-menu-dark,\n.ant-dropdown-menu-dark .ant-dropdown-menu {\n  background: #1f1f1f;\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a {\n  color: rgba(255, 255, 255, 0.65);\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow::after,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a .ant-dropdown-menu-submenu-arrow::after {\n  color: rgba(255, 255, 255, 0.65);\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a:hover {\n  color: #fff;\n  background: transparent;\n}\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,\n.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a {\n  color: #fff;\n  background: #177ddc;\n}\n.ant-dropdown-rtl {\n  direction: rtl;\n}\n.ant-dropdown-rtl.ant-dropdown::before {\n  right: -7px;\n  left: 0;\n}\n.ant-dropdown-menu.ant-dropdown-menu-rtl {\n  direction: rtl;\n  text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item-group-title,\n.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title {\n  direction: rtl;\n  text-align: right;\n}\n.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl {\n  transform-origin: 100% 0;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li {\n  text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title {\n  text-align: right;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-item > span > .anticon:first-child,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > span > .anticon:first-child {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon {\n  right: auto;\n  left: 8px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon {\n  margin-left: 0 !important;\n  transform: scaleX(-1);\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-title {\n  padding-right: 12px;\n  padding-left: 24px;\n}\n.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu {\n  right: 100%;\n  left: 0;\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-empty {\n  margin: 0 8px;\n  font-size: 14px;\n  line-height: 1.5715;\n  text-align: center;\n}\n.ant-empty-image {\n  height: 100px;\n  margin-bottom: 8px;\n}\n.ant-empty-image img {\n  height: 100%;\n}\n.ant-empty-image svg {\n  height: 100%;\n  margin: auto;\n}\n.ant-empty-footer {\n  margin-top: 16px;\n}\n.ant-empty-normal {\n  margin: 32px 0;\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-empty-normal .ant-empty-image {\n  height: 40px;\n}\n.ant-empty-small {\n  margin: 8px 0;\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-empty-small .ant-empty-image {\n  height: 35px;\n}\n.ant-empty-img-default-ellipse {\n  fill: #fff;\n  fill-opacity: 0.08;\n}\n.ant-empty-img-default-path-1 {\n  fill: #262626;\n}\n.ant-empty-img-default-path-2 {\n  fill: url('#linearGradient-1');\n}\n.ant-empty-img-default-path-3 {\n  fill: #595959;\n}\n.ant-empty-img-default-path-4 {\n  fill: #434343;\n}\n.ant-empty-img-default-path-5 {\n  fill: #595959;\n}\n.ant-empty-img-default-g {\n  fill: #434343;\n}\n.ant-empty-img-simple-ellipse {\n  fill: #fff;\n  fill-opacity: 0.08;\n}\n.ant-empty-img-simple-g {\n  stroke: #434343;\n}\n.ant-empty-img-simple-path {\n  fill: #262626;\n  stroke: #434343;\n}\n.ant-empty-rtl {\n  direction: rtl;\n}\n.ant-form-item .ant-input-number + .ant-form-text {\n  margin-left: 8px;\n}\n.ant-form-inline {\n  display: flex;\n  flex-wrap: wrap;\n}\n.ant-form-inline .ant-form-item {\n  flex: none;\n  flex-wrap: nowrap;\n  margin-right: 16px;\n  margin-bottom: 0;\n}\n.ant-form-inline .ant-form-item-with-help {\n  margin-bottom: 24px;\n}\n.ant-form-inline .ant-form-item > .ant-form-item-label,\n.ant-form-inline .ant-form-item > .ant-form-item-control {\n  display: inline-block;\n  vertical-align: top;\n}\n.ant-form-inline .ant-form-item > .ant-form-item-label {\n  flex: none;\n}\n.ant-form-inline .ant-form-item .ant-form-text {\n  display: inline-block;\n}\n.ant-form-inline .ant-form-item .ant-form-item-has-feedback {\n  display: inline-block;\n}\n.ant-form-horizontal .ant-form-item-label {\n  flex-grow: 0;\n}\n.ant-form-horizontal .ant-form-item-control {\n  flex: 1 1 0;\n  min-width: 0;\n}\n.ant-form-horizontal .ant-form-item-label[class$='-24'] + .ant-form-item-control,\n.ant-form-horizontal .ant-form-item-label[class*='-24 '] + .ant-form-item-control {\n  min-width: unset;\n}\n.ant-form-vertical .ant-form-item-row {\n  flex-direction: column;\n}\n.ant-form-vertical .ant-form-item-label > label {\n  height: auto;\n}\n.ant-form-vertical .ant-form-item .ant-form-item-control {\n  width: 100%;\n}\n.ant-form-vertical .ant-form-item-label,\n.ant-col-24.ant-form-item-label,\n.ant-col-xl-24.ant-form-item-label {\n  padding: 0 0 8px;\n  line-height: 1.5715;\n  white-space: initial;\n  text-align: left;\n}\n.ant-form-vertical .ant-form-item-label > label,\n.ant-col-24.ant-form-item-label > label,\n.ant-col-xl-24.ant-form-item-label > label {\n  margin: 0;\n}\n.ant-form-vertical .ant-form-item-label > label::after,\n.ant-col-24.ant-form-item-label > label::after,\n.ant-col-xl-24.ant-form-item-label > label::after {\n  display: none;\n}\n.ant-form-rtl.ant-form-vertical .ant-form-item-label,\n.ant-form-rtl.ant-col-24.ant-form-item-label,\n.ant-form-rtl.ant-col-xl-24.ant-form-item-label {\n  text-align: right;\n}\n@media (max-width: 575px) {\n  .ant-form-item .ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-form-item .ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-form-item .ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-form-item .ant-form-item-label {\n    text-align: right;\n  }\n  .ant-form .ant-form-item {\n    flex-wrap: wrap;\n  }\n  .ant-form .ant-form-item .ant-form-item-label,\n  .ant-form .ant-form-item .ant-form-item-control {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-xs-24.ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-col-xs-24.ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-col-xs-24.ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-col-xs-24.ant-form-item-label {\n    text-align: right;\n  }\n}\n@media (max-width: 767px) {\n  .ant-col-sm-24.ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-col-sm-24.ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-col-sm-24.ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-col-sm-24.ant-form-item-label {\n    text-align: right;\n  }\n}\n@media (max-width: 991px) {\n  .ant-col-md-24.ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-col-md-24.ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-col-md-24.ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-col-md-24.ant-form-item-label {\n    text-align: right;\n  }\n}\n@media (max-width: 1199px) {\n  .ant-col-lg-24.ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-col-lg-24.ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-col-lg-24.ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-col-lg-24.ant-form-item-label {\n    text-align: right;\n  }\n}\n@media (max-width: 1599px) {\n  .ant-col-xl-24.ant-form-item-label {\n    padding: 0 0 8px;\n    line-height: 1.5715;\n    white-space: initial;\n    text-align: left;\n  }\n  .ant-col-xl-24.ant-form-item-label > label {\n    margin: 0;\n  }\n  .ant-col-xl-24.ant-form-item-label > label::after {\n    display: none;\n  }\n  .ant-form-rtl.ant-col-xl-24.ant-form-item-label {\n    text-align: right;\n  }\n}\n.ant-form-item {\n  /* Some non-status related component style is in `components.less` */\n  /* To support leave along ErrorList. We add additional className to handle explain style */\n}\n.ant-form-item-explain-error {\n  color: #a61d24;\n}\n.ant-form-item-explain-warning {\n  color: #d89614;\n}\n.ant-form-item-has-feedback .ant-switch {\n  margin: 2px 0 4px;\n}\n.ant-form-item-has-warning .ant-form-item-split {\n  color: #d89614;\n}\n.ant-form-item-has-error .ant-form-item-split {\n  color: #a61d24;\n}\n.ant-form {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n}\n.ant-form legend {\n  display: block;\n  width: 100%;\n  margin-bottom: 20px;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 16px;\n  line-height: inherit;\n  border: 0;\n  border-bottom: 1px solid #434343;\n}\n.ant-form label {\n  font-size: 14px;\n}\n.ant-form input[type='search'] {\n  box-sizing: border-box;\n}\n.ant-form input[type='radio'],\n.ant-form input[type='checkbox'] {\n  line-height: normal;\n}\n.ant-form input[type='file'] {\n  display: block;\n}\n.ant-form input[type='range'] {\n  display: block;\n  width: 100%;\n}\n.ant-form select[multiple],\n.ant-form select[size] {\n  height: auto;\n}\n.ant-form input[type='file']:focus,\n.ant-form input[type='radio']:focus,\n.ant-form input[type='checkbox']:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.ant-form output {\n  display: block;\n  padding-top: 15px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n}\n.ant-form .ant-form-text {\n  display: inline-block;\n  padding-right: 8px;\n}\n.ant-form-small .ant-form-item-label > label {\n  height: 24px;\n}\n.ant-form-small .ant-form-item-control-input {\n  min-height: 24px;\n}\n.ant-form-large .ant-form-item-label > label {\n  height: 40px;\n}\n.ant-form-large .ant-form-item-control-input {\n  min-height: 40px;\n}\n.ant-form-item {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  margin-bottom: 24px;\n  vertical-align: top;\n}\n.ant-form-item-with-help {\n  transition: none;\n}\n.ant-form-item-hidden,\n.ant-form-item-hidden.ant-row {\n  display: none;\n}\n.ant-form-item-label {\n  display: inline-block;\n  flex-grow: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  text-align: right;\n  vertical-align: middle;\n}\n.ant-form-item-label-left {\n  text-align: left;\n}\n.ant-form-item-label-wrap {\n  overflow: unset;\n  line-height: 1.3215em;\n  white-space: unset;\n}\n.ant-form-item-label > label {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  max-width: 100%;\n  height: 32px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n}\n.ant-form-item-label > label > .anticon {\n  font-size: 14px;\n  vertical-align: top;\n}\n.ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {\n  display: inline-block;\n  margin-right: 4px;\n  color: #a61d24;\n  font-size: 14px;\n  font-family: SimSun, sans-serif;\n  line-height: 1;\n  content: '*';\n}\n.ant-form-hide-required-mark .ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {\n  display: none;\n}\n.ant-form-item-label > label .ant-form-item-optional {\n  display: inline-block;\n  margin-left: 4px;\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-form-hide-required-mark .ant-form-item-label > label .ant-form-item-optional {\n  display: none;\n}\n.ant-form-item-label > label .ant-form-item-tooltip {\n  color: rgba(255, 255, 255, 0.45);\n  cursor: help;\n  writing-mode: horizontal-tb;\n  margin-inline-start: 4px;\n}\n.ant-form-item-label > label::after {\n  content: ':';\n  position: relative;\n  top: -0.5px;\n  margin: 0 8px 0 2px;\n}\n.ant-form-item-label > label.ant-form-item-no-colon::after {\n  content: ' ';\n}\n.ant-form-item-control {\n  display: flex;\n  flex-direction: column;\n  flex-grow: 1;\n}\n.ant-form-item-control:first-child:not([class^='ant-col-']):not([class*=' ant-col-']) {\n  width: 100%;\n}\n.ant-form-item-control-input {\n  position: relative;\n  display: flex;\n  align-items: center;\n  min-height: 32px;\n}\n.ant-form-item-control-input-content {\n  flex: auto;\n  max-width: 100%;\n}\n.ant-form-item-explain,\n.ant-form-item-extra {\n  clear: both;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.5715;\n  transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.ant-form-item-explain-connected {\n  width: 100%;\n}\n.ant-form-item-extra {\n  min-height: 24px;\n}\n.ant-form-item-with-help .ant-form-item-explain {\n  height: auto;\n  opacity: 1;\n}\n.ant-form-item-feedback-icon {\n  font-size: 14px;\n  text-align: center;\n  visibility: visible;\n  animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);\n  pointer-events: none;\n}\n.ant-form-item-feedback-icon-success {\n  color: #49aa19;\n}\n.ant-form-item-feedback-icon-error {\n  color: #a61d24;\n}\n.ant-form-item-feedback-icon-warning {\n  color: #d89614;\n}\n.ant-form-item-feedback-icon-validating {\n  color: #177ddc;\n}\n.ant-show-help {\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-show-help-appear,\n.ant-show-help-enter {\n  opacity: 0;\n}\n.ant-show-help-appear-active,\n.ant-show-help-enter-active {\n  opacity: 1;\n}\n.ant-show-help-leave {\n  opacity: 1;\n}\n.ant-show-help-leave-active {\n  opacity: 0;\n}\n.ant-show-help-item {\n  overflow: hidden;\n  transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-show-help-item-appear,\n.ant-show-help-item-enter {\n  transform: translateY(-5px);\n  opacity: 0;\n}\n.ant-show-help-item-appear-active,\n.ant-show-help-item-enter-active {\n  transform: translateY(0);\n  opacity: 1;\n}\n.ant-show-help-item-leave {\n  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;\n}\n.ant-show-help-item-leave-active {\n  transform: translateY(-5px);\n}\n@keyframes diffZoomIn1 {\n  0% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@keyframes diffZoomIn2 {\n  0% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@keyframes diffZoomIn3 {\n  0% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n.ant-form-rtl {\n  direction: rtl;\n}\n.ant-form-rtl .ant-form-item-label {\n  text-align: left;\n}\n.ant-form-rtl .ant-form-item-label > label.ant-form-item-required::before {\n  margin-right: 0;\n  margin-left: 4px;\n}\n.ant-form-rtl .ant-form-item-label > label::after {\n  margin: 0 2px 0 8px;\n}\n.ant-form-rtl .ant-form-item-label > label .ant-form-item-optional {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-col-rtl .ant-form-item-control:first-child {\n  width: 100%;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input {\n  padding-right: 11px;\n  padding-left: 24px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix {\n  padding-right: 11px;\n  padding-left: 18px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input {\n  padding: 0;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number {\n  padding: 0;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix {\n  right: auto;\n  left: 28px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-input-number {\n  padding-left: 18px;\n}\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-clear,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-clear,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-arrow,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-clear {\n  right: auto;\n  left: 32px;\n}\n.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-selection-selected-value,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value,\n.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon) > .ant-select .ant-select-selection-selected-value {\n  padding-right: 0;\n  padding-left: 42px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow {\n  margin-right: 0;\n  margin-left: 19px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear {\n  right: auto;\n  left: 32px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker {\n  padding-right: 11px;\n  padding-left: 29.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large {\n  padding-right: 11px;\n  padding-left: 29.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small {\n  padding-right: 7px;\n  padding-left: 25.2px;\n}\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,\n.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon {\n  right: auto;\n  left: 0;\n}\n.ant-form-rtl.ant-form-inline .ant-form-item {\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-row {\n  display: flex;\n  flex-flow: row wrap;\n  min-width: 0;\n}\n.ant-row::before,\n.ant-row::after {\n  display: flex;\n}\n.ant-row-no-wrap {\n  flex-wrap: nowrap;\n}\n.ant-row-start {\n  justify-content: flex-start;\n}\n.ant-row-center {\n  justify-content: center;\n}\n.ant-row-end {\n  justify-content: flex-end;\n}\n.ant-row-space-between {\n  justify-content: space-between;\n}\n.ant-row-space-around {\n  justify-content: space-around;\n}\n.ant-row-space-evenly {\n  justify-content: space-evenly;\n}\n.ant-row-top {\n  align-items: flex-start;\n}\n.ant-row-middle {\n  align-items: center;\n}\n.ant-row-bottom {\n  align-items: flex-end;\n}\n.ant-col {\n  position: relative;\n  max-width: 100%;\n  min-height: 1px;\n}\n.ant-col-24 {\n  display: block;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n.ant-col-push-24 {\n  left: 100%;\n}\n.ant-col-pull-24 {\n  right: 100%;\n}\n.ant-col-offset-24 {\n  margin-left: 100%;\n}\n.ant-col-order-24 {\n  order: 24;\n}\n.ant-col-23 {\n  display: block;\n  flex: 0 0 95.83333333%;\n  max-width: 95.83333333%;\n}\n.ant-col-push-23 {\n  left: 95.83333333%;\n}\n.ant-col-pull-23 {\n  right: 95.83333333%;\n}\n.ant-col-offset-23 {\n  margin-left: 95.83333333%;\n}\n.ant-col-order-23 {\n  order: 23;\n}\n.ant-col-22 {\n  display: block;\n  flex: 0 0 91.66666667%;\n  max-width: 91.66666667%;\n}\n.ant-col-push-22 {\n  left: 91.66666667%;\n}\n.ant-col-pull-22 {\n  right: 91.66666667%;\n}\n.ant-col-offset-22 {\n  margin-left: 91.66666667%;\n}\n.ant-col-order-22 {\n  order: 22;\n}\n.ant-col-21 {\n  display: block;\n  flex: 0 0 87.5%;\n  max-width: 87.5%;\n}\n.ant-col-push-21 {\n  left: 87.5%;\n}\n.ant-col-pull-21 {\n  right: 87.5%;\n}\n.ant-col-offset-21 {\n  margin-left: 87.5%;\n}\n.ant-col-order-21 {\n  order: 21;\n}\n.ant-col-20 {\n  display: block;\n  flex: 0 0 83.33333333%;\n  max-width: 83.33333333%;\n}\n.ant-col-push-20 {\n  left: 83.33333333%;\n}\n.ant-col-pull-20 {\n  right: 83.33333333%;\n}\n.ant-col-offset-20 {\n  margin-left: 83.33333333%;\n}\n.ant-col-order-20 {\n  order: 20;\n}\n.ant-col-19 {\n  display: block;\n  flex: 0 0 79.16666667%;\n  max-width: 79.16666667%;\n}\n.ant-col-push-19 {\n  left: 79.16666667%;\n}\n.ant-col-pull-19 {\n  right: 79.16666667%;\n}\n.ant-col-offset-19 {\n  margin-left: 79.16666667%;\n}\n.ant-col-order-19 {\n  order: 19;\n}\n.ant-col-18 {\n  display: block;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n.ant-col-push-18 {\n  left: 75%;\n}\n.ant-col-pull-18 {\n  right: 75%;\n}\n.ant-col-offset-18 {\n  margin-left: 75%;\n}\n.ant-col-order-18 {\n  order: 18;\n}\n.ant-col-17 {\n  display: block;\n  flex: 0 0 70.83333333%;\n  max-width: 70.83333333%;\n}\n.ant-col-push-17 {\n  left: 70.83333333%;\n}\n.ant-col-pull-17 {\n  right: 70.83333333%;\n}\n.ant-col-offset-17 {\n  margin-left: 70.83333333%;\n}\n.ant-col-order-17 {\n  order: 17;\n}\n.ant-col-16 {\n  display: block;\n  flex: 0 0 66.66666667%;\n  max-width: 66.66666667%;\n}\n.ant-col-push-16 {\n  left: 66.66666667%;\n}\n.ant-col-pull-16 {\n  right: 66.66666667%;\n}\n.ant-col-offset-16 {\n  margin-left: 66.66666667%;\n}\n.ant-col-order-16 {\n  order: 16;\n}\n.ant-col-15 {\n  display: block;\n  flex: 0 0 62.5%;\n  max-width: 62.5%;\n}\n.ant-col-push-15 {\n  left: 62.5%;\n}\n.ant-col-pull-15 {\n  right: 62.5%;\n}\n.ant-col-offset-15 {\n  margin-left: 62.5%;\n}\n.ant-col-order-15 {\n  order: 15;\n}\n.ant-col-14 {\n  display: block;\n  flex: 0 0 58.33333333%;\n  max-width: 58.33333333%;\n}\n.ant-col-push-14 {\n  left: 58.33333333%;\n}\n.ant-col-pull-14 {\n  right: 58.33333333%;\n}\n.ant-col-offset-14 {\n  margin-left: 58.33333333%;\n}\n.ant-col-order-14 {\n  order: 14;\n}\n.ant-col-13 {\n  display: block;\n  flex: 0 0 54.16666667%;\n  max-width: 54.16666667%;\n}\n.ant-col-push-13 {\n  left: 54.16666667%;\n}\n.ant-col-pull-13 {\n  right: 54.16666667%;\n}\n.ant-col-offset-13 {\n  margin-left: 54.16666667%;\n}\n.ant-col-order-13 {\n  order: 13;\n}\n.ant-col-12 {\n  display: block;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n.ant-col-push-12 {\n  left: 50%;\n}\n.ant-col-pull-12 {\n  right: 50%;\n}\n.ant-col-offset-12 {\n  margin-left: 50%;\n}\n.ant-col-order-12 {\n  order: 12;\n}\n.ant-col-11 {\n  display: block;\n  flex: 0 0 45.83333333%;\n  max-width: 45.83333333%;\n}\n.ant-col-push-11 {\n  left: 45.83333333%;\n}\n.ant-col-pull-11 {\n  right: 45.83333333%;\n}\n.ant-col-offset-11 {\n  margin-left: 45.83333333%;\n}\n.ant-col-order-11 {\n  order: 11;\n}\n.ant-col-10 {\n  display: block;\n  flex: 0 0 41.66666667%;\n  max-width: 41.66666667%;\n}\n.ant-col-push-10 {\n  left: 41.66666667%;\n}\n.ant-col-pull-10 {\n  right: 41.66666667%;\n}\n.ant-col-offset-10 {\n  margin-left: 41.66666667%;\n}\n.ant-col-order-10 {\n  order: 10;\n}\n.ant-col-9 {\n  display: block;\n  flex: 0 0 37.5%;\n  max-width: 37.5%;\n}\n.ant-col-push-9 {\n  left: 37.5%;\n}\n.ant-col-pull-9 {\n  right: 37.5%;\n}\n.ant-col-offset-9 {\n  margin-left: 37.5%;\n}\n.ant-col-order-9 {\n  order: 9;\n}\n.ant-col-8 {\n  display: block;\n  flex: 0 0 33.33333333%;\n  max-width: 33.33333333%;\n}\n.ant-col-push-8 {\n  left: 33.33333333%;\n}\n.ant-col-pull-8 {\n  right: 33.33333333%;\n}\n.ant-col-offset-8 {\n  margin-left: 33.33333333%;\n}\n.ant-col-order-8 {\n  order: 8;\n}\n.ant-col-7 {\n  display: block;\n  flex: 0 0 29.16666667%;\n  max-width: 29.16666667%;\n}\n.ant-col-push-7 {\n  left: 29.16666667%;\n}\n.ant-col-pull-7 {\n  right: 29.16666667%;\n}\n.ant-col-offset-7 {\n  margin-left: 29.16666667%;\n}\n.ant-col-order-7 {\n  order: 7;\n}\n.ant-col-6 {\n  display: block;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n.ant-col-push-6 {\n  left: 25%;\n}\n.ant-col-pull-6 {\n  right: 25%;\n}\n.ant-col-offset-6 {\n  margin-left: 25%;\n}\n.ant-col-order-6 {\n  order: 6;\n}\n.ant-col-5 {\n  display: block;\n  flex: 0 0 20.83333333%;\n  max-width: 20.83333333%;\n}\n.ant-col-push-5 {\n  left: 20.83333333%;\n}\n.ant-col-pull-5 {\n  right: 20.83333333%;\n}\n.ant-col-offset-5 {\n  margin-left: 20.83333333%;\n}\n.ant-col-order-5 {\n  order: 5;\n}\n.ant-col-4 {\n  display: block;\n  flex: 0 0 16.66666667%;\n  max-width: 16.66666667%;\n}\n.ant-col-push-4 {\n  left: 16.66666667%;\n}\n.ant-col-pull-4 {\n  right: 16.66666667%;\n}\n.ant-col-offset-4 {\n  margin-left: 16.66666667%;\n}\n.ant-col-order-4 {\n  order: 4;\n}\n.ant-col-3 {\n  display: block;\n  flex: 0 0 12.5%;\n  max-width: 12.5%;\n}\n.ant-col-push-3 {\n  left: 12.5%;\n}\n.ant-col-pull-3 {\n  right: 12.5%;\n}\n.ant-col-offset-3 {\n  margin-left: 12.5%;\n}\n.ant-col-order-3 {\n  order: 3;\n}\n.ant-col-2 {\n  display: block;\n  flex: 0 0 8.33333333%;\n  max-width: 8.33333333%;\n}\n.ant-col-push-2 {\n  left: 8.33333333%;\n}\n.ant-col-pull-2 {\n  right: 8.33333333%;\n}\n.ant-col-offset-2 {\n  margin-left: 8.33333333%;\n}\n.ant-col-order-2 {\n  order: 2;\n}\n.ant-col-1 {\n  display: block;\n  flex: 0 0 4.16666667%;\n  max-width: 4.16666667%;\n}\n.ant-col-push-1 {\n  left: 4.16666667%;\n}\n.ant-col-pull-1 {\n  right: 4.16666667%;\n}\n.ant-col-offset-1 {\n  margin-left: 4.16666667%;\n}\n.ant-col-order-1 {\n  order: 1;\n}\n.ant-col-0 {\n  display: none;\n}\n.ant-col-push-0 {\n  left: auto;\n}\n.ant-col-pull-0 {\n  right: auto;\n}\n.ant-col-push-0 {\n  left: auto;\n}\n.ant-col-pull-0 {\n  right: auto;\n}\n.ant-col-offset-0 {\n  margin-left: 0;\n}\n.ant-col-order-0 {\n  order: 0;\n}\n.ant-col-push-0.ant-col-rtl {\n  right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n  left: auto;\n}\n.ant-col-push-0.ant-col-rtl {\n  right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n  left: auto;\n}\n.ant-col-offset-0.ant-col-rtl {\n  margin-right: 0;\n}\n.ant-col-push-1.ant-col-rtl {\n  right: 4.16666667%;\n  left: auto;\n}\n.ant-col-pull-1.ant-col-rtl {\n  right: auto;\n  left: 4.16666667%;\n}\n.ant-col-offset-1.ant-col-rtl {\n  margin-right: 4.16666667%;\n  margin-left: 0;\n}\n.ant-col-push-2.ant-col-rtl {\n  right: 8.33333333%;\n  left: auto;\n}\n.ant-col-pull-2.ant-col-rtl {\n  right: auto;\n  left: 8.33333333%;\n}\n.ant-col-offset-2.ant-col-rtl {\n  margin-right: 8.33333333%;\n  margin-left: 0;\n}\n.ant-col-push-3.ant-col-rtl {\n  right: 12.5%;\n  left: auto;\n}\n.ant-col-pull-3.ant-col-rtl {\n  right: auto;\n  left: 12.5%;\n}\n.ant-col-offset-3.ant-col-rtl {\n  margin-right: 12.5%;\n  margin-left: 0;\n}\n.ant-col-push-4.ant-col-rtl {\n  right: 16.66666667%;\n  left: auto;\n}\n.ant-col-pull-4.ant-col-rtl {\n  right: auto;\n  left: 16.66666667%;\n}\n.ant-col-offset-4.ant-col-rtl {\n  margin-right: 16.66666667%;\n  margin-left: 0;\n}\n.ant-col-push-5.ant-col-rtl {\n  right: 20.83333333%;\n  left: auto;\n}\n.ant-col-pull-5.ant-col-rtl {\n  right: auto;\n  left: 20.83333333%;\n}\n.ant-col-offset-5.ant-col-rtl {\n  margin-right: 20.83333333%;\n  margin-left: 0;\n}\n.ant-col-push-6.ant-col-rtl {\n  right: 25%;\n  left: auto;\n}\n.ant-col-pull-6.ant-col-rtl {\n  right: auto;\n  left: 25%;\n}\n.ant-col-offset-6.ant-col-rtl {\n  margin-right: 25%;\n  margin-left: 0;\n}\n.ant-col-push-7.ant-col-rtl {\n  right: 29.16666667%;\n  left: auto;\n}\n.ant-col-pull-7.ant-col-rtl {\n  right: auto;\n  left: 29.16666667%;\n}\n.ant-col-offset-7.ant-col-rtl {\n  margin-right: 29.16666667%;\n  margin-left: 0;\n}\n.ant-col-push-8.ant-col-rtl {\n  right: 33.33333333%;\n  left: auto;\n}\n.ant-col-pull-8.ant-col-rtl {\n  right: auto;\n  left: 33.33333333%;\n}\n.ant-col-offset-8.ant-col-rtl {\n  margin-right: 33.33333333%;\n  margin-left: 0;\n}\n.ant-col-push-9.ant-col-rtl {\n  right: 37.5%;\n  left: auto;\n}\n.ant-col-pull-9.ant-col-rtl {\n  right: auto;\n  left: 37.5%;\n}\n.ant-col-offset-9.ant-col-rtl {\n  margin-right: 37.5%;\n  margin-left: 0;\n}\n.ant-col-push-10.ant-col-rtl {\n  right: 41.66666667%;\n  left: auto;\n}\n.ant-col-pull-10.ant-col-rtl {\n  right: auto;\n  left: 41.66666667%;\n}\n.ant-col-offset-10.ant-col-rtl {\n  margin-right: 41.66666667%;\n  margin-left: 0;\n}\n.ant-col-push-11.ant-col-rtl {\n  right: 45.83333333%;\n  left: auto;\n}\n.ant-col-pull-11.ant-col-rtl {\n  right: auto;\n  left: 45.83333333%;\n}\n.ant-col-offset-11.ant-col-rtl {\n  margin-right: 45.83333333%;\n  margin-left: 0;\n}\n.ant-col-push-12.ant-col-rtl {\n  right: 50%;\n  left: auto;\n}\n.ant-col-pull-12.ant-col-rtl {\n  right: auto;\n  left: 50%;\n}\n.ant-col-offset-12.ant-col-rtl {\n  margin-right: 50%;\n  margin-left: 0;\n}\n.ant-col-push-13.ant-col-rtl {\n  right: 54.16666667%;\n  left: auto;\n}\n.ant-col-pull-13.ant-col-rtl {\n  right: auto;\n  left: 54.16666667%;\n}\n.ant-col-offset-13.ant-col-rtl {\n  margin-right: 54.16666667%;\n  margin-left: 0;\n}\n.ant-col-push-14.ant-col-rtl {\n  right: 58.33333333%;\n  left: auto;\n}\n.ant-col-pull-14.ant-col-rtl {\n  right: auto;\n  left: 58.33333333%;\n}\n.ant-col-offset-14.ant-col-rtl {\n  margin-right: 58.33333333%;\n  margin-left: 0;\n}\n.ant-col-push-15.ant-col-rtl {\n  right: 62.5%;\n  left: auto;\n}\n.ant-col-pull-15.ant-col-rtl {\n  right: auto;\n  left: 62.5%;\n}\n.ant-col-offset-15.ant-col-rtl {\n  margin-right: 62.5%;\n  margin-left: 0;\n}\n.ant-col-push-16.ant-col-rtl {\n  right: 66.66666667%;\n  left: auto;\n}\n.ant-col-pull-16.ant-col-rtl {\n  right: auto;\n  left: 66.66666667%;\n}\n.ant-col-offset-16.ant-col-rtl {\n  margin-right: 66.66666667%;\n  margin-left: 0;\n}\n.ant-col-push-17.ant-col-rtl {\n  right: 70.83333333%;\n  left: auto;\n}\n.ant-col-pull-17.ant-col-rtl {\n  right: auto;\n  left: 70.83333333%;\n}\n.ant-col-offset-17.ant-col-rtl {\n  margin-right: 70.83333333%;\n  margin-left: 0;\n}\n.ant-col-push-18.ant-col-rtl {\n  right: 75%;\n  left: auto;\n}\n.ant-col-pull-18.ant-col-rtl {\n  right: auto;\n  left: 75%;\n}\n.ant-col-offset-18.ant-col-rtl {\n  margin-right: 75%;\n  margin-left: 0;\n}\n.ant-col-push-19.ant-col-rtl {\n  right: 79.16666667%;\n  left: auto;\n}\n.ant-col-pull-19.ant-col-rtl {\n  right: auto;\n  left: 79.16666667%;\n}\n.ant-col-offset-19.ant-col-rtl {\n  margin-right: 79.16666667%;\n  margin-left: 0;\n}\n.ant-col-push-20.ant-col-rtl {\n  right: 83.33333333%;\n  left: auto;\n}\n.ant-col-pull-20.ant-col-rtl {\n  right: auto;\n  left: 83.33333333%;\n}\n.ant-col-offset-20.ant-col-rtl {\n  margin-right: 83.33333333%;\n  margin-left: 0;\n}\n.ant-col-push-21.ant-col-rtl {\n  right: 87.5%;\n  left: auto;\n}\n.ant-col-pull-21.ant-col-rtl {\n  right: auto;\n  left: 87.5%;\n}\n.ant-col-offset-21.ant-col-rtl {\n  margin-right: 87.5%;\n  margin-left: 0;\n}\n.ant-col-push-22.ant-col-rtl {\n  right: 91.66666667%;\n  left: auto;\n}\n.ant-col-pull-22.ant-col-rtl {\n  right: auto;\n  left: 91.66666667%;\n}\n.ant-col-offset-22.ant-col-rtl {\n  margin-right: 91.66666667%;\n  margin-left: 0;\n}\n.ant-col-push-23.ant-col-rtl {\n  right: 95.83333333%;\n  left: auto;\n}\n.ant-col-pull-23.ant-col-rtl {\n  right: auto;\n  left: 95.83333333%;\n}\n.ant-col-offset-23.ant-col-rtl {\n  margin-right: 95.83333333%;\n  margin-left: 0;\n}\n.ant-col-push-24.ant-col-rtl {\n  right: 100%;\n  left: auto;\n}\n.ant-col-pull-24.ant-col-rtl {\n  right: auto;\n  left: 100%;\n}\n.ant-col-offset-24.ant-col-rtl {\n  margin-right: 100%;\n  margin-left: 0;\n}\n.ant-col-xs-24 {\n  display: block;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n.ant-col-xs-push-24 {\n  left: 100%;\n}\n.ant-col-xs-pull-24 {\n  right: 100%;\n}\n.ant-col-xs-offset-24 {\n  margin-left: 100%;\n}\n.ant-col-xs-order-24 {\n  order: 24;\n}\n.ant-col-xs-23 {\n  display: block;\n  flex: 0 0 95.83333333%;\n  max-width: 95.83333333%;\n}\n.ant-col-xs-push-23 {\n  left: 95.83333333%;\n}\n.ant-col-xs-pull-23 {\n  right: 95.83333333%;\n}\n.ant-col-xs-offset-23 {\n  margin-left: 95.83333333%;\n}\n.ant-col-xs-order-23 {\n  order: 23;\n}\n.ant-col-xs-22 {\n  display: block;\n  flex: 0 0 91.66666667%;\n  max-width: 91.66666667%;\n}\n.ant-col-xs-push-22 {\n  left: 91.66666667%;\n}\n.ant-col-xs-pull-22 {\n  right: 91.66666667%;\n}\n.ant-col-xs-offset-22 {\n  margin-left: 91.66666667%;\n}\n.ant-col-xs-order-22 {\n  order: 22;\n}\n.ant-col-xs-21 {\n  display: block;\n  flex: 0 0 87.5%;\n  max-width: 87.5%;\n}\n.ant-col-xs-push-21 {\n  left: 87.5%;\n}\n.ant-col-xs-pull-21 {\n  right: 87.5%;\n}\n.ant-col-xs-offset-21 {\n  margin-left: 87.5%;\n}\n.ant-col-xs-order-21 {\n  order: 21;\n}\n.ant-col-xs-20 {\n  display: block;\n  flex: 0 0 83.33333333%;\n  max-width: 83.33333333%;\n}\n.ant-col-xs-push-20 {\n  left: 83.33333333%;\n}\n.ant-col-xs-pull-20 {\n  right: 83.33333333%;\n}\n.ant-col-xs-offset-20 {\n  margin-left: 83.33333333%;\n}\n.ant-col-xs-order-20 {\n  order: 20;\n}\n.ant-col-xs-19 {\n  display: block;\n  flex: 0 0 79.16666667%;\n  max-width: 79.16666667%;\n}\n.ant-col-xs-push-19 {\n  left: 79.16666667%;\n}\n.ant-col-xs-pull-19 {\n  right: 79.16666667%;\n}\n.ant-col-xs-offset-19 {\n  margin-left: 79.16666667%;\n}\n.ant-col-xs-order-19 {\n  order: 19;\n}\n.ant-col-xs-18 {\n  display: block;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n.ant-col-xs-push-18 {\n  left: 75%;\n}\n.ant-col-xs-pull-18 {\n  right: 75%;\n}\n.ant-col-xs-offset-18 {\n  margin-left: 75%;\n}\n.ant-col-xs-order-18 {\n  order: 18;\n}\n.ant-col-xs-17 {\n  display: block;\n  flex: 0 0 70.83333333%;\n  max-width: 70.83333333%;\n}\n.ant-col-xs-push-17 {\n  left: 70.83333333%;\n}\n.ant-col-xs-pull-17 {\n  right: 70.83333333%;\n}\n.ant-col-xs-offset-17 {\n  margin-left: 70.83333333%;\n}\n.ant-col-xs-order-17 {\n  order: 17;\n}\n.ant-col-xs-16 {\n  display: block;\n  flex: 0 0 66.66666667%;\n  max-width: 66.66666667%;\n}\n.ant-col-xs-push-16 {\n  left: 66.66666667%;\n}\n.ant-col-xs-pull-16 {\n  right: 66.66666667%;\n}\n.ant-col-xs-offset-16 {\n  margin-left: 66.66666667%;\n}\n.ant-col-xs-order-16 {\n  order: 16;\n}\n.ant-col-xs-15 {\n  display: block;\n  flex: 0 0 62.5%;\n  max-width: 62.5%;\n}\n.ant-col-xs-push-15 {\n  left: 62.5%;\n}\n.ant-col-xs-pull-15 {\n  right: 62.5%;\n}\n.ant-col-xs-offset-15 {\n  margin-left: 62.5%;\n}\n.ant-col-xs-order-15 {\n  order: 15;\n}\n.ant-col-xs-14 {\n  display: block;\n  flex: 0 0 58.33333333%;\n  max-width: 58.33333333%;\n}\n.ant-col-xs-push-14 {\n  left: 58.33333333%;\n}\n.ant-col-xs-pull-14 {\n  right: 58.33333333%;\n}\n.ant-col-xs-offset-14 {\n  margin-left: 58.33333333%;\n}\n.ant-col-xs-order-14 {\n  order: 14;\n}\n.ant-col-xs-13 {\n  display: block;\n  flex: 0 0 54.16666667%;\n  max-width: 54.16666667%;\n}\n.ant-col-xs-push-13 {\n  left: 54.16666667%;\n}\n.ant-col-xs-pull-13 {\n  right: 54.16666667%;\n}\n.ant-col-xs-offset-13 {\n  margin-left: 54.16666667%;\n}\n.ant-col-xs-order-13 {\n  order: 13;\n}\n.ant-col-xs-12 {\n  display: block;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n.ant-col-xs-push-12 {\n  left: 50%;\n}\n.ant-col-xs-pull-12 {\n  right: 50%;\n}\n.ant-col-xs-offset-12 {\n  margin-left: 50%;\n}\n.ant-col-xs-order-12 {\n  order: 12;\n}\n.ant-col-xs-11 {\n  display: block;\n  flex: 0 0 45.83333333%;\n  max-width: 45.83333333%;\n}\n.ant-col-xs-push-11 {\n  left: 45.83333333%;\n}\n.ant-col-xs-pull-11 {\n  right: 45.83333333%;\n}\n.ant-col-xs-offset-11 {\n  margin-left: 45.83333333%;\n}\n.ant-col-xs-order-11 {\n  order: 11;\n}\n.ant-col-xs-10 {\n  display: block;\n  flex: 0 0 41.66666667%;\n  max-width: 41.66666667%;\n}\n.ant-col-xs-push-10 {\n  left: 41.66666667%;\n}\n.ant-col-xs-pull-10 {\n  right: 41.66666667%;\n}\n.ant-col-xs-offset-10 {\n  margin-left: 41.66666667%;\n}\n.ant-col-xs-order-10 {\n  order: 10;\n}\n.ant-col-xs-9 {\n  display: block;\n  flex: 0 0 37.5%;\n  max-width: 37.5%;\n}\n.ant-col-xs-push-9 {\n  left: 37.5%;\n}\n.ant-col-xs-pull-9 {\n  right: 37.5%;\n}\n.ant-col-xs-offset-9 {\n  margin-left: 37.5%;\n}\n.ant-col-xs-order-9 {\n  order: 9;\n}\n.ant-col-xs-8 {\n  display: block;\n  flex: 0 0 33.33333333%;\n  max-width: 33.33333333%;\n}\n.ant-col-xs-push-8 {\n  left: 33.33333333%;\n}\n.ant-col-xs-pull-8 {\n  right: 33.33333333%;\n}\n.ant-col-xs-offset-8 {\n  margin-left: 33.33333333%;\n}\n.ant-col-xs-order-8 {\n  order: 8;\n}\n.ant-col-xs-7 {\n  display: block;\n  flex: 0 0 29.16666667%;\n  max-width: 29.16666667%;\n}\n.ant-col-xs-push-7 {\n  left: 29.16666667%;\n}\n.ant-col-xs-pull-7 {\n  right: 29.16666667%;\n}\n.ant-col-xs-offset-7 {\n  margin-left: 29.16666667%;\n}\n.ant-col-xs-order-7 {\n  order: 7;\n}\n.ant-col-xs-6 {\n  display: block;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n.ant-col-xs-push-6 {\n  left: 25%;\n}\n.ant-col-xs-pull-6 {\n  right: 25%;\n}\n.ant-col-xs-offset-6 {\n  margin-left: 25%;\n}\n.ant-col-xs-order-6 {\n  order: 6;\n}\n.ant-col-xs-5 {\n  display: block;\n  flex: 0 0 20.83333333%;\n  max-width: 20.83333333%;\n}\n.ant-col-xs-push-5 {\n  left: 20.83333333%;\n}\n.ant-col-xs-pull-5 {\n  right: 20.83333333%;\n}\n.ant-col-xs-offset-5 {\n  margin-left: 20.83333333%;\n}\n.ant-col-xs-order-5 {\n  order: 5;\n}\n.ant-col-xs-4 {\n  display: block;\n  flex: 0 0 16.66666667%;\n  max-width: 16.66666667%;\n}\n.ant-col-xs-push-4 {\n  left: 16.66666667%;\n}\n.ant-col-xs-pull-4 {\n  right: 16.66666667%;\n}\n.ant-col-xs-offset-4 {\n  margin-left: 16.66666667%;\n}\n.ant-col-xs-order-4 {\n  order: 4;\n}\n.ant-col-xs-3 {\n  display: block;\n  flex: 0 0 12.5%;\n  max-width: 12.5%;\n}\n.ant-col-xs-push-3 {\n  left: 12.5%;\n}\n.ant-col-xs-pull-3 {\n  right: 12.5%;\n}\n.ant-col-xs-offset-3 {\n  margin-left: 12.5%;\n}\n.ant-col-xs-order-3 {\n  order: 3;\n}\n.ant-col-xs-2 {\n  display: block;\n  flex: 0 0 8.33333333%;\n  max-width: 8.33333333%;\n}\n.ant-col-xs-push-2 {\n  left: 8.33333333%;\n}\n.ant-col-xs-pull-2 {\n  right: 8.33333333%;\n}\n.ant-col-xs-offset-2 {\n  margin-left: 8.33333333%;\n}\n.ant-col-xs-order-2 {\n  order: 2;\n}\n.ant-col-xs-1 {\n  display: block;\n  flex: 0 0 4.16666667%;\n  max-width: 4.16666667%;\n}\n.ant-col-xs-push-1 {\n  left: 4.16666667%;\n}\n.ant-col-xs-pull-1 {\n  right: 4.16666667%;\n}\n.ant-col-xs-offset-1 {\n  margin-left: 4.16666667%;\n}\n.ant-col-xs-order-1 {\n  order: 1;\n}\n.ant-col-xs-0 {\n  display: none;\n}\n.ant-col-push-0 {\n  left: auto;\n}\n.ant-col-pull-0 {\n  right: auto;\n}\n.ant-col-xs-push-0 {\n  left: auto;\n}\n.ant-col-xs-pull-0 {\n  right: auto;\n}\n.ant-col-xs-offset-0 {\n  margin-left: 0;\n}\n.ant-col-xs-order-0 {\n  order: 0;\n}\n.ant-col-push-0.ant-col-rtl {\n  right: auto;\n}\n.ant-col-pull-0.ant-col-rtl {\n  left: auto;\n}\n.ant-col-xs-push-0.ant-col-rtl {\n  right: auto;\n}\n.ant-col-xs-pull-0.ant-col-rtl {\n  left: auto;\n}\n.ant-col-xs-offset-0.ant-col-rtl {\n  margin-right: 0;\n}\n.ant-col-xs-push-1.ant-col-rtl {\n  right: 4.16666667%;\n  left: auto;\n}\n.ant-col-xs-pull-1.ant-col-rtl {\n  right: auto;\n  left: 4.16666667%;\n}\n.ant-col-xs-offset-1.ant-col-rtl {\n  margin-right: 4.16666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-2.ant-col-rtl {\n  right: 8.33333333%;\n  left: auto;\n}\n.ant-col-xs-pull-2.ant-col-rtl {\n  right: auto;\n  left: 8.33333333%;\n}\n.ant-col-xs-offset-2.ant-col-rtl {\n  margin-right: 8.33333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-3.ant-col-rtl {\n  right: 12.5%;\n  left: auto;\n}\n.ant-col-xs-pull-3.ant-col-rtl {\n  right: auto;\n  left: 12.5%;\n}\n.ant-col-xs-offset-3.ant-col-rtl {\n  margin-right: 12.5%;\n  margin-left: 0;\n}\n.ant-col-xs-push-4.ant-col-rtl {\n  right: 16.66666667%;\n  left: auto;\n}\n.ant-col-xs-pull-4.ant-col-rtl {\n  right: auto;\n  left: 16.66666667%;\n}\n.ant-col-xs-offset-4.ant-col-rtl {\n  margin-right: 16.66666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-5.ant-col-rtl {\n  right: 20.83333333%;\n  left: auto;\n}\n.ant-col-xs-pull-5.ant-col-rtl {\n  right: auto;\n  left: 20.83333333%;\n}\n.ant-col-xs-offset-5.ant-col-rtl {\n  margin-right: 20.83333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-6.ant-col-rtl {\n  right: 25%;\n  left: auto;\n}\n.ant-col-xs-pull-6.ant-col-rtl {\n  right: auto;\n  left: 25%;\n}\n.ant-col-xs-offset-6.ant-col-rtl {\n  margin-right: 25%;\n  margin-left: 0;\n}\n.ant-col-xs-push-7.ant-col-rtl {\n  right: 29.16666667%;\n  left: auto;\n}\n.ant-col-xs-pull-7.ant-col-rtl {\n  right: auto;\n  left: 29.16666667%;\n}\n.ant-col-xs-offset-7.ant-col-rtl {\n  margin-right: 29.16666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-8.ant-col-rtl {\n  right: 33.33333333%;\n  left: auto;\n}\n.ant-col-xs-pull-8.ant-col-rtl {\n  right: auto;\n  left: 33.33333333%;\n}\n.ant-col-xs-offset-8.ant-col-rtl {\n  margin-right: 33.33333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-9.ant-col-rtl {\n  right: 37.5%;\n  left: auto;\n}\n.ant-col-xs-pull-9.ant-col-rtl {\n  right: auto;\n  left: 37.5%;\n}\n.ant-col-xs-offset-9.ant-col-rtl {\n  margin-right: 37.5%;\n  margin-left: 0;\n}\n.ant-col-xs-push-10.ant-col-rtl {\n  right: 41.66666667%;\n  left: auto;\n}\n.ant-col-xs-pull-10.ant-col-rtl {\n  right: auto;\n  left: 41.66666667%;\n}\n.ant-col-xs-offset-10.ant-col-rtl {\n  margin-right: 41.66666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-11.ant-col-rtl {\n  right: 45.83333333%;\n  left: auto;\n}\n.ant-col-xs-pull-11.ant-col-rtl {\n  right: auto;\n  left: 45.83333333%;\n}\n.ant-col-xs-offset-11.ant-col-rtl {\n  margin-right: 45.83333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-12.ant-col-rtl {\n  right: 50%;\n  left: auto;\n}\n.ant-col-xs-pull-12.ant-col-rtl {\n  right: auto;\n  left: 50%;\n}\n.ant-col-xs-offset-12.ant-col-rtl {\n  margin-right: 50%;\n  margin-left: 0;\n}\n.ant-col-xs-push-13.ant-col-rtl {\n  right: 54.16666667%;\n  left: auto;\n}\n.ant-col-xs-pull-13.ant-col-rtl {\n  right: auto;\n  left: 54.16666667%;\n}\n.ant-col-xs-offset-13.ant-col-rtl {\n  margin-right: 54.16666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-14.ant-col-rtl {\n  right: 58.33333333%;\n  left: auto;\n}\n.ant-col-xs-pull-14.ant-col-rtl {\n  right: auto;\n  left: 58.33333333%;\n}\n.ant-col-xs-offset-14.ant-col-rtl {\n  margin-right: 58.33333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-15.ant-col-rtl {\n  right: 62.5%;\n  left: auto;\n}\n.ant-col-xs-pull-15.ant-col-rtl {\n  right: auto;\n  left: 62.5%;\n}\n.ant-col-xs-offset-15.ant-col-rtl {\n  margin-right: 62.5%;\n  margin-left: 0;\n}\n.ant-col-xs-push-16.ant-col-rtl {\n  right: 66.66666667%;\n  left: auto;\n}\n.ant-col-xs-pull-16.ant-col-rtl {\n  right: auto;\n  left: 66.66666667%;\n}\n.ant-col-xs-offset-16.ant-col-rtl {\n  margin-right: 66.66666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-17.ant-col-rtl {\n  right: 70.83333333%;\n  left: auto;\n}\n.ant-col-xs-pull-17.ant-col-rtl {\n  right: auto;\n  left: 70.83333333%;\n}\n.ant-col-xs-offset-17.ant-col-rtl {\n  margin-right: 70.83333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-18.ant-col-rtl {\n  right: 75%;\n  left: auto;\n}\n.ant-col-xs-pull-18.ant-col-rtl {\n  right: auto;\n  left: 75%;\n}\n.ant-col-xs-offset-18.ant-col-rtl {\n  margin-right: 75%;\n  margin-left: 0;\n}\n.ant-col-xs-push-19.ant-col-rtl {\n  right: 79.16666667%;\n  left: auto;\n}\n.ant-col-xs-pull-19.ant-col-rtl {\n  right: auto;\n  left: 79.16666667%;\n}\n.ant-col-xs-offset-19.ant-col-rtl {\n  margin-right: 79.16666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-20.ant-col-rtl {\n  right: 83.33333333%;\n  left: auto;\n}\n.ant-col-xs-pull-20.ant-col-rtl {\n  right: auto;\n  left: 83.33333333%;\n}\n.ant-col-xs-offset-20.ant-col-rtl {\n  margin-right: 83.33333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-21.ant-col-rtl {\n  right: 87.5%;\n  left: auto;\n}\n.ant-col-xs-pull-21.ant-col-rtl {\n  right: auto;\n  left: 87.5%;\n}\n.ant-col-xs-offset-21.ant-col-rtl {\n  margin-right: 87.5%;\n  margin-left: 0;\n}\n.ant-col-xs-push-22.ant-col-rtl {\n  right: 91.66666667%;\n  left: auto;\n}\n.ant-col-xs-pull-22.ant-col-rtl {\n  right: auto;\n  left: 91.66666667%;\n}\n.ant-col-xs-offset-22.ant-col-rtl {\n  margin-right: 91.66666667%;\n  margin-left: 0;\n}\n.ant-col-xs-push-23.ant-col-rtl {\n  right: 95.83333333%;\n  left: auto;\n}\n.ant-col-xs-pull-23.ant-col-rtl {\n  right: auto;\n  left: 95.83333333%;\n}\n.ant-col-xs-offset-23.ant-col-rtl {\n  margin-right: 95.83333333%;\n  margin-left: 0;\n}\n.ant-col-xs-push-24.ant-col-rtl {\n  right: 100%;\n  left: auto;\n}\n.ant-col-xs-pull-24.ant-col-rtl {\n  right: auto;\n  left: 100%;\n}\n.ant-col-xs-offset-24.ant-col-rtl {\n  margin-right: 100%;\n  margin-left: 0;\n}\n@media (min-width: 576px) {\n  .ant-col-sm-24 {\n    display: block;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-sm-push-24 {\n    left: 100%;\n  }\n  .ant-col-sm-pull-24 {\n    right: 100%;\n  }\n  .ant-col-sm-offset-24 {\n    margin-left: 100%;\n  }\n  .ant-col-sm-order-24 {\n    order: 24;\n  }\n  .ant-col-sm-23 {\n    display: block;\n    flex: 0 0 95.83333333%;\n    max-width: 95.83333333%;\n  }\n  .ant-col-sm-push-23 {\n    left: 95.83333333%;\n  }\n  .ant-col-sm-pull-23 {\n    right: 95.83333333%;\n  }\n  .ant-col-sm-offset-23 {\n    margin-left: 95.83333333%;\n  }\n  .ant-col-sm-order-23 {\n    order: 23;\n  }\n  .ant-col-sm-22 {\n    display: block;\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .ant-col-sm-push-22 {\n    left: 91.66666667%;\n  }\n  .ant-col-sm-pull-22 {\n    right: 91.66666667%;\n  }\n  .ant-col-sm-offset-22 {\n    margin-left: 91.66666667%;\n  }\n  .ant-col-sm-order-22 {\n    order: 22;\n  }\n  .ant-col-sm-21 {\n    display: block;\n    flex: 0 0 87.5%;\n    max-width: 87.5%;\n  }\n  .ant-col-sm-push-21 {\n    left: 87.5%;\n  }\n  .ant-col-sm-pull-21 {\n    right: 87.5%;\n  }\n  .ant-col-sm-offset-21 {\n    margin-left: 87.5%;\n  }\n  .ant-col-sm-order-21 {\n    order: 21;\n  }\n  .ant-col-sm-20 {\n    display: block;\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .ant-col-sm-push-20 {\n    left: 83.33333333%;\n  }\n  .ant-col-sm-pull-20 {\n    right: 83.33333333%;\n  }\n  .ant-col-sm-offset-20 {\n    margin-left: 83.33333333%;\n  }\n  .ant-col-sm-order-20 {\n    order: 20;\n  }\n  .ant-col-sm-19 {\n    display: block;\n    flex: 0 0 79.16666667%;\n    max-width: 79.16666667%;\n  }\n  .ant-col-sm-push-19 {\n    left: 79.16666667%;\n  }\n  .ant-col-sm-pull-19 {\n    right: 79.16666667%;\n  }\n  .ant-col-sm-offset-19 {\n    margin-left: 79.16666667%;\n  }\n  .ant-col-sm-order-19 {\n    order: 19;\n  }\n  .ant-col-sm-18 {\n    display: block;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .ant-col-sm-push-18 {\n    left: 75%;\n  }\n  .ant-col-sm-pull-18 {\n    right: 75%;\n  }\n  .ant-col-sm-offset-18 {\n    margin-left: 75%;\n  }\n  .ant-col-sm-order-18 {\n    order: 18;\n  }\n  .ant-col-sm-17 {\n    display: block;\n    flex: 0 0 70.83333333%;\n    max-width: 70.83333333%;\n  }\n  .ant-col-sm-push-17 {\n    left: 70.83333333%;\n  }\n  .ant-col-sm-pull-17 {\n    right: 70.83333333%;\n  }\n  .ant-col-sm-offset-17 {\n    margin-left: 70.83333333%;\n  }\n  .ant-col-sm-order-17 {\n    order: 17;\n  }\n  .ant-col-sm-16 {\n    display: block;\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .ant-col-sm-push-16 {\n    left: 66.66666667%;\n  }\n  .ant-col-sm-pull-16 {\n    right: 66.66666667%;\n  }\n  .ant-col-sm-offset-16 {\n    margin-left: 66.66666667%;\n  }\n  .ant-col-sm-order-16 {\n    order: 16;\n  }\n  .ant-col-sm-15 {\n    display: block;\n    flex: 0 0 62.5%;\n    max-width: 62.5%;\n  }\n  .ant-col-sm-push-15 {\n    left: 62.5%;\n  }\n  .ant-col-sm-pull-15 {\n    right: 62.5%;\n  }\n  .ant-col-sm-offset-15 {\n    margin-left: 62.5%;\n  }\n  .ant-col-sm-order-15 {\n    order: 15;\n  }\n  .ant-col-sm-14 {\n    display: block;\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .ant-col-sm-push-14 {\n    left: 58.33333333%;\n  }\n  .ant-col-sm-pull-14 {\n    right: 58.33333333%;\n  }\n  .ant-col-sm-offset-14 {\n    margin-left: 58.33333333%;\n  }\n  .ant-col-sm-order-14 {\n    order: 14;\n  }\n  .ant-col-sm-13 {\n    display: block;\n    flex: 0 0 54.16666667%;\n    max-width: 54.16666667%;\n  }\n  .ant-col-sm-push-13 {\n    left: 54.16666667%;\n  }\n  .ant-col-sm-pull-13 {\n    right: 54.16666667%;\n  }\n  .ant-col-sm-offset-13 {\n    margin-left: 54.16666667%;\n  }\n  .ant-col-sm-order-13 {\n    order: 13;\n  }\n  .ant-col-sm-12 {\n    display: block;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .ant-col-sm-push-12 {\n    left: 50%;\n  }\n  .ant-col-sm-pull-12 {\n    right: 50%;\n  }\n  .ant-col-sm-offset-12 {\n    margin-left: 50%;\n  }\n  .ant-col-sm-order-12 {\n    order: 12;\n  }\n  .ant-col-sm-11 {\n    display: block;\n    flex: 0 0 45.83333333%;\n    max-width: 45.83333333%;\n  }\n  .ant-col-sm-push-11 {\n    left: 45.83333333%;\n  }\n  .ant-col-sm-pull-11 {\n    right: 45.83333333%;\n  }\n  .ant-col-sm-offset-11 {\n    margin-left: 45.83333333%;\n  }\n  .ant-col-sm-order-11 {\n    order: 11;\n  }\n  .ant-col-sm-10 {\n    display: block;\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .ant-col-sm-push-10 {\n    left: 41.66666667%;\n  }\n  .ant-col-sm-pull-10 {\n    right: 41.66666667%;\n  }\n  .ant-col-sm-offset-10 {\n    margin-left: 41.66666667%;\n  }\n  .ant-col-sm-order-10 {\n    order: 10;\n  }\n  .ant-col-sm-9 {\n    display: block;\n    flex: 0 0 37.5%;\n    max-width: 37.5%;\n  }\n  .ant-col-sm-push-9 {\n    left: 37.5%;\n  }\n  .ant-col-sm-pull-9 {\n    right: 37.5%;\n  }\n  .ant-col-sm-offset-9 {\n    margin-left: 37.5%;\n  }\n  .ant-col-sm-order-9 {\n    order: 9;\n  }\n  .ant-col-sm-8 {\n    display: block;\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .ant-col-sm-push-8 {\n    left: 33.33333333%;\n  }\n  .ant-col-sm-pull-8 {\n    right: 33.33333333%;\n  }\n  .ant-col-sm-offset-8 {\n    margin-left: 33.33333333%;\n  }\n  .ant-col-sm-order-8 {\n    order: 8;\n  }\n  .ant-col-sm-7 {\n    display: block;\n    flex: 0 0 29.16666667%;\n    max-width: 29.16666667%;\n  }\n  .ant-col-sm-push-7 {\n    left: 29.16666667%;\n  }\n  .ant-col-sm-pull-7 {\n    right: 29.16666667%;\n  }\n  .ant-col-sm-offset-7 {\n    margin-left: 29.16666667%;\n  }\n  .ant-col-sm-order-7 {\n    order: 7;\n  }\n  .ant-col-sm-6 {\n    display: block;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .ant-col-sm-push-6 {\n    left: 25%;\n  }\n  .ant-col-sm-pull-6 {\n    right: 25%;\n  }\n  .ant-col-sm-offset-6 {\n    margin-left: 25%;\n  }\n  .ant-col-sm-order-6 {\n    order: 6;\n  }\n  .ant-col-sm-5 {\n    display: block;\n    flex: 0 0 20.83333333%;\n    max-width: 20.83333333%;\n  }\n  .ant-col-sm-push-5 {\n    left: 20.83333333%;\n  }\n  .ant-col-sm-pull-5 {\n    right: 20.83333333%;\n  }\n  .ant-col-sm-offset-5 {\n    margin-left: 20.83333333%;\n  }\n  .ant-col-sm-order-5 {\n    order: 5;\n  }\n  .ant-col-sm-4 {\n    display: block;\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .ant-col-sm-push-4 {\n    left: 16.66666667%;\n  }\n  .ant-col-sm-pull-4 {\n    right: 16.66666667%;\n  }\n  .ant-col-sm-offset-4 {\n    margin-left: 16.66666667%;\n  }\n  .ant-col-sm-order-4 {\n    order: 4;\n  }\n  .ant-col-sm-3 {\n    display: block;\n    flex: 0 0 12.5%;\n    max-width: 12.5%;\n  }\n  .ant-col-sm-push-3 {\n    left: 12.5%;\n  }\n  .ant-col-sm-pull-3 {\n    right: 12.5%;\n  }\n  .ant-col-sm-offset-3 {\n    margin-left: 12.5%;\n  }\n  .ant-col-sm-order-3 {\n    order: 3;\n  }\n  .ant-col-sm-2 {\n    display: block;\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .ant-col-sm-push-2 {\n    left: 8.33333333%;\n  }\n  .ant-col-sm-pull-2 {\n    right: 8.33333333%;\n  }\n  .ant-col-sm-offset-2 {\n    margin-left: 8.33333333%;\n  }\n  .ant-col-sm-order-2 {\n    order: 2;\n  }\n  .ant-col-sm-1 {\n    display: block;\n    flex: 0 0 4.16666667%;\n    max-width: 4.16666667%;\n  }\n  .ant-col-sm-push-1 {\n    left: 4.16666667%;\n  }\n  .ant-col-sm-pull-1 {\n    right: 4.16666667%;\n  }\n  .ant-col-sm-offset-1 {\n    margin-left: 4.16666667%;\n  }\n  .ant-col-sm-order-1 {\n    order: 1;\n  }\n  .ant-col-sm-0 {\n    display: none;\n  }\n  .ant-col-push-0 {\n    left: auto;\n  }\n  .ant-col-pull-0 {\n    right: auto;\n  }\n  .ant-col-sm-push-0 {\n    left: auto;\n  }\n  .ant-col-sm-pull-0 {\n    right: auto;\n  }\n  .ant-col-sm-offset-0 {\n    margin-left: 0;\n  }\n  .ant-col-sm-order-0 {\n    order: 0;\n  }\n  .ant-col-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-sm-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-sm-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-sm-offset-0.ant-col-rtl {\n    margin-right: 0;\n  }\n  .ant-col-sm-push-1.ant-col-rtl {\n    right: 4.16666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-1.ant-col-rtl {\n    right: auto;\n    left: 4.16666667%;\n  }\n  .ant-col-sm-offset-1.ant-col-rtl {\n    margin-right: 4.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-2.ant-col-rtl {\n    right: 8.33333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-2.ant-col-rtl {\n    right: auto;\n    left: 8.33333333%;\n  }\n  .ant-col-sm-offset-2.ant-col-rtl {\n    margin-right: 8.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-3.ant-col-rtl {\n    right: 12.5%;\n    left: auto;\n  }\n  .ant-col-sm-pull-3.ant-col-rtl {\n    right: auto;\n    left: 12.5%;\n  }\n  .ant-col-sm-offset-3.ant-col-rtl {\n    margin-right: 12.5%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-4.ant-col-rtl {\n    right: 16.66666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-4.ant-col-rtl {\n    right: auto;\n    left: 16.66666667%;\n  }\n  .ant-col-sm-offset-4.ant-col-rtl {\n    margin-right: 16.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-5.ant-col-rtl {\n    right: 20.83333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-5.ant-col-rtl {\n    right: auto;\n    left: 20.83333333%;\n  }\n  .ant-col-sm-offset-5.ant-col-rtl {\n    margin-right: 20.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-6.ant-col-rtl {\n    right: 25%;\n    left: auto;\n  }\n  .ant-col-sm-pull-6.ant-col-rtl {\n    right: auto;\n    left: 25%;\n  }\n  .ant-col-sm-offset-6.ant-col-rtl {\n    margin-right: 25%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-7.ant-col-rtl {\n    right: 29.16666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-7.ant-col-rtl {\n    right: auto;\n    left: 29.16666667%;\n  }\n  .ant-col-sm-offset-7.ant-col-rtl {\n    margin-right: 29.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-8.ant-col-rtl {\n    right: 33.33333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-8.ant-col-rtl {\n    right: auto;\n    left: 33.33333333%;\n  }\n  .ant-col-sm-offset-8.ant-col-rtl {\n    margin-right: 33.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-9.ant-col-rtl {\n    right: 37.5%;\n    left: auto;\n  }\n  .ant-col-sm-pull-9.ant-col-rtl {\n    right: auto;\n    left: 37.5%;\n  }\n  .ant-col-sm-offset-9.ant-col-rtl {\n    margin-right: 37.5%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-10.ant-col-rtl {\n    right: 41.66666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-10.ant-col-rtl {\n    right: auto;\n    left: 41.66666667%;\n  }\n  .ant-col-sm-offset-10.ant-col-rtl {\n    margin-right: 41.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-11.ant-col-rtl {\n    right: 45.83333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-11.ant-col-rtl {\n    right: auto;\n    left: 45.83333333%;\n  }\n  .ant-col-sm-offset-11.ant-col-rtl {\n    margin-right: 45.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-12.ant-col-rtl {\n    right: 50%;\n    left: auto;\n  }\n  .ant-col-sm-pull-12.ant-col-rtl {\n    right: auto;\n    left: 50%;\n  }\n  .ant-col-sm-offset-12.ant-col-rtl {\n    margin-right: 50%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-13.ant-col-rtl {\n    right: 54.16666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-13.ant-col-rtl {\n    right: auto;\n    left: 54.16666667%;\n  }\n  .ant-col-sm-offset-13.ant-col-rtl {\n    margin-right: 54.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-14.ant-col-rtl {\n    right: 58.33333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-14.ant-col-rtl {\n    right: auto;\n    left: 58.33333333%;\n  }\n  .ant-col-sm-offset-14.ant-col-rtl {\n    margin-right: 58.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-15.ant-col-rtl {\n    right: 62.5%;\n    left: auto;\n  }\n  .ant-col-sm-pull-15.ant-col-rtl {\n    right: auto;\n    left: 62.5%;\n  }\n  .ant-col-sm-offset-15.ant-col-rtl {\n    margin-right: 62.5%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-16.ant-col-rtl {\n    right: 66.66666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-16.ant-col-rtl {\n    right: auto;\n    left: 66.66666667%;\n  }\n  .ant-col-sm-offset-16.ant-col-rtl {\n    margin-right: 66.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-17.ant-col-rtl {\n    right: 70.83333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-17.ant-col-rtl {\n    right: auto;\n    left: 70.83333333%;\n  }\n  .ant-col-sm-offset-17.ant-col-rtl {\n    margin-right: 70.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-18.ant-col-rtl {\n    right: 75%;\n    left: auto;\n  }\n  .ant-col-sm-pull-18.ant-col-rtl {\n    right: auto;\n    left: 75%;\n  }\n  .ant-col-sm-offset-18.ant-col-rtl {\n    margin-right: 75%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-19.ant-col-rtl {\n    right: 79.16666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-19.ant-col-rtl {\n    right: auto;\n    left: 79.16666667%;\n  }\n  .ant-col-sm-offset-19.ant-col-rtl {\n    margin-right: 79.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-20.ant-col-rtl {\n    right: 83.33333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-20.ant-col-rtl {\n    right: auto;\n    left: 83.33333333%;\n  }\n  .ant-col-sm-offset-20.ant-col-rtl {\n    margin-right: 83.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-21.ant-col-rtl {\n    right: 87.5%;\n    left: auto;\n  }\n  .ant-col-sm-pull-21.ant-col-rtl {\n    right: auto;\n    left: 87.5%;\n  }\n  .ant-col-sm-offset-21.ant-col-rtl {\n    margin-right: 87.5%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-22.ant-col-rtl {\n    right: 91.66666667%;\n    left: auto;\n  }\n  .ant-col-sm-pull-22.ant-col-rtl {\n    right: auto;\n    left: 91.66666667%;\n  }\n  .ant-col-sm-offset-22.ant-col-rtl {\n    margin-right: 91.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-23.ant-col-rtl {\n    right: 95.83333333%;\n    left: auto;\n  }\n  .ant-col-sm-pull-23.ant-col-rtl {\n    right: auto;\n    left: 95.83333333%;\n  }\n  .ant-col-sm-offset-23.ant-col-rtl {\n    margin-right: 95.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-sm-push-24.ant-col-rtl {\n    right: 100%;\n    left: auto;\n  }\n  .ant-col-sm-pull-24.ant-col-rtl {\n    right: auto;\n    left: 100%;\n  }\n  .ant-col-sm-offset-24.ant-col-rtl {\n    margin-right: 100%;\n    margin-left: 0;\n  }\n}\n@media (min-width: 768px) {\n  .ant-col-md-24 {\n    display: block;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-md-push-24 {\n    left: 100%;\n  }\n  .ant-col-md-pull-24 {\n    right: 100%;\n  }\n  .ant-col-md-offset-24 {\n    margin-left: 100%;\n  }\n  .ant-col-md-order-24 {\n    order: 24;\n  }\n  .ant-col-md-23 {\n    display: block;\n    flex: 0 0 95.83333333%;\n    max-width: 95.83333333%;\n  }\n  .ant-col-md-push-23 {\n    left: 95.83333333%;\n  }\n  .ant-col-md-pull-23 {\n    right: 95.83333333%;\n  }\n  .ant-col-md-offset-23 {\n    margin-left: 95.83333333%;\n  }\n  .ant-col-md-order-23 {\n    order: 23;\n  }\n  .ant-col-md-22 {\n    display: block;\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .ant-col-md-push-22 {\n    left: 91.66666667%;\n  }\n  .ant-col-md-pull-22 {\n    right: 91.66666667%;\n  }\n  .ant-col-md-offset-22 {\n    margin-left: 91.66666667%;\n  }\n  .ant-col-md-order-22 {\n    order: 22;\n  }\n  .ant-col-md-21 {\n    display: block;\n    flex: 0 0 87.5%;\n    max-width: 87.5%;\n  }\n  .ant-col-md-push-21 {\n    left: 87.5%;\n  }\n  .ant-col-md-pull-21 {\n    right: 87.5%;\n  }\n  .ant-col-md-offset-21 {\n    margin-left: 87.5%;\n  }\n  .ant-col-md-order-21 {\n    order: 21;\n  }\n  .ant-col-md-20 {\n    display: block;\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .ant-col-md-push-20 {\n    left: 83.33333333%;\n  }\n  .ant-col-md-pull-20 {\n    right: 83.33333333%;\n  }\n  .ant-col-md-offset-20 {\n    margin-left: 83.33333333%;\n  }\n  .ant-col-md-order-20 {\n    order: 20;\n  }\n  .ant-col-md-19 {\n    display: block;\n    flex: 0 0 79.16666667%;\n    max-width: 79.16666667%;\n  }\n  .ant-col-md-push-19 {\n    left: 79.16666667%;\n  }\n  .ant-col-md-pull-19 {\n    right: 79.16666667%;\n  }\n  .ant-col-md-offset-19 {\n    margin-left: 79.16666667%;\n  }\n  .ant-col-md-order-19 {\n    order: 19;\n  }\n  .ant-col-md-18 {\n    display: block;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .ant-col-md-push-18 {\n    left: 75%;\n  }\n  .ant-col-md-pull-18 {\n    right: 75%;\n  }\n  .ant-col-md-offset-18 {\n    margin-left: 75%;\n  }\n  .ant-col-md-order-18 {\n    order: 18;\n  }\n  .ant-col-md-17 {\n    display: block;\n    flex: 0 0 70.83333333%;\n    max-width: 70.83333333%;\n  }\n  .ant-col-md-push-17 {\n    left: 70.83333333%;\n  }\n  .ant-col-md-pull-17 {\n    right: 70.83333333%;\n  }\n  .ant-col-md-offset-17 {\n    margin-left: 70.83333333%;\n  }\n  .ant-col-md-order-17 {\n    order: 17;\n  }\n  .ant-col-md-16 {\n    display: block;\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .ant-col-md-push-16 {\n    left: 66.66666667%;\n  }\n  .ant-col-md-pull-16 {\n    right: 66.66666667%;\n  }\n  .ant-col-md-offset-16 {\n    margin-left: 66.66666667%;\n  }\n  .ant-col-md-order-16 {\n    order: 16;\n  }\n  .ant-col-md-15 {\n    display: block;\n    flex: 0 0 62.5%;\n    max-width: 62.5%;\n  }\n  .ant-col-md-push-15 {\n    left: 62.5%;\n  }\n  .ant-col-md-pull-15 {\n    right: 62.5%;\n  }\n  .ant-col-md-offset-15 {\n    margin-left: 62.5%;\n  }\n  .ant-col-md-order-15 {\n    order: 15;\n  }\n  .ant-col-md-14 {\n    display: block;\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .ant-col-md-push-14 {\n    left: 58.33333333%;\n  }\n  .ant-col-md-pull-14 {\n    right: 58.33333333%;\n  }\n  .ant-col-md-offset-14 {\n    margin-left: 58.33333333%;\n  }\n  .ant-col-md-order-14 {\n    order: 14;\n  }\n  .ant-col-md-13 {\n    display: block;\n    flex: 0 0 54.16666667%;\n    max-width: 54.16666667%;\n  }\n  .ant-col-md-push-13 {\n    left: 54.16666667%;\n  }\n  .ant-col-md-pull-13 {\n    right: 54.16666667%;\n  }\n  .ant-col-md-offset-13 {\n    margin-left: 54.16666667%;\n  }\n  .ant-col-md-order-13 {\n    order: 13;\n  }\n  .ant-col-md-12 {\n    display: block;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .ant-col-md-push-12 {\n    left: 50%;\n  }\n  .ant-col-md-pull-12 {\n    right: 50%;\n  }\n  .ant-col-md-offset-12 {\n    margin-left: 50%;\n  }\n  .ant-col-md-order-12 {\n    order: 12;\n  }\n  .ant-col-md-11 {\n    display: block;\n    flex: 0 0 45.83333333%;\n    max-width: 45.83333333%;\n  }\n  .ant-col-md-push-11 {\n    left: 45.83333333%;\n  }\n  .ant-col-md-pull-11 {\n    right: 45.83333333%;\n  }\n  .ant-col-md-offset-11 {\n    margin-left: 45.83333333%;\n  }\n  .ant-col-md-order-11 {\n    order: 11;\n  }\n  .ant-col-md-10 {\n    display: block;\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .ant-col-md-push-10 {\n    left: 41.66666667%;\n  }\n  .ant-col-md-pull-10 {\n    right: 41.66666667%;\n  }\n  .ant-col-md-offset-10 {\n    margin-left: 41.66666667%;\n  }\n  .ant-col-md-order-10 {\n    order: 10;\n  }\n  .ant-col-md-9 {\n    display: block;\n    flex: 0 0 37.5%;\n    max-width: 37.5%;\n  }\n  .ant-col-md-push-9 {\n    left: 37.5%;\n  }\n  .ant-col-md-pull-9 {\n    right: 37.5%;\n  }\n  .ant-col-md-offset-9 {\n    margin-left: 37.5%;\n  }\n  .ant-col-md-order-9 {\n    order: 9;\n  }\n  .ant-col-md-8 {\n    display: block;\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .ant-col-md-push-8 {\n    left: 33.33333333%;\n  }\n  .ant-col-md-pull-8 {\n    right: 33.33333333%;\n  }\n  .ant-col-md-offset-8 {\n    margin-left: 33.33333333%;\n  }\n  .ant-col-md-order-8 {\n    order: 8;\n  }\n  .ant-col-md-7 {\n    display: block;\n    flex: 0 0 29.16666667%;\n    max-width: 29.16666667%;\n  }\n  .ant-col-md-push-7 {\n    left: 29.16666667%;\n  }\n  .ant-col-md-pull-7 {\n    right: 29.16666667%;\n  }\n  .ant-col-md-offset-7 {\n    margin-left: 29.16666667%;\n  }\n  .ant-col-md-order-7 {\n    order: 7;\n  }\n  .ant-col-md-6 {\n    display: block;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .ant-col-md-push-6 {\n    left: 25%;\n  }\n  .ant-col-md-pull-6 {\n    right: 25%;\n  }\n  .ant-col-md-offset-6 {\n    margin-left: 25%;\n  }\n  .ant-col-md-order-6 {\n    order: 6;\n  }\n  .ant-col-md-5 {\n    display: block;\n    flex: 0 0 20.83333333%;\n    max-width: 20.83333333%;\n  }\n  .ant-col-md-push-5 {\n    left: 20.83333333%;\n  }\n  .ant-col-md-pull-5 {\n    right: 20.83333333%;\n  }\n  .ant-col-md-offset-5 {\n    margin-left: 20.83333333%;\n  }\n  .ant-col-md-order-5 {\n    order: 5;\n  }\n  .ant-col-md-4 {\n    display: block;\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .ant-col-md-push-4 {\n    left: 16.66666667%;\n  }\n  .ant-col-md-pull-4 {\n    right: 16.66666667%;\n  }\n  .ant-col-md-offset-4 {\n    margin-left: 16.66666667%;\n  }\n  .ant-col-md-order-4 {\n    order: 4;\n  }\n  .ant-col-md-3 {\n    display: block;\n    flex: 0 0 12.5%;\n    max-width: 12.5%;\n  }\n  .ant-col-md-push-3 {\n    left: 12.5%;\n  }\n  .ant-col-md-pull-3 {\n    right: 12.5%;\n  }\n  .ant-col-md-offset-3 {\n    margin-left: 12.5%;\n  }\n  .ant-col-md-order-3 {\n    order: 3;\n  }\n  .ant-col-md-2 {\n    display: block;\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .ant-col-md-push-2 {\n    left: 8.33333333%;\n  }\n  .ant-col-md-pull-2 {\n    right: 8.33333333%;\n  }\n  .ant-col-md-offset-2 {\n    margin-left: 8.33333333%;\n  }\n  .ant-col-md-order-2 {\n    order: 2;\n  }\n  .ant-col-md-1 {\n    display: block;\n    flex: 0 0 4.16666667%;\n    max-width: 4.16666667%;\n  }\n  .ant-col-md-push-1 {\n    left: 4.16666667%;\n  }\n  .ant-col-md-pull-1 {\n    right: 4.16666667%;\n  }\n  .ant-col-md-offset-1 {\n    margin-left: 4.16666667%;\n  }\n  .ant-col-md-order-1 {\n    order: 1;\n  }\n  .ant-col-md-0 {\n    display: none;\n  }\n  .ant-col-push-0 {\n    left: auto;\n  }\n  .ant-col-pull-0 {\n    right: auto;\n  }\n  .ant-col-md-push-0 {\n    left: auto;\n  }\n  .ant-col-md-pull-0 {\n    right: auto;\n  }\n  .ant-col-md-offset-0 {\n    margin-left: 0;\n  }\n  .ant-col-md-order-0 {\n    order: 0;\n  }\n  .ant-col-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-md-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-md-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-md-offset-0.ant-col-rtl {\n    margin-right: 0;\n  }\n  .ant-col-md-push-1.ant-col-rtl {\n    right: 4.16666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-1.ant-col-rtl {\n    right: auto;\n    left: 4.16666667%;\n  }\n  .ant-col-md-offset-1.ant-col-rtl {\n    margin-right: 4.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-2.ant-col-rtl {\n    right: 8.33333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-2.ant-col-rtl {\n    right: auto;\n    left: 8.33333333%;\n  }\n  .ant-col-md-offset-2.ant-col-rtl {\n    margin-right: 8.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-3.ant-col-rtl {\n    right: 12.5%;\n    left: auto;\n  }\n  .ant-col-md-pull-3.ant-col-rtl {\n    right: auto;\n    left: 12.5%;\n  }\n  .ant-col-md-offset-3.ant-col-rtl {\n    margin-right: 12.5%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-4.ant-col-rtl {\n    right: 16.66666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-4.ant-col-rtl {\n    right: auto;\n    left: 16.66666667%;\n  }\n  .ant-col-md-offset-4.ant-col-rtl {\n    margin-right: 16.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-5.ant-col-rtl {\n    right: 20.83333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-5.ant-col-rtl {\n    right: auto;\n    left: 20.83333333%;\n  }\n  .ant-col-md-offset-5.ant-col-rtl {\n    margin-right: 20.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-6.ant-col-rtl {\n    right: 25%;\n    left: auto;\n  }\n  .ant-col-md-pull-6.ant-col-rtl {\n    right: auto;\n    left: 25%;\n  }\n  .ant-col-md-offset-6.ant-col-rtl {\n    margin-right: 25%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-7.ant-col-rtl {\n    right: 29.16666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-7.ant-col-rtl {\n    right: auto;\n    left: 29.16666667%;\n  }\n  .ant-col-md-offset-7.ant-col-rtl {\n    margin-right: 29.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-8.ant-col-rtl {\n    right: 33.33333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-8.ant-col-rtl {\n    right: auto;\n    left: 33.33333333%;\n  }\n  .ant-col-md-offset-8.ant-col-rtl {\n    margin-right: 33.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-9.ant-col-rtl {\n    right: 37.5%;\n    left: auto;\n  }\n  .ant-col-md-pull-9.ant-col-rtl {\n    right: auto;\n    left: 37.5%;\n  }\n  .ant-col-md-offset-9.ant-col-rtl {\n    margin-right: 37.5%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-10.ant-col-rtl {\n    right: 41.66666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-10.ant-col-rtl {\n    right: auto;\n    left: 41.66666667%;\n  }\n  .ant-col-md-offset-10.ant-col-rtl {\n    margin-right: 41.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-11.ant-col-rtl {\n    right: 45.83333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-11.ant-col-rtl {\n    right: auto;\n    left: 45.83333333%;\n  }\n  .ant-col-md-offset-11.ant-col-rtl {\n    margin-right: 45.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-12.ant-col-rtl {\n    right: 50%;\n    left: auto;\n  }\n  .ant-col-md-pull-12.ant-col-rtl {\n    right: auto;\n    left: 50%;\n  }\n  .ant-col-md-offset-12.ant-col-rtl {\n    margin-right: 50%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-13.ant-col-rtl {\n    right: 54.16666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-13.ant-col-rtl {\n    right: auto;\n    left: 54.16666667%;\n  }\n  .ant-col-md-offset-13.ant-col-rtl {\n    margin-right: 54.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-14.ant-col-rtl {\n    right: 58.33333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-14.ant-col-rtl {\n    right: auto;\n    left: 58.33333333%;\n  }\n  .ant-col-md-offset-14.ant-col-rtl {\n    margin-right: 58.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-15.ant-col-rtl {\n    right: 62.5%;\n    left: auto;\n  }\n  .ant-col-md-pull-15.ant-col-rtl {\n    right: auto;\n    left: 62.5%;\n  }\n  .ant-col-md-offset-15.ant-col-rtl {\n    margin-right: 62.5%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-16.ant-col-rtl {\n    right: 66.66666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-16.ant-col-rtl {\n    right: auto;\n    left: 66.66666667%;\n  }\n  .ant-col-md-offset-16.ant-col-rtl {\n    margin-right: 66.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-17.ant-col-rtl {\n    right: 70.83333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-17.ant-col-rtl {\n    right: auto;\n    left: 70.83333333%;\n  }\n  .ant-col-md-offset-17.ant-col-rtl {\n    margin-right: 70.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-18.ant-col-rtl {\n    right: 75%;\n    left: auto;\n  }\n  .ant-col-md-pull-18.ant-col-rtl {\n    right: auto;\n    left: 75%;\n  }\n  .ant-col-md-offset-18.ant-col-rtl {\n    margin-right: 75%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-19.ant-col-rtl {\n    right: 79.16666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-19.ant-col-rtl {\n    right: auto;\n    left: 79.16666667%;\n  }\n  .ant-col-md-offset-19.ant-col-rtl {\n    margin-right: 79.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-20.ant-col-rtl {\n    right: 83.33333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-20.ant-col-rtl {\n    right: auto;\n    left: 83.33333333%;\n  }\n  .ant-col-md-offset-20.ant-col-rtl {\n    margin-right: 83.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-21.ant-col-rtl {\n    right: 87.5%;\n    left: auto;\n  }\n  .ant-col-md-pull-21.ant-col-rtl {\n    right: auto;\n    left: 87.5%;\n  }\n  .ant-col-md-offset-21.ant-col-rtl {\n    margin-right: 87.5%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-22.ant-col-rtl {\n    right: 91.66666667%;\n    left: auto;\n  }\n  .ant-col-md-pull-22.ant-col-rtl {\n    right: auto;\n    left: 91.66666667%;\n  }\n  .ant-col-md-offset-22.ant-col-rtl {\n    margin-right: 91.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-23.ant-col-rtl {\n    right: 95.83333333%;\n    left: auto;\n  }\n  .ant-col-md-pull-23.ant-col-rtl {\n    right: auto;\n    left: 95.83333333%;\n  }\n  .ant-col-md-offset-23.ant-col-rtl {\n    margin-right: 95.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-md-push-24.ant-col-rtl {\n    right: 100%;\n    left: auto;\n  }\n  .ant-col-md-pull-24.ant-col-rtl {\n    right: auto;\n    left: 100%;\n  }\n  .ant-col-md-offset-24.ant-col-rtl {\n    margin-right: 100%;\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .ant-col-lg-24 {\n    display: block;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-lg-push-24 {\n    left: 100%;\n  }\n  .ant-col-lg-pull-24 {\n    right: 100%;\n  }\n  .ant-col-lg-offset-24 {\n    margin-left: 100%;\n  }\n  .ant-col-lg-order-24 {\n    order: 24;\n  }\n  .ant-col-lg-23 {\n    display: block;\n    flex: 0 0 95.83333333%;\n    max-width: 95.83333333%;\n  }\n  .ant-col-lg-push-23 {\n    left: 95.83333333%;\n  }\n  .ant-col-lg-pull-23 {\n    right: 95.83333333%;\n  }\n  .ant-col-lg-offset-23 {\n    margin-left: 95.83333333%;\n  }\n  .ant-col-lg-order-23 {\n    order: 23;\n  }\n  .ant-col-lg-22 {\n    display: block;\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .ant-col-lg-push-22 {\n    left: 91.66666667%;\n  }\n  .ant-col-lg-pull-22 {\n    right: 91.66666667%;\n  }\n  .ant-col-lg-offset-22 {\n    margin-left: 91.66666667%;\n  }\n  .ant-col-lg-order-22 {\n    order: 22;\n  }\n  .ant-col-lg-21 {\n    display: block;\n    flex: 0 0 87.5%;\n    max-width: 87.5%;\n  }\n  .ant-col-lg-push-21 {\n    left: 87.5%;\n  }\n  .ant-col-lg-pull-21 {\n    right: 87.5%;\n  }\n  .ant-col-lg-offset-21 {\n    margin-left: 87.5%;\n  }\n  .ant-col-lg-order-21 {\n    order: 21;\n  }\n  .ant-col-lg-20 {\n    display: block;\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .ant-col-lg-push-20 {\n    left: 83.33333333%;\n  }\n  .ant-col-lg-pull-20 {\n    right: 83.33333333%;\n  }\n  .ant-col-lg-offset-20 {\n    margin-left: 83.33333333%;\n  }\n  .ant-col-lg-order-20 {\n    order: 20;\n  }\n  .ant-col-lg-19 {\n    display: block;\n    flex: 0 0 79.16666667%;\n    max-width: 79.16666667%;\n  }\n  .ant-col-lg-push-19 {\n    left: 79.16666667%;\n  }\n  .ant-col-lg-pull-19 {\n    right: 79.16666667%;\n  }\n  .ant-col-lg-offset-19 {\n    margin-left: 79.16666667%;\n  }\n  .ant-col-lg-order-19 {\n    order: 19;\n  }\n  .ant-col-lg-18 {\n    display: block;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .ant-col-lg-push-18 {\n    left: 75%;\n  }\n  .ant-col-lg-pull-18 {\n    right: 75%;\n  }\n  .ant-col-lg-offset-18 {\n    margin-left: 75%;\n  }\n  .ant-col-lg-order-18 {\n    order: 18;\n  }\n  .ant-col-lg-17 {\n    display: block;\n    flex: 0 0 70.83333333%;\n    max-width: 70.83333333%;\n  }\n  .ant-col-lg-push-17 {\n    left: 70.83333333%;\n  }\n  .ant-col-lg-pull-17 {\n    right: 70.83333333%;\n  }\n  .ant-col-lg-offset-17 {\n    margin-left: 70.83333333%;\n  }\n  .ant-col-lg-order-17 {\n    order: 17;\n  }\n  .ant-col-lg-16 {\n    display: block;\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .ant-col-lg-push-16 {\n    left: 66.66666667%;\n  }\n  .ant-col-lg-pull-16 {\n    right: 66.66666667%;\n  }\n  .ant-col-lg-offset-16 {\n    margin-left: 66.66666667%;\n  }\n  .ant-col-lg-order-16 {\n    order: 16;\n  }\n  .ant-col-lg-15 {\n    display: block;\n    flex: 0 0 62.5%;\n    max-width: 62.5%;\n  }\n  .ant-col-lg-push-15 {\n    left: 62.5%;\n  }\n  .ant-col-lg-pull-15 {\n    right: 62.5%;\n  }\n  .ant-col-lg-offset-15 {\n    margin-left: 62.5%;\n  }\n  .ant-col-lg-order-15 {\n    order: 15;\n  }\n  .ant-col-lg-14 {\n    display: block;\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .ant-col-lg-push-14 {\n    left: 58.33333333%;\n  }\n  .ant-col-lg-pull-14 {\n    right: 58.33333333%;\n  }\n  .ant-col-lg-offset-14 {\n    margin-left: 58.33333333%;\n  }\n  .ant-col-lg-order-14 {\n    order: 14;\n  }\n  .ant-col-lg-13 {\n    display: block;\n    flex: 0 0 54.16666667%;\n    max-width: 54.16666667%;\n  }\n  .ant-col-lg-push-13 {\n    left: 54.16666667%;\n  }\n  .ant-col-lg-pull-13 {\n    right: 54.16666667%;\n  }\n  .ant-col-lg-offset-13 {\n    margin-left: 54.16666667%;\n  }\n  .ant-col-lg-order-13 {\n    order: 13;\n  }\n  .ant-col-lg-12 {\n    display: block;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .ant-col-lg-push-12 {\n    left: 50%;\n  }\n  .ant-col-lg-pull-12 {\n    right: 50%;\n  }\n  .ant-col-lg-offset-12 {\n    margin-left: 50%;\n  }\n  .ant-col-lg-order-12 {\n    order: 12;\n  }\n  .ant-col-lg-11 {\n    display: block;\n    flex: 0 0 45.83333333%;\n    max-width: 45.83333333%;\n  }\n  .ant-col-lg-push-11 {\n    left: 45.83333333%;\n  }\n  .ant-col-lg-pull-11 {\n    right: 45.83333333%;\n  }\n  .ant-col-lg-offset-11 {\n    margin-left: 45.83333333%;\n  }\n  .ant-col-lg-order-11 {\n    order: 11;\n  }\n  .ant-col-lg-10 {\n    display: block;\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .ant-col-lg-push-10 {\n    left: 41.66666667%;\n  }\n  .ant-col-lg-pull-10 {\n    right: 41.66666667%;\n  }\n  .ant-col-lg-offset-10 {\n    margin-left: 41.66666667%;\n  }\n  .ant-col-lg-order-10 {\n    order: 10;\n  }\n  .ant-col-lg-9 {\n    display: block;\n    flex: 0 0 37.5%;\n    max-width: 37.5%;\n  }\n  .ant-col-lg-push-9 {\n    left: 37.5%;\n  }\n  .ant-col-lg-pull-9 {\n    right: 37.5%;\n  }\n  .ant-col-lg-offset-9 {\n    margin-left: 37.5%;\n  }\n  .ant-col-lg-order-9 {\n    order: 9;\n  }\n  .ant-col-lg-8 {\n    display: block;\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .ant-col-lg-push-8 {\n    left: 33.33333333%;\n  }\n  .ant-col-lg-pull-8 {\n    right: 33.33333333%;\n  }\n  .ant-col-lg-offset-8 {\n    margin-left: 33.33333333%;\n  }\n  .ant-col-lg-order-8 {\n    order: 8;\n  }\n  .ant-col-lg-7 {\n    display: block;\n    flex: 0 0 29.16666667%;\n    max-width: 29.16666667%;\n  }\n  .ant-col-lg-push-7 {\n    left: 29.16666667%;\n  }\n  .ant-col-lg-pull-7 {\n    right: 29.16666667%;\n  }\n  .ant-col-lg-offset-7 {\n    margin-left: 29.16666667%;\n  }\n  .ant-col-lg-order-7 {\n    order: 7;\n  }\n  .ant-col-lg-6 {\n    display: block;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .ant-col-lg-push-6 {\n    left: 25%;\n  }\n  .ant-col-lg-pull-6 {\n    right: 25%;\n  }\n  .ant-col-lg-offset-6 {\n    margin-left: 25%;\n  }\n  .ant-col-lg-order-6 {\n    order: 6;\n  }\n  .ant-col-lg-5 {\n    display: block;\n    flex: 0 0 20.83333333%;\n    max-width: 20.83333333%;\n  }\n  .ant-col-lg-push-5 {\n    left: 20.83333333%;\n  }\n  .ant-col-lg-pull-5 {\n    right: 20.83333333%;\n  }\n  .ant-col-lg-offset-5 {\n    margin-left: 20.83333333%;\n  }\n  .ant-col-lg-order-5 {\n    order: 5;\n  }\n  .ant-col-lg-4 {\n    display: block;\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .ant-col-lg-push-4 {\n    left: 16.66666667%;\n  }\n  .ant-col-lg-pull-4 {\n    right: 16.66666667%;\n  }\n  .ant-col-lg-offset-4 {\n    margin-left: 16.66666667%;\n  }\n  .ant-col-lg-order-4 {\n    order: 4;\n  }\n  .ant-col-lg-3 {\n    display: block;\n    flex: 0 0 12.5%;\n    max-width: 12.5%;\n  }\n  .ant-col-lg-push-3 {\n    left: 12.5%;\n  }\n  .ant-col-lg-pull-3 {\n    right: 12.5%;\n  }\n  .ant-col-lg-offset-3 {\n    margin-left: 12.5%;\n  }\n  .ant-col-lg-order-3 {\n    order: 3;\n  }\n  .ant-col-lg-2 {\n    display: block;\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .ant-col-lg-push-2 {\n    left: 8.33333333%;\n  }\n  .ant-col-lg-pull-2 {\n    right: 8.33333333%;\n  }\n  .ant-col-lg-offset-2 {\n    margin-left: 8.33333333%;\n  }\n  .ant-col-lg-order-2 {\n    order: 2;\n  }\n  .ant-col-lg-1 {\n    display: block;\n    flex: 0 0 4.16666667%;\n    max-width: 4.16666667%;\n  }\n  .ant-col-lg-push-1 {\n    left: 4.16666667%;\n  }\n  .ant-col-lg-pull-1 {\n    right: 4.16666667%;\n  }\n  .ant-col-lg-offset-1 {\n    margin-left: 4.16666667%;\n  }\n  .ant-col-lg-order-1 {\n    order: 1;\n  }\n  .ant-col-lg-0 {\n    display: none;\n  }\n  .ant-col-push-0 {\n    left: auto;\n  }\n  .ant-col-pull-0 {\n    right: auto;\n  }\n  .ant-col-lg-push-0 {\n    left: auto;\n  }\n  .ant-col-lg-pull-0 {\n    right: auto;\n  }\n  .ant-col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .ant-col-lg-order-0 {\n    order: 0;\n  }\n  .ant-col-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-lg-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-lg-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-lg-offset-0.ant-col-rtl {\n    margin-right: 0;\n  }\n  .ant-col-lg-push-1.ant-col-rtl {\n    right: 4.16666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-1.ant-col-rtl {\n    right: auto;\n    left: 4.16666667%;\n  }\n  .ant-col-lg-offset-1.ant-col-rtl {\n    margin-right: 4.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-2.ant-col-rtl {\n    right: 8.33333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-2.ant-col-rtl {\n    right: auto;\n    left: 8.33333333%;\n  }\n  .ant-col-lg-offset-2.ant-col-rtl {\n    margin-right: 8.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-3.ant-col-rtl {\n    right: 12.5%;\n    left: auto;\n  }\n  .ant-col-lg-pull-3.ant-col-rtl {\n    right: auto;\n    left: 12.5%;\n  }\n  .ant-col-lg-offset-3.ant-col-rtl {\n    margin-right: 12.5%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-4.ant-col-rtl {\n    right: 16.66666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-4.ant-col-rtl {\n    right: auto;\n    left: 16.66666667%;\n  }\n  .ant-col-lg-offset-4.ant-col-rtl {\n    margin-right: 16.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-5.ant-col-rtl {\n    right: 20.83333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-5.ant-col-rtl {\n    right: auto;\n    left: 20.83333333%;\n  }\n  .ant-col-lg-offset-5.ant-col-rtl {\n    margin-right: 20.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-6.ant-col-rtl {\n    right: 25%;\n    left: auto;\n  }\n  .ant-col-lg-pull-6.ant-col-rtl {\n    right: auto;\n    left: 25%;\n  }\n  .ant-col-lg-offset-6.ant-col-rtl {\n    margin-right: 25%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-7.ant-col-rtl {\n    right: 29.16666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-7.ant-col-rtl {\n    right: auto;\n    left: 29.16666667%;\n  }\n  .ant-col-lg-offset-7.ant-col-rtl {\n    margin-right: 29.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-8.ant-col-rtl {\n    right: 33.33333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-8.ant-col-rtl {\n    right: auto;\n    left: 33.33333333%;\n  }\n  .ant-col-lg-offset-8.ant-col-rtl {\n    margin-right: 33.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-9.ant-col-rtl {\n    right: 37.5%;\n    left: auto;\n  }\n  .ant-col-lg-pull-9.ant-col-rtl {\n    right: auto;\n    left: 37.5%;\n  }\n  .ant-col-lg-offset-9.ant-col-rtl {\n    margin-right: 37.5%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-10.ant-col-rtl {\n    right: 41.66666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-10.ant-col-rtl {\n    right: auto;\n    left: 41.66666667%;\n  }\n  .ant-col-lg-offset-10.ant-col-rtl {\n    margin-right: 41.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-11.ant-col-rtl {\n    right: 45.83333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-11.ant-col-rtl {\n    right: auto;\n    left: 45.83333333%;\n  }\n  .ant-col-lg-offset-11.ant-col-rtl {\n    margin-right: 45.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-12.ant-col-rtl {\n    right: 50%;\n    left: auto;\n  }\n  .ant-col-lg-pull-12.ant-col-rtl {\n    right: auto;\n    left: 50%;\n  }\n  .ant-col-lg-offset-12.ant-col-rtl {\n    margin-right: 50%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-13.ant-col-rtl {\n    right: 54.16666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-13.ant-col-rtl {\n    right: auto;\n    left: 54.16666667%;\n  }\n  .ant-col-lg-offset-13.ant-col-rtl {\n    margin-right: 54.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-14.ant-col-rtl {\n    right: 58.33333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-14.ant-col-rtl {\n    right: auto;\n    left: 58.33333333%;\n  }\n  .ant-col-lg-offset-14.ant-col-rtl {\n    margin-right: 58.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-15.ant-col-rtl {\n    right: 62.5%;\n    left: auto;\n  }\n  .ant-col-lg-pull-15.ant-col-rtl {\n    right: auto;\n    left: 62.5%;\n  }\n  .ant-col-lg-offset-15.ant-col-rtl {\n    margin-right: 62.5%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-16.ant-col-rtl {\n    right: 66.66666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-16.ant-col-rtl {\n    right: auto;\n    left: 66.66666667%;\n  }\n  .ant-col-lg-offset-16.ant-col-rtl {\n    margin-right: 66.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-17.ant-col-rtl {\n    right: 70.83333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-17.ant-col-rtl {\n    right: auto;\n    left: 70.83333333%;\n  }\n  .ant-col-lg-offset-17.ant-col-rtl {\n    margin-right: 70.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-18.ant-col-rtl {\n    right: 75%;\n    left: auto;\n  }\n  .ant-col-lg-pull-18.ant-col-rtl {\n    right: auto;\n    left: 75%;\n  }\n  .ant-col-lg-offset-18.ant-col-rtl {\n    margin-right: 75%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-19.ant-col-rtl {\n    right: 79.16666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-19.ant-col-rtl {\n    right: auto;\n    left: 79.16666667%;\n  }\n  .ant-col-lg-offset-19.ant-col-rtl {\n    margin-right: 79.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-20.ant-col-rtl {\n    right: 83.33333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-20.ant-col-rtl {\n    right: auto;\n    left: 83.33333333%;\n  }\n  .ant-col-lg-offset-20.ant-col-rtl {\n    margin-right: 83.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-21.ant-col-rtl {\n    right: 87.5%;\n    left: auto;\n  }\n  .ant-col-lg-pull-21.ant-col-rtl {\n    right: auto;\n    left: 87.5%;\n  }\n  .ant-col-lg-offset-21.ant-col-rtl {\n    margin-right: 87.5%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-22.ant-col-rtl {\n    right: 91.66666667%;\n    left: auto;\n  }\n  .ant-col-lg-pull-22.ant-col-rtl {\n    right: auto;\n    left: 91.66666667%;\n  }\n  .ant-col-lg-offset-22.ant-col-rtl {\n    margin-right: 91.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-23.ant-col-rtl {\n    right: 95.83333333%;\n    left: auto;\n  }\n  .ant-col-lg-pull-23.ant-col-rtl {\n    right: auto;\n    left: 95.83333333%;\n  }\n  .ant-col-lg-offset-23.ant-col-rtl {\n    margin-right: 95.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-lg-push-24.ant-col-rtl {\n    right: 100%;\n    left: auto;\n  }\n  .ant-col-lg-pull-24.ant-col-rtl {\n    right: auto;\n    left: 100%;\n  }\n  .ant-col-lg-offset-24.ant-col-rtl {\n    margin-right: 100%;\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .ant-col-xl-24 {\n    display: block;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-xl-push-24 {\n    left: 100%;\n  }\n  .ant-col-xl-pull-24 {\n    right: 100%;\n  }\n  .ant-col-xl-offset-24 {\n    margin-left: 100%;\n  }\n  .ant-col-xl-order-24 {\n    order: 24;\n  }\n  .ant-col-xl-23 {\n    display: block;\n    flex: 0 0 95.83333333%;\n    max-width: 95.83333333%;\n  }\n  .ant-col-xl-push-23 {\n    left: 95.83333333%;\n  }\n  .ant-col-xl-pull-23 {\n    right: 95.83333333%;\n  }\n  .ant-col-xl-offset-23 {\n    margin-left: 95.83333333%;\n  }\n  .ant-col-xl-order-23 {\n    order: 23;\n  }\n  .ant-col-xl-22 {\n    display: block;\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .ant-col-xl-push-22 {\n    left: 91.66666667%;\n  }\n  .ant-col-xl-pull-22 {\n    right: 91.66666667%;\n  }\n  .ant-col-xl-offset-22 {\n    margin-left: 91.66666667%;\n  }\n  .ant-col-xl-order-22 {\n    order: 22;\n  }\n  .ant-col-xl-21 {\n    display: block;\n    flex: 0 0 87.5%;\n    max-width: 87.5%;\n  }\n  .ant-col-xl-push-21 {\n    left: 87.5%;\n  }\n  .ant-col-xl-pull-21 {\n    right: 87.5%;\n  }\n  .ant-col-xl-offset-21 {\n    margin-left: 87.5%;\n  }\n  .ant-col-xl-order-21 {\n    order: 21;\n  }\n  .ant-col-xl-20 {\n    display: block;\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .ant-col-xl-push-20 {\n    left: 83.33333333%;\n  }\n  .ant-col-xl-pull-20 {\n    right: 83.33333333%;\n  }\n  .ant-col-xl-offset-20 {\n    margin-left: 83.33333333%;\n  }\n  .ant-col-xl-order-20 {\n    order: 20;\n  }\n  .ant-col-xl-19 {\n    display: block;\n    flex: 0 0 79.16666667%;\n    max-width: 79.16666667%;\n  }\n  .ant-col-xl-push-19 {\n    left: 79.16666667%;\n  }\n  .ant-col-xl-pull-19 {\n    right: 79.16666667%;\n  }\n  .ant-col-xl-offset-19 {\n    margin-left: 79.16666667%;\n  }\n  .ant-col-xl-order-19 {\n    order: 19;\n  }\n  .ant-col-xl-18 {\n    display: block;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .ant-col-xl-push-18 {\n    left: 75%;\n  }\n  .ant-col-xl-pull-18 {\n    right: 75%;\n  }\n  .ant-col-xl-offset-18 {\n    margin-left: 75%;\n  }\n  .ant-col-xl-order-18 {\n    order: 18;\n  }\n  .ant-col-xl-17 {\n    display: block;\n    flex: 0 0 70.83333333%;\n    max-width: 70.83333333%;\n  }\n  .ant-col-xl-push-17 {\n    left: 70.83333333%;\n  }\n  .ant-col-xl-pull-17 {\n    right: 70.83333333%;\n  }\n  .ant-col-xl-offset-17 {\n    margin-left: 70.83333333%;\n  }\n  .ant-col-xl-order-17 {\n    order: 17;\n  }\n  .ant-col-xl-16 {\n    display: block;\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .ant-col-xl-push-16 {\n    left: 66.66666667%;\n  }\n  .ant-col-xl-pull-16 {\n    right: 66.66666667%;\n  }\n  .ant-col-xl-offset-16 {\n    margin-left: 66.66666667%;\n  }\n  .ant-col-xl-order-16 {\n    order: 16;\n  }\n  .ant-col-xl-15 {\n    display: block;\n    flex: 0 0 62.5%;\n    max-width: 62.5%;\n  }\n  .ant-col-xl-push-15 {\n    left: 62.5%;\n  }\n  .ant-col-xl-pull-15 {\n    right: 62.5%;\n  }\n  .ant-col-xl-offset-15 {\n    margin-left: 62.5%;\n  }\n  .ant-col-xl-order-15 {\n    order: 15;\n  }\n  .ant-col-xl-14 {\n    display: block;\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .ant-col-xl-push-14 {\n    left: 58.33333333%;\n  }\n  .ant-col-xl-pull-14 {\n    right: 58.33333333%;\n  }\n  .ant-col-xl-offset-14 {\n    margin-left: 58.33333333%;\n  }\n  .ant-col-xl-order-14 {\n    order: 14;\n  }\n  .ant-col-xl-13 {\n    display: block;\n    flex: 0 0 54.16666667%;\n    max-width: 54.16666667%;\n  }\n  .ant-col-xl-push-13 {\n    left: 54.16666667%;\n  }\n  .ant-col-xl-pull-13 {\n    right: 54.16666667%;\n  }\n  .ant-col-xl-offset-13 {\n    margin-left: 54.16666667%;\n  }\n  .ant-col-xl-order-13 {\n    order: 13;\n  }\n  .ant-col-xl-12 {\n    display: block;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .ant-col-xl-push-12 {\n    left: 50%;\n  }\n  .ant-col-xl-pull-12 {\n    right: 50%;\n  }\n  .ant-col-xl-offset-12 {\n    margin-left: 50%;\n  }\n  .ant-col-xl-order-12 {\n    order: 12;\n  }\n  .ant-col-xl-11 {\n    display: block;\n    flex: 0 0 45.83333333%;\n    max-width: 45.83333333%;\n  }\n  .ant-col-xl-push-11 {\n    left: 45.83333333%;\n  }\n  .ant-col-xl-pull-11 {\n    right: 45.83333333%;\n  }\n  .ant-col-xl-offset-11 {\n    margin-left: 45.83333333%;\n  }\n  .ant-col-xl-order-11 {\n    order: 11;\n  }\n  .ant-col-xl-10 {\n    display: block;\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .ant-col-xl-push-10 {\n    left: 41.66666667%;\n  }\n  .ant-col-xl-pull-10 {\n    right: 41.66666667%;\n  }\n  .ant-col-xl-offset-10 {\n    margin-left: 41.66666667%;\n  }\n  .ant-col-xl-order-10 {\n    order: 10;\n  }\n  .ant-col-xl-9 {\n    display: block;\n    flex: 0 0 37.5%;\n    max-width: 37.5%;\n  }\n  .ant-col-xl-push-9 {\n    left: 37.5%;\n  }\n  .ant-col-xl-pull-9 {\n    right: 37.5%;\n  }\n  .ant-col-xl-offset-9 {\n    margin-left: 37.5%;\n  }\n  .ant-col-xl-order-9 {\n    order: 9;\n  }\n  .ant-col-xl-8 {\n    display: block;\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .ant-col-xl-push-8 {\n    left: 33.33333333%;\n  }\n  .ant-col-xl-pull-8 {\n    right: 33.33333333%;\n  }\n  .ant-col-xl-offset-8 {\n    margin-left: 33.33333333%;\n  }\n  .ant-col-xl-order-8 {\n    order: 8;\n  }\n  .ant-col-xl-7 {\n    display: block;\n    flex: 0 0 29.16666667%;\n    max-width: 29.16666667%;\n  }\n  .ant-col-xl-push-7 {\n    left: 29.16666667%;\n  }\n  .ant-col-xl-pull-7 {\n    right: 29.16666667%;\n  }\n  .ant-col-xl-offset-7 {\n    margin-left: 29.16666667%;\n  }\n  .ant-col-xl-order-7 {\n    order: 7;\n  }\n  .ant-col-xl-6 {\n    display: block;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .ant-col-xl-push-6 {\n    left: 25%;\n  }\n  .ant-col-xl-pull-6 {\n    right: 25%;\n  }\n  .ant-col-xl-offset-6 {\n    margin-left: 25%;\n  }\n  .ant-col-xl-order-6 {\n    order: 6;\n  }\n  .ant-col-xl-5 {\n    display: block;\n    flex: 0 0 20.83333333%;\n    max-width: 20.83333333%;\n  }\n  .ant-col-xl-push-5 {\n    left: 20.83333333%;\n  }\n  .ant-col-xl-pull-5 {\n    right: 20.83333333%;\n  }\n  .ant-col-xl-offset-5 {\n    margin-left: 20.83333333%;\n  }\n  .ant-col-xl-order-5 {\n    order: 5;\n  }\n  .ant-col-xl-4 {\n    display: block;\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .ant-col-xl-push-4 {\n    left: 16.66666667%;\n  }\n  .ant-col-xl-pull-4 {\n    right: 16.66666667%;\n  }\n  .ant-col-xl-offset-4 {\n    margin-left: 16.66666667%;\n  }\n  .ant-col-xl-order-4 {\n    order: 4;\n  }\n  .ant-col-xl-3 {\n    display: block;\n    flex: 0 0 12.5%;\n    max-width: 12.5%;\n  }\n  .ant-col-xl-push-3 {\n    left: 12.5%;\n  }\n  .ant-col-xl-pull-3 {\n    right: 12.5%;\n  }\n  .ant-col-xl-offset-3 {\n    margin-left: 12.5%;\n  }\n  .ant-col-xl-order-3 {\n    order: 3;\n  }\n  .ant-col-xl-2 {\n    display: block;\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .ant-col-xl-push-2 {\n    left: 8.33333333%;\n  }\n  .ant-col-xl-pull-2 {\n    right: 8.33333333%;\n  }\n  .ant-col-xl-offset-2 {\n    margin-left: 8.33333333%;\n  }\n  .ant-col-xl-order-2 {\n    order: 2;\n  }\n  .ant-col-xl-1 {\n    display: block;\n    flex: 0 0 4.16666667%;\n    max-width: 4.16666667%;\n  }\n  .ant-col-xl-push-1 {\n    left: 4.16666667%;\n  }\n  .ant-col-xl-pull-1 {\n    right: 4.16666667%;\n  }\n  .ant-col-xl-offset-1 {\n    margin-left: 4.16666667%;\n  }\n  .ant-col-xl-order-1 {\n    order: 1;\n  }\n  .ant-col-xl-0 {\n    display: none;\n  }\n  .ant-col-push-0 {\n    left: auto;\n  }\n  .ant-col-pull-0 {\n    right: auto;\n  }\n  .ant-col-xl-push-0 {\n    left: auto;\n  }\n  .ant-col-xl-pull-0 {\n    right: auto;\n  }\n  .ant-col-xl-offset-0 {\n    margin-left: 0;\n  }\n  .ant-col-xl-order-0 {\n    order: 0;\n  }\n  .ant-col-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-xl-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-xl-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-xl-offset-0.ant-col-rtl {\n    margin-right: 0;\n  }\n  .ant-col-xl-push-1.ant-col-rtl {\n    right: 4.16666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-1.ant-col-rtl {\n    right: auto;\n    left: 4.16666667%;\n  }\n  .ant-col-xl-offset-1.ant-col-rtl {\n    margin-right: 4.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-2.ant-col-rtl {\n    right: 8.33333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-2.ant-col-rtl {\n    right: auto;\n    left: 8.33333333%;\n  }\n  .ant-col-xl-offset-2.ant-col-rtl {\n    margin-right: 8.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-3.ant-col-rtl {\n    right: 12.5%;\n    left: auto;\n  }\n  .ant-col-xl-pull-3.ant-col-rtl {\n    right: auto;\n    left: 12.5%;\n  }\n  .ant-col-xl-offset-3.ant-col-rtl {\n    margin-right: 12.5%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-4.ant-col-rtl {\n    right: 16.66666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-4.ant-col-rtl {\n    right: auto;\n    left: 16.66666667%;\n  }\n  .ant-col-xl-offset-4.ant-col-rtl {\n    margin-right: 16.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-5.ant-col-rtl {\n    right: 20.83333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-5.ant-col-rtl {\n    right: auto;\n    left: 20.83333333%;\n  }\n  .ant-col-xl-offset-5.ant-col-rtl {\n    margin-right: 20.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-6.ant-col-rtl {\n    right: 25%;\n    left: auto;\n  }\n  .ant-col-xl-pull-6.ant-col-rtl {\n    right: auto;\n    left: 25%;\n  }\n  .ant-col-xl-offset-6.ant-col-rtl {\n    margin-right: 25%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-7.ant-col-rtl {\n    right: 29.16666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-7.ant-col-rtl {\n    right: auto;\n    left: 29.16666667%;\n  }\n  .ant-col-xl-offset-7.ant-col-rtl {\n    margin-right: 29.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-8.ant-col-rtl {\n    right: 33.33333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-8.ant-col-rtl {\n    right: auto;\n    left: 33.33333333%;\n  }\n  .ant-col-xl-offset-8.ant-col-rtl {\n    margin-right: 33.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-9.ant-col-rtl {\n    right: 37.5%;\n    left: auto;\n  }\n  .ant-col-xl-pull-9.ant-col-rtl {\n    right: auto;\n    left: 37.5%;\n  }\n  .ant-col-xl-offset-9.ant-col-rtl {\n    margin-right: 37.5%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-10.ant-col-rtl {\n    right: 41.66666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-10.ant-col-rtl {\n    right: auto;\n    left: 41.66666667%;\n  }\n  .ant-col-xl-offset-10.ant-col-rtl {\n    margin-right: 41.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-11.ant-col-rtl {\n    right: 45.83333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-11.ant-col-rtl {\n    right: auto;\n    left: 45.83333333%;\n  }\n  .ant-col-xl-offset-11.ant-col-rtl {\n    margin-right: 45.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-12.ant-col-rtl {\n    right: 50%;\n    left: auto;\n  }\n  .ant-col-xl-pull-12.ant-col-rtl {\n    right: auto;\n    left: 50%;\n  }\n  .ant-col-xl-offset-12.ant-col-rtl {\n    margin-right: 50%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-13.ant-col-rtl {\n    right: 54.16666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-13.ant-col-rtl {\n    right: auto;\n    left: 54.16666667%;\n  }\n  .ant-col-xl-offset-13.ant-col-rtl {\n    margin-right: 54.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-14.ant-col-rtl {\n    right: 58.33333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-14.ant-col-rtl {\n    right: auto;\n    left: 58.33333333%;\n  }\n  .ant-col-xl-offset-14.ant-col-rtl {\n    margin-right: 58.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-15.ant-col-rtl {\n    right: 62.5%;\n    left: auto;\n  }\n  .ant-col-xl-pull-15.ant-col-rtl {\n    right: auto;\n    left: 62.5%;\n  }\n  .ant-col-xl-offset-15.ant-col-rtl {\n    margin-right: 62.5%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-16.ant-col-rtl {\n    right: 66.66666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-16.ant-col-rtl {\n    right: auto;\n    left: 66.66666667%;\n  }\n  .ant-col-xl-offset-16.ant-col-rtl {\n    margin-right: 66.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-17.ant-col-rtl {\n    right: 70.83333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-17.ant-col-rtl {\n    right: auto;\n    left: 70.83333333%;\n  }\n  .ant-col-xl-offset-17.ant-col-rtl {\n    margin-right: 70.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-18.ant-col-rtl {\n    right: 75%;\n    left: auto;\n  }\n  .ant-col-xl-pull-18.ant-col-rtl {\n    right: auto;\n    left: 75%;\n  }\n  .ant-col-xl-offset-18.ant-col-rtl {\n    margin-right: 75%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-19.ant-col-rtl {\n    right: 79.16666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-19.ant-col-rtl {\n    right: auto;\n    left: 79.16666667%;\n  }\n  .ant-col-xl-offset-19.ant-col-rtl {\n    margin-right: 79.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-20.ant-col-rtl {\n    right: 83.33333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-20.ant-col-rtl {\n    right: auto;\n    left: 83.33333333%;\n  }\n  .ant-col-xl-offset-20.ant-col-rtl {\n    margin-right: 83.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-21.ant-col-rtl {\n    right: 87.5%;\n    left: auto;\n  }\n  .ant-col-xl-pull-21.ant-col-rtl {\n    right: auto;\n    left: 87.5%;\n  }\n  .ant-col-xl-offset-21.ant-col-rtl {\n    margin-right: 87.5%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-22.ant-col-rtl {\n    right: 91.66666667%;\n    left: auto;\n  }\n  .ant-col-xl-pull-22.ant-col-rtl {\n    right: auto;\n    left: 91.66666667%;\n  }\n  .ant-col-xl-offset-22.ant-col-rtl {\n    margin-right: 91.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-23.ant-col-rtl {\n    right: 95.83333333%;\n    left: auto;\n  }\n  .ant-col-xl-pull-23.ant-col-rtl {\n    right: auto;\n    left: 95.83333333%;\n  }\n  .ant-col-xl-offset-23.ant-col-rtl {\n    margin-right: 95.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xl-push-24.ant-col-rtl {\n    right: 100%;\n    left: auto;\n  }\n  .ant-col-xl-pull-24.ant-col-rtl {\n    right: auto;\n    left: 100%;\n  }\n  .ant-col-xl-offset-24.ant-col-rtl {\n    margin-right: 100%;\n    margin-left: 0;\n  }\n}\n@media (min-width: 1600px) {\n  .ant-col-xxl-24 {\n    display: block;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .ant-col-xxl-push-24 {\n    left: 100%;\n  }\n  .ant-col-xxl-pull-24 {\n    right: 100%;\n  }\n  .ant-col-xxl-offset-24 {\n    margin-left: 100%;\n  }\n  .ant-col-xxl-order-24 {\n    order: 24;\n  }\n  .ant-col-xxl-23 {\n    display: block;\n    flex: 0 0 95.83333333%;\n    max-width: 95.83333333%;\n  }\n  .ant-col-xxl-push-23 {\n    left: 95.83333333%;\n  }\n  .ant-col-xxl-pull-23 {\n    right: 95.83333333%;\n  }\n  .ant-col-xxl-offset-23 {\n    margin-left: 95.83333333%;\n  }\n  .ant-col-xxl-order-23 {\n    order: 23;\n  }\n  .ant-col-xxl-22 {\n    display: block;\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .ant-col-xxl-push-22 {\n    left: 91.66666667%;\n  }\n  .ant-col-xxl-pull-22 {\n    right: 91.66666667%;\n  }\n  .ant-col-xxl-offset-22 {\n    margin-left: 91.66666667%;\n  }\n  .ant-col-xxl-order-22 {\n    order: 22;\n  }\n  .ant-col-xxl-21 {\n    display: block;\n    flex: 0 0 87.5%;\n    max-width: 87.5%;\n  }\n  .ant-col-xxl-push-21 {\n    left: 87.5%;\n  }\n  .ant-col-xxl-pull-21 {\n    right: 87.5%;\n  }\n  .ant-col-xxl-offset-21 {\n    margin-left: 87.5%;\n  }\n  .ant-col-xxl-order-21 {\n    order: 21;\n  }\n  .ant-col-xxl-20 {\n    display: block;\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .ant-col-xxl-push-20 {\n    left: 83.33333333%;\n  }\n  .ant-col-xxl-pull-20 {\n    right: 83.33333333%;\n  }\n  .ant-col-xxl-offset-20 {\n    margin-left: 83.33333333%;\n  }\n  .ant-col-xxl-order-20 {\n    order: 20;\n  }\n  .ant-col-xxl-19 {\n    display: block;\n    flex: 0 0 79.16666667%;\n    max-width: 79.16666667%;\n  }\n  .ant-col-xxl-push-19 {\n    left: 79.16666667%;\n  }\n  .ant-col-xxl-pull-19 {\n    right: 79.16666667%;\n  }\n  .ant-col-xxl-offset-19 {\n    margin-left: 79.16666667%;\n  }\n  .ant-col-xxl-order-19 {\n    order: 19;\n  }\n  .ant-col-xxl-18 {\n    display: block;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .ant-col-xxl-push-18 {\n    left: 75%;\n  }\n  .ant-col-xxl-pull-18 {\n    right: 75%;\n  }\n  .ant-col-xxl-offset-18 {\n    margin-left: 75%;\n  }\n  .ant-col-xxl-order-18 {\n    order: 18;\n  }\n  .ant-col-xxl-17 {\n    display: block;\n    flex: 0 0 70.83333333%;\n    max-width: 70.83333333%;\n  }\n  .ant-col-xxl-push-17 {\n    left: 70.83333333%;\n  }\n  .ant-col-xxl-pull-17 {\n    right: 70.83333333%;\n  }\n  .ant-col-xxl-offset-17 {\n    margin-left: 70.83333333%;\n  }\n  .ant-col-xxl-order-17 {\n    order: 17;\n  }\n  .ant-col-xxl-16 {\n    display: block;\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .ant-col-xxl-push-16 {\n    left: 66.66666667%;\n  }\n  .ant-col-xxl-pull-16 {\n    right: 66.66666667%;\n  }\n  .ant-col-xxl-offset-16 {\n    margin-left: 66.66666667%;\n  }\n  .ant-col-xxl-order-16 {\n    order: 16;\n  }\n  .ant-col-xxl-15 {\n    display: block;\n    flex: 0 0 62.5%;\n    max-width: 62.5%;\n  }\n  .ant-col-xxl-push-15 {\n    left: 62.5%;\n  }\n  .ant-col-xxl-pull-15 {\n    right: 62.5%;\n  }\n  .ant-col-xxl-offset-15 {\n    margin-left: 62.5%;\n  }\n  .ant-col-xxl-order-15 {\n    order: 15;\n  }\n  .ant-col-xxl-14 {\n    display: block;\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .ant-col-xxl-push-14 {\n    left: 58.33333333%;\n  }\n  .ant-col-xxl-pull-14 {\n    right: 58.33333333%;\n  }\n  .ant-col-xxl-offset-14 {\n    margin-left: 58.33333333%;\n  }\n  .ant-col-xxl-order-14 {\n    order: 14;\n  }\n  .ant-col-xxl-13 {\n    display: block;\n    flex: 0 0 54.16666667%;\n    max-width: 54.16666667%;\n  }\n  .ant-col-xxl-push-13 {\n    left: 54.16666667%;\n  }\n  .ant-col-xxl-pull-13 {\n    right: 54.16666667%;\n  }\n  .ant-col-xxl-offset-13 {\n    margin-left: 54.16666667%;\n  }\n  .ant-col-xxl-order-13 {\n    order: 13;\n  }\n  .ant-col-xxl-12 {\n    display: block;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .ant-col-xxl-push-12 {\n    left: 50%;\n  }\n  .ant-col-xxl-pull-12 {\n    right: 50%;\n  }\n  .ant-col-xxl-offset-12 {\n    margin-left: 50%;\n  }\n  .ant-col-xxl-order-12 {\n    order: 12;\n  }\n  .ant-col-xxl-11 {\n    display: block;\n    flex: 0 0 45.83333333%;\n    max-width: 45.83333333%;\n  }\n  .ant-col-xxl-push-11 {\n    left: 45.83333333%;\n  }\n  .ant-col-xxl-pull-11 {\n    right: 45.83333333%;\n  }\n  .ant-col-xxl-offset-11 {\n    margin-left: 45.83333333%;\n  }\n  .ant-col-xxl-order-11 {\n    order: 11;\n  }\n  .ant-col-xxl-10 {\n    display: block;\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .ant-col-xxl-push-10 {\n    left: 41.66666667%;\n  }\n  .ant-col-xxl-pull-10 {\n    right: 41.66666667%;\n  }\n  .ant-col-xxl-offset-10 {\n    margin-left: 41.66666667%;\n  }\n  .ant-col-xxl-order-10 {\n    order: 10;\n  }\n  .ant-col-xxl-9 {\n    display: block;\n    flex: 0 0 37.5%;\n    max-width: 37.5%;\n  }\n  .ant-col-xxl-push-9 {\n    left: 37.5%;\n  }\n  .ant-col-xxl-pull-9 {\n    right: 37.5%;\n  }\n  .ant-col-xxl-offset-9 {\n    margin-left: 37.5%;\n  }\n  .ant-col-xxl-order-9 {\n    order: 9;\n  }\n  .ant-col-xxl-8 {\n    display: block;\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .ant-col-xxl-push-8 {\n    left: 33.33333333%;\n  }\n  .ant-col-xxl-pull-8 {\n    right: 33.33333333%;\n  }\n  .ant-col-xxl-offset-8 {\n    margin-left: 33.33333333%;\n  }\n  .ant-col-xxl-order-8 {\n    order: 8;\n  }\n  .ant-col-xxl-7 {\n    display: block;\n    flex: 0 0 29.16666667%;\n    max-width: 29.16666667%;\n  }\n  .ant-col-xxl-push-7 {\n    left: 29.16666667%;\n  }\n  .ant-col-xxl-pull-7 {\n    right: 29.16666667%;\n  }\n  .ant-col-xxl-offset-7 {\n    margin-left: 29.16666667%;\n  }\n  .ant-col-xxl-order-7 {\n    order: 7;\n  }\n  .ant-col-xxl-6 {\n    display: block;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .ant-col-xxl-push-6 {\n    left: 25%;\n  }\n  .ant-col-xxl-pull-6 {\n    right: 25%;\n  }\n  .ant-col-xxl-offset-6 {\n    margin-left: 25%;\n  }\n  .ant-col-xxl-order-6 {\n    order: 6;\n  }\n  .ant-col-xxl-5 {\n    display: block;\n    flex: 0 0 20.83333333%;\n    max-width: 20.83333333%;\n  }\n  .ant-col-xxl-push-5 {\n    left: 20.83333333%;\n  }\n  .ant-col-xxl-pull-5 {\n    right: 20.83333333%;\n  }\n  .ant-col-xxl-offset-5 {\n    margin-left: 20.83333333%;\n  }\n  .ant-col-xxl-order-5 {\n    order: 5;\n  }\n  .ant-col-xxl-4 {\n    display: block;\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .ant-col-xxl-push-4 {\n    left: 16.66666667%;\n  }\n  .ant-col-xxl-pull-4 {\n    right: 16.66666667%;\n  }\n  .ant-col-xxl-offset-4 {\n    margin-left: 16.66666667%;\n  }\n  .ant-col-xxl-order-4 {\n    order: 4;\n  }\n  .ant-col-xxl-3 {\n    display: block;\n    flex: 0 0 12.5%;\n    max-width: 12.5%;\n  }\n  .ant-col-xxl-push-3 {\n    left: 12.5%;\n  }\n  .ant-col-xxl-pull-3 {\n    right: 12.5%;\n  }\n  .ant-col-xxl-offset-3 {\n    margin-left: 12.5%;\n  }\n  .ant-col-xxl-order-3 {\n    order: 3;\n  }\n  .ant-col-xxl-2 {\n    display: block;\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .ant-col-xxl-push-2 {\n    left: 8.33333333%;\n  }\n  .ant-col-xxl-pull-2 {\n    right: 8.33333333%;\n  }\n  .ant-col-xxl-offset-2 {\n    margin-left: 8.33333333%;\n  }\n  .ant-col-xxl-order-2 {\n    order: 2;\n  }\n  .ant-col-xxl-1 {\n    display: block;\n    flex: 0 0 4.16666667%;\n    max-width: 4.16666667%;\n  }\n  .ant-col-xxl-push-1 {\n    left: 4.16666667%;\n  }\n  .ant-col-xxl-pull-1 {\n    right: 4.16666667%;\n  }\n  .ant-col-xxl-offset-1 {\n    margin-left: 4.16666667%;\n  }\n  .ant-col-xxl-order-1 {\n    order: 1;\n  }\n  .ant-col-xxl-0 {\n    display: none;\n  }\n  .ant-col-push-0 {\n    left: auto;\n  }\n  .ant-col-pull-0 {\n    right: auto;\n  }\n  .ant-col-xxl-push-0 {\n    left: auto;\n  }\n  .ant-col-xxl-pull-0 {\n    right: auto;\n  }\n  .ant-col-xxl-offset-0 {\n    margin-left: 0;\n  }\n  .ant-col-xxl-order-0 {\n    order: 0;\n  }\n  .ant-col-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-xxl-push-0.ant-col-rtl {\n    right: auto;\n  }\n  .ant-col-xxl-pull-0.ant-col-rtl {\n    left: auto;\n  }\n  .ant-col-xxl-offset-0.ant-col-rtl {\n    margin-right: 0;\n  }\n  .ant-col-xxl-push-1.ant-col-rtl {\n    right: 4.16666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-1.ant-col-rtl {\n    right: auto;\n    left: 4.16666667%;\n  }\n  .ant-col-xxl-offset-1.ant-col-rtl {\n    margin-right: 4.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-2.ant-col-rtl {\n    right: 8.33333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-2.ant-col-rtl {\n    right: auto;\n    left: 8.33333333%;\n  }\n  .ant-col-xxl-offset-2.ant-col-rtl {\n    margin-right: 8.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-3.ant-col-rtl {\n    right: 12.5%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-3.ant-col-rtl {\n    right: auto;\n    left: 12.5%;\n  }\n  .ant-col-xxl-offset-3.ant-col-rtl {\n    margin-right: 12.5%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-4.ant-col-rtl {\n    right: 16.66666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-4.ant-col-rtl {\n    right: auto;\n    left: 16.66666667%;\n  }\n  .ant-col-xxl-offset-4.ant-col-rtl {\n    margin-right: 16.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-5.ant-col-rtl {\n    right: 20.83333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-5.ant-col-rtl {\n    right: auto;\n    left: 20.83333333%;\n  }\n  .ant-col-xxl-offset-5.ant-col-rtl {\n    margin-right: 20.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-6.ant-col-rtl {\n    right: 25%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-6.ant-col-rtl {\n    right: auto;\n    left: 25%;\n  }\n  .ant-col-xxl-offset-6.ant-col-rtl {\n    margin-right: 25%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-7.ant-col-rtl {\n    right: 29.16666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-7.ant-col-rtl {\n    right: auto;\n    left: 29.16666667%;\n  }\n  .ant-col-xxl-offset-7.ant-col-rtl {\n    margin-right: 29.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-8.ant-col-rtl {\n    right: 33.33333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-8.ant-col-rtl {\n    right: auto;\n    left: 33.33333333%;\n  }\n  .ant-col-xxl-offset-8.ant-col-rtl {\n    margin-right: 33.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-9.ant-col-rtl {\n    right: 37.5%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-9.ant-col-rtl {\n    right: auto;\n    left: 37.5%;\n  }\n  .ant-col-xxl-offset-9.ant-col-rtl {\n    margin-right: 37.5%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-10.ant-col-rtl {\n    right: 41.66666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-10.ant-col-rtl {\n    right: auto;\n    left: 41.66666667%;\n  }\n  .ant-col-xxl-offset-10.ant-col-rtl {\n    margin-right: 41.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-11.ant-col-rtl {\n    right: 45.83333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-11.ant-col-rtl {\n    right: auto;\n    left: 45.83333333%;\n  }\n  .ant-col-xxl-offset-11.ant-col-rtl {\n    margin-right: 45.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-12.ant-col-rtl {\n    right: 50%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-12.ant-col-rtl {\n    right: auto;\n    left: 50%;\n  }\n  .ant-col-xxl-offset-12.ant-col-rtl {\n    margin-right: 50%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-13.ant-col-rtl {\n    right: 54.16666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-13.ant-col-rtl {\n    right: auto;\n    left: 54.16666667%;\n  }\n  .ant-col-xxl-offset-13.ant-col-rtl {\n    margin-right: 54.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-14.ant-col-rtl {\n    right: 58.33333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-14.ant-col-rtl {\n    right: auto;\n    left: 58.33333333%;\n  }\n  .ant-col-xxl-offset-14.ant-col-rtl {\n    margin-right: 58.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-15.ant-col-rtl {\n    right: 62.5%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-15.ant-col-rtl {\n    right: auto;\n    left: 62.5%;\n  }\n  .ant-col-xxl-offset-15.ant-col-rtl {\n    margin-right: 62.5%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-16.ant-col-rtl {\n    right: 66.66666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-16.ant-col-rtl {\n    right: auto;\n    left: 66.66666667%;\n  }\n  .ant-col-xxl-offset-16.ant-col-rtl {\n    margin-right: 66.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-17.ant-col-rtl {\n    right: 70.83333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-17.ant-col-rtl {\n    right: auto;\n    left: 70.83333333%;\n  }\n  .ant-col-xxl-offset-17.ant-col-rtl {\n    margin-right: 70.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-18.ant-col-rtl {\n    right: 75%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-18.ant-col-rtl {\n    right: auto;\n    left: 75%;\n  }\n  .ant-col-xxl-offset-18.ant-col-rtl {\n    margin-right: 75%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-19.ant-col-rtl {\n    right: 79.16666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-19.ant-col-rtl {\n    right: auto;\n    left: 79.16666667%;\n  }\n  .ant-col-xxl-offset-19.ant-col-rtl {\n    margin-right: 79.16666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-20.ant-col-rtl {\n    right: 83.33333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-20.ant-col-rtl {\n    right: auto;\n    left: 83.33333333%;\n  }\n  .ant-col-xxl-offset-20.ant-col-rtl {\n    margin-right: 83.33333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-21.ant-col-rtl {\n    right: 87.5%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-21.ant-col-rtl {\n    right: auto;\n    left: 87.5%;\n  }\n  .ant-col-xxl-offset-21.ant-col-rtl {\n    margin-right: 87.5%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-22.ant-col-rtl {\n    right: 91.66666667%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-22.ant-col-rtl {\n    right: auto;\n    left: 91.66666667%;\n  }\n  .ant-col-xxl-offset-22.ant-col-rtl {\n    margin-right: 91.66666667%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-23.ant-col-rtl {\n    right: 95.83333333%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-23.ant-col-rtl {\n    right: auto;\n    left: 95.83333333%;\n  }\n  .ant-col-xxl-offset-23.ant-col-rtl {\n    margin-right: 95.83333333%;\n    margin-left: 0;\n  }\n  .ant-col-xxl-push-24.ant-col-rtl {\n    right: 100%;\n    left: auto;\n  }\n  .ant-col-xxl-pull-24.ant-col-rtl {\n    right: auto;\n    left: 100%;\n  }\n  .ant-col-xxl-offset-24.ant-col-rtl {\n    margin-right: 100%;\n    margin-left: 0;\n  }\n}\n.ant-row-rtl {\n  direction: rtl;\n}\n.ant-image {\n  position: relative;\n  display: inline-block;\n}\n.ant-image-img {\n  width: 100%;\n  height: auto;\n  vertical-align: middle;\n}\n.ant-image-img-placeholder {\n  background-color: #f5f5f5;\n  background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=');\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: 30%;\n}\n.ant-image-mask {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #fff;\n  background: rgba(0, 0, 0, 0.5);\n  cursor: pointer;\n  opacity: 0;\n  transition: opacity 0.3s;\n}\n.ant-image-mask-info {\n  padding: 0 4px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-image-mask-info .anticon {\n  margin-inline-end: 4px;\n}\n.ant-image-mask:hover {\n  opacity: 1;\n}\n.ant-image-placeholder {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n}\n.ant-image-preview {\n  pointer-events: none;\n  height: 100%;\n  text-align: center;\n}\n.ant-image-preview.ant-zoom-enter,\n.ant-image-preview.ant-zoom-appear {\n  transform: none;\n  opacity: 0;\n  animation-duration: 0.3s;\n  user-select: none;\n}\n.ant-image-preview-mask {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1000;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-image-preview-mask-hidden {\n  display: none;\n}\n.ant-image-preview-wrap {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  outline: 0;\n}\n.ant-image-preview-body {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  overflow: hidden;\n}\n.ant-image-preview-img {\n  max-width: 100%;\n  max-height: 100%;\n  vertical-align: middle;\n  transform: scale3d(1, 1, 1);\n  cursor: grab;\n  transition: transform 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;\n  user-select: none;\n  pointer-events: auto;\n}\n.ant-image-preview-img-wrapper {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  transition: transform 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;\n}\n.ant-image-preview-img-wrapper::before {\n  display: inline-block;\n  width: 1px;\n  height: 50%;\n  margin-right: -1px;\n  content: '';\n}\n.ant-image-preview-moving .ant-image-preview-img {\n  cursor: grabbing;\n}\n.ant-image-preview-moving .ant-image-preview-img-wrapper {\n  transition-duration: 0s;\n}\n.ant-image-preview-wrap {\n  z-index: 1080;\n}\n.ant-image-preview-operations-wrapper {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 1081;\n  width: 100%;\n}\n.ant-image-preview-operations {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  font-feature-settings: 'tnum';\n  display: flex;\n  flex-direction: row-reverse;\n  align-items: center;\n  color: rgba(255, 255, 255, 0.85);\n  list-style: none;\n  background: rgba(0, 0, 0, 0.1);\n  pointer-events: auto;\n}\n.ant-image-preview-operations-operation {\n  margin-left: 12px;\n  padding: 12px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-image-preview-operations-operation:hover {\n  background: rgba(0, 0, 0, 0.2);\n}\n.ant-image-preview-operations-operation-disabled {\n  color: rgba(255, 255, 255, 0.25);\n  pointer-events: none;\n}\n.ant-image-preview-operations-operation:last-of-type {\n  margin-left: 0;\n}\n.ant-image-preview-operations-progress {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n.ant-image-preview-operations-icon {\n  font-size: 18px;\n}\n.ant-image-preview-switch-left,\n.ant-image-preview-switch-right {\n  position: fixed;\n  top: 50%;\n  right: 8px;\n  z-index: 1081;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 44px;\n  height: 44px;\n  color: rgba(255, 255, 255, 0.85);\n  background: rgba(0, 0, 0, 0.1);\n  border-radius: 50%;\n  transform: translateY(-50%);\n  cursor: pointer;\n  transition: all 0.3s;\n  pointer-events: auto;\n}\n.ant-image-preview-switch-left:hover,\n.ant-image-preview-switch-right:hover {\n  background: rgba(0, 0, 0, 0.2);\n}\n.ant-image-preview-switch-left-disabled,\n.ant-image-preview-switch-right-disabled,\n.ant-image-preview-switch-left-disabled:hover,\n.ant-image-preview-switch-right-disabled:hover {\n  color: rgba(255, 255, 255, 0.25);\n  background: rgba(0, 0, 0, 0.1);\n  cursor: not-allowed;\n}\n.ant-image-preview-switch-left-disabled > .anticon,\n.ant-image-preview-switch-right-disabled > .anticon,\n.ant-image-preview-switch-left-disabled:hover > .anticon,\n.ant-image-preview-switch-right-disabled:hover > .anticon {\n  cursor: not-allowed;\n}\n.ant-image-preview-switch-left > .anticon,\n.ant-image-preview-switch-right > .anticon {\n  font-size: 18px;\n}\n.ant-image-preview-switch-left {\n  left: 8px;\n}\n.ant-image-preview-switch-right {\n  right: 8px;\n}\n.ant-input-affix-wrapper {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n  display: inline-flex;\n}\n.ant-input-affix-wrapper::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-input-affix-wrapper:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-input-affix-wrapper:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-input-affix-wrapper:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-input-affix-wrapper:focus,\n.ant-input-rtl .ant-input-affix-wrapper-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-affix-wrapper-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-affix-wrapper-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-affix-wrapper[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-affix-wrapper[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-affix-wrapper-borderless,\n.ant-input-affix-wrapper-borderless:hover,\n.ant-input-affix-wrapper-borderless:focus,\n.ant-input-affix-wrapper-borderless-focused,\n.ant-input-affix-wrapper-borderless-disabled,\n.ant-input-affix-wrapper-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-input-affix-wrapper {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-input-affix-wrapper-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-affix-wrapper-sm {\n  padding: 0px 7px;\n}\n.ant-input-affix-wrapper-rtl {\n  direction: rtl;\n}\n.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n  border-color: #165996;\n  border-right-width: 1px;\n  z-index: 1;\n}\n.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover {\n  z-index: 0;\n}\n.ant-input-affix-wrapper-focused,\n.ant-input-affix-wrapper:focus {\n  z-index: 1;\n}\n.ant-input-affix-wrapper-disabled .ant-input[disabled] {\n  background: rgba(255, 255, 255, 0);\n}\n.ant-input-affix-wrapper > .ant-input {\n  font-size: inherit;\n  border: none;\n  outline: none;\n}\n.ant-input-affix-wrapper > .ant-input:focus {\n  box-shadow: none !important;\n}\n.ant-input-affix-wrapper > .ant-input:not(textarea) {\n  padding: 0;\n}\n.ant-input-affix-wrapper::before {\n  display: inline-block;\n  width: 0;\n  visibility: hidden;\n  content: '\\a0';\n}\n.ant-input-prefix,\n.ant-input-suffix {\n  display: flex;\n  flex: none;\n  align-items: center;\n}\n.ant-input-prefix > *:not(:last-child),\n.ant-input-suffix > *:not(:last-child) {\n  margin-right: 8px;\n}\n.ant-input-show-count-suffix {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-input-show-count-has-suffix {\n  margin-right: 2px;\n}\n.ant-input-prefix {\n  margin-right: 4px;\n}\n.ant-input-suffix {\n  margin-left: 4px;\n}\n.anticon.ant-input-clear-icon,\n.ant-input-clear-icon {\n  margin: 0;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 12px;\n  vertical-align: -1px;\n  cursor: pointer;\n  transition: color 0.3s;\n}\n.anticon.ant-input-clear-icon:hover,\n.ant-input-clear-icon:hover {\n  color: rgba(255, 255, 255, 0.45);\n}\n.anticon.ant-input-clear-icon:active,\n.ant-input-clear-icon:active {\n  color: rgba(255, 255, 255, 0.85);\n}\n.anticon.ant-input-clear-icon-hidden,\n.ant-input-clear-icon-hidden {\n  visibility: hidden;\n}\n.anticon.ant-input-clear-icon-has-suffix,\n.ant-input-clear-icon-has-suffix {\n  margin: 0 4px;\n}\n.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn {\n  padding: 0;\n}\n.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon {\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  z-index: 1;\n}\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover {\n  background: transparent;\n  border-color: #a61d24;\n}\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,\n.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-status-error .ant-input-prefix {\n  color: #a61d24;\n}\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover {\n  background: transparent;\n  border-color: #d89614;\n}\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,\n.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-status-warning .ant-input-prefix {\n  color: #d89614;\n}\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover {\n  background: transparent;\n  border-color: #a61d24;\n}\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-affix-wrapper-status-error .ant-input-prefix {\n  color: #a61d24;\n}\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover {\n  background: transparent;\n  border-color: #d89614;\n}\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,\n.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-affix-wrapper-status-warning .ant-input-prefix {\n  color: #d89614;\n}\n.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,\n.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input {\n  padding-right: 24px;\n}\n.ant-input-group-wrapper-status-error .ant-input-group-addon {\n  color: #a61d24;\n  border-color: #a61d24;\n}\n.ant-input-group-wrapper-status-warning .ant-input-group-addon {\n  color: #d89614;\n  border-color: #d89614;\n}\n.ant-input {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  font-variant: tabular-nums;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n}\n.ant-input::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-input:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-input:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-input:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input:focus,\n.ant-input-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-input:focus,\n.ant-input-rtl .ant-input-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-borderless,\n.ant-input-borderless:hover,\n.ant-input-borderless:focus,\n.ant-input-borderless-focused,\n.ant-input-borderless-disabled,\n.ant-input-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-input {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-input-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-sm {\n  padding: 0px 7px;\n}\n.ant-input-rtl {\n  direction: rtl;\n}\n.ant-input-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  border-spacing: 0;\n}\n.ant-input-group[class*='col-'] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.ant-input-group > [class*='col-'] {\n  padding-right: 8px;\n}\n.ant-input-group > [class*='col-']:last-child {\n  padding-right: 0;\n}\n.ant-input-group-addon,\n.ant-input-group-wrap,\n.ant-input-group > .ant-input {\n  display: table-cell;\n}\n.ant-input-group-addon:not(:first-child):not(:last-child),\n.ant-input-group-wrap:not(:first-child):not(:last-child),\n.ant-input-group > .ant-input:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.ant-input-group-addon,\n.ant-input-group-wrap {\n  width: 1px;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.ant-input-group-wrap > * {\n  display: block !important;\n}\n.ant-input-group .ant-input {\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n  text-align: inherit;\n}\n.ant-input-group .ant-input:focus {\n  z-index: 1;\n  border-right-width: 1px;\n}\n.ant-input-group .ant-input:hover {\n  z-index: 1;\n  border-right-width: 1px;\n}\n.ant-input-search-with-button .ant-input-group .ant-input:hover {\n  z-index: 0;\n}\n.ant-input-group-addon {\n  position: relative;\n  padding: 0 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  text-align: center;\n  background-color: rgba(255, 255, 255, 0.04);\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n}\n.ant-input-group-addon .ant-select {\n  margin: -5px -11px;\n}\n.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n  background-color: inherit;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n.ant-input-group-addon .ant-select-open .ant-select-selector,\n.ant-input-group-addon .ant-select-focused .ant-select-selector {\n  color: #177ddc;\n}\n.ant-input-group-addon .ant-cascader-picker {\n  margin: -9px -12px;\n  background-color: transparent;\n}\n.ant-input-group-addon .ant-cascader-picker .ant-cascader-input {\n  text-align: left;\n  border: 0;\n  box-shadow: none;\n}\n.ant-input-group > .ant-input:first-child,\n.ant-input-group-addon:first-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-group > .ant-input:first-child .ant-select .ant-select-selector,\n.ant-input-group-addon:first-child .ant-select .ant-select-selector {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-group-addon:first-child {\n  border-right: 0;\n}\n.ant-input-group-addon:last-child {\n  border-left: 0;\n}\n.ant-input-group > .ant-input:last-child,\n.ant-input-group-addon:last-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-group > .ant-input:last-child .ant-select .ant-select-selector,\n.ant-input-group-addon:last-child .ant-select .ant-select-selector {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-group-lg .ant-input,\n.ant-input-group-lg > .ant-input-group-addon {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-group-sm .ant-input,\n.ant-input-group-sm > .ant-input-group-addon {\n  padding: 0px 7px;\n}\n.ant-input-group-lg .ant-select-single .ant-select-selector {\n  height: 40px;\n}\n.ant-input-group-sm .ant-select-single .ant-select-selector {\n  height: 24px;\n}\n.ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-input-group .ant-input-affix-wrapper:not(:first-child),\n.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-group.ant-input-group-compact {\n  display: block;\n}\n.ant-input-group.ant-input-group-compact::before {\n  display: table;\n  content: '';\n}\n.ant-input-group.ant-input-group-compact::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-input-group.ant-input-group-compact::before {\n  display: table;\n  content: '';\n}\n.ant-input-group.ant-input-group-compact::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) {\n  border-right-width: 1px;\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,\n.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,\n.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > * {\n  display: inline-block;\n  float: none;\n  vertical-align: top;\n  border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact > .ant-input-affix-wrapper,\n.ant-input-group.ant-input-group-compact > .ant-input-number-affix-wrapper,\n.ant-input-group.ant-input-group-compact > .ant-picker-range {\n  display: inline-flex;\n}\n.ant-input-group.ant-input-group-compact > *:not(:last-child) {\n  margin-right: -1px;\n  border-right-width: 1px;\n}\n.ant-input-group.ant-input-group-compact .ant-input {\n  float: none;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input {\n  border-right-width: 1px;\n  border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:hover,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:hover {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:focus,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus,\n.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:focus {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select-focused {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-arrow {\n  z-index: 1;\n}\n.ant-input-group.ant-input-group-compact > *:first-child,\n.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-input-group.ant-input-group-compact > *:last-child,\n.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n  border-right-width: 1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input {\n  vertical-align: top;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper {\n  margin-left: -1px;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper .ant-input-affix-wrapper {\n  border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input-group-addon > .ant-input-search-button {\n  border-radius: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group > .ant-input-rtl:first-child,\n.ant-input-group-rtl .ant-input-group-addon:first-child {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl .ant-input-group-addon:first-child {\n  border-right: 1px solid #434343;\n  border-left: 0;\n}\n.ant-input-group-rtl .ant-input-group-addon:last-child {\n  border-right: 0;\n  border-left: 1px solid #434343;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group > .ant-input:last-child,\n.ant-input-group-rtl.ant-input-group-addon:last-child {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child) {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child) {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:not(:last-child) {\n  margin-right: 0;\n  margin-left: -1px;\n  border-left-width: 1px;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:first-child,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:last-child,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n  border-left-width: 1px;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl + .ant-input-group-wrapper-rtl {\n  margin-right: -1px;\n  margin-left: 0;\n}\n.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group > .ant-input-rtl:first-child {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group > .ant-input-rtl:last-child {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group-rtl .ant-input-group-addon:first-child {\n  border-right: 1px solid #434343;\n  border-left: 0;\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-group-rtl .ant-input-group-addon:last-child {\n  border-right: 0;\n  border-left: 1px solid #434343;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-group-wrapper {\n  display: inline-block;\n  width: 100%;\n  text-align: start;\n  vertical-align: top;\n}\n.ant-input-password-icon.anticon {\n  color: rgba(255, 255, 255, 0.45);\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-input-password-icon.anticon:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-input[type='color'] {\n  height: 32px;\n}\n.ant-input[type='color'].ant-input-lg {\n  height: 40px;\n}\n.ant-input[type='color'].ant-input-sm {\n  height: 24px;\n  padding-top: 3px;\n  padding-bottom: 3px;\n}\n.ant-input-textarea-show-count > .ant-input {\n  height: 100%;\n}\n.ant-input-textarea-show-count::after {\n  float: right;\n  color: rgba(255, 255, 255, 0.45);\n  white-space: nowrap;\n  content: attr(data-count);\n  pointer-events: none;\n}\n.ant-input-textarea-show-count.ant-input-textarea-in-form-item::after {\n  margin-bottom: -22px;\n}\n.ant-input-textarea-suffix {\n  position: absolute;\n  top: 0;\n  right: 11px;\n  bottom: 0;\n  z-index: 1;\n  display: inline-flex;\n  align-items: center;\n  margin: auto;\n}\n.ant-input-compact-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl) {\n  margin-right: -1px;\n}\n.ant-input-compact-item:not(.ant-input-compact-last-item).ant-input-compact-item-rtl {\n  margin-left: -1px;\n}\n.ant-input-compact-item:hover,\n.ant-input-compact-item:focus,\n.ant-input-compact-item:active {\n  z-index: 2;\n}\n.ant-input-compact-item[disabled] {\n  z-index: 0;\n}\n.ant-input-compact-item:not(.ant-input-compact-first-item):not(.ant-input-compact-last-item).ant-input {\n  border-radius: 0;\n}\n.ant-input-compact-item.ant-input.ant-input-compact-first-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-compact-item.ant-input.ant-input-compact-last-item:not(.ant-input-compact-first-item):not(.ant-input-compact-item-rtl) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-first-item:not(.ant-input-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-last-item:not(.ant-input-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-search .ant-input:hover,\n.ant-input-search .ant-input:focus {\n  border-color: #165996;\n}\n.ant-input-search .ant-input:hover + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),\n.ant-input-search .ant-input:focus + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary) {\n  border-left-color: #165996;\n}\n.ant-input-search .ant-input-affix-wrapper {\n  border-radius: 0;\n}\n.ant-input-search .ant-input-lg {\n  line-height: 1.5713;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child {\n  left: -1px;\n  padding: 0;\n  border: 0;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button {\n  padding-top: 0;\n  padding-bottom: 0;\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary) {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading::before {\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n}\n.ant-input-search-button {\n  height: 32px;\n}\n.ant-input-search-button:hover,\n.ant-input-search-button:focus {\n  z-index: 1;\n}\n.ant-input-search-large .ant-input-search-button {\n  height: 40px;\n}\n.ant-input-search-small .ant-input-search-button {\n  height: 24px;\n}\n.ant-input-search.ant-input-compact-item:not(.ant-input-compact-item-rtl):not(.ant-input-compact-last-item) .ant-input-group-addon .ant-input-search-button {\n  margin-right: -1px;\n  border-radius: 0;\n}\n.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input,\n.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input-affix-wrapper {\n  border-radius: 0;\n}\n.ant-input-search.ant-input-compact-item > .ant-input-group-addon .ant-input-search-button:hover,\n.ant-input-search.ant-input-compact-item > .ant-input:hover,\n.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:hover,\n.ant-input-search.ant-input-compact-item > .ant-input-group-addon .ant-input-search-button:focus,\n.ant-input-search.ant-input-compact-item > .ant-input:focus,\n.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:focus,\n.ant-input-search.ant-input-compact-item > .ant-input-group-addon .ant-input-search-button:active,\n.ant-input-search.ant-input-compact-item > .ant-input:active,\n.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:active {\n  z-index: 2;\n}\n.ant-input-search.ant-input-compact-item > .ant-input-affix-wrapper-focused {\n  z-index: 2;\n}\n.ant-input-search.ant-input-compact-item-rtl:not(.ant-input-compact-last-item) .ant-input-group-addon:last-child .ant-input-search-button {\n  margin-left: -1px;\n  border-radius: 0;\n}\n.ant-input-group-wrapper-rtl {\n  direction: rtl;\n}\n.ant-input-group-rtl {\n  direction: rtl;\n}\n.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl > input.ant-input {\n  border: none;\n  outline: none;\n}\n.ant-input-affix-wrapper-rtl .ant-input-prefix {\n  margin: 0 0 0 4px;\n}\n.ant-input-affix-wrapper-rtl .ant-input-suffix {\n  margin: 0 4px 0 0;\n}\n.ant-input-textarea-rtl {\n  direction: rtl;\n}\n.ant-input-textarea-rtl.ant-input-textarea-show-count::after {\n  text-align: left;\n}\n.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix {\n  margin-right: 0;\n  margin-left: 4px;\n}\n.ant-input-affix-wrapper-rtl .ant-input-clear-icon {\n  right: auto;\n  left: 8px;\n}\n.ant-input-search-rtl {\n  direction: rtl;\n}\n.ant-input-search-rtl .ant-input:hover + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),\n.ant-input-search-rtl .ant-input:focus + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary) {\n  border-left-color: #434343;\n}\n.ant-input-search-rtl .ant-input:hover + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover,\n.ant-input-search-rtl .ant-input:focus + .ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover {\n  border-left-color: #165996;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-affix-wrapper:hover,\n.ant-input-search-rtl > .ant-input-group > .ant-input-affix-wrapper-focused {\n  border-right-color: #165996;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-group-addon:last-child {\n  right: -1px;\n  left: auto;\n}\n.ant-input-search-rtl > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button {\n  border-radius: 2px 0 0 2px;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .ant-input {\n    height: 32px;\n  }\n  .ant-input-lg {\n    height: 40px;\n  }\n  .ant-input-sm {\n    height: 24px;\n  }\n  .ant-input-affix-wrapper > input.ant-input {\n    height: auto;\n  }\n}\n.ant-input-number-affix-wrapper {\n  display: inline-block;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n  position: relative;\n  display: inline-flex;\n  width: 90px;\n  padding: 0;\n  padding-inline-start: 11px;\n}\n.ant-input-number-affix-wrapper::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-input-number-affix-wrapper:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-input-number-affix-wrapper:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-input-number-affix-wrapper:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-input-number-affix-wrapper:focus,\n.ant-input-rtl .ant-input-number-affix-wrapper-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number-affix-wrapper-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-number-affix-wrapper-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-number-affix-wrapper[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-number-affix-wrapper[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-number-affix-wrapper-borderless,\n.ant-input-number-affix-wrapper-borderless:hover,\n.ant-input-number-affix-wrapper-borderless:focus,\n.ant-input-number-affix-wrapper-borderless-focused,\n.ant-input-number-affix-wrapper-borderless-disabled,\n.ant-input-number-affix-wrapper-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-input-number-affix-wrapper {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-input-number-affix-wrapper-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-number-affix-wrapper-sm {\n  padding: 0px 7px;\n}\n.ant-input-number-affix-wrapper-rtl {\n  direction: rtl;\n}\n.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover {\n  border-color: #165996;\n  border-right-width: 1px;\n  z-index: 1;\n}\n.ant-input-rtl .ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number-affix-wrapper-focused,\n.ant-input-number-affix-wrapper:focus {\n  z-index: 1;\n}\n.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled] {\n  background: transparent;\n}\n.ant-input-number-affix-wrapper > div.ant-input-number {\n  width: 100%;\n  border: none;\n  outline: none;\n}\n.ant-input-number-affix-wrapper > div.ant-input-number.ant-input-number-focused {\n  box-shadow: none !important;\n}\n.ant-input-number-affix-wrapper input.ant-input-number-input {\n  padding: 0;\n}\n.ant-input-number-affix-wrapper::before {\n  display: inline-block;\n  width: 0;\n  visibility: hidden;\n  content: '\\a0';\n}\n.ant-input-number-affix-wrapper .ant-input-number-handler-wrap {\n  z-index: 2;\n}\n.ant-input-number-prefix,\n.ant-input-number-suffix {\n  display: flex;\n  flex: none;\n  align-items: center;\n  pointer-events: none;\n}\n.ant-input-number-prefix {\n  margin-inline-end: 4px;\n}\n.ant-input-number-suffix {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 1;\n  height: 100%;\n  margin-right: 11px;\n  margin-left: 4px;\n}\n.ant-input-number-group-wrapper .ant-input-number-affix-wrapper {\n  width: 100%;\n}\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover {\n  background: transparent;\n  border-color: #a61d24;\n}\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,\n.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-number-status-error .ant-input-number-prefix {\n  color: #a61d24;\n}\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover {\n  background: transparent;\n  border-color: #d89614;\n}\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,\n.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-number-status-warning .ant-input-number-prefix {\n  color: #d89614;\n}\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover {\n  background: transparent;\n  border-color: #a61d24;\n}\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix {\n  color: #a61d24;\n}\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover {\n  background: transparent;\n  border-color: #d89614;\n}\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,\n.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix {\n  color: #d89614;\n}\n.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon {\n  color: #a61d24;\n  border-color: #a61d24;\n}\n.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon {\n  color: #d89614;\n  border-color: #d89614;\n}\n.ant-input-number {\n  box-sizing: border-box;\n  font-variant: tabular-nums;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  transition: all 0.3s;\n  display: inline-block;\n  width: 90px;\n  margin: 0;\n  padding: 0;\n  border: 1px solid #434343;\n  border-radius: 2px;\n}\n.ant-input-number::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-input-number:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-input-number:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-input-number:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number:focus,\n.ant-input-number-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-input-number:focus,\n.ant-input-rtl .ant-input-number-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-number-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-number[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-number[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-number-borderless,\n.ant-input-number-borderless:hover,\n.ant-input-number-borderless:focus,\n.ant-input-number-borderless-focused,\n.ant-input-number-borderless-disabled,\n.ant-input-number-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-input-number {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-input-number-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-number-sm {\n  padding: 0px 7px;\n}\n.ant-input-number-rtl {\n  direction: rtl;\n}\n.ant-input-number-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  border-spacing: 0;\n}\n.ant-input-number-group[class*='col-'] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.ant-input-number-group > [class*='col-'] {\n  padding-right: 8px;\n}\n.ant-input-number-group > [class*='col-']:last-child {\n  padding-right: 0;\n}\n.ant-input-number-group-addon,\n.ant-input-number-group-wrap,\n.ant-input-number-group > .ant-input-number {\n  display: table-cell;\n}\n.ant-input-number-group-addon:not(:first-child):not(:last-child),\n.ant-input-number-group-wrap:not(:first-child):not(:last-child),\n.ant-input-number-group > .ant-input-number:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.ant-input-number-group-addon,\n.ant-input-number-group-wrap {\n  width: 1px;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.ant-input-number-group-wrap > * {\n  display: block !important;\n}\n.ant-input-number-group .ant-input-number {\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n  text-align: inherit;\n}\n.ant-input-number-group .ant-input-number:focus {\n  z-index: 1;\n  border-right-width: 1px;\n}\n.ant-input-number-group .ant-input-number:hover {\n  z-index: 1;\n  border-right-width: 1px;\n}\n.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover {\n  z-index: 0;\n}\n.ant-input-number-group-addon {\n  position: relative;\n  padding: 0 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  text-align: center;\n  background-color: rgba(255, 255, 255, 0.04);\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n}\n.ant-input-number-group-addon .ant-select {\n  margin: -5px -11px;\n}\n.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n  background-color: inherit;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n.ant-input-number-group-addon .ant-select-open .ant-select-selector,\n.ant-input-number-group-addon .ant-select-focused .ant-select-selector {\n  color: #177ddc;\n}\n.ant-input-number-group-addon .ant-cascader-picker {\n  margin: -9px -12px;\n  background-color: transparent;\n}\n.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input {\n  text-align: left;\n  border: 0;\n  box-shadow: none;\n}\n.ant-input-number-group > .ant-input-number:first-child,\n.ant-input-number-group-addon:first-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-group > .ant-input-number:first-child .ant-select .ant-select-selector,\n.ant-input-number-group-addon:first-child .ant-select .ant-select-selector {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-group > .ant-input-number-affix-wrapper:not(:first-child) .ant-input-number {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-group > .ant-input-number-affix-wrapper:not(:last-child) .ant-input-number {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-group-addon:first-child {\n  border-right: 0;\n}\n.ant-input-number-group-addon:last-child {\n  border-left: 0;\n}\n.ant-input-number-group > .ant-input-number:last-child,\n.ant-input-number-group-addon:last-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-group > .ant-input-number:last-child .ant-select .ant-select-selector,\n.ant-input-number-group-addon:last-child .ant-select .ant-select-selector {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-group-lg .ant-input-number,\n.ant-input-number-group-lg > .ant-input-number-group-addon {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-input-number-group-sm .ant-input-number,\n.ant-input-number-group-sm > .ant-input-number-group-addon {\n  padding: 0px 7px;\n}\n.ant-input-number-group-lg .ant-select-single .ant-select-selector {\n  height: 40px;\n}\n.ant-input-number-group-sm .ant-select-single .ant-select-selector {\n  height: 24px;\n}\n.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child) {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),\n.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact {\n  display: block;\n}\n.ant-input-number-group.ant-input-number-group-compact::before {\n  display: table;\n  content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact::before {\n  display: table;\n  content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child) {\n  border-right-width: 1px;\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child):hover {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,\n.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number:not(:first-child):not(:last-child):focus {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > * {\n  display: inline-block;\n  float: none;\n  vertical-align: top;\n  border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number-affix-wrapper,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-number-number-affix-wrapper,\n.ant-input-number-group.ant-input-number-group-compact > .ant-picker-range {\n  display: inline-flex;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:not(:last-child) {\n  margin-right: -1px;\n  border-right-width: 1px;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-number {\n  float: none;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input {\n  border-right-width: 1px;\n  border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input:hover,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input:hover {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-selector:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker .ant-input:focus,\n.ant-input-number-group.ant-input-number-group-compact > .ant-input-group-wrapper .ant-input:focus {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-focused {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select > .ant-select-arrow {\n  z-index: 1;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:first-child,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:first-child .ant-input {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.ant-input-number-group.ant-input-number-group-compact > *:last-child,\n.ant-input-number-group.ant-input-number-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n  border-right-width: 1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete .ant-input {\n  vertical-align: top;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper {\n  margin-left: -1px;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper + .ant-input-group-wrapper .ant-input-affix-wrapper {\n  border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input-group-addon > .ant-input-search-button {\n  border-radius: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group > .ant-input-number-rtl:first-child,\n.ant-input-number-group-rtl .ant-input-number-group-addon:first-child {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:first-child {\n  border-right: 1px solid #434343;\n  border-left: 0;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:last-child {\n  border-right: 0;\n  border-left: 1px solid #434343;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-rtl.ant-input-number-group > .ant-input-number:last-child,\n.ant-input-number-group-rtl.ant-input-number-group-addon:last-child {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-rtl.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child) {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-rtl.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child) {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > *:not(:last-child) {\n  margin-right: 0;\n  margin-left: -1px;\n  border-left-width: 1px;\n}\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > *:first-child,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-select:first-child > .ant-select-selector,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete:first-child .ant-input,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:first-child .ant-input {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > *:last-child,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-select:last-child > .ant-select-selector,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-select-auto-complete:last-child .ant-input,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker:last-child .ant-input,\n.ant-input-number-group-rtl.ant-input-number-group.ant-input-number-group-compact > .ant-cascader-picker-focused:last-child .ant-input {\n  border-left-width: 1px;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper-rtl + .ant-input-group-wrapper-rtl {\n  margin-right: -1px;\n  margin-left: 0;\n}\n.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search > .ant-input-group > .ant-input {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group > .ant-input-number-rtl:first-child {\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group > .ant-input-number-rtl:last-child {\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:first-child {\n  border-right: 1px solid #434343;\n  border-left: 0;\n  border-radius: 0 2px 2px 0;\n}\n.ant-input-number-group-rtl .ant-input-number-group-addon:last-child {\n  border-right: 0;\n  border-left: 1px solid #434343;\n  border-radius: 2px 0 0 2px;\n}\n.ant-input-number-group-wrapper {\n  display: inline-block;\n  text-align: start;\n  vertical-align: top;\n}\n.ant-input-number-handler {\n  position: relative;\n  display: block;\n  width: 100%;\n  height: 50%;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: bold;\n  line-height: 0;\n  text-align: center;\n  border-left: 1px solid #434343;\n  transition: all 0.1s linear;\n}\n.ant-input-number-handler:active {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-input-number-handler:hover .ant-input-number-handler-up-inner,\n.ant-input-number-handler:hover .ant-input-number-handler-down-inner {\n  color: #165996;\n}\n.ant-input-number-handler-up-inner,\n.ant-input-number-handler-down-inner {\n  display: inline-flex;\n  align-items: center;\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-align: center;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizelegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  position: absolute;\n  right: 4px;\n  width: 12px;\n  height: 12px;\n  color: rgba(255, 255, 255, 0.45);\n  line-height: 12px;\n  transition: all 0.1s linear;\n  user-select: none;\n}\n.ant-input-number-handler-up-inner > *,\n.ant-input-number-handler-down-inner > * {\n  line-height: 1;\n}\n.ant-input-number-handler-up-inner svg,\n.ant-input-number-handler-down-inner svg {\n  display: inline-block;\n}\n.ant-input-number-handler-up-inner::before,\n.ant-input-number-handler-down-inner::before {\n  display: none;\n}\n.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon,\n.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,\n.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,\n.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon {\n  display: block;\n}\n.ant-input-number:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-number:hover + .ant-form-item-children-icon {\n  opacity: 0;\n  transition: opacity 0.24s linear 0.24s;\n}\n.ant-input-number-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-input-number-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-input-number-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-input-number-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-input-number-disabled .ant-input-number-input {\n  cursor: not-allowed;\n}\n.ant-input-number-disabled .ant-input-number-handler-wrap {\n  display: none;\n}\n.ant-input-number-readonly .ant-input-number-handler-wrap {\n  display: none;\n}\n.ant-input-number-input {\n  width: 100%;\n  height: 30px;\n  padding: 0 11px;\n  text-align: left;\n  background-color: transparent;\n  border: 0;\n  border-radius: 2px;\n  outline: 0;\n  transition: all 0.3s linear;\n  appearance: textfield !important;\n}\n.ant-input-number-input::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-input-number-input:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-input-number-input[type='number']::-webkit-inner-spin-button,\n.ant-input-number-input[type='number']::-webkit-outer-spin-button {\n  margin: 0;\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-appearance: none;\n  appearance: none;\n}\n.ant-input-number-lg {\n  padding: 0;\n  font-size: 16px;\n}\n.ant-input-number-lg input {\n  height: 38px;\n}\n.ant-input-number-sm {\n  padding: 0;\n}\n.ant-input-number-sm input {\n  height: 22px;\n  padding: 0 7px;\n}\n.ant-input-number-handler-wrap {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 22px;\n  height: 100%;\n  background: #141414;\n  border-radius: 0 2px 2px 0;\n  opacity: 0;\n  transition: opacity 0.24s linear 0.1s;\n}\n.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner,\n.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: auto;\n  margin-right: 0;\n  font-size: 7px;\n}\n.ant-input-number-borderless .ant-input-number-handler-wrap {\n  border-left-width: 0;\n}\n.ant-input-number-handler-wrap:hover .ant-input-number-handler {\n  height: 40%;\n}\n.ant-input-number:hover .ant-input-number-handler-wrap,\n.ant-input-number-focused .ant-input-number-handler-wrap {\n  opacity: 1;\n}\n.ant-input-number-handler-up {\n  border-top-right-radius: 2px;\n  cursor: pointer;\n}\n.ant-input-number-handler-up-inner {\n  top: 50%;\n  margin-top: -5px;\n  text-align: center;\n}\n.ant-input-number-handler-up:hover {\n  height: 60% !important;\n}\n.ant-input-number-handler-down {\n  top: 0;\n  border-top: 1px solid #434343;\n  border-bottom-right-radius: 2px;\n  cursor: pointer;\n}\n.ant-input-number-handler-down-inner {\n  top: 50%;\n  text-align: center;\n  transform: translateY(-50%);\n}\n.ant-input-number-handler-down:hover {\n  height: 60% !important;\n}\n.ant-input-number-borderless .ant-input-number-handler-down {\n  border-top-width: 0;\n}\n.ant-input-number:hover:not(.ant-input-number-borderless) .ant-input-number-handler-down,\n.ant-input-number-focused:not(.ant-input-number-borderless) .ant-input-number-handler-down {\n  border-top: 1px solid #434343;\n}\n.ant-input-number-handler-up-disabled,\n.ant-input-number-handler-down-disabled {\n  cursor: not-allowed;\n}\n.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,\n.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-input-number-borderless {\n  box-shadow: none;\n}\n.ant-input-number-out-of-range input {\n  color: #a61d24;\n}\n.ant-input-number-compact-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl) {\n  margin-right: -1px;\n}\n.ant-input-number-compact-item:not(.ant-input-number-compact-last-item).ant-input-number-compact-item-rtl {\n  margin-left: -1px;\n}\n.ant-input-number-compact-item:hover,\n.ant-input-number-compact-item:focus,\n.ant-input-number-compact-item:active {\n  z-index: 2;\n}\n.ant-input-number-compact-item.ant-input-number-focused {\n  z-index: 2;\n}\n.ant-input-number-compact-item[disabled] {\n  z-index: 0;\n}\n.ant-input-number-compact-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-last-item).ant-input-number {\n  border-radius: 0;\n}\n.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-item-rtl) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-rtl {\n  direction: rtl;\n}\n.ant-input-number-rtl .ant-input-number-handler {\n  border-right: 1px solid #434343;\n  border-left: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-wrap {\n  right: auto;\n  left: 0;\n}\n.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap {\n  border-right-width: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-up {\n  border-top-right-radius: 0;\n}\n.ant-input-number-rtl .ant-input-number-handler-down {\n  border-bottom-right-radius: 0;\n}\n.ant-input-number-rtl .ant-input-number-input {\n  direction: ltr;\n  text-align: right;\n}\n.ant-layout {\n  display: flex;\n  flex: auto;\n  flex-direction: column;\n  /* fix firefox can't set height smaller than content on flex item */\n  min-height: 0;\n  background: var(--app-background-color);\n}\n.ant-layout,\n.ant-layout * {\n  box-sizing: border-box;\n}\n.ant-layout.ant-layout-has-sider {\n  flex-direction: row;\n}\n.ant-layout.ant-layout-has-sider > .ant-layout,\n.ant-layout.ant-layout-has-sider > .ant-layout-content {\n  width: 0;\n}\n.ant-layout-header,\n.ant-layout-footer {\n  flex: 0 0 auto;\n}\n.ant-layout-header {\n  height: 64px;\n  padding: 0 50px;\n  color: rgba(255, 255, 255, 0.85);\n  line-height: 64px;\n  background: #1f1f1f;\n}\n.ant-layout-footer {\n  padding: 24px 50px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  background: var(--app-background-color);\n}\n.ant-layout-content {\n  flex: auto;\n  /* fix firefox can't set height smaller than content on flex item */\n  min-height: 0;\n}\n.ant-layout-sider {\n  position: relative;\n  /* fix firefox can't set width smaller than content on flex item */\n  min-width: 0;\n  background: #1f1f1f;\n  transition: all 0.2s;\n}\n.ant-layout-sider-children {\n  height: 100%;\n  margin-top: -0.1px;\n  padding-top: 0.1px;\n}\n.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed {\n  width: auto;\n}\n.ant-layout-sider-has-trigger {\n  padding-bottom: 48px;\n}\n.ant-layout-sider-right {\n  order: 1;\n}\n.ant-layout-sider-trigger {\n  position: fixed;\n  bottom: 0;\n  z-index: 1;\n  height: 48px;\n  color: #fff;\n  line-height: 48px;\n  text-align: center;\n  background: #262626;\n  cursor: pointer;\n  transition: all 0.2s;\n}\n.ant-layout-sider-zero-width > * {\n  overflow: hidden;\n}\n.ant-layout-sider-zero-width-trigger {\n  position: absolute;\n  top: 64px;\n  right: -36px;\n  z-index: 1;\n  width: 36px;\n  height: 42px;\n  color: #fff;\n  font-size: 18px;\n  line-height: 42px;\n  text-align: center;\n  background: #1f1f1f;\n  border-radius: 0 2px 2px 0;\n  cursor: pointer;\n  transition: background 0.3s ease;\n}\n.ant-layout-sider-zero-width-trigger::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: transparent;\n  transition: all 0.3s;\n  content: '';\n}\n.ant-layout-sider-zero-width-trigger:hover::after {\n  background: rgba(255, 255, 255, 0.1);\n}\n.ant-layout-sider-zero-width-trigger-right {\n  left: -36px;\n  border-radius: 2px 0 0 2px;\n}\n.ant-layout-sider-light {\n  background: #fff;\n}\n.ant-layout-sider-light .ant-layout-sider-trigger {\n  color: rgba(255, 255, 255, 0.85);\n  background: #fff;\n}\n.ant-layout-sider-light .ant-layout-sider-zero-width-trigger {\n  color: rgba(255, 255, 255, 0.85);\n  background: #fff;\n}\n.ant-layout-rtl {\n  direction: rtl;\n}\n.ant-list .ant-card {\n  background: transparent;\n}\n.ant-list {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n}\n.ant-list * {\n  outline: none;\n}\n.ant-list-pagination {\n  margin-top: 24px;\n  text-align: right;\n}\n.ant-list-pagination .ant-pagination-options {\n  text-align: left;\n}\n.ant-list-more {\n  margin-top: 12px;\n  text-align: center;\n}\n.ant-list-more button {\n  padding-right: 32px;\n  padding-left: 32px;\n}\n.ant-list-spin {\n  min-height: 40px;\n  text-align: center;\n}\n.ant-list-empty-text {\n  padding: 16px;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 14px;\n  text-align: center;\n}\n.ant-list-items {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ant-list-item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 12px 0;\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-list-item-meta {\n  display: flex;\n  flex: 1;\n  align-items: flex-start;\n  max-width: 100%;\n}\n.ant-list-item-meta-avatar {\n  margin-right: 16px;\n}\n.ant-list-item-meta-content {\n  flex: 1 0;\n  width: 0;\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-list-item-meta-title {\n  margin-bottom: 4px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n}\n.ant-list-item-meta-title > a {\n  color: rgba(255, 255, 255, 0.85);\n  transition: all 0.3s;\n}\n.ant-list-item-meta-title > a:hover {\n  color: #177ddc;\n}\n.ant-list-item-meta-description {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.5715;\n}\n.ant-list-item-action {\n  flex: 0 0 auto;\n  margin-left: 48px;\n  padding: 0;\n  font-size: 0;\n  list-style: none;\n}\n.ant-list-item-action > li {\n  position: relative;\n  display: inline-block;\n  padding: 0 8px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.5715;\n  text-align: center;\n}\n.ant-list-item-action > li:first-child {\n  padding-left: 0;\n}\n.ant-list-item-action-split {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  width: 1px;\n  height: 14px;\n  margin-top: -7px;\n  background-color: #303030;\n}\n.ant-list-header {\n  background: transparent;\n}\n.ant-list-footer {\n  background: transparent;\n}\n.ant-list-header,\n.ant-list-footer {\n  padding-top: 12px;\n  padding-bottom: 12px;\n}\n.ant-list-empty {\n  padding: 16px 0;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 12px;\n  text-align: center;\n}\n.ant-list-split .ant-list-item {\n  border-bottom: 1px solid #303030;\n}\n.ant-list-split .ant-list-item:last-child {\n  border-bottom: none;\n}\n.ant-list-split .ant-list-header {\n  border-bottom: 1px solid #303030;\n}\n.ant-list-split.ant-list-empty .ant-list-footer {\n  border-top: 1px solid #303030;\n}\n.ant-list-loading .ant-list-spin-nested-loading {\n  min-height: 32px;\n}\n.ant-list-split.ant-list-something-after-last-item .ant-spin-container > .ant-list-items > .ant-list-item:last-child {\n  border-bottom: 1px solid #303030;\n}\n.ant-list-lg .ant-list-item {\n  padding: 16px 24px;\n}\n.ant-list-sm .ant-list-item {\n  padding: 8px 16px;\n}\n.ant-list-vertical .ant-list-item {\n  align-items: initial;\n}\n.ant-list-vertical .ant-list-item-main {\n  display: block;\n  flex: 1;\n}\n.ant-list-vertical .ant-list-item-extra {\n  margin-left: 40px;\n}\n.ant-list-vertical .ant-list-item-meta {\n  margin-bottom: 16px;\n}\n.ant-list-vertical .ant-list-item-meta-title {\n  margin-bottom: 12px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n  line-height: 24px;\n}\n.ant-list-vertical .ant-list-item-action {\n  margin-top: 16px;\n  margin-left: auto;\n}\n.ant-list-vertical .ant-list-item-action > li {\n  padding: 0 16px;\n}\n.ant-list-vertical .ant-list-item-action > li:first-child {\n  padding-left: 0;\n}\n.ant-list-grid .ant-col > .ant-list-item {\n  display: block;\n  max-width: 100%;\n  margin-bottom: 16px;\n  padding-top: 0;\n  padding-bottom: 0;\n  border-bottom: none;\n}\n.ant-list-item-no-flex {\n  display: block;\n}\n.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action {\n  float: right;\n}\n.ant-list-bordered {\n  border: 1px solid #434343;\n  border-radius: 2px;\n}\n.ant-list-bordered .ant-list-header {\n  padding-right: 24px;\n  padding-left: 24px;\n}\n.ant-list-bordered .ant-list-footer {\n  padding-right: 24px;\n  padding-left: 24px;\n}\n.ant-list-bordered .ant-list-item {\n  padding-right: 24px;\n  padding-left: 24px;\n}\n.ant-list-bordered .ant-list-pagination {\n  margin: 16px 24px;\n}\n.ant-list-bordered.ant-list-sm .ant-list-item {\n  padding: 8px 16px;\n}\n.ant-list-bordered.ant-list-sm .ant-list-header,\n.ant-list-bordered.ant-list-sm .ant-list-footer {\n  padding: 8px 16px;\n}\n.ant-list-bordered.ant-list-lg .ant-list-item {\n  padding: 16px 24px;\n}\n.ant-list-bordered.ant-list-lg .ant-list-header,\n.ant-list-bordered.ant-list-lg .ant-list-footer {\n  padding: 16px 24px;\n}\n@media screen and (max-width: 768px) {\n  .ant-list-item-action {\n    margin-left: 24px;\n  }\n  .ant-list-vertical .ant-list-item-extra {\n    margin-left: 24px;\n  }\n}\n@media screen and (max-width: 576px) {\n  .ant-list-item {\n    flex-wrap: wrap;\n  }\n  .ant-list-item-action {\n    margin-left: 12px;\n  }\n  .ant-list-vertical .ant-list-item {\n    flex-wrap: wrap-reverse;\n  }\n  .ant-list-vertical .ant-list-item-main {\n    min-width: 220px;\n  }\n  .ant-list-vertical .ant-list-item-extra {\n    margin: auto auto 16px;\n  }\n}\n.ant-list-rtl {\n  direction: rtl;\n  text-align: right;\n}\n.ant-list-rtl .ReactVirtualized__List .ant-list-item {\n  direction: rtl;\n}\n.ant-list-rtl .ant-list-pagination {\n  text-align: left;\n}\n.ant-list-rtl .ant-list-item-meta-avatar {\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-list-rtl .ant-list-item-action {\n  margin-right: 48px;\n  margin-left: 0;\n}\n.ant-list.ant-list-rtl .ant-list-item-action > li:first-child {\n  padding-right: 0;\n  padding-left: 16px;\n}\n.ant-list-rtl .ant-list-item-action-split {\n  right: auto;\n  left: 0;\n}\n.ant-list-rtl.ant-list-vertical .ant-list-item-extra {\n  margin-right: 40px;\n  margin-left: 0;\n}\n.ant-list-rtl.ant-list-vertical .ant-list-item-action {\n  margin-right: auto;\n}\n.ant-list-rtl .ant-list-vertical .ant-list-item-action > li:first-child {\n  padding-right: 0;\n  padding-left: 16px;\n}\n.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action {\n  float: left;\n}\n@media screen and (max-width: 768px) {\n  .ant-list-rtl .ant-list-item-action {\n    margin-right: 24px;\n    margin-left: 0;\n  }\n  .ant-list-rtl .ant-list-vertical .ant-list-item-extra {\n    margin-right: 24px;\n    margin-left: 0;\n  }\n}\n@media screen and (max-width: 576px) {\n  .ant-list-rtl .ant-list-item-action {\n    margin-right: 22px;\n    margin-left: 0;\n  }\n  .ant-list-rtl.ant-list-vertical .ant-list-item-extra {\n    margin: auto auto 16px;\n  }\n}\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover {\n  background: transparent;\n  border-color: #a61d24;\n}\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,\n.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-mentions-status-error .ant-input-prefix {\n  color: #a61d24;\n}\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover {\n  background: transparent;\n  border-color: #d89614;\n}\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,\n.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-mentions-status-warning .ant-input-prefix {\n  color: #d89614;\n}\n.ant-mentions {\n  box-sizing: border-box;\n  margin: 0;\n  font-variant: tabular-nums;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n  position: relative;\n  display: inline-block;\n  height: auto;\n  padding: 0;\n  overflow: hidden;\n  line-height: 1.5715;\n  white-space: pre-wrap;\n  vertical-align: bottom;\n}\n.ant-mentions::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-mentions:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-mentions:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-mentions:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-mentions:focus,\n.ant-mentions-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-mentions:focus,\n.ant-input-rtl .ant-mentions-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-mentions-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-mentions-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-mentions[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-mentions[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-mentions-borderless,\n.ant-mentions-borderless:hover,\n.ant-mentions-borderless:focus,\n.ant-mentions-borderless-focused,\n.ant-mentions-borderless-disabled,\n.ant-mentions-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-mentions {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-mentions-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-mentions-sm {\n  padding: 0px 7px;\n}\n.ant-mentions-rtl {\n  direction: rtl;\n}\n.ant-mentions-disabled > textarea {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-mentions-disabled > textarea:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-mentions-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-mentions-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-mentions > textarea,\n.ant-mentions-measure {\n  min-height: 30px;\n  margin: 0;\n  padding: 4px 11px;\n  overflow: inherit;\n  overflow-x: hidden;\n  overflow-y: auto;\n  /* stylelint-disable declaration-block-no-redundant-longhand-properties */\n  font-weight: inherit;\n  font-size: inherit;\n  font-family: inherit;\n  font-style: inherit;\n  font-variant: inherit;\n  font-size-adjust: inherit;\n  font-stretch: inherit;\n  line-height: inherit;\n  /* stylelint-enable declaration-block-no-redundant-longhand-properties */\n  direction: inherit;\n  letter-spacing: inherit;\n  white-space: inherit;\n  text-align: inherit;\n  vertical-align: top;\n  word-wrap: break-word;\n  word-break: inherit;\n  tab-size: inherit;\n}\n.ant-mentions > textarea {\n  width: 100%;\n  border: none;\n  outline: none;\n  resize: none;\n  background-color: transparent;\n}\n.ant-mentions > textarea::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-mentions > textarea:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-mentions-measure {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: -1;\n  color: transparent;\n  pointer-events: none;\n}\n.ant-mentions-measure > span {\n  display: inline-block;\n  min-height: 1em;\n}\n.ant-mentions-dropdown {\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n  z-index: 1050;\n  box-sizing: border-box;\n  font-size: 14px;\n  font-variant: initial;\n  background-color: #1f1f1f;\n  border-radius: 2px;\n  outline: none;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-mentions-dropdown-hidden {\n  display: none;\n}\n.ant-mentions-dropdown-menu {\n  max-height: 250px;\n  margin-bottom: 0;\n  padding-left: 0;\n  overflow: auto;\n  list-style: none;\n  outline: none;\n}\n.ant-mentions-dropdown-menu-item {\n  position: relative;\n  display: block;\n  min-width: 100px;\n  padding: 5px 12px;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  line-height: 1.5715;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  cursor: pointer;\n  transition: background 0.3s ease;\n}\n.ant-mentions-dropdown-menu-item:hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-mentions-dropdown-menu-item:first-child {\n  border-radius: 2px 2px 0 0;\n}\n.ant-mentions-dropdown-menu-item:last-child {\n  border-radius: 0 0 2px 2px;\n}\n.ant-mentions-dropdown-menu-item-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-mentions-dropdown-menu-item-disabled:hover {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: #1f1f1f;\n  cursor: not-allowed;\n}\n.ant-mentions-dropdown-menu-item-selected {\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  background-color: rgba(255, 255, 255, 0.04);\n}\n.ant-mentions-dropdown-menu-item-active {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-mentions-suffix {\n  position: absolute;\n  top: 0;\n  right: 11px;\n  bottom: 0;\n  z-index: 1;\n  display: inline-flex;\n  align-items: center;\n  margin: auto;\n}\n.ant-mentions-rtl {\n  direction: rtl;\n}\n.ant-menu-item-danger.ant-menu-item {\n  color: #a61d24;\n}\n.ant-menu-item-danger.ant-menu-item:hover,\n.ant-menu-item-danger.ant-menu-item-active {\n  color: #a61d24;\n}\n.ant-menu-item-danger.ant-menu-item:active {\n  background: #2a1215;\n}\n.ant-menu-item-danger.ant-menu-item-selected {\n  color: #a61d24;\n}\n.ant-menu-item-danger.ant-menu-item-selected > a,\n.ant-menu-item-danger.ant-menu-item-selected > a:hover {\n  color: #a61d24;\n}\n.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {\n  background-color: #2a1215;\n}\n.ant-menu-inline .ant-menu-item-danger.ant-menu-item::after {\n  border-right-color: #a61d24;\n}\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item,\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,\n.ant-menu-dark .ant-menu-item-danger.ant-menu-item > a {\n  color: #a61d24;\n}\n.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {\n  color: #fff;\n  background-color: #a61d24;\n}\n.ant-menu {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  font-feature-settings: 'tnum';\n  margin-bottom: 0;\n  padding-left: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 0;\n  text-align: left;\n  list-style: none;\n  background: #141414;\n  outline: none;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n  transition: background 0.3s, width 0.3s cubic-bezier(0.2, 0, 0, 1) 0s;\n}\n.ant-menu::before {\n  display: table;\n  content: '';\n}\n.ant-menu::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-menu::before {\n  display: table;\n  content: '';\n}\n.ant-menu::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-menu.ant-menu-root:focus-visible {\n  box-shadow: 0 0 0 2px #11263c;\n}\n.ant-menu ul,\n.ant-menu ol {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ant-menu-overflow {\n  display: flex;\n}\n.ant-menu-overflow-item {\n  flex: none;\n}\n.ant-menu-hidden,\n.ant-menu-submenu-hidden {\n  display: none;\n}\n.ant-menu-item-group-title {\n  height: 1.5715;\n  padding: 8px 16px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.5715;\n  transition: all 0.3s;\n}\n.ant-menu-horizontal .ant-menu-submenu {\n  transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu,\n.ant-menu-submenu-inline {\n  transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-selected {\n  color: #177ddc;\n}\n.ant-menu-item:active,\n.ant-menu-submenu-title:active {\n  background: #111b26;\n}\n.ant-menu-submenu .ant-menu-sub {\n  cursor: initial;\n  transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-title-content {\n  transition: color 0.3s;\n}\n.ant-menu-item a {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-menu-item a:hover {\n  color: #177ddc;\n}\n.ant-menu-item a::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: transparent;\n  content: '';\n}\n.ant-menu-item > .ant-badge a {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-menu-item > .ant-badge a:hover {\n  color: #177ddc;\n}\n.ant-menu-item-divider {\n  overflow: hidden;\n  line-height: 0;\n  border-color: #303030;\n  border-style: solid;\n  border-width: 1px 0 0;\n}\n.ant-menu-item-divider-dashed {\n  border-style: dashed;\n}\n.ant-menu-horizontal .ant-menu-item,\n.ant-menu-horizontal .ant-menu-submenu {\n  margin-top: -1px;\n}\n.ant-menu-horizontal > .ant-menu-item:hover,\n.ant-menu-horizontal > .ant-menu-item-active,\n.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover {\n  background-color: transparent;\n}\n.ant-menu-item-selected {\n  color: #177ddc;\n}\n.ant-menu-item-selected a,\n.ant-menu-item-selected a:hover {\n  color: #177ddc;\n}\n.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {\n  background-color: #111b26;\n}\n.ant-menu-inline,\n.ant-menu-vertical,\n.ant-menu-vertical-left {\n  border-right: 1px solid #303030;\n}\n.ant-menu-vertical-right {\n  border-left: 1px solid #303030;\n}\n.ant-menu-vertical.ant-menu-sub,\n.ant-menu-vertical-left.ant-menu-sub,\n.ant-menu-vertical-right.ant-menu-sub {\n  min-width: 160px;\n  max-height: calc(100vh - 100px);\n  padding: 0;\n  overflow: hidden;\n  border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub:not([class*='-active']),\n.ant-menu-vertical-left.ant-menu-sub:not([class*='-active']),\n.ant-menu-vertical-right.ant-menu-sub:not([class*='-active']) {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.ant-menu-vertical.ant-menu-sub .ant-menu-item,\n.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,\n.ant-menu-vertical-right.ant-menu-sub .ant-menu-item {\n  left: 0;\n  margin-left: 0;\n  border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub .ant-menu-item::after,\n.ant-menu-vertical-left.ant-menu-sub .ant-menu-item::after,\n.ant-menu-vertical-right.ant-menu-sub .ant-menu-item::after {\n  border-right: 0;\n}\n.ant-menu-vertical.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item,\n.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu {\n  transform-origin: 0 0;\n}\n.ant-menu-horizontal.ant-menu-sub {\n  min-width: 114px;\n}\n.ant-menu-horizontal .ant-menu-item,\n.ant-menu-horizontal .ant-menu-submenu-title {\n  transition: border-color 0.3s, background 0.3s;\n}\n.ant-menu-item,\n.ant-menu-submenu-title {\n  position: relative;\n  display: block;\n  margin: 0;\n  padding: 0 20px;\n  white-space: nowrap;\n  cursor: pointer;\n  transition: border-color 0.3s, background 0.3s, padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-item .ant-menu-item-icon,\n.ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu-item .anticon,\n.ant-menu-submenu-title .anticon {\n  min-width: 14px;\n  font-size: 14px;\n  transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s;\n}\n.ant-menu-item .ant-menu-item-icon + span,\n.ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu-item .anticon + span,\n.ant-menu-submenu-title .anticon + span {\n  margin-left: 10px;\n  opacity: 1;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), margin 0.3s, color 0.3s;\n}\n.ant-menu-item .ant-menu-item-icon.svg,\n.ant-menu-submenu-title .ant-menu-item-icon.svg {\n  vertical-align: -0.125em;\n}\n.ant-menu-item.ant-menu-item-only-child > .anticon,\n.ant-menu-submenu-title.ant-menu-item-only-child > .anticon,\n.ant-menu-item.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-submenu-title.ant-menu-item-only-child > .ant-menu-item-icon {\n  margin-right: 0;\n}\n.ant-menu-item:not(.ant-menu-item-disabled):focus-visible,\n.ant-menu-submenu-title:not(.ant-menu-item-disabled):focus-visible {\n  box-shadow: 0 0 0 2px #11263c;\n}\n.ant-menu > .ant-menu-item-divider {\n  margin: 1px 0;\n  padding: 0;\n}\n.ant-menu-submenu-popup {\n  position: absolute;\n  z-index: 1050;\n  background: transparent;\n  border-radius: 2px;\n  box-shadow: none;\n  transform-origin: 0 0;\n}\n.ant-menu-submenu-popup::before {\n  position: absolute;\n  top: -7px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: -1;\n  width: 100%;\n  height: 100%;\n  opacity: 0.0001;\n  content: ' ';\n}\n.ant-menu-submenu-placement-rightTop::before {\n  top: 0;\n  left: -7px;\n}\n.ant-menu-submenu > .ant-menu {\n  background-color: #141414;\n  border-radius: 2px;\n}\n.ant-menu-submenu > .ant-menu-submenu-title::after {\n  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-popup > .ant-menu {\n  background-color: #1f1f1f;\n}\n.ant-menu-submenu-expand-icon,\n.ant-menu-submenu-arrow {\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  width: 10px;\n  color: rgba(255, 255, 255, 0.85);\n  transform: translateY(-50%);\n  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-submenu-arrow::before,\n.ant-menu-submenu-arrow::after {\n  position: absolute;\n  width: 6px;\n  height: 1.5px;\n  background-color: currentcolor;\n  border-radius: 2px;\n  transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  content: '';\n}\n.ant-menu-submenu-arrow::before {\n  transform: rotate(45deg) translateY(-2.5px);\n}\n.ant-menu-submenu-arrow::after {\n  transform: rotate(-45deg) translateY(2.5px);\n}\n.ant-menu-submenu:hover > .ant-menu-submenu-title > .ant-menu-submenu-expand-icon,\n.ant-menu-submenu:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n  color: #177ddc;\n}\n.ant-menu-inline-collapsed .ant-menu-submenu-arrow::before,\n.ant-menu-submenu-inline .ant-menu-submenu-arrow::before {\n  transform: rotate(-45deg) translateX(2.5px);\n}\n.ant-menu-inline-collapsed .ant-menu-submenu-arrow::after,\n.ant-menu-submenu-inline .ant-menu-submenu-arrow::after {\n  transform: rotate(45deg) translateX(-2.5px);\n}\n.ant-menu-submenu-horizontal .ant-menu-submenu-arrow {\n  display: none;\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n  transform: translateY(-2px);\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n  transform: rotate(-45deg) translateX(-2.5px);\n}\n.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before {\n  transform: rotate(45deg) translateX(2.5px);\n}\n.ant-menu-vertical .ant-menu-submenu-selected,\n.ant-menu-vertical-left .ant-menu-submenu-selected,\n.ant-menu-vertical-right .ant-menu-submenu-selected {\n  color: #177ddc;\n}\n.ant-menu-horizontal {\n  line-height: 46px;\n  border: 0;\n  border-bottom: 1px solid #303030;\n  box-shadow: none;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu {\n  margin-top: -1px;\n  margin-bottom: 0;\n  padding: 0 20px;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-active,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-active,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-open,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-open,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-selected,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected {\n  color: #177ddc;\n}\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-active::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-active::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-open::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-open::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-selected::after,\n.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected::after {\n  border-bottom: 2px solid #177ddc;\n}\n.ant-menu-horizontal > .ant-menu-item,\n.ant-menu-horizontal > .ant-menu-submenu {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  vertical-align: bottom;\n}\n.ant-menu-horizontal > .ant-menu-item::after,\n.ant-menu-horizontal > .ant-menu-submenu::after {\n  position: absolute;\n  right: 20px;\n  bottom: 0;\n  left: 20px;\n  border-bottom: 2px solid transparent;\n  transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  content: '';\n}\n.ant-menu-horizontal > .ant-menu-submenu > .ant-menu-submenu-title {\n  padding: 0;\n}\n.ant-menu-horizontal > .ant-menu-item a {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-menu-horizontal > .ant-menu-item a:hover {\n  color: #177ddc;\n}\n.ant-menu-horizontal > .ant-menu-item a::before {\n  bottom: -2px;\n}\n.ant-menu-horizontal > .ant-menu-item-selected a {\n  color: #177ddc;\n}\n.ant-menu-horizontal::after {\n  display: block;\n  clear: both;\n  height: 0;\n  content: '\\20';\n}\n.ant-menu-vertical .ant-menu-item,\n.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-inline .ant-menu-item {\n  position: relative;\n}\n.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-vertical-right .ant-menu-item::after,\n.ant-menu-inline .ant-menu-item::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  border-right: 3px solid #177ddc;\n  transform: scaleY(0.0001);\n  opacity: 0;\n  transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1);\n  content: '';\n}\n.ant-menu-vertical .ant-menu-item,\n.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-inline .ant-menu-item,\n.ant-menu-vertical .ant-menu-submenu-title,\n.ant-menu-vertical-left .ant-menu-submenu-title,\n.ant-menu-vertical-right .ant-menu-submenu-title,\n.ant-menu-inline .ant-menu-submenu-title {\n  height: 40px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n  padding: 0 16px;\n  overflow: hidden;\n  line-height: 40px;\n  text-overflow: ellipsis;\n}\n.ant-menu-vertical .ant-menu-submenu,\n.ant-menu-vertical-left .ant-menu-submenu,\n.ant-menu-vertical-right .ant-menu-submenu,\n.ant-menu-inline .ant-menu-submenu {\n  padding-bottom: 0.02px;\n}\n.ant-menu-vertical .ant-menu-item:not(:last-child),\n.ant-menu-vertical-left .ant-menu-item:not(:last-child),\n.ant-menu-vertical-right .ant-menu-item:not(:last-child),\n.ant-menu-inline .ant-menu-item:not(:last-child) {\n  margin-bottom: 8px;\n}\n.ant-menu-vertical > .ant-menu-item,\n.ant-menu-vertical-left > .ant-menu-item,\n.ant-menu-vertical-right > .ant-menu-item,\n.ant-menu-inline > .ant-menu-item,\n.ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-vertical-left > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-vertical-right > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {\n  height: 40px;\n  line-height: 40px;\n}\n.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,\n.ant-menu-vertical .ant-menu-submenu-title {\n  padding-right: 34px;\n}\n.ant-menu-inline {\n  width: 100%;\n}\n.ant-menu-inline .ant-menu-selected::after,\n.ant-menu-inline .ant-menu-item-selected::after {\n  transform: scaleY(1);\n  opacity: 1;\n  transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-menu-inline .ant-menu-item,\n.ant-menu-inline .ant-menu-submenu-title {\n  width: calc(100% + 1px);\n}\n.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,\n.ant-menu-inline .ant-menu-submenu-title {\n  padding-right: 34px;\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title {\n  display: flex;\n  align-items: center;\n  transition: border-color 0.3s, background 0.3s, padding 0.1s cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item > .ant-menu-title-content,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title > .ant-menu-title-content {\n  flex: auto;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.ant-menu-inline.ant-menu-root .ant-menu-item > *,\n.ant-menu-inline.ant-menu-root .ant-menu-submenu-title > * {\n  flex: none;\n}\n.ant-menu.ant-menu-inline-collapsed {\n  width: 80px;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {\n  left: 0;\n  padding: 0 calc(50% - 16px / 2);\n  text-overflow: clip;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow {\n  opacity: 0;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon {\n  margin: 0;\n  font-size: 16px;\n  line-height: 40px;\n}\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-item-icon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span,\n.ant-menu.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span {\n  display: inline-block;\n  opacity: 0;\n}\n.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed .anticon {\n  display: inline-block;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip {\n  pointer-events: none;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,\n.ant-menu.ant-menu-inline-collapsed-tooltip .anticon {\n  display: none;\n}\n.ant-menu.ant-menu-inline-collapsed-tooltip a {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title {\n  padding-right: 4px;\n  padding-left: 4px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-menu-item-group-list {\n  margin: 0;\n  padding: 0;\n}\n.ant-menu-item-group-list .ant-menu-item,\n.ant-menu-item-group-list .ant-menu-submenu-title {\n  padding: 0 16px 0 28px;\n}\n.ant-menu-root.ant-menu-vertical,\n.ant-menu-root.ant-menu-vertical-left,\n.ant-menu-root.ant-menu-vertical-right,\n.ant-menu-root.ant-menu-inline {\n  box-shadow: none;\n}\n.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item > .ant-menu-inline-collapsed-noicon,\n.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title > .ant-menu-inline-collapsed-noicon {\n  font-size: 16px;\n  text-align: center;\n}\n.ant-menu-sub.ant-menu-inline {\n  padding: 0;\n  background: rgba(255, 255, 255, 0.04);\n  border: 0;\n  border-radius: 0;\n  box-shadow: none;\n}\n.ant-menu-sub.ant-menu-inline > .ant-menu-item,\n.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {\n  height: 40px;\n  line-height: 40px;\n  list-style-position: inside;\n  list-style-type: disc;\n}\n.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title {\n  padding-left: 32px;\n}\n.ant-menu-item-disabled,\n.ant-menu-submenu-disabled {\n  color: rgba(255, 255, 255, 0.3) !important;\n  background: none;\n  cursor: not-allowed;\n}\n.ant-menu-item-disabled::after,\n.ant-menu-submenu-disabled::after {\n  border-color: transparent !important;\n}\n.ant-menu-item-disabled a,\n.ant-menu-submenu-disabled a {\n  color: rgba(255, 255, 255, 0.3) !important;\n  pointer-events: none;\n}\n.ant-menu-item-disabled > .ant-menu-submenu-title,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title {\n  color: rgba(255, 255, 255, 0.3) !important;\n  cursor: not-allowed;\n}\n.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n  background: rgba(255, 255, 255, 0.3) !important;\n}\n.ant-layout-header .ant-menu {\n  line-height: inherit;\n}\n.ant-menu-inline-collapsed-tooltip a,\n.ant-menu-inline-collapsed-tooltip a:hover {\n  color: #fff;\n}\n.ant-menu-light .ant-menu-item:hover,\n.ant-menu-light .ant-menu-item-active,\n.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,\n.ant-menu-light .ant-menu-submenu-active,\n.ant-menu-light .ant-menu-submenu-title:hover {\n  color: #177ddc;\n}\n.ant-menu.ant-menu-root:focus-visible {\n  box-shadow: 0 0 0 2px #388ed3;\n}\n.ant-menu-dark .ant-menu-item:focus-visible,\n.ant-menu-dark .ant-menu-submenu-title:focus-visible {\n  box-shadow: 0 0 0 2px #388ed3;\n}\n.ant-menu.ant-menu-dark,\n.ant-menu-dark .ant-menu-sub,\n.ant-menu.ant-menu-dark .ant-menu-sub {\n  color: rgba(255, 255, 255, 0.65);\n  background: #1f1f1f;\n}\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow {\n  opacity: 0.45;\n  transition: all 0.3s;\n}\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before {\n  background: #fff;\n}\n.ant-menu-dark.ant-menu-submenu-popup {\n  background: transparent;\n}\n.ant-menu-dark .ant-menu-inline.ant-menu-sub {\n  background: #141414;\n}\n.ant-menu-dark.ant-menu-horizontal {\n  border-bottom: 0;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item,\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu {\n  top: 0;\n  margin-top: 0;\n  padding: 0 20px;\n  border-color: #1f1f1f;\n  border-bottom: 0;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item:hover {\n  background-color: #177ddc;\n}\n.ant-menu-dark.ant-menu-horizontal > .ant-menu-item > a::before {\n  bottom: 0;\n}\n.ant-menu-dark .ant-menu-item,\n.ant-menu-dark .ant-menu-item-group-title,\n.ant-menu-dark .ant-menu-item > a,\n.ant-menu-dark .ant-menu-item > span > a {\n  color: rgba(255, 255, 255, 0.65);\n}\n.ant-menu-dark.ant-menu-inline,\n.ant-menu-dark.ant-menu-vertical,\n.ant-menu-dark.ant-menu-vertical-left,\n.ant-menu-dark.ant-menu-vertical-right {\n  border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-dark.ant-menu-vertical-right .ant-menu-item {\n  left: 0;\n  margin-left: 0;\n  border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-dark.ant-menu-vertical-right .ant-menu-item::after {\n  border-right: 0;\n}\n.ant-menu-dark.ant-menu-inline .ant-menu-item,\n.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title {\n  width: 100%;\n}\n.ant-menu-dark .ant-menu-item:hover,\n.ant-menu-dark .ant-menu-item-active,\n.ant-menu-dark .ant-menu-submenu-active,\n.ant-menu-dark .ant-menu-submenu-open,\n.ant-menu-dark .ant-menu-submenu-selected,\n.ant-menu-dark .ant-menu-submenu-title:hover {\n  color: #fff;\n  background-color: transparent;\n}\n.ant-menu-dark .ant-menu-item:hover > a,\n.ant-menu-dark .ant-menu-item-active > a,\n.ant-menu-dark .ant-menu-submenu-active > a,\n.ant-menu-dark .ant-menu-submenu-open > a,\n.ant-menu-dark .ant-menu-submenu-selected > a,\n.ant-menu-dark .ant-menu-submenu-title:hover > a,\n.ant-menu-dark .ant-menu-item:hover > span > a,\n.ant-menu-dark .ant-menu-item-active > span > a,\n.ant-menu-dark .ant-menu-submenu-active > span > a,\n.ant-menu-dark .ant-menu-submenu-open > span > a,\n.ant-menu-dark .ant-menu-submenu-selected > span > a,\n.ant-menu-dark .ant-menu-submenu-title:hover > span > a {\n  color: #fff;\n}\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow {\n  opacity: 1;\n}\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before {\n  background: #fff;\n}\n.ant-menu-dark .ant-menu-item:hover {\n  background-color: transparent;\n}\n.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected {\n  background-color: #177ddc;\n}\n.ant-menu-dark .ant-menu-item-selected {\n  color: #fff;\n  border-right: 0;\n}\n.ant-menu-dark .ant-menu-item-selected::after {\n  border-right: 0;\n}\n.ant-menu-dark .ant-menu-item-selected > a,\n.ant-menu-dark .ant-menu-item-selected > span > a,\n.ant-menu-dark .ant-menu-item-selected > a:hover,\n.ant-menu-dark .ant-menu-item-selected > span > a:hover {\n  color: #fff;\n}\n.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,\n.ant-menu-dark .ant-menu-item-selected .anticon {\n  color: #fff;\n}\n.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon + span,\n.ant-menu-dark .ant-menu-item-selected .anticon + span {\n  color: #fff;\n}\n.ant-menu.ant-menu-dark .ant-menu-item-selected,\n.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected {\n  background-color: #177ddc;\n}\n.ant-menu-dark .ant-menu-item-disabled,\n.ant-menu-dark .ant-menu-submenu-disabled,\n.ant-menu-dark .ant-menu-item-disabled > a,\n.ant-menu-dark .ant-menu-submenu-disabled > a,\n.ant-menu-dark .ant-menu-item-disabled > span > a,\n.ant-menu-dark .ant-menu-submenu-disabled > span > a {\n  color: rgba(255, 255, 255, 0.3) !important;\n  opacity: 0.8;\n}\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title {\n  color: rgba(255, 255, 255, 0.3) !important;\n}\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before,\n.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after,\n.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after {\n  background: rgba(255, 255, 255, 0.3) !important;\n}\n.ant-menu.ant-menu-rtl {\n  direction: rtl;\n  text-align: right;\n}\n.ant-menu-rtl .ant-menu-item-group-title {\n  text-align: right;\n}\n.ant-menu-rtl.ant-menu-inline,\n.ant-menu-rtl.ant-menu-vertical {\n  border-right: none;\n  border-left: 1px solid #303030;\n}\n.ant-menu-rtl.ant-menu-dark.ant-menu-inline,\n.ant-menu-rtl.ant-menu-dark.ant-menu-vertical {\n  border-left: none;\n}\n.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu,\n.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu {\n  transform-origin: top right;\n}\n.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-item .anticon,\n.ant-menu-rtl .ant-menu-submenu-title .anticon {\n  margin-right: auto;\n  margin-left: 10px;\n}\n.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child > .ant-menu-item-icon,\n.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child > .anticon,\n.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child > .anticon {\n  margin-left: 0;\n}\n.ant-menu-submenu-rtl.ant-menu-submenu-popup {\n  transform-origin: 100% 0;\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow,\n.ant-menu-rtl .ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow {\n  right: auto;\n  left: 16px;\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before {\n  transform: rotate(-45deg) translateY(-2px);\n}\n.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,\n.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after {\n  transform: rotate(45deg) translateY(2px);\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item::after,\n.ant-menu-rtl.ant-menu-inline .ant-menu-item::after {\n  right: auto;\n  left: 0;\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,\n.ant-menu-rtl.ant-menu-inline .ant-menu-item,\n.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title,\n.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title {\n  text-align: right;\n}\n.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title {\n  padding-right: 0;\n  padding-left: 34px;\n}\n.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title {\n  padding-right: 16px;\n  padding-left: 34px;\n}\n.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title {\n  padding: 0 calc(50% - 16px / 2);\n}\n.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,\n.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title {\n  padding: 0 28px 0 16px;\n}\n.ant-menu-sub.ant-menu-inline {\n  border: 0;\n}\n.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title {\n  padding-right: 32px;\n  padding-left: 0;\n}\n.ant-message {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: fixed;\n  top: 8px;\n  left: 0;\n  z-index: 1010;\n  width: 100%;\n  pointer-events: none;\n}\n.ant-message-notice {\n  padding: 8px;\n  text-align: center;\n}\n.ant-message-notice-content {\n  display: inline-block;\n  padding: 10px 16px;\n  background: #1f1f1f;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n  pointer-events: all;\n}\n.ant-message-success .anticon {\n  color: #49aa19;\n}\n.ant-message-error .anticon {\n  color: #a61d24;\n}\n.ant-message-warning .anticon {\n  color: #d89614;\n}\n.ant-message-info .anticon,\n.ant-message-loading .anticon {\n  color: #177ddc;\n}\n.ant-message .anticon {\n  position: relative;\n  top: 1px;\n  margin-right: 8px;\n  font-size: 16px;\n}\n.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active {\n  animation-name: MessageMoveOut;\n  animation-duration: 0.3s;\n}\n@keyframes MessageMoveOut {\n  0% {\n    max-height: 150px;\n    padding: 8px;\n    opacity: 1;\n  }\n  100% {\n    max-height: 0;\n    padding: 0;\n    opacity: 0;\n  }\n}\n.ant-message-rtl {\n  direction: rtl;\n}\n.ant-message-rtl span {\n  direction: rtl;\n}\n.ant-message-rtl .anticon {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-modal {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  pointer-events: none;\n  position: relative;\n  top: 100px;\n  width: auto;\n  max-width: calc(100vw - 32px);\n  margin: 0 auto;\n  padding-bottom: 24px;\n}\n.ant-modal.ant-zoom-enter,\n.ant-modal.ant-zoom-appear {\n  transform: none;\n  opacity: 0;\n  animation-duration: 0.3s;\n  user-select: none;\n}\n.ant-modal-mask {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1000;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-modal-mask-hidden {\n  display: none;\n}\n.ant-modal-wrap {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  outline: 0;\n}\n.ant-modal-wrap {\n  z-index: 1000;\n}\n.ant-modal-title {\n  margin: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  line-height: 22px;\n  word-wrap: break-word;\n}\n.ant-modal-content {\n  position: relative;\n  background-color: #1f1f1f;\n  background-clip: padding-box;\n  border: 0;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n  pointer-events: auto;\n}\n.ant-modal-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 10;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: 700;\n  line-height: 1;\n  text-decoration: none;\n  background: transparent;\n  border: 0;\n  outline: 0;\n  cursor: pointer;\n  transition: color 0.3s;\n}\n.ant-modal-close-x {\n  display: block;\n  width: 54px;\n  height: 54px;\n  font-size: 16px;\n  font-style: normal;\n  line-height: 54px;\n  text-align: center;\n  text-transform: none;\n  text-rendering: auto;\n}\n.ant-modal-close:focus,\n.ant-modal-close:hover {\n  color: rgba(255, 255, 255, 0.75);\n  text-decoration: none;\n}\n.ant-modal-header {\n  padding: 16px 24px;\n  color: rgba(255, 255, 255, 0.85);\n  background: #1f1f1f;\n  border-bottom: 1px solid #303030;\n  border-radius: 2px 2px 0 0;\n}\n.ant-modal-body {\n  padding: 24px;\n  font-size: 14px;\n  line-height: 1.5715;\n  word-wrap: break-word;\n}\n.ant-modal-footer {\n  padding: 10px 16px;\n  text-align: right;\n  background: transparent;\n  border-top: 1px solid #303030;\n  border-radius: 0 0 2px 2px;\n}\n.ant-modal-footer .ant-btn + .ant-btn:not(.ant-dropdown-trigger) {\n  margin-bottom: 0;\n  margin-left: 8px;\n}\n.ant-modal-open {\n  overflow: hidden;\n}\n.ant-modal-centered {\n  text-align: center;\n}\n.ant-modal-centered::before {\n  display: inline-block;\n  width: 0;\n  height: 100%;\n  vertical-align: middle;\n  content: '';\n}\n.ant-modal-centered .ant-modal {\n  top: 0;\n  display: inline-block;\n  padding-bottom: 0;\n  text-align: left;\n  vertical-align: middle;\n}\n@media (max-width: 767px) {\n  .ant-modal {\n    max-width: calc(100vw - 16px);\n    margin: 8px auto;\n  }\n  .ant-modal-centered .ant-modal {\n    flex: 1;\n  }\n}\n.ant-modal-confirm .ant-modal-header {\n  display: none;\n}\n.ant-modal-confirm .ant-modal-body {\n  padding: 32px 32px 24px;\n}\n.ant-modal-confirm-body-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-modal-confirm-body-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-modal-confirm-body-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-modal-confirm-body-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-modal-confirm-body .ant-modal-confirm-title {\n  display: block;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  font-size: 16px;\n  line-height: 1.4;\n}\n.ant-modal-confirm-body .ant-modal-confirm-content {\n  margin-top: 8px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n}\n.ant-modal-confirm-body > .anticon {\n  float: left;\n  margin-right: 16px;\n  font-size: 22px;\n}\n.ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n  margin-left: 38px;\n}\n.ant-modal-confirm .ant-modal-confirm-btns {\n  margin-top: 24px;\n  text-align: right;\n}\n.ant-modal-confirm .ant-modal-confirm-btns .ant-btn + .ant-btn {\n  margin-bottom: 0;\n  margin-left: 8px;\n}\n.ant-modal-confirm-error .ant-modal-confirm-body > .anticon {\n  color: #a61d24;\n}\n.ant-modal-confirm-warning .ant-modal-confirm-body > .anticon,\n.ant-modal-confirm-confirm .ant-modal-confirm-body > .anticon {\n  color: #d89614;\n}\n.ant-modal-confirm-info .ant-modal-confirm-body > .anticon {\n  color: #177ddc;\n}\n.ant-modal-confirm-success .ant-modal-confirm-body > .anticon {\n  color: #49aa19;\n}\n.ant-modal-confirm .ant-zoom-leave .ant-modal-confirm-btns {\n  pointer-events: none;\n}\n.ant-modal-wrap-rtl {\n  direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-close {\n  right: initial;\n  left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-footer {\n  text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-footer .ant-btn + .ant-btn {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body {\n  direction: rtl;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon {\n  float: right;\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content {\n  margin-right: 38px;\n  margin-left: 0;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns {\n  text-align: left;\n}\n.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn + .ant-btn {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-modal-wrap-rtl.ant-modal-centered .ant-modal {\n  text-align: right;\n}\n.ant-modal .ant-picker-clear,\n.ant-modal .ant-slider-handle,\n.ant-modal .ant-anchor-wrapper,\n.ant-modal .ant-collapse-content,\n.ant-modal .ant-timeline-item-head,\n.ant-modal .ant-card {\n  background-color: #1f1f1f;\n}\n.ant-modal .ant-transfer-list-header {\n  background: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-modal .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-modal tr.ant-table-expanded-row > td,\n.ant-modal tr.ant-table-expanded-row:hover > td {\n  background: #272727;\n}\n.ant-modal .ant-table.ant-table-small thead > tr > th {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table {\n  background-color: #1f1f1f;\n}\n.ant-modal .ant-table .ant-table-row-expand-icon {\n  border: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table tfoot > tr > th,\n.ant-modal .ant-table tfoot > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table thead > tr > th {\n  background-color: #272727;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table tbody > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table tbody > tr > td.ant-table-cell-fix-left,\n.ant-modal .ant-table tbody > tr > td.ant-table-cell-fix-right {\n  background-color: #1f1f1f;\n}\n.ant-modal .ant-table tbody > tr.ant-table-row:hover > td {\n  background: #303030;\n}\n.ant-modal .ant-table.ant-table-bordered .ant-table-title {\n  border: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table.ant-table-bordered thead > tr > th,\n.ant-modal .ant-table.ant-table-bordered tbody > tr > td,\n.ant-modal .ant-table.ant-table-bordered tfoot > tr > th,\n.ant-modal .ant-table.ant-table-bordered tfoot > tr > td {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table.ant-table-bordered .ant-table-cell-fix-right-first::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table.ant-table-bordered table thead > tr:not(:last-child) > th {\n  border-bottom: 1px solid #303030;\n}\n.ant-modal .ant-table.ant-table-bordered .ant-table-container {\n  border: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table.ant-table-bordered .ant-table-expanded-row-fixed::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table.ant-table-bordered .ant-table-footer {\n  border: 1px solid #3a3a3a;\n}\n.ant-modal .ant-table .ant-table-filter-trigger-container-open {\n  background-color: #525252;\n}\n.ant-modal .ant-picker-calendar-full {\n  background-color: #1f1f1f;\n}\n.ant-modal .ant-picker-calendar-full .ant-picker-panel {\n  background-color: #1f1f1f;\n}\n.ant-modal .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {\n  border-top: 2px solid #3a3a3a;\n}\n.ant-modal .ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-active {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #1f1f1f;\n}\n.ant-modal .ant-badge-count {\n  box-shadow: 0 0 0 1px #1f1f1f;\n}\n.ant-modal .ant-tree-show-line .ant-tree-switcher {\n  background: #1f1f1f;\n}\n.ant-notification .ant-picker-clear,\n.ant-notification .ant-slider-handle,\n.ant-notification .ant-anchor-wrapper,\n.ant-notification .ant-collapse-content,\n.ant-notification .ant-timeline-item-head,\n.ant-notification .ant-card {\n  background-color: #1f1f1f;\n}\n.ant-notification .ant-transfer-list-header {\n  background: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-notification .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-notification tr.ant-table-expanded-row > td,\n.ant-notification tr.ant-table-expanded-row:hover > td {\n  background: #272727;\n}\n.ant-notification .ant-table.ant-table-small thead > tr > th {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table {\n  background-color: #1f1f1f;\n}\n.ant-notification .ant-table .ant-table-row-expand-icon {\n  border: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table tfoot > tr > th,\n.ant-notification .ant-table tfoot > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table thead > tr > th {\n  background-color: #272727;\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table tbody > tr > td {\n  border-bottom: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table tbody > tr > td.ant-table-cell-fix-left,\n.ant-notification .ant-table tbody > tr > td.ant-table-cell-fix-right {\n  background-color: #1f1f1f;\n}\n.ant-notification .ant-table tbody > tr.ant-table-row:hover > td {\n  background: #303030;\n}\n.ant-notification .ant-table.ant-table-bordered .ant-table-title {\n  border: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table.ant-table-bordered thead > tr > th,\n.ant-notification .ant-table.ant-table-bordered tbody > tr > td,\n.ant-notification .ant-table.ant-table-bordered tfoot > tr > th,\n.ant-notification .ant-table.ant-table-bordered tfoot > tr > td {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table.ant-table-bordered .ant-table-cell-fix-right-first::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table.ant-table-bordered table thead > tr:not(:last-child) > th {\n  border-bottom: 1px solid #303030;\n}\n.ant-notification .ant-table.ant-table-bordered .ant-table-container {\n  border: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table.ant-table-bordered .ant-table-expanded-row-fixed::after {\n  border-right: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table.ant-table-bordered .ant-table-footer {\n  border: 1px solid #3a3a3a;\n}\n.ant-notification .ant-table .ant-table-filter-trigger-container-open {\n  background-color: #525252;\n}\n.ant-notification .ant-picker-calendar-full {\n  background-color: #1f1f1f;\n}\n.ant-notification .ant-picker-calendar-full .ant-picker-panel {\n  background-color: #1f1f1f;\n}\n.ant-notification .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {\n  border-top: 2px solid #3a3a3a;\n}\n.ant-notification .ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-active {\n  background-color: #1f1f1f;\n  border-bottom: 1px solid #1f1f1f;\n}\n.ant-notification .ant-badge-count {\n  box-shadow: 0 0 0 1px #1f1f1f;\n}\n.ant-notification .ant-tree-show-line .ant-tree-switcher {\n  background: #1f1f1f;\n}\n.ant-notification {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: fixed;\n  z-index: 1010;\n  margin-right: 24px;\n}\n.ant-notification-close-icon {\n  font-size: 14px;\n  cursor: pointer;\n}\n.ant-notification-hook-holder {\n  position: relative;\n}\n.ant-notification-notice {\n  position: relative;\n  width: 384px;\n  max-width: calc(100vw - 24px * 2);\n  margin-bottom: 16px;\n  margin-left: auto;\n  padding: 16px 24px;\n  overflow: hidden;\n  line-height: 1.5715;\n  word-wrap: break-word;\n  background: #1f1f1f;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-notification-top .ant-notification-notice,\n.ant-notification-bottom .ant-notification-notice {\n  margin-right: auto;\n  margin-left: auto;\n}\n.ant-notification-topLeft .ant-notification-notice,\n.ant-notification-bottomLeft .ant-notification-notice {\n  margin-right: auto;\n  margin-left: 0;\n}\n.ant-notification-notice-message {\n  margin-bottom: 8px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n  line-height: 24px;\n}\n.ant-notification-notice-message-single-line-auto-margin {\n  display: block;\n  width: calc(384px - 24px * 2 - 24px - 48px - 100%);\n  max-width: 4px;\n  background-color: transparent;\n  pointer-events: none;\n}\n.ant-notification-notice-message-single-line-auto-margin::before {\n  display: block;\n  content: '';\n}\n.ant-notification-notice-description {\n  font-size: 14px;\n}\n.ant-notification-notice-closable .ant-notification-notice-message {\n  padding-right: 24px;\n}\n.ant-notification-notice-with-icon .ant-notification-notice-message {\n  margin-bottom: 4px;\n  margin-left: 48px;\n  font-size: 16px;\n}\n.ant-notification-notice-with-icon .ant-notification-notice-description {\n  margin-left: 48px;\n  font-size: 14px;\n}\n.ant-notification-notice-icon {\n  position: absolute;\n  margin-left: 4px;\n  font-size: 24px;\n  line-height: 24px;\n}\n.anticon.ant-notification-notice-icon-success {\n  color: #49aa19;\n}\n.anticon.ant-notification-notice-icon-info {\n  color: #177ddc;\n}\n.anticon.ant-notification-notice-icon-warning {\n  color: #d89614;\n}\n.anticon.ant-notification-notice-icon-error {\n  color: #a61d24;\n}\n.ant-notification-notice-close {\n  position: absolute;\n  top: 16px;\n  right: 22px;\n  color: rgba(255, 255, 255, 0.45);\n  outline: none;\n}\n.ant-notification-notice-close:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-notification-notice-btn {\n  float: right;\n  margin-top: 16px;\n}\n.ant-notification .notification-fade-effect {\n  animation-duration: 0.24s;\n  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n  animation-fill-mode: both;\n}\n.ant-notification-fade-enter,\n.ant-notification-fade-appear {\n  animation-duration: 0.24s;\n  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n  animation-fill-mode: both;\n  opacity: 0;\n  animation-play-state: paused;\n}\n.ant-notification-fade-leave {\n  animation-duration: 0.24s;\n  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);\n  animation-fill-mode: both;\n  animation-duration: 0.2s;\n  animation-play-state: paused;\n}\n.ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-fade-appear.ant-notification-fade-appear-active {\n  animation-name: NotificationFadeIn;\n  animation-play-state: running;\n}\n.ant-notification-fade-leave.ant-notification-fade-leave-active {\n  animation-name: NotificationFadeOut;\n  animation-play-state: running;\n}\n@keyframes NotificationFadeIn {\n  0% {\n    left: 384px;\n    opacity: 0;\n  }\n  100% {\n    left: 0;\n    opacity: 1;\n  }\n}\n@keyframes NotificationFadeOut {\n  0% {\n    max-height: 150px;\n    margin-bottom: 16px;\n    opacity: 1;\n  }\n  100% {\n    max-height: 0;\n    margin-bottom: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    opacity: 0;\n  }\n}\n.ant-notification-rtl {\n  direction: rtl;\n}\n.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message {\n  padding-right: 0;\n  padding-left: 24px;\n}\n.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message {\n  margin-right: 48px;\n  margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description {\n  margin-right: 48px;\n  margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-icon {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-notification-rtl .ant-notification-notice-close {\n  right: auto;\n  left: 22px;\n}\n.ant-notification-rtl .ant-notification-notice-btn {\n  float: left;\n}\n.ant-notification-top,\n.ant-notification-bottom {\n  margin-right: 0;\n  margin-left: 0;\n}\n.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active {\n  animation-name: NotificationTopFadeIn;\n}\n.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active {\n  animation-name: NotificationBottomFadeIn;\n}\n.ant-notification-topLeft,\n.ant-notification-bottomLeft {\n  margin-right: 0;\n  margin-left: 24px;\n}\n.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,\n.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,\n.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active {\n  animation-name: NotificationLeftFadeIn;\n}\n@keyframes NotificationTopFadeIn {\n  0% {\n    margin-top: -100%;\n    opacity: 0;\n  }\n  100% {\n    margin-top: 0;\n    opacity: 1;\n  }\n}\n@keyframes NotificationBottomFadeIn {\n  0% {\n    margin-bottom: -100%;\n    opacity: 0;\n  }\n  100% {\n    margin-bottom: 0;\n    opacity: 1;\n  }\n}\n@keyframes NotificationLeftFadeIn {\n  0% {\n    right: 384px;\n    opacity: 0;\n  }\n  100% {\n    right: 0;\n    opacity: 1;\n  }\n}\n.ant-page-header {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  padding: 16px 24px;\n  background-color: #141414;\n}\n.ant-page-header-ghost {\n  background-color: transparent;\n}\n.ant-page-header.has-breadcrumb {\n  padding-top: 12px;\n}\n.ant-page-header.has-footer {\n  padding-bottom: 0;\n}\n.ant-page-header-back {\n  margin-right: 16px;\n  font-size: 16px;\n  line-height: 1;\n}\n.ant-page-header-back-button {\n  color: #177ddc;\n  outline: none;\n  cursor: pointer;\n  transition: color 0.3s;\n  color: inherit;\n}\n.ant-page-header-back-button:focus-visible,\n.ant-page-header-back-button:hover {\n  color: #165996;\n}\n.ant-page-header-back-button:active {\n  color: #388ed3;\n}\n.ant-page-header .ant-divider-vertical {\n  height: 14px;\n  margin: 0 12px;\n  vertical-align: middle;\n}\n.ant-breadcrumb + .ant-page-header-heading {\n  margin-top: 8px;\n}\n.ant-page-header-heading {\n  display: flex;\n  justify-content: space-between;\n}\n.ant-page-header-heading-left {\n  display: flex;\n  align-items: center;\n  margin: 4px 0;\n  overflow: hidden;\n}\n.ant-page-header-heading-title {\n  margin-right: 12px;\n  margin-bottom: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 20px;\n  line-height: 32px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-page-header-heading .ant-avatar {\n  margin-right: 12px;\n}\n.ant-page-header-heading-sub-title {\n  margin-right: 12px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.5715;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-page-header-heading-extra {\n  margin: 4px 0;\n  white-space: nowrap;\n}\n.ant-page-header-heading-extra > * {\n  white-space: unset;\n}\n.ant-page-header-content {\n  padding-top: 12px;\n}\n.ant-page-header-footer {\n  margin-top: 16px;\n}\n.ant-page-header-footer .ant-tabs > .ant-tabs-nav {\n  margin: 0;\n}\n.ant-page-header-footer .ant-tabs > .ant-tabs-nav::before {\n  border: none;\n}\n.ant-page-header-footer .ant-tabs .ant-tabs-tab {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  font-size: 16px;\n}\n.ant-page-header-compact .ant-page-header-heading {\n  flex-wrap: wrap;\n}\n.ant-page-header-rtl {\n  direction: rtl;\n}\n.ant-page-header-rtl .ant-page-header-back {\n  float: right;\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-page-header-rtl .ant-page-header-heading-title {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading .ant-avatar {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading-sub-title {\n  float: right;\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-page-header-rtl .ant-page-header-heading-tags {\n  float: right;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra {\n  float: left;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra > * {\n  margin-right: 12px;\n  margin-left: 0;\n}\n.ant-page-header-rtl .ant-page-header-heading-extra > *:first-child {\n  margin-right: 0;\n}\n.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav {\n  float: right;\n}\n.ant-pagination {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n}\n.ant-pagination ul,\n.ant-pagination ol {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ant-pagination::after {\n  display: block;\n  clear: both;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n  content: ' ';\n}\n.ant-pagination-total-text {\n  display: inline-block;\n  height: 32px;\n  margin-right: 8px;\n  line-height: 30px;\n  vertical-align: middle;\n}\n.ant-pagination-item {\n  display: inline-block;\n  min-width: 32px;\n  height: 32px;\n  margin-right: 8px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  line-height: 30px;\n  text-align: center;\n  vertical-align: middle;\n  list-style: none;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  outline: 0;\n  cursor: pointer;\n  user-select: none;\n}\n.ant-pagination-item a {\n  display: block;\n  padding: 0 6px;\n  color: rgba(255, 255, 255, 0.85);\n  transition: none;\n}\n.ant-pagination-item a:hover {\n  text-decoration: none;\n}\n.ant-pagination-item:hover {\n  border-color: #177ddc;\n  transition: all 0.3s;\n}\n.ant-pagination-item:hover a {\n  color: #177ddc;\n}\n.ant-pagination-item:focus-visible {\n  border-color: #177ddc;\n  transition: all 0.3s;\n}\n.ant-pagination-item:focus-visible a {\n  color: #177ddc;\n}\n.ant-pagination-item-active {\n  font-weight: 500;\n  background: transparent;\n  border-color: #177ddc;\n}\n.ant-pagination-item-active a {\n  color: #177ddc;\n}\n.ant-pagination-item-active:hover {\n  border-color: #165996;\n}\n.ant-pagination-item-active:focus-visible {\n  border-color: #165996;\n}\n.ant-pagination-item-active:hover a {\n  color: #165996;\n}\n.ant-pagination-item-active:focus-visible a {\n  color: #165996;\n}\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n  outline: 0;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container,\n.ant-pagination-jump-next .ant-pagination-item-container {\n  position: relative;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon {\n  color: #177ddc;\n  font-size: 12px;\n  letter-spacing: -1px;\n  opacity: 0;\n  transition: all 0.2s;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg {\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  margin: auto;\n}\n.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  display: block;\n  margin: auto;\n  color: rgba(255, 255, 255, 0.3);\n  font-family: Arial, Helvetica, sans-serif;\n  letter-spacing: 2px;\n  text-align: center;\n  text-indent: 0.13em;\n  opacity: 1;\n  transition: all 0.2s;\n}\n.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon,\n.ant-pagination-jump-next:hover .ant-pagination-item-link-icon {\n  opacity: 1;\n}\n.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis {\n  opacity: 0;\n}\n.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon,\n.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon {\n  opacity: 1;\n}\n.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis,\n.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis {\n  opacity: 0;\n}\n.ant-pagination-prev,\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n  margin-right: 8px;\n}\n.ant-pagination-prev,\n.ant-pagination-next,\n.ant-pagination-jump-prev,\n.ant-pagination-jump-next {\n  display: inline-block;\n  min-width: 32px;\n  height: 32px;\n  color: rgba(255, 255, 255, 0.85);\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  line-height: 32px;\n  text-align: center;\n  vertical-align: middle;\n  list-style: none;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-pagination-prev,\n.ant-pagination-next {\n  font-family: Arial, Helvetica, sans-serif;\n  outline: 0;\n}\n.ant-pagination-prev button,\n.ant-pagination-next button {\n  color: rgba(255, 255, 255, 0.85);\n  cursor: pointer;\n  user-select: none;\n}\n.ant-pagination-prev:hover button,\n.ant-pagination-next:hover button {\n  border-color: #165996;\n}\n.ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination-next .ant-pagination-item-link {\n  display: block;\n  width: 100%;\n  height: 100%;\n  padding: 0;\n  font-size: 12px;\n  text-align: center;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  outline: none;\n  transition: all 0.3s;\n}\n.ant-pagination-prev:focus-visible .ant-pagination-item-link,\n.ant-pagination-next:focus-visible .ant-pagination-item-link {\n  color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-pagination-prev:hover .ant-pagination-item-link,\n.ant-pagination-next:hover .ant-pagination-item-link {\n  color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-pagination-disabled,\n.ant-pagination-disabled:hover {\n  cursor: not-allowed;\n}\n.ant-pagination-disabled .ant-pagination-item-link,\n.ant-pagination-disabled:hover .ant-pagination-item-link {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-pagination-disabled:focus-visible {\n  cursor: not-allowed;\n}\n.ant-pagination-disabled:focus-visible .ant-pagination-item-link {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-pagination-slash {\n  margin: 0 10px 0 5px;\n}\n.ant-pagination-options {\n  display: inline-block;\n  margin-left: 16px;\n  vertical-align: middle;\n}\n@media all and (-ms-high-contrast: none) {\n  .ant-pagination-options *::-ms-backdrop,\n  .ant-pagination-options {\n    vertical-align: top;\n  }\n}\n.ant-pagination-options-size-changer.ant-select {\n  display: inline-block;\n  width: auto;\n}\n.ant-pagination-options-quick-jumper {\n  display: inline-block;\n  height: 32px;\n  margin-left: 8px;\n  line-height: 32px;\n  vertical-align: top;\n}\n.ant-pagination-options-quick-jumper input {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  min-width: 0;\n  padding: 4px 11px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 1.5715;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s;\n  width: 50px;\n  height: 32px;\n  margin: 0 8px;\n}\n.ant-pagination-options-quick-jumper input::placeholder {\n  color: rgba(255, 255, 255, 0.3);\n  user-select: none;\n}\n.ant-pagination-options-quick-jumper input:placeholder-shown {\n  text-overflow: ellipsis;\n}\n.ant-pagination-options-quick-jumper input:hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-pagination-options-quick-jumper input:hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-pagination-options-quick-jumper input:focus,\n.ant-pagination-options-quick-jumper input-focused {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-pagination-options-quick-jumper input:focus,\n.ant-input-rtl .ant-pagination-options-quick-jumper input-focused {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-pagination-options-quick-jumper input-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-pagination-options-quick-jumper input-disabled:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-pagination-options-quick-jumper input[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  box-shadow: none;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.ant-pagination-options-quick-jumper input[disabled]:hover {\n  border-color: #434343;\n  border-right-width: 1px;\n}\n.ant-pagination-options-quick-jumper input-borderless,\n.ant-pagination-options-quick-jumper input-borderless:hover,\n.ant-pagination-options-quick-jumper input-borderless:focus,\n.ant-pagination-options-quick-jumper input-borderless-focused,\n.ant-pagination-options-quick-jumper input-borderless-disabled,\n.ant-pagination-options-quick-jumper input-borderless[disabled] {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n}\ntextarea.ant-pagination-options-quick-jumper input {\n  max-width: 100%;\n  height: auto;\n  min-height: 32px;\n  line-height: 1.5715;\n  vertical-align: bottom;\n  transition: all 0.3s, height 0s;\n}\n.ant-pagination-options-quick-jumper input-lg {\n  padding: 6.5px 11px;\n  font-size: 16px;\n}\n.ant-pagination-options-quick-jumper input-sm {\n  padding: 0px 7px;\n}\n.ant-pagination-options-quick-jumper input-rtl {\n  direction: rtl;\n}\n.ant-pagination-simple .ant-pagination-prev,\n.ant-pagination-simple .ant-pagination-next {\n  height: 24px;\n  line-height: 24px;\n  vertical-align: top;\n}\n.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link {\n  height: 24px;\n  background-color: transparent;\n  border: 0;\n}\n.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link::after,\n.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link::after {\n  height: 24px;\n  line-height: 24px;\n}\n.ant-pagination-simple .ant-pagination-simple-pager {\n  display: inline-block;\n  height: 24px;\n  margin-right: 8px;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input {\n  box-sizing: border-box;\n  height: 100%;\n  margin-right: 8px;\n  padding: 0 6px;\n  text-align: center;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  outline: none;\n  transition: border-color 0.3s;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input:hover {\n  border-color: #177ddc;\n}\n.ant-pagination-simple .ant-pagination-simple-pager input:focus {\n  border-color: #3c9be8;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n}\n.ant-pagination-simple .ant-pagination-simple-pager input[disabled] {\n  color: rgba(255, 255, 255, 0.3);\n  background: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-total-text,\n.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager {\n  height: 24px;\n  line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-item {\n  min-width: 24px;\n  height: 24px;\n  margin: 0;\n  line-height: 22px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active) {\n  background: transparent;\n  border-color: transparent;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev,\n.ant-pagination.ant-pagination-mini .ant-pagination-next {\n  min-width: 24px;\n  height: 24px;\n  margin: 0;\n  line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link,\n.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link {\n  background: transparent;\n  border-color: transparent;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link::after,\n.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link::after {\n  height: 24px;\n  line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev,\n.ant-pagination.ant-pagination-mini .ant-pagination-jump-next {\n  height: 24px;\n  margin-right: 0;\n  line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options {\n  margin-left: 2px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer {\n  top: 0px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper {\n  height: 24px;\n  line-height: 24px;\n}\n.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input {\n  padding: 0px 7px;\n  width: 44px;\n  height: 24px;\n}\n.ant-pagination.ant-pagination-disabled {\n  cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item {\n  background: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item a {\n  color: rgba(255, 255, 255, 0.3);\n  background: transparent;\n  border: none;\n  cursor: not-allowed;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-active {\n  background: rgba(255, 255, 255, 0.25);\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a {\n  color: #000;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-link {\n  color: rgba(255, 255, 255, 0.3);\n  background: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link {\n  background: transparent;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon {\n  opacity: 0;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis {\n  opacity: 1;\n}\n.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager {\n  color: rgba(255, 255, 255, 0.3);\n}\n@media only screen and (max-width: 992px) {\n  .ant-pagination-item-after-jump-prev,\n  .ant-pagination-item-before-jump-next {\n    display: none;\n  }\n}\n@media only screen and (max-width: 576px) {\n  .ant-pagination-options {\n    display: none;\n  }\n}\n.ant-pagination-rtl .ant-pagination-total-text {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-item,\n.ant-pagination-rtl .ant-pagination-prev,\n.ant-pagination-rtl .ant-pagination-jump-prev,\n.ant-pagination-rtl .ant-pagination-jump-next {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-slash {\n  margin: 0 5px 0 10px;\n}\n.ant-pagination-rtl .ant-pagination-options {\n  margin-right: 16px;\n  margin-left: 0;\n}\n.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper {\n  margin-left: 0;\n}\n.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options {\n  margin-right: 2px;\n  margin-left: 0;\n}\n.ant-popconfirm {\n  z-index: 1060;\n}\n.ant-popover {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1030;\n  max-width: 100vw;\n  font-weight: normal;\n  white-space: normal;\n  text-align: left;\n  cursor: auto;\n  user-select: text;\n}\n.ant-popover-content {\n  position: relative;\n}\n.ant-popover::after {\n  position: absolute;\n  background: rgba(255, 255, 255, 0.01);\n  content: '';\n}\n.ant-popover-hidden {\n  display: none;\n}\n.ant-popover-placement-top,\n.ant-popover-placement-topLeft,\n.ant-popover-placement-topRight {\n  padding-bottom: 15.3137085px;\n}\n.ant-popover-placement-right,\n.ant-popover-placement-rightTop,\n.ant-popover-placement-rightBottom {\n  padding-left: 15.3137085px;\n}\n.ant-popover-placement-bottom,\n.ant-popover-placement-bottomLeft,\n.ant-popover-placement-bottomRight {\n  padding-top: 15.3137085px;\n}\n.ant-popover-placement-left,\n.ant-popover-placement-leftTop,\n.ant-popover-placement-leftBottom {\n  padding-right: 15.3137085px;\n}\n.ant-popover-inner {\n  background-color: #1f1f1f;\n  background-clip: padding-box;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .ant-popover {\n    /* IE10+ */\n  }\n  .ant-popover-inner {\n    box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n  }\n}\n.ant-popover-title {\n  min-width: 177px;\n  min-height: 32px;\n  margin: 0;\n  padding: 5px 16px 4px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  border-bottom: 1px solid #303030;\n}\n.ant-popover-inner-content {\n  width: max-content;\n  max-width: 100%;\n  padding: 12px 16px;\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-popover-message {\n  display: flex;\n  padding: 4px 0 12px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n}\n.ant-popover-message-icon {\n  display: inline-block;\n  margin-right: 8px;\n  color: #d89614;\n  font-size: 14px;\n}\n.ant-popover-buttons {\n  margin-bottom: 4px;\n  text-align: right;\n}\n.ant-popover-buttons button:not(:first-child) {\n  margin-left: 8px;\n}\n.ant-popover-arrow {\n  position: absolute;\n  display: block;\n  width: 22px;\n  height: 22px;\n  overflow: hidden;\n  background: transparent;\n  pointer-events: none;\n}\n.ant-popover-arrow-content {\n  --antd-arrow-background-color: #1f1f1f;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  display: block;\n  width: 11.3137085px;\n  height: 11.3137085px;\n  margin: auto;\n  content: '';\n  pointer-events: auto;\n  border-radius: 0 0 2px;\n  pointer-events: none;\n}\n.ant-popover-arrow-content::before {\n  position: absolute;\n  top: -11.3137085px;\n  left: -11.3137085px;\n  width: 33.9411255px;\n  height: 33.9411255px;\n  background: var(--antd-arrow-background-color);\n  background-repeat: no-repeat;\n  background-position: -10px -10px;\n  content: '';\n  clip-path: inset(33% 33%);\n  clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-popover-placement-top .ant-popover-arrow,\n.ant-popover-placement-topLeft .ant-popover-arrow,\n.ant-popover-placement-topRight .ant-popover-arrow {\n  bottom: 0;\n  transform: translateY(100%);\n}\n.ant-popover-placement-top .ant-popover-arrow-content,\n.ant-popover-placement-topLeft .ant-popover-arrow-content,\n.ant-popover-placement-topRight .ant-popover-arrow-content {\n  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateY(-11px) rotate(45deg);\n}\n.ant-popover-placement-top .ant-popover-arrow {\n  left: 50%;\n  transform: translateY(100%) translateX(-50%);\n}\n.ant-popover-placement-topLeft .ant-popover-arrow {\n  left: 16px;\n}\n.ant-popover-placement-topRight .ant-popover-arrow {\n  right: 16px;\n}\n.ant-popover-placement-right .ant-popover-arrow,\n.ant-popover-placement-rightTop .ant-popover-arrow,\n.ant-popover-placement-rightBottom .ant-popover-arrow {\n  left: 0;\n  transform: translateX(-100%);\n}\n.ant-popover-placement-right .ant-popover-arrow-content,\n.ant-popover-placement-rightTop .ant-popover-arrow-content,\n.ant-popover-placement-rightBottom .ant-popover-arrow-content {\n  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateX(11px) rotate(135deg);\n}\n.ant-popover-placement-right .ant-popover-arrow {\n  top: 50%;\n  transform: translateX(-100%) translateY(-50%);\n}\n.ant-popover-placement-rightTop .ant-popover-arrow {\n  top: 12px;\n}\n.ant-popover-placement-rightBottom .ant-popover-arrow {\n  bottom: 12px;\n}\n.ant-popover-placement-bottom .ant-popover-arrow,\n.ant-popover-placement-bottomLeft .ant-popover-arrow,\n.ant-popover-placement-bottomRight .ant-popover-arrow {\n  top: 0;\n  transform: translateY(-100%);\n}\n.ant-popover-placement-bottom .ant-popover-arrow-content,\n.ant-popover-placement-bottomLeft .ant-popover-arrow-content,\n.ant-popover-placement-bottomRight .ant-popover-arrow-content {\n  box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.06);\n  transform: translateY(11px) rotate(-135deg);\n}\n.ant-popover-placement-bottom .ant-popover-arrow {\n  left: 50%;\n  transform: translateY(-100%) translateX(-50%);\n}\n.ant-popover-placement-bottomLeft .ant-popover-arrow {\n  left: 16px;\n}\n.ant-popover-placement-bottomRight .ant-popover-arrow {\n  right: 16px;\n}\n.ant-popover-placement-left .ant-popover-arrow,\n.ant-popover-placement-leftTop .ant-popover-arrow,\n.ant-popover-placement-leftBottom .ant-popover-arrow {\n  right: 0;\n  transform: translateX(100%);\n}\n.ant-popover-placement-left .ant-popover-arrow-content,\n.ant-popover-placement-leftTop .ant-popover-arrow-content,\n.ant-popover-placement-leftBottom .ant-popover-arrow-content {\n  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateX(-11px) rotate(-45deg);\n}\n.ant-popover-placement-left .ant-popover-arrow {\n  top: 50%;\n  transform: translateX(100%) translateY(-50%);\n}\n.ant-popover-placement-leftTop .ant-popover-arrow {\n  top: 12px;\n}\n.ant-popover-placement-leftBottom .ant-popover-arrow {\n  bottom: 12px;\n}\n.ant-popover-pink .ant-popover-inner {\n  background-color: #cb2b83;\n}\n.ant-popover-pink .ant-popover-arrow-content {\n  background-color: #cb2b83;\n}\n.ant-popover-magenta .ant-popover-inner {\n  background-color: #cb2b83;\n}\n.ant-popover-magenta .ant-popover-arrow-content {\n  background-color: #cb2b83;\n}\n.ant-popover-red .ant-popover-inner {\n  background-color: #d32029;\n}\n.ant-popover-red .ant-popover-arrow-content {\n  background-color: #d32029;\n}\n.ant-popover-volcano .ant-popover-inner {\n  background-color: #d84a1b;\n}\n.ant-popover-volcano .ant-popover-arrow-content {\n  background-color: #d84a1b;\n}\n.ant-popover-orange .ant-popover-inner {\n  background-color: #d87a16;\n}\n.ant-popover-orange .ant-popover-arrow-content {\n  background-color: #d87a16;\n}\n.ant-popover-yellow .ant-popover-inner {\n  background-color: #d8bd14;\n}\n.ant-popover-yellow .ant-popover-arrow-content {\n  background-color: #d8bd14;\n}\n.ant-popover-gold .ant-popover-inner {\n  background-color: #d89614;\n}\n.ant-popover-gold .ant-popover-arrow-content {\n  background-color: #d89614;\n}\n.ant-popover-cyan .ant-popover-inner {\n  background-color: #13a8a8;\n}\n.ant-popover-cyan .ant-popover-arrow-content {\n  background-color: #13a8a8;\n}\n.ant-popover-lime .ant-popover-inner {\n  background-color: #8bbb11;\n}\n.ant-popover-lime .ant-popover-arrow-content {\n  background-color: #8bbb11;\n}\n.ant-popover-green .ant-popover-inner {\n  background-color: #49aa19;\n}\n.ant-popover-green .ant-popover-arrow-content {\n  background-color: #49aa19;\n}\n.ant-popover-blue .ant-popover-inner {\n  background-color: #177ddc;\n}\n.ant-popover-blue .ant-popover-arrow-content {\n  background-color: #177ddc;\n}\n.ant-popover-geekblue .ant-popover-inner {\n  background-color: #2b4acb;\n}\n.ant-popover-geekblue .ant-popover-arrow-content {\n  background-color: #2b4acb;\n}\n.ant-popover-purple .ant-popover-inner {\n  background-color: #642ab5;\n}\n.ant-popover-purple .ant-popover-arrow-content {\n  background-color: #642ab5;\n}\n.ant-popover-rtl {\n  direction: rtl;\n  text-align: right;\n}\n.ant-popover-rtl .ant-popover-message-icon {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-popover-rtl .ant-popover-message-title {\n  padding-left: 16px;\n}\n.ant-popover-rtl .ant-popover-buttons {\n  text-align: left;\n}\n.ant-popover-rtl .ant-popover-buttons button {\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-progress {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n}\n.ant-progress-line {\n  position: relative;\n  width: 100%;\n  font-size: 14px;\n}\n.ant-progress-steps {\n  display: inline-block;\n}\n.ant-progress-steps-outer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n.ant-progress-steps-item {\n  flex-shrink: 0;\n  min-width: 2px;\n  margin-right: 2px;\n  background: rgba(255, 255, 255, 0.08);\n  transition: all 0.3s;\n}\n.ant-progress-steps-item-active {\n  background: #177ddc;\n}\n.ant-progress-small.ant-progress-line,\n.ant-progress-small.ant-progress-line .ant-progress-text .anticon {\n  font-size: 12px;\n}\n.ant-progress-outer {\n  display: inline-block;\n  width: 100%;\n  margin-right: 0;\n  padding-right: 0;\n}\n.ant-progress-show-info .ant-progress-outer {\n  margin-right: calc(-2em - 8px);\n  padding-right: calc(2em + 8px);\n}\n.ant-progress-inner {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  overflow: hidden;\n  vertical-align: middle;\n  background-color: rgba(255, 255, 255, 0.08);\n  border-radius: 100px;\n}\n.ant-progress-circle-trail {\n  stroke: rgba(255, 255, 255, 0.08);\n}\n.ant-progress-circle-path {\n  animation: ant-progress-appear 0.3s;\n}\n.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n  stroke: #177ddc;\n}\n.ant-progress-success-bg,\n.ant-progress-bg {\n  position: relative;\n  background-color: #177ddc;\n  border-radius: 100px;\n  transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;\n}\n.ant-progress-success-bg {\n  position: absolute;\n  top: 0;\n  left: 0;\n  background-color: #49aa19;\n}\n.ant-progress-text {\n  display: inline-block;\n  width: 2em;\n  margin-left: 8px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 1em;\n  line-height: 1;\n  white-space: nowrap;\n  text-align: left;\n  vertical-align: middle;\n  word-break: normal;\n}\n.ant-progress-text .anticon {\n  font-size: 14px;\n}\n.ant-progress-status-active .ant-progress-bg::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: #141414;\n  border-radius: 10px;\n  opacity: 0;\n  animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;\n  content: '';\n}\n.ant-progress-status-exception .ant-progress-bg {\n  background-color: #a61d24;\n}\n.ant-progress-status-exception .ant-progress-text {\n  color: #a61d24;\n}\n.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n  stroke: #a61d24;\n}\n.ant-progress-status-success .ant-progress-bg {\n  background-color: #49aa19;\n}\n.ant-progress-status-success .ant-progress-text {\n  color: #49aa19;\n}\n.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path {\n  stroke: #49aa19;\n}\n.ant-progress-circle .ant-progress-inner {\n  position: relative;\n  line-height: 1;\n  background-color: transparent;\n}\n.ant-progress-circle .ant-progress-text {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 1em;\n  line-height: 1;\n  white-space: normal;\n  text-align: center;\n  transform: translate(-50%, -50%);\n}\n.ant-progress-circle .ant-progress-text .anticon {\n  font-size: 1.16666667em;\n}\n.ant-progress-circle.ant-progress-status-exception .ant-progress-text {\n  color: #a61d24;\n}\n.ant-progress-circle.ant-progress-status-success .ant-progress-text {\n  color: #49aa19;\n}\n@keyframes ant-progress-active {\n  0% {\n    transform: translateX(-100%) scaleX(0);\n    opacity: 0.1;\n  }\n  20% {\n    transform: translateX(-100%) scaleX(0);\n    opacity: 0.5;\n  }\n  100% {\n    transform: translateX(0) scaleX(1);\n    opacity: 0;\n  }\n}\n.ant-progress-rtl {\n  direction: rtl;\n}\n.ant-progress-rtl.ant-progress-show-info .ant-progress-outer {\n  margin-right: 0;\n  margin-left: calc(-2em - 8px);\n  padding-right: 0;\n  padding-left: calc(2em + 8px);\n}\n.ant-progress-rtl .ant-progress-success-bg {\n  right: 0;\n  left: auto;\n}\n.ant-progress-rtl.ant-progress-line .ant-progress-text,\n.ant-progress-rtl.ant-progress-steps .ant-progress-text {\n  margin-right: 8px;\n  margin-left: 0;\n  text-align: right;\n}\n.ant-radio-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n  font-size: 0;\n}\n.ant-radio-group .ant-badge-count {\n  z-index: 1;\n}\n.ant-radio-group > .ant-badge:not(:first-child) > .ant-radio-button-wrapper {\n  border-left: none;\n}\n.ant-radio-wrapper {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-flex;\n  align-items: baseline;\n  margin-right: 8px;\n  cursor: pointer;\n}\n.ant-radio-wrapper-disabled {\n  cursor: not-allowed;\n}\n.ant-radio-wrapper::after {\n  display: inline-block;\n  width: 0;\n  overflow: hidden;\n  content: '\\a0';\n}\n.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type='radio'] {\n  width: 14px;\n  height: 14px;\n}\n.ant-radio {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  top: 0.2em;\n  display: inline-block;\n  outline: none;\n  cursor: pointer;\n}\n.ant-radio-wrapper:hover .ant-radio,\n.ant-radio:hover .ant-radio-inner,\n.ant-radio-input:focus + .ant-radio-inner {\n  border-color: #177ddc;\n}\n.ant-radio-input:focus + .ant-radio-inner {\n  box-shadow: 0 0 0 3px rgba(23, 125, 220, 0.12);\n}\n.ant-radio-checked::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 50%;\n  visibility: hidden;\n  animation: antRadioEffect 0.36s ease-in-out;\n  animation-fill-mode: both;\n  content: '';\n}\n.ant-radio:hover::after,\n.ant-radio-wrapper:hover .ant-radio::after {\n  visibility: visible;\n}\n.ant-radio-inner {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 16px;\n  height: 16px;\n  background-color: transparent;\n  border-color: #434343;\n  border-style: solid;\n  border-width: 1px;\n  border-radius: 50%;\n  transition: all 0.3s;\n}\n.ant-radio-inner::after {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  display: block;\n  width: 16px;\n  height: 16px;\n  margin-top: -8px;\n  margin-left: -8px;\n  background-color: #177ddc;\n  border-top: 0;\n  border-left: 0;\n  border-radius: 16px;\n  transform: scale(0);\n  opacity: 0;\n  transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n  content: ' ';\n}\n.ant-radio-input {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  cursor: pointer;\n  opacity: 0;\n}\n.ant-radio.ant-radio-disabled .ant-radio-inner {\n  border-color: #434343;\n}\n.ant-radio-checked .ant-radio-inner {\n  border-color: #177ddc;\n}\n.ant-radio-checked .ant-radio-inner::after {\n  transform: scale(0.5);\n  opacity: 1;\n  transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-radio-disabled {\n  cursor: not-allowed;\n}\n.ant-radio-disabled .ant-radio-inner {\n  background-color: rgba(255, 255, 255, 0.08);\n  cursor: not-allowed;\n}\n.ant-radio-disabled .ant-radio-inner::after {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.ant-radio-disabled .ant-radio-input {\n  cursor: not-allowed;\n}\n.ant-radio-disabled + span {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\nspan.ant-radio + * {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-radio-button-wrapper {\n  position: relative;\n  display: inline-block;\n  height: 32px;\n  margin: 0;\n  padding: 0 15px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  line-height: 30px;\n  background: transparent;\n  border: 1px solid #434343;\n  border-top-width: 1.02px;\n  border-left-width: 0;\n  cursor: pointer;\n  transition: color 0.3s, background 0.3s, border-color 0.3s, box-shadow 0.3s;\n}\n.ant-radio-button-wrapper a {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-radio-button-wrapper > .ant-radio-button {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: -1;\n  width: 100%;\n  height: 100%;\n}\n.ant-radio-group-large .ant-radio-button-wrapper {\n  height: 40px;\n  font-size: 16px;\n  line-height: 38px;\n}\n.ant-radio-group-small .ant-radio-button-wrapper {\n  height: 24px;\n  padding: 0 7px;\n  line-height: 22px;\n}\n.ant-radio-button-wrapper:not(:first-child)::before {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  display: block;\n  box-sizing: content-box;\n  width: 1px;\n  height: 100%;\n  padding: 1px 0;\n  background-color: #434343;\n  transition: background-color 0.3s;\n  content: '';\n}\n.ant-radio-button-wrapper:first-child {\n  border-left: 1px solid #434343;\n  border-radius: 2px 0 0 2px;\n}\n.ant-radio-button-wrapper:last-child {\n  border-radius: 0 2px 2px 0;\n}\n.ant-radio-button-wrapper:first-child:last-child {\n  border-radius: 2px;\n}\n.ant-radio-button-wrapper:hover {\n  position: relative;\n  color: #177ddc;\n}\n.ant-radio-button-wrapper:focus-within {\n  box-shadow: 0 0 0 3px rgba(23, 125, 220, 0.12);\n}\n.ant-radio-button-wrapper .ant-radio-inner,\n.ant-radio-button-wrapper input[type='checkbox'],\n.ant-radio-button-wrapper input[type='radio'] {\n  width: 0;\n  height: 0;\n  opacity: 0;\n  pointer-events: none;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {\n  z-index: 1;\n  color: #177ddc;\n  background: transparent;\n  border-color: #177ddc;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {\n  background-color: #177ddc;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child {\n  border-color: #177ddc;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {\n  color: #165996;\n  border-color: #165996;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before {\n  background-color: #165996;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active {\n  color: #388ed3;\n  border-color: #388ed3;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active::before {\n  background-color: #388ed3;\n}\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {\n  box-shadow: 0 0 0 3px rgba(23, 125, 220, 0.12);\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {\n  color: #fff;\n  background: #177ddc;\n  border-color: #177ddc;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {\n  color: #fff;\n  background: #165996;\n  border-color: #165996;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active {\n  color: #fff;\n  background: #388ed3;\n  border-color: #388ed3;\n}\n.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {\n  box-shadow: 0 0 0 3px rgba(23, 125, 220, 0.12);\n}\n.ant-radio-button-wrapper-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n  cursor: not-allowed;\n}\n.ant-radio-button-wrapper-disabled:first-child,\n.ant-radio-button-wrapper-disabled:hover {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343;\n}\n.ant-radio-button-wrapper-disabled:first-child {\n  border-left-color: #434343;\n}\n.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked {\n  color: rgba(255, 255, 255, 0.3);\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: #434343;\n  box-shadow: none;\n}\n@keyframes antRadioEffect {\n  0% {\n    transform: scale(1);\n    opacity: 0.5;\n  }\n  100% {\n    transform: scale(1.6);\n    opacity: 0;\n  }\n}\n.ant-radio-group.ant-radio-group-rtl {\n  direction: rtl;\n}\n.ant-radio-wrapper.ant-radio-wrapper-rtl {\n  margin-right: 0;\n  margin-left: 8px;\n  direction: rtl;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl {\n  border-right-width: 0;\n  border-left-width: 1px;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child)::before {\n  right: -1px;\n  left: 0;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child {\n  border-right: 1px solid #434343;\n  border-radius: 0 2px 2px 0;\n}\n.ant-radio-button-wrapper-checked:not([class*=' ant-radio-button-wrapper-disabled']).ant-radio-button-wrapper:first-child {\n  border-right-color: #165996;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child {\n  border-radius: 2px 0 0 2px;\n}\n.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child {\n  border-right-color: #434343;\n}\n.ant-rate {\n  box-sizing: border-box;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n  margin: 0;\n  padding: 0;\n  color: #d8bd14;\n  font-size: 20px;\n  line-height: unset;\n  list-style: none;\n  outline: none;\n}\n.ant-rate-disabled .ant-rate-star {\n  cursor: default;\n}\n.ant-rate-disabled .ant-rate-star > div:hover {\n  transform: scale(1);\n}\n.ant-rate-star {\n  position: relative;\n  display: inline-block;\n  color: inherit;\n  cursor: pointer;\n}\n.ant-rate-star:not(:last-child) {\n  margin-right: 8px;\n}\n.ant-rate-star > div {\n  transition: all 0.3s, outline 0s;\n}\n.ant-rate-star > div:hover {\n  transform: scale(1.1);\n}\n.ant-rate-star > div:focus {\n  outline: 0;\n}\n.ant-rate-star > div:focus-visible {\n  outline: 1px dashed #d8bd14;\n  transform: scale(1.1);\n}\n.ant-rate-star-first,\n.ant-rate-star-second {\n  color: rgba(255, 255, 255, 0.12);\n  transition: all 0.3s;\n  user-select: none;\n}\n.ant-rate-star-first .anticon,\n.ant-rate-star-second .anticon {\n  vertical-align: middle;\n}\n.ant-rate-star-first {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 50%;\n  height: 100%;\n  overflow: hidden;\n  opacity: 0;\n}\n.ant-rate-star-half .ant-rate-star-first,\n.ant-rate-star-half .ant-rate-star-second {\n  opacity: 1;\n}\n.ant-rate-star-half .ant-rate-star-first,\n.ant-rate-star-full .ant-rate-star-second {\n  color: inherit;\n}\n.ant-rate-text {\n  display: inline-block;\n  margin: 0 8px;\n  font-size: 14px;\n}\n.ant-rate-rtl {\n  direction: rtl;\n}\n.ant-rate-rtl .ant-rate-star:not(:last-child) {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-rate-rtl .ant-rate-star-first {\n  right: 0;\n  left: auto;\n}\n.ant-result {\n  padding: 48px 32px;\n}\n.ant-result-success .ant-result-icon > .anticon {\n  color: #49aa19;\n}\n.ant-result-error .ant-result-icon > .anticon {\n  color: #a61d24;\n}\n.ant-result-info .ant-result-icon > .anticon {\n  color: #177ddc;\n}\n.ant-result-warning .ant-result-icon > .anticon {\n  color: #d89614;\n}\n.ant-result-image {\n  width: 250px;\n  height: 295px;\n  margin: auto;\n}\n.ant-result-icon {\n  margin-bottom: 24px;\n  text-align: center;\n}\n.ant-result-icon > .anticon {\n  font-size: 72px;\n}\n.ant-result-title {\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 24px;\n  line-height: 1.8;\n  text-align: center;\n}\n.ant-result-subtitle {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  line-height: 1.6;\n  text-align: center;\n}\n.ant-result-extra {\n  margin: 24px 0 0 0;\n  text-align: center;\n}\n.ant-result-extra > * {\n  margin-right: 8px;\n}\n.ant-result-extra > *:last-child {\n  margin-right: 0;\n}\n.ant-result-content {\n  margin-top: 24px;\n  padding: 24px 40px;\n  background-color: rgba(255, 255, 255, 0.04);\n}\n.ant-result-rtl {\n  direction: rtl;\n}\n.ant-result-rtl .ant-result-extra > * {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-result-rtl .ant-result-extra > *:last-child {\n  margin-left: 0;\n}\n.segmented-disabled-item,\n.segmented-disabled-item:hover,\n.segmented-disabled-item:focus {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.segmented-item-selected {\n  background-color: #333333;\n  border-radius: 2px;\n  box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n}\n.segmented-text-ellipsis {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  word-break: keep-all;\n}\n.ant-segmented {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n  padding: 2px;\n  color: rgba(255, 255, 255, 0.65);\n  background-color: rgba(0, 0, 0, 0.25);\n  border-radius: 2px;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-segmented-group {\n  position: relative;\n  display: flex;\n  align-items: stretch;\n  justify-items: flex-start;\n  width: 100%;\n}\n.ant-segmented.ant-segmented-block {\n  display: flex;\n}\n.ant-segmented.ant-segmented-block .ant-segmented-item {\n  flex: 1;\n  min-width: 0;\n}\n.ant-segmented:not(.ant-segmented-disabled):hover,\n.ant-segmented:not(.ant-segmented-disabled):focus {\n  background-color: rgba(0, 0, 0, 0.45);\n}\n.ant-segmented-item {\n  position: relative;\n  text-align: center;\n  cursor: pointer;\n  transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-segmented-item-selected {\n  background-color: #333333;\n  border-radius: 2px;\n  box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-segmented-item:hover,\n.ant-segmented-item:focus {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-segmented-item-label {\n  min-height: 28px;\n  padding: 0 11px;\n  line-height: 28px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  word-break: keep-all;\n}\n.ant-segmented-item-icon + * {\n  margin-left: 6px;\n}\n.ant-segmented-item-input {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0;\n  height: 0;\n  opacity: 0;\n  pointer-events: none;\n}\n.ant-segmented.ant-segmented-lg .ant-segmented-item-label {\n  min-height: 36px;\n  padding: 0 11px;\n  font-size: 16px;\n  line-height: 36px;\n}\n.ant-segmented.ant-segmented-sm .ant-segmented-item-label {\n  min-height: 20px;\n  padding: 0 7px;\n  line-height: 20px;\n}\n.ant-segmented-item-disabled,\n.ant-segmented-item-disabled:hover,\n.ant-segmented-item-disabled:focus {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-segmented-thumb {\n  background-color: #333333;\n  border-radius: 2px;\n  box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.07), 0 0 1px 0 rgba(0, 0, 0, 0.08);\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0;\n  height: 100%;\n  padding: 4px 0;\n}\n.ant-segmented-thumb-motion-appear-active {\n  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  will-change: transform, width;\n}\n.ant-segmented.ant-segmented-rtl {\n  direction: rtl;\n}\n.ant-segmented.ant-segmented-rtl .ant-segmented-item-icon {\n  margin-right: 0;\n  margin-left: 6px;\n}\n.ant-select-single .ant-select-selector {\n  display: flex;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-search {\n  position: absolute;\n  top: 0;\n  right: 11px;\n  bottom: 0;\n  left: 11px;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-search-input {\n  width: 100%;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-item,\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n  padding: 0;\n  line-height: 30px;\n  transition: all 0.3s, visibility 0s;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-item {\n  position: relative;\n  user-select: none;\n}\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n  transition: none;\n  pointer-events: none;\n}\n.ant-select-single .ant-select-selector::after,\n.ant-select-single .ant-select-selector .ant-select-selection-item::after,\n.ant-select-single .ant-select-selector .ant-select-selection-placeholder::after {\n  display: inline-block;\n  width: 0;\n  visibility: hidden;\n  content: '\\a0';\n}\n.ant-select-single.ant-select-show-arrow .ant-select-selection-search {\n  right: 25px;\n}\n.ant-select-single.ant-select-show-arrow .ant-select-selection-item,\n.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder {\n  padding-right: 18px;\n}\n.ant-select-single.ant-select-open .ant-select-selection-item {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {\n  width: 100%;\n  height: 32px;\n  padding: 0 11px;\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input {\n  height: 30px;\n}\n.ant-select-single:not(.ant-select-customize-input) .ant-select-selector::after {\n  line-height: 30px;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector::after {\n  display: none;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search {\n  position: static;\n  width: 100%;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder {\n  position: absolute;\n  right: 0;\n  left: 0;\n  padding: 0 11px;\n}\n.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder::after {\n  display: none;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector {\n  height: 40px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector::after,\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder {\n  line-height: 38px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input {\n  height: 38px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector {\n  height: 24px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector::after,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder {\n  line-height: 22px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input {\n  height: 22px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search {\n  right: 7px;\n  left: 7px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector {\n  padding: 0 7px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search {\n  right: 28px;\n}\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,\n.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder {\n  padding-right: 21px;\n}\n.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector {\n  padding: 0 11px;\n}\n/**\n * Do not merge `height` & `line-height` under style with `selection` & `search`,\n * since chrome may update to redesign with its align logic.\n */\n.ant-select-selection-overflow {\n  position: relative;\n  display: flex;\n  flex: auto;\n  flex-wrap: wrap;\n  max-width: 100%;\n}\n.ant-select-selection-overflow-item {\n  flex: none;\n  align-self: center;\n  max-width: 100%;\n}\n.ant-select-multiple .ant-select-selector {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  padding: 1px 4px;\n}\n.ant-select-show-search.ant-select-multiple .ant-select-selector {\n  cursor: text;\n}\n.ant-select-disabled.ant-select-multiple .ant-select-selector {\n  background: #141414;\n  cursor: not-allowed;\n}\n.ant-select-multiple .ant-select-selector::after {\n  display: inline-block;\n  width: 0;\n  margin: 2px 0;\n  line-height: 24px;\n  visibility: hidden;\n  content: '\\a0';\n}\n.ant-select-multiple.ant-select-show-arrow .ant-select-selector,\n.ant-select-multiple.ant-select-allow-clear .ant-select-selector {\n  padding-right: 24px;\n}\n.ant-select-multiple .ant-select-selection-item {\n  position: relative;\n  display: flex;\n  flex: none;\n  box-sizing: border-box;\n  max-width: 100%;\n  height: 24px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  line-height: 22px;\n  background: rgba(255, 255, 255, 0.08);\n  border: 1px solid #303030;\n  border-radius: 2px;\n  cursor: default;\n  transition: font-size 0.3s, line-height 0.3s, height 0.3s;\n  user-select: none;\n  margin-inline-end: 4px;\n  padding-inline-start: 8px;\n  padding-inline-end: 4px;\n}\n.ant-select-disabled.ant-select-multiple .ant-select-selection-item {\n  color: #595959;\n  border-color: #1f1f1f;\n  cursor: not-allowed;\n}\n.ant-select-multiple .ant-select-selection-item-content {\n  display: inline-block;\n  margin-right: 4px;\n  overflow: hidden;\n  white-space: pre;\n  text-overflow: ellipsis;\n}\n.ant-select-multiple .ant-select-selection-item-remove {\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-align: center;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizelegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  display: inline-flex;\n  align-items: center;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: bold;\n  font-size: 10px;\n  line-height: inherit;\n  cursor: pointer;\n}\n.ant-select-multiple .ant-select-selection-item-remove > * {\n  line-height: 1;\n}\n.ant-select-multiple .ant-select-selection-item-remove svg {\n  display: inline-block;\n}\n.ant-select-multiple .ant-select-selection-item-remove::before {\n  display: none;\n}\n.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon {\n  display: block;\n}\n.ant-select-multiple .ant-select-selection-item-remove > .anticon {\n  vertical-align: middle;\n}\n.ant-select-multiple .ant-select-selection-item-remove:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n.ant-select-multiple .ant-select-selection-overflow-item + .ant-select-selection-overflow-item .ant-select-selection-search {\n  margin-inline-start: 0;\n}\n.ant-select-multiple .ant-select-selection-search {\n  position: relative;\n  max-width: 100%;\n  margin-inline-start: 7px;\n}\n.ant-select-multiple .ant-select-selection-search-input,\n.ant-select-multiple .ant-select-selection-search-mirror {\n  height: 24px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  line-height: 24px;\n  transition: all 0.3s;\n}\n.ant-select-multiple .ant-select-selection-search-input {\n  width: 100%;\n  min-width: 4.1px;\n}\n.ant-select-multiple .ant-select-selection-search-mirror {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 999;\n  white-space: pre;\n  visibility: hidden;\n}\n.ant-select-multiple .ant-select-selection-placeholder {\n  position: absolute;\n  top: 50%;\n  right: 11px;\n  left: 11px;\n  transform: translateY(-50%);\n  transition: all 0.3s;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selector::after {\n  line-height: 32px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-item {\n  height: 32px;\n  line-height: 30px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-search {\n  height: 32px;\n  line-height: 32px;\n}\n.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,\n.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror {\n  height: 32px;\n  line-height: 30px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selector::after {\n  line-height: 16px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-item {\n  height: 16px;\n  line-height: 14px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search {\n  height: 16px;\n  line-height: 16px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,\n.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror {\n  height: 16px;\n  line-height: 14px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder {\n  left: 7px;\n}\n.ant-select-multiple.ant-select-sm .ant-select-selection-search {\n  margin-inline-start: 3px;\n}\n.ant-select-disabled .ant-select-selection-item-remove {\n  display: none;\n}\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector {\n  background-color: transparent;\n  border-color: #a61d24 !important;\n}\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,\n.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector {\n  border-color: #a61d24;\n  box-shadow: 0 0 0 2px rgba(166, 29, 36, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector {\n  background-color: transparent;\n  border-color: #d89614 !important;\n}\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,\n.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector {\n  border-color: #d89614;\n  box-shadow: 0 0 0 2px rgba(216, 150, 20, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-select-status-error.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-warning.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-success.ant-select-has-feedback .ant-select-clear,\n.ant-select-status-validating.ant-select-has-feedback .ant-select-clear {\n  right: 32px;\n}\n.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,\n.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value {\n  padding-right: 42px;\n}\n/* Reset search input style */\n.ant-select {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-block;\n  cursor: pointer;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  position: relative;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n  cursor: pointer;\n}\n.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  cursor: text;\n}\n.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n  cursor: auto;\n}\n.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  color: rgba(255, 255, 255, 0.3);\n  background: rgba(255, 255, 255, 0.08);\n  cursor: not-allowed;\n}\n.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n  background: #141414;\n}\n.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input {\n  cursor: not-allowed;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input {\n  margin: 0;\n  padding: 0;\n  background: transparent;\n  border: none;\n  outline: none;\n  appearance: none;\n}\n.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button {\n  display: none;\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -webkit-appearance: none;\n}\n.ant-select:not(.ant-select-disabled):hover .ant-select-selector {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-select:not(.ant-select-disabled):hover .ant-select-selector {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-select-selection-item {\n  flex: 1;\n  overflow: hidden;\n  font-weight: normal;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n@media all and (-ms-high-contrast: none) {\n  .ant-select-selection-item *::-ms-backdrop,\n  .ant-select-selection-item {\n    flex: auto;\n  }\n}\n.ant-select-selection-placeholder {\n  flex: 1;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.3);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  pointer-events: none;\n}\n@media all and (-ms-high-contrast: none) {\n  .ant-select-selection-placeholder *::-ms-backdrop,\n  .ant-select-selection-placeholder {\n    flex: auto;\n  }\n}\n.ant-select-arrow {\n  display: inline-flex;\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizelegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  position: absolute;\n  top: 50%;\n  right: 11px;\n  display: flex;\n  align-items: center;\n  height: 12px;\n  margin-top: -6px;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 12px;\n  line-height: 1;\n  text-align: center;\n  pointer-events: none;\n}\n.ant-select-arrow > * {\n  line-height: 1;\n}\n.ant-select-arrow svg {\n  display: inline-block;\n}\n.ant-select-arrow::before {\n  display: none;\n}\n.ant-select-arrow .ant-select-arrow-icon {\n  display: block;\n}\n.ant-select-arrow .anticon {\n  vertical-align: top;\n  transition: transform 0.3s;\n}\n.ant-select-arrow .anticon > svg {\n  vertical-align: top;\n}\n.ant-select-arrow .anticon:not(.ant-select-suffix) {\n  pointer-events: auto;\n}\n.ant-select-disabled .ant-select-arrow {\n  cursor: not-allowed;\n}\n.ant-select-arrow > *:not(:last-child) {\n  margin-inline-end: 8px;\n}\n.ant-select-clear {\n  position: absolute;\n  top: 50%;\n  right: 11px;\n  z-index: 1;\n  display: inline-block;\n  width: 12px;\n  height: 12px;\n  margin-top: -6px;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 12px;\n  font-style: normal;\n  line-height: 1;\n  text-align: center;\n  text-transform: none;\n  background: #141414;\n  cursor: pointer;\n  opacity: 0;\n  transition: color 0.3s ease, opacity 0.15s ease;\n  text-rendering: auto;\n}\n.ant-select-clear::before {\n  display: block;\n}\n.ant-select-clear:hover {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-select:hover .ant-select-clear {\n  opacity: 1;\n}\n.ant-select-dropdown {\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n  z-index: 1050;\n  box-sizing: border-box;\n  padding: 4px 0;\n  overflow: hidden;\n  font-size: 14px;\n  font-variant: initial;\n  background-color: #1f1f1f;\n  border-radius: 2px;\n  outline: none;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft,\n.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft {\n  animation-name: antSlideUpIn;\n}\n.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft,\n.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft {\n  animation-name: antSlideDownIn;\n}\n.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft {\n  animation-name: antSlideUpOut;\n}\n.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft {\n  animation-name: antSlideDownOut;\n}\n.ant-select-dropdown-hidden {\n  display: none;\n}\n.ant-select-dropdown-empty {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-select-item-empty {\n  position: relative;\n  display: block;\n  min-height: 32px;\n  padding: 5px 12px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 22px;\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-select-item {\n  position: relative;\n  display: block;\n  min-height: 32px;\n  padding: 5px 12px;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 22px;\n  cursor: pointer;\n  transition: background 0.3s ease;\n}\n.ant-select-item-group {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 12px;\n  cursor: default;\n}\n.ant-select-item-option {\n  display: flex;\n}\n.ant-select-item-option-content {\n  flex: auto;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-select-item-option-state {\n  flex: none;\n}\n.ant-select-item-option-active:not(.ant-select-item-option-disabled) {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  background-color: #111b26;\n}\n.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state {\n  color: #177ddc;\n}\n.ant-select-item-option-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-select-item-option-disabled.ant-select-item-option-selected {\n  background-color: #141414;\n}\n.ant-select-item-option-grouped {\n  padding-left: 24px;\n}\n.ant-select-lg {\n  font-size: 16px;\n}\n.ant-select-borderless .ant-select-selector {\n  background-color: transparent !important;\n  border-color: transparent !important;\n  box-shadow: none !important;\n}\n.ant-select.ant-select-in-form-item {\n  width: 100%;\n}\n.ant-select-compact-item:not(.ant-select-compact-last-item) {\n  margin-right: -1px;\n}\n.ant-select-compact-item:not(.ant-select-compact-last-item).ant-select-compact-item-rtl {\n  margin-right: 0;\n  margin-left: -1px;\n}\n.ant-select-compact-item:hover > *,\n.ant-select-compact-item:focus > *,\n.ant-select-compact-item:active > * {\n  z-index: 2;\n}\n.ant-select-compact-item.ant-select-focused > * {\n  z-index: 2;\n}\n.ant-select-compact-item[disabled] > * {\n  z-index: 0;\n}\n.ant-select-compact-item:not(.ant-select-compact-first-item):not(.ant-select-compact-last-item).ant-select > .ant-select-selector {\n  border-radius: 0;\n}\n.ant-select-compact-item.ant-select-compact-first-item.ant-select:not(.ant-select-compact-last-item):not(.ant-select-compact-item-rtl) > .ant-select-selector {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-select-compact-item.ant-select-compact-last-item.ant-select:not(.ant-select-compact-first-item):not(.ant-select-compact-item-rtl) > .ant-select-selector {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not(.ant-select-compact-last-item) > .ant-select-selector {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not(.ant-select-compact-first-item) > .ant-select-selector {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-select-rtl {\n  direction: rtl;\n}\n.ant-select-rtl .ant-select-arrow {\n  right: initial;\n  left: 11px;\n}\n.ant-select-rtl .ant-select-clear {\n  right: initial;\n  left: 11px;\n}\n.ant-select-dropdown-rtl {\n  direction: rtl;\n}\n.ant-select-dropdown-rtl .ant-select-item-option-grouped {\n  padding-right: 24px;\n  padding-left: 12px;\n}\n.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector,\n.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector {\n  padding-right: 4px;\n  padding-left: 24px;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-item {\n  text-align: right;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content {\n  margin-right: 0;\n  margin-left: 4px;\n  text-align: right;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror {\n  right: 0;\n  left: auto;\n}\n.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder {\n  right: 11px;\n  left: auto;\n}\n.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder {\n  right: 7px;\n}\n.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,\n.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder {\n  right: 0;\n  left: 9px;\n  text-align: right;\n}\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search {\n  right: 11px;\n  left: 25px;\n}\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,\n.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder {\n  padding-right: 0;\n  padding-left: 18px;\n}\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search {\n  right: 6px;\n}\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,\n.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder {\n  padding-right: 0;\n  padding-left: 21px;\n}\n.ant-skeleton {\n  display: table;\n  width: 100%;\n}\n.ant-skeleton-header {\n  display: table-cell;\n  padding-right: 16px;\n  vertical-align: top;\n}\n.ant-skeleton-header .ant-skeleton-avatar {\n  display: inline-block;\n  vertical-align: top;\n  background: rgba(190, 190, 190, 0.2);\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n}\n.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-header .ant-skeleton-avatar-lg {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n}\n.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-header .ant-skeleton-avatar-sm {\n  width: 24px;\n  height: 24px;\n  line-height: 24px;\n}\n.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-content {\n  display: table-cell;\n  width: 100%;\n  vertical-align: top;\n}\n.ant-skeleton-content .ant-skeleton-title {\n  width: 100%;\n  height: 16px;\n  background: rgba(190, 190, 190, 0.2);\n  border-radius: 2px;\n}\n.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {\n  margin-top: 24px;\n}\n.ant-skeleton-content .ant-skeleton-paragraph {\n  padding: 0;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li {\n  width: 100%;\n  height: 16px;\n  list-style: none;\n  background: rgba(190, 190, 190, 0.2);\n  border-radius: 2px;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) {\n  width: 61%;\n}\n.ant-skeleton-content .ant-skeleton-paragraph > li + li {\n  margin-top: 16px;\n}\n.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title {\n  margin-top: 12px;\n}\n.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {\n  margin-top: 28px;\n}\n.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title,\n.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph > li {\n  border-radius: 100px;\n}\n.ant-skeleton-active .ant-skeleton-title,\n.ant-skeleton-active .ant-skeleton-paragraph > li,\n.ant-skeleton-active .ant-skeleton-avatar,\n.ant-skeleton-active .ant-skeleton-button,\n.ant-skeleton-active .ant-skeleton-input,\n.ant-skeleton-active .ant-skeleton-image {\n  position: relative;\n  /* stylelint-disable-next-line property-no-vendor-prefix,value-no-vendor-prefix */\n  z-index: 0;\n  overflow: hidden;\n  background: transparent;\n}\n.ant-skeleton-active .ant-skeleton-title::after,\n.ant-skeleton-active .ant-skeleton-paragraph > li::after,\n.ant-skeleton-active .ant-skeleton-avatar::after,\n.ant-skeleton-active .ant-skeleton-button::after,\n.ant-skeleton-active .ant-skeleton-input::after,\n.ant-skeleton-active .ant-skeleton-image::after {\n  position: absolute;\n  top: 0;\n  right: -150%;\n  bottom: 0;\n  left: -150%;\n  background: linear-gradient(90deg, rgba(190, 190, 190, 0.2) 25%, rgba(255, 255, 255, 0.16) 37%, rgba(190, 190, 190, 0.2) 63%);\n  animation: ant-skeleton-loading 1.4s ease infinite;\n  content: '';\n}\n.ant-skeleton.ant-skeleton-block {\n  width: 100%;\n}\n.ant-skeleton.ant-skeleton-block .ant-skeleton-button {\n  width: 100%;\n}\n.ant-skeleton.ant-skeleton-block .ant-skeleton-input {\n  width: 100%;\n}\n.ant-skeleton-element {\n  display: inline-block;\n  width: auto;\n}\n.ant-skeleton-element .ant-skeleton-button {\n  display: inline-block;\n  vertical-align: top;\n  background: rgba(190, 190, 190, 0.2);\n  border-radius: 2px;\n  width: 64px;\n  min-width: 64px;\n  height: 32px;\n  line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square {\n  width: 32px;\n  min-width: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle {\n  width: 32px;\n  min-width: 32px;\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round {\n  border-radius: 32px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg {\n  width: 80px;\n  min-width: 80px;\n  height: 40px;\n  line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square {\n  width: 40px;\n  min-width: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle {\n  width: 40px;\n  min-width: 40px;\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round {\n  border-radius: 40px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm {\n  width: 48px;\n  min-width: 48px;\n  height: 24px;\n  line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square {\n  width: 24px;\n  min-width: 24px;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle {\n  width: 24px;\n  min-width: 24px;\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round {\n  border-radius: 24px;\n}\n.ant-skeleton-element .ant-skeleton-avatar {\n  display: inline-block;\n  vertical-align: top;\n  background: rgba(190, 190, 190, 0.2);\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-avatar-lg {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-avatar-sm {\n  width: 24px;\n  height: 24px;\n  line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-input {\n  display: inline-block;\n  vertical-align: top;\n  background: rgba(190, 190, 190, 0.2);\n  width: 160px;\n  min-width: 160px;\n  height: 32px;\n  line-height: 32px;\n}\n.ant-skeleton-element .ant-skeleton-input-lg {\n  width: 200px;\n  min-width: 200px;\n  height: 40px;\n  line-height: 40px;\n}\n.ant-skeleton-element .ant-skeleton-input-sm {\n  width: 120px;\n  min-width: 120px;\n  height: 24px;\n  line-height: 24px;\n}\n.ant-skeleton-element .ant-skeleton-image {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  vertical-align: top;\n  background: rgba(190, 190, 190, 0.2);\n  width: 96px;\n  height: 96px;\n  line-height: 96px;\n}\n.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle {\n  border-radius: 50%;\n}\n.ant-skeleton-element .ant-skeleton-image-path {\n  fill: #bfbfbf;\n}\n.ant-skeleton-element .ant-skeleton-image-svg {\n  width: 48px;\n  height: 48px;\n  line-height: 48px;\n  max-width: 192px;\n  max-height: 192px;\n}\n.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle {\n  border-radius: 50%;\n}\n@keyframes ant-skeleton-loading {\n  0% {\n    transform: translateX(-37.5%);\n  }\n  100% {\n    transform: translateX(37.5%);\n  }\n}\n.ant-skeleton-rtl {\n  direction: rtl;\n}\n.ant-skeleton-rtl .ant-skeleton-header {\n  padding-right: 0;\n  padding-left: 16px;\n}\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li {\n  animation-name: ant-skeleton-loading-rtl;\n}\n.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar {\n  animation-name: ant-skeleton-loading-rtl;\n}\n@keyframes ant-skeleton-loading-rtl {\n  0% {\n    background-position: 0% 50%;\n  }\n  100% {\n    background-position: 100% 50%;\n  }\n}\n.ant-slider {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  height: 12px;\n  margin: 10px 6px 10px;\n  padding: 4px 0;\n  cursor: pointer;\n  touch-action: none;\n}\n.ant-slider-vertical {\n  width: 12px;\n  height: 100%;\n  margin: 6px 10px;\n  padding: 0 4px;\n}\n.ant-slider-vertical .ant-slider-rail {\n  width: 4px;\n  height: 100%;\n}\n.ant-slider-vertical .ant-slider-track {\n  width: 4px;\n}\n.ant-slider-vertical .ant-slider-handle {\n  margin-top: -6px;\n  margin-left: -5px;\n}\n.ant-slider-vertical .ant-slider-mark {\n  top: 0;\n  left: 12px;\n  width: 18px;\n  height: 100%;\n}\n.ant-slider-vertical .ant-slider-mark-text {\n  left: 4px;\n  white-space: nowrap;\n}\n.ant-slider-vertical .ant-slider-step {\n  width: 4px;\n  height: 100%;\n}\n.ant-slider-vertical .ant-slider-dot {\n  top: auto;\n  margin-left: -2px;\n}\n.ant-slider-tooltip .ant-tooltip-inner {\n  min-width: unset;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-handle {\n  margin-right: -5px;\n  margin-left: 0;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-mark {\n  right: 12px;\n  left: auto;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text {\n  right: 4px;\n  left: auto;\n}\n.ant-slider-rtl.ant-slider-vertical .ant-slider-dot {\n  right: 2px;\n  left: auto;\n}\n.ant-slider-with-marks {\n  margin-bottom: 28px;\n}\n.ant-slider-rail {\n  position: absolute;\n  width: 100%;\n  height: 4px;\n  background-color: #262626;\n  border-radius: 2px;\n  transition: background-color 0.3s;\n}\n.ant-slider-track {\n  position: absolute;\n  height: 4px;\n  background-color: #153450;\n  border-radius: 2px;\n  transition: background-color 0.3s;\n}\n.ant-slider-handle {\n  position: absolute;\n  width: 14px;\n  height: 14px;\n  margin-top: -5px;\n  background-color: #141414;\n  border: solid 2px #153450;\n  border-radius: 50%;\n  box-shadow: 0;\n  cursor: pointer;\n  transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n}\n.ant-slider-handle-dragging {\n  z-index: 1;\n}\n.ant-slider-handle:focus {\n  border-color: #4697e3;\n  outline: none;\n  box-shadow: 0 0 0 5px rgba(23, 125, 220, 0.12);\n}\n.ant-slider-handle.ant-tooltip-open {\n  border-color: #177ddc;\n}\n.ant-slider-handle::after {\n  position: absolute;\n  top: -6px;\n  right: -6px;\n  bottom: -6px;\n  left: -6px;\n  content: '';\n}\n.ant-slider:hover .ant-slider-rail {\n  background-color: #434343;\n}\n.ant-slider:hover .ant-slider-track {\n  background-color: #16436e;\n}\n.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {\n  border-color: #16436e;\n}\n.ant-slider-mark {\n  position: absolute;\n  top: 14px;\n  left: 0;\n  width: 100%;\n  font-size: 14px;\n}\n.ant-slider-mark-text {\n  position: absolute;\n  display: inline-block;\n  color: rgba(255, 255, 255, 0.45);\n  text-align: center;\n  word-break: keep-all;\n  cursor: pointer;\n  user-select: none;\n}\n.ant-slider-mark-text-active {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-slider-step {\n  position: absolute;\n  width: 100%;\n  height: 4px;\n  background: transparent;\n  pointer-events: none;\n}\n.ant-slider-dot {\n  position: absolute;\n  top: -2px;\n  width: 8px;\n  height: 8px;\n  background-color: #141414;\n  border: 2px solid #303030;\n  border-radius: 50%;\n  cursor: pointer;\n}\n.ant-slider-dot-active {\n  border-color: #16436e;\n}\n.ant-slider-disabled {\n  cursor: not-allowed;\n}\n.ant-slider-disabled .ant-slider-rail {\n  background-color: #262626 !important;\n}\n.ant-slider-disabled .ant-slider-track {\n  background-color: rgba(255, 255, 255, 0.3) !important;\n}\n.ant-slider-disabled .ant-slider-handle,\n.ant-slider-disabled .ant-slider-dot {\n  background-color: #141414;\n  border-color: rgba(255, 255, 255, 0.3) !important;\n  box-shadow: none;\n  cursor: not-allowed;\n}\n.ant-slider-disabled .ant-slider-mark-text,\n.ant-slider-disabled .ant-slider-dot {\n  cursor: not-allowed !important;\n}\n.ant-slider-rtl {\n  direction: rtl;\n}\n.ant-slider-rtl .ant-slider-mark {\n  right: 0;\n  left: auto;\n}\n.ant-space {\n  display: inline-flex;\n}\n.ant-space-vertical {\n  flex-direction: column;\n}\n.ant-space-align-center {\n  align-items: center;\n}\n.ant-space-align-start {\n  align-items: flex-start;\n}\n.ant-space-align-end {\n  align-items: flex-end;\n}\n.ant-space-align-baseline {\n  align-items: baseline;\n}\n.ant-space-item:empty {\n  display: none;\n}\n.ant-space-compact {\n  display: inline-flex;\n}\n.ant-space-compact-block {\n  display: flex;\n  width: 100%;\n}\n.ant-space-compact-vertical {\n  flex-direction: column;\n}\n.ant-space-rtl {\n  direction: rtl;\n}\n.ant-space-compact-rtl {\n  direction: rtl;\n}\n.ant-spin {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  display: none;\n  color: #177ddc;\n  font-size: 0;\n  text-align: center;\n  vertical-align: middle;\n  opacity: 0;\n  transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n}\n.ant-spin-spinning {\n  position: static;\n  display: inline-block;\n  opacity: 1;\n}\n.ant-spin-nested-loading {\n  position: relative;\n}\n.ant-spin-nested-loading > div > .ant-spin {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 4;\n  display: block;\n  width: 100%;\n  height: 100%;\n  max-height: 400px;\n}\n.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: -10px;\n}\n.ant-spin-nested-loading > div > .ant-spin .ant-spin-text {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n  padding-top: 5px;\n  font-size: 14px;\n  text-shadow: 0 1px 2px #141414;\n}\n.ant-spin-nested-loading > div > .ant-spin.ant-spin-show-text .ant-spin-dot {\n  margin-top: -20px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-dot {\n  margin: -7px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-text {\n  padding-top: 2px;\n}\n.ant-spin-nested-loading > div > .ant-spin-sm.ant-spin-show-text .ant-spin-dot {\n  margin-top: -17px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-dot {\n  margin: -16px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-text {\n  padding-top: 11px;\n}\n.ant-spin-nested-loading > div > .ant-spin-lg.ant-spin-show-text .ant-spin-dot {\n  margin-top: -26px;\n}\n.ant-spin-container {\n  position: relative;\n  transition: opacity 0.3s;\n}\n.ant-spin-container::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 10;\n  display: none \\9;\n  width: 100%;\n  height: 100%;\n  background: #141414;\n  opacity: 0;\n  transition: all 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-spin-blur {\n  clear: both;\n  opacity: 0.5;\n  user-select: none;\n  pointer-events: none;\n}\n.ant-spin-blur::after {\n  opacity: 0.4;\n  pointer-events: auto;\n}\n.ant-spin-tip {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-spin-dot {\n  position: relative;\n  display: inline-block;\n  font-size: 20px;\n  width: 1em;\n  height: 1em;\n}\n.ant-spin-dot-item {\n  position: absolute;\n  display: block;\n  width: 9px;\n  height: 9px;\n  background-color: #177ddc;\n  border-radius: 100%;\n  transform: scale(0.75);\n  transform-origin: 50% 50%;\n  opacity: 0.3;\n  animation: antSpinMove 1s infinite linear alternate;\n}\n.ant-spin-dot-item:nth-child(1) {\n  top: 0;\n  left: 0;\n}\n.ant-spin-dot-item:nth-child(2) {\n  top: 0;\n  right: 0;\n  animation-delay: 0.4s;\n}\n.ant-spin-dot-item:nth-child(3) {\n  right: 0;\n  bottom: 0;\n  animation-delay: 0.8s;\n}\n.ant-spin-dot-item:nth-child(4) {\n  bottom: 0;\n  left: 0;\n  animation-delay: 1.2s;\n}\n.ant-spin-dot-spin {\n  transform: rotate(0deg);\n  animation: antRotate 1.2s infinite linear;\n}\n.ant-spin-sm .ant-spin-dot {\n  font-size: 14px;\n}\n.ant-spin-sm .ant-spin-dot i {\n  width: 6px;\n  height: 6px;\n}\n.ant-spin-lg .ant-spin-dot {\n  font-size: 32px;\n}\n.ant-spin-lg .ant-spin-dot i {\n  width: 14px;\n  height: 14px;\n}\n.ant-spin.ant-spin-show-text .ant-spin-text {\n  display: block;\n}\n@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n  /* IE10+ */\n  .ant-spin-blur {\n    background: #141414;\n    opacity: 0.5;\n  }\n}\n@keyframes antSpinMove {\n  to {\n    opacity: 1;\n  }\n}\n@keyframes antRotate {\n  to {\n    transform: rotate(360deg);\n  }\n}\n.ant-spin-rtl {\n  direction: rtl;\n}\n.ant-spin-rtl .ant-spin-dot-spin {\n  transform: rotate(-45deg);\n  animation-name: antRotateRtl;\n}\n@keyframes antRotateRtl {\n  to {\n    transform: rotate(-405deg);\n  }\n}\n.ant-statistic {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n}\n.ant-statistic-title {\n  margin-bottom: 4px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-statistic-skeleton {\n  padding-top: 16px;\n}\n.ant-statistic-content {\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 24px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n}\n.ant-statistic-content-value {\n  display: inline-block;\n  direction: ltr;\n}\n.ant-statistic-content-prefix,\n.ant-statistic-content-suffix {\n  display: inline-block;\n}\n.ant-statistic-content-prefix {\n  margin-right: 4px;\n}\n.ant-statistic-content-suffix {\n  margin-left: 4px;\n}\n.ant-statistic-rtl {\n  direction: rtl;\n}\n.ant-statistic-rtl .ant-statistic-content-prefix {\n  margin-right: 0;\n  margin-left: 4px;\n}\n.ant-statistic-rtl .ant-statistic-content-suffix {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-steps {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: flex;\n  width: 100%;\n  font-size: 0;\n  text-align: initial;\n}\n.ant-steps-item {\n  position: relative;\n  display: inline-block;\n  flex: 1;\n  overflow: hidden;\n  vertical-align: top;\n}\n.ant-steps-item-container {\n  outline: none;\n}\n.ant-steps-item:last-child {\n  flex: none;\n}\n.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-tail,\n.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  display: none;\n}\n.ant-steps-item-icon,\n.ant-steps-item-content {\n  display: inline-block;\n  vertical-align: top;\n}\n.ant-steps-item-icon {\n  width: 32px;\n  height: 32px;\n  margin: 0 8px 0 0;\n  font-size: 16px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  line-height: 32px;\n  text-align: center;\n  border: 1px solid rgba(255, 255, 255, 0.3);\n  border-radius: 32px;\n  transition: background-color 0.3s, border-color 0.3s;\n}\n.ant-steps-item-icon .ant-steps-icon {\n  position: relative;\n  top: -0.5px;\n  color: #177ddc;\n  line-height: 1;\n}\n.ant-steps-item-tail {\n  position: absolute;\n  top: 12px;\n  left: 0;\n  width: 100%;\n  padding: 0 10px;\n}\n.ant-steps-item-tail::after {\n  display: inline-block;\n  width: 100%;\n  height: 1px;\n  background: #303030;\n  border-radius: 1px;\n  transition: background 0.3s;\n  content: '';\n}\n.ant-steps-item-title {\n  position: relative;\n  display: inline-block;\n  padding-right: 16px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n  line-height: 32px;\n}\n.ant-steps-item-title::after {\n  position: absolute;\n  top: 16px;\n  left: 100%;\n  display: block;\n  width: 9999px;\n  height: 1px;\n  background: #303030;\n  content: '';\n}\n.ant-steps-item-subtitle {\n  display: inline;\n  margin-left: 8px;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: normal;\n  font-size: 14px;\n}\n.ant-steps-item-description {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-steps-item-wait .ant-steps-item-icon {\n  background-color: transparent;\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n  background: rgba(255, 255, 255, 0.3);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  background-color: #303030;\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-tail::after {\n  background-color: #303030;\n}\n.ant-steps-item-process .ant-steps-item-icon {\n  background-color: transparent;\n  border-color: #177ddc;\n}\n.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {\n  color: #177ddc;\n}\n.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n  background: #177ddc;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  background-color: #303030;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-tail::after {\n  background-color: #303030;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-icon {\n  background: #177ddc;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-icon .ant-steps-icon {\n  color: #fff;\n}\n.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-title {\n  font-weight: 500;\n}\n.ant-steps-item-finish .ant-steps-item-icon {\n  background-color: transparent;\n  border-color: #177ddc;\n}\n.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon {\n  color: #177ddc;\n}\n.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n  background: #177ddc;\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  background-color: #177ddc;\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-tail::after {\n  background-color: #177ddc;\n}\n.ant-steps-item-error .ant-steps-item-icon {\n  background-color: transparent;\n  border-color: #a61d24;\n}\n.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon {\n  color: #a61d24;\n}\n.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {\n  background: #a61d24;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {\n  color: #a61d24;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  background-color: #303030;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {\n  color: #a61d24;\n}\n.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-tail::after {\n  background-color: #303030;\n}\n.ant-steps-item.ant-steps-next-error .ant-steps-item-title::after {\n  background: #a61d24;\n}\n.ant-steps-item-disabled {\n  cursor: not-allowed;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] {\n  cursor: pointer;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-title,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-subtitle,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-description,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-icon .ant-steps-icon {\n  transition: color 0.3s;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-title,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-subtitle,\n.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-description {\n  color: #177ddc;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon {\n  border-color: #177ddc;\n}\n.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon .ant-steps-icon {\n  color: #177ddc;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n  padding-left: 16px;\n  white-space: nowrap;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n  padding-left: 0;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title {\n  padding-right: 0;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail {\n  display: none;\n}\n.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description {\n  max-width: 140px;\n  white-space: normal;\n}\n.ant-steps-item-custom > .ant-steps-item-container > .ant-steps-item-icon {\n  height: auto;\n  background: none;\n  border: 0;\n}\n.ant-steps-item-custom > .ant-steps-item-container > .ant-steps-item-icon > .ant-steps-icon {\n  top: 0px;\n  left: 0.5px;\n  width: 32px;\n  height: 32px;\n  font-size: 24px;\n  line-height: 32px;\n}\n.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {\n  color: #177ddc;\n}\n.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon {\n  width: auto;\n  background: none;\n}\n.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n  padding-left: 12px;\n}\n.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n  padding-left: 0;\n}\n.ant-steps-small .ant-steps-item-icon {\n  width: 24px;\n  height: 24px;\n  margin: 0 8px 0 0;\n  font-size: 12px;\n  line-height: 24px;\n  text-align: center;\n  border-radius: 24px;\n}\n.ant-steps-small .ant-steps-item-title {\n  padding-right: 12px;\n  font-size: 14px;\n  line-height: 24px;\n}\n.ant-steps-small .ant-steps-item-title::after {\n  top: 12px;\n}\n.ant-steps-small .ant-steps-item-description {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-steps-small .ant-steps-item-tail {\n  top: 8px;\n}\n.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon {\n  width: inherit;\n  height: inherit;\n  line-height: inherit;\n  background: none;\n  border: 0;\n  border-radius: 0;\n}\n.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {\n  font-size: 24px;\n  line-height: 24px;\n  transform: none;\n}\n.ant-steps-vertical {\n  display: flex;\n  flex-direction: column;\n}\n.ant-steps-vertical > .ant-steps-item {\n  display: block;\n  flex: 1 0 auto;\n  padding-left: 0;\n  overflow: visible;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-icon {\n  float: left;\n  margin-right: 16px;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-content {\n  display: block;\n  min-height: 48px;\n  overflow: hidden;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-title {\n  line-height: 32px;\n}\n.ant-steps-vertical > .ant-steps-item .ant-steps-item-description {\n  padding-bottom: 12px;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  position: absolute;\n  top: 0;\n  left: 15px;\n  width: 1px;\n  height: 100%;\n  padding: 38px 0 6px;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail::after {\n  width: 1px;\n  height: 100%;\n}\n.ant-steps-vertical > .ant-steps-item:not(:last-child) > .ant-steps-item-container > .ant-steps-item-tail {\n  display: block;\n}\n.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after {\n  display: none;\n}\n.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail {\n  position: absolute;\n  top: 0;\n  left: 11px;\n  padding: 30px 0 6px;\n}\n.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title {\n  line-height: 24px;\n}\n.ant-steps-label-vertical .ant-steps-item {\n  overflow: visible;\n}\n.ant-steps-label-vertical .ant-steps-item-tail {\n  margin-left: 58px;\n  padding: 3.5px 24px;\n}\n.ant-steps-label-vertical .ant-steps-item-content {\n  display: block;\n  width: 116px;\n  margin-top: 8px;\n  text-align: center;\n}\n.ant-steps-label-vertical .ant-steps-item-icon {\n  display: inline-block;\n  margin-left: 42px;\n}\n.ant-steps-label-vertical .ant-steps-item-title {\n  padding-right: 0;\n  padding-left: 0;\n}\n.ant-steps-label-vertical .ant-steps-item-title::after {\n  display: none;\n}\n.ant-steps-label-vertical .ant-steps-item-subtitle {\n  display: block;\n  margin-bottom: 4px;\n  margin-left: 0;\n  line-height: 1.5715;\n}\n.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon {\n  margin-left: 46px;\n}\n.ant-steps-dot .ant-steps-item-title,\n.ant-steps-dot.ant-steps-small .ant-steps-item-title {\n  line-height: 1.5715;\n}\n.ant-steps-dot .ant-steps-item-tail,\n.ant-steps-dot.ant-steps-small .ant-steps-item-tail {\n  top: 2px;\n  width: 100%;\n  margin: 0 0 0 70px;\n  padding: 0;\n}\n.ant-steps-dot .ant-steps-item-tail::after,\n.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after {\n  width: calc(100% - 20px);\n  height: 3px;\n  margin-left: 12px;\n}\n.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot {\n  left: 2px;\n}\n.ant-steps-dot .ant-steps-item-icon,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n  width: 8px;\n  height: 8px;\n  margin-left: 67px;\n  padding-right: 0;\n  line-height: 8px;\n  background: transparent;\n  border: 0;\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n  position: relative;\n  float: left;\n  width: 100%;\n  height: 100%;\n  border-radius: 100px;\n  transition: all 0.3s;\n  /* expand hover area */\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after {\n  position: absolute;\n  top: -12px;\n  left: -26px;\n  width: 60px;\n  height: 32px;\n  background: rgba(0, 0, 0, 0.001);\n  content: '';\n}\n.ant-steps-dot .ant-steps-item-content,\n.ant-steps-dot.ant-steps-small .ant-steps-item-content {\n  width: 140px;\n}\n.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,\n.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon {\n  position: relative;\n  top: -1px;\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  background: none;\n}\n.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot {\n  left: 0;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon {\n  margin-top: 13px;\n  margin-left: 0;\n  background: none;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  top: 6.5px;\n  left: -9px;\n  margin: 0;\n  padding: 22px 0 4px;\n}\n.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n  margin-top: 10px;\n}\n.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  top: 3.5px;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {\n  left: 0;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-content {\n  width: inherit;\n}\n.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot {\n  top: -1px;\n  left: -1px;\n}\n.ant-steps-navigation {\n  padding-top: 12px;\n}\n.ant-steps-navigation.ant-steps-small .ant-steps-item-container {\n  margin-left: -12px;\n}\n.ant-steps-navigation .ant-steps-item {\n  overflow: visible;\n  text-align: center;\n}\n.ant-steps-navigation .ant-steps-item-container {\n  display: inline-block;\n  height: 100%;\n  margin-left: -16px;\n  padding-bottom: 12px;\n  text-align: left;\n  transition: opacity 0.3s;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content {\n  max-width: auto;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title {\n  max-width: 100%;\n  padding-right: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title::after {\n  display: none;\n}\n.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button'] {\n  cursor: pointer;\n}\n.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button']:hover {\n  opacity: 0.85;\n}\n.ant-steps-navigation .ant-steps-item:last-child {\n  flex: 1;\n}\n.ant-steps-navigation .ant-steps-item:last-child::after {\n  display: none;\n}\n.ant-steps-navigation .ant-steps-item::after {\n  position: absolute;\n  top: 50%;\n  left: 100%;\n  display: inline-block;\n  width: 12px;\n  height: 12px;\n  margin-top: -14px;\n  margin-left: -2px;\n  border: 1px solid rgba(255, 255, 255, 0.2);\n  border-bottom: none;\n  border-left: none;\n  transform: rotate(45deg);\n  content: '';\n}\n.ant-steps-navigation .ant-steps-item::before {\n  position: absolute;\n  bottom: 0;\n  left: 50%;\n  display: inline-block;\n  width: 0;\n  height: 2px;\n  background-color: #177ddc;\n  transition: width 0.3s, left 0.3s;\n  transition-timing-function: ease-out;\n  content: '';\n}\n.ant-steps-navigation .ant-steps-item.ant-steps-item-active::before {\n  left: 0;\n  width: 100%;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item {\n  margin-right: 0 !important;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item::before {\n  display: none;\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item.ant-steps-item-active::before {\n  top: 0;\n  right: 0;\n  left: unset;\n  display: block;\n  width: 3px;\n  height: calc(100% - 24px);\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item::after {\n  position: relative;\n  top: -2px;\n  left: 50%;\n  display: block;\n  width: 8px;\n  height: 8px;\n  margin-bottom: 8px;\n  text-align: center;\n  transform: rotate(135deg);\n}\n.ant-steps-navigation.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  visibility: hidden;\n}\n.ant-steps-navigation.ant-steps-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  visibility: hidden;\n}\n.ant-steps-rtl {\n  direction: rtl;\n}\n.ant-steps.ant-steps-rtl .ant-steps-item-icon {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-steps-rtl .ant-steps-item-tail {\n  right: 0;\n  left: auto;\n}\n.ant-steps-rtl .ant-steps-item-title {\n  padding-right: 0;\n  padding-left: 16px;\n}\n.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle {\n  float: left;\n  margin-right: 8px;\n  margin-left: 0;\n}\n.ant-steps-rtl .ant-steps-item-title::after {\n  right: 100%;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n  padding-right: 16px;\n  padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n  padding-right: 0;\n}\n.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title {\n  padding-left: 0;\n}\n.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {\n  right: 0.5px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container {\n  margin-right: -12px;\n  margin-left: 0;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container {\n  margin-right: -16px;\n  margin-left: 0;\n  text-align: right;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title {\n  padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-navigation .ant-steps-item::after {\n  right: 100%;\n  left: auto;\n  margin-right: -2px;\n  margin-left: 0;\n  transform: rotate(225deg);\n}\n.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {\n  padding-right: 12px;\n  padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child {\n  padding-right: 0;\n}\n.ant-steps-rtl.ant-steps-small .ant-steps-item-title {\n  padding-right: 0;\n  padding-left: 12px;\n}\n.ant-steps-rtl.ant-steps-vertical > .ant-steps-item .ant-steps-item-icon {\n  float: right;\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-steps-rtl.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  right: 16px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail {\n  right: 12px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title {\n  padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail {\n  margin: 0 70px 0 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail::after,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after {\n  margin-right: 12px;\n  margin-left: 0;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot {\n  right: 2px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon {\n  margin-right: 67px;\n  margin-left: 0;\n}\n.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n  /* expand hover area */\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot {\n  float: right;\n}\n.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after,\n.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after {\n  right: -26px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon {\n  margin-right: 0;\n  margin-left: 16px;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  right: -9px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {\n  right: 0;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot {\n  right: -2px;\n  left: auto;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical > .ant-steps-item {\n  padding-right: 4px;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  right: 19px;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-small.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  right: 15px;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child {\n  padding-right: 4px;\n  padding-left: 0;\n}\n.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active {\n  padding-right: 4px;\n}\n.ant-steps-with-progress .ant-steps-item {\n  padding-top: 4px;\n}\n.ant-steps-with-progress .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  top: 4px;\n  left: 19px;\n}\n.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child,\n.ant-steps-with-progress.ant-steps-small.ant-steps-horizontal .ant-steps-item:first-child {\n  padding-bottom: 4px;\n  padding-left: 4px;\n}\n.ant-steps-with-progress.ant-steps-small > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail {\n  left: 15px;\n}\n.ant-steps-with-progress.ant-steps-vertical .ant-steps-item {\n  padding-left: 4px;\n}\n.ant-steps-with-progress.ant-steps-label-vertical .ant-steps-item .ant-steps-item-tail {\n  top: 14px !important;\n}\n.ant-steps-with-progress .ant-steps-item-icon {\n  position: relative;\n}\n.ant-steps-with-progress .ant-steps-item-icon .ant-progress {\n  position: absolute;\n  top: -5px;\n  right: -5px;\n  bottom: -5px;\n  left: -5px;\n}\n.ant-switch {\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: inline-block;\n  box-sizing: border-box;\n  min-width: 44px;\n  height: 22px;\n  line-height: 22px;\n  vertical-align: middle;\n  background-color: rgba(255, 255, 255, 0.3);\n  border: 0;\n  border-radius: 100px;\n  cursor: pointer;\n  transition: all 0.2s;\n  user-select: none;\n}\n.ant-switch:focus {\n  outline: 0;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.1);\n}\n.ant-switch-checked:focus {\n  box-shadow: 0 0 0 2px #111b26;\n}\n.ant-switch:focus:hover {\n  box-shadow: none;\n}\n.ant-switch-checked {\n  background-color: #177ddc;\n}\n.ant-switch-loading,\n.ant-switch-disabled {\n  cursor: not-allowed;\n  opacity: 0.4;\n}\n.ant-switch-loading *,\n.ant-switch-disabled * {\n  box-shadow: none;\n  cursor: not-allowed;\n}\n.ant-switch-inner {\n  display: block;\n  margin: 0 7px 0 25px;\n  color: #fff;\n  font-size: 12px;\n  transition: margin 0.2s;\n}\n.ant-switch-checked .ant-switch-inner {\n  margin: 0 25px 0 7px;\n}\n.ant-switch-handle {\n  position: absolute;\n  top: 2px;\n  left: 2px;\n  width: 18px;\n  height: 18px;\n  transition: all 0.2s ease-in-out;\n}\n.ant-switch-handle::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #fff;\n  border-radius: 9px;\n  box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);\n  transition: all 0.2s ease-in-out;\n  content: '';\n}\n.ant-switch-checked .ant-switch-handle {\n  left: calc(100% - 18px - 2px);\n}\n.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle::before {\n  right: -30%;\n  left: 0;\n}\n.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle::before {\n  right: 0;\n  left: -30%;\n}\n.ant-switch-loading-icon.anticon {\n  position: relative;\n  top: 2px;\n  color: rgba(0, 0, 0, 0.65);\n  vertical-align: top;\n}\n.ant-switch-checked .ant-switch-loading-icon {\n  color: #177ddc;\n}\n.ant-switch-small {\n  min-width: 28px;\n  height: 16px;\n  line-height: 16px;\n}\n.ant-switch-small .ant-switch-inner {\n  margin: 0 5px 0 18px;\n  font-size: 12px;\n}\n.ant-switch-small .ant-switch-handle {\n  width: 12px;\n  height: 12px;\n}\n.ant-switch-small .ant-switch-loading-icon {\n  top: 1.5px;\n  font-size: 9px;\n}\n.ant-switch-small.ant-switch-checked .ant-switch-inner {\n  margin: 0 18px 0 5px;\n}\n.ant-switch-small.ant-switch-checked .ant-switch-handle {\n  left: calc(100% - 12px - 2px);\n}\n.ant-switch-rtl {\n  direction: rtl;\n}\n.ant-switch-rtl .ant-switch-inner {\n  margin: 0 25px 0 7px;\n}\n.ant-switch-rtl .ant-switch-handle {\n  right: 2px;\n  left: auto;\n}\n.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle::before {\n  right: 0;\n  left: -30%;\n}\n.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle::before {\n  right: -30%;\n  left: 0;\n}\n.ant-switch-rtl.ant-switch-checked .ant-switch-inner {\n  margin: 0 7px 0 25px;\n}\n.ant-switch-rtl.ant-switch-checked .ant-switch-handle {\n  right: calc(100% - 18px - 2px);\n}\n.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle {\n  right: calc(100% - 12px - 2px);\n}\n.ant-table.ant-table-middle {\n  font-size: 14px;\n}\n.ant-table.ant-table-middle .ant-table-title,\n.ant-table.ant-table-middle .ant-table-footer,\n.ant-table.ant-table-middle .ant-table-thead > tr > th,\n.ant-table.ant-table-middle .ant-table-tbody > tr > td,\n.ant-table.ant-table-middle tfoot > tr > th,\n.ant-table.ant-table-middle tfoot > tr > td {\n  padding: 12px 8px;\n}\n.ant-table.ant-table-middle .ant-table-filter-trigger {\n  margin-right: -4px;\n}\n.ant-table.ant-table-middle .ant-table-expanded-row-fixed {\n  margin: -12px -8px;\n}\n.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table {\n  margin: -12px -8px -12px 40px;\n}\n.ant-table.ant-table-middle .ant-table-selection-column {\n  padding-inline-start: 2px;\n}\n.ant-table.ant-table-small {\n  font-size: 14px;\n}\n.ant-table.ant-table-small .ant-table-title,\n.ant-table.ant-table-small .ant-table-footer,\n.ant-table.ant-table-small .ant-table-thead > tr > th,\n.ant-table.ant-table-small .ant-table-tbody > tr > td,\n.ant-table.ant-table-small tfoot > tr > th,\n.ant-table.ant-table-small tfoot > tr > td {\n  padding: 8px 8px;\n}\n.ant-table.ant-table-small .ant-table-filter-trigger {\n  margin-right: -4px;\n}\n.ant-table.ant-table-small .ant-table-expanded-row-fixed {\n  margin: -8px -8px;\n}\n.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table {\n  margin: -8px -8px -8px 40px;\n}\n.ant-table.ant-table-small .ant-table-selection-column {\n  padding-inline-start: 2px;\n}\n.ant-table.ant-table-bordered > .ant-table-title {\n  border: 1px solid #303030;\n  border-bottom: 0;\n}\n.ant-table.ant-table-bordered > .ant-table-container {\n  border-left: 1px solid #303030;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > td,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > td {\n  border-right: 1px solid #303030;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr:not(:last-child) > th,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr:not(:last-child) > th {\n  border-bottom: 1px solid #303030;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th::before,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th::before {\n  background-color: transparent !important;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > .ant-table-cell-fix-right-first::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > .ant-table-cell-fix-right-first::after {\n  border-right: 1px solid #303030;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n  margin: -16px -17px;\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed::after,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed::after {\n  position: absolute;\n  top: 0;\n  right: 1px;\n  bottom: 0;\n  border-right: 1px solid #303030;\n  content: '';\n}\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n  border-top: 1px solid #303030;\n}\n.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-expanded-row > td,\n.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-placeholder > td {\n  border-right: 0;\n}\n.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n  margin: -12px -9px;\n}\n.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed,\n.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed {\n  margin: -8px -9px;\n}\n.ant-table.ant-table-bordered > .ant-table-footer {\n  border: 1px solid #303030;\n  border-top: 0;\n}\n.ant-table-cell .ant-table-container:first-child {\n  border-top: 0;\n}\n.ant-table-cell-scrollbar:not([rowspan]) {\n  box-shadow: 0 1px 0 1px #1d1d1d;\n}\n.ant-table-wrapper {\n  clear: both;\n  max-width: 100%;\n}\n.ant-table-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-table-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-table-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-table-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-table {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  font-size: 14px;\n  background: #141414;\n  border-radius: 2px;\n}\n.ant-table table {\n  width: 100%;\n  text-align: left;\n  border-radius: 2px 2px 0 0;\n  border-collapse: separate;\n  border-spacing: 0;\n}\n.ant-table-thead > tr > th,\n.ant-table-tbody > tr > td,\n.ant-table tfoot > tr > th,\n.ant-table tfoot > tr > td {\n  position: relative;\n  padding: 16px 16px;\n  overflow-wrap: break-word;\n}\n.ant-table-cell-ellipsis {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  word-break: keep-all;\n}\n.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,\n.ant-table-cell-ellipsis.ant-table-cell-fix-right-first {\n  overflow: visible;\n}\n.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,\n.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content {\n  display: block;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.ant-table-cell-ellipsis .ant-table-column-title {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  word-break: keep-all;\n}\n.ant-table-title {\n  padding: 16px 16px;\n}\n.ant-table-footer {\n  padding: 16px 16px;\n  color: rgba(255, 255, 255, 0.85);\n  background: rgba(255, 255, 255, 0.04);\n}\n.ant-table-thead > tr > th {\n  position: relative;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 500;\n  text-align: left;\n  background: #1d1d1d;\n  border-bottom: 1px solid #303030;\n  transition: background 0.3s ease;\n}\n.ant-table-thead > tr > th[colspan]:not([colspan='1']) {\n  text-align: center;\n}\n.ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  width: 1px;\n  height: 1.6em;\n  background-color: rgba(255, 255, 255, 0.08);\n  transform: translateY(-50%);\n  transition: background-color 0.3s;\n  content: '';\n}\n.ant-table-thead > tr:not(:last-child) > th[colspan] {\n  border-bottom: 0;\n}\n.ant-table-tbody > tr > td {\n  border-bottom: 1px solid #303030;\n  transition: background 0.3s;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table {\n  margin: -16px -16px -16px 32px;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td {\n  border-bottom: 0;\n}\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child,\n.ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child,\n.ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child {\n  border-radius: 0;\n}\n.ant-table-tbody > tr.ant-table-row:hover > td,\n.ant-table-tbody > tr > td.ant-table-cell-row-hover {\n  background: #262626;\n}\n.ant-table-tbody > tr.ant-table-row-selected > td {\n  background: #111b26;\n  border-color: rgba(0, 0, 0, 0.03);\n}\n.ant-table-tbody > tr.ant-table-row-selected:hover > td {\n  background: #0e161f;\n}\n.ant-table-summary {\n  position: relative;\n  z-index: 2;\n  background: #141414;\n}\ndiv.ant-table-summary {\n  box-shadow: 0 -1px 0 #303030;\n}\n.ant-table-summary > tr > th,\n.ant-table-summary > tr > td {\n  border-bottom: 1px solid #303030;\n}\n.ant-table-pagination.ant-pagination {\n  margin: 16px 0;\n}\n.ant-table-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  row-gap: 8px;\n}\n.ant-table-pagination > * {\n  flex: none;\n}\n.ant-table-pagination-left {\n  justify-content: flex-start;\n}\n.ant-table-pagination-center {\n  justify-content: center;\n}\n.ant-table-pagination-right {\n  justify-content: flex-end;\n}\n.ant-table-thead th.ant-table-column-has-sorters {\n  outline: none;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-table-thead th.ant-table-column-has-sorters:hover {\n  background: #303030;\n}\n.ant-table-thead th.ant-table-column-has-sorters:hover::before {\n  background-color: transparent !important;\n}\n.ant-table-thead th.ant-table-column-has-sorters:focus-visible {\n  color: #177ddc;\n}\n.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,\n.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover {\n  background: #222;\n}\n.ant-table-thead th.ant-table-column-sort {\n  background: #262626;\n}\n.ant-table-thead th.ant-table-column-sort::before {\n  background-color: transparent !important;\n}\ntd.ant-table-column-sort {\n  background: rgba(255, 255, 255, 0.01);\n}\n.ant-table-column-title {\n  position: relative;\n  z-index: 1;\n  flex: 1;\n}\n.ant-table-column-sorters {\n  display: flex;\n  flex: auto;\n  align-items: center;\n  justify-content: space-between;\n}\n.ant-table-column-sorters::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  content: '';\n}\n.ant-table-column-sorter {\n  margin-left: 4px;\n  color: #bfbfbf;\n  font-size: 0;\n  transition: color 0.3s;\n}\n.ant-table-column-sorter-inner {\n  display: inline-flex;\n  flex-direction: column;\n  align-items: center;\n}\n.ant-table-column-sorter-up,\n.ant-table-column-sorter-down {\n  font-size: 11px;\n}\n.ant-table-column-sorter-up.active,\n.ant-table-column-sorter-down.active {\n  color: #177ddc;\n}\n.ant-table-column-sorter-up + .ant-table-column-sorter-down {\n  margin-top: -0.3em;\n}\n.ant-table-column-sorters:hover .ant-table-column-sorter {\n  color: #a6a6a6;\n}\n.ant-table-filter-column {\n  display: flex;\n  justify-content: space-between;\n}\n.ant-table-filter-trigger {\n  position: relative;\n  display: flex;\n  align-items: center;\n  margin: -4px -8px -4px 4px;\n  padding: 0 4px;\n  color: #bfbfbf;\n  font-size: 12px;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-table-filter-trigger:hover {\n  color: rgba(255, 255, 255, 0.45);\n  background: #434343;\n}\n.ant-table-filter-trigger.active {\n  color: #177ddc;\n}\n.ant-table-filter-dropdown {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  min-width: 120px;\n  background-color: #1f1f1f;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-table-filter-dropdown .ant-dropdown-menu {\n  max-height: 264px;\n  overflow-x: hidden;\n  border: 0;\n  box-shadow: none;\n}\n.ant-table-filter-dropdown .ant-dropdown-menu:empty::after {\n  display: block;\n  padding: 8px 0;\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 12px;\n  text-align: center;\n  content: 'Not Found';\n}\n.ant-table-filter-dropdown-tree {\n  padding: 8px 8px 0;\n}\n.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,\n.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover {\n  background-color: #11263c;\n}\n.ant-table-filter-dropdown-search {\n  padding: 8px;\n  border-bottom: 1px #303030 solid;\n}\n.ant-table-filter-dropdown-search-input input {\n  min-width: 140px;\n}\n.ant-table-filter-dropdown-search-input .anticon {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-table-filter-dropdown-checkall {\n  width: 100%;\n  margin-bottom: 4px;\n  margin-left: 4px;\n}\n.ant-table-filter-dropdown-submenu > ul {\n  max-height: calc(100vh - 130px);\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span {\n  padding-left: 8px;\n}\n.ant-table-filter-dropdown-btns {\n  display: flex;\n  justify-content: space-between;\n  padding: 7px 8px;\n  overflow: hidden;\n  background-color: #1f1f1f;\n  border-top: 1px solid #303030;\n}\n.ant-table-selection-col {\n  width: 32px;\n}\n.ant-table-bordered .ant-table-selection-col {\n  width: 50px;\n}\ntable tr th.ant-table-selection-column,\ntable tr td.ant-table-selection-column {\n  padding-right: 8px;\n  padding-left: 8px;\n  text-align: center;\n}\ntable tr th.ant-table-selection-column .ant-radio-wrapper,\ntable tr td.ant-table-selection-column .ant-radio-wrapper {\n  margin-right: 0;\n}\ntable tr th.ant-table-selection-column.ant-table-cell-fix-left {\n  z-index: 3;\n}\ntable tr th.ant-table-selection-column::after {\n  background-color: transparent !important;\n}\n.ant-table-selection {\n  position: relative;\n  display: inline-flex;\n  flex-direction: column;\n}\n.ant-table-selection-extra {\n  position: absolute;\n  top: 0;\n  z-index: 1;\n  cursor: pointer;\n  transition: all 0.3s;\n  margin-inline-start: 100%;\n  padding-inline-start: 4px;\n}\n.ant-table-selection-extra .anticon {\n  color: #bfbfbf;\n  font-size: 10px;\n}\n.ant-table-selection-extra .anticon:hover {\n  color: #a6a6a6;\n}\n.ant-table-expand-icon-col {\n  width: 48px;\n}\n.ant-table-row-expand-icon-cell {\n  text-align: center;\n}\n.ant-table-row-expand-icon-cell .ant-table-row-expand-icon {\n  display: inline-flex;\n  float: none;\n  vertical-align: sub;\n}\n.ant-table-row-indent {\n  float: left;\n  height: 1px;\n}\n.ant-table-row-expand-icon {\n  color: #177ddc;\n  outline: none;\n  cursor: pointer;\n  transition: color 0.3s;\n  position: relative;\n  float: left;\n  box-sizing: border-box;\n  width: 17px;\n  height: 17px;\n  padding: 0;\n  color: inherit;\n  line-height: 17px;\n  background: transparent;\n  border: 1px solid #303030;\n  border-radius: 2px;\n  transform: scale(0.94117647);\n  transition: all 0.3s;\n  user-select: none;\n}\n.ant-table-row-expand-icon:focus-visible,\n.ant-table-row-expand-icon:hover {\n  color: #165996;\n}\n.ant-table-row-expand-icon:active {\n  color: #388ed3;\n}\n.ant-table-row-expand-icon:focus,\n.ant-table-row-expand-icon:hover,\n.ant-table-row-expand-icon:active {\n  border-color: currentcolor;\n}\n.ant-table-row-expand-icon::before,\n.ant-table-row-expand-icon::after {\n  position: absolute;\n  background: currentcolor;\n  transition: transform 0.3s ease-out;\n  content: '';\n}\n.ant-table-row-expand-icon::before {\n  top: 7px;\n  right: 3px;\n  left: 3px;\n  height: 1px;\n}\n.ant-table-row-expand-icon::after {\n  top: 3px;\n  bottom: 3px;\n  left: 7px;\n  width: 1px;\n  transform: rotate(90deg);\n}\n.ant-table-row-expand-icon-collapsed::before {\n  transform: rotate(-180deg);\n}\n.ant-table-row-expand-icon-collapsed::after {\n  transform: rotate(0deg);\n}\n.ant-table-row-expand-icon-spaced {\n  background: transparent;\n  border: 0;\n  visibility: hidden;\n}\n.ant-table-row-expand-icon-spaced::before,\n.ant-table-row-expand-icon-spaced::after {\n  display: none;\n  content: none;\n}\n.ant-table-row-indent + .ant-table-row-expand-icon {\n  margin-top: 2.5005px;\n  margin-right: 8px;\n}\ntr.ant-table-expanded-row > td,\ntr.ant-table-expanded-row:hover > td {\n  background: #1d1d1d;\n}\ntr.ant-table-expanded-row .ant-descriptions-view {\n  display: flex;\n}\ntr.ant-table-expanded-row .ant-descriptions-view table {\n  flex: auto;\n  width: auto;\n}\n.ant-table .ant-table-expanded-row-fixed {\n  position: relative;\n  margin: -16px -16px;\n  padding: 16px 16px;\n}\n.ant-table-tbody > tr.ant-table-placeholder {\n  text-align: center;\n}\n.ant-table-empty .ant-table-tbody > tr.ant-table-placeholder {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-table-tbody > tr.ant-table-placeholder:hover > td {\n  background: #141414;\n}\n.ant-table-cell-fix-left,\n.ant-table-cell-fix-right {\n  position: sticky !important;\n  z-index: 2;\n  background: #141414;\n}\n.ant-table-cell-fix-left-first::after,\n.ant-table-cell-fix-left-last::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: -1px;\n  width: 30px;\n  transform: translateX(100%);\n  transition: box-shadow 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-table-cell-fix-left-all::after {\n  display: none;\n}\n.ant-table-cell-fix-right-first::after,\n.ant-table-cell-fix-right-last::after {\n  position: absolute;\n  top: 0;\n  bottom: -1px;\n  left: 0;\n  width: 30px;\n  transform: translateX(-100%);\n  transition: box-shadow 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-table .ant-table-container::before,\n.ant-table .ant-table-container::after {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: calc(calc(2 + 1) + 1);\n  width: 30px;\n  transition: box-shadow 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-table .ant-table-container::before {\n  left: 0;\n}\n.ant-table .ant-table-container::after {\n  right: 0;\n}\n.ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container {\n  position: relative;\n}\n.ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container::before {\n  box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.45);\n}\n.ant-table-ping-left .ant-table-cell-fix-left-first::after,\n.ant-table-ping-left .ant-table-cell-fix-left-last::after {\n  box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.45);\n}\n.ant-table-ping-left .ant-table-cell-fix-left-last::before {\n  background-color: transparent !important;\n}\n.ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container {\n  position: relative;\n}\n.ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container::after {\n  box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.45);\n}\n.ant-table-ping-right .ant-table-cell-fix-right-first::after,\n.ant-table-ping-right .ant-table-cell-fix-right-last::after {\n  box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.45);\n}\n.ant-table-sticky-holder {\n  position: sticky;\n  z-index: calc(2 + 1);\n  background: #141414;\n}\n.ant-table-sticky-scroll {\n  position: sticky;\n  bottom: 0;\n  z-index: calc(2 + 1);\n  display: flex;\n  align-items: center;\n  background: #fcfcfc;\n  border-top: 1px solid #303030;\n  opacity: 0.6;\n}\n.ant-table-sticky-scroll:hover {\n  transform-origin: center bottom;\n}\n.ant-table-sticky-scroll-bar {\n  height: 8px;\n  background-color: rgba(0, 0, 0, 0.35);\n  border-radius: 4px;\n}\n.ant-table-sticky-scroll-bar:hover {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.ant-table-sticky-scroll-bar-active {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n@media all and (-ms-high-contrast: none) {\n  .ant-table-ping-left .ant-table-cell-fix-left-last::after {\n    box-shadow: none !important;\n  }\n  .ant-table-ping-right .ant-table-cell-fix-right-first::after {\n    box-shadow: none !important;\n  }\n}\n.ant-table {\n  /* title + table */\n  /* table */\n  /* table + footer */\n}\n.ant-table-title {\n  border-radius: 2px 2px 0 0;\n}\n.ant-table-title + .ant-table-container {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ant-table-title + .ant-table-container table {\n  border-radius: 0;\n}\n.ant-table-title + .ant-table-container table > thead > tr:first-child th:first-child {\n  border-radius: 0;\n}\n.ant-table-title + .ant-table-container table > thead > tr:first-child th:last-child {\n  border-radius: 0;\n}\n.ant-table-container {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 2px;\n}\n.ant-table-container table > thead > tr:first-child th:first-child {\n  border-top-left-radius: 2px;\n}\n.ant-table-container table > thead > tr:first-child th:last-child {\n  border-top-right-radius: 2px;\n}\n.ant-table-footer {\n  border-radius: 0 0 2px 2px;\n}\n.ant-table-wrapper-rtl {\n  direction: rtl;\n}\n.ant-table-rtl {\n  direction: rtl;\n}\n.ant-table-wrapper-rtl .ant-table table {\n  text-align: right;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th[colspan]:not([colspan='1']) {\n  text-align: center;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before {\n  right: auto;\n  left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-thead > tr > th {\n  text-align: right;\n}\n.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl {\n  margin: -16px 33px -16px -16px;\n}\n.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left {\n  justify-content: flex-end;\n}\n.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right {\n  justify-content: flex-start;\n}\n.ant-table-wrapper-rtl .ant-table-column-sorter {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-filter-column-title {\n  padding: 16px 16px 16px 2.3em;\n}\n.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title {\n  padding: 0 0 0 2.3em;\n}\n.ant-table-wrapper-rtl .ant-table-filter-trigger {\n  margin: -4px 4px -4px -8px;\n}\n.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span,\n.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper + span,\n.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span {\n  padding-right: 8px;\n  padding-left: 0;\n}\n.ant-table-wrapper-rtl .ant-table-selection {\n  text-align: center;\n}\n.ant-table-wrapper-rtl .ant-table-row-indent {\n  float: right;\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon {\n  float: right;\n}\n.ant-table-wrapper-rtl .ant-table-row-indent + .ant-table-row-expand-icon {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon::after {\n  transform: rotate(-90deg);\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::before {\n  transform: rotate(180deg);\n}\n.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::after {\n  transform: rotate(0deg);\n}\n.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab {\n  padding: 8px 0;\n  font-size: 14px;\n}\n.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab {\n  padding: 16px 0;\n  font-size: 16px;\n}\n.ant-tabs-card.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab {\n  padding: 6px 16px;\n}\n.ant-tabs-card.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab {\n  padding: 7px 16px 6px;\n}\n.ant-tabs-rtl {\n  direction: rtl;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab {\n  margin: 0 0 0 32px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type {\n  margin-left: 0;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon {\n  margin-right: 0;\n  margin-left: 12px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove {\n  margin-right: 8px;\n  margin-left: -4px;\n}\n.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon {\n  margin: 0;\n}\n.ant-tabs-rtl.ant-tabs-left > .ant-tabs-nav {\n  order: 1;\n}\n.ant-tabs-rtl.ant-tabs-left > .ant-tabs-content-holder {\n  order: 0;\n}\n.ant-tabs-rtl.ant-tabs-right > .ant-tabs-nav {\n  order: 0;\n}\n.ant-tabs-rtl.ant-tabs-right > .ant-tabs-content-holder {\n  order: 1;\n}\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n  margin-right: 2px;\n  margin-left: 0;\n}\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-add {\n  margin-right: 2px;\n  margin-left: 0;\n}\n.ant-tabs-dropdown-rtl {\n  direction: rtl;\n}\n.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item {\n  text-align: right;\n}\n.ant-tabs-top,\n.ant-tabs-bottom {\n  flex-direction: column;\n}\n.ant-tabs-top > .ant-tabs-nav,\n.ant-tabs-bottom > .ant-tabs-nav,\n.ant-tabs-top > div > .ant-tabs-nav,\n.ant-tabs-bottom > div > .ant-tabs-nav {\n  margin: 0 0 16px 0;\n}\n.ant-tabs-top > .ant-tabs-nav::before,\n.ant-tabs-bottom > .ant-tabs-nav::before,\n.ant-tabs-top > div > .ant-tabs-nav::before,\n.ant-tabs-bottom > div > .ant-tabs-nav::before {\n  position: absolute;\n  right: 0;\n  left: 0;\n  border-bottom: 1px solid #303030;\n  content: '';\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  height: 2px;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar-animated {\n  transition: width 0.3s, left 0.3s, right 0.3s;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n  top: 0;\n  bottom: 0;\n  width: 30px;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before {\n  left: 0;\n  box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n  right: 0;\n  box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before {\n  opacity: 1;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after {\n  opacity: 1;\n}\n.ant-tabs-top > .ant-tabs-nav::before,\n.ant-tabs-top > div > .ant-tabs-nav::before {\n  bottom: 0;\n}\n.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  bottom: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav,\n.ant-tabs-bottom > div > .ant-tabs-nav {\n  order: 1;\n  margin-top: 16px;\n  margin-bottom: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav::before,\n.ant-tabs-bottom > div > .ant-tabs-nav::before {\n  top: 0;\n}\n.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  top: 0;\n}\n.ant-tabs-bottom > .ant-tabs-content-holder,\n.ant-tabs-bottom > div > .ant-tabs-content-holder {\n  order: 0;\n}\n.ant-tabs-left > .ant-tabs-nav,\n.ant-tabs-right > .ant-tabs-nav,\n.ant-tabs-left > div > .ant-tabs-nav,\n.ant-tabs-right > div > .ant-tabs-nav {\n  flex-direction: column;\n  min-width: 50px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab {\n  padding: 8px 24px;\n  text-align: center;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n  margin: 16px 0 0 0;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap {\n  flex-direction: column;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n  right: 0;\n  left: 0;\n  height: 30px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before {\n  top: 0;\n  box-shadow: inset 0 10px 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n  bottom: 0;\n  box-shadow: inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08);\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before {\n  opacity: 1;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after {\n  opacity: 1;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  width: 2px;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar-animated,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar-animated {\n  transition: height 0.3s, top 0.3s;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-operations {\n  flex: 1 0 auto;\n  flex-direction: column;\n}\n.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  right: 0;\n}\n.ant-tabs-left > .ant-tabs-content-holder,\n.ant-tabs-left > div > .ant-tabs-content-holder {\n  margin-left: -1px;\n  border-left: 1px solid #303030;\n}\n.ant-tabs-left > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane,\n.ant-tabs-left > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane {\n  padding-left: 24px;\n}\n.ant-tabs-right > .ant-tabs-nav,\n.ant-tabs-right > div > .ant-tabs-nav {\n  order: 1;\n}\n.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  left: 0;\n}\n.ant-tabs-right > .ant-tabs-content-holder,\n.ant-tabs-right > div > .ant-tabs-content-holder {\n  order: 0;\n  margin-right: -1px;\n  border-right: 1px solid #303030;\n}\n.ant-tabs-right > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane,\n.ant-tabs-right > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane {\n  padding-right: 24px;\n}\n.ant-tabs-dropdown {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n  z-index: 1050;\n  display: block;\n}\n.ant-tabs-dropdown-hidden {\n  display: none;\n}\n.ant-tabs-dropdown-menu {\n  max-height: 200px;\n  margin: 0;\n  padding: 4px 0;\n  overflow-x: hidden;\n  overflow-y: auto;\n  text-align: left;\n  list-style-type: none;\n  background-color: #1f1f1f;\n  background-clip: padding-box;\n  border-radius: 2px;\n  outline: none;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-tabs-dropdown-menu-item {\n  display: flex;\n  align-items: center;\n  min-width: 120px;\n  margin: 0;\n  padding: 5px 12px;\n  overflow: hidden;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 22px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-tabs-dropdown-menu-item > span {\n  flex: 1;\n  white-space: nowrap;\n}\n.ant-tabs-dropdown-menu-item-remove {\n  flex: none;\n  margin-left: 12px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 12px;\n  background: transparent;\n  border: 0;\n  cursor: pointer;\n}\n.ant-tabs-dropdown-menu-item-remove:hover {\n  color: #165996;\n}\n.ant-tabs-dropdown-menu-item:hover {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-tabs-dropdown-menu-item-disabled,\n.ant-tabs-dropdown-menu-item-disabled:hover {\n  color: rgba(255, 255, 255, 0.3);\n  background: transparent;\n  cursor: not-allowed;\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab {\n  margin: 0;\n  padding: 8px 16px;\n  background: rgba(255, 255, 255, 0.04);\n  border: 1px solid #303030;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab-active {\n  color: #177ddc;\n  background: #141414;\n}\n.ant-tabs-card > .ant-tabs-nav .ant-tabs-ink-bar,\n.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-ink-bar {\n  visibility: hidden;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n  margin-left: 2px;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab {\n  border-radius: 2px 2px 0 0;\n}\n.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab-active {\n  border-bottom-color: #141414;\n}\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab {\n  border-radius: 0 0 2px 2px;\n}\n.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab-active {\n  border-top-color: #141414;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab + .ant-tabs-tab {\n  margin-top: 2px;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab {\n  border-radius: 2px 0 0 2px;\n}\n.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab-active {\n  border-right-color: #141414;\n}\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab {\n  border-radius: 0 2px 2px 0;\n}\n.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab-active,\n.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab-active {\n  border-left-color: #141414;\n}\n.ant-tabs {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: flex;\n}\n.ant-tabs > .ant-tabs-nav,\n.ant-tabs > div > .ant-tabs-nav {\n  position: relative;\n  display: flex;\n  flex: none;\n  align-items: center;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap {\n  position: relative;\n  display: inline-block;\n  display: flex;\n  flex: auto;\n  align-self: stretch;\n  overflow: hidden;\n  white-space: nowrap;\n  transform: translate(0);\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::before,\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::after,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::after {\n  position: absolute;\n  z-index: 1;\n  opacity: 0;\n  transition: opacity 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-list,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-list {\n  position: relative;\n  display: flex;\n  transition: transform 0.3s;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations {\n  display: flex;\n  align-self: stretch;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations-hidden,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations-hidden {\n  position: absolute;\n  visibility: hidden;\n  pointer-events: none;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more {\n  position: relative;\n  padding: 8px 16px;\n  background: transparent;\n  border: 0;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more::after,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more::after {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  height: 5px;\n  transform: translateY(100%);\n  content: '';\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add {\n  min-width: 40px;\n  margin-left: 2px;\n  padding: 0 8px;\n  background: rgba(255, 255, 255, 0.04);\n  border: 1px solid #303030;\n  border-radius: 2px 2px 0 0;\n  outline: none;\n  cursor: pointer;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:hover,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:hover {\n  color: #165996;\n}\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:active,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:active,\n.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:focus,\n.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:focus {\n  color: #388ed3;\n}\n.ant-tabs-extra-content {\n  flex: none;\n}\n.ant-tabs-centered > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']),\n.ant-tabs-centered > div > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']) {\n  justify-content: center;\n}\n.ant-tabs-ink-bar {\n  position: absolute;\n  background: #177ddc;\n  pointer-events: none;\n}\n.ant-tabs-tab {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  padding: 12px 0;\n  font-size: 14px;\n  background: transparent;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n}\n.ant-tabs-tab-btn:focus,\n.ant-tabs-tab-remove:focus,\n.ant-tabs-tab-btn:active,\n.ant-tabs-tab-remove:active {\n  color: #388ed3;\n}\n.ant-tabs-tab-btn {\n  outline: none;\n  transition: all 0.3s;\n}\n.ant-tabs-tab-remove {\n  flex: none;\n  margin-right: -4px;\n  margin-left: 8px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 12px;\n  background: transparent;\n  border: none;\n  outline: none;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-tabs-tab-remove:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-tabs-tab:hover {\n  color: #165996;\n}\n.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {\n  color: #177ddc;\n  text-shadow: 0 0 0.25px currentcolor;\n}\n.ant-tabs-tab.ant-tabs-tab-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,\n.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-tabs-tab .ant-tabs-tab-remove .anticon {\n  margin: 0;\n}\n.ant-tabs-tab .anticon {\n  margin-right: 12px;\n}\n.ant-tabs-tab + .ant-tabs-tab {\n  margin: 0 0 0 32px;\n}\n.ant-tabs-content {\n  position: relative;\n  width: 100%;\n}\n.ant-tabs-content-holder {\n  flex: auto;\n  min-width: 0;\n  min-height: 0;\n}\n.ant-tabs-tabpane {\n  outline: none;\n}\n.ant-tabs-tabpane-hidden {\n  display: none;\n}\n.ant-tabs-switch-appear,\n.ant-tabs-switch-enter {\n  transition: none;\n}\n.ant-tabs-switch-appear-start,\n.ant-tabs-switch-enter-start {\n  opacity: 0;\n}\n.ant-tabs-switch-appear-active,\n.ant-tabs-switch-enter-active {\n  opacity: 1;\n  transition: opacity 0.3s;\n}\n.ant-tabs-switch-leave {\n  position: absolute;\n  transition: none;\n  inset: 0;\n}\n.ant-tabs-switch-leave-start {\n  opacity: 1;\n}\n.ant-tabs-switch-leave-active {\n  opacity: 0;\n  transition: opacity 0.3s;\n}\n.ant-tag {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n  height: auto;\n  margin-right: 8px;\n  padding: 0 7px;\n  font-size: 12px;\n  line-height: 20px;\n  white-space: nowrap;\n  background: rgba(255, 255, 255, 0.04);\n  border: 1px solid #434343;\n  border-radius: 2px;\n  opacity: 1;\n  transition: all 0.3s;\n}\n.ant-tag,\n.ant-tag a,\n.ant-tag a:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-tag > a:first-child:last-child {\n  display: inline-block;\n  margin: 0 -8px;\n  padding: 0 8px;\n}\n.ant-tag-close-icon {\n  margin-left: 3px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 10px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-tag-close-icon:hover {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-tag-has-color {\n  border-color: transparent;\n}\n.ant-tag-has-color,\n.ant-tag-has-color a,\n.ant-tag-has-color a:hover,\n.ant-tag-has-color .anticon-close,\n.ant-tag-has-color .anticon-close:hover {\n  color: #fff;\n}\n.ant-tag-checkable {\n  background-color: transparent;\n  border-color: transparent;\n  cursor: pointer;\n}\n.ant-tag-checkable:not(.ant-tag-checkable-checked):hover {\n  color: #177ddc;\n}\n.ant-tag-checkable:active,\n.ant-tag-checkable-checked {\n  color: #fff;\n}\n.ant-tag-checkable-checked {\n  background-color: #177ddc;\n}\n.ant-tag-checkable:active {\n  background-color: #388ed3;\n}\n.ant-tag-hidden {\n  display: none;\n}\n.ant-tag-pink {\n  color: #e0529c;\n  background: #291321;\n  border-color: #551c3b;\n}\n.ant-tag-pink-inverse {\n  color: #fff;\n  background: #cb2b83;\n  border-color: #cb2b83;\n}\n.ant-tag-magenta {\n  color: #e0529c;\n  background: #291321;\n  border-color: #551c3b;\n}\n.ant-tag-magenta-inverse {\n  color: #fff;\n  background: #cb2b83;\n  border-color: #cb2b83;\n}\n.ant-tag-red {\n  color: #e84749;\n  background: #2a1215;\n  border-color: #58181c;\n}\n.ant-tag-red-inverse {\n  color: #fff;\n  background: #d32029;\n  border-color: #d32029;\n}\n.ant-tag-volcano {\n  color: #e87040;\n  background: #2b1611;\n  border-color: #592716;\n}\n.ant-tag-volcano-inverse {\n  color: #fff;\n  background: #d84a1b;\n  border-color: #d84a1b;\n}\n.ant-tag-orange {\n  color: #e89a3c;\n  background: #2b1d11;\n  border-color: #593815;\n}\n.ant-tag-orange-inverse {\n  color: #fff;\n  background: #d87a16;\n  border-color: #d87a16;\n}\n.ant-tag-yellow {\n  color: #e8d639;\n  background: #2b2611;\n  border-color: #595014;\n}\n.ant-tag-yellow-inverse {\n  color: #fff;\n  background: #d8bd14;\n  border-color: #d8bd14;\n}\n.ant-tag-gold {\n  color: #e8b339;\n  background: #2b2111;\n  border-color: #594214;\n}\n.ant-tag-gold-inverse {\n  color: #fff;\n  background: #d89614;\n  border-color: #d89614;\n}\n.ant-tag-cyan {\n  color: #33bcb7;\n  background: #112123;\n  border-color: #144848;\n}\n.ant-tag-cyan-inverse {\n  color: #fff;\n  background: #13a8a8;\n  border-color: #13a8a8;\n}\n.ant-tag-lime {\n  color: #a9d134;\n  background: #1f2611;\n  border-color: #3e4f13;\n}\n.ant-tag-lime-inverse {\n  color: #fff;\n  background: #8bbb11;\n  border-color: #8bbb11;\n}\n.ant-tag-green {\n  color: #6abe39;\n  background: #162312;\n  border-color: #274916;\n}\n.ant-tag-green-inverse {\n  color: #fff;\n  background: #49aa19;\n  border-color: #49aa19;\n}\n.ant-tag-blue {\n  color: #3c9ae8;\n  background: #111d2c;\n  border-color: #15395b;\n}\n.ant-tag-blue-inverse {\n  color: #fff;\n  background: #177ddc;\n  border-color: #177ddc;\n}\n.ant-tag-geekblue {\n  color: #5273e0;\n  background: #131629;\n  border-color: #1c2755;\n}\n.ant-tag-geekblue-inverse {\n  color: #fff;\n  background: #2b4acb;\n  border-color: #2b4acb;\n}\n.ant-tag-purple {\n  color: #854eca;\n  background: #1a1325;\n  border-color: #301c4d;\n}\n.ant-tag-purple-inverse {\n  color: #fff;\n  background: #642ab5;\n  border-color: #642ab5;\n}\n.ant-tag-success {\n  color: #49aa19;\n  background: #162312;\n  border-color: #274916;\n}\n.ant-tag-processing {\n  color: #177ddc;\n  background: #111b26;\n  border-color: #153450;\n}\n.ant-tag-error {\n  color: #a61d24;\n  background: #2a1215;\n  border-color: #58181c;\n}\n.ant-tag-warning {\n  color: #d89614;\n  background: #2b1d11;\n  border-color: #593815;\n}\n.ant-tag > .anticon + span,\n.ant-tag > span + .anticon {\n  margin-left: 7px;\n}\n.ant-tag.ant-tag-rtl {\n  margin-right: 0;\n  margin-left: 8px;\n  direction: rtl;\n  text-align: right;\n}\n.ant-tag-rtl .ant-tag-close-icon {\n  margin-right: 3px;\n  margin-left: 0;\n}\n.ant-tag-rtl.ant-tag > .anticon + span,\n.ant-tag-rtl.ant-tag > span + .anticon {\n  margin-right: 7px;\n  margin-left: 0;\n}\n.ant-timeline {\n  box-sizing: border-box;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  font-feature-settings: 'tnum';\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ant-timeline-item {\n  position: relative;\n  margin: 0;\n  padding-bottom: 20px;\n  font-size: 14px;\n  list-style: none;\n}\n.ant-timeline-item-tail {\n  position: absolute;\n  top: 10px;\n  left: 4px;\n  height: calc(100% - 10px);\n  border-left: 2px solid #303030;\n}\n.ant-timeline-item-pending .ant-timeline-item-head {\n  font-size: 12px;\n  background-color: transparent;\n}\n.ant-timeline-item-pending .ant-timeline-item-tail {\n  display: none;\n}\n.ant-timeline-item-head {\n  position: absolute;\n  width: 10px;\n  height: 10px;\n  background-color: #141414;\n  border: 2px solid transparent;\n  border-radius: 100px;\n}\n.ant-timeline-item-head-blue {\n  color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-timeline-item-head-red {\n  color: #a61d24;\n  border-color: #a61d24;\n}\n.ant-timeline-item-head-green {\n  color: #49aa19;\n  border-color: #49aa19;\n}\n.ant-timeline-item-head-gray {\n  color: rgba(255, 255, 255, 0.3);\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-timeline-item-head-custom {\n  position: absolute;\n  top: 5.5px;\n  left: 5px;\n  width: auto;\n  height: auto;\n  margin-top: 0;\n  padding: 3px 1px;\n  line-height: 1;\n  text-align: center;\n  border: 0;\n  border-radius: 0;\n  transform: translate(-50%, -50%);\n}\n.ant-timeline-item-content {\n  position: relative;\n  top: -7.001px;\n  margin: 0 0 0 26px;\n  word-break: break-word;\n}\n.ant-timeline-item-last > .ant-timeline-item-tail {\n  display: none;\n}\n.ant-timeline-item-last > .ant-timeline-item-content {\n  min-height: 48px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-right .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-label .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head,\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n  left: 50%;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head {\n  margin-left: -4px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n  margin-left: 1px;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content {\n  left: calc(50% - 4px);\n  width: calc(50% - 14px);\n  text-align: left;\n}\n.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content {\n  width: calc(50% - 12px);\n  margin: 0;\n  text-align: right;\n}\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom {\n  left: calc(100% - 4px - 2px);\n}\n.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content {\n  width: calc(100% - 18px);\n}\n.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {\n  display: block;\n  height: calc(100% - 14px);\n  border-left: 2px dotted #303030;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail {\n  display: none;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail {\n  top: 15px;\n  display: block;\n  height: calc(100% - 15px);\n  border-left: 2px dotted #303030;\n}\n.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content {\n  min-height: 48px;\n}\n.ant-timeline.ant-timeline-label .ant-timeline-item-label {\n  position: absolute;\n  top: -7.001px;\n  width: calc(50% - 12px);\n  text-align: right;\n}\n.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label {\n  left: calc(50% + 14px);\n  width: calc(50% - 14px);\n  text-align: left;\n}\n.ant-timeline-rtl {\n  direction: rtl;\n}\n.ant-timeline-rtl .ant-timeline-item-tail {\n  right: 4px;\n  left: auto;\n  border-right: 2px solid #303030;\n  border-left: none;\n}\n.ant-timeline-rtl .ant-timeline-item-head-custom {\n  right: 5px;\n  left: auto;\n  transform: translate(50%, -50%);\n}\n.ant-timeline-rtl .ant-timeline-item-content {\n  margin: 0 18px 0 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n  right: 50%;\n  left: auto;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head {\n  margin-right: -4px;\n  margin-left: 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom {\n  margin-right: 1px;\n  margin-left: 0;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content {\n  right: calc(50% - 4px);\n  left: auto;\n  text-align: right;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content {\n  text-align: left;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom {\n  right: 0;\n  left: auto;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content {\n  width: 100%;\n  margin-right: 18px;\n  text-align: right;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {\n  border-right: 2px dotted #303030;\n  border-left: none;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail {\n  border-right: 2px dotted #303030;\n  border-left: none;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label {\n  text-align: left;\n}\n.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label {\n  right: calc(50% + 14px);\n  text-align: right;\n}\n.ant-tooltip {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  width: max-content;\n  width: intrinsic;\n  max-width: 250px;\n  visibility: visible;\n}\n.ant-tooltip-content {\n  position: relative;\n}\n.ant-tooltip-hidden {\n  display: none;\n}\n.ant-tooltip-placement-top,\n.ant-tooltip-placement-topLeft,\n.ant-tooltip-placement-topRight {\n  padding-bottom: 14.3137085px;\n}\n.ant-tooltip-placement-right,\n.ant-tooltip-placement-rightTop,\n.ant-tooltip-placement-rightBottom {\n  padding-left: 14.3137085px;\n}\n.ant-tooltip-placement-bottom,\n.ant-tooltip-placement-bottomLeft,\n.ant-tooltip-placement-bottomRight {\n  padding-top: 14.3137085px;\n}\n.ant-tooltip-placement-left,\n.ant-tooltip-placement-leftTop,\n.ant-tooltip-placement-leftBottom {\n  padding-right: 14.3137085px;\n}\n.ant-tooltip-inner {\n  min-width: 30px;\n  min-height: 32px;\n  padding: 6px 8px;\n  color: #fff;\n  text-align: left;\n  text-decoration: none;\n  word-wrap: break-word;\n  background-color: #434343;\n  border-radius: 2px;\n  box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n.ant-tooltip-arrow {\n  position: absolute;\n  z-index: 2;\n  display: block;\n  width: 22px;\n  height: 22px;\n  overflow: hidden;\n  background: transparent;\n  pointer-events: none;\n}\n.ant-tooltip-arrow-content {\n  --antd-arrow-background-color: linear-gradient(to right bottom, rgba(67, 67, 67, 0.9), #434343);\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  display: block;\n  width: 11.3137085px;\n  height: 11.3137085px;\n  margin: auto;\n  content: '';\n  pointer-events: auto;\n  border-radius: 0 0 2px;\n  pointer-events: none;\n}\n.ant-tooltip-arrow-content::before {\n  position: absolute;\n  top: -11.3137085px;\n  left: -11.3137085px;\n  width: 33.9411255px;\n  height: 33.9411255px;\n  background: var(--antd-arrow-background-color);\n  background-repeat: no-repeat;\n  background-position: -10px -10px;\n  content: '';\n  clip-path: inset(33% 33%);\n  clip-path: path('M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z');\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow,\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow,\n.ant-tooltip-placement-topRight .ant-tooltip-arrow {\n  bottom: 0;\n  transform: translateY(100%);\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow-content,\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,\n.ant-tooltip-placement-topRight .ant-tooltip-arrow-content {\n  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateY(-11px) rotate(45deg);\n}\n.ant-tooltip-placement-top .ant-tooltip-arrow {\n  left: 50%;\n  transform: translateY(100%) translateX(-50%);\n}\n.ant-tooltip-placement-topLeft .ant-tooltip-arrow {\n  left: 13px;\n}\n.ant-tooltip-placement-topRight .ant-tooltip-arrow {\n  right: 13px;\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow,\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow,\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {\n  left: 0;\n  transform: translateX(-100%);\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow-content,\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content,\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content {\n  box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateX(11px) rotate(135deg);\n}\n.ant-tooltip-placement-right .ant-tooltip-arrow {\n  top: 50%;\n  transform: translateX(-100%) translateY(-50%);\n}\n.ant-tooltip-placement-rightTop .ant-tooltip-arrow {\n  top: 5px;\n}\n.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {\n  bottom: 5px;\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow,\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow,\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {\n  right: 0;\n  transform: translateX(100%);\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow-content,\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content,\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content {\n  box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateX(-11px) rotate(315deg);\n}\n.ant-tooltip-placement-left .ant-tooltip-arrow {\n  top: 50%;\n  transform: translateX(100%) translateY(-50%);\n}\n.ant-tooltip-placement-leftTop .ant-tooltip-arrow {\n  top: 5px;\n}\n.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {\n  bottom: 5px;\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow,\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {\n  top: 0;\n  transform: translateY(-100%);\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content {\n  box-shadow: -3px -3px 7px rgba(0, 0, 0, 0.07);\n  transform: translateY(11px) rotate(225deg);\n}\n.ant-tooltip-placement-bottom .ant-tooltip-arrow {\n  left: 50%;\n  transform: translateY(-100%) translateX(-50%);\n}\n.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow {\n  left: 13px;\n}\n.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {\n  right: 13px;\n}\n.ant-tooltip-pink .ant-tooltip-inner {\n  background-color: #cb2b83;\n}\n.ant-tooltip-pink .ant-tooltip-arrow-content::before {\n  background: #cb2b83;\n}\n.ant-tooltip-magenta .ant-tooltip-inner {\n  background-color: #cb2b83;\n}\n.ant-tooltip-magenta .ant-tooltip-arrow-content::before {\n  background: #cb2b83;\n}\n.ant-tooltip-red .ant-tooltip-inner {\n  background-color: #d32029;\n}\n.ant-tooltip-red .ant-tooltip-arrow-content::before {\n  background: #d32029;\n}\n.ant-tooltip-volcano .ant-tooltip-inner {\n  background-color: #d84a1b;\n}\n.ant-tooltip-volcano .ant-tooltip-arrow-content::before {\n  background: #d84a1b;\n}\n.ant-tooltip-orange .ant-tooltip-inner {\n  background-color: #d87a16;\n}\n.ant-tooltip-orange .ant-tooltip-arrow-content::before {\n  background: #d87a16;\n}\n.ant-tooltip-yellow .ant-tooltip-inner {\n  background-color: #d8bd14;\n}\n.ant-tooltip-yellow .ant-tooltip-arrow-content::before {\n  background: #d8bd14;\n}\n.ant-tooltip-gold .ant-tooltip-inner {\n  background-color: #d89614;\n}\n.ant-tooltip-gold .ant-tooltip-arrow-content::before {\n  background: #d89614;\n}\n.ant-tooltip-cyan .ant-tooltip-inner {\n  background-color: #13a8a8;\n}\n.ant-tooltip-cyan .ant-tooltip-arrow-content::before {\n  background: #13a8a8;\n}\n.ant-tooltip-lime .ant-tooltip-inner {\n  background-color: #8bbb11;\n}\n.ant-tooltip-lime .ant-tooltip-arrow-content::before {\n  background: #8bbb11;\n}\n.ant-tooltip-green .ant-tooltip-inner {\n  background-color: #49aa19;\n}\n.ant-tooltip-green .ant-tooltip-arrow-content::before {\n  background: #49aa19;\n}\n.ant-tooltip-blue .ant-tooltip-inner {\n  background-color: #177ddc;\n}\n.ant-tooltip-blue .ant-tooltip-arrow-content::before {\n  background: #177ddc;\n}\n.ant-tooltip-geekblue .ant-tooltip-inner {\n  background-color: #2b4acb;\n}\n.ant-tooltip-geekblue .ant-tooltip-arrow-content::before {\n  background: #2b4acb;\n}\n.ant-tooltip-purple .ant-tooltip-inner {\n  background-color: #642ab5;\n}\n.ant-tooltip-purple .ant-tooltip-arrow-content::before {\n  background: #642ab5;\n}\n.ant-tooltip-rtl {\n  direction: rtl;\n}\n.ant-tooltip-rtl .ant-tooltip-inner {\n  text-align: right;\n}\n.ant-transfer-customize-list .ant-transfer-list {\n  flex: 1 1 50%;\n  width: auto;\n  height: auto;\n  min-height: 200px;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small {\n  border: 0;\n  border-radius: 0;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column {\n  width: 40px;\n  min-width: 40px;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th {\n  background: #1d1d1d;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content .ant-table-row:last-child td {\n  border-bottom: 1px solid #303030;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body {\n  margin: 0;\n}\n.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination {\n  margin: 16px 0 4px;\n}\n.ant-transfer-customize-list .ant-input[disabled] {\n  background-color: transparent;\n}\n.ant-transfer-status-error .ant-transfer-list {\n  border-color: #a61d24;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]) {\n  border-color: #434343;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-transfer-status-warning .ant-transfer-list {\n  border-color: #d89614;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]) {\n  border-color: #434343;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover {\n  border-color: #165996;\n  border-right-width: 1px;\n}\n.ant-input-rtl .ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus {\n  border-color: #177ddc;\n  box-shadow: 0 0 0 2px rgba(23, 125, 220, 0.2);\n  border-right-width: 1px;\n  outline: 0;\n}\n.ant-input-rtl .ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus {\n  border-right-width: 0;\n  border-left-width: 1px !important;\n}\n.ant-transfer {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  display: flex;\n  align-items: stretch;\n}\n.ant-transfer-disabled .ant-transfer-list {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-transfer-list {\n  display: flex;\n  flex-direction: column;\n  width: 180px;\n  height: 200px;\n  border: 1px solid #434343;\n  border-radius: 2px;\n}\n.ant-transfer-list-with-pagination {\n  width: 250px;\n  height: auto;\n}\n.ant-transfer-list-search .anticon-search {\n  color: rgba(255, 255, 255, 0.3);\n}\n.ant-transfer-list-header {\n  display: flex;\n  flex: none;\n  align-items: center;\n  height: 40px;\n  padding: 8px 12px 9px;\n  color: rgba(255, 255, 255, 0.85);\n  background: #141414;\n  border-bottom: 1px solid #303030;\n  border-radius: 2px 2px 0 0;\n}\n.ant-transfer-list-header > *:not(:last-child) {\n  margin-right: 4px;\n}\n.ant-transfer-list-header > * {\n  flex: none;\n}\n.ant-transfer-list-header-title {\n  flex: auto;\n  overflow: hidden;\n  white-space: nowrap;\n  text-align: right;\n  text-overflow: ellipsis;\n}\n.ant-transfer-list-header-dropdown {\n  font-size: 10px;\n  transform: translateY(10%);\n  cursor: pointer;\n}\n.ant-transfer-list-header-dropdown[disabled] {\n  cursor: not-allowed;\n}\n.ant-transfer-list-body {\n  display: flex;\n  flex: auto;\n  flex-direction: column;\n  overflow: hidden;\n  font-size: 14px;\n}\n.ant-transfer-list-body-search-wrapper {\n  position: relative;\n  flex: none;\n  padding: 12px;\n}\n.ant-transfer-list-content {\n  flex: auto;\n  margin: 0;\n  padding: 0;\n  overflow: auto;\n  list-style: none;\n}\n.ant-transfer-list-content-item {\n  display: flex;\n  align-items: center;\n  min-height: 32px;\n  padding: 6px 12px;\n  line-height: 20px;\n  transition: all 0.3s;\n}\n.ant-transfer-list-content-item > *:not(:last-child) {\n  margin-right: 8px;\n}\n.ant-transfer-list-content-item > * {\n  flex: none;\n}\n.ant-transfer-list-content-item-text {\n  flex: auto;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-transfer-list-content-item-remove {\n  position: relative;\n  color: #434343;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-transfer-list-content-item-remove:hover {\n  color: #165996;\n}\n.ant-transfer-list-content-item-remove::after {\n  position: absolute;\n  top: -6px;\n  right: -50%;\n  bottom: -6px;\n  left: -50%;\n  content: '';\n}\n.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n  background-color: #262626;\n  cursor: pointer;\n}\n.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover {\n  background-color: #0e161f;\n}\n.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {\n  background: transparent;\n  cursor: default;\n}\n.ant-transfer-list-content-item-checked {\n  background-color: #111b26;\n}\n.ant-transfer-list-content-item-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-transfer-list-pagination {\n  padding: 8px 0;\n  text-align: right;\n  border-top: 1px solid #303030;\n}\n.ant-transfer-list-body-not-found {\n  flex: none;\n  width: 100%;\n  margin: auto 0;\n  color: rgba(255, 255, 255, 0.3);\n  text-align: center;\n}\n.ant-transfer-list-footer {\n  border-top: 1px solid #303030;\n}\n.ant-transfer-operation {\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  align-self: center;\n  margin: 0 8px;\n  vertical-align: middle;\n}\n.ant-transfer-operation .ant-btn {\n  display: block;\n}\n.ant-transfer-operation .ant-btn:first-child {\n  margin-bottom: 4px;\n}\n.ant-transfer-operation .ant-btn .anticon {\n  font-size: 12px;\n}\n.ant-transfer .ant-empty-image {\n  max-height: -2px;\n}\n.ant-transfer-rtl {\n  direction: rtl;\n}\n.ant-transfer-rtl .ant-transfer-list-search {\n  padding-right: 8px;\n  padding-left: 24px;\n}\n.ant-transfer-rtl .ant-transfer-list-search-action {\n  right: auto;\n  left: 12px;\n}\n.ant-transfer-rtl .ant-transfer-list-header > *:not(:last-child) {\n  margin-right: 0;\n  margin-left: 4px;\n}\n.ant-transfer-rtl .ant-transfer-list-header {\n  right: 0;\n  left: auto;\n}\n.ant-transfer-rtl .ant-transfer-list-header-title {\n  text-align: left;\n}\n.ant-transfer-rtl .ant-transfer-list-content-item > *:not(:last-child) {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-transfer-rtl .ant-transfer-list-pagination {\n  text-align: left;\n}\n.ant-transfer-rtl .ant-transfer-list-footer {\n  right: 0;\n  left: auto;\n}\n@keyframes ant-tree-node-fx-do-not-use {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode {\n  position: relative;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 4px;\n  left: 0;\n  transition: background-color 0.3s;\n  content: '';\n  pointer-events: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode:hover::before {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode > * {\n  z-index: 1;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher {\n  transition: color 0.3s;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper {\n  border-radius: 0;\n  user-select: none;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover {\n  background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected {\n  color: #fff;\n  background: transparent;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before,\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected::before {\n  background: #177ddc;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher {\n  color: #fff;\n}\n.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper {\n  color: #fff;\n  background: transparent;\n}\n.ant-tree-checkbox {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  top: 0.2em;\n  line-height: 1;\n  white-space: nowrap;\n  outline: none;\n  cursor: pointer;\n}\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox:hover .ant-tree-checkbox-inner,\n.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner {\n  border-color: #177ddc;\n}\n.ant-tree-checkbox-checked::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 2px;\n  visibility: hidden;\n  animation: antCheckboxEffect 0.36s ease-in-out;\n  animation-fill-mode: backwards;\n  content: '';\n}\n.ant-tree-checkbox:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox::after {\n  visibility: visible;\n}\n.ant-tree-checkbox-inner {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 16px;\n  height: 16px;\n  direction: ltr;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  border-collapse: separate;\n  transition: all 0.3s;\n}\n.ant-tree-checkbox-inner::after {\n  position: absolute;\n  top: 50%;\n  left: 21.5%;\n  display: table;\n  width: 5.71428571px;\n  height: 9.14285714px;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(0) translate(-50%, -50%);\n  opacity: 0;\n  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n  content: ' ';\n}\n.ant-tree-checkbox-input {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  opacity: 0;\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n  position: absolute;\n  display: table;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(1) translate(-50%, -50%);\n  opacity: 1;\n  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n  content: ' ';\n}\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner {\n  background-color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-tree-checkbox-disabled {\n  cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.3);\n  animation-name: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-input {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner {\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343 !important;\n}\n.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.08);\n  border-collapse: separate;\n  animation-name: none;\n}\n.ant-tree-checkbox-disabled + span {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-tree-checkbox-disabled:hover::after,\n.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled::after {\n  visibility: hidden;\n}\n.ant-tree-checkbox-wrapper {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-flex;\n  align-items: baseline;\n  line-height: unset;\n  cursor: pointer;\n}\n.ant-tree-checkbox-wrapper::after {\n  display: inline-block;\n  width: 0;\n  overflow: hidden;\n  content: '\\a0';\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled {\n  cursor: not-allowed;\n}\n.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper {\n  margin-left: 8px;\n}\n.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type='checkbox'] {\n  width: 14px;\n  height: 14px;\n}\n.ant-tree-checkbox + span {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-tree-checkbox-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n}\n.ant-tree-checkbox-group-item {\n  margin-right: 8px;\n}\n.ant-tree-checkbox-group-item:last-child {\n  margin-right: 0;\n}\n.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item {\n  margin-left: 0;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner {\n  background-color: transparent;\n  border-color: #434343;\n}\n.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after {\n  top: 50%;\n  left: 50%;\n  width: 8px;\n  height: 8px;\n  background-color: #177ddc;\n  border: 0;\n  transform: translate(-50%, -50%) scale(1);\n  opacity: 1;\n  content: ' ';\n}\n.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after {\n  background-color: rgba(255, 255, 255, 0.3);\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-tree-checkbox-rtl {\n  direction: rtl;\n}\n.ant-tree-checkbox-group-rtl .ant-tree-checkbox-group-item {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-tree-checkbox-group-rtl .ant-tree-checkbox-group-item:last-child {\n  margin-left: 0 !important;\n}\n.ant-tree-checkbox-group-rtl .ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item {\n  margin-left: 8px;\n}\n.ant-tree {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  background: transparent;\n  border-radius: 2px;\n  transition: background-color 0.3s;\n}\n.ant-tree-focused:not(:hover):not(.ant-tree-active-focused) {\n  background: #111b26;\n}\n.ant-tree-list-holder-inner {\n  align-items: flex-start;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner {\n  align-items: stretch;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper {\n  flex: auto;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging {\n  position: relative;\n}\n.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 4px;\n  left: 0;\n  border: 1px solid #177ddc;\n  opacity: 0;\n  animation: ant-tree-node-fx-do-not-use 0.3s;\n  animation-play-state: running;\n  animation-fill-mode: forwards;\n  content: '';\n  pointer-events: none;\n}\n.ant-tree .ant-tree-treenode {\n  display: flex;\n  align-items: flex-start;\n  padding: 0 0 4px 0;\n  outline: none;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover {\n  background: transparent;\n}\n.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title {\n  color: inherit;\n  font-weight: 500;\n}\n.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n  width: 24px;\n  line-height: 24px;\n  text-align: center;\n  visibility: visible;\n  opacity: 0.2;\n  transition: opacity 0.3s;\n}\n.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon {\n  opacity: 0.45;\n}\n.ant-tree .ant-tree-treenode-draggable.ant-tree-treenode-disabled .ant-tree-draggable-icon {\n  visibility: hidden;\n}\n.ant-tree-indent {\n  align-self: stretch;\n  white-space: nowrap;\n  user-select: none;\n}\n.ant-tree-indent-unit {\n  display: inline-block;\n  width: 24px;\n}\n.ant-tree-draggable-icon {\n  visibility: hidden;\n}\n.ant-tree-switcher {\n  position: relative;\n  flex: none;\n  align-self: stretch;\n  width: 24px;\n  margin: 0;\n  line-height: 24px;\n  text-align: center;\n  cursor: pointer;\n  user-select: none;\n}\n.ant-tree-switcher .ant-tree-switcher-icon,\n.ant-tree-switcher .ant-select-tree-switcher-icon {\n  display: inline-block;\n  font-size: 10px;\n  vertical-align: baseline;\n}\n.ant-tree-switcher .ant-tree-switcher-icon svg,\n.ant-tree-switcher .ant-select-tree-switcher-icon svg {\n  transition: transform 0.3s;\n}\n.ant-tree-switcher-noop {\n  cursor: default;\n}\n.ant-tree-switcher_close .ant-tree-switcher-icon svg {\n  transform: rotate(-90deg);\n}\n.ant-tree-switcher-loading-icon {\n  color: #177ddc;\n}\n.ant-tree-switcher-leaf-line {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n  width: 100%;\n  height: 100%;\n}\n.ant-tree-switcher-leaf-line::before {\n  position: absolute;\n  top: 0;\n  right: 12px;\n  bottom: -4px;\n  margin-left: -1px;\n  border-right: 1px solid #d9d9d9;\n  content: ' ';\n}\n.ant-tree-switcher-leaf-line::after {\n  position: absolute;\n  width: 10px;\n  height: 14px;\n  border-bottom: 1px solid #d9d9d9;\n  content: ' ';\n}\n.ant-tree-checkbox {\n  top: initial;\n  margin: 4px 8px 0 0;\n}\n.ant-tree .ant-tree-node-content-wrapper {\n  position: relative;\n  z-index: auto;\n  min-height: 24px;\n  margin: 0;\n  padding: 0 4px;\n  color: inherit;\n  line-height: 24px;\n  background: transparent;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n}\n.ant-tree .ant-tree-node-content-wrapper:hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected {\n  background-color: #11263c;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle {\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  line-height: 24px;\n  text-align: center;\n  vertical-align: top;\n}\n.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty {\n  display: none;\n}\n.ant-tree-unselectable .ant-tree-node-content-wrapper:hover {\n  background-color: transparent;\n}\n.ant-tree-node-content-wrapper {\n  line-height: 24px;\n  user-select: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator {\n  position: absolute;\n  z-index: 1;\n  height: 2px;\n  background-color: #177ddc;\n  border-radius: 1px;\n  pointer-events: none;\n}\n.ant-tree-node-content-wrapper .ant-tree-drop-indicator::after {\n  position: absolute;\n  top: -3px;\n  left: -6px;\n  width: 8px;\n  height: 8px;\n  background-color: transparent;\n  border: 2px solid #177ddc;\n  border-radius: 50%;\n  content: '';\n}\n.ant-tree .ant-tree-treenode.drop-container > [draggable] {\n  box-shadow: 0 0 0 2px #177ddc;\n}\n.ant-tree-show-line .ant-tree-indent-unit {\n  position: relative;\n  height: 100%;\n}\n.ant-tree-show-line .ant-tree-indent-unit::before {\n  position: absolute;\n  top: 0;\n  right: 12px;\n  bottom: -4px;\n  border-right: 1px solid #434343;\n  content: '';\n}\n.ant-tree-show-line .ant-tree-indent-unit-end::before {\n  display: none;\n}\n.ant-tree-show-line .ant-tree-switcher {\n  background: #141414;\n}\n.ant-tree-show-line .ant-tree-switcher-line-icon {\n  vertical-align: -0.15em;\n}\n.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line::before {\n  top: auto !important;\n  bottom: auto !important;\n  height: 14px !important;\n}\n.ant-tree-rtl {\n  direction: rtl;\n}\n.ant-tree-rtl .ant-tree-node-content-wrapper[draggable='true'] .ant-tree-drop-indicator::after {\n  right: -6px;\n  left: unset;\n}\n.ant-tree .ant-tree-treenode-rtl {\n  direction: rtl;\n}\n.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg {\n  transform: rotate(90deg);\n}\n.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit::before {\n  right: auto;\n  left: -13px;\n  border-right: none;\n  border-left: 1px solid #434343;\n}\n.ant-tree-rtl .ant-tree-checkbox {\n  margin: 4px 0 0 8px;\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox {\n  margin: 4px 0 0 8px;\n}\n.ant-select-tree-checkbox {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  top: 0.2em;\n  line-height: 1;\n  white-space: nowrap;\n  outline: none;\n  cursor: pointer;\n}\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,\n.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner,\n.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner {\n  border-color: #177ddc;\n}\n.ant-select-tree-checkbox-checked::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #177ddc;\n  border-radius: 2px;\n  visibility: hidden;\n  animation: antCheckboxEffect 0.36s ease-in-out;\n  animation-fill-mode: backwards;\n  content: '';\n}\n.ant-select-tree-checkbox:hover::after,\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox::after {\n  visibility: visible;\n}\n.ant-select-tree-checkbox-inner {\n  position: relative;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 16px;\n  height: 16px;\n  direction: ltr;\n  background-color: transparent;\n  border: 1px solid #434343;\n  border-radius: 2px;\n  border-collapse: separate;\n  transition: all 0.3s;\n}\n.ant-select-tree-checkbox-inner::after {\n  position: absolute;\n  top: 50%;\n  left: 21.5%;\n  display: table;\n  width: 5.71428571px;\n  height: 9.14285714px;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(0) translate(-50%, -50%);\n  opacity: 0;\n  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;\n  content: ' ';\n}\n.ant-select-tree-checkbox-input {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  opacity: 0;\n}\n.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after {\n  position: absolute;\n  display: table;\n  border: 2px solid #fff;\n  border-top: 0;\n  border-left: 0;\n  transform: rotate(45deg) scale(1) translate(-50%, -50%);\n  opacity: 1;\n  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;\n  content: ' ';\n}\n.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner {\n  background-color: #177ddc;\n  border-color: #177ddc;\n}\n.ant-select-tree-checkbox-disabled {\n  cursor: not-allowed;\n}\n.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.3);\n  animation-name: none;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner {\n  background-color: rgba(255, 255, 255, 0.08);\n  border-color: #434343 !important;\n}\n.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after {\n  border-color: rgba(255, 255, 255, 0.08);\n  border-collapse: separate;\n  animation-name: none;\n}\n.ant-select-tree-checkbox-disabled + span {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-select-tree-checkbox-disabled:hover::after,\n.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled::after {\n  visibility: hidden;\n}\n.ant-select-tree-checkbox-wrapper {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-flex;\n  align-items: baseline;\n  line-height: unset;\n  cursor: pointer;\n}\n.ant-select-tree-checkbox-wrapper::after {\n  display: inline-block;\n  width: 0;\n  overflow: hidden;\n  content: '\\a0';\n}\n.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled {\n  cursor: not-allowed;\n}\n.ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper {\n  margin-left: 8px;\n}\n.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type='checkbox'] {\n  width: 14px;\n  height: 14px;\n}\n.ant-select-tree-checkbox + span {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.ant-select-tree-checkbox-group {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  display: inline-block;\n}\n.ant-select-tree-checkbox-group-item {\n  margin-right: 8px;\n}\n.ant-select-tree-checkbox-group-item:last-child {\n  margin-right: 0;\n}\n.ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item {\n  margin-left: 0;\n}\n.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner {\n  background-color: transparent;\n  border-color: #434343;\n}\n.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after {\n  top: 50%;\n  left: 50%;\n  width: 8px;\n  height: 8px;\n  background-color: #177ddc;\n  border: 0;\n  transform: translate(-50%, -50%) scale(1);\n  opacity: 1;\n  content: ' ';\n}\n.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after {\n  background-color: rgba(255, 255, 255, 0.3);\n  border-color: rgba(255, 255, 255, 0.3);\n}\n.ant-select-tree-checkbox-rtl {\n  direction: rtl;\n}\n.ant-select-tree-checkbox-group-rtl .ant-select-tree-checkbox-group-item {\n  margin-right: 0;\n  margin-left: 8px;\n}\n.ant-select-tree-checkbox-group-rtl .ant-select-tree-checkbox-group-item:last-child {\n  margin-left: 0 !important;\n}\n.ant-select-tree-checkbox-group-rtl .ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item {\n  margin-left: 8px;\n}\n.ant-tree-select-dropdown {\n  padding: 8px 4px;\n}\n.ant-tree-select-dropdown-rtl {\n  direction: rtl;\n}\n.ant-tree-select-dropdown .ant-select-tree {\n  border-radius: 0;\n}\n.ant-tree-select-dropdown .ant-select-tree-list-holder-inner {\n  align-items: stretch;\n}\n.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper {\n  flex: auto;\n}\n.ant-select-tree {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  background: transparent;\n  border-radius: 2px;\n  transition: background-color 0.3s;\n}\n.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused) {\n  background: #111b26;\n}\n.ant-select-tree-list-holder-inner {\n  align-items: flex-start;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner {\n  align-items: stretch;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper {\n  flex: auto;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging {\n  position: relative;\n}\n.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 4px;\n  left: 0;\n  border: 1px solid #177ddc;\n  opacity: 0;\n  animation: ant-tree-node-fx-do-not-use 0.3s;\n  animation-play-state: running;\n  animation-fill-mode: forwards;\n  content: '';\n  pointer-events: none;\n}\n.ant-select-tree .ant-select-tree-treenode {\n  display: flex;\n  align-items: flex-start;\n  padding: 0 0 4px 0;\n  outline: none;\n}\n.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover {\n  background: transparent;\n}\n.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title {\n  color: inherit;\n  font-weight: 500;\n}\n.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon {\n  width: 24px;\n  line-height: 24px;\n  text-align: center;\n  visibility: visible;\n  opacity: 0.2;\n  transition: opacity 0.3s;\n}\n.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon {\n  opacity: 0.45;\n}\n.ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon {\n  visibility: hidden;\n}\n.ant-select-tree-indent {\n  align-self: stretch;\n  white-space: nowrap;\n  user-select: none;\n}\n.ant-select-tree-indent-unit {\n  display: inline-block;\n  width: 24px;\n}\n.ant-select-tree-draggable-icon {\n  visibility: hidden;\n}\n.ant-select-tree-switcher {\n  position: relative;\n  flex: none;\n  align-self: stretch;\n  width: 24px;\n  margin: 0;\n  line-height: 24px;\n  text-align: center;\n  cursor: pointer;\n  user-select: none;\n}\n.ant-select-tree-switcher .ant-tree-switcher-icon,\n.ant-select-tree-switcher .ant-select-tree-switcher-icon {\n  display: inline-block;\n  font-size: 10px;\n  vertical-align: baseline;\n}\n.ant-select-tree-switcher .ant-tree-switcher-icon svg,\n.ant-select-tree-switcher .ant-select-tree-switcher-icon svg {\n  transition: transform 0.3s;\n}\n.ant-select-tree-switcher-noop {\n  cursor: default;\n}\n.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg {\n  transform: rotate(-90deg);\n}\n.ant-select-tree-switcher-loading-icon {\n  color: #177ddc;\n}\n.ant-select-tree-switcher-leaf-line {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n  width: 100%;\n  height: 100%;\n}\n.ant-select-tree-switcher-leaf-line::before {\n  position: absolute;\n  top: 0;\n  right: 12px;\n  bottom: -4px;\n  margin-left: -1px;\n  border-right: 1px solid #d9d9d9;\n  content: ' ';\n}\n.ant-select-tree-switcher-leaf-line::after {\n  position: absolute;\n  width: 10px;\n  height: 14px;\n  border-bottom: 1px solid #d9d9d9;\n  content: ' ';\n}\n.ant-select-tree-checkbox {\n  top: initial;\n  margin: 4px 8px 0 0;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper {\n  position: relative;\n  z-index: auto;\n  min-height: 24px;\n  margin: 0;\n  padding: 0 4px;\n  color: inherit;\n  line-height: 24px;\n  background: transparent;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper:hover {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {\n  background-color: #11263c;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle {\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  line-height: 24px;\n  text-align: center;\n  vertical-align: top;\n}\n.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty {\n  display: none;\n}\n.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover {\n  background-color: transparent;\n}\n.ant-select-tree-node-content-wrapper {\n  line-height: 24px;\n  user-select: none;\n}\n.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator {\n  position: absolute;\n  z-index: 1;\n  height: 2px;\n  background-color: #177ddc;\n  border-radius: 1px;\n  pointer-events: none;\n}\n.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator::after {\n  position: absolute;\n  top: -3px;\n  left: -6px;\n  width: 8px;\n  height: 8px;\n  background-color: transparent;\n  border: 2px solid #177ddc;\n  border-radius: 50%;\n  content: '';\n}\n.ant-select-tree .ant-select-tree-treenode.drop-container > [draggable] {\n  box-shadow: 0 0 0 2px #177ddc;\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit {\n  position: relative;\n  height: 100%;\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit::before {\n  position: absolute;\n  top: 0;\n  right: 12px;\n  bottom: -4px;\n  border-right: 1px solid #434343;\n  content: '';\n}\n.ant-select-tree-show-line .ant-select-tree-indent-unit-end::before {\n  display: none;\n}\n.ant-select-tree-show-line .ant-select-tree-switcher {\n  background: #141414;\n}\n.ant-select-tree-show-line .ant-select-tree-switcher-line-icon {\n  vertical-align: -0.15em;\n}\n.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line::before {\n  top: auto !important;\n  bottom: auto !important;\n  height: 14px !important;\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg {\n  transform: rotate(90deg);\n}\n.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon {\n  transform: scaleY(-1);\n}\n.ant-typography {\n  color: rgba(255, 255, 255, 0.85);\n  word-break: break-word;\n}\n.ant-typography.ant-typography-secondary {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-typography.ant-typography-success {\n  color: #49aa19;\n}\n.ant-typography.ant-typography-warning {\n  color: #d89614;\n}\n.ant-typography.ant-typography-danger {\n  color: #a61d24;\n}\na.ant-typography.ant-typography-danger:active,\na.ant-typography.ant-typography-danger:focus {\n  color: #800f19;\n}\na.ant-typography.ant-typography-danger:hover {\n  color: #b33b3d;\n}\n.ant-typography.ant-typography-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n  user-select: none;\n}\ndiv.ant-typography,\n.ant-typography p {\n  margin-bottom: 1em;\n}\nh1.ant-typography,\ndiv.ant-typography-h1,\ndiv.ant-typography-h1 > textarea,\n.ant-typography h1 {\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 38px;\n  line-height: 1.23;\n}\nh2.ant-typography,\ndiv.ant-typography-h2,\ndiv.ant-typography-h2 > textarea,\n.ant-typography h2 {\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 30px;\n  line-height: 1.35;\n}\nh3.ant-typography,\ndiv.ant-typography-h3,\ndiv.ant-typography-h3 > textarea,\n.ant-typography h3 {\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 24px;\n  line-height: 1.35;\n}\nh4.ant-typography,\ndiv.ant-typography-h4,\ndiv.ant-typography-h4 > textarea,\n.ant-typography h4 {\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 20px;\n  line-height: 1.4;\n}\nh5.ant-typography,\ndiv.ant-typography-h5,\ndiv.ant-typography-h5 > textarea,\n.ant-typography h5 {\n  margin-bottom: 0.5em;\n  color: rgba(255, 255, 255, 0.85);\n  font-weight: 600;\n  font-size: 16px;\n  line-height: 1.5;\n}\n.ant-typography + h1.ant-typography,\n.ant-typography + h2.ant-typography,\n.ant-typography + h3.ant-typography,\n.ant-typography + h4.ant-typography,\n.ant-typography + h5.ant-typography {\n  margin-top: 1.2em;\n}\n.ant-typography div + h1,\n.ant-typography ul + h1,\n.ant-typography li + h1,\n.ant-typography p + h1,\n.ant-typography h1 + h1,\n.ant-typography h2 + h1,\n.ant-typography h3 + h1,\n.ant-typography h4 + h1,\n.ant-typography h5 + h1,\n.ant-typography div + h2,\n.ant-typography ul + h2,\n.ant-typography li + h2,\n.ant-typography p + h2,\n.ant-typography h1 + h2,\n.ant-typography h2 + h2,\n.ant-typography h3 + h2,\n.ant-typography h4 + h2,\n.ant-typography h5 + h2,\n.ant-typography div + h3,\n.ant-typography ul + h3,\n.ant-typography li + h3,\n.ant-typography p + h3,\n.ant-typography h1 + h3,\n.ant-typography h2 + h3,\n.ant-typography h3 + h3,\n.ant-typography h4 + h3,\n.ant-typography h5 + h3,\n.ant-typography div + h4,\n.ant-typography ul + h4,\n.ant-typography li + h4,\n.ant-typography p + h4,\n.ant-typography h1 + h4,\n.ant-typography h2 + h4,\n.ant-typography h3 + h4,\n.ant-typography h4 + h4,\n.ant-typography h5 + h4,\n.ant-typography div + h5,\n.ant-typography ul + h5,\n.ant-typography li + h5,\n.ant-typography p + h5,\n.ant-typography h1 + h5,\n.ant-typography h2 + h5,\n.ant-typography h3 + h5,\n.ant-typography h4 + h5,\n.ant-typography h5 + h5 {\n  margin-top: 1.2em;\n}\na.ant-typography-ellipsis,\nspan.ant-typography-ellipsis {\n  display: inline-block;\n  max-width: 100%;\n}\na.ant-typography,\n.ant-typography a {\n  color: #177ddc;\n  outline: none;\n  cursor: pointer;\n  transition: color 0.3s;\n  text-decoration: none;\n}\na.ant-typography:focus-visible,\n.ant-typography a:focus-visible,\na.ant-typography:hover,\n.ant-typography a:hover {\n  color: #165996;\n}\na.ant-typography:active,\n.ant-typography a:active {\n  color: #388ed3;\n}\na.ant-typography:active,\n.ant-typography a:active,\na.ant-typography:hover,\n.ant-typography a:hover {\n  text-decoration: none;\n}\na.ant-typography[disabled],\n.ant-typography a[disabled],\na.ant-typography.ant-typography-disabled,\n.ant-typography a.ant-typography-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\na.ant-typography[disabled]:active,\n.ant-typography a[disabled]:active,\na.ant-typography.ant-typography-disabled:active,\n.ant-typography a.ant-typography-disabled:active,\na.ant-typography[disabled]:hover,\n.ant-typography a[disabled]:hover,\na.ant-typography.ant-typography-disabled:hover,\n.ant-typography a.ant-typography-disabled:hover {\n  color: rgba(255, 255, 255, 0.3);\n}\na.ant-typography[disabled]:active,\n.ant-typography a[disabled]:active,\na.ant-typography.ant-typography-disabled:active,\n.ant-typography a.ant-typography-disabled:active {\n  pointer-events: none;\n}\n.ant-typography code {\n  margin: 0 0.2em;\n  padding: 0.2em 0.4em 0.1em;\n  font-size: 85%;\n  background: rgba(150, 150, 150, 0.1);\n  border: 1px solid rgba(100, 100, 100, 0.2);\n  border-radius: 3px;\n}\n.ant-typography kbd {\n  margin: 0 0.2em;\n  padding: 0.15em 0.4em 0.1em;\n  font-size: 90%;\n  background: rgba(150, 150, 150, 0.06);\n  border: 1px solid rgba(100, 100, 100, 0.2);\n  border-bottom-width: 2px;\n  border-radius: 3px;\n}\n.ant-typography mark {\n  padding: 0;\n  background-color: #594214;\n}\n.ant-typography u,\n.ant-typography ins {\n  text-decoration: underline;\n  text-decoration-skip-ink: auto;\n}\n.ant-typography s,\n.ant-typography del {\n  text-decoration: line-through;\n}\n.ant-typography strong {\n  font-weight: 600;\n}\n.ant-typography-expand,\n.ant-typography-edit,\n.ant-typography-copy {\n  color: #177ddc;\n  outline: none;\n  cursor: pointer;\n  transition: color 0.3s;\n  margin-left: 4px;\n}\n.ant-typography-expand:focus-visible,\n.ant-typography-edit:focus-visible,\n.ant-typography-copy:focus-visible,\n.ant-typography-expand:hover,\n.ant-typography-edit:hover,\n.ant-typography-copy:hover {\n  color: #165996;\n}\n.ant-typography-expand:active,\n.ant-typography-edit:active,\n.ant-typography-copy:active {\n  color: #388ed3;\n}\n.ant-typography-copy-success,\n.ant-typography-copy-success:hover,\n.ant-typography-copy-success:focus {\n  color: #49aa19;\n}\n.ant-typography-edit-content {\n  position: relative;\n}\ndiv.ant-typography-edit-content {\n  left: -12px;\n  margin-top: -5px;\n  margin-bottom: calc(1em - 4px - 1px);\n}\n.ant-typography-edit-content-confirm {\n  position: absolute;\n  right: 10px;\n  bottom: 8px;\n  color: rgba(255, 255, 255, 0.45);\n  font-weight: normal;\n  font-size: 14px;\n  font-style: normal;\n  pointer-events: none;\n}\n.ant-typography-edit-content textarea {\n  height: 1em;\n  margin: 0 !important;\n  /* stylelint-disable-next-line property-no-vendor-prefix */\n  -moz-transition: none;\n}\n.ant-typography ul,\n.ant-typography ol {\n  margin: 0 0 1em;\n  padding: 0;\n}\n.ant-typography ul li,\n.ant-typography ol li {\n  margin: 0 0 0 20px;\n  padding: 0 0 0 4px;\n}\n.ant-typography ul {\n  list-style-type: circle;\n}\n.ant-typography ul ul {\n  list-style-type: disc;\n}\n.ant-typography ol {\n  list-style-type: decimal;\n}\n.ant-typography pre,\n.ant-typography blockquote {\n  margin: 1em 0;\n}\n.ant-typography pre {\n  padding: 0.4em 0.6em;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n  background: rgba(150, 150, 150, 0.1);\n  border: 1px solid rgba(100, 100, 100, 0.2);\n  border-radius: 3px;\n}\n.ant-typography pre code {\n  display: inline;\n  margin: 0;\n  padding: 0;\n  font-size: inherit;\n  font-family: inherit;\n  background: transparent;\n  border: 0;\n}\n.ant-typography blockquote {\n  padding: 0 0 0 0.6em;\n  border-left: 4px solid rgba(100, 100, 100, 0.2);\n  opacity: 0.85;\n}\n.ant-typography-single-line {\n  white-space: nowrap;\n}\n.ant-typography-ellipsis-single-line {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\na.ant-typography-ellipsis-single-line,\nspan.ant-typography-ellipsis-single-line {\n  vertical-align: bottom;\n}\n.ant-typography-ellipsis-multiple-line {\n  /* stylelint-disable-next-line value-no-vendor-prefix */\n  display: -webkit-box;\n  overflow: hidden;\n  -webkit-line-clamp: 3;\n  /*! autoprefixer: ignore next */\n  -webkit-box-orient: vertical;\n}\n.ant-typography-rtl {\n  direction: rtl;\n}\n.ant-typography-rtl .ant-typography-expand,\n.ant-typography-rtl .ant-typography-edit,\n.ant-typography-rtl .ant-typography-copy {\n  margin-right: 4px;\n  margin-left: 0;\n}\n.ant-typography-rtl .ant-typography-expand {\n  float: left;\n}\ndiv.ant-typography-edit-content.ant-typography-rtl {\n  right: -12px;\n  left: auto;\n}\n.ant-typography-rtl .ant-typography-edit-content-confirm {\n  right: auto;\n  left: 10px;\n}\n.ant-typography-rtl.ant-typography ul li,\n.ant-typography-rtl.ant-typography ol li {\n  margin: 0 20px 0 0;\n  padding: 0 4px 0 0;\n}\n.ant-upload {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5715;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  outline: 0;\n}\n.ant-upload p {\n  margin: 0;\n}\n.ant-upload-btn {\n  display: block;\n  width: 100%;\n  outline: none;\n}\n.ant-upload input[type='file'] {\n  cursor: pointer;\n}\n.ant-upload.ant-upload-select {\n  display: inline-block;\n}\n.ant-upload.ant-upload-disabled {\n  color: rgba(255, 255, 255, 0.3);\n  cursor: not-allowed;\n}\n.ant-upload.ant-upload-select-picture-card {\n  width: 104px;\n  height: 104px;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  text-align: center;\n  vertical-align: top;\n  background-color: rgba(255, 255, 255, 0.04);\n  border: 1px dashed #434343;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: border-color 0.3s;\n}\n.ant-upload.ant-upload-select-picture-card > .ant-upload {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 100%;\n  text-align: center;\n}\n.ant-upload.ant-upload-select-picture-card:hover {\n  border-color: #177ddc;\n}\n.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover {\n  border-color: #434343;\n}\n.ant-upload.ant-upload-drag {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  text-align: center;\n  background: rgba(255, 255, 255, 0.04);\n  border: 1px dashed #434343;\n  border-radius: 2px;\n  cursor: pointer;\n  transition: border-color 0.3s;\n}\n.ant-upload.ant-upload-drag .ant-upload {\n  padding: 16px 0;\n}\n.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) {\n  border-color: #388ed3;\n}\n.ant-upload.ant-upload-drag.ant-upload-disabled {\n  cursor: not-allowed;\n}\n.ant-upload.ant-upload-drag .ant-upload-btn {\n  display: table;\n  height: 100%;\n}\n.ant-upload.ant-upload-drag .ant-upload-drag-container {\n  display: table-cell;\n  vertical-align: middle;\n}\n.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover {\n  border-color: #165996;\n}\n.ant-upload.ant-upload-drag p.ant-upload-drag-icon {\n  margin-bottom: 20px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon {\n  color: #165996;\n  font-size: 48px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-text {\n  margin: 0 0 4px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n}\n.ant-upload.ant-upload-drag p.ant-upload-hint {\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-upload.ant-upload-drag .anticon-plus {\n  color: rgba(255, 255, 255, 0.3);\n  font-size: 30px;\n  transition: all 0.3s;\n}\n.ant-upload.ant-upload-drag .anticon-plus:hover {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-upload.ant-upload-drag:hover .anticon-plus {\n  color: rgba(255, 255, 255, 0.45);\n}\n.ant-upload-picture-card-wrapper {\n  display: inline-block;\n  width: 100%;\n}\n.ant-upload-picture-card-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-upload-picture-card-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-upload-picture-card-wrapper::before {\n  display: table;\n  content: '';\n}\n.ant-upload-picture-card-wrapper::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-upload-list {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  line-height: 1.5715;\n}\n.ant-upload-list::before {\n  display: table;\n  content: '';\n}\n.ant-upload-list::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-upload-list::before {\n  display: table;\n  content: '';\n}\n.ant-upload-list::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n.ant-upload-list-item {\n  position: relative;\n  height: 22.001px;\n  margin-top: 8px;\n  font-size: 14px;\n}\n.ant-upload-list-item-name {\n  display: inline-block;\n  width: 100%;\n  padding-left: 22px;\n  overflow: hidden;\n  line-height: 1.5715;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ant-upload-list-item-card-actions {\n  position: absolute;\n  right: 0;\n}\n.ant-upload-list-item-card-actions-btn {\n  opacity: 0;\n}\n.ant-upload-list-item-card-actions-btn.ant-btn-sm {\n  height: 22.001px;\n  line-height: 1;\n  vertical-align: top;\n}\n.ant-upload-list-item-card-actions.picture {\n  top: 22px;\n  line-height: 0;\n}\n.ant-upload-list-item-card-actions-btn:focus,\n.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn {\n  opacity: 1;\n}\n.ant-upload-list-item-card-actions .anticon {\n  color: rgba(255, 255, 255, 0.45);\n  transition: all 0.3s;\n}\n.ant-upload-list-item-card-actions:hover .anticon {\n  color: rgba(255, 255, 255, 0.85);\n}\n.ant-upload-list-item-info {\n  height: 100%;\n  transition: background-color 0.3s;\n}\n.ant-upload-list-item-info > span {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ant-upload-list-item-info .anticon-loading .anticon,\n.ant-upload-list-item-info .ant-upload-text-icon .anticon {\n  position: absolute;\n  top: 5px;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n}\n.ant-upload-list-item:hover .ant-upload-list-item-info {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn {\n  opacity: 1;\n}\n.ant-upload-list-item-error,\n.ant-upload-list-item-error .ant-upload-text-icon > .anticon,\n.ant-upload-list-item-error .ant-upload-list-item-name {\n  color: #a61d24;\n}\n.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon {\n  color: #a61d24;\n}\n.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn {\n  opacity: 1;\n}\n.ant-upload-list-item-progress {\n  position: absolute;\n  bottom: -12px;\n  width: 100%;\n  padding-left: 26px;\n  font-size: 14px;\n  line-height: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item,\n.ant-upload-list-picture-card .ant-upload-list-item {\n  position: relative;\n  height: 66px;\n  padding: 8px;\n  border: 1px solid #434343;\n  border-radius: 2px;\n}\n.ant-upload-list-picture .ant-upload-list-item:hover,\n.ant-upload-list-picture-card .ant-upload-list-item:hover {\n  background: transparent;\n}\n.ant-upload-list-picture .ant-upload-list-item-error,\n.ant-upload-list-picture-card .ant-upload-list-item-error {\n  border-color: #a61d24;\n}\n.ant-upload-list-picture .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n  padding: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info {\n  background: transparent;\n}\n.ant-upload-list-picture .ant-upload-list-item-uploading,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading {\n  border-style: dashed;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail {\n  width: 48px;\n  height: 48px;\n  line-height: 60px;\n  text-align: center;\n  opacity: 0.8;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon {\n  font-size: 26px;\n}\n.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'],\n.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'] {\n  fill: #2a1215;\n}\n.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'],\n.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'] {\n  fill: #a61d24;\n}\n.ant-upload-list-picture .ant-upload-list-item-icon,\n.ant-upload-list-picture-card .ant-upload-list-item-icon {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  font-size: 26px;\n  transform: translate(-50%, -50%);\n}\n.ant-upload-list-picture .ant-upload-list-item-icon .anticon,\n.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon {\n  font-size: 26px;\n}\n.ant-upload-list-picture .ant-upload-list-item-image,\n.ant-upload-list-picture-card .ant-upload-list-item-image {\n  max-width: 100%;\n}\n.ant-upload-list-picture .ant-upload-list-item-thumbnail img,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {\n  display: block;\n  width: 48px;\n  height: 48px;\n  overflow: hidden;\n}\n.ant-upload-list-picture .ant-upload-list-item-name,\n.ant-upload-list-picture-card .ant-upload-list-item-name {\n  display: inline-block;\n  box-sizing: border-box;\n  max-width: 100%;\n  margin: 0 0 0 8px;\n  padding-right: 8px;\n  padding-left: 48px;\n  overflow: hidden;\n  line-height: 44px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  transition: all 0.3s;\n}\n.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name {\n  margin-bottom: 12px;\n}\n.ant-upload-list-picture .ant-upload-list-item-progress,\n.ant-upload-list-picture-card .ant-upload-list-item-progress {\n  bottom: 14px;\n  width: calc(100% - 24px);\n  margin-top: 0;\n  padding-left: 56px;\n}\n.ant-upload-list-picture-card-container {\n  display: inline-block;\n  width: 104px;\n  height: 104px;\n  margin: 0 8px 8px 0;\n  vertical-align: top;\n}\n.ant-upload-list-picture-card .ant-upload-list-item {\n  height: 100%;\n  margin: 0;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n  position: relative;\n  height: 100%;\n  overflow: hidden;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info::before {\n  position: absolute;\n  z-index: 1;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n  opacity: 0;\n  transition: all 0.3s;\n  content: ' ';\n}\n.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info::before {\n  opacity: 1;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 10;\n  white-space: nowrap;\n  transform: translate(-50%, -50%);\n  opacity: 0;\n  transition: all 0.3s;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete {\n  z-index: 10;\n  width: 16px;\n  margin: 0 4px;\n  color: rgba(255, 255, 255, 0.85);\n  font-size: 16px;\n  cursor: pointer;\n  transition: all 0.3s;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover,\n.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover {\n  color: #fff;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-info:hover + .ant-upload-list-item-actions,\n.ant-upload-list-picture-card .ant-upload-list-item-actions:hover {\n  opacity: 1;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,\n.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {\n  position: static;\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: contain;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-name {\n  display: none;\n  margin: 8px 0 0;\n  padding: 0;\n  line-height: 1.5715;\n  text-align: center;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name {\n  position: absolute;\n  bottom: 10px;\n  display: block;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item {\n  background-color: rgba(255, 255, 255, 0.04);\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info {\n  height: auto;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info::before,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye,\n.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete {\n  display: none;\n}\n.ant-upload-list-picture-card .ant-upload-list-item-progress {\n  bottom: 32px;\n  width: calc(100% - 14px);\n  padding-left: 0;\n}\n.ant-upload-list-text-container,\n.ant-upload-list-picture-container {\n  transition: opacity 0.3s, height 0.3s;\n}\n.ant-upload-list-text-container::before,\n.ant-upload-list-picture-container::before {\n  display: table;\n  width: 0;\n  height: 0;\n  content: '';\n}\n.ant-upload-list-text-container .ant-upload-span,\n.ant-upload-list-picture-container .ant-upload-span {\n  display: block;\n  flex: auto;\n}\n.ant-upload-list-text .ant-upload-span,\n.ant-upload-list-picture .ant-upload-span {\n  display: flex;\n  align-items: center;\n}\n.ant-upload-list-text .ant-upload-span > *,\n.ant-upload-list-picture .ant-upload-span > * {\n  flex: none;\n}\n.ant-upload-list-text .ant-upload-list-item-name,\n.ant-upload-list-picture .ant-upload-list-item-name {\n  flex: auto;\n  margin: 0;\n  padding: 0 8px;\n}\n.ant-upload-list-text .ant-upload-list-item-card-actions,\n.ant-upload-list-picture .ant-upload-list-item-card-actions {\n  position: static;\n}\n.ant-upload-list-text .ant-upload-text-icon .anticon {\n  position: static;\n}\n.ant-upload-list .ant-upload-animate-inline-appear,\n.ant-upload-list .ant-upload-animate-inline-enter,\n.ant-upload-list .ant-upload-animate-inline-leave {\n  animation-duration: 0.3s;\n  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n  animation-fill-mode: forwards;\n}\n.ant-upload-list .ant-upload-animate-inline-appear,\n.ant-upload-list .ant-upload-animate-inline-enter {\n  animation-name: uploadAnimateInlineIn;\n}\n.ant-upload-list .ant-upload-animate-inline-leave {\n  animation-name: uploadAnimateInlineOut;\n}\n@keyframes uploadAnimateInlineIn {\n  from {\n    width: 0;\n    height: 0;\n    margin: 0;\n    padding: 0;\n    opacity: 0;\n  }\n}\n@keyframes uploadAnimateInlineOut {\n  to {\n    width: 0;\n    height: 0;\n    margin: 0;\n    padding: 0;\n    opacity: 0;\n  }\n}\n.ant-upload-rtl {\n  direction: rtl;\n}\n.ant-upload-rtl.ant-upload.ant-upload-select-picture-card {\n  margin-right: auto;\n  margin-left: 8px;\n}\n.ant-upload-list-rtl {\n  direction: rtl;\n}\n.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1 {\n  padding-right: 22px;\n  padding-left: 14px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2 {\n  padding-right: 22px;\n  padding-left: 28px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-name {\n  padding-right: 22px;\n  padding-left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1 {\n  padding-left: 14px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-card-actions {\n  right: auto;\n  left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon {\n  padding-right: 0;\n  padding-left: 5px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-info {\n  padding: 0 4px 0 12px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon {\n  padding-right: 0;\n  padding-left: 5px;\n}\n.ant-upload-list-rtl .ant-upload-list-item-progress {\n  padding-right: 26px;\n  padding-left: 0;\n}\n.ant-upload-list-picture .ant-upload-list-item-info,\n.ant-upload-list-picture-card .ant-upload-list-item-info {\n  padding: 0;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail {\n  right: 8px;\n  left: auto;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon {\n  right: 50%;\n  left: auto;\n  transform: translate(50%, -50%);\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name {\n  margin: 0 8px 0 0;\n  padding-right: 48px;\n  padding-left: 8px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1 {\n  padding-right: 48px;\n  padding-left: 18px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2 {\n  padding-right: 48px;\n  padding-left: 36px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress,\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress {\n  padding-right: 0;\n  padding-left: 0;\n}\n.ant-upload-list-rtl .ant-upload-list-picture-card-container {\n  margin: 0 0 8px 8px;\n}\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions {\n  right: 50%;\n  left: auto;\n  transform: translate(50%, -50%);\n}\n.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name {\n  margin: 8px 0 0;\n  padding: 0;\n}\n@font-face {\n  font-family: 'Oxanium';\n  src: local('Oxanium'), url(./fonts/Oxanium-Medium.ttf) format('truetype');\n}\n:root {\n  --app-max-width: 1200px;\n  --app-background-color: var(--vscode-editor-background, #1e1e1e);\n  --diff-background-color: #1e1e1e;\n  --diff-text-color: #fafafa;\n  --diff-selection-background-color: #5a5f80;\n  --diff-gutter-insert-background-color: #082525;\n  --diff-gutter-delete-background-color: #2b1523;\n  --diff-gutter-selected-background-color: #5a5f80;\n  --diff-code-insert-background-color: #082525;\n  --diff-code-delete-background-color: #2b1523;\n  --diff-code-insert-edit-background-color: #00462f;\n  --diff-code-delete-edit-background-color: #4e2436;\n  --diff-code-selected-background-color: #5a5f80;\n  --diff-omit-background-color: #101120;\n  --diff-decoration-gutter-background-color: #222;\n  --diff-decoration-gutter-color: #ababab;\n  --diff-decoration-content-background-color: #222;\n  --diff-decoration-content-color: #ababab;\n}\nbody[data-content=\"sidebar\"] {\n  --app-background-color: var(--vscode-sideBar-background);\n}\nbody.windhawk-no-pointer-events {\n  pointer-events: none;\n}\nbody.windhawk-no-pointer-events .ant-modal-content {\n  pointer-events: none;\n}\nbody.windhawk-no-pointer-events .ant-select.ant-select-open,\nbody.windhawk-no-pointer-events .windhawk-popup-content,\nbody.windhawk-no-pointer-events .windhawk-popup-content-no-select {\n  pointer-events: auto;\n}\n.windhawk-popup-content-no-select {\n  user-select: none;\n}\n.ant-select-item-option-active:not(.ant-select-item-option-disabled) {\n  color: #fff;\n  background-color: #1f1f1f;\n}\n.ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n  color: #fff;\n  background-color: #177ddc;\n}\n.rc-virtual-list-scrollbar-thumb {\n  border-radius: 0 !important;\n  background: rgba(121, 121, 121, 0.4) !important;\n}\n.ant-dropdown-menu-item-active:not(.ant-dropdown-menu-item-disabled) {\n  color: #fff;\n  background-color: #1f1f1f;\n}\n.ant-dropdown-menu-item-selected:not(.ant-dropdown-menu-item-disabled) {\n  color: #fff;\n  background-color: #177ddc;\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/app.less",
    "content": "@import 'antd/dist/antd.dark.less';\n\n@font-face {\n  font-family: 'Oxanium';\n  src: local('Oxanium'), url(./fonts/Oxanium-Medium.ttf) format('truetype');\n}\n\n:root {\n  --app-max-width: 1200px;\n  --app-background-color: var(--vscode-editor-background, #1e1e1e);\n\n  // https://github.com/otakustay/react-diff-view/blob/f9e5f9f248f331598e5c9e7839fccb211efe43c2/site/components/DiffView/diff.global.less\n  --diff-background-color: #1e1e1e;\n  --diff-text-color: #fafafa;\n  --diff-selection-background-color: #5a5f80;\n  --diff-gutter-insert-background-color: #082525;\n  --diff-gutter-delete-background-color: #2b1523;\n  --diff-gutter-selected-background-color: #5a5f80;\n  --diff-code-insert-background-color: #082525;\n  --diff-code-delete-background-color: #2b1523;\n  --diff-code-insert-edit-background-color: #00462f;\n  --diff-code-delete-edit-background-color: #4e2436;\n  --diff-code-selected-background-color: #5a5f80;\n  --diff-omit-background-color: #101120;\n  --diff-decoration-gutter-background-color: #222;\n  --diff-decoration-gutter-color: #ababab;\n  --diff-decoration-content-background-color: #222;\n  --diff-decoration-content-color: #ababab;\n}\n\nbody[data-content=\"sidebar\"] {\n  --app-background-color: var(--vscode-sideBar-background);\n}\n\n@body-background: var(--app-background-color);\n\nbody.windhawk-no-pointer-events {\n  pointer-events: none;\n\n  .ant-modal-content {\n    pointer-events: none;\n  }\n\n  .ant-select.ant-select-open,\n    .windhawk-popup-content,\n    .windhawk-popup-content-no-select {\n    pointer-events: auto;\n  }\n}\n\n.windhawk-popup-content-no-select {\n  user-select: none;\n}\n\n// An ugly patch providing dark theme for select elements.\n.@{select-prefix-cls} {\n  &-item {\n    &-option {\n      &-active:not(&-disabled) {\n        color: @text-color-inverse;\n        background-color: @menu-dark-bg;\n      }\n\n      &-selected:not(&-disabled) {\n        color: @text-color-inverse;\n        background-color: @primary-color;\n      }\n    }\n  }\n}\n\n.rc-virtual-list-scrollbar-thumb {\n  border-radius: 0 !important;\n  background: rgba(121, 121, 121, 0.4) !important;\n}\n\n// An ugly patch providing dark theme for dropdown menu elements.\n.@{dropdown-prefix-cls} {\n  &-menu {\n    &-item {\n      &-active:not(&-disabled) {\n        color: @text-color-inverse;\n        background-color: @menu-dark-bg;\n      }\n\n      &-selected:not(&-disabled) {\n        color: @text-color-inverse;\n        background-color: @primary-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/app.tsx",
    "content": "import { ConfigProvider } from 'antd';\nimport 'prism-themes/themes/prism-vsc-dark-plus.css';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport 'react-diff-view/style/index.css';\nimport { useTranslation } from 'react-i18next';\nimport './App.css';\nimport {\n  AppUISettingsContext,\n  AppUISettingsContextType,\n} from './appUISettings';\nimport { setLanguage } from './i18n';\nimport { mockAppUISettings, useMockData } from './panel/mockData';\nimport Panel from './panel/Panel';\nimport Sidebar from './sidebar/Sidebar';\nimport { useGetInitialAppSettings, useSetNewAppSettings } from './webviewIPC';\n\nfunction WhenTranslationIsReady(\n  props: React.PropsWithChildren<Record<never, never>>\n) {\n  const { ready } = useTranslation();\n  // https://stackoverflow.com/a/63898849\n  // eslint-disable-next-line react/jsx-no-useless-fragment\n  return ready ? <>{props.children}</> : null;\n}\n\nfunction App() {\n  const content = useMemo(\n    () =>\n      document.querySelector('body')?.getAttribute('data-content') ??\n      (document.location.hash === '#/debug_sidebar' ? 'sidebar' : 'panel'),\n    []\n  );\n\n  const [appUISettings, setAppUISettings] =\n    useState<AppUISettingsContextType | null>(null);\n\n  const [direction, setDirection] = useState<'ltr' | 'rtl'>('ltr');\n\n  const applyNewLanguage = useCallback((language?: string) => {\n    setLanguage(language);\n    const rtlLanguages = ['ar', 'he', 'fa', 'ur'];\n    if (language && rtlLanguages.includes(language.split('-')[0])) {\n      setDirection('rtl');\n      document.documentElement.setAttribute('dir', 'rtl');\n    } else {\n      setDirection('ltr');\n      document.documentElement.setAttribute('dir', 'ltr');\n    }\n  }, []);\n\n  const { getInitialAppSettings } = useGetInitialAppSettings(\n    useCallback((data) => {\n      applyNewLanguage(data.appUISettings?.language);\n      setAppUISettings(data.appUISettings || {});\n    }, [applyNewLanguage])\n  );\n\n  useEffect(() => {\n    if (!useMockData) {\n      getInitialAppSettings({});\n    } else {\n      applyNewLanguage(mockAppUISettings?.language);\n      setAppUISettings(mockAppUISettings || {});\n    }\n  }, [applyNewLanguage, getInitialAppSettings]);\n\n  useSetNewAppSettings(\n    useCallback((data) => {\n      applyNewLanguage(data.appUISettings?.language);\n      setAppUISettings(data.appUISettings || {});\n    }, [applyNewLanguage])\n  );\n\n  if (!content || !appUISettings) {\n    return null;\n  }\n\n  return (\n    <WhenTranslationIsReady>\n      <AppUISettingsContext.Provider value={appUISettings}>\n        <ConfigProvider direction={direction}>\n          {content === 'panel' ? (\n            <Panel />\n          ) : content === 'sidebar' ? (\n            <Sidebar />\n          ) : (\n            ''\n          )}\n        </ConfigProvider>\n      </AppUISettingsContext.Provider>\n    </WhenTranslationIsReady>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/appUISettings.ts",
    "content": "import React from 'react';\nimport { AppUISettings } from './webviewIPCMessages';\n\nexport type AppUISettingsContextType = Partial<AppUISettings>;\n\nexport const AppUISettingsContext =\n  React.createContext<AppUISettingsContextType>({});\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/components/EllipsisText.tsx",
    "content": "import { Typography } from 'antd';\nimport { TooltipPlacement } from 'antd/lib/tooltip';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface Props extends React.PropsWithChildren {\n  className?: string;\n  style?: React.CSSProperties;\n  tooltipPlacement?: TooltipPlacement;\n}\n\n/**\n * A text component that automatically shows a tooltip when truncated.\n * Uses ResizeObserver to recalculate ellipsis on width changes.\n * Automatically hides tooltip when resizing to prevent stale tooltip display.\n */\nfunction EllipsisText(props: Props) {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [tooltipHide, setTooltipHide] = useState(false);\n  const [ellipsisKey, setEllipsisKey] = useState(0);\n\n  useEffect(() => {\n    const element = containerRef.current;\n    if (!element) {\n      return;\n    }\n\n    const resizeObserver = new ResizeObserver(() => {\n      // Prevent tooltip from being shown when ellipsis appears\n      setTooltipHide(true);\n      // Trigger ellipsis recalculation by changing the key\n      setEllipsisKey((prev) => prev + 1);\n    });\n\n    resizeObserver.observe(element);\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, []);\n\n  return (\n    <Typography.Text\n      ref={containerRef}\n      className={props.className}\n      style={props.style}\n      ellipsis={{\n        tooltip: {\n          placement: props.tooltipPlacement,\n          onOpenChange: (visible) => {\n            if (visible) {\n              setTooltipHide(false);\n            }\n          },\n          ... (\n            tooltipHide ? { open: false } : {}\n          )\n        },\n      }}\n    >\n      {props.children}\n      {/* Change key to force ellipsis recalculation on resize */}\n      <span key={ellipsisKey}></span>\n    </Typography.Text>\n  );\n}\n\nexport default EllipsisText;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/components/InputWithContextMenu.tsx",
    "content": "import {\n  Dropdown,\n  DropdownProps,\n  Input,\n  InputNumber,\n  InputNumberProps,\n  MenuProps,\n  Popconfirm,\n  PopconfirmProps,\n  Select,\n  SelectProps,\n} from 'antd';\nimport { InputProps, InputRef, TextAreaProps } from 'antd/lib/input';\nimport { TextAreaRef } from 'antd/lib/input/TextArea';\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nfunction useItems() {\n  const { t } = useTranslation();\n\n  const items: MenuProps['items'] = useMemo(\n    () => [\n      {\n        label: t('general.cut'),\n        key: 'cut',\n      },\n      {\n        label: t('general.copy'),\n        key: 'copy',\n      },\n      {\n        label: t('general.paste'),\n        key: 'paste',\n      },\n      {\n        type: 'divider',\n      },\n      {\n        label: t('general.selectAll'),\n        key: 'selectAll',\n      },\n    ],\n    [t]\n  );\n\n  return items;\n}\n\nfunction onClick(\n  textArea: HTMLTextAreaElement | HTMLInputElement | null | undefined,\n  key: string\n) {\n  if (textArea) {\n    textArea.focus();\n    document.execCommand(key);\n  }\n\n  document.body.classList.remove('windhawk-no-pointer-events');\n}\n\nfunction onOpenChange(open: boolean) {\n  if (open) {\n    document.body.classList.add('windhawk-no-pointer-events');\n  } else {\n    document.body.classList.remove('windhawk-no-pointer-events');\n  }\n}\n\nconst InputWithContextMenu = forwardRef<InputRef, InputProps>(\n  ({ children, ...rest }, ref) => {\n    const items = useItems();\n    const internalRef = useRef<InputRef>(null);\n\n    useImperativeHandle(ref, () => internalRef.current || ({} as InputRef));\n\n    const handleMenuClick = useCallback(\n      (info: { key: string }) => onClick(internalRef.current?.input || null, info.key),\n      []\n    );\n\n    useEffect(() => {\n      return () => {\n        document.body.classList.remove('windhawk-no-pointer-events');\n      };\n    }, []);\n\n    return (\n      <Dropdown\n        menu={{\n          items,\n          onClick: handleMenuClick,\n        }}\n        onOpenChange={onOpenChange}\n        trigger={['contextMenu']}\n        overlayClassName=\"windhawk-popup-content-no-select\"\n      >\n        <Input ref={internalRef} {...rest}>\n          {children}\n        </Input>\n      </Dropdown>\n    );\n  }\n);\n\nInputWithContextMenu.displayName = 'InputWithContextMenu';\n\nconst InputNumberWithContextMenu = forwardRef<HTMLInputElement, InputNumberProps>(\n  ({ children, ...rest }, ref) => {\n    const items = useItems();\n    const internalRef = useRef<HTMLInputElement>(null);\n\n    useImperativeHandle(ref, () => internalRef.current || ({} as HTMLInputElement));\n\n    const handleMenuClick = useCallback(\n      (info: { key: string }) => onClick(internalRef.current || null, info.key),\n      []\n    );\n\n    useEffect(() => {\n      return () => {\n        document.body.classList.remove('windhawk-no-pointer-events');\n      };\n    }, []);\n\n    return (\n      <Dropdown\n        menu={{\n          items,\n          onClick: handleMenuClick,\n        }}\n        onOpenChange={onOpenChange}\n        trigger={['contextMenu']}\n        overlayClassName=\"windhawk-popup-content-no-select\"\n      >\n        <InputNumber ref={internalRef} {...rest}>\n          {children}\n        </InputNumber>\n      </Dropdown>\n    );\n  }\n);\n\nInputNumberWithContextMenu.displayName = 'InputNumberWithContextMenu';\n\nconst TextAreaWithContextMenu = forwardRef<TextAreaRef, TextAreaProps>(\n  ({ children, ...rest }, ref) => {\n    const items = useItems();\n    const internalRef = useRef<TextAreaRef>(null);\n\n    useImperativeHandle(ref, () => internalRef.current || ({} as TextAreaRef));\n\n    const handleMenuClick = useCallback(\n      (info: { key: string }) =>\n        onClick(internalRef.current?.resizableTextArea?.textArea || null, info.key),\n      []\n    );\n\n    useEffect(() => {\n      return () => {\n        document.body.classList.remove('windhawk-no-pointer-events');\n      };\n    }, []);\n\n    return (\n      <Dropdown\n        menu={{\n          items,\n          onClick: handleMenuClick,\n        }}\n        onOpenChange={onOpenChange}\n        trigger={['contextMenu']}\n        overlayClassName=\"windhawk-popup-content-no-select\"\n      >\n        <Input.TextArea ref={internalRef} {...rest}>\n          {children}\n        </Input.TextArea>\n      </Dropdown>\n    );\n  }\n);\n\nTextAreaWithContextMenu.displayName = 'TextAreaWithContextMenu';\n\nfunction SelectModal({ children, ...rest }: SelectProps) {\n  const handleDropdownVisibleChange = useCallback(\n    (open: boolean) => {\n      onOpenChange(open);\n      rest.onDropdownVisibleChange?.(open);\n    },\n    [rest]\n  );\n\n  return (\n    <Select\n      popupClassName=\"windhawk-popup-content\"\n      {...rest}\n      onDropdownVisibleChange={handleDropdownVisibleChange}\n    >\n      {children}\n    </Select>\n  );\n}\n\nfunction PopconfirmModal({ children, ...rest }: PopconfirmProps) {\n  const handleOpenChange = useCallback(\n    (open: boolean) => {\n      onOpenChange(open);\n      rest.onOpenChange?.(open);\n    },\n    [rest]\n  );\n\n  return (\n    <Popconfirm\n      overlayClassName=\"windhawk-popup-content\"\n      {...rest}\n      onOpenChange={handleOpenChange}\n    >\n      {children}\n    </Popconfirm>\n  );\n}\n\nfunction DropdownModal({ children, ...rest }: DropdownProps) {\n  const handleOpenChange = useCallback(\n    (open: boolean) => {\n      onOpenChange(open);\n      rest.onOpenChange?.(open);\n    },\n    [rest]\n  );\n\n  return (\n    <Dropdown\n      {...rest}\n      onOpenChange={handleOpenChange}\n      overlayClassName=\"windhawk-popup-content-no-select\"\n    >\n      {children}\n    </Dropdown>\n  );\n}\n\nfunction dropdownModalDismissed() {\n  document.body.classList.remove('windhawk-no-pointer-events');\n}\n\nexport {\n  InputWithContextMenu,\n  InputNumberWithContextMenu,\n  TextAreaWithContextMenu,\n  SelectModal,\n  PopconfirmModal,\n  DropdownModal,\n  dropdownModalDismissed,\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/components/ReactMarkdownCustom.tsx",
    "content": "import type { Components } from 'react-markdown';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize from 'rehype-sanitize';\nimport rehypeSlug from 'rehype-slug';\nimport remarkGfm from 'remark-gfm';\nimport styled from 'styled-components';\nimport type { PluggableList } from 'unified';\nimport { sanitizeUrl } from '../utils';\n\nconst ReactMarkdownStyleWrapper = styled.div<{ $direction?: 'ltr' | 'rtl' }>`\n  // Word-wrap long lines.\n  overflow-wrap: break-word;\n\n  ${props => props.$direction && `\n    direction: ${props.$direction};\n    text-align: ${props.$direction === 'rtl' ? 'right' : 'left'};\n  `}\n\n  // Table style.\n  // https://github.com/micromark/micromark-extension-gfm-table#css\n\n  table {\n    border-spacing: 0;\n    border-collapse: collapse;\n    display: block;\n    margin-top: 0;\n    margin-bottom: 16px;\n    width: max-content;\n    max-width: 100%;\n    overflow: auto;\n  }\n\n  td,\n  th {\n    padding: 6px 13px;\n    border: 1px solid #434343;\n  }\n`;\n\ninterface Props {\n  markdown: string;\n  components?: Components;\n  allowHtml?: boolean;\n  direction?: 'ltr' | 'rtl';\n}\n\nfunction ReactMarkdownCustom({ markdown, components, allowHtml = false, direction }: Props) {\n  // Custom link component that sanitizes URLs\n  const defaultComponents: Components = {\n    a: ({ node, href, children, ...props }) => {\n      const sanitizedHref = sanitizeUrl(href);\n      return <a href={sanitizedHref} {...props}>{children}</a>;\n    }\n  };\n\n  // Merge provided components with default components\n  const mergedComponents = {\n    ...defaultComponents,\n    ...components\n  };\n\n  // Minimal schema: only allow basic formatting tags\n  const sanitizeSchema = {\n    tagNames: [\n      // Headings\n      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n      // Text formatting\n      'p', 'br', 'strong', 'b', 'em', 'i',\n      // Lists\n      'ul', 'ol', 'li',\n      // Blockquotes\n      'blockquote',\n      // Code\n      'code', 'pre',\n      // Links\n      'a'\n    ],\n    attributes: {\n      a: ['href'] // Only href for links, no other attributes\n    },\n    protocols: {\n      href: ['http', 'https', 'mailto'] // Safe protocols only\n    },\n    // Explicitly strip dangerous elements\n    strip: ['script', 'style', 'iframe', 'object', 'embed', 'img', 'video', 'audio']\n  };\n\n  // CRITICAL: rehype-raw MUST come before rehype-sanitize\n  const rehypePlugins: PluggableList = allowHtml\n    ? [rehypeSlug, rehypeRaw, [rehypeSanitize, sanitizeSchema]]\n    : [rehypeSlug];\n  const remarkPlugins: PluggableList = [remarkGfm];\n\n  return (\n    <ReactMarkdownStyleWrapper $direction={direction}>\n      <ReactMarkdown\n        children={markdown}\n        components={mergedComponents}\n        rehypePlugins={rehypePlugins}\n        remarkPlugins={remarkPlugins}\n      />\n    </ReactMarkdownStyleWrapper>\n  );\n}\n\nexport default ReactMarkdownCustom;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/i18n.ts",
    "content": "import i18n from 'i18next';\nimport Backend from 'i18next-http-backend';\nimport { initReactI18next } from 'react-i18next';\n\nlet initialized = false;\nconst defaultLanguage = 'en';\n\nfunction i18nInitialize(language: string) {\n  i18n\n    // load translation using http -> see /public/locales (i.e. https://github.com/i18next/react-i18next/tree/master/example/react/public/locales)\n    // learn more: https://github.com/i18next/i18next-http-backend\n    .use(Backend)\n    // pass the i18n instance to react-i18next.\n    .use(initReactI18next)\n    // init i18next\n    // for all options read: https://www.i18next.com/overview/configuration-options\n    .init({\n      lng: language,\n      fallbackLng: defaultLanguage,\n      //debug: true,\n\n      returnNull: false,\n      returnEmptyString: false,\n\n      interpolation: {\n        escapeValue: false, // not needed for react as it escapes by default\n      },\n\n      react: {\n        useSuspense: false,\n      },\n\n      backend: {\n        // Use a relative load path.\n        loadPath: './locales/{{lng}}/{{ns}}.json',\n      },\n    });\n}\n\nexport function setLanguage(language?: string) {\n  if (initialized) {\n    i18n.changeLanguage(language || defaultLanguage);\n    return;\n  }\n\n  i18nInitialize(language || defaultLanguage);\n  initialized = true;\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/About.tsx",
    "content": "import { Alert, Button } from 'antd';\nimport { useContext, useState } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport { ChangelogModal } from './ChangelogModal';\nimport { UpdateModal } from './UpdateModal';\n\nconst AboutContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n\n  // Without this the centered content looks too low.\n  padding-bottom: 10vh;\n`;\n\nconst AboutContent = styled.div`\n  margin: auto;\n  text-align: center;\n`;\n\nconst ContentSection = styled.div`\n  margin-bottom: 1.5em;\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    margin-bottom: 0;\n  }\n`;\n\nconst UpdateNoticeDescription = styled.div`\n  display: flex;\n  flex-direction: column;\n  row-gap: 8px;\n`;\n\nconst ButtonGroup = styled.div`\n  display: flex;\n  gap: 8px;\n  justify-content: center;\n`;\n\nfunction About() {\n  const { t } = useTranslation();\n  const [changelogModalOpen, setChangelogModalOpen] = useState(false);\n  const [updateModalOpen, setUpdateModalOpen] = useState(false);\n\n  const { updateIsAvailable } = useContext(AppUISettingsContext);\n\n  const currentVersion = (\n    process.env['REACT_APP_VERSION'] || 'unknown'\n  ).replace(/^(\\d+(?:\\.\\d+)+?)(\\.0+)+$/, '$1');\n\n  return (\n    <AboutContainer>\n      <AboutContent>\n        <ContentSection>\n          <h1>\n            {t('about.title', {\n              // version: currentVersion + ' ' + t('about.beta'),\n              version: currentVersion,\n            })}\n          </h1>\n          <h3>{t('about.subtitle')}</h3>\n          <h3>\n            <Trans\n              t={t}\n              i18nKey=\"about.credit\"\n              values={{ author: 'Ramen Software' }}\n              components={[<a href=\"https://ramensoftware.com/\">website</a>]}\n            />\n          </h3>\n        </ContentSection>\n        {updateIsAvailable && (\n          <ContentSection>\n            <Alert\n              message={<h3>{t('about.update.title')}</h3>}\n              description={\n                <UpdateNoticeDescription>\n                  <div>{t('about.update.subtitle')}</div>\n                  <ButtonGroup>\n                    <Button onClick={() => setChangelogModalOpen(true)}>\n                      {t('about.update.changelogButton')}\n                    </Button>\n                    <Button\n                      type=\"primary\"\n                      onClick={() => setUpdateModalOpen(true)}\n                    >\n                      {t('about.update.updateButton')}\n                    </Button>\n                  </ButtonGroup>\n                </UpdateNoticeDescription>\n              }\n              type=\"info\"\n            />\n          </ContentSection>\n        )}\n        <ContentSection>\n          <h1>{t('about.links.title')}</h1>\n          <div>\n            <div>\n              <a href=\"https://windhawk.net/\">{t('about.links.homepage')}</a>\n            </div>\n            <div>\n              <a href=\"https://github.com/ramensoftware/windhawk/wiki\">\n                {t('about.links.documentation')}\n              </a>\n            </div>\n          </div>\n        </ContentSection>\n        <ContentSection>\n          <h1>{t('about.builtWith.title')}</h1>\n          <div>\n            <div>\n              <a href=\"https://github.com/VSCodium/vscodium\">VSCodium</a>\n              {' - '}\n              {t('about.builtWith.vscodium')}\n            </div>\n            <div>\n              <a href=\"https://github.com/mstorsjo/llvm-mingw\">LLVM MinGW</a>\n              {' - '}\n              {t('about.builtWith.llvmMingw')}\n            </div>\n            <div>\n              <a href=\"https://github.com/m417z/minhook-detours\">MinHook-Detours</a>\n              {' - '}\n              {t('about.builtWith.minHook')}\n            </div>\n            <div>{t('about.builtWith.others')}</div>\n          </div>\n        </ContentSection>\n      </AboutContent>\n      <ChangelogModal\n        open={changelogModalOpen}\n        onClose={() => setChangelogModalOpen(false)}\n      />\n      <UpdateModal\n        open={updateModalOpen}\n        onClose={() => setUpdateModalOpen(false)}\n      />\n    </AboutContainer>\n  );\n}\n\nexport default About;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/AppHeader.tsx",
    "content": "import {\n  faCog,\n  faHome,\n  faInfo,\n  faList,\n  IconDefinition,\n} from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Badge, Button } from 'antd';\nimport { PresetStatusColorType } from 'antd/lib/_util/colors';\nimport { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport logo from './assets/logo-white.svg';\n\nconst Header = styled.header`\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  padding: 20px 20px 0;\n  column-gap: 20px;\n  margin: 0 auto;\n  width: 100%;\n  max-width: var(--app-max-width);\n`;\n\nconst HeaderLogo = styled.div`\n  cursor: pointer;\n  margin-inline-end: auto;\n  font-size: 40px;\n  white-space: nowrap;\n  font-family: Oxanium;\n  user-select: none;\n`;\n\nconst LogoImage = styled.img`\n  height: 80px;\n  margin-inline-end: 6px;\n`;\n\nconst HeaderButtonsWrapper = styled.div`\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  margin: 12px 0;\n`;\n\nconst HeaderIcon = styled(FontAwesomeIcon)`\n  margin-inline-end: 8px;\n`;\n\ntype HeaderButton = {\n  text: string;\n  route: string;\n  icon: IconDefinition;\n  badge?: {\n    status: PresetStatusColorType;\n    title?: string;\n  };\n};\n\nfunction AppHeader() {\n  const { t } = useTranslation();\n\n  const navigate = useNavigate();\n\n  const location = useLocation();\n\n  const { loggingEnabled, updateIsAvailable } = useContext(AppUISettingsContext);\n\n  const buttons: HeaderButton[] = [\n    {\n      text: t('appHeader.home'),\n      route: '/',\n      icon: faHome,\n    },\n    {\n      text: t('appHeader.explore'),\n      route: '/mods-browser',\n      icon: faList,\n    },\n    {\n      text: t('appHeader.settings'),\n      route: '/settings',\n      icon: faCog,\n      badge: loggingEnabled ? {\n        status: 'warning',\n        title: t('general.loggingEnabled'),\n      } : undefined,\n    },\n    {\n      text: t('appHeader.about'),\n      route: '/about',\n      icon: faInfo,\n      badge: updateIsAvailable ? {\n        status: 'error',\n        title: t('about.update.title'),\n      } : undefined,\n    },\n  ];\n\n  return (\n    <Header>\n      <HeaderLogo onClick={() => navigate('/')}>\n        <LogoImage src={logo} alt=\"logo\" /> Windhawk\n      </HeaderLogo>\n      <HeaderButtonsWrapper>\n        {buttons.map(({ text, route, icon, badge }) => (\n          <Badge key={route} dot={!!badge} status={badge?.status} title={badge?.title}>\n            <Button\n              type={location.pathname === route ? 'primary' : 'default'}\n              ghost\n              onClick={() => navigate(route)}\n            >\n              <HeaderIcon icon={icon} />\n              {text}\n            </Button>\n          </Badge>\n        ))}\n      </HeaderButtonsWrapper>\n    </Header>\n  );\n}\n\nexport default AppHeader;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ChangelogModal.tsx",
    "content": "import { ConfigProvider, Modal, Result, Spin } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport ReactMarkdownCustom from '../components/ReactMarkdownCustom';\nimport { fetchText } from '../swrHelpers';\n\nconst CHANGELOG_URL = 'https://ramensoftware.com/downloads/windhawk_setup.exe?version&changelog';\n\nconst ModalContent = styled.div`\n  max-height: 60vh;\n  overflow-y: auto;\n  padding: 16px 0;\n`;\n\nconst LoadingContainer = styled.div`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 40px;\n`;\n\ninterface Props {\n  open: boolean;\n  onClose: () => void;\n}\n\nexport function ChangelogModal(props: Props) {\n  const { t } = useTranslation();\n  const [changelog, setChangelog] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [hasError, setHasError] = useState(false);\n  const fetchStatusRef = useRef<'idle' | 'loading' | 'success' | 'error'>('idle');\n\n  useEffect(() => {\n    // Fetch when modal opens if we haven't successfully fetched yet\n    // On error, allow retry when modal is reopened (not immediate retry)\n    if (props.open && fetchStatusRef.current !== 'success' && fetchStatusRef.current !== 'loading') {\n      fetchStatusRef.current = 'loading';\n      setLoading(true);\n      setHasError(false);\n\n      fetchText(CHANGELOG_URL)\n        .then((textWithNull) => {\n          const text = textWithNull.split('\\0', 2)[1] || '';\n          setChangelog(text);\n          fetchStatusRef.current = 'success';\n          setLoading(false);\n        })\n        .catch((err) => {\n          console.error('Failed to fetch changelog:', err);\n          setHasError(true);\n          fetchStatusRef.current = 'error';\n          setLoading(false);\n        });\n    }\n  }, [props.open]);\n\n  return (\n    <Modal\n      open={props.open}\n      onCancel={props.onClose}\n      onOk={props.onClose}\n      cancelButtonProps={{ style: { display: 'none' } }}\n      okText={t('about.changelog.close')}\n      title={t('about.changelog.title')}\n      width={700}\n      centered\n    >\n      <ModalContent>\n        {loading && (\n          <LoadingContainer>\n            <Spin />\n          </LoadingContainer>\n        )}\n        {hasError && (\n          <Result\n            status=\"error\"\n            title={t('general.loadingFailedTitle')}\n            subTitle={t('general.loadingFailedSubtitle')}\n          />\n        )}\n        {changelog && !loading && !hasError && (\n          <ConfigProvider direction=\"ltr\">\n            <ReactMarkdownCustom\n              markdown={changelog}\n              allowHtml\n              direction=\"ltr\"\n            />\n          </ConfigProvider>\n        )}\n      </ModalContent>\n    </Modal>\n  );\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/CreateNewModButton.tsx",
    "content": "import { faPen } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { createNewMod } from '../webviewIPC';\nimport DevModeAction from './DevModeAction';\n\nconst ButtonContainer = styled.div`\n  position: fixed;\n  bottom: 0;\n  inset-inline-start: 0;\n  inset-inline-end: 0;\n  margin: 0 auto;\n  width: 100%;\n  max-width: var(--app-max-width);\n  z-index: 100; /* Monaco editor uses two-digit z-index values */\n`;\n\nconst CreateButton = styled(Button)`\n  position: absolute;\n  inset-inline-end: 32px;\n  bottom: 20px;\n  background-color: var(--app-background-color) !important;\n  box-shadow: 0 3px 6px rgb(100 100 100 / 16%), 0 1px 2px rgb(100 100 100 / 23%);\n`;\n\nconst CreateButtonIcon = styled(FontAwesomeIcon)`\n  margin-inline-end: 8px;\n`;\n\nfunction CreateNewModButton() {\n  const { t } = useTranslation();\n\n  return (\n    <ButtonContainer>\n      <DevModeAction\n        popconfirmPlacement=\"top\"\n        onClick={() => createNewMod()}\n        renderButton={(onClick) => (\n          <CreateButton shape=\"round\" onClick={onClick}>\n            <CreateButtonIcon icon={faPen} /> {t('createNewModButton.title')}\n          </CreateButton>\n        )}\n      />\n    </ButtonContainer>\n  );\n}\n\nexport default CreateNewModButton;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/DevModeAction.tsx",
    "content": "import { Checkbox } from 'antd';\nimport { TooltipPlacement } from 'antd/lib/tooltip';\nimport React, { JSX, useContext, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport { PopconfirmModal } from '../components/InputWithContextMenu';\nimport { useUpdateAppSettings } from '../webviewIPC';\n\nconst PopconfirmTitleContent = styled.div`\n  display: flex;\n  flex-direction: column;\n  row-gap: 8px;\n  max-width: 300px;\n`;\n\ninterface Props {\n  disabled?: boolean;\n  popconfirmPlacement?: TooltipPlacement;\n  onClick: () => void;\n  renderButton: (onClick?: () => void) => JSX.Element;\n}\n\nfunction DevModeAction(props: React.PropsWithChildren<Props>) {\n  const { t } = useTranslation();\n\n  const { devModeOptOut, devModeUsedAtLeastOnce } =\n    useContext(AppUISettingsContext);\n\n  const [optOutChecked, setOptOutChecked] = useState(false);\n\n  const { updateAppSettings } = useUpdateAppSettings(() => undefined);\n\n  if (devModeOptOut) {\n    return null;\n  }\n\n  return (\n    <PopconfirmModal\n      placement={props.popconfirmPlacement}\n      disabled={devModeUsedAtLeastOnce || props.disabled}\n      title={\n        <PopconfirmTitleContent>\n          <div>{t('devModeAction.message')}</div>\n          <Checkbox\n            checked={optOutChecked}\n            onChange={(e) => setOptOutChecked(e.target.checked)}\n          >\n            {t('devModeAction.hideOptionsCheckbox')}\n          </Checkbox>\n        </PopconfirmTitleContent>\n      }\n      okText={\n        optOutChecked\n          ? t('devModeAction.hideOptionsButton')\n          : t('devModeAction.beginCodingButton')\n      }\n      cancelText={t('devModeAction.cancelButton')}\n      onConfirm={() => {\n        if (optOutChecked) {\n          updateAppSettings({\n            appSettings: {\n              devModeOptOut: true,\n            },\n          });\n        } else {\n          updateAppSettings({\n            appSettings: {\n              devModeUsedAtLeastOnce: true,\n            },\n          });\n          props.onClick();\n        }\n      }}\n      onOpenChange={(open) => open && setOptOutChecked(false)}\n    >\n      {props.renderButton(\n        !devModeUsedAtLeastOnce ? undefined : () => props.onClick()\n      )}\n    </PopconfirmModal>\n  );\n}\n\nexport default DevModeAction;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModCard.tsx",
    "content": "import { faUser } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Badge, Button, Card, Divider, Rate, Switch, Tooltip } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport styled, { css } from 'styled-components';\nimport EllipsisText from '../components/EllipsisText';\nimport { PopconfirmModal } from '../components/InputWithContextMenu';\nimport { ModMetadata, RepositoryDetails } from '../webviewIPCMessages';\nimport localModIcon from './assets/local-mod-icon.svg';\nimport ModMetadataLine from './ModMetadataLine';\n\nconst ModCardWrapper = styled.div`\n  // Fill whole height.\n  > .ant-ribbon-wrapper {\n    height: 100%;\n  }\n`;\n\nconst ModCardRibbon = styled(Badge.Ribbon) <{ $hidden: boolean }>`\n  ${({ $hidden }) =>\n    $hidden &&\n    css`\n      display: none;\n    `}\n`;\n\nconst ModCardWrapperInner = styled(Card)`\n  // Fill whole height and stick buttons to the bottom.\n  height: 100%;\n\n  > .ant-card-body {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n\n    > .ant-card-meta {\n      flex: 1;\n    }\n  }\n`;\n\nconst ModCardTitleContainer = styled.div`\n  display: flex;\n`;\n\nconst ModCardTitle = styled(EllipsisText)`\n  flex: 1;\n`;\n\n// Used to prevent from the title to overlap with the ribbon.\nconst ModCardTitleRibbonContent = styled.span`\n  position: static;\n  margin-inline-end: -16px;\n  font-weight: normal;\n  visibility: hidden;\n`;\n\nconst ModLocalIcon = styled.img`\n  height: 24px;\n  margin-inline-start: 4px;\n  cursor: help;\n`;\n\nconst ModCardActionsContainer = styled.div`\n  display: flex;\n  align-items: center;\n  margin-top: 20px;\n  text-align: end;\n\n  > :not(:last-child) {\n    margin-inline-end: 10px;\n  }\n\n  > :last-child {\n    margin-inline-start: auto;\n  }\n`;\n\nconst ModRate = styled(Rate)`\n  font-size: 14px;\n  pointer-events: none;\n\n  > .ant-rate-star {\n    margin-inline-end: 2px;\n  }\n`;\n\nconst RatingBreakdownTooltip = styled.div`\n  display: grid;\n  grid-template-columns: auto 1fr auto;\n  gap: 8px;\n  align-items: center;\n  min-width: 234px; // Max tooltip width\n`;\n\nconst BreakdownLine = styled.div`\n  display: contents;\n`;\n\nconst BreakdownStars = styled.span`\n  display: flex;\n`;\n\nconst BreakdownRate = styled(Rate)`\n  font-size: 12px;\n  pointer-events: none;\n\n  > .ant-rate-star {\n    margin-inline-end: 2px;\n  }\n`;\n\nconst BreakdownProgressContainer = styled.div`\n  height: 8px;\n  background-color: rgba(23, 18, 18, 0.1);\n  border-radius: 4px;\n`;\n\nconst BreakdownProgressBar = styled.div<{ $percentage: number }>`\n  height: 100%;\n  width: ${(props) => props.$percentage}%;\n  background-color: #fadb14;\n  border-radius: 4px;\n  animation: progressBarFill 0.3s ease;\n\n  @keyframes progressBarFill {\n    from {\n      width: 0%;\n    }\n  }\n`;\n\nconst BreakdownCount = styled.span`\n  color: rgba(255, 255, 255, 0.85);\n  text-align: end;\n  font-size: 12px;\n  white-space: nowrap;\n`;\n\ninterface Props {\n  ribbonText?: string;\n  title: string;\n  isLocal?: boolean;\n  description?: string;\n  modMetadata?: ModMetadata;\n  repositoryDetails?: RepositoryDetails;\n  buttons: {\n    text: React.ReactNode;\n    confirmText?: string;\n    confirmOkText?: string;\n    confirmCancelText?: string;\n    confirmIsDanger?: boolean;\n    onClick: () => void;\n    badge?: {\n      tooltip?: string;\n    };\n  }[];\n  switch?: {\n    title?: string;\n    checked?: boolean;\n    disabled?: boolean;\n    onChange: (checked: boolean) => void;\n  };\n}\n\nfunction ModCard(props: Props) {\n  const { t } = useTranslation();\n\n  // Derive stats from repositoryDetails if available\n  const stats = props.repositoryDetails ? {\n    users: props.repositoryDetails.users,\n    rating: props.repositoryDetails.rating,\n    ratingBreakdown: props.repositoryDetails.ratingBreakdown,\n  } : null;\n\n  const renderRatingTooltip = () => {\n    if (!stats) {\n      return t('mod.notRated');\n    }\n\n    // Calculate total users for percentage\n    const totalUsers = stats.ratingBreakdown.reduce(\n      (sum, count) => sum + count,\n      0\n    );\n\n    if (totalUsers === 0) {\n      return t('mod.notRated');\n    }\n\n    return (\n      <RatingBreakdownTooltip>\n        {[5, 4, 3, 2, 1].map((stars) => {\n          const count = stats.ratingBreakdown[stars - 1] ?? 0;\n          const percentage = (count / totalUsers) * 100;\n          return (\n            <BreakdownLine key={stars}>\n              <BreakdownStars>\n                <BreakdownRate disabled value={stars} />\n              </BreakdownStars>\n              <BreakdownProgressContainer>\n                <BreakdownProgressBar $percentage={percentage} />\n              </BreakdownProgressContainer>\n              <BreakdownCount>\n                {t('mod.users', {\n                  count,\n                  formattedCount: count.toLocaleString(),\n                })}\n              </BreakdownCount>\n            </BreakdownLine>\n          );\n        })}\n      </RatingBreakdownTooltip>\n    );\n  };\n\n  return (\n    <ModCardWrapper>\n      <ModCardRibbon text={props.ribbonText} $hidden={!props.ribbonText}>\n        <ModCardWrapperInner size=\"small\">\n          <Card.Meta\n            title={\n              <>\n                <ModCardTitleContainer>\n                  <ModCardTitle tooltipPlacement=\"bottom\">\n                    {props.title}\n                  </ModCardTitle>\n                  {props.isLocal && (\n                    <Tooltip title={t('mod.editedLocally')} placement=\"bottom\">\n                      <ModLocalIcon src={localModIcon} />\n                    </Tooltip>\n                  )}\n                  {props.ribbonText && (\n                    // Used to prevent from the title to overlap with the ribbon.\n                    <ModCardTitleRibbonContent className=\"ant-ribbon\">\n                      {props.ribbonText}\n                    </ModCardTitleRibbonContent>\n                  )}\n                </ModCardTitleContainer>\n                {props.modMetadata && (\n                  <ModMetadataLine\n                    modMetadata={props.modMetadata}\n                    singleLine={true}\n                    repositoryDetails={props.repositoryDetails}\n                  />\n                )}\n              </>\n            }\n            description={props.description || <i>{t('mod.noDescription')}</i>}\n          />\n          <ModCardActionsContainer>\n            {props.buttons.map((button, i) => {\n              const buttonElement = button.confirmText ? (\n                <PopconfirmModal\n                  key={i}\n                  placement=\"bottom\"\n                  title={button.confirmText}\n                  okText={button.confirmOkText}\n                  cancelText={button.confirmCancelText}\n                  okButtonProps={{ danger: button.confirmIsDanger }}\n                  onConfirm={() => button.onClick()}\n                >\n                  <Button type=\"default\" ghost>\n                    {button.text}\n                  </Button>\n                </PopconfirmModal>\n              ) : (\n                <Button key={i} type=\"default\" ghost onClick={button.onClick}>\n                  {button.text}\n                </Button>\n              );\n\n              if (button.badge) {\n                return (\n                  <Badge\n                    key={i}\n                    dot\n                    title={button.badge.tooltip}\n                    status=\"warning\"\n                  >\n                    {buttonElement}\n                  </Badge>\n                );\n              }\n\n              return buttonElement;\n            })}\n            {props.switch && (\n              <Tooltip title={props.switch.title} placement=\"bottom\">\n                <Switch\n                  checked={props.switch.checked}\n                  disabled={props.switch.disabled}\n                  onChange={(checked) => props.switch?.onChange(checked)}\n                />\n              </Tooltip>\n            )}\n            {stats && (\n              <div>\n                <FontAwesomeIcon icon={faUser} />{' '}\n                {t('mod.users', {\n                  count: stats.users,\n                  formattedCount: stats.users.toLocaleString(),\n                })}\n                <Divider type=\"vertical\" />\n                <Tooltip title={renderRatingTooltip()} placement=\"bottom\">\n                  <span>\n                    <ModRate\n                      disabled\n                      allowHalf\n                      defaultValue={stats.rating / 2}\n                    />\n                  </span>\n                </Tooltip>\n              </div>\n            )}\n          </ModCardActionsContainer>\n        </ModCardWrapperInner>\n      </ModCardRibbon>\n    </ModCardWrapper>\n  );\n}\n\nexport default ModCard;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetails.tsx",
    "content": "import { Badge, Button, Card, Radio, Result, Spin, Tooltip } from 'antd';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport {\n  useGetModSourceData,\n  useGetRepositoryModSourceData,\n} from '../webviewIPC';\nimport { ModConfig, ModMetadata, RepositoryDetails, InitialSettings } from '../webviewIPCMessages';\nimport ModDetailsAdvanced from './ModDetailsAdvanced';\nimport ModDetailsChangelog from './ModDetailsChangelog';\nimport ModDetailsHeader, { ModStatus } from './ModDetailsHeader';\nimport ModDetailsReadme from './ModDetailsReadme';\nimport ModDetailsSettings from './ModDetailsSettings';\nimport ModDetailsSource from './ModDetailsSource';\nimport ModDetailsSourceDiff from './ModDetailsSourceDiff';\nimport { VersionSelectorModal } from './VersionSelectorModal';\nimport { mockInstalledModSourceData, mockModVersionSource } from './mockData';\n\nconst ModDetailsContainer = styled.div`\n  flex: 1;\n  padding-top: 20px;\n`;\n\nconst ModDetailsCard = styled(Card)`\n  min-height: 100%;\n  border-bottom: none;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n`;\n\nconst ModVersionRadioGroup = styled(Radio.Group)`\n  font-weight: normal;\n  margin-bottom: 8px;\n`;\n\nconst ProgressSpin = styled(Spin)`\n  display: block;\n  margin-inline-start: auto;\n  margin-inline-end: auto;\n  font-size: 32px;\n`;\n\nconst NoDataMessage = styled.div`\n  color: rgba(255, 255, 255, 0.45);\n  font-style: italic;\n`;\n\ntype InstalledModDetails = {\n  metadata: ModMetadata | null;\n  config: ModConfig | null;\n  userRating?: number;\n};\n\ntype RepositoryModDetails = {\n  metadata?: ModMetadata;\n  details?: RepositoryDetails;\n};\n\ntype ModSourceData = {\n  source: string | null;\n  metadata: ModMetadata | null;\n  readme: string | null;\n  initialSettings: InitialSettings | null;\n};\n\ntype TabKey = 'details' | 'settings' | 'code' | 'changelog' | 'advanced' | 'changes';\ntype ViewMode = 'installed' | 'repository' | 'custom';\n\ninterface ModVersionSelectorProps {\n  // Version state\n  currentView: ViewMode;\n  selectedCustomVersion: string | null;\n\n  // Version info (null if not available)\n  installed: { version?: string } | null;\n  repository: (\n    { status: 'loading' } |\n    { status: 'loaded'; version?: string } |\n    { status: 'failed' } |\n    null\n  );\n\n  // Callbacks\n  onViewChange: (value: Exclude<ViewMode, 'custom'>) => void;\n  onOpenVersionModal: () => void;\n}\n\nfunction ModVersionSelector(props: ModVersionSelectorProps) {\n  const { t } = useTranslation();\n  const {\n    currentView,\n    selectedCustomVersion,\n    installed,\n    repository,\n    onViewChange,\n    onOpenVersionModal,\n  } = props;\n\n  if (!installed && !selectedCustomVersion) {\n    return null;\n  }\n\n  if (!repository) {\n    return null;\n  }\n\n  return (\n    <ModVersionRadioGroup\n      size=\"small\"\n      value={currentView}\n      onChange={(e) => {\n        // Don't allow switching to 'custom' value, it will be set after\n        // selecting a version in the modal.\n        if (e.target.value !== 'custom') {\n          onViewChange(e.target.value);\n        }\n      }}\n    >\n      {installed && (\n        <Radio.Button value=\"installed\">\n          {t('modDetails.header.installedVersion')}\n          {installed.version && `: ${installed.version}`}\n        </Radio.Button>\n      )}\n      <Radio.Button\n        value=\"repository\"\n        disabled={repository.status === 'failed'}\n      >\n        {t('modDetails.header.latestVersion')}\n        {repository.status === 'loading'\n          ? ': ' + t('modDetails.header.loading')\n          : repository.status === 'failed'\n            ? ': ' + t('modDetails.header.loadingFailed')\n            : repository.status === 'loaded' && repository.version\n              ? `: ${repository.version}`\n              : ''}\n      </Radio.Button>\n      <Radio.Button value=\"custom\" onClick={onOpenVersionModal}>\n        {selectedCustomVersion\n          ? t('modDetails.header.selectedVersion', { version: selectedCustomVersion })\n          : t('modDetails.header.otherVersions')}\n      </Radio.Button>\n    </ModVersionRadioGroup>\n  );\n}\n\ninterface ModDetailsTabContentProps {\n  // Tab state\n  modId: string;\n  isLocalMod: boolean;\n  currentView: ViewMode;\n  activeTab: TabKey;\n\n  // Source data\n  modSourceData: ModSourceData | null;\n\n  // Additional source data for changes tab\n  installedModSourceData: ModSourceData | null;\n  selectedModSourceData: ModSourceData | null;\n  installedVersionIsLatest: boolean;\n\n  // Settings tab navigation\n  canNavigateAwayRef: React.MutableRefObject<(() => Promise<boolean>) | null>;\n\n  // Retry handler\n  onRetryLoad: () => void;\n}\n\nfunction ModDetailsTabContent(props: ModDetailsTabContentProps) {\n  const { t } = useTranslation();\n  const {\n    modId,\n    isLocalMod,\n    currentView,\n    activeTab,\n    modSourceData,\n    installedModSourceData,\n    selectedModSourceData,\n    installedVersionIsLatest,\n    canNavigateAwayRef,\n    onRetryLoad,\n  } = props;\n\n  const isLoading = (\n    !modSourceData ||\n    (activeTab === 'changes' && (\n      !installedModSourceData ||\n      !selectedModSourceData\n    ))\n  );\n  if (isLoading) {\n    const shouldShowLoading = (\n      currentView === 'repository' ||\n      currentView === 'custom' ||\n      activeTab === 'changes');\n    if (shouldShowLoading) {\n      return <ProgressSpin size=\"large\" tip={t('general.loading')} />;\n    }\n    return null;\n  }\n\n  const isLoadingFailed = (\n    (\n      currentView === 'repository' ||\n      currentView === 'custom' ||\n      activeTab === 'changes'\n    ) && !selectedModSourceData?.source\n  );\n  if (isLoadingFailed) {\n    return (\n      <Result\n        status=\"error\"\n        title={t('general.loadingFailedTitle')}\n        subTitle={t('general.loadingFailedSubtitle')}\n        extra={[\n          <Button\n            type=\"primary\"\n            key=\"try-again\"\n            onClick={onRetryLoad}\n          >\n            {t('general.tryAgain')}\n          </Button>,\n        ]}\n      />\n    );\n  }\n\n  if (activeTab === 'details') {\n    return modSourceData.readme ? (\n      <ModDetailsReadme markdown={modSourceData.readme} isLocalMod={isLocalMod} />\n    ) : (\n      <NoDataMessage>{t('modDetails.details.noData')}</NoDataMessage>\n    );\n  }\n\n  if (activeTab === 'settings') {\n    return modSourceData.initialSettings ? (\n      <ModDetailsSettings\n        modId={modId}\n        initialSettings={modSourceData.initialSettings}\n        onCanNavigateAwayChange={(callback) => {\n          canNavigateAwayRef.current = callback;\n        }}\n      />\n    ) : (\n      <NoDataMessage>{t('modDetails.settings.noData')}</NoDataMessage>\n    );\n  }\n\n  if (activeTab === 'code') {\n    return modSourceData.source ? (\n      <ModDetailsSource source={modSourceData.source} />\n    ) : (\n      <NoDataMessage>{t('modDetails.code.noData')}</NoDataMessage>\n    );\n  }\n\n  if (activeTab === 'changelog') {\n    return (\n      <ModDetailsChangelog\n        loadingNode={\n          <ProgressSpin size=\"large\" tip={t('general.loading')} />\n        }\n        modId={modId}\n      />\n    );\n  }\n\n  if (activeTab === 'advanced') {\n    return <ModDetailsAdvanced modId={modId} />;\n  }\n\n  if (activeTab === 'changes') {\n    const installedModSource = installedModSourceData?.source ?? null;\n    const selectedModSource = selectedModSourceData?.source ?? null;\n    if (installedModSource && selectedModSource) {\n      return installedVersionIsLatest ? (\n        <NoDataMessage>{t('modDetails.changes.noData')}</NoDataMessage>\n      ) : (\n        <ModDetailsSourceDiff\n          oldSource={installedModSource}\n          newSource={selectedModSource}\n        />\n      );\n    }\n    return <NoDataMessage>{t('modDetails.code.noData')}</NoDataMessage>;\n  }\n\n  return null;\n}\n\ninterface Props {\n  modId: string;\n  installedModDetails?: InstalledModDetails;\n  repositoryModDetails?: RepositoryModDetails;\n  loadRepositoryData?: boolean;\n  goBack: () => void;\n  installMod?: (modSource: string) => void;\n  updateMod?: (modSource: string, disabled: boolean) => void;\n  forkModFromSource?: (modSource: string) => void;\n  compileMod: () => void;\n  enableMod: (enable: boolean) => void;\n  editMod: () => void;\n  forkMod: () => void;\n  deleteMod: () => void;\n  updateModRating: (newRating: number) => void;\n}\n\nfunction ModDetails(props: Props) {\n  const { t } = useTranslation();\n\n  const {\n    modId,\n    installedModDetails,\n    repositoryModDetails,\n    loadRepositoryData,\n  } = props;\n\n  const isLocalMod = modId.startsWith('local@');\n\n  const [installedModSourceData, setInstalledModSourceData] =\n    useState<ModSourceData | null>(null);\n  const [repositoryModSourceData, setRepositoryModSourceData] =\n    useState<ModSourceData | null>(null);\n\n  const [selectedCustomVersion, setSelectedCustomVersion] = useState<string | null>(null);\n  const [versionTimestamps, setVersionTimestamps] = useState<Record<string, number>>({});\n  const [customVersionSourceData, setCustomVersionSourceData] = useState<ModSourceData | null>(null);\n  const [isVersionModalOpen, setIsVersionModalOpen] = useState(false);\n\n  const { getModSourceData } = useGetModSourceData(\n    useCallback(\n      (data) => {\n        if (data.modId === modId) {\n          setInstalledModSourceData(data.data);\n        }\n      },\n      [modId]\n    )\n  );\n\n  useEffect(() => {\n    setInstalledModSourceData(mockInstalledModSourceData);\n    if (installedModDetails?.metadata) {\n      getModSourceData({ modId });\n    }\n  }, [modId, installedModDetails?.metadata, getModSourceData]);\n\n  const { getRepositoryModSourceData } = useGetRepositoryModSourceData(\n    useCallback(\n      (data) => {\n        if (data.modId === modId &&\n          (data.version ?? null) === selectedCustomVersion) {\n          if (data.version) {\n            setCustomVersionSourceData(data.data);\n          } else {\n            setRepositoryModSourceData(data.data);\n          }\n        }\n      },\n      [modId, selectedCustomVersion]\n    )\n  );\n\n  useEffect(() => {\n    setRepositoryModSourceData(null);\n    if (repositoryModDetails || loadRepositoryData) {\n      getRepositoryModSourceData({ modId });\n    }\n  }, [\n    getRepositoryModSourceData,\n    loadRepositoryData,\n    modId,\n    repositoryModDetails,\n  ]);\n\n  const [selectedModDetails, setSelectedModDetails] = useState<\n    Exclude<ViewMode, 'custom'> | null\n  >(null);\n\n  useEffect(() => {\n    if (\n      !(installedModDetails && (repositoryModDetails || loadRepositoryData))\n    ) {\n      // Only one type can be selected, reset selection.\n      setSelectedModDetails(null);\n    }\n  }, [installedModDetails, repositoryModDetails, loadRepositoryData]);\n\n  const modDetailsToShow: ViewMode = selectedCustomVersion\n    ? 'custom'\n    : selectedModDetails || (installedModDetails ? 'installed' : 'repository');\n\n  const [activeTab, setActiveTab] = useState<TabKey>('details');\n\n  // Track if settings can navigate away\n  const canNavigateAwayRef = useRef<(() => Promise<boolean>) | null>(null);\n\n  const handleTabChange = useCallback(async (key: string) => {\n    // Check if we can navigate away from settings\n    if (canNavigateAwayRef.current) {\n      const canNavigate = await canNavigateAwayRef.current();\n      if (!canNavigate) {\n        return;\n      }\n    }\n    setActiveTab(key as TabKey);\n  }, []);\n\n  const handleOpenVersionModal = useCallback(() => {\n    setIsVersionModalOpen(true);\n  }, []);\n\n  const handleVersionSelect = useCallback((version: string, timestamps: Record<string, number>) => {\n    setSelectedCustomVersion(version);\n    setVersionTimestamps(timestamps);\n    setIsVersionModalOpen(false);\n    // Fetch the source for the selected version.\n    if (mockModVersionSource) {\n      setCustomVersionSourceData(mockModVersionSource(version));\n    } else {\n      setCustomVersionSourceData(null);\n      getRepositoryModSourceData({ modId, version });\n    }\n  }, [getRepositoryModSourceData, modId]);\n\n  const handleClearCustomVersion = useCallback(() => {\n    setSelectedCustomVersion(null);\n    setVersionTimestamps({});\n    setCustomVersionSourceData(null);\n  }, []);\n\n  const tabList: Array<{ key: TabKey; tab: React.ReactNode }> = [\n    {\n      key: 'details',\n      tab: t('modDetails.details.title'),\n    },\n  ];\n\n  if (modDetailsToShow === 'installed' && installedModDetails?.config) {\n    tabList.push({\n      key: 'settings',\n      tab: t('modDetails.settings.title'),\n    });\n  }\n\n  tabList.push({\n    key: 'code',\n    tab: t('modDetails.code.title'),\n  });\n\n  if (!isLocalMod) {\n    tabList.push({\n      key: 'changelog',\n      tab: t('modDetails.changelog.title'),\n    });\n  }\n\n  if (modDetailsToShow === 'installed') {\n    const hasLogging = installedModDetails?.config?.loggingEnabled || installedModDetails?.config?.debugLoggingEnabled;\n    tabList.push({\n      key: 'advanced',\n      tab: hasLogging ? (\n        <>\n          {t('modDetails.advanced.title')}\n          {' '}\n          <Tooltip title={t('general.loggingEnabled')} placement=\"bottom\">\n            <Badge dot status=\"warning\" />\n          </Tooltip>\n        </>\n      ) : t('modDetails.advanced.title'),\n    });\n  }\n\n  if (installedModDetails && (repositoryModDetails || loadRepositoryData)) {\n    tabList.push({\n      key: 'changes',\n      tab: t('modDetails.changes.title'),\n    });\n  }\n\n  const availableActiveTab = tabList.find((x) => x.key === activeTab)\n    ? activeTab\n    : 'details';\n\n  // Clear the navigation callback when not on settings tab\n  useEffect(() => {\n    if (availableActiveTab !== 'settings') {\n      canNavigateAwayRef.current = null;\n    }\n  }, [availableActiveTab]);\n\n  let installedModMetadata: ModMetadata = {};\n  if (installedModSourceData?.metadata) {\n    installedModMetadata = installedModSourceData.metadata;\n  } else if (installedModDetails) {\n    installedModMetadata = installedModDetails.metadata || {};\n  }\n\n  let repositoryModMetadata: ModMetadata = {};\n  if (repositoryModSourceData?.metadata) {\n    repositoryModMetadata = repositoryModSourceData.metadata;\n  } else if (repositoryModDetails?.metadata) {\n    repositoryModMetadata = repositoryModDetails.metadata;\n  }\n\n  let modMetadata: ModMetadata = {};\n  let modSourceData: ModSourceData | null = null;\n\n  if (modDetailsToShow === 'custom') {\n    modMetadata = customVersionSourceData?.metadata || {};\n    modSourceData = customVersionSourceData;\n  } else if (modDetailsToShow === 'installed') {\n    modMetadata = installedModMetadata;\n    modSourceData = installedModSourceData;\n  } else if (modDetailsToShow === 'repository') {\n    modMetadata = repositoryModMetadata;\n    modSourceData = repositoryModSourceData;\n  }\n\n  const installedModSource = installedModSourceData?.source ?? null;\n  const repositoryModSource = repositoryModSourceData?.source ?? null;\n  const selectedModSourceData = modDetailsToShow === 'custom'\n    ? customVersionSourceData\n    : repositoryModSourceData;\n  const selectedModSource = selectedModSourceData?.source ?? null;\n\n  const installedVersionIsLatest = useMemo(() => {\n    return !!(\n      selectedModSource &&\n      installedModSource &&\n      selectedModSource === installedModSource\n    );\n  }, [selectedModSource, installedModSource]);\n\n  // Determine if the selected custom version is a downgrade\n  const isDowngrade = useMemo(() => {\n    if (!selectedCustomVersion || !installedModMetadata.version) {\n      return false;\n    }\n\n    const selectedTimestamp = versionTimestamps[selectedCustomVersion];\n    const currentTimestamp = versionTimestamps[installedModMetadata.version];\n\n    return selectedTimestamp !== undefined &&\n      currentTimestamp !== undefined &&\n      selectedTimestamp < currentTimestamp;\n  }, [selectedCustomVersion, installedModMetadata.version, versionTimestamps]);\n\n  let modStatus: ModStatus = 'not-installed';\n  if (modDetailsToShow === 'installed' && installedModDetails) {\n    if (!installedModDetails.config) {\n      modStatus = 'installed-not-compiled';\n    } else if (!installedModDetails.config.disabled) {\n      modStatus = 'enabled';\n    } else {\n      modStatus = 'disabled';\n    }\n  }\n\n  return (\n    <ModDetailsContainer>\n      <ModDetailsCard\n        title={\n          <ModDetailsHeader\n            topNode={\n              <ModVersionSelector\n                currentView={modDetailsToShow}\n                selectedCustomVersion={selectedCustomVersion}\n                installed={\n                  installedModDetails\n                    ? { version: installedModMetadata.version }\n                    : null\n                }\n                repository={\n                  !(repositoryModDetails || loadRepositoryData)\n                    ? null\n                    : !repositoryModDetails && !repositoryModSourceData\n                      ? { status: 'loading' }\n                      : !repositoryModDetails && !repositoryModSource\n                        ? { status: 'failed' }\n                        : { status: 'loaded', version: repositoryModMetadata.version }\n                }\n                onViewChange={(value) => {\n                  setSelectedModDetails(value);\n                  // Clear custom version when switching back to\n                  // installed/latest.\n                  handleClearCustomVersion();\n                }}\n                onOpenVersionModal={handleOpenVersionModal}\n              />\n            }\n            modId={modId}\n            modMetadata={modMetadata}\n            modConfig={\n              (modDetailsToShow === 'installed'\n                && installedModDetails?.config)\n              || undefined}\n            modStatus={modStatus}\n            updateAvailable={\n              !!(\n                installedModDetails &&\n                (repositoryModDetails || loadRepositoryData)\n              )\n            }\n            installedVersionIsLatest={installedVersionIsLatest}\n            isDowngrade={isDowngrade}\n            userRating={installedModDetails?.userRating}\n            repositoryDetails={\n              (modDetailsToShow === 'repository'\n                && repositoryModDetails?.details)\n              || undefined}\n            callbacks={{\n              goBack: props.goBack,\n              installMod:\n                props.installMod && selectedModSource\n                  ? () => props.installMod?.(selectedModSource)\n                  : undefined,\n              updateMod:\n                props.updateMod && selectedModSource\n                  ? () => props.updateMod?.(\n                    selectedModSource,\n                    modStatus === 'disabled'\n                  )\n                  : undefined,\n              forkModFromSource:\n                props.forkModFromSource && selectedModSource\n                  ? () => props.forkModFromSource?.(selectedModSource)\n                  : undefined,\n              compileMod: props.compileMod,\n              enableMod: props.enableMod,\n              editMod: props.editMod,\n              forkMod: props.forkMod,\n              deleteMod: props.deleteMod,\n              updateModRating: props.updateModRating,\n              onOpenVersionModal: handleOpenVersionModal,\n            }}\n          />\n        }\n        tabList={tabList}\n        activeTabKey={availableActiveTab}\n        onTabChange={handleTabChange}\n      >\n        <ModDetailsTabContent\n          modId={modId}\n          isLocalMod={isLocalMod}\n          currentView={modDetailsToShow}\n          activeTab={availableActiveTab}\n          modSourceData={modSourceData}\n          installedModSourceData={installedModSourceData}\n          selectedModSourceData={selectedModSourceData}\n          installedVersionIsLatest={installedVersionIsLatest}\n          canNavigateAwayRef={canNavigateAwayRef}\n          onRetryLoad={() => {\n            if (selectedCustomVersion) {\n              getRepositoryModSourceData({\n                modId,\n                version: selectedCustomVersion,\n              });\n            } else if (repositoryModDetails || loadRepositoryData) {\n              getRepositoryModSourceData({ modId });\n            }\n          }}\n        />\n      </ModDetailsCard>\n      <VersionSelectorModal\n        modId={modId}\n        open={isVersionModalOpen}\n        selectedVersion={selectedCustomVersion}\n        onSelect={handleVersionSelect}\n        onCancel={() => setIsVersionModalOpen(false)}\n      />\n    </ModDetailsContainer>\n  );\n}\n\nexport default ModDetails;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsAdvanced.tsx",
    "content": "import { Alert, Button, Dropdown, List, message, Select, Space, Switch } from 'antd';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { SelectModal, TextAreaWithContextMenu } from '../components/InputWithContextMenu';\nimport {\n  showAdvancedDebugLogOutput,\n  useGetModConfig,\n  useGetModSettings,\n  useSetModSettings,\n  useUpdateModConfig,\n} from '../webviewIPC';\n\nconst SettingsListItemMeta = styled(List.Item.Meta)`\n  .ant-list-item-meta {\n    margin-bottom: 8px;\n  }\n\n  .ant-list-item-meta-title {\n    margin-bottom: 0;\n  }\n`;\n\nconst SettingsSelect = styled(SelectModal)`\n  width: 200px;\n`;\n\nconst SpaceWithWidth = styled(Space)`\n  width: 100%;\n  max-width: 600px;\n`;\n\nfunction engineArrayToProcessList(processArray: string[]) {\n  return processArray.join('\\n');\n}\n\nfunction engineProcessListToArray(processList: string) {\n  return processList\n    .split('\\n')\n    .map((x) => x.replace(/[\"/<>|]/g, '').trim())\n    .filter((x) => x);\n}\n\ninterface Props {\n  modId: string;\n}\n\nfunction ModDetailsAdvanced({ modId }: Props) {\n  const { t } = useTranslation();\n\n  const [debugLogging, setDebugLogging] = useState<number>();\n  const [modSettingsUI, setModSettingsUI] = useState<string>();\n  const [modSettingsUIModified, setModSettingsUIModified] = useState(false);\n  const [customInclude, setCustomInclude] = useState<string>();\n  const [customIncludeModified, setCustomIncludeModified] = useState(false);\n  const [customExclude, setCustomExclude] = useState<string>();\n  const [customExcludeModified, setCustomExcludeModified] = useState(false);\n  const [includeExcludeCustomOnly, setIncludeExcludeCustomOnly] =\n    useState<boolean>();\n  const [patternsMatchCriticalSystemProcesses, setPatternsMatchCriticalSystemProcesses] =\n    useState<boolean>();\n\n  const { getModConfig } = useGetModConfig(\n    useCallback((data) => {\n      if (data.config?.debugLoggingEnabled) {\n        setDebugLogging(2);\n      } else if (data.config?.loggingEnabled) {\n        setDebugLogging(1);\n      } else {\n        setDebugLogging(0);\n      }\n\n      setCustomInclude(engineArrayToProcessList(data.config?.includeCustom ?? []));\n      setCustomExclude(engineArrayToProcessList(data.config?.excludeCustom ?? []));\n      setIncludeExcludeCustomOnly(\n        data.config?.includeExcludeCustomOnly ?? false\n      );\n      setPatternsMatchCriticalSystemProcesses(\n        data.config?.patternsMatchCriticalSystemProcesses ?? false\n      );\n    }, [])\n  );\n\n  const { getModSettings } = useGetModSettings<{ formatted?: boolean }>(\n    useCallback((data, context) => {\n      setModSettingsUI(\n        JSON.stringify(data.settings, null, context?.formatted ? 2 : undefined)\n      );\n    }, [])\n  );\n\n  const { setModSettings } = useSetModSettings(\n    useCallback((data) => {\n      if (data.succeeded) {\n        setModSettingsUIModified(false);\n      }\n    }, [])\n  );\n\n  const { updateModConfig } = useUpdateModConfig<{ callback?: () => void }>(\n    useCallback((data, context) => {\n      if (data.succeeded) {\n        context?.callback?.();\n      }\n    }, [])\n  );\n\n  useEffect(() => {\n    getModConfig({ modId });\n    getModSettings({ modId });\n  }, [getModConfig, getModSettings, modId]);\n\n  if (\n    modSettingsUI === undefined ||\n    debugLogging === undefined ||\n    customInclude === undefined ||\n    customExclude === undefined ||\n    includeExcludeCustomOnly === undefined ||\n    patternsMatchCriticalSystemProcesses === undefined\n  ) {\n    return null;\n  }\n\n  return (\n    <List itemLayout=\"vertical\" split={false}>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.debugLogging.title')}\n          description={t('modDetails.advanced.debugLogging.description')}\n        />\n        <Space direction=\"vertical\" size=\"middle\">\n          <SettingsSelect\n            value={debugLogging}\n            onChange={(value) => {\n              const numValue = typeof value === 'number' ? value : 0;\n              setDebugLogging(numValue);\n              updateModConfig({\n                modId,\n                config: {\n                  loggingEnabled: numValue === 1,\n                  debugLoggingEnabled: numValue === 2,\n                },\n              });\n            }}\n            dropdownMatchSelectWidth={false}\n          >\n            <Select.Option key=\"none\" value={0}>\n              {t('modDetails.advanced.debugLogging.none')}\n            </Select.Option>\n            <Select.Option key=\"error\" value={1}>\n              {t('modDetails.advanced.debugLogging.modLogs')}\n            </Select.Option>\n            <Select.Option key=\"verbose\" value={2}>\n              {t('modDetails.advanced.debugLogging.detailedLogs')}\n            </Select.Option>\n          </SettingsSelect>\n          <Button\n            type=\"primary\"\n            onClick={() => {\n              showAdvancedDebugLogOutput();\n            }}\n          >\n            {t('modDetails.advanced.debugLogging.showLogButton')}\n          </Button>\n        </Space>\n      </List.Item>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.modSettings.title')}\n          description={t('modDetails.advanced.modSettings.description')}\n        />\n        <SpaceWithWidth direction=\"vertical\" size=\"middle\">\n          <TextAreaWithContextMenu\n            rows={4}\n            value={modSettingsUI}\n            onChange={(e) => {\n              setModSettingsUI(e.target.value);\n              setModSettingsUIModified(true);\n            }}\n          />\n          <Space>\n            <Dropdown.Button\n              type=\"primary\"\n              menu={{\n                items: [\n                  {\n                    key: 'formatted',\n                    label: t(\n                      'modDetails.advanced.modSettings.loadFormattedButton'\n                    ),\n                  },\n                ],\n                onClick: (e) => {\n                  getModSettings(\n                    { modId },\n                    { formatted: e.key === 'formatted' }\n                  );\n                },\n              }}\n              onClick={() => {\n                getModSettings({ modId });\n              }}\n            >\n              {t('modDetails.advanced.modSettings.loadButton')}\n            </Dropdown.Button>\n            <Button\n              type=\"primary\"\n              disabled={!modSettingsUIModified}\n              onClick={() => {\n                let settings = null;\n                try {\n                  settings = JSON.parse(modSettingsUI);\n                } catch {\n                  message.error(\n                    t('modDetails.advanced.modSettings.invalidData')\n                  );\n                  return;\n                }\n                setModSettings({\n                  modId,\n                  settings,\n                });\n              }}\n            >\n              {t('modDetails.advanced.modSettings.saveButton')}\n            </Button>\n          </Space>\n        </SpaceWithWidth>\n      </List.Item>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.customList.titleInclusion')}\n          description={t(\n            'modDetails.advanced.customList.descriptionInclusion'\n          )}\n        />\n        <SpaceWithWidth direction=\"vertical\" size=\"middle\">\n          <div>\n            <TextAreaWithContextMenu\n              rows={4}\n              value={customInclude}\n              placeholder={\n                (t(\n                  'modDetails.advanced.customList.processListPlaceholder'\n                ) as string) +\n                '\\n' +\n                'notepad.exe\\n' +\n                '%ProgramFiles%\\\\Notepad++\\\\notepad++.exe\\n' +\n                'C:\\\\Windows\\\\system32\\\\*'\n              }\n              onChange={(e) => {\n                setCustomInclude(e.target.value);\n                setCustomIncludeModified(true);\n              }}\n            />\n            {customInclude.match(/[\"/<>|]/) && (\n              <Alert\n                description={t('modDetails.advanced.customList.invalidCharactersWarning', {\n                  invalidCharacters: '\" / < > |',\n                })}\n                type=\"warning\"\n                showIcon\n              />\n            )}\n          </div>\n          <Button\n            type=\"primary\"\n            disabled={!customIncludeModified}\n            onClick={() => {\n              updateModConfig(\n                {\n                  modId,\n                  config: {\n                    includeCustom: engineProcessListToArray(customInclude),\n                  },\n                },\n                { callback: () => setCustomIncludeModified(false) }\n              );\n            }}\n          >\n            {t('modDetails.advanced.customList.saveButton')}\n          </Button>\n        </SpaceWithWidth>\n      </List.Item>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.customList.titleExclusion')}\n          description={t(\n            'modDetails.advanced.customList.descriptionExclusion'\n          )}\n        />\n        <SpaceWithWidth direction=\"vertical\" size=\"middle\">\n          <div>\n            <TextAreaWithContextMenu\n              rows={4}\n              value={customExclude}\n              placeholder={\n                (t(\n                  'modDetails.advanced.customList.processListPlaceholder'\n                ) as string) +\n                '\\n' +\n                'notepad.exe\\n' +\n                '%ProgramFiles%\\\\Notepad++\\\\notepad++.exe\\n' +\n                'C:\\\\Windows\\\\system32\\\\*'\n              }\n              onChange={(e) => {\n                setCustomExclude(e.target.value);\n                setCustomExcludeModified(true);\n              }}\n            />\n            {customExclude.match(/[\"/<>|]/) && (\n              <Alert\n                description={t('modDetails.advanced.customList.invalidCharactersWarning', {\n                  invalidCharacters: '\" / < > |',\n                })}\n                type=\"warning\"\n                showIcon\n              />\n            )}\n          </div>\n          <Button\n            type=\"primary\"\n            disabled={!customExcludeModified}\n            onClick={() => {\n              updateModConfig(\n                {\n                  modId,\n                  config: {\n                    excludeCustom: engineProcessListToArray(customExclude),\n                  },\n                },\n                { callback: () => setCustomExcludeModified(false) }\n              );\n            }}\n          >\n            {t('modDetails.advanced.customList.saveButton')}\n          </Button>\n        </SpaceWithWidth>\n      </List.Item>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.includeExcludeCustomOnly.title')}\n          description={t(\n            'modDetails.advanced.includeExcludeCustomOnly.description'\n          )}\n        />\n        <Switch\n          checked={includeExcludeCustomOnly}\n          onChange={(checked) => {\n            setIncludeExcludeCustomOnly(checked);\n            updateModConfig({\n              modId,\n              config: {\n                includeExcludeCustomOnly: checked,\n              },\n            });\n          }}\n        />\n      </List.Item>\n      <List.Item>\n        <SettingsListItemMeta\n          title={t('modDetails.advanced.patternsMatchCriticalSystemProcesses.title')}\n          description={\n            <Trans\n              t={t}\n              i18nKey=\"modDetails.advanced.patternsMatchCriticalSystemProcesses.description\"\n              components={[\n                <code />,\n                <a href=\"https://github.com/ramensoftware/windhawk/wiki/Injection-targets-and-critical-system-processes\">wiki</a>,\n              ]}\n            />\n          }\n        />\n        <Switch\n          checked={patternsMatchCriticalSystemProcesses}\n          onChange={(checked) => {\n            setPatternsMatchCriticalSystemProcesses(checked);\n            updateModConfig({\n              modId,\n              config: {\n                patternsMatchCriticalSystemProcesses: checked,\n              },\n            });\n          }}\n        />\n      </List.Item>\n    </List>\n  );\n}\n\nexport default ModDetailsAdvanced;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsChangelog.tsx",
    "content": "import { ConfigProvider } from 'antd';\nimport { Trans, useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport useSWR from 'swr';\nimport ReactMarkdownCustom from '../components/ReactMarkdownCustom';\nimport { fetchText } from '../swrHelpers';\n\nconst ErrorMessage = styled.div`\n  color: rgba(255, 255, 255, 0.45);\n  font-style: italic;\n`;\n\ninterface Props {\n  modId: string;\n  loadingNode: React.ReactElement;\n}\n\nfunction ModDetailsChangelog({ modId, loadingNode }: Props) {\n  const { t } = useTranslation();\n\n  const url = `https://mods.windhawk.net/changelogs/${modId}.md`;\n\n  const { data, error, isLoading } = useSWR(url, fetchText);\n\n  if (error) {\n    const githubUrl = `https://github.com/ramensoftware/windhawk-mods/blob/pages/changelogs/${modId}.md`;\n    return (\n      <ErrorMessage>\n        <Trans\n          t={t}\n          i18nKey=\"modDetails.changelog.loadingFailed\"\n          components={[<a href={githubUrl}>GitHub</a>]}\n        />\n      </ErrorMessage>\n    );\n  }\n\n  if (isLoading) {\n    return loadingNode;\n  }\n\n  return (\n    <ConfigProvider direction=\"ltr\">\n      <ReactMarkdownCustom markdown={data || ''} direction=\"ltr\" />\n    </ConfigProvider>\n  );\n}\n\nexport default ModDetailsChangelog;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsHeader.tsx",
    "content": "import { faGithubAlt } from '@fortawesome/free-brands-svg-icons';\nimport {\n  faArrowLeft,\n  faArrowRight,\n  faHeart,\n  faHome,\n  faUser,\n} from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Alert, Button, Card, ConfigProvider, Dropdown, Modal, Rate, Tooltip } from 'antd';\nimport { useContext, useState } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport EllipsisText from '../components/EllipsisText';\nimport { PopconfirmModal } from '../components/InputWithContextMenu';\nimport { sanitizeUrl } from '../utils';\nimport { ModConfig, ModMetadata, RepositoryDetails } from '../webviewIPCMessages';\nimport DevModeAction from './DevModeAction';\nimport ModMetadataLine from './ModMetadataLine';\n\nconst TextAsIconWrapper = styled.span`\n  font-size: 18px;\n  line-height: 18px;\n  user-select: none;\n`;\n\nconst ModDetailsHeaderWrapper = styled.div`\n  display: flex;\n  margin-bottom: 4px;\n\n  > :first-child {\n    flex-shrink: 0;\n    margin-inline-end: 12px;\n    // Center vertically with text:\n    margin-top: -8px;\n  }\n\n  // https://stackoverflow.com/q/26465745\n  .ant-card-meta {\n    min-width: 0;\n  }\n`;\n\nconst CardTitleWrapper = styled.div`\n  padding-bottom: 4px;\n`;\n\nconst CardTitleFirstLine = styled.div`\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  column-gap: 8px;\n\n  > * {\n    text-overflow: ellipsis;\n    overflow: hidden;\n  }\n\n  > :not(:first-child) {\n    font-size: 14px;\n    font-weight: normal;\n  }\n`;\n\nconst CardTitleModId = styled.div`\n  border-radius: 2px;\n  background: #444;\n  padding: 0 4px;\n`;\n\nconst CardTitleDescription = styled(EllipsisText)`\n  display: block !important;\n  color: rgba(255, 255, 255, 0.45);\n  font-size: 14px;\n  font-weight: normal;\n`;\n\nconst ModRate = styled(Rate)`\n  line-height: 0.7;\n`;\n\nconst HeartIcon = styled(FontAwesomeIcon)`\n  color: #ff4d4f;\n  margin-inline-end: 4px;\n`;\n\nconst CardTitleButtons = styled.div`\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  margin-top: 8px;\n\n  // Fixes a button alignment bug.\n  > .ant-tooltip-disabled-compatible-wrapper,\n  > .ant-popover-disabled-compatible-wrapper {\n    font-size: 0;\n  }\n`;\n\nconst ModInstallationAlert = styled(Alert)`\n  line-height: 1.2;\n`;\n\nconst ModInstallationModalContent = styled.div`\n  display: flex;\n  flex-direction: column;\n  row-gap: 24px;\n`;\n\nconst ModInstallationDetails = styled.div`\n  display: grid;\n  grid-template-columns: 20px auto;\n  align-items: center;\n  row-gap: 4px;\n`;\n\nconst ModInstallationDetailsVerified = styled.span`\n  text-decoration: underline dotted;\n  cursor: help;\n`;\n\nexport type ModStatus =\n  | 'not-installed'\n  | 'installed-not-compiled'\n  | 'disabled'\n  | 'enabled';\n\nfunction VerifiedLabel() {\n  const { t } = useTranslation();\n\n  return (\n    <Tooltip\n      title={\n        <Trans\n          t={t}\n          i18nKey=\"installModal.verifiedTooltip\"\n          components={[<strong />]}\n        />\n      }\n      placement=\"bottom\"\n    >\n      <ModInstallationDetailsVerified>\n        {t('installModal.verified')}\n      </ModInstallationDetailsVerified>\n    </Tooltip>\n  );\n}\n\nfunction ModInstallationDetailsGrid(props: { modMetadata: ModMetadata }) {\n  const { t } = useTranslation();\n\n  const { modMetadata } = props;\n\n  return (\n    <ModInstallationDetails>\n      {modMetadata.author && (\n        <>\n          <FontAwesomeIcon icon={faUser} />\n          <div>\n            <strong>{t('installModal.modAuthor')}:</strong> {modMetadata.author}\n          </div>\n        </>\n      )}\n      {modMetadata.homepage && (\n        <>\n          <FontAwesomeIcon icon={faHome} />\n          <div>\n            <strong>{t('installModal.homepage')}:</strong>{' '}\n            <a href={sanitizeUrl(modMetadata.homepage)}>{modMetadata.homepage}</a>\n          </div>\n        </>\n      )}\n      {modMetadata.github && (\n        <>\n          <FontAwesomeIcon icon={faGithubAlt} />\n          <div>\n            <strong>\n              {t('installModal.github')} (<VerifiedLabel />\n              ):\n            </strong>{' '}\n            <a href={sanitizeUrl(modMetadata.github)}>\n              {modMetadata.github.replace(\n                /^https:\\/\\/github\\.com\\/([a-z0-9-]+)$/i,\n                '$1'\n              )}\n            </a>\n          </div>\n        </>\n      )}\n      {modMetadata.twitter && (\n        <>\n          <TextAsIconWrapper>𝕏</TextAsIconWrapper>\n          <div>\n            <strong>\n              {t('installModal.twitter')} (<VerifiedLabel />\n              ):\n            </strong>{' '}\n            <a href={sanitizeUrl(modMetadata.twitter)}>\n              {modMetadata.twitter.replace(\n                /^https:\\/\\/(?:twitter|x)\\.com\\/([a-z0-9_]+)$/i,\n                '@$1'\n              )}\n            </a>\n          </div>\n        </>\n      )}\n    </ModInstallationDetails>\n  );\n}\n\ninterface Props {\n  topNode?: React.ReactNode;\n  modId: string;\n  modMetadata: ModMetadata;\n  modConfig?: ModConfig;\n  modStatus: ModStatus;\n  updateAvailable: boolean;\n  installedVersionIsLatest: boolean;\n  isDowngrade: boolean;\n  userRating?: number;\n  repositoryDetails?: RepositoryDetails;\n  callbacks: {\n    goBack: () => void;\n    installMod?: () => void;\n    updateMod?: () => void;\n    forkModFromSource?: () => void;\n    compileMod: () => void;\n    enableMod: (enable: boolean) => void;\n    editMod: () => void;\n    forkMod: () => void;\n    deleteMod: () => void;\n    updateModRating: (newRating: number) => void;\n    onOpenVersionModal?: () => void;\n  };\n}\n\nfunction ModDetailsHeader(props: Props) {\n  const { t } = useTranslation();\n\n  const { modId, modMetadata, modConfig, modStatus, callbacks } = props;\n\n  const { direction } = useContext(ConfigProvider.ConfigContext);\n\n  let displayModId = props.modId;\n  let isLocalMod = false;\n  if (modId.startsWith('local@')) {\n    displayModId = modId.slice('local@'.length);\n    isLocalMod = true;\n  }\n\n  const displayModName = modMetadata.name || displayModId;\n\n  const [isInstallModalOpen, setIsInstallModalOpen] = useState(false);\n\n  return (\n    <ModDetailsHeaderWrapper>\n      <Button\n        type=\"text\"\n        icon={<FontAwesomeIcon icon={direction === 'rtl' ? faArrowRight : faArrowLeft} />}\n        onClick={() => callbacks.goBack()}\n      />\n      <Card.Meta\n        title={\n          <>\n            {props.topNode}\n            <CardTitleWrapper>\n              <CardTitleFirstLine>\n                <div>{displayModName}</div>\n                <Tooltip\n                  title={t('modDetails.header.modId')}\n                  placement=\"bottom\"\n                >\n                  <CardTitleModId>{displayModId}</CardTitleModId>\n                </Tooltip>\n              </CardTitleFirstLine>\n              <ModMetadataLine\n                modMetadata={modMetadata}\n                customProcesses={modConfig && {\n                  include: modConfig.includeCustom,\n                  exclude: modConfig.excludeCustom,\n                  includeExcludeCustomOnly: modConfig.includeExcludeCustomOnly,\n                  patternsMatchCriticalSystemProcesses: modConfig.patternsMatchCriticalSystemProcesses,\n                }}\n                repositoryDetails={props.repositoryDetails}\n              />\n              {modMetadata.description && (\n                <CardTitleDescription tooltipPlacement=\"bottom\">\n                  {modMetadata.description}\n                </CardTitleDescription>\n              )}\n              {modStatus !== 'not-installed' &&\n                modStatus !== 'installed-not-compiled' &&\n                !isLocalMod && (\n                  <ModRate\n                    value={props.userRating}\n                    onChange={(newRating) =>\n                      callbacks.updateModRating(newRating)\n                    }\n                  />\n                )}\n              <CardTitleButtons>\n                {props.updateAvailable && (\n                  <Tooltip\n                    title={\n                      props.installedVersionIsLatest &&\n                      t('modDetails.header.updateNotNeeded')\n                    }\n                    placement=\"bottom\"\n                  >\n                    {/* Wrap in div to prevent taking 100% width */}\n                    <div>\n                      <Dropdown.Button\n                        type=\"primary\"\n                        size=\"small\"\n                        disabled={\n                          !callbacks.updateMod || props.installedVersionIsLatest\n                        }\n                        onClick={() => callbacks.updateMod?.()}\n                        menu={{\n                          items: [\n                            {\n                              key: 'choose',\n                              label: t('modDetails.version.chooseVersion'),\n                              onClick: callbacks.onOpenVersionModal,\n                            },\n                          ],\n                        }}\n                      >\n                        {props.isDowngrade\n                          ? t('mod.downgrade')\n                          : t('mod.update')}\n                      </Dropdown.Button>\n                    </div>\n                  </Tooltip>\n                )}\n                {modStatus === 'not-installed' ? (\n                  !props.updateAvailable && (\n                    // Wrap in div to prevent taking 100% width\n                    <div>\n                      <Dropdown.Button\n                        type=\"primary\"\n                        size=\"small\"\n                        disabled={!callbacks.installMod}\n                        onClick={() => setIsInstallModalOpen(true)}\n                        menu={{\n                          items: [\n                            {\n                              key: 'choose',\n                              label: t('modDetails.version.chooseVersion'),\n                              onClick: callbacks.onOpenVersionModal,\n                            },\n                          ],\n                        }}\n                      >\n                        {t('mod.install')}\n                      </Dropdown.Button>\n                    </div>\n                  )\n                ) : modStatus === 'installed-not-compiled' ? (\n                  <Button\n                    type=\"primary\"\n                    size=\"small\"\n                    onClick={() => callbacks.compileMod()}\n                  >\n                    {t('mod.compile')}\n                  </Button>\n                ) : modStatus === 'enabled' ? (\n                  <Button\n                    type=\"primary\"\n                    size=\"small\"\n                    onClick={() => callbacks.enableMod(false)}\n                  >\n                    {t('mod.disable')}\n                  </Button>\n                ) : modStatus === 'disabled' ? (\n                  <Button\n                    type=\"primary\"\n                    size=\"small\"\n                    onClick={() => callbacks.enableMod(true)}\n                  >\n                    {t('mod.enable')}\n                  </Button>\n                ) : (\n                  ''\n                )}\n                {modStatus !== 'not-installed' &&\n                  isLocalMod && (\n                    <DevModeAction\n                      popconfirmPlacement=\"bottom\"\n                      onClick={() => callbacks.editMod()}\n                      renderButton={(onClick) => (\n                        <Button type=\"primary\" size=\"small\" onClick={onClick}>\n                          {t('mod.edit')}\n                        </Button>\n                      )}\n                    />\n                  )}\n                {modStatus !== 'not-installed' ? (\n                  <>\n                    <DevModeAction\n                      popconfirmPlacement=\"bottom\"\n                      onClick={() => callbacks.forkMod()}\n                      renderButton={(onClick) => (\n                        <Button type=\"primary\" size=\"small\" onClick={onClick}>\n                          {t('mod.fork')}\n                        </Button>\n                      )}\n                    />\n                    <PopconfirmModal\n                      placement=\"bottom\"\n                      title={t('mod.removeConfirm')}\n                      okText={t('mod.removeConfirmOk')}\n                      cancelText={t('mod.removeConfirmCancel')}\n                      okButtonProps={{ danger: true }}\n                      onConfirm={() => callbacks.deleteMod()}\n                    >\n                      <Button type=\"primary\" size=\"small\">\n                        {t('mod.remove')}\n                      </Button>\n                    </PopconfirmModal>\n                  </>\n                ) : (\n                  <DevModeAction\n                    disabled={!callbacks.forkModFromSource}\n                    popconfirmPlacement=\"bottom\"\n                    onClick={() => callbacks.forkModFromSource?.()}\n                    renderButton={(onClick) => (\n                      <Button\n                        type=\"primary\"\n                        size=\"small\"\n                        disabled={!callbacks.forkModFromSource}\n                        onClick={onClick}\n                      >\n                        {t('mod.fork')}\n                      </Button>\n                    )}\n                  />\n                )}\n                {modMetadata.donateUrl && (\n                  <Button\n                    type=\"primary\"\n                    size=\"small\"\n                    href={sanitizeUrl(modMetadata.donateUrl)}\n                    target=\"_blank\"\n                  >\n                    <HeartIcon icon={faHeart} />\n                    {t('mod.donate')}\n                  </Button>\n                )}\n              </CardTitleButtons>\n            </CardTitleWrapper>\n          </>\n        }\n      />\n      <Modal\n        title={t('installModal.title', {\n          mod: displayModName,\n        })}\n        open={isInstallModalOpen}\n        centered={true}\n        onOk={() => {\n          callbacks.installMod?.();\n          setIsInstallModalOpen(false);\n        }}\n        onCancel={() => {\n          setIsInstallModalOpen(false);\n        }}\n        okText={t('installModal.acceptButton')}\n        okButtonProps={{\n          disabled: !callbacks.installMod,\n        }}\n        cancelText={t('installModal.cancelButton')}\n      >\n        <ModInstallationModalContent>\n          <ModInstallationAlert\n            message={<h3>{t('installModal.warningTitle')}</h3>}\n            description={t('installModal.warningDescription')}\n            type=\"warning\"\n            showIcon\n          />\n          <ModInstallationDetailsGrid modMetadata={modMetadata} />\n        </ModInstallationModalContent>\n      </Modal>\n    </ModDetailsHeaderWrapper>\n  );\n}\n\nexport default ModDetailsHeader;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsReadme.tsx",
    "content": "import { ConfigProvider } from 'antd';\nimport type { Components } from 'react-markdown';\nimport ReactMarkdownCustom from '../components/ReactMarkdownCustom';\n\ninterface Props {\n  markdown: string;\n  isLocalMod?: boolean;\n}\n\nfunction ModDetailsReadme({ markdown, isLocalMod }: Props) {\n  // Only use custom components for non-local mods to transform image URLs.\n  const customComponents: Components | undefined = isLocalMod ? undefined : {\n    img: ({ node, src, alt, ...props }) => {\n      let transformedSrc = src;\n\n      // Transform certain image URLs to go through our image proxy. This\n      // ensures that the original images are available even if they're removed\n      // from the original hosting site. Also, Imgur is blocked in the UK, so\n      // this makes Imgur images accessible there.\n      if (src) {\n        const shouldTransform =\n          src.startsWith('https://i.imgur.com/') ||\n          (src.startsWith('https://raw.githubusercontent.com/') &&\n            !src.startsWith('https://raw.githubusercontent.com/ramensoftware/'));\n\n        if (shouldTransform) {\n          const path = src.slice('https://'.length);\n          transformedSrc = `https://mods.windhawk.net/images/${path}`;\n        }\n      }\n\n      return <img src={transformedSrc} alt={alt} {...props} />;\n    }\n  };\n\n  return (\n    <ConfigProvider direction=\"ltr\">\n      <ReactMarkdownCustom\n        markdown={markdown}\n        components={customComponents}\n        direction=\"ltr\"\n      />\n    </ConfigProvider>\n  );\n}\n\nexport default ModDetailsReadme;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.spec.ts",
    "content": "/**\n * Tests for YamlSchemaValidator and YamlConverter\n * \n * These tests ensure:\n * 1. Round-trip conversion (settings -> YAML -> settings) works correctly\n * 2. Schema validation properly detects invalid keys and type mismatches\n * 3. Complex nested structures are handled correctly\n */\n\nimport { TextDecoder, TextEncoder } from 'util';\n\n// Mock dependencies that are not needed for testing\njest.mock('monaco-editor', () => ({}));\njest.mock('@monaco-editor/react', () => ({\n  loader: { config: jest.fn() },\n}));\njest.mock('react-i18next', () => ({\n  useTranslation: () => ({ t: (key: string) => key }),\n}));\njest.mock('react-router-dom', () => ({\n  useBlocker: () => ({ state: 'unblocked', proceed: jest.fn(), reset: jest.fn() }),\n}));\njest.mock('../webviewIPC', () => ({\n  useGetModSettings: jest.fn(),\n  useSetModSettings: jest.fn(),\n}));\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst globalAny = global as any;\nif (!globalAny.TextEncoder) {\n  globalAny.TextEncoder = TextEncoder;\n}\nif (!globalAny.TextDecoder) {\n  globalAny.TextDecoder = TextDecoder;\n}\n\n// eslint-disable-next-line import/first\nimport {\n  exportedForTesting,\n  typesForTesting,\n} from './ModDetailsSettings';\n// eslint-disable-next-line import/first\nimport * as yaml from 'js-yaml';\n// eslint-disable-next-line import/first\nimport i18next from 'i18next';\n\nconst {\n  YamlSchemaValidator,\n  YamlConverter,\n} = exportedForTesting;\n\ntype ModSettings = typesForTesting[\"ModSettings\"];\ntype InitialSettings = typesForTesting[\"InitialSettings\"]\n\n// Mock translation function for tests\nconst mockT = ((key: string, params?: Record<string, string | number>): string => {\n  if (key === 'modDetails.settings.yamlInvalid') return 'Invalid YAML structure';\n  if (key === 'modDetails.settings.yamlInvalidKey') return `Invalid key: ${params?.['key']}`;\n  if (key === 'modDetails.settings.yamlTypeMismatch') {\n    return `Type mismatch for ${params?.['key']}: expected ${params?.['expected']}, got ${params?.['actual']}`;\n  }\n  if (key === 'modDetails.settings.yamlParseError') return `Parse error: ${params?.['error']}`;\n  return key;\n}) as typeof i18next.t;\n\n// Helper function to parse YAML text into an object for comparison\nconst parseYaml = (yamlText: string): unknown => {\n  if (!yamlText) return {};\n  return yaml.load(yamlText);\n};\n\n// =============================================================================\n// TESTS\n// =============================================================================\n\ndescribe('YamlConverter and YamlSchemaValidator', () => {\n\n  // ===== Simple Types Tests =====\n\n  describe('Simple primitive types', () => {\n    const initialSettings: InitialSettings = [\n      { key: 'enabled', value: true },\n      { key: 'count', value: 42 },\n      { key: 'name', value: 'test' },\n    ];\n\n    it('should convert flat settings to YAML and back', () => {\n      const flatSettings: ModSettings = {\n        enabled: 1,\n        count: 100,\n        name: 'mytest',\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      expect(yamlText).toBeTruthy();\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should handle empty values correctly', () => {\n      const flatSettings: ModSettings = {\n        enabled: 0,\n        count: 0,\n        name: '',\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Empty values are kept in objects, only array ends are trimmed\n      expect(parsed).toEqual({\n        enabled: 0,\n        count: 0,\n        name: '',\n      });\n    });\n\n    it('should detect invalid keys', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'invalid_key: 123';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Invalid key: invalid_key');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should detect type mismatches', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'count: \"not a number\"';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should coerce flat settings to schema primitive types when generating YAML', () => {\n      const flatSettings: ModSettings = {\n        enabled: '1',\n        count: '123',\n        name: 'value',\n      };\n\n      const nested = YamlConverter.flatToNested(flatSettings, initialSettings);\n\n      expect(nested['enabled']).toBe(1);\n\n      const countValue = nested['count'];\n      expect(typeof countValue).toBe('number');\n      expect(countValue).toBe(123);\n\n      expect(nested['name']).toBe('value');\n    });\n  });\n\n  // ===== Primitive Arrays Tests =====\n\n  describe('Primitive arrays', () => {\n    const initialSettings: InitialSettings = [\n      { key: 'numbers', value: [1, 2, 3] },\n      { key: 'strings', value: ['a', 'b', 'c'] },\n    ];\n\n    it('should handle number arrays', () => {\n      const flatSettings: ModSettings = {\n        'numbers[0]': 10,\n        'numbers[1]': 20,\n        'numbers[2]': 30,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      // Schema defines both numbers and strings arrays\n      // strings gets default first entry since it's not in flatSettings\n      expect(result.settings).toEqual({\n        ...flatSettings,\n        'strings[0]': '', // Default first entry for array in schema\n      });\n    });\n\n    it('should handle string arrays', () => {\n      const flatSettings: ModSettings = {\n        'strings[0]': 'hello',\n        'strings[1]': 'world',\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      // Schema defines both numbers and strings arrays\n      // numbers gets default first entry since it's not in flatSettings\n      expect(result.settings).toEqual({\n        'numbers[0]': 0, // Default first entry for array in schema\n        ...flatSettings,\n      });\n    });\n\n    it('should fill leading gaps in number arrays', () => {\n      const flatSettings: ModSettings = {\n        'numbers[3]': 7,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      expect(parsed).toEqual({\n        numbers: [0, 0, 0, 7],\n        strings: [''],\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual({\n        'numbers[0]': 0,\n        'numbers[1]': 0,\n        'numbers[2]': 0,\n        'numbers[3]': 7,\n        'strings[0]': '',\n      });\n    });\n\n    it('should detect wrong type in number array', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'numbers:\\n  - 1\\n  - \"wrong\"\\n  - 3';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n  });\n\n  // ===== Nested Objects Tests =====\n\n  describe('Nested objects', () => {\n    const initialSettings: InitialSettings = [\n      {\n        key: 'database',\n        value: [\n          { key: 'host', value: 'localhost' },\n          { key: 'port', value: 5432 },\n          { key: 'enabled', value: true },\n        ],\n      },\n    ];\n\n    it('should handle nested object settings', () => {\n      const flatSettings: ModSettings = {\n        'database.host': 'example.com',\n        'database.port': 3306,\n        'database.enabled': 1,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should detect invalid nested keys', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'database:\\n  host: test\\n  invalid: 123';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Invalid key: database.invalid');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should respect schema order when filling defaults', () => {\n      const flatSettings: ModSettings = {\n        'database.port': 3306,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const lines = yamlText.split('\\n');\n      const hostIndex = lines.findIndex(l => l.includes('host:'));\n      const portIndex = lines.findIndex(l => l.includes('port:'));\n      const enabledIndex = lines.findIndex(l => l.includes('enabled:'));\n\n      expect(hostIndex).toBeGreaterThan(-1);\n      expect(portIndex).toBeGreaterThan(-1);\n      expect(enabledIndex).toBeGreaterThan(-1);\n      expect(hostIndex).toBeLessThan(portIndex);\n      expect(portIndex).toBeLessThan(enabledIndex);\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual({\n        'database.host': '',\n        'database.port': 3306,\n        'database.enabled': 0,\n      });\n    });\n\n    it('should maintain key order from schema', () => {\n      const flatSettings: ModSettings = {\n        'database.enabled': 1,\n        'database.host': 'test',\n        'database.port': 8080,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure\n      expect(parsed).toEqual({\n        database: {\n          host: 'test',\n          port: 8080,\n          enabled: 1,\n        },\n      });\n\n      // Keys should appear in schema order: host, port, enabled\n      const lines = yamlText.split('\\n');\n      const hostIndex = lines.findIndex(l => l.includes('host:'));\n      const portIndex = lines.findIndex(l => l.includes('port:'));\n      const enabledIndex = lines.findIndex(l => l.includes('enabled:'));\n\n      expect(hostIndex).toBeLessThan(portIndex);\n      expect(portIndex).toBeLessThan(enabledIndex);\n    });\n  });\n\n  // ===== Array of Objects Tests =====\n\n  describe('Array of objects', () => {\n    const initialSettings: InitialSettings = [\n      {\n        key: 'servers',\n        value: [\n          [\n            { key: 'name', value: 'server1' },\n            { key: 'port', value: 8080 },\n          ],\n        ],\n      },\n    ];\n\n    it('should handle array of objects', () => {\n      const flatSettings: ModSettings = {\n        'servers[0].name': 'web-server',\n        'servers[0].port': 80,\n        'servers[1].name': 'db-server',\n        'servers[1].port': 5432,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should detect invalid keys in array elements', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'servers:\\n  - name: test\\n    port: 80\\n    invalid: 123';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Invalid key: servers.invalid');\n      expect(result.settings).toBeNull();\n    });\n  });\n\n  // ===== Deeply Nested Structures Tests =====\n\n  describe('Deeply nested structures', () => {\n    const initialSettings: InitialSettings = [\n      {\n        key: 'config',\n        value: [\n          {\n            key: 'profiles',\n            value: [\n              [\n                { key: 'name', value: 'default' },\n                {\n                  key: 'settings',\n                  value: [\n                    { key: 'theme', value: 'dark' },\n                    { key: 'fontSize', value: 14 },\n                  ],\n                },\n              ],\n            ],\n          },\n        ],\n      },\n    ];\n\n    it('should handle deeply nested structures', () => {\n      const flatSettings: ModSettings = {\n        'config.profiles[0].name': 'production',\n        'config.profiles[0].settings.theme': 'light',\n        'config.profiles[0].settings.fontSize': 16,\n        'config.profiles[1].name': 'development',\n        'config.profiles[1].settings.theme': 'dark',\n        'config.profiles[1].settings.fontSize': 12,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should detect type errors in deeply nested values', () => {\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = `config:\n  profiles:\n    - name: test\n      settings:\n        theme: light\n        fontSize: \"not a number\"`;\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n  });\n\n  // ===== Nested Arrays Tests =====\n\n  describe('Nested arrays (arrays of objects containing arrays)', () => {\n    describe('Arrays containing primitive arrays', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'groups',\n          value: [\n            [\n              { key: 'name', value: 'team1' },\n              { key: 'tags', value: ['tag1', 'tag2'] },\n            ],\n          ],\n        },\n      ];\n\n      it('should handle array of objects with primitive arrays', () => {\n        const flatSettings: ModSettings = {\n          'groups[0].name': 'frontend',\n          'groups[0].tags[0]': 'react',\n          'groups[0].tags[1]': 'typescript',\n          'groups[1].name': 'backend',\n          'groups[1].tags[0]': 'node',\n          'groups[1].tags[1]': 'express',\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          groups: [\n            { name: 'frontend', tags: ['react', 'typescript'] },\n            { name: 'backend', tags: ['node', 'express'] },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual(flatSettings);\n      });\n\n      it('should fill missing array indices in nested primitive arrays', () => {\n        const flatSettings: ModSettings = {\n          'groups[0].name': 'team',\n          'groups[0].tags[0]': 'first',\n          'groups[0].tags[2]': 'third', // Sparse array - missing index 1\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          groups: [\n            { \n              name: 'team', \n              tags: ['first', '', 'third'], // Index 1 filled with default\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'groups[0].name': 'team',\n          'groups[0].tags[0]': 'first',\n          'groups[0].tags[1]': '', // Filled with default\n          'groups[0].tags[2]': 'third',\n        });\n      });\n\n      it('should add missing nested array when parent object exists', () => {\n        const flatSettings: ModSettings = {\n          'groups[0].name': 'team',\n          // groups[0].tags is missing entirely\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          groups: [\n            { \n              name: 'team', \n              tags: [''], // Default first entry added\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'groups[0].name': 'team',\n          'groups[0].tags[0]': '', // Default added\n        });\n      });\n    });\n\n    describe('Arrays containing object arrays', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'departments',\n          value: [\n            [\n              { key: 'name', value: 'Engineering' },\n              {\n                key: 'teams',\n                value: [\n                  [\n                    { key: 'teamName', value: 'Team A' },\n                    { key: 'size', value: 5 },\n                  ],\n                ],\n              },\n            ],\n          ],\n        },\n      ];\n\n      it('should handle array of objects containing object arrays', () => {\n        const flatSettings: ModSettings = {\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': 'Frontend',\n          'departments[0].teams[0].size': 8,\n          'departments[0].teams[1].teamName': 'Backend',\n          'departments[0].teams[1].size': 6,\n          'departments[1].name': 'Sales',\n          'departments[1].teams[0].teamName': 'Enterprise',\n          'departments[1].teams[0].size': 4,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          departments: [\n            {\n              name: 'Engineering',\n              teams: [\n                { teamName: 'Frontend', size: 8 },\n                { teamName: 'Backend', size: 6 },\n              ],\n            },\n            {\n              name: 'Sales',\n              teams: [\n                { teamName: 'Enterprise', size: 4 },\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual(flatSettings);\n      });\n\n      it('should fill sparse arrays in nested object arrays', () => {\n        const flatSettings: ModSettings = {\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': 'Frontend',\n          'departments[0].teams[0].size': 8,\n          'departments[0].teams[2].teamName': 'DevOps', // Sparse - missing index 1\n          'departments[0].teams[2].size': 3,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          departments: [\n            {\n              name: 'Engineering',\n              teams: [\n                { teamName: 'Frontend', size: 8 },\n                { teamName: '', size: 0 }, // Index 1 filled with defaults\n                { teamName: 'DevOps', size: 3 },\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': 'Frontend',\n          'departments[0].teams[0].size': 8,\n          'departments[0].teams[1].teamName': '', // Filled\n          'departments[0].teams[1].size': 0, // Filled\n          'departments[0].teams[2].teamName': 'DevOps',\n          'departments[0].teams[2].size': 3,\n        });\n      });\n\n      it('should fill missing properties in nested object array elements', () => {\n        const flatSettings: ModSettings = {\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': 'Frontend',\n          // departments[0].teams[0].size is missing\n          'departments[0].teams[1].size': 6,\n          // departments[0].teams[1].teamName is missing\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          departments: [\n            {\n              name: 'Engineering',\n              teams: [\n                { teamName: 'Frontend', size: 0 }, // size filled with default\n                { teamName: '', size: 6 }, // teamName filled with default\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': 'Frontend',\n          'departments[0].teams[0].size': 0, // Filled\n          'departments[0].teams[1].teamName': '', // Filled\n          'departments[0].teams[1].size': 6,\n        });\n      });\n\n      it('should add missing nested object array when parent exists', () => {\n        const flatSettings: ModSettings = {\n          'departments[0].name': 'Engineering',\n          // departments[0].teams is completely missing\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          departments: [\n            {\n              name: 'Engineering',\n              teams: [\n                { teamName: '', size: 0 }, // Default first entry\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'departments[0].name': 'Engineering',\n          'departments[0].teams[0].teamName': '', // Default\n          'departments[0].teams[0].size': 0, // Default\n        });\n      });\n\n      it('should fill leading gaps in nested object arrays', () => {\n        const flatSettings: ModSettings = {\n          'departments[2].name': 'Support',\n          'departments[2].teams[0].teamName': 'Tier1',\n          'departments[2].teams[0].size': 5,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          departments: [\n            { name: '', teams: [{ teamName: '', size: 0 }] },\n            { name: '', teams: [{ teamName: '', size: 0 }] },\n            { name: 'Support', teams: [{ teamName: 'Tier1', size: 5 }] },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'departments[0].name': '',\n          'departments[0].teams[0].teamName': '',\n          'departments[0].teams[0].size': 0,\n          'departments[1].name': '',\n          'departments[1].teams[0].teamName': '',\n          'departments[1].teams[0].size': 0,\n          'departments[2].name': 'Support',\n          'departments[2].teams[0].teamName': 'Tier1',\n          'departments[2].teams[0].size': 5,\n        });\n      });\n    });\n\n    describe('Triple-nested arrays', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'companies',\n          value: [\n            [\n              { key: 'companyName', value: 'Acme Inc' },\n              {\n                key: 'divisions',\n                value: [\n                  [\n                    { key: 'divisionName', value: 'North' },\n                    {\n                      key: 'projects',\n                      value: [\n                        [\n                          { key: 'projectName', value: 'Project X' },\n                          { key: 'budget', value: 1000 },\n                        ],\n                      ],\n                    },\n                  ],\n                ],\n              },\n            ],\n          ],\n        },\n      ];\n\n      it('should handle triple-nested arrays', () => {\n        const flatSettings: ModSettings = {\n          'companies[0].companyName': 'TechCorp',\n          'companies[0].divisions[0].divisionName': 'West',\n          'companies[0].divisions[0].projects[0].projectName': 'Alpha',\n          'companies[0].divisions[0].projects[0].budget': 5000,\n          'companies[0].divisions[0].projects[1].projectName': 'Beta',\n          'companies[0].divisions[0].projects[1].budget': 3000,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          companies: [\n            {\n              companyName: 'TechCorp',\n              divisions: [\n                {\n                  divisionName: 'West',\n                  projects: [\n                    { projectName: 'Alpha', budget: 5000 },\n                    { projectName: 'Beta', budget: 3000 },\n                  ],\n                },\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual(flatSettings);\n      });\n\n      it('should fill sparse arrays at all nesting levels', () => {\n        const flatSettings: ModSettings = {\n          'companies[0].companyName': 'TechCorp',\n          'companies[0].divisions[0].divisionName': 'West',\n          'companies[0].divisions[0].projects[0].projectName': 'Alpha',\n          'companies[0].divisions[0].projects[0].budget': 5000,\n          'companies[0].divisions[0].projects[2].projectName': 'Gamma', // Sparse\n          'companies[0].divisions[0].projects[2].budget': 2000,\n          'companies[0].divisions[2].divisionName': 'South', // Sparse at division level\n          'companies[0].divisions[2].projects[0].projectName': 'Delta',\n          'companies[0].divisions[2].projects[0].budget': 1000,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          companies: [\n            {\n              companyName: 'TechCorp',\n              divisions: [\n                {\n                  divisionName: 'West',\n                  projects: [\n                    { projectName: 'Alpha', budget: 5000 },\n                    { projectName: '', budget: 0 }, // Sparse index 1 filled\n                    { projectName: 'Gamma', budget: 2000 },\n                  ],\n                },\n                {\n                  divisionName: '', // Sparse division index 1 filled\n                  projects: [\n                    { projectName: '', budget: 0 },\n                  ],\n                },\n                {\n                  divisionName: 'South',\n                  projects: [\n                    { projectName: 'Delta', budget: 1000 },\n                  ],\n                },\n              ],\n            },\n          ],\n        });\n\n        const validator = new YamlSchemaValidator(initialSettings);\n        const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n        expect(result.error).toBeNull();\n        expect(result.settings).toEqual({\n          'companies[0].companyName': 'TechCorp',\n          'companies[0].divisions[0].divisionName': 'West',\n          'companies[0].divisions[0].projects[0].projectName': 'Alpha',\n          'companies[0].divisions[0].projects[0].budget': 5000,\n          'companies[0].divisions[0].projects[1].projectName': '', // Filled\n          'companies[0].divisions[0].projects[1].budget': 0, // Filled\n          'companies[0].divisions[0].projects[2].projectName': 'Gamma',\n          'companies[0].divisions[0].projects[2].budget': 2000,\n          'companies[0].divisions[1].divisionName': '', // Filled\n          'companies[0].divisions[1].projects[0].projectName': '', // Filled\n          'companies[0].divisions[1].projects[0].budget': 0, // Filled\n          'companies[0].divisions[2].divisionName': 'South',\n          'companies[0].divisions[2].projects[0].projectName': 'Delta',\n          'companies[0].divisions[2].projects[0].budget': 1000,\n        });\n      });\n    });\n  });\n\n  // ===== Array of Arrays Tests =====\n  // Note: Arrays of primitive arrays (number[][] or string[][]) are not supported by InitialSettings.\n  // Only arrays of objects (InitialSettings[]) are supported for nested arrays.\n\n  // ===== Complex Mixed Types Tests =====\n\n  describe('Complex mixed types', () => {\n    const initialSettings: InitialSettings = [\n      { key: 'enabled', value: true },\n      { key: 'tags', value: ['tag1', 'tag2'] },\n      {\n        key: 'users',\n        value: [\n          [\n            { key: 'name', value: 'user' },\n            { key: 'roles', value: ['admin', 'user'] },\n            {\n              key: 'permissions',\n              value: [\n                [\n                  { key: 'resource', value: 'file' },\n                  { key: 'actions', value: ['read', 'write'] },\n                ],\n              ],\n            },\n          ],\n        ],\n      },\n    ];\n\n    it('should handle complex mixed type structures', () => {\n      const flatSettings: ModSettings = {\n        enabled: 1,\n        'tags[0]': 'important',\n        'tags[1]': 'reviewed',\n        'users[0].name': 'alice',\n        'users[0].roles[0]': 'admin',\n        'users[0].roles[1]': 'developer',\n        'users[0].permissions[0].resource': 'database',\n        'users[0].permissions[0].actions[0]': 'read',\n        'users[0].permissions[0].actions[1]': 'write',\n        'users[0].permissions[1].resource': 'api',\n        'users[0].permissions[1].actions[0]': 'execute',\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n  });\n\n  // ===== Edge Cases Tests =====\n\n  describe('Edge cases', () => {\n    it('should handle empty settings', () => {\n      const initialSettings: InitialSettings = [];\n      const flatSettings: ModSettings = {};\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      expect(yamlText).toBe('');\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml('', validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual({});\n    });\n\n    it('should handle settings with only empty values', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'a', value: 0 },\n        { key: 'b', value: '' },\n      ];\n      const flatSettings: ModSettings = { a: 0, b: '' };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Empty values are kept in objects\n      expect(parsed).toEqual({\n        a: 0,\n        b: '',\n      });\n    });\n\n    it('should reject invalid YAML', () => {\n      const initialSettings: InitialSettings = [{ key: 'test', value: 1 }];\n      const validator = new YamlSchemaValidator(initialSettings);\n\n      const result = YamlConverter.fromYaml('invalid: [unclosed', validator, mockT);\n\n      expect(result.error).toContain('Parse error');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should reject non-object YAML root', () => {\n      const initialSettings: InitialSettings = [{ key: 'test', value: 1 }];\n      const validator = new YamlSchemaValidator(initialSettings);\n\n      const result = YamlConverter.fromYaml('- item1\\n- item2', validator, mockT);\n\n      expect(result.error).toContain('Invalid YAML structure');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should handle sparse arrays correctly', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'items', value: [1, 2, 3] },\n      ];\n      const flatSettings: ModSettings = {\n        'items[0]': 1,\n        'items[2]': 3,\n        'items[4]': 5,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      // Sparse array indices are filled with default values (0 for numbers)\n      expect(result.settings).toEqual({\n        'items[0]': 1,\n        'items[1]': 0, // Filled with default\n        'items[2]': 3,\n        'items[3]': 0, // Filled with default\n        'items[4]': 5,\n      });\n    });\n\n    it('should preserve order with extra keys not in schema', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'a', value: 1 },\n        { key: 'b', value: 2 },\n      ];\n      const flatSettings: ModSettings = {\n        a: 10,\n        z: 999, // Extra key not in schema\n        b: 20,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure\n      expect(parsed).toEqual({\n        a: 10,\n        b: 20,\n        z: 999,\n      });\n\n      // Schema keys (a, b) should come first in order\n      const lines = yamlText.split('\\n');\n      const aIndex = lines.findIndex(l => l.startsWith('a:'));\n      const bIndex = lines.findIndex(l => l.startsWith('b:'));\n      const zIndex = lines.findIndex(l => l.startsWith('z:'));\n\n      expect(aIndex).toBeLessThan(bIndex);\n      expect(bIndex).toBeLessThan(zIndex);\n    });\n\n    it('should use natural sort for extra keys with numbers', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'name', value: 'test' },\n      ];\n\n      // Extra keys with numbers - natural sort should order them correctly\n      const flatSettings: ModSettings = {\n        name: 'main',\n        'item10': 10,\n        'item2': 2,\n        'item1': 1,\n        'item20': 20,\n        'item3': 3,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure\n      expect(parsed).toEqual({\n        name: 'main',\n        item1: 1,\n        item2: 2,\n        item3: 3,\n        item10: 10,\n        item20: 20,\n      });\n\n      // Verify order in YAML: name (schema key) first, then extra keys in natural order\n      const lines = yamlText.split('\\n');\n      const nameIndex = lines.findIndex(l => l.startsWith('name:'));\n      const item1Index = lines.findIndex(l => l.startsWith('item1:'));\n      const item2Index = lines.findIndex(l => l.startsWith('item2:'));\n      const item3Index = lines.findIndex(l => l.startsWith('item3:'));\n      const item10Index = lines.findIndex(l => l.startsWith('item10:'));\n      const item20Index = lines.findIndex(l => l.startsWith('item20:'));\n\n      // Schema key first\n      expect(nameIndex).toBeLessThan(item1Index);\n\n      // Extra keys in natural order (not lexicographic: item1, item10, item2, item20, item3)\n      expect(item1Index).toBeLessThan(item2Index);\n      expect(item2Index).toBeLessThan(item3Index);\n      expect(item3Index).toBeLessThan(item10Index);\n      expect(item10Index).toBeLessThan(item20Index);\n    });\n\n    it('should reject null values', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'name', value: 'test' },\n        { key: 'count', value: 42 },\n      ];\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'name: null\\ncount: 100';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).not.toBeNull();\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should reject boolean arrays', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'flags', value: [1, 2, 3] },\n      ];\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'flags:\\n  - true\\n  - false\\n  - true';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).not.toBeNull();\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n\n    it('should reject nested null values', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'database',\n          value: [\n            { key: 'host', value: 'localhost' },\n            { key: 'port', value: 5432 },\n          ],\n        },\n      ];\n      const validator = new YamlSchemaValidator(initialSettings);\n      const yamlText = 'database:\\n  host: example.com\\n  port: null';\n\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).not.toBeNull();\n      expect(result.error).toContain('Type mismatch');\n      expect(result.settings).toBeNull();\n    });\n  });\n\n  // ===== Real-world Complex Example =====\n\n  describe('Real-world example: VS Code-like settings', () => {\n    const initialSettings: InitialSettings = [\n      {\n        key: 'workbench',\n        value: [\n          { key: 'colorTheme', value: 'dark' },\n        ],\n      },\n      {\n        key: 'editor',\n        value: [\n          { key: 'fontSize', value: 14 },\n          { key: 'lineHeight', value: 20 },\n        ],\n      },\n      {\n        key: 'files',\n        value: [\n          {\n            key: 'associations',\n            value: [\n              [\n                { key: 'pattern', value: '*.config' },\n                { key: 'language', value: 'json' },\n              ],\n            ],\n          },\n        ],\n      },\n      {\n        key: 'search',\n        value: [\n          {\n            key: 'exclude',\n            value: ['**/node_modules', '**/dist'],\n          },\n        ],\n      },\n    ];\n\n    it('should handle real-world settings round-trip', () => {\n      const flatSettings: ModSettings = {\n        'workbench.colorTheme': 'light',\n        'editor.fontSize': 16,\n        'editor.lineHeight': 24,\n        'files.associations[0].pattern': '*.tsx',\n        'files.associations[0].language': 'typescriptreact',\n        'files.associations[1].pattern': '*.md',\n        'files.associations[1].language': 'markdown',\n        'search.exclude[0]': '**/build',\n        'search.exclude[1]': '**/.git',\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure\n      expect(parsed).toEqual({\n        workbench: {\n          colorTheme: 'light',\n        },\n        editor: {\n          fontSize: 16,\n          lineHeight: 24,\n        },\n        files: {\n          associations: [\n            { pattern: '*.tsx', language: 'typescriptreact' },\n            { pattern: '*.md', language: 'markdown' },\n          ],\n        },\n        search: {\n          exclude: ['**/build', '**/.git'],\n        },\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n  });\n\n  // ===== Array Ordering Tests =====\n\n  describe('Array element ordering', () => {\n    const initialSettings: InitialSettings = [\n      {\n        key: 'items',\n        value: [\n          [\n            { key: 'x', value: 1 },\n            { key: 'y', value: 2 },\n            { key: 'z', value: 3 },\n          ],\n        ],\n      },\n    ];\n\n    it('should maintain consistent order for array elements', () => {\n      const flatSettings: ModSettings = {\n        'items[1].z': 30,\n        'items[0].y': 20,\n        'items[1].x': 10,\n        'items[0].z': 3,\n        'items[1].y': 2,\n        'items[0].x': 1,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure\n      expect(parsed).toEqual({\n        items: [\n          { x: 1, y: 20, z: 3 },\n          { x: 10, y: 2, z: 30 },\n        ],\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n\n      // Verify ordering in YAML - the keys should appear in schema order (x, y, z)\n      // Keys may be quoted ('y':) or unquoted (x:)\n      const xPos = Math.max(yamlText.indexOf('x:'), yamlText.indexOf(\"'x':\"));\n      const yPos = Math.max(yamlText.indexOf('y:'), yamlText.indexOf(\"'y':\"));\n      const zPos = Math.max(yamlText.indexOf('z:'), yamlText.indexOf(\"'z':\"));\n\n      // All keys should exist and be in order\n      expect(xPos).toBeGreaterThanOrEqual(0);\n      expect(yPos).toBeGreaterThanOrEqual(0);\n      expect(zPos).toBeGreaterThanOrEqual(0);\n      expect(xPos).toBeLessThan(yPos);\n      expect(yPos).toBeLessThan(zPos);\n    });\n\n    it('should properly sort two-digit array indexes', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'values',\n          value: [1, 2, 3],\n        },\n      ];\n\n      // Create flat settings with sequential indexes 0-11 to get two-digit indexes in result\n      const flatSettings: ModSettings = {\n        'values[0]': 0,\n        'values[1]': 10,\n        'values[2]': 20,\n        'values[3]': 30,\n        'values[4]': 40,\n        'values[5]': 50,\n        'values[6]': 60,\n        'values[7]': 70,\n        'values[8]': 80,\n        'values[9]': 90,\n        'values[10]': 100,\n        'values[11]': 110,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the array is properly ordered with all values including two-digit indexes\n      expect(parsed).toEqual({\n        values: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110],\n      });\n\n      // Verify round-trip maintains all indexes including two-digit ones\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n\n      // Verify the YAML has indexes in correct numeric order\n      const lines = yamlText.split('\\n');\n      const indexLines = lines\n        .map((line, idx) => ({ line, idx }))\n        .filter(({ line }) => line.match(/^\\s*-\\s+\\d+$/))\n        .map(({ line, idx }) => ({ value: parseInt(line.trim().slice(2)), lineIdx: idx }));\n\n      // Check that line indexes are in ascending order (which means array indexes are too)\n      for (let i = 1; i < indexLines.length; i++) {\n        expect(indexLines[i].lineIdx).toBeGreaterThan(indexLines[i - 1].lineIdx);\n        expect(indexLines[i].value).toBeGreaterThan(indexLines[i - 1].value);\n      }\n    });\n\n    it('should preserve order when array starts at non-zero index', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'w', value: 1 },\n        {\n          key: 'x',\n          value: [\n            [\n              { key: 'a', value: 'test' },\n              { key: 'b', value: 42 },\n            ],\n          ],\n        },\n        { key: 'y', value: [10, 20] },\n        { key: 'z', value: 2 },\n      ];\n\n      // Array starts at index [1] instead of [0]\n      const flatSettings: ModSettings = {\n        w: 100,\n        'x[1].a': 'hello',\n        'x[1].b': 50,\n        'x[2].a': 'world',\n        'y[1]': 200,\n        'y[2]': 300,\n        z: 400,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify structure (sparse arrays get filled with defaults)\n      expect(parsed).toEqual({\n        w: 100,\n        x: [\n          { a: '', b: 0 }, // Default values for missing x[0]\n          { a: 'hello', b: 50 },\n          { a: 'world', b: 0 }, // Default value for missing b in x[2]\n        ],\n        y: [0, 200, 300], // Default value for missing y[0]\n        z: 400,\n      });\n\n      // Verify order in YAML: w, x, y, z (schema order preserved even with non-zero array start)\n      const wPos = yamlText.indexOf('w:');\n      const xPos = Math.max(yamlText.indexOf('x:'), yamlText.indexOf(\"'x':\"));\n      const yPos = Math.max(yamlText.indexOf('y:'), yamlText.indexOf(\"'y':\"));\n      const zPos = yamlText.indexOf('z:');\n\n      expect(wPos).toBeGreaterThan(-1);\n      expect(xPos).toBeGreaterThan(-1);\n      expect(yPos).toBeGreaterThan(-1);\n      expect(zPos).toBeGreaterThan(-1);\n\n      // Schema order should be preserved: w, then x, then y, then z\n      expect(wPos).toBeLessThan(xPos);\n      expect(xPos).toBeLessThan(yPos);\n      expect(yPos).toBeLessThan(zPos);\n    });\n  });\n\n  // ===== Conflicting Key Types Tests =====\n\n  describe('Conflicting key types (array vs object)', () => {\n    it('should handle mixed array/object notation by treating object path as invalid', () => {\n      // Schema defines 'profiles' as an array of objects\n      const initialSettings: InitialSettings = [\n        {\n          key: 'config',\n          value: [\n            {\n              key: 'profiles',\n              value: [\n                [\n                  { key: 'name', value: 'default' },\n                ],\n              ],\n            },\n          ],\n        },\n      ];\n\n      // Flat settings mixing array and object access\n      const flatSettings: ModSettings = {\n        'config.profiles[0].name': 'production',\n        'config.profiles.theme': 'light', // Invalid - profiles is an array\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // toYaml only includes valid keys based on schema\n      // config.profiles.theme is not in schema, so it won't be in YAML\n      expect(parsed).toEqual({\n        config: {\n          profiles: [\n            { name: 'production' },\n          ],\n        },\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      // YAML only has valid structure, so validation passes\n      expect(result.error).toBeNull();\n      expect(result.settings).not.toBeNull();\n    });\n\n    it('should handle mixed array/object notation by treating object path as invalid', () => {\n      // Schema defines 'profiles' as an array of objects\n      const initialSettings: InitialSettings = [\n        {\n          key: 'config',\n          value: [\n            {\n              key: 'profiles',\n              value: [\n                [\n                  { key: 'name', value: 'default' },\n                ],\n              ],\n            },\n          ],\n        },\n      ];\n\n      // Flat settings mixing array and object access\n      const flatSettings: ModSettings = {\n        'config.profiles.theme': 'light', // Invalid - profiles is an array\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // toYaml only includes valid keys based on schema\n      // config.profiles.theme is not in schema, so it won't be in YAML\n      // But arrays in schema get default first entry\n      expect(parsed).toEqual({\n        config: {\n          profiles: [\n            { name: '' }, // Default first entry\n          ],\n        },\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      // YAML only has valid structure, so validation passes\n      expect(result.error).toBeNull();\n      expect(result.settings).not.toBeNull();\n    });\n\n    it('should handle mixed object/array notation by treating array path as invalid', () => {\n      // Schema defines 'settings' as an object (not an array)\n      const initialSettings: InitialSettings = [\n        {\n          key: 'config',\n          value: [\n            {\n              key: 'settings',\n              value: [\n                { key: 'theme', value: 'dark' },\n                { key: 'fontSize', value: 14 },\n              ],\n            },\n          ],\n        },\n      ];\n\n      // Flat settings mixing object and array access\n      const flatSettings: ModSettings = {\n        'config.settings.theme': 'light',\n        'config.settings[0].name': 'invalid', // Invalid - settings is an object, not an array\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // toYaml now filters out keys that don't match schema structure\n      // config.settings[0].name is filtered because settings is an object in schema\n      // Schema keys get default values (0 for fontSize since it's not in flatSettings)\n      expect(parsed).toEqual({\n        config: {\n          settings: {\n            theme: 'light',\n            fontSize: 0, // Default value for schema key not in flatSettings\n          },\n        },\n      });\n\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      // YAML only has valid structure, so validation passes\n      // Default values are included for all schema keys\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual({\n        'config.settings.theme': 'light',\n        'config.settings.fontSize': 0, // Default value added\n      });\n    });\n  });\n\n  // ===== Numeric Keys Tests =====\n\n  describe('Numeric keys', () => {\n    it('should handle numeric property keys at root level', () => {\n      const initialSettings: InitialSettings = [\n        { key: 'name', value: 'test' },\n        { key: '100', value: 42 },\n        { key: 'enabled', value: true },\n      ];\n\n      const flatSettings: ModSettings = {\n        name: 'myname',\n        '100': 999,\n        enabled: 1,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure (numeric keys work at root level)\n      expect(parsed).toEqual({\n        name: 'myname',\n        100: 999,\n        enabled: 1,\n      });\n\n      // Note: JavaScript automatically sorts numeric keys first, so schema order cannot be preserved\n      // for numeric keys. The YAML will have '100' first, then 'name', then 'enabled'.\n      // This is a known limitation due to JavaScript's object key ordering rules.\n\n      // Verify round-trip works correctly (order doesn't affect functionality)\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should handle numeric keys in nested objects', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'config',\n          value: [\n            { key: 'name', value: 'test' },\n            { key: '42', value: 100 },\n            { key: 'count', value: 5 },\n          ],\n        },\n      ];\n\n      const flatSettings: ModSettings = {\n        'config.name': 'myconfig',\n        'config.42': 888,\n        'config.count': 10,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure - numeric property keys work in nested objects\n      expect(parsed).toEqual({\n        config: {\n          name: 'myconfig',\n          42: 888,\n          count: 10,\n        },\n      });\n\n      // Verify round-trip works correctly\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n\n    it('should handle keys with numeric prefixes', () => {\n      const initialSettings: InitialSettings = [\n        {\n          key: 'config',\n          value: [\n            { key: 'name', value: 'test' },\n            { key: 'port80', value: 100 },\n            { key: 'count', value: 5 },\n          ],\n        },\n      ];\n\n      const flatSettings: ModSettings = {\n        'config.name': 'myconfig',\n        'config.port80': 888,\n        'config.count': 10,\n      };\n\n      const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n      const parsed = parseYaml(yamlText);\n\n      // Verify the structure - keys with numeric suffixes work fine\n      expect(parsed).toEqual({\n        config: {\n          name: 'myconfig',\n          port80: 888,\n          count: 10,\n        },\n      });\n\n      // Verify round-trip works correctly\n      const validator = new YamlSchemaValidator(initialSettings);\n      const result = YamlConverter.fromYaml(yamlText, validator, mockT);\n\n      expect(result.error).toBeNull();\n      expect(result.settings).toEqual(flatSettings);\n    });\n  });\n\n  describe('Empty value handling (removeEmptyValues)', () => {\n    describe('Primitive empty values', () => {\n      it('should keep empty strings in objects', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'name', value: 'test' },\n          { key: 'description', value: 'desc' },\n        ];\n\n        const flatSettings: ModSettings = {\n          'name': 'John',\n          'description': '', // Empty string kept in objects\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          name: 'John',\n          description: '', // Empty strings are kept\n        });\n      });\n\n      it('should keep zero values in objects', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'count', value: 10 },\n          { key: 'size', value: 20 },\n        ];\n\n        const flatSettings: ModSettings = {\n          'count': 5,\n          'size': 0, // Zero kept in objects\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          count: 5,\n          size: 0, // Zeros are kept\n        });\n      });\n\n      it('should keep non-empty values', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'name', value: 'test' },\n          { key: 'count', value: 10 },\n        ];\n\n        const flatSettings: ModSettings = {\n          'name': 'John',\n          'count': 42,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          name: 'John',\n          count: 42,\n        });\n      });\n    });\n\n    describe('Arrays with empty values', () => {\n      it('should remove trailing empty values from primitive arrays', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'numbers', value: [1, 2, 3] },\n        ];\n\n        const flatSettings: ModSettings = {\n          'numbers[0]': 5,\n          'numbers[1]': 10,\n          'numbers[2]': 0, // Trailing zero should be removed\n          'numbers[3]': 0, // Trailing zero should be removed\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          numbers: [5, 10],\n        });\n      });\n\n      it('should keep empty values in the middle of arrays', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'numbers', value: [1, 2, 3] },\n        ];\n\n        const flatSettings: ModSettings = {\n          'numbers[0]': 5,\n          'numbers[1]': 0, // Zero in middle should be kept\n          'numbers[2]': 10,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          numbers: [5, 0, 10],\n        });\n      });\n\n      it('should remove trailing empty strings from string arrays', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'tags', value: ['a', 'b'] },\n        ];\n\n        const flatSettings: ModSettings = {\n          'tags[0]': 'foo',\n          'tags[1]': 'bar',\n          'tags[2]': '', // Trailing empty string\n          'tags[3]': '', // Trailing empty string\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          tags: ['foo', 'bar'],\n        });\n      });\n\n      it('should keep empty strings in the middle of arrays', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'tags', value: ['a', 'b'] },\n        ];\n\n        const flatSettings: ModSettings = {\n          'tags[0]': 'foo',\n          'tags[1]': '', // Empty in middle\n          'tags[2]': 'bar',\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          tags: ['foo', '', 'bar'],\n        });\n      });\n    });\n\n    describe('Objects with empty values', () => {\n      it('should keep empty properties in nested objects', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'person',\n            value: [\n              { key: 'name', value: 'test' },\n              { key: 'age', value: 0 },\n              { key: 'email', value: '' },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'person.name': 'John',\n          'person.age': 0, // Kept in objects\n          'person.email': '', // Kept in objects\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          person: {\n            name: 'John',\n            age: 0,\n            email: '',\n          },\n        });\n      });\n\n      it('should keep nested objects even if they only contain empty values', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'config',\n            value: [\n              { key: 'name', value: 'test' },\n              {\n                key: 'settings',\n                value: [\n                  { key: 'enabled', value: false },\n                ],\n              },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'config.name': 'test',\n          'config.settings.enabled': 0, // Empty value kept in object\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          config: {\n            name: 'test',\n            settings: {\n              enabled: 0, // Empty values kept in objects\n            },\n          },\n        });\n      });\n\n      it('should keep nested objects with at least one non-empty value', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'config',\n            value: [\n              {\n                key: 'settings',\n                value: [\n                  { key: 'enabled', value: false },\n                  { key: 'count', value: 0 },\n                ],\n              },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'config.settings.enabled': 1,\n          'config.settings.count': 0, // Kept in objects\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          config: {\n            settings: {\n              enabled: 1,\n              count: 0, // Empty values kept\n            },\n          },\n        });\n      });\n    });\n\n    describe('Arrays of objects with empty values', () => {\n      it('should keep empty properties in objects in arrays', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'users',\n            value: [\n              [\n                { key: 'name', value: 'test' },\n                { key: 'email', value: '' },\n              ],\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'users[0].name': 'Alice',\n          'users[0].email': '', // Kept in objects\n          'users[1].name': 'Bob',\n          'users[1].email': 'bob@test.com',\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          users: [\n            { name: 'Alice', email: '' },\n            { name: 'Bob', email: 'bob@test.com' },\n          ],\n        });\n      });\n\n      it('should remove trailing empty objects from arrays', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'items',\n            value: [\n              [\n                { key: 'name', value: 'test' },\n                { key: 'count', value: 0 },\n              ],\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'items[0].name': 'Item1',\n          'items[0].count': 5,\n          'items[1].name': '', // Empty object (all properties empty)\n          'items[1].count': 0,  // Empty object (all properties empty)\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          items: [\n            { name: 'Item1', count: 5 },\n            // Empty object removed from trailing position\n          ],\n        });\n      });\n\n      it('should keep empty objects in the middle of arrays', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'items',\n            value: [\n              [\n                { key: 'name', value: 'test' },\n              ],\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'items[0].name': 'Item1',\n          'items[1].name': '', // Empty object in middle\n          'items[2].name': 'Item3',\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        // Empty object in middle is kept with its properties\n        expect(parsed).toEqual({\n          items: [\n            { name: 'Item1' },\n            { name: '' }, // Empty value kept in object\n            { name: 'Item3' },\n          ],\n        });\n      });\n    });\n\n    describe('Deeply nested structures with empty values', () => {\n      it('should keep deeply nested empty values in objects', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'root',\n            value: [\n              {\n                key: 'level1',\n                value: [\n                  {\n                    key: 'level2',\n                    value: [\n                      { key: 'value1', value: 'test' },\n                      { key: 'value2', value: '' },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'root.level1.level2.value1': 'data',\n          'root.level1.level2.value2': '', // Deep empty value\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          root: {\n            level1: {\n              level2: {\n                value1: 'data',\n                value2: '', // Empty values kept in objects\n              },\n            },\n          },\n        });\n      });\n\n      it('should keep nested objects even if they contain only empty values', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'config',\n            value: [\n              { key: 'name', value: 'test' },\n              {\n                key: 'nested',\n                value: [\n                  { key: 'item', value: '' },\n                ],\n              },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'config.name': 'MyConfig',\n          'config.nested.item': '', // Only value in nested is empty\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          config: {\n            name: 'MyConfig',\n            nested: {\n              item: '', // Empty values kept in objects\n            },\n          },\n        });\n      });\n\n      it('should handle arrays nested in objects nested in arrays', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'groups',\n            value: [\n              [\n                { key: 'name', value: 'test' },\n                { key: 'items', value: ['a', 'b'] },\n              ],\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'groups[0].name': 'Group1',\n          'groups[0].items[0]': 'item1',\n          'groups[0].items[1]': '', // Trailing empty\n          'groups[0].items[2]': '', // Trailing empty\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          groups: [\n            {\n              name: 'Group1',\n              items: ['item1'], // Trailing empty values removed\n            },\n          ],\n        });\n      });\n    });\n\n    describe('Edge cases', () => {\n      it('should keep completely empty structures in objects', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'name', value: '' },\n          { key: 'count', value: 0 },\n        ];\n\n        const flatSettings: ModSettings = {\n          'name': '',\n          'count': 0,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        // Empty values are kept in objects\n        expect(parsed).toEqual({\n          name: '',\n          count: 0,\n        });\n      });\n\n      it('should remove array with all trailing empty values (keep first)', () => {\n        const initialSettings: InitialSettings = [\n          { key: 'numbers', value: [1, 2, 3] },\n        ];\n\n        const flatSettings: ModSettings = {\n          'numbers[0]': 0,\n          'numbers[1]': 0,\n          'numbers[2]': 0,\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        // Array keeps first element only (skips index 0 when trimming)\n        expect(parsed).toEqual({\n          numbers: [0],\n        });\n      });\n\n      it('should handle mixed empty and non-empty in complex structure', () => {\n        const initialSettings: InitialSettings = [\n          {\n            key: 'data',\n            value: [\n              { key: 'active', value: true },\n              { key: 'items', value: ['a', 'b'] },\n              {\n                key: 'config',\n                value: [\n                  { key: 'enabled', value: false },\n                  { key: 'count', value: 0 },\n                ],\n              },\n            ],\n          },\n        ];\n\n        const flatSettings: ModSettings = {\n          'data.active': 1,\n          'data.items[0]': 'first',\n          'data.items[1]': '', // Trailing\n          'data.config.enabled': 0, // Empty\n          'data.config.count': 0,   // Empty\n        };\n\n        const yamlText = YamlConverter.toYaml(flatSettings, initialSettings);\n        const parsed = parseYaml(yamlText);\n\n        expect(parsed).toEqual({\n          data: {\n            active: 1,\n            items: ['first'], // Trailing empty removed from array\n            config: { // Empty values kept in objects\n              enabled: 0,\n              count: 0,\n            },\n          },\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.tsx",
    "content": "import { faCaretDown } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Editor, { loader } from '@monaco-editor/react';\nimport { Button, Card, ConfigProvider, List, message, Modal, Select, Switch } from 'antd';\nimport * as yaml from 'js-yaml';\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useBlocker } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { useEventListener } from 'usehooks-ts';\nimport { DropdownModal, dropdownModalDismissed, InputNumberWithContextMenu, InputWithContextMenu, SelectModal } from '../components/InputWithContextMenu';\nimport { useGetModSettings, useSetModSettings } from '../webviewIPC';\nimport {\n  InitialSettings,\n  InitialSettingItem,\n  InitialSettingsValue,\n  InitialSettingsArrayValue,\n} from '../webviewIPCMessages';\nimport { mockModSettings } from './mockData';\n\n// Configure Monaco Editor to use local npm package instead of CDN.\nloader.config({ monaco });\n\nconst SettingsWrapper = styled.div`\n  // If an object list (with split={false}) is nested inside an array list (without split={false}),\n  // the array list's CSS is applied to the object list's CSS, forcing the split style.\n  // This CSS rule explicitly removes the split from object lists.\n  .ant-list:not(.ant-list-split) > div > div > ul > li.ant-list-item {\n    border-bottom: none;\n  }\n\n  padding-top: 12px;\n  padding-bottom: 12px;\n`;\n\nconst SettingInputNumber = styled(InputNumberWithContextMenu)`\n  width: 100%;\n  max-width: 130px;\n\n  // Remove default VSCode focus highlighting color.\n  input:focus {\n    outline: none !important;\n  }\n`;\n\nconst SettingSelect = styled(SelectModal)`\n  width: 100%;\n`;\n\nconst SettingsCard = styled(Card)`\n  width: 100%;\n`;\n\nconst ArraySettingsItemWrapper = styled.div`\n  display: flex;\n  gap: 12px;\n`;\n\nconst ArraySettingsDropdownOptionsButton = styled(Button)`\n  padding-inline-start: 10px;\n  padding-inline-end: 10px;\n`;\n\nconst SettingsListItem = styled(List.Item)`\n  &:first-child {\n    padding-top: 0;\n  }\n\n  &:last-child {\n    padding-bottom: 0;\n  }\n`;\n\nconst SettingsListItemMeta = styled(List.Item.Meta)`\n  .ant-list-item-meta {\n    margin-bottom: 8px;\n  }\n\n  .ant-list-item-meta-title {\n    margin-bottom: 0;\n  }\n\n  .ant-list-item-meta-description {\n    white-space: pre-line;\n  }\n`;\n\nconst SaveSettingsCard = styled(Card)`\n  position: sticky;\n  top: 0;\n  z-index: 1;\n  margin-inline-start: -12px;\n  margin-inline-end: -12px;\n  margin-top: -12px;\n`;\n\nconst ActionButtonsWrapper = styled.div`\n  display: flex;\n  gap: 12px;\n`;\n\nconst YamlEditorWrapper = styled.div`\n  direction: ltr;\n  margin-top: 12px;\n`;\n\nconst YamlErrorContent = styled.div`\n  display: inline-block;\n  text-align: start;\n  font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n  white-space: pre-wrap;\n`;\n\ntype ModSettings = Record<string, string | number>;\n\ntype NestedValue = string | number | NestedSettings | (string | number | NestedSettings)[];\n\ninterface NestedSettings {\n  [key: string]: NestedValue;\n}\n\ntype InitialSettingItemExtra = {\n  options?: Record<string, string>[];\n};\n\nenum SettingType {\n  Boolean = 'boolean',\n  Number = 'number',\n  String = 'string',\n  NestedObject = 'nested-object',\n  NumberArray = 'number-array',\n  StringArray = 'string-array',\n  ObjectArray = 'object-array',\n}\n\ntype BooleanDescriptor = {\n  kind: SettingType.Boolean;\n  value: boolean;\n  defaultValue: number;\n};\n\ntype NumberDescriptor = {\n  kind: SettingType.Number;\n  value: number;\n  defaultValue: number;\n};\n\ntype StringDescriptor = {\n  kind: SettingType.String;\n  value: string;\n  defaultValue: string;\n};\n\ntype NestedDescriptor = {\n  kind: SettingType.NestedObject;\n  value: InitialSettings;\n  children: InitialSettings;\n};\n\ntype NumberArrayDescriptor = {\n  kind: SettingType.NumberArray;\n  value: number[];\n  defaultValue: number;\n};\n\ntype StringArrayDescriptor = {\n  kind: SettingType.StringArray;\n  value: string[];\n  defaultValue: string;\n};\n\ntype ObjectArrayDescriptor = {\n  kind: SettingType.ObjectArray;\n  value: InitialSettings[];\n  children: InitialSettings;\n};\n\ntype SettingDescriptor =\n  | BooleanDescriptor\n  | NumberDescriptor\n  | StringDescriptor\n  | NestedDescriptor\n  | NumberArrayDescriptor\n  | StringArrayDescriptor\n  | ObjectArrayDescriptor;\n\nfunction isInitialSettingItem(value: unknown): value is InitialSettingItem {\n  if (typeof value !== 'object' || value === null) {\n    return false;\n  }\n\n  const record = value as Record<string, unknown>;\n  return typeof record['key'] === 'string' && 'value' in record;\n}\n\nfunction isInitialSettingsArray(value: unknown): value is InitialSettings {\n  return Array.isArray(value) && value.every(isInitialSettingItem);\n}\n\nfunction isInitialSettingsCollection(value: unknown[]): value is InitialSettings[] {\n  return value.every(isInitialSettingsArray);\n}\n\nfunction isNumberArrayValue(value: unknown[]): value is number[] {\n  return value.every(item => typeof item === 'number');\n}\n\nfunction isStringArrayValue(value: unknown[]): value is string[] {\n  return value.every(item => typeof item === 'string');\n}\n\nfunction describeSetting(value: InitialSettingsValue): SettingDescriptor {\n  if (typeof value === 'boolean') {\n    return { kind: SettingType.Boolean, value, defaultValue: 0 };\n  }\n\n  if (typeof value === 'number') {\n    return { kind: SettingType.Number, value, defaultValue: 0 };\n  }\n\n  if (typeof value === 'string') {\n    return { kind: SettingType.String, value, defaultValue: '' };\n  }\n\n  if (!Array.isArray(value) || value.length === 0) {\n    throw new Error('Initial settings arrays must contain at least one template entry.');\n  }\n\n  const arrayValue: unknown[] = value;\n\n  if (isInitialSettingsCollection(arrayValue)) {\n    const [first] = arrayValue;\n    if (first.length === 0) {\n      throw new Error('Invalid object array schema definition.');\n    }\n    return { kind: SettingType.ObjectArray, value: arrayValue, children: first };\n  }\n\n  if (isInitialSettingsArray(arrayValue)) {\n    return { kind: SettingType.NestedObject, value: arrayValue, children: arrayValue };\n  }\n\n  if (isNumberArrayValue(arrayValue)) {\n    return { kind: SettingType.NumberArray, value: arrayValue, defaultValue: 0 };\n  }\n\n  if (isStringArrayValue(arrayValue)) {\n    return { kind: SettingType.StringArray, value: arrayValue, defaultValue: '' };\n  }\n\n  throw new Error(`Unknown setting type for value: ${JSON.stringify(value)}`);\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction parseIntLax(value?: string | number | null) {\n  const result = parseInt((value ?? 0).toString(), 10);\n  return Number.isNaN(result) ? 0 : result;\n}\n\n/**\n * Formats a YAML error message for display in Ant Design message component.\n * Handles multiline error messages by rendering each line separately.\n */\nfunction formatYamlError(error: string): React.ReactNode {\n  const lines = error.split('\\n');\n  return (\n    <YamlErrorContent>\n      {lines.map((line, index) => (\n        <span key={index}>\n          {line}\n          {index < lines.length - 1 && <br />}\n        </span>\n      ))}\n    </YamlErrorContent>\n  );\n}\n\n// ============================================================================\n// YAML Schema Validation\n// ============================================================================\n\ninterface TypeMismatchError {\n  key: string;\n  expected: string;\n  actual: string;\n}\n\n/**\n * Helper to check if a value is a plain object (not array, not null)\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toNestedSettings(value: unknown): NestedSettings {\n  return isPlainObject(value) ? (value as NestedSettings) : {};\n}\n\n/**\n * Natural sort comparator for strings with numbers.\n * Compares strings such that \"item2\" comes before \"item10\".\n */\nfunction naturalSort(a: string, b: string): number {\n  return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n}\n\nclass YamlSchemaValidator {\n  private validKeys: Set<string>;\n  private typeSchema: Map<string, string>;\n\n  constructor(initialSettings: InitialSettings) {\n    this.validKeys = this.buildValidKeys(initialSettings);\n    this.typeSchema = this.buildTypeSchema(initialSettings);\n  }\n\n  private buildValidKeys(settings: InitialSettings, prefix = ''): Set<string> {\n    const keys = new Set<string>();\n\n    for (const item of settings) {\n      const key = prefix ? `${prefix}.${item.key}` : item.key;\n      keys.add(key);\n\n      const descriptor = describeSetting(item.value);\n\n      if (descriptor.kind === SettingType.NestedObject || descriptor.kind === SettingType.ObjectArray) {\n        const nestedKeys = this.buildValidKeys(descriptor.children, key);\n        nestedKeys.forEach(nestedKey => keys.add(nestedKey));\n      }\n    }\n\n    return keys;\n  }\n\n  private buildTypeSchema(settings: InitialSettings, prefix = ''): Map<string, string> {\n    const schema = new Map<string, string>();\n\n    for (const item of settings) {\n      const key = prefix ? `${prefix}.${item.key}` : item.key;\n      const descriptor = describeSetting(item.value);\n\n      switch (descriptor.kind) {\n        case SettingType.Boolean:\n        case SettingType.Number:\n          schema.set(key, 'number');\n          break;\n        case SettingType.String:\n          schema.set(key, 'string');\n          break;\n        case SettingType.NestedObject:\n        case SettingType.ObjectArray: {\n          const nestedSchema = this.buildTypeSchema(descriptor.children, key);\n          nestedSchema.forEach((type, nestedKey) => schema.set(nestedKey, type));\n          break;\n        }\n        case SettingType.NumberArray:\n          schema.set(key, 'number[]');\n          break;\n        case SettingType.StringArray:\n          schema.set(key, 'string[]');\n          break;\n      }\n    }\n\n    return schema;\n  }\n\n  validateKeys(nested: NestedSettings, prefix = ''): string | null {\n    for (const [key, value] of Object.entries(nested)) {\n      const fullKey = prefix ? `${prefix}.${key}` : key;\n\n      // Check validity for this key first\n      if (!this.validKeys.has(fullKey)) {\n        return fullKey;\n      }\n\n      // Then recurse into nested structures\n      if (Array.isArray(value)) {\n        for (const item of value) {\n          if (isPlainObject(item)) {\n            const invalidKey = this.validateKeys(item, fullKey);\n            if (invalidKey) {\n              return invalidKey;\n            }\n          }\n        }\n      } else if (isPlainObject(value)) {\n        const invalidKey = this.validateKeys(value, fullKey);\n        if (invalidKey) {\n          return invalidKey;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  validateTypes(nested: NestedSettings, prefix = ''): TypeMismatchError | null {\n    for (const [key, value] of Object.entries(nested)) {\n      const fullKey = prefix ? `${prefix}.${key}` : key;\n      const expectedType = this.typeSchema.get(fullKey);\n\n      if (expectedType) {\n        const error = this.validateValue(fullKey, value, expectedType);\n        if (error) return error;\n      } else {\n        // Even if key is not in schema, recurse into nested structures\n        if (Array.isArray(value)) {\n          for (const item of value) {\n            if (isPlainObject(item)) {\n              const error = this.validateTypes(item, fullKey);\n              if (error) return error;\n            }\n          }\n        } else if (isPlainObject(value)) {\n          const error = this.validateTypes(value, fullKey);\n          if (error) return error;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  private validateValue(\n    fullKey: string,\n    value: NestedValue,\n    expectedType: string\n  ): TypeMismatchError | null {\n    const actualType = this.getActualType(value);\n\n    // Handle array types\n    if (expectedType.endsWith('[]')) {\n      if (!Array.isArray(value)) {\n        return { key: fullKey, expected: 'array', actual: actualType };\n      }\n      return this.validateArrayElements(fullKey, value, expectedType);\n    }\n\n    // Handle primitive types\n    if (expectedType !== actualType) {\n      return { key: fullKey, expected: expectedType, actual: actualType };\n    }\n\n    // Handle nested objects\n    if (isPlainObject(value)) {\n      return this.validateTypes(value, fullKey);\n    }\n\n    return null;\n  }\n\n  private getActualType(value: NestedValue): string {\n    if (Array.isArray(value)) return 'array';\n    return typeof value;\n  }\n\n  private validateArrayElements(\n    fullKey: string,\n    array: NestedValue[],\n    expectedType: string\n  ): TypeMismatchError | null {\n    const elementType = expectedType.replace('[]', '');\n\n    for (let i = 0; i < array.length; i++) {\n      const item = array[i];\n      const itemKey = `${fullKey}[${i}]`;\n      const actualType = this.getActualType(item);\n\n      if (elementType === 'object') {\n        if (!isPlainObject(item)) {\n          return { key: itemKey, expected: 'object', actual: actualType };\n        }\n        const typeError = this.validateTypes(item, fullKey);\n        if (typeError) return typeError;\n      } else if (elementType !== actualType) {\n        return { key: itemKey, expected: elementType, actual: actualType };\n      }\n    }\n\n    return null;\n  }\n}\n\n// ============================================================================\n// YAML Conversion Utilities\n// ============================================================================\n\nclass YamlConverter {\n  static flatToNested(flatSettings: ModSettings, initialSettings: InitialSettings): NestedSettings {\n    const nested: NestedSettings = {};\n    const keysToProcess = Object.keys(flatSettings);\n\n    // Filter keys to only include those that match the schema structure\n    const validKeys = keysToProcess.filter(key => this.keyMatchesSchemaStructure(key, initialSettings));\n\n    for (const key of validKeys) {\n      this.setNestedValue(nested, key, flatSettings[key]);\n    }\n\n    return this.normalizeWithSchema(nested, initialSettings);\n  }\n\n  /**\n   * Check if a key path matches the schema structure.\n   * Returns false if:\n   * - Key uses array notation [index] where schema defines an object\n   * - Key uses object notation .property where schema defines an array\n   */\n  private static keyMatchesSchemaStructure(key: string, initialSettings: InitialSettings): boolean {\n    const parts = this.parseKeyPath(key);\n    let currentSettings = initialSettings;\n\n    for (let i = 0; i < parts.length; i++) {\n      const { part, index } = parts[i];\n\n      // Find the setting that matches this part\n      const setting = currentSettings.find(s => s.key === part);\n\n      if (!setting) {\n        // Key not in schema - let validation handle it\n        return true;\n      }\n\n      const descriptor = describeSetting(setting.value);\n      const isArrayPart = index !== undefined;\n      const expectsArray =\n        descriptor.kind === SettingType.NumberArray ||\n        descriptor.kind === SettingType.StringArray ||\n        descriptor.kind === SettingType.ObjectArray;\n\n      if (expectsArray !== isArrayPart) {\n        return false;\n      }\n\n      switch (descriptor.kind) {\n        case SettingType.ObjectArray:\n        case SettingType.NestedObject:\n          currentSettings = descriptor.children;\n          break;\n        default:\n          return true;\n      }\n    }\n\n    return true;\n  }\n\n  private static setNestedValue(nested: NestedSettings, key: string, value: string | number): void {\n    const parts = this.parseKeyPath(key);\n    let current = nested;\n\n    // Navigate through all parts, creating structure as needed\n    for (let i = 0; i < parts.length; i++) {\n      const part = parts[i];\n      const isLastPart = i === parts.length - 1;\n\n      if (part.index !== undefined) {\n        // Navigate to array by property name\n        current[part.part] ??= [];\n        const currentArray = current[part.part] as NestedValue[];\n\n        // Set value or navigate to array element\n        if (isLastPart) {\n          currentArray[part.index] = value;\n        } else {\n          currentArray[part.index] ??= {};\n          current = currentArray[part.index] as NestedSettings;\n        }\n      } else {\n        // Set value or navigate to property\n        if (isLastPart) {\n          current[part.part] = value;\n        } else {\n          current[part.part] ??= {};\n          current = current[part.part] as NestedSettings;\n        }\n      }\n    }\n  }\n\n  /**\n   * Parse a key path and track whether each part is from bracket notation.\n   * Returns array of {part, index} objects. index is optional.\n   * Example: \"config.x\" -> [{part: 'config'}, {part: 'x'}]\n   * Example: \"config.42\" -> [{part: 'config'}, {part: '42'}]\n   * Example: \"config[42]\" -> [{part: 'config', index: 42}]\n   */\n  private static parseKeyPath(key: string): Array<{ part: string; index?: number }> {\n    const parts: Array<{ part: string; index?: number }> = [];\n    let remaining = key;\n\n    while (remaining) {\n      // Match property name with optional array index: word or word[123]\n      const match = remaining.match(/^([^.[]+)(?:\\[(\\d+)\\])?\\.?(.*)/);\n      if (!match) {\n        break;\n      }\n\n      const part: { part: string; index?: number } = { part: match[1] };\n      if (match[2] !== undefined) {\n        part.index = parseInt(match[2], 10);\n      }\n\n      parts.push(part);\n\n      remaining = match[3];\n    }\n\n    return parts;\n  }\n\n  /**\n   * Combines provided values with schema metadata: orders keys, applies\n   * defaults, and coerces to schema types.\n   */\n  private static normalizeWithSchema(target: NestedSettings, schema: InitialSettings): NestedSettings {\n    const ordered: NestedSettings = {};\n    const remainingKeys = new Set(Object.keys(target));\n\n    for (const item of schema) {\n      const { key } = item;\n      const descriptor = describeSetting(item.value);\n      const existingValue = target[key];\n\n      switch (descriptor.kind) {\n        case SettingType.Boolean:\n        case SettingType.Number:\n        case SettingType.String:\n          ordered[key] = this.normalizePrimitiveValue(existingValue, descriptor);\n          break;\n        case SettingType.NestedObject:\n          ordered[key] = this.normalizeNestedObject(existingValue, descriptor.children);\n          break;\n        case SettingType.ObjectArray:\n          ordered[key] = this.normalizeObjectArray(existingValue, descriptor.children);\n          break;\n        case SettingType.NumberArray:\n          ordered[key] = this.normalizePrimitiveArray(existingValue, descriptor.defaultValue, this.isNumberValue);\n          break;\n        case SettingType.StringArray:\n          ordered[key] = this.normalizePrimitiveArray(existingValue, descriptor.defaultValue, this.isStringValue);\n          break;\n      }\n\n      remainingKeys.delete(key);\n    }\n\n    if (remainingKeys.size > 0) {\n      const extras = Array.from(remainingKeys).sort(naturalSort);\n      for (const key of extras) {\n        ordered[key] = target[key];\n      }\n    }\n\n    return ordered;\n  }\n\n  private static highestDefinedIndex(array: unknown[]): number {\n    for (let i = array.length - 1; i >= 0; i--) {\n      if (array[i] !== undefined) {\n        return i;\n      }\n    }\n    return -1;\n  }\n\n  private static normalizeNestedObject(value: NestedValue | undefined, schema: InitialSettings): NestedSettings {\n    return this.normalizeWithSchema(toNestedSettings(value), schema);\n  }\n\n  private static normalizeObjectArray(value: NestedValue | undefined, schema: InitialSettings): NestedSettings[] {\n    const existingArray = Array.isArray(value) ? value : [];\n    const highestIndex = Math.max(this.highestDefinedIndex(existingArray), 0);\n    const result: NestedSettings[] = [];\n\n    for (let index = 0; index <= highestIndex; index += 1) {\n      result[index] = this.normalizeWithSchema(toNestedSettings(existingArray[index]), schema);\n    }\n\n    return result;\n  }\n\n  private static normalizePrimitiveArray<T extends string | number>(\n    value: NestedValue | undefined,\n    defaultValue: T,\n    guard: (candidate: unknown) => candidate is T\n  ): T[] {\n    const existingArray = Array.isArray(value) ? value : [];\n    const highestIndex = Math.max(this.highestDefinedIndex(existingArray), 0);\n    const result: T[] = [];\n\n    for (let index = 0; index <= highestIndex; index += 1) {\n      const candidate = existingArray[index];\n      result[index] = guard(candidate) ? candidate : defaultValue;\n    }\n\n    return result;\n  }\n\n  private static isNumberValue(value: unknown): value is number {\n    return typeof value === 'number';\n  }\n\n  private static isStringValue(value: unknown): value is string {\n    return typeof value === 'string';\n  }\n\n  private static normalizePrimitiveValue(\n    value: NestedValue | undefined,\n    descriptor: BooleanDescriptor | NumberDescriptor | StringDescriptor\n  ): string | number {\n    if (descriptor.kind === SettingType.Boolean) {\n      return this.normalizeBooleanValue(value, descriptor.defaultValue);\n    }\n\n    if (descriptor.kind === SettingType.Number) {\n      return this.normalizeNumberValue(value, descriptor.defaultValue);\n    }\n\n    return this.normalizeStringValue(value, descriptor.defaultValue);\n  }\n\n  private static normalizeBooleanValue(\n    value: NestedValue | undefined,\n    defaultValue: number\n  ): number {\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    if (typeof value === 'number') {\n      return value ? 1 : 0;\n    }\n\n    if (typeof value === 'string') {\n      return parseIntLax(value) ? 1 : 0;\n    }\n\n    return defaultValue;\n  }\n\n  private static normalizeNumberValue(\n    value: NestedValue | undefined,\n    defaultValue: number\n  ): number {\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    if (typeof value === 'number') {\n      return value;\n    }\n\n    if (typeof value === 'string') {\n      return parseIntLax(value);\n    }\n\n    return defaultValue;\n  }\n\n  private static normalizeStringValue(\n    value: NestedValue | undefined,\n    defaultValue: string\n  ): string {\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    if (typeof value === 'string') {\n      return value;\n    }\n\n    if (typeof value === 'number') {\n      return value.toString();\n    }\n\n    return defaultValue;\n  }\n\n  static nestedToFlat(nested: NestedValue, prefix = ''): ModSettings {\n    const flat: ModSettings = {};\n\n    if (Array.isArray(nested)) {\n      nested.forEach((item, index) => {\n        const key = `${prefix}[${index}]`;\n        Object.assign(flat, isPlainObject(item)\n          ? this.nestedToFlat(item, key)\n          : { [key]: item }\n        );\n      });\n    } else {\n      for (const [key, value] of Object.entries(nested)) {\n        const fullKey = prefix ? `${prefix}.${key}` : key;\n\n        if (Array.isArray(value)) {\n          value.forEach((item, index) => {\n            const arrayKey = `${fullKey}[${index}]`;\n            Object.assign(flat, isPlainObject(item)\n              ? this.nestedToFlat(item as NestedSettings, arrayKey)\n              : { [arrayKey]: item }\n            );\n          });\n        } else if (isPlainObject(value)) {\n          Object.assign(flat, this.nestedToFlat(value as NestedSettings, fullKey));\n        } else {\n          flat[fullKey] = value;\n        }\n      }\n    }\n\n    return flat;\n  }\n\n  static removeEmptyValues(value: NestedValue): NestedValue {\n    if (Array.isArray(value)) {\n      return this.cleanArray(value);\n    }\n\n    if (isPlainObject(value)) {\n      return this.cleanObject(value);\n    }\n\n    return value;\n  }\n\n  private static cleanArray(array: (string | number | NestedSettings)[]): (string | number | NestedSettings)[] {\n    // Compact a possibly sparse array\n    const compacted = Object.values(array);\n\n    // Find the last non-empty index, but skip the first element\n    let lastNonEmpty = 0;\n    for (let i = compacted.length - 1; i >= 1; i--) {\n      const value = compacted[i];\n      if (!this.isEmptyValue(value)) {\n        lastNonEmpty = i;\n        break;\n      }\n    }\n\n    // Trim to last non-empty element, but never remove all elements\n    const trimmed = compacted.slice(0, lastNonEmpty + 1);\n\n    // Clean nested objects\n    const cleaned = trimmed.\n      map(value => {\n        if (isPlainObject(value)) {\n          return this.cleanObject(value);\n        }\n\n        return value;\n      });\n\n    return cleaned;\n  }\n\n  private static cleanObject(obj: NestedSettings): NestedSettings {\n    return Object.fromEntries(\n      Object.entries(obj)\n        .map(([key, val]) => [key, this.removeEmptyValues(val)])\n    );\n  }\n\n  private static isEmptyValue(value: NestedValue): boolean {\n    if (Array.isArray(value)) {\n      return value.every(v => this.isEmptyValue(v));\n    }\n\n    if (isPlainObject(value)) {\n      return Object.values(value).every(v => this.isEmptyValue(v));\n    }\n\n    return value === '' || value === 0;\n  }\n\n  static toYaml(settings: ModSettings, initialSettings: InitialSettings): string {\n    try {\n      const nested = this.flatToNested(settings, initialSettings);\n      const cleaned = this.removeEmptyValues(nested);\n      const yamlText = yaml.dump(cleaned, {\n        indent: 2,\n        lineWidth: -1,\n        noRefs: true,\n        sortKeys: false,\n      });\n      return yamlText.trim() === '{}' ? '' : yamlText;\n    } catch (error) {\n      console.error('Error converting settings to YAML:', error);\n      return '';\n    }\n  }\n\n  static fromYaml(\n    yamlString: string,\n    validator: YamlSchemaValidator,\n    t: ReturnType<typeof useTranslation>['t'],\n  ): { settings: ModSettings | null; error: string | null } {\n    if (!yamlString.trim()) {\n      return { settings: {}, error: null };\n    }\n\n    try {\n      const parsed = yaml.load(yamlString);\n\n      // Validate structure\n      if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n        return { settings: null, error: t('modDetails.settings.yamlInvalid') };\n      }\n\n      // Validate keys\n      const invalidKey = validator.validateKeys(parsed as NestedSettings);\n      if (invalidKey) {\n        return {\n          settings: null,\n          error: t('modDetails.settings.yamlInvalidKey', { key: invalidKey })\n        };\n      }\n\n      // Validate types\n      const typeError = validator.validateTypes(parsed as NestedSettings);\n      if (typeError) {\n        return {\n          settings: null,\n          error: t('modDetails.settings.yamlTypeMismatch', {\n            key: typeError.key,\n            expected: typeError.expected,\n            actual: typeError.actual\n          })\n        };\n      }\n\n      return { settings: this.nestedToFlat(parsed as NestedSettings), error: null };\n    } catch (error) {\n      return {\n        settings: null,\n        error: t('modDetails.settings.yamlParseError', {\n          error: error instanceof Error ? error.message : String(error)\n        })\n      };\n    }\n  }\n}\n\n// ============================================================================\n// Component Definitions\n// ============================================================================\n\ninterface BooleanSettingProps {\n  checked: boolean;\n  onChange: (checked: boolean) => void;\n}\n\nfunction BooleanSetting({ checked, onChange }: BooleanSettingProps) {\n  return <Switch checked={checked} onChange={onChange} />;\n}\n\ninterface StringSettingProps {\n  value: string;\n  sampleValue: string;\n  onChange: (newValue: string) => void;\n}\n\nfunction StringSetting({ value, sampleValue, onChange }: StringSettingProps) {\n  const { t } = useTranslation();\n\n  return (\n    <InputWithContextMenu\n      placeholder={\n        sampleValue\n          ? t('modDetails.settings.sampleValue') + `: ${sampleValue}`\n          : undefined\n      }\n      value={value}\n      onChange={(e) => onChange(e.target.value)}\n    />\n  );\n}\n\ninterface SelectSettingProps {\n  value: string;\n  selectItems: {\n    value: string;\n    label: string;\n  }[];\n  onChange: (newValue: string) => void;\n}\n\nfunction SelectSetting({ value, selectItems, onChange }: SelectSettingProps) {\n  let maxWidth = undefined;\n\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d');\n  if (ctx) {\n    ctx.font = '14px \"Segoe UI\"';\n\n    if (selectItems.every((item) => ctx.measureText(item.label).width <= 350)) {\n      maxWidth = '400px';\n    }\n  }\n\n  return (\n    <div style={{ maxWidth }}>\n      <SettingSelect\n        showSearch\n        optionFilterProp=\"children\"\n        listHeight={240}\n        value={value}\n        onChange={(newValue) => onChange(newValue as string)}\n      >\n        {selectItems.map((item) => (\n          <Select.Option key={item.value} value={item.value}>\n            {item.label}\n          </Select.Option>\n        ))}\n      </SettingSelect>\n    </div>\n  );\n}\n\ninterface NumberSettingProps {\n  value?: number;\n  onChange: (newValue: number) => void;\n}\n\nfunction NumberSetting({ value, onChange }: NumberSettingProps) {\n  return (\n    <SettingInputNumber\n      value={value}\n      min={-2147483648}\n      max={2147483647}\n      onChange={(newValue) => onChange(parseIntLax(newValue))}\n    />\n  );\n}\n\ninterface SettingsTreeProps {\n  modSettings: ModSettings;\n  onSettingChanged: (key: string, newValue: string | number) => void;\n  arrayItemMaxIndex: Record<string, number>;\n  onRemoveArrayItem: (key: string, index: number) => void;\n  onNewArrayItem: (key: string, index: number) => void;\n}\n\ninterface SingleSettingProps {\n  settingsTreeProps: SettingsTreeProps;\n  initialSettingsValue: InitialSettingsValue;\n  initialSettingItemExtra?: InitialSettingItemExtra;\n  settingKey: string;\n}\n\nfunction SingleSetting({\n  settingsTreeProps,\n  initialSettingsValue,\n  initialSettingItemExtra,\n  settingKey,\n}: SingleSettingProps) {\n  const { modSettings, onSettingChanged } = settingsTreeProps;\n  const descriptor = describeSetting(initialSettingsValue);\n\n  switch (descriptor.kind) {\n    case SettingType.Boolean:\n      return (\n        <BooleanSetting\n          checked={!!parseIntLax(modSettings[settingKey])}\n          onChange={(checked) => onSettingChanged(settingKey, checked ? 1 : 0)}\n        />\n      );\n\n    case SettingType.Number:\n      return (\n        <NumberSetting\n          value={modSettings[settingKey] === undefined ? undefined : parseIntLax(modSettings[settingKey])}\n          onChange={(newValue) => onSettingChanged(settingKey, newValue)}\n        />\n      );\n\n    case SettingType.String:\n      if (initialSettingItemExtra?.options) {\n        return (\n          <SelectSetting\n            value={(modSettings[settingKey] ?? '').toString()}\n            selectItems={initialSettingItemExtra.options.map((option) => {\n              const [value, label] = Object.entries(option)[0];\n              return { value, label };\n            })}\n            onChange={(newValue) => onSettingChanged(settingKey, newValue)}\n          />\n        );\n      }\n      return (\n        <StringSetting\n          value={(modSettings[settingKey] ?? '').toString()}\n          sampleValue={descriptor.value}\n          onChange={(newValue) => onSettingChanged(settingKey, newValue)}\n        />\n      );\n\n    case SettingType.NumberArray:\n    case SettingType.StringArray:\n    case SettingType.ObjectArray:\n      return (\n        <ArraySettings\n          settingsTreeProps={settingsTreeProps}\n          initialSettingsItems={descriptor.value}\n          initialSettingItemExtra={initialSettingItemExtra}\n          keyPrefix={settingKey}\n        />\n      );\n\n    case SettingType.NestedObject:\n      return (\n        <SettingsCard>\n          <ObjectSettings\n            settingsTreeProps={settingsTreeProps}\n            initialSettings={descriptor.value}\n            keyPrefix={settingKey + '.'}\n          />\n        </SettingsCard>\n      );\n  }\n}\n\ninterface ArraySettingsProps {\n  settingsTreeProps: SettingsTreeProps;\n  initialSettingsItems: InitialSettingsArrayValue;\n  initialSettingItemExtra?: InitialSettingItemExtra;\n  keyPrefix: string;\n}\n\nfunction ArraySettings({\n  settingsTreeProps,\n  initialSettingsItems,\n  initialSettingItemExtra,\n  keyPrefix,\n}: ArraySettingsProps) {\n  const { t } = useTranslation();\n\n  const { modSettings, arrayItemMaxIndex, onRemoveArrayItem, onNewArrayItem } =\n    settingsTreeProps;\n\n  const maxSettingsArrayIndex = Object.keys(modSettings).reduce(\n    (maxIndex, key) => {\n      if (key.startsWith(keyPrefix + '[')) {\n        const match = key.slice((keyPrefix + '[').length).match(/^(\\d+)\\]/);\n        if (match) {\n          return Math.max(maxIndex, parseIntLax(match[1]));\n        }\n      }\n\n      return maxIndex;\n    },\n    -1\n  );\n\n  const maxArrayIndex = Math.max(\n    maxSettingsArrayIndex,\n    arrayItemMaxIndex[keyPrefix] ?? 0\n  );\n\n  const indexValues = [...Array(maxArrayIndex + 1).keys(), -1];\n\n  const defaultValue = initialSettingsItems[0];\n\n  return (\n    <List\n      itemLayout=\"vertical\"\n      dataSource={indexValues}\n      renderItem={(index) => (\n        <SettingsListItem key={index}>\n          <div>\n            {index === -1 ? (\n              <Button\n                disabled={maxArrayIndex !== maxSettingsArrayIndex}\n                onClick={() => onNewArrayItem(keyPrefix, maxArrayIndex + 1)}\n              >\n                {t('modDetails.settings.arrayItemAdd')}\n              </Button>\n            ) : (\n              <ArraySettingsItemWrapper>\n                <DropdownModal\n                  menu={{\n                    items: [\n                      {\n                        label: t('modDetails.settings.arrayItemRemove'),\n                        key: 'remove',\n                        onClick: () => {\n                          dropdownModalDismissed();\n                          onRemoveArrayItem(keyPrefix, index)\n                        },\n                      },\n                    ],\n                  }}\n                  trigger={['click']}\n                >\n                  <ArraySettingsDropdownOptionsButton>\n                    <FontAwesomeIcon icon={faCaretDown} />\n                  </ArraySettingsDropdownOptionsButton>\n                </DropdownModal>\n                <SingleSetting\n                  settingsTreeProps={settingsTreeProps}\n                  initialSettingsValue={defaultValue}\n                  initialSettingItemExtra={initialSettingItemExtra}\n                  settingKey={`${keyPrefix}[${index}]`}\n                />\n              </ArraySettingsItemWrapper>\n            )}\n          </div>\n        </SettingsListItem>\n      )}\n    />\n  );\n}\n\ninterface ObjectSettingsProps {\n  settingsTreeProps: SettingsTreeProps;\n  initialSettings: InitialSettings;\n  keyPrefix?: string;\n}\n\nfunction ObjectSettings({\n  settingsTreeProps,\n  initialSettings,\n  keyPrefix = '',\n}: ObjectSettingsProps) {\n  return (\n    <List\n      itemLayout=\"vertical\"\n      split={false}\n      dataSource={initialSettings}\n      renderItem={(item) => (\n        <SettingsListItem key={item.key}>\n          <SettingsListItemMeta\n            title={item.name || item.key}\n            description={item.description}\n          />\n          <SingleSetting\n            settingsTreeProps={settingsTreeProps}\n            initialSettingsValue={item.value}\n            initialSettingItemExtra={item}\n            settingKey={keyPrefix + item.key}\n          />\n        </SettingsListItem>\n      )}\n    />\n  );\n}\n\ninterface YamlEditorProps {\n  yamlText: string;\n  onYamlTextChange: (value: string) => void;\n}\n\nfunction YamlEditor({ yamlText, onYamlTextChange }: YamlEditorProps) {\n  const [editorCalcHeight, setEditorCalcHeight] = useState('0');\n\n  return (\n    <ConfigProvider direction=\"ltr\">\n      <YamlEditorWrapper>\n        <Editor\n          height={editorCalcHeight}\n          defaultLanguage=\"yaml\"\n          value={yamlText}\n          onChange={(value) => {\n            onYamlTextChange(value || '');\n          }}\n          onMount={(editor, monacoInstance) => {\n            // Calculate height based on position\n            const rect = editor.getDomNode()?.getBoundingClientRect();\n            if (!rect) {\n              return;\n            }\n            const topOffset = rect.top;\n            const bottomOffset = 24; // Bottom padding\n            const totalOffset = topOffset + bottomOffset;\n            setEditorCalcHeight(`calc(100vh - ${totalOffset}px)`);\n\n            // Fix clipboard operations in Electron/webview context Add copy\n            // action (Ctrl+C)\n            editor.addAction({\n              id: 'editor.action.clipboardCopyActionWithExecCommand',\n              label: 'Copy',\n              keybindings: [monacoInstance.KeyMod.CtrlCmd | monacoInstance.KeyCode.KeyC],\n              contextMenuGroupId: '9_cutcopypaste',\n              contextMenuOrder: 1,\n              run: (ed) => {\n                const selection = ed.getSelection();\n                const model = ed.getModel();\n                if (!selection || !model) return;\n\n                if (selection.isEmpty()) {\n                  // No selection - copy the entire current line including newline\n                  const lineNumber = selection.startLineNumber;\n\n                  // Select the line including the newline character\n                  const lineRange = new monacoInstance.Range(\n                    lineNumber, 1,\n                    lineNumber + 1, 1\n                  );\n                  ed.setSelection(lineRange);\n                  document.execCommand('copy');\n                  // Restore cursor position\n                  ed.setSelection(selection);\n                } else {\n                  // Has selection - copy selected text\n                  document.execCommand('copy');\n                }\n              }\n            });\n\n            // Add cut action (Ctrl+X)\n            editor.addAction({\n              id: 'editor.action.clipboardCutActionWithExecCommand',\n              label: 'Cut',\n              keybindings: [monacoInstance.KeyMod.CtrlCmd | monacoInstance.KeyCode.KeyX],\n              contextMenuGroupId: '9_cutcopypaste',\n              contextMenuOrder: 0,\n              run: (ed) => {\n                const selection = ed.getSelection();\n                const model = ed.getModel();\n                if (!selection || !model) return;\n\n                if (selection.isEmpty()) {\n                  // No selection - cut the entire current line including newline\n                  const lineNumber = selection.startLineNumber;\n\n                  // Select the entire line including newline\n                  const lineRange = new monacoInstance.Range(\n                    lineNumber, 1,\n                    lineNumber + 1, 1\n                  );\n                  ed.setSelection(lineRange);\n                  document.execCommand('copy');\n\n                  // Delete the entire line including newline\n                  ed.executeEdits('cut', [{\n                    range: lineRange,\n                    text: '',\n                    forceMoveMarkers: true\n                  }]);\n                } else {\n                  // Has selection - cut selected text\n                  document.execCommand('copy');\n                  ed.executeEdits('cut', [{\n                    range: selection,\n                    text: '',\n                    forceMoveMarkers: true\n                  }]);\n                }\n              }\n            });\n\n            // Add paste action (Ctrl+V)\n            editor.addAction({\n              id: 'editor.action.clipboardPasteActionWithExecCommand',\n              label: 'Paste',\n              keybindings: [monacoInstance.KeyMod.CtrlCmd | monacoInstance.KeyCode.KeyV],\n              contextMenuGroupId: '9_cutcopypaste',\n              contextMenuOrder: 2,\n              run: async (ed) => {\n                try {\n                  // Try modern clipboard API first\n                  if (navigator.clipboard && navigator.clipboard.readText) {\n                    const text = await navigator.clipboard.readText();\n                    if (text) {\n                      const selection = ed.getSelection();\n                      if (selection) {\n                        ed.executeEdits('paste', [{\n                          range: selection,\n                          text: text,\n                          forceMoveMarkers: true\n                        }]);\n                      }\n                    }\n                  } else {\n                    // Fallback to execCommand\n                    document.execCommand('paste');\n                  }\n                } catch (err) {\n                  console.error('Paste failed:', err);\n                }\n              }\n            });\n\n            // Add paste action for Shift+Insert\n            editor.addAction({\n              id: 'editor.action.clipboardPasteActionWithShiftInsert',\n              label: 'Paste',\n              keybindings: [monacoInstance.KeyMod.Shift | monacoInstance.KeyCode.Insert],\n              run: async (ed) => {\n                try {\n                  if (navigator.clipboard && navigator.clipboard.readText) {\n                    const text = await navigator.clipboard.readText();\n                    if (text) {\n                      const selection = ed.getSelection();\n                      if (selection) {\n                        ed.executeEdits('paste', [{\n                          range: selection,\n                          text: text,\n                          forceMoveMarkers: true\n                        }]);\n                      }\n                    }\n                  } else {\n                    document.execCommand('paste');\n                  }\n                } catch (err) {\n                  console.error('Paste failed:', err);\n                }\n              }\n            });\n\n            // Hide the default clipboard actions that don't work in Electron.\n            // We need to remove them from the context menu.\n            // https://github.com/microsoft/monaco-editor/issues/1280#issuecomment-2099873176\n            const removableIds = [\n              'editor.action.clipboardCopyAction',\n              'editor.action.clipboardCutAction',\n              'editor.action.clipboardPasteAction'\n            ];\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            const contextmenu = editor.getContribution('editor.contrib.contextmenu') as any;\n            if (contextmenu && contextmenu._getMenuActions) {\n              const realMethod = contextmenu._getMenuActions;\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              contextmenu._getMenuActions = function () {\n                // eslint-disable-next-line prefer-rest-params\n                const items = realMethod.apply(contextmenu, arguments);\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                return items.filter(function (item: any) {\n                  return !removableIds.includes(item.id);\n                });\n              };\n            }\n          }}\n          options={{\n            detectIndentation: false,\n            tabSize: 2,\n            insertSpaces: true,\n            minimap: { enabled: false },\n          }}\n          theme=\"vs-dark\"\n        />\n      </YamlEditorWrapper>\n    </ConfigProvider>\n  );\n}\n\ninterface Props {\n  modId: string;\n  initialSettings: InitialSettings;\n  onCanNavigateAwayChange?: (canNavigateAway: () => Promise<boolean>) => void;\n}\n\nfunction ModDetailsSettings({ modId, initialSettings, onCanNavigateAwayChange }: Props) {\n  const { t } = useTranslation();\n\n  const [modSettingsUI, setModSettingsUI] = useState<ModSettings | null>(mockModSettings);\n  const [settingsChanged, setSettingsChanged] = useState(false);\n  const [isYamlMode, setIsYamlMode] = useState(() => {\n    const stored = localStorage.getItem('settingsYamlMode');\n    return stored === 'true';\n  });\n  const [yamlText, setYamlText] = useState('');\n  const [yamlWasEdited, setYamlWasEdited] = useState(false);\n\n  // Track if a confirmation modal is already open\n  const isModalOpenRef = useRef(false);\n\n  // Helper function to show confirmation modal for unsaved changes\n  const showUnsavedChangesConfirmation = useCallback((): Promise<boolean> => {\n    // Prevent multiple modals from opening\n    if (isModalOpenRef.current) {\n      return Promise.resolve(false);\n    }\n\n    isModalOpenRef.current = true;\n\n    return new Promise((resolve) => {\n      Modal.confirm({\n        title: t('modDetails.settings.unsavedChangesTitle'),\n        content: t('modDetails.settings.unsavedChangesMessage'),\n        okText: t('modDetails.settings.unsavedChangesLeave'),\n        cancelText: t('modDetails.settings.unsavedChangesStay'),\n        onOk: () => {\n          isModalOpenRef.current = false;\n          resolve(true);\n        },\n        onCancel: () => {\n          isModalOpenRef.current = false;\n          resolve(false);\n        },\n        closable: true,\n        maskClosable: true,\n      });\n    });\n  }, [t]);\n\n  // Block navigation when there are unsaved changes\n  const blocker = useBlocker(({ currentLocation, nextLocation }) => {\n    return settingsChanged && currentLocation.pathname !== nextLocation.pathname;\n  });\n\n  // Show confirmation modal when navigation is blocked\n  useEffect(() => {\n    if (blocker.state === 'blocked') {\n      showUnsavedChangesConfirmation().then((canLeave) => {\n        if (canLeave) {\n          blocker.proceed();\n        } else {\n          blocker.reset();\n        }\n      });\n    }\n  }, [blocker, showUnsavedChangesConfirmation]);\n\n  // Provide a callback for parent component to check if navigation is allowed\n  useEffect(() => {\n    const canNavigateAway = (): Promise<boolean> => {\n      if (!settingsChanged) {\n        return Promise.resolve(true);\n      }\n\n      return showUnsavedChangesConfirmation();\n    };\n\n    onCanNavigateAwayChange?.(canNavigateAway);\n  }, [settingsChanged, showUnsavedChangesConfirmation, onCanNavigateAwayChange]);\n\n  const { getModSettings } = useGetModSettings(\n    useCallback(\n      (data) => {\n        if (data.modId === modId) {\n          setModSettingsUI(data.settings);\n        }\n      },\n      [modId]\n    )\n  );\n\n  const { setModSettings } = useSetModSettings(\n    useCallback(\n      (data) => {\n        if (data.modId === modId && data.succeeded) {\n          setSettingsChanged(false);\n        }\n      },\n      [modId]\n    )\n  );\n\n  // Initialize YAML validator with schema\n  const yamlValidator = useMemo(\n    () => new YamlSchemaValidator(initialSettings),\n    [initialSettings]\n  );\n\n  // YAML conversion handlers\n  const settingsToYaml = useCallback(\n    (settings: ModSettings): string => YamlConverter.toYaml(settings, initialSettings),\n    [initialSettings]\n  );\n\n  const yamlToSettings = useCallback(\n    (yamlString: string) => YamlConverter.fromYaml(yamlString, yamlValidator, t),\n    [yamlValidator, t]\n  );\n\n  // Sync YAML text only when switching to YAML mode or on initial load if\n  // already in YAML mode. Don't sync when settings change to preserve user's\n  // YAML formatting.\n  const prevIsYamlMode = useRef<boolean | null>(null);\n  useEffect(() => {\n    if (!modSettingsUI) {\n      return;\n    }\n\n    if (isYamlMode && !prevIsYamlMode.current && modSettingsUI) {\n      setYamlText(settingsToYaml(modSettingsUI));\n    }\n\n    prevIsYamlMode.current = isYamlMode;\n  }, [isYamlMode, modSettingsUI, settingsToYaml]);\n\n  // Handle mode toggle\n  const handleModeToggle = useCallback(() => {\n    if (isYamlMode) {\n      // Switching from YAML to UI mode\n      if (yamlWasEdited) {\n        // YAML was edited - validate and parse it\n        const { settings, error } = yamlToSettings(yamlText);\n        if (error || !settings) {\n          message.error(formatYamlError(error || 'Unknown error'));\n          return;\n        }\n        setModSettingsUI(settings);\n      }\n      // If YAML was never edited, keep existing modSettingsUI\n      setArrayItemMaxIndex({});\n      setIsYamlMode(false);\n      setYamlText('');\n      setYamlWasEdited(false);\n      localStorage.setItem('settingsYamlMode', 'false');\n    } else {\n      // Switching from UI to YAML mode\n      setIsYamlMode(true);\n      setYamlWasEdited(false);\n      localStorage.setItem('settingsYamlMode', 'true');\n    }\n  }, [isYamlMode, yamlWasEdited, yamlToSettings, yamlText]);\n\n  const handleSave = useCallback(() => {\n    if (!settingsChanged) {\n      return;\n    }\n\n    let settingsToSave = modSettingsUI;\n\n    // If in YAML mode, validate and parse before saving\n    if (isYamlMode) {\n      const { settings, error } = yamlToSettings(yamlText);\n      if (error || !settings) {\n        message.error(formatYamlError(error || 'Unknown error'));\n        return;\n      }\n      settingsToSave = settings;\n    }\n\n    if (settingsToSave) {\n      setModSettings({\n        modId,\n        settings: settingsToSave,\n      });\n    }\n  }, [settingsChanged, modSettingsUI, isYamlMode, yamlText, yamlToSettings, modId, setModSettings]);\n\n  useEffect(() => {\n    getModSettings({ modId });\n  }, [getModSettings, modId]);\n\n  useEventListener(\n    'keydown',\n    useCallback(\n      (e: KeyboardEvent) => {\n        if (e.key === 's' && e.ctrlKey) {\n          e.preventDefault();\n          handleSave();\n        }\n      },\n      [handleSave]\n    )\n  );\n\n  const [arrayItemMaxIndex, setArrayItemMaxIndex] = useState<\n    Record<string, number>\n  >({});\n\n  const onRemoveArrayItem = useCallback(\n    (key: string, index: number) => {\n      const indexFromKey = (targetKey: string) => {\n        if (targetKey.startsWith(key + '[')) {\n          const match = targetKey.slice((key + '[').length).match(/^(\\d+)\\]/);\n          if (match) {\n            return parseIntLax(match[1]);\n          }\n        }\n        return null;\n      };\n\n      const decreaseKeyIndex = (targetKey: string) => {\n        if (targetKey.startsWith(key + '[')) {\n          const match = targetKey\n            .slice((key + '[').length)\n            .match(/^(\\d+)(\\].*$)/);\n          if (match) {\n            const targetKeyIndex = parseIntLax(match[1]);\n            if (targetKeyIndex > index) {\n              return key + '[' + (targetKeyIndex - 1).toString() + match[2];\n            }\n          }\n        }\n        return targetKey;\n      };\n\n      setModSettingsUI(\n        Object.fromEntries(\n          Object.entries(modSettingsUI ?? {})\n            .filter(([iterKey, iterValue]) => {\n              return indexFromKey(iterKey) !== index;\n            })\n            .map(([iterKey, iterValue]) => {\n              return [decreaseKeyIndex(iterKey), iterValue];\n            })\n        )\n      );\n\n      setArrayItemMaxIndex(\n        Object.fromEntries(\n          Object.entries(arrayItemMaxIndex)\n            .filter(([iterKey, iterValue]) => {\n              return indexFromKey(iterKey) !== index;\n            })\n            .map(([iterKey, iterValue]) => {\n              return iterKey === key\n                ? [iterKey, Math.max(iterValue - 1, 0)]\n                : [decreaseKeyIndex(iterKey), iterValue];\n            })\n        )\n      );\n\n      setSettingsChanged(true);\n    },\n    [modSettingsUI, arrayItemMaxIndex]\n  );\n\n  if (modSettingsUI === null) {\n    return null;\n  }\n\n  return (\n    <form\n      onSubmit={(e) => {\n        e.preventDefault();\n        handleSave();\n      }}\n    >\n      <SaveSettingsCard bordered={false} size=\"small\">\n        <ActionButtonsWrapper>\n          <Button\n            type=\"primary\"\n            htmlType=\"submit\"\n            title=\"Ctrl+S\"\n            disabled={!settingsChanged}\n          >\n            {t('modDetails.settings.saveButton')}\n          </Button>\n          <Button\n            onClick={handleModeToggle}\n          >\n            {isYamlMode\n              ? t('modDetails.settings.uiMode')\n              : t('modDetails.settings.yamlMode')\n            }\n          </Button>\n        </ActionButtonsWrapper>\n      </SaveSettingsCard>\n      {isYamlMode ? (\n        <YamlEditor\n          yamlText={yamlText}\n          onYamlTextChange={(value) => {\n            setYamlText(value);\n            setSettingsChanged(true);\n            setYamlWasEdited(true);\n          }}\n        />\n      ) : (\n        <SettingsWrapper>\n          <ObjectSettings\n            settingsTreeProps={{\n              modSettings: modSettingsUI,\n              onSettingChanged: (key, newValue) => {\n                setModSettingsUI({\n                  ...modSettingsUI,\n                  [key]: newValue,\n                });\n                setSettingsChanged(true);\n              },\n              arrayItemMaxIndex: arrayItemMaxIndex,\n              onRemoveArrayItem,\n              onNewArrayItem: (key, index) => {\n                setArrayItemMaxIndex({\n                  ...arrayItemMaxIndex,\n                  [key]: index,\n                });\n                setSettingsChanged(true);\n              },\n            }}\n            initialSettings={initialSettings}\n          />\n        </SettingsWrapper>\n      )}\n    </form>\n  );\n}\n\nexport default ModDetailsSettings;\n\n// Types exported for testing only\nexport type typesForTesting = {\n  ModSettings: ModSettings;\n  NestedValue: NestedValue;\n  NestedSettings: NestedSettings;\n  InitialSettings: InitialSettings;\n  InitialSettingItem: InitialSettingItem;\n  InitialSettingItemExtra: InitialSettingItemExtra;\n  InitialSettingsValue: InitialSettingsValue;\n  InitialSettingsArrayValue: InitialSettingsArrayValue;\n  TypeMismatchError: TypeMismatchError;\n}\n\n// Exported for testing only\nexport const exportedForTesting = {\n  // Types\n  SettingType,\n  // Helper functions\n  isPlainObject,\n  naturalSort,\n  // Classes\n  YamlSchemaValidator,\n  YamlConverter,\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSource.tsx",
    "content": "import { ConfigProvider, Switch } from 'antd';\nimport 'prism-themes/themes/prism-vsc-dark-plus.css';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-cpp';\nimport { useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { DropdownModal, dropdownModalDismissed } from '../components/InputWithContextMenu';\n\nconst SyntaxHighlighterWrapper = styled.div`\n  direction: ltr;\n\n  pre {\n    font-size: 13px;\n    line-height: 1.5;\n    background-color: #1e1e1e;\n    padding: 12px;\n    border-radius: 2px;\n    overflow: auto;\n  }\n\n  code {\n    color: #d4d4d4;\n    background-color: transparent;\n    tab-size: 4;\n  }\n`;\n\nconst ConfigurationWrapper = styled.div`\n  margin-bottom: 20px;\n\n  > span {\n    vertical-align: middle;\n  }\n\n  > button {\n    margin-inline-start: 10px;\n  }\n`;\n\nfunction collapseSource(source: string) {\n  return source\n    .replace(\n      /^(\\/\\/[ \\t]+==WindhawkModReadme==[ \\t]*$\\s*\\/\\*)(\\s*[\\s\\S]+?\\s*)(\\*\\/\\s*^\\/\\/[ \\t]+==\\/WindhawkModReadme==[ \\t]*)$/m,\n      (match, p1, p2, p3) => {\n        if ((p2 as string).includes('*/')) {\n          return p1 + p2 + p3;\n        }\n        return p1 + '...' + p3;\n      }\n    )\n    .replace(\n      /^(\\/\\/[ \\t]+==WindhawkModSettings==[ \\t]*$\\s*\\/\\*)(\\s*[\\s\\S]+?\\s*)(\\*\\/\\s*^\\/\\/[ \\t]+==\\/WindhawkModSettings==[ \\t]*)$/m,\n      (match, p1, p2, p3) => {\n        if ((p2 as string).includes('*/')) {\n          return p1 + p2 + p3;\n        }\n        return p1 + '...' + p3;\n      }\n    );\n}\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n  const textArea = document.createElement('textarea');\n  textArea.value = text;\n\n  // Avoid scrolling to bottom.\n  textArea.style.top = '0';\n  textArea.style.insetInlineStart = '0';\n  textArea.style.position = 'fixed';\n\n  document.body.appendChild(textArea);\n  textArea.focus();\n  textArea.select();\n\n  try {\n    const successful = document.execCommand('copy');\n    const msg = successful ? 'successful' : 'unsuccessful';\n    console.log('Copying text command was ' + msg);\n  } catch (err) {\n    console.error('Oops, unable to copy', err);\n  }\n\n  document.body.removeChild(textArea);\n}\n\ninterface Props {\n  source: string;\n}\n\nfunction ModDetailsSource({ source }: Props) {\n  const { t } = useTranslation();\n\n  const [isCollapsed, setIsCollapsed] = useState(true);\n  const collapsedSource = useMemo(() => collapseSource(source), [source]);\n  const currentSource = isCollapsed ? collapsedSource : source;\n\n  const highlightedHtml = useMemo(() => {\n    return Prism.highlight(currentSource, Prism.languages['cpp'], 'cpp');\n  }, [currentSource]);\n\n  return (\n    <ConfigProvider direction=\"ltr\">\n      <ConfigurationWrapper>\n        <span>{t('modDetails.code.collapseExtra')}</span>\n        <Switch\n          checked={isCollapsed}\n          onChange={(checked) => setIsCollapsed(checked)}\n        />\n      </ConfigurationWrapper>\n      <DropdownModal\n        menu={{\n          items: [\n            {\n              label: t('general.copy'),\n              key: 'copy',\n              onClick: () => {\n                dropdownModalDismissed();\n                // navigator.clipboard.writeText is forbidden in VSCode webviews.\n                const selection = window.getSelection();\n                if (selection && selection.type === 'Range') {\n                  document.execCommand('copy');\n                } else {\n                  fallbackCopyTextToClipboard(source);\n                }\n              },\n            },\n          ],\n        }}\n        trigger={['contextMenu']}\n      >\n        <SyntaxHighlighterWrapper>\n          <pre>\n            <code dangerouslySetInnerHTML={{ __html: highlightedHtml }} />\n          </pre>\n        </SyntaxHighlighterWrapper>\n      </DropdownModal>\n    </ConfigProvider>\n  );\n}\n\nexport default ModDetailsSource;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSourceDiff.tsx",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck: ignore TS errors due to lack of types for react-diff-view and refractor\n\nimport {\n  faArrowsAltV,\n  faLongArrowAltDown,\n  faLongArrowAltUp,\n} from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, ConfigProvider, Switch } from 'antd';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-cpp';\nimport { useCallback, useMemo, useState } from 'react';\nimport {\n  Decoration,\n  Diff,\n  getCollapsedLinesCountBetween,\n  Hunk,\n  markEdits,\n  parseDiff,\n  tokenize,\n  useMinCollapsedLines,\n  useSourceExpansion,\n} from 'react-diff-view';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { diffLines, formatLines } from 'unidiff';\n\nconst ConfigurationWrapper = styled.div`\n  margin-bottom: 20px;\n\n  > span {\n    vertical-align: middle;\n  }\n\n  > button {\n    margin-inline-start: 10px;\n  }\n`;\n\nconst DiffWrapper = styled.div`\n  direction: ltr;\n`;\n\nconst UnfoldButton = styled(Button)`\n  width: 100%;\n  border-radius: 0;\n`;\n\n// https://github.com/otakustay/react-diff-view/blob/f9e5f9f248f331598e5c9e7839fccb211efe43c2/site/components/DiffView/Unfold.js\n\nconst ICON_TYPE_MAPPING = {\n  up: faLongArrowAltUp,\n  down: faLongArrowAltDown,\n  none: faArrowsAltV,\n};\n\nconst Unfold = ({ start, end, direction, onExpand, ...props }) => {\n  const { t } = useTranslation();\n\n  const expand = useCallback(\n    () => onExpand(start, end),\n    [onExpand, start, end]\n  );\n\n  const iconType = ICON_TYPE_MAPPING[direction];\n  const lines = end - start;\n\n  return (\n    <Decoration {...props}>\n      <UnfoldButton onClick={expand}>\n        <FontAwesomeIcon icon={iconType} />\n        &nbsp;{t('modDetails.changes.expandLines', { count: lines })}\n      </UnfoldButton>\n    </Decoration>\n  );\n};\n\n// https://github.com/otakustay/react-diff-view/blob/f9e5f9f248f331598e5c9e7839fccb211efe43c2/site/components/DiffView/UnfoldCollapsed.js\n\nconst UnfoldCollapsed = ({\n  previousHunk,\n  currentHunk,\n  linesCount,\n  onExpand,\n}) => {\n  if (!currentHunk) {\n    const nextStart = previousHunk.oldStart + previousHunk.oldLines;\n    const collapsedLines = linesCount - nextStart + 1;\n\n    if (collapsedLines <= 0) {\n      return null;\n    }\n\n    return (\n      <>\n        {collapsedLines > 10 && (\n          <Unfold\n            direction=\"down\"\n            start={nextStart}\n            end={nextStart + 10}\n            onExpand={onExpand}\n          />\n        )}\n        <Unfold\n          direction=\"none\"\n          start={nextStart}\n          end={linesCount + 1}\n          onExpand={onExpand}\n        />\n      </>\n    );\n  }\n\n  const collapsedLines = getCollapsedLinesCountBetween(\n    previousHunk,\n    currentHunk\n  );\n\n  if (!previousHunk) {\n    if (!collapsedLines) {\n      return null;\n    }\n\n    const start = Math.max(currentHunk.oldStart - 10, 1);\n\n    return (\n      <>\n        <Unfold\n          direction=\"none\"\n          start={1}\n          end={currentHunk.oldStart}\n          onExpand={onExpand}\n        />\n        {collapsedLines > 10 && (\n          <Unfold\n            direction=\"up\"\n            start={start}\n            end={currentHunk.oldStart}\n            onExpand={onExpand}\n          />\n        )}\n      </>\n    );\n  }\n\n  const collapsedStart = previousHunk.oldStart + previousHunk.oldLines;\n  const collapsedEnd = currentHunk.oldStart;\n\n  if (collapsedLines < 10) {\n    return (\n      <Unfold\n        direction=\"none\"\n        start={collapsedStart}\n        end={collapsedEnd}\n        onExpand={onExpand}\n      />\n    );\n  }\n\n  return (\n    <>\n      <Unfold\n        direction=\"down\"\n        start={collapsedStart}\n        end={collapsedStart + 10}\n        onExpand={onExpand}\n      />\n      <Unfold\n        direction=\"none\"\n        start={collapsedStart}\n        end={collapsedEnd}\n        onExpand={onExpand}\n      />\n      <Unfold\n        direction=\"up\"\n        start={collapsedEnd - 10}\n        end={collapsedEnd}\n        onExpand={onExpand}\n      />\n    </>\n  );\n};\n\n// HAST (Hypertext Abstract Syntax Tree) node types\n// HAST format: https://github.com/syntax-tree/hast\ninterface HastText {\n  type: 'text';\n  value: string;\n}\n\ninterface HastElement {\n  type: 'element';\n  tagName: string;\n  properties: {\n    className: string[];\n  };\n  children: HastNode[];\n}\n\ntype HastNode = HastText | HastElement;\n\n// Convert Prism tokens to HAST (Hypertext Abstract Syntax Tree) format\nconst prismTokensToHast = (tokens: (string | Prism.Token)[]): HastNode[] => {\n  const result: HastNode[] = [];\n\n  for (const token of tokens) {\n    if (typeof token === 'string') {\n      result.push({ type: 'text', value: token });\n    } else if (token instanceof Prism.Token) {\n      const className = Array.isArray(token.type)\n        ? token.type.map((t) => `token ${t}`)\n        : [`token`, token.type].filter(Boolean);\n\n      // Handle nested tokens (token.content can be string or Token array)\n      let children: HastNode[];\n      if (typeof token.content === 'string') {\n        children = [{ type: 'text', value: token.content }];\n      } else if (Array.isArray(token.content)) {\n        children = prismTokensToHast(token.content);\n      } else {\n        children = [{ type: 'text', value: String(token.content) }];\n      }\n\n      result.push({\n        type: 'element',\n        tagName: 'span',\n        properties: { className },\n        children,\n      });\n    }\n  }\n\n  return result;\n};\n\n// https://codesandbox.io/s/react-diff-view-mark-edits-demo-8ndcl\n\nconst diffTokenize = (hunks, oldSource) => {\n  if (!hunks) {\n    return undefined;\n  }\n\n  // Create a refractor-compatible adapter for Prism\n  const prismAdapter = {\n    highlight: (code: string, language: string) => {\n      const grammar = Prism.languages[language];\n      if (!grammar) {\n        return [{ type: 'text', value: code }];\n      }\n      const tokens = Prism.tokenize(code, grammar);\n      return prismTokensToHast(tokens);\n    },\n  };\n\n  const options = {\n    highlight: true,\n    language: 'cpp',\n    refractor: prismAdapter,\n    oldSource,\n    enhancers: [markEdits(hunks, { type: 'block' })],\n  };\n\n  try {\n    return tokenize(hunks, options);\n  } catch {\n    return undefined;\n  }\n};\n\ninterface Props {\n  oldSource: string;\n  newSource: string;\n}\n\nfunction ModDetailsSource(props: Props) {\n  const { t } = useTranslation();\n\n  const { oldSource, newSource } = props;\n\n  const [splitView, setSplitView] = useState(true);\n\n  const { type, hunks } = useMemo(() => {\n    const diffText = formatLines(diffLines(oldSource, newSource), {\n      context: 3,\n    });\n    const [{ type, hunks }] = parseDiff(diffText, { nearbySequences: 'zip' });\n    return { type, hunks };\n  }, [newSource, oldSource]);\n\n  // https://github.com/otakustay/react-diff-view/blob/b9213164497211ef45393e5a57ed5866a5f27b2e/site/components/DiffView/index.js\n\n  const [hunksWithSourceExpanded, expandRange] = useSourceExpansion(\n    hunks,\n    oldSource\n  );\n  const hunksWithMinLinesCollapsed = useMinCollapsedLines(\n    0,\n    hunksWithSourceExpanded,\n    oldSource\n  );\n  const linesCount = oldSource ? oldSource.split('\\n').length : 0;\n\n  const tokens = diffTokenize(hunksWithMinLinesCollapsed, oldSource);\n\n  const renderHunk = (children, hunk, i, hunks) => {\n    const previousElement = children[children.length - 1];\n    const decorationElement = oldSource ? (\n      <UnfoldCollapsed\n        key={'decoration-' + hunk.content}\n        previousHunk={previousElement && previousElement.props.hunk}\n        currentHunk={hunk}\n        linesCount={linesCount}\n        onExpand={expandRange}\n      />\n    ) : (\n      <Decoration key={'decoration-' + hunk.content} hunk={hunk}>\n        {null}\n        {hunk.content}\n      </Decoration>\n    );\n    children.push(decorationElement);\n\n    const hunkElement = <Hunk key={'hunk-' + hunk.content} hunk={hunk} />;\n    children.push(hunkElement);\n\n    if (i === hunks.length - 1 && oldSource) {\n      const unfoldTailElement = (\n        <UnfoldCollapsed\n          key=\"decoration-tail\"\n          previousHunk={hunk}\n          linesCount={linesCount}\n          onExpand={expandRange}\n        />\n      );\n      children.push(unfoldTailElement);\n    }\n\n    return children;\n  };\n\n  return (\n    <ConfigProvider direction=\"ltr\">\n      <ConfigurationWrapper>\n        <span>{t('modDetails.changes.splitView')}</span>\n        <Switch\n          checked={splitView}\n          onChange={(checked) => setSplitView(checked)}\n        />\n      </ConfigurationWrapper>\n      <DiffWrapper>\n        <Diff\n          optimizeSelection\n          viewType={splitView ? 'split' : 'unified'}\n          diffType={type}\n          hunks={hunksWithMinLinesCollapsed}\n          oldSource={oldSource}\n          tokens={tokens}\n        >\n          {(hunks) => hunks.reduce(renderHunk, [])}\n        </Diff>\n      </DiffWrapper>\n    </ConfigProvider>\n  );\n}\n\nexport default ModDetailsSource;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModMetadataLine.tsx",
    "content": "import { faGithubAlt } from '@fortawesome/free-brands-svg-icons';\nimport {\n  faBullhorn,\n  faCrosshairs,\n  faHome,\n  faUser,\n  IconDefinition,\n} from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Badge, Button, ConfigProvider, Divider, Tooltip, Typography } from 'antd';\nimport { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { sanitizeUrl } from '../utils';\nimport { ModMetadata, RepositoryDetails } from '../webviewIPCMessages';\n\ntype TranslationFunction = ReturnType<typeof useTranslation>['t'];\n\nconst MetadataLineWrapper = styled.div<{ $singleLine?: boolean }>`\n  display: flex;\n  flex-wrap: ${({ $singleLine }) => ($singleLine ? 'nowrap' : 'wrap')};\n  margin-top: 4px;\n  margin-bottom: 2px;\n`;\n\nconst MetadataItemWrapper = styled.div<{ $width?: number; $singleLine?: boolean }>`\n  font-size: 14px;\n  font-weight: normal;\n  overflow: hidden;\n  ${({ $singleLine }) => $singleLine && `\n    // Don't shrink automatically; widths are managed manually.\n    flex-shrink: 0;\n  `}\n  ${({ $width }) => $width !== undefined && `\n    width: ${$width}px;\n  `}\n`;\n\nconst MetadataLineIcon = styled(FontAwesomeIcon)`\n  margin-inline-end: 3px;\n`;\n\nconst TextAsIconWrapper = styled.span`\n  font-size: 18px;\n  line-height: 18px;\n  user-select: none;\n`;\n\nconst VersionTooltipHeader = styled.div`\n  text-align: center;\n`;\n\nconst VersionTooltipGrid = styled.div`\n  display: grid;\n  grid-template-columns: auto auto;\n  gap: 4px 8px;\n  margin-top: 8px;\n`;\n\nconst VersionTooltipLabel = styled.div`\n  text-align: end;\n`;\n\nconst TooltipProcessList = styled.ul`\n  margin: 4px 0;\n  padding-inline-start: 20px;\n`;\n\nconst TooltipSection = styled.div<{ $hasMarginTop?: boolean }>`\n  ${({ $hasMarginTop }) => $hasMarginTop && 'margin-top: 8px;'}\n`;\n\nconst DisabledProcessItem = styled.span`\n  text-decoration: line-through;\n  opacity: 0.5;\n`;\n\nconst CustomProcessItem = styled.span`\n  color: #388ed3;\n`;\n\nconst TooltipNote = styled.div`\n  margin-top: 12px;\n  padding-top: 8px;\n  border-top: 1px solid rgba(255, 255, 255, 0.2);\n`;\n\nconst TooltipNoteList = styled.ul`\n  margin: 0;\n  padding-inline-start: 20px;\n  color: #388ed3;\n`;\n\nconst TooltipNoteText = styled.div`\n  color: rgba(255, 255, 255, 0.65);\n  font-size: 12px;\n`;\n\ninterface MetadataItem {\n  key: string;\n  icon: IconDefinition;\n  text: string;\n  tooltip: string | React.ReactNode;\n  showBadge?: boolean;\n}\n\ninterface CustomProcesses {\n  include: string[];\n  exclude: string[];\n  includeExcludeCustomOnly: boolean;\n  patternsMatchCriticalSystemProcesses: boolean;\n};\n\nfunction createVersionItem(\n  version: string,\n  t: TranslationFunction,\n  repositoryDetails?: RepositoryDetails\n): MetadataItem {\n  let tooltip: React.ReactNode = t('modDetails.header.modVersion');\n\n  if (repositoryDetails) {\n    const updatedDate = new Date(repositoryDetails.updated);\n\n    const formatDate = (date: Date) => {\n      return date.toLocaleDateString('en-US', {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n      });\n    };\n\n    tooltip = (\n      <>\n        <VersionTooltipHeader>{t('modDetails.header.modVersion')}</VersionTooltipHeader>\n        <VersionTooltipGrid>\n          <VersionTooltipLabel>{t('modDetails.header.lastUpdated')}:</VersionTooltipLabel>\n          <div>{formatDate(updatedDate)}</div>\n        </VersionTooltipGrid>\n      </>\n    );\n  }\n\n  return {\n    key: 'version',\n    icon: faBullhorn,\n    text: version,\n    tooltip,\n  };\n}\n\nfunction createAuthorTooltip(\n  modMetadata: ModMetadata,\n  t: TranslationFunction\n): React.ReactNode {\n  return (\n    <>\n      <div>{t('modDetails.header.modAuthor.title')}</div>\n      {(modMetadata.homepage ||\n        modMetadata.github ||\n        modMetadata.twitter) && (\n          <div>\n            {modMetadata.homepage && (\n              <Tooltip\n                title={t('modDetails.header.modAuthor.homepage')}\n                placement=\"bottom\"\n              >\n                <Button\n                  type=\"text\"\n                  icon={<FontAwesomeIcon icon={faHome} />}\n                  href={sanitizeUrl(modMetadata.homepage)}\n                />\n              </Tooltip>\n            )}\n            {modMetadata.github && (\n              <Tooltip\n                title={t('modDetails.header.modAuthor.github')}\n                placement=\"bottom\"\n              >\n                <Button\n                  type=\"text\"\n                  icon={<FontAwesomeIcon icon={faGithubAlt} />}\n                  href={sanitizeUrl(modMetadata.github)}\n                />\n              </Tooltip>\n            )}\n            {modMetadata.twitter && (\n              <Tooltip\n                title={t('modDetails.header.modAuthor.twitter')}\n                placement=\"bottom\"\n              >\n                <Button\n                  type=\"text\"\n                  icon={<TextAsIconWrapper>𝕏</TextAsIconWrapper>}\n                  href={sanitizeUrl(modMetadata.twitter)}\n                />\n              </Tooltip>\n            )}\n          </div>\n        )}\n    </>\n  );\n}\n\nfunction createAuthorItem(\n  author: string,\n  modMetadata: ModMetadata,\n  t: TranslationFunction\n): MetadataItem {\n  return {\n    key: 'author',\n    icon: faUser,\n    text: author,\n    tooltip: createAuthorTooltip(modMetadata, t),\n  };\n}\n\nfunction createProcessesItem(\n  modMetadata: ModMetadata,\n  t: TranslationFunction,\n  customProcesses?: CustomProcesses\n): MetadataItem {\n  const include = modMetadata.include || [];\n  const exclude = modMetadata.exclude || [];\n  let text: string;\n\n  if (include.length === 0) {\n    text = '';\n  } else if (include.length === 1 && exclude.length === 0) {\n    if (include[0] === '*') {\n      text = t('modDetails.header.processes.all');\n    } else {\n      text = include[0];\n    }\n  } else {\n    if (include.length === 1 && include[0] === '*') {\n      text = t('modDetails.header.processes.allBut', {\n        list: exclude.join(', '),\n      });\n    } else if (exclude.length > 0) {\n      text = t('modDetails.header.processes.except', {\n        included: include.join(', '),\n        excluded: exclude.join(', '),\n      });\n    } else {\n      text = include.join(', ');\n    }\n  }\n\n  const includeCustom = customProcesses?.include || [];\n  const excludeCustom = customProcesses?.exclude || [];\n  const isCustomOnly = customProcesses?.includeExcludeCustomOnly ?? false;\n  const patternsMatchCriticalSystemProcesses = customProcesses?.patternsMatchCriticalSystemProcesses ?? false;\n\n  const hasCustomLists = includeCustom.length > 0 || excludeCustom.length > 0 || isCustomOnly;\n\n  const tooltip = (\n    <>\n      <TooltipSection><strong>{t('modDetails.header.processes.tooltip.targets')}</strong></TooltipSection>\n      <TooltipProcessList>\n        {include.map((process, i) => {\n          return (\n            <li key={i}>\n              {isCustomOnly ? (\n                <DisabledProcessItem>{process}</DisabledProcessItem>\n              ) : (\n                process\n              )}\n            </li>\n          );\n        })}\n        {includeCustom.map((process, i) => {\n          return (\n            <li key={i}>\n              <CustomProcessItem>{process}</CustomProcessItem>\n            </li>\n          );\n        })}\n      </TooltipProcessList>\n      {(exclude.length > 0 || excludeCustom.length > 0) && (\n        <>\n          <TooltipSection $hasMarginTop><strong>{t('modDetails.header.processes.tooltip.excluded')}</strong></TooltipSection>\n          <TooltipProcessList>\n            {exclude.map((process, i) => {\n              return (\n                <li key={i}>\n                  {isCustomOnly ? (\n                    <DisabledProcessItem>{process}</DisabledProcessItem>\n                  ) : (\n                    process\n                  )}\n                </li>\n              );\n            })}\n          </TooltipProcessList>\n          <TooltipProcessList>\n            {excludeCustom.map((process, i) => {\n              return (\n                <li key={i}>\n                  <CustomProcessItem>{process}</CustomProcessItem>\n                </li>\n              );\n            })}\n          </TooltipProcessList>\n        </>\n      )}\n      {(hasCustomLists || patternsMatchCriticalSystemProcesses) && (\n        <TooltipNote>\n          <TooltipNoteList>\n            {hasCustomLists && (\n              <li><TooltipNoteText>{t('modDetails.header.processes.tooltip.customListsNote')}</TooltipNoteText></li>\n            )}\n            {patternsMatchCriticalSystemProcesses && (\n              <li><TooltipNoteText>{t('modDetails.header.processes.tooltip.patternsMatchCriticalSystemProcessesNote')}</TooltipNoteText></li>\n            )}\n          </TooltipNoteList>\n        </TooltipNote>\n      )}\n    </>\n  );\n\n  return {\n    key: 'processes',\n    icon: faCrosshairs,\n    text,\n    tooltip,\n    showBadge: hasCustomLists || patternsMatchCriticalSystemProcesses,\n  };\n}\n\nfunction buildMetadataItems(\n  modMetadata: ModMetadata,\n  t: TranslationFunction,\n  customProcesses?: CustomProcesses,\n  repositoryDetails?: RepositoryDetails\n): MetadataItem[] {\n  const items: MetadataItem[] = [];\n\n  if (modMetadata.version) {\n    items.push(createVersionItem(modMetadata.version, t, repositoryDetails));\n  }\n\n  if (modMetadata.author) {\n    items.push(createAuthorItem(modMetadata.author, modMetadata, t));\n  }\n\n  if ((modMetadata?.include || []).length > 0 ||\n    (customProcesses?.include || []).length > 0) {\n    items.push(createProcessesItem(modMetadata, t, customProcesses));\n  }\n\n  return items;\n}\n\n// Width constraints for single-line mode\nconst PROCESSES_MIN_WIDTH = 50;\n\ninterface ItemWidths {\n  [key: string]: number | undefined;\n}\n\n/**\n * Calculates constrained widths for metadata items based on priority:\n * 1. Version: capped at half of container width, never shrinks\n * 2. Processes: shrinks first, down to PROCESSES_MIN_WIDTH\n * 3. Author: shrinks last, gets remaining space\n */\nfunction calculateItemWidths(\n  containerWidth: number,\n  naturalWidths: Record<string, number>\n): ItemWidths {\n  const totalNaturalWidth = Object.values(naturalWidths).reduce(\n    (sum, width) => sum + width, 0);\n\n  // If everything fits naturally, no constraints needed\n  if (totalNaturalWidth <= containerWidth) {\n    return {};\n  }\n\n  const versionNatural = naturalWidths['version'] || 0;\n  const authorNatural = naturalWidths['author'] || 0;\n  const processesNatural = naturalWidths['processes'] || 0;\n\n  // Version: capped at max, never shrinks below natural (up to cap)\n  const versionWidth = Math.min(versionNatural, containerWidth / 2);\n  let remainingWidth = containerWidth - versionWidth;\n\n  // Processes: shrinks first, down to minimum\n  const processesWidth = Math.max(\n    PROCESSES_MIN_WIDTH,\n    Math.min(processesNatural, remainingWidth - authorNatural)\n  );\n  remainingWidth -= processesWidth;\n\n  // Author: gets remaining space (may shrink significantly)\n  const authorWidth = Math.max(0, remainingWidth);\n\n  return {\n    'version': versionWidth,\n    'author': authorWidth,\n    'processes': processesWidth,\n  };\n}\n\ninterface Props {\n  modMetadata: ModMetadata;\n  singleLine?: boolean;\n  customProcesses?: CustomProcesses;\n  repositoryDetails?: RepositoryDetails;\n}\n\nfunction ModMetadataLine(props: Props) {\n  const { t } = useTranslation();\n  const { modMetadata, singleLine, customProcesses, repositoryDetails } = props;\n\n  const { direction } = useContext(ConfigProvider.ConfigContext);\n\n  const metadataItems = useMemo(\n    () => buildMetadataItems(\n      modMetadata,\n      t,\n      customProcesses,\n      repositoryDetails\n    ),\n    [modMetadata, t, customProcesses, repositoryDetails]\n  );\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n  const textRefs = useRef<{ [key: string]: HTMLElement | null }>({});\n  const [itemWidths, setItemWidths] = useState<ItemWidths>({});\n  const [textWidths, setTextWidths] = useState<ItemWidths>({});\n\n  const measureAndCalculate = useCallback(() => {\n    if (!singleLine || !containerRef.current) {\n      setItemWidths({});\n      setTextWidths({});\n      return;\n    }\n\n    // Skip if element is not visible\n    const containerRect = containerRef.current.getBoundingClientRect();\n    if (containerRect.width === 0 || containerRect.height === 0) {\n      return;\n    }\n\n    const containerWidth = containerRect.width;\n\n    const naturalWidths: Record<string, number> = {};\n    const naturalTextWidths: Record<string, number> = {};\n    for (const item of metadataItems) {\n      const el = itemRefs.current[item.key];\n      const textEl = textRefs.current[item.key];\n      if (el && textEl) {\n        // Temporarily set width to 'auto' to measure natural width, including\n        // the hidden overflow text, then restore. Similar to el.scrollWidth, but\n        // fractional, which is important for accurate total width and for\n        // avoiding ellipsis.\n        const prevElWidth = el.style.width;\n        const prevTextElWidth = textEl.style.width;\n        el.style.width = 'auto';\n        textEl.style.width = 'auto';\n        naturalWidths[item.key] = el.getBoundingClientRect().width;\n        naturalTextWidths[item.key] = textEl.getBoundingClientRect().width;\n        el.style.width = prevElWidth;\n        textEl.style.width = prevTextElWidth;\n      } else {\n        naturalWidths[item.key] = 0;\n        naturalTextWidths[item.key] = 0;\n      }\n    }\n\n    const calculatedWidths = calculateItemWidths(\n      containerWidth,\n      naturalWidths,\n    );\n\n    // Calculate text widths based on the difference between item and text\n    // natural widths\n    const calculatedTextWidths: ItemWidths = {};\n    for (const item of metadataItems) {\n      const itemWidth = calculatedWidths[item.key];\n      if (itemWidth !== undefined) {\n        const widthDifference = naturalWidths[item.key] - naturalTextWidths[item.key];\n        calculatedTextWidths[item.key] = itemWidth - widthDifference;\n      }\n    }\n\n    setItemWidths(calculatedWidths);\n    setTextWidths(calculatedTextWidths);\n  }, [singleLine, metadataItems]);\n\n  // Use useLayoutEffect for synchronous measurement before paint\n  useLayoutEffect(() => {\n    if (!singleLine) {\n      return;\n    }\n\n    // Initial measurement\n    measureAndCalculate();\n  }, [singleLine, measureAndCalculate]);\n\n  useEffect(() => {\n    if (!singleLine) {\n      return;\n    }\n\n    // Set up ResizeObserver for container size changes\n    const resizeObserver = new ResizeObserver(() => {\n      measureAndCalculate();\n    });\n\n    if (containerRef.current) {\n      resizeObserver.observe(containerRef.current);\n    }\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, [singleLine, measureAndCalculate]);\n\n  if (metadataItems.length === 0) {\n    return null;\n  }\n\n  return (\n    <MetadataLineWrapper ref={containerRef} $singleLine={singleLine}>\n      {metadataItems.map((item, i) => (\n        <MetadataItemWrapper\n          key={item.key}\n          ref={(el) => {\n            itemRefs.current[item.key] = el;\n          }}\n          $width={itemWidths[item.key]}\n          $singleLine={singleLine}\n        >\n          {/* Single-line: divider before item (except first) */}\n          {singleLine && i !== 0 && <Divider type=\"vertical\" />}\n\n          <Tooltip\n            title={item.tooltip}\n            placement=\"bottom\"\n          >\n            <Typography.Text\n              ref={(el) => {\n                textRefs.current[item.key] = el;\n              }}\n              style={{ width: textWidths[item.key] }}\n              ellipsis={true}\n            >\n              <Badge\n                dot={item.showBadge}\n                offset={[direction === 'rtl' ? 4 : -4, 4]}\n                color=\"#177ddc\"\n              >\n                <MetadataLineIcon icon={item.icon} />\n              </Badge>\n              {item.text}\n            </Typography.Text>\n          </Tooltip>\n\n          {/* Multi-line: divider after item (except last) */}\n          {!singleLine && i < metadataItems.length - 1 && <Divider type=\"vertical\" />}\n        </MetadataItemWrapper>\n      ))}\n    </MetadataLineWrapper>\n  );\n}\n\nexport default ModMetadataLine;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModPreview.tsx",
    "content": "import { Empty, message } from 'antd';\nimport { produce } from 'immer';\nimport { useCallback, useEffect, useLayoutEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useParams } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { useGetInstalledMods, useSetNewModConfig } from '../webviewIPC';\nimport { ModConfig, ModMetadata } from '../webviewIPCMessages';\nimport { mockModsBrowserLocalInitialMods } from './mockData';\nimport ModDetails from './ModDetails';\n\nconst CenteredContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n`;\n\nconst CenteredContent = styled.div`\n  margin: auto;\n\n  // Without this the centered content looks too low.\n  padding-bottom: 10vh;\n`;\n\ntype ModDetailsType = {\n  metadata: ModMetadata | null;\n  config: ModConfig | null;\n  updateAvailable?: boolean;\n  userRating?: number;\n};\n\ninterface Props {\n  ContentWrapper: React.ComponentType<\n    React.ComponentPropsWithoutRef<'div'> & { $hidden?: boolean }\n  >;\n}\n\nfunction ModPreview({ ContentWrapper }: Props) {\n  const { t } = useTranslation();\n\n  useLayoutEffect(() => {\n    const header = document.querySelector('header');\n    if (header) {\n      header.style.display = 'none';\n    }\n  }, []);\n\n  const { modId: displayedModId } = useParams<{\n    modId: string;\n  }>();\n\n  const [installedMods, setInstalledMods] = useState<Record<\n    string,\n    ModDetailsType\n  > | null>(mockModsBrowserLocalInitialMods);\n\n  const { getInstalledMods } = useGetInstalledMods(\n    useCallback((data) => {\n      setInstalledMods(data.installedMods);\n    }, [])\n  );\n\n  useEffect(() => {\n    getInstalledMods({});\n  }, [getInstalledMods]);\n\n  useSetNewModConfig(\n    useCallback(\n      (data) => {\n        const { modId, config: newConfig } = data;\n        if (installedMods) {\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              if (draft[modId]?.config) {\n                draft[modId].config = {\n                  ...draft[modId].config,\n                  ...newConfig,\n                };\n              }\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const disabledAction = useCallback(() => {\n    message.info(t('modPreview.actionUnavailable'), 1);\n  }, [t]);\n\n  if (!installedMods || !displayedModId) {\n    return null;\n  }\n\n  if (!installedMods[displayedModId]) {\n    return (\n      <CenteredContainer>\n        <CenteredContent>\n          <Empty\n            image={Empty.PRESENTED_IMAGE_SIMPLE}\n            description={t('modPreview.notCompiled')}\n          />\n        </CenteredContent>\n      </CenteredContainer>\n    );\n  }\n\n  return (\n    <ContentWrapper>\n      <ModDetails\n        modId={displayedModId}\n        installedModDetails={installedMods[displayedModId]}\n        goBack={disabledAction}\n        updateMod={disabledAction}\n        forkModFromSource={disabledAction}\n        compileMod={disabledAction}\n        enableMod={disabledAction}\n        editMod={disabledAction}\n        forkMod={disabledAction}\n        deleteMod={disabledAction}\n        updateModRating={disabledAction}\n      />\n    </ContentWrapper>\n  );\n}\n\nexport default ModPreview;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModsBrowserLocal.tsx",
    "content": "import { faCaretDown, faFilter, faGripVertical, faHdd, faList, faSearch, faStar } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Badge, Button, Empty, Modal, Spin, Switch, Table, Tag, Tooltip } from 'antd';\nimport { ItemType } from 'antd/lib/menu/hooks/useItems';\nimport { produce } from 'immer';\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useBlocker, useNavigate, useParams } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport EllipsisText from '../components/EllipsisText';\nimport { DropdownModal, dropdownModalDismissed, InputWithContextMenu } from '../components/InputWithContextMenu';\nimport {\n  editMod,\n  forkMod,\n  useCompileMod,\n  useDeleteMod,\n  useEnableMod,\n  useGetFeaturedMods,\n  useGetInstalledMods,\n  useInstallMod,\n  useSetNewModConfig,\n  useUpdateInstalledModsDetails,\n  useUpdateModRating,\n} from '../webviewIPC';\nimport {\n  ModConfig,\n  ModMetadata,\n  RepositoryDetails,\n} from '../webviewIPCMessages';\nimport localModIcon from './assets/local-mod-icon.svg';\nimport {\n  mockModsBrowserLocalFeaturedMods,\n  mockModsBrowserLocalInitialMods,\n} from './mockData';\nimport ModCard from './ModCard';\nimport ModDetails from './ModDetails';\n\nconst SectionHeader = styled.div`\n  display: flex;\n  justify-content: space-between;\n  align-items: start;\n  margin-top: 20px;\n`;\n\nconst SectionIcon = styled(FontAwesomeIcon)`\n  margin-inline-end: 3px;\n`;\n\nconst SearchFilterContainer = styled.div`\n  display: flex;\n  gap: 10px;\n  margin-top: 12px;\n  margin-bottom: 20px;\n`;\n\nconst SearchFilterInput = styled(InputWithContextMenu)`\n  > .ant-input-prefix {\n    margin-inline-end: 8px;\n  }\n`;\n\nconst IconButton = styled(Button)`\n  padding-inline-start: 0;\n  padding-inline-end: 0;\n  min-width: 40px;\n`;\n\nconst ModsContainer = styled.div<{ $extraBottomPadding?: boolean }>`\n  ${({ $extraBottomPadding }) => css`\n    padding-bottom: ${$extraBottomPadding ? 70 : 20}px;\n  `}\n`;\n\nconst ModsGrid = styled.div`\n  display: grid;\n  grid-template-columns: repeat(\n    auto-fill,\n    calc(min(400px - 20px * 4 / 3, 100%))\n  );\n  gap: 20px;\n  justify-content: center;\n`;\n\nconst ModNameLink = styled.a`\n  color: var(--vscode-textLink-foreground, #3794ff);\n\n  &:hover {\n    color: var(--vscode-textLink-activeForeground, #4daafc);\n  }\n`;\n\nconst TableActionsButton = styled(Button)`\n  padding: 0 6px;\n  height: 22px;\n`;\n\nconst ModLocalIcon = styled.img`\n  height: 20px;\n  margin-inline-start: 8px;\n  cursor: help;\n`;\n\nconst ExploreModsButton = styled(Button)`\n  height: 100%;\n  font-size: 22px;\n`;\n\nconst ProgressSpin = styled(Spin)`\n  display: block;\n  margin-inline-start: auto;\n  margin-inline-end: auto;\n  font-size: 32px;\n`;\n\ntype ModDetailsType = {\n  metadata: ModMetadata | null;\n  config: ModConfig | null;\n  updateAvailable: boolean;\n  userRating: number;\n};\n\ntype FeaturedModDetailsType = {\n  metadata: ModMetadata;\n  details: RepositoryDetails;\n};\n\ninterface Props {\n  ContentWrapper: React.ComponentType<\n    React.ComponentPropsWithoutRef<'div'> & { $hidden?: boolean }\n  >;\n}\n\nfunction ModsBrowserLocal({ ContentWrapper }: Props) {\n  const { t } = useTranslation();\n\n  const navigate = useNavigate();\n\n  const { modType: displayedModType, modId: displayedModId } = useParams<{\n    modType: string;\n    modId: string;\n  }>();\n\n  const [installedMods, setInstalledMods] = useState<Record<\n    string,\n    ModDetailsType\n  > | null>(mockModsBrowserLocalInitialMods);\n\n  const [featuredMods, setFeaturedMods] = useState<\n    Record<string, FeaturedModDetailsType> | undefined | null\n  >(mockModsBrowserLocalFeaturedMods || undefined);\n\n  const [filterText, setFilterText] = useState('');\n  const [filterOptions, setFilterOptions] = useState<Set<string>>(new Set());\n  const [filterDropdownOpen, setFilterDropdownOpen] = useState(false);\n  const [confirmModalOpen, setConfirmModalOpen] = useState(false);\n  const [viewMode, setViewMode] = useState<'grid' | 'list'>(() => {\n    try {\n      const saved = localStorage.getItem('modsBrowserViewMode');\n      return saved === 'list' ? 'list' : 'grid';\n    } catch {\n      return 'grid';\n    }\n  });\n\n  const handleViewModeChange = useCallback((mode: 'grid' | 'list') => {\n    setViewMode(mode);\n    try {\n      localStorage.setItem('modsBrowserViewMode', mode);\n    } catch {\n      // Ignore localStorage errors\n    }\n  }, []);\n\n  const installedModsFilteredAndSorted = useMemo(() => {\n    if (!installedMods) {\n      return installedMods;\n    }\n\n    const filterWords = filterText.toLowerCase().split(/\\s+/)\n      .map(word => word.trim())\n      .filter(word => word.length > 0);\n    return Object.entries(installedMods)\n      .filter(([modId, mod]) => {\n        // Apply text filter\n        if (filterWords.length > 0) {\n          const textMatch = filterWords.every((filterWord) => {\n            return (\n              modId.toLowerCase().includes(filterWord) ||\n              mod.metadata?.name?.toLowerCase().includes(filterWord) ||\n              mod.metadata?.description?.toLowerCase().includes(filterWord)\n            );\n          });\n          if (!textMatch) {\n            return false;\n          }\n        }\n\n        // Apply category filters - if none selected, show all\n        if (filterOptions.size === 0) {\n          return true;\n        }\n\n        // Use AND logic - mod must match ALL selected filters\n        if (filterOptions.has('enabled')) {\n          if (!mod.config || mod.config.disabled) {\n            return false;\n          }\n        }\n\n        if (filterOptions.has('disabled')) {\n          if (mod.config && !mod.config.disabled) {\n            return false;\n          }\n        }\n\n        if (filterOptions.has('update-available')) {\n          if (!mod.updateAvailable) {\n            return false;\n          }\n        }\n\n        return true;\n      })\n      .sort((a, b) => {\n        const [modIdA, modA] = a;\n        const [modIdB, modB] = b;\n        const modAIsLocal = modIdA.startsWith('local@');\n        const modBIsLocal = modIdB.startsWith('local@');\n\n        if (modAIsLocal !== modBIsLocal) {\n          return modAIsLocal ? -1 : 1;\n        }\n\n        const modATitle = (modA.metadata?.name || modIdA).toLowerCase();\n        const modBTitle = (modB.metadata?.name || modIdB).toLowerCase();\n\n        if (modATitle < modBTitle) {\n          return -1;\n        } else if (modATitle > modBTitle) {\n          return 1;\n        }\n\n        if (modIdA < modIdB) {\n          return -1;\n        } else if (modIdA > modIdB) {\n          return 1;\n        }\n\n        return 0;\n      });\n  }, [installedMods, filterText, filterOptions]);\n\n  const featuredModsShuffled = useMemo(() => {\n    if (!featuredMods) {\n      return featuredMods;\n    }\n\n    // https://stackoverflow.com/a/6274381\n    /**\n     * Shuffles array in place. ES6 version\n     * @param {Array} a items An array containing the items.\n     */\n    const shuffleArray = <T,>(a: T[]): T[] => {\n      for (let i = a.length - 1; i > 0; i--) {\n        const j = Math.floor(Math.random() * (i + 1));\n        [a[i], a[j]] = [a[j], a[i]];\n      }\n      return a;\n    };\n\n    return shuffleArray(Object.entries(featuredMods));\n  }, [featuredMods]);\n\n  const featuredModsFilteredAndSorted = useMemo(() => {\n    if (!featuredModsShuffled) {\n      return featuredModsShuffled;\n    }\n\n    const maxFeaturedModsToShow = 5;\n\n    // Return a random sample of non-installed mods.\n    const notInstalled = featuredModsShuffled.filter(\n      ([modId, mod]) => !installedMods?.[modId]\n    );\n    return notInstalled.slice(0, maxFeaturedModsToShow);\n  }, [featuredModsShuffled, installedMods]);\n\n  const { devModeOptOut } = useContext(AppUISettingsContext);\n\n  const { getInstalledMods } = useGetInstalledMods(\n    useCallback((data) => {\n      setInstalledMods(data.installedMods);\n    }, [])\n  );\n\n  const { getFeaturedMods } = useGetFeaturedMods(\n    useCallback((data) => {\n      setFeaturedMods(data.featuredMods);\n    }, [])\n  );\n\n  useEffect(() => {\n    getInstalledMods({});\n    getFeaturedMods({});\n  }, [getInstalledMods, getFeaturedMods]);\n\n  useUpdateInstalledModsDetails(\n    useCallback(\n      (data) => {\n        if (installedMods) {\n          const installedModsDetails = data.details;\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              for (const [modId, updatedDetails] of Object.entries(\n                installedModsDetails\n              )) {\n                const details = draft[modId];\n                if (details) {\n                  const { updateAvailable, userRating } = updatedDetails;\n                  details.updateAvailable = updateAvailable;\n                  details.userRating = userRating;\n                }\n              }\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  useSetNewModConfig(\n    useCallback(\n      (data) => {\n        const { modId, config: newConfig } = data;\n        if (installedMods) {\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              if (draft[modId]?.config) {\n                draft[modId].config = {\n                  ...draft[modId].config,\n                  ...newConfig,\n                };\n              }\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const { installMod, installModPending, installModContext } = useInstallMod<{\n    updating: boolean;\n  }>(\n    useCallback(\n      (data) => {\n        const { modId, installedModDetails } = data;\n        if (installedModDetails && installedMods) {\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              const { metadata, config } = installedModDetails;\n              draft[modId] = draft[modId] || {};\n              draft[modId].metadata = metadata;\n              draft[modId].config = config;\n              draft[modId].updateAvailable = false;\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const { compileMod, compileModPending } = useCompileMod(\n    useCallback(\n      (data) => {\n        const { modId, compiledModDetails } = data;\n        if (compiledModDetails && installedMods) {\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              const { metadata, config } = compiledModDetails;\n              draft[modId] = draft[modId] || {};\n              draft[modId].metadata = metadata;\n              draft[modId].config = config;\n              draft[modId].updateAvailable = false;\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const { enableMod } = useEnableMod(\n    useCallback(\n      (data) => {\n        if (data.succeeded && installedMods) {\n          const modId = data.modId;\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              const config = draft[modId].config;\n              if (config) {\n                config.disabled = !data.enabled;\n              }\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const { deleteMod } = useDeleteMod(\n    useCallback(\n      (data) => {\n        if (data.succeeded && installedMods) {\n          const modId = data.modId;\n\n          if (displayedModType === 'local' && displayedModId === modId) {\n            navigate('/', { replace: true });\n          }\n\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              delete draft[modId];\n            })\n          );\n        }\n      },\n      [displayedModId, displayedModType, installedMods, navigate]\n    )\n  );\n\n  const { updateModRating } = useUpdateModRating(\n    useCallback(\n      (data) => {\n        if (data.succeeded && installedMods) {\n          const modId = data.modId;\n          setInstalledMods(\n            produce(installedMods, (draft) => {\n              draft[modId].userRating = data.rating;\n            })\n          );\n        }\n      },\n      [installedMods]\n    )\n  );\n\n  const [detailsButtonClicked, setDetailsButtonClicked] = useState(false);\n\n  const handleFilterChange = (key: string) => {\n    setFilterOptions((prevOptions) => {\n      const newOptions = new Set(prevOptions);\n\n      // Handle mutually exclusive filters\n      if (key === 'enabled' && newOptions.has('disabled')) {\n        newOptions.delete('disabled');\n      } else if (key === 'disabled' && newOptions.has('enabled')) {\n        newOptions.delete('enabled');\n      }\n\n      // Toggle the clicked option\n      if (newOptions.has(key)) {\n        newOptions.delete(key);\n      } else {\n        newOptions.add(key);\n      }\n\n      return newOptions;\n    });\n  };\n\n  const handleClearFilters = () => {\n    setFilterOptions(new Set());\n  };\n\n  // Block all navigation when modal is open\n  const modalIsOpen = installModPending || compileModPending || confirmModalOpen;\n\n  useBlocker(({ currentLocation, nextLocation }) => {\n    return modalIsOpen && currentLocation.pathname !== nextLocation.pathname;\n  });\n\n  if (!installedMods || !installedModsFilteredAndSorted) {\n    return null;\n  }\n\n  const noInstalledMods = Object.keys(installedMods).length === 0;\n  const noFilteredResults = installedModsFilteredAndSorted.length === 0 && !noInstalledMods;\n\n  return (\n    <>\n      <ContentWrapper $hidden={!!displayedModId}>\n        <ModsContainer $extraBottomPadding={!devModeOptOut}>\n          <SectionHeader>\n            <h2>\n              <SectionIcon icon={faHdd} /> {t('home.installedMods.title')}\n            </h2>\n          </SectionHeader>\n          {!noInstalledMods && (\n            <SearchFilterContainer>\n              <SearchFilterInput\n                prefix={<FontAwesomeIcon icon={faSearch} />}\n                placeholder={t('modSearch.placeholder') as string}\n                allowClear\n                value={filterText}\n                onChange={(e) => setFilterText(e.target.value)}\n              />\n              <DropdownModal\n                placement=\"bottomRight\"\n                trigger={['click']}\n                arrow={true}\n                open={filterDropdownOpen}\n                onOpenChange={setFilterDropdownOpen}\n                menu={{\n                  items: [\n                    {\n                      label: t('home.filter.enabled'),\n                      key: 'enabled',\n                    },\n                    {\n                      label: t('home.filter.disabled'),\n                      key: 'disabled',\n                    },\n                    {\n                      label: t('home.filter.updateAvailable'),\n                      key: 'update-available',\n                    },\n                    {\n                      type: 'divider',\n                    },\n                    {\n                      label: t('home.filter.clearFilters'),\n                      key: 'clear-filters',\n                    },\n                  ],\n                  selectedKeys: Array.from(filterOptions),\n                  onClick: (e) => {\n                    if (e.key === 'clear-filters') {\n                      dropdownModalDismissed();\n                      handleClearFilters();\n                      setFilterDropdownOpen(false);\n                    } else {\n                      handleFilterChange(e.key);\n                      // Keep dropdown open for filter changes\n                    }\n                  },\n                }}\n              >\n                <IconButton\n                  type={filterOptions.size > 0 ? 'primary' : undefined}\n                >\n                  <FontAwesomeIcon icon={faFilter} />\n                </IconButton>\n              </DropdownModal>\n              <IconButton\n                onClick={() => handleViewModeChange(viewMode === 'grid' ? 'list' : 'grid')}\n              >\n                <FontAwesomeIcon icon={viewMode === 'grid' ? faList : faGripVertical} />\n              </IconButton>\n            </SearchFilterContainer>\n          )}\n          {noInstalledMods ? (\n            <Empty\n              image={Empty.PRESENTED_IMAGE_SIMPLE}\n              description={t('home.installedMods.noMods')}\n            >\n              <Button type=\"primary\" onClick={() => navigate('/mods-browser')}>\n                {t('home.browse')}\n              </Button>\n            </Empty>\n          ) : noFilteredResults ? (\n            <Empty\n              image={Empty.PRESENTED_IMAGE_SIMPLE}\n              description={t('modSearch.noResults')}\n            />\n          ) : viewMode === 'grid' ? (\n            <ModsGrid>\n              {installedModsFilteredAndSorted.map(([modId, mod]) => (\n                <ModCard\n                  key={modId}\n                  ribbonText={\n                    mod.updateAvailable\n                      ? (t('mod.updateAvailable') as string)\n                      : undefined\n                  }\n                  title={mod.metadata?.name || modId.replace(/^local@/, '')}\n                  isLocal={modId.startsWith('local@')}\n                  description={mod.metadata?.description}\n                  buttons={[\n                    {\n                      text: t('mod.details'),\n                      onClick: () => {\n                        setDetailsButtonClicked(true);\n                        navigate('/mods/local/' + modId);\n                      },\n                      badge: (mod.config?.loggingEnabled || mod.config?.debugLoggingEnabled) ? {\n                        tooltip: t('mod.loggingEnabledInAdvancedTab') as string,\n                      } : undefined,\n                    },\n                    {\n                      text: t('mod.remove'),\n                      confirmText: t('mod.removeConfirm') as string,\n                      confirmOkText: t('mod.removeConfirmOk') as string,\n                      confirmCancelText: t('mod.removeConfirmCancel') as string,\n                      confirmIsDanger: true,\n                      onClick: () => deleteMod({ modId }),\n                    },\n                  ]}\n                  switch={{\n                    title: mod.config\n                      ? undefined\n                      : (t('mod.notCompiled') as string),\n                    checked: mod.config ? !mod.config.disabled : false,\n                    disabled: !mod.config,\n                    onChange: (checked) =>\n                      enableMod({ modId, enable: checked }),\n                  }}\n                />\n              ))}\n            </ModsGrid>\n          ) : (\n            <Table\n              bordered\n              dataSource={installedModsFilteredAndSorted.map(([modId, mod]) => ({\n                key: modId,\n                modId,\n                name: mod.metadata?.name || modId.replace(/^local@/, ''),\n                description: mod.metadata?.description,\n                author: mod.metadata?.author,\n                version: mod.metadata?.version,\n                isLocal: modId.startsWith('local@'),\n                updateAvailable: mod.updateAvailable,\n                disabled: mod.config ? mod.config.disabled : true,\n                notCompiled: !mod.config,\n                mod,\n              }))}\n              columns={[\n                {\n                  title: '',\n                  key: 'actions',\n                  width: 50,\n                  align: 'center',\n                  render: (_, record) => {\n                    const isLocal = record.isLocal;\n                    const menuItems: ItemType[] = [];\n\n                    // Compile action (if not compiled)\n                    if (record.notCompiled) {\n                      menuItems.push({\n                        label: t('mod.compile'),\n                        key: 'compile',\n                        onClick: () => {\n                          dropdownModalDismissed();\n                          compileMod({ modId: record.modId });\n                        },\n                      });\n                    }\n\n                    // Enable/Disable action (if compiled)\n                    if (!record.notCompiled) {\n                      menuItems.push({\n                        label: record.disabled\n                          ? t('mod.enable')\n                          : t('mod.disable'),\n                        key: 'toggle-enable',\n                        onClick: () => {\n                          dropdownModalDismissed();\n                          enableMod({ modId: record.modId, enable: record.disabled });\n                        },\n                      });\n                    }\n\n                    // Divider before dev actions\n                    if (menuItems.length > 0) {\n                      menuItems.push({ type: 'divider' });\n                    }\n\n                    // Edit action (local mods only)\n                    if (isLocal) {\n                      menuItems.push({\n                        label: t('mod.edit'),\n                        key: 'edit',\n                        onClick: () => {\n                          dropdownModalDismissed();\n                          editMod({ modId: record.modId });\n                        },\n                      });\n                    }\n\n                    // Fork action\n                    menuItems.push({\n                      label: t('mod.fork'),\n                      key: 'fork',\n                      onClick: () => {\n                        dropdownModalDismissed();\n                        forkMod({ modId: record.modId });\n                      },\n                    });\n\n                    // Divider before remove\n                    menuItems.push({ type: 'divider' });\n\n                    // Remove action\n                    menuItems.push({\n                      label: t('mod.remove'),\n                      key: 'remove',\n                      danger: true,\n                      onClick: () => {\n                        dropdownModalDismissed();\n                        setConfirmModalOpen(true);\n                        Modal.confirm({\n                          title: t('mod.removeConfirm'),\n                          okText: t('mod.removeConfirmOk'),\n                          cancelText: t('mod.removeConfirmCancel'),\n                          okButtonProps: { danger: true },\n                          onOk: () => {\n                            setConfirmModalOpen(false);\n                            deleteMod({ modId: record.modId });\n                          },\n                          onCancel: () => {\n                            setConfirmModalOpen(false);\n                          },\n                          closable: true,\n                          maskClosable: true,\n                        });\n                      },\n                    });\n\n                    const hasLogging = record.mod.config?.loggingEnabled || record.mod.config?.debugLoggingEnabled;\n                    const actionsButton = (\n                      <DropdownModal\n                        menu={{ items: menuItems }}\n                        trigger={['click']}\n                      >\n                        <TableActionsButton>\n                          <FontAwesomeIcon icon={faCaretDown} />\n                        </TableActionsButton>\n                      </DropdownModal>\n                    );\n\n                    if (hasLogging) {\n                      return (\n                        <Badge\n                          dot\n                          title={t('mod.loggingEnabledInAdvancedTab') as string}\n                          status=\"warning\"\n                        >\n                          {actionsButton}\n                        </Badge>\n                      );\n                    }\n\n                    return actionsButton;\n                  },\n                },\n                {\n                  title: t('home.installedMods.grid.name'),\n                  dataIndex: 'name',\n                  key: 'name',\n                  width: '30%',\n                  sorter: (a, b) => a.name.localeCompare(b.name),\n                  render: (name, record) => (\n                    <>\n                      <ModNameLink\n                        onClick={() => {\n                          setDetailsButtonClicked(true);\n                          navigate('/mods/local/' + record.modId);\n                        }}\n                      >\n                        {name}\n                      </ModNameLink>\n                      {record.updateAvailable && (\n                        <Tag color=\"warning\" style={{ marginInlineStart: 8, userSelect: 'none' }}>\n                          {t('mod.updateAvailable')}\n                        </Tag>\n                      )}\n                      {record.isLocal && (\n                        <Tooltip title={t('mod.editedLocally')} placement=\"bottom\">\n                          <ModLocalIcon src={localModIcon} />\n                        </Tooltip>\n                      )}\n                    </>\n                  ),\n                },\n                {\n                  title: t('home.installedMods.grid.description'),\n                  dataIndex: 'description',\n                  key: 'description',\n                  render: (description) => (\n                    <EllipsisText tooltipPlacement=\"bottom\">{description || '-'}</EllipsisText>\n                  ),\n                  ellipsis: { showTitle: false },\n                },\n                {\n                  title: t('home.installedMods.grid.author'),\n                  dataIndex: 'author',\n                  key: 'author',\n                  width: '12%',\n                  sorter: (a, b) => (a.author || '').localeCompare(b.author || ''),\n                  render: (author) => author || '-',\n                },\n                {\n                  title: t('home.installedMods.grid.version'),\n                  dataIndex: 'version',\n                  key: 'version',\n                  width: '8%',\n                  sorter: (a, b) => {\n                    const versionA = a.version || '';\n                    const versionB = b.version || '';\n                    return versionA.localeCompare(versionB, undefined, { numeric: true, sensitivity: 'base' });\n                  },\n                  render: (version) => version || '-',\n                },\n                {\n                  title: t('home.installedMods.grid.status'),\n                  key: 'status',\n                  width: 80,\n                  align: 'center',\n                  sorter: (a, b) => Number(a.disabled) - Number(b.disabled),\n                  render: (_, record) => (\n                    <Switch\n                      checked={!record.disabled}\n                      disabled={record.notCompiled}\n                      onChange={(checked) =>\n                        enableMod({ modId: record.modId, enable: checked })\n                      }\n                      title={\n                        record.notCompiled\n                          ? (t('mod.notCompiled') as string)\n                          : undefined\n                      }\n                    />\n                  ),\n                },\n              ]}\n              pagination={false}\n              size=\"middle\"\n              showSorterTooltip={false}\n              style={{ wordBreak: 'break-word' }}\n            />\n          )}\n          <SectionHeader>\n            <h2>\n              <SectionIcon icon={faStar} /> {t('home.featuredMods.title')}\n            </h2>\n          </SectionHeader>\n          {featuredModsFilteredAndSorted === undefined ? (\n            <ProgressSpin size=\"large\" tip={t('general.loading')} />\n          ) : featuredModsFilteredAndSorted === null ? (\n            <Empty\n              image={Empty.PRESENTED_IMAGE_SIMPLE}\n              description={t('general.loadingFailed')}\n            >\n              <Button type=\"primary\" onClick={() => navigate('/mods-browser')}>\n                {t('home.browse')}\n              </Button>\n            </Empty>\n          ) : featuredModsFilteredAndSorted.length === 0 ? (\n            <Empty\n              image={Empty.PRESENTED_IMAGE_SIMPLE}\n              description={t('home.featuredMods.noMods')}\n            >\n              <Button type=\"primary\" onClick={() => navigate('/mods-browser')}>\n                {t('home.browse')}\n              </Button>\n            </Empty>\n          ) : (\n            <ModsGrid>\n              {featuredModsFilteredAndSorted.map(([modId, mod]) => (\n                <ModCard\n                  key={modId}\n                  ribbonText={\n                    installedMods[modId]\n                      ? installedMods[modId].metadata?.version !==\n                        mod.metadata.version\n                        ? (t('mod.updateAvailable') as string)\n                        : (t('mod.installed') as string)\n                      : undefined\n                  }\n                  title={mod.metadata.name || modId}\n                  description={mod.metadata.description}\n                  modMetadata={mod.metadata}\n                  repositoryDetails={mod.details}\n                  buttons={[\n                    {\n                      text: t('mod.details'),\n                      onClick: () => {\n                        setDetailsButtonClicked(true);\n                        navigate('/mods/featured/' + modId);\n                      },\n                    },\n                  ]}\n                />\n              ))}\n              <ExploreModsButton\n                size=\"large\"\n                onClick={() => navigate('/mods-browser')}\n              >\n                {t('home.featuredMods.explore')}\n              </ExploreModsButton>\n            </ModsGrid>\n          )}\n        </ModsContainer>\n      </ContentWrapper>\n      {displayedModId && (\n        <ContentWrapper>\n          {(displayedModType === 'local' && installedMods[displayedModId]) ? (\n            <ModDetails\n              modId={displayedModId}\n              installedModDetails={installedMods[displayedModId]}\n              loadRepositoryData={installedMods[displayedModId].updateAvailable}\n              goBack={() => {\n                // If we ever clicked on Details, go back.\n                // Otherwise, we probably arrived from a different location,\n                // go straight to the mods page.\n                if (detailsButtonClicked) {\n                  navigate(-1);\n                } else {\n                  navigate('/');\n                }\n              }}\n              updateMod={(modSource, disabled) =>\n                installMod(\n                  { modId: displayedModId, modSource, disabled },\n                  { updating: true }\n                )\n              }\n              forkModFromSource={(modSource) =>\n                forkMod({ modId: displayedModId, modSource })\n              }\n              compileMod={() => compileMod({ modId: displayedModId })}\n              enableMod={(enable) =>\n                enableMod({ modId: displayedModId, enable })\n              }\n              editMod={() => editMod({ modId: displayedModId })}\n              forkMod={() => forkMod({ modId: displayedModId })}\n              deleteMod={() => deleteMod({ modId: displayedModId })}\n              updateModRating={(newRating) =>\n                updateModRating({ modId: displayedModId, rating: newRating })\n              }\n            />\n          ) : (\n            <ModDetails\n              modId={displayedModId}\n              installedModDetails={installedMods[displayedModId]}\n              repositoryModDetails={featuredMods?.[displayedModId]}\n              loadRepositoryData={!displayedModId.startsWith('local@')}\n              goBack={() => {\n                // If we ever clicked on Details, go back.\n                // Otherwise, we probably arrived from a different location,\n                // go straight to the mods page.\n                if (detailsButtonClicked) {\n                  navigate(-1);\n                } else {\n                  navigate('/');\n                }\n              }}\n              installMod={(modSource) =>\n                installMod({ modId: displayedModId, modSource: modSource })\n              }\n              updateMod={(modSource, disabled) =>\n                installMod(\n                  { modId: displayedModId, modSource, disabled },\n                  { updating: true }\n                )\n              }\n              forkModFromSource={(modSource) =>\n                forkMod({ modId: displayedModId, modSource })\n              }\n              compileMod={() => compileMod({ modId: displayedModId })}\n              enableMod={(enable) =>\n                enableMod({ modId: displayedModId, enable })\n              }\n              editMod={() => editMod({ modId: displayedModId })}\n              forkMod={() => forkMod({ modId: displayedModId })}\n              deleteMod={() => deleteMod({ modId: displayedModId })}\n              updateModRating={(newRating) =>\n                updateModRating({ modId: displayedModId, rating: newRating })\n              }\n            />\n          )}\n        </ContentWrapper>\n      )}\n      {(installModPending || compileModPending) && (\n        <Modal open={true} closable={false} footer={null}>\n          <ProgressSpin\n            size=\"large\"\n            tip={\n              installModPending\n                ? installModContext?.updating\n                  ? t('general.updating')\n                  : t('general.installing')\n                : compileModPending\n                  ? t('general.compiling')\n                  : ''\n            }\n          />\n        </Modal>\n      )}\n    </>\n  );\n}\n\nexport default ModsBrowserLocal;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModsBrowserOnline.tsx",
    "content": "import { faFilter, faSearch, faSort } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Badge, Button, Empty, Modal, Result, Spin } from 'antd';\nimport { produce } from 'immer';\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport { useBlocker, useNavigate, useParams } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport { DropdownModal, dropdownModalDismissed, InputWithContextMenu } from '../components/InputWithContextMenu';\nimport {\n  editMod,\n  forkMod,\n  useCompileMod,\n  useDeleteMod,\n  useEnableMod,\n  useGetRepositoryMods,\n  useInstallMod,\n  useUpdateInstalledModsDetails,\n  useUpdateModRating,\n} from '../webviewIPC';\nimport {\n  ModConfig,\n  ModMetadata,\n  RepositoryDetails,\n} from '../webviewIPCMessages';\nimport { mockModsBrowserOnlineRepositoryMods, useMockData } from './mockData';\nimport ModCard from './ModCard';\nimport ModDetails from './ModDetails';\n\nconst CenteredContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n`;\n\nconst CenteredContent = styled.div`\n  margin: auto;\n\n  // Without this the centered content looks too low.\n  padding-bottom: 10vh;\n`;\n\nconst SearchFilterContainer = styled.div`\n  display: flex;\n  gap: 10px;\n  margin: 20px 0;\n`;\n\nconst SearchFilterInput = styled(InputWithContextMenu)`\n  > .ant-input-prefix {\n    margin-inline-end: 8px;\n  }\n`;\n\nconst IconButton = styled(Button)`\n  padding-inline-start: 0;\n  padding-inline-end: 0;\n  min-width: 40px;\n`;\n\nconst ModsContainer = styled.div<{ $extraBottomPadding?: boolean }>`\n  ${({ $extraBottomPadding }) => css`\n    padding-bottom: ${$extraBottomPadding ? 70 : 20}px;\n  `}\n`;\n\nconst ResultsMessageWrapper = styled.div`\n  margin-top: 85px;\n`;\n\nconst ModsGrid = styled.div`\n  display: grid;\n  grid-template-columns: repeat(\n    auto-fill,\n    calc(min(400px - 20px * 4 / 3, 100%))\n  );\n  gap: 20px;\n  justify-content: center;\n`;\n\nconst ProgressSpin = styled(Spin)`\n  display: block;\n  margin-inline-start: auto;\n  margin-inline-end: auto;\n  font-size: 32px;\n`;\n\nconst FilterItemLabelWrapper = styled.span`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 12px;\n`;\n\ninterface FilterItemLabelProps {\n  label: string;\n  count?: number;\n}\n\nconst FilterItemLabel = ({ label, count }: FilterItemLabelProps) => (\n  <FilterItemLabelWrapper>\n    <span>{label}</span>\n    {count !== undefined && (\n      <Badge\n        count={count}\n        color='rgba(255, 255, 255, 0.08)'\n        style={{\n          color: 'rgba(255, 255, 255, 0.65)',\n          boxShadow: 'none',\n          height: '18px',\n          lineHeight: '18px',\n          minWidth: '18px',\n          padding: '0 6px',\n        }}\n      />\n    )}\n  </FilterItemLabelWrapper>\n);\n\ntype ModDetailsType = {\n  repository: {\n    metadata: ModMetadata;\n    details: RepositoryDetails;\n  };\n  installed?: {\n    metadata: ModMetadata | null;\n    config: ModConfig | null;\n    userRating?: number;\n  };\n};\n\nconst normalizeProcessName = (process: string): string => {\n  return process.includes('\\\\')\n    ? process.substring(process.lastIndexOf('\\\\') + 1)\n    : process;\n};\n\nconst extractItemsWithCounts = (\n  repositoryMods: Record<string, { repository: { metadata: ModMetadata } }> | null,\n  keyPrefix: string,\n  extractItems: (mod: { repository: { metadata: ModMetadata } }) => string[]\n) => {\n  if (!repositoryMods) {\n    return [];\n  }\n\n  const itemCounts = new Map<string, { count: number; casings: Map<string, number> }>();\n\n  for (const mod of Object.values(repositoryMods)) {\n    const items = extractItems(mod);\n    for (const item of items) {\n      if (!item) {\n        continue;\n      }\n\n      const lowerItem = item.toLowerCase();\n      const existing = itemCounts.get(lowerItem);\n      if (existing) {\n        existing.count++;\n        const casingCount = existing.casings.get(item);\n        existing.casings.set(item, (casingCount || 0) + 1);\n      } else {\n        const casings = new Map<string, number>();\n        casings.set(item, 1);\n        itemCounts.set(lowerItem, { count: 1, casings });\n      }\n    }\n  }\n\n  return Array.from(itemCounts.entries())\n    .map(([lowerName, { count, casings }]) => {\n      // Find the most common casing, or first lexicographically if tied\n      const displayName = Array.from(casings.entries()).reduce(\n        (best, [casing, casingCount]) => {\n          if (casingCount > best.count || (casingCount === best.count && casing < best.casing)) {\n            return { casing, count: casingCount };\n          }\n          return best;\n        },\n        { casing: '', count: 0 }\n      ).casing;\n\n      return {\n        name: displayName,\n        count,\n        key: `${keyPrefix}:${lowerName}`,\n        lowerName,\n      };\n    })\n    .sort((a, b) => {\n      if (b.count !== a.count) {\n        return b.count - a.count;\n      }\n      return a.lowerName.localeCompare(b.lowerName);\n    });\n};\n\nconst extractAuthorsWithCounts = (\n  repositoryMods: Record<string, { repository: { metadata: ModMetadata } }> | null\n) => {\n  return extractItemsWithCounts(\n    repositoryMods,\n    'author',\n    (mod) => mod.repository.metadata.author ? [mod.repository.metadata.author] : []\n  );\n};\n\nconst extractProcessesWithCounts = (\n  repositoryMods: Record<string, { repository: { metadata: ModMetadata } }> | null\n) => {\n  return extractItemsWithCounts(\n    repositoryMods,\n    'process',\n    (mod) => {\n      const processes = mod.repository.metadata.include || [];\n      const validProcesses: string[] = [];\n\n      for (const process of processes) {\n        if (!process) {\n          continue;\n        }\n\n        // Include \"*\" as-is\n        if (process === '*') {\n          validProcesses.push('*');\n        } else if (process.includes('*') || process.includes('?')) {\n          // Skip other wildcard patterns\n          continue;\n        } else {\n          validProcesses.push(normalizeProcessName(process));\n        }\n      }\n\n      return validProcesses;\n    }\n  );\n};\n\nconst useFilterState = () => {\n  const [filterText, setFilterText] = useState('');\n  const [filterOptions, setFilterOptions] = useState<Set<string>>(new Set());\n  const [filterDropdownOpen, setFilterDropdownOpen] = useState(false);\n  const [showAllAuthors, setShowAllAuthors] = useState(false);\n  const [showAllProcesses, setShowAllProcesses] = useState(false);\n\n  const handleFilterChange = useCallback((key: string) => {\n    setFilterOptions((prevOptions) => {\n      const newOptions = new Set(prevOptions);\n\n      // Handle mutually exclusive filters for installation status\n      if (key === 'installed' && newOptions.has('not-installed')) {\n        newOptions.delete('not-installed');\n      } else if (key === 'not-installed' && newOptions.has('installed')) {\n        newOptions.delete('installed');\n      }\n\n      // Toggle the clicked option\n      if (newOptions.has(key)) {\n        newOptions.delete(key);\n      } else {\n        newOptions.add(key);\n      }\n\n      return newOptions;\n    });\n  }, []);\n\n  const handleClearFilters = useCallback(() => {\n    setFilterOptions(new Set());\n    setShowAllAuthors(false);\n    setShowAllProcesses(false);\n  }, []);\n\n  return {\n    filterText,\n    setFilterText,\n    filterOptions,\n    filterDropdownOpen,\n    setFilterDropdownOpen,\n    showAllAuthors,\n    setShowAllAuthors,\n    showAllProcesses,\n    setShowAllProcesses,\n    handleFilterChange,\n    handleClearFilters,\n  };\n};\n\ninterface Props {\n  ContentWrapper: React.ComponentType<\n    React.ComponentPropsWithoutRef<'div'> & { $hidden?: boolean }\n  >;\n}\n\nfunction ModsBrowserOnline({ ContentWrapper }: Props) {\n  const { t } = useTranslation();\n\n  const navigate = useNavigate();\n\n  const { modId: displayedModId } = useParams<{ modId: string }>();\n\n  const [initialDataPending, setInitialDataPending] = useState(true);\n  const [repositoryMods, setRepositoryMods] = useState<Record<\n    string,\n    ModDetailsType\n  > | null>(mockModsBrowserOnlineRepositoryMods);\n\n  const [sortingOrder, setSortingOrder] = useState('popular-top-rated');\n\n  // Filter state\n  const {\n    filterText,\n    setFilterText,\n    filterOptions,\n    filterDropdownOpen,\n    setFilterDropdownOpen,\n    showAllAuthors,\n    setShowAllAuthors,\n    showAllProcesses,\n    setShowAllProcesses,\n    handleFilterChange,\n    handleClearFilters,\n  } = useFilterState();\n\n  // Extract filter data\n  const authorFilters = useMemo(\n    () => extractAuthorsWithCounts(repositoryMods),\n    [repositoryMods]\n  );\n\n  const processFilters = useMemo(\n    () => extractProcessesWithCounts(repositoryMods),\n    [repositoryMods]\n  );\n\n  const installedModsFilteredAndSorted = useMemo(() => {\n    const filterWords = filterText.toLowerCase().split(/\\s+/)\n      .map(word => word.trim())\n      .filter(word => word.length > 0);\n    return Object.entries(repositoryMods || {})\n      .filter(([modId, mod]) => {\n        // Apply text filter\n        if (filterWords.length > 0) {\n          const textMatch = filterWords.every((filterWord) => {\n            return (\n              modId.toLowerCase().includes(filterWord) ||\n              mod.repository.metadata.name?.toLowerCase().includes(filterWord) ||\n              mod.repository.metadata.description\n                ?.toLowerCase()\n                .includes(filterWord)\n            );\n          });\n          if (!textMatch) {\n            return false;\n          }\n        }\n\n        // Apply category filters - if none selected, show all\n        if (filterOptions.size === 0) {\n          return true;\n        }\n\n        // Collect selected authors and processes\n        const selectedAuthors: string[] = [];\n        const selectedProcesses: string[] = [];\n        let installedFilter: boolean | null = null;\n\n        for (const key of filterOptions) {\n          if (key.startsWith('author:')) {\n            selectedAuthors.push(key.substring('author:'.length));\n          } else if (key.startsWith('process:')) {\n            selectedProcesses.push(key.substring('process:'.length));\n          } else if (key === 'installed') {\n            installedFilter = true;\n          } else if (key === 'not-installed') {\n            installedFilter = false;\n          }\n        }\n\n        // Check installation status filter\n        if (installedFilter !== null) {\n          const isInstalled = mod.installed !== undefined;\n          if (isInstalled !== installedFilter) {\n            return false;\n          }\n        }\n\n        // Check author filter (OR logic within authors)\n        if (selectedAuthors.length > 0) {\n          const author = mod.repository.metadata.author?.toLowerCase();\n          if (!author || !selectedAuthors.some(a => a === author)) {\n            return false;\n          }\n        }\n\n        // Check process filter (OR logic within processes)\n        if (selectedProcesses.length > 0) {\n          const processes = (mod.repository.metadata.include || [])\n            .map(p => normalizeProcessName(p).toLowerCase())\n            .filter(p => p); // Remove empty strings\n          if (!selectedProcesses.some(sp => processes.includes(sp))) {\n            return false;\n          }\n        }\n\n        return true;\n      })\n      .sort((a, b) => {\n        const [modIdA, modA] = a;\n        const [modIdB, modB] = b;\n\n        switch (sortingOrder) {\n          case 'popular-top-rated':\n            if (\n              modB.repository.details.defaultSorting <\n              modA.repository.details.defaultSorting\n            ) {\n              return -1;\n            } else if (\n              modB.repository.details.defaultSorting >\n              modA.repository.details.defaultSorting\n            ) {\n              return 1;\n            }\n            break;\n\n          case 'popular':\n            if (modB.repository.details.users < modA.repository.details.users) {\n              return -1;\n            } else if (\n              modB.repository.details.users > modA.repository.details.users\n            ) {\n              return 1;\n            }\n            break;\n\n          case 'top-rated':\n            if (\n              modB.repository.details.rating < modA.repository.details.rating\n            ) {\n              return -1;\n            } else if (\n              modB.repository.details.rating > modA.repository.details.rating\n            ) {\n              return 1;\n            }\n            break;\n\n          case 'newest':\n            if (\n              modB.repository.details.published <\n              modA.repository.details.published\n            ) {\n              return -1;\n            } else if (\n              modB.repository.details.published >\n              modA.repository.details.published\n            ) {\n              return 1;\n            }\n            break;\n\n          case 'last-updated':\n            if (\n              modB.repository.details.updated < modA.repository.details.updated\n            ) {\n              return -1;\n            } else if (\n              modB.repository.details.updated > modA.repository.details.updated\n            ) {\n              return 1;\n            }\n            break;\n\n          case 'alphabetical':\n            // Nothing to do.\n            break;\n        }\n\n        // Fallback sorting: Sort by name, then id.\n\n        const modATitle = (\n          modA.repository.metadata.name || modIdA\n        ).toLowerCase();\n        const modBTitle = (\n          modB.repository.metadata.name || modIdB\n        ).toLowerCase();\n\n        if (modATitle < modBTitle) {\n          return -1;\n        } else if (modATitle > modBTitle) {\n          return 1;\n        }\n\n        if (modIdA < modIdB) {\n          return -1;\n        } else if (modIdA > modIdB) {\n          return 1;\n        }\n\n        return 0;\n      });\n  }, [repositoryMods, sortingOrder, filterText, filterOptions]);\n\n  const { devModeOptOut } = useContext(AppUISettingsContext);\n\n  const { getRepositoryMods } = useGetRepositoryMods(\n    useCallback((data) => {\n      setRepositoryMods(data.mods);\n      setInitialDataPending(false);\n    }, [])\n  );\n\n  useEffect(() => {\n    let pending = false;\n    if (!useMockData) {\n      getRepositoryMods({});\n      pending = true;\n    }\n\n    setInitialDataPending(pending);\n  }, [getRepositoryMods]);\n\n  useUpdateInstalledModsDetails(\n    useCallback(\n      (data) => {\n        if (repositoryMods) {\n          const installedModsDetails = data.details;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              for (const [modId, updatedDetails] of Object.entries(\n                installedModsDetails\n              )) {\n                const details = draft[modId]?.installed;\n                if (details) {\n                  const { userRating } = updatedDetails;\n                  details.userRating = userRating;\n                }\n              }\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const { installMod, installModPending, installModContext } = useInstallMod<{\n    updating: boolean;\n  }>(\n    useCallback(\n      (data) => {\n        const { installedModDetails } = data;\n        if (installedModDetails && repositoryMods) {\n          const modId = data.modId;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              draft[modId].installed = installedModDetails;\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const { compileMod, compileModPending } = useCompileMod(\n    useCallback(\n      (data) => {\n        const { compiledModDetails } = data;\n        if (compiledModDetails && repositoryMods) {\n          const modId = data.modId;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              draft[modId].installed = compiledModDetails;\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const { enableMod } = useEnableMod(\n    useCallback(\n      (data) => {\n        if (data.succeeded && repositoryMods) {\n          const modId = data.modId;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              const config = draft[modId].installed?.config;\n              if (config) {\n                config.disabled = !data.enabled;\n              }\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const { deleteMod } = useDeleteMod(\n    useCallback(\n      (data) => {\n        if (data.succeeded && repositoryMods) {\n          const modId = data.modId;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              delete draft[modId].installed;\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const { updateModRating } = useUpdateModRating(\n    useCallback(\n      (data) => {\n        if (data.succeeded && repositoryMods) {\n          const modId = data.modId;\n          setRepositoryMods(\n            produce(repositoryMods, (draft) => {\n              const installed = draft[modId].installed;\n              if (installed) {\n                installed.userRating = data.rating;\n              }\n            })\n          );\n        }\n      },\n      [repositoryMods]\n    )\n  );\n\n  const [infiniteScrollLoadedItems, setInfiniteScrollLoadedItems] =\n    useState(30);\n\n  const resetInfiniteScrollLoadedItems = () => setInfiniteScrollLoadedItems(30);\n\n  const [detailsButtonClicked, setDetailsButtonClicked] = useState(false);\n\n  // Block all navigation when modal is open\n  const modalIsOpen = installModPending || compileModPending;\n\n  useBlocker(({ currentLocation, nextLocation }) => {\n    return modalIsOpen && currentLocation.pathname !== nextLocation.pathname;\n  });\n\n  if (initialDataPending) {\n    return (\n      <CenteredContainer>\n        <CenteredContent>\n          <ProgressSpin size=\"large\" tip={t('general.loading')} />\n        </CenteredContent>\n      </CenteredContainer>\n    );\n  }\n\n  if (!repositoryMods) {\n    return (\n      <CenteredContainer>\n        <CenteredContent>\n          <Result\n            status=\"error\"\n            title={t('general.loadingFailedTitle')}\n            subTitle={t('general.loadingFailedSubtitle')}\n            extra={[\n              <Button\n                type=\"primary\"\n                key=\"try-again\"\n                onClick={() => getRepositoryMods({})}\n              >\n                {t('general.tryAgain')}\n              </Button>,\n            ]}\n          />\n        </CenteredContent>\n      </CenteredContainer>\n    );\n  }\n\n  return (\n    <>\n      <ContentWrapper\n        id=\"ModsBrowserOnline-ContentWrapper\"\n        $hidden={!!displayedModId}\n      >\n        <ModsContainer $extraBottomPadding={!devModeOptOut}>\n          <SearchFilterContainer>\n            <SearchFilterInput\n              prefix={<FontAwesomeIcon icon={faSearch} />}\n              placeholder={t('modSearch.placeholder') as string}\n              allowClear\n              value={filterText}\n              onChange={(e) => {\n                resetInfiniteScrollLoadedItems();\n                setFilterText(e.target.value);\n              }}\n            />\n            <DropdownModal\n              placement=\"bottomRight\"\n              trigger={['click']}\n              arrow={true}\n              open={filterDropdownOpen}\n              onOpenChange={setFilterDropdownOpen}\n              menu={{\n                style: { maxHeight: '400px', overflowY: 'overlay' },\n                items: [\n                  {\n                    type: 'group',\n                    label: t('explore.filter.installationStatus'),\n                    children: [\n                      {\n                        label: t('explore.filter.installed'),\n                        key: 'installed',\n                      },\n                      {\n                        label: t('explore.filter.notInstalled'),\n                        key: 'not-installed',\n                      },\n                    ],\n                  },\n                  {\n                    type: 'group',\n                    label: t('explore.filter.author'),\n                    children: [\n                      ...(showAllAuthors ? authorFilters : authorFilters.slice(0, 5)).map(author => ({\n                        label: <FilterItemLabel label={author.name} count={author.count} />,\n                        key: author.key,\n                      })),\n                      ...(authorFilters.length > 5 && !showAllAuthors ? [{\n                        label: t('explore.filter.showMore'),\n                        key: 'show-more-authors',\n                      }] : []),\n                    ],\n                  },\n                  {\n                    type: 'group',\n                    label: t('explore.filter.process'),\n                    children: [\n                      ...(showAllProcesses ? processFilters : processFilters.slice(0, 5)).map(process => ({\n                        label: <FilterItemLabel label={process.name} count={process.count} />,\n                        key: process.key,\n                      })),\n                      ...(processFilters.length > 5 && !showAllProcesses ? [{\n                        label: t('explore.filter.showMore'),\n                        key: 'show-more-processes',\n                      }] : []),\n                    ],\n                  },\n                  {\n                    type: 'divider',\n                  },\n                  {\n                    label: t('explore.filter.clearFilters'),\n                    key: 'clear-filters',\n                  },\n                ],\n                selectedKeys: Array.from(filterOptions),\n                onClick: (e) => {\n                  if (e.key === 'clear-filters') {\n                    dropdownModalDismissed();\n                    handleClearFilters();\n                    setFilterDropdownOpen(false);\n                    resetInfiniteScrollLoadedItems();\n                  } else if (e.key === 'show-more-authors') {\n                    setShowAllAuthors(true);\n                  } else if (e.key === 'show-more-processes') {\n                    setShowAllProcesses(true);\n                  } else {\n                    handleFilterChange(e.key);\n                    resetInfiniteScrollLoadedItems();\n                    // Keep dropdown open for filter changes\n                  }\n                },\n              }}\n            >\n              <IconButton\n                type={filterOptions.size > 0 ? 'primary' : undefined}\n              >\n                <FontAwesomeIcon icon={faFilter} />\n              </IconButton>\n            </DropdownModal>\n            <DropdownModal\n              placement=\"bottomRight\"\n              trigger={['click']}\n              arrow={true}\n              menu={{\n                items: [\n                  {\n                    label: t('explore.search.popularAndTopRated'),\n                    key: 'popular-top-rated',\n                  },\n                  { label: t('explore.search.popular'), key: 'popular' },\n                  { label: t('explore.search.topRated'), key: 'top-rated' },\n                  { label: t('explore.search.newest'), key: 'newest' },\n                  {\n                    label: t('explore.search.lastUpdated'),\n                    key: 'last-updated',\n                  },\n                  {\n                    label: t('explore.search.alphabeticalOrder'),\n                    key: 'alphabetical',\n                  },\n                ],\n                selectedKeys: [sortingOrder],\n                onClick: (e) => {\n                  dropdownModalDismissed();\n                  resetInfiniteScrollLoadedItems();\n                  setSortingOrder(e.key);\n                },\n              }}\n            >\n              <IconButton>\n                <FontAwesomeIcon icon={faSort} />\n              </IconButton>\n            </DropdownModal>\n          </SearchFilterContainer>\n          {installedModsFilteredAndSorted.length === 0 ? (\n            <ResultsMessageWrapper>\n              <Empty\n                image={Empty.PRESENTED_IMAGE_SIMPLE}\n                description={t('modSearch.noResults')}\n              />\n            </ResultsMessageWrapper>\n          ) : (\n            <InfiniteScroll\n              dataLength={infiniteScrollLoadedItems}\n              next={() =>\n                setInfiniteScrollLoadedItems(\n                  Math.min(\n                    infiniteScrollLoadedItems + 30,\n                    installedModsFilteredAndSorted.length\n                  )\n                )\n              }\n              hasMore={\n                infiniteScrollLoadedItems < installedModsFilteredAndSorted.length\n              }\n              loader={null}\n              scrollableTarget=\"ModsBrowserOnline-ContentWrapper\"\n              style={{ overflow: 'visible' }} // for the ribbon\n            >\n              <ModsGrid>\n                {installedModsFilteredAndSorted\n                  .slice(0, infiniteScrollLoadedItems)\n                  .map(([modId, mod]) => (\n                    <ModCard\n                      key={modId}\n                      ribbonText={\n                        mod.installed\n                          ? mod.installed.metadata?.version !==\n                            mod.repository.metadata.version\n                            ? (t('mod.updateAvailable') as string)\n                            : (t('mod.installed') as string)\n                          : undefined\n                      }\n                      title={mod.repository.metadata.name || modId}\n                      description={mod.repository.metadata.description}\n                      modMetadata={mod.repository.metadata}\n                      repositoryDetails={mod.repository.details}\n                      buttons={[\n                        {\n                          text: t('mod.details'),\n                          onClick: () => {\n                            setDetailsButtonClicked(true);\n                            navigate('/mods-browser/' + modId);\n                          },\n                        },\n                      ]}\n                    />\n                  ))}\n              </ModsGrid>\n            </InfiniteScroll>\n          )}\n        </ModsContainer>\n      </ContentWrapper>\n      {displayedModId && (\n        <ContentWrapper>\n          <ModDetails\n            modId={displayedModId}\n            installedModDetails={repositoryMods[displayedModId].installed}\n            repositoryModDetails={repositoryMods[displayedModId].repository}\n            goBack={() => {\n              // If we ever clicked on Details, go back.\n              // Otherwise, we probably arrived from a different location,\n              // go straight to the mods page.\n              if (detailsButtonClicked) {\n                navigate(-1);\n              } else {\n                navigate('/mods-browser');\n              }\n            }}\n            installMod={(modSource) =>\n              installMod({ modId: displayedModId, modSource })\n            }\n            updateMod={(modSource, disabled) =>\n              installMod(\n                { modId: displayedModId, modSource, disabled },\n                { updating: true }\n              )\n            }\n            forkModFromSource={(modSource) =>\n              forkMod({ modId: displayedModId, modSource })\n            }\n            compileMod={() => compileMod({ modId: displayedModId })}\n            enableMod={(enable) => enableMod({ modId: displayedModId, enable })}\n            editMod={() => editMod({ modId: displayedModId })}\n            forkMod={() => forkMod({ modId: displayedModId })}\n            deleteMod={() => deleteMod({ modId: displayedModId })}\n            updateModRating={(newRating) =>\n              updateModRating({ modId: displayedModId, rating: newRating })\n            }\n          />\n        </ContentWrapper>\n      )}\n      {(installModPending || compileModPending) && (\n        <Modal open={true} closable={false} footer={null}>\n          <ProgressSpin\n            size=\"large\"\n            tip={\n              installModPending\n                ? installModContext?.updating\n                  ? t('general.updating')\n                  : t('general.installing')\n                : compileModPending\n                  ? t('general.compiling')\n                  : ''\n            }\n          />\n        </Modal>\n      )}\n    </>\n  );\n}\n\nexport default ModsBrowserOnline;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Panel.tsx",
    "content": "import React, { useEffect } from 'react';\nimport { createHashRouter, Outlet, RouterProvider, useNavigate } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\nimport About from './About';\nimport AppHeader from './AppHeader';\nimport CreateNewModButton from './CreateNewModButton';\nimport ModPreview from './ModPreview';\nimport ModsBrowserLocal from './ModsBrowserLocal';\nimport ModsBrowserOnline from './ModsBrowserOnline';\nimport SafeModeIndicator from './SafeModeIndicator';\nimport Settings from './Settings';\n\nconst PanelContainer = styled.div`\n  display: flex;\n  height: 100vh;\n  overflow: hidden;\n  flex-direction: column;\n`;\n\nconst ContentContainerScroll = styled.div<{ $hidden?: boolean }>`\n  ${({ $hidden }) => css`\n    display: ${$hidden ? 'none' : 'flex'};\n  `}\n  position: relative; // needed by nested elements that use position: absolute\n  flex: 1;\n  overflow: overlay;\n`;\n\nconst ContentContainer = styled.div`\n  width: 100%;\n  height: 100%;\n  max-width: var(--app-max-width);\n  margin: 0 auto;\n  padding: 0 20px;\n\n  // Disable margin-collapsing: https://stackoverflow.com/a/47351270\n  display: flex;\n  flex-direction: column;\n`;\n\nfunction ContentWrapper({\n  ref,\n  ...props\n}: React.ComponentProps<'div'> & { $hidden?: boolean }) {\n  return (\n    <ContentContainerScroll ref={ref} {...props}>\n      <ContentContainer>{props.children}</ContentContainer>\n    </ContentContainerScroll>\n  );\n}\n\nfunction ContentWrapperWithOutlet() {\n  return (\n    <ContentWrapper>\n      <Outlet />\n    </ContentWrapper>\n  );\n}\n\nfunction KeyboardNavigationHandler() {\n  const navigate = useNavigate();\n\n  useEffect(() => {\n    const handleKeyDown = (event: KeyboardEvent) => {\n      // Alt+Left for back navigation\n      if (event.altKey && event.key === 'ArrowLeft') {\n        event.preventDefault();\n        navigate(-1);\n      }\n      // Alt+Right for forward navigation\n      else if (event.altKey && event.key === 'ArrowRight') {\n        event.preventDefault();\n        navigate(1);\n      }\n    };\n\n    window.addEventListener('keydown', handleKeyDown);\n    return () => window.removeEventListener('keydown', handleKeyDown);\n  }, [navigate]);\n\n  return null;\n}\n\nfunction Layout() {\n  return (\n    <>\n      <KeyboardNavigationHandler />\n      <SafeModeIndicator />\n      <AppHeader />\n      <Outlet />\n    </>\n  );\n}\n\n// Must be done before creating the router to ensure the initial route is\n// correct.\nconst bodyParams = document.querySelector('body')?.getAttribute('data-params');\nconst previewModId = bodyParams && JSON.parse(bodyParams).previewModId;\nif (previewModId) {\n  const url = new URL(window.location.href);\n  url.hash = '#/mod-preview/' + previewModId;\n  window.history.replaceState(null, '', url);\n}\n\nconst router = createHashRouter([\n  {\n    element: <Layout />,\n    children: [\n      {\n        path: '/',\n        element: (\n          <>\n            <ModsBrowserLocal ContentWrapper={ContentWrapper} />\n            <CreateNewModButton />\n          </>\n        ),\n        children: [\n          {\n            path: 'mods/:modType/:modId',\n            element: null,\n          },\n        ],\n      },\n      {\n        path: '/mod-preview/:modId',\n        element: <ModPreview ContentWrapper={ContentWrapper} />,\n      },\n      {\n        path: '/mods-browser',\n        element: (\n          <>\n            <ModsBrowserOnline ContentWrapper={ContentWrapper} />\n            <CreateNewModButton />\n          </>\n        ),\n        children: [\n          {\n            path: ':modId',\n            element: null,\n          },\n        ],\n      },\n      {\n        path: '/settings',\n        element: <ContentWrapperWithOutlet key=\"settings\" />,\n        children: [\n          {\n            index: true,\n            element: <Settings />,\n          },\n        ],\n      },\n      {\n        path: '/about',\n        element: <ContentWrapperWithOutlet key=\"about\" />,\n        children: [\n          {\n            index: true,\n            element: <About />,\n          },\n        ],\n      },\n    ],\n  },\n]);\n\nfunction Panel() {\n  return (\n    <PanelContainer>\n      <RouterProvider router={router} />\n    </PanelContainer>\n  );\n}\n\nexport default Panel;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/SafeModeIndicator.tsx",
    "content": "import { Alert, Button } from 'antd';\nimport { useCallback, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport { PopconfirmModal } from '../components/InputWithContextMenu';\nimport { useUpdateAppSettings } from '../webviewIPC';\n\nconst FullWidthAlert = styled(Alert)`\n  padding-inline-start: calc(20px + max(50% - var(--app-max-width) / 2, 0px));\n  padding-inline-end: calc(20px + max(50% - var(--app-max-width) / 2, 0px));\n`;\n\nconst FullWidthAlertContent = styled.div`\n  display: flex;\n  align-items: center;\n  gap: 8px;\n`;\n\nfunction SafeModeIndicator() {\n  const { t } = useTranslation();\n\n  const { updateAppSettings } = useUpdateAppSettings(\n    useCallback((data) => {\n      // Do nothing, we should be restarted soon.\n    }, [])\n  );\n\n  const { safeMode } = useContext(AppUISettingsContext);\n\n  if (!safeMode) {\n    return null;\n  }\n\n  return (\n    <FullWidthAlert\n      message={\n        <FullWidthAlertContent>\n          <div>{t('safeMode.alert')}</div>\n          <div>\n            <PopconfirmModal\n              title={t('safeMode.offConfirm')}\n              okText={t('safeMode.offConfirmOk')}\n              cancelText={t('safeMode.offConfirmCancel')}\n              onConfirm={() => {\n                updateAppSettings({\n                  appSettings: {\n                    safeMode: false,\n                  },\n                });\n              }}\n            >\n              <Button ghost>{t('safeMode.offButton')}</Button>\n            </PopconfirmModal>\n          </div>\n        </FullWidthAlertContent>\n      }\n      banner\n    />\n  );\n}\n\nexport default SafeModeIndicator;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Settings.tsx",
    "content": "import { Alert, Badge, Button, Checkbox, Collapse, List, Modal, Select, Space, Switch, Tooltip } from 'antd';\nimport { useCallback, useContext, useEffect, useState } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { AppUISettingsContext } from '../appUISettings';\nimport { InputNumberWithContextMenu, SelectModal, TextAreaWithContextMenu } from '../components/InputWithContextMenu';\nimport { sanitizeUrl } from '../utils';\nimport { useGetAppSettings, useUpdateAppSettings } from '../webviewIPC';\nimport { AppSettings } from '../webviewIPCMessages';\nimport { mockSettings } from './mockData';\n\nconst SettingsWrapper = styled.div`\n  padding-bottom: 20px;\n`;\n\nconst SettingsList = styled(List)`\n  margin-bottom: 20px;\n`;\n\nconst SettingsListItemMeta = styled(List.Item.Meta)`\n  .ant-list-item-meta {\n    margin-bottom: 8px;\n  }\n\n  .ant-list-item-meta-title {\n    margin-bottom: 0;\n  }\n`;\n\nconst SettingsSelect = styled(SelectModal)`\n  width: 200px;\n`;\n\nconst SettingsNotice = styled.div`\n  margin-top: 14px;\n  color: rgba(255, 255, 255, 0.45);\n`;\n\nconst SettingInputNumber = styled(InputNumberWithContextMenu)`\n  width: 100%;\n  max-width: 130px;\n\n  // Remove default VSCode focus highlighting color.\n  input:focus {\n    outline: none !important;\n  }\n`;\n\nconst appLanguages = [\n  ['en', 'English'],\n  ...Object.entries({\n    ar: 'العربية',\n    cs: 'Čeština',\n    da: 'Dansk',\n    de: 'Deutsch',\n    el: 'Ελληνικά',\n    es: 'Español',\n    fr: 'Français',\n    hi: 'हिन्दी',\n    hr: 'Hrvatski',\n    hu: 'Magyar',\n    id: 'Bahasa Indonesia',\n    it: 'Italiano',\n    ja: '日本語',\n    ko: '한국어',\n    nl: 'Nederlands',\n    pl: 'Polski',\n    'pt-BR': 'Português',\n    ro: 'Română',\n    ru: 'Русский',\n    sv: 'Svenska',\n    ta: 'தமிழ்',\n    th: 'ภาษาไทย',\n    tr: 'Türkçe',\n    uk: 'Українська',\n    vi: 'Tiếng Việt',\n    'zh-CN': '简体中文',\n    'zh-TW': '繁體中文',\n  }).sort((a, b) => a[1].localeCompare(b[1])),\n];\n\nfunction parseIntLax(value?: string | number | null) {\n  const result = parseInt((value ?? 0).toString(), 10);\n  return Number.isNaN(result) ? 0 : result;\n}\n\nfunction engineArrayToProcessList(processArray: string[]) {\n  return processArray.join('\\n');\n}\n\nfunction engineProcessListToArray(processList: string) {\n  return processList\n    .split('\\n')\n    .map((x) => x.replace(/[\"/<>|]/g, '').trim())\n    .filter((x) => x);\n}\n\nfunction Settings() {\n  const { t, i18n } = useTranslation();\n  const appLanguage = i18n.resolvedLanguage;\n\n  const { loggingEnabled } = useContext(AppUISettingsContext);\n\n  const [appSettings, setAppSettings] = useState<Partial<AppSettings> | null>(\n    mockSettings\n  );\n\n  // More advanced settings.\n  const [appLoggingVerbosity, setAppLoggingVerbosity] = useState(0);\n  const [engineLoggingVerbosity, setEngineLoggingVerbosity] = useState(0);\n  const [engineInclude, setEngineInclude] = useState('');\n  const [engineExclude, setEngineExclude] = useState('');\n  const [engineInjectIntoCriticalProcesses, setEngineInjectIntoCriticalProcesses] = useState(false);\n  const [engineInjectIntoIncompatiblePrograms, setEngineInjectIntoIncompatiblePrograms] = useState(false);\n  const [engineInjectIntoGames, setEngineInjectIntoGames] = useState(false);\n\n  const resetMoreAdvancedSettings = useCallback(() => {\n    setAppLoggingVerbosity(appSettings?.loggingVerbosity ?? 0);\n    setEngineLoggingVerbosity(appSettings?.engine?.loggingVerbosity ?? 0);\n    setEngineInclude(engineArrayToProcessList(appSettings?.engine?.include ?? []));\n    setEngineExclude(engineArrayToProcessList(appSettings?.engine?.exclude ?? []));\n    setEngineInjectIntoCriticalProcesses(appSettings?.engine?.injectIntoCriticalProcesses ?? false);\n    setEngineInjectIntoIncompatiblePrograms(appSettings?.engine?.injectIntoIncompatiblePrograms ?? false);\n    setEngineInjectIntoGames(appSettings?.engine?.injectIntoGames ?? false);\n  }, [appSettings]);\n\n  const { getAppSettings } = useGetAppSettings(\n    useCallback((data) => {\n      setAppSettings(data.appSettings);\n    }, [])\n  );\n\n  useEffect(() => {\n    getAppSettings({});\n  }, [getAppSettings]);\n\n  const { updateAppSettings } = useUpdateAppSettings(\n    useCallback(\n      (data) => {\n        if (data.succeeded && appSettings) {\n          setAppSettings({\n            ...appSettings,\n            ...data.appSettings,\n          });\n        }\n      },\n      [appSettings]\n    )\n  );\n\n  const [isMoreAdvancedSettingsModalOpen, setIsMoreAdvancedSettingsModalOpen] =\n    useState(false);\n\n  if (!appSettings) {\n    return null;\n  }\n\n  const includeListEmpty = engineInclude.trim() === '';\n  const excludeListEmpty = engineExclude.trim() === '' &&\n    engineInjectIntoCriticalProcesses &&\n    engineInjectIntoIncompatiblePrograms &&\n    engineInjectIntoGames;\n  const excludeListHasWildcard = !!engineExclude.match(/^[ \\t]*\\*[ \\t]*$/m);\n\n  return (\n    <SettingsWrapper>\n      <SettingsList itemLayout=\"vertical\" split={false}>\n        <List.Item>\n          <SettingsListItemMeta\n            title={t('settings.language.title')}\n            description={\n              <>\n                <div>{t('settings.language.description')}</div>\n                <div>\n                  <Trans\n                    t={t}\n                    i18nKey=\"settings.language.contribute\"\n                    components={[\n                      <a href=\"https://github.com/ramensoftware/windhawk/wiki/translations\">\n                        website\n                      </a>,\n                    ]}\n                  />\n                </div>\n              </>\n            }\n          />\n          <SettingsSelect\n            showSearch\n            optionFilterProp=\"children\"\n            value={appLanguage}\n            onChange={(value) => {\n              updateAppSettings({\n                appSettings: {\n                  language: typeof value === 'string' ? value : 'en',\n                },\n              });\n            }}\n            dropdownMatchSelectWidth={false}\n          >\n            {appLanguages.map(([languageId, languageDisplayName]) => (\n              <Select.Option key={languageId} value={languageId}>\n                {languageDisplayName}\n              </Select.Option>\n            ))}\n          </SettingsSelect>\n          {appLanguage !== 'en' && (\n            <SettingsNotice>\n              <Trans\n                t={t}\n                i18nKey=\"settings.language.credits\"\n                components={[\n                  <a href={sanitizeUrl(t('settings.language.creditsLink') as string)}>\n                    website\n                  </a>,\n                ]}\n              />\n            </SettingsNotice>\n          )}\n        </List.Item>\n        <List.Item>\n          <SettingsListItemMeta\n            title={t('settings.updates.title')}\n            description={t('settings.updates.description')}\n          />\n          <Switch\n            checked={!appSettings.disableUpdateCheck}\n            onChange={(checked) => {\n              updateAppSettings({\n                appSettings: {\n                  disableUpdateCheck: !checked,\n                },\n              });\n            }}\n          />\n        </List.Item>\n        <List.Item>\n          <SettingsListItemMeta\n            title={t('settings.devMode.title')}\n            description={t('settings.devMode.description')}\n          />\n          <Switch\n            checked={!appSettings.devModeOptOut}\n            onChange={(checked) => {\n              updateAppSettings({\n                appSettings: {\n                  devModeOptOut: !checked,\n                },\n              });\n            }}\n          />\n        </List.Item>\n      </SettingsList>\n      <Collapse>\n        <Collapse.Panel header={\n          <>\n            {t('settings.advancedSettings')}\n            {' '}\n            {loggingEnabled && (\n              <Tooltip title={t('general.loggingEnabled')} placement=\"bottom\">\n                <Badge dot status=\"warning\" />\n              </Tooltip>\n            )}\n          </>\n        } key=\"1\">\n          <List itemLayout=\"vertical\" split={false}>\n            <List.Item>\n              <SettingsListItemMeta\n                title={t('settings.hideTrayIcon.title')}\n                description={t('settings.hideTrayIcon.description')}\n              />\n              <Switch\n                checked={appSettings.hideTrayIcon}\n                onChange={(checked) => {\n                  updateAppSettings({\n                    appSettings: {\n                      hideTrayIcon: checked,\n                    },\n                  });\n                }}\n              />\n            </List.Item>\n            <List.Item>\n              <SettingsListItemMeta\n                title={t('settings.alwaysCompileModsLocally.title')}\n                description={t('settings.alwaysCompileModsLocally.description')}\n              />\n              <Switch\n                checked={appSettings.alwaysCompileModsLocally}\n                onChange={(checked) => {\n                  updateAppSettings({\n                    appSettings: {\n                      alwaysCompileModsLocally: checked,\n                    },\n                  });\n                }}\n              />\n            </List.Item>\n            {appSettings.disableRunUIScheduledTask !== null && (\n              <List.Item>\n                <SettingsListItemMeta\n                  title={t('settings.requireElevation.title')}\n                  description={t('settings.requireElevation.description')}\n                />\n                <Switch\n                  checked={appSettings.disableRunUIScheduledTask}\n                  onChange={(checked) => {\n                    updateAppSettings({\n                      appSettings: {\n                        disableRunUIScheduledTask: checked,\n                      },\n                    });\n                  }}\n                />\n              </List.Item>\n            )}\n            <List.Item>\n              <SettingsListItemMeta\n                title={t('settings.dontAutoShowToolkit.title')}\n                description={t('settings.dontAutoShowToolkit.description')}\n              />\n              <Switch\n                checked={appSettings.dontAutoShowToolkit}\n                onChange={(checked) => {\n                  updateAppSettings({\n                    appSettings: {\n                      dontAutoShowToolkit: checked,\n                    },\n                  });\n                }}\n              />\n            </List.Item>\n            <List.Item>\n              <SettingsListItemMeta\n                title={t('settings.modInitDialogDelay.title')}\n                description={t('settings.modInitDialogDelay.description')}\n              />\n              <SettingInputNumber\n                // Add 1000 to the displayed value, since that's the amount of\n                // extra delay that's actually added in the app.\n                value={1000 + (appSettings.modTasksDialogDelay ?? 0)}\n                min={1000 + 400}\n                max={2147483647}\n                onChange={(value) => {\n                  updateAppSettings({\n                    appSettings: {\n                      modTasksDialogDelay: parseIntLax(value) - 1000,\n                    },\n                  });\n                }}\n              />\n            </List.Item>\n            <List.Item>\n              <Badge\n                dot={loggingEnabled}\n                status=\"warning\"\n                title={loggingEnabled ? t('general.loggingEnabled') : undefined}\n              >\n                <Button\n                  type=\"primary\"\n                  onClick={() => {\n                    resetMoreAdvancedSettings();\n                    setIsMoreAdvancedSettingsModalOpen(true);\n                  }}\n                >\n                  {t('settings.moreAdvancedSettings.title')}\n                </Button>\n              </Badge>\n            </List.Item>\n          </List>\n        </Collapse.Panel>\n      </Collapse>\n      <Modal\n        title={t('settings.moreAdvancedSettings.title')}\n        open={isMoreAdvancedSettingsModalOpen}\n        centered={true}\n        bodyStyle={{ maxHeight: '60vh', overflow: 'auto' }}\n        onOk={() => {\n          updateAppSettings({\n            appSettings: {\n              loggingVerbosity: appLoggingVerbosity,\n              engine: {\n                loggingVerbosity: engineLoggingVerbosity,\n                include: engineProcessListToArray(engineInclude),\n                exclude: engineProcessListToArray(engineExclude),\n                injectIntoCriticalProcesses: engineInjectIntoCriticalProcesses,\n                injectIntoIncompatiblePrograms: engineInjectIntoIncompatiblePrograms,\n                injectIntoGames: engineInjectIntoGames,\n              },\n            },\n          });\n          setIsMoreAdvancedSettingsModalOpen(false);\n        }}\n        onCancel={() => {\n          setIsMoreAdvancedSettingsModalOpen(false);\n        }}\n        okText={t('settings.moreAdvancedSettings.saveButton')}\n        cancelText={t('settings.moreAdvancedSettings.cancelButton')}\n      >\n        <List itemLayout=\"vertical\" split={false}>\n          <List.Item>\n            <Alert\n              description={t('settings.moreAdvancedSettings.restartNotice')}\n              type=\"info\"\n              showIcon\n            />\n          </List.Item>\n          <List.Item>\n            <SettingsListItemMeta\n              title={t('settings.loggingVerbosity.appLoggingTitle')}\n              description={t('settings.loggingVerbosity.description')}\n            />\n            <SettingsSelect\n              value={appLoggingVerbosity}\n              onChange={(value) => {\n                setAppLoggingVerbosity(typeof value === 'number' ? value : 0);\n              }}\n              dropdownMatchSelectWidth={false}\n            >\n              <Select.Option key=\"none\" value={0}>\n                {t('settings.loggingVerbosity.none')}\n              </Select.Option>\n              <Select.Option key=\"error\" value={1}>\n                {t('settings.loggingVerbosity.error')}\n              </Select.Option>\n              <Select.Option key=\"verbose\" value={2}>\n                {t('settings.loggingVerbosity.verbose')}\n              </Select.Option>\n            </SettingsSelect>\n          </List.Item>\n          <List.Item>\n            <SettingsListItemMeta\n              title={t('settings.loggingVerbosity.engineLoggingTitle')}\n              description={t('settings.loggingVerbosity.description')}\n            />\n            <SettingsSelect\n              value={engineLoggingVerbosity}\n              onChange={(value) => {\n                setEngineLoggingVerbosity(\n                  typeof value === 'number' ? value : 0\n                );\n              }}\n              dropdownMatchSelectWidth={false}\n            >\n              <Select.Option key=\"none\" value={0}>\n                {t('settings.loggingVerbosity.none')}\n              </Select.Option>\n              <Select.Option key=\"error\" value={1}>\n                {t('settings.loggingVerbosity.error')}\n              </Select.Option>\n              <Select.Option key=\"verbose\" value={2}>\n                {t('settings.loggingVerbosity.verbose')}\n              </Select.Option>\n            </SettingsSelect>\n          </List.Item>\n          <List.Item>\n            <SettingsListItemMeta\n              title={t('settings.processList.titleExclusion')}\n              description={<>\n                <p>{t('settings.processList.descriptionExclusion')}</p>\n                <div>\n                  <Trans\n                    t={t}\n                    i18nKey=\"settings.processList.descriptionExclusionWiki\"\n                    components={[<a href=\"https://github.com/ramensoftware/windhawk/wiki/Injection-targets-and-critical-system-processes\">wiki</a>]}\n                  />\n                </div>\n              </>}\n            />\n            <TextAreaWithContextMenu\n              rows={4}\n              value={engineExclude}\n              placeholder={\n                (t('settings.processList.processListPlaceholder') as string) +\n                '\\n' +\n                'notepad.exe\\n' +\n                '%ProgramFiles%\\\\Notepad++\\\\notepad++.exe\\n' +\n                'C:\\\\Windows\\\\system32\\\\*'\n              }\n              onChange={(e) => {\n                setEngineExclude(e.target.value);\n              }}\n            />\n            {engineExclude.match(/[\"/<>|]/) && (\n              <Alert\n                description={t('settings.processList.invalidCharactersWarning', {\n                  invalidCharacters: '\" / < > |',\n                })}\n                type=\"warning\"\n                showIcon\n              />\n            )}\n            <Space direction=\"vertical\" size=\"small\" style={{ marginTop: '12px' }}>\n              <Checkbox\n                checked={!engineInjectIntoCriticalProcesses}\n                onChange={(e) => {\n                  setEngineInjectIntoCriticalProcesses(!e.target.checked);\n                }}\n              >\n                {t('settings.processList.excludeCriticalProcesses')}\n              </Checkbox>\n              <Checkbox\n                checked={!engineInjectIntoIncompatiblePrograms}\n                onChange={(e) => {\n                  setEngineInjectIntoIncompatiblePrograms(!e.target.checked);\n                }}\n              >\n                {t('settings.processList.excludeIncompatiblePrograms')}\n              </Checkbox>\n              <Checkbox\n                checked={!engineInjectIntoGames}\n                onChange={(e) => {\n                  setEngineInjectIntoGames(!e.target.checked);\n                }}\n              >\n                {t('settings.processList.excludeGames')}\n              </Checkbox>\n            </Space>\n          </List.Item>\n          <List.Item>\n            <SettingsListItemMeta\n              title={t('settings.processList.titleInclusion')}\n              description={t('settings.processList.descriptionInclusion')}\n            />\n            <TextAreaWithContextMenu\n              rows={4}\n              value={engineInclude}\n              placeholder={\n                (t('settings.processList.processListPlaceholder') as string) +\n                '\\n' +\n                'notepad.exe\\n' +\n                '%ProgramFiles%\\\\Notepad++\\\\notepad++.exe\\n' +\n                'C:\\\\Windows\\\\system32\\\\*'\n              }\n              onChange={(e) => {\n                setEngineInclude(e.target.value);\n              }}\n            />\n            {engineInclude.match(/[\"/<>|]/) && (\n              <Alert\n                description={t('settings.processList.invalidCharactersWarning', {\n                  invalidCharacters: '\" / < > |',\n                })}\n                type=\"warning\"\n                showIcon\n              />\n            )}\n            {!includeListEmpty && excludeListEmpty && (\n              <Alert\n                description={t(\n                  'settings.processList.inclusionWithoutExclusionNotice'\n                )}\n                type=\"warning\"\n                showIcon\n              />\n            )}\n            {!includeListEmpty && !excludeListHasWildcard && (\n              <Alert\n                description={t(\n                  'settings.processList.inclusionWithoutTotalExclusionNotice'\n                )}\n                type=\"info\"\n                showIcon\n              />\n            )}\n          </List.Item>\n        </List>\n      </Modal>\n    </SettingsWrapper>\n  );\n}\n\nexport default Settings;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/UpdateModal.tsx",
    "content": "import { Button, Modal, Progress, Result } from 'antd';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport {\n  useCancelUpdate,\n  useStartUpdate,\n  useUpdateDownloadProgress,\n  useUpdateInstalling,\n} from '../webviewIPC';\n\nconst ModalContent = styled.div`\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n  padding: 16px 0;\n`;\n\nconst StatusMessage = styled.div`\n  text-align: center;\n  font-size: 16px;\n`;\n\nconst Note = styled.div`\n  text-align: center;\n  color: var(--vscode-descriptionForeground, #9d9d9d);\n  font-size: 14px;\n`;\n\ntype UpdateStatus = 'idle' | 'downloading' | 'installing' | 'failed';\n\ninterface Props {\n  open: boolean;\n  onClose: () => void;\n}\n\nexport function UpdateModal(props: Props) {\n  const { t } = useTranslation();\n  const [status, setStatus] = useState<UpdateStatus>('idle');\n  const [downloadProgress, setDownloadProgress] = useState(0);\n  const [errorMessage, setErrorMessage] = useState('');\n\n  const resetState = useCallback(() => {\n    setStatus('idle');\n    setDownloadProgress(0);\n    setErrorMessage('');\n  }, []);\n\n  const resetAndClose = useCallback(() => {\n    resetState();\n    props.onClose();\n  }, [props, resetState]);\n\n  const { startUpdate } = useStartUpdate(useCallback((data) => {\n    if (!data.succeeded) {\n      setStatus('failed');\n      setErrorMessage(data.error || 'Unknown error');\n    }\n\n    // At this point, the installer was started successfully.\n  }, []));\n\n  // Listen for update progress events\n  useUpdateDownloadProgress(\n    useCallback((data) => {\n      setStatus('downloading');\n      setDownloadProgress(data.progress);\n    }, [])\n  );\n\n  useUpdateInstalling(\n    useCallback(() => {\n      setStatus('installing');\n    }, [])\n  );\n\n  // Start update when modal opens\n  useEffect(() => {\n    if (props.open) {\n      resetState();\n      startUpdate({});\n    }\n  }, [props.open, resetState, startUpdate]);\n\n  const { cancelUpdate } = useCancelUpdate(useCallback((data) => {\n    if (data.succeeded) {\n      resetAndClose();\n    }\n    // If cancellation failed, stay in current state and let user try again\n  }, [resetAndClose]));\n\n  const canCancel = status === 'downloading';\n  const canClose = status === 'installing' || status === 'failed';\n  const showProgress = status === 'downloading' || status === 'idle';\n\n  const handleCancel = () => {\n    if (canCancel) {\n      cancelUpdate({});\n    } else if (canClose) {\n      resetAndClose();\n    }\n  };\n\n  return (\n    <Modal\n      open={props.open}\n      onCancel={canClose ? handleCancel : undefined}\n      closable={canClose}\n      maskClosable={false}\n      footer={\n        canCancel\n          ? [\n            <Button\n              type=\"primary\"\n              danger\n              onClick={handleCancel}\n            >\n              {t('about.update.modal.cancel')}\n            </Button>,\n          ]\n          : null\n      }\n      title={t('about.update.modal.title')}\n      width={500}\n      centered\n    >\n      <ModalContent>\n        {status === 'failed' ? (\n          <Result\n            status=\"error\"\n            title={t('about.update.modal.failed')}\n            subTitle={errorMessage}\n          />\n        ) : (\n          <>\n            <StatusMessage>\n              {status === 'downloading' && t('about.update.modal.downloading')}\n              {status === 'installing' && t('about.update.modal.installing')}\n            </StatusMessage>\n\n            {showProgress && (\n              <Progress\n                percent={downloadProgress}\n                status=\"active\"\n              />\n            )}\n\n            {status === 'installing' && (\n              <Note>{t('about.update.modal.installingNote')}</Note>\n            )}\n          </>\n        )}\n      </ModalContent>\n    </Modal>\n  );\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/VersionSelectorModal.tsx",
    "content": "import { Badge, Menu, Modal, Spin } from 'antd';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { useGetModVersions } from '../webviewIPC';\nimport { mockModVersions } from './mockData';\n\ntype ModVersionInfo = {\n  version: string;\n  timestamp: number;\n  isPreRelease: boolean;\n};\n\nconst ModalContent = styled.div`\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n`;\n\nconst MenuWrapper = styled.div`\n  max-height: 400px;\n  overflow-y: auto;\n  border: 1px solid #303030;\n\n  .ant-menu {\n    border: none;\n    border-radius: 2px;\n\n    .ant-menu-item {\n      margin: 0;\n    }\n  }\n`;\n\nconst VersionItemContainer = styled.div`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n`;\n\nconst VersionText = styled.span`\n  flex: 1;\n`;\n\nconst VersionDate = styled.span`\n  color: var(--vscode-descriptionForeground, #9d9d9d);\n  font-size: 12px;\n  margin-inline-start: 8px;\n`;\n\nconst PreReleaseBadge = styled(Badge)`\n  .ant-badge-count {\n    background-color: #faad14;\n    color: #000;\n    font-size: 11px;\n  }\n`;\n\ninterface Props {\n  modId: string;\n  open: boolean;\n  selectedVersion?: string | null;\n  onSelect: (version: string, versionTimestamps: Record<string, number>) => void;\n  onCancel: () => void;\n}\n\nexport function VersionSelectorModal(props: Props) {\n  const { t } = useTranslation();\n  const [selectedVersion, setSelectedVersion] = useState<string | undefined>();\n  const [versions, setVersions] = useState<ModVersionInfo[] | null>(null);\n  const [loadedModId, setLoadedModId] = useState<string | null>(null);\n\n  // IPC hook for fetching versions\n  const { getModVersions, getModVersionsPending } = useGetModVersions(\n    useCallback(\n      (data) => {\n        if (data.modId === props.modId) {\n          setVersions(data.versions);\n          setLoadedModId(data.modId);\n        }\n      },\n      [props.modId]\n    )\n  );\n\n  // Fetch versions when modal opens (only if not already loaded for this modId)\n  useEffect(() => {\n    if (props.open && loadedModId !== props.modId) {\n      if (mockModVersions) {\n        setVersions(mockModVersions);\n        setLoadedModId(props.modId);\n      } else {\n        getModVersions({ modId: props.modId });\n      }\n    }\n  }, [props.open, props.modId, loadedModId, getModVersions]);\n\n  // Pre-select the version when modal opens\n  useEffect(() => {\n    if (props.open && props.selectedVersion) {\n      setSelectedVersion(props.selectedVersion);\n    }\n  }, [props.open, props.selectedVersion]);\n\n  const sortedVersions = useMemo(() => {\n    if (!versions) {\n      return [];\n    }\n    // Sort by timestamp, newest first\n    return [...versions].sort((a, b) => b.timestamp - a.timestamp);\n  }, [versions]);\n\n  const formatDate = (timestamp: number) => {\n    const date = new Date(timestamp * 1000);\n    return date.toLocaleDateString(undefined, {\n      year: 'numeric',\n      month: 'short',\n      day: 'numeric',\n    });\n  };\n\n  const handleMenuClick = (version: string) => {\n    setSelectedVersion(version);\n  };\n\n  const handleSelect = () => {\n    if (selectedVersion) {\n      const versionTimestamps = versions?.reduce((acc, v) => {\n        acc[v.version] = v.timestamp;\n        return acc;\n      }, {} as Record<string, number>) ?? {};\n\n      props.onSelect(selectedVersion, versionTimestamps);\n      setSelectedVersion(undefined);\n    }\n  };\n\n  const handleCancel = () => {\n    setSelectedVersion(undefined);\n    props.onCancel();\n  };\n\n  const menuItems = useMemo(() => {\n    return sortedVersions.map((version) => ({\n      key: version.version,\n      label: (\n        <VersionItemContainer>\n          <VersionText>\n            {version.version}\n            {version.isPreRelease && (\n              <>\n                {' '}\n                <PreReleaseBadge\n                  count={t('modDetails.version.preRelease')}\n                />\n              </>\n            )}\n          </VersionText>\n          <VersionDate>{formatDate(version.timestamp)}</VersionDate>\n        </VersionItemContainer>\n      ),\n    }));\n  }, [sortedVersions, t]);\n\n  return (\n    <Modal\n      open={props.open}\n      onOk={handleSelect}\n      onCancel={handleCancel}\n      okText={t('modDetails.version.select')}\n      cancelText={t('modDetails.version.cancel')}\n      okButtonProps={{ disabled: !selectedVersion }}\n      centered\n      width={360}\n      closable={false}\n    >\n      <ModalContent>\n        {getModVersionsPending ? (\n          <Spin />\n        ) : (\n          <MenuWrapper>\n            <Menu\n              items={menuItems}\n              selectedKeys={selectedVersion ? [selectedVersion] : []}\n              onClick={({ key }) => handleMenuClick(key)}\n            />\n          </MenuWrapper>\n        )}\n      </ModalContent>\n    </Modal>\n  );\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/mockData.ts",
    "content": "import vsCodeApi from '../vsCodeApi';\n\nexport const useMockData = !vsCodeApi;\n\nexport const mockAppUISettings = !useMockData\n  ? null\n  : {\n    language: 'en',\n    devModeOptOut: false,\n    devModeUsedAtLeastOnce: false,\n    loggingEnabled: false,\n    updateIsAvailable: false,\n    safeMode: false,\n  };\n\nexport const mockSettings = !useMockData\n  ? null\n  : {\n    language: 'en',\n    disableUpdateCheck: false,\n    disableRunUIScheduledTask: false,\n    devModeOptOut: false,\n    devModeUsedAtLeastOnce: false,\n    hideTrayIcon: false,\n    alwaysCompileModsLocally: false,\n    dontAutoShowToolkit: false,\n    modTasksDialogDelay: 2000,\n    safeMode: false,\n    loggingVerbosity: 0,\n    engine: {\n      loggingVerbosity: 0,\n      include: ['a.exe', 'b.exe'],\n      exclude: ['c.exe', 'd.exe'],\n      injectIntoCriticalProcesses: false,\n      injectIntoIncompatiblePrograms: false,\n      injectIntoGames: false,\n    },\n  };\n\nconst mockModMetadata = {\n  id: 'custom-message-box',\n  name: 'Custom Message Box',\n  description: 'Customizes the message box',\n  version: '0.1',\n  author: 'Michael Jackson',\n  github: 'https://github.com/jackson',\n  twitter: 'https://twitter.com/jackson',\n  homepage: 'http://custom-message-box.com/',\n  include: ['*'],\n  exclude: ['explorer.exe'],\n  license: 'MIT',\n  donateUrl: 'https://example.com/donate',\n};\n\nconst mockModMetadataOnline = {\n  ...mockModMetadata,\n  id: undefined,\n  version: '0.2',\n};\n\nconst mockModConfig = {\n  libraryFileName: 'custom-message-box-123456.dll',\n  disabled: false,\n  loggingEnabled: false,\n  debugLoggingEnabled: false,\n  include: ['*'],\n  exclude: ['explorer.exe'],\n  includeCustom: [],\n  excludeCustom: [],\n  includeExcludeCustomOnly: false,\n  patternsMatchCriticalSystemProcesses: true,\n  architecture: ['x86-64'],\n  version: '1.0',\n};\n\nconst mockModDetails = {\n  metadata: {},\n  config: mockModConfig,\n  updateAvailable: false,\n  userRating: 0,\n};\n\nexport const mockModsBrowserLocalInitialMods = !useMockData\n  ? null\n  : {\n    'custom-message-box': {\n      metadata: mockModMetadata,\n      config: mockModConfig,\n      updateAvailable: true,\n      userRating: 4,\n    },\n    'local@asdf2': mockModDetails,\n    asdf3: mockModDetails,\n    asdf4: mockModDetails,\n    asdf5: mockModDetails,\n    asdf6: mockModDetails,\n    asdf7: mockModDetails,\n  };\n\nexport const mockModsBrowserLocalFeaturedMods = !useMockData\n  ? null\n  : {\n    online1: {\n      metadata: mockModMetadataOnline,\n      details: {\n        users: 111222333,\n        rating: 5,\n        ratingBreakdown: [1, 2, 16, 3, 5],\n        defaultSorting: 2,\n        published: 1618321977408,\n        updated: 1718321977408,\n      },\n    },\n  };\n\nexport const mockModsBrowserOnlineRepositoryMods = !useMockData\n  ? null\n  : {\n    online1: {\n      repository: {\n        metadata: mockModMetadataOnline,\n        details: {\n          users: 111222333,\n          rating: 5,\n          ratingBreakdown: [1, 2, 16, 3, 5],\n          defaultSorting: 2,\n          published: 1618321977408,\n          updated: 1718321977408,\n        },\n      },\n      installed: {\n        metadata: mockModMetadata,\n        config: mockModConfig,\n      },\n    },\n    ...Object.fromEntries(\n      Array(100)\n        .fill(undefined)\n        .map((e, i) => [\n          `online${(i + 1).toString().padStart(3, '0')}`,\n          {\n            repository: {\n              metadata: {\n                name: `My Mod ${(i + 1).toString().padStart(3, '0')}`,\n                description: 'A good mod',\n                version: '1.2',\n                author: 'John Smith',\n                github: 'https://github.com/john',\n                twitter: 'https://twitter.com/john',\n                homepage: 'https://example.com/',\n              },\n              details: {\n                users: 20,\n                rating: 7,\n                ratingBreakdown: [1, 2, 4, 8, 16],\n                defaultSorting: 1,\n                published: 1618321977408,\n                updated: 1718321977408,\n              },\n            },\n          },\n        ])\n    ),\n  };\n\nexport const mockInstalledModSourceData = !useMockData\n  ? null\n  : {\n    source: '// Mock local source...\\n',\n    metadata: mockModMetadata,\n    readme: `# Mock readme...\n\n| Month    | Savings |\n| -------- | ------- |\n| January  | $250    |\n| February | $80     |\n| March    | $420    |\n\nMore text...`,\n    initialSettings: [\n      {\n        key: 'mock-setting',\n        value: 'mock-setting-value',\n        name: 'Mock Setting Name',\n        description: 'Mock setting description',\n      },\n      {\n        key: 'mock-setting-dropdown',\n        value: 'a',\n        name: 'Mock Setting Dropdown Name',\n        description: 'Mock setting dropdown description',\n        options: [\n          { a: 'a option' } as Record<string, string>,\n          { b: 'b option' } as Record<string, string>,\n          { c: 'c option' } as Record<string, string>,\n          { d: 'd option' } as Record<string, string>,\n          { e: 'e option' } as Record<string, string>,\n          { f: 'f option' } as Record<string, string>,\n          { g: 'g option' } as Record<string, string>,\n          { h: 'h option' } as Record<string, string>,\n          { i: 'i option' } as Record<string, string>,\n        ],\n      },\n      {\n        key: 'mock-setting-array',\n        value: ['a', 'b', 'c'],\n        name: 'Mock Setting Array Name',\n        description: 'Mock setting array description',\n      },\n      {\n        key: 'mock-setting-nested-array',\n        value: [\n          [\n\n            {\n              key: 'mock-setting-nested',\n              value: ['a', 'b', 'c'],\n              name: 'Mock Setting Nested Name',\n              description: 'Mock setting nested description',\n            }\n          ]\n        ],\n        name: 'Mock Setting Nested Array Name',\n        description: 'Mock setting nested array description',\n      },\n    ],\n  };\n\nexport const mockModSettings = !useMockData\n  ? null\n  : {\n    'mock-setting': 'mock-setting-value',\n    'mock-setting-dropdown': 'mock-setting-value',\n    'mock-setting-array[0]': 'a',\n    'mock-setting-array[1]': 'b',\n    'mock-setting-array[2]': 'c',\n  };\n\nexport const mockModVersions = !useMockData\n  ? null\n  : [\n    {\n      version: '0.3-alpha',\n      timestamp: 1758321977, // Sep 20, 2025\n      isPreRelease: true,\n    },\n    {\n      version: '0.2',\n      timestamp: 1718321977, // Jun 14, 2024\n      isPreRelease: false,\n    },\n    {\n      version: '0.1',\n      timestamp: 1690444800, // Jul 27, 2023\n      isPreRelease: false,\n    },\n    {\n      version: '0.1-beta',\n      timestamp: 1684454400, // May 19, 2023\n      isPreRelease: true,\n    },\n  ];\n\nexport const mockModVersionSource = !useMockData\n  ? null\n  : (version: string) => ({\n    source: `// Mock source for version ${version}...\\n`,\n    metadata: {\n      ...mockModMetadata,\n      version,\n    },\n    readme: `# Mock readme for version ${version}...\\n`,\n    initialSettings: [],\n  });\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/sidebar/EditorModeControls.tsx",
    "content": "import { Badge, Button, Dropdown, Switch, Tooltip } from 'antd';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled from 'styled-components';\nimport { PopconfirmModal } from '../components/InputWithContextMenu';\nimport {\n  previewEditedMod,\n  showLogOutput,\n  stopCompileEditedMod,\n  useCompileEditedMod,\n  useCompileEditedModStart,\n  useEditedModWasModified,\n  useEnableEditedMod,\n  useEnableEditedModLogging,\n  useExitEditorMode,\n  useSetEditedModId,\n} from '../webviewIPC';\n\nconst SidebarContainer = styled.div`\n  padding: 0 10px;\n  text-align: center;\n`;\n\nconst SwitchesContainer = styled.div`\n  margin-bottom: 10px;\n\n  > * {\n    width: 100%;\n    display: flex;\n    justify-content: space-between;\n    background-color: var(--vscode-editor-background);\n    border: 1px solid #303030;\n    padding: 4px 10px;\n  }\n\n  > *:not(:last-child) {\n    border-bottom: none;\n  }\n\n  > *:first-child {\n    border-top-left-radius: 2px;\n    border-top-right-radius: 2px;\n  }\n\n  > *:last-child {\n    border-bottom-left-radius: 2px;\n    border-bottom-right-radius: 2px;\n  }\n`;\n\nconst SwitchesContainerRow = styled.div`\n  // Fixes a button alignment bug.\n  > .ant-tooltip-disabled-compatible-wrapper {\n    font-size: 0;\n  }\n`;\n\nconst ButtonsContainer = styled.div`\n  > * {\n    margin-bottom: 10px;\n  }\n`;\n\nconst ModIdBox = styled.div`\n  display: inline-block;\n  border-radius: 2px;\n  background: #444;\n  padding: 0 4px;\n  overflow-wrap: anywhere;\n  margin-bottom: 10px;\n`;\n\nconst CompileButtonBadge = styled(Badge)`\n  display: block;\n  cursor: default;\n\n  // Fixes badge z-index issue with dropdown button.\n  > .ant-scroll-number {\n    z-index: 3;\n  }\n`;\n\nconst FullWidthDropdownButton = styled(Dropdown.Button)`\n  .ant-btn:not(.ant-dropdown-trigger) {\n    width: 100%;\n  }\n`;\n\ntype ModDetailsCommon = {\n  modId: string;\n  modWasModified: boolean;\n};\n\ntype ModDetailsNotCompiled = ModDetailsCommon & {\n  compiled: false;\n};\n\ntype ModDetailsCompiled = ModDetailsCommon & {\n  compiled: true;\n  disabled: boolean;\n  loggingEnabled: boolean;\n  debugLoggingEnabled: boolean;\n};\n\nexport type ModDetails = ModDetailsNotCompiled | ModDetailsCompiled;\n\ninterface Props {\n  initialModDetails: ModDetails;\n  onExitEditorMode?: () => void;\n}\n\nfunction EditorModeControls({ initialModDetails, onExitEditorMode }: Props) {\n  const { t } = useTranslation();\n\n  const [modId, setModId] = useState(initialModDetails.modId);\n  const [modWasModified, setModWasModified] = useState(\n    initialModDetails.modWasModified\n  );\n  const [isModCompiled, setIsModCompiled] = useState(\n    initialModDetails.compiled\n  );\n  const [isModDisabled, setIsModDisabled] = useState(\n    initialModDetails.compiled && initialModDetails.disabled\n  );\n  const [isLoggingEnabled, setIsLoggingEnabled] = useState(\n    initialModDetails.compiled && initialModDetails.loggingEnabled\n  );\n\n  const [compilationFailed, setCompilationFailed] = useState(false);\n\n  useSetEditedModId(\n    useCallback((data) => {\n      setModId(data.modId);\n    }, [])\n  );\n\n  const { enableEditedMod } = useEnableEditedMod(\n    useCallback((data) => {\n      if (data.succeeded) {\n        setIsModDisabled(!data.enabled);\n      }\n    }, [])\n  );\n\n  const { enableEditedModLogging } = useEnableEditedModLogging(\n    useCallback((data) => {\n      if (data.succeeded) {\n        setIsLoggingEnabled(data.enabled);\n      }\n    }, [])\n  );\n\n  const { compileEditedMod, compileEditedModPending } = useCompileEditedMod(\n    useCallback((data) => {\n      if (data.succeeded) {\n        if (data.clearModified) {\n          setModWasModified(false);\n        }\n\n        setCompilationFailed(false);\n        setIsModCompiled(true);\n      } else {\n        setCompilationFailed(true);\n      }\n    }, [])\n  );\n\n  const { exitEditorMode } = useExitEditorMode(\n    useCallback(\n      (data) => {\n        if (data.succeeded) {\n          onExitEditorMode?.();\n        }\n      },\n      [onExitEditorMode]\n    )\n  );\n\n  useCompileEditedModStart(\n    useCallback(() => {\n      if (!compileEditedModPending) {\n        compileEditedMod({\n          disabled: isModDisabled,\n          loggingEnabled: isLoggingEnabled,\n        });\n      }\n    }, [\n      compileEditedMod,\n      compileEditedModPending,\n      isLoggingEnabled,\n      isModDisabled,\n    ])\n  );\n\n  useEditedModWasModified(\n    useCallback(() => {\n      setModWasModified(true);\n      setCompilationFailed(false);\n    }, [])\n  );\n\n  return (\n    <SidebarContainer>\n      <Tooltip title={t('sidebar.modId')} placement=\"bottom\">\n        <ModIdBox>{modId}</ModIdBox>\n      </Tooltip>\n      <SwitchesContainer>\n        <SwitchesContainerRow>\n          <div>{t('sidebar.enableMod')}</div>\n          <Tooltip\n            title={!isModCompiled && t('sidebar.notCompiled')}\n            placement=\"bottomRight\"\n          >\n            <Switch\n              checked={!isModDisabled}\n              checkedChildren={!isModCompiled && '✱'}\n              onChange={(checked) => enableEditedMod({ enable: checked })}\n            />\n          </Tooltip>\n        </SwitchesContainerRow>\n        <SwitchesContainerRow>\n          <div>{t('sidebar.enableLogging')}</div>\n          <Tooltip\n            title={!isModCompiled && t('sidebar.notCompiled')}\n            placement=\"bottomRight\"\n          >\n            <Switch\n              checked={isLoggingEnabled}\n              checkedChildren={!isModCompiled && '✱'}\n              onChange={(checked) =>\n                enableEditedModLogging({ enable: checked })\n              }\n            />\n          </Tooltip>\n        </SwitchesContainerRow>\n      </SwitchesContainer>\n      <ButtonsContainer>\n        <CompileButtonBadge\n          count={compilationFailed ? '!' : undefined}\n          size={compilationFailed ? 'small' : undefined}\n          title={\n            compilationFailed\n              ? (t('sidebar.compilationFailed') as string)\n              : undefined\n          }\n          dot={modWasModified && !compilationFailed}\n          status={\n            modWasModified && !compilationFailed ? 'default' : undefined\n          }\n        >\n          {compileEditedModPending ? (\n            <FullWidthDropdownButton\n              type=\"primary\"\n              loading\n              menu={{\n                items: [\n                  {\n                    key: 'stop',\n                    label: t('sidebar.stopCompilation'),\n                    onClick: () => stopCompileEditedMod(),\n                  },\n                ],\n              }}\n            >\n              {t('general.compiling')}\n            </FullWidthDropdownButton>\n          ) : (\n            <Button\n              type=\"primary\"\n              block\n              title=\"Ctrl+B\"\n              onClick={() =>\n                compileEditedMod({\n                  disabled: isModDisabled,\n                  loggingEnabled: isLoggingEnabled,\n                })\n              }\n            >\n              {t('sidebar.compile')}\n            </Button>\n          )}\n        </CompileButtonBadge>\n        <Button type=\"primary\" block onClick={() => previewEditedMod()}>\n          {t('sidebar.preview')}\n        </Button>\n        <Button type=\"primary\" block onClick={() => showLogOutput()}>\n          {t('sidebar.showLogOutput')}\n        </Button>\n        <PopconfirmModal\n          placement=\"bottom\"\n          disabled={!(modWasModified && !isModCompiled) || compileEditedModPending}\n          title={t('sidebar.exitConfirmation')}\n          okText={t('sidebar.exitButtonOk')}\n          cancelText={t('sidebar.exitButtonCancel')}\n          onConfirm={() => exitEditorMode({ saveToDrafts: false })}\n        >\n          <Button\n            type=\"primary\"\n            danger={true}\n            block\n            disabled={compileEditedModPending}\n            onClick={\n              modWasModified && !isModCompiled\n                ? undefined\n                : () => exitEditorMode({ saveToDrafts: modWasModified })\n            }\n          >\n            {t('sidebar.exit')}\n          </Button>\n        </PopconfirmModal>\n      </ButtonsContainer>\n    </SidebarContainer>\n  );\n}\n\nexport default EditorModeControls;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/sidebar/Sidebar.tsx",
    "content": "import { useCallback, useEffect, useState } from 'react';\nimport {\n  getInitialSidebarParams,\n  useSetEditedModDetails,\n} from '../webviewIPC';\nimport EditorModeControls, { ModDetails } from './EditorModeControls';\nimport { mockSidebarModDetails } from './mockData';\n\nfunction Sidebar() {\n  const [modDetails, setModDetails] = useState<ModDetails | null>(\n    mockSidebarModDetails\n  );\n\n  useEffect(() => {\n    getInitialSidebarParams();\n  }, []);\n\n  useSetEditedModDetails(\n    useCallback((data) => {\n      if (!data.modDetails) {\n        setModDetails({\n          modId: data.modId,\n          modWasModified: data.modWasModified,\n          compiled: false,\n        });\n      } else {\n        setModDetails({\n          modId: data.modId,\n          modWasModified: data.modWasModified,\n          compiled: true,\n          disabled: data.modDetails.disabled,\n          loggingEnabled: data.modDetails.loggingEnabled,\n          debugLoggingEnabled: data.modDetails.debugLoggingEnabled,\n        });\n      }\n    }, [])\n  );\n\n  const onExitEditorMode = useCallback(() => {\n    setModDetails(null);\n  }, []);\n\n  if (!modDetails) {\n    return null;\n  }\n\n  return (\n    <EditorModeControls\n      key={modDetails.modId}\n      initialModDetails={modDetails}\n      onExitEditorMode={onExitEditorMode}\n    />\n  );\n}\n\nexport default Sidebar;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/sidebar/mockData.ts",
    "content": "import vsCodeApi from '../vsCodeApi';\n\nexport const useMockData = !vsCodeApi;\n\nexport const mockSidebarModDetails = !useMockData\n  ? null\n  : {\n      modId: 'new-mod-test',\n      modWasModified: false,\n      compiled: true,\n      disabled: false,\n      loggingEnabled: false,\n      debugLoggingEnabled: false,\n    };\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/swrHelpers.ts",
    "content": "export const fetchText = (input: RequestInfo | URL, init?: RequestInit) =>\n  fetch(input, init).then((res) => res.text());\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/utils.spec.ts",
    "content": "import { sanitizeUrl } from './utils';\n\ndescribe('sanitizeUrl', () => {\n  it('should allow http URLs', () => {\n    expect(sanitizeUrl('http://example.com')).toBe('http://example.com');\n    expect(sanitizeUrl('http://example.com/path')).toBe('http://example.com/path');\n  });\n\n  it('should allow https URLs', () => {\n    expect(sanitizeUrl('https://example.com')).toBe('https://example.com');\n    expect(sanitizeUrl('https://example.com/path')).toBe('https://example.com/path');\n  });\n\n  it('should reject javascript: URLs', () => {\n    // eslint-disable-next-line no-script-url\n    expect(sanitizeUrl('javascript:alert(1)')).toBeUndefined();\n  });\n\n  it('should reject data: URLs', () => {\n    expect(sanitizeUrl('data:text/html,<script>alert(1)</script>')).toBeUndefined();\n  });\n\n  it('should reject file: URLs', () => {\n    expect(sanitizeUrl('file:///etc/passwd')).toBeUndefined();\n  });\n\n  it('should reject vbscript: URLs', () => {\n    expect(sanitizeUrl('vbscript:msgbox(1)')).toBeUndefined();\n  });\n\n  it('should handle undefined input', () => {\n    expect(sanitizeUrl(undefined)).toBeUndefined();\n  });\n\n  it('should handle empty string', () => {\n    expect(sanitizeUrl('')).toBeUndefined();\n    expect(sanitizeUrl('   ')).toBeUndefined();\n  });\n\n  it('should handle invalid URLs', () => {\n    expect(sanitizeUrl('not a url')).toBeUndefined();\n    expect(sanitizeUrl('htp://example.com')).toBeUndefined();\n  });\n\n  it('should preserve query parameters', () => {\n    expect(sanitizeUrl('https://example.com?foo=bar')).toBe('https://example.com?foo=bar');\n  });\n\n  it('should preserve URL fragments', () => {\n    expect(sanitizeUrl('https://example.com#section')).toBe('https://example.com#section');\n  });\n});\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/utils.ts",
    "content": "/**\n * Sanitizes a URL to only allow http:// or https:// protocols.\n * Returns undefined if the URL is invalid or uses a disallowed protocol.\n *\n * @param url - The URL to sanitize\n * @returns The sanitized URL or undefined if invalid\n */\nexport function sanitizeUrl(url: string | undefined): string | undefined {\n  if (!url || typeof url !== 'string') {\n    return undefined;\n  }\n\n  const trimmedUrl = url.trim();\n  if (!trimmedUrl) {\n    return undefined;\n  }\n\n  try {\n    const parsed = new URL(trimmedUrl);\n\n    // Only allow http and https protocols\n    if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n      return trimmedUrl;\n    }\n\n    return undefined;\n  } catch (e) {\n    console.warn(`Invalid URL format (${url}):`, e);\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/vsCodeApi.ts",
    "content": "// https://github.com/microsoft/vscode/issues/96221#issuecomment-735408921\ndeclare function acquireVsCodeApi<T = unknown>(): {\n  getState: () => T;\n  setState: (data: T) => void;\n  postMessage: (msg: unknown) => void;\n};\n\nconst vsCodeApi =\n  typeof acquireVsCodeApi !== 'undefined' ? acquireVsCodeApi() : null;\n\nexport default vsCodeApi;\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPC.ts",
    "content": "import { useCallback, useState } from 'react';\nimport { useEventListener } from 'usehooks-ts';\n\nimport vsCodeApi from './vsCodeApi';\nimport {\n  CancelUpdateReplyData,\n  CompileEditedModData,\n  CompileEditedModReplyData,\n  CompileModData,\n  CompileModReplyData,\n  DeleteModData,\n  DeleteModReplyData,\n  EditModData,\n  EnableEditedModData,\n  EnableEditedModLoggingData,\n  EnableEditedModLoggingReplyData,\n  EnableEditedModReplyData,\n  EnableModData,\n  EnableModReplyData,\n  ExitEditorModeData,\n  ExitEditorModeReplyData,\n  ForkModData,\n  GetAppSettingsReplyData,\n  GetFeaturedModsReplyData,\n  GetInitialAppSettingsReplyData,\n  GetInstalledModsReplyData,\n  GetModConfigData,\n  GetModConfigReplyData,\n  GetModSettingsData,\n  GetModSettingsReplyData,\n  GetModSourceDataData,\n  GetModSourceDataReplyData,\n  GetModVersionsData,\n  GetModVersionsReplyData,\n  GetRepositoryModSourceDataData,\n  GetRepositoryModSourceDataReplyData,\n  GetRepositoryModsReplyData,\n  InstallModData,\n  InstallModReplyData,\n  NoData,\n  SetEditedModDetailsData,\n  SetEditedModIdData,\n  SetModSettingsData,\n  SetModSettingsReplyData,\n  SetNewAppSettingsData,\n  SetNewModConfigData,\n  StartUpdateReplyData,\n  UpdateAppSettingsData,\n  UpdateAppSettingsReplyData,\n  UpdateDownloadProgressEventData,\n  UpdateInstalledModsDetailsData,\n  UpdateInstallingEventData,\n  UpdateModConfigData,\n  UpdateModConfigReplyData,\n  UpdateModRatingData,\n  UpdateModRatingReplyData\n} from './webviewIPCMessages';\n\n// Message types:\n// * 'message' is a message from the webview to the extension.\n// * 'messageWithReply' is a message from the webview to the extension that expects a reply.\n// * 'reply' is a reply to a 'messageWithReply' message.\n// * 'event' is a message from the extension to the webview.\ntype MessageType = 'message' | 'messageWithReply' | 'reply' | 'event';\n\ntype CommonMessageBase = {\n  type: MessageType;\n  command: string;\n  data: Record<string, unknown>;\n};\n\ntype MessageRegular = CommonMessageBase & {\n  type: 'message';\n  command: string;\n  data: Record<string, unknown>;\n};\n\ntype MessageWithReply = CommonMessageBase & {\n  type: 'messageWithReply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\ntype Reply = CommonMessageBase & {\n  type: 'reply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\ntype Event = CommonMessageBase & {\n  type: 'event';\n  command: string;\n  data: Record<string, unknown>;\n};\n\ntype MessageAny = MessageRegular | MessageWithReply | Reply | Event;\n\n////////////////////////////////////////////////////////////\n// Messages.\n\nexport function createNewMod() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'createNewMod',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function editMod(data: EditModData) {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'editMod',\n    data,\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function forkMod(data: ForkModData) {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'forkMod',\n    data,\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function showAdvancedDebugLogOutput() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'showAdvancedDebugLogOutput',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function showLogOutput() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'showLogOutput',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function getInitialSidebarParams() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'getInitialSidebarParams',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function stopCompileEditedMod() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'stopCompileEditedMod',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\nexport function previewEditedMod() {\n  const msg: MessageRegular = {\n    type: 'message',\n    command: 'previewEditedMod',\n    data: {},\n  };\n  vsCodeApi?.postMessage(msg);\n}\n\n////////////////////////////////////////////////////////////\n// Messages with replies.\n\nlet messageId = 0;\n\nfunction usePostMessageWithReplyWithHandler<\n  TPostMessage extends Record<string, unknown>,\n  TReply,\n  TContext extends Record<string, unknown>\n>(eventName: string, handler: (data: TReply, context?: TContext) => void) {\n  const [pendingMessageId, setPendingMessageId] = useState<number>();\n  const [context, setContext] = useState<TContext>();\n\n  const postMessage = useCallback(\n    (data: TPostMessage, context?: TContext) => {\n      messageId++;\n      if (messageId > 0x7fffffff) {\n        messageId = 1;\n      }\n\n      const message: MessageWithReply = {\n        type: 'messageWithReply',\n        command: eventName,\n        data,\n        messageId,\n      };\n      vsCodeApi?.postMessage(message);\n\n      setPendingMessageId(messageId);\n      setContext(context);\n    },\n    [eventName]\n  );\n\n  useEventListener(\n    'message',\n    useCallback(\n      (message) => {\n        const data = message.data as MessageAny;\n\n        if (pendingMessageId === undefined) {\n          return;\n        }\n\n        if (\n          data.type === 'reply' &&\n          data.command === eventName &&\n          data.messageId === pendingMessageId\n        ) {\n          handler(data.data as TReply, context);\n          setPendingMessageId(undefined);\n          setContext(undefined);\n        }\n      },\n      [context, eventName, handler, pendingMessageId]\n    )\n  );\n\n  return { postMessage, pending: pendingMessageId !== undefined, context };\n}\n\nexport function useGetInitialAppSettings<\n  TContext extends Record<string, unknown>\n>(handler: (data: GetInitialAppSettingsReplyData, context?: TContext) => void) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    GetInitialAppSettingsReplyData,\n    TContext\n  >('getInitialAppSettings', handler);\n  return {\n    getInitialAppSettings: result.postMessage,\n    getInitialAppSettingsPending: result.pending,\n    getInitialAppSettingsContext: result.context,\n  };\n}\n\nexport function useInstallMod<TContext extends Record<string, unknown>>(\n  handler: (data: InstallModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    InstallModData,\n    InstallModReplyData,\n    TContext\n  >('installMod', handler);\n  return {\n    installMod: result.postMessage,\n    installModPending: result.pending,\n    installModContext: result.context,\n  };\n}\n\nexport function useCompileMod<TContext extends Record<string, unknown>>(\n  handler: (data: CompileModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    CompileModData,\n    CompileModReplyData,\n    TContext\n  >('compileMod', handler);\n  return {\n    compileMod: result.postMessage,\n    compileModPending: result.pending,\n    compileModContext: result.context,\n  };\n}\n\nexport function useEnableMod<TContext extends Record<string, unknown>>(\n  handler: (data: EnableModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    EnableModData,\n    EnableModReplyData,\n    TContext\n  >('enableMod', handler);\n  return {\n    enableMod: result.postMessage,\n    enableModPending: result.pending,\n    enableModContext: result.context,\n  };\n}\n\nexport function useDeleteMod<TContext extends Record<string, unknown>>(\n  handler: (data: DeleteModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    DeleteModData,\n    DeleteModReplyData,\n    TContext\n  >('deleteMod', handler);\n  return {\n    deleteMod: result.postMessage,\n    deleteModPending: result.pending,\n    deleteModContext: result.context,\n  };\n}\n\nexport function useUpdateModRating<TContext extends Record<string, unknown>>(\n  handler: (data: UpdateModRatingReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    UpdateModRatingData,\n    UpdateModRatingReplyData,\n    TContext\n  >('updateModRating', handler);\n  return {\n    updateModRating: result.postMessage,\n    updateModRatingPending: result.pending,\n    updateModRatingContext: result.context,\n  };\n}\n\nexport function useGetInstalledMods<TContext extends Record<string, unknown>>(\n  handler: (data: GetInstalledModsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    GetInstalledModsReplyData,\n    TContext\n  >('getInstalledMods', handler);\n  return {\n    getInstalledMods: result.postMessage,\n    getInstalledModsPending: result.pending,\n    getInstalledModsContext: result.context,\n  };\n}\n\nexport function useGetFeaturedMods<TContext extends Record<string, unknown>>(\n  handler: (data: GetFeaturedModsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    GetFeaturedModsReplyData,\n    TContext\n  >('getFeaturedMods', handler);\n  return {\n    getFeaturedMods: result.postMessage,\n    getFeaturedModsPending: result.pending,\n    getFeaturedModsContext: result.context,\n  };\n}\n\nexport function useGetModSourceData<TContext extends Record<string, unknown>>(\n  handler: (data: GetModSourceDataReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    GetModSourceDataData,\n    GetModSourceDataReplyData,\n    TContext\n  >('getModSourceData', handler);\n  return {\n    getModSourceData: result.postMessage,\n    getModSourceDataPending: result.pending,\n    getModSourceDataContext: result.context,\n  };\n}\n\nexport function useGetRepositoryModSourceData<\n  TContext extends Record<string, unknown>\n>(\n  handler: (\n    data: GetRepositoryModSourceDataReplyData,\n    context?: TContext\n  ) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    GetRepositoryModSourceDataData,\n    GetRepositoryModSourceDataReplyData,\n    TContext\n  >('getRepositoryModSourceData', handler);\n  return {\n    getRepositoryModSourceData: result.postMessage,\n    getRepositoryModSourceDataPending: result.pending,\n    getRepositoryModSourceDataContext: result.context,\n  };\n}\n\nexport function useGetModVersions<TContext extends Record<string, unknown>>(\n  handler: (data: GetModVersionsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    GetModVersionsData,\n    GetModVersionsReplyData,\n    TContext\n  >('getModVersions', handler);\n  return {\n    getModVersions: result.postMessage,\n    getModVersionsPending: result.pending,\n    getModVersionsContext: result.context,\n  };\n}\n\nexport function useGetAppSettings<TContext extends Record<string, unknown>>(\n  handler: (data: GetAppSettingsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    GetAppSettingsReplyData,\n    TContext\n  >('getAppSettings', handler);\n  return {\n    getAppSettings: result.postMessage,\n    getAppSettingsPending: result.pending,\n    getAppSettingsContext: result.context,\n  };\n}\n\nexport function useUpdateAppSettings<TContext extends Record<string, unknown>>(\n  handler: (data: UpdateAppSettingsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    UpdateAppSettingsData,\n    UpdateAppSettingsReplyData,\n    TContext\n  >('updateAppSettings', handler);\n  return {\n    updateAppSettings: result.postMessage,\n    updateAppSettingsPending: result.pending,\n    updateAppSettingsContext: result.context,\n  };\n}\n\nexport function useGetModSettings<TContext extends Record<string, unknown>>(\n  handler: (data: GetModSettingsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    GetModSettingsData,\n    GetModSettingsReplyData,\n    TContext\n  >('getModSettings', handler);\n  return {\n    getModSettings: result.postMessage,\n    getModSettingsPending: result.pending,\n    getModSettingsContext: result.context,\n  };\n}\n\nexport function useSetModSettings<TContext extends Record<string, unknown>>(\n  handler: (data: SetModSettingsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    SetModSettingsData,\n    SetModSettingsReplyData,\n    TContext\n  >('setModSettings', handler);\n  return {\n    setModSettings: result.postMessage,\n    setModSettingsPending: result.pending,\n    setModSettingsContext: result.context,\n  };\n}\n\nexport function useGetModConfig<TContext extends Record<string, unknown>>(\n  handler: (data: GetModConfigReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    GetModConfigData,\n    GetModConfigReplyData,\n    TContext\n  >('getModConfig', handler);\n  return {\n    getModConfig: result.postMessage,\n    getModConfigPending: result.pending,\n    getModConfigContext: result.context,\n  };\n}\n\nexport function useUpdateModConfig<TContext extends Record<string, unknown>>(\n  handler: (data: UpdateModConfigReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    UpdateModConfigData,\n    UpdateModConfigReplyData,\n    TContext\n  >('updateModConfig', handler);\n  return {\n    updateModConfig: result.postMessage,\n    updateModConfigPending: result.pending,\n    updateModConfigContext: result.context,\n  };\n}\n\nexport function useGetRepositoryMods<TContext extends Record<string, unknown>>(\n  handler: (data: GetRepositoryModsReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    GetRepositoryModsReplyData,\n    TContext\n  >('getRepositoryMods', handler);\n  return {\n    getRepositoryMods: result.postMessage,\n    getRepositoryModsPending: result.pending,\n    getRepositoryModsContext: result.context,\n  };\n}\n\nexport function useStartUpdate<TContext extends Record<string, unknown>>(\n  handler: (data: StartUpdateReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    StartUpdateReplyData,\n    TContext\n  >('startUpdate', handler);\n  return {\n    startUpdate: result.postMessage,\n    startUpdatePending: result.pending,\n    startUpdateContext: result.context,\n  };\n}\n\nexport function useCancelUpdate<TContext extends Record<string, unknown>>(\n  handler: (data: CancelUpdateReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    NoData,\n    CancelUpdateReplyData,\n    TContext\n  >('cancelUpdate', handler);\n  return {\n    cancelUpdate: result.postMessage,\n    cancelUpdatePending: result.pending,\n    cancelUpdateContext: result.context,\n  };\n}\n\nexport function useEnableEditedMod<TContext extends Record<string, unknown>>(\n  handler: (data: EnableEditedModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    EnableEditedModData,\n    EnableEditedModReplyData,\n    TContext\n  >('enableEditedMod', handler);\n  return {\n    enableEditedMod: result.postMessage,\n    enableEditedModPending: result.pending,\n    enableEditedModContext: result.context,\n  };\n}\n\nexport function useEnableEditedModLogging<\n  TContext extends Record<string, unknown>\n>(\n  handler: (data: EnableEditedModLoggingReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    EnableEditedModLoggingData,\n    EnableEditedModLoggingReplyData,\n    TContext\n  >('enableEditedModLogging', handler);\n  return {\n    enableEditedModLogging: result.postMessage,\n    enableEditedModLoggingPending: result.pending,\n    enableEditedModLoggingContext: result.context,\n  };\n}\n\nexport function useCompileEditedMod<TContext extends Record<string, unknown>>(\n  handler: (data: CompileEditedModReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    CompileEditedModData,\n    CompileEditedModReplyData,\n    TContext\n  >('compileEditedMod', handler);\n  return {\n    compileEditedMod: result.postMessage,\n    compileEditedModPending: result.pending,\n    compileEditedModContext: result.context,\n  };\n}\n\nexport function useExitEditorMode<TContext extends Record<string, unknown>>(\n  handler: (data: ExitEditorModeReplyData, context?: TContext) => void\n) {\n  const result = usePostMessageWithReplyWithHandler<\n    ExitEditorModeData,\n    ExitEditorModeReplyData,\n    TContext\n  >('exitEditorMode', handler);\n  return {\n    exitEditorMode: result.postMessage,\n    exitEditorModePending: result.pending,\n    exitEditorModeContext: result.context,\n  };\n}\n\n////////////////////////////////////////////////////////////\n// Events.\n\nfunction useEventMessageWithHandler<T>(\n  eventName: string,\n  handler: (data: T) => void\n) {\n  useEventListener(\n    'message',\n    useCallback(\n      (message) => {\n        const data = message.data as MessageAny;\n        if (data.type === 'event' && data.command === eventName) {\n          handler(data.data as T);\n        }\n      },\n      [eventName, handler]\n    )\n  );\n}\n\nexport function useSetNewAppSettings(\n  handler: (data: SetNewAppSettingsData) => void\n) {\n  useEventMessageWithHandler<SetNewAppSettingsData>(\n    'setNewAppSettings',\n    handler\n  );\n}\n\nexport function useUpdateDownloadProgress(\n  handler: (data: UpdateDownloadProgressEventData) => void\n) {\n  useEventMessageWithHandler<UpdateDownloadProgressEventData>(\n    'updateDownloadProgress',\n    handler\n  );\n}\n\nexport function useUpdateInstalling(\n  handler: (data: UpdateInstallingEventData) => void\n) {\n  useEventMessageWithHandler<UpdateInstallingEventData>(\n    'updateInstalling',\n    handler\n  );\n}\n\nexport function useUpdateInstalledModsDetails(\n  handler: (data: UpdateInstalledModsDetailsData) => void\n) {\n  useEventMessageWithHandler<UpdateInstalledModsDetailsData>(\n    'updateInstalledModsDetails',\n    handler\n  );\n}\n\nexport function useSetNewModConfig(\n  handler: (data: SetNewModConfigData) => void\n) {\n  useEventMessageWithHandler<SetNewModConfigData>(\n    'setNewModConfig',\n    handler\n  );\n}\n\nexport function useSetEditedModId(handler: (data: SetEditedModIdData) => void) {\n  useEventMessageWithHandler<SetEditedModIdData>('setEditedModId', handler);\n}\n\nexport function useCompileEditedModStart(handler: (data: NoData) => void) {\n  useEventMessageWithHandler<NoData>('compileEditedModStart', handler);\n}\n\nexport function useEditedModWasModified(handler: (data: NoData) => void) {\n  useEventMessageWithHandler<NoData>('editedModWasModified', handler);\n}\n\nexport function useSetEditedModDetails(\n  handler: (data: SetEditedModDetailsData) => void\n) {\n  useEventMessageWithHandler<SetEditedModDetailsData>(\n    'setEditedModDetails',\n    handler\n  );\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPCMessages.ts",
    "content": "// Message types:\n// * 'message' is a message from the webview to the extension.\n// * 'messageWithReply' is a message from the webview to the extension that expects a reply.\n// * 'reply' is a reply to a 'messageWithReply' message.\n// * 'event' is a message from the extension to the webview.\nexport type webviewIPCMessageType =\n  | 'message'\n  | 'messageWithReply'\n  | 'reply'\n  | 'event';\n\nexport type webviewIPCMessageCommon = {\n  type: webviewIPCMessageType;\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessage = webviewIPCMessageCommon & {\n  type: 'message';\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessageWithReply = webviewIPCMessageCommon & {\n  type: 'messageWithReply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\nexport type webviewIPCReply = webviewIPCMessageCommon & {\n  type: 'reply';\n  command: string;\n  data: Record<string, unknown>;\n  messageId: number;\n};\n\nexport type webviewIPCEvent = webviewIPCMessageCommon & {\n  type: 'event';\n  command: string;\n  data: Record<string, unknown>;\n};\n\nexport type webviewIPCMessageAny =\n  | webviewIPCMessage\n  | webviewIPCMessageWithReply\n  | webviewIPCReply\n  | webviewIPCEvent;\n\n////////////////////////////////////////////////////////////\n// Types.\n\nexport type NoData = Record<string, unknown>;\n\nexport type ModConfig = {\n  // libraryFileName: string;\n  disabled: boolean;\n  loggingEnabled: boolean;\n  debugLoggingEnabled: boolean;\n  include: string[];\n  exclude: string[];\n  includeCustom: string[];\n  excludeCustom: string[];\n  includeExcludeCustomOnly: boolean;\n  patternsMatchCriticalSystemProcesses: boolean;\n  architecture: string[];\n  version: string;\n};\n\nexport type AppSettings = {\n  language: string;\n  disableUpdateCheck: boolean;\n  disableRunUIScheduledTask: boolean | null;\n  devModeOptOut: boolean;\n  devModeUsedAtLeastOnce: boolean;\n  hideTrayIcon: boolean;\n  alwaysCompileModsLocally: boolean;\n  dontAutoShowToolkit: boolean;\n  modTasksDialogDelay: number;\n  safeMode: boolean;\n  loggingVerbosity: number;\n  engine: {\n    loggingVerbosity: number;\n    include: string[];\n    exclude: string[];\n    injectIntoCriticalProcesses: boolean;\n    injectIntoIncompatiblePrograms: boolean;\n    injectIntoGames: boolean;\n  };\n};\n\nexport type ModMetadata = Partial<{\n  version: string;\n  // id: string;\n  github: string;\n  twitter: string;\n  homepage: string;\n  compilerOptions: string;\n  license: string;\n  donateUrl: string;\n  name: string;\n  description: string;\n  author: string;\n  include: string[];\n  exclude: string[];\n  architecture: string[];\n}>;\n\nexport type RepositoryDetails = {\n  users: number;\n  rating: number;\n  // ratingUsers: number;\n  ratingBreakdown: number[];\n  defaultSorting: number;\n  published: number;\n  updated: number;\n};\n\nexport type AppUISettings = {\n  language: string;\n  devModeOptOut: boolean;\n  devModeUsedAtLeastOnce: boolean;\n  loggingEnabled: boolean;\n  updateIsAvailable: boolean;\n  safeMode: boolean;\n};\n\nexport type InitialSettingsValue =\n  | boolean\n  | number\n  | string\n  | InitialSettings\n  | InitialSettingsArrayValue;\n\nexport type InitialSettingsArrayValue = number[] | string[] | InitialSettings[];\n\nexport type InitialSettingItem = {\n  key: string;\n  value: InitialSettingsValue;\n  name?: string;\n  description?: string;\n  options?: Record<string, string>[];\n};\n\nexport type InitialSettings = InitialSettingItem[];\n\n////////////////////////////////////////////////////////////\n// Messages.\n\nexport type EditModData = {\n  modId: string;\n};\n\nexport type ForkModData = {\n  modId: string;\n  modSource?: string;\n};\n\n////////////////////////////////////////////////////////////\n// Messages with replies.\n\nexport type GetInitialAppSettingsReplyData = {\n  appUISettings: Partial<AppUISettings>;\n};\n\nexport type InstallModData = {\n  modId: string;\n  modSource: string;\n  disabled?: boolean;\n};\n\nexport type InstallModReplyData = {\n  modId: string;\n  installedModDetails: {\n    metadata: ModMetadata;\n    config: ModConfig;\n  } | null;\n};\n\nexport type CompileModData = {\n  modId: string;\n  disabled?: boolean;\n};\n\nexport type CompileModReplyData = {\n  modId: string;\n  compiledModDetails: {\n    metadata: ModMetadata;\n    config: ModConfig;\n  } | null;\n};\n\nexport type EnableModData = {\n  modId: string;\n  enable: boolean;\n};\n\nexport type EnableModReplyData = {\n  modId: string;\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type DeleteModData = {\n  modId: string;\n};\n\nexport type DeleteModReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type UpdateModRatingData = {\n  modId: string;\n  rating: number;\n};\n\nexport type UpdateModRatingReplyData = {\n  modId: string;\n  rating: number;\n  succeeded: boolean;\n};\n\nexport type GetInstalledModsReplyData = {\n  installedMods: Record<\n    string,\n    {\n      metadata: ModMetadata | null;\n      config: ModConfig | null;\n      updateAvailable: boolean;\n      userRating: number;\n    }\n  >;\n};\n\nexport type GetFeaturedModsReplyData = {\n  featuredMods: Record<\n    string,\n    {\n      metadata: ModMetadata;\n      details: RepositoryDetails;\n    }\n  > | null;\n};\n\nexport type GetModSourceDataData = {\n  modId: string;\n};\n\nexport type GetModSourceDataReplyData = {\n  modId: string;\n  data: {\n    source: string | null;\n    metadata: ModMetadata | null;\n    readme: string | null;\n    initialSettings: InitialSettings | null;\n  };\n};\n\nexport type GetRepositoryModSourceDataData = {\n  modId: string;\n  version?: string;\n};\n\nexport type GetRepositoryModSourceDataReplyData = {\n  modId: string;\n  version?: string;\n  data: {\n    source: string | null;\n    metadata: ModMetadata | null;\n    readme: string | null;\n    initialSettings: InitialSettings | null;\n  };\n};\n\nexport type GetModVersionsData = {\n  modId: string;\n};\n\nexport type GetModVersionsReplyData = {\n  modId: string;\n  versions: {\n    version: string;\n    timestamp: number;\n    isPreRelease: boolean;\n  }[];\n};\n\nexport type GetAppSettingsReplyData = {\n  appSettings: Partial<AppSettings>;\n};\n\nexport type UpdateAppSettingsData = {\n  appSettings: Partial<AppSettings>;\n};\n\nexport type UpdateAppSettingsReplyData = {\n  appSettings: Partial<AppSettings>;\n  succeeded: boolean;\n};\n\nexport type GetModSettingsData = {\n  modId: string;\n};\n\nexport type GetModSettingsReplyData = {\n  modId: string;\n  settings: Record<string, string | number>;\n};\n\nexport type SetModSettingsData = {\n  modId: string;\n  settings: Record<string, string | number>;\n};\n\nexport type SetModSettingsReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type GetModConfigData = {\n  modId: string;\n};\n\nexport type GetModConfigReplyData = {\n  modId: string;\n  config: ModConfig | null;\n};\n\nexport type UpdateModConfigData = {\n  modId: string;\n  config: Partial<ModConfig>;\n};\n\nexport type UpdateModConfigReplyData = {\n  modId: string;\n  succeeded: boolean;\n};\n\nexport type GetRepositoryModsReplyData = {\n  mods: Record<\n    string,\n    {\n      repository: {\n        metadata: ModMetadata;\n        details: RepositoryDetails;\n        featured?: boolean;\n      };\n      installed?: {\n        metadata: ModMetadata | null;\n        config: ModConfig | null;\n        userRating: number;\n      };\n    }\n  > | null;\n};\n\nexport type StartUpdateReplyData = {\n  succeeded: boolean;\n  error?: string;\n};\n\nexport type CancelUpdateReplyData = {\n  succeeded: boolean;\n};\n\nexport type EnableEditedModData = {\n  enable: boolean;\n};\n\nexport type EnableEditedModReplyData = {\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type EnableEditedModLoggingData = {\n  enable: boolean;\n};\n\nexport type EnableEditedModLoggingReplyData = {\n  enabled: boolean;\n  succeeded: boolean;\n};\n\nexport type CompileEditedModData = {\n  disabled: boolean;\n  loggingEnabled: boolean;\n};\n\nexport type CompileEditedModReplyData = {\n  succeeded: boolean;\n  clearModified: boolean;\n};\n\nexport type ExitEditorModeData = {\n  saveToDrafts: boolean;\n};\n\nexport type ExitEditorModeReplyData = {\n  succeeded: boolean;\n};\n\n////////////////////////////////////////////////////////////\n// Events.\n\nexport type SetNewAppSettingsData = {\n  appUISettings: Partial<AppUISettings>;\n};\n\nexport type UpdateDownloadProgressEventData = {\n  progress: number; // 0-100\n};\n\nexport type UpdateInstallingEventData = NoData;\n\nexport type UpdateInstalledModsDetailsData = {\n  details: Record<\n    string,\n    {\n      updateAvailable: boolean;\n      userRating: number;\n    }\n  >;\n};\n\nexport type SetNewModConfigData = {\n  modId: string,\n  config: Partial<ModConfig>\n};\n\nexport type SetEditedModIdData = {\n  modId: string;\n};\n\nexport type SetEditedModDetailsData = {\n  modId: string;\n  modDetails: ModConfig | null;\n  modWasModified: boolean;\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/environments/environment.prod.ts",
    "content": "export const environment = {\n  production: true,\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/environments/environment.ts",
    "content": "// This file can be replaced during build by using the `fileReplacements` array.\n// When building for production, this file is replaced with `environment.prod.ts`.\n\nexport const environment = {\n  production: false,\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Windhawk</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\" />\n    <meta name=\"description\" content=\"The customization marketplace for Windows and programs. Customize your programs with available code snippets or create your own customizations.\" />\n  </head>\n  <body data-vscode-context='{\"preventDefaultContextMenuItems\": true}'>\n    <div id=\"root\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ar/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ar/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"جار التحميل...\",\n    \"loadingFailed\": \"فشل التحميل، يرجى التحقق من اتصال الإنترنت\",\n    \"loadingFailedTitle\": \"فشل التحميل\",\n    \"loadingFailedSubtitle\": \"يرجى التحقق من اتصال الإنترنت والمحاولة مرة أخرى\",\n    \"tryAgain\": \"حاول مرة أخرى\",\n    \"updating\": \"جار التحديث...\",\n    \"installing\": \"جار التثبيت...\",\n    \"compiling\": \"جار التجميع...\",\n    \"cut\": \"قص\",\n    \"copy\": \"نسخ\",\n    \"paste\": \"لصق\",\n    \"selectAll\": \"تحديد الكل\"\n  },\n  \"appHeader\": {\n    \"home\": \"الرئيسية\",\n    \"explore\": \"استكشاف\",\n    \"settings\": \"الإعدادات\",\n    \"about\": \"حول\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"تحديث متاح\",\n    \"installed\": \"مثبت\",\n    \"details\": \"تفاصيل\",\n    \"update\": \"تحديث\",\n    \"install\": \"تثبيت\",\n    \"compile\": \"تجميع\",\n    \"disable\": \"تعطيل\",\n    \"enable\": \"تمكين\",\n    \"edit\": \"تعديل\",\n    \"fork\": \"تفرع\",\n    \"remove\": \"إزالة\",\n    \"removeConfirm\": \"هل أنت متأكد أنك تريد إزالة هذا المود؟\",\n    \"removeConfirmOk\": \"إزالة المود\",\n    \"removeConfirmCancel\": \"إلغاء\",\n    \"notCompiled\": \"يجب تجميع المود\",\n    \"editedLocally\": \"تم تعديل المود محليًا\",\n    \"noDescription\": \"(لا يوجد وصف)\",\n    \"users_zero\": \"لا يوجد مستخدمون\",\n    \"users_one\": \"{{formattedCount}} مستخدم\",\n    \"users_two\": \"{{formattedCount}} مستخدمان\",\n    \"users_few\": \"{{formattedCount}} مستخدمون\",\n    \"users_many\": \"{{formattedCount}} مستخدم\",\n    \"users_other\": \"{{formattedCount}} مستخدم\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"الإصدار المثبت\",\n      \"latestVersion\": \"أحدث إصدار\",\n      \"loading\": \"جار التحميل...\",\n      \"loadingFailed\": \"فشل التحميل\",\n      \"modId\": \"معرف المود\",\n      \"modVersion\": \"إصدار المود\",\n      \"modAuthor\": {\n        \"title\": \"مؤلف المود\",\n        \"homepage\": \"الصفحة الرئيسية\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (تويتر)\"\n      },\n      \"processes\": {\n        \"all\": \"جميع العمليات\",\n        \"allBut\": \"جميع ما عدا {{list}}\",\n        \"except\": \"{{included}} باستثناء {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"العمليات المستهدفة\",\n          \"excluded\": \"مستبعد\"\n        }\n      },\n      \"updateNotNeeded\": \"الإصدار المثبت مطابق لأحدث إصدار\"\n    },\n    \"details\": {\n      \"title\": \"تفاصيل\",\n      \"noData\": \"تفاصيل المود مفقودة.\"\n    },\n    \"settings\": {\n      \"title\": \"الإعدادات\",\n      \"noData\": \"لا توجد إعدادات متاحة للمود.\",\n      \"saveButton\": \"حفظ الإعدادات\",\n      \"sampleValue\": \"قيمة نموذجية\",\n      \"arrayItemAdd\": \"إضافة عنصر جديد\",\n      \"arrayItemRemove\": \"إزالة عنصر\"\n    },\n    \"code\": {\n      \"title\": \"كود المصدر\",\n      \"noData\": \"مصدر المود مفقود.\",\n      \"collapseExtra\": \"طي ملف Readme والإعدادات\"\n    },\n    \"changelog\": {\n      \"title\": \"سجل التغييرات\",\n      \"loadingFailed\": \"فشل تحميل سجل التغييرات. <0>انقر هنا</0> لعرضه على GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"متقدم\",\n      \"debugLogging\": {\n        \"title\": \"تسجيل التصحيح\",\n        \"description\": \"يمكن أن يكون مفيدًا لاستكشاف مشكلات المود.\",\n        \"none\": \"لا شيء\",\n        \"modLogs\": \"سجلات المود\",\n        \"detailedLogs\": \"سجلات تصحيح مفصلة\",\n        \"showLogButton\": \"عرض سجل الإخراج\"\n      },\n      \"modSettings\": {\n        \"title\": \"إعدادات المود\",\n        \"description\": \"تصدير أو مشاركة إعدادات المود بسهولة.\",\n        \"loadButton\": \"تحميل\",\n        \"loadFormattedButton\": \"تحميل منسق\",\n        \"saveButton\": \"حفظ\",\n        \"invalidData\": \"بيانات JSON غير صالحة\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"قائمة تضمين العمليات المخصصة\",\n        \"descriptionInclusion\": \"قائمة مخصصة من أسماء/مسارات الملفات التنفيذية الإضافية التي سيستهدفها المود. تضاف القائمة إلى قائمة التضمين التي حددها مؤلف المود لتحديد العمليات المستهدفة. لكل عملية، يتم تحميل المود إذا كان مسار الملف التنفيذي يطابق أحد عناصر التضمين ولا يطابق أي عنصر استبعاد.\",\n        \"titleExclusion\": \"قائمة استبعاد العمليات المخصصة\",\n        \"descriptionExclusion\": \"قائمة مخصصة من أسماء/مسارات الملفات التنفيذية الإضافية التي سيتم استبعادها من الاستهداف. تضاف القائمة إلى قائمة الاستبعاد التي حددها مؤلف المود لتحديد العمليات المستهدفة. لكل عملية، يتم تحميل المود إذا كان مسار الملف التنفيذي يطابق أحد عناصر التضمين ولا يطابق أي عنصر استبعاد.\",\n        \"processListPlaceholder\": \"أسماء/مسارات العمليات، كل واحد في سطر، على سبيل المثال:\",\n        \"invalidCharactersWarning\": \"تحتوي قائمة العمليات على أحرف غير صالحة سيتم حذفها: {{invalidCharacters}}\",\n        \"saveButton\": \"حفظ\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"تجاهل قوائم التضمين/الاستبعاد الخاصة بالمود\",\n        \"description\": \"تجاهل قوائم التضمين/الاستبعاد الخاصة بالمود واستخدم فقط القوائم المخصصة أعلاه.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"اعتبر أنماط قائمة التضمين للعمليات النظامية الحرجة\",\n        \"description\": \"افتراضيًا، يقوم Windhawk بتحميل المودات في العمليات النظامية الحرجة فقط إذا تم تضمين العملية بدون أنماط، مثل <0>critical.exe</0>، وليس <0>*</0> أو <0>*.exe</0>. لمزيد من التفاصيل حول العمليات النظامية الحرجة، يرجى الرجوع إلى <1>التوثيق</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"تغييرات أحدث إصدار\",\n      \"noData\": \"الإصدار المثبت مطابق لأحدث إصدار.\",\n      \"splitView\": \"عرض مقسم\",\n      \"expandLines_zero\": \"لا توجد أسطر مخفية\",\n      \"expandLines_one\": \"توسيع سطر مخفي واحد\",\n      \"expandLines_two\": \"توسيع سطرين مخفيين\",\n      \"expandLines_few\": \"توسيع {{count}} أسطر مخفية\",\n      \"expandLines_many\": \"توسيع {{count}} سطراً مخفياً\",\n      \"expandLines_other\": \"توسيع {{count}} سطر مخفي\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"ابحث عن المودات...\"\n  },\n  \"home\": {\n    \"browse\": \"تصفح المودات\",\n    \"installedMods\": {\n      \"title\": \"المودات المثبتة\",\n      \"noMods\": \"لا توجد مودات مثبتة\"\n    },\n    \"featuredMods\": {\n      \"title\": \"مودات مميزة\",\n      \"noMods\": \"لا توجد مودات مميزة لم يتم تثبيتها بعد\",\n      \"explore\": \"استكشاف مودات أخرى\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"الأكثر شهرة والأعلى تقييماً\",\n      \"popular\": \"الأكثر شهرة\",\n      \"topRated\": \"الأعلى تقييماً\",\n      \"newest\": \"الأحدث\",\n      \"lastUpdated\": \"آخر تحديث\",\n      \"alphabeticalOrder\": \"ترتيب أبجدي\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"اللغة\",\n      \"description\": \"اختر لغة العرض المفضلة لديك لـ Windhawk.\",\n      \"contribute\": \"<0>ساهم بترجمة جديدة</0>.\",\n      \"credits\": \"الترجمة العربية بواسطة <0>عبد الحق العمراوي</0>.\",\n      \"creditsLink\": \"mailto:abdelhaq1080@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"التحقق من التحديثات\",\n      \"description\": \"التحقق بشكل دوري من وجود إصدارات جديدة من Windhawk والمودات المثبتة.\"\n    },\n    \"devMode\": {\n      \"title\": \"وضع المطور\",\n      \"description\": \"عرض إجراءات المطورين مثل إنشاء وتعديل المودات.\"\n    },\n    \"advancedSettings\": \"إعدادات متقدمة\",\n    \"hideTrayIcon\": {\n      \"title\": \"إخفاء أيقونة الدرج\",\n      \"description\": \"ستحتاج إلى تعطيل هذا الخيار للخروج من Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"طلب صلاحيات المسؤول لتشغيل Windhawk\",\n      \"description\": \"يتطلب Windhawk حقوق المسؤول، ولكن بالنسبة لجهاز مستخدم واحد، قد يكون ظهور مطالبة UAC في كل مرة مزعجًا، لذلك يتجاوز Windhawk ذلك. فعّل هذا الخيار لطلب صلاحيات المسؤول لتشغيل Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"عدم إظهار مربع أدوات المجموعة تلقائيًا\",\n      \"description\": \"افتراضيًا، يعرض Windhawk مربع أدوات المجموعة تلقائيًا عند اكتشاف أن شريط المهام غير متاح، إما بسبب عدم استقرار النظام أو لأي سبب آخر. يتيح مربع الأدوات الخروج من Windhawk، أو التبديل إلى الوضع الآمن، أو إجراء عمليات أخرى. يمكن أيضًا عرض مربع الأدوات باستخدام اختصار لوحة المفاتيح Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"تأخير مربع حوار تهيئة المود\",\n      \"description\": \"عدد المللي ثانية للانتظار قبل عرض مربع تقدم تهيئة المود.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"إعدادات أكثر تقدمًا\",\n      \"restartNotice\": \"سيتم إعادة تشغيل Windhawk لتطبيق الإعدادات.\",\n      \"saveButton\": \"حفظ وإعادة تشغيل Windhawk\",\n      \"cancelButton\": \"إلغاء\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"مستوى تفصيل سجلات Windhawk\",\n      \"engineLoggingTitle\": \"مستوى تفصيل سجلات محرك Windhawk\",\n      \"description\": \"يمكن عرض السجلات باستخدام أداة مثل DebugView.\",\n      \"none\": \"لا شيء\",\n      \"error\": \"خطأ\",\n      \"verbose\": \"مفصل\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"قائمة استبعاد العمليات\",\n      \"descriptionExclusion\": \"قائمة بأسماء/مسارات العمليات التي لن يقوم Windhawk بحقنها. يمكن أن يكون ذلك مفيدًا في الحالات التي لا يكون فيها Windhawk متوافقًا مع برنامج معين. لاحظ أن إضافة عملية إلى هذه القائمة لن يمنع فقط تخصيص Windhawk لها، بل سيمنع أيضًا Windhawk من اعتراض العمليات الفرعية التي تنشئها هذه العملية. سيؤدي ذلك إلى تحميل المودات مع تأخير طفيف في مثل هذه الحالات.\",\n      \"descriptionExclusionWiki\": \"لمزيد من التفاصيل حول استبعاد العمليات وقوائم الاستبعاد المدمجة، يرجى الرجوع إلى <0>التوثيق</0>.\",\n      \"excludeCriticalProcesses\": \"استبعاد العمليات النظامية الحرجة\",\n      \"excludeIncompatiblePrograms\": \"استبعاد البرامج غير المتوافقة المعروفة\",\n      \"excludeGames\": \"استبعاد الألعاب المعروفة\",\n      \"titleInclusion\": \"قائمة تضمين العمليات\",\n      \"descriptionInclusion\": \"قائمة بأسماء/مسارات العمليات التي سيقوم Windhawk بحقنها، حتى لو كانت في قائمة الاستبعاد.\",\n      \"inclusionWithoutExclusionNotice\": \"قائمة تضمين العمليات ليس لها تأثير مع قائمة استبعاد العمليات الفارغة.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"إذا كنت تقصد استبعاد جميع العمليات ما عدا هذه، يمكنك تعيين \\\"*\\\" في قائمة استبعاد العمليات.\",\n      \"processListPlaceholder\": \"أسماء/مسارات العمليات، كل واحد في سطر، على سبيل المثال:\",\n      \"invalidCharactersWarning\": \"تحتوي قائمة العمليات على أحرف غير صالحة سيتم حذفها: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"بيتا\",\n    \"subtitle\": \"سوق التخصيص لنظام ويندوز والبرامج\",\n    \"credit\": \"بواسطة <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"يتوفر تحديث\",\n      \"subtitle\": \"فكر في تحديث Windhawk للحصول على أحدث الميزات وإصلاحات الأخطاء\",\n      \"updateButton\": \"مزيد من التفاصيل\"\n    },\n    \"links\": {\n      \"title\": \"روابط\",\n      \"homepage\": \"الصفحة الرئيسية\",\n      \"documentation\": \"التوثيق\"\n    },\n    \"builtWith\": {\n      \"title\": \"بُني باستخدام\",\n      \"vscodium\": \"توزيعة مجتمع من محرر VSCode من مايكروسوفت\",\n      \"llvmMingw\": \"مجموعة أدوات mingw-w64 مبنية على LLVM/Clang/LLD\",\n      \"minHook\": \"مكتبة API Hooking بسيطة لنظام ويندوز\",\n      \"others\": \"أدوات ومكتبات أخرى، وقليل من الشيفرة\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"تثبيت {{mod}}\",\n    \"warningTitle\": \"تابع بحذر\",\n    \"warningDescription\": \"يمكن أن تتسبب المودات الضارة في إتلاف جهاز الكمبيوتر أو انتهاك خصوصيتك. قم بتثبيت المودات فقط من المؤلفين الذين تثق بهم.\",\n    \"modAuthor\": \"مؤلف المود\",\n    \"homepage\": \"الصفحة الرئيسية\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (تويتر)\",\n    \"verified\": \"تم التحقق\",\n    \"verifiedTooltip\": \"لقد تحققنا من أن هذا الملف الشخصي يخص مؤلف المود، ولكن لاحظ أن <0>تم التحقق</0> لا تعني <0>موثوق</0>. تأكد من أنك تثق بمؤلف المود، أو تحقق بعناية من الشيفرة المصدرية قبل التثبيت.\",\n    \"acceptButton\": \"قبول المخاطرة والتثبيت\",\n    \"cancelButton\": \"إلغاء\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"إنشاء مود جديد\"\n  },\n  \"devModeAction\": {\n    \"message\": \"يتطلب إنشاء وتعديل المودات بعض المعرفة بتطوير C/C++ لنظام ويندوز. إذا لم تكن متأكدًا مما يعنيه ذلك، ربما لا تكون هذه الخيارات مناسبة لك.\",\n    \"hideOptionsCheckbox\": \"إخفاء جميع الخيارات المتعلقة بالتطوير\",\n    \"hideOptionsButton\": \"إخفاء الخيارات\",\n    \"beginCodingButton\": \"ابدأ البرمجة\",\n    \"cancelButton\": \"إلغاء\"\n  },\n  \"safeMode\": {\n    \"alert\": \"يعمل Windhawk في الوضع الآمن، تم إيقاف جميع وظائف حقن الشيفرة.\",\n    \"offButton\": \"إيقاف الوضع الآمن\",\n    \"offConfirm\": \"سيتم إعادة تشغيل Windhawk لتطبيق الإعدادات.\",\n    \"offConfirmOk\": \"إعادة تشغيل Windhawk\",\n    \"offConfirmCancel\": \"إلغاء\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"الإجراء غير متاح في وضع المعاينة\",\n    \"notCompiled\": \"يجب تجميع المود قبل معاينته\"\n  },\n  \"sidebar\": {\n    \"modId\": \"معرف المود\",\n    \"enableMod\": \"تمكين المود\",\n    \"enableLogging\": \"تمكين السجلات\",\n    \"notCompiled\": \"يجب تجميع المود\",\n    \"compile\": \"تجميع المود\",\n    \"compilationFailed\": \"فشل التجميع\",\n    \"preview\": \"معاينة المود\",\n    \"showLogOutput\": \"عرض سجل الإخراج\",\n    \"exit\": \"الخروج من وضع التحرير\",\n    \"exitConfirmation\": \"سيتم فقدان التغييرات منذ آخر تجميع ناجح\",\n    \"exitButtonOk\": \"خروج\",\n    \"exitButtonCancel\": \"البقاء\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/cs/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/cs/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Načítání...\",\n    \"loadingFailed\": \"Stahování se nezdařilo, zkontrolujte prosím své připojení k internetu\",\n    \"loadingFailedTitle\": \"Načítání se nezdařilo\",\n    \"loadingFailedSubtitle\": \"Zkontrolujte prosím své připojení k internetu a zkuste to znovu\",\n    \"tryAgain\": \"Zkuste to znovu\",\n    \"updating\": \"Aktualizuji...\",\n    \"installing\": \"Instaluji...\",\n    \"compiling\": \"Kompiluji...\",\n    \"cut\": \"Vystřihnout\",\n    \"copy\": \"Kopírovat\",\n    \"paste\": \"vložit\",\n    \"selectAll\": \"Vybrat vše\"\n  },\n  \"appHeader\": {\n    \"home\": \"Hlavní\",\n    \"explore\": \"Hledat\",\n    \"settings\": \"Parametry\",\n    \"about\": \"O programu\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"K dispozici aktualizace\",\n    \"installed\": \"Instalováno\",\n    \"details\": \"Popis\",\n    \"update\": \"Aktualizovat\",\n    \"install\": \"Instalovat\",\n    \"compile\": \"kompilovat\",\n    \"disable\": \"Zakázat\",\n    \"enable\": \"Povolit\",\n    \"edit\": \"Upravit\",\n    \"fork\": \"Vytvořit kopii\",\n    \"remove\": \"smazat\",\n    \"removeConfirm\": \"Opravdu chcete odstranit tuto úpravu?\",\n    \"removeConfirmOk\": \"Odstranit úpravu\",\n    \"removeConfirmCancel\": \"Zrušit\",\n    \"notCompiled\": \"Modifikace musí být zkompilována\",\n    \"editedLocally\": \"Úprava upravena místně\",\n    \"noDescription\": \"(žádný popis)\",\n    \"users_one\": \"{{formattedCount}} uživatel\",\n    \"users_few\": \"{{formattedCount}} uživatelé\",\n    \"users_many\": \"{{formattedCount}} uživatelů\",\n    \"users_other\": \"{{formattedCount}} uživatelů\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Instalovaná verze\",\n      \"latestVersion\": \"Nejnovější verze\",\n      \"loading\": \"načítání...\",\n      \"loadingFailed\": \"načítání se nezdařilo\",\n      \"modId\": \"ID modifikace\",\n      \"modVersion\": \"Verze modifikace\",\n      \"modAuthor\": {\n        \"title\": \"Autor úpravy\",\n        \"homepage\": \"Domovská stránka\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Všechny procesy\",\n        \"allBut\": \"Vše kromě {{list}}\",\n        \"except\": \"{{included}} kromě {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Cílové procesy\",\n          \"excluded\": \"Vyloučeno\"\n        }\n      },\n      \"updateNotNeeded\": \"Je nainstalována nejnovější verze\"\n    },\n    \"details\": {\n      \"title\": \"Popis\",\n      \"noData\": \"Chybí popis úpravy.\"\n    },\n    \"settings\": {\n      \"title\": \"Nastavení\",\n      \"noData\": \"Není k dispozici žádná nastavení úprav.\",\n      \"saveButton\": \"Uložit nastavení\",\n      \"sampleValue\": \"Standardní hodnota\",\n      \"arrayItemAdd\": \"Přidat novou položku\",\n      \"arrayItemRemove\": \"Odstranit položku\"\n    },\n    \"code\": {\n      \"title\": \"Zdrojový kód\",\n      \"noData\": \"Chybí zdrojový kód.\",\n      \"collapseExtra\": \"Skrýt nastavení a soubor Readme\"\n    },\n    \"changelog\": {\n      \"title\": \"Seznam změn\",\n      \"loadingFailed\": \"Nelze načíst protokol změn. Kliknutím <0>sem</0> jej zobrazíte na GitHubu.\"\n    },\n    \"advanced\": {\n      \"title\": \"Další\",\n      \"debugLogging\": {\n        \"title\": \"Ladění protokolování\",\n        \"description\": \"Lze použít k řešení problémů s úpravou.\",\n        \"none\": \"Ne\",\n        \"modLogs\": \"Protokoly úprav\",\n        \"detailedLogs\": \"Podrobné protokoly ladění\",\n        \"showLogButton\": \"Zobrazit protokoly\"\n      },\n      \"modSettings\": {\n        \"title\": \"Nastavení úprav\",\n        \"description\": \"Snadno exportujte nebo sdílejte nastavení modu.\",\n        \"loadButton\": \"Načíst\",\n        \"loadFormattedButton\": \"Načíst formátované\",\n        \"saveButton\": \"Uložit\",\n        \"invalidData\": \"Neplatná data JSON\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Vlastní seznam cílových procesů\",\n        \"descriptionInclusion\": \"Vlastní seznam dalších exe souborů nebo cest k nim, které budou ovlivněny úpravou. Tento seznam bude přidán do seznamu ovlivněných procesů, které definoval autor modifikace. To znamená, že úprava se načte pro každý proces pouze v případě, že cesta odpovídá jednomu z cílového seznamu a neodpovídá žádnému z vyloučených.\",\n        \"titleExclusion\": \"Vlastní seznam vyloučení\",\n        \"descriptionExclusion\": \"Vlastní seznam dalších exe souborů nebo cest k nim, které modifikace NEovlivní. Tento seznam bude přidán do seznamu vyloučení od autora modifikace. To znamená, že modifikace se načte pro každý proces pouze v případě, že cesta odpovídá jednomu z cílového seznamu a neodpovídá žádnému ze seznamu vyloučených.\",\n        \"processListPlaceholder\": \"Název/cesty procesu (exe), jedna na řádek, např.:\",\n        \"invalidCharactersWarning\": \"Seznam procesů obsahuje neplatné znaky, které budou odstraněny: {{invalidCharacters}}\",\n        \"saveButton\": \"Uložit\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorovat cílové/vyloučit seznamy úprav\",\n        \"description\": \"Ignorujte seznamy cílů/vylučujících seznamy nastavené v modu a používejte pouze vlastní seznamy výše.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Zvažte vzory seznamu zahrnutí pro kritické systémové procesy\",\n        \"description\": \"Ve výchozím nastavení Windhawk načítá mody pouze v kritických systémových procesech, pokud je proces zahrnut bez vzorů, např. <0>critical.exe</0>, nikoli <0>*</0> nebo <0>*.exe</0>. Další podrobnosti o kritických systémových procesech naleznete v <1>dokumentace</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Změny v nejnovější verzi\",\n      \"noData\": \"Je nainstalována nejnovější verze.\",\n      \"splitView\": \"Oddělené prohlížení\",\n      \"expandLines_one\": \"Rozbalit jeden skrytý řádek\",\n      \"expandLines_few\": \"Rozbalit {{count}} skryté řádky\",\n      \"expandLines_many\": \"Rozbalit {{count}} skrytých řádků\",\n      \"expandLines_other\": \"Rozbalit {{count}} skrytých řádků\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Hledat úpravy...\"\n  },\n  \"home\": {\n    \"browse\": \"Vyhledat úpravy\",\n    \"installedMods\": {\n      \"title\": \"Instalované úpravy\",\n      \"noMods\": \"Není nainstalovány žádné mody\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Doporučené úpravy\",\n      \"noMods\": \"Neexistují žádné doporučené úpravy, které ještě nejsou nainstalovány\",\n      \"explore\": \"Vyhledat další úpravy\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populární a nejlépe hodnocené\",\n      \"popular\": \"Populární\",\n      \"topRated\": \"Nejlépe hodnocené\",\n      \"newest\": \"Nové\",\n      \"lastUpdated\": \"Nedávno aktualizováno\",\n      \"alphabeticalOrder\": \"Abecední pořadí\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Jazyk\",\n      \"description\": \"Vyberte požadovaný jazyk rozhraní pro Windhawk.\",\n      \"contribute\": \"<0>Přidat nový překlad</0>.\",\n      \"credits\": \"Český překlad <0>Milan Kliment</0> s několika úpravami od Berry a dalších členů komunity.\",\n      \"creditsLink\": \"mailto:milan-k@volny.cz\"\n    },\n    \"updates\": {\n      \"title\": \"Zkontrolovat aktualizace\",\n      \"description\": \"Pravidelně kontrolujte aktualizace Windhawk a nainstalované modifikace.\"\n    },\n    \"devMode\": {\n      \"title\": \"Režim pro vývojáře\",\n      \"description\": \"Zobrazit akce vývojáře, jako je vytváření a úpravy modů.\"\n    },\n    \"advancedSettings\": \"Pokročilá nastavení\",\n    \"hideTrayIcon\": {\n      \"title\": \"Skrýt ikonu na liště\",\n      \"description\": \"Pro ukončení Windhawk musíte toto nastavení zakázat.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Vyžadovat UAC ke spuštění Windhawk\",\n      \"description\": \"Windhawk vyžaduje administrátorská práva, ale pro jednouživatelské počítače jsou neustálé výzvy UAC otravné, takže je Windhawk obchází. Povolte toto nastavení, chcete-li vrátit výzvy UAC ke spuštění Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Nezobrazovat dialogové okno nabídky automaticky\",\n      \"description\": \"Ve výchozím nastavení Windhawk automaticky zobrazí dialogové okno nabídky, když zjistí, že hlavní panel nefunguje kvůli nestabilitě systému nebo z jiných důvodů. Dialog nabídky umožňuje zavřít Windhawk, vstoupit do nouzového režimu a provést další akce. Dialogové okno nabídky lze zobrazit také stisknutím kombinace kláves Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Zpoždění dialogu inicializace úprav\",\n      \"description\": \"Počet milisekund, které se čeká před zobrazením dialogu průběhu inicializace modifikace.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Další pokročilé možnosti\",\n      \"restartNotice\": \"Windhawk bude restartován, aby bylo možné použít nastavení.\",\n      \"saveButton\": \"Uložit a restartovat Windhawk\",\n      \"cancelButton\": \"Zrušit\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk Verbose Logging\",\n      \"engineLoggingTitle\": \"Podrobné protokolování motoru Windhawk\",\n      \"description\": \"Protokoly lze prohlížet například pomocí nástroje DebugView.\",\n      \"none\": \"Ne\",\n      \"error\": \"Chyba\",\n      \"verbose\": \"Podrobně\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Seznam vyloučených procesů\",\n      \"descriptionExclusion\": \"Seznam procesů/cest, do kterých Windhawk nevloží kód. To může být užitečné v případech, kdy Windhawk není kompatibilní s konkrétním programem. Upozorňujeme, že přidání procesu do tohoto seznamu nejen zabrání Windhawku v jeho úpravě, ale také zabrání Windhawku v zachycení podřízených procesů vytvořených vyloučeným procesem. To způsobí zpoždění při načítání úprav do Windhaw.\",\n      \"descriptionExclusionWiki\": \"Další podrobnosti o vyloučení procesů a o integrovaných seznamech vyloučení procesů naleznete v <0>dokumentace</0>.\",\n      \"excludeCriticalProcesses\": \"Vyloučit kritické systémové procesy\",\n      \"excludeIncompatiblePrograms\": \"Vyloučit známé nekompatibilní programy\",\n      \"excludeGames\": \"Vyloučit známé hry\",\n      \"titleInclusion\": \"Seznam cílových procesů\",\n      \"descriptionInclusion\": \"Seznam cílových procesů/cest, do kterých Windhawk vloží kód, i když jsou na seznamu vyloučených.\",\n      \"inclusionWithoutExclusionNotice\": \"Seznam cílových procesů nedělá nic, pokud je seznam vyloučených procesů prázdný.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Pokud chcete vyloučit všechny procesy kromě těchto, můžete zadat \\\"*\\\" v seznamu vyloučených procesů.\",\n      \"processListPlaceholder\": \"Název/cesty procesu (exe), jedna na řádek, např.:\",\n      \"invalidCharactersWarning\": \"Seznam procesů obsahuje neplatné znaky, které budou odstraněny: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk ver. {{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Tržiště pro přizpůsobení programů Windows\",\n    \"credit\": \"Autor: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"K dispozici aktualizace\",\n      \"subtitle\": \"Aktualizujte Windhawk pro nejnovější funkce a opravy chyb\",\n      \"updateButton\": \"Další podrobnosti\"\n    },\n    \"links\": {\n      \"title\": \"Odkazy\",\n      \"homepage\": \"Domovská stránka\",\n      \"documentation\": \"Dokumentace\"\n    },\n    \"builtWith\": {\n      \"title\": \"Zkompilováno s\",\n      \"vscodium\": \"Komunitní verze editoru VSCode od společnosti Microsoft\",\n      \"llvmMingw\": \"LLVM/Clang/LLD založené na prostředí mingw-w64\",\n      \"minHook\": \"Minimalistická knihovna pro připojení API pro Windows\",\n      \"others\": \"Další nástroje a knihovny a nějaký psaný kód\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Instalovat {{mod}}\",\n    \"warningTitle\": \"Postupujte opatrně\",\n    \"warningDescription\": \"Škodlivé úpravy mohou poškodit váš počítač a narušit vaše soukromí. Instalujte úpravy pouze od autorů, kterým důvěřujete.\",\n    \"modAuthor\": \"Autor úpravy\",\n    \"homepage\": \"Domovská stránka\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"ověřeno\",\n    \"verifiedTooltip\": \"Potvrzujeme, že tento profil patří autorovi modu, ale mějte na paměti, že <0>ověřený</0> neznamená <0>důvěryhodný</0>. Ujistěte se, že důvěřujete autorovi modu, nebo před instalací pečlivě zkontrolujte zdrojový kód.\",\n    \"acceptButton\": \"Přijměte riziko a pokračujte\",\n    \"cancelButton\": \"Zrušit\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Vytvořit novou úpravu\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Vytváření a úpravy modů vyžaduje určitou znalost C/C++ ve Windows. Pokud nevíte, o čem mluvím, tyto možnosti nemusí být pro vás.\",\n    \"hideOptionsCheckbox\": \"Skrýt všechny možnosti vývojáře\",\n    \"hideOptionsButton\": \"Skrýt možnosti\",\n    \"beginCodingButton\": \"Začít kódovat\",\n    \"cancelButton\": \"Zrušit\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk běží v nouzovém režimu, přizpůsobení programu je zakázáno.\",\n    \"offButton\": \"Vypnout nouzový režim\",\n    \"offConfirm\": \"Windhawk bude restartován pro použití nastavení.\",\n    \"offConfirmOk\": \"Restartovat Windhawk\",\n    \"offConfirmCancel\": \"Zrušit\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Akce není dostupná v režimu zobrazení\",\n    \"notCompiled\": \"Abyste si ji mohli prohlédnout, musíte úpravu zkompilovat\"\n  },\n  \"sidebar\": {\n    \"modId\": \"ID modifikace\",\n    \"enableMod\": \"Povolit úpravy\",\n    \"enableLogging\": \"Povolit protokolování\",\n    \"notCompiled\": \"je třeba zkompilovat úpravu\",\n    \"compile\": \"Zkompilovat modifikaci\",\n    \"compilationFailed\": \"Kompilace se nezdařila\",\n    \"preview\": \"Zobrazit modifikaci\",\n    \"showLogOutput\": \"Zobrazit protokoly\",\n    \"exit\": \"Ukončit režim úprav\",\n    \"exitConfirmation\": \"Změny od poslední úspěšné kompilace budou ztraceny\",\n    \"exitButtonOk\": \"Konec\",\n    \"exitButtonCancel\": \"Zůstat\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/da/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/da/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Indlæser...\",\n    \"loadingFailed\": \"Indlæsning fejlede, tjek din internetforbindelse\",\n    \"loadingFailedTitle\": \"Indlæsning fejlede\",\n    \"loadingFailedSubtitle\": \"Tjek venligst din internetforbindelse og prøv igen\",\n    \"tryAgain\": \"Prøv igen\",\n    \"updating\": \"Opdaterer...\",\n    \"installing\": \"Installerer...\",\n    \"compiling\": \"Kompilerer...\",\n    \"cut\": \"Klip\",\n    \"copy\": \"Kopier\",\n    \"paste\": \"Indsæt\",\n    \"selectAll\": \"Vælg alt\"\n  },\n  \"appHeader\": {\n    \"home\": \"Hjem\",\n    \"explore\": \"Udforsk\",\n    \"settings\": \"Indstillinger\",\n    \"about\": \"Om\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Opdatering tilgængelig\",\n    \"installed\": \"Installeret\",\n    \"details\": \"Detaljer\",\n    \"update\": \"Opdater\",\n    \"install\": \"Installer\",\n    \"compile\": \"Kompiler\",\n    \"disable\": \"Slå fra\",\n    \"enable\": \"Slå til\",\n    \"edit\": \"Rediger\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Fjern\",\n    \"removeConfirm\": \"Er du sikker på at du vil fjerne denne modifikation?\",\n    \"removeConfirmOk\": \"Fjern modifikation\",\n    \"removeConfirmCancel\": \"Annuller\",\n    \"notCompiled\": \"Modifikation skal kompileres\",\n    \"editedLocally\": \"Modifikation var redigeret lokalt\",\n    \"noDescription\": \"(ingen beskrivelse)\",\n    \"users_one\": \"{{formattedCount}} bruger\",\n    \"users_other\": \"{{formattedCount}} brugers\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Installeret version\",\n      \"latestVersion\": \"Seneste version\",\n      \"loading\": \"indlæser...\",\n      \"loadingFailed\": \"indlæsning fejlede\",\n      \"modId\": \"Modfikations-identifikator\",\n      \"modVersion\": \"Modifikations-version\",\n      \"modAuthor\": {\n        \"title\": \"Modifikations-forfatter\",\n        \"homepage\": \"Forside\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Alle processer\",\n        \"allBut\": \"Alle undtagen {{list}}\",\n        \"except\": \"{{included}} undtagen {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Målprocesser\",\n          \"excluded\": \"Ekskluderede\"\n        }\n      },\n      \"updateNotNeeded\": \"Den installerede version er identisk med den seneste version\"\n    },\n    \"details\": {\n      \"title\": \"Detaljer\",\n      \"noData\": \"Modifikationsdetaljer mangler.\"\n    },\n    \"settings\": {\n      \"title\": \"Indstillinger\",\n      \"noData\": \"Ingen modifikationsindstillinger er tilgængelige.\",\n      \"saveButton\": \"Gem indstillinger\",\n      \"sampleValue\": \"Eksempelværdi\",\n      \"arrayItemAdd\": \"Tilføj ny genstand\",\n      \"arrayItemRemove\": \"Fjern genstand\"\n    },\n    \"code\": {\n      \"title\": \"Kildekode\",\n      \"noData\": \"Modifikationskilde mangler.\",\n      \"collapseExtra\": \"Kollaps Readme og Indstillinger\"\n    },\n    \"changelog\": {\n      \"title\": \"Ændringslog\",\n      \"loadingFailed\": \"Indlæsning af ændringslog fejlede. <0>Klik her</0> for at vise den på GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avanceret\",\n      \"debugLogging\": {\n        \"title\": \"Fejlfindingslogning\",\n        \"description\": \"Kan være brugbart til at fejlfinde problemer med modifikationen.\",\n        \"none\": \"Ingen\",\n        \"modLogs\": \"Modifikationslog\",\n        \"detailedLogs\": \"Detaljerede fejlfindingslogs\",\n        \"showLogButton\": \"Vis logoutput\"\n      },\n      \"modSettings\": {\n        \"title\": \"Modifikationsindstillinger\",\n        \"description\": \"Eksporter eller del nemt dine modifikationsindstillinger.\",\n        \"loadButton\": \"Indlæs\",\n        \"loadFormattedButton\": \"Indlæs formatteret\",\n        \"saveButton\": \"Gem\",\n        \"invalidData\": \"Ikke validt JSON data\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Tilpasset procesinklusionsliste\",\n        \"descriptionInclusion\": \"En brugerdefineret liste over yderligere eksekverbare filnavne/stier, som modifikationen vil målrettes mod. Listen føjes til inklusionslisten, som modifikationsforfatteren definerede for at bestemme, hvilke processer der skal målrettes mod. For hver proces indlæses modifikationen, hvis den eksekverbare filsti matcher en af ​​inkluderingsposterne og ikke matcher nogen ekskluderingsindgang.\",\n        \"titleExclusion\": \"Tilpasset procesekslusionsliste\",\n        \"descriptionExclusion\": \"En tilpasset liste over yderligere eksekverbare filnavne/stier, som modifikationen vil udelukke fra målretning. Listen føjes til ekskluderingslisten, som modifikations-forfatteren definerede for at bestemme, hvilke processer der skal målrettes mod. For hver proces indlæses modifikationen, hvis den eksekverbare filsti matcher en af ​​inkluderingsposterne og ikke matcher nogen ekskluderingsindgang.\",\n        \"processListPlaceholder\": \"Proces-navne/stige, en per linje, for eksempel:\",\n        \"saveButton\": \"Gem\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorer modifikations-inkluderings-/ekskluderingslister\",\n        \"description\": \"Ignorer modifikationens procesinkluderings-/ekskluderingslister og brug kun de tilpassede lister herover.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Seneste versionsændringer\",\n      \"noData\": \"Den installerede version er identisk med den seneste version.\",\n      \"splitView\": \"Delt visning\",\n      \"expandLines_one\": \"Udvid en gemt linje\",\n      \"expandLines_other\": \"Udvid {{count}} gemte linjer\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Søg efter modifikationer...\"\n  },\n  \"home\": {\n    \"browse\": \"Gennemse modifikationer\",\n    \"installedMods\": {\n      \"title\": \"Installerede modifikationer\",\n      \"noMods\": \"Ingen modifikationer er installerede\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Fremhævede modifikationer\",\n      \"noMods\": \"Der er ingen fremhævede modifikationer der ikke er installerede\",\n      \"explore\": \"Udforsk andre modifikationer\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populær og topbedømte\",\n      \"popular\": \"Populær\",\n      \"topRated\": \"Topbedømte\",\n      \"newest\": \"Nyeste\",\n      \"lastUpdated\": \"Seneste opdaterede\",\n      \"alphabeticalOrder\": \"Alfabetisk rækkefølge\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Sprog\",\n      \"description\": \"Vælg dit foretrukne visningssprog for Windhawk.\",\n      \"contribute\": \"<0>Bidrag en ny oversættelse</0>.\",\n      \"credits\": \"Dansk oversættelse af <0>AlbertCoolGuy</0>.\",\n      \"creditsLink\": \"https://github.com/AlbertCoolGuy\"\n    },\n    \"updates\": {\n      \"title\": \"Tjek efter opdateringer\",\n      \"description\": \"Tjek jævnligt efter nye versioner af Windhawk og af de installerede modifikationer.\"\n    },\n    \"devMode\": {\n      \"title\": \"Udviklertilstand\",\n      \"description\": \"Vis handlinger for udviklere, såsom at skabe og ændre modifikationer.\"\n    },\n    \"advancedSettings\": \"Avancerede indstillinger\",\n    \"hideTrayIcon\": {\n      \"title\": \"Skjul systembakkeikon\",\n      \"description\": \"Du bliver nødt til at deaktivere denne indstilling for at afslutte Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Kræv UAC-elevation for at køre Windhawk\",\n      \"description\": \"Windhawk kræver administratorrettigheder, men for en enkeltbrugercomputer kan det være irriterende at få UAC-prompten hver gang, så Windhawk omgår den. Aktiver denne mulighed for at kræve UAC elevation for at køre Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Vis ikke automatisk værktøjskasse-dialogen\",\n      \"description\": \"Som standard viser Windhawk automatisk værktøjskasse-dialogen, når den registrerer, at proceslinjen ikke er tilgængelig, enten på grund af systemets ustabilitet eller af en anden årsag. Værktøjskassedialogen gør det muligt at afslutte Windhawk, skifte til sikker tilstand og foretage andre handlinger. Værktøjskassedialogen kan også vises med Ctrl+Win+W tastaturgenvejen.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Modifikation-initialiseringsdialogforsinkelse\",\n      \"description\": \"Antal millisekunder der ventes før fremskridtsdialogen for modifikationsinitaliseringen vises.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Flere avancerede indstillinger\",\n      \"restartNotice\": \"Windhawk bliver genstartet for at anvende indstillingerne.\",\n      \"saveButton\": \"Gem og genstart Windhawk\",\n      \"cancelButton\": \"Annuller\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk logverbositet\",\n      \"engineLoggingTitle\": \"Windhawk-motor logverbositet\",\n      \"description\": \"Logs kan blive vist med et værktøj såsom DebugView.\",\n      \"none\": \"Intet\",\n      \"error\": \"Fejl\",\n      \"verbose\": \"Verbos\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Procesinklusionsliste\",\n      \"descriptionExclusion\": \"En liste over procesnavne/stier, som Windhawk ikke vil injicere i. Kan være nyttigt i tilfælde, hvor Windhawk ikke er kompatibel med et specifikt program. Bemærk, at tilføjelse af en proces til denne liste ikke kun forhindrer Windhawk i at tilpasse den, men også forhindrer Windhawk i at opfange underprocesser, som denne proces opretter. Dette vil forårsage en lille forsinkelse, når Windhawk indlæser mods i sådanne tilfælde.\",\n      \"titleInclusion\": \"Proceseksklusionsliste\",\n      \"descriptionInclusion\": \"En liste over procesnavne/stier, som Windhawk vil injicere i, selvom de er på ekskluderingslisten.\",\n      \"inclusionWithoutExclusionNotice\": \"Procesinkluderingslisten har ingen effekt med en tom procesekskluderingsliste.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Hvis du havde til hensigt at ekskludere alle processer undtagen disse, kan du indstille \\\"*\\\" i procesekskluderingslisten.\",\n      \"processListPlaceholder\": \"Procesnavne/stier, én pr. linje, for eksempel:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Tilpasningsmarkedspladsen for Windows og programmer\",\n    \"credit\": \"Af <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"En opdatering er tilgængelig\",\n      \"subtitle\": \"Overvej at opdatere Windhawk for at få de nyeste funktioner og fejlrettelser\",\n      \"updateButton\": \"Flere detaljer\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Forside\",\n      \"documentation\": \"Dokumentation\"\n    },\n    \"builtWith\": {\n      \"title\": \"Bygget med\",\n      \"vscodium\": \"En fællesskabsdrevet distribution af Microsofts VSCode-editor\",\n      \"llvmMingw\": \"En LLVM/Clang/LLD baseret mingw-w64 værktøjskæde\",\n      \"minHook\": \"Det minimalistiske API-hooking-bibliotek til Windows\",\n      \"others\": \"Andre værktøjer og biblioteker og en smule kode\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Installer {{mod}}\",\n    \"warningTitle\": \"Fortsæt med omhu\",\n    \"warningDescription\": \"Ondsindede mods kan beskadige din computer eller krænke dit privatliv. Installer kun mods fra forfattere, som du har tillid til.\",\n    \"modAuthor\": \"Modifikationsforfatter\",\n    \"homepage\": \"Forside\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verificeret\",\n    \"verifiedTooltip\": \"Vi har bekræftet, at denne profil tilhører modifikationsforfatteren, men bemærk, at <0>verificeret</0> ikke er det samme som <0>trusted</0>. Sørg for, at du stoler på modifikationsforfatteren, eller inspicer omhyggeligt kildekoden før installation.\",\n    \"acceptButton\": \"Accepter risiko og installer\",\n    \"cancelButton\": \"Annuller\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Skab en ny modifikation\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Oprettelse og ændring af mods kræver en vis viden om C/C++ udvikling til Windows. Hvis du ikke er sikker på, hvad det betyder, er disse muligheder måske ikke noget for dig.\",\n    \"hideOptionsCheckbox\": \"Gem all udvikler-relaterede indstillinger\",\n    \"hideOptionsButton\": \"Gem indstillinger\",\n    \"beginCodingButton\": \"Begynd på at kode\",\n    \"cancelButton\": \"Annuller\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk kører i sikker tilstand, al kodeindsprøjtningsfunktionalitet er slået fra.\",\n    \"offButton\": \"Slå sikker tilstand fra\",\n    \"offConfirm\": \"Windhawk vil blive genstartet for at anvende indstillingerne.\",\n    \"offConfirmOk\": \"Genstart Windhawk\",\n    \"offConfirmCancel\": \"Annuller\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Handling er ikke tilgængelig i forhåndsvisningstilstand\",\n    \"notCompiled\": \"Modfikation skal kompileres før den kan forhåndsvises\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Modifikationsidenfikator\",\n    \"enableMod\": \"Slå modifikation til\",\n    \"enableLogging\": \"Slå logging til\",\n    \"notCompiled\": \"Modifikation skal kompileres\",\n    \"compile\": \"Kompiler modifikation\",\n    \"compilationFailed\": \"Kompiliation fejlede\",\n    \"preview\": \"Forhåndsvis modifikation\",\n    \"showLogOutput\": \"Vis logoutput\",\n    \"exit\": \"Afslut redigeringstilstand\",\n    \"exitConfirmation\": \"Ændringer siden den sidste sucessfulde kompilation vil blive tabt\",\n    \"exitButtonOk\": \"Afslut\",\n    \"exitButtonCancel\": \"Bliv\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Lade...\",\n    \"loadingFailed\": \"Laden nicht erfolgreich. Bitte überprüfen Sie Ihre Internetverbindung.\",\n    \"loadingFailedTitle\": \"Laden fehlgeschlagen.\",\n    \"loadingFailedSubtitle\": \"Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.\",\n    \"tryAgain\": \"Erneut versuchen\",\n    \"updating\": \"Aktualisiere\",\n    \"installing\": \"Installiere\",\n    \"compiling\": \"Kompiliere\",\n    \"cut\": \"Ausschneiden\",\n    \"copy\": \"Kopieren\",\n    \"paste\": \"Einfügen\",\n    \"selectAll\": \"Alles auswählen\"\n  },\n  \"appHeader\": {\n    \"home\": \"Startseite\",\n    \"explore\": \"Durchsuchen\",\n    \"settings\": \"Einstellungen\",\n    \"about\": \"Über\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Aktualisierung verfügbar\",\n    \"installed\": \"Installiert\",\n    \"details\": \"Details\",\n    \"update\": \"Aktualisierung\",\n    \"install\": \"Installiere\",\n    \"compile\": \"Kompiliere\",\n    \"disable\": \"Deaktivieren\",\n    \"enable\": \"Aktivieren\",\n    \"edit\": \"Bearbeiten\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Entfernen\",\n    \"removeConfirm\": \"Sind Sie sicher, dass Sie diese Mod entfernen wollen?\",\n    \"removeConfirmOk\": \"Entferne Mod\",\n    \"removeConfirmCancel\": \"Abbrechen\",\n    \"notCompiled\": \"Mod muss kompiliert werden.\",\n    \"editedLocally\": \"Mod wurde lokal bearbeitet.\",\n    \"noDescription\": \"Leider keine Beschreibung vorhanden.\",\n    \"users_one\": \"{{formattedCount}} Benutzer\",\n    \"users_other\": \"{{formattedCount}} Benutzer\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Installierte Version\",\n      \"latestVersion\": \"Neueste Version\",\n      \"loading\": \"Lade...\",\n      \"loadingFailed\": \"Laden fehlgeschlagen.\",\n      \"modId\": \"Mod-Id\",\n      \"modVersion\": \"Mod-Version\",\n      \"modAuthor\": {\n        \"title\": \"Mod-Autor\",\n        \"homepage\": \"Homepage\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Alle Prozesse\",\n        \"allBut\": \"Alle außer {{list}}\",\n        \"except\": \"{{included}} außer {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Zielprozesse\",\n          \"excluded\": \"Ausgeschlossen\"\n        }\n      },\n      \"updateNotNeeded\": \"Die installierte Version ist identisch mit der neusten Version.\"\n    },\n    \"details\": {\n      \"title\": \"Details\",\n      \"noData\": \"Mod-Details fehlen.\"\n    },\n    \"settings\": {\n      \"title\": \"Einstellungen\",\n      \"noData\": \"Mod-Einstellungen nicht verfügbar.\",\n      \"saveButton\": \"Einstellungen speichern\",\n      \"sampleValue\": \"Beispielwert\",\n      \"arrayItemAdd\": \"Neues Element hinzufügen\",\n      \"arrayItemRemove\": \"Element entfernen\"\n    },\n    \"code\": {\n      \"title\": \"Quellcode\",\n      \"noData\": \"Mod-Quellcode fehlt.\",\n      \"collapseExtra\": \"Readme und Einstellungen einklappen\"\n    },\n    \"changelog\": {\n      \"title\": \"Änderungsprotokoll (Changelog)\",\n      \"loadingFailed\": \"Laden des Änderungsprotokolls fehlgeschlagen. <0>Hier klicken</0> um das Änderungsprotokoll auf GitHub zu lesen.\"\n    },\n    \"advanced\": {\n      \"title\": \"Erweitert\",\n      \"debugLogging\": {\n        \"title\": \"Debug Protokollierung\",\n        \"description\": \"Kann nützlich sein, um Probleme mit dem Mod zu beheben.\",\n        \"none\": \"Nichts\",\n        \"modLogs\": \"Mod-Protokolle\",\n        \"detailedLogs\": \"Detailierte Debugprotokolle\",\n        \"showLogButton\": \"Protokoll anzeigen\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod-Einstellungen\",\n        \"description\": \"Exportieren und teilen der benutzerdefinierten Mod-Einstellungen.\",\n        \"loadButton\": \"Lade\",\n        \"loadFormattedButton\": \"Lade formatiert\",\n        \"saveButton\": \"Speichern\",\n        \"invalidData\": \"Ungültige JSON-Daten!\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Benutzerdefinierte Liste einbezogener Prozesse\",\n        \"descriptionInclusion\": \"Eine benutzerdefinierte Liste zusätzlicher ausführbarer Dateinamen/Pfade, auf die die Mod abzielt. Die Liste wird der Aufnahmeliste hinzugefügt, die der Mod-Autor definiert hat, um zu bestimmen, auf welche Prozesse abgezielt werden soll. Für jeden Prozess wird die Mod geladen, wenn der Pfad der ausführbaren Datei mit einem der Include-Einträge übereinstimmt und mit keinem Exclude-Eintrag übereinstimmt.\",\n        \"titleExclusion\": \"Benutzerdefinierte Liste ausgeschlossener Prozesse\",\n        \"descriptionExclusion\": \"Eine benutzerdefinierte Liste zusätzlicher ausführbarer Dateinamen/Pfade, die die Mod vom Targeting ausschließt. Die Liste wird der Ausschlussliste hinzugefügt, die der Mod-Autor definiert hat, um zu bestimmen, auf welche Prozesse abgezielt werden soll. Für jeden Prozess wird die Mod geladen, wenn der Pfad der ausführbaren Datei mit einem der Include-Einträge übereinstimmt und mit keinem Exclude-Eintrag übereinstimmt.\",\n        \"processListPlaceholder\": \"Prozessnamen/-pfade, einer pro Zeile, z. B.:\",\n        \"invalidCharactersWarning\": \"Die Prozessliste enthält ungültige Zeichen, die entfernt werden: {{invalidCharacters}}\",\n        \"saveButton\": \"Speichern\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Mod-Einschluss-/Ausschlusslisten ignorieren\",\n        \"description\": \"Ignoriere die Einschluss-/Ausschlusslisten der Mod und verwende nur die benutzerdefinierten Listen oben.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Berücksichtige Einschlusslistenmuster für kritische Systemprozesse\",\n        \"description\": \"Standardmäßig lädt Windhawk Mods in kritischen Systemprozessen nur, wenn der Prozess ohne Muster angegeben wird, z.B. <0>critical.exe</0>, nicht <0>*</0> oder <0>*.exe</0>. Weitere Details zu kritischen Systemprozessen sind in <1>der Dokumentation</1> zu finden.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Letzte Versionsänderungen\",\n      \"noData\": \"Die installierte Version ist identisch mit der neusten Version.\",\n      \"splitView\": \"Ansicht aufteilen\",\n      \"expandLines_one\": \"Zeige eine versteckte Zeile\",\n      \"expandLines_other\": \"Zeige {{count}} versteckte Zeilen\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Suche nach Mods...\"\n  },\n  \"home\": {\n    \"browse\": \"Nach Mods suchen\",\n    \"installedMods\": {\n      \"title\": \"Installierte Mods\",\n      \"noMods\": \"Keine Mods installiert.\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Vorgestellte Mods\",\n      \"noMods\": \"Es gibt keine vorgestellten Mods, die noch nicht installiert wurden.\",\n      \"explore\": \"Nach anderen Mods suchen\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Beliebt und am besten bewertet\",\n      \"popular\": \"Beliebt\",\n      \"topRated\": \"Beste Bewertung\",\n      \"newest\": \"Neueste\",\n      \"lastUpdated\": \"Zuletzt aktualisiert\",\n      \"alphabeticalOrder\": \"Alphabetisch sortiert\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Sprache\",\n      \"description\": \"Sprache für Windhawk auswählen\",\n      \"contribute\": \"<0>Eine neue Übersetzung erstellen</0>.\",\n      \"credits\": \"Deutsche Übersetzung: <0>TomfromBerlin</0>.\",\n      \"creditsLink\": \"mailto:tom-at-github@quantentunnel.de\"\n    },\n    \"updates\": {\n      \"title\": \"Nach Aktualisierungen suchen\",\n      \"description\": \"Regelmäßig nach neuen Versionen von Windhawk und den installierten Mods suchen\"\n    },\n    \"devMode\": {\n      \"title\": \"Entwickler-Modus\",\n      \"description\": \"Aktionen für Entwickler anzeigen, z. B. das Erstellen und Ändern von Mods\"\n    },\n    \"advancedSettings\": \"Erweiterte Einstellungen\",\n    \"hideTrayIcon\": {\n      \"title\": \"Taskleistensymbol ausblenden\",\n      \"description\": \"Diese Option muss deaktiviert sein, um Windhawk zu beenden.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Die Erhöhung der Benutzerrechte (user account control elevation) wird zum Ausführen von Windhawk benötigt\",\n      \"description\": \"Windhawk erfordert Administratorrechte, aber auf einem Einzelbenutzer-Computer kann es lästig sein, jedes Mal die Rechteerhöhung zu bestätigen, sodass Windhawk die Bestätung umgeht. Aktivieren Sie diese Option, um eine Bestätigung der Rechteerhöhung (UAC elevation) durch den Benutzer für die Ausführung von Windhawk anzufordern.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Toolkit-Dialog nicht automatisch anzeigen\",\n      \"description\": \"Standardmäßig zeigt Windhawk den Toolkit-Dialog automatisch an, wenn es erkennt, dass die Taskleiste nicht zugänglich ist, sei es aufgrund von Systeminstabilität oder einem anderen Grund. Der Toolkit-Dialog ermöglicht es, Windhawk zu beenden, in den abgesicherten Modus zu wechseln und andere Aktionen auszuführen. Der Toolkit-Dialog kann auch mit der Tastenkombination Strg+Win+W aufgerufen werden.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Verzögerung des Mod-Initialisierungsdialogs\",\n      \"description\": \"Wartezeit in Millisekunden, bevor der Fortschrittsdialog für die Mod-Initialisierung angezeigt wird.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Mehr erweiterte Einstellungen\",\n      \"restartNotice\": \"Windhawk wird neu gestartet, um die Einstellungen zu übernehmen.\",\n      \"saveButton\": \"Speichern und Windhawk neu starten\",\n      \"cancelButton\": \"Abbrechen\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Art der Windhawk-Protokollierung\",\n      \"engineLoggingTitle\": \"Art der Windhawk-Engine-Protokollierung\",\n      \"description\": \"Protokolle können mit einem Tool wie DebugView angezeigt werden.\",\n      \"none\": \"Keine\",\n      \"error\": \"Error\",\n      \"verbose\": \"Ausführlich\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Liste der ausgeschlossenen Prozesse\",\n      \"descriptionExclusion\": \"Eine Liste von Prozessnamen/-pfaden, in die Windhawk nicht einfügt. Kann nützlich sein, wenn Windhawk nicht mit einem bestimmten Programm kompatibel ist. Beachten Sie, dass das Hinzufügen eines Prozesses zu dieser Liste Windhawk nicht nur daran hindert, ihn anzupassen, sondern auch daran hindert, untergeordnete Prozesse abzufangen, die dieser Prozess erstellt. Dies führt dazu, dass Windhawk Mods in solchen Fällen mit einer leichten Verzögerung lädt.\",\n      \"descriptionExclusionWiki\": \"Weitere Details zum Ausschluss von Prozessen und zu den eingebauten Listen der aufgeschlossenen Prozesse sind in <0>der Dokumentation</0> zu finden.\",\n      \"excludeCriticalProcesses\": \"Kritische Systemprozesse ausschließen\",\n      \"excludeIncompatiblePrograms\": \"Bekannte inkompatible Programme ausschließen\",\n      \"excludeGames\": \"Bekannte Spiele ausschließen\",\n      \"titleInclusion\": \"Liste der eingeschlossenen Prozesse\",\n      \"descriptionInclusion\": \"Eine Liste von Prozessnamen/-pfaden, in die Windhawk einfügt, selbst wenn sie in der Ausschlussliste stehen.\",\n      \"inclusionWithoutExclusionNotice\": \"Bei einer leeren Prozessausschlussliste hat die Prozessaufnahmeliste keine Wirkung.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Wenn Sie alle Prozesse außer diesen ausschließen wollten, können Sie \\\"*\\\" in der Prozessausschlussliste setzen.\",\n      \"processListPlaceholder\": \"Prozessnamen/-pfade, einer pro Zeile, z. B.:\",\n      \"invalidCharactersWarning\": \"Die Prozessliste enthält ungültige Zeichen, die entfernt werden: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Der Marktplatz mit Anpassungen für Windowsprogramme\",\n    \"credit\": \"Von <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Aktualisierung verfügbar\",\n      \"subtitle\": \"Erwägen Sie, Windhawk zu aktualisieren, um die neuesten Funktionen und Fehlerbehebungen zu erhalten.\",\n      \"updateButton\": \"Mehr Details\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Startseite\",\n      \"documentation\": \"Dokumentation\"\n    },\n    \"builtWith\": {\n      \"title\": \"Erstellt mit...\",\n      \"vscodium\": \"eine von der Community betriebene Distribution des VSCode-Editors von Microsoft\",\n      \"llvmMingw\": \"eine LLVM/Clang/LLD-basierte mingw-w64 Toolchain\",\n      \"minHook\": \"die minimalistische API-Hooking-Bibliothek für Windows\",\n      \"others\": \"...sowie anderen Tools, Bibliotheken und ein bisschen Code...\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} installieren\",\n    \"warningTitle\": \"Vorsicht ist hier geboten!\",\n    \"warningDescription\": \"Bösartige Mods können Ihren Computer beschädigen oder Ihre Privatsphäre verletzen. Installieren Sie Mods nur von Autoren, denen Sie vertrauen.\",\n    \"modAuthor\": \"Mod-Autor\",\n    \"homepage\": \"Homepage\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verifiziert\",\n    \"verifiedTooltip\": \"Wir haben verifiziert, dass dieses Profil dem Mod-Autor gehört, aber beachten Sie, dass <0>verifiziert</0> nicht dasselbe ist wie <0>vertrauenswürdig</0>. Stellen Sie sicher, dass Sie dem Mod-Autor vertrauen, oder prüfen Sie den Quellcode vor der Installation sorgfältig.\",\n    \"acceptButton\": \"Das Risiko akzeptieren (Installiere Modifikation)\",\n    \"cancelButton\": \"Abbrechen\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Eine neue Mod erstellen\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Das Erstellen und Modifizieren von Mods erfordert einige Kenntnisse der C/C++-Entwicklung für Windows. Wenn Sie sich nicht sicher sind, was das bedeutet, sind diese Optionen vielleicht nichts für Sie.\",\n    \"hideOptionsCheckbox\": \"Alle entwicklungsbezogenen Optionen ausblenden\",\n    \"hideOptionsButton\": \"Optionen ausblenden\",\n    \"beginCodingButton\": \"Starte Programmieren\",\n    \"cancelButton\": \"Abbrechen\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk läuft im abgesicherten Modus, alle Code-Injektionsfunktionen sind deaktiviert.\",\n    \"offButton\": \"Abgesicherten Modus deaktivieren\",\n    \"offConfirm\": \"Windhawk wird neu gestartet, um die Einstellungen anzuwenden.\",\n    \"offConfirmOk\": \"Windhawk neu starten\",\n    \"offConfirmCancel\": \"Abbrechen\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Die Aktion ist im Vorschaumodus nicht verfügbar.\",\n    \"notCompiled\": \"Die Mod muss kompiliert werden, bevor die Vorschau angezeigt werden kann\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod-Id\",\n    \"enableMod\": \"Aktiviere Mod\",\n    \"enableLogging\": \"Aktiviere Protokollierung\",\n    \"notCompiled\": \"Mod muss kompiliert werden.\",\n    \"compile\": \"Kompiliere Mod...\",\n    \"compilationFailed\": \"Kompilierung fehlgeschlagen\",\n    \"preview\": \"Mod Vorschau\",\n    \"showLogOutput\": \"Zeige Protokoll\",\n    \"exit\": \"Beende Bearbeitungsmodus\",\n    \"exitConfirmation\": \"Alle Änderungen seit der letzten erfolgreichen Kompilierung gehen verloren!\",\n    \"exitButtonOk\": \"Verlassen\",\n    \"exitButtonCancel\": \"Bleiben\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/el/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/el/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Φόρτωση...\",\n    \"loadingFailed\": \"Η φόρτωση απέτυχε, ελέγξτε τη σύνδεσή σας στο Διαδίκτυο\",\n    \"loadingFailedTitle\": \"Η φόρτωση απέτυχε\",\n    \"loadingFailedSubtitle\": \"Ελέγξτε τη σύνδεσή σας στο Διαδίκτυο και δοκιμάστε ξανά\",\n    \"tryAgain\": \"Προσπαθήστε ξανά\",\n    \"updating\": \"Ενημέρωση...\",\n    \"installing\": \"Εγκατάσταση...\",\n    \"compiling\": \"Μετατροπή σε .exe...\",\n    \"cut\": \"Αποκοπή\",\n    \"copy\": \"Αντιγραφή\",\n    \"paste\": \"Επικόλληση\",\n    \"selectAll\": \"Επιλογή όλων\"\n  },\n  \"appHeader\": {\n    \"home\": \"Κεντρική\",\n    \"explore\": \"Περιήγηση\",\n    \"settings\": \"Ρυθμίσεις\",\n    \"about\": \"Σχετικά\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Διαθέσιμη ενημέρωση\",\n    \"installed\": \"Εγκατεστημένο\",\n    \"details\": \"?Λεπτομέρειες\",\n    \"update\": \"Ενημέρωση\",\n    \"install\": \"Εγκαθιστώ\",\n    \"compile\": \"Μετατροπή σε .exe\",\n    \"disable\": \"Απενεργοποίηση\",\n    \"enable\": \"Ενεργοποίηση\",\n    \"edit\": \"Επεξεργασία\",\n    \"fork\": \"Διακλάδωση\",\n    \"remove\": \"Αφαίρεση\",\n    \"removeConfirm\": \"Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το mod?\",\n    \"removeConfirmOk\": \"Κατάργηση mod\",\n    \"removeConfirmCancel\": \"Άκυρο\",\n    \"notCompiled\": \"Το Mod πρέπει να μεταγλωττιστεί\",\n    \"editedLocally\": \"Το Mod επεξεργάστηκε τοπικά\",\n    \"noDescription\": \"(καμία περιγραφή)\",\n    \"users_one\": \"{{formattedCount}} χρήστης\",\n    \"users_other\": \"{{formattedCount}} χρήστες\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Εγκατεστημένη έκδοση\",\n      \"latestVersion\": \"Τελευταία έκδοση\",\n      \"loading\": \"φόρτωση...\",\n      \"loadingFailed\": \"η φόρτωση απέτυχε\",\n      \"modId\": \"Αναγνωριστικό mod\",\n      \"modVersion\": \"ΈκδοσηMod\",\n      \"modAuthor\": {\n        \"title\": \"Δημιουργός του Mod\",\n        \"homepage\": \"Αρχική σελίδα\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Όλες οι διαδικασίες\",\n        \"allBut\": \"Όλα αλλά {{list}}\",\n        \"except\": \"{{included}} εκτός {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Στοχευμένες διαδικασίες\",\n          \"excluded\": \"Εξαιρείται\"\n        }\n      },\n      \"updateNotNeeded\": \"Η εγκατεστημένη έκδοση είναι πανομοιότυπη με την πιο πρόσφατη έκδοση\"\n    },\n    \"details\": {\n      \"title\": \"Λεπτομέρειες\",\n      \"noData\": \"Οι λεπτομέρειες του Mod λείπουν.\"\n    },\n    \"settings\": {\n      \"title\": \"Ρυθμίσεις\",\n      \"noData\": \"Δεν υπάρχουν διαθέσιμες ρυθμίσεις mod.\",\n      \"saveButton\": \"Αποθήκευση ρυθμίσεων\",\n      \"sampleValue\": \"Δείγμα τιμής\",\n      \"arrayItemAdd\": \"Προσθήκη νέου στοιχείου\",\n      \"arrayItemRemove\": \"Αφαίρεση στοιχείου\"\n    },\n    \"code\": {\n      \"title\": \"Πηγαίος κώδικας\",\n      \"noData\": \"Η πηγή mod λείπει.\",\n      \"collapseExtra\": \"Σύμπτυξη Readme και Ρυθμίσεων\"\n    },\n    \"changelog\": {\n      \"title\": \"Καταγραφή αλλαγών\",\n      \"loadingFailed\": \"Η φόρτωση του αρχείου καταγραφής αλλαγών απέτυχε <0>Click here</0> να το δείτε στο GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Για Προχωρημένους\",\n      \"debugLogging\": {\n        \"title\": \"Καταγραφή εντοπισμού σφαλμάτων\",\n        \"description\": \"Μπορεί να είναι χρήσιμο για την αντιμετώπιση προβλημάτων με το mod.\",\n        \"none\": \"Κανένα\",\n        \"modLogs\": \"Αρχεία καταγραφής mod\",\n        \"detailedLogs\": \"Λεπτομερή αρχεία καταγραφής εντοπισμού σφαλμάτων\",\n        \"showLogButton\": \"Εμφάνιση εξόδου καταγραφής\"\n      },\n      \"modSettings\": {\n        \"title\": \"Ρυθμίσεις Mod\",\n        \"description\": \"Εξάγετε ή κοινοποιήστε εύκολα τις ρυθμίσεις mod σας.\",\n        \"loadButton\": \"Φόρτωση\",\n        \"loadFormattedButton\": \"Μορφοποιημένη φόρτωση\",\n        \"saveButton\": \"Αποθήκευση\",\n        \"invalidData\": \"Μη έγκυρα δεδομένα JSON\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Προσαρμοσμένη λίστα συμπερίληψης διεργασιών\",\n        \"descriptionInclusion\": \"Μια προσαρμοσμένη λίστα πρόσθετων εκτελέσιμων ονομάτων αρχείων/διαδρομών που θα στοχεύσει το mod. Η λίστα προστίθεται στη λίστα συμπερίληψης που όρισε ο συντάκτης του mod για να καθορίσει ποιες διαδικασίες θα στοχεύσει. Για κάθε διαδικασία, το mod φορτώνεται εάν η διαδρομή του εκτελέσιμου αρχείου ταιριάζει με μία από τις καταχωρήσεις συμπερίληψης και δεν αντιστοιχεί σε καμία εξαίρεση καταχώρισης.\",\n        \"titleExclusion\": \"Λίστα εξαιρέσεων προσαρμοσμένης διαδικασίας\",\n        \"descriptionExclusion\": \"Μια προσαρμοσμένη λίστα με επιπλέον εκτελέσιμα ονόματα/διαδρομές αρχείων που το mod θα εξαιρέσει από τη στόχευση. Η λίστα προστίθεται στη λίστα εξαιρέσεων που όρισε ο συντάκτης του mod για να καθορίσει ποιες διεργασίες θα στοχεύσει. Για κάθε διεργασία, το mod φορτώνεται εάν η διαδρομή του εκτελέσιμου αρχείου ταιριάζει με μία από τις καταχωρήσεις συμπερίληψης και δεν ταιριάζει με καμία καταχώρηση εξαίρεσης.\",\n        \"processListPlaceholder\": \"Ονόματα διεργασίας/διαδρομές, μία ανά γραμμή, για παράδειγμα:\",\n        \"invalidCharactersWarning\": \"Η λίστα διεργασιών περιέχει μη έγκυρους χαρακτήρες που θα αφαιρεθούν: {{invalidCharacters}}\",\n        \"saveButton\": \"Αποθήκευση\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Αγνόησε τις λίστες συμπερίληψης/εξαίρεσης mod\",\n        \"description\": \"Αγνοήστε τις λίστες συμπερίληψης/εξαίρεσης διεργασιών του mod και χρησιμοποιήστε μόνο τις προσαρμοσμένες λίστες παραπάνω.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Εξετάστε τα μοτίβα λίστας συμπερίληψης για κρίσιμες διαδικασίες συστήματος\",\n        \"description\": \"Από προεπιλογή, το Windhawk φορτώνει mods μόνο σε κρίσιμες διεργασίες συστήματος εάν η διαδικασία περιλαμβάνεται χωρίς πρότυπα, e.g. <0>critical.exe</0>, not <0>*</0> or <0>*.exe</0>. Για περισσότερες λεπτομέρειες σχετικά με τις κρίσιμες διαδικασίες του συστήματος, ανατρέξτε <1>στην τεκμηρίωση</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Τελευταίες αλλαγές έκδοσης\",\n      \"noData\": \"Η εγκατεστημένη έκδοση είναι πανομοιότυπη με την πιο πρόσφατη έκδοση.\",\n      \"splitView\": \"Διαίρεση προβολής\",\n      \"expandLines_one\": \"Ανάπτυξη μιας κρυφής γραμμής\",\n      \"expandLines_other\": \"Ανάπτυξη {{count}} κρυφών γραμμών\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Αναζήτηση για mods...\"\n  },\n  \"home\": {\n    \"browse\": \"Περιήγηση για Mods\",\n    \"installedMods\": {\n      \"title\": \"Εγκατεστημένα Mods\",\n      \"noMods\": \"Δεν έχουν εγκατασταθεί mods\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Αναβαθμισμένα Mods\",\n      \"noMods\": \"Δεν υπάρχουν αναβαθμισμένα mods που να μην έχουν εγκατασταθεί ακόμα\",\n      \"explore\": \"Εξερεύνηση άλλων Mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Δημοφιλής και κορυφαία βαθμολογία\",\n      \"popular\": \"Δημοφιλία\",\n      \"topRated\": \"Κορυφαία βαθμολογία\",\n      \"newest\": \"Νεότερο\",\n      \"lastUpdated\": \"Τελευταία ενημέρωση\",\n      \"alphabeticalOrder\": \"Αλφαβητική σειρά\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Γλώσσα\",\n      \"description\": \"Επιλέξτε τη γλώσσα εμφάνισης που προτιμάτε για το Windhawk.\",\n      \"contribute\": \"<0>Συνεισφέρετε σε μια νέα μετάφραση</0>.\",\n      \"credits\": \"Ελληνική μετάφραση από <0>Σπύρος Κρικέλης-Βόλος</0>.\",\n      \"creditsLink\": \"E-mail:skrikelis@sch.gr\"\n    },\n    \"updates\": {\n      \"title\": \"Έλεγχος για ενημερώσεις\",\n      \"description\": \"Ελέγχετε περιοδικά για νέες εκδόσεις του Windhawk και των εγκατεστημένων mods.\"\n    },\n    \"devMode\": {\n      \"title\": \"Λειτουργία προγραμματιστή\",\n      \"description\": \"Εμφάνιση ενεργειών για προγραμματιστές, όπως δημιουργία και τροποποίηση mods.\"\n    },\n    \"advancedSettings\": \"Ρυθμίσεις για προχωρημένους\",\n    \"hideTrayIcon\": {\n      \"title\": \"Απόκρυψη εικονιδίου παρασκηνίου\",\n      \"description\": \"Θα πρέπει να απενεργοποιήσετε αυτήν την επιλογή για να βγείτε από το Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Απαιτείται κλιμάκωση UAC για τη λειτουργία του Windhawk\",\n      \"description\": \"Το Windhawk απαιτεί δικαιώματα διαχειριστή, αλλά για έναν υπολογιστή ενός χρήστη, η λήψη της προτροπής UAC κάθε φορά μπορεί να είναι ενοχλητική, οπότε ο Windhawk το παρακάμπτει. Ενεργοποιήστε αυτήν την επιλογή για να απαιτείται κλμάκωση UAC για την εκτέλεση του Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Να μην εμφανίζεται αυτόματα το παράθυρο διαλόγου της εργαλειοθήκης\",\n      \"description\": \"Από προεπιλογή, το Windhawk εμφανίζει αυτόματα το παράθυρο διαλόγου της εργαλειοθήκης όταν εντοπίζει ότι η γραμμή εργασιών δεν είναι προσβάσιμη, είτε λόγω αστάθειας του συστήματος είτε για άλλο λόγο. Το παράθυρο διαλόγου εργαλειοθήκης επιτρέπει την έξοδο από το Windhawk, τη μετάβαση σε ασφαλή λειτουργία και να κάνει άλλες παρεμβάσεις. Ο διάλογος της εργαλειοθήκης μπορεί επίσης να εμφανιστεί με τη συντόμευση πληκτρολογίου Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Καθυστέρηση διαλόγου προετοιμασίας Mod\",\n      \"description\": \"Όριο χιλιοστών του δευτερολέπτου αναμονής πριν εμφανιστεί το παράθυρο διαλόγου προόδου για την προετοιμασία του mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Πιο σύνθετες ρυθμίσεις\",\n      \"restartNotice\": \"Το Windhawk θα επανεκκινηθεί για να εφαρμοστούν οι ρυθμίσεις.\",\n      \"saveButton\": \"Αποθήκευση και επανεκκίνηση του Windhawk\",\n      \"cancelButton\": \"Άκυρο\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Βελτίωση καταγραφής του Windhawk\",\n      \"engineLoggingTitle\": \"Λεπτομέρειες καταγραφής κινητήρα Windhawk\",\n      \"description\": \"Τα αρχεία καταγραφής μπορούν να προβληθούν με ένα εργαλείο όπως το DebugView.\",\n      \"none\": \"Κανένα\",\n      \"error\": \"Σφάλμα\",\n      \"verbose\": \"Εμφάνιση λεπτομερειών\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Λίστα εξαιρέσεων διαδικασίας\",\n      \"descriptionExclusion\": \"Μια λίστα ονομάτων/διαδρομών διεργασιών τις οποίες η Windhawk δεν θα εισάγει. Μπορεί να είναι χρήσιμο για περιπτώσεις όπου το Windhawk δεν είναι συμβατό με ένα συγκεκριμένο πρόγραμμα. Σημειώστε ότι η προσθήκη μιας διεργασίας σε αυτήν τη λίστα όχι μόνο θα εμποδίσει το Windhawk να την προσαρμόσει, αλλά θα εμποδίσει επίσης το Windhawk να παρεμποδίσει τις θυγατρικές διεργασίες που δημιουργεί αυτή η διαδικασία. Αυτό που θα κάνει το Windhawk, είναι να φορτώσει τα mods με μια μικρή καθυστέρηση σε τέτοιες περιπτώσεις.\",\n      \"descriptionExclusionWiki\": \"Για περισσότερες λεπτομέρειες σχετικά με την εξαίρεση διεργασιών και σχετικά με τις ενσωματωμένες λίστες εξαίρεσης διεργασιών, ανατρέξτε <0>στην τεκμηρίωση</0>.\",\n      \"excludeCriticalProcesses\": \"Εξαίρεση κρίσιμων διεργασιών συστήματος\",\n      \"excludeIncompatiblePrograms\": \"Εξαίρεση γνωστών μη συμβατών προγραμμάτων\",\n      \"excludeGames\": \"Εξαίρεση γνωστών παιχνιδιών\",\n      \"titleInclusion\": \"Λίστα συμπερίληψης διαδικασίας\",\n      \"descriptionInclusion\": \"Μια λίστα ονομάτων/διαδρομών διεργασιών τις οποίες θα εισάγει το Windhawk, ακόμα κι αν βρίσκονται στη λίστα εξαιρέσεων.\",\n      \"inclusionWithoutExclusionNotice\": \"Η λίστα συμπερίληψης διεργασιών δεν έχει αποτέλεσμα με μια κενή λίστα εξαίρεσης διεργασιών.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Εάν θέλετε να εξαιρέσετε όλες τις διαδικασίες εκτός από αυτές, μπορείτε να ορίσετε \\\"*\\\" στη λίστα εξαιρέσεων διαδικασίας.\",\n      \"processListPlaceholder\": \"Ονόματα/διαδρομές διεργασίας, ανά μία γραμμή, για παράδειγμα:\",\n      \"invalidCharactersWarning\": \"Η λίστα διεργασιών περιέχει μη έγκυρους χαρακτήρες που θα αφαιρεθούν: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Η αγορά προσαρμογής για Windows και προγράμματα\",\n    \"credit\": \"Από <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Υπάρχει διαθέσιμη ενημέρωση\",\n      \"subtitle\": \"Εξετάστε το ενδεχόμενο να ενημερώσετε το Windhawk για να λάβετε τις πιο πρόσφατες δυνατότητες και διορθώσεις σφαλμάτων\",\n      \"updateButton\": \"Περισσότερες λεπτομέρειες\"\n    },\n    \"links\": {\n      \"title\": \"Συνδέσεις\",\n      \"homepage\": \"Αρχική σελίδα\",\n      \"documentation\": \"Τεκμηρίωση\"\n    },\n    \"builtWith\": {\n      \"title\": \"Δομημένο με\",\n      \"vscodium\": \"Μια διανομή βάσει κοινότητας του επεξεργαστή VSCode της Microsoft\",\n      \"llvmMingw\": \"Μια αλυσίδα εργαλείων mingw-w64 που βασίζεται στο LLVM/Clang/LLD\",\n      \"minHook\": \"Η ελαχιστοποιημένη βιβλιοθήκη σύνδεσης API για Windows\",\n      \"others\": \"Άλλα εργαλεία και βιβλιοθήκες και λίγος κώδικας\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Εγκατάσταση {{mod}}\",\n    \"warningTitle\": \"Προχωρήστε με προσοχή\",\n    \"warningDescription\": \"Κακόβουλα mods μπορεί να βλάψουν τον υπολογιστή σας ή να παραβιάσουν το απόρρητό σας. Εγκαταστήστε mods μόνο από συγγραφείς που εμπιστεύεστε.\",\n    \"modAuthor\": \"Δημιουργός Mod\",\n    \"homepage\": \"Η ιστοσελίδα μας\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"επαληθεύτηκε\",\n    \"verifiedTooltip\": \"Επαληθεύσαμε ότι αυτό το προφίλ ανήκει στον συγγραφέα του mod, αλλά σημειώστε ότι <0>η επαλήθευση</0> δεν είναι <0>εμπιστοσύνης</0>. Βεβαιωθείτε ότι εμπιστεύεστε τον συγγραφέα του mod ή ελέγξτε προσεκτικά τον πηγαίο κώδικα πριν από την εγκατάσταση\",\n    \"acceptButton\": \"Αποδοχή κινδύνου και εγκατάσταση\",\n    \"cancelButton\": \"Ακύρωση\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Δημιουργήστε ένα νέο Mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Η δημιουργία και η τροποποίηση mods απαιτεί κάποια γνώση C/C++ ανάπτυξης για Windows. Εάν δεν είστε σίγουροι τι σημαίνει αυτό, ίσως αυτές οι επιλογές δεν είναι για εσάς.\",\n    \"hideOptionsCheckbox\": \"Απόκρυψη όλων των επιλογών που σχετίζονται με την ανάπτυξη\",\n    \"hideOptionsButton\": \"Απόκρυψη επιλογών\",\n    \"beginCodingButton\": \"Έναρξη κωδικοποίησης\",\n    \"cancelButton\": \"Άκυρο\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Το Windhawk λειτουργεί σε ασφαλή λειτουργία, όλες οι λειτουργίες εισαγωγής κώδικα είναι απενεργοποιημένες.\",\n    \"offButton\": \"Απενεργοποίηση ασφαλούς λειτουργίας\",\n    \"offConfirm\": \"Το Windhawk θα επανεκκινηθεί για να εφαρμοστούν οι ρυθμίσεις.\",\n    \"offConfirmOk\": \"Επανεκκίνηση του Windhawk\",\n    \"offConfirmCancel\": \"Άκυρο\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Η ενέργεια δεν είναι διαθέσιμη σε λειτουργία προεπισκόπησης\",\n    \"notCompiled\": \"Το Mod πρέπει να μεταγλωττιστεί για να είναι δυνατή η προεπισκόπησή του\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Αναγνωριστικό mod\",\n    \"enableMod\": \"Ενεργοποίηση mod\",\n    \"enableLogging\": \"Ενεργοποίηση καταγραφής\",\n    \"notCompiled\": \"Το Mod πρέπει να μεταγλωττιστεί\",\n    \"compile\": \"Μεταγλώττιση Mod\",\n    \"compilationFailed\": \"Η συλλογή απέτυχε\",\n    \"preview\": \"Προεπισκόπηση Mod\",\n    \"showLogOutput\": \"Εμφάνιση εξόδου καταγραφής\",\n    \"exit\": \"Έξοδος από τη λειτουργία επεξεργασίας\",\n    \"exitConfirmation\": \"Οι αλλαγές από την τελευταία επιτυχημένη συλλογή θα χαθούν\",\n    \"exitButtonOk\": \"Εξοδος\",\n    \"exitButtonCancel\": \"Παραμονή\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Loading...\",\n    \"loadingFailed\": \"Loading failed, please check your internet connection\",\n    \"loadingFailedTitle\": \"Loading failed\",\n    \"loadingFailedSubtitle\": \"Please check your internet connection and try again\",\n    \"tryAgain\": \"Try again\",\n    \"updating\": \"Updating...\",\n    \"installing\": \"Installing...\",\n    \"compiling\": \"Compiling...\",\n    \"cut\": \"Cut\",\n    \"copy\": \"Copy\",\n    \"paste\": \"Paste\",\n    \"selectAll\": \"Select all\",\n    \"loggingEnabled\": \"Debug logging is enabled\"\n  },\n  \"appHeader\": {\n    \"home\": \"Home\",\n    \"explore\": \"Explore\",\n    \"settings\": \"Settings\",\n    \"about\": \"About\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Update available\",\n    \"installed\": \"Installed\",\n    \"details\": \"Details\",\n    \"update\": \"Update\",\n    \"downgrade\": \"Downgrade\",\n    \"install\": \"Install\",\n    \"compile\": \"Compile\",\n    \"disable\": \"Disable\",\n    \"enable\": \"Enable\",\n    \"edit\": \"Edit\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Remove\",\n    \"removeConfirm\": \"Are you sure you want to remove this mod?\",\n    \"removeConfirmOk\": \"Remove mod\",\n    \"removeConfirmCancel\": \"Cancel\",\n    \"donate\": \"Donate\",\n    \"notCompiled\": \"Mod needs to be compiled\",\n    \"editedLocally\": \"Mod was edited locally\",\n    \"noDescription\": \"(no description)\",\n    \"users_one\": \"{{formattedCount}} user\",\n    \"users_other\": \"{{formattedCount}} users\",\n    \"notRated\": \"This mod hasn't been rated yet\",\n    \"loggingEnabledInAdvancedTab\": \"Debug logging is enabled in the mod's advanced tab\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Installed version\",\n      \"latestVersion\": \"Latest version\",\n      \"loading\": \"loading...\",\n      \"loadingFailed\": \"loading failed\",\n      \"otherVersions\": \"Other versions\",\n      \"selectedVersion\": \"Selected: {{version}}\",\n      \"modId\": \"Mod identifier\",\n      \"modVersion\": \"Mod version\",\n      \"lastUpdated\": \"Last updated\",\n      \"modAuthor\": {\n        \"title\": \"Mod author\",\n        \"homepage\": \"Homepage\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"All processes\",\n        \"allBut\": \"All but {{list}}\",\n        \"except\": \"{{included}} except {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Target processes\",\n          \"excluded\": \"Excluded\",\n          \"customListsNote\": \"Custom process inclusion/exclusion lists were defined for this mod in the Advanced tab\",\n          \"patternsMatchCriticalSystemProcessesNote\": \"Inclusion list patterns are considered for critical system processes for this mod (set in the Advanced tab)\"\n        }\n      },\n      \"updateNotNeeded\": \"The installed version is identical to the selected version\"\n    },\n    \"version\": {\n      \"preRelease\": \"pre-release\",\n      \"select\": \"Select\",\n      \"cancel\": \"Cancel\",\n      \"chooseVersion\": \"Choose a version...\"\n    },\n    \"details\": {\n      \"title\": \"Details\",\n      \"noData\": \"Mod details are missing.\"\n    },\n    \"settings\": {\n      \"title\": \"Settings\",\n      \"noData\": \"No mod settings are available.\",\n      \"saveButton\": \"Save settings\",\n      \"sampleValue\": \"Sample value\",\n      \"arrayItemAdd\": \"Add new item\",\n      \"arrayItemRemove\": \"Remove item\",\n      \"yamlMode\": \"Textual mode\",\n      \"uiMode\": \"Visual mode\",\n      \"yamlInvalid\": \"Invalid YAML format\",\n      \"yamlParseError\": \"YAML Parse Error: {{error}}\",\n      \"yamlInvalidKey\": \"Invalid key in YAML: '{{key}}' is not a valid setting\",\n      \"yamlTypeMismatch\": \"Type mismatch for '{{key}}': expected {{expected}}, but got {{actual}}\",\n      \"unsavedChangesTitle\": \"Unsaved Settings\",\n      \"unsavedChangesMessage\": \"You have unsaved settings changes. Are you sure you want to discard them?\",\n      \"unsavedChangesLeave\": \"Discard Changes\",\n      \"unsavedChangesStay\": \"Keep Editing\"\n    },\n    \"code\": {\n      \"title\": \"Source Code\",\n      \"noData\": \"Mod source is missing.\",\n      \"collapseExtra\": \"Collapse Readme and Settings\"\n    },\n    \"changelog\": {\n      \"title\": \"Changelog\",\n      \"loadingFailed\": \"Failed to load changelog. <0>Click here</0> to view it on GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Advanced\",\n      \"debugLogging\": {\n        \"title\": \"Debug logging\",\n        \"description\": \"Can be useful for troubleshooting issues with the mod.\",\n        \"none\": \"None\",\n        \"modLogs\": \"Mod logs\",\n        \"detailedLogs\": \"Detailed debug logs\",\n        \"showLogButton\": \"Show log output\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod settings\",\n        \"description\": \"Easily export or share your mod settings.\",\n        \"loadButton\": \"Load\",\n        \"loadFormattedButton\": \"Load formatted\",\n        \"saveButton\": \"Save\",\n        \"invalidData\": \"Invalid JSON data\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Custom process inclusion list\",\n        \"descriptionInclusion\": \"A custom list of additional executable file names/paths that the mod will target. The list is added to the inclusion list that the mod author defined to determine which processes to target. For each process, the mod is loaded if the executable file path matches one of the include entries and doesn't match any exclude entry.\",\n        \"titleExclusion\": \"Custom process exclusion list\",\n        \"descriptionExclusion\": \"A custom list of additional executable file names/paths that the mod will exclude from targeting. The list is added to the exclusion list that the mod author defined to determine which processes to target. For each process, the mod is loaded if the executable file path matches one of the include entries and doesn't match any exclude entry.\",\n        \"processListPlaceholder\": \"Process names/paths, one per line, for example:\",\n        \"invalidCharactersWarning\": \"The process list contains invalid characters which will be stripped: {{invalidCharacters}}\",\n        \"saveButton\": \"Save\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignore mod inclusion/exclusion lists\",\n        \"description\": \"Ignore the mod's process inclusion/exclusion lists and use only the custom lists above.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Consider inclusion list patterns for critical system processes\",\n        \"description\": \"By default, Windhawk only loads mods in critical system processes if the process is included without patterns, e.g. <0>critical.exe</0>, not <0>*</0> or <0>*.exe</0>. For more details about critical system processes, please refer to <1>the documentation</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Source Code Changes\",\n      \"noData\": \"The installed version is identical to the selected version.\",\n      \"splitView\": \"Split view\",\n      \"expandLines_one\": \"Expand one hidden line\",\n      \"expandLines_other\": \"Expand {{count}} hidden lines\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Search for mods...\",\n    \"noResults\": \"No mods match the current filters\"\n  },\n  \"home\": {\n    \"browse\": \"Browse for Mods\",\n    \"filter\": {\n      \"enabled\": \"Enabled mods\",\n      \"disabled\": \"Disabled mods\",\n      \"updateAvailable\": \"Mods with update available\",\n      \"clearFilters\": \"Clear filters\"\n    },\n    \"installedMods\": {\n      \"title\": \"Installed Mods\",\n      \"noMods\": \"No mods are installed\",\n      \"grid\": {\n        \"name\": \"Name\",\n        \"description\": \"Description\",\n        \"author\": \"Author\",\n        \"version\": \"Version\",\n        \"status\": \"Status\"\n      }\n    },\n    \"featuredMods\": {\n      \"title\": \"Featured Mods\",\n      \"noMods\": \"There are no featured mods that haven't been installed yet\",\n      \"explore\": \"Explore Other Mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popular and top rated\",\n      \"popular\": \"Popular\",\n      \"topRated\": \"Top rated\",\n      \"newest\": \"Newest\",\n      \"lastUpdated\": \"Last updated\",\n      \"alphabeticalOrder\": \"Alphabetical order\"\n    },\n    \"filter\": {\n      \"installationStatus\": \"Installation status\",\n      \"installed\": \"Installed\",\n      \"notInstalled\": \"Not installed\",\n      \"author\": \"Mod author\",\n      \"process\": \"Target process\",\n      \"showMore\": \"Show more...\",\n      \"clearFilters\": \"Clear filters\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Language\",\n      \"description\": \"Select your preferred display language for Windhawk.\",\n      \"contribute\": \"<0>Contribute a new translation</0>.\",\n      \"credits\": \"English translation by <0>John Smith</0>.\",\n      \"creditsLink\": \"mailto:john.smith@example.com\"\n    },\n    \"updates\": {\n      \"title\": \"Check for updates\",\n      \"description\": \"Automatically check for and notify about new versions of Windhawk and installed mods.\"\n    },\n    \"devMode\": {\n      \"title\": \"Developer mode\",\n      \"description\": \"Show actions for developers, such as creating and modifying mods.\"\n    },\n    \"advancedSettings\": \"Advanced settings\",\n    \"hideTrayIcon\": {\n      \"title\": \"Hide tray icon\",\n      \"description\": \"You will have to disable this option to exit Windhawk.\"\n    },\n    \"alwaysCompileModsLocally\": {\n      \"title\": \"Always compile mods locally\",\n      \"description\": \"By default, Windhawk downloads pre-compiled mod binaries from the Windhawk server when available. Enable this option to always compile mods locally instead.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Require UAC elevation for running Windhawk\",\n      \"description\": \"Windhawk requires administrator rights, but for a single-user computer, getting the UAC prompt every time can be annoying, so Windhawk bypasses it. Enable this option to require UAC elevation for running Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Don't automatically show the toolkit dialog\",\n      \"description\": \"By default, Windhawk automatically shows the toolkit dialog when it detects that the taskbar isn't accessible, either due to system instability or for another reason. The toolkit dialog allows you to exit Windhawk, switch to safe mode, and perform other operations. The toolkit dialog can also be shown with the Ctrl+Win+W keyboard shortcut.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod initialization dialog delay\",\n      \"description\": \"Number of milliseconds to wait before showing the progress dialog for mod initialization.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"More advanced settings\",\n      \"restartNotice\": \"Windhawk will be restarted to apply the settings.\",\n      \"saveButton\": \"Save and restart Windhawk\",\n      \"cancelButton\": \"Cancel\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk logging verbosity\",\n      \"engineLoggingTitle\": \"Windhawk engine logging verbosity\",\n      \"description\": \"Logs can be viewed with a tool such as DebugView.\",\n      \"none\": \"None\",\n      \"error\": \"Error\",\n      \"verbose\": \"Verbose\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Process exclusion list\",\n      \"descriptionExclusion\": \"A list of process names/paths that Windhawk won't inject into. Can be useful for cases when Windhawk isn't compatible with a specific program. Note that adding a process to this list will not only prevent Windhawk from customizing it, but will also prevent Windhawk from intercepting child processes that this process creates. This will cause Windhawk to load mods with a slight delay in such cases.\",\n      \"descriptionExclusionWiki\": \"For more details about excluding processes and about the built-in process exclusion lists, please refer to <0>the documentation</0>.\",\n      \"excludeCriticalProcesses\": \"Exclude critical system processes\",\n      \"excludeIncompatiblePrograms\": \"Exclude known incompatible programs\",\n      \"excludeGames\": \"Exclude well-known games\",\n      \"titleInclusion\": \"Process inclusion list\",\n      \"descriptionInclusion\": \"A list of process names/paths that Windhawk will inject into, even if they're in the exclusion list.\",\n      \"inclusionWithoutExclusionNotice\": \"The process inclusion list has no effect with an empty process exclusion list.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"If you meant to exclude all processes but these, you can set \\\"*\\\" in the process exclusion list.\",\n      \"processListPlaceholder\": \"Process names/paths, one per line, for example:\",\n      \"invalidCharactersWarning\": \"The process list contains invalid characters which will be stripped: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"The customization marketplace for Windows and programs\",\n    \"credit\": \"By <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"An update is available\",\n      \"subtitle\": \"Consider updating Windhawk to get the latest features and bug fixes\",\n      \"changelogButton\": \"Changelog\",\n      \"updateButton\": \"Update\",\n      \"modal\": {\n        \"title\": \"Updating Windhawk\",\n        \"downloading\": \"Downloading update...\",\n        \"installing\": \"Installing update...\",\n        \"installingNote\": \"Windhawk will restart automatically when the installation is complete.\",\n        \"failed\": \"Update failed\",\n        \"cancel\": \"Cancel\"\n      }\n    },\n    \"changelog\": {\n      \"title\": \"What's New in Windhawk\",\n      \"close\": \"Close\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Homepage\",\n      \"documentation\": \"Documentation\"\n    },\n    \"builtWith\": {\n      \"title\": \"Built with\",\n      \"vscodium\": \"A community-driven distribution of Microsoft's VSCode editor\",\n      \"llvmMingw\": \"An LLVM/Clang/LLD based mingw-w64 toolchain\",\n      \"minHook\": \"The minimalistic API hooking library for Windows\",\n      \"others\": \"Other tools and libraries, and a bit of code\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Install {{mod}}\",\n    \"warningTitle\": \"Proceed with care\",\n    \"warningDescription\": \"Malicious mods can damage your computer or violate your privacy. Install mods only from authors whom you trust.\",\n    \"modAuthor\": \"Mod author\",\n    \"homepage\": \"Homepage\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verified\",\n    \"verifiedTooltip\": \"We verified that this profile belongs to the mod author, but note that <0>verified</0> is not the same as <0>trusted</0>. Make sure you trust the mod author, or carefully inspect the source code before installing.\",\n    \"acceptButton\": \"Accept Risk and Install\",\n    \"cancelButton\": \"Cancel\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Create a New Mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Creating and modifying mods requires some knowledge of C/C++ development for Windows. If you're not sure what that means, perhaps these options are not for you.\",\n    \"hideOptionsCheckbox\": \"Hide all development-related options\",\n    \"hideOptionsButton\": \"Hide options\",\n    \"beginCodingButton\": \"Begin coding\",\n    \"cancelButton\": \"Cancel\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk is running in safe mode, all code injection functionality is turned off.\",\n    \"offButton\": \"Turn off safe mode\",\n    \"offConfirm\": \"Windhawk will be restarted to apply the settings.\",\n    \"offConfirmOk\": \"Restart Windhawk\",\n    \"offConfirmCancel\": \"Cancel\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Action is not available in preview mode\",\n    \"notCompiled\": \"Mod needs to be compiled before it can be previewed\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod identifier\",\n    \"enableMod\": \"Enable mod\",\n    \"enableLogging\": \"Enable logging\",\n    \"notCompiled\": \"Mod needs to be compiled\",\n    \"compile\": \"Compile Mod\",\n    \"compilationFailed\": \"Compilation failed\",\n    \"stopCompilation\": \"Stop compilation\",\n    \"preview\": \"Preview Mod\",\n    \"showLogOutput\": \"Show Log Output\",\n    \"exit\": \"Exit Editing Mode\",\n    \"exitConfirmation\": \"Changes since the last successful compilation will be lost\",\n    \"exitButtonOk\": \"Exit\",\n    \"exitButtonCancel\": \"Stay\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Cargando...\",\n    \"loadingFailed\": \"La carga falló, verifique su conexión a Internet\",\n    \"loadingFailedTitle\": \"Carga fallida\",\n    \"loadingFailedSubtitle\": \"Comprueba tu conexión a Internet e inténtalo de nuevo\",\n    \"tryAgain\": \"Intentar otra vez\",\n    \"updating\": \"Actualizando...\",\n    \"installing\": \"Instalando...\",\n    \"compiling\": \"Compilando...\",\n    \"cut\": \"Cortar\",\n    \"copy\": \"Copiar\",\n    \"paste\": \"Pegar\",\n    \"selectAll\": \"Seleccionar todo\"\n  },\n  \"appHeader\": {\n    \"home\": \"Inicio\",\n    \"explore\": \"Explorar\",\n    \"settings\": \"Ajustes\",\n    \"about\": \"Acerca de\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Actualización disponible\",\n    \"installed\": \"Instalado\",\n    \"details\": \"Detalles\",\n    \"update\": \"Actualizar\",\n    \"install\": \"Instalar\",\n    \"compile\": \"Compilar\",\n    \"disable\": \"Desactivar\",\n    \"enable\": \"Activar\",\n    \"edit\": \"Editar\",\n    \"fork\": \"Bifurcación\",\n    \"remove\": \"Eliminar\",\n    \"removeConfirm\": \"¿Estás seguro de que quieres eliminar este mod?\",\n    \"removeConfirmOk\": \"Quitar mod\",\n    \"removeConfirmCancel\": \"Cancelar\",\n    \"notCompiled\": \"Mod necesita ser compilado\",\n    \"editedLocally\": \"Mod fue editado localmente\",\n    \"noDescription\": \"(Sin descripción)\",\n    \"users_one\": \"{{formattedCount}} usuario\",\n    \"users_many\": \"{{formattedCount}} usuarios\",\n    \"users_other\": \"{{formattedCount}} usuarios\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Versión instalada\",\n      \"latestVersion\": \"Ultima versión\",\n      \"loading\": \"cargando...\",\n      \"loadingFailed\": \"carga fallida\",\n      \"modId\": \"Identificador del mod\",\n      \"modVersion\": \"Versión del mod\",\n      \"modAuthor\": {\n        \"title\": \"Autor del mod\",\n        \"homepage\": \"Página principal\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Todos los procesos\",\n        \"allBut\": \"Todo pero {{list}}\",\n        \"except\": \"{{included}} excepto {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Procesos de destino\",\n          \"excluded\": \"Excluido\"\n        }\n      },\n      \"updateNotNeeded\": \"La versión instalada es idéntica a la última versión\"\n    },\n    \"details\": {\n      \"title\": \"Detalles\",\n      \"noData\": \"Faltan detalles de mod.\"\n    },\n    \"settings\": {\n      \"title\": \"Ajustes\",\n      \"noData\": \"No hay configuraciones de mod disponibles.\",\n      \"saveButton\": \"Guardar ajustes\",\n      \"sampleValue\": \"Valor de muestra\",\n      \"arrayItemAdd\": \"Agregar nuevo elemento\",\n      \"arrayItemRemove\": \"Remover elemento\"\n    },\n    \"code\": {\n      \"title\": \"Código fuente\",\n      \"noData\": \"Falta la fuente de mod.\",\n      \"collapseExtra\": \"Ocultar Léame y Configuración\"\n    },\n    \"changelog\": {\n      \"title\": \"Registro de cambios\",\n      \"loadingFailed\": \"Error al cargar el registro de cambios. <0>Haga clic aquí</0> para verlo en GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avanzado\",\n      \"debugLogging\": {\n        \"title\": \"Registro de depuración\",\n        \"description\": \"Puede ser útil para solucionar problemas con el mod.\",\n        \"none\": \"Ninguno\",\n        \"modLogs\": \"Registros de mod\",\n        \"detailedLogs\": \"Registros de depuración detallados\",\n        \"showLogButton\": \"Mostrar salida de registro\"\n      },\n      \"modSettings\": {\n        \"title\": \"Configuración de mod\",\n        \"description\": \"Exporte o comparta fácilmente la configuración de su mod.\",\n        \"loadButton\": \"Cargar\",\n        \"loadFormattedButton\": \"Cargar formateado\",\n        \"saveButton\": \"Guardar\",\n        \"invalidData\": \"Datos JSON no válidos\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Lista de inclusión de procesos personalizados\",\n        \"descriptionInclusion\": \"Una lista personalizada de nombres/rutas de archivos ejecutables adicionales a los que apuntará el mod. La lista se agrega a la lista de inclusión que el autor de la modificación definió para determinar a qué procesos apuntar. Para cada proceso, el mod se carga si la ruta del archivo ejecutable coincide con una de las entradas de inclusión y no coincide con ninguna entrada de exclusión.\",\n        \"titleExclusion\": \"Lista de exclusión de procesos personalizados\",\n        \"descriptionExclusion\": \"Una lista personalizada de nombres/rutas de archivos ejecutables adicionales que el mod excluirá de la orientación. La lista se agrega a la lista de exclusión que el autor del mod definió para determinar a qué procesos apuntar. Para cada proceso, el mod se carga si la ruta del archivo ejecutable coincide con una de las entradas de inclusión y no coincide con ninguna entrada de exclusión.\",\n        \"processListPlaceholder\": \"Nombres/rutas de procesos, uno por línea, por ejemplo:\",\n        \"invalidCharactersWarning\": \"La lista de procesos incluye caracteres inválidos, que serán eliminados: {{invalidCharacters}}\",\n        \"saveButton\": \"Guardar\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorar listas de inclusión/exclusión del mod.\",\n        \"description\": \"Ignora las listas de inclusión/exclusión del mod y utiliza solo las listas personalizadas anteriores.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Considerar patrones de lista de inclusión para procesos críticos del sistema.\",\n        \"description\": \"Por defecto, Windhawk solo carga mods en procesos críticos si solo está incluido en la lista sin *, por ejemplo: <0>critico.exe</0> pero no <0>*</0> o <0>*.exe</0>. Para más detalles, por favor consulte <1>la documentación</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Últimos cambios de versión\",\n      \"noData\": \"La versión instalada es idéntica a la última versión.\",\n      \"splitView\": \"Vista dividida\",\n      \"expandLines_one\": \"Expandir una línea oculta\",\n      \"expandLines_many\": \"Expandir {{count}} líneas ocultas\",\n      \"expandLines_other\": \"Expandir {{count}} líneas ocultas\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Buscar en mods...\"\n  },\n  \"home\": {\n    \"browse\": \"Explorar los Mod\",\n    \"installedMods\": {\n      \"title\": \"Mods instalados\",\n      \"noMods\": \"No hay mods instalados\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mods en primer plano\",\n      \"noMods\": \"No hay mods destacados que aún no se hayan instalado.\",\n      \"explore\": \"Explorar otros Mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popular y mejor valorado\",\n      \"popular\": \"Popular\",\n      \"topRated\": \"Los más valorados\",\n      \"newest\": \"El más nuevo\",\n      \"lastUpdated\": \"Última actualización\",\n      \"alphabeticalOrder\": \"Orden alfabetico\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Idioma\",\n      \"description\": \"Seleccione su idioma de visualización preferido para Windhawk.\",\n      \"contribute\": \"<0>Aportar una nueva traducción</0>.\",\n      \"credits\": \"Traducción al español por <0>Alfonso Guerrero</0>.\",\n      \"creditsLink\": \"mailto:alfonsoguerrerogallego@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"Buscar actualizaciones\",\n      \"description\": \"Compruebe periódicamente si hay nuevas versiones de Windhawk y de los mods instalados.\"\n    },\n    \"devMode\": {\n      \"title\": \"Modo desarrollador\",\n      \"description\": \"Mostrar acciones para desarrolladores, como crear y modificar mods.\"\n    },\n    \"advancedSettings\": \"Ajustes avanzados\",\n    \"hideTrayIcon\": {\n      \"title\": \"Ocultar el icono del área de notificaciones\",\n      \"description\": \"Tendrás que deshabilitar esta opción para salir de Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Requerir elevación de UAC para ejecutar Windhawk\",\n      \"description\": \"Windhawk requiere derechos de administrador, pero para una computadora de un solo usuario, obtener el aviso de UAC cada vez puede ser molesto, por lo que Windhawk lo omite. Habilite esta opción para requerir la elevación de UAC para ejecutar Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"No mostrar automáticamente el cuadro de diálogo del kit de herramientas\",\n      \"description\": \"De forma predeterminada, Windhawk muestra automáticamente el cuadro de diálogo del kit de herramientas cuando detecta que no se puede acceder a la barra de tareas, ya sea debido a la inestabilidad del sistema o por otra razón. El cuadro de diálogo del kit de herramientas permite salir de Windhawk, cambiar al modo seguro y realizar otras operaciones. El cuadro de diálogo del kit de herramientas también se puede mostrar con el atajo de teclado Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Retraso en la inicialización del diálogo de Mod\",\n      \"description\": \"Cantidad de milisegundos a esperar antes de mostrar el diálogo de progreso para la inicialización del mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Más configuraciones avanzadas\",\n      \"restartNotice\": \"Windhawk se reiniciará para aplicar la configuración.\",\n      \"saveButton\": \"Guardar y reiniciar Windhawk\",\n      \"cancelButton\": \"Cancelar\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Detalle de registro de Windhawk\",\n      \"engineLoggingTitle\": \"Detalle de registro del motor Windhawk\",\n      \"description\": \"Los registros se pueden ver con una herramienta como DebugView.\",\n      \"none\": \"Ninguno\",\n      \"error\": \"Error\",\n      \"verbose\": \"Detallado\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Lista de exclusión de procesos\",\n      \"descriptionExclusion\": \"Una lista de nombres de procesos/rutas en las que Windhawk no inyectará. Puede ser útil para casos en los que Windhawk no es compatible con un programa específico. Tenga en cuenta que agregar un proceso a esta lista no solo evitará que Windhawk lo personalice, sino que también evitará que Windhawk intercepte los procesos secundarios que crea este proceso. Esto hará que Windhawk cargue mods con un ligero retraso en tales casos.\",\n      \"descriptionExclusionWiki\": \"Para más detalles sobre la exclusión de procesos y sobre las listas de exclusión de procesos integradas, consulte <0>la documentación</0>.\",\n      \"excludeCriticalProcesses\": \"Excluir programas críticos del sistema\",\n      \"excludeIncompatiblePrograms\": \"Excluir programas incompatibles conocidos\",\n      \"excludeGames\": \"Excluir juegos conocidos\",\n      \"titleInclusion\": \"Lista de inclusión de procesos\",\n      \"descriptionInclusion\": \"Una lista de nombres de procesos/rutas en las que se inyectará Windhawk, incluso si están en la lista de exclusión.\",\n      \"inclusionWithoutExclusionNotice\": \"La lista de inclusión de procesos no tiene efecto con una lista de exclusión de procesos vacía.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Si pretendía excluir todos los procesos menos estos, puede establecer \\\"*\\\" en la lista de exclusión de procesos.\",\n      \"processListPlaceholder\": \"Nombres/rutas de procesos, uno por línea, por ejemplo:\",\n      \"invalidCharactersWarning\": \"La lista de procesos contiene caracteres no válidos que serán eliminados: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"El mercado de personalización para programas de Windows\",\n    \"credit\": \"Por <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Hay disponible una actualización\",\n      \"subtitle\": \"Considere actualizar Windhawk para obtener las últimas funciones y correcciones de errores\",\n      \"updateButton\": \"Más detalles\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Página de inicio\",\n      \"documentation\": \"Documentación\"\n    },\n    \"builtWith\": {\n      \"title\": \"Diseñado con\",\n      \"vscodium\": \"Una distribución impulsada por la comunidad del editor VSCode de Microsoft\",\n      \"llvmMingw\": \"Una cadena de herramientas mingw-w64 basada en LLVM/Clang/LLD\",\n      \"minHook\": \"La biblioteca minimalista de conexión de API para Windows\",\n      \"others\": \"Otras herramientas y bibliotecas, y un poco de código.\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Instalar {{mod}}\",\n    \"warningTitle\": \"Proceder con cuidado\",\n    \"warningDescription\": \"Las modificaciones maliciosas pueden dañar su computadora o violar su privacidad. Instale mods solo de autores en los que confíe.\",\n    \"modAuthor\": \"Autor de mod\",\n    \"homepage\": \"Página principal\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"Verificado\",\n    \"verifiedTooltip\": \"Verificamos que este perfil pertenece al autor del mod, pero tenga en cuenta que <0>verificado</0> no es lo mismo que <0>de confianza</0>. Asegúrese de confiar en el autor del mod o inspeccione cuidadosamente el código fuente antes de instalar.\",\n    \"acceptButton\": \"Aceptar el riesgo e instalar\",\n    \"cancelButton\": \"Cancelar\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Crear un nuevo Mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"La creación y modificación de mods requiere cierto conocimiento del desarrollo de C/C++ para Windows. Si no está seguro de lo que eso significa, tal vez estas opciones no sean para usted.\",\n    \"hideOptionsCheckbox\": \"Ocultar todas las opciones relacionadas con el desarrollo\",\n    \"hideOptionsButton\": \"Ocultar opciones\",\n    \"beginCodingButton\": \"Empezar a codificar\",\n    \"cancelButton\": \"Cancelar\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk se está ejecutando en modo seguro, todas las funciones de inyección de código están desactivadas.\",\n    \"offButton\": \"Desactivar modo seguro\",\n    \"offConfirm\": \"Windhawk se actualizará para aplicar la configuración.\",\n    \"offConfirmOk\": \"Reiniciar Windhawk\",\n    \"offConfirmCancel\": \"Cancelar\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"La acción no está disponible en el modo de vista previa\",\n    \"notCompiled\": \"El mod debe compilarse antes de que pueda obtener una vista previa\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identificador de mod\",\n    \"enableMod\": \"Habilitar mod\",\n    \"enableLogging\": \"Habilitar el registro\",\n    \"notCompiled\": \"Mod necesita ser compilado\",\n    \"compile\": \"Compilar el mod\",\n    \"compilationFailed\": \"Compilación fallida\",\n    \"preview\": \"Previsualizar el Mod\",\n    \"showLogOutput\": \"Mostrar salida de registro\",\n    \"exit\": \"Salir del modo de edición\",\n    \"exitConfirmation\": \"Los cambios desde la última compilación exitosa se perderán\",\n    \"exitButtonOk\": \"Salir\",\n    \"exitButtonCancel\": \"Permanecer\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Chargement...\",\n    \"loadingFailed\": \"Le chargement a échoué, vérifiez votre connexion à internet\",\n    \"loadingFailedTitle\": \"Le chargement a échoué\",\n    \"loadingFailedSubtitle\": \"Vérifiez votre connexion à internet et réessayez\",\n    \"tryAgain\": \"Réessayer\",\n    \"updating\": \"Mise à jour en cours...\",\n    \"installing\": \"Installation en cours...\",\n    \"compiling\": \"Compilation en cours...\",\n    \"cut\": \"Couper\",\n    \"copy\": \"Copier\",\n    \"paste\": \"Coller\",\n    \"selectAll\": \"Tout sélectionner\"\n  },\n  \"appHeader\": {\n    \"home\": \"Accueil\",\n    \"explore\": \"Explorer\",\n    \"settings\": \"Paramètres\",\n    \"about\": \"À propos\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Mise à jour disponible\",\n    \"installed\": \"Installé\",\n    \"details\": \"Détails\",\n    \"update\": \"Mettre à jour\",\n    \"install\": \"Installer\",\n    \"compile\": \"Compiler\",\n    \"disable\": \"Désactiver\",\n    \"enable\": \"Activer\",\n    \"edit\": \"Éditer\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Supprimer\",\n    \"removeConfirm\": \"Êtes-vous sûr de vouloir supprimer ce mod ?\",\n    \"removeConfirmOk\": \"Supprimer le mod\",\n    \"removeConfirmCancel\": \"Annuler\",\n    \"notCompiled\": \"Le mod a besoin d'être compilé\",\n    \"editedLocally\": \"Le mod a été édité localement\",\n    \"noDescription\": \"(aucune description)\",\n    \"users_one\": \"{{formattedCount}} utilisateur\",\n    \"users_many\": \"{{formattedCount}} utilisateurs\",\n    \"users_other\": \"{{formattedCount}} utilisateurs\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Version installée\",\n      \"latestVersion\": \"Dernière version\",\n      \"loading\": \"Chargement...\",\n      \"loadingFailed\": \"Le chargement a échoué\",\n      \"modId\": \"Identifiant du mod\",\n      \"modVersion\": \"Version du mod\",\n      \"modAuthor\": {\n        \"title\": \"Auteur du mod\",\n        \"homepage\": \"Page d'accueil\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Tous les processus\",\n        \"allBut\": \"Tous sauf {{list}}\",\n        \"except\": \"{{included}} excepté {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Processus ciblés\",\n          \"excluded\": \"Exclus\"\n        }\n      },\n      \"updateNotNeeded\": \"La version installée est identique à la dernière version\"\n    },\n    \"details\": {\n      \"title\": \"Détails\",\n      \"noData\": \"Les détails du mod sont manquants.\"\n    },\n    \"settings\": {\n      \"title\": \"Paramètres\",\n      \"noData\": \"Aucun paramètre disponible pour ce mod\",\n      \"saveButton\": \"Sauvegarder les paramètres\",\n      \"sampleValue\": \"Valeur de l'échantillon\",\n      \"arrayItemAdd\": \"Ajouter un nouvel élément\",\n      \"arrayItemRemove\": \"Supprimer l'élément\"\n    },\n    \"code\": {\n      \"title\": \"Code source\",\n      \"noData\": \"Les sources du mod sont manquantes.\",\n      \"collapseExtra\": \"Réduire les Readme et les paramètres\"\n    },\n    \"changelog\": {\n      \"title\": \"Journal des modifications\",\n      \"loadingFailed\": \"Impossible de charger le journal des modifications. <0>Cliquez ici</0> pour le voir sur GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avancé\",\n      \"debugLogging\": {\n        \"title\": \"Journalisation du débogage\",\n        \"description\": \"Peut-être utile pour résoudre les problèmes avec le mod.\",\n        \"none\": \"Aucun\",\n        \"modLogs\": \"Logs du mod\",\n        \"detailedLogs\": \"Logs de débug détaillés\",\n        \"showLogButton\": \"Montrer les sorties de log\"\n      },\n      \"modSettings\": {\n        \"title\": \"Paramètres du mod\",\n        \"description\": \"Exportez ou partagez facilement vos paramètres de mod.\",\n        \"loadButton\": \"Charger\",\n        \"loadFormattedButton\": \"Chargement formaté\",\n        \"saveButton\": \"Sauvegarder\",\n        \"invalidData\": \"Data JSON invalide\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Liste d'inclusion de processus personnalisés\",\n        \"descriptionInclusion\": \"Une liste personnalisée de noms/chemins de processus supplémentaires que le mod va inclure dans le ciblage. Cette liste est ajoutée à la liste d'inclusion que l'auteur du mod a défini pour déterminer quel processus cibler. Pour chaque processus, le mod est chargé si le chemin du processus correspond à l'un de ceux inclus et ne correspond à aucune de ceux exclus.\",\n        \"titleExclusion\": \"Liste de processus exclus personnalisée\",\n        \"descriptionExclusion\": \"Une liste personnalisée de noms/chemins de processus supplémentaires que le mod va exclure du ciblage. Cete liste est ajoutée à la liste d'exclusion que l'auteur du mod a défini pour déterminer quel processus cibler. Pour chaque processus, le mod est chargé si le chemin du processus correspond à l'un de ceux inclus et ne correspond à aucune de ceux exclus.\",\n        \"processListPlaceholder\": \"Noms/chemins des processus, un par ligne, par exemple :\",\n        \"saveButton\": \"Sauvegarder\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorer les listes d'inclusion/exclusion de mods\",\n        \"description\": \"Ignorer les listes d'inclusion/exclusion de processus de mods et n'utiliser que les listes personnalisées ci-dessus.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Changements de la dernière version\",\n      \"noData\": \"La version installée est identique à la dernière version.\",\n      \"splitView\": \"Séparer les vues\",\n      \"expandLines_one\": \"Développer une ligne cachée\",\n      \"expandLines_many\": \"Développer {{count}} lignes cachées\",\n      \"expandLines_other\": \"Développer {{count}} lignes cachées\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Rechercher des mods...\"\n  },\n  \"home\": {\n    \"browse\": \"Parcourir les mods\",\n    \"installedMods\": {\n      \"title\": \"Mods installés\",\n      \"noMods\": \"Aucun mod n'est installé\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mods mis en avant\",\n      \"noMods\": \"Il n'y a aucun mod mis en avant qui n'ait pas été installé\",\n      \"explore\": \"Explorer les autres mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populaires et mieux notés\",\n      \"popular\": \"Populaires\",\n      \"topRated\": \"Mieux notés\",\n      \"newest\": \"Récents\",\n      \"lastUpdated\": \"Mis a jour récemment\",\n      \"alphabeticalOrder\": \"Ordre alphabétique\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Langue\",\n      \"description\": \"Sélectionnez votre langue préférée pour Windhawk.\",\n      \"contribute\": \"<0>Contribuer pour une nouvelle traduction</0>.\",\n      \"credits\": \"Traduction française par <0>Jeremy Clement</0>.\",\n      \"creditsLink\": \"mailto:clement.jeremy.pro@outlook.fr\"\n    },\n    \"updates\": {\n      \"title\": \"Vérifier les mises à jours\",\n      \"description\": \"Vérifier périodiquement l'existance de nouvelles versions de Windhawk et des mods installés.\"\n    },\n    \"devMode\": {\n      \"title\": \"Mode développeur\",\n      \"description\": \"Afficher les actions pour développeur, comme créer et modifier des mods.\"\n    },\n    \"advancedSettings\": \"Paramètres avancés\",\n    \"hideTrayIcon\": {\n      \"title\": \"Cacher l'icône de la zone de notification\",\n      \"description\": \"Vous devez désactiver cette option pour quitter Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Contrôle de compte d’utilisateur (UAC) requis pour lancer Windhawk\",\n      \"description\": \"Windhawk requière des droits administrateur, mais pour un ordinateur ne comportant qu'un seul utilisateur, avoir l'invite de contrôle du compte d'utilisateur (UAC) à chaque fois peut être ennuyant, donc Windhawk la contourne. Activer cette option pour exiger l'invite de contrôle du compte de l'utilisateur (UAC) pour lancer Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Ne pas automatiquement afficher la boîte de dialogue de la boîte à outils\",\n      \"description\": \"Par défaut, Windhawk affiche automatiquement la boîte de dialogue de la boîte à outils quand il détecte que la barre des tâches n'est pas accessible, à cause d'instabilités système ou autre. La boîte de dialogue permet de quitter Windhawk, passer en mode sans échec et effectuer d'autres opérations. Elle peut également être afficher à l'aide du raccourci clavier Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Délai de dialogue d'initialisation du mod\",\n      \"description\": \"Temps en millisecondes à attendre avant d'afficher les boîte de dialogue de progression pour initialiser le mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Plus de paramètres avancés\",\n      \"restartNotice\": \"Windhawk va être redémarré pour appliquer les paramètres.\",\n      \"saveButton\": \"Sauvegarder et redémarrer Windhawk\",\n      \"cancelButton\": \"Annuler\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Verbosité de la journalisation Windhawk\",\n      \"engineLoggingTitle\": \"Verbosité de la journalisation du moteur Windhawk\",\n      \"description\": \"Les journaux peuvent être visualisés avec un outil tel que DebugView.\",\n      \"none\": \"Aucun\",\n      \"error\": \"Erreur\",\n      \"verbose\": \"Verbosité\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Liste d'exclusion de processus\",\n      \"descriptionExclusion\": \"Une liste personnalisée de noms/chemins de processus dans lesquels Windhawk ne pourra rien injecter. Cela peut être utile dans les cas où Windhawk n'est pas compatible avec un programme spécifique. Notez qu'ajouter un processus à cette liste empêchera non seulement Windhawk de le personnaliser, mais empêchera également Windhawk d'intercepter les processus enfants créés par ce processus. Cela forcera Windhawk à charger les mods avec un léger retardement dans de tels cas.\",\n      \"titleInclusion\": \"Liste d'exclusion de processus\",\n      \"descriptionInclusion\": \"Une liste de noms/chemins de processus dans lesquels Windhawk vas pouvoir injecter du code, même s'ils sont dans la liste d'exclusion.\",\n      \"inclusionWithoutExclusionNotice\": \"La liste d'inclusion de processus n'a aucun effet avec une liste d'exclusion de processus vide.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Si vous vouliez exclure tous les processus sauf ceux-ci, vous pouvez définir \\\"*\\\" dans la liste des processus exclus.\",\n      \"processListPlaceholder\": \"Noms/chemins des processus, un par ligne, par exemple :\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"bêta\",\n    \"subtitle\": \"La place du marché de customisations pour les programmes Windows\",\n    \"credit\": \"Par <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Une mise à jour est disponible\",\n      \"subtitle\": \"Mettez à jour Windhawk pour obtenir les dernières fonctionnalités et les corrections de bugs\",\n      \"updateButton\": \"Plus de détails\"\n    },\n    \"links\": {\n      \"title\": \"Liens\",\n      \"homepage\": \"Page d'accueil\",\n      \"documentation\": \"Documentation\"\n    },\n    \"builtWith\": {\n      \"title\": \"Conçu avec\",\n      \"vscodium\": \"Une distribution de l'IDE Microsoft VSCode gérée par la communauté\",\n      \"llvmMingw\": \"Une chaîne d'outils mingw-w64 basée sur LLVM/Clang/LLD\",\n      \"minHook\": \"La bibliothèque de raccordement d'API minimaliste pour Windows\",\n      \"others\": \"Autres outils et librairies, et un peu de code\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Installer {{mod}}\",\n    \"warningTitle\": \"Procéder avec soin\",\n    \"warningDescription\": \"Des mods malicieux peuvent endommager votre ordinateur et violer votre vie privée. Installez des mods provenant seulement d'auteurs en qui vous avez confiance.\",\n    \"modAuthor\": \"Auteur du mod\",\n    \"homepage\": \"Page d'accueil\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"vérifié\",\n    \"verifiedTooltip\": \"Nous avons vérifié que ce profil appartient à l'auteur du mod, mais prenez en considération que la note <0>verifié</0> n'est pas la même que la note <0>créateur de confiance</0>. Soyez sûr d'avoir confiance en l'auteur du mod, or d'analyser avec soin le code source du mod avant de l'installer.\",\n    \"acceptButton\": \"Accepter les risques et installer\",\n    \"cancelButton\": \"Annuler\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Créer un nouveau mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Créer et modifier des mods demande quelques connaissances de développement dans les langages C/C++ pour Windows. Si vous n'êtes pas sûr de ce que cela signfie, ces options ne sont peut-être pas pour vous.\",\n    \"hideOptionsCheckbox\": \"Cacher toutes les options de développement\",\n    \"hideOptionsButton\": \"Cacher les options\",\n    \"beginCodingButton\": \"Commencer le développement\",\n    \"cancelButton\": \"Annuler\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk s'exécute en mode sans échec, toutes les fonctions d'injection de code sont désactivées\",\n    \"offButton\": \"Désactiver le mode sans échec\",\n    \"offConfirm\": \"Windhawk va devoir redémarrer pour appliquer les paramètres\",\n    \"offConfirmOk\": \"Redémarrer Windhawk\",\n    \"offConfirmCancel\": \"Annuler\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"L'action n'est pas disponible en mode prévisualisation\",\n    \"notCompiled\": \"Le mod a besoin d'être compilé avant d'être prévisualisé\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identifiant du mod\",\n    \"enableMod\": \"Activer le mod\",\n    \"enableLogging\": \"Activer la journalisation\",\n    \"notCompiled\": \"Le mod a besoin d'être compilé\",\n    \"compile\": \"Compiler le mod\",\n    \"compilationFailed\": \"La compilation a échoué\",\n    \"preview\": \"Prévisualier le mod\",\n    \"showLogOutput\": \"Montrer les sorties de log\",\n    \"exit\": \"Quitter le mode d'édition\",\n    \"exitConfirmation\": \"Les changements effectués depuis la dernière compilation réussie vont être perdus\",\n    \"exitButtonOk\": \"Quitter\",\n    \"exitButtonCancel\": \"Rester\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hi/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hi/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"लोड हो रहा है...\",\n    \"loadingFailed\": \"लोडिंग विफल, कृपया अपना इंटरनेट कनेक्शन जांचें\",\n    \"loadingFailedTitle\": \"लोडिंग विफल\",\n    \"loadingFailedSubtitle\": \"कृपया अपना इंटरनेट कनेक्शन जांचें और फिर से प्रयास करें\",\n    \"tryAgain\": \"फिर से प्रयास करें\",\n    \"updating\": \"अपडेट हो रहा है...\",\n    \"installing\": \"स्थापित हो रहा है...\",\n    \"compiling\": \"कंपाइल हो रहा है...\",\n    \"cut\": \"काटें\",\n    \"copy\": \"कॉपी करें\",\n    \"paste\": \"पेस्ट करें\",\n    \"selectAll\": \"सभी चुनें\"\n  },\n  \"appHeader\": {\n    \"home\": \"होम\",\n    \"explore\": \"अन्वेषण करें\",\n    \"settings\": \"सेटिंग्स\",\n    \"about\": \"बारे में\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"अपडेट उपलब्ध है\",\n    \"installed\": \"स्थापित\",\n    \"details\": \"विवरण\",\n    \"update\": \"अपडेट करें\",\n    \"install\": \"स्थापित करें\",\n    \"compile\": \"कंपाइल करें\",\n    \"disable\": \"अक्षम करें\",\n    \"enable\": \"सक्षम करें\",\n    \"edit\": \"संपादित करें\",\n    \"fork\": \"फोर्क करें\",\n    \"remove\": \"हटाएँ\",\n    \"removeConfirm\": \"क्या आप वाकई इस मॉड को हटाना चाहते हैं?\",\n    \"removeConfirmOk\": \"मॉड हटाएँ\",\n    \"removeConfirmCancel\": \"रद्द करें\",\n    \"notCompiled\": \"मॉड को कंपाइल करने की आवश्यकता है\",\n    \"editedLocally\": \"मॉड को स्थानीय रूप से संपादित किया गया था\",\n    \"noDescription\": \"(कोई विवरण नहीं)\",\n    \"users_one\": \"{{formattedCount}} उपयोगकर्ता\",\n    \"users_other\": \"{{formattedCount}} उपयोगकर्ता\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"स्थापित संस्करण\",\n      \"latestVersion\": \"नवीनतम संस्करण\",\n      \"loading\": \"लोड हो रहा है...\",\n      \"loadingFailed\": \"लोडिंग विफल\",\n      \"modId\": \"मॉड पहचानकर्ता\",\n      \"modVersion\": \"मॉड संस्करण\",\n      \"modAuthor\": {\n        \"title\": \"मॉड लेखक\",\n        \"homepage\": \"होमपेज\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (ट्विटर)\"\n      },\n      \"processes\": {\n        \"all\": \"सभी प्रक्रियाएँ\",\n        \"allBut\": \"{{list}} को छोड़कर सभी\",\n        \"except\": \"{{included}} को छोड़कर {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"लक्ष्य प्रक्रियाएँ\",\n          \"excluded\": \"बहिष्कृत\"\n        }\n      },\n      \"updateNotNeeded\": \"स्थापित संस्करण नवीनतम संस्करण के समान है\"\n    },\n    \"details\": {\n      \"title\": \"विवरण\",\n      \"noData\": \"मॉड विवरण अनुपस्थित हैं।\"\n    },\n    \"settings\": {\n      \"title\": \"सेटिंग्स\",\n      \"noData\": \"कोई मॉड सेटिंग्स उपलब्ध नहीं हैं।\",\n      \"saveButton\": \"सेटिंग्स सहेजें\",\n      \"sampleValue\": \"नमूना मान\",\n      \"arrayItemAdd\": \"नया आइटम जोड़ें\",\n      \"arrayItemRemove\": \"आइटम हटाएँ\"\n    },\n    \"code\": {\n      \"title\": \"स्रोत कोड\",\n      \"noData\": \"मॉड स्रोत अनुपस्थित है।\",\n      \"collapseExtra\": \"रीडमी और सेटिंग्स संक्षिप्त करें\"\n    },\n    \"changelog\": {\n      \"title\": \"परिवर्तन लॉग\",\n      \"loadingFailed\": \"परिवर्तन लॉग लोड करने में विफल। <0>GitHub पर देखने के लिए यहाँ क्लिक करें</0>।\"\n    },\n    \"advanced\": {\n      \"title\": \"उन्नत\",\n      \"debugLogging\": {\n        \"title\": \"डीबग लॉगिंग\",\n        \"description\": \"मॉड के साथ समस्याओं के निवारण के लिए उपयोगी हो सकता है।\",\n        \"none\": \"कोई नहीं\",\n        \"modLogs\": \"मॉड लॉग\",\n        \"detailedLogs\": \"विस्तृत डीबग लॉग\",\n        \"showLogButton\": \"लॉग आउटपुट दिखाएँ\"\n      },\n      \"modSettings\": {\n        \"title\": \"मॉड सेटिंग्स\",\n        \"description\": \"अपनी मॉड सेटिंग्स को आसानी से निर्यात या साझा करें।\",\n        \"loadButton\": \"लोड करें\",\n        \"loadFormattedButton\": \"स्वरूपित लोड करें\",\n        \"saveButton\": \"सहेजें\",\n        \"invalidData\": \"अमान्य JSON डेटा\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"कस्टम प्रक्रिया समावेशन सूची\",\n        \"descriptionInclusion\": \"अतिरिक्त निष्पादन योग्य फ़ाइल नामों/पथों की एक कस्टम सूची, जिन्हें मॉड लक्षित करेगा। यह सूची मॉड लेखक द्वारा परिभाषित समावेशन सूची में जोड़ी जाती है ताकि यह निर्धारित किया जा सके कि किन प्रक्रियाओं को लक्षित करना है। प्रत्येक प्रक्रिया के लिए, मॉड तब लोड होता है जब निष्पादन योग्य फ़ाइल पथ समावेशन प्रविष्टियों में से किसी एक से मेल खाता है और किसी भी बहिष्करण प्रविष्टि से मेल नहीं खाता।\",\n        \"titleExclusion\": \"कस्टम प्रक्रिया बहिष्करण सूची\",\n        \"descriptionExclusion\": \"अतिरिक्त निष्पादन योग्य फ़ाइल नामों/पथों की एक कस्टम सूची, जिन्हें मॉड लक्षित करने से बहिष्कृत करेगा। यह सूची मॉड लेखक द्वारा परिभाषित बहिष्करण सूची में जोड़ी जाती है ताकि यह निर्धारित किया जा सके कि किन प्रक्रियाओं को लक्षित करना है। प्रत्येक प्रक्रिया के लिए, मॉड तब लोड होता है जब निष्पादन योग्य फ़ाइल पथ समावेशन प्रविष्टियों में से किसी एक से मेल खाता है और किसी भी बहिष्करण प्रविष्टि से मेल नहीं खाता।\",\n        \"processListPlaceholder\": \"प्रक्रिया नाम/पथ, प्रति पंक्ति एक, उदाहरण के लिए:\",\n        \"invalidCharactersWarning\": \"प्रक्रिया सूची में अमान्य वर्ण हैं जो हटा दिए जाएंगे: {{invalidCharacters}}\",\n        \"saveButton\": \"सहेजें\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"मॉड समावेशन/बहिष्करण सूचियों को अनदेखा करें\",\n        \"description\": \"मॉड की प्रक्रिया समावेशन/बहिष्करण सूचियों को अनदेखा करें और केवल उपरोक्त कस्टम सूचियों का उपयोग करें।\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"महत्वपूर्ण सिस्टम प्रक्रियाओं के लिए समावेशन सूची पैटर्न पर विचार करें\",\n        \"description\": \"डिफ़ॉल्ट रूप से, विंडहॉक केवल तभी महत्वपूर्ण सिस्टम प्रक्रियाओं में मॉड्स लोड करता है जब प्रक्रिया बिना पैटर्न के शामिल हो, जैसे <0>critical.exe</0>, न कि <0>*</0> या <0>*.exe</0>। महत्वपूर्ण सिस्टम प्रक्रियाओं के बारे में अधिक जानकारी के लिए, कृपया <1>दस्तावेज़ीकरण</1> देखें।\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"नवीनतम संस्करण परिवर्तन\",\n      \"noData\": \"स्थापित संस्करण नवीनतम संस्करण के समान है।\",\n      \"splitView\": \"विभाजित दृश्य\",\n      \"expandLines_one\": \"एक छिपी पंक्ति विस्तार करें\",\n      \"expandLines_other\": \"{{count}} छिपी पंक्तियाँ विस्तार करें\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"मॉड्स खोजें...\"\n  },\n  \"home\": {\n    \"browse\": \"मॉड्स के लिए ब्राउज़ करें\",\n    \"installedMods\": {\n      \"title\": \"स्थापित मॉड्स\",\n      \"noMods\": \"कोई मॉड्स स्थापित नहीं हैं\"\n    },\n    \"featuredMods\": {\n      \"title\": \"विशेष मॉड्स\",\n      \"noMods\": \"ऐसे कोई विशेष मॉड्स नहीं हैं जो अभी तक स्थापित नहीं किए गए हों\",\n      \"explore\": \"अन्य मॉड्स का अन्वेषण करें\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"लोकप्रिय और शीर्ष रेटेड\",\n      \"popular\": \"लोकप्रिय\",\n      \"topRated\": \"शीर्ष रेटेड\",\n      \"newest\": \"नवीनतम\",\n      \"lastUpdated\": \"अंतिम अपडेट\",\n      \"alphabeticalOrder\": \"वर्णमाला क्रम\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"भाषा\",\n      \"description\": \"विंडहॉक के लिए अपनी पसंदीदा प्रदर्शन भाषा चुनें।\",\n      \"contribute\": \"<0>नया अनुवाद योगदान करें</0>।\",\n      \"credits\": \"<0>Sathwik Hejamady Bhat</0> द्वारा अंग्रेजी अनुवाद।\",\n      \"creditsLink\": \"mailto:sathwikhbhat@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"अपडेट के लिए जांचें\",\n      \"description\": \"विंडहॉक और स्थापित मॉड्स के नए संस्करणों की समय-समय पर जांच करें।\"\n    },\n    \"devMode\": {\n      \"title\": \"डेवलपर मोड\",\n      \"description\": \"डेवलपर्स के लिए कार्रवाइयाँ दिखाएँ, जैसे मॉड्स बनाना और संशोधित करना।\"\n    },\n    \"advancedSettings\": \"उन्नत सेटिंग्स\",\n    \"hideTrayIcon\": {\n      \"title\": \"ट्रे आइकन छिपाएँ\",\n      \"description\": \"विंडहॉक को बंद करने के लिए आपको इस विकल्प को अक्षम करना होगा।\"\n    },\n    \"requireElevation\": {\n      \"title\": \"विंडहॉक चलाने के लिए UAC उन्नयन की आवश्यकता\",\n      \"description\": \"विंडहॉक को व्यवस्थापक अधिकारों की आवश्यकता होती है, लेकिन एकल-उपयोगकर्ता कंप्यूटर के लिए, हर बार UAC प्रॉम्प्ट प्राप्त करना परेशान कर सकता है, इसलिए विंडहॉक इसे बायपास करता है। विंडहॉक चलाने के लिए UAC उन्नयन की आवश्यकता के लिए इस विकल्प को सक्षम करें।\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"टूलकिट डायलॉग स्वचालित रूप से न दिखाएँ\",\n      \"description\": \"डिफ़ॉल्ट रूप से, विंडहॉक स्वचालित रूप से टूलकिट डायलॉग दिखाता है जब यह पता लगाता है कि टास्कबार सुलभ नहीं है, चाहे सिस्टम अस्थिरता के कारण हो या किसी अन्य कारण से। टूलकिट डायलॉग विंडहॉक को बंद करने, सुरक्षित मोड में स्विच करने और अन्य ऑपरेशनों की अनुमति देता है। टूलकिट डायलॉग को Ctrl+Win+W कीबोर्ड शॉर्टकट के साथ भी दिखाया जा सकता है।\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"मॉड प्रारंभिक डायलॉग विलंब\",\n      \"description\": \"मॉड प्रारंभिक के लिए प्रगति डायलॉग दिखाने से पहले प्रतीक्षा करने के लिए मिलीसेकंड की मात्रा।\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"अधिक उन्नत सेटिंग्स\",\n      \"restartNotice\": \"सेटिंग्स लागू करने के लिए विंडहॉक पुनः शुरू होगा।\",\n      \"saveButton\": \"सहेजें और विंडहॉक पुनः शुरू करें\",\n      \"cancelButton\": \"रद्द करें\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"विंडहॉक लॉगिंग वर्बोसिटी\",\n      \"engineLoggingTitle\": \"विंडहॉक इंजन लॉगिंग वर्बोसिटी\",\n      \"description\": \"लॉग्स को डीबगव्यू जैसे टूल के साथ देखा जा सकता है।\",\n      \"none\": \"कोई नहीं\",\n      \"error\": \"त्रुटि\",\n      \"verbose\": \"वर्बोस\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"प्रक्रिया बहिष्करण सूची\",\n      \"descriptionExclusion\": \"प्रक्रिया नामों/पथों की एक सूची जिनमें विंडहॉक इंजेक्ट नहीं करेगा। यह उन मामलों में उपयोगी हो सकता है जब विंडहॉक किसी विशिष्ट प्रोग्राम के साथ संगत नहीं है। ध्यान दें कि इस सूची में प्रक्रिया जोड़ने से न केवल विंडहॉक को इसे अनुकूलित करने से रोका जाएगा, बल्कि यह विंडहॉक को इस प्रक्रिया द्वारा बनाई गई चाइल्ड प्रक्रियाओं को इंटरसेप्ट करने से भी रोकेगा। इससे विंडहॉक ऐसे मामलों में मॉड्स को थोड़ी देरी से लोड करेगा।\",\n      \"descriptionExclusionWiki\": \"प्रक्रियाओं को बहिष्कृत करने और अंतर्निहित प्रक्रिया बहिष्करण सूचियों के बारे में अधिक जानकारी के लिए, कृपया <0>दस्तावेज़ीकरण</0> देखें।\",\n      \"excludeCriticalProcesses\": \"महत्वपूर्ण सिस्टम प्रक्रियाओं को बहिष्कृत करें\",\n      \"excludeIncompatiblePrograms\": \"ज्ञात असंगत प्रोग्राम्स को बहिष्कृत करें\",\n      \"excludeGames\": \"प्रसिद्ध गेम्स को बहिष्कृत करें\",\n      \"titleInclusion\": \"प्रक्रिया समावेशन सूची\",\n      \"descriptionInclusion\": \"प्रक्रिया नामों/पथों की एक सूची जिनमें विंडहॉक इंजेक्ट करेगा, भले ही वे बहिष्करण सूची में हों।\",\n      \"inclusionWithoutExclusionNotice\": \"खाली प्रक्रिया बहिष्करण सूची के साथ प्रक्रिया समावेशन सूची का कोई प्रभाव नहीं पड़ता।\",\n      \"inclusionWithoutTotalExclusionNotice\": \"यदि आपका मतलब सभी प्रक्रियाओं को इनके अलावा बहिष्कृत करना था, तो आप प्रक्रिया बहिष्करण सूची में \\\"*\\\" सेट कर सकते हैं।\",\n      \"processListPlaceholder\": \"प्रक्रिया नाम/पथ, प्रति पंक्ति एक, उदाहरण के लिए:\",\n      \"invalidCharactersWarning\": \"प्रक्रिया सूची में अमान्य वर्ण हैं जो हटा दिए जाएंगे: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"विंडहॉक v{{version}}\",\n    \"beta\": \"बीटा\",\n    \"subtitle\": \"विंडोज और प्रोग्राम्स के लिए अनुकूलन मार्केटप्लेस\",\n    \"credit\": \"<0>{{author}}</0> द्वारा\",\n    \"update\": {\n      \"title\": \"एक अपडेट उपलब्ध है\",\n      \"subtitle\": \"नवीनतम सुविधाओं और बग फिक्स प्राप्त करने के लिए विंडहॉक को अपडेट करने पर विचार करें\",\n      \"updateButton\": \"अधिक विवरण\"\n    },\n    \"links\": {\n      \"title\": \"लिंक्स\",\n      \"homepage\": \"होमपेज\",\n      \"documentation\": \"दस्तावेज़ीकरण\"\n    },\n    \"builtWith\": {\n      \"title\": \"के साथ निर्मित\",\n      \"vscodium\": \"माइक्रोसॉफ्ट के VSCode संपादक का एक सामुदायिक-संचालित वितरण\",\n      \"llvmMingw\": \"एक LLVM/Clang/LLD आधारित mingw-w64 टूलचेन\",\n      \"minHook\": \"विंडोज के लिए न्यूनतम API हुकिंग लाइब्रेरी\",\n      \"others\": \"अन्य टूल और लाइब्रेरीज़, और थोड़ा सा कोड\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} स्थापित करें\",\n    \"warningTitle\": \"सावधानी से आगे बढ़ें\",\n    \"warningDescription\": \"दुर्भावनापूर्ण मॉड्स आपके कंप्यूटर को नुकसान पहुंचा सकते हैं या आपकी गोपनीयता का उल्लंघन कर सकते हैं। केवल उन लेखकों से मॉड्स स्थापित करें जिन पर आप भरोसा करते हैं।\",\n    \"modAuthor\": \"मॉड लेखक\",\n    \"homepage\": \"होमपेज\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (ट्विटर)\",\n    \"verified\": \"सत्यापित\",\n    \"verifiedTooltip\": \"हमने सत्यापित किया है कि यह प्रोफाइल मॉड लेखक की है, लेकिन ध्यान दें कि <0>सत्यापित</0> का मतलब <0>विश्वसनीय</0> नहीं है। सुनिश्चित करें कि आप मॉड लेखक पर भरोसा करते हैं, या स्थापना से पहले स्रोत कोड का सावधानीपूर्वक निरीक्षण करें।\",\n    \"acceptButton\": \"जोखिम स्वीकार करें और स्थापित करें\",\n    \"cancelButton\": \"रद्द करें\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"नया मॉड बनाएँ\"\n  },\n  \"devModeAction\": {\n    \"message\": \"मॉड्स बनाना और संशोधित करना विंडोज के लिए C/C++ विकास के कुछ ज्ञान की आवश्यकता रखता है। यदि आपको यकीन नहीं है कि इसका मतलब क्या है, तो शायद ये विकल्प आपके लिए नहीं हैं।\",\n    \"hideOptionsCheckbox\": \"सभी विकास-संबंधी विकल्प छिपाएँ\",\n    \"hideOptionsButton\": \"विकल्प छिपाएँ\",\n    \"beginCodingButton\": \"कोडिंग शुरू करें\",\n    \"cancelButton\": \"रद्द करें\"\n  },\n  \"safeMode\": {\n    \"alert\": \"विंडहॉक सुरक्षित मोड में चल रहा है, सभी कोड इंजेक्शन कार्यक्षमता बंद है।\",\n    \"offButton\": \"सुरक्षित मोड बंद करें\",\n    \"offConfirm\": \"सेटिंग्स लागू करने के लिए विंडहॉक पुनः शुरू होगा।\",\n    \"offConfirmOk\": \"विंडहॉक पुनः शुरू करें\",\n    \"offConfirmCancel\": \"रद्द करें\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"पूर्वावलोकन मोड में कार्रवाई उपलब्ध नहीं है\",\n    \"notCompiled\": \"पूर्वावलोकन करने से पहले मॉड को कंपाइल करने की आवश्यकता है\"\n  },\n  \"sidebar\": {\n    \"modId\": \"मॉड पहचानकर्ता\",\n    \"enableMod\": \"मॉड सक्षम करें\",\n    \"enableLogging\": \"लॉगिंग सक्षम करें\",\n    \"notCompiled\": \"मॉड को कंपाइल करने की आवश्यकता है\",\n    \"compile\": \"मॉड कंपाइल करें\",\n    \"compilationFailed\": \"कंपाइलेशन विफल\",\n    \"preview\": \"मॉड पूर्वावलोकन करें\",\n    \"showLogOutput\": \"लॉग आउटपुट दिखाएँ\",\n    \"exit\": \"संपादन मोड से बाहर निकलें\",\n    \"exitConfirmation\": \"आखिरी सफल कंपाइलेशन के बाद के परिवर्तन खो जाएंगे\",\n    \"exitButtonOk\": \"बाहर निकलें\",\n    \"exitButtonCancel\": \"रहें\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hr/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hr/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Učitavam...\",\n    \"loadingFailed\": \"Učitavanje nije uspjelo, provjerite internetsku vezu\",\n    \"loadingFailedTitle\": \"Učitavanje nije uspjelo\",\n    \"loadingFailedSubtitle\": \"Provjerite internetsku vezu i pokušajte ponovno\",\n    \"tryAgain\": \"Pokušaj ponovno\",\n    \"updating\": \"Ažuriram...\",\n    \"installing\": \"Instaliram...\",\n    \"compiling\": \"Kompiliram...\",\n    \"cut\": \"Izreži\",\n    \"copy\": \"Kopiraj\",\n    \"paste\": \"Zalijepi\",\n    \"selectAll\": \"Odaberi sve\"\n  },\n  \"appHeader\": {\n    \"home\": \"Početna\",\n    \"explore\": \"Istraži\",\n    \"settings\": \"Postavke\",\n    \"about\": \"O programu\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Dostupno ažuriranje\",\n    \"installed\": \"Instalirano\",\n    \"details\": \"Detalji\",\n    \"update\": \"Ažuriraj\",\n    \"install\": \"Instaliraj\",\n    \"compile\": \"Kompiliraj\",\n    \"disable\": \"Onemogući\",\n    \"enable\": \"Omogući\",\n    \"edit\": \"Uredi\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Ukloni\",\n    \"removeConfirm\": \"Jeste li sigurni da želite ukloniti ovaj dodatak?\",\n    \"removeConfirmOk\": \"Ukloni dodatak\",\n    \"removeConfirmCancel\": \"Odustani\",\n    \"notCompiled\": \"Dodatak je potrebno kompilirati\",\n    \"editedLocally\": \"Dodatak je lokalno izmijenjen\",\n    \"noDescription\": \"(nema opisa)\",\n    \"users_one\": \"{{formattedCount}} korisnik\",\n    \"users_few\": \"{{formattedCount}} korisnika\",\n    \"users_other\": \"{{formattedCount}} korisnika\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Instalirana verzija\",\n      \"latestVersion\": \"Najnovija verzija\",\n      \"loading\": \"učitavam...\",\n      \"loadingFailed\": \"učitavanje nije uspjelo\",\n      \"modId\": \"Identifikator dodatka\",\n      \"modVersion\": \"Verzija dodatka\",\n      \"modAuthor\": {\n        \"title\": \"Autor dodatka\",\n        \"homepage\": \"Početna stranica\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Svi procesi\",\n        \"allBut\": \"Svi osim {{list}}\",\n        \"except\": \"{{included}} osim {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Ciljni procesi\",\n          \"excluded\": \"Isključeno\"\n        }\n      },\n      \"updateNotNeeded\": \"Instalirana verzija jednaka je najnovijoj\"\n    },\n    \"details\": {\n      \"title\": \"Detalji\",\n      \"noData\": \"Nedostaju detalji o dodatku.\"\n    },\n    \"settings\": {\n      \"title\": \"Postavke\",\n      \"noData\": \"Nema dostupnih postavki za ovaj dodatak.\",\n      \"saveButton\": \"Spremi postavke\",\n      \"sampleValue\": \"Uzorak vrijednosti\",\n      \"arrayItemAdd\": \"Dodaj novu stavku\",\n      \"arrayItemRemove\": \"Ukloni stavku\"\n    },\n    \"code\": {\n      \"title\": \"Izvorni kôd\",\n      \"noData\": \"Nedostaje izvorni kôd dodatka.\",\n      \"collapseExtra\": \"Sažmi Readme i Postavke\"\n    },\n    \"changelog\": {\n      \"title\": \"Povijest promjena\",\n      \"loadingFailed\": \"Učitavanje povijesti promjena nije uspjelo. <0>Kliknite ovdje</0> za pregled na GitHubu.\"\n    },\n    \"advanced\": {\n      \"title\": \"Napredno\",\n      \"debugLogging\": {\n        \"title\": \"Debug zapisivanje\",\n        \"description\": \"Može pomoći u otklanjanju poteškoća s dodatkom.\",\n        \"none\": \"Isključeno\",\n        \"modLogs\": \"Zapisivanje dodatka\",\n        \"detailedLogs\": \"Detaljno debug zapisivanje\",\n        \"showLogButton\": \"Prikaži izlaz zapisivanja\"\n      },\n      \"modSettings\": {\n        \"title\": \"Postavke dodatka\",\n        \"description\": \"Jednostavno izvozite ili dijelite postavke ovog dodatka.\",\n        \"loadButton\": \"Učitaj\",\n        \"loadFormattedButton\": \"Učitaj formatirano\",\n        \"saveButton\": \"Spremi\",\n        \"invalidData\": \"Nevažeći JSON podaci\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Prilagođeni popis procesa za uključivanje\",\n        \"descriptionInclusion\": \"Prilagođeni popis dodatnih naziva ili putanja izvršnih datoteka koje će dodatak ciljati. Popis se dodaje popisu uključivanja koji je autor definirao za određivanje ciljanih procesa. Za svaki proces, dodatak se učitava ako putanja izvršne datoteke odgovara nekom unosu za uključivanje i ne poklapa se ni s jednim unosom za isključivanje.\",\n        \"titleExclusion\": \"Prilagođeni popis procesa za isključivanje\",\n        \"descriptionExclusion\": \"Prilagođeni popis dodatnih naziva ili putanja izvršnih datoteka koje se isključuju iz ciljanja. Ovaj se popis dodaje popisu isključivanja koji je autor definirao. Za svaki proces, dodatak se učitava ako putanja odgovara nekom unosu za uključivanje i ne odgovara nijednom unosu za isključivanje.\",\n        \"processListPlaceholder\": \"Nazivi/putanje procesa, jedan po retku, primjerice:\",\n        \"invalidCharactersWarning\": \"Popis procesa sadrži nevažeće znakove koji će biti uklonjeni: {{invalidCharacters}}\",\n        \"saveButton\": \"Spremi\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Zanemari popise uključivanja/isključivanja dodatka\",\n        \"description\": \"Zanemari popise uključivanja/isključivanja procesa definirane u dodatku i upotrebljavaj samo prilagođene popise iznad.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Uvažavaj obrasce za kritične procese sustava\",\n        \"description\": \"Po zadanom, Windhawk učitava dodatke u kritične procese sustava samo ako su izravno navedeni (npr. <0>critical.exe</0>), a ne putem uzoraka (<0>*</0> ili <0>*.exe</0>). Za više detalja o kritičnim procesima sustava, pogledajte <1>dokumentaciju</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Promjene u najnovijoj verziji\",\n      \"noData\": \"Instalirana verzija jednaka je najnovijoj.\",\n      \"splitView\": \"Podijeljeni prikaz\",\n      \"expandLines_one\": \"Proširi jednu skrivenu liniju\",\n      \"expandLines_few\": \"Proširi {{count}} skrivene linije\",\n      \"expandLines_other\": \"Proširi {{count}} skrivenih linija\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Pretraži dodatke...\"\n  },\n  \"home\": {\n    \"browse\": \"Pretraži dodatke\",\n    \"installedMods\": {\n      \"title\": \"Instalirani dodaci\",\n      \"noMods\": \"Nema instaliranih dodataka\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Istaknuti dodaci\",\n      \"noMods\": \"Nema istaknutih dodataka koji još nisu instalirani\",\n      \"explore\": \"Istraži ostale dodatke\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popularni i najbolje ocijenjeni\",\n      \"popular\": \"Popularni\",\n      \"topRated\": \"Najbolje ocijenjeni\",\n      \"newest\": \"Najnoviji\",\n      \"lastUpdated\": \"Nedavno ažurirani\",\n      \"alphabeticalOrder\": \"Abecedni red\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Jezik\",\n      \"description\": \"Odaberite željeni jezik sučelja za Windhawk.\",\n      \"contribute\": \"<0>Doprinesite novom prijevodu</0>.\",\n      \"credits\": \"Engleski prijevod: <0>Davor Kustec</0>.\",\n      \"creditsLink\": \"mailto:dkustec@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"Provjera ažuriranja\",\n      \"description\": \"Povremeno provjerava dostupnost novih verzija Windhawka i instaliranih dodataka.\"\n    },\n    \"devMode\": {\n      \"title\": \"Način za razvojne programere\",\n      \"description\": \"Prikazuje radnje za razvojne programere, poput izrade i uređivanja dodataka.\"\n    },\n    \"advancedSettings\": \"Napredne postavke\",\n    \"hideTrayIcon\": {\n      \"title\": \"Sakrij ikonu u sistemskoj traci\",\n      \"description\": \"Morat ćete isključiti ovu opciju ako želite izaći iz Windhawka.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Zahtijevaj administratorska prava za pokretanje Windhawka\",\n      \"description\": \"Windhawku su potrebna administratorska prava, no za jednokorisničko računalo stalni UAC upiti mogu biti zamorni, pa se Windhawk podrazumijevano pokreće bez njih. Omogućite ovu opciju ako želite da Windhawk svaki put traži administratorska prava.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Ne prikazuj automatski alatni komplet\",\n      \"description\": \"Windhawk prema zadanim postavkama automatski prikazuje dijalog alatnog kompleta kad otkrije da programska traka nije dostupna, primjerice zbog nestabilnosti sustava. Alatni komplet omogućuje izlazak iz Windhawka, prijelaz u sigurni način rada i druge radnje. Možete ga prikazati i pomoću prečaca Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Kašnjenje dijaloga pri inicijalizaciji dodataka\",\n      \"description\": \"Vrijednost (u milisekundama) prije nego što se prikaže dijalog napretka prilikom inicijalizacije dodataka.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Još naprednih postavki\",\n      \"restartNotice\": \"Windhawk će se ponovno pokrenuti kako bi primijenio postavke.\",\n      \"saveButton\": \"Spremi i ponovno pokreni Windhawk\",\n      \"cancelButton\": \"Odustani\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Razina zapisivanja u Windhawku\",\n      \"engineLoggingTitle\": \"Razina zapisivanja u Windhawk pogonu\",\n      \"description\": \"Zapisnike možete pregledavati u alatima kao što je DebugView.\",\n      \"none\": \"Isključeno\",\n      \"error\": \"Pogreške\",\n      \"verbose\": \"Detaljno\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Popis procesa za isključivanje\",\n      \"descriptionExclusion\": \"Popis naziva/putanja procesa u koje se Windhawk neće ubrizgavati. To može biti korisno ako Windhawk nije kompatibilan s određenim programom. Dodavanje procesa ovdje onemogućuje prilagodbu tog procesa i sprječava presretanje child procesa koje taj proces pokreće, što može uzrokovati malo kašnjenje pri učitavanju dodataka.\",\n      \"descriptionExclusionWiki\": \"Više informacija o isključivanju procesa i ugrađenim popisima za isključivanje potražite u <0>dokumentaciji</0>.\",\n      \"excludeCriticalProcesses\": \"Isključi kritične procese sustava\",\n      \"excludeIncompatiblePrograms\": \"Isključi poznate nekompatibilne programe\",\n      \"excludeGames\": \"Isključi dobro poznate igre\",\n      \"titleInclusion\": \"Popis procesa za uključivanje\",\n      \"descriptionInclusion\": \"Popis naziva/putanja procesa u koje će se Windhawk ubrizgavati, čak i ako su na popisu za isključivanje.\",\n      \"inclusionWithoutExclusionNotice\": \"Popis za uključivanje procesa nema učinka dok je popis za isključivanje prazan.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Ako želite isključiti sve procese osim ovih, dodajte \\\"*\\\" u popis za isključivanje.\",\n      \"processListPlaceholder\": \"Nazivi/putanje procesa, jedan po retku, primjerice:\",\n      \"invalidCharactersWarning\": \"Popis procesa sadrži nevažeće znakove koji će biti uklonjeni: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Tržište prilagodbi za Windows i programe\",\n    \"credit\": \"Autor: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Dostupno je ažuriranje\",\n      \"subtitle\": \"Preporučuje se ažuriranje Windhawka radi najnovijih značajki i ispravki\",\n      \"updateButton\": \"Više detalja\"\n    },\n    \"links\": {\n      \"title\": \"Poveznice\",\n      \"homepage\": \"Početna stranica\",\n      \"documentation\": \"Dokumentacija\"\n    },\n    \"builtWith\": {\n      \"title\": \"Izrađeno uz pomoć\",\n      \"vscodium\": \"Distribucija Microsoftova VSCode editora koju podržava zajednica\",\n      \"llvmMingw\": \"LLVM/Clang/LLD-based mingw-w64 alatni lanac\",\n      \"minHook\": \"Minimalistička biblioteka za presretanje Windows API-ja\",\n      \"others\": \"Ostali alati i biblioteke, te malo dodatnog koda\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Instaliraj {{mod}}\",\n    \"warningTitle\": \"Postupajte oprezno\",\n    \"warningDescription\": \"Zlonamjerni dodaci mogu prouzročiti štetu vašem računalu ili narušiti vašu privatnost. Instalirajte dodatke samo od autora kojima vjerujete.\",\n    \"modAuthor\": \"Autor dodatka\",\n    \"homepage\": \"Početna stranica\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"provjereno\",\n    \"verifiedTooltip\": \"Potvrdili smo da ovaj profil pripada autoru dodatka, no <0>provjereno</0> nije isto što i <0>pouzdano</0>. Pobrinite se da vjerujete autoru ili pažljivo pregledajte izvorni kôd prije instalacije.\",\n    \"acceptButton\": \"Prihvati rizik i instaliraj\",\n    \"cancelButton\": \"Odustani\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Kreiraj novi dodatak\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Kreiranje i izmjena dodataka zahtijeva poznavanje C/C++ razvoja za Windows. Ako niste sigurni što to znači, možda ove opcije nisu za vas.\",\n    \"hideOptionsCheckbox\": \"Sakrij sve opcije za razvoj\",\n    \"hideOptionsButton\": \"Sakrij opcije\",\n    \"beginCodingButton\": \"Započni s kodiranjem\",\n    \"cancelButton\": \"Odustani\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk radi u sigurnom načinu rada i svaka je funkcionalnost presretanja koda isključena.\",\n    \"offButton\": \"Isključi sigurni način rada\",\n    \"offConfirm\": \"Windhawk će se ponovno pokrenuti kako bi primijenio postavke.\",\n    \"offConfirmOk\": \"Ponovno pokreni Windhawk\",\n    \"offConfirmCancel\": \"Odustani\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Radnja nije dostupna u načinu pregleda\",\n    \"notCompiled\": \"Dodatak je potrebno kompilirati prije pregleda\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identifikator dodatka\",\n    \"enableMod\": \"Omogući dodatak\",\n    \"enableLogging\": \"Omogući zapisivanje\",\n    \"notCompiled\": \"Dodatak je potrebno kompilirati\",\n    \"compile\": \"Kompiliraj dodatak\",\n    \"compilationFailed\": \"Kompilacija nije uspjela\",\n    \"preview\": \"Pregled dodatka\",\n    \"showLogOutput\": \"Prikaži zapis\",\n    \"exit\": \"Izađi iz načina uređivanja\",\n    \"exitConfirmation\": \"Izmjene od zadnje uspješne kompilacije bit će izgubljene\",\n    \"exitButtonOk\": \"Izađi\",\n    \"exitButtonCancel\": \"Ostani\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hu/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/hu/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Betöltés...\",\n    \"loadingFailed\": \"Betöltés sikertelen, kérjük, ellenőrizze az internetkapcsolatát\",\n    \"loadingFailedTitle\": \"Betöltés sikertelen\",\n    \"loadingFailedSubtitle\": \"Ellenőrizze az internetkapcsolatot, és próbálja újra\",\n    \"tryAgain\": \"Próbáld újra\",\n    \"updating\": \"Frissítés...\",\n    \"installing\": \"Telepítés...\",\n    \"compiling\": \"Fordítás...\",\n    \"cut\": \"Kivágás\",\n    \"copy\": \"Másolás\",\n    \"paste\": \"Beillesztés\",\n    \"selectAll\": \"Összes kijelölése\"\n  },\n  \"appHeader\": {\n    \"home\": \"Főoldal\",\n    \"explore\": \"Felfedezés\",\n    \"settings\": \"Beállítások\",\n    \"about\": \"Névjegy\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Frissítés elérhető\",\n    \"installed\": \"Telepítve\",\n    \"details\": \"Részletek\",\n    \"update\": \"Frissítés\",\n    \"install\": \"Telepítés\",\n    \"compile\": \"Fordítás\",\n    \"disable\": \"Letiltás\",\n    \"enable\": \"Engedélyezés\",\n    \"edit\": \"Szerkesztés\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Eltávolítás\",\n    \"removeConfirm\": \"Biztosan eltávolítja ezt a modot?\",\n    \"removeConfirmOk\": \"Mod eltávolítása\",\n    \"removeConfirmCancel\": \"Mégse\",\n    \"notCompiled\": \"A modot le kell fordítani\",\n    \"editedLocally\": \"A mod helyben szerkesztve lett\",\n    \"noDescription\": \"(nincs leírás)\",\n    \"users_one\": \"{{formattedCount}} felhasználó\",\n    \"users_other\": \"{{formattedCount}} felhasználók\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Telepített verzió\",\n      \"latestVersion\": \"Legújabb verzió\",\n      \"loading\": \"betöltés...\",\n      \"loadingFailed\": \"betöltés sikertelen\",\n      \"modId\": \"Mod azonosító\",\n      \"modVersion\": \"Mod verzió\",\n      \"modAuthor\": {\n        \"title\": \"Mod szerző\",\n        \"homepage\": \"Honlap\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Minden folyamat\",\n        \"allBut\": \"Minden, kivéve {{list}}\",\n        \"except\": \"{{included}} kivéve {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Cél folyamatok\",\n          \"excluded\": \"Kizárva\"\n        }\n      },\n      \"updateNotNeeded\": \"A telepített verzió megegyezik a legújabb verzióval\"\n    },\n    \"details\": {\n      \"title\": \"Részletek\",\n      \"noData\": \"Hiányoznak a mod részletei.\"\n    },\n    \"settings\": {\n      \"title\": \"Beállítások\",\n      \"noData\": \"Nincsenek elérhető mod beállítások.\",\n      \"saveButton\": \"Beállítások mentése\",\n      \"sampleValue\": \"Minta érték\",\n      \"arrayItemAdd\": \"Új elem hozzáadása\",\n      \"arrayItemRemove\": \"Elem eltávolítása\"\n    },\n    \"code\": {\n      \"title\": \"Forráskód\",\n      \"noData\": \"Hiányzik a mod forrása.\",\n      \"collapseExtra\": \"Readme és Beállítások összecsukása\"\n    },\n    \"changelog\": {\n      \"title\": \"Változásnapló\",\n      \"loadingFailed\": \"Változásnapló betöltése sikertelen. <0>Kattintson ide</0> a GitHub megtekintéséhez.\"\n    },\n    \"advanced\": {\n      \"title\": \"Haladó\",\n      \"debugLogging\": {\n        \"title\": \"Hibakeresési naplózás\",\n        \"description\": \"Hasznos lehet a mod hibáinak elhárításához.\",\n        \"none\": \"Nincs\",\n        \"modLogs\": \"Mod naplók\",\n        \"detailedLogs\": \"Részletes hibakeresési naplók\",\n        \"showLogButton\": \"Napló kimenet megjelenítése\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod beállítások\",\n        \"description\": \"Könnyen exportálhatja vagy megoszthatja mod beállításait.\",\n        \"loadButton\": \"Betöltés\",\n        \"loadFormattedButton\": \"Formázott betöltés\",\n        \"saveButton\": \"Mentés\",\n        \"invalidData\": \"Érvénytelen JSON adat\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Egyéni folyamat bevonási lista\",\n        \"descriptionInclusion\": \"Egy egyéni lista további végrehajtható fájlnevekről/útvonalakról, amelyeket a mod célozni fog. A lista hozzáadódik a szerző által meghatározott bevonási listához, hogy meghatározza, mely folyamatokat célozza meg. A mod betöltődik, ha a végrehajtható fájlútvonal egyezik az egyik bevonási elemmel és nem egyezik meg egy kizárási elemmel.\",\n        \"titleExclusion\": \"Egyéni folyamat kizárási lista\",\n        \"descriptionExclusion\": \"Egy egyéni lista további végrehajtható fájlnevekről/útvonalakról, amelyeket a mod kizár a célzásból.\",\n        \"processListPlaceholder\": \"Folyamat nevek/útvonalak, egy sorban, például:\",\n        \"saveButton\": \"Mentés\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Mod bevonási/kizárási listák figyelmen kívül hagyása\",\n        \"description\": \"A mod folyamat bevonási/kizárási listáinak figyelmen kívül hagyása, és csak a fentiek használata.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Legújabb verzió változásai\",\n      \"noData\": \"A telepített verzió megegyezik a legújabb verzióval.\",\n      \"splitView\": \"Megosztott nézet\",\n      \"expandLines_one\": \"Egy rejtett sor kibontása\",\n      \"expandLines_other\": \"{{count}} rejtett sor kibontása\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Modok keresése...\"\n  },\n  \"home\": {\n    \"browse\": \"Modok böngészése\",\n    \"installedMods\": {\n      \"title\": \"Telepített modok\",\n      \"noMods\": \"Nincsenek telepített modok\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Kiemelt modok\",\n      \"noMods\": \"Nincsenek olyan kiemelt modok, amelyek még nincsenek telepítve\",\n      \"explore\": \"Fedezd fel a többi modot\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Népszerű és legjobbra értékelt\",\n      \"popular\": \"Népszerű\",\n      \"topRated\": \"Legjobbra értékelt\",\n      \"newest\": \"Legújabb\",\n      \"lastUpdated\": \"Legutóbb frissítve\",\n      \"alphabeticalOrder\": \"ABC sorrend\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Nyelv\",\n      \"description\": \"Válassza ki a Windhawk megjelenítési nyelvét.\",\n      \"contribute\": \"<0>Járuljon hozzá egy új fordítással</0>.\",\n      \"credits\": \"Angol fordítás: <0>Polauf László</0>.\",\n      \"creditsLink\": \"mailto:aolauf35@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"Frissítések keresése\",\n      \"description\": \"Rendszeresen ellenőrzi a Windhawk és a telepített modok új verzióit.\"\n    },\n    \"devMode\": {\n      \"title\": \"Fejlesztői mód\",\n      \"description\": \"Megjeleníti a fejlesztők számára elérhető műveleteket, például a modok létrehozását és módosítását.\"\n    },\n    \"advancedSettings\": \"Haladó beállítások\",\n    \"hideTrayIcon\": {\n      \"title\": \"Tálcaikon elrejtése\",\n      \"description\": \"A Windhawk bezárásához le kell tiltania ezt az opciót.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"UAC emelés szükséges a Windhawk futtatásához\",\n      \"description\": \"A Windhawk adminisztrátori jogokat igényel, de egyetlen felhasználós számítógépen bosszantó lehet minden alkalommal megkapni az UAC kérdést, ezért a Windhawk ezt megkerüli. Engedélyezze ezt az opciót, ha szeretné, hogy a Windhawk adminisztrátori jogokkal induljon.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Ne jelenítse meg automatikusan az eszközkészlet párbeszédablakot\",\n      \"description\": \"Alapértelmezés szerint a Windhawk automatikusan megjeleníti az eszközkészlet párbeszédablakot, amikor azt észleli, hogy a tálca nem elérhető, akár rendszerinstabilitás, akár más ok miatt.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod inicializálási párbeszédablak késleltetése\",\n      \"description\": \"A várakozási idő milliszekundumban, mielőtt megjelenik a mod inicializálási folyamat párbeszédablaka.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"További haladó beállítások\",\n      \"restartNotice\": \"A beállítások alkalmazásához a Windhawk újraindul.\",\n      \"saveButton\": \"Mentés és Windhawk újraindítása\",\n      \"cancelButton\": \"Mégse\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk naplózási részletesség\",\n      \"engineLoggingTitle\": \"Windhawk motor naplózási részletesség\",\n      \"description\": \"A naplókat meg lehet tekinteni egy olyan eszközzel, mint a DebugView.\",\n      \"none\": \"Nincs\",\n      \"error\": \"Hiba\",\n      \"verbose\": \"Részletes\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Folyamat kizárási lista\",\n      \"descriptionExclusion\": \"A Windhawk nem fog injektálni az itt megadott folyamatokba.\",\n      \"titleInclusion\": \"Folyamat bevonási lista\",\n      \"descriptionInclusion\": \"Lista folyamatokról, amelyekbe a Windhawk injektál, még akkor is, ha azok a kizárási listán vannak.\",\n      \"inclusionWithoutExclusionNotice\": \"A folyamat bevonási lista nem működik üres folyamat kizárási listával.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Ha azt szeretné, hogy minden folyamat kizárva legyen, kivéve ezeket, állítsa be a „*” értéket a folyamat kizárási listában.\",\n      \"processListPlaceholder\": \"Folyamat nevek/útvonalak, egy sorban, például:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"béta\",\n    \"subtitle\": \"Testreszabási piactér Windowsra és programokra\",\n    \"credit\": \"Készítette: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Frissítés elérhető\",\n      \"subtitle\": \"Fontolja meg a Windhawk frissítését az új funkciók és hibajavítások érdekében\",\n      \"updateButton\": \"Részletek\"\n    },\n    \"links\": {\n      \"title\": \"Linkek\",\n      \"homepage\": \"Honlap\",\n      \"documentation\": \"Dokumentáció\"\n    },\n    \"builtWith\": {\n      \"title\": \"Készült:\",\n      \"vscodium\": \"A Microsoft VSCode szerkesztőjének közösségvezérelt terjesztése\",\n      \"llvmMingw\": \"LLVM/Clang/LLD alapú mingw-w64 eszközkészlet\",\n      \"minHook\": \"Minimalista API hooking könyvtár Windowsra\",\n      \"others\": \"Egyéb eszközök és könyvtárak, és egy kis kód\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} telepítése\",\n    \"warningTitle\": \"Óvatosan folytassa\",\n    \"warningDescription\": \"A rosszindulatú modok károsíthatják a számítógépet vagy megsérthetik a magánéletét. Csak olyan modokat telepítsen, amelyek szerzőiben megbízik.\",\n    \"modAuthor\": \"Mod szerzője\",\n    \"homepage\": \"Honlap\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"ellenőrzött\",\n    \"verifiedTooltip\": \"Ellenőriztük, hogy ez a profil a mod szerzőjéhez tartozik, de jegyezze meg, hogy az <0>ellenőrzés</0> nem ugyanaz, mint a <0>bizalom</0>. Győződjön meg róla, hogy megbízik a mod szerzőjében, vagy alaposan vizsgálja meg a forráskódot a telepítés előtt.\",\n    \"acceptButton\": \"Kockázat elfogadása és telepítés\",\n    \"cancelButton\": \"Mégse\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Új mod létrehozása\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Modok létrehozása és módosítása némi Windows C/C++ fejlesztési ismeretet igényel. Ha nem biztos abban, mit jelent ez, talán ezek az opciók nem önnek valók.\",\n    \"hideOptionsCheckbox\": \"Fejlesztéssel kapcsolatos opciók elrejtése\",\n    \"hideOptionsButton\": \"Opciók elrejtése\",\n    \"beginCodingButton\": \"Kódolás elkezdése\",\n    \"cancelButton\": \"Mégse\"\n  },\n  \"safeMode\": {\n    \"alert\": \"A Windhawk biztonságos módban fut, minden kódbefecskendezési funkció ki van kapcsolva.\",\n    \"offButton\": \"Biztonságos mód kikapcsolása\",\n    \"offConfirm\": \"A Windhawk újraindul a beállítások alkalmazásához.\",\n    \"offConfirmOk\": \"Windhawk újraindítása\",\n    \"offConfirmCancel\": \"Mégse\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Ez a művelet nem érhető el előnézeti módban\",\n    \"notCompiled\": \"A modot le kell fordítani, mielőtt előnézetet lehetne készíteni\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod azonosító\",\n    \"enableMod\": \"Mod engedélyezése\",\n    \"enableLogging\": \"Naplózás engedélyezése\",\n    \"notCompiled\": \"A modot le kell fordítani\",\n    \"compile\": \"Mod fordítása\",\n    \"compilationFailed\": \"Fordítás sikertelen\",\n    \"preview\": \"Mod előnézete\",\n    \"showLogOutput\": \"Napló kimenet megjelenítése\",\n    \"exit\": \"Kilépés a szerkesztési módból\",\n    \"exitConfirmation\": \"A legutóbbi sikeres fordítás óta történt változtatások elvesznek\",\n    \"exitButtonOk\": \"Kilépés\",\n    \"exitButtonCancel\": \"Mégse\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/id/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/id/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Memuat...\",\n    \"loadingFailed\": \"Gagal dimuat, silahkan periksa koneksi internet anda\",\n    \"loadingFailedTitle\": \"Gagal dimuat\",\n    \"loadingFailedSubtitle\": \"Silahkan periksa koneksi internet anda dan coba lagi\",\n    \"tryAgain\": \"Coba lagi\",\n    \"updating\": \"Memperbarui...\",\n    \"installing\": \"Memasang...\",\n    \"compiling\": \"Kompiling...\",\n    \"cut\": \"Potong\",\n    \"copy\": \"Salin\",\n    \"paste\": \"Tempel\",\n    \"selectAll\": \"Pilih semua\"\n  },\n  \"appHeader\": {\n    \"home\": \"Beranda\",\n    \"explore\": \"Jelajahi\",\n    \"settings\": \"Pengaturan\",\n    \"about\": \"Tentang\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Pembaruan tersedia\",\n    \"installed\": \"Terpasang\",\n    \"details\": \"Rincian\",\n    \"update\": \"Perbarui\",\n    \"install\": \"Pasang\",\n    \"compile\": \"Kompilasi\",\n    \"disable\": \"Nonaktifkan\",\n    \"enable\": \"Diaktifkan\",\n    \"edit\": \"Sunting\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Hapus\",\n    \"removeConfirm\": \"Apakah anda yakin ingin menghapus mod ini?\",\n    \"removeConfirmOk\": \"Hapus mod\",\n    \"removeConfirmCancel\": \"Batal\",\n    \"notCompiled\": \"Mod needs to be compiled\",\n    \"editedLocally\": \"Mod sudah disunting lokal\",\n    \"noDescription\": \"(tidak ada deskripsi)\",\n    \"users_one\": \"{{formattedCount}} pengguna\",\n    \"users_other\": \"{{formattedCount}} pengguna\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Versi yang terpasang\",\n      \"latestVersion\": \"Versi saat ini\",\n      \"loading\": \"memuat...\",\n      \"loadingFailed\": \"gagal dimuat\",\n      \"modId\": \"Pengenal Mod\",\n      \"modVersion\": \"Versi Mod\",\n      \"modAuthor\": {\n        \"title\": \"Pembuat Mod\",\n        \"homepage\": \"Homepage\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Semua proses\",\n        \"allBut\": \"Semua tapi {{list}}\",\n        \"except\": \"{{included}} kecuali {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Target pemrosesan\",\n          \"excluded\": \"Dikecualikan\"\n        }\n      },\n      \"updateNotNeeded\": \"Versi yang terinstal identik dengan versi terbaru\"\n    },\n    \"details\": {\n      \"title\": \"Rincian\",\n      \"noData\": \"Rincian mod hilang.\"\n    },\n    \"settings\": {\n      \"title\": \"Pengaturan\",\n      \"noData\": \"Tidak ada pengaturan mod yang tersedia.\",\n      \"saveButton\": \"Simpan pengaturan\",\n      \"sampleValue\": \"Contoh value\",\n      \"arrayItemAdd\": \"Tambahkan item baru\",\n      \"arrayItemRemove\": \"Hapus item\"\n    },\n    \"code\": {\n      \"title\": \"Kode Sumber\",\n      \"noData\": \"Sumber mod hilang.\",\n      \"collapseExtra\": \"Perluas Readme dan Pengaturan\"\n    },\n    \"changelog\": {\n      \"title\": \"Catatan perubahan\",\n      \"loadingFailed\": \"Gagal memuat catatan perubahan. <0>Klik disini</0> untuk melihat di Github.\"\n    },\n    \"advanced\": {\n      \"title\": \"Lanjutan\",\n      \"debugLogging\": {\n        \"title\": \"Debug logging\",\n        \"description\": \"Dapat berguna untuk memecahkan masalah dengan mod.\",\n        \"none\": \"Tidak ada\",\n        \"modLogs\": \"Catatan mod\",\n        \"detailedLogs\": \"Rincian catatan debug\",\n        \"showLogButton\": \"Tampilkan output catatan\"\n      },\n      \"modSettings\": {\n        \"title\": \"Pengaturan Mod\",\n        \"description\": \"Ekspor mudah atau bagikan pengaturan mod anda.\",\n        \"loadButton\": \"Muat\",\n        \"loadFormattedButton\": \"Muat diformat\",\n        \"saveButton\": \"Simpan\",\n        \"invalidData\": \"Data JSON tidak valid\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Kustom proses daftar penyertaan\",\n        \"descriptionInclusion\": \"Daftar kustomisasi nama berkas/jalur tambahan yang dapat dieksekusi yang akan ditargetkan oleh mod. Daftar yang ditambahkan ke daftar penyertaan itu penulis mod didefinisikan untuk menentukan proses mana yang akan ditargetkan. Untuk setiap proses, mod dimuat jika jalur berkas yang dapat dieksekusi cocok dengan salah satu entri penyertaan dan tidak cocok dengan entri pengecualian apa pun.\",\n        \"titleExclusion\": \"Daftar proses pengecualian kustom\",\n        \"descriptionExclusion\": \"Daftar kustom berisi nama/jalur file yang dapat dieksekusi tambahan yang akan dikecualikan mod dari penargetan. Daftar tersebut ditambahkan ke daftar pengecualian yang ditetapkan oleh pembuat mod untuk menentukan proses mana yang akan ditargetkan. Untuk setiap proses, mod dimuat jika jalur file yang dapat dieksekusi cocok dengan salah satu entri yang disertakan dan tidak cocok dengan entri yang dikecualikan.\",\n        \"processListPlaceholder\": \"Nama proses/jalur, satu per baris, sebagai contoh:\",\n        \"saveButton\": \"Simpan\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Abaikan daftar penyertaan/pengecualian mod\",\n        \"description\": \"Abaikan daftar penyertaan/pengecualian proses mod dan gunakan hanya daftar kustom di atas.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Perubahan Versi Saat Ini\",\n      \"noData\": \"Versi yang terpasang identik dengan versi saat ini.\",\n      \"splitView\": \"Tampilan berbagi\",\n      \"expandLines_one\": \"Perlebar salah satu baris tersembunyi\",\n      \"expandLines_other\": \"Perlebar {{count}} baris tersembunyi\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Cari untuk mod...\"\n  },\n  \"home\": {\n    \"browse\": \"Jelajahi untuk Mod\",\n    \"installedMods\": {\n      \"title\": \"Mod yang terpasang\",\n      \"noMods\": \"Tidak ada mod yang terpasang\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mod yang difiturkan\",\n      \"noMods\": \"Tidak ada mod difiturkan yang belum terpasang\",\n      \"explore\": \"Jelajahi Mod Lainnya\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populer dan rating tertinggi\",\n      \"popular\": \"Populer\",\n      \"topRated\": \"Rating tertinggi\",\n      \"newest\": \"Terbaru\",\n      \"lastUpdated\": \"Terakhir diperbarui\",\n      \"alphabeticalOrder\": \"Urutkan secara abjad\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Bahasa\",\n      \"description\": \"Pilih bahasa tampilan yang anda sukai untuk Windhawk.\",\n      \"contribute\": \"<0>Kontribusi untuk terjemahan Baru</0>.\",\n      \"credits\": \"Indonesian translation by <0>Lieba Natur Brilian (naturbrilian)</0>.\",\n      \"creditsLink\": \"https://github.com/naturbrilian\"\n    },\n    \"updates\": {\n      \"title\": \"Periksa pembaruan\",\n      \"description\": \"Periksa secara berkala versi baru Windhawk dan mod yang terinstal.\"\n    },\n    \"devMode\": {\n      \"title\": \"Mode pengembang\",\n      \"description\": \"Lihat tindakan untuk pengembang, termasuk pembuatan dan memodifikasi mod.\"\n    },\n    \"advancedSettings\": \"Pengaturan lanjutan\",\n    \"hideTrayIcon\": {\n      \"title\": \"Sembunyikan ikon baki\",\n      \"description\": \"Anda akan menonaktifkan opsi ini untuk menutup Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Dibutuhkan elevasi UAC untuk menjalankan Windhawk\",\n      \"description\": \"Windhawk memerlukan administrator, tetapi untuk komputer single-user, mendapatkan prompt UAC setiap waktu bisa jadi menyebalkan, jadi Windhawk melewatinya. Aktifkan opsi ini untuk membutuhkan elevasi UAC untuk menjalankan Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Otomatis jangan tampilkan dialog toolkit\",\n      \"description\": \"Secara default, Windhawk otomatis menampilkan dialog toolkit ketika mendeteksi taskbar tidak bisa diakses, baik karena ketidakstabilan sistem atau karena alasan lain. Dialog toolkit mengizinkan untuk menutup Windhawk, beralih ke mode aman, dan buat tindakan lain. Dialog toolkit juga bisa ditampilkan dengan pintasan keyboard Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Penundaan dialog inisialisasi mod\",\n      \"description\": \"Jumlah milidetik untuk menunggu sebelum menampilkan dialog kemajuan untuk inisialisasi mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Pengaturan lanjutan lainnya\",\n      \"restartNotice\": \"Windhawk akan dimulai ulang untuk menerapkan pengaturan.\",\n      \"saveButton\": \"Simpan dan memulai ulang Windhawk\",\n      \"cancelButton\": \"Batal\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Verbositas pencatatan Windhawk\",\n      \"engineLoggingTitle\": \"Verbositas pencatatan mesin Windhawk\",\n      \"description\": \"Logs bisa dilihat dengan tool seperti DebugView.\",\n      \"none\": \"Tidak ada\",\n      \"error\": \"Kesalahan\",\n      \"verbose\": \"Verbositas\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Proses pengecualian daftar\",\n      \"descriptionExclusion\": \"Daftar nama/jalur proses yang tidak akan diinject Windhawk. Dapat berguna untuk kasus-kasus ketika Windhawk tidak kompatibel dengan program tertentu. Perhatikan bahwa menambahkan proses ke daftar ini tidak hanya akan mencegah Windhawk untuk menyesuaikannya, tetapi juga akan mencegah Windhawk untuk mencegat proses anak yang dibuat oleh proses ini. Ini akan menyebabkan Windhawk memuat mod dengan sedikit keterlambatan dalam kasus-kasus seperti itu.\",\n      \"titleInclusion\": \"Proses penyertaan daftar\",\n      \"descriptionInclusion\": \"Daftar nama proses/jalur yang akan diinject Windhawk, bahkan jika mereka ada dalam daftar pengecualian.\",\n      \"inclusionWithoutExclusionNotice\": \"Proses penyertaan daftar tidak berefek dengan proses kosong daftar pengecualian.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Jika anda bermaksud untuk mengecualikan semua proses kecuali ini, anda bisa mengatur \\\"*\\\" di daftar proses pengecualian.\",\n      \"processListPlaceholder\": \"Nama proses/jalur, satu per baris, sebagai contoh:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Marketplace kustomisasi untuk Windows dan program\",\n    \"credit\": \"By <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Pembaruan tersedia\",\n      \"subtitle\": \"Pastikan memperbarui Windhawk untuk mendapatkan fitur terbaru dan perbaikan bug\",\n      \"updateButton\": \"Rincian lengkapnya\"\n    },\n    \"links\": {\n      \"title\": \"Tautan\",\n      \"homepage\": \"Homepage\",\n      \"documentation\": \"Dokumentasi\"\n    },\n    \"builtWith\": {\n      \"title\": \"dibuat dengan\",\n      \"vscodium\": \"Distribusi editor VSCode Microsoft yang digerakkan oleh komunitas\",\n      \"llvmMingw\": \"Toolchain mingw--wg4 berbasis LLVM/Clang/LLD\",\n      \"minHook\": \"Pustaka hooking API minimalis untuk Windows\",\n      \"others\": \"tool lain dan perpustakaan, dan sedikit kode\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Pasang {{mod}}\",\n    \"warningTitle\": \"Lanjutkan dengan hati-hati\",\n    \"warningDescription\": \"Mod berbahaya dapat merusak komputer atau melanggar privasi Anda. Instal mod hanya dari pembuat yang Anda percaya.\",\n    \"modAuthor\": \"Pembuat mod\",\n    \"homepage\": \"Homepage\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"terverifikasi\",\n    \"verifiedTooltip\": \"Kami memverifikasi bahwa profil ini milik pembuat mod, perlu dicatat <0>verifikasi</0> tidak sama dengan <0>terpercaya</0>. Pastikan anda percaya pembuat mod, atau hati-hati menginspect kode sumber sebelum memasang.\",\n    \"acceptButton\": \"Terima dengan Hati-hati dan Pasang\",\n    \"cancelButton\": \"Batal\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Buat Mod Baru\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Membuat dan memodifikasi mod membutuhkan beberapa keahlian pengembangan C/C++ untuk Windows. Jika anda tidak yakin apa yang dimaksud, mungkin opsi ini bukan untuk Anda.\",\n    \"hideOptionsCheckbox\": \"Sembunyikan semua opsi yang terkait dengan pengembangan\",\n    \"hideOptionsButton\": \"Sembunyikan opsi\",\n    \"beginCodingButton\": \"Mulai mengoding\",\n    \"cancelButton\": \"Batal\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk berjalan di mode aman, semua fungsi kode injeksi dinonaktifkan.\",\n    \"offButton\": \"Nonaktifkan mode aman\",\n    \"offConfirm\": \"Windhawk akan dimulai ulang untuk menerapkan pengaturan.\",\n    \"offConfirmOk\": \"Mulai ulang Windhawk\",\n    \"offConfirmCancel\": \"Batal\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Tindakan tidak tersedia di mode pratinjau\",\n    \"notCompiled\": \"Mod harus dikompilasi sebelum bisa dipratinjau\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identifikasi mod\",\n    \"enableMod\": \"Aktifkan mod\",\n    \"enableLogging\": \"Aktifkan pencatatan\",\n    \"notCompiled\": \"Mod harus di kompilasi\",\n    \"compile\": \"Kompilasi Mod\",\n    \"compilationFailed\": \"Kompilasi gagal\",\n    \"preview\": \"Pratinjau Mod\",\n    \"showLogOutput\": \"Tampilkan Log Output\",\n    \"exit\": \"Tutup Mode Penyuntingan\",\n    \"exitConfirmation\": \"Perubahan sejak kompilasi terakhir yang berhasil akan hilang\",\n    \"exitButtonOk\": \"Tutup\",\n    \"exitButtonCancel\": \"Stay\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Caricamento...\",\n    \"loadingFailed\": \"Caricamento fallito, per favore controlla la tua connessione Internet.\",\n    \"loadingFailedTitle\": \"Caricamento fallito\",\n    \"loadingFailedSubtitle\": \"Per favore controlla la tua connessione Internet e prova di nuovo\",\n    \"tryAgain\": \"Riprova ancora\",\n    \"updating\": \"Aggiornamento...\",\n    \"installing\": \"Installazione...\",\n    \"compiling\": \"Compilazione...\"\n  },\n  \"appHeader\": {\n    \"home\": \"Home\",\n    \"explore\": \"Esplora\",\n    \"settings\": \"impostazioni\",\n    \"about\": \"Informazioni\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Aggiornamento disponibile\",\n    \"installed\": \"Installato\",\n    \"details\": \"Dettagli\",\n    \"update\": \"Aggiorna\",\n    \"install\": \"Installa\",\n    \"compile\": \"Compila\",\n    \"disable\": \"Disabilita\",\n    \"enable\": \"Abilita\",\n    \"edit\": \"Modifica\",\n    \"fork\": \"Fai un fork\",\n    \"remove\": \"Rimuovi\",\n    \"removeConfirm\": \"Sei sicuro di voler rimuovere questa mod?\",\n    \"removeConfirmOk\": \"Rimuovi mod\",\n    \"removeConfirmCancel\": \"Annulla\",\n    \"notCompiled\": \"La mod deve essere compilata\",\n    \"editedLocally\": \"La mod è stata modificata localmente\",\n    \"noDescription\": \"(nessuna descizione)\",\n    \"users_one\": \"{{formattedCount}} utente\",\n    \"users_many\": \"{{formattedCount}} utenti\",\n    \"users_other\": \"{{formattedCount}} utenti\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Versione installata\",\n      \"latestVersion\": \"Ultima versione\",\n      \"loading\": \"caricamento...\",\n      \"loadingFailed\": \"caricamento fallito\",\n      \"modId\": \"Identificatore della mod\",\n      \"modVersion\": \"Versione della mod\",\n      \"modAuthor\": {\n        \"title\": \"Autore della mod\",\n        \"homepage\": \"Homepage\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Tutti i processi\",\n        \"allBut\": \"Tutto ma {{list}}\",\n        \"except\": \"{{included}} eccetto {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Processi inclusi nel targeting\",\n          \"excluded\": \"Esclusi\"\n        }\n      },\n      \"updateNotNeeded\": \"La versione installata è identica all'ultima versione\"\n    },\n    \"details\": {\n      \"title\": \"Dettagli\",\n      \"noData\": \"Mancano i dettagli della mod.\"\n    },\n    \"settings\": {\n      \"title\": \"Impostazioni\",\n      \"noData\": \"In questa mod non sono disponibili le impostazioni.\",\n      \"saveButton\": \"Salva impostazioni\",\n      \"sampleValue\": \"Valore campione\",\n      \"arrayItemAdd\": \"Aggiungi un nuovo elemento\",\n      \"arrayItemRemove\": \"Riumuovi elemento\"\n    },\n    \"code\": {\n      \"title\": \"Codice sorgente\",\n      \"noData\": \"Manca la fonte della mod.\",\n      \"collapseExtra\": \"Comprimi Readme e impostazioni\"\n    },\n    \"changelog\": {\n      \"title\": \"Changelog\",\n      \"loadingFailed\": \"Impossibile caricare il registro delle modifiche. <0>Fai clic qui</0> per visualizzarlo su GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avanzate\",\n      \"debugLogging\": {\n        \"title\": \"Registrazione di debug\",\n        \"description\": \"Può essere utile per la risoluzione dei problemi con il mod.\",\n        \"none\": \"Nessuno\",\n        \"modLogs\": \"Registri mod\",\n        \"detailedLogs\": \"Mostra l'output del registro\",\n        \"showLogButton\": \"Mostra l'output del registro\"\n      },\n      \"modSettings\": {\n        \"title\": \"Impostazioni delle mod\",\n        \"description\": \"Esporta o condividi facilmente le tue impostazioni delle mod.\",\n        \"loadButton\": \"Carica\",\n        \"loadFormattedButton\": \"Carica formattato\",\n        \"saveButton\": \"Salva\",\n        \"invalidData\": \"Dati JSON non validi\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Elenco di inclusione di processi personalizzati\",\n        \"descriptionInclusion\": \"Un elenco personalizzato di nomi/percorsi di file eseguibili aggiuntivi che la mod includerà nel targeting. L'elenco viene aggiunto all'elenco di inclusione che l'autore della mod ha definito per determinare quali processi includere nel targeting. Per ogni processo, la mod viene caricata se il percorso del file eseguibile corrisponde a una delle voci di inclusione e non corrisponde a nessuna voce di esclusione.\",\n        \"titleExclusion\": \"Elenco di esclusione processo personalizzato\",\n        \"descriptionExclusion\": \"Un elenco personalizzato di nomi/percorsi di file eseguibili aggiuntivi che la mod escluderà dal targeting. L'elenco viene aggiunto all'elenco di esclusione definito dall'autore della mod per determinare quali processi includere nel targeting. Per ogni processo, la mod viene caricata se il percorso del file eseguibile corrisponde a una delle voci di inclusione e non corrisponde a nessuna voce di esclusione.\",\n        \"processListPlaceholder\": \"Nomi/percorsi dei processi, uno per riga, ad esempio:\",\n        \"saveButton\": \"Salva\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Ultime modifiche della versione\",\n      \"noData\": \"La versione installata è identica all'ultima versione.\",\n      \"splitView\": \"Dividi vista\",\n      \"expandLines_one\": \"Espandi una linea nascosta\",\n      \"expandLines_many\": \"Espandi {{count}} linee nascoste\",\n      \"expandLines_other\": \"Espandi {{count}} linee nascoste\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Cerca mod...\"\n  },\n  \"home\": {\n    \"browse\": \"Cerca Mod\",\n    \"installedMods\": {\n      \"title\": \"Mod installate\",\n      \"noMods\": \"Non è installata nessuna mod\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mod in primo piano\",\n      \"noMods\": \"Non ci sono mod in primo piano che non sono state ancora installate\",\n      \"explore\": \"Esplora altre mod\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popolare e più votato\",\n      \"popular\": \"Popolare\",\n      \"topRated\": \"Più votato\",\n      \"newest\": \"Recente\",\n      \"lastUpdated\": \"Ultimo aggiornamento\",\n      \"alphabeticalOrder\": \"Ordine alfabetico\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Lingua\",\n      \"description\": \"Seleziona la lingua di visualizzazione preferita per Windhawk.\",\n      \"contribute\": \"<0>Contribuisci con una nuova traduzione</0>.\",\n      \"credits\": \"Traduzione italiana di <0>Marco Petrucci</0>.\",\n      \"creditsLink\": \"https://github.com/marco00petrucci\"\n    },\n    \"updates\": {\n      \"title\": \"Ricerca aggiornamenti\",\n      \"description\": \"Verifica periodicamente la presenza di nuove versioni di Windhawk e delle mod installate.\"\n    },\n    \"devMode\": {\n      \"title\": \"Modalità sviluppatore\",\n      \"description\": \"Mostra azioni per sviluppatori, come la creazione e la modifica di mod.\"\n    },\n    \"advancedSettings\": \"Impostazioni avanzate\",\n    \"hideTrayIcon\": {\n      \"title\": \"Nascondi l'icona nella barra delle applicazioni\",\n      \"description\": \"Dovrai disabilitare questa opzione per uscire da Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Richiedi l'elevazione UAC per l'esecuzione di Windhawk\",\n      \"description\": \"Windhawk richiede i diritti di amministratore, ma per un computer con un solo utente, aprire il prompt UAC ogni volta può essere fastidioso, ma puoi scegliere di far ignorare questa opzione a Windhawk. Abilita questa opzione per richiedere l'elevazione UAC per l'esecuzione di Windhawk.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Ritardo nella finestra di dialogo di inizializzazione delle mod\",\n      \"description\": \"Quantità di millisecondi da attendere prima di mostrare la finestra di dialogo di avanzamento per l'inizializzazione della mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Altre impostazioni avanzate\",\n      \"restartNotice\": \"Windhawk sarà riavviato per applicare le impostazioni.\",\n      \"saveButton\": \"Salva e riavvia Windhawk\",\n      \"cancelButton\": \"Annulla\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Verbosità della registrazione di Windhawk\",\n      \"engineLoggingTitle\": \"Verbosità della registrazione del motore di Windhawk\",\n      \"description\": \"I log possono essere visualizzati con uno strumento come DebugView.\",\n      \"none\": \"Nessuno\",\n      \"error\": \"Errore\",\n      \"verbose\": \"Dettagliato\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Elenco di processi esclusi\",\n      \"descriptionExclusion\": \"Un elenco di nomi/percorsi di processo in cui Windhawk non verrà eseguito. Può essere utile nei casi in cui Windhawk non è compatibile con un programma specifico. Tieni presente che l'aggiunta di un processo a questo elenco non solo impedirà a Windhawk di personalizzarlo, ma impedirà anche a Windhawk di intercettare i processi figlio creati da questo processo. Ciò farà sì che Windhawk carichi le mod con un leggero ritardo in questi casi.\",\n      \"titleInclusion\": \"Elenco di inclusione del processo\",\n      \"descriptionInclusion\": \"Un elenco di nomi/percorsi di processo in cui Windhawk verrà eseguito, anche se sono nell'elenco di esclusione.\",\n      \"inclusionWithoutExclusionNotice\": \"L'elenco di inclusione processi non ha effetto con un elenco di esclusione processi vuoto.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Se intendevi escludere tutti i processi tranne questi, puoi impostare \\\"*\\\" nell'elenco di esclusione dei processi.\",\n      \"processListPlaceholder\": \"Nomi/percorsi dei processi, uno per riga, ad esempio:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Il mercato della personalizzazione per i programmi Windows\",\n    \"credit\": \"Di <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"È disponibile un aggiornamento\",\n      \"subtitle\": \"Prendi in considerazione l'aggiornamento di Windhawk per ottenere le ultime funzionalità e correzioni di bug\",\n      \"updateButton\": \"Più dettagli\"\n    },\n    \"links\": {\n      \"title\": \"Link\",\n      \"homepage\": \"Homepage\",\n      \"documentation\": \"Documentazione\"\n    },\n    \"builtWith\": {\n      \"title\": \"Realizzato con\",\n      \"vscodium\": \"Una distribuzione guidata dalla comunità dell'editor VSCode di Microsoft\",\n      \"llvmMingw\": \"Una toolchain mingw-w64 basata su LLVM/Clang/LLD\",\n      \"minHook\": \"La libreria di hook API minimalista per Windows\",\n      \"others\": \"Altri strumenti e librerie, e un po' di codice\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Installa {{mod}}\",\n    \"warningTitle\": \"Procedi con cura\",\n    \"warningDescription\": \"Le mod dannose possono danneggiare il tuo computer o violare la tua privacy. Installa mod solo da autori di cui ti fidi.\",\n    \"modAuthor\": \"Autore della mod\",\n    \"homepage\": \"Homepage\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verificato\",\n    \"verifiedTooltip\": \"Abbiamo verificato che questo profilo appartiene all'autore della mod, ma tieni presente che <0>verificato</0> non equivale a <0>attendibile</0>. Assicurati di fidarti dell'autore della mod o ispeziona attentamente il codice sorgente prima dell'installazione.\",\n    \"acceptButton\": \"Accetta il rischio e installa\",\n    \"cancelButton\": \"Annulla\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Crea una nuova mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"La creazione e la modifica di mod richiede una certa conoscenza dello sviluppo C/C++ per Windows. Se non sei sicuro di cosa significhi, forse queste opzioni non fanno per te.\",\n    \"hideOptionsCheckbox\": \"Nascondi tutte le opzioni relative allo sviluppo\",\n    \"hideOptionsButton\": \"Nascondi opzioni\",\n    \"beginCodingButton\": \"Inizia la codifica\",\n    \"cancelButton\": \"Annulla\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"L'azione non è disponibile in modalità anteprima\",\n    \"notCompiled\": \"La mod deve essere compilata prima di poter essere visualizzata in anteprima\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identificativo della mod\",\n    \"enableMod\": \"Abilita mod\",\n    \"enableLogging\": \"Abilita la registrazione\",\n    \"notCompiled\": \"La mod deve essere compilata\",\n    \"compile\": \"Compila la mod\",\n    \"compilationFailed\": \"Compilazione fallita\",\n    \"preview\": \"Anteprima della mod\",\n    \"showLogOutput\": \"Mostra output registro\",\n    \"exit\": \"Esci dalla modalità di modifica\",\n    \"exitConfirmation\": \"Le modifiche apportate dall'ultima compilazione andata a buon fine andranno perse\",\n    \"exitButtonOk\": \"Esci\",\n    \"exitButtonCancel\": \"Resta\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ja/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ja/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"読み込み中...\",\n    \"loadingFailed\": \"読み込みに失敗しました。インターネット接続を確認してください。\",\n    \"loadingFailedTitle\": \"読み込みに失敗\",\n    \"loadingFailedSubtitle\": \"インターネット接続を確認してもう一度お試しください。\",\n    \"tryAgain\": \"再試行\",\n    \"updating\": \"更新中...\",\n    \"installing\": \"インストール中...\",\n    \"compiling\": \"コンパイル中...\",\n    \"cut\": \"切り取り\",\n    \"copy\": \"コピー\",\n    \"paste\": \"貼り付け\",\n    \"selectAll\": \"すべて選択\"\n  },\n  \"appHeader\": {\n    \"home\": \"ホーム\",\n    \"explore\": \"探す\",\n    \"settings\": \"設定\",\n    \"about\": \"情報\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"利用可能な更新があります\",\n    \"installed\": \"インストール済み\",\n    \"details\": \"詳細\",\n    \"update\": \"更新\",\n    \"install\": \"インストール\",\n    \"compile\": \"コンパイル\",\n    \"disable\": \"無効化\",\n    \"enable\": \"有効化\",\n    \"edit\": \"編集\",\n    \"fork\": \"フォーク\",\n    \"remove\": \"削除\",\n    \"removeConfirm\": \"この Mod を削除してもよろしいですか?\",\n    \"removeConfirmOk\": \"Mod を削除\",\n    \"removeConfirmCancel\": \"キャンセル\",\n    \"notCompiled\": \"Mod のコンパイルが必要です\",\n    \"editedLocally\": \"Mod はローカルで編集されました\",\n    \"noDescription\": \"(説明はありません)\",\n    \"users_one\": \"{{formattedCount}} 名のユーザー\",\n    \"users_other\": \"{{formattedCount}} 名のユーザー\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"インストール済みのバージョン\",\n      \"latestVersion\": \"最新のバージョン\",\n      \"loading\": \"読み込み中...\",\n      \"loadingFailed\": \"読み込みに失敗しました\",\n      \"modId\": \"Mod の識別子\",\n      \"modVersion\": \"Mod のバージョン\",\n      \"modAuthor\": {\n        \"title\": \"Mod の作者\",\n        \"homepage\": \"ホームページ\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"すべてのプロセス\",\n        \"allBut\": \"{{list}} 以外すべて\",\n        \"except\": \"{{excluded}} を除く {{included}}\",\n        \"tooltip\": {\n          \"targets\": \"ターゲットのプロセス\",\n          \"excluded\": \"除外\"\n        }\n      },\n      \"updateNotNeeded\": \"インストールされているバージョンは最新です。\"\n    },\n    \"details\": {\n      \"title\": \"詳細\",\n      \"noData\": \"Mod の詳細がありません。\"\n    },\n    \"settings\": {\n      \"title\": \"設定\",\n      \"noData\": \"利用可能な Mod の設定はありません。\",\n      \"saveButton\": \"設定を保存\",\n      \"sampleValue\": \"サンプルの値\",\n      \"arrayItemAdd\": \"新規項目を追加\",\n      \"arrayItemRemove\": \"項目を削除\"\n    },\n    \"code\": {\n      \"title\": \"ソースコード\",\n      \"noData\": \"Mod のソースはありません。\",\n      \"collapseExtra\": \"README と設定を折りたたむ\"\n    },\n    \"changelog\": {\n      \"title\": \"更新履歴\",\n      \"loadingFailed\": \"更新履歴の読み込みに失敗しました。GitHub で表示するには、<0>ここをクリック</0>してください。\"\n    },\n    \"advanced\": {\n      \"title\": \"高度\",\n      \"debugLogging\": {\n        \"title\": \"デバッグログ\",\n        \"description\": \"Mod に関する問題のトラブルシューティングに役立ちます。\",\n        \"none\": \"なし\",\n        \"modLogs\": \"Mod のログ\",\n        \"detailedLogs\": \"詳細なデバッグログ\",\n        \"showLogButton\": \"出力されたログを表示\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod の設定\",\n        \"description\": \"Mod の設定を簡単にエクスポートまたは共有できます。\",\n        \"loadButton\": \"読み込み\",\n        \"loadFormattedButton\": \"フォーマットされた物を読み込み\",\n        \"saveButton\": \"保存\",\n        \"invalidData\": \"JSON データが無効です\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"カスタムプロセス対象リスト\",\n        \"descriptionInclusion\": \"Mod がターゲットとする追加の実行ファイルまたは、パスのカスタムリストです。このリストは、どのプロセスをターゲットにするか Mod の作者が定義した対象リスト上に追加されます。各プロセスにおいて実行可能なファイルパスの対象エントリのどれかにマッチし、どの除外リストにもマッチしない場合に Mod が読み込まれます。\",\n        \"titleExclusion\": \"カスタムプロセス除外リスト\",\n        \"descriptionExclusion\": \"Mod がターゲットから除外する実行ファイルまたは、パスのカスタムリストです。このリストは、Mod の作者が定義した除外リスト上に追加されます。各プロセスにおいて実行可能なファイルパスが対象エントリのどれかマッチし、除外エントリにマッチしない場合に Mod が読み込まれます。\",\n        \"processListPlaceholder\": \"プロセス名またはパス (1 行に 1 つずつ)\",\n        \"invalidCharactersWarning\": \"プロセスリストに無効な文字が含まれています。これらは削除されます: {{invalidCharacters}}\",\n        \"saveButton\": \"保存\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Mod の対象リスト、除外リストを無視する\",\n        \"description\": \"Mod の対象リストまたは除外リストを無視し、上記のカスタムリストのみを使用します。\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"重要なシステムプロセスの内包リストパターンを考慮\",\n        \"description\": \"説明: 既定では Windhawk はプロセスのパターンなし (例: <0>*</0> または <0>*.exe</0> ではなく <0>critical.exe</0>) で内包されている場合でのみ、重要なシステムプロセスに Mod を読み込みます。重要なシステムプロセスの詳細については<1>ドキュメント</1>を参照してください。\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"最新バージョンの変更点\",\n      \"noData\": \"インストールされているバージョンは最新です。\",\n      \"splitView\": \"分割で表示\",\n      \"expandLines_one\": \"1 個の隠れた行を展開\",\n      \"expandLines_other\": \"{{count}} 個の隠れた行を展開\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Mod を検索...\"\n  },\n  \"home\": {\n    \"browse\": \"Mod を探す\",\n    \"installedMods\": {\n      \"title\": \"インストール済みの Mod\",\n      \"noMods\": \"Mod はインストールされていません\"\n    },\n    \"featuredMods\": {\n      \"title\": \"注目の Mod\",\n      \"noMods\": \"まだインストールされていない注目の Mod はありません\",\n      \"explore\": \"その他の Mod を探す\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"人気で高評価\",\n      \"popular\": \"人気\",\n      \"topRated\": \"高評価\",\n      \"newest\": \"最新\",\n      \"lastUpdated\": \"最終更新\",\n      \"alphabeticalOrder\": \"アルファベット順\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"言語\",\n      \"description\": \"Windhawk の表示言語を選択してください。\",\n      \"contribute\": \"Windhawk の<0>翻訳に貢献</0>する。\",\n      \"credits\": \"lmncaj と Keita Kunishi と <0>Re*Index.(ot_inc)</0> によって日本語訳されました。\",\n      \"creditsLink\": \"https://reindex-ot.github.io/\"\n    },\n    \"updates\": {\n      \"title\": \"更新を確認\",\n      \"description\": \"Windhawk とインストールされている Mod の新しいバージョンを定期的に確認します。\"\n    },\n    \"devMode\": {\n      \"title\": \"開発者モード\",\n      \"description\": \"Mod の作成や変更などの開発者向けのアクションを表示します。\"\n    },\n    \"advancedSettings\": \"高度な設定\",\n    \"hideTrayIcon\": {\n      \"title\": \"トレイアイコンを隠す\",\n      \"description\": \"Windhawk を終了するには、このオプションを無効化する必要があります。\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Windhawk の実行時に UAC の昇格を要求\",\n      \"description\": \"Windhawk の実行には管理者権限が必要ですが、シングルユーザーコンピューターの環境で毎回 UAC のプロンプトが表示されるのは煩わしいため、Windhawk はこれを回避しています。Windhawk の実行に UAC の昇格を要求させるにはこのオプションを有効化してください。\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"ツールキットダイアログを自動で表示しない\",\n      \"description\": \"既定では、システムが不安定な状態やその他の理由でタスクバーにアクセスできない状態を検出すると、Windhawk は自動的にツールキットダイアログを表示します。ツールキットダイアログは、「Windhawk の終了」「セーフモードの切り替え」「その他の操作」を行なうことができます。ツールキットダイアログは、Ctrl+Win+W のキーボードショートカットでも表示できます。\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod 初期化ダイアログの遅延\",\n      \"description\": \"Mod の初期化でプログレスダイアログを表示するまでの待機時間 (ミリ秒) を設定できます。\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"その他の高度な設定\",\n      \"restartNotice\": \"Windhawk を再起動すると設定が適用されます。\",\n      \"saveButton\": \"保存して Windhawk を再起動\",\n      \"cancelButton\": \"キャンセル\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk ログの冗長性\",\n      \"engineLoggingTitle\": \"Windhawk エンジンのログの冗長性\",\n      \"description\": \"ログはデバッグビューなどのツールで確認することができます。\",\n      \"none\": \"なし\",\n      \"error\": \"エラー\",\n      \"verbose\": \"冗長\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"プロセス除外リスト\",\n      \"descriptionExclusion\": \"Windhawk がインジェクションをしないプロセスとパスのリストです。Windhawk が特定のプログラムと互換性がない場合に役立ちます。このリストにプロセスを追加すると、Windhawk がそのプロセスをカスタマイズしなくなるだけでなくそのプロセスが作成する、子プロセスを Windhawk が傍受できなくなることに注意してください。場合によっては Windhawk の Mod の読み込みに若干の遅延が発生します。\",\n      \"descriptionExclusionWiki\": \"プロセスの除外と内蔵のプロセス除外リストの詳細については、<0>ドキュメント</0>を参照してください。\",\n      \"excludeCriticalProcesses\": \"重要なシステムプロセスを除外\",\n      \"excludeIncompatiblePrograms\": \"互換性のない既知のプログラムを除外\",\n      \"excludeGames\": \"有名なゲームを除外\",\n      \"titleInclusion\": \"プロセス包含リスト\",\n      \"descriptionInclusion\": \"除外リストに含んでいても Windhawk がインジェクションをするプロセス名とパスのリスト\",\n      \"inclusionWithoutExclusionNotice\": \"プロセス除外リストが空の場合、プロセス対象リストには効果がありません。\",\n      \"inclusionWithoutTotalExclusionNotice\": \"これら以外のすべてのプロセスを除外する場合は、プロセス除外リストに｢*(ワイルドカード)｣を設定できます。\",\n      \"processListPlaceholder\": \"プロセス名またはパス (1 行に 1 つずつ):\",\n      \"invalidCharactersWarning\": \"プロセスリストに無効な文字が含まれています。これらは削除されます: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"ベータ版\",\n    \"subtitle\": \"Windows プログラムのカスタマイズマーケットプレイス\",\n    \"credit\": \"作者: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"更新が利用可能です\",\n      \"subtitle\": \"最新の機能を使用、バグの修正を適用するために Windhawk を更新することをご検討ください。\",\n      \"updateButton\": \"その他の詳細\"\n    },\n    \"links\": {\n      \"title\": \"リンク\",\n      \"homepage\": \"ホームページ\",\n      \"documentation\": \"ドキュメント\"\n    },\n    \"builtWith\": {\n      \"title\": \"ビルド\",\n      \"vscodium\": \"Microsoft VSCode エディターのコミュニティ主導型のディストリビューション\",\n      \"llvmMingw\": \"LLVM/Clang/LLD ベースの mingw-w64 ツールチェイン\",\n      \"minHook\": \"Windows 用の最小限 API フッキングライブラリ\",\n      \"others\": \"その他ツールとライブラリ、ビットコード\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} をインストール\",\n    \"warningTitle\": \"ご注意ください\",\n    \"warningDescription\": \"悪意のある Mod はコンピューターに損害を与えたり、プライバシーを侵害する可能性があります。信頼できる作者からの Mod のみをインストールしてください。\",\n    \"modAuthor\": \"Mod の作者\",\n    \"homepage\": \"ホームページ\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"検証済み\",\n    \"verifiedTooltip\": \"このプロファイルが Mod の作者のものであることを確認しましたが、<0>検証済み</0>は、<0>信頼済み</0>と異なることに注意してください。Mod の作者が信頼できることを確認するか、インストールする前にソースコードを慎重に確認してください。\",\n    \"acceptButton\": \"リスクを受け入れてインストール\",\n    \"cancelButton\": \"キャンセル\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"新規 Mod を作成\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Mod の作成と変更には、Windows の C/C++ 開発スキルが必要です。それがよくわからない人は、このオプションは不向きかもしれません。\",\n    \"hideOptionsCheckbox\": \"開発関連のオプションをすべて隠す\",\n    \"hideOptionsButton\": \"オプションを隠す\",\n    \"beginCodingButton\": \"コーディングを開始\",\n    \"cancelButton\": \"キャンセル\"\n  },\n  \"safeMode\": {\n    \"alert\": \"現在の Windhawk はセーフモードで動作しています。コードインジェクション機能はすべて停止しています。\",\n    \"offButton\": \"セーフモードを終了\",\n    \"offConfirm\": \"Windhawk が再起動され、設定が適用されます。\",\n    \"offConfirmOk\": \"Windhawk を再起動\",\n    \"offConfirmCancel\": \"キャンセル\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"アクションはプレビューモードでは使用できません。\",\n    \"notCompiled\": \"Mod はプレビューをする前にコンパイルする必要があります\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod の識別子\",\n    \"enableMod\": \"Mod を有効化\",\n    \"enableLogging\": \"ログの出力を有効化\",\n    \"notCompiled\": \"Mod のコンパイルが必要です\",\n    \"compile\": \"Mod をコンパイル\",\n    \"compilationFailed\": \"コンパイルに失敗しました\",\n    \"preview\": \"Mod をプレビュー\",\n    \"showLogOutput\": \"出力されたログを表示\",\n    \"exit\": \"編集モードを終了\",\n    \"exitConfirmation\": \"最後にコンパイルしてからの変更は失われます\",\n    \"exitButtonOk\": \"終了\",\n    \"exitButtonCancel\": \"キャンセル\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"불러오는 중...\",\n    \"loadingFailed\": \"불러오는 데 실패했습니다, 인터넷 연결을 확인해주세요\",\n    \"loadingFailedTitle\": \"불러오기 실패\",\n    \"loadingFailedSubtitle\": \"인터넷 연결을 확인하고 다시 시도해주세요\",\n    \"tryAgain\": \"다시 시도\",\n    \"updating\": \"업데이트 중...\",\n    \"installing\": \"설치 중...\",\n    \"compiling\": \"컴파일 중...\",\n    \"cut\": \"잘라내기\",\n    \"copy\": \"복사\",\n    \"paste\": \"붙여넣기\",\n    \"selectAll\": \"모두 선택\",\n    \"loggingEnabled\": \"디버그 로깅 활성화됨\"\n  },\n  \"appHeader\": {\n    \"home\": \"홈\",\n    \"explore\": \"탐색\",\n    \"settings\": \"설정\",\n    \"about\": \"정보\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"업데이트 사용 가능\",\n    \"installed\": \"설치됨\",\n    \"details\": \"세부 정보\",\n    \"update\": \"업데이트\",\n    \"downgrade\": \"다운그레이드\",\n    \"install\": \"설치\",\n    \"compile\": \"컴파일\",\n    \"disable\": \"비활성화\",\n    \"enable\": \"활성화\",\n    \"edit\": \"편집\",\n    \"fork\": \"끌어오기(포크)\",\n    \"remove\": \"삭제\",\n    \"removeConfirm\": \"이 모드를 삭제할까요?\",\n    \"removeConfirmOk\": \"모드 삭제\",\n    \"removeConfirmCancel\": \"취소\",\n    \"donate\": \"기부\",\n    \"notCompiled\": \"모드 컴파일이 필요합니다\",\n    \"editedLocally\": \"모드가 로컬에서 편집되었습니다\",\n    \"noDescription\": \"(설명 없음)\",\n    \"users_one\": \"사용자 {{formattedCount}}명\",\n    \"users_other\": \"사용자 {{formattedCount}}명\",\n    \"notRated\": \"이 모드는 아직 평점이 없습니다\",\n    \"loggingEnabledInAdvancedTab\": \"이 모드의 고급 탭에서 디버그 로깅이 활성화됨\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"설치된 버전\",\n      \"latestVersion\": \"최신 버전\",\n      \"loading\": \"불러오는 중...\",\n      \"loadingFailed\": \"불러오기 실패\",\n      \"otherVersions\": \"다른 버전\",\n      \"selectedVersion\": \"선택된 버전: {{version}}\",\n      \"modId\": \"모드 식별자\",\n      \"modVersion\": \"모드 버전\",\n      \"lastUpdated\": \"최근 업데이트됨\",\n      \"modAuthor\": {\n        \"title\": \"모드 작성자\",\n        \"homepage\": \"홈페이지\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"모든 프로세스\",\n        \"allBut\": \"{{list}} 외의 모든 프로세스\",\n        \"except\": \"{{excluded}} 외의 {{included}}\",\n        \"tooltip\": {\n          \"targets\": \"대상 프로세스\",\n          \"excluded\": \"제외 프로세스\"\n        }\n      },\n      \"updateNotNeeded\": \"설치되어 있는 버전이 최신 버전입니다\"\n    },\n    \"version\": {\n      \"preRelease\": \"프리릴리스\",\n      \"select\": \"선택\",\n      \"cancel\": \"취소\",\n      \"chooseVersion\": \"버전을 선택하세요...\"\n    },\n    \"details\": {\n      \"title\": \"세부 정보\",\n      \"noData\": \"모드 세부 정보가 없습니다.\"\n    },\n    \"settings\": {\n      \"title\": \"설정\",\n      \"noData\": \"사용 가능한 모드 설정이 없습니다.\",\n      \"saveButton\": \"설정 저장\",\n      \"sampleValue\": \"샘플 값\",\n      \"arrayItemAdd\": \"새 항목 추가\",\n      \"arrayItemRemove\": \"항목 삭제\",\n      \"yamlMode\": \"텍스트 모드\",\n      \"uiMode\": \"시각 모드\",\n      \"yamlInvalid\": \"올바르지 않은 YAML 형식입니다\",\n      \"yamlParseError\": \"YAML 구문분석 오류: {{error}}\",\n      \"yamlInvalidKey\": \"YAML의 올바르지 않은 키: '{{key}}'(은)는 잘못된 키입니다\",\n      \"yamlTypeMismatch\": \"'{{key}}'의 유형이 일치하지 않음: {{expected}}(이)가 와야 하는데 {{actual}}이(가) 있습니다\",\n      \"unsavedChangesTitle\": \"저장하지 않은 설정\",\n      \"unsavedChangesMessage\": \"저장하지 않은 변경사항이 있습니다. 변경사항을 버리시겠어요?\",\n      \"unsavedChangesLeave\": \"변경사항 버리기\",\n      \"unsavedChangesStay\": \"계속 편집\"\n    },\n    \"code\": {\n      \"title\": \"소스 코드\",\n      \"noData\": \"모드 소스가 없습니다.\",\n      \"collapseExtra\": \"Readme와 설정 펼치기\"\n    },\n    \"changelog\": {\n      \"title\": \"체인지로그\",\n      \"loadingFailed\": \"체인지로그를 불러오는 데 실패했습니다. GitHub에서 보려면 <0>여기를 누르세요</0>.\"\n    },\n    \"advanced\": {\n      \"title\": \"고급\",\n      \"debugLogging\": {\n        \"title\": \"디버그 로깅\",\n        \"description\": \"모드의 문제 해결에 유용할 수 있습니다.\",\n        \"none\": \"없음\",\n        \"modLogs\": \"모드 로그\",\n        \"detailedLogs\": \"자세한 디버그 로그\",\n        \"showLogButton\": \"로그 출력 표시\"\n      },\n      \"modSettings\": {\n        \"title\": \"모드 설정\",\n        \"description\": \"모드 설정을 손쉽게 내보내거나 공유합니다.\",\n        \"loadButton\": \"불러오기\",\n        \"loadFormattedButton\": \"형식 불러오기\",\n        \"saveButton\": \"저장\",\n        \"invalidData\": \"올바르지 않은 JSON 데이터\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"사용자 지정 프로세스 포함 목록\",\n        \"descriptionInclusion\": \"모드가 대상으로 할 추가 실행 파일 이름/경로의 사용자 지정 목록입니다. 이 목록은 모드 작성자가 대상 프로세스를 결정하기 위해 정의한 포함 목록에 추가됩니다. 각 프로세스에 대해 실행 파일 경로가 포함 항목 중 하나와 일치하고 제외 항목과 일치하지 않으면 모드를 불러옵니다.\",\n        \"titleExclusion\": \"사용자 지정 프로세스 제외 목록\",\n        \"descriptionExclusion\": \"모드가 대상에서 제외할 추가 실행 파일 이름/경로의 사용자 지정 목록입니다. 이 목록은 모드 작성자가 대상 프로세스를 결정하기 위해 정의한 제외 목록에 추가됩니다. 각 프로세스에 대해 실행 파일 경로가 포함 항목 중 하나와 일치하고 제외 항목과 일치하지 않으면 모드를 불러옵니다.\",\n        \"processListPlaceholder\": \"한 줄당 프로세스 이름/경로 1개, 예:\",\n        \"invalidCharactersWarning\": \"프로세스 목록에 올바르지 않은 글자가 들어 있습니다. 제거된 글자: {{invalidCharacters}}\",\n        \"saveButton\": \"저장\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"모드 포함/제외 무시 목록\",\n        \"description\": \"모드의 프로세스 포함/제외 목록을 무시하고 상기의 사용자 지정 목록만을 사용합니다.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"중대한 시스템 프로세스를 목록에 포함하기 위해 패턴(와일드카드) 고려\",\n        \"description\": \"기본값으로 Windhawk는 프로세스가 패턴(와일드카드)으로 포함될 경우(예: <0>*</0> 또는 <0>*.exe</0>)에는 모드를 중대한 시스템 프로세스 내에서는 불러오지 않습니다. (허용하는 예: <0>critical.exe</0>) 중대한 시스템 프로세스에 대한 자세한 정보는 <1>문서</1>를 참조해주세요.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"소스 코드 변경사항\",\n      \"noData\": \"이 버전이 최신 버전입니다.\",\n      \"splitView\": \"분할 보기\",\n      \"expandLines_one\": \"숨겨진 줄 1개 확장\",\n      \"expandLines_other\": \"숨겨진 줄 {{count}}개 확장\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"모드 검색...\",\n    \"noResults\": \"현재 필터와 일치하는 모드가 없습니다\"\n  },\n  \"home\": {\n    \"browse\": \"모드 탐색\",\n    \"filter\": {\n      \"enabled\": \"활성화된 모드\",\n      \"disabled\": \"비활성화된 모드\",\n      \"updateAvailable\": \"업데이트 사용 가능한 모드\",\n      \"clearFilters\": \"필터 지우기\"\n    },\n    \"installedMods\": {\n      \"title\": \"설치된 모드\",\n      \"noMods\": \"설치된 모드가 없습니다\",\n      \"grid\": {\n        \"name\": \"이름\",\n        \"description\": \"설명\",\n        \"author\": \"작성자\",\n        \"version\": \"버전\",\n        \"status\": \"상태\"\n      }\n    },\n    \"featuredMods\": {\n      \"title\": \"추천 모드\",\n      \"noMods\": \"설치한 적 없는 추천 모드가 아직 없습니다\",\n      \"explore\": \"다른 모드 탐색\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"인기와 평점\",\n      \"popular\": \"인기\",\n      \"topRated\": \"평점\",\n      \"newest\": \"최신\",\n      \"lastUpdated\": \"최근 업데이트\",\n      \"alphabeticalOrder\": \"알파벳순\"\n    },\n    \"filter\": {\n      \"installationStatus\": \"설치 상태\",\n      \"installed\": \"설치됨\",\n      \"notInstalled\": \"설치 안 됨\",\n      \"author\": \"모드 작성자\",\n      \"process\": \"대상 프로세스\",\n      \"showMore\": \"더 보기...\",\n      \"clearFilters\": \"필터 지우기\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"언어\",\n      \"description\": \"Windhawk의 기본 표시 언어를 선택하세요.\",\n      \"contribute\": \"<0>새 번역 기여하기</0>.\",\n      \"credits\": \"한국어 번역 by <0>근육질푸키</0>.\",\n      \"creditsLink\": \"mailto:muscularpuky@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"업데이트 확인\",\n      \"description\": \"Windhawk와 설치된 모드의 새로운 버전을 자동으로 확인하고 알립니다.\"\n    },\n    \"devMode\": {\n      \"title\": \"개발자 모드\",\n      \"description\": \"모드 만들기와 수정하기와 같은 개발자들을 위한 기능을 표시합니다.\"\n    },\n    \"advancedSettings\": \"고급 설정\",\n    \"hideTrayIcon\": {\n      \"title\": \"트레이 아이콘 숨기기\",\n      \"description\": \"이 옵션을 비활성화하려면 Windhawk를 종료해야 합니다.\"\n    },\n    \"alwaysCompileModsLocally\": {\n      \"title\": \"항상 모드를 로컬에서 컴파일\",\n      \"description\": \"기본값으로는 Windhawk가 사용 가능할 때 미리 컴파일된 모드 바이너리를 Windhawk 서버에서 다운로드합니다. 이 옵션을 활성화하면 그러는 대신 항상 모드를 로컬에서 컴파일합니다.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Windhawk를 실행하려면 UAC 권한 상승 필요\",\n      \"description\": \"Windhawk가 관리자 권한을 요구하지만 단일 사용자 컴퓨터에서는 매번 UAC 프롬프트가 표시되어 성가실 수 있습니다. 그래서 Windhawk는 이것을 우회합니다. 이 옵션을 활성화하면 Windhawk를 실행하는 데 UAC 권한 상승을 요구하게 됩니다.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"툴킷 대화 상자 자동으로 표시 안 함\",\n      \"description\": \"기본값으로는 시스템 불안정 또는 다른 이유로 인해 작업 표시줄에 액세스할 수 없음을 감지했을 때 Windhawk가 자동으로 툴킷 대화 상자를 표시합니다. 툴킷 대화 상자는 Windhawk를 종료하고, 안전 모드로 전환하고, 기타 작업을 수행할 수 있도록 합니다. Win+Ctrl+W 키보드 단축키로 툴킷 대화 상자를 표시할 수도 있습니다.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"모드 초기화 대화 상자 지연 시간\",\n      \"description\": \"모드 초기화를 위한 진행률 대화 상자를 표시하기 전에 기다릴 시간(밀리초)입니다.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"더 많은 설정\",\n      \"restartNotice\": \"이 설정을 적용하면 Windhawk가 다시 시작됩니다.\",\n      \"saveButton\": \"저장하고 Windhawk 다시 시작\",\n      \"cancelButton\": \"취소\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk 로깅 수준\",\n      \"engineLoggingTitle\": \"Windhawk 엔진 로깅 수준\",\n      \"description\": \"로그는 DebugView 같은 도구로 볼 수 있습니다.\",\n      \"none\": \"없음\",\n      \"error\": \"오류\",\n      \"verbose\": \"자세히\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"프로세스 제외 목록\",\n      \"descriptionExclusion\": \"Windhawk가 인젝션하지 않는 프로세스 이름/경로 목록입니다. Windhawk가 특정 프로그램과 호환되지 않는 경우에 유용할 수 있습니다. 이 목록에 프로세스를 추가하면 Windhawk가 해당 프로세스를 사용자 정의하지 못할 뿐만 아니라 Windhawk가 이 프로세스가 생성하는 자식 프로세스를 가로채는 것도 방지됩니다. 이렇게 하면 Windhawk가 모드를 불러오는 데 약간의 지연이 생깁니다.\",\n      \"descriptionExclusionWiki\": \"프로세스 제외 및 내장된 프로세스 제외 목록에 대한 자세한 내용은 <0>문서</0>를 참조해주세요.\",\n      \"excludeCriticalProcesses\": \"중대한 시스템 프로세스 제외\",\n      \"excludeIncompatiblePrograms\": \"호환되지 않는다고 알려진 프로그램 제외\",\n      \"excludeGames\": \"익히 알려진 게임 제외\",\n      \"titleInclusion\": \"프로세스 포함 목록\",\n      \"descriptionInclusion\": \"제외 목록에 있어도 Windhawk가 인젝션할 프로세스 이름/경로 목록입니다.\",\n      \"inclusionWithoutExclusionNotice\": \"프로세스 포함 목록은 빈 프로세스 제외 목록에 영향을 주지 않습니다.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"여기의 프로세스들 이외의 모든 프로세스를 제외하려면 프로세스 제외 목록에 \\\"*\\\"를 설정할 수 있습니다.\",\n      \"processListPlaceholder\": \"1줄당 프로세스 이름/경로 1개, 예:\",\n      \"invalidCharactersWarning\": \"프로세스 목록에 올바르지 않은 글자가 들어 있습니다. 제거된 글자: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"베타\",\n    \"subtitle\": \"Windows 프로그램용 사용자 정의 마켓플레이스\",\n    \"credit\": \"By <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"업데이트를 사용할 수 있음\",\n      \"subtitle\": \"최신 기능 및 버그 수정을 받으려면 Windhawk를 업데이트하세요.\",\n      \"changelogButton\": \"체인지로그\",\n      \"updateButton\": \"업데이트\",\n      \"modal\": {\n        \"title\": \"Windhawk 업데이트 중\",\n        \"downloading\": \"업데이트 다운로드 중...\",\n        \"installing\": \"업데이트 설치 중...\",\n        \"installingNote\": \"설치가 완료되면 Windhawk가 자동으로 다시 시작됩니다.\",\n        \"failed\": \"업데이트 실패\",\n        \"cancel\": \"취소\"\n      }\n    },\n    \"changelog\": {\n      \"title\": \"Windhawk의 새로운 기능\",\n      \"close\": \"닫기\"\n    },\n    \"links\": {\n      \"title\": \"링크\",\n      \"homepage\": \"홈페이지\",\n      \"documentation\": \"문서\"\n    },\n    \"builtWith\": {\n      \"title\": \"다음으로 개발됨\",\n      \"vscodium\": \"Microsoft의 VSCode 편집기의 커뮤니티 기반 배포\",\n      \"llvmMingw\": \"LLVM/Clang/LLD 기반 mingw-w64 툴체인\",\n      \"minHook\": \"Windows용 최소한의 API 후킹 라이브러리\",\n      \"others\": \"기타 툴과 라이브러리, 그리고 약간의 코드\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} 설치\",\n    \"warningTitle\": \"신중히 진행하세요\",\n    \"warningDescription\": \"악성 모드는 컴퓨터를 손상시키거나 개인 정보를 침해할 수 있습니다. 신뢰할 수 있는 작성자의 모드만 설치하세요.\",\n    \"modAuthor\": \"모드 작성자\",\n    \"homepage\": \"홈페이지\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"인증됨\",\n    \"verifiedTooltip\": \"이 프로필이 모드 작성자의 것임을 확인했지만 <0>인증됨</0>은 <0>신뢰할 수 있음</0>과 다릅니다. 모드 작성자를 신뢰하는지 확인하거나 설치하기 전에 소스 코드를 신중히 검사하세요.\",\n    \"acceptButton\": \"위험을 감수하고 설치\",\n    \"cancelButton\": \"취소\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"새 모드 만들기\"\n  },\n  \"devModeAction\": {\n    \"message\": \"모드를 만들고 수정하려면 약간의 Windows용 C/C++ 개발 지식이 필요합니다. 무슨 뜻인지 모르겠다면 이러한 옵션들은 맞지 않을지도 모릅니다.\",\n    \"hideOptionsCheckbox\": \"모든 개발 관련 옵션 숨기기\",\n    \"hideOptionsButton\": \"옵션 숨기기\",\n    \"beginCodingButton\": \"코딩 시작\",\n    \"cancelButton\": \"취소\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk가 안전 모드로 실행 중입니다. 모든 코드 인젝션 기능이 꺼졌습니다.\",\n    \"offButton\": \"안전 모드 끄기\",\n    \"offConfirm\": \"이 설정을 적용하기 위해 Windhawk가 다시 시작됩니다.\",\n    \"offConfirmOk\": \"Windhawk 다시 시작\",\n    \"offConfirmCancel\": \"취소\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"미리 보기 모드에서는 사용할 수 없는 작업입니다.\",\n    \"notCompiled\": \"모드를 미리 보려면 컴파일해야 합니다.\"\n  },\n  \"sidebar\": {\n    \"modId\": \"모드 식별자\",\n    \"enableMod\": \"모드 활성화\",\n    \"enableLogging\": \"로깅 활성화\",\n    \"notCompiled\": \"모드를 컴파일해야 합니다\",\n    \"compile\": \"모드 컴파일\",\n    \"compilationFailed\": \"컴파일 실패\",\n    \"stopCompilation\": \"컴파일 중지\",\n    \"preview\": \"모드 미리 보기\",\n    \"showLogOutput\": \"로그 출력 표시\",\n    \"exit\": \"편집 모드 나가기\",\n    \"exitConfirmation\": \"마지막 컴파일 성공 후의 변경이 사라집니다\",\n    \"exitButtonOk\": \"나가기\",\n    \"exitButtonCancel\": \"남아 있기\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/nl/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/nl/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Bezig met laden…\",\n    \"loadingFailed\": \"Laden mislukt, controleer je internetverbinding\",\n    \"loadingFailedTitle\": \"Laden mislukt\",\n    \"loadingFailedSubtitle\": \"Controleer je internetverbinding en probeer het opnieuw\",\n    \"tryAgain\": \"Opnieuw proberen\",\n    \"updating\": \"Bezig met updaten…\",\n    \"installing\": \"Bezig met installeren…\",\n    \"compiling\": \"Bezig met compileren…\",\n    \"cut\": \"Knippen\",\n    \"copy\": \"Kopiëren\",\n    \"paste\": \"Plakken\",\n    \"selectAll\": \"Alles selecteren\"\n  },\n  \"appHeader\": {\n    \"home\": \"Start\",\n    \"explore\": \"Verkennen\",\n    \"settings\": \"Instellingen\",\n    \"about\": \"Over\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Update beschikbaar\",\n    \"installed\": \"Geïnstalleerd\",\n    \"details\": \"Details\",\n    \"update\": \"Updaten\",\n    \"install\": \"Installeren\",\n    \"compile\": \"Compileren\",\n    \"disable\": \"Uitschakelen\",\n    \"enable\": \"Inschakelen\",\n    \"edit\": \"Bewerken\",\n    \"fork\": \"Forken\",\n    \"remove\": \"Verwijderen\",\n    \"removeConfirm\": \"Weet je zeker dat je deze mod wilt verwijderen?\",\n    \"removeConfirmOk\": \"Mod verwijderen\",\n    \"removeConfirmCancel\": \"Annuleren\",\n    \"notCompiled\": \"Mod moet worden gecompileerd\",\n    \"editedLocally\": \"Mod is lokaal bewerkt\",\n    \"noDescription\": \"(geen beschrijving)\",\n    \"users_one\": \"{{formattedCount}} gebruiker\",\n    \"users_other\": \"{{formattedCount}} gebruikers\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Geïnstalleerde versie\",\n      \"latestVersion\": \"Nieuwste versie\",\n      \"loading\": \"bezig met laden…\",\n      \"loadingFailed\": \"Laden mislukt\",\n      \"modId\": \"Mod-identificator\",\n      \"modVersion\": \"Mod-versie\",\n      \"modAuthor\": {\n        \"title\": \"Mod-auteur\",\n        \"homepage\": \"Homepage\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Alle processen\",\n        \"allBut\": \"Alle, behalve {{list}}\",\n        \"except\": \"{{included}} behalve {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Doelprocessen\",\n          \"excluded\": \"Uitgesloten\"\n        }\n      },\n      \"updateNotNeeded\": \"Geïnstalleerde versie is identiek aan de nieuwste versie\"\n    },\n    \"details\": {\n      \"title\": \"Details\",\n      \"noData\": \"Details van mod ontbreken.\"\n    },\n    \"settings\": {\n      \"title\": \"Instellingen\",\n      \"noData\": \"Er zijn geen mod-instellingen beschikbaar.\",\n      \"saveButton\": \"Instellingen opslaan\",\n      \"sampleValue\": \"Voorbeeldwaarde\",\n      \"arrayItemAdd\": \"Nieuw item toevoegen\",\n      \"arrayItemRemove\": \"Item verwijderen\"\n    },\n    \"code\": {\n      \"title\": \"Broncode\",\n      \"noData\": \"Bron van mod ontbreekt.\",\n      \"collapseExtra\": \"Leesmij en instellingen samenvouwen\"\n    },\n    \"changelog\": {\n      \"title\": \"Wijzigingslog\",\n      \"loadingFailed\": \"Wijzigingslog laden mislukt. <0>Klik hier</0> om het op GitHub te bekijken.\"\n    },\n    \"advanced\": {\n      \"title\": \"Geavanceerd\",\n      \"debugLogging\": {\n        \"title\": \"Debug loggen\",\n        \"description\": \"Kan nuttig zijn voor het oplossen van problemen met de mod.\",\n        \"none\": \"Geen\",\n        \"modLogs\": \"Mod-logs\",\n        \"detailedLogs\": \"Gedetailleerde debug logs\",\n        \"showLogButton\": \"Loguitvoer weergeven\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod-instellingen\",\n        \"description\": \"Eenvoudig je mod-instellingen exporteren of delen.\",\n        \"loadButton\": \"Laden\",\n        \"loadFormattedButton\": \"Opgemaakt laden\",\n        \"saveButton\": \"Opslaan\",\n        \"invalidData\": \"Ongeldige JSON-gegevens\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Aangepaste proces-opnamelijst\",\n        \"descriptionInclusion\": \"Een aangepaste lijst met extra uitvoerbare bestandsnamen/-paden die de mod zal targeten. De lijst wordt toegevoegd aan de opnamelijst die de auteur van de mod heeft gedefinieerd om te bepalen welke processen moeten worden getarget. Voor elk proces wordt de mod geladen als het pad van het uitvoerbare bestand overeenkomt met een van de opnamevermeldingen en niet overeenkomt met een uitsluitingsvermelding.\",\n        \"titleExclusion\": \"Aangepaste proces-uitsluitingslijst\",\n        \"descriptionExclusion\": \"Een aangepaste lijst met extra uitvoerbare bestandsnamen/-paden die de mod zal uitsluiten van targeten. De lijst wordt toegevoegd aan de uitsluitingslijst die de auteur van de mod heeft gedefinieerd om te bepalen welke processen moeten worden getarget. Voor elk proces wordt de mod geladen als het pad van het uitvoerbare bestand overeenkomt met een van de opnamevermeldingen en niet overeenkomt met een uitsluitingsvermelding.\",\n        \"processListPlaceholder\": \"Procesnamen/-paden, één per regel, bijvoorbeeld:\",\n        \"invalidCharactersWarning\": \"De proceslijst bevat ongeldige tekens die zullen worden verwijderd: {{invalidCharacters}}\",\n        \"saveButton\": \"Opslaan\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Mod opname-/uitsluitingslijsten negeren\",\n        \"description\": \"Negeer de opname- en uitsluitingslijsten van de mod en gebruik alleen de aangepaste lijsten hierboven.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Overweeg opnamelijst-patronen voor kritieke systeemprocessen\",\n        \"description\": \"Standaard laadt Windhawk alleen mods in kritieke systeemprocessen als het proces zonder patronen is opgenomen, bijv. <0>critical.exe</0>, niet <0>*</0> of <0>*.exe</0>. Raadpleeg <1>de documentatie</1> voor meer informatie over kritieke systeemprocessen.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Wijzigingen laatste versie\",\n      \"noData\": \"Geïnstalleerde versie is identiek aan de nieuwste versie.\",\n      \"splitView\": \"Gesplitste weergave\",\n      \"expandLines_one\": \"Eén verborgen regel uitvouwen\",\n      \"expandLines_other\": \"{{count}} verborgen regels uitvouwen\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Naar mods zoeken…\"\n  },\n  \"home\": {\n    \"browse\": \"Zoeken naar mods\",\n    \"installedMods\": {\n      \"title\": \"Geïnstalleerde mods\",\n      \"noMods\": \"Er zijn geen mods geïnstalleerd\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Aanbevolen mods\",\n      \"noMods\": \"Er zijn geen mods die nog niet geïnstalleerd zijn.\",\n      \"explore\": \"Adere mods verkennen\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populair en best beoordeeld\",\n      \"popular\": \"Populair\",\n      \"topRated\": \"Best beoordeeld\",\n      \"newest\": \"Nieuwste\",\n      \"lastUpdated\": \"Laatst bijgewerkt\",\n      \"alphabeticalOrder\": \"Alfabetische volgorde\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Taal\",\n      \"description\": \"Selecteer de gewenste weergavetaal voor Windhawk.\",\n      \"contribute\": \"<0>Een nieuwe vertaling toevoegen</0>.\",\n      \"credits\": \"Nederlandse vertaling door <0>Toine Rademacher (toineenzo)</0>.\",\n      \"creditsLink\": \"https://toine.zip\"\n    },\n    \"updates\": {\n      \"title\": \"Controleren op updates\",\n      \"description\": \"Controleer regelmatig op nieuwe versies van Windhawk en van de geïnstalleerde mods.\"\n    },\n    \"devMode\": {\n      \"title\": \"Ontwikkelaarsmodus\",\n      \"description\": \"Acties weergeven voor ontwikkelaars, zoals het maken en wijzigen van mods.\"\n    },\n    \"advancedSettings\": \"Geavanceerde instellingen\",\n    \"hideTrayIcon\": {\n      \"title\": \"Systeemvakpictogram verbergen\",\n      \"description\": \"Je moet deze optie uitschakelen om Windhawk af te sluiten.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"UAC-verhoging vereisen voor het uitvoeren van Windhawk\",\n      \"description\": \"Windhawk vereist beheerdersrechten, maar voor een computer met één gebruiker kan het vervelend zijn om elke keer de UAC-melding te krijgen, dus omzeilt Windhawk deze. Schakel deze optie in om UAC-verhoging te vereisen voor het uitvoeren van Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Toolkit-melding niet automatisch weergeven\",\n      \"description\": \"Standaard geeft Windhawk automatisch het toolkit meldingvenster weer wanneer het detecteert dat de taakbalk niet toegankelijk is, door systeeminstabiliteit of om een andere reden. Met het toolkit meldingvenster kun je Windhawk afsluiten, overschakelen naar de veilige modus en andere bewerkingen uitvoeren. Het toolkit meldingvenster kan ook worden weergegeven met de Ctrl+Win+W sneltoets.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod-initialisatie meldingvertraging\",\n      \"description\": \"Aantal milliseconden dat moet worden gewacht voordat het voortgangsvenster voor mod-initialisatie wordt weergegeven.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Meer geavanceerde instellingen\",\n      \"restartNotice\": \"Windhawk wordt opnieuw opgestart om de instellingen toe te passen.\",\n      \"saveButton\": \"Windhawk opslaan en opnieuw opstarten\",\n      \"cancelButton\": \"Annuleren\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk logging verbosity\",\n      \"engineLoggingTitle\": \"Windhawk engine logging verbosity\",\n      \"description\": \"Logs kunnen worden bekeken met een hulpprogramma zoals DebugView.\",\n      \"none\": \"Geen\",\n      \"error\": \"Fout\",\n      \"verbose\": \"Gedetailleerd\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Uitsluitingslijst verwerken\",\n      \"descriptionExclusion\": \"Een lijst met procesnamen/-paden waarin Windhawk niet zal injecteren. Kan handig zijn voor gevallen waarin Windhawk niet compatibel is met een specifiek programma. Let er op dat het toevoegen van een proces aan deze lijst niet alleen voorkomt dat Windhawk het aanpast, maar ook voorkomt dat Windhawk subprocessen onderschept die dit proces aanmaakt. Hierdoor zal Windhawk in zulke gevallen mods met een kleine vertraging laden.\",\n      \"descriptionExclusionWiki\": \"Raadpleeg <0>de documentatie</0> voor meer informatie over het uitsluiten van processen en over de ingebouwde lijsten met uitgesloten processen.\",\n      \"excludeCriticalProcesses\": \"Kritieke systeemprocessen uitsluiten\",\n      \"excludeIncompatiblePrograms\": \"Bekende incompatibele programma's uitsluiten\",\n      \"excludeGames\": \"Bekende spellen uitsluiten\",\n      \"titleInclusion\": \"Proces-opnamelijst\",\n      \"descriptionInclusion\": \"Een lijst met procesnamen/-paden waarin Windhawk zal injecteren, zelfs als ze in de uitsluitingslijst staan.\",\n      \"inclusionWithoutExclusionNotice\": \"Proces-opnameijst heeft geen effect met een lege proces-uitsluitingslijst.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Als je alle processen wilt uitsluiten behalve deze, kun je \\\"*\\\" in de proces-uitsluitingslijst zetten.\",\n      \"processListPlaceholder\": \"Procesnamen/-paden, één per regel, bijvoorbeeld:\",\n      \"invalidCharactersWarning\": \"De proceslijst bevat ongeldige tekens die zullen worden verwijderd: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"bèta\",\n    \"subtitle\": \"De personalisatie marktplaats voor Windows programma's\",\n    \"credit\": \"Door <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Er is een update beschikbaar\",\n      \"subtitle\": \"Overweeg om Windhawk bij te werken voor de nieuwste functies en bugfixes\",\n      \"updateButton\": \"Meer informatie\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Homepage\",\n      \"documentation\": \"Documentatie\"\n    },\n    \"builtWith\": {\n      \"title\": \"Gebouwd met\",\n      \"vscodium\": \"Een gemeenschapsgestuurde distributie van Microsoft's VSCode-editor\",\n      \"llvmMingw\": \"Een op LLVM/Clang/LLD gebaseerde mingw-w64 toolchain\",\n      \"minHook\": \"De minimalistische API-hook bibliotheek voor Windows\",\n      \"others\": \"Andere gereedschappen en bibliotheken, en een beetje code\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} installeren\",\n    \"warningTitle\": \"Ga voorzichtig te werk\",\n    \"warningDescription\": \"Kwaadaardige mods kunnen je computer beschadigen of je privacy schenden. Installeer alleen mods van auteurs die je vertrouwt.\",\n    \"modAuthor\": \"Mod-auteur\",\n    \"homepage\": \"Homepage\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"geverifieerd\",\n    \"verifiedTooltip\": \"We hebben geverifieerd dat dit profiel toebehoort aan de auteur van de mod, maar <0>geverifieerd</0> is niet hetzelfde als <0>vertrouwd</0>. Zorg ervoor dat je de auteur van de mod vertrouwt of inspecteer de broncode zorgvuldig voordat je installeert.\",\n    \"acceptButton\": \"Risico accepteren en installeren\",\n    \"cancelButton\": \"Annuleren\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Een nieuwe mod maken\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Het maken en aanpassen van mods vereist enige kennis van C/C++ ontwikkeling voor Windows. Als je niet zeker weet wat dat betekent, zijn deze opties misschien niets voor jou.\",\n    \"hideOptionsCheckbox\": \"Alle ontwikkelingsgerelateerde opties verbergen\",\n    \"hideOptionsButton\": \"Opties verbergen\",\n    \"beginCodingButton\": \"Begin met coderen\",\n    \"cancelButton\": \"Annuleren\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk draait in veilige modus, alle functionaliteit voor code-injectie is uitgeschakeld.\",\n    \"offButton\": \"Veilige modus uitschakelen\",\n    \"offConfirm\": \"Windhawk wordt opnieuw gestart om de instellingen toe te passen.\",\n    \"offConfirmOk\": \"Windhawk opnieuw opstarten\",\n    \"offConfirmCancel\": \"Annuleren\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Actie is niet beschikbaar in voorvertoningsmodus\",\n    \"notCompiled\": \"Mod moet worden gecompileerd voordat deze kan worden bekeken\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod-identificator\",\n    \"enableMod\": \"Mod inschakelen\",\n    \"enableLogging\": \"Loggen inschakelen\",\n    \"notCompiled\": \"Mod moet worden gecompileerd\",\n    \"compile\": \"Mod compileren\",\n    \"compilationFailed\": \"Compileren mislukt\",\n    \"preview\": \"Mod voorvertonen\",\n    \"showLogOutput\": \"Loguitvoer weergeven\",\n    \"exit\": \"Bewerkingsmodus afsluiten\",\n    \"exitConfirmation\": \"Veranderingen sinds de laatste succesvolle compilering gaan verloren\",\n    \"exitButtonOk\": \"Afsluiten\",\n    \"exitButtonCancel\": \"Blijven\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Ładowanie...\",\n    \"loadingFailed\": \"Ładowanie zakończyło się niepowodzeniem, sprawdź swoje połączenie internetowe\",\n    \"loadingFailedTitle\": \"Ładowanie zakończyło się niepowodzeniem\",\n    \"loadingFailedSubtitle\": \"Sprawdź swoje połączenie internetowe i spróbuj ponownie\",\n    \"tryAgain\": \"Spróbuj ponownie\",\n    \"updating\": \"Aktualizowanie...\",\n    \"installing\": \"Instalowanie...\",\n    \"compiling\": \"Kompilowanie...\",\n    \"cut\": \"Wytnij\",\n    \"copy\": \"Kopiuj\",\n    \"paste\": \"Wklej\",\n    \"selectAll\": \"Zaznacz Wszystko\"\n  },\n  \"appHeader\": {\n    \"home\": \"Strona główna\",\n    \"explore\": \"Eksploruj\",\n    \"settings\": \"Ustawienia\",\n    \"about\": \"O aplikacji\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Aktualizacja dostępna\",\n    \"installed\": \"Zainstalowane\",\n    \"details\": \"Informacje\",\n    \"update\": \"Zaktualizuj\",\n    \"install\": \"Zainstaluj\",\n    \"compile\": \"Kompiluj\",\n    \"disable\": \"Deaktywuj\",\n    \"enable\": \"Aktywuj\",\n    \"edit\": \"Edytuj\",\n    \"fork\": \"Forkuj\",\n    \"remove\": \"Usuń\",\n    \"removeConfirm\": \"Czy jesteś pewny że chcesz usunąć tego moda?\",\n    \"removeConfirmOk\": \"Usuń moda\",\n    \"removeConfirmCancel\": \"Anuluj\",\n    \"notCompiled\": \"Mod musi być skompilowany\",\n    \"editedLocally\": \"Mod był edytowany lokalnie\",\n    \"noDescription\": \"(brak opisu)\",\n    \"users_one\": \"{{formattedCount}} użytkownik\",\n    \"users_few\": \"{{formattedCount}} użytkownicy\",\n    \"users_many\": \"{{formattedCount}} użytkowników\",\n    \"users_other\": \"{{formattedCount}} użytkowników\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Zainstalowana wersja\",\n      \"latestVersion\": \"Najnowsza wersja\",\n      \"loading\": \"Ładowanie...\",\n      \"loadingFailed\": \"Ładowanie zakończone niepowodzeniem\",\n      \"modId\": \"Identyfikacja moda\",\n      \"modVersion\": \"Wersja moda\",\n      \"modAuthor\": {\n        \"title\": \"Autor moda\",\n        \"homepage\": \"Strona główna\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Wszystkie procesy\",\n        \"allBut\": \"Wszystkie ale {{list}}\",\n        \"except\": \"{{included}} oprócz {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Procesy docelowe\",\n          \"excluded\": \"Wyjątki\"\n        }\n      },\n      \"updateNotNeeded\": \"Zainstalowana wersja jest identyczna z najnowszą wersją\"\n    },\n    \"details\": {\n      \"title\": \"Informacje\",\n      \"noData\": \"Informacje o modzie są niedostępne.\"\n    },\n    \"settings\": {\n      \"title\": \"Ustawienia\",\n      \"noData\": \"Brak dostępnych ustawień moda.\",\n      \"saveButton\": \"Zapisz Ustawienia\",\n      \"sampleValue\": \"Przykładowa Wartość\",\n      \"arrayItemAdd\": \"Dodaj element\",\n      \"arrayItemRemove\": \"Usuń element\"\n    },\n    \"code\": {\n      \"title\": \"Kod źródłowy\",\n      \"noData\": \"Kod źródłowy moda jest niedostępny.\",\n      \"collapseExtra\": \"Zwiń ustawienia i Readme\"\n    },\n    \"changelog\": {\n      \"title\": \"Dziennik zmian\",\n      \"loadingFailed\": \"Ładowanie dziennika zmian zakończone niepowodzeniem. <0>Kliknij tutaj</0> aby zobaczyć na GitHubie.\"\n    },\n    \"advanced\": {\n      \"title\": \"Zaawansowane\",\n      \"debugLogging\": {\n        \"title\": \"Logi debugowania\",\n        \"description\": \"Przydatne do rozwiązywania problemów z modami.\",\n        \"none\": \"Nic\",\n        \"modLogs\": \"Logi moda\",\n        \"detailedLogs\": \"Szczegółowe logi debugowania\",\n        \"showLogButton\": \"Pokaż wyjście logów\"\n      },\n      \"modSettings\": {\n        \"title\": \"Ustawienia moda\",\n        \"description\": \"Łatwo wyeksportuj i udostępnij ustawienia moda\",\n        \"loadButton\": \"Wczytaj\",\n        \"loadFormattedButton\": \"Wczytaj sformatowane\",\n        \"saveButton\": \"Zapisz\",\n        \"invalidData\": \"Niepoprawne informacje JSON\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Niestandardowa lista uwzględniania procesów\",\n        \"descriptionInclusion\": \"Niestandardowa lista dodatkowych nazw/ścieżek plików wykonywalnych, na które mod będzie ukierunkowany. Lista ta jest dodawana do listy dołączania zdefiniowanej przez autora moda w celu określenia, które procesy mają być celem. Dla każdego procesu mod jest ładowany, jeśli ścieżka pliku wykonywalnego pasuje do jednego z wpisów włączenia i nie pasuje do żadnego wpisu wyłączenia.\",\n        \"titleExclusion\": \"Niestandardowa lista wykluczonych procesów\",\n        \"descriptionExclusion\": \"Niestandardowa lista dodatkowych nazw/ścieżek plików wykonywalnych, które mod wykluczy z namierzania. Lista ta jest dodawana do listy wykluczeń zdefiniowanej przez autora moda w celu określenia, które procesy mają być docelowe. Dla każdego procesu mod jest ładowany, jeśli ścieżka pliku wykonywalnego pasuje do jednego z wpisów włączenia i nie pasuje do żadnego wpisu wyłączenia.\",\n        \"processListPlaceholder\": \"Nazwy/ścieżki procesów, po jednej w wierszu, na przykład:\",\n        \"saveButton\": \"Zapisz\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignoruj listy włączeń/wykluczeń modów\",\n        \"description\": \"Używaj powyższych list włączeń/wykluczeń zamiast list ustawionych przez mody.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Zmiany w Najnowszej Wersji\",\n      \"noData\": \"Zainstalowana wersja jest identyczna z najnowszą wersją\",\n      \"splitView\": \"Widok podzielony\",\n      \"expandLines_one\": \"Rozwiń jedną ukrytą linię\",\n      \"expandLines_few\": \"Rozwiń {{count}} ukryte linie\",\n      \"expandLines_many\": \"Rozwiń {{count}} ukrytych linii\",\n      \"expandLines_other\": \"Rozwiń {{count}} ukrytych linii\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Szukaj modów..\"\n  },\n  \"home\": {\n    \"browse\": \"Przeglądaj w poszukiwaniu modów\",\n    \"installedMods\": {\n      \"title\": \"Zainstalowane mody\",\n      \"noMods\": \"Nie zainstalowano żadnych modów\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Wyróżnione mody\",\n      \"noMods\": \"Nie ma żadnych polecanych modów, które nie zostały jeszcze zainstalowane\",\n      \"explore\": \"Eksploruj inne mody\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popularne i najbardziej ocenianie\",\n      \"popular\": \"Popularne\",\n      \"topRated\": \"Najbardziej oceniane\",\n      \"newest\": \"Najnowsze\",\n      \"lastUpdated\": \"Ostatnio aktualizowane\",\n      \"alphabeticalOrder\": \"Kolejność alfabetyczna\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Język\",\n      \"description\": \"Wybierz preferowany język wyświetlania dla aplikacji Windhawk.\",\n      \"contribute\": \"<0>Współtwórz nowe tłumaczenie</0>.\",\n      \"credits\": \"Polskie tłumaczenie stworzył <0>Inkatail</0> oraz CyprinusCarpio (https://github.com/CyprinusCarpio), a funn-hue poprawił.\",\n      \"creditsLink\": \"https://github.com/Inkatail\"\n    },\n    \"updates\": {\n      \"title\": \"Sprawdź aktualizacje\",\n      \"description\": \"Okresowo sprawdzaj dostępność nowych wersji Windhawk i zainstalowanych modów.\"\n    },\n    \"devMode\": {\n      \"title\": \"Tryb dewelopera\",\n      \"description\": \"Pokaż akcje dla deweloperów, takie jak tworzenie i modyfikowanie modów.\"\n    },\n    \"advancedSettings\": \"Ustawienia zaawansowane\",\n    \"hideTrayIcon\": {\n      \"title\": \"Ukryj ikonę w zasobniku\",\n      \"description\": \"Będziesz musiał wyłączyć tę opcję, aby wyjść z Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Wymagaj uprawnień UAC do uruchomienia Windhawk\",\n      \"description\": \"Windhawk wymaga uprawnień administratora, ale dla komputera z jednym użytkownikiem wyświetlanie komunikatu UAC za każdym razem może być irytujące, więc Windhawk go omija. Włącz tę opcję, aby wymagać uprawnień UAC do uruchamiania Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Nie wyświetlaj automatycznie okna dialogowego narzędzi\",\n      \"description\": \"Domyślnie Windhawk automatycznie wyświetla okno dialogowe narzędzi, gdy wykryje, że pasek zadań nie jest dostępny z powodu niestabilności systemu lub z innego powodu. Okno dialogowe narzędzi pozwala wyjść z Windhawk, przełączyć się do trybu bezpiecznego i wykonać inne operacje. Okno dialogowe narzędzi można również wyświetlić za pomocą skrótu klawiaturowego Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Opóźnienie okna dialogowego inicjalizacji modów\",\n      \"description\": \"Ilość milisekund do odczekania przed wyświetleniem okna dialogowego postępu inicjalizacji modów.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Więcej ustawień zaawansowanych\",\n      \"restartNotice\": \"Windhawk musi zostać uruchomiony ponownie, aby zastosować ustawienia.\",\n      \"saveButton\": \"Zapisz i uruchom ponownie Windhawk\",\n      \"cancelButton\": \"Anuluj\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Szczegółowe logi Windhawk\",\n      \"engineLoggingTitle\": \"Szczegółowe logi silnika Windhawk\",\n      \"description\": \"Logi mogą zostać wyswietlone używając narzędzia DebugView\",\n      \"none\": \"Nic\",\n      \"error\": \"Błąd\",\n      \"verbose\": \"Szczegóły\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Lista wykluczonych procesów\",\n      \"descriptionExclusion\": \"Lista nazw procesów/ścieżek, do których Windhawk nie będzie wstrzykiwał. Może być przydatna w przypadkach, gdy Windhawk nie jest kompatybilny z określonym programem. Należy pamiętać, że dodanie procesu do tej listy nie tylko uniemożliwi Windhawk dostosowanie go, ale także uniemożliwi Windhawk przechwytywanie procesów potomnych tworzonych przez ten proces. Spowoduje to, że w takich przypadkach Windhawk będzie ładował mody z niewielkim opóźnieniem.\",\n      \"titleInclusion\": \"Lista uwzględnionych procesów\",\n      \"descriptionInclusion\": \"Lista nazw/ścieżek procesów, do których Windhawk będzie wstrzykiwał dane, nawet jeśli znajdują się one na liście wykluczeń.\",\n      \"inclusionWithoutExclusionNotice\": \"Lista uwzględnionych procesów nie ma wpływu na pustą listę wykluczania procesów.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Jeśli chcesz wykluczyć wszystkie procesy oprócz tych, możesz ustawić \\\"*\\\" na liście wykluczeń procesów.\",\n      \"processListPlaceholder\": \"Nazwy/ścieżki procesów, po jednej w wierszu, na przykład:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Rynek personalizacji dla programów Windows\",\n    \"credit\": \"Stworzył <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Aktualizacja jest dostępna\",\n      \"subtitle\": \"Rozważ aktualizację Windhawk, aby uzyskać najnowsze funkcje i poprawki błędów\",\n      \"updateButton\": \"Więcej informacji\"\n    },\n    \"links\": {\n      \"title\": \"Linki\",\n      \"homepage\": \"Strona główna\",\n      \"documentation\": \"Dokumentacja\"\n    },\n    \"builtWith\": {\n      \"title\": \"Zrobione używając\",\n      \"vscodium\": \"Społecznościowa dystrybucja edytora VSCode firmy Microsoft\",\n      \"llvmMingw\": \"Oparty na toolchainie LLVM/Clang/LLD dla mingw-w64\",\n      \"minHook\": \"Minimalistyczna biblioteka do instalowanie hooków dla Windows\",\n      \"others\": \"Inne narzędzia i biblioteki oraz trochę kodu\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Zainstaluj {{mod}}\",\n    \"warningTitle\": \"Postępuj ostrożnie\",\n    \"warningDescription\": \"Złośliwe mody mogą uszkodzić komputer lub naruszyć prywatność użytkownika. Instaluj mody tylko od zaufanych autorów.\",\n    \"modAuthor\": \"Autor moda\",\n    \"homepage\": \"Strona główna\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"zweryfikowany\",\n    \"verifiedTooltip\": \"Zweryfikowaliśmy, że ten profil należy do autora moda, ale należy pamiętać, że <0>zweryfikowany</0> to nie to samo, co <0>zaufany</0>. Upewnij się, że ufasz autorowi moda lub dokładnie sprawdź kod źródłowy przed instalacją.\",\n    \"acceptButton\": \"Zaakceptuj ryzyko i zainstaluj\",\n    \"cancelButton\": \"Anuluj\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Utwórz nowego moda\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Tworzenie i modyfikowanie modów wymaga pewnej wiedzy na temat programowania w językach C/C++. Jeśli nie jesteś pewien, co to oznacza, być może te opcje nie są dla Ciebie.\",\n    \"hideOptionsCheckbox\": \"Ukryj wszystkie opcje związane z programowaniem\",\n    \"hideOptionsButton\": \"Ukryj opcje\",\n    \"beginCodingButton\": \"Rozpocznij kodowanie\",\n    \"cancelButton\": \"Anuluj\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk działa w trybie bezpiecznym, wszystkie funkcje wstrzykiwania kodu są wyłączone.\",\n    \"offButton\": \"Wyłącz tryb bezpieczny\",\n    \"offConfirm\": \"Windhawk zostanie uruchomiony ponownie, aby zastosować ustawienia.\",\n    \"offConfirmOk\": \"Zrestartuj Windhawk\",\n    \"offConfirmCancel\": \"Anuluj\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Opcja nie jest dostępna w trybie podglądowym\",\n    \"notCompiled\": \"Mod musi zostać skompilowany przed podglądem\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identyfikator moda\",\n    \"enableMod\": \"Włącz moda\",\n    \"enableLogging\": \"Włącz dziennik zdarzeń\",\n    \"notCompiled\": \"Mod musi być skompilowany\",\n    \"compile\": \"Kompiluj moda\",\n    \"compilationFailed\": \"Kompilacja zakończyła się sukcesem\",\n    \"preview\": \"Podgląd modu\",\n    \"showLogOutput\": \"Pokaż dane dziennika\",\n    \"exit\": \"Wyjdź z trybu edycji\",\n    \"exitConfirmation\": \"Zmiany wprowadzone od ostatniej udanej kompilacji zostaną utracone\",\n    \"exitButtonOk\": \"Wyjdź\",\n    \"exitButtonCancel\": \"Pozostań\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Carregando...\",\n    \"loadingFailed\": \"Falha ao carregar, verifique sua conexão\",\n    \"loadingFailedTitle\": \"Falha no carregamento\",\n    \"loadingFailedSubtitle\": \"Por favor verifique sua conexão e tente novamente\",\n    \"tryAgain\": \"Tente novamente\",\n    \"updating\": \"Atualizando...\",\n    \"installing\": \"Instalando...\",\n    \"compiling\": \"Compilando...\",\n    \"cut\": \"Cortar\",\n    \"copy\": \"Copiar\",\n    \"paste\": \"Colar\",\n    \"selectAll\": \"Selecionar tudo\"\n  },\n  \"appHeader\": {\n    \"home\": \"Início\",\n    \"explore\": \"Explorar\",\n    \"settings\": \"Configurações\",\n    \"about\": \"Sobre\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Atualização disponivel\",\n    \"installed\": \"Instalado\",\n    \"details\": \"Detalhes\",\n    \"update\": \"Atualizar\",\n    \"install\": \"Instalar\",\n    \"compile\": \"Compilar\",\n    \"disable\": \"Desabilitar\",\n    \"enable\": \"Habilitar\",\n    \"edit\": \"Editar\",\n    \"fork\": \"Parar\",\n    \"remove\": \"Remover\",\n    \"removeConfirm\": \"Tem certeza de que deseja remover este Mod?\",\n    \"removeConfirmOk\": \"Remover Mod\",\n    \"removeConfirmCancel\": \"Cancelar\",\n    \"notCompiled\": \"O Mod precisa ser compilado\",\n    \"editedLocally\": \"O Mod foi editado localmente\",\n    \"noDescription\": \"(sem descrição)\",\n    \"users_one\": \"{{formattedCount}} usuário\",\n    \"users_many\": \"{{formattedCount}} usuários\",\n    \"users_other\": \"{{formattedCount}} usuários\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Versão instalada\",\n      \"latestVersion\": \"Última versão\",\n      \"loading\": \"Carregando...\",\n      \"loadingFailed\": \"Falha ao Carregar\",\n      \"modId\": \"Identificador de Mod\",\n      \"modVersion\": \"Versão do Mod\",\n      \"modAuthor\": {\n        \"title\": \"Autor do Mod\",\n        \"homepage\": \"Site Pessoal\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Todos os Processos\",\n        \"allBut\": \"Todos exceto {{list}}\",\n        \"except\": \"{{included}} exeto {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Processos alvo\",\n          \"excluded\": \"Excluído\"\n        }\n      },\n      \"updateNotNeeded\": \"A versão instalada é idêntica à versão mais recente\"\n    },\n    \"details\": {\n      \"title\": \"Detalhes\",\n      \"noData\": \"Faltam detalhes do Mod.\"\n    },\n    \"settings\": {\n      \"title\": \"Configurações\",\n      \"noData\": \"Nenhuma configuração de Mod está disponível.\",\n      \"saveButton\": \"Salvar configurações\",\n      \"sampleValue\": \"Valor da amostra\",\n      \"arrayItemAdd\": \"Adicionar novo item\",\n      \"arrayItemRemove\": \"Remover item\"\n    },\n    \"code\": {\n      \"title\": \"Código fonte\",\n      \"noData\": \"A fonte do Mod está ausente.\",\n      \"collapseExtra\": \"Recolher Leia-me e Configurações\"\n    },\n    \"changelog\": {\n      \"title\": \"Log de alterações\",\n      \"loadingFailed\": \"Falha ao carregar a Log de Alterações. <0>Clique aqui</0> para visualizá-lo no GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avançado\",\n      \"debugLogging\": {\n        \"title\": \"Log de depuração\",\n        \"description\": \"Pode ser útil para solucionar problemas com Mods.\",\n        \"none\": \"Nada\",\n        \"modLogs\": \"Logs de modificação\",\n        \"detailedLogs\": \"Logs de depuração detalhados\",\n        \"showLogButton\": \"Mostrar saída de Logs\"\n      },\n      \"modSettings\": {\n        \"title\": \"Configurações de Mod\",\n        \"description\": \"Exporte ou compartilhe facilmente suas configurações de Mod.\",\n        \"loadButton\": \"Carregar\",\n        \"loadFormattedButton\": \"Carregar formatado\",\n        \"saveButton\": \"Salvar\",\n        \"invalidData\": \"Dados JSON inválidos\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Lista de inclusão de processo personalizado\",\n        \"descriptionInclusion\": \"Uma lista personalizada de nomes/caminhos de arquivos executáveis ​adicionais que o Mod terá como alvo. A lista é adicionada à lista de inclusão que o autor do Mod definiu para determinar quais processos devem ser direcionados. Para cada processo, o Mod é carregado se o caminho do arquivo executável corresponder a uma das entradas de inclusão e não corresponder a nenhuma entrada de exclusão.\",\n        \"titleExclusion\": \"Lista de exclusão de processo personalizada\",\n        \"descriptionExclusion\": \"Uma lista personalizada de nomes/caminhos de arquivos executáveis ​​adicionais que o Mod excluirá do direcionamento. A lista é adicionada à lista de exclusão que o autor do Mod definiu para determinar quais processos visar. Para cada processo, o Mod é carregado se o caminho do arquivo executável corresponder a uma das entradas de inclusão e não corresponder a nenhuma entrada de exclusão.\",\n        \"processListPlaceholder\": \"Nomes/caminhos de processo, um por linha, por exemplo:\",\n        \"saveButton\": \"Salvar\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorar listas de inclusão/exclusão de mods\",\n        \"description\": \"Ignora as listas de inclusão/exclusão de processos do mod e usar apenas as listas personalizadas acima.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Últimas alterações da versão\",\n      \"noData\": \"A versão instalada é idêntica à versão mais recente.\",\n      \"splitView\": \"Viualização dividida\",\n      \"expandLines_one\": \"Expandir uma linha oculta\",\n      \"expandLines_many\": \"Expandir {{count}} linhas ocultas\",\n      \"expandLines_other\": \"Expandir {{count}} linhas ocultas\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Pesquisar Mods...\"\n  },\n  \"home\": {\n    \"browse\": \"Pesquisar Mods\",\n    \"installedMods\": {\n      \"title\": \"Mods Instalados\",\n      \"noMods\": \"Nenhum mod instalado\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mods em Destaque\",\n      \"noMods\": \"Não há Mods em destaque que ainda não foram instalados\",\n      \"explore\": \"Explorar outros Mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popular e Melhor Avaliado\",\n      \"popular\": \"Popular\",\n      \"topRated\": \"Melhor Avaliado\",\n      \"newest\": \"Recente\",\n      \"lastUpdated\": \"Recem Atualizados\",\n      \"alphabeticalOrder\": \"Ordem Alfabetica\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Idioma\",\n      \"description\": \"Selecione o idioma de exibição.\",\n      \"contribute\": \"<0>Contribua com uma tradução</0>.\",\n      \"credits\": \"Tradução para o Português Brasileiro por: <0>Cauaã Vinicius Moraes (C4UA)</0>.\",\n      \"creditsLink\": \"mailto:cauaaviniciusmoraes@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"Verificar atualizações\",\n      \"description\": \"Verifica periodicamente por novas versões do Windhawk e dos mods instalados.\"\n    },\n    \"devMode\": {\n      \"title\": \"Modo desenvolvedor\",\n      \"description\": \"Mostrar ações para desenvolvedores, como criar e editar mods.\"\n    },\n    \"advancedSettings\": \"Configurações avançadas\",\n    \"hideTrayIcon\": {\n      \"title\": \"Ocultar ícone da bandeja\",\n      \"description\": \"Você terá que desabilitar esta opção para sair do Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Exigir elevação UAC para executar Windhawk\",\n      \"description\": \"O Windhawk requer direitos de administrador, mas para um computador de usuário único, obter o prompt do UAC toda vez pode ser irritante, então o Windhawk o ignora. Ative esta opção para exigir a elevação do UAC para executar o Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Não mostrar automaticamente a caixa de diálogo do kit de ferramentas\",\n      \"description\": \"Por padrão, o Windhawk mostra automaticamente a caixa de diálogo do kit de ferramentas quando detecta que a barra de tarefas não está acessível, devido à instabilidade do sistema ou por outro motivo. A caixa de diálogo do kit de ferramentas permite sair do Windhawk, alternar para o modo de segurança e fazer outras operações. A caixa de diálogo do kit de ferramentas também pode ser exibida com o atalho de teclado Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Atraso da caixa de diálogo de inicialização do mod\",\n      \"description\": \"Quantidade de milissegundos antes de mostrar a caixa de progresso para inicialização do mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Mais configurações avançadas\",\n      \"restartNotice\": \"Windhawk será reiniciado para aplicar as configurações.\",\n      \"saveButton\": \"Salve e reinicie o Windhawk\",\n      \"cancelButton\": \"Cancelar\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Verbosidade da Log do Windhawk\",\n      \"engineLoggingTitle\": \"Verbosidade da Log do mecanismo Windhawk\",\n      \"description\": \"Os logs podem ser visualizados com uma ferramenta como DebugView.\",\n      \"none\": \"Nada\",\n      \"error\": \"Erro\",\n      \"verbose\": \"Verbosidade\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Lista de exclusão de processo\",\n      \"descriptionExclusion\": \"Uma lista de nomes/caminhos de processos nos quais o Windhawk não injetará. Pode ser útil em casos que o Windhawk não é compatível com um programa específico. Observe que adicionar um processo a esta lista não apenas impedirá Windhawk de personalizá-lo, mas também impedirá Windhawk de interceptar processos filho criados por esse processo. Isso fará com que o Windhawk carregue os mods com um pequeno atraso nesses casos.\",\n      \"titleInclusion\": \"Lista de inclusão de processos\",\n      \"descriptionInclusion\": \"Uma lista de nomes/caminhos de processos nos quais o Windhawk injetará, mesmo que estejam na lista de exclusão.\",\n      \"inclusionWithoutExclusionNotice\": \"A lista de inclusão de processo não tem efeito com uma lista de exclusão de processo vazia.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Se você pretende excluir todos os processos exceto estes, você pode definir \\\"*\\\" na lista de exclusão de processos.\",\n      \"processListPlaceholder\": \"Nomes/caminhos de processo, um por linha, por exemplo:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"O suíte de personalização para programas do Windows\",\n    \"credit\": \"Por: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Nova atualização disponível\",\n      \"subtitle\": \"Atualize o Windhawk para obter novos recursos e correções de bugs\",\n      \"updateButton\": \"Mais detalhes\"\n    },\n    \"links\": {\n      \"title\": \"Links\",\n      \"homepage\": \"Site Oficial\",\n      \"documentation\": \"Documentação\"\n    },\n    \"builtWith\": {\n      \"title\": \"Feito com\",\n      \"vscodium\": \"Distribuição voltada para a comunidade do editor VSCode da Microsoft\",\n      \"llvmMingw\": \"Uma cadeia de ferramentas mingw-w64 baseada em LLVM/Clang/LLD\",\n      \"minHook\": \"Biblioteca de conexão de API minimalista para Windows\",\n      \"others\": \"Outras ferramentas e bibliotecas e um pouco de código\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Instalar {{mod}}\",\n    \"warningTitle\": \"Prossiga com cautela\",\n    \"warningDescription\": \"Mods maliciosos podem danificar seu computador ou violar sua privacidade. Instale mods apenas de autores em quem você confia.\",\n    \"modAuthor\": \"Autor do mod\",\n    \"homepage\": \"Site Pessoal\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"Verificado\",\n    \"verifiedTooltip\": \"Verificamos que este perfil pertence ao autor do mod, mas observe que <0>verificado</0> não é o mesmo que <0>confiável</0>. Certifique-se de confiar no autor do mod ou inspecione cuidadosamente o código-fonte antes de instalar.\",\n    \"acceptButton\": \"Aceitar os riscos e instalar\",\n    \"cancelButton\": \"Cancelar\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Criar um novo Mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Criar e editar mods requer algum conhecimento da linguagem C/C++ para Windows. Se você não tem certeza do que isso significa, talvez essas opções não sejam para você.\",\n    \"hideOptionsCheckbox\": \"Ocultar todas as opções relacionadas ao desenvolvimento\",\n    \"hideOptionsButton\": \"Esconder opções\",\n    \"beginCodingButton\": \"Começar a codificar\",\n    \"cancelButton\": \"Cancelar\"\n  },\n  \"safeMode\": {\n    \"alert\": \"O Windhawk está sendo executado no modo de segurança, todas as funcionalidades de injeção de código estão desativadas.\",\n    \"offButton\": \"Sair do modo de segurança\",\n    \"offConfirm\": \"Windhawk será reiniciado para aplicar as configurações.\",\n    \"offConfirmOk\": \"Reiniciar Windhawk\",\n    \"offConfirmCancel\": \"Cancelar\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"A ação não está disponível no modo de visualização\",\n    \"notCompiled\": \"Mod precisa ser compilado para poder ser vizualizado\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identificador de Mod\",\n    \"enableMod\": \"Habilitar Mod\",\n    \"enableLogging\": \"Habilitar carregamento\",\n    \"notCompiled\": \"O mod precisa ser compilado\",\n    \"compile\": \"Compilar Mod\",\n    \"compilationFailed\": \"Falha na compilação\",\n    \"preview\": \"Vizualizar Mod\",\n    \"showLogOutput\": \"Mostrar Log de saida\",\n    \"exit\": \"Sair do modo de edição\",\n    \"exitConfirmation\": \"As alterações desde a última compilação bem-sucedida serão perdidas\",\n    \"exitButtonOk\": \"Sair\",\n    \"exitButtonCancel\": \"Cancelar\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Se încarcă...\",\n    \"loadingFailed\": \"Nu s-a putut încărca, verifică-ți conexiunea la internet\",\n    \"loadingFailedTitle\": \"Nu s-a putut încărca\",\n    \"loadingFailedSubtitle\": \"Verifică-ți conexiunea la rețea și încearcă din nou\",\n    \"tryAgain\": \"Încearcă din nou\",\n    \"updating\": \"Se actualizează...\",\n    \"installing\": \"Se instalează...\",\n    \"compiling\": \"Se compilează...\",\n    \"cut\": \"Decupare\",\n    \"copy\": \"Copiere\",\n    \"paste\": \"Lipire\",\n    \"selectAll\": \"Selectează tot\"\n  },\n  \"appHeader\": {\n    \"home\": \"Acasă\",\n    \"explore\": \"Explorează\",\n    \"settings\": \"Setări\",\n    \"about\": \"Despre\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Actualizare disponibilă\",\n    \"installed\": \"Instalat\",\n    \"details\": \"Detalii\",\n    \"update\": \"Actualizare\",\n    \"install\": \"Instalează\",\n    \"compile\": \"Compilează\",\n    \"disable\": \"Dezactivează\",\n    \"enable\": \"Activează\",\n    \"edit\": \"Editează\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Elimină\",\n    \"removeConfirm\": \"Sigur elimini acest mod?\",\n    \"removeConfirmOk\": \"Elimină modul\",\n    \"removeConfirmCancel\": \"Anulează\",\n    \"notCompiled\": \"Modul trebuie să fie compilat\",\n    \"editedLocally\": \"Modul a fost editat local\",\n    \"noDescription\": \"(fără descriere)\",\n    \"users_one\": \"{{formattedCount}} utilizator\",\n    \"users_few\": \"{{formattedCount}} utilizatori\",\n    \"users_other\": \"{{formattedCount}} de utilizatori\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Versiune instalată\",\n      \"latestVersion\": \"Cea mai recentă versiune\",\n      \"loading\": \"Se încarcă...\",\n      \"loadingFailed\": \"Nu s-a putut încărca\",\n      \"modId\": \"Identificator mod\",\n      \"modVersion\": \"Versiune mod\",\n      \"modAuthor\": {\n        \"title\": \"Autorul modului\",\n        \"homepage\": \"Pagina de pornire\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Toate procesele\",\n        \"allBut\": \"Toate, cu excepția {{list}}\",\n        \"except\": \"{{included}} exceptând {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Procese țintă\",\n          \"excluded\": \"Excluse\"\n        }\n      },\n      \"updateNotNeeded\": \"Versiunea instalată este identică cu cea recentă\"\n    },\n    \"details\": {\n      \"title\": \"Detalii\",\n      \"noData\": \"Detaliile modului lipsesc.\"\n    },\n    \"settings\": {\n      \"title\": \"Setări\",\n      \"noData\": \"Nu sunt disponibile setări pentru acest mod.\",\n      \"saveButton\": \"Salvează setările\",\n      \"sampleValue\": \"Valoarea eșantionului\",\n      \"arrayItemAdd\": \"Adaugă un nou element\",\n      \"arrayItemRemove\": \"Elimină element\"\n    },\n    \"code\": {\n      \"title\": \"Cod sursă\",\n      \"noData\": \"Codul sursă lipsește.\",\n      \"collapseExtra\": \"Restrânge Readme și Setări\"\n    },\n    \"changelog\": {\n      \"title\": \"Jurnal de modificări\",\n      \"loadingFailed\": \"Nu s-a putut încărca jurnalul de modificări. <0>Clic aici</0> pentru a-l vedea pe GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avansat\",\n      \"debugLogging\": {\n        \"title\": \"Jurnal de depanare\",\n        \"description\": \"Poate fi folositor pentru a depana modul.\",\n        \"none\": \"Nimic\",\n        \"modLogs\": \"Jurnalul modului\",\n        \"detailedLogs\": \"Jurnal detaliat de depanare\",\n        \"showLogButton\": \"Arată ieșirea în jurnal\"\n      },\n      \"modSettings\": {\n        \"title\": \"Setări mod\",\n        \"description\": \"Exportă sau distribuie cu ușurință setările tale ale acestui mod\",\n        \"loadButton\": \"Încarcă\",\n        \"loadFormattedButton\": \"Încarcă formatat\",\n        \"saveButton\": \"Salvează\",\n        \"invalidData\": \"Date JSON invalide\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Listă personalizată de includere a proceselor\",\n        \"descriptionInclusion\": \"O listă personalizată de nume/căi de fișiere executabile suplimentare pe care modul le va viza. Lista este adăugată la lista de includere definită de autorul modului pentru a determina ce procese trebuie să fie vizate. Pentru fiecare proces, modul este încărcat dacă calea fișierului executabil se potrivește cu una dintre intrările de includere și nu se potrivește cu nicio intrare de excludere.\",\n        \"titleExclusion\": \"Listă personalizată de excludere a proceselor\",\n        \"descriptionExclusion\": \"O listă personalizată de nume/căi de fișiere executabile suplimentare pe care modul nu le va lua în considerare. Lista se adaugă la lista de excludere definită de autorul modului pentru a determina ce procese să fie vizate. Pentru fiecare proces, modul este încărcat dacă calea fișierului executabil se potrivește cu una dintre intrările de includere și nu se potrivește cu nicio intrare de excludere.\",\n        \"processListPlaceholder\": \"Numele/calea procesului, câte unul/una pe o singură linie, de exemplu:\",\n        \"invalidCharactersWarning\": \"Lista de procese conține caractere nevalide ce vor fi eliminate: {{invalidCharacters}}\",\n        \"saveButton\": \"Salvează\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignoră listele de includeri/excluderi a modurilor\",\n        \"description\": \"Ignoră listele de includeri/excluderi a proceselor modului și folosește numai listele personalizate de mai sus.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Ia în considerare pattern-urile pentru lista de includere a procesele de sistem critice\",\n        \"description\": \"În mod normal, Windhawk încarcă moduri în procesele de sistem critice numai dacă procesul este inclus fără pattern-uri, de exemplu <0>proces_critic.exe</0>, nu <0>*</0> sau <0>*.exe</0>. Pentru mai multe detalii despre procesele de sistem critice, consultă <1>documentația</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Modificări în cea mai recentă versiune\",\n      \"noData\": \"Versiunea instalată este identică cu cea mai recentă.\",\n      \"splitView\": \"Vizualizare divizată\",\n      \"expandLines_one\": \"Extinde o linie ascunsă\",\n      \"expandLines_few\": \"Extinde {{count}} linii ascunse\",\n      \"expandLines_other\": \"Extinde {{count}} de linii ascunse\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Caută moduri...\"\n  },\n  \"home\": {\n    \"browse\": \"Răsfoiește moduri\",\n    \"installedMods\": {\n      \"title\": \"Moduri instalate\",\n      \"noMods\": \"Niciun mod instalat\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Moduri promovate\",\n      \"noMods\": \"Nu există moduri promovate care n-au fost încă instalate\",\n      \"explore\": \"Explorează alte moduri\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populare și top evaluate\",\n      \"popular\": \"Populare\",\n      \"topRated\": \"Top evaluate\",\n      \"newest\": \"Cele mai noi\",\n      \"lastUpdated\": \"Actualizate recent\",\n      \"alphabeticalOrder\": \"Ordine alfabetică\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Limbă\",\n      \"description\": \"Selectează limba ta preferată de afișare pentru Windhawk.\",\n      \"contribute\": \"<0>Contribuie pentru o nouă traducere</0>.\",\n      \"credits\": \"Tradus în limba română de <0>Valer100</0>.\",\n      \"creditsLink\": \"https://github.com/Valer100\"\n    },\n    \"updates\": {\n      \"title\": \"Verifică pentru actualizări\",\n      \"description\": \"Verifică periodic pentru noi versiuni de Windhawk și pentru modurile instalate.\"\n    },\n    \"devMode\": {\n      \"title\": \"Mod dezvoltator\",\n      \"description\": \"Arată acțiuni pentru dezvoltatori, cum ar fi crearea și modificarea modurilor.\"\n    },\n    \"advancedSettings\": \"Setări avansate\",\n    \"hideTrayIcon\": {\n      \"title\": \"Ascunde pictograma Windhawk din bara de activități\",\n      \"description\": \"Va trebui să dezactivezi această opțiune pentru a închide Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Cere elevare UAC pentru a rula Windhawk\",\n      \"description\": \"Windhawk necesită drepturi de administrator, dar pentru un calculator folosit de o singură persoană, afișarea ecranului UAC de fiecare dată poate fi enervantă, așa că Windhawk ocolește acest lucru. Activează această opțiune pentru a cere elevare UAC pentru a rula Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Nu arăta automat dialogul cu trusa de unelte\",\n      \"description\": \"În mod normal, Windhawk arată automat dialogul cu trusa de unelte când detectează că bara de activități nu este accesibilă, fie din motive de instabilitate a sistemului sau din alt motiv. Dialogul cu trusa de unelte îți permite să închizi Windhawk, să activezi modul de siguranță și să faci alte operațiuni. Dialogul cu trusa de unelte poate fi de asemenea afișat folosind combinația de taste Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Întârzierea dialogului de inițializare a modului\",\n      \"description\": \"Numărul de milisecunde de așteptat înainte de a arăta dialogul de progres pentru inițializarea modului.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Mai multe setări avansate\",\n      \"restartNotice\": \"Windhawk va fi repornit pentru a aplica setările.\",\n      \"saveButton\": \"Salvează și repornește Windhawk\",\n      \"cancelButton\": \"Anulare\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Verbozitatea scrierii în jurnal pentru Windhawk\",\n      \"engineLoggingTitle\": \"Verbozitatea engine-ului de scriere în jurnal Windhawk\",\n      \"description\": \"Jurnalurile pot fi văzute cu o unealtă precum DebugView.\",\n      \"none\": \"Nimic\",\n      \"error\": \"Eroare\",\n      \"verbose\": \"Verbose\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Lista de excludere a proceselor\",\n      \"descriptionExclusion\": \"O listă de nume/căi de procese pe care Windhawk nu le va putea injecta. Poate fi utilă pentru cazurile în care Windhawk nu este compatibil cu un anumit program. Ține minte că adăugând un proces în această listă nu va doar preveni Windhawk de a-l personaliza, dar va preveni de asemenea Windhawk din a intercepta procesele pe care acesta le creează. Acest lucru va cauza ca Windhawk să încarce modurile cu o mică întârziere în astfel de cazuri.\",\n      \"descriptionExclusionWiki\": \"Pentru mai multe detalii despre excluderea proceselor și despre listele incluse de excludere a proceselor, consultă <0>documentația</0>.\",\n      \"excludeCriticalProcesses\": \"Exclude procesele de sistem critice\",\n      \"excludeIncompatiblePrograms\": \"Exclude programele incompatibile cunoscute\",\n      \"excludeGames\": \"Exclude jocuri bine cunoscute\",\n      \"titleInclusion\": \"Lista de includere a proceselor\",\n      \"descriptionInclusion\": \"O listă de nume/căi de procese pe care Windhawk le va putea injecta, chiar dacă ele sunt în lista de excludere.\",\n      \"inclusionWithoutExclusionNotice\": \"Lista proceselor incluse nu are niciun efect dacă lista de procese excluse este goală.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Dacă te refereai la excluderea tuturor proceselor, dar nu acestea, poți adăuga \\\"*\\\" în lista de excludere a proceselor.\",\n      \"processListPlaceholder\": \"Numele/căile proceselor, câte unul/una pe un singur rând, de exemplu:\",\n      \"invalidCharactersWarning\": \"Lista de procese conține caractere nevalide ce vor fi eliminate: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Piața de personalizare pentru programele Windows\",\n    \"credit\": \"De <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"O actualizare este disponibilă\",\n      \"subtitle\": \"Ia în considerare să actualizezi Windhawk pentru a obține cele mai noi funcții și remedieri de bug-uri\",\n      \"updateButton\": \"Mai multe detalii\"\n    },\n    \"links\": {\n      \"title\": \"Linkuri\",\n      \"homepage\": \"Pagina de pornire\",\n      \"documentation\": \"Documentație\"\n    },\n    \"builtWith\": {\n      \"title\": \"Construit cu\",\n      \"vscodium\": \"O distribuție a editorului VSCode de la Microsoft condusă de comunitate\",\n      \"llvmMingw\": \"Un lanț de instrumente mingw-w64 bazat pe LLVM/Clang/LLD\",\n      \"minHook\": \"Biblioteca minimalistă de API hooking pentru Windows\",\n      \"others\": \"Alte unelte și biblioteci și puțin cod\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Instalează {{mod}}\",\n    \"warningTitle\": \"Continuă cu prudență\",\n    \"warningDescription\": \"Modurile malițioase pot provoca daune calculatorului tău sau pot să-ți încalce confidențialitatea. Instalează moduri numai de la autorii de încredere.\",\n    \"modAuthor\": \"Autorul modului\",\n    \"homepage\": \"Pagina de pornire\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verificat\",\n    \"verifiedTooltip\": \"Am verificat că acest profil îi aparține autorului modului, dar <0>persoanele verificate</0> nu pot fi întotdeauna <0>de încredere</0>. Asigură-te că autorul acestui mod este de încredere sau inspectează cu atenție codul sursă înainte de instalare.\",\n    \"acceptButton\": \"Acceptă riscul și instalează\",\n    \"cancelButton\": \"Anulare\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Creează un mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Crearea și modificarea modurilor necesită niște cunoștințe de dezvoltare Windows C/C++. Dacă nu știi ce înseamnă asta, se pare că aceste opțiuni nu sunt pentru tine.\",\n    \"hideOptionsCheckbox\": \"Ascunde toate opțiunile relevante dezvoltării\",\n    \"hideOptionsButton\": \"Ascunde opțiunile\",\n    \"beginCodingButton\": \"Începe să codezi\",\n    \"cancelButton\": \"Anulare\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk rulează în modul de siguranță. Toate funcționalitățile de injectat cod sunt dezactivate.\",\n    \"offButton\": \"Oprește modul de siguranță\",\n    \"offConfirm\": \"Windhawk va fi repornit pentru a aplica setările.\",\n    \"offConfirmOk\": \"Repornește Windhawk\",\n    \"offConfirmCancel\": \"Anulare\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Acțiunea nu este disponibilă în modul de previzualizare\",\n    \"notCompiled\": \"Modul trebuie să fie compilat pentru a-l putea previzualiza\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Identificator mod\",\n    \"enableMod\": \"Activează modul\",\n    \"enableLogging\": \"Activează scrierea în jurnal\",\n    \"notCompiled\": \"Modul trebuie să fie compilat\",\n    \"compile\": \"Compilează modul\",\n    \"compilationFailed\": \"Compilare eșuată\",\n    \"preview\": \"Previzualizează modul\",\n    \"showLogOutput\": \"Arată ieșirea în jurnal\",\n    \"exit\": \"Ieșire din modul de editare\",\n    \"exitConfirmation\": \"Modificările de la ultima compilare reușită vor fi pierdute\",\n    \"exitButtonOk\": \"Ieșire\",\n    \"exitButtonCancel\": \"Stai\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Загрузка...\",\n    \"loadingFailed\": \"Загрузка не удалась, пожалуйста, проверьте ваше соединение с интернетом\",\n    \"loadingFailedTitle\": \"Загрузка не удалась\",\n    \"loadingFailedSubtitle\": \"Пожалуйста, проверьте ваше соединение с интернетом и попытайтесь снова\",\n    \"tryAgain\": \"Попробовать ещё раз\",\n    \"updating\": \"Обновление...\",\n    \"installing\": \"Установка...\",\n    \"compiling\": \"Компилирование...\",\n    \"cut\": \"Вырезать\",\n    \"copy\": \"Копировать\",\n    \"paste\": \"Вставить\",\n    \"selectAll\": \"Выбрать все\"\n  },\n  \"appHeader\": {\n    \"home\": \"Главная\",\n    \"explore\": \"Поиск\",\n    \"settings\": \"Параметры\",\n    \"about\": \"О программе\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Доступно обновление\",\n    \"installed\": \"Установлено\",\n    \"details\": \"Описание\",\n    \"update\": \"Обновить\",\n    \"install\": \"Установить\",\n    \"compile\": \"Скомпилировать\",\n    \"disable\": \"Отключить\",\n    \"enable\": \"Включить\",\n    \"edit\": \"Редактировать\",\n    \"fork\": \"Созд. копию\",\n    \"remove\": \"Удалить\",\n    \"removeConfirm\": \"Вы уверены, что хотите удалить эту модификацию?\",\n    \"removeConfirmOk\": \"Удалить модификацию\",\n    \"removeConfirmCancel\": \"Отмена\",\n    \"notCompiled\": \"Модификация должна быть скомпилирована\",\n    \"editedLocally\": \"Модификация отредактирована локально\",\n    \"noDescription\": \"(нет описания)\",\n    \"users_one\": \"{{formattedCount}} пользователь\",\n    \"users_few\": \"{{formattedCount}} пользователя\",\n    \"users_many\": \"{{formattedCount}} пользователей\",\n    \"users_other\": \"{{formattedCount}} пользователей\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Установленная версия\",\n      \"latestVersion\": \"Последняя версия\",\n      \"loading\": \"загрузка...\",\n      \"loadingFailed\": \"загрузка не удалась\",\n      \"modId\": \"ID модификации\",\n      \"modVersion\": \"Версия модификации\",\n      \"modAuthor\": {\n        \"title\": \"Автор модификации\",\n        \"homepage\": \"Главная страница\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Твиттер)\"\n      },\n      \"processes\": {\n        \"all\": \"Все процессы\",\n        \"allBut\": \"Все, кроме {{list}}\",\n        \"except\": \"{{included}} кроме {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Целевые процессы\",\n          \"excluded\": \"Исключённые\"\n        }\n      },\n      \"updateNotNeeded\": \"Установлена самая последняя версия\"\n    },\n    \"details\": {\n      \"title\": \"Описание\",\n      \"noData\": \"Описание модификации отсутствует.\"\n    },\n    \"settings\": {\n      \"title\": \"Настройки\",\n      \"noData\": \"Нет доступных настроек модификации.\",\n      \"saveButton\": \"Сохранить настройки\",\n      \"sampleValue\": \"Стандартное значение\",\n      \"arrayItemAdd\": \"Добавить новый элемент\",\n      \"arrayItemRemove\": \"Удалить элемент\"\n    },\n    \"code\": {\n      \"title\": \"Исходный код\",\n      \"noData\": \"Исходный код отсутствует.\",\n      \"collapseExtra\": \"Скрыть настройки и Readme\"\n    },\n    \"changelog\": {\n      \"title\": \"Список изменений\",\n      \"loadingFailed\": \"Не удалось загрузить список изменений. Нажмите <0>сюда</0>, чтобы просмотреть на GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Дополнительно\",\n      \"debugLogging\": {\n        \"title\": \"Логирование отладки\",\n        \"description\": \"Может быть использовано для решения проблем с модификацией.\",\n        \"none\": \"Нет\",\n        \"modLogs\": \"Логи модификаций\",\n        \"detailedLogs\": \"Подробные логи отладки\",\n        \"showLogButton\": \"Показать логи\"\n      },\n      \"modSettings\": {\n        \"title\": \"Настройки модификации\",\n        \"description\": \"Легко экспортируйте или делитесь вашими настройками модификаций.\",\n        \"loadButton\": \"Загрузить\",\n        \"loadFormattedButton\": \"Загрузить отформатированные\",\n        \"saveButton\": \"Сохранить\",\n        \"invalidData\": \"Неверные JSON-данные\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Пользовательский список целевых процессов\",\n        \"descriptionInclusion\": \"Пользовательский список с дополнительными файлами exe или путями к ним, которые затронет модификация. Этот список будет добавлен к списку затронутых процессов, который определил сам автор модификации. То есть, модификация загружается для каждого процесса, только если путь совпадает с одним из списка целевых и не совпадает с любым из списка исключённых.\",\n        \"titleExclusion\": \"Пользовательский список исключённых\",\n        \"descriptionExclusion\": \"Пользовательский список с дополнительными файлами exe или путями к ним, которые модификация НЕ затронет. Этот список будет добавлен к списку исключения от автора модификации. То есть, модификация загружается для каждого процесса, только если путь совпадает с одним из списка целевых и не совпадает с любым из списка исключённых.\",\n        \"processListPlaceholder\": \"Имя процесса (exe)/пути, по одному в строке, например:\",\n        \"saveButton\": \"Сохранить\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Игнорировать списки целевых/исключённых модификаций\",\n        \"description\": \"Игнорировать списки целевых/исключённых процессов, установленных модом, и используйте только пользовательские списки, приведённые выше.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Изменения в последней версии\",\n      \"noData\": \"Установлена самая последняя версия.\",\n      \"splitView\": \"Раздельный просмотр\",\n      \"expandLines_one\": \"Раскрыть одну скрытую линию\",\n      \"expandLines_few\": \"Раскрыть {{count}} скрытые линии\",\n      \"expandLines_many\": \"Раскрыть {{count}} скрытых линий\",\n      \"expandLines_other\": \"Раскрыть {{count}} скрытых линий\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Искать модификации...\"\n  },\n  \"home\": {\n    \"browse\": \"Поиск модификаций\",\n    \"installedMods\": {\n      \"title\": \"Установленные модификации\",\n      \"noMods\": \"Модификации не установлены\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Рекомендованные модификации\",\n      \"noMods\": \"Нет рекомендованных модификаций, которые ещё не установлены\",\n      \"explore\": \"Искать другие модификации\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Популярные и с наивысшим рейтингом\",\n      \"popular\": \"Популярные\",\n      \"topRated\": \"С наивысшим рейтингом\",\n      \"newest\": \"Новые\",\n      \"lastUpdated\": \"Недавно обновленные\",\n      \"alphabeticalOrder\": \"Алфавитный порядок\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Язык\",\n      \"description\": \"Выберите желаемый язык интерфейса для Windhawk.\",\n      \"contribute\": \"<0>Добавить новый перевод</0>.\",\n      \"credits\": \"Русский перевод от <0>Сергея Крылова</0> с некоторыми правками от berry, а также от других членов сообщества.\",\n      \"creditsLink\": \"mailto:krylov.sn@nxt.ru\"\n    },\n    \"updates\": {\n      \"title\": \"Проверить обновления\",\n      \"description\": \"Периодически проверять наличие обновлений для Windhawk и установленных модификаций.\"\n    },\n    \"devMode\": {\n      \"title\": \"Режим разработчика\",\n      \"description\": \"Показать действия для разработчиков, например создание и редактирование модификаций.\"\n    },\n    \"advancedSettings\": \"Продвинутые параметры\",\n    \"hideTrayIcon\": {\n      \"title\": \"Скрыть иконку в трее\",\n      \"description\": \"Вам нужно отключить этот параметр для выхода из Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Требовать UAC для запуска Windhawk\",\n      \"description\": \"Windhawk нуждается в правах администратора, но для компьютеров с одним пользователем постоянные запросы от UAC надоедают, поэтому Windhawk их обходит. Включите этот параметр, чтобы вернуть UAC запросы на запуск Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Не показывать автоматически диалог меню\",\n      \"description\": \"По умолчанию Windhawk автоматически вызывает диалог меню когда обнаруживает, что панель задач не работает из-за нестабильности системы или другой причины. Диалог меню позволяет закрыть Windhawk, перейти в безопасный режим и совершать другие действия. Диалог меню можно также вызвать комбинацией клавиш Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Задержка диалога инициализации модификации\",\n      \"description\": \"Количество миллисекунд ожидания перед показом диалогового окна прогресса инициализации модификации.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Дополнительные продвинутые параметры\",\n      \"restartNotice\": \"Windhawk будет перезапущен для применения настроек.\",\n      \"saveButton\": \"Сохранить и перезапустить Windhawk\",\n      \"cancelButton\": \"Отмена\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Подробное логирование Windhawk\",\n      \"engineLoggingTitle\": \"Подробное логирование движка Windhawk\",\n      \"description\": \"Логи могут быть просмотрены, например утилитой DebugView.\",\n      \"none\": \"Нет\",\n      \"error\": \"Ошибка\",\n      \"verbose\": \"Подробно\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Список исключённых процессов\",\n      \"descriptionExclusion\": \"Список процессов/пути, в которые Windhawk не будет внедрять код. Может быть полезно в случаях, когда Windhawk несовместим с определённой программой. Обратите внимание, что добавление процесса в этот список не только не даст Windhawk его изменять, но и предотвратит Windhawk от перехвата дочерних процессов, созданных исключённым. Это вызовет задержку при загрузке модификаций в Windhawk.\",\n      \"titleInclusion\": \"Список целевых процессов\",\n      \"descriptionInclusion\": \"Список целевых процессов/путей, в которые Windhawk будет внедрять код, даже если они в списке исключённых.\",\n      \"inclusionWithoutExclusionNotice\": \"Список целевых процессов ничего не делает, если список исключённых процессов пуст.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Если вы хотите исключить все процессы, кроме этих, вы можете задать «*» в списке исключённых процессов.\",\n      \"processListPlaceholder\": \"Имя процесса (exe)/пути, по одному в строке, например:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk вер. {{version}}\",\n    \"beta\": \"бета\",\n    \"subtitle\": \"Маркетплейс для кастомизации программ Windows\",\n    \"credit\": \"Автор: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Доступно обновление\",\n      \"subtitle\": \"Обновите Windhawk для получения доступа к новейшим функциям и исправления ошибок\",\n      \"updateButton\": \"Подробнее\"\n    },\n    \"links\": {\n      \"title\": \"Ссылки\",\n      \"homepage\": \"Главная страница\",\n      \"documentation\": \"Документация\"\n    },\n    \"builtWith\": {\n      \"title\": \"Скомпилировано с\",\n      \"vscodium\": \"Версия от сообщества редактора VSCode от Microsoft\",\n      \"llvmMingw\": \"LLVM/Clang/LLD на базе среды mingw-w64\",\n      \"minHook\": \"Минималистичная API hooking библиотека для Windows\",\n      \"others\": \"Другие инструменты и библиотеки, а также немного написанного кода\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Установить {{mod}}\",\n    \"warningTitle\": \"Продолжайте осторожно\",\n    \"warningDescription\": \"Вредоносные модификации могут повредить ваш компьютер и нарушить вашу приватность. Устанавливайте модификации только от авторов, которым доверяете.\",\n    \"modAuthor\": \"Автор модификации\",\n    \"homepage\": \"Главная страница\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Твиттер)\",\n    \"verified\": \"подтверждён\",\n    \"verifiedTooltip\": \"Мы подтверждаем, что этот профиль принадлежит автору модификации, но обратите внимание, что <0>подтверждённый</0> не значит <0>доверенный</0>. Убедитесь, что вы доверяете автору модификации или тщательно проверьте исходный код перед установкой.\",\n    \"acceptButton\": \"Принять риск и продолжить\",\n    \"cancelButton\": \"Отмена\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Создать новую модификацию\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Создание и изменение модификаций требует некоторых знаний C/C++ в Windows. Если вы не понимаете о чём речь, возможно эти параметры не для вас.\",\n    \"hideOptionsCheckbox\": \"Спрятать все параметры для разработчиков\",\n    \"hideOptionsButton\": \"Спрятать параметры\",\n    \"beginCodingButton\": \"Начать писать код\",\n    \"cancelButton\": \"Отмена\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk работает в безопасном режиме, кастомизация программ отключена.\",\n    \"offButton\": \"Выключить безопасный режим\",\n    \"offConfirm\": \"Windhawk будет перезапущен для применения настроек.\",\n    \"offConfirmOk\": \"Перезапустить Windhawk\",\n    \"offConfirmCancel\": \"Отмена\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Действие недоступно в режиме просмотра\",\n    \"notCompiled\": \"Необходимо скомпилировать модификацию для просмотра\"\n  },\n  \"sidebar\": {\n    \"modId\": \"ID модификации\",\n    \"enableMod\": \"Включить модификацию\",\n    \"enableLogging\": \"Включить логирование\",\n    \"notCompiled\": \"необходимо скомпилировать модификацию\",\n    \"compile\": \"Скомпилировать модификацию\",\n    \"compilationFailed\": \"Компиляция не удалась\",\n    \"preview\": \"Просмотр модификации\",\n    \"showLogOutput\": \"Показать логи\",\n    \"exit\": \"Выйти из режима редактирования\",\n    \"exitConfirmation\": \"Изменения после последней успешной компиляции будут потеряны\",\n    \"exitButtonOk\": \"Выйти\",\n    \"exitButtonCancel\": \"Остаться\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/sv/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/sv/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Laddar...\",\n    \"loadingFailed\": \"Det gick inte att ladda, kontrollera din internetanslutning\",\n    \"loadingFailedTitle\": \"Det gick inte att ladda\",\n    \"loadingFailedSubtitle\": \"Kontrollera din internetanslutning och försök igen\",\n    \"tryAgain\": \"Försök igen\",\n    \"updating\": \"Uppdaterar...\",\n    \"installing\": \"Installerar...\",\n    \"compiling\": \"Kompileras...\",\n    \"cut\": \"Klipp ut\",\n    \"copy\": \"Kopiera\",\n    \"paste\": \"Klistra in\",\n    \"selectAll\": \"Markera allt\"\n  },\n  \"appHeader\": {\n    \"home\": \"Hem\",\n    \"explore\": \"Utforska\",\n    \"settings\": \"Inställningar\",\n    \"about\": \"Om\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Uppdatering tillgänglig\",\n    \"installed\": \"Installerad\",\n    \"details\": \"Detaljer\",\n    \"update\": \"Uppdatering\",\n    \"install\": \"Installera\",\n    \"compile\": \"Kompilera\",\n    \"disable\": \"Inaktivera\",\n    \"enable\": \"Aktivera\",\n    \"edit\": \"Redigera\",\n    \"fork\": \"Fork\",\n    \"remove\": \"Ta bort\",\n    \"removeConfirm\": \"Är du säker på att du vill ta bort denna mod?\",\n    \"removeConfirmOk\": \"Ta bort mod\",\n    \"removeConfirmCancel\": \"Avbryt\",\n    \"notCompiled\": \"Modden måste kompileras\",\n    \"editedLocally\": \"Modden har redigerats lokalt\",\n    \"noDescription\": \"(ingen beskrivning)\",\n    \"users_one\": \"{{formattedCount}} användare\",\n    \"users_other\": \"{{formattedCount}} användare\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Installerad version\",\n      \"latestVersion\": \"Senaste version\",\n      \"loading\": \"laddar...\",\n      \"loadingFailed\": \"laddningen misslyckades\",\n      \"modId\": \"Modd-identifierare\",\n      \"modVersion\": \"Modd-version\",\n      \"modAuthor\": {\n        \"title\": \"Modd-upphovsman\",\n        \"homepage\": \"Hemsida\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Alla processor\",\n        \"allBut\": \"Alla utom {{list}}\",\n        \"except\": \"{{included}} utom {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Målprocesser\",\n          \"excluded\": \"Uteslutna\"\n        }\n      },\n      \"updateNotNeeded\": \"Den installerade versionen är identisk med den senaste versionen\"\n    },\n    \"details\": {\n      \"title\": \"Detaljer\",\n      \"noData\": \"Modd-detaljer saknas.\"\n    },\n    \"settings\": {\n      \"title\": \"Inställningar\",\n      \"noData\": \"Inga tillgängliga modd-inställningar.\",\n      \"saveButton\": \"Spara inställningarna\",\n      \"sampleValue\": \"Exempelvärde\",\n      \"arrayItemAdd\": \"Lägg till nytt objekt\",\n      \"arrayItemRemove\": \"Ta bort objekt\"\n    },\n    \"code\": {\n      \"title\": \"Källkod\",\n      \"noData\": \"Modd-källa saknas.\",\n      \"collapseExtra\": \"Fäll ihop viktigt och inställningar\"\n    },\n    \"changelog\": {\n      \"title\": \"Ändringslogg\",\n      \"loadingFailed\": \"Det gick inte att läsa in ändringsloggen. <0>Klicka här</0> för att läsa den på GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Avancerat\",\n      \"debugLogging\": {\n        \"title\": \"Felsökningsloggning\",\n        \"description\": \"Kan vara användbart för att felsöka problem med modden.\",\n        \"none\": \"Inga\",\n        \"modLogs\": \"Modd-loggar\",\n        \"detailedLogs\": \"Detaljerade felsökningsloggar\",\n        \"showLogButton\": \"Visa loggutdata\"\n      },\n      \"modSettings\": {\n        \"title\": \"Modd-inställningar\",\n        \"description\": \"Exportera eller dela enkelt dina modd-inställningar.\",\n        \"loadButton\": \"Ladda\",\n        \"loadFormattedButton\": \"Ladda formaterad\",\n        \"saveButton\": \"Spara\",\n        \"invalidData\": \"Ogiltig JSON-data\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Anpassad processinkluderingslista\",\n        \"descriptionInclusion\": \"En anpassad lista över ytterligare körbara filnamn/sökvägar som modden kommer att fungera med. Listan läggs till i inkluderingslistan som mod-utvecklaren definierade för att avgöra vilka processer den ska fungera med. För varje process laddas modden om den körbara filsökvägen matchar en av inkluderingsposterna och inte matchar någon undantagspost.\",\n        \"titleExclusion\": \"Anpassad undantagslista för processer\",\n        \"descriptionExclusion\": \"En anpassad lista med ytterligare körbara filnamn/sökvägar som modden inte kommer att fungera med. Listan läggs till i undantagslistan som mod-utvecklaren definierade för att bestämma vilka processer den inte ska fungera med. För varje process laddas modden om den körbara filsökvägen matchar en av inkluderingsposterna och inte matchar någon undantagspost.\",\n        \"processListPlaceholder\": \"Processnamn/sökvägar, en per rad, till exempel:\",\n        \"saveButton\": \"Spara\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ignorera modd-inkluderings-/exkluderingslistor\",\n        \"description\": \"Ignorera moddens processinkluderings-/exkluderingslistor och använd endast de anpassade listorna ovan.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Senaste versionsändringar\",\n      \"noData\": \"Den installerade versionen är identisk med den senaste versionen.\",\n      \"splitView\": \"Delad vy\",\n      \"expandLines_one\": \"Expandera en dold rad\",\n      \"expandLines_other\": \"Expandera {{count}} dolda rader\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Sök efter moddar...\"\n  },\n  \"home\": {\n    \"browse\": \"Bläddra efter moddar\",\n    \"installedMods\": {\n      \"title\": \"Installerade moddar\",\n      \"noMods\": \"Inga moddar är installerade\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Utvalda moddar\",\n      \"noMods\": \"Det finns inga utvalda moddar som inte har installerats ännu\",\n      \"explore\": \"Utforska andra moddar\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Populär och högst rankad\",\n      \"popular\": \"Populär\",\n      \"topRated\": \"Högst rankad\",\n      \"newest\": \"Nyaste\",\n      \"lastUpdated\": \"Senast uppdaterade\",\n      \"alphabeticalOrder\": \"Alfabetisk ordning\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Språk\",\n      \"description\": \"Välj önskat visningsspråk för Windhawk.\",\n      \"contribute\": \"<0>Bidra med en ny översättning</0>.\",\n      \"credits\": \"Svensk översättning av <0>Sopor</0>.\",\n      \"creditsLink\": \"mailto:sopor@users.noreply.github.com\"\n    },\n    \"updates\": {\n      \"title\": \"Sök efter uppdateringar\",\n      \"description\": \"Kontrollera med jämna mellanrum efter nya versioner av Windhawk och de installerade moddarna.\"\n    },\n    \"devMode\": {\n      \"title\": \"Utvecklarläge\",\n      \"description\": \"Visa åtgärder för utvecklare som att skapa och ändra moddar.\"\n    },\n    \"advancedSettings\": \"Avancerade inställningar\",\n    \"hideTrayIcon\": {\n      \"title\": \"Dölj meddelandefältsikonen\",\n      \"description\": \"Du måste inaktivera det här alternativet för att avsluta Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Kräv UAC-förhöjda rättigheter för att köra Windhawk\",\n      \"description\": \"Windhawk kräver administratörsrättigheter, men för en enanvändardator kan det vara irriterande att se UAC-prompten varje gång, så Windhawk går förbi den. Aktivera det här alternativet för att kräva UAC-förhöjda rättigheter för att köra Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Visa inte dialogrutan för toolkit automatiskt\",\n      \"description\": \"Som standard visar Windhawk dialogrutan för toolkit automatiskt när den upptäcker att aktivitetsfältet inte är tillgängligt, antingen på grund av systeminstabilitet eller av annan anledning. Dialogruta för toolkit gör det möjligt att avsluta Windhawk, växla till säkert läge och göra andra operationer. Dialogruta för toolkit kan också visas med kortkommandot Ctrl-Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Fördröjning för modd-initialiseringsdialog\",\n      \"description\": \"Antal millisekunder att vänta innan förloppsdialogrutan visas för modd-initiering.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Fler avancerade inställningar\",\n      \"restartNotice\": \"Windhawk kommer att startas om för att verkställa inställningarna.\",\n      \"saveButton\": \"Spara och starta om Windhawk\",\n      \"cancelButton\": \"Avbryt\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk-loggning\",\n      \"engineLoggingTitle\": \"Windhawk-motorloggning\",\n      \"description\": \"Loggar kan till exempel ses med verktyget DebugView.\",\n      \"none\": \"Inga\",\n      \"error\": \"Fel\",\n      \"verbose\": \"Utförlig\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Processundantagslista\",\n      \"descriptionExclusion\": \"En lista över processnamn/sökvägar som Windhawk inte kommer att injiceras i. Kan vara användbart när Windhawk inte är kompatibel med ett specifikt program. Observera att om du lägger till en process i den här listan hindrars Windhawk från att anpassa den, men Windhawk hindras även från att fånga upp underordnade processer som den här processen skapar. Detta kommer i sådana fall att få Windhawk att ladda moddar med en liten fördröjning.\",\n      \"titleInclusion\": \"Processinkluderingslista\",\n      \"descriptionInclusion\": \"En lista över processnamn/sökvägar som Windhawk kommer att injicera i även om de finns i undantagslistan.\",\n      \"inclusionWithoutExclusionNotice\": \"Processinkluderingslistan har ingen effekt med en tom processundantagslista.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Om du menade att utesluta alla processer utom dessa, då kan du ställa in \\\"*\\\" i listan över processuteslutningar.\",\n      \"processListPlaceholder\": \"Processnamn/sökvägar, en per rad, till exempel:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Anpassningsmarknaden för Windows-program\",\n    \"credit\": \"Av <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"En uppdatering är tillgänglig\",\n      \"subtitle\": \"Överväg att uppdatera Windhawk för att få de senaste funktionerna och buggfixarna\",\n      \"updateButton\": \"Fler detaljer\"\n    },\n    \"links\": {\n      \"title\": \"Länkar\",\n      \"homepage\": \"Hemsida\",\n      \"documentation\": \"Dokumentation\"\n    },\n    \"builtWith\": {\n      \"title\": \"Byggd med\",\n      \"vscodium\": \"En samhällsdriven distribution av Microsofts VSCode-redigerare\",\n      \"llvmMingw\": \"En LLVM/Clang/LLD-baserad mingw-w64 verktygskedja\",\n      \"minHook\": \"Det minimalistiska API-hooking-biblioteket för Windows\",\n      \"others\": \"Andra verktyg och bibliotek och lite kod\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Installera {{mod}}\",\n    \"warningTitle\": \"Fortsätt, men ta det försiktigt\",\n    \"warningDescription\": \"Skadliga moddar kan skada din dator eller kränka din integritet. Installera endast moddar från utvecklare du litar på.\",\n    \"modAuthor\": \"Modd-utvecklare\",\n    \"homepage\": \"Hemsida\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"verifierad\",\n    \"verifiedTooltip\": \"Vi har verifierat att den här profilen tillhör modd-utvecklaren, men notera att <0>verifierad</0> inte är detsamma som <0>betrodd</0>. Se till att du litar på modd-utvecklaren eller inspektera källkoden noggrant innan du installerar.\",\n    \"acceptButton\": \"Acceptera risken och installera\",\n    \"cancelButton\": \"Avbryt\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Skapa en ny modd\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Att skapa och ändra moddar kräver viss kunskap om C/C++-utveckling för Windows. Om du inte är säker på vad det betyder är dessa alternativen säkert inget för dig.\",\n    \"hideOptionsCheckbox\": \"Dölj alla utvecklingsrelaterade alternativ\",\n    \"hideOptionsButton\": \"Dölj alternativ\",\n    \"beginCodingButton\": \"Börja koda\",\n    \"cancelButton\": \"Avbryt\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk körs i felsäkert läge och all kodinjektion är avstängd.\",\n    \"offButton\": \"Stäng av felsäkert läge\",\n    \"offConfirm\": \"Windhawk kommer att startas om för att verkställa inställningarna.\",\n    \"offConfirmOk\": \"Starta om Windhawk\",\n    \"offConfirmCancel\": \"Avbryt\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Åtgärden är inte tillgänglig i förhandsgranskningsläget\",\n    \"notCompiled\": \"Modden måste kompileras innan den kan förhandsgranskas\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Modd-identifierare\",\n    \"enableMod\": \"Aktivera modd\",\n    \"enableLogging\": \"Aktivera logging\",\n    \"notCompiled\": \"Modden måste kompileras\",\n    \"compile\": \"Kompilera modden\",\n    \"compilationFailed\": \"Kompileringen misslyckades\",\n    \"preview\": \"Förhandsgranska modden\",\n    \"showLogOutput\": \"Visa loggutdata\",\n    \"exit\": \"Avsluta redigeringsläge\",\n    \"exitConfirmation\": \"Ändringar sedan den senaste lyckade kompileringen kommer att gå förlorade\",\n    \"exitButtonOk\": \"Avsluta\",\n    \"exitButtonCancel\": \"Stanna kvar\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ta/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ta/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"ஏற்றுகிறது...\",\n    \"loadingFailed\": \"ஏற்றல் தோல்வியடைந்தது, உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும்\",\n    \"loadingFailedTitle\": \"ஏற்றல் தோல்வியடைந்தது\",\n    \"loadingFailedSubtitle\": \"தயவுசெய்து உங்கள் இணைய இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்\",\n    \"tryAgain\": \"மீண்டும் முயற்சிக்கவும்\",\n    \"updating\": \"புதுப்பிக்கிறது...\",\n    \"installing\": \"நிறுவுகிறது...\",\n    \"compiling\": \"கணக்கிடுகிறது...\",\n    \"cut\": \"வெட்டு\",\n    \"copy\": \"பிரதி எடு\",\n    \"paste\": \"ஒட்டு\",\n    \"selectAll\": \"அனைத்தையும் தேர்ந்தெடு\"\n  },\n  \"appHeader\": {\n    \"home\": \"முகப்பு\",\n    \"explore\": \"ஆராயவும்\",\n    \"settings\": \"அமைப்புகள்\",\n    \"about\": \"பற்றி\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"புதுப்பிப்பு கிடைக்கிறது\",\n    \"installed\": \"நிறுவப்பட்டது\",\n    \"details\": \"விவரங்கள்\",\n    \"update\": \"புதுப்பி\",\n    \"install\": \"நிறுவு\",\n    \"compile\": \"கணக்கிடு\",\n    \"disable\": \"முடக்கு\",\n    \"enable\": \"இயக்கு\",\n    \"edit\": \"தொகு\",\n    \"fork\": \"பிளவு\",\n    \"remove\": \"அகற்று\",\n    \"removeConfirm\": \"இந்த மாற்றத்தை நீங்கள் நிச்சயமாக அகற்ற விரும்புகிறீர்களா?\",\n    \"removeConfirmOk\": \"மாற்றத்தை அகற்று\",\n    \"removeConfirmCancel\": \"ரத்து செய்\",\n    \"notCompiled\": \"மாற்றம் கணக்கிடப்பட வேண்டும்\",\n    \"editedLocally\": \"மாற்றம் உள்ளூர் முறையில் திருத்தப்பட்டது\",\n    \"noDescription\": \"(விளக்கம் இல்லை)\",\n    \"users_one\": \"{{formattedCount}} பயனர்\",\n    \"users_other\": \"{{formattedCount}} பயனர்கள்\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"நிறுவப்பட்ட பதிப்பு\",\n      \"latestVersion\": \"புதிய பதிப்பு\",\n      \"loading\": \"ஏற்றுகிறது...\",\n      \"loadingFailed\": \"ஏற்றல் தோல்வியடைந்தது\",\n      \"modId\": \"மாற்ற அடையாளம்\",\n      \"modVersion\": \"மாற்றம் பதிப்பு\",\n      \"modAuthor\": {\n        \"title\": \"மாற்றம் எழுத்தாளர்\",\n        \"homepage\": \"முகப்பு பக்கம்\",\n        \"github\": \"கிட்ஹப்\",\n        \"twitter\": \"X (ட்விட்டர்)\"\n      },\n      \"processes\": {\n        \"all\": \"அனைத்து செயல்முறைகள்\",\n        \"allBut\": \"{{list}} தவிர\",\n        \"except\": \"{{included}} தவிர {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"இலக்கு செயல்முறைகள்\",\n          \"excluded\": \"விலக்கப்பட்டது\"\n        }\n      },\n      \"updateNotNeeded\": \"நிறுவப்பட்ட பதிப்பு மற்றும் புதிய பதிப்பு ஒரே மாதிரியானவை\"\n    },\n    \"details\": {\n      \"title\": \"விவரங்கள்\",\n      \"noData\": \"மாற்றம் விவரங்கள் இல்லை.\"\n    },\n    \"settings\": {\n      \"title\": \"அமைப்புகள்\",\n      \"noData\": \"மாற்றம் அமைப்புகள் இல்லை.\",\n      \"saveButton\": \"அமைப்புகளைச் சேமிக்கவும்\",\n      \"sampleValue\": \"மாதிரி மதிப்பு\",\n      \"arrayItemAdd\": \"புதிய உருப்படியைச் சேர்\",\n      \"arrayItemRemove\": \"உருப்படியை அகற்று\"\n    },\n    \"code\": {\n      \"title\": \"மூல குறியீடு\",\n      \"noData\": \"மாற்றத்தின் மூலக்குறியீடு இல்லை.\",\n      \"collapseExtra\": \"Readme மற்றும் அமைப்புகளை மடக்கு\"\n    },\n    \"changelog\": {\n      \"title\": \"மாற்றப்பட்ட பதிவுகள்\",\n      \"loadingFailed\": \"மாற்றப்பட்ட பதிவுகளை ஏற்ற முடியவில்லை. <0>இங்கே கிளிக் செய்யவும்</0> GitHub இல் பார்க்க.\"\n    },\n    \"advanced\": {\n      \"title\": \"மேம்பட்டவை\",\n      \"debugLogging\": {\n        \"title\": \"பிழை திருத்த பதிவுகள்\",\n        \"description\": \"மாற்றத்துடன் உள்ள சிக்கல்களை தீர்க்க இது பயனுள்ளதாக இருக்கலாம்.\",\n        \"none\": \"இல்லை\",\n        \"modLogs\": \"மாற்றம் பதிவுகள்\",\n        \"detailedLogs\": \"விவரமான பிழை திருத்த பதிவுகள்\",\n        \"showLogButton\": \"பதிவுகள் வெளியீட்டைக் காட்டு\"\n      },\n      \"modSettings\": {\n        \"title\": \"மாற்றம் அமைப்புகள்\",\n        \"description\": \"உங்கள் மாற்றம் அமைப்புகளை எளிதில் ஏற்றுமதி செய்யலாம் அல்லது பகிரலாம்.\",\n        \"loadButton\": \"ஏற்று\",\n        \"loadFormattedButton\": \"வடிவமைக்கப்பட்டதை ஏற்று\",\n        \"saveButton\": \"சேமி\",\n        \"invalidData\": \"தவறான JSON தரவு\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"தனிப்பயன் செயல்முறை சேர்க்கை பட்டியல்\",\n        \"descriptionInclusion\": \"மாற்றம் இலக்காக அமைக்கப்படும் கூடுதல் செயலியாக்கக்கூடிய கோப்புகளின் பெயர்கள்/பாதைகள் கொண்ட தனிப்பயன் பட்டியல். இது எழுத்தாளரால் வரையறுக்கப்பட்ட சேர்க்கை பட்டியலுடன் இணைக்கப்படும். செயல்முறை ஒரு சேர்க்கை பதிவுடன் பொருந்தினால் மற்றும் எந்த விலக்கு பதிவுடனும் பொருந்தவில்லை என்றால் மாற்றம் ஏற்றப்படும்.\",\n        \"titleExclusion\": \"தனிப்பயன் செயல்முறை விலக்கு பட்டியல்\",\n        \"descriptionExclusion\": \"மாற்றத்திலிருந்து விலக்கப்பட வேண்டிய கூடுதல் செயலியாக்கக்கூடிய கோப்புகளின் பெயர்கள்/பாதைகள் கொண்ட தனிப்பயன் பட்டியல். இது எழுத்தாளரால் வரையறுக்கப்பட்ட விலக்கு பட்டியலுடன் இணைக்கப்படும். செயல்முறை ஒரு சேர்க்கை பதிவுடன் பொருந்தினால் மற்றும் எந்த விலக்கு பதிவுடனும் பொருந்தவில்லை என்றால் மாற்றம் ஏற்றப்படும்.\",\n        \"processListPlaceholder\": \"ஒவ்வொன்றும் ஒரு வரியில் செயல்முறை பெயர்கள்/பாதைகள், எடுத்துக்காட்டாக:\",\n        \"invalidCharactersWarning\": \"செயல்முறை பட்டியலில் தவறான எழுத்துகள் உள்ளன: {{invalidCharacters}}\",\n        \"saveButton\": \"சேமிக்கவும்\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"மாற்றத்தின் சேர்க்கை/விலக்கு பட்டியல்களை புறக்கணிக்கவும்\",\n        \"description\": \"மேலே உள்ள தனிப்பயன் பட்டியல்களை மட்டும் பயன்படுத்தி, மாற்றத்தின் பட்டியல்களை புறக்கணிக்கவும்.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"முக்கிய சிஸ்டம் செயல்முறைகளுக்கான சேர்க்கை மாதிரிகளை பரிசீலனை செய்யவும்\",\n        \"description\": \"விரும்பத்தகுந்த முறையில், விண்ட்ஹாக் முக்கிய செயல்முறைகளில் மாதிரிகள் இல்லாமல் சேர்க்கப்பட்டால் மட்டுமே மாற்றங்களை ஏற்றுகிறது (உதா: <0>critical.exe</0>, ஆனால் <0>*</0> அல்லது <0>*.exe</0> அல்ல). மேலும் விபரங்களுக்கு <1>ஆவணங்களை</1> காணவும்.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"புதிய பதிப்பில் ஏற்பட்ட மாற்றங்கள்\",\n      \"noData\": \"நிறுவப்பட்ட பதிப்பு மற்றும் புதிய பதிப்பு ஒன்றே.\",\n      \"splitView\": \"பிளவுபார்வை\",\n      \"expandLines_one\": \"ஒரு மறைக்கப்பட்ட வரியை விரிவாக்கவும்\",\n      \"expandLines_other\": \"{{count}} மறைக்கப்பட்ட வரிகளை விரிவாக்கவும்\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"மாற்றங்களை தேடவும்...\"\n  },\n  \"home\": {\n    \"browse\": \"மாற்றங்களைத் தேடவும்\",\n    \"installedMods\": {\n      \"title\": \"நிறுவப்பட்ட மாற்றங்கள்\",\n      \"noMods\": \"எந்த மாற்றங்களும் நிறுவப்படவில்லை\"\n    },\n    \"featuredMods\": {\n      \"title\": \"சிறப்பு மாற்றங்கள்\",\n      \"noMods\": \"நிறுவப்படாத சிறப்பு மாற்றங்கள் எதுவும் இல்லை\",\n      \"explore\": \"மற்ற மாற்றங்களை ஆராயவும்\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"பிரபலமான மற்றும் சிறந்த மதிப்பீட்டுடன்\",\n      \"popular\": \"பிரபலமானவை\",\n      \"topRated\": \"சிறந்த மதிப்பீட்டுடன்\",\n      \"newest\": \"புதியவை\",\n      \"lastUpdated\": \"கடைசியாக புதுப்பிக்கப்பட்டவை\",\n      \"alphabeticalOrder\": \"அகர வரிசை\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"மொழி\",\n      \"description\": \"விண்ட்ஹாக் க்கான விருப்பமான காட்சிமொழியைத் தேர்ந்தெடுக்கவும்.\",\n      \"contribute\": \"<0>புதிய மொழிபெயர்ப்பை பங்களிக்கவும்</0>.\",\n      \"credits\": \"தமிழ் மொழிபெயர்ப்பு செய்தவர்: <0>JeevabharathiRK</0>.\",\n      \"creditsLink\": \"https://github.com/JeevabharathiRK\"\n    },\n    \"updates\": {\n      \"title\": \"புதுப்பிப்புகளை சரிபார்க்கவும்\",\n      \"description\": \"விண்ட்ஹாக் மற்றும் நிறுவப்பட்ட மாற்றங்களின் புதிய பதிப்புகளைக் காண மையமாகத்தோறும் சரிபார்க்கவும்.\"\n    },\n    \"devMode\": {\n      \"title\": \"டெவலப்பர் பயன்முறை\",\n      \"description\": \"மாற்றங்களை உருவாக்குவதற்கும் திருத்துவதற்குமான செயற்பாடுகளை காண்பிக்கவும்.\"\n    },\n    \"advancedSettings\": \"மேம்பட்ட அமைப்புகள்\",\n    \"hideTrayIcon\": {\n      \"title\": \"டிரே ஐகானை மறை\",\n      \"description\": \"விண்ட்ஹாக் இருந்து வெளியேற இந்த விருப்பத்தை முடக்க வேண்டும்.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"விண்ட்ஹாக் இயக்க UAC உயர்வை தேவைப்படுத்து\",\n      \"description\": \"விண்ட்ஹாக் நிர்வாக உரிமைகளை தேவைப்படுத்துகிறது, ஆனால் ஒற்றை பயனர் கணினிக்கு, ஒவ்வொரு முறையும் UAC எச்சரிக்கை வருவது தொந்தரவு தரலாம், எனவே விண்ட்ஹாக் அதை தவிர்க்கிறது. இந்த விருப்பத்தை இயக்கினால், இயக்கும் போது உயர்வை தேவையாக்கும்.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"கருவித்தொகுப்பு உரையாடலை தானாக காட்ட வேண்டாம்\",\n      \"description\": \"முன்னிருப்பாக, விண்ட்ஹாக் டாஸ்க்பார் அணுக முடியாத நிலையில் இருந்தால் கருவித்தொகுப்பு உரையாடலை தானாக காட்டும். இது விண்ட்ஹாக் ஐ முடிக்க, பாதுகாப்பு பயன்முறைக்கு மாற மற்றும் பிற செயல்களைச் செய்ய உதவுகிறது. Ctrl+Win+W குறுக்குவழி மூலம் இதை கைமுறையாகவும் திறக்கலாம்.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"மாற்றம் துவக்க உரையாடல் தாமதம்\",\n      \"description\": \"மாற்றம் துவக்கத்தின் போது முன்னேற்ற உரையாடலைக் காட்ட மில்லிசெக்கன்களில் காத்திருக்க வேண்டிய நேரம்.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"மேலும் மேம்பட்ட அமைப்புகள்\",\n      \"restartNotice\": \"அமைப்புகளை செயல்படுத்த விண்ட்ஹாக் மீண்டும் துவக்கப்படும்.\",\n      \"saveButton\": \"சேமித்து விண்ட்ஹாக் ஐ மீண்டும் துவக்கு\",\n      \"cancelButton\": \"ரத்து செய்\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"விண்ட்ஹாக் பதிவு விவரக்குறைவு\",\n      \"engineLoggingTitle\": \"விண்ட்ஹாக் என்ஜின் பதிவு விவரக்குறைவு\",\n      \"description\": \"பதிவுகளை DebugView போன்ற கருவியின் மூலம் காணலாம்.\",\n      \"none\": \"இல்லை\",\n      \"error\": \"பிழை\",\n      \"verbose\": \"விவரமாக\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"செயல்முறை விலக்கு பட்டியல்\",\n      \"descriptionExclusion\": \"விண்ட்ஹாக் செருக வேண்டாமென உள்ள செயல்முறை பெயர்கள்/பாதைகளின் பட்டியல். குறிப்பிட்ட நிரல்களுடன் விண்ட்ஹாக் பொருந்தாத நிலையில் இது உதவிகரமாக இருக்கும். இதில் சேர்க்கப்பட்ட செயல்முறைகள் அதன் பிள்ளை செயல்களை கூட அவதானிக்க முடியாது.\",\n      \"descriptionExclusionWiki\": \"செயல்முறைகளை விலக்குவது மற்றும் உள்ளமைந்த பட்டியல்கள் பற்றி மேலும் தெரிந்து கொள்ள <0>ஆவணங்களை</0> பார்க்கவும்.\",\n      \"excludeCriticalProcesses\": \"முக்கிய செயல்முறைகளை விலக்கு\",\n      \"excludeIncompatiblePrograms\": \"தொல்லை தரும் நிரல்களை விலக்கு\",\n      \"excludeGames\": \"நன்கு அறியப்பட்ட விளையாட்டுகளை விலக்கு\",\n      \"titleInclusion\": \"செயல்முறை சேர்க்கை பட்டியல்\",\n      \"descriptionInclusion\": \"விலக்கப்பட்ட பட்டியலில் இருந்தாலும் விண்ட்ஹாக் செருக வேண்டிய செயல்முறை பெயர்கள்/பாதைகள்.\",\n      \"inclusionWithoutExclusionNotice\": \"விலக்கப்பட்ட பட்டியல் இல்லாமல் சேர்க்கை பட்டியல் வேலை செய்யாது.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"மற்ற அனைத்தையும் விலக்க விரும்பினால், விலக்கு பட்டியலில் \\\"*\\\" ஐ சேர்க்கவும்.\",\n      \"processListPlaceholder\": \"ஒவ்வொன்றும் ஒரு வரியில் செயல்முறை பெயர்கள்/பாதைகள், எடுத்துக்காட்டாக:\",\n      \"invalidCharactersWarning\": \"செயல்முறை பட்டியலில் தவறான எழுத்துகள் உள்ளன: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"விண்ட்ஹாக் v{{version}}\",\n    \"beta\": \"பீட்டா\",\n    \"subtitle\": \"Windows மற்றும் நிரல்களுக்கான தனிப்பயனாக்க சந்தை\",\n    \"credit\": \"இயற்றியவர் <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"புதுப்பிப்பு கிடைக்கிறது\",\n      \"subtitle\": \"புதிய அம்சங்கள் மற்றும் பிழை திருத்தங்களுக்கு விண்ட்ஹாக் ஐ புதுப்பிக்க பரிந்துரை செய்யப்படுகிறது\",\n      \"updateButton\": \"மேலும் விபரங்கள்\"\n    },\n    \"links\": {\n      \"title\": \"இணைப்புகள்\",\n      \"homepage\": \"முகப்பு பக்கம்\",\n      \"documentation\": \"ஆவணங்கள்\"\n    },\n    \"builtWith\": {\n      \"title\": \"பயன்படுத்திய கருவிகள்\",\n      \"vscodium\": \"மைக்ரோசாப்டின் VSCode ஐ அடிப்படையாக கொண்ட சமூக இயக்கும் தொகுப்பி\",\n      \"llvmMingw\": \"LLVM/Clang/LLD அடிப்படையிலான mingw-w64 கருவி தொகுப்பு\",\n      \"minHook\": \"Windows க்கான குறைந்தபட்ச API ஹூக்கிங் நூலகம்\",\n      \"others\": \"பிற கருவிகள் மற்றும் நூலகங்கள், மேலும் கொஞ்சம் குறியீடு\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"{{mod}} ஐ நிறுவுக\",\n    \"warningTitle\": \"கவனத்துடன் தொடரவும்\",\n    \"warningDescription\": \"தீங்கான மாற்றங்கள் உங்கள் கணினிக்கு சேதம் செய்யலாம் அல்லது உங்கள் தனிப்பட்ட தகவல்களை மீறலாம். நம்பிக்கையுடன் உள்ள எழுத்தாளர்களிடமிருந்து மட்டுமே மாற்றங்களை நிறுவுங்கள்.\",\n    \"modAuthor\": \"மாற்ற எழுத்தாளர்\",\n    \"homepage\": \"முகப்பு பக்கம்\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (ட்விட்டர்)\",\n    \"verified\": \"சரிபார்க்கப்பட்டது\",\n    \"verifiedTooltip\": \"இந்த சுயவிவரம் மாற்ற எழுத்தாளருக்கே சேர்ந்ததாக நாம் உறுதி செய்துள்ளோம். ஆனால் <0>சரிபார்க்கப்பட்டது</0> என்பது <0>நம்பத்தகுந்தது</0> என்பதுடன் சமமாக இல்லை. நீங்கள் எழுத்தாளரை நம்புகிறீர்களா என்பதை உறுதி செய்யவும், இல்லையெனில் மூலக் குறியீட்டை நன்றாக ஆய்வு செய்யவும்.\",\n    \"acceptButton\": \"அபாயத்தை ஏற்று நிறுவவும்\",\n    \"cancelButton\": \"ரத்து செய்\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"புதிய மாற்றம் உருவாக்கவும்\"\n  },\n  \"devModeAction\": {\n    \"message\": \"மாற்றங்களை உருவாக்க மற்றும் திருத்த C/C++ பற்றிய அறிவு தேவைப்படும். இதைப்பற்றி தெளிவில்லை என்றால், இவ்விருப்பங்கள் உங்களுக்கு பொருத்தமில்லாமல் இருக்கலாம்.\",\n    \"hideOptionsCheckbox\": \"மேம்பாட்டு தொடர்பான விருப்பங்களை மறைக்கவும்\",\n    \"hideOptionsButton\": \"விருப்பங்களை மறைக்கவும்\",\n    \"beginCodingButton\": \"குறியீட்டாக்கத் தொடங்கவும்\",\n    \"cancelButton\": \"ரத்து செய்\"\n  },\n  \"safeMode\": {\n    \"alert\": \"விண்ட்ஹாக் பாதுகாப்பு பயன்முறையில் இயங்குகிறது, அனைத்து குறியீடு செருகல் செயல்பாடுகளும் முடக்கப்பட்டுள்ளன.\",\n    \"offButton\": \"பாதுகாப்பு பயன்முறையை அணைக்கவும்\",\n    \"offConfirm\": \"அமைப்புகளைச் செயல்படுத்த விண்ட்ஹாக் மீண்டும் துவங்கும்.\",\n    \"offConfirmOk\": \"விண்ட்ஹாக் ஐ மீண்டும் துவக்கு\",\n    \"offConfirmCancel\": \"ரத்து செய்\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"இந்த செயல் முன்னோட்ட பயன்முறையில் கிடைக்கவில்லை\",\n    \"notCompiled\": \"மாற்றம் முன்னோட்டம் காணும் முன் கணக்கிடப்பட வேண்டும்\"\n  },\n  \"sidebar\": {\n    \"modId\": \"மாற்ற அடையாளம்\",\n    \"enableMod\": \"மாற்றத்தை இயக்கவும்\",\n    \"enableLogging\": \"பதிவை இயக்கவும்\",\n    \"notCompiled\": \"மாற்றம் கணக்கிடப்படவில்லை\",\n    \"compile\": \"மாற்றத்தை கணக்கிடு\",\n    \"compilationFailed\": \"கணக்கீடு தோல்வியடைந்தது\",\n    \"preview\": \"மாற்றம் முன்னோட்டம்\",\n    \"showLogOutput\": \"பதிவு வெளியீட்டை காட்டு\",\n    \"exit\": \"திருத்தும் முறையிலிருந்து வெளியேறு\",\n    \"exitConfirmation\": \"கடைசி வெற்றிகரமான கணக்கீட்டுக்கு பிறகு செய்யப்பட்ட மாற்றங்கள் இழக்கப்படும்\",\n    \"exitButtonOk\": \"வெளியேறு\",\n    \"exitButtonCancel\": \"தங்கு\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/th/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/th/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"กำลังโหลด...\",\n    \"loadingFailed\": \"ไม่สามารถโหลดได้ โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ\",\n    \"loadingFailedTitle\": \"ไม่สามารถโหลดได้\",\n    \"loadingFailedSubtitle\": \"โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณและลองอีกครั้ง\",\n    \"tryAgain\": \"ลองอีกครั้ง\",\n    \"updating\": \"กำลังอัปเดต...\",\n    \"installing\": \"กำลังติดตั้ง...\",\n    \"compiling\": \"กำลังคอมไพล์...\",\n    \"cut\": \"ตัด\",\n    \"copy\": \"คัดลอก\",\n    \"paste\": \"วาง\",\n    \"selectAll\": \"เลือกทั้งหมด\"\n  },\n  \"appHeader\": {\n    \"home\": \"หน้าหลัก\",\n    \"explore\": \"สำรวจ\",\n    \"settings\": \"การตั้งค่า\",\n    \"about\": \"เกี่ยวกับ\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"อัปเดตพร้อมให้ใช้งาน\",\n    \"installed\": \"ติดตั้งแล้ว\",\n    \"details\": \"รายละเอียด\",\n    \"update\": \"อัปเดต\",\n    \"install\": \"ติดตั้ง\",\n    \"compile\": \"คอมไพล์\",\n    \"disable\": \"ปิด\",\n    \"enable\": \"เปิด\",\n    \"edit\": \"แก้ไข\",\n    \"fork\": \"แยกไปสร้างใหม่\",\n    \"remove\": \"ลบ\",\n    \"removeConfirm\": \"คุณแน่ใจหรือไม่ว่าต้องการลบม็อดนี้\",\n    \"removeConfirmOk\": \"ลบม็อด\",\n    \"removeConfirmCancel\": \"ยกเลิก\",\n    \"notCompiled\": \"ม็อดจำเป็นต้องได้รับการคอมไพล์\",\n    \"editedLocally\": \"ม็อดถูกแก้ไขในเครื่อง\",\n    \"noDescription\": \"(ไม่มีคำอธิบาย)\",\n    \"users_one\": \"ผู้ใช้ {{formattedCount}} คน\",\n    \"users_other\": \"ผู้ใช้ {{formattedCount}} คน\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"เวอร์ชั่นที่ติดตั้งไว้\",\n      \"latestVersion\": \"เวอร์ชั่นล่าสุด\",\n      \"loading\": \"กำลังโหลด...\",\n      \"loadingFailed\": \"โหลดไม่สำเร็จ\",\n      \"modId\": \"ตัวระบุม็อด\",\n      \"modVersion\": \"เวอร์ชั่นของม็อด\",\n      \"modAuthor\": {\n        \"title\": \"ผู้สร้างม็อด\",\n        \"homepage\": \"หน้าหลัก\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"กระบวนการทั้งหมด\",\n        \"allBut\": \"กระบวนการทั้งหมด ยกเว้น {{list}}\",\n        \"except\": \"{{included}} ยกเว้น {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"กระบวนการเป้าหมาย\",\n          \"excluded\": \"กระบวนการที่ยกเว้น\"\n        }\n      },\n      \"updateNotNeeded\": \"เวอร์ชั่นที่ติดตั้งไว้เหมือนกับเวอร์ชั่นล่าสุด\"\n    },\n    \"details\": {\n      \"title\": \"รายละเอียด\",\n      \"noData\": \"ไม่มีรายละเอียดของม็อดนี้\"\n    },\n    \"settings\": {\n      \"title\": \"การตั้งค่า\",\n      \"noData\": \"ไม่มีการตั้งค่าใด ๆ ของม็อดนี้\",\n      \"saveButton\": \"บันทึกการตั้งค่า\",\n      \"sampleValue\": \"ค่าตัวอย่าง\",\n      \"arrayItemAdd\": \"เพิ่มไอเท็มใหม่\",\n      \"arrayItemRemove\": \"ลบไอเท็ม\"\n    },\n    \"code\": {\n      \"title\": \"โค้ดต้นฉบับ\",\n      \"noData\": \"ไม่มีโค้ดต้นฉบับของม็อดนี้\",\n      \"collapseExtra\": \"ยุบ Readme และการตั้งค่าต่าง ๆ\"\n    },\n    \"changelog\": {\n      \"title\": \"บันทึกการเปลี่ยนแปลง\",\n      \"loadingFailed\": \"ไม่สามารถโหลดบันทึกการเปลี่ยนแปลงได้ <0>กดที่นี่</0>เพื่อดูบันทึกการเปลี่ยนแปลงบน GitHub\"\n    },\n    \"advanced\": {\n      \"title\": \"ขั้นสูง\",\n      \"debugLogging\": {\n        \"title\": \"การบันทึกข้อมูลดีบั๊ก\",\n        \"description\": \"มีประโยชน์สำหรับสำหรับการแก้ไขปัญหาเกี่ยวกับม็อด\",\n        \"none\": \"ไม่มี\",\n        \"modLogs\": \"ข้อมูลของม็อดที่บันทึกเอาไว้\",\n        \"detailedLogs\": \"รายละเอียดข้อมูลของม็อดที่บันทึกเอาไว้\",\n        \"showLogButton\": \"แสดงผลการบันทึก\"\n      },\n      \"modSettings\": {\n        \"title\": \"การตั้งค่าของม็อด\",\n        \"description\": \"ส่งออกหรือแชร์การตั้งค่าของม็อดได้อย่างง่ายดาย\",\n        \"loadButton\": \"โหลด\",\n        \"loadFormattedButton\": \"โหลดพร้อมรูปแบบ\",\n        \"saveButton\": \"บันทึก\",\n        \"invalidData\": \"ข้อมูล JSON ไม่ถูกต้อง\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"รายการกระบวนการที่ถูกรวมที่กำหนดเอง\",\n        \"descriptionInclusion\": \"รายการชื่อหรือเส้นทางของกระบวนการเพิ่มเติมที่ม็อดจะตั้งเป้าหมาย รายการนี้จะถูกรวมลงไปในรายการกระบวนการที่ถูกรวมที่ผู้สร้างม็อดกำหนดเอาไว้แล้ว สำหรับแต่ละกระบวนการ ม็อดจะถูกโหลดถ้าเส้นทางของกระบวนการตรงกับหนึ่งในกระบวนการที่รวมไว้และไม่ตรงกับกระบวนการที่ยกเว้นไว้\",\n        \"titleExclusion\": \"รายการกระบวนการที่ถูกยกเว้นที่กำหนดเอง\",\n        \"descriptionExclusion\": \"รายการชื่อหรือเส้นทางของกระบวนการเพิ่มเติมที่ม็อดจะถูกยกเว้นไม่ให้เป้าหมาย รายการนี้จะถูกรวมลงไปในรายการกระบวนการที่ถูกยกเว้นที่ผู้สร้างม็อดกำหนดเอาไว้แล้ว สำหรับแต่ละกระบวนการ ม็อดจะถูกโหลดถ้าเส้นทางของกระบวนการตรงกับหนึ่งในกระบวนการที่รวมไว้และไม่ตรงกับกระบวนการที่ยกเว้นไว้\",\n        \"processListPlaceholder\": \"ชื่อหรือเส้นทางของกระบวนการ หนึ่งกระบวนการต่อหนึ่งบรรทัด ตัวอย่าง:\",\n        \"invalidCharactersWarning\": \"รายการกระบวนการมีตัวอักษรที่ไม่ถูกต้อง ซึ่งจะถูกตัดออก: {{invalidCharacters}}\",\n        \"saveButton\": \"บันทึก\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"ไม่สนใจรายการกระบวนการที่ถูกรวม/ยกเว้นที่กำหนดโดยม็อด\",\n        \"description\": \"ไม่สนใจรายการกระบวนการที่ถูกรวม/ยกเว้นที่กำหนดโดยม็อดและใช้แต่รายการที่กำหนดเองตามข้างบน\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"พิจารณารูปแบบรายการกระบวนการที่ถูกรวมสำหรับกระบวนการระบบที่สำคัญ\",\n        \"description\": \"โดยปกติ Windhawk จะโหลดม็อดในกระบวนการระบบที่สำคัญถ้ากระบวนการไม่รวมอยู่ในรูปแบบต่าง ๆ เท่านั้น เช่น <0>critical.exe</0> ไม่ใช่ <0>*</0> หรือ <0>*.exe</0> สำหรับรายละเอียดเกี่ยวกับกระบวนการระบบที่สำคัญ โปรดอ่าน<0>เอกสาร</0>\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"การเปลี่ยนแปลงเวอร์ชั่นล่าสุด\",\n      \"noData\": \"เวอร์ชั่นที่ติดตั้งไว้เหมือนกับเวอร์ชั่นล่าสุด\",\n      \"splitView\": \"มุมมองแยก\",\n      \"expandLines_one\": \"ขยายหนึ่งบรรทัดที่ซ่อนอยู่\",\n      \"expandLines_other\": \"ขยาย {{count}} บรรทัดที่ซ่อนอยู่\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"ค้นหาม็อด...\"\n  },\n  \"home\": {\n    \"browse\": \"สำรวจม็อด\",\n    \"installedMods\": {\n      \"title\": \"ม็อดที่ติดตั้งไว้\",\n      \"noMods\": \"ไม่มีม็อดที่ติดตั้งไว้\"\n    },\n    \"featuredMods\": {\n      \"title\": \"ม็อดที่แนะนำ\",\n      \"noMods\": \"คุณไม่มีม็อดที่แนะนำตัวไหนที่ถูกติดตั้ง\",\n      \"explore\": \"สำรวจม็อดอื่นๆ\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"ยอดนิยมและอันดับสูงสุด\",\n      \"popular\": \"ยอดนิยม\",\n      \"topRated\": \"อันดับสูงสุด\",\n      \"newest\": \"ใหม่ที่สุด\",\n      \"lastUpdated\": \"อัปเดตครั้งล่าสุด\",\n      \"alphabeticalOrder\": \"ลำดับตัวอักษร\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"ภาษา\",\n      \"description\": \"เลือกภาษาที่คุณต้องการแสดงสำหรับ Windhawk\",\n      \"contribute\": \"<0>ร่วมแปลภาษาใหม่</0>.\",\n      \"credits\": \"Thai translation by <0>achia70</0>.\",\n      \"creditsLink\": \"https://github.com/achia70\"\n    },\n    \"updates\": {\n      \"title\": \"ตรวจสอบการอัปเดต\",\n      \"description\": \"ตรวจสอบเวอร์ชั่นที่ใหม่กว่าของ Windhawk และม็อดที่ติดตั้งไว้เป็นระยะ ๆ\"\n    },\n    \"devMode\": {\n      \"title\": \"โหมดผู้พัฒนา\",\n      \"description\": \"แสดงตัวเลือกสำหรับผู้พัฒนา เช่นการสร้างและการแก้ไขม็อด\"\n    },\n    \"advancedSettings\": \"การตั้งค่าขั้นสูง\",\n    \"hideTrayIcon\": {\n      \"title\": \"ซ่อนไอคอนถาด\",\n      \"description\": \"ปิดใช้งานตัวเลือกนี้เพื่อออกจาก Windhawk\"\n    },\n    \"requireElevation\": {\n      \"title\": \"ต้องมีการควบคุมบัญชีผู้ใช้ (UAC) สำหรับการเรียกใช้ Windhawk\",\n      \"description\": \"Windhawk ต้องมีสิทธิ์ผู้ดูแลระบบ แต่สำหรับคอมพิวเตอร์ที่มีผู้ใช้คนเดียว Windhawk จะหลีกเลี่ยงไม่ให้แสดงการแจ้งเตือนการควบคุมบัญชีผู้ใช้เพื่อลดความรำคาญ เปิดใช้งานตัวเลือกนี้หากคุณต้องการให้มีการควบคุมบัญชีผู้ใช้ (UAC) สำหรับการเรียกใช้ Windhawk\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"ไม่ต้องแสดงกล่องโต้ตอบชุดเครื่องมือโดยอัตโนมัติ\",\n      \"description\": \"โดยปกติ Windhawk แสดงกล่องโต้ตอบชุดเครื่องมือโดยอัตโนมัติเมื่อมีการตรวจพบว่าไม่สามารถเข้าถึงแถบงานได้ อาจเกิดจากความไม่เสถียรของระบบหรือเหตุผลอื่นๆ กล่องโต้ตอบชุดเครื่องมือนี้อนุญาตให้ออกจาก Windhawk เปลี่ยนไปใช้โหมดความปลอดภัย และดำเนินการสิ่งอื่น ๆ ได้ ยังสามารถแสดงกล่องโต้ตอบชุดเครื่องมือได้โดยใช้แป้นพิมพ์ลัด Ctrl+Win+W\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"การหน่วงเวลาของกล่องโต้ตอบการเริ่มต้นม็อด\",\n      \"description\": \"จำนวนมิลลิวินาทีในการรอก่อนที่จะโชว์กล่องโต้ตอบความคืบหน้าสำหรับการเริ่มต้นม็อด\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"การตั้งค่าขั้นสูงยิ่งขึ้น\",\n      \"restartNotice\": \"Windhawk จะถูกรีสตาร์ทเพื่อนำการตั้งค่าไปใช้.\",\n      \"saveButton\": \"บันทึกการตั้งค่า และรีสตาร์ท Windhawk\",\n      \"cancelButton\": \"ยกเลิก\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"ความละเอียดของการบันทึกข้อมูลของ Windhawk\",\n      \"engineLoggingTitle\": \"ความละเอียดของการบันทึกข้อมูลของเอนจิน Windhawk\",\n      \"description\": \"ข้อมูลที่บันทึกสามารถดูได้ด้วยเครื่องมือต่าง ๆ ได้แก่ DebugView\",\n      \"none\": \"ไม่มี\",\n      \"error\": \"เฉพาะข้อผิดพลาด (error)\",\n      \"verbose\": \"ละเอียด (verbose)\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"รายการกระบวนการที่ถูกยกเว้น\",\n      \"descriptionExclusion\": \"รายการชื่อหรือเส้นทางของกระบวนการที่จะไม่ถูกเจาะโดย Windhawk มีประโยชน์ในกรณีที่ Windhawk เข้ากันไม่ได้กับโปรแกรมเฉพาะ โปรดทราบว่าการเพิ่มกระบวนการลงไปในรายการนี้ไม่เพียงแต่จะป้องกันไม่ให้ Windhawk ปรับแต่งกระบวนการนั้น ๆ แต่ยังจะป้องกันไม่ให้ Windhawk เข้าไปสกัดกระบวนการลูกที่กระบวนการนั้น ๆ ได้สร้างเอาไว้ ในกรณีนี้อาจจะทำให้ Windhawk โหลดม็อดด้วยความล่าช้าเล็กน้อย\",\n      \"descriptionExclusionWiki\": \"สำหรับรายละเอียดเกี่ยวกับการยกเว้นกระบวนการและรายละเอียดเกี่ยวกับรายการกระบวนการที่ถูกยกเว้นในตัว โปรดอ่าน<0>เอกสาร</0>\",\n      \"excludeCriticalProcesses\": \"ยกเว้นกระบวนการระบบที่สำคัญ\",\n      \"excludeIncompatiblePrograms\": \"ยกเว้นโปรแกรมที่ถูกรายงานว่าเข้ากันไม่ได้\",\n      \"excludeGames\": \"ยกเว้นเกมที่ถูกรายงาน\",\n      \"titleInclusion\": \"รายการกระบวนการที่ถูกรวม\",\n      \"descriptionInclusion\": \"รายการชื่อหรือเส้นทางของกระบวนการที่จะถูกเจาะโดย Windhawk ถึงแม้กระบวนการนั้นจะอยู่ในรายการกระบวนการที่ถูกยกเว้น\",\n      \"inclusionWithoutExclusionNotice\": \"รายการนี้ไม่มีผลต่อรายการกระบวนการที่ถูกยกเว้นที่ว่างเปล่า\",\n      \"inclusionWithoutTotalExclusionNotice\": \"หากคุณต้องการยกเว้นกระบวนการทั้งหมดยกเว้นกระบวนการพวกนี้ คุณสามารถตั้งค่ารายการกระบวนกรที่ถูกยกเว้นให้เป็น \\\"*\\\"\",\n      \"processListPlaceholder\": \"ชื่อหรือเส้นทางของกระบวนการ หนึ่งกระบวนการต่อหนึ่งบรรทัด ตัวอย่าง:\",\n      \"invalidCharactersWarning\": \"รายการกระบวนการมีตัวอักษรที่ไม่ถูกต้อง ซึ่งจะถูกตัดออก: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"เบต้า\",\n    \"subtitle\": \"โปรแกรมรวบรวมการปรับแต่งสำหรับ Windows และโปรแกรมต่าง ๆ\",\n    \"credit\": \"โดย <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"มีการอัปเดตที่พร้อมใช้งาน\",\n      \"subtitle\": \"อัปเดต Windhawk เพื่อรับคุณสมบัติล่าสุดและการแก้ไขข้อบกพร่อง\",\n      \"updateButton\": \"รายละเอียดเพิ่มเติม\"\n    },\n    \"links\": {\n      \"title\": \"ลิงก์\",\n      \"homepage\": \"หน้าหลัก\",\n      \"documentation\": \"เอกสาร\"\n    },\n    \"builtWith\": {\n      \"title\": \"สร้างด้วย\",\n      \"vscodium\": \"การกระจาย VSCode Editor ของ Microsoft ที่ขับเคลื่อนโดยชุมชน\",\n      \"llvmMingw\": \"ชุดเครื่องมือ mingw-w64 ที่ใช้ LLVM/Clang/LLD\",\n      \"minHook\": \"ไลบรารีการเชื่อมต่อ API ที่เรียบง่ายสำหรับ Windows\",\n      \"others\": \"เครื่องมือและไลบรารี่อื่นๆ กับโค้ดอีกเล็กน้อย\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"ติดตั้ง {{mod}}\",\n    \"warningTitle\": \"ดำเนินการอย่างมีสติ\",\n    \"warningDescription\": \"ม็อดที่เป็นอันตรายสามารถสร้างความเสียหายให้กับคอมพิวเตอร์ของคุณหรือละเมิดความเป็นส่วนตัวของคุณได้ ควรติดตั้งม็อดจากผู้สร้างที่คุณเชื่อถือเท่านั้น\",\n    \"modAuthor\": \"ผู้สร้างม็อด\",\n    \"homepage\": \"หน้าหลัก\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"ยืนยันแล้ว\",\n    \"verifiedTooltip\": \"เรายืนยันแล้วว่าโปรไฟล์นี้เป็นของผู้สร้างม็อด แต่โปรดทราบว่าถึงแม้จะ<0>มีการยืนยันแล้ว</0>ไม่ได้หมายความว่าจะ</0>มีความน่าเชื่อถือ</0>เสมอไป อย่าลืมตรวจสอบด้วยว่าผู้สร้างมีความน่าเชื่อถือหรือไม่ หรือตรวจสอบโค้ดต้นฉบับให้ดีก่อนติดตั้ง\",\n    \"acceptButton\": \"ยอมรับความเสี่ยงและติดตั้ง\",\n    \"cancelButton\": \"ยกเลิก\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"สร้างม็อดใหม่\"\n  },\n  \"devModeAction\": {\n    \"message\": \"การสร้างหรือแก้ไขม็อดนั้นต้องมีความรู้เกี่ยวกับการพัฒนา C/C++ สำหรับ Windows อยู่บ้าง หากคุณไม่เข้าใจว่าตามนี้หมายถึงอะไร บางทีตัวเลือกเหล่านี้อาจไม่เหมาะกับคุณ\",\n    \"hideOptionsCheckbox\": \"ซ่อนตัวเลือกที่เกี่ยวกับการพัฒนาทั้งหมด\",\n    \"hideOptionsButton\": \"ซ่อนตัวเลือก\",\n    \"beginCodingButton\": \"เริ่มการโค้ด\",\n    \"cancelButton\": \"ยกเลิก\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk กำลังทำงานอยู่ในโหมดปลอดภัย ฟังก์ชั่นการเจาะโค้ดทั้งหมดถูกปิด\",\n    \"offButton\": \"ปิดโหมดปลอดภัย\",\n    \"offConfirm\": \"Windhawk จะถูกรีสตาร์ทเพื่อนำการตั้งค่าไปใช้\",\n    \"offConfirmOk\": \"รีสตาร์ท Windhawk\",\n    \"offConfirmCancel\": \"ยกเลิก\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"การกระทำไม่พร้อมใช้งานในโหมดตัวอย่าง\",\n    \"notCompiled\": \"ม็อดจำเป็นต้องได้รับการคอมไพล์ก่อนจึงจะได้รับการดูตัวอย่างได้\"\n  },\n  \"sidebar\": {\n    \"modId\": \"ตัวระบุม็อด\",\n    \"enableMod\": \"เปิดม็อด\",\n    \"enableLogging\": \"เปิดการบันทึก (logging)\",\n    \"notCompiled\": \"ม็อดจำเป็นต้องได้รับการคอมไพล์\",\n    \"compile\": \"คอมไพล์ม็อด\",\n    \"compilationFailed\": \"ไม่สามารถคอมไพล์ได้\",\n    \"preview\": \"ดูตัวอย่างม็อด\",\n    \"showLogOutput\": \"ดูผลการบันทึก\",\n    \"exit\": \"ออกจากโหมดการแก้ไข\",\n    \"exitConfirmation\": \"การเปลี่ยนแปลงนับตั้งแต่การคอมไพล์ครั้งล่าสุดที่สำเร็จจะหายไป\",\n    \"exitButtonOk\": \"ออก\",\n    \"exitButtonCancel\": \"อยู่ต่อ\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Yükleniyor...\",\n    \"loadingFailed\": \"Yükleme başarısız, lütfen internet bağlantınızı kontrol edin\",\n    \"loadingFailedTitle\": \"Yükleme başarısız\",\n    \"loadingFailedSubtitle\": \"Lütfen internet bağlantınızı kontrol edin ve tekrar deneyin\",\n    \"tryAgain\": \"Tekrar dene\",\n    \"updating\": \"Güncelleniyor...\",\n    \"installing\": \"Yükleniyor...\",\n    \"compiling\": \"Derleniyor...\"\n  },\n  \"appHeader\": {\n    \"home\": \"Ana Sayfa\",\n    \"explore\": \"Keşfet\",\n    \"settings\": \"Ayarlar\",\n    \"about\": \"Hakkında\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Güncelleme mevcut\",\n    \"installed\": \"Yüklendi\",\n    \"details\": \"Ayrıntılar\",\n    \"update\": \"Güncelle\",\n    \"install\": \"Yükle\",\n    \"compile\": \"Derle\",\n    \"disable\": \"Devre dışı bırak\",\n    \"enable\": \"Etkinleştir\",\n    \"edit\": \"Düzenle\",\n    \"fork\": \"Çatal\",\n    \"remove\": \"Kaldır\",\n    \"removeConfirm\": \"Bu modu kaldırmak istediğinizden emin misiniz??\",\n    \"removeConfirmOk\": \"Modu kaldır\",\n    \"removeConfirmCancel\": \"İptal\",\n    \"notCompiled\": \"Modun derlenmesi gerekiyor\",\n    \"editedLocally\": \"Mod yerel olarak düzenlendi\",\n    \"noDescription\": \"(açıklama yok)\",\n    \"users_one\": \"{{formattedCount}} kullanıcı\",\n    \"users_other\": \"{{formattedCount}} kullanıcı\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Yüklü sürüm\",\n      \"latestVersion\": \"En son sürüm\",\n      \"loading\": \"Yükleniyor...\",\n      \"loadingFailed\": \"yükleme başarısız\",\n      \"modId\": \"mod tanımlayıcı\",\n      \"modVersion\": \"Mod sürümü\",\n      \"modAuthor\": {\n        \"title\": \"Mod yapımcısı\",\n        \"homepage\": \"Ana Sayfa\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Tüm işlemler\",\n        \"allBut\": \"Tümü ama {{list}}\",\n        \"except\": \"{{included}} hariç {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Hedef işlemler\",\n          \"excluded\": \"Hariç\"\n        }\n      },\n      \"updateNotNeeded\": \"Yüklü sürüm, en son sürümle aynı\"\n    },\n    \"details\": {\n      \"title\": \"Ayrıntılar\",\n      \"noData\": \"Mod ayrıntıları eksik.\"\n    },\n    \"settings\": {\n      \"title\": \"Ayarlar\",\n      \"noData\": \"Kullanılabilir mod ayarı yok.\",\n      \"saveButton\": \"Ayarları kaydet\",\n      \"sampleValue\": \"Örnek değer\",\n      \"arrayItemAdd\": \"Yeni öğe ekle\",\n      \"arrayItemRemove\": \"Öğeyi kaldır\"\n    },\n    \"code\": {\n      \"title\": \"Kaynak Kodu\",\n      \"noData\": \"Mod kaynağı eksik.\",\n      \"collapseExtra\": \"Beni Oku ve Ayarları Daralt\"\n    },\n    \"changelog\": {\n      \"title\": \"Değişiklikler\",\n      \"loadingFailed\": \"Değişiklikler yüklenemedi. GitHub'da görüntülemek için <0>burayı tıklayın</0>.\"\n    },\n    \"advanced\": {\n      \"title\": \"Gelişmiş\",\n      \"debugLogging\": {\n        \"title\": \"Hata ayıklama günlüğü\",\n        \"description\": \"Modla ilgili sorunları gidermek için yararlı olabilir.\",\n        \"none\": \"Hiçbiri\",\n        \"modLogs\": \"Mod günlükleri\",\n        \"detailedLogs\": \"Ayrıntılı hata ayıklama günlükleri\",\n        \"showLogButton\": \"Günlük çıktısını göster\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod ayarları\",\n        \"description\": \"Mod ayarlarınızı kolayca dışa aktarın veya paylaşın.\",\n        \"loadButton\": \"Yükle\",\n        \"loadFormattedButton\": \"Biçimlendirilmiş yükle\",\n        \"saveButton\": \"Kaydet\",\n        \"invalidData\": \"Geçersiz JSON verileri\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Özel işlem dahil etme listesi\",\n        \"descriptionInclusion\": \"Modun hedefleyeceği ek yürütülebilir dosya adlarının/yollarının özel bir listesi. Liste, hangi işlemlerin hedefleneceğini belirlemek için mod yazarının tanımladığı dahil etme listesine eklenir. Her işlem için, yürütülebilir dosya yolu dahil etme girişlerinden biriyle eşleşirse ve herhangi bir hariç tutma girişiyle eşleşmezse mod yüklenir.\",\n        \"titleExclusion\": \"Özel işlem hariç tutma listesi\",\n        \"descriptionExclusion\": \"Modun hedefleme dışında bırakacağı ek yürütülebilir dosya adlarının/yollarının özel bir listesi. Liste, hangi işlemlerin hedefleneceğini belirlemek için mod yazarının tanımladığı dışlama listesine eklenir. Her işlem için, yürütülebilir dosya yolu dahil etme girişlerinden biriyle eşleşirse ve herhangi bir hariç tutma girişiyle eşleşmezse mod yüklenir.\",\n        \"processListPlaceholder\": \"İşlem adları/yolları, örneğin her satıra bir tane:\",\n        \"saveButton\": \"Kaydet\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Mod ekleme/hariç tutma listelerini yoksay\",\n        \"description\": \"Modun işlem dahil etme/hariç tutma listelerini göz ardı et ve yalnızca yukarıdaki özel listeleri kullan.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Son Sürüm Değişiklikleri\",\n      \"noData\": \"Yüklü sürüm, en son sürümle aynı.\",\n      \"splitView\": \"Bölünmüş görünüm\",\n      \"expandLines_one\": \"Bir gizli satırı genişlet\",\n      \"expandLines_other\": \"{{count}} gizli satırı genişlet\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Modları ara...\"\n  },\n  \"home\": {\n    \"browse\": \"Modlara Göz At\",\n    \"installedMods\": {\n      \"title\": \"Yüklü Modlar\",\n      \"noMods\": \"Hiçbir mod yüklü değil\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Öne Çıkan Modlar\",\n      \"noMods\": \"Henüz yüklenmemiş öne çıkan mod yok\",\n      \"explore\": \"Diğer Modları Keşfet\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Popüler ve en beğenilenler\",\n      \"popular\": \"Popüler\",\n      \"topRated\": \"En beğenilenler\",\n      \"newest\": \"Yeniler\",\n      \"lastUpdated\": \"Son güncellenenler\",\n      \"alphabeticalOrder\": \"Alfabetik sıra\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Dil\",\n      \"description\": \"Windhawk için tercih ettiğiniz görüntüleme dilini seçin.\",\n      \"contribute\": \"<0>Yeni bir çeviriye katkıda bulunun</0>.\",\n      \"credits\": \"Türkçe çeviri: <0>Fatih Fırıncı</0>.\",\n      \"creditsLink\": \"mailto:fatihfirinci@gmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"Güncellemeleri denetle\",\n      \"description\": \"Windhawk'ın ve yüklü modların yeni sürümlerini düzenli olarak denetle.\"\n    },\n    \"devMode\": {\n      \"title\": \"Geliştirici modu\",\n      \"description\": \"Mod oluşturma ve değiştirme gibi geliştirici eylemlerini göster.\"\n    },\n    \"advancedSettings\": \"Gelişmiş ayarlar\",\n    \"hideTrayIcon\": {\n      \"title\": \"Tepsi simgesini gizle\",\n      \"description\": \"Windhawk'tan çıkmak için bu seçeneği devre dışı bırakmanız gerekir.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Windhawk'ı çalıştırmak için UAC yükseltmesi gerektir\",\n      \"description\": \"Windhawk, yönetici hakları gerektirir, ancak tek kullanıcılı bir bilgisayar için, her seferinde UAC istemini almak can sıkıcı olabilir, bu nedenle Windhawk bunu atlar. Windhawk'ı çalıştırmak için UAC yükseltmesi gerektirmek üzere bu seçeneği etkinleştirin.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Araç takımı iletişim kutusunu otomatik olarak gösterme\",\n      \"description\": \"Varsayılan olarak, Windhawk görev çubuğunun sistem dengesizliği veya başka bir nedenden dolayı erişilemez olduğunu algıladığında araç takımı iletişim kutusunu otomatik olarak gösterir. Araç takımı iletişim kutusu Windhawk'tan çıkmayı, güvenli moda geçmeyi ve diğer işlemleri yapmayı sağlar. Araç takımı iletişim kutusu Ctrl+Win+W klavye kısayoluyla da gösterilebilir.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod başlatma ekranı gecikmesi\",\n      \"description\": \"Mod başlatma için ilerleme iletişim kutusunu göstermeden önce beklenecek milisaniye miktarı.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Daha fazla gelişmiş ayar\",\n      \"restartNotice\": \"Windhawk, ayarları uygulamak için yeniden başlatılacak.\",\n      \"saveButton\": \"Kaydet ve Windhawk'ı yeniden başlat\",\n      \"cancelButton\": \"İptal\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk günlüğe kaydetme ayrıntısı\",\n      \"engineLoggingTitle\": \"Windhawk motor günlüğü ayrıntı düzeyi\",\n      \"description\": \"Günlükler, DebugView gibi bir araçla görüntülenebilir.\",\n      \"none\": \"Bilinmeyen\",\n      \"error\": \"Hata\",\n      \"verbose\": \"Ayrıntılı\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"İşlem hariç etme listesi\",\n      \"descriptionExclusion\": \"Windhawk'ın enjekte etmeyeceği işlem adlarının/yollarının bir listesi. Windhawk'ın belirli bir programla uyumlu olmadığı durumlarda yararlı olabilir. Bu listeye bir süreç eklemenin Windhawk'ın onu özelleştirmesini engellemenin yanı sıra Windhawk'ın bu sürecin oluşturduğu alt süreçleri yakalamasını da engelleyeceğini unutmayın. Bu, Windhawk'ın bu gibi durumlarda modları hafif bir gecikmeyle yüklemesine neden olacaktır.\",\n      \"titleInclusion\": \"İşlem dahil etme listesi\",\n      \"descriptionInclusion\": \"Dışlama listesinde olsalar bile Windhawk'ın enjekte edeceği işlem adlarının/yollarının bir listesi.\",\n      \"inclusionWithoutExclusionNotice\": \"İşlem dahil etme listesinin, boş bir işlem hariç tutma listesi ile hiçbir etkisi yoktur.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Bunlar dışındaki tüm işlemleri hariç tutmak istiyorsanız, işlem dışlama listesinde \\\"*\\\" ayarını yapabilirsiniz.\",\n      \"processListPlaceholder\": \"İşlem adları/yolları, örneğin her satıra bir tane:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Windows programları için özelleştirme pazarı\",\n    \"credit\": \"Yapımcı: <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Bir güncelleme mevcut\",\n      \"subtitle\": \"En son özellikleri ve hata düzeltmelerini almak için Windhawk'ı güncellemeyi düşünün\",\n      \"updateButton\": \"Daha fazla ayrıntı\"\n    },\n    \"links\": {\n      \"title\": \"Bağlantılar\",\n      \"homepage\": \"Ana sayfa\",\n      \"documentation\": \"Belgeler\"\n    },\n    \"builtWith\": {\n      \"title\": \"Oluşturanlar\",\n      \"vscodium\": \"Microsoft'un VSCode düzenleyicisinin topluluk odaklı bir dağıtımı\",\n      \"llvmMingw\": \"LLVM/Clang/LLD tabanlı mingw-w64 araç zinciri\",\n      \"minHook\": \"Windows için minimalist API bağlama kitaplığı\",\n      \"others\": \"Diğer araçlar ve kitaplıklar ve biraz kod\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Yükle {{mod}}\",\n    \"warningTitle\": \"Dikkatli ilerleyin\",\n    \"warningDescription\": \"Kötü amaçlı modlar bilgisayarınıza zarar verebilir veya gizliliğinizi ihlal edebilir. Yalnızca güvendiğiniz yapımcıların modlarını yükleyin.\",\n    \"modAuthor\": \"Mod yapımcısı\",\n    \"homepage\": \"Ana sayfa\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"doğrulanmış\",\n    \"verifiedTooltip\": \"Bu profilin modun yapımcısına ait olduğunu doğruladık ancak <0>doğrulanmış</0> olması <0>güvenilir</0> olduğu anlamına gelmiyor. Mod yapımcısına güvendiğinizden emin olun veya yüklemeden önce kaynak kodunu dikkatlice inceleyin.\",\n    \"acceptButton\": \"Riski Kabul Et ve Yükle\",\n    \"cancelButton\": \"İptal\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Yeni Mod Oluştur\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Mod oluşturmak ve değiştirmek, Windows için biraz C/C++ geliştirme bilgisi gerektirir. Bunun ne anlama geldiğinden emin değilseniz, belki de bu seçenekler size göre değildir.\",\n    \"hideOptionsCheckbox\": \"Geliştirmeyle ilgili tüm seçenekleri gizle\",\n    \"hideOptionsButton\": \"Seçenekleri gizle\",\n    \"beginCodingButton\": \"Kodlamaya başla\",\n    \"cancelButton\": \"İptal\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Eylem önizleme modunda kullanılamaz\",\n    \"notCompiled\": \"Önizleme yapılmadan önce modun derlenmesi gerekir\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod tanımlayıcı\",\n    \"enableMod\": \"Modu etkinleştir\",\n    \"enableLogging\": \"Günlüğü etkinleştir\",\n    \"notCompiled\": \"Modun derlenmesi gerekiyor\",\n    \"compile\": \"Modu Derle\",\n    \"compilationFailed\": \"Derleme başarısız\",\n    \"preview\": \"Önizleme Modu\",\n    \"showLogOutput\": \"Günlük Çıktısını Göster\",\n    \"exit\": \"Düzenleme Modundan Çık\",\n    \"exitConfirmation\": \"Son başarılı derlemeden bu yana yapılan değişiklikler kaybolacak\",\n    \"exitButtonOk\": \"Çık\",\n    \"exitButtonCancel\": \"Kal\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/uk/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/uk/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Завантаження...\",\n    \"loadingFailed\": \"Помилка завантаження, будь ласка, перевірте своє інтернет-з'єднання\",\n    \"loadingFailedTitle\": \"Не вдалося завантажити\",\n    \"loadingFailedSubtitle\": \"Будь ласка, перевірте своє інтернет-з'єднання та спробуйте ще раз\",\n    \"tryAgain\": \"Спробуйте ще раз\",\n    \"updating\": \"Оновлення...\",\n    \"installing\": \"Встановлення...\",\n    \"compiling\": \"Компіляція...\",\n    \"cut\": \"Вирізати\",\n    \"copy\": \"Копіювати\",\n    \"paste\": \"Вставити\",\n    \"selectAll\": \"Вибрати все\"\n  },\n  \"appHeader\": {\n    \"home\": \"Домашня\",\n    \"explore\": \"Шукати\",\n    \"settings\": \"Налаштування\",\n    \"about\": \"Довідка\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Доступне оновлення\",\n    \"installed\": \"Встановлено\",\n    \"details\": \"Деталі\",\n    \"update\": \"Оновити\",\n    \"install\": \"Встановити\",\n    \"compile\": \"Компілювати\",\n    \"disable\": \"Вимкнути\",\n    \"enable\": \"Увімкнути\",\n    \"edit\": \"Редагувати\",\n    \"fork\": \"Форкнути\",\n    \"remove\": \"Видалити\",\n    \"removeConfirm\": \"Ви дійсно бажаєте видалити цей мод?\",\n    \"removeConfirmOk\": \"Видалити мод\",\n    \"removeConfirmCancel\": \"Скасувати\",\n    \"notCompiled\": \"Мод повинен бути скомпільованим\",\n    \"editedLocally\": \"Мод відредаговано локально\",\n    \"noDescription\": \"(Опис порожній)\",\n    \"users_one\": \"{{formattedCount}} користувач\",\n    \"users_few\": \"{{formattedCount}} користувачі\",\n    \"users_many\": \"{{formattedCount}} користувачів\",\n    \"users_other\": \"{{formattedCount}} користувачів\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Встановлена версія\",\n      \"latestVersion\": \"Остання версія\",\n      \"loading\": \"завантаження...\",\n      \"loadingFailed\": \"Помилка завантаження\",\n      \"modId\": \"Ідентифікатор моду\",\n      \"modVersion\": \"Версія моду\",\n      \"modAuthor\": {\n        \"title\": \"Автори моду\",\n        \"homepage\": \"Домашня сторінка\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Всі процеси\",\n        \"allBut\": \"Всі крім {{list}}\",\n        \"except\": \"{{included}} крім {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Цільові процеси\",\n          \"excluded\": \"Винятки\"\n        }\n      },\n      \"updateNotNeeded\": \"Встановлена версія ідентична останній\"\n    },\n    \"details\": {\n      \"title\": \"Деталі\",\n      \"noData\": \"Деталі відсутні.\"\n    },\n    \"settings\": {\n      \"title\": \"Налаштування\",\n      \"noData\": \"Налаштування моду відсутні.\",\n      \"saveButton\": \"Зберегти зміни\",\n      \"sampleValue\": \"Стандартне значення\",\n      \"arrayItemAdd\": \"Додати\",\n      \"arrayItemRemove\": \"Видалити\"\n    },\n    \"code\": {\n      \"title\": \"Вихідний код\",\n      \"noData\": \"Вихідний код моду відсутній.\",\n      \"collapseExtra\": \"Приховати Readme та Налаштування\"\n    },\n    \"changelog\": {\n      \"title\": \"Журнал змін\",\n      \"loadingFailed\": \"Не вдалося завантажити журнал змін. <0>Натисніть тут</0> щоб переглянути його на GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Просунуті\",\n      \"debugLogging\": {\n        \"title\": \"Логування налагодження\",\n        \"description\": \"Може бути корисним для усунення проблем з цим модом.\",\n        \"none\": \"Ні\",\n        \"modLogs\": \"Логи модів\",\n        \"detailedLogs\": \"Детальні логи налагодження\",\n        \"showLogButton\": \"Показати вивід логу\"\n      },\n      \"modSettings\": {\n        \"title\": \"Налаштування моду\",\n        \"description\": \"Легко експортуй або поділися своїми налаштуваннями моду.\",\n        \"loadButton\": \"Завантажити\",\n        \"loadFormattedButton\": \"Завантаження відформатовано\",\n        \"saveButton\": \"Зберегти\",\n        \"invalidData\": \"Пошкодженні JSON дані\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Користувальницький список цільових процесів\",\n        \"descriptionInclusion\": \"Користувацький список додаткових імен/шляхів до виконуваних файлів, на які буде спрямовано мод. Цей список додається до списку цілей, який автор моду визначив для визначення процесів, на які вона буде націлена. Мод буде увімкнено для кожного процесу, якщо шлях до виконуваного файлу збігається зі списком цілей і не збігається з жодним зі списків винятків.\",\n        \"titleExclusion\": \"Користувальницький список виняткових процесів\",\n        \"descriptionExclusion\": \"Користувацький список додаткових імен/шляхів до виконуваних файлів, на які НЕ буде спрямовано мод. Цей список додається до списку винятків, який автор моду визначив для визначення процесів, на які вона буде націлена. Мод буде увімкнено для кожного процесу, якщо шлях до виконуваного файлу збігається зі списком цілей і не збігається з жодним зі списків винятків.\",\n        \"processListPlaceholder\": \"Назви/шляхи процесів, по одному в рядку, наприклад:\",\n        \"saveButton\": \"Зберегти\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Ігнорувати списки включення/виключення модів\",\n        \"description\": \"Ігнорувати списки включення/виключення процесів мода і використовувати лише користувацькі списки, наведені вище.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Зміни в останній версії:\",\n      \"noData\": \"Встановлена версія ідентична останній\",\n      \"splitView\": \"Розділити вид\",\n      \"expandLines_one\": \"Розгорнути один прихований рядок\",\n      \"expandLines_few\": \"Розгорнути {{count}} приховані рядки\",\n      \"expandLines_many\": \"Розгорнути {{count}} прихованих рядків\",\n      \"expandLines_other\": \"Розгорнути {{count}} прихованих рядків\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Шукати моди...\"\n  },\n  \"home\": {\n    \"browse\": \"Шукати моди:\",\n    \"installedMods\": {\n      \"title\": \"Встановлені моди:\",\n      \"noMods\": \"Не встановлено жодного моду\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Рекомендовані моди\",\n      \"noMods\": \"Всі рекомендовані моди вже встановлені\",\n      \"explore\": \"Шукати інші моди\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Популярні та з найкращим рейтингом\",\n      \"popular\": \"Популярні\",\n      \"topRated\": \"З найкращим рейтингом\",\n      \"newest\": \"Найновіші\",\n      \"lastUpdated\": \"Останні оновленні\",\n      \"alphabeticalOrder\": \"Алфавітний порядок\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Мова\",\n      \"description\": \"Оберіть бажану мову інтерфейсу Windhawk.\",\n      \"contribute\": \"<0>Надіслати свій переклад</0>.\",\n      \"credits\": \"Український переклад від <0>Fileak</0>.\",\n      \"creditsLink\": \"https://t.me/Fileak\"\n    },\n    \"updates\": {\n      \"title\": \"Перевірити наявність оновлення\",\n      \"description\": \"Періодично перевіряти наявність оновлень для Windhawk та встановлених модів.\"\n    },\n    \"devMode\": {\n      \"title\": \"Режим розробника\",\n      \"description\": \"Відображати дії для розробників, такі як створення та редагування модів.\"\n    },\n    \"advancedSettings\": \"Просунуті налаштування\",\n    \"hideTrayIcon\": {\n      \"title\": \"Сховати іконку у системному треї\",\n      \"description\": \"Вам доведеться вимкнути цю опцію, щоб вийти з Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Запрошувати UAC дозвіл для запуску Windhawk\",\n      \"description\": \"Windhawk потребує права адміністратора, але для комп'ютерів з одним користувачем постійні запити від UAC набридають, тому Windhawk обходить їх. Увімкніть цей параметр щоб повернути UAC запити на запуск Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Не викликати діалог меню автоматично\",\n      \"description\": \"За замовчуванням, Windhawk автоматично кличе діалог меню коли виявляє, що панель завдань не працює через нестабільність системи чи іншу причину. Діалог меню дозволяє закрити Windhawk, перейти у безпечний режим, та інші дії. Діалог меню також можна викликати комбінацією клавіш Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Затримка діалогу ініціалізації моду\",\n      \"description\": \"Кількість мілісекунд очікування перед показом діалогового вікна прогресу ініціалізації моду.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Більше просунутих налаштувань\",\n      \"restartNotice\": \"Windhawk перезавантажиться для застосування налаштувань.\",\n      \"saveButton\": \"Зберегти зміни та перезавантажити Windhawk\",\n      \"cancelButton\": \"Скасувати\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Докладне логування Windhawk\",\n      \"engineLoggingTitle\": \"Докладне логування движку Windhawk\",\n      \"description\": \"Логи можуть бути переглянуть такими утилітами, DebugView.\",\n      \"none\": \"Ні\",\n      \"error\": \"Помилка\",\n      \"verbose\": \"Докладно\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Список виняткових процесів\",\n      \"descriptionExclusion\": \"Список додаткових імен/шляхів до виконуваних файлів, які Windhawk буде ігнорувати. Може бути корисно, коли Windhawk не сумісний з окремим застосунком. Зауважте, що додавання процесу до цього списку не тільки забезпечить цей процес не тільки від модифікації його Windhawk'ом, а й всіх його дочірніх процесів. Це призведе до невеликої затримки у ініціалізації модів у деяких випадках.\",\n      \"titleInclusion\": \"Список цільових процесів\",\n      \"descriptionInclusion\": \"Список додаткових імен/шляхів до виконуваних файлів, у які Windhawk буде вживлятися, навіть якщо вони в списку виключень.\",\n      \"inclusionWithoutExclusionNotice\": \"Список цільових процесів нічого не робить, якщо список виняткових процесів порожній.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Якщо ви хочете виключити всі процеси, окрім цих, ви можете задати \\\"*\\\" у списку виняткових процесів.\",\n      \"processListPlaceholder\": \"Назви/шляхи процесів, по одному в рядку, наприклад:\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Маркетплейс для кастомізації застосунків Windows\",\n    \"credit\": \"Від <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Доступне оновлення\",\n      \"subtitle\": \"Поміркуйте про оновлення Windhawk для отримання найновіших функцій та усунення багів\",\n      \"updateButton\": \"Більше деталей\"\n    },\n    \"links\": {\n      \"title\": \"Посилання\",\n      \"homepage\": \"Домашня сторінка\",\n      \"documentation\": \"Документація\"\n    },\n    \"builtWith\": {\n      \"title\": \"Побудовано з\",\n      \"vscodium\": \"Community версія редактору VSCode від Microsoft\",\n      \"llvmMingw\": \"LLVM/Clang/LLD базоване середовище mingw-w64\",\n      \"minHook\": \"Minimalistic API hooking library для Windows\",\n      \"others\": \"Інші інструменті та бібліотеки, та трішечки кодингу.\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Встановити {{mod}}\",\n    \"warningTitle\": \"Дійте з обережністю\",\n    \"warningDescription\": \"Зловмисні моди можуть mods пошкодити Ваш комп'ютер, або порушити Вашу приватність. Встановлюйте моди тільки від тих авторів, яким ви довіряєте.\",\n    \"modAuthor\": \"Автор моду\",\n    \"homepage\": \"Домашня сторінка\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"верифіковано\",\n    \"verifiedTooltip\": \"Ми верифікуємо тільки те, що цей профіль належить автору моду, але зауважте, що <0>верифіковано</0> не те ж саме, що <0>надійно</0>. Переконайтеся, що ви довіряєте автору моду, або уважно перевірте вихідний код перед встановленням.\",\n    \"acceptButton\": \"Прийняти ризики та встановити\",\n    \"cancelButton\": \"Скасувати\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Створити новий мод\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Створення модів потребує деяких знань з C/C++ розробки для Windows. Якщо ви не впевнені, що це значить, мабуть, ця опції не для Вас.\",\n    \"hideOptionsCheckbox\": \"Приховати всі опції для розробників\",\n    \"hideOptionsButton\": \"Приховати опції\",\n    \"beginCodingButton\": \"Почати кодити\",\n    \"cancelButton\": \"Скасувати\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk працює в безпечному режимі, без можливості ін'єкцій коду.\",\n    \"offButton\": \"Вимкнути безпечний режим\",\n    \"offConfirm\": \"Windhawk перезавантажиться для застосування налаштувань.\",\n    \"offConfirmOk\": \"Перезавантажити Windhawk\",\n    \"offConfirmCancel\": \"Скасувати\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Опція недоступна у режимі перегляду\",\n    \"notCompiled\": \"Мод потрібен бути скомпільованим перед переглядом\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Ідентифікатор моду\",\n    \"enableMod\": \"Увімкнути мод\",\n    \"enableLogging\": \"Увімкнути логування\",\n    \"notCompiled\": \"Мод повинен бути скомпільованим\",\n    \"compile\": \"Компілювати мод\",\n    \"compilationFailed\": \"Помилка компіляції\",\n    \"preview\": \"Переглянуті Мод\",\n    \"showLogOutput\": \"Показати вивід логу\",\n    \"exit\": \"Вийти з режиму редагування\",\n    \"exitConfirmation\": \"Зміни з часу останньої успішної компіляції буде втрачено\",\n    \"exitButtonOk\": \"Вийти\",\n    \"exitButtonCancel\": \"Залишитися\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/vi/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/vi/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"Đang tải...\",\n    \"loadingFailed\": \"Tải thất bại, vui lòng kiểm tra kết nối internet của bạn\",\n    \"loadingFailedTitle\": \"Tải thất bại\",\n    \"loadingFailedSubtitle\": \"Vui lòng kiểm tra kết nối internet của bạn và thử lại\",\n    \"tryAgain\": \"Thử lại\",\n    \"updating\": \"Đang cập nhật...\",\n    \"installing\": \"Đang cài đặt...\",\n    \"compiling\": \"Đang biên dịch...\",\n    \"cut\": \"Cắt\",\n    \"copy\": \"Sao chép\",\n    \"paste\": \"Dán\",\n    \"selectAll\": \"Chọn tất cả\"\n  },\n  \"appHeader\": {\n    \"home\": \"Trang chủ\",\n    \"explore\": \"Khám phá\",\n    \"settings\": \"Cài đặt\",\n    \"about\": \"Giới thiệu\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"Cập nhật có sẵn\",\n    \"installed\": \"Đã cài đặt\",\n    \"details\": \"Chi tiết\",\n    \"update\": \"Cập nhật\",\n    \"install\": \"Cài đặt\",\n    \"compile\": \"Biên dịch\",\n    \"disable\": \"Vô hiệu hóa\",\n    \"enable\": \"Kích hoạt\",\n    \"edit\": \"Chỉnh sửa\",\n    \"fork\": \"Nhánh\",\n    \"remove\": \"Gỡ bỏ\",\n    \"removeConfirm\": \"Bạn có chắc chắn muốn gỡ bỏ mod này?\",\n    \"removeConfirmOk\": \"Gỡ bỏ mod\",\n    \"removeConfirmCancel\": \"Hủy\",\n    \"notCompiled\": \"Mod cần được biên dịch\",\n    \"editedLocally\": \"Mod đã được chỉnh sửa cục bộ\",\n    \"noDescription\": \"(không có mô tả)\",\n    \"users_one\": \"{{formattedCount}} người dùng\",\n    \"users_other\": \"{{formattedCount}} người dùng\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"Phiên bản đã cài đặt\",\n      \"latestVersion\": \"Phiên bản mới nhất\",\n      \"loading\": \"đang tải...\",\n      \"loadingFailed\": \"tải thất bại\",\n      \"modId\": \"Mã nhận diện mod\",\n      \"modVersion\": \"Phiên bản mod\",\n      \"modAuthor\": {\n        \"title\": \"Tác giả mod\",\n        \"homepage\": \"Trang chủ\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"Tất cả các quy trình\",\n        \"allBut\": \"Tất cả trừ {{list}}\",\n        \"except\": \"{{included}} ngoại trừ {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"Các quy trình mục tiêu\",\n          \"excluded\": \"Đã loại trừ\"\n        }\n      },\n      \"updateNotNeeded\": \"Phiên bản đã cài đặt giống hệt với phiên bản mới nhất\"\n    },\n    \"details\": {\n      \"title\": \"Chi tiết\",\n      \"noData\": \"Thông tin chi tiết mod bị thiếu.\"\n    },\n    \"settings\": {\n      \"title\": \"Cài đặt\",\n      \"noData\": \"Không có cài đặt mod nào có sẵn.\",\n      \"saveButton\": \"Lưu cài đặt\",\n      \"sampleValue\": \"Giá trị mẫu\",\n      \"arrayItemAdd\": \"Thêm mục mới\",\n      \"arrayItemRemove\": \"Gỡ bỏ mục\"\n    },\n    \"code\": {\n      \"title\": \"Mã nguồn\",\n      \"noData\": \"Mã nguồn mod bị thiếu.\",\n      \"collapseExtra\": \"Thu gọn Readme và Cài đặt\"\n    },\n    \"changelog\": {\n      \"title\": \"Nhật ký thay đổi\",\n      \"loadingFailed\": \"Tải nhật ký thay đổi thất bại. <0>Nhấp vào đây</0> để xem trên GitHub.\"\n    },\n    \"advanced\": {\n      \"title\": \"Nâng cao\",\n      \"debugLogging\": {\n        \"title\": \"Ghi nhật ký gỡ lỗi\",\n        \"description\": \"Có thể hữu ích khi gặp sự cố với mod.\",\n        \"none\": \"Không có\",\n        \"modLogs\": \"Nhật ký mod\",\n        \"detailedLogs\": \"Nhật ký gỡ lỗi chi tiết\",\n        \"showLogButton\": \"Hiển thị đầu ra nhật ký\"\n      },\n      \"modSettings\": {\n        \"title\": \"Cài đặt mod\",\n        \"description\": \"Dễ dàng xuất hoặc chia sẻ cài đặt mod của bạn.\",\n        \"loadButton\": \"Tải\",\n        \"loadFormattedButton\": \"Tải định dạng\",\n        \"saveButton\": \"Lưu\",\n        \"invalidData\": \"Dữ liệu JSON không hợp lệ\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"Danh sách bao gồm quy trình tùy chỉnh\",\n        \"descriptionInclusion\": \"Danh sách tùy chỉnh của tên tệp thực thi/đường dẫn bổ sung mà mod sẽ nhắm mục tiêu. Danh sách này được thêm vào danh sách bao gồm mà tác giả mod đã xác định để quyết định quy trình nào sẽ nhắm mục tiêu. Đối với mỗi quy trình, mod sẽ được tải nếu đường dẫn tệp thực thi khớp với một trong các mục bao gồm và không khớp với bất kỳ mục loại trừ nào.\",\n        \"titleExclusion\": \"Danh sách loại trừ quy trình tùy chỉnh\",\n        \"descriptionExclusion\": \"Danh sách tùy chỉnh của tên tệp thực thi/đường dẫn bổ sung mà mod sẽ loại trừ khỏi mục tiêu. Danh sách này được thêm vào danh sách loại trừ mà tác giả mod đã xác định để quyết định quy trình nào sẽ nhắm mục tiêu. Đối với mỗi quy trình, mod sẽ được tải nếu đường dẫn tệp thực thi khớp với một trong các mục bao gồm và không khớp với bất kỳ mục loại trừ nào.\",\n        \"processListPlaceholder\": \"Tên/đường dẫn quy trình, mỗi dòng một, ví dụ:\",\n        \"invalidCharactersWarning\": \"Danh sách quy trình chứa các ký tự không hợp lệ sẽ bị xóa: {{invalidCharacters}}\",\n        \"saveButton\": \"Lưu\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"Bỏ qua danh sách bao gồm/loại trừ của mod\",\n        \"description\": \"Bỏ qua danh sách bao gồm/loại trừ quy trình của mod và chỉ sử dụng các danh sách tùy chỉnh bên trên.\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"Xem xét các mẫu danh sách bao gồm cho các quy trình hệ thống quan trọng\",\n        \"description\": \"Theo mặc định, Windhawk chỉ tải các bản mod trong các quy trình hệ thống quan trọng nếu quy trình được bao gồm mà không có mẫu, ví dụ: <0>critical.exe</0>, không phải <0>*</0> hoặc <0>*.exe</0>. Để biết thêm chi tiết về các quy trình hệ thống quan trọng, vui lòng tham khảo <1>tài liệu</1>.\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"Thay đổi phiên bản mới nhất\",\n      \"noData\": \"Phiên bản đã cài đặt giống hệt với phiên bản mới nhất.\",\n      \"splitView\": \"Chế độ chia đôi\",\n      \"expandLines_one\": \"Mở rộng một dòng bị ẩn\",\n      \"expandLines_other\": \"Mở rộng {{count}} dòng bị ẩn\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"Tìm kiếm mod...\"\n  },\n  \"home\": {\n    \"browse\": \"Duyệt mod\",\n    \"installedMods\": {\n      \"title\": \"Các mod đã cài đặt\",\n      \"noMods\": \"Không có mod nào được cài đặt\"\n    },\n    \"featuredMods\": {\n      \"title\": \"Mod nổi bật\",\n      \"noMods\": \"Không có mod nổi bật nào chưa được cài đặt\",\n      \"explore\": \"Khám phá các mod khác\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"Phổ biến và được đánh giá cao\",\n      \"popular\": \"Phổ biến\",\n      \"topRated\": \"Được đánh giá cao\",\n      \"newest\": \"Mới nhất\",\n      \"lastUpdated\": \"Cập nhật gần đây\",\n      \"alphabeticalOrder\": \"Thứ tự chữ cái\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"Ngôn ngữ\",\n      \"description\": \"Chọn ngôn ngữ hiển thị ưa thích của bạn cho Windhawk.\",\n      \"contribute\": \"<0>Đóng góp bản dịch mới</0>.\",\n      \"credits\": \"Bản dịch tiếng Việt của <0>Nguyen Duy Khoa</0>.\",\n      \"creditsLink\": \"https://github.com/NDKcute\"\n    },\n    \"updates\": {\n      \"title\": \"Kiểm tra cập nhật\",\n      \"description\": \"Thường xuyên kiểm tra các phiên bản mới của Windhawk và các mod đã cài đặt.\"\n    },\n    \"devMode\": {\n      \"title\": \"Chế độ nhà phát triển\",\n      \"description\": \"Hiển thị các thao tác cho nhà phát triển, như tạo và chỉnh sửa mod.\"\n    },\n    \"advancedSettings\": \"Cài đặt nâng cao\",\n    \"hideTrayIcon\": {\n      \"title\": \"Ẩn biểu tượng khay\",\n      \"description\": \"Bạn sẽ phải tắt tùy chọn này để thoát Windhawk.\"\n    },\n    \"requireElevation\": {\n      \"title\": \"Yêu cầu quyền UAC để chạy Windhawk\",\n      \"description\": \"Windhawk yêu cầu quyền quản trị viên, nhưng đối với máy tính chỉ có một người dùng, việc nhận thông báo UAC mỗi lần có thể gây phiền nhiễu, vì vậy Windhawk bỏ qua điều này. Kích hoạt tùy chọn này để yêu cầu quyền UAC để chạy Windhawk.\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"Không tự động hiển thị hộp công cụ\",\n      \"description\": \"Theo mặc định, Windhawk tự động hiển thị hộp công cụ khi phát hiện rằng thanh tác vụ không truy cập được, do hệ thống không ổn định hoặc lý do khác. Hộp công cụ cho phép thoát Windhawk, chuyển sang chế độ an toàn, và thực hiện các thao tác khác. Hộp công cụ cũng có thể được hiển thị bằng phím tắt Ctrl+Win+W.\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Độ trễ hộp thoại khởi tạo mod\",\n      \"description\": \"Số mili giây chờ trước khi hiển thị hộp thoại tiến trình cho khởi tạo mod.\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"Cài đặt nâng cao hơn\",\n      \"restartNotice\": \"Windhawk sẽ được khởi động lại để áp dụng các cài đặt.\",\n      \"saveButton\": \"Lưu và khởi động lại Windhawk\",\n      \"cancelButton\": \"Hủy\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Mức độ ghi nhật ký của Windhawk\",\n      \"engineLoggingTitle\": \"Mức độ ghi nhật ký của động cơ Windhawk\",\n      \"description\": \"Nhật ký có thể được xem bằng công cụ như DebugView.\",\n      \"none\": \"Không\",\n      \"error\": \"Lỗi\",\n      \"verbose\": \"Chi tiết\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"Danh sách loại trừ quy trình\",\n      \"descriptionExclusion\": \"Danh sách tên/đường dẫn quy trình mà Windhawk sẽ không tiêm vào. Có thể hữu ích trong trường hợp Windhawk không tương thích với một chương trình cụ thể. Lưu ý rằng việc thêm một quy trình vào danh sách này không chỉ ngăn Windhawk tùy chỉnh nó mà còn ngăn Windhawk chặn các quy trình con mà quy trình này tạo ra. Điều này sẽ khiến Windhawk tải mod với một độ trễ nhẹ trong những trường hợp như vậy.\",\n      \"descriptionExclusionWiki\": \"Để biết thêm thông tin về danh sách loại trừ quy trình, vui lòng tham khảo <0>tài liệu</0>.\",\n      \"excludeCriticalProcesses\": \"Loại trừ các quy trình hệ thống quan trọng\",\n      \"excludeIncompatiblePrograms\": \"Loại trừ các chương trình không tương thích\",\n      \"excludeGames\": \"Loại trừ các trò chơichơi\",\n      \"titleInclusion\": \"Danh sách bao gồm quy trình\",\n      \"descriptionInclusion\": \"Danh sách tên/đường dẫn quy trình mà Windhawk sẽ tiêm vào, ngay cả khi chúng nằm trong danh sách loại trừ.\",\n      \"inclusionWithoutExclusionNotice\": \"Danh sách bao gồm quy trình không có tác dụng với danh sách loại trừ quy trình rỗng.\",\n      \"inclusionWithoutTotalExclusionNotice\": \"Nếu bạn định loại trừ tất cả các quy trình trừ những quy trình này, bạn có thể đặt \\\"*\\\" trong danh sách loại trừ quy trình.\",\n      \"processListPlaceholder\": \"Tên/đường dẫn quy trình, mỗi dòng một, ví dụ:\",\n      \"invalidCharactersWarning\": \"Danh sách quy trình chứa các ký tự không hợp lệ sẽ bị xóa: {{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"beta\",\n    \"subtitle\": \"Chợ tùy chỉnh cho các chương trình Windows\",\n    \"credit\": \"Bởi <0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"Có bản cập nhật\",\n      \"subtitle\": \"Cân nhắc cập nhật Windhawk để có các tính năng mới nhất và sửa lỗi\",\n      \"updateButton\": \"Chi tiết thêm\"\n    },\n    \"links\": {\n      \"title\": \"Liên kết\",\n      \"homepage\": \"Trang chủ\",\n      \"documentation\": \"Tài liệu\"\n    },\n    \"builtWith\": {\n      \"title\": \"Được xây dựng với\",\n      \"vscodium\": \"Bản phân phối của cộng đồng từ trình soạn thảo VSCode của Microsoft\",\n      \"llvmMingw\": \"Bộ công cụ mingw-w64 dựa trên LLVM/Clang/LLD\",\n      \"minHook\": \"Thư viện móc API tối giản cho Windows\",\n      \"others\": \"Các công cụ và thư viện khác, và một chút mã\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"Cài đặt {{mod}}\",\n    \"warningTitle\": \"Tiếp tục cẩn thận\",\n    \"warningDescription\": \"Mod độc hại có thể làm hỏng máy tính của bạn hoặc vi phạm quyền riêng tư của bạn. Chỉ cài đặt mod từ những tác giả mà bạn tin tưởng.\",\n    \"modAuthor\": \"Tác giả mod\",\n    \"homepage\": \"Trang chủ\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"đã xác minh\",\n    \"verifiedTooltip\": \"Chúng tôi đã xác minh rằng hồ sơ này thuộc về tác giả mod, nhưng lưu ý rằng <0>đã xác minh</0> không giống với <0>đáng tin cậy</0>. Đảm bảo rằng bạn tin tưởng tác giả mod hoặc kiểm tra kỹ mã nguồn trước khi cài đặt.\",\n    \"acceptButton\": \"Chấp nhận Rủi ro và Cài đặt\",\n    \"cancelButton\": \"Hủy\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"Tạo Mod Mới\"\n  },\n  \"devModeAction\": {\n    \"message\": \"Việc tạo và chỉnh sửa mod yêu cầu một số kiến thức về phát triển C/C++ cho Windows. Nếu bạn không chắc điều đó nghĩa là gì, có lẽ những tùy chọn này không dành cho bạn.\",\n    \"hideOptionsCheckbox\": \"Ẩn tất cả các tùy chọn liên quan đến phát triển\",\n    \"hideOptionsButton\": \"Ẩn tùy chọn\",\n    \"beginCodingButton\": \"Bắt đầu mã hóa\",\n    \"cancelButton\": \"Hủy\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk đang chạy ở chế độ an toàn, tất cả các chức năng tiêm mã đã tắt.\",\n    \"offButton\": \"Tắt chế độ an toàn\",\n    \"offConfirm\": \"Windhawk sẽ được khởi động lại để áp dụng các cài đặt.\",\n    \"offConfirmOk\": \"Khởi động lại Windhawk\",\n    \"offConfirmCancel\": \"Hủy\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"Hành động không khả dụng ở chế độ xem trước\",\n    \"notCompiled\": \"Mod cần được biên dịch trước khi có thể xem trước\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mã nhận diện mod\",\n    \"enableMod\": \"Kích hoạt mod\",\n    \"enableLogging\": \"Kích hoạt ghi nhật ký\",\n    \"notCompiled\": \"Mod cần được biên dịch\",\n    \"compile\": \"Biên dịch Mod\",\n    \"compilationFailed\": \"Biên dịch thất bại\",\n    \"preview\": \"Xem trước Mod\",\n    \"showLogOutput\": \"Hiển thị đầu ra nhật ký\",\n    \"exit\": \"Thoát Chế độ Chỉnh sửa\",\n    \"exitConfirmation\": \"Những thay đổi kể từ lần biên dịch thành công cuối cùng sẽ bị mất\",\n    \"exitButtonOk\": \"Thoát\",\n    \"exitButtonCancel\": \"Ở lại\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"加载中...\",\n    \"loadingFailed\": \"加载失败，请检查您的网络连接\",\n    \"loadingFailedTitle\": \"加载失败\",\n    \"loadingFailedSubtitle\": \"请检查您的网络连接并重试\",\n    \"tryAgain\": \"请重试\",\n    \"updating\": \"更新中...\",\n    \"installing\": \"安装中...\",\n    \"compiling\": \"编译中...\",\n    \"cut\": \"剪切\",\n    \"copy\": \"复制\",\n    \"paste\": \"粘贴\",\n    \"selectAll\": \"全选\"\n  },\n  \"appHeader\": {\n    \"home\": \"主页\",\n    \"explore\": \"搜索\",\n    \"settings\": \"设置\",\n    \"about\": \"关于\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"更新可用\",\n    \"installed\": \"已安装\",\n    \"details\": \"详情\",\n    \"update\": \"更新\",\n    \"install\": \"安装\",\n    \"compile\": \"编译\",\n    \"disable\": \"禁用\",\n    \"enable\": \"启用\",\n    \"edit\": \"编辑\",\n    \"fork\": \"克隆\",\n    \"remove\": \"移除\",\n    \"removeConfirm\": \"您确定要移除此Mod吗？\",\n    \"removeConfirmOk\": \"确认移除\",\n    \"removeConfirmCancel\": \"取消\",\n    \"notCompiled\": \"Mod需要编译\",\n    \"editedLocally\": \"Mod已在本地编辑\",\n    \"noDescription\": \"（无描述）\",\n    \"users_one\": \"{{formattedCount}} 用户\",\n    \"users_other\": \"{{formattedCount}} 用户\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"已安装版本\",\n      \"latestVersion\": \"最新版本\",\n      \"loading\": \"加载中...\",\n      \"loadingFailed\": \"加载失败\",\n      \"modId\": \"Mod ID\",\n      \"modVersion\": \"Mod版本\",\n      \"modAuthor\": {\n        \"title\": \"Mod开发者\",\n        \"homepage\": \"主页\",\n        \"github\": \"GitHub主页\",\n        \"twitter\": \"X (Twitter)主页\"\n      },\n      \"processes\": {\n        \"all\": \"全部进程\",\n        \"allBut\": \"全部进程，除了{{list}}\",\n        \"except\": \"{{included}}除了{{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"目标进程\",\n          \"excluded\": \"不包括\"\n        }\n      },\n      \"updateNotNeeded\": \"安装的版本与最新版本相同\"\n    },\n    \"details\": {\n      \"title\": \"详情\",\n      \"noData\": \"无详情\"\n    },\n    \"settings\": {\n      \"title\": \"设置\",\n      \"noData\": \"当前Mod无设置。\",\n      \"saveButton\": \"保存\",\n      \"sampleValue\": \"示例值\",\n      \"arrayItemAdd\": \"增加新的条目\",\n      \"arrayItemRemove\": \"移除条目\"\n    },\n    \"code\": {\n      \"title\": \"源代码\",\n      \"noData\": \"无源代码\",\n      \"collapseExtra\": \"折叠README和设置\"\n    },\n    \"changelog\": {\n      \"title\": \"更新日志\",\n      \"loadingFailed\": \"无法加载更新日志。<0>点击此处</0>访问Github。\"\n    },\n    \"advanced\": {\n      \"title\": \"高级设置\",\n      \"debugLogging\": {\n        \"title\": \"调试日志\",\n        \"description\": \"可以帮我们迅速定位Mod存在的问题。\",\n        \"none\": \"无\",\n        \"modLogs\": \"Mod日志\",\n        \"detailedLogs\": \"调试日志详情\",\n        \"showLogButton\": \"查看日志\"\n      },\n      \"modSettings\": {\n        \"title\": \"Mod设置\",\n        \"description\": \"便捷的导出和分享您的Mod设置。\",\n        \"loadButton\": \"加载\",\n        \"loadFormattedButton\": \"格式化后加载\",\n        \"saveButton\": \"保存\",\n        \"invalidData\": \"无效的JSON数据\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"自定义进程包含列表\",\n        \"descriptionInclusion\": \"Mod将作用于此自定义列表中的可执行文件/路径。该列表被添加到Mod开发者定义的包含列表中，以确定目标进程。对于每个进程，如果可执行文件/路径匹配一个包含项，而不匹配任何排除项，则加载Mod。\",\n        \"titleExclusion\": \"自定义进程排除列表\",\n        \"descriptionExclusion\": \"Mod将作用于不在此自定义列表中的可执行文件/路径。该列表被添加到Mod开发者定义的包含列表中，以确定目标进程。对于每个进程，如果可执行文件/路径匹配一个包含项，而不匹配任何排除项，则加载Mod。\",\n        \"processListPlaceholder\": \"进程名称/路径，每行一条内容，例如：\",\n        \"invalidCharactersWarning\": \"进程列表包含无效字符，这些字符将会被去除：{{invalidCharacters}}\",\n        \"saveButton\": \"保存\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"忽略Mod包含/排除列表\",\n        \"description\": \"忽略该Mod的进程包含/排除列表，仅使用上述自定义列表。\"\n      },\n      \"patternsMatchCriticalSystemProcesses\": {\n        \"title\": \"考虑针对关键系统进程的包含列表模式\",\n        \"description\": \"默认情况下，Windhawk仅在关键系统进程被包含时才会加载Mod，例如像 <0>critical.exe</0>”这样的形式，而不是 <0></0>或者<0>.exe</0>这样的形式。如需了解有关关键系统进程的更多详细信息，请参阅 <1> 文档 </1>。\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"新版本更新内容\",\n      \"noData\": \"安装的版本与最新版本相同。\",\n      \"splitView\": \"拆分视图\",\n      \"expandLines_one\": \"展开1行隐藏行\",\n      \"expandLines_other\": \"展开{{count}}行隐藏行\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"搜索您想要的Mods...\"\n  },\n  \"home\": {\n    \"browse\": \"浏览Mods\",\n    \"installedMods\": {\n      \"title\": \"已安装的Mods\",\n      \"noMods\": \"尚未安装任何Mods\"\n    },\n    \"featuredMods\": {\n      \"title\": \"精选Mods\",\n      \"noMods\": \"尚未安装任何精选Mods\",\n      \"explore\": \"浏览更多Mods\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"高分受欢迎的\",\n      \"popular\": \"受欢迎的\",\n      \"topRated\": \"高分的\",\n      \"newest\": \"最新的\",\n      \"lastUpdated\": \"上次更新\",\n      \"alphabeticalOrder\": \"按字母排序\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"语言\",\n      \"description\": \"选择Windhawk首选的显示语言\",\n      \"contribute\": \"<0>协助我们贡献您的翻译</0>.\",\n      \"credits\": \"简体中文翻译由<0>Shifeng Zhao</0>提供。\",\n      \"creditsLink\": \"mailto:1193008599@qq.com\"\n    },\n    \"updates\": {\n      \"title\": \"检查软件更新\",\n      \"description\": \"定期检查最新版本的Windhawk和Mods\"\n    },\n    \"devMode\": {\n      \"title\": \"开发者选项\",\n      \"description\": \"为开发者显示的操作，例如创建和修改Mods。\"\n    },\n    \"advancedSettings\": \"高级设置\",\n    \"hideTrayIcon\": {\n      \"title\": \"隐藏托盘图标\",\n      \"description\": \"您必须禁用此选项才能退出Windhawk。\"\n    },\n    \"requireElevation\": {\n      \"title\": \"需要管理员权限（UAC）来运行Windhawk\",\n      \"description\": \"Windhawk需要管理员权限，但当您电脑只有一个账户时，每次都弹出用户账户控制（UAC）或许很影响您的正常使用，所以Windhawk选择绕过它。启用此选项可在运行Windhawk时要求用户账户控制（UAC）提升权限。\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"禁止自动显示Toolkit窗口。\",\n      \"description\": \"默认情况下，当Windhawk检测到任务栏无法访问时（可能是由于系统不稳定或其他原因），会自动显示Toolkit窗口。Toolkit窗口允许退出Windhawk，切换到安全模式和进行其他操作。禁用后仍可以使用Ctrl+Win+W键盘快捷键显示Toolkit窗口。\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"Mod初始化对话延迟\",\n      \"description\": \"在显示Mod初始化进度对话框之前需要等待的毫秒数。\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"更多高级设置\",\n      \"restartNotice\": \"Windhawk将重启以应用软件设置。\",\n      \"saveButton\": \"保存并重启Windhawk\",\n      \"cancelButton\": \"取消\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk日志\",\n      \"engineLoggingTitle\": \"Windhawk引擎的日志信息\",\n      \"description\": \"可以使用DebugView等工具查看日志。\",\n      \"none\": \"无\",\n      \"error\": \"错误\",\n      \"verbose\": \"详细日志信息\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"排除的进程列表\",\n      \"descriptionExclusion\": \"这是一个Windhawk不会注入的进程名称/路径列表。当Windhawk与某个特定程序不兼容时，该列表可能会很有用。需要注意的是，将某个进程添加到这个列表中，不仅会阻止Windhawk对其进行自定义设置，还会阻止Windhawk拦截该进程所创建的子进程。在这种情况下，这将导致Windhawk加载Mods时会稍有延迟。\",\n      \"descriptionExclusionWiki\": \"如需了解有关排除进程以及内置进程排除列表的更多详细信息，请参阅<0> 相关文档 </0>。\",\n      \"excludeCriticalProcesses\": \"排除关键系统进程\",\n      \"excludeIncompatiblePrograms\": \"排除已知不兼容的程序\",\n      \"excludeGames\": \"排除知名游戏\",\n      \"titleInclusion\": \"包含的进程列表\",\n      \"descriptionInclusion\": \"Windhawk将注入的进程名/路径列表，即使它们在排除列表中。\",\n      \"inclusionWithoutExclusionNotice\": \"进程包含列表对于空的进程排除列表无效。\",\n      \"inclusionWithoutTotalExclusionNotice\": \"如果您打算排除除这些之外的所有进程，您可以用“*”在进程排除列表中设置。\",\n      \"processListPlaceholder\": \"进程名/路径，每行一个，例如:\",\n      \"invalidCharactersWarning\": \"进程列表中包含无效字符，这些无效字符将会被去除：{{invalidCharacters}}\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk版本{{version}}\",\n    \"beta\": \"beta版本\",\n    \"subtitle\": \"可以魔改您Windows功能的得力软件\",\n    \"credit\": \"<0>{{author}}团队倾情巨献</0>\",\n    \"update\": {\n      \"title\": \"一项更新可用\",\n      \"subtitle\": \"更新Windhawk以获得最新的功能\",\n      \"updateButton\": \"更多详情\"\n    },\n    \"links\": {\n      \"title\": \"官方链接\",\n      \"homepage\": \"官方主页\",\n      \"documentation\": \"官方文档\"\n    },\n    \"builtWith\": {\n      \"title\": \"使用以下项目\",\n      \"vscodium\": \"一个开源免费的代码编辑器\",\n      \"llvmMingw\": \"基于LLVM、Clang和LLD的mingw-w64工具链\",\n      \"minHook\": \"Windows平台下简单好用的API钩子库\",\n      \"others\": \"以及其他工具和库、一些开源代码\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"安装{{mod}}\",\n    \"warningTitle\": \"请谨慎安装Mod\",\n    \"warningDescription\": \"恶意的Mod可能会破坏您的电脑系统或侵犯您的个人隐私。确保只从您信任的开发者那里安装Mod。\",\n    \"modAuthor\": \"Mod开发者\",\n    \"homepage\": \"主页\",\n    \"github\": \"GitHub主页\",\n    \"twitter\": \"X (Twitter)主页\",\n    \"verified\": \"已认证\",\n    \"verifiedTooltip\": \"我们已验证此配置文件属于此Mod开发者，但请您注意<0>已认证的Mods</0>不同于<0>可信任的Mods</0>。请确保您信任对应的Mod开发者，或仔细检查源代码后再进行安装。\",\n    \"acceptButton\": \"接受风险并安装\",\n    \"cancelButton\": \"取消\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"新建Mod\"\n  },\n  \"devModeAction\": {\n    \"message\": \"创建和修改Mod需要一定的Windows C/C++开发知识。如果您不了解相关知识，建议您不要进行相关操作。\",\n    \"hideOptionsCheckbox\": \"隐藏所有与开发相关的选项\",\n    \"hideOptionsButton\": \"隐藏选项\",\n    \"beginCodingButton\": \"开始编写代码\",\n    \"cancelButton\": \"取消\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk正在安全模式下运行，所有代码注入功能已关闭。\",\n    \"offButton\": \"退出安全模式\",\n    \"offConfirm\": \"应用设置后Windhawk将会重启\",\n    \"offConfirmOk\": \"重启Windhawk\",\n    \"offConfirmCancel\": \"取消\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"预览模式下该操作不可用\",\n    \"notCompiled\": \"Mod需要编译后才可预览\"\n  },\n  \"sidebar\": {\n    \"modId\": \"Mod ID\",\n    \"enableMod\": \"启用Mod\",\n    \"enableLogging\": \"启用日志\",\n    \"notCompiled\": \"Mod需要编译\",\n    \"compile\": \"编译Mod\",\n    \"compilationFailed\": \"编译失败\",\n    \"preview\": \"预览Mod\",\n    \"showLogOutput\": \"显示输出的日志\",\n    \"exit\": \"退出编辑模式\",\n    \"exitConfirmation\": \"是否确认退出，最后一次成功编译的改动都将丢失\",\n    \"exitButtonOk\": \"退出\",\n    \"exitButtonCancel\": \"取消退出\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/DO_NOT_EDIT.txt",
    "content": "The files in this folder are generated automatically.\n\nTo submit a translation update, please refer to this repository:\nhttps://github.com/ramensoftware/windhawk-translate\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/translation.json",
    "content": "{\n  \"general\": {\n    \"loading\": \"正在載入...\",\n    \"loadingFailed\": \"載入失敗，請檢查您的網路連線\",\n    \"loadingFailedTitle\": \"載入失敗\",\n    \"loadingFailedSubtitle\": \"請檢查您的網路連線後再試一次\",\n    \"tryAgain\": \"重試\",\n    \"updating\": \"正在更新...\",\n    \"installing\": \"正在安裝...\",\n    \"compiling\": \"正在編譯...\",\n    \"cut\": \"剪下\",\n    \"copy\": \"複製\",\n    \"paste\": \"貼上\",\n    \"selectAll\": \"全選\"\n  },\n  \"appHeader\": {\n    \"home\": \"首頁\",\n    \"explore\": \"探索\",\n    \"settings\": \"設定\",\n    \"about\": \"關於\"\n  },\n  \"mod\": {\n    \"updateAvailable\": \"有可用更新\",\n    \"installed\": \"已安裝\",\n    \"details\": \"詳細資訊\",\n    \"update\": \"更新\",\n    \"install\": \"安裝\",\n    \"compile\": \"編譯\",\n    \"disable\": \"停用\",\n    \"enable\": \"啟用\",\n    \"edit\": \"編輯\",\n    \"fork\": \"分支\",\n    \"remove\": \"移除\",\n    \"removeConfirm\": \"您確定要移除此模組嗎？\",\n    \"removeConfirmOk\": \"移除模組\",\n    \"removeConfirmCancel\": \"取消\",\n    \"notCompiled\": \"模組需要編譯\",\n    \"editedLocally\": \"模組已在本地編輯\",\n    \"noDescription\": \"（無描述）\",\n    \"users_one\": \"{{formattedCount}} 位使用者\",\n    \"users_other\": \"{{formattedCount}} 位使用者\"\n  },\n  \"modDetails\": {\n    \"header\": {\n      \"installedVersion\": \"已安裝版本\",\n      \"latestVersion\": \"最新版本\",\n      \"loading\": \"正在載入...\",\n      \"loadingFailed\": \"載入失敗\",\n      \"modId\": \"模組識別碼\",\n      \"modVersion\": \"模組版本\",\n      \"modAuthor\": {\n        \"title\": \"模組作者\",\n        \"homepage\": \"主頁\",\n        \"github\": \"GitHub\",\n        \"twitter\": \"X (Twitter)\"\n      },\n      \"processes\": {\n        \"all\": \"所有程序\",\n        \"allBut\": \"除了 {{list}} 之外的所有程序\",\n        \"except\": \"{{included}} 除了 {{excluded}}\",\n        \"tooltip\": {\n          \"targets\": \"目標程序\",\n          \"excluded\": \"排除\"\n        }\n      },\n      \"updateNotNeeded\": \"已安裝的版本與最新版本相同\"\n    },\n    \"details\": {\n      \"title\": \"詳細資訊\",\n      \"noData\": \"模組詳細資訊缺失。\"\n    },\n    \"settings\": {\n      \"title\": \"設定\",\n      \"noData\": \"沒有可用的模組設定。\",\n      \"saveButton\": \"保存設定\",\n      \"sampleValue\": \"範例值\",\n      \"arrayItemAdd\": \"新增項目\",\n      \"arrayItemRemove\": \"移除項目\"\n    },\n    \"code\": {\n      \"title\": \"原始碼\",\n      \"noData\": \"模組原始碼缺失。\",\n      \"collapseExtra\": \"折疊 Readme 和設定\"\n    },\n    \"changelog\": {\n      \"title\": \"更新日誌\",\n      \"loadingFailed\": \"加載更新日誌失敗。<0>點擊這裡</0> 在 GitHub 上查看。\"\n    },\n    \"advanced\": {\n      \"title\": \"進階\",\n      \"debugLogging\": {\n        \"title\": \"除錯日誌\",\n        \"description\": \"對於解決模組問題可能很有幫助。\",\n        \"none\": \"無\",\n        \"modLogs\": \"模組日誌\",\n        \"detailedLogs\": \"詳細除錯日誌\",\n        \"showLogButton\": \"顯示日誌輸出\"\n      },\n      \"modSettings\": {\n        \"title\": \"模組設定\",\n        \"description\": \"輕鬆匯出或分享您的模組設定。\",\n        \"loadButton\": \"載入\",\n        \"loadFormattedButton\": \"載入格式化資料\",\n        \"saveButton\": \"保存\",\n        \"invalidData\": \"無效的 JSON 資料\"\n      },\n      \"customList\": {\n        \"titleInclusion\": \"自訂程序包含清單\",\n        \"descriptionInclusion\": \"模組將目標鎖定的額外可執行檔名稱或路徑的自訂清單。此清單會添加到模組作者定義的包含清單中，以決定要鎖定的程序。對於每個程序，如果可執行檔路徑符合其中一個包含項目且不符合任何排除項目，則會載入模組。\",\n        \"titleExclusion\": \"自訂程序排除清單\",\n        \"descriptionExclusion\": \"模組將排除的額外可執行檔名稱或路徑的自訂清單。此清單會添加到模組作者定義的排除清單中，以決定要鎖定的程序。對於每個程序，如果可執行檔路徑符合其中一個包含項目且不符合任何排除項目，則會載入模組。\",\n        \"processListPlaceholder\": \"程序名稱或路徑，每行一個，例如：\",\n        \"saveButton\": \"儲存\"\n      },\n      \"includeExcludeCustomOnly\": {\n        \"title\": \"忽略模組的包含/排除清單\",\n        \"description\": \"忽略模組的程序包含/排除清單，僅使用上面的自訂清單。\"\n      }\n    },\n    \"changes\": {\n      \"title\": \"最新版本變更\",\n      \"noData\": \"已安裝的版本與最新版本相同。\",\n      \"splitView\": \"分割視窗\",\n      \"expandLines_one\": \"展開一條隱藏的行\",\n      \"expandLines_other\": \"展開 {{count}} 條隱藏的行\"\n    }\n  },\n  \"modSearch\": {\n    \"placeholder\": \"搜尋模組...\"\n  },\n  \"home\": {\n    \"browse\": \"瀏覽模組\",\n    \"installedMods\": {\n      \"title\": \"已安裝的模組\",\n      \"noMods\": \"未安裝任何模組\"\n    },\n    \"featuredMods\": {\n      \"title\": \"精選模組\",\n      \"noMods\": \"沒有尚未安裝的精選模組\",\n      \"explore\": \"探索其他模組\"\n    }\n  },\n  \"explore\": {\n    \"search\": {\n      \"popularAndTopRated\": \"熱門與高評價\",\n      \"popular\": \"熱門\",\n      \"topRated\": \"高評價\",\n      \"newest\": \"最新\",\n      \"lastUpdated\": \"最近更新\",\n      \"alphabeticalOrder\": \"字母順序\"\n    }\n  },\n  \"settings\": {\n    \"language\": {\n      \"title\": \"語言\",\n      \"description\": \"選擇您偏好的 Windhawk 顯示語言。\",\n      \"contribute\": \"<0>貢獻新的翻譯</0>。\",\n      \"credits\": \"正體中文翻譯由 <0>abc0922001</0> 提供。\",\n      \"creditsLink\": \"mailto:abc0922001@hotmail.com\"\n    },\n    \"updates\": {\n      \"title\": \"檢查更新\",\n      \"description\": \"定期檢查 Windhawk 及已安裝模組的新版本。\"\n    },\n    \"devMode\": {\n      \"title\": \"開發者模式\",\n      \"description\": \"顯示開發者操作，例如新建和修改模組。\"\n    },\n    \"advancedSettings\": \"進階設定\",\n    \"hideTrayIcon\": {\n      \"title\": \"隱藏系統匣圖示\",\n      \"description\": \"您將需要禁用此選項才能退出 Windhawk。\"\n    },\n    \"requireElevation\": {\n      \"title\": \"需要系統管理員操作來執行 Windhawk\",\n      \"description\": \"Windhawk 需要系統管理員權限，但對於一般使用者，每次都提示使用者帳戶控制（UAC）或許很影響您的正常使用，所以 Windhawk 繞過了它。啟用此選項需要使用者帳戶控制（UAC）來執行 Windhawk。\"\n    },\n    \"dontAutoShowToolkit\": {\n      \"title\": \"不要自動顯示工具箱對話框\",\n      \"description\": \"預設情況下，當 Windhawk 檢測到由於系統不穩定或其他原因導致無法訪問任務欄時，會自動顯示工具箱對話框。工具箱對話框允許退出 Windhawk、切換到安全模式以及進行其他操作。工具箱對話框也可以通過 Ctrl+Win+W 鍵盤快捷鍵顯示。\"\n    },\n    \"modInitDialogDelay\": {\n      \"title\": \"模組初始化對話框延遲\",\n      \"description\": \"等待顯示模組初始化進度對話框的毫秒數。\"\n    },\n    \"moreAdvancedSettings\": {\n      \"title\": \"更多進階設定\",\n      \"restartNotice\": \"Windhawk 將重新啟動以應用設定。\",\n      \"saveButton\": \"保存並重新啟動 Windhawk\",\n      \"cancelButton\": \"取消\"\n    },\n    \"loggingVerbosity\": {\n      \"appLoggingTitle\": \"Windhawk 日誌詳細程度\",\n      \"engineLoggingTitle\": \"Windhawk 引擎日誌詳細程度\",\n      \"description\": \"可以使用 DebugView 等工具查看日誌。\",\n      \"none\": \"無\",\n      \"error\": \"錯誤\",\n      \"verbose\": \"詳細\"\n    },\n    \"processList\": {\n      \"titleExclusion\": \"排除程序清單\",\n      \"descriptionExclusion\": \"不希望 Windhawk 注入的程序名稱或路徑清單。當 Windhawk 與特定程式不相容時，可以派上用場。請注意，將程序添加到此清單不僅會阻止 Windhawk 自訂它，還會阻止 Windhawk 攔截該程序建立的子程序。這將導致 Windhawk 在這種情況下稍後載入模組。\",\n      \"titleInclusion\": \"包含程序清單\",\n      \"descriptionInclusion\": \"即使程序在排除清單中，Windhawk 也會注入的程序名稱或路徑清單。\",\n      \"inclusionWithoutExclusionNotice\": \"沒有空的程序排除清單時，程序包含清單無效。\",\n      \"inclusionWithoutTotalExclusionNotice\": \"如果您想要排除所有程序，除了這些程序，可以在程序排除清單中設定 \\\"*\\\"。\",\n      \"processListPlaceholder\": \"程序名稱或路徑，每行一個，例如：\"\n    }\n  },\n  \"about\": {\n    \"title\": \"Windhawk v{{version}}\",\n    \"beta\": \"測試版\",\n    \"subtitle\": \"Windows 程式的客製化市場\",\n    \"credit\": \"作者：<0>{{author}}</0>\",\n    \"update\": {\n      \"title\": \"有新版本可用\",\n      \"subtitle\": \"考慮更新 Windhawk 以獲得最新功能和錯誤修正\",\n      \"updateButton\": \"更多詳細資訊\"\n    },\n    \"links\": {\n      \"title\": \"連結\",\n      \"homepage\": \"首頁\",\n      \"documentation\": \"文件\"\n    },\n    \"builtWith\": {\n      \"title\": \"開發工具\",\n      \"vscodium\": \"由社群驅動的 Microsoft VSCode 編輯器版本\",\n      \"llvmMingw\": \"基於 LLVM/Clang/LLD 的 mingw-w64 工具鏈\",\n      \"minHook\": \"Windows 的極簡 API 攔截庫\",\n      \"others\": \"其他工具、庫和一些程式碼\"\n    }\n  },\n  \"installModal\": {\n    \"title\": \"安裝 {{mod}}\",\n    \"warningTitle\": \"小心操作\",\n    \"warningDescription\": \"惡意的模組可能會損壞您的電腦或侵犯您的隱私。僅安裝您信任的作者的模組。\",\n    \"modAuthor\": \"模組作者\",\n    \"homepage\": \"首頁\",\n    \"github\": \"GitHub\",\n    \"twitter\": \"X (Twitter)\",\n    \"verified\": \"已驗證\",\n    \"verifiedTooltip\": \"我們已驗證此帳戶屬於模組作者，但請注意 <0>已驗證</0> 不等於 <0>信任</0>。請確保您信任模組作者，或在安裝前仔細檢查原始碼。\",\n    \"acceptButton\": \"接受風險並安裝\",\n    \"cancelButton\": \"取消\"\n  },\n  \"createNewModButton\": {\n    \"title\": \"建立新模組\"\n  },\n  \"devModeAction\": {\n    \"message\": \"建立和修改模組需要一些 Windows C/C++ 開發的知識。如果您不確定是什麼意思，這些選項可能不適合您。\",\n    \"hideOptionsCheckbox\": \"隱藏所有開發相關選項\",\n    \"hideOptionsButton\": \"隱藏選項\",\n    \"beginCodingButton\": \"開始編碼\",\n    \"cancelButton\": \"取消\"\n  },\n  \"safeMode\": {\n    \"alert\": \"Windhawk 正在安全模式下運行，所有程式碼注入功能已關閉。\",\n    \"offButton\": \"關閉安全模式\",\n    \"offConfirm\": \"Windhawk 將重新啟動以應用設定。\",\n    \"offConfirmOk\": \"重新啟動 Windhawk\",\n    \"offConfirmCancel\": \"取消\"\n  },\n  \"modPreview\": {\n    \"actionUnavailable\": \"預覽模式下無法使用此功能\",\n    \"notCompiled\": \"模組需要編譯才能預覽\"\n  },\n  \"sidebar\": {\n    \"modId\": \"模組識別碼\",\n    \"enableMod\": \"啟用模組\",\n    \"enableLogging\": \"啟用記錄\",\n    \"notCompiled\": \"模組需要編譯\",\n    \"compile\": \"編譯模組\",\n    \"compilationFailed\": \"編譯失敗\",\n    \"preview\": \"預覽模組\",\n    \"showLogOutput\": \"顯示記錄輸出\",\n    \"exit\": \"退出編輯模式\",\n    \"exitConfirmation\": \"自上次成功編譯以來的更改將丟失\",\n    \"exitButtonOk\": \"退出\",\n    \"exitButtonCancel\": \"保留\"\n  }\n}"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/main.css",
    "content": "body {\n  /* remove padding set by vscode */\n  padding: 0;\n\n  margin: 0;\n\n  /* scrollbars sometimes show up because of Ant Design's context menu, hide\n     them, we aren't using them anyway */\n  overflow: hidden;\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/main.tsx",
    "content": "import { StrictMode } from 'react';\nimport * as ReactDOM from 'react-dom/client';\nimport App from './app/app';\nimport './main.css';\n\nconst root = ReactDOM.createRoot(\n  document.getElementById('root') as HTMLElement\n);\nroot.render(\n  <StrictMode>\n    <App />\n  </StrictMode>\n);\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/polyfills.ts",
    "content": "/**\n * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`.\n *\n * See: https://github.com/zloirock/core-js#babel\n */\nimport 'core-js/stable';\nimport 'regenerator-runtime/runtime';\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/tsconfig.app.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../dist/out-tsc\",\n    \"types\": [\"node\"]\n  },\n  \"files\": [\n    \"../../node_modules/@nrwl/react/typings/cssmodule.d.ts\",\n    \"../../node_modules/@nrwl/react/typings/image.d.ts\"\n  ],\n  \"exclude\": [\n    \"jest.config.ts\",\n    \"**/*.spec.ts\",\n    \"**/*.test.ts\",\n    \"**/*.spec.tsx\",\n    \"**/*.test.tsx\",\n    \"**/*.spec.js\",\n    \"**/*.test.js\",\n    \"**/*.spec.jsx\",\n    \"**/*.test.jsx\"\n  ],\n  \"include\": [\"**/*.js\", \"**/*.jsx\", \"**/*.ts\", \"**/*.tsx\"]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"noImplicitOverride\": true,\n    \"noPropertyAccessFromIndexSignature\": true,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"files\": [],\n  \"include\": [],\n  \"references\": [\n    {\n      \"path\": \"./tsconfig.app.json\"\n    },\n    {\n      \"path\": \"./tsconfig.spec.json\"\n    }\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/tsconfig.spec.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../dist/out-tsc\",\n    \"module\": \"commonjs\",\n    \"types\": [\"jest\", \"node\"]\n  },\n  \"include\": [\n    \"jest.config.ts\",\n    \"**/*.test.ts\",\n    \"**/*.spec.ts\",\n    \"**/*.test.tsx\",\n    \"**/*.spec.tsx\",\n    \"**/*.test.js\",\n    \"**/*.spec.js\",\n    \"**/*.test.jsx\",\n    \"**/*.spec.jsx\",\n    \"**/*.d.ts\"\n  ],\n  \"files\": [\n    \"../../node_modules/@nrwl/react/typings/cssmodule.d.ts\",\n    \"../../node_modules/@nrwl/react/typings/image.d.ts\"\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui/webpack.config.js",
    "content": "// Reference:\n// https://github.com/ideafast/ideafast-portal/blob/59fb91104db81a86fc282491ac936d49fb4ef0e8/packages/itmat-ui-react/webpack.config.js#L7\n\nconst webpack = require('webpack');\nconst { composePlugins, withNx } = require('@nx/webpack');\nconst { withReact } = require('@nx/react');\nconst MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');\nconst { version } = require('../../package.json');\n\nmodule.exports = composePlugins(\n    withNx(),\n    withReact(),\n    (config) => {\n        config.plugins.splice(0, 0, new webpack.EnvironmentPlugin({\n          REACT_APP_VERSION: version,\n        }));\n\n        // Configure Monaco to only include YAML language support\n        config.plugins.push(new MonacoWebpackPlugin({\n            languages: ['yaml'],\n        }));\n\n        return config;\n    }\n);\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/.eslintrc.json",
    "content": "{\n  \"extends\": [\"plugin:cypress/recommended\", \"../../.eslintrc.json\"],\n  \"ignorePatterns\": [\"!**/*\"],\n  \"overrides\": [\n    {\n      \"files\": [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n      \"rules\": {}\n    },\n    {\n      \"files\": [\"src/plugins/index.js\"],\n      \"rules\": {\n        \"@typescript-eslint/no-var-requires\": \"off\",\n        \"no-undef\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\nimport { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';\n\nexport default defineConfig({\n  e2e: nxE2EPreset(__dirname),\n});\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/project.json",
    "content": "{\n  \"name\": \"vscode-windhawk-ui-e2e\",\n  \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n  \"sourceRoot\": \"apps/vscode-windhawk-ui-e2e/src\",\n  \"projectType\": \"application\",\n  \"targets\": {\n    \"e2e\": {\n      \"executor\": \"@nrwl/cypress:cypress\",\n      \"options\": {\n        \"cypressConfig\": \"apps/vscode-windhawk-ui-e2e/cypress.config.ts\",\n        \"devServerTarget\": \"vscode-windhawk-ui:serve:e2e\",\n        \"testingType\": \"e2e\"\n      },\n      \"configurations\": {\n        \"production\": {\n          \"devServerTarget\": \"vscode-windhawk-ui:serve:production\"\n        }\n      }\n    },\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\"{options.outputFile}\"],\n      \"options\": {\n        \"lintFilePatterns\": [\"apps/vscode-windhawk-ui-e2e/**/*.{js,ts}\"]\n      }\n    }\n  },\n  \"tags\": [],\n  \"implicitDependencies\": [\"vscode-windhawk-ui\"]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/src/e2e/app.cy.ts",
    "content": "import { getGreeting } from '../support/app.po';\n\ndescribe('vscode-windhawk-ui', () => {\n  beforeEach(() => cy.visit('/'));\n\n  it('should display welcome message', () => {\n    // Custom command example, see `../support/commands.ts` file\n    cy.login('my-email@something.com', 'myPassword');\n\n    // Function helper example, see `../support/app.po.ts` file\n    getGreeting().contains('Welcome vscode-windhawk-ui');\n  });\n});\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/src/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\"\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/src/support/app.po.ts",
    "content": "export const getGreeting = () => cy.get('h1');\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/src/support/commands.ts",
    "content": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom commands and overwrite\n// existing commands.\n//\n// For more comprehensive examples of custom\n// commands please read more here:\n// https://on.cypress.io/custom-commands\n// ***********************************************\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace Cypress {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  interface Chainable<Subject> {\n    login(email: string, password: string): void;\n  }\n}\n//\n// -- This is a parent command --\nCypress.Commands.add('login', (email, password) => {\n  console.log('Custom command example: Login', email, password);\n});\n//\n// -- This is a child command --\n// Cypress.Commands.add(\"drag\", { prevSubject: 'element'}, (subject, options) => { ... })\n//\n//\n// -- This is a dual command --\n// Cypress.Commands.add(\"dismiss\", { prevSubject: 'optional'}, (subject, options) => { ... })\n//\n//\n// -- This will overwrite an existing command --\n// Cypress.Commands.overwrite(\"visit\", (originalFn, url, options) => { ... })\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/src/support/e2e.ts",
    "content": "// ***********************************************************\n// This example support/index.js is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n\n// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "src/vscode-windhawk-ui/apps/vscode-windhawk-ui-e2e/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"sourceMap\": false,\n    \"outDir\": \"../../dist/out-tsc\",\n    \"allowJs\": true,\n    \"types\": [\"cypress\", \"node\"]\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.js\", \"cypress.config.ts\"]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/babel.config.json",
    "content": "{\n  \"babelrcRoots\": [\"*\"]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/jest.config.ts",
    "content": "import { getJestProjects } from '@nrwl/jest';\n\nexport default {\n  projects: getJestProjects(),\n};\n"
  },
  {
    "path": "src/vscode-windhawk-ui/jest.preset.js",
    "content": "const nxPreset = require('@nrwl/jest/preset').default;\n\nmodule.exports = { ...nxPreset };\n"
  },
  {
    "path": "src/vscode-windhawk-ui/libs/.gitkeep",
    "content": ""
  },
  {
    "path": "src/vscode-windhawk-ui/nx.json",
    "content": "{\n  \"$schema\": \"./node_modules/nx/schemas/nx-schema.json\",\n  \"npmScope\": \"vscode-windhawk-ui-nx\",\n  \"affected\": {\n    \"defaultBase\": \"master\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"nx/tasks-runners/default\",\n      \"options\": {\n        \"cacheableOperations\": [\"build\", \"lint\", \"test\", \"e2e\"]\n      }\n    }\n  },\n  \"targetDefaults\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"inputs\": [\"production\", \"^production\"]\n    },\n    \"test\": {\n      \"inputs\": [\"default\", \"^production\", \"{workspaceRoot}/jest.preset.js\"]\n    },\n    \"e2e\": {\n      \"inputs\": [\"default\", \"^production\"]\n    },\n    \"lint\": {\n      \"inputs\": [\"default\", \"{workspaceRoot}/.eslintrc.json\"]\n    }\n  },\n  \"namedInputs\": {\n    \"default\": [\"{projectRoot}/**/*\", \"sharedGlobals\"],\n    \"production\": [\n      \"default\",\n      \"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)\",\n      \"!{projectRoot}/tsconfig.spec.json\",\n      \"!{projectRoot}/jest.config.[jt]s\",\n      \"!{projectRoot}/.eslintrc.json\"\n    ],\n    \"sharedGlobals\": [\n      \"{workspaceRoot}/babel.config.json\",\n      \"{workspaceRoot}/package.json\"\n    ]\n  },\n  \"generators\": {\n    \"@nrwl/react\": {\n      \"application\": {\n        \"style\": \"styled-components\",\n        \"unitTestRunner\": \"jest\",\n        \"linter\": \"eslint\",\n        \"babel\": true\n      },\n      \"component\": {\n        \"style\": \"styled-components\"\n      },\n      \"library\": {\n        \"style\": \"styled-components\",\n        \"unitTestRunner\": \"jest\",\n        \"linter\": \"eslint\"\n      }\n    }\n  },\n  \"defaultProject\": \"vscode-windhawk-ui\"\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/package.json",
    "content": "{\n  \"name\": \"vscode-windhawk-ui-nx\",\n  \"version\": \"1.7.3\",\n  \"scripts\": {\n    \"start\": \"nx serve\",\n    \"watch\": \"nx build --configuration=development --watch\",\n    \"build\": \"nx build\",\n    \"build-ext\": \"npm run build && (robocopy /MIR dist/apps/vscode-windhawk-ui ../vscode-windhawk/webview) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0\",\n    \"test\": \"nx test\",\n    \"build-css\": \"less-watch-compiler --enable-js --run-once --main-file=app.less apps/vscode-windhawk-ui/src/app/ apps/vscode-windhawk-ui/src/app/\",\n    \"watch-css\": \"npm run build-css && less-watch-compiler --enable-js --main-file=app.less apps/vscode-windhawk-ui/src/app/ apps/vscode-windhawk-ui/src/app/\"\n  },\n  \"private\": true,\n  \"dependencies\": {\n    \"@fortawesome/fontawesome-svg-core\": \"^7.1.0\",\n    \"@fortawesome/free-brands-svg-icons\": \"^7.1.0\",\n    \"@fortawesome/free-solid-svg-icons\": \"^7.1.0\",\n    \"@fortawesome/react-fontawesome\": \"^3.1.1\",\n    \"@monaco-editor/react\": \"^4.7.0\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"antd\": \"^4.24.16\",\n    \"core-js\": \"^3.47.0\",\n    \"i18next\": \"^25.7.0\",\n    \"i18next-http-backend\": \"^3.0.2\",\n    \"immer\": \"^10.2.0\",\n    \"js-yaml\": \"^4.1.1\",\n    \"prism-themes\": \"^1.9.0\",\n    \"prismjs\": \"^1.30.0\",\n    \"react\": \"18.3.1\",\n    \"react-diff-view\": \"^3.3.2\",\n    \"react-dom\": \"18.3.1\",\n    \"react-i18next\": \"^16.3.5\",\n    \"react-infinite-scroll-component\": \"^6.1.0\",\n    \"react-is\": \"18.3.1\",\n    \"react-markdown\": \"^10.1.0\",\n    \"react-router-dom\": \"^7.9.6\",\n    \"regenerator-runtime\": \"0.14.1\",\n    \"rehype-raw\": \"^7.0.0\",\n    \"rehype-sanitize\": \"^6.0.0\",\n    \"rehype-slug\": \"^6.0.0\",\n    \"remark-gfm\": \"^4.0.1\",\n    \"styled-components\": \"6.1.19\",\n    \"swr\": \"^2.3.7\",\n    \"tslib\": \"^2.8.1\",\n    \"unidiff\": \"^1.0.4\",\n    \"usehooks-ts\": \"^3.1.1\"\n  },\n  \"devDependencies\": {\n    \"@nrwl/cli\": \"^14.3.2\",\n    \"@nrwl/cypress\": \"19.8.14\",\n    \"@nrwl/eslint-plugin-nx\": \"19.8.14\",\n    \"@nrwl/jest\": \"19.8.14\",\n    \"@nrwl/linter\": \"19.8.14\",\n    \"@nrwl/react\": \"^19.4.4\",\n    \"@nrwl/web\": \"19.8.14\",\n    \"@nrwl/webpack\": \"^19.5.0\",\n    \"@nrwl/workspace\": \"19.8.14\",\n    \"@pmmmwh/react-refresh-webpack-plugin\": \"^0.6.2\",\n    \"@svgr/webpack\": \"^8.1.0\",\n    \"@testing-library/react\": \"16.3.0\",\n    \"@types/jest\": \"29.5.14\",\n    \"@types/node\": \"22.19.1\",\n    \"@types/prismjs\": \"^1.26.5\",\n    \"@types/react\": \"18.3.27\",\n    \"@types/react-dom\": \"18.3.7\",\n    \"@types/react-is\": \"18.3.1\",\n    \"@types/styled-components\": \"5.1.36\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.48.0\",\n    \"@typescript-eslint/parser\": \"^8.48.0\",\n    \"babel-jest\": \"29.7.0\",\n    \"babel-plugin-styled-components\": \"2.1.4\",\n    \"cypress\": \"^13.17.0\",\n    \"eslint\": \"~8.57.1\",\n    \"eslint-config-prettier\": \"9.1.2\",\n    \"eslint-plugin-cypress\": \"^3.6.0\",\n    \"eslint-plugin-import\": \"2.32.0\",\n    \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n    \"eslint-plugin-react\": \"7.37.5\",\n    \"eslint-plugin-react-hooks\": \"4.6.2\",\n    \"jest\": \"29.7.0\",\n    \"jest-environment-jsdom\": \"29.7.0\",\n    \"less-watch-compiler\": \"^1.16.3\",\n    \"monaco-editor\": \"^0.55.1\",\n    \"monaco-editor-webpack-plugin\": \"^7.1.1\",\n    \"nx\": \"20.8.3\",\n    \"prettier\": \"^3.7.3\",\n    \"react-refresh\": \"^0.18.0\",\n    \"react-test-renderer\": \"18.3.1\",\n    \"ts-jest\": \"29.4.6\",\n    \"ts-node\": \"10.9.2\",\n    \"typescript\": \"~5.9.3\",\n    \"url-loader\": \"^4.1.1\"\n  }\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/tools/generators/.gitkeep",
    "content": ""
  },
  {
    "path": "src/vscode-windhawk-ui/tools/tsconfig.tools.json",
    "content": "{\n  \"extends\": \"../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../dist/out-tsc/tools\",\n    \"rootDir\": \".\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"types\": [\"node\"],\n    \"importHelpers\": false\n  },\n  \"include\": [\"**/*.ts\"]\n}\n"
  },
  {
    "path": "src/vscode-windhawk-ui/tsconfig.base.json",
    "content": "{\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"rootDir\": \".\",\n    \"sourceMap\": true,\n    \"declaration\": false,\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"importHelpers\": true,\n    \"target\": \"es2015\",\n    \"module\": \"esnext\",\n    \"lib\": [\"es2021\", \"dom\"],\n    \"skipLibCheck\": true,\n    \"skipDefaultLibCheck\": true,\n    \"baseUrl\": \".\",\n    \"paths\": {}\n  },\n  \"exclude\": [\"node_modules\", \"tmp\"]\n}\n"
  },
  {
    "path": "src/windhawk/.clang-format",
    "content": "BasedOnStyle: Chromium\nIndentWidth: 4\n\n# Reference: https://github.com/chromium/chromium/blob/3d90e395a5e87e305e567c097c434549f0d0874e/.clang-format\n# Make sure code like:\n# BEGIN_MESSAGE_MAP()\n#     MESSAGE_HANDLER(WidgetHostViewHost_Update, OnUpdate)\n# END_MESSAGE_MAP()\n# gets correctly indented.\nMacroBlockBegin: \"^\\\nBEGIN_MSG_MAP|\\\nBEGIN_MSG_MAP_EX|\\\nBEGIN_DLGRESIZE_MAP$\"\nMacroBlockEnd: \"^\\\nEND_MSG_MAP|\\\nEND_DLGRESIZE_MAP$\"\n"
  },
  {
    "path": "src/windhawk/.gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": "src/windhawk/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n#*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n"
  },
  {
    "path": "src/windhawk/_typos.toml",
    "content": "[files]\n# Files to exclude from spell checking.\nextend-exclude = [\n    \"/app/libraries/\",\n    \"/app/rsrc.rc\",\n    \"/engine/libraries/\",\n    \"/shared/libraries/\",\n]\n\n[default.extend-words]\n# Words to ignore.\nwil = \"wil\"  # Windows Implementation Library\n\n[default.extend-identifiers]\n# Identifiers to ignore - false positives.\nNIN_BALLOONUSERCLICK = \"NIN_BALLOONUSERCLICK\"\nNIN_KEYSELECT = \"NIN_KEYSELECT\"\nNIN_SELECT = \"NIN_SELECT\"\nPUNICODE_STR = \"PUNICODE_STR\"\nPUNICODE_STRING = \"PUNICODE_STRING\"\nPUNICODE_STRING64 = \"PUNICODE_STRING64\"\nMkTypLibCompatible = \"MkTypLibCompatible\"\n"
  },
  {
    "path": "src/windhawk/app/app.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"main_window.h\"\n#include \"resource.h\"\n#include \"service.h\"\n#include \"storage_manager.h\"\n#include \"ui_control.h\"\n\nCAppModule _Module;\n\nnamespace {\n\nenum class Action {\n    kDefault,\n    kService,\n    kServiceStart,\n    kServiceStop,\n    kRunUI,\n    kRunUIAsAdmin,\n    kRunUIInSafeMode,\n    kServiceStartAndRunUI,\n    kCheckForUpdates,\n    kNewUpdatesFound,\n    kAppSettingsChanged,\n    kExit,\n    kRestart,\n    kRestartBg,\n};\n\nvoid Initialize();\nvoid Run(Action action);\nvoid RunDaemon();\nvoid CheckForUpdates();\nvoid NotifyNewUpdatesFound();\nvoid NotifyAppSettingsChanged();\nvoid ExitApp(bool wait, DWORD timeout);\nvoid RestartApp(DWORD timeout, bool trayOnly);\nvoid RestartAppBg(DWORD timeout);\nvoid EnableSafeMode();\nvoid WaitForRunningProcessesToTerminate(DWORD timeout,\n                                        bool windhawkBgOnly = false);\nvoid RunAsNewProcess(PCWSTR parameters);\nbool RunAsAdmin(PCWSTR parameters);\nbool PostCommandToPortableRunningDaemon(\n    CMainWindow::PortableAppCommand command);\nvoid SetNamedEventForAllSessions(PCWSTR eventNamePrefix);\nbool SetNamedEvent(PCWSTR eventName);\nbool DoesParamExist(PCWSTR param);\nint GetIntParam(PCWSTR param);\n\n}  // namespace\n\nint WINAPI wWinMain(_In_ HINSTANCE hInstance,\n                    _In_opt_ HINSTANCE hPrevInstance,\n                    _In_ LPWSTR lpCmdLine,\n                    _In_ int nShowCmd) {\n    HRESULT hRes = ::CoInitialize(nullptr);\n    ATLASSERT(SUCCEEDED(hRes));\n\n    hRes = _Module.Init(nullptr, hInstance);\n    ATLASSERT(SUCCEEDED(hRes));\n\n    // Disable exception suppression in timer callbacks, as suggested by MSDN\n    // and Bruce Dawson.\n    // https://randomascii.wordpress.com/2012/07/05/when-even-crashing-doesnt-work/\n    BOOL insanity = FALSE;\n    SetUserObjectInformation(GetCurrentProcess(),\n                             UOI_TIMERPROC_EXCEPTION_SUPPRESSION, &insanity,\n                             sizeof(insanity));\n\n    SetCurrentProcessExplicitAppUserModelID(L\"RamenSoftware.Windhawk\");\n\n    Action action = Action::kDefault;\n    if (DoesParamExist(L\"-service\")) {\n        action = Action::kService;\n    } else if (DoesParamExist(L\"-service-start\")) {\n        action = Action::kServiceStart;\n    } else if (DoesParamExist(L\"-service-stop\")) {\n        action = Action::kServiceStop;\n    } else if (DoesParamExist(L\"-run-ui\")) {\n        action = Action::kRunUI;\n    } else if (DoesParamExist(L\"-run-ui-as-admin\")) {\n        action = Action::kRunUIAsAdmin;\n    } else if (DoesParamExist(L\"-run-ui-in-safe-mode\")) {\n        action = Action::kRunUIInSafeMode;\n    } else if (DoesParamExist(L\"-service-start-and-run-ui\")) {\n        action = Action::kServiceStartAndRunUI;\n    } else if (DoesParamExist(L\"-check-for-updates\")) {\n        action = Action::kCheckForUpdates;\n    } else if (DoesParamExist(L\"-new-updates-found\")) {\n        action = Action::kNewUpdatesFound;\n    } else if (DoesParamExist(L\"-app-settings-changed\")) {\n        action = Action::kAppSettingsChanged;\n    } else if (DoesParamExist(L\"-exit\")) {\n        action = Action::kExit;\n    } else if (DoesParamExist(L\"-restart\")) {\n        action = Action::kRestart;\n    } else if (DoesParamExist(L\"-restart-bg\")) {\n        action = Action::kRestartBg;\n    }\n\n    HRESULT hr = S_OK;\n\n    try {\n        Initialize();\n        Run(action);\n    } catch (const std::exception& e) {\n        switch (action) {\n            case Action::kDefault:\n            case Action::kRunUI:\n            case Action::kRunUIAsAdmin:\n            case Action::kRunUIInSafeMode:\n            case Action::kServiceStartAndRunUI:\n                ::MessageBoxA(nullptr, e.what(), \"Windhawk error\",\n                              MB_ICONERROR);\n                break;\n\n            default:\n                LOG(L\"%S\", e.what());\n                break;\n        }\n\n        hr = wil::ResultFromCaughtException();\n    }\n\n    _Module.Term();\n    ::CoUninitialize();\n\n    return hr;\n}\n\nnamespace {\n\nvoid Initialize() {\n    // Make sure we can get an instance.\n    // If not, this call will throw an exception.\n    StorageManager::GetInstance();\n}\n\nvoid Run(Action action) {\n    switch (action) {\n        case Action::kService:\n            VERBOSE(\"Running service\");\n            Service::Run();\n            break;\n\n        case Action::kServiceStart:\n            VERBOSE(\"Starting service\");\n            Service::Start();\n            break;\n\n        case Action::kServiceStop:\n            VERBOSE(\"Stopping service\");\n            Service::Stop(DoesParamExist(L\"-also-no-autostart\"));\n            break;\n\n        case Action::kRunUIAsAdmin:\n            VERBOSE(\"Running UI as admin\");\n            if (!Functions::IsRunAsAdmin()) {\n                RunAsAdmin(L\"-run-ui\");\n                break;\n            }\n            [[fallthrough]];\n        case Action::kRunUI:\n            VERBOSE(\"Running UI\");\n            UIControl::RunUI();\n            break;\n\n        case Action::kRunUIInSafeMode:\n            VERBOSE(\"Running UI in safe mode\");\n            ExitApp(/*wait=*/true, /*timeout=*/30000);\n            EnableSafeMode();\n            UIControl::RunUI();\n            break;\n\n        case Action::kServiceStartAndRunUI:\n            VERBOSE(\"Starting service and running UI\");\n            Service::Start();\n            UIControl::RunUI();\n            break;\n\n        case Action::kCheckForUpdates:\n            VERBOSE(\"Checking for updates\");\n            CheckForUpdates();\n            break;\n\n        case Action::kNewUpdatesFound:\n            VERBOSE(\"Notifying about new updates found\");\n            NotifyNewUpdatesFound();\n            break;\n\n        case Action::kAppSettingsChanged:\n            VERBOSE(\"Notifying about app settings changed\");\n            NotifyAppSettingsChanged();\n            break;\n\n        case Action::kExit: {\n            VERBOSE(\"Exiting app\");\n            DWORD timeout = GetIntParam(L\"-timeout\");\n            if (timeout == 0) {\n                timeout = INFINITE;\n            }\n\n            ExitApp(DoesParamExist(L\"-wait\"), timeout);\n            break;\n        }\n\n        case Action::kRestart: {\n            VERBOSE(\"Restarting app\");\n            DWORD timeout = GetIntParam(L\"-timeout\");\n            if (timeout == 0) {\n                timeout = INFINITE;\n            }\n\n            RestartApp(timeout, DoesParamExist(L\"-tray-only\"));\n            break;\n        }\n\n        case Action::kRestartBg: {\n            VERBOSE(\"Restarting service/daemon\");\n            DWORD timeout = GetIntParam(L\"-timeout\");\n            if (timeout == 0) {\n                timeout = INFINITE;\n            }\n\n            RestartAppBg(timeout);\n            break;\n        }\n\n        default:\n            VERBOSE(\"Running Windhawk daemon\");\n            RunDaemon();\n            break;\n    }\n}\n\nvoid RunDaemon() {\n    if (DoesParamExist(L\"-wait\")) {\n        DWORD timeout = GetIntParam(L\"-timeout\");\n        if (timeout == 0) {\n            timeout = INFINITE;\n        }\n\n        WaitForRunningProcessesToTerminate(timeout);\n    }\n\n    bool portable = StorageManager::GetInstance().IsPortable();\n\n    if (DoesParamExist(L\"-safe-mode\") ||\n        (GetSystemMetrics(SM_CLEANBOOT) != 0 &&\n         MessageBox(nullptr,\n                    Functions::LoadStrFromRsrc(IDS_SAFE_MODE_DETECTED_TEXT),\n                    Functions::LoadStrFromRsrc(IDS_SAFE_MODE_DETECTED_TITLE),\n                    MB_ICONWARNING | MB_YESNO) == IDYES)) {\n        if (portable) {\n            ExitApp(/*wait=*/true, /*timeout=*/30000);\n            EnableSafeMode();\n            UIControl::RunUI();\n        } else {\n            RunAsAdmin(L\"-run-ui-in-safe-mode\");\n        }\n        return;\n    }\n\n    bool trayOnly = DoesParamExist(L\"-tray-only\");\n\n    if (!portable && !Service::IsRunning(/*waitIfStarting=*/true)) {\n        // Start the service, which will in turn launch a new instance.\n        if (!Functions::IsRunAsAdmin()) {\n            RunAsAdmin(trayOnly ? L\"-service-start\"\n                                : L\"-service-start-and-run-ui\");\n        } else {\n            Service::Start();\n            if (!trayOnly) {\n                UIControl::RunUI();\n            }\n        }\n        return;\n    }\n\n    wil::unique_mutex_nothrow mutex(\n        ::CreateMutex(nullptr, TRUE, L\"WindhawkDaemon\"));\n    THROW_LAST_ERROR_IF_NULL(mutex);\n\n    if (GetLastError() == ERROR_ALREADY_EXISTS) {\n        if (!trayOnly) {\n            UIControl::RunUIOrBringToFront(\n                nullptr, !portable && !Functions::IsRunAsAdmin());\n        }\n\n        return;\n    }\n\n    auto mutexLock = mutex.ReleaseMutex_scope_exit();\n\n    if (portable) {\n        if (!Functions::SetDebugPrivilege(TRUE)) {\n            LOG(L\"SetDebugPrivilege failed with error %u\", GetLastError());\n        }\n    }\n\n    // We need a custom CMessageLoop class to be able to wait\n    // for objects in OnIdle correctly.\n    class CMessageLoopAlwaysRunOnIdle : public CMessageLoop {\n       public:\n        BOOL OnIdle(int nIdleCount) override {\n            CMessageLoop::OnIdle(nIdleCount);\n            return TRUE;  // continue\n        }\n    };\n\n    CMessageLoopAlwaysRunOnIdle loop;\n    _Module.AddMessageLoop(&loop);\n\n    CMainWindow wnd(trayOnly, portable);\n    wnd.Create(nullptr);\n    // wnd.ShowWindow(SW_SHOW);\n\n    loop.Run();\n\n    _Module.RemoveMessageLoop();\n}\n\nvoid CheckForUpdates() {\n    bool portable = StorageManager::GetInstance().IsPortable();\n\n    UpdateChecker m_updateChecker(portable ? UpdateChecker::kFlagPortable : 0,\n                                  nullptr);\n    UpdateChecker::Result result = m_updateChecker.HandleResponse();\n    THROW_IF_FAILED(result.hrError);\n\n    if (result.updateStatus.newUpdatesFound) {\n        NotifyNewUpdatesFound();\n    }\n}\n\nvoid NotifyNewUpdatesFound() {\n    SetNamedEventForAllSessions(\n        L\"Global\\\\WindhawkNewUpdatesFoundEvent-daemon-session=\");\n}\n\nvoid NotifyAppSettingsChanged() {\n    if (StorageManager::GetInstance().IsPortable()) {\n        SetNamedEvent(L\"WindhawkAppSettingsChangedEvent-daemon\");\n        return;\n    }\n\n    SetNamedEventForAllSessions(\n        L\"Global\\\\WindhawkAppSettingsChangedEvent-daemon-session=\");\n}\n\nvoid ExitApp(bool wait, DWORD timeout) {\n    if (StorageManager::GetInstance().IsPortable()) {\n        PostCommandToPortableRunningDaemon(\n            CMainWindow::PortableAppCommand::kExit);\n    } else {\n        Service::Stop(false);\n    }\n\n    if (wait) {\n        WaitForRunningProcessesToTerminate(timeout);\n    }\n}\n\nvoid RestartApp(DWORD timeout, bool trayOnly) {\n    bool portable = StorageManager::GetInstance().IsPortable();\n\n    if (portable) {\n        PostCommandToPortableRunningDaemon(\n            CMainWindow::PortableAppCommand::kExit);\n    } else {\n        Service::Stop(false);\n    }\n\n    WaitForRunningProcessesToTerminate(timeout);\n\n    if (portable) {\n        RunAsNewProcess(trayOnly ? L\"-tray-only\" : nullptr);\n    } else {\n        Service::Start();\n        if (!trayOnly) {\n            UIControl::RunUI();\n        }\n    }\n}\n\nvoid RestartAppBg(DWORD timeout) {\n    auto uiWindows = UIControl::GetOpenUIWindows();\n\n    // Disable UI windows to prevent them from being closed by the daemon. Not a\n    // perfect solution but it works.\n    for (HWND hWnd : uiWindows) {\n        EnableWindow(hWnd, false);\n    }\n\n    bool portable = StorageManager::GetInstance().IsPortable();\n\n    if (portable) {\n        PostCommandToPortableRunningDaemon(\n            CMainWindow::PortableAppCommand::kExit);\n    } else {\n        Service::Stop(false);\n    }\n\n    WaitForRunningProcessesToTerminate(timeout, /*windhawkBgOnly=*/true);\n\n    for (HWND hWnd : uiWindows) {\n        EnableWindow(hWnd, true);\n    }\n\n    if (portable) {\n        RunAsNewProcess(L\"-tray-only\");\n    } else {\n        Service::Start();\n    }\n}\n\nvoid EnableSafeMode() {\n    StorageManager::GetInstance()\n        .GetAppConfig(L\"Settings\", true)\n        ->SetInt(L\"SafeMode\", 1);\n}\n\nvoid WaitForRunningProcessesToTerminate(DWORD timeout, bool windhawkBgOnly) {\n    DWORD startTickCount = GetTickCount();\n\n    HRESULT hr;\n\n    // Use QueryFullProcessImageName instead of GetModuleFileName because the\n    // latter can return a path with a different case depending on how the\n    // process was launched. QueryFullProcessImageName seems to be consistent\n    // in this regard.\n    std::filesystem::path modulePath =\n        wil::QueryFullProcessImageName<std::wstring>();\n    auto folderPath = modulePath.parent_path();\n\n    while (true) {\n        HANDLE handlesRawArray[MAXIMUM_WAIT_OBJECTS];\n        wil::unique_process_handle handles[MAXIMUM_WAIT_OBJECTS];\n        DWORD handlesCount = 0;\n\n        wil::unique_tool_help_snapshot snapshot(\n            CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));\n        THROW_LAST_ERROR_IF(!snapshot);\n\n        PROCESSENTRY32 pe;\n        pe.dwSize = sizeof(PROCESSENTRY32);\n        THROW_IF_WIN32_BOOL_FALSE(Process32First(snapshot.get(), &pe));\n\n        do {\n            if (pe.th32ProcessID == 0) {\n                // Skipping System Idle Process.\n                continue;\n            }\n\n            if (pe.th32ProcessID == GetCurrentProcessId()) {\n                // Skipping current process.\n                continue;\n            }\n\n            if (windhawkBgOnly) {\n                if (_wcsicmp(pe.szExeFile, L\"windhawk.exe\") != 0) {\n                    continue;\n                }\n            } else {\n                if (_wcsicmp(pe.szExeFile, L\"uninstall.exe\") == 0) {\n                    // Skipping uninstaller, which may be running but is not\n                    // part of the app.\n                    continue;\n                }\n            }\n\n            wil::unique_process_handle process(\n                OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | SYNCHRONIZE,\n                            FALSE, pe.th32ProcessID));\n            if (process) {\n                std::wstring fullProcessImageName;\n                hr = wil::QueryFullProcessImageName<std::wstring>(\n                    process.get(), 0, fullProcessImageName);\n                if (SUCCEEDED(hr)) {\n                    // Is path inside folder:\n                    // https://stackoverflow.com/a/40441240\n                    if (fullProcessImageName.rfind(folderPath, 0) == 0) {\n                        VERBOSE(L\"Waiting for %u (%s)\", pe.th32ProcessID,\n                                pe.szExeFile);\n                        handlesRawArray[handlesCount] = process.get();\n                        handles[handlesCount] = std::move(process);\n                        handlesCount++;\n                    }\n                } else {\n                    VERBOSE(\n                        L\"QueryFullProcessImageName for %u (%s) failed with \"\n                        L\"error 0x%08X\",\n                        pe.th32ProcessID, pe.szExeFile, hr);\n                }\n            } else {\n                VERBOSE(L\"OpenProcess for %u (%s) failed with error %u\",\n                        pe.th32ProcessID, pe.szExeFile, GetLastError());\n            }\n        } while (handlesCount < _countof(handles) &&\n                 Process32Next(snapshot.get(), &pe));\n\n        if (handlesCount < _countof(handles)) {\n            THROW_LAST_ERROR_IF(GetLastError() != ERROR_NO_MORE_FILES);\n        }\n\n        if (handlesCount > 0) {\n            DWORD iterationTimeout = timeout;\n            if (iterationTimeout != INFINITE) {\n                DWORD timePassed = GetTickCount() - startTickCount;\n                if (timePassed >= iterationTimeout) {\n                    THROW_WIN32(ERROR_TIMEOUT);\n                }\n\n                iterationTimeout -= timePassed;\n            }\n\n            VERBOSE(L\"Waiting for %u processes\", handlesCount);\n\n            switch (WaitForMultipleObjects(handlesCount, handlesRawArray, TRUE,\n                                           iterationTimeout)) {\n                case WAIT_TIMEOUT:\n                    THROW_WIN32(ERROR_TIMEOUT);\n\n                case WAIT_FAILED:\n                    THROW_LAST_ERROR();\n            }\n        }\n\n        if (handlesCount < _countof(handles)) {\n            break;\n        }\n    }\n}\n\nvoid RunAsNewProcess(PCWSTR parameters) {\n    auto modulePath = wil::GetModuleFileName<std::wstring>();\n\n    std::wstring commandLine = L\"\\\"\" + modulePath + L\"\\\"\";\n    if (parameters && *parameters != L'\\0') {\n        commandLine += L' ';\n        commandLine += parameters;\n    }\n\n    STARTUPINFO si = {sizeof(STARTUPINFO)};\n    wil::unique_process_information process;\n\n    THROW_IF_WIN32_BOOL_FALSE(CreateProcess(\n        modulePath.c_str(), commandLine.data(), nullptr, nullptr, FALSE,\n        NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &process));\n}\n\nbool RunAsAdmin(PCWSTR parameters) {\n    auto modulePath = wil::GetModuleFileName<std::wstring>();\n\n    if ((int)(UINT_PTR)ShellExecute(nullptr, L\"runas\", modulePath.c_str(),\n                                    parameters, nullptr, SW_SHOWNORMAL) > 32) {\n        return true;\n    }\n\n    THROW_LAST_ERROR_IF(GetLastError() != ERROR_CANCELLED);\n    return false;\n}\n\nbool PostCommandToPortableRunningDaemon(\n    CMainWindow::PortableAppCommand command) {\n    CWindow hDaemonWnd(FindWindow(L\"WindhawkDaemon\", nullptr));\n    if (!hDaemonWnd) {\n        return false;\n    }\n\n    ::AllowSetForegroundWindow(hDaemonWnd.GetWindowProcessID());\n\n    THROW_IF_WIN32_BOOL_FALSE(hDaemonWnd.PostMessage(\n        CMainWindow::UWM_PORTABLE_APP_COMMAND, (WPARAM)command));\n\n    return true;\n}\n\nvoid SetNamedEventForAllSessions(PCWSTR eventNamePrefix) {\n    WTS_SESSION_INFO* sessionInfo;\n    DWORD dwCount;\n\n    THROW_IF_WIN32_BOOL_FALSE(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0,\n                                                   1, &sessionInfo, &dwCount));\n    wil::unique_wtsmem_ptr<WTS_SESSION_INFO> scopedSessionInfo(sessionInfo);\n\n    for (DWORD i = 0; i < dwCount; i++) {\n        WCHAR* pszUserName;\n        DWORD dwUserNameLen;\n\n        THROW_IF_WIN32_BOOL_FALSE(WTSQuerySessionInformation(\n            WTS_CURRENT_SERVER_HANDLE, sessionInfo[i].SessionId, WTSUserName,\n            &pszUserName, &dwUserNameLen));\n        wil::unique_wtsmem_ptr<WCHAR> scopedUserName(pszUserName);\n\n        if (*pszUserName != L'\\0') {\n            auto eventName =\n                eventNamePrefix + std::to_wstring(sessionInfo[i].SessionId);\n            SetNamedEvent(eventName.c_str());\n        }\n    }\n}\n\nbool SetNamedEvent(PCWSTR eventName) {\n    wil::unique_event namedEvent(\n        OpenEvent(EVENT_MODIFY_STATE, FALSE, eventName));\n    if (!namedEvent) {\n        THROW_LAST_ERROR_IF(GetLastError() != ERROR_FILE_NOT_FOUND);\n        return false;\n    }\n\n    namedEvent.SetEvent();\n    return true;\n}\n\nbool DoesParamExist(PCWSTR param) {\n    for (int i = 1; i < __argc; i++) {\n        if (_wcsicmp(__wargv[i], param) == 0) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nint GetIntParam(PCWSTR param) {\n    for (int i = 1; i < __argc - 1; i++) {\n        if (_wcsicmp(__wargv[i], param) == 0) {\n            return _wtoi(__wargv[i + 1]);\n        }\n    }\n\n    return 0;\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/windhawk/app/app.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}</ProjectGuid>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <TargetName>windhawk</TargetName>\n    <LibraryPath>$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName />\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_WINDOWS;STRICT;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName />\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_WINDOWS;STRICT;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName>\n      </DllDataFileName>\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <DebugInformationFormat />\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName />\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <DebugInformationFormat />\n      <PreprocessorDefinitions>_WINDOWS;STRICT;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName />\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n      <PreprocessorDefinitions>_WINDOWS;STRICT;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>\n      <AdditionalDependencies>taskschd.lib;userenv.lib;wevtapi.lib;wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n    <ResourceCompile>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <NullTerminateStrings>true</NullTerminateStrings>\n    </ResourceCompile>\n    <Midl>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <HeaderFileName>app.h</HeaderFileName>\n      <InterfaceIdentifierFileName>app_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>app_p.c</ProxyFileName>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)/app.tlb</TypeLibraryName>\n      <DllDataFileName>\n      </DllDataFileName>\n    </Midl>\n    <Manifest>\n      <AdditionalManifestFiles>rsrc\\compatibility.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\shared\\logger_base.cpp\" />\n    <ClCompile Include=\"..\\shared\\portable_settings.cpp\" />\n    <ClCompile Include=\"app.cpp\" />\n    <ClCompile Include=\"engine_control.cpp\" />\n    <ClCompile Include=\"event_viewer_crash_monitor.cpp\" />\n    <ClCompile Include=\"functions.cpp\" />\n    <ClCompile Include=\"logger.cpp\" />\n    <ClCompile Include=\"main_window.cpp\" />\n    <ClCompile Include=\"service.cpp\" />\n    <ClCompile Include=\"stdafx.cpp\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Create</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"storage_manager.cpp\" />\n    <ClCompile Include=\"task_manager_dlg.cpp\" />\n    <ClCompile Include=\"tray_icon.cpp\" />\n    <ClCompile Include=\"ui_control.cpp\" />\n    <ClCompile Include=\"update_checker.cpp\" />\n    <ClCompile Include=\"userprofile.cpp\" />\n    <ClCompile Include=\"toolkit_dlg.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\shared\\logger_base.h\" />\n    <ClInclude Include=\"..\\shared\\portable_settings.h\" />\n    <ClInclude Include=\"..\\shared\\version.h\" />\n    <ClInclude Include=\"engine_control.h\" />\n    <ClInclude Include=\"event_viewer_crash_monitor.h\" />\n    <ClInclude Include=\"functions.h\" />\n    <ClInclude Include=\"logger.h\" />\n    <ClInclude Include=\"main_window.h\" />\n    <ClInclude Include=\"resource.h\" />\n    <ClInclude Include=\"service.h\" />\n    <ClInclude Include=\"service_common.h\" />\n    <ClInclude Include=\"stdafx.h\" />\n    <ClInclude Include=\"storage_manager.h\" />\n    <ClInclude Include=\"task_manager_dlg.h\" />\n    <ClInclude Include=\"tray_icon.h\" />\n    <ClInclude Include=\"ui_control.h\" />\n    <ClInclude Include=\"update_checker.h\" />\n    <ClInclude Include=\"userprofile.h\" />\n    <ClInclude Include=\"toolkit_dlg.h\" />\n    <ClInclude Include=\"winhttpsimple.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"rsrc.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Image Include=\"rsrc\\app.ico\" />\n    <Image Include=\"rsrc\\app_notification.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n    <Import Project=\"..\\packages\\wtl.10.0.10320\\build\\native\\wtl.targets\" Condition=\"Exists('..\\packages\\wtl.10.0.10320\\build\\native\\wtl.targets')\" />\n  </ImportGroup>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\wtl.10.0.10320\\build\\native\\wtl.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\wtl.10.0.10320\\build\\native\\wtl.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "src/windhawk/app/app.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{22b472b6-8e00-43cc-9d05-145bf61d6fa8}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{aff9dafa-81f2-49e9-8577-a319932c9c56}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{c9908b8c-b610-454b-9f8a-fd6afc7f6daa}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"app.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main_window.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"tray_icon.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"storage_manager.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\shared\\portable_settings.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"engine_control.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"ui_control.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"update_checker.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"userprofile.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\shared\\logger_base.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"logger.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"functions.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"service.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"task_manager_dlg.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"toolkit_dlg.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"event_viewer_crash_monitor.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"main_window.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"tray_icon.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"storage_manager.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\portable_settings.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\version.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"engine_control.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"ui_control.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"update_checker.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"userprofile.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\logger_base.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"logger.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"functions.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"service.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"winhttpsimple.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"task_manager_dlg.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"service_common.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"toolkit_dlg.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"event_viewer_crash_monitor.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"rsrc.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <Image Include=\"rsrc\\app.ico\">\n      <Filter>Resource Files</Filter>\n    </Image>\n    <Image Include=\"rsrc\\app_notification.ico\">\n      <Filter>Resource Files</Filter>\n    </Image>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/windhawk/app/engine_control.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"engine_control.h\"\n\n#include \"storage_manager.h\"\n\nEngineControl::EngineControl() {\n    auto engineLibraryPath =\n        StorageManager::GetInstance().GetEnginePath() / L\"windhawk.dll\";\n\n    engineModule.reset(LoadLibrary(engineLibraryPath.c_str()));\n    THROW_LAST_ERROR_IF_NULL_MSG(\n        engineModule,\n        \"Failed to load engine library: %ls, make sure that the engine path \"\n        \"that's specified in windhawk.ini is correct\",\n        engineLibraryPath.c_str());\n\n    pGlobalHookSessionStart = reinterpret_cast<GLOBAL_HOOK_SESSION_START>(\n        GetProcAddress(engineModule.get(), \"GlobalHookSessionStart\"));\n    THROW_LAST_ERROR_IF_NULL(pGlobalHookSessionStart);\n\n    pGlobalHookSessionHandleNewProcesses =\n        reinterpret_cast<GLOBAL_HOOK_SESSION_HANDLE_NEW_PROCESSES>(\n            GetProcAddress(engineModule.get(),\n                           \"GlobalHookSessionHandleNewProcesses\"));\n    THROW_LAST_ERROR_IF_NULL(pGlobalHookSessionHandleNewProcesses);\n\n    pGlobalHookSessionEnd = reinterpret_cast<GLOBAL_HOOK_SESSION_END>(\n        GetProcAddress(engineModule.get(), \"GlobalHookSessionEnd\"));\n    THROW_LAST_ERROR_IF_NULL(pGlobalHookSessionEnd);\n\n    hGlobalHookSession = pGlobalHookSessionStart();\n    if (!hGlobalHookSession) {\n        throw std::runtime_error(\"Failed to start the global hooking session\");\n    }\n}\n\nEngineControl::~EngineControl() {\n    pGlobalHookSessionEnd(hGlobalHookSession);\n}\n\nBOOL EngineControl::HandleNewProcesses() {\n    return pGlobalHookSessionHandleNewProcesses(hGlobalHookSession);\n}\n"
  },
  {
    "path": "src/windhawk/app/engine_control.h",
    "content": "#pragma once\n\nclass EngineControl {\n   public:\n    EngineControl();\n    ~EngineControl();\n\n    EngineControl(const EngineControl&) = delete;\n    EngineControl(EngineControl&&) = delete;\n    EngineControl& operator=(const EngineControl&) = delete;\n    EngineControl& operator=(EngineControl&&) = delete;\n\n    BOOL HandleNewProcesses();\n\n   private:\n    using GLOBAL_HOOK_SESSION_START = HANDLE (*)();\n    using GLOBAL_HOOK_SESSION_HANDLE_NEW_PROCESSES = BOOL (*)(HANDLE hSession);\n    using GLOBAL_HOOK_SESSION_END = BOOL (*)(HANDLE hSession);\n\n    wil::unique_hmodule engineModule;\n    GLOBAL_HOOK_SESSION_START pGlobalHookSessionStart;\n    GLOBAL_HOOK_SESSION_HANDLE_NEW_PROCESSES\n        pGlobalHookSessionHandleNewProcesses;\n    GLOBAL_HOOK_SESSION_END pGlobalHookSessionEnd;\n    HANDLE hGlobalHookSession;\n};\n"
  },
  {
    "path": "src/windhawk/app/event_viewer_crash_monitor.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"event_viewer_crash_monitor.h\"\n\n#include \"logger.h\"\n\n// Based on:\n// https://learn.microsoft.com/en-us/windows/win32/wes/subscribing-to-events#push-subscriptions\n// https://learn.microsoft.com/en-us/windows/win32/wes/rendering-events\n\nEventViewerCrashMonitor::EventViewerCrashMonitor(\n    std::wstring_view targetAppPath)\n    : m_targetAppPath(targetAppPath) {\n    // Get a handle to an event object that the subscription will signal when\n    // events become available that match your query criteria.\n    m_event.reset(CreateEvent(nullptr, TRUE, TRUE, nullptr));\n    THROW_LAST_ERROR_IF_NULL(m_event);\n\n    PCWSTR pwsPath = L\"Application\";\n    PCWSTR pwsQuery = L\"Event/System[Level=2] and Event/System[EventID=1000]\";\n\n    // Subscribe to events.\n    m_subscription.reset(EvtSubscribe(nullptr, m_event.get(), pwsPath, pwsQuery,\n                                      nullptr, nullptr, nullptr,\n                                      EvtSubscribeToFutureEvents));\n    THROW_LAST_ERROR_IF_NULL(m_subscription);\n\n    LCMapStringEx(\n        LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &m_targetAppPath[0],\n        wil::safe_cast<int>(m_targetAppPath.length()), &m_targetAppPath[0],\n        wil::safe_cast<int>(m_targetAppPath.length()), nullptr, nullptr, 0);\n}\n\nHANDLE EventViewerCrashMonitor::GetEventHandle() const {\n    return m_event.get();\n}\n\nint EventViewerCrashMonitor::GetAmountOfNewEvents() {\n    int count = 0;\n\n    while (true) {\n        // Get a block of events from the result set.\n        wil::unique_evt_handle eventHandle;\n        DWORD dwReturned;\n        if (!EvtNext(m_subscription.get(), 1, &eventHandle, INFINITE, 0,\n                     &dwReturned)) {\n            THROW_LAST_ERROR_IF(GetLastError() != ERROR_NO_MORE_ITEMS);\n            break;\n        }\n\n        try {\n            if (DoesEventMatch(eventHandle.get())) {\n                count++;\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"%S\", e.what());\n        }\n    }\n\n    ResetEvent(m_event.get());\n\n    return count;\n}\n\nbool EventViewerCrashMonitor::DoesEventMatch(EVT_HANDLE eventHandle) {\n    // Identify the components of the event that you want to render. In this\n    // case, render the user section of the event.\n    wil::unique_evt_handle context(\n        EvtCreateRenderContext(0, nullptr, EvtRenderContextUser));\n    THROW_LAST_ERROR_IF_NULL(context);\n\n    // When you render the user data or system section of the event, you must\n    // specify the EvtRenderEventValues flag. The function returns an array of\n    // variant values for each element in the user data or system section of the\n    // event. For user data or event data, the values are returned in the same\n    // order as the elements are defined in the event. For system data, the\n    // values are returned in the order defined in the EVT_SYSTEM_PROPERTY_ID\n    // enumeration.\n    DWORD dwBufferSize = 0;\n    DWORD dwBufferUsed = 0;\n    DWORD dwPropertyCount = 0;\n\n    if (EvtRender(context.get(), eventHandle, EvtRenderEventValues,\n                  dwBufferSize, nullptr, &dwBufferUsed, &dwPropertyCount)) {\n        throw std::logic_error(\"Unexpected result from EvtRender\");\n    }\n\n    THROW_LAST_ERROR_IF(GetLastError() != ERROR_INSUFFICIENT_BUFFER);\n\n    dwBufferSize = dwBufferUsed;\n    auto renderedValuesBuffer = std::make_unique<BYTE[]>(dwBufferSize);\n    THROW_IF_WIN32_BOOL_FALSE(EvtRender(\n        context.get(), eventHandle, EvtRenderEventValues, dwBufferSize,\n        renderedValuesBuffer.get(), &dwBufferUsed, &dwPropertyCount));\n\n    if (dwPropertyCount < 11) {\n        LOG(L\"Not enough property values (%u)\", dwPropertyCount);\n        return false;\n    }\n\n    auto renderedValues =\n        reinterpret_cast<const EVT_VARIANT*>(renderedValuesBuffer.get());\n\n    if (renderedValues[10].Type != EvtVarTypeString) {\n        LOG(L\"Unexpected property value type (%u)\", renderedValues[10].Type);\n        return false;\n    }\n\n    std::wstring appPath{renderedValues[10].StringVal};\n    LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &appPath[0],\n                  wil::safe_cast<int>(appPath.length()), &appPath[0],\n                  wil::safe_cast<int>(appPath.length()), nullptr, nullptr, 0);\n\n    if (appPath != m_targetAppPath) {\n        return false;\n    }\n\n    DWORD processId = renderedValues[8].Type == EvtVarTypeHexInt32\n                          ? renderedValues[8].Int32Val\n                          : 0;\n    DWORD64 processCreationTime = renderedValues[9].Type == EvtVarTypeHexInt64\n                                      ? renderedValues[9].Int64Val\n                                      : 0;\n\n    if (processId && processCreationTime && processId == m_lastProcessId &&\n        processCreationTime == m_lastProcessCreationTime) {\n        return false;\n    }\n\n    m_lastProcessId = processId;\n    m_lastProcessCreationTime = processCreationTime;\n\n    return true;\n}\n"
  },
  {
    "path": "src/windhawk/app/event_viewer_crash_monitor.h",
    "content": "#pragma once\n\nclass EventViewerCrashMonitor {\n   public:\n    EventViewerCrashMonitor(std::wstring_view targetAppPath);\n\n    HANDLE GetEventHandle() const;\n    int GetAmountOfNewEvents();\n\n   private:\n    bool DoesEventMatch(EVT_HANDLE eventHandle);\n\n    std::wstring m_targetAppPath;\n    wil::unique_event m_event;\n    wil::unique_evt_handle m_subscription;\n    DWORD m_lastProcessId = 0;\n    DWORD64 m_lastProcessCreationTime = 0;\n};\n"
  },
  {
    "path": "src/windhawk/app/functions.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n\nnamespace Functions {\n\nnamespace {\n\ntypedef struct _UNICODE_STRING {\n    USHORT Length;\n    USHORT MaximumLength;\n    _Field_size_bytes_part_opt_(MaximumLength, Length) PWCH Buffer;\n} UNICODE_STRING, *PUNICODE_STRING;\n\n// wdm\ntypedef struct _COUNTED_REASON_CONTEXT {\n    ULONG Version;\n    ULONG Flags;\n    union {\n        struct {\n            UNICODE_STRING ResourceFileName;\n            USHORT ResourceReasonId;\n            ULONG StringCount;\n            _Field_size_(StringCount) PUNICODE_STRING ReasonStrings;\n        };\n        UNICODE_STRING SimpleString;\n    };\n} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;\n\n#ifndef _WIN64\n#pragma pack(push, 8)\ntypedef struct _UNICODE_STRING64 {\n    USHORT Length;\n    USHORT MaximumLength;\n    _Field_size_bytes_part_opt_(MaximumLength, Length) DWORD64 Buffer;\n} UNICODE_STRING64, *PUNICODE_STRING64;\n\ntypedef struct _COUNTED_REASON_CONTEXT64 {\n    ULONG Version;\n    ULONG Flags;\n    union {\n        struct {\n            UNICODE_STRING64 ResourceFileName;\n            USHORT ResourceReasonId;\n            ULONG StringCount;\n            _Field_size_(StringCount) PUNICODE_STRING64 ReasonStrings;\n        };\n        UNICODE_STRING64 SimpleString;\n    };\n} COUNTED_REASON_CONTEXT64, *PCOUNTED_REASON_CONTEXT64;\n#pragma pack(pop)\n#endif\n\n// POWER_REQUEST_TYPE\ntypedef enum _POWER_REQUEST_TYPE_INTERNAL {\n    PowerRequestDisplayRequiredInternal,\n    PowerRequestSystemRequiredInternal,\n    PowerRequestAwayModeRequiredInternal,\n    PowerRequestExecutionRequiredInternal,  // Windows 8+\n    PowerRequestPerfBoostRequiredInternal,  // Windows 8+\n    PowerRequestActiveLockScreenInternal,   // Windows 10 RS1+ (reserved on\n                                            // Windows 8)\n    // Values 6 and 7 are reserved for Windows 8 only\n    PowerRequestInternalInvalid,\n    PowerRequestInternalUnknown,\n    PowerRequestFullScreenVideoRequired  // Windows 8 only\n} POWER_REQUEST_TYPE_INTERNAL;\n\ntypedef struct _POWER_REQUEST_ACTION {\n    HANDLE PowerRequestHandle;\n    POWER_REQUEST_TYPE_INTERNAL RequestType;\n    BOOLEAN SetAction;\n    HANDLE ProcessHandle;  // Windows 8+ and only for requests created via\n                           // PlmPowerRequestCreate\n} POWER_REQUEST_ACTION, *PPOWER_REQUEST_ACTION;\n\n#ifndef NT_SUCCESS\n#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#endif\n\n#define POWER_REQUEST_CONTEXT_NOT_SPECIFIED DIAGNOSTIC_REASON_NOT_SPECIFIED\n\nNTSTATUS NtPowerInformation(_In_ POWER_INFORMATION_LEVEL InformationLevel,\n                            _In_reads_bytes_opt_(InputBufferLength)\n                                PVOID InputBuffer,\n                            _In_ ULONG InputBufferLength,\n                            _Out_writes_bytes_opt_(OutputBufferLength)\n                                PVOID OutputBuffer,\n                            _In_ ULONG OutputBufferLength) {\n    using NtPowerInformation_t = NTSTATUS(WINAPI*)(\n        _In_ POWER_INFORMATION_LEVEL InformationLevel,\n        _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n        _In_ ULONG InputBufferLength,\n        _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n        _In_ ULONG OutputBufferLength);\n    static NtPowerInformation_t pNtPowerInformation = []() {\n        HMODULE hNtdll = GetModuleHandle(L\"ntdll.dll\");\n        if (hNtdll) {\n            return (NtPowerInformation_t)GetProcAddress(hNtdll,\n                                                        \"NtPowerInformation\");\n        }\n\n        return (NtPowerInformation_t) nullptr;\n    }();\n\n    if (!pNtPowerInformation) {\n        return STATUS_UNSUCCESSFUL;\n    }\n\n    return pNtPowerInformation(InformationLevel, InputBuffer, InputBufferLength,\n                               OutputBuffer, OutputBufferLength);\n}\n\n}  // namespace\n\n// SetPrivilege enables/disables process token privilege.\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debug-privilege\nBOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) {\n    LUID luid;\n    BOOL bRet = FALSE;\n\n    if (LookupPrivilegeValue(nullptr, lpszPrivilege, &luid)) {\n        TOKEN_PRIVILEGES tp;\n\n        tp.PrivilegeCount = 1;\n        tp.Privileges[0].Luid = luid;\n        tp.Privileges[0].Attributes =\n            (bEnablePrivilege) ? SE_PRIVILEGE_ENABLED : 0;\n\n        // Enable the privilege or disable all privileges.\n        if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, nullptr, nullptr)) {\n            // Check to see if you have proper access.\n            // You may get \"ERROR_NOT_ALL_ASSIGNED\".\n            bRet = (GetLastError() == ERROR_SUCCESS);\n        }\n    }\n\n    return bRet;\n}\n\nBOOL SetDebugPrivilege(BOOL bEnablePrivilege) {\n    wil::unique_handle token;\n    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,\n                          &token)) {\n        return FALSE;\n    }\n\n    return SetPrivilege(token.get(), SE_DEBUG_NAME, bEnablePrivilege);\n}\n\nHANDLE CreateEventForMediumIntegrity(PCWSTR eventName, BOOL manualReset) {\n    // Allow only EVENT_MODIFY_STATE (0x0002), only for medium integrity.\n    PCWSTR pszStringSecurityDescriptor = L\"D:(A;;0x0002;;;WD)S:(ML;;NW;;;ME)\";\n\n    wil::unique_hlocal secDesc;\n    if (!ConvertStringSecurityDescriptorToSecurityDescriptor(\n            pszStringSecurityDescriptor, SDDL_REVISION_1, &secDesc, nullptr)) {\n        return nullptr;\n    }\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    return CreateEvent(&secAttr, manualReset, FALSE, eventName);\n}\n\n//\n// FUNCTION: IsRunAsAdmin()\n//\n// PURPOSE: The function checks whether the current process is run as\n// administrator. In other words, it dictates whether the primary access\n// token of the process belongs to user account that is a member of the\n// local Administrators group and it is elevated.\n//\n// RETURN VALUE: Returns TRUE if the primary access token of the process\n// belongs to user account that is a member of the local Administrators\n// group and it is elevated. Returns FALSE if the token does not. Returns\n// FALSE on failure. To get extended error information, call GetLastError.\n//\nBOOL IsRunAsAdmin() {\n    BOOL fIsRunAsAdmin = FALSE;\n    DWORD dwError = ERROR_SUCCESS;\n    PSID pAdministratorsGroup = nullptr;\n    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;\n\n    // Allocate and initialize a SID of the administrators group.\n    if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,\n                                 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,\n                                 &pAdministratorsGroup)) {\n        // Determine whether the SID of administrators group is enabled in\n        // the primary access token of the process.\n        if (!CheckTokenMembership(nullptr, pAdministratorsGroup,\n                                  &fIsRunAsAdmin)) {\n            dwError = GetLastError();\n        }\n\n        FreeSid(pAdministratorsGroup);\n\n        if (dwError != ERROR_SUCCESS) {\n            SetLastError(dwError);\n        }\n    }\n\n    return fIsRunAsAdmin;\n}\n\nPCWSTR LoadStrFromRsrc(UINT uStrId) {\n    PCWSTR pStr;\n    if (!LoadString(nullptr, uStrId, (WCHAR*)&pStr, 0)) {\n        pStr = L\"(Could not load resource)\";\n    }\n\n    return pStr;\n}\n\nstd::vector<std::wstring> SplitString(std::wstring_view s, WCHAR delim) {\n    // https://stackoverflow.com/a/48403210\n    auto view =\n        s | std::views::split(delim) | std::views::transform([](auto&& rng) {\n            return std::wstring_view(rng.data(), rng.size());\n        });\n    return std::vector<std::wstring>(view.begin(), view.end());\n}\n\nstd::vector<std::wstring_view> SplitStringToViews(std::wstring_view s,\n                                                  WCHAR delim) {\n    // https://stackoverflow.com/a/48403210\n    auto view =\n        s | std::views::split(delim) | std::views::transform([](auto&& rng) {\n            return std::wstring_view(rng.data(), rng.size());\n        });\n    return std::vector<std::wstring_view>(view.begin(), view.end());\n}\n\n// https://stackoverflow.com/a/29752943\nstd::wstring ReplaceAll(std::wstring_view source,\n                        std::wstring_view from,\n                        std::wstring_view to,\n                        bool ignoreCase) {\n    auto findString = [ignoreCase](std::wstring_view haystack,\n                                   std::wstring_view needle,\n                                   size_t pos) -> size_t {\n        if (!ignoreCase) {\n            return haystack.find(needle, pos);\n        }\n\n        auto it = std::search(\n            haystack.begin() + pos, haystack.end(), needle.begin(),\n            needle.end(), [](WCHAR ch1, WCHAR ch2) {\n                LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &ch1,\n                              1, &ch1, 1, nullptr, nullptr, 0);\n                LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &ch2,\n                              1, &ch2, 1, nullptr, nullptr, 0);\n                return ch1 == ch2;\n            });\n        if (it == haystack.end()) {\n            return haystack.npos;\n        }\n\n        return std::distance(haystack.begin(), it);\n    };\n\n    std::wstring newString;\n\n    size_t lastPos = 0;\n    size_t findPos;\n\n    while ((findPos = findString(source, from, lastPos)) != source.npos) {\n        newString.append(source, lastPos, findPos - lastPos);\n        newString += to;\n        lastPos = findPos + from.length();\n    }\n\n    // Care for the rest after last occurrence.\n    newString += source.substr(lastPos);\n\n    return newString;\n}\n\nUINT GetDpiForWindowWithFallback(HWND hWnd) {\n    using GetDpiForWindow_t = UINT(WINAPI*)(HWND hwnd);\n    static GetDpiForWindow_t pGetDpiForWindow = []() {\n        HMODULE hUser32 = GetModuleHandle(L\"user32.dll\");\n        if (hUser32) {\n            return (GetDpiForWindow_t)GetProcAddress(hUser32,\n                                                     \"GetDpiForWindow\");\n        }\n\n        return (GetDpiForWindow_t) nullptr;\n    }();\n\n    int iDpi = 96;\n    if (pGetDpiForWindow) {\n        iDpi = pGetDpiForWindow(hWnd);\n    } else {\n        CDC hdc = ::GetDC(nullptr);\n        if (hdc) {\n            iDpi = hdc.GetDeviceCaps(LOGPIXELSX);\n        }\n    }\n\n    return iDpi;\n}\n\nint GetSystemMetricsForDpiWithFallback(int nIndex, UINT dpi) {\n    using GetSystemMetricsForDpi_t = int(WINAPI*)(int nIndex, UINT dpi);\n    static GetSystemMetricsForDpi_t pGetSystemMetricsForDpi = []() {\n        HMODULE hUser32 = GetModuleHandle(L\"user32.dll\");\n        if (hUser32) {\n            return (GetSystemMetricsForDpi_t)GetProcAddress(\n                hUser32, \"GetSystemMetricsForDpi\");\n        }\n\n        return (GetSystemMetricsForDpi_t) nullptr;\n    }();\n\n    if (pGetSystemMetricsForDpi) {\n        return pGetSystemMetricsForDpi(nIndex, dpi);\n    } else {\n        return GetSystemMetrics(nIndex);\n    }\n}\n\nint GetSystemMetricsForWindow(HWND hWnd, int nIndex) {\n    return GetSystemMetricsForDpiWithFallback(\n        nIndex, GetDpiForWindowWithFallback(hWnd));\n}\n\nHRESULT SetThreadDescriptionIfAvailable(HANDLE hThread,\n                                        PCWSTR lpThreadDescription) {\n    using SetThreadDescription_t = decltype(&SetThreadDescription);\n    static SetThreadDescription_t pSetThreadDescription = []() {\n        HMODULE hKernel32 = GetModuleHandle(L\"kernel32.dll\");\n        if (hKernel32) {\n            return (SetThreadDescription_t)GetProcAddress(\n                hKernel32, \"SetThreadDescription\");\n        }\n\n        return (SetThreadDescription_t) nullptr;\n    }();\n\n    if (!pSetThreadDescription) {\n        return E_NOTIMPL;\n    }\n\n    return pSetThreadDescription(hThread, lpThreadDescription);\n}\n\nbool IsProcessFrozen(HANDLE hProcess) {\n    // https://github.com/winsiderss/systeminformer/blob/044957137e1d7200431926130ea7cd6bf9d8a11f/phnt/include/ntpsapi.h#L303-L334\n    typedef struct _PROCESS_BASIC_INFORMATION {\n        NTSTATUS ExitStatus;\n        /*PPEB*/ LPVOID PebBaseAddress;\n        ULONG_PTR AffinityMask;\n        /*KPRIORITY*/ LONG BasePriority;\n        HANDLE UniqueProcessId;\n        HANDLE InheritedFromUniqueProcessId;\n    } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;\n\n    typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {\n        SIZE_T Size;  // set to sizeof structure on input\n        PROCESS_BASIC_INFORMATION BasicInfo;\n        union {\n            ULONG Flags;\n            struct {\n                ULONG IsProtectedProcess : 1;\n                ULONG IsWow64Process : 1;\n                ULONG IsProcessDeleting : 1;\n                ULONG IsCrossSessionCreate : 1;\n                ULONG IsFrozen : 1;\n                ULONG IsBackground : 1;\n                ULONG IsStronglyNamed : 1;\n                ULONG IsSecureProcess : 1;\n                ULONG IsSubsystemProcess : 1;\n                ULONG SpareBits : 23;\n            };\n        };\n    } PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;\n\n    using NtQueryInformationProcess_t = NTSTATUS(WINAPI*)(\n        _In_ HANDLE ProcessHandle,\n        _In_ /*PROCESSINFOCLASS*/ DWORD ProcessInformationClass,\n        _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n        _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength);\n    static NtQueryInformationProcess_t pNtQueryInformationProcess = []() {\n        HMODULE hNtdll = LoadLibrary(L\"ntdll.dll\");\n        if (hNtdll) {\n            return (NtQueryInformationProcess_t)GetProcAddress(\n                hNtdll, \"NtQueryInformationProcess\");\n        }\n\n        return (NtQueryInformationProcess_t) nullptr;\n    }();\n\n    if (!pNtQueryInformationProcess) {\n        return false;\n    }\n\n    PROCESS_EXTENDED_BASIC_INFORMATION pebi;\n    if (0 <= pNtQueryInformationProcess(hProcess, /*ProcessBasicInformation*/ 0,\n                                        &pebi, sizeof(pebi), 0) &&\n        pebi.Size >= sizeof(pebi)) {\n        return pebi.IsFrozen != 0;\n    }\n\n    return false;\n}\n\nvoid GetNtVersionNumbers(ULONG* pNtMajorVersion,\n                         ULONG* pNtMinorVersion,\n                         ULONG* pNtBuildNumber) {\n    using RtlGetNtVersionNumbers_t =\n        void(WINAPI*)(ULONG * pNtMajorVersion, ULONG * pNtMinorVersion,\n                      ULONG * pNtBuildNumber);\n    static RtlGetNtVersionNumbers_t pRtlGetNtVersionNumbers = []() {\n        HMODULE hNtdll = GetModuleHandle(L\"ntdll.dll\");\n        if (hNtdll) {\n            return (RtlGetNtVersionNumbers_t)GetProcAddress(\n                hNtdll, \"RtlGetNtVersionNumbers\");\n        }\n\n        return (RtlGetNtVersionNumbers_t) nullptr;\n    }();\n\n    if (pRtlGetNtVersionNumbers) {\n        pRtlGetNtVersionNumbers(pNtMajorVersion, pNtMinorVersion,\n                                pNtBuildNumber);\n        // The upper 4 bits are reserved for the type of the OS build.\n        // https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on\n        *pNtBuildNumber &= ~0xF0000000;\n        return;\n    }\n\n    // Use GetVersionEx as a fallback.\n#pragma warning(push)\n#pragma warning(disable : 4996)  // disable deprecation message\n    OSVERSIONINFO versionInfo = {sizeof(OSVERSIONINFO)};\n    if (GetVersionEx(&versionInfo)) {\n        *pNtMajorVersion = versionInfo.dwMajorVersion;\n        *pNtMinorVersion = versionInfo.dwMinorVersion;\n        *pNtBuildNumber = versionInfo.dwBuildNumber;\n        return;\n    }\n#pragma warning(pop)\n\n    *pNtMajorVersion = 0;\n    *pNtMinorVersion = 0;\n    *pNtBuildNumber = 0;\n}\n\nbool IsWindowsVersionOrGreaterWithBuildNumber(WORD wMajorVersion,\n                                              WORD wMinorVersion,\n                                              WORD wBuildNumber) {\n    ULONG majorVersion = 0;\n    ULONG minorVersion = 0;\n    ULONG buildNumber = 0;\n    Functions::GetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber);\n\n    if (majorVersion != wMajorVersion) {\n        return majorVersion > wMajorVersion;\n    }\n\n    if (minorVersion != wMinorVersion) {\n        return minorVersion > wMinorVersion;\n    }\n\n    return buildNumber >= wBuildNumber;\n}\n\n// Based on:\n// https://github.com/winsiderss/systeminformer/blob/fc2a978e924f0f72f59928e74a5cfccbb48dfd10/phlib/native.c#L16472\n//\n// rev from RtlpCreateExecutionRequiredRequest (dmex)\n/**\n * Creates a PLM execution request. This is mandatory on Windows 8 and above to\n * prevent processes freezing while querying process information and deadlocking\n * the calling process.\n *\n * \\param ProcessHandle A handle to the process for which the power request is\n * to be created. \\param PowerRequestHandle A pointer to a variable that\n * receives a handle to the new power request.\n *\n * \\return Successful or errant status.\n */\nNTSTATUS CreateExecutionRequiredRequest(_In_ HANDLE ProcessHandle,\n                                        _Out_ PHANDLE PowerRequestHandle) {\n    NTSTATUS status;\n\n    HANDLE powerRequestHandle = nullptr;\n\n    // On WoW64, NtPowerInformation only handles 4 info classes:\n    // PowerRequestCreate, PowerRequestAction, EnergyTrackerCreate,\n    // EnergyTrackerQuery. The rest are forwarded as-is to the native x86-64\n    // implementation.\n#ifndef _WIN64\n    BOOL isWow64;\n    if (IsWow64Process(GetCurrentProcess(), &isWow64) && isWow64) {\n        COUNTED_REASON_CONTEXT64 powerRequestReason64;\n        memset(&powerRequestReason64, 0, sizeof(COUNTED_REASON_CONTEXT64));\n        powerRequestReason64.Version = POWER_REQUEST_CONTEXT_VERSION;\n        powerRequestReason64.Flags = POWER_REQUEST_CONTEXT_NOT_SPECIFIED;\n\n        DWORD64 powerRequestHandle64 = 0;\n        status =\n            NtPowerInformation(PlmPowerRequestCreate, &powerRequestReason64,\n                               sizeof(COUNTED_REASON_CONTEXT64),\n                               &powerRequestHandle64, sizeof(DWORD64));\n\n        powerRequestHandle = (HANDLE)powerRequestHandle64;\n    } else {\n#endif\n        COUNTED_REASON_CONTEXT powerRequestReason;\n        memset(&powerRequestReason, 0, sizeof(COUNTED_REASON_CONTEXT));\n        powerRequestReason.Version = POWER_REQUEST_CONTEXT_VERSION;\n        powerRequestReason.Flags = POWER_REQUEST_CONTEXT_NOT_SPECIFIED;\n\n        status = NtPowerInformation(PlmPowerRequestCreate, &powerRequestReason,\n                                    sizeof(COUNTED_REASON_CONTEXT),\n                                    &powerRequestHandle, sizeof(HANDLE));\n#ifndef _WIN64\n    }\n#endif\n\n    if (!NT_SUCCESS(status))\n        return status;\n\n    POWER_REQUEST_ACTION powerRequestAction;\n    memset(&powerRequestAction, 0, sizeof(POWER_REQUEST_ACTION));\n    powerRequestAction.PowerRequestHandle = powerRequestHandle;\n    powerRequestAction.RequestType = PowerRequestExecutionRequiredInternal;\n    powerRequestAction.SetAction = TRUE;\n    powerRequestAction.ProcessHandle = ProcessHandle;\n\n    status = NtPowerInformation(PowerRequestAction, &powerRequestAction,\n                                sizeof(POWER_REQUEST_ACTION), nullptr, 0);\n\n    if (NT_SUCCESS(status)) {\n        *PowerRequestHandle = powerRequestHandle;\n    } else {\n        CloseHandle(powerRequestHandle);\n    }\n\n    return status;\n}\n\nbool IsRightToLeftLanguage(LANGID langId) {\n    switch (PRIMARYLANGID(langId)) {\n        case LANG_ARABIC:\n        case LANG_FARSI:\n        case LANG_HEBREW:\n        case LANG_URDU:\n            return true;\n\n        default:\n            return false;\n    }\n}\n\nvoid ApplyDialogLayoutRtl(CWindow wnd, bool isLayoutRtl) {\n    wnd.ModifyStyleEx(isLayoutRtl ? 0 : WS_EX_LAYOUTRTL,\n                      isLayoutRtl ? WS_EX_LAYOUTRTL : 0);\n\n    ::EnumChildWindows(\n        wnd,\n        [](HWND hWnd, LPARAM lParam) {\n            bool isLayoutRtl = lParam != 0;\n\n            CWindow control(hWnd);\n            CWindow parent = control.GetParent();\n\n            CRect rcParent;\n            parent.GetClientRect(rcParent);\n\n            CRect rcControl;\n            control.GetWindowRect(rcControl);\n            ::MapWindowPoints(NULL, parent, (POINT*)&rcControl, 2);\n\n            rcControl.MoveToX(rcParent.Width() - rcControl.right);\n\n            control.SetWindowPos(NULL, rcControl, SWP_NOZORDER);\n\n            if (isLayoutRtl) {\n                control.ModifyStyleEx(0, WS_EX_LAYOUTRTL);\n            } else {\n                // Sometimes (e.g. for Edit controls), when setting\n                // WS_EX_LAYOUTRTL, the flag is not actually set. Other flags\n                // are being set instead (e.g. WS_EX_RTLREADING). Below, we try\n                // to handle such cases.\n\n                DWORD dwExStyle = control.GetExStyle();\n                if (dwExStyle & WS_EX_LAYOUTRTL) {\n                    control.ModifyStyleEx(WS_EX_LAYOUTRTL, 0);\n                } else if (dwExStyle & (WS_EX_RTLREADING | WS_EX_RIGHT |\n                                        WS_EX_LEFTSCROLLBAR)) {\n                    control.ModifyStyleEx(\n                        WS_EX_RTLREADING | WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR,\n                        0);\n\n                    WCHAR szClassName[64];\n                    if (::GetClassName(control, szClassName,\n                                       _countof(szClassName))) {\n                        if (_wcsicmp(szClassName, L\"Edit\") == 0)\n                            control.ModifyStyle(ES_RIGHT, 0);\n                    }\n                }\n            }\n\n            control.InvalidateRect(NULL);\n\n            return TRUE;\n        },\n        isLayoutRtl);\n\n    wnd.InvalidateRect(NULL);\n}\n\n}  // namespace Functions\n"
  },
  {
    "path": "src/windhawk/app/functions.h",
    "content": "#pragma once\n\nnamespace Functions {\n\nBOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);\nBOOL SetDebugPrivilege(BOOL bEnablePrivilege);\nHANDLE CreateEventForMediumIntegrity(PCWSTR eventName,\n                                     BOOL manualReset = FALSE);\nBOOL IsRunAsAdmin();\nPCWSTR LoadStrFromRsrc(UINT uStrId);\nstd::vector<std::wstring> SplitString(std::wstring_view s, WCHAR delim);\nstd::vector<std::wstring_view> SplitStringToViews(std::wstring_view s,\n                                                  WCHAR delim);\nstd::wstring ReplaceAll(std::wstring_view source,\n                        std::wstring_view from,\n                        std::wstring_view to,\n                        bool ignoreCase = false);\nUINT GetDpiForWindowWithFallback(HWND hWnd);\nint GetSystemMetricsForDpiWithFallback(int nIndex, UINT dpi);\nint GetSystemMetricsForWindow(HWND hWnd, int nIndex);\nHRESULT SetThreadDescriptionIfAvailable(HANDLE hThread,\n                                        PCWSTR lpThreadDescription);\n\n// Returns true for suspended UWP processes.\n// https://stackoverflow.com/a/50173965\nbool IsProcessFrozen(HANDLE hProcess);\n\nvoid GetNtVersionNumbers(ULONG* pNtMajorVersion,\n                         ULONG* pNtMinorVersion,\n                         ULONG* pNtBuildNumber);\nbool IsWindowsVersionOrGreaterWithBuildNumber(WORD wMajorVersion,\n                                              WORD wMinorVersion,\n                                              WORD wBuildNumber);\nNTSTATUS CreateExecutionRequiredRequest(_In_ HANDLE ProcessHandle,\n                                        _Out_ PHANDLE PowerRequestHandle);\nbool IsRightToLeftLanguage(LANGID langId);\nvoid ApplyDialogLayoutRtl(CWindow wnd, bool isLayoutRtl);\n\n}  // namespace Functions\n"
  },
  {
    "path": "src/windhawk/app/libraries/nlohmann/json.hpp",
    "content": "/*\n    __ _____ _____ _____\n __|  |   __|     |   | |  JSON for Modern C++\n|  |  |__   |  |  | | | |  version 3.9.1\n|_____|_____|_____|_|___|  https://github.com/nlohmann/json\n\nLicensed under the MIT License <http://opensource.org/licenses/MIT>.\nSPDX-License-Identifier: MIT\nCopyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>.\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*/\n\n#ifndef INCLUDE_NLOHMANN_JSON_HPP_\n#define INCLUDE_NLOHMANN_JSON_HPP_\n\n#define NLOHMANN_JSON_VERSION_MAJOR 3\n#define NLOHMANN_JSON_VERSION_MINOR 9\n#define NLOHMANN_JSON_VERSION_PATCH 1\n\n#include <algorithm> // all_of, find, for_each\n#include <cstddef> // nullptr_t, ptrdiff_t, size_t\n#include <functional> // hash, less\n#include <initializer_list> // initializer_list\n#include <iosfwd> // istream, ostream\n#include <iterator> // random_access_iterator_tag\n#include <memory> // unique_ptr\n#include <numeric> // accumulate\n#include <string> // string, stoi, to_string\n#include <utility> // declval, forward, move, pair, swap\n#include <vector> // vector\n\n// #include <nlohmann/adl_serializer.hpp>\n\n\n#include <utility>\n\n// #include <nlohmann/detail/conversions/from_json.hpp>\n\n\n#include <algorithm> // transform\n#include <array> // array\n#include <forward_list> // forward_list\n#include <iterator> // inserter, front_inserter, end\n#include <map> // map\n#include <string> // string\n#include <tuple> // tuple, make_tuple\n#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible\n#include <unordered_map> // unordered_map\n#include <utility> // pair, declval\n#include <valarray> // valarray\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n\n#include <exception> // exception\n#include <stdexcept> // runtime_error\n#include <string> // to_string\n\n// #include <nlohmann/detail/input/position_t.hpp>\n\n\n#include <cstddef> // size_t\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// struct to capture the start position of the current token\nstruct position_t\n{\n    /// the total number of characters read\n    std::size_t chars_read_total = 0;\n    /// the number of characters read in the current line\n    std::size_t chars_read_current_line = 0;\n    /// the number of lines read\n    std::size_t lines_read = 0;\n\n    /// conversion to size_t to preserve SAX interface\n    constexpr operator size_t() const\n    {\n        return chars_read_total;\n    }\n};\n\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\n#include <utility> // pair\n// #include <nlohmann/thirdparty/hedley/hedley.hpp>\n/* Hedley - https://nemequ.github.io/hedley\n * Created by Evan Nemerson <evan@nemerson.com>\n *\n * To the extent possible under law, the author(s) have dedicated all\n * copyright and related and neighboring rights to this software to\n * the public domain worldwide. This software is distributed without\n * any warranty.\n *\n * For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n * SPDX-License-Identifier: CC0-1.0\n */\n\n#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 13)\n#if defined(JSON_HEDLEY_VERSION)\n    #undef JSON_HEDLEY_VERSION\n#endif\n#define JSON_HEDLEY_VERSION 13\n\n#if defined(JSON_HEDLEY_STRINGIFY_EX)\n    #undef JSON_HEDLEY_STRINGIFY_EX\n#endif\n#define JSON_HEDLEY_STRINGIFY_EX(x) #x\n\n#if defined(JSON_HEDLEY_STRINGIFY)\n    #undef JSON_HEDLEY_STRINGIFY\n#endif\n#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)\n\n#if defined(JSON_HEDLEY_CONCAT_EX)\n    #undef JSON_HEDLEY_CONCAT_EX\n#endif\n#define JSON_HEDLEY_CONCAT_EX(a,b) a##b\n\n#if defined(JSON_HEDLEY_CONCAT)\n    #undef JSON_HEDLEY_CONCAT\n#endif\n#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)\n\n#if defined(JSON_HEDLEY_CONCAT3_EX)\n    #undef JSON_HEDLEY_CONCAT3_EX\n#endif\n#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c\n\n#if defined(JSON_HEDLEY_CONCAT3)\n    #undef JSON_HEDLEY_CONCAT3\n#endif\n#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)\n\n#if defined(JSON_HEDLEY_VERSION_ENCODE)\n    #undef JSON_HEDLEY_VERSION_ENCODE\n#endif\n#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)\n    #undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)\n\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #undef JSON_HEDLEY_GNUC_VERSION\n#endif\n#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)\n#elif defined(__GNUC__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION)\n    #undef JSON_HEDLEY_MSVC_VERSION\n#endif\n#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)\n#elif defined(_MSC_FULL_VER)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)\n#elif defined(_MSC_VER)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)\n    #undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#endif\n#if !defined(_MSC_VER)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)\n#elif defined(_MSC_VER) && (_MSC_VER >= 1400)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))\n#elif defined(_MSC_VER) && (_MSC_VER >= 1200)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))\n#else\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #undef JSON_HEDLEY_INTEL_VERSION\n#endif\n#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)\n#elif defined(__INTEL_COMPILER)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)\n    #undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #undef JSON_HEDLEY_PGI_VERSION\n#endif\n#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)\n    #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)\n    #undef JSON_HEDLEY_PGI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #undef JSON_HEDLEY_SUNPRO_VERSION\n#endif\n#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)\n#elif defined(__SUNPRO_C)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)\n#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)\n#elif defined(__SUNPRO_CC)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)\n    #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#endif\n#if defined(__EMSCRIPTEN__)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #undef JSON_HEDLEY_ARM_VERSION\n#endif\n#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)\n#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)\n    #undef JSON_HEDLEY_ARM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #undef JSON_HEDLEY_IBM_VERSION\n#endif\n#if defined(__ibmxl__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)\n#elif defined(__xlC__) && defined(__xlC_ver__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)\n#elif defined(__xlC__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)\n    #undef JSON_HEDLEY_IBM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #undef JSON_HEDLEY_TI_VERSION\n#endif\n#if \\\n    defined(__TI_COMPILER_VERSION__) && \\\n    ( \\\n      defined(__TMS470__) || defined(__TI_ARM__) || \\\n      defined(__MSP430__) || \\\n      defined(__TMS320C2000__) \\\n    )\n#if (__TI_COMPILER_VERSION__ >= 16000000)\n    #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)\n    #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #undef JSON_HEDLEY_TI_CL430_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)\n    #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))\n    #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)\n    #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)\n    #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #undef JSON_HEDLEY_CRAY_VERSION\n#endif\n#if defined(_CRAYC)\n    #if defined(_RELEASE_PATCHLEVEL)\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)\n    #else\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)\n    #undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #undef JSON_HEDLEY_IAR_VERSION\n#endif\n#if defined(__IAR_SYSTEMS_ICC__)\n    #if __VER__ > 1000\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))\n    #else\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)\n    #undef JSON_HEDLEY_IAR_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #undef JSON_HEDLEY_TINYC_VERSION\n#endif\n#if defined(__TINYC__)\n    #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)\n    #undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #undef JSON_HEDLEY_DMC_VERSION\n#endif\n#if defined(__DMC__)\n    #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)\n    #undef JSON_HEDLEY_DMC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #undef JSON_HEDLEY_COMPCERT_VERSION\n#endif\n#if defined(__COMPCERT_VERSION__)\n    #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)\n    #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #undef JSON_HEDLEY_PELLES_VERSION\n#endif\n#if defined(__POCC__)\n    #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)\n    #undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #undef JSON_HEDLEY_GCC_VERSION\n#endif\n#if \\\n    defined(JSON_HEDLEY_GNUC_VERSION) && \\\n    !defined(__clang__) && \\\n    !defined(JSON_HEDLEY_INTEL_VERSION) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_ARM_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL430_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \\\n    !defined(__COMPCERT__)\n    #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#endif\n#if \\\n    defined(__has_cpp_attribute) && \\\n    defined(__cplusplus) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#endif\n#if !defined(__cplusplus) || !defined(__has_cpp_attribute)\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#elif \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_IAR_VERSION) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \\\n    (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_BUILTIN)\n    #undef JSON_HEDLEY_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_FEATURE)\n    #undef JSON_HEDLEY_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_HAS_FEATURE(feature) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GCC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_EXTENSION)\n    #undef JSON_HEDLEY_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_WARNING)\n    #undef JSON_HEDLEY_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_HAS_WARNING(warning) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)\n    #undef JSON_HEDLEY_GNUC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_WARNING)\n    #undef JSON_HEDLEY_GCC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat\")\n#    if JSON_HEDLEY_HAS_WARNING(\"-Wc++17-extensions\")\n#      define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++17-extensions\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    else\n#      define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    endif\n#  endif\n#endif\n#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x\n#endif\n\n#if defined(JSON_HEDLEY_CONST_CAST)\n    #undef JSON_HEDLEY_CONST_CAST\n#endif\n#if defined(__cplusplus)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))\n#elif \\\n  JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\") || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_REINTERPRET_CAST)\n    #undef JSON_HEDLEY_REINTERPRET_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_CAST)\n    #undef JSON_HEDLEY_STATIC_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_CPP_CAST)\n    #undef JSON_HEDLEY_CPP_CAST\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wold-style-cast\")\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wold-style-cast\\\"\") \\\n    ((T) (expr)) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"diag_suppress=Pe137\") \\\n    JSON_HEDLEY_DIAGNOSTIC_POP \\\n#  else\n#    define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))\n#  endif\n#else\n#  define JSON_HEDLEY_CPP_CAST(T, expr) (expr)\n#endif\n\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    defined(__clang__) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \\\n    (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))\n    #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_PRAGMA(value) __pragma(value)\n#else\n    #define JSON_HEDLEY_PRAGMA(value)\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)\n    #undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#endif\n#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)\n    #undef JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"clang diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"clang diagnostic pop\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"GCC diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"GCC diagnostic pop\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))\n    #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))\n#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"pop\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"diag_push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"diag_pop\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH\n    #define JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wdeprecated-declarations\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warning(disable:1478 1786)\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1215,1444\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1291,1718\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,symdeprecated,symdeprecated2)\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress=Pe1444,Pe1215\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warn(disable:2241)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"clang diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"warning(disable:161)\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 1675\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"GCC diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress=Pe161\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-attributes\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"clang diagnostic ignored \\\"-Wunknown-attributes\\\"\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"warning(disable:1292)\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1097\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"error_messages(off,attrskipunsup)\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1173\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress=Pe1097\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"clang diagnostic ignored \\\"-Wcast-qual\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"warning(disable:2203 2331)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"GCC diagnostic ignored \\\"-Wcast-qual\\\"\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n\n#if defined(JSON_HEDLEY_DEPRECATED)\n    #undef JSON_HEDLEY_DEPRECATED\n#endif\n#if defined(JSON_HEDLEY_DEPRECATED_FOR)\n    #undef JSON_HEDLEY_DEPRECATED_FOR\n#endif\n#if JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated(\"Since \" # since))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated(\"Since \" #since \"; use \" #replacement))\n#elif defined(__cplusplus) && (__cplusplus >= 201402L)\n    #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since)]])\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since \"; use \" #replacement)]])\n#elif \\\n    JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__(\"Since \" #since)))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__(\"Since \" #since \"; use \" #replacement)))\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DEPRECATED(since) _Pragma(\"deprecated\")\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma(\"deprecated\")\n#else\n    #define JSON_HEDLEY_DEPRECATED(since)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)\n#endif\n\n#if defined(JSON_HEDLEY_UNAVAILABLE)\n    #undef JSON_HEDLEY_UNAVAILABLE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__(\"Not available until \" #available_since)))\n#else\n    #define JSON_HEDLEY_UNAVAILABLE(available_since)\n#endif\n\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#endif\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#endif\n#if (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))\n#elif defined(_Check_return_) /* SAL */\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_\n#else\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)\n#endif\n\n#if defined(JSON_HEDLEY_SENTINEL)\n    #undef JSON_HEDLEY_SENTINEL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0)\n    #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))\n#else\n    #define JSON_HEDLEY_SENTINEL(position)\n#endif\n\n#if defined(JSON_HEDLEY_NO_RETURN)\n    #undef JSON_HEDLEY_NO_RETURN\n#endif\n#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NO_RETURN __noreturn\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L\n    #define JSON_HEDLEY_NO_RETURN _Noreturn\n#elif defined(__cplusplus) && (__cplusplus >= 201103L)\n    #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"does_not_return\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"FUNC_NEVER_RETURNS;\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute((noreturn))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#else\n    #define JSON_HEDLEY_NO_RETURN\n#endif\n\n#if defined(JSON_HEDLEY_NO_ESCAPE)\n    #undef JSON_HEDLEY_NO_ESCAPE\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)\n    #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))\n#else\n    #define JSON_HEDLEY_NO_ESCAPE\n#endif\n\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #undef JSON_HEDLEY_UNREACHABLE\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)\n    #undef JSON_HEDLEY_UNREACHABLE_RETURN\n#endif\n#if defined(JSON_HEDLEY_ASSUME)\n    #undef JSON_HEDLEY_ASSUME\n#endif\n#if \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_ASSUME(expr) __assume(expr)\n#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)\n    #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)\n#elif \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n    #if defined(__cplusplus)\n        #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) _nassert(expr)\n    #endif\n#endif\n#if \\\n    (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5)\n    #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()\n#elif defined(JSON_HEDLEY_ASSUME)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n#if !defined(JSON_HEDLEY_ASSUME)\n    #if defined(JSON_HEDLEY_UNREACHABLE)\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)\n    #endif\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #if  \\\n        JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))\n    #else\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()\n    #endif\n#else\n    #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)\n#endif\n#if !defined(JSON_HEDLEY_UNREACHABLE)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n\nJSON_HEDLEY_DIAGNOSTIC_PUSH\n#if JSON_HEDLEY_HAS_WARNING(\"-Wpedantic\")\n    #pragma clang diagnostic ignored \"-Wpedantic\"\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat-pedantic\") && defined(__cplusplus)\n    #pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n#endif\n#if JSON_HEDLEY_GCC_HAS_WARNING(\"-Wvariadic-macros\",4,0,0)\n    #if defined(__clang__)\n        #pragma clang diagnostic ignored \"-Wvariadic-macros\"\n    #elif defined(JSON_HEDLEY_GCC_VERSION)\n        #pragma GCC diagnostic ignored \"-Wvariadic-macros\"\n    #endif\n#endif\n#if defined(JSON_HEDLEY_NON_NULL)\n    #undef JSON_HEDLEY_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))\n#else\n    #define JSON_HEDLEY_NON_NULL(...)\n#endif\nJSON_HEDLEY_DIAGNOSTIC_POP\n\n#if defined(JSON_HEDLEY_PRINTF_FORMAT)\n    #undef JSON_HEDLEY_PRINTF_FORMAT\n#endif\n#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))\n#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(format) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))\n#else\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)\n#endif\n\n#if defined(JSON_HEDLEY_CONSTEXPR)\n    #undef JSON_HEDLEY_CONSTEXPR\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)\n    #endif\n#endif\n#if !defined(JSON_HEDLEY_CONSTEXPR)\n    #define JSON_HEDLEY_CONSTEXPR\n#endif\n\n#if defined(JSON_HEDLEY_PREDICT)\n    #undef JSON_HEDLEY_PREDICT\n#endif\n#if defined(JSON_HEDLEY_LIKELY)\n    #undef JSON_HEDLEY_LIKELY\n#endif\n#if defined(JSON_HEDLEY_UNLIKELY)\n    #undef JSON_HEDLEY_UNLIKELY\n#endif\n#if defined(JSON_HEDLEY_UNPREDICTABLE)\n    #undef JSON_HEDLEY_UNPREDICTABLE\n#endif\n#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))\n#endif\n#if \\\n  JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0)\n#  define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability(  (expr), (value), (probability))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability)   __builtin_expect_with_probability(!!(expr),    1   , (probability))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability)  __builtin_expect_with_probability(!!(expr),    0   , (probability))\n#  define JSON_HEDLEY_LIKELY(expr)                      __builtin_expect                 (!!(expr),    1                  )\n#  define JSON_HEDLEY_UNLIKELY(expr)                    __builtin_expect                 (!!(expr),    0                  )\n#elif \\\n  JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \\\n  JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) \\\n    (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_LIKELY(expr)   __builtin_expect(!!(expr), 1)\n#  define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)\n#else\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_LIKELY(expr) (!!(expr))\n#  define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))\n#endif\n#if !defined(JSON_HEDLEY_UNPREDICTABLE)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)\n#endif\n\n#if defined(JSON_HEDLEY_MALLOC)\n    #undef JSON_HEDLEY_MALLOC\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_MALLOC __attribute__((__malloc__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_MALLOC _Pragma(\"returns_new_memory\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(14, 0, 0)\n    #define JSON_HEDLEY_MALLOC __declspec(restrict)\n#else\n    #define JSON_HEDLEY_MALLOC\n#endif\n\n#if defined(JSON_HEDLEY_PURE)\n    #undef JSON_HEDLEY_PURE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n#  define JSON_HEDLEY_PURE __attribute__((__pure__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n#  define JSON_HEDLEY_PURE _Pragma(\"does_not_write_global_data\")\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \\\n    )\n#  define JSON_HEDLEY_PURE _Pragma(\"FUNC_IS_PURE;\")\n#else\n#  define JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_CONST)\n    #undef JSON_HEDLEY_CONST\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(const) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_CONST __attribute__((__const__))\n#elif \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_CONST _Pragma(\"no_side_effect\")\n#else\n    #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_RESTRICT)\n    #undef JSON_HEDLEY_RESTRICT\n#endif\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT restrict\n#elif \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    defined(__clang__)\n    #define JSON_HEDLEY_RESTRICT __restrict\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT _Restrict\n#else\n    #define JSON_HEDLEY_RESTRICT\n#endif\n\n#if defined(JSON_HEDLEY_INLINE)\n    #undef JSON_HEDLEY_INLINE\n#endif\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    (defined(__cplusplus) && (__cplusplus >= 199711L))\n    #define JSON_HEDLEY_INLINE inline\n#elif \\\n    defined(JSON_HEDLEY_GCC_VERSION) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)\n    #define JSON_HEDLEY_INLINE __inline__\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_INLINE __inline\n#else\n    #define JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_ALWAYS_INLINE)\n    #undef JSON_HEDLEY_ALWAYS_INLINE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __forceinline\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n      JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n      JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \\\n    )\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"FUNC_ALWAYS_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"inline=forced\")\n#else\n#  define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_NEVER_INLINE)\n    #undef JSON_HEDLEY_NEVER_INLINE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"noinline\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"FUNC_CANNOT_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"inline=never\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#else\n    #define JSON_HEDLEY_NEVER_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_PRIVATE)\n    #undef JSON_HEDLEY_PRIVATE\n#endif\n#if defined(JSON_HEDLEY_PUBLIC)\n    #undef JSON_HEDLEY_PUBLIC\n#endif\n#if defined(JSON_HEDLEY_IMPORT)\n    #undef JSON_HEDLEY_IMPORT\n#endif\n#if defined(_WIN32) || defined(__CYGWIN__)\n#  define JSON_HEDLEY_PRIVATE\n#  define JSON_HEDLEY_PUBLIC   __declspec(dllexport)\n#  define JSON_HEDLEY_IMPORT   __declspec(dllimport)\n#else\n#  if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    ( \\\n      defined(__TI_EABI__) && \\\n      ( \\\n        (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \\\n      ) \\\n    )\n#    define JSON_HEDLEY_PRIVATE __attribute__((__visibility__(\"hidden\")))\n#    define JSON_HEDLEY_PUBLIC  __attribute__((__visibility__(\"default\")))\n#  else\n#    define JSON_HEDLEY_PRIVATE\n#    define JSON_HEDLEY_PUBLIC\n#  endif\n#  define JSON_HEDLEY_IMPORT    extern\n#endif\n\n#if defined(JSON_HEDLEY_NO_THROW)\n    #undef JSON_HEDLEY_NO_THROW\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NO_THROW __declspec(nothrow)\n#else\n    #define JSON_HEDLEY_NO_THROW\n#endif\n\n#if defined(JSON_HEDLEY_FALL_THROUGH)\n    #undef JSON_HEDLEY_FALL_THROUGH\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0)\n    #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])\n#elif defined(__fallthrough) /* SAL */\n    #define JSON_HEDLEY_FALL_THROUGH __fallthrough\n#else\n    #define JSON_HEDLEY_FALL_THROUGH\n#endif\n\n#if defined(JSON_HEDLEY_RETURNS_NON_NULL)\n    #undef JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)\n    #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))\n#elif defined(_Ret_notnull_) /* SAL */\n    #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_\n#else\n    #define JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n\n#if defined(JSON_HEDLEY_ARRAY_PARAM)\n    #undef JSON_HEDLEY_ARRAY_PARAM\n#endif\n#if \\\n    defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \\\n    !defined(__STDC_NO_VLA__) && \\\n    !defined(__cplusplus) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_ARRAY_PARAM(name) (name)\n#else\n    #define JSON_HEDLEY_ARRAY_PARAM(name)\n#endif\n\n#if defined(JSON_HEDLEY_IS_CONSTANT)\n    #undef JSON_HEDLEY_IS_CONSTANT\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)\n    #undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#endif\n/* JSON_HEDLEY_IS_CONSTEXPR_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #undef JSON_HEDLEY_IS_CONSTEXPR_\n#endif\n#if \\\n    JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)\n    #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)\n#endif\n#if !defined(__cplusplus)\n#  if \\\n       JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n       JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \\\n       JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)\n#endif\n#  elif \\\n       ( \\\n          defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \\\n          !defined(JSON_HEDLEY_SUNPRO_VERSION) && \\\n          !defined(JSON_HEDLEY_PGI_VERSION) && \\\n          !defined(JSON_HEDLEY_IAR_VERSION)) || \\\n       JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)\n#endif\n#  elif \\\n       defined(JSON_HEDLEY_GCC_VERSION) || \\\n       defined(JSON_HEDLEY_INTEL_VERSION) || \\\n       defined(JSON_HEDLEY_TINYC_VERSION) || \\\n       defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \\\n       JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \\\n       defined(JSON_HEDLEY_TI_CL2000_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL6X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL7X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \\\n       defined(__clang__)\n#    define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \\\n        sizeof(void) != \\\n        sizeof(*( \\\n                  1 ? \\\n                  ((void*) ((expr) * 0L) ) : \\\n((struct { char v[sizeof(void) * 2]; } *) 1) \\\n                ) \\\n              ) \\\n                                            )\n#  endif\n#endif\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))\n#else\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) (0)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)\n#endif\n\n#if defined(JSON_HEDLEY_BEGIN_C_DECLS)\n    #undef JSON_HEDLEY_BEGIN_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_END_C_DECLS)\n    #undef JSON_HEDLEY_END_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_C_DECL)\n    #undef JSON_HEDLEY_C_DECL\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_BEGIN_C_DECLS extern \"C\" {\n    #define JSON_HEDLEY_END_C_DECLS }\n    #define JSON_HEDLEY_C_DECL extern \"C\"\n#else\n    #define JSON_HEDLEY_BEGIN_C_DECLS\n    #define JSON_HEDLEY_END_C_DECLS\n    #define JSON_HEDLEY_C_DECL\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_ASSERT)\n    #undef JSON_HEDLEY_STATIC_ASSERT\n#endif\n#if \\\n  !defined(__cplusplus) && ( \\\n      (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \\\n      JSON_HEDLEY_HAS_FEATURE(c_static_assert) || \\\n      JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \\\n      JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n      defined(_Static_assert) \\\n    )\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)\n#elif \\\n  (defined(__cplusplus) && (__cplusplus >= 201103L)) || \\\n  JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0)\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))\n#else\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message)\n#endif\n\n#if defined(JSON_HEDLEY_NULL)\n    #undef JSON_HEDLEY_NULL\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)\n    #elif defined(NULL)\n        #define JSON_HEDLEY_NULL NULL\n    #else\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)\n    #endif\n#elif defined(NULL)\n    #define JSON_HEDLEY_NULL NULL\n#else\n    #define JSON_HEDLEY_NULL ((void*) 0)\n#endif\n\n#if defined(JSON_HEDLEY_MESSAGE)\n    #undef JSON_HEDLEY_MESSAGE\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_MESSAGE(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(message msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)\n#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_WARNING)\n    #undef JSON_HEDLEY_WARNING\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_WARNING(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(clang warning msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_REQUIRE)\n    #undef JSON_HEDLEY_REQUIRE\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_MSG)\n    #undef JSON_HEDLEY_REQUIRE_MSG\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wgcc-compat\")\n#    define JSON_HEDLEY_REQUIRE(expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), #expr, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), msg, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  else\n#    define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, \"error\")))\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, \"error\")))\n#  endif\n#else\n#  define JSON_HEDLEY_REQUIRE(expr)\n#  define JSON_HEDLEY_REQUIRE_MSG(expr,msg)\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS)\n    #undef JSON_HEDLEY_FLAGS\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum)\n    #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS_CAST)\n    #undef JSON_HEDLEY_FLAGS_CAST\n#endif\n#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        _Pragma(\"warning(disable:188)\") \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)\n#endif\n\n#if defined(JSON_HEDLEY_EMPTY_BASES)\n    #undef JSON_HEDLEY_EMPTY_BASES\n#endif\n#if JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)\n    #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)\n#else\n    #define JSON_HEDLEY_EMPTY_BASES\n#endif\n\n/* Remaining macros are deprecated. */\n\n#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)\n#else\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)\n    #undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#endif\n#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)\n    #undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)\n    #undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#endif\n#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)\n    #undef JSON_HEDLEY_CLANG_HAS_WARNING\n#endif\n#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)\n\n#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */\n\n\n// This file contains all internal macro definitions\n// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them\n\n// exclude unsupported compilers\n#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)\n    #if defined(__clang__)\n        #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400\n            #error \"unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))\n        #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800\n            #error \"unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #endif\n#endif\n\n// C++ language standard detection\n#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)\n    #define JSON_HAS_CPP_20\n    #define JSON_HAS_CPP_17\n    #define JSON_HAS_CPP_14\n#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464\n    #define JSON_HAS_CPP_17\n    #define JSON_HAS_CPP_14\n#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)\n    #define JSON_HAS_CPP_14\n#endif\n\n// disable float-equal warnings on GCC/clang\n#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n\n// disable documentation warnings on clang\n#if defined(__clang__)\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wdocumentation\"\n#endif\n\n// allow to disable exceptions\n#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)\n    #define JSON_THROW(exception) throw exception\n    #define JSON_TRY try\n    #define JSON_CATCH(exception) catch(exception)\n    #define JSON_INTERNAL_CATCH(exception) catch(exception)\n#else\n    #include <cstdlib>\n    #define JSON_THROW(exception) std::abort()\n    #define JSON_TRY if(true)\n    #define JSON_CATCH(exception) if(false)\n    #define JSON_INTERNAL_CATCH(exception) if(false)\n#endif\n\n// override exception macros\n#if defined(JSON_THROW_USER)\n    #undef JSON_THROW\n    #define JSON_THROW JSON_THROW_USER\n#endif\n#if defined(JSON_TRY_USER)\n    #undef JSON_TRY\n    #define JSON_TRY JSON_TRY_USER\n#endif\n#if defined(JSON_CATCH_USER)\n    #undef JSON_CATCH\n    #define JSON_CATCH JSON_CATCH_USER\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_CATCH_USER\n#endif\n#if defined(JSON_INTERNAL_CATCH_USER)\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER\n#endif\n\n// allow to override assert\n#if !defined(JSON_ASSERT)\n    #include <cassert> // assert\n    #define JSON_ASSERT(x) assert(x)\n#endif\n\n/*!\n@brief macro to briefly define a mapping between an enum and JSON\n@def NLOHMANN_JSON_SERIALIZE_ENUM\n@since version 3.4.0\n*/\n#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \\\n    template<typename BasicJsonType>                                                            \\\n    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \\\n    {                                                                                           \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \\\n        {                                                                                       \\\n            return ej_pair.first == e;                                                          \\\n        });                                                                                     \\\n        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \\\n    }                                                                                           \\\n    template<typename BasicJsonType>                                                            \\\n    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \\\n    {                                                                                           \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \\\n        {                                                                                       \\\n            return ej_pair.second == j;                                                         \\\n        });                                                                                     \\\n        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \\\n    }\n\n// Ugly macros to avoid uglier copy-paste when specializing basic_json. They\n// may be removed in the future once the class is split.\n\n#define NLOHMANN_BASIC_JSON_TPL_DECLARATION                                \\\n    template<template<typename, typename, typename...> class ObjectType,   \\\n             template<typename, typename...> class ArrayType,              \\\n             class StringType, class BooleanType, class NumberIntegerType, \\\n             class NumberUnsignedType, class NumberFloatType,              \\\n             template<typename> class AllocatorType,                       \\\n             template<typename, typename = void> class JSONSerializer,     \\\n             class BinaryType>\n\n#define NLOHMANN_BASIC_JSON_TPL                                            \\\n    basic_json<ObjectType, ArrayType, StringType, BooleanType,             \\\n    NumberIntegerType, NumberUnsignedType, NumberFloatType,                \\\n    AllocatorType, JSONSerializer, BinaryType>\n\n// Macros to simplify conversion from/to types\n\n#define NLOHMANN_JSON_EXPAND( x ) x\n#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME\n#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \\\n        NLOHMANN_JSON_PASTE64, \\\n        NLOHMANN_JSON_PASTE63, \\\n        NLOHMANN_JSON_PASTE62, \\\n        NLOHMANN_JSON_PASTE61, \\\n        NLOHMANN_JSON_PASTE60, \\\n        NLOHMANN_JSON_PASTE59, \\\n        NLOHMANN_JSON_PASTE58, \\\n        NLOHMANN_JSON_PASTE57, \\\n        NLOHMANN_JSON_PASTE56, \\\n        NLOHMANN_JSON_PASTE55, \\\n        NLOHMANN_JSON_PASTE54, \\\n        NLOHMANN_JSON_PASTE53, \\\n        NLOHMANN_JSON_PASTE52, \\\n        NLOHMANN_JSON_PASTE51, \\\n        NLOHMANN_JSON_PASTE50, \\\n        NLOHMANN_JSON_PASTE49, \\\n        NLOHMANN_JSON_PASTE48, \\\n        NLOHMANN_JSON_PASTE47, \\\n        NLOHMANN_JSON_PASTE46, \\\n        NLOHMANN_JSON_PASTE45, \\\n        NLOHMANN_JSON_PASTE44, \\\n        NLOHMANN_JSON_PASTE43, \\\n        NLOHMANN_JSON_PASTE42, \\\n        NLOHMANN_JSON_PASTE41, \\\n        NLOHMANN_JSON_PASTE40, \\\n        NLOHMANN_JSON_PASTE39, \\\n        NLOHMANN_JSON_PASTE38, \\\n        NLOHMANN_JSON_PASTE37, \\\n        NLOHMANN_JSON_PASTE36, \\\n        NLOHMANN_JSON_PASTE35, \\\n        NLOHMANN_JSON_PASTE34, \\\n        NLOHMANN_JSON_PASTE33, \\\n        NLOHMANN_JSON_PASTE32, \\\n        NLOHMANN_JSON_PASTE31, \\\n        NLOHMANN_JSON_PASTE30, \\\n        NLOHMANN_JSON_PASTE29, \\\n        NLOHMANN_JSON_PASTE28, \\\n        NLOHMANN_JSON_PASTE27, \\\n        NLOHMANN_JSON_PASTE26, \\\n        NLOHMANN_JSON_PASTE25, \\\n        NLOHMANN_JSON_PASTE24, \\\n        NLOHMANN_JSON_PASTE23, \\\n        NLOHMANN_JSON_PASTE22, \\\n        NLOHMANN_JSON_PASTE21, \\\n        NLOHMANN_JSON_PASTE20, \\\n        NLOHMANN_JSON_PASTE19, \\\n        NLOHMANN_JSON_PASTE18, \\\n        NLOHMANN_JSON_PASTE17, \\\n        NLOHMANN_JSON_PASTE16, \\\n        NLOHMANN_JSON_PASTE15, \\\n        NLOHMANN_JSON_PASTE14, \\\n        NLOHMANN_JSON_PASTE13, \\\n        NLOHMANN_JSON_PASTE12, \\\n        NLOHMANN_JSON_PASTE11, \\\n        NLOHMANN_JSON_PASTE10, \\\n        NLOHMANN_JSON_PASTE9, \\\n        NLOHMANN_JSON_PASTE8, \\\n        NLOHMANN_JSON_PASTE7, \\\n        NLOHMANN_JSON_PASTE6, \\\n        NLOHMANN_JSON_PASTE5, \\\n        NLOHMANN_JSON_PASTE4, \\\n        NLOHMANN_JSON_PASTE3, \\\n        NLOHMANN_JSON_PASTE2, \\\n        NLOHMANN_JSON_PASTE1)(__VA_ARGS__))\n#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)\n#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)\n#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)\n#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)\n#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)\n#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)\n#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)\n#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)\n#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)\n#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)\n#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)\n#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)\n#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)\n#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)\n#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)\n#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)\n#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)\n#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)\n#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)\n#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)\n#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)\n#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)\n#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)\n#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)\n#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)\n#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)\n#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)\n#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)\n#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)\n#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)\n#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)\n#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)\n#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)\n#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)\n#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)\n#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)\n#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)\n#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)\n#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)\n#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)\n#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)\n#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)\n#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)\n#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)\n#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)\n#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)\n#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)\n#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)\n#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)\n#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)\n#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)\n#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)\n#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)\n#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)\n#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)\n#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)\n#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)\n#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)\n#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)\n#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)\n#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)\n#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)\n#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)\n\n#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;\n#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n#ifndef JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_USE_IMPLICIT_CONVERSIONS 1\n#endif\n\n#if JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_EXPLICIT\n#else\n    #define JSON_EXPLICIT explicit\n#endif\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n////////////////\n// exceptions //\n////////////////\n\n/*!\n@brief general exception of the @ref basic_json class\n\nThis class is an extension of `std::exception` objects with a member @a id for\nexception ids. It is used as the base class for all exceptions thrown by the\n@ref basic_json class. This class can hence be used as \"wildcard\" to catch\nexceptions.\n\nSubclasses:\n- @ref parse_error for exceptions indicating a parse error\n- @ref invalid_iterator for exceptions indicating errors with iterators\n- @ref type_error for exceptions indicating executing a member function with\n                  a wrong type\n- @ref out_of_range for exceptions indicating access out of the defined range\n- @ref other_error for exceptions indicating other library errors\n\n@internal\n@note To have nothrow-copy-constructible exceptions, we internally use\n      `std::runtime_error` which can cope with arbitrary-length error messages.\n      Intermediate strings are built with static functions and then passed to\n      the actual constructor.\n@endinternal\n\n@liveexample{The following code shows how arbitrary library exceptions can be\ncaught.,exception}\n\n@since version 3.0.0\n*/\nclass exception : public std::exception\n{\n  public:\n    /// returns the explanatory string\n    JSON_HEDLEY_RETURNS_NON_NULL\n    const char* what() const noexcept override\n    {\n        return m.what();\n    }\n\n    /// the id of the exception\n    const int id;\n\n  protected:\n    JSON_HEDLEY_NON_NULL(3)\n    exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}\n\n    static std::string name(const std::string& ename, int id_)\n    {\n        return \"[json.exception.\" + ename + \".\" + std::to_string(id_) + \"] \";\n    }\n\n  private:\n    /// an exception object as storage for error messages\n    std::runtime_error m;\n};\n\n/*!\n@brief exception indicating a parse error\n\nThis exception is thrown by the library when a parse error occurs. Parse errors\ncan occur during the deserialization of JSON text, CBOR, MessagePack, as well\nas when using JSON Patch.\n\nMember @a byte holds the byte index of the last read character in the input\nfile.\n\nExceptions have ids 1xx.\n\nname / id                      | example message | description\n------------------------------ | --------------- | -------------------------\njson.exception.parse_error.101 | parse error at 2: unexpected end of input; expected string literal | This error indicates a syntax error while deserializing a JSON text. The error message describes that an unexpected token (character) was encountered, and the member @a byte indicates the error position.\njson.exception.parse_error.102 | parse error at 14: missing or wrong low surrogate | JSON uses the `\\uxxxx` format to describe Unicode characters. Code points above above 0xFFFF are split into two `\\uxxxx` entries (\"surrogate pairs\"). This error indicates that the surrogate pair is incomplete or contains an invalid code point.\njson.exception.parse_error.103 | parse error: code points above 0x10FFFF are invalid | Unicode supports code points up to 0x10FFFF. Code points above 0x10FFFF are invalid.\njson.exception.parse_error.104 | parse error: JSON patch must be an array of objects | [RFC 6902](https://tools.ietf.org/html/rfc6902) requires a JSON Patch document to be a JSON document that represents an array of objects.\njson.exception.parse_error.105 | parse error: operation must have string member 'op' | An operation of a JSON Patch document must contain exactly one \"op\" member, whose value indicates the operation to perform. Its value must be one of \"add\", \"remove\", \"replace\", \"move\", \"copy\", or \"test\"; other values are errors.\njson.exception.parse_error.106 | parse error: array index '01' must not begin with '0' | An array index in a JSON Pointer ([RFC 6901](https://tools.ietf.org/html/rfc6901)) may be `0` or any number without a leading `0`.\njson.exception.parse_error.107 | parse error: JSON pointer must be empty or begin with '/' - was: 'foo' | A JSON Pointer must be a Unicode string containing a sequence of zero or more reference tokens, each prefixed by a `/` character.\njson.exception.parse_error.108 | parse error: escape character '~' must be followed with '0' or '1' | In a JSON Pointer, only `~0` and `~1` are valid escape sequences.\njson.exception.parse_error.109 | parse error: array index 'one' is not a number | A JSON Pointer array index must be a number.\njson.exception.parse_error.110 | parse error at 1: cannot read 2 bytes from vector | When parsing CBOR or MessagePack, the byte vector ends before the complete value has been read.\njson.exception.parse_error.112 | parse error at 1: error reading CBOR; last byte: 0xF8 | Not all types of CBOR or MessagePack are supported. This exception occurs if an unsupported byte was read.\njson.exception.parse_error.113 | parse error at 2: expected a CBOR string; last byte: 0x98 | While parsing a map key, a value that is not a string has been read.\njson.exception.parse_error.114 | parse error: Unsupported BSON record type 0x0F | The parsing of the corresponding BSON record type is not implemented (yet).\njson.exception.parse_error.115 | parse error at byte 5: syntax error while parsing UBJSON high-precision number: invalid number text: 1A | A UBJSON high-precision number could not be parsed.\n\n@note For an input with n bytes, 1 is the index of the first character and n+1\n      is the index of the terminating null byte or the end of file. This also\n      holds true when reading a byte vector (CBOR or MessagePack).\n\n@liveexample{The following code shows how a `parse_error` exception can be\ncaught.,parse_error}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass parse_error : public exception\n{\n  public:\n    /*!\n    @brief create a parse error exception\n    @param[in] id_       the id of the exception\n    @param[in] pos       the position where the error occurred (or with\n                         chars_read_total=0 if the position cannot be\n                         determined)\n    @param[in] what_arg  the explanatory string\n    @return parse_error object\n    */\n    static parse_error create(int id_, const position_t& pos, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"parse_error\", id_) + \"parse error\" +\n                        position_string(pos) + \": \" + what_arg;\n        return parse_error(id_, pos.chars_read_total, w.c_str());\n    }\n\n    static parse_error create(int id_, std::size_t byte_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"parse_error\", id_) + \"parse error\" +\n                        (byte_ != 0 ? (\" at byte \" + std::to_string(byte_)) : \"\") +\n                        \": \" + what_arg;\n        return parse_error(id_, byte_, w.c_str());\n    }\n\n    /*!\n    @brief byte index of the parse error\n\n    The byte index of the last read character in the input file.\n\n    @note For an input with n bytes, 1 is the index of the first character and\n          n+1 is the index of the terminating null byte or the end of file.\n          This also holds true when reading a byte vector (CBOR or MessagePack).\n    */\n    const std::size_t byte;\n\n  private:\n    parse_error(int id_, std::size_t byte_, const char* what_arg)\n        : exception(id_, what_arg), byte(byte_) {}\n\n    static std::string position_string(const position_t& pos)\n    {\n        return \" at line \" + std::to_string(pos.lines_read + 1) +\n               \", column \" + std::to_string(pos.chars_read_current_line);\n    }\n};\n\n/*!\n@brief exception indicating errors with iterators\n\nThis exception is thrown if iterators passed to a library function do not match\nthe expected semantics.\n\nExceptions have ids 2xx.\n\nname / id                           | example message | description\n----------------------------------- | --------------- | -------------------------\njson.exception.invalid_iterator.201 | iterators are not compatible | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.\njson.exception.invalid_iterator.202 | iterator does not fit current value | In an erase or insert function, the passed iterator @a pos does not belong to the JSON value for which the function was called. It hence does not define a valid position for the deletion/insertion.\njson.exception.invalid_iterator.203 | iterators do not fit current value | Either iterator passed to function @ref erase(IteratorType first, IteratorType last) does not belong to the JSON value from which values shall be erased. It hence does not define a valid range to delete values from.\njson.exception.invalid_iterator.204 | iterators out of range | When an iterator range for a primitive type (number, boolean, or string) is passed to a constructor or an erase function, this range has to be exactly (@ref begin(), @ref end()), because this is the only way the single stored value is expressed. All other ranges are invalid.\njson.exception.invalid_iterator.205 | iterator out of range | When an iterator for a primitive type (number, boolean, or string) is passed to an erase function, the iterator has to be the @ref begin() iterator, because it is the only way to address the stored value. All other iterators are invalid.\njson.exception.invalid_iterator.206 | cannot construct with iterators from null | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) belong to a JSON null value and hence to not define a valid range.\njson.exception.invalid_iterator.207 | cannot use key() for non-object iterators | The key() member function can only be used on iterators belonging to a JSON object, because other types do not have a concept of a key.\njson.exception.invalid_iterator.208 | cannot use operator[] for object iterators | The operator[] to specify a concrete offset cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.\njson.exception.invalid_iterator.209 | cannot use offsets with object iterators | The offset operators (+, -, +=, -=) cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.\njson.exception.invalid_iterator.210 | iterators do not fit | The iterator range passed to the insert function are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.\njson.exception.invalid_iterator.211 | passed iterators may not belong to container | The iterator range passed to the insert function must not be a subrange of the container to insert to.\njson.exception.invalid_iterator.212 | cannot compare iterators of different containers | When two iterators are compared, they must belong to the same container.\njson.exception.invalid_iterator.213 | cannot compare order of object iterators | The order of object iterators cannot be compared, because JSON objects are unordered.\njson.exception.invalid_iterator.214 | cannot get value | Cannot get value for iterator: Either the iterator belongs to a null value or it is an iterator to a primitive type (number, boolean, or string), but the iterator is different to @ref begin().\n\n@liveexample{The following code shows how an `invalid_iterator` exception can be\ncaught.,invalid_iterator}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass invalid_iterator : public exception\n{\n  public:\n    static invalid_iterator create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"invalid_iterator\", id_) + what_arg;\n        return invalid_iterator(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    invalid_iterator(int id_, const char* what_arg)\n        : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating executing a member function with a wrong type\n\nThis exception is thrown in case of a type error; that is, a library function is\nexecuted on a JSON value whose type does not match the expected semantics.\n\nExceptions have ids 3xx.\n\nname / id                     | example message | description\n----------------------------- | --------------- | -------------------------\njson.exception.type_error.301 | cannot create object from initializer list | To create an object from an initializer list, the initializer list must consist only of a list of pairs whose first element is a string. When this constraint is violated, an array is created instead.\njson.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types.\njson.exception.type_error.303 | incompatible ReferenceType for get_ref, actual type is object | To retrieve a reference to a value stored in a @ref basic_json object with @ref get_ref, the type of the reference must match the value type. For instance, for a JSON array, the @a ReferenceType must be @ref array_t &.\njson.exception.type_error.304 | cannot use at() with string | The @ref at() member functions can only be executed for certain JSON types.\njson.exception.type_error.305 | cannot use operator[] with string | The @ref operator[] member functions can only be executed for certain JSON types.\njson.exception.type_error.306 | cannot use value() with string | The @ref value() member functions can only be executed for certain JSON types.\njson.exception.type_error.307 | cannot use erase() with string | The @ref erase() member functions can only be executed for certain JSON types.\njson.exception.type_error.308 | cannot use push_back() with string | The @ref push_back() and @ref operator+= member functions can only be executed for certain JSON types.\njson.exception.type_error.309 | cannot use insert() with | The @ref insert() member functions can only be executed for certain JSON types.\njson.exception.type_error.310 | cannot use swap() with number | The @ref swap() member functions can only be executed for certain JSON types.\njson.exception.type_error.311 | cannot use emplace_back() with string | The @ref emplace_back() member function can only be executed for certain JSON types.\njson.exception.type_error.312 | cannot use update() with string | The @ref update() member functions can only be executed for certain JSON types.\njson.exception.type_error.313 | invalid value to unflatten | The @ref unflatten function converts an object whose keys are JSON Pointers back into an arbitrary nested JSON value. The JSON Pointers must not overlap, because then the resulting value would not be well defined.\njson.exception.type_error.314 | only objects can be unflattened | The @ref unflatten function only works for an object whose keys are JSON Pointers.\njson.exception.type_error.315 | values in object must be primitive | The @ref unflatten function only works for an object whose keys are JSON Pointers and whose values are primitive.\njson.exception.type_error.316 | invalid UTF-8 byte at index 10: 0x7E | The @ref dump function only works with UTF-8 encoded strings; that is, if you assign a `std::string` to a JSON value, make sure it is UTF-8 encoded. |\njson.exception.type_error.317 | JSON value cannot be serialized to requested format | The dynamic type of the object cannot be represented in the requested serialization format (e.g. a raw `true` or `null` JSON object cannot be serialized to BSON) |\n\n@liveexample{The following code shows how a `type_error` exception can be\ncaught.,type_error}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass type_error : public exception\n{\n  public:\n    static type_error create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"type_error\", id_) + what_arg;\n        return type_error(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating access out of the defined range\n\nThis exception is thrown in case a library function is called on an input\nparameter that exceeds the expected range, for instance in case of array\nindices or nonexisting object keys.\n\nExceptions have ids 4xx.\n\nname / id                       | example message | description\n------------------------------- | --------------- | -------------------------\njson.exception.out_of_range.401 | array index 3 is out of range | The provided array index @a i is larger than @a size-1.\njson.exception.out_of_range.402 | array index '-' (3) is out of range | The special array index `-` in a JSON Pointer never describes a valid element of the array, but the index past the end. That is, it can only be used to add elements at this position, but not to read it.\njson.exception.out_of_range.403 | key 'foo' not found | The provided key was not found in the JSON object.\njson.exception.out_of_range.404 | unresolved reference token 'foo' | A reference token in a JSON Pointer could not be resolved.\njson.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch operations 'remove' and 'add' can not be applied to the root element of the JSON value.\njson.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.\njson.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. (until version 3.8.0) |\njson.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |\njson.exception.out_of_range.409 | BSON key cannot contain code point U+0000 (at byte 2) | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |\n\n@liveexample{The following code shows how an `out_of_range` exception can be\ncaught.,out_of_range}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass out_of_range : public exception\n{\n  public:\n    static out_of_range create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"out_of_range\", id_) + what_arg;\n        return out_of_range(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating other library errors\n\nThis exception is thrown in case of errors that cannot be classified with the\nother exception types.\n\nExceptions have ids 5xx.\n\nname / id                      | example message | description\n------------------------------ | --------------- | -------------------------\njson.exception.other_error.501 | unsuccessful: {\"op\":\"test\",\"path\":\"/baz\", \"value\":\"bar\"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n\n@liveexample{The following code shows how an `other_error` exception can be\ncaught.,other_error}\n\n@since version 3.0.0\n*/\nclass other_error : public exception\n{\n  public:\n    static other_error create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"other_error\", id_) + what_arg;\n        return other_error(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n\n#include <cstddef> // size_t\n#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type\n\nnamespace nlohmann\n{\nnamespace detail\n{\n// alias templates to reduce boilerplate\ntemplate<bool B, typename T = void>\nusing enable_if_t = typename std::enable_if<B, T>::type;\n\ntemplate<typename T>\nusing uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;\n\n// implementation of C++14 index_sequence and affiliates\n// source: https://stackoverflow.com/a/32223343\ntemplate<std::size_t... Ints>\nstruct index_sequence\n{\n    using type = index_sequence;\n    using value_type = std::size_t;\n    static constexpr std::size_t size() noexcept\n    {\n        return sizeof...(Ints);\n    }\n};\n\ntemplate<class Sequence1, class Sequence2>\nstruct merge_and_renumber;\n\ntemplate<std::size_t... I1, std::size_t... I2>\nstruct merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>>\n        : index_sequence < I1..., (sizeof...(I1) + I2)... > {};\n\ntemplate<std::size_t N>\nstruct make_index_sequence\n    : merge_and_renumber < typename make_index_sequence < N / 2 >::type,\n      typename make_index_sequence < N - N / 2 >::type > {};\n\ntemplate<> struct make_index_sequence<0> : index_sequence<> {};\ntemplate<> struct make_index_sequence<1> : index_sequence<0> {};\n\ntemplate<typename... Ts>\nusing index_sequence_for = make_index_sequence<sizeof...(Ts)>;\n\n// dispatch utility (taken from ranges-v3)\ntemplate<unsigned N> struct priority_tag : priority_tag < N - 1 > {};\ntemplate<> struct priority_tag<0> {};\n\n// taken from ranges-v3\ntemplate<typename T>\nstruct static_const\n{\n    static constexpr T value{};\n};\n\ntemplate<typename T>\nconstexpr T static_const<T>::value;\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\n#include <limits> // numeric_limits\n#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type\n#include <utility> // declval\n\n// #include <nlohmann/detail/iterators/iterator_traits.hpp>\n\n\n#include <iterator> // random_access_iterator_tag\n\n// #include <nlohmann/detail/meta/void_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename ...Ts> struct make_void\n{\n    using type = void;\n};\ntemplate<typename ...Ts> using void_t = typename make_void<Ts...>::type;\n} // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename It, typename = void>\nstruct iterator_types {};\n\ntemplate<typename It>\nstruct iterator_types <\n    It,\n    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,\n    typename It::reference, typename It::iterator_category >>\n{\n    using difference_type = typename It::difference_type;\n    using value_type = typename It::value_type;\n    using pointer = typename It::pointer;\n    using reference = typename It::reference;\n    using iterator_category = typename It::iterator_category;\n};\n\n// This is required as some compilers implement std::iterator_traits in a way that\n// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.\ntemplate<typename T, typename = void>\nstruct iterator_traits\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>\n            : iterator_types<T>\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>\n{\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = T;\n    using difference_type = ptrdiff_t;\n    using pointer = T*;\n    using reference = T&;\n};\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/detected.hpp>\n\n\n#include <type_traits>\n\n// #include <nlohmann/detail/meta/void_t.hpp>\n\n\n// https://en.cppreference.com/w/cpp/experimental/is_detected\nnamespace nlohmann\n{\nnamespace detail\n{\nstruct nonesuch\n{\n    nonesuch() = delete;\n    ~nonesuch() = delete;\n    nonesuch(nonesuch const&) = delete;\n    nonesuch(nonesuch const&&) = delete;\n    void operator=(nonesuch const&) = delete;\n    void operator=(nonesuch&&) = delete;\n};\n\ntemplate<class Default,\n         class AlwaysVoid,\n         template<class...> class Op,\n         class... Args>\nstruct detector\n{\n    using value_t = std::false_type;\n    using type = Default;\n};\n\ntemplate<class Default, template<class...> class Op, class... Args>\nstruct detector<Default, void_t<Op<Args...>>, Op, Args...>\n{\n    using value_t = std::true_type;\n    using type = Op<Args...>;\n};\n\ntemplate<template<class...> class Op, class... Args>\nusing is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;\n\ntemplate<template<class...> class Op, class... Args>\nusing detected_t = typename detector<nonesuch, void, Op, Args...>::type;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or = detector<Default, void, Op, Args...>;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or_t = typename detected_or<Default, Op, Args...>::type;\n\ntemplate<class Expected, template<class...> class Op, class... Args>\nusing is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;\n\ntemplate<class To, template<class...> class Op, class... Args>\nusing is_detected_convertible =\n    std::is_convertible<detected_t<Op, Args...>, To>;\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/json_fwd.hpp>\n#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_\n#define INCLUDE_NLOHMANN_JSON_FWD_HPP_\n\n#include <cstdint> // int64_t, uint64_t\n#include <map> // map\n#include <memory> // allocator\n#include <string> // string\n#include <vector> // vector\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nnamespace nlohmann\n{\n/*!\n@brief default JSONSerializer template argument\n\nThis serializer ignores the template arguments and uses ADL\n([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))\nfor serialization.\n*/\ntemplate<typename T = void, typename SFINAE = void>\nstruct adl_serializer;\n\ntemplate<template<typename U, typename V, typename... Args> class ObjectType =\n         std::map,\n         template<typename U, typename... Args> class ArrayType = std::vector,\n         class StringType = std::string, class BooleanType = bool,\n         class NumberIntegerType = std::int64_t,\n         class NumberUnsignedType = std::uint64_t,\n         class NumberFloatType = double,\n         template<typename U> class AllocatorType = std::allocator,\n         template<typename T, typename SFINAE = void> class JSONSerializer =\n         adl_serializer,\n         class BinaryType = std::vector<std::uint8_t>>\nclass basic_json;\n\n/*!\n@brief JSON Pointer\n\nA JSON pointer defines a string syntax for identifying a specific value\nwithin a JSON document. It can be used with functions `at` and\n`operator[]`. Furthermore, JSON pointers are the base for JSON patches.\n\n@sa [RFC 6901](https://tools.ietf.org/html/rfc6901)\n\n@since version 2.0.0\n*/\ntemplate<typename BasicJsonType>\nclass json_pointer;\n\n/*!\n@brief default JSON class\n\nThis type is the default specialization of the @ref basic_json class which\nuses the standard template types.\n\n@since version 1.0.0\n*/\nusing json = basic_json<>;\n\ntemplate<class Key, class T, class IgnoredLess, class Allocator>\nstruct ordered_map;\n\n/*!\n@brief ordered JSON class\n\nThis type preserves the insertion order of object keys.\n\n@since version 3.9.0\n*/\nusing ordered_json = basic_json<nlohmann::ordered_map>;\n\n}  // namespace nlohmann\n\n#endif  // INCLUDE_NLOHMANN_JSON_FWD_HPP_\n\n\nnamespace nlohmann\n{\n/*!\n@brief detail namespace with internal helper functions\n\nThis namespace collects functions that should not be exposed,\nimplementations of some @ref basic_json methods, and meta-programming helpers.\n\n@since version 2.1.0\n*/\nnamespace detail\n{\n/////////////\n// helpers //\n/////////////\n\n// Note to maintainers:\n//\n// Every trait in this file expects a non CV-qualified type.\n// The only exceptions are in the 'aliases for detected' section\n// (i.e. those of the form: decltype(T::member_function(std::declval<T>())))\n//\n// In this case, T has to be properly CV-qualified to constraint the function arguments\n// (e.g. to_json(BasicJsonType&, const T&))\n\ntemplate<typename> struct is_basic_json : std::false_type {};\n\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstruct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};\n\n//////////////////////\n// json_ref helpers //\n//////////////////////\n\ntemplate<typename>\nclass json_ref;\n\ntemplate<typename>\nstruct is_json_ref : std::false_type {};\n\ntemplate<typename T>\nstruct is_json_ref<json_ref<T>> : std::true_type {};\n\n//////////////////////////\n// aliases for detected //\n//////////////////////////\n\ntemplate<typename T>\nusing mapped_type_t = typename T::mapped_type;\n\ntemplate<typename T>\nusing key_type_t = typename T::key_type;\n\ntemplate<typename T>\nusing value_type_t = typename T::value_type;\n\ntemplate<typename T>\nusing difference_type_t = typename T::difference_type;\n\ntemplate<typename T>\nusing pointer_t = typename T::pointer;\n\ntemplate<typename T>\nusing reference_t = typename T::reference;\n\ntemplate<typename T>\nusing iterator_category_t = typename T::iterator_category;\n\ntemplate<typename T>\nusing iterator_t = typename T::iterator;\n\ntemplate<typename T, typename... Args>\nusing to_json_function = decltype(T::to_json(std::declval<Args>()...));\n\ntemplate<typename T, typename... Args>\nusing from_json_function = decltype(T::from_json(std::declval<Args>()...));\n\ntemplate<typename T, typename U>\nusing get_template_function = decltype(std::declval<T>().template get<U>());\n\n// trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_from_json : std::false_type {};\n\n// trait checking if j.get<T> is valid\n// use this trait instead of std::is_constructible or std::is_convertible,\n// both rely on, or make use of implicit conversions, and thus fail when T\n// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)\ntemplate <typename BasicJsonType, typename T>\nstruct is_getable\n{\n    static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;\n};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_from_json < BasicJsonType, T,\n           enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, from_json_function, serializer,\n        const BasicJsonType&, T&>::value;\n};\n\n// This trait checks if JSONSerializer<T>::from_json(json const&) exists\n// this overload is used for non-default-constructible user-defined-types\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_non_default_from_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<T, from_json_function, serializer,\n        const BasicJsonType&>::value;\n};\n\n// This trait checks if BasicJsonType::json_serializer<T>::to_json exists\n// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion.\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_to_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, to_json_function, serializer, BasicJsonType&,\n        T>::value;\n};\n\n\n///////////////////\n// is_ functions //\n///////////////////\n\ntemplate<typename T, typename = void>\nstruct is_iterator_traits : std::false_type {};\n\ntemplate<typename T>\nstruct is_iterator_traits<iterator_traits<T>>\n{\n  private:\n    using traits = iterator_traits<T>;\n\n  public:\n    static constexpr auto value =\n        is_detected<value_type_t, traits>::value &&\n        is_detected<difference_type_t, traits>::value &&\n        is_detected<pointer_t, traits>::value &&\n        is_detected<iterator_category_t, traits>::value &&\n        is_detected<reference_t, traits>::value;\n};\n\n// source: https://stackoverflow.com/a/37193089/4116453\n\ntemplate<typename T, typename = void>\nstruct is_complete_type : std::false_type {};\n\ntemplate<typename T>\nstruct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType,\n         typename = void>\nstruct is_compatible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type_impl <\n    BasicJsonType, CompatibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&\n    is_detected<key_type_t, CompatibleObjectType>::value >>\n{\n\n    using object_t = typename BasicJsonType::object_t;\n\n    // macOS's is_constructible does not play well with nonesuch...\n    static constexpr bool value =\n        std::is_constructible<typename object_t::key_type,\n        typename CompatibleObjectType::key_type>::value &&\n        std::is_constructible<typename object_t::mapped_type,\n        typename CompatibleObjectType::mapped_type>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type\n    : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         typename = void>\nstruct is_constructible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type_impl <\n    BasicJsonType, ConstructibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&\n    is_detected<key_type_t, ConstructibleObjectType>::value >>\n{\n    using object_t = typename BasicJsonType::object_t;\n\n    static constexpr bool value =\n        (std::is_default_constructible<ConstructibleObjectType>::value &&\n         (std::is_move_assignable<ConstructibleObjectType>::value ||\n          std::is_copy_assignable<ConstructibleObjectType>::value) &&\n         (std::is_constructible<typename ConstructibleObjectType::key_type,\n          typename object_t::key_type>::value &&\n          std::is_same <\n          typename object_t::mapped_type,\n          typename ConstructibleObjectType::mapped_type >::value)) ||\n        (has_from_json<BasicJsonType,\n         typename ConstructibleObjectType::mapped_type>::value ||\n         has_non_default_from_json <\n         BasicJsonType,\n         typename ConstructibleObjectType::mapped_type >::value);\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type\n    : is_constructible_object_type_impl<BasicJsonType,\n      ConstructibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleStringType,\n         typename = void>\nstruct is_compatible_string_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleStringType>\nstruct is_compatible_string_type_impl <\n    BasicJsonType, CompatibleStringType,\n    enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,\n    value_type_t, CompatibleStringType>::value >>\n{\n    static constexpr auto value =\n        std::is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_compatible_string_type\n    : is_compatible_string_type_impl<BasicJsonType, ConstructibleStringType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType,\n         typename = void>\nstruct is_constructible_string_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_constructible_string_type_impl <\n    BasicJsonType, ConstructibleStringType,\n    enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,\n    value_type_t, ConstructibleStringType>::value >>\n{\n    static constexpr auto value =\n        std::is_constructible<ConstructibleStringType,\n        typename BasicJsonType::string_t>::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_constructible_string_type\n    : is_constructible_string_type_impl<BasicJsonType, ConstructibleStringType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType, typename = void>\nstruct is_compatible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type_impl <\n    BasicJsonType, CompatibleArrayType,\n    enable_if_t < is_detected<value_type_t, CompatibleArrayType>::value&&\n    is_detected<iterator_t, CompatibleArrayType>::value&&\n// This is needed because json_reverse_iterator has a ::iterator type...\n// Therefore it is detected as a CompatibleArrayType.\n// The real fix would be to have an Iterable concept.\n    !is_iterator_traits <\n    iterator_traits<CompatibleArrayType >>::value >>\n{\n    static constexpr bool value =\n        std::is_constructible<BasicJsonType,\n        typename CompatibleArrayType::value_type>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type\n    : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType, typename = void>\nstruct is_constructible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t<std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value >>\n            : std::true_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t < !std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value&&\n    std::is_default_constructible<ConstructibleArrayType>::value&&\n(std::is_move_assignable<ConstructibleArrayType>::value ||\n std::is_copy_assignable<ConstructibleArrayType>::value)&&\nis_detected<value_type_t, ConstructibleArrayType>::value&&\nis_detected<iterator_t, ConstructibleArrayType>::value&&\nis_complete_type <\ndetected_t<value_type_t, ConstructibleArrayType >>::value >>\n{\n    static constexpr bool value =\n        // This is needed because json_reverse_iterator has a ::iterator type,\n        // furthermore, std::back_insert_iterator (and other iterators) have a\n        // base class `iterator`... Therefore it is detected as a\n        // ConstructibleArrayType. The real fix would be to have an Iterable\n        // concept.\n        !is_iterator_traits<iterator_traits<ConstructibleArrayType>>::value &&\n\n        (std::is_same<typename ConstructibleArrayType::value_type,\n         typename BasicJsonType::array_t::value_type>::value ||\n         has_from_json<BasicJsonType,\n         typename ConstructibleArrayType::value_type>::value ||\n         has_non_default_from_json <\n         BasicJsonType, typename ConstructibleArrayType::value_type >::value);\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type\n    : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType,\n         typename = void>\nstruct is_compatible_integer_type_impl : std::false_type {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type_impl <\n    RealIntegerType, CompatibleNumberIntegerType,\n    enable_if_t < std::is_integral<RealIntegerType>::value&&\n    std::is_integral<CompatibleNumberIntegerType>::value&&\n    !std::is_same<bool, CompatibleNumberIntegerType>::value >>\n{\n    // is there an assert somewhere on overflows?\n    using RealLimits = std::numeric_limits<RealIntegerType>;\n    using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;\n\n    static constexpr auto value =\n        std::is_constructible<RealIntegerType,\n        CompatibleNumberIntegerType>::value &&\n        CompatibleLimits::is_integer &&\n        RealLimits::is_signed == CompatibleLimits::is_signed;\n};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type\n    : is_compatible_integer_type_impl<RealIntegerType,\n      CompatibleNumberIntegerType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleType, typename = void>\nstruct is_compatible_type_impl: std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type_impl <\n    BasicJsonType, CompatibleType,\n    enable_if_t<is_complete_type<CompatibleType>::value >>\n{\n    static constexpr bool value =\n        has_to_json<BasicJsonType, CompatibleType>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type\n    : is_compatible_type_impl<BasicJsonType, CompatibleType> {};\n\n// https://en.cppreference.com/w/cpp/types/conjunction\ntemplate<class...> struct conjunction : std::true_type { };\ntemplate<class B1> struct conjunction<B1> : B1 { };\ntemplate<class B1, class... Bn>\nstruct conjunction<B1, Bn...>\n: std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};\n\ntemplate<typename T1, typename T2>\nstruct is_constructible_tuple : std::false_type {};\n\ntemplate<typename T1, typename... Args>\nstruct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<std::is_constructible<T1, Args>...> {};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t\n#include <string> // string\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////////////\n// JSON type enumeration //\n///////////////////////////\n\n/*!\n@brief the JSON type enumeration\n\nThis enumeration collects the different JSON types. It is internally used to\ndistinguish the stored values, and the functions @ref basic_json::is_null(),\n@ref basic_json::is_object(), @ref basic_json::is_array(),\n@ref basic_json::is_string(), @ref basic_json::is_boolean(),\n@ref basic_json::is_number() (with @ref basic_json::is_number_integer(),\n@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()),\n@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and\n@ref basic_json::is_structured() rely on it.\n\n@note There are three enumeration entries (number_integer, number_unsigned, and\nnumber_float), because the library distinguishes these three types for numbers:\n@ref basic_json::number_unsigned_t is used for unsigned integers,\n@ref basic_json::number_integer_t is used for signed integers, and\n@ref basic_json::number_float_t is used for floating-point numbers or to\napproximate integers which do not fit in the limits of their respective type.\n\n@sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON\nvalue with the default value for a given type\n\n@since version 1.0.0\n*/\nenum class value_t : std::uint8_t\n{\n    null,             ///< null value\n    object,           ///< object (unordered set of name/value pairs)\n    array,            ///< array (ordered collection of values)\n    string,           ///< string value\n    boolean,          ///< boolean value\n    number_integer,   ///< number value (signed integer)\n    number_unsigned,  ///< number value (unsigned integer)\n    number_float,     ///< number value (floating-point)\n    binary,           ///< binary array (ordered collection of bytes)\n    discarded         ///< discarded by the parser callback function\n};\n\n/*!\n@brief comparison operator for JSON types\n\nReturns an ordering that is similar to Python:\n- order: null < boolean < number < object < array < string < binary\n- furthermore, each type is not smaller than itself\n- discarded values are not comparable\n- binary is represented as a b\"\" string in python and directly comparable to a\n  string; however, making a binary array directly comparable with a string would\n  be surprising behavior in a JSON file.\n\n@since version 1.0.0\n*/\ninline bool operator<(const value_t lhs, const value_t rhs) noexcept\n{\n    static constexpr std::array<std::uint8_t, 9> order = {{\n            0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */,\n            1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */,\n            6 /* binary */\n        }\n    };\n\n    const auto l_index = static_cast<std::size_t>(lhs);\n    const auto r_index = static_cast<std::size_t>(rhs);\n    return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];\n}\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename std::nullptr_t& n)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_null()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be null, but is \" + std::string(j.type_name())));\n    }\n    n = nullptr;\n}\n\n// overloads for basic_json template parameters\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t < std::is_arithmetic<ArithmeticType>::value&&\n                         !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n                         int > = 0 >\nvoid get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n\n        default:\n            JSON_THROW(type_error::create(302, \"type must be number, but is \" + std::string(j.type_name())));\n    }\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_boolean()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be boolean, but is \" + std::string(j.type_name())));\n    }\n    b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be string, but is \" + std::string(j.type_name())));\n    }\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate <\n    typename BasicJsonType, typename ConstructibleStringType,\n    enable_if_t <\n        is_constructible_string_type<BasicJsonType, ConstructibleStringType>::value&&\n        !std::is_same<typename BasicJsonType::string_t,\n                      ConstructibleStringType>::value,\n        int > = 0 >\nvoid from_json(const BasicJsonType& j, ConstructibleStringType& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be string, but is \" + std::string(j.type_name())));\n    }\n\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, EnumType& e)\n{\n    typename std::underlying_type<EnumType>::type val;\n    get_arithmetic_value(j, val);\n    e = static_cast<EnumType>(val);\n}\n\n// forward_list doesn't have an insert method\ntemplate<typename BasicJsonType, typename T, typename Allocator,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    l.clear();\n    std::transform(j.rbegin(), j.rend(),\n                   std::front_inserter(l), [](const BasicJsonType & i)\n    {\n        return i.template get<T>();\n    });\n}\n\n// valarray doesn't have an insert method\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, std::valarray<T>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    l.resize(j.size());\n    std::transform(j.begin(), j.end(), std::begin(l),\n                   [](const BasicJsonType & elem)\n    {\n        return elem.template get<T>();\n    });\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json(const BasicJsonType& j, T (&arr)[N])\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)\n{\n    arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,\n                          priority_tag<2> /*unused*/)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nauto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/)\n-> decltype(\n    arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),\n    j.template get<typename ConstructibleArrayType::value_type>(),\n    void())\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    ret.reserve(j.size());\n    std::transform(j.begin(), j.end(),\n                   std::inserter(ret, end(ret)), [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nvoid from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,\n                          priority_tag<0> /*unused*/)\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    std::transform(\n        j.begin(), j.end(), std::inserter(ret, end(ret)),\n        [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate < typename BasicJsonType, typename ConstructibleArrayType,\n           enable_if_t <\n               is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&&\n               !is_basic_json<ConstructibleArrayType>::value,\n               int > = 0 >\nauto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)\n-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),\nj.template get<typename ConstructibleArrayType::value_type>(),\nvoid())\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" +\n                                      std::string(j.type_name())));\n    }\n\n    from_json_array_impl(j, arr, priority_tag<3> {});\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_binary()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(j.type_name())));\n    }\n\n    bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, ConstructibleObjectType& obj)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_object()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be object, but is \" + std::string(j.type_name())));\n    }\n\n    ConstructibleObjectType ret;\n    auto inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();\n    using value_type = typename ConstructibleObjectType::value_type;\n    std::transform(\n        inner_object->begin(), inner_object->end(),\n        std::inserter(ret, ret.begin()),\n        [](typename BasicJsonType::object_t::value_type const & p)\n    {\n        return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());\n    });\n    obj = std::move(ret);\n}\n\n// overload for arithmetic types, not chosen for basic_json template arguments\n// (BooleanType, etc..); note: Is it really necessary to provide explicit\n// overloads for boolean_t etc. in case of a custom BooleanType which is not\n// an arithmetic type?\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t <\n               std::is_arithmetic<ArithmeticType>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n               int > = 0 >\nvoid from_json(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n        case value_t::boolean:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());\n            break;\n        }\n\n        default:\n            JSON_THROW(type_error::create(302, \"type must be number, but is \" + std::string(j.type_name())));\n    }\n}\n\ntemplate<typename BasicJsonType, typename A1, typename A2>\nvoid from_json(const BasicJsonType& j, std::pair<A1, A2>& p)\n{\n    p = {j.at(0).template get<A1>(), j.at(1).template get<A2>()};\n}\n\ntemplate<typename BasicJsonType, typename Tuple, std::size_t... Idx>\nvoid from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_sequence<Idx...> /*unused*/)\n{\n    t = std::make_tuple(j.at(Idx).template get<typename std::tuple_element<Idx, Tuple>::type>()...);\n}\n\ntemplate<typename BasicJsonType, typename... Args>\nvoid from_json(const BasicJsonType& j, std::tuple<Args...>& t)\n{\n    from_json_tuple_impl(j, t, index_sequence_for<Args...> {});\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\nvoid from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(p.type_name())));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\nvoid from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(p.type_name())));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\nstruct from_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(const BasicJsonType& j, T& val) const\n    noexcept(noexcept(from_json(j, val)))\n    -> decltype(from_json(j, val), void())\n    {\n        return from_json(j, val);\n    }\n};\n}  // namespace detail\n\n/// namespace to hold default `from_json` function\n/// to see why this is required:\n/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html\nnamespace\n{\nconstexpr const auto& from_json = detail::static_const<detail::from_json_fn>::value;\n} // namespace\n} // namespace nlohmann\n\n// #include <nlohmann/detail/conversions/to_json.hpp>\n\n\n#include <algorithm> // copy\n#include <iterator> // begin, end\n#include <string> // string\n#include <tuple> // tuple, get\n#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type\n#include <utility> // move, forward, declval, pair\n#include <valarray> // valarray\n#include <vector> // vector\n\n// #include <nlohmann/detail/iterators/iteration_proxy.hpp>\n\n\n#include <cstddef> // size_t\n#include <iterator> // input_iterator_tag\n#include <string> // string, to_string\n#include <tuple> // tuple_size, get, tuple_element\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename string_type>\nvoid int_to_string( string_type& target, std::size_t value )\n{\n    // For ADL\n    using std::to_string;\n    target = to_string(value);\n}\ntemplate<typename IteratorType> class iteration_proxy_value\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    using value_type = iteration_proxy_value;\n    using pointer = value_type * ;\n    using reference = value_type & ;\n    using iterator_category = std::input_iterator_tag;\n    using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;\n\n  private:\n    /// the iterator\n    IteratorType anchor;\n    /// an index for arrays (used to create key names)\n    std::size_t array_index = 0;\n    /// last stringified array index\n    mutable std::size_t array_index_last = 0;\n    /// a string representation of the array index\n    mutable string_type array_index_str = \"0\";\n    /// an empty string (to return a reference for primitive values)\n    const string_type empty_str = \"\";\n\n  public:\n    explicit iteration_proxy_value(IteratorType it) noexcept : anchor(it) {}\n\n    /// dereference operator (needed for range-based for)\n    iteration_proxy_value& operator*()\n    {\n        return *this;\n    }\n\n    /// increment operator (needed for range-based for)\n    iteration_proxy_value& operator++()\n    {\n        ++anchor;\n        ++array_index;\n\n        return *this;\n    }\n\n    /// equality operator (needed for InputIterator)\n    bool operator==(const iteration_proxy_value& o) const\n    {\n        return anchor == o.anchor;\n    }\n\n    /// inequality operator (needed for range-based for)\n    bool operator!=(const iteration_proxy_value& o) const\n    {\n        return anchor != o.anchor;\n    }\n\n    /// return key of the iterator\n    const string_type& key() const\n    {\n        JSON_ASSERT(anchor.m_object != nullptr);\n\n        switch (anchor.m_object->type())\n        {\n            // use integer array index as key\n            case value_t::array:\n            {\n                if (array_index != array_index_last)\n                {\n                    int_to_string( array_index_str, array_index );\n                    array_index_last = array_index;\n                }\n                return array_index_str;\n            }\n\n            // use key from the object\n            case value_t::object:\n                return anchor.key();\n\n            // use an empty key for all primitive types\n            default:\n                return empty_str;\n        }\n    }\n\n    /// return value of the iterator\n    typename IteratorType::reference value() const\n    {\n        return anchor.value();\n    }\n};\n\n/// proxy class for the items() function\ntemplate<typename IteratorType> class iteration_proxy\n{\n  private:\n    /// the container to iterate\n    typename IteratorType::reference container;\n\n  public:\n    /// construct iteration proxy from a container\n    explicit iteration_proxy(typename IteratorType::reference cont) noexcept\n        : container(cont) {}\n\n    /// return iterator begin (needed for range-based for)\n    iteration_proxy_value<IteratorType> begin() noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container.begin());\n    }\n\n    /// return iterator end (needed for range-based for)\n    iteration_proxy_value<IteratorType> end() noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container.end());\n    }\n};\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key())\n{\n    return i.key();\n}\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value())\n{\n    return i.value();\n}\n}  // namespace detail\n}  // namespace nlohmann\n\n// The Addition to the STD Namespace is required to add\n// Structured Bindings Support to the iteration_proxy_value class\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\nnamespace std\n{\n#if defined(__clang__)\n    // Fix: https://github.com/nlohmann/json/issues/1401\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wmismatched-tags\"\n#endif\ntemplate<typename IteratorType>\nclass tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>>\n            : public std::integral_constant<std::size_t, 2> {};\n\ntemplate<std::size_t N, typename IteratorType>\nclass tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>\n{\n  public:\n    using type = decltype(\n                     get<N>(std::declval <\n                            ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));\n};\n#if defined(__clang__)\n    #pragma clang diagnostic pop\n#endif\n} // namespace std\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n//////////////////\n// constructors //\n//////////////////\n\ntemplate<value_t> struct external_constructor;\n\ntemplate<>\nstruct external_constructor<value_t::boolean>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept\n    {\n        j.m_type = value_t::boolean;\n        j.m_value = b;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::string>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)\n    {\n        j.m_type = value_t::string;\n        j.m_value = s;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n    {\n        j.m_type = value_t::string;\n        j.m_value = std::move(s);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleStringType,\n               enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleStringType& str)\n    {\n        j.m_type = value_t::string;\n        j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::binary>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)\n    {\n        j.m_type = value_t::binary;\n        typename BasicJsonType::binary_t value{b};\n        j.m_value = value;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)\n    {\n        j.m_type = value_t::binary;\n        typename BasicJsonType::binary_t value{std::move(b)};\n        j.m_value = value;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_float>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept\n    {\n        j.m_type = value_t::number_float;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_unsigned>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept\n    {\n        j.m_type = value_t::number_unsigned;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_integer>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept\n    {\n        j.m_type = value_t::number_integer;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::array>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = arr;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = std::move(arr);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleArrayType,\n               enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleArrayType& arr)\n    {\n        using std::begin;\n        using std::end;\n        j.m_type = value_t::array;\n        j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const std::vector<bool>& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = value_t::array;\n        j.m_value.array->reserve(arr.size());\n        for (const bool x : arr)\n        {\n            j.m_value.array->push_back(x);\n        }\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType, typename T,\n             enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\n    static void construct(BasicJsonType& j, const std::valarray<T>& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = value_t::array;\n        j.m_value.array->resize(arr.size());\n        if (arr.size() > 0)\n        {\n            std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());\n        }\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::object>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)\n    {\n        j.m_type = value_t::object;\n        j.m_value = obj;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n    {\n        j.m_type = value_t::object;\n        j.m_value = std::move(obj);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleObjectType,\n               enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleObjectType& obj)\n    {\n        using std::begin;\n        using std::end;\n\n        j.m_type = value_t::object;\n        j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));\n        j.assert_invariant();\n    }\n};\n\n/////////////\n// to_json //\n/////////////\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>\nvoid to_json(BasicJsonType& j, T b) noexcept\n{\n    external_constructor<value_t::boolean>::construct(j, b);\n}\n\ntemplate<typename BasicJsonType, typename CompatibleString,\n         enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const CompatibleString& s)\n{\n    external_constructor<value_t::string>::construct(j, s);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n{\n    external_constructor<value_t::string>::construct(j, std::move(s));\n}\n\ntemplate<typename BasicJsonType, typename FloatType,\n         enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, FloatType val) noexcept\n{\n    external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberUnsignedType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept\n{\n    external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberIntegerType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept\n{\n    external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, EnumType e) noexcept\n{\n    using underlying_type = typename std::underlying_type<EnumType>::type;\n    external_constructor<value_t::number_integer>::construct(j, static_cast<underlying_type>(e));\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, const std::vector<bool>& e)\n{\n    external_constructor<value_t::array>::construct(j, e);\n}\n\ntemplate < typename BasicJsonType, typename CompatibleArrayType,\n           enable_if_t < is_compatible_array_type<BasicJsonType,\n                         CompatibleArrayType>::value&&\n                         !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&\n                         !is_basic_json<CompatibleArrayType>::value,\n                         int > = 0 >\nvoid to_json(BasicJsonType& j, const CompatibleArrayType& arr)\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)\n{\n    external_constructor<value_t::binary>::construct(j, bin);\n}\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const std::valarray<T>& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate < typename BasicJsonType, typename CompatibleObjectType,\n           enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 >\nvoid to_json(BasicJsonType& j, const CompatibleObjectType& obj)\n{\n    external_constructor<value_t::object>::construct(j, obj);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n{\n    external_constructor<value_t::object>::construct(j, std::move(obj));\n}\n\ntemplate <\n    typename BasicJsonType, typename T, std::size_t N,\n    enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,\n                  const T(&)[N]>::value,\n                  int > = 0 >\nvoid to_json(BasicJsonType& j, const T(&arr)[N])\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >\nvoid to_json(BasicJsonType& j, const std::pair<T1, T2>& p)\n{\n    j = { p.first, p.second };\n}\n\n// for https://github.com/nlohmann/json/pull/1134\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const T& b)\n{\n    j = { {b.key(), b.value()} };\n}\n\ntemplate<typename BasicJsonType, typename Tuple, std::size_t... Idx>\nvoid to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/)\n{\n    j = { std::get<Idx>(t)... };\n}\n\ntemplate<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>\nvoid to_json(BasicJsonType& j, const T& t)\n{\n    to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});\n}\n\nstruct to_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))\n    -> decltype(to_json(j, std::forward<T>(val)), void())\n    {\n        return to_json(j, std::forward<T>(val));\n    }\n};\n}  // namespace detail\n\n/// namespace to hold default `to_json` function\nnamespace\n{\nconstexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;\n} // namespace\n} // namespace nlohmann\n\n\nnamespace nlohmann\n{\n\ntemplate<typename, typename>\nstruct adl_serializer\n{\n    /*!\n    @brief convert a JSON value to any value type\n\n    This function is usually called by the `get()` function of the\n    @ref basic_json class (either explicit or via conversion operators).\n\n    @param[in] j        JSON value to read from\n    @param[in,out] val  value to write to\n    */\n    template<typename BasicJsonType, typename ValueType>\n    static auto from_json(BasicJsonType&& j, ValueType& val) noexcept(\n        noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))\n    -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())\n    {\n        ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);\n    }\n\n    /*!\n    @brief convert any value type to a JSON value\n\n    This function is usually called by the constructors of the @ref basic_json\n    class.\n\n    @param[in,out] j  JSON value to write to\n    @param[in] val    value to read from\n    */\n    template<typename BasicJsonType, typename ValueType>\n    static auto to_json(BasicJsonType& j, ValueType&& val) noexcept(\n        noexcept(::nlohmann::to_json(j, std::forward<ValueType>(val))))\n    -> decltype(::nlohmann::to_json(j, std::forward<ValueType>(val)), void())\n    {\n        ::nlohmann::to_json(j, std::forward<ValueType>(val));\n    }\n};\n\n}  // namespace nlohmann\n\n// #include <nlohmann/byte_container_with_subtype.hpp>\n\n\n#include <cstdint> // uint8_t\n#include <tuple> // tie\n#include <utility> // move\n\nnamespace nlohmann\n{\n\n/*!\n@brief an internal type for a backed binary type\n\nThis type extends the template parameter @a BinaryType provided to `basic_json`\nwith a subtype used by BSON and MessagePack. This type exists so that the user\ndoes not have to specify a type themselves with a specific naming scheme in\norder to override the binary type.\n\n@tparam BinaryType container to store bytes (`std::vector<std::uint8_t>` by\n                   default)\n\n@since version 3.8.0\n*/\ntemplate<typename BinaryType>\nclass byte_container_with_subtype : public BinaryType\n{\n  public:\n    /// the type of the underlying container\n    using container_type = BinaryType;\n\n    byte_container_with_subtype() noexcept(noexcept(container_type()))\n        : container_type()\n    {}\n\n    byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n    {}\n\n    byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n    {}\n\n    byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n        , m_subtype(subtype)\n        , m_has_subtype(true)\n    {}\n\n    byte_container_with_subtype(container_type&& b, std::uint8_t subtype) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n        , m_subtype(subtype)\n        , m_has_subtype(true)\n    {}\n\n    bool operator==(const byte_container_with_subtype& rhs) const\n    {\n        return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==\n               std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);\n    }\n\n    bool operator!=(const byte_container_with_subtype& rhs) const\n    {\n        return !(rhs == *this);\n    }\n\n    /*!\n    @brief sets the binary subtype\n\n    Sets the binary subtype of the value, also flags a binary JSON value as\n    having a subtype, which has implications for serialization.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    void set_subtype(std::uint8_t subtype) noexcept\n    {\n        m_subtype = subtype;\n        m_has_subtype = true;\n    }\n\n    /*!\n    @brief return the binary subtype\n\n    Returns the numerical subtype of the value if it has a subtype. If it does\n    not have a subtype, this function will return size_t(-1) as a sentinel\n    value.\n\n    @return the numerical subtype of the binary value\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    constexpr std::uint8_t subtype() const noexcept\n    {\n        return m_subtype;\n    }\n\n    /*!\n    @brief return whether the value has a subtype\n\n    @return whether the value has a subtype\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n\n    @since version 3.8.0\n    */\n    constexpr bool has_subtype() const noexcept\n    {\n        return m_has_subtype;\n    }\n\n    /*!\n    @brief clears the binary subtype\n\n    Clears the binary subtype and flags the value as not having a subtype, which\n    has implications for serialization; for instance MessagePack will prefer the\n    bin family over the ext family.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    void clear_subtype() noexcept\n    {\n        m_subtype = 0;\n        m_has_subtype = false;\n    }\n\n  private:\n    std::uint8_t m_subtype = 0;\n    bool m_has_subtype = false;\n};\n\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/conversions/from_json.hpp>\n\n// #include <nlohmann/detail/conversions/to_json.hpp>\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/hash.hpp>\n\n\n#include <cstddef> // size_t, uint8_t\n#include <functional> // hash\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n// boost::hash_combine\ninline std::size_t combine(std::size_t seed, std::size_t h) noexcept\n{\n    seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);\n    return seed;\n}\n\n/*!\n@brief hash a JSON value\n\nThe hash function tries to rely on std::hash where possible. Furthermore, the\ntype of the JSON value is taken into account to have different hash values for\nnull, 0, 0U, and false, etc.\n\n@tparam BasicJsonType basic_json specialization\n@param j JSON value to hash\n@return hash value of j\n*/\ntemplate<typename BasicJsonType>\nstd::size_t hash(const BasicJsonType& j)\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n    const auto type = static_cast<std::size_t>(j.type());\n    switch (j.type())\n    {\n        case BasicJsonType::value_t::null:\n        case BasicJsonType::value_t::discarded:\n        {\n            return combine(type, 0);\n        }\n\n        case BasicJsonType::value_t::object:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j.items())\n            {\n                const auto h = std::hash<string_t> {}(element.key());\n                seed = combine(seed, h);\n                seed = combine(seed, hash(element.value()));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::array:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j)\n            {\n                seed = combine(seed, hash(element));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::string:\n        {\n            const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::boolean:\n        {\n            const auto h = std::hash<bool> {}(j.template get<bool>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::number_integer:\n        {\n            const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::number_unsigned:\n        {\n            const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::number_float:\n        {\n            const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::binary:\n        {\n            auto seed = combine(type, j.get_binary().size());\n            const auto h = std::hash<bool> {}(j.get_binary().has_subtype());\n            seed = combine(seed, h);\n            seed = combine(seed, j.get_binary().subtype());\n            for (const auto byte : j.get_binary())\n            {\n                seed = combine(seed, std::hash<std::uint8_t> {}(byte));\n            }\n            return seed;\n        }\n\n        default: // LCOV_EXCL_LINE\n            JSON_ASSERT(false); // LCOV_EXCL_LINE\n    }\n}\n\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/binary_reader.hpp>\n\n\n#include <algorithm> // generate_n\n#include <array> // array\n#include <cmath> // ldexp\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstdio> // snprintf\n#include <cstring> // memcpy\n#include <iterator> // back_inserter\n#include <limits> // numeric_limits\n#include <string> // char_traits, string\n#include <utility> // make_pair, move\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstdio> //FILE *\n#include <cstring> // strlen\n#include <istream> // istream\n#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next\n#include <memory> // shared_ptr, make_shared, addressof\n#include <numeric> // accumulate\n#include <string> // string, char_traits\n#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer\n#include <utility> // pair, declval\n\n// #include <nlohmann/detail/iterators/iterator_traits.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// the supported input formats\nenum class input_format_t { json, cbor, msgpack, ubjson, bson };\n\n////////////////////\n// input adapters //\n////////////////////\n\n/*!\nInput adapter for stdio file access. This adapter read only 1 byte and do not use any\n buffer. This adapter is a very low level adapter.\n*/\nclass file_input_adapter\n{\n  public:\n    using char_type = char;\n\n    JSON_HEDLEY_NON_NULL(2)\n    explicit file_input_adapter(std::FILE* f) noexcept\n        : m_file(f)\n    {}\n\n    // make class move-only\n    file_input_adapter(const file_input_adapter&) = delete;\n    file_input_adapter(file_input_adapter&&) = default;\n    file_input_adapter& operator=(const file_input_adapter&) = delete;\n    file_input_adapter& operator=(file_input_adapter&&) = delete;\n\n    std::char_traits<char>::int_type get_character() noexcept\n    {\n        return std::fgetc(m_file);\n    }\n\n  private:\n    /// the file pointer to read from\n    std::FILE* m_file;\n};\n\n\n/*!\nInput adapter for a (caching) istream. Ignores a UFT Byte Order Mark at\nbeginning of input. Does not support changing the underlying std::streambuf\nin mid-input. Maintains underlying std::istream and std::streambuf to support\nsubsequent use of standard std::istream operations to process any input\ncharacters following those used in parsing the JSON input.  Clears the\nstd::istream flags; any input errors (e.g., EOF) will be detected by the first\nsubsequent call for input from the std::istream.\n*/\nclass input_stream_adapter\n{\n  public:\n    using char_type = char;\n\n    ~input_stream_adapter()\n    {\n        // clear stream flags; we use underlying streambuf I/O, do not\n        // maintain ifstream flags, except eof\n        if (is != nullptr)\n        {\n            is->clear(is->rdstate() & std::ios::eofbit);\n        }\n    }\n\n    explicit input_stream_adapter(std::istream& i)\n        : is(&i), sb(i.rdbuf())\n    {}\n\n    // delete because of pointer members\n    input_stream_adapter(const input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&& rhs) = delete;\n\n    input_stream_adapter(input_stream_adapter&& rhs) noexcept : is(rhs.is), sb(rhs.sb)\n    {\n        rhs.is = nullptr;\n        rhs.sb = nullptr;\n    }\n\n    // std::istream/std::streambuf use std::char_traits<char>::to_int_type, to\n    // ensure that std::char_traits<char>::eof() and the character 0xFF do not\n    // end up as the same value, eg. 0xFFFFFFFF.\n    std::char_traits<char>::int_type get_character()\n    {\n        auto res = sb->sbumpc();\n        // set eof manually, as we don't use the istream interface.\n        if (JSON_HEDLEY_UNLIKELY(res == EOF))\n        {\n            is->clear(is->rdstate() | std::ios::eofbit);\n        }\n        return res;\n    }\n\n  private:\n    /// the associated input stream\n    std::istream* is = nullptr;\n    std::streambuf* sb = nullptr;\n};\n\n// General-purpose iterator-based adapter. It might not be as fast as\n// theoretically possible for some containers, but it is extremely versatile.\ntemplate<typename IteratorType>\nclass iterator_input_adapter\n{\n  public:\n    using char_type = typename std::iterator_traits<IteratorType>::value_type;\n\n    iterator_input_adapter(IteratorType first, IteratorType last)\n        : current(std::move(first)), end(std::move(last)) {}\n\n    typename std::char_traits<char_type>::int_type get_character()\n    {\n        if (JSON_HEDLEY_LIKELY(current != end))\n        {\n            auto result = std::char_traits<char_type>::to_int_type(*current);\n            std::advance(current, 1);\n            return result;\n        }\n        else\n        {\n            return std::char_traits<char_type>::eof();\n        }\n    }\n\n  private:\n    IteratorType current;\n    IteratorType end;\n\n    template<typename BaseInputAdapter, size_t T>\n    friend struct wide_string_input_helper;\n\n    bool empty() const\n    {\n        return current == end;\n    }\n\n};\n\n\ntemplate<typename BaseInputAdapter, size_t T>\nstruct wide_string_input_helper;\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 4>\n{\n    // UTF-32\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-32 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (wc <= 0xFFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else if (wc <= 0x10FFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 4;\n            }\n            else\n            {\n                // unknown character\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n        }\n    }\n};\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 2>\n{\n    // UTF-16\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-16 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (0xD800 > wc || wc >= 0xE000)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else\n            {\n                if (JSON_HEDLEY_UNLIKELY(!input.empty()))\n                {\n                    const auto wc2 = static_cast<unsigned int>(input.get_character());\n                    const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));\n                    utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));\n                    utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));\n                    utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));\n                    utf8_bytes_filled = 4;\n                }\n                else\n                {\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                    utf8_bytes_filled = 1;\n                }\n            }\n        }\n    }\n};\n\n// Wraps another input apdater to convert wide character types into individual bytes.\ntemplate<typename BaseInputAdapter, typename WideCharType>\nclass wide_string_input_adapter\n{\n  public:\n    using char_type = char;\n\n    wide_string_input_adapter(BaseInputAdapter base)\n        : base_adapter(base) {}\n\n    typename std::char_traits<char>::int_type get_character() noexcept\n    {\n        // check if buffer needs to be filled\n        if (utf8_bytes_index == utf8_bytes_filled)\n        {\n            fill_buffer<sizeof(WideCharType)>();\n\n            JSON_ASSERT(utf8_bytes_filled > 0);\n            JSON_ASSERT(utf8_bytes_index == 0);\n        }\n\n        // use buffer\n        JSON_ASSERT(utf8_bytes_filled > 0);\n        JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);\n        return utf8_bytes[utf8_bytes_index++];\n    }\n\n  private:\n    BaseInputAdapter base_adapter;\n\n    template<size_t T>\n    void fill_buffer()\n    {\n        wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);\n    }\n\n    /// a buffer for UTF-8 bytes\n    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};\n\n    /// index to the utf8_codes array for the next valid byte\n    std::size_t utf8_bytes_index = 0;\n    /// number of valid bytes in the utf8_codes array\n    std::size_t utf8_bytes_filled = 0;\n};\n\n\ntemplate<typename IteratorType, typename Enable = void>\nstruct iterator_input_adapter_factory\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using adapter_type = iterator_input_adapter<iterator_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(std::move(first), std::move(last));\n    }\n};\n\ntemplate<typename T>\nstruct is_iterator_of_multibyte\n{\n    using value_type = typename std::iterator_traits<T>::value_type;\n    enum\n    {\n        value = sizeof(value_type) > 1\n    };\n};\n\ntemplate<typename IteratorType>\nstruct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using base_adapter_type = iterator_input_adapter<iterator_type>;\n    using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(base_adapter_type(std::move(first), std::move(last)));\n    }\n};\n\n// General purpose iterator-based input\ntemplate<typename IteratorType>\ntypename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)\n{\n    using factory_type = iterator_input_adapter_factory<IteratorType>;\n    return factory_type::create(first, last);\n}\n\n// Convenience shorthand from container to iterator\ntemplate<typename ContainerType>\nauto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container)))\n{\n    // Enable ADL\n    using std::begin;\n    using std::end;\n\n    return input_adapter(begin(container), end(container));\n}\n\n// Special cases with fast paths\ninline file_input_adapter input_adapter(std::FILE* file)\n{\n    return file_input_adapter(file);\n}\n\ninline input_stream_adapter input_adapter(std::istream& stream)\n{\n    return input_stream_adapter(stream);\n}\n\ninline input_stream_adapter input_adapter(std::istream&& stream)\n{\n    return input_stream_adapter(stream);\n}\n\nusing contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));\n\n// Null-delimited strings, and the like.\ntemplate < typename CharT,\n           typename std::enable_if <\n               std::is_pointer<CharT>::value&&\n               !std::is_array<CharT>::value&&\n               std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n               sizeof(typename std::remove_pointer<CharT>::type) == 1,\n               int >::type = 0 >\ncontiguous_bytes_input_adapter input_adapter(CharT b)\n{\n    auto length = std::strlen(reinterpret_cast<const char*>(b));\n    const auto* ptr = reinterpret_cast<const char*>(b);\n    return input_adapter(ptr, ptr + length);\n}\n\ntemplate<typename T, std::size_t N>\nauto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N))\n{\n    return input_adapter(array, array + N);\n}\n\n// This class only handles inputs of input_buffer_adapter type.\n// It's required so that expressions like {ptr, len} can be implicitely casted\n// to the correct adapter.\nclass span_input_adapter\n{\n  public:\n    template < typename CharT,\n               typename std::enable_if <\n                   std::is_pointer<CharT>::value&&\n                   std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n                   sizeof(typename std::remove_pointer<CharT>::type) == 1,\n                   int >::type = 0 >\n    span_input_adapter(CharT b, std::size_t l)\n        : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}\n\n    template<class IteratorType,\n             typename std::enable_if<\n                 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,\n                 int>::type = 0>\n    span_input_adapter(IteratorType first, IteratorType last)\n        : ia(input_adapter(first, last)) {}\n\n    contiguous_bytes_input_adapter&& get()\n    {\n        return std::move(ia);\n    }\n\n  private:\n    contiguous_bytes_input_adapter ia;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/json_sax.hpp>\n\n\n#include <cstddef>\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\n\n/*!\n@brief SAX interface\n\nThis class describes the SAX interface used by @ref nlohmann::json::sax_parse.\nEach function is called in different situations while the input is parsed. The\nboolean return value informs the parser whether to continue processing the\ninput.\n*/\ntemplate<typename BasicJsonType>\nstruct json_sax\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    /*!\n    @brief a null value was read\n    @return whether parsing should proceed\n    */\n    virtual bool null() = 0;\n\n    /*!\n    @brief a boolean value was read\n    @param[in] val  boolean value\n    @return whether parsing should proceed\n    */\n    virtual bool boolean(bool val) = 0;\n\n    /*!\n    @brief an integer number was read\n    @param[in] val  integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_integer(number_integer_t val) = 0;\n\n    /*!\n    @brief an unsigned integer number was read\n    @param[in] val  unsigned integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_unsigned(number_unsigned_t val) = 0;\n\n    /*!\n    @brief an floating-point number was read\n    @param[in] val  floating-point value\n    @param[in] s    raw token value\n    @return whether parsing should proceed\n    */\n    virtual bool number_float(number_float_t val, const string_t& s) = 0;\n\n    /*!\n    @brief a string was read\n    @param[in] val  string value\n    @return whether parsing should proceed\n    @note It is safe to move the passed string.\n    */\n    virtual bool string(string_t& val) = 0;\n\n    /*!\n    @brief a binary string was read\n    @param[in] val  binary value\n    @return whether parsing should proceed\n    @note It is safe to move the passed binary.\n    */\n    virtual bool binary(binary_t& val) = 0;\n\n    /*!\n    @brief the beginning of an object was read\n    @param[in] elements  number of object elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_object(std::size_t elements) = 0;\n\n    /*!\n    @brief an object key was read\n    @param[in] val  object key\n    @return whether parsing should proceed\n    @note It is safe to move the passed string.\n    */\n    virtual bool key(string_t& val) = 0;\n\n    /*!\n    @brief the end of an object was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_object() = 0;\n\n    /*!\n    @brief the beginning of an array was read\n    @param[in] elements  number of array elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_array(std::size_t elements) = 0;\n\n    /*!\n    @brief the end of an array was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_array() = 0;\n\n    /*!\n    @brief a parse error occurred\n    @param[in] position    the position in the input where the error occurs\n    @param[in] last_token  the last read token\n    @param[in] ex          an exception object describing the error\n    @return whether parsing should proceed (must return false)\n    */\n    virtual bool parse_error(std::size_t position,\n                             const std::string& last_token,\n                             const detail::exception& ex) = 0;\n\n    virtual ~json_sax() = default;\n};\n\n\nnamespace detail\n{\n/*!\n@brief SAX implementation to create a JSON value from SAX events\n\nThis class implements the @ref json_sax interface and processes the SAX events\nto create a JSON value which makes it basically a DOM parser. The structure or\nhierarchy of the JSON value is managed by the stack `ref_stack` which contains\na pointer to the respective array or object for each recursion depth.\n\nAfter successful parsing, the value that is passed by reference to the\nconstructor contains the parsed value.\n\n@tparam BasicJsonType  the JSON type\n*/\ntemplate<typename BasicJsonType>\nclass json_sax_dom_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    /*!\n    @param[in, out] r  reference to a JSON value that is manipulated while\n                       parsing\n    @param[in] allow_exceptions_  whether parse errors yield exceptions\n    */\n    explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true)\n        : root(r), allow_exceptions(allow_exceptions_)\n    {}\n\n    // make class move-only\n    json_sax_dom_parser(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser(json_sax_dom_parser&&) = default;\n    json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;\n    ~json_sax_dom_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::object));\n\n        if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408,\n                                            \"excessive object size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        // add null at given key and store the reference for later\n        object_element = &(ref_stack.back()->m_value.object->operator[](val));\n        return true;\n    }\n\n    bool end_object()\n    {\n        ref_stack.pop_back();\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::array));\n\n        if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408,\n                                            \"excessive array size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        ref_stack.pop_back();\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n    /*!\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n    */\n    template<typename Value>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    BasicJsonType* handle_value(Value&& v)\n    {\n        if (ref_stack.empty())\n        {\n            root = BasicJsonType(std::forward<Value>(v));\n            return &root;\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));\n            return &(ref_stack.back()->m_value.array->back());\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_object());\n        JSON_ASSERT(object_element);\n        *object_element = BasicJsonType(std::forward<Value>(v));\n        return object_element;\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n};\n\ntemplate<typename BasicJsonType>\nclass json_sax_dom_callback_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using parser_callback_t = typename BasicJsonType::parser_callback_t;\n    using parse_event_t = typename BasicJsonType::parse_event_t;\n\n    json_sax_dom_callback_parser(BasicJsonType& r,\n                                 const parser_callback_t cb,\n                                 const bool allow_exceptions_ = true)\n        : root(r), callback(cb), allow_exceptions(allow_exceptions_)\n    {\n        keep_stack.push_back(true);\n    }\n\n    // make class move-only\n    json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default;\n    json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default;\n    ~json_sax_dom_callback_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        // check callback for object start\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::object, true);\n        ref_stack.push_back(val.second);\n\n        // check object limit\n        if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, \"excessive object size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        BasicJsonType k = BasicJsonType(val);\n\n        // check callback for key\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);\n        key_keep_stack.push_back(keep);\n\n        // add discarded value at given key and store the reference for later\n        if (keep && ref_stack.back())\n        {\n            object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded);\n        }\n\n        return true;\n    }\n\n    bool end_object()\n    {\n        if (ref_stack.back() && !callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))\n        {\n            // discard object\n            *ref_stack.back() = discarded;\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())\n        {\n            // remove discarded value\n            for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)\n            {\n                if (it->is_discarded())\n                {\n                    ref_stack.back()->erase(it);\n                    break;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::array, true);\n        ref_stack.push_back(val.second);\n\n        // check array limit\n        if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, \"excessive array size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        bool keep = true;\n\n        if (ref_stack.back())\n        {\n            keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());\n            if (!keep)\n            {\n                // discard array\n                *ref_stack.back() = discarded;\n            }\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        // remove discarded value\n        if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->pop_back();\n        }\n\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n    /*!\n    @param[in] v  value to add to the JSON value we build during parsing\n    @param[in] skip_callback  whether we should skip calling the callback\n               function; this is required after start_array() and\n               start_object() SAX events, because otherwise we would call the\n               callback function with an empty array or object, respectively.\n\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n\n    @return pair of boolean (whether value should be kept) and pointer (to the\n            passed value in the ref_stack hierarchy; nullptr if not kept)\n    */\n    template<typename Value>\n    std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)\n    {\n        JSON_ASSERT(!keep_stack.empty());\n\n        // do not handle this value if we know it would be added to a discarded\n        // container\n        if (!keep_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // create value\n        auto value = BasicJsonType(std::forward<Value>(v));\n\n        // check callback\n        const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);\n\n        // do not handle this value if we just learnt it shall be discarded\n        if (!keep)\n        {\n            return {false, nullptr};\n        }\n\n        if (ref_stack.empty())\n        {\n            root = std::move(value);\n            return {true, &root};\n        }\n\n        // skip this value if we already decided to skip the parent\n        // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)\n        if (!ref_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // we now only expect arrays and objects\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        // array\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->push_back(std::move(value));\n            return {true, &(ref_stack.back()->m_value.array->back())};\n        }\n\n        // object\n        JSON_ASSERT(ref_stack.back()->is_object());\n        // check if we should store an element for the current key\n        JSON_ASSERT(!key_keep_stack.empty());\n        const bool store_element = key_keep_stack.back();\n        key_keep_stack.pop_back();\n\n        if (!store_element)\n        {\n            return {false, nullptr};\n        }\n\n        JSON_ASSERT(object_element);\n        *object_element = std::move(value);\n        return {true, object_element};\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// stack to manage which values to keep\n    std::vector<bool> keep_stack {};\n    /// stack to manage which object keys to keep\n    std::vector<bool> key_keep_stack {};\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// callback function\n    const parser_callback_t callback = nullptr;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n    /// a discarded value for the callback\n    BasicJsonType discarded = BasicJsonType::value_t::discarded;\n};\n\ntemplate<typename BasicJsonType>\nclass json_sax_acceptor\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    bool null()\n    {\n        return true;\n    }\n\n    bool boolean(bool /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_integer(number_integer_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_float(number_float_t /*unused*/, const string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool string(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool binary(binary_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool start_object(std::size_t /*unused*/ = std::size_t(-1))\n    {\n        return true;\n    }\n\n    bool key(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool end_object()\n    {\n        return true;\n    }\n\n    bool start_array(std::size_t /*unused*/ = std::size_t(-1))\n    {\n        return true;\n    }\n\n    bool end_array()\n    {\n        return true;\n    }\n\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/)\n    {\n        return false;\n    }\n};\n}  // namespace detail\n\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n\n#include <array> // array\n#include <clocale> // localeconv\n#include <cstddef> // size_t\n#include <cstdio> // snprintf\n#include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull\n#include <initializer_list> // initializer_list\n#include <string> // char_traits, string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/position_t.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////\n// lexer //\n///////////\n\ntemplate<typename BasicJsonType>\nclass lexer_base\n{\n  public:\n    /// token types for the parser\n    enum class token_type\n    {\n        uninitialized,    ///< indicating the scanner is uninitialized\n        literal_true,     ///< the `true` literal\n        literal_false,    ///< the `false` literal\n        literal_null,     ///< the `null` literal\n        value_string,     ///< a string -- use get_string() for actual value\n        value_unsigned,   ///< an unsigned integer -- use get_number_unsigned() for actual value\n        value_integer,    ///< a signed integer -- use get_number_integer() for actual value\n        value_float,      ///< an floating point number -- use get_number_float() for actual value\n        begin_array,      ///< the character for array begin `[`\n        begin_object,     ///< the character for object begin `{`\n        end_array,        ///< the character for array end `]`\n        end_object,       ///< the character for object end `}`\n        name_separator,   ///< the name separator `:`\n        value_separator,  ///< the value separator `,`\n        parse_error,      ///< indicating a parse error\n        end_of_input,     ///< indicating the end of the input buffer\n        literal_or_value  ///< a literal or the begin of a value (only for diagnostics)\n    };\n\n    /// return name of values of type token_type (only used for errors)\n    JSON_HEDLEY_RETURNS_NON_NULL\n    JSON_HEDLEY_CONST\n    static const char* token_type_name(const token_type t) noexcept\n    {\n        switch (t)\n        {\n            case token_type::uninitialized:\n                return \"<uninitialized>\";\n            case token_type::literal_true:\n                return \"true literal\";\n            case token_type::literal_false:\n                return \"false literal\";\n            case token_type::literal_null:\n                return \"null literal\";\n            case token_type::value_string:\n                return \"string literal\";\n            case token_type::value_unsigned:\n            case token_type::value_integer:\n            case token_type::value_float:\n                return \"number literal\";\n            case token_type::begin_array:\n                return \"'['\";\n            case token_type::begin_object:\n                return \"'{'\";\n            case token_type::end_array:\n                return \"']'\";\n            case token_type::end_object:\n                return \"'}'\";\n            case token_type::name_separator:\n                return \"':'\";\n            case token_type::value_separator:\n                return \"','\";\n            case token_type::parse_error:\n                return \"<parse error>\";\n            case token_type::end_of_input:\n                return \"end of input\";\n            case token_type::literal_or_value:\n                return \"'[', '{', or a literal\";\n            // LCOV_EXCL_START\n            default: // catch non-enum values\n                return \"unknown token\";\n                // LCOV_EXCL_STOP\n        }\n    }\n};\n/*!\n@brief lexical analysis\n\nThis class organizes the lexical analysis during JSON deserialization.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass lexer : public lexer_base<BasicJsonType>\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename std::char_traits<char_type>::int_type;\n\n  public:\n    using token_type = typename lexer_base<BasicJsonType>::token_type;\n\n    explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false)\n        : ia(std::move(adapter))\n        , ignore_comments(ignore_comments_)\n        , decimal_point_char(static_cast<char_int_type>(get_decimal_point()))\n    {}\n\n    // delete because of pointer members\n    lexer(const lexer&) = delete;\n    lexer(lexer&&) = default;\n    lexer& operator=(lexer&) = delete;\n    lexer& operator=(lexer&&) = default;\n    ~lexer() = default;\n\n  private:\n    /////////////////////\n    // locales\n    /////////////////////\n\n    /// return the locale-dependent decimal point\n    JSON_HEDLEY_PURE\n    static char get_decimal_point() noexcept\n    {\n        const auto* loc = localeconv();\n        JSON_ASSERT(loc != nullptr);\n        return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point);\n    }\n\n    /////////////////////\n    // scan functions\n    /////////////////////\n\n    /*!\n    @brief get codepoint from 4 hex characters following `\\u`\n\n    For input \"\\u c1 c2 c3 c4\" the codepoint is:\n      (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4\n    = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0)\n\n    Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f'\n    must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The\n    conversion is done by subtracting the offset (0x30, 0x37, and 0x57)\n    between the ASCII value of the character and the desired integer value.\n\n    @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or\n            non-hex character)\n    */\n    int get_codepoint()\n    {\n        // this function only makes sense after reading `\\u`\n        JSON_ASSERT(current == 'u');\n        int codepoint = 0;\n\n        const auto factors = { 12u, 8u, 4u, 0u };\n        for (const auto factor : factors)\n        {\n            get();\n\n            if (current >= '0' && current <= '9')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor);\n            }\n            else if (current >= 'A' && current <= 'F')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor);\n            }\n            else if (current >= 'a' && current <= 'f')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor);\n            }\n            else\n            {\n                return -1;\n            }\n        }\n\n        JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);\n        return codepoint;\n    }\n\n    /*!\n    @brief check if the next byte(s) are inside a given range\n\n    Adds the current byte and, for each passed range, reads a new byte and\n    checks if it is inside the range. If a violation was detected, set up an\n    error message and return false. Otherwise, return true.\n\n    @param[in] ranges  list of integers; interpreted as list of pairs of\n                       inclusive lower and upper bound, respectively\n\n    @pre The passed list @a ranges must have 2, 4, or 6 elements; that is,\n         1, 2, or 3 pairs. This precondition is enforced by an assertion.\n\n    @return true if and only if no range violation was detected\n    */\n    bool next_byte_in_range(std::initializer_list<char_int_type> ranges)\n    {\n        JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);\n        add(current);\n\n        for (auto range = ranges.begin(); range != ranges.end(); ++range)\n        {\n            get();\n            if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range)))\n            {\n                add(current);\n            }\n            else\n            {\n                error_message = \"invalid string: ill-formed UTF-8 byte\";\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief scan a string literal\n\n    This function scans a string according to Sect. 7 of RFC 7159. While\n    scanning, bytes are escaped and copied into buffer token_buffer. Then the\n    function returns successfully, token_buffer is *not* null-terminated (as it\n    may contain \\0 bytes), and token_buffer.size() is the number of bytes in the\n    string.\n\n    @return token_type::value_string if string could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note In case of errors, variable error_message contains a textual\n          description.\n    */\n    token_type scan_string()\n    {\n        // reset token_buffer (ignore opening quote)\n        reset();\n\n        // we entered the function by reading an open quote\n        JSON_ASSERT(current == '\\\"');\n\n        while (true)\n        {\n            // get next character\n            switch (get())\n            {\n                // end of file while parsing string\n                case std::char_traits<char_type>::eof():\n                {\n                    error_message = \"invalid string: missing closing quote\";\n                    return token_type::parse_error;\n                }\n\n                // closing quote\n                case '\\\"':\n                {\n                    return token_type::value_string;\n                }\n\n                // escapes\n                case '\\\\':\n                {\n                    switch (get())\n                    {\n                        // quotation mark\n                        case '\\\"':\n                            add('\\\"');\n                            break;\n                        // reverse solidus\n                        case '\\\\':\n                            add('\\\\');\n                            break;\n                        // solidus\n                        case '/':\n                            add('/');\n                            break;\n                        // backspace\n                        case 'b':\n                            add('\\b');\n                            break;\n                        // form feed\n                        case 'f':\n                            add('\\f');\n                            break;\n                        // line feed\n                        case 'n':\n                            add('\\n');\n                            break;\n                        // carriage return\n                        case 'r':\n                            add('\\r');\n                            break;\n                        // tab\n                        case 't':\n                            add('\\t');\n                            break;\n\n                        // unicode escapes\n                        case 'u':\n                        {\n                            const int codepoint1 = get_codepoint();\n                            int codepoint = codepoint1; // start with codepoint1\n\n                            if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1))\n                            {\n                                error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                return token_type::parse_error;\n                            }\n\n                            // check if code point is a high surrogate\n                            if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)\n                            {\n                                // expect next \\uxxxx entry\n                                if (JSON_HEDLEY_LIKELY(get() == '\\\\' && get() == 'u'))\n                                {\n                                    const int codepoint2 = get_codepoint();\n\n                                    if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1))\n                                    {\n                                        error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                        return token_type::parse_error;\n                                    }\n\n                                    // check if codepoint2 is a low surrogate\n                                    if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF))\n                                    {\n                                        // overwrite codepoint\n                                        codepoint = static_cast<int>(\n                                                        // high surrogate occupies the most significant 22 bits\n                                                        (static_cast<unsigned int>(codepoint1) << 10u)\n                                                        // low surrogate occupies the least significant 15 bits\n                                                        + static_cast<unsigned int>(codepoint2)\n                                                        // there is still the 0xD800, 0xDC00 and 0x10000 noise\n                                                        // in the result so we have to subtract with:\n                                                        // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00\n                                                        - 0x35FDC00u);\n                                    }\n                                    else\n                                    {\n                                        error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                        return token_type::parse_error;\n                                    }\n                                }\n                                else\n                                {\n                                    error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n                            else\n                            {\n                                if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF))\n                                {\n                                    error_message = \"invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n\n                            // result of the above calculation yields a proper codepoint\n                            JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);\n\n                            // translate codepoint into bytes\n                            if (codepoint < 0x80)\n                            {\n                                // 1-byte characters: 0xxxxxxx (ASCII)\n                                add(static_cast<char_int_type>(codepoint));\n                            }\n                            else if (codepoint <= 0x7FF)\n                            {\n                                // 2-byte characters: 110xxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else if (codepoint <= 0xFFFF)\n                            {\n                                // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else\n                            {\n                                // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n\n                            break;\n                        }\n\n                        // other characters after escape\n                        default:\n                            error_message = \"invalid string: forbidden character after backslash\";\n                            return token_type::parse_error;\n                    }\n\n                    break;\n                }\n\n                // invalid control characters\n                case 0x00:\n                {\n                    error_message = \"invalid string: control character U+0000 (NUL) must be escaped to \\\\u0000\";\n                    return token_type::parse_error;\n                }\n\n                case 0x01:\n                {\n                    error_message = \"invalid string: control character U+0001 (SOH) must be escaped to \\\\u0001\";\n                    return token_type::parse_error;\n                }\n\n                case 0x02:\n                {\n                    error_message = \"invalid string: control character U+0002 (STX) must be escaped to \\\\u0002\";\n                    return token_type::parse_error;\n                }\n\n                case 0x03:\n                {\n                    error_message = \"invalid string: control character U+0003 (ETX) must be escaped to \\\\u0003\";\n                    return token_type::parse_error;\n                }\n\n                case 0x04:\n                {\n                    error_message = \"invalid string: control character U+0004 (EOT) must be escaped to \\\\u0004\";\n                    return token_type::parse_error;\n                }\n\n                case 0x05:\n                {\n                    error_message = \"invalid string: control character U+0005 (ENQ) must be escaped to \\\\u0005\";\n                    return token_type::parse_error;\n                }\n\n                case 0x06:\n                {\n                    error_message = \"invalid string: control character U+0006 (ACK) must be escaped to \\\\u0006\";\n                    return token_type::parse_error;\n                }\n\n                case 0x07:\n                {\n                    error_message = \"invalid string: control character U+0007 (BEL) must be escaped to \\\\u0007\";\n                    return token_type::parse_error;\n                }\n\n                case 0x08:\n                {\n                    error_message = \"invalid string: control character U+0008 (BS) must be escaped to \\\\u0008 or \\\\b\";\n                    return token_type::parse_error;\n                }\n\n                case 0x09:\n                {\n                    error_message = \"invalid string: control character U+0009 (HT) must be escaped to \\\\u0009 or \\\\t\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0A:\n                {\n                    error_message = \"invalid string: control character U+000A (LF) must be escaped to \\\\u000A or \\\\n\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0B:\n                {\n                    error_message = \"invalid string: control character U+000B (VT) must be escaped to \\\\u000B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0C:\n                {\n                    error_message = \"invalid string: control character U+000C (FF) must be escaped to \\\\u000C or \\\\f\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0D:\n                {\n                    error_message = \"invalid string: control character U+000D (CR) must be escaped to \\\\u000D or \\\\r\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0E:\n                {\n                    error_message = \"invalid string: control character U+000E (SO) must be escaped to \\\\u000E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0F:\n                {\n                    error_message = \"invalid string: control character U+000F (SI) must be escaped to \\\\u000F\";\n                    return token_type::parse_error;\n                }\n\n                case 0x10:\n                {\n                    error_message = \"invalid string: control character U+0010 (DLE) must be escaped to \\\\u0010\";\n                    return token_type::parse_error;\n                }\n\n                case 0x11:\n                {\n                    error_message = \"invalid string: control character U+0011 (DC1) must be escaped to \\\\u0011\";\n                    return token_type::parse_error;\n                }\n\n                case 0x12:\n                {\n                    error_message = \"invalid string: control character U+0012 (DC2) must be escaped to \\\\u0012\";\n                    return token_type::parse_error;\n                }\n\n                case 0x13:\n                {\n                    error_message = \"invalid string: control character U+0013 (DC3) must be escaped to \\\\u0013\";\n                    return token_type::parse_error;\n                }\n\n                case 0x14:\n                {\n                    error_message = \"invalid string: control character U+0014 (DC4) must be escaped to \\\\u0014\";\n                    return token_type::parse_error;\n                }\n\n                case 0x15:\n                {\n                    error_message = \"invalid string: control character U+0015 (NAK) must be escaped to \\\\u0015\";\n                    return token_type::parse_error;\n                }\n\n                case 0x16:\n                {\n                    error_message = \"invalid string: control character U+0016 (SYN) must be escaped to \\\\u0016\";\n                    return token_type::parse_error;\n                }\n\n                case 0x17:\n                {\n                    error_message = \"invalid string: control character U+0017 (ETB) must be escaped to \\\\u0017\";\n                    return token_type::parse_error;\n                }\n\n                case 0x18:\n                {\n                    error_message = \"invalid string: control character U+0018 (CAN) must be escaped to \\\\u0018\";\n                    return token_type::parse_error;\n                }\n\n                case 0x19:\n                {\n                    error_message = \"invalid string: control character U+0019 (EM) must be escaped to \\\\u0019\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1A:\n                {\n                    error_message = \"invalid string: control character U+001A (SUB) must be escaped to \\\\u001A\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1B:\n                {\n                    error_message = \"invalid string: control character U+001B (ESC) must be escaped to \\\\u001B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1C:\n                {\n                    error_message = \"invalid string: control character U+001C (FS) must be escaped to \\\\u001C\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1D:\n                {\n                    error_message = \"invalid string: control character U+001D (GS) must be escaped to \\\\u001D\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1E:\n                {\n                    error_message = \"invalid string: control character U+001E (RS) must be escaped to \\\\u001E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1F:\n                {\n                    error_message = \"invalid string: control character U+001F (US) must be escaped to \\\\u001F\";\n                    return token_type::parse_error;\n                }\n\n                // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace))\n                case 0x20:\n                case 0x21:\n                case 0x23:\n                case 0x24:\n                case 0x25:\n                case 0x26:\n                case 0x27:\n                case 0x28:\n                case 0x29:\n                case 0x2A:\n                case 0x2B:\n                case 0x2C:\n                case 0x2D:\n                case 0x2E:\n                case 0x2F:\n                case 0x30:\n                case 0x31:\n                case 0x32:\n                case 0x33:\n                case 0x34:\n                case 0x35:\n                case 0x36:\n                case 0x37:\n                case 0x38:\n                case 0x39:\n                case 0x3A:\n                case 0x3B:\n                case 0x3C:\n                case 0x3D:\n                case 0x3E:\n                case 0x3F:\n                case 0x40:\n                case 0x41:\n                case 0x42:\n                case 0x43:\n                case 0x44:\n                case 0x45:\n                case 0x46:\n                case 0x47:\n                case 0x48:\n                case 0x49:\n                case 0x4A:\n                case 0x4B:\n                case 0x4C:\n                case 0x4D:\n                case 0x4E:\n                case 0x4F:\n                case 0x50:\n                case 0x51:\n                case 0x52:\n                case 0x53:\n                case 0x54:\n                case 0x55:\n                case 0x56:\n                case 0x57:\n                case 0x58:\n                case 0x59:\n                case 0x5A:\n                case 0x5B:\n                case 0x5D:\n                case 0x5E:\n                case 0x5F:\n                case 0x60:\n                case 0x61:\n                case 0x62:\n                case 0x63:\n                case 0x64:\n                case 0x65:\n                case 0x66:\n                case 0x67:\n                case 0x68:\n                case 0x69:\n                case 0x6A:\n                case 0x6B:\n                case 0x6C:\n                case 0x6D:\n                case 0x6E:\n                case 0x6F:\n                case 0x70:\n                case 0x71:\n                case 0x72:\n                case 0x73:\n                case 0x74:\n                case 0x75:\n                case 0x76:\n                case 0x77:\n                case 0x78:\n                case 0x79:\n                case 0x7A:\n                case 0x7B:\n                case 0x7C:\n                case 0x7D:\n                case 0x7E:\n                case 0x7F:\n                {\n                    add(current);\n                    break;\n                }\n\n                // U+0080..U+07FF: bytes C2..DF 80..BF\n                case 0xC2:\n                case 0xC3:\n                case 0xC4:\n                case 0xC5:\n                case 0xC6:\n                case 0xC7:\n                case 0xC8:\n                case 0xC9:\n                case 0xCA:\n                case 0xCB:\n                case 0xCC:\n                case 0xCD:\n                case 0xCE:\n                case 0xCF:\n                case 0xD0:\n                case 0xD1:\n                case 0xD2:\n                case 0xD3:\n                case 0xD4:\n                case 0xD5:\n                case 0xD6:\n                case 0xD7:\n                case 0xD8:\n                case 0xD9:\n                case 0xDA:\n                case 0xDB:\n                case 0xDC:\n                case 0xDD:\n                case 0xDE:\n                case 0xDF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF})))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+0800..U+0FFF: bytes E0 A0..BF 80..BF\n                case 0xE0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF\n                // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF\n                case 0xE1:\n                case 0xE2:\n                case 0xE3:\n                case 0xE4:\n                case 0xE5:\n                case 0xE6:\n                case 0xE7:\n                case 0xE8:\n                case 0xE9:\n                case 0xEA:\n                case 0xEB:\n                case 0xEC:\n                case 0xEE:\n                case 0xEF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+D000..U+D7FF: bytes ED 80..9F 80..BF\n                case 0xED:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF\n                case 0xF0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF\n                case 0xF1:\n                case 0xF2:\n                case 0xF3:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF\n                case 0xF4:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // remaining bytes (80..C1 and F5..FF) are ill-formed\n                default:\n                {\n                    error_message = \"invalid string: ill-formed UTF-8 byte\";\n                    return token_type::parse_error;\n                }\n            }\n        }\n    }\n\n    /*!\n     * @brief scan a comment\n     * @return whether comment could be scanned successfully\n     */\n    bool scan_comment()\n    {\n        switch (get())\n        {\n            // single-line comments skip input until a newline or EOF is read\n            case '/':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case '\\n':\n                        case '\\r':\n                        case std::char_traits<char_type>::eof():\n                        case '\\0':\n                            return true;\n\n                        default:\n                            break;\n                    }\n                }\n            }\n\n            // multi-line comments skip input until */ is read\n            case '*':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case std::char_traits<char_type>::eof():\n                        case '\\0':\n                        {\n                            error_message = \"invalid comment; missing closing '*/'\";\n                            return false;\n                        }\n\n                        case '*':\n                        {\n                            switch (get())\n                            {\n                                case '/':\n                                    return true;\n\n                                default:\n                                {\n                                    unget();\n                                    continue;\n                                }\n                            }\n                        }\n\n                        default:\n                            continue;\n                    }\n                }\n            }\n\n            // unexpected character after reading '/'\n            default:\n            {\n                error_message = \"invalid comment; expecting '/' or '*' after '/'\";\n                return false;\n            }\n        }\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(float& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtof(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtod(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(long double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtold(str, endptr);\n    }\n\n    /*!\n    @brief scan a number literal\n\n    This function scans a string according to Sect. 6 of RFC 7159.\n\n    The function is realized with a deterministic finite state machine derived\n    from the grammar described in RFC 7159. Starting in state \"init\", the\n    input is read and used to determined the next state. Only state \"done\"\n    accepts the number. State \"error\" is a trap state to model errors. In the\n    table below, \"anything\" means any character but the ones listed before.\n\n    state    | 0        | 1-9      | e E      | +       | -       | .        | anything\n    ---------|----------|----------|----------|---------|---------|----------|-----------\n    init     | zero     | any1     | [error]  | [error] | minus   | [error]  | [error]\n    minus    | zero     | any1     | [error]  | [error] | [error] | [error]  | [error]\n    zero     | done     | done     | exponent | done    | done    | decimal1 | done\n    any1     | any1     | any1     | exponent | done    | done    | decimal1 | done\n    decimal1 | decimal2 | decimal2 | [error]  | [error] | [error] | [error]  | [error]\n    decimal2 | decimal2 | decimal2 | exponent | done    | done    | done     | done\n    exponent | any2     | any2     | [error]  | sign    | sign    | [error]  | [error]\n    sign     | any2     | any2     | [error]  | [error] | [error] | [error]  | [error]\n    any2     | any2     | any2     | done     | done    | done    | done     | done\n\n    The state machine is realized with one label per state (prefixed with\n    \"scan_number_\") and `goto` statements between them. The state machine\n    contains cycles, but any cycle can be left when EOF is read. Therefore,\n    the function is guaranteed to terminate.\n\n    During scanning, the read bytes are stored in token_buffer. This string is\n    then converted to a signed integer, an unsigned integer, or a\n    floating-point number.\n\n    @return token_type::value_unsigned, token_type::value_integer, or\n            token_type::value_float if number could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note The scanner is independent of the current locale. Internally, the\n          locale's decimal point is used instead of `.` to work with the\n          locale-dependent converters.\n    */\n    token_type scan_number()  // lgtm [cpp/use-of-goto]\n    {\n        // reset token_buffer to store the number's bytes\n        reset();\n\n        // the type of the parsed number; initially set to unsigned; will be\n        // changed if minus sign, decimal point or exponent is read\n        token_type number_type = token_type::value_unsigned;\n\n        // state (init): we just found out we need to scan a number\n        switch (current)\n        {\n            case '-':\n            {\n                add(current);\n                goto scan_number_minus;\n            }\n\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\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            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            // all other characters are rejected outside scan_number()\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\nscan_number_minus:\n        // state: we just parsed a leading minus sign\n        number_type = token_type::value_integer;\n        switch (get())\n        {\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\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            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '-'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_zero:\n        // state: we just parse a zero (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '.':\n            {\n                add(decimal_point_char);\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_any1:\n        // state: we just parsed a number 0-9 (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '0':\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            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            case '.':\n            {\n                add(decimal_point_char);\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_decimal1:\n        // state: we just parsed a decimal point\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '0':\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            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '.'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_decimal2:\n        // we just parsed at least one number after a decimal point\n        switch (get())\n        {\n            case '0':\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            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_exponent:\n        // we just parsed an exponent\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '+':\n            case '-':\n            {\n                add(current);\n                goto scan_number_sign;\n            }\n\n            case '0':\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            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message =\n                    \"invalid number; expected '+', '-', or digit after exponent\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_sign:\n        // we just parsed an exponent sign\n        switch (get())\n        {\n            case '0':\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            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after exponent sign\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_any2:\n        // we just parsed a number after the exponent or exponent sign\n        switch (get())\n        {\n            case '0':\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            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_done:\n        // unget the character after the number (we only read it to know that\n        // we are done scanning a number)\n        unget();\n\n        char* endptr = nullptr;\n        errno = 0;\n\n        // try to parse integers first and fall back to floats\n        if (number_type == token_type::value_unsigned)\n        {\n            const auto x = std::strtoull(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno == 0)\n            {\n                value_unsigned = static_cast<number_unsigned_t>(x);\n                if (value_unsigned == x)\n                {\n                    return token_type::value_unsigned;\n                }\n            }\n        }\n        else if (number_type == token_type::value_integer)\n        {\n            const auto x = std::strtoll(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno == 0)\n            {\n                value_integer = static_cast<number_integer_t>(x);\n                if (value_integer == x)\n                {\n                    return token_type::value_integer;\n                }\n            }\n        }\n\n        // this code is reached if we parse a floating-point number or if an\n        // integer conversion above failed\n        strtof(value_float, token_buffer.data(), &endptr);\n\n        // we checked the number format before\n        JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n        return token_type::value_float;\n    }\n\n    /*!\n    @param[in] literal_text  the literal text to expect\n    @param[in] length        the length of the passed literal text\n    @param[in] return_type   the token type to return on success\n    */\n    JSON_HEDLEY_NON_NULL(2)\n    token_type scan_literal(const char_type* literal_text, const std::size_t length,\n                            token_type return_type)\n    {\n        JSON_ASSERT(std::char_traits<char_type>::to_char_type(current) == literal_text[0]);\n        for (std::size_t i = 1; i < length; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i]))\n            {\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n            }\n        }\n        return return_type;\n    }\n\n    /////////////////////\n    // input management\n    /////////////////////\n\n    /// reset token_buffer; current character is beginning of token\n    void reset() noexcept\n    {\n        token_buffer.clear();\n        token_string.clear();\n        token_string.push_back(std::char_traits<char_type>::to_char_type(current));\n    }\n\n    /*\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a\n    `std::char_traits<char>::eof()` in that case.  Stores the scanned characters\n    for use in error messages.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++position.chars_read_total;\n        ++position.chars_read_current_line;\n\n        if (next_unget)\n        {\n            // just reset the next_unget variable and work with current\n            next_unget = false;\n        }\n        else\n        {\n            current = ia.get_character();\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))\n        {\n            token_string.push_back(std::char_traits<char_type>::to_char_type(current));\n        }\n\n        if (current == '\\n')\n        {\n            ++position.lines_read;\n            position.chars_read_current_line = 0;\n        }\n\n        return current;\n    }\n\n    /*!\n    @brief unget current character (read it again on next get)\n\n    We implement unget by setting variable next_unget to true. The input is not\n    changed - we just simulate ungetting by modifying chars_read_total,\n    chars_read_current_line, and token_string. The next call to get() will\n    behave as if the unget character is read again.\n    */\n    void unget()\n    {\n        next_unget = true;\n\n        --position.chars_read_total;\n\n        // in case we \"unget\" a newline, we have to also decrement the lines_read\n        if (position.chars_read_current_line == 0)\n        {\n            if (position.lines_read > 0)\n            {\n                --position.lines_read;\n            }\n        }\n        else\n        {\n            --position.chars_read_current_line;\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))\n        {\n            JSON_ASSERT(!token_string.empty());\n            token_string.pop_back();\n        }\n    }\n\n    /// add a character to token_buffer\n    void add(char_int_type c)\n    {\n        token_buffer.push_back(static_cast<typename string_t::value_type>(c));\n    }\n\n  public:\n    /////////////////////\n    // value getters\n    /////////////////////\n\n    /// return integer value\n    constexpr number_integer_t get_number_integer() const noexcept\n    {\n        return value_integer;\n    }\n\n    /// return unsigned integer value\n    constexpr number_unsigned_t get_number_unsigned() const noexcept\n    {\n        return value_unsigned;\n    }\n\n    /// return floating-point value\n    constexpr number_float_t get_number_float() const noexcept\n    {\n        return value_float;\n    }\n\n    /// return current string value (implicitly resets the token; useful only once)\n    string_t& get_string()\n    {\n        return token_buffer;\n    }\n\n    /////////////////////\n    // diagnostics\n    /////////////////////\n\n    /// return position of last read token\n    constexpr position_t get_position() const noexcept\n    {\n        return position;\n    }\n\n    /// return the last read token (for errors only).  Will never contain EOF\n    /// (an arbitrary value that is not a valid char value, often -1), because\n    /// 255 may legitimately occur.  May contain NUL, which should be escaped.\n    std::string get_token_string() const\n    {\n        // escape control characters\n        std::string result;\n        for (const auto c : token_string)\n        {\n            if (static_cast<unsigned char>(c) <= '\\x1F')\n            {\n                // escape control characters\n                std::array<char, 9> cs{{}};\n                (std::snprintf)(cs.data(), cs.size(), \"<U+%.4X>\", static_cast<unsigned char>(c));\n                result += cs.data();\n            }\n            else\n            {\n                // add character as is\n                result.push_back(static_cast<std::string::value_type>(c));\n            }\n        }\n\n        return result;\n    }\n\n    /// return syntax error message\n    JSON_HEDLEY_RETURNS_NON_NULL\n    constexpr const char* get_error_message() const noexcept\n    {\n        return error_message;\n    }\n\n    /////////////////////\n    // actual scanner\n    /////////////////////\n\n    /*!\n    @brief skip the UTF-8 byte order mark\n    @return true iff there is no BOM or the correct BOM has been skipped\n    */\n    bool skip_bom()\n    {\n        if (get() == 0xEF)\n        {\n            // check if we completely parse the BOM\n            return get() == 0xBB && get() == 0xBF;\n        }\n\n        // the first character is not the beginning of the BOM; unget it to\n        // process is later\n        unget();\n        return true;\n    }\n\n    void skip_whitespace()\n    {\n        do\n        {\n            get();\n        }\n        while (current == ' ' || current == '\\t' || current == '\\n' || current == '\\r');\n    }\n\n    token_type scan()\n    {\n        // initially, skip the BOM\n        if (position.chars_read_total == 0 && !skip_bom())\n        {\n            error_message = \"invalid BOM; must be 0xEF 0xBB 0xBF if given\";\n            return token_type::parse_error;\n        }\n\n        // read next character and ignore whitespace\n        skip_whitespace();\n\n        // ignore comments\n        while (ignore_comments && current == '/')\n        {\n            if (!scan_comment())\n            {\n                return token_type::parse_error;\n            }\n\n            // skip following whitespace\n            skip_whitespace();\n        }\n\n        switch (current)\n        {\n            // structural characters\n            case '[':\n                return token_type::begin_array;\n            case ']':\n                return token_type::end_array;\n            case '{':\n                return token_type::begin_object;\n            case '}':\n                return token_type::end_object;\n            case ':':\n                return token_type::name_separator;\n            case ',':\n                return token_type::value_separator;\n\n            // literals\n            case 't':\n            {\n                std::array<char_type, 4> true_literal = {{'t', 'r', 'u', 'e'}};\n                return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);\n            }\n            case 'f':\n            {\n                std::array<char_type, 5> false_literal = {{'f', 'a', 'l', 's', 'e'}};\n                return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);\n            }\n            case 'n':\n            {\n                std::array<char_type, 4> null_literal = {{'n', 'u', 'l', 'l'}};\n                return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);\n            }\n\n            // string\n            case '\\\"':\n                return scan_string();\n\n            // number\n            case '-':\n            case '0':\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 scan_number();\n\n            // end of input (the null byte is needed when parsing from\n            // string literals)\n            case '\\0':\n            case std::char_traits<char_type>::eof():\n                return token_type::end_of_input;\n\n            // error\n            default:\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n        }\n    }\n\n  private:\n    /// input adapter\n    InputAdapterType ia;\n\n    /// whether comments should be ignored (true) or signaled as errors (false)\n    const bool ignore_comments = false;\n\n    /// the current character\n    char_int_type current = std::char_traits<char_type>::eof();\n\n    /// whether the next get() call should just return current\n    bool next_unget = false;\n\n    /// the start position of the current token\n    position_t position {};\n\n    /// raw input token string (for error messages)\n    std::vector<char_type> token_string {};\n\n    /// buffer for variable-length tokens (numbers, strings)\n    string_t token_buffer {};\n\n    /// a description of occurred lexer errors\n    const char* error_message = \"\";\n\n    // number values\n    number_integer_t value_integer = 0;\n    number_unsigned_t value_unsigned = 0;\n    number_float_t value_float = 0;\n\n    /// the decimal point\n    const char_int_type decimal_point_char = '.';\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/is_sax.hpp>\n\n\n#include <cstdint> // size_t\n#include <utility> // declval\n#include <string> // string\n\n// #include <nlohmann/detail/meta/detected.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename T>\nusing null_function_t = decltype(std::declval<T&>().null());\n\ntemplate<typename T>\nusing boolean_function_t =\n    decltype(std::declval<T&>().boolean(std::declval<bool>()));\n\ntemplate<typename T, typename Integer>\nusing number_integer_function_t =\n    decltype(std::declval<T&>().number_integer(std::declval<Integer>()));\n\ntemplate<typename T, typename Unsigned>\nusing number_unsigned_function_t =\n    decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));\n\ntemplate<typename T, typename Float, typename String>\nusing number_float_function_t = decltype(std::declval<T&>().number_float(\n                                    std::declval<Float>(), std::declval<const String&>()));\n\ntemplate<typename T, typename String>\nusing string_function_t =\n    decltype(std::declval<T&>().string(std::declval<String&>()));\n\ntemplate<typename T, typename Binary>\nusing binary_function_t =\n    decltype(std::declval<T&>().binary(std::declval<Binary&>()));\n\ntemplate<typename T>\nusing start_object_function_t =\n    decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));\n\ntemplate<typename T, typename String>\nusing key_function_t =\n    decltype(std::declval<T&>().key(std::declval<String&>()));\n\ntemplate<typename T>\nusing end_object_function_t = decltype(std::declval<T&>().end_object());\n\ntemplate<typename T>\nusing start_array_function_t =\n    decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));\n\ntemplate<typename T>\nusing end_array_function_t = decltype(std::declval<T&>().end_array());\n\ntemplate<typename T, typename Exception>\nusing parse_error_function_t = decltype(std::declval<T&>().parse_error(\n        std::declval<std::size_t>(), std::declval<const std::string&>(),\n        std::declval<const Exception&>()));\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static constexpr bool value =\n        is_detected_exact<bool, null_function_t, SAX>::value &&\n        is_detected_exact<bool, boolean_function_t, SAX>::value &&\n        is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value &&\n        is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value &&\n        is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value &&\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value &&\n        is_detected_exact<bool, start_object_function_t, SAX>::value &&\n        is_detected_exact<bool, key_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, end_object_function_t, SAX>::value &&\n        is_detected_exact<bool, start_array_function_t, SAX>::value &&\n        is_detected_exact<bool, end_array_function_t, SAX>::value &&\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value;\n};\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax_static_asserts\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static_assert(is_detected_exact<bool, null_function_t, SAX>::value,\n                  \"Missing/invalid function: bool null()\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(\n        is_detected_exact<bool, number_integer_function_t, SAX,\n        number_integer_t>::value,\n        \"Missing/invalid function: bool number_integer(number_integer_t)\");\n    static_assert(\n        is_detected_exact<bool, number_unsigned_function_t, SAX,\n        number_unsigned_t>::value,\n        \"Missing/invalid function: bool number_unsigned(number_unsigned_t)\");\n    static_assert(is_detected_exact<bool, number_float_function_t, SAX,\n                  number_float_t, string_t>::value,\n                  \"Missing/invalid function: bool number_float(number_float_t, const string_t&)\");\n    static_assert(\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value,\n        \"Missing/invalid function: bool string(string_t&)\");\n    static_assert(\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value,\n        \"Missing/invalid function: bool binary(binary_t&)\");\n    static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_object(std::size_t)\");\n    static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value,\n                  \"Missing/invalid function: bool key(string_t&)\");\n    static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_object()\");\n    static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_array(std::size_t)\");\n    static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_array()\");\n    static_assert(\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value,\n        \"Missing/invalid function: bool parse_error(std::size_t, const \"\n        \"std::string&, const exception&)\");\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n/// how to treat CBOR tags\nenum class cbor_tag_handler_t\n{\n    error,  ///< throw a parse_error exception in case of a tag\n    ignore   ///< ignore tags\n};\n\n/*!\n@brief determine system byte order\n\n@return true if and only if system's byte order is little endian\n\n@note from https://stackoverflow.com/a/1001328/266378\n*/\nstatic inline bool little_endianess(int num = 1) noexcept\n{\n    return *reinterpret_cast<char*>(&num) == 1;\n}\n\n\n///////////////////\n// binary reader //\n///////////////////\n\n/*!\n@brief deserialization of CBOR, MessagePack, and UBJSON values\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType>>\nclass binary_reader\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using json_sax_t = SAX;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename std::char_traits<char_type>::int_type;\n\n  public:\n    /*!\n    @brief create a binary reader\n\n    @param[in] adapter  input adapter to read from\n    */\n    explicit binary_reader(InputAdapterType&& adapter) : ia(std::move(adapter))\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n    }\n\n    // make class move-only\n    binary_reader(const binary_reader&) = delete;\n    binary_reader(binary_reader&&) = default;\n    binary_reader& operator=(const binary_reader&) = delete;\n    binary_reader& operator=(binary_reader&&) = default;\n    ~binary_reader() = default;\n\n    /*!\n    @param[in] format  the binary format to parse\n    @param[in] sax_    a SAX event processor\n    @param[in] strict  whether to expect the input to be consumed completed\n    @param[in] tag_handler  how to treat CBOR tags\n\n    @return\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool sax_parse(const input_format_t format,\n                   json_sax_t* sax_,\n                   const bool strict = true,\n                   const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        sax = sax_;\n        bool result = false;\n\n        switch (format)\n        {\n            case input_format_t::bson:\n                result = parse_bson_internal();\n                break;\n\n            case input_format_t::cbor:\n                result = parse_cbor_internal(true, tag_handler);\n                break;\n\n            case input_format_t::msgpack:\n                result = parse_msgpack_internal();\n                break;\n\n            case input_format_t::ubjson:\n                result = parse_ubjson_internal();\n                break;\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\n        // strict mode: next byte must be EOF\n        if (result && strict)\n        {\n            if (format == input_format_t::ubjson)\n            {\n                get_ignore_noop();\n            }\n            else\n            {\n                get();\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(current != std::char_traits<char_type>::eof()))\n            {\n                return sax->parse_error(chars_read, get_token_string(),\n                                        parse_error::create(110, chars_read, exception_message(format, \"expected end of input; last byte: 0x\" + get_token_string(), \"value\")));\n            }\n        }\n\n        return result;\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @brief Reads in a BSON-object and passes it to the SAX-parser.\n    @return whether a valid BSON-value was passed to the SAX parser\n    */\n    bool parse_bson_internal()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false)))\n        {\n            return false;\n        }\n\n        return sax->end_object();\n    }\n\n    /*!\n    @brief Parses a C-style string from the BSON input.\n    @param[in, out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @return `true` if the \\x00-byte indicating the end of the string was\n             encountered before the EOF; false` indicates an unexpected EOF.\n    */\n    bool get_bson_cstr(string_t& result)\n    {\n        auto out = std::back_inserter(result);\n        while (true)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"cstring\")))\n            {\n                return false;\n            }\n            if (current == 0x00)\n            {\n                return true;\n            }\n            *out++ = static_cast<typename string_t::value_type>(current);\n        }\n    }\n\n    /*!\n    @brief Parses a zero-terminated string of length @a len from the BSON\n           input.\n    @param[in] len  The length (including the zero-byte at the end) of the\n                    string to be read.\n    @param[in, out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 1\n    @return `true` if the string was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_string(const NumberType len, string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 1))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, \"string length must be at least 1, is \" + std::to_string(len), \"string\")));\n        }\n\n        return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != std::char_traits<char_type>::eof();\n    }\n\n    /*!\n    @brief Parses a byte array input of length @a len from the BSON input.\n    @param[in] len  The length of the byte array to be read.\n    @param[in, out] result  A reference to the binary variable where the read\n                            array is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 0\n    @return `true` if the byte array was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_binary(const NumberType len, binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 0))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, \"byte array length cannot be negative, is \" + std::to_string(len), \"binary\")));\n        }\n\n        // All BSON binary values have a subtype\n        std::uint8_t subtype{};\n        get_number<std::uint8_t>(input_format_t::bson, subtype);\n        result.set_subtype(subtype);\n\n        return get_binary(input_format_t::bson, len, result);\n    }\n\n    /*!\n    @brief Read a BSON document element of the given @a element_type.\n    @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html\n    @param[in] element_type_parse_position The position in the input stream,\n               where the `element_type` was read.\n    @warning Not all BSON element types are supported yet. An unsupported\n             @a element_type will give rise to a parse_error.114:\n             Unsupported BSON record type 0x...\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_internal(const char_int_type element_type,\n                                     const std::size_t element_type_parse_position)\n    {\n        switch (element_type)\n        {\n            case 0x01: // double\n            {\n                double number{};\n                return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0x02: // string\n            {\n                std::int32_t len{};\n                string_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);\n            }\n\n            case 0x03: // object\n            {\n                return parse_bson_internal();\n            }\n\n            case 0x04: // array\n            {\n                return parse_bson_array();\n            }\n\n            case 0x05: // binary\n            {\n                std::int32_t len{};\n                binary_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);\n            }\n\n            case 0x08: // boolean\n            {\n                return sax->boolean(get() != 0);\n            }\n\n            case 0x0A: // null\n            {\n                return sax->null();\n            }\n\n            case 0x10: // int32\n            {\n                std::int32_t value{};\n                return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            case 0x12: // int64\n            {\n                std::int64_t value{};\n                return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            default: // anything else not supported (yet)\n            {\n                std::array<char, 3> cr{{}};\n                (std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(element_type));\n                return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, \"Unsupported BSON record type 0x\" + std::string(cr.data())));\n            }\n        }\n    }\n\n    /*!\n    @brief Read a BSON element list (as specified in the BSON-spec)\n\n    The same binary layout is used for objects and arrays, hence it must be\n    indicated with the argument @a is_array which one is expected\n    (true --> array, false --> object).\n\n    @param[in] is_array Determines if the element list being read is to be\n                        treated as an object (@a is_array == false), or as an\n                        array (@a is_array == true).\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_list(const bool is_array)\n    {\n        string_t key;\n\n        while (auto element_type = get())\n        {\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"element list\")))\n            {\n                return false;\n            }\n\n            const std::size_t element_type_parse_position = chars_read;\n            if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key)))\n            {\n                return false;\n            }\n\n            if (!is_array && !sax->key(key))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position)))\n            {\n                return false;\n            }\n\n            // get_bson_cstr only appends\n            key.clear();\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief Reads an array from the BSON input and passes it to the SAX-parser.\n    @return whether a valid BSON-array was passed to the SAX parser\n    */\n    bool parse_bson_array()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true)))\n        {\n            return false;\n        }\n\n        return sax->end_array();\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true) or whether the last read character should\n                         be considered instead (false)\n    @param[in] tag_handler how CBOR tags should be treated\n\n    @return whether a valid CBOR value was passed to the SAX parser\n    */\n    bool parse_cbor_internal(const bool get_char,\n                             const cbor_tag_handler_t tag_handler)\n    {\n        switch (get_char ? get() : current)\n        {\n            // EOF\n            case std::char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::cbor, \"value\");\n\n            // Integer 0x00..0x17 (0..23)\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            case 0x18: // Unsigned integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x19: // Unsigned integer (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1A: // Unsigned integer (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1B: // Unsigned integer (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            // Negative integer -1-0x00..-1-0x17 (-1..-24)\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n                return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current));\n\n            case 0x38: // Negative integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x39: // Negative integer -1-n (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3A: // Negative integer -1-n (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1)\n                        - static_cast<number_integer_t>(number));\n            }\n\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            case 0x5F: // Binary data (indefinite length)\n            {\n                binary_t b;\n                return get_cbor_binary(b) && sax->binary(b);\n            }\n\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                string_t s;\n                return get_cbor_string(s) && sax->string(s);\n            }\n\n            // array (0x00..0x17 data items follow)\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n                return get_cbor_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0x98: // array (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x99: // array (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9A: // array (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9B: // array (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9F: // array (indefinite length)\n                return get_cbor_array(std::size_t(-1), tag_handler);\n\n            // map (0x00..0x17 pairs of data items follow)\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n                return get_cbor_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0xB8: // map (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xB9: // map (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBA: // map (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBB: // map (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBF: // map (indefinite length)\n                return get_cbor_object(std::size_t(-1), tag_handler);\n\n            case 0xC6: // tagged item\n            case 0xC7:\n            case 0xC8:\n            case 0xC9:\n            case 0xCA:\n            case 0xCB:\n            case 0xCC:\n            case 0xCD:\n            case 0xCE:\n            case 0xCF:\n            case 0xD0:\n            case 0xD1:\n            case 0xD2:\n            case 0xD3:\n            case 0xD4:\n            case 0xD8: // tagged item (1 bytes follow)\n            case 0xD9: // tagged item (2 bytes follow)\n            case 0xDA: // tagged item (4 bytes follow)\n            case 0xDB: // tagged item (8 bytes follow)\n            {\n                switch (tag_handler)\n                {\n                    case cbor_tag_handler_t::error:\n                    {\n                        auto last_token = get_token_string();\n                        return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, \"invalid byte: 0x\" + last_token, \"value\")));\n                    }\n\n                    case cbor_tag_handler_t::ignore:\n                    {\n                        switch (current)\n                        {\n                            case 0xD8:\n                            {\n                                std::uint8_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xD9:\n                            {\n                                std::uint16_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xDA:\n                            {\n                                std::uint32_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xDB:\n                            {\n                                std::uint64_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            default:\n                                break;\n                        }\n                        return parse_cbor_internal(true, tag_handler);\n                    }\n\n                    default:            // LCOV_EXCL_LINE\n                        JSON_ASSERT(false);  // LCOV_EXCL_LINE\n                }\n            }\n\n            case 0xF4: // false\n                return sax->boolean(false);\n\n            case 0xF5: // true\n                return sax->boolean(true);\n\n            case 0xF6: // null\n                return sax->null();\n\n            case 0xF9: // Half-Precision Float (two-byte IEEE 754)\n            {\n                const auto byte1_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n                const auto byte2_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n\n                const auto byte1 = static_cast<unsigned char>(byte1_raw);\n                const auto byte2 = static_cast<unsigned char>(byte2_raw);\n\n                // code from RFC 7049, Appendix D, Figure 3:\n                // As half-precision floating-point numbers were only added\n                // to IEEE 754 in 2008, today's programming platforms often\n                // still only have limited support for them. It is very\n                // easy to include at least decoding support for them even\n                // without such support. An example of a small decoder for\n                // half-precision floating-point numbers in the C language\n                // is shown in Fig. 3.\n                const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2);\n                const double val = [&half]\n                {\n                    const int exp = (half >> 10u) & 0x1Fu;\n                    const unsigned int mant = half & 0x3FFu;\n                    JSON_ASSERT(0 <= exp&& exp <= 32);\n                    JSON_ASSERT(mant <= 1024);\n                    switch (exp)\n                    {\n                        case 0:\n                            return std::ldexp(mant, -24);\n                        case 31:\n                            return (mant == 0)\n                            ? std::numeric_limits<double>::infinity()\n                            : std::numeric_limits<double>::quiet_NaN();\n                        default:\n                            return std::ldexp(mant + 1024, exp - 25);\n                    }\n                }();\n                return sax->number_float((half & 0x8000u) != 0\n                                         ? static_cast<number_float_t>(-val)\n                                         : static_cast<number_float_t>(val), \"\");\n            }\n\n            case 0xFA: // Single-Precision Float (four-byte IEEE 754)\n            {\n                float number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xFB: // Double-Precision Float (eight-byte IEEE 754)\n            {\n                double number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            default: // anything else (0xFF is handled inside the other types)\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n    Additionally, CBOR's strings with indefinite lengths are supported.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_cbor_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            {\n                return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    string_t chunk;\n                    if (!get_cbor_string(chunk))\n                    {\n                        return false;\n                    }\n                    result.append(chunk);\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, \"expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x\" + last_token, \"string\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into the byte array.\n    Additionally, CBOR's byte arrays with indefinite lengths are supported.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_cbor_binary(binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"binary\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            {\n                return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5F: // Binary data (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    binary_t chunk;\n                    if (!get_cbor_binary(chunk))\n                    {\n                        return false;\n                    }\n                    result.insert(result.end(), chunk.begin(), chunk.end());\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, \"expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x\" + last_token, \"binary\")));\n            }\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array or std::size_t(-1) for an\n                    array of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether array creation completed\n    */\n    bool get_cbor_array(const std::size_t len,\n                        const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        if (len != std::size_t(-1))\n        {\n            for (std::size_t i = 0; i < len; ++i)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n        else\n        {\n            while (get() != 0xFF)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object or std::size_t(-1) for an\n                    object of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether object creation completed\n    */\n    bool get_cbor_object(const std::size_t len,\n                         const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        string_t key;\n        if (len != std::size_t(-1))\n        {\n            for (std::size_t i = 0; i < len; ++i)\n            {\n                get();\n                if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                {\n                    return false;\n                }\n\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n                key.clear();\n            }\n        }\n        else\n        {\n            while (get() != 0xFF)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                {\n                    return false;\n                }\n\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n                key.clear();\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    /*!\n    @return whether a valid MessagePack value was passed to the SAX parser\n    */\n    bool parse_msgpack_internal()\n    {\n        switch (get())\n        {\n            // EOF\n            case std::char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::msgpack, \"value\");\n\n            // positive fixint\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n            case 0x18:\n            case 0x19:\n            case 0x1A:\n            case 0x1B:\n            case 0x1C:\n            case 0x1D:\n            case 0x1E:\n            case 0x1F:\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n            case 0x38:\n            case 0x39:\n            case 0x3A:\n            case 0x3B:\n            case 0x3C:\n            case 0x3D:\n            case 0x3E:\n            case 0x3F:\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58:\n            case 0x59:\n            case 0x5A:\n            case 0x5B:\n            case 0x5C:\n            case 0x5D:\n            case 0x5E:\n            case 0x5F:\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78:\n            case 0x79:\n            case 0x7A:\n            case 0x7B:\n            case 0x7C:\n            case 0x7D:\n            case 0x7E:\n            case 0x7F:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            // fixmap\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n                return get_msgpack_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixarray\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n            case 0x98:\n            case 0x99:\n            case 0x9A:\n            case 0x9B:\n            case 0x9C:\n            case 0x9D:\n            case 0x9E:\n            case 0x9F:\n                return get_msgpack_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            case 0xD9: // str 8\n            case 0xDA: // str 16\n            case 0xDB: // str 32\n            {\n                string_t s;\n                return get_msgpack_string(s) && sax->string(s);\n            }\n\n            case 0xC0: // nil\n                return sax->null();\n\n            case 0xC2: // false\n                return sax->boolean(false);\n\n            case 0xC3: // true\n                return sax->boolean(true);\n\n            case 0xC4: // bin 8\n            case 0xC5: // bin 16\n            case 0xC6: // bin 32\n            case 0xC7: // ext 8\n            case 0xC8: // ext 16\n            case 0xC9: // ext 32\n            case 0xD4: // fixext 1\n            case 0xD5: // fixext 2\n            case 0xD6: // fixext 4\n            case 0xD7: // fixext 8\n            case 0xD8: // fixext 16\n            {\n                binary_t b;\n                return get_msgpack_binary(b) && sax->binary(b);\n            }\n\n            case 0xCA: // float 32\n            {\n                float number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCB: // float 64\n            {\n                double number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCC: // uint 8\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCD: // uint 16\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCE: // uint 32\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCF: // uint 64\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xD0: // int 8\n            {\n                std::int8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD1: // int 16\n            {\n                std::int16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD2: // int 32\n            {\n                std::int32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD3: // int 64\n            {\n                std::int64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xDC: // array 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));\n            }\n\n            case 0xDD: // array 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));\n            }\n\n            case 0xDE: // map 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));\n            }\n\n            case 0xDF: // map 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));\n            }\n\n            // negative fixint\n            case 0xE0:\n            case 0xE1:\n            case 0xE2:\n            case 0xE3:\n            case 0xE4:\n            case 0xE5:\n            case 0xE6:\n            case 0xE7:\n            case 0xE8:\n            case 0xE9:\n            case 0xEA:\n            case 0xEB:\n            case 0xEC:\n            case 0xED:\n            case 0xEE:\n            case 0xEF:\n            case 0xF0:\n            case 0xF1:\n            case 0xF2:\n            case 0xF3:\n            case 0xF4:\n            case 0xF5:\n            case 0xF6:\n            case 0xF7:\n            case 0xF8:\n            case 0xF9:\n            case 0xFA:\n            case 0xFB:\n            case 0xFC:\n            case 0xFD:\n            case 0xFE:\n            case 0xFF:\n                return sax->number_integer(static_cast<std::int8_t>(current));\n\n            default: // anything else\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_msgpack_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            {\n                return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0xD9: // str 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDA: // str 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDB: // str 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, \"expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x\" + last_token, \"string\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into a byte array.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_msgpack_binary(binary_t& result)\n    {\n        // helper function to set the subtype\n        auto assign_and_return_true = [&result](std::int8_t subtype)\n        {\n            result.set_subtype(static_cast<std::uint8_t>(subtype));\n            return true;\n        };\n\n        switch (current)\n        {\n            case 0xC4: // bin 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC5: // bin 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC6: // bin 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC7: // ext 8\n            {\n                std::uint8_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC8: // ext 16\n            {\n                std::uint16_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC9: // ext 32\n            {\n                std::uint32_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD4: // fixext 1\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 1, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD5: // fixext 2\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 2, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD6: // fixext 4\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 4, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD7: // fixext 8\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 8, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD8: // fixext 16\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 16, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            default:           // LCOV_EXCL_LINE\n                return false;  // LCOV_EXCL_LINE\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array\n    @return whether array creation completed\n    */\n    bool get_msgpack_array(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object\n    @return whether object creation completed\n    */\n    bool get_msgpack_object(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        string_t key;\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key)))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n            key.clear();\n        }\n\n        return sax->end_object();\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether a valid UBJSON value was passed to the SAX parser\n    */\n    bool parse_ubjson_internal(const bool get_char = true)\n    {\n        return get_ubjson_value(get_char ? get_ignore_noop() : current);\n    }\n\n    /*!\n    @brief reads a UBJSON string\n\n    This function is either called after reading the 'S' byte explicitly\n    indicating a string, or in case of an object key where the 'S' byte can be\n    left out.\n\n    @param[out] result   created string\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether string creation completed\n    */\n    bool get_ubjson_string(string_t& result, const bool get_char = true)\n    {\n        if (get_char)\n        {\n            get();  // TODO(niels): may we ignore N here?\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"value\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            case 'U':\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'i':\n            {\n                std::int8_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'I':\n            {\n                std::int16_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'l':\n            {\n                std::int32_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'L':\n            {\n                std::int64_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            default:\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"expected length type specification (U, i, I, l, L); last byte: 0x\" + last_token, \"string\")));\n        }\n    }\n\n    /*!\n    @param[out] result  determined size\n    @return whether size determination completed\n    */\n    bool get_ubjson_size_value(std::size_t& result)\n    {\n        switch (get_ignore_noop())\n        {\n            case 'U':\n            {\n                std::uint8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"expected length type specification (U, i, I, l, L) after '#'; last byte: 0x\" + last_token, \"size\")));\n            }\n        }\n    }\n\n    /*!\n    @brief determine the type and size for a container\n\n    In the optimized UBJSON format, a type and a size can be provided to allow\n    for a more compact representation.\n\n    @param[out] result  pair of the size and the type\n\n    @return whether pair creation completed\n    */\n    bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result)\n    {\n        result.first = string_t::npos; // size\n        result.second = 0; // type\n\n        get_ignore_noop();\n\n        if (current == '$')\n        {\n            result.second = get();  // must not ignore 'N', because 'N' maybe the type\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"type\")))\n            {\n                return false;\n            }\n\n            get_ignore_noop();\n            if (JSON_HEDLEY_UNLIKELY(current != '#'))\n            {\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"value\")))\n                {\n                    return false;\n                }\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, \"expected '#' after type information; last byte: 0x\" + last_token, \"size\")));\n            }\n\n            return get_ubjson_size_value(result.first);\n        }\n\n        if (current == '#')\n        {\n            return get_ubjson_size_value(result.first);\n        }\n\n        return true;\n    }\n\n    /*!\n    @param prefix  the previously read or set type prefix\n    @return whether value creation completed\n    */\n    bool get_ubjson_value(const char_int_type prefix)\n    {\n        switch (prefix)\n        {\n            case std::char_traits<char_type>::eof():  // EOF\n                return unexpect_eof(input_format_t::ubjson, \"value\");\n\n            case 'T':  // true\n                return sax->boolean(true);\n            case 'F':  // false\n                return sax->boolean(false);\n\n            case 'Z':  // null\n                return sax->null();\n\n            case 'U':\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number);\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'd':\n            {\n                float number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'D':\n            {\n                double number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'H':\n            {\n                return get_ubjson_high_precision_number();\n            }\n\n            case 'C':  // char\n            {\n                get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"char\")))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(current > 127))\n                {\n                    auto last_token = get_token_string();\n                    return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"byte after 'C' must be in range 0x00..0x7F; last byte: 0x\" + last_token, \"char\")));\n                }\n                string_t s(1, static_cast<typename string_t::value_type>(current));\n                return sax->string(s);\n            }\n\n            case 'S':  // string\n            {\n                string_t s;\n                return get_ubjson_string(s) && sax->string(s);\n            }\n\n            case '[':  // array\n                return get_ubjson_array();\n\n            case '{':  // object\n                return get_ubjson_object();\n\n            default: // anything else\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @return whether array creation completed\n    */\n    bool get_ubjson_array()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        if (size_and_type.first != string_t::npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                if (size_and_type.second != 'N')\n                {\n                    for (std::size_t i = 0; i < size_and_type.first; ++i)\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                        {\n                            return false;\n                        }\n                    }\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n            {\n                return false;\n            }\n\n            while (current != ']')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false)))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @return whether object creation completed\n    */\n    bool get_ubjson_object()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        string_t key;\n        if (size_and_type.first != string_t::npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n            {\n                return false;\n            }\n\n            while (current != '}')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key)))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n                key.clear();\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    // Note, no reader for UBJSON binary types is implemented because they do\n    // not exist\n\n    bool get_ubjson_high_precision_number()\n    {\n        // get size of following number string\n        std::size_t size{};\n        auto res = get_ubjson_size_value(size);\n        if (JSON_HEDLEY_UNLIKELY(!res))\n        {\n            return res;\n        }\n\n        // get number string\n        std::vector<char> number_vector;\n        for (std::size_t i = 0; i < size; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"number\")))\n            {\n                return false;\n            }\n            number_vector.push_back(static_cast<char>(current));\n        }\n\n        // parse number string\n        auto number_ia = detail::input_adapter(std::forward<decltype(number_vector)>(number_vector));\n        auto number_lexer = detail::lexer<BasicJsonType, decltype(number_ia)>(std::move(number_ia), false);\n        const auto result_number = number_lexer.scan();\n        const auto number_string = number_lexer.get_token_string();\n        const auto result_remainder = number_lexer.scan();\n\n        using token_type = typename detail::lexer_base<BasicJsonType>::token_type;\n\n        if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input))\n        {\n            return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, \"invalid number text: \" + number_lexer.get_token_string(), \"high-precision number\")));\n        }\n\n        switch (result_number)\n        {\n            case token_type::value_integer:\n                return sax->number_integer(number_lexer.get_number_integer());\n            case token_type::value_unsigned:\n                return sax->number_unsigned(number_lexer.get_number_unsigned());\n            case token_type::value_float:\n                return sax->number_float(number_lexer.get_number_float(), std::move(number_string));\n            default:\n                return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, \"invalid number text: \" + number_lexer.get_token_string(), \"high-precision number\")));\n        }\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*!\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a -'ve valued\n    `std::char_traits<char_type>::eof()` in that case.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++chars_read;\n        return current = ia.get_character();\n    }\n\n    /*!\n    @return character read from the input after ignoring all 'N' entries\n    */\n    char_int_type get_ignore_noop()\n    {\n        do\n        {\n            get();\n        }\n        while (current == 'N');\n\n        return current;\n    }\n\n    /*\n    @brief read a number from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format   the current format (for diagnostics)\n    @param[out] result  number of type @a NumberType\n\n    @return whether conversion completed\n\n    @note This function needs to respect the system's endianess, because\n          bytes in CBOR, MessagePack, and UBJSON are stored in network order\n          (big endian) and therefore need reordering on little endian systems.\n    */\n    template<typename NumberType, bool InputIsLittleEndian = false>\n    bool get_number(const input_format_t format, NumberType& result)\n    {\n        // step 1: read input into array with system's byte order\n        std::array<std::uint8_t, sizeof(NumberType)> vec;\n        for (std::size_t i = 0; i < sizeof(NumberType); ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"number\")))\n            {\n                return false;\n            }\n\n            // reverse byte order prior to conversion if necessary\n            if (is_little_endian != InputIsLittleEndian)\n            {\n                vec[sizeof(NumberType) - i - 1] = static_cast<std::uint8_t>(current);\n            }\n            else\n            {\n                vec[i] = static_cast<std::uint8_t>(current); // LCOV_EXCL_LINE\n            }\n        }\n\n        // step 2: convert array into number of type T and return\n        std::memcpy(&result, vec.data(), sizeof(NumberType));\n        return true;\n    }\n\n    /*!\n    @brief create a string by reading characters from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of characters to read\n    @param[out] result string created by reading @a len bytes\n\n    @return whether string creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of string memory.\n    */\n    template<typename NumberType>\n    bool get_string(const input_format_t format,\n                    const NumberType len,\n                    string_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"string\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<typename string_t::value_type>(current));\n        };\n        return success;\n    }\n\n    /*!\n    @brief create a byte array by reading bytes from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of bytes to read\n    @param[out] result byte array created by reading @a len bytes\n\n    @return whether byte array creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of memory.\n    */\n    template<typename NumberType>\n    bool get_binary(const input_format_t format,\n                    const NumberType len,\n                    binary_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"binary\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<std::uint8_t>(current));\n        }\n        return success;\n    }\n\n    /*!\n    @param[in] format   the current format (for diagnostics)\n    @param[in] context  further context information (for diagnostics)\n    @return whether the last read character is not EOF\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool unexpect_eof(const input_format_t format, const char* context) const\n    {\n        if (JSON_HEDLEY_UNLIKELY(current == std::char_traits<char_type>::eof()))\n        {\n            return sax->parse_error(chars_read, \"<end of file>\",\n                                    parse_error::create(110, chars_read, exception_message(format, \"unexpected end of input\", context)));\n        }\n        return true;\n    }\n\n    /*!\n    @return a string representation of the last read byte\n    */\n    std::string get_token_string() const\n    {\n        std::array<char, 3> cr{{}};\n        (std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(current));\n        return std::string{cr.data()};\n    }\n\n    /*!\n    @param[in] format   the current format\n    @param[in] detail   a detailed error message\n    @param[in] context  further context information\n    @return a message string to use in the parse_error exceptions\n    */\n    std::string exception_message(const input_format_t format,\n                                  const std::string& detail,\n                                  const std::string& context) const\n    {\n        std::string error_msg = \"syntax error while parsing \";\n\n        switch (format)\n        {\n            case input_format_t::cbor:\n                error_msg += \"CBOR\";\n                break;\n\n            case input_format_t::msgpack:\n                error_msg += \"MessagePack\";\n                break;\n\n            case input_format_t::ubjson:\n                error_msg += \"UBJSON\";\n                break;\n\n            case input_format_t::bson:\n                error_msg += \"BSON\";\n                break;\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\n        return error_msg + \" \" + context + \": \" + detail;\n    }\n\n  private:\n    /// input adapter\n    InputAdapterType ia;\n\n    /// the current character\n    char_int_type current = std::char_traits<char_type>::eof();\n\n    /// the number of characters read\n    std::size_t chars_read = 0;\n\n    /// whether we can assume little endianess\n    const bool is_little_endian = little_endianess();\n\n    /// the SAX parser\n    json_sax_t* sax = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n// #include <nlohmann/detail/input/parser.hpp>\n\n\n#include <cmath> // isfinite\n#include <cstdint> // uint8_t\n#include <functional> // function\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/json_sax.hpp>\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/is_sax.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n////////////\n// parser //\n////////////\n\nenum class parse_event_t : uint8_t\n{\n    /// the parser read `{` and started to process a JSON object\n    object_start,\n    /// the parser read `}` and finished processing a JSON object\n    object_end,\n    /// the parser read `[` and started to process a JSON array\n    array_start,\n    /// the parser read `]` and finished processing a JSON array\n    array_end,\n    /// the parser read a key of a value in an object\n    key,\n    /// the parser finished reading a JSON value\n    value\n};\n\ntemplate<typename BasicJsonType>\nusing parser_callback_t =\n    std::function<bool(int depth, parse_event_t event, BasicJsonType& parsed)>;\n\n/*!\n@brief syntax analysis\n\nThis class implements a recursive descent parser.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass parser\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using lexer_t = lexer<BasicJsonType, InputAdapterType>;\n    using token_type = typename lexer_t::token_type;\n\n  public:\n    /// a parser reading from an input adapter\n    explicit parser(InputAdapterType&& adapter,\n                    const parser_callback_t<BasicJsonType> cb = nullptr,\n                    const bool allow_exceptions_ = true,\n                    const bool skip_comments = false)\n        : callback(cb)\n        , m_lexer(std::move(adapter), skip_comments)\n        , allow_exceptions(allow_exceptions_)\n    {\n        // read first token\n        get_token();\n    }\n\n    /*!\n    @brief public parser interface\n\n    @param[in] strict      whether to expect the last token to be EOF\n    @param[in,out] result  parsed JSON value\n\n    @throw parse_error.101 in case of an unexpected token\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n    */\n    void parse(const bool strict, BasicJsonType& result)\n    {\n        if (callback)\n        {\n            json_sax_dom_callback_parser<BasicJsonType> sdp(result, callback, allow_exceptions);\n            sax_parse_internal(&sdp);\n            result.assert_invariant();\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(),\n                                                    exception_message(token_type::end_of_input, \"value\")));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n\n            // set top-level value to null if it was discarded by the callback\n            // function\n            if (result.is_discarded())\n            {\n                result = nullptr;\n            }\n        }\n        else\n        {\n            json_sax_dom_parser<BasicJsonType> sdp(result, allow_exceptions);\n            sax_parse_internal(&sdp);\n            result.assert_invariant();\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(),\n                                                    exception_message(token_type::end_of_input, \"value\")));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n        }\n    }\n\n    /*!\n    @brief public accept interface\n\n    @param[in] strict  whether to expect the last token to be EOF\n    @return whether the input is a proper JSON text\n    */\n    bool accept(const bool strict = true)\n    {\n        json_sax_acceptor<BasicJsonType> sax_acceptor;\n        return sax_parse(&sax_acceptor, strict);\n    }\n\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse(SAX* sax, const bool strict = true)\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n        const bool result = sax_parse_internal(sax);\n\n        // strict mode: next byte must be EOF\n        if (result && strict && (get_token() != token_type::end_of_input))\n        {\n            return sax->parse_error(m_lexer.get_position(),\n                                    m_lexer.get_token_string(),\n                                    parse_error::create(101, m_lexer.get_position(),\n                                            exception_message(token_type::end_of_input, \"value\")));\n        }\n\n        return result;\n    }\n\n  private:\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse_internal(SAX* sax)\n    {\n        // stack to remember the hierarchy of structured values we are parsing\n        // true = array; false = object\n        std::vector<bool> states;\n        // value to avoid a goto (see comment where set to true)\n        bool skip_to_state_evaluation = false;\n\n        while (true)\n        {\n            if (!skip_to_state_evaluation)\n            {\n                // invariant: get_token() was called before each iteration\n                switch (last_token)\n                {\n                    case token_type::begin_object:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n                        {\n                            return false;\n                        }\n\n                        // closing } -> we are done\n                        if (get_token() == token_type::end_object)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // parse key\n                        if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(),\n                                                            exception_message(token_type::value_string, \"object key\")));\n                        }\n                        if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        // parse separator (:)\n                        if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(),\n                                                            exception_message(token_type::name_separator, \"object separator\")));\n                        }\n\n                        // remember we are now inside an object\n                        states.push_back(false);\n\n                        // parse values\n                        get_token();\n                        continue;\n                    }\n\n                    case token_type::begin_array:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n                        {\n                            return false;\n                        }\n\n                        // closing ] -> we are done\n                        if (get_token() == token_type::end_array)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // remember we are now inside an array\n                        states.push_back(true);\n\n                        // parse values (no need to call get_token)\n                        continue;\n                    }\n\n                    case token_type::value_float:\n                    {\n                        const auto res = m_lexer.get_number_float();\n\n                        if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res)))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    out_of_range::create(406, \"number overflow parsing '\" + m_lexer.get_token_string() + \"'\"));\n                        }\n\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        break;\n                    }\n\n                    case token_type::literal_false:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_null:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->null()))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_true:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_integer:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_string:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_unsigned:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::parse_error:\n                    {\n                        // using \"uninitialized\" to avoid \"expected\" message\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::uninitialized, \"value\")));\n                    }\n\n                    default: // the last token was unexpected\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::literal_or_value, \"value\")));\n                    }\n                }\n            }\n            else\n            {\n                skip_to_state_evaluation = false;\n            }\n\n            // we reached this line after we successfully parsed a value\n            if (states.empty())\n            {\n                // empty stack: we reached the end of the hierarchy: done\n                return true;\n            }\n\n            if (states.back())  // array\n            {\n                // comma -> next value\n                if (get_token() == token_type::value_separator)\n                {\n                    // parse a new value\n                    get_token();\n                    continue;\n                }\n\n                // closing ]\n                if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                    {\n                        return false;\n                    }\n\n                    // We are done with this array. Before we can parse a\n                    // new value, we need to evaluate the new state first.\n                    // By setting skip_to_state_evaluation to false, we\n                    // are effectively jumping to the beginning of this if.\n                    JSON_ASSERT(!states.empty());\n                    states.pop_back();\n                    skip_to_state_evaluation = true;\n                    continue;\n                }\n\n                return sax->parse_error(m_lexer.get_position(),\n                                        m_lexer.get_token_string(),\n                                        parse_error::create(101, m_lexer.get_position(),\n                                                exception_message(token_type::end_array, \"array\")));\n            }\n            else  // object\n            {\n                // comma -> next value\n                if (get_token() == token_type::value_separator)\n                {\n                    // parse key\n                    if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::value_string, \"object key\")));\n                    }\n\n                    if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                    {\n                        return false;\n                    }\n\n                    // parse separator (:)\n                    if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::name_separator, \"object separator\")));\n                    }\n\n                    // parse values\n                    get_token();\n                    continue;\n                }\n\n                // closing }\n                if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                    {\n                        return false;\n                    }\n\n                    // We are done with this object. Before we can parse a\n                    // new value, we need to evaluate the new state first.\n                    // By setting skip_to_state_evaluation to false, we\n                    // are effectively jumping to the beginning of this if.\n                    JSON_ASSERT(!states.empty());\n                    states.pop_back();\n                    skip_to_state_evaluation = true;\n                    continue;\n                }\n\n                return sax->parse_error(m_lexer.get_position(),\n                                        m_lexer.get_token_string(),\n                                        parse_error::create(101, m_lexer.get_position(),\n                                                exception_message(token_type::end_object, \"object\")));\n            }\n        }\n    }\n\n    /// get next token from lexer\n    token_type get_token()\n    {\n        return last_token = m_lexer.scan();\n    }\n\n    std::string exception_message(const token_type expected, const std::string& context)\n    {\n        std::string error_msg = \"syntax error \";\n\n        if (!context.empty())\n        {\n            error_msg += \"while parsing \" + context + \" \";\n        }\n\n        error_msg += \"- \";\n\n        if (last_token == token_type::parse_error)\n        {\n            error_msg += std::string(m_lexer.get_error_message()) + \"; last read: '\" +\n                         m_lexer.get_token_string() + \"'\";\n        }\n        else\n        {\n            error_msg += \"unexpected \" + std::string(lexer_t::token_type_name(last_token));\n        }\n\n        if (expected != token_type::uninitialized)\n        {\n            error_msg += \"; expected \" + std::string(lexer_t::token_type_name(expected));\n        }\n\n        return error_msg;\n    }\n\n  private:\n    /// callback function\n    const parser_callback_t<BasicJsonType> callback = nullptr;\n    /// the type of the last read token\n    token_type last_token = token_type::uninitialized;\n    /// the lexer\n    lexer_t m_lexer;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/internal_iterator.hpp>\n\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n\n#include <cstddef> // ptrdiff_t\n#include <limits>  // numeric_limits\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/*\n@brief an iterator for primitive JSON types\n\nThis class models an iterator for primitive JSON types (boolean, number,\nstring). It's only purpose is to allow the iterator/const_iterator classes\nto \"iterate\" over primitive values. Internally, the iterator is modeled by\na `difference_type` variable. Value begin_value (`0`) models the begin,\nend_value (`1`) models past the end.\n*/\nclass primitive_iterator_t\n{\n  private:\n    using difference_type = std::ptrdiff_t;\n    static constexpr difference_type begin_value = 0;\n    static constexpr difference_type end_value = begin_value + 1;\n\n    /// iterator as signed integer type\n    difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();\n\n  public:\n    constexpr difference_type get_value() const noexcept\n    {\n        return m_it;\n    }\n\n    /// set iterator to a defined beginning\n    void set_begin() noexcept\n    {\n        m_it = begin_value;\n    }\n\n    /// set iterator to a defined past the end\n    void set_end() noexcept\n    {\n        m_it = end_value;\n    }\n\n    /// return whether the iterator can be dereferenced\n    constexpr bool is_begin() const noexcept\n    {\n        return m_it == begin_value;\n    }\n\n    /// return whether the iterator is at end\n    constexpr bool is_end() const noexcept\n    {\n        return m_it == end_value;\n    }\n\n    friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it == rhs.m_it;\n    }\n\n    friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it < rhs.m_it;\n    }\n\n    primitive_iterator_t operator+(difference_type n) noexcept\n    {\n        auto result = *this;\n        result += n;\n        return result;\n    }\n\n    friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it - rhs.m_it;\n    }\n\n    primitive_iterator_t& operator++() noexcept\n    {\n        ++m_it;\n        return *this;\n    }\n\n    primitive_iterator_t const operator++(int) noexcept\n    {\n        auto result = *this;\n        ++m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator--() noexcept\n    {\n        --m_it;\n        return *this;\n    }\n\n    primitive_iterator_t const operator--(int) noexcept\n    {\n        auto result = *this;\n        --m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator+=(difference_type n) noexcept\n    {\n        m_it += n;\n        return *this;\n    }\n\n    primitive_iterator_t& operator-=(difference_type n) noexcept\n    {\n        m_it -= n;\n        return *this;\n    }\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/*!\n@brief an iterator value\n\n@note This structure could easily be a union, but MSVC currently does not allow\nunions members with complex constructors, see https://github.com/nlohmann/json/pull/105.\n*/\ntemplate<typename BasicJsonType> struct internal_iterator\n{\n    /// iterator for JSON objects\n    typename BasicJsonType::object_t::iterator object_iterator {};\n    /// iterator for JSON arrays\n    typename BasicJsonType::array_t::iterator array_iterator {};\n    /// generic iterator for all other types\n    primitive_iterator_t primitive_iterator {};\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/iter_impl.hpp>\n\n\n#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next\n#include <type_traits> // conditional, is_const, remove_const\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/iterators/internal_iterator.hpp>\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n// forward declare, to be able to friend it later on\ntemplate<typename IteratorType> class iteration_proxy;\ntemplate<typename IteratorType> class iteration_proxy_value;\n\n/*!\n@brief a template for a bidirectional iterator for the @ref basic_json class\nThis class implements a both iterators (iterator and const_iterator) for the\n@ref basic_json class.\n@note An iterator is called *initialized* when a pointer to a JSON value has\n      been set (e.g., by a constructor or a copy assignment). If the iterator is\n      default-constructed, it is *uninitialized* and most methods are undefined.\n      **The library uses assertions to detect calls on uninitialized iterators.**\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n@since version 1.0.0, simplified in version 2.0.9, change to bidirectional\n       iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593)\n*/\ntemplate<typename BasicJsonType>\nclass iter_impl\n{\n    /// allow basic_json to access private members\n    friend iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;\n    friend BasicJsonType;\n    friend iteration_proxy<iter_impl>;\n    friend iteration_proxy_value<iter_impl>;\n\n    using object_t = typename BasicJsonType::object_t;\n    using array_t = typename BasicJsonType::array_t;\n    // make sure BasicJsonType is basic_json or const basic_json\n    static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,\n                  \"iter_impl only accepts (const) basic_json\");\n\n  public:\n\n    /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17.\n    /// The C++ Standard has never required user-defined iterators to derive from std::iterator.\n    /// A user-defined iterator should provide publicly accessible typedefs named\n    /// iterator_category, value_type, difference_type, pointer, and reference.\n    /// Note that value_type is required to be non-const, even for constant iterators.\n    using iterator_category = std::bidirectional_iterator_tag;\n\n    /// the type of the values when the iterator is dereferenced\n    using value_type = typename BasicJsonType::value_type;\n    /// a type to represent differences between iterators\n    using difference_type = typename BasicJsonType::difference_type;\n    /// defines a pointer to the type iterated over (value_type)\n    using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,\n          typename BasicJsonType::const_pointer,\n          typename BasicJsonType::pointer>::type;\n    /// defines a reference to the type iterated over (value_type)\n    using reference =\n        typename std::conditional<std::is_const<BasicJsonType>::value,\n        typename BasicJsonType::const_reference,\n        typename BasicJsonType::reference>::type;\n\n    /// default constructor\n    iter_impl() = default;\n\n    /*!\n    @brief constructor for a given JSON instance\n    @param[in] object  pointer to a JSON object for this iterator\n    @pre object != nullptr\n    @post The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    explicit iter_impl(pointer object) noexcept : m_object(object)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = typename object_t::iterator();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = typename array_t::iterator();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator = primitive_iterator_t();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @note The conventional copy constructor and copy assignment are implicitly\n          defined. Combined with the following converting constructor and\n          assignment, they support: (1) copy from iterator to iterator, (2)\n          copy from const iterator to const iterator, and (3) conversion from\n          iterator to const iterator. However conversion from const iterator\n          to iterator is not defined.\n    */\n\n    /*!\n    @brief const copy constructor\n    @param[in] other const iterator to copy from\n    @note This copy constructor had to be defined explicitly to circumvent a bug\n          occurring on msvc v19.0 compiler (VS 2015) debug build. For more\n          information refer to: https://github.com/nlohmann/json/issues/1608\n    */\n    iter_impl(const iter_impl<const BasicJsonType>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept\n    {\n        m_object = other.m_object;\n        m_it = other.m_it;\n        return *this;\n    }\n\n    /*!\n    @brief converting constructor\n    @param[in] other  non-const iterator to copy from\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other  non-const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept\n    {\n        m_object = other.m_object;\n        m_it = other.m_it;\n        return *this;\n    }\n\n  private:\n    /*!\n    @brief set the iterator to the first value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_begin() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_value.object->begin();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_value.array->begin();\n                break;\n            }\n\n            case value_t::null:\n            {\n                // set to end so begin()==end() is true: null is empty\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator.set_begin();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @brief set the iterator past the last value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_end() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_value.object->end();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_value.array->end();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n        }\n    }\n\n  public:\n    /*!\n    @brief return a reference to the value pointed to by the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator*() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());\n                return m_it.object_iterator->second;\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());\n                return *m_it.array_iterator;\n            }\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief dereference the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    pointer operator->() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());\n                return &(m_it.object_iterator->second);\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());\n                return &*m_it.array_iterator;\n            }\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief post-increment (it++)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl const operator++(int)\n    {\n        auto result = *this;\n        ++(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-increment (++it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator++()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, 1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, 1);\n                break;\n            }\n\n            default:\n            {\n                ++m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief post-decrement (it--)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl const operator--(int)\n    {\n        auto result = *this;\n        --(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-decrement (--it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator--()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, -1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, -1);\n                break;\n            }\n\n            default:\n            {\n                --m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief  comparison: equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator==(const iter_impl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\"));\n        }\n\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                return (m_it.object_iterator == other.m_it.object_iterator);\n\n            case value_t::array:\n                return (m_it.array_iterator == other.m_it.array_iterator);\n\n            default:\n                return (m_it.primitive_iterator == other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief  comparison: not equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator!=(const iter_impl& other) const\n    {\n        return !operator==(other);\n    }\n\n    /*!\n    @brief  comparison: smaller\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator<(const iter_impl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\"));\n        }\n\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(213, \"cannot compare order of object iterators\"));\n\n            case value_t::array:\n                return (m_it.array_iterator < other.m_it.array_iterator);\n\n            default:\n                return (m_it.primitive_iterator < other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief  comparison: less than or equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator<=(const iter_impl& other) const\n    {\n        return !other.operator < (*this);\n    }\n\n    /*!\n    @brief  comparison: greater than\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator>(const iter_impl& other) const\n    {\n        return !operator<=(other);\n    }\n\n    /*!\n    @brief  comparison: greater than or equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator>=(const iter_impl& other) const\n    {\n        return !operator<(other);\n    }\n\n    /*!\n    @brief  add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator+=(difference_type i)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\"));\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, i);\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator += i;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief  subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator-=(difference_type i)\n    {\n        return operator+=(-i);\n    }\n\n    /*!\n    @brief  add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator+(difference_type i) const\n    {\n        auto result = *this;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief  addition of distance and iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    friend iter_impl operator+(difference_type i, const iter_impl& it)\n    {\n        auto result = it;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief  subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator-(difference_type i) const\n    {\n        auto result = *this;\n        result -= i;\n        return result;\n    }\n\n    /*!\n    @brief  return difference\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    difference_type operator-(const iter_impl& other) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\"));\n\n            case value_t::array:\n                return m_it.array_iterator - other.m_it.array_iterator;\n\n            default:\n                return m_it.primitive_iterator - other.m_it.primitive_iterator;\n        }\n    }\n\n    /*!\n    @brief  access to successor\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator[](difference_type n) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(208, \"cannot use operator[] for object iterators\"));\n\n            case value_t::array:\n                return *std::next(m_it.array_iterator, n);\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief  return the key of an object iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    const typename object_t::key_type& key() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        if (JSON_HEDLEY_LIKELY(m_object->is_object()))\n        {\n            return m_it.object_iterator->first;\n        }\n\n        JSON_THROW(invalid_iterator::create(207, \"cannot use key() for non-object iterators\"));\n    }\n\n    /*!\n    @brief  return the value of an iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference value() const\n    {\n        return operator*();\n    }\n\n  private:\n    /// associated JSON instance\n    pointer m_object = nullptr;\n    /// the actual iterator of the associated instance\n    internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};\n};\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/iteration_proxy.hpp>\n\n// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp>\n\n\n#include <cstddef> // ptrdiff_t\n#include <iterator> // reverse_iterator\n#include <utility> // declval\n\nnamespace nlohmann\n{\nnamespace detail\n{\n//////////////////////\n// reverse_iterator //\n//////////////////////\n\n/*!\n@brief a template for a reverse iterator class\n\n@tparam Base the base iterator type to reverse. Valid types are @ref\niterator (to create @ref reverse_iterator) and @ref const_iterator (to\ncreate @ref const_reverse_iterator).\n\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):\n  It is possible to write to the pointed-to element (only if @a Base is\n  @ref iterator).\n\n@since version 1.0.0\n*/\ntemplate<typename Base>\nclass json_reverse_iterator : public std::reverse_iterator<Base>\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    /// shortcut to the reverse iterator adapter\n    using base_iterator = std::reverse_iterator<Base>;\n    /// the reference type for the pointed-to element\n    using reference = typename Base::reference;\n\n    /// create reverse iterator from iterator\n    explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept\n        : base_iterator(it) {}\n\n    /// create reverse iterator from base class\n    explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}\n\n    /// post-increment (it++)\n    json_reverse_iterator const operator++(int)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator++(1));\n    }\n\n    /// pre-increment (++it)\n    json_reverse_iterator& operator++()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator++());\n    }\n\n    /// post-decrement (it--)\n    json_reverse_iterator const operator--(int)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator--(1));\n    }\n\n    /// pre-decrement (--it)\n    json_reverse_iterator& operator--()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator--());\n    }\n\n    /// add to iterator\n    json_reverse_iterator& operator+=(difference_type i)\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));\n    }\n\n    /// add to iterator\n    json_reverse_iterator operator+(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator+(i));\n    }\n\n    /// subtract from iterator\n    json_reverse_iterator operator-(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator-(i));\n    }\n\n    /// return difference\n    difference_type operator-(const json_reverse_iterator& other) const\n    {\n        return base_iterator(*this) - base_iterator(other);\n    }\n\n    /// access to successor\n    reference operator[](difference_type n) const\n    {\n        return *(this->operator+(n));\n    }\n\n    /// return the key of an object iterator\n    auto key() const -> decltype(std::declval<Base>().key())\n    {\n        auto it = --this->base();\n        return it.key();\n    }\n\n    /// return the value of an iterator\n    reference value() const\n    {\n        auto it = --this->base();\n        return it.operator * ();\n    }\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n// #include <nlohmann/detail/json_pointer.hpp>\n\n\n#include <algorithm> // all_of\n#include <cctype> // isdigit\n#include <limits> // max\n#include <numeric> // accumulate\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\ntemplate<typename BasicJsonType>\nclass json_pointer\n{\n    // allow basic_json to access private members\n    NLOHMANN_BASIC_JSON_TPL_DECLARATION\n    friend class basic_json;\n\n  public:\n    /*!\n    @brief create JSON pointer\n\n    Create a JSON pointer according to the syntax described in\n    [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3).\n\n    @param[in] s  string representing the JSON pointer; if omitted, the empty\n                  string is assumed which references the whole JSON value\n\n    @throw parse_error.107 if the given JSON pointer @a s is nonempty and does\n                           not begin with a slash (`/`); see example below\n\n    @throw parse_error.108 if a tilde (`~`) in the given JSON pointer @a s is\n    not followed by `0` (representing `~`) or `1` (representing `/`); see\n    example below\n\n    @liveexample{The example shows the construction several valid JSON pointers\n    as well as the exceptional behavior.,json_pointer}\n\n    @since version 2.0.0\n    */\n    explicit json_pointer(const std::string& s = \"\")\n        : reference_tokens(split(s))\n    {}\n\n    /*!\n    @brief return a string representation of the JSON pointer\n\n    @invariant For each JSON pointer `ptr`, it holds:\n    @code {.cpp}\n    ptr == json_pointer(ptr.to_string());\n    @endcode\n\n    @return a string representation of the JSON pointer\n\n    @liveexample{The example shows the result of `to_string`.,json_pointer__to_string}\n\n    @since version 2.0.0\n    */\n    std::string to_string() const\n    {\n        return std::accumulate(reference_tokens.begin(), reference_tokens.end(),\n                               std::string{},\n                               [](const std::string & a, const std::string & b)\n        {\n            return a + \"/\" + escape(b);\n        });\n    }\n\n    /// @copydoc to_string()\n    operator std::string() const\n    {\n        return to_string();\n    }\n\n    /*!\n    @brief append another JSON pointer at the end of this JSON pointer\n\n    @param[in] ptr  JSON pointer to append\n    @return JSON pointer with @a ptr appended\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::string) to append a reference token\n    @sa @ref operator/=(std::size_t) to append an array index\n    @sa @ref operator/(const json_pointer&, const json_pointer&) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(const json_pointer& ptr)\n    {\n        reference_tokens.insert(reference_tokens.end(),\n                                ptr.reference_tokens.begin(),\n                                ptr.reference_tokens.end());\n        return *this;\n    }\n\n    /*!\n    @brief append an unescaped reference token at the end of this JSON pointer\n\n    @param[in] token  reference token to append\n    @return JSON pointer with @a token appended without escaping @a token\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Amortized constant.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n    @sa @ref operator/=(std::size_t) to append an array index\n    @sa @ref operator/(const json_pointer&, std::size_t) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(std::string token)\n    {\n        push_back(std::move(token));\n        return *this;\n    }\n\n    /*!\n    @brief append an array index at the end of this JSON pointer\n\n    @param[in] array_idx  array index to append\n    @return JSON pointer with @a array_idx appended\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Amortized constant.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n    @sa @ref operator/=(std::string) to append a reference token\n    @sa @ref operator/(const json_pointer&, std::string) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(std::size_t array_idx)\n    {\n        return *this /= std::to_string(array_idx);\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer\n\n    @param[in] lhs  JSON pointer\n    @param[in] rhs  JSON pointer\n    @return a new JSON pointer with @a rhs appended to @a lhs\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a lhs and @a rhs.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& lhs,\n                                  const json_pointer& rhs)\n    {\n        return json_pointer(lhs) /= rhs;\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer\n\n    @param[in] ptr  JSON pointer\n    @param[in] token  reference token\n    @return a new JSON pointer with unescaped @a token appended to @a ptr\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::string) to append a reference token\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& ptr, std::string token)\n    {\n        return json_pointer(ptr) /= std::move(token);\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer\n\n    @param[in] ptr  JSON pointer\n    @param[in] array_idx  array index\n    @return a new JSON pointer with @a array_idx appended to @a ptr\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::size_t) to append an array index\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& ptr, std::size_t array_idx)\n    {\n        return json_pointer(ptr) /= array_idx;\n    }\n\n    /*!\n    @brief returns the parent of this JSON pointer\n\n    @return parent of this JSON pointer; in case this JSON pointer is the root,\n            the root itself is returned\n\n    @complexity Linear in the length of the JSON pointer.\n\n    @liveexample{The example shows the result of `parent_pointer` for different\n    JSON Pointers.,json_pointer__parent_pointer}\n\n    @since version 3.6.0\n    */\n    json_pointer parent_pointer() const\n    {\n        if (empty())\n        {\n            return *this;\n        }\n\n        json_pointer res = *this;\n        res.pop_back();\n        return res;\n    }\n\n    /*!\n    @brief remove last reference token\n\n    @pre not `empty()`\n\n    @liveexample{The example shows the usage of `pop_back`.,json_pointer__pop_back}\n\n    @complexity Constant.\n\n    @throw out_of_range.405 if JSON pointer has no parent\n\n    @since version 3.6.0\n    */\n    void pop_back()\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        reference_tokens.pop_back();\n    }\n\n    /*!\n    @brief return last reference token\n\n    @pre not `empty()`\n    @return last reference token\n\n    @liveexample{The example shows the usage of `back`.,json_pointer__back}\n\n    @complexity Constant.\n\n    @throw out_of_range.405 if JSON pointer has no parent\n\n    @since version 3.6.0\n    */\n    const std::string& back() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        return reference_tokens.back();\n    }\n\n    /*!\n    @brief append an unescaped token at the end of the reference pointer\n\n    @param[in] token  token to add\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows the result of `push_back` for different\n    JSON Pointers.,json_pointer__push_back}\n\n    @since version 3.6.0\n    */\n    void push_back(const std::string& token)\n    {\n        reference_tokens.push_back(token);\n    }\n\n    /// @copydoc push_back(const std::string&)\n    void push_back(std::string&& token)\n    {\n        reference_tokens.push_back(std::move(token));\n    }\n\n    /*!\n    @brief return whether pointer points to the root document\n\n    @return true iff the JSON pointer points to the root document\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example shows the result of `empty` for different JSON\n    Pointers.,json_pointer__empty}\n\n    @since version 3.6.0\n    */\n    bool empty() const noexcept\n    {\n        return reference_tokens.empty();\n    }\n\n  private:\n    /*!\n    @param[in] s  reference token to be converted into an array index\n\n    @return integer representation of @a s\n\n    @throw parse_error.106  if an array index begins with '0'\n    @throw parse_error.109  if an array index begins not with a digit\n    @throw out_of_range.404 if string @a s could not be converted to an integer\n    @throw out_of_range.410 if an array index exceeds size_type\n    */\n    static typename BasicJsonType::size_type array_index(const std::string& s)\n    {\n        using size_type = typename BasicJsonType::size_type;\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))\n        {\n            JSON_THROW(detail::parse_error::create(106, 0,\n                                                   \"array index '\" + s +\n                                                   \"' must not begin with '0'\"));\n        }\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))\n        {\n            JSON_THROW(detail::parse_error::create(109, 0, \"array index '\" + s + \"' is not a number\"));\n        }\n\n        std::size_t processed_chars = 0;\n        unsigned long long res = 0;\n        JSON_TRY\n        {\n            res = std::stoull(s, &processed_chars);\n        }\n        JSON_CATCH(std::out_of_range&)\n        {\n            JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + s + \"'\"));\n        }\n\n        // check if the string was completely read\n        if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size()))\n        {\n            JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + s + \"'\"));\n        }\n\n        // only triggered on special platforms (like 32bit), see also\n        // https://github.com/nlohmann/json/pull/2203\n        if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))\n        {\n            JSON_THROW(detail::out_of_range::create(410, \"array index \" + s + \" exceeds size_type\")); // LCOV_EXCL_LINE\n        }\n\n        return static_cast<size_type>(res);\n    }\n\n    json_pointer top() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        json_pointer result = *this;\n        result.reference_tokens = {reference_tokens[0]};\n        return result;\n    }\n\n    /*!\n    @brief create and return a reference to the pointed to value\n\n    @complexity Linear in the number of reference tokens.\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.313 if value cannot be unflattened\n    */\n    BasicJsonType& get_and_create(BasicJsonType& j) const\n    {\n        auto result = &j;\n\n        // in case no reference tokens exist, return a reference to the JSON value\n        // j which will be overwritten by a primitive value\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (result->type())\n            {\n                case detail::value_t::null:\n                {\n                    if (reference_token == \"0\")\n                    {\n                        // start a new array if reference token is 0\n                        result = &result->operator[](0);\n                    }\n                    else\n                    {\n                        // start a new object otherwise\n                        result = &result->operator[](reference_token);\n                    }\n                    break;\n                }\n\n                case detail::value_t::object:\n                {\n                    // create an entry in the object\n                    result = &result->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    // create an entry in the array\n                    result = &result->operator[](array_index(reference_token));\n                    break;\n                }\n\n                /*\n                The following code is only reached if there exists a reference\n                token _and_ the current value is primitive. In this case, we have\n                an error situation, because primitive values may only occur as\n                single value; that is, with an empty list of reference tokens.\n                */\n                default:\n                    JSON_THROW(detail::type_error::create(313, \"invalid value to unflatten\"));\n            }\n        }\n\n        return *result;\n    }\n\n    /*!\n    @brief return a reference to the pointed to value\n\n    @note This version does not throw if a value is not present, but tries to\n          create nested values instead. For instance, calling this function\n          with pointer `\"/this/that\"` on a null value is equivalent to calling\n          `operator[](\"this\").operator[](\"that\")` on that value, effectively\n          changing the null value to an object.\n\n    @param[in] ptr  a JSON value\n\n    @return reference to the JSON value pointed to by the JSON pointer\n\n    @complexity Linear in the length of the JSON pointer.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    BasicJsonType& get_unchecked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            // convert null values to arrays or objects before continuing\n            if (ptr->is_null())\n            {\n                // check if reference token is a number\n                const bool nums =\n                    std::all_of(reference_token.begin(), reference_token.end(),\n                                [](const unsigned char x)\n                {\n                    return std::isdigit(x);\n                });\n\n                // change value to array for numbers or \"-\" or to object otherwise\n                *ptr = (nums || reference_token == \"-\")\n                       ? detail::value_t::array\n                       : detail::value_t::object;\n            }\n\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (reference_token == \"-\")\n                    {\n                        // explicitly treat \"-\" as index beyond the end\n                        ptr = &ptr->operator[](ptr->m_value.array->size());\n                    }\n                    else\n                    {\n                        // convert array index to number; unchecked access\n                        ptr = &ptr->operator[](array_index(reference_token));\n                    }\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    BasicJsonType& get_checked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @brief return a const reference to the pointed to value\n\n    @param[in] ptr  a JSON value\n\n    @return const reference to the JSON value pointed to by the JSON\n    pointer\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" cannot be used for const access\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // use unchecked array access\n                    ptr = &ptr->operator[](array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    const BasicJsonType& get_checked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    */\n    bool contains(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    if (!ptr->contains(reference_token))\n                    {\n                        // we did not find the key in the object\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !(\"0\" <= reference_token && reference_token <= \"9\")))\n                    {\n                        // invalid char\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))\n                        {\n                            // first char should be between '1' and '9'\n                            return false;\n                        }\n                        for (std::size_t i = 1; i < reference_token.size(); i++)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))\n                            {\n                                // other char should be between '0' and '9'\n                                return false;\n                            }\n                        }\n                    }\n\n                    const auto idx = array_index(reference_token);\n                    if (idx >= ptr->size())\n                    {\n                        // index out of range\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](idx);\n                    break;\n                }\n\n                default:\n                {\n                    // we do not expect primitive values if there is still a\n                    // reference token to process\n                    return false;\n                }\n            }\n        }\n\n        // no reference token left means we found a primitive value\n        return true;\n    }\n\n    /*!\n    @brief split the string input to reference tokens\n\n    @note This function is only called by the json_pointer constructor.\n          All exceptions below are documented there.\n\n    @throw parse_error.107  if the pointer is not empty or begins with '/'\n    @throw parse_error.108  if character '~' is not followed by '0' or '1'\n    */\n    static std::vector<std::string> split(const std::string& reference_string)\n    {\n        std::vector<std::string> result;\n\n        // special case: empty reference string -> no reference tokens\n        if (reference_string.empty())\n        {\n            return result;\n        }\n\n        // check if nonempty reference string begins with slash\n        if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))\n        {\n            JSON_THROW(detail::parse_error::create(107, 1,\n                                                   \"JSON pointer must be empty or begin with '/' - was: '\" +\n                                                   reference_string + \"'\"));\n        }\n\n        // extract the reference tokens:\n        // - slash: position of the last read slash (or end of string)\n        // - start: position after the previous slash\n        for (\n            // search for the first slash after the first character\n            std::size_t slash = reference_string.find_first_of('/', 1),\n            // set the beginning of the first reference token\n            start = 1;\n            // we can stop if start == 0 (if slash == std::string::npos)\n            start != 0;\n            // set the beginning of the next reference token\n            // (will eventually be 0 if slash == std::string::npos)\n            start = (slash == std::string::npos) ? 0 : slash + 1,\n            // find next slash\n            slash = reference_string.find_first_of('/', start))\n        {\n            // use the text between the beginning of the reference token\n            // (start) and the last slash (slash).\n            auto reference_token = reference_string.substr(start, slash - start);\n\n            // check reference tokens are properly escaped\n            for (std::size_t pos = reference_token.find_first_of('~');\n                    pos != std::string::npos;\n                    pos = reference_token.find_first_of('~', pos + 1))\n            {\n                JSON_ASSERT(reference_token[pos] == '~');\n\n                // ~ must be followed by 0 or 1\n                if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||\n                                         (reference_token[pos + 1] != '0' &&\n                                          reference_token[pos + 1] != '1')))\n                {\n                    JSON_THROW(detail::parse_error::create(108, 0, \"escape character '~' must be followed with '0' or '1'\"));\n                }\n            }\n\n            // finally, store the reference token\n            unescape(reference_token);\n            result.push_back(reference_token);\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief replace all occurrences of a substring by another string\n\n    @param[in,out] s  the string to manipulate; changed so that all\n                   occurrences of @a f are replaced with @a t\n    @param[in]     f  the substring to replace with @a t\n    @param[in]     t  the string to replace @a f\n\n    @pre The search string @a f must not be empty. **This precondition is\n    enforced with an assertion.**\n\n    @since version 2.0.0\n    */\n    static void replace_substring(std::string& s, const std::string& f,\n                                  const std::string& t)\n    {\n        JSON_ASSERT(!f.empty());\n        for (auto pos = s.find(f);                // find first occurrence of f\n                pos != std::string::npos;         // make sure f was found\n                s.replace(pos, f.size(), t),      // replace with t, and\n                pos = s.find(f, pos + t.size()))  // find next occurrence of f\n        {}\n    }\n\n    /// escape \"~\" to \"~0\" and \"/\" to \"~1\"\n    static std::string escape(std::string s)\n    {\n        replace_substring(s, \"~\", \"~0\");\n        replace_substring(s, \"/\", \"~1\");\n        return s;\n    }\n\n    /// unescape \"~1\" to tilde and \"~0\" to slash (order is important!)\n    static void unescape(std::string& s)\n    {\n        replace_substring(s, \"~1\", \"/\");\n        replace_substring(s, \"~0\", \"~\");\n    }\n\n    /*!\n    @param[in] reference_string  the reference string to the current value\n    @param[in] value             the value to consider\n    @param[in,out] result        the result object to insert values to\n\n    @note Empty objects or arrays are flattened to `null`.\n    */\n    static void flatten(const std::string& reference_string,\n                        const BasicJsonType& value,\n                        BasicJsonType& result)\n    {\n        switch (value.type())\n        {\n            case detail::value_t::array:\n            {\n                if (value.m_value.array->empty())\n                {\n                    // flatten empty array as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate array and use index as reference string\n                    for (std::size_t i = 0; i < value.m_value.array->size(); ++i)\n                    {\n                        flatten(reference_string + \"/\" + std::to_string(i),\n                                value.m_value.array->operator[](i), result);\n                    }\n                }\n                break;\n            }\n\n            case detail::value_t::object:\n            {\n                if (value.m_value.object->empty())\n                {\n                    // flatten empty object as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate object and use keys as reference string\n                    for (const auto& element : *value.m_value.object)\n                    {\n                        flatten(reference_string + \"/\" + escape(element.first), element.second, result);\n                    }\n                }\n                break;\n            }\n\n            default:\n            {\n                // add primitive value with its reference string\n                result[reference_string] = value;\n                break;\n            }\n        }\n    }\n\n    /*!\n    @param[in] value  flattened JSON\n\n    @return unflattened JSON\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.314  if value is not an object\n    @throw type_error.315  if object values are not primitive\n    @throw type_error.313  if value cannot be unflattened\n    */\n    static BasicJsonType\n    unflatten(const BasicJsonType& value)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!value.is_object()))\n        {\n            JSON_THROW(detail::type_error::create(314, \"only objects can be unflattened\"));\n        }\n\n        BasicJsonType result;\n\n        // iterate the JSON object values\n        for (const auto& element : *value.m_value.object)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))\n            {\n                JSON_THROW(detail::type_error::create(315, \"values in object must be primitive\"));\n            }\n\n            // assign value to reference pointed to by JSON pointer; Note that if\n            // the JSON pointer is \"\" (i.e., points to the whole value), function\n            // get_and_create returns a reference to result itself. An assignment\n            // will then create a primitive value.\n            json_pointer(element.first).get_and_create(result) = element.second;\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief compares two JSON pointers for equality\n\n    @param[in] lhs  JSON pointer to compare\n    @param[in] rhs  JSON pointer to compare\n    @return whether @a lhs is equal to @a rhs\n\n    @complexity Linear in the length of the JSON pointer\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n    */\n    friend bool operator==(json_pointer const& lhs,\n                           json_pointer const& rhs) noexcept\n    {\n        return lhs.reference_tokens == rhs.reference_tokens;\n    }\n\n    /*!\n    @brief compares two JSON pointers for inequality\n\n    @param[in] lhs  JSON pointer to compare\n    @param[in] rhs  JSON pointer to compare\n    @return whether @a lhs is not equal @a rhs\n\n    @complexity Linear in the length of the JSON pointer\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n    */\n    friend bool operator!=(json_pointer const& lhs,\n                           json_pointer const& rhs) noexcept\n    {\n        return !(lhs == rhs);\n    }\n\n    /// the reference tokens\n    std::vector<std::string> reference_tokens;\n};\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/json_ref.hpp>\n\n\n#include <initializer_list>\n#include <utility>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename BasicJsonType>\nclass json_ref\n{\n  public:\n    using value_type = BasicJsonType;\n\n    json_ref(value_type&& value)\n        : owned_value(std::move(value))\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    json_ref(const value_type& value)\n        : value_ref(const_cast<value_type*>(&value))\n        , is_rvalue(false)\n    {}\n\n    json_ref(std::initializer_list<json_ref> init)\n        : owned_value(init)\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    template <\n        class... Args,\n        enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >\n    json_ref(Args && ... args)\n        : owned_value(std::forward<Args>(args)...)\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    // class should be movable only\n    json_ref(json_ref&&) = default;\n    json_ref(const json_ref&) = delete;\n    json_ref& operator=(const json_ref&) = delete;\n    json_ref& operator=(json_ref&&) = delete;\n    ~json_ref() = default;\n\n    value_type moved_or_copied() const\n    {\n        if (is_rvalue)\n        {\n            return std::move(*value_ref);\n        }\n        return *value_ref;\n    }\n\n    value_type const& operator*() const\n    {\n        return *static_cast<value_type const*>(value_ref);\n    }\n\n    value_type const* operator->() const\n    {\n        return static_cast<value_type const*>(value_ref);\n    }\n\n  private:\n    mutable value_type owned_value = nullptr;\n    value_type* value_ref = nullptr;\n    const bool is_rvalue = true;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/output/binary_writer.hpp>\n\n\n#include <algorithm> // reverse\n#include <array> // array\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstring> // memcpy\n#include <limits> // numeric_limits\n#include <string> // string\n#include <cmath> // isnan, isinf\n\n// #include <nlohmann/detail/input/binary_reader.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n\n#include <algorithm> // copy\n#include <cstddef> // size_t\n#include <ios> // streamsize\n#include <iterator> // back_inserter\n#include <memory> // shared_ptr, make_shared\n#include <ostream> // basic_ostream\n#include <string> // basic_string\n#include <vector> // vector\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// abstract output adapter interface\ntemplate<typename CharType> struct output_adapter_protocol\n{\n    virtual void write_character(CharType c) = 0;\n    virtual void write_characters(const CharType* s, std::size_t length) = 0;\n    virtual ~output_adapter_protocol() = default;\n};\n\n/// a type to simplify interfaces\ntemplate<typename CharType>\nusing output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;\n\n/// output adapter for byte vectors\ntemplate<typename CharType>\nclass output_vector_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_vector_adapter(std::vector<CharType>& vec) noexcept\n        : v(vec)\n    {}\n\n    void write_character(CharType c) override\n    {\n        v.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        std::copy(s, s + length, std::back_inserter(v));\n    }\n\n  private:\n    std::vector<CharType>& v;\n};\n\n/// output adapter for output streams\ntemplate<typename CharType>\nclass output_stream_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept\n        : stream(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        stream.put(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        stream.write(s, static_cast<std::streamsize>(length));\n    }\n\n  private:\n    std::basic_ostream<CharType>& stream;\n};\n\n/// output adapter for basic_string\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_string_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_string_adapter(StringType& s) noexcept\n        : str(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        str.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        str.append(s, length);\n    }\n\n  private:\n    StringType& str;\n};\n\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_adapter\n{\n  public:\n    output_adapter(std::vector<CharType>& vec)\n        : oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {}\n\n    output_adapter(std::basic_ostream<CharType>& s)\n        : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}\n\n    output_adapter(StringType& s)\n        : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}\n\n    operator output_adapter_t<CharType>()\n    {\n        return oa;\n    }\n\n  private:\n    output_adapter_t<CharType> oa = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////\n// binary writer //\n///////////////////\n\n/*!\n@brief serialization to CBOR and MessagePack values\n*/\ntemplate<typename BasicJsonType, typename CharType>\nclass binary_writer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n  public:\n    /*!\n    @brief create a binary writer\n\n    @param[in] adapter  output adapter to write to\n    */\n    explicit binary_writer(output_adapter_t<CharType> adapter) : oa(adapter)\n    {\n        JSON_ASSERT(oa);\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    void write_bson(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n            {\n                write_bson_object(*j.m_value.object);\n                break;\n            }\n\n            default:\n            {\n                JSON_THROW(type_error::create(317, \"to serialize to BSON, top-level type must be object, but is \" + std::string(j.type_name())));\n            }\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_cbor(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                oa->write_character(to_char_type(0xF6));\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                oa->write_character(j.m_value.boolean\n                                    ? to_char_type(0xF5)\n                                    : to_char_type(0xF4));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_value.number_integer >= 0)\n                {\n                    // CBOR does not differentiate between positive signed\n                    // integers and unsigned integers. Therefore, we used the\n                    // code from the value_t::number_unsigned case here.\n                    if (j.m_value.number_integer <= 0x17)\n                    {\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x18));\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x19));\n                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x1A));\n                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x1B));\n                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    // The conversions below encode the sign in the first\n                    // byte, and the value is converted to a positive number.\n                    const auto positive_number = -1 - j.m_value.number_integer;\n                    if (j.m_value.number_integer >= -24)\n                    {\n                        write_number(static_cast<std::uint8_t>(0x20 + positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x38));\n                        write_number(static_cast<std::uint8_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x39));\n                        write_number(static_cast<std::uint16_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x3A));\n                        write_number(static_cast<std::uint32_t>(positive_number));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x3B));\n                        write_number(static_cast<std::uint64_t>(positive_number));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x18));\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x19));\n                    write_number(static_cast<std::uint16_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x1A));\n                    write_number(static_cast<std::uint32_t>(j.m_value.number_unsigned));\n                }\n                else\n                {\n                    oa->write_character(to_char_type(0x1B));\n                    write_number(static_cast<std::uint64_t>(j.m_value.number_unsigned));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                if (std::isnan(j.m_value.number_float))\n                {\n                    // NaN is 0xf97e00 in CBOR\n                    oa->write_character(to_char_type(0xF9));\n                    oa->write_character(to_char_type(0x7E));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else if (std::isinf(j.m_value.number_float))\n                {\n                    // Infinity is 0xf97c00, -Infinity is 0xf9fc00\n                    oa->write_character(to_char_type(0xf9));\n                    oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else\n                {\n                    write_compact_float(j.m_value.number_float, detail::input_format_t::cbor);\n                }\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_value.string->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x60 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x78));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x79));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_value.array->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x80 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x98));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x99));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_cbor(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (j.m_value.binary->has_subtype())\n                {\n                    write_number(static_cast<std::uint8_t>(0xd8));\n                    write_number(j.m_value.binary->subtype());\n                }\n\n                // step 1: write control byte and the binary array size\n                const auto N = j.m_value.binary->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x40 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x58));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x59));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_value.object->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0xA0 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB8));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB9));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBA));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBB));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_cbor(el.first);\n                    write_cbor(el.second);\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_msgpack(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null: // nil\n            {\n                oa->write_character(to_char_type(0xC0));\n                break;\n            }\n\n            case value_t::boolean: // true and false\n            {\n                oa->write_character(j.m_value.boolean\n                                    ? to_char_type(0xC3)\n                                    : to_char_type(0xC2));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_value.number_integer >= 0)\n                {\n                    // MessagePack does not differentiate between positive\n                    // signed integers and unsigned integers. Therefore, we used\n                    // the code from the value_t::number_unsigned case here.\n                    if (j.m_value.number_unsigned < 128)\n                    {\n                        // positive fixnum\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        // uint 8\n                        oa->write_character(to_char_type(0xCC));\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        // uint 16\n                        oa->write_character(to_char_type(0xCD));\n                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        // uint 32\n                        oa->write_character(to_char_type(0xCE));\n                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                    {\n                        // uint 64\n                        oa->write_character(to_char_type(0xCF));\n                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    if (j.m_value.number_integer >= -32)\n                    {\n                        // negative fixnum\n                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                    {\n                        // int 8\n                        oa->write_character(to_char_type(0xD0));\n                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                    {\n                        // int 16\n                        oa->write_character(to_char_type(0xD1));\n                        write_number(static_cast<std::int16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                    {\n                        // int 32\n                        oa->write_character(to_char_type(0xD2));\n                        write_number(static_cast<std::int32_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                    {\n                        // int 64\n                        oa->write_character(to_char_type(0xD3));\n                        write_number(static_cast<std::int64_t>(j.m_value.number_integer));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned < 128)\n                {\n                    // positive fixnum\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // uint 8\n                    oa->write_character(to_char_type(0xCC));\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // uint 16\n                    oa->write_character(to_char_type(0xCD));\n                    write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // uint 32\n                    oa->write_character(to_char_type(0xCE));\n                    write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    // uint 64\n                    oa->write_character(to_char_type(0xCF));\n                    write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack);\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_value.string->size();\n                if (N <= 31)\n                {\n                    // fixstr\n                    write_number(static_cast<std::uint8_t>(0xA0 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // str 8\n                    oa->write_character(to_char_type(0xD9));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // str 16\n                    oa->write_character(to_char_type(0xDA));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // str 32\n                    oa->write_character(to_char_type(0xDB));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_value.array->size();\n                if (N <= 15)\n                {\n                    // fixarray\n                    write_number(static_cast<std::uint8_t>(0x90 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // array 16\n                    oa->write_character(to_char_type(0xDC));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // array 32\n                    oa->write_character(to_char_type(0xDD));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_msgpack(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                // step 0: determine if the binary type has a set subtype to\n                // determine whether or not to use the ext or fixext types\n                const bool use_ext = j.m_value.binary->has_subtype();\n\n                // step 1: write control byte and the byte string length\n                const auto N = j.m_value.binary->size();\n                if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    std::uint8_t output_type{};\n                    bool fixed = true;\n                    if (use_ext)\n                    {\n                        switch (N)\n                        {\n                            case 1:\n                                output_type = 0xD4; // fixext 1\n                                break;\n                            case 2:\n                                output_type = 0xD5; // fixext 2\n                                break;\n                            case 4:\n                                output_type = 0xD6; // fixext 4\n                                break;\n                            case 8:\n                                output_type = 0xD7; // fixext 8\n                                break;\n                            case 16:\n                                output_type = 0xD8; // fixext 16\n                                break;\n                            default:\n                                output_type = 0xC7; // ext 8\n                                fixed = false;\n                                break;\n                        }\n\n                    }\n                    else\n                    {\n                        output_type = 0xC4; // bin 8\n                        fixed = false;\n                    }\n\n                    oa->write_character(to_char_type(output_type));\n                    if (!fixed)\n                    {\n                        write_number(static_cast<std::uint8_t>(N));\n                    }\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    std::uint8_t output_type = use_ext\n                                               ? 0xC8 // ext 16\n                                               : 0xC5; // bin 16\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    std::uint8_t output_type = use_ext\n                                               ? 0xC9 // ext 32\n                                               : 0xC6; // bin 32\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 1.5: if this is an ext type, write the subtype\n                if (use_ext)\n                {\n                    write_number(static_cast<std::int8_t>(j.m_value.binary->subtype()));\n                }\n\n                // step 2: write the byte string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_value.object->size();\n                if (N <= 15)\n                {\n                    // fixmap\n                    write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF)));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // map 16\n                    oa->write_character(to_char_type(0xDE));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // map 32\n                    oa->write_character(to_char_type(0xDF));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_msgpack(el.first);\n                    write_msgpack(el.second);\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @param[in] use_count   whether to use '#' prefixes (optimized format)\n    @param[in] use_type    whether to use '$' prefixes (optimized format)\n    @param[in] add_prefix  whether prefixes need to be used for this value\n    */\n    void write_ubjson(const BasicJsonType& j, const bool use_count,\n                      const bool use_type, const bool add_prefix = true)\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('Z'));\n                }\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(j.m_value.boolean\n                                        ? to_char_type('T')\n                                        : to_char_type('F'));\n                }\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix);\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix);\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix);\n                break;\n            }\n\n            case value_t::string:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('S'));\n                }\n                write_number_with_ubjson_prefix(j.m_value.string->size(), true);\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_value.array->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front());\n                    const bool same_prefix = std::all_of(j.begin() + 1, j.end(),\n                                                         [this, first_prefix](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v) == first_prefix;\n                    });\n\n                    if (same_prefix)\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.array->size(), true);\n                }\n\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_ubjson(el, use_count, use_type, prefix_required);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                if (use_type && !j.m_value.binary->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    oa->write_character(to_char_type('$'));\n                    oa->write_character('U');\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.binary->size(), true);\n                }\n\n                if (use_type)\n                {\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                        j.m_value.binary->size());\n                }\n                else\n                {\n                    for (size_t i = 0; i < j.m_value.binary->size(); ++i)\n                    {\n                        oa->write_character(to_char_type('U'));\n                        oa->write_character(j.m_value.binary->data()[i]);\n                    }\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('{'));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_value.object->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front());\n                    const bool same_prefix = std::all_of(j.begin(), j.end(),\n                                                         [this, first_prefix](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v) == first_prefix;\n                    });\n\n                    if (same_prefix)\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.object->size(), true);\n                }\n\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_number_with_ubjson_prefix(el.first.size(), true);\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(el.first.c_str()),\n                        el.first.size());\n                    write_ubjson(el.second, use_count, use_type, prefix_required);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type('}'));\n                }\n\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @return The size of a BSON document entry header, including the id marker\n            and the entry name size (and its null-terminator).\n    */\n    static std::size_t calc_bson_entry_header_size(const string_t& name)\n    {\n        const auto it = name.find(static_cast<typename string_t::value_type>(0));\n        if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos))\n        {\n            JSON_THROW(out_of_range::create(409,\n                                            \"BSON key cannot contain code point U+0000 (at byte \" + std::to_string(it) + \")\"));\n        }\n\n        return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;\n    }\n\n    /*!\n    @brief Writes the given @a element_type and @a name to the output adapter\n    */\n    void write_bson_entry_header(const string_t& name,\n                                 const std::uint8_t element_type)\n    {\n        oa->write_character(to_char_type(element_type)); // boolean\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(name.c_str()),\n            name.size() + 1u);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and boolean value @a value\n    */\n    void write_bson_boolean(const string_t& name,\n                            const bool value)\n    {\n        write_bson_entry_header(name, 0x08);\n        oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and double value @a value\n    */\n    void write_bson_double(const string_t& name,\n                           const double value)\n    {\n        write_bson_entry_header(name, 0x01);\n        write_number<double, true>(value);\n    }\n\n    /*!\n    @return The size of the BSON-encoded string in @a value\n    */\n    static std::size_t calc_bson_string_size(const string_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and string value @a value\n    */\n    void write_bson_string(const string_t& name,\n                           const string_t& value)\n    {\n        write_bson_entry_header(name, 0x02);\n\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size() + 1ul));\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(value.c_str()),\n            value.size() + 1);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and null value\n    */\n    void write_bson_null(const string_t& name)\n    {\n        write_bson_entry_header(name, 0x0A);\n    }\n\n    /*!\n    @return The size of the BSON-encoded integer @a value\n    */\n    static std::size_t calc_bson_integer_size(const std::int64_t value)\n    {\n        return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and integer @a value\n    */\n    void write_bson_integer(const string_t& name,\n                            const std::int64_t value)\n    {\n        if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            write_bson_entry_header(name, 0x10); // int32\n            write_number<std::int32_t, true>(static_cast<std::int32_t>(value));\n        }\n        else\n        {\n            write_bson_entry_header(name, 0x12); // int64\n            write_number<std::int64_t, true>(static_cast<std::int64_t>(value));\n        }\n    }\n\n    /*!\n    @return The size of the BSON-encoded unsigned integer in @a j\n    */\n    static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept\n    {\n        return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and unsigned @a value\n    */\n    void write_bson_unsigned(const string_t& name,\n                             const std::uint64_t value)\n    {\n        if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x10 /* int32 */);\n            write_number<std::int32_t, true>(static_cast<std::int32_t>(value));\n        }\n        else if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x12 /* int64 */);\n            write_number<std::int64_t, true>(static_cast<std::int64_t>(value));\n        }\n        else\n        {\n            JSON_THROW(out_of_range::create(407, \"integer number \" + std::to_string(value) + \" cannot be represented by BSON as it does not fit int64\"));\n        }\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and object @a value\n    */\n    void write_bson_object_entry(const string_t& name,\n                                 const typename BasicJsonType::object_t& value)\n    {\n        write_bson_entry_header(name, 0x03); // object\n        write_bson_object(value);\n    }\n\n    /*!\n    @return The size of the BSON-encoded array @a value\n    */\n    static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value)\n    {\n        std::size_t array_index = 0ul;\n\n        const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), std::size_t(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el)\n        {\n            return result + calc_bson_element_size(std::to_string(array_index++), el);\n        });\n\n        return sizeof(std::int32_t) + embedded_document_size + 1ul;\n    }\n\n    /*!\n    @return The size of the BSON-encoded binary array @a value\n    */\n    static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and array @a value\n    */\n    void write_bson_array(const string_t& name,\n                          const typename BasicJsonType::array_t& value)\n    {\n        write_bson_entry_header(name, 0x04); // array\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_array_size(value)));\n\n        std::size_t array_index = 0ul;\n\n        for (const auto& el : value)\n        {\n            write_bson_element(std::to_string(array_index++), el);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and binary value @a value\n    */\n    void write_bson_binary(const string_t& name,\n                           const binary_t& value)\n    {\n        write_bson_entry_header(name, 0x05);\n\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size()));\n        write_number(value.has_subtype() ? value.subtype() : std::uint8_t(0x00));\n\n        oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());\n    }\n\n    /*!\n    @brief Calculates the size necessary to serialize the JSON value @a j with its @a name\n    @return The calculated size for the BSON document entry for @a j with the given @a name.\n    */\n    static std::size_t calc_bson_element_size(const string_t& name,\n            const BasicJsonType& j)\n    {\n        const auto header_size = calc_bson_entry_header_size(name);\n        switch (j.type())\n        {\n            case value_t::object:\n                return header_size + calc_bson_object_size(*j.m_value.object);\n\n            case value_t::array:\n                return header_size + calc_bson_array_size(*j.m_value.array);\n\n            case value_t::binary:\n                return header_size + calc_bson_binary_size(*j.m_value.binary);\n\n            case value_t::boolean:\n                return header_size + 1ul;\n\n            case value_t::number_float:\n                return header_size + 8ul;\n\n            case value_t::number_integer:\n                return header_size + calc_bson_integer_size(j.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned);\n\n            case value_t::string:\n                return header_size + calc_bson_string_size(*j.m_value.string);\n\n            case value_t::null:\n                return header_size + 0ul;\n\n            // LCOV_EXCL_START\n            default:\n                JSON_ASSERT(false);\n                return 0ul;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Serializes the JSON value @a j to BSON and associates it with the\n           key @a name.\n    @param name The name to associate with the JSON entity @a j within the\n                current BSON document\n    @return The size of the BSON entry\n    */\n    void write_bson_element(const string_t& name,\n                            const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n                return write_bson_object_entry(name, *j.m_value.object);\n\n            case value_t::array:\n                return write_bson_array(name, *j.m_value.array);\n\n            case value_t::binary:\n                return write_bson_binary(name, *j.m_value.binary);\n\n            case value_t::boolean:\n                return write_bson_boolean(name, j.m_value.boolean);\n\n            case value_t::number_float:\n                return write_bson_double(name, j.m_value.number_float);\n\n            case value_t::number_integer:\n                return write_bson_integer(name, j.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return write_bson_unsigned(name, j.m_value.number_unsigned);\n\n            case value_t::string:\n                return write_bson_string(name, *j.m_value.string);\n\n            case value_t::null:\n                return write_bson_null(name);\n\n            // LCOV_EXCL_START\n            default:\n                JSON_ASSERT(false);\n                return;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Calculates the size of the BSON serialization of the given\n           JSON-object @a j.\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)\n    {\n        std::size_t document_size = std::accumulate(value.begin(), value.end(), std::size_t(0),\n                                    [](size_t result, const typename BasicJsonType::object_t::value_type & el)\n        {\n            return result += calc_bson_element_size(el.first, el.second);\n        });\n\n        return sizeof(std::int32_t) + document_size + 1ul;\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    void write_bson_object(const typename BasicJsonType::object_t& value)\n    {\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_object_size(value)));\n\n        for (const auto& el : value)\n        {\n            write_bson_element(el.first, el.second);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    static constexpr CharType get_cbor_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xFA);  // Single-Precision Float\n    }\n\n    static constexpr CharType get_cbor_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xFB);  // Double-Precision Float\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    static constexpr CharType get_msgpack_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xCA);  // float 32\n    }\n\n    static constexpr CharType get_msgpack_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xCB);  // float 64\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    // UBJSON: write number (floating point)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_floating_point<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if (add_prefix)\n        {\n            oa->write_character(get_ubjson_float_prefix(n));\n        }\n        write_number(n);\n    }\n\n    // UBJSON: write number (unsigned integer)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_unsigned<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if (n <= (std::numeric_limits<std::uint8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n));\n        }\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n    }\n\n    // UBJSON: write number (signed integer)\n    template < typename NumberType, typename std::enable_if <\n                   std::is_signed<NumberType>::value&&\n                   !std::is_floating_point<NumberType>::value, int >::type = 0 >\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::int8_t>(n));\n        }\n        else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n));\n        }\n        else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n));\n        }\n        else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n));\n        }\n        // LCOV_EXCL_START\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n        // LCOV_EXCL_STOP\n    }\n\n    /*!\n    @brief determine the type prefix of container values\n    */\n    CharType ubjson_prefix(const BasicJsonType& j) const noexcept\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n                return 'Z';\n\n            case value_t::boolean:\n                return j.m_value.boolean ? 'T' : 'F';\n\n            case value_t::number_integer:\n            {\n                if ((std::numeric_limits<std::int8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                {\n                    return 'i';\n                }\n                if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    return 'U';\n                }\n                if ((std::numeric_limits<std::int16_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                {\n                    return 'I';\n                }\n                if ((std::numeric_limits<std::int32_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                {\n                    return 'l';\n                }\n                if ((std::numeric_limits<std::int64_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                {\n                    return 'L';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n                {\n                    return 'i';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))\n                {\n                    return 'U';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n                {\n                    return 'I';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n                {\n                    return 'l';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n                {\n                    return 'L';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_float:\n                return get_ubjson_float_prefix(j.m_value.number_float);\n\n            case value_t::string:\n                return 'S';\n\n            case value_t::array: // fallthrough\n            case value_t::binary:\n                return '[';\n\n            case value_t::object:\n                return '{';\n\n            default:  // discarded values\n                return 'N';\n        }\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(float /*unused*/)\n    {\n        return 'd';  // float 32\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(double /*unused*/)\n    {\n        return 'D';  // float 64\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*\n    @brief write a number to output input\n    @param[in] n number of type @a NumberType\n    @tparam NumberType the type of the number\n    @tparam OutputIsLittleEndian Set to true if output data is\n                                 required to be little endian\n\n    @note This function needs to respect the system's endianess, because bytes\n          in CBOR, MessagePack, and UBJSON are stored in network order (big\n          endian) and therefore need reordering on little endian systems.\n    */\n    template<typename NumberType, bool OutputIsLittleEndian = false>\n    void write_number(const NumberType n)\n    {\n        // step 1: write number to array of length NumberType\n        std::array<CharType, sizeof(NumberType)> vec;\n        std::memcpy(vec.data(), &n, sizeof(NumberType));\n\n        // step 2: write array to output (with possible reordering)\n        if (is_little_endian != OutputIsLittleEndian)\n        {\n            // reverse byte order prior to conversion if necessary\n            std::reverse(vec.begin(), vec.end());\n        }\n\n        oa->write_characters(vec.data(), sizeof(NumberType));\n    }\n\n    void write_compact_float(const number_float_t n, detail::input_format_t format)\n    {\n        if (static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) &&\n                static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) &&\n                static_cast<double>(static_cast<float>(n)) == static_cast<double>(n))\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(static_cast<float>(n))\n                                : get_msgpack_float_prefix(static_cast<float>(n)));\n            write_number(static_cast<float>(n));\n        }\n        else\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(n)\n                                : get_msgpack_float_prefix(n));\n            write_number(n);\n        }\n    }\n\n  public:\n    // The following to_char_type functions are implement the conversion\n    // between uint8_t and CharType. In case CharType is not unsigned,\n    // such a conversion is required to allow values greater than 128.\n    // See <https://github.com/nlohmann/json/issues/1286> for a discussion.\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_signed<char>::value > * = nullptr >\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return *reinterpret_cast<char*>(&x);\n    }\n\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_unsigned<char>::value > * = nullptr >\n    static CharType to_char_type(std::uint8_t x) noexcept\n    {\n        static_assert(sizeof(std::uint8_t) == sizeof(CharType), \"size of CharType must be equal to std::uint8_t\");\n        static_assert(std::is_trivial<CharType>::value, \"CharType must be trivial\");\n        CharType result;\n        std::memcpy(&result, &x, sizeof(x));\n        return result;\n    }\n\n    template<typename C = CharType,\n             enable_if_t<std::is_unsigned<C>::value>* = nullptr>\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return x;\n    }\n\n    template < typename InputCharType, typename C = CharType,\n               enable_if_t <\n                   std::is_signed<C>::value &&\n                   std::is_signed<char>::value &&\n                   std::is_same<char, typename std::remove_cv<InputCharType>::type>::value\n                   > * = nullptr >\n    static constexpr CharType to_char_type(InputCharType x) noexcept\n    {\n        return x;\n    }\n\n  private:\n    /// whether we can assume little endianess\n    const bool is_little_endian = little_endianess();\n\n    /// the output\n    output_adapter_t<CharType> oa = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n// #include <nlohmann/detail/output/serializer.hpp>\n\n\n#include <algorithm> // reverse, remove, fill, find, none_of\n#include <array> // array\n#include <clocale> // localeconv, lconv\n#include <cmath> // labs, isfinite, isnan, signbit\n#include <cstddef> // size_t, ptrdiff_t\n#include <cstdint> // uint8_t\n#include <cstdio> // snprintf\n#include <limits> // numeric_limits\n#include <string> // string, char_traits\n#include <type_traits> // is_same\n#include <utility> // move\n\n// #include <nlohmann/detail/conversions/to_chars.hpp>\n\n\n#include <array> // array\n#include <cmath>   // signbit, isfinite\n#include <cstdint> // intN_t, uintN_t\n#include <cstring> // memcpy, memmove\n#include <limits> // numeric_limits\n#include <type_traits> // conditional\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n/*!\n@brief implements the Grisu2 algorithm for binary to decimal floating-point\nconversion.\n\nThis implementation is a slightly modified version of the reference\nimplementation which may be obtained from\nhttp://florian.loitsch.com/publications (bench.tar.gz).\n\nThe code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch.\n\nFor a detailed description of the algorithm see:\n\n[1] Loitsch, \"Printing Floating-Point Numbers Quickly and Accurately with\n    Integers\", Proceedings of the ACM SIGPLAN 2010 Conference on Programming\n    Language Design and Implementation, PLDI 2010\n[2] Burger, Dybvig, \"Printing Floating-Point Numbers Quickly and Accurately\",\n    Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language\n    Design and Implementation, PLDI 1996\n*/\nnamespace dtoa_impl\n{\n\ntemplate<typename Target, typename Source>\nTarget reinterpret_bits(const Source source)\n{\n    static_assert(sizeof(Target) == sizeof(Source), \"size mismatch\");\n\n    Target target;\n    std::memcpy(&target, &source, sizeof(Source));\n    return target;\n}\n\nstruct diyfp // f * 2^e\n{\n    static constexpr int kPrecision = 64; // = q\n\n    std::uint64_t f = 0;\n    int e = 0;\n\n    constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}\n\n    /*!\n    @brief returns x - y\n    @pre x.e == y.e and x.f >= y.f\n    */\n    static diyfp sub(const diyfp& x, const diyfp& y) noexcept\n    {\n        JSON_ASSERT(x.e == y.e);\n        JSON_ASSERT(x.f >= y.f);\n\n        return {x.f - y.f, x.e};\n    }\n\n    /*!\n    @brief returns x * y\n    @note The result is rounded. (Only the upper q bits are returned.)\n    */\n    static diyfp mul(const diyfp& x, const diyfp& y) noexcept\n    {\n        static_assert(kPrecision == 64, \"internal error\");\n\n        // Computes:\n        //  f = round((x.f * y.f) / 2^q)\n        //  e = x.e + y.e + q\n\n        // Emulate the 64-bit * 64-bit multiplication:\n        //\n        // p = u * v\n        //   = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)\n        //   = (u_lo v_lo         ) + 2^32 ((u_lo v_hi         ) + (u_hi v_lo         )) + 2^64 (u_hi v_hi         )\n        //   = (p0                ) + 2^32 ((p1                ) + (p2                )) + 2^64 (p3                )\n        //   = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3                )\n        //   = (p0_lo             ) + 2^32 (p0_hi + p1_lo + p2_lo                      ) + 2^64 (p1_hi + p2_hi + p3)\n        //   = (p0_lo             ) + 2^32 (Q                                          ) + 2^64 (H                 )\n        //   = (p0_lo             ) + 2^32 (Q_lo + 2^32 Q_hi                           ) + 2^64 (H                 )\n        //\n        // (Since Q might be larger than 2^32 - 1)\n        //\n        //   = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)\n        //\n        // (Q_hi + H does not overflow a 64-bit int)\n        //\n        //   = p_lo + 2^64 p_hi\n\n        const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;\n        const std::uint64_t u_hi = x.f >> 32u;\n        const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;\n        const std::uint64_t v_hi = y.f >> 32u;\n\n        const std::uint64_t p0 = u_lo * v_lo;\n        const std::uint64_t p1 = u_lo * v_hi;\n        const std::uint64_t p2 = u_hi * v_lo;\n        const std::uint64_t p3 = u_hi * v_hi;\n\n        const std::uint64_t p0_hi = p0 >> 32u;\n        const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;\n        const std::uint64_t p1_hi = p1 >> 32u;\n        const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;\n        const std::uint64_t p2_hi = p2 >> 32u;\n\n        std::uint64_t Q = p0_hi + p1_lo + p2_lo;\n\n        // The full product might now be computed as\n        //\n        // p_hi = p3 + p2_hi + p1_hi + (Q >> 32)\n        // p_lo = p0_lo + (Q << 32)\n        //\n        // But in this particular case here, the full p_lo is not required.\n        // Effectively we only need to add the highest bit in p_lo to p_hi (and\n        // Q_hi + 1 does not overflow).\n\n        Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up\n\n        const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);\n\n        return {h, x.e + y.e + 64};\n    }\n\n    /*!\n    @brief normalize x such that the significand is >= 2^(q-1)\n    @pre x.f != 0\n    */\n    static diyfp normalize(diyfp x) noexcept\n    {\n        JSON_ASSERT(x.f != 0);\n\n        while ((x.f >> 63u) == 0)\n        {\n            x.f <<= 1u;\n            x.e--;\n        }\n\n        return x;\n    }\n\n    /*!\n    @brief normalize x such that the result has the exponent E\n    @pre e >= x.e and the upper e - x.e bits of x.f must be zero.\n    */\n    static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept\n    {\n        const int delta = x.e - target_exponent;\n\n        JSON_ASSERT(delta >= 0);\n        JSON_ASSERT(((x.f << delta) >> delta) == x.f);\n\n        return {x.f << delta, target_exponent};\n    }\n};\n\nstruct boundaries\n{\n    diyfp w;\n    diyfp minus;\n    diyfp plus;\n};\n\n/*!\nCompute the (normalized) diyfp representing the input number 'value' and its\nboundaries.\n\n@pre value must be finite and positive\n*/\ntemplate<typename FloatType>\nboundaries compute_boundaries(FloatType value)\n{\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // Convert the IEEE representation into a diyfp.\n    //\n    // If v is denormal:\n    //      value = 0.F * 2^(1 - bias) = (          F) * 2^(1 - bias - (p-1))\n    // If v is normalized:\n    //      value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1))\n\n    static_assert(std::numeric_limits<FloatType>::is_iec559,\n                  \"internal error: dtoa_short requires an IEEE-754 floating-point implementation\");\n\n    constexpr int      kPrecision = std::numeric_limits<FloatType>::digits; // = p (includes the hidden bit)\n    constexpr int      kBias      = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);\n    constexpr int      kMinExp    = 1 - kBias;\n    constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1)\n\n    using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;\n\n    const std::uint64_t bits = reinterpret_bits<bits_type>(value);\n    const std::uint64_t E = bits >> (kPrecision - 1);\n    const std::uint64_t F = bits & (kHiddenBit - 1);\n\n    const bool is_denormal = E == 0;\n    const diyfp v = is_denormal\n                    ? diyfp(F, kMinExp)\n                    : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);\n\n    // Compute the boundaries m- and m+ of the floating-point value\n    // v = f * 2^e.\n    //\n    // Determine v- and v+, the floating-point predecessor and successor if v,\n    // respectively.\n    //\n    //      v- = v - 2^e        if f != 2^(p-1) or e == e_min                (A)\n    //         = v - 2^(e-1)    if f == 2^(p-1) and e > e_min                (B)\n    //\n    //      v+ = v + 2^e\n    //\n    // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_\n    // between m- and m+ round to v, regardless of how the input rounding\n    // algorithm breaks ties.\n    //\n    //      ---+-------------+-------------+-------------+-------------+---  (A)\n    //         v-            m-            v             m+            v+\n    //\n    //      -----------------+------+------+-------------+-------------+---  (B)\n    //                       v-     m-     v             m+            v+\n\n    const bool lower_boundary_is_closer = F == 0 && E > 1;\n    const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);\n    const diyfp m_minus = lower_boundary_is_closer\n                          ? diyfp(4 * v.f - 1, v.e - 2)  // (B)\n                          : diyfp(2 * v.f - 1, v.e - 1); // (A)\n\n    // Determine the normalized w+ = m+.\n    const diyfp w_plus = diyfp::normalize(m_plus);\n\n    // Determine w- = m- such that e_(w-) = e_(w+).\n    const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);\n\n    return {diyfp::normalize(v), w_minus, w_plus};\n}\n\n// Given normalized diyfp w, Grisu needs to find a (normalized) cached\n// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies\n// within a certain range [alpha, gamma] (Definition 3.2 from [1])\n//\n//      alpha <= e = e_c + e_w + q <= gamma\n//\n// or\n//\n//      f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q\n//                          <= f_c * f_w * 2^gamma\n//\n// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies\n//\n//      2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma\n//\n// or\n//\n//      2^(q - 2 + alpha) <= c * w < 2^(q + gamma)\n//\n// The choice of (alpha,gamma) determines the size of the table and the form of\n// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well\n// in practice:\n//\n// The idea is to cut the number c * w = f * 2^e into two parts, which can be\n// processed independently: An integral part p1, and a fractional part p2:\n//\n//      f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e\n//              = (f div 2^-e) + (f mod 2^-e) * 2^e\n//              = p1 + p2 * 2^e\n//\n// The conversion of p1 into decimal form requires a series of divisions and\n// modulos by (a power of) 10. These operations are faster for 32-bit than for\n// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be\n// achieved by choosing\n//\n//      -e >= 32   or   e <= -32 := gamma\n//\n// In order to convert the fractional part\n//\n//      p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ...\n//\n// into decimal form, the fraction is repeatedly multiplied by 10 and the digits\n// d[-i] are extracted in order:\n//\n//      (10 * p2) div 2^-e = d[-1]\n//      (10 * p2) mod 2^-e = d[-2] / 10^1 + ...\n//\n// The multiplication by 10 must not overflow. It is sufficient to choose\n//\n//      10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64.\n//\n// Since p2 = f mod 2^-e < 2^-e,\n//\n//      -e <= 60   or   e >= -60 := alpha\n\nconstexpr int kAlpha = -60;\nconstexpr int kGamma = -32;\n\nstruct cached_power // c = f * 2^e ~= 10^k\n{\n    std::uint64_t f;\n    int e;\n    int k;\n};\n\n/*!\nFor a normalized diyfp w = f * 2^e, this function returns a (normalized) cached\npower-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c\nsatisfies (Definition 3.2 from [1])\n\n     alpha <= e_c + e + q <= gamma.\n*/\ninline cached_power get_cached_power_for_binary_exponent(int e)\n{\n    // Now\n    //\n    //      alpha <= e_c + e + q <= gamma                                    (1)\n    //      ==> f_c * 2^alpha <= c * 2^e * 2^q\n    //\n    // and since the c's are normalized, 2^(q-1) <= f_c,\n    //\n    //      ==> 2^(q - 1 + alpha) <= c * 2^(e + q)\n    //      ==> 2^(alpha - e - 1) <= c\n    //\n    // If c were an exact power of ten, i.e. c = 10^k, one may determine k as\n    //\n    //      k = ceil( log_10( 2^(alpha - e - 1) ) )\n    //        = ceil( (alpha - e - 1) * log_10(2) )\n    //\n    // From the paper:\n    // \"In theory the result of the procedure could be wrong since c is rounded,\n    //  and the computation itself is approximated [...]. In practice, however,\n    //  this simple function is sufficient.\"\n    //\n    // For IEEE double precision floating-point numbers converted into\n    // normalized diyfp's w = f * 2^e, with q = 64,\n    //\n    //      e >= -1022      (min IEEE exponent)\n    //           -52        (p - 1)\n    //           -52        (p - 1, possibly normalize denormal IEEE numbers)\n    //           -11        (normalize the diyfp)\n    //         = -1137\n    //\n    // and\n    //\n    //      e <= +1023      (max IEEE exponent)\n    //           -52        (p - 1)\n    //           -11        (normalize the diyfp)\n    //         = 960\n    //\n    // This binary exponent range [-1137,960] results in a decimal exponent\n    // range [-307,324]. One does not need to store a cached power for each\n    // k in this range. For each such k it suffices to find a cached power\n    // such that the exponent of the product lies in [alpha,gamma].\n    // This implies that the difference of the decimal exponents of adjacent\n    // table entries must be less than or equal to\n    //\n    //      floor( (gamma - alpha) * log_10(2) ) = 8.\n    //\n    // (A smaller distance gamma-alpha would require a larger table.)\n\n    // NB:\n    // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34.\n\n    constexpr int kCachedPowersMinDecExp = -300;\n    constexpr int kCachedPowersDecStep = 8;\n\n    static constexpr std::array<cached_power, 79> kCachedPowers =\n    {\n        {\n            { 0xAB70FE17C79AC6CA, -1060, -300 },\n            { 0xFF77B1FCBEBCDC4F, -1034, -292 },\n            { 0xBE5691EF416BD60C, -1007, -284 },\n            { 0x8DD01FAD907FFC3C,  -980, -276 },\n            { 0xD3515C2831559A83,  -954, -268 },\n            { 0x9D71AC8FADA6C9B5,  -927, -260 },\n            { 0xEA9C227723EE8BCB,  -901, -252 },\n            { 0xAECC49914078536D,  -874, -244 },\n            { 0x823C12795DB6CE57,  -847, -236 },\n            { 0xC21094364DFB5637,  -821, -228 },\n            { 0x9096EA6F3848984F,  -794, -220 },\n            { 0xD77485CB25823AC7,  -768, -212 },\n            { 0xA086CFCD97BF97F4,  -741, -204 },\n            { 0xEF340A98172AACE5,  -715, -196 },\n            { 0xB23867FB2A35B28E,  -688, -188 },\n            { 0x84C8D4DFD2C63F3B,  -661, -180 },\n            { 0xC5DD44271AD3CDBA,  -635, -172 },\n            { 0x936B9FCEBB25C996,  -608, -164 },\n            { 0xDBAC6C247D62A584,  -582, -156 },\n            { 0xA3AB66580D5FDAF6,  -555, -148 },\n            { 0xF3E2F893DEC3F126,  -529, -140 },\n            { 0xB5B5ADA8AAFF80B8,  -502, -132 },\n            { 0x87625F056C7C4A8B,  -475, -124 },\n            { 0xC9BCFF6034C13053,  -449, -116 },\n            { 0x964E858C91BA2655,  -422, -108 },\n            { 0xDFF9772470297EBD,  -396, -100 },\n            { 0xA6DFBD9FB8E5B88F,  -369,  -92 },\n            { 0xF8A95FCF88747D94,  -343,  -84 },\n            { 0xB94470938FA89BCF,  -316,  -76 },\n            { 0x8A08F0F8BF0F156B,  -289,  -68 },\n            { 0xCDB02555653131B6,  -263,  -60 },\n            { 0x993FE2C6D07B7FAC,  -236,  -52 },\n            { 0xE45C10C42A2B3B06,  -210,  -44 },\n            { 0xAA242499697392D3,  -183,  -36 },\n            { 0xFD87B5F28300CA0E,  -157,  -28 },\n            { 0xBCE5086492111AEB,  -130,  -20 },\n            { 0x8CBCCC096F5088CC,  -103,  -12 },\n            { 0xD1B71758E219652C,   -77,   -4 },\n            { 0x9C40000000000000,   -50,    4 },\n            { 0xE8D4A51000000000,   -24,   12 },\n            { 0xAD78EBC5AC620000,     3,   20 },\n            { 0x813F3978F8940984,    30,   28 },\n            { 0xC097CE7BC90715B3,    56,   36 },\n            { 0x8F7E32CE7BEA5C70,    83,   44 },\n            { 0xD5D238A4ABE98068,   109,   52 },\n            { 0x9F4F2726179A2245,   136,   60 },\n            { 0xED63A231D4C4FB27,   162,   68 },\n            { 0xB0DE65388CC8ADA8,   189,   76 },\n            { 0x83C7088E1AAB65DB,   216,   84 },\n            { 0xC45D1DF942711D9A,   242,   92 },\n            { 0x924D692CA61BE758,   269,  100 },\n            { 0xDA01EE641A708DEA,   295,  108 },\n            { 0xA26DA3999AEF774A,   322,  116 },\n            { 0xF209787BB47D6B85,   348,  124 },\n            { 0xB454E4A179DD1877,   375,  132 },\n            { 0x865B86925B9BC5C2,   402,  140 },\n            { 0xC83553C5C8965D3D,   428,  148 },\n            { 0x952AB45CFA97A0B3,   455,  156 },\n            { 0xDE469FBD99A05FE3,   481,  164 },\n            { 0xA59BC234DB398C25,   508,  172 },\n            { 0xF6C69A72A3989F5C,   534,  180 },\n            { 0xB7DCBF5354E9BECE,   561,  188 },\n            { 0x88FCF317F22241E2,   588,  196 },\n            { 0xCC20CE9BD35C78A5,   614,  204 },\n            { 0x98165AF37B2153DF,   641,  212 },\n            { 0xE2A0B5DC971F303A,   667,  220 },\n            { 0xA8D9D1535CE3B396,   694,  228 },\n            { 0xFB9B7CD9A4A7443C,   720,  236 },\n            { 0xBB764C4CA7A44410,   747,  244 },\n            { 0x8BAB8EEFB6409C1A,   774,  252 },\n            { 0xD01FEF10A657842C,   800,  260 },\n            { 0x9B10A4E5E9913129,   827,  268 },\n            { 0xE7109BFBA19C0C9D,   853,  276 },\n            { 0xAC2820D9623BF429,   880,  284 },\n            { 0x80444B5E7AA7CF85,   907,  292 },\n            { 0xBF21E44003ACDD2D,   933,  300 },\n            { 0x8E679C2F5E44FF8F,   960,  308 },\n            { 0xD433179D9C8CB841,   986,  316 },\n            { 0x9E19DB92B4E31BA9,  1013,  324 },\n        }\n    };\n\n    // This computation gives exactly the same results for k as\n    //      k = ceil((kAlpha - e - 1) * 0.30102999566398114)\n    // for |e| <= 1500, but doesn't require floating-point operations.\n    // NB: log_10(2) ~= 78913 / 2^18\n    JSON_ASSERT(e >= -1500);\n    JSON_ASSERT(e <=  1500);\n    const int f = kAlpha - e - 1;\n    const int k = (f * 78913) / (1 << 18) + static_cast<int>(f > 0);\n\n    const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;\n    JSON_ASSERT(index >= 0);\n    JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size());\n\n    const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)];\n    JSON_ASSERT(kAlpha <= cached.e + e + 64);\n    JSON_ASSERT(kGamma >= cached.e + e + 64);\n\n    return cached;\n}\n\n/*!\nFor n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k.\nFor n == 0, returns 1 and sets pow10 := 1.\n*/\ninline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10)\n{\n    // LCOV_EXCL_START\n    if (n >= 1000000000)\n    {\n        pow10 = 1000000000;\n        return 10;\n    }\n    // LCOV_EXCL_STOP\n    else if (n >= 100000000)\n    {\n        pow10 = 100000000;\n        return  9;\n    }\n    else if (n >= 10000000)\n    {\n        pow10 = 10000000;\n        return  8;\n    }\n    else if (n >= 1000000)\n    {\n        pow10 = 1000000;\n        return  7;\n    }\n    else if (n >= 100000)\n    {\n        pow10 = 100000;\n        return  6;\n    }\n    else if (n >= 10000)\n    {\n        pow10 = 10000;\n        return  5;\n    }\n    else if (n >= 1000)\n    {\n        pow10 = 1000;\n        return  4;\n    }\n    else if (n >= 100)\n    {\n        pow10 = 100;\n        return  3;\n    }\n    else if (n >= 10)\n    {\n        pow10 = 10;\n        return  2;\n    }\n    else\n    {\n        pow10 = 1;\n        return 1;\n    }\n}\n\ninline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta,\n                         std::uint64_t rest, std::uint64_t ten_k)\n{\n    JSON_ASSERT(len >= 1);\n    JSON_ASSERT(dist <= delta);\n    JSON_ASSERT(rest <= delta);\n    JSON_ASSERT(ten_k > 0);\n\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    //                                  ten_k\n    //                                <------>\n    //                                       <---- rest ---->\n    // --------------[------------------+----+--------------]--------------\n    //                                  w    V\n    //                                       = buf * 10^k\n    //\n    // ten_k represents a unit-in-the-last-place in the decimal representation\n    // stored in buf.\n    // Decrement buf by ten_k while this takes buf closer to w.\n\n    // The tests are written in this order to avoid overflow in unsigned\n    // integer arithmetic.\n\n    while (rest < dist\n            && delta - rest >= ten_k\n            && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))\n    {\n        JSON_ASSERT(buf[len - 1] != '0');\n        buf[len - 1]--;\n        rest += ten_k;\n    }\n}\n\n/*!\nGenerates V = buffer * 10^decimal_exponent, such that M- <= V <= M+.\nM- and M+ must be normalized and share the same exponent -60 <= e <= -32.\n*/\ninline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent,\n                             diyfp M_minus, diyfp w, diyfp M_plus)\n{\n    static_assert(kAlpha >= -60, \"internal error\");\n    static_assert(kGamma <= -32, \"internal error\");\n\n    // Generates the digits (and the exponent) of a decimal floating-point\n    // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's\n    // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma.\n    //\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    // Grisu2 generates the digits of M+ from left to right and stops as soon as\n    // V is in [M-,M+].\n\n    JSON_ASSERT(M_plus.e >= kAlpha);\n    JSON_ASSERT(M_plus.e <= kGamma);\n\n    std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e)\n    std::uint64_t dist  = diyfp::sub(M_plus, w      ).f; // (significand of (M+ - w ), implicit exponent is e)\n\n    // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0):\n    //\n    //      M+ = f * 2^e\n    //         = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e\n    //         = ((p1        ) * 2^-e + (p2        )) * 2^e\n    //         = p1 + p2 * 2^e\n\n    const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);\n\n    auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.)\n    std::uint64_t p2 = M_plus.f & (one.f - 1);                    // p2 = f mod 2^-e\n\n    // 1)\n    //\n    // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0]\n\n    JSON_ASSERT(p1 > 0);\n\n    std::uint32_t pow10;\n    const int k = find_largest_pow10(p1, pow10);\n\n    //      10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1)\n    //\n    //      p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1))\n    //         = (d[k-1]         ) * 10^(k-1) + (p1 mod 10^(k-1))\n    //\n    //      M+ = p1                                             + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1))          + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e\n    //         = d[k-1] * 10^(k-1) + (                         rest) * 2^e\n    //\n    // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0)\n    //\n    //      p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0]\n    //\n    // but stop as soon as\n    //\n    //      rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e\n\n    int n = k;\n    while (n > 0)\n    {\n        // Invariants:\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)    (buffer = 0 for n = k)\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        //\n        const std::uint32_t d = p1 / pow10;  // d = p1 div 10^(n-1)\n        const std::uint32_t r = p1 % pow10;  // r = p1 mod 10^(n-1)\n        //\n        //      M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e\n        //         = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e)\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(n-1) + (r + p2 * 2^e)\n        //\n        p1 = r;\n        n--;\n        //\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)\n        //      pow10 = 10^n\n        //\n\n        // Now check if enough digits have been generated.\n        // Compute\n        //\n        //      p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e\n        //\n        // Note:\n        // Since rest and delta share the same exponent e, it suffices to\n        // compare the significands.\n        const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2;\n        if (rest <= delta)\n        {\n            // V = buffer * 10^n, with M- <= V <= M+.\n\n            decimal_exponent += n;\n\n            // We may now just stop. But instead look if the buffer could be\n            // decremented to bring V closer to w.\n            //\n            // pow10 = 10^n is now 1 ulp in the decimal representation V.\n            // The rounding procedure works with diyfp's with an implicit\n            // exponent of e.\n            //\n            //      10^n = (10^n * 2^-e) * 2^e = ulp * 2^e\n            //\n            const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e;\n            grisu2_round(buffer, length, dist, delta, rest, ten_n);\n\n            return;\n        }\n\n        pow10 /= 10;\n        //\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        // Invariants restored.\n    }\n\n    // 2)\n    //\n    // The digits of the integral part have been generated:\n    //\n    //      M+ = d[k-1]...d[1]d[0] + p2 * 2^e\n    //         = buffer            + p2 * 2^e\n    //\n    // Now generate the digits of the fractional part p2 * 2^e.\n    //\n    // Note:\n    // No decimal point is generated: the exponent is adjusted instead.\n    //\n    // p2 actually represents the fraction\n    //\n    //      p2 * 2^e\n    //          = p2 / 2^-e\n    //          = d[-1] / 10^1 + d[-2] / 10^2 + ...\n    //\n    // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...)\n    //\n    //      p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m\n    //                      + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...)\n    //\n    // using\n    //\n    //      10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e)\n    //                = (                   d) * 2^-e + (                   r)\n    //\n    // or\n    //      10^m * p2 * 2^e = d + r * 2^e\n    //\n    // i.e.\n    //\n    //      M+ = buffer + p2 * 2^e\n    //         = buffer + 10^-m * (d + r * 2^e)\n    //         = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e\n    //\n    // and stop as soon as 10^-m * r * 2^e <= delta * 2^e\n\n    JSON_ASSERT(p2 > delta);\n\n    int m = 0;\n    for (;;)\n    {\n        // Invariant:\n        //      M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e\n        //         = buffer * 10^-m + 10^-m * (p2                                 ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (10 * p2)                   ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e\n        //\n        JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);\n        p2 *= 10;\n        const std::uint64_t d = p2 >> -one.e;     // d = (10 * p2) div 2^-e\n        const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e\n        //\n        //      M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e))\n        //         = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        p2 = r;\n        m++;\n        //\n        //      M+ = buffer * 10^-m + 10^-m * p2 * 2^e\n        // Invariant restored.\n\n        // Check if enough digits have been generated.\n        //\n        //      10^-m * p2 * 2^e <= delta * 2^e\n        //              p2 * 2^e <= 10^m * delta * 2^e\n        //                    p2 <= 10^m * delta\n        delta *= 10;\n        dist  *= 10;\n        if (p2 <= delta)\n        {\n            break;\n        }\n    }\n\n    // V = buffer * 10^-m, with M- <= V <= M+.\n\n    decimal_exponent -= m;\n\n    // 1 ulp in the decimal representation is now 10^-m.\n    // Since delta and dist are now scaled by 10^m, we need to do the\n    // same with ulp in order to keep the units in sync.\n    //\n    //      10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e\n    //\n    const std::uint64_t ten_m = one.f;\n    grisu2_round(buffer, length, dist, delta, p2, ten_m);\n\n    // By construction this algorithm generates the shortest possible decimal\n    // number (Loitsch, Theorem 6.2) which rounds back to w.\n    // For an input number of precision p, at least\n    //\n    //      N = 1 + ceil(p * log_10(2))\n    //\n    // decimal digits are sufficient to identify all binary floating-point\n    // numbers (Matula, \"In-and-Out conversions\").\n    // This implies that the algorithm does not produce more than N decimal\n    // digits.\n    //\n    //      N = 17 for p = 53 (IEEE double precision)\n    //      N = 9  for p = 24 (IEEE single precision)\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline void grisu2(char* buf, int& len, int& decimal_exponent,\n                   diyfp m_minus, diyfp v, diyfp m_plus)\n{\n    JSON_ASSERT(m_plus.e == m_minus.e);\n    JSON_ASSERT(m_plus.e == v.e);\n\n    //  --------(-----------------------+-----------------------)--------    (A)\n    //          m-                      v                       m+\n    //\n    //  --------------------(-----------+-----------------------)--------    (B)\n    //                      m-          v                       m+\n    //\n    // First scale v (and m- and m+) such that the exponent is in the range\n    // [alpha, gamma].\n\n    const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);\n\n    const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k\n\n    // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma]\n    const diyfp w       = diyfp::mul(v,       c_minus_k);\n    const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);\n    const diyfp w_plus  = diyfp::mul(m_plus,  c_minus_k);\n\n    //  ----(---+---)---------------(---+---)---------------(---+---)----\n    //          w-                      w                       w+\n    //          = c*m-                  = c*v                   = c*m+\n    //\n    // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and\n    // w+ are now off by a small amount.\n    // In fact:\n    //\n    //      w - v * 10^k < 1 ulp\n    //\n    // To account for this inaccuracy, add resp. subtract 1 ulp.\n    //\n    //  --------+---[---------------(---+---)---------------]---+--------\n    //          w-  M-                  w                   M+  w+\n    //\n    // Now any number in [M-, M+] (bounds included) will round to w when input,\n    // regardless of how the input rounding algorithm breaks ties.\n    //\n    // And digit_gen generates the shortest possible such number in [M-, M+].\n    // Note that this does not mean that Grisu2 always generates the shortest\n    // possible number in the interval (m-, m+).\n    const diyfp M_minus(w_minus.f + 1, w_minus.e);\n    const diyfp M_plus (w_plus.f  - 1, w_plus.e );\n\n    decimal_exponent = -cached.k; // = -(-k) = k\n\n    grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1)\nvoid grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)\n{\n    static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,\n                  \"internal error: not enough precision\");\n\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // If the neighbors (and boundaries) of 'value' are always computed for double-precision\n    // numbers, all float's can be recovered using strtod (and strtof). However, the resulting\n    // decimal representations are not exactly \"short\".\n    //\n    // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars)\n    // says \"value is converted to a string as if by std::sprintf in the default (\"C\") locale\"\n    // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars'\n    // does.\n    // On the other hand, the documentation for 'std::to_chars' requires that \"parsing the\n    // representation using the corresponding std::from_chars function recovers value exactly\". That\n    // indicates that single precision floating-point numbers should be recovered using\n    // 'std::strtof'.\n    //\n    // NB: If the neighbors are computed for single-precision numbers, there is a single float\n    //     (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision\n    //     value is off by 1 ulp.\n#if 0\n    const boundaries w = compute_boundaries(static_cast<double>(value));\n#else\n    const boundaries w = compute_boundaries(value);\n#endif\n\n    grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);\n}\n\n/*!\n@brief appends a decimal representation of e to buf\n@return a pointer to the element following the exponent.\n@pre -1000 < e < 1000\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* append_exponent(char* buf, int e)\n{\n    JSON_ASSERT(e > -1000);\n    JSON_ASSERT(e <  1000);\n\n    if (e < 0)\n    {\n        e = -e;\n        *buf++ = '-';\n    }\n    else\n    {\n        *buf++ = '+';\n    }\n\n    auto k = static_cast<std::uint32_t>(e);\n    if (k < 10)\n    {\n        // Always print at least two digits in the exponent.\n        // This is for compatibility with printf(\"%g\").\n        *buf++ = '0';\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else if (k < 100)\n    {\n        *buf++ = static_cast<char>('0' + k / 10);\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else\n    {\n        *buf++ = static_cast<char>('0' + k / 100);\n        k %= 100;\n        *buf++ = static_cast<char>('0' + k / 10);\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n\n    return buf;\n}\n\n/*!\n@brief prettify v = buf * 10^decimal_exponent\n\nIf v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point\nnotation. Otherwise it will be printed in exponential notation.\n\n@pre min_exp < 0\n@pre max_exp > 0\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* format_buffer(char* buf, int len, int decimal_exponent,\n                           int min_exp, int max_exp)\n{\n    JSON_ASSERT(min_exp < 0);\n    JSON_ASSERT(max_exp > 0);\n\n    const int k = len;\n    const int n = len + decimal_exponent;\n\n    // v = buf * 10^(n-k)\n    // k is the length of the buffer (number of decimal digits)\n    // n is the position of the decimal point relative to the start of the buffer.\n\n    if (k <= n && n <= max_exp)\n    {\n        // digits[000]\n        // len <= max_exp + 2\n\n        std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));\n        // Make it look like a floating-point number (#362, #378)\n        buf[n + 0] = '.';\n        buf[n + 1] = '0';\n        return buf + (static_cast<size_t>(n) + 2);\n    }\n\n    if (0 < n && n <= max_exp)\n    {\n        // dig.its\n        // len <= max_digits10 + 1\n\n        JSON_ASSERT(k > n);\n\n        std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));\n        buf[n] = '.';\n        return buf + (static_cast<size_t>(k) + 1U);\n    }\n\n    if (min_exp < n && n <= 0)\n    {\n        // 0.[000]digits\n        // len <= 2 + (-min_exp - 1) + max_digits10\n\n        std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));\n        buf[0] = '0';\n        buf[1] = '.';\n        std::memset(buf + 2, '0', static_cast<size_t>(-n));\n        return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));\n    }\n\n    if (k == 1)\n    {\n        // dE+123\n        // len <= 1 + 5\n\n        buf += 1;\n    }\n    else\n    {\n        // d.igitsE+123\n        // len <= max_digits10 + 1 + 5\n\n        std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);\n        buf[1] = '.';\n        buf += 1 + static_cast<size_t>(k);\n    }\n\n    *buf++ = 'e';\n    return append_exponent(buf, n - 1);\n}\n\n} // namespace dtoa_impl\n\n/*!\n@brief generates a decimal representation of the floating-point number value in [first, last).\n\nThe format of the resulting decimal representation is similar to printf's %g\nformat. Returns an iterator pointing past-the-end of the decimal representation.\n\n@note The input number must be finite, i.e. NaN's and Inf's are not supported.\n@note The buffer must be large enough.\n@note The result is NOT null-terminated.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1, 2)\nJSON_HEDLEY_RETURNS_NON_NULL\nchar* to_chars(char* first, const char* last, FloatType value)\n{\n    static_cast<void>(last); // maybe unused - fix warning\n    JSON_ASSERT(std::isfinite(value));\n\n    // Use signbit(value) instead of (value < 0) since signbit works for -0.\n    if (std::signbit(value))\n    {\n        value = -value;\n        *first++ = '-';\n    }\n\n    if (value == 0) // +-0\n    {\n        *first++ = '0';\n        // Make it look like a floating-point number (#362, #378)\n        *first++ = '.';\n        *first++ = '0';\n        return first;\n    }\n\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);\n\n    // Compute v = buffer * 10^decimal_exponent.\n    // The decimal digits are stored in the buffer, which needs to be interpreted\n    // as an unsigned decimal integer.\n    // len is the length of the buffer, i.e. the number of decimal digits.\n    int len = 0;\n    int decimal_exponent = 0;\n    dtoa_impl::grisu2(first, len, decimal_exponent, value);\n\n    JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);\n\n    // Format the buffer like printf(\"%.*g\", prec, value)\n    constexpr int kMinExp = -4;\n    // Use digits10 here to increase compatibility with version 2.\n    constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;\n\n    JSON_ASSERT(last - first >= kMaxExp + 2);\n    JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);\n\n    return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp);\n}\n\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/output/binary_writer.hpp>\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////\n// serialization //\n///////////////////\n\n/// how to treat decoding errors\nenum class error_handler_t\n{\n    strict,  ///< throw a type_error exception in case of invalid UTF-8\n    replace, ///< replace invalid UTF-8 sequences with U+FFFD\n    ignore   ///< ignore invalid UTF-8 sequences\n};\n\ntemplate<typename BasicJsonType>\nclass serializer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using binary_char_t = typename BasicJsonType::binary_t::value_type;\n    static constexpr std::uint8_t UTF8_ACCEPT = 0;\n    static constexpr std::uint8_t UTF8_REJECT = 1;\n\n  public:\n    /*!\n    @param[in] s  output stream to serialize to\n    @param[in] ichar  indentation character to use\n    @param[in] error_handler_  how to react on decoding errors\n    */\n    serializer(output_adapter_t<char> s, const char ichar,\n               error_handler_t error_handler_ = error_handler_t::strict)\n        : o(std::move(s))\n        , loc(std::localeconv())\n        , thousands_sep(loc->thousands_sep == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->thousands_sep)))\n        , decimal_point(loc->decimal_point == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->decimal_point)))\n        , indent_char(ichar)\n        , indent_string(512, indent_char)\n        , error_handler(error_handler_)\n    {}\n\n    // delete because of pointer members\n    serializer(const serializer&) = delete;\n    serializer& operator=(const serializer&) = delete;\n    serializer(serializer&&) = delete;\n    serializer& operator=(serializer&&) = delete;\n    ~serializer() = default;\n\n    /*!\n    @brief internal implementation of the serialization function\n\n    This function is called by the public member function dump and organizes\n    the serialization internally. The indentation level is propagated as\n    additional parameter. In case of arrays and objects, the function is\n    called recursively.\n\n    - strings and object keys are escaped using `escape_string()`\n    - integer numbers are converted implicitly via `operator<<`\n    - floating-point numbers are converted to a string using `\"%g\"` format\n    - binary values are serialized as objects containing the subtype and the\n      byte array\n\n    @param[in] val               value to serialize\n    @param[in] pretty_print      whether the output shall be pretty-printed\n    @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters\n    in the output are escaped with `\\uXXXX` sequences, and the result consists\n    of ASCII characters only.\n    @param[in] indent_step       the indent level\n    @param[in] current_indent    the current indent level (only used internally)\n    */\n    void dump(const BasicJsonType& val,\n              const bool pretty_print,\n              const bool ensure_ascii,\n              const unsigned int indent_step,\n              const unsigned int current_indent = 0)\n    {\n        switch (val.m_type)\n        {\n            case value_t::object:\n            {\n                if (val.m_value.object->empty())\n                {\n                    o->write_characters(\"{}\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    auto i = val.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\": \", 3);\n                        dump(i->second, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\": \", 3);\n                    dump(i->second, true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_character('{');\n\n                    // first n-1 elements\n                    auto i = val.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\":\", 2);\n                        dump(i->second, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\":\", 2);\n                    dump(i->second, false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character('}');\n                }\n\n                return;\n            }\n\n            case value_t::array:\n            {\n                if (val.m_value.array->empty())\n                {\n                    o->write_characters(\"[]\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"[\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    for (auto i = val.m_value.array->cbegin();\n                            i != val.m_value.array->cend() - 1; ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        dump(*i, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_value.array->empty());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character(']');\n                }\n                else\n                {\n                    o->write_character('[');\n\n                    // first n-1 elements\n                    for (auto i = val.m_value.array->cbegin();\n                            i != val.m_value.array->cend() - 1; ++i)\n                    {\n                        dump(*i, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_value.array->empty());\n                    dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character(']');\n                }\n\n                return;\n            }\n\n            case value_t::string:\n            {\n                o->write_character('\\\"');\n                dump_escaped(*val.m_value.string, ensure_ascii);\n                o->write_character('\\\"');\n                return;\n            }\n\n            case value_t::binary:\n            {\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"bytes\\\": [\", 10);\n\n                    if (!val.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_value.binary->cbegin();\n                                i != val.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_characters(\", \", 2);\n                        }\n                        dump_integer(val.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\n\", 3);\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"subtype\\\": \", 11);\n                    if (val.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_value.binary->subtype());\n                    }\n                    else\n                    {\n                        o->write_characters(\"null\", 4);\n                    }\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_characters(\"{\\\"bytes\\\":[\", 10);\n\n                    if (!val.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_value.binary->cbegin();\n                                i != val.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_character(',');\n                        }\n                        dump_integer(val.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\\"subtype\\\":\", 12);\n                    if (val.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_value.binary->subtype());\n                        o->write_character('}');\n                    }\n                    else\n                    {\n                        o->write_characters(\"null}\", 5);\n                    }\n                }\n                return;\n            }\n\n            case value_t::boolean:\n            {\n                if (val.m_value.boolean)\n                {\n                    o->write_characters(\"true\", 4);\n                }\n                else\n                {\n                    o->write_characters(\"false\", 5);\n                }\n                return;\n            }\n\n            case value_t::number_integer:\n            {\n                dump_integer(val.m_value.number_integer);\n                return;\n            }\n\n            case value_t::number_unsigned:\n            {\n                dump_integer(val.m_value.number_unsigned);\n                return;\n            }\n\n            case value_t::number_float:\n            {\n                dump_float(val.m_value.number_float);\n                return;\n            }\n\n            case value_t::discarded:\n            {\n                o->write_characters(\"<discarded>\", 11);\n                return;\n            }\n\n            case value_t::null:\n            {\n                o->write_characters(\"null\", 4);\n                return;\n            }\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n    }\n\n  private:\n    /*!\n    @brief dump escaped string\n\n    Escape a string by replacing certain special characters by a sequence of an\n    escape character (backslash) and another character and other control\n    characters by a sequence of \"\\u\" followed by a four-digit hex\n    representation. The escaped string is written to output stream @a o.\n\n    @param[in] s  the string to escape\n    @param[in] ensure_ascii  whether to escape non-ASCII characters with\n                             \\uXXXX sequences\n\n    @complexity Linear in the length of string @a s.\n    */\n    void dump_escaped(const string_t& s, const bool ensure_ascii)\n    {\n        std::uint32_t codepoint;\n        std::uint8_t state = UTF8_ACCEPT;\n        std::size_t bytes = 0;  // number of bytes written to string_buffer\n\n        // number of bytes written at the point of the last valid byte\n        std::size_t bytes_after_last_accept = 0;\n        std::size_t undumped_chars = 0;\n\n        for (std::size_t i = 0; i < s.size(); ++i)\n        {\n            const auto byte = static_cast<uint8_t>(s[i]);\n\n            switch (decode(state, codepoint, byte))\n            {\n                case UTF8_ACCEPT:  // decode found a new code point\n                {\n                    switch (codepoint)\n                    {\n                        case 0x08: // backspace\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'b';\n                            break;\n                        }\n\n                        case 0x09: // horizontal tab\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 't';\n                            break;\n                        }\n\n                        case 0x0A: // newline\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'n';\n                            break;\n                        }\n\n                        case 0x0C: // formfeed\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'f';\n                            break;\n                        }\n\n                        case 0x0D: // carriage return\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'r';\n                            break;\n                        }\n\n                        case 0x22: // quotation mark\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\"';\n                            break;\n                        }\n\n                        case 0x5C: // reverse solidus\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\\';\n                            break;\n                        }\n\n                        default:\n                        {\n                            // escape control characters (0x00..0x1F) or, if\n                            // ensure_ascii parameter is used, non-ASCII characters\n                            if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F)))\n                            {\n                                if (codepoint <= 0xFFFF)\n                                {\n                                    (std::snprintf)(string_buffer.data() + bytes, 7, \"\\\\u%04x\",\n                                                    static_cast<std::uint16_t>(codepoint));\n                                    bytes += 6;\n                                }\n                                else\n                                {\n                                    (std::snprintf)(string_buffer.data() + bytes, 13, \"\\\\u%04x\\\\u%04x\",\n                                                    static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)),\n                                                    static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu)));\n                                    bytes += 12;\n                                }\n                            }\n                            else\n                            {\n                                // copy byte to buffer (all previous bytes\n                                // been copied have in default case above)\n                                string_buffer[bytes++] = s[i];\n                            }\n                            break;\n                        }\n                    }\n\n                    // write buffer and reset index; there must be 13 bytes\n                    // left, as this is the maximal number of bytes to be\n                    // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                    if (string_buffer.size() - bytes < 13)\n                    {\n                        o->write_characters(string_buffer.data(), bytes);\n                        bytes = 0;\n                    }\n\n                    // remember the byte position of this accept\n                    bytes_after_last_accept = bytes;\n                    undumped_chars = 0;\n                    break;\n                }\n\n                case UTF8_REJECT:  // decode found invalid UTF-8 byte\n                {\n                    switch (error_handler)\n                    {\n                        case error_handler_t::strict:\n                        {\n                            std::string sn(3, '\\0');\n                            (std::snprintf)(&sn[0], sn.size(), \"%.2X\", byte);\n                            JSON_THROW(type_error::create(316, \"invalid UTF-8 byte at index \" + std::to_string(i) + \": 0x\" + sn));\n                        }\n\n                        case error_handler_t::ignore:\n                        case error_handler_t::replace:\n                        {\n                            // in case we saw this character the first time, we\n                            // would like to read it again, because the byte\n                            // may be OK for itself, but just not OK for the\n                            // previous sequence\n                            if (undumped_chars > 0)\n                            {\n                                --i;\n                            }\n\n                            // reset length buffer to the last accepted index;\n                            // thus removing/ignoring the invalid characters\n                            bytes = bytes_after_last_accept;\n\n                            if (error_handler == error_handler_t::replace)\n                            {\n                                // add a replacement character\n                                if (ensure_ascii)\n                                {\n                                    string_buffer[bytes++] = '\\\\';\n                                    string_buffer[bytes++] = 'u';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'd';\n                                }\n                                else\n                                {\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xEF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBD');\n                                }\n\n                                // write buffer and reset index; there must be 13 bytes\n                                // left, as this is the maximal number of bytes to be\n                                // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                                if (string_buffer.size() - bytes < 13)\n                                {\n                                    o->write_characters(string_buffer.data(), bytes);\n                                    bytes = 0;\n                                }\n\n                                bytes_after_last_accept = bytes;\n                            }\n\n                            undumped_chars = 0;\n\n                            // continue processing the string\n                            state = UTF8_ACCEPT;\n                            break;\n                        }\n\n                        default:            // LCOV_EXCL_LINE\n                            JSON_ASSERT(false);  // LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n\n                default:  // decode found yet incomplete multi-byte code point\n                {\n                    if (!ensure_ascii)\n                    {\n                        // code point will not be escaped - copy byte to buffer\n                        string_buffer[bytes++] = s[i];\n                    }\n                    ++undumped_chars;\n                    break;\n                }\n            }\n        }\n\n        // we finished processing the string\n        if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT))\n        {\n            // write buffer\n            if (bytes > 0)\n            {\n                o->write_characters(string_buffer.data(), bytes);\n            }\n        }\n        else\n        {\n            // we finish reading, but do not accept: string was incomplete\n            switch (error_handler)\n            {\n                case error_handler_t::strict:\n                {\n                    std::string sn(3, '\\0');\n                    (std::snprintf)(&sn[0], sn.size(), \"%.2X\", static_cast<std::uint8_t>(s.back()));\n                    JSON_THROW(type_error::create(316, \"incomplete UTF-8 string; last byte: 0x\" + sn));\n                }\n\n                case error_handler_t::ignore:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    break;\n                }\n\n                case error_handler_t::replace:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    // add a replacement character\n                    if (ensure_ascii)\n                    {\n                        o->write_characters(\"\\\\ufffd\", 6);\n                    }\n                    else\n                    {\n                        o->write_characters(\"\\xEF\\xBF\\xBD\", 3);\n                    }\n                    break;\n                }\n\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false);  // LCOV_EXCL_LINE\n            }\n        }\n    }\n\n    /*!\n    @brief count digits\n\n    Count the number of decimal (base 10) digits for an input unsigned integer.\n\n    @param[in] x  unsigned integer number to count its digits\n    @return    number of decimal digits\n    */\n    inline unsigned int count_digits(number_unsigned_t x) noexcept\n    {\n        unsigned int n_digits = 1;\n        for (;;)\n        {\n            if (x < 10)\n            {\n                return n_digits;\n            }\n            if (x < 100)\n            {\n                return n_digits + 1;\n            }\n            if (x < 1000)\n            {\n                return n_digits + 2;\n            }\n            if (x < 10000)\n            {\n                return n_digits + 3;\n            }\n            x = x / 10000u;\n            n_digits += 4;\n        }\n    }\n\n    /*!\n    @brief dump an integer\n\n    Dump a given integer to output stream @a o. Works internally with\n    @a number_buffer.\n\n    @param[in] x  integer number (signed or unsigned) to dump\n    @tparam NumberType either @a number_integer_t or @a number_unsigned_t\n    */\n    template < typename NumberType, detail::enable_if_t <\n                   std::is_same<NumberType, number_unsigned_t>::value ||\n                   std::is_same<NumberType, number_integer_t>::value ||\n                   std::is_same<NumberType, binary_char_t>::value,\n                   int > = 0 >\n    void dump_integer(NumberType x)\n    {\n        static constexpr std::array<std::array<char, 2>, 100> digits_to_99\n        {\n            {\n                {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}},\n                {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}},\n                {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}},\n                {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}},\n                {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}},\n                {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}},\n                {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}},\n                {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}},\n                {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}},\n                {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}},\n            }\n        };\n\n        // special case for \"0\"\n        if (x == 0)\n        {\n            o->write_character('0');\n            return;\n        }\n\n        // use a pointer to fill the buffer\n        auto buffer_ptr = number_buffer.begin();\n\n        const bool is_negative = std::is_same<NumberType, number_integer_t>::value && !(x >= 0); // see issue #755\n        number_unsigned_t abs_value;\n\n        unsigned int n_chars;\n\n        if (is_negative)\n        {\n            *buffer_ptr = '-';\n            abs_value = remove_sign(static_cast<number_integer_t>(x));\n\n            // account one more byte for the minus sign\n            n_chars = 1 + count_digits(abs_value);\n        }\n        else\n        {\n            abs_value = static_cast<number_unsigned_t>(x);\n            n_chars = count_digits(abs_value);\n        }\n\n        // spare 1 byte for '\\0'\n        JSON_ASSERT(n_chars < number_buffer.size() - 1);\n\n        // jump to the end to generate the string from backward\n        // so we later avoid reversing the result\n        buffer_ptr += n_chars;\n\n        // Fast int2ascii implementation inspired by \"Fastware\" talk by Andrei Alexandrescu\n        // See: https://www.youtube.com/watch?v=o4-CwDo2zpg\n        while (abs_value >= 100)\n        {\n            const auto digits_index = static_cast<unsigned>((abs_value % 100));\n            abs_value /= 100;\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n\n        if (abs_value >= 10)\n        {\n            const auto digits_index = static_cast<unsigned>(abs_value);\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n        else\n        {\n            *(--buffer_ptr) = static_cast<char>('0' + abs_value);\n        }\n\n        o->write_characters(number_buffer.data(), n_chars);\n    }\n\n    /*!\n    @brief dump a floating-point number\n\n    Dump a given floating-point number to output stream @a o. Works internally\n    with @a number_buffer.\n\n    @param[in] x  floating-point number to dump\n    */\n    void dump_float(number_float_t x)\n    {\n        // NaN / inf\n        if (!std::isfinite(x))\n        {\n            o->write_characters(\"null\", 4);\n            return;\n        }\n\n        // If number_float_t is an IEEE-754 single or double precision number,\n        // use the Grisu2 algorithm to produce short numbers which are\n        // guaranteed to round-trip, using strtof and strtod, resp.\n        //\n        // NB: The test below works if <long double> == <double>.\n        static constexpr bool is_ieee_single_or_double\n            = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||\n              (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);\n\n        dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());\n    }\n\n    void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/)\n    {\n        char* begin = number_buffer.data();\n        char* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);\n\n        o->write_characters(begin, static_cast<size_t>(end - begin));\n    }\n\n    void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/)\n    {\n        // get number of digits for a float -> text -> float round-trip\n        static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;\n\n        // the actual conversion\n        std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), \"%.*g\", d, x);\n\n        // negative value indicates an error\n        JSON_ASSERT(len > 0);\n        // check if buffer was large enough\n        JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size());\n\n        // erase thousands separator\n        if (thousands_sep != '\\0')\n        {\n            const auto end = std::remove(number_buffer.begin(),\n                                         number_buffer.begin() + len, thousands_sep);\n            std::fill(end, number_buffer.end(), '\\0');\n            JSON_ASSERT((end - number_buffer.begin()) <= len);\n            len = (end - number_buffer.begin());\n        }\n\n        // convert decimal point to '.'\n        if (decimal_point != '\\0' && decimal_point != '.')\n        {\n            const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);\n            if (dec_pos != number_buffer.end())\n            {\n                *dec_pos = '.';\n            }\n        }\n\n        o->write_characters(number_buffer.data(), static_cast<std::size_t>(len));\n\n        // determine if need to append \".0\"\n        const bool value_is_int_like =\n            std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,\n                         [](char c)\n        {\n            return c == '.' || c == 'e';\n        });\n\n        if (value_is_int_like)\n        {\n            o->write_characters(\".0\", 2);\n        }\n    }\n\n    /*!\n    @brief check whether a string is UTF-8 encoded\n\n    The function checks each byte of a string whether it is UTF-8 encoded. The\n    result of the check is stored in the @a state parameter. The function must\n    be called initially with state 0 (accept). State 1 means the string must\n    be rejected, because the current byte is not allowed. If the string is\n    completely processed, but the state is non-zero, the string ended\n    prematurely; that is, the last byte indicated more bytes should have\n    followed.\n\n    @param[in,out] state  the state of the decoding\n    @param[in,out] codep  codepoint (valid only if resulting state is UTF8_ACCEPT)\n    @param[in] byte       next byte to decode\n    @return               new state\n\n    @note The function has been edited: a std::array is used.\n\n    @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>\n    @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/\n    */\n    static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept\n    {\n        static const std::array<std::uint8_t, 400> utf8d =\n        {\n            {\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F\n                7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF\n                8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF\n                0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF\n                0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF\n                0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2\n                1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4\n                1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6\n                1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8\n            }\n        };\n\n        const std::uint8_t type = utf8d[byte];\n\n        codep = (state != UTF8_ACCEPT)\n                ? (byte & 0x3fu) | (codep << 6u)\n                : (0xFFu >> type) & (byte);\n\n        std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);\n        JSON_ASSERT(index < 400);\n        state = utf8d[index];\n        return state;\n    }\n\n    /*\n     * Overload to make the compiler happy while it is instantiating\n     * dump_integer for number_unsigned_t.\n     * Must never be called.\n     */\n    number_unsigned_t remove_sign(number_unsigned_t x)\n    {\n        JSON_ASSERT(false); // LCOV_EXCL_LINE\n        return x; // LCOV_EXCL_LINE\n    }\n\n    /*\n     * Helper function for dump_integer\n     *\n     * This function takes a negative signed integer and returns its absolute\n     * value as unsigned integer. The plus/minus shuffling is necessary as we can\n     * not directly remove the sign of an arbitrary signed integer as the\n     * absolute values of INT_MIN and INT_MAX are usually not the same. See\n     * #1708 for details.\n     */\n    inline number_unsigned_t remove_sign(number_integer_t x) noexcept\n    {\n        JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)());\n        return static_cast<number_unsigned_t>(-(x + 1)) + 1;\n    }\n\n  private:\n    /// the output of the serializer\n    output_adapter_t<char> o = nullptr;\n\n    /// a (hopefully) large enough character buffer\n    std::array<char, 64> number_buffer{{}};\n\n    /// the locale\n    const std::lconv* loc = nullptr;\n    /// the locale's thousand separator character\n    const char thousands_sep = '\\0';\n    /// the locale's decimal point character\n    const char decimal_point = '\\0';\n\n    /// string buffer\n    std::array<char, 512> string_buffer{{}};\n\n    /// the indentation character\n    const char indent_char;\n    /// the indentation string\n    string_t indent_string;\n\n    /// error_handler how to react on decoding errors\n    const error_handler_t error_handler;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n// #include <nlohmann/json_fwd.hpp>\n\n// #include <nlohmann/ordered_map.hpp>\n\n\n#include <functional> // less\n#include <memory> // allocator\n#include <utility> // pair\n#include <vector> // vector\n\nnamespace nlohmann\n{\n\n/// ordered_map: a minimal map-like container that preserves insertion order\n/// for use within nlohmann::basic_json<ordered_map>\ntemplate <class Key, class T, class IgnoredLess = std::less<Key>,\n          class Allocator = std::allocator<std::pair<const Key, T>>>\n                  struct ordered_map : std::vector<std::pair<const Key, T>, Allocator>\n{\n    using key_type = Key;\n    using mapped_type = T;\n    using Container = std::vector<std::pair<const Key, T>, Allocator>;\n    using typename Container::iterator;\n    using typename Container::const_iterator;\n    using typename Container::size_type;\n    using typename Container::value_type;\n\n    // Explicit constructors instead of `using Container::Container`\n    // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4)\n    ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {}\n    template <class It>\n    ordered_map(It first, It last, const Allocator& alloc = Allocator())\n        : Container{first, last, alloc} {}\n    ordered_map(std::initializer_list<T> init, const Allocator& alloc = Allocator() )\n        : Container{init, alloc} {}\n\n    std::pair<iterator, bool> emplace(const key_type& key, T&& t)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return {it, false};\n            }\n        }\n        Container::emplace_back(key, t);\n        return {--this->end(), true};\n    }\n\n    T& operator[](const Key& key)\n    {\n        return emplace(key, T{}).first->second;\n    }\n\n    const T& operator[](const Key& key) const\n    {\n        return at(key);\n    }\n\n    T& at(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it->second;\n            }\n        }\n\n        throw std::out_of_range(\"key not found\");\n    }\n\n    const T& at(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it->second;\n            }\n        }\n\n        throw std::out_of_range(\"key not found\");\n    }\n\n    size_type erase(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                // Since we cannot move const Keys, re-construct them in place\n                for (auto next = it; ++next != this->end(); ++it)\n                {\n                    it->~value_type(); // Destroy but keep allocation\n                    new (&*it) value_type{std::move(*next)};\n                }\n                Container::pop_back();\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator erase(iterator pos)\n    {\n        auto it = pos;\n\n        // Since we cannot move const Keys, re-construct them in place\n        for (auto next = it; ++next != this->end(); ++it)\n        {\n            it->~value_type(); // Destroy but keep allocation\n            new (&*it) value_type{std::move(*next)};\n        }\n        Container::pop_back();\n        return pos;\n    }\n\n    size_type count(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator find(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    const_iterator find(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    std::pair<iterator, bool> insert( value_type&& value )\n    {\n        return emplace(value.first, std::move(value.second));\n    }\n\n    std::pair<iterator, bool> insert( const value_type& value )\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == value.first)\n            {\n                return {it, false};\n            }\n        }\n        Container::push_back(value);\n        return {--this->end(), true};\n    }\n};\n\n}  // namespace nlohmann\n\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nnamespace nlohmann\n{\n\n/*!\n@brief a class to store JSON values\n\n@tparam ObjectType type for JSON objects (`std::map` by default; will be used\nin @ref object_t)\n@tparam ArrayType type for JSON arrays (`std::vector` by default; will be used\nin @ref array_t)\n@tparam StringType type for JSON strings and object keys (`std::string` by\ndefault; will be used in @ref string_t)\n@tparam BooleanType type for JSON booleans (`bool` by default; will be used\nin @ref boolean_t)\n@tparam NumberIntegerType type for JSON integer numbers (`int64_t` by\ndefault; will be used in @ref number_integer_t)\n@tparam NumberUnsignedType type for JSON unsigned integer numbers (@c\n`uint64_t` by default; will be used in @ref number_unsigned_t)\n@tparam NumberFloatType type for JSON floating-point numbers (`double` by\ndefault; will be used in @ref number_float_t)\n@tparam BinaryType type for packed binary data for compatibility with binary\nserialization formats (`std::vector<std::uint8_t>` by default; will be used in\n@ref binary_t)\n@tparam AllocatorType type of the allocator to use (`std::allocator` by\ndefault)\n@tparam JSONSerializer the serializer to resolve internal calls to `to_json()`\nand `from_json()` (@ref adl_serializer by default)\n\n@requirement The class satisfies the following concept requirements:\n- Basic\n - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible):\n   JSON values can be default constructed. The result will be a JSON null\n   value.\n - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible):\n   A JSON value can be constructed from an rvalue argument.\n - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible):\n   A JSON value can be copy-constructed from an lvalue expression.\n - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable):\n   A JSON value van be assigned from an rvalue argument.\n - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable):\n   A JSON value can be copy-assigned from an lvalue expression.\n - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible):\n   JSON values can be destructed.\n- Layout\n - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType):\n   JSON values have\n   [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout):\n   All non-static data members are private and standard layout types, the\n   class has no virtual functions or (virtual) base classes.\n- Library-wide\n - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable):\n   JSON values can be compared with `==`, see @ref\n   operator==(const_reference,const_reference).\n - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable):\n   JSON values can be compared with `<`, see @ref\n   operator<(const_reference,const_reference).\n - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable):\n   Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of\n   other compatible types, using unqualified function call @ref swap().\n - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer):\n   JSON values can be compared against `std::nullptr_t` objects which are used\n   to model the `null` value.\n- Container\n - [Container](https://en.cppreference.com/w/cpp/named_req/Container):\n   JSON values can be used like STL containers and provide iterator access.\n - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer);\n   JSON values can be used like STL containers and provide reverse iterator\n   access.\n\n@invariant The member variables @a m_value and @a m_type have the following\nrelationship:\n- If `m_type == value_t::object`, then `m_value.object != nullptr`.\n- If `m_type == value_t::array`, then `m_value.array != nullptr`.\n- If `m_type == value_t::string`, then `m_value.string != nullptr`.\nThe invariants are checked by member function assert_invariant().\n\n@internal\n@note ObjectType trick from https://stackoverflow.com/a/9860911\n@endinternal\n\n@see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange\nFormat](http://rfc7159.net/rfc7159)\n\n@since version 1.0.0\n\n@nosubgrouping\n*/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nclass basic_json\n{\n  private:\n    template<detail::value_t> friend struct detail::external_constructor;\n    friend ::nlohmann::json_pointer<basic_json>;\n\n    template<typename BasicJsonType, typename InputType>\n    friend class ::nlohmann::detail::parser;\n    friend ::nlohmann::detail::serializer<basic_json>;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::iter_impl;\n    template<typename BasicJsonType, typename CharType>\n    friend class ::nlohmann::detail::binary_writer;\n    template<typename BasicJsonType, typename InputType, typename SAX>\n    friend class ::nlohmann::detail::binary_reader;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::json_sax_dom_parser;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::json_sax_dom_callback_parser;\n\n    /// workaround type for MSVC\n    using basic_json_t = NLOHMANN_BASIC_JSON_TPL;\n\n    // convenience aliases for types residing in namespace detail;\n    using lexer = ::nlohmann::detail::lexer_base<basic_json>;\n\n    template<typename InputAdapterType>\n    static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(\n        InputAdapterType adapter,\n        detail::parser_callback_t<basic_json>cb = nullptr,\n        const bool allow_exceptions = true,\n        const bool ignore_comments = false\n                                 )\n    {\n        return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),\n                std::move(cb), allow_exceptions, ignore_comments);\n    }\n\n    using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;\n    template<typename BasicJsonType>\n    using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;\n    template<typename BasicJsonType>\n    using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;\n    template<typename Iterator>\n    using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;\n    template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;\n\n    template<typename CharType>\n    using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;\n\n    template<typename InputType>\n    using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;\n    template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;\n\n    using serializer = ::nlohmann::detail::serializer<basic_json>;\n\n  public:\n    using value_t = detail::value_t;\n    /// JSON Pointer, see @ref nlohmann::json_pointer\n    using json_pointer = ::nlohmann::json_pointer<basic_json>;\n    template<typename T, typename SFINAE>\n    using json_serializer = JSONSerializer<T, SFINAE>;\n    /// how to treat decoding errors\n    using error_handler_t = detail::error_handler_t;\n    /// how to treat CBOR tags\n    using cbor_tag_handler_t = detail::cbor_tag_handler_t;\n    /// helper type for initializer lists of basic_json values\n    using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;\n\n    using input_format_t = detail::input_format_t;\n    /// SAX interface type, see @ref nlohmann::json_sax\n    using json_sax_t = json_sax<basic_json>;\n\n    ////////////////\n    // exceptions //\n    ////////////////\n\n    /// @name exceptions\n    /// Classes to implement user-defined exceptions.\n    /// @{\n\n    /// @copydoc detail::exception\n    using exception = detail::exception;\n    /// @copydoc detail::parse_error\n    using parse_error = detail::parse_error;\n    /// @copydoc detail::invalid_iterator\n    using invalid_iterator = detail::invalid_iterator;\n    /// @copydoc detail::type_error\n    using type_error = detail::type_error;\n    /// @copydoc detail::out_of_range\n    using out_of_range = detail::out_of_range;\n    /// @copydoc detail::other_error\n    using other_error = detail::other_error;\n\n    /// @}\n\n\n    /////////////////////\n    // container types //\n    /////////////////////\n\n    /// @name container types\n    /// The canonic container types to use @ref basic_json like any other STL\n    /// container.\n    /// @{\n\n    /// the type of elements in a basic_json container\n    using value_type = basic_json;\n\n    /// the type of an element reference\n    using reference = value_type&;\n    /// the type of an element const reference\n    using const_reference = const value_type&;\n\n    /// a type to represent differences between iterators\n    using difference_type = std::ptrdiff_t;\n    /// a type to represent container sizes\n    using size_type = std::size_t;\n\n    /// the allocator type\n    using allocator_type = AllocatorType<basic_json>;\n\n    /// the type of an element pointer\n    using pointer = typename std::allocator_traits<allocator_type>::pointer;\n    /// the type of an element const pointer\n    using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;\n\n    /// an iterator for a basic_json container\n    using iterator = iter_impl<basic_json>;\n    /// a const iterator for a basic_json container\n    using const_iterator = iter_impl<const basic_json>;\n    /// a reverse iterator for a basic_json container\n    using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;\n    /// a const reverse iterator for a basic_json container\n    using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;\n\n    /// @}\n\n\n    /*!\n    @brief returns the allocator associated with the container\n    */\n    static allocator_type get_allocator()\n    {\n        return allocator_type();\n    }\n\n    /*!\n    @brief returns version information on the library\n\n    This function returns a JSON object with information about the library,\n    including the version number and information on the platform and compiler.\n\n    @return JSON object holding version information\n    key         | description\n    ----------- | ---------------\n    `compiler`  | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version).\n    `copyright` | The copyright line for the library as string.\n    `name`      | The name of the library as string.\n    `platform`  | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`.\n    `url`       | The URL of the project as string.\n    `version`   | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string).\n\n    @liveexample{The following code shows an example output of the `meta()`\n    function.,meta}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @complexity Constant.\n\n    @since 2.1.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json meta()\n    {\n        basic_json result;\n\n        result[\"copyright\"] = \"(C) 2013-2020 Niels Lohmann\";\n        result[\"name\"] = \"JSON for Modern C++\";\n        result[\"url\"] = \"https://github.com/nlohmann/json\";\n        result[\"version\"][\"string\"] =\n            std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + \".\" +\n            std::to_string(NLOHMANN_JSON_VERSION_MINOR) + \".\" +\n            std::to_string(NLOHMANN_JSON_VERSION_PATCH);\n        result[\"version\"][\"major\"] = NLOHMANN_JSON_VERSION_MAJOR;\n        result[\"version\"][\"minor\"] = NLOHMANN_JSON_VERSION_MINOR;\n        result[\"version\"][\"patch\"] = NLOHMANN_JSON_VERSION_PATCH;\n\n#ifdef _WIN32\n        result[\"platform\"] = \"win32\";\n#elif defined __linux__\n        result[\"platform\"] = \"linux\";\n#elif defined __APPLE__\n        result[\"platform\"] = \"apple\";\n#elif defined __unix__\n        result[\"platform\"] = \"unix\";\n#else\n        result[\"platform\"] = \"unknown\";\n#endif\n\n#if defined(__ICC) || defined(__INTEL_COMPILER)\n        result[\"compiler\"] = {{\"family\", \"icc\"}, {\"version\", __INTEL_COMPILER}};\n#elif defined(__clang__)\n        result[\"compiler\"] = {{\"family\", \"clang\"}, {\"version\", __clang_version__}};\n#elif defined(__GNUC__) || defined(__GNUG__)\n        result[\"compiler\"] = {{\"family\", \"gcc\"}, {\"version\", std::to_string(__GNUC__) + \".\" + std::to_string(__GNUC_MINOR__) + \".\" + std::to_string(__GNUC_PATCHLEVEL__)}};\n#elif defined(__HP_cc) || defined(__HP_aCC)\n        result[\"compiler\"] = \"hp\"\n#elif defined(__IBMCPP__)\n        result[\"compiler\"] = {{\"family\", \"ilecpp\"}, {\"version\", __IBMCPP__}};\n#elif defined(_MSC_VER)\n        result[\"compiler\"] = {{\"family\", \"msvc\"}, {\"version\", _MSC_VER}};\n#elif defined(__PGI)\n        result[\"compiler\"] = {{\"family\", \"pgcpp\"}, {\"version\", __PGI}};\n#elif defined(__SUNPRO_CC)\n        result[\"compiler\"] = {{\"family\", \"sunpro\"}, {\"version\", __SUNPRO_CC}};\n#else\n        result[\"compiler\"] = {{\"family\", \"unknown\"}, {\"version\", \"unknown\"}};\n#endif\n\n#ifdef __cplusplus\n        result[\"compiler\"][\"c++\"] = std::to_string(__cplusplus);\n#else\n        result[\"compiler\"][\"c++\"] = \"unknown\";\n#endif\n        return result;\n    }\n\n\n    ///////////////////////////\n    // JSON value data types //\n    ///////////////////////////\n\n    /// @name JSON value data types\n    /// The data types to store a JSON value. These types are derived from\n    /// the template arguments passed to class @ref basic_json.\n    /// @{\n\n#if defined(JSON_HAS_CPP_14)\n    // Use transparent comparator if possible, combined with perfect forwarding\n    // on find() and count() calls prevents unnecessary string construction.\n    using object_comparator_t = std::less<>;\n#else\n    using object_comparator_t = std::less<StringType>;\n#endif\n\n    /*!\n    @brief a type for an object\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows:\n    > An object is an unordered collection of zero or more name/value pairs,\n    > where a name is a string and a value is a string, number, boolean, null,\n    > object, or array.\n\n    To store objects in C++, a type is defined by the template parameters\n    described below.\n\n    @tparam ObjectType  the container to store objects (e.g., `std::map` or\n    `std::unordered_map`)\n    @tparam StringType the type of the keys or names (e.g., `std::string`).\n    The comparison function `std::less<StringType>` is used to order elements\n    inside the container.\n    @tparam AllocatorType the allocator to use for objects (e.g.,\n    `std::allocator`)\n\n    #### Default type\n\n    With the default values for @a ObjectType (`std::map`), @a StringType\n    (`std::string`), and @a AllocatorType (`std::allocator`), the default\n    value for @a object_t is:\n\n    @code {.cpp}\n    std::map<\n      std::string, // key_type\n      basic_json, // value_type\n      std::less<std::string>, // key_compare\n      std::allocator<std::pair<const std::string, basic_json>> // allocator_type\n    >\n    @endcode\n\n    #### Behavior\n\n    The choice of @a object_t influences the behavior of the JSON class. With\n    the default type, objects have the following behavior:\n\n    - When all names are unique, objects will be interoperable in the sense\n      that all software implementations receiving that object will agree on\n      the name-value mappings.\n    - When the names within an object are not unique, it is unspecified which\n      one of the values for a given key will be chosen. For instance,\n      `{\"key\": 2, \"key\": 1}` could be equal to either `{\"key\": 1}` or\n      `{\"key\": 2}`.\n    - Internally, name/value pairs are stored in lexicographical order of the\n      names. Objects will also be serialized (see @ref dump) in this order.\n      For instance, `{\"b\": 1, \"a\": 2}` and `{\"a\": 2, \"b\": 1}` will be stored\n      and serialized as `{\"a\": 2, \"b\": 1}`.\n    - When comparing objects, the order of the name/value pairs is irrelevant.\n      This makes objects interoperable in the sense that they will not be\n      affected by these differences. For instance, `{\"b\": 1, \"a\": 2}` and\n      `{\"a\": 2, \"b\": 1}` will be treated as equal.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the maximum depth of nesting.\n\n    In this class, the object's limit of nesting is not explicitly constrained.\n    However, a maximum depth of nesting may be introduced by the compiler or\n    runtime environment. A theoretical limit can be queried by calling the\n    @ref max_size function of a JSON object.\n\n    #### Storage\n\n    Objects are stored as pointers in a @ref basic_json type. That is, for any\n    access to object values, a pointer of type `object_t*` must be\n    dereferenced.\n\n    @sa @ref array_t -- type for an array value\n\n    @since version 1.0.0\n\n    @note The order name/value pairs are added to the object is *not*\n    preserved by the library. Therefore, iterating an object may return\n    name/value pairs in a different order than they were originally stored. In\n    fact, keys will be traversed in alphabetical order as `std::map` with\n    `std::less` is used by default. Please note this behavior conforms to [RFC\n    7159](http://rfc7159.net/rfc7159), because any order implements the\n    specified \"unordered\" nature of JSON objects.\n    */\n    using object_t = ObjectType<StringType,\n          basic_json,\n          object_comparator_t,\n          AllocatorType<std::pair<const StringType,\n          basic_json>>>;\n\n    /*!\n    @brief a type for an array\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows:\n    > An array is an ordered sequence of zero or more values.\n\n    To store objects in C++, a type is defined by the template parameters\n    explained below.\n\n    @tparam ArrayType  container type to store arrays (e.g., `std::vector` or\n    `std::list`)\n    @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`)\n\n    #### Default type\n\n    With the default values for @a ArrayType (`std::vector`) and @a\n    AllocatorType (`std::allocator`), the default value for @a array_t is:\n\n    @code {.cpp}\n    std::vector<\n      basic_json, // value_type\n      std::allocator<basic_json> // allocator_type\n    >\n    @endcode\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the maximum depth of nesting.\n\n    In this class, the array's limit of nesting is not explicitly constrained.\n    However, a maximum depth of nesting may be introduced by the compiler or\n    runtime environment. A theoretical limit can be queried by calling the\n    @ref max_size function of a JSON array.\n\n    #### Storage\n\n    Arrays are stored as pointers in a @ref basic_json type. That is, for any\n    access to array values, a pointer of type `array_t*` must be dereferenced.\n\n    @sa @ref object_t -- type for an object value\n\n    @since version 1.0.0\n    */\n    using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;\n\n    /*!\n    @brief a type for a string\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows:\n    > A string is a sequence of zero or more Unicode characters.\n\n    To store objects in C++, a type is defined by the template parameter\n    described below. Unicode values are split by the JSON class into\n    byte-sized characters during deserialization.\n\n    @tparam StringType  the container to store strings (e.g., `std::string`).\n    Note this container is used for keys/names in objects, see @ref object_t.\n\n    #### Default type\n\n    With the default values for @a StringType (`std::string`), the default\n    value for @a string_t is:\n\n    @code {.cpp}\n    std::string\n    @endcode\n\n    #### Encoding\n\n    Strings are stored in UTF-8 encoding. Therefore, functions like\n    `std::string::size()` or `std::string::length()` return the number of\n    bytes in the string rather than the number of characters or glyphs.\n\n    #### String comparison\n\n    [RFC 7159](http://rfc7159.net/rfc7159) states:\n    > Software implementations are typically required to test names of object\n    > members for equality. Implementations that transform the textual\n    > representation into sequences of Unicode code units and then perform the\n    > comparison numerically, code unit by code unit, are interoperable in the\n    > sense that implementations will agree in all cases on equality or\n    > inequality of two strings. For example, implementations that compare\n    > strings with escaped characters unconverted may incorrectly find that\n    > `\"a\\\\b\"` and `\"a\\u005Cb\"` are not equal.\n\n    This implementation is interoperable as it does compare strings code unit\n    by code unit.\n\n    #### Storage\n\n    String values are stored as pointers in a @ref basic_json type. That is,\n    for any access to string values, a pointer of type `string_t*` must be\n    dereferenced.\n\n    @since version 1.0.0\n    */\n    using string_t = StringType;\n\n    /*!\n    @brief a type for a boolean\n\n    [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a\n    type which differentiates the two literals `true` and `false`.\n\n    To store objects in C++, a type is defined by the template parameter @a\n    BooleanType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a BooleanType (`bool`), the default value for\n    @a boolean_t is:\n\n    @code {.cpp}\n    bool\n    @endcode\n\n    #### Storage\n\n    Boolean values are stored directly inside a @ref basic_json type.\n\n    @since version 1.0.0\n    */\n    using boolean_t = BooleanType;\n\n    /*!\n    @brief a type for a number (integer)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store integer numbers in C++, a type is defined by the template\n    parameter @a NumberIntegerType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberIntegerType (`int64_t`), the default\n    value for @a number_integer_t is:\n\n    @code {.cpp}\n    int64_t\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in integer literals lead to an interpretation as octal\n      number. Internally, the value will be stored as decimal number. For\n      instance, the C++ integer literal `010` will be serialized to `8`.\n      During deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the range and precision of numbers.\n\n    When the default type is used, the maximal integer number that can be\n    stored is `9223372036854775807` (INT64_MAX) and the minimal integer number\n    that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers\n    that are out of range will yield over/underflow when used in a\n    constructor. During deserialization, too large or small integer numbers\n    will be automatically be stored as @ref number_unsigned_t or @ref\n    number_float_t.\n\n    [RFC 7159](http://rfc7159.net/rfc7159) further states:\n    > Note that when such software is used, numbers that are integers and are\n    > in the range \\f$[-2^{53}+1, 2^{53}-1]\\f$ are interoperable in the sense\n    > that implementations will agree exactly on their numeric values.\n\n    As this range is a subrange of the exactly supported range [INT64_MIN,\n    INT64_MAX], this class's integer type is interoperable.\n\n    #### Storage\n\n    Integer number values are stored directly inside a @ref basic_json type.\n\n    @sa @ref number_float_t -- type for number values (floating-point)\n\n    @sa @ref number_unsigned_t -- type for number values (unsigned integer)\n\n    @since version 1.0.0\n    */\n    using number_integer_t = NumberIntegerType;\n\n    /*!\n    @brief a type for a number (unsigned)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store unsigned integer numbers in C++, a type is defined by the\n    template parameter @a NumberUnsignedType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberUnsignedType (`uint64_t`), the\n    default value for @a number_unsigned_t is:\n\n    @code {.cpp}\n    uint64_t\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in integer literals lead to an interpretation as octal\n      number. Internally, the value will be stored as decimal number. For\n      instance, the C++ integer literal `010` will be serialized to `8`.\n      During deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the range and precision of numbers.\n\n    When the default type is used, the maximal integer number that can be\n    stored is `18446744073709551615` (UINT64_MAX) and the minimal integer\n    number that can be stored is `0`. Integer numbers that are out of range\n    will yield over/underflow when used in a constructor. During\n    deserialization, too large or small integer numbers will be automatically\n    be stored as @ref number_integer_t or @ref number_float_t.\n\n    [RFC 7159](http://rfc7159.net/rfc7159) further states:\n    > Note that when such software is used, numbers that are integers and are\n    > in the range \\f$[-2^{53}+1, 2^{53}-1]\\f$ are interoperable in the sense\n    > that implementations will agree exactly on their numeric values.\n\n    As this range is a subrange (when considered in conjunction with the\n    number_integer_t type) of the exactly supported range [0, UINT64_MAX],\n    this class's integer type is interoperable.\n\n    #### Storage\n\n    Integer number values are stored directly inside a @ref basic_json type.\n\n    @sa @ref number_float_t -- type for number values (floating-point)\n    @sa @ref number_integer_t -- type for number values (integer)\n\n    @since version 2.0.0\n    */\n    using number_unsigned_t = NumberUnsignedType;\n\n    /*!\n    @brief a type for a number (floating-point)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store floating-point numbers in C++, a type is defined by the template\n    parameter @a NumberFloatType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberFloatType (`double`), the default\n    value for @a number_float_t is:\n\n    @code {.cpp}\n    double\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in floating-point literals will be ignored. Internally,\n      the value will be stored as decimal number. For instance, the C++\n      floating-point literal `01.2` will be serialized to `1.2`. During\n      deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) states:\n    > This specification allows implementations to set limits on the range and\n    > precision of numbers accepted. Since software that implements IEEE\n    > 754-2008 binary64 (double precision) numbers is generally available and\n    > widely used, good interoperability can be achieved by implementations\n    > that expect no more precision or range than these provide, in the sense\n    > that implementations will approximate JSON numbers within the expected\n    > precision.\n\n    This implementation does exactly follow this approach, as it uses double\n    precision floating-point numbers. Note values smaller than\n    `-1.79769313486232e+308` and values greater than `1.79769313486232e+308`\n    will be stored as NaN internally and be serialized to `null`.\n\n    #### Storage\n\n    Floating-point number values are stored directly inside a @ref basic_json\n    type.\n\n    @sa @ref number_integer_t -- type for number values (integer)\n\n    @sa @ref number_unsigned_t -- type for number values (unsigned integer)\n\n    @since version 1.0.0\n    */\n    using number_float_t = NumberFloatType;\n\n    /*!\n    @brief a type for a packed binary type\n\n    This type is a type designed to carry binary data that appears in various\n    serialized formats, such as CBOR's Major Type 2, MessagePack's bin, and\n    BSON's generic binary subtype. This type is NOT a part of standard JSON and\n    exists solely for compatibility with these binary types. As such, it is\n    simply defined as an ordered sequence of zero or more byte values.\n\n    Additionally, as an implementation detail, the subtype of the binary data is\n    carried around as a `std::uint8_t`, which is compatible with both of the\n    binary data formats that use binary subtyping, (though the specific\n    numbering is incompatible with each other, and it is up to the user to\n    translate between them).\n\n    [CBOR's RFC 7049](https://tools.ietf.org/html/rfc7049) describes this type\n    as:\n    > Major type 2: a byte string. The string's length in bytes is represented\n    > following the rules for positive integers (major type 0).\n\n    [MessagePack's documentation on the bin type\n    family](https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family)\n    describes this type as:\n    > Bin format family stores an byte array in 2, 3, or 5 bytes of extra bytes\n    > in addition to the size of the byte array.\n\n    [BSON's specifications](http://bsonspec.org/spec.html) describe several\n    binary types; however, this type is intended to represent the generic binary\n    type which has the description:\n    > Generic binary subtype - This is the most commonly used binary subtype and\n    > should be the 'default' for drivers and tools.\n\n    None of these impose any limitations on the internal representation other\n    than the basic unit of storage be some type of array whose parts are\n    decomposable into bytes.\n\n    The default representation of this binary format is a\n    `std::vector<std::uint8_t>`, which is a very common way to represent a byte\n    array in modern C++.\n\n    #### Default type\n\n    The default values for @a BinaryType is `std::vector<std::uint8_t>`\n\n    #### Storage\n\n    Binary Arrays are stored as pointers in a @ref basic_json type. That is,\n    for any access to array values, a pointer of the type `binary_t*` must be\n    dereferenced.\n\n    #### Notes on subtypes\n\n    - CBOR\n       - Binary values are represented as byte strings. No subtypes are\n         supported and will be ignored when CBOR is written.\n    - MessagePack\n       - If a subtype is given and the binary array contains exactly 1, 2, 4, 8,\n         or 16 elements, the fixext family (fixext1, fixext2, fixext4, fixext8)\n         is used. For other sizes, the ext family (ext8, ext16, ext32) is used.\n         The subtype is then added as singed 8-bit integer.\n       - If no subtype is given, the bin family (bin8, bin16, bin32) is used.\n    - BSON\n       - If a subtype is given, it is used and added as unsigned 8-bit integer.\n       - If no subtype is given, the generic binary subtype 0x00 is used.\n\n    @sa @ref binary -- create a binary array\n\n    @since version 3.8.0\n    */\n    using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;\n    /// @}\n\n  private:\n\n    /// helper for exception-safe object creation\n    template<typename T, typename... Args>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    static T* create(Args&& ... args)\n    {\n        AllocatorType<T> alloc;\n        using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;\n\n        auto deleter = [&](T * object)\n        {\n            AllocatorTraits::deallocate(alloc, object, 1);\n        };\n        std::unique_ptr<T, decltype(deleter)> object(AllocatorTraits::allocate(alloc, 1), deleter);\n        AllocatorTraits::construct(alloc, object.get(), std::forward<Args>(args)...);\n        JSON_ASSERT(object != nullptr);\n        return object.release();\n    }\n\n    ////////////////////////\n    // JSON value storage //\n    ////////////////////////\n\n    /*!\n    @brief a JSON value\n\n    The actual storage for a JSON value of the @ref basic_json class. This\n    union combines the different storage types for the JSON value types\n    defined in @ref value_t.\n\n    JSON type | value_t type    | used type\n    --------- | --------------- | ------------------------\n    object    | object          | pointer to @ref object_t\n    array     | array           | pointer to @ref array_t\n    string    | string          | pointer to @ref string_t\n    boolean   | boolean         | @ref boolean_t\n    number    | number_integer  | @ref number_integer_t\n    number    | number_unsigned | @ref number_unsigned_t\n    number    | number_float    | @ref number_float_t\n    binary    | binary          | pointer to @ref binary_t\n    null      | null            | *no value is stored*\n\n    @note Variable-length types (objects, arrays, and strings) are stored as\n    pointers. The size of the union should not exceed 64 bits if the default\n    value types are used.\n\n    @since version 1.0.0\n    */\n    union json_value\n    {\n        /// object (stored with pointer to save storage)\n        object_t* object;\n        /// array (stored with pointer to save storage)\n        array_t* array;\n        /// string (stored with pointer to save storage)\n        string_t* string;\n        /// binary (stored with pointer to save storage)\n        binary_t* binary;\n        /// boolean\n        boolean_t boolean;\n        /// number (integer)\n        number_integer_t number_integer;\n        /// number (unsigned integer)\n        number_unsigned_t number_unsigned;\n        /// number (floating-point)\n        number_float_t number_float;\n\n        /// default constructor (for null values)\n        json_value() = default;\n        /// constructor for booleans\n        json_value(boolean_t v) noexcept : boolean(v) {}\n        /// constructor for numbers (integer)\n        json_value(number_integer_t v) noexcept : number_integer(v) {}\n        /// constructor for numbers (unsigned)\n        json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}\n        /// constructor for numbers (floating-point)\n        json_value(number_float_t v) noexcept : number_float(v) {}\n        /// constructor for empty values of a given type\n        json_value(value_t t)\n        {\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    object = create<object_t>();\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    array = create<array_t>();\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    string = create<string_t>(\"\");\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    binary = create<binary_t>();\n                    break;\n                }\n\n                case value_t::boolean:\n                {\n                    boolean = boolean_t(false);\n                    break;\n                }\n\n                case value_t::number_integer:\n                {\n                    number_integer = number_integer_t(0);\n                    break;\n                }\n\n                case value_t::number_unsigned:\n                {\n                    number_unsigned = number_unsigned_t(0);\n                    break;\n                }\n\n                case value_t::number_float:\n                {\n                    number_float = number_float_t(0.0);\n                    break;\n                }\n\n                case value_t::null:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    break;\n                }\n\n                default:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    if (JSON_HEDLEY_UNLIKELY(t == value_t::null))\n                    {\n                        JSON_THROW(other_error::create(500, \"961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1\")); // LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n            }\n        }\n\n        /// constructor for strings\n        json_value(const string_t& value)\n        {\n            string = create<string_t>(value);\n        }\n\n        /// constructor for rvalue strings\n        json_value(string_t&& value)\n        {\n            string = create<string_t>(std::move(value));\n        }\n\n        /// constructor for objects\n        json_value(const object_t& value)\n        {\n            object = create<object_t>(value);\n        }\n\n        /// constructor for rvalue objects\n        json_value(object_t&& value)\n        {\n            object = create<object_t>(std::move(value));\n        }\n\n        /// constructor for arrays\n        json_value(const array_t& value)\n        {\n            array = create<array_t>(value);\n        }\n\n        /// constructor for rvalue arrays\n        json_value(array_t&& value)\n        {\n            array = create<array_t>(std::move(value));\n        }\n\n        /// constructor for binary arrays\n        json_value(const typename binary_t::container_type& value)\n        {\n            binary = create<binary_t>(value);\n        }\n\n        /// constructor for rvalue binary arrays\n        json_value(typename binary_t::container_type&& value)\n        {\n            binary = create<binary_t>(std::move(value));\n        }\n\n        /// constructor for binary arrays (internal type)\n        json_value(const binary_t& value)\n        {\n            binary = create<binary_t>(value);\n        }\n\n        /// constructor for rvalue binary arrays (internal type)\n        json_value(binary_t&& value)\n        {\n            binary = create<binary_t>(std::move(value));\n        }\n\n        void destroy(value_t t) noexcept\n        {\n            // flatten the current json_value to a heap-allocated stack\n            std::vector<basic_json> stack;\n\n            // move the top-level items to stack\n            if (t == value_t::array)\n            {\n                stack.reserve(array->size());\n                std::move(array->begin(), array->end(), std::back_inserter(stack));\n            }\n            else if (t == value_t::object)\n            {\n                stack.reserve(object->size());\n                for (auto&& it : *object)\n                {\n                    stack.push_back(std::move(it.second));\n                }\n            }\n\n            while (!stack.empty())\n            {\n                // move the last item to local variable to be processed\n                basic_json current_item(std::move(stack.back()));\n                stack.pop_back();\n\n                // if current_item is array/object, move\n                // its children to the stack to be processed later\n                if (current_item.is_array())\n                {\n                    std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(),\n                              std::back_inserter(stack));\n\n                    current_item.m_value.array->clear();\n                }\n                else if (current_item.is_object())\n                {\n                    for (auto&& it : *current_item.m_value.object)\n                    {\n                        stack.push_back(std::move(it.second));\n                    }\n\n                    current_item.m_value.object->clear();\n                }\n\n                // it's now safe that current_item get destructed\n                // since it doesn't have any children\n            }\n\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    AllocatorType<object_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, object);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    AllocatorType<array_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, array);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);\n                    break;\n                }\n\n                default:\n                {\n                    break;\n                }\n            }\n        }\n    };\n\n    /*!\n    @brief checks the class invariants\n\n    This function asserts the class invariants. It needs to be called at the\n    end of every constructor to make sure that created objects respect the\n    invariant. Furthermore, it has to be called each time the type of a JSON\n    value is changed, because the invariant expresses a relationship between\n    @a m_type and @a m_value.\n    */\n    void assert_invariant() const noexcept\n    {\n        JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr);\n        JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr);\n        JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr);\n        JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr);\n    }\n\n  public:\n    //////////////////////////\n    // JSON parser callback //\n    //////////////////////////\n\n    /*!\n    @brief parser event types\n\n    The parser callback distinguishes the following events:\n    - `object_start`: the parser read `{` and started to process a JSON object\n    - `key`: the parser read a key of a value in an object\n    - `object_end`: the parser read `}` and finished processing a JSON object\n    - `array_start`: the parser read `[` and started to process a JSON array\n    - `array_end`: the parser read `]` and finished processing a JSON array\n    - `value`: the parser finished reading a JSON value\n\n    @image html callback_events.png \"Example when certain parse events are triggered\"\n\n    @sa @ref parser_callback_t for more information and examples\n    */\n    using parse_event_t = detail::parse_event_t;\n\n    /*!\n    @brief per-element parser callback type\n\n    With a parser callback function, the result of parsing a JSON text can be\n    influenced. When passed to @ref parse, it is called on certain events\n    (passed as @ref parse_event_t via parameter @a event) with a set recursion\n    depth @a depth and context JSON value @a parsed. The return value of the\n    callback function is a boolean indicating whether the element that emitted\n    the callback shall be kept or not.\n\n    We distinguish six scenarios (determined by the event type) in which the\n    callback function can be called. The following table describes the values\n    of the parameters @a depth, @a event, and @a parsed.\n\n    parameter @a event | description | parameter @a depth | parameter @a parsed\n    ------------------ | ----------- | ------------------ | -------------------\n    parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded\n    parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key\n    parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object\n    parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded\n    parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array\n    parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value\n\n    @image html callback_events.png \"Example when certain parse events are triggered\"\n\n    Discarding a value (i.e., returning `false`) has different effects\n    depending on the context in which function was called:\n\n    - Discarded values in structured types are skipped. That is, the parser\n      will behave as if the discarded value was never read.\n    - In case a value outside a structured type is skipped, it is replaced\n      with `null`. This case happens if the top-level element is skipped.\n\n    @param[in] depth  the depth of the recursion during parsing\n\n    @param[in] event  an event of type parse_event_t indicating the context in\n    the callback function has been called\n\n    @param[in,out] parsed  the current intermediate parse result; note that\n    writing to this value has no effect for parse_event_t::key events\n\n    @return Whether the JSON value which called the function during parsing\n    should be kept (`true`) or not (`false`). In the latter case, it is either\n    skipped completely or replaced by an empty discarded object.\n\n    @sa @ref parse for examples\n\n    @since version 1.0.0\n    */\n    using parser_callback_t = detail::parser_callback_t<basic_json>;\n\n    //////////////////\n    // constructors //\n    //////////////////\n\n    /// @name constructors and destructors\n    /// Constructors of class @ref basic_json, copy/move constructor, copy\n    /// assignment, static functions creating objects, and the destructor.\n    /// @{\n\n    /*!\n    @brief create an empty value with a given type\n\n    Create an empty JSON value with a given type. The value will be default\n    initialized with an empty value which depends on the type:\n\n    Value type  | initial value\n    ----------- | -------------\n    null        | `null`\n    boolean     | `false`\n    string      | `\"\"`\n    number      | `0`\n    object      | `{}`\n    array       | `[]`\n    binary      | empty array\n\n    @param[in] v  the type of the value to create\n\n    @complexity Constant.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows the constructor for different @ref\n    value_t values,basic_json__value_t}\n\n    @sa @ref clear() -- restores the postcondition of this constructor\n\n    @since version 1.0.0\n    */\n    basic_json(const value_t v)\n        : m_type(v), m_value(v)\n    {\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a null object\n\n    Create a `null` JSON value. It either takes a null pointer as parameter\n    (explicitly creating `null`) or no parameter (implicitly creating `null`).\n    The passed null pointer itself is not read -- it is only used to choose\n    the right constructor.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this constructor never throws\n    exceptions.\n\n    @liveexample{The following code shows the constructor with and without a\n    null pointer parameter.,basic_json__nullptr_t}\n\n    @since version 1.0.0\n    */\n    basic_json(std::nullptr_t = nullptr) noexcept\n        : basic_json(value_t::null)\n    {\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a JSON value\n\n    This is a \"catch all\" constructor for all compatible JSON types; that is,\n    types for which a `to_json()` method exists. The constructor forwards the\n    parameter @a val to that method (to `json_serializer<U>::to_json` method\n    with `U = uncvref_t<CompatibleType>`, to be exact).\n\n    Template type @a CompatibleType includes, but is not limited to, the\n    following types:\n    - **arrays**: @ref array_t and all kinds of compatible containers such as\n      `std::vector`, `std::deque`, `std::list`, `std::forward_list`,\n      `std::array`, `std::valarray`, `std::set`, `std::unordered_set`,\n      `std::multiset`, and `std::unordered_multiset` with a `value_type` from\n      which a @ref basic_json value can be constructed.\n    - **objects**: @ref object_t and all kinds of compatible associative\n      containers such as `std::map`, `std::unordered_map`, `std::multimap`,\n      and `std::unordered_multimap` with a `key_type` compatible to\n      @ref string_t and a `value_type` from which a @ref basic_json value can\n      be constructed.\n    - **strings**: @ref string_t, string literals, and all compatible string\n      containers can be used.\n    - **numbers**: @ref number_integer_t, @ref number_unsigned_t,\n      @ref number_float_t, and all convertible number types such as `int`,\n      `size_t`, `int64_t`, `float` or `double` can be used.\n    - **boolean**: @ref boolean_t / `bool` can be used.\n    - **binary**: @ref binary_t / `std::vector<uint8_t>` may be used,\n      unfortunately because string literals cannot be distinguished from binary\n      character arrays by the C++ type system, all types compatible with `const\n      char*` will be directed to the string constructor instead.  This is both\n      for backwards compatibility, and due to the fact that a binary type is not\n      a standard JSON type.\n\n    See the examples below.\n\n    @tparam CompatibleType a type such that:\n    - @a CompatibleType is not derived from `std::istream`,\n    - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move\n         constructors),\n    - @a CompatibleType is not a different @ref basic_json type (i.e. with different template arguments)\n    - @a CompatibleType is not a @ref basic_json nested type (e.g.,\n         @ref json_pointer, @ref iterator, etc ...)\n    - @ref @ref json_serializer<U> has a\n         `to_json(basic_json_t&, CompatibleType&&)` method\n\n    @tparam U = `uncvref_t<CompatibleType>`\n\n    @param[in] val the value to be forwarded to the respective constructor\n\n    @complexity Usually linear in the size of the passed @a val, also\n                depending on the implementation of the called `to_json()`\n                method.\n\n    @exceptionsafety Depends on the called constructor. For types directly\n    supported by the library (i.e., all types for which no `to_json()` function\n    was provided), strong guarantee holds: if an exception is thrown, there are\n    no changes to any JSON value.\n\n    @liveexample{The following code shows the constructor with several\n    compatible types.,basic_json__CompatibleType}\n\n    @since version 2.1.0\n    */\n    template < typename CompatibleType,\n               typename U = detail::uncvref_t<CompatibleType>,\n               detail::enable_if_t <\n                   !detail::is_basic_json<U>::value && detail::is_compatible_type<basic_json_t, U>::value, int > = 0 >\n    basic_json(CompatibleType && val) noexcept(noexcept(\n                JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),\n                                           std::forward<CompatibleType>(val))))\n    {\n        JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a JSON value from an existing one\n\n    This is a constructor for existing @ref basic_json types.\n    It does not hijack copy/move constructors, since the parameter has different\n    template arguments than the current ones.\n\n    The constructor tries to convert the internal @ref m_value of the parameter.\n\n    @tparam BasicJsonType a type such that:\n    - @a BasicJsonType is a @ref basic_json type.\n    - @a BasicJsonType has different template arguments than @ref basic_json_t.\n\n    @param[in] val the @ref basic_json value to be converted.\n\n    @complexity Usually linear in the size of the passed @a val, also\n                depending on the implementation of the called `to_json()`\n                method.\n\n    @exceptionsafety Depends on the called constructor. For types directly\n    supported by the library (i.e., all types for which no `to_json()` function\n    was provided), strong guarantee holds: if an exception is thrown, there are\n    no changes to any JSON value.\n\n    @since version 3.2.0\n    */\n    template < typename BasicJsonType,\n               detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >\n    basic_json(const BasicJsonType& val)\n    {\n        using other_boolean_t = typename BasicJsonType::boolean_t;\n        using other_number_float_t = typename BasicJsonType::number_float_t;\n        using other_number_integer_t = typename BasicJsonType::number_integer_t;\n        using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n        using other_string_t = typename BasicJsonType::string_t;\n        using other_object_t = typename BasicJsonType::object_t;\n        using other_array_t = typename BasicJsonType::array_t;\n        using other_binary_t = typename BasicJsonType::binary_t;\n\n        switch (val.type())\n        {\n            case value_t::boolean:\n                JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>());\n                break;\n            case value_t::number_float:\n                JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>());\n                break;\n            case value_t::number_integer:\n                JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>());\n                break;\n            case value_t::number_unsigned:\n                JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>());\n                break;\n            case value_t::string:\n                JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>());\n                break;\n            case value_t::object:\n                JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>());\n                break;\n            case value_t::array:\n                JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());\n                break;\n            case value_t::binary:\n                JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());\n                break;\n            case value_t::null:\n                *this = nullptr;\n                break;\n            case value_t::discarded:\n                m_type = value_t::discarded;\n                break;\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a container (array or object) from an initializer list\n\n    Creates a JSON value of type array or object from the passed initializer\n    list @a init. In case @a type_deduction is `true` (default), the type of\n    the JSON value to be created is deducted from the initializer list @a init\n    according to the following rules:\n\n    1. If the list is empty, an empty JSON object value `{}` is created.\n    2. If the list consists of pairs whose first element is a string, a JSON\n       object value is created where the first elements of the pairs are\n       treated as keys and the second elements are as values.\n    3. In all other cases, an array is created.\n\n    The rules aim to create the best fit between a C++ initializer list and\n    JSON values. The rationale is as follows:\n\n    1. The empty initializer list is written as `{}` which is exactly an empty\n       JSON object.\n    2. C++ has no way of describing mapped types other than to list a list of\n       pairs. As JSON requires that keys must be of type string, rule 2 is the\n       weakest constraint one can pose on initializer lists to interpret them\n       as an object.\n    3. In all other cases, the initializer list could not be interpreted as\n       JSON object type, so interpreting it as JSON array type is safe.\n\n    With the rules described above, the following JSON values cannot be\n    expressed by an initializer list:\n\n    - the empty array (`[]`): use @ref array(initializer_list_t)\n      with an empty initializer list in this case\n    - arrays whose elements satisfy rule 2: use @ref\n      array(initializer_list_t) with the same initializer list\n      in this case\n\n    @note When used without parentheses around an empty initializer list, @ref\n    basic_json() is called instead of this function, yielding the JSON null\n    value.\n\n    @param[in] init  initializer list with JSON values\n\n    @param[in] type_deduction internal parameter; when set to `true`, the type\n    of the JSON value is deducted from the initializer list @a init; when set\n    to `false`, the type provided via @a manual_type is forced. This mode is\n    used by the functions @ref array(initializer_list_t) and\n    @ref object(initializer_list_t).\n\n    @param[in] manual_type internal parameter; when @a type_deduction is set\n    to `false`, the created JSON value will use the provided type (only @ref\n    value_t::array and @ref value_t::object are valid); when @a type_deduction\n    is set to `true`, this parameter has no effect\n\n    @throw type_error.301 if @a type_deduction is `false`, @a manual_type is\n    `value_t::object`, but @a init contains an element which is not a pair\n    whose first element is a string. In this case, the constructor could not\n    create an object. If @a type_deduction would have be `true`, an array\n    would have been created. See @ref object(initializer_list_t)\n    for an example.\n\n    @complexity Linear in the size of the initializer list @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The example below shows how JSON values are created from\n    initializer lists.,basic_json__list_init_t}\n\n    @sa @ref array(initializer_list_t) -- create a JSON array\n    value from an initializer list\n    @sa @ref object(initializer_list_t) -- create a JSON object\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    basic_json(initializer_list_t init,\n               bool type_deduction = true,\n               value_t manual_type = value_t::array)\n    {\n        // check if each element is an array with two elements whose first\n        // element is a string\n        bool is_an_object = std::all_of(init.begin(), init.end(),\n                                        [](const detail::json_ref<basic_json>& element_ref)\n        {\n            return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string();\n        });\n\n        // adjust type if type deduction is not wanted\n        if (!type_deduction)\n        {\n            // if array is wanted, do not create an object though possible\n            if (manual_type == value_t::array)\n            {\n                is_an_object = false;\n            }\n\n            // if object is wanted but impossible, throw an exception\n            if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object))\n            {\n                JSON_THROW(type_error::create(301, \"cannot create object from initializer list\"));\n            }\n        }\n\n        if (is_an_object)\n        {\n            // the initializer list is a list of pairs -> create object\n            m_type = value_t::object;\n            m_value = value_t::object;\n\n            std::for_each(init.begin(), init.end(), [this](const detail::json_ref<basic_json>& element_ref)\n            {\n                auto element = element_ref.moved_or_copied();\n                m_value.object->emplace(\n                    std::move(*((*element.m_value.array)[0].m_value.string)),\n                    std::move((*element.m_value.array)[1]));\n            });\n        }\n        else\n        {\n            // the initializer list describes an array -> create array\n            m_type = value_t::array;\n            m_value.array = create<array_t>(init.begin(), init.end());\n        }\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief explicitly create a binary array (without subtype)\n\n    Creates a JSON binary array value from a given binary container. Binary\n    values are part of various binary formats, such as CBOR, MessagePack, and\n    BSON. This constructor is used to create a value for serialization to those\n    formats.\n\n    @note Note, this function exists because of the difficulty in correctly\n    specifying the correct template overload in the standard value ctor, as both\n    JSON arrays and JSON binary arrays are backed with some form of a\n    `std::vector`. Because JSON binary arrays are a non-standard extension it\n    was decided that it would be best to prevent automatic initialization of a\n    binary array type, for backwards compatibility and so it does not happen on\n    accident.\n\n    @param[in] init container containing bytes to use as binary type\n\n    @return JSON binary array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @since version 3.8.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = init;\n        return res;\n    }\n\n    /*!\n    @brief explicitly create a binary array (with subtype)\n\n    Creates a JSON binary array value from a given binary container. Binary\n    values are part of various binary formats, such as CBOR, MessagePack, and\n    BSON. This constructor is used to create a value for serialization to those\n    formats.\n\n    @note Note, this function exists because of the difficulty in correctly\n    specifying the correct template overload in the standard value ctor, as both\n    JSON arrays and JSON binary arrays are backed with some form of a\n    `std::vector`. Because JSON binary arrays are a non-standard extension it\n    was decided that it would be best to prevent automatic initialization of a\n    binary array type, for backwards compatibility and so it does not happen on\n    accident.\n\n    @param[in] init container containing bytes to use as binary type\n    @param[in] subtype subtype to use in MessagePack and BSON\n\n    @return JSON binary array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @since version 3.8.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = binary_t(init, subtype);\n        return res;\n    }\n\n    /// @copydoc binary(const typename binary_t::container_type&)\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = std::move(init);\n        return res;\n    }\n\n    /// @copydoc binary(const typename binary_t::container_type&, std::uint8_t)\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = binary_t(std::move(init), subtype);\n        return res;\n    }\n\n    /*!\n    @brief explicitly create an array from an initializer list\n\n    Creates a JSON array value from a given initializer list. That is, given a\n    list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the\n    initializer list is empty, the empty array `[]` is created.\n\n    @note This function is only needed to express two edge cases that cannot\n    be realized with the initializer list constructor (@ref\n    basic_json(initializer_list_t, bool, value_t)). These cases\n    are:\n    1. creating an array whose elements are all pairs whose first element is a\n    string -- in this case, the initializer list constructor would create an\n    object, taking the first elements as keys\n    2. creating an empty array -- passing the empty initializer list to the\n    initializer list constructor yields an empty object\n\n    @param[in] init  initializer list with JSON values to create an array from\n    (optional)\n\n    @return JSON array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows an example for the `array`\n    function.,array}\n\n    @sa @ref basic_json(initializer_list_t, bool, value_t) --\n    create a JSON value from an initializer list\n    @sa @ref object(initializer_list_t) -- create a JSON object\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json array(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::array);\n    }\n\n    /*!\n    @brief explicitly create an object from an initializer list\n\n    Creates a JSON object value from a given initializer list. The initializer\n    lists elements must be pairs, and their first elements must be strings. If\n    the initializer list is empty, the empty object `{}` is created.\n\n    @note This function is only added for symmetry reasons. In contrast to the\n    related function @ref array(initializer_list_t), there are\n    no cases which can only be expressed by this function. That is, any\n    initializer list @a init can also be passed to the initializer list\n    constructor @ref basic_json(initializer_list_t, bool, value_t).\n\n    @param[in] init  initializer list to create an object from (optional)\n\n    @return JSON object value\n\n    @throw type_error.301 if @a init is not a list of pairs whose first\n    elements are strings. In this case, no object can be created. When such a\n    value is passed to @ref basic_json(initializer_list_t, bool, value_t),\n    an array would have been created from the passed initializer list @a init.\n    See example below.\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows an example for the `object`\n    function.,object}\n\n    @sa @ref basic_json(initializer_list_t, bool, value_t) --\n    create a JSON value from an initializer list\n    @sa @ref array(initializer_list_t) -- create a JSON array\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json object(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::object);\n    }\n\n    /*!\n    @brief construct an array with count copies of given value\n\n    Constructs a JSON array value by creating @a cnt copies of a passed value.\n    In case @a cnt is `0`, an empty array is created.\n\n    @param[in] cnt  the number of JSON copies of @a val to create\n    @param[in] val  the JSON value to copy\n\n    @post `std::distance(begin(),end()) == cnt` holds.\n\n    @complexity Linear in @a cnt.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows examples for the @ref\n    basic_json(size_type\\, const basic_json&)\n    constructor.,basic_json__size_type_basic_json}\n\n    @since version 1.0.0\n    */\n    basic_json(size_type cnt, const basic_json& val)\n        : m_type(value_t::array)\n    {\n        m_value.array = create<array_t>(cnt, val);\n        assert_invariant();\n    }\n\n    /*!\n    @brief construct a JSON container given an iterator range\n\n    Constructs the JSON value with the contents of the range `[first, last)`.\n    The semantics depends on the different types a JSON value can have:\n    - In case of a null type, invalid_iterator.206 is thrown.\n    - In case of other primitive types (number, boolean, or string), @a first\n      must be `begin()` and @a last must be `end()`. In this case, the value is\n      copied. Otherwise, invalid_iterator.204 is thrown.\n    - In case of structured types (array, object), the constructor behaves as\n      similar versions for `std::vector` or `std::map`; that is, a JSON array\n      or object is constructed from the values in the range.\n\n    @tparam InputIT an input iterator type (@ref iterator or @ref\n    const_iterator)\n\n    @param[in] first begin of the range to copy from (included)\n    @param[in] last end of the range to copy from (excluded)\n\n    @pre Iterators @a first and @a last must be initialized. **This\n         precondition is enforced with an assertion (see warning).** If\n         assertions are switched off, a violation of this precondition yields\n         undefined behavior.\n\n    @pre Range `[first, last)` is valid. Usually, this precondition cannot be\n         checked efficiently. Only certain edge cases are detected; see the\n         description of the exceptions below. A violation of this precondition\n         yields undefined behavior.\n\n    @warning A precondition is enforced with a runtime assertion that will\n             result in calling `std::abort` if this precondition is not met.\n             Assertions can be disabled by defining `NDEBUG` at compile time.\n             See https://en.cppreference.com/w/cpp/error/assert for more\n             information.\n\n    @throw invalid_iterator.201 if iterators @a first and @a last are not\n    compatible (i.e., do not belong to the same JSON value). In this case,\n    the range `[first, last)` is undefined.\n    @throw invalid_iterator.204 if iterators @a first and @a last belong to a\n    primitive type (number, boolean, or string), but @a first does not point\n    to the first element any more. In this case, the range `[first, last)` is\n    undefined. See example code below.\n    @throw invalid_iterator.206 if iterators @a first and @a last belong to a\n    null value. In this case, the range `[first, last)` is undefined.\n\n    @complexity Linear in distance between @a first and @a last.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The example below shows several ways to create JSON values by\n    specifying a subrange with iterators.,basic_json__InputIt_InputIt}\n\n    @since version 1.0.0\n    */\n    template < class InputIT, typename std::enable_if <\n                   std::is_same<InputIT, typename basic_json_t::iterator>::value ||\n                   std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >\n    basic_json(InputIT first, InputIT last)\n    {\n        JSON_ASSERT(first.m_object != nullptr);\n        JSON_ASSERT(last.m_object != nullptr);\n\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(201, \"iterators are not compatible\"));\n        }\n\n        // copy type from first iterator\n        m_type = first.m_object->m_type;\n\n        // check if iterator range is complete for primitive values\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin()\n                                         || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\"));\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n\n        switch (m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_value.number_integer = first.m_object->m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value.number_unsigned = first.m_object->m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value.number_float = first.m_object->m_value.number_float;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value.boolean = first.m_object->m_value.boolean;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value = *first.m_object->m_value.string;\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_value.object = create<object_t>(first.m_it.object_iterator,\n                                                  last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value.array = create<array_t>(first.m_it.array_iterator,\n                                                last.m_it.array_iterator);\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value = *first.m_object->m_value.binary;\n                break;\n            }\n\n            default:\n                JSON_THROW(invalid_iterator::create(206, \"cannot construct with iterators from \" +\n                                                    std::string(first.m_object->type_name())));\n        }\n\n        assert_invariant();\n    }\n\n\n    ///////////////////////////////////////\n    // other constructors and destructor //\n    ///////////////////////////////////////\n\n    template<typename JsonRef,\n             detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,\n                                 std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >\n    basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}\n\n    /*!\n    @brief copy constructor\n\n    Creates a copy of a given JSON value.\n\n    @param[in] other  the JSON value to copy\n\n    @post `*this == other`\n\n    @complexity Linear in the size of @a other.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n    - As postcondition, it holds: `other == basic_json(other)`.\n\n    @liveexample{The following code shows an example for the copy\n    constructor.,basic_json__basic_json}\n\n    @since version 1.0.0\n    */\n    basic_json(const basic_json& other)\n        : m_type(other.m_type)\n    {\n        // check of passed value is valid\n        other.assert_invariant();\n\n        switch (m_type)\n        {\n            case value_t::object:\n            {\n                m_value = *other.m_value.object;\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value = *other.m_value.array;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value = *other.m_value.string;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value = other.m_value.boolean;\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                m_value = other.m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value = other.m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value = other.m_value.number_float;\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value = *other.m_value.binary;\n                break;\n            }\n\n            default:\n                break;\n        }\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief move constructor\n\n    Move constructor. Constructs a JSON value with the contents of the given\n    value @a other using move semantics. It \"steals\" the resources from @a\n    other and leaves it as JSON null value.\n\n    @param[in,out] other  value to move to this object\n\n    @post `*this` has the same value as @a other before the call.\n    @post @a other is a JSON null value.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this constructor never throws\n    exceptions.\n\n    @requirement This function helps `basic_json` satisfying the\n    [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible)\n    requirements.\n\n    @liveexample{The code below shows the move constructor explicitly called\n    via std::move.,basic_json__moveconstructor}\n\n    @since version 1.0.0\n    */\n    basic_json(basic_json&& other) noexcept\n        : m_type(std::move(other.m_type)),\n          m_value(std::move(other.m_value))\n    {\n        // check that passed value is valid\n        other.assert_invariant();\n\n        // invalidate payload\n        other.m_type = value_t::null;\n        other.m_value = {};\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief copy assignment\n\n    Copy assignment operator. Copies a JSON value via the \"copy and swap\"\n    strategy: It is expressed in terms of the copy constructor, destructor,\n    and the `swap()` member function.\n\n    @param[in] other  value to copy from\n\n    @complexity Linear.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n\n    @liveexample{The code below shows and example for the copy assignment. It\n    creates a copy of value `a` which is then swapped with `b`. Finally\\, the\n    copy of `a` (which is the null value after the swap) is\n    destroyed.,basic_json__copyassignment}\n\n    @since version 1.0.0\n    */\n    basic_json& operator=(basic_json other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        // check that passed value is valid\n        other.assert_invariant();\n\n        using std::swap;\n        swap(m_type, other.m_type);\n        swap(m_value, other.m_value);\n\n        assert_invariant();\n        return *this;\n    }\n\n    /*!\n    @brief destructor\n\n    Destroys the JSON value and frees all allocated memory.\n\n    @complexity Linear.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n    - All stored elements are destroyed and all memory is freed.\n\n    @since version 1.0.0\n    */\n    ~basic_json() noexcept\n    {\n        assert_invariant();\n        m_value.destroy(m_type);\n    }\n\n    /// @}\n\n  public:\n    ///////////////////////\n    // object inspection //\n    ///////////////////////\n\n    /// @name object inspection\n    /// Functions to inspect the type of a JSON value.\n    /// @{\n\n    /*!\n    @brief serialization\n\n    Serialization function for JSON values. The function tries to mimic\n    Python's `json.dumps()` function, and currently supports its @a indent\n    and @a ensure_ascii parameters.\n\n    @param[in] indent If indent is nonnegative, then array elements and object\n    members will be pretty-printed with that indent level. An indent level of\n    `0` will only insert newlines. `-1` (the default) selects the most compact\n    representation.\n    @param[in] indent_char The character to use for indentation if @a indent is\n    greater than `0`. The default is ` ` (space).\n    @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters\n    in the output are escaped with `\\uXXXX` sequences, and the result consists\n    of ASCII characters only.\n    @param[in] error_handler  how to react on decoding errors; there are three\n    possible values: `strict` (throws and exception in case a decoding error\n    occurs; default), `replace` (replace invalid UTF-8 sequences with U+FFFD),\n    and `ignore` (ignore invalid UTF-8 sequences during serialization; all\n    bytes are copied to the output unchanged).\n\n    @return string containing the serialization of the JSON value\n\n    @throw type_error.316 if a string stored inside the JSON value is not\n                          UTF-8 encoded and @a error_handler is set to strict\n\n    @note Binary values are serialized as object containing two keys:\n      - \"bytes\": an array of bytes as integers\n      - \"subtype\": the subtype as integer or \"null\" if the binary has no subtype\n\n    @complexity Linear.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @liveexample{The following example shows the effect of different @a indent\\,\n    @a indent_char\\, and @a ensure_ascii parameters to the result of the\n    serialization.,dump}\n\n    @see https://docs.python.org/2/library/json.html#json.dump\n\n    @since version 1.0.0; indentation character @a indent_char, option\n           @a ensure_ascii and exceptions added in version 3.0.0; error\n           handlers added in version 3.4.0; serialization of binary values added\n           in version 3.8.0.\n    */\n    string_t dump(const int indent = -1,\n                  const char indent_char = ' ',\n                  const bool ensure_ascii = false,\n                  const error_handler_t error_handler = error_handler_t::strict) const\n    {\n        string_t result;\n        serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler);\n\n        if (indent >= 0)\n        {\n            s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent));\n        }\n        else\n        {\n            s.dump(*this, false, ensure_ascii, 0);\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief return the type of the JSON value (explicit)\n\n    Return the type of the JSON value as a value from the @ref value_t\n    enumeration.\n\n    @return the type of the JSON value\n            Value type                | return value\n            ------------------------- | -------------------------\n            null                      | value_t::null\n            boolean                   | value_t::boolean\n            string                    | value_t::string\n            number (integer)          | value_t::number_integer\n            number (unsigned integer) | value_t::number_unsigned\n            number (floating-point)   | value_t::number_float\n            object                    | value_t::object\n            array                     | value_t::array\n            binary                    | value_t::binary\n            discarded                 | value_t::discarded\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `type()` for all JSON\n    types.,type}\n\n    @sa @ref operator value_t() -- return the type of the JSON value (implicit)\n    @sa @ref type_name() -- return the type as string\n\n    @since version 1.0.0\n    */\n    constexpr value_t type() const noexcept\n    {\n        return m_type;\n    }\n\n    /*!\n    @brief return whether type is primitive\n\n    This function returns true if and only if the JSON type is primitive\n    (string, number, boolean, or null).\n\n    @return `true` if type is primitive (string, number, boolean, or null),\n    `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_primitive()` for all JSON\n    types.,is_primitive}\n\n    @sa @ref is_structured() -- returns whether JSON value is structured\n    @sa @ref is_null() -- returns whether JSON value is `null`\n    @sa @ref is_string() -- returns whether JSON value is a string\n    @sa @ref is_boolean() -- returns whether JSON value is a boolean\n    @sa @ref is_number() -- returns whether JSON value is a number\n    @sa @ref is_binary() -- returns whether JSON value is a binary array\n\n    @since version 1.0.0\n    */\n    constexpr bool is_primitive() const noexcept\n    {\n        return is_null() || is_string() || is_boolean() || is_number() || is_binary();\n    }\n\n    /*!\n    @brief return whether type is structured\n\n    This function returns true if and only if the JSON type is structured\n    (array or object).\n\n    @return `true` if type is structured (array or object), `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_structured()` for all JSON\n    types.,is_structured}\n\n    @sa @ref is_primitive() -- returns whether value is primitive\n    @sa @ref is_array() -- returns whether value is an array\n    @sa @ref is_object() -- returns whether value is an object\n\n    @since version 1.0.0\n    */\n    constexpr bool is_structured() const noexcept\n    {\n        return is_array() || is_object();\n    }\n\n    /*!\n    @brief return whether value is null\n\n    This function returns true if and only if the JSON value is null.\n\n    @return `true` if type is null, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_null()` for all JSON\n    types.,is_null}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_null() const noexcept\n    {\n        return m_type == value_t::null;\n    }\n\n    /*!\n    @brief return whether value is a boolean\n\n    This function returns true if and only if the JSON value is a boolean.\n\n    @return `true` if type is boolean, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_boolean()` for all JSON\n    types.,is_boolean}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_boolean() const noexcept\n    {\n        return m_type == value_t::boolean;\n    }\n\n    /*!\n    @brief return whether value is a number\n\n    This function returns true if and only if the JSON value is a number. This\n    includes both integer (signed and unsigned) and floating-point values.\n\n    @return `true` if type is number (regardless whether integer, unsigned\n    integer or floating-type), `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number()` for all JSON\n    types.,is_number}\n\n    @sa @ref is_number_integer() -- check if value is an integer or unsigned\n    integer number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number() const noexcept\n    {\n        return is_number_integer() || is_number_float();\n    }\n\n    /*!\n    @brief return whether value is an integer number\n\n    This function returns true if and only if the JSON value is a signed or\n    unsigned integer number. This excludes floating-point values.\n\n    @return `true` if type is an integer or unsigned integer number, `false`\n    otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_integer()` for all\n    JSON types.,is_number_integer}\n\n    @sa @ref is_number() -- check if value is a number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number_integer() const noexcept\n    {\n        return m_type == value_t::number_integer || m_type == value_t::number_unsigned;\n    }\n\n    /*!\n    @brief return whether value is an unsigned integer number\n\n    This function returns true if and only if the JSON value is an unsigned\n    integer number. This excludes floating-point and signed integer values.\n\n    @return `true` if type is an unsigned integer number, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_unsigned()` for all\n    JSON types.,is_number_unsigned}\n\n    @sa @ref is_number() -- check if value is a number\n    @sa @ref is_number_integer() -- check if value is an integer or unsigned\n    integer number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 2.0.0\n    */\n    constexpr bool is_number_unsigned() const noexcept\n    {\n        return m_type == value_t::number_unsigned;\n    }\n\n    /*!\n    @brief return whether value is a floating-point number\n\n    This function returns true if and only if the JSON value is a\n    floating-point number. This excludes signed and unsigned integer values.\n\n    @return `true` if type is a floating-point number, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_float()` for all\n    JSON types.,is_number_float}\n\n    @sa @ref is_number() -- check if value is number\n    @sa @ref is_number_integer() -- check if value is an integer number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number_float() const noexcept\n    {\n        return m_type == value_t::number_float;\n    }\n\n    /*!\n    @brief return whether value is an object\n\n    This function returns true if and only if the JSON value is an object.\n\n    @return `true` if type is object, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_object()` for all JSON\n    types.,is_object}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_object() const noexcept\n    {\n        return m_type == value_t::object;\n    }\n\n    /*!\n    @brief return whether value is an array\n\n    This function returns true if and only if the JSON value is an array.\n\n    @return `true` if type is array, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_array()` for all JSON\n    types.,is_array}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_array() const noexcept\n    {\n        return m_type == value_t::array;\n    }\n\n    /*!\n    @brief return whether value is a string\n\n    This function returns true if and only if the JSON value is a string.\n\n    @return `true` if type is string, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_string()` for all JSON\n    types.,is_string}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_string() const noexcept\n    {\n        return m_type == value_t::string;\n    }\n\n    /*!\n    @brief return whether value is a binary array\n\n    This function returns true if and only if the JSON value is a binary array.\n\n    @return `true` if type is binary array, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_binary()` for all JSON\n    types.,is_binary}\n\n    @since version 3.8.0\n    */\n    constexpr bool is_binary() const noexcept\n    {\n        return m_type == value_t::binary;\n    }\n\n    /*!\n    @brief return whether value is discarded\n\n    This function returns true if and only if the JSON value was discarded\n    during parsing with a callback function (see @ref parser_callback_t).\n\n    @note This function will always be `false` for JSON values after parsing.\n    That is, discarded values can only occur during parsing, but will be\n    removed when inside a structured value or replaced by null in other cases.\n\n    @return `true` if type is discarded, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_discarded()` for all JSON\n    types.,is_discarded}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_discarded() const noexcept\n    {\n        return m_type == value_t::discarded;\n    }\n\n    /*!\n    @brief return the type of the JSON value (implicit)\n\n    Implicitly return the type of the JSON value as a value from the @ref\n    value_t enumeration.\n\n    @return the type of the JSON value\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies the @ref value_t operator for\n    all JSON types.,operator__value_t}\n\n    @sa @ref type() -- return the type of the JSON value (explicit)\n    @sa @ref type_name() -- return the type as string\n\n    @since version 1.0.0\n    */\n    constexpr operator value_t() const noexcept\n    {\n        return m_type;\n    }\n\n    /// @}\n\n  private:\n    //////////////////\n    // value access //\n    //////////////////\n\n    /// get a boolean (explicit)\n    boolean_t get_impl(boolean_t* /*unused*/) const\n    {\n        if (JSON_HEDLEY_LIKELY(is_boolean()))\n        {\n            return m_value.boolean;\n        }\n\n        JSON_THROW(type_error::create(302, \"type must be boolean, but is \" + std::string(type_name())));\n    }\n\n    /// get a pointer to the value (object)\n    object_t* get_impl_ptr(object_t* /*unused*/) noexcept\n    {\n        return is_object() ? m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (object)\n    constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept\n    {\n        return is_object() ? m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    array_t* get_impl_ptr(array_t* /*unused*/) noexcept\n    {\n        return is_array() ? m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept\n    {\n        return is_array() ? m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    string_t* get_impl_ptr(string_t* /*unused*/) noexcept\n    {\n        return is_string() ? m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept\n    {\n        return is_string() ? m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept\n    {\n        return is_boolean() ? &m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept\n    {\n        return is_boolean() ? &m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept\n    {\n        return is_number_integer() ? &m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept\n    {\n        return is_number_integer() ? &m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept\n    {\n        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept\n    {\n        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept\n    {\n        return is_number_float() ? &m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept\n    {\n        return is_number_float() ? &m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept\n    {\n        return is_binary() ? m_value.binary : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept\n    {\n        return is_binary() ? m_value.binary : nullptr;\n    }\n\n    /*!\n    @brief helper function to implement get_ref()\n\n    This function helps to implement get_ref() without code duplication for\n    const and non-const overloads\n\n    @tparam ThisType will be deduced as `basic_json` or `const basic_json`\n\n    @throw type_error.303 if ReferenceType does not match underlying value\n    type of the current JSON\n    */\n    template<typename ReferenceType, typename ThisType>\n    static ReferenceType get_ref_impl(ThisType& obj)\n    {\n        // delegate the call to get_ptr<>()\n        auto ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();\n\n        if (JSON_HEDLEY_LIKELY(ptr != nullptr))\n        {\n            return *ptr;\n        }\n\n        JSON_THROW(type_error::create(303, \"incompatible ReferenceType for get_ref, actual type is \" + std::string(obj.type_name())));\n    }\n\n  public:\n    /// @name value access\n    /// Direct access to the stored value of a JSON value.\n    /// @{\n\n    /*!\n    @brief get special-case overload\n\n    This overloads avoids a lot of template boilerplate, it can be seen as the\n    identity method\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this\n\n    @complexity Constant.\n\n    @since version 2.1.0\n    */\n    template<typename BasicJsonType, detail::enable_if_t<\n                 std::is_same<typename std::remove_const<BasicJsonType>::type, basic_json_t>::value,\n                 int> = 0>\n    basic_json get() const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get special-case overload\n\n    This overloads converts the current @ref basic_json in a different\n    @ref basic_json type\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this, converted into @tparam BasicJsonType\n\n    @complexity Depending on the implementation of the called `from_json()`\n                method.\n\n    @since version 3.2.0\n    */\n    template < typename BasicJsonType, detail::enable_if_t <\n                   !std::is_same<BasicJsonType, basic_json>::value&&\n                   detail::is_basic_json<BasicJsonType>::value, int > = 0 >\n    BasicJsonType get() const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get a value (explicit)\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    ValueType ret;\n    JSONSerializer<ValueType>::from_json(*this, ret);\n    return ret;\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json,\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `void from_json(const basic_json&, ValueType&)`, and\n    - @ref json_serializer<ValueType> does not have a `from_json()` method of\n      the form `ValueType from_json(const basic_json&)`\n\n    @tparam ValueTypeCV the provided value type\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,get__ValueType_const}\n\n    @since version 2.1.0\n    */\n    template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,\n               detail::enable_if_t <\n                   !detail::is_basic_json<ValueType>::value &&\n                   detail::has_from_json<basic_json_t, ValueType>::value &&\n                   !detail::has_non_default_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType get() const noexcept(noexcept(\n                                       JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))\n    {\n        // we cannot static_assert on ValueTypeCV being non-const, because\n        // there is support for get<const basic_json_t>(), which is why we\n        // still need the uncvref\n        static_assert(!std::is_reference<ValueTypeCV>::value,\n                      \"get() cannot be used with reference types, you might want to use get_ref()\");\n        static_assert(std::is_default_constructible<ValueType>::value,\n                      \"types must be DefaultConstructible when used with get()\");\n\n        ValueType ret;\n        JSONSerializer<ValueType>::from_json(*this, ret);\n        return ret;\n    }\n\n    /*!\n    @brief get a value (explicit); special case\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    return JSONSerializer<ValueTypeCV>::from_json(*this);\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json and\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `ValueType from_json(const basic_json&)`\n\n    @note If @ref json_serializer<ValueType> has both overloads of\n    `from_json()`, this one is chosen.\n\n    @tparam ValueTypeCV the provided value type\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @since version 2.1.0\n    */\n    template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,\n               detail::enable_if_t < !std::is_same<basic_json_t, ValueType>::value &&\n                                     detail::has_non_default_from_json<basic_json_t, ValueType>::value,\n                                     int > = 0 >\n    ValueType get() const noexcept(noexcept(\n                                       JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))\n    {\n        static_assert(!std::is_reference<ValueTypeCV>::value,\n                      \"get() cannot be used with reference types, you might want to use get_ref()\");\n        return JSONSerializer<ValueType>::from_json(*this);\n    }\n\n    /*!\n    @brief get a value (explicit)\n\n    Explicit type conversion between the JSON value and a compatible value.\n    The value is filled into the input parameter by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    ValueType v;\n    JSONSerializer<ValueType>::from_json(*this, v);\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json,\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `void from_json(const basic_json&, ValueType&)`, and\n\n    @tparam ValueType the input parameter type.\n\n    @return the input parameter, allowing chaining calls.\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,get_to}\n\n    @since version 3.3.0\n    */\n    template < typename ValueType,\n               detail::enable_if_t <\n                   !detail::is_basic_json<ValueType>::value&&\n                   detail::has_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType & get_to(ValueType& v) const noexcept(noexcept(\n                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<ValueType>::from_json(*this, v);\n        return v;\n    }\n\n    // specialization to allow to call get_to with a basic_json value\n    // see https://github.com/nlohmann/json/issues/2175\n    template<typename ValueType,\n             detail::enable_if_t <\n                 detail::is_basic_json<ValueType>::value,\n                 int> = 0>\n    ValueType & get_to(ValueType& v) const\n    {\n        v = *this;\n        return v;\n    }\n\n    template <\n        typename T, std::size_t N,\n        typename Array = T (&)[N],\n        detail::enable_if_t <\n            detail::has_from_json<basic_json_t, Array>::value, int > = 0 >\n    Array get_to(T (&v)[N]) const\n    noexcept(noexcept(JSONSerializer<Array>::from_json(\n                          std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<Array>::from_json(*this, v);\n        return v;\n    }\n\n\n    /*!\n    @brief get a pointer value (implicit)\n\n    Implicit pointer access to the internally stored JSON value. No copies are\n    made.\n\n    @warning Writing data to the pointee of the result yields an undefined\n    state.\n\n    @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref\n    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,\n    @ref number_unsigned_t, or @ref number_float_t. Enforced by a static\n    assertion.\n\n    @return pointer to the internally stored JSON value if the requested\n    pointer type @a PointerType fits to the JSON value; `nullptr` otherwise\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how pointers to internal values of a\n    JSON value can be requested. Note that no type conversions are made and a\n    `nullptr` is returned if the value and the requested pointer type does not\n    match.,get_ptr}\n\n    @since version 1.0.0\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>()\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n    /*!\n    @brief get a pointer value (implicit)\n    @copydoc get_ptr()\n    */\n    template < typename PointerType, typename std::enable_if <\n                   std::is_pointer<PointerType>::value&&\n                   std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 >\n    constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>() const\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n\n    Explicit pointer access to the internally stored JSON value. No copies are\n    made.\n\n    @warning The pointer becomes invalid if the underlying JSON object\n    changes.\n\n    @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref\n    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,\n    @ref number_unsigned_t, or @ref number_float_t.\n\n    @return pointer to the internally stored JSON value if the requested\n    pointer type @a PointerType fits to the JSON value; `nullptr` otherwise\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how pointers to internal values of a\n    JSON value can be requested. Note that no type conversions are made and a\n    `nullptr` is returned if the value and the requested pointer type does not\n    match.,get__PointerType}\n\n    @sa @ref get_ptr() for explicit pointer-member access\n\n    @since version 1.0.0\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n    @copydoc get()\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    constexpr auto get() const noexcept -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n    /*!\n    @brief get a reference value (implicit)\n\n    Implicit reference access to the internally stored JSON value. No copies\n    are made.\n\n    @warning Writing data to the referee of the result yields an undefined\n    state.\n\n    @tparam ReferenceType reference type; must be a reference to @ref array_t,\n    @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or\n    @ref number_float_t. Enforced by static assertion.\n\n    @return reference to the internally stored JSON value if the requested\n    reference type @a ReferenceType fits to the JSON value; throws\n    type_error.303 otherwise\n\n    @throw type_error.303 in case passed type @a ReferenceType is incompatible\n    with the stored JSON value; see example below\n\n    @complexity Constant.\n\n    @liveexample{The example shows several calls to `get_ref()`.,get_ref}\n\n    @since version 1.1.0\n    */\n    template<typename ReferenceType, typename std::enable_if<\n                 std::is_reference<ReferenceType>::value, int>::type = 0>\n    ReferenceType get_ref()\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /*!\n    @brief get a reference value (implicit)\n    @copydoc get_ref()\n    */\n    template < typename ReferenceType, typename std::enable_if <\n                   std::is_reference<ReferenceType>::value&&\n                   std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 >\n    ReferenceType get_ref() const\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /*!\n    @brief get a value (implicit)\n\n    Implicit type conversion between the JSON value and a compatible value.\n    The call is realized by calling @ref get() const.\n\n    @tparam ValueType non-pointer type compatible to the JSON value, for\n    instance `int` for JSON integer numbers, `bool` for JSON booleans, or\n    `std::vector` types for JSON arrays. The character type of @ref string_t\n    as well as an initializer list of this type is excluded to avoid\n    ambiguities as these types implicitly convert to `std::string`.\n\n    @return copy of the JSON value, converted to type @a ValueType\n\n    @throw type_error.302 in case passed type @a ValueType is incompatible\n    to the JSON value type (e.g., the JSON value is of type boolean, but a\n    string is requested); see example below\n\n    @complexity Linear in the size of the JSON value.\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,operator__ValueType}\n\n    @since version 1.0.0\n    */\n    template < typename ValueType, typename std::enable_if <\n                   !std::is_pointer<ValueType>::value&&\n                   !std::is_same<ValueType, detail::json_ref<basic_json>>::value&&\n                   !std::is_same<ValueType, typename string_t::value_type>::value&&\n                   !detail::is_basic_json<ValueType>::value\n                   && !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value\n#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))\n                   && !std::is_same<ValueType, typename std::string_view>::value\n#endif\n                   && detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value\n                   , int >::type = 0 >\n    JSON_EXPLICIT operator ValueType() const\n    {\n        // delegate the call to get<>() const\n        return get<ValueType>();\n    }\n\n    /*!\n    @return reference to the binary value\n\n    @throw type_error.302 if the value is not binary\n\n    @sa @ref is_binary() to check if the value is binary\n\n    @since version 3.8.0\n    */\n    binary_t& get_binary()\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(type_name())));\n        }\n\n        return *get_ptr<binary_t*>();\n    }\n\n    /// @copydoc get_binary()\n    const binary_t& get_binary() const\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(type_name())));\n        }\n\n        return *get_ptr<const binary_t*>();\n    }\n\n    /// @}\n\n\n    ////////////////////\n    // element access //\n    ////////////////////\n\n    /// @name element access\n    /// Access to the JSON value.\n    /// @{\n\n    /*!\n    @brief access specified array element with bounds checking\n\n    Returns a reference to the element at specified location @a idx, with\n    bounds checking.\n\n    @param[in] idx  index of the element to access\n\n    @return reference to the element at index @a idx\n\n    @throw type_error.304 if the JSON value is not an array; in this case,\n    calling `at` with an index makes no sense. See example below.\n    @throw out_of_range.401 if the index @a idx is out of range of the array;\n    that is, `idx >= size()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how array elements can be read and\n    written using `at()`. It also demonstrates the different exceptions that\n    can be thrown.,at__size_type}\n    */\n    reference at(size_type idx)\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return m_value.array->at(idx);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified array element with bounds checking\n\n    Returns a const reference to the element at specified location @a idx,\n    with bounds checking.\n\n    @param[in] idx  index of the element to access\n\n    @return const reference to the element at index @a idx\n\n    @throw type_error.304 if the JSON value is not an array; in this case,\n    calling `at` with an index makes no sense. See example below.\n    @throw out_of_range.401 if the index @a idx is out of range of the array;\n    that is, `idx >= size()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how array elements can be read using\n    `at()`. It also demonstrates the different exceptions that can be thrown.,\n    at__size_type_const}\n    */\n    const_reference at(size_type idx) const\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return m_value.array->at(idx);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified object element with bounds checking\n\n    Returns a reference to the element at with specified key @a key, with\n    bounds checking.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.304 if the JSON value is not an object; in this case,\n    calling `at` with a key makes no sense. See example below.\n    @throw out_of_range.403 if the key @a key is is not stored in the object;\n    that is, `find(key) == end()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Logarithmic in the size of the container.\n\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how object elements can be read and\n    written using `at()`. It also demonstrates the different exceptions that\n    can be thrown.,at__object_t_key_type}\n    */\n    reference at(const typename object_t::key_type& key)\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_TRY\n            {\n                return m_value.object->at(key);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(403, \"key '\" + key + \"' not found\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified object element with bounds checking\n\n    Returns a const reference to the element at with specified key @a key,\n    with bounds checking.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @throw type_error.304 if the JSON value is not an object; in this case,\n    calling `at` with a key makes no sense. See example below.\n    @throw out_of_range.403 if the key @a key is is not stored in the object;\n    that is, `find(key) == end()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Logarithmic in the size of the container.\n\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how object elements can be read using\n    `at()`. It also demonstrates the different exceptions that can be thrown.,\n    at__object_t_key_type_const}\n    */\n    const_reference at(const typename object_t::key_type& key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_TRY\n            {\n                return m_value.object->at(key);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(403, \"key '\" + key + \"' not found\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified array element\n\n    Returns a reference to the element at specified location @a idx.\n\n    @note If @a idx is beyond the range of the array (i.e., `idx >= size()`),\n    then the array is silently filled up with `null` values to make `idx` a\n    valid reference to the last stored element.\n\n    @param[in] idx  index of the element to access\n\n    @return reference to the element at index @a idx\n\n    @throw type_error.305 if the JSON value is not an array or null; in that\n    cases, using the [] operator with an index makes no sense.\n\n    @complexity Constant if @a idx is in the range of the array. Otherwise\n    linear in `idx - size()`.\n\n    @liveexample{The example below shows how array elements can be read and\n    written using `[]` operator. Note the addition of `null`\n    values.,operatorarray__size_type}\n\n    @since version 1.0.0\n    */\n    reference operator[](size_type idx)\n    {\n        // implicitly convert null value to an empty array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value.array = create<array_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // fill up array with null values if given idx is outside range\n            if (idx >= m_value.array->size())\n            {\n                m_value.array->insert(m_value.array->end(),\n                                      idx - m_value.array->size() + 1,\n                                      basic_json());\n            }\n\n            return m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a numeric argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified array element\n\n    Returns a const reference to the element at specified location @a idx.\n\n    @param[in] idx  index of the element to access\n\n    @return const reference to the element at index @a idx\n\n    @throw type_error.305 if the JSON value is not an array; in that case,\n    using the [] operator with an index makes no sense.\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how array elements can be read using\n    the `[]` operator.,operatorarray__size_type_const}\n\n    @since version 1.0.0\n    */\n    const_reference operator[](size_type idx) const\n    {\n        // const operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            return m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a numeric argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element\n\n    Returns a reference to the element at with specified key @a key.\n\n    @note If @a key is not found in the object, then it is silently added to\n    the object and filled with a `null` value to make `key` a valid reference.\n    In case the value was `null` before, it is converted to an object.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.305 if the JSON value is not an object or null; in that\n    cases, using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read and\n    written using the `[]` operator.,operatorarray__key_type}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n    */\n    reference operator[](const typename object_t::key_type& key)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->operator[](key);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief read-only access specified object element\n\n    Returns a const reference to the element at with specified key @a key. No\n    bounds checking is performed.\n\n    @warning If the element with key @a key does not exist, the behavior is\n    undefined.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @pre The element with key @a key must exist. **This precondition is\n         enforced with an assertion.**\n\n    @throw type_error.305 if the JSON value is not an object; in that case,\n    using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read using\n    the `[]` operator.,operatorarray__key_type_const}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n    */\n    const_reference operator[](const typename object_t::key_type& key) const\n    {\n        // const operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_ASSERT(m_value.object->find(key) != m_value.object->end());\n            return m_value.object->find(key)->second;\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element\n\n    Returns a reference to the element at with specified key @a key.\n\n    @note If @a key is not found in the object, then it is silently added to\n    the object and filled with a `null` value to make `key` a valid reference.\n    In case the value was `null` before, it is converted to an object.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.305 if the JSON value is not an object or null; in that\n    cases, using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read and\n    written using the `[]` operator.,operatorarray__key_type}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.1.0\n    */\n    template<typename T>\n    JSON_HEDLEY_NON_NULL(2)\n    reference operator[](T* key)\n    {\n        // implicitly convert null to object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->operator[](key);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief read-only access specified object element\n\n    Returns a const reference to the element at with specified key @a key. No\n    bounds checking is performed.\n\n    @warning If the element with key @a key does not exist, the behavior is\n    undefined.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @pre The element with key @a key must exist. **This precondition is\n         enforced with an assertion.**\n\n    @throw type_error.305 if the JSON value is not an object; in that case,\n    using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read using\n    the `[]` operator.,operatorarray__key_type_const}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.1.0\n    */\n    template<typename T>\n    JSON_HEDLEY_NON_NULL(2)\n    const_reference operator[](T* key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_ASSERT(m_value.object->find(key) != m_value.object->end());\n            return m_value.object->find(key)->second;\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element with default value\n\n    Returns either a copy of an object's element at the specified key @a key\n    or a given default value if no element with key @a key exists.\n\n    The function is basically equivalent to executing\n    @code {.cpp}\n    try {\n        return at(key);\n    } catch(out_of_range) {\n        return default_value;\n    }\n    @endcode\n\n    @note Unlike @ref at(const typename object_t::key_type&), this function\n    does not throw if the given key @a key was not found.\n\n    @note Unlike @ref operator[](const typename object_t::key_type& key), this\n    function does not implicitly add an element to the position defined by @a\n    key. This function is furthermore also applicable to const objects.\n\n    @param[in] key  key of the element to access\n    @param[in] default_value  the value to return if @a key is not found\n\n    @tparam ValueType type compatible to JSON values, for instance `int` for\n    JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for\n    JSON arrays. Note the type of the expected value at @a key and the default\n    value @a default_value must be compatible.\n\n    @return copy of the element at key @a key or @a default_value if @a key\n    is not found\n\n    @throw type_error.302 if @a default_value does not match the type of the\n    value at @a key\n    @throw type_error.306 if the JSON value is not an object; in that case,\n    using `value()` with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be queried\n    with a default value.,basic_json__value}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n\n    @since version 1.0.0\n    */\n    // using std::is_convertible in a std::enable_if will fail when using explicit conversions\n    template < class ValueType, typename std::enable_if <\n                   detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, ValueType>::value, int >::type = 0 >\n    ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(key);\n            if (it != end())\n            {\n                return it->template get<ValueType>();\n            }\n\n            return default_value;\n        }\n\n        JSON_THROW(type_error::create(306, \"cannot use value() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief overload for a default value of type const char*\n    @copydoc basic_json::value(const typename object_t::key_type&, const ValueType&) const\n    */\n    string_t value(const typename object_t::key_type& key, const char* default_value) const\n    {\n        return value(key, string_t(default_value));\n    }\n\n    /*!\n    @brief access specified object element via JSON Pointer with default value\n\n    Returns either a copy of an object's element at the specified key @a key\n    or a given default value if no element with key @a key exists.\n\n    The function is basically equivalent to executing\n    @code {.cpp}\n    try {\n        return at(ptr);\n    } catch(out_of_range) {\n        return default_value;\n    }\n    @endcode\n\n    @note Unlike @ref at(const json_pointer&), this function does not throw\n    if the given key @a key was not found.\n\n    @param[in] ptr  a JSON pointer to the element to access\n    @param[in] default_value  the value to return if @a ptr found no value\n\n    @tparam ValueType type compatible to JSON values, for instance `int` for\n    JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for\n    JSON arrays. Note the type of the expected value at @a key and the default\n    value @a default_value must be compatible.\n\n    @return copy of the element at key @a key or @a default_value if @a key\n    is not found\n\n    @throw type_error.302 if @a default_value does not match the type of the\n    value at @a ptr\n    @throw type_error.306 if the JSON value is not an object; in that case,\n    using `value()` with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be queried\n    with a default value.,basic_json__value_ptr}\n\n    @sa @ref operator[](const json_pointer&) for unchecked access by reference\n\n    @since version 2.0.2\n    */\n    template<class ValueType, typename std::enable_if<\n                 detail::is_getable<basic_json_t, ValueType>::value, int>::type = 0>\n    ValueType value(const json_pointer& ptr, const ValueType& default_value) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if pointer resolves a value, return it or use default value\n            JSON_TRY\n            {\n                return ptr.get_checked(this).template get<ValueType>();\n            }\n            JSON_INTERNAL_CATCH (out_of_range&)\n            {\n                return default_value;\n            }\n        }\n\n        JSON_THROW(type_error::create(306, \"cannot use value() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief overload for a default value of type const char*\n    @copydoc basic_json::value(const json_pointer&, ValueType) const\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    string_t value(const json_pointer& ptr, const char* default_value) const\n    {\n        return value(ptr, string_t(default_value));\n    }\n\n    /*!\n    @brief access the first element\n\n    Returns a reference to the first element in the container. For a JSON\n    container `c`, the expression `c.front()` is equivalent to `*c.begin()`.\n\n    @return In case of a structured type (array or object), a reference to the\n    first element is returned. In case of number, string, boolean, or binary\n    values, a reference to the value is returned.\n\n    @complexity Constant.\n\n    @pre The JSON value must not be `null` (would throw `std::out_of_range`)\n    or an empty array or object (undefined behavior, **guarded by\n    assertions**).\n    @post The JSON value remains unchanged.\n\n    @throw invalid_iterator.214 when called on `null` value\n\n    @liveexample{The following code shows an example for `front()`.,front}\n\n    @sa @ref back() -- access the last element\n\n    @since version 1.0.0\n    */\n    reference front()\n    {\n        return *begin();\n    }\n\n    /*!\n    @copydoc basic_json::front()\n    */\n    const_reference front() const\n    {\n        return *cbegin();\n    }\n\n    /*!\n    @brief access the last element\n\n    Returns a reference to the last element in the container. For a JSON\n    container `c`, the expression `c.back()` is equivalent to\n    @code {.cpp}\n    auto tmp = c.end();\n    --tmp;\n    return *tmp;\n    @endcode\n\n    @return In case of a structured type (array or object), a reference to the\n    last element is returned. In case of number, string, boolean, or binary\n    values, a reference to the value is returned.\n\n    @complexity Constant.\n\n    @pre The JSON value must not be `null` (would throw `std::out_of_range`)\n    or an empty array or object (undefined behavior, **guarded by\n    assertions**).\n    @post The JSON value remains unchanged.\n\n    @throw invalid_iterator.214 when called on a `null` value. See example\n    below.\n\n    @liveexample{The following code shows an example for `back()`.,back}\n\n    @sa @ref front() -- access the first element\n\n    @since version 1.0.0\n    */\n    reference back()\n    {\n        auto tmp = end();\n        --tmp;\n        return *tmp;\n    }\n\n    /*!\n    @copydoc basic_json::back()\n    */\n    const_reference back() const\n    {\n        auto tmp = cend();\n        --tmp;\n        return *tmp;\n    }\n\n    /*!\n    @brief remove element given an iterator\n\n    Removes the element specified by iterator @a pos. The iterator @a pos must\n    be valid and dereferenceable. Thus the `end()` iterator (which is valid,\n    but is not dereferenceable) cannot be used as a value for @a pos.\n\n    If called on a primitive type other than `null`, the resulting JSON value\n    will be `null`.\n\n    @param[in] pos iterator to the element to remove\n    @return Iterator following the last removed element. If the iterator @a\n    pos refers to the last element, the `end()` iterator is returned.\n\n    @tparam IteratorType an @ref iterator or @ref const_iterator\n\n    @post Invalidates iterators and references at or after the point of the\n    erase, including the `end()` iterator.\n\n    @throw type_error.307 if called on a `null` value; example: `\"cannot use\n    erase() with null\"`\n    @throw invalid_iterator.202 if called on an iterator which does not belong\n    to the current JSON value; example: `\"iterator does not fit current\n    value\"`\n    @throw invalid_iterator.205 if called on a primitive type with invalid\n    iterator (i.e., any iterator which is not `begin()`); example: `\"iterator\n    out of range\"`\n\n    @complexity The complexity depends on the type:\n    - objects: amortized constant\n    - arrays: linear in distance between @a pos and the end of the container\n    - strings and binary: linear in the length of the member\n    - other types: constant\n\n    @liveexample{The example shows the result of `erase()` for different JSON\n    types.,erase__IteratorType}\n\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    template < class IteratorType, typename std::enable_if <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type\n               = 0 >\n    IteratorType erase(IteratorType pos)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        IteratorType result = end();\n\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin()))\n                {\n                    JSON_THROW(invalid_iterator::create(205, \"iterator out of range\"));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);\n                    m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);\n                    m_value.binary = nullptr;\n                }\n\n                m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator);\n                break;\n            }\n\n            default:\n                JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief remove elements given an iterator range\n\n    Removes the element specified by the range `[first; last)`. The iterator\n    @a first does not need to be dereferenceable if `first == last`: erasing\n    an empty range is a no-op.\n\n    If called on a primitive type other than `null`, the resulting JSON value\n    will be `null`.\n\n    @param[in] first iterator to the beginning of the range to remove\n    @param[in] last iterator past the end of the range to remove\n    @return Iterator following the last removed element. If the iterator @a\n    second refers to the last element, the `end()` iterator is returned.\n\n    @tparam IteratorType an @ref iterator or @ref const_iterator\n\n    @post Invalidates iterators and references at or after the point of the\n    erase, including the `end()` iterator.\n\n    @throw type_error.307 if called on a `null` value; example: `\"cannot use\n    erase() with null\"`\n    @throw invalid_iterator.203 if called on iterators which does not belong\n    to the current JSON value; example: `\"iterators do not fit current value\"`\n    @throw invalid_iterator.204 if called on a primitive type with invalid\n    iterators (i.e., if `first != begin()` and `last != end()`); example:\n    `\"iterators out of range\"`\n\n    @complexity The complexity depends on the type:\n    - objects: `log(size()) + std::distance(first, last)`\n    - arrays: linear in the distance between @a first and @a last, plus linear\n      in the distance between @a last and end of the container\n    - strings and binary: linear in the length of the member\n    - other types: constant\n\n    @liveexample{The example shows the result of `erase()` for different JSON\n    types.,erase__IteratorType_IteratorType}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    template < class IteratorType, typename std::enable_if <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type\n               = 0 >\n    IteratorType erase(IteratorType first, IteratorType last)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(203, \"iterators do not fit current value\"));\n        }\n\n        IteratorType result = end();\n\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin()\n                                       || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\"));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);\n                    m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);\n                    m_value.binary = nullptr;\n                }\n\n                m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator,\n                                              last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator,\n                                             last.m_it.array_iterator);\n                break;\n            }\n\n            default:\n                JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief remove element from a JSON object given a key\n\n    Removes elements from a JSON object with the key value @a key.\n\n    @param[in] key value of the elements to remove\n\n    @return Number of elements removed. If @a ObjectType is the default\n    `std::map` type, the return value will always be `0` (@a key was not\n    found) or `1` (@a key was found).\n\n    @post References and iterators to the erased elements are invalidated.\n    Other references and iterators are not affected.\n\n    @throw type_error.307 when called on a type other than JSON object;\n    example: `\"cannot use erase() with null\"`\n\n    @complexity `log(size()) + count(key)`\n\n    @liveexample{The example shows the effect of `erase()`.,erase__key_type}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    size_type erase(const typename object_t::key_type& key)\n    {\n        // this erase only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->erase(key);\n        }\n\n        JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief remove element from a JSON array given an index\n\n    Removes element from a JSON array at the index @a idx.\n\n    @param[in] idx index of the element to remove\n\n    @throw type_error.307 when called on a type other than JSON object;\n    example: `\"cannot use erase() with null\"`\n    @throw out_of_range.401 when `idx >= size()`; example: `\"array index 17\n    is out of range\"`\n\n    @complexity Linear in distance between @a idx and the end of the container.\n\n    @liveexample{The example shows the effect of `erase()`.,erase__size_type}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n\n    @since version 1.0.0\n    */\n    void erase(const size_type idx)\n    {\n        // this erase only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            if (JSON_HEDLEY_UNLIKELY(idx >= size()))\n            {\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n\n            m_value.array->erase(m_value.array->begin() + static_cast<difference_type>(idx));\n        }\n        else\n        {\n            JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @}\n\n\n    ////////////\n    // lookup //\n    ////////////\n\n    /// @name lookup\n    /// @{\n\n    /*!\n    @brief find an element in a JSON object\n\n    Finds an element in a JSON object with key equivalent to @a key. If the\n    element is not found or the JSON value is not an object, end() is\n    returned.\n\n    @note This method always returns @ref end() when executed on a JSON type\n          that is not an object.\n\n    @param[in] key key value of the element to search for.\n\n    @return Iterator to an element with key equivalent to @a key. If no such\n    element is found or the JSON value is not an object, past-the-end (see\n    @ref end()) iterator is returned.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The example shows how `find()` is used.,find__key_type}\n\n    @sa @ref contains(KeyT&&) const -- checks whether a key exists\n\n    @since version 1.0.0\n    */\n    template<typename KeyT>\n    iterator find(KeyT&& key)\n    {\n        auto result = end();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief find an element in a JSON object\n    @copydoc find(KeyT&&)\n    */\n    template<typename KeyT>\n    const_iterator find(KeyT&& key) const\n    {\n        auto result = cend();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief returns the number of occurrences of a key in a JSON object\n\n    Returns the number of elements with key @a key. If ObjectType is the\n    default `std::map` type, the return value will always be `0` (@a key was\n    not found) or `1` (@a key was found).\n\n    @note This method always returns `0` when executed on a JSON type that is\n          not an object.\n\n    @param[in] key key value of the element to count\n\n    @return Number of elements with key @a key. If the JSON value is not an\n    object, the return value will be `0`.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The example shows how `count()` is used.,count}\n\n    @since version 1.0.0\n    */\n    template<typename KeyT>\n    size_type count(KeyT&& key) const\n    {\n        // return 0 for all nonobject types\n        return is_object() ? m_value.object->count(std::forward<KeyT>(key)) : 0;\n    }\n\n    /*!\n    @brief check the existence of an element in a JSON object\n\n    Check whether an element exists in a JSON object with key equivalent to\n    @a key. If the element is not found or the JSON value is not an object,\n    false is returned.\n\n    @note This method always returns false when executed on a JSON type\n          that is not an object.\n\n    @param[in] key key value to check its existence.\n\n    @return true if an element with specified @a key exists. If no such\n    element with such key is found or the JSON value is not an object,\n    false is returned.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The following code shows an example for `contains()`.,contains}\n\n    @sa @ref find(KeyT&&) -- returns an iterator to an object element\n    @sa @ref contains(const json_pointer&) const -- checks the existence for a JSON pointer\n\n    @since version 3.6.0\n    */\n    template < typename KeyT, typename std::enable_if <\n                   !std::is_same<typename std::decay<KeyT>::type, json_pointer>::value, int >::type = 0 >\n    bool contains(KeyT && key) const\n    {\n        return is_object() && m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end();\n    }\n\n    /*!\n    @brief check the existence of an element in a JSON object given a JSON pointer\n\n    Check whether the given JSON pointer @a ptr can be resolved in the current\n    JSON value.\n\n    @note This method can be executed on any JSON value type.\n\n    @param[in] ptr JSON pointer to check its existence.\n\n    @return true if the JSON pointer can be resolved to a stored value, false\n    otherwise.\n\n    @post If `j.contains(ptr)` returns true, it is safe to call `j[ptr]`.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The following code shows an example for `contains()`.,contains_json_pointer}\n\n    @sa @ref contains(KeyT &&) const -- checks the existence of a key\n\n    @since version 3.7.0\n    */\n    bool contains(const json_pointer& ptr) const\n    {\n        return ptr.contains(this);\n    }\n\n    /// @}\n\n\n    ///////////////\n    // iterators //\n    ///////////////\n\n    /// @name iterators\n    /// @{\n\n    /*!\n    @brief returns an iterator to the first element\n\n    Returns an iterator to the first element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return iterator to the first element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n\n    @liveexample{The following code shows an example for `begin()`.,begin}\n\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref cend() -- returns a const iterator to the end\n\n    @since version 1.0.0\n    */\n    iterator begin() noexcept\n    {\n        iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /*!\n    @copydoc basic_json::cbegin()\n    */\n    const_iterator begin() const noexcept\n    {\n        return cbegin();\n    }\n\n    /*!\n    @brief returns a const iterator to the first element\n\n    Returns a const iterator to the first element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return const iterator to the first element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).begin()`.\n\n    @liveexample{The following code shows an example for `cbegin()`.,cbegin}\n\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref cend() -- returns a const iterator to the end\n\n    @since version 1.0.0\n    */\n    const_iterator cbegin() const noexcept\n    {\n        const_iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /*!\n    @brief returns an iterator to one past the last element\n\n    Returns an iterator to one past the last element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return iterator one past the last element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n\n    @liveexample{The following code shows an example for `end()`.,end}\n\n    @sa @ref cend() -- returns a const iterator to the end\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n\n    @since version 1.0.0\n    */\n    iterator end() noexcept\n    {\n        iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /*!\n    @copydoc basic_json::cend()\n    */\n    const_iterator end() const noexcept\n    {\n        return cend();\n    }\n\n    /*!\n    @brief returns a const iterator to one past the last element\n\n    Returns a const iterator to one past the last element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return const iterator one past the last element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).end()`.\n\n    @liveexample{The following code shows an example for `cend()`.,cend}\n\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n\n    @since version 1.0.0\n    */\n    const_iterator cend() const noexcept\n    {\n        const_iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /*!\n    @brief returns an iterator to the reverse-beginning\n\n    Returns an iterator to the reverse-beginning; that is, the last element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `reverse_iterator(end())`.\n\n    @liveexample{The following code shows an example for `rbegin()`.,rbegin}\n\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref crend() -- returns a const reverse iterator to the end\n\n    @since version 1.0.0\n    */\n    reverse_iterator rbegin() noexcept\n    {\n        return reverse_iterator(end());\n    }\n\n    /*!\n    @copydoc basic_json::crbegin()\n    */\n    const_reverse_iterator rbegin() const noexcept\n    {\n        return crbegin();\n    }\n\n    /*!\n    @brief returns an iterator to the reverse-end\n\n    Returns an iterator to the reverse-end; that is, one before the first\n    element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `reverse_iterator(begin())`.\n\n    @liveexample{The following code shows an example for `rend()`.,rend}\n\n    @sa @ref crend() -- returns a const reverse iterator to the end\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n\n    @since version 1.0.0\n    */\n    reverse_iterator rend() noexcept\n    {\n        return reverse_iterator(begin());\n    }\n\n    /*!\n    @copydoc basic_json::crend()\n    */\n    const_reverse_iterator rend() const noexcept\n    {\n        return crend();\n    }\n\n    /*!\n    @brief returns a const reverse iterator to the last element\n\n    Returns a const iterator to the reverse-beginning; that is, the last\n    element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).rbegin()`.\n\n    @liveexample{The following code shows an example for `crbegin()`.,crbegin}\n\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref crend() -- returns a const reverse iterator to the end\n\n    @since version 1.0.0\n    */\n    const_reverse_iterator crbegin() const noexcept\n    {\n        return const_reverse_iterator(cend());\n    }\n\n    /*!\n    @brief returns a const reverse iterator to one before the first\n\n    Returns a const reverse iterator to the reverse-end; that is, one before\n    the first element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).rend()`.\n\n    @liveexample{The following code shows an example for `crend()`.,crend}\n\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n\n    @since version 1.0.0\n    */\n    const_reverse_iterator crend() const noexcept\n    {\n        return const_reverse_iterator(cbegin());\n    }\n\n  public:\n    /*!\n    @brief wrapper to access iterator member functions in range-based for\n\n    This function allows to access @ref iterator::key() and @ref\n    iterator::value() during range-based for loops. In these loops, a\n    reference to the JSON values is returned, so there is no access to the\n    underlying iterator.\n\n    For loop without iterator_wrapper:\n\n    @code{cpp}\n    for (auto it = j_object.begin(); it != j_object.end(); ++it)\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    Range-based for loop without iterator proxy:\n\n    @code{cpp}\n    for (auto it : j_object)\n    {\n        // \"it\" is of type json::reference and has no key() member\n        std::cout << \"value: \" << it << '\\n';\n    }\n    @endcode\n\n    Range-based for loop with iterator proxy:\n\n    @code{cpp}\n    for (auto it : json::iterator_wrapper(j_object))\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    @note When iterating over an array, `key()` will return the index of the\n          element as string (see example).\n\n    @param[in] ref  reference to a JSON value\n    @return iteration proxy object wrapping @a ref with an interface to use in\n            range-based for loops\n\n    @liveexample{The following code shows how the wrapper is used,iterator_wrapper}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @note The name of this function is not yet final and may change in the\n    future.\n\n    @deprecated This stream operator is deprecated and will be removed in\n                future 4.0.0 of the library. Please use @ref items() instead;\n                that is, replace `json::iterator_wrapper(j)` with `j.items()`.\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /*!\n    @copydoc iterator_wrapper(reference)\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /*!\n    @brief helper to access iterator member functions in range-based for\n\n    This function allows to access @ref iterator::key() and @ref\n    iterator::value() during range-based for loops. In these loops, a\n    reference to the JSON values is returned, so there is no access to the\n    underlying iterator.\n\n    For loop without `items()` function:\n\n    @code{cpp}\n    for (auto it = j_object.begin(); it != j_object.end(); ++it)\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    Range-based for loop without `items()` function:\n\n    @code{cpp}\n    for (auto it : j_object)\n    {\n        // \"it\" is of type json::reference and has no key() member\n        std::cout << \"value: \" << it << '\\n';\n    }\n    @endcode\n\n    Range-based for loop with `items()` function:\n\n    @code{cpp}\n    for (auto& el : j_object.items())\n    {\n        std::cout << \"key: \" << el.key() << \", value:\" << el.value() << '\\n';\n    }\n    @endcode\n\n    The `items()` function also allows to use\n    [structured bindings](https://en.cppreference.com/w/cpp/language/structured_binding)\n    (C++17):\n\n    @code{cpp}\n    for (auto& [key, val] : j_object.items())\n    {\n        std::cout << \"key: \" << key << \", value:\" << val << '\\n';\n    }\n    @endcode\n\n    @note When iterating over an array, `key()` will return the index of the\n          element as string (see example). For primitive types (e.g., numbers),\n          `key()` returns an empty string.\n\n    @warning Using `items()` on temporary objects is dangerous. Make sure the\n             object's lifetime exeeds the iteration. See\n             <https://github.com/nlohmann/json/issues/2040> for more\n             information.\n\n    @return iteration proxy object wrapping @a ref with an interface to use in\n            range-based for loops\n\n    @liveexample{The following code shows how the function is used.,items}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 3.1.0, structured bindings support since 3.5.0.\n    */\n    iteration_proxy<iterator> items() noexcept\n    {\n        return iteration_proxy<iterator>(*this);\n    }\n\n    /*!\n    @copydoc items()\n    */\n    iteration_proxy<const_iterator> items() const noexcept\n    {\n        return iteration_proxy<const_iterator>(*this);\n    }\n\n    /// @}\n\n\n    //////////////\n    // capacity //\n    //////////////\n\n    /// @name capacity\n    /// @{\n\n    /*!\n    @brief checks whether the container is empty.\n\n    Checks if a JSON value has no elements (i.e. whether its @ref size is `0`).\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `true`\n            boolean     | `false`\n            string      | `false`\n            number      | `false`\n            binary      | `false`\n            object      | result of function `object_t::empty()`\n            array       | result of function `array_t::empty()`\n\n    @liveexample{The following code uses `empty()` to check if a JSON\n    object contains any elements.,empty}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their `empty()` functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @note This function does not return whether a string stored as JSON value\n    is empty - it returns whether the JSON container itself is empty which is\n    false in the case of a string.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `begin() == end()`.\n\n    @sa @ref size() -- returns the number of elements\n\n    @since version 1.0.0\n    */\n    bool empty() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return true;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::empty()\n                return m_value.array->empty();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::empty()\n                return m_value.object->empty();\n            }\n\n            default:\n            {\n                // all other types are nonempty\n                return false;\n            }\n        }\n    }\n\n    /*!\n    @brief returns the number of elements\n\n    Returns the number of elements in a JSON value.\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `0`\n            boolean     | `1`\n            string      | `1`\n            number      | `1`\n            binary      | `1`\n            object      | result of function object_t::size()\n            array       | result of function array_t::size()\n\n    @liveexample{The following code calls `size()` on the different value\n    types.,size}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their size() functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @note This function does not return the length of a string stored as JSON\n    value - it returns the number of elements in the JSON value which is 1 in\n    the case of a string.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `std::distance(begin(), end())`.\n\n    @sa @ref empty() -- checks whether the container is empty\n    @sa @ref max_size() -- returns the maximal number of elements\n\n    @since version 1.0.0\n    */\n    size_type size() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return 0;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::size()\n                return m_value.array->size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::size()\n                return m_value.object->size();\n            }\n\n            default:\n            {\n                // all other types have size 1\n                return 1;\n            }\n        }\n    }\n\n    /*!\n    @brief returns the maximum possible number of elements\n\n    Returns the maximum number of elements a JSON value is able to hold due to\n    system or library implementation limitations, i.e. `std::distance(begin(),\n    end())` for the JSON value.\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `0` (same as `size()`)\n            boolean     | `1` (same as `size()`)\n            string      | `1` (same as `size()`)\n            number      | `1` (same as `size()`)\n            binary      | `1` (same as `size()`)\n            object      | result of function `object_t::max_size()`\n            array       | result of function `array_t::max_size()`\n\n    @liveexample{The following code calls `max_size()` on the different value\n    types. Note the output is implementation specific.,max_size}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their `max_size()` functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of returning `b.size()` where `b` is the largest\n      possible JSON value.\n\n    @sa @ref size() -- returns the number of elements\n\n    @since version 1.0.0\n    */\n    size_type max_size() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::array:\n            {\n                // delegate call to array_t::max_size()\n                return m_value.array->max_size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::max_size()\n                return m_value.object->max_size();\n            }\n\n            default:\n            {\n                // all other types have max_size() == size()\n                return size();\n            }\n        }\n    }\n\n    /// @}\n\n\n    ///////////////\n    // modifiers //\n    ///////////////\n\n    /// @name modifiers\n    /// @{\n\n    /*!\n    @brief clears the contents\n\n    Clears the content of a JSON value and resets it to the default value as\n    if @ref basic_json(value_t) would have been called with the current value\n    type from @ref type():\n\n    Value type  | initial value\n    ----------- | -------------\n    null        | `null`\n    boolean     | `false`\n    string      | `\"\"`\n    number      | `0`\n    binary      | An empty byte vector\n    object      | `{}`\n    array       | `[]`\n\n    @post Has the same effect as calling\n    @code {.cpp}\n    *this = basic_json(type());\n    @endcode\n\n    @liveexample{The example below shows the effect of `clear()` to different\n    JSON types.,clear}\n\n    @complexity Linear in the size of the JSON value.\n\n    @iterators All iterators, pointers and references related to this container\n               are invalidated.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @sa @ref basic_json(value_t) -- constructor that creates an object with the\n        same value than calling `clear()`\n\n    @since version 1.0.0\n    */\n    void clear() noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_value.number_integer = 0;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value.number_unsigned = 0;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value.number_float = 0.0;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value.boolean = false;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value.string->clear();\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value.binary->clear();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value.array->clear();\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_value.object->clear();\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @brief add an object to an array\n\n    Appends the given element @a val to the end of the JSON value. If the\n    function is called on a JSON null value, an empty array is created before\n    appending @a val.\n\n    @param[in] val the value to add to the JSON array\n\n    @throw type_error.308 when called on a type other than JSON array or\n    null; example: `\"cannot use push_back() with number\"`\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows how `push_back()` and `+=` can be used to\n    add elements to a JSON array. Note how the `null` value was silently\n    converted to a JSON array.,push_back}\n\n    @since version 1.0.0\n    */\n    void push_back(basic_json&& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (move semantics)\n        m_value.array->push_back(std::move(val));\n        // if val is moved from, basic_json move constructor marks it null so we do not call the destructor\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    reference operator+=(basic_json&& val)\n    {\n        push_back(std::move(val));\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    void push_back(const basic_json& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array\n        m_value.array->push_back(val);\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    reference operator+=(const basic_json& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an object\n\n    Inserts the given element @a val to the JSON object. If the function is\n    called on a JSON null value, an empty object is created before inserting\n    @a val.\n\n    @param[in] val the value to add to the JSON object\n\n    @throw type_error.308 when called on a type other than JSON object or\n    null; example: `\"cannot use push_back() with number\"`\n\n    @complexity Logarithmic in the size of the container, O(log(`size()`)).\n\n    @liveexample{The example shows how `push_back()` and `+=` can be used to\n    add elements to a JSON object. Note how the `null` value was silently\n    converted to a JSON object.,push_back__object_t__value}\n\n    @since version 1.0.0\n    */\n    void push_back(const typename object_t::value_type& val)\n    {\n        // push_back only works for null objects or objects\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to array\n        m_value.object->insert(val);\n    }\n\n    /*!\n    @brief add an object to an object\n    @copydoc push_back(const typename object_t::value_type&)\n    */\n    reference operator+=(const typename object_t::value_type& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an object\n\n    This function allows to use `push_back` with an initializer list. In case\n\n    1. the current value is an object,\n    2. the initializer list @a init contains only two elements, and\n    3. the first element of @a init is a string,\n\n    @a init is converted into an object element and added using\n    @ref push_back(const typename object_t::value_type&). Otherwise, @a init\n    is converted to a JSON value and added using @ref push_back(basic_json&&).\n\n    @param[in] init  an initializer list\n\n    @complexity Linear in the size of the initializer list @a init.\n\n    @note This function is required to resolve an ambiguous overload error,\n          because pairs like `{\"key\", \"value\"}` can be both interpreted as\n          `object_t::value_type` or `std::initializer_list<basic_json>`, see\n          https://github.com/nlohmann/json/issues/235 for more information.\n\n    @liveexample{The example shows how initializer lists are treated as\n    objects when possible.,push_back__initializer_list}\n    */\n    void push_back(initializer_list_t init)\n    {\n        if (is_object() && init.size() == 2 && (*init.begin())->is_string())\n        {\n            basic_json&& key = init.begin()->moved_or_copied();\n            push_back(typename object_t::value_type(\n                          std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied()));\n        }\n        else\n        {\n            push_back(basic_json(init));\n        }\n    }\n\n    /*!\n    @brief add an object to an object\n    @copydoc push_back(initializer_list_t)\n    */\n    reference operator+=(initializer_list_t init)\n    {\n        push_back(init);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an array\n\n    Creates a JSON value from the passed parameters @a args to the end of the\n    JSON value. If the function is called on a JSON null value, an empty array\n    is created before appending the value created from @a args.\n\n    @param[in] args arguments to forward to a constructor of @ref basic_json\n    @tparam Args compatible types to create a @ref basic_json object\n\n    @return reference to the inserted element\n\n    @throw type_error.311 when called on a type other than JSON array or\n    null; example: `\"cannot use emplace_back() with number\"`\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows how `push_back()` can be used to add\n    elements to a JSON array. Note how the `null` value was silently converted\n    to a JSON array.,emplace_back}\n\n    @since version 2.0.8, returns reference since 3.7.0\n    */\n    template<class... Args>\n    reference emplace_back(Args&& ... args)\n    {\n        // emplace_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(311, \"cannot use emplace_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n#ifdef JSON_HAS_CPP_17\n        return m_value.array->emplace_back(std::forward<Args>(args)...);\n#else\n        m_value.array->emplace_back(std::forward<Args>(args)...);\n        return m_value.array->back();\n#endif\n    }\n\n    /*!\n    @brief add an object to an object if key does not exist\n\n    Inserts a new element into a JSON object constructed in-place with the\n    given @a args if there is no element with the key in the container. If the\n    function is called on a JSON null value, an empty object is created before\n    appending the value created from @a args.\n\n    @param[in] args arguments to forward to a constructor of @ref basic_json\n    @tparam Args compatible types to create a @ref basic_json object\n\n    @return a pair consisting of an iterator to the inserted element, or the\n            already-existing element if no insertion happened, and a bool\n            denoting whether the insertion took place.\n\n    @throw type_error.311 when called on a type other than JSON object or\n    null; example: `\"cannot use emplace() with number\"`\n\n    @complexity Logarithmic in the size of the container, O(log(`size()`)).\n\n    @liveexample{The example shows how `emplace()` can be used to add elements\n    to a JSON object. Note how the `null` value was silently converted to a\n    JSON object. Further note how no value is added if there was already one\n    value stored with the same key.,emplace}\n\n    @since version 2.0.8\n    */\n    template<class... Args>\n    std::pair<iterator, bool> emplace(Args&& ... args)\n    {\n        // emplace only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(311, \"cannot use emplace() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n        auto res = m_value.object->emplace(std::forward<Args>(args)...);\n        // create result iterator and set iterator to the result of emplace\n        auto it = begin();\n        it.m_it.object_iterator = res.first;\n\n        // return pair of iterator and boolean\n        return {it, res.second};\n    }\n\n    /// Helper for insertion of an iterator\n    /// @note: This uses std::distance to support GCC 4.8,\n    ///        see https://github.com/nlohmann/json/pull/1257\n    template<typename... Args>\n    iterator insert_iterator(const_iterator pos, Args&& ... args)\n    {\n        iterator result(this);\n        JSON_ASSERT(m_value.array != nullptr);\n\n        auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);\n        m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);\n        result.m_it.array_iterator = m_value.array->begin() + insert_pos;\n\n        // This could have been written as:\n        // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);\n        // but the return value of insert is missing in GCC 4.8, so it is written this way instead.\n\n        return result;\n    }\n\n    /*!\n    @brief inserts element\n\n    Inserts element @a val before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] val element to insert\n    @return iterator pointing to the inserted @a val.\n\n    @throw type_error.309 if called on JSON values other than arrays;\n    example: `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @complexity Constant plus linear in the distance between @a pos and end of\n    the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, const basic_json& val)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, val);\n        }\n\n        JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief inserts element\n    @copydoc insert(const_iterator, const basic_json&)\n    */\n    iterator insert(const_iterator pos, basic_json&& val)\n    {\n        return insert(pos, val);\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts @a cnt copies of @a val before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] cnt number of copies of @a val to insert\n    @param[in] val element to insert\n    @return iterator pointing to the first element inserted, or @a pos if\n    `cnt==0`\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @complexity Linear in @a cnt plus linear in the distance between @a pos\n    and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__count}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, size_type cnt, const basic_json& val)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, cnt, val);\n        }\n\n        JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from range `[first, last)` before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n    @throw invalid_iterator.211 if @a first or @a last are iterators into\n    container for which insert is called; example: `\"passed iterators may not\n    belong to container\"`\n\n    @return iterator pointing to the first element inserted, or @a pos if\n    `first==last`\n\n    @complexity Linear in `std::distance(first, last)` plus linear in the\n    distance between @a pos and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__range}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, const_iterator first, const_iterator last)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(first.m_object == this))\n        {\n            JSON_THROW(invalid_iterator::create(211, \"passed iterators may not belong to container\"));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from initializer list @a ilist before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] ilist initializer list to insert the values from\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @return iterator pointing to the first element inserted, or @a pos if\n    `ilist` is empty\n\n    @complexity Linear in `ilist.size()` plus linear in the distance between\n    @a pos and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__ilist}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, initializer_list_t ilist)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, ilist.begin(), ilist.end());\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from range `[first, last)`.\n\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.309 if called on JSON values other than objects; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if iterator @a first or @a last does does not\n    point to an object; example: `\"iterators first and last must point to\n    objects\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n\n    @complexity Logarithmic: `O(N*log(size() + N))`, where `N` is the number\n    of elements to insert.\n\n    @liveexample{The example shows how `insert()` is used.,insert__range_object}\n\n    @since version 3.0.0\n    */\n    void insert(const_iterator first, const_iterator last)\n    {\n        // insert only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterators first and last must point to objects\"));\n        }\n\n        m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);\n    }\n\n    /*!\n    @brief updates a JSON object from another object, overwriting existing keys\n\n    Inserts all values from JSON object @a j and overwrites existing keys.\n\n    @param[in] j  JSON object to read values from\n\n    @throw type_error.312 if called on JSON values other than objects; example:\n    `\"cannot use update() with string\"`\n\n    @complexity O(N*log(size() + N)), where N is the number of elements to\n                insert.\n\n    @liveexample{The example shows how `update()` is used.,update}\n\n    @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update\n\n    @since version 3.0.0\n    */\n    void update(const_reference j)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(type_name())));\n        }\n        if (JSON_HEDLEY_UNLIKELY(!j.is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(j.type_name())));\n        }\n\n        for (auto it = j.cbegin(); it != j.cend(); ++it)\n        {\n            m_value.object->operator[](it.key()) = it.value();\n        }\n    }\n\n    /*!\n    @brief updates a JSON object from another object, overwriting existing keys\n\n    Inserts all values from from range `[first, last)` and overwrites existing\n    keys.\n\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.312 if called on JSON values other than objects; example:\n    `\"cannot use update() with string\"`\n    @throw invalid_iterator.202 if iterator @a first or @a last does does not\n    point to an object; example: `\"iterators first and last must point to\n    objects\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n\n    @complexity O(N*log(size() + N)), where N is the number of elements to\n                insert.\n\n    @liveexample{The example shows how `update()` is used__range.,update}\n\n    @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update\n\n    @since version 3.0.0\n    */\n    void update(const_iterator first, const_iterator last)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(type_name())));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()\n                                 || !last.m_object->is_object()))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterators first and last must point to objects\"));\n        }\n\n        for (auto it = first; it != last; ++it)\n        {\n            m_value.object->operator[](it.key()) = it.value();\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of the JSON value with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other JSON value to exchange the contents with\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how JSON values can be swapped with\n    `swap()`.,swap__reference}\n\n    @since version 1.0.0\n    */\n    void swap(reference other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        std::swap(m_type, other.m_type);\n        std::swap(m_value, other.m_value);\n        assert_invariant();\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of the JSON value from @a left with those of @a right. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated. implemented as a friend function callable via ADL.\n\n    @param[in,out] left JSON value to exchange the contents with\n    @param[in,out] right JSON value to exchange the contents with\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how JSON values can be swapped with\n    `swap()`.,swap__reference}\n\n    @since version 1.0.0\n    */\n    friend void swap(reference left, reference right) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        left.swap(right);\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON array with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other array to exchange the contents with\n\n    @throw type_error.310 when JSON value is not an array; example: `\"cannot\n    use swap() with string\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how arrays can be swapped with\n    `swap()`.,swap__array_t}\n\n    @since version 1.0.0\n    */\n    void swap(array_t& other)\n    {\n        // swap only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            std::swap(*(m_value.array), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON object with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other object to exchange the contents with\n\n    @throw type_error.310 when JSON value is not an object; example:\n    `\"cannot use swap() with string\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how objects can be swapped with\n    `swap()`.,swap__object_t}\n\n    @since version 1.0.0\n    */\n    void swap(object_t& other)\n    {\n        // swap only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            std::swap(*(m_value.object), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON string with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other string to exchange the contents with\n\n    @throw type_error.310 when JSON value is not a string; example: `\"cannot\n    use swap() with boolean\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how strings can be swapped with\n    `swap()`.,swap__string_t}\n\n    @since version 1.0.0\n    */\n    void swap(string_t& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_string()))\n        {\n            std::swap(*(m_value.string), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON string with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other binary to exchange the contents with\n\n    @throw type_error.310 when JSON value is not a string; example: `\"cannot\n    use swap() with boolean\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how strings can be swapped with\n    `swap()`.,swap__binary_t}\n\n    @since version 3.8.0\n    */\n    void swap(binary_t& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            std::swap(*(m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @copydoc swap(binary_t)\n    void swap(typename binary_t::container_type& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            std::swap(*(m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @}\n\n  public:\n    //////////////////////////////////////////\n    // lexicographical comparison operators //\n    //////////////////////////////////////////\n\n    /// @name lexicographical comparison operators\n    /// @{\n\n    /*!\n    @brief comparison: equal\n\n    Compares two JSON values for equality according to the following rules:\n    - Two JSON values are equal if (1) they are from the same type and (2)\n      their stored values are the same according to their respective\n      `operator==`.\n    - Integer and floating-point numbers are automatically converted before\n      comparison. Note that two NaN values are always treated as unequal.\n    - Two JSON null values are equal.\n\n    @note Floating-point inside JSON values numbers are compared with\n    `json::number_float_t::operator==` which is `double::operator==` by\n    default. To compare floating-point while respecting an epsilon, an alternative\n    [comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39)\n    could be used, for instance\n    @code {.cpp}\n    template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value, T>::type>\n    inline bool is_same(T a, T b, T epsilon = std::numeric_limits<T>::epsilon()) noexcept\n    {\n        return std::abs(a - b) <= epsilon;\n    }\n    @endcode\n    Or you can self-defined operator equal function like this:\n    @code {.cpp}\n    bool my_equal(const_reference lhs, const_reference rhs) {\n    const auto lhs_type lhs.type();\n    const auto rhs_type rhs.type();\n    if (lhs_type == rhs_type) {\n        switch(lhs_type)\n            // self_defined case\n            case value_t::number_float:\n                return std::abs(lhs - rhs) <= std::numeric_limits<float>::epsilon();\n            // other cases remain the same with the original\n            ...\n    }\n    ...\n    }\n    @endcode\n\n    @note NaN values never compare equal to themselves or to other NaN values.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether the values @a lhs and @a rhs are equal\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @complexity Linear.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__equal}\n\n    @since version 1.0.0\n    */\n    friend bool operator==(const_reference lhs, const_reference rhs) noexcept\n    {\n        const auto lhs_type = lhs.type();\n        const auto rhs_type = rhs.type();\n\n        if (lhs_type == rhs_type)\n        {\n            switch (lhs_type)\n            {\n                case value_t::array:\n                    return *lhs.m_value.array == *rhs.m_value.array;\n\n                case value_t::object:\n                    return *lhs.m_value.object == *rhs.m_value.object;\n\n                case value_t::null:\n                    return true;\n\n                case value_t::string:\n                    return *lhs.m_value.string == *rhs.m_value.string;\n\n                case value_t::boolean:\n                    return lhs.m_value.boolean == rhs.m_value.boolean;\n\n                case value_t::number_integer:\n                    return lhs.m_value.number_integer == rhs.m_value.number_integer;\n\n                case value_t::number_unsigned:\n                    return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned;\n\n                case value_t::number_float:\n                    return lhs.m_value.number_float == rhs.m_value.number_float;\n\n                case value_t::binary:\n                    return *lhs.m_value.binary == *rhs.m_value.binary;\n\n                default:\n                    return false;\n            }\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_integer) == rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)\n        {\n            return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)\n        {\n            return static_cast<number_integer_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_integer;\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_integer == static_cast<number_integer_t>(rhs.m_value.number_unsigned);\n        }\n\n        return false;\n    }\n\n    /*!\n    @brief comparison: equal\n    @copydoc operator==(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs == basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: equal\n    @copydoc operator==(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) == rhs;\n    }\n\n    /*!\n    @brief comparison: not equal\n\n    Compares two JSON values for inequality by calculating `not (lhs == rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether the values @a lhs and @a rhs are not equal\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__notequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator!=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs == rhs);\n    }\n\n    /*!\n    @brief comparison: not equal\n    @copydoc operator!=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs != basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: not equal\n    @copydoc operator!=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) != rhs;\n    }\n\n    /*!\n    @brief comparison: less than\n\n    Compares whether one JSON value @a lhs is less than another JSON value @a\n    rhs according to the following rules:\n    - If @a lhs and @a rhs have the same type, the values are compared using\n      the default `<` operator.\n    - Integer and floating-point numbers are automatically converted before\n      comparison\n    - In case @a lhs and @a rhs have different types, the values are ignored\n      and the order of the types is considered, see\n      @ref operator<(const value_t, const value_t).\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is less than @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__less}\n\n    @since version 1.0.0\n    */\n    friend bool operator<(const_reference lhs, const_reference rhs) noexcept\n    {\n        const auto lhs_type = lhs.type();\n        const auto rhs_type = rhs.type();\n\n        if (lhs_type == rhs_type)\n        {\n            switch (lhs_type)\n            {\n                case value_t::array:\n                    // note parentheses are necessary, see\n                    // https://github.com/nlohmann/json/issues/1530\n                    return (*lhs.m_value.array) < (*rhs.m_value.array);\n\n                case value_t::object:\n                    return (*lhs.m_value.object) < (*rhs.m_value.object);\n\n                case value_t::null:\n                    return false;\n\n                case value_t::string:\n                    return (*lhs.m_value.string) < (*rhs.m_value.string);\n\n                case value_t::boolean:\n                    return (lhs.m_value.boolean) < (rhs.m_value.boolean);\n\n                case value_t::number_integer:\n                    return (lhs.m_value.number_integer) < (rhs.m_value.number_integer);\n\n                case value_t::number_unsigned:\n                    return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned);\n\n                case value_t::number_float:\n                    return (lhs.m_value.number_float) < (rhs.m_value.number_float);\n\n                case value_t::binary:\n                    return (*lhs.m_value.binary) < (*rhs.m_value.binary);\n\n                default:\n                    return false;\n            }\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_integer) < rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)\n        {\n            return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_integer);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_integer < static_cast<number_integer_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)\n        {\n            return static_cast<number_integer_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_integer;\n        }\n\n        // We only reach this line if we cannot compare values. In that case,\n        // we compare types. Note we have to call the operator explicitly,\n        // because MSVC has problems otherwise.\n        return operator<(lhs_type, rhs_type);\n    }\n\n    /*!\n    @brief comparison: less than\n    @copydoc operator<(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs < basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: less than\n    @copydoc operator<(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) < rhs;\n    }\n\n    /*!\n    @brief comparison: less than or equal\n\n    Compares whether one JSON value @a lhs is less than or equal to another\n    JSON value by calculating `not (rhs < lhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is less than or equal to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__greater}\n\n    @since version 1.0.0\n    */\n    friend bool operator<=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(rhs < lhs);\n    }\n\n    /*!\n    @brief comparison: less than or equal\n    @copydoc operator<=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs <= basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: less than or equal\n    @copydoc operator<=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) <= rhs;\n    }\n\n    /*!\n    @brief comparison: greater than\n\n    Compares whether one JSON value @a lhs is greater than another\n    JSON value by calculating `not (lhs <= rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is greater than to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__lessequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator>(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs <= rhs);\n    }\n\n    /*!\n    @brief comparison: greater than\n    @copydoc operator>(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs > basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: greater than\n    @copydoc operator>(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) > rhs;\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n\n    Compares whether one JSON value @a lhs is greater than or equal to another\n    JSON value by calculating `not (lhs < rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is greater than or equal to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__greaterequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator>=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs < rhs);\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n    @copydoc operator>=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs >= basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n    @copydoc operator>=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) >= rhs;\n    }\n\n    /// @}\n\n    ///////////////////\n    // serialization //\n    ///////////////////\n\n    /// @name serialization\n    /// @{\n\n    /*!\n    @brief serialize to stream\n\n    Serialize the given JSON value @a j to the output stream @a o. The JSON\n    value will be serialized using the @ref dump member function.\n\n    - The indentation of the output can be controlled with the member variable\n      `width` of the output stream @a o. For instance, using the manipulator\n      `std::setw(4)` on @a o sets the indentation level to `4` and the\n      serialization result is the same as calling `dump(4)`.\n\n    - The indentation character can be controlled with the member variable\n      `fill` of the output stream @a o. For instance, the manipulator\n      `std::setfill('\\\\t')` sets indentation to use a tab character rather than\n      the default space character.\n\n    @param[in,out] o  stream to serialize to\n    @param[in] j  JSON value to serialize\n\n    @return the stream @a o\n\n    @throw type_error.316 if a string stored inside the JSON value is not\n                          UTF-8 encoded\n\n    @complexity Linear.\n\n    @liveexample{The example below shows the serialization with different\n    parameters to `width` to adjust the indentation level.,operator_serialize}\n\n    @since version 1.0.0; indentation character added in version 3.0.0\n    */\n    friend std::ostream& operator<<(std::ostream& o, const basic_json& j)\n    {\n        // read width member and use it as indentation parameter if nonzero\n        const bool pretty_print = o.width() > 0;\n        const auto indentation = pretty_print ? o.width() : 0;\n\n        // reset width to 0 for subsequent calls to this stream\n        o.width(0);\n\n        // do the actual serialization\n        serializer s(detail::output_adapter<char>(o), o.fill());\n        s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation));\n        return o;\n    }\n\n    /*!\n    @brief serialize to stream\n    @deprecated This stream operator is deprecated and will be removed in\n                future 4.0.0 of the library. Please use\n                @ref operator<<(std::ostream&, const basic_json&)\n                instead; that is, replace calls like `j >> o;` with `o << j;`.\n    @since version 1.0.0; deprecated since version 3.0.0\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))\n    friend std::ostream& operator>>(const basic_json& j, std::ostream& o)\n    {\n        return o << j;\n    }\n\n    /// @}\n\n\n    /////////////////////\n    // deserialization //\n    /////////////////////\n\n    /// @name deserialization\n    /// @{\n\n    /*!\n    @brief deserialize from a compatible input\n\n    @tparam InputType A compatible input, for instance\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i  input to read from\n    @param[in] cb  a parser callback function of type @ref parser_callback_t\n    which is used to control the deserialization by filtering unwanted values\n    (optional)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser. The complexity can be higher if the parser callback function\n    @a cb or reading from the input @a i has a super-linear complexity.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `parse()` function reading\n    from an array.,parse__array__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function with\n    and without callback function.,parse__string__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function with\n    and without callback function.,parse__istream__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function reading\n    from a contiguous container.,parse__contiguouscontainer__parser_callback_t}\n\n    @since version 2.0.3 (contiguous containers); version 3.9.0 allowed to\n    ignore comments.\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(InputType&& i,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    /*!\n    @brief deserialize from a pair of character iterators\n\n    The value_type of the iterator must be a integral type with size of 1, 2 or\n    4 bytes, which will be interpreted respectively as UTF-8, UTF-16 and UTF-32.\n\n    @param[in] first iterator to start of character range\n    @param[in] last  iterator to end of character range\n    @param[in] cb  a parser callback function of type @ref parser_callback_t\n    which is used to control the deserialization by filtering unwanted values\n    (optional)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(IteratorType first,\n                            IteratorType last,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))\n    static basic_json parse(detail::span_input_adapter&& i,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    /*!\n    @brief check if the input is valid JSON\n\n    Unlike the @ref parse(InputType&&, const parser_callback_t,const bool)\n    function, this function neither throws an exception in case of invalid JSON\n    input (i.e., a parse error) nor creates diagnostic information.\n\n    @tparam InputType A compatible input, for instance\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i input to read from\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return Whether the input read from @a i is valid JSON.\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `accept()` function reading\n    from a string.,accept__string}\n    */\n    template<typename InputType>\n    static bool accept(InputType&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    template<typename IteratorType>\n    static bool accept(IteratorType first, IteratorType last,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))\n    static bool accept(detail::span_input_adapter&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(i.get(), nullptr, false, ignore_comments).accept(true);\n    }\n\n    /*!\n    @brief generate SAX events\n\n    The SAX event lister must follow the interface of @ref json_sax.\n\n    This function reads from a compatible input. Examples are:\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i  input to read from\n    @param[in,out] sax  SAX event listener\n    @param[in] format  the format to parse (JSON, CBOR, MessagePack, or UBJSON)\n    @param[in] strict  whether the input has to be consumed completely\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default); only applies to the JSON file format.\n\n    @return return value of the last processed SAX event\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser. The complexity can be higher if the SAX consumer @a sax has\n    a super-linear complexity.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `sax_parse()` function\n    reading from string and processing the events with a user-defined SAX\n    event consumer.,sax_parse}\n\n    @since version 3.2.0\n    */\n    template <typename InputType, typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(InputType&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    template<class IteratorType, class SAX>\n    JSON_HEDLEY_NON_NULL(3)\n    static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    template <typename SAX>\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = i.get();\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    /*!\n    @brief deserialize from stream\n    @deprecated This stream operator is deprecated and will be removed in\n                version 4.0.0 of the library. Please use\n                @ref operator>>(std::istream&, basic_json&)\n                instead; that is, replace calls like `j << i;` with `i >> j;`.\n    @since version 1.0.0; deprecated since version 3.0.0\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))\n    friend std::istream& operator<<(basic_json& j, std::istream& i)\n    {\n        return operator>>(i, j);\n    }\n\n    /*!\n    @brief deserialize from stream\n\n    Deserializes an input stream to a JSON value.\n\n    @param[in,out] i  input stream to read a serialized JSON value from\n    @param[in,out] j  JSON value to write the deserialized input to\n\n    @throw parse_error.101 in case of an unexpected token\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below shows how a JSON value is constructed by\n    reading a serialization from a stream.,operator_deserialize}\n\n    @sa parse(std::istream&, const parser_callback_t) for a variant with a\n    parser callback function to filter values while parsing\n\n    @since version 1.0.0\n    */\n    friend std::istream& operator>>(std::istream& i, basic_json& j)\n    {\n        parser(detail::input_adapter(i)).parse(false, j);\n        return i;\n    }\n\n    /// @}\n\n    ///////////////////////////\n    // convenience functions //\n    ///////////////////////////\n\n    /*!\n    @brief return the type as string\n\n    Returns the type name as string to be used in error messages - usually to\n    indicate that a function was called on a wrong JSON type.\n\n    @return a string representation of a the @a m_type member:\n            Value type  | return value\n            ----------- | -------------\n            null        | `\"null\"`\n            boolean     | `\"boolean\"`\n            string      | `\"string\"`\n            number      | `\"number\"` (for all number types)\n            object      | `\"object\"`\n            array       | `\"array\"`\n            binary      | `\"binary\"`\n            discarded   | `\"discarded\"`\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @complexity Constant.\n\n    @liveexample{The following code exemplifies `type_name()` for all JSON\n    types.,type_name}\n\n    @sa @ref type() -- return the type of the JSON value\n    @sa @ref operator value_t() -- return the type of the JSON value (implicit)\n\n    @since version 1.0.0, public since 2.1.0, `const char*` and `noexcept`\n    since 3.0.0\n    */\n    JSON_HEDLEY_RETURNS_NON_NULL\n    const char* type_name() const noexcept\n    {\n        {\n            switch (m_type)\n            {\n                case value_t::null:\n                    return \"null\";\n                case value_t::object:\n                    return \"object\";\n                case value_t::array:\n                    return \"array\";\n                case value_t::string:\n                    return \"string\";\n                case value_t::boolean:\n                    return \"boolean\";\n                case value_t::binary:\n                    return \"binary\";\n                case value_t::discarded:\n                    return \"discarded\";\n                default:\n                    return \"number\";\n            }\n        }\n    }\n\n\n  private:\n    //////////////////////\n    // member variables //\n    //////////////////////\n\n    /// the type of the current element\n    value_t m_type = value_t::null;\n\n    /// the value of the current element\n    json_value m_value = {};\n\n    //////////////////////////////////////////\n    // binary serialization/deserialization //\n    //////////////////////////////////////////\n\n    /// @name binary serialization/deserialization support\n    /// @{\n\n  public:\n    /*!\n    @brief create a CBOR serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the CBOR (Concise\n    Binary Object Representation) serialization format. CBOR is a binary\n    serialization format which aims to be more compact than JSON itself, yet\n    more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    CBOR types according to the CBOR specification (RFC 7049):\n\n    JSON value type | value/range                                | CBOR type                          | first byte\n    --------------- | ------------------------------------------ | ---------------------------------- | ---------------\n    null            | `null`                                     | Null                               | 0xF6\n    boolean         | `true`                                     | True                               | 0xF5\n    boolean         | `false`                                    | False                              | 0xF4\n    number_integer  | -9223372036854775808..-2147483649          | Negative integer (8 bytes follow)  | 0x3B\n    number_integer  | -2147483648..-32769                        | Negative integer (4 bytes follow)  | 0x3A\n    number_integer  | -32768..-129                               | Negative integer (2 bytes follow)  | 0x39\n    number_integer  | -128..-25                                  | Negative integer (1 byte follow)   | 0x38\n    number_integer  | -24..-1                                    | Negative integer                   | 0x20..0x37\n    number_integer  | 0..23                                      | Integer                            | 0x00..0x17\n    number_integer  | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18\n    number_integer  | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19\n    number_integer  | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1A\n    number_integer  | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1B\n    number_unsigned | 0..23                                      | Integer                            | 0x00..0x17\n    number_unsigned | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18\n    number_unsigned | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19\n    number_unsigned | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1A\n    number_unsigned | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1B\n    number_float    | *any value representable by a float*       | Single-Precision Float             | 0xFA\n    number_float    | *any value NOT representable by a float*   | Double-Precision Float             | 0xFB\n    string          | *length*: 0..23                            | UTF-8 string                       | 0x60..0x77\n    string          | *length*: 23..255                          | UTF-8 string (1 byte follow)       | 0x78\n    string          | *length*: 256..65535                       | UTF-8 string (2 bytes follow)      | 0x79\n    string          | *length*: 65536..4294967295                | UTF-8 string (4 bytes follow)      | 0x7A\n    string          | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow)      | 0x7B\n    array           | *size*: 0..23                              | array                              | 0x80..0x97\n    array           | *size*: 23..255                            | array (1 byte follow)              | 0x98\n    array           | *size*: 256..65535                         | array (2 bytes follow)             | 0x99\n    array           | *size*: 65536..4294967295                  | array (4 bytes follow)             | 0x9A\n    array           | *size*: 4294967296..18446744073709551615   | array (8 bytes follow)             | 0x9B\n    object          | *size*: 0..23                              | map                                | 0xA0..0xB7\n    object          | *size*: 23..255                            | map (1 byte follow)                | 0xB8\n    object          | *size*: 256..65535                         | map (2 bytes follow)               | 0xB9\n    object          | *size*: 65536..4294967295                  | map (4 bytes follow)               | 0xBA\n    object          | *size*: 4294967296..18446744073709551615   | map (8 bytes follow)               | 0xBB\n    binary          | *size*: 0..23                              | byte string                        | 0x40..0x57\n    binary          | *size*: 23..255                            | byte string (1 byte follow)        | 0x58\n    binary          | *size*: 256..65535                         | byte string (2 bytes follow)       | 0x59\n    binary          | *size*: 65536..4294967295                  | byte string (4 bytes follow)       | 0x5A\n    binary          | *size*: 4294967296..18446744073709551615   | byte string (8 bytes follow)       | 0x5B\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a CBOR value.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @note The following CBOR types are not used in the conversion:\n          - UTF-8 strings terminated by \"break\" (0x7F)\n          - arrays terminated by \"break\" (0x9F)\n          - maps terminated by \"break\" (0xBF)\n          - byte strings terminated by \"break\" (0x5F)\n          - date/time (0xC0..0xC1)\n          - bignum (0xC2..0xC3)\n          - decimal fraction (0xC4)\n          - bigfloat (0xC5)\n          - expected conversions (0xD5..0xD7)\n          - simple values (0xE0..0xF3, 0xF8)\n          - undefined (0xF7)\n          - half-precision floats (0xF9)\n          - break (0xFF)\n\n    @param[in] j  JSON value to serialize\n    @return CBOR serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in CBOR format.,to_cbor}\n\n    @sa http://cbor.io\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        analogous deserialization\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n\n    @since version 2.0.9; compact representation of floating-point numbers\n           since version 3.8.0\n    */\n    static std::vector<uint8_t> to_cbor(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_cbor(j, result);\n        return result;\n    }\n\n    static void to_cbor(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_cbor(j);\n    }\n\n    static void to_cbor(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_cbor(j);\n    }\n\n    /*!\n    @brief create a MessagePack serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the MessagePack\n    serialization format. MessagePack is a binary serialization format which\n    aims to be more compact than JSON itself, yet more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    MessagePack types according to the MessagePack specification:\n\n    JSON value type | value/range                       | MessagePack type | first byte\n    --------------- | --------------------------------- | ---------------- | ----------\n    null            | `null`                            | nil              | 0xC0\n    boolean         | `true`                            | true             | 0xC3\n    boolean         | `false`                           | false            | 0xC2\n    number_integer  | -9223372036854775808..-2147483649 | int64            | 0xD3\n    number_integer  | -2147483648..-32769               | int32            | 0xD2\n    number_integer  | -32768..-129                      | int16            | 0xD1\n    number_integer  | -128..-33                         | int8             | 0xD0\n    number_integer  | -32..-1                           | negative fixint  | 0xE0..0xFF\n    number_integer  | 0..127                            | positive fixint  | 0x00..0x7F\n    number_integer  | 128..255                          | uint 8           | 0xCC\n    number_integer  | 256..65535                        | uint 16          | 0xCD\n    number_integer  | 65536..4294967295                 | uint 32          | 0xCE\n    number_integer  | 4294967296..18446744073709551615  | uint 64          | 0xCF\n    number_unsigned | 0..127                            | positive fixint  | 0x00..0x7F\n    number_unsigned | 128..255                          | uint 8           | 0xCC\n    number_unsigned | 256..65535                        | uint 16          | 0xCD\n    number_unsigned | 65536..4294967295                 | uint 32          | 0xCE\n    number_unsigned | 4294967296..18446744073709551615  | uint 64          | 0xCF\n    number_float    | *any value representable by a float*     | float 32 | 0xCA\n    number_float    | *any value NOT representable by a float* | float 64 | 0xCB\n    string          | *length*: 0..31                   | fixstr           | 0xA0..0xBF\n    string          | *length*: 32..255                 | str 8            | 0xD9\n    string          | *length*: 256..65535              | str 16           | 0xDA\n    string          | *length*: 65536..4294967295       | str 32           | 0xDB\n    array           | *size*: 0..15                     | fixarray         | 0x90..0x9F\n    array           | *size*: 16..65535                 | array 16         | 0xDC\n    array           | *size*: 65536..4294967295         | array 32         | 0xDD\n    object          | *size*: 0..15                     | fix map          | 0x80..0x8F\n    object          | *size*: 16..65535                 | map 16           | 0xDE\n    object          | *size*: 65536..4294967295         | map 32           | 0xDF\n    binary          | *size*: 0..255                    | bin 8            | 0xC4\n    binary          | *size*: 256..65535                | bin 16           | 0xC5\n    binary          | *size*: 65536..4294967295         | bin 32           | 0xC6\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a MessagePack value.\n\n    @note The following values can **not** be converted to a MessagePack value:\n          - strings with more than 4294967295 bytes\n          - byte strings with more than 4294967295 bytes\n          - arrays with more than 4294967295 elements\n          - objects with more than 4294967295 elements\n\n    @note Any MessagePack output created @ref to_msgpack can be successfully\n          parsed by @ref from_msgpack.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @param[in] j  JSON value to serialize\n    @return MessagePack serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in MessagePack format.,to_msgpack}\n\n    @sa http://msgpack.org\n    @sa @ref from_msgpack for the analogous deserialization\n    @sa @ref to_cbor(const basic_json& for the related CBOR format\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n\n    @since version 2.0.9\n    */\n    static std::vector<uint8_t> to_msgpack(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_msgpack(j, result);\n        return result;\n    }\n\n    static void to_msgpack(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_msgpack(j);\n    }\n\n    static void to_msgpack(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_msgpack(j);\n    }\n\n    /*!\n    @brief create a UBJSON serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the UBJSON\n    (Universal Binary JSON) serialization format. UBJSON aims to be more compact\n    than JSON itself, yet more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    UBJSON types according to the UBJSON specification:\n\n    JSON value type | value/range                       | UBJSON type | marker\n    --------------- | --------------------------------- | ----------- | ------\n    null            | `null`                            | null        | `Z`\n    boolean         | `true`                            | true        | `T`\n    boolean         | `false`                           | false       | `F`\n    number_integer  | -9223372036854775808..-2147483649 | int64       | `L`\n    number_integer  | -2147483648..-32769               | int32       | `l`\n    number_integer  | -32768..-129                      | int16       | `I`\n    number_integer  | -128..127                         | int8        | `i`\n    number_integer  | 128..255                          | uint8       | `U`\n    number_integer  | 256..32767                        | int16       | `I`\n    number_integer  | 32768..2147483647                 | int32       | `l`\n    number_integer  | 2147483648..9223372036854775807   | int64       | `L`\n    number_unsigned | 0..127                            | int8        | `i`\n    number_unsigned | 128..255                          | uint8       | `U`\n    number_unsigned | 256..32767                        | int16       | `I`\n    number_unsigned | 32768..2147483647                 | int32       | `l`\n    number_unsigned | 2147483648..9223372036854775807   | int64       | `L`\n    number_unsigned | 2147483649..18446744073709551615  | high-precision | `H`\n    number_float    | *any value*                       | float64     | `D`\n    string          | *with shortest length indicator*  | string      | `S`\n    array           | *see notes on optimized format*   | array       | `[`\n    object          | *see notes on optimized format*   | map         | `{`\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a UBJSON value.\n\n    @note The following values can **not** be converted to a UBJSON value:\n          - strings with more than 9223372036854775807 bytes (theoretical)\n\n    @note The following markers are not used in the conversion:\n          - `Z`: no-op values are not created.\n          - `C`: single-byte strings are serialized with `S` markers.\n\n    @note Any UBJSON output created @ref to_ubjson can be successfully parsed\n          by @ref from_ubjson.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @note The optimized formats for containers are supported: Parameter\n          @a use_size adds size information to the beginning of a container and\n          removes the closing marker. Parameter @a use_type further checks\n          whether all elements of a container have the same type and adds the\n          type marker to the beginning of the container. The @a use_type\n          parameter must only be used together with @a use_size = true. Note\n          that @a use_size = true alone may result in larger representations -\n          the benefit of this parameter is that the receiving side is\n          immediately informed on the number of elements of the container.\n\n    @note If the JSON data contains the binary type, the value stored is a list\n          of integers, as suggested by the UBJSON documentation.  In particular,\n          this means that serialization and the deserialization of a JSON\n          containing binary values into UBJSON and back will result in a\n          different JSON object.\n\n    @param[in] j  JSON value to serialize\n    @param[in] use_size  whether to add size annotations to container types\n    @param[in] use_type  whether to add type annotations to container types\n                         (must be combined with @a use_size = true)\n    @return UBJSON serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in UBJSON format.,to_ubjson}\n\n    @sa http://ubjson.org\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        analogous deserialization\n    @sa @ref to_cbor(const basic_json& for the related CBOR format\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n\n    @since version 3.1.0\n    */\n    static std::vector<uint8_t> to_ubjson(const basic_json& j,\n                                          const bool use_size = false,\n                                          const bool use_type = false)\n    {\n        std::vector<uint8_t> result;\n        to_ubjson(j, result, use_size, use_type);\n        return result;\n    }\n\n    static void to_ubjson(const basic_json& j, detail::output_adapter<uint8_t> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<uint8_t>(o).write_ubjson(j, use_size, use_type);\n    }\n\n    static void to_ubjson(const basic_json& j, detail::output_adapter<char> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<char>(o).write_ubjson(j, use_size, use_type);\n    }\n\n\n    /*!\n    @brief Serializes the given JSON object `j` to BSON and returns a vector\n           containing the corresponding BSON-representation.\n\n    BSON (Binary JSON) is a binary format in which zero or more ordered key/value pairs are\n    stored as a single entity (a so-called document).\n\n    The library uses the following mapping from JSON values types to BSON types:\n\n    JSON value type | value/range                       | BSON type   | marker\n    --------------- | --------------------------------- | ----------- | ------\n    null            | `null`                            | null        | 0x0A\n    boolean         | `true`, `false`                   | boolean     | 0x08\n    number_integer  | -9223372036854775808..-2147483649 | int64       | 0x12\n    number_integer  | -2147483648..2147483647           | int32       | 0x10\n    number_integer  | 2147483648..9223372036854775807   | int64       | 0x12\n    number_unsigned | 0..2147483647                     | int32       | 0x10\n    number_unsigned | 2147483648..9223372036854775807   | int64       | 0x12\n    number_unsigned | 9223372036854775808..18446744073709551615| --   | --\n    number_float    | *any value*                       | double      | 0x01\n    string          | *any value*                       | string      | 0x02\n    array           | *any value*                       | document    | 0x04\n    object          | *any value*                       | document    | 0x03\n    binary          | *any value*                       | binary      | 0x05\n\n    @warning The mapping is **incomplete**, since only JSON-objects (and things\n    contained therein) can be serialized to BSON.\n    Also, integers larger than 9223372036854775807 cannot be serialized to BSON,\n    and the keys may not contain U+0000, since they are serialized a\n    zero-terminated c-strings.\n\n    @throw out_of_range.407  if `j.is_number_unsigned() && j.get<std::uint64_t>() > 9223372036854775807`\n    @throw out_of_range.409  if a key in `j` contains a NULL (U+0000)\n    @throw type_error.317    if `!j.is_object()`\n\n    @pre The input `j` is required to be an object: `j.is_object() == true`.\n\n    @note Any BSON output created via @ref to_bson can be successfully parsed\n          by @ref from_bson.\n\n    @param[in] j  JSON value to serialize\n    @return BSON serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in BSON format.,to_bson}\n\n    @sa http://bsonspec.org/spec.html\n    @sa @ref from_bson(detail::input_adapter&&, const bool strict) for the\n        analogous deserialization\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n    @sa @ref to_cbor(const basic_json&) for the related CBOR format\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n    */\n    static std::vector<uint8_t> to_bson(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_bson(j, result);\n        return result;\n    }\n\n    /*!\n    @brief Serializes the given JSON object `j` to BSON and forwards the\n           corresponding BSON-representation to the given output_adapter `o`.\n    @param j The JSON object to convert to BSON.\n    @param o The output adapter that receives the binary BSON representation.\n    @pre The input `j` shall be an object: `j.is_object() == true`\n    @sa @ref to_bson(const basic_json&)\n    */\n    static void to_bson(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_bson(j);\n    }\n\n    /*!\n    @copydoc to_bson(const basic_json&, detail::output_adapter<uint8_t>)\n    */\n    static void to_bson(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_bson(j);\n    }\n\n\n    /*!\n    @brief create a JSON value from an input in CBOR format\n\n    Deserializes a given input @a i to a JSON value using the CBOR (Concise\n    Binary Object Representation) serialization format.\n\n    The library maps CBOR types to JSON value types as follows:\n\n    CBOR type              | JSON value type | first byte\n    ---------------------- | --------------- | ----------\n    Integer                | number_unsigned | 0x00..0x17\n    Unsigned integer       | number_unsigned | 0x18\n    Unsigned integer       | number_unsigned | 0x19\n    Unsigned integer       | number_unsigned | 0x1A\n    Unsigned integer       | number_unsigned | 0x1B\n    Negative integer       | number_integer  | 0x20..0x37\n    Negative integer       | number_integer  | 0x38\n    Negative integer       | number_integer  | 0x39\n    Negative integer       | number_integer  | 0x3A\n    Negative integer       | number_integer  | 0x3B\n    Byte string            | binary          | 0x40..0x57\n    Byte string            | binary          | 0x58\n    Byte string            | binary          | 0x59\n    Byte string            | binary          | 0x5A\n    Byte string            | binary          | 0x5B\n    UTF-8 string           | string          | 0x60..0x77\n    UTF-8 string           | string          | 0x78\n    UTF-8 string           | string          | 0x79\n    UTF-8 string           | string          | 0x7A\n    UTF-8 string           | string          | 0x7B\n    UTF-8 string           | string          | 0x7F\n    array                  | array           | 0x80..0x97\n    array                  | array           | 0x98\n    array                  | array           | 0x99\n    array                  | array           | 0x9A\n    array                  | array           | 0x9B\n    array                  | array           | 0x9F\n    map                    | object          | 0xA0..0xB7\n    map                    | object          | 0xB8\n    map                    | object          | 0xB9\n    map                    | object          | 0xBA\n    map                    | object          | 0xBB\n    map                    | object          | 0xBF\n    False                  | `false`         | 0xF4\n    True                   | `true`          | 0xF5\n    Null                   | `null`          | 0xF6\n    Half-Precision Float   | number_float    | 0xF9\n    Single-Precision Float | number_float    | 0xFA\n    Double-Precision Float | number_float    | 0xFB\n\n    @warning The mapping is **incomplete** in the sense that not all CBOR\n             types can be converted to a JSON value. The following CBOR types\n             are not supported and will yield parse errors (parse_error.112):\n             - date/time (0xC0..0xC1)\n             - bignum (0xC2..0xC3)\n             - decimal fraction (0xC4)\n             - bigfloat (0xC5)\n             - expected conversions (0xD5..0xD7)\n             - simple values (0xE0..0xF3, 0xF8)\n             - undefined (0xF7)\n\n    @warning CBOR allows map keys of any type, whereas JSON only allows\n             strings as keys in object values. Therefore, CBOR maps with keys\n             other than UTF-8 strings are rejected (parse_error.113).\n\n    @note Any CBOR output created @ref to_cbor can be successfully parsed by\n          @ref from_cbor.\n\n    @param[in] i  an input in CBOR format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] tag_handler how to treat CBOR tags (optional, error by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if unsupported features from CBOR were\n    used in the given input @a v or if the input is not valid CBOR\n    @throw parse_error.113 if a string was expected as map key, but not found\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in CBOR\n    format to a JSON value.,from_cbor}\n\n    @sa http://cbor.io\n    @sa @ref to_cbor(const basic_json&) for the analogous serialization\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for the\n        related MessagePack format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        related UBJSON format\n\n    @since version 2.0.9; parameter @a start_index since 2.1.1; changed to\n           consume input adapters, removed start_index parameter, and added\n           @a strict parameter since 3.0.0; added @a allow_exceptions parameter\n           since 3.2.0; added @a tag_handler parameter since 3.9.0.\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);\n    }\n\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @brief create a JSON value from an input in MessagePack format\n\n    Deserializes a given input @a i to a JSON value using the MessagePack\n    serialization format.\n\n    The library maps MessagePack types to JSON value types as follows:\n\n    MessagePack type | JSON value type | first byte\n    ---------------- | --------------- | ----------\n    positive fixint  | number_unsigned | 0x00..0x7F\n    fixmap           | object          | 0x80..0x8F\n    fixarray         | array           | 0x90..0x9F\n    fixstr           | string          | 0xA0..0xBF\n    nil              | `null`          | 0xC0\n    false            | `false`         | 0xC2\n    true             | `true`          | 0xC3\n    float 32         | number_float    | 0xCA\n    float 64         | number_float    | 0xCB\n    uint 8           | number_unsigned | 0xCC\n    uint 16          | number_unsigned | 0xCD\n    uint 32          | number_unsigned | 0xCE\n    uint 64          | number_unsigned | 0xCF\n    int 8            | number_integer  | 0xD0\n    int 16           | number_integer  | 0xD1\n    int 32           | number_integer  | 0xD2\n    int 64           | number_integer  | 0xD3\n    str 8            | string          | 0xD9\n    str 16           | string          | 0xDA\n    str 32           | string          | 0xDB\n    array 16         | array           | 0xDC\n    array 32         | array           | 0xDD\n    map 16           | object          | 0xDE\n    map 32           | object          | 0xDF\n    bin 8            | binary          | 0xC4\n    bin 16           | binary          | 0xC5\n    bin 32           | binary          | 0xC6\n    ext 8            | binary          | 0xC7\n    ext 16           | binary          | 0xC8\n    ext 32           | binary          | 0xC9\n    fixext 1         | binary          | 0xD4\n    fixext 2         | binary          | 0xD5\n    fixext 4         | binary          | 0xD6\n    fixext 8         | binary          | 0xD7\n    fixext 16        | binary          | 0xD8\n    negative fixint  | number_integer  | 0xE0-0xFF\n\n    @note Any MessagePack output created @ref to_msgpack can be successfully\n          parsed by @ref from_msgpack.\n\n    @param[in] i  an input in MessagePack format convertible to an input\n                  adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if unsupported features from MessagePack were\n    used in the given input @a i or if the input is not valid MessagePack\n    @throw parse_error.113 if a string was expected as map key, but not found\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    MessagePack format to a JSON value.,from_msgpack}\n\n    @sa http://msgpack.org\n    @sa @ref to_msgpack(const basic_json&) for the analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for\n        the related UBJSON format\n    @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for\n        the related BSON format\n\n    @since version 2.0.9; parameter @a start_index since 2.1.1; changed to\n           consume input adapters, removed start_index parameter, and added\n           @a strict parameter since 3.0.0; added @a allow_exceptions parameter\n           since 3.2.0\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(InputType&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_msgpack(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(IteratorType first, IteratorType last,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(const T* ptr, std::size_t len,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        return from_msgpack(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(detail::span_input_adapter&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    /*!\n    @brief create a JSON value from an input in UBJSON format\n\n    Deserializes a given input @a i to a JSON value using the UBJSON (Universal\n    Binary JSON) serialization format.\n\n    The library maps UBJSON types to JSON value types as follows:\n\n    UBJSON type | JSON value type                         | marker\n    ----------- | --------------------------------------- | ------\n    no-op       | *no value, next value is read*          | `N`\n    null        | `null`                                  | `Z`\n    false       | `false`                                 | `F`\n    true        | `true`                                  | `T`\n    float32     | number_float                            | `d`\n    float64     | number_float                            | `D`\n    uint8       | number_unsigned                         | `U`\n    int8        | number_integer                          | `i`\n    int16       | number_integer                          | `I`\n    int32       | number_integer                          | `l`\n    int64       | number_integer                          | `L`\n    high-precision number | number_integer, number_unsigned, or number_float - depends on number string | 'H'\n    string      | string                                  | `S`\n    char        | string                                  | `C`\n    array       | array (optimized values are supported)  | `[`\n    object      | object (optimized values are supported) | `{`\n\n    @note The mapping is **complete** in the sense that any UBJSON value can\n          be converted to a JSON value.\n\n    @param[in] i  an input in UBJSON format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if a parse error occurs\n    @throw parse_error.113 if a string could not be parsed successfully\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    UBJSON format to a JSON value.,from_ubjson}\n\n    @sa http://ubjson.org\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for\n        the related MessagePack format\n    @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for\n        the related BSON format\n\n    @since version 3.1.0; added @a allow_exceptions parameter since 3.2.0\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(InputType&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_ubjson(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(IteratorType first, IteratorType last,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(const T* ptr, std::size_t len,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        return from_ubjson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(detail::span_input_adapter&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    /*!\n    @brief Create a JSON value from an input in BSON format\n\n    Deserializes a given input @a i to a JSON value using the BSON (Binary JSON)\n    serialization format.\n\n    The library maps BSON record types to JSON value types as follows:\n\n    BSON type       | BSON marker byte | JSON value type\n    --------------- | ---------------- | ---------------------------\n    double          | 0x01             | number_float\n    string          | 0x02             | string\n    document        | 0x03             | object\n    array           | 0x04             | array\n    binary          | 0x05             | still unsupported\n    undefined       | 0x06             | still unsupported\n    ObjectId        | 0x07             | still unsupported\n    boolean         | 0x08             | boolean\n    UTC Date-Time   | 0x09             | still unsupported\n    null            | 0x0A             | null\n    Regular Expr.   | 0x0B             | still unsupported\n    DB Pointer      | 0x0C             | still unsupported\n    JavaScript Code | 0x0D             | still unsupported\n    Symbol          | 0x0E             | still unsupported\n    JavaScript Code | 0x0F             | still unsupported\n    int32           | 0x10             | number_integer\n    Timestamp       | 0x11             | still unsupported\n    128-bit decimal float | 0x13       | still unsupported\n    Max Key         | 0x7F             | still unsupported\n    Min Key         | 0xFF             | still unsupported\n\n    @warning The mapping is **incomplete**. The unsupported mappings\n             are indicated in the table above.\n\n    @param[in] i  an input in BSON format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.114 if an unsupported BSON record type is encountered\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    BSON format to a JSON value.,from_bson}\n\n    @sa http://bsonspec.org/spec.html\n    @sa @ref to_bson(const basic_json&) for the analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for\n        the related MessagePack format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        related UBJSON format\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_bson(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        return from_bson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n    /// @}\n\n    //////////////////////////\n    // JSON Pointer support //\n    //////////////////////////\n\n    /// @name JSON Pointer functions\n    /// @{\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Uses a JSON pointer to retrieve a reference to the respective JSON value.\n    No bound checking is performed. Similar to @ref operator[](const typename\n    object_t::key_type&), `null` values are created in arrays and objects if\n    necessary.\n\n    In particular:\n    - If the JSON pointer points to an object key that does not exist, it\n      is created an filled with a `null` value before a reference to it\n      is returned.\n    - If the JSON pointer points to an array index that does not exist, it\n      is created an filled with a `null` value before a reference to it\n      is returned. All indices between the current maximum and the given\n      index are also filled with `null`.\n    - The special value `-` is treated as a synonym for the index past the\n      end.\n\n    @param[in] ptr  a JSON pointer\n\n    @return reference to the element pointed to by @a ptr\n\n    @complexity Constant.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n\n    @liveexample{The behavior is shown in the example.,operatorjson_pointer}\n\n    @since version 2.0.0\n    */\n    reference operator[](const json_pointer& ptr)\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Uses a JSON pointer to retrieve a reference to the respective JSON value.\n    No bound checking is performed. The function does not change the JSON\n    value; no `null` values are created. In particular, the special value\n    `-` yields an exception.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return const reference to the element pointed to by @a ptr\n\n    @complexity Constant.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n\n    @liveexample{The behavior is shown in the example.,operatorjson_pointer_const}\n\n    @since version 2.0.0\n    */\n    const_reference operator[](const json_pointer& ptr) const\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Returns a reference to the element at with specified JSON pointer @a ptr,\n    with bounds checking.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return reference to the element pointed to by @a ptr\n\n    @throw parse_error.106 if an array index in the passed JSON pointer @a ptr\n    begins with '0'. See example below.\n\n    @throw parse_error.109 if an array index in the passed JSON pointer @a ptr\n    is not a number. See example below.\n\n    @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr\n    is out of range. See example below.\n\n    @throw out_of_range.402 if the array index '-' is used in the passed JSON\n    pointer @a ptr. As `at` provides checked access (and no elements are\n    implicitly inserted), the index '-' is always invalid. See example below.\n\n    @throw out_of_range.403 if the JSON pointer describes a key of an object\n    which cannot be found. See example below.\n\n    @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved.\n    See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 2.0.0\n\n    @liveexample{The behavior is shown in the example.,at_json_pointer}\n    */\n    reference at(const json_pointer& ptr)\n    {\n        return ptr.get_checked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Returns a const reference to the element at with specified JSON pointer @a\n    ptr, with bounds checking.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return reference to the element pointed to by @a ptr\n\n    @throw parse_error.106 if an array index in the passed JSON pointer @a ptr\n    begins with '0'. See example below.\n\n    @throw parse_error.109 if an array index in the passed JSON pointer @a ptr\n    is not a number. See example below.\n\n    @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr\n    is out of range. See example below.\n\n    @throw out_of_range.402 if the array index '-' is used in the passed JSON\n    pointer @a ptr. As `at` provides checked access (and no elements are\n    implicitly inserted), the index '-' is always invalid. See example below.\n\n    @throw out_of_range.403 if the JSON pointer describes a key of an object\n    which cannot be found. See example below.\n\n    @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved.\n    See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 2.0.0\n\n    @liveexample{The behavior is shown in the example.,at_json_pointer_const}\n    */\n    const_reference at(const json_pointer& ptr) const\n    {\n        return ptr.get_checked(this);\n    }\n\n    /*!\n    @brief return flattened JSON value\n\n    The function creates a JSON object whose keys are JSON pointers (see [RFC\n    6901](https://tools.ietf.org/html/rfc6901)) and whose values are all\n    primitive. The original JSON value can be restored using the @ref\n    unflatten() function.\n\n    @return an object that maps JSON pointers to primitive values\n\n    @note Empty objects and arrays are flattened to `null` and will not be\n          reconstructed correctly by the @ref unflatten() function.\n\n    @complexity Linear in the size the JSON value.\n\n    @liveexample{The following code shows how a JSON object is flattened to an\n    object whose keys consist of JSON pointers.,flatten}\n\n    @sa @ref unflatten() for the reverse function\n\n    @since version 2.0.0\n    */\n    basic_json flatten() const\n    {\n        basic_json result(value_t::object);\n        json_pointer::flatten(\"\", *this, result);\n        return result;\n    }\n\n    /*!\n    @brief unflatten a previously flattened JSON value\n\n    The function restores the arbitrary nesting of a JSON value that has been\n    flattened before using the @ref flatten() function. The JSON value must\n    meet certain constraints:\n    1. The value must be an object.\n    2. The keys must be JSON pointers (see\n       [RFC 6901](https://tools.ietf.org/html/rfc6901))\n    3. The mapped values must be primitive JSON types.\n\n    @return the original JSON from a flattened version\n\n    @note Empty objects and arrays are flattened by @ref flatten() to `null`\n          values and can not unflattened to their original type. Apart from\n          this example, for a JSON value `j`, the following is always true:\n          `j == j.flatten().unflatten()`.\n\n    @complexity Linear in the size the JSON value.\n\n    @throw type_error.314  if value is not an object\n    @throw type_error.315  if object values are not primitive\n\n    @liveexample{The following code shows how a flattened JSON object is\n    unflattened into the original nested JSON object.,unflatten}\n\n    @sa @ref flatten() for the reverse function\n\n    @since version 2.0.0\n    */\n    basic_json unflatten() const\n    {\n        return json_pointer::unflatten(*this);\n    }\n\n    /// @}\n\n    //////////////////////////\n    // JSON Patch functions //\n    //////////////////////////\n\n    /// @name JSON Patch functions\n    /// @{\n\n    /*!\n    @brief applies a JSON patch\n\n    [JSON Patch](http://jsonpatch.com) defines a JSON document structure for\n    expressing a sequence of operations to apply to a JSON) document. With\n    this function, a JSON Patch is applied to the current JSON value by\n    executing all operations from the patch.\n\n    @param[in] json_patch  JSON patch document\n    @return patched document\n\n    @note The application of a patch is atomic: Either all operations succeed\n          and the patched document is returned or an exception is thrown. In\n          any case, the original value is not changed: the patch is applied\n          to a copy of the value.\n\n    @throw parse_error.104 if the JSON patch does not consist of an array of\n    objects\n\n    @throw parse_error.105 if the JSON patch is malformed (e.g., mandatory\n    attributes are missing); example: `\"operation add must have member path\"`\n\n    @throw out_of_range.401 if an array index is out of range.\n\n    @throw out_of_range.403 if a JSON pointer inside the patch could not be\n    resolved successfully in the current JSON value; example: `\"key baz not\n    found\"`\n\n    @throw out_of_range.405 if JSON pointer has no parent (\"add\", \"remove\",\n    \"move\")\n\n    @throw other_error.501 if \"test\" operation was unsuccessful\n\n    @complexity Linear in the size of the JSON value and the length of the\n    JSON patch. As usually only a fraction of the JSON value is affected by\n    the patch, the complexity can usually be neglected.\n\n    @liveexample{The following code shows how a JSON patch is applied to a\n    value.,patch}\n\n    @sa @ref diff -- create a JSON patch by comparing two JSON values\n\n    @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)\n    @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901)\n\n    @since version 2.0.0\n    */\n    basic_json patch(const basic_json& json_patch) const\n    {\n        // make a working copy to apply the patch to\n        basic_json result = *this;\n\n        // the valid JSON Patch operations\n        enum class patch_operations {add, remove, replace, move, copy, test, invalid};\n\n        const auto get_op = [](const std::string & op)\n        {\n            if (op == \"add\")\n            {\n                return patch_operations::add;\n            }\n            if (op == \"remove\")\n            {\n                return patch_operations::remove;\n            }\n            if (op == \"replace\")\n            {\n                return patch_operations::replace;\n            }\n            if (op == \"move\")\n            {\n                return patch_operations::move;\n            }\n            if (op == \"copy\")\n            {\n                return patch_operations::copy;\n            }\n            if (op == \"test\")\n            {\n                return patch_operations::test;\n            }\n\n            return patch_operations::invalid;\n        };\n\n        // wrapper for \"add\" operation; add value at ptr\n        const auto operation_add = [&result](json_pointer & ptr, basic_json val)\n        {\n            // adding to the root of the target document means replacing it\n            if (ptr.empty())\n            {\n                result = val;\n                return;\n            }\n\n            // make sure the top element of the pointer exists\n            json_pointer top_pointer = ptr.top();\n            if (top_pointer != ptr)\n            {\n                result.at(top_pointer);\n            }\n\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            basic_json& parent = result[ptr];\n\n            switch (parent.m_type)\n            {\n                case value_t::null:\n                case value_t::object:\n                {\n                    // use operator[] to add value\n                    parent[last_path] = val;\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    if (last_path == \"-\")\n                    {\n                        // special case: append to back\n                        parent.push_back(val);\n                    }\n                    else\n                    {\n                        const auto idx = json_pointer::array_index(last_path);\n                        if (JSON_HEDLEY_UNLIKELY(idx > parent.size()))\n                        {\n                            // avoid undefined behavior\n                            JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n                        }\n\n                        // default case: insert add offset\n                        parent.insert(parent.begin() + static_cast<difference_type>(idx), val);\n                    }\n                    break;\n                }\n\n                // if there exists a parent it cannot be primitive\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false);  // LCOV_EXCL_LINE\n            }\n        };\n\n        // wrapper for \"remove\" operation; remove value at ptr\n        const auto operation_remove = [&result](json_pointer & ptr)\n        {\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            basic_json& parent = result.at(ptr);\n\n            // remove child\n            if (parent.is_object())\n            {\n                // perform range check\n                auto it = parent.find(last_path);\n                if (JSON_HEDLEY_LIKELY(it != parent.end()))\n                {\n                    parent.erase(it);\n                }\n                else\n                {\n                    JSON_THROW(out_of_range::create(403, \"key '\" + last_path + \"' not found\"));\n                }\n            }\n            else if (parent.is_array())\n            {\n                // note erase performs range check\n                parent.erase(json_pointer::array_index(last_path));\n            }\n        };\n\n        // type check: top level value must be an array\n        if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array()))\n        {\n            JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\"));\n        }\n\n        // iterate and apply the operations\n        for (const auto& val : json_patch)\n        {\n            // wrapper to get a value for an operation\n            const auto get_value = [&val](const std::string & op,\n                                          const std::string & member,\n                                          bool string_type) -> basic_json &\n            {\n                // find value\n                auto it = val.m_value.object->find(member);\n\n                // context-sensitive error message\n                const auto error_msg = (op == \"op\") ? \"operation\" : \"operation '\" + op + \"'\";\n\n                // check if desired value is present\n                if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end()))\n                {\n                    JSON_THROW(parse_error::create(105, 0, error_msg + \" must have member '\" + member + \"'\"));\n                }\n\n                // check if result is of type string\n                if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string()))\n                {\n                    JSON_THROW(parse_error::create(105, 0, error_msg + \" must have string member '\" + member + \"'\"));\n                }\n\n                // no error: return value\n                return it->second;\n            };\n\n            // type check: every element of the array must be an object\n            if (JSON_HEDLEY_UNLIKELY(!val.is_object()))\n            {\n                JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\"));\n            }\n\n            // collect mandatory members\n            const auto op = get_value(\"op\", \"op\", true).template get<std::string>();\n            const auto path = get_value(op, \"path\", true).template get<std::string>();\n            json_pointer ptr(path);\n\n            switch (get_op(op))\n            {\n                case patch_operations::add:\n                {\n                    operation_add(ptr, get_value(\"add\", \"value\", false));\n                    break;\n                }\n\n                case patch_operations::remove:\n                {\n                    operation_remove(ptr);\n                    break;\n                }\n\n                case patch_operations::replace:\n                {\n                    // the \"path\" location must exist - use at()\n                    result.at(ptr) = get_value(\"replace\", \"value\", false);\n                    break;\n                }\n\n                case patch_operations::move:\n                {\n                    const auto from_path = get_value(\"move\", \"from\", true).template get<std::string>();\n                    json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json v = result.at(from_ptr);\n\n                    // The move operation is functionally identical to a\n                    // \"remove\" operation on the \"from\" location, followed\n                    // immediately by an \"add\" operation at the target\n                    // location with the value that was just removed.\n                    operation_remove(from_ptr);\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::copy:\n                {\n                    const auto from_path = get_value(\"copy\", \"from\", true).template get<std::string>();\n                    const json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json v = result.at(from_ptr);\n\n                    // The copy is functionally identical to an \"add\"\n                    // operation at the target location using the value\n                    // specified in the \"from\" member.\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::test:\n                {\n                    bool success = false;\n                    JSON_TRY\n                    {\n                        // check if \"value\" matches the one at \"path\"\n                        // the \"path\" location must exist - use at()\n                        success = (result.at(ptr) == get_value(\"test\", \"value\", false));\n                    }\n                    JSON_INTERNAL_CATCH (out_of_range&)\n                    {\n                        // ignore out of range errors: success remains false\n                    }\n\n                    // throw an exception if test fails\n                    if (JSON_HEDLEY_UNLIKELY(!success))\n                    {\n                        JSON_THROW(other_error::create(501, \"unsuccessful: \" + val.dump()));\n                    }\n\n                    break;\n                }\n\n                default:\n                {\n                    // op must be \"add\", \"remove\", \"replace\", \"move\", \"copy\", or\n                    // \"test\"\n                    JSON_THROW(parse_error::create(105, 0, \"operation value '\" + op + \"' is invalid\"));\n                }\n            }\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief creates a diff as a JSON patch\n\n    Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can\n    be changed into the value @a target by calling @ref patch function.\n\n    @invariant For two JSON values @a source and @a target, the following code\n    yields always `true`:\n    @code {.cpp}\n    source.patch(diff(source, target)) == target;\n    @endcode\n\n    @note Currently, only `remove`, `add`, and `replace` operations are\n          generated.\n\n    @param[in] source  JSON value to compare from\n    @param[in] target  JSON value to compare against\n    @param[in] path    helper value to create JSON pointers\n\n    @return a JSON patch to convert the @a source to @a target\n\n    @complexity Linear in the lengths of @a source and @a target.\n\n    @liveexample{The following code shows how a JSON patch is created as a\n    diff for two JSON values.,diff}\n\n    @sa @ref patch -- apply a JSON patch\n    @sa @ref merge_patch -- apply a JSON Merge Patch\n\n    @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)\n\n    @since version 2.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json diff(const basic_json& source, const basic_json& target,\n                           const std::string& path = \"\")\n    {\n        // the patch\n        basic_json result(value_t::array);\n\n        // if the values are the same, return empty patch\n        if (source == target)\n        {\n            return result;\n        }\n\n        if (source.type() != target.type())\n        {\n            // different types: replace value\n            result.push_back(\n            {\n                {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n            });\n            return result;\n        }\n\n        switch (source.type())\n        {\n            case value_t::array:\n            {\n                // first pass: traverse common elements\n                std::size_t i = 0;\n                while (i < source.size() && i < target.size())\n                {\n                    // recursive call to compare array values at index i\n                    auto temp_diff = diff(source[i], target[i], path + \"/\" + std::to_string(i));\n                    result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    ++i;\n                }\n\n                // i now reached the end of at least one array\n                // in a second pass, traverse the remaining elements\n\n                // remove my remaining elements\n                const auto end_index = static_cast<difference_type>(result.size());\n                while (i < source.size())\n                {\n                    // add operations in reverse order to avoid invalid\n                    // indices\n                    result.insert(result.begin() + end_index, object(\n                    {\n                        {\"op\", \"remove\"},\n                        {\"path\", path + \"/\" + std::to_string(i)}\n                    }));\n                    ++i;\n                }\n\n                // add other remaining elements\n                while (i < target.size())\n                {\n                    result.push_back(\n                    {\n                        {\"op\", \"add\"},\n                        {\"path\", path + \"/-\"},\n                        {\"value\", target[i]}\n                    });\n                    ++i;\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // first pass: traverse this object's elements\n                for (auto it = source.cbegin(); it != source.cend(); ++it)\n                {\n                    // escape the key name to be used in a JSON patch\n                    const auto key = json_pointer::escape(it.key());\n\n                    if (target.find(it.key()) != target.end())\n                    {\n                        // recursive call to compare object values at key it\n                        auto temp_diff = diff(it.value(), target[it.key()], path + \"/\" + key);\n                        result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    }\n                    else\n                    {\n                        // found a key that is not in o -> remove it\n                        result.push_back(object(\n                        {\n                            {\"op\", \"remove\"}, {\"path\", path + \"/\" + key}\n                        }));\n                    }\n                }\n\n                // second pass: traverse other object's elements\n                for (auto it = target.cbegin(); it != target.cend(); ++it)\n                {\n                    if (source.find(it.key()) == source.end())\n                    {\n                        // found a key that is not in this -> add it\n                        const auto key = json_pointer::escape(it.key());\n                        result.push_back(\n                        {\n                            {\"op\", \"add\"}, {\"path\", path + \"/\" + key},\n                            {\"value\", it.value()}\n                        });\n                    }\n                }\n\n                break;\n            }\n\n            default:\n            {\n                // both primitive type: replace value\n                result.push_back(\n                {\n                    {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n                });\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /// @}\n\n    ////////////////////////////////\n    // JSON Merge Patch functions //\n    ////////////////////////////////\n\n    /// @name JSON Merge Patch functions\n    /// @{\n\n    /*!\n    @brief applies a JSON Merge Patch\n\n    The merge patch format is primarily intended for use with the HTTP PATCH\n    method as a means of describing a set of modifications to a target\n    resource's content. This function applies a merge patch to the current\n    JSON value.\n\n    The function implements the following algorithm from Section 2 of\n    [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396):\n\n    ```\n    define MergePatch(Target, Patch):\n      if Patch is an Object:\n        if Target is not an Object:\n          Target = {} // Ignore the contents and set it to an empty Object\n        for each Name/Value pair in Patch:\n          if Value is null:\n            if Name exists in Target:\n              remove the Name/Value pair from Target\n          else:\n            Target[Name] = MergePatch(Target[Name], Value)\n        return Target\n      else:\n        return Patch\n    ```\n\n    Thereby, `Target` is the current object; that is, the patch is applied to\n    the current value.\n\n    @param[in] apply_patch  the patch to apply\n\n    @complexity Linear in the lengths of @a patch.\n\n    @liveexample{The following code shows how a JSON Merge Patch is applied to\n    a JSON document.,merge_patch}\n\n    @sa @ref patch -- apply a JSON patch\n    @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)\n\n    @since version 3.0.0\n    */\n    void merge_patch(const basic_json& apply_patch)\n    {\n        if (apply_patch.is_object())\n        {\n            if (!is_object())\n            {\n                *this = object();\n            }\n            for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it)\n            {\n                if (it.value().is_null())\n                {\n                    erase(it.key());\n                }\n                else\n                {\n                    operator[](it.key()).merge_patch(it.value());\n                }\n            }\n        }\n        else\n        {\n            *this = apply_patch;\n        }\n    }\n\n    /// @}\n};\n\n/*!\n@brief user-defined to_string function for JSON values\n\nThis function implements a user-defined to_string  for JSON objects.\n\n@param[in] j  a JSON object\n@return a std::string object\n*/\n\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstd::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)\n{\n    return j.dump();\n}\n} // namespace nlohmann\n\n///////////////////////\n// nonmember support //\n///////////////////////\n\n// specialization of std::swap, and std::hash\nnamespace std\n{\n\n/// hash value for JSON objects\ntemplate<>\nstruct hash<nlohmann::json>\n{\n    /*!\n    @brief return a hash value for a JSON object\n\n    @since version 1.0.0\n    */\n    std::size_t operator()(const nlohmann::json& j) const\n    {\n        return nlohmann::detail::hash(j);\n    }\n};\n\n/// specialization for std::less<value_t>\n/// @note: do not remove the space after '<',\n///        see https://github.com/nlohmann/json/pull/679\ntemplate<>\nstruct less<::nlohmann::detail::value_t>\n{\n    /*!\n    @brief compare two value_t enum values\n    @since version 3.0.0\n    */\n    bool operator()(nlohmann::detail::value_t lhs,\n                    nlohmann::detail::value_t rhs) const noexcept\n    {\n        return nlohmann::detail::operator<(lhs, rhs);\n    }\n};\n\n// C++20 prohibit function specialization in the std namespace.\n#ifndef JSON_HAS_CPP_20\n\n/*!\n@brief exchanges the values of two JSON objects\n\n@since version 1.0.0\n*/\ntemplate<>\ninline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(\n    is_nothrow_move_constructible<nlohmann::json>::value&&\n    is_nothrow_move_assignable<nlohmann::json>::value\n                              )\n{\n    j1.swap(j2);\n}\n\n#endif\n\n} // namespace std\n\n/*!\n@brief user-defined string literal for JSON values\n\nThis operator implements a user-defined string literal for JSON objects. It\ncan be used by adding `\"_json\"` to a string literal and returns a JSON object\nif no parse error occurred.\n\n@param[in] s  a string representation of a JSON object\n@param[in] n  the length of string @a s\n@return a JSON object\n\n@since version 1.0.0\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline nlohmann::json operator \"\" _json(const char* s, std::size_t n)\n{\n    return nlohmann::json::parse(s, s + n);\n}\n\n/*!\n@brief user-defined string literal for JSON pointer\n\nThis operator implements a user-defined string literal for JSON Pointers. It\ncan be used by adding `\"_json_pointer\"` to a string literal and returns a JSON pointer\nobject if no parse error occurred.\n\n@param[in] s  a string representation of a JSON Pointer\n@param[in] n  the length of string @a s\n@return a JSON pointer object\n\n@since version 2.0.0\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline nlohmann::json::json_pointer operator \"\" _json_pointer(const char* s, std::size_t n)\n{\n    return nlohmann::json::json_pointer(std::string(s, n));\n}\n\n// #include <nlohmann/detail/macro_unscope.hpp>\n\n\n// restore GCC/clang diagnostic settings\n#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\n    #pragma GCC diagnostic pop\n#endif\n#if defined(__clang__)\n    #pragma GCC diagnostic pop\n#endif\n\n// clean up\n#undef JSON_ASSERT\n#undef JSON_INTERNAL_CATCH\n#undef JSON_CATCH\n#undef JSON_THROW\n#undef JSON_TRY\n#undef JSON_HAS_CPP_14\n#undef JSON_HAS_CPP_17\n#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION\n#undef NLOHMANN_BASIC_JSON_TPL\n#undef JSON_EXPLICIT\n\n// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>\n#undef JSON_HEDLEY_ALWAYS_INLINE\n#undef JSON_HEDLEY_ARM_VERSION\n#undef JSON_HEDLEY_ARM_VERSION_CHECK\n#undef JSON_HEDLEY_ARRAY_PARAM\n#undef JSON_HEDLEY_ASSUME\n#undef JSON_HEDLEY_BEGIN_C_DECLS\n#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#undef JSON_HEDLEY_CLANG_HAS_WARNING\n#undef JSON_HEDLEY_COMPCERT_VERSION\n#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#undef JSON_HEDLEY_CONCAT\n#undef JSON_HEDLEY_CONCAT3\n#undef JSON_HEDLEY_CONCAT3_EX\n#undef JSON_HEDLEY_CONCAT_EX\n#undef JSON_HEDLEY_CONST\n#undef JSON_HEDLEY_CONSTEXPR\n#undef JSON_HEDLEY_CONST_CAST\n#undef JSON_HEDLEY_CPP_CAST\n#undef JSON_HEDLEY_CRAY_VERSION\n#undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#undef JSON_HEDLEY_C_DECL\n#undef JSON_HEDLEY_DEPRECATED\n#undef JSON_HEDLEY_DEPRECATED_FOR\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#undef JSON_HEDLEY_DIAGNOSTIC_POP\n#undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#undef JSON_HEDLEY_DMC_VERSION\n#undef JSON_HEDLEY_DMC_VERSION_CHECK\n#undef JSON_HEDLEY_EMPTY_BASES\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#undef JSON_HEDLEY_END_C_DECLS\n#undef JSON_HEDLEY_FLAGS\n#undef JSON_HEDLEY_FLAGS_CAST\n#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#undef JSON_HEDLEY_GCC_HAS_FEATURE\n#undef JSON_HEDLEY_GCC_HAS_WARNING\n#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#undef JSON_HEDLEY_GCC_VERSION\n#undef JSON_HEDLEY_GCC_VERSION_CHECK\n#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#undef JSON_HEDLEY_GNUC_HAS_WARNING\n#undef JSON_HEDLEY_GNUC_VERSION\n#undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#undef JSON_HEDLEY_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_BUILTIN\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_EXTENSION\n#undef JSON_HEDLEY_HAS_FEATURE\n#undef JSON_HEDLEY_HAS_WARNING\n#undef JSON_HEDLEY_IAR_VERSION\n#undef JSON_HEDLEY_IAR_VERSION_CHECK\n#undef JSON_HEDLEY_IBM_VERSION\n#undef JSON_HEDLEY_IBM_VERSION_CHECK\n#undef JSON_HEDLEY_IMPORT\n#undef JSON_HEDLEY_INLINE\n#undef JSON_HEDLEY_INTEL_VERSION\n#undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#undef JSON_HEDLEY_IS_CONSTANT\n#undef JSON_HEDLEY_IS_CONSTEXPR_\n#undef JSON_HEDLEY_LIKELY\n#undef JSON_HEDLEY_MALLOC\n#undef JSON_HEDLEY_MESSAGE\n#undef JSON_HEDLEY_MSVC_VERSION\n#undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#undef JSON_HEDLEY_NEVER_INLINE\n#undef JSON_HEDLEY_NON_NULL\n#undef JSON_HEDLEY_NO_ESCAPE\n#undef JSON_HEDLEY_NO_RETURN\n#undef JSON_HEDLEY_NO_THROW\n#undef JSON_HEDLEY_NULL\n#undef JSON_HEDLEY_PELLES_VERSION\n#undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#undef JSON_HEDLEY_PGI_VERSION\n#undef JSON_HEDLEY_PGI_VERSION_CHECK\n#undef JSON_HEDLEY_PREDICT\n#undef JSON_HEDLEY_PRINTF_FORMAT\n#undef JSON_HEDLEY_PRIVATE\n#undef JSON_HEDLEY_PUBLIC\n#undef JSON_HEDLEY_PURE\n#undef JSON_HEDLEY_REINTERPRET_CAST\n#undef JSON_HEDLEY_REQUIRE\n#undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#undef JSON_HEDLEY_REQUIRE_MSG\n#undef JSON_HEDLEY_RESTRICT\n#undef JSON_HEDLEY_RETURNS_NON_NULL\n#undef JSON_HEDLEY_SENTINEL\n#undef JSON_HEDLEY_STATIC_ASSERT\n#undef JSON_HEDLEY_STATIC_CAST\n#undef JSON_HEDLEY_STRINGIFY\n#undef JSON_HEDLEY_STRINGIFY_EX\n#undef JSON_HEDLEY_SUNPRO_VERSION\n#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#undef JSON_HEDLEY_TINYC_VERSION\n#undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#undef JSON_HEDLEY_TI_ARMCL_VERSION\n#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL2000_VERSION\n#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL430_VERSION\n#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL6X_VERSION\n#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL7X_VERSION\n#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CLPRU_VERSION\n#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#undef JSON_HEDLEY_TI_VERSION\n#undef JSON_HEDLEY_TI_VERSION_CHECK\n#undef JSON_HEDLEY_UNAVAILABLE\n#undef JSON_HEDLEY_UNLIKELY\n#undef JSON_HEDLEY_UNPREDICTABLE\n#undef JSON_HEDLEY_UNREACHABLE\n#undef JSON_HEDLEY_UNREACHABLE_RETURN\n#undef JSON_HEDLEY_VERSION\n#undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#undef JSON_HEDLEY_VERSION_ENCODE\n#undef JSON_HEDLEY_WARNING\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#undef JSON_HEDLEY_FALL_THROUGH\n\n\n\n#endif  // INCLUDE_NLOHMANN_JSON_HPP_\n"
  },
  {
    "path": "src/windhawk/app/libraries/winhttpwrappers/WinHTTPWrappers.h",
    "content": "/*\nModule : WinHTTPWrappers.h\nPurpose: Defines the interface for a set of C++ class which encapsulate WinHTTP.\nThe classes are based on the MSDN Magazine article by Kenny Kerr at\n         https://docs.microsoft.com/en-us/archive/msdn-magazine/2008/august/windows-with-c-asynchronous-winhttp\nHistory: PJN / 30-05-2011 1. All tracing in CWinHTTPHandle::OnCallback has been\nmoved into a new TraceCallback method which client code is free to call. Also\nall tracing in CWinHTTPHandle:: OnCallbackComplete has been moved into a new\nTraceCallbackComplete method. Also all tracing in\nCDownloadFileWinHttpRequest::OnCallbackComplete has been moved into a new\n                          TraceCallbackComplete method.\n                          2. Moved cleanup of resources from\nCDownloadFileWinHttpRequest::OnCallbackComplete to a new public method called\nReleaseResources() PJN / 30-07-2011 1. CDownloadFileWinHttpRequest class is now\ncalled CAsyncWinHttpDownloader\n                          2. Major rework of the CAsyncWinHttpDownloader to now\nsupport HTTP and Proxy authentication, pre-authentication, resumed downloads,\nfile uploads, in-memory arrays and bandwidth throttling.\n                          3. Fixed an issue in TraceCallback where\nWINHTTP_CALLBACK_STATUS_SECURE_FAILURE would be reported incorrectly by TRACE\nstatements\n                          4. Addition of a new CSyncWinHttpDownloader class\nwhich provides for synchronous WinHTTP downloads.\n                          5. Updated the sample app to allow all of the new\nconfiguration settings of CAsyncWinHttpDownloader and CSyncWinHttpDownloader\nclasses to be exercised.\n                          6. Fixed a bug in CWinHTTPRequest::WriteData() where\nbuffer parameter was incorrectly set as a LPVOID instead of a LPCVOID. PJN /\n30-03-2013 1. Updated copyright details.\n                          2. Updated the sample app to correctly release the\nfile handles when the file is downloaded. Thanks to David Lowndes for reporting\nthis bug.\n                          3. Updated the code to clean compile on VC 2012\n                          4. TimeSinceStartDownload() method has been extended\nto return a __int64 return value instead of a DWORD.\n                          5. Changed class names to use C*WinHTTP* prefix\ninstead of C*WinHttp*. PJN / 01-12-2013 1. Updated the code to clean compile on\nVC 2013. PJN / 08-06-2014 1. Updated copyright details.\n                          2.\nUpdatedCAsyncWinHTTPDownloader::InitializetoallowthedwShareModeparameterof\n                          the ATL::CAtlFile::Createcall for the fileinstances\ntobedownloadanduploadedto becustomized.Thedefaultvalue\nforthesharemodeisnow0insteadofFILE_SHARE_READ.\n                          ThankstoSimonOrdeforprovidingthisniceaddition.\n                          3. All the class methods have had SAL annotations\nadded PJN / 08-03-2015 1. Updated copyright details.\n                          2. Reworked the classes to optionally compile without\nMFC. By default the classes now use STL classes and idioms but if you define\nWINHTTPWRAPPERS_MFC_EXTENSTIONS the classes will revert back to the MFC\nbehaviour.\n                          3. Moved all the classes to a WinHTTPWrappers\nnamespace\n                          4. Renamed CWinHTTPHandle class to CHandle\n                          5. Renamed CWinHTTPSession class to CSession\n                          6. Renamed CWinHTTPConnection class to CConnection\n                          7. Renamed CWinHTTPRequest class to CRequest\n                          8. Renamed CAsyncWinHTTPDownloader class to\nCAsyncDownloader\n                          9. Renamed CSyncWinHTTPDownloader class to\nCSyncDownloader\n                          10. DeleteDownloadedFile now checks to see if\n\"m_sFileToDownloadInto\" is valid before it calls DeleteFile. Thanks to Paul\nJackson for reporting this issue.\n                          11. Reworked the CAsyncDownloader::SendRequest,\nOn407Response, On401Response & OnRequestErrorCallback methods to pass a more\ncorrect value for the \"dwTotalLength\" parameter in the call to\nWinHttpSendRequest. Thanks to Paul Jackson for reporting this issue. PJN /\n11-03-2015 1. Optimized allocation of temporary string stack variables in\n                          CAsyncDownloader::Initialize &\nCAsyncDownloader::DeleteDownloadedFile. Thanks to Paul Jackson for reporting\nthis issue. PJN / 14-06-2015 1. Addition of a\nCAsyncDownloader::GetLastStatusCode method.\n                          2. CAsyncDownloader::OnHeadersAvailableCallback and\nCSyncDownloader::SendRequestSync now preserves the HTTP status code when the\nvalue received is not 200, 206, 401 or 407 and the return value\nATL::AtlHresultFromWin32(ERROR_WINHTTP_INVALID_HEADER) is about to be returned.\n                          3. CSyncDownloader::SendRequestSync method has been\nmade virtual.\n                          4. Update the sample app to report the last status\ncode if available when a download request fails. PJN / 07-11-2015 1. Updated SAL\nannotations in CHandle::SetOption to be consistent with Windows 10 SDK.\n                          2. Fixed an issue in the use of _When_ SAL annotation\nin CHandle::SetOption\n                          3. Update the code to compile cleanly on VC 2015\n         PJN / 06-03-2016 1. Updated copyright details.\n                          2. The CAsyncDownloader destructor now resets the\nstatus callback function via SetStatusCallback(NULL,\nWINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS). This prevents spurious callbacks\noccurring after the C++ object is destroyed which depending on how you allocated\nthe C++ object could cause access violations in CHandle::_Callback.\n                          3. Optimized the logic in the sample app when updating\nthe edit box with status information PJN / 16-04-2017 1. Updated copyright\ndetails.\n                          2. Added support for WinHttpCreateProxyResolver,\nWinHttpResetAutoProxy, WinHttpWriteProxySettings, WinHttpReadProxySettings &\nWinHttpGetProxySettingsVersion from the latest Windows 10 SDK PJN /\n18-09-2017 1. Replaced CString::operator LPC*STR() calls throughout the codebase\nwith CString::GetString calls PJN / 23-05-2018 1. Replaced NULL with nullptr\nthroughout the code.\n                          3. Fixed a number of C++ core guidelines compiler\nwarnings. These changes mean that the code will now only compile on VC 2017 or\nlater. PJN / 02-09-2018 1. Fixed a number of compiler warnings when using VS\n2017 15.8.2 PJN / 29-09-2018 1. Removed code which supported\nWINHTTPWRAPPERS_MFC_EXTENSIONS define\n                          2. Added wrappers for WinHttpWebSocketCompleteUpgrade,\nWinHttpWebSocketSend, WinHttpWebSocketReceive, WinHttpWebSocketShutdown,\nWinHttpWebSocketClose & WinHttpWebSocketQueryCloseStatus APIs.\n                          3. Added wrappers for WinHttpGetProxyForUrlEx,\nWinHttpGetProxyForUrlEx2, WinHttpGetProxyResult & WinHttpGetProxyResultEx APIs.\n                          4. Reworked TimeSinceStartDownload to use\nGetTickCount64 API. PJN / 24-11-2018 1. Fixed some further compiler warnings\nwhen using VS 2017 15.9.2 PJN / 19-04-2019 1. Updated copyright details\n                          2. Updated the code to clean compile on VC 2019\n         PJN / 23-06-2019 1. Updated the code to clean compile when\n_ATL_NO_AUTOMATIC_NAMESPACE is defined. PJN / 14-08-2019 1. Fixed some further\ncompiler warnings when using VC 2019 Preview v16.3.0 Preview 2.0\n                          2. Added support for new WinHttpAddRequestHeadersEx\nAPI available in latest Windows 10 SDK PJN / 16-09-2019 1. Updated code to\nhandle all 2XX response codes. PJN / 03-11-2019 1. Updated initialization of\nvarious structs to use C++ 11 list initialization PJN / 18-01-2020 1. Updated\ncopyright details\n                          2. Fixed more Clang-Tidy static code analysis warnings\nin the code.\n                          3. Replaced BOOL with bool in various places\n         PJN / 01-02-2020 1. Fixed a bug in the sample app when calling the\nWinHttpCrackUrl. Thanks to Onur Senturk for reporting this issue.\n                          2. Fixed a bug in CSyncDownloader::SendRequestSync\nwhere the resources would not be released if the download was successful. Again\nthanks to to Onur Senturk for reporting this issue. PJN / 12-04-2020 1. Fixed\nmore Clang-Tidy static code analysis warnings in the code. PJN / 13-11-2020 1.\nAdded support for new WinHttpReadDataEx & WinHttpQueryHeadersEx APIs available\nin latest Windows 10 SDK. PJN / 09-04-2021 1. Updated copyright details\n                          2. Fixed more /analyze static code analysis warnings\nin the code. PJN / 24-06-2021 1. Added support for new\nWinHttpQueryConnectionGroup API available in latest Windows 11 SDK.\n                          2. Fixed up return value handling in\nGetProxySettingsVersion. PJN / 25-07-2021 1. Moved the QueryConnectionGroup\nmethod from CHandle into CConnection and CRequest\n                          2. Moved some of the reusable functionality in\nCAsyncDownloader::OnHeadersAvailableCallback into a new virtual\nOnCheckStatusCode method. PJN / 22-01-2022 1. Updated copyright details.\n                          2. Fixed more static code analysis warnings in Visual\nStudio 2022. PJN / 10-02-2022 1. Updated the code to use C++ uniform\ninitialization for all variable declarations\n                          2. Replaced ATL::CHeapPtr variables with std::vector.\n         PJN / 16-05-2022 1. Fixed a static code analysis warning from\nPVS-Studio in CHandle::_Callback related to an unnecessary ATLASSERT. Thanks to\nDavid Lowndes for reporting this issue.\n                          2. Fixed a static code analysis warning from\nPVS-Studio in the CWebSocket class which had an unnecessary \"m_h\" member that\nclashes with the same named member in the base class CHandle. Thanks to David\nLowndes for reporting this issue. PJN / 17-08-2022 1. Reset more member\nvariables in CAsyncDownloader::ReleaseResources.\n                          2. CAsyncDownloader::m_dwLastStatusCode is now\nimplemented as a std::optional.\n                          3. CAsyncDownloader::m_nContentLength is now\nimplemented as a std::optional.\n                          4. Made all CAsyncDownloader member variables public\nto allow easier customization of the class\n                          5. Implemented a version of\nCAsyncDownloader::SendRequest which allows the headers to be provided as a\nparameter.\n                          6. Implemented a version of CSyncDownloader\n::SendRequestSync which allows the headers to be provided as a parameter.\n                          7. Reworked CAsyncDownloader::On407Response,\nCAsyncDownloader::On401Response and CAsyncDownloader::OnRequestErrorCallback to\nuse correct value for dwTotalLength when calling WinHttpSendRequest.\n                          8. Reworked CSyncDownloader::SendRequestSync to call\nOnCheckStatusCode method. PJN / 10-05-2023 1. Updated copyright details.\n                          2. Updated module to indicate that it needs to be\ncompiled using /std:c++17. Thanks to Martin Richter for reporting this issue.\n\nCopyright (c) 2011 - 2023 by PJ Naughter (Web: www.naughter.com, Email:\npjna@naughter.com)\n\nAll rights reserved.\n\nCopyright / Usage Details:\n\nYou are allowed to include the source code in any product (commercial,\nshareware, freeware or otherwise) when your product is released in binary form.\nYou are allowed to modify the source code in any way you want except you cannot\nmodify the copyright details at the top of each module. If you want to\ndistribute source code with your application, then you are only allowed to\ndistribute versions released by the author. This is to maintain a single\ndistribution point for the source code.\n\n*/\n\n//////////////////// Macros / Defines /////////////////////////////////////////\n\n#pragma once\n\n#if _MSVC_LANG < 201703\n#error WinHTTPWrappers requires a minimum C++ language standard of /std:c++17\n#endif  // #if _MSVC_LANG < 201703\n\n#ifndef __WINHTTPWRAPPERS_H__\n#define __WINHTTPWRAPPERS_H__\n\n#ifndef CWINHTTPWRAPPERS_EXT_CLASS\n#define CWINHTTPWRAPPERS_EXT_CLASS\n#endif  // #ifndef CWINHTTPWRAPPERS_EXT_CLASS\n\n#pragma comment(lib, \"Winhttp.lib\")\n\n//////////////////// Includes /////////////////////////////////////////////////\n\n#ifndef _WINHTTPX_\n#pragma message( \\\n    \"To avoid this message, please put WinHttp.h in your pre compiled header (normally stdafx.h)\")\n#include <winhttp.h>\n#endif  // #ifndef _WINHTTPX_\n\n#ifndef __ATLBASE_H__\n#pragma message( \\\n    \"To avoid this message, please put atlbase.h in your pre compiled header (normally stdafx.h)\")\n#include <atlbase.h>\n#endif  // #ifndef __ATLBASE_H__\n\n#ifndef __ATLFILE_H__\n#pragma message( \\\n    \"To avoid this message, please put atlfile.h in your pre compiled header (normally stdafx.h)\")\n#include <atlfile.h>\n#endif  // #ifndef __ATLFILE_H__\n\n#ifndef __ATLSTR_H__\n#pragma message( \\\n    \"To avoid this message, please put atlstr.h in your pre compiled header (normally stdafx.h)\")\n#include <atlfile.h>\n#endif  // #ifndef __ATLSTR_H__\n\n#ifndef _STRING_\n#pragma message( \\\n    \"To avoid this message, please put string in your pre compiled header (normally stdafx.h)\")\n#include <string>\n#endif  // #ifndef _STRING_\n\n#ifndef _VECTOR_\n#pragma message( \\\n    \"To avoid this message, please put vector in your pre compiled header (normally stdafx.h)\")\n#include <vector>\n#endif  // #ifndef _VECTOR_\n\n#ifndef _OPTIONAL_\n#pragma message( \\\n    \"To avoid this message, please put optional in your pre compiled header (normally stdafx.h)\")\n#include <optional>\n#endif  // #ifndef _OPTIONAL_\n\n//////////////////// Classes //////////////////////////////////////////////////\n\nnamespace WinHTTPWrappers {\n\n// Typedefs\nusing String = std::wstring;\nusing ByteArray = std::vector<BYTE>;\n\n// Wrapper for a WinHTTP HINTERNET handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CHandle {\n   public:\n    // Constructors / Destructors\n    CHandle() = default;\n    CHandle(_In_ const CHandle&) = delete;\n\n    CHandle(_In_ CHandle&& handle) noexcept : m_h{handle.m_h} {\n        handle.m_h = nullptr;\n    }\n\n    explicit CHandle(_In_ HINTERNET h) noexcept : m_h{h} {}\n\n    virtual ~CHandle() {\n        if (m_h != nullptr)\n            Close();\n    }\n\n    // Methods\n    CHandle& operator=(_In_ const CHandle&) = delete;\n\n    CHandle& operator=(_In_ CHandle&& handle) noexcept {\n        if (m_h != nullptr)\n            Close();\n        m_h = handle.m_h;\n        handle.m_h = nullptr;\n\n        return *this;\n    }\n\n    operator HINTERNET() const noexcept { return m_h; }\n\n    void Attach(_In_ HINTERNET h) noexcept {\n#pragma warning(suppress : 26477)\n        ATLASSUME(m_h == nullptr);\n        m_h = h;\n    }\n\n    HINTERNET Detach() noexcept {\n        HINTERNET h{m_h};\n        m_h = nullptr;\n        return h;\n    }\n\n    void Close() noexcept {\n        if (m_h != nullptr) {\n            WinHttpCloseHandle(m_h);\n            m_h = nullptr;\n        }\n    }\n\n    HRESULT QueryOption(IN DWORD dwOption,\n                        _Out_writes_bytes_to_opt_(dwBufferLength,\n                                                  dwBufferLength)\n                            __out_data_source(NETWORK) void* pBuffer,\n                        IN OUT DWORD& dwBufferLength) noexcept {\n        if (!WinHttpQueryOption(m_h, dwOption, pBuffer, &dwBufferLength))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT SetOption(\n        _In_ DWORD dwOption,\n        _When_((dwOption == WINHTTP_OPTION_USERNAME ||\n                dwOption == WINHTTP_OPTION_PASSWORD ||\n                dwOption == WINHTTP_OPTION_PROXY_USERNAME ||\n                dwOption == WINHTTP_OPTION_PROXY_PASSWORD ||\n                dwOption == WINHTTP_OPTION_USER_AGENT),\n               _At_((LPCWSTR)lpBuffer, _In_reads_(dwBufferLength)))\n            _When_((dwOption == WINHTTP_OPTION_CLIENT_CERT_CONTEXT),\n                   _In_reads_bytes_opt_(dwBufferLength))\n                _When_((dwOption != WINHTTP_OPTION_USERNAME &&\n                        dwOption != WINHTTP_OPTION_PASSWORD &&\n                        dwOption != WINHTTP_OPTION_PROXY_USERNAME &&\n                        dwOption != WINHTTP_OPTION_PROXY_PASSWORD &&\n                        dwOption != WINHTTP_OPTION_CLIENT_CERT_CONTEXT &&\n                        dwOption != WINHTTP_OPTION_USER_AGENT),\n                       _In_reads_bytes_(dwBufferLength)) LPVOID lpBuffer,\n        _In_ DWORD dwBufferLength) noexcept {\n#pragma warning(suppress : 6387)\n        if (!WinHttpSetOption(m_h, dwOption, lpBuffer, dwBufferLength))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    WINHTTP_STATUS_CALLBACK SetStatusCallback(\n        _In_opt_ WINHTTP_STATUS_CALLBACK lpfnInternetCallback,\n        _In_ DWORD dwNotificationFlags =\n            WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS) noexcept {\n        return WinHttpSetStatusCallback(m_h, lpfnInternetCallback,\n                                        dwNotificationFlags, NULL);\n    }\n\n    WINHTTP_STATUS_CALLBACK SetStatusCallback(\n        _In_ DWORD dwNotificationFlags =\n            WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS) noexcept {\n        return SetStatusCallback(_Callback, dwNotificationFlags);\n    }\n\n    // Member variables\n    HINTERNET m_h{nullptr};\n\n   protected:\n    // Methods\n    static void CALLBACK _Callback(_In_ HINTERNET hInternet,\n                                   _In_ DWORD_PTR dwContext,\n                                   _In_ DWORD dwInternetStatus,\n                                   _In_opt_ LPVOID lpvStatusInformation,\n                                   _In_ DWORD dwStatusInformationLength) {\n        // Check to see if we have a context value\n        if (dwContext != 0) {\n            // Convert from the SDK world to the C++ world\n#pragma warning(suppress : 26429 26490)\n            auto pThis{reinterpret_cast<CHandle*>(dwContext)};\n\n            // Call the virtual \"OnCallback\" method\n#pragma warning(suppress : 26486)\n            const HRESULT hr{pThis->OnCallback(hInternet, dwInternetStatus,\n                                               lpvStatusInformation,\n                                               dwStatusInformationLength)};\n\n            // If the \"Callback\" method failed called the \"OnCallbackComplete\"\n            // method\n            if (FAILED(hr))\n#pragma warning(suppress : 26486)\n                pThis->OnCallbackComplete(hr, hInternet, dwInternetStatus,\n                                          lpvStatusInformation,\n                                          dwStatusInformationLength);\n        }\n    }\n\n#ifdef _DEBUG\n    static void TraceCallback(_In_ HINTERNET hInternet,\n                              _In_ DWORD dwInternetStatus,\n                              _In_opt_ LPVOID lpvStatusInformation,\n                              _In_ DWORD dwStatusInformationLength) {\n        switch (dwInternetStatus) {\n            case WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION: {\n                ATLTRACE(\n                    _T(\"Closing the connection to the server, Handle:%p\\n\"),\n                    hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER: {\n                ATLTRACE(\n                    _T(\"Successfully connected to the server:%ls, Handle:%p\\n\"),\n                    static_cast<LPWSTR>(lpvStatusInformation), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER: {\n                ATLTRACE(_T(\"Connecting to the server:%ls, Handle:%p\\n\"),\n                         static_cast<LPWSTR>(lpvStatusInformation), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED: {\n                ATLTRACE(\n                    _T(\"Successfully closed the connection to the server, \")\n                    _T(\"Handle:%p\\n\"),\n                    hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(\n                    _T(\"Data is available to be retrieved, Handle:%p, Data \")\n                    _T(\"Available:%u\\n\"),\n                    hInternet, *(static_cast<DWORD*>(lpvStatusInformation)));\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_HANDLE_CREATED: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(_T(\"Handle created, Handle:%p\\n\"),\n                         *(static_cast<HINTERNET*>(lpvStatusInformation)));\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(_T(\"Handle closing, Handle:%p\\n\"),\n                         *(static_cast<HINTERNET*>(lpvStatusInformation)));\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE: {\n                ATLTRACE(\n                    _T(\"The response header has been received, Handle:%p\\n\"),\n                    hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(\n                    _T(\"Received an intermediate (100 level) status code \")\n                    _T(\"message from the server, Handle:%p, Status:%u\\n\"),\n                    hInternet, *(static_cast<DWORD*>(lpvStatusInformation)));\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_NAME_RESOLVED: {\n                ATLTRACE(\n                    _T(\"Successfully found the IP address of the server:%ls, \")\n                    _T(\"Handle:%p\\n\"),\n                    static_cast<LPWSTR>(lpvStatusInformation), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: {\n                ATLTRACE(\n                    _T(\"Data was successfully read from the server, Data \")\n                    _T(\"Read:%u, Handle:%p\\n\"),\n                    dwStatusInformationLength, hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE: {\n                ATLTRACE(\n                    _T(\"Waiting for the server to respond to a request, \")\n                    _T(\"Handle:%p\\n\"),\n                    hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_REDIRECT: {\n                ATLTRACE(\n                    _T(\"An HTTP request is about to automatically redirect \")\n                    _T(\"the request to %ls, Handle:%p\\n\"),\n                    static_cast<LPWSTR>(lpvStatusInformation), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                auto pResult{static_cast<const WINHTTP_ASYNC_RESULT*>(\n                    lpvStatusInformation)};\n                ATLTRACE(\n                    _T(\"An error occurred while sending an HTTP request, \")\n                    _T(\"Error:%u, Handle:%p\\n\"),\n                    pResult->dwError, hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_REQUEST_SENT: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(\n                    _T(\"Successfully sent the information request to the \")\n                    _T(\"server, Data Sent:%u, Handle:%p\\n\"),\n                    *(static_cast<DWORD*>(lpvStatusInformation)), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_RESOLVING_NAME: {\n                ATLTRACE(\n                    _T(\"Looking up the IP address of a server name:%ls, \")\n                    _T(\"Handle:%p\\n\"),\n                    static_cast<LPWSTR>(lpvStatusInformation), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(\n                    _T(\"Successfully received a response from the server, \")\n                    _T(\"Data Received:%u, Handle:%p\\n\"),\n                    *(static_cast<DWORD*>(lpvStatusInformation)), hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_SECURE_FAILURE: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                const DWORD dwStatusInformation{\n                    *(static_cast<DWORD*>(lpvStatusInformation))};\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED) {\n                    ATLTRACE(\n                        _T(\"Certification revocation checking has been \")\n                        _T(\"enabled, but the revocation check failed to \")\n                        _T(\"verify whether a certificate has been revoked, \")\n                        _T(\"Handle:%p\\n\"),\n                        hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT) {\n                    ATLTRACE(_T(\"SSL certificate is invalid, Handle:%p\\n\"),\n                             hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED) {\n                    ATLTRACE(_T(\"SSL certificate was revoked, Handle:%p\\n\"),\n                             hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA) {\n                    ATLTRACE(\n                        _T(\"The function is unfamiliar with the Certificate \")\n                        _T(\"Authority that generated the server's \")\n                        _T(\"certificate, Handle:%p\\n\"),\n                        hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID) {\n                    ATLTRACE(\n                        _T(\"SSL certificate common name (host name field) is \")\n                        _T(\"incorrect, Handle:%p\\n\"),\n                        hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID) {\n                    ATLTRACE(\n                        _T(\"SSL certificate date that was received from the \")\n                        _T(\"server is bad. The certificate is expired, \")\n                        _T(\"Handle:%p\\n\"),\n                        hInternet);\n                }\n                if (dwStatusInformation &\n                    WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR) {\n                    ATLTRACE(\n                        _T(\"The application experienced an internal error \")\n                        _T(\"loading the SSL libraries, Handle:%p\\n\"),\n                        hInternet);\n                }\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_SENDING_REQUEST: {\n                ATLTRACE(\n                    _T(\"Sending the information request to the server, \")\n                    _T(\"Handle:%p\\n\"),\n                    hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE: {\n                ATLTRACE(_T(\"The request completed successfully, Handle:%p\\n\"),\n                         hInternet);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE: {\n#pragma warning(suppress : 26477)\n                ATLASSUME(lpvStatusInformation != nullptr);\n                ATLTRACE(\n                    _T(\"Data was successfully written to the server, Data \")\n                    _T(\"Written:%u, Handle:%p\\n\"),\n                    *(static_cast<DWORD*>(lpvStatusInformation)), hInternet);\n                break;\n            }\n            default: {\n                ATLTRACE(_T(\"Unknown status:%08X, Handle:%p\\n\"),\n                         dwInternetStatus, hInternet);\n                break;\n            }\n        }\n    }\n#endif  // #ifdef _DEBUG\n\n#pragma warning(suppress : 26440)\n    virtual HRESULT OnCallback(_In_ HINTERNET hInternet,\n                               _In_ DWORD dwInternetStatus,\n                               _In_opt_ LPVOID lpvStatusInformation,\n                               _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        return S_FALSE;  // S_FALSE means not handled in our callback\n    }\n\n#ifdef _DEBUG\n    static void TraceCallbackComplete(_In_ HRESULT hr,\n                                      _In_ HINTERNET hInternet,\n                                      _In_ DWORD dwInternetStatus,\n                                      _In_opt_ LPVOID lpvStatusInformation,\n                                      _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        ATLTRACE(\n            _T(\"CWinHTTPHandle::TraceCallbackComplete, HRESULT:%08X, \")\n            _T(\"InternetStatus:%08X, Handle:%p\\n\"),\n            hr, dwInternetStatus, hInternet);\n    }\n#endif  // #ifdef _DEBUG\n\n#pragma warning(suppress : 26440)\n    virtual HRESULT OnCallbackComplete(_In_ HRESULT hr,\n                                       _In_ HINTERNET hInternet,\n                                       _In_ DWORD dwInternetStatus,\n                                       _In_opt_ LPVOID lpvStatusInformation,\n                                       _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(hr);\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        return E_NOTIMPL;\n    }\n};\n\n// Wrapper for a WinHTTP resolver HINTERNET handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CResolver : public CHandle {\n   public:\n    // Constructors / Destructors\n    CResolver() = default;\n    CResolver(_In_ const CResolver&) = delete;\n    CResolver(_In_ CResolver&& resolver) noexcept\n        : CHandle{std::move(resolver)} {}\n    explicit CResolver(_In_ HINTERNET h) noexcept : CHandle{h} {}\n    ~CResolver() = default;  // NOLINT(modernize-use-override)\n\n    // Methods\n    CResolver& operator=(_In_ const CResolver&) = delete;\n\n#pragma warning(suppress : 26456)\n    CResolver& operator=(_In_ CResolver&& resolver) noexcept {\n        __super::operator=(std::move(resolver));\n        return *this;\n    }\n\n    __if_exists(WinHttpGetProxyForUrlEx) {\n#pragma warning(suppress : 6553)\n        DWORD GetProxyForUrlEx(\n            _In_ PCWSTR pcwszUrl,\n            _In_ WINHTTP_AUTOPROXY_OPTIONS * pAutoProxyOptions,\n            _In_opt_ DWORD_PTR pContext) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return WinHttpGetProxyForUrlEx(m_h, pcwszUrl, pAutoProxyOptions,\n                                           pContext);\n        }\n    }\n\n    __if_exists(WinHttpGetProxyForUrlEx2) {\n#pragma warning(suppress : 6553)\n        DWORD GetProxyForUrlEx2(\n            _In_ PCWSTR pcwszUrl,\n            _In_ WINHTTP_AUTOPROXY_OPTIONS * pAutoProxyOptions,\n            _In_ DWORD cbInterfaceSelectionContext,\n            _In_reads_bytes_opt_(cbInterfaceSelectionContext) BYTE *\n                pInterfaceSelectionContext,\n            _In_opt_ DWORD_PTR pContext) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return WinHttpGetProxyForUrlEx2(\n                m_h, pcwszUrl, pAutoProxyOptions, cbInterfaceSelectionContext,\n                pInterfaceSelectionContext, pContext);\n        }\n    }\n\n    __if_exists(WinHttpGetProxyResult) {\n        DWORD GetProxyResult(_Out_ WINHTTP_PROXY_RESULT *\n                             pProxyResult) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return WinHttpGetProxyResult(m_h, pProxyResult);\n        }\n    }\n\n    __if_exists(WinHttpGetProxyResultEx) {\n        DWORD GetProxyResultEx(_Out_ _Out_ WINHTTP_PROXY_RESULT_EX *\n                               pProxyResultEx) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return WinHttpGetProxyResultEx(m_h, pProxyResultEx);\n        }\n    }\n};\n\n// Wrapper for a WinHttp web socket handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CWebSocket : public CHandle {\n   public:\n    // Constructors / Destructors\n    CWebSocket() = default;\n    CWebSocket(_In_ const CWebSocket&) = delete;\n#pragma warning(suppress : 26495)\n    CWebSocket(_In_ CWebSocket&& socket) noexcept\n        : CHandle{std::move(socket)} {}\n#pragma warning(suppress : 26495)\n    explicit CWebSocket(_In_ HINTERNET h) noexcept : CHandle{h} {}\n    ~CWebSocket() = default;  // NOLINT(modernize-use-override)\n\n    // Methods\n    CWebSocket& operator=(_In_ const CWebSocket&) = delete;\n\n#pragma warning(suppress : 26456)\n    CWebSocket& operator=(_In_ CWebSocket&& socket) noexcept {\n        __super::operator=(std::move(socket));\n        return *this;\n    }\n\n#pragma warning(suppress : 26812)\n    DWORD Send(_In_ WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType,\n               _In_reads_opt_(dwBufferLength) PVOID pvBuffer,\n               _In_ DWORD dwBufferLength) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSERT(m_h != nullptr);\n\n        return WinHttpWebSocketSend(m_h, eBufferType, pvBuffer, dwBufferLength);\n    }\n\n    DWORD Receive(_Out_writes_bytes_to_(dwBufferLength, *pdwBytesRead)\n                      PVOID pvBuffer,\n                  _In_ DWORD dwBufferLength,\n                  _Out_range_(0, dwBufferLength) DWORD* pdwBytesRead,\n                  _Out_ WINHTTP_WEB_SOCKET_BUFFER_TYPE* peBufferType) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSERT(m_h != nullptr);\n\n        return WinHttpWebSocketReceive(m_h, pvBuffer, dwBufferLength,\n                                       pdwBytesRead, peBufferType);\n    }\n\n    DWORD Shutdown(_In_ USHORT usStatus,\n                   _In_reads_bytes_opt_(dwReasonLength) PVOID pvReason,\n                   _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH)\n                       DWORD dwReasonLength) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSERT(m_h != nullptr);\n\n        return WinHttpWebSocketShutdown(m_h, usStatus, pvReason,\n                                        dwReasonLength);\n    }\n\n    DWORD WebSocketClose(_In_ USHORT usStatus,\n                         _In_reads_bytes_opt_(dwReasonLength) PVOID pvReason,\n                         _In_range_(0,\n                                    WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH)\n                             DWORD dwReasonLength) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSERT(m_h != nullptr);\n\n        return WinHttpWebSocketClose(m_h, usStatus, pvReason, dwReasonLength);\n    }\n\n    DWORD QueryCloseStatus(\n        _Out_ USHORT* pusStatus,\n        _Out_writes_bytes_to_opt_(dwReasonLength, *pdwReasonLengthConsumed)\n            PVOID pvReason,\n        _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH)\n            DWORD dwReasonLength,\n        _Out_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH)\n            DWORD* pdwReasonLengthConsumed) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSERT(m_h != nullptr);\n\n        return WinHttpWebSocketQueryCloseStatus(\n            m_h, pusStatus, pvReason, dwReasonLength, pdwReasonLengthConsumed);\n    }\n};\n\n// Wrapper for a WinHTTP Session HINTERNET handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CSession : public CHandle {\n   public:\n    // Constructors / Destructors\n    CSession() = default;\n    CSession(_In_ const CSession&) = delete;\n    CSession(_In_ CSession&& session) noexcept : CHandle{std::move(session)} {}\n    explicit CSession(_In_ HINTERNET h) noexcept : CHandle{h} {}\n    ~CSession() = default;  // NOLINT(modernize-use-override)\n\n    // Methods\n    CSession& operator=(_In_ const CSession&) = delete;\n\n#pragma warning(suppress : 26456)\n    CSession& operator=(_In_ CSession&& session) noexcept {\n        __super::operator=(std::move(session));\n        return *this;\n    }\n\n    HRESULT Initialize(\n        _In_opt_z_ LPCWSTR pwszUserAgent,\n        _In_ DWORD dwAccessType = WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,\n        _In_opt_z_ LPCWSTR pwszProxyName = WINHTTP_NO_PROXY_NAME,\n        _In_opt_z_ LPCWSTR pwszProxyBypass = WINHTTP_NO_PROXY_BYPASS,\n        _In_ DWORD dwFlags = WINHTTP_FLAG_ASYNC) noexcept {\n        HINTERNET hSession{WinHttpOpen(pwszUserAgent, dwAccessType,\n                                       pwszProxyName, pwszProxyBypass,\n                                       dwFlags)};\n        if (hSession == nullptr)\n            return ATL::AtlHresultFromLastError();\n        Attach(hSession);\n\n        return S_OK;\n    }\n\n    HRESULT GetProxyForUrl(_In_ LPCWSTR lpcwszUrl,\n                           _In_ WINHTTP_AUTOPROXY_OPTIONS& AutoProxyOptions,\n                           _Out_ DWORD& dwAccessType,\n                           _Out_ String& sProxy,\n                           _Out_ String& sProxyBypass) {\n        WINHTTP_PROXY_INFO proxyInfo{};\n        if (!WinHttpGetProxyForUrl(m_h, lpcwszUrl, &AutoProxyOptions,\n                                   &proxyInfo))\n            return ATL::AtlHresultFromLastError();\n\n        // Update the output parameters\n        dwAccessType = proxyInfo.dwAccessType;\n#pragma warning(suppress : 6387)\n        sProxy = proxyInfo.lpszProxy;\n#pragma warning(suppress : 6387)\n        sProxyBypass = proxyInfo.lpszProxyBypass;\n\n        // Free up the allocated memory\n        if (proxyInfo.lpszProxy != nullptr)\n            GlobalFree(proxyInfo.lpszProxy);\n        if (proxyInfo.lpszProxyBypass != nullptr)\n            GlobalFree(proxyInfo.lpszProxyBypass);\n\n        return S_OK;\n    }\n\n    HRESULT SetTimeouts(_In_ int dwResolveTimeout,\n                        _In_ int dwConnectTimeout,\n                        _In_ int dwSendTimeout,\n                        _In_ int dwReceiveTimeout) noexcept {\n        if (!WinHttpSetTimeouts(m_h, dwResolveTimeout, dwConnectTimeout,\n                                dwSendTimeout, dwReceiveTimeout))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    __if_exists(WinHttpCreateProxyResolver) {\n        HRESULT CreateProxyResolver(_Inout_ CResolver & resolver) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(resolver.operator HANDLE() == nullptr);\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(\n                WinHttpCreateProxyResolver(m_h, &resolver.m_h));\n        }\n    }\n\n    __if_exists(WinHttpResetAutoProxy) {\n        HRESULT ResetAutoProxy(_In_ DWORD dwFlags) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(\n                WinHttpResetAutoProxy(m_h, dwFlags));\n        }\n    }\n\n    __if_exists(WinHttpWriteProxySettings) {\n        HRESULT WriteProxySettings(\n            _In_ BOOL fForceUpdate,\n            _In_ WINHTTP_PROXY_SETTINGS * pWinHttpProxySettings) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(WinHttpWriteProxySettings(\n                m_h, fForceUpdate, pWinHttpProxySettings));\n        }\n    }\n\n    __if_exists(WinHttpReadProxySettings) {\n        HRESULT ReadProxySettings(\n            _In_opt_ PCWSTR pcwszConnectionName,\n            _In_ BOOL fFallBackToDefaultSettings,\n            _In_ BOOL fSetAutoDiscoverForDefaultSettings,\n            _Out_ DWORD * pdwSettingsVersion,\n            _Out_ BOOL * pfDefaultSettingsAreReturned,\n            _Out_ WINHTTP_PROXY_SETTINGS * pWinHttpProxySettings) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(WinHttpReadProxySettings(\n                m_h, pcwszConnectionName, fFallBackToDefaultSettings,\n                fSetAutoDiscoverForDefaultSettings, pdwSettingsVersion,\n                pfDefaultSettingsAreReturned, pWinHttpProxySettings));\n        }\n    }\n\n    __if_exists(WinHttpGetProxySettingsVersion) {\n        HRESULT GetProxySettingsVersion(_Out_ DWORD *\n                                        pdwProxySettingsVersion) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(\n                WinHttpGetProxySettingsVersion(m_h, pdwProxySettingsVersion));\n        }\n    }\n};\n\n// Wrapper for a WinHTTP connection HINTERNET handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CConnection : public CHandle {\n   public:\n    // Constructors / Destructors\n    CConnection() = default;\n    CConnection(_In_ const CConnection&) = delete;\n    CConnection(_In_ CConnection&& connection) noexcept\n        : CHandle{std::move(connection)} {}\n    explicit CConnection(_In_ HINTERNET h) noexcept : CHandle{h} {}\n    ~CConnection() = default;  // NOLINT(modernize-use-override)\n\n    // Methods\n    CConnection& operator=(_In_ const CConnection&) = delete;\n\n#pragma warning(suppress : 26456)\n    CConnection& operator=(_In_ CConnection&& connection) noexcept {\n        __super::operator=(std::move(connection));\n        return *this;\n    }\n\n    HRESULT Initialize(\n        _In_ const CSession& session,\n        _In_z_ LPCWSTR pwszServerName,\n        _In_ INTERNET_PORT nServerPort = INTERNET_DEFAULT_PORT) noexcept {\n        HINTERNET hConnection{\n            WinHttpConnect(session, pwszServerName, nServerPort, 0)};\n        if (hConnection == nullptr)\n            return ATL::AtlHresultFromLastError();\n        Attach(hConnection);\n\n        return S_OK;\n    }\n\n    __if_exists(WinHttpQueryConnectionGroup) {\n        HRESULT QueryConnectionGroup(\n            _In_opt_ const GUID* pGuidConnection, _In_ ULONGLONG ullFlags,\n            _Inout_ PWINHTTP_QUERY_CONNECTION_GROUP_RESULT* ppResult) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(WinHttpQueryConnectionGroup(\n                m_h, pGuidConnection, ullFlags, ppResult));\n        }\n    }\n};\n\n// Wrapper for a WinHTTP request HINTERNET handle\nclass CWINHTTPWRAPPERS_EXT_CLASS CRequest : public CHandle {\n   public:\n    // Constructors / Destructors\n    CRequest() = default;\n    CRequest(_In_ const CRequest&) = delete;\n    CRequest(_In_ CRequest&& request) noexcept : CHandle{std::move(request)} {}\n    explicit CRequest(_In_ HINTERNET h) noexcept : CHandle{h} {}\n    ~CRequest() = default;  // NOLINT(modernize-use-override)\n\n    // Methods\n    CRequest& operator=(_In_ const CRequest&) = delete;\n\n#pragma warning(suppress : 26456)\n    CRequest& operator=(_In_ CRequest&& request) noexcept {\n        __super::operator=(std::move(request));\n        return *this;\n    }\n\n    HRESULT Initialize(\n        _In_ const CConnection& connection,\n        _In_z_ LPCWSTR pwszObjectName,\n        _In_opt_z_ LPCWSTR pwszVerb = nullptr,\n        _In_opt_z_ LPCWSTR pwszVersion = nullptr,\n        _In_opt_z_ LPCWSTR pwszReferrer = WINHTTP_NO_REFERER,\n        _In_opt_ LPCWSTR* ppwszAcceptTypes = WINHTTP_DEFAULT_ACCEPT_TYPES,\n        _In_ DWORD dwFlags = 0) noexcept {\n        HINTERNET hRequest{WinHttpOpenRequest(\n            connection, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer,\n            ppwszAcceptTypes, dwFlags)};\n        if (hRequest == nullptr)\n            return ATL::AtlHresultFromLastError();\n        Attach(hRequest);\n\n        return S_OK;\n    }\n\n    HRESULT AddHeaders(\n#ifdef _When_\n        _When_(dwHeadersLength == (DWORD)-1, _In_z_)\n            _When_(dwHeadersLength != (DWORD)-1, _In_reads_(dwHeadersLength))\n                LPCWSTR pwszHeaders,\n#else\n        _In_ LPCWSTR pwszHeaders,\n#endif\n        _In_ DWORD dwHeadersLength,\n        _In_ DWORD dwModifiers) noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSUME(m_h != nullptr);\n\n        if (!WinHttpAddRequestHeaders(m_h, pwszHeaders, dwHeadersLength,\n                                      dwModifiers))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    __if_exists(WinHttpAddRequestHeadersEx) {\n        DWORD AddRequestHeaders(\n            _In_ DWORD dwModifiers, _In_ ULONGLONG ullFlags,\n            _In_ ULONGLONG ullExtra, _In_ DWORD cHeaders,\n            _In_reads_(cHeaders) WINHTTP_EXTENDED_HEADER * pHeaders) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSUME(m_h != nullptr);\n\n            return WinHttpAddRequestHeadersEx(m_h, dwModifiers, ullFlags,\n                                              ullExtra, cHeaders, pHeaders);\n        }\n    }\n\n    HRESULT QueryAuthSchemes(_Out_ DWORD& dwSupportedSchemes,\n                             _Out_ DWORD& dwFirstScheme,\n                             _Out_ DWORD& dwAuthTarget) noexcept {\n        if (!WinHttpQueryAuthSchemes(m_h, &dwSupportedSchemes, &dwFirstScheme,\n                                     &dwAuthTarget))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT QueryDataAvailable(__out_data_source(NETWORK)\n                                   DWORD* lpdwNumberOfBytesAvailable) noexcept {\n        if (!WinHttpQueryDataAvailable(m_h, lpdwNumberOfBytesAvailable))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT QueryHeaders(IN DWORD dwInfoLevel,\n                         IN LPCWSTR pwszName OPTIONAL,\n                         _Out_writes_bytes_to_opt_(dwBufferLength,\n                                                   dwBufferLength)\n                             __out_data_source(NETWORK) LPVOID lpBuffer,\n                         IN OUT DWORD& dwBufferLength,\n                         IN OUT DWORD* lpdwIndex OPTIONAL) noexcept {\n        if (!WinHttpQueryHeaders(m_h, dwInfoLevel, pwszName, lpBuffer,\n                                 &dwBufferLength, lpdwIndex))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    __if_exists(WinHttpQueryHeadersEx) {\n#pragma warning(suppress : 26476)\n        HRESULT QueryHeadersEx(\n            _In_ DWORD dwInfoLevel, _In_ ULONGLONG ullFlags,\n            _In_ UINT uiCodePage, _Inout_opt_ PDWORD pdwIndex,\n            _In_opt_ PWINHTTP_HEADER_NAME pHeaderName,\n            _Out_writes_bytes_to_opt_(*pdwBufferLength, *pdwBufferLength)\n                PVOID pBuffer,\n            _Inout_ PDWORD pdwBufferLength,\n            _Out_writes_opt_(*pdwHeadersCount) PWINHTTP_EXTENDED_HEADER *\n                ppHeaders,\n            _Out_ PDWORD pdwHeadersCount) noexcept {\n#pragma warning(suppress : 6001)\n            if (!WinHttpQueryHeadersEx(m_h, dwInfoLevel, ullFlags, uiCodePage,\n                                       pdwIndex, pHeaderName, pBuffer,\n                                       pdwBufferLength, ppHeaders,\n                                       pdwHeadersCount))\n                return ATL::AtlHresultFromLastError();\n\n            return S_OK;\n        }\n    }\n\n    HRESULT ReadData(_Out_writes_bytes_to_(dwNumberOfBytesToRead,\n                                           *lpdwNumberOfBytesRead)\n                         __out_data_source(NETWORK) LPVOID lpBuffer,\n                     IN DWORD dwNumberOfBytesToRead,\n                     OUT DWORD* lpdwNumberOfBytesRead) noexcept {\n        if (!WinHttpReadData(m_h, lpBuffer, dwNumberOfBytesToRead,\n                             lpdwNumberOfBytesRead))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    __if_exists(WinHttpReadDataEx) {\n        HRESULT ReadDataEx(\n            _Out_writes_bytes_to_(dwNumberOfBytesToRead, *lpdwNumberOfBytesRead)\n                __out_data_source(NETWORK) LPVOID lpBuffer,\n            IN DWORD dwNumberOfBytesToRead, OUT DWORD * lpdwNumberOfBytesRead,\n            IN ULONGLONG ullFlags, IN DWORD cbProperty,\n            _In_reads_bytes_opt_(cbProperty) PVOID pvProperty) noexcept {\n            if (!WinHttpReadDataEx(m_h, lpBuffer, dwNumberOfBytesToRead,\n                                   lpdwNumberOfBytesRead, ullFlags, cbProperty,\n                                   pvProperty))\n                return ATL::AtlHresultFromLastError();\n\n            return S_OK;\n        }\n    }\n\n    HRESULT ReceiveResponse() noexcept {\n        if (!WinHttpReceiveResponse(m_h, nullptr))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT SendRequest(_In_reads_opt_(dwHeadersLength)\n                            LPCWSTR pwszHeaders = WINHTTP_NO_ADDITIONAL_HEADERS,\n                        _In_ DWORD dwHeadersLength = 0,\n                        _In_reads_bytes_opt_(dwOptionalLength)\n                            LPVOID lpOptional = WINHTTP_NO_REQUEST_DATA,\n                        _In_ DWORD dwOptionalLength = 0,\n                        _In_ DWORD dwTotalLength = 0,\n                        _In_ DWORD_PTR dwContext = 0) noexcept {\n        if (!WinHttpSendRequest(m_h, pwszHeaders, dwHeadersLength, lpOptional,\n                                dwOptionalLength, dwTotalLength, dwContext))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT SetCredentials(_In_ DWORD AuthTargets,\n                           _In_ DWORD AuthScheme,\n                           _In_ LPCWSTR pwszUserName,\n                           _In_ LPCWSTR pwszPassword) noexcept {\n        if (!WinHttpSetCredentials(m_h, AuthTargets, AuthScheme, pwszUserName,\n                                   pwszPassword, nullptr))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT SetTimeouts(_In_ int dwResolveTimeout,\n                        _In_ int dwConnectTimeout,\n                        _In_ int dwSendTimeout,\n                        _In_ int dwReceiveTimeout) noexcept {\n        if (!WinHttpSetTimeouts(m_h, dwResolveTimeout, dwConnectTimeout,\n                                dwSendTimeout, dwReceiveTimeout))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n    HRESULT WriteData(_In_reads_bytes_opt_(dwNumberOfBytesToWrite)\n                          LPCVOID lpBuffer,\n                      _In_ DWORD dwNumberOfBytesToWrite,\n                      _Out_opt_ DWORD* lpdwNumberOfBytesWritten) noexcept {\n        if (!WinHttpWriteData(m_h, lpBuffer, dwNumberOfBytesToWrite,\n                              lpdwNumberOfBytesWritten))\n            return ATL::AtlHresultFromLastError();\n\n        return S_OK;\n    }\n\n#pragma warning(suppress : 6553)\n    [[nodiscard]] CWebSocket WebSocketCompleteUpgrade(\n        _In_opt_ DWORD_PTR pContext) const noexcept {\n        // Validate our parameters\n#pragma warning(suppress : 26477)\n        ATLASSUME(m_h != nullptr);\n\n        return CWebSocket{WinHttpWebSocketCompleteUpgrade(m_h, pContext)};\n    }\n\n    __if_exists(WinHttpQueryConnectionGroup) {\n        HRESULT QueryConnectionGroup(\n            _In_opt_ const GUID* pGuidConnection, _In_ ULONGLONG ullFlags,\n            _Inout_ PWINHTTP_QUERY_CONNECTION_GROUP_RESULT* ppResult) noexcept {\n            // Validate our parameters\n#pragma warning(suppress : 26477)\n            ATLASSERT(m_h != nullptr);\n\n            return ATL::AtlHresultFromWin32(WinHttpQueryConnectionGroup(\n                m_h, pGuidConnection, ullFlags, ppResult));\n        }\n    }\n};\n\n// Wrapper for a simple WinHttp async download\nclass CWINHTTPWRAPPERS_EXT_CLASS CAsyncDownloader : public CRequest {\n   public:\n    // Constructors / Destructors\n    CAsyncDownloader() noexcept\n        : m_dwProxyPreauthenticationScheme{WINHTTP_AUTH_SCHEME_NEGOTIATE},\n          m_dwHTTPPreauthenticationScheme{WINHTTP_AUTH_SCHEME_NEGOTIATE},\n          m_bProxyPreauthentication{true},\n          m_bHTTPPreauthentication{true},\n          m_nDownloadStartPos{0},\n          m_bNoURLRedirect{false},\n          m_lpRequest{nullptr},\n          m_dwRequestSize{0},\n          m_dbLimit{0},\n          m_nFileToUploadSize{0},\n          m_nFileToUploadIndex{0},\n          m_pOptionalBuffer{nullptr},\n          m_dwOptionalBufferLength{0},\n          m_dwProxyAuthScheme{0},\n          m_nTotalBytesRead{0},\n          m_dwStartTicksDownload{0},\n          m_bUsingObjectStatusCallback{false} {}\n    CAsyncDownloader(const CAsyncDownloader&) = delete;\n    CAsyncDownloader(CAsyncDownloader&&) = delete;\n\n    ~CAsyncDownloader()  // NOLINT(modernize-use-override)\n    {\n        if (m_bUsingObjectStatusCallback) {\n            SetStatusCallback(nullptr, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS);\n            m_bUsingObjectStatusCallback = false;\n        }\n    }\n\n    // Methods\n    CAsyncDownloader& operator=(const CAsyncDownloader&) = delete;\n    CAsyncDownloader& operator=(CAsyncDownloader&&) = delete;\n\n#pragma warning(suppress : 26434 26477 26487)\n    HRESULT Initialize(\n        _In_ const CConnection& connection,\n        _In_z_ LPCWSTR pwszObjectName,\n        _In_opt_z_ LPCWSTR pwszVerb = nullptr,\n        _In_opt_z_ LPCWSTR pwszVersion = nullptr,\n        _In_opt_z_ LPCWSTR pwszReferrer = WINHTTP_NO_REFERER,\n        _In_opt_ LPCWSTR* ppwszAcceptTypes = WINHTTP_DEFAULT_ACCEPT_TYPES,\n        _In_ DWORD dwFlags = 0,\n        _In_ DWORD dwBufferLength = 8096,\n        _In_ DWORD dwShareMode = 0) {\n        // Initialize the critical section\n        HRESULT hr{m_cs.Init()};\n        if (FAILED(hr))\n            return hr;\n\n        // Let the base class do its thing\n        hr = __super::Initialize(connection, pwszObjectName, pwszVerb,\n                                 pwszVersion, pwszReferrer, ppwszAcceptTypes,\n                                 dwFlags);\n        if (FAILED(hr))\n            return hr;\n\n        // Disable redirects if required\n        if (m_bNoURLRedirect) {\n            DWORD dwOptionValue{WINHTTP_DISABLE_REDIRECTS};\n            hr = SetOption(WINHTTP_DISABLE_REDIRECTS, &dwOptionValue,\n                           sizeof(dwOptionValue));\n            if (FAILED(hr))\n                return hr;\n        }\n\n        // Hook up the callback function\n        if (SetStatusCallback() == WINHTTP_INVALID_STATUS_CALLBACK)\n            return ATL::AtlHresultFromLastError();\n\n        // Release our resources if currently in use\n        ReleaseResources();\n\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        m_bUsingObjectStatusCallback = true;\n\n        // Allocate the receive buffer\n        m_ReadBuffer.resize(dwBufferLength);\n\n        // Open up the file for downloading if necessary\n        if (m_sFileToDownloadInto.length()) {\n#ifdef _UNICODE\n            hr = m_fileToDownloadInto.Create(m_sFileToDownloadInto.c_str(),\n                                             GENERIC_WRITE, dwShareMode,\n                                             OPEN_ALWAYS);\n#else\n            hr = m_fileToDownloadInto.Create(\n                ATL::CW2T(m_sFileToDownloadInto.c_str()), GENERIC_WRITE,\n                dwShareMode, OPEN_ALWAYS);\n#endif  // #ifdef _UNICODE\n            if (FAILED(hr))\n                return hr;\n\n            // Seek to the start position of the download\n            hr = m_fileToDownloadInto.Seek(m_nDownloadStartPos, FILE_BEGIN);\n            if (FAILED(hr))\n                return hr;\n            hr = m_fileToDownloadInto.SetSize(m_nDownloadStartPos);\n            if (FAILED(hr))\n                return hr;\n        }\n\n        // Also open up the file to upload if necessary\n        if (m_sFileToUpload.length()) {\n            // Allocate the send buffer\n            m_WriteBuffer.resize(dwBufferLength);\n\n            // Open up the file for downloading into\n#ifdef _UNICODE\n            hr = m_fileToUpload.Create(m_sFileToUpload.c_str(), GENERIC_READ,\n                                       dwShareMode, OPEN_EXISTING);\n#else\n            hr =\n                m_fileToUpload.Create(ATL::CW2T(m_sFileToUpload.c_str()),\n                                      GENERIC_READ, dwShareMode, OPEN_EXISTING);\n#endif  // #ifdef _UNICODE\n            if (FAILED(hr))\n                return hr;\n\n            // Remember the size of the file to upload\n            hr = m_fileToUpload.GetSize(m_nFileToUploadSize);\n            if (FAILED(hr))\n                return hr;\n        }\n\n        return S_OK;\n    }\n\n    void ReleaseResources() {\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Ensure the files are closed and the various buffers are deleted\n        m_fileToDownloadInto.Close();\n        m_ReadBuffer.clear();\n        m_fileToUpload.Close();\n        m_WriteBuffer.clear();\n        m_nFileToUploadSize = 0;\n        m_nFileToUploadIndex = 0;\n        m_pOptionalBuffer = nullptr;\n        m_dwOptionalBufferLength = 0;\n        m_lpRequest = nullptr;\n        m_dwRequestSize = 0;\n    }\n\n#pragma warning(suppress : 26165)\n    HRESULT DeleteDownloadedFile() {\n        // What will be the return value from this method (assume the best)\n        HRESULT hr{S_OK};\n\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Delete the partially downloaded file if unsuccessful\n#ifdef _UNICODE\n        if (m_sFileToDownloadInto.length() &&\n            !DeleteFile(m_sFileToDownloadInto.c_str()))\n#else\n        if (m_sFileToDownloadInto.length() &&\n            !DeleteFile(ATL::CW2T(m_sFileToDownloadInto.c_str())))\n#endif  // #ifdef _UNICODE\n            hr = ATL::AtlHresultFromLastError();\n\n        return hr;\n    }\n\n    [[nodiscard]] ULONGLONG TimeSinceStartDownload() const noexcept {\n        return GetTickCount64() - m_dwStartTicksDownload;\n    }\n\n    [[nodiscard]] virtual String GetHeaders() {\n        // What will be the return value from this method\n        String sHeaders;\n\n        // Create the Range header here if required\n        if (m_nDownloadStartPos != 0)  // we will build the range request\n        {\n            ATL::CAtlStringW sHeader;\n            sHeader.Format(L\"Range: bytes=%I64u-\\r\\n\", m_nDownloadStartPos);\n            sHeaders += sHeader;\n        }\n\n        // Update the content length if we have a file to upload\n        if (m_fileToUpload.operator HANDLE()) {\n            ATL::CAtlStringW sHeader;\n            sHeader.Format(L\"Content-Length: %I64u\\r\\n\", m_nFileToUploadSize);\n            sHeaders += sHeader;\n        }\n\n        return sHeaders;\n    }\n\n    [[nodiscard]] virtual DWORD GetContentLength() noexcept {\n        if (m_fileToUpload.operator HANDLE()) {\n            if (m_nFileToUploadSize > UINT_MAX)\n                return WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH;\n            else {\n#pragma warning(suppress : 26472)\n                return static_cast<DWORD>(m_nFileToUploadSize);\n            }\n        } else\n            return m_dwRequestSize;\n    }\n\n    [[nodiscard]] DWORD GetLastStatusCode(_Out_ bool& bValid) noexcept {\n        bValid = m_dwStatusCode.has_value();\n        if (bValid)\n            return m_dwStatusCode.value();\n        else\n            return 0;\n    }\n\n#pragma warning(suppress : 26434 26440)\n    HRESULT SendRequest(_In_reads_bytes_opt_(dwOptionalLength)\n                            LPVOID lpOptional,\n                        _In_ DWORD dwOptionalLength,\n                        _In_ const String& sHeaders) {\n        // Remember the parameters passed in case we need to resend the request\n        m_dwOptionalBufferLength = dwOptionalLength;\n        m_pOptionalBuffer = lpOptional;\n\n        // Do preauthentication if required\n        m_dwProxyAuthScheme = 0;\n        if (m_bProxyPreauthentication) {\n            const HRESULT hr{DoAuthentication(m_dwProxyPreauthenticationScheme,\n                                              0, WINHTTP_AUTH_TARGET_PROXY)};\n            if (FAILED(hr))\n                return hr;\n        }\n        if (m_bHTTPPreauthentication) {\n            const HRESULT hr{DoAuthentication(m_dwHTTPPreauthenticationScheme,\n                                              0, WINHTTP_AUTH_TARGET_SERVER)};\n            if (FAILED(hr))\n                return hr;\n        }\n\n        // Reset the total bytes read in the response\n        m_nTotalBytesRead = 0;\n\n        // Reset the response buffer\n        m_Response.clear();\n\n        // Remember the time we started the download at\n        m_dwStartTicksDownload = GetTickCount64();\n\n        // Reset the last status code\n        m_dwStatusCode.reset();\n\n        // Reset the content length header\n        m_nContentLength.reset();\n\n#pragma warning(suppress : 26472)\n        const auto dwHeadersLength{static_cast<DWORD>(sHeaders.length())};\n#pragma warning(suppress : 26477 26490)\n        return __super::SendRequest(\n            dwHeadersLength ? sHeaders.c_str() : WINHTTP_NO_ADDITIONAL_HEADERS,\n            dwHeadersLength, lpOptional, dwOptionalLength, dwOptionalLength,\n            reinterpret_cast<DWORD_PTR>(this));\n    }\n\n#pragma warning(suppress : 26434 26477)\n    HRESULT SendRequest(_In_reads_bytes_opt_(dwOptionalLength)\n                            LPVOID lpOptional = WINHTTP_NO_REQUEST_DATA,\n                        _In_ DWORD dwOptionalLength = 0) {\n        // Delegate to the other version of this method\n        return SendRequest(lpOptional, dwOptionalLength, GetHeaders());\n    }\n\n    virtual HRESULT DoAuthentication(_In_ DWORD dwAuthenticationScheme,\n                                     _In_ DWORD /*dwFirstScheme*/,\n                                     _In_ DWORD dwAuthTarget) noexcept {\n        // What will be the return value from this method\n        HRESULT hr{S_FALSE};\n\n        switch (dwAuthTarget) {\n            case WINHTTP_AUTH_TARGET_SERVER: {\n                if (m_sHTTPUserName.length())\n                    hr = SetCredentials(dwAuthTarget, dwAuthenticationScheme,\n                                        m_sHTTPUserName.c_str(),\n                                        m_sHTTPPassword.c_str());\n                break;\n            }\n            case WINHTTP_AUTH_TARGET_PROXY: {\n                if (m_sProxyUserName.length())\n                    hr = SetCredentials(dwAuthTarget, dwAuthenticationScheme,\n                                        m_sProxyUserName.c_str(),\n                                        m_sProxyPassword.c_str());\n                break;\n            }\n            default: {\n                hr = E_UNEXPECTED;\n                break;\n            }\n        }\n\n        return hr;\n    }\n\n    [[nodiscard]] virtual DWORD ChooseAuthScheme(\n        _In_ DWORD dwSupportedSchemes,\n        _In_ DWORD /*dwFirstScheme*/,\n        _In_ DWORD /*dwAuthTarget*/) noexcept {\n        // This default implementation will allow any authentication scheme\n        // support and will pick in order of \"decreasing strength\"\n        if (dwSupportedSchemes & WINHTTP_AUTH_SCHEME_NEGOTIATE)\n            return WINHTTP_AUTH_SCHEME_NEGOTIATE;\n        else if (dwSupportedSchemes & WINHTTP_AUTH_SCHEME_NTLM)\n            return WINHTTP_AUTH_SCHEME_NTLM;\n        else if (dwSupportedSchemes & WINHTTP_AUTH_SCHEME_PASSPORT)\n            return WINHTTP_AUTH_SCHEME_PASSPORT;\n        else if (dwSupportedSchemes & WINHTTP_AUTH_SCHEME_DIGEST)\n            return WINHTTP_AUTH_SCHEME_DIGEST;\n        else if (dwSupportedSchemes & WINHTTP_AUTH_SCHEME_BASIC)\n            return WINHTTP_AUTH_SCHEME_BASIC;\n        else\n            return 0;\n    }\n\n    // Member variables\n    String m_sHTTPUserName;   // The username to use for HTTP authentication\n    String m_sHTTPPassword;   // the password to use for HTTP authentication\n    String m_sProxyUserName;  // The username to use for Proxy authentication\n    String m_sProxyPassword;  // The password to use for Proxy authentication\n    DWORD m_dwProxyPreauthenticationScheme;  // The authentication scheme to use\n                                             // for proxy preauthentication\n    DWORD m_dwHTTPPreauthenticationScheme;  // The authentication scheme to use\n                                            // for HTTP server preauthentication\n    bool m_bProxyPreauthentication;  // Should we supply credentials on the\n                                     // first request for the Proxy rather than\n                                     // starting out with anonymous credentials\n                                     // and only authenticating when challenged\n    bool m_bHTTPPreauthentication;  // Should we supply credentials on the first\n                                    // request for the HTTP Server rather than\n                                    // starting out with anonymous credentials\n                                    // and only authenticating when challenged\n    ULONGLONG m_nDownloadStartPos;  // Offset to resume the download at\n    bool m_bNoURLRedirect;          // Set to true if you want to disable URL\n                            // redirection following\n    String m_sFileToUpload;        // The path of the file to upload\n    String m_sFileToDownloadInto;  // The path of the file to download into\n    ByteArray m_Response;          // The in memory copy of the HTTP response\n    LPCVOID m_lpRequest;    // The in memory data to send in the HTTP request\n    DWORD m_dwRequestSize;  // The size in bytes of m_lpRequest\n    double m_dbLimit;  // For bandwidth throttling, The value in KB/Second to\n                       // limit the connection to\n    std::vector<BYTE> m_ReadBuffer;      // The buffer we will read into\n    ATL::CAtlFile m_fileToDownloadInto;  // The file we will download into\n    std::vector<BYTE> m_WriteBuffer;     // The buffer we will write from\n    ATL::CAtlFile m_fileToUpload;        // The file we will upload\n    ULONGLONG m_nFileToUploadSize;       // The size of the file to upload\n    ULONGLONG\n        m_nFileToUploadIndex;  // The current index of the file upload writing\n    ATL::CComCriticalSection\n        m_cs;  // Used to serialize access to our member variables\n    std::optional<LONGLONG>\n        m_nContentLength;      // The content length header value retrieved\n    LPVOID m_pOptionalBuffer;  // A pointer to the optional data\n    DWORD m_dwOptionalBufferLength;  // The size in bytes of \"m_pOptionalBuffer\"\n    DWORD m_dwProxyAuthScheme;       // The auth scheme used for the last proxy\n                                // authentication\n    ULONGLONG m_nTotalBytesRead;  // The total bytes read in the current\n                                  // response\n    ULONGLONG\n        m_dwStartTicksDownload;  // The Tick count when we started the download\n    bool m_bUsingObjectStatusCallback;  // true if SetStatusCallback has been\n                                        // called to setup CHandle::_Callback as\n                                        // the WinHTTP callback\n    std::optional<DWORD> m_dwStatusCode;  // The last status code retrieved\n\n   protected:\n    // Methods\n    HRESULT OnCallback(_In_ HINTERNET hInternet,\n                       _In_ DWORD dwInternetStatus,\n                       _In_opt_ LPVOID lpvStatusInformation,\n                       _In_ DWORD dwStatusInformationLength) override {\n        // What will be the return value from this function (S_FALSE means not\n        // handled in our callback)\n        HRESULT hr{S_FALSE};\n\n        switch (dwInternetStatus) {\n            case WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE:  // deliberate\n                                                          // fallthrough\n            case WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE: {\n                hr = OnWriteCallback(hInternet, dwInternetStatus,\n                                     lpvStatusInformation,\n                                     dwStatusInformationLength);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE: {\n                hr = OnHeadersAvailableCallback(hInternet, dwInternetStatus,\n                                                lpvStatusInformation,\n                                                dwStatusInformationLength);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: {\n                hr = OnReadCompleteCallback(hInternet, dwInternetStatus,\n                                            lpvStatusInformation,\n                                            dwStatusInformationLength);\n                break;\n            }\n            case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: {\n                hr = OnRequestErrorCallback(hInternet, dwInternetStatus,\n                                            lpvStatusInformation,\n                                            dwStatusInformationLength);\n                break;\n            }\n            default: {\n                break;\n            }\n        }\n\n        return hr;\n    }\n\n    virtual HRESULT OnReadCompleteCallback(_In_ HINTERNET hInternet,\n                                           _In_ DWORD dwInternetStatus,\n                                           _In_opt_ LPVOID lpvStatusInformation,\n                                           _In_ DWORD\n                                               dwStatusInformationLength) {\n        // What will be the return value from the function\n        HRESULT hr{E_UNEXPECTED};\n\n        if (dwStatusInformationLength > 0) {\n            // Serialize access to our member variables\n            ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n            // Call the virtual OnReadData method if we have received some\n            // response data\n            hr = OnReadData(m_ReadBuffer.data(), dwStatusInformationLength);\n            if (FAILED(hr))\n                return hr;\n\n                // Continue to read the HTTP response\n#pragma warning(suppress : 26472)\n            hr = ReadData(m_ReadBuffer.data(),\n                          static_cast<DWORD>(m_ReadBuffer.size()), nullptr);\n            if (FAILED(hr))\n                return hr;\n        } else {\n            // A dwStatusInformationLength of 0 indicates that the response is\n            // complete, call the OnResponseComplete method to indicate that the\n            // download is complete\n            hr = OnCallbackComplete(S_OK, hInternet, dwInternetStatus,\n                                    lpvStatusInformation,\n                                    dwStatusInformationLength);\n        }\n\n        return hr;\n    }\n\n    virtual HRESULT OnWriteCallback(_In_ HINTERNET hInternet,\n                                    _In_ DWORD dwInternetStatus,\n                                    _In_opt_ LPVOID lpvStatusInformation,\n                                    _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        // Call the virtual OnWriteData method to allow this class a chance to\n        // send additional request data\n        HRESULT hr{OnWriteData()};\n        if (FAILED(hr))\n            return hr;\n\n        // When the request was sent successfully, lets kick off reading the\n        // response\n        if (hr == S_FALSE)\n            hr = ReceiveResponse();\n\n        return hr;\n    }\n\n    virtual HRESULT On407Response() {\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Check what authentication schemes the server supports\n        DWORD dwSupportedSchemes{0};\n        DWORD dwFirstScheme{0};\n        DWORD dwAuthTarget{0};\n        HRESULT hr{\n            QueryAuthSchemes(dwSupportedSchemes, dwFirstScheme, dwAuthTarget)};\n        if (FAILED(hr))\n            return hr;\n\n        // Pick an authentication scheme\n        m_dwProxyAuthScheme =\n            ChooseAuthScheme(dwSupportedSchemes, dwFirstScheme, dwAuthTarget);\n        if (m_dwProxyAuthScheme == 0)\n            return ATL::AtlHresultFromWin32(ERROR_WINHTTP_LOGIN_FAILURE);\n\n        // Do the authentication\n        hr = DoAuthentication(m_dwProxyAuthScheme, dwFirstScheme, dwAuthTarget);\n        if (FAILED(hr))\n            return hr;\n\n        // Form the headers we are sending\n        String sHeaders{GetHeaders()};\n#pragma warning(suppress : 26472)\n        const auto dwHeadersLength{static_cast<DWORD>(sHeaders.length())};\n\n        // Call the base class using the this pointer as the context value\n#pragma warning(suppress : 26477 26490)\n        return __super::SendRequest(\n            dwHeadersLength ? sHeaders.c_str() : WINHTTP_NO_ADDITIONAL_HEADERS,\n            dwHeadersLength, m_pOptionalBuffer, m_dwOptionalBufferLength,\n            GetContentLength(), reinterpret_cast<DWORD_PTR>(this));\n    }\n\n    virtual HRESULT On401Response() {\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Check what authentication schemes the server supports\n        DWORD dwSupportedSchemes{0};\n        DWORD dwFirstScheme{0};\n        DWORD dwAuthTarget{0};\n        HRESULT hr{\n            QueryAuthSchemes(dwSupportedSchemes, dwFirstScheme, dwAuthTarget)};\n        if (FAILED(hr))\n            return hr;\n\n        // Pick an authentication scheme\n        const DWORD dwAuthenticationScheme{\n            ChooseAuthScheme(dwSupportedSchemes, dwFirstScheme, dwAuthTarget)};\n        if (dwAuthenticationScheme == 0)\n            return ATL::AtlHresultFromWin32(ERROR_WINHTTP_LOGIN_FAILURE);\n\n        // Do the authentication\n        hr = DoAuthentication(dwAuthenticationScheme, dwFirstScheme,\n                              dwAuthTarget);\n        if (FAILED(hr))\n            return hr;\n\n        // Resend the Proxy authentication details also if used before,\n        // otherwise we could end up in a 407-401-407-401 loop\n        if (m_dwProxyAuthScheme != 0) {\n            // Do the authentication\n            hr = DoAuthentication(m_dwProxyAuthScheme, 0,\n                                  WINHTTP_AUTH_TARGET_PROXY);\n            if (FAILED(hr))\n                return hr;\n        }\n\n        // Form the headers we are sending\n        String sHeaders{GetHeaders()};\n#pragma warning(suppress : 26472)\n        const auto dwHeadersLength{static_cast<DWORD>(sHeaders.length())};\n\n        // Call the base class using the this pointer as the context value\n#pragma warning(suppress : 26477 26490)\n        return __super::SendRequest(\n            dwHeadersLength ? sHeaders.c_str() : WINHTTP_NO_ADDITIONAL_HEADERS,\n            dwHeadersLength, m_pOptionalBuffer, m_dwOptionalBufferLength,\n            GetContentLength(), reinterpret_cast<DWORD_PTR>(this));\n    }\n\n    HRESULT QueryStatusCode(_Out_ DWORD& dwStatusCode) noexcept {\n        dwStatusCode = 0;\n        DWORD dwStatusCodeSize{sizeof(dwStatusCode)};\n#pragma warning(suppress : 26477)\n        return QueryHeaders(\n            WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,\n            WINHTTP_HEADER_NAME_BY_INDEX, &dwStatusCode, dwStatusCodeSize,\n            WINHTTP_NO_HEADER_INDEX);\n    }\n\n    HRESULT QueryContentLength(_Out_ LONGLONG& nContentLength) {\n        // First call to get the size of the buffer we need\n        ATL::CAtlStringW sContentLength;\n        DWORD dwBufferSize{32};\n#pragma warning(suppress : 26477)\n        const HRESULT hr{QueryHeaders(\n            WINHTTP_QUERY_CONTENT_LENGTH, WINHTTP_HEADER_NAME_BY_INDEX,\n            sContentLength.GetBufferSetLength(dwBufferSize), dwBufferSize,\n            WINHTTP_NO_HEADER_INDEX)};\n        sContentLength.ReleaseBuffer();\n        if (FAILED(hr))\n            return hr;\n\n        // Update the output parameter\n        nContentLength = _wtoi64(sContentLength);\n\n        return hr;\n    }\n\n    virtual HRESULT OnCheckStatusCode() {\n        // Check what status code we have got\n        const DWORD dwStatusCode = m_dwStatusCode.value();\n        if (dwStatusCode == HTTP_STATUS_PROXY_AUTH_REQ)\n            return On407Response();\n        else if (dwStatusCode == HTTP_STATUS_DENIED)\n            return On401Response();\n        else if ((dwStatusCode / 100) != 2)  // Any 2XX is Success\n            return ATL::AtlHresultFromWin32(ERROR_WINHTTP_INVALID_HEADER);\n        return S_OK;\n    }\n\n    virtual HRESULT OnHeadersAvailableCallback(\n        _In_ HINTERNET hInternet,\n        _In_ DWORD dwInternetStatus,\n        _In_opt_ LPVOID lpvStatusInformation,\n        _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Get the HTTP status code\n        DWORD dwStatusCode{0};\n        HRESULT hr{QueryStatusCode(dwStatusCode)};\n        if (FAILED(hr))\n            return hr;\n        m_dwStatusCode = dwStatusCode;\n        hr = OnCheckStatusCode();  // Delegate to the other virtual method to\n                                   // check the HTTP status code\n        if (FAILED(hr))\n            return hr;\n\n        // Cache the content length header also if we can\n        LONGLONG nContentLength{0};\n        hr = QueryContentLength(nContentLength);\n        if (SUCCEEDED(hr))\n            m_nContentLength = nContentLength;\n\n            // Lets begin reading the response\n#pragma warning(suppress : 26472)\n        return ReadData(m_ReadBuffer.data(),\n                        static_cast<DWORD>(m_ReadBuffer.size()), nullptr);\n    }\n\n    virtual HRESULT OnRequestErrorCallback(_In_ HINTERNET hInternet,\n                                           _In_ DWORD dwInternetStatus,\n                                           _In_opt_ LPVOID lpvStatusInformation,\n                                           _In_ DWORD\n                                               dwStatusInformationLength) {\n        // Pull out the WINHTTP_ASYNC_RESULT\n        const auto pResult{\n            static_cast<const WINHTTP_ASYNC_RESULT*>(lpvStatusInformation)};\n\n        if (pResult == nullptr) {\n#pragma warning(suppress : 26477)\n            ATLASSERT(FALSE);\n            return E_UNEXPECTED;\n        }\n\n        // Resend the request if required\n        if (pResult->dwError == ERROR_WINHTTP_RESEND_REQUEST) {\n            // Form the headers we are sending\n            String sHeaders{GetHeaders()};\n#pragma warning(suppress : 26472)\n            const auto dwHeadersLength{static_cast<DWORD>(sHeaders.length())};\n\n            // Serialize access to our member variables\n            ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n            // Call the base class using the this pointer as the context value\n#pragma warning(suppress : 26477 26490)\n            return __super::SendRequest(\n                dwHeadersLength ? sHeaders.c_str()\n                                : WINHTTP_NO_ADDITIONAL_HEADERS,\n                dwHeadersLength, m_pOptionalBuffer, m_dwOptionalBufferLength,\n                GetContentLength(), reinterpret_cast<DWORD_PTR>(this));\n        }\n\n        // Call the OnCallbackComplete method with the async HRESULT\n        return OnCallbackComplete(\n            ATL::AtlHresultFromWin32(pResult->dwError), hInternet,\n            dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);\n    }\n\n#pragma warning(suppress : 26165)\n    virtual HRESULT OnReadData(_In_reads_bytes_(dwBytesRead)\n                                   const void* lpvBuffer,\n                               _In_ DWORD dwBytesRead) {\n        // What will be the return value from this method (assume the best)\n        HRESULT hr{S_OK};\n\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // Increment the total number of bytes read\n        m_nTotalBytesRead += dwBytesRead;\n\n        // Write out the buffer to the download file if it is open\n        if (m_fileToDownloadInto.operator HANDLE())\n            hr = m_fileToDownloadInto.Write(lpvBuffer, dwBytesRead);\n        else {\n            // Otherwise build up the response in the in-memory response array\n\n            // Preallocate the response buffer if nothing has been read yet\n            const auto nResponseSize{m_Response.size()};\n            if (nResponseSize == 0) {\n                if (m_nContentLength.has_value())\n#pragma warning(suppress : 26472)\n                    m_Response.reserve(\n                        static_cast<std::vector<BYTE>::size_type>(\n                            m_nContentLength.value()));\n                else\n                    m_Response.reserve(m_ReadBuffer.size());\n            }\n\n            // Add the data read to the response array\n#pragma warning(suppress : 26444 26481)\n            m_Response.insert(\n                m_Response.end(), static_cast<const BYTE*>(lpvBuffer),\n                static_cast<const BYTE*>(lpvBuffer) + dwBytesRead);\n        }\n\n        // Call the method to handle bandwidth throttling\n        DoBandwidthThrottling();\n\n        return hr;\n    }\n\n    virtual void DoBandwidthThrottling() noexcept {\n        // Do the bandwidth throttling\n        if (m_dbLimit > 0) {\n            const auto fTimeSinceStartDownload{\n                static_cast<double>(TimeSinceStartDownload())};\n            if (fTimeSinceStartDownload) {\n                const double q{static_cast<double>(m_nTotalBytesRead) /\n                               fTimeSinceStartDownload};\n                if (q > m_dbLimit)\n#pragma warning(suppress : 26467)\n                    Sleep(static_cast<DWORD>(\n                        ((q * fTimeSinceStartDownload) / m_dbLimit) -\n                        fTimeSinceStartDownload));\n            }\n        }\n    }\n\n    virtual HRESULT OnWriteData() {\n        // Serialize access to our member variables\n        ATL::CCritSecLock sl{m_cs.m_sec, true};\n\n        // If we have a file to upload?\n        if (m_fileToUpload.operator HANDLE()) {\n            // Read in the next blob of data to write from the upload file\n            DWORD dwBytesRead{0};\n#pragma warning(suppress : 26472)\n            HRESULT hr{m_fileToUpload.Read(\n                m_WriteBuffer.data(), static_cast<DWORD>(m_WriteBuffer.size()),\n                dwBytesRead)};\n            if (FAILED(hr))\n                return hr;\n\n            // Write the data to the server\n            hr = WriteData(m_WriteBuffer.data(), dwBytesRead, nullptr);\n            if (FAILED(hr))\n                return hr;\n\n            // Update the current position\n            m_nFileToUploadIndex += dwBytesRead;\n\n            // Return S_FALSE to conclude the writing if we have reached the end\n            // of the file\n            return (m_nFileToUploadIndex >= m_nFileToUploadSize) ? S_FALSE\n                                                                 : S_OK;\n        } else {\n            // Upload the in-memory data if specified\n            if (m_dwRequestSize) {\n#pragma warning(suppress : 26477)\n                ATLASSERT(m_lpRequest !=\n                          nullptr);  // m_pbyRequest should be provided if\n                                     // m_dwRequestSize is non-zero\n                const HRESULT hr{\n                    WriteData(m_lpRequest, m_dwRequestSize, nullptr)};\n                if (FAILED(hr))\n                    return hr;\n            }\n\n            // There's nothing more to upload so return S_FALSE\n            return S_FALSE;\n        }\n    }\n\n#ifdef _DEBUG\n    static void TraceCallbackComplete(_In_ HRESULT hr,\n                                      _In_ HINTERNET hInternet,\n                                      _In_ DWORD dwInternetStatus,\n                                      _In_opt_ LPVOID lpvStatusInformation,\n                                      _In_ DWORD dwStatusInformationLength) {\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        if (hr == S_OK)\n            ATLTRACE(\n                _T(\"CAsyncWinHttpDownloader::TraceCallbackComplete, The file \")\n                _T(\"was successfully downloaded\\n\"));\n        else\n            ATLTRACE(\n                _T(\"CAsyncWinHttpDownloader::TraceCallbackComplete, The file \")\n                _T(\"was not downloaded correctly, Error:%08X\\n\"),\n                hr);\n    }\n#endif  // #ifdef _DEBUG\n\n#pragma warning(suppress : 26433)\n    HRESULT OnCallbackComplete(_In_ HRESULT hr,\n                               _In_ HINTERNET hInternet,\n                               _In_ DWORD dwInternetStatus,\n                               _In_opt_ LPVOID lpvStatusInformation,\n                               _In_ DWORD dwStatusInformationLength) override {\n        UNREFERENCED_PARAMETER(hInternet);\n        UNREFERENCED_PARAMETER(dwInternetStatus);\n        UNREFERENCED_PARAMETER(lpvStatusInformation);\n        UNREFERENCED_PARAMETER(dwStatusInformationLength);\n\n        // Delegate the cleanup to the helper method\n        ReleaseResources();\n\n        // Delete the file if it was partially downloaded\n        if (hr != S_OK)\n            DeleteDownloadedFile();\n\n        return S_OK;\n    }\n};\n\n// Wrapper for a simple WinHttp sync download\nclass CWINHTTPWRAPPERS_EXT_CLASS CSyncDownloader : public CAsyncDownloader {\n   public:\n    // Methods\n    virtual HRESULT SendRequestSync(_In_reads_bytes_opt_(dwOptionalLength)\n                                        LPVOID lpOptional,\n                                    _In_ DWORD dwOptionalLength,\n                                    _In_ const String& sHeaders) {\n        // Use the base class to send the request initially\n        HRESULT hr{\n            __super::SendRequest(lpOptional, dwOptionalLength, sHeaders)};\n        if (FAILED(hr)) {\n            ReleaseResources();\n            DeleteDownloadedFile();\n            return hr;\n        }\n\n        bool bDownloaded{false};\n        while (!bDownloaded) {\n            // Loop around calling the OnWriteData virtual method until it\n            // returns S_FALSE\n            do {\n                hr = OnWriteData();\n            } while (SUCCEEDED(hr) && (hr != S_FALSE));\n            if (FAILED(hr)) {\n                ReleaseResources();\n                DeleteDownloadedFile();\n                return hr;\n            }\n\n            // Wait for the status code and response headers to be received\n            hr = ReceiveResponse();\n            if (FAILED(hr)) {\n                ReleaseResources();\n                DeleteDownloadedFile();\n                return hr;\n            }\n\n            // Get the HTTP status code\n            DWORD dwStatusCode{0};\n            hr = QueryStatusCode(dwStatusCode);\n            if (FAILED(hr)) {\n                ReleaseResources();\n                DeleteDownloadedFile();\n                return hr;\n            }\n            m_dwStatusCode = dwStatusCode;\n\n            // Check what to do with the status code we have got\n            if (dwStatusCode == HTTP_STATUS_PROXY_AUTH_REQ) {\n                hr = On407Response();\n                if (FAILED(hr)) {\n                    ReleaseResources();\n                    DeleteDownloadedFile();\n                    return hr;\n                }\n                continue;\n            } else if (dwStatusCode == HTTP_STATUS_DENIED) {\n                hr = On401Response();\n                if (FAILED(hr)) {\n                    ReleaseResources();\n                    DeleteDownloadedFile();\n                    return hr;\n                }\n                continue;\n            } else {\n                hr = OnCheckStatusCode();\n                if (FAILED(hr)) {\n                    ReleaseResources();\n                    DeleteDownloadedFile();\n                    return hr;\n                }\n            }\n\n            // Cache the content length header if we can\n            LONGLONG nContentLength{0};\n            hr = QueryContentLength(nContentLength);\n            if (SUCCEEDED(hr))\n                m_nContentLength = nContentLength;\n\n            // Loop around reading the response\n            DWORD dwBytesRead{0};\n            do {\n#pragma warning(suppress : 26472)\n                hr = ReadData(m_ReadBuffer.data(),\n                              static_cast<DWORD>(m_ReadBuffer.size()),\n                              &dwBytesRead);\n                if (FAILED(hr)) {\n                    ReleaseResources();\n                    DeleteDownloadedFile();\n                    return hr;\n                }\n\n                if (dwBytesRead) {\n                    // Call the virtual OnReadData method\n                    hr = OnReadData(m_ReadBuffer.data(), dwBytesRead);\n                    if (FAILED(hr)) {\n                        ReleaseResources();\n                        DeleteDownloadedFile();\n                        return hr;\n                    }\n                }\n            } while (dwBytesRead);\n\n            bDownloaded = true;\n        }\n\n        ReleaseResources();\n        return S_OK;\n    }\n\n#pragma warning(suppress : 26477)\n    virtual HRESULT SendRequestSync(_In_reads_bytes_opt_(dwOptionalLength)\n                                        LPVOID lpOptional =\n                                            WINHTTP_NO_REQUEST_DATA,\n                                    _In_ DWORD dwOptionalLength = 0) {\n        // Delegate to the other version of this method\n        return SendRequestSync(lpOptional, dwOptionalLength, GetHeaders());\n    }\n};\n\n};  // namespace WinHTTPWrappers\n\n#endif  // #ifndef __WINHTTPWRAPPERS_H__\n"
  },
  {
    "path": "src/windhawk/app/logger.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"logger.h\"\n\n#include \"storage_manager.h\"\n\nnamespace {\n\nLogger::Verbosity GetVerbosityFromConfig() {\n    try {\n        auto settings =\n            StorageManager::GetInstance().GetAppConfig(L\"Settings\", false);\n        int verbosity = settings->GetInt(L\"LoggingVerbosity\").value_or(0);\n\n        switch (verbosity) {\n            case static_cast<int>(Logger::Verbosity::kOff):\n                return Logger::Verbosity::kOff;\n\n            case static_cast<int>(Logger::Verbosity::kOn):\n                return Logger::Verbosity::kOn;\n\n            case static_cast<int>(Logger::Verbosity::kVerbose):\n                return Logger::Verbosity::kVerbose;\n        }\n    } catch (const std::exception&) {\n        // Ignore and use default settings. We can't log it, anyway.\n    }\n\n    return Logger::kDefaultVerbosity;\n}\n\n}  // namespace\n\nLogger::Logger(Verbosity initialVerbosity) : LoggerBase(initialVerbosity) {}\n\n// static\nLogger& Logger::GetInstance() {\n    static Logger s(GetVerbosityFromConfig());\n    return s;\n}\n"
  },
  {
    "path": "src/windhawk/app/logger.h",
    "content": "#pragma once\n\n#include \"logger_base.h\"\n\nclass Logger : public LoggerBase {\n   public:\n    Logger(Verbosity initialVerbosity);\n\n    static Logger& GetInstance();\n};\n\n#define LOG_WITH_VERBOSITY(verbosity, message, ...)                  \\\n    do {                                                             \\\n        auto& inst = Logger::GetInstance();                          \\\n        if (inst.GetVerbosity() >= verbosity) {                      \\\n            inst.LogLine(L\"[WH] [%S]: \" message L\"\\n\", __FUNCTION__, \\\n                         __VA_ARGS__);                               \\\n        }                                                            \\\n    } while (0)\n\n#define LOG(message, ...) \\\n    LOG_WITH_VERBOSITY(Logger::Verbosity::kOn, message, __VA_ARGS__)\n#define VERBOSE(message, ...) \\\n    LOG_WITH_VERBOSITY(Logger::Verbosity::kVerbose, message, __VA_ARGS__)\n"
  },
  {
    "path": "src/windhawk/app/main_window.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"main_window.h\"\n\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"resource.h\"\n#include \"ui_control.h\"\n#include \"version.h\"\n\nnamespace {\n\nconstexpr auto kHandleNewProcessInterval = 1000;       // 1sec\nconstexpr auto kUpdateInitialDelay = 1000 * 10;        // 10sec\nconstexpr auto kUpdateInterval = 1000 * 60 * 60 * 24;  // 24h\nconstexpr auto kUpdateRetryTime = 1000 * 60 * 60;      // 1h\nconstexpr auto kModTasksDlgInitialDelay = 1000;        // 1sec\n\nULONGLONG GetTaskbarProcessCreationTime() {\n    HWND currentTaskbarWindow = FindWindow(L\"Shell_TrayWnd\", nullptr);\n    if (!currentTaskbarWindow) {\n        return 0;\n    }\n\n    DWORD currentTaskbarProcessId;\n    if (!GetWindowThreadProcessId(currentTaskbarWindow,\n                                  &currentTaskbarProcessId)) {\n        return 0;\n    }\n\n    wil::unique_process_handle currentTaskbarProcess(OpenProcess(\n        PROCESS_QUERY_LIMITED_INFORMATION, FALSE, currentTaskbarProcessId));\n    if (!currentTaskbarProcess) {\n        return 0;\n    }\n\n    FILETIME creationTime;\n    FILETIME exitTime;\n    FILETIME kernelTime;\n    FILETIME userTime;\n    if (!GetProcessTimes(currentTaskbarProcess.get(), &creationTime, &exitTime,\n                         &kernelTime, &userTime)) {\n        return 0;\n    }\n\n    return wil::filetime::to_int64(creationTime);\n}\n\n}  // namespace\n\nCMainWindow::CMainWindow(bool trayOnly, bool portable)\n    : m_trayOnly(trayOnly),\n      m_portable(portable),\n      m_taskbarCreatedMsg(RegisterWindowMessage(L\"TaskbarCreated\")) {}\n\nBOOL CMainWindow::PreTranslateMessage(MSG* pMsg) {\n    if (m_modTasksDlg && m_modTasksDlg->IsDialogMessage(pMsg)) {\n        return TRUE;\n    }\n\n    if (m_modStatusesDlg && m_modStatusesDlg->IsDialogMessage(pMsg)) {\n        return TRUE;\n    }\n\n    if (m_toolkitDlg && m_toolkitDlg->IsDialogMessage(pMsg)) {\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nBOOL CMainWindow::OnIdle() {\n    enum {\n        kServiceMutex,\n        kAppSettingsChanged,\n        kNewUpdatesFound,\n        kModTasksChanged,\n        kModStatusesChanged,\n        kExplorerCrashed,\n        kMaxHandles,\n    };\n\n    HANDLE handleArray[kMaxHandles];\n    int handleTypes[kMaxHandles];\n    DWORD handleCount = 0;\n\n    if (m_serviceMutex) {\n        handleArray[handleCount] = m_serviceMutex.get();\n        handleTypes[handleCount] = kServiceMutex;\n        handleCount++;\n    }\n\n    if (m_appSettingsChangedEvent) {\n        handleArray[handleCount] = m_appSettingsChangedEvent.get();\n        handleTypes[handleCount] = kAppSettingsChanged;\n        handleCount++;\n    }\n\n    if (m_newUpdatesFoundEvent) {\n        handleArray[handleCount] = m_newUpdatesFoundEvent.get();\n        handleTypes[handleCount] = kNewUpdatesFound;\n        handleCount++;\n    }\n\n    if (m_modTasksChangeNotification) {\n        handleArray[handleCount] = m_modTasksChangeNotification->GetHandle();\n        handleTypes[handleCount] = kModTasksChanged;\n        handleCount++;\n    }\n\n    if (m_modStatusesChangeNotification) {\n        handleArray[handleCount] = m_modStatusesChangeNotification->GetHandle();\n        handleTypes[handleCount] = kModStatusesChanged;\n        handleCount++;\n    }\n\n    if (m_explorerCrashMonitor) {\n        handleArray[handleCount] = m_explorerCrashMonitor->GetEventHandle();\n        handleTypes[handleCount] = kExplorerCrashed;\n        handleCount++;\n    }\n\n    if (handleCount > 0) {\n        DWORD nWaitResult =\n            MsgWaitForMultipleObjectsEx(handleCount, handleArray, INFINITE,\n                                        QS_ALLINPUT, MWMO_INPUTAVAILABLE);\n\n        if (nWaitResult >= WAIT_OBJECT_0 &&\n            nWaitResult < WAIT_OBJECT_0 + handleCount) {\n            switch (handleTypes[nWaitResult - WAIT_OBJECT_0]) {\n                case kServiceMutex:\n                    ::ReleaseMutex(m_serviceMutex.get());\n                    Exit();\n                    break;\n\n                case kAppSettingsChanged:\n                    LoadSettings();\n                    break;\n\n                case kNewUpdatesFound:\n                    if (!m_disableUpdateCheck) {\n                        NotifyAboutAvailableUpdates(\n                            UserProfile::GetUpdateStatus(), true);\n                    }\n                    break;\n\n                case kModTasksChanged:\n                    if (m_modTasksDlg) {\n                        m_modTasksDlg->DataChanged();\n\n                        try {\n                            m_modTasksChangeNotification->ContinueMonitoring();\n                        } catch (const std::exception& e) {\n                            LOG(L\"Tasks ContinueMonitoring failed: %S\",\n                                e.what());\n                            m_modTasksChangeNotification.reset();\n                        }\n                    } else {\n                        // In the common case, there's a short-lived event, such\n                        // as mod initialization, that is cleared right away.\n                        // Wait a bit before creating a dialog, and only create\n                        // it if events still exist.\n                        m_modTasksChangeNotification.reset();\n                        SetTimer(Timer::kModTasksDlgCreate,\n                                 kModTasksDlgInitialDelay);\n                    }\n                    break;\n\n                case kModStatusesChanged:\n                    if (m_modStatusesDlg) {\n                        m_modStatusesDlg->DataChanged();\n                    }\n\n                    try {\n                        m_modStatusesChangeNotification->ContinueMonitoring();\n                    } catch (const std::exception& e) {\n                        LOG(L\"Statuses ContinueMonitoring failed: %S\",\n                            e.what());\n                        m_modStatusesChangeNotification.reset();\n                    }\n                    break;\n\n                case kExplorerCrashed: {\n                    int explorerCrashCount = 0;\n                    try {\n                        explorerCrashCount =\n                            m_explorerCrashMonitor->GetAmountOfNewEvents();\n                    } catch (const std::exception& e) {\n                        LOG(L\"Explorer crash monitor failed: %S\", e.what());\n                        m_explorerCrashMonitor.reset();\n                        break;\n                    }\n\n                    if (explorerCrashCount > 0) {\n                        try {\n                            HandleExplorerCrash(explorerCrashCount);\n                        } catch (const std::exception& e) {\n                            LOG(L\"Explorer crash handling failed: %S\",\n                                e.what());\n                        }\n                    }\n                    break;\n                }\n            }\n        }\n    } else {\n        // Just wait for a message to avoid running an infinite loop.\n        MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, QS_ALLINPUT,\n                                    MWMO_INPUTAVAILABLE);\n    }\n\n    return FALSE;\n}\n\nint CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) {\n    // Register object for message filtering and idle updates.\n    CMessageLoop* pLoop = _Module.GetMessageLoop();\n    ATLASSERT(pLoop != nullptr);\n    pLoop->AddMessageFilter(this);\n    pLoop->AddIdleHandler(this);\n\n    try {\n        if (m_portable) {\n            InitForPortableVersion();\n        } else {\n            InitForNonPortableVersion();\n        }\n    } catch (const std::exception& e) {\n        ::MessageBoxA(nullptr, e.what(), \"Could not initialize Windhawk\",\n                      MB_ICONERROR);\n        return -1;\n    }\n\n    m_trayIcon.emplace(m_hWnd, UWM_TRAYICON, /*hidden=*/true);\n    m_trayIcon->Create();\n\n    LoadSettings();\n\n    try {\n        m_modTasksChangeNotification.emplace(L\"mod-task\");\n    } catch (const std::exception& e) {\n        LOG(L\"Tasks ChangeNotification failed: %S\", e.what());\n    }\n\n    if (!m_disableToolkitHotkey) {\n        m_toolkitHotkeyRegistered =\n            ::RegisterHotKey(m_hWnd, static_cast<int>(Hotkey::kToolkit),\n                             MOD_CONTROL | MOD_WIN | MOD_NOREPEAT, 'W');\n        if (!m_toolkitHotkeyRegistered) {\n            LOG(L\"RegisterHotKey failed: %u\", GetLastError());\n        }\n    }\n\n    if (!m_trayOnly) {\n        RunUI();\n    }\n\n    return 0;\n}\n\nvoid CMainWindow::OnDestroy() {\n    if (m_toolkitHotkeyRegistered) {\n        ::UnregisterHotKey(m_hWnd, static_cast<int>(Hotkey::kToolkit));\n        m_toolkitHotkeyRegistered = false;\n    }\n\n    if (m_trayIcon) {\n        m_trayIcon->Remove();\n    }\n\n    // Unregister message filtering and idle updates.\n    CMessageLoop* pLoop = _Module.GetMessageLoop();\n    ATLASSERT(pLoop != NULL);\n    pLoop->RemoveMessageFilter(this);\n    pLoop->RemoveIdleHandler(this);\n\n    PostQuitMessage(0);\n}\n\nvoid CMainWindow::OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey) {\n    switch (static_cast<Hotkey>(nHotKeyID)) {\n        case Hotkey::kToolkit:\n            SetForegroundWindow(GetLastActivePopup());\n            ShowToolkitDialog();\n            break;\n    }\n}\n\nvoid CMainWindow::OnTimer(UINT_PTR nIDEvent) {\n    switch (static_cast<Timer>(nIDEvent)) {\n        case Timer::kHandleNewProcesses:\n            if (m_engineControl) {\n                m_engineControl->HandleNewProcesses();\n            }\n\n            SetTimer(Timer::kHandleNewProcesses, kHandleNewProcessInterval);\n            break;\n\n        case Timer::kUpdateCheck:\n            KillTimer(Timer::kUpdateCheck);\n\n            try {\n                m_updateChecker = std::make_unique<UpdateChecker>(\n                    m_portable ? UpdateChecker::kFlagPortable : 0,\n                    [this] { PostMessage(UWM_UPDATE_CHECKED); });\n            } catch (const std::exception& e) {\n                LOG(L\"UpdateChecker failed: %S\", e.what());\n                SetTimer(Timer::kUpdateCheck, kUpdateRetryTime);\n            }\n            break;\n\n        case Timer::kModTasksDlgCreate:\n            KillTimer(Timer::kModTasksDlgCreate);\n\n            try {\n                m_modTasksChangeNotification.emplace(L\"mod-task\");\n\n                if (!CTaskManagerDlg::IsDataSourceEmpty(\n                        CTaskManagerDlg::DataSource::kModTask)) {\n                    m_modTasksDlg.emplace(CTaskManagerDlg::DialogOptions{\n                        .dataSource = CTaskManagerDlg::DataSource::kModTask,\n                        .autonomousMode = true,\n                        .autonomousModeShowDelay = m_modTasksDlgDelay,\n                        .sessionManagerProcessId = m_serviceInfo.processId,\n                        .sessionManagerProcessCreationTime =\n                            m_serviceInfo.processCreationTime,\n                        .runButtonCallback = [this](HWND hWnd) { RunUI(hWnd); },\n                        .finalMessageCallback =\n                            [this](HWND hWnd) { m_modTasksDlg.reset(); }});\n\n                    if (!m_modTasksDlg->Create(m_hWnd)) {\n                        m_modTasksDlg.reset();\n                    }\n                }\n            } catch (const std::exception& e) {\n                LOG(L\"%S\", e.what());\n            }\n            break;\n    }\n}\n\nBOOL CMainWindow::OnPowerBroadcast(DWORD dwPowerEvent, DWORD_PTR dwData) {\n    if (dwPowerEvent == PBT_APMRESUMEAUTOMATIC && m_checkForUpdates &&\n        !m_updateChecker) {\n        KillTimer(Timer::kUpdateCheck);\n\n        ULONGLONG lastUpdateCheck;\n        try {\n            auto settings =\n                StorageManager::GetInstance().GetAppConfig(L\"Settings\", false);\n            lastUpdateCheck = std::wcstoull(\n                settings->GetString(L\"LastUpdateCheck\").value_or(L\"0\").c_str(),\n                nullptr, 10);\n        } catch (const std::exception& e) {\n            LOG(L\"Getting LastUpdateCheck failed: %S\", e.what());\n            lastUpdateCheck = 0;\n        }\n\n        SetTimer(Timer::kUpdateCheck, GetNextUpdateDelay(lastUpdateCheck));\n    }\n\n    return FALSE;\n}\n\nLRESULT CMainWindow::OnPortableAppCommand(UINT uMsg,\n                                          WPARAM wParam,\n                                          LPARAM lParam) {\n    if (!m_portable) {\n        return 0;\n    }\n\n    switch ((PortableAppCommand)wParam) {\n        case PortableAppCommand::kRunUI:\n            RunUI();\n            break;\n\n        case PortableAppCommand::kExit:\n            Exit();\n            break;\n    }\n\n    return 0;\n}\n\nLRESULT CMainWindow::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam) {\n    enum class Action {\n        kNone,\n        kOpenUI,\n        kOpenUpdatePage,\n        kModTaskManager,\n        kToolkit,\n        kExit,\n    };\n\n    auto contextMenuFunc = [this]() {\n        CMenu menu;\n        if (!menu.CreatePopupMenu()) {\n            return Action::kNone;\n        }\n\n        menu.AppendMenu(MF_STRING, static_cast<UINT_PTR>(Action::kOpenUI),\n                        Functions::LoadStrFromRsrc(IDS_TRAY_OPEN));\n        menu.AppendMenu(MF_SEPARATOR);\n        menu.AppendMenu(MF_STRING,\n                        static_cast<UINT_PTR>(Action::kModTaskManager),\n                        Functions::LoadStrFromRsrc(IDS_TRAY_LOADED_MODS));\n        menu.AppendMenu(\n            MF_STRING, static_cast<UINT_PTR>(Action::kToolkit),\n            (std::wstring(Functions::LoadStrFromRsrc(IDS_TRAY_TOOLKIT)) +\n             (m_disableToolkitHotkey ? L\"\" : L\"\\tCtrl+Win+W\"))\n                .c_str());\n        menu.AppendMenu(MF_SEPARATOR);\n        menu.AppendMenu(MF_STRING, static_cast<UINT_PTR>(Action::kExit),\n                        Functions::LoadStrFromRsrc(IDS_TRAY_EXIT));\n\n        CPoint point;\n        GetCursorPos(&point);\n\n        BOOL result = menu.TrackPopupMenu(TPM_RIGHTBUTTON | TPM_RETURNCMD,\n                                          point.x, point.y, m_hWnd);\n\n        return static_cast<Action>(result);\n    };\n\n    Action action = Action::kNone;\n\n    switch (m_trayIcon->HandleMsg(wParam, lParam)) {\n        case AppTrayIcon::TrayAction::kDefault:\n            action = Action::kOpenUI;\n            break;\n\n        case AppTrayIcon::TrayAction::kBalloon:\n            if (m_lastUpdateStatus && m_lastUpdateStatus->appUpdateAvailable) {\n                action = Action::kOpenUpdatePage;\n            } else {\n                action = Action::kOpenUI;\n            }\n            break;\n\n        case AppTrayIcon::TrayAction::kContextMenu:\n            ::SetForegroundWindow(m_hWnd);\n            action = contextMenuFunc();\n            break;\n    }\n\n    switch (action) {\n        case Action::kOpenUI:\n            RunUI();\n            break;\n\n        case Action::kOpenUpdatePage:\n            OpenUpdatePage();\n            break;\n\n        case Action::kModTaskManager:\n            ShowLoadedModsDialog();\n            break;\n\n        case Action::kToolkit:\n            ShowToolkitDialog();\n            break;\n\n        case Action::kExit:\n            if (m_portable) {\n                Exit();\n            } else {\n                StopService();\n            }\n            break;\n    }\n\n    return 0;\n}\n\nLRESULT CMainWindow::OnUpdateChecked(UINT uMsg, WPARAM wParam, LPARAM lParam) {\n    UpdateChecker::Result result = m_updateChecker->HandleResponse();\n    m_updateChecker.reset();\n\n    if (m_exitWhenUpdateCheckDone) {\n        DestroyWindow();\n        return 0;\n    }\n\n    if (!m_checkForUpdates) {\n        return 0;\n    }\n\n    if (SUCCEEDED(result.hrError)) {\n        NotifyAboutAvailableUpdates(result.updateStatus);\n\n        SetLastUpdateTime();\n\n        SetTimer(Timer::kUpdateCheck, kUpdateInterval);\n    } else {\n        SetTimer(Timer::kUpdateCheck, kUpdateRetryTime);\n    }\n\n    return 0;\n}\n\nLRESULT CMainWindow::OnTaskbarCreated(UINT uMsg, WPARAM wParam, LPARAM lParam) {\n    // If the toolkit was never active, close it.\n    // if (m_toolkitDlg && !m_toolkitDlg->WasActive()) {\n    //     m_toolkitDlg->Close();\n    // }\n\n    // Reload icons since the DPI might have changed. From the documentation:\n    // \"On Windows 10, the taskbar also broadcasts this message when the DPI of\n    // the primary display changes.\"\n    m_trayIcon->UpdateIcons(m_hWnd);\n\n    m_trayIcon->Create();\n\n    // Necessary to apply the newly loaded icon in Windows 11 22H2.\n    m_trayIcon->Modify();\n\n    return 0;\n}\n\nUINT_PTR CMainWindow::SetTimer(Timer nIDEvent,\n                               UINT nElapse,\n                               TIMERPROC lpfnTimer) {\n    return CWindowImpl::SetTimer(static_cast<UINT_PTR>(nIDEvent), nElapse,\n                                 lpfnTimer);\n}\n\nBOOL CMainWindow::KillTimer(Timer nIDEvent) {\n    return CWindowImpl::KillTimer(static_cast<UINT_PTR>(nIDEvent));\n}\n\nvoid CMainWindow::InitForPortableVersion() {\n    auto settings =\n        StorageManager::GetInstance().GetAppConfig(L\"Settings\", false);\n\n    if (!settings->GetInt(L\"SafeMode\").value_or(0)) {\n        m_engineControl.emplace();\n        m_engineControl->HandleNewProcesses();\n    }\n\n    SetTimer(Timer::kHandleNewProcesses, kHandleNewProcessInterval);\n\n    m_appSettingsChangedEvent.reset(Functions::CreateEventForMediumIntegrity(\n        L\"WindhawkAppSettingsChangedEvent-daemon\"));\n\n    FILETIME creationTime;\n    FILETIME exitTime;\n    FILETIME kernelTime;\n    FILETIME userTime;\n    THROW_IF_WIN32_BOOL_FALSE(GetProcessTimes(\n        GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime));\n\n    // For the portable version, there's no service, set app info instead.\n    m_serviceInfo.version = VER_FILE_VERSION_LONG;\n    m_serviceInfo.processId = GetCurrentProcessId();\n    m_serviceInfo.processCreationTime = wil::filetime::to_int64(creationTime);\n\n    ::ChangeWindowMessageFilterEx(m_hWnd, UWM_PORTABLE_APP_COMMAND,\n                                  MSGFLT_ALLOW, nullptr);\n}\n\nvoid CMainWindow::InitForNonPortableVersion() {\n    m_serviceMutex.reset(\n        OpenMutex(SYNCHRONIZE, FALSE, ServiceCommon::kMutexName));\n    THROW_LAST_ERROR_IF(!m_serviceMutex);\n\n    DWORD sessionId;\n    THROW_IF_WIN32_BOOL_FALSE(\n        ProcessIdToSessionId(GetCurrentProcessId(), &sessionId));\n\n    std::wstring appSettingsChangedEventName =\n        L\"Global\\\\WindhawkAppSettingsChangedEvent-daemon-session=\" +\n        std::to_wstring(sessionId);\n\n    m_appSettingsChangedEvent.reset(Functions::CreateEventForMediumIntegrity(\n        appSettingsChangedEventName.c_str()));\n\n    std::wstring newUpdatesFoundEventName =\n        L\"Global\\\\WindhawkNewUpdatesFoundEvent-daemon-session=\" +\n        std::to_wstring(sessionId);\n\n    m_newUpdatesFoundEvent.reset(Functions::CreateEventForMediumIntegrity(\n        newUpdatesFoundEventName.c_str()));\n\n    wil::unique_handle fileMapping(OpenFileMapping(\n        FILE_MAP_READ, FALSE, ServiceCommon::kInfoFileMappingName));\n    THROW_LAST_ERROR_IF(!fileMapping);\n\n    wil::unique_mapview_ptr<ServiceCommon::ServiceInfo> fileMappingView(\n        reinterpret_cast<ServiceCommon::ServiceInfo*>(\n            MapViewOfFile(fileMapping.get(), FILE_MAP_READ, 0, 0,\n                          sizeof(ServiceCommon::ServiceInfo))));\n    THROW_LAST_ERROR_IF(!fileMappingView);\n\n    m_serviceInfo = *fileMappingView;\n\n    if (m_serviceInfo.version != VER_FILE_VERSION_LONG) {\n        LOG(L\"Version mismatch, service: %08X, app: %08X\",\n            m_serviceInfo.version, VER_FILE_VERSION_LONG);\n    }\n}\n\nvoid CMainWindow::LoadSettings() {\n    LANGID languageId;\n    bool hideTrayIcon;\n    bool disableUpdateCheck;\n    ULONGLONG lastUpdateCheck;\n    bool dontAutoShowToolkit;\n    bool disableToolkitHotkey;\n    int modTasksDlgDelay;\n\n    try {\n        auto settings =\n            StorageManager::GetInstance().GetAppConfig(L\"Settings\", false);\n\n        languageId = LANGIDFROMLCID(LocaleNameToLCID(\n            settings->GetString(L\"Language\").value_or(L\"en\").c_str(), 0));\n        hideTrayIcon = settings->GetInt(L\"HideTrayIcon\").value_or(0);\n        disableUpdateCheck =\n            settings->GetInt(L\"DisableUpdateCheck\").value_or(0);\n\n        if (m_portable) {\n            lastUpdateCheck = std::wcstoull(\n                settings->GetString(L\"LastUpdateCheck\").value_or(L\"0\").c_str(),\n                nullptr, 10);\n        } else {\n            // For the non-portable version, update checking is done by another\n            // process, and we're notified via an event.\n            lastUpdateCheck = 0;\n        }\n\n        dontAutoShowToolkit =\n            settings->GetInt(L\"DontAutoShowToolkit\").value_or(0);\n\n        disableToolkitHotkey =\n            settings->GetInt(L\"DisableToolkitHotkey\").value_or(0);\n\n        modTasksDlgDelay =\n            settings->GetInt(L\"ModTasksDialogDelay\")\n                .value_or(CTaskManagerDlg::kAutonomousModeShowDelayDefault);\n    } catch (const std::exception& e) {\n        ::MessageBoxA(nullptr, e.what(), \"Could not load settings\",\n                      MB_ICONERROR);\n        return;\n    }\n\n    if (languageId != m_languageId) {\n        ::SetThreadUILanguage(\n            languageId ? languageId\n                       : MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));\n\n        bool languageRightToLeft = Functions::IsRightToLeftLanguage(languageId);\n        ModifyStyleEx(languageRightToLeft ? 0 : WS_EX_LAYOUTRTL,\n                      languageRightToLeft ? WS_EX_LAYOUTRTL : 0);\n\n        if (m_modTasksDlg) {\n            m_modTasksDlg->LoadLanguageStrings();\n        }\n\n        if (m_modStatusesDlg) {\n            m_modStatusesDlg->LoadLanguageStrings();\n        }\n\n        if (m_toolkitDlg) {\n            m_toolkitDlg->LoadLanguageStrings();\n        }\n\n        m_languageId = languageId;\n    }\n\n    if (hideTrayIcon != m_hideTrayIcon) {\n        m_trayIcon->Hide(hideTrayIcon);\n\n        m_hideTrayIcon = hideTrayIcon;\n    }\n\n    if (disableUpdateCheck != m_disableUpdateCheck) {\n        // For the non-portable version, update checking is done by another\n        // process, and we're notified via an event.\n        if (m_portable) {\n            m_checkForUpdates = !disableUpdateCheck;\n            if (m_checkForUpdates) {\n                if (!m_updateChecker) {\n                    SetTimer(Timer::kUpdateCheck,\n                             GetNextUpdateDelay(lastUpdateCheck));\n                }\n            } else {\n                if (m_updateChecker) {\n                    m_updateChecker->Abort();\n                } else {\n                    KillTimer(Timer::kUpdateCheck);\n                }\n\n                ResetLastUpdateTime();\n            }\n        }\n\n        if (disableUpdateCheck) {\n            NotifyAboutAvailableUpdates(UserProfile::UpdateStatus{});\n        } else {\n            NotifyAboutAvailableUpdates(UserProfile::GetUpdateStatus(), true);\n        }\n\n        m_disableUpdateCheck = disableUpdateCheck;\n    }\n\n    if (dontAutoShowToolkit != m_dontAutoShowToolkit) {\n        if (!dontAutoShowToolkit) {\n            try {\n                auto explorerPath = wil::GetWindowsDirectory<std::wstring>() +\n                                    L\"\\\\explorer.exe\";\n\n                m_explorerCrashMonitor.emplace(explorerPath);\n            } catch (const std::exception& e) {\n                LOG(L\"%S\", e.what());\n            }\n        } else {\n            m_explorerCrashMonitor.reset();\n        }\n\n        m_dontAutoShowToolkit = dontAutoShowToolkit;\n    }\n\n    m_disableToolkitHotkey = disableToolkitHotkey;\n\n    m_modTasksDlgDelay = modTasksDlgDelay;\n}\n\nvoid CMainWindow::NotifyAboutAvailableUpdates(\n    UserProfile::UpdateStatus updateStatus,\n    bool alwaysShowUpdateNotification) {\n    m_lastUpdateStatus.emplace(std::move(updateStatus));\n\n    if (alwaysShowUpdateNotification || m_lastUpdateStatus->newUpdatesFound) {\n        ShowUpdateNotificationMessage(m_lastUpdateStatus->appUpdateAvailable,\n                                      m_lastUpdateStatus->modUpdatesAvailable);\n    }\n\n    MarkAppUpdateAvailable(m_lastUpdateStatus->appUpdateAvailable);\n}\n\nvoid CMainWindow::Exit() {\n    CloseUI();\n\n    if (m_portable) {\n        KillTimer(Timer::kHandleNewProcesses);\n    }\n\n    if (m_updateChecker) {\n        m_updateChecker->Abort();\n        m_exitWhenUpdateCheckDone = true;\n    } else {\n        if (m_checkForUpdates) {\n            KillTimer(Timer::kUpdateCheck);\n        }\n\n        DestroyWindow();\n    }\n}\n\nvoid CMainWindow::StopService(HWND hWnd) {\n    struct CALLBACK_STATE {\n        bool showOnTaskbar;\n        bool verificationChecked;\n        bool handlingOkButton;\n    };\n\n    CALLBACK_STATE callbackState{\n        .showOnTaskbar = !hWnd,\n    };\n\n    TASKDIALOGCONFIG tdcTaskDialogConfig = {sizeof(TASKDIALOGCONFIG)};\n    TASKDIALOG_BUTTON tbButtons[2];\n\n    tbButtons[0].nButtonID = IDOK;\n    tbButtons[0].pszButtonText =\n        Functions::LoadStrFromRsrc(IDS_EXITDLG_BUTTON_EXIT);\n    tbButtons[1].nButtonID = IDCANCEL;\n    tbButtons[1].pszButtonText =\n        Functions::LoadStrFromRsrc(IDS_EXITDLG_BUTTON_CANCEL);\n\n    tdcTaskDialogConfig.hwndParent = hWnd ? hWnd : m_hWnd;\n    tdcTaskDialogConfig.hInstance = GetModuleHandle(nullptr);\n    tdcTaskDialogConfig.pszWindowTitle =\n        Functions::LoadStrFromRsrc(IDS_EXITDLG_TITLE);\n    tdcTaskDialogConfig.pszMainIcon = MAKEINTRESOURCE(IDR_MAINFRAME);\n    tdcTaskDialogConfig.pszContent =\n        Functions::LoadStrFromRsrc(IDS_EXITDLG_CONTENT);\n    tdcTaskDialogConfig.cButtons = _countof(tbButtons);\n    tdcTaskDialogConfig.pButtons = tbButtons;\n    tdcTaskDialogConfig.nDefaultButton = IDOK;\n    tdcTaskDialogConfig.pszVerificationText =\n        Functions::LoadStrFromRsrc(IDS_EXITDLG_CHECKBOX_AUTOSTART);\n    tdcTaskDialogConfig.pfCallback = [](HWND hWnd, UINT uNotification,\n                                        WPARAM wParam, LPARAM lParam,\n                                        LONG_PTR lpRefData) {\n        auto& callbackState = *reinterpret_cast<CALLBACK_STATE*>(lpRefData);\n\n        CWindow wnd(hWnd);\n\n        switch (uNotification) {\n            case TDN_DIALOG_CONSTRUCTED: {\n                if (callbackState.showOnTaskbar) {\n                    wnd.ModifyStyleEx(0, WS_EX_APPWINDOW);\n                }\n\n                bool languageRightToLeft =\n                    Functions::IsRightToLeftLanguage(GetThreadUILanguage());\n                wnd.ModifyStyleEx(languageRightToLeft ? 0 : WS_EX_LAYOUTRTL,\n                                  languageRightToLeft ? WS_EX_LAYOUTRTL : 0);\n\n                if (!Functions::IsRunAsAdmin()) {\n                    wnd.SendMessage(TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE,\n                                    IDOK, TRUE);\n                }\n                break;\n            }\n\n            case TDN_VERIFICATION_CLICKED:\n                callbackState.verificationChecked =\n                    static_cast<BOOL>(wParam) != FALSE;\n                break;\n\n            case TDN_BUTTON_CLICKED:\n                switch (wParam) {\n                    case IDOK:\n                        if (callbackState.handlingOkButton) {\n                            return S_FALSE;\n                        }\n\n                        callbackState.handlingOkButton = true;\n\n                        auto resetStateFlagOnScopeExit =\n                            wil::scope_exit([&callbackState] {\n                                callbackState.handlingOkButton = false;\n                            });\n\n                        try {\n                            auto modulePath =\n                                wil::GetModuleFileName<std::wstring>();\n                            PCWSTR commandLine = L\"-service-stop\";\n                            if (callbackState.verificationChecked) {\n                                commandLine =\n                                    L\"-service-stop -also-no-autostart\";\n                            }\n\n                            if ((int)(UINT_PTR)ShellExecute(\n                                    nullptr, L\"runas\", modulePath.c_str(),\n                                    commandLine, nullptr, SW_SHOWNORMAL) > 32) {\n                                return S_OK;\n                            }\n\n                            THROW_LAST_ERROR_IF(GetLastError() !=\n                                                ERROR_CANCELLED);\n                        } catch (const std::exception& e) {\n                            try {\n                                std::string msg =\n                                    \"Exiting failed with the error below. If \"\n                                    \"nothing else works, you can choose to \"\n                                    \"send an exit signal to the Windhawk \"\n                                    \"service. Send exit signal?\\n\\nError:\\n\";\n\n                                msg += e.what();\n\n                                if (::MessageBoxA(hWnd, msg.c_str(),\n                                                  \"Exiting failed\",\n                                                  MB_ICONERROR | MB_YESNO |\n                                                      MB_DEFBUTTON2) == IDYES) {\n                                    wil::unique_event namedEvent(::OpenEvent(\n                                        EVENT_MODIFY_STATE, FALSE,\n                                        ServiceCommon::\n                                            kEmergencyStopEventName));\n                                    THROW_LAST_ERROR_IF_NULL(namedEvent);\n\n                                    namedEvent.SetEvent();\n                                }\n                            } catch (const std::exception& e) {\n                                ::MessageBoxA(hWnd, e.what(), \"Error\",\n                                              MB_ICONERROR);\n                            }\n                        }\n\n                        return S_FALSE;  // leave dialog open\n                }\n                break;\n        }\n\n        return S_OK;\n    };\n    tdcTaskDialogConfig.lpCallbackData =\n        reinterpret_cast<LONG_PTR>(&callbackState);\n\n    BOOL bVerificationFlagChecked;\n    ::TaskDialogIndirect(&tdcTaskDialogConfig, nullptr, nullptr,\n                         &bVerificationFlagChecked);\n}\n\nvoid CMainWindow::RunUI(HWND hWnd) {\n    if (!hWnd) {\n        hWnd = m_hWnd;\n    }\n\n    try {\n        UIControl::RunUIOrBringToFront(\n            hWnd, !m_portable && !Functions::IsRunAsAdmin());\n    } catch (const std::exception& e) {\n        ::MessageBoxA(hWnd, e.what(), \"Could not launch the UI process\",\n                      MB_ICONERROR);\n    }\n}\n\nvoid CMainWindow::CloseUI() {\n    try {\n        UIControl::CloseUI();\n    } catch (const std::exception& e) {\n        LOG(L\"CloseUI failed: %S\", e.what());\n    }\n}\n\nvoid CMainWindow::ShowUpdateNotificationMessage(bool appUpdateAvailable,\n                                                int modUpdatesAvailable) {\n    WCHAR message[AppTrayIcon::kMaxNotificationTooltipSize] = L\"\";\n\n    if (appUpdateAvailable) {\n        if (modUpdatesAvailable == 0) {\n            wcsncpy_s(message,\n                      Functions::LoadStrFromRsrc(IDS_NOTIFICATION_UPDATE_APP),\n                      _TRUNCATE);\n        } else if (modUpdatesAvailable == 1) {\n            wcsncpy_s(\n                message,\n                Functions::LoadStrFromRsrc(IDS_NOTIFICATION_UPDATE_APP_MOD),\n                _TRUNCATE);\n        } else {\n            _snwprintf_s(\n                message, _TRUNCATE,\n                Functions::LoadStrFromRsrc(IDS_NOTIFICATION_UPDATE_APP_MODS),\n                modUpdatesAvailable);\n        }\n    } else {\n        if (modUpdatesAvailable == 1) {\n            wcsncpy_s(message,\n                      Functions::LoadStrFromRsrc(IDS_NOTIFICATION_UPDATE_MOD),\n                      _TRUNCATE);\n        } else if (modUpdatesAvailable > 1) {\n            _snwprintf_s(\n                message, _TRUNCATE,\n                Functions::LoadStrFromRsrc(IDS_NOTIFICATION_UPDATE_MODS),\n                modUpdatesAvailable);\n        }\n    }\n\n    if (*message != L'\\0') {\n        m_trayIcon->ShowNotificationMessage(message);\n    }\n}\n\nvoid CMainWindow::MarkAppUpdateAvailable(bool appUpdateAvailable) {\n    m_trayIcon->SetNotificationIconAndTooltip(\n        appUpdateAvailable\n            ? Functions::LoadStrFromRsrc(IDS_TRAYICON_TOOLTIP_UPDATE)\n            : nullptr);\n}\n\nUINT CMainWindow::GetNextUpdateDelay(ULONGLONG lastUpdateCheck) {\n    if (lastUpdateCheck == 0) {\n        return kUpdateInitialDelay;\n    }\n\n    ULONGLONG now = wil::filetime::convert_100ns_to_msec(\n        wil::filetime::to_int64(wil::filetime::get_system_time()));\n\n    ULONGLONG nextUpdateDelay = kUpdateInitialDelay;\n    ULONGLONG nextUpdateTime = lastUpdateCheck + kUpdateInterval;\n    if (nextUpdateTime > now) {\n        nextUpdateDelay = nextUpdateTime - now;\n        if (nextUpdateDelay < kUpdateInitialDelay) {\n            nextUpdateDelay = kUpdateInitialDelay;\n        } else if (nextUpdateDelay > kUpdateInterval) {\n            nextUpdateDelay = kUpdateInterval;\n        }\n    }\n\n    return static_cast<UINT>(nextUpdateDelay);\n}\n\nvoid CMainWindow::SetLastUpdateTime() {\n    ULONGLONG now = wil::filetime::convert_100ns_to_msec(\n        wil::filetime::to_int64(wil::filetime::get_system_time()));\n\n    try {\n        auto settings =\n            StorageManager::GetInstance().GetAppConfig(L\"Settings\", true);\n        settings->SetString(L\"LastUpdateCheck\", std::to_wstring(now).c_str());\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n}\n\nvoid CMainWindow::ResetLastUpdateTime() {\n    try {\n        auto settings =\n            StorageManager::GetInstance().GetAppConfig(L\"Settings\", true);\n        settings->Remove(L\"LastUpdateCheck\");\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n}\n\nvoid CMainWindow::OpenUpdatePage() {\n    PCWSTR url =\n        L\"https://windhawk.net/download?version=\" VER_FILE_VERSION_WSTR;\n\n    if ((int)(UINT_PTR)ShellExecute(m_hWnd, nullptr, url, nullptr, nullptr,\n                                    SW_SHOWNORMAL) <= 32) {\n        MessageBox(\n            L\"Could not open the update page, please update Windhawk manually\",\n            L\"Error\", MB_ICONERROR);\n    }\n}\n\nvoid CMainWindow::ShowLoadedModsDialog() {\n    if (m_modStatusesDlg) {\n        ::SetForegroundWindow(*m_modStatusesDlg);\n        return;\n    }\n\n    m_modStatusesDlg.emplace(CTaskManagerDlg::DialogOptions{\n        .dataSource = CTaskManagerDlg::DataSource::kModStatus,\n        .sessionManagerProcessId = m_serviceInfo.processId,\n        .sessionManagerProcessCreationTime = m_serviceInfo.processCreationTime,\n        .runButtonCallback = [this](HWND hWnd) { RunUI(hWnd); },\n        .finalMessageCallback =\n            [this](HWND hWnd) {\n                m_modStatusesDlg.reset();\n                m_modStatusesChangeNotification.reset();\n            }});\n\n    if (!m_modStatusesDlg->Create(m_hWnd)) {\n        m_modStatusesDlg.reset();\n        return;\n    }\n\n    m_modStatusesDlg->ShowWindow(SW_SHOWNORMAL);\n\n    try {\n        m_modStatusesChangeNotification.emplace(L\"mod-status\");\n    } catch (const std::exception& e) {\n        LOG(L\"Statuses ChangeNotification failed: %S\", e.what());\n    }\n}\n\nvoid CMainWindow::ShowToolkitDialog(bool triggeredBySystemInstability) {\n    if (m_toolkitDlg) {\n        ::SetForegroundWindow(*m_toolkitDlg);\n        return;\n    }\n\n    bool createInactive = triggeredBySystemInstability;\n\n    m_toolkitDlg.emplace(CToolkitDlg::DialogOptions{\n        .createInactive = createInactive,\n        .showTaskbarCrashExplanation = triggeredBySystemInstability,\n        .runButtonCallback = [this](HWND hWnd) { RunUI(hWnd); },\n        .loadedModsButtonCallback =\n            [this](HWND hWnd) { ShowLoadedModsDialog(); },\n        .exitButtonCallback =\n            [this](HWND hWnd) {\n                if (m_portable) {\n                    Exit();\n                } else {\n                    StopService(hWnd);\n                }\n            },\n        .safeModeButtonCallback =\n            [this](HWND hWnd) {\n                if (::MessageBox(\n                        hWnd, Functions::LoadStrFromRsrc(IDS_SAFE_MODE_TEXT),\n                        Functions::LoadStrFromRsrc(IDS_SAFE_MODE_TITLE),\n                        MB_ICONWARNING | MB_OKCANCEL | MB_DEFBUTTON2) == IDOK) {\n                    try {\n                        SwitchToSafeMode();\n                    } catch (const std::exception& e) {\n                        ::MessageBoxA(hWnd, e.what(), \"Error\", MB_ICONERROR);\n                    }\n                }\n            },\n        .finalMessageCallback = [this](HWND hWnd) { m_toolkitDlg.reset(); }});\n\n    if (!m_toolkitDlg->Create(m_hWnd)) {\n        m_toolkitDlg.reset();\n        return;\n    }\n\n    m_toolkitDlg->ShowWindow(createInactive ? SW_SHOWNOACTIVATE\n                                            : SW_SHOWNORMAL);\n}\n\nvoid CMainWindow::SwitchToSafeMode() {\n    try {\n        auto modulePath = wil::GetModuleFileName<std::wstring>();\n\n        std::wstring commandLine = L\"\\\"\" + modulePath + L\"\\\" -wait\";\n\n        STARTUPINFO si = {sizeof(STARTUPINFO)};\n        wil::unique_process_information process;\n\n        THROW_IF_WIN32_BOOL_FALSE(CreateProcess(\n            modulePath.c_str(), commandLine.data(), nullptr, nullptr, FALSE,\n            NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &process));\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n\n    if (m_portable) {\n        auto settings =\n            StorageManager::GetInstance().GetAppConfig(L\"Settings\", true);\n        settings->SetInt(L\"SafeMode\", 1);\n\n        Exit();\n    } else {\n        wil::unique_event namedEvent(::OpenEvent(\n            EVENT_MODIFY_STATE, FALSE, ServiceCommon::kSafeModeStopEventName));\n        THROW_LAST_ERROR_IF_NULL(namedEvent);\n\n        namedEvent.SetEvent();\n    }\n}\n\nvoid CMainWindow::HandleExplorerCrash(int explorerCrashCount) {\n    VERBOSE(L\"Detected %d explorer crashes\", explorerCrashCount);\n\n    ULONGLONG currentTickCount = GetTickCount64();\n\n    if (explorerCrashCount >= 2 ||\n        currentTickCount - m_explorerLastTerminatedTickCount <=\n            kExplorerSecondCrashMaxPeriod) {\n        bool skipShowingToolkit = false;\n        ULONGLONG taskbarProcessCreationTime = GetTaskbarProcessCreationTime();\n        if (taskbarProcessCreationTime) {\n            ULONGLONG currentTime =\n                wil::filetime::to_int64(wil::filetime::get_system_time());\n            ULONGLONG msSinceCreationTime =\n                wil::filetime::convert_100ns_to_msec(\n                    currentTime - taskbarProcessCreationTime);\n            if (msSinceCreationTime > kExplorerSecondCrashMaxPeriod) {\n                VERBOSE(\n                    L\"Taskbar process created %u ms ago, not showing toolkit\",\n                    msSinceCreationTime);\n                skipShowingToolkit = true;\n            }\n        }\n\n        if (!skipShowingToolkit && !m_toolkitDlg) {\n            ShowToolkitDialog(/*triggeredBySystemInstability=*/true);\n        }\n    }\n\n    m_explorerLastTerminatedTickCount = currentTickCount;\n}\n"
  },
  {
    "path": "src/windhawk/app/main_window.h",
    "content": "#pragma once\n\n#include \"engine_control.h\"\n#include \"event_viewer_crash_monitor.h\"\n#include \"service_common.h\"\n#include \"storage_manager.h\"\n#include \"task_manager_dlg.h\"\n#include \"toolkit_dlg.h\"\n#include \"tray_icon.h\"\n#include \"update_checker.h\"\n#include \"userprofile.h\"\n\nclass CMainWindow : public CWindowImpl<CMainWindow, CWindow, CNullTraits>,\n                    public CMessageFilter,\n                    public CIdleHandler {\n   public:\n    DECLARE_WND_CLASS(L\"WindhawkDaemon\")\n\n    // Custom messages.\n    enum {\n        UWM_PORTABLE_APP_COMMAND = WM_APP,\n        UWM_TRAYICON,\n        UWM_UPDATE_CHECKED,\n    };\n\n    enum class PortableAppCommand {\n        kRunUI = 1,\n        kExit,\n    };\n\n    CMainWindow(bool trayOnly, bool portable);\n\n   private:\n    enum class Timer {\n        kHandleNewProcesses = 1,\n        kUpdateCheck,\n        kModTasksDlgCreate,\n    };\n\n    enum class Hotkey {\n        kToolkit = 1,\n    };\n\n    BOOL PreTranslateMessage(MSG* pMsg) override;\n    BOOL OnIdle() override;\n\n    BEGIN_MSG_MAP_EX(CMainWindow)\n        MSG_WM_CREATE(OnCreate)\n        MSG_WM_DESTROY(OnDestroy)\n        MSG_WM_HOTKEY(OnHotKey)\n        MSG_WM_TIMER(OnTimer)\n        MSG_WM_POWERBROADCAST(OnPowerBroadcast)\n        MESSAGE_HANDLER_EX(UWM_PORTABLE_APP_COMMAND, OnPortableAppCommand)\n        MESSAGE_HANDLER_EX(UWM_TRAYICON, OnTrayIcon)\n        MESSAGE_HANDLER_EX(UWM_UPDATE_CHECKED, OnUpdateChecked)\n        MESSAGE_HANDLER_EX(m_taskbarCreatedMsg, OnTaskbarCreated)\n    END_MSG_MAP()\n\n    int OnCreate(LPCREATESTRUCT lpCreateStruct);\n    void OnDestroy();\n    void OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey);\n    void OnTimer(UINT_PTR nIDEvent);\n    BOOL OnPowerBroadcast(DWORD dwPowerEvent, DWORD_PTR dwData);\n    LRESULT OnPortableAppCommand(UINT uMsg, WPARAM wParam, LPARAM lParam);\n    LRESULT OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam);\n    LRESULT OnUpdateChecked(UINT uMsg, WPARAM wParam, LPARAM lParam);\n    LRESULT OnTaskbarCreated(UINT uMsg, WPARAM wParam, LPARAM lParam);\n\n    UINT_PTR SetTimer(Timer nIDEvent,\n                      UINT nElapse,\n                      TIMERPROC lpfnTimer = nullptr);\n    BOOL KillTimer(Timer nIDEvent);\n    void InitForPortableVersion();\n    void InitForNonPortableVersion();\n    void LoadSettings();\n    void NotifyAboutAvailableUpdates(UserProfile::UpdateStatus updateStatus,\n                                     bool alwaysShowUpdateNotification = false);\n    void Exit();\n    void StopService(HWND hWnd = nullptr);\n    void RunUI(HWND hWnd = nullptr);\n    void CloseUI();\n    void ShowUpdateNotificationMessage(bool appUpdateAvailable,\n                                       int modUpdatesAvailable);\n    void MarkAppUpdateAvailable(bool appUpdateAvailable);\n    UINT GetNextUpdateDelay(ULONGLONG lastUpdateCheck);\n    void SetLastUpdateTime();\n    void ResetLastUpdateTime();\n    void OpenUpdatePage();\n    void ShowLoadedModsDialog();\n    void ShowToolkitDialog(bool triggeredBySystemInstability = false);\n    void SwitchToSafeMode();\n    void HandleExplorerCrash(int explorerCrashCount);\n\n    bool m_trayOnly;\n    bool m_portable;\n    UINT m_taskbarCreatedMsg;\n    wil::unique_mutex_nothrow m_serviceMutex;\n    wil::unique_event_nothrow m_appSettingsChangedEvent;\n    wil::unique_event_nothrow m_newUpdatesFoundEvent;\n    std::optional<AppTrayIcon> m_trayIcon;\n    ServiceCommon::ServiceInfo m_serviceInfo{};\n    std::optional<EngineControl> m_engineControl;\n    std::unique_ptr<UpdateChecker> m_updateChecker;\n    bool m_exitWhenUpdateCheckDone = false;\n    std::optional<UserProfile::UpdateStatus> m_lastUpdateStatus;\n    bool m_toolkitHotkeyRegistered = false;\n\n    // Settings.\n    LANGID m_languageId = 0;\n    bool m_hideTrayIcon = true;\n    bool m_disableUpdateCheck = true;\n    bool m_checkForUpdates = false;  // portable version only\n    bool m_dontAutoShowToolkit = true;\n    bool m_disableToolkitHotkey = false;\n    int m_modTasksDlgDelay = CTaskManagerDlg::kAutonomousModeShowDelayDefault;\n\n    // Shown automatically when mods are doing tasks such as initializing or\n    // loading symbols.\n    std::optional<CTaskManagerDlg> m_modTasksDlg;\n    std::optional<StorageManager::ModMetadataChangeNotification>\n        m_modTasksChangeNotification;\n\n    // Opened by the user.\n    std::optional<CTaskManagerDlg> m_modStatusesDlg;\n    std::optional<StorageManager::ModMetadataChangeNotification>\n        m_modStatusesChangeNotification;\n\n    // Opened from the tray icon, with a hotkey, or when explorer isn't running.\n    std::optional<CToolkitDlg> m_toolkitDlg;\n\n    // Explorer instability monitoring. Instability is detected when explorer\n    // terminates more than once in a short period of time.\n    constexpr static UINT kExplorerSecondCrashMaxPeriod = 1000 * 60;\n    std::optional<EventViewerCrashMonitor> m_explorerCrashMonitor;\n    ULONGLONG m_explorerLastTerminatedTickCount = 0;\n};\n"
  },
  {
    "path": "src/windhawk/app/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"wtl\" version=\"10.0.10320\" targetFramework=\"native\" />\n</packages>"
  },
  {
    "path": "src/windhawk/app/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by rsrc.rc\n//\n#define IDR_MAINFRAME                   0x80\n#define IDI_NOTIFICATION                0x81\n#define IDD_TASK_MANAGER                0x82\n#define IDD_TOOLKIT                     0x83\n#define IDS_TRAY_OPEN                   0x90\n#define IDS_TRAY_LOADED_MODS            0x91\n#define IDS_TRAY_TOOLKIT                0xA0\n#define IDS_TRAY_EXIT                   0xB0\n#define IDS_EXITDLG_TITLE               0xB1\n#define IDS_EXITDLG_CONTENT             0xB2\n#define IDS_EXITDLG_CHECKBOX_AUTOSTART  0xB3\n#define IDS_EXITDLG_BUTTON_EXIT         0xB4\n#define IDS_EXITDLG_BUTTON_CANCEL       0xB5\n#define IDS_NOTIFICATION_UPDATE_APP     0xB6\n#define IDS_NOTIFICATION_UPDATE_APP_MOD 0xB7\n#define IDS_NOTIFICATION_UPDATE_APP_MODS 0xB8\n#define IDS_NOTIFICATION_UPDATE_MOD     0xB9\n#define IDS_NOTIFICATION_UPDATE_MODS    0xBA\n#define IDS_TRAYICON_TOOLTIP_UPDATE     0xBB\n#define IDS_TASKDLG_TITLE_LOADED_MODS   0xBC\n#define IDS_TASKDLG_TITLE_TASKS_IN_PROGRESS 0xBD\n#define IDS_TASKDLG_BUTTON_OPEN_APP     0xBE\n#define IDS_TASKDLG_COLUMN_MOD          0xBF\n#define IDS_TASKDLG_COLUMN_PROCESS      0xC0\n#define IDS_TASKDLG_COLUMN_PID          0xC1\n#define IDS_TASKDLG_COLUMN_STATUS       0xC2\n#define IDS_TASKDLG_STATUS_PENDING      0xC3\n#define IDS_TASKDLG_STATUS_LOADING      0xC4\n#define IDS_TASKDLG_STATUS_LOADED       0xC5\n#define IDS_TASKDLG_STATUS_UNLOADED     0xC6\n#define IDS_TASKDLG_TASK_INITIALIZING   0xC7\n#define IDS_TASKDLG_TASK_LOADING_SYMBOLS 0xC8\n#define IDS_TASKDLG_TASK_WAITING_FOR_SYMBOLS 0xD0\n#define IDS_TASKDLG_TASK_UNINITIALIZING 0xE0\n#define IDS_TASKDLG_PROCESS_SUSPENDED   0xF0\n#define IDS_TOOLKITDLG_TITLE            0x100\n#define IDS_TOOLKITDLG_EXPLANATION_CRASH 0x110\n#define IDS_TOOLKITDLG_BUTTON_OPEN      0x120\n#define IDS_TOOLKITDLG_BUTTON_LOADED_MODS 0x121\n#define IDS_TOOLKITDLG_BUTTON_EXIT      0x122\n#define IDS_TOOLKITDLG_BUTTON_SAFE_MODE 0x123\n#define IDS_TOOLKITDLG_BUTTON_CLOSE     0x124\n#define IDS_SAFE_MODE_TITLE             0x125\n#define IDS_SAFE_MODE_TEXT              0x126\n#define IDS_SAFE_MODE_DETECTED_TITLE    0x130\n#define IDS_SAFE_MODE_DETECTED_TEXT     0x131\n#define IDC_TASK_LIST                   1001\n#define IDC_TOOLKIT_EXPLANATION         1002\n#define IDC_TOOLKIT_LOADED_MODS         1003\n#define IDC_TOOLKIT_EXIT                1004\n#define IDC_TOOLKIT_SAFE_MODE           1005\n#define IDC_TOOLKIT_CLOSE               1006\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        0x132\n#define _APS_NEXT_COMMAND_VALUE         32775\n#define _APS_NEXT_CONTROL_VALUE         1007\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "src/windhawk/app/rsrc/compatibility.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\">\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"> \n    <application> \n        <!-- Windows Vista -->\n        <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/> \n        <!-- Windows 7 -->\n        <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n        <!-- Windows 8 -->\n        <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n        <!-- Windows 8.1 -->\n        <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n        <!-- Windows 10 -->\n        <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n    </application> \n  </compatibility>\n  <asmv3:application>\n    <asmv3:windowsSettings>\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n      <longPathAware xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">true</longPathAware>\n    </asmv3:windowsSettings>\n  </asmv3:application>\n</assembly>\n"
  },
  {
    "path": "src/windhawk/app/service.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"service.h\"\n\n#include \"engine_control.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"service_common.h\"\n#include \"storage_manager.h\"\n#include \"version.h\"\n\nnamespace {\n\nHANDLE CreateServiceInfoFileMapping() {\n    // Allow only FILE_MAP_READ (0x0004), only for medium integrity.\n    PCWSTR pszStringSecurityDescriptor = L\"D:(A;;0x0004;;;WD)S:(ML;;NW;;;ME)\";\n\n    wil::unique_hlocal secDesc;\n    THROW_IF_WIN32_BOOL_FALSE(\n        ConvertStringSecurityDescriptorToSecurityDescriptor(\n            pszStringSecurityDescriptor, SDDL_REVISION_1, &secDesc, nullptr));\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    wil::unique_handle fileMapping(\n        CreateFileMapping(INVALID_HANDLE_VALUE, &secAttr, PAGE_READWRITE, 0,\n                          sizeof(ServiceCommon::ServiceInfo),\n                          ServiceCommon::kInfoFileMappingName));\n    THROW_LAST_ERROR_IF(!fileMapping || GetLastError() == ERROR_ALREADY_EXISTS);\n\n    wil::unique_mapview_ptr<ServiceCommon::ServiceInfo> fileMappingView(\n        reinterpret_cast<ServiceCommon::ServiceInfo*>(\n            MapViewOfFile(fileMapping.get(), FILE_MAP_WRITE, 0, 0, 0)));\n    THROW_LAST_ERROR_IF(!fileMappingView);\n\n    FILETIME creationTime;\n    FILETIME exitTime;\n    FILETIME kernelTime;\n    FILETIME userTime;\n    THROW_IF_WIN32_BOOL_FALSE(GetProcessTimes(\n        GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime));\n\n    fileMappingView->version = VER_FILE_VERSION_LONG;\n    fileMappingView->processId = GetCurrentProcessId();\n    fileMappingView->processCreationTime =\n        wil::filetime::to_int64(creationTime);\n\n    return fileMapping.release();\n}\n\nHANDLE CreateServiceMutex() {\n    // Allow only SYNCHRONIZE (0x00100000), only for medium integrity.\n    PCWSTR pszStringSecurityDescriptor =\n        L\"D:(A;;0x00100000;;;WD)S:(ML;;NW;;;ME)\";\n\n    wil::unique_hlocal secDesc;\n    THROW_IF_WIN32_BOOL_FALSE(\n        ConvertStringSecurityDescriptorToSecurityDescriptor(\n            pszStringSecurityDescriptor, SDDL_REVISION_1, &secDesc, nullptr));\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    wil::unique_mutex_nothrow mutex(\n        CreateMutex(&secAttr, TRUE, ServiceCommon::kMutexName));\n    THROW_LAST_ERROR_IF(!mutex || GetLastError() == ERROR_ALREADY_EXISTS);\n\n    return mutex.release();\n}\n\nvoid CreateProcessOnSessionId(DWORD dwSessionId,\n                              const WCHAR* pszPath,\n                              WCHAR* pszCommandLine) {\n    wil::unique_handle token;\n    THROW_IF_WIN32_BOOL_FALSE(WTSQueryUserToken(dwSessionId, &token));\n\n    wil::unique_environment_block environment;\n    THROW_IF_WIN32_BOOL_FALSE(\n        CreateEnvironmentBlock(&environment, token.get(), FALSE));\n\n    wil::unique_process_information processInfo;\n    STARTUPINFO startupInfo = {sizeof(STARTUPINFO)};\n\n    THROW_IF_WIN32_BOOL_FALSE(CreateProcessAsUser(\n        token.get(), pszPath, pszCommandLine, nullptr, nullptr, FALSE,\n        NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, environment.get(),\n        nullptr, &startupInfo, &processInfo));\n}\n\nvoid CreateProcessOnAllSessions(const WCHAR* pszPath, WCHAR* pszCommandLine) {\n    WTS_SESSION_INFO* sessionInfo;\n    DWORD dwCount;\n\n    THROW_IF_WIN32_BOOL_FALSE(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0,\n                                                   1, &sessionInfo, &dwCount));\n    wil::unique_wtsmem_ptr<WTS_SESSION_INFO> scopedSessionInfo(sessionInfo);\n\n    for (DWORD i = 0; i < dwCount; i++) {\n        WCHAR* pszUserName;\n        DWORD dwUserNameLen;\n\n        THROW_IF_WIN32_BOOL_FALSE(WTSQuerySessionInformation(\n            WTS_CURRENT_SERVER_HANDLE, sessionInfo[i].SessionId, WTSUserName,\n            &pszUserName, &dwUserNameLen));\n        wil::unique_wtsmem_ptr<WCHAR> scopedUserName(pszUserName);\n\n        if (*pszUserName != L'\\0') {\n            CreateProcessOnSessionId(sessionInfo[i].SessionId, pszPath,\n                                     pszCommandLine);\n        }\n    }\n}\n\n}  // namespace\n\nclass ServiceInstance {\n   public:\n    VOID SvcMain(DWORD dwArgc, LPTSTR* lpszArgv);\n\n   private:\n    VOID SvcInit(DWORD dwArgc, LPTSTR* lpszArgv);\n    VOID SvcRun(DWORD dwArgc, LPTSTR* lpszArgv);\n    VOID ReportSvcStatus(DWORD dwCurrentState,\n                         DWORD dwWin32ExitCode,\n                         DWORD dwWaitHint);\n    static DWORD WINAPI SvcCtrlHandlerExThunk(DWORD dwControl,\n                                              DWORD dwEventType,\n                                              LPVOID lpEventData,\n                                              LPVOID lpContext);\n    DWORD SvcCtrlHandlerEx(DWORD dwControl,\n                           DWORD dwEventType,\n                           LPVOID lpEventData);\n\n    SERVICE_STATUS_HANDLE m_svcStatusHandle{};\n    DWORD m_dwCheckPoint = 1;\n    wil::unique_handle m_svcInfoFileMapping;\n    wil::unique_mutex m_svcMutex;\n    wil::mutex_release_scope_exit m_svcMutexLock;\n    wil::unique_event m_svcStopEvent;\n    wil::unique_event m_svcScanForProcessesEvent;\n    wil::unique_event m_svcEmergencyStopEvent;\n    wil::unique_event m_svcSafeModeStopEvent;\n    std::optional<EngineControl> m_engineControl;\n};\n\n//\n// Purpose:\n//   Entry point for the service\n//\n// Parameters:\n//   dwArgc - Number of arguments in the lpszArgv array\n//   lpszArgv - Array of strings. The first string is the name of\n//     the service and subsequent strings are passed by the process\n//     that called the StartService function to start the service.\n//\n// Return value:\n//   None.\n//\nVOID ServiceInstance::SvcMain(DWORD dwArgc, LPTSTR* lpszArgv) {\n    // Register the handler function for the service\n    m_svcStatusHandle = RegisterServiceCtrlHandlerEx(\n        ServiceCommon::kName, SvcCtrlHandlerExThunk,\n        reinterpret_cast<LPVOID>(this));\n    THROW_LAST_ERROR_IF_NULL(m_svcStatusHandle);\n\n    // Report initial status to the SCM\n    ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);\n\n    // Perform service-specific initialization and work.\n    try {\n        VERBOSE(L\"Running SvcInit\");\n        SvcInit(dwArgc, lpszArgv);\n    } catch (const std::exception& e) {\n        LOG(L\"SvcInit failed: %S\", e.what());\n        ReportSvcStatus(SERVICE_STOPPED, wil::ResultFromCaughtException(), 0);\n        return;\n    }\n\n    // Report running status when initialization is complete.\n    ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);\n\n    try {\n        VERBOSE(L\"Running SvcRun\");\n        SvcRun(dwArgc, lpszArgv);\n    } catch (const std::exception& e) {\n        LOG(L\"SvcRun failed: %S\", e.what());\n        ReportSvcStatus(SERVICE_STOPPED, wil::ResultFromCaughtException(), 0);\n        return;\n    }\n\n    VERBOSE(L\"Reporting SERVICE_STOPPED\");\n    ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);\n}\n\n//\n// Purpose:\n//   The service code\n//\n// Parameters:\n//   dwArgc - Number of arguments in the lpszArgv array\n//   lpszArgv - Array of strings. The first string is the name of\n//     the service and subsequent strings are passed by the process\n//     that called the StartService function to start the service.\n//\n// Return value:\n//   None\n//\nVOID ServiceInstance::SvcInit(DWORD dwArgc, LPTSTR* lpszArgv) {\n    // TO_DO: Declare and set any required variables.\n    //   Be sure to periodically call ReportSvcStatus() with\n    //   SERVICE_START_PENDING. If initialization fails, call\n    //   ReportSvcStatus with SERVICE_STOPPED.\n\n    if (!Functions::SetDebugPrivilege(TRUE)) {\n        LOG(L\"SetDebugPrivilege failed with error %u\", GetLastError());\n    }\n\n    m_svcInfoFileMapping.reset(CreateServiceInfoFileMapping());\n\n    m_svcMutex.reset(CreateServiceMutex());\n\n    m_svcMutexLock = m_svcMutex.ReleaseMutex_scope_exit();\n\n    // Create an event. The control handler function, SvcCtrlHandler,\n    // signals this event when it receives the stop control code.\n    m_svcStopEvent.reset(CreateEvent(nullptr,    // default security attributes\n                                     TRUE,       // manual reset event\n                                     FALSE,      // not signaled\n                                     nullptr));  // no name\n    THROW_LAST_ERROR_IF_NULL(m_svcStopEvent);\n\n    m_svcScanForProcessesEvent.reset(Functions::CreateEventForMediumIntegrity(\n        ServiceCommon::kScanForProcessesEventName, FALSE));\n\n    m_svcEmergencyStopEvent.reset(Functions::CreateEventForMediumIntegrity(\n        ServiceCommon::kEmergencyStopEventName, TRUE));\n\n    m_svcSafeModeStopEvent.reset(Functions::CreateEventForMediumIntegrity(\n        ServiceCommon::kSafeModeStopEventName, TRUE));\n\n    auto settings =\n        StorageManager::GetInstance().GetAppConfig(L\"Settings\", false);\n\n    if (!settings->GetInt(L\"SafeMode\").value_or(0)) {\n        m_engineControl.emplace();\n        m_engineControl->HandleNewProcesses();\n    }\n}\n\n//\n// Purpose:\n//   The service code\n//\nVOID ServiceInstance::SvcRun(DWORD dwArgc, LPTSTR* lpszArgv) {\n    // TO_DO: Perform work until service stops.\n\n    try {\n        auto modulePath = wil::GetModuleFileName<std::wstring>();\n        auto commandLine = L\"\\\"\" + modulePath + L\"\\\" -tray-only\";\n        CreateProcessOnAllSessions(modulePath.c_str(), commandLine.data());\n    } catch (const std::exception& e) {\n        LOG(L\"CreateProcessOnAllSessions failed: %S\", e.what());\n    }\n\n    HANDLE events[] = {\n        m_svcStopEvent.get(),\n        m_svcScanForProcessesEvent.get(),\n        m_svcEmergencyStopEvent.get(),\n        m_svcSafeModeStopEvent.get(),\n    };\n\n    while (true) {\n        bool keepLooping = false;\n\n        DWORD dwWaitResult = WaitForMultipleObjectsEx(ARRAYSIZE(events), events,\n                                                      FALSE, 1000, FALSE);\n        switch (dwWaitResult) {\n            case WAIT_FAILED:\n                THROW_LAST_ERROR();\n                break;\n\n            case WAIT_TIMEOUT:\n\t\t\t\tkeepLooping = true;\n                break;\n\n            case WAIT_OBJECT_0:\n                VERBOSE(L\"Received stop event\");\n                break;\n\n            case WAIT_OBJECT_0 + 1:\n                VERBOSE(L\"Received scan for processes event\");\n\n                keepLooping = true;\n                break;\n\n            case WAIT_OBJECT_0 + 2:\n                LOG(L\"Received emergency stop event\");\n                break;\n\n            case WAIT_OBJECT_0 + 3: {\n                LOG(L\"Received safe mode stop event\");\n\n                auto settings = StorageManager::GetInstance().GetAppConfig(\n                    L\"Settings\", true);\n                settings->SetInt(L\"SafeMode\", 1);\n\n                // Flush the settings to ensure they are saved, in case\n                // unloading will cause a BSOD.\n                StorageManager::GetInstance().FlushAppConfig(L\"Settings\");\n                break;\n            }\n\n            default:\n                LOG(L\"Received unknown event %u\", dwWaitResult);\n                break;\n        }\n\n        if (!keepLooping) {\n            break;\n        }\n\n        if (m_engineControl) {\n            m_engineControl->HandleNewProcesses();\n        }\n    }\n}\n\n//\n// Purpose:\n//   Sets the current service status and reports it to the SCM.\n//\n// Parameters:\n//   dwCurrentState - The current state (see SERVICE_STATUS)\n//   dwWin32ExitCode - The system error code\n//   dwWaitHint - Estimated time for pending operation,\n//     in milliseconds\n//\n// Return value:\n//   None\n//\nVOID ServiceInstance::ReportSvcStatus(DWORD dwCurrentState,\n                                      DWORD dwWin32ExitCode,\n                                      DWORD dwWaitHint) {\n    SERVICE_STATUS SvcStatus{};\n\n    // These SERVICE_STATUS members remain as set here.\n    SvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;\n    SvcStatus.dwServiceSpecificExitCode = 0;\n\n    // Fill in the SERVICE_STATUS structure.\n    SvcStatus.dwCurrentState = dwCurrentState;\n    SvcStatus.dwWin32ExitCode = dwWin32ExitCode;\n    SvcStatus.dwWaitHint = dwWaitHint;\n\n    SvcStatus.dwControlsAccepted = SERVICE_ACCEPT_SESSIONCHANGE;\n    if (dwCurrentState != SERVICE_START_PENDING)\n        SvcStatus.dwControlsAccepted |= SERVICE_ACCEPT_STOP;\n\n    if (dwCurrentState == SERVICE_RUNNING || dwCurrentState == SERVICE_STOPPED)\n        SvcStatus.dwCheckPoint = 0;\n    else\n        SvcStatus.dwCheckPoint = m_dwCheckPoint++;\n\n    // Report the status of the service to the SCM.\n    SetServiceStatus(m_svcStatusHandle, &SvcStatus);\n}\n\n// static\nDWORD WINAPI ServiceInstance::SvcCtrlHandlerExThunk(DWORD dwControl,\n                                                    DWORD dwEventType,\n                                                    LPVOID lpEventData,\n                                                    LPVOID lpContext) {\n    auto serviceInstance = reinterpret_cast<ServiceInstance*>(lpContext);\n    return serviceInstance->SvcCtrlHandlerEx(dwControl, dwEventType,\n                                             lpEventData);\n}\n\n//\n// Purpose:\n//   Called by SCM whenever a control code is sent to the service\n//   using the ControlService function.\n//\nDWORD ServiceInstance::SvcCtrlHandlerEx(DWORD dwControl,\n                                        DWORD dwEventType,\n                                        LPVOID lpEventData) {\n    // Handle the requested control code.\n\n    switch (dwControl) {\n        case SERVICE_CONTROL_STOP:\n            VERBOSE(\"Handling SERVICE_CONTROL_STOP\");\n\n            ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);\n\n            // Signal the service to stop.\n            SetEvent(m_svcStopEvent.get());\n            return NO_ERROR;\n\n        case SERVICE_CONTROL_SESSIONCHANGE:\n            if (dwEventType == WTS_SESSION_LOGON) {\n                VERBOSE(\"Handling WTS_SESSION_LOGON\");\n\n                try {\n                    auto sessionNotification =\n                        reinterpret_cast<const WTSSESSION_NOTIFICATION*>(\n                            lpEventData);\n                    WCHAR* pszUserName;\n                    DWORD dwUserNameLen;\n\n                    THROW_IF_WIN32_BOOL_FALSE(WTSQuerySessionInformation(\n                        WTS_CURRENT_SERVER_HANDLE,\n                        sessionNotification->dwSessionId, WTSUserName,\n                        &pszUserName, &dwUserNameLen));\n                    wil::unique_wtsmem_ptr<WCHAR> scopedUserName(pszUserName);\n\n                    if (*pszUserName != L'\\0') {\n                        auto modulePath =\n                            wil::GetModuleFileName<std::wstring>();\n                        auto commandLine =\n                            L\"\\\"\" + modulePath + L\"\\\" -tray-only\";\n                        CreateProcessOnSessionId(\n                            sessionNotification->dwSessionId,\n                            modulePath.c_str(), commandLine.data());\n                    }\n                } catch (const std::exception& e) {\n                    LOG(L\"WTS_SESSION_LOGON handler failed: %S\", e.what());\n                }\n            }\n            return NO_ERROR;\n\n        case SERVICE_CONTROL_INTERROGATE:\n            return NO_ERROR;\n\n        default:\n            return ERROR_CALL_NOT_IMPLEMENTED;\n    }\n}\n\nVOID WINAPI SvcMain(DWORD dwArgc, LPTSTR* lpszArgv) {\n    try {\n        ServiceInstance serviceInstance;\n        serviceInstance.SvcMain(dwArgc, lpszArgv);\n    } catch (const std::exception& e) {\n        LOG(L\"SvcMain failed: %S\", e.what());\n    }\n}\n\nnamespace Service {\n\nvoid Run() {\n    auto serviceName{std::to_array(ServiceCommon::kName)};\n\n    SERVICE_TABLE_ENTRY DispatchTable[] = {{serviceName.data(), SvcMain},\n                                           {nullptr, nullptr}};\n\n    THROW_IF_WIN32_BOOL_FALSE(StartServiceCtrlDispatcher(DispatchTable));\n}\n\nbool IsRunning(bool waitIfStarting) {\n    wil::unique_schandle scManager(\n        OpenSCManager(nullptr,  // local computer\n                      nullptr,  // ServicesActive database\n                      0));\n    THROW_LAST_ERROR_IF_NULL(scManager);\n\n    wil::unique_schandle service(OpenService(\n        scManager.get(), ServiceCommon::kName, SERVICE_QUERY_STATUS));\n    THROW_LAST_ERROR_IF_NULL(service);\n\n    SERVICE_STATUS_PROCESS ssp;\n    DWORD dwBytesNeeded;\n\n    THROW_IF_WIN32_BOOL_FALSE(QueryServiceStatusEx(\n        service.get(), SC_STATUS_PROCESS_INFO, reinterpret_cast<BYTE*>(&ssp),\n        sizeof(ssp), &dwBytesNeeded));\n\n    switch (ssp.dwCurrentState) {\n        case SERVICE_RUNNING:\n            return true;\n\n        case SERVICE_START_PENDING:\n            if (!waitIfStarting) {\n                return false;\n            }\n            break;\n\n        default:\n            return false;\n    }\n\n    constexpr DWORD kStartStopTimeout = 30000;\n\n    // Save the tick count and initial checkpoint.\n    DWORD dwStartTickCount = GetTickCount();\n    DWORD dwOldCheckPoint = ssp.dwCheckPoint;\n\n    while (ssp.dwCurrentState == SERVICE_START_PENDING) {\n        if (ssp.dwCheckPoint > dwOldCheckPoint) {\n            // Continue to wait and check\n            dwStartTickCount = GetTickCount();\n            dwOldCheckPoint = ssp.dwCheckPoint;\n        } else {\n            if (GetTickCount() - dwStartTickCount > kStartStopTimeout) {\n                // Timeout.\n                break;\n            }\n        }\n\n        // Do not wait longer than the wait hint. A good interval is\n        // one-tenth the wait hint, but no less than 1 second and no\n        // more than 10 seconds.\n\n        DWORD dwWaitTime = ssp.dwWaitHint / 10;\n\n        // if (dwWaitTime < 1000)\n        //     dwWaitTime = 1000;\n        // else if (dwWaitTime > 10000)\n        //     dwWaitTime = 10000;\n\n        // 200-1000 ms for better responsiveness.\n        if (dwWaitTime < 200)\n            dwWaitTime = 200;\n        else if (dwWaitTime > 1000)\n            dwWaitTime = 1000;\n\n        Sleep(dwWaitTime);\n\n        // Check the status again.\n        THROW_IF_WIN32_BOOL_FALSE(QueryServiceStatusEx(\n            service.get(),                  // handle to service\n            SC_STATUS_PROCESS_INFO,         // info level\n            reinterpret_cast<BYTE*>(&ssp),  // address of structure\n            sizeof(ssp),                    // size of structure\n            &dwBytesNeeded));               // if buffer too small\n    }\n\n    return ssp.dwCurrentState == SERVICE_RUNNING;\n}\n\nvoid Start() {\n    wil::unique_schandle scManager(\n        OpenSCManager(nullptr,  // local computer\n                      nullptr,  // ServicesActive database\n                      0));\n    THROW_LAST_ERROR_IF_NULL(scManager);\n\n    wil::unique_schandle service(\n        OpenService(scManager.get(), ServiceCommon::kName,\n                    SERVICE_START | SERVICE_CHANGE_CONFIG));\n    THROW_LAST_ERROR_IF_NULL(service);\n\n    if (!StartService(service.get(), 0, nullptr)) {\n        THROW_LAST_ERROR_IF(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING);\n    }\n\n    // Change start type to autostart.\n    THROW_IF_WIN32_BOOL_FALSE(\n        ChangeServiceConfig(service.get(),\n                            SERVICE_NO_CHANGE,   // service type\n                            SERVICE_AUTO_START,  // start type\n                            SERVICE_NO_CHANGE,   // error control type\n                            nullptr,             // path to service's binary\n                            nullptr,             // no load ordering group\n                            nullptr,             // no tag identifier\n                            nullptr,             // no dependencies\n                            nullptr,             // LocalSystem account\n                            nullptr,             // no password\n                            nullptr));           // service name to display\n}\n\nvoid Stop(bool disableAutoStart) {\n    wil::unique_schandle scManager(\n        OpenSCManager(nullptr,  // local computer\n                      nullptr,  // ServicesActive database\n                      0));\n    THROW_LAST_ERROR_IF_NULL(scManager);\n\n    wil::unique_schandle service(\n        OpenService(scManager.get(), ServiceCommon::kName,\n                    SERVICE_STOP | SERVICE_CHANGE_CONFIG));\n    THROW_LAST_ERROR_IF_NULL(service);\n\n    SERVICE_STATUS serviceStatus;\n    if (!ControlService(service.get(), SERVICE_CONTROL_STOP, &serviceStatus)) {\n        THROW_LAST_ERROR_IF(GetLastError() != ERROR_SERVICE_NOT_ACTIVE);\n    }\n\n    // Change start type.\n    if (disableAutoStart) {\n        THROW_IF_WIN32_BOOL_FALSE(\n            ChangeServiceConfig(service.get(),\n                                SERVICE_NO_CHANGE,     // service type\n                                SERVICE_DEMAND_START,  // start type\n                                SERVICE_NO_CHANGE,     // error control type\n                                nullptr,    // path to service's binary\n                                nullptr,    // no load ordering group\n                                nullptr,    // no tag identifier\n                                nullptr,    // no dependencies\n                                nullptr,    // LocalSystem account\n                                nullptr,    // no password\n                                nullptr));  // service name to display\n    }\n}\n\n}  // namespace Service\n"
  },
  {
    "path": "src/windhawk/app/service.h",
    "content": "#pragma once\n\nnamespace Service {\n\nvoid Run();\nbool IsRunning(bool waitIfStarting);\nvoid Start();\nvoid Stop(bool disableAutoStart);\n\n}  // namespace Service\n"
  },
  {
    "path": "src/windhawk/app/service_common.h",
    "content": "#pragma once\n\nnamespace ServiceCommon {\n\nstatic inline constexpr WCHAR kName[] = L\"Windhawk\";\n\nstatic inline constexpr WCHAR kInfoFileMappingName[] =\n    L\"Global\\\\WindhawkServiceInfoFileMapping\";\n\nstatic inline constexpr WCHAR kMutexName[] = L\"Global\\\\WindhawkServiceMutex\";\n\nstatic inline constexpr WCHAR kScanForProcessesEventName[] =\n    L\"Global\\\\WindhawkScanForProcesses\";\n\nstatic inline constexpr WCHAR kEmergencyStopEventName[] =\n    L\"Global\\\\WindhawkServiceEmergencyStopEvent\";\n\nstatic inline constexpr WCHAR kSafeModeStopEventName[] =\n    L\"Global\\\\WindhawkServiceSafeModeStopEvent\";\n\nstruct ServiceInfo {\n    DWORD version;\n    DWORD processId;\n    ULONGLONG processCreationTime;\n};\n\n}  // namespace ServiceCommon\n"
  },
  {
    "path": "src/windhawk/app/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\n//\tapp.pch will be the pre-compiled header\n//\tstdafx.obj will contain the pre-compiled type information\n\n#include \"stdafx.h\"\n"
  },
  {
    "path": "src/windhawk/app/stdafx.h",
    "content": "#pragma once\n\n// Change these values to use different versions\n#define WINVER _WIN32_WINNT_WIN7\n#define _WIN32_WINNT _WIN32_WINNT_WIN7\n#define _WIN32_IE _WIN32_IE_IE80\n#define _RICHEDIT_VER 0x0500\n\n#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers\n#define NOMINMAX\n\n//////////////////////////////////////////////////////////////////////////\n// WTL\n\n#define _WTL_NO_CSTRING\n#define _WTL_NO_WTYPES\n#define _WTL_NO_UNION_CLASSES\n#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS\n\n#include <atlbase.h>\n#include <atlfile.h>\n#include <atlstr.h>\n#include <atltypes.h>\n#include <atlutil.h>\n\n#include <atlapp.h>\nextern CAppModule _Module;\n\n#include <atlwin.h>\n\n#include <atlcrack.h>\n#include <atlctrls.h>\n#include <atlctrlx.h>\n// #include <atldlgs.h>\n#include <atlframe.h>\n// #include <atlmisc.h>\n\n//////////////////////////////////////////////////////////////////////////\n// Windows\n\n#include <comutil.h>\n#include <intsafe.h>\n#include <objbase.h>\n#include <sddl.h>\n#include <shobjidl.h>\n#include <taskschd.h>\n#include <tlhelp32.h>\n#include <userenv.h>\n#include <winevt.h>\n#include <winhttp.h>\n#include <wtsapi32.h>\n\n//////////////////////////////////////////////////////////////////////////\n// STL\n\n#include <array>\n#include <atomic>\n#include <exception>\n#include <filesystem>\n#include <fstream>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <optional>\n#include <ranges>\n#include <string>\n#include <variant>\n\n//////////////////////////////////////////////////////////////////////////\n// Libraries\n\n// https://github.com/nlohmann/json#implicit-conversions\n#define JSON_USE_IMPLICIT_CONVERSIONS 0\n\n#include <winhttpwrappers/WinHTTPWrappers.h>\n#include <nlohmann/json.hpp>\n\n#include <wil/stl.h>  // must be included before other wil includes\n\n#include <wil/com.h>\n#include <wil/resource.h>\n#include <wil/result.h>\n#include <wil/safecast.h>\n#include <wil/win32_helpers.h>\n"
  },
  {
    "path": "src/windhawk/app/storage_manager.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"storage_manager.h\"\n\nnamespace {\n\nstd::filesystem::path PathFromStorage(\n    const PortableSettings& storage,\n    PCWSTR valueName,\n    const std::filesystem::path& baseFolderPath) {\n    auto storedPath = storage.GetString(valueName).value_or(L\"\");\n    if (storedPath.empty()) {\n        throw std::runtime_error(\"Missing path value: \" + CStringA(valueName));\n    }\n\n#ifndef _WIN64\n    BOOL isWow64;\n    if (IsWow64Process(GetCurrentProcess(), &isWow64) && isWow64) {\n        // Get the native Program Files path regardless of the current\n        // process architecture.\n        storedPath =\n            Functions::ReplaceAll(storedPath, L\"%ProgramFiles%\",\n                                  L\"%ProgramW6432%\", /*ignoreCase=*/true);\n    }\n#endif  // _WIN64\n\n    auto expandedPath =\n        wil::ExpandEnvironmentStrings<std::wstring>(storedPath.c_str());\n    return (baseFolderPath / expandedPath).lexically_normal();\n}\n\n}  // namespace\n\n// static\nStorageManager& StorageManager::GetInstance() {\n    static StorageManager s;\n    return s;\n}\n\nstd::unique_ptr<PortableSettings> StorageManager::GetAppConfig(PCWSTR section,\n                                                               bool write) {\n    if (portableStorage) {\n        const auto& iniFileSettingsPath = std::get<IniFilePath>(settingsPath);\n        return std::make_unique<IniFileSettings>(\n            iniFileSettingsPath.path.c_str(), section, write);\n    } else {\n        const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n        std::wstring subKey = registrySettingsPath.subKey + L'\\\\' + section;\n        return std::make_unique<RegistrySettings>(registrySettingsPath.hKey,\n                                                  subKey.c_str(), write);\n    }\n}\n\nbool StorageManager::FlushAppConfig(PCWSTR section) {\n    if (portableStorage) {\n        return false;\n    }\n\n    const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n    std::wstring subKey = registrySettingsPath.subKey + L'\\\\' + section;\n\n    wil::unique_hkey hKey;\n    LSTATUS error = RegOpenKeyEx(registrySettingsPath.hKey, subKey.c_str(), 0,\n                                 KEY_WOW64_64KEY | KEY_QUERY_VALUE, &hKey);\n    if (error != ERROR_SUCCESS) {\n        return false;\n    }\n\n    return RegFlushKey(hKey.get()) == ERROR_SUCCESS;\n}\n\nstd::filesystem::path StorageManager::GetModMetadataPath(\n    PCWSTR metadataCategory) {\n    return GetEngineAppDataPath() / L\"ModsWritable\" / metadataCategory;\n}\n\nbool StorageManager::IsPortable() {\n    return portableStorage;\n}\n\nstd::filesystem::path StorageManager::GetEnginePath(USHORT machine) {\n    if (machine == IMAGE_FILE_MACHINE_UNKNOWN) {\n        // Use current architecture.\n#if defined(_M_IX86)\n        machine = IMAGE_FILE_MACHINE_I386;\n#elif defined(_M_X64)\n        machine = IMAGE_FILE_MACHINE_AMD64;\n#elif defined(_M_ARM64)\n        machine = IMAGE_FILE_MACHINE_ARM64;\n#else\n#error \"Unsupported architecture\"\n#endif\n    }\n\n    PCWSTR folderName;\n    switch (machine) {\n        case IMAGE_FILE_MACHINE_I386:\n            folderName = L\"32\";\n            break;\n\n        case IMAGE_FILE_MACHINE_AMD64:\n            folderName = L\"64\";\n            break;\n\n        case IMAGE_FILE_MACHINE_ARM64:\n            folderName = L\"arm64\";\n            break;\n\n        default:\n            throw std::logic_error(\"Unknown architecture\");\n    }\n\n    return enginePath / folderName;\n}\n\nstd::filesystem::path StorageManager::GetUIPath() {\n    return uiPath;\n}\n\nstd::filesystem::path StorageManager::GetCompilerPath() {\n    return compilerPath;\n}\n\nstd::filesystem::path StorageManager::GetUIDataPath() {\n    return appDataPath / L\"UIData\";\n}\n\nstd::filesystem::path StorageManager::GetEditorWorkspacePath() {\n    return appDataPath / L\"EditorWorkspace\";\n}\n\nstd::filesystem::path StorageManager::GetUserProfileJsonPath() {\n    return appDataPath / L\"userprofile.json\";\n}\n\nStorageManager::StorageManager() {\n    std::filesystem::path modulePath = wil::GetModuleFileName<std::wstring>();\n    auto folderPath = modulePath.parent_path();\n\n    std::filesystem::path iniFilePath = modulePath;\n    iniFilePath.replace_extension(\"ini\");\n\n    auto storage = IniFileSettings(iniFilePath.c_str(), L\"Storage\", false);\n\n    enginePath = PathFromStorage(storage, L\"EnginePath\", folderPath);\n    uiPath = PathFromStorage(storage, L\"UIPath\", folderPath);\n    compilerPath = PathFromStorage(storage, L\"CompilerPath\", folderPath);\n    appDataPath = PathFromStorage(storage, L\"AppDataPath\", folderPath);\n\n    if (!std::filesystem::is_directory(appDataPath)) {\n        std::error_code ec;\n        std::filesystem::create_directories(appDataPath, ec);\n    }\n\n    portableStorage = storage.GetInt(L\"Portable\").value_or(0);\n    if (portableStorage) {\n        settingsPath = IniFilePath{appDataPath / L\"settings.ini\"};\n    } else {\n        std::wstring registryKey =\n            storage.GetString(L\"RegistryKey\").value_or(L\"\");\n        if (registryKey.empty()) {\n            throw std::runtime_error(\"Missing RegistryKey value\");\n        }\n\n        auto firstBackslash = registryKey.find(L'\\\\');\n        if (firstBackslash == registryKey.npos) {\n            throw std::runtime_error(\"Invalid RegistryKey value\");\n        }\n\n        HKEY hkey;\n\n        std::wstring baseKey = registryKey.substr(0, firstBackslash);\n        if (baseKey == L\"HKEY_CURRENT_USER\" || baseKey == L\"HKCU\") {\n            hkey = HKEY_CURRENT_USER;\n        } else if (baseKey == L\"HKEY_USERS\" || baseKey == L\"HKU\") {\n            hkey = HKEY_USERS;\n        } else if (baseKey == L\"HKEY_LOCAL_MACHINE\" || baseKey == L\"HKLM\") {\n            hkey = HKEY_LOCAL_MACHINE;\n        } else {\n            throw std::runtime_error(\"Unsupported RegistryKey value\");\n        }\n\n        std::wstring subKey = registryKey.substr(firstBackslash + 1);\n\n        settingsPath = RegistryPath{hkey, std::move(subKey)};\n    }\n}\n\nStorageManager::~StorageManager() = default;\n\nstd::filesystem::path StorageManager::GetEngineAppDataPath() {\n    return appDataPath / L\"Engine\";\n}\n\nStorageManager::ModMetadataChangeNotification::ModMetadataChangeNotification(\n    PCWSTR metadataCategory) {\n    auto& storageManager = GetInstance();\n\n    auto metadataPath = storageManager.GetModMetadataPath(metadataCategory);\n\n    if (!std::filesystem::is_directory(metadataPath)) {\n        std::error_code ec;\n        std::filesystem::create_directories(metadataPath, ec);\n    }\n\n    m_findChange = wil::unique_hfind_change(FindFirstChangeNotification(\n        metadataPath.c_str(), FALSE,\n        FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE));\n    THROW_LAST_ERROR_IF(!m_findChange);\n}\n\nHANDLE StorageManager::ModMetadataChangeNotification::GetHandle() {\n    return m_findChange.get();\n}\n\nvoid StorageManager::ModMetadataChangeNotification::ContinueMonitoring() {\n    THROW_IF_WIN32_BOOL_FALSE(FindNextChangeNotification(m_findChange.get()));\n}\n"
  },
  {
    "path": "src/windhawk/app/storage_manager.h",
    "content": "#pragma once\n\n#include \"portable_settings.h\"\n\nclass StorageManager {\n   public:\n    StorageManager(const StorageManager&) = delete;\n    StorageManager(StorageManager&&) = delete;\n    StorageManager& operator=(const StorageManager&) = delete;\n    StorageManager& operator=(StorageManager&&) = delete;\n\n    static StorageManager& GetInstance();\n\n    std::unique_ptr<PortableSettings> GetAppConfig(PCWSTR section, bool write);\n    bool FlushAppConfig(PCWSTR section);\n\n    std::filesystem::path GetModMetadataPath(PCWSTR metadataCategory);\n\n    bool IsPortable();\n    std::filesystem::path GetEnginePath(\n        USHORT machine = IMAGE_FILE_MACHINE_UNKNOWN);\n    std::filesystem::path GetUIPath();\n    std::filesystem::path GetCompilerPath();\n    std::filesystem::path GetUIDataPath();\n    std::filesystem::path GetEditorWorkspacePath();\n    std::filesystem::path GetUserProfileJsonPath();\n\n    class ModMetadataChangeNotification {\n       public:\n        ModMetadataChangeNotification(PCWSTR metadataCategory);\n\n        HANDLE GetHandle();\n        void ContinueMonitoring();\n\n       private:\n        wil::unique_hfind_change m_findChange;\n    };\n\n   private:\n    StorageManager();\n    ~StorageManager();\n\n    std::filesystem::path GetEngineAppDataPath();\n\n    struct RegistryPath {\n        HKEY hKey = 0;\n        std::wstring subKey;\n    };\n\n    struct IniFilePath {\n        std::wstring path;\n    };\n\n    bool portableStorage;\n    std::filesystem::path appDataPath;\n    std::filesystem::path enginePath;\n    std::filesystem::path uiPath;\n    std::filesystem::path compilerPath;\n    std::variant<std::monostate, RegistryPath, IniFilePath> settingsPath;\n};\n"
  },
  {
    "path": "src/windhawk/app/task_manager_dlg.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"task_manager_dlg.h\"\n\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"storage_manager.h\"\n\nnamespace {\n\n// Wait for a bit before refreshing the list, in case more changes will follow.\nconstexpr auto kRefreshListOnDataChangeDelay = 200;\n\nconstexpr auto kUpdateProcessesStatusInterval = 1000;\n\nstruct ListItemData {\n    std::wstring filePath;\n    std::wstring processName;\n    DWORD processId = 0;\n    ULONGLONG creationTime = 0;\n    bool isFrozen = false;\n    wil::unique_process_handle executionRequiredRequestProcess;\n    wil::unique_handle executionRequiredRequest;\n};\n\nbool CanShowDialog() {\n    QUERY_USER_NOTIFICATION_STATE pquns;\n    if (FAILED(SHQueryUserNotificationState(&pquns))) {\n        return true;\n    }\n\n    // Prevent the dialog from being shown when in fullscreen mode, which can\n    // cause troubles such as interrupting a fullscreen game.\n    switch (pquns) {\n        case QUNS_NOT_PRESENT:\n        case QUNS_BUSY:\n        case QUNS_RUNNING_D3D_FULL_SCREEN:\n            return false;\n    }\n\n    return true;\n}\n\nstd::wstring GetMetadataContent(PCWSTR filePath, FILETIME* pCreationTime) {\n    wil::unique_hfile file(\n        CreateFile(filePath, GENERIC_READ,\n                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n                   nullptr, OPEN_EXISTING, 0, nullptr));\n    THROW_LAST_ERROR_IF(!file);\n\n    LARGE_INTEGER fileSizeLarge;\n    THROW_IF_WIN32_BOOL_FALSE(GetFileSizeEx(file.get(), &fileSizeLarge));\n\n    DWORD fileSize = 0;\n    if (fileSizeLarge.QuadPart <= DWORD_MAX ||\n        (fileSizeLarge.QuadPart % sizeof(WCHAR)) == 0) {\n        fileSize = static_cast<DWORD>(fileSizeLarge.QuadPart);\n    }\n\n    std::wstring fileContents(fileSize / sizeof(WCHAR), L'\\0');\n\n    DWORD numberOfBytesRead;\n    THROW_IF_WIN32_BOOL_FALSE(ReadFile(file.get(), fileContents.data(),\n                                       fileSize, &numberOfBytesRead, nullptr));\n\n    if (pCreationTime) {\n        THROW_IF_WIN32_BOOL_FALSE(\n            GetFileTime(file.get(), pCreationTime, nullptr, nullptr));\n    }\n\n    return fileContents;\n}\n\nstd::wstring LocalizeStatus(PCWSTR status) {\n    static const std::unordered_map<std::wstring_view, UINT> translation = {\n        {L\"Pending...\", IDS_TASKDLG_STATUS_PENDING},\n        {L\"Loading...\", IDS_TASKDLG_STATUS_LOADING},\n        {L\"Loaded\", IDS_TASKDLG_STATUS_LOADED},\n        {L\"Unloaded\", IDS_TASKDLG_STATUS_UNLOADED},\n        {L\"Initializing...\", IDS_TASKDLG_TASK_INITIALIZING},\n        {L\"Uninitializing...\", IDS_TASKDLG_TASK_UNINITIALIZING},\n    };\n    auto it = translation.find(status);\n    if (it != translation.end()) {\n        return Functions::LoadStrFromRsrc(it->second);\n    }\n\n    std::wstring_view statusView{status};\n\n    std::wstring_view prefixLoading = L\"Loading symbols...\";\n    if (statusView.starts_with(prefixLoading)) {\n        return Functions::LoadStrFromRsrc(IDS_TASKDLG_TASK_LOADING_SYMBOLS) +\n               std::wstring(statusView.substr(prefixLoading.length()));\n    }\n\n    std::wstring_view prefixWaiting = L\"Waiting for symbols...\";\n    if (statusView.starts_with(prefixWaiting)) {\n        return Functions::LoadStrFromRsrc(\n                   IDS_TASKDLG_TASK_WAITING_FOR_SYMBOLS) +\n               std::wstring(statusView.substr(prefixWaiting.length()));\n    }\n\n    return status;\n}\n\nbool IsProcessFrozen(DWORD processId) {\n    wil::unique_process_handle process(\n        OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId));\n    if (!process) {\n        return false;\n    }\n\n    return Functions::IsProcessFrozen(process.get());\n}\n\n}  // namespace\n\n// static\nbool CTaskManagerDlg::IsDataSourceEmpty(DataSource dataSource) {\n    PCWSTR metadataCategory = nullptr;\n    switch (dataSource) {\n        case DataSource::kModStatus:\n            metadataCategory = L\"mod-status\";\n            break;\n\n        case DataSource::kModTask:\n            metadataCategory = L\"mod-task\";\n            break;\n    }\n\n    auto metadataPath =\n        StorageManager::GetInstance().GetModMetadataPath(metadataCategory);\n\n    if (!std::filesystem::exists(metadataPath)) {\n        return true;\n    }\n\n    for (const auto& p : std::filesystem::directory_iterator(metadataPath)) {\n        if (!p.is_regular_file()) {\n            continue;\n        }\n\n        return false;\n    }\n\n    return true;\n}\n\nCTaskManagerDlg::CTaskManagerDlg(DialogOptions dialogOptions)\n    : m_dialogOptions(std::move(dialogOptions)) {}\n\nvoid CTaskManagerDlg::LoadLanguageStrings() {\n    UINT titleId = 0;\n    switch (m_dialogOptions.dataSource) {\n        case DataSource::kModStatus:\n            titleId = IDS_TASKDLG_TITLE_LOADED_MODS;\n            break;\n\n        case DataSource::kModTask:\n            titleId = IDS_TASKDLG_TITLE_TASKS_IN_PROGRESS;\n            break;\n    }\n\n    WCHAR title[1024] = L\"Windhawk\";\n    if (titleId) {\n        _snwprintf_s(title, _TRUNCATE, L\"%s - Windhawk\",\n                     Functions::LoadStrFromRsrc(titleId));\n    }\n    SetWindowText(title);\n\n    SetDlgItemText(IDOK,\n                   Functions::LoadStrFromRsrc(IDS_TASKDLG_BUTTON_OPEN_APP));\n\n    UINT columnStringIds[] = {\n        IDS_TASKDLG_COLUMN_MOD,\n        IDS_TASKDLG_COLUMN_PROCESS,\n        IDS_TASKDLG_COLUMN_PID,\n        IDS_TASKDLG_COLUMN_STATUS,\n    };\n\n    for (int i = 0; i < ARRAYSIZE(columnStringIds); i++) {\n        LVCOLUMN column = {LVCF_TEXT};\n        column.pszText = (PWSTR)Functions::LoadStrFromRsrc(columnStringIds[i]);\n        m_taskListSort.SetColumn(i, &column);\n    }\n\n    bool languageRightToLeft =\n        Functions::IsRightToLeftLanguage(GetThreadUILanguage());\n    Functions::ApplyDialogLayoutRtl(*this, languageRightToLeft);\n}\n\nvoid CTaskManagerDlg::DataChanged() {\n    if (m_refreshListOnDataChangePending) {\n        return;\n    }\n\n    SetTimer(Timer::kRefreshList, kRefreshListOnDataChangeDelay);\n    m_refreshListOnDataChangePending = true;\n}\n\nBOOL CTaskManagerDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) {\n    ReloadMainIcon();\n\n    DlgResize_Init();\n    m_ptMinTrackSize.x /= 2;\n    m_ptMinTrackSize.y /= 2;\n\n    if (m_dialogOptions.autonomousMode) {\n        ModifyStyle(WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU, 0);\n        ModifyStyleEx(0, WS_EX_TOOLWINDOW);\n\n        // Make the window topmost, slightly wider and less high.\n        CRect rect;\n        GetWindowRect(&rect);\n        rect.right += rect.Width() / 4;\n        rect.bottom -= rect.Height() / 3;\n        SetWindowPos(HWND_TOPMOST, rect, SWP_NOMOVE | SWP_NOACTIVATE);\n\n        PlaceWindowAtTrayArea();\n    } else {\n        ModifyStyleEx(0, WS_EX_APPWINDOW);\n        CenterWindow();\n    }\n\n    InitTaskList();\n\n    LoadLanguageStrings();\n\n    SetTimer(Timer::kUpdateProcessesStatus, kUpdateProcessesStatusInterval);\n\n    if (!m_dialogOptions.autonomousMode) {\n        try {\n            LoadTaskList();\n        } catch (const std::exception& e) {\n            ::MessageBoxA(m_hWnd, e.what(), \"Failed to initialize data\",\n                          MB_ICONERROR);\n            DestroyWindow();\n            return FALSE;\n        }\n\n        return TRUE;\n    } else {\n        SetTimer(Timer::kRefreshList, kRefreshListOnDataChangeDelay);\n        m_refreshListOnDataChangePending = true;\n\n        SetTimer(Timer::kShowDlg,\n                 std::max(m_dialogOptions.autonomousModeShowDelay,\n                          kAutonomousModeShowDelayMin));\n        m_showDlgPending = true;\n\n        return FALSE;\n    }\n}\n\nvoid CTaskManagerDlg::OnDestroy() {\n    KillTimer(Timer::kUpdateProcessesStatus);\n\n    if (m_refreshListOnDataChangePending) {\n        KillTimer(Timer::kRefreshList);\n    }\n\n    if (m_showDlgPending) {\n        KillTimer(Timer::kShowDlg);\n    }\n\n    int count = m_taskListSort.GetItemCount();\n    for (int i = 0; i < count; i++) {\n        delete reinterpret_cast<ListItemData*>(m_taskListSort.GetItemData(i));\n    }\n\n    // From GDI handle checks, not all icons are freed automatically.\n    ::DestroyIcon(SetIcon(nullptr, TRUE));\n    ::DestroyIcon(SetIcon(nullptr, FALSE));\n}\n\nvoid CTaskManagerDlg::OnTimer(UINT_PTR nIDEvent) {\n    switch ((Timer)nIDEvent) {\n        case Timer::kUpdateProcessesStatus:\n            UpdateTaskListProcessesStatus();\n            break;\n\n        case Timer::kRefreshList:\n            KillTimer(Timer::kRefreshList);\n            m_refreshListOnDataChangePending = false;\n            RefreshTaskList();\n            break;\n\n        case Timer::kShowDlg:\n            KillTimer(Timer::kShowDlg);\n\n            if (CanShowDialog()) {\n                m_showDlgPending = false;\n                ShowWindow(SW_SHOWNA);\n            } else {\n                SetTimer(Timer::kShowDlg, kUpdateProcessesStatusInterval);\n            }\n            break;\n    }\n}\n\nvoid CTaskManagerDlg::OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect) {\n    ReloadMainIcon();\n}\n\nvoid CTaskManagerDlg::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.runButtonCallback) {\n        m_dialogOptions.runButtonCallback(m_hWnd);\n    }\n}\n\nvoid CTaskManagerDlg::OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.autonomousMode) {\n        return;\n    }\n\n    DestroyWindow();\n}\n\nLRESULT CTaskManagerDlg::OnListRightClick(LPNMHDR pnmh) {\n    // LPNMITEMACTIVATE pnmItemActivate = (LPNMITEMACTIVATE)pnmh;\n\n    // if (m_taskListSort.GetItemCount() == 0) {\n    //     return 1;\n    // }\n\n    return 1;\n}\n\nvoid CTaskManagerDlg::OnFinalMessage(HWND hWnd) {\n    if (m_dialogOptions.finalMessageCallback) {\n        m_dialogOptions.finalMessageCallback(m_hWnd);\n    }\n}\n\nUINT_PTR CTaskManagerDlg::SetTimer(Timer nIDEvent,\n                                   UINT nElapse,\n                                   TIMERPROC lpfnTimer) {\n    return CDialogImpl::SetTimer(static_cast<UINT_PTR>(nIDEvent), nElapse,\n                                 lpfnTimer);\n}\n\nBOOL CTaskManagerDlg::KillTimer(Timer nIDEvent) {\n    return CDialogImpl::KillTimer(static_cast<UINT_PTR>(nIDEvent));\n}\n\nvoid CTaskManagerDlg::ReloadMainIcon() {\n    UINT dpi = Functions::GetDpiForWindowWithFallback(m_hWnd);\n\n    CIconHandle mainIcon;\n    mainIcon.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi));\n    CIcon prevMainIcon = SetIcon(mainIcon, TRUE);\n\n    CIconHandle mainIconSmall;\n    mainIconSmall.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi));\n    CIcon prevMainIconSmall = SetIcon(mainIconSmall, FALSE);\n}\n\nvoid CTaskManagerDlg::PlaceWindowAtTrayArea() {\n    CRect windowRect;\n    GetWindowRect(&windowRect);\n\n    CRect workAreaRect;\n    ::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0);\n\n    int margin = 8;\n\n    windowRect.MoveToXY(workAreaRect.right - windowRect.Width() - margin,\n                        workAreaRect.bottom - windowRect.Height() - margin);\n\n    SetWindowPos(nullptr, windowRect,\n                 SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);\n}\n\nvoid CTaskManagerDlg::InitTaskList() {\n    CListViewCtrl list(GetDlgItem(IDC_TASK_LIST));\n\n    m_taskListSort.SubclassWindow(list);\n\n    list.SetExtendedListViewStyle(LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT |\n                                  LVS_EX_LABELTIP | LVS_EX_DOUBLEBUFFER);\n    ::SetWindowTheme(list, L\"Explorer\", nullptr);\n\n    UINT windowDpi = Functions::GetDpiForWindowWithFallback(m_hWnd);\n\n    // Sort PIDs as decimals, signed 128-bit (16-byte) values representing\n    // 96-bit (12-byte) integer numbers:\n    // https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/decimal-data-type\n    // A bit of an overkill, but LVCOLSORT_LONG is signed 32-bit while PIDs are\n    // unsigned 32-bit, so it doesn't fit. And a custom type isn't worth the\n    // effort.\n    struct {\n        PCWSTR name;\n        int width;\n        WORD sort;\n    } columns[] = {\n        {L\"Mod\", 160, LVCOLSORT_TEXT},\n        {L\"Process\", 80, LVCOLSORT_TEXT},\n        {L\"PID\", 60, LVCOLSORT_DECIMAL},\n        {L\"Status\", LVSCW_AUTOSIZE_USEHEADER, LVCOLSORT_TEXT},\n    };\n\n    for (int i = 0; i < ARRAYSIZE(columns); i++) {\n        list.InsertColumn(i, columns[i].name);\n        int width = columns[i].width;\n        if (width > 0) {\n            width = MulDiv(width, windowDpi, 96);\n        }\n        list.SetColumnWidth(i, width);\n        m_taskListSort.SetColumnSortType(i, columns[i].sort);\n    }\n\n    // Reduce the width of the last column so that a horizontal scrollbar won't\n    // appear when the vertical scrollbar is visible.\n    int lastColumn = ARRAYSIZE(columns) - 1;\n    int scrollbarWidth =\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXVSCROLL, windowDpi);\n    list.SetColumnWidth(\n        lastColumn, std::max(list.GetColumnWidth(lastColumn) - scrollbarWidth,\n                             scrollbarWidth));\n\n    m_taskListSort.SetSortColumn(0);\n\n    // Fix tooltip not always on top.\n    if (GetExStyle() & WS_EX_TOPMOST) {\n        list.GetToolTips().SetWindowPos(\n            HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);\n    }\n}\n\nvoid CTaskManagerDlg::LoadTaskList() {\n    m_taskListSort.SetRedraw(FALSE);\n\n    auto redrawWhenDone = wil::scope_exit([this] {\n        m_taskListSort.SetRedraw(TRUE);\n        m_taskListSort.RedrawWindow(\n            nullptr, nullptr,\n            RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);\n    });\n\n    PCWSTR metadataCategory = nullptr;\n    switch (m_dialogOptions.dataSource) {\n        case DataSource::kModStatus:\n            metadataCategory = L\"mod-status\";\n            break;\n\n        case DataSource::kModTask:\n            metadataCategory = L\"mod-task\";\n            break;\n    }\n\n    auto metadataPath =\n        StorageManager::GetInstance().GetModMetadataPath(metadataCategory);\n\n    int firstItemIndex = m_taskListSort.GetItemCount();\n    int itemIndex = firstItemIndex;\n\n    int selectedIndex = m_taskListSort.GetSelectedIndex();\n    bool isSelectionVisible = selectedIndex == -1\n                                  ? false\n                                  : m_taskListSort.IsItemVisible(selectedIndex);\n    std::wstring selectedFilePath =\n        selectedIndex == -1 ? std::wstring()\n                            : reinterpret_cast<ListItemData*>(\n                                  m_taskListSort.GetItemData(selectedIndex))\n                                  ->filePath;\n\n    if (std::filesystem::exists(metadataPath)) {\n        for (const auto& p :\n             std::filesystem::directory_iterator(metadataPath)) {\n            if (!p.is_regular_file()) {\n                continue;\n            }\n\n            try {\n                if (!LoadTaskItemFromMetadataFile(p.path(), itemIndex)) {\n                    VERBOSE(L\"Didn't load %s\", p.path().c_str());\n                    continue;\n                }\n\n                if (selectedFilePath == p.path()) {\n                    // Like SelectItem, but without EnsureVisible.\n                    if (m_taskListSort.SetItemState(\n                            itemIndex, LVIS_SELECTED | LVIS_FOCUSED,\n                            LVIS_SELECTED | LVIS_FOCUSED)) {\n                        m_taskListSort.SetSelectionMark(itemIndex);\n                    }\n                }\n\n                itemIndex++;\n            } catch (const std::exception& e) {\n                LOG(L\"Error handling %s: %S\", p.path().c_str(), e.what());\n            }\n        }\n    }\n\n    // Remove old items only after adding new items to preserve the scroll\n    // position.\n    for (int i = 0; i < firstItemIndex; i++) {\n        delete reinterpret_cast<ListItemData*>(m_taskListSort.GetItemData(0));\n        m_taskListSort.DeleteItem(0);\n    }\n\n    m_taskListSort.DoSortItems(m_taskListSort.GetSortColumn(),\n                               m_taskListSort.IsSortDescending());\n\n    if (isSelectionVisible) {\n        int newSelectedIndex = m_taskListSort.GetSelectedIndex();\n        if (newSelectedIndex != -1) {\n            m_taskListSort.EnsureVisible(newSelectedIndex, FALSE);\n        }\n    }\n}\n\nbool CTaskManagerDlg::LoadTaskItemFromMetadataFile(\n    const std::filesystem::path& filePath,\n    int itemIndex) {\n    auto filenameParts =\n        Functions::SplitString(filePath.filename().native(), L'_');\n    if (filenameParts.size() != 4) {\n        return false;\n    }\n\n    DWORD sessionManagerProcessId = std::stoul(filenameParts[0]);\n    ULONGLONG sessionManagerProcessCreationTime = std::stoull(filenameParts[1]);\n    if (sessionManagerProcessId != m_dialogOptions.sessionManagerProcessId ||\n        sessionManagerProcessCreationTime !=\n            m_dialogOptions.sessionManagerProcessCreationTime) {\n        // Probably a stale file, try to remove.\n        std::error_code ec;\n        std::filesystem::remove(filePath, ec);\n        return false;\n    }\n\n    DWORD targetProcessId = std::stoul(filenameParts[2]);\n\n    auto& modName = filenameParts[3];\n\n    FILETIME creationTime;\n    std::wstring metadata = GetMetadataContent(filePath.c_str(), &creationTime);\n\n    PCWSTR processName = metadata.c_str();\n    PCWSTR status = L\"\";\n\n    auto separator = metadata.find(L'|');\n    if (separator != metadata.npos) {\n        metadata[separator] = L'\\0';\n        status = metadata.c_str() + separator + 1;\n    }\n\n    AddItemToList(itemIndex, filePath.c_str(), modName.c_str(), processName,\n                  targetProcessId, status, creationTime);\n    return true;\n}\n\nvoid CTaskManagerDlg::AddItemToList(int itemIndex,\n                                    PCWSTR filePath,\n                                    PCWSTR mod,\n                                    PCWSTR processName,\n                                    DWORD processId,\n                                    PCWSTR status,\n                                    FILETIME creationTime) {\n    std::wstring processNameFormatted = processName;\n    bool isFrozen = IsProcessFrozen(processId);\n    if (isFrozen) {\n        processNameFormatted += L' ';\n        processNameFormatted +=\n            Functions::LoadStrFromRsrc(IDS_TASKDLG_PROCESS_SUSPENDED);\n    }\n\n    m_taskListSort.AddItem(itemIndex, 0, mod);\n    m_taskListSort.AddItem(itemIndex, 1, processNameFormatted.c_str());\n    m_taskListSort.AddItem(itemIndex, 2, std::to_wstring(processId).c_str());\n    m_taskListSort.AddItem(itemIndex, 3, LocalizeStatus(status).c_str());\n\n    // The process handle must be kept alive while the request is active.\n    // Otherwise, a BSOD might occur in Windows 10.\n    wil::unique_process_handle executionRequiredRequestProcess;\n    wil::unique_handle executionRequiredRequest;\n    if (Functions::IsWindowsVersionOrGreaterWithBuildNumber(10, 0, 0)) {\n        executionRequiredRequestProcess.reset(\n            OpenProcess(PROCESS_SET_LIMITED_INFORMATION, FALSE, processId));\n        if (executionRequiredRequestProcess) {\n            HRESULT hr = Functions::CreateExecutionRequiredRequest(\n                executionRequiredRequestProcess.get(),\n                executionRequiredRequest.put());\n            if (FAILED(hr) || !executionRequiredRequest) {\n                LOG(L\"Failed to create execution required request: %08X\", hr);\n                executionRequiredRequest.reset();\n                executionRequiredRequestProcess.reset();\n            }\n        }\n    }\n\n    auto* itemData = new ListItemData{\n        .filePath = filePath,\n        .processName = processName,\n        .processId = processId,\n        .creationTime = wil::filetime::to_int64(creationTime),\n        .isFrozen = isFrozen,\n        .executionRequiredRequestProcess =\n            std::move(executionRequiredRequestProcess),\n        .executionRequiredRequest = std::move(executionRequiredRequest),\n    };\n    m_taskListSort.SetItemData(itemIndex,\n                               reinterpret_cast<DWORD_PTR>(itemData));\n}\n\nvoid CTaskManagerDlg::RefreshTaskList() {\n    try {\n        LoadTaskList();\n    } catch (const std::exception& e) {\n        if (!m_dialogOptions.autonomousMode) {\n            ::MessageBoxA(m_hWnd, e.what(), \"Failed to update data\",\n                          MB_ICONERROR);\n        } else {\n            LOG(L\"%S\", e.what());\n        }\n        DestroyWindow();\n        return;\n    }\n\n    UpdateDialogAfterListUpdate();\n}\n\nvoid CTaskManagerDlg::UpdateTaskListProcessesStatus() {\n    bool updated = false;\n\n    int itemCount = m_taskListSort.GetItemCount();\n    for (int i = 0; i < itemCount; i++) {\n        auto* itemData =\n            reinterpret_cast<ListItemData*>(m_taskListSort.GetItemData(i));\n\n        bool isFrozen = IsProcessFrozen(itemData->processId);\n        if (isFrozen == itemData->isFrozen) {\n            continue;\n        }\n\n        itemData->isFrozen = isFrozen;\n\n        std::wstring processNameFormatted = itemData->processName;\n        if (isFrozen) {\n            processNameFormatted += L' ';\n            processNameFormatted +=\n                Functions::LoadStrFromRsrc(IDS_TASKDLG_PROCESS_SUSPENDED);\n        }\n\n        m_taskListSort.SetItemText(i, 1, processNameFormatted.c_str());\n\n        updated = true;\n    }\n\n    if (updated) {\n        UpdateDialogAfterListUpdate();\n    }\n}\n\nvoid CTaskManagerDlg::UpdateDialogAfterListUpdate() {\n    if (!m_dialogOptions.autonomousMode) {\n        return;\n    }\n\n    int itemCount = m_taskListSort.GetItemCount();\n    if (itemCount == 0) {\n        DestroyWindow();\n        return;\n    }\n\n    bool allProcessesAreFrozen = true;\n    for (int i = 0; i < itemCount; i++) {\n        auto* itemData =\n            reinterpret_cast<ListItemData*>(m_taskListSort.GetItemData(i));\n        if (!itemData->isFrozen) {\n            allProcessesAreFrozen = false;\n            break;\n        }\n    }\n\n    if (allProcessesAreFrozen) {\n        if (m_showDlgPending) {\n            KillTimer(Timer::kShowDlg);\n            m_showDlgPending = false;\n        }\n\n        ShowWindow(SW_HIDE);\n        return;\n    }\n\n    if (!IsWindowVisible()) {\n        // Set timer to show the dialog. The delay is the defined amount of\n        // delay in autonomousModeShowDelay, minus the earliest item age. This\n        // is to avoid showing the dialog when items come and go - the delay\n        // will always be updated and the dialog will never be shown.\n\n        ULONGLONG earliestCreationTime = ULONGLONG_MAX;\n        for (int i = 0; i < itemCount; i++) {\n            auto* itemData =\n                reinterpret_cast<ListItemData*>(m_taskListSort.GetItemData(i));\n            ULONGLONG creationTime = itemData->creationTime;\n            if (creationTime < earliestCreationTime) {\n                earliestCreationTime = creationTime;\n            }\n        }\n\n        ULONGLONG currentTime =\n            wil::filetime::to_int64(wil::filetime::get_system_time());\n\n        UINT delay = std::max(m_dialogOptions.autonomousModeShowDelay,\n                              kAutonomousModeShowDelayMin);\n\n        if (earliestCreationTime <= currentTime) {\n            ULONGLONG msSinceEarliestCreationTime =\n                wil::filetime::convert_100ns_to_msec(currentTime -\n                                                     earliestCreationTime);\n\n            if (msSinceEarliestCreationTime >= delay) {\n                delay = 0;\n            } else {\n                delay -= static_cast<UINT>(msSinceEarliestCreationTime);\n            }\n        }\n\n        SetTimer(Timer::kShowDlg, delay);\n        m_showDlgPending = true;\n    }\n}\n"
  },
  {
    "path": "src/windhawk/app/task_manager_dlg.h",
    "content": "#pragma once\n\n#include \"resource.h\"\n\nclass CTaskManagerDlg : public CDialogImpl<CTaskManagerDlg>,\n                        public CDialogResize<CTaskManagerDlg> {\n   public:\n    enum { IDD = IDD_TASK_MANAGER };\n\n    BEGIN_DLGRESIZE_MAP(CTaskManagerDlg)\n        DLGRESIZE_CONTROL(IDC_TASK_LIST, DLSZ_SIZE_X | DLSZ_SIZE_Y)\n        DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X | DLSZ_MOVE_Y)\n    END_DLGRESIZE_MAP()\n\n    enum class DataSource {\n        kModStatus,\n        kModTask,\n    };\n\n    using DlgCallback = std::function<void(HWND)>;\n\n    // Wait before showing the autonomous dialog in case the data is short\n    // lived.\n    static constexpr int kAutonomousModeShowDelayDefault = 2000;\n    static constexpr int kAutonomousModeShowDelayMin = 400;\n\n    struct DialogOptions {\n        DataSource dataSource = DataSource::kModStatus;\n        bool autonomousMode = false;\n        int autonomousModeShowDelay = kAutonomousModeShowDelayDefault;\n        DWORD sessionManagerProcessId{};\n        ULONGLONG sessionManagerProcessCreationTime{};\n        DlgCallback runButtonCallback;\n        DlgCallback finalMessageCallback;\n    };\n\n    static bool IsDataSourceEmpty(DataSource dataSource);\n\n    CTaskManagerDlg(DialogOptions dialogOptions);\n\n    void LoadLanguageStrings();\n    void DataChanged();\n\n   private:\n    enum class Timer {\n        kUpdateProcessesStatus = 1,\n        kRefreshList,\n        kShowDlg,\n    };\n\n    BEGIN_MSG_MAP_EX(CTaskManagerDlg)\n        CHAIN_MSG_MAP(CDialogResize<CTaskManagerDlg>)\n        MSG_WM_INITDIALOG(OnInitDialog)\n        MSG_WM_DESTROY(OnDestroy)\n        MSG_WM_TIMER(OnTimer)\n        MSG_WM_DPICHANGED(OnDpiChanged)\n        COMMAND_ID_HANDLER_EX(IDOK, OnOK)\n        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)\n        NOTIFY_HANDLER_EX(IDC_TASK_LIST, NM_RCLICK, OnListRightClick)\n    END_MSG_MAP()\n\n    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);\n    void OnDestroy();\n    void OnTimer(UINT_PTR nIDEvent);\n    void OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect);\n    void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl);\n    void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl);\n    LRESULT OnListRightClick(LPNMHDR pnmh);\n\n    void OnFinalMessage(HWND hWnd) override;\n    UINT_PTR SetTimer(Timer nIDEvent,\n                      UINT nElapse,\n                      TIMERPROC lpfnTimer = nullptr);\n    BOOL KillTimer(Timer nIDEvent);\n    void ReloadMainIcon();\n    void PlaceWindowAtTrayArea();\n    void InitTaskList();\n    void LoadTaskList();\n    bool LoadTaskItemFromMetadataFile(const std::filesystem::path& filePath,\n                                      int itemIndex);\n    void AddItemToList(int itemIndex,\n                       PCWSTR filePath,\n                       PCWSTR mod,\n                       PCWSTR processName,\n                       DWORD processId,\n                       PCWSTR status,\n                       FILETIME creationTime);\n    void RefreshTaskList();\n    void UpdateTaskListProcessesStatus();\n    void UpdateDialogAfterListUpdate();\n\n    const DialogOptions m_dialogOptions;\n    CSortListViewCtrl m_taskListSort;\n    bool m_refreshListOnDataChangePending = false;\n    bool m_showDlgPending = false;\n};\n"
  },
  {
    "path": "src/windhawk/app/toolkit_dlg.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"toolkit_dlg.h\"\n\n#include \"functions.h\"\n\nnamespace {\n\nint AutoSizeStaticHeight(CStatic stat) {\n    CRect rc;\n    stat.GetWindowRect(&rc);\n\n    CString str;\n    stat.GetWindowText(str);\n\n    CRect rcNew(rc);\n    {\n        CDC dc = stat.GetDC();\n        CFontHandle oldFont(dc.SelectFont(stat.GetFont()));\n        dc.DrawText(str, str.GetLength(), &rcNew,\n                    DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_CALCRECT);\n        dc.SelectFont(oldFont);\n    }\n\n    if (rcNew.Height() == rc.Height()) {\n        return 0;\n    }\n\n    stat.SetWindowPos(NULL, 0, 0, rc.Width(), rcNew.Height(),\n                      SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);\n    return rcNew.Height() - rc.Height();\n}\n\n}  // namespace\n\nCToolkitDlg::CToolkitDlg(DialogOptions dialogOptions)\n    : m_dialogOptions(std::move(dialogOptions)) {}\n\nvoid CToolkitDlg::LoadLanguageStrings() {\n    SetWindowText(Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_TITLE));\n\n    SetDlgItemText(IDOK,\n                   Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_BUTTON_OPEN));\n    SetDlgItemText(\n        IDC_TOOLKIT_LOADED_MODS,\n        Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_BUTTON_LOADED_MODS));\n    SetDlgItemText(IDC_TOOLKIT_EXIT,\n                   Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_BUTTON_EXIT));\n    SetDlgItemText(IDC_TOOLKIT_SAFE_MODE,\n                   Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_BUTTON_SAFE_MODE));\n    SetDlgItemText(IDC_TOOLKIT_CLOSE,\n                   Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_BUTTON_CLOSE));\n\n    if (m_dialogOptions.showTaskbarCrashExplanation) {\n        UINT windowDpi = Functions::GetDpiForWindowWithFallback(m_hWnd);\n        const int extraWidth = MulDiv(100, windowDpi, 96);\n        CRect rc;\n\n        CStatic explanationStatic{GetDlgItem(IDC_TOOLKIT_EXPLANATION)};\n\n        explanationStatic.GetWindowRect(&rc);\n        explanationStatic.SetWindowPos(\n            nullptr, 0, 0, rc.Width() + extraWidth, rc.Height(),\n            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);\n\n        explanationStatic.SetWindowText(\n            Functions::LoadStrFromRsrc(IDS_TOOLKITDLG_EXPLANATION_CRASH));\n        AutoSizeStaticHeight(explanationStatic);\n        explanationStatic.ShowWindow(SW_SHOW);\n        explanationStatic.GetWindowRect(&rc);\n        int offsetY = rc.Height() + MulDiv(12, windowDpi, 96);\n\n        for (int controlId : {\n                 IDOK,\n                 IDC_TOOLKIT_LOADED_MODS,\n                 IDC_TOOLKIT_EXIT,\n                 IDC_TOOLKIT_SAFE_MODE,\n                 IDC_TOOLKIT_CLOSE,\n             }) {\n            CWindow control = GetDlgItem(controlId);\n            control.GetWindowRect(&rc);\n            ::MapWindowPoints(nullptr, m_hWnd, (POINT*)&rc, 2);\n            CPoint ptMove = rc.TopLeft();\n            ptMove.Offset(extraWidth / 2, offsetY);\n            control.SetWindowPos(nullptr, ptMove.x, ptMove.y, 0, 0,\n                                 SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);\n        }\n\n        GetWindowRect(&rc);\n        rc.top -= offsetY / 2;\n        rc.bottom += offsetY / 2 + offsetY % 2;\n        rc.left -= extraWidth / 2;\n        rc.right += extraWidth / 2 + extraWidth % 2;\n        SetWindowPos(nullptr, rc, SWP_NOZORDER | SWP_NOACTIVATE);\n    }\n\n    bool languageRightToLeft =\n        Functions::IsRightToLeftLanguage(GetThreadUILanguage());\n    Functions::ApplyDialogLayoutRtl(*this, languageRightToLeft);\n}\n\nbool CToolkitDlg::WasActive() {\n    return m_wasActive;\n}\n\nvoid CToolkitDlg::Close() {\n    DestroyWindow();\n}\n\nBOOL CToolkitDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) {\n    ReloadMainIcon();\n\n    SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0,\n                 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);\n\n    // PlaceWindowAtTrayArea();\n    CenterWindow();\n\n    LoadLanguageStrings();\n\n    return !m_dialogOptions.createInactive;\n}\n\nvoid CToolkitDlg::OnDestroy() {\n    // From GDI handle checks, not all icons are freed automatically.\n    ::DestroyIcon(SetIcon(nullptr, TRUE));\n    ::DestroyIcon(SetIcon(nullptr, FALSE));\n}\n\nvoid CToolkitDlg::OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther) {\n    switch (nState) {\n        case WA_ACTIVE:\n        case WA_CLICKACTIVE:\n            m_wasActive = true;\n            break;\n    }\n}\n\nvoid CToolkitDlg::OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect) {\n    ReloadMainIcon();\n}\n\nvoid CToolkitDlg::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.runButtonCallback) {\n        m_dialogOptions.runButtonCallback(m_hWnd);\n    }\n}\n\nvoid CToolkitDlg::OnLoadedMods(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.loadedModsButtonCallback) {\n        m_dialogOptions.loadedModsButtonCallback(m_hWnd);\n    }\n}\n\nvoid CToolkitDlg::OnExit(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.exitButtonCallback) {\n        m_dialogOptions.exitButtonCallback(m_hWnd);\n    }\n}\n\nvoid CToolkitDlg::OnSafeMode(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    if (m_dialogOptions.safeModeButtonCallback) {\n        m_dialogOptions.safeModeButtonCallback(m_hWnd);\n    }\n}\n\nvoid CToolkitDlg::OnClose(UINT uNotifyCode, int nID, CWindow wndCtl) {\n    Close();\n}\n\nvoid CToolkitDlg::OnFinalMessage(HWND hWnd) {\n    if (m_dialogOptions.finalMessageCallback) {\n        m_dialogOptions.finalMessageCallback(m_hWnd);\n    }\n}\n\nvoid CToolkitDlg::ReloadMainIcon() {\n    UINT dpi = Functions::GetDpiForWindowWithFallback(m_hWnd);\n\n    CIconHandle mainIcon;\n    mainIcon.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi));\n    CIcon prevMainIcon = SetIcon(mainIcon, TRUE);\n\n    CIconHandle mainIconSmall;\n    mainIconSmall.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi));\n    CIcon prevMainIconSmall = SetIcon(mainIconSmall, FALSE);\n}\n\nvoid CToolkitDlg::PlaceWindowAtTrayArea() {\n    CRect windowRect;\n    GetWindowRect(&windowRect);\n\n    CRect workAreaRect;\n    ::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0);\n\n    int margin = 8;\n\n    windowRect.MoveToXY(workAreaRect.right - windowRect.Width() - margin,\n                        workAreaRect.bottom - windowRect.Height() - margin);\n\n    SetWindowPos(nullptr, windowRect,\n                 SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);\n}\n"
  },
  {
    "path": "src/windhawk/app/toolkit_dlg.h",
    "content": "#pragma once\n\n#include \"resource.h\"\n\nclass CToolkitDlg : public CDialogImpl<CToolkitDlg> {\n   public:\n    enum { IDD = IDD_TOOLKIT };\n\n    using DlgCallback = std::function<void(HWND)>;\n\n    struct DialogOptions {\n        bool createInactive = false;\n        bool showTaskbarCrashExplanation = false;\n        DlgCallback runButtonCallback;\n        DlgCallback loadedModsButtonCallback;\n        DlgCallback exitButtonCallback;\n        DlgCallback safeModeButtonCallback;\n        DlgCallback finalMessageCallback;\n    };\n\n    CToolkitDlg(DialogOptions dialogOptions);\n\n    void LoadLanguageStrings();\n\n    bool WasActive();\n    void Close();\n\n   private:\n    BEGIN_MSG_MAP_EX(CToolkitDlg)\n        MSG_WM_INITDIALOG(OnInitDialog)\n        MSG_WM_DESTROY(OnDestroy)\n        MSG_WM_ACTIVATE(OnActivate)\n        MSG_WM_DPICHANGED(OnDpiChanged)\n        COMMAND_ID_HANDLER_EX(IDOK, OnOK)\n        COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_LOADED_MODS, OnLoadedMods)\n        COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_EXIT, OnExit)\n        COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_SAFE_MODE, OnSafeMode)\n        COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_CLOSE, OnClose)\n    END_MSG_MAP()\n\n    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);\n    void OnDestroy();\n    void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther);\n    void OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect);\n    void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl);\n    void OnLoadedMods(UINT uNotifyCode, int nID, CWindow wndCtl);\n    void OnExit(UINT uNotifyCode, int nID, CWindow wndCtl);\n    void OnSafeMode(UINT uNotifyCode, int nID, CWindow wndCtl);\n    void OnClose(UINT uNotifyCode, int nID, CWindow wndCtl);\n\n    void OnFinalMessage(HWND hWnd) override;\n    void ReloadMainIcon();\n    void PlaceWindowAtTrayArea();\n\n    const DialogOptions m_dialogOptions;\n    bool m_wasActive = false;\n};\n"
  },
  {
    "path": "src/windhawk/app/tray_icon.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"tray_icon.h\"\n\n#include \"functions.h\"\n#include \"resource.h\"\n\nAppTrayIcon::AppTrayIcon(HWND hWnd,\n                         UINT uCallbackMsg,\n                         bool hidden /*= false*/) {\n    ReloadIcons(hWnd);\n\n    m_nid.cbSize = sizeof(NOTIFYICONDATA);\n    m_nid.hWnd = hWnd;\n    m_nid.uID = 1;\n    m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_STATE | NIF_SHOWTIP;\n    m_nid.uCallbackMessage = uCallbackMsg;\n    m_nid.hIcon = m_trayIcon;\n    m_nid.uVersion = NOTIFYICON_VERSION_4;\n    wcscpy_s(m_nid.szTip, L\"Windhawk\");\n    m_nid.dwState = hidden ? NIS_HIDDEN : 0;\n    m_nid.dwStateMask = NIS_HIDDEN;\n    m_nid.hBalloonIcon = m_balloonIcon;\n}\n\nvoid AppTrayIcon::Create() {\n    Shell_NotifyIcon(NIM_ADD, &m_nid);\n    Shell_NotifyIcon(NIM_SETVERSION, &m_nid);\n}\n\nvoid AppTrayIcon::Modify() {\n    Shell_NotifyIcon(NIM_MODIFY, &m_nid);\n}\n\nvoid AppTrayIcon::UpdateIcons(HWND hWnd) {\n    bool usingNotificationIcon = m_nid.hIcon == m_trayIconWithNotification;\n\n    ReloadIcons(hWnd);\n\n    if (usingNotificationIcon) {\n        m_nid.hIcon = m_trayIconWithNotification;\n    } else {\n        m_nid.hIcon = m_trayIcon;\n    }\n\n    m_nid.hBalloonIcon = m_balloonIcon;\n}\n\nvoid AppTrayIcon::Hide(bool hidden) {\n    if (hidden) {\n        m_nid.dwState |= NIS_HIDDEN;\n    } else {\n        m_nid.dwState &= ~NIS_HIDDEN;\n    }\n\n    Shell_NotifyIcon(NIM_MODIFY, &m_nid);\n}\n\nvoid AppTrayIcon::SetNotificationIconAndTooltip(PCWSTR pText) {\n    if (pText) {\n        m_nid.hIcon = m_trayIconWithNotification;\n        _snwprintf_s(m_nid.szTip, _TRUNCATE, L\"%s - Windhawk\", pText);\n    } else {\n        m_nid.hIcon = m_trayIcon;\n        wcscpy_s(m_nid.szTip, L\"Windhawk\");\n    }\n\n    Shell_NotifyIcon(NIM_MODIFY, &m_nid);\n}\n\nvoid AppTrayIcon::ShowNotificationMessage(PCWSTR pText) {\n    m_nid.uFlags |= NIF_INFO;\n    wcsncpy_s(m_nid.szInfo, pText, _TRUNCATE);\n    wcscpy_s(m_nid.szInfoTitle, L\"Windhawk\");\n    m_nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;\n\n    Shell_NotifyIcon(NIM_MODIFY, &m_nid);\n\n    m_nid.uFlags &= ~NIF_INFO;\n}\n\nvoid AppTrayIcon::Remove() {\n    Shell_NotifyIcon(NIM_DELETE, &m_nid);\n}\n\nAppTrayIcon::TrayAction AppTrayIcon::HandleMsg(WPARAM wParam, LPARAM lParam) {\n    DWORD tickCount;\n    WORD notificationEvent = LOWORD(lParam);\n    switch (notificationEvent) {\n        case NIN_SELECT:\n        case NIN_KEYSELECT:\n            // Prevent multiple actions for accidental double clicks.\n            tickCount = GetTickCount();\n            if (tickCount - m_lastClickTickCount <= 400) {\n                return TrayAction::kNone;\n            }\n\n            m_lastClickTickCount = tickCount;\n            return TrayAction::kDefault;\n\n        case NIN_BALLOONUSERCLICK:\n            return TrayAction::kBalloon;\n\n        case WM_CONTEXTMENU:\n            return TrayAction::kContextMenu;\n    }\n\n    return TrayAction::kNone;\n}\n\nvoid AppTrayIcon::ReloadIcons(HWND hWnd) {\n    HWND hTaskbarWnd = FindWindow(L\"Shell_TrayWnd\", nullptr);\n    UINT dpi = Functions::GetDpiForWindowWithFallback(hTaskbarWnd ? hTaskbarWnd\n                                                                  : hWnd);\n\n    m_trayIcon = nullptr;\n    m_trayIcon.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi));\n\n    m_balloonIcon = nullptr;\n    m_balloonIcon.LoadIconWithScaleDown(\n        IDR_MAINFRAME,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi));\n\n    m_trayIconWithNotification = nullptr;\n    m_trayIconWithNotification.LoadIconWithScaleDown(\n        IDI_NOTIFICATION,\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi),\n        Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi));\n}\n"
  },
  {
    "path": "src/windhawk/app/tray_icon.h",
    "content": "#pragma once\n\nclass AppTrayIcon {\n   public:\n    enum class TrayAction {\n        kNone,\n        kDefault,\n        kBalloon,\n        kContextMenu,\n    };\n\n    static inline constexpr size_t kMaxNotificationTooltipSize =\n        ARRAYSIZE(NOTIFYICONDATA::szInfo);\n\n    AppTrayIcon(HWND hWnd, UINT uCallbackMsg, bool hidden = false);\n\n    void Create();\n    void Modify();\n    void UpdateIcons(HWND hWnd);\n    void Hide(bool hidden);\n    void SetNotificationIconAndTooltip(PCWSTR pText);\n    void ShowNotificationMessage(PCWSTR pText);\n    void Remove();\n    TrayAction HandleMsg(WPARAM wParam, LPARAM lParam);\n\n   private:\n    void ReloadIcons(HWND hWnd);\n\n    CIcon m_trayIcon;\n    CIcon m_balloonIcon;\n    CIcon m_trayIconWithNotification;\n    NOTIFYICONDATA m_nid{};\n    DWORD m_lastClickTickCount = 0;\n};\n"
  },
  {
    "path": "src/windhawk/app/ui_control.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"ui_control.h\"\n\n#include \"logger.h\"\n#include \"storage_manager.h\"\n\nusing json = nlohmann::ordered_json;\n\nnamespace {\n\nconst json uiSettings = {\n    {\"telemetry.telemetryLevel\", \"off\"},\n    {\"update.mode\", \"none\"},\n    {\"update.showReleaseNotes\", false},\n    {\"extensions.autoCheckUpdates\", false},\n    {\"extensions.autoUpdate\", false},\n    {\"files.autoSave\", \"afterDelay\"},\n    {\"window.title\", \"${dirty}${activeEditorShort}${separator}${appName}\"},\n    {\"workbench.enableExperiments\", false},\n    {\"workbench.settings.enableNaturalLanguageSearch\", false},\n    {\"workbench.editor.restoreViewState\", false},\n    {\"workbench.tips.enabled\", false},\n    {\"workbench.startupEditor\", \"none\"},\n    {\"workbench.layoutControl.enabled\", false},\n    {\"security.workspace.trust.enabled\", false},\n    {\"editor.inlayHints.enabled\", \"off\"},\n    {\"editor.tabSize\", 4},\n    {\"editor.insertSpaces\", true},\n    {\"editor.detectIndentation\", false},\n    {\"clangd.path\", \"${env:WINDHAWK_COMPILER_PATH}\\\\bin\\\\clangd.exe\"},\n    {\"clangd.arguments\", {\"-header-insertion=never\"}},\n    {\"clangd.checkUpdates\", false},\n    {\"window.menuBarVisibility\", \"compact\"},\n    {\"workbench.activityBar.visible\", false},\n    {\"workbench.editor.showTabs\", false},\n    {\"workbench.statusBar.visible\", false},\n    {\"git.enabled\", false},\n    {\"git.showProgress\", false},\n    {\"git.decorations.enabled\", false},\n    {\"git.ignoreMissingGitWarning\", true},\n    {\"git.ignoreLegacyWarning\", true},\n    {\"git.ignoreWindowsGit27Warning\", true},\n};\n\nconst json uiSettingsToMigrate = {\n    {\"clangd.path\",\n     \"${env:WINDHAWK_UI_PATH}\"\n     \"\\\\resources\\\\app\\\\extensions\\\\clangd\\\\clangd\\\\bin\\\\clangd.exe\"},\n};\n\nvoid MakeSureDirectoryExists(const std::filesystem::path& directory) {\n    if (!std::filesystem::is_directory(directory)) {\n        try {\n            std::filesystem::create_directories(directory);\n        } catch (const std::exception&) {\n            if (!std::filesystem::is_directory(directory)) {\n                throw;\n            }\n\n            // An exception was thrown, but the folder now exists. This\n            // can happen when e.g. not all the path is accessible.\n        }\n    }\n}\n\nvoid PrepareUISettings(const std::filesystem::path& uiDataPath) {\n    std::filesystem::path settingsPath = uiDataPath / L\"user-data\" / L\"User\";\n    MakeSureDirectoryExists(settingsPath);\n\n    settingsPath /= L\"settings.json\";\n\n    json settingsJson;\n\n    {\n        std::ifstream settingsFile(settingsPath);\n        if (settingsFile) {\n            try {\n                settingsFile >> settingsJson;\n            } catch (const std::exception& e) {\n                LOG(L\"Parsing settings.json failed: %S\", e.what());\n            }\n        }\n    }\n\n    if (!settingsJson.is_object()) {\n        settingsJson = json::object();\n    }\n\n    bool updatedData = false;\n\n    for (auto& [key, value] : uiSettings.items()) {\n        bool updateValue = !settingsJson.contains(key);\n        if (!updateValue) {\n            auto it = uiSettingsToMigrate.find(key);\n            if (it != uiSettingsToMigrate.end() && settingsJson[key] == *it) {\n                updateValue = true;\n            }\n        }\n\n        if (updateValue) {\n            settingsJson[key] = value;\n            updatedData = true;\n        }\n    }\n\n    if (updatedData) {\n        std::ofstream userProfileFile(settingsPath);\n        if (userProfileFile) {\n            userProfileFile << std::setw(4) << settingsJson;\n        }\n    }\n}\n\nBOOL IsArm64NativeMachine() {\n    using IsWow64Process2_t = BOOL(WINAPI*)(\n        HANDLE hProcess, USHORT * pProcessMachine, USHORT * pNativeMachine);\n\n    IsWow64Process2_t pIsWow64Process2 = nullptr;\n    HMODULE kernel32Module = GetModuleHandle(L\"kernel32.dll\");\n    if (kernel32Module) {\n        pIsWow64Process2 = reinterpret_cast<IsWow64Process2_t>(\n            GetProcAddress(kernel32Module, \"IsWow64Process2\"));\n    }\n\n    if (!pIsWow64Process2) {\n        // ARM64 OSes should have IsWow64Process2.\n        return FALSE;\n    }\n\n    USHORT processMachine = 0;\n    USHORT nativeMachine = 0;\n    return pIsWow64Process2(GetCurrentProcess(), &processMachine,\n                            &nativeMachine) &&\n           nativeMachine == IMAGE_FILE_MACHINE_ARM64;\n}\n\n}  // namespace\n\nnamespace UIControl {\n\nvoid RunUI() {\n    auto uiDataPath = StorageManager::GetInstance().GetUIDataPath();\n    PrepareUISettings(uiDataPath);\n\n    // Will be passed to VSCode to make it use the specified folder for data\n    // storage.\n    SetEnvironmentVariable(L\"VSCODE_PORTABLE\", uiDataPath.c_str());\n\n    // Will be used to locate the clangd executable.\n    auto uiPath = StorageManager::GetInstance().GetUIPath();\n    SetEnvironmentVariable(L\"WINDHAWK_UI_PATH\", uiPath.c_str());\n\n    auto compilerPath = StorageManager::GetInstance().GetCompilerPath();\n    SetEnvironmentVariable(L\"WINDHAWK_COMPILER_PATH\", compilerPath.c_str());\n\n    static bool arm64Enabled = IsArm64NativeMachine();\n    if (arm64Enabled) {\n        SetEnvironmentVariable(L\"WINDHAWK_ARM64_ENABLED\", L\"1\");\n    }\n\n    auto uiExePath = uiPath / L\"VSCodium.exe\";\n\n    // If the VSCodium executable doesn't exist, try the VSCode executable.\n    if (GetFileAttributes(uiExePath.c_str()) == INVALID_FILE_ATTRIBUTES &&\n        GetLastError() == ERROR_FILE_NOT_FOUND) {\n        uiExePath = uiPath / L\"Code.exe\";\n\n        // If VSCode executable doesn't exist, give up.\n        THROW_LAST_ERROR_IF(GetFileAttributes(uiExePath.c_str()) ==\n                                INVALID_FILE_ATTRIBUTES &&\n                            GetLastError() == ERROR_FILE_NOT_FOUND);\n    }\n\n    auto editorWorkspacePath =\n        StorageManager::GetInstance().GetEditorWorkspacePath();\n    MakeSureDirectoryExists(editorWorkspacePath);\n\n    // The --locale command line switch is needed to avoid the \"Install\n    // language pack to change the display language\" message if the OS\n    // locale is not English.\n    //\n    // The --no-sandbox, --disable-gpu-sandbox command line switches seem to fix\n    // a bug that sometimes causes VSCode to be stuck with an empty window when\n    // launched:\n    // https://github.com/ramensoftware/windhawk/issues/26\n    // VSCode reference:\n    // https://github.com/microsoft/vscode/issues/122951\n    // Also, from the FAQ:\n    // > Q: Unable to run as admin when AppLocker is enabled\n    // > A: With the introduction of process sandboxing (discussed in this blog\n    // post) running as administrator is currently unsupported when AppLocker is\n    // configured due to a limitation of the runtime sandbox. You can refer to\n    // Chromium issue #740132 for additional context. If your work requires that\n    // you run VS Code from an elevated terminal, you can launch code with\n    // --no-sandbox --disable-gpu-sandbox as a workaround.\n    // https://github.com/microsoft/vscode-docs/blob/vnext/docs/setup/windows.md#unable-to-run-as-admin-when-applocker-is-enabled\n    std::wstring commandLine =\n        L\"\\\"\" + uiExePath.native() + L\"\\\" \\\"\" + editorWorkspacePath.native() +\n        L\"\\\" --locale=en --no-sandbox --disable-gpu-sandbox\";\n\n    STARTUPINFO si = {sizeof(STARTUPINFO)};\n    wil::unique_process_information process;\n\n    THROW_IF_WIN32_BOOL_FALSE(CreateProcess(\n        uiExePath.c_str(), commandLine.data(), nullptr, nullptr, FALSE,\n        NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &process));\n}\n\nbool RunUIViaSchedTask() {\n    // Access the Windows Task Service API by creating an instance of it and\n    // attempt to connect to the Task Scheduler service on the local machine.\n    wil::com_ptr<ITaskService> taskService =\n        wil::CoCreateInstance<ITaskService>(CLSID_TaskScheduler);\n    THROW_IF_FAILED(taskService->Connect(_variant_t(), _variant_t(),\n                                         _variant_t(), _variant_t()));\n\n    // Get a pointer to the root task folder, which is where the task resides.\n    auto rootFolderPath = wil::make_bstr(L\"\\\\\");\n    wil::com_ptr<ITaskFolder> rootFolder;\n    THROW_IF_FAILED(taskService->GetFolder(rootFolderPath.get(), &rootFolder));\n\n    auto taskName = wil::make_bstr(L\"WindhawkRunUITask\");\n    wil::com_ptr<IRegisteredTask> task;\n    THROW_IF_FAILED(rootFolder->GetTask(taskName.get(), &task));\n\n    AllowSetForegroundWindow(ASFW_ANY);\n\n    wil::com_ptr<IRunningTask> runTask;\n    HRESULT hr =\n        task->RunEx(_variant_t(), TASK_RUN_AS_SELF, 0, _bstr_t(), &runTask);\n    if (hr == SCHED_E_TASK_DISABLED) {\n        return false;\n    }\n\n    THROW_IF_FAILED(hr);\n    return true;\n}\n\nstd::vector<HWND> GetOpenUIWindows() {\n    struct EnumWindowsParam {\n        std::filesystem::path uiExePath1;\n        std::filesystem::path uiExePath2;\n        std::vector<HWND> windows;\n    };\n\n    auto uiPath = StorageManager::GetInstance().GetUIPath();\n\n    EnumWindowsParam enumWindowsParam = {uiPath / L\"VSCodium.exe\",\n                                         uiPath / L\"Code.exe\"};\n\n    EnumWindows(\n        [](HWND hWnd, LPARAM lParam) {\n            auto& enumWindowsParam =\n                *reinterpret_cast<EnumWindowsParam*>(lParam);\n\n            if (!IsWindowVisible(hWnd)) {\n                return TRUE;\n            }\n\n            WCHAR szClassName[32];\n            if (!GetClassName(hWnd, szClassName, _countof(szClassName)) ||\n                _wcsicmp(szClassName, L\"Chrome_WidgetWin_1\") != 0) {\n                return TRUE;\n            }\n\n            DWORD dwProceccID;\n            if (!GetWindowThreadProcessId(hWnd, &dwProceccID)) {\n                return TRUE;\n            }\n\n            try {\n                wil::unique_process_handle process(OpenProcess(\n                    PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProceccID));\n                if (!process) {\n                    return TRUE;\n                }\n\n                std::filesystem::path fullProcessImageName =\n                    wil::QueryFullProcessImageName<std::wstring>(process.get());\n\n                std::error_code ec;\n                if (std::filesystem::equivalent(fullProcessImageName,\n                                                enumWindowsParam.uiExePath1,\n                                                ec) ||\n                    std::filesystem::equivalent(fullProcessImageName,\n                                                enumWindowsParam.uiExePath2,\n                                                ec)) {\n                    enumWindowsParam.windows.push_back(hWnd);\n                }\n            } catch (const std::exception& e) {\n                LOG(L\"EnumWindows callback failed for window %08X: %S\",\n                    static_cast<DWORD>(reinterpret_cast<ULONG_PTR>(hWnd)),\n                    e.what());\n            }\n\n            return TRUE;\n        },\n        reinterpret_cast<LPARAM>(&enumWindowsParam));\n\n    return enumWindowsParam.windows;\n}\n\nbool BringUIToFront() {\n    auto windows = GetOpenUIWindows();\n    if (windows.size() == 0) {\n        return false;\n    }\n\n    for (HWND hWnd : windows) {\n        if (IsIconic(hWnd)) {\n            PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);\n        }\n\n        SetForegroundWindow(hWnd);\n    }\n\n    return true;\n}\n\nvoid RunUIOrBringToFront(HWND hWnd, bool mustRunAsAdmin) {\n    // If running, just bring to front.\n    if (UIControl::BringUIToFront()) {\n        return;\n    }\n\n    // If possible, just run the process.\n    if (!mustRunAsAdmin) {\n        UIControl::RunUI();\n        return;\n    }\n\n    // Try to trigger the scheduled task to avoid elevation.\n    try {\n        if (UIControl::RunUIViaSchedTask()) {\n            return;\n        }\n    } catch (const std::exception& e) {\n        LOG(L\"RunUIViaSchedTask error: %S\", e.what());\n    }\n\n    // Elevate and run a process that will start the UI.\n    auto modulePath = wil::GetModuleFileName<std::wstring>();\n    PCWSTR commandLine = L\"-run-ui\";\n\n    int nResult =\n        (int)(UINT_PTR)ShellExecute(hWnd, L\"runas\", modulePath.c_str(),\n                                    commandLine, nullptr, SW_SHOWNORMAL);\n\n    THROW_LAST_ERROR_IF(nResult <= 32 && GetLastError() != ERROR_CANCELLED);\n}\n\nbool CloseUI() {\n    auto windows = GetOpenUIWindows();\n    bool succeeded = false;\n\n    for (HWND hWnd : windows) {\n        succeeded |= !!PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);\n    }\n\n    return succeeded;\n}\n\n}  // namespace UIControl\n"
  },
  {
    "path": "src/windhawk/app/ui_control.h",
    "content": "#pragma once\n\nnamespace UIControl {\n\nvoid RunUI();\nbool RunUIViaSchedTask();\nstd::vector<HWND> GetOpenUIWindows();\nbool BringUIToFront();\nvoid RunUIOrBringToFront(HWND hWnd, bool mustRunAsAdmin);\nbool CloseUI();\n\n}  // namespace UIControl\n"
  },
  {
    "path": "src/windhawk/app/update_checker.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"update_checker.h\"\n\n#include \"logger.h\"\n#include \"version.h\"\n\nnamespace {\n\nconstexpr auto* kUpdateCheckerUrl =\n    L\"https://update.windhawk.net/versions.json\";\n\nUSHORT GetNativeMachineImpl() {\n    using IsWow64Process2_t = BOOL(WINAPI*)(\n        HANDLE hProcess, USHORT * pProcessMachine, USHORT * pNativeMachine);\n\n    IsWow64Process2_t pIsWow64Process2 = nullptr;\n    HMODULE kernel32Module = GetModuleHandle(L\"kernel32.dll\");\n    if (kernel32Module) {\n        pIsWow64Process2 = reinterpret_cast<IsWow64Process2_t>(\n            GetProcAddress(kernel32Module, \"IsWow64Process2\"));\n    }\n\n    if (pIsWow64Process2) {\n        USHORT processMachine = 0;\n        USHORT nativeMachine = 0;\n        if (pIsWow64Process2(GetCurrentProcess(), &processMachine,\n                             &nativeMachine)) {\n            return nativeMachine;\n        }\n\n        return IMAGE_FILE_MACHINE_UNKNOWN;\n    }\n\n#if defined(_M_IX86)\n    BOOL isWow64Process = FALSE;\n    if (IsWow64Process(GetCurrentProcess(), &isWow64Process)) {\n        return isWow64Process ? IMAGE_FILE_MACHINE_AMD64\n                              : IMAGE_FILE_MACHINE_I386;\n    }\n#elif defined(_M_X64)\n    return IMAGE_FILE_MACHINE_AMD64;\n#else\n    // ARM64 OSes should have IsWow64Process2. Other architectures aren't\n    // supported.\n#endif\n\n    return IMAGE_FILE_MACHINE_UNKNOWN;\n}\n\nUSHORT GetNativeMachine() {\n    static USHORT nativeMachine = GetNativeMachineImpl();\n    return nativeMachine;\n}\n\nCWinHTTPSimpleOptions GetUpdateCheckerOptions(DWORD flags,\n                                              const void* postData,\n                                              size_t postDataSize) {\n    CWinHTTPSimpleOptions options;\n\n    options.sURL = kUpdateCheckerUrl;\n\n    options.sUserAgent = L\"Windhawk/\" VER_FILE_VERSION_WSTR \" (\";\n    options.sUserAgent += std::to_wstring(GetNativeMachine());\n    if (flags & UpdateChecker::kFlagPortable) {\n        options.sUserAgent += L\"; portable\";\n    }\n    options.sUserAgent += L\")\";\n\n    if (postData && postDataSize > 0) {\n        options.sVerb = L\"POST\";\n        options.lpOptional = postData;\n        options.dwOptionalSize = static_cast<DWORD>(postDataSize);\n    }\n\n    return options;\n}\n\n}  // namespace\n\nUpdateChecker::UpdateChecker(DWORD flags,\n                             std::function<void()> onUpdateCheckDone)\n    : m_flags(flags),\n      m_postedData(UserProfile::GetLocalUpdatedContentAsString()),\n      m_httpSimple(GetUpdateCheckerOptions(m_flags,\n                                           m_postedData.data(),\n                                           m_postedData.length()),\n                   onUpdateCheckDone != nullptr),\n      m_onUpdateCheckDone(std::move(onUpdateCheckDone)) {\n    if (!m_postedData.empty()) {\n        THROW_IF_FAILED(m_httpSimple.AddHeaders(\n            L\"Content-Type: application/json\", -1L, WINHTTP_ADDREQ_FLAG_ADD));\n    }\n\n    if (m_onUpdateCheckDone) {\n        THROW_IF_FAILED(m_httpSimple.SendRequest([this] { OnRequestDone(); }));\n    } else {\n        m_httpSimple.SendRequest(nullptr);\n        if (ShouldRetryWithAGetRequest()) {\n            m_httpSimpleGetRequest = std::make_unique<CWinHTTPSimple>(\n                GetUpdateCheckerOptions(m_flags, nullptr, 0), false);\n            m_httpSimpleGetRequest->SendRequest(nullptr);\n        }\n    }\n}\n\nvoid UpdateChecker::Abort() {\n    m_aborted = true;\n\n    m_httpSimple.Abort();\n\n    {\n        std::lock_guard<std::mutex> guard(m_httpSimpleGetRequestMutex);\n        if (m_httpSimpleGetRequest) {\n            m_httpSimpleGetRequest->Abort();\n        }\n    }\n}\n\nUpdateChecker::Result UpdateChecker::HandleResponse() {\n    CWinHTTPSimple& httpSimple =\n        m_httpSimpleGetRequest ? *m_httpSimpleGetRequest : m_httpSimple;\n\n    Result result = {};\n    result.hrError = httpSimple.GetRequestResult();\n    result.httpStatusCode = httpSimple.GetLastStatusCode();\n\n    if (SUCCEEDED(result.hrError)) {\n        try {\n            const auto& response = httpSimple.GetResponse();\n            result.updateStatus = UserProfile::UpdateContentWithOnlineData(\n                reinterpret_cast<PCSTR>(response.data()), response.size());\n        } catch (const std::exception& e) {\n            LOG(L\"Handling server response failed: %S\", e.what());\n            result.hrError = E_FAIL;\n        }\n    }\n\n    return result;\n}\n\nbool UpdateChecker::ShouldRetryWithAGetRequest() {\n    // If the server doesn't support POST requests,\n    // it can return 405 NOT ALLOWED.\n    // Try with a GET request.\n    return m_httpSimple.GetRequestResult() ==\n               HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_HEADER) &&\n           m_httpSimple.GetLastStatusCode() == 405;\n}\n\nvoid UpdateChecker::OnRequestDone() {\n    if (ShouldRetryWithAGetRequest() && !m_aborted) {\n        std::lock_guard<std::mutex> guard(m_httpSimpleGetRequestMutex);\n\n        if (!m_aborted) {\n            try {\n                m_httpSimpleGetRequest = std::make_unique<CWinHTTPSimple>(\n                    GetUpdateCheckerOptions(m_flags, nullptr, 0), true);\n                THROW_IF_FAILED(m_httpSimpleGetRequest->SendRequest(\n                    [this] { m_onUpdateCheckDone(); }));\n            } catch (const std::exception& e) {\n                m_httpSimpleGetRequest.reset();\n                LOG(L\"Get request failed: %S\", e.what());\n                m_onUpdateCheckDone();\n            }\n\n            return;\n        }\n    }\n\n    m_onUpdateCheckDone();\n}\n"
  },
  {
    "path": "src/windhawk/app/update_checker.h",
    "content": "#pragma once\n\n#include \"userprofile.h\"\n#include \"winhttpsimple.h\"\n\nclass UpdateChecker {\n   public:\n    struct Result {\n        HRESULT hrError;\n        DWORD httpStatusCode;\n        UserProfile::UpdateStatus updateStatus;\n    };\n\n    enum {\n        kFlagPortable = 1,\n    };\n\n    UpdateChecker(DWORD flags, std::function<void()> onUpdateCheckDone);\n    void Abort();\n    Result HandleResponse();\n\n   private:\n    bool ShouldRetryWithAGetRequest();\n    void OnRequestDone();\n\n    std::atomic<bool> m_aborted = false;\n    DWORD m_flags = 0;\n    std::string m_postedData;\n    CWinHTTPSimple m_httpSimple;\n    std::unique_ptr<CWinHTTPSimple> m_httpSimpleGetRequest;\n    std::mutex m_httpSimpleGetRequestMutex;\n    std::function<void()> m_onUpdateCheckDone;\n};\n"
  },
  {
    "path": "src/windhawk/app/userprofile.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"userprofile.h\"\n\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"storage_manager.h\"\n#include \"version.h\"\n\nusing json = nlohmann::json;\n\nnamespace {\n\nbool ValidateUserId(const std::string& id) {\n    GUID guid;\n    return SUCCEEDED(IIDFromString(\n        CStringW(id.c_str(), static_cast<int>(id.length())), &guid));\n}\n\nstd::string GenerateUserId() {\n    GUID guid;\n    if (FAILED(CoCreateGuid(&guid))) {\n        return {};\n    }\n\n    // GUID to string: https://stackoverflow.com/a/12934635\n    const CComBSTR guidBstr(guid);  // Converts from binary GUID to BSTR\n    const CStringA guidStr(\n        guidBstr);  // Converts from BSTR to appropriate string\n\n    return guidStr.GetString();\n}\n\nstd::string GetCurrentOSVersion() {\n    ULONG majorVersion = 0;\n    ULONG minorVersion = 0;\n    ULONG buildNumber = 0;\n    Functions::GetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber);\n\n    return std::to_string(majorVersion) + \".\" + std::to_string(minorVersion) +\n           \".\" + std::to_string(buildNumber);\n}\n\njson ReadUserProfileJsonFromFile(\n    const std::filesystem::path& userProfileJsonPath) {\n    json userProfileJson;\n\n    std::ifstream userProfileFile(userProfileJsonPath);\n    if (userProfileFile) {\n        try {\n            userProfileFile >> userProfileJson;\n        } catch (const std::exception& e) {\n            LOG(L\"Parsing userprofile.json failed: %S\", e.what());\n        }\n    }\n\n    if (!userProfileJson.is_object()) {\n        userProfileJson = json::object();\n    }\n\n    return userProfileJson;\n}\n\njson GetLocalUpdatedContent() {\n    auto userProfileJsonPath =\n        StorageManager::GetInstance().GetUserProfileJsonPath();\n\n    json userProfileJson = ReadUserProfileJsonFromFile(userProfileJsonPath);\n\n    bool updatedData = false;\n\n    // Update user id if necessary.\n    auto& id = userProfileJson[\"id\"];\n    if (!id.is_string() || !ValidateUserId(id.get<std::string>())) {\n        id = GenerateUserId();\n        updatedData = true;\n    }\n\n    // Update OS version if necessary.\n    auto& os = userProfileJson[\"os\"];\n    auto currentOsVersion = GetCurrentOSVersion();\n    if (os != currentOsVersion) {\n        os = currentOsVersion;\n        updatedData = true;\n    }\n\n    // Update app version if necessary.\n    auto& app = userProfileJson[\"app\"];\n    if (!app.is_object()) {\n        app = json::object();\n        updatedData = true;\n    }\n\n    auto& version = app[\"version\"];\n    if (version != VER_FILE_VERSION_STR) {\n        version = VER_FILE_VERSION_STR;\n        updatedData = true;\n    }\n\n    // Save data.\n    if (updatedData) {\n        std::ofstream userProfileFile(userProfileJsonPath);\n        if (userProfileFile) {\n            userProfileFile << std::setw(2) << userProfileJson;\n        } else {\n            LOG(L\"Updating userprofile.json failed (%s)\",\n                userProfileJsonPath.c_str());\n        }\n    }\n\n    return userProfileJson;\n}\n\n// https://stackoverflow.com/a/54067471\n// Method to compare two version strings.\nbool version_less_than(std::string v1, std::string v2) {\n    size_t i = 0, j = 0;\n    while (i < v1.length() || j < v2.length()) {\n        int acc1 = 0, acc2 = 0;\n\n        while (i < v1.length() && v1[i] != '.') {\n            acc1 = acc1 * 10 + (v1[i] - '0');\n            i++;\n        }\n        while (j < v2.length() && v2[j] != '.') {\n            acc2 = acc2 * 10 + (v2[j] - '0');\n            j++;\n        }\n\n        if (acc1 < acc2) {\n            return true;\n        }\n        if (acc1 > acc2) {\n            return false;\n        }\n\n        ++i;\n        ++j;\n    }\n    return false;\n}\n\n}  // namespace\n\nnamespace UserProfile {\n\nstd::string GetLocalUpdatedContentAsString() {\n    return GetLocalUpdatedContent().dump(2);\n}\n\nUpdateStatus UpdateContentWithOnlineData(PCSTR onlineData,\n                                         size_t onlineDataLength) {\n    UpdateStatus updateStatus{};\n\n    const json onlineDataJson =\n        json::parse(onlineData, onlineData + onlineDataLength);\n\n    auto userProfileJsonPath =\n        StorageManager::GetInstance().GetUserProfileJsonPath();\n\n    json userProfileJson = ReadUserProfileJsonFromFile(userProfileJsonPath);\n\n    bool updatedData = false;\n\n    // Update app latest version if necessary.\n    {\n        std::string onlineLatestVersion;\n        auto& onlineApp = onlineDataJson.at(\"app\");\n        if (onlineApp.is_string()) {\n            onlineLatestVersion = onlineApp.get<std::string>();\n        } else {\n            onlineLatestVersion = onlineApp.at(\"version\").get<std::string>();\n        }\n\n        auto& app = userProfileJson[\"app\"];\n        if (!app.is_object()) {\n            app = json::object();\n            updatedData = true;\n        }\n\n        auto& latestVersion = app[\"latestVersion\"];\n        std::string prevLatestVersion =\n            latestVersion.is_string() ? latestVersion.get<std::string>() : \"\";\n        if (latestVersion != onlineLatestVersion) {\n            latestVersion = onlineLatestVersion;\n            updatedData = true;\n        }\n\n        if (!onlineLatestVersion.empty()) {\n            auto version = app.find(\"version\");\n            if (version != app.end() && version->is_string() &&\n                version_less_than(version->get<std::string>(),\n                                  onlineLatestVersion)) {\n                updateStatus.appUpdateAvailable = true;\n                if (prevLatestVersion.empty() ||\n                    *version == prevLatestVersion) {\n                    updateStatus.newUpdatesFound = true;\n                }\n            }\n        }\n    }\n\n    // Update mods latest version if necessary.\n    auto& mods = userProfileJson[\"mods\"];\n    if (!mods.is_object()) {\n        mods = json::object();\n        updatedData = true;\n    }\n\n    for (auto& [key, value] : onlineDataJson.at(\"mods\").items()) {\n        auto it = mods.find(key);\n        if (it == mods.end()) {\n            continue;\n        }\n\n        auto& mod = *it;\n        if (!mod.is_object()) {\n            mod = json::object();\n            updatedData = true;\n        }\n\n        std::string onlineLatestModVersion;\n        if (value.is_string()) {\n            onlineLatestModVersion = value.get<std::string>();\n        } else {\n            onlineLatestModVersion =\n                value.at(\"metadata\").at(\"version\").get<std::string>();\n        }\n\n        auto& latestModVersion = mod[\"latestVersion\"];\n        std::string prevLatestModVersion =\n            latestModVersion.is_string() ? latestModVersion.get<std::string>()\n                                         : \"\";\n        if (latestModVersion != onlineLatestModVersion) {\n            latestModVersion = onlineLatestModVersion;\n            updatedData = true;\n        }\n\n        if (!onlineLatestModVersion.empty()) {\n            auto modVersion = mod.find(\"version\");\n            if (modVersion != mod.end() &&\n                *modVersion != onlineLatestModVersion) {\n                updateStatus.modUpdatesAvailable++;\n                if (prevLatestModVersion.empty() ||\n                    *modVersion == prevLatestModVersion) {\n                    updateStatus.newUpdatesFound = true;\n                }\n            }\n        }\n    }\n\n    // Save data.\n    if (updatedData) {\n        std::ofstream userProfileFile(userProfileJsonPath);\n        if (userProfileFile) {\n            userProfileFile << std::setw(2) << userProfileJson;\n        } else {\n            LOG(L\"Updating userprofile.json failed (%s)\",\n                userProfileJsonPath.c_str());\n        }\n    }\n\n    return updateStatus;\n}\n\nUpdateStatus GetUpdateStatus() {\n    UpdateStatus updateStatus{};\n\n    const json userProfileJson = GetLocalUpdatedContent();\n\n    // Check app update.\n    {\n        auto app = userProfileJson.find(\"app\");\n        if (app != userProfileJson.end() && app->is_object()) {\n            auto version = app->find(\"version\");\n            auto latestVersion = app->find(\"latestVersion\");\n            if (version != app->end() && latestVersion != app->end() &&\n                version->is_string() && latestVersion->is_string() &&\n                *latestVersion != \"\" &&\n                version_less_than(version->get<std::string>(),\n                                  latestVersion->get<std::string>())) {\n                updateStatus.appUpdateAvailable = true;\n            }\n        }\n    }\n\n    // Check mod updates.\n    auto mods = userProfileJson.find(\"mods\");\n    if (mods != userProfileJson.end() && mods->is_object()) {\n        for (auto& [key, mod] : mods->items()) {\n            if (mod.is_object()) {\n                auto modVersion = mod.find(\"version\");\n                auto latestModVersion = mod.find(\"latestVersion\");\n                if (modVersion != mod.end() && latestModVersion != mod.end() &&\n                    modVersion->is_string() && latestModVersion->is_string() &&\n                    *latestModVersion != \"\" &&\n                    *modVersion != *latestModVersion) {\n                    updateStatus.modUpdatesAvailable++;\n                }\n            }\n        }\n    }\n\n    return updateStatus;\n}\n\n}  // namespace UserProfile\n"
  },
  {
    "path": "src/windhawk/app/userprofile.h",
    "content": "#pragma once\n\nnamespace UserProfile {\n\nstruct UpdateStatus {\n    bool appUpdateAvailable;\n    int modUpdatesAvailable;\n    bool newUpdatesFound;\n};\n\nstd::string GetLocalUpdatedContentAsString();\nUpdateStatus UpdateContentWithOnlineData(PCSTR onlineData,\n                                         size_t onlineDataLength);\nUpdateStatus GetUpdateStatus();\n\n}  // namespace UserProfile\n"
  },
  {
    "path": "src/windhawk/app/winhttpsimple.h",
    "content": "#ifndef __WINHTTPSIMPLE_H__\n#define __WINHTTPSIMPLE_H__\n\nstruct CWinHTTPSimpleOptions\n{\n\tstd::wstring   sURL;\n\tstd::wstring   sVerb;                          // GET/POST etc.\n\tstd::wstring   sUserAgent;\n\tstd::wstring   sReferrer;\n\tstd::vector<std::wstring> AcceptTypes;\n\n\tULONGLONG      nDownloadStartPos = 0;          // Offset to resume the download at\n\tbool           bNoURLRedirect = FALSE;         // Set to true if you want to disable URL redirection following\n\tstd::wstring   sFileToUpload;                  // The path of the file to upload\n\tstd::wstring   sFileToDownloadInto;            // The path of the file to download into\n\tLPCVOID        lpOptional = NULL;              // Optional data to send immediately after the request headers\n\tDWORD          dwOptionalSize = 0;             // The size in bytes of lpOptional\n\tLPCVOID        lpRequest = NULL;               // The in memory data to send in the HTTP request\n\tDWORD          dwRequestSize = 0;              // The size in bytes of lpRequest\n\tdouble         dbLimit = 0;                    // For bandwidth throttling, The value in KB/Second to limit the connection to\n\n\tDWORD          dwAccessType = WINHTTP_ACCESS_TYPE_DEFAULT_PROXY;\n\t                                               // WINHTTP_ACCESS_TYPE_XXX, proxy/direct connection type\n\tstd::wstring   sProxyServer;                   // The server for Proxy authentication\n\tstd::wstring   sProxyUserName;                 // The username to use for Proxy authentication\n\tstd::wstring   sProxyPassword;                 // The password to use for Proxy authentication\n\tDWORD          dwProxyPreauthenticationScheme = WINHTTP_AUTH_SCHEME_NEGOTIATE;\n\t                                               // The authentication scheme to use for proxy preauthentication\n\tbool           bProxyPreauthentication = TRUE; // Should we supply credentials on the first request for the Proxy rather than starting out with anonymous credentials\n\t\t\t\t\t\t\t\t\t\t\t\t   // and only authenticating when challenged\n\n\tstd::wstring   sHTTPUserName;                  // The username to use for HTTP authentication\n\tstd::wstring   sHTTPPassword;                  // the password to use for HTTP authentication\n\tDWORD          dwHTTPPreauthenticationScheme = WINHTTP_AUTH_SCHEME_NEGOTIATE;\n\t                                               // The authentication scheme to use for HTTP server preauthentication\n\tbool           bHTTPPreauthentication = TRUE;  // Should we supply credentials on the first request for the HTTP Server rather than starting out with anonymous credentials\n\t\t\t\t\t\t\t\t\t\t\t\t   // and only authenticating when challenged\n};\n\nclass CWinHTTPSimple\n{\n\tclass CSimpleWinHTTPDownloader : public WinHTTPWrappers::CSyncDownloader\n\t{\n\tpublic:\n\t\tCSimpleWinHTTPDownloader()\n\t\t\t: m_hHandleClosedEvent(CreateEvent(NULL, TRUE, FALSE, NULL)) {\n\t\t\tif (!m_hHandleClosedEvent)\n\t\t\t\tAtlThrowLastWin32();\n\t\t}\n\n\t\t~CSimpleWinHTTPDownloader()\n\t\t{\n\t\t\tClose();\n\t\t\tWaitForSingleObject(m_hHandleClosedEvent, INFINITE);\n\t\t}\n\n\t\tHRESULT SendRequest(_In_ std::function<void()> doneCallback, _In_reads_bytes_opt_(dwOptionalLength) LPVOID lpOptional = WINHTTP_NO_REQUEST_DATA, _In_ DWORD dwOptionalLength = 0)\n\t\t{\n\t\t\t// Call the base class\n\t\t\tHRESULT hr = __super::SendRequest(lpOptional, dwOptionalLength);\n\n\t\t\tif (FAILED(hr)) {\n\t\t\t\tm_hr = hr;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tm_hr = E_PENDING;\n\t\t\t\tif (doneCallback) {\n\t\t\t\t\tm_doneCallback = std::move(doneCallback);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn hr;\n\t\t}\n\n\t\tHRESULT SendRequestSync(_In_reads_bytes_opt_(dwOptionalLength) LPVOID lpOptional = WINHTTP_NO_REQUEST_DATA, _In_ DWORD dwOptionalLength = 0) override\n\t\t{\n\t\t\t// Call the base class\n\t\t\tHRESULT hr = __super::SendRequestSync(lpOptional, dwOptionalLength);\n\n\t\t\tm_hr = hr;\n\n\t\t\treturn hr;\n\t\t}\n\n\t\tHRESULT GetHresult()\n\t\t{\n\t\t\treturn m_hr;\n\t\t}\n\n\tprotected:\n\t\tvirtual HRESULT OnCallback(_In_ HINTERNET hInternet, _In_ DWORD dwInternetStatus, _In_opt_ LPVOID lpvStatusInformation, _In_ DWORD dwStatusInformationLength)\n\t\t{\n\t\t\t// Let the base class do the real work\n\t\t\tHRESULT ret = __super::OnCallback(hInternet, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);\n\n\t\t\tif (dwInternetStatus == WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING)\n\t\t\t{\n\t\t\t\tSetEvent(m_hHandleClosedEvent);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tvirtual HRESULT OnCallbackComplete(_In_ HRESULT hr, _In_ HINTERNET hInternet, _In_ DWORD dwInternetStatus, _In_opt_ LPVOID lpvStatusInformation, _In_ DWORD dwStatusInformationLength)\n\t\t{\n\t\t\tm_hr = hr;\n\n\t\t\t// Let the base class do the cleanup\n\t\t\tHRESULT ret = __super::OnCallbackComplete(hr, hInternet, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);\n\n\t\t\tif (m_doneCallback)\n\t\t\t{\n\t\t\t\tm_doneCallback();\n\t\t\t\tm_doneCallback = nullptr;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tATL::CHandle m_hHandleClosedEvent;\n\t\tstd::function<void()> m_doneCallback;\n\t\tHRESULT m_hr = E_FAIL;\n\t};\n\n\tbool                          m_bAsync;\n\tWinHTTPWrappers::CSession     m_session;\n\tWinHTTPWrappers::CConnection  m_connection;\n\tstd::vector<BYTE>             m_optionalData;\n\tstd::vector<BYTE>             m_requestData;\n\tCSimpleWinHTTPDownloader      m_downloadRequest;\n\npublic:\n\tCWinHTTPSimple(CWinHTTPSimpleOptions options, bool bAsync = false)\n\t\t: m_bAsync(bAsync), m_downloadRequest() {\n\t\t// Crack the URL provided into its constituent parts\n\t\tURL_COMPONENTS urlComponents = { sizeof(urlComponents) };\n\t\turlComponents.dwSchemeLength = static_cast<DWORD>(-1);\n\t\turlComponents.dwHostNameLength = static_cast<DWORD>(-1);\n\t\turlComponents.dwUrlPathLength = static_cast<DWORD>(-1);\n\t\turlComponents.dwExtraInfoLength = static_cast<DWORD>(-1);\n\t\tBOOL bSuccess = WinHttpCrackUrl(options.sURL.c_str(), 0, 0, &urlComponents);\n\t\tATLENSURE_THROW(bSuccess, AtlHresultFromLastError());\n\n\t\t// Create the session object\n\t\tHRESULT hr = m_session.Initialize(options.sUserAgent.c_str(), options.dwAccessType,\n\t\t\toptions.sProxyServer.c_str() ? options.sProxyServer.c_str() : WINHTTP_NO_PROXY_NAME,\n\t\t\tWINHTTP_NO_PROXY_BYPASS, bAsync ? WINHTTP_FLAG_ASYNC : 0);\n\t\tATLENSURE_SUCCEEDED(hr);\n\n\t\t// Create the connection object\n\t\thr = m_connection.Initialize(m_session,\n\t\t\tstd::wstring(urlComponents.lpszHostName, urlComponents.dwHostNameLength).c_str(),\n\t\t\turlComponents.nPort);\n\t\tATLENSURE_SUCCEEDED(hr);\n\n\t\t// Fill in all the member variables\n\t\tif (options.lpOptional)\n\t\t{\n\t\t\tm_optionalData.assign(reinterpret_cast<const BYTE*>(options.lpOptional),\n\t\t\t\treinterpret_cast<const BYTE*>(options.lpOptional) + options.dwOptionalSize);\n\t\t}\n\n\t\tif (options.lpRequest)\n\t\t{\n\t\t\tm_requestData.assign(reinterpret_cast<const BYTE*>(options.lpRequest),\n\t\t\t\treinterpret_cast<const BYTE*>(options.lpRequest) + options.dwRequestSize);\n\t\t}\n\n\t\tm_downloadRequest.m_sHTTPUserName = std::move(options.sHTTPUserName);\n\t\tm_downloadRequest.m_sHTTPPassword = std::move(options.sHTTPPassword);\n\t\tm_downloadRequest.m_sProxyUserName = std::move(options.sProxyUserName);\n\t\tm_downloadRequest.m_sProxyPassword = std::move(options.sProxyPassword);\n\t\tm_downloadRequest.m_nDownloadStartPos = options.nDownloadStartPos;\n\t\tm_downloadRequest.m_bHTTPPreauthentication = options.bHTTPPreauthentication;\n\t\tm_downloadRequest.m_dwHTTPPreauthenticationScheme = options.dwHTTPPreauthenticationScheme;\n\t\tm_downloadRequest.m_bProxyPreauthentication = options.bProxyPreauthentication;\n\t\tm_downloadRequest.m_dwProxyPreauthenticationScheme = options.dwProxyPreauthenticationScheme;\n\t\tm_downloadRequest.m_bNoURLRedirect = options.bNoURLRedirect;\n\t\tm_downloadRequest.m_sFileToDownloadInto = std::move(options.sFileToDownloadInto);\n\t\tm_downloadRequest.m_sFileToUpload = std::move(options.sFileToUpload);\n\t\tm_downloadRequest.m_lpRequest = m_requestData.data();\n\t\tm_downloadRequest.m_dwRequestSize = options.dwRequestSize;\n\t\tm_downloadRequest.m_dbLimit = options.dbLimit;\n\n\t\tsize_t nAcceptTypes = options.AcceptTypes.size();\n\t\tstd::vector<LPCWSTR> ppszAcceptTypes;\n\t\tif (nAcceptTypes)\n\t\t{\n\t\t\tppszAcceptTypes.reserve(nAcceptTypes + 1);\n\t\t\tfor (const auto& str : options.AcceptTypes)\n\t\t\t\tppszAcceptTypes.push_back(str.c_str());\n\t\t\tppszAcceptTypes.push_back(nullptr);\n\t\t}\n\n\t\tstd::wstring sUrl =\n\t\t\tstd::wstring(urlComponents.lpszUrlPath, urlComponents.dwUrlPathLength) +\n\t\t\tstd::wstring(urlComponents.lpszExtraInfo, urlComponents.dwExtraInfoLength);\n\n\t\t// Create the request\n\t\thr = m_downloadRequest.Initialize(m_connection, sUrl.c_str(),\n\t\t\toptions.sVerb.length() ? options.sVerb.c_str() : NULL, NULL,\n\t\t\toptions.sReferrer.length() ? options.sReferrer.c_str() : WINHTTP_NO_REFERER,\n\t\t\tnAcceptTypes ? ppszAcceptTypes.data() : WINHTTP_DEFAULT_ACCEPT_TYPES,\n\t\t\turlComponents.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);\n\t\tATLENSURE_SUCCEEDED(hr);\n\t}\n\n\tHRESULT AddHeaders(LPCWSTR pwszHeaders, DWORD dwHeadersLength, DWORD dwModifiers)\n\t{\n\t\treturn m_downloadRequest.AddHeaders(pwszHeaders, dwHeadersLength, dwModifiers);\n\t}\n\n\tHRESULT SendRequest(std::function<void()> doneCallback)\n\t{\n\t\tvoid* lpOptional = NULL;\n\t\tDWORD dwOptionalLength = 0;\n\n\t\tif (!m_optionalData.empty())\n\t\t{\n\t\t\tlpOptional = m_optionalData.data();\n\t\t\tdwOptionalLength = static_cast<DWORD>(m_optionalData.size());\n\t\t}\n\n\t\tif (m_bAsync)\n\t\t{\n\t\t\treturn m_downloadRequest.SendRequest(std::move(doneCallback), lpOptional, dwOptionalLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn m_downloadRequest.SendRequestSync(lpOptional, dwOptionalLength);\n\t\t}\n\t}\n\n\tHRESULT QueryHeaders(DWORD dwInfoLevel, LPCWSTR pwszName, LPVOID lpBuffer, DWORD& dwBufferLength, DWORD* lpdwIndex)\n\t{\n\t\treturn m_downloadRequest.QueryHeaders(dwInfoLevel, pwszName, lpBuffer, dwBufferLength, lpdwIndex);\n\t}\n\n\tHRESULT GetRequestResult()\n\t{\n\t\treturn m_downloadRequest.GetHresult();\n\t}\n\n\tDWORD GetLastStatusCode()\n\t{\n\t\tbool valid;\n\t\tDWORD code = m_downloadRequest.GetLastStatusCode(valid);\n\t\treturn valid ? code : 0;\n\t}\n\n\tconst std::vector<BYTE>& GetResponse()\n\t{\n\t\treturn m_downloadRequest.m_Response;\n\t}\n\n\tvoid Abort()\n\t{\n\t\tm_downloadRequest.Close();\n\t}\n};\n\n#endif // __WINHTTPSIMPLE_H__\n"
  },
  {
    "path": "src/windhawk/build.bat",
    "content": "@ECHO OFF\n\nREM // Usage:\nREM // build.bat Debug \"\"\nREM // build.bat Release :rebuild\n\nSET \"VSCMD_START_DIR=%CD%\"\nIF \"%FrameworkVersion%\" == \"\" CALL \"%ProgramFiles%\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvars64.bat\"\n\nMSBuild.exe \"windhawk.sln\" /m /t:\"app%~2\" /p:Configuration=\"%~1\" /p:Platform=\"Win32\" || GOTO fail\nMSBuild.exe \"windhawk.sln\" /m /t:\"engine%~2\" /p:Configuration=\"%~1\" /p:Platform=\"Win32\" || GOTO fail\nMSBuild.exe \"windhawk.sln\" /m /t:\"engine%~2\" /p:Configuration=\"%~1\" /p:Platform=\"x64\" || GOTO fail\nMSBuild.exe \"windhawk.sln\" /m /t:\"engine%~2\" /p:Configuration=\"%~1\" /p:Platform=\"ARM64\" || GOTO fail\n\nREM // Done\nEXIT /b 0\n\n:fail\nEXIT /b %ERRORLEVEL%\n"
  },
  {
    "path": "src/windhawk/engine/_exports.def",
    "content": "LIBRARY \"windhawk.dll\"\nEXPORTS\n\tInjectInit\n\tGlobalHookSessionStart\n\tGlobalHookSessionHandleNewProcesses\n\tGlobalHookSessionEnd\n\tInternalWh_IsLogEnabled\n\tInternalWh_Log\n\tInternalWh_GetIntValue\n\tInternalWh_SetIntValue\n\tInternalWh_GetStringValue\n\tInternalWh_SetStringValue\n\tInternalWh_GetBinaryValue\n\tInternalWh_SetBinaryValue\n\tInternalWh_DeleteValue\n\tInternalWh_GetModStoragePath\n\tInternalWh_GetIntSetting\n\tInternalWh_GetStringSetting\n\tInternalWh_FreeStringSetting\n\tInternalWh_SetFunctionHook\n\tInternalWh_RemoveFunctionHook\n\tInternalWh_ApplyHookOperations\n\tInternalWh_FindFirstSymbol\n\tInternalWh_FindFirstSymbol2\n\tInternalWh_FindFirstSymbol3\n\tInternalWh_FindFirstSymbol4\n\tInternalWh_FindNextSymbol\n\tInternalWh_FindNextSymbol2\n\tInternalWh_FindCloseSymbol\n\tInternalWh_HookSymbols\n\tInternalWh_Disasm\n\tInternalWh_GetUrlContent\n\tInternalWh_FreeUrlContent\n"
  },
  {
    "path": "src/windhawk/engine/all_processes_injector.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"all_processes_injector.h\"\n#include \"dll_inject.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"process_lists.h\"\n#include \"session_private_namespace.h\"\n#include \"storage_manager.h\"\n#include \"var_init_once.h\"\n\n#ifndef STATUS_NO_MORE_ENTRIES\n#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)\n#endif\n\nnamespace {\n\nstruct __declspec(align(16)) MY_CONTEXT_AMD64 {\n    DWORD64 dummy1[6];\n    DWORD ContextFlags;\n    DWORD MxCsr;\n    WORD SegCs;\n    WORD SegDs;\n    WORD SegEs;\n    WORD SegFs;\n    WORD SegGs;\n    WORD SegSs;\n    DWORD EFlags;\n    DWORD64 dummy2[6];\n    DWORD64 Rax;\n    DWORD64 Rcx;\n    DWORD64 Rdx;\n    DWORD64 Rbx;\n    DWORD64 Rsp;\n    DWORD64 Rbp;\n    DWORD64 Rsi;\n    DWORD64 Rdi;\n    DWORD64 R8;\n    DWORD64 R9;\n    DWORD64 R10;\n    DWORD64 R11;\n    DWORD64 R12;\n    DWORD64 R13;\n    DWORD64 R14;\n    DWORD64 R15;\n    DWORD64 Rip;\n    DWORD64 dummy3[122];\n};\n\n#define MY_CONTEXT_AMD64_CONTROL 0x100001\n\nUSHORT GetNativeMachineImpl() {\n    using IsWow64Process2_t = BOOL(WINAPI*)(\n        HANDLE hProcess, USHORT * pProcessMachine, USHORT * pNativeMachine);\n\n    IsWow64Process2_t pIsWow64Process2 = nullptr;\n    HMODULE kernel32Module = GetModuleHandle(L\"kernel32.dll\");\n    if (kernel32Module) {\n        pIsWow64Process2 = reinterpret_cast<IsWow64Process2_t>(\n            GetProcAddress(kernel32Module, \"IsWow64Process2\"));\n    }\n\n    if (pIsWow64Process2) {\n        USHORT processMachine = 0;\n        USHORT nativeMachine = 0;\n        if (pIsWow64Process2(GetCurrentProcess(), &processMachine,\n                             &nativeMachine)) {\n            return nativeMachine;\n        }\n\n        return IMAGE_FILE_MACHINE_UNKNOWN;\n    }\n\n#if defined(_M_IX86)\n    BOOL isWow64Process = FALSE;\n    if (IsWow64Process(GetCurrentProcess(), &isWow64Process)) {\n        return isWow64Process ? IMAGE_FILE_MACHINE_AMD64\n                              : IMAGE_FILE_MACHINE_I386;\n    }\n#elif defined(_M_X64)\n    return IMAGE_FILE_MACHINE_AMD64;\n#else\n    // ARM64 OSes should have IsWow64Process2. Other architectures aren't\n    // supported.\n#endif\n\n    return IMAGE_FILE_MACHINE_UNKNOWN;\n}\n\nUSHORT GetNativeMachine() {\n    STATIC_INIT_ONCE_TRIVIAL(USHORT, nativeMachine, GetNativeMachineImpl());\n    return nativeMachine;\n}\n\n// This function is used to get the address of the x64 stub of\n// RtlUserThreadStart on ARM64. It's done by creating a suspended process and\n// querying its initial instruction pointer. For details of why it's needed,\n// look for the mention of RtlUserThreadStart in\n// https://m417z.com/Implementing-Global-Injection-and-Hooking-in-Windows/.\nDWORD64 GetRtlUserThreadStart_x64OnArm64() {\n    std::filesystem::path x64HelperPath =\n        wil::GetModuleFileName<std::wstring>();\n    x64HelperPath.replace_filename(L\"windhawk-x64-helper.exe\");\n\n    STARTUPINFO si = {sizeof(STARTUPINFO)};\n    wil::unique_process_information process;\n\n    THROW_IF_WIN32_BOOL_FALSE(\n        CreateProcess(x64HelperPath.c_str(), nullptr, nullptr, nullptr, FALSE,\n                      NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED, nullptr,\n                      nullptr, &si, &process));\n\n    auto terminateProcessOnScopeExit =\n        wil::scope_exit([&process] { TerminateProcess(process.hProcess, 0); });\n\n#ifdef _M_IX86\n    auto ntdll = wow64pp::module_handle(\"ntdll.dll\");\n    auto pNtGetContextThread = wow64pp::import(ntdll, \"NtGetContextThread\");\n\n    ARM64_NT_CONTEXT context;\n    auto result64 = wow64pp::call_function(\n        pNtGetContextThread, wow64pp::handle_to_uint64(process.hThread),\n        wow64pp::ptr_to_uint64(&context));\n    NTSTATUS result = static_cast<NTSTATUS>(result64);\n    THROW_IF_NTSTATUS_FAILED(result);\n\n    return context.Pc;\n#else\n#error \"Unsupported architecture\"\n#endif  // _M_IX86\n}\n\nvoid GetThreadContext64(HANDLE thread, CONTEXT* context) {\n    STATIC_INIT_ONCE_TRIVIAL(DWORD64, pNtGetContextThread, []() {\n        auto ntdll = wow64pp::module_handle(\"ntdll.dll\");\n        return wow64pp::import(ntdll, \"NtGetContextThread\");\n    }());\n\n    auto result64 = wow64pp::call_function(pNtGetContextThread,\n                                           wow64pp::handle_to_uint64(thread),\n                                           wow64pp::ptr_to_uint64(context));\n    NTSTATUS result = static_cast<NTSTATUS>(result64);\n    THROW_IF_NTSTATUS_FAILED(result);\n}\n\nHANDLE CreateProcessInitAPCMutex(DWORD processId, BOOL initialOwner) {\n    WCHAR szMutexName[SessionPrivateNamespace::kPrivateNamespaceMaxLen +\n                      sizeof(\"\\\\ProcessInitAPCMutex-pid=1234567890\")];\n    int mutexNamePos =\n        SessionPrivateNamespace::MakeName(szMutexName, GetCurrentProcessId());\n    swprintf_s(szMutexName + mutexNamePos,\n               ARRAYSIZE(szMutexName) - mutexNamePos,\n               L\"\\\\ProcessInitAPCMutex-pid=%u\", processId);\n\n    wil::unique_hlocal secDesc;\n    THROW_IF_WIN32_BOOL_FALSE(\n        Functions::GetFullAccessSecurityDescriptor(&secDesc, nullptr));\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    wil::unique_mutex_nothrow mutex(\n        CreateMutex(&secAttr, initialOwner, szMutexName));\n    THROW_LAST_ERROR_IF_NULL(mutex);\n\n    return mutex.release();\n}\n\nHANDLE OpenProcessInitAPCMutex(DWORD processId, DWORD desiredAccess) {\n    WCHAR szMutexName[SessionPrivateNamespace::kPrivateNamespaceMaxLen +\n                      sizeof(\"\\\\ProcessInitAPCMutex-pid=1234567890\")];\n    int mutexNamePos =\n        SessionPrivateNamespace::MakeName(szMutexName, GetCurrentProcessId());\n    swprintf_s(szMutexName + mutexNamePos,\n               ARRAYSIZE(szMutexName) - mutexNamePos,\n               L\"\\\\ProcessInitAPCMutex-pid=%u\", processId);\n\n    return OpenMutex(desiredAccess, FALSE, szMutexName);\n}\n\n}  // namespace\n\nAllProcessesInjector::AllProcessesInjector() {\n    HMODULE hNtdll = GetModuleHandle(L\"ntdll.dll\");\n    THROW_LAST_ERROR_IF_NULL(hNtdll);\n\n    m_NtGetNextProcess =\n        (NtGetNextProcess_t)GetProcAddress(hNtdll, \"NtGetNextProcess\");\n    THROW_LAST_ERROR_IF_NULL(m_NtGetNextProcess);\n\n    m_NtGetNextThread =\n        (NtGetNextThread_t)GetProcAddress(hNtdll, \"NtGetNextThread\");\n    THROW_LAST_ERROR_IF_NULL(m_NtGetNextThread);\n\n#ifdef _M_IX86\n    USHORT nativeMachine = GetNativeMachine();\n    if (nativeMachine == IMAGE_FILE_MACHINE_I386) {\n        m_pRtlUserThreadStart = wow64pp::ptr_to_uint64(\n            GetProcAddress(hNtdll, \"RtlUserThreadStart\"));\n    } else {\n        auto ntdll = wow64pp::module_handle(\"ntdll.dll\");\n        m_pRtlUserThreadStart = wow64pp::import(ntdll, \"RtlUserThreadStart\");\n\n        if (nativeMachine == IMAGE_FILE_MACHINE_ARM64) {\n            m_pRtlUserThreadStart_x64OnArm64 =\n                GetRtlUserThreadStart_x64OnArm64();\n        }\n    }\n#else\n#error \"Unsupported architecture\"\n#endif  // _M_IX86\n    THROW_LAST_ERROR_IF(m_pRtlUserThreadStart == 0);\n\n    m_appPrivateNamespace =\n        SessionPrivateNamespace::Create(GetCurrentProcessId());\n\n    auto settings = StorageManager::GetInstance().GetAppConfig(L\"Settings\");\n    m_includePattern = settings->GetString(L\"Include\").value_or(L\"\");\n    m_excludePattern = settings->GetString(L\"Exclude\").value_or(L\"\");\n    m_threadAttachExemptPattern =\n        settings->GetString(L\"ThreadAttachExempt\").value_or(L\"\");\n\n    if (!settings->GetInt(L\"InjectIntoCriticalProcesses\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kCriticalProcesses;\n    }\n\n    if (!settings->GetInt(L\"InjectIntoIncompatiblePrograms\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kIncompatiblePrograms;\n    }\n\n    if (!settings->GetInt(L\"InjectIntoGames\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kGames;\n    }\n}\n\nint AllProcessesInjector::InjectIntoNewProcesses() noexcept {\n    int count = 0;\n\n    while (true) {\n        // Note: If we don't have the required permissions, the process is\n        // skipped.\n        HANDLE hNewProcess;\n        NTSTATUS status = m_NtGetNextProcess(\n            m_lastEnumeratedProcess.get(),\n            SYNCHRONIZE | DllInject::kProcessAccess, 0, 0, &hNewProcess);\n        if (!SUCCEEDED_NTSTATUS(status)) {\n            if (status != STATUS_NO_MORE_ENTRIES) {\n                LOG(L\"NtGetNextProcess error: %08X\", status);\n            }\n\n            break;\n        }\n\n        m_lastEnumeratedProcess.reset(hNewProcess);\n\n        if (WaitForSingleObject(hNewProcess, 0) == WAIT_OBJECT_0) {\n            // Process is no longer alive.\n            continue;\n        }\n\n        DWORD dwNewProcessId = GetProcessId(hNewProcess);\n        if (dwNewProcessId == 0) {\n            LOG(L\"GetProcessId error: %u\", GetLastError());\n            continue;\n        }\n\n        std::wstring processImageName;\n        switch (HRESULT hr = wil::QueryFullProcessImageName<std::wstring>(\n                    hNewProcess, 0, processImageName)) {\n            case S_OK:\n                break;\n\n            case HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED):\n                // Often means the process is terminating.\n                VERBOSE(L\"Process %u is inaccessible (likely terminating)\",\n                        dwNewProcessId);\n                continue;\n\n            // https://stackoverflow.com/a/74456572\n            case HRESULT_FROM_WIN32(ERROR_GEN_FAILURE):\n                VERBOSE(L\"Process %u is likely terminating\", dwNewProcessId);\n                continue;\n\n            default:\n                LOG(L\"QueryFullProcessImageName error for process %u: %08X\",\n                    dwNewProcessId, hr);\n                continue;\n        }\n\n        if (ShouldSkipNewProcess(processImageName)) {\n            VERBOSE(L\"Skipping excluded process %u\", dwNewProcessId);\n            continue;\n        }\n\n        try {\n            InjectIntoNewProcess(hNewProcess, dwNewProcessId,\n                                 ShouldAttachExemptThread(processImageName));\n            count++;\n        } catch (const wil::ResultException& e) {\n            switch (e.GetErrorCode()) {\n                // STATUS_PROCESS_IS_TERMINATING\n                case 0xC000010A:\n                    VERBOSE(L\"Process %u is terminating: %S\", dwNewProcessId,\n                            e.what());\n                    break;\n\n                case HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED):\n                    // May happen if process is terminating.\n                    VERBOSE(L\"Access denied for process %u: %S\", dwNewProcessId,\n                            e.what());\n                    break;\n\n                default:\n                    LOG(L\"Error handling a new process %u: %S\", dwNewProcessId,\n                        e.what());\n                    break;\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"Error handling a new process %u: %S\", dwNewProcessId,\n                e.what());\n        }\n    }\n\n    return count;\n}\n\nbool AllProcessesInjector::ShouldSkipNewProcess(\n    std::wstring_view processImageName) const {\n    return Functions::DoesPathMatchPattern(processImageName,\n                                           m_excludePattern) &&\n           !Functions::DoesPathMatchPattern(processImageName, m_includePattern);\n}\n\nbool AllProcessesInjector::ShouldAttachExemptThread(\n    std::wstring_view processImageName) const {\n    return Functions::DoesPathMatchPattern(processImageName,\n                                           m_threadAttachExemptPattern);\n}\n\nvoid AllProcessesInjector::InjectIntoNewProcess(HANDLE hProcess,\n                                                DWORD dwProcessId,\n                                                bool threadAttachExempt) {\n    // We check whether the process began running or not. If it didn't, it's\n    // supposed to have only one thread which has its instruction pointer at\n    // RtlUserThreadStart. For other cases, we assume the main thread was\n    // resumed.\n    //\n    // If the process didn't begin running, creating a remote thread might be\n    // too early and unsafe. One known problem with this is with console apps -\n    // if we trigger console initialization (KERNELBASE!ConsoleCommitState)\n    // before the parent process notified csrss.exe\n    // (KERNELBASE!CsrClientCallServer), csrss.exe returns an access denied\n    // error and the parent's CreateProcess call fails.\n    //\n    // If the process is the current process, we skip this check since it\n    // obviously began running, and we don't want to suspend the current thread\n    // and cause a deadlock.\n\n    wil::unique_process_handle suspendedThread;\n\n    if (dwProcessId != GetCurrentProcessId()) {\n        DWORD threadAccess = THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT |\n                             DllInject::kApcThreadsAccess;\n\n        wil::unique_process_handle thread1;\n        THROW_IF_NTSTATUS_FAILED(\n            m_NtGetNextThread(hProcess, nullptr, threadAccess, 0, 0, &thread1));\n\n        wil::unique_process_handle thread2;\n        NTSTATUS status = m_NtGetNextThread(hProcess, thread1.get(),\n                                            threadAccess, 0, 0, &thread2);\n        if (status == STATUS_NO_MORE_ENTRIES) {\n            // Exactly one thread.\n            DWORD previousSuspendCount = SuspendThread(thread1.get());\n            THROW_LAST_ERROR_IF(previousSuspendCount == (DWORD)-1);\n\n            if (previousSuspendCount == 0) {\n                // The thread was already running.\n                ResumeThread(thread1.get());\n            } else {\n                suspendedThread = std::move(thread1);\n            }\n        } else {\n            THROW_IF_NTSTATUS_FAILED(status);\n        }\n    }\n\n    if (suspendedThread) {\n        auto suspendThreadCleanup = wil::scope_exit(\n            [&suspendedThread] { ResumeThread(suspendedThread.get()); });\n\n        bool threadNotStartedYet = false;\n\n#ifdef _M_IX86\n        switch (GetNativeMachine()) {\n            case IMAGE_FILE_MACHINE_I386: {\n                CONTEXT c;\n                c.ContextFlags = CONTEXT_CONTROL;\n                THROW_IF_WIN32_BOOL_FALSE(\n                    GetThreadContext(suspendedThread.get(), &c));\n                if (c.Eip == m_pRtlUserThreadStart) {\n                    threadNotStartedYet = true;\n                }\n                break;\n            }\n\n            case IMAGE_FILE_MACHINE_AMD64: {\n                MY_CONTEXT_AMD64 c;\n                c.ContextFlags = MY_CONTEXT_AMD64_CONTROL;\n                GetThreadContext64(suspendedThread.get(), (CONTEXT*)&c);\n                if (c.Rip == m_pRtlUserThreadStart) {\n                    threadNotStartedYet = true;\n                }\n                break;\n            }\n\n            case IMAGE_FILE_MACHINE_ARM64: {\n                ARM64_NT_CONTEXT c;\n                c.ContextFlags = CONTEXT_ARM64_CONTROL;\n                GetThreadContext64(suspendedThread.get(), (CONTEXT*)&c);\n                if (c.Pc == m_pRtlUserThreadStart ||\n                    c.Pc == m_pRtlUserThreadStart_x64OnArm64) {\n                    threadNotStartedYet = true;\n                }\n                break;\n            }\n\n            default: {\n                throw std::runtime_error(\"Unsupported architecture\");\n            }\n        }\n#else\n#error \"Unsupported architecture\"\n#endif  // _M_IX86\n\n        if (threadNotStartedYet) {\n            wil::unique_mutex_nothrow mutex(\n                CreateProcessInitAPCMutex(dwProcessId, TRUE));\n            if (GetLastError() == ERROR_ALREADY_EXISTS) {\n                return;  // APC was already created\n            }\n\n            auto mutexLock = mutex.ReleaseMutex_scope_exit();\n\n            DllInject::DllInject(hProcess, suspendedThread.get(),\n                                 GetCurrentProcess(), mutex.get(),\n                                 threadAttachExempt);\n            VERBOSE(L\"DllInject succeeded for new process %u via APC\",\n                    dwProcessId);\n\n            return;\n        }\n    }\n\n    wil::unique_mutex_nothrow mutex(\n        OpenProcessInitAPCMutex(dwProcessId, SYNCHRONIZE));\n    if (mutex) {\n        return;  // APC was already created\n    }\n\n    DllInject::DllInject(hProcess, nullptr, GetCurrentProcess(), nullptr,\n                         threadAttachExempt);\n    VERBOSE(L\"DllInject succeeded for new process %u via a remote thread\",\n            dwProcessId);\n}\n"
  },
  {
    "path": "src/windhawk/engine/all_processes_injector.h",
    "content": "#pragma once\n\nclass AllProcessesInjector {\n   public:\n    AllProcessesInjector();\n\n    int InjectIntoNewProcesses() noexcept;\n\n   private:\n    bool ShouldSkipNewProcess(std::wstring_view processImageName) const;\n    bool ShouldAttachExemptThread(std::wstring_view processImageName) const;\n    void InjectIntoNewProcess(HANDLE hProcess,\n                              DWORD dwProcessId,\n                              bool threadAttachExempt);\n\n    using NtGetNextProcess_t = NTSTATUS(NTAPI*)(_In_opt_ HANDLE ProcessHandle,\n                                                _In_ ACCESS_MASK DesiredAccess,\n                                                _In_ ULONG HandleAttributes,\n                                                _In_ ULONG Flags,\n                                                _Out_ PHANDLE NewProcessHandle);\n\n    using NtGetNextThread_t = NTSTATUS(NTAPI*)(_In_ HANDLE ProcessHandle,\n                                               _In_opt_ HANDLE ThreadHandle,\n                                               _In_ ACCESS_MASK DesiredAccess,\n                                               _In_ ULONG HandleAttributes,\n                                               _In_ ULONG Flags,\n                                               _Out_ PHANDLE NewThreadHandle);\n\n    NtGetNextProcess_t m_NtGetNextProcess;\n    NtGetNextThread_t m_NtGetNextThread;\n    DWORD64 m_pRtlUserThreadStart = 0;\n    DWORD64 m_pRtlUserThreadStart_x64OnArm64 = 0;\n    wil::unique_private_namespace_destroy m_appPrivateNamespace;\n    std::wstring m_includePattern;\n    std::wstring m_excludePattern;\n    std::wstring m_threadAttachExemptPattern;\n    wil::unique_process_handle m_lastEnumeratedProcess;\n};\n"
  },
  {
    "path": "src/windhawk/engine/customization_session.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"customization_session.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"session_private_namespace.h\"\n\nextern HINSTANCE g_hDllInst;\n\n#ifndef STATUS_NO_MORE_ENTRIES\n#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)\n#endif\n\nnamespace {\n\nstd::optional<HANDLE> GetFirstThreadOfCurrentProcess(DWORD accessMask) {\n    using NtGetNextThread_t = NTSTATUS(NTAPI*)(\n        _In_ HANDLE ProcessHandle, _In_opt_ HANDLE ThreadHandle,\n        _In_ ACCESS_MASK DesiredAccess, _In_ ULONG HandleAttributes,\n        _In_ ULONG Flags, _Out_ PHANDLE NewThreadHandle);\n\n    GET_PROC_ADDRESS_ONCE(NtGetNextThread_t, pNtGetNextThread, L\"ntdll.dll\",\n                          \"NtGetNextThread\");\n\n    if (!pNtGetNextThread) {\n        LOG(L\"Failed to get NtGetNextThread address\");\n        return std::nullopt;\n    }\n\n    DWORD currentThreadId = GetCurrentThreadId();\n    HANDLE thread = nullptr;\n    while (true) {\n        HANDLE nextThread = nullptr;\n        NTSTATUS status = pNtGetNextThread(\n            GetCurrentProcess(), thread,\n            THREAD_QUERY_LIMITED_INFORMATION | SYNCHRONIZE | accessMask, 0, 0,\n            &nextThread);\n\n        if (status == STATUS_NO_MORE_ENTRIES && !thread) {\n            LOG(L\"Failed to get first thread, likely a sandboxed process\");\n            return std::nullopt;\n        }\n\n        if (thread) {\n            CloseHandle(thread);\n        }\n\n        if (status == STATUS_NO_MORE_ENTRIES) {\n            VERBOSE(L\"Current process has no alive threads left\");\n            return nullptr;\n        }\n\n        if (FAILED_NTSTATUS(status)) {\n            LOG(L\"NtGetNextThread failed: 0x%08X\", status);\n            return std::nullopt;\n        }\n\n        thread = nextThread;\n\n        // Skip the current thread.\n        if (GetThreadId(nextThread) == currentThreadId) {\n            continue;\n        }\n\n        DWORD waitResult = WaitForSingleObject(nextThread, 0);\n        if (waitResult == WAIT_OBJECT_0) {\n            // Thread is terminated, continue to the next thread.\n            continue;\n        }\n\n        if (waitResult == WAIT_TIMEOUT) {\n            // Thread is alive.\n            return nextThread;\n        }\n\n        LOG(L\"WaitForSingleObject on thread failed: %u %u\", waitResult,\n            GetLastError());\n        CloseHandle(nextThread);\n        return std::nullopt;\n    }\n}\n\nbool CurrentProcessHasMitigationPolicy() {\n    using GetProcessMitigationPolicy_t = BOOL(WINAPI*)(\n        _In_ HANDLE hProcess, _In_ PROCESS_MITIGATION_POLICY MitigationPolicy,\n        _Out_ LPVOID lpBuffer, _In_ SIZE_T dwLength);\n\n    GET_PROC_ADDRESS_ONCE(GetProcessMitigationPolicy_t,\n                          pGetProcessMitigationPolicy, L\"kernel32.dll\",\n                          \"GetProcessMitigationPolicy\");\n\n    if (!pGetProcessMitigationPolicy) {\n        LOG(L\"Failed to get GetProcessMitigationPolicy address\");\n        return false;\n    }\n\n    PROCESS_MITIGATION_DYNAMIC_CODE_POLICY policy;\n    return pGetProcessMitigationPolicy(GetCurrentProcess(),\n                                       ProcessDynamicCodePolicy, &policy,\n                                       sizeof(policy)) &&\n           policy.ProhibitDynamicCode;\n}\n\n}  // namespace\n\n// static\nvoid CustomizationSession::Start(\n    bool runningFromAPC,\n    bool threadAttachExempt,\n    wil::unique_process_handle sessionManagerProcess,\n    wil::unique_mutex_nothrow sessionMutex) {\n    std::wstring semaphoreName = L\"WindhawkCustomizationSessionSemaphore-pid=\" +\n                                 std::to_wstring(GetCurrentProcessId());\n    wil::unique_semaphore semaphore(1, 1, semaphoreName.c_str());\n\n    // We don't want to wait in APC context infinitely, since it will prevent\n    // the process from launching. If we can't acquire the semaphore while\n    // running from APC, it means that two Windhawk engines are being loaded\n    // simultaneously, which is generally not supported.\n    DWORD timeout = runningFromAPC ? 0 : INFINITE;\n    wil::semaphore_release_scope_exit semaphoreLock =\n        semaphore.acquire(nullptr, timeout);\n    if (!semaphoreLock) {\n        throw std::runtime_error(\n            \"Failed to acquire customization session semaphore\");\n    }\n\n    std::optional<CustomizationSession>& session = GetInstance();\n    if (session) {\n        throw std::logic_error(\n            \"Only one session is supported at any given time\");\n    }\n\n    session.emplace(ConstructorSecret{}, runningFromAPC, threadAttachExempt,\n                    std::move(sessionManagerProcess), std::move(sessionMutex));\n\n    session->StartInitialized(std::move(semaphore), std::move(semaphoreLock),\n                              runningFromAPC);\n}\n\n// static\nDWORD CustomizationSession::GetSessionManagerProcessId() {\n    HANDLE sessionManagerProcess =\n        ScopedStaticSessionManagerProcess::GetInstance().value().get();\n\n    DWORD processId = GetProcessId(sessionManagerProcess);\n    THROW_LAST_ERROR_IF(processId == 0);\n    return processId;\n}\n\n// static\nFILETIME CustomizationSession::GetSessionManagerProcessCreationTime() {\n    HANDLE sessionManagerProcess =\n        ScopedStaticSessionManagerProcess::GetInstance().value().get();\n\n    FILETIME creationTime;\n    FILETIME exitTime;\n    FILETIME kernelTime;\n    FILETIME userTime;\n    THROW_IF_WIN32_BOOL_FALSE(GetProcessTimes(sessionManagerProcess,\n                                              &creationTime, &exitTime,\n                                              &kernelTime, &userTime));\n    return creationTime;\n}\n\n// static\nbool CustomizationSession::IsEndingSoon() {\n    HANDLE sessionManagerProcess =\n        ScopedStaticSessionManagerProcess::GetInstance().value().get();\n    return WaitForSingleObject(sessionManagerProcess, 0) == WAIT_OBJECT_0;\n}\n\nCustomizationSession::CustomizationSession(\n    ConstructorSecret constructorSecret,\n    bool runningFromAPC,\n    bool threadAttachExempt,\n    wil::unique_process_handle sessionManagerProcess,\n    wil::unique_mutex_nothrow sessionMutex)\n    : m_threadAttachExempt(threadAttachExempt),\n      m_scopedStaticSessionManagerProcess(std::move(sessionManagerProcess)),\n      m_sessionMutex(std::move(sessionMutex)),\n      m_privateNamespace(OpenSessionPrivateNamespace()),\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n      // If runningFromAPC, no other threads should be running, skip thread\n      // freeze.\n      m_minHookScopeInit(runningFromAPC ? MH_FREEZE_METHOD_NONE_UNSAFE\n                                        : MH_FREEZE_METHOD_FAST_UNDOCUMENTED),\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n      m_modsManager(),\n      m_newProcessInjector(m_scopedStaticSessionManagerProcess)\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n      ,\n      m_minHookScopeApply()\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n{\n    try {\n        m_modsManager.AfterInit();\n    } catch (const std::exception& e) {\n        LOG(L\"AfterInit failed: %S\", e.what());\n    }\n}\n\nCustomizationSession::~CustomizationSession() {\n    try {\n        m_modsManager.BeforeUninit();\n    } catch (const std::exception& e) {\n        LOG(L\"BeforeUninit failed: %S\", e.what());\n    }\n}\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\nCustomizationSession::MinHookScopeInit::MinHookScopeInit(\n    MH_THREAD_FREEZE_METHOD freezeMethod) {\n    MH_STATUS status = MH_Initialize();\n    if (status != MH_OK) {\n        LOG(L\"MH_Initialize failed with %d\", status);\n        throw std::runtime_error(\"Failed to initialize MinHook\");\n    }\n\n    MH_SetThreadFreezeMethod(freezeMethod);\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK_DETOURS\n    MH_SetBulkOperationMode(\n        /*continueOnError=*/TRUE, [](LPVOID pTarget, NTSTATUS detoursStatus) {\n            LOG(L\"Hooking operation failed for %p with status 0x%08X\", pTarget,\n                detoursStatus);\n        });\n#endif\n}\n\nCustomizationSession::MinHookScopeInit::~MinHookScopeInit() {\n    MH_STATUS status = MH_Uninitialize();\n    if (status != MH_OK) {\n        LOG(L\"MH_Uninitialize failed with status %d\", status);\n    }\n}\n\nCustomizationSession::MinHookScopeApply::MinHookScopeApply() {\n    MH_STATUS status = MH_ApplyQueuedEx(MH_ALL_IDENTS);\n    if (status != MH_OK) {\n        LOG(L\"MH_ApplyQueuedEx failed with %d\", status);\n    }\n\n    MH_SetThreadFreezeMethod(MH_FREEZE_METHOD_FAST_UNDOCUMENTED);\n}\n\nCustomizationSession::MinHookScopeApply::~MinHookScopeApply() {\n    MH_STATUS status = MH_DisableHookEx(MH_ALL_IDENTS, MH_ALL_HOOKS);\n    if (status != MH_OK) {\n        LOG(L\"MH_DisableHookEx failed with status %d\", status);\n    }\n}\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n\nCustomizationSession::MainLoopRunner::MainLoopRunner() noexcept {\n    try {\n        m_modConfigChangeNotification.emplace();\n    } catch (const std::exception& e) {\n        LOG(L\"ModConfigChangeNotification constructor failed: %S\", e.what());\n    }\n}\n\nCustomizationSession::MainLoopRunner::Result\nCustomizationSession::MainLoopRunner::Run(HANDLE sessionManagerProcess,\n                                          DWORD* lastThreadExitCode) noexcept {\n    DWORD lastThreadExitCodeLocal = 0;\n\n    while (true) {\n        wil::unique_handle firstThread;\n\n        auto maybeFirstThread =\n            GetFirstThreadOfCurrentProcess(THREAD_QUERY_LIMITED_INFORMATION);\n        if (maybeFirstThread) {\n            firstThread.reset(*maybeFirstThread);\n            if (!firstThread) {\n                // No threads left in the process, we're done.\n                if (lastThreadExitCode) {\n                    *lastThreadExitCode = lastThreadExitCodeLocal;\n                }\n\n                return Result::kCompleted;\n            }\n        }\n\n        enum class WaitHandleId {\n            kSessionManagerProcess,\n            kFirstThread,\n            kModConfigChangeNotification,\n\n            kCount,\n        };\n\n        constexpr size_t kMaxWaitHandlesCount =\n            static_cast<size_t>(WaitHandleId::kCount);\n\n        DWORD waitHandlesCount = 0;\n        HANDLE waitHandles[kMaxWaitHandlesCount]{};\n        WaitHandleId waitHandleIds[kMaxWaitHandlesCount]{};\n\n        waitHandles[waitHandlesCount] = sessionManagerProcess;\n        waitHandleIds[waitHandlesCount] = WaitHandleId::kSessionManagerProcess;\n        waitHandlesCount++;\n\n        if (firstThread) {\n            waitHandles[waitHandlesCount] = firstThread.get();\n            waitHandleIds[waitHandlesCount] = WaitHandleId::kFirstThread;\n            waitHandlesCount++;\n        }\n\n        if (m_modConfigChangeNotification) {\n            waitHandles[waitHandlesCount] =\n                m_modConfigChangeNotification->GetHandle();\n            waitHandleIds[waitHandlesCount] =\n                WaitHandleId::kModConfigChangeNotification;\n            waitHandlesCount++;\n        }\n\n        DWORD waitResult = WaitForMultipleObjects(waitHandlesCount, waitHandles,\n                                                  FALSE, INFINITE);\n        if (waitResult >= WAIT_OBJECT_0 &&\n            waitResult < WAIT_OBJECT_0 + waitHandlesCount) {\n            switch (waitHandleIds[waitResult - WAIT_OBJECT_0]) {\n                case WaitHandleId::kSessionManagerProcess:\n                    return Result::kCompleted;\n\n                case WaitHandleId::kFirstThread:\n                    GetExitCodeThread(firstThread.get(),\n                                      &lastThreadExitCodeLocal);\n                    continue;\n\n                case WaitHandleId::kModConfigChangeNotification:\n                    // Wait for a bit before notifying about the change, in case\n                    // more config changes will follow.\n                    if (WaitForSingleObject(sessionManagerProcess, 200) ==\n                        WAIT_OBJECT_0) {\n                        return Result::kCompleted;\n                    }\n\n                    return Result::kReloadModsAndSettings;\n            }\n        }\n\n        LOG(L\"WaitForMultipleObjects returned %u, last error %u\", waitResult,\n            GetLastError());\n        return Result::kError;\n    }\n}\n\nbool CustomizationSession::MainLoopRunner::ContinueMonitoring() noexcept {\n    if (!m_modConfigChangeNotification) {\n        return false;\n    }\n\n    try {\n        m_modConfigChangeNotification->ContinueMonitoring();\n    } catch (const std::exception& e) {\n        LOG(L\"ContinueMonitoring failed: %S\", e.what());\n        m_modConfigChangeNotification.reset();\n        return false;\n    }\n\n    return true;\n}\n\nbool CustomizationSession::MainLoopRunner::CanRunAcrossThreads() noexcept {\n    if (m_modConfigChangeNotification &&\n        !m_modConfigChangeNotification->CanMonitorAcrossThreads()) {\n        return false;\n    }\n\n    return true;\n}\n\n// static\nstd::optional<CustomizationSession>& CustomizationSession::GetInstance() {\n    // Use NoDestructorIfTerminating not only for performance reasons, but also\n    // because it's not safe to destruct the session when the process\n    // terminates. As part of the mods unloading, we access the mods and call\n    // functions such as Wh_Uninit, but at this point, the mods' global variable\n    // destructors have already run, so we might be accessing destructed\n    // objects. Reference: https://stackoverflow.com/a/67999399\n    STATIC_INIT_ONCE(\n        NoDestructorIfTerminating<std::optional<CustomizationSession>>,\n        session);\n    return **session;\n}\n\nwil::unique_private_namespace_close\nCustomizationSession::OpenSessionPrivateNamespace() {\n    DWORD dwSessionManagerProcessId = GetSessionManagerProcessId();\n    if (dwSessionManagerProcessId == GetCurrentProcessId()) {\n        // In the session manager process, the session manager creates the\n        // private namespace, so no need to open it here.\n        return nullptr;\n    }\n\n    return SessionPrivateNamespace::Open(dwSessionManagerProcessId);\n}\n\nvoid CustomizationSession::StartInitialized(\n    wil::unique_semaphore semaphore,\n    wil::semaphore_release_scope_exit semaphoreLock,\n    bool runningFromAPC) noexcept {\n    m_sessionSemaphore = std::move(semaphore);\n    m_sessionSemaphoreLock = std::move(semaphoreLock);\n\n    if (!runningFromAPC) {\n        // No need to create a new thread, a dedicated thread was created for us\n        // before injection.\n        m_mainLoopRunner.emplace();\n        RunMainLoop();\n        DeleteThis();\n        return;\n    }\n\n    m_mainLoopRunner.emplace();\n    if (!m_mainLoopRunner->CanRunAcrossThreads()) {\n        m_mainLoopRunner.reset();\n    }\n\n    // Bump the reference count of the module to ensure that the module will\n    // stay loaded as long as the thread is executing.\n    HMODULE hDllInst;\n    GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,\n                      reinterpret_cast<LPCWSTR>(g_hDllInst), &hDllInst);\n\n    // Create a new thread with the THREAD_ATTACH_EXEMPT flag to prevent TLS and\n    // DllMain callbacks from being invoked. Otherwise, they might cause a crash\n    // if invoked too early, e.g. before CRT is initialized. If\n    // threadAttachExempt is set, just keep running with this flag. If\n    // threadAttachExempt isn't set, create a new thread without the flag once\n    // some significant code runs, such as mod/config reload or unload, or any\n    // mod callback.\n    DWORD createThreadFlags = Functions::MY_REMOTE_THREAD_THREAD_ATTACH_EXEMPT;\n\n    wil::unique_process_handle thread(Functions::MyCreateRemoteThread(\n        GetCurrentProcess(),\n        [](LPVOID pThis) -> DWORD {\n            // Prevent the system from displaying the critical-error-handler\n            // message box. A message box like this was appearing while trying\n            // to load a dll in a process with the ProcessSignaturePolicy\n            // mitigation, and it looked like this:\n            // https://stackoverflow.com/q/38367847\n            SetThreadErrorMode(SEM_FAILCRITICALERRORS, nullptr);\n            auto* this_ = reinterpret_cast<CustomizationSession*>(pThis);\n\n            if (!this_->m_mainLoopRunner) {\n                this_->m_mainLoopRunner.emplace();\n            }\n\n            if (this_->m_threadAttachExempt) {\n                this_->RunMainLoop();\n                this_->DeleteThis();\n            } else {\n                this_->RunMainLoopAndDeleteThisWithThreadRecreate();\n            }\n\n            FreeLibraryAndExitThread(g_hDllInst, this_->m_lastThreadExitCode);\n        },\n        this, createThreadFlags));\n    if (!thread) {\n        LOG(L\"Thread creation failed: %u\", GetLastError());\n        FreeLibrary(g_hDllInst);\n        DeleteThis();\n        return;\n    }\n\n    Functions::SetThreadDescriptionIfAvailable(\n        thread.get(), L\"WindhawkMainLoopThreadAttachExempt\");\n}\n\nvoid CustomizationSession::\n    RunMainLoopAndDeleteThisWithThreadRecreate() noexcept {\n    bool modConfigChanged =\n        m_mainLoopRunner->Run(m_scopedStaticSessionManagerProcess,\n                              &m_lastThreadExitCode) ==\n        MainLoopRunner::Result::kReloadModsAndSettings;\n\n    if (!m_mainLoopRunner->CanRunAcrossThreads()) {\n        m_mainLoopRunner.reset();\n    }\n\n    LPTHREAD_START_ROUTINE routine;\n    if (modConfigChanged) {\n        routine = [](LPVOID pThis) -> DWORD {\n            SetThreadErrorMode(SEM_FAILCRITICALERRORS, nullptr);\n            auto* this_ = reinterpret_cast<CustomizationSession*>(pThis);\n\n            if (this_->m_mainLoopRunner) {\n                this_->m_mainLoopRunner->ContinueMonitoring();\n            } else {\n                this_->m_mainLoopRunner.emplace();\n            }\n\n            if (CurrentProcessHasMitigationPolicy()) {\n                LOG(L\"Process prohibits dynamic code, cannot reload mods \"\n                    L\"safely\");\n            } else {\n                try {\n                    this_->m_modsManager.ReloadModsAndSettings();\n                } catch (const std::exception& e) {\n                    LOG(L\"ReloadModsAndSettings failed: %S\", e.what());\n                }\n            }\n\n            this_->RunMainLoop();\n            this_->DeleteThis();\n\n            FreeLibraryAndExitThread(g_hDllInst, this_->m_lastThreadExitCode);\n        };\n    } else {\n        routine = [](LPVOID pThis) -> DWORD {\n            SetThreadErrorMode(SEM_FAILCRITICALERRORS, nullptr);\n            auto* this_ = reinterpret_cast<CustomizationSession*>(pThis);\n\n            this_->DeleteThis();\n\n            FreeLibraryAndExitThread(g_hDllInst, this_->m_lastThreadExitCode);\n        };\n    }\n\n    // Bump the reference count of the module to ensure that the module will\n    // stay loaded as long as the thread is executing.\n    HMODULE hDllInst;\n    GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,\n                      reinterpret_cast<LPCWSTR>(g_hDllInst), &hDllInst);\n\n    wil::unique_process_handle thread(\n        Functions::MyCreateRemoteThread(GetCurrentProcess(), routine, this, 0));\n    if (!thread) {\n        LOG(L\"Thread creation failed: %u\", GetLastError());\n        FreeLibrary(g_hDllInst);\n        DeleteThis();\n        return;\n    }\n\n    Functions::SetThreadDescriptionIfAvailable(thread.get(),\n                                               L\"WindhawkMainLoop\");\n}\n\nvoid CustomizationSession::RunMainLoop() noexcept {\n    while (true) {\n        auto result = m_mainLoopRunner->Run(m_scopedStaticSessionManagerProcess,\n                                            &m_lastThreadExitCode);\n        if (result != MainLoopRunner::Result::kReloadModsAndSettings) {\n            break;\n        }\n\n        m_mainLoopRunner->ContinueMonitoring();\n\n        if (CurrentProcessHasMitigationPolicy()) {\n            LOG(L\"Process prohibits dynamic code, cannot reload mods safely\");\n        } else {\n            try {\n                m_modsManager.ReloadModsAndSettings();\n            } catch (const std::exception& e) {\n                LOG(L\"ReloadModsAndSettings failed: %S\", e.what());\n            }\n        }\n    }\n\n    VERBOSE(L\"Exiting engine thread wait loop\");\n}\n\nvoid CustomizationSession::DeleteThis() noexcept {\n    // If dynamic code is prohibited, removing hooks isn't possible, and\n    // unloading the dll will cause crashes. As a workaround, leave the thread\n    // hanging while the mitigation is in place. See:\n    // https://github.com/ramensoftware/windhawk-mods/discussions/2084#discussioncomment-13621678\n    //\n    // A better solution would be for the hooking library to handle this by\n    // having a kill switch allocated in non-executable memory. Then, if the\n    // hooks can't be removed, they can be disabled by setting the kill switch,\n    // and the trampolines can be leaked.\n    DWORD sleepTime = 1000;\n    while (true) {\n        if (!CurrentProcessHasMitigationPolicy()) {\n            break;\n        }\n\n        LOG(L\"Process prohibits dynamic code, cannot unload safely\");\n        Sleep(sleepTime);\n        sleepTime *= 2;\n        if (sleepTime > 60000) {\n            sleepTime = 60000;\n        }\n    }\n\n    // Make sure the semaphore is only released after the object is destroyed.\n    wil::unique_semaphore semaphore = std::move(m_sessionSemaphore);\n    wil::semaphore_release_scope_exit semaphoreLock =\n        std::move(m_sessionSemaphoreLock);\n\n    GetInstance().reset();\n}\n"
  },
  {
    "path": "src/windhawk/engine/customization_session.h",
    "content": "#pragma once\n\n#include \"mods_manager.h\"\n#include \"new_process_injector.h\"\n#include \"no_destructor.h\"\n#include \"storage_manager.h\"\n#include \"var_init_once.h\"\n\nclass CustomizationSession {\n   private:\n    // https://devblogs.microsoft.com/oldnewthing/20220721-00/?p=106879\n    struct ConstructorSecret {\n        explicit ConstructorSecret() = default;\n    };\n\n   public:\n    CustomizationSession(const CustomizationSession&) = delete;\n    CustomizationSession& operator=(const CustomizationSession&) = delete;\n\n    static void Start(bool runningFromAPC,\n                      bool threadAttachExempt,\n                      wil::unique_process_handle sessionManagerProcess,\n                      wil::unique_mutex_nothrow sessionMutex);\n    static DWORD GetSessionManagerProcessId();\n    static FILETIME GetSessionManagerProcessCreationTime();\n    static bool IsEndingSoon();\n\n    // Must be public for std emplace and destruction, but shouldn't be used\n    // outside of this file.\n    CustomizationSession(ConstructorSecret constructorSecret,\n                         bool runningFromAPC,\n                         bool threadAttachExempt,\n                         wil::unique_process_handle sessionManagerProcess,\n                         wil::unique_mutex_nothrow sessionMutex);\n    ~CustomizationSession();\n\n   private:\n    // Used to hold a single process handle which can be accessed from static\n    // functions.\n    class ScopedStaticSessionManagerProcess {\n       public:\n        ScopedStaticSessionManagerProcess(\n            const ScopedStaticSessionManagerProcess&) = delete;\n        ScopedStaticSessionManagerProcess& operator=(\n            const ScopedStaticSessionManagerProcess&) = delete;\n\n        ScopedStaticSessionManagerProcess(wil::unique_process_handle handle) {\n            GetInstance().emplace(std::move(handle));\n        }\n        ~ScopedStaticSessionManagerProcess() { GetInstance().reset(); }\n        static std::optional<wil::unique_process_handle>& GetInstance() {\n            STATIC_INIT_ONCE(NoDestructorIfTerminating<\n                                 std::optional<wil::unique_process_handle>>,\n                             handle);\n            return **handle;\n        }\n        operator HANDLE() { return GetInstance().value().get(); }\n    };\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    class MinHookScopeInit {\n       public:\n        MinHookScopeInit(const MinHookScopeInit&) = delete;\n        MinHookScopeInit& operator=(const MinHookScopeInit&) = delete;\n\n        MinHookScopeInit(MH_THREAD_FREEZE_METHOD freezeMethod);\n        ~MinHookScopeInit();\n    };\n\n    class MinHookScopeApply {\n       public:\n        MinHookScopeApply(const MinHookScopeApply&) = delete;\n        MinHookScopeApply& operator=(const MinHookScopeApply&) = delete;\n\n        MinHookScopeApply();\n        ~MinHookScopeApply();\n    };\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n\n    class MainLoopRunner {\n       public:\n        MainLoopRunner() noexcept;\n\n        enum class Result {\n            kReloadModsAndSettings,\n            kCompleted,\n            kError,\n        };\n\n        Result Run(HANDLE sessionManagerProcess,\n                   DWORD* lastThreadExitCode) noexcept;\n        bool ContinueMonitoring() noexcept;\n        bool CanRunAcrossThreads() noexcept;\n\n       private:\n        std::optional<StorageManager::ModConfigChangeNotification>\n            m_modConfigChangeNotification;\n    };\n\n    static std::optional<CustomizationSession>& GetInstance();\n\n    wil::unique_private_namespace_close OpenSessionPrivateNamespace();\n    void StartInitialized(wil::unique_semaphore semaphore,\n                          wil::semaphore_release_scope_exit semaphoreLock,\n                          bool runningFromAPC) noexcept;\n    void RunMainLoopAndDeleteThisWithThreadRecreate() noexcept;\n    void RunMainLoop() noexcept;\n    void DeleteThis() noexcept;\n\n    bool m_threadAttachExempt;\n    ScopedStaticSessionManagerProcess m_scopedStaticSessionManagerProcess;\n    wil::unique_mutex_nothrow m_sessionMutex;\n    wil::unique_private_namespace_close m_privateNamespace;\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MinHookScopeInit m_minHookScopeInit;\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n    ModsManager m_modsManager;\n    NewProcessInjector m_newProcessInjector;\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MinHookScopeApply m_minHookScopeApply;\n#endif  // WH_HOOKING_ENGINE_MINHOOK\n\n    std::optional<MainLoopRunner> m_mainLoopRunner;\n    DWORD m_lastThreadExitCode = 0;\n\n    // Must be released after the singleton object is freed. See the careful\n    // usage in DeleteThis.\n    wil::unique_semaphore m_sessionSemaphore;\n    wil::semaphore_release_scope_exit m_sessionSemaphoreLock;\n};\n"
  },
  {
    "path": "src/windhawk/engine/dll_inject.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"dll_inject.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"storage_manager.h\"\n#include \"var_init_once.h\"\n\nextern HINSTANCE g_hDllInst;\n\nnamespace {\n\n#define PRE_X32SHELLCODE_ARGS_1_TO_3 \\\n    \"\\x58\"     /* pop eax  */        \\\n    \"\\x59\"     /* pop ecx  */        \\\n    \"\\x6A\\x00\" /* push 0   */        \\\n    \"\\x6A\\x00\" /* push 0   */        \\\n    \"\\x51\"     /* push ecx */        \\\n    \"\\x50\"     /* push eax */\n\n#define PRE_X32SHELLCODE_VIRTUAL_FREE                           \\\n    \"\\xFF\\x74\\x24\\x0C\"         /* push dword ptr ss:[esp+C]  */ \\\n    \"\\xFF\\x74\\x24\\x0C\"         /* push dword ptr ss:[esp+C]  */ \\\n    \"\\xFF\\x74\\x24\\x0C\"         /* push dword ptr ss:[esp+C]  */ \\\n    \"\\xE8\\x20\\x00\\x00\\x00\"     /* call $+20                  */ \\\n    \"\\x85\\xC0\"                 /* test eax,eax               */ \\\n    \"\\x75\\x03\"                 /* jne $+3                    */ \\\n    \"\\xC2\\x0C\\x00\"             /* ret C                      */ \\\n    \"\\x59\"                     /* pop ecx                    */ \\\n    \"\\x83\\xC4\\x0C\"             /* add esp,C                  */ \\\n    \"\\x68\\x00\\x80\\x00\\x00\"     /* push 8000                  */ \\\n    \"\\x6A\\x00\"                 /* push 0                     */ \\\n    \"\\xE8\\x00\\x00\\x00\\x00\"     /* call $                     */ \\\n    \"\\x66\\x81\\x24\\x24\\x00\\xF0\" /* and word ptr ss:[esp],F000 */ \\\n    \"\\x51\"                     /* push ecx                   */ \\\n    \"\\xFF\\xE0\"                 /* jmp eax                    */\n\n// The 32-bit InjectShellcode function from the project in the inject_shellcode\n// subfolder.\nconst BYTE x32Shellcode[] =\n    PRE_X32SHELLCODE_ARGS_1_TO_3 PRE_X32SHELLCODE_VIRTUAL_FREE\n    \"\\x55\\x8B\\xEC\\x81\\xEC\\xDC\\x01\\x00\\x00\\x8B\\x45\\x08\\x32\\xD2\\xC6\\x45\\xEA\\x00\"\n    \"\\x88\\x55\\xE9\\xA8\\x01\\x74\\x0C\\x83\\xE0\\xFE\\xC6\\x45\\xEA\\x01\\x89\\x45\\x08\\xEB\"\n    \"\\x0A\\x83\\x78\\x04\\x00\\x0F\\x95\\xC2\\x88\\x55\\xE9\\x56\\x64\\x8B\\x35\\x30\\x00\\x00\"\n    \"\\x00\\x89\\xB5\\xD4\\xFE\\xFF\\xFF\\x83\\x7E\\x0C\\x00\\x75\\x09\\x33\\xC0\\x5E\\x8B\\xE5\"\n    \"\\x5D\\xC2\\x0C\\x00\\x8D\\x85\\x70\\xFF\\xFF\\xFF\\xC7\\x45\\x80\\x4B\\x45\\x52\\x4E\\x89\"\n    \"\\x85\\x48\\xFE\\xFF\\xFF\\x33\\xC9\\x8D\\x85\\x30\\xFF\\xFF\\xFF\\xC7\\x45\\x84\\x45\\x4C\"\n    \"\\x33\\x32\\x89\\x85\\x4C\\xFE\\xFF\\xFF\\x8D\\x45\\x98\\x89\\x85\\x50\\xFE\\xFF\\xFF\\x8D\"\n    \"\\x45\\xA4\\x89\\x85\\x54\\xFE\\xFF\\xFF\\x8D\\x85\\x60\\xFF\\xFF\\xFF\\x89\\x85\\x58\\xFE\"\n    \"\\xFF\\xFF\\x8D\\x85\\x08\\xFF\\xFF\\xFF\\x89\\x85\\x5C\\xFE\\xFF\\xFF\\x8D\\x45\\x8C\\x89\"\n    \"\\x85\\x60\\xFE\\xFF\\xFF\\x8D\\x85\\xF4\\xFE\\xFF\\xFF\\x89\\x85\\x64\\xFE\\xFF\\xFF\\x8D\"\n    \"\\x85\\x50\\xFF\\xFF\\xFF\\x89\\x85\\x68\\xFE\\xFF\\xFF\\x8D\\x85\\xCC\\xFE\\xFF\\xFF\\x89\"\n    \"\\x85\\x24\\xFE\\xFF\\xFF\\x8D\\x85\\xC8\\xFE\\xFF\\xFF\\x53\\x33\\xDB\\x89\\x85\\x28\\xFE\"\n    \"\\xFF\\xFF\\x8D\\x85\\xC4\\xFE\\xFF\\xFF\\xC7\\x45\\x88\\x2E\\x44\\x4C\\x4C\\x57\\x33\\xFF\"\n    \"\\x89\\x85\\x2C\\xFE\\xFF\\xFF\\xC7\\x85\\x70\\xFF\\xFF\\xFF\\x4C\\x6F\\x61\\x64\\x8D\\x45\"\n    \"\\xCC\\xC7\\x85\\x74\\xFF\\xFF\\xFF\\x4C\\x69\\x62\\x72\\xC7\\x85\\x78\\xFF\\xFF\\xFF\\x61\"\n    \"\\x72\\x79\\x57\\xC6\\x85\\x7C\\xFF\\xFF\\xFF\\x00\\xC7\\x85\\x30\\xFF\\xFF\\xFF\\x47\\x65\"\n    \"\\x74\\x50\\xC7\\x85\\x34\\xFF\\xFF\\xFF\\x72\\x6F\\x63\\x41\\xC7\\x85\\x38\\xFF\\xFF\\xFF\"\n    \"\\x64\\x64\\x72\\x65\\x66\\xC7\\x85\\x3C\\xFF\\xFF\\xFF\\x73\\x73\\xC6\\x85\\x3E\\xFF\\xFF\"\n    \"\\xFF\\x00\\xC7\\x45\\x98\\x46\\x72\\x65\\x65\\xC7\\x45\\x9C\\x4C\\x69\\x62\\x72\\xC7\\x45\"\n    \"\\xA0\\x61\\x72\\x79\\x00\\xC7\\x45\\xA4\\x56\\x69\\x72\\x74\\xC7\\x45\\xA8\\x75\\x61\\x6C\"\n    \"\\x46\\xC7\\x45\\xAC\\x72\\x65\\x65\\x00\\xC7\\x85\\x60\\xFF\\xFF\\xFF\\x47\\x65\\x74\\x4C\"\n    \"\\xC7\\x85\\x64\\xFF\\xFF\\xFF\\x61\\x73\\x74\\x45\\xC7\\x85\\x68\\xFF\\xFF\\xFF\\x72\\x72\"\n    \"\\x6F\\x72\\xC6\\x85\\x6C\\xFF\\xFF\\xFF\\x00\\xC7\\x85\\x08\\xFF\\xFF\\xFF\\x4F\\x75\\x74\"\n    \"\\x70\\xC7\\x85\\x0C\\xFF\\xFF\\xFF\\x75\\x74\\x44\\x65\\xC7\\x85\\x10\\xFF\\xFF\\xFF\\x62\"\n    \"\\x75\\x67\\x53\\xC7\\x85\\x14\\xFF\\xFF\\xFF\\x74\\x72\\x69\\x6E\\x66\\xC7\\x85\\x18\\xFF\"\n    \"\\xFF\\xFF\\x67\\x41\\xC6\\x85\\x1A\\xFF\\xFF\\xFF\\x00\\xC7\\x45\\x8C\\x43\\x6C\\x6F\\x73\"\n    \"\\xC7\\x45\\x90\\x65\\x48\\x61\\x6E\\xC7\\x45\\x94\\x64\\x6C\\x65\\x00\\xC7\\x85\\xF4\\xFE\"\n    \"\\xFF\\xFF\\x53\\x65\\x74\\x54\\xC7\\x85\\xF8\\xFE\\xFF\\xFF\\x68\\x72\\x65\\x61\\xC7\\x85\"\n    \"\\xFC\\xFE\\xFF\\xFF\\x64\\x45\\x72\\x72\\xC7\\x85\\x00\\xFF\\xFF\\xFF\\x6F\\x72\\x4D\\x6F\"\n    \"\\x66\\xC7\\x85\\x04\\xFF\\xFF\\xFF\\x64\\x65\\xC6\\x85\\x06\\xFF\\xFF\\xFF\\x00\\xC7\\x85\"\n    \"\\x50\\xFF\\xFF\\xFF\\x43\\x72\\x65\\x61\\xC7\\x85\\x54\\xFF\\xFF\\xFF\\x74\\x65\\x54\\x68\"\n    \"\\xC7\\x85\\x58\\xFF\\xFF\\xFF\\x72\\x65\\x61\\x64\\xC6\\x85\\x5C\\xFF\\xFF\\xFF\\x00\\xC7\"\n    \"\\x85\\xCC\\xFE\\xFF\\xFF\\x00\\x00\\x00\\x00\\xC7\\x85\\xC8\\xFE\\xFF\\xFF\\x00\\x00\\x00\"\n    \"\\x00\\xC7\\x85\\xC4\\xFE\\xFF\\xFF\\x00\\x00\\x00\\x00\\xC7\\x45\\xCC\\x00\\x00\\x00\\x00\"\n    \"\\xC7\\x85\\xDC\\xFE\\xFF\\xFF\\x00\\x00\\x00\\x00\\x89\\x4D\\xE4\\x89\\x4D\\xD4\\x89\\x5D\"\n    \"\\xD8\\x89\\x9D\\xD8\\xFE\\xFF\\xFF\\x89\\xBD\\xE8\\xFE\\xFF\\xFF\\x89\\x85\\x30\\xFE\\xFF\"\n    \"\\xFF\\x8D\\x5D\\x80\\x8D\\x85\\xDC\\xFE\\xFF\\xFF\\x89\\x9D\\x7C\\xFE\\xFF\\xFF\\x89\\x85\"\n    \"\\x34\\xFE\\xFF\\xFF\\x8D\\x45\\xE4\\x89\\x85\\x38\\xFE\\xFF\\xFF\\x8D\\x45\\xD4\\x89\\x85\"\n    \"\\x3C\\xFE\\xFF\\xFF\\x8D\\x85\\xD8\\xFE\\xFF\\xFF\\x89\\x85\\x40\\xFE\\xFF\\xFF\\x8D\\x85\"\n    \"\\xE8\\xFE\\xFF\\xFF\\x89\\x85\\x44\\xFE\\xFF\\xFF\\x8D\\x85\\x48\\xFE\\xFF\\xFF\\x89\\x85\"\n    \"\\x84\\xFE\\xFF\\xFF\\x8D\\x85\\x24\\xFE\\xFF\\xFF\\x89\\x85\\x88\\xFE\\xFF\\xFF\\x33\\xC0\"\n    \"\\x89\\x85\\x90\\xFE\\xFF\\xFF\\x89\\x85\\x94\\xFE\\xFF\\xFF\\x89\\x85\\x98\\xFE\\xFF\\xFF\"\n    \"\\x89\\x85\\x9C\\xFE\\xFF\\xFF\\x89\\x85\\xA0\\xFE\\xFF\\xFF\\x89\\x85\\xA4\\xFE\\xFF\\xFF\"\n    \"\\x89\\x85\\xA8\\xFE\\xFF\\xFF\\x89\\x85\\xAC\\xFE\\xFF\\xFF\\x89\\x85\\xB0\\xFE\\xFF\\xFF\"\n    \"\\x89\\x85\\xB4\\xFE\\xFF\\xFF\\x88\\x85\\x2C\\xFF\\xFF\\xFF\\x8D\\x85\\x1C\\xFF\\xFF\\xFF\"\n    \"\\x89\\x85\\x6C\\xFE\\xFF\\xFF\\x8D\\x85\\x40\\xFF\\xFF\\xFF\\x89\\x85\\x70\\xFE\\xFF\\xFF\"\n    \"\\x33\\xC0\\x89\\x45\\xE0\\x89\\x85\\xE4\\xFE\\xFF\\xFF\\x89\\x85\\xE0\\xFE\\xFF\\xFF\\x8D\"\n    \"\\x85\\xE4\\xFE\\xFF\\xFF\\x89\\x85\\x74\\xFE\\xFF\\xFF\\x8D\\x85\\xE0\\xFE\\xFF\\xFF\\xC7\"\n    \"\\x85\\x80\\xFE\\xFF\\xFF\\x0C\\x00\\x00\\x00\\xC7\\x85\\x8C\\xFE\\xFF\\xFF\\x09\\x00\\x00\"\n    \"\\x00\\xC7\\x45\\xBC\\x4E\\x54\\x44\\x4C\\xC7\\x45\\xC0\\x4C\\x2E\\x44\\x4C\\xC6\\x45\\xC4\"\n    \"\\x4C\\xC7\\x85\\x1C\\xFF\\xFF\\xFF\\x4E\\x74\\x51\\x75\\xC7\\x85\\x20\\xFF\\xFF\\xFF\\x65\"\n    \"\\x75\\x65\\x41\\xC7\\x85\\x24\\xFF\\xFF\\xFF\\x70\\x63\\x54\\x68\\xC7\\x85\\x28\\xFF\\xFF\"\n    \"\\xFF\\x72\\x65\\x61\\x64\\xC7\\x85\\x40\\xFF\\xFF\\xFF\\x4E\\x74\\x41\\x6C\\xC7\\x85\\x44\"\n    \"\\xFF\\xFF\\xFF\\x65\\x72\\x74\\x54\\xC7\\x85\\x48\\xFF\\xFF\\xFF\\x68\\x72\\x65\\x61\\x66\"\n    \"\\xC7\\x85\\x4C\\xFF\\xFF\\xFF\\x64\\x00\\x89\\x85\\x78\\xFE\\xFF\\xFF\\x84\\xD2\\x74\\x3B\"\n    \"\\xF6\\x46\\x28\\x02\\x74\\x35\\x8D\\x45\\xBC\\xC7\\x85\\x94\\xFE\\xFF\\xFF\\x09\\x00\\x00\"\n    \"\\x00\\x89\\x85\\x90\\xFE\\xFF\\xFF\\x8D\\x85\\x6C\\xFE\\xFF\\xFF\\x89\\x85\\x98\\xFE\\xFF\"\n    \"\\xFF\\x8D\\x85\\x74\\xFE\\xFF\\xFF\\x89\\x85\\x9C\\xFE\\xFF\\xFF\\xC7\\x85\\xA0\\xFE\\xFF\"\n    \"\\xFF\\x02\\x00\\x00\\x00\\x8B\\x46\\x0C\\x32\\xD2\\x83\\xC0\\x0C\\x89\\x45\\xD0\\x8B\\x00\"\n    \"\\x3B\\x45\\xD0\\x0F\\x84\\xE3\\x00\\x00\\x00\\x8B\\xC8\\x8B\\xC1\\x8B\\x09\\x89\\x45\\xC8\"\n    \"\\x89\\x8D\\xEC\\xFE\\xFF\\xFF\\x33\\xC9\\x89\\x4D\\xDC\\x8B\\x50\\x30\\x66\\x8B\\x40\\x2C\"\n    \"\\x66\\xD1\\xE8\\x89\\x55\\xE0\\x0F\\xB7\\xF8\\x85\\xDB\\x0F\\x84\\x63\\x02\\x00\\x00\\x8D\"\n    \"\\x9D\\x7C\\xFE\\xFF\\xFF\\x89\\x9D\\xF0\\xFE\\xFF\\xFF\\x83\\x7B\\x10\\x00\\x74\\x52\\x3B\"\n    \"\\x7B\\x04\\x75\\x4D\\x33\\xC0\\x33\\xF6\\x66\\x3B\\xC7\\x73\\x3B\\x8B\\x1B\\x8D\\x49\\x00\"\n    \"\\x0F\\xB7\\xCE\\x0F\\xB7\\x14\\x4A\\x8D\\x42\\x9F\\x66\\x83\\xF8\\x19\\x77\\x06\\x81\\xC2\"\n    \"\\xE0\\xFF\\x00\\x00\\x0F\\xBE\\x0C\\x19\\x0F\\xB7\\xC2\\x3B\\xC1\\x75\\x09\\x8B\\x55\\xE0\"\n    \"\\x46\\x66\\x3B\\xF7\\x72\\xD6\\x8B\\x9D\\xF0\\xFE\\xFF\\xFF\\x8B\\x4D\\xDC\\x8B\\x55\\xE0\"\n    \"\\x66\\x3B\\xF7\\x0F\\x84\\xC7\\x00\\x00\\x00\\x41\\xC6\\x45\\xEB\\x00\\x8D\\x9D\\x7C\\xFE\"\n    \"\\xFF\\xFF\\x89\\x4D\\xDC\\x8D\\x04\\x89\\x83\\x3C\\x83\\x00\\x8D\\x1C\\x83\\x89\\x9D\\xF0\"\n    \"\\xFE\\xFF\\xFF\\x75\\x88\\x8A\\x55\\xEB\\x8B\\x9D\\x7C\\xFE\\xFF\\xFF\\x8B\\x8D\\xEC\\xFE\"\n    \"\\xFF\\xFF\\x3B\\x4D\\xD0\\x0F\\x85\\x3A\\xFF\\xFF\\xFF\\x8B\\x85\\xD8\\xFE\\xFF\\xFF\\x8B\"\n    \"\\x4D\\xE4\\x8B\\xBD\\xE8\\xFE\\xFF\\xFF\\x89\\x45\\xD8\\x8B\\x85\\xE4\\xFE\\xFF\\xFF\\x89\"\n    \"\\x45\\xE0\\x80\\x7D\\xE9\\x00\\x8B\\x45\\x08\\x8B\\x9D\\xD4\\xFE\\xFF\\xFF\\x8B\\x30\\x0F\"\n    \"\\x84\\x70\\x02\\x00\\x00\\xF6\\x43\\x28\\x02\\x0F\\x84\\x66\\x02\\x00\\x00\\x8B\\x45\\x0C\"\n    \"\\x40\\x89\\x45\\x0C\\x85\\xC9\\x0F\\x84\\x85\\x01\\x00\\x00\\x83\\xFE\\x02\\x0F\\x8C\\x7C\"\n    \"\\x01\\x00\\x00\\x04\\x40\\xC7\\x45\\xF0\\x5B\\x57\\x48\\x5D\\x88\\x45\\xFC\\x8D\\x45\\xF0\"\n    \"\\x50\\xC7\\x45\\xF4\\x20\\x41\\x50\\x43\\xC7\\x45\\xF8\\x20\\x52\\x45\\x20\\x66\\xC7\\x45\"\n    \"\\xFD\\x0A\\x00\\xFF\\xD1\\x8B\\x4D\\xE4\\x8B\\xBD\\xE8\\xFE\\xFF\\xFF\\x8B\\x95\\xE4\\xFE\"\n    \"\\xFF\\xFF\\x8B\\x45\\x0C\\xE9\\x42\\x01\\x00\\x00\\x32\\xD2\\x85\\xDB\\x0F\\x84\\x52\\xFF\"\n    \"\\xFF\\xFF\\x8B\\x45\\xC8\\x8B\\x70\\x18\\x89\\x75\\xDC\\x8B\\x46\\x3C\\x8B\\x54\\x30\\x78\"\n    \"\\x8B\\x44\\x32\\x20\\x03\\xD6\\x03\\xC6\\x89\\x95\\xD0\\xFE\\xFF\\xFF\\x89\\x45\\xC8\\x8B\"\n    \"\\x4A\\x24\\x8B\\x7A\\x18\\x03\\xCE\\x89\\x4D\\xE0\\x8B\\x4B\\x10\\x89\\x7D\\xD8\\x85\\xFF\"\n    \"\\x74\\x53\\x8B\\x38\\x8B\\xD1\\x03\\xFE\\x33\\xF6\\x85\\xC9\\x74\\x2A\\x8B\\x43\\x08\\x8A\"\n    \"\\x2F\\x8B\\x14\\xB0\\x8A\\x0A\\x3A\\xCD\\x75\\x14\\x8B\\xC7\\x2B\\xD7\\x84\\xC9\\x74\\x68\"\n    \"\\x8A\\x4C\\x02\\x01\\x40\\x3A\\x08\\x74\\xF3\\x8B\\x43\\x08\\x8B\\x53\\x10\\x46\\x3B\\xF2\"\n    \"\\x72\\xDB\\x8B\\x75\\xDC\\x8B\\x45\\xC8\\x8B\\xCA\\x8B\\x7D\\xD8\\x83\\xC0\\x04\\x83\\x45\"\n    \"\\xE0\\x02\\x4F\\x89\\x45\\xC8\\x89\\x7D\\xD8\\x85\\xD2\\x75\\xA9\\x8B\\x9D\\x7C\\xFE\\xFF\"\n    \"\\xFF\\x33\\xC9\\xB2\\x01\\x85\\xDB\\x0F\\x84\\xCC\\xFE\\xFF\\xFF\\x33\\xC0\\x8D\\x49\\x00\"\n    \"\\x83\\xBC\\x05\\x8C\\xFE\\xFF\\xFF\\x00\\x77\\x7D\\x41\\x8D\\x04\\x89\\xC1\\xE0\\x02\\x83\"\n    \"\\xBC\\x05\\x7C\\xFE\\xFF\\xFF\\x00\\x75\\xE5\\xE9\\xA7\\xFE\\xFF\\xFF\\x8B\\x4B\\x10\\x8B\"\n    \"\\x43\\x0C\\x8B\\x3C\\xB0\\x8D\\x04\\xB0\\x89\\x85\\xB8\\xFE\\xFF\\xFF\\x8D\\x51\\xFF\\x3B\"\n    \"\\xF2\\x73\\x22\\x8B\\x43\\x08\\x8B\\x5B\\x08\\x8B\\x44\\x88\\xFC\\x89\\x04\\xB3\\x8B\\x9D\"\n    \"\\xF0\\xFE\\xFF\\xFF\\x8B\\x43\\x0C\\x8B\\x44\\x88\\xFC\\x8B\\x8D\\xB8\\xFE\\xFF\\xFF\\x89\"\n    \"\\x01\\x8B\\x75\\xDC\\x89\\x53\\x10\\x85\\xFF\\x0F\\x84\\x66\\xFF\\xFF\\xFF\\x8B\\x45\\xE0\"\n    \"\\x0F\\xB7\\x08\\x8B\\x85\\xD0\\xFE\\xFF\\xFF\\x8B\\x40\\x1C\\x8D\\x04\\x88\\x8B\\x04\\x30\"\n    \"\\x03\\xC6\\x89\\x07\\xE9\\x48\\xFF\\xFF\\xFF\\x32\\xD2\\xE9\\x2A\\xFE\\xFF\\xFF\\x8A\\xD1\"\n    \"\\xE9\\x23\\xFE\\xFF\\xFF\\x8B\\x55\\xE0\\x32\\xDB\\x83\\xF8\\x0A\\x72\\x46\\x85\\xFF\\x74\"\n    \"\\x3E\\x83\\x7D\\xD4\\x00\\x74\\x38\\x8B\\x4D\\x08\\x8B\\xC1\\x6A\\x00\\x6A\\x00\\x83\\xC8\"\n    \"\\x01\\x50\\xFF\\x71\\x20\\x6A\\x00\\x6A\\x00\\xFF\\xD7\\x85\\xC0\\x74\\x1A\\x50\\xFF\\x55\"\n    \"\\xD4\\x33\\xC0\\xB3\\x01\\x84\\xDB\\x5F\\x0F\\x95\\xC0\\x48\\x23\\x45\\xCC\\x5B\\x5E\\x8B\"\n    \"\\xE5\\x5D\\xC2\\x0C\\x00\\xB0\\x34\\xEB\\x3A\\xB0\\x31\\xEB\\x39\\x85\\xD2\\x74\\x3B\\x83\"\n    \"\\xBD\\xE0\\xFE\\xFF\\xFF\\x00\\x74\\x32\\x6A\\x00\\x50\\x8B\\x45\\x08\\x50\\xFF\\x70\\x28\"\n    \"\\x6A\\xFE\\xFF\\xD2\\x85\\xC0\\x78\\x15\\x6A\\xFE\\xB3\\x01\\xFF\\x95\\xE0\\xFE\\xFF\\xFF\"\n    \"\\x85\\xC0\\x0F\\x99\\xC0\\xFE\\xC8\\x24\\x33\\xEB\\x02\\xB0\\x32\\x8B\\x4D\\xE4\\x84\\xC0\"\n    \"\\x74\\x31\\xEB\\x02\\xB0\\x31\\x85\\xC9\\x74\\x29\\x83\\xFE\\x01\\x7C\\x24\\x88\\x45\\xFC\"\n    \"\\x8D\\x45\\xF0\\x50\\xC7\\x45\\xF0\\x5B\\x57\\x48\\x5D\\xC7\\x45\\xF4\\x20\\x41\\x50\\x43\"\n    \"\\xC7\\x45\\xF8\\x20\\x45\\x52\\x52\\x66\\xC7\\x45\\xFD\\x0A\\x00\\xFF\\xD1\\x33\\xC0\\x84\"\n    \"\\xDB\\x5F\\x0F\\x95\\xC0\\x48\\x23\\x45\\xCC\\x5B\\x5E\\x8B\\xE5\\x5D\\xC2\\x0C\\x00\\x84\"\n    \"\\xD2\\x75\\x36\\x85\\xC9\\x74\\x1F\\x83\\xFE\\x01\\x7C\\x1A\\x8D\\x45\\xF4\\xC7\\x45\\xF4\"\n    \"\\x5B\\x57\\x48\\x5D\\x50\\xC7\\x45\\xF8\\x20\\x45\\x58\\x50\\x66\\xC7\\x45\\xFC\\x0A\\x00\"\n    \"\\xFF\\xD1\\x80\\x7D\\xEA\\x00\\x0F\\x84\\x58\\x02\\x00\\x00\\xF6\\x43\\x28\\x02\\xE9\\x42\"\n    \"\\x02\\x00\\x00\\x8D\\x85\\xBC\\xFE\\xFF\\xFF\\xC7\\x45\\xB0\\x49\\x6E\\x6A\\x65\\x50\\x6A\"\n    \"\\x01\\xC7\\x45\\xB4\\x63\\x74\\x49\\x6E\\x33\\xFF\\x66\\xC7\\x45\\xB8\\x69\\x74\\x33\\xDB\"\n    \"\\xC6\\x45\\xBA\\x00\\xC7\\x45\\x0C\\x00\\x00\\x00\\x00\\xFF\\x55\\xD8\\x83\\xFE\\x02\\x7C\"\n    \"\\x18\\x8D\\x45\\xF4\\xC7\\x45\\xF4\\x5B\\x57\\x48\\x5D\\x50\\xC7\\x45\\xF8\\x20\\x4C\\x4C\"\n    \"\\x0A\\x88\\x5D\\xFC\\xFF\\x55\\xE4\\x8B\\x45\\x08\\x8B\\x8D\\xCC\\xFE\\xFF\\xFF\\x83\\xC0\"\n    \"\\x30\\x50\\xFF\\xD1\\x89\\x45\\xD0\\x85\\xC0\\x0F\\x84\\xC4\\x00\\x00\\x00\\x83\\xFE\\x02\"\n    \"\\x7C\\x1B\\x8D\\x45\\xF4\\xC7\\x45\\xF4\\x5B\\x57\\x48\\x5D\\x50\\xC7\\x45\\xF8\\x20\\x47\"\n    \"\\x50\\x41\\x66\\xC7\\x45\\xFC\\x0A\\x00\\xFF\\x55\\xE4\\x8B\\x85\\xC8\\xFE\\xFF\\xFF\\x8D\"\n    \"\\x4D\\xB0\\x51\\xFF\\x75\\xD0\\xFF\\xD0\\x89\\x85\\xD0\\xFE\\xFF\\xFF\\x85\\xC0\\x74\\x70\"\n    \"\\x83\\xFE\\x02\\x7C\\x58\\x8D\\x45\\xF4\\xC7\\x45\\xF4\\x5B\\x57\\x48\\x5D\\x50\\xC7\\x45\"\n    \"\\xF8\\x20\\x49\\x49\\x0A\\x88\\x5D\\xFC\\xFF\\x55\\xE4\\xFF\\x75\\x08\\xC7\\x45\\x0C\\x01\"\n    \"\\x00\\x00\\x00\\xFF\\x95\\xD0\\xFE\\xFF\\xFF\\x8B\\xF8\\xC7\\x45\\xF4\\x5B\\x57\\x48\\x5D\"\n    \"\\x83\\xC4\\x04\\xC7\\x45\\xF8\\x20\\x49\\x49\\x3A\\x85\\xFF\\xC6\\x45\\xFC\\x20\\x66\\xC7\"\n    \"\\x45\\xFE\\x0A\\x00\\x0F\\x95\\xC0\\x04\\x30\\x88\\x45\\xFD\\x8D\\x45\\xF4\\x50\\xFF\\x55\"\n    \"\\xE4\\xEB\\x1B\\xFF\\x75\\x08\\xC7\\x45\\x0C\\x01\\x00\\x00\\x00\\xFF\\xD0\\x83\\xC4\\x04\"\n    \"\\x8B\\xF8\\xEB\\x08\\xFF\\x95\\xDC\\xFE\\xFF\\xFF\\x8B\\xD8\\xFF\\x75\\xD0\\xFF\\x95\\xC4\"\n    \"\\xFE\\xFF\\xFF\\x85\\xFF\\x0F\\x85\\xFC\\x00\\x00\\x00\\xEB\\x08\\xFF\\x95\\xDC\\xFE\\xFF\"\n    \"\\xFF\\x8B\\xD8\\x8B\\x7D\\x08\\x8B\\x47\\x18\\x85\\xC0\\x74\\x04\\x50\\xFF\\x55\\xD4\\xFF\"\n    \"\\x77\\x10\\xFF\\x55\\xD4\\x83\\x7D\\x0C\\x00\\x0F\\x85\\xD4\\x00\\x00\\x00\\x83\\xFE\\x01\"\n    \"\\x0F\\x8C\\xCB\\x00\\x00\\x00\\x8B\\xC3\\xC7\\x45\\xEC\\x5B\\x57\\x48\\x5D\\x83\\xE0\\x0F\"\n    \"\\xC7\\x45\\xF0\\x20\\x45\\x52\\x52\\x66\\xC7\\x45\\xF4\\x3A\\x20\\x66\\xC7\\x45\\xFE\\x0A\"\n    \"\\x00\\x83\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\\x04\\x37\\xC1\\xEB\\x04\\x88\\x45\\xFD\"\n    \"\\x8B\\xC3\\x83\\xE0\\x0F\\x83\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\\x04\\x37\\xC1\\xEB\"\n    \"\\x04\\x88\\x45\\xFC\\x8B\\xC3\\x83\\xE0\\x0F\\x83\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\"\n    \"\\x04\\x37\\xC1\\xEB\\x04\\x88\\x45\\xFB\\x8B\\xC3\\x83\\xE0\\x0F\\x83\\xF8\\x0A\\x73\\x04\"\n    \"\\x04\\x30\\xEB\\x02\\x04\\x37\\xC1\\xEB\\x04\\x88\\x45\\xFA\\x8B\\xC3\\x83\\xE0\\x0F\\x83\"\n    \"\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\\x04\\x37\\xC1\\xEB\\x04\\x88\\x45\\xF9\\x8B\\xC3\"\n    \"\\x83\\xE0\\x0F\\x83\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\\x04\\x37\\xC1\\xEB\\x04\\x88\"\n    \"\\x45\\xF8\\x8B\\xC3\\x83\\xE0\\x0F\\x83\\xF8\\x0A\\x73\\x04\\x04\\x30\\xEB\\x02\\x04\\x37\"\n    \"\\xC1\\xEB\\x04\\x88\\x45\\xF7\\x83\\xFB\\x0A\\x73\\x05\\x80\\xC3\\x30\\xEB\\x03\\x80\\xC3\"\n    \"\\x37\\x8D\\x45\\xEC\\x88\\x5D\\xF6\\x50\\xFF\\x55\\xE4\\x6A\\x00\\xFF\\xB5\\xBC\\xFE\\xFF\"\n    \"\\xFF\\xFF\\x95\\xD8\\xFE\\xFF\\xFF\\x80\\x7D\\xEA\\x00\\x74\\x17\\x8B\\x85\\xD4\\xFE\\xFF\"\n    \"\\xFF\\xF6\\x40\\x28\\x02\\x74\\x0B\\x5F\\x5B\\x33\\xC0\\x5E\\x8B\\xE5\\x5D\\xC2\\x0C\\x00\"\n    \"\\x8B\\x45\\xCC\\x5F\\x5B\\x5E\\x8B\\xE5\\x5D\\xC2\\x0C\\x00\";\n\nconstexpr size_t x32ShellcodeSize = sizeof(x32Shellcode) - 1;\n\n#define PRE_X64SHELLCODE_VIRTUAL_FREE                             \\\n    \"\\x48\\x83\\xEC\\x28\"             /* sub rsp,28               */ \\\n    \"\\xE8\\x20\\x00\\x00\\x00\"         /* call $+20                */ \\\n    \"\\x48\\x83\\xC4\\x28\"             /* add rsp,28               */ \\\n    \"\\x48\\x85\\xC0\"                 /* test rax,rax             */ \\\n    \"\\x75\\x01\"                     /* jne $+1                  */ \\\n    \"\\xC3\"                         /* ret                      */ \\\n    \"\\x48\\x8D\\x0D\\x00\\x00\\x00\\x00\" /* lea rcx,qword ptr ds:[$] */ \\\n    \"\\x66\\x81\\xE1\\x00\\xF0\"         /* and cx,F000              */ \\\n    \"\\x33\\xD2\"                     /* xor edx,edx              */ \\\n    \"\\x41\\xB8\\x00\\x80\\x00\\x00\"     /* mov r8d,8000             */ \\\n    \"\\xFF\\xE0\"                     /* jmp rax                  */\n\n// The 64-bit InjectShellcode function from the project in the inject_shellcode\n// subfolder.\nconst BYTE x64Shellcode[] = PRE_X64SHELLCODE_VIRTUAL_FREE\n    \"\\x48\\x89\\x54\\x24\\x10\\x48\\x89\\x4C\\x24\\x08\\x55\\x56\\x41\\x54\\x41\\x56\\x48\\x8D\"\n    \"\\xAC\\x24\\xE8\\xFD\\xFF\\xFF\\x48\\x81\\xEC\\x18\\x03\\x00\\x00\\x4C\\x8B\\xF1\\xC6\\x85\"\n    \"\\x58\\x02\\x00\\x00\\x00\\x32\\xC9\\x4C\\x8B\\xE2\\x88\\x4C\\x24\\x48\\x41\\xF6\\xC6\\x01\"\n    \"\\x74\\x14\\x49\\x83\\xE6\\xFE\\xC6\\x85\\x58\\x02\\x00\\x00\\x01\\x4C\\x89\\xB5\\x40\\x02\"\n    \"\\x00\\x00\\xEB\\x0C\\x41\\x83\\x7E\\x04\\x00\\x0F\\x95\\xC1\\x88\\x4C\\x24\\x48\\x65\\x48\"\n    \"\\x8B\\x34\\x25\\x60\\x00\\x00\\x00\\x48\\x89\\xB5\\xB0\\x00\\x00\\x00\\x48\\x83\\x7E\\x18\"\n    \"\\x00\\x75\\x10\\x33\\xC0\\x48\\x81\\xC4\\x18\\x03\\x00\\x00\\x41\\x5E\\x41\\x5C\\x5E\\x5D\"\n    \"\\xC3\\xC7\\x45\\xA8\\x4B\\x45\\x52\\x4E\\x48\\x8D\\x45\\xB8\\xC7\\x45\\xAC\\x45\\x4C\\x33\"\n    \"\\x32\\xC7\\x45\\xB0\\x2E\\x44\\x4C\\x4C\\xC7\\x45\\xB8\\x4C\\x6F\\x61\\x64\\xC7\\x45\\xBC\"\n    \"\\x4C\\x69\\x62\\x72\\xC7\\x45\\xC0\\x61\\x72\\x79\\x57\\xC6\\x45\\xC4\\x00\\xC7\\x45\\xF8\"\n    \"\\x47\\x65\\x74\\x50\\xC7\\x45\\xFC\\x72\\x6F\\x63\\x41\\xC7\\x45\\x00\\x64\\x64\\x72\\x65\"\n    \"\\x66\\xC7\\x45\\x04\\x73\\x73\\xC6\\x45\\x06\\x00\\xC7\\x44\\x24\\x78\\x46\\x72\\x65\\x65\"\n    \"\\xC7\\x44\\x24\\x7C\\x4C\\x69\\x62\\x72\\xC7\\x45\\x80\\x61\\x72\\x79\\x00\\xC7\\x45\\x88\"\n    \"\\x56\\x69\\x72\\x74\\xC7\\x45\\x8C\\x75\\x61\\x6C\\x46\\xC7\\x45\\x90\\x72\\x65\\x65\\x00\"\n    \"\\xC7\\x45\\xC8\\x47\\x65\\x74\\x4C\\xC7\\x45\\xCC\\x61\\x73\\x74\\x45\\xC7\\x45\\xD0\\x72\"\n    \"\\x72\\x6F\\x72\\xC6\\x45\\xD4\\x00\\xC6\\x45\\x20\\x4F\\xC6\\x45\\x21\\x75\\xC6\\x45\\x22\"\n    \"\\x74\\xC6\\x45\\x23\\x70\\xC6\\x45\\x24\\x75\\xC6\\x45\\x25\\x74\\xC6\\x45\\x26\\x44\\xC6\"\n    \"\\x45\\x27\\x65\\xC6\\x45\\x28\\x62\\xC6\\x45\\x29\\x75\\xC6\\x45\\x2A\\x67\\xC6\\x45\\x2B\"\n    \"\\x53\\xC6\\x45\\x2C\\x74\\xC6\\x45\\x2D\\x72\\xC6\\x45\\x2E\\x69\\xC6\\x45\\x2F\\x6E\\xC6\"\n    \"\\x45\\x30\\x67\\xC6\\x45\\x31\\x41\\xC6\\x45\\x32\\x00\\xC7\\x45\\x98\\x43\\x6C\\x6F\\x73\"\n    \"\\xC7\\x45\\x9C\\x65\\x48\\x61\\x6E\\xC7\\x45\\xA0\\x64\\x6C\\x65\\x00\\xC6\\x45\\x38\\x53\"\n    \"\\xC6\\x45\\x39\\x65\\xC6\\x45\\x3A\\x74\\xC6\\x45\\x3B\\x54\\xC6\\x45\\x3C\\x68\\xC6\\x45\"\n    \"\\x3D\\x72\\xC6\\x45\\x3E\\x65\\xC6\\x45\\x3F\\x61\\xC6\\x45\\x40\\x64\\xC6\\x45\\x41\\x45\"\n    \"\\xC6\\x45\\x42\\x72\\xC6\\x45\\x43\\x72\\xC6\\x45\\x44\\x6F\\xC6\\x45\\x45\\x72\\x48\\x89\"\n    \"\\x85\\x60\\x01\\x00\\x00\\x48\\x8D\\x45\\xF8\\xC6\\x45\\x46\\x4D\\x48\\x89\\x85\\x68\\x01\"\n    \"\\x00\\x00\\x48\\x8D\\x44\\x24\\x78\\xC6\\x45\\x47\\x6F\\x48\\x89\\x9C\\x24\\x50\\x03\\x00\"\n    \"\\x00\\x48\\x89\\x85\\x70\\x01\\x00\\x00\\x48\\x8D\\x45\\x88\\xC6\\x45\\x48\\x64\\x48\\x89\"\n    \"\\xBC\\x24\\x10\\x03\\x00\\x00\\x48\\x89\\x85\\x78\\x01\\x00\\x00\\x48\\x8D\\x45\\xC8\\xC6\"\n    \"\\x45\\x49\\x65\\x4C\\x89\\xAC\\x24\\x08\\x03\\x00\\x00\\xC6\\x45\\x4A\\x00\\x4C\\x89\\xBC\"\n    \"\\x24\\x00\\x03\\x00\\x00\\xC7\\x45\\xD8\\x43\\x72\\x65\\x61\\xC7\\x45\\xDC\\x74\\x65\\x54\"\n    \"\\x68\\xC7\\x45\\xE0\\x72\\x65\\x61\\x64\\xC6\\x45\\xE4\\x00\\x48\\x89\\x85\\x80\\x01\\x00\"\n    \"\\x00\\xC7\\x44\\x24\\x58\\x4E\\x54\\x44\\x4C\\x48\\x8D\\x95\\x98\\x00\\x00\\x00\\x48\\x89\"\n    \"\\x95\\xB0\\x01\\x00\\x00\\x48\\x8D\\x45\\x20\\x48\\x89\\x85\\x88\\x01\\x00\\x00\\x48\\x8D\"\n    \"\\x95\\xA0\\x00\\x00\\x00\\x48\\x89\\x95\\xB8\\x01\\x00\\x00\\x48\\x8D\\x45\\x98\\x48\\x89\"\n    \"\\x85\\x90\\x01\\x00\\x00\\x48\\x8D\\x95\\xA8\\x00\\x00\\x00\\x48\\x89\\x95\\xC0\\x01\\x00\"\n    \"\\x00\\x48\\x8D\\x45\\x38\\x48\\x89\\x85\\x98\\x01\\x00\\x00\\x48\\x8D\\x55\\x60\\x48\\x89\"\n    \"\\x95\\xC8\\x01\\x00\\x00\\x48\\x8D\\x45\\xD8\\x48\\x89\\x85\\xA0\\x01\\x00\\x00\\x48\\x8D\"\n    \"\\x95\\x88\\x00\\x00\\x00\\x48\\x89\\x95\\xD0\\x01\\x00\\x00\\x4C\\x8D\\x7D\\xA8\\xC7\\x44\"\n    \"\\x24\\x5C\\x4C\\x2E\\x44\\x4C\\x48\\x8D\\x54\\x24\\x50\\x48\\x89\\x95\\xD8\\x01\\x00\\x00\"\n    \"\\x45\\x33\\xED\\x4C\\x89\\xAD\\x98\\x00\\x00\\x00\\x48\\x8D\\x55\\x50\\x48\\x89\\x95\\xE0\"\n    \"\\x01\\x00\\x00\\x0F\\x57\\xC0\\x4C\\x89\\xAD\\xA0\\x00\\x00\\x00\\x48\\x8D\\x95\\x90\\x00\"\n    \"\\x00\\x00\\x48\\x89\\x95\\xE8\\x01\\x00\\x00\\x41\\x8B\\xC5\\x4C\\x89\\xAD\\xA8\\x00\\x00\"\n    \"\\x00\\x48\\x8D\\x55\\x70\\x48\\x89\\x95\\xF0\\x01\\x00\\x00\\x45\\x8B\\xC5\\x4C\\x89\\x6D\"\n    \"\\x60\\x48\\x8D\\x95\\x60\\x01\\x00\\x00\\x4C\\x89\\xAD\\x88\\x00\\x00\\x00\\x45\\x8B\\xCD\"\n    \"\\x4C\\x89\\x6C\\x24\\x50\\x4C\\x89\\x6D\\x50\\x4C\\x89\\xAD\\x90\\x00\\x00\\x00\\x48\\x89\"\n    \"\\x45\\x70\\xC6\\x44\\x24\\x60\\x4C\\xC6\\x45\\x08\\x4E\\xC6\\x45\\x09\\x74\\xC6\\x45\\x0A\"\n    \"\\x51\\xC6\\x45\\x0B\\x75\\xC6\\x45\\x0C\\x65\\xC6\\x45\\x0D\\x75\\xC6\\x45\\x0E\\x65\\xC6\"\n    \"\\x45\\x0F\\x41\\xC6\\x45\\x10\\x70\\xC6\\x45\\x11\\x63\\xC6\\x45\\x12\\x54\\xC6\\x45\\x13\"\n    \"\\x68\\xC6\\x45\\x14\\x72\\x48\\x89\\x95\\xF0\\x00\\x00\\x00\\x48\\x8D\\x95\\xB0\\x01\\x00\"\n    \"\\x00\\xC6\\x45\\x15\\x65\\x48\\x89\\x95\\xF8\\x00\\x00\\x00\\x48\\x8D\\x55\\x08\\xC6\\x45\"\n    \"\\x16\\x61\\x48\\x89\\x95\\xC0\\x00\\x00\\x00\\x48\\x8D\\x55\\xE8\\xC6\\x45\\x17\\x64\\x88\"\n    \"\\x45\\x18\\x4C\\x89\\xBD\\xE0\\x00\\x00\\x00\\x48\\xC7\\x85\\xE8\\x00\\x00\\x00\\x0C\\x00\"\n    \"\\x00\\x00\\x48\\xC7\\x85\\x00\\x01\\x00\\x00\\x09\\x00\\x00\\x00\\x0F\\x11\\x85\\x08\\x01\"\n    \"\\x00\\x00\\xC7\\x45\\xE8\\x4E\\x74\\x41\\x6C\\x0F\\x11\\x85\\x18\\x01\\x00\\x00\\xC7\\x45\"\n    \"\\xEC\\x65\\x72\\x74\\x54\\x0F\\x11\\x85\\x28\\x01\\x00\\x00\\xC7\\x45\\xF0\\x68\\x72\\x65\"\n    \"\\x61\\x0F\\x11\\x85\\x38\\x01\\x00\\x00\\x66\\xC7\\x45\\xF4\\x64\\x00\\x0F\\x11\\x85\\x48\"\n    \"\\x01\\x00\\x00\\x48\\x89\\x95\\xC8\\x00\\x00\\x00\\x4C\\x89\\x6D\\x78\\x48\\x8D\\x55\\x78\"\n    \"\\x48\\x89\\x95\\xD0\\x00\\x00\\x00\\x48\\x8D\\x95\\x80\\x00\\x00\\x00\\x48\\x89\\x95\\xD8\"\n    \"\\x00\\x00\\x00\\x45\\x8B\\xD5\\x4C\\x89\\xAD\\x80\\x00\\x00\\x00\\x84\\xC9\\x74\\x44\\xF6\"\n    \"\\x46\\x50\\x02\\x74\\x3E\\x48\\x8D\\x54\\x24\\x58\\x48\\xC7\\x85\\x10\\x01\\x00\\x00\\x09\"\n    \"\\x00\\x00\\x00\\x48\\x89\\x95\\x08\\x01\\x00\\x00\\x48\\x8D\\x95\\xC0\\x00\\x00\\x00\\x48\"\n    \"\\x89\\x95\\x18\\x01\\x00\\x00\\x48\\x8D\\x95\\xD0\\x00\\x00\\x00\\x48\\x89\\x95\\x20\\x01\"\n    \"\\x00\\x00\\x48\\xC7\\x85\\x28\\x01\\x00\\x00\\x02\\x00\\x00\\x00\\x48\\x8B\\x7E\\x18\\x32\"\n    \"\\xD2\\x48\\x83\\xC7\\x10\\x48\\x89\\x7D\\x58\\x4C\\x8B\\x1F\\x4C\\x3B\\xDF\\x0F\\x84\\x29\"\n    \"\\x02\\x00\\x00\\x48\\x8B\\xC7\\x66\\x66\\x0F\\x1F\\x84\\x00\\x00\\x00\\x00\\x00\\x49\\x8B\"\n    \"\\x73\\x60\\x4D\\x8D\\x33\\x4D\\x8B\\x1B\\x32\\xD2\\x4C\\x89\\x5C\\x24\\x30\\x49\\x8B\\xFD\"\n    \"\\x45\\x0F\\xB7\\x5E\\x58\\x66\\x41\\xD1\\xEB\\x4D\\x85\\xFF\\x0F\\x84\\xBA\\x01\\x00\\x00\"\n    \"\\x4C\\x8D\\x95\\xE0\\x00\\x00\\x00\\x0F\\x1F\\x00\\x4D\\x39\\x6A\\x20\\x74\\x4D\\x41\\x0F\"\n    \"\\xB7\\xC3\\x49\\x3B\\x42\\x08\\x75\\x43\\x45\\x0F\\xB7\\xCD\\x66\\x45\\x3B\\xEB\\x73\\x33\"\n    \"\\x49\\x8B\\x1A\\x0F\\x1F\\x00\\x45\\x0F\\xB7\\xC1\\x42\\x0F\\xB7\\x14\\x46\\x8D\\x42\\x9F\"\n    \"\\x66\\x83\\xF8\\x19\\x8D\\x4A\\xE0\\x41\\x0F\\xBE\\x04\\x18\\x66\\x0F\\x47\\xCA\\x0F\\xB7\"\n    \"\\xC9\\x3B\\xC8\\x75\\x0A\\x66\\x41\\xFF\\xC1\\x66\\x45\\x3B\\xCB\\x72\\xD3\\x66\\x45\\x3B\"\n    \"\\xCB\\x74\\x1F\\x48\\xFF\\xC7\\x4C\\x8D\\x95\\xE0\\x00\\x00\\x00\\x32\\xD2\\x48\\x8D\\x04\"\n    \"\\xBF\\x4D\\x39\\x2C\\xC2\\x4D\\x8D\\x14\\xC2\\x75\\x93\\xE9\\x3A\\x01\\x00\\x00\\x32\\xD2\"\n    \"\\x4D\\x85\\xD2\\x0F\\x84\\x2F\\x01\\x00\\x00\\x49\\x8B\\x76\\x30\\x49\\x8B\\x4A\\x20\\x48\"\n    \"\\x63\\x46\\x3C\\x8B\\x84\\x30\\x88\\x00\\x00\\x00\\x48\\x03\\xC6\\x48\\x89\\x85\\xB8\\x00\"\n    \"\\x00\\x00\\x44\\x8B\\x70\\x20\\x44\\x8B\\x78\\x24\\x4C\\x03\\xF6\\x44\\x8B\\x60\\x18\\x4C\"\n    \"\\x03\\xFE\\x0F\\x1F\\x40\\x00\\x45\\x85\\xE4\\x0F\\x84\\xB8\\x00\\x00\\x00\\x45\\x8B\\x1E\"\n    \"\\x4D\\x8B\\xCD\\x4C\\x03\\xDE\\x4C\\x8B\\xC1\\x48\\x85\\xC9\\x0F\\x84\\x8C\\x00\\x00\\x00\"\n    \"\\x49\\x8B\\x5A\\x10\\x41\\x0F\\xB6\\x3B\\x66\\x66\\x0F\\x1F\\x84\\x00\\x00\\x00\\x00\\x00\"\n    \"\\x4A\\x8B\\x14\\xCB\\x0F\\xB6\\x0A\\x40\\x3A\\xCF\\x75\\x16\\x49\\x8B\\xC3\\x49\\x2B\\xD3\"\n    \"\\x84\\xC9\\x74\\x1A\\x0F\\xB6\\x4C\\x02\\x01\\x48\\xFF\\xC0\\x3A\\x08\\x74\\xF0\\x4D\\x8B\"\n    \"\\x42\\x20\\x49\\xFF\\xC1\\x4D\\x3B\\xC8\\x72\\xD2\\xEB\\x4A\\x49\\x8B\\x4A\\x20\\x49\\x8B\"\n    \"\\x52\\x18\\x4C\\x8D\\x41\\xFF\\x4E\\x8B\\x1C\\xCA\\x4D\\x3B\\xC8\\x73\\x12\\x48\\x8B\\x44\"\n    \"\\xCB\\xF8\\x4A\\x89\\x04\\xCB\\x48\\x8B\\x44\\xCA\\xF8\\x4A\\x89\\x04\\xCA\\x4D\\x89\\x42\"\n    \"\\x20\\x4D\\x85\\xDB\\x74\\x1A\\x41\\x0F\\xB7\\x0F\\x48\\x8B\\x85\\xB8\\x00\\x00\\x00\\x8B\"\n    \"\\x40\\x1C\\x48\\x03\\xC6\\x8B\\x14\\x88\\x48\\x03\\xD6\\x49\\x89\\x13\\x49\\x83\\xC6\\x04\"\n    \"\\x49\\x83\\xC7\\x02\\x41\\xFF\\xCC\\x49\\x8B\\xC8\\x4D\\x85\\xC0\\x0F\\x85\\x3F\\xFF\\xFF\"\n    \"\\xFF\\x4C\\x8B\\xBD\\xE0\\x00\\x00\\x00\\xB2\\x01\\x49\\x8B\\xCD\\x4D\\x85\\xFF\\x74\\x3C\"\n    \"\\x49\\x8B\\xC5\\x4C\\x39\\xAC\\x05\\x00\\x01\\x00\\x00\\x77\\x1B\\x48\\xFF\\xC1\\x48\\x8D\"\n    \"\\x04\\x89\\x48\\x8D\\x04\\xC5\\x00\\x00\\x00\\x00\\x4C\\x39\\xAC\\x05\\xE0\\x00\\x00\\x00\"\n    \"\\x75\\xDD\\xEB\\x14\\x32\\xD2\\x48\\x8B\\x45\\x58\\x4C\\x8B\\x5C\\x24\\x30\\x4C\\x3B\\xD8\"\n    \"\\x0F\\x85\\x12\\xFE\\xFF\\xFF\\x4C\\x8B\\x44\\x24\\x50\\x4C\\x8B\\x8D\\x90\\x00\\x00\\x00\"\n    \"\\x48\\x8B\\x45\\x70\\x4C\\x8B\\x55\\x78\\x4C\\x8B\\xB5\\x40\\x02\\x00\\x00\\x48\\x8B\\xB5\"\n    \"\\xB0\\x00\\x00\\x00\\x0F\\xB6\\x4C\\x24\\x48\\x4C\\x8B\\xA5\\x48\\x02\\x00\\x00\\x41\\x8B\"\n    \"\\x1E\\x84\\xC9\\x0F\\x84\\x44\\x01\\x00\\x00\\xF6\\x46\\x50\\x02\\x0F\\x84\\x3A\\x01\\x00\"\n    \"\\x00\\x41\\x8D\\x74\\x24\\x01\\x4D\\x85\\xC0\\x74\\x40\\x83\\xFB\\x02\\x7C\\x3B\\x8D\\x46\"\n    \"\\x40\\xC7\\x44\\x24\\x30\\x5B\\x57\\x48\\x5D\\x48\\x8D\\x4C\\x24\\x30\\x88\\x44\\x24\\x3C\"\n    \"\\xC7\\x44\\x24\\x34\\x20\\x41\\x50\\x43\\xC7\\x44\\x24\\x38\\x20\\x52\\x45\\x20\\x66\\xC7\"\n    \"\\x44\\x24\\x3D\\x0A\\x00\\x41\\xFF\\xD0\\x4C\\x8B\\x44\\x24\\x50\\x48\\x8B\\x45\\x70\\x4C\"\n    \"\\x8B\\x55\\x78\\x40\\x32\\xFF\\x83\\xFE\\x0A\\x72\\x4C\\x48\\x85\\xC0\\x74\\x43\\x4C\\x39\"\n    \"\\x6D\\x50\\x74\\x3D\\x4D\\x8B\\x46\\x20\\x4D\\x8B\\xCE\\x49\\x83\\xC9\\x01\\x4C\\x89\\x6C\"\n    \"\\x24\\x28\\x33\\xD2\\x44\\x89\\x6C\\x24\\x20\\x33\\xC9\\xFF\\xD0\\x48\\x85\\xC0\\x74\\x19\"\n    \"\\x48\\x8B\\xC8\\xFF\\x55\\x50\\x48\\x8B\\x45\\x60\\x40\\xB7\\x01\\x40\\x84\\xFF\\x49\\x0F\"\n    \"\\x45\\xC5\\xE9\\x65\\x03\\x00\\x00\\xB1\\x34\\xEB\\x4E\\xB1\\x31\\xEB\\x4F\\x4D\\x85\\xD2\"\n    \"\\x74\\x50\\x4C\\x39\\xAD\\x80\\x00\\x00\\x00\\x74\\x47\\x49\\x8B\\x56\\x28\\x4D\\x8B\\xC6\"\n    \"\\x44\\x8B\\xCE\\x48\\xC7\\xC1\\xFE\\xFF\\xFF\\xFF\\x4C\\x89\\x6C\\x24\\x20\\x41\\xFF\\xD2\"\n    \"\\x85\\xC0\\x78\\x1D\\x48\\xC7\\xC1\\xFE\\xFF\\xFF\\xFF\\x40\\xB7\\x01\\xFF\\x95\\x80\\x00\"\n    \"\\x00\\x00\\x85\\xC0\\xB9\\x33\\x00\\x00\\x00\\x41\\x0F\\x49\\xCD\\xEB\\x02\\xB1\\x32\\x4C\"\n    \"\\x8B\\x44\\x24\\x50\\x84\\xC9\\x74\\x39\\xEB\\x02\\xB1\\x31\\x4D\\x85\\xC0\\x74\\x30\\x83\"\n    \"\\xFB\\x01\\x7C\\x2B\\x88\\x4C\\x24\\x3C\\x48\\x8D\\x4C\\x24\\x30\\xC7\\x44\\x24\\x30\\x5B\"\n    \"\\x57\\x48\\x5D\\xC7\\x44\\x24\\x34\\x20\\x41\\x50\\x43\\xC7\\x44\\x24\\x38\\x20\\x45\\x52\"\n    \"\\x52\\x66\\xC7\\x44\\x24\\x3D\\x0A\\x00\\x41\\xFF\\xD0\\x48\\x8B\\x45\\x60\\x40\\x84\\xFF\"\n    \"\\x49\\x0F\\x45\\xC5\\xE9\\xC1\\x02\\x00\\x00\\x84\\xD2\\x75\\x3F\\x4D\\x85\\xC0\\x74\\x24\"\n    \"\\x83\\xFB\\x01\\x7C\\x1F\\x48\\x8D\\x4C\\x24\\x30\\xC7\\x44\\x24\\x30\\x5B\\x57\\x48\\x5D\"\n    \"\\xC7\\x44\\x24\\x34\\x20\\x45\\x58\\x50\\x66\\xC7\\x44\\x24\\x38\\x0A\\x00\\x41\\xFF\\xD0\"\n    \"\\x44\\x38\\xAD\\x58\\x02\\x00\\x00\\x0F\\x84\\x80\\x02\\x00\\x00\\xF6\\x46\\x50\\x02\\xE9\"\n    \"\\x75\\x02\\x00\\x00\\x48\\x8D\\x55\\x68\\xC7\\x44\\x24\\x68\\x49\\x6E\\x6A\\x65\\xB9\\x01\"\n    \"\\x00\\x00\\x00\\xC7\\x44\\x24\\x6C\\x63\\x74\\x49\\x6E\\x66\\xC7\\x44\\x24\\x70\\x69\\x74\"\n    \"\\x45\\x8B\\xE5\\x44\\x88\\x6C\\x24\\x72\\x41\\x8B\\xF5\\x41\\x8B\\xFD\\x41\\xFF\\xD1\\x83\"\n    \"\\xFB\\x02\\x7C\\x1E\\x48\\x8D\\x4C\\x24\\x30\\xC7\\x44\\x24\\x30\\x5B\\x57\\x48\\x5D\\xC7\"\n    \"\\x44\\x24\\x34\\x20\\x4C\\x4C\\x0A\\x40\\x88\\x74\\x24\\x38\\xFF\\x54\\x24\\x50\\x48\\x8B\"\n    \"\\x85\\x98\\x00\\x00\\x00\\x49\\x8D\\x4E\\x30\\xFF\\xD0\\x4C\\x8B\\xF0\\x48\\x85\\xC0\\x0F\"\n    \"\\x84\\xD4\\x00\\x00\\x00\\x83\\xFB\\x02\\x7C\\x20\\x48\\x8D\\x4C\\x24\\x30\\xC7\\x44\\x24\"\n    \"\\x30\\x5B\\x57\\x48\\x5D\\xC7\\x44\\x24\\x34\\x20\\x47\\x50\\x41\\x66\\xC7\\x44\\x24\\x38\"\n    \"\\x0A\\x00\\xFF\\x54\\x24\\x50\\x48\\x8B\\x85\\xA0\\x00\\x00\\x00\\x48\\x8D\\x54\\x24\\x68\"\n    \"\\x49\\x8B\\xCE\\xFF\\xD0\\x4C\\x8B\\xF8\\x48\\x85\\xC0\\x74\\x7B\\x83\\xFB\\x02\\x7C\\x62\"\n    \"\\x48\\x8D\\x4C\\x24\\x30\\xC7\\x44\\x24\\x30\\x5B\\x57\\x48\\x5D\\xC7\\x44\\x24\\x34\\x20\"\n    \"\\x49\\x49\\x0A\\x40\\x88\\x74\\x24\\x38\\xFF\\x54\\x24\\x50\\x48\\x8B\\x8D\\x40\\x02\\x00\"\n    \"\\x00\\x41\\xBC\\x01\\x00\\x00\\x00\\x41\\xFF\\xD7\\x85\\xC0\\xC7\\x44\\x24\\x30\\x5B\\x57\"\n    \"\\x48\\x5D\\x8B\\xF0\\xC7\\x44\\x24\\x34\\x20\\x49\\x49\\x3A\\x0F\\x95\\xC0\\xC6\\x44\\x24\"\n    \"\\x38\\x20\\x04\\x30\\x66\\xC7\\x44\\x24\\x3A\\x0A\\x00\\x48\\x8D\\x4C\\x24\\x30\\x88\\x44\"\n    \"\\x24\\x39\\xFF\\x54\\x24\\x50\\xEB\\x1C\\x48\\x8B\\x8D\\x40\\x02\\x00\\x00\\x41\\xBC\\x01\"\n    \"\\x00\\x00\\x00\\x41\\xFF\\xD7\\x8B\\xF0\\xEB\\x08\\xFF\\x95\\x88\\x00\\x00\\x00\\x8B\\xF8\"\n    \"\\x49\\x8B\\xCE\\xFF\\x95\\xA8\\x00\\x00\\x00\\x85\\xF6\\x0F\\x85\\x17\\x01\\x00\\x00\\xEB\"\n    \"\\x08\\xFF\\x95\\x88\\x00\\x00\\x00\\x8B\\xF8\\x48\\x8B\\xB5\\x40\\x02\\x00\\x00\\x48\\x8B\"\n    \"\\x4E\\x18\\x48\\x85\\xC9\\x74\\x03\\xFF\\x55\\x50\\x48\\x8B\\x4E\\x10\\xFF\\x55\\x50\\x45\"\n    \"\\x85\\xE4\\x0F\\x85\\xEA\\x00\\x00\\x00\\x83\\xFB\\x01\\x0F\\x8C\\xE1\\x00\\x00\\x00\\x8B\"\n    \"\\xCF\\xC7\\x44\\x24\\x30\\x5B\\x57\\x48\\x5D\\x83\\xE1\\x0F\\xC7\\x44\\x24\\x34\\x20\\x45\"\n    \"\\x52\\x52\\x83\\xF9\\x0A\\x66\\xC7\\x44\\x24\\x38\\x3A\\x20\\xBA\\x30\\x00\\x00\\x00\\x66\"\n    \"\\xC7\\x44\\x24\\x42\\x0A\\x00\\x41\\xB8\\x37\\x00\\x00\\x00\\x8B\\xC2\\x41\\x0F\\x43\\xC0\"\n    \"\\xC1\\xEF\\x04\\x02\\xC1\\x8B\\xCF\\x83\\xE1\\x0F\\x88\\x44\\x24\\x41\\x83\\xF9\\x0A\\x8B\"\n    \"\\xC2\\x41\\x0F\\x43\\xC0\\xC1\\xEF\\x04\\x02\\xC1\\x8B\\xCF\\x83\\xE1\\x0F\\x88\\x44\\x24\"\n    \"\\x40\\x83\\xF9\\x0A\\x8B\\xC2\\x41\\x0F\\x43\\xC0\\xC1\\xEF\\x04\\x02\\xC1\\x8B\\xCF\\x83\"\n    \"\\xE1\\x0F\\x88\\x44\\x24\\x3F\\x83\\xF9\\x0A\\x8B\\xC2\\x41\\x0F\\x43\\xC0\\xC1\\xEF\\x04\"\n    \"\\x02\\xC1\\x8B\\xCF\\x83\\xE1\\x0F\\x88\\x44\\x24\\x3E\\x83\\xF9\\x0A\\x8B\\xC2\\x41\\x0F\"\n    \"\\x43\\xC0\\xC1\\xEF\\x04\\x02\\xC1\\x8B\\xCF\\x83\\xE1\\x0F\\x88\\x44\\x24\\x3D\\x83\\xF9\"\n    \"\\x0A\\x8B\\xC2\\x41\\x0F\\x43\\xC0\\xC1\\xEF\\x04\\x02\\xC1\\x8B\\xCF\\x83\\xE1\\x0F\\x88\"\n    \"\\x44\\x24\\x3C\\x83\\xF9\\x0A\\x8B\\xC2\\x41\\x0F\\x43\\xC0\\xC1\\xEF\\x04\\x02\\xC1\\x48\"\n    \"\\x8D\\x4C\\x24\\x30\\x83\\xFF\\x0A\\x88\\x44\\x24\\x3B\\x41\\x0F\\x43\\xD0\\x40\\x02\\xD7\"\n    \"\\x88\\x54\\x24\\x3A\\xFF\\x54\\x24\\x50\\x8B\\x4D\\x68\\x33\\xD2\\xFF\\x95\\x90\\x00\\x00\"\n    \"\\x00\\x44\\x38\\xAD\\x58\\x02\\x00\\x00\\x74\\x0D\\x48\\x8B\\x85\\xB0\\x00\\x00\\x00\\xF6\"\n    \"\\x40\\x50\\x02\\x75\\x04\\x4C\\x8B\\x6D\\x60\\x49\\x8B\\xC5\\x4C\\x8B\\xAC\\x24\\x08\\x03\"\n    \"\\x00\\x00\\x48\\x8B\\xBC\\x24\\x10\\x03\\x00\\x00\\x48\\x8B\\x9C\\x24\\x50\\x03\\x00\\x00\"\n    \"\\x4C\\x8B\\xBC\\x24\\x00\\x03\\x00\\x00\\x48\\x81\\xC4\\x18\\x03\\x00\\x00\\x41\\x5E\\x41\"\n    \"\\x5C\\x5E\\x5D\\xC3\";\n\nconstexpr size_t x64ShellcodeSize = sizeof(x64Shellcode) - 1;\n\n#define PRE_ARM64SHELLCODE_VIRTUAL_FREE                       \\\n    \"\\xfd\\x7b\\xbf\\xa9\" /* stp     fp, lr, [sp, #-0x10]!    */ \\\n    \"\\xfd\\x03\\x00\\x91\" /* mov     fp, sp                   */ \\\n    \"\\x0a\\x00\\x00\\x94\" /* bl      $+#0x28                  */ \\\n    \"\\xe3\\x03\\x00\\xaa\" /* mov     x3, x0                   */ \\\n    \"\\xc3\\x00\\x00\\xb4\" /* cbz     x3, $+#0x18              */ \\\n    \"\\x00\\x00\\x00\\x90\" /* adrp    x0, $<page>              */ \\\n    \"\\xfd\\x7b\\xc1\\xa8\" /* ldp     fp, lr, [sp], #0x10      */ \\\n    \"\\x02\\x00\\x90\\x52\" /* mov     w2, #0x8000              */ \\\n    \"\\x01\\x00\\x80\\xd2\" /* mov     x1, #0                   */ \\\n    \"\\x60\\x00\\x1f\\xd6\" /* br      x3                       */ \\\n    \"\\xfd\\x7b\\xc1\\xa8\" /* ldp     fp, lr, [sp], #0x10      */ \\\n    \"\\xc0\\x03\\x5f\\xd6\" /* ret                              */\n\n// The ARM64 InjectShellcode function from the project in the inject_shellcode\n// subfolder.\nconst BYTE arm64Shellcode[] = PRE_ARM64SHELLCODE_VIRTUAL_FREE\n    \"\\xF3\\x53\\xBB\\xA9\\xF5\\x5B\\x01\\xA9\\xF7\\x63\\x02\\xA9\\xF9\\x6B\\x03\\xA9\\xFB\\x23\"\n    \"\\x00\\xF9\\xFF\\x83\\x0B\\xD1\\xFD\\x7B\\x00\\xA9\\xFD\\x03\\x00\\x91\\xF7\\x03\\x00\\xAA\"\n    \"\\x19\\x00\\x80\\x52\\x0D\\x00\\x80\\x52\\x80\\x00\\x00\\x36\\x17\\xF8\\x7F\\x92\\x39\\x00\"\n    \"\\x80\\x52\\x04\\x00\\x00\\x14\\x08\\x04\\x40\\xB9\\x1F\\x01\\x00\\x71\\xED\\x07\\x9F\\x1A\"\n    \"\\xE8\\x03\\x12\\xAA\\x18\\x31\\x40\\xF9\\x08\\x0F\\x40\\xF9\\x08\\x30\\x00\\xB4\\x88\\x45\"\n    \"\\x00\\x58\\xFF\\x53\\x03\\x39\\xE8\\x97\\x00\\xF9\\xC8\\x85\\x88\\x52\\x88\\x89\\xA9\\x72\"\n    \"\\xE8\\x33\\x01\\xB9\\x08\\x45\\x00\\x58\\xE8\\x67\\x00\\xF9\\x28\\x4C\\x8E\\x52\\x28\\xEF\"\n    \"\\xAA\\x72\\xE8\\xD3\\x00\\xB9\\xA8\\x44\\x00\\x58\\xE8\\x5F\\x00\\xF9\\x88\\x8C\\x8C\\x52\"\n    \"\\x48\\xAE\\xAC\\x72\\xE8\\xC3\\x00\\xB9\\x68\\x6E\\x8E\\x52\\xE8\\x8B\\x01\\x79\\x08\\x44\"\n    \"\\x00\\x58\\xE8\\x9F\\x00\\xF9\\x28\\x4C\\x8E\\x52\\x28\\x0F\\xA0\\x72\\xE8\\x43\\x01\\xB9\"\n    \"\\xA8\\x43\\x00\\x58\\xE8\\x87\\x00\\xF9\\x48\\xAE\\x8C\\x52\\xA8\\x0C\\xA0\\x72\\xE8\\x13\"\n    \"\\x01\\xB9\\x48\\x43\\x00\\x58\\xE8\\x6F\\x00\\xF9\\x48\\x4E\\x8E\\x52\\xE8\\x4D\\xAE\\x72\"\n    \"\\xE8\\xE3\\x00\\xB9\\xE8\\x2C\\x88\\x52\\xE8\\xC3\\x02\\x79\\xA8\\x42\\x00\\x58\\xE8\\x8F\"\n    \"\\x00\\xF9\\x88\\x8C\\x8D\\x52\\xA8\\x0C\\xA0\\x72\\xE8\\x23\\x01\\xB9\\x88\\xAC\\x8C\\x52\"\n    \"\\xE8\\x03\\x03\\x79\\x08\\x42\\x00\\x58\\xE8\\x77\\x00\\xF9\\x48\\xAE\\x8C\\x52\\x28\\x8C\"\n    \"\\xAC\\x72\\xE8\\xF3\\x00\\xB9\\xE9\\x23\\x03\\x91\\xE8\\xE3\\x02\\x91\\xFF\\x1B\\x03\\x39\"\n    \"\\xF1\\x23\\x09\\x91\\x29\\x22\\x00\\xA9\\xE9\\xE3\\x04\\x91\\xE8\\x23\\x04\\x91\\xFF\\x93\"\n    \"\\x03\\x39\\xF1\\x63\\x09\\x91\\x29\\x22\\x00\\xA9\\xE9\\x63\\x03\\x91\\xE8\\x43\\x05\\x91\"\n    \"\\xFF\\x8B\\x05\\x39\\xF1\\xA3\\x09\\x91\\x29\\x22\\x00\\xA9\\xE9\\x63\\x04\\x91\\xE8\\xC3\"\n    \"\\x05\\x91\\xFF\\x0B\\x06\\x39\\xF1\\xE3\\x09\\x91\\x29\\x22\\x00\\xA9\\xEA\\x03\\x02\\x91\"\n    \"\\xE9\\x23\\x02\\x91\\xFF\\xD3\\x03\\x39\\x50\\x3B\\x00\\x9C\\xF1\\x43\\x0A\\x91\\x2A\\x26\"\n    \"\\x00\\xA9\\xEA\\x43\\x02\\x91\\xF0\\x57\\x80\\x3D\\xE9\\xC3\\x00\\x91\\xFF\\x7F\\x08\\xA9\"\n    \"\\xE8\\xA3\\x03\\x91\\xF1\\x83\\x0A\\x91\\x2A\\x26\\x00\\xA9\\x90\\x3A\\x00\\x9C\\xE8\\x47\"\n    \"\\x01\\xF9\\xEA\\xC3\\x01\\x91\\xF0\\x5F\\x80\\x3D\\xE9\\xA3\\x00\\x91\\xFF\\x4B\\x00\\xF9\"\n    \"\\x00\\x00\\x80\\xD2\\xFF\\xFF\\x02\\xA9\\x06\\x00\\x80\\xD2\\xFF\\x1F\\x00\\xF9\\x07\\x00\"\n    \"\\x80\\xD2\\xFF\\x7F\\x07\\xA9\\x0F\\x00\\x80\\xD2\\x08\\x00\\x80\\xD2\\xF1\\xC3\\x0A\\x91\"\n    \"\\x2A\\x26\\x00\\xA9\\xEA\\xE3\\x00\\x91\\x10\\xE4\\x00\\x4F\\xE9\\xE3\\x01\\x91\\xFF\\x03\"\n    \"\\x07\\x39\\xF1\\x03\\x0B\\x91\\x2A\\x26\\x00\\xA9\\xE9\\x83\\x01\\x91\\xE9\\x6B\\x01\\xF9\"\n    \"\\xEA\\xA3\\x04\\x91\\x89\\x01\\x80\\xD2\\xFF\\x7F\\x06\\xA9\\xEA\\x27\\x1D\\xA9\\xEA\\x23\"\n    \"\\x09\\x91\\xE9\\x43\\x0A\\x91\\xFF\\x2B\\x00\\xF9\\xEA\\x27\\x1E\\xA9\\x2C\\x01\\x80\\xD2\"\n    \"\\xE9\\xE3\\x07\\x91\\xEC\\xFB\\x00\\xF9\\x30\\x41\\x00\\xAD\\xEA\\xC3\\x06\\x91\\x30\\x41\"\n    \"\\x01\\xAD\\x0E\\x00\\x80\\xD2\\x30\\x11\\x80\\x3D\\x89\\x38\\x00\\x58\\xE9\\x57\\x00\\xF9\"\n    \"\\x89\\x09\\x80\\x52\\xE9\\xC3\\x02\\x39\\x49\\x38\\x00\\x58\\xE9\\x7F\\x00\\xF9\\x09\\x4D\"\n    \"\\x8E\\x52\\xA9\\x2C\\xAC\\x72\\xE9\\x03\\x01\\xB9\\x89\\x0C\\x80\\x52\\xE9\\x0B\\x02\\x79\"\n    \"\\xE9\\xE3\\x03\\x91\\xEA\\x27\\x19\\xA9\\x70\\x34\\x00\\x9C\\xEA\\xA3\\x01\\x91\\xF0\\x6F\"\n    \"\\x80\\x3D\\xE9\\x43\\x01\\x91\\xEA\\x27\\x1A\\xA9\\x0B\\x00\\x80\\xD2\\x6D\\x01\\x00\\x34\"\n    \"\\x09\\x53\\x40\\xB9\\x29\\x01\\x08\\x36\\xE9\\xA3\\x02\\x91\\xE9\\xB3\\x1F\\xA9\\xE9\\x83\"\n    \"\\x06\\x91\\xEA\\x43\\x06\\x91\\xF1\\x23\\x08\\x91\\x2A\\x26\\x00\\xA9\\x49\\x00\\x80\\xD2\"\n    \"\\xE9\\x0F\\x01\\xF9\\x09\\x0F\\x40\\xF9\\x0A\\x00\\x80\\x52\\x2C\\x41\\x00\\x91\\x89\\x01\"\n    \"\\x40\\xF9\\x3F\\x01\\x0C\\xEB\\x20\\x10\\x00\\x54\\xEB\\xEB\\x40\\xF9\\x08\\x05\\x80\\xD2\"\n    \"\\xE5\\x03\\x09\\xAA\\x29\\x01\\x40\\xF9\\xA3\\xB0\\x40\\x79\\x13\\x00\\x80\\xD2\\xAA\\x30\"\n    \"\\x40\\xF9\\x6E\\x40\\x01\\x53\\x03\\x00\\x80\\xD2\\xAB\\x04\\x00\\xB4\\xE2\\x43\\x07\\x91\"\n    \"\\xEE\\x03\\x0E\\xAA\\xF5\\xF3\\x9F\\x52\\x14\\xFC\\x9F\\x52\\xE7\\x43\\x07\\x91\\x4F\\x10\"\n    \"\\x40\\xF9\\x0F\\x03\\x00\\xB4\\x4F\\x04\\x40\\xF9\\xDF\\x01\\x0F\\xEB\\xA1\\x02\\x00\\x54\"\n    \"\\x0F\\x00\\x80\\x52\\x2E\\x02\\x00\\x34\\x56\\x00\\x40\\xF9\\xEF\\x03\\x0F\\xAA\\x46\\x79\"\n    \"\\x6F\\x78\\xC4\\x00\\x15\\x0B\\x84\\x3C\\x00\\x53\\xC0\\x00\\x14\\x0B\\x9F\\x64\\x00\\x71\"\n    \"\\x00\\x3C\\x00\\x53\\xC4\\x80\\x80\\x1A\\xE6\\x69\\xF6\\x38\\x9F\\x00\\x06\\x6B\\xA1\\x00\"\n    \"\\x00\\x54\\xEF\\x05\\x00\\x11\\xEF\\x3D\\x00\\x53\\xFF\\x01\\x0E\\x6B\\x43\\xFE\\xFF\\x54\"\n    \"\\xFF\\x01\\x0E\\x6B\\xC0\\x00\\x00\\x54\\x73\\x06\\x00\\x91\\x62\\x1E\\x08\\x9B\\x4F\\x00\"\n    \"\\x40\\xF9\\x8F\\xFC\\xFF\\xB5\\x02\\x00\\x00\\x14\\xE3\\x03\\x02\\xAA\\x0A\\x00\\x80\\x52\"\n    \"\\x43\\x09\\x00\\xB4\\xA2\\x18\\x40\\xF9\\x53\\x3C\\x40\\xB9\\x53\\xC0\\x33\\x8B\\x73\\x8A\"\n    \"\\x40\\xB9\\x55\\x40\\x33\\x8B\\xAE\\x4E\\x44\\x29\\x54\\x40\\x2E\\x8B\\x6E\\x10\\x40\\xF9\"\n    \"\\x4A\\x40\\x33\\x8B\\xB3\\x1A\\x40\\xB9\\x2E\\x06\\x00\\xB4\\xF3\\x05\\x00\\x34\\x8F\\x46\"\n    \"\\x40\\xB8\\x44\\x40\\x2F\\x8B\\x0F\\x00\\x80\\xD2\\x0E\\x05\\x00\\xB4\\x76\\x08\\x40\\xF9\"\n    \"\\x80\\x00\\xC0\\x39\\xE6\\x03\\x16\\xAA\\xC5\\x84\\x40\\xF8\\xAB\\x00\\xC0\\x39\\x7F\\x01\"\n    \"\\x00\\x6B\\x21\\x01\\x00\\x54\\xEE\\x03\\x04\\xAA\\xA5\\x00\\x04\\xCB\\x6B\\x01\\x00\\x34\"\n    \"\\xCE\\x05\\x00\\x91\\xCB\\x69\\xE5\\x38\\xC7\\x01\\xC0\\x39\\x7F\\x01\\x07\\x6B\\x60\\xFF\"\n    \"\\xFF\\x54\\x6E\\x10\\x40\\xF9\\xEF\\x05\\x00\\x91\\xFF\\x01\\x0E\\xEB\\x23\\xFE\\xFF\\x54\"\n    \"\\x14\\x00\\x00\\x14\\x60\\xAC\\x41\\xA9\\x6E\\x05\\x00\\xD1\\x06\\x78\\x6F\\xF8\\xFF\\x01\"\n    \"\\x0E\\xEB\\xE2\\x00\\x00\\x54\\xC4\\x0E\\x0B\\x8B\\x84\\x80\\x5F\\xF8\\xC4\\x7A\\x2F\\xF8\"\n    \"\\x04\\x0C\\x0B\\x8B\\x84\\x80\\x5F\\xF8\\x04\\x78\\x2F\\xF8\\x6E\\x10\\x00\\xF9\\xE6\\x00\"\n    \"\\x00\\xB4\\x4F\\x01\\x40\\x79\\xA4\\x1E\\x40\\xB9\\x8F\\x08\\x0F\\x8B\\xEF\\x69\\x62\\xB8\"\n    \"\\x4F\\x40\\x2F\\x8B\\xCF\\x00\\x00\\xF9\\x4A\\x09\\x00\\x91\\x73\\x06\\x00\\x51\\x4E\\xFA\"\n    \"\\xFF\\xB5\\xEB\\xEB\\x40\\xF9\\x2A\\x00\\x80\\x52\\x02\\x00\\x80\\xD2\\xCB\\x01\\x00\\xB4\"\n    \"\\x03\\x00\\x80\\xD2\\xF3\\xC3\\x07\\x91\\xEE\\x43\\x07\\x91\\x63\\x68\\x73\\xF8\\xC3\\x00\"\n    \"\\x00\\xB5\\x42\\x04\\x00\\x91\\x43\\x7C\\x08\\x9B\\x6F\\x68\\x6E\\xF8\\x6F\\xFF\\xFF\\xB5\"\n    \"\\x04\\x00\\x00\\x14\\x0A\\x00\\x80\\x52\\x3F\\x01\\x0C\\xEB\\x01\\xF1\\xFF\\x54\\xE6\\x83\"\n    \"\\x42\\xA9\\xE7\\x1F\\x40\\xF9\\xEF\\x3F\\x40\\xF9\\xE8\\x3B\\x46\\xA9\\xEB\\x2B\\x40\\xF9\"\n    \"\\xF4\\x02\\x40\\xB9\\x8D\\x0A\\x00\\x34\\x09\\x53\\x40\\xB9\\x49\\x0A\\x08\\x36\\xDF\\x00\"\n    \"\\x00\\xF1\\x8A\\x1A\\x42\\x7A\\x36\\x04\\x00\\x11\\xB9\\x23\\x00\\x58\\x53\\x01\\x80\\x52\"\n    \"\\xCB\\x01\\x00\\x54\\x08\\x44\\x8A\\x52\\xA8\\x08\\xA4\\x72\\xF9\\x0B\\x00\\xF9\\xE8\\x1B\"\n    \"\\x00\\xB9\\xC8\\x02\\x01\\x11\\xE0\\x43\\x00\\x91\\xE8\\x73\\x00\\x39\\xF3\\xD3\\x01\\x78\"\n    \"\\xC0\\x00\\x3F\\xD6\\xE6\\x83\\x42\\xA9\\xE7\\x1F\\x40\\xF9\\xE8\\x3B\\x46\\xA9\\xEB\\x2B\"\n    \"\\x40\\xF9\\x18\\x00\\x80\\x52\\xDF\\x2A\\x00\\x71\\xC3\\x02\\x00\\x54\\x68\\x02\\x00\\xB4\"\n    \"\\x47\\x02\\x00\\xB4\\xE2\\x12\\x40\\xF9\\xE3\\x02\\x40\\xB2\\x05\\x00\\x80\\xD2\\x04\\x00\"\n    \"\\x80\\x52\\x01\\x00\\x80\\xD2\\x00\\x00\\x80\\xD2\\x00\\x01\\x3F\\xD6\\x00\\x01\\x00\\xB4\"\n    \"\\xE8\\x1F\\x40\\xF9\\x00\\x01\\x3F\\xD6\\xE0\\x1B\\x40\\xF9\\x38\\x00\\x80\\x52\\x1F\\x03\"\n    \"\\x00\\x71\\xE0\\x13\\x80\\x9A\\xD1\\x00\\x00\\x14\\x89\\x06\\x80\\x52\\x15\\x00\\x00\\x14\"\n    \"\\x29\\x06\\x80\\x52\\x14\\x00\\x00\\x14\\xCE\\x02\\x00\\xB4\\xAB\\x02\\x00\\xB4\\xE1\\x16\"\n    \"\\x40\\xF9\\x04\\x00\\x80\\xD2\\xE3\\x03\\x16\\xAA\\xE2\\x03\\x17\\xAA\\x20\\x00\\x80\\x92\"\n    \"\\xC0\\x01\\x3F\\xD6\\x20\\x01\\xF8\\x37\\xE8\\x2B\\x40\\xF9\\x20\\x00\\x80\\x92\\x38\\x00\"\n    \"\\x80\\x52\\x00\\x01\\x3F\\xD6\\x68\\x06\\x80\\x52\\x1F\\x00\\x00\\x71\\xE9\\xA3\\x88\\x1A\"\n    \"\\x02\\x00\\x00\\x14\\x49\\x06\\x80\\x52\\xE6\\x83\\x42\\xA9\\x28\\x1D\\x00\\x53\\xE8\\x01\"\n    \"\\x00\\x34\\x02\\x00\\x00\\x14\\x29\\x06\\x80\\x52\\xDF\\x00\\x00\\xF1\\x8A\\x1A\\x41\\x7A\"\n    \"\\x4B\\x01\\x00\\x54\\x08\\xA4\\x88\\x52\\x48\\x4A\\xAA\\x72\\xF9\\x0B\\x00\\xF9\\xE0\\x43\"\n    \"\\x00\\x91\\xE8\\x1B\\x00\\xB9\\xE9\\x73\\x00\\x39\\xF3\\xD3\\x01\\x78\\xC0\\x00\\x3F\\xD6\"\n    \"\\xE0\\x1B\\x40\\xF9\\x1F\\x03\\x00\\x71\\xE0\\x13\\x80\\x9A\\xA7\\x00\\x00\\x14\\x0A\\x02\"\n    \"\\x00\\x35\\xDF\\x00\\x00\\xF1\\x8A\\x1A\\x41\\x7A\\x0B\\x01\\x00\\x54\\xA8\\x19\\x00\\x58\"\n    \"\\xE8\\x0B\\x00\\xF9\\x48\\x01\\x80\\x52\\xE0\\x43\\x00\\x91\\xE8\\x33\\x00\\x79\\xC0\\x00\"\n    \"\\x3F\\xD6\\xE0\\x1B\\x40\\xF9\\x79\\x13\\x00\\x34\\x08\\x53\\x40\\xB9\\x28\\x13\\x08\\x36\"\n    \"\\x00\\x00\\x80\\xD2\\x97\\x00\\x00\\x14\\x68\\x18\\x00\\x58\\xFF\\x8B\\x02\\x39\\xE8\\x4F\"\n    \"\\x00\\xF9\\x28\\x8D\\x8E\\x52\\xE1\\x63\\x01\\x91\\xE8\\x43\\x01\\x79\\x20\\x00\\x80\\x52\"\n    \"\\x1B\\x00\\x80\\x52\\x1A\\x00\\x80\\x52\\x15\\x00\\x80\\x52\\xE0\\x01\\x3F\\xD6\\x9F\\x0A\"\n    \"\\x00\\x71\\xEB\\x00\\x00\\x54\\x08\\x17\\x00\\x58\\xFF\\x23\\x01\\x39\\xE8\\x23\\x00\\xF9\"\n    \"\\xE8\\x17\\x40\\xF9\\xE0\\x03\\x01\\x91\\x00\\x01\\x3F\\xD6\\xE8\\x43\\x40\\xF9\\xE0\\xC2\"\n    \"\\x00\\x91\\x00\\x01\\x3F\\xD6\\x53\\x01\\x80\\x52\\xF6\\x03\\x00\\xAA\\xF6\\x06\\x00\\xB4\"\n    \"\\x9F\\x0A\\x00\\x71\\xEB\\x00\\x00\\x54\\x88\\x15\\x00\\x58\\xF3\\x33\\x00\\x79\\xE8\\x0B\"\n    \"\\x00\\xF9\\xE8\\x17\\x40\\xF9\\xE0\\x43\\x00\\x91\\x00\\x01\\x3F\\xD6\\xE8\\x47\\x40\\xF9\"\n    \"\\xE1\\x63\\x02\\x91\\xE0\\x03\\x16\\xAA\\x00\\x01\\x3F\\xD6\\xE0\\x23\\x00\\xF9\\x20\\x04\"\n    \"\\x00\\xB4\\x9F\\x0A\\x00\\x71\\x2B\\x03\\x00\\x54\\x08\\x14\\x00\\x58\\xFF\\x63\\x00\\x39\"\n    \"\\xE8\\x0B\\x00\\xF9\\xE8\\x17\\x40\\xF9\\xE0\\x43\\x00\\x91\\x00\\x01\\x3F\\xD6\\xE8\\x23\"\n    \"\\x40\\xF9\\xE0\\x03\\x17\\xAA\\x3B\\x00\\x80\\x52\\x00\\x01\\x3F\\xD6\\x08\\x13\\x00\\x58\"\n    \"\\xF3\\x37\\x00\\x79\\xE8\\x0B\\x00\\xF9\\x08\\x04\\x80\\x52\\xFA\\x03\\x00\\x2A\\xE8\\x63\"\n    \"\\x00\\x39\\x5F\\x03\\x00\\x71\\x09\\x06\\x80\\x52\\x28\\x05\\x89\\x1A\\xE8\\x67\\x00\\x39\"\n    \"\\xE8\\x17\\x40\\xF9\\xE0\\x43\\x00\\x91\\x00\\x01\\x3F\\xD6\\x0A\\x00\\x00\\x14\\xE8\\x23\"\n    \"\\x40\\xF9\\xE0\\x03\\x17\\xAA\\x3B\\x00\\x80\\x52\\x00\\x01\\x3F\\xD6\\xFA\\x03\\x00\\x2A\"\n    \"\\x04\\x00\\x00\\x14\\xE8\\x3B\\x40\\xF9\\x00\\x01\\x3F\\xD6\\xF5\\x03\\x00\\x2A\\xE8\\x4B\"\n    \"\\x40\\xF9\\xE0\\x03\\x16\\xAA\\x00\\x01\\x3F\\xD6\\x3A\\x08\\x00\\x35\\x04\\x00\\x00\\x14\"\n    \"\\xE8\\x3B\\x40\\xF9\\x00\\x01\\x3F\\xD6\\xF5\\x03\\x00\\x2A\\xE0\\x0E\\x40\\xF9\\x60\\x00\"\n    \"\\x00\\xB4\\xE8\\x1F\\x40\\xF9\\x00\\x01\\x3F\\xD6\\xE0\\x0A\\x40\\xF9\\xE8\\x1F\\x40\\xF9\"\n    \"\\x00\\x01\\x3F\\xD6\\xBB\\x06\\x00\\x35\\x9F\\x06\\x00\\x71\\x6B\\x06\\x00\\x54\\x28\\x0E\"\n    \"\\x00\\x58\\xF3\\x47\\x00\\x79\\xE8\\x0B\\x00\\xF9\\x48\\x07\\x84\\x52\\xAB\\x0E\\x00\\x12\"\n    \"\\xE8\\x33\\x00\\x79\\xE8\\x06\\x80\\x52\\x7F\\x29\\x00\\x71\\x09\\x06\\x80\\x52\\x0A\\x21\"\n    \"\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x1E\\x04\\x53\\x7F\\x29\\x00\\x71\\xEA\\x87\\x00\\x39\"\n    \"\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x2E\\x08\\x53\\x7F\\x29\\x00\\x71\\xEA\\x83\"\n    \"\\x00\\x39\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x3E\\x0C\\x53\\x7F\\x29\\x00\\x71\"\n    \"\\xEA\\x7F\\x00\\x39\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x4E\\x10\\x53\\x7F\\x29\"\n    \"\\x00\\x71\\xEA\\x7B\\x00\\x39\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x5E\\x14\\x53\"\n    \"\\x7F\\x29\\x00\\x71\\xEA\\x77\\x00\\x39\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\\xAB\\x6E\"\n    \"\\x18\\x53\\x7F\\x29\\x00\\x71\\xEA\\x73\\x00\\x39\\x0A\\x21\\x89\\x1A\\x4A\\x81\\x2B\\x0B\"\n    \"\\xE0\\x43\\x00\\x91\\xEA\\x6F\\x00\\x39\\xAA\\x7E\\x1C\\x53\\x5F\\x29\\x00\\x71\\x08\\x21\"\n    \"\\x89\\x1A\\x08\\x81\\x2A\\x0B\\xE8\\x6B\\x00\\x39\\xE8\\x17\\x40\\xF9\\x00\\x01\\x3F\\xD6\"\n    \"\\xE0\\x5B\\x40\\xB9\\x01\\x00\\x80\\xD2\\xE8\\x3F\\x40\\xF9\\x00\\x01\\x3F\\xD6\\x79\\x00\"\n    \"\\x00\\x34\\x08\\x53\\x40\\xB9\\x48\\xED\\x0F\\x37\\xE0\\x1B\\x40\\xF9\\xFD\\x7B\\x40\\xA9\"\n    \"\\xFF\\x83\\x0B\\x91\\xFB\\x23\\x40\\xF9\\xF9\\x6B\\x43\\xA9\\xF7\\x63\\x42\\xA9\\xF5\\x5B\"\n    \"\\x41\\xA9\\xF3\\x53\\xC5\\xA8\\xC0\\x03\\x5F\\xD6\\x1F\\x20\\x03\\xD5\\x4F\\x75\\x74\\x70\"\n    \"\\x75\\x74\\x44\\x65\\x62\\x75\\x67\\x53\\x74\\x72\\x69\\x6E\\x53\\x65\\x74\\x54\\x68\\x72\"\n    \"\\x65\\x61\\x64\\x45\\x72\\x72\\x6F\\x72\\x4D\\x6F\\x4E\\x74\\x51\\x75\\x65\\x75\\x65\\x41\"\n    \"\\x70\\x63\\x54\\x68\\x72\\x65\\x61\\x64\\x4B\\x45\\x52\\x4E\\x45\\x4C\\x33\\x32\\x4C\\x6F\"\n    \"\\x61\\x64\\x4C\\x69\\x62\\x72\\x47\\x65\\x74\\x50\\x72\\x6F\\x63\\x41\\x46\\x72\\x65\\x65\"\n    \"\\x4C\\x69\\x62\\x72\\x56\\x69\\x72\\x74\\x75\\x61\\x6C\\x46\\x47\\x65\\x74\\x4C\\x61\\x73\"\n    \"\\x74\\x45\\x43\\x6C\\x6F\\x73\\x65\\x48\\x61\\x6E\\x43\\x72\\x65\\x61\\x74\\x65\\x54\\x68\"\n    \"\\x4E\\x54\\x44\\x4C\\x4C\\x2E\\x44\\x4C\\x4E\\x74\\x41\\x6C\\x65\\x72\\x74\\x54\\x5B\\x57\"\n    \"\\x48\\x5D\\x20\\x41\\x50\\x43\\x5B\\x57\\x48\\x5D\\x20\\x45\\x58\\x50\\x49\\x6E\\x6A\\x65\"\n    \"\\x63\\x74\\x49\\x6E\\x5B\\x57\\x48\\x5D\\x20\\x4C\\x4C\\x0A\\x5B\\x57\\x48\\x5D\\x20\\x47\"\n    \"\\x50\\x41\\x5B\\x57\\x48\\x5D\\x20\\x49\\x49\\x0A\\x5B\\x57\\x48\\x5D\\x20\\x49\\x49\\x3A\"\n    \"\\x5B\\x57\\x48\\x5D\\x20\\x45\\x52\\x52\";\n\nconstexpr size_t arm64ShellcodeSize = sizeof(arm64Shellcode) - 1;\n\nusing PPS_APC_ROUTINE = VOID(NTAPI*)(_In_opt_ PVOID ApcArgument1,\n                                     _In_opt_ PVOID ApcArgument2,\n                                     _In_opt_ PVOID ApcArgument3);\n\n#ifdef _M_IX86\nvoid NtQueueApcThread64(_In_ HANDLE ThreadHandle,\n                        _In_ PPS_APC_ROUTINE ApcRoutine,\n                        _In_opt_ PVOID ApcArgument1,\n                        _In_opt_ PVOID ApcArgument2,\n                        _In_opt_ PVOID ApcArgument3) {\n    STATIC_INIT_ONCE_TRIVIAL(DWORD64, pNtQueueApcThread, []() {\n        auto ntdll = wow64pp::module_handle(\"ntdll.dll\");\n        return wow64pp::import(ntdll, \"NtQueueApcThread\");\n    }());\n\n    auto result64 = wow64pp::call_function(\n        pNtQueueApcThread, wow64pp::handle_to_uint64(ThreadHandle),\n        wow64pp::ptr_to_uint64(ApcRoutine),\n        wow64pp::ptr_to_uint64(ApcArgument1),\n        wow64pp::ptr_to_uint64(ApcArgument2),\n        wow64pp::ptr_to_uint64(ApcArgument3));\n    NTSTATUS result = static_cast<NTSTATUS>(result64);\n    THROW_IF_NTSTATUS_FAILED(result);\n}\n\nusing PUSER_THREAD_START_ROUTINE = NTSTATUS(NTAPI*)(_In_ PVOID ThreadParameter);\n\nvoid NtCreateThreadEx64(_Out_ PHANDLE ThreadHandle,\n                        _In_ ACCESS_MASK DesiredAccess,\n                        _In_opt_ void* ObjectAttributes,  // PCOBJECT_ATTRIBUTES\n                        _In_ HANDLE ProcessHandle,\n                        _In_ PUSER_THREAD_START_ROUTINE StartRoutine,\n                        _In_opt_ PVOID Argument,\n                        _In_ ULONG CreateFlags,  // THREAD_CREATE_FLAGS_*\n                        _In_ DWORD64 ZeroBits,\n                        _In_ DWORD64 StackSize,\n                        _In_ DWORD64 MaximumStackSize,\n                        _In_opt_ void* AttributeList) {  // PPS_ATTRIBUTE_LIST\n    STATIC_INIT_ONCE_TRIVIAL(DWORD64, pNtCreateThreadEx, []() {\n        auto ntdll = wow64pp::module_handle(\"ntdll.dll\");\n        return wow64pp::import(ntdll, \"NtCreateThreadEx\");\n    }());\n\n    DWORD64 threadHandle64 = 0;\n\n    auto result64 = wow64pp::call_function(\n        pNtCreateThreadEx, wow64pp::ptr_to_uint64(&threadHandle64),\n        DesiredAccess, wow64pp::ptr_to_uint64(ObjectAttributes),\n        wow64pp::handle_to_uint64(ProcessHandle),\n        wow64pp::ptr_to_uint64(StartRoutine), wow64pp::ptr_to_uint64(Argument),\n        CreateFlags, ZeroBits, StackSize, MaximumStackSize,\n        wow64pp::ptr_to_uint64(AttributeList));\n    NTSTATUS result = static_cast<NTSTATUS>(result64);\n    THROW_IF_NTSTATUS_FAILED(result);\n    *ThreadHandle = reinterpret_cast<HANDLE>(threadHandle64);\n}\n#endif  // _M_IX86\n\n#ifdef _WIN64\n//\n// Reference: https://repnz.github.io/posts/apc/wow64-user-apc/\n//\nULONG64 EncodeWow64ApcRoutine(ULONG64 ApcRoutine) {\n    return (ULONG64)((-(INT64)ApcRoutine) << 2);\n}\n#endif  // _WIN64\n\n//\n// Reference: https://repnz.github.io/posts/apc/user-apc/\n//\nvoid MyQueueUserAPC(PPS_APC_ROUTINE pfnAPC,\n                    HANDLE hThread,\n                    void* data,\n                    USHORT targetProcessArch) {\n#ifndef _WIN64\n    if (targetProcessArch == IMAGE_FILE_MACHINE_AMD64 ||\n        targetProcessArch == IMAGE_FILE_MACHINE_ARM64) {\n        // WOW64 to x64 native, use heaven's gate.\n        //\n        // \"Microsoft added a validation to prevent a programming error:\n        // If you try to queue an APC from a 32 bit process to a 64 bit\n        // process and you use a 32 bit address, you'll get this status code:\n        // [...] STATUS_INVALID_HANDLE\"\n        // https://repnz.github.io/posts/apc/wow64-user-apc/\n        NtQueueApcThread64(hThread, pfnAPC, data, nullptr, nullptr);\n        return;\n    }\n#endif  // _WIN64\n\n    using NtQueueApcThread_t = NTSTATUS(NTAPI*)(\n        _In_ HANDLE ThreadHandle, _In_ PPS_APC_ROUTINE ApcRoutine,\n        _In_opt_ PVOID ApcArgument1, _In_opt_ PVOID ApcArgument2,\n        _In_opt_ PVOID ApcArgument3);\n\n    GET_PROC_ADDRESS_ONCE(NtQueueApcThread_t, pNtQueueApcThread, L\"ntdll.dll\",\n                          \"NtQueueApcThread\");\n\n    if (!pNtQueueApcThread) {\n        throw std::runtime_error(\"NtQueueApcThread not found\");\n    }\n\n#ifdef _WIN64\n    if (targetProcessArch == IMAGE_FILE_MACHINE_I386) {\n        // x64 native to WOW64, encode address.\n        pfnAPC = (PPS_APC_ROUTINE)EncodeWow64ApcRoutine((ULONG64)pfnAPC);\n    }\n#endif  // _WIN64\n\n    THROW_IF_NTSTATUS_FAILED(\n        pNtQueueApcThread(hThread, pfnAPC, data, nullptr, nullptr));\n}\n\nUSHORT GetProcessArch(HANDLE hProcess) {\n    using GetProcessInformation_t = BOOL(WINAPI*)(\n        HANDLE hProcess, PROCESS_INFORMATION_CLASS ProcessInformationClass,\n        LPVOID ProcessInformation, DWORD ProcessInformationSize);\n\n    GET_PROC_ADDRESS_ONCE(GetProcessInformation_t, pGetProcessInformation,\n                          L\"kernel32.dll\", \"GetProcessInformation\");\n\n    if (pGetProcessInformation) {\n        PROCESS_MACHINE_INFORMATION pmi;\n        if (pGetProcessInformation(hProcess, ProcessMachineTypeInfo, &pmi,\n                                   sizeof(pmi))) {\n            return pmi.ProcessMachine;\n        }\n\n        THROW_LAST_ERROR_IF(GetLastError() != ERROR_INVALID_PARAMETER);\n    }\n\n    // If GetProcessInformation(ProcessMachineTypeInfo) isn't supported, assume\n    // only IMAGE_FILE_MACHINE_I386 and IMAGE_FILE_MACHINE_AMD64.\n\n#ifndef _WIN64\n    SYSTEM_INFO siSystemInfo;\n    GetNativeSystemInfo(&siSystemInfo);\n    if (siSystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {\n        // 32-bit machine, only one option.\n        return IMAGE_FILE_MACHINE_I386;\n    }\n#endif  // _WIN64\n\n    BOOL bIsWow64Process;\n    if (IsWow64Process(hProcess, &bIsWow64Process) && bIsWow64Process) {\n        return IMAGE_FILE_MACHINE_I386;\n    }\n\n    return IMAGE_FILE_MACHINE_AMD64;\n}\n\n}  // namespace\n\nnamespace DllInject {\n\nvoid DllInject(HANDLE hProcess,\n               HANDLE hThreadForAPC,\n               HANDLE hSessionManagerProcess,\n               HANDLE hSessionMutex,\n               bool threadAttachExempt) {\n    const BYTE* shellcode;\n    size_t shellcodeSize;\n    size_t shellcodeThreadOffset = 0;\n    size_t shellcodeAPCOffset = 0;\n\n    USHORT targetProcessArch = GetProcessArch(hProcess);\n    switch (targetProcessArch) {\n        case IMAGE_FILE_MACHINE_I386:\n            shellcode = x32Shellcode;\n            shellcodeSize = x32ShellcodeSize;\n            shellcodeAPCOffset = sizeof(PRE_X32SHELLCODE_ARGS_1_TO_3) - 1;\n            break;\n\n        case IMAGE_FILE_MACHINE_AMD64:\n            shellcode = x64Shellcode;\n            shellcodeSize = x64ShellcodeSize;\n            break;\n\n        case IMAGE_FILE_MACHINE_ARM64:\n            shellcode = arm64Shellcode;\n            shellcodeSize = arm64ShellcodeSize;\n            break;\n\n        default:\n            throw std::logic_error(\"Invalid architecture value\");\n    }\n\n    std::wstring dllPath =\n        StorageManager::GetInstance().GetEnginePath(targetProcessArch) /\n        L\"windhawk.dll\";\n    size_t dllPathBytes = (dllPath.length() + 1) * sizeof(WCHAR);\n\n    HANDLE hRemoteSessionManagerProcess;\n    THROW_IF_WIN32_BOOL_FALSE(DuplicateHandle(\n        GetCurrentProcess(), hSessionManagerProcess, hProcess,\n        &hRemoteSessionManagerProcess,\n        PROCESS_QUERY_LIMITED_INFORMATION | SYNCHRONIZE, FALSE, 0));\n\n    auto remoteSessionManagerProcessCleanup =\n        wil::scope_exit([hProcess, hRemoteSessionManagerProcess] {\n            DuplicateHandle(hProcess, hRemoteSessionManagerProcess, nullptr,\n                            nullptr, 0, FALSE, DUPLICATE_CLOSE_SOURCE);\n        });\n\n    HANDLE hRemoteSessionMutex = nullptr;\n    if (hSessionMutex) {\n        THROW_IF_WIN32_BOOL_FALSE(DuplicateHandle(\n            GetCurrentProcess(), hSessionMutex, hProcess, &hRemoteSessionMutex,\n            PROCESS_QUERY_LIMITED_INFORMATION, FALSE, 0));\n    }\n\n    auto remoteSessionMutexCleanup =\n        wil::scope_exit([hProcess, hRemoteSessionMutex] {\n            if (hRemoteSessionMutex) {\n                DuplicateHandle(hProcess, hRemoteSessionMutex, nullptr, nullptr,\n                                0, FALSE, DUPLICATE_CLOSE_SOURCE);\n            }\n        });\n\n    size_t shellcodeDataSize =\n        offsetof(LOAD_LIBRARY_REMOTE_DATA, szDllName) + dllPathBytes;\n    auto shellcodeDataVector = std::vector<BYTE>(shellcodeDataSize);\n    auto shellcodeData =\n        reinterpret_cast<LOAD_LIBRARY_REMOTE_DATA*>(shellcodeDataVector.data());\n\n    shellcodeData->nLogVerbosity =\n        static_cast<INT32>(Logger::GetInstance().GetVerbosity());\n    shellcodeData->bRunningFromAPC = !!hThreadForAPC;\n    shellcodeData->bThreadAttachExempt = threadAttachExempt;\n    shellcodeData->hSessionManagerProcess = hRemoteSessionManagerProcess;\n    shellcodeData->hSessionMutex = hRemoteSessionMutex;\n    memcpy(shellcodeData->szDllName, dllPath.c_str(), dllPathBytes);\n\n    size_t shellcodeSizeAligned =\n        (shellcodeSize + (sizeof(LONG_PTR) - 1)) & ~(sizeof(LONG_PTR) - 1);\n\n    // Allocate enough memory in the remote process's address space\n    // to hold the shellcode and the data struct.\n    void* pRemoteCode = VirtualAllocEx(\n        hProcess, nullptr, shellcodeSizeAligned + shellcodeDataSize,\n        MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n    THROW_LAST_ERROR_IF_NULL(pRemoteCode);\n\n    auto remoteCodeCleanup = wil::scope_exit([hProcess, pRemoteCode] {\n        VirtualFreeEx(hProcess, pRemoteCode, 0, MEM_RELEASE);\n    });\n\n    LPTHREAD_START_ROUTINE pRemoteThreadAddress =\n        reinterpret_cast<LPTHREAD_START_ROUTINE>(\n            reinterpret_cast<BYTE*>(pRemoteCode) + shellcodeThreadOffset);\n\n    PPS_APC_ROUTINE pRemoteAPCAddress = reinterpret_cast<PPS_APC_ROUTINE>(\n        reinterpret_cast<BYTE*>(pRemoteCode) + shellcodeAPCOffset);\n\n    shellcodeData->pThreadShellcodeAddress = pRemoteThreadAddress;\n    shellcodeData->pAPCShellcodeAddress = pRemoteAPCAddress;\n\n    // Write our shellcode into the remote process.\n    THROW_IF_WIN32_BOOL_FALSE(WriteProcessMemory(\n        hProcess, pRemoteCode, shellcode, shellcodeSize, nullptr));\n\n    // Write a copy of our struct to the remote process.\n    void* pRemoteData =\n        reinterpret_cast<BYTE*>(pRemoteCode) + shellcodeSizeAligned;\n    THROW_IF_WIN32_BOOL_FALSE(WriteProcessMemory(\n        hProcess, pRemoteData, shellcodeData, shellcodeDataSize, nullptr));\n\n    // Mark shellcode as executable.\n    DWORD oldProtect;\n    THROW_IF_WIN32_BOOL_FALSE(VirtualProtectEx(\n        hProcess, pRemoteCode, shellcodeSize, PAGE_EXECUTE_READ, &oldProtect));\n\n    if (hThreadForAPC) {\n        MyQueueUserAPC(pRemoteAPCAddress, hThreadForAPC, pRemoteData,\n                       targetProcessArch);\n    } else {\n        DWORD createThreadFlags = 0;\n\n        if (threadAttachExempt) {\n            createThreadFlags |=\n                Functions::MY_REMOTE_THREAD_THREAD_ATTACH_EXEMPT;\n        }\n\n#ifndef _WIN64\n        if (targetProcessArch == IMAGE_FILE_MACHINE_AMD64 ||\n            targetProcessArch == IMAGE_FILE_MACHINE_ARM64) {\n            // WOW64 to x64 native, use heaven's gate.\n            wil::unique_process_handle remoteThread;\n            NtCreateThreadEx64(\n                &remoteThread, THREAD_ALL_ACCESS, nullptr, hProcess,\n                reinterpret_cast<PUSER_THREAD_START_ROUTINE>(\n                    pRemoteThreadAddress),\n                pRemoteData, createThreadFlags, 0, 0, 0, nullptr);\n            Functions::SetThreadDescriptionIfAvailable(\n                remoteThread.get(), L\"WindhawkInjectedFromWow64\");\n        } else\n#endif  // _WIN64\n        {\n            wil::unique_process_handle remoteThread(\n                Functions::MyCreateRemoteThread(hProcess, pRemoteThreadAddress,\n                                                pRemoteData,\n                                                createThreadFlags));\n            THROW_LAST_ERROR_IF_NULL(remoteThread);\n            Functions::SetThreadDescriptionIfAvailable(remoteThread.get(),\n                                                       L\"WindhawkInjected\");\n        }\n    }\n\n    remoteSessionManagerProcessCleanup.release();\n    remoteSessionMutexCleanup.release();\n    remoteCodeCleanup.release();\n}\n\n}  // namespace DllInject\n"
  },
  {
    "path": "src/windhawk/engine/dll_inject.h",
    "content": "#pragma once\n\nnamespace DllInject {\n\nconstexpr ACCESS_MASK kProcessAccess = PROCESS_CREATE_THREAD |\n                                       PROCESS_VM_OPERATION | PROCESS_VM_READ |\n                                       PROCESS_VM_WRITE | PROCESS_DUP_HANDLE |\n                                       PROCESS_QUERY_INFORMATION | SYNCHRONIZE;\n\nconstexpr ACCESS_MASK kApcThreadsAccess = THREAD_SET_CONTEXT;\n\nstruct LOAD_LIBRARY_REMOTE_DATA {\n    INT32 nLogVerbosity;\n    BOOL bRunningFromAPC;\n    BOOL bThreadAttachExempt;\n    union {\n        HANDLE hSessionManagerProcess;\n        // Make sure 32-bit/64-bit layouts are the same.\n        DWORD64 dw64SessionManagerProcess;\n    };\n    union {\n        HANDLE hSessionMutex;\n        // Make sure 32-bit/64-bit layouts are the same.\n        DWORD64 dw64SessionMutex;\n    };\n    union {\n        void* pThreadShellcodeAddress;\n        // Make sure 32-bit/64-bit layouts are the same.\n        DWORD64 dw64ThreadShellcodeAddress;\n    };\n    union {\n        void* pAPCShellcodeAddress;\n        // Make sure 32-bit/64-bit layouts are the same.\n        DWORD64 dw64APCShellcodeAddress;\n    };\n    WCHAR szDllName[1];  // flexible array member\n};\n\nvoid DllInject(HANDLE hProcess,\n               HANDLE hThreadForAPC,\n               HANDLE hSessionManagerProcess,\n               HANDLE hSessionMutex,\n               bool threadAttachExempt);\n\n}  // namespace DllInject\n"
  },
  {
    "path": "src/windhawk/engine/engine.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>engine</RootNamespace>\n    <ProjectName>engine</ProjectName>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\32\\</OutDir>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\64\\</OutDir>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\arm64\\</OutDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\32\\</OutDir>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\64\\</OutDir>\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <IncludePath>$(ProjectDir)libraries;$(ProjectDir)..\\shared;$(ProjectDir)..\\shared\\libraries;$(IncludePath)</IncludePath>\n    <LibraryPath>$(ProjectDir)libraries;$(ProjectDir)..\\shared\\libraries;$(LibraryPath)</LibraryPath>\n    <GenerateManifest>false</GenerateManifest>\n    <TargetName>windhawk</TargetName>\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)$(Configuration)\\arm64\\</OutDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>ntdll.lib;dia/lib/diaguids.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>ntdll.lib;dia/lib/amd64/diaguids.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>ntdll.lib;dia/lib/arm64/diaguids.lib;ntdll.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>ntdll.lib;dia/lib/diaguids.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>ntdll.lib;dia/lib/amd64/diaguids.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;ZYDIS_STATIC_BUILD;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <LanguageStandard>stdcpplatest</LanguageStandard>\n      <AdditionalOptions>/d1trimfile:\"$(SolutionDir)\\\" %(AdditionalOptions)</AdditionalOptions>\n      <ObjectFileName>$(IntDir)obj\\%(RelativeDir)</ObjectFileName>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>ntdll.lib;dia/lib/arm64/diaguids.lib;ntdll.lib;%(AdditionalDependencies);version.lib</AdditionalDependencies>\n      <ModuleDefinitionFile>_exports.def</ModuleDefinitionFile>\n      <DelayLoadDLLs>\n      </DelayLoadDLLs>\n      <GenerateMapFile>true</GenerateMapFile>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\shared\\logger_base.cpp\" />\n    <ClCompile Include=\"..\\shared\\portable_settings.cpp\" />\n    <ClCompile Include=\"all_processes_injector.cpp\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"dll_inject.cpp\" />\n    <ClCompile Include=\"functions.cpp\" />\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode0.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode1.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode2.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode_fields32.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode_scratchpad.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decompose_and_disassemble.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\encodings_dec.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\encodings_fmt.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\format.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\gofer.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\operations.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\pcode.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\regs.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\sysregs.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Level1</WarningLevel>\n      <WarningLevel Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Level1</WarningLevel>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\MinHook.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Disassembler.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\InlineHook.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Instruction.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Memory.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Thread.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Trampoline.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Transaction.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\buffer.c\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hde\\hde32.c\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hde\\hde64.c\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hook.c\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\trampoline.c\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\Memory.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\Thread.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\ThreadsCallStackIterate.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\ThreadsCallStackWaitForRegions.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\zydis\\Zydis.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">NotUsing</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">NotUsing</PrecompiledHeader>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"logger.cpp\" />\n    <ClCompile Include=\"mod.cpp\" />\n    <ClCompile Include=\"mods_api.cpp\" />\n    <ClCompile Include=\"mods_manager.cpp\" />\n    <ClCompile Include=\"new_process_injector.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n    <ClCompile Include=\"customization_session.cpp\" />\n    <ClCompile Include=\"no_destructor.cpp\" />\n    <ClCompile Include=\"session_private_namespace.cpp\" />\n    <ClCompile Include=\"storage_manager.cpp\" />\n    <ClCompile Include=\"stdafx.cpp\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">Create</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"symbol_enum.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\shared\\logger_base.h\" />\n    <ClInclude Include=\"..\\shared\\portable_settings.h\" />\n    <ClInclude Include=\"..\\shared\\version.h\" />\n    <ClInclude Include=\"all_processes_injector.h\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">true</ExcludedFromBuild>\n    </ClInclude>\n    <ClInclude Include=\"process_lists.h\" />\n    <ClInclude Include=\"dll_inject.h\" />\n    <ClInclude Include=\"functions.h\" />\n    <ClInclude Include=\"logger.h\" />\n    <ClInclude Include=\"mod.h\" />\n    <ClInclude Include=\"mods_api.h\" />\n    <ClInclude Include=\"mods_api_internal.h\" />\n    <ClInclude Include=\"mods_manager.h\" />\n    <ClInclude Include=\"new_process_injector.h\" />\n    <ClInclude Include=\"customization_session.h\" />\n    <ClInclude Include=\"no_destructor.h\" />\n    <ClInclude Include=\"resource.h\" />\n    <ClInclude Include=\"session_private_namespace.h\" />\n    <ClInclude Include=\"storage_manager.h\" />\n    <ClInclude Include=\"stdafx.h\" />\n    <ClInclude Include=\"symbol_enum.h\" />\n    <ClInclude Include=\"var_init_once.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"rsrc.rc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/windhawk/engine/engine.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n    <Filter Include=\"Libraries\">\n      <UniqueIdentifier>{dbc84a6d-1bd2-44c1-8485-a0ca8231f2c2}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Libraries\\Zydis\">\n      <UniqueIdentifier>{e8326006-2f1d-452e-8735-9ef7d0f0940e}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Libraries\\binaryninja-arm64-disassembler\">\n      <UniqueIdentifier>{3e48c109-06fb-4f27-9600-a875a73ecf97}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Libraries\\MinHook\">\n      <UniqueIdentifier>{d1e5db26-6c1a-4423-a69e-955b89519bc9}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Libraries\\MinHook-Detours\">\n      <UniqueIdentifier>{bbbe2e93-e300-48cd-8b34-69e6c0e26802}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Libraries\\thread-call-stack-scanner\">\n      <UniqueIdentifier>{ce2439c9-7065-439c-a1dd-4a3337b938c8}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"mods_manager.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"functions.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"new_process_injector.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"logger.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dll_inject.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"customization_session.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"all_processes_injector.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"mod.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"mods_api.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"storage_manager.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"symbol_enum.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\shared\\portable_settings.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\shared\\logger_base.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"session_private_namespace.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"no_destructor.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\zydis\\Zydis.c\">\n      <Filter>Libraries\\Zydis</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode_fields32.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode_scratchpad.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode0.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode1.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decode2.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\decompose_and_disassemble.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\encodings_dec.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\encodings_fmt.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\format.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\gofer.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\operations.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\pcode.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\regs.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\binaryninja-arm64-disassembler\\sysregs.c\">\n      <Filter>Libraries\\binaryninja-arm64-disassembler</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\buffer.c\">\n      <Filter>Libraries\\MinHook</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hde\\hde32.c\">\n      <Filter>Libraries\\MinHook</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hde\\hde64.c\">\n      <Filter>Libraries\\MinHook</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\hook.c\">\n      <Filter>Libraries\\MinHook</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook\\src\\trampoline.c\">\n      <Filter>Libraries\\MinHook</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\MinHook.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Disassembler.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\InlineHook.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Instruction.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Memory.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Thread.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Trampoline.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\MinHook-Detours\\SlimDetours\\Transaction.c\">\n      <Filter>Libraries\\MinHook-Detours</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\ThreadsCallStackWaitForRegions.c\">\n      <Filter>Libraries\\thread-call-stack-scanner</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\Memory.c\">\n      <Filter>Libraries\\thread-call-stack-scanner</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\Thread.c\">\n      <Filter>Libraries\\thread-call-stack-scanner</Filter>\n    </ClCompile>\n    <ClCompile Include=\"libraries\\thread-call-stack-scanner\\ThreadsCallStackIterate.c\">\n      <Filter>Libraries\\thread-call-stack-scanner</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"dll_inject.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"new_process_injector.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"all_processes_injector.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"logger.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"functions.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"mods_api.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"customization_session.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"mods_manager.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"stdafx.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"mod.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"storage_manager.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"symbol_enum.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\version.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\portable_settings.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\shared\\logger_base.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"session_private_namespace.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"no_destructor.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"var_init_once.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"mods_api_internal.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"process_lists.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"rsrc.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/windhawk/engine/functions.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"var_init_once.h\"\n\nnamespace Functions {\n\nnamespace {\n\n// Source:\n// https://github.com/dotnet-bot/corert/blob/8928dfd66d98f40017ec7435df1fbada113656a8/src/Native/Runtime/windows/PalRedhawkCommon.cpp#L78\n//\n// Given the OS handle of a loaded module, compute the upper and lower virtual\n// address bounds (inclusive).\nvoid PalGetModuleBounds(HANDLE hOsHandle,\n                        _Out_ BYTE** ppLowerBound,\n                        _Out_ BYTE** ppUpperBound) {\n    BYTE* pbModule = (BYTE*)hOsHandle;\n    DWORD cbModule;\n\n    IMAGE_NT_HEADERS* pNtHeaders =\n        (IMAGE_NT_HEADERS*)(pbModule +\n                            ((IMAGE_DOS_HEADER*)hOsHandle)->e_lfanew);\n    if (pNtHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)\n        cbModule = ((IMAGE_OPTIONAL_HEADER32*)&pNtHeaders->OptionalHeader)\n                       ->SizeOfImage;\n    else\n        cbModule = ((IMAGE_OPTIONAL_HEADER64*)&pNtHeaders->OptionalHeader)\n                       ->SizeOfImage;\n\n    *ppLowerBound = pbModule;\n    *ppUpperBound = pbModule + cbModule - 1;\n}\n\n}  // namespace\n\n// https://github.com/tidwall/match.c\n//\n// match returns true if str matches pattern. This is a very\n// simple wildcard match where '*' matches on any number characters\n// and '?' matches on any one character.\n//\n// pattern:\n//   { term }\n// term:\n// \t '*'         matches any sequence of non-Separator characters\n// \t '?'         matches any single non-Separator character\n// \t c           matches character c (c != '*', '?')\nbool wcsmatch(PCWSTR pat, size_t plen, PCWSTR str, size_t slen) {\n    if (plen < 0)\n        plen = wcslen(pat);\n    if (slen < 0)\n        slen = wcslen(str);\n    while (plen > 0) {\n        if (pat[0] == L'*') {\n            if (plen == 1)\n                return true;\n            if (pat[1] == L'*') {\n                pat++;\n                plen--;\n                continue;\n            }\n            if (wcsmatch(pat + 1, plen - 1, str, slen))\n                return true;\n            if (slen == 0)\n                return false;\n            str++;\n            slen--;\n            continue;\n        }\n        if (slen == 0)\n            return false;\n        if (pat[0] != L'?' && str[0] != pat[0])\n            return false;\n        pat++;\n        plen--;\n        str++;\n        slen--;\n    }\n    return slen == 0 && plen == 0;\n}\n\nstd::vector<std::wstring> SplitString(std::wstring_view s, WCHAR delim) {\n    // https://stackoverflow.com/a/48403210\n    auto view =\n        s | std::views::split(delim) | std::views::transform([](auto&& rng) {\n            return std::wstring_view(rng.data(), rng.size());\n        });\n    return std::vector<std::wstring>(view.begin(), view.end());\n}\n\nstd::vector<std::wstring_view> SplitStringToViews(std::wstring_view s,\n                                                  WCHAR delim) {\n    // https://stackoverflow.com/a/48403210\n    auto view =\n        s | std::views::split(delim) | std::views::transform([](auto&& rng) {\n            return std::wstring_view(rng.data(), rng.size());\n        });\n    return std::vector<std::wstring_view>(view.begin(), view.end());\n}\n\n// https://stackoverflow.com/a/29752943\nstd::wstring ReplaceAll(std::wstring_view source,\n                        std::wstring_view from,\n                        std::wstring_view to,\n                        bool ignoreCase) {\n    auto findString = [ignoreCase](std::wstring_view haystack,\n                                   std::wstring_view needle,\n                                   size_t pos) -> size_t {\n        if (!ignoreCase) {\n            return haystack.find(needle, pos);\n        }\n\n        auto it = std::search(\n            haystack.begin() + pos, haystack.end(), needle.begin(),\n            needle.end(), [](WCHAR ch1, WCHAR ch2) {\n                LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &ch1,\n                              1, &ch1, 1, nullptr, nullptr, 0);\n                LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &ch2,\n                              1, &ch2, 1, nullptr, nullptr, 0);\n                return ch1 == ch2;\n            });\n        if (it == haystack.end()) {\n            return haystack.npos;\n        }\n\n        return std::distance(haystack.begin(), it);\n    };\n\n    std::wstring newString;\n\n    size_t lastPos = 0;\n    size_t findPos;\n\n    while ((findPos = findString(source, from, lastPos)) != source.npos) {\n        newString.append(source, lastPos, findPos - lastPos);\n        newString += to;\n        lastPos = findPos + from.length();\n    }\n\n    // Care for the rest after last occurrence.\n    newString += source.substr(lastPos);\n\n    return newString;\n}\n\nbool DoesPathMatchPattern(std::wstring_view path,\n                          std::wstring_view pattern,\n                          bool explicitOnly) {\n    if (pattern.empty()) {\n        return false;\n    }\n\n    // A case-insensitive comparison as recommended here:\n    // https://stackoverflow.com/q/410502\n\n    std::wstring pathUpper{path};\n\n    // Don't use CharUpperBuff to avoid depending on user32.dll. Use\n    // LCMapStringEx just like it's called internally by CharUpperBuff.\n    // CharUpperBuff(&pathUpper[0], wil::safe_cast<DWORD>(pathUpper.length()));\n    LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, &pathUpper[0],\n                  wil::safe_cast<int>(pathUpper.length()), &pathUpper[0],\n                  wil::safe_cast<int>(pathUpper.length()), nullptr, nullptr, 0);\n\n    std::wstring_view pathFileNameUpper = pathUpper;\n    if (size_t i = pathFileNameUpper.rfind(L'\\\\');\n        i != pathFileNameUpper.npos) {\n        pathFileNameUpper.remove_prefix(i + 1);\n    }\n\n    for (const auto& patternPartView : SplitStringToViews(pattern, L'|')) {\n        if (explicitOnly) {\n            bool patternIsWildcard =\n                patternPartView.find_first_of(L\"*?\") != patternPartView.npos;\n            if (patternIsWildcard) {\n                // If the pattern contains wildcards, it's not an explicit\n                // match.\n                continue;\n            }\n        }\n\n        auto patternPart = std::wstring{patternPartView};\n\n#ifndef _WIN64\n        BOOL isWow64;\n        if (IsWow64Process(GetCurrentProcess(), &isWow64) && isWow64) {\n            // Get the native Program Files path regardless of the current\n            // process architecture.\n            patternPart = ReplaceAll(patternPart, L\"%ProgramFiles%\",\n                                     L\"%ProgramW6432%\", /*ignoreCase=*/true);\n        }\n#endif  // _WIN64\n\n        auto patternPartNormalized =\n            wil::ExpandEnvironmentStrings<std::wstring>(patternPart.c_str());\n\n        // CharUpperBuff(&patternPartNormalized[0],\n        //               wil::safe_cast<DWORD>(patternPartNormalized.length()));\n        LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE,\n                      &patternPartNormalized[0],\n                      wil::safe_cast<int>(patternPartNormalized.length()),\n                      &patternPartNormalized[0],\n                      wil::safe_cast<int>(patternPartNormalized.length()),\n                      nullptr, nullptr, 0);\n\n        std::wstring_view match = pathUpper;\n\n        // If there's no backslash in the pattern part, match only against the\n        // file name, not the full path.\n        if (patternPartNormalized.find(L'\\\\') == patternPartNormalized.npos) {\n            match = pathFileNameUpper;\n        }\n\n        if (wcsmatch(patternPartNormalized.data(),\n                     patternPartNormalized.length(), match.data(),\n                     match.length())) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nvoid** FindImportPtr(HMODULE hFindInModule,\n                     PCSTR pModuleName,\n                     PCSTR pImportName) {\n    IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hFindInModule;\n    IMAGE_NT_HEADERS* pNtHeader =\n        (IMAGE_NT_HEADERS*)((char*)pDosHeader + pDosHeader->e_lfanew);\n\n    if (pNtHeader->OptionalHeader.NumberOfRvaAndSizes <=\n            IMAGE_DIRECTORY_ENTRY_IMPORT ||\n        !pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]\n             .VirtualAddress) {\n        return nullptr;\n    }\n\n    ULONG_PTR ImageBase = (ULONG_PTR)hFindInModule;\n    IMAGE_IMPORT_DESCRIPTOR* pImportDescriptor =\n        (IMAGE_IMPORT_DESCRIPTOR*)(ImageBase +\n                                   pNtHeader->OptionalHeader\n                                       .DataDirectory\n                                           [IMAGE_DIRECTORY_ENTRY_IMPORT]\n                                       .VirtualAddress);\n\n    while (pImportDescriptor->OriginalFirstThunk) {\n        if (_stricmp((char*)(ImageBase + pImportDescriptor->Name),\n                     pModuleName) == 0) {\n            IMAGE_THUNK_DATA* pOriginalFirstThunk =\n                (IMAGE_THUNK_DATA*)(ImageBase +\n                                    pImportDescriptor->OriginalFirstThunk);\n            IMAGE_THUNK_DATA* pFirstThunk =\n                (IMAGE_THUNK_DATA*)(ImageBase + pImportDescriptor->FirstThunk);\n\n            while (ULONG_PTR ImageImportByName =\n                       pOriginalFirstThunk->u1.Function) {\n                if (!IMAGE_SNAP_BY_ORDINAL(ImageImportByName)) {\n                    if ((ULONG_PTR)pImportName & ~0xFFFF) {\n                        ImageImportByName += sizeof(WORD);\n\n                        if (strcmp((char*)(ImageBase + ImageImportByName),\n                                   pImportName) == 0) {\n                            return (void**)pFirstThunk;\n                        }\n                    }\n                } else {\n                    if (((ULONG_PTR)pImportName & ~0xFFFF) == 0) {\n                        if (IMAGE_ORDINAL(ImageImportByName) ==\n                            (ULONG_PTR)pImportName) {\n                            return (void**)pFirstThunk;\n                        }\n                    }\n                }\n\n                pOriginalFirstThunk++;\n                pFirstThunk++;\n            }\n        }\n\n        pImportDescriptor++;\n    }\n\n    return nullptr;\n}\n\nBOOL GetFullAccessSecurityDescriptor(\n    _Outptr_ PSECURITY_DESCRIPTOR* SecurityDescriptor,\n    _Out_opt_ PULONG SecurityDescriptorSize) {\n    // http://rsdn.org/forum/winapi/7510772.flat\n    //\n    // For full access maniacs :)\n    // Full access for the \"Everyone\" group and for the \"All [Restricted] App\n    // Packages\" groups. The integrity label is Untrusted (lowest level).\n    //\n    // D - DACL\n    // P - Protected\n    // A - Access Allowed\n    // GA - GENERIC_ALL\n    // WD - 'All' Group (World)\n    // S-1-15-2-1 - All Application Packages\n    // S-1-15-2-2 - All Restricted Application Packages\n    //\n    // S - SACL\n    // ML - Mandatory Label\n    // NW - No Write-Up policy\n    // S-1-16-0 - Untrusted Mandatory Level\n    PCWSTR pszStringSecurityDescriptor =\n        L\"D:P(A;;GA;;;WD)(A;;GA;;;S-1-15-2-1)(A;;GA;;;S-1-15-2-2)S:(ML;;NW;;;S-\"\n        L\"1-16-0)\";\n\n    return ConvertStringSecurityDescriptorToSecurityDescriptor(\n        pszStringSecurityDescriptor, SDDL_REVISION_1, SecurityDescriptor,\n        SecurityDescriptorSize);\n}\n\n// Based on:\n// http://securityxploded.com/ntcreatethreadex.php\n// Another reference:\n// https://github.com/winsiderss/systeminformer/blob/25846070780183848dc8d8f335a54fa6e636e281/phlib/basesup.c#L217\nHANDLE MyCreateRemoteThread(HANDLE hProcess,\n                            LPTHREAD_START_ROUTINE lpStartAddress,\n                            LPVOID lpParameter,\n                            ULONG createFlags) {\n    using NtCreateThreadEx_t = NTSTATUS(WINAPI*)(\n        _Out_ PHANDLE ThreadHandle, _In_ ACCESS_MASK DesiredAccess,\n        _In_opt_ LPVOID ObjectAttributes,  // POBJECT_ATTRIBUTES\n        _In_ HANDLE ProcessHandle,\n        _In_ PVOID StartRoutine,  // PUSER_THREAD_START_ROUTINE\n        _In_opt_ PVOID Argument,\n        _In_ ULONG CreateFlags,  // THREAD_CREATE_FLAGS_*\n        _In_ SIZE_T ZeroBits, _In_ SIZE_T StackSize,\n        _In_ SIZE_T MaximumStackSize,\n        _In_opt_ LPVOID AttributeList  // PPS_ATTRIBUTE_LIST\n    );\n\n    GET_PROC_ADDRESS_ONCE(NtCreateThreadEx_t, pNtCreateThreadEx, L\"ntdll.dll\",\n                          \"NtCreateThreadEx\");\n\n    if (!pNtCreateThreadEx) {\n        SetLastError(ERROR_PROC_NOT_FOUND);\n        return nullptr;\n    }\n\n    HANDLE hThread;\n    NTSTATUS result = pNtCreateThreadEx(&hThread, THREAD_ALL_ACCESS, nullptr,\n                                        hProcess, lpStartAddress, lpParameter,\n                                        createFlags, 0, 0, 0, nullptr);\n    if (result < 0) {\n        SetLastError(LsaNtStatusToWinError(result));\n        return nullptr;\n    }\n\n    return hThread;\n}\n\nvoid GetNtVersionNumbers(ULONG* pNtMajorVersion,\n                         ULONG* pNtMinorVersion,\n                         ULONG* pNtBuildNumber) {\n    using RtlGetNtVersionNumbers_t =\n        void(WINAPI*)(ULONG * pNtMajorVersion, ULONG * pNtMinorVersion,\n                      ULONG * pNtBuildNumber);\n\n    GET_PROC_ADDRESS_ONCE(RtlGetNtVersionNumbers_t, pRtlGetNtVersionNumbers,\n                          L\"ntdll.dll\", \"RtlGetNtVersionNumbers\");\n\n    if (pRtlGetNtVersionNumbers) {\n        pRtlGetNtVersionNumbers(pNtMajorVersion, pNtMinorVersion,\n                                pNtBuildNumber);\n        // The upper 4 bits are reserved for the type of the OS build.\n        // https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on\n        *pNtBuildNumber &= ~0xF0000000;\n        return;\n    }\n\n    // Use GetVersionEx as a fallback.\n#pragma warning(push)\n#pragma warning(disable : 4996)  // disable deprecation message\n    OSVERSIONINFO versionInfo = {sizeof(OSVERSIONINFO)};\n    if (GetVersionEx(&versionInfo)) {\n        *pNtMajorVersion = versionInfo.dwMajorVersion;\n        *pNtMinorVersion = versionInfo.dwMinorVersion;\n        *pNtBuildNumber = versionInfo.dwBuildNumber;\n        return;\n    }\n#pragma warning(pop)\n\n    *pNtMajorVersion = 0;\n    *pNtMinorVersion = 0;\n    *pNtBuildNumber = 0;\n}\n\nbool IsWindowsVersionOrGreaterWithBuildNumber(WORD wMajorVersion,\n                                              WORD wMinorVersion,\n                                              WORD wBuildNumber) {\n    ULONG majorVersion = 0;\n    ULONG minorVersion = 0;\n    ULONG buildNumber = 0;\n    Functions::GetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber);\n\n    if (majorVersion != wMajorVersion) {\n        return majorVersion > wMajorVersion;\n    }\n\n    if (minorVersion != wMinorVersion) {\n        return minorVersion > wMinorVersion;\n    }\n\n    return buildNumber >= wBuildNumber;\n}\n\n// Based on:\n// https://github.com/dotnet-bot/corert/blob/8928dfd66d98f40017ec7435df1fbada113656a8/src/Native/Runtime/windows/PalRedhawkCommon.cpp#L109\n//\n// Reads through the PE header of the specified module, and returns\n// the module's matching PDB's signature GUID and age by\n// fishing them out of the last IMAGE_DEBUG_DIRECTORY of type\n// IMAGE_DEBUG_TYPE_CODEVIEW.  Used when sending the ModuleLoad event\n// to help profilers find matching PDBs for loaded modules.\n//\n// Arguments:\n//\n// [in] hOsHandle - OS Handle for module from which to get PDB info\n// [out] pGuidSignature - PDB's signature GUID to be placed here\n// [out] pdwAge - PDB's age to be placed here\n//\n// This is a simplification of similar code in desktop CLR's GetCodeViewInfo\n// in eventtrace.cpp.\nbool ModuleGetPDBInfo(HANDLE hOsHandle,\n                      _Out_ GUID* pGuidSignature,\n                      _Out_ DWORD* pdwAge) {\n    // Zero-init [out]-params\n    ZeroMemory(pGuidSignature, sizeof(*pGuidSignature));\n    *pdwAge = 0;\n\n    BYTE* pbModule = (BYTE*)hOsHandle;\n\n    IMAGE_NT_HEADERS const* pNtHeaders =\n        (IMAGE_NT_HEADERS*)(pbModule +\n                            ((IMAGE_DOS_HEADER*)hOsHandle)->e_lfanew);\n    IMAGE_DATA_DIRECTORY const* rgDataDirectory = NULL;\n    if (pNtHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)\n        rgDataDirectory =\n            ((IMAGE_OPTIONAL_HEADER32 const*)&pNtHeaders->OptionalHeader)\n                ->DataDirectory;\n    else\n        rgDataDirectory =\n            ((IMAGE_OPTIONAL_HEADER64 const*)&pNtHeaders->OptionalHeader)\n                ->DataDirectory;\n\n    IMAGE_DATA_DIRECTORY const* pDebugDataDirectory =\n        &rgDataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];\n\n    // In Redhawk, modules are loaded as MAPPED, so we don't have to worry about\n    // dealing with FLAT files (with padding missing), so header addresses can\n    // be used as is\n    IMAGE_DEBUG_DIRECTORY const* rgDebugEntries =\n        (IMAGE_DEBUG_DIRECTORY const*)(pbModule +\n                                       pDebugDataDirectory->VirtualAddress);\n    DWORD cbDebugEntries = pDebugDataDirectory->Size;\n    if (cbDebugEntries < sizeof(IMAGE_DEBUG_DIRECTORY))\n        return false;\n\n    // Since rgDebugEntries is an array of IMAGE_DEBUG_DIRECTORYs,\n    // cbDebugEntries should be a multiple of sizeof(IMAGE_DEBUG_DIRECTORY).\n    if (cbDebugEntries % sizeof(IMAGE_DEBUG_DIRECTORY) != 0)\n        return false;\n\n    // CodeView RSDS debug information -> PDB 7.00\n    struct CV_INFO_PDB70 {\n        DWORD magic;\n        GUID signature;                 // unique identifier\n        DWORD age;                      // an always-incrementing value\n        _Field_z_ char path[MAX_PATH];  // zero terminated string with the name\n                                        // of the PDB file\n    };\n\n    // Temporary storage for a CV_INFO_PDB70 and its size (which could be less\n    // than sizeof(CV_INFO_PDB70); see below).\n    struct PdbInfo {\n        CV_INFO_PDB70* m_pPdb70;\n        ULONG m_cbPdb70;\n    };\n\n    // Grab module bounds so we can do some rough sanity checking before we\n    // follow any RVAs\n    BYTE* pbModuleLowerBound = NULL;\n    BYTE* pbModuleUpperBound = NULL;\n    PalGetModuleBounds(hOsHandle, &pbModuleLowerBound, &pbModuleUpperBound);\n\n    // Iterate through all debug directory entries. The convention is that\n    // debuggers & profilers typically just use the very last\n    // IMAGE_DEBUG_TYPE_CODEVIEW entry.  Treat raw bytes we read as untrusted.\n    PdbInfo pdbInfoLast = {0};\n    int cEntries = cbDebugEntries / sizeof(IMAGE_DEBUG_DIRECTORY);\n    for (int i = 0; i < cEntries; i++) {\n        if ((BYTE*)(&rgDebugEntries[i]) + sizeof(rgDebugEntries[i]) >=\n            pbModuleUpperBound) {\n            // Bogus pointer\n            return false;\n        }\n\n        if (rgDebugEntries[i].Type != IMAGE_DEBUG_TYPE_CODEVIEW)\n            continue;\n\n        // Get raw data pointed to by this IMAGE_DEBUG_DIRECTORY\n\n        // AddressOfRawData is generally set properly for Redhawk modules, so we\n        // don't have to worry about using PointerToRawData and converting it to\n        // an RVA\n        if (rgDebugEntries[i].AddressOfRawData == NULL)\n            continue;\n\n        DWORD rvaOfRawData = rgDebugEntries[i].AddressOfRawData;\n        ULONG cbDebugData = rgDebugEntries[i].SizeOfData;\n        if (cbDebugData < size_t(&((CV_INFO_PDB70*)0)->magic) +\n                              sizeof(((CV_INFO_PDB70*)0)->magic)) {\n            // raw data too small to contain magic number at expected spot, so\n            // its format is not recognizable. Skip\n            continue;\n        }\n\n        // Verify the magic number is as expected\n        const DWORD CV_SIGNATURE_RSDS = 0x53445352;\n        CV_INFO_PDB70* pPdb70 = (CV_INFO_PDB70*)(pbModule + rvaOfRawData);\n        if ((BYTE*)(pPdb70) + cbDebugData >= pbModuleUpperBound) {\n            // Bogus pointer\n            return false;\n        }\n\n        if (pPdb70->magic != CV_SIGNATURE_RSDS) {\n            // Unrecognized magic number.  Skip\n            continue;\n        }\n\n        // From this point forward, the format should adhere to the expected\n        // layout of CV_INFO_PDB70. If we find otherwise, then assume the\n        // IMAGE_DEBUG_DIRECTORY is outright corrupt.\n\n        // Verify sane size of raw data\n        if (cbDebugData > sizeof(CV_INFO_PDB70))\n            return false;\n\n        // cbDebugData actually can be < sizeof(CV_INFO_PDB70), since the \"path\"\n        // field can be truncated to its actual data length (i.e., fewer than\n        // MAX_PATH chars may be present in the PE file). In some cases, though,\n        // cbDebugData will include all MAX_PATH chars even though path gets\n        // null-terminated well before the MAX_PATH limit.\n\n        // Gotta have at least one byte of the path\n        if (cbDebugData < offsetof(CV_INFO_PDB70, path) + sizeof(char))\n            return false;\n\n        // How much space is available for the path?\n        size_t cchPathMaxIncludingNullTerminator =\n            (cbDebugData - offsetof(CV_INFO_PDB70, path)) / sizeof(char);\n        // assert(cchPathMaxIncludingNullTerminator >= 1);  // Guaranteed above\n\n        // Verify path string fits inside the declared size\n        size_t cchPathActualExcludingNullTerminator =\n            strnlen_s(pPdb70->path, cchPathMaxIncludingNullTerminator);\n        if (cchPathActualExcludingNullTerminator ==\n            cchPathMaxIncludingNullTerminator) {\n            // This is how strnlen indicates failure--it couldn't find the null\n            // terminator within the buffer size specified\n            return false;\n        }\n\n        // Looks valid.  Remember it.\n        pdbInfoLast.m_pPdb70 = pPdb70;\n        pdbInfoLast.m_cbPdb70 = cbDebugData;\n    }\n\n    // Take the last IMAGE_DEBUG_TYPE_CODEVIEW entry we saw, and return it to\n    // the caller\n    if (pdbInfoLast.m_pPdb70 != NULL) {\n        memcpy(pGuidSignature, &pdbInfoLast.m_pPdb70->signature, sizeof(GUID));\n        *pdwAge = pdbInfoLast.m_pPdb70->age;\n        return true;\n    }\n\n    return false;\n}\n\nstd::string GetModuleVersion(HMODULE hModule) {\n    // Avoid having version.dll in the import table, since it might not be\n    // available in all cases, e.g. sandboxed processes.\n    using VerQueryValueW_t = decltype(&VerQueryValueW);\n\n    LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(\n        VerQueryValueW_t, pVerQueryValueW, L\"version.dll\",\n        LOAD_LIBRARY_SEARCH_SYSTEM32, \"VerQueryValueW\");\n\n    if (!pVerQueryValueW) {\n        return {};\n    }\n\n    HRSRC hResource =\n        FindResource(hModule, MAKEINTRESOURCE(VS_VERSION_INFO), VS_FILE_INFO);\n    if (!hResource) {\n        return {};\n    }\n\n    HGLOBAL hGlobal = LoadResource(hModule, hResource);\n    if (!hGlobal) {\n        return {};\n    }\n\n    void* pData = LockResource(hGlobal);\n    if (!pData) {\n        return {};\n    }\n\n    VS_FIXEDFILEINFO* pFixedFileInfo = nullptr;\n    UINT uPtrLen = 0;\n    if (!pVerQueryValueW(pData, L\"\\\\\",\n                         reinterpret_cast<void**>(&pFixedFileInfo), &uPtrLen) ||\n        uPtrLen == 0) {\n        return {};\n    }\n\n    WORD nMajor = HIWORD(pFixedFileInfo->dwFileVersionMS);\n    WORD nMinor = LOWORD(pFixedFileInfo->dwFileVersionMS);\n    WORD nBuild = HIWORD(pFixedFileInfo->dwFileVersionLS);\n    WORD nQFE = LOWORD(pFixedFileInfo->dwFileVersionLS);\n\n    std::string result;\n    result += std::to_string(nMajor);\n    result += '.';\n    result += std::to_string(nMinor);\n    result += '.';\n    result += std::to_string(nBuild);\n    result += '.';\n    result += std::to_string(nQFE);\n\n    return result;\n}\n\nHRESULT SetThreadDescriptionIfAvailable(HANDLE hThread,\n                                        PCWSTR lpThreadDescription) {\n    using SetThreadDescription_t = decltype(&SetThreadDescription);\n    LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(\n        SetThreadDescription_t, pSetThreadDescription, L\"kernel32.dll\",\n        LOAD_LIBRARY_SEARCH_SYSTEM32, \"SetThreadDescription\");\n\n    if (!pSetThreadDescription) {\n        return E_NOTIMPL;\n    }\n\n    return pSetThreadDescription(hThread, lpThreadDescription);\n}\n\n}  // namespace Functions\n"
  },
  {
    "path": "src/windhawk/engine/functions.h",
    "content": "#pragma once\n\nnamespace Functions {\n\nbool wcsmatch(PCWSTR pat, size_t plen, PCWSTR str, size_t slen);\nstd::vector<std::wstring> SplitString(std::wstring_view s, WCHAR delim);\nstd::vector<std::wstring_view> SplitStringToViews(std::wstring_view s,\n                                                  WCHAR delim);\nstd::wstring ReplaceAll(std::wstring_view source,\n                        std::wstring_view from,\n                        std::wstring_view to,\n                        bool ignoreCase = false);\nbool DoesPathMatchPattern(std::wstring_view path,\n                          std::wstring_view pattern,\n                          bool explicitOnly = false);\nvoid** FindImportPtr(HMODULE hFindInModule,\n                     PCSTR pModuleName,\n                     PCSTR pImportName);\nBOOL GetFullAccessSecurityDescriptor(\n    _Outptr_ PSECURITY_DESCRIPTOR* SecurityDescriptor,\n    _Out_opt_ PULONG SecurityDescriptorSize);\n\n// https://waleedassar.blogspot.com/2012/12/skipthreadattach.html\nenum MyCreateRemoteThreadFlags : ULONG {\n    MY_REMOTE_THREAD_CREATE_SUSPENDED = 0x01,\n    MY_REMOTE_THREAD_THREAD_ATTACH_EXEMPT = 0x02,\n    MY_REMOTE_THREAD_HIDE_FROM_DEBUGGER = 0x04,\n    MY_REMOTE_THREAD_LOADER_WORKER = 0x10,          // since THRESHOLD\n    MY_REMOTE_THREAD_SKIP_LOADER_INIT = 0x20,       // since REDSTONE2\n    MY_REMOTE_THREAD_BYPASS_PROCESS_FREEZE = 0x40,  // since 19H1\n};\n\n// Using MyCreateRemoteThread instead of CreateRemoteThread provides the\n// following benefits:\n// * On Windows 7, it allows to create a remote thread in a process running in\n//   another session.\n// * It allows providing extra flags. We use the\n//   MY_REMOTE_THREAD_THREAD_ATTACH_EXEMPT flag to reduce incompatibility with\n//   other processes.\nHANDLE MyCreateRemoteThread(HANDLE hProcess,\n                            LPTHREAD_START_ROUTINE lpStartAddress,\n                            LPVOID lpParameter,\n                            ULONG createFlags);\n\nvoid GetNtVersionNumbers(ULONG* pNtMajorVersion,\n                         ULONG* pNtMinorVersion,\n                         ULONG* pNtBuildNumber);\nbool IsWindowsVersionOrGreaterWithBuildNumber(WORD wMajorVersion,\n                                              WORD wMinorVersion,\n                                              WORD wBuildNumber);\nbool ModuleGetPDBInfo(HANDLE hOsHandle,\n                      _Out_ GUID* pGuidSignature,\n                      _Out_ DWORD* pdwAge);\nstd::string GetModuleVersion(HMODULE hModule);\nHRESULT SetThreadDescriptionIfAvailable(HANDLE hThread,\n                                        PCWSTR lpThreadDescription);\n\n}  // namespace Functions\n"
  },
  {
    "path": "src/windhawk/engine/inject_shellcode/.clang-format",
    "content": "BasedOnStyle: Microsoft\nUseTab: ForContinuationAndIndentation\nPointerAlignment: Left\nAlignConsecutiveMacros: AcrossEmptyLines\n"
  },
  {
    "path": "src/windhawk/engine/inject_shellcode/InjectShellcode.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/windhawk/engine/inject_shellcode/InjectShellcode.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32901.215\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"InjectShellcode\", \"InjectShellcode.vcxproj\", \"{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM64 = Debug|ARM64\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|ARM64 = Release|ARM64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Debug|x64.Build.0 = Debug|x64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|Win32.Build.0 = Release|Win32\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|x64.ActiveCfg = Release|x64\n\t\t{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {ECA2D17E-0AA3-4DA9-941B-8F0232D3A06D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/windhawk/engine/inject_shellcode/InjectShellcode.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{EDF9A877-A2A8-43AF-8BCC-897F5B28E104}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>InjectShellcode</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BufferSecurityCheck>false</BufferSecurityCheck>\n      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/windhawk/engine/inject_shellcode/main.cpp",
    "content": "//===============================================================================================//\n// The code is based on code from the ReflectiveDLLInjection project:\n// https://github.com/stephenfewer/ReflectiveDLLInjection/tree/master/dll/src\n// Original license can be found below.\n//===============================================================================================//\n// Copyright (c) 2012, Stephen Fewer of Harmony Security (www.harmonysecurity.com)\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted\n// provided that the following conditions are met:\n//\n//     * Redistributions of source code must retain the above copyright notice, this list of\n// conditions and the following disclaimer.\n//\n//     * Redistributions in binary form must reproduce the above copyright notice, this list of\n// conditions and the following disclaimer in the documentation and/or other materials provided\n// with the distribution.\n//\n//     * Neither the name of Harmony Security nor the names of its contributors may be used to\n// endorse or promote products derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\n// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//===============================================================================================//\n\n#include <windows.h>\n\n#include <iterator>\n\n#include \"../dll_inject.h\"\n\n// #define MESSAGE_BOX_TEST\n\n#define DEREF(name)    *(UINT_PTR*)(name)\n#define DEREF_64(name) *(DWORD64*)(name)\n#define DEREF_32(name) *(DWORD*)(name)\n#define DEREF_16(name) *(WORD*)(name)\n#define DEREF_8(name)  *(BYTE*)(name)\n\n//===============================================================================================//\ntypedef struct _UNICODE_STR\n{\n\tUSHORT Length;\n\tUSHORT MaximumLength;\n\tPWSTR pBuffer;\n} UNICODE_STR, *PUNICODE_STR;\n\n// WinDbg> dt -v ntdll!_LDR_DATA_TABLE_ENTRY\n//__declspec( align(8) )\ntypedef struct _LDR_DATA_TABLE_ENTRY\n{\n\tLIST_ENTRY InLoadOrderLinks;\n\tLIST_ENTRY InMemoryOrderModuleList;\n\tLIST_ENTRY InInitializationOrderModuleList;\n\tPVOID DllBase;\n\tPVOID EntryPoint;\n\tULONG SizeOfImage;\n\tUNICODE_STR FullDllName;\n\tUNICODE_STR BaseDllName;\n\tULONG Flags;\n\tSHORT LoadCount;\n\tSHORT TlsIndex;\n\tLIST_ENTRY HashTableEntry;\n\tULONG TimeDateStamp;\n} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;\n\n// WinDbg> dt -v ntdll!_PEB_LDR_DATA\ntypedef struct _PEB_LDR_DATA //, 7 elements, 0x28 bytes\n{\n\tDWORD dwLength;\n\tDWORD dwInitialized;\n\tLPVOID lpSsHandle;\n\tLIST_ENTRY InLoadOrderModuleList;\n\tLIST_ENTRY InMemoryOrderModuleList;\n\tLIST_ENTRY InInitializationOrderModuleList;\n\tLPVOID lpEntryInProgress;\n} PEB_LDR_DATA, *PPEB_LDR_DATA;\n\n// WinDbg> dt -v ntdll!_PEB_FREE_BLOCK\ntypedef struct _PEB_FREE_BLOCK // 2 elements, 0x8 bytes\n{\n\tstruct _PEB_FREE_BLOCK* pNext;\n\tDWORD dwSize;\n} PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;\n\n// struct _PEB is defined in Winternl.h but it is incomplete\n// https://ntdoc.m417z.com/peb\ntypedef struct __PEB\n{\n\tBOOLEAN InheritedAddressSpace;\n\tBOOLEAN ReadImageFileExecOptions;\n\tBOOLEAN BeingDebugged;\n\tunion {\n\t\tBOOLEAN BitField;\n\t\tstruct\n\t\t{\n\t\t\tBOOLEAN ImageUsesLargePages : 1;\n\t\t\tBOOLEAN IsProtectedProcess : 1;\n\t\t\tBOOLEAN IsImageDynamicallyRelocated : 1;\n\t\t\tBOOLEAN SkipPatchingUser32Forwarders : 1;\n\t\t\tBOOLEAN IsPackagedProcess : 1;\n\t\t\tBOOLEAN IsAppContainer : 1;\n\t\t\tBOOLEAN IsProtectedProcessLight : 1;\n\t\t\tBOOLEAN IsLongPathAwareProcess : 1;\n\t\t};\n\t};\n\tHANDLE Mutant;\n\tPVOID ImageBaseAddress;\n\tPPEB_LDR_DATA Ldr;\n\t/*PRTL_USER_PROCESS_PARAMETERS*/ PVOID ProcessParameters;\n\tPVOID SubSystemData;\n\tPVOID ProcessHeap;\n\tPRTL_CRITICAL_SECTION FastPebLock;\n\tPSLIST_HEADER AtlThunkSListPtr;\n\tPVOID IFEOKey;\n\tunion {\n\t\tULONG CrossProcessFlags;\n\t\tstruct\n\t\t{\n\t\t\tULONG ProcessInJob : 1;\n\t\t\tULONG ProcessInitializing : 1;\n\t\t\tULONG ProcessUsingVEH : 1;\n\t\t\tULONG ProcessUsingVCH : 1;\n\t\t\tULONG ProcessUsingFTH : 1;\n\t\t\tULONG ProcessPreviouslyThrottled : 1;\n\t\t\tULONG ProcessCurrentlyThrottled : 1;\n\t\t\tULONG ProcessImagesHotPatched : 1;\n\t\t\tULONG ReservedBits0 : 24;\n\t\t};\n\t};\n\tunion {\n\t\tPVOID KernelCallbackTable;\n\t\tPVOID UserSharedInfoPtr;\n\t};\n\tULONG SystemReserved;\n\tULONG AtlThunkSListPtr32;\n\t/*PAPI_SET_NAMESPACE*/ PVOID ApiSetMap;\n\tULONG TlsExpansionCounter;\n\t/*PRTL_BITMAP*/ PVOID TlsBitmap;\n\tULONG TlsBitmapBits[2];\n\tPVOID ReadOnlySharedMemoryBase;\n\t/*PSILO_USER_SHARED_DATA*/ PVOID SharedData;\n\tPVOID* ReadOnlyStaticServerData;\n\tPVOID AnsiCodePageData;\n\tPVOID OemCodePageData;\n\tPVOID UnicodeCaseTableData;\n\tULONG NumberOfProcessors;\n\tunion {\n\t\tULONG NtGlobalFlag;\n\t\tstruct\n\t\t{\n\t\t\tULONG StopOnException : 1;\n\t\t\tULONG ShowLoaderSnaps : 1;\n\t\t\tULONG DebugInitialCommand : 1;\n\t\t\tULONG StopOnHungGUI : 1;\n\t\t\tULONG HeapEnableTailCheck : 1;\n\t\t\tULONG HeapEnableFreeCheck : 1;\n\t\t\tULONG HeapValidateParameters : 1;\n\t\t\tULONG HeapValidateAll : 1;\n\t\t\tULONG ApplicationVerifier : 1;\n\t\t\tULONG MonitorSilentProcessExit : 1;\n\t\t\tULONG PoolEnableTagging : 1;\n\t\t\tULONG HeapEnableTagging : 1;\n\t\t\tULONG UserStackTraceDb : 1;\n\t\t\tULONG KernelStackTraceDb : 1;\n\t\t\tULONG MaintainObjectTypeList : 1;\n\t\t\tULONG HeapEnableTagByDll : 1;\n\t\t\tULONG DisableStackExtension : 1;\n\t\t\tULONG EnableCsrDebug : 1;\n\t\t\tULONG EnableKDebugSymbolLoad : 1;\n\t\t\tULONG DisablePageKernelStacks : 1;\n\t\t\tULONG EnableSystemCritBreaks : 1;\n\t\t\tULONG HeapDisableCoalescing : 1;\n\t\t\tULONG EnableCloseExceptions : 1;\n\t\t\tULONG EnableExceptionLogging : 1;\n\t\t\tULONG EnableHandleTypeTagging : 1;\n\t\t\tULONG HeapPageAllocs : 1;\n\t\t\tULONG DebugInitialCommandEx : 1;\n\t\t\tULONG DisableDbgPrint : 1;\n\t\t\tULONG CritSecEventCreation : 1;\n\t\t\tULONG LdrTopDown : 1;\n\t\t\tULONG EnableHandleExceptions : 1;\n\t\t\tULONG DisableProtDlls : 1;\n\t\t} NtGlobalFlags;\n\t};\n\tLARGE_INTEGER CriticalSectionTimeout;\n\tSIZE_T HeapSegmentReserve;\n\tSIZE_T HeapSegmentCommit;\n\tSIZE_T HeapDeCommitTotalFreeThreshold;\n\tSIZE_T HeapDeCommitFreeBlockThreshold;\n\tULONG NumberOfHeaps;\n\tULONG MaximumNumberOfHeaps;\n\tPVOID* ProcessHeaps;\n\tPVOID GdiSharedHandleTable;\n\tPVOID ProcessStarterHelper;\n\tULONG GdiDCAttributeList;\n\tPRTL_CRITICAL_SECTION LoaderLock;\n\tULONG OSMajorVersion;\n\tULONG OSMinorVersion;\n\tUSHORT OSBuildNumber;\n\tUSHORT OSCSDVersion;\n\tULONG OSPlatformId;\n\tULONG ImageSubsystem;\n\tULONG ImageSubsystemMajorVersion;\n\tULONG ImageSubsystemMinorVersion;\n\tKAFFINITY ActiveProcessAffinityMask;\n} _PEB, *_PPEB;\n\nstruct ModuleExportLookupData\n{\n\tconst char* moduleName;\n\tsize_t moduleNameLength;\n\tconst char** functionNames;\n\tvoid*** functionTargets;\n\tsize_t functionsLeft;\n};\n\n#if defined(_M_X64)\n#define VOLATILE_X64 volatile\n#else\n#define VOLATILE_X64\n#endif\n\n__declspec(dllexport) void* __stdcall InjectShellcode(void* pParameter, DWORD_PTR apcArgument2, DWORD_PTR apcArgument3)\n{\n\tconst DllInject::LOAD_LIBRARY_REMOTE_DATA* pInjData = (const DllInject::LOAD_LIBRARY_REMOTE_DATA*)pParameter;\n\n\tbool threadCreatedFromAPC = false;\n\tbool runningFromAPC = false;\n\tif ((DWORD_PTR)pInjData & 1)\n\t{\n\t\tpInjData = (const DllInject::LOAD_LIBRARY_REMOTE_DATA*)((DWORD_PTR)pInjData & ~1);\n\t\tthreadCreatedFromAPC = true;\n\t}\n\telse\n\t{\n\t\trunningFromAPC = pInjData->bRunningFromAPC;\n\t}\n\n\t// Get the Process Environment Block.\n\t// https://github.com/sandboxie-plus/Sandboxie/blob/dbf7ae81cfc50db3598085472e5f143b7653e4a8/Sandboxie/common/my_xeb.h#L433\n#if defined(_M_X64)\n\t_PPEB peb = (_PPEB)__readgsqword(0x60);\n#elif defined(_M_IX86)\n\t_PPEB peb = (_PPEB)__readfsdword(0x30);\n#elif defined(_M_ARM64)\n\t_PPEB peb = *(_PPEB*)(__getReg(18) + 0x60); // TEB in x18\n#else\n#error \"This architecture is currently unsupported\"\n#endif\n\n\t// If there's no loader data, we can't do much.\n\tif (!peb->Ldr)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t////////////////////////////////////////////////////////////////////////////////\n\t// KERNEL32.DLL\n\tconst char szKernel32Dll[] = {'K', 'E', 'R', 'N', 'E', 'L', '3', '2', '.', 'D', 'L', 'L'};\n\n\t// Add volatile to long strings to prevent the compiler from using XMM registers and storing their values in the\n\t// data section.\n\tconst char szLoadLibraryW[] = {'L', 'o', 'a', 'd', 'L', 'i', 'b', 'r', 'a', 'r', 'y', 'W', '\\0'};\n\tconst char szGetProcAddress[] = {'G', 'e', 't', 'P', 'r', 'o', 'c', 'A', 'd', 'd', 'r', 'e', 's', 's', '\\0'};\n\tconst char szFreeLibrary[] = {'F', 'r', 'e', 'e', 'L', 'i', 'b', 'r', 'a', 'r', 'y', '\\0'};\n\tconst char szVirtualFree[] = {'V', 'i', 'r', 't', 'u', 'a', 'l', 'F', 'r', 'e', 'e', '\\0'};\n\tconst char szGetLastError[] = {'G', 'e', 't', 'L', 'a', 's', 't', 'E', 'r', 'r', 'o', 'r', '\\0'};\n\tVOLATILE_X64\n\tconst char szOutputDebugStringA[] = {'O', 'u', 't', 'p', 'u', 't', 'D', 'e', 'b', 'u',\n\t\t\t\t\t\t\t\t\t\t 'g', 'S', 't', 'r', 'i', 'n', 'g', 'A', '\\0'};\n\tconst char szCloseHandle[] = {'C', 'l', 'o', 's', 'e', 'H', 'a', 'n', 'd', 'l', 'e', '\\0'};\n\tVOLATILE_X64\n\tconst char szSetThreadErrorMode[] = {'S', 'e', 't', 'T', 'h', 'r', 'e', 'a', 'd', 'E',\n\t\t\t\t\t\t\t\t\t\t 'r', 'r', 'o', 'r', 'M', 'o', 'd', 'e', '\\0'};\n\tconst char szCreateThread[] = {'C', 'r', 'e', 'a', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', '\\0'};\n\n\tconst char* kernel32FunctionNames[] = {\n\t\tszLoadLibraryW, szGetProcAddress,\n\t\tszFreeLibrary,  szVirtualFree,\n\t\tszGetLastError, (const char*)szOutputDebugStringA,\n\t\tszCloseHandle,  (const char*)szSetThreadErrorMode,\n\t\tszCreateThread,\n\t};\n\n\tdecltype(&LoadLibraryW) pLoadLibraryW = nullptr;\n\tdecltype(&GetProcAddress) pGetProcAddress = nullptr;\n\tdecltype(&FreeLibrary) pFreeLibrary = nullptr;\n\tdecltype(&VirtualFree) pVirtualFree = nullptr;\n\tdecltype(&GetLastError) pGetLastError = nullptr;\n\tdecltype(&OutputDebugStringA) pOutputDebugStringA = nullptr;\n\tdecltype(&CloseHandle) pCloseHandle = nullptr;\n\tdecltype(&SetThreadErrorMode) pSetThreadErrorMode = nullptr;\n\tdecltype(&CreateThread) pCreateThread = nullptr;\n\n\tvoid** kernel32FunctionTargets[] = {\n\t\t(void**)&pLoadLibraryW, (void**)&pGetProcAddress,     (void**)&pFreeLibrary,\n\t\t(void**)&pVirtualFree,  (void**)&pGetLastError,       (void**)&pOutputDebugStringA,\n\t\t(void**)&pCloseHandle,  (void**)&pSetThreadErrorMode, (void**)&pCreateThread,\n\t};\n\n\tstatic_assert(std::size(kernel32FunctionNames) == std::size(kernel32FunctionTargets));\n\n\t////////////////////////////////////////////////////////////////////////////////\n\t// Lookup data\n\tModuleExportLookupData lookupData[3] = {\n\t\t{\n\t\t\tszKernel32Dll,\n\t\t\tstd::size(szKernel32Dll),\n\t\t\tkernel32FunctionNames,\n\t\t\tkernel32FunctionTargets,\n\t\t\tstd::size(kernel32FunctionNames),\n\t\t},\n\t};\n\n\t////////////////////////////////////////////////////////////////////////////////\n\t// NTDLL.DLL\n\tconst char szNtdll[] = {'N', 'T', 'D', 'L', 'L', '.', 'D', 'L', 'L'};\n\n\tVOLATILE_X64\n\tconst char szNtQueueApcThread[] = {'N', 't', 'Q', 'u', 'e', 'u', 'e', 'A', 'p',\n\t\t\t\t\t\t\t\t\t   'c', 'T', 'h', 'r', 'e', 'a', 'd', '\\0'};\n\tconst char szNtAlertThread[] = {'N', 't', 'A', 'l', 'e', 'r', 't', 'T', 'h', 'r', 'e', 'a', 'd', '\\0'};\n\n\tconst char* ntdllFunctionNames[] = {\n\t\t(const char*)szNtQueueApcThread,\n\t\tszNtAlertThread,\n\t};\n\n\tNTSTATUS(NTAPI * pNtQueueApcThread)(HANDLE, PVOID, PVOID, PVOID, PVOID) = nullptr;\n\tNTSTATUS(NTAPI * pNtAlertThread)(HANDLE) = nullptr;\n\n\tvoid** ntdllFunctionTargets[] = {\n\t\t(void**)&pNtQueueApcThread,\n\t\t(void**)&pNtAlertThread,\n\t};\n\n\tstatic_assert(std::size(ntdllFunctionNames) == std::size(ntdllFunctionTargets));\n\n\t// The ntdll functions are only needed for APC re-queueing.\n\tif (runningFromAPC && peb->ProcessInitializing)\n\t{\n\t\tlookupData[1] = {\n\t\t\tszNtdll, std::size(szNtdll), ntdllFunctionNames, ntdllFunctionTargets, std::size(ntdllFunctionNames),\n\t\t};\n\t}\n\n\t// Process the kernels exports for the functions our loader needs.\n\n\tbool foundAll = false;\n\n\t// Get the first entry of the module list.\n\tPLIST_ENTRY pleInLoadHead = &peb->Ldr->InLoadOrderModuleList;\n\tPLIST_ENTRY pleInLoadIter = pleInLoadHead->Flink;\n\twhile (pleInLoadIter != pleInLoadHead)\n\t{\n\t\tPLIST_ENTRY pleInLoadCurrent = pleInLoadIter;\n\n\t\t// Get the next entry.\n\t\tpleInLoadIter = pleInLoadIter->Flink;\n\n\t\tPCWSTR BaseDllNameBuffer = ((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->BaseDllName.pBuffer;\n\t\tUSHORT BaseDllNameLength = ((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->BaseDllName.Length / sizeof(WCHAR);\n\t\tModuleExportLookupData* lookupItem = nullptr;\n\n\t\tfor (size_t mod = 0; lookupData[mod].moduleName; mod++)\n\t\t{\n\t\t\tauto& item = lookupData[mod];\n\n\t\t\tif (item.functionsLeft == 0)\n\t\t\t\tcontinue;\n\n\t\t\tif (BaseDllNameLength != item.moduleNameLength)\n\t\t\t\tcontinue;\n\n\t\t\tUSHORT i;\n\t\t\tfor (i = 0; i < BaseDllNameLength; i++)\n\t\t\t{\n\t\t\t\tWCHAR c = BaseDllNameBuffer[i];\n\t\t\t\tif (c >= 'a' && c <= 'z')\n\t\t\t\t\tc -= 'a' - 'A';\n\n\t\t\t\tif (c != item.moduleName[i])\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (i == BaseDllNameLength)\n\t\t\t{\n\t\t\t\tlookupItem = &item;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!lookupItem)\n\t\t\tcontinue;\n\n\t\t// Variables for processing the kernel's export table.\n\t\tULONG_PTR uiBaseAddress;\n\t\tULONG_PTR uiAddressArray;\n\t\tULONG_PTR uiNameArray;\n\t\tULONG_PTR uiExportDir;\n\t\tULONG_PTR uiNameOrdinals;\n\t\tDWORD dwNumberOfNames;\n\n\t\t// Get this modules base address.\n\t\tuiBaseAddress = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->DllBase;\n\n\t\t// Get the VA of the modules NT Header.\n\t\tuiExportDir = uiBaseAddress + ((PIMAGE_DOS_HEADER)uiBaseAddress)->e_lfanew;\n\n\t\t// uiNameArray = the address of the modules export directory entry.\n\t\tuiNameArray =\n\t\t\t(ULONG_PTR) & ((PIMAGE_NT_HEADERS)uiExportDir)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];\n\n\t\t// Get the VA of the export directory.\n\t\tuiExportDir = (uiBaseAddress + ((PIMAGE_DATA_DIRECTORY)uiNameArray)->VirtualAddress);\n\n\t\t// Get the VA for the array of name pointers.\n\t\tuiNameArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNames);\n\n\t\t// Get the VA for the array of name ordinals.\n\t\tuiNameOrdinals = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNameOrdinals);\n\n\t\t// Get the total number of named exports.\n\t\tdwNumberOfNames = ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->NumberOfNames;\n\n\t\t// Loop while we still have imports to find.\n\t\twhile (lookupItem->functionsLeft > 0 && dwNumberOfNames > 0)\n\t\t{\n\t\t\tPCSTR pFunctionName = (PCSTR)(uiBaseAddress + DEREF_32(uiNameArray));\n\t\t\tvoid** pTargetAddress = nullptr;\n\n\t\t\tfor (size_t i = 0; i < lookupItem->functionsLeft; i++)\n\t\t\t{\n\t\t\t\tbool matched = false;\n\t\t\t\tconst char* lookupFunctionName = lookupItem->functionNames[i];\n\t\t\t\tfor (size_t j = 0; lookupFunctionName[j] == pFunctionName[j]; j++)\n\t\t\t\t{\n\t\t\t\t\tif (lookupFunctionName[j] == '\\0')\n\t\t\t\t\t{\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matched)\n\t\t\t\t{\n\t\t\t\t\tpTargetAddress = lookupItem->functionTargets[i];\n\n\t\t\t\t\t// Compact the arrays if needed.\n\t\t\t\t\tif (i < lookupItem->functionsLeft - 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tlookupItem->functionNames[i] = lookupItem->functionNames[lookupItem->functionsLeft - 1];\n\t\t\t\t\t\tlookupItem->functionTargets[i] = lookupItem->functionTargets[lookupItem->functionsLeft - 1];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Decrement the counter.\n\t\t\t\t\tlookupItem->functionsLeft--;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we have found a function we want, retrieve its virtual address.\n\t\t\tif (pTargetAddress)\n\t\t\t{\n\t\t\t\t// Get the VA for the array of addresses.\n\t\t\t\tuiAddressArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfFunctions);\n\n\t\t\t\t// Use this function's name ordinal as an index into the array of name pointers.\n\t\t\t\tuiAddressArray += (DEREF_16(uiNameOrdinals) * sizeof(DWORD));\n\n\t\t\t\t// Store this function's VA.\n\t\t\t\t*pTargetAddress = (void*)(uiBaseAddress + DEREF_32(uiAddressArray));\n\t\t\t}\n\n\t\t\t// Move to the next exported function name in the array.\n\t\t\tuiNameArray += sizeof(DWORD);\n\n\t\t\t// Move to the next exported function name ordinal in the array.\n\t\t\tuiNameOrdinals += sizeof(WORD);\n\n\t\t\t// Decrement the counter for the number of names left to process.\n\t\t\tdwNumberOfNames--;\n\t\t}\n\n\t\t// Stop searching when we have found all the required functions.\n\t\tfoundAll = true;\n\n\t\tfor (size_t mod = 0; lookupData[mod].moduleName; mod++)\n\t\t{\n\t\t\tconst auto& item = lookupData[mod];\n\t\t\tif (item.functionsLeft > 0)\n\t\t\t{\n\t\t\t\tfoundAll = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (foundAll)\n\t\t\tbreak;\n\t}\n\n#ifdef MESSAGE_BOX_TEST\n\tHMODULE hUser32 = pLoadLibraryW(L\"user32.dll\");\n\tdecltype(&MessageBoxA) pMessageBoxW = (decltype(&MessageBoxA))pGetProcAddress(hUser32, \"MessageBoxA\");\n\tconst char szMessage[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\\0'};\n\tMessageBoxA(nullptr, szMessage, szMessage, MB_OK);\n\treturn nullptr;\n#endif\n\n\tINT32 nLogVerbosity = pInjData->nLogVerbosity;\n\n\t// If we are running from an APC and the process is not yet initialized, retry\n\t// by re-queueing the APC and exiting. Reference:\n\t// https://x.com/sixtyvividtails/status/1910374252307534071\n\tif (runningFromAPC && peb->ProcessInitializing)\n\t{\n\t\tDWORD apcRunCount = (DWORD)apcArgument2 + 1;\n\n\t\tif (pOutputDebugStringA && nLogVerbosity >= 2)\n\t\t{\n\t\t\tconst char c = (char)apcRunCount - 1 + 'A';\n\t\t\tchar szApcRetryMessage[] = {'[', 'W', 'H', ']', ' ', 'A', 'P', 'C', ' ', 'R', 'E', ' ', c, '\\n', '\\0'};\n\t\t\tpOutputDebugStringA(szApcRetryMessage);\n\t\t}\n\n\t\tenum class ApcRequeueError : char\n\t\t{\n\t\t\tkNone = 0,\n\t\t\tkNoImports = '1',\n\t\t\tkNtQueueApcThread = '2',\n\t\t\tkNtAlertThread = '3',\n\t\t\tkCreateThread = '4',\n\t\t};\n\n\t\tbool queued = false;\n\t\tApcRequeueError error = ApcRequeueError::kNone;\n\t\tif (apcRunCount >= 10)\n\t\t{\n\t\t\t// Limit the amount of attempts do avoid an infinite loop.\n\t\t\t// https://x.com/m417z/status/1923449532920025390\n\t\t\t// As a fallback, create as a new thread.\n\t\t\tif (pCreateThread && pCloseHandle)\n\t\t\t{\n\t\t\t\tHANDLE hThread = pCreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)pInjData->pThreadShellcodeAddress,\n\t\t\t\t\t\t\t\t\t\t\t   (void*)((DWORD_PTR)pInjData | 1), 0, nullptr);\n\t\t\t\tif (hThread)\n\t\t\t\t{\n\t\t\t\t\tpCloseHandle(hThread);\n\t\t\t\t\tqueued = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\terror = ApcRequeueError::kCreateThread;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\terror = ApcRequeueError::kNoImports;\n\t\t\t}\n\t\t}\n\t\telse if (pNtQueueApcThread && pNtAlertThread)\n\t\t{\n\t\t\tHANDLE hCurrentThread = (HANDLE)(LONG_PTR)-2;\n\t\t\tif (SUCCEEDED(pNtQueueApcThread(hCurrentThread, pInjData->pAPCShellcodeAddress, (void*)pInjData,\n\t\t\t\t\t\t\t\t\t\t\t(PVOID)(DWORD_PTR)apcRunCount, nullptr)))\n\t\t\t{\n\t\t\t\tqueued = true;\n\t\t\t\tif (FAILED(pNtAlertThread(hCurrentThread)))\n\t\t\t\t{\n\t\t\t\t\terror = ApcRequeueError::kNtAlertThread;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\terror = ApcRequeueError::kNtQueueApcThread;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\terror = ApcRequeueError::kNoImports;\n\t\t}\n\n\t\tif (error != ApcRequeueError::kNone && pOutputDebugStringA && nLogVerbosity >= 1)\n\t\t{\n\t\t\tconst char c = (char)error;\n\t\t\tchar szApcErrorMessage[] = {'[', 'W', 'H', ']', ' ', 'A', 'P', 'C', ' ', 'E', 'R', 'R', c, '\\n', '\\0'};\n\t\t\tpOutputDebugStringA(szApcErrorMessage);\n\t\t}\n\n\t\treturn queued ? nullptr : pVirtualFree;\n\t}\n\n\tif (!foundAll)\n\t{\n\t\t// If possible, at least log the error.\n\t\tif (pOutputDebugStringA && nLogVerbosity >= 1)\n\t\t{\n\t\t\tchar szExportResolutionErrorMessage[] = {'[', 'W', 'H', ']', ' ', 'E', 'X', 'P', '\\n', '\\0'};\n\t\t\tpOutputDebugStringA(szExportResolutionErrorMessage);\n\t\t}\n\n\t\t// If we are running from an APC-created thread and the process is not yet initialized,\n\t\t// don't free the shellcode as it might be still executing in the APC.\n\t\treturn (threadCreatedFromAPC && peb->ProcessInitializing) ? nullptr : pVirtualFree;\n\t}\n\n\tHMODULE hModule;\n\tconst char szInjectInit[] = {'I', 'n', 'j', 'e', 'c', 't', 'I', 'n', 'i', 't', '\\0'};\n\tvoid* pInjectInit;\n\tBOOL bInitAttempted = FALSE;\n\tBOOL bInitSucceeded = FALSE;\n\tDWORD dwLastErrorValue = 0;\n\tDWORD dwOldMode;\n\n\t// Prevent the system from displaying the critical-error-handler message box.\n\t// A message box like this was appearing while trying to load a dll in a\n\t// process with the ProcessSignaturePolicy mitigation, and it looked like this:\n\t// https://stackoverflow.com/q/38367847\n\tpSetThreadErrorMode(SEM_FAILCRITICALERRORS, &dwOldMode);\n\n\tif (nLogVerbosity >= 2)\n\t{\n\t\tchar szLoadLibraryMessage[] = {'[', 'W', 'H', ']', ' ', 'L', 'L', '\\n', '\\0'};\n\t\tpOutputDebugStringA(szLoadLibraryMessage);\n\t}\n\n\thModule = pLoadLibraryW(pInjData->szDllName);\n\tif (hModule)\n\t{\n\t\tif (nLogVerbosity >= 2)\n\t\t{\n\t\t\tchar szGetProcAddressMessage[] = {'[', 'W', 'H', ']', ' ', 'G', 'P', 'A', '\\n', '\\0'};\n\t\t\tpOutputDebugStringA(szGetProcAddressMessage);\n\t\t}\n\n\t\tpInjectInit = pGetProcAddress(hModule, szInjectInit);\n\t\tif (pInjectInit)\n\t\t{\n\t\t\tif (nLogVerbosity >= 2)\n\t\t\t{\n\t\t\t\tchar szInjectInitMessage[] = {'[', 'W', 'H', ']', ' ', 'I', 'I', '\\n', '\\0'};\n\t\t\t\tpOutputDebugStringA(szInjectInitMessage);\n\t\t\t}\n\n\t\t\tbInitAttempted = TRUE;\n\t\t\tbInitSucceeded = ((BOOL(*)(const DllInject::LOAD_LIBRARY_REMOTE_DATA*))pInjectInit)(pInjData);\n\n\t\t\tif (nLogVerbosity >= 2)\n\t\t\t{\n\t\t\t\tchar szInjectInitResultMessage[] = {\n\t\t\t\t\t'[', 'W', 'H', ']', ' ', 'I', 'I', ':', ' ', bInitSucceeded ? '1' : '0', '\\n', '\\0'};\n\t\t\t\tpOutputDebugStringA(szInjectInitResultMessage);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdwLastErrorValue = pGetLastError();\n\t\t}\n\n\t\tpFreeLibrary(hModule);\n\t}\n\telse\n\t{\n\t\tdwLastErrorValue = pGetLastError();\n\t}\n\n\tif (!bInitSucceeded)\n\t{\n\t\tif (pInjData->hSessionMutex)\n\t\t{\n\t\t\tpCloseHandle(pInjData->hSessionMutex);\n\t\t}\n\n\t\tpCloseHandle(pInjData->hSessionManagerProcess);\n\n\t\tif (!bInitAttempted && nLogVerbosity >= 1)\n\t\t{\n\t\t\tchar szLastErrorMessage[] = {'[', 'W', 'H', ']', ' ', 'E', 'R', 'R', ':',  ' ',\n\t\t\t\t\t\t\t\t\t\t '1', '1', '1', '1', '1', '1', '1', '1', '\\n', '\\0'};\n\t\t\tchar* pHex = szLastErrorMessage + sizeof(szLastErrorMessage) - 2;\n\n\t\t\tfor (int i = 0; i < 8; i++)\n\t\t\t{\n\t\t\t\tint digit = dwLastErrorValue & 0x0F;\n\t\t\t\tchar letter;\n\t\t\t\tif (digit < 0x0A)\n\t\t\t\t{\n\t\t\t\t\tletter = digit + '0';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tletter = digit - 0x0A + 'A';\n\t\t\t\t}\n\n\t\t\t\tpHex--;\n\t\t\t\t*pHex = letter;\n\n\t\t\t\tdwLastErrorValue >>= 4;\n\t\t\t}\n\n\t\t\tpOutputDebugStringA(szLastErrorMessage);\n\t\t}\n\t}\n\n\tpSetThreadErrorMode(dwOldMode, nullptr);\n\n\t// If we are running from an APC-created thread and the process is not yet initialized,\n\t// don't free the shellcode as it might be still executing in the APC.\n\treturn (threadCreatedFromAPC && peb->ProcessInitializing) ? nullptr : pVirtualFree;\n}\n\n// Helpers for creating PRE_ARM64SHELLCODE_VIRTUAL_FREE.\n#if 0\nusing VirtualFree_t = decltype(&VirtualFree);\n\n__declspec(dllexport) __declspec(noinline) VirtualFree_t GetVirtualFree();\n\n__declspec(dllexport) __declspec(noinline) void func1()\n{\n\tVirtualFree_t pVirtualFree = GetVirtualFree();\n\tif (pVirtualFree)\n\t{\n\t\tpVirtualFree(func1, 0, MEM_RELEASE);\n\t}\n}\n\n__declspec(dllexport) __declspec(noinline) VirtualFree_t GetVirtualFree()\n{\n\treturn VirtualFree;\n}\n#endif\n\nint CALLBACK wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine,\n\t\t\t\t\t  _In_ int nCmdShow)\n{\n\tDllInject::LOAD_LIBRARY_REMOTE_DATA injData{};\n\tInjectShellcode(&injData, 0, 0);\n\treturn 0;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/include/MinHook.h",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__)\n    #error MinHook supports only x86 and x64 systems.\n#endif\n\n#include <windows.h>\n\n// MinHook Error Codes.\ntypedef enum MH_STATUS\n{\n    // Unknown error. Should not be returned.\n    MH_UNKNOWN = -1,\n\n    // Successful.\n    MH_OK = 0,\n\n    // MinHook is already initialized.\n    MH_ERROR_ALREADY_INITIALIZED,\n\n    // MinHook is not initialized yet, or already uninitialized.\n    MH_ERROR_NOT_INITIALIZED,\n\n    // The hook for the specified target function is already created.\n    MH_ERROR_ALREADY_CREATED,\n\n    // The hook for the specified target function is not created yet.\n    MH_ERROR_NOT_CREATED,\n\n    // The hook for the specified target function is already enabled.\n    MH_ERROR_ENABLED,\n\n    // The hook for the specified target function is not enabled yet, or already\n    // disabled.\n    MH_ERROR_DISABLED,\n\n    // The specified pointer is invalid. It points the address of non-allocated\n    // and/or non-executable region.\n    MH_ERROR_NOT_EXECUTABLE,\n\n    // The specified target function cannot be hooked.\n    MH_ERROR_UNSUPPORTED_FUNCTION,\n\n    // Failed to allocate memory.\n    MH_ERROR_MEMORY_ALLOC,\n\n    // Failed to change the memory protection.\n    MH_ERROR_MEMORY_PROTECT,\n\n    // The specified module is not loaded.\n    MH_ERROR_MODULE_NOT_FOUND,\n\n    // The specified function is not found.\n    MH_ERROR_FUNCTION_NOT_FOUND,\n\n    // Failed to create, or to wait for the main mutex.\n    MH_ERROR_MUTEX_FAILURE\n} MH_STATUS;\n\n// The method of suspending and resuming threads.\n//\n// It's possible to add an additional method using PssCaptureSnapshot.\n// Pros: Documented, fast.\n// Cons: Available from Windows 8.1, less reliable.\ntypedef enum MH_THREAD_FREEZE_METHOD\n{\n    // The original MinHook method, using CreateToolhelp32Snapshot. Documented\n    // and supported on all Windows versions, but very slow and less reliable.\n    MH_FREEZE_METHOD_ORIGINAL = 0,\n\n    // A much faster and more reliable, but undocumented method, using\n    // NtGetNextThread. Supported since Windows Vista, on older versions falls\n    // back to MH_ORIGINAL.\n    MH_FREEZE_METHOD_FAST_UNDOCUMENTED,\n\n    // Threads are not suspended and instruction pointer registers are not\n    // adjusted. Don't use this method unless you understand the implications\n    // and know that it's safe.\n    MH_FREEZE_METHOD_NONE_UNSAFE\n} MH_THREAD_FREEZE_METHOD;\n\n// Can be passed as a parameter to MH_EnableHook, MH_DisableHook,\n// MH_QueueEnableHook or MH_QueueDisableHook.\n#define MH_ALL_HOOKS NULL\n\n#define MH_ALL_IDENTS 0\n#define MH_DEFAULT_IDENT 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    // Initialize the MinHook library. You must call this function EXACTLY ONCE\n    // at the beginning of your program.\n    MH_STATUS WINAPI MH_Initialize(VOID);\n\n    // Uninitialize the MinHook library. You must call this function EXACTLY\n    // ONCE at the end of your program.\n    MH_STATUS WINAPI MH_Uninitialize(VOID);\n\n    // Set the method of suspending and resuming threads.\n    MH_STATUS WINAPI MH_SetThreadFreezeMethod(MH_THREAD_FREEZE_METHOD method);\n\n    // Creates a hook for the specified target function, in disabled state.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);\n    MH_STATUS WINAPI MH_CreateHookEx(ULONG_PTR hookIdent, LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHookApi(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    //   ppTarget    [out] A pointer to the target function, which will be used\n    //                     with other functions.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHookApiEx(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);\n\n    // Removes an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     removed in one go.\n    MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_RemoveHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Removes all disabled hooks.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    MH_STATUS WINAPI MH_RemoveDisabledHooks();\n    MH_STATUS WINAPI MH_RemoveDisabledHooksEx(ULONG_PTR hookIdent);\n\n    // Enables an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     enabled in one go.\n    MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_EnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Disables an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     disabled in one go.\n    MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_DisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Queues to enable an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     queued to be enabled.\n    MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_QueueEnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Queues to disable an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     queued to be disabled.\n    MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_QueueDisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Applies all queued changes in one go.\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    MH_STATUS WINAPI MH_ApplyQueued(VOID);\n    MH_STATUS WINAPI MH_ApplyQueuedEx(ULONG_PTR hookIdent);\n\n    // Translates the MH_STATUS to its name as a string.\n    const char * WINAPI MH_StatusToString(MH_STATUS status);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/buffer.c",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <windows.h>\n#include \"buffer.h\"\n\n// Size of each memory block. (= page size of VirtualAlloc)\n#define MEMORY_BLOCK_SIZE 0x1000\n\n// Max range for seeking a memory block. (= 1024MB)\n#define MAX_MEMORY_RANGE 0x40000000\n\n// Memory protection flags to check the executable address.\n#define PAGE_EXECUTE_FLAGS \\\n    (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)\n\n// Memory slot.\ntypedef struct _MEMORY_SLOT\n{\n    union\n    {\n        struct _MEMORY_SLOT *pNext;\n        UINT8 buffer[MEMORY_SLOT_SIZE];\n    };\n} MEMORY_SLOT, *PMEMORY_SLOT;\n\n// Memory block info. Placed at the head of each block.\ntypedef struct _MEMORY_BLOCK\n{\n    struct _MEMORY_BLOCK *pNext;\n    PMEMORY_SLOT pFree;         // First element of the free slot list.\n    UINT usedCount;\n} MEMORY_BLOCK, *PMEMORY_BLOCK;\n\n//-------------------------------------------------------------------------\n// Global Variables:\n//-------------------------------------------------------------------------\n\n// First element of the memory block list.\nstatic PMEMORY_BLOCK g_pMemoryBlocks;\n\n//-------------------------------------------------------------------------\nVOID InitializeBuffer(VOID)\n{\n    // Nothing to do for now.\n}\n\n//-------------------------------------------------------------------------\nVOID UninitializeBuffer(VOID)\n{\n    PMEMORY_BLOCK pBlock = g_pMemoryBlocks;\n    g_pMemoryBlocks = NULL;\n\n    while (pBlock)\n    {\n        PMEMORY_BLOCK pNext = pBlock->pNext;\n        VirtualFree(pBlock, 0, MEM_RELEASE);\n        pBlock = pNext;\n    }\n}\n\n//-------------------------------------------------------------------------\n#if defined(_M_X64) || defined(__x86_64__)\nstatic LPVOID FindPrevFreeRegion(LPVOID pAddress, LPVOID pMinAddr, DWORD dwAllocationGranularity)\n{\n    ULONG_PTR tryAddr = (ULONG_PTR)pAddress;\n\n    // Round down to the allocation granularity.\n    tryAddr -= tryAddr % dwAllocationGranularity;\n\n    // Start from the previous allocation granularity multiply.\n    tryAddr -= dwAllocationGranularity;\n\n    while (tryAddr >= (ULONG_PTR)pMinAddr)\n    {\n        MEMORY_BASIC_INFORMATION mbi;\n        if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0)\n            break;\n\n        if (mbi.State == MEM_FREE)\n            return (LPVOID)tryAddr;\n\n        if ((ULONG_PTR)mbi.AllocationBase < dwAllocationGranularity)\n            break;\n\n        tryAddr = (ULONG_PTR)mbi.AllocationBase - dwAllocationGranularity;\n    }\n\n    return NULL;\n}\n#endif\n\n//-------------------------------------------------------------------------\n#if defined(_M_X64) || defined(__x86_64__)\nstatic LPVOID FindNextFreeRegion(LPVOID pAddress, LPVOID pMaxAddr, DWORD dwAllocationGranularity)\n{\n    ULONG_PTR tryAddr = (ULONG_PTR)pAddress;\n\n    // Round down to the allocation granularity.\n    tryAddr -= tryAddr % dwAllocationGranularity;\n\n    // Start from the next allocation granularity multiply.\n    tryAddr += dwAllocationGranularity;\n\n    while (tryAddr <= (ULONG_PTR)pMaxAddr)\n    {\n        MEMORY_BASIC_INFORMATION mbi;\n        if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0)\n            break;\n\n        if (mbi.State == MEM_FREE)\n            return (LPVOID)tryAddr;\n\n        tryAddr = (ULONG_PTR)mbi.BaseAddress + mbi.RegionSize;\n\n        // Round up to the next allocation granularity.\n        tryAddr += dwAllocationGranularity - 1;\n        tryAddr -= tryAddr % dwAllocationGranularity;\n    }\n\n    return NULL;\n}\n#endif\n\n//-------------------------------------------------------------------------\nstatic PMEMORY_BLOCK GetMemoryBlock(LPVOID pOrigin)\n{\n    PMEMORY_BLOCK pBlock;\n#if defined(_M_X64) || defined(__x86_64__)\n    ULONG_PTR minAddr;\n    ULONG_PTR maxAddr;\n\n    SYSTEM_INFO si;\n    GetSystemInfo(&si);\n    minAddr = (ULONG_PTR)si.lpMinimumApplicationAddress;\n    maxAddr = (ULONG_PTR)si.lpMaximumApplicationAddress;\n\n    // pOrigin ± 512MB\n    if ((ULONG_PTR)pOrigin > MAX_MEMORY_RANGE && minAddr < (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE)\n        minAddr = (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE;\n\n    if (maxAddr > (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE)\n        maxAddr = (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE;\n\n    // Make room for MEMORY_BLOCK_SIZE bytes.\n    maxAddr -= MEMORY_BLOCK_SIZE - 1;\n#endif\n\n    // Look the registered blocks for a reachable one.\n    for (pBlock = g_pMemoryBlocks; pBlock != NULL; pBlock = pBlock->pNext)\n    {\n#if defined(_M_X64) || defined(__x86_64__)\n        // Ignore the blocks too far.\n        if ((ULONG_PTR)pBlock < minAddr || (ULONG_PTR)pBlock >= maxAddr)\n            continue;\n#endif\n        // The block has at least one unused slot.\n        if (pBlock->pFree != NULL)\n            return pBlock;\n    }\n\n#if defined(_M_X64) || defined(__x86_64__)\n    // Alloc a new block above if not found.\n    {\n        LPVOID pAlloc = pOrigin;\n        while ((ULONG_PTR)pAlloc >= minAddr)\n        {\n            pAlloc = FindPrevFreeRegion(pAlloc, (LPVOID)minAddr, si.dwAllocationGranularity);\n            if (pAlloc == NULL)\n                break;\n\n            pBlock = (PMEMORY_BLOCK)VirtualAlloc(\n                pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n            if (pBlock != NULL)\n                break;\n        }\n    }\n\n    // Alloc a new block below if not found.\n    if (pBlock == NULL)\n    {\n        LPVOID pAlloc = pOrigin;\n        while ((ULONG_PTR)pAlloc <= maxAddr)\n        {\n            pAlloc = FindNextFreeRegion(pAlloc, (LPVOID)maxAddr, si.dwAllocationGranularity);\n            if (pAlloc == NULL)\n                break;\n\n            pBlock = (PMEMORY_BLOCK)VirtualAlloc(\n                pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n            if (pBlock != NULL)\n                break;\n        }\n    }\n#else\n    // In x86 mode, a memory block can be placed anywhere.\n    pBlock = (PMEMORY_BLOCK)VirtualAlloc(\n        NULL, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n#endif\n\n    if (pBlock != NULL)\n    {\n        // Build a linked list of all the slots.\n        PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBlock + 1;\n        pBlock->pFree = NULL;\n        pBlock->usedCount = 0;\n        do\n        {\n            pSlot->pNext = pBlock->pFree;\n            pBlock->pFree = pSlot;\n            pSlot++;\n        } while ((ULONG_PTR)pSlot - (ULONG_PTR)pBlock <= MEMORY_BLOCK_SIZE - MEMORY_SLOT_SIZE);\n\n        pBlock->pNext = g_pMemoryBlocks;\n        g_pMemoryBlocks = pBlock;\n    }\n\n    return pBlock;\n}\n\n//-------------------------------------------------------------------------\nLPVOID AllocateBuffer(LPVOID pOrigin)\n{\n    PMEMORY_SLOT  pSlot;\n    PMEMORY_BLOCK pBlock = GetMemoryBlock(pOrigin);\n    if (pBlock == NULL)\n        return NULL;\n\n    // Remove an unused slot from the list.\n    pSlot = pBlock->pFree;\n    pBlock->pFree = pSlot->pNext;\n    pBlock->usedCount++;\n#ifdef _DEBUG\n    // Fill the slot with INT3 for debugging.\n    memset(pSlot, 0xCC, sizeof(MEMORY_SLOT));\n#endif\n    return pSlot;\n}\n\n//-------------------------------------------------------------------------\nVOID FreeBuffer(LPVOID pBuffer)\n{\n    PMEMORY_BLOCK pBlock = g_pMemoryBlocks;\n    PMEMORY_BLOCK pPrev = NULL;\n    ULONG_PTR pTargetBlock = ((ULONG_PTR)pBuffer / MEMORY_BLOCK_SIZE) * MEMORY_BLOCK_SIZE;\n\n    while (pBlock != NULL)\n    {\n        if ((ULONG_PTR)pBlock == pTargetBlock)\n        {\n            PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBuffer;\n#ifdef _DEBUG\n            // Clear the released slot for debugging.\n            memset(pSlot, 0x00, sizeof(MEMORY_SLOT));\n#endif\n            // Restore the released slot to the list.\n            pSlot->pNext = pBlock->pFree;\n            pBlock->pFree = pSlot;\n            pBlock->usedCount--;\n\n            // Free if unused.\n            if (pBlock->usedCount == 0)\n            {\n                if (pPrev)\n                    pPrev->pNext = pBlock->pNext;\n                else\n                    g_pMemoryBlocks = pBlock->pNext;\n\n                VirtualFree(pBlock, 0, MEM_RELEASE);\n            }\n\n            break;\n        }\n\n        pPrev = pBlock;\n        pBlock = pBlock->pNext;\n    }\n}\n\n//-------------------------------------------------------------------------\nBOOL IsExecutableAddress(LPVOID pAddress)\n{\n    MEMORY_BASIC_INFORMATION mi;\n    VirtualQuery(pAddress, &mi, sizeof(mi));\n\n    return (mi.State == MEM_COMMIT && (mi.Protect & PAGE_EXECUTE_FLAGS));\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/buffer.h",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n// Size of each memory slot.\n#if defined(_M_X64) || defined(__x86_64__)\n    #define MEMORY_SLOT_SIZE 64\n#else\n    #define MEMORY_SLOT_SIZE 64\n#endif\n\nVOID   InitializeBuffer(VOID);\nVOID   UninitializeBuffer(VOID);\nLPVOID AllocateBuffer(LPVOID pOrigin);\nVOID   FreeBuffer(LPVOID pBuffer);\nBOOL   IsExecutableAddress(LPVOID pAddress);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/hde32.c",
    "content": "﻿/*\n * Hacker Disassembler Engine 32 C\n * Copyright (c) 2008-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n */\n\n#if defined(_M_IX86) || defined(__i386__)\n\n#include <string.h>\n#include \"hde32.h\"\n#include \"table32.h\"\n\nunsigned int hde32_disasm(const void *code, hde32s *hs)\n{\n    uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0;\n    uint8_t *ht = hde32_table, m_mod, m_reg, m_rm, disp_size = 0;\n\n    memset(hs, 0, sizeof(hde32s));\n\n    for (x = 16; x; x--)\n        switch (c = *p++) {\n            case 0xf3:\n                hs->p_rep = c;\n                pref |= PRE_F3;\n                break;\n            case 0xf2:\n                hs->p_rep = c;\n                pref |= PRE_F2;\n                break;\n            case 0xf0:\n                hs->p_lock = c;\n                pref |= PRE_LOCK;\n                break;\n            case 0x26: case 0x2e: case 0x36:\n            case 0x3e: case 0x64: case 0x65:\n                hs->p_seg = c;\n                pref |= PRE_SEG;\n                break;\n            case 0x66:\n                hs->p_66 = c;\n                pref |= PRE_66;\n                break;\n            case 0x67:\n                hs->p_67 = c;\n                pref |= PRE_67;\n                break;\n            default:\n                goto pref_done;\n        }\n  pref_done:\n\n    hs->flags = (uint32_t)pref << 23;\n\n    if (!pref)\n        pref |= PRE_NONE;\n\n    if ((hs->opcode = c) == 0x0f) {\n        hs->opcode2 = c = *p++;\n        ht += DELTA_OPCODES;\n    } else if (c >= 0xa0 && c <= 0xa3) {\n        if (pref & PRE_67)\n            pref |= PRE_66;\n        else\n            pref &= ~PRE_66;\n    }\n\n    opcode = c;\n    cflags = ht[ht[opcode / 4] + (opcode % 4)];\n\n    if (cflags == C_ERROR) {\n        hs->flags |= F_ERROR | F_ERROR_OPCODE;\n        cflags = 0;\n        if ((opcode & -3) == 0x24)\n            cflags++;\n    }\n\n    x = 0;\n    if (cflags & C_GROUP) {\n        uint16_t t;\n        t = *(uint16_t *)(ht + (cflags & 0x7f));\n        cflags = (uint8_t)t;\n        x = (uint8_t)(t >> 8);\n    }\n\n    if (hs->opcode2) {\n        ht = hde32_table + DELTA_PREFIXES;\n        if (ht[ht[opcode / 4] + (opcode % 4)] & pref)\n            hs->flags |= F_ERROR | F_ERROR_OPCODE;\n    }\n\n    if (cflags & C_MODRM) {\n        hs->flags |= F_MODRM;\n        hs->modrm = c = *p++;\n        hs->modrm_mod = m_mod = c >> 6;\n        hs->modrm_rm = m_rm = c & 7;\n        hs->modrm_reg = m_reg = (c & 0x3f) >> 3;\n\n        if (x && ((x << m_reg) & 0x80))\n            hs->flags |= F_ERROR | F_ERROR_OPCODE;\n\n        if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) {\n            uint8_t t = opcode - 0xd9;\n            if (m_mod == 3) {\n                ht = hde32_table + DELTA_FPU_MODRM + t*8;\n                t = ht[m_reg] << m_rm;\n            } else {\n                ht = hde32_table + DELTA_FPU_REG;\n                t = ht[t] << m_reg;\n            }\n            if (t & 0x80)\n                hs->flags |= F_ERROR | F_ERROR_OPCODE;\n        }\n\n        if (pref & PRE_LOCK) {\n            if (m_mod == 3) {\n                hs->flags |= F_ERROR | F_ERROR_LOCK;\n            } else {\n                uint8_t *table_end, op = opcode;\n                if (hs->opcode2) {\n                    ht = hde32_table + DELTA_OP2_LOCK_OK;\n                    table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK;\n                } else {\n                    ht = hde32_table + DELTA_OP_LOCK_OK;\n                    table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK;\n                    op &= -2;\n                }\n                for (; ht != table_end; ht++)\n                    if (*ht++ == op) {\n                        if (!((*ht << m_reg) & 0x80))\n                            goto no_lock_error;\n                        else\n                            break;\n                    }\n                hs->flags |= F_ERROR | F_ERROR_LOCK;\n              no_lock_error:\n                ;\n            }\n        }\n\n        if (hs->opcode2) {\n            switch (opcode) {\n                case 0x20: case 0x22:\n                    m_mod = 3;\n                    if (m_reg > 4 || m_reg == 1)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n                case 0x21: case 0x23:\n                    m_mod = 3;\n                    if (m_reg == 4 || m_reg == 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n            }\n        } else {\n            switch (opcode) {\n                case 0x8c:\n                    if (m_reg > 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n                case 0x8e:\n                    if (m_reg == 1 || m_reg > 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n            }\n        }\n\n        if (m_mod == 3) {\n            uint8_t *table_end;\n            if (hs->opcode2) {\n                ht = hde32_table + DELTA_OP2_ONLY_MEM;\n                table_end = ht + sizeof(hde32_table) - DELTA_OP2_ONLY_MEM;\n            } else {\n                ht = hde32_table + DELTA_OP_ONLY_MEM;\n                table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM;\n            }\n            for (; ht != table_end; ht += 2)\n                if (*ht++ == opcode) {\n                    if ((*ht++ & pref) && !((*ht << m_reg) & 0x80))\n                        goto error_operand;\n                    else\n                        break;\n                }\n            goto no_error_operand;\n        } else if (hs->opcode2) {\n            switch (opcode) {\n                case 0x50: case 0xd7: case 0xf7:\n                    if (pref & (PRE_NONE | PRE_66))\n                        goto error_operand;\n                    break;\n                case 0xd6:\n                    if (pref & (PRE_F2 | PRE_F3))\n                        goto error_operand;\n                    break;\n                case 0xc5:\n                    goto error_operand;\n            }\n            goto no_error_operand;\n        } else\n            goto no_error_operand;\n\n      error_operand:\n        hs->flags |= F_ERROR | F_ERROR_OPERAND;\n      no_error_operand:\n\n        c = *p++;\n        if (m_reg <= 1) {\n            if (opcode == 0xf6)\n                cflags |= C_IMM8;\n            else if (opcode == 0xf7)\n                cflags |= C_IMM_P66;\n        }\n\n        switch (m_mod) {\n            case 0:\n                if (pref & PRE_67) {\n                    if (m_rm == 6)\n                        disp_size = 2;\n                } else\n                    if (m_rm == 5)\n                        disp_size = 4;\n                break;\n            case 1:\n                disp_size = 1;\n                break;\n            case 2:\n                disp_size = 2;\n                if (!(pref & PRE_67))\n                    disp_size <<= 1;\n                break;\n        }\n\n        if (m_mod != 3 && m_rm == 4 && !(pref & PRE_67)) {\n            hs->flags |= F_SIB;\n            p++;\n            hs->sib = c;\n            hs->sib_scale = c >> 6;\n            hs->sib_index = (c & 0x3f) >> 3;\n            if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1))\n                disp_size = 4;\n        }\n\n        p--;\n        switch (disp_size) {\n            case 1:\n                hs->flags |= F_DISP8;\n                hs->disp.disp8 = *p;\n                break;\n            case 2:\n                hs->flags |= F_DISP16;\n                hs->disp.disp16 = *(uint16_t *)p;\n                break;\n            case 4:\n                hs->flags |= F_DISP32;\n                hs->disp.disp32 = *(uint32_t *)p;\n                break;\n        }\n        p += disp_size;\n    } else if (pref & PRE_LOCK)\n        hs->flags |= F_ERROR | F_ERROR_LOCK;\n\n    if (cflags & C_IMM_P66) {\n        if (cflags & C_REL32) {\n            if (pref & PRE_66) {\n                hs->flags |= F_IMM16 | F_RELATIVE;\n                hs->imm.imm16 = *(uint16_t *)p;\n                p += 2;\n                goto disasm_done;\n            }\n            goto rel32_ok;\n        }\n        if (pref & PRE_66) {\n            hs->flags |= F_IMM16;\n            hs->imm.imm16 = *(uint16_t *)p;\n            p += 2;\n        } else {\n            hs->flags |= F_IMM32;\n            hs->imm.imm32 = *(uint32_t *)p;\n            p += 4;\n        }\n    }\n\n    if (cflags & C_IMM16) {\n        if (hs->flags & F_IMM32) {\n            hs->flags |= F_IMM16;\n            hs->disp.disp16 = *(uint16_t *)p;\n        } else if (hs->flags & F_IMM16) {\n            hs->flags |= F_2IMM16;\n            hs->disp.disp16 = *(uint16_t *)p;\n        } else {\n            hs->flags |= F_IMM16;\n            hs->imm.imm16 = *(uint16_t *)p;\n        }\n        p += 2;\n    }\n    if (cflags & C_IMM8) {\n        hs->flags |= F_IMM8;\n        hs->imm.imm8 = *p++;\n    }\n\n    if (cflags & C_REL32) {\n      rel32_ok:\n        hs->flags |= F_IMM32 | F_RELATIVE;\n        hs->imm.imm32 = *(uint32_t *)p;\n        p += 4;\n    } else if (cflags & C_REL8) {\n        hs->flags |= F_IMM8 | F_RELATIVE;\n        hs->imm.imm8 = *p++;\n    }\n\n  disasm_done:\n\n    if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) {\n        hs->flags |= F_ERROR | F_ERROR_LENGTH;\n        hs->len = 15;\n    }\n\n    return (unsigned int)hs->len;\n}\n\n#endif // defined(_M_IX86) || defined(__i386__)\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/hde32.h",
    "content": "﻿/*\n * Hacker Disassembler Engine 32\n * Copyright (c) 2006-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n * hde32.h: C/C++ header file\n *\n */\n\n#ifndef _HDE32_H_\n#define _HDE32_H_\n\n/* stdint.h - C99 standard header\n * http://en.wikipedia.org/wiki/stdint.h\n *\n * if your compiler doesn't contain \"stdint.h\" header (for\n * example, Microsoft Visual C++), you can download file:\n *   http://www.azillionmonkeys.com/qed/pstdint.h\n * and change next line to:\n *   #include \"pstdint.h\"\n */\n#include \"pstdint.h\"\n\n#define F_MODRM         0x00000001\n#define F_SIB           0x00000002\n#define F_IMM8          0x00000004\n#define F_IMM16         0x00000008\n#define F_IMM32         0x00000010\n#define F_DISP8         0x00000020\n#define F_DISP16        0x00000040\n#define F_DISP32        0x00000080\n#define F_RELATIVE      0x00000100\n#define F_2IMM16        0x00000800\n#define F_ERROR         0x00001000\n#define F_ERROR_OPCODE  0x00002000\n#define F_ERROR_LENGTH  0x00004000\n#define F_ERROR_LOCK    0x00008000\n#define F_ERROR_OPERAND 0x00010000\n#define F_PREFIX_REPNZ  0x01000000\n#define F_PREFIX_REPX   0x02000000\n#define F_PREFIX_REP    0x03000000\n#define F_PREFIX_66     0x04000000\n#define F_PREFIX_67     0x08000000\n#define F_PREFIX_LOCK   0x10000000\n#define F_PREFIX_SEG    0x20000000\n#define F_PREFIX_ANY    0x3f000000\n\n#define PREFIX_SEGMENT_CS   0x2e\n#define PREFIX_SEGMENT_SS   0x36\n#define PREFIX_SEGMENT_DS   0x3e\n#define PREFIX_SEGMENT_ES   0x26\n#define PREFIX_SEGMENT_FS   0x64\n#define PREFIX_SEGMENT_GS   0x65\n#define PREFIX_LOCK         0xf0\n#define PREFIX_REPNZ        0xf2\n#define PREFIX_REPX         0xf3\n#define PREFIX_OPERAND_SIZE 0x66\n#define PREFIX_ADDRESS_SIZE 0x67\n\n#pragma pack(push,1)\n\ntypedef struct {\n    uint8_t len;\n    uint8_t p_rep;\n    uint8_t p_lock;\n    uint8_t p_seg;\n    uint8_t p_66;\n    uint8_t p_67;\n    uint8_t opcode;\n    uint8_t opcode2;\n    uint8_t modrm;\n    uint8_t modrm_mod;\n    uint8_t modrm_reg;\n    uint8_t modrm_rm;\n    uint8_t sib;\n    uint8_t sib_scale;\n    uint8_t sib_index;\n    uint8_t sib_base;\n    union {\n        uint8_t imm8;\n        uint16_t imm16;\n        uint32_t imm32;\n    } imm;\n    union {\n        uint8_t disp8;\n        uint16_t disp16;\n        uint32_t disp32;\n    } disp;\n    uint32_t flags;\n} hde32s;\n\n#pragma pack(pop)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* __cdecl */\nunsigned int hde32_disasm(const void *code, hde32s *hs);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _HDE32_H_ */\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/hde64.c",
    "content": "﻿/*\n * Hacker Disassembler Engine 64 C\n * Copyright (c) 2008-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n */\n\n#if defined(_M_X64) || defined(__x86_64__)\n\n#include <string.h>\n#include \"hde64.h\"\n#include \"table64.h\"\n\nunsigned int hde64_disasm(const void *code, hde64s *hs)\n{\n    uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0;\n    uint8_t *ht = hde64_table, m_mod, m_reg, m_rm, disp_size = 0;\n    uint8_t op64 = 0;\n\n    memset(hs, 0, sizeof(hde64s));\n\n    for (x = 16; x; x--)\n        switch (c = *p++) {\n            case 0xf3:\n                hs->p_rep = c;\n                pref |= PRE_F3;\n                break;\n            case 0xf2:\n                hs->p_rep = c;\n                pref |= PRE_F2;\n                break;\n            case 0xf0:\n                hs->p_lock = c;\n                pref |= PRE_LOCK;\n                break;\n            case 0x26: case 0x2e: case 0x36:\n            case 0x3e: case 0x64: case 0x65:\n                hs->p_seg = c;\n                pref |= PRE_SEG;\n                break;\n            case 0x66:\n                hs->p_66 = c;\n                pref |= PRE_66;\n                break;\n            case 0x67:\n                hs->p_67 = c;\n                pref |= PRE_67;\n                break;\n            default:\n                goto pref_done;\n        }\n  pref_done:\n\n    hs->flags = (uint32_t)pref << 23;\n\n    if (!pref)\n        pref |= PRE_NONE;\n\n    if ((c & 0xf0) == 0x40) {\n        hs->flags |= F_PREFIX_REX;\n        if ((hs->rex_w = (c & 0xf) >> 3) && (*p & 0xf8) == 0xb8)\n            op64++;\n        hs->rex_r = (c & 7) >> 2;\n        hs->rex_x = (c & 3) >> 1;\n        hs->rex_b = c & 1;\n        if (((c = *p++) & 0xf0) == 0x40) {\n            opcode = c;\n            goto error_opcode;\n        }\n    }\n\n    if ((hs->opcode = c) == 0x0f) {\n        hs->opcode2 = c = *p++;\n        ht += DELTA_OPCODES;\n    } else if (c >= 0xa0 && c <= 0xa3) {\n        op64++;\n        if (pref & PRE_67)\n            pref |= PRE_66;\n        else\n            pref &= ~PRE_66;\n    }\n\n    opcode = c;\n    cflags = ht[ht[opcode / 4] + (opcode % 4)];\n\n    if (cflags == C_ERROR) {\n      error_opcode:\n        hs->flags |= F_ERROR | F_ERROR_OPCODE;\n        cflags = 0;\n        if ((opcode & -3) == 0x24)\n            cflags++;\n    }\n\n    x = 0;\n    if (cflags & C_GROUP) {\n        uint16_t t;\n        t = *(uint16_t *)(ht + (cflags & 0x7f));\n        cflags = (uint8_t)t;\n        x = (uint8_t)(t >> 8);\n    }\n\n    if (hs->opcode2) {\n        ht = hde64_table + DELTA_PREFIXES;\n        if (ht[ht[opcode / 4] + (opcode % 4)] & pref)\n            hs->flags |= F_ERROR | F_ERROR_OPCODE;\n    }\n\n    if (cflags & C_MODRM) {\n        hs->flags |= F_MODRM;\n        hs->modrm = c = *p++;\n        hs->modrm_mod = m_mod = c >> 6;\n        hs->modrm_rm = m_rm = c & 7;\n        hs->modrm_reg = m_reg = (c & 0x3f) >> 3;\n\n        if (x && ((x << m_reg) & 0x80))\n            hs->flags |= F_ERROR | F_ERROR_OPCODE;\n\n        if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) {\n            uint8_t t = opcode - 0xd9;\n            if (m_mod == 3) {\n                ht = hde64_table + DELTA_FPU_MODRM + t*8;\n                t = ht[m_reg] << m_rm;\n            } else {\n                ht = hde64_table + DELTA_FPU_REG;\n                t = ht[t] << m_reg;\n            }\n            if (t & 0x80)\n                hs->flags |= F_ERROR | F_ERROR_OPCODE;\n        }\n\n        if (pref & PRE_LOCK) {\n            if (m_mod == 3) {\n                hs->flags |= F_ERROR | F_ERROR_LOCK;\n            } else {\n                uint8_t *table_end, op = opcode;\n                if (hs->opcode2) {\n                    ht = hde64_table + DELTA_OP2_LOCK_OK;\n                    table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK;\n                } else {\n                    ht = hde64_table + DELTA_OP_LOCK_OK;\n                    table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK;\n                    op &= -2;\n                }\n                for (; ht != table_end; ht++)\n                    if (*ht++ == op) {\n                        if (!((*ht << m_reg) & 0x80))\n                            goto no_lock_error;\n                        else\n                            break;\n                    }\n                hs->flags |= F_ERROR | F_ERROR_LOCK;\n              no_lock_error:\n                ;\n            }\n        }\n\n        if (hs->opcode2) {\n            switch (opcode) {\n                case 0x20: case 0x22:\n                    m_mod = 3;\n                    if (m_reg > 4 || m_reg == 1)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n                case 0x21: case 0x23:\n                    m_mod = 3;\n                    if (m_reg == 4 || m_reg == 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n            }\n        } else {\n            switch (opcode) {\n                case 0x8c:\n                    if (m_reg > 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n                case 0x8e:\n                    if (m_reg == 1 || m_reg > 5)\n                        goto error_operand;\n                    else\n                        goto no_error_operand;\n            }\n        }\n\n        if (m_mod == 3) {\n            uint8_t *table_end;\n            if (hs->opcode2) {\n                ht = hde64_table + DELTA_OP2_ONLY_MEM;\n                table_end = ht + sizeof(hde64_table) - DELTA_OP2_ONLY_MEM;\n            } else {\n                ht = hde64_table + DELTA_OP_ONLY_MEM;\n                table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM;\n            }\n            for (; ht != table_end; ht += 2)\n                if (*ht++ == opcode) {\n                    if ((*ht++ & pref) && !((*ht << m_reg) & 0x80))\n                        goto error_operand;\n                    else\n                        break;\n                }\n            goto no_error_operand;\n        } else if (hs->opcode2) {\n            switch (opcode) {\n                case 0x50: case 0xd7: case 0xf7:\n                    if (pref & (PRE_NONE | PRE_66))\n                        goto error_operand;\n                    break;\n                case 0xd6:\n                    if (pref & (PRE_F2 | PRE_F3))\n                        goto error_operand;\n                    break;\n                case 0xc5:\n                    goto error_operand;\n            }\n            goto no_error_operand;\n        } else\n            goto no_error_operand;\n\n      error_operand:\n        hs->flags |= F_ERROR | F_ERROR_OPERAND;\n      no_error_operand:\n\n        c = *p++;\n        if (m_reg <= 1) {\n            if (opcode == 0xf6)\n                cflags |= C_IMM8;\n            else if (opcode == 0xf7)\n                cflags |= C_IMM_P66;\n        }\n\n        switch (m_mod) {\n            case 0:\n                if (pref & PRE_67) {\n                    if (m_rm == 6)\n                        disp_size = 2;\n                } else\n                    if (m_rm == 5)\n                        disp_size = 4;\n                break;\n            case 1:\n                disp_size = 1;\n                break;\n            case 2:\n                disp_size = 2;\n                if (!(pref & PRE_67))\n                    disp_size <<= 1;\n                break;\n        }\n\n        if (m_mod != 3 && m_rm == 4) {\n            hs->flags |= F_SIB;\n            p++;\n            hs->sib = c;\n            hs->sib_scale = c >> 6;\n            hs->sib_index = (c & 0x3f) >> 3;\n            if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1))\n                disp_size = 4;\n        }\n\n        p--;\n        switch (disp_size) {\n            case 1:\n                hs->flags |= F_DISP8;\n                hs->disp.disp8 = *p;\n                break;\n            case 2:\n                hs->flags |= F_DISP16;\n                hs->disp.disp16 = *(uint16_t *)p;\n                break;\n            case 4:\n                hs->flags |= F_DISP32;\n                hs->disp.disp32 = *(uint32_t *)p;\n                break;\n        }\n        p += disp_size;\n    } else if (pref & PRE_LOCK)\n        hs->flags |= F_ERROR | F_ERROR_LOCK;\n\n    if (cflags & C_IMM_P66) {\n        if (cflags & C_REL32) {\n            if (pref & PRE_66) {\n                hs->flags |= F_IMM16 | F_RELATIVE;\n                hs->imm.imm16 = *(uint16_t *)p;\n                p += 2;\n                goto disasm_done;\n            }\n            goto rel32_ok;\n        }\n        if (op64) {\n            hs->flags |= F_IMM64;\n            hs->imm.imm64 = *(uint64_t *)p;\n            p += 8;\n        } else if (!(pref & PRE_66)) {\n            hs->flags |= F_IMM32;\n            hs->imm.imm32 = *(uint32_t *)p;\n            p += 4;\n        } else\n            goto imm16_ok;\n    }\n\n\n    if (cflags & C_IMM16) {\n      imm16_ok:\n        hs->flags |= F_IMM16;\n        hs->imm.imm16 = *(uint16_t *)p;\n        p += 2;\n    }\n    if (cflags & C_IMM8) {\n        hs->flags |= F_IMM8;\n        hs->imm.imm8 = *p++;\n    }\n\n    if (cflags & C_REL32) {\n      rel32_ok:\n        hs->flags |= F_IMM32 | F_RELATIVE;\n        hs->imm.imm32 = *(uint32_t *)p;\n        p += 4;\n    } else if (cflags & C_REL8) {\n        hs->flags |= F_IMM8 | F_RELATIVE;\n        hs->imm.imm8 = *p++;\n    }\n\n  disasm_done:\n\n    if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) {\n        hs->flags |= F_ERROR | F_ERROR_LENGTH;\n        hs->len = 15;\n    }\n\n    return (unsigned int)hs->len;\n}\n\n#endif // defined(_M_X64) || defined(__x86_64__)\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/hde64.h",
    "content": "﻿/*\n * Hacker Disassembler Engine 64\n * Copyright (c) 2008-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n * hde64.h: C/C++ header file\n *\n */\n\n#ifndef _HDE64_H_\n#define _HDE64_H_\n\n/* stdint.h - C99 standard header\n * http://en.wikipedia.org/wiki/stdint.h\n *\n * if your compiler doesn't contain \"stdint.h\" header (for\n * example, Microsoft Visual C++), you can download file:\n *   http://www.azillionmonkeys.com/qed/pstdint.h\n * and change next line to:\n *   #include \"pstdint.h\"\n */\n#include \"pstdint.h\"\n\n#define F_MODRM         0x00000001\n#define F_SIB           0x00000002\n#define F_IMM8          0x00000004\n#define F_IMM16         0x00000008\n#define F_IMM32         0x00000010\n#define F_IMM64         0x00000020\n#define F_DISP8         0x00000040\n#define F_DISP16        0x00000080\n#define F_DISP32        0x00000100\n#define F_RELATIVE      0x00000200\n#define F_ERROR         0x00001000\n#define F_ERROR_OPCODE  0x00002000\n#define F_ERROR_LENGTH  0x00004000\n#define F_ERROR_LOCK    0x00008000\n#define F_ERROR_OPERAND 0x00010000\n#define F_PREFIX_REPNZ  0x01000000\n#define F_PREFIX_REPX   0x02000000\n#define F_PREFIX_REP    0x03000000\n#define F_PREFIX_66     0x04000000\n#define F_PREFIX_67     0x08000000\n#define F_PREFIX_LOCK   0x10000000\n#define F_PREFIX_SEG    0x20000000\n#define F_PREFIX_REX    0x40000000\n#define F_PREFIX_ANY    0x7f000000\n\n#define PREFIX_SEGMENT_CS   0x2e\n#define PREFIX_SEGMENT_SS   0x36\n#define PREFIX_SEGMENT_DS   0x3e\n#define PREFIX_SEGMENT_ES   0x26\n#define PREFIX_SEGMENT_FS   0x64\n#define PREFIX_SEGMENT_GS   0x65\n#define PREFIX_LOCK         0xf0\n#define PREFIX_REPNZ        0xf2\n#define PREFIX_REPX         0xf3\n#define PREFIX_OPERAND_SIZE 0x66\n#define PREFIX_ADDRESS_SIZE 0x67\n\n#pragma pack(push,1)\n\ntypedef struct {\n    uint8_t len;\n    uint8_t p_rep;\n    uint8_t p_lock;\n    uint8_t p_seg;\n    uint8_t p_66;\n    uint8_t p_67;\n    uint8_t rex;\n    uint8_t rex_w;\n    uint8_t rex_r;\n    uint8_t rex_x;\n    uint8_t rex_b;\n    uint8_t opcode;\n    uint8_t opcode2;\n    uint8_t modrm;\n    uint8_t modrm_mod;\n    uint8_t modrm_reg;\n    uint8_t modrm_rm;\n    uint8_t sib;\n    uint8_t sib_scale;\n    uint8_t sib_index;\n    uint8_t sib_base;\n    union {\n        uint8_t imm8;\n        uint16_t imm16;\n        uint32_t imm32;\n        uint64_t imm64;\n    } imm;\n    union {\n        uint8_t disp8;\n        uint16_t disp16;\n        uint32_t disp32;\n    } disp;\n    uint32_t flags;\n} hde64s;\n\n#pragma pack(pop)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* __cdecl */\nunsigned int hde64_disasm(const void *code, hde64s *hs);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _HDE64_H_ */\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/pstdint.h",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *  1. Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *  2. Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR \"AS IS\" AND ANY EXPRESS OR\n *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <windows.h>\n\n// Integer types for HDE.\ntypedef INT8   int8_t;\ntypedef INT16  int16_t;\ntypedef INT32  int32_t;\ntypedef INT64  int64_t;\ntypedef UINT8  uint8_t;\ntypedef UINT16 uint16_t;\ntypedef UINT32 uint32_t;\ntypedef UINT64 uint64_t;\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/table32.h",
    "content": "﻿/*\n * Hacker Disassembler Engine 32 C\n * Copyright (c) 2008-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n */\n\n#define C_NONE    0x00\n#define C_MODRM   0x01\n#define C_IMM8    0x02\n#define C_IMM16   0x04\n#define C_IMM_P66 0x10\n#define C_REL8    0x20\n#define C_REL32   0x40\n#define C_GROUP   0x80\n#define C_ERROR   0xff\n\n#define PRE_ANY  0x00\n#define PRE_NONE 0x01\n#define PRE_F2   0x02\n#define PRE_F3   0x04\n#define PRE_66   0x08\n#define PRE_67   0x10\n#define PRE_LOCK 0x20\n#define PRE_SEG  0x40\n#define PRE_ALL  0xff\n\n#define DELTA_OPCODES      0x4a\n#define DELTA_FPU_REG      0xf1\n#define DELTA_FPU_MODRM    0xf8\n#define DELTA_PREFIXES     0x130\n#define DELTA_OP_LOCK_OK   0x1a1\n#define DELTA_OP2_LOCK_OK  0x1b9\n#define DELTA_OP_ONLY_MEM  0x1cb\n#define DELTA_OP2_ONLY_MEM 0x1da\n\nunsigned char hde32_table[] = {\n  0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,\n  0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xac,0xaa,0xb2,0xaa,0x9f,0x9f,\n  0x9f,0x9f,0xb5,0xa3,0xa3,0xa4,0xaa,0xaa,0xba,0xaa,0x96,0xaa,0xa8,0xaa,0xc3,\n  0xc3,0x96,0x96,0xb7,0xae,0xd6,0xbd,0xa3,0xc5,0xa3,0xa3,0x9f,0xc3,0x9c,0xaa,\n  0xaa,0xac,0xaa,0xbf,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0x90,\n  0x82,0x7d,0x97,0x59,0x59,0x59,0x59,0x59,0x7f,0x59,0x59,0x60,0x7d,0x7f,0x7f,\n  0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x9a,0x88,0x7d,\n  0x59,0x50,0x50,0x50,0x50,0x59,0x59,0x59,0x59,0x61,0x94,0x61,0x9e,0x59,0x59,\n  0x85,0x59,0x92,0xa3,0x60,0x60,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,\n  0x59,0x59,0x9f,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xcc,0x01,0xbc,0x03,0xf0,\n  0x10,0x10,0x10,0x10,0x50,0x50,0x50,0x50,0x14,0x20,0x20,0x20,0x20,0x01,0x01,\n  0x01,0x01,0xc4,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xc0,0xc2,0x10,0x11,\n  0x02,0x03,0x11,0x03,0x03,0x04,0x00,0x00,0x14,0x00,0x02,0x00,0x00,0xc6,0xc8,\n  0x02,0x02,0x02,0x02,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xca,\n  0x01,0x01,0x01,0x00,0x06,0x00,0x04,0x00,0xc0,0xc2,0x01,0x01,0x03,0x01,0xff,\n  0xff,0x01,0x00,0x03,0xc4,0xc4,0xc6,0x03,0x01,0x01,0x01,0xff,0x03,0x03,0x03,\n  0xc8,0x40,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00,\n  0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00,\n  0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0xff,0xff,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x7f,0x00,0x00,0xff,0x4a,0x4a,0x4a,0x4a,0x4b,0x52,0x4a,0x4a,0x4a,0x4a,0x4f,\n  0x4c,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x55,0x45,0x40,0x4a,0x4a,0x4a,\n  0x45,0x59,0x4d,0x46,0x4a,0x5d,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,\n  0x4a,0x4a,0x4a,0x4a,0x4a,0x61,0x63,0x67,0x4e,0x4a,0x4a,0x6b,0x6d,0x4a,0x4a,\n  0x45,0x6d,0x4a,0x4a,0x44,0x45,0x4a,0x4a,0x00,0x00,0x00,0x02,0x0d,0x06,0x06,\n  0x06,0x06,0x0e,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x06,0x06,0x02,0x06,\n  0x00,0x0a,0x0a,0x07,0x07,0x06,0x02,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04,\n  0x04,0x04,0x00,0x00,0x00,0x0e,0x05,0x06,0x06,0x06,0x01,0x06,0x00,0x00,0x08,\n  0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01,\n  0x86,0x00,0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba,\n  0xf8,0xbb,0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00,\n  0xc4,0xff,0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00,\n  0x13,0x09,0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07,\n  0xb2,0xff,0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf,\n  0xe7,0x08,0x00,0xf0,0x02,0x00\n};\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hde/table64.h",
    "content": "﻿/*\n * Hacker Disassembler Engine 64 C\n * Copyright (c) 2008-2009, Vyacheslav Patkov.\n * All rights reserved.\n *\n */\n\n#define C_NONE    0x00\n#define C_MODRM   0x01\n#define C_IMM8    0x02\n#define C_IMM16   0x04\n#define C_IMM_P66 0x10\n#define C_REL8    0x20\n#define C_REL32   0x40\n#define C_GROUP   0x80\n#define C_ERROR   0xff\n\n#define PRE_ANY  0x00\n#define PRE_NONE 0x01\n#define PRE_F2   0x02\n#define PRE_F3   0x04\n#define PRE_66   0x08\n#define PRE_67   0x10\n#define PRE_LOCK 0x20\n#define PRE_SEG  0x40\n#define PRE_ALL  0xff\n\n#define DELTA_OPCODES      0x4a\n#define DELTA_FPU_REG      0xfd\n#define DELTA_FPU_MODRM    0x104\n#define DELTA_PREFIXES     0x13c\n#define DELTA_OP_LOCK_OK   0x1ae\n#define DELTA_OP2_LOCK_OK  0x1c6\n#define DELTA_OP_ONLY_MEM  0x1d8\n#define DELTA_OP2_ONLY_MEM 0x1e7\n\nunsigned char hde64_table[] = {\n  0xa5,0xaa,0xa5,0xb8,0xa5,0xaa,0xa5,0xaa,0xa5,0xb8,0xa5,0xb8,0xa5,0xb8,0xa5,\n  0xb8,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xac,0xc0,0xcc,0xc0,0xa1,0xa1,\n  0xa1,0xa1,0xb1,0xa5,0xa5,0xa6,0xc0,0xc0,0xd7,0xda,0xe0,0xc0,0xe4,0xc0,0xea,\n  0xea,0xe0,0xe0,0x98,0xc8,0xee,0xf1,0xa5,0xd3,0xa5,0xa5,0xa1,0xea,0x9e,0xc0,\n  0xc0,0xc2,0xc0,0xe6,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0xab,\n  0x8b,0x90,0x64,0x5b,0x5b,0x5b,0x5b,0x5b,0x92,0x5b,0x5b,0x76,0x90,0x92,0x92,\n  0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x6a,0x73,0x90,\n  0x5b,0x52,0x52,0x52,0x52,0x5b,0x5b,0x5b,0x5b,0x77,0x7c,0x77,0x85,0x5b,0x5b,\n  0x70,0x5b,0x7a,0xaf,0x76,0x76,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,\n  0x5b,0x5b,0x86,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xd5,0x03,0xcc,0x01,0xbc,\n  0x03,0xf0,0x03,0x03,0x04,0x00,0x50,0x50,0x50,0x50,0xff,0x20,0x20,0x20,0x20,\n  0x01,0x01,0x01,0x01,0xc4,0x02,0x10,0xff,0xff,0xff,0x01,0x00,0x03,0x11,0xff,\n  0x03,0xc4,0xc6,0xc8,0x02,0x10,0x00,0xff,0xcc,0x01,0x01,0x01,0x00,0x00,0x00,\n  0x00,0x01,0x01,0x03,0x01,0xff,0xff,0xc0,0xc2,0x10,0x11,0x02,0x03,0x01,0x01,\n  0x01,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x10,\n  0x10,0x10,0x10,0x02,0x10,0x00,0x00,0xc6,0xc8,0x02,0x02,0x02,0x02,0x06,0x00,\n  0x04,0x00,0x02,0xff,0x00,0xc0,0xc2,0x01,0x01,0x03,0x03,0x03,0xca,0x40,0x00,\n  0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00,0x00,0x00,0x00,\n  0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xff,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,\n  0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,\n  0xff,0x40,0x40,0x40,0x40,0x41,0x49,0x40,0x40,0x40,0x40,0x4c,0x42,0x40,0x40,\n  0x40,0x40,0x40,0x40,0x40,0x40,0x4f,0x44,0x53,0x40,0x40,0x40,0x44,0x57,0x43,\n  0x5c,0x40,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\n  0x40,0x40,0x64,0x66,0x6e,0x6b,0x40,0x40,0x6a,0x46,0x40,0x40,0x44,0x46,0x40,\n  0x40,0x5b,0x44,0x40,0x40,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x01,0x06,\n  0x06,0x02,0x06,0x06,0x00,0x06,0x00,0x0a,0x0a,0x00,0x00,0x00,0x02,0x07,0x07,\n  0x06,0x02,0x0d,0x06,0x06,0x06,0x0e,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04,\n  0x04,0x04,0x05,0x06,0x06,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x08,0x00,0x10,\n  0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01,0x86,0x00,\n  0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba,0xf8,0xbb,\n  0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00,0xc4,0xff,\n  0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00,0x13,0x09,\n  0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07,0xb2,0xff,\n  0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf,0xe7,0x08,\n  0x00,0xf0,0x02,0x00\n};\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/hook.c",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <windows.h>\n#include <tlhelp32.h>\n#include <limits.h>\n\n#include \"../include/MinHook.h\"\n#include \"buffer.h\"\n#include \"trampoline.h\"\n\n#ifndef ARRAYSIZE\n    #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))\n#endif\n\n// Initial capacity of the HOOK_ENTRY buffer.\n#define INITIAL_HOOK_CAPACITY   32\n\n// Initial capacity of the thread IDs buffer.\n#define INITIAL_THREAD_CAPACITY 128\n\n// Special hook position values.\n#define INVALID_HOOK_POS UINT_MAX\n\n// Thread access rights for suspending/resuming threads.\n#define THREAD_ACCESS \\\n    (THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | THREAD_SET_CONTEXT)\n\n// Suspended threads for Freeze()/Unfreeze().\ntypedef struct _FROZEN_THREADS\n{\n    LPHANDLE pItems;         // Data heap\n    UINT     capacity;       // Size of allocated data heap, items\n    UINT     size;           // Actual number of data items\n} FROZEN_THREADS, *PFROZEN_THREADS;\n\n// Thread freeze related definitions.\ntypedef NTSTATUS(NTAPI *NtGetNextThread_t)(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE NewThreadHandle\n    );\n\n#ifndef STATUS_NO_MORE_ENTRIES\n    #define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)\n#endif\n\n#ifndef NT_SUCCESS\n    #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)\n#endif\n\n// Function and function pointer declarations.\ntypedef MH_STATUS(WINAPI *ENABLE_HOOK_LL_PROC)(UINT pos, BOOL enable, PFROZEN_THREADS pThreads);\ntypedef MH_STATUS(WINAPI *DISABLE_HOOK_CHAIN_PROC)(ULONG_PTR hookIdent, LPVOID pTarget, UINT parentPos, ENABLE_HOOK_LL_PROC ParentEnableHookLL, PFROZEN_THREADS pThreads);\n\nstatic MH_STATUS WINAPI DisableHookChain(ULONG_PTR hookIdent, LPVOID pTarget, UINT parentPos, ENABLE_HOOK_LL_PROC ParentEnableHookLL, PFROZEN_THREADS pThreads);\n\n// Executable buffer of a hook.\ntypedef struct _EXEC_BUFFER\n{\n    DISABLE_HOOK_CHAIN_PROC pDisableHookChain;\n    ULONG_PTR hookIdent;\n    JMP_RELAY jmpRelay;\n    UINT8     trampoline[1]; // Uses the rest of the MEMORY_SLOT_SIZE bytes.\n} EXEC_BUFFER, *PEXEC_BUFFER;\n\n// Hook information.\ntypedef struct _HOOK_ENTRY\n{\n    ULONG_PTR hookIdent;        // Hook identifier, allows to hook the same function multiple times with different identifiers.\n\n    LPVOID pTarget;             // Address of the target function.\n    LPVOID pDetour;             // Address of the detour function.\n    PEXEC_BUFFER pExecBuffer;   // Address of the executable buffer for relay and trampoline.\n    UINT8  backup[8];           // Original prologue of the target function.\n\n    UINT8  patchAbove  : 1;     // Uses the hot patch area.\n    UINT8  isEnabled   : 1;     // Enabled.\n    UINT8  queueEnable : 1;     // Queued for enabling/disabling when != isEnabled.\n\n    UINT   nIP : 4;             // Count of the instruction boundaries.\n    UINT8  oldIPs[8];           // Instruction boundaries of the target function.\n    UINT8  newIPs[8];           // Instruction boundaries of the trampoline function.\n} HOOK_ENTRY, *PHOOK_ENTRY;\n\n//-------------------------------------------------------------------------\n// Global Variables:\n//-------------------------------------------------------------------------\n\n// Mutex. If not NULL, this library is initialized.\nstatic HANDLE g_hMutex = NULL;\n\n// Private heap handle.\nstatic HANDLE g_hHeap;\n\n// Thread freeze related variables.\nstatic MH_THREAD_FREEZE_METHOD g_threadFreezeMethod = MH_FREEZE_METHOD_ORIGINAL;\n\nstatic NtGetNextThread_t pNtGetNextThread;\n\n// Hook entries.\nstatic struct\n{\n    PHOOK_ENTRY pItems;     // Data heap\n    UINT        capacity;   // Size of allocated data heap, items\n    UINT        size;       // Actual number of data items\n} g_hooks;\n\n//-------------------------------------------------------------------------\n// Returns INVALID_HOOK_POS if not found.\nstatic UINT FindHookEntry(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    UINT i;\n    for (i = 0; i < g_hooks.size; ++i)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if (hookIdent == pHook->hookIdent && (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget)\n            return i;\n    }\n\n    return INVALID_HOOK_POS;\n}\n\n//-------------------------------------------------------------------------\nstatic PHOOK_ENTRY AddHookEntry()\n{\n    if (g_hooks.pItems == NULL)\n    {\n        g_hooks.capacity = INITIAL_HOOK_CAPACITY;\n        g_hooks.pItems = (PHOOK_ENTRY)HeapAlloc(\n            g_hHeap, 0, g_hooks.capacity * sizeof(HOOK_ENTRY));\n        if (g_hooks.pItems == NULL)\n            return NULL;\n    }\n    else if (g_hooks.size >= g_hooks.capacity)\n    {\n        PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc(\n            g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity * 2) * sizeof(HOOK_ENTRY));\n        if (p == NULL)\n            return NULL;\n\n        g_hooks.capacity *= 2;\n        g_hooks.pItems = p;\n    }\n\n    return &g_hooks.pItems[g_hooks.size++];\n}\n\n//-------------------------------------------------------------------------\nstatic VOID DeleteHookEntry(UINT pos)\n{\n    if (pos < g_hooks.size - 1)\n        g_hooks.pItems[pos] = g_hooks.pItems[g_hooks.size - 1];\n\n    g_hooks.size--;\n\n    if (g_hooks.capacity / 2 >= INITIAL_HOOK_CAPACITY && g_hooks.capacity / 2 >= g_hooks.size)\n    {\n        PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc(\n            g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity / 2) * sizeof(HOOK_ENTRY));\n        if (p == NULL)\n            return;\n\n        g_hooks.capacity /= 2;\n        g_hooks.pItems = p;\n    }\n}\n\n//-------------------------------------------------------------------------\nstatic DWORD_PTR FindOldIP(PHOOK_ENTRY pHook, DWORD_PTR ip)\n{\n    // In any of the jump locations:\n    // Target -> Hotpatch jump (if patchAbove) -> Relay jump\n    // Restore IP to the detour. This is required for consistent behavior\n    // as a part of a DisableHookChain call, otherwise, if IP is restored\n    // to the target, hooks that should be called may be skipped.\n\n    if (ip == (DWORD_PTR)pHook->pTarget)\n        return (DWORD_PTR)pHook->pDetour;\n\n    if (pHook->patchAbove && ip == ((DWORD_PTR)pHook->pTarget - sizeof(JMP_REL)))\n        return (DWORD_PTR)pHook->pDetour;\n\n    if (ip == (DWORD_PTR)&pHook->pExecBuffer->jmpRelay)\n        return (DWORD_PTR)pHook->pDetour;\n\n    UINT i;\n    for (i = 0; i < pHook->nIP; ++i)\n    {\n        if (ip == ((DWORD_PTR)pHook->pExecBuffer->trampoline + pHook->newIPs[i]))\n            return (DWORD_PTR)pHook->pTarget + pHook->oldIPs[i];\n    }\n\n    return 0;\n}\n\n//-------------------------------------------------------------------------\nstatic DWORD_PTR FindNewIP(PHOOK_ENTRY pHook, DWORD_PTR ip)\n{\n    UINT i;\n    for (i = 0; i < pHook->nIP; ++i)\n    {\n        if (ip == ((DWORD_PTR)pHook->pTarget + pHook->oldIPs[i]))\n            return (DWORD_PTR)pHook->pExecBuffer->trampoline + pHook->newIPs[i];\n    }\n\n    return 0;\n}\n\n//-------------------------------------------------------------------------\nstatic VOID ProcessThreadIPs(HANDLE hThread, UINT pos, BOOL enable)\n{\n    // If the thread suspended in the overwritten area,\n    // move IP to the proper address.\n\n    CONTEXT     c;\n#if defined(_M_X64) || defined(__x86_64__)\n    DWORD64     *pIP = &c.Rip;\n#else\n    DWORD       *pIP = &c.Eip;\n#endif\n    PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n    DWORD_PTR   ip;\n\n    c.ContextFlags = CONTEXT_CONTROL;\n    if (!GetThreadContext(hThread, &c))\n        return;\n\n    if (enable)\n        ip = FindNewIP(pHook, *pIP);\n    else\n        ip = FindOldIP(pHook, *pIP);\n\n    if (ip != 0)\n    {\n        *pIP = ip;\n        SetThreadContext(hThread, &c);\n    }\n}\n\n//-------------------------------------------------------------------------\nstatic BOOL EnumerateAndSuspendThreads(PFROZEN_THREADS pThreads)\n{\n    BOOL succeeded = FALSE;\n\n    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);\n    if (hSnapshot != INVALID_HANDLE_VALUE)\n    {\n        THREADENTRY32 te;\n        te.dwSize = sizeof(THREADENTRY32);\n        if (Thread32First(hSnapshot, &te))\n        {\n            succeeded = TRUE;\n            do\n            {\n                if (te.dwSize >= (FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(DWORD))\n                    && te.th32OwnerProcessID == GetCurrentProcessId()\n                    && te.th32ThreadID != GetCurrentThreadId())\n                {\n                    HANDLE hThread = OpenThread(THREAD_ACCESS, FALSE, te.th32ThreadID);\n\n                    if (hThread != NULL && SuspendThread(hThread) == (DWORD)-1)\n                    {\n                        CloseHandle(hThread);\n                        hThread = NULL;\n                    }\n\n                    if (hThread != NULL)\n                    {\n                        if (pThreads->pItems == NULL)\n                        {\n                            pThreads->capacity = INITIAL_THREAD_CAPACITY;\n                            pThreads->pItems\n                                = (LPHANDLE)HeapAlloc(g_hHeap, 0, pThreads->capacity * sizeof(HANDLE));\n                            if (pThreads->pItems == NULL)\n                                succeeded = FALSE;\n                        }\n                        else if (pThreads->size >= pThreads->capacity)\n                        {\n                            LPHANDLE p;\n                            pThreads->capacity *= 2;\n                            p = (LPHANDLE)HeapReAlloc(\n                                g_hHeap, 0, pThreads->pItems, pThreads->capacity * sizeof(HANDLE));\n                            if (p)\n                                pThreads->pItems = p;\n                            else\n                                succeeded = FALSE;\n                        }\n\n                        if (!succeeded)\n                        {\n                            ResumeThread(hThread);\n                            CloseHandle(hThread);\n                            break;\n                        }\n\n                        pThreads->pItems[pThreads->size++] = hThread;\n                    }\n                }\n\n                te.dwSize = sizeof(THREADENTRY32);\n            } while (Thread32Next(hSnapshot, &te));\n\n            if (succeeded && GetLastError() != ERROR_NO_MORE_FILES)\n                succeeded = FALSE;\n\n            if (!succeeded && pThreads->pItems != NULL)\n            {\n                UINT i;\n                for (i = 0; i < pThreads->size; ++i)\n                {\n                    ResumeThread(pThreads->pItems[i]);\n                    CloseHandle(pThreads->pItems[i]);\n                }\n\n                HeapFree(g_hHeap, 0, pThreads->pItems);\n                pThreads->pItems = NULL;\n            }\n        }\n        CloseHandle(hSnapshot);\n    }\n\n    return succeeded;\n}\n\n//-------------------------------------------------------------------------\nstatic BOOL EnumerateAndSuspendThreadsFast(PFROZEN_THREADS pThreads)\n{\n    BOOL succeeded = TRUE;\n\n    HANDLE hThread = NULL;\n    BOOL bClosePrevThread = FALSE;\n    while (1)\n    {\n        HANDLE hNextThread;\n        NTSTATUS status = pNtGetNextThread(GetCurrentProcess(), hThread, THREAD_ACCESS, 0, 0, &hNextThread);\n        if (bClosePrevThread)\n            CloseHandle(hThread);\n\n        if (!NT_SUCCESS(status))\n        {\n            if (status != STATUS_NO_MORE_ENTRIES)\n                succeeded = FALSE;\n            break;\n        }\n\n        hThread = hNextThread;\n        bClosePrevThread = TRUE;\n\n        if (GetThreadId(hThread) == GetCurrentThreadId())\n            continue;\n\n        if (SuspendThread(hThread) == (DWORD)-1)\n            continue;\n\n        bClosePrevThread = FALSE;\n\n        if (pThreads->pItems == NULL)\n        {\n            pThreads->capacity = INITIAL_THREAD_CAPACITY;\n            pThreads->pItems\n                = (LPHANDLE)HeapAlloc(g_hHeap, 0, pThreads->capacity * sizeof(HANDLE));\n            if (pThreads->pItems == NULL)\n                succeeded = FALSE;\n        }\n        else if (pThreads->size >= pThreads->capacity)\n        {\n            pThreads->capacity *= 2;\n            LPHANDLE p = (LPHANDLE)HeapReAlloc(\n                g_hHeap, 0, pThreads->pItems, pThreads->capacity * sizeof(HANDLE));\n            if (p)\n                pThreads->pItems = p;\n            else\n                succeeded = FALSE;\n        }\n\n        if (!succeeded)\n        {\n            ResumeThread(hThread);\n            CloseHandle(hThread);\n            break;\n        }\n\n        // Perform a synchronous operation to make sure the thread really is suspended.\n        // https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743\n        CONTEXT c;\n        c.ContextFlags = CONTEXT_CONTROL;\n        GetThreadContext(hThread, &c);\n\n        pThreads->pItems[pThreads->size++] = hThread;\n    }\n\n    if (!succeeded && pThreads->pItems != NULL)\n    {\n        UINT i;\n        for (i = 0; i < pThreads->size; ++i)\n        {\n            ResumeThread(pThreads->pItems[i]);\n            CloseHandle(pThreads->pItems[i]);\n        }\n\n        HeapFree(g_hHeap, 0, pThreads->pItems);\n        pThreads->pItems = NULL;\n    }\n\n    return succeeded;\n}\n\n//-------------------------------------------------------------------------\nstatic VOID ProcessFrozenThreads(PFROZEN_THREADS pThreads, UINT pos, BOOL enable)\n{\n    if (pThreads->pItems != NULL)\n    {\n        UINT i;\n        for (i = 0; i < pThreads->size; ++i)\n        {\n            ProcessThreadIPs(pThreads->pItems[i], pos, enable);\n        }\n    }\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS Freeze(PFROZEN_THREADS pThreads)\n{\n    MH_STATUS status = MH_OK;\n\n    pThreads->pItems   = NULL;\n    pThreads->capacity = 0;\n    pThreads->size     = 0;\n\n    switch (g_threadFreezeMethod)\n    {\n    case MH_FREEZE_METHOD_ORIGINAL:\n        if (!EnumerateAndSuspendThreads(pThreads))\n            status = MH_ERROR_MEMORY_ALLOC;\n        break;\n\n    case MH_FREEZE_METHOD_FAST_UNDOCUMENTED:\n        if (!EnumerateAndSuspendThreadsFast(pThreads))\n            status = MH_ERROR_MEMORY_ALLOC;\n        break;\n\n    case MH_FREEZE_METHOD_NONE_UNSAFE:\n        // Nothing to do.\n        break;\n    }\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nstatic VOID Unfreeze(PFROZEN_THREADS pThreads)\n{\n    if (pThreads->pItems != NULL)\n    {\n        UINT i;\n        for (i = 0; i < pThreads->size; ++i)\n        {\n            ResumeThread(pThreads->pItems[i]);\n            CloseHandle(pThreads->pItems[i]);\n        }\n\n        HeapFree(g_hHeap, 0, pThreads->pItems);\n    }\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS CreateHookTrampoline(UINT pos)\n{\n    PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n\n    TRAMPOLINE ct;\n    ct.pTarget = pHook->pTarget;\n    ct.pTrampoline = pHook->pExecBuffer->trampoline;\n    ct.trampolineSize = MEMORY_SLOT_SIZE - offsetof(EXEC_BUFFER, trampoline);\n    if (!CreateTrampolineFunction(&ct))\n    {\n        return MH_ERROR_UNSUPPORTED_FUNCTION;\n    }\n\n    // Back up the target function.\n    if (ct.patchAbove)\n    {\n        memcpy(\n            pHook->backup,\n            (LPBYTE)pHook->pTarget - sizeof(JMP_REL),\n            sizeof(JMP_REL) + sizeof(JMP_REL_SHORT));\n    }\n    else\n    {\n        memcpy(pHook->backup, pHook->pTarget, sizeof(JMP_REL));\n    }\n\n    pHook->patchAbove = ct.patchAbove;\n    pHook->nIP = ct.nIP;\n    memcpy(pHook->oldIPs, ct.oldIPs, ARRAYSIZE(ct.oldIPs));\n    memcpy(pHook->newIPs, ct.newIPs, ARRAYSIZE(ct.newIPs));\n\n    return MH_OK;\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS WINAPI EnableHookLL(UINT pos, BOOL enable, PFROZEN_THREADS pThreads)\n{\n    PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n    DWORD  oldProtect;\n    SIZE_T patchSize    = sizeof(JMP_REL);\n    LPBYTE pPatchTarget = (LPBYTE)pHook->pTarget;\n\n    if (enable)\n    {\n        MH_STATUS status = CreateHookTrampoline(pos);\n        if (status != MH_OK)\n            return status;\n    }\n\n    if (pHook->patchAbove)\n    {\n        pPatchTarget -= sizeof(JMP_REL);\n        patchSize    += sizeof(JMP_REL_SHORT);\n    }\n\n    if (!enable)\n    {\n        PJMP_REL pJmp = (PJMP_REL)pPatchTarget;\n        if (pJmp->opcode == 0xE9)\n        {\n            PJMP_RELAY pJmpRelay = (PJMP_RELAY)(((LPBYTE)pJmp + sizeof(JMP_REL)) + (INT32)pJmp->operand);\n            if (&pHook->pExecBuffer->jmpRelay != pJmpRelay)\n            {\n                PEXEC_BUFFER pOtherExecBuffer = (PEXEC_BUFFER)((LPBYTE)pJmpRelay - offsetof(EXEC_BUFFER, jmpRelay));\n                return pOtherExecBuffer->pDisableHookChain(pOtherExecBuffer->hookIdent, pHook->pTarget, pos, EnableHookLL, pThreads);\n            }\n        }\n    }\n\n    if (!VirtualProtect(pPatchTarget, patchSize, PAGE_EXECUTE_READWRITE, &oldProtect))\n        return MH_ERROR_MEMORY_PROTECT;\n\n    if (enable)\n    {\n        PJMP_REL pJmp = (PJMP_REL)pPatchTarget;\n        pJmp->opcode = 0xE9;\n        pJmp->operand = (UINT32)((LPBYTE)&pHook->pExecBuffer->jmpRelay - (pPatchTarget + sizeof(JMP_REL)));\n\n        if (pHook->patchAbove)\n        {\n            PJMP_REL_SHORT pShortJmp = (PJMP_REL_SHORT)pHook->pTarget;\n            pShortJmp->opcode = 0xEB;\n            pShortJmp->operand = (UINT8)(0 - (sizeof(JMP_REL_SHORT) + sizeof(JMP_REL)));\n        }\n    }\n    else\n    {\n        if (pHook->patchAbove)\n            memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL) + sizeof(JMP_REL_SHORT));\n        else\n            memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL));\n    }\n\n    VirtualProtect(pPatchTarget, patchSize, oldProtect, &oldProtect);\n\n    // Just-in-case measure.\n    FlushInstructionCache(GetCurrentProcess(), pPatchTarget, patchSize);\n\n    ProcessFrozenThreads(pThreads, pos, enable);\n\n    pHook->isEnabled   = enable;\n    pHook->queueEnable = enable;\n\n    return MH_OK;\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS EnableHooksLL(ULONG_PTR hookIdent, LPVOID pTarget, BOOL enable)\n{\n    MH_STATUS status = MH_OK;\n    UINT i, first = INVALID_HOOK_POS;\n\n    for (i = 0; i < g_hooks.size; ++i)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if (pHook->isEnabled != enable &&\n            (hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n            (pTarget == MH_ALL_HOOKS || (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget))\n        {\n            first = i;\n            break;\n        }\n    }\n\n    if (first != INVALID_HOOK_POS)\n    {\n        FROZEN_THREADS threads;\n        status = Freeze(&threads);\n        if (status == MH_OK)\n        {\n            for (i = first; i < g_hooks.size; ++i)\n            {\n                PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n                if (pHook->isEnabled != enable &&\n                    (hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n                    (pTarget == MH_ALL_HOOKS || (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget))\n                {\n                    MH_STATUS enable_status = EnableHookLL(i, enable, &threads);\n\n                    // Instead of stopping on the first error, we enable as much\n                    // hooks as we can, and return the last error, if any.\n                    if (enable_status != MH_OK)\n                        status = enable_status;\n                }\n            }\n\n            Unfreeze(&threads);\n        }\n    }\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nstatic HANDLE CreateProcessMutex(VOID)\n{\n    TCHAR szMutexName[sizeof(\"minhook_multihook_12345678\")] = TEXT(\"minhook_multihook_\");\n    UINT mutexNameLen = sizeof(\"minhook_multihook_\") - 1;\n    DWORD dw = GetCurrentProcessId();\n    UINT i;\n\n    // Build szMutexName in the following format:\n    // printf(\"minhook_multihook_%08X\", GetCurrentProcessId());\n\n    for (i = 0; i < 8; i++)\n    {\n        TCHAR ch;\n        BYTE b = dw >> (32 - 4);\n\n        if (b < 0x0A)\n            ch = b + TEXT('0');\n        else\n            ch = b - 0x0A + TEXT('A');\n\n        szMutexName[mutexNameLen++] = ch;\n        dw <<= 4;\n    }\n\n    szMutexName[mutexNameLen] = TEXT('\\0');\n\n    return CreateMutex(NULL, FALSE, szMutexName);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_Initialize(VOID)\n{\n    if (g_hMutex != NULL)\n        return MH_ERROR_ALREADY_INITIALIZED;\n\n    g_hMutex = CreateProcessMutex();\n    if (g_hMutex == NULL)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    g_hHeap = HeapCreate(0, 0, 0);\n    if (g_hHeap == NULL)\n    {\n        CloseHandle(g_hMutex);\n        g_hMutex = NULL;\n        return MH_ERROR_MEMORY_ALLOC;\n    }\n\n    // Initialize the internal function buffer.\n    InitializeBuffer();\n\n    return MH_OK;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_Uninitialize(VOID)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = EnableHooksLL(MH_ALL_IDENTS, MH_ALL_HOOKS, FALSE);\n\n    ReleaseMutex(g_hMutex);\n\n    if (status != MH_OK)\n        return status;\n\n    // Free the internal function buffer.\n    // HeapFree is actually not required, but some tools detect a false\n    // memory leak without HeapFree.\n    UninitializeBuffer();\n    HeapFree(g_hHeap, 0, g_hooks.pItems);\n    HeapDestroy(g_hHeap);\n    g_hHeap = NULL;\n\n    g_hooks.pItems = NULL;\n    g_hooks.capacity = 0;\n    g_hooks.size = 0;\n\n    CloseHandle(g_hMutex);\n    g_hMutex = NULL;\n\n    return MH_OK;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_SetThreadFreezeMethod(MH_THREAD_FREEZE_METHOD method)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    if (method == MH_FREEZE_METHOD_FAST_UNDOCUMENTED && !pNtGetNextThread)\n    {\n        HMODULE hNtdll = GetModuleHandle(L\"ntdll.dll\");\n        if (hNtdll)\n            pNtGetNextThread = (NtGetNextThread_t)GetProcAddress(hNtdll, \"NtGetNextThread\");\n\n        if (!pNtGetNextThread)\n        {\n            // Fall back to the original method.\n            method = MH_FREEZE_METHOD_ORIGINAL;\n        }\n    }\n\n    g_threadFreezeMethod = method;\n\n    ReleaseMutex(g_hMutex);\n\n    return MH_OK;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_CreateHookEx(ULONG_PTR hookIdent, LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n\n    if (IsExecutableAddress(pTarget) && IsExecutableAddress(pDetour))\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget);\n        if (pos == INVALID_HOOK_POS)\n        {\n            PEXEC_BUFFER pBuffer = (PEXEC_BUFFER)AllocateBuffer(pTarget);\n            if (pBuffer != NULL)\n            {\n                PHOOK_ENTRY pHook = AddHookEntry();\n                if (pHook != NULL)\n                {\n                    pBuffer->hookIdent = hookIdent;\n                    pBuffer->pDisableHookChain = DisableHookChain;\n                    CreateRelayFunction(&pBuffer->jmpRelay, pDetour);\n\n                    pHook->hookIdent = hookIdent;\n                    pHook->pTarget = pTarget;\n                    pHook->pDetour = pDetour;\n                    pHook->pExecBuffer = pBuffer;\n                    pHook->isEnabled = FALSE;\n                    pHook->queueEnable = FALSE;\n\n                    if (ppOriginal != NULL)\n                        *ppOriginal = pBuffer->trampoline;\n                }\n                else\n                {\n                    status = MH_ERROR_MEMORY_ALLOC;\n                }\n\n                if (status != MH_OK)\n                {\n                    FreeBuffer(pBuffer);\n                }\n            }\n            else\n            {\n                status = MH_ERROR_MEMORY_ALLOC;\n            }\n        }\n        else\n        {\n            status = MH_ERROR_ALREADY_CREATED;\n        }\n    }\n    else\n    {\n        status = MH_ERROR_NOT_EXECUTABLE;\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    return MH_CreateHookEx(MH_DEFAULT_IDENT, pTarget, pDetour, ppOriginal);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_RemoveHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        status = EnableHooksLL(hookIdent, pTarget, FALSE);\n        if (status == MH_OK)\n        {\n            UINT i = 0;\n            while (i < g_hooks.size)\n            {\n                PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n                if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n                    (pTarget == MH_ALL_HOOKS || (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget))\n                {\n                    FreeBuffer(pHook->pExecBuffer);\n                    DeleteHookEntry(i);\n                }\n                else\n                {\n                    ++i;\n                }\n            }\n        }\n    }\n    else\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget);\n        if (pos != INVALID_HOOK_POS)\n        {\n            if (g_hooks.pItems[pos].isEnabled)\n            {\n                FROZEN_THREADS threads;\n                status = Freeze(&threads);\n                if (status == MH_OK)\n                {\n                    status = EnableHookLL(pos, FALSE, &threads);\n\n                    Unfreeze(&threads);\n                }\n            }\n\n            if (status == MH_OK)\n            {\n                FreeBuffer(g_hooks.pItems[pos].pExecBuffer);\n                DeleteHookEntry(pos);\n            }\n        }\n        else\n        {\n            status = MH_ERROR_NOT_CREATED;\n        }\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget)\n{\n    return MH_RemoveHookEx(MH_DEFAULT_IDENT, pTarget);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_RemoveDisabledHooksEx(ULONG_PTR hookIdent)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n\n    UINT i = 0;\n    while (i < g_hooks.size)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n            !pHook->isEnabled)\n        {\n            FreeBuffer(pHook->pExecBuffer);\n            DeleteHookEntry(i);\n        }\n        else\n        {\n            ++i;\n        }\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_RemoveDisabledHooks()\n{\n    return MH_RemoveDisabledHooksEx(MH_DEFAULT_IDENT);\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS WINAPI DisableHookChain(ULONG_PTR hookIdent, LPVOID pTarget, UINT parentPos, ENABLE_HOOK_LL_PROC ParentEnableHookLL, PFROZEN_THREADS pThreads)\n{\n    UINT pos = FindHookEntry(hookIdent, pTarget);\n    if (pos == INVALID_HOOK_POS)\n        return MH_ERROR_NOT_CREATED;\n\n    if (!g_hooks.pItems[pos].isEnabled)\n        return MH_ERROR_DISABLED;\n\n    // We're not Freeze()-ing the threads here, because we assume that the function\n    // was called from a different MinHook module, which already suspended all threads.\n\n    MH_STATUS status = EnableHookLL(pos, FALSE, pThreads);\n    if (status != MH_OK)\n        return status;\n\n    status = ParentEnableHookLL(parentPos, FALSE, pThreads);\n    if (status != MH_OK)\n        return status;\n\n    return EnableHookLL(pos, TRUE, pThreads);\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS EnableHook(ULONG_PTR hookIdent, LPVOID pTarget, BOOL enable)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        status = EnableHooksLL(hookIdent, pTarget, enable);\n    }\n    else\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget);\n        if (pos != INVALID_HOOK_POS)\n        {\n            if (g_hooks.pItems[pos].isEnabled != enable)\n            {\n                FROZEN_THREADS threads;\n                status = Freeze(&threads);\n                if (status == MH_OK)\n                {\n                    status = EnableHookLL(pos, enable, &threads);\n\n                    Unfreeze(&threads);\n                }\n            }\n            else\n            {\n                status = enable ? MH_ERROR_ENABLED : MH_ERROR_DISABLED;\n            }\n        }\n        else\n        {\n            status = MH_ERROR_NOT_CREATED;\n        }\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_EnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    return EnableHook(hookIdent, pTarget, TRUE);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_EnableHook(LPVOID pTarget)\n{\n    return MH_EnableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_DisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    return EnableHook(hookIdent, pTarget, FALSE);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_DisableHook(LPVOID pTarget)\n{\n    return MH_DisableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\n\n//-------------------------------------------------------------------------\nstatic MH_STATUS QueueHook(ULONG_PTR hookIdent, LPVOID pTarget, BOOL queueEnable)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        UINT i;\n        for (i = 0; i < g_hooks.size; ++i)\n        {\n            PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n            if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n                (pTarget == MH_ALL_HOOKS || (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget))\n            {\n                pHook->queueEnable = queueEnable;\n            }\n        }\n    }\n    else\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget);\n        if (pos != INVALID_HOOK_POS)\n        {\n            g_hooks.pItems[pos].queueEnable = queueEnable;\n        }\n        else\n        {\n            status = MH_ERROR_NOT_CREATED;\n        }\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_QueueEnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    return QueueHook(hookIdent, pTarget, TRUE);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget)\n{\n    return MH_QueueEnableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_QueueDisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    return QueueHook(hookIdent, pTarget, FALSE);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget)\n{\n    return MH_QueueDisableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_ApplyQueuedEx(ULONG_PTR hookIdent)\n{\n    if (g_hMutex == NULL)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    if (WaitForSingleObject(g_hMutex, INFINITE) != WAIT_OBJECT_0)\n        return MH_ERROR_MUTEX_FAILURE;\n\n    MH_STATUS status = MH_OK;\n    UINT i, first = INVALID_HOOK_POS;\n\n    for (i = 0; i < g_hooks.size; ++i)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n            pHook->isEnabled != pHook->queueEnable)\n        {\n            first = i;\n            break;\n        }\n    }\n\n    if (first != INVALID_HOOK_POS)\n    {\n        FROZEN_THREADS threads;\n        status = Freeze(&threads);\n        if (status == MH_OK)\n        {\n            for (i = first; i < g_hooks.size; ++i)\n            {\n                PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n                if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n                    pHook->isEnabled != pHook->queueEnable)\n                {\n                    MH_STATUS enable_status = EnableHookLL(i, pHook->queueEnable, &threads);\n\n                    // Instead of stopping on the first error, we apply as much\n                    // hooks as we can, and return the last error, if any.\n                    if (enable_status != MH_OK)\n                        status = enable_status;\n                }\n            }\n\n            Unfreeze(&threads);\n        }\n    }\n\n    ReleaseMutex(g_hMutex);\n\n    return status;\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_ApplyQueued(VOID)\n{\n    return MH_ApplyQueuedEx(MH_DEFAULT_IDENT);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_CreateHookApiEx(\n    LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour,\n    LPVOID *ppOriginal, LPVOID *ppTarget)\n{\n    HMODULE hModule;\n    LPVOID  pTarget;\n\n    hModule = GetModuleHandleW(pszModule);\n    if (hModule == NULL)\n        return MH_ERROR_MODULE_NOT_FOUND;\n\n    pTarget = (LPVOID)GetProcAddress(hModule, pszProcName);\n    if (pTarget == NULL)\n        return MH_ERROR_FUNCTION_NOT_FOUND;\n\n    if (ppTarget != NULL)\n        *ppTarget = pTarget;\n\n    return MH_CreateHook(pTarget, pDetour, ppOriginal);\n}\n\n//-------------------------------------------------------------------------\nMH_STATUS WINAPI MH_CreateHookApi(\n    LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    return MH_CreateHookApiEx(pszModule, pszProcName, pDetour, ppOriginal, NULL);\n}\n\n//-------------------------------------------------------------------------\nconst char *WINAPI MH_StatusToString(MH_STATUS status)\n{\n#define MH_ST2STR(x)    \\\n    case x:             \\\n        return #x;\n\n    switch (status) {\n        MH_ST2STR(MH_UNKNOWN)\n        MH_ST2STR(MH_OK)\n        MH_ST2STR(MH_ERROR_ALREADY_INITIALIZED)\n        MH_ST2STR(MH_ERROR_NOT_INITIALIZED)\n        MH_ST2STR(MH_ERROR_ALREADY_CREATED)\n        MH_ST2STR(MH_ERROR_NOT_CREATED)\n        MH_ST2STR(MH_ERROR_ENABLED)\n        MH_ST2STR(MH_ERROR_DISABLED)\n        MH_ST2STR(MH_ERROR_NOT_EXECUTABLE)\n        MH_ST2STR(MH_ERROR_UNSUPPORTED_FUNCTION)\n        MH_ST2STR(MH_ERROR_MEMORY_ALLOC)\n        MH_ST2STR(MH_ERROR_MEMORY_PROTECT)\n        MH_ST2STR(MH_ERROR_MODULE_NOT_FOUND)\n        MH_ST2STR(MH_ERROR_FUNCTION_NOT_FOUND)\n        MH_ST2STR(MH_ERROR_MUTEX_FAILURE)\n    }\n\n#undef MH_ST2STR\n\n    return \"(unknown)\";\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/trampoline.c",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <windows.h>\n\n#if defined(_MSC_VER) && !defined(MINHOOK_DISABLE_INTRINSICS)\n    #define ALLOW_INTRINSICS\n    #include <intrin.h>\n#endif\n\n#ifndef ARRAYSIZE\n    #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))\n#endif\n\n#if defined(_M_X64) || defined(__x86_64__)\n    #include \"./hde/hde64.h\"\n    typedef hde64s HDE;\n    #define HDE_DISASM(code, hs) hde64_disasm(code, hs)\n#else\n    #include \"./hde/hde32.h\"\n    typedef hde32s HDE;\n    #define HDE_DISASM(code, hs) hde32_disasm(code, hs)\n#endif\n\n#include \"trampoline.h\"\n#include \"buffer.h\"\n\n//-------------------------------------------------------------------------\nstatic BOOL IsCodePadding(LPBYTE pInst, UINT size)\n{\n    UINT i;\n\n    if (pInst[0] != 0x00 && pInst[0] != 0x90 && pInst[0] != 0xCC)\n        return FALSE;\n\n    for (i = 1; i < size; ++i)\n    {\n        if (pInst[i] != pInst[0])\n            return FALSE;\n    }\n    return TRUE;\n}\n\n//-------------------------------------------------------------------------\nVOID CreateRelayFunction(PJMP_RELAY pJmpRelay, LPVOID pDetour)\n{\n#if defined(_M_X64) || defined(__x86_64__)\n    JMP_ABS jmp = {\n        0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6]\n        0x0000000000000000ULL   // Absolute destination address\n    };\n\n    jmp.address = (ULONG_PTR)pDetour;\n#else\n    JMP_REL jmp = {\n        0xE9,                   // E9 xxxxxxxx: JMP +5+xxxxxxxx\n        0x00000000              // Relative destination address\n    };\n\n    jmp.operand = (UINT32)((LPBYTE)pDetour - ((LPBYTE)pJmpRelay + sizeof(jmp)));\n#endif\n\n    memcpy(pJmpRelay, &jmp, sizeof(jmp));\n}\n\n//-------------------------------------------------------------------------\nBOOL CreateTrampolineFunction(PTRAMPOLINE ct)\n{\n#if defined(_M_X64) || defined(__x86_64__)\n    CALL_ABS call = {\n        0xFF, 0x15, 0x00000002, // FF15 00000002: CALL [RIP+8]\n        0xEB, 0x08,             // EB 08:         JMP +10\n        0x0000000000000000ULL   // Absolute destination address\n    };\n    JMP_ABS jmp = {\n        0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6]\n        0x0000000000000000ULL   // Absolute destination address\n    };\n    JCC_ABS jcc = {\n        0x70, 0x0E,             // 7* 0E:         J** +16\n        0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6]\n        0x0000000000000000ULL   // Absolute destination address\n    };\n#else\n    CALL_REL call = {\n        0xE8,                   // E8 xxxxxxxx: CALL +5+xxxxxxxx\n        0x00000000              // Relative destination address\n    };\n    JMP_REL jmp = {\n        0xE9,                   // E9 xxxxxxxx: JMP +5+xxxxxxxx\n        0x00000000              // Relative destination address\n    };\n    JCC_REL jcc = {\n        0x0F, 0x80,             // 0F8* xxxxxxxx: J** +6+xxxxxxxx\n        0x00000000              // Relative destination address\n    };\n#endif\n\n    UINT8     oldPos   = 0;\n    UINT8     newPos   = 0;\n    ULONG_PTR jmpDest  = 0;     // Destination address of an internal jump.\n    BOOL      finished = FALSE; // Is the function completed?\n#if defined(_M_X64) || defined(__x86_64__)\n    UINT8     instBuf[16];\n#endif\n\n    ct->patchAbove = FALSE;\n    ct->nIP        = 0;\n\n    do\n    {\n        HDE       hs;\n        UINT      copySize;\n        LPVOID    pCopySrc;\n        ULONG_PTR pOldInst = (ULONG_PTR)ct->pTarget     + oldPos;\n        ULONG_PTR pNewInst = (ULONG_PTR)ct->pTrampoline + newPos;\n\n        copySize = HDE_DISASM((LPVOID)pOldInst, &hs);\n        if (hs.flags & F_ERROR)\n            return FALSE;\n\n        pCopySrc = (LPVOID)pOldInst;\n        if (oldPos >= sizeof(JMP_REL))\n        {\n            // The trampoline function is long enough.\n            // Complete the function with the jump to the target function.\n#if defined(_M_X64) || defined(__x86_64__)\n            jmp.address = pOldInst;\n#else\n            jmp.operand = (UINT32)(pOldInst - (pNewInst + sizeof(jmp)));\n#endif\n            pCopySrc = &jmp;\n            copySize = sizeof(jmp);\n\n            finished = TRUE;\n        }\n#if defined(_M_X64) || defined(__x86_64__)\n        else if ((hs.modrm & 0xC7) == 0x05)\n        {\n            // Instructions using RIP relative addressing. (ModR/M = 00???101B)\n\n            // Modify the RIP relative address.\n            PUINT32 pRelAddr;\n\n            // Avoid using memcpy to reduce the footprint.\n#ifndef ALLOW_INTRINSICS\n            memcpy(instBuf, (LPBYTE)pOldInst, copySize);\n#else\n            __movsb(instBuf, (LPBYTE)pOldInst, copySize);\n#endif\n            pCopySrc = instBuf;\n\n            // Relative address is stored at (instruction length - immediate value length - 4).\n            pRelAddr = (PUINT32)(instBuf + hs.len - ((hs.flags & 0x3C) >> 2) - 4);\n            *pRelAddr\n                = (UINT32)((pOldInst + hs.len + (INT32)hs.disp.disp32) - (pNewInst + hs.len));\n\n            // Complete the function if JMP (FF /4).\n            if (hs.opcode == 0xFF && hs.modrm_reg == 4)\n                finished = TRUE;\n        }\n#endif\n        else if (hs.opcode == 0xE8)\n        {\n            // Direct relative CALL\n            ULONG_PTR dest = pOldInst + hs.len + (INT32)hs.imm.imm32;\n#if defined(_M_X64) || defined(__x86_64__)\n            call.address = dest;\n#else\n            call.operand = (UINT32)(dest - (pNewInst + sizeof(call)));\n#endif\n            pCopySrc = &call;\n            copySize = sizeof(call);\n        }\n        else if ((hs.opcode & 0xFD) == 0xE9)\n        {\n            // Direct relative JMP (EB or E9)\n            ULONG_PTR dest = pOldInst + hs.len;\n\n            if (hs.opcode == 0xEB) // isShort jmp\n                dest += (INT8)hs.imm.imm8;\n            else\n                dest += (INT32)hs.imm.imm32;\n\n            // Simply copy an internal jump.\n            if ((ULONG_PTR)ct->pTarget <= dest\n                && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL)))\n            {\n                if (jmpDest < dest)\n                    jmpDest = dest;\n            }\n            else\n            {\n#if defined(_M_X64) || defined(__x86_64__)\n                jmp.address = dest;\n#else\n                jmp.operand = (UINT32)(dest - (pNewInst + sizeof(jmp)));\n#endif\n                pCopySrc = &jmp;\n                copySize = sizeof(jmp);\n\n                // Exit the function if it is not in the branch.\n                finished = (pOldInst >= jmpDest);\n            }\n        }\n        else if ((hs.opcode & 0xF0) == 0x70\n            || (hs.opcode & 0xFC) == 0xE0\n            || (hs.opcode2 & 0xF0) == 0x80)\n        {\n            // Direct relative Jcc\n            ULONG_PTR dest = pOldInst + hs.len;\n\n            if ((hs.opcode & 0xF0) == 0x70      // Jcc\n                || (hs.opcode & 0xFC) == 0xE0)  // LOOPNZ/LOOPZ/LOOP/JECXZ\n                dest += (INT8)hs.imm.imm8;\n            else\n                dest += (INT32)hs.imm.imm32;\n\n            // Simply copy an internal jump.\n            if ((ULONG_PTR)ct->pTarget <= dest\n                && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL)))\n            {\n                if (jmpDest < dest)\n                    jmpDest = dest;\n            }\n            else if ((hs.opcode & 0xFC) == 0xE0)\n            {\n                // LOOPNZ/LOOPZ/LOOP/JCXZ/JECXZ to the outside are not supported.\n                return FALSE;\n            }\n            else\n            {\n                UINT8 cond = ((hs.opcode != 0x0F ? hs.opcode : hs.opcode2) & 0x0F);\n#if defined(_M_X64) || defined(__x86_64__)\n                // Invert the condition in x64 mode to simplify the conditional jump logic.\n                jcc.opcode  = 0x71 ^ cond;\n                jcc.address = dest;\n#else\n                jcc.opcode1 = 0x80 | cond;\n                jcc.operand = (UINT32)(dest - (pNewInst + sizeof(jcc)));\n#endif\n                pCopySrc = &jcc;\n                copySize = sizeof(jcc);\n            }\n        }\n        else if ((hs.opcode & 0xFE) == 0xC2)\n        {\n            // RET (C2 or C3)\n\n            // Complete the function if not in a branch.\n            finished = (pOldInst >= jmpDest);\n        }\n\n        // Can't alter the instruction length in a branch.\n        if (pOldInst < jmpDest && copySize != hs.len)\n            return FALSE;\n\n        // Trampoline function is too large.\n        if ((newPos + copySize) > ct->trampolineSize)\n            return FALSE;\n\n        // Trampoline function has too many instructions.\n        if (ct->nIP >= ARRAYSIZE(ct->oldIPs))\n            return FALSE;\n\n        ct->oldIPs[ct->nIP] = oldPos;\n        ct->newIPs[ct->nIP] = newPos;\n        ct->nIP++;\n\n        // Avoid using memcpy to reduce the footprint.\n#ifndef ALLOW_INTRINSICS\n        memcpy((LPBYTE)ct->pTrampoline + newPos, pCopySrc, copySize);\n#else\n        __movsb((LPBYTE)ct->pTrampoline + newPos, (LPBYTE)pCopySrc, copySize);\n#endif\n        newPos += copySize;\n        oldPos += hs.len;\n    } while (!finished);\n\n    // Is there enough place for a long jump?\n    if (oldPos < sizeof(JMP_REL)\n        && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL) - oldPos))\n    {\n        // Is there enough place for a short jump?\n        if (oldPos < sizeof(JMP_REL_SHORT)\n            && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL_SHORT) - oldPos))\n        {\n            return FALSE;\n        }\n\n        // Can we place the long jump above the function?\n        if (!IsExecutableAddress((LPBYTE)ct->pTarget - sizeof(JMP_REL)))\n            return FALSE;\n\n        if (!IsCodePadding((LPBYTE)ct->pTarget - sizeof(JMP_REL), sizeof(JMP_REL)))\n            return FALSE;\n\n        ct->patchAbove = TRUE;\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook/src/trampoline.h",
    "content": "﻿/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#pragma pack(push, 1)\n\n// Structs for writing x86/x64 instructions.\n\n// 8-bit relative jump.\ntypedef struct _JMP_REL_SHORT\n{\n    UINT8  opcode;      // EB xx: JMP +2+xx\n    UINT8  operand;     // Relative destination address\n} JMP_REL_SHORT, *PJMP_REL_SHORT;\n\n// 32-bit direct relative jump/call.\ntypedef struct _JMP_REL\n{\n    UINT8  opcode;      // E9/E8 xxxxxxxx: JMP/CALL +5+xxxxxxxx\n    UINT32 operand;     // Relative destination address\n} JMP_REL, *PJMP_REL, CALL_REL;\n\n// 64-bit indirect absolute jump.\ntypedef struct _JMP_ABS\n{\n    UINT8  opcode0;     // FF25 00000000: JMP [+6]\n    UINT8  opcode1;\n    UINT32 dummy;\n    UINT64 address;     // Absolute destination address\n} JMP_ABS, *PJMP_ABS;\n\n// 64-bit indirect absolute call.\ntypedef struct _CALL_ABS\n{\n    UINT8  opcode0;     // FF15 00000002: CALL [+6]\n    UINT8  opcode1;\n    UINT32 dummy0;\n    UINT8  dummy1;      // EB 08:         JMP +10\n    UINT8  dummy2;\n    UINT64 address;     // Absolute destination address\n} CALL_ABS;\n\n// 32-bit direct relative conditional jumps.\ntypedef struct _JCC_REL\n{\n    UINT8  opcode0;     // 0F8* xxxxxxxx: J** +6+xxxxxxxx\n    UINT8  opcode1;\n    UINT32 operand;     // Relative destination address\n} JCC_REL;\n\n// 64bit indirect absolute conditional jumps that x64 lacks.\ntypedef struct _JCC_ABS\n{\n    UINT8  opcode;      // 7* 0E:         J** +16\n    UINT8  dummy0;\n    UINT8  dummy1;      // FF25 00000000: JMP [+6]\n    UINT8  dummy2;\n    UINT32 dummy3;\n    UINT64 address;     // Absolute destination address\n} JCC_ABS;\n\n#pragma pack(pop)\n\n#if defined(_M_X64) || defined(__x86_64__)\n    typedef JMP_ABS  JMP_RELAY;\n    typedef PJMP_ABS PJMP_RELAY;\n#else\n    typedef JMP_REL  JMP_RELAY;\n    typedef PJMP_REL PJMP_RELAY;\n#endif\n\ntypedef struct _TRAMPOLINE\n{\n    LPVOID pTarget;         // [In] Address of the target function.\n    LPVOID pTrampoline;     // [In] Buffer address for the trampoline function.\n    UINT   trampolineSize;  // [In] The size of the trampoline function buffer.\n\n    BOOL   patchAbove;      // [Out] Should use the hot patch area?\n    UINT   nIP;             // [Out] Number of the instruction boundaries.\n    UINT8  oldIPs[8];       // [Out] Instruction boundaries of the target function.\n    UINT8  newIPs[8];       // [Out] Instruction boundaries of the trampoline function.\n} TRAMPOLINE, *PTRAMPOLINE;\n\nVOID CreateRelayFunction(PJMP_RELAY pJmpRelay, LPVOID pDetour);\nBOOL CreateTrampolineFunction(PTRAMPOLINE ct);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/MinHook.c",
    "content": "#include \"MinHook.h\"\n\n#include \"SlimDetours/SlimDetours.h\"\n\n// Initial capacity of the HOOK_ENTRY buffer.\n#define INITIAL_HOOK_CAPACITY   32\n\n// Special hook position values.\n#define INVALID_HOOK_POS UINT_MAX\n\n// Memory protection flags to check the executable address.\n#define PAGE_EXECUTE_FLAGS \\\n    (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)\n\ntypedef struct _HOOK_ENTRY\n{\n    ULONG_PTR hookIdent;\n    LPVOID pTarget;\n    LPVOID pDetour;\n    LPVOID pTargetOrTrampoline;\n    LPVOID *ppOriginal;\n    LPVOID pTrampolineToFree;\n    UINT8 isEnabled : 1;\n    UINT8 queueEnable : 1;\n    HRESULT bulkLastError;\n} HOOK_ENTRY, *PHOOK_ENTRY;\n\nstatic CRITICAL_SECTION g_criticalSection;\n\nstatic BOOL g_initialized = FALSE;\n\n// Thread freeze related variables.\nstatic MH_THREAD_FREEZE_METHOD g_threadFreezeMethod = MH_FREEZE_METHOD_ORIGINAL;\n\n// Bulk operation related variables.\nstatic BOOL g_bulkContinueOnError = FALSE;\nstatic MH_ERROR_CALLBACK g_bulkErrorCallback = NULL;\n\n// Hook entries.\nstruct\n{\n    PHOOK_ENTRY pItems;     // Data heap\n    UINT        capacity;   // Size of allocated data heap, items\n    UINT        size;       // Actual number of data items\n} g_hooks;\n\n// Returns INVALID_HOOK_POS if not found.\nstatic UINT FindHookEntry(ULONG_PTR hookIdent, LPVOID pTarget, UINT pos)\n{\n    UINT i;\n    for (i = pos; i < g_hooks.size; ++i)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if ((hookIdent == MH_ALL_IDENTS || pHook->hookIdent == hookIdent) &&\n            (pTarget == MH_ALL_HOOKS || (ULONG_PTR)pTarget == (ULONG_PTR)pHook->pTarget))\n        {\n            return i;\n        }\n    }\n\n    return INVALID_HOOK_POS;\n}\n\nstatic UINT FindHookEntryEnabled(ULONG_PTR hookIdent, LPVOID pTarget, UINT pos, BOOL enabled)\n{\n    UINT i = FindHookEntry(hookIdent, pTarget, pos);\n    while (i != INVALID_HOOK_POS)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if (pHook->isEnabled == enabled)\n        {\n            break;\n        }\n\n        i = FindHookEntry(hookIdent, pTarget, i + 1);\n    }\n\n    return i;\n}\n\nstatic UINT FindHookEntryQueued(ULONG_PTR hookIdent, LPVOID pTarget, UINT pos)\n{\n    UINT i = FindHookEntry(hookIdent, pTarget, pos);\n    while (i != INVALID_HOOK_POS)\n    {\n        PHOOK_ENTRY pHook = &g_hooks.pItems[i];\n        if (pHook->queueEnable != pHook->isEnabled)\n        {\n            break;\n        }\n\n        i = FindHookEntry(hookIdent, pTarget, i + 1);\n    }\n\n    return i;\n}\n\nstatic PHOOK_ENTRY AddHookEntry()\n{\n    if (g_hooks.pItems == NULL)\n    {\n        g_hooks.capacity = INITIAL_HOOK_CAPACITY;\n        g_hooks.pItems = (PHOOK_ENTRY)HeapAlloc(\n            GetProcessHeap(), 0, g_hooks.capacity * sizeof(HOOK_ENTRY));\n        if (g_hooks.pItems == NULL)\n            return NULL;\n    }\n    else if (g_hooks.size >= g_hooks.capacity)\n    {\n        PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc(\n            GetProcessHeap(), 0, g_hooks.pItems, (g_hooks.capacity * 2) * sizeof(HOOK_ENTRY));\n        if (p == NULL)\n            return NULL;\n\n        g_hooks.capacity *= 2;\n        g_hooks.pItems = p;\n    }\n\n    return &g_hooks.pItems[g_hooks.size++];\n}\n\nstatic VOID DeleteHookEntry(UINT pos)\n{\n    if (pos < g_hooks.size - 1)\n        g_hooks.pItems[pos] = g_hooks.pItems[g_hooks.size - 1];\n\n    g_hooks.size--;\n\n    if (g_hooks.capacity / 2 >= INITIAL_HOOK_CAPACITY && g_hooks.capacity / 2 >= g_hooks.size)\n    {\n        PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc(\n            GetProcessHeap(), 0, g_hooks.pItems, (g_hooks.capacity / 2) * sizeof(HOOK_ENTRY));\n        if (p == NULL)\n            return;\n\n        g_hooks.capacity /= 2;\n        g_hooks.pItems = p;\n    }\n}\n\nstatic BOOL IsExecutableAddress(LPVOID pAddress)\n{\n    MEMORY_BASIC_INFORMATION mi;\n    VirtualQuery(pAddress, &mi, sizeof(mi));\n\n    return (mi.State == MEM_COMMIT && (mi.Protect & PAGE_EXECUTE_FLAGS));\n}\n\nstatic void FreeHookTrampolineIfNeeded(PHOOK_ENTRY pHook)\n{\n    if (pHook->pTrampolineToFree)\n    {\n        SlimDetoursFreeTrampoline(pHook->pTrampolineToFree);\n        pHook->pTrampolineToFree = NULL;\n    }\n}\n\nstatic HRESULT MHDetoursTransactionBegin()\n{\n    DETOUR_TRANSACTION_OPTIONS options = {\n        .fSuspendThreads = g_threadFreezeMethod != MH_FREEZE_METHOD_NONE_UNSAFE,\n    };\n    return SlimDetoursTransactionBeginEx(&options);\n}\n\nstatic HRESULT MHDetoursAttach(PHOOK_ENTRY pHook)\n{\n    FreeHookTrampolineIfNeeded(pHook);\n    LPVOID ppOriginal = pHook->ppOriginal ? pHook->ppOriginal : &pHook->pTargetOrTrampoline;\n    return SlimDetoursAttach(ppOriginal, pHook->pDetour);\n}\n\nstatic HRESULT MHDetoursDetach(PHOOK_ENTRY pHook)\n{\n    LPVOID ppOriginal = pHook->ppOriginal ? pHook->ppOriginal : &pHook->pTargetOrTrampoline;\n    DETOUR_DETACH_OPTIONS options = {\n        .ppTrampolineToFreeManually = &pHook->pTrampolineToFree,\n    };\n    return SlimDetoursDetachEx(ppOriginal, pHook->pDetour, &options);\n}\n\nstatic MH_STATUS CreateHook(ULONG_PTR hookIdent, LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    MH_STATUS status = MH_OK;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        status = MH_ERROR_UNSUPPORTED_FUNCTION;\n    }\n    else if (FindHookEntry(hookIdent, pTarget, 0) != INVALID_HOOK_POS)\n    {\n        status = MH_ERROR_ALREADY_CREATED;\n    }\n    else if (!IsExecutableAddress(pTarget) || !IsExecutableAddress(pDetour))\n    {\n        status = MH_ERROR_NOT_EXECUTABLE;\n    }\n    else\n    {\n        PHOOK_ENTRY pHook = AddHookEntry();\n        if (pHook != NULL)\n        {\n            pHook->hookIdent = hookIdent;\n            pHook->pTarget = pTarget;\n            pHook->pDetour = pDetour;\n\n            if (ppOriginal)\n            {\n                // Check if the ppOriginal pointer was already specified for\n                // other hooks. If so, modify them to use pTargetOrTrampoline.\n                // This fixes a problem with the following questionable code:\n                //\n                // MH_CreateHook(pTarget1, pDetour, &ppOriginal);\n                // // ...\n                // MH_CreateHook(pTarget2, pDetour, &ppOriginal);\n                //\n                // While it's unsupported to have the same ppOriginal pointer\n                // specified more than once, it worked in MinHook, and some\n                // Windhawk mods which call HandleLoadedExplorerPatcher rely on\n                // it.\n                for (UINT i = 0; i < g_hooks.size - 1; ++i)\n                {\n                    PHOOK_ENTRY pHookIter = &g_hooks.pItems[i];\n                    if (pHookIter->ppOriginal == ppOriginal)\n                    {\n                        pHookIter->pTargetOrTrampoline = *pHookIter->ppOriginal;\n                        pHookIter->ppOriginal = NULL;\n                    }\n                }\n\n                pHook->pTargetOrTrampoline = NULL;\n                pHook->ppOriginal = ppOriginal;\n                *ppOriginal = pTarget;\n            }\n            else\n            {\n                pHook->pTargetOrTrampoline = pTarget;\n                pHook->ppOriginal = NULL;\n            }\n\n            pHook->pTrampolineToFree = NULL;\n            pHook->isEnabled = FALSE;\n            pHook->queueEnable = FALSE;\n            pHook->bulkLastError = S_OK;\n        }\n        else\n        {\n            status = MH_ERROR_MEMORY_ALLOC;\n        }\n    }\n\n    return status;\n}\n\nstatic MH_STATUS EnableHook(ULONG_PTR hookIdent, LPVOID pTarget, BOOL enable)\n{\n    MH_STATUS status = MH_OK;\n    HRESULT hr;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        UINT pos = FindHookEntryEnabled(hookIdent, pTarget, 0, !enable);\n        if (pos != INVALID_HOOK_POS)\n        {\n            hr = MHDetoursTransactionBegin();\n            if (SUCCEEDED(hr))\n            {\n                do\n                {\n                    PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n\n                    if (enable)\n                    {\n                        hr = MHDetoursAttach(pHook);\n                    }\n                    else\n                    {\n                        hr = MHDetoursDetach(pHook);\n                    }\n\n                    pHook->bulkLastError = hr;\n\n                    if (g_bulkContinueOnError)\n                    {\n                        hr = S_OK;\n                    }\n                    else if (FAILED(hr))\n                    {\n                        break;\n                    }\n\n                    pos = FindHookEntryEnabled(hookIdent, pTarget, pos + 1, !enable);\n                } while (pos != INVALID_HOOK_POS);\n\n                if (SUCCEEDED(hr))\n                {\n                    hr = SlimDetoursTransactionCommit();\n                    if (SUCCEEDED(hr))\n                    {\n                        UINT pos = FindHookEntryEnabled(hookIdent, pTarget, 0, !enable);\n                        while (pos != INVALID_HOOK_POS)\n                        {\n                            PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n                            if (SUCCEEDED(pHook->bulkLastError))\n                            {\n                                pHook->isEnabled = enable;\n                                pHook->queueEnable = enable;\n                            }\n                            else if (g_bulkErrorCallback)\n                            {\n                                g_bulkErrorCallback(pHook->pTarget, pHook->bulkLastError);\n                                status = MH_ERROR_PARTIAL_FAILURE;\n                            }\n                            pos = FindHookEntryEnabled(hookIdent, pTarget, pos + 1, !enable);\n                        }\n                    }\n                    else\n                    {\n                        status = MH_ERROR_DETOURS_TRANSACTION_COMMIT;\n                    }\n                }\n                else\n                {\n                    status = MH_ERROR_UNSUPPORTED_FUNCTION;\n                    SlimDetoursTransactionAbort();\n                }\n            }\n            else\n            {\n                status = MH_ERROR_DETOURS_TRANSACTION_BEGIN;\n            }\n        }\n    }\n    else\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget, 0);\n        if (pos != INVALID_HOOK_POS)\n        {\n            PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n            if (pHook->isEnabled != enable)\n            {\n                hr = MHDetoursTransactionBegin();\n                if (SUCCEEDED(hr))\n                {\n                    if (enable)\n                    {\n                        hr = MHDetoursAttach(pHook);\n                    }\n                    else\n                    {\n                        hr = MHDetoursDetach(pHook);\n                    }\n\n                    if (SUCCEEDED(hr))\n                    {\n                        hr = SlimDetoursTransactionCommit();\n                        if (SUCCEEDED(hr))\n                        {\n                            pHook->isEnabled = enable;\n                            pHook->queueEnable = enable;\n                        }\n                        else\n                        {\n                            status = MH_ERROR_DETOURS_TRANSACTION_COMMIT;\n                        }\n                    }\n                    else\n                    {\n                        status = MH_ERROR_UNSUPPORTED_FUNCTION;\n                        SlimDetoursTransactionAbort();\n                    }\n                }\n                else\n                {\n                    status = MH_ERROR_DETOURS_TRANSACTION_BEGIN;\n                }\n            }\n            else\n            {\n                status = enable ? MH_ERROR_ENABLED : MH_ERROR_DISABLED;\n            }\n        }\n        else\n        {\n            status = MH_ERROR_NOT_CREATED;\n        }\n    }\n\n    return status;\n}\n\nstatic void RemoveDisabledHooks(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    UINT pos = FindHookEntryEnabled(hookIdent, pTarget, 0, FALSE);\n    while (pos != INVALID_HOOK_POS)\n    {\n        FreeHookTrampolineIfNeeded(&g_hooks.pItems[pos]);\n        DeleteHookEntry(pos);\n        pos = FindHookEntryEnabled(hookIdent, pTarget, pos, FALSE);\n    }\n}\n\nstatic MH_STATUS QueueHook(ULONG_PTR hookIdent, LPVOID pTarget, BOOL queueEnable)\n{\n    MH_STATUS status = MH_OK;\n\n    if (hookIdent == MH_ALL_IDENTS || pTarget == MH_ALL_HOOKS)\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget, 0);\n        while (pos != INVALID_HOOK_POS)\n        {\n            PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n            pHook->queueEnable = queueEnable;\n            pos = FindHookEntry(hookIdent, pTarget, pos + 1);\n        }\n    }\n    else\n    {\n        UINT pos = FindHookEntry(hookIdent, pTarget, 0);\n        if (pos != INVALID_HOOK_POS)\n        {\n            PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n            pHook->queueEnable = queueEnable;\n        }\n        else\n        {\n            status = MH_ERROR_NOT_CREATED;\n        }\n    }\n\n    return status;\n}\n\nstatic MH_STATUS ApplyQueued(ULONG_PTR hookIdent)\n{\n    MH_STATUS status = MH_OK;\n    HRESULT hr;\n\n    UINT pos = FindHookEntryQueued(hookIdent, MH_ALL_HOOKS, 0);\n    if (pos != INVALID_HOOK_POS)\n    {\n        hr = MHDetoursTransactionBegin();\n        if (SUCCEEDED(hr))\n        {\n            do\n            {\n                PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n\n                if (pHook->queueEnable)\n                {\n                    hr = MHDetoursAttach(pHook);\n                }\n                else\n                {\n                    hr = MHDetoursDetach(pHook);\n                }\n\n                pHook->bulkLastError = hr;\n\n                if (g_bulkContinueOnError)\n                {\n                    hr = S_OK;\n                }\n                else if (FAILED(hr))\n                {\n                    break;\n                }\n\n                pos = FindHookEntryQueued(hookIdent, MH_ALL_HOOKS, pos + 1);\n            } while (pos != INVALID_HOOK_POS);\n\n            if (SUCCEEDED(hr))\n            {\n                hr = SlimDetoursTransactionCommit();\n                if (SUCCEEDED(hr))\n                {\n                    UINT pos = FindHookEntryQueued(hookIdent, MH_ALL_HOOKS, 0);\n                    while (pos != INVALID_HOOK_POS)\n                    {\n                        PHOOK_ENTRY pHook = &g_hooks.pItems[pos];\n                        if (SUCCEEDED(pHook->bulkLastError))\n                        {\n                            pHook->isEnabled = pHook->queueEnable;\n                        }\n                        else if (g_bulkErrorCallback)\n                        {\n                            g_bulkErrorCallback(pHook->pTarget, pHook->bulkLastError);\n                            status = MH_ERROR_PARTIAL_FAILURE;\n                        }\n                        pos = FindHookEntryQueued(hookIdent, MH_ALL_HOOKS, pos + 1);\n                    }\n                }\n                else\n                {\n                    status = MH_ERROR_DETOURS_TRANSACTION_COMMIT;\n                }\n            }\n            else\n            {\n                status = MH_ERROR_UNSUPPORTED_FUNCTION;\n                SlimDetoursTransactionAbort();\n            }\n        }\n        else\n        {\n            status = MH_ERROR_DETOURS_TRANSACTION_BEGIN;\n        }\n    }\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_Initialize(VOID)\n{\n    if (g_initialized)\n        return MH_ERROR_ALREADY_INITIALIZED;\n\n    InitializeCriticalSection(&g_criticalSection);\n\n    g_initialized = TRUE;\n    return MH_OK;\n}\n\nMH_STATUS WINAPI MH_Uninitialize(VOID)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = EnableHook(MH_ALL_IDENTS, MH_ALL_HOOKS, FALSE);\n    RemoveDisabledHooks(MH_ALL_IDENTS, MH_ALL_HOOKS);\n\n    if (status == MH_OK && g_hooks.size > 0)\n        status = MH_ERROR_UNABLE_TO_UNINITIALIZE;\n\n    if (status != MH_OK)\n    {\n        LeaveCriticalSection(&g_criticalSection);\n        return status;\n    }\n\n    SlimDetoursUninitialize();\n\n    HeapFree(GetProcessHeap(), 0, g_hooks.pItems);\n\n    g_hooks.pItems = NULL;\n    g_hooks.capacity = 0;\n    g_hooks.size = 0;\n\n    g_initialized = FALSE;\n\n    LeaveCriticalSection(&g_criticalSection);\n    DeleteCriticalSection(&g_criticalSection);\n\n    return MH_OK;\n}\n\nMH_STATUS WINAPI MH_SetThreadFreezeMethod(MH_THREAD_FREEZE_METHOD method)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    g_threadFreezeMethod = method;\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return MH_OK;\n}\n\nMH_STATUS WINAPI MH_SetBulkOperationMode(BOOL continueOnError, MH_ERROR_CALLBACK errorCallback)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    g_bulkContinueOnError = continueOnError;\n    g_bulkErrorCallback = errorCallback;\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return MH_OK;\n}\n\nMH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    return MH_CreateHookEx(MH_DEFAULT_IDENT, pTarget, pDetour, ppOriginal);\n}\nMH_STATUS WINAPI MH_CreateHookEx(ULONG_PTR hookIdent, LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = CreateHook(hookIdent, pTarget, pDetour, ppOriginal);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_CreateHookApi(\n    LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal)\n{\n    return MH_CreateHookApiEx(pszModule, pszProcName, pDetour, ppOriginal, NULL);\n}\n\nMH_STATUS WINAPI MH_CreateHookApiEx(\n    LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget)\n{\n    HMODULE hModule;\n    LPVOID  pTarget;\n\n    hModule = GetModuleHandleW(pszModule);\n    if (hModule == NULL)\n        return MH_ERROR_MODULE_NOT_FOUND;\n\n    pTarget = (LPVOID)GetProcAddress(hModule, pszProcName);\n    if (pTarget == NULL)\n        return MH_ERROR_FUNCTION_NOT_FOUND;\n\n    if (ppTarget != NULL)\n        *ppTarget = pTarget;\n\n    return MH_CreateHook(pTarget, pDetour, ppOriginal);\n}\n\nMH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget)\n{\n    return MH_RemoveHookEx(MH_DEFAULT_IDENT, pTarget);\n}\nMH_STATUS WINAPI MH_RemoveHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = EnableHook(hookIdent, pTarget, FALSE);\n    if (status == MH_ERROR_DISABLED)\n        status = MH_OK;\n\n    RemoveDisabledHooks(hookIdent, pTarget);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_RemoveDisabledHooks()\n{\n    return MH_RemoveDisabledHooksEx(MH_DEFAULT_IDENT);\n}\nMH_STATUS WINAPI MH_RemoveDisabledHooksEx(ULONG_PTR hookIdent)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    RemoveDisabledHooks(hookIdent, MH_ALL_HOOKS);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return MH_OK;\n}\n\nMH_STATUS WINAPI MH_EnableHook(LPVOID pTarget)\n{\n    return MH_EnableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\nMH_STATUS WINAPI MH_EnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = EnableHook(hookIdent, pTarget, TRUE);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_DisableHook(LPVOID pTarget)\n{\n    return MH_DisableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\nMH_STATUS WINAPI MH_DisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = EnableHook(hookIdent, pTarget, FALSE);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget)\n{\n    return MH_QueueEnableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\nMH_STATUS WINAPI MH_QueueEnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = QueueHook(hookIdent, pTarget, TRUE);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget)\n{\n    return MH_QueueDisableHookEx(MH_DEFAULT_IDENT, pTarget);\n}\nMH_STATUS WINAPI MH_QueueDisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = QueueHook(hookIdent, pTarget, FALSE);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nMH_STATUS WINAPI MH_ApplyQueued(VOID)\n{\n    return MH_ApplyQueuedEx(MH_DEFAULT_IDENT);\n}\nMH_STATUS WINAPI MH_ApplyQueuedEx(ULONG_PTR hookIdent)\n{\n    if (!g_initialized)\n        return MH_ERROR_NOT_INITIALIZED;\n\n    EnterCriticalSection(&g_criticalSection);\n\n    MH_STATUS status = ApplyQueued(hookIdent);\n\n    LeaveCriticalSection(&g_criticalSection);\n\n    return status;\n}\n\nconst char *WINAPI MH_StatusToString(MH_STATUS status)\n{\n#define MH_ST2STR(x)    \\\n    case x:             \\\n        return #x\n\n    switch (status)\n    {\n        MH_ST2STR(MH_OK);\n        MH_ST2STR(MH_ERROR_ALREADY_INITIALIZED);\n        MH_ST2STR(MH_ERROR_NOT_INITIALIZED);\n        MH_ST2STR(MH_ERROR_ALREADY_CREATED);\n        MH_ST2STR(MH_ERROR_NOT_CREATED);\n        MH_ST2STR(MH_ERROR_ENABLED);\n        MH_ST2STR(MH_ERROR_DISABLED);\n        MH_ST2STR(MH_ERROR_NOT_EXECUTABLE);\n        MH_ST2STR(MH_ERROR_DETOURS_TRANSACTION_BEGIN);\n        MH_ST2STR(MH_ERROR_UNSUPPORTED_FUNCTION);\n        MH_ST2STR(MH_ERROR_MEMORY_ALLOC);\n        MH_ST2STR(MH_ERROR_MODULE_NOT_FOUND);\n        MH_ST2STR(MH_ERROR_FUNCTION_NOT_FOUND);\n        MH_ST2STR(MH_ERROR_PARTIAL_FAILURE);\n    }\n\n#undef MH_ST2STR\n\n    return \"(unknown)\";\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/MinHook.h",
    "content": "/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <windows.h>\n\n// MinHook Error Codes.\ntypedef enum MH_STATUS\n{\n    // Successful.\n    MH_OK = 0,\n\n    // MinHook is already initialized.\n    MH_ERROR_ALREADY_INITIALIZED,\n\n    // MinHook is not initialized yet, or already uninitialized.\n    MH_ERROR_NOT_INITIALIZED,\n\n    // MinHook can't be uninitialized due to hooks that failed to be removed.\n    MH_ERROR_UNABLE_TO_UNINITIALIZE,\n\n    // The hook for the specified target function is already created.\n    MH_ERROR_ALREADY_CREATED,\n\n    // The hook for the specified target function is not created yet.\n    MH_ERROR_NOT_CREATED,\n\n    // The hook for the specified target function is already enabled.\n    MH_ERROR_ENABLED,\n\n    // The hook for the specified target function is not enabled yet, or already\n    // disabled.\n    MH_ERROR_DISABLED,\n\n    // The specified pointer is invalid. It points the address of non-allocated\n    // and/or non-executable region.\n    MH_ERROR_NOT_EXECUTABLE,\n\n    // Detours failed to begin the hooking transaction.\n    MH_ERROR_DETOURS_TRANSACTION_BEGIN,\n\n    // Detours failed to commit the hooking transaction.\n    MH_ERROR_DETOURS_TRANSACTION_COMMIT,\n\n    // The specified target function cannot be hooked.\n    MH_ERROR_UNSUPPORTED_FUNCTION,\n\n    // Failed to allocate memory.\n    MH_ERROR_MEMORY_ALLOC,\n\n    // The specified module is not loaded.\n    MH_ERROR_MODULE_NOT_FOUND,\n\n    // The specified function is not found.\n    MH_ERROR_FUNCTION_NOT_FOUND,\n\n    // If continueOnError is TRUE (see MH_SetBulkOperationMode), some errors\n    // occurred during a bulk operation.\n    MH_ERROR_PARTIAL_FAILURE,\n} MH_STATUS;\n\n// The method of suspending and resuming threads.\ntypedef enum MH_THREAD_FREEZE_METHOD\n{\n    // The default Detours method.\n    MH_FREEZE_METHOD_ORIGINAL = 0,\n\n    // Currently same as MH_FREEZE_METHOD_ORIGINAL.\n    MH_FREEZE_METHOD_FAST_UNDOCUMENTED,\n\n    // Threads are not suspended and instruction pointer registers are not\n    // adjusted. Don't use this method unless you understand the implications\n    // and know that it's safe.\n    MH_FREEZE_METHOD_NONE_UNSAFE\n} MH_THREAD_FREEZE_METHOD;\n\ntypedef void(WINAPI *MH_ERROR_CALLBACK)(LPVOID pTarget, HRESULT detoursResult);\n\n// Can be passed as a parameter to MH_EnableHook, MH_DisableHook,\n// MH_QueueEnableHook or MH_QueueDisableHook.\n#define MH_ALL_HOOKS NULL\n\n#define MH_ALL_IDENTS 0\n#define MH_DEFAULT_IDENT 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    // Initializes the MinHook library. You must call this function EXACTLY ONCE\n    // at the beginning of your program.\n    MH_STATUS WINAPI MH_Initialize(VOID);\n\n    // Uninitializes the MinHook library. You must call this function EXACTLY\n    // ONCE at the end of your program.\n    MH_STATUS WINAPI MH_Uninitialize(VOID);\n\n    // Sets the method of suspending and resuming threads.\n    MH_STATUS WINAPI MH_SetThreadFreezeMethod(MH_THREAD_FREEZE_METHOD method);\n\n    // Configures the behavior of bulk operations, e.g. when a function is\n    // called with MH_ALL_HOOKS. By default, execution stops at the first error.\n    // This function allows operations to continue on error and optionally\n    // provides a callback to get notified about errors that occurred.\n    MH_STATUS WINAPI MH_SetBulkOperationMode(BOOL continueOnError, MH_ERROR_CALLBACK errorCallback);\n\n    // Creates a hook for the specified target function, in disabled state.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    //                     If not NULL, the pointer must be valid until the hook\n    //                     is removed, since its value is updated when the hook\n    //                     is enabled or disabled. Also, for that reason, the\n    //                     pointer (and not its copy) must be used to call the\n    //                     original target function.\n    MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);\n    MH_STATUS WINAPI MH_CreateHookEx(ULONG_PTR hookIdent, LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    //                     Refer to MH_CreateHook for more important details.\n    MH_STATUS WINAPI MH_CreateHookApi(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    //                     Refer to MH_CreateHook for more important details.\n    //   ppTarget    [out] A pointer to the target function, which will be used\n    //                     with other functions.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHookApiEx(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);\n\n    // Removes an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     removed in one go.\n    MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_RemoveHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Removes all disabled hooks.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    MH_STATUS WINAPI MH_RemoveDisabledHooks();\n    MH_STATUS WINAPI MH_RemoveDisabledHooksEx(ULONG_PTR hookIdent);\n\n    // Enables an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     enabled in one go.\n    MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_EnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Disables an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     disabled in one go.\n    MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_DisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Queues to enable an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     queued to be enabled.\n    MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_QueueEnableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Queues to disable an already created hook.\n    // Parameters:\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    //   pTarget     [in]  A pointer to the target function.\n    //                     If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                     queued to be disabled.\n    MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);\n    MH_STATUS WINAPI MH_QueueDisableHookEx(ULONG_PTR hookIdent, LPVOID pTarget);\n\n    // Applies all queued changes in one go.\n    //   hookIdent   [in]  A hook identifier, can be set to different values for\n    //                     different hooks to hook the same function more than\n    //                     once. Default value: MH_DEFAULT_IDENT.\n    MH_STATUS WINAPI MH_ApplyQueued(VOID);\n    MH_STATUS WINAPI MH_ApplyQueuedEx(ULONG_PTR hookIdent);\n\n    // Translates the MH_STATUS to its name as a string.\n    const char *WINAPI MH_StatusToString(MH_STATUS status);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/.editorconfig",
    "content": "root = true\n\n[*.{inc,mac,asm,s}]\n\ncharset = utf-8\n\n# Visual Studio generated .editorconfig file with C++ settings.\n\n[*.{c,c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tli}]\n\ncharset = utf-8-bom\nindent_style = spaces\nindent_size = 4\ntab_width= 4\nend_of_line = crlf\ninsert_final_newline = true\nmax_line_length = 120\n\n# Visual C++ Code Style settings\n\ncpp_generate_documentation_comments = xml\n\n# Visual C++ Formatting settings\n\ncpp_indent_braces = false\ncpp_indent_multi_line_relative_to = innermost_parenthesis\ncpp_indent_within_parentheses = align_to_parenthesis\ncpp_indent_preserve_within_parentheses = false\ncpp_indent_case_contents = true\ncpp_indent_case_labels = true\ncpp_indent_case_contents_when_block = false\ncpp_indent_lambda_braces_when_parameter = false\ncpp_indent_goto_labels = leftmost_column\ncpp_indent_preprocessor = leftmost_column\ncpp_indent_access_specifiers = false\ncpp_indent_namespace_contents = true\ncpp_indent_preserve_comments = true\ncpp_new_line_before_open_brace_namespace = new_line\ncpp_new_line_before_open_brace_type = new_line\ncpp_new_line_before_open_brace_function = new_line\ncpp_new_line_before_open_brace_block = new_line\ncpp_new_line_before_open_brace_lambda = new_line\ncpp_new_line_scope_braces_on_separate_lines = true\ncpp_new_line_close_brace_same_line_empty_type = true\ncpp_new_line_close_brace_same_line_empty_function = true\ncpp_new_line_before_catch = false\ncpp_new_line_before_else = false\ncpp_new_line_before_while_in_do_while = false\ncpp_space_before_function_open_parenthesis = remove\ncpp_space_within_parameter_list_parentheses = false\ncpp_space_between_empty_parameter_list_parentheses = false\ncpp_space_after_keywords_in_control_flow_statements = true\ncpp_space_within_control_flow_statement_parentheses = false\ncpp_space_before_lambda_open_parenthesis = false\ncpp_space_within_cast_parentheses = false\ncpp_space_after_cast_close_parenthesis = false\ncpp_space_within_expression_parentheses = false\ncpp_space_before_block_open_brace = true\ncpp_space_between_empty_braces = false\ncpp_space_before_initializer_list_open_brace = false\ncpp_space_within_initializer_list_braces = true\ncpp_space_preserve_in_initializer_list = true\ncpp_space_before_open_square_bracket = false\ncpp_space_within_square_brackets = false\ncpp_space_before_empty_square_brackets = false\ncpp_space_between_empty_square_brackets = false\ncpp_space_group_square_brackets = true\ncpp_space_within_lambda_brackets = false\ncpp_space_between_empty_lambda_brackets = false\ncpp_space_before_comma = false\ncpp_space_after_comma = true\ncpp_space_remove_around_member_operators = true\ncpp_space_before_inheritance_colon = true\ncpp_space_before_constructor_colon = true\ncpp_space_remove_before_semicolon = true\ncpp_space_after_semicolon = true\ncpp_space_remove_around_unary_operator = true\ncpp_space_around_binary_operator = insert\ncpp_space_around_assignment_operator = insert\ncpp_space_pointer_reference_alignment = ignore\ncpp_space_around_ternary_operator = insert\ncpp_use_unreal_engine_macro_formatting = false\ncpp_wrap_preserve_blocks = never\n\n# Visual C++ Include Cleanup settings\n\ncpp_include_cleanup_add_missing_error_tag_type = suggestion\ncpp_include_cleanup_remove_unused_error_tag_type = dimmed\ncpp_include_cleanup_optimize_unused_error_tag_type = suggestion\ncpp_include_cleanup_sort_after_edits = false\ncpp_sort_includes_error_tag_type = none\ncpp_sort_includes_priority_case_sensitive = false\ncpp_sort_includes_priority_style = quoted\ncpp_includes_style = default\ncpp_includes_use_forward_slash = true\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Disassembler.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Disassembler\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n *\n * Source base on Microsoft Detours:\n *\n * Microsoft Research Detours Package, Version 4.0.1\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\n#undef ASSERT\n#define ASSERT(x)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  Function:\n//      SlimDetoursCopyInstruction(PVOID pDst,\n//                                 PVOID *ppDstPool\n//                                 PVOID pSrc,\n//                                 PVOID *ppTarget,\n//                                 LONG *plExtra)\n//  Purpose:\n//      Copy a single instruction from pSrc to pDst.\n//\n//  Arguments:\n//      pDst:\n//          Destination address for the instruction.  May be NULL in which\n//          case SlimDetoursCopyInstruction is used to measure an instruction.\n//          If not NULL then the source instruction is copied to the\n//          destination instruction and any relative arguments are adjusted.\n//      ppDstPool:\n//          Destination address for the end of the constant pool.  The\n//          constant pool works backwards toward pDst.  All memory between\n//          pDst and *ppDstPool must be available for use by this function.\n//          ppDstPool may be NULL if pDst is NULL.\n//      pSrc:\n//          Source address of the instruction.\n//      ppTarget:\n//          Out parameter for any target instruction address pointed to by\n//          the instruction.  For example, a branch or a jump insruction has\n//          a target, but a load or store instruction doesn't.  A target is\n//          another instruction that may be executed as a result of this\n//          instruction.  ppTarget may be NULL.\n//      plExtra:\n//          Out parameter for the number of extra bytes needed by the\n//          instruction to reach the target.  For example, lExtra = 3 if the\n//          instruction had an 8-bit relative offset, but needs a 32-bit\n//          relative offset.\n//\n//  Returns:\n//      Returns the address of the next instruction (following in the source)\n//      instruction.  By subtracting pSrc from the return value, the caller\n//      can determinte the size of the instruction copied.\n//\n//  Comments:\n//      By following the pTarget, the caller can follow alternate\n//      instruction streams.  However, it is not always possible to determine\n//      the target based on static analysis.  For example, the destination of\n//      a jump relative to a register cannot be determined from just the\n//      instruction stream.  The output value, pTarget, can have any of the\n//      following outputs:\n//          DETOUR_INSTRUCTION_TARGET_NONE:\n//              The instruction has no targets.\n//          DETOUR_INSTRUCTION_TARGET_DYNAMIC:\n//              The instruction has a non-deterministic (dynamic) target.\n//              (i.e. the jump is to an address held in a register.)\n//          Address:   The instruction has the specified target.\n//\n//      When copying instructions, SlimDetoursCopyInstruction insures that any\n//      targets remain constant.  It does so by adjusting any IP relative\n//      offsets.\n//\n\n//////////////////////////////////////////////////// X86 and X64 Disassembler.\n//\n//  Includes full support for all x86 chips prior to the Pentium III, and some newer stuff.\n//\n#if defined(_AMD64_) || defined(_X86_)\n\ntypedef struct _DETOUR_DISASM\n{\n    BOOL    bOperandOverride;\n    BOOL    bAddressOverride;\n    BOOL    bRaxOverride; // AMD64 only\n    BOOL    bVex;\n    BOOL    bEvex;\n    BOOL    bF2;\n    BOOL    bF3; // x86 only\n    BYTE    nSegmentOverride;\n\n    PBYTE*  ppbTarget;\n    LONG*   plExtra;\n\n    LONG    lScratchExtra;\n    PBYTE   pbScratchTarget;\n    BYTE    rbScratchDst[64]; // matches or exceeds rbCode\n} DETOUR_DISASM, *PDETOUR_DISASM;\n\nstatic\nVOID\ndetour_disasm_init(\n    _Out_ PDETOUR_DISASM pDisasm,\n    _Out_opt_ PBYTE* ppbTarget,\n    _Out_opt_ LONG* plExtra)\n{\n    pDisasm->bOperandOverride = FALSE;\n    pDisasm->bAddressOverride = FALSE;\n    pDisasm->bRaxOverride = FALSE;\n    pDisasm->bF2 = FALSE;\n    pDisasm->bF3 = FALSE;\n    pDisasm->bVex = FALSE;\n    pDisasm->bEvex = FALSE;\n\n    pDisasm->ppbTarget = ppbTarget ? ppbTarget : &pDisasm->pbScratchTarget;\n    pDisasm->plExtra = plExtra ? plExtra : &pDisasm->lScratchExtra;\n\n    *pDisasm->ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_NONE;\n    *pDisasm->plExtra = 0;\n}\n\ntypedef const struct _COPYENTRY *REFCOPYENTRY;\n\ntypedef\nPBYTE(*COPYFUNC)(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc);\n\n// nFlagBits flags.\nenum\n{\n    DYNAMIC = 0x1u,\n    ADDRESS = 0x2u,\n    NOENLARGE = 0x4u,\n    RAX = 0x8u,\n};\n\n// ModR/M Flags\nenum\n{\n    SIB = 0x10u,\n    RIP = 0x20u,\n    NOTSIB = 0x0fu,\n};\n\ntypedef struct _COPYENTRY\n{\n    // Many of these fields are often ignored. See ENTRY_DataIgnored.\n    ULONG       nFixedSize : 4;     // Fixed size of opcode\n    ULONG       nFixedSize16 : 4;   // Fixed size when 16 bit operand\n    ULONG       nModOffset : 4;     // Offset to mod/rm byte (0=none)\n    ULONG       nRelOffset : 4;     // Offset to relative target.\n    ULONG       nFlagBits : 4;      // Flags for DYNAMIC, etc.\n    COPYFUNC    pfCopy;             // Function pointer.\n} COPYENTRY, *PCOPYENTRY;\n\nstatic PBYTE CopyBytes(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyBytesPrefix(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyBytesSegment(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyBytesRax(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyBytesJump(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Invalid(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy0F(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy0F78(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy0F00(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy0FB8(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy66(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE Copy67(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyF2(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyF3(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyF6(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyF7(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyFF(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyVex3(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyVex2(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyEvex(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\nstatic PBYTE CopyXop(_In_ PDETOUR_DISASM pDisasm, _In_opt_ REFCOPYENTRY pEntry, _In_ PBYTE pbDst, _In_ PBYTE pbSrc);\n\n///////////////////////////////////////////////////////// Disassembler Tables.\n//\n\nstatic const BYTE g_rbModRm[] =\n{\n    0,0,0,0, SIB | 1,RIP | 4,0,0, 0,0,0,0, SIB | 1,RIP | 4,0,0, // 0x\n    0,0,0,0, SIB | 1,RIP | 4,0,0, 0,0,0,0, SIB | 1,RIP | 4,0,0, // 1x\n    0,0,0,0, SIB | 1,RIP | 4,0,0, 0,0,0,0, SIB | 1,RIP | 4,0,0, // 2x\n    0,0,0,0, SIB | 1,RIP | 4,0,0, 0,0,0,0, SIB | 1,RIP | 4,0,0, // 3x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                         // 4x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                         // 5x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                         // 6x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                         // 7x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                         // 8x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                         // 9x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                         // Ax\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                         // Bx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                         // Cx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                         // Dx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                         // Ex\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0                          // Fx\n};\n\nenum\n{\n    eENTRY_CopyBytes1 = 0,\n    eENTRY_CopyBytes1Address,\n    eENTRY_CopyBytes1Dynamic,\n    eENTRY_CopyBytes2,\n    eENTRY_CopyBytes2Jump,\n    eENTRY_CopyBytes2CantJump,\n    eENTRY_CopyBytes2Dynamic,\n    eENTRY_CopyBytes3,\n    eENTRY_CopyBytes3Dynamic,\n    eENTRY_CopyBytes3Or5,\n    eENTRY_CopyBytes3Or5Dynamic,\n    eENTRY_CopyBytes3Or5Rax,\n    eENTRY_CopyBytes3Or5Target,\n    eENTRY_CopyBytes4,\n    eENTRY_CopyBytes5,\n    eENTRY_CopyBytes5Or7Dynamic,\n    eENTRY_CopyBytes7,\n    eENTRY_CopyBytes2Mod,\n    eENTRY_CopyBytes2ModDynamic,\n    eENTRY_CopyBytes2Mod1,\n    eENTRY_CopyBytes2ModOperand,\n    eENTRY_CopyBytes3Mod,\n    eENTRY_CopyBytes3Mod1,\n    eENTRY_CopyBytesPrefix,\n    eENTRY_CopyBytesSegment,\n    eENTRY_CopyBytesRax,\n    eENTRY_CopyF2,\n    eENTRY_CopyF3,\n    eENTRY_Copy0F,\n    eENTRY_Copy0F78,\n    eENTRY_Copy0F00,\n    eENTRY_Copy0FB8,\n    eENTRY_Copy66,\n    eENTRY_Copy67,\n    eENTRY_CopyF6,\n    eENTRY_CopyF7,\n    eENTRY_CopyFF,\n    eENTRY_CopyVex2,\n    eENTRY_CopyVex3,\n    eENTRY_CopyEvex,\n    eENTRY_CopyXop,\n    eENTRY_CopyBytesXop,\n    eENTRY_CopyBytesXop1,\n    eENTRY_CopyBytesXop4,\n    eENTRY_Invalid\n};\n\n// These macros define common uses of nFixedSize, nFixedSize16, nModOffset, nRelOffset, nFlagBits, pfCopy.\n#define ENTRY_DataIgnored           0, 0, 0, 0, 0,\n\nstatic const COPYENTRY g_rceCopyMap[] =\n{\n    /* eENTRY_CopyBytes1 */            { 1, 1, 0, 0, 0, CopyBytes },\n#if defined(_AMD64_)\n    /* eENTRY_CopyBytes1Address */     { 9, 5, 0, 0, ADDRESS, CopyBytes },\n#else\n    /* eENTRY_CopyBytes1Address */     { 5, 3, 0, 0, ADDRESS, CopyBytes },\n#endif\n    /* eENTRY_CopyBytes1Dynamic */     { 1, 1, 0, 0, DYNAMIC, CopyBytes },\n    /* eENTRY_CopyBytes2 */            { 2, 2, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes2Jump */        { ENTRY_DataIgnored CopyBytesJump },\n    /* eENTRY_CopyBytes2CantJump */    { 2, 2, 0, 1, NOENLARGE, CopyBytes },\n    /* eENTRY_CopyBytes2Dynamic */     { 2, 2, 0, 0, DYNAMIC, CopyBytes },\n    /* eENTRY_CopyBytes3 */            { 3, 3, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes3Dynamic */     { 3, 3, 0, 0, DYNAMIC, CopyBytes },\n    /* eENTRY_CopyBytes3Or5 */         { 5, 3, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes3Or5Dynamic */  { 5, 3, 0, 0, DYNAMIC, CopyBytes }, // x86 only\n#if defined(_AMD64_)\n    /* eENTRY_CopyBytes3Or5Rax */      { 5, 3, 0, 0, RAX, CopyBytes },\n    /* eENTRY_CopyBytes3Or5Target */   { 5, 5, 0, 1, 0, CopyBytes },\n#else\n    /* eENTRY_CopyBytes3Or5Rax */      { 5, 3, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes3Or5Target */   { 5, 3, 0, 1, 0, CopyBytes },\n#endif\n    /* eENTRY_CopyBytes4 */            { 4, 4, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes5 */            { 5, 5, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes5Or7Dynamic */  { 7, 5, 0, 0, DYNAMIC, CopyBytes },\n    /* eENTRY_CopyBytes7 */            { 7, 7, 0, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes2Mod */         { 2, 2, 1, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes2ModDynamic */  { 2, 2, 1, 0, DYNAMIC, CopyBytes },\n    /* eENTRY_CopyBytes2Mod1 */        { 3, 3, 1, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes2ModOperand */  { 6, 4, 1, 0, 0, CopyBytes },\n    /* eENTRY_CopyBytes3Mod */         { 3, 3, 2, 0, 0, CopyBytes }, // SSE3 0F 38 opcode modrm\n    /* eENTRY_CopyBytes3Mod1 */        { 4, 4, 2, 0, 0, CopyBytes }, // SSE3 0F 3A opcode modrm .. imm8\n    /* eENTRY_CopyBytesPrefix */       { ENTRY_DataIgnored CopyBytesPrefix },\n    /* eENTRY_CopyBytesSegment */      { ENTRY_DataIgnored CopyBytesSegment },\n    /* eENTRY_CopyBytesRax */          { ENTRY_DataIgnored CopyBytesRax },\n    /* eENTRY_CopyF2 */                { ENTRY_DataIgnored CopyF2 },\n    /* eENTRY_CopyF3 */                { ENTRY_DataIgnored CopyF3 }, // 32bit x86 only\n    /* eENTRY_Copy0F */                { ENTRY_DataIgnored Copy0F },\n    /* eENTRY_Copy0F78 */              { ENTRY_DataIgnored Copy0F78 },\n    /* eENTRY_Copy0F00 */              { ENTRY_DataIgnored Copy0F00 }, // 32bit x86 only\n    /* eENTRY_Copy0FB8 */              { ENTRY_DataIgnored Copy0FB8 }, // 32bit x86 only\n    /* eENTRY_Copy66 */                { ENTRY_DataIgnored Copy66 },\n    /* eENTRY_Copy67 */                { ENTRY_DataIgnored Copy67 },\n    /* eENTRY_CopyF6 */                { ENTRY_DataIgnored CopyF6 },\n    /* eENTRY_CopyF7 */                { ENTRY_DataIgnored CopyF7 },\n    /* eENTRY_CopyFF */                { ENTRY_DataIgnored CopyFF },\n    /* eENTRY_CopyVex2 */              { ENTRY_DataIgnored CopyVex2 },\n    /* eENTRY_CopyVex3 */              { ENTRY_DataIgnored CopyVex3 },\n    /* eENTRY_CopyEvex */              { ENTRY_DataIgnored CopyEvex }, // 62, 3 byte payload, then normal with implied prefixes like vex\n    /* eENTRY_CopyXop */               { ENTRY_DataIgnored CopyXop }, // 0x8F ... POP /0 or AMD XOP\n    /* eENTRY_CopyBytesXop */          { 5, 5, 4, 0, 0, CopyBytes }, // 0x8F xop1 xop2 opcode modrm\n    /* eENTRY_CopyBytesXop1 */         { 6, 6, 4, 0, 0, CopyBytes }, // 0x8F xop1 xop2 opcode modrm ... imm8\n    /* eENTRY_CopyBytesXop4 */         { 9, 9, 4, 0, 0, CopyBytes }, // 0x8F xop1 xop2 opcode modrm ... imm32\n    /* eENTRY_Invalid */               { ENTRY_DataIgnored Invalid }\n};\n\nstatic const BYTE g_rceCopyTable[] =\n{\n    /* 00 */ eENTRY_CopyBytes2Mod,                  // ADD /r\n    /* 01 */ eENTRY_CopyBytes2Mod,                  // ADD /r\n    /* 02 */ eENTRY_CopyBytes2Mod,                  // ADD /r\n    /* 03 */ eENTRY_CopyBytes2Mod,                  // ADD /r\n    /* 04 */ eENTRY_CopyBytes2,                     // ADD ib\n    /* 05 */ eENTRY_CopyBytes3Or5,                  // ADD iw\n#if defined(_AMD64_)\n    /* 06 */ eENTRY_Invalid,                        // Invalid\n    /* 07 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 06 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 07 */ eENTRY_CopyBytes1,                     // POP\n#endif\n    /* 08 */ eENTRY_CopyBytes2Mod,                  // OR /r\n    /* 09 */ eENTRY_CopyBytes2Mod,                  // OR /r\n    /* 0A */ eENTRY_CopyBytes2Mod,                  // OR /r\n    /* 0B */ eENTRY_CopyBytes2Mod,                  // OR /r\n    /* 0C */ eENTRY_CopyBytes2,                     // OR ib\n    /* 0D */ eENTRY_CopyBytes3Or5,                  // OR iw\n#if defined(_AMD64_)\n    /* 0E */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 0E */ eENTRY_CopyBytes1,                     // PUSH\n#endif\n    /* 0F */ eENTRY_Copy0F,                         // Extension Ops\n    /* 10 */ eENTRY_CopyBytes2Mod,                  // ADC /r\n    /* 11 */ eENTRY_CopyBytes2Mod,                  // ADC /r\n    /* 12 */ eENTRY_CopyBytes2Mod,                  // ADC /r\n    /* 13 */ eENTRY_CopyBytes2Mod,                  // ADC /r\n    /* 14 */ eENTRY_CopyBytes2,                     // ADC ib\n    /* 15 */ eENTRY_CopyBytes3Or5,                  // ADC id\n#if defined(_AMD64_)\n    /* 16 */ eENTRY_Invalid,                        // Invalid\n    /* 17 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 16 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 17 */ eENTRY_CopyBytes1,                     // POP\n#endif\n    /* 18 */ eENTRY_CopyBytes2Mod,                  // SBB /r\n    /* 19 */ eENTRY_CopyBytes2Mod,                  // SBB /r\n    /* 1A */ eENTRY_CopyBytes2Mod,                  // SBB /r\n    /* 1B */ eENTRY_CopyBytes2Mod,                  // SBB /r\n    /* 1C */ eENTRY_CopyBytes2,                     // SBB ib\n    /* 1D */ eENTRY_CopyBytes3Or5,                  // SBB id\n#if defined(_AMD64_)\n    /* 1E */ eENTRY_Invalid,                        // Invalid\n    /* 1F */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 1E */ eENTRY_CopyBytes1,                     // PUSH\n    /* 1F */ eENTRY_CopyBytes1,                     // POP\n#endif\n    /* 20 */ eENTRY_CopyBytes2Mod,                  // AND /r\n    /* 21 */ eENTRY_CopyBytes2Mod,                  // AND /r\n    /* 22 */ eENTRY_CopyBytes2Mod,                  // AND /r\n    /* 23 */ eENTRY_CopyBytes2Mod,                  // AND /r\n    /* 24 */ eENTRY_CopyBytes2,                     // AND ib\n    /* 25 */ eENTRY_CopyBytes3Or5,                  // AND id\n    /* 26 */ eENTRY_CopyBytesSegment,               // ES prefix\n#if defined(_AMD64_)\n    /* 27 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 27 */ eENTRY_CopyBytes1,                     // DAA\n#endif\n    /* 28 */ eENTRY_CopyBytes2Mod,                  // SUB /r\n    /* 29 */ eENTRY_CopyBytes2Mod,                  // SUB /r\n    /* 2A */ eENTRY_CopyBytes2Mod,                  // SUB /r\n    /* 2B */ eENTRY_CopyBytes2Mod,                  // SUB /r\n    /* 2C */ eENTRY_CopyBytes2,                     // SUB ib\n    /* 2D */ eENTRY_CopyBytes3Or5,                  // SUB id\n    /* 2E */ eENTRY_CopyBytesSegment,               // CS prefix\n#if defined(_AMD64_)\n    /* 2F */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 2F */ eENTRY_CopyBytes1,                     // DAS\n#endif\n    /* 30 */ eENTRY_CopyBytes2Mod,                  // XOR /r\n    /* 31 */ eENTRY_CopyBytes2Mod,                  // XOR /r\n    /* 32 */ eENTRY_CopyBytes2Mod,                  // XOR /r\n    /* 33 */ eENTRY_CopyBytes2Mod,                  // XOR /r\n    /* 34 */ eENTRY_CopyBytes2,                     // XOR ib\n    /* 35 */ eENTRY_CopyBytes3Or5,                  // XOR id\n    /* 36 */ eENTRY_CopyBytesSegment,               // SS prefix\n#if defined(_AMD64_)\n    /* 37 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 37 */ eENTRY_CopyBytes1,                     // AAA\n#endif\n    /* 38 */ eENTRY_CopyBytes2Mod,                  // CMP /r\n    /* 39 */ eENTRY_CopyBytes2Mod,                  // CMP /r\n    /* 3A */ eENTRY_CopyBytes2Mod,                  // CMP /r\n    /* 3B */ eENTRY_CopyBytes2Mod,                  // CMP /r\n    /* 3C */ eENTRY_CopyBytes2,                     // CMP ib\n    /* 3D */ eENTRY_CopyBytes3Or5,                  // CMP id\n    /* 3E */ eENTRY_CopyBytesSegment,               // DS prefix\n#if defined(_AMD64_)\n    /* 3F */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 3F */ eENTRY_CopyBytes1,                     // AAS\n#endif\n#if defined(_AMD64_) // For Rax Prefix\n    /* 40 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 41 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 42 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 43 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 44 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 45 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 46 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 47 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 48 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 49 */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4A */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4B */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4C */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4D */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4E */ eENTRY_CopyBytesRax,                   // Rax\n    /* 4F */ eENTRY_CopyBytesRax,                   // Rax\n#else\n    /* 40 */ eENTRY_CopyBytes1,                     // INC\n    /* 41 */ eENTRY_CopyBytes1,                     // INC\n    /* 42 */ eENTRY_CopyBytes1,                     // INC\n    /* 43 */ eENTRY_CopyBytes1,                     // INC\n    /* 44 */ eENTRY_CopyBytes1,                     // INC\n    /* 45 */ eENTRY_CopyBytes1,                     // INC\n    /* 46 */ eENTRY_CopyBytes1,                     // INC\n    /* 47 */ eENTRY_CopyBytes1,                     // INC\n    /* 48 */ eENTRY_CopyBytes1,                     // DEC\n    /* 49 */ eENTRY_CopyBytes1,                     // DEC\n    /* 4A */ eENTRY_CopyBytes1,                     // DEC\n    /* 4B */ eENTRY_CopyBytes1,                     // DEC\n    /* 4C */ eENTRY_CopyBytes1,                     // DEC\n    /* 4D */ eENTRY_CopyBytes1,                     // DEC\n    /* 4E */ eENTRY_CopyBytes1,                     // DEC\n    /* 4F */ eENTRY_CopyBytes1,                     // DEC\n#endif\n    /* 50 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 51 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 52 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 53 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 54 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 55 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 56 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 57 */ eENTRY_CopyBytes1,                     // PUSH\n    /* 58 */ eENTRY_CopyBytes1,                     // POP\n    /* 59 */ eENTRY_CopyBytes1,                     // POP\n    /* 5A */ eENTRY_CopyBytes1,                     // POP\n    /* 5B */ eENTRY_CopyBytes1,                     // POP\n    /* 5C */ eENTRY_CopyBytes1,                     // POP\n    /* 5D */ eENTRY_CopyBytes1,                     // POP\n    /* 5E */ eENTRY_CopyBytes1,                     // POP\n    /* 5F */ eENTRY_CopyBytes1,                     // POP\n#if defined(_AMD64_)\n    /* 60 */ eENTRY_Invalid,                        // Invalid\n    /* 61 */ eENTRY_Invalid,                        // Invalid\n    /* 62 */ eENTRY_CopyEvex,                       // EVEX / AVX512\n#else\n    /* 60 */ eENTRY_CopyBytes1,                     // PUSHAD\n    /* 61 */ eENTRY_CopyBytes1,                     // POPAD\n    /* 62 */ eENTRY_CopyEvex,                       // BOUND /r and EVEX / AVX512\n#endif\n    /* 63 */ eENTRY_CopyBytes2Mod,                  // 32bit ARPL /r, 64bit MOVSXD\n    /* 64 */ eENTRY_CopyBytesSegment,               // FS prefix\n    /* 65 */ eENTRY_CopyBytesSegment,               // GS prefix\n    /* 66 */ eENTRY_Copy66,                         // Operand Prefix\n    /* 67 */ eENTRY_Copy67,                         // Address Prefix\n    /* 68 */ eENTRY_CopyBytes3Or5,                  // PUSH\n    /* 69 */ eENTRY_CopyBytes2ModOperand,           // IMUL /r iz\n    /* 6A */ eENTRY_CopyBytes2,                     // PUSH\n    /* 6B */ eENTRY_CopyBytes2Mod1,                 // IMUL /r ib\n    /* 6C */ eENTRY_CopyBytes1,                     // INS\n    /* 6D */ eENTRY_CopyBytes1,                     // INS\n    /* 6E */ eENTRY_CopyBytes1,                     // OUTS/OUTSB\n    /* 6F */ eENTRY_CopyBytes1,                     // OUTS/OUTSW\n    /* 70 */ eENTRY_CopyBytes2Jump,                 // JO           // 0f80\n    /* 71 */ eENTRY_CopyBytes2Jump,                 // JNO          // 0f81\n    /* 72 */ eENTRY_CopyBytes2Jump,                 // JB/JC/JNAE   // 0f82\n    /* 73 */ eENTRY_CopyBytes2Jump,                 // JAE/JNB/JNC  // 0f83\n    /* 74 */ eENTRY_CopyBytes2Jump,                 // JE/JZ        // 0f84\n    /* 75 */ eENTRY_CopyBytes2Jump,                 // JNE/JNZ      // 0f85\n    /* 76 */ eENTRY_CopyBytes2Jump,                 // JBE/JNA      // 0f86\n    /* 77 */ eENTRY_CopyBytes2Jump,                 // JA/JNBE      // 0f87\n    /* 78 */ eENTRY_CopyBytes2Jump,                 // JS           // 0f88\n    /* 79 */ eENTRY_CopyBytes2Jump,                 // JNS          // 0f89\n    /* 7A */ eENTRY_CopyBytes2Jump,                 // JP/JPE       // 0f8a\n    /* 7B */ eENTRY_CopyBytes2Jump,                 // JNP/JPO      // 0f8b\n    /* 7C */ eENTRY_CopyBytes2Jump,                 // JL/JNGE      // 0f8c\n    /* 7D */ eENTRY_CopyBytes2Jump,                 // JGE/JNL      // 0f8d\n    /* 7E */ eENTRY_CopyBytes2Jump,                 // JLE/JNG      // 0f8e\n    /* 7F */ eENTRY_CopyBytes2Jump,                 // JG/JNLE      // 0f8f\n    /* 80 */ eENTRY_CopyBytes2Mod1,                 // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 byte reg, immediate byte\n    /* 81 */ eENTRY_CopyBytes2ModOperand,           // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 byte reg, immediate word or dword\n#if defined(_AMD64_)\n    /* 82 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 82 */ eENTRY_CopyBytes2Mod1,                 // MOV al,x\n#endif\n    /* 83 */ eENTRY_CopyBytes2Mod1,                 // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 reg, immediate byte\n    /* 84 */ eENTRY_CopyBytes2Mod,                  // TEST /r\n    /* 85 */ eENTRY_CopyBytes2Mod,                  // TEST /r\n    /* 86 */ eENTRY_CopyBytes2Mod,                  // XCHG /r @todo\n    /* 87 */ eENTRY_CopyBytes2Mod,                  // XCHG /r @todo\n    /* 88 */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 89 */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 8A */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 8B */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 8C */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 8D */ eENTRY_CopyBytes2Mod,                  // LEA /r\n    /* 8E */ eENTRY_CopyBytes2Mod,                  // MOV /r\n    /* 8F */ eENTRY_CopyXop,                        // POP /0 or AMD XOP\n    /* 90 */ eENTRY_CopyBytes1,                     // NOP\n    /* 91 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 92 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 93 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 94 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 95 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 96 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 97 */ eENTRY_CopyBytes1,                     // XCHG\n    /* 98 */ eENTRY_CopyBytes1,                     // CWDE\n    /* 99 */ eENTRY_CopyBytes1,                     // CDQ\n#if defined(_AMD64_)\n    /* 9A */ eENTRY_Invalid,                        // Invalid\n#else\n    /* 9A */ eENTRY_CopyBytes5Or7Dynamic,           // CALL cp\n#endif\n    /* 9B */ eENTRY_CopyBytes1,                     // WAIT/FWAIT\n    /* 9C */ eENTRY_CopyBytes1,                     // PUSHFD\n    /* 9D */ eENTRY_CopyBytes1,                     // POPFD\n    /* 9E */ eENTRY_CopyBytes1,                     // SAHF\n    /* 9F */ eENTRY_CopyBytes1,                     // LAHF\n    /* A0 */ eENTRY_CopyBytes1Address,              // MOV\n    /* A1 */ eENTRY_CopyBytes1Address,              // MOV\n    /* A2 */ eENTRY_CopyBytes1Address,              // MOV\n    /* A3 */ eENTRY_CopyBytes1Address,              // MOV\n    /* A4 */ eENTRY_CopyBytes1,                     // MOVS\n    /* A5 */ eENTRY_CopyBytes1,                     // MOVS/MOVSD\n    /* A6 */ eENTRY_CopyBytes1,                     // CMPS/CMPSB\n    /* A7 */ eENTRY_CopyBytes1,                     // CMPS/CMPSW\n    /* A8 */ eENTRY_CopyBytes2,                     // TEST\n    /* A9 */ eENTRY_CopyBytes3Or5,                  // TEST\n    /* AA */ eENTRY_CopyBytes1,                     // STOS/STOSB\n    /* AB */ eENTRY_CopyBytes1,                     // STOS/STOSW\n    /* AC */ eENTRY_CopyBytes1,                     // LODS/LODSB\n    /* AD */ eENTRY_CopyBytes1,                     // LODS/LODSW\n    /* AE */ eENTRY_CopyBytes1,                     // SCAS/SCASB\n    /* AF */ eENTRY_CopyBytes1,                     // SCAS/SCASD\n    /* B0 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B1 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B2 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B3 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B4 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B5 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B6 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B7 */ eENTRY_CopyBytes2,                     // MOV B0+rb\n    /* B8 */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* B9 */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BA */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BB */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BC */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BD */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BE */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* BF */ eENTRY_CopyBytes3Or5Rax,               // MOV B8+rb\n    /* C0 */ eENTRY_CopyBytes2Mod1,                 // RCL/2 ib, etc.\n    /* C1 */ eENTRY_CopyBytes2Mod1,                 // RCL/2 ib, etc.\n    /* C2 */ eENTRY_CopyBytes3,                     // RET\n    /* C3 */ eENTRY_CopyBytes1,                     // RET\n    /* C4 */ eENTRY_CopyVex3,                       // LES, VEX 3-byte opcodes.\n    /* C5 */ eENTRY_CopyVex2,                       // LDS, VEX 2-byte opcodes.\n    /* C6 */ eENTRY_CopyBytes2Mod1,                 // MOV\n    /* C7 */ eENTRY_CopyBytes2ModOperand,           // MOV/0 XBEGIN/7\n    /* C8 */ eENTRY_CopyBytes4,                     // ENTER\n    /* C9 */ eENTRY_CopyBytes1,                     // LEAVE\n    /* CA */ eENTRY_CopyBytes3Dynamic,              // RET\n    /* CB */ eENTRY_CopyBytes1Dynamic,              // RET\n    /* CC */ eENTRY_CopyBytes1Dynamic,              // INT 3\n    /* CD */ eENTRY_CopyBytes2Dynamic,              // INT ib\n#if defined(_AMD64_)\n    /* CE */ eENTRY_Invalid,                        // Invalid\n#else\n    /* CE */ eENTRY_CopyBytes1Dynamic,              // INTO\n#endif\n    /* CF */ eENTRY_CopyBytes1Dynamic,              // IRET\n    /* D0 */ eENTRY_CopyBytes2Mod,                  // RCL/2, etc.\n    /* D1 */ eENTRY_CopyBytes2Mod,                  // RCL/2, etc.\n    /* D2 */ eENTRY_CopyBytes2Mod,                  // RCL/2, etc.\n    /* D3 */ eENTRY_CopyBytes2Mod,                  // RCL/2, etc.\n#if defined(_AMD64_)\n    /* D4 */ eENTRY_Invalid,                        // Invalid\n    /* D5 */ eENTRY_Invalid,                        // Invalid\n#else\n    /* D4 */ eENTRY_CopyBytes2,                     // AAM\n    /* D5 */ eENTRY_CopyBytes2,                     // AAD\n#endif\n    /* D6 */ eENTRY_Invalid,                        // Invalid\n    /* D7 */ eENTRY_CopyBytes1,                     // XLAT/XLATB\n    /* D8 */ eENTRY_CopyBytes2Mod,                  // FADD, etc.\n    /* D9 */ eENTRY_CopyBytes2Mod,                  // F2XM1, etc.\n    /* DA */ eENTRY_CopyBytes2Mod,                  // FLADD, etc.\n    /* DB */ eENTRY_CopyBytes2Mod,                  // FCLEX, etc.\n    /* DC */ eENTRY_CopyBytes2Mod,                  // FADD/0, etc.\n    /* DD */ eENTRY_CopyBytes2Mod,                  // FFREE, etc.\n    /* DE */ eENTRY_CopyBytes2Mod,                  // FADDP, etc.\n    /* DF */ eENTRY_CopyBytes2Mod,                  // FBLD/4, etc.\n    /* E0 */ eENTRY_CopyBytes2CantJump,             // LOOPNE cb\n    /* E1 */ eENTRY_CopyBytes2CantJump,             // LOOPE cb\n    /* E2 */ eENTRY_CopyBytes2CantJump,             // LOOP cb\n    /* E3 */ eENTRY_CopyBytes2CantJump,             // JCXZ/JECXZ\n    /* E4 */ eENTRY_CopyBytes2,                     // IN ib\n    /* E5 */ eENTRY_CopyBytes2,                     // IN id\n    /* E6 */ eENTRY_CopyBytes2,                     // OUT ib\n    /* E7 */ eENTRY_CopyBytes2,                     // OUT ib\n    /* E8 */ eENTRY_CopyBytes3Or5Target,            // CALL cd\n    /* E9 */ eENTRY_CopyBytes3Or5Target,            // JMP cd\n#if defined(_AMD64_)\n    /* EA */ eENTRY_Invalid,                        // Invalid\n#else\n    /* EA */ eENTRY_CopyBytes5Or7Dynamic,           // JMP cp\n#endif\n    /* EB */ eENTRY_CopyBytes2Jump,                 // JMP cb\n    /* EC */ eENTRY_CopyBytes1,                     // IN ib\n    /* ED */ eENTRY_CopyBytes1,                     // IN id\n    /* EE */ eENTRY_CopyBytes1,                     // OUT\n    /* EF */ eENTRY_CopyBytes1,                     // OUT\n    /* F0 */ eENTRY_CopyBytesPrefix,                // LOCK prefix\n    /* F1 */ eENTRY_CopyBytes1Dynamic,              // INT1 / ICEBP somewhat documented by AMD, not by Intel\n    /* F2 */ eENTRY_CopyF2,                         // REPNE prefix\n\n    // This does presently suffice for AMD64 but it requires tracing\n    // through a bunch of code to verify and seems not worth maintaining.\n    // For x64: /* F3 */ eENTRY_CopyBytesPrefix\n    /* F3 */ eENTRY_CopyF3,                         // REPE prefix\n\n    /* F4 */ eENTRY_CopyBytes1,                     // HLT\n    /* F5 */ eENTRY_CopyBytes1,                     // CMC\n    /* F6 */ eENTRY_CopyF6,                         // TEST/0, DIV/6\n    /* F7 */ eENTRY_CopyF7,                         // TEST/0, DIV/6\n    /* F8 */ eENTRY_CopyBytes1,                     // CLC\n    /* F9 */ eENTRY_CopyBytes1,                     // STC\n    /* FA */ eENTRY_CopyBytes1,                     // CLI\n    /* FB */ eENTRY_CopyBytes1,                     // STI\n    /* FC */ eENTRY_CopyBytes1,                     // CLD\n    /* FD */ eENTRY_CopyBytes1,                     // STD\n    /* FE */ eENTRY_CopyBytes2Mod,                  // DEC/1,INC/0\n    /* FF */ eENTRY_CopyFF,                         // CALL/2\n};\n\nstatic const BYTE g_rceCopyTable0F[] =\n{\n#if defined(_X86_)\n    /* 00 */ eENTRY_Copy0F00,                       // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6/dynamic invalid/7\n#else\n    /* 00 */ eENTRY_CopyBytes2Mod,                  // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6/dynamic invalid/7\n#endif\n    /* 01 */ eENTRY_CopyBytes2Mod,                  // INVLPG/7, etc.\n    /* 02 */ eENTRY_CopyBytes2Mod,                  // LAR/r\n    /* 03 */ eENTRY_CopyBytes2Mod,                  // LSL/r\n    /* 04 */ eENTRY_Invalid,                        // _04\n    /* 05 */ eENTRY_CopyBytes1,                     // SYSCALL\n    /* 06 */ eENTRY_CopyBytes1,                     // CLTS\n    /* 07 */ eENTRY_CopyBytes1,                     // SYSRET\n    /* 08 */ eENTRY_CopyBytes1,                     // INVD\n    /* 09 */ eENTRY_CopyBytes1,                     // WBINVD\n    /* 0A */ eENTRY_Invalid,                        // _0A\n    /* 0B */ eENTRY_CopyBytes1,                     // UD2\n    /* 0C */ eENTRY_Invalid,                        // _0C\n    /* 0D */ eENTRY_CopyBytes2Mod,                  // PREFETCH\n    /* 0E */ eENTRY_CopyBytes1,                     // FEMMS (3DNow -- not in Intel documentation)\n    /* 0F */ eENTRY_CopyBytes2Mod1,                 // 3DNow Opcodes\n    /* 10 */ eENTRY_CopyBytes2Mod,                  // MOVSS MOVUPD MOVSD\n    /* 11 */ eENTRY_CopyBytes2Mod,                  // MOVSS MOVUPD MOVSD\n    /* 12 */ eENTRY_CopyBytes2Mod,                  // MOVLPD\n    /* 13 */ eENTRY_CopyBytes2Mod,                  // MOVLPD\n    /* 14 */ eENTRY_CopyBytes2Mod,                  // UNPCKLPD\n    /* 15 */ eENTRY_CopyBytes2Mod,                  // UNPCKHPD\n    /* 16 */ eENTRY_CopyBytes2Mod,                  // MOVHPD\n    /* 17 */ eENTRY_CopyBytes2Mod,                  // MOVHPD\n    /* 18 */ eENTRY_CopyBytes2Mod,                  // PREFETCHINTA...\n    /* 19 */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1A */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1B */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1C */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1D */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1E */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1F */ eENTRY_CopyBytes2Mod,                  // NOP/r multi byte nop\n    /* 20 */ eENTRY_CopyBytes2Mod,                  // MOV/r\n    /* 21 */ eENTRY_CopyBytes2Mod,                  // MOV/r\n    /* 22 */ eENTRY_CopyBytes2Mod,                  // MOV/r\n    /* 23 */ eENTRY_CopyBytes2Mod,                  // MOV/r\n#if defined(_AMD64_)\n    /* 24 */ eENTRY_Invalid,                        // _24\n#else\n    /* 24 */ eENTRY_CopyBytes2Mod,                  // MOV/r,TR TR is test register on 80386 and 80486, removed in Pentium\n#endif\n    /* 25 */ eENTRY_Invalid,                        // _25\n#if defined(_AMD64_)\n    /* 26 */ eENTRY_Invalid,                        // _26\n#else\n    /* 26 */ eENTRY_CopyBytes2Mod,                  // MOV TR/r TR is test register on 80386 and 80486, removed in Pentium\n#endif\n    /* 27 */ eENTRY_Invalid,                        // _27\n    /* 28 */ eENTRY_CopyBytes2Mod,                  // MOVAPS MOVAPD\n    /* 29 */ eENTRY_CopyBytes2Mod,                  // MOVAPS MOVAPD\n    /* 2A */ eENTRY_CopyBytes2Mod,                  // CVPI2PS &\n    /* 2B */ eENTRY_CopyBytes2Mod,                  // MOVNTPS MOVNTPD\n    /* 2C */ eENTRY_CopyBytes2Mod,                  // CVTTPS2PI &\n    /* 2D */ eENTRY_CopyBytes2Mod,                  // CVTPS2PI &\n    /* 2E */ eENTRY_CopyBytes2Mod,                  // UCOMISS UCOMISD\n    /* 2F */ eENTRY_CopyBytes2Mod,                  // COMISS COMISD\n    /* 30 */ eENTRY_CopyBytes1,                     // WRMSR\n    /* 31 */ eENTRY_CopyBytes1,                     // RDTSC\n    /* 32 */ eENTRY_CopyBytes1,                     // RDMSR\n    /* 33 */ eENTRY_CopyBytes1,                     // RDPMC\n    /* 34 */ eENTRY_CopyBytes1,                     // SYSENTER\n    /* 35 */ eENTRY_CopyBytes1,                     // SYSEXIT\n    /* 36 */ eENTRY_Invalid,                        // _36\n    /* 37 */ eENTRY_CopyBytes1,                     // GETSEC\n    /* 38 */ eENTRY_CopyBytes3Mod,                  // SSE3 Opcodes\n    /* 39 */ eENTRY_Invalid,                        // _39\n    /* 3A */ eENTRY_CopyBytes3Mod1,                  // SSE3 Opcodes\n    /* 3B */ eENTRY_Invalid,                        // _3B\n    /* 3C */ eENTRY_Invalid,                        // _3C\n    /* 3D */ eENTRY_Invalid,                        // _3D\n    /* 3E */ eENTRY_Invalid,                        // _3E\n    /* 3F */ eENTRY_Invalid,                        // _3F\n    /* 40 */ eENTRY_CopyBytes2Mod,                  // CMOVO (0F 40)\n    /* 41 */ eENTRY_CopyBytes2Mod,                  // CMOVNO (0F 41)\n    /* 42 */ eENTRY_CopyBytes2Mod,                  // CMOVB & CMOVNE (0F 42)\n    /* 43 */ eENTRY_CopyBytes2Mod,                  // CMOVAE & CMOVNB (0F 43)\n    /* 44 */ eENTRY_CopyBytes2Mod,                  // CMOVE & CMOVZ (0F 44)\n    /* 45 */ eENTRY_CopyBytes2Mod,                  // CMOVNE & CMOVNZ (0F 45)\n    /* 46 */ eENTRY_CopyBytes2Mod,                  // CMOVBE & CMOVNA (0F 46)\n    /* 47 */ eENTRY_CopyBytes2Mod,                  // CMOVA & CMOVNBE (0F 47)\n    /* 48 */ eENTRY_CopyBytes2Mod,                  // CMOVS (0F 48)\n    /* 49 */ eENTRY_CopyBytes2Mod,                  // CMOVNS (0F 49)\n    /* 4A */ eENTRY_CopyBytes2Mod,                  // CMOVP & CMOVPE (0F 4A)\n    /* 4B */ eENTRY_CopyBytes2Mod,                  // CMOVNP & CMOVPO (0F 4B)\n    /* 4C */ eENTRY_CopyBytes2Mod,                  // CMOVL & CMOVNGE (0F 4C)\n    /* 4D */ eENTRY_CopyBytes2Mod,                  // CMOVGE & CMOVNL (0F 4D)\n    /* 4E */ eENTRY_CopyBytes2Mod,                  // CMOVLE & CMOVNG (0F 4E)\n    /* 4F */ eENTRY_CopyBytes2Mod,                  // CMOVG & CMOVNLE (0F 4F)\n    /* 50 */ eENTRY_CopyBytes2Mod,                  // MOVMSKPD MOVMSKPD\n    /* 51 */ eENTRY_CopyBytes2Mod,                  // SQRTPS &\n    /* 52 */ eENTRY_CopyBytes2Mod,                  // RSQRTTS RSQRTPS\n    /* 53 */ eENTRY_CopyBytes2Mod,                  // RCPPS RCPSS\n    /* 54 */ eENTRY_CopyBytes2Mod,                  // ANDPS ANDPD\n    /* 55 */ eENTRY_CopyBytes2Mod,                  // ANDNPS ANDNPD\n    /* 56 */ eENTRY_CopyBytes2Mod,                  // ORPS ORPD\n    /* 57 */ eENTRY_CopyBytes2Mod,                  // XORPS XORPD\n    /* 58 */ eENTRY_CopyBytes2Mod,                  // ADDPS &\n    /* 59 */ eENTRY_CopyBytes2Mod,                  // MULPS &\n    /* 5A */ eENTRY_CopyBytes2Mod,                  // CVTPS2PD &\n    /* 5B */ eENTRY_CopyBytes2Mod,                  // CVTDQ2PS &\n    /* 5C */ eENTRY_CopyBytes2Mod,                  // SUBPS &\n    /* 5D */ eENTRY_CopyBytes2Mod,                  // MINPS &\n    /* 5E */ eENTRY_CopyBytes2Mod,                  // DIVPS &\n    /* 5F */ eENTRY_CopyBytes2Mod,                  // MASPS &\n    /* 60 */ eENTRY_CopyBytes2Mod,                  // PUNPCKLBW/r\n    /* 61 */ eENTRY_CopyBytes2Mod,                  // PUNPCKLWD/r\n    /* 62 */ eENTRY_CopyBytes2Mod,                  // PUNPCKLWD/r\n    /* 63 */ eENTRY_CopyBytes2Mod,                  // PACKSSWB/r\n    /* 64 */ eENTRY_CopyBytes2Mod,                  // PCMPGTB/r\n    /* 65 */ eENTRY_CopyBytes2Mod,                  // PCMPGTW/r\n    /* 66 */ eENTRY_CopyBytes2Mod,                  // PCMPGTD/r\n    /* 67 */ eENTRY_CopyBytes2Mod,                  // PACKUSWB/r\n    /* 68 */ eENTRY_CopyBytes2Mod,                  // PUNPCKHBW/r\n    /* 69 */ eENTRY_CopyBytes2Mod,                  // PUNPCKHWD/r\n    /* 6A */ eENTRY_CopyBytes2Mod,                  // PUNPCKHDQ/r\n    /* 6B */ eENTRY_CopyBytes2Mod,                  // PACKSSDW/r\n    /* 6C */ eENTRY_CopyBytes2Mod,                  // PUNPCKLQDQ\n    /* 6D */ eENTRY_CopyBytes2Mod,                  // PUNPCKHQDQ\n    /* 6E */ eENTRY_CopyBytes2Mod,                  // MOVD/r\n    /* 6F */ eENTRY_CopyBytes2Mod,                  // MOV/r\n    /* 70 */ eENTRY_CopyBytes2Mod1,                 // PSHUFW/r ib\n    /* 71 */ eENTRY_CopyBytes2Mod1,                 // PSLLW/6 ib,PSRAW/4 ib,PSRLW/2 ib\n    /* 72 */ eENTRY_CopyBytes2Mod1,                 // PSLLD/6 ib,PSRAD/4 ib,PSRLD/2 ib\n    /* 73 */ eENTRY_CopyBytes2Mod1,                 // PSLLQ/6 ib,PSRLQ/2 ib\n    /* 74 */ eENTRY_CopyBytes2Mod,                  // PCMPEQB/r\n    /* 75 */ eENTRY_CopyBytes2Mod,                  // PCMPEQW/r\n    /* 76 */ eENTRY_CopyBytes2Mod,                  // PCMPEQD/r\n    /* 77 */ eENTRY_CopyBytes1,                     // EMMS\n    // extrq/insertq require mode=3 and are followed by two immediate bytes\n    /* 78 */ eENTRY_Copy0F78,                       // VMREAD/r, 66/EXTRQ/r/ib/ib, F2/INSERTQ/r/ib/ib\n    // extrq/insertq require mod=3, therefore eENTRY_CopyBytes2, but it ends up the same\n    /* 79 */ eENTRY_CopyBytes2Mod,                  // VMWRITE/r, 66/EXTRQ/r, F2/INSERTQ/r\n    /* 7A */ eENTRY_Invalid,                        // _7A\n    /* 7B */ eENTRY_Invalid,                        // _7B\n    /* 7C */ eENTRY_CopyBytes2Mod,                  // HADDPS\n    /* 7D */ eENTRY_CopyBytes2Mod,                  // HSUBPS\n    /* 7E */ eENTRY_CopyBytes2Mod,                  // MOVD/r\n    /* 7F */ eENTRY_CopyBytes2Mod,                  // MOV/r\n    /* 80 */ eENTRY_CopyBytes3Or5Target,            // JO\n    /* 81 */ eENTRY_CopyBytes3Or5Target,            // JNO\n    /* 82 */ eENTRY_CopyBytes3Or5Target,            // JB,JC,JNAE\n    /* 83 */ eENTRY_CopyBytes3Or5Target,            // JAE,JNB,JNC\n    /* 84 */ eENTRY_CopyBytes3Or5Target,            // JE,JZ,JZ\n    /* 85 */ eENTRY_CopyBytes3Or5Target,            // JNE,JNZ\n    /* 86 */ eENTRY_CopyBytes3Or5Target,            // JBE,JNA\n    /* 87 */ eENTRY_CopyBytes3Or5Target,            // JA,JNBE\n    /* 88 */ eENTRY_CopyBytes3Or5Target,            // JS\n    /* 89 */ eENTRY_CopyBytes3Or5Target,            // JNS\n    /* 8A */ eENTRY_CopyBytes3Or5Target,            // JP,JPE\n    /* 8B */ eENTRY_CopyBytes3Or5Target,            // JNP,JPO\n    /* 8C */ eENTRY_CopyBytes3Or5Target,            // JL,NGE\n    /* 8D */ eENTRY_CopyBytes3Or5Target,            // JGE,JNL\n    /* 8E */ eENTRY_CopyBytes3Or5Target,            // JLE,JNG\n    /* 8F */ eENTRY_CopyBytes3Or5Target,            // JG,JNLE\n    /* 90 */ eENTRY_CopyBytes2Mod,                  // CMOVO (0F 40)\n    /* 91 */ eENTRY_CopyBytes2Mod,                  // CMOVNO (0F 41)\n    /* 92 */ eENTRY_CopyBytes2Mod,                  // CMOVB & CMOVC & CMOVNAE (0F 42)\n    /* 93 */ eENTRY_CopyBytes2Mod,                  // CMOVAE & CMOVNB & CMOVNC (0F 43)\n    /* 94 */ eENTRY_CopyBytes2Mod,                  // CMOVE & CMOVZ (0F 44)\n    /* 95 */ eENTRY_CopyBytes2Mod,                  // CMOVNE & CMOVNZ (0F 45)\n    /* 96 */ eENTRY_CopyBytes2Mod,                  // CMOVBE & CMOVNA (0F 46)\n    /* 97 */ eENTRY_CopyBytes2Mod,                  // CMOVA & CMOVNBE (0F 47)\n    /* 98 */ eENTRY_CopyBytes2Mod,                  // CMOVS (0F 48)\n    /* 99 */ eENTRY_CopyBytes2Mod,                  // CMOVNS (0F 49)\n    /* 9A */ eENTRY_CopyBytes2Mod,                  // CMOVP & CMOVPE (0F 4A)\n    /* 9B */ eENTRY_CopyBytes2Mod,                  // CMOVNP & CMOVPO (0F 4B)\n    /* 9C */ eENTRY_CopyBytes2Mod,                  // CMOVL & CMOVNGE (0F 4C)\n    /* 9D */ eENTRY_CopyBytes2Mod,                  // CMOVGE & CMOVNL (0F 4D)\n    /* 9E */ eENTRY_CopyBytes2Mod,                  // CMOVLE & CMOVNG (0F 4E)\n    /* 9F */ eENTRY_CopyBytes2Mod,                  // CMOVG & CMOVNLE (0F 4F)\n    /* A0 */ eENTRY_CopyBytes1,                     // PUSH\n    /* A1 */ eENTRY_CopyBytes1,                     // POP\n    /* A2 */ eENTRY_CopyBytes1,                     // CPUID\n    /* A3 */ eENTRY_CopyBytes2Mod,                  // BT  (0F A3)\n    /* A4 */ eENTRY_CopyBytes2Mod1,                 // SHLD\n    /* A5 */ eENTRY_CopyBytes2Mod,                  // SHLD\n    /* A6 */ eENTRY_CopyBytes2Mod,                  // XBTS\n    /* A7 */ eENTRY_CopyBytes2Mod,                  // IBTS\n    /* A8 */ eENTRY_CopyBytes1,                     // PUSH\n    /* A9 */ eENTRY_CopyBytes1,                     // POP\n    /* AA */ eENTRY_CopyBytes1,                     // RSM\n    /* AB */ eENTRY_CopyBytes2Mod,                  // BTS (0F AB)\n    /* AC */ eENTRY_CopyBytes2Mod1,                 // SHRD\n    /* AD */ eENTRY_CopyBytes2Mod,                  // SHRD\n\n    // 0F AE mod76=mem mod543=0 fxsave\n    // 0F AE mod76=mem mod543=1 fxrstor\n    // 0F AE mod76=mem mod543=2 ldmxcsr\n    // 0F AE mod76=mem mod543=3 stmxcsr\n    // 0F AE mod76=mem mod543=4 xsave\n    // 0F AE mod76=mem mod543=5 xrstor\n    // 0F AE mod76=mem mod543=6 saveopt\n    // 0F AE mod76=mem mod543=7 clflush\n    // 0F AE mod76=11b mod543=5 lfence\n    // 0F AE mod76=11b mod543=6 mfence\n    // 0F AE mod76=11b mod543=7 sfence\n    // F3 0F AE mod76=11b mod543=0 rdfsbase\n    // F3 0F AE mod76=11b mod543=1 rdgsbase\n    // F3 0F AE mod76=11b mod543=2 wrfsbase\n    // F3 0F AE mod76=11b mod543=3 wrgsbase\n    /* AE */ eENTRY_CopyBytes2Mod,                  // fxsave fxrstor ldmxcsr stmxcsr xsave xrstor saveopt clflush lfence mfence sfence rdfsbase rdgsbase wrfsbase wrgsbase\n    /* AF */ eENTRY_CopyBytes2Mod,                  // IMUL (0F AF)\n    /* B0 */ eENTRY_CopyBytes2Mod,                  // CMPXCHG (0F B0)\n    /* B1 */ eENTRY_CopyBytes2Mod,                  // CMPXCHG (0F B1)\n    /* B2 */ eENTRY_CopyBytes2Mod,                  // LSS/r\n    /* B3 */ eENTRY_CopyBytes2Mod,                  // BTR (0F B3)\n    /* B4 */ eENTRY_CopyBytes2Mod,                  // LFS/r\n    /* B5 */ eENTRY_CopyBytes2Mod,                  // LGS/r\n    /* B6 */ eENTRY_CopyBytes2Mod,                  // MOVZX/r\n    /* B7 */ eENTRY_CopyBytes2Mod,                  // MOVZX/r\n#if defined(_X86_)\n    /* B8 */ eENTRY_Copy0FB8,                       // jmpe f3/popcnt\n#else\n    /* B8 */ eENTRY_CopyBytes2Mod,                  // f3/popcnt\n#endif\n    /* B9 */ eENTRY_Invalid,                        // _B9\n    /* BA */ eENTRY_CopyBytes2Mod1,                 // BT & BTC & BTR & BTS (0F BA)\n    /* BB */ eENTRY_CopyBytes2Mod,                  // BTC (0F BB)\n    /* BC */ eENTRY_CopyBytes2Mod,                  // BSF (0F BC)\n    /* BD */ eENTRY_CopyBytes2Mod,                  // BSR (0F BD)\n    /* BE */ eENTRY_CopyBytes2Mod,                  // MOVSX/r\n    /* BF */ eENTRY_CopyBytes2Mod,                  // MOVSX/r\n    /* C0 */ eENTRY_CopyBytes2Mod,                  // XADD/r\n    /* C1 */ eENTRY_CopyBytes2Mod,                  // XADD/r\n    /* C2 */ eENTRY_CopyBytes2Mod1,                 // CMPPS &\n    /* C3 */ eENTRY_CopyBytes2Mod,                  // MOVNTI\n    /* C4 */ eENTRY_CopyBytes2Mod1,                 // PINSRW /r ib\n    /* C5 */ eENTRY_CopyBytes2Mod1,                 // PEXTRW /r ib\n    /* C6 */ eENTRY_CopyBytes2Mod1,                 // SHUFPS & SHUFPD\n    /* C7 */ eENTRY_CopyBytes2Mod,                  // CMPXCHG8B (0F C7)\n    /* C8 */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* C9 */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* CA */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* CB */ eENTRY_CopyBytes1,                     // CVTPD2PI BSWAP 0F C8 + rd\n    /* CC */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* CD */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* CE */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* CF */ eENTRY_CopyBytes1,                     // BSWAP 0F C8 + rd\n    /* D0 */ eENTRY_CopyBytes2Mod,                  // ADDSUBPS (untestd)\n    /* D1 */ eENTRY_CopyBytes2Mod,                  // PSRLW/r\n    /* D2 */ eENTRY_CopyBytes2Mod,                  // PSRLD/r\n    /* D3 */ eENTRY_CopyBytes2Mod,                  // PSRLQ/r\n    /* D4 */ eENTRY_CopyBytes2Mod,                  // PADDQ\n    /* D5 */ eENTRY_CopyBytes2Mod,                  // PMULLW/r\n    /* D6 */ eENTRY_CopyBytes2Mod,                  // MOVDQ2Q / MOVQ2DQ\n    /* D7 */ eENTRY_CopyBytes2Mod,                  // PMOVMSKB/r\n    /* D8 */ eENTRY_CopyBytes2Mod,                  // PSUBUSB/r\n    /* D9 */ eENTRY_CopyBytes2Mod,                  // PSUBUSW/r\n    /* DA */ eENTRY_CopyBytes2Mod,                  // PMINUB/r\n    /* DB */ eENTRY_CopyBytes2Mod,                  // PAND/r\n    /* DC */ eENTRY_CopyBytes2Mod,                  // PADDUSB/r\n    /* DD */ eENTRY_CopyBytes2Mod,                  // PADDUSW/r\n    /* DE */ eENTRY_CopyBytes2Mod,                  // PMAXUB/r\n    /* DF */ eENTRY_CopyBytes2Mod,                  // PANDN/r\n    /* E0 */ eENTRY_CopyBytes2Mod,                  // PAVGB\n    /* E1 */ eENTRY_CopyBytes2Mod,                  // PSRAW/r\n    /* E2 */ eENTRY_CopyBytes2Mod,                  // PSRAD/r\n    /* E3 */ eENTRY_CopyBytes2Mod,                  // PAVGW\n    /* E4 */ eENTRY_CopyBytes2Mod,                  // PMULHUW/r\n    /* E5 */ eENTRY_CopyBytes2Mod,                  // PMULHW/r\n    /* E6 */ eENTRY_CopyBytes2Mod,                  // CTDQ2PD &\n    /* E7 */ eENTRY_CopyBytes2Mod,                  // MOVNTQ\n    /* E8 */ eENTRY_CopyBytes2Mod,                  // PSUBB/r\n    /* E9 */ eENTRY_CopyBytes2Mod,                  // PSUBW/r\n    /* EA */ eENTRY_CopyBytes2Mod,                  // PMINSW/r\n    /* EB */ eENTRY_CopyBytes2Mod,                  // POR/r\n    /* EC */ eENTRY_CopyBytes2Mod,                  // PADDSB/r\n    /* ED */ eENTRY_CopyBytes2Mod,                  // PADDSW/r\n    /* EE */ eENTRY_CopyBytes2Mod,                  // PMAXSW /r\n    /* EF */ eENTRY_CopyBytes2Mod,                  // PXOR/r\n    /* F0 */ eENTRY_CopyBytes2Mod,                  // LDDQU\n    /* F1 */ eENTRY_CopyBytes2Mod,                  // PSLLW/r\n    /* F2 */ eENTRY_CopyBytes2Mod,                  // PSLLD/r\n    /* F3 */ eENTRY_CopyBytes2Mod,                  // PSLLQ/r\n    /* F4 */ eENTRY_CopyBytes2Mod,                  // PMULUDQ/r\n    /* F5 */ eENTRY_CopyBytes2Mod,                  // PMADDWD/r\n    /* F6 */ eENTRY_CopyBytes2Mod,                  // PSADBW/r\n    /* F7 */ eENTRY_CopyBytes2Mod,                  // MASKMOVQ\n    /* F8 */ eENTRY_CopyBytes2Mod,                  // PSUBB/r\n    /* F9 */ eENTRY_CopyBytes2Mod,                  // PSUBW/r\n    /* FA */ eENTRY_CopyBytes2Mod,                  // PSUBD/r\n    /* FB */ eENTRY_CopyBytes2Mod,                  // FSUBQ/r\n    /* FC */ eENTRY_CopyBytes2Mod,                  // PADDB/r\n    /* FD */ eENTRY_CopyBytes2Mod,                  // PADDW/r\n    /* FE */ eENTRY_CopyBytes2Mod,                  // PADDD/r\n    /* FF */ eENTRY_Invalid,                        // _FF\n};\n\n_STATIC_ASSERT(_countof(g_rbModRm) == 256 &&\n               _countof(g_rceCopyMap) == eENTRY_Invalid + 1 &&\n               _countof(g_rceCopyTable) == 256 &&\n               _countof(g_rceCopyTable0F) == 256);\n\n/////////////////////////////////////////////////////////// Disassembler Code.\n//\n\nstatic\nPBYTE\nAdjustTarget(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc,\n    UINT cbOp,\n    UINT cbTargetOffset,\n    UINT cbTargetSize)\n{\n    PBYTE pbTarget = NULL;\n    LONG_PTR nOldOffset;\n    LONG_PTR nNewOffset;\n    PVOID pvTargetAddr = &pbDst[cbTargetOffset];\n\n    switch (cbTargetSize)\n    {\n        case 1:\n            nOldOffset = *(signed char*)pvTargetAddr;\n            break;\n        case 2:\n            nOldOffset = *(UNALIGNED SHORT*)pvTargetAddr;\n            break;\n        case 4:\n            nOldOffset = *(UNALIGNED LONG*)pvTargetAddr;\n            break;\n#if defined(_AMD64_)\n        case 8:\n            nOldOffset = *(UNALIGNED LONGLONG*)pvTargetAddr;\n            break;\n#endif\n        default:\n            ASSERT(!\"cbTargetSize is invalid.\");\n            nOldOffset = 0;\n            break;\n    }\n\n    pbTarget = pbSrc + cbOp + nOldOffset;\n    nNewOffset = nOldOffset - (LONG_PTR)(pbDst - pbSrc);\n\n    switch (cbTargetSize)\n    {\n        case 1:\n            *(CHAR*)pvTargetAddr = (CHAR)nNewOffset;\n            if (nNewOffset < SCHAR_MIN || nNewOffset > SCHAR_MAX)\n            {\n                *pDisasm->plExtra = sizeof(ULONG) - 1;\n            }\n            break;\n        case 2:\n            *(UNALIGNED SHORT*)pvTargetAddr = (SHORT)nNewOffset;\n            if (nNewOffset < SHRT_MIN || nNewOffset > SHRT_MAX)\n            {\n                *pDisasm->plExtra = sizeof(ULONG) - 2;\n            }\n            break;\n        case 4:\n            *(UNALIGNED LONG*)pvTargetAddr = (LONG)nNewOffset;\n            if (nNewOffset < LONG_MIN || nNewOffset > LONG_MAX)\n            {\n                *pDisasm->plExtra = sizeof(ULONG) - 4;\n            }\n            break;\n#if defined(_AMD64_)\n        case 8:\n            *(UNALIGNED LONGLONG*)pvTargetAddr = nNewOffset;\n            break;\n#endif\n    }\n#if defined(_AMD64_)\n    // When we are only computing size, source and dest can be\n    // far apart, distance not encodable in 32bits. Ok.\n    // At least still check the lower 32bits.\n\n    if (pbDst >= pDisasm->rbScratchDst && pbDst < (sizeof(pDisasm->rbScratchDst) + pDisasm->rbScratchDst))\n    {\n        ASSERT((((size_t)pbDst + cbOp + nNewOffset) & 0xFFFFFFFF) == (((size_t)pbTarget) & 0xFFFFFFFF));\n    } else\n#endif\n    {\n        ASSERT(pbDst + cbOp + nNewOffset == pbTarget);\n    }\n    return pbTarget;\n}\n\nstatic\nPBYTE\nInvalid(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pDisasm);\n    UNREFERENCED_PARAMETER(pEntry);\n    UNREFERENCED_PARAMETER(pbDst);\n    UNREFERENCED_PARAMETER(pbSrc);\n\n    return NULL;\n}\n\nstatic\nPBYTE\nCopyInstruction(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // Configure scratch areas if real areas are not available.\n    if (NULL == pbDst)\n    {\n        pbDst = pDisasm->rbScratchDst;\n    }\n\n    // Figure out how big the instruction is, do the appropriate copy,\n    // and figure out what the target of the instruction is if any.\n    //\n    const COPYENTRY* ce = &g_rceCopyMap[g_rceCopyTable[pbSrc[0]]];\n    return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyBytes(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UINT nBytesFixed;\n\n    if (pDisasm->bVex || pDisasm->bEvex)\n    {\n        ASSERT(pEntry->nFlagBits == 0);\n        ASSERT(pEntry->nFixedSize == pEntry->nFixedSize16);\n    }\n\n    UINT const nModOffset = pEntry->nModOffset;\n    UINT const nFlagBits = pEntry->nFlagBits;\n    UINT const nFixedSize = pEntry->nFixedSize;\n    UINT const nFixedSize16 = pEntry->nFixedSize16;\n\n    if (nFlagBits & ADDRESS)\n    {\n        nBytesFixed = pDisasm->bAddressOverride ? nFixedSize16 : nFixedSize;\n    }\n#if defined(_AMD64_)\n    // REX.W trumps 66\n    else if (pDisasm->bRaxOverride)\n    {\n        nBytesFixed = nFixedSize + ((nFlagBits & RAX) ? 4 : 0);\n    }\n#endif\n    else\n    {\n        nBytesFixed = pDisasm->bOperandOverride ? nFixedSize16 : nFixedSize;\n    }\n\n    UINT nBytes = nBytesFixed;\n    UINT nRelOffset = pEntry->nRelOffset;\n    UINT cbTarget = nBytes - nRelOffset;\n    if (nModOffset > 0)\n    {\n        ASSERT(nRelOffset == 0);\n        BYTE const bModRm = pbSrc[nModOffset];\n        BYTE const bFlags = g_rbModRm[bModRm];\n\n        nBytes += bFlags & NOTSIB;\n\n        if (bFlags & SIB)\n        {\n            BYTE const bSib = pbSrc[nModOffset + 1];\n\n            if ((bSib & 0x07) == 0x05)\n            {\n                if ((bModRm & 0xc0) == 0x00)\n                {\n                    nBytes += 4;\n                } else if ((bModRm & 0xc0) == 0x40)\n                {\n                    nBytes += 1;\n                } else if ((bModRm & 0xc0) == 0x80)\n                {\n                    nBytes += 4;\n                }\n            }\n            cbTarget = nBytes - nRelOffset;\n        }\n#if defined(_AMD64_)\n        else if (bFlags & RIP)\n        {\n            nRelOffset = nModOffset + 1;\n            cbTarget = 4;\n        }\n#endif\n    }\n    CopyMemory(pbDst, pbSrc, nBytes);\n\n    if (nRelOffset)\n    {\n        *pDisasm->ppbTarget = AdjustTarget(pDisasm, pbDst, pbSrc, nBytes, nRelOffset, cbTarget);\n#if defined(_AMD64_)\n        if (pEntry->nRelOffset == 0)\n        {\n            // This is a data target, not a code target, so we shouldn't return it.\n            *pDisasm->ppbTarget = NULL;\n        }\n#endif\n    }\n    if (nFlagBits & NOENLARGE)\n    {\n        *pDisasm->plExtra = -*pDisasm->plExtra;\n    }\n    if (nFlagBits & DYNAMIC)\n    {\n        *pDisasm->ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n    return pbSrc + nBytes;\n}\n\nstatic\nPBYTE\nCopyBytesPrefix(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst, _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pbDst[0] = pbSrc[0];\n\n    REFCOPYENTRY ce = &g_rceCopyMap[g_rceCopyTable[pbSrc[1]]];\n    return ce->pfCopy(pDisasm, ce, pbDst + 1, pbSrc + 1);\n}\n\nstatic\nPBYTE\nCopyBytesSegment(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pDisasm->nSegmentOverride = pbSrc[0];\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyBytesRax(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // AMD64 only\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    if (pbSrc[0] & 0x8)\n    {\n        pDisasm->bRaxOverride = TRUE;\n    }\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyBytesJump(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    PVOID pvSrcAddr = &pbSrc[1];\n    PVOID pvDstAddr = NULL;\n    LONG_PTR nOldOffset = (LONG_PTR)(*(signed char*)pvSrcAddr);\n    LONG_PTR nNewOffset = 0;\n\n    *pDisasm->ppbTarget = pbSrc + 2 + nOldOffset;\n\n    if (pbSrc[0] == 0xeb)\n    {\n        pbDst[0] = 0xe9;\n        pvDstAddr = &pbDst[1];\n        nNewOffset = nOldOffset - ((pbDst - pbSrc) + 3);\n        *(UNALIGNED LONG*)pvDstAddr = (LONG)nNewOffset;\n\n        *pDisasm->plExtra = 3;\n        return pbSrc + 2;\n    }\n\n    ASSERT(pbSrc[0] >= 0x70 && pbSrc[0] <= 0x7f);\n\n    pbDst[0] = 0x0f;\n    pbDst[1] = 0x80 | (pbSrc[0] & 0xf);\n    pvDstAddr = &pbDst[2];\n    nNewOffset = nOldOffset - ((pbDst - pbSrc) + 4);\n    *(UNALIGNED LONG*)pvDstAddr = (LONG)nNewOffset;\n\n    *pDisasm->plExtra = 4;\n    return pbSrc + 2;\n}\n\n////////////////////////////////////////////////////// Individual Bytes Codes.\n//\nstatic\nPBYTE\nCopy0F(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pbDst[0] = pbSrc[0];\n\n    REFCOPYENTRY ce = &g_rceCopyMap[g_rceCopyTable0F[pbSrc[1]]];\n    return ce->pfCopy(pDisasm, ce, pbDst + 1, pbSrc + 1);\n}\n\nstatic\nPBYTE\nCopy0F78(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // vmread, 66/extrq, F2/insertq\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    const BYTE vmread = /* 78 */ eENTRY_CopyBytes2Mod;\n    const BYTE extrq_insertq = /* 78 */ eENTRY_CopyBytes4;\n\n    ASSERT(!(pDisasm->bF2 && pDisasm->bOperandOverride));\n\n    // For insertq and presumably despite documentation extrq, mode must be 11, not checked.\n    // insertq/extrq/78 are followed by two immediate bytes, and given mode == 11, mod/rm byte is always one byte,\n    // and the 0x78 makes 4 bytes (not counting the 66/F2/F which are accounted for elsewhere)\n\n    REFCOPYENTRY ce = &g_rceCopyMap[((pDisasm->bF2 || pDisasm->bOperandOverride) ? extrq_insertq : vmread)];\n\n    return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopy0F00(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // jmpe is 32bit x86 only\n    // Notice that the sizes are the same either way, but jmpe is marked as \"dynamic\".\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    const BYTE other = /* B8 */ eENTRY_CopyBytes2Mod; // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6 invalid/7\n    const BYTE jmpe = /* B8 */ eENTRY_CopyBytes2ModDynamic; // jmpe/6 x86-on-IA64 syscalls\n\n    REFCOPYENTRY ce = &g_rceCopyMap[(((6 << 3) == ((7 << 3) & pbSrc[1])) ? jmpe : other)];\n    return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopy0FB8(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // jmpe is 32bit x86 only\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    const BYTE popcnt = /* B8 */ eENTRY_CopyBytes2Mod;\n    const BYTE jmpe = /* B8 */ eENTRY_CopyBytes3Or5Dynamic; // jmpe x86-on-IA64 syscalls\n    REFCOPYENTRY ce = &g_rceCopyMap[pDisasm->bF3 ? popcnt : jmpe];\n    return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopy66(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // Operand-size override prefix\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pDisasm->bOperandOverride = TRUE;\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopy67(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // Address size override prefix\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pDisasm->bAddressOverride = TRUE;\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyF2(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pDisasm->bF2 = TRUE;\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyF3(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // x86 only\n\n    UNREFERENCED_PARAMETER(pEntry);\n\n    pDisasm->bF3 = TRUE;\n    return CopyBytesPrefix(pDisasm, NULL, pbDst, pbSrc);\n}\n\nstatic\nPBYTE\nCopyF6(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    // TEST BYTE /0\n    if (0x00 == (0x38 & pbSrc[1]))\n    {\n        // reg(bits 543) of ModR/M == 0\n        REFCOPYENTRY ce = /* f6 */ &g_rceCopyMap[eENTRY_CopyBytes2Mod1];\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    } else\n    {\n        // DIV /6\n        // IDIV /7\n        // IMUL /5\n        // MUL /4\n        // NEG /3\n        // NOT /2\n        REFCOPYENTRY ce = /* f6 */ &g_rceCopyMap[eENTRY_CopyBytes2Mod];\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    }\n}\n\nstatic\nPBYTE\nCopyF7(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    // TEST WORD /0\n    if (0x00 == (0x38 & pbSrc[1]))\n    {\n        // reg(bits 543) of ModR/M == 0\n        REFCOPYENTRY ce = /* f7 */ &g_rceCopyMap[eENTRY_CopyBytes2ModOperand];\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    } else\n    {\n        // DIV /6\n        // IDIV /7\n        // IMUL /5\n        // MUL /4\n        // NEG /3\n        // NOT /2\n        REFCOPYENTRY ce = /* f7 */ &g_rceCopyMap[eENTRY_CopyBytes2Mod];\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    }\n}\n\nstatic\nPBYTE\nCopyFF(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n{\n    // INC /0\n    // DEC /1\n    // CALL /2\n    // CALL /3\n    // JMP /4\n    // JMP /5\n    // PUSH /6\n    // invalid/7\n    UNREFERENCED_PARAMETER(pEntry);\n\n    REFCOPYENTRY ce = /* ff */ &g_rceCopyMap[eENTRY_CopyBytes2Mod];\n    PBYTE pbOut = ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n\n    BYTE const b1 = pbSrc[1];\n\n    if (0x15 == b1 || 0x25 == b1)\n    {\n        // CALL [], JMP []\n#if defined(_AMD64_)\n        // All segments but FS and GS are equivalent.\n        if (pDisasm->nSegmentOverride != 0x64 && pDisasm->nSegmentOverride != 0x65)\n#else\n        if (pDisasm->nSegmentOverride == 0 || pDisasm->nSegmentOverride == 0x2E)\n#endif\n        {\n#if defined(_AMD64_)\n            INT32 offset = *(UNALIGNED INT32*) & pbSrc[2];\n            PBYTE* ppbTarget = (PBYTE*)(pbSrc + 6 + offset);\n#else\n            PBYTE* ppbTarget = (PBYTE*)(SIZE_T) * (UNALIGNED ULONG*) & pbSrc[2];\n#endif\n            // This can access violate on random bytes. Use DetourSetCodeModule.\n            *pDisasm->ppbTarget = *ppbTarget;\n        } else\n        {\n            *pDisasm->ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n        }\n    } else if (0x10 == (0x30 & b1) || // CALL /2 or /3  --> reg(bits 543) of ModR/M == 010 or 011\n               0x20 == (0x30 & b1))\n    {\n        // JMP /4 or /5 --> reg(bits 543) of ModR/M == 100 or 101\n        *pDisasm->ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n    return pbOut;\n}\n\nstatic\nPBYTE\nCopyVexEvexCommon(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE m,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc,\n    BYTE p,\n    _In_opt_ BYTE fp16)\n// m is first instead of last in the hopes of pbDst/pbSrc being\n// passed along efficiently in the registers they were already in.\n{\n    REFCOPYENTRY ce;\n\n    switch (p & 3)\n    {\n        case 0:\n            break;\n        case 1:\n            pDisasm->bOperandOverride = TRUE;\n            break;\n        case 2:\n            pDisasm->bF3 = TRUE;\n            break;\n        case 3:\n            pDisasm->bF2 = TRUE;\n            break;\n    }\n\n    // see https://software.intel.com/content/www/us/en/develop/download/intel-avx512-fp16-architecture-specification.html\n    switch (m | fp16)\n    {\n        case 1:\n            ce = &g_rceCopyMap[g_rceCopyTable0F[pbSrc[0]]];\n            return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n        case 5: // fallthrough\n        case 6: // fallthrough\n        case 2:\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytes2Mod], pbDst, pbSrc); /* 38 ceF38 */\n        case 3:\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytes2Mod1], pbDst, pbSrc); /* 3A ceF3A */\n        default:\n            return Invalid(pDisasm, &g_rceCopyMap[eENTRY_Invalid], pbDst, pbSrc); /* C4 ceInvalid */\n    }\n}\n\nstatic\nPBYTE\nCopyVexCommon(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE m,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n// m is first instead of last in the hopes of pbDst/pbSrc being\n// passed along efficiently in the registers they were already in.\n{\n    pDisasm->bVex = TRUE;\n    return CopyVexEvexCommon(pDisasm, m, pbDst, pbSrc, (BYTE)(pbSrc[-1] & 3), 0);\n}\n\nstatic\nPBYTE\nCopyVex3(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n// 3 byte VEX prefix 0xC4\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n#if defined(_X86_)\n    if ((pbSrc[1] & 0xC0) != 0xC0)\n    {\n        REFCOPYENTRY ce = &g_rceCopyMap[eENTRY_CopyBytes2Mod]; /* C4 ceLES */\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    }\n#endif\n    pbDst[0] = pbSrc[0];\n    pbDst[1] = pbSrc[1];\n    pbDst[2] = pbSrc[2];\n#if defined(_AMD64_)\n    pDisasm->bRaxOverride |= !!(pbSrc[2] & 0x80); // w in last byte, see CopyBytesRax\n#else\n    //\n    // TODO\n    //\n    // Usually the VEX.W bit changes the size of a general purpose register and is ignored for 32bit.\n    // Sometimes it is an opcode extension.\n    // Look in the Intel manual, in the instruction-by-instruction reference, for \".W1\",\n    // without nearby wording saying it is ignored for 32bit.\n    // For example: \"VFMADD132PD/VFMADD213PD/VFMADD231PD Fused Multiply-Add of Packed Double-Precision Floating-Point Values\".\n    //\n    // Then, go through each such case and determine if W0 vs. W1 affect the size of the instruction. Probably not.\n    // Look for the same encoding but with \"W1\" changed to \"W0\".\n    // Here is one such pairing:\n    // VFMADD132PD/VFMADD213PD/VFMADD231PD Fused Multiply-Add of Packed Double-Precision Floating-Point Values\n    //\n    // VEX.DDS.128.66.0F38.W1 98 /r A V/V FMA Multiply packed double-precision floating-point values\n    // from xmm0 and xmm2/mem, add to xmm1 and\n    // put result in xmm0.\n    // VFMADD132PD xmm0, xmm1, xmm2/m128\n    //\n    // VFMADD132PS/VFMADD213PS/VFMADD231PS Fused Multiply-Add of Packed Single-Precision Floating-Point Values\n    // VEX.DDS.128.66.0F38.W0 98 /r A V/V FMA Multiply packed single-precision floating-point values\n    // from xmm0 and xmm2/mem, add to xmm1 and put\n    // result in xmm0.\n    // VFMADD132PS xmm0, xmm1, xmm2/m128\n    //\n#endif\n    return CopyVexCommon(pDisasm, pbSrc[1] & 0x1F, pbDst + 3, pbSrc + 3);\n}\n\nstatic\nPBYTE\nCopyVex2(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n// 2 byte VEX prefix 0xC5\n{\n#if defined(_X86_)\n    if ((pbSrc[1] & 0xC0) != 0xC0)\n    {\n        REFCOPYENTRY ce = &g_rceCopyMap[eENTRY_CopyBytes2Mod]; /* C5 ceLDS */\n        return ce->pfCopy(pDisasm, ce, pbDst, pbSrc);\n    }\n#endif\n    pbDst[0] = pbSrc[0];\n    pbDst[1] = pbSrc[1];\n    return CopyVexCommon(pDisasm, 1, pbDst + 2, pbSrc + 2);\n}\n\nstatic\nPBYTE\nCopyEvex(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n// 62, 3 byte payload, x86 with implied prefixes like Vex\n// for 32bit, mode 0xC0 else fallback to bound /r\n{\n    // NOTE: Intel and Wikipedia number these differently.\n    // Intel says 0-2, Wikipedia says 1-3.\n\n    BYTE const p0 = pbSrc[1];\n\n#if defined(_X86_)\n    if ((p0 & 0xC0) != 0xC0)\n    {\n        return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytes2Mod], pbDst, pbSrc); /* 62 ceBound */\n    }\n#endif\n\n    // This could also be handled by default in CopyVexEvexCommon\n    // if 4u changed to 4|8.\n    if (p0 & 8u)\n        return Invalid(pDisasm, &g_rceCopyMap[eENTRY_Invalid], pbDst, pbSrc); /* 62 ceInvalid */\n\n    BYTE const p1 = pbSrc[2];\n\n    if ((p1 & 0x04) != 0x04)\n        return Invalid(pDisasm, &g_rceCopyMap[eENTRY_Invalid], pbDst, pbSrc); /* 62 ceInvalid */\n\n    // Copy 4 byte prefix.\n    *(UNALIGNED ULONG*)pbDst = *(UNALIGNED ULONG*)pbSrc;\n\n    pDisasm->bEvex = TRUE;\n\n#if defined(_AMD64_)\n    pDisasm->bRaxOverride |= !!(p1 & 0x80); // w\n#endif\n\n    return CopyVexEvexCommon(pDisasm, p0 & 3u, pbDst + 4, pbSrc + 4, p1 & 3u, p0 & 4u);\n}\n\nstatic\nPBYTE\nCopyXop(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ REFCOPYENTRY pEntry,\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc)\n/* 3 byte AMD XOP prefix 0x8F\nbyte0: 0x8F\nbyte1: RXBmmmmm\nbyte2: WvvvvLpp\nbyte3: opcode\nmmmmm >= 8, else pop\nmmmmm only otherwise defined for 8, 9, A.\npp is like VEX but only instructions with 0 are defined\n*/\n{\n    UNREFERENCED_PARAMETER(pEntry);\n\n    BYTE const m = (BYTE)(pbSrc[1] & 0x1F);\n    ASSERT(m <= 10);\n    switch (m)\n    {\n        case 8: // modrm with 8bit immediate\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytesXop1], pbDst, pbSrc); /* 8F ceXop1 */\n\n        case 9: // modrm with no immediate\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytesXop], pbDst, pbSrc); /* 8F ceXop */\n\n        case 10: // modrm with 32bit immediate\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytesXop4], pbDst, pbSrc); /* 8F ceXop4 */\n\n        default:\n            return CopyBytes(pDisasm, &g_rceCopyMap[eENTRY_CopyBytes2Mod], pbDst, pbSrc); /* 8F cePop */\n    }\n}\n\n#endif // defined(_AMD64_) || defined(_X86_)\n\n#if defined(_ARM64_)\n\ntypedef struct _DETOUR_DISASM\n{\n    PBYTE   pbTarget;\n    BYTE    rbScratchDst[128]; // matches or exceeds rbCode\n} DETOUR_DISASM, *PDETOUR_DISASM;\n\nstatic\nVOID\ndetour_disasm_init(\n    _Out_ PDETOUR_DISASM pDisasm)\n{\n    pDisasm->pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_NONE;\n}\n\ntypedef\nBYTE(*COPYFUNC)(\n    _In_ PBYTE pbDst,\n    _In_ PBYTE pbSrc);\n\n#define c_LR        30          // The register number for the Link Register\n#define c_SP        31          // The register number for the Stack Pointer\n#define c_NOP       0xd503201f  // A nop instruction\n#define c_BREAK     (0xd4200000 | (0xf000 << 5)) // A break instruction\n\n//\n// Problematic instructions:\n//\n// ADR     0ll10000 hhhhhhhh hhhhhhhh hhhddddd  & 0x9f000000 == 0x10000000  (l = low, h = high, d = Rd)\n// ADRP    1ll10000 hhhhhhhh hhhhhhhh hhhddddd  & 0x9f000000 == 0x90000000  (l = low, h = high, d = Rd)\n//\n// B.cond  01010100 iiiiiiii iiiiiiii iii0cccc  & 0xff000010 == 0x54000000  (i = delta = SignExtend(imm19:00, 64), c = cond)\n//\n// B       000101ii iiiiiiii iiiiiiii iiiiiiii  & 0xfc000000 == 0x14000000  (i = delta = SignExtend(imm26:00, 64))\n// BL      100101ii iiiiiiii iiiiiiii iiiiiiii  & 0xfc000000 == 0x94000000  (i = delta = SignExtend(imm26:00, 64))\n//\n// CBNZ    z0110101 iiiiiiii iiiiiiii iiittttt  & 0x7f000000 == 0x35000000  (z = size, i = delta = SignExtend(imm19:00, 64), t = Rt)\n// CBZ     z0110100 iiiiiiii iiiiiiii iiittttt  & 0x7f000000 == 0x34000000  (z = size, i = delta = SignExtend(imm19:00, 64), t = Rt)\n//\n// LDR Wt  00011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x18000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Xt  01011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x58000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDRSW   10011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x98000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// PRFM    11011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0xd8000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR St  00011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x1c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Dt  01011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x5c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Qt  10011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x9c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR inv 11011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0xdc000000  (i = SignExtend(imm19:00, 64), t = Rt)\n//\n// TBNZ    z0110111 bbbbbiii iiiiiiii iiittttt  & 0x7f000000 == 0x37000000  (z = size, b = bitnum, i = SignExtend(imm14:00, 64), t = Rt)\n// TBZ     z0110110 bbbbbiii iiiiiiii iiittttt  & 0x7f000000 == 0x36000000  (z = size, b = bitnum, i = SignExtend(imm14:00, 64), t = Rt)\n//\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rd : 5;       // Destination register\n        DWORD Rn : 5;       // Source register\n        DWORD Imm12 : 12;   // 12-bit immediate\n        DWORD Shift : 2;    // shift (must be 0 or 1)\n        DWORD Opcode1 : 7;  // Must be 0010001 == 0x11\n        DWORD Size : 1;     // 0 = 32-bit, 1 = 64-bit\n    } s;\n} AddImm12;\n\nstatic\nDWORD\nAddImm12_Assemble(\n    DWORD size,\n    DWORD rd,\n    DWORD rn,\n    ULONG imm,\n    DWORD shift)\n{\n    AddImm12 temp;\n    temp.s.Rd = rd;\n    temp.s.Rn = rn;\n    temp.s.Imm12 = imm & 0xfff;\n    temp.s.Shift = shift;\n    temp.s.Opcode1 = 0x11;\n    temp.s.Size = size;\n    return temp.Assembled;\n}\n\nstatic\nDWORD\nAddImm12_AssembleAdd32(\n    DWORD rd,\n    DWORD rn,\n    ULONG imm,\n    DWORD shift)\n{\n    return AddImm12_Assemble(0, rd, rn, imm, shift);\n}\n\nstatic\nDWORD\nAddImm12_AssembleAdd64(\n    DWORD rd,\n    DWORD rn,\n    ULONG imm,\n    DWORD shift)\n{\n    return AddImm12_Assemble(1, rd, rn, imm, shift);\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rd : 5;       // Destination register\n        DWORD Imm19 : 19;   // 19-bit upper immediate\n        DWORD Opcode1 : 5;  // Must be 10000 == 0x10\n        DWORD Imm2 : 2;     // 2-bit lower immediate\n        DWORD Type : 1;     // 0 = ADR, 1 = ADRP\n    } s;\n} Adr19;\n\ninline\nLONG\nAdr19_Imm(\n    Adr19* p)\n{\n    DWORD Imm = (p->s.Imm19 << 2) | p->s.Imm2;\n    return (LONG)(Imm << 11) >> 11;\n}\n\nstatic\nDWORD\nAdr19_Assemble(\n    DWORD type,\n    DWORD rd,\n    LONG delta)\n{\n    Adr19 temp;\n    temp.s.Rd = rd;\n    temp.s.Imm19 = (delta >> 2) & 0x7ffff;\n    temp.s.Opcode1 = 0x10;\n    temp.s.Imm2 = delta & 3;\n    temp.s.Type = type;\n    return temp.Assembled;\n}\n\nstatic\nDWORD\nAdr19_AssembleAdr(\n    DWORD rd,\n    LONG delta)\n{\n    return Adr19_Assemble(0, rd, delta);\n}\n\nstatic\nDWORD\nAdr19_AssembleAdrp(\n    DWORD rd,\n    LONG delta)\n{\n    return Adr19_Assemble(1, rd, delta);\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Condition : 4;    // Condition\n        DWORD Opcode1 : 1;      // Must be 0\n        DWORD Imm19 : 19;       // 19-bit immediate\n        DWORD Opcode2 : 8;      // Must be 01010100 == 0x54\n    } s;\n} Bcc19;\n\ninline\nLONG\nBcc19_Imm(\n    Bcc19* p)\n{\n    return (LONG)(p->s.Imm19 << 13) >> 11;\n}\n\nstatic\nDWORD\nBcc19_AssembleBcc(\n    DWORD condition,\n    LONG delta)\n{\n    Bcc19 temp;\n    temp.s.Condition = condition;\n    temp.s.Opcode1 = 0;\n    temp.s.Imm19 = delta >> 2;\n    temp.s.Opcode2 = 0x54;\n    return temp.Assembled;\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Imm26 : 26;   // 26-bit immediate\n        DWORD Opcode1 : 5;  // Must be 00101 == 0x5\n        DWORD Link : 1;     // 0 = B, 1 = BL\n    } s;\n} Branch26;\n\ninline\nLONG\nBranch26_Imm(\n    Branch26* p)\n{\n    return (LONG)(p->s.Imm26 << 6) >> 4;\n}\n\nstatic\nDWORD\nBranch26_Assemble(\n    DWORD link,\n    LONG delta)\n{\n    Branch26 temp;\n    temp.s.Imm26 = delta >> 2;\n    temp.s.Opcode1 = 0x5;\n    temp.s.Link = link;\n    return temp.Assembled;\n}\n\nstatic\nDWORD\nBranch26_AssembleB(\n    LONG delta)\n{\n    return Branch26_Assemble(0, delta);\n}\n\nstatic\nDWORD\nBranch26_AssembleBl(\n    LONG delta)\n{\n    return Branch26_Assemble(1, delta);\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Opcode1 : 5;  // Must be 00000 == 0\n        DWORD Rn : 5;       // Register number\n        DWORD Opcode2 : 22; // Must be 1101011000011111000000 == 0x3587c0 for Br\n                            //                                   0x358fc0 for Brl\n    } s;\n} Br;\n\nstatic\nDWORD\nBr_Assemble(\n    DWORD rn,\n    BOOL link)\n{\n    Br temp;\n    temp.s.Opcode1 = 0;\n    temp.s.Rn = rn;\n    temp.s.Opcode2 = 0x3587c0;\n    if (link)\n        temp.Assembled |= 0x00200000;\n    return temp.Assembled;\n}\n\nstatic\nDWORD\nBr_AssembleBr(\n    DWORD rn)\n{\n    return Br_Assemble(rn, FALSE);\n}\n\nstatic\nDWORD\nBr_AssembleBrl(\n    DWORD rn)\n{\n    return Br_Assemble(rn, TRUE);\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rt : 5;       // Register to test\n        DWORD Imm19 : 19;   // 19-bit immediate\n        DWORD Nz : 1;       // 0 = CBZ, 1 = CBNZ\n        DWORD Opcode1 : 6;  // Must be 011010 == 0x1a\n        DWORD Size : 1;     // 0 = 32-bit, 1 = 64-bit\n    } s;\n} Cbz19;\n\ninline\nLONG\nCbz19_Imm(\n    Cbz19* p)\n{\n    return (LONG)(p->s.Imm19 << 13) >> 11;\n}\n\nstatic\nDWORD\nCbz19_Assemble(\n    DWORD size,\n    DWORD nz,\n    DWORD rt,\n    LONG delta)\n{\n    Cbz19 temp;\n    temp.s.Rt = rt;\n    temp.s.Imm19 = delta >> 2;\n    temp.s.Nz = nz;\n    temp.s.Opcode1 = 0x1a;\n    temp.s.Size = size;\n    return temp.Assembled;\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rt : 5;       // Destination register\n        DWORD Imm19 : 19;   // 19-bit immediate\n        DWORD Opcode1 : 2;  // Must be 0\n        DWORD FpNeon : 1;   // 0 = LDR Wt/LDR Xt/LDRSW/PRFM, 1 = LDR St/LDR Dt/LDR Qt\n        DWORD Opcode2 : 3;  // Must be 011 = 3\n        DWORD Size : 2;     // 00 = LDR Wt/LDR St, 01 = LDR Xt/LDR Dt, 10 = LDRSW/LDR Qt, 11 = PRFM/invalid\n    } s;\n} LdrLit19;\n\ninline\nLONG\nLdrLit19_Imm(\n    LdrLit19* p)\n{\n    return (LONG)(p->s.Imm19 << 13) >> 11;\n}\n\nstatic\nDWORD\nLdrLit19_Assemble(\n    DWORD size,\n    DWORD fpneon,\n    DWORD rt,\n    LONG delta)\n{\n    LdrLit19 temp;\n    temp.s.Rt = rt;\n    temp.s.Imm19 = delta >> 2;\n    temp.s.Opcode1 = 0;\n    temp.s.FpNeon = fpneon;\n    temp.s.Opcode2 = 3;\n    temp.s.Size = size;\n    return temp.Assembled;\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rt : 5;       // Destination register\n        DWORD Rn : 5;       // Base register\n        DWORD Imm12 : 12;   // 12-bit immediate\n        DWORD Opcode1 : 1;  // Must be 1 == 1\n        DWORD Opc : 1;      // Part of size\n        DWORD Opcode2 : 6;  // Must be 111101 == 0x3d\n        DWORD Size : 2;     // Size (0=8-bit, 1=16-bit, 2=32-bit, 3=64-bit, 4=128-bit)\n    } s;\n} LdrFpNeonImm9;\n\nstatic\nDWORD\nLdrFpNeonImm9_Assemble(\n    DWORD size,\n    DWORD rt,\n    DWORD rn,\n    ULONG imm)\n{\n    LdrFpNeonImm9 temp;\n    temp.s.Rt = rt;\n    temp.s.Rn = rn;\n    temp.s.Imm12 = imm;\n    temp.s.Opcode1 = 1;\n    temp.s.Opc = size >> 2;\n    temp.s.Opcode2 = 0x3d;\n    temp.s.Size = size & 3;\n    return temp.Assembled;\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rd : 5;       // Destination register\n        DWORD Imm16 : 16;   // Immediate\n        DWORD Shift : 2;    // Shift amount (0=0, 1=16, 2=32, 3=48)\n        DWORD Opcode : 6;   // Must be 100101 == 0x25\n        DWORD Type : 2;     // 0 = MOVN, 1 = reserved, 2 = MOVZ, 3 = MOVK\n        DWORD Size : 1;     // 0 = 32-bit, 1 = 64-bit\n    } s;\n} Mov16;\n\nstatic\nDWORD\nMov16_Assemble(\n    DWORD size,\n    DWORD type,\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    Mov16 temp;\n    temp.s.Rd = rd;\n    temp.s.Imm16 = imm;\n    temp.s.Shift = shift;\n    temp.s.Opcode = 0x25;\n    temp.s.Type = type;\n    temp.s.Size = size;\n    return temp.Assembled;\n}\n\nstatic\nDWORD\nMov16_AssembleMovn32(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(0, 0, rd, imm, shift);\n}\n\nstatic\nDWORD\nMov16_AssembleMovn64(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(1, 0, rd, imm, shift);\n}\n\nstatic\nDWORD\nMov16_AssembleMovz32(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(0, 2, rd, imm, shift);\n}\n\nstatic\nDWORD\nMov16_AssembleMovz64(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(1, 2, rd, imm, shift);\n}\n\nstatic\nDWORD\nMov16_AssembleMovk32(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(0, 3, rd, imm, shift);\n}\n\nstatic\nDWORD\nMov16_AssembleMovk64(\n    DWORD rd,\n    DWORD imm,\n    DWORD shift)\n{\n    return Mov16_Assemble(1, 3, rd, imm, shift);\n}\n\ntypedef union\n{\n    DWORD Assembled;\n    struct\n    {\n        DWORD Rt : 5;       // Register to test\n        DWORD Imm14 : 14;   // 14-bit immediate\n        DWORD Bit : 5;      // 5-bit index\n        DWORD Nz : 1;       // 0 = TBZ, 1 = TBNZ\n        DWORD Opcode1 : 6;  // Must be 011011 == 0x1b\n        DWORD Size : 1;     // 0 = 32-bit, 1 = 64-bit\n    } s;\n} Tbz14;\n\ninline\nLONG\nTbz14_Imm(\n    Tbz14* p)\n{\n    return (LONG)(p->s.Imm14 << 18) >> 16;\n}\n\nstatic\nDWORD\nTbz14_Assemble(\n    DWORD size,\n    DWORD nz,\n    DWORD rt,\n    DWORD bit,\n    LONG delta)\n{\n    Tbz14 temp;\n    temp.s.Rt = rt;\n    temp.s.Imm14 = delta >> 2;\n    temp.s.Bit = bit;\n    temp.s.Nz = nz;\n    temp.s.Opcode1 = 0x1b;\n    temp.s.Size = size;\n    return temp.Assembled;\n}\n\ninline\nULONG\nGetInstruction(\n    _In_ BYTE* pSource)\n{\n    return *(PULONG)pSource;\n}\n\nstatic\nPULONG\nEmitInstruction(\n    _In_ PULONG pDstInst,\n    ULONG instruction)\n{\n    *pDstInst = instruction;\n    return pDstInst + 1;\n}\n\nstatic\nPULONG\nEmitMovImmediate(\n    PULONG pDstInst,\n    BYTE rd,\n    UINT64 immediate)\n{\n    DWORD piece[4];\n    piece[3] = (DWORD)((immediate >> 48) & 0xffff);\n    piece[2] = (DWORD)((immediate >> 32) & 0xffff);\n    piece[1] = (DWORD)((immediate >> 16) & 0xffff);\n    piece[0] = (DWORD)((immediate >> 0) & 0xffff);\n\n    // special case: MOVN with 32-bit dest\n    if (piece[3] == 0 && piece[2] == 0 && piece[1] == 0xffff)\n    {\n        pDstInst = EmitInstruction(pDstInst, Mov16_AssembleMovn32(rd, piece[0] ^ 0xffff, 0));\n    }\n    // MOVN/MOVZ with 64-bit dest\n    else\n    {\n        int zero_pieces = (piece[3] == 0x0000) + (piece[2] == 0x0000) + (piece[1] == 0x0000) + (piece[0] == 0x0000);\n        int ffff_pieces = (piece[3] == 0xffff) + (piece[2] == 0xffff) + (piece[1] == 0xffff) + (piece[0] == 0xffff);\n        DWORD defaultPiece = (ffff_pieces > zero_pieces) ? 0xffff : 0x0000;\n        BOOL first = TRUE;\n        for (int pieceNum = 3; pieceNum >= 0; pieceNum--)\n        {\n            DWORD curPiece = piece[pieceNum];\n            if (curPiece != defaultPiece || (pieceNum == 0 && first))\n            {\n                if (first)\n                {\n                    if (defaultPiece == 0xffff)\n                    {\n                        pDstInst = EmitInstruction(pDstInst, Mov16_AssembleMovn64(rd, curPiece ^ 0xffff, pieceNum));\n                    } else\n                    {\n                        pDstInst = EmitInstruction(pDstInst, Mov16_AssembleMovz64(rd, curPiece, pieceNum));\n                    }\n                    first = FALSE;\n                } else\n                {\n                    pDstInst = EmitInstruction(pDstInst, Mov16_AssembleMovk64(rd, curPiece, pieceNum));\n                }\n            }\n        }\n    }\n\n    return pDstInst;\n}\n\nstatic\nBYTE\nPureCopy32(\n    _In_ PBYTE pSource,\n    _In_ PBYTE pDest)\n{\n    *(ULONG*)pDest = *(ULONG*)pSource;\n    return sizeof(ULONG);\n}\n\n/////////////////////////////////////////////////////////// Disassembler Code.\n//\n\nstatic\nBYTE\nCopyAdr(\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    Adr19 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    // ADR case\n    if (decoded.s.Type == 0)\n    {\n        BYTE* pTarget = pSource + Adr19_Imm(&decoded);\n        LONG64 delta = pTarget - pDest;\n        LONG64 deltaPage = ((ULONG_PTR)pTarget >> 12) - ((ULONG_PTR)pDest >> 12);\n\n        // output as ADR\n        if (delta >= -(1 << 20) && delta < (1 << 20))\n        {\n            pDstInst = EmitInstruction(pDstInst, Adr19_AssembleAdr(decoded.s.Rd, (LONG)delta));\n        }\n        // output as ADRP; ADD\n        else if (deltaPage >= -(1 << 20) && (deltaPage < (1 << 20)))\n        {\n            pDstInst = EmitInstruction(pDstInst, Adr19_AssembleAdrp(decoded.s.Rd, (LONG)deltaPage));\n            pDstInst = EmitInstruction(pDstInst, AddImm12_AssembleAdd32(decoded.s.Rd,\n                                                                        decoded.s.Rd,\n                                                                        ((ULONG)(ULONG_PTR)pTarget) & 0xfff,\n                                                                        0));\n        }\n        // output as immediate move\n        else\n        {\n            pDstInst = EmitMovImmediate(pDstInst, (BYTE)decoded.s.Rd, (ULONG_PTR)pTarget);\n        }\n    }\n    // ADRP case\n    else\n    {\n        BYTE* pTarget = (BYTE*)((((ULONG_PTR)pSource >> 12) + Adr19_Imm(&decoded)) << 12);\n        LONG64 deltaPage = ((ULONG_PTR)pTarget >> 12) - ((ULONG_PTR)pDest >> 12);\n\n        // output as ADRP\n        if (deltaPage >= -(1 << 20) && (deltaPage < (1 << 20)))\n        {\n            pDstInst = EmitInstruction(pDstInst, Adr19_AssembleAdrp(decoded.s.Rd, (LONG)deltaPage));\n        }\n        // output as immediate move\n        else\n        {\n            pDstInst = EmitMovImmediate(pDstInst, (BYTE)decoded.s.Rd, (ULONG_PTR)pTarget);\n        }\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nBYTE\nCopyBcc(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    Bcc19 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + Bcc19_Imm(&decoded);\n    pDisasm->pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as BCC\n    if (delta >= -(1 << 20) && delta < (1 << 20))\n    {\n        pDstInst = EmitInstruction(pDstInst, Bcc19_AssembleBcc(decoded.s.Condition, (LONG)delta));\n    }\n    // output as BCC <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        pDstInst = EmitInstruction(pDstInst, Bcc19_AssembleBcc(decoded.s.Condition ^ 1, 8));\n        pDstInst = EmitInstruction(pDstInst, Branch26_AssembleB((LONG)delta4));\n    }\n    // output as MOV x17, Target; BCC <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        pDstInst = EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        pDstInst = EmitInstruction(pDstInst, Bcc19_AssembleBcc(decoded.s.Condition ^ 1, 8));\n        pDstInst = EmitInstruction(pDstInst, Br_AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nBYTE\nCopyB_or_Bl(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction,\n    BOOL link)\n{\n    Branch26 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + Branch26_Imm(&decoded);\n    pDisasm->pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n\n    // output as B or BRL\n    if (delta >= -(1 << 27) && (delta < (1 << 27)))\n    {\n        pDstInst = EmitInstruction(pDstInst, Branch26_Assemble(link, (LONG)delta));\n    }\n    // output as MOV x17, Target; BR or BRL x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        pDstInst = EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        pDstInst = EmitInstruction(pDstInst, Br_Assemble(17, link));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nBYTE\nCopyB(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    return CopyB_or_Bl(pDisasm, pSource, pDest, instruction, FALSE);\n}\n\nstatic\nBYTE\nCopyBl(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    return CopyB_or_Bl(pDisasm, pSource, pDest, instruction, FALSE);\n}\n\nstatic\nBYTE\nCopyCbz(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    Cbz19 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + Cbz19_Imm(&decoded);\n    pDisasm->pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as CBZ/NZ\n    if (delta >= -(1 << 20) && delta < (1 << 20))\n    {\n        pDstInst = EmitInstruction(pDstInst, Cbz19_Assemble(decoded.s.Size, decoded.s.Nz, decoded.s.Rt, (LONG)delta));\n    }\n    // output as CBNZ/Z <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        pDstInst = EmitInstruction(pDstInst, Cbz19_Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, 8));\n        pDstInst = EmitInstruction(pDstInst, Branch26_AssembleB((LONG)delta4));\n    }\n    // output as MOV x17, Target; CBNZ/Z <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        pDstInst = EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        pDstInst = EmitInstruction(pDstInst, Cbz19_Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, 8));\n        pDstInst = EmitInstruction(pDstInst, Br_AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nBYTE\nCopyTbz(\n    _In_ PDETOUR_DISASM pDisasm,\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    Tbz14 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + Tbz14_Imm(&decoded);\n    pDisasm->pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as TBZ/NZ\n    if (delta >= -(1 << 13) && delta < (1 << 13))\n    {\n        pDstInst = EmitInstruction(pDstInst, Tbz14_Assemble(decoded.s.Size,\n                                                            decoded.s.Nz,\n                                                            decoded.s.Rt,\n                                                            decoded.s.Bit,\n                                                            (LONG)delta));\n    }\n    // output as TBNZ/Z <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        pDstInst = EmitInstruction(pDstInst, Tbz14_Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, decoded.s.Bit, 8));\n        pDstInst = EmitInstruction(pDstInst, Branch26_AssembleB((LONG)delta4));\n    }\n    // output as MOV x17, Target; TBNZ/Z <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        pDstInst = EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        pDstInst = EmitInstruction(pDstInst, Tbz14_Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, decoded.s.Bit, 8));\n        pDstInst = EmitInstruction(pDstInst, Br_AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nBYTE\nCopyLdrLiteral(\n    BYTE* pSource,\n    BYTE* pDest,\n    ULONG instruction)\n{\n    LdrLit19 decoded = { .Assembled = instruction };\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + LdrLit19_Imm(&decoded);\n    LONG64 delta = pTarget - pDest;\n\n    // output as LDR\n    if (delta >= -(1 << 21) && delta < (1 << 21))\n    {\n        pDstInst = EmitInstruction(pDstInst, LdrLit19_Assemble(decoded.s.Size, decoded.s.FpNeon, decoded.s.Rt, (LONG)delta));\n    }\n\n    // output as move immediate\n    else if (decoded.s.FpNeon == 0)\n    {\n        UINT64 value = 0;\n        switch (decoded.s.Size)\n        {\n            case 0: value = *(ULONG*)pTarget; break;\n            case 1: value = *(UINT64*)pTarget; break;\n            case 2: value = *(LONG*)pTarget; break;\n        }\n        pDstInst = EmitMovImmediate(pDstInst, (BYTE)decoded.s.Rt, value);\n    }\n    // FP/NEON register: compute address in x17 and load from there (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        pDstInst = EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        pDstInst = EmitInstruction(pDstInst, LdrFpNeonImm9_Assemble(2 + decoded.s.Size, decoded.s.Rt, 17, 0));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nstatic\nPBYTE\nCopyInstruction(\n    _In_ PDETOUR_DISASM pDisasm,\n    _In_opt_ PBYTE pDst,\n    _In_ PBYTE pSrc,\n    PBYTE* ppTarget,\n    LONG* plExtra)\n{\n    if (pDst == NULL)\n    {\n        pDst = pDisasm->rbScratchDst;\n    }\n\n    DWORD Instruction = GetInstruction(pSrc);\n\n    ULONG CopiedSize;\n    if ((Instruction & 0x1f000000) == 0x10000000)\n    {\n        CopiedSize = CopyAdr(pSrc, pDst, Instruction);\n    } else if ((Instruction & 0xff000010) == 0x54000000)\n    {\n        CopiedSize = CopyBcc(pDisasm, pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x7c000000) == 0x14000000)\n    {\n        CopiedSize = CopyB_or_Bl(pDisasm, pSrc, pDst, Instruction, (Instruction & 0x80000000) != 0);\n    } else if ((Instruction & 0x7e000000) == 0x34000000)\n    {\n        CopiedSize = CopyCbz(pDisasm, pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x7e000000) == 0x36000000)\n    {\n        CopiedSize = CopyTbz(pDisasm, pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x3b000000) == 0x18000000)\n    {\n        CopiedSize = CopyLdrLiteral(pSrc, pDst, Instruction);\n    } else\n    {\n        CopiedSize = PureCopy32(pSrc, pDst);\n    }\n\n    // If the target is needed, store our target\n    if (ppTarget)\n    {\n        *ppTarget = pDisasm->pbTarget;\n    }\n    if (plExtra)\n    {\n        *plExtra = CopiedSize - sizeof(DWORD);\n    }\n\n    return pSrc + 4;\n}\n\n#endif // defined(_ARM64_)\n\nPVOID\nNTAPI\nSlimDetoursCopyInstruction(\n    _In_opt_ PVOID pDst,\n    _In_ PVOID pSrc,\n    _Out_opt_ PVOID* ppTarget,\n    _Out_opt_ LONG* plExtra)\n{\n    DETOUR_DISASM Disasm;\n\n#if defined(_AMD64_) || defined(_X86_)\n    detour_disasm_init(&Disasm, (PBYTE*)ppTarget, plExtra);\n    return (PVOID)CopyInstruction(&Disasm, (PBYTE)pDst, (PBYTE)pSrc);\n#elif defined(_ARM64_)\n    detour_disasm_init(&Disasm);\n    return (PVOID)CopyInstruction(&Disasm,\n                                  (PBYTE)pDst,\n                                  (PBYTE)pSrc,\n                                  (PBYTE*)ppTarget,\n                                  plExtra);\n#else\n    return NULL;\n#endif\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/InlineHook.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Inline Hook Wrappers\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\nHRESULT\nNTAPI\nSlimDetoursInlineHook(\n    _In_ BOOL bEnable,\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour)\n{\n    HRESULT hr;\n\n    hr = SlimDetoursTransactionBegin();\n    if (FAILED(hr))\n    {\n        return hr;\n    }\n    hr = bEnable ? SlimDetoursAttach(ppPointer, pDetour) : SlimDetoursDetach(ppPointer, pDetour);\n    if (FAILED(hr))\n    {\n        SlimDetoursTransactionAbort();\n        return hr;\n    }\n    return SlimDetoursTransactionCommit();\n}\n\nHRESULT\nNTAPI\nSlimDetoursInitInlineHooks(\n    _In_ HMODULE hModule,\n    _In_ ULONG ulCount,\n    _Inout_updates_(ulCount) PDETOUR_INLINE_HOOK pHooks)\n{\n    NTSTATUS Status;\n    ULONG i, uOridinal;\n    ANSI_STRING FuncName, *pFuncName;\n\n    for (i = 0; i < ulCount; i++)\n    {\n        if ((ULONG_PTR)pHooks[i].pszFuncName > MAXWORD)\n        {\n            Status = RtlInitAnsiStringEx(&FuncName, pHooks[i].pszFuncName);\n            if (!NT_SUCCESS(Status))\n            {\n                return HRESULT_FROM_NT(Status);\n            }\n            pFuncName = &FuncName;\n            uOridinal = 0;\n        } else\n        {\n            pFuncName = NULL;\n            uOridinal = (ULONG)(ULONG_PTR)pHooks[i].pszFuncName;\n        }\n        Status = LdrGetProcedureAddress(hModule, pFuncName, uOridinal, pHooks[i].ppPointer);\n        if (!NT_SUCCESS(Status))\n        {\n            return HRESULT_FROM_NT(Status);\n        }\n    }\n\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n}\n\nHRESULT\nNTAPI\nSlimDetoursInlineHooks(\n    _In_ BOOL bEnable,\n    _In_ ULONG ulCount,\n    _Inout_updates_(ulCount) PDETOUR_INLINE_HOOK pHooks)\n{\n    HRESULT hr;\n    ULONG i;\n\n    hr = SlimDetoursTransactionBegin();\n    if (FAILED(hr))\n    {\n        return hr;\n    }\n    for (i = 0; i < ulCount; i++)\n    {\n        hr = bEnable ?\n            SlimDetoursAttach(pHooks[i].ppPointer, pHooks[i].pDetour) :\n            SlimDetoursDetach(pHooks[i].ppPointer, pHooks[i].pDetour);\n        if (FAILED(hr))\n        {\n            SlimDetoursTransactionAbort();\n            return hr;\n        }\n    }\n    return SlimDetoursTransactionCommit();\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Instruction.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Instruction Utility\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n *\n * Source base on Microsoft Detours:\n *\n * Microsoft Research Detours Package, Version 4.0.1\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\nstatic\nBOOL\ndetour_is_imported(\n    _In_ PVOID pbCode,\n    _In_ PVOID pbAddress)\n{\n    NTSTATUS Status;\n    MEMORY_BASIC_INFORMATION mbi;\n    PIMAGE_DOS_HEADER pDosHeader;\n    PIMAGE_NT_HEADERS pNtHeader;\n    PVOID pEndOfMem;\n    WORD wNtMagic;\n\n    Status = NtQueryVirtualMemory(NtCurrentProcess(), pbCode, MemoryBasicInformation, &mbi, sizeof(mbi), NULL);\n    if (!NT_SUCCESS(Status))\n    {\n        return FALSE;\n    }\n\n    /* Type should be MEM_IMAGE */\n    if (mbi.Type != MEM_IMAGE)\n    {\n        return FALSE;\n    }\n\n    /* Cannot be uncommitted regions or guard pages */\n    if ((mbi.State != MEM_COMMIT) || ((mbi.Protect & 0xFF) == PAGE_NOACCESS) || (mbi.Protect & PAGE_GUARD))\n    {\n        return FALSE;\n    }\n\n    /*\n     * RegionSize should >= PAGE_SIZE and PAGE_SIZE always >= sizeof(IMAGE_DOS_HEADER),\n     * so we can access IMAGE_DOS_HEADER safely without boundary check.\n     */\n    _STATIC_ASSERT(PAGE_SIZE >= sizeof(IMAGE_DOS_HEADER));\n    if (mbi.RegionSize < PAGE_SIZE)\n    {\n        return FALSE;\n    }\n\n    /* Check IMAGE_DOS_HEADER */\n    pDosHeader = (PIMAGE_DOS_HEADER)mbi.AllocationBase;\n    if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)\n    {\n        return FALSE;\n    }\n    if (pDosHeader->e_lfanew < sizeof(*pDosHeader) || (ULONG)pDosHeader->e_lfanew > mbi.RegionSize)\n    {\n        return FALSE;\n    }\n\n    /* Now we need perform boundary check in every single step */\n    pEndOfMem = Add2Ptr(mbi.AllocationBase, mbi.RegionSize);\n\n    /*\n     * Step forward to IMAGE_NT_HEADERS and check IMAGE_NT_SIGNATURE,\n     * check FileHeader.SizeOfOptionalHeader == 0 seems pointless\n     * unless compare it with sizeof(IMAGE_OPTIONAL_HEADER) explicitly.\n     */\n    pNtHeader = (PIMAGE_NT_HEADERS)Add2Ptr(pDosHeader, pDosHeader->e_lfanew);\n    if (Add2Ptr(pNtHeader, sizeof(*pNtHeader)) > pEndOfMem)\n    {\n        return FALSE;\n    }\n    if (pNtHeader->Signature != IMAGE_NT_SIGNATURE)\n    {\n        return FALSE;\n    }\n\n    /* Step forward to IMAGE_OPTIONAL_HEADER and check magic */\n    _STATIC_ASSERT(UFIELD_OFFSET(IMAGE_OPTIONAL_HEADER, Magic) == 0);\n    wNtMagic = pNtHeader->OptionalHeader.Magic;\n    if (wNtMagic != IMAGE_NT_OPTIONAL_HDR_MAGIC ||\n        pNtHeader->FileHeader.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER))\n    {\n        return FALSE;\n    }\n\n    if (pNtHeader->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_IAT ||\n        pbAddress < Add2Ptr(mbi.AllocationBase,\n                            pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress) ||\n        pbAddress >= Add2Ptr(mbi.AllocationBase,\n                             pNtHeader->OptionalHeader\n                             .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress +\n                             pNtHeader->OptionalHeader\n                             .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size))\n    {\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n#if defined(_X86_) || defined(_AMD64_)\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_immediate(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbJmpVal)\n{\n    PBYTE pbJmpSrc = pbCode + 5;\n    *pbCode++ = 0xe9;   // jmp +imm32\n    *((INT32*)pbCode) = (INT32)(pbJmpVal - pbJmpSrc);\n    return pbCode + sizeof(INT32);\n}\n\nBOOL\ndetour_is_jmp_immediate_to(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbJmpVal)\n{\n    PBYTE pbJmpSrc = pbCode + 5;\n    if (*pbCode++ != 0xe9)   // jmp +imm32\n    {\n        return FALSE;\n    }\n    INT32 offset = *((INT32*)pbCode);\n    return offset == (INT32)(pbJmpVal - pbJmpSrc);\n}\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_indirect(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE* ppbJmpVal)\n{\n#if defined(_AMD64_)\n    PBYTE pbJmpSrc = pbCode + 6;\n#endif\n    *pbCode++ = 0xff;   // jmp [+imm32]\n    *pbCode++ = 0x25;\n#if defined(_AMD64_)\n    *((INT32*)pbCode) = (INT32)((PBYTE)ppbJmpVal - pbJmpSrc);\n#else\n    *((INT32*)pbCode) = (INT32)((PBYTE)ppbJmpVal);\n#endif\n    return pbCode + sizeof(INT32);\n}\n\nBOOL\ndetour_is_jmp_indirect_to(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE* ppbJmpVal)\n{\n#if defined(_AMD64_)\n    PBYTE pbJmpSrc = pbCode + 6;\n#endif\n    if (*pbCode++ != 0xff)   // jmp [+imm32]\n    {\n        return FALSE;\n    }\n    if (*pbCode++ != 0x25)\n    {\n        return FALSE;\n    }\n    INT32 offset = *((INT32*)pbCode);\n#if defined(_AMD64_)\n    return offset == (INT32)((PBYTE)ppbJmpVal - pbJmpSrc);\n#else\n    return offset == (INT32)((PBYTE)ppbJmpVal);\n#endif\n}\n\n_Ret_notnull_\nPBYTE\ndetour_gen_brk(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbLimit)\n{\n    while (pbCode < pbLimit)\n    {\n        *pbCode++ = 0xcc;   // brk;\n    }\n    return pbCode;\n}\n\n_Ret_notnull_\nPBYTE\ndetour_skip_jmp(\n    _In_ PBYTE pbCode)\n{\n    PBYTE pbCodeOriginal;\n\n    // First, skip over the import vector if there is one.\n    if (pbCode[0] == 0xff && pbCode[1] == 0x25)\n    {\n        // Looks like an import alias jump, then get the code it points to.\n#if defined(_X86_)\n        // jmp [imm32]\n        PBYTE pbTarget = *(UNALIGNED PBYTE*) & pbCode[2];\n#else\n        // jmp [+imm32]\n        PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32*) & pbCode[2];\n#endif\n\n        if (detour_is_imported(pbCode, pbTarget))\n        {\n            PBYTE pbNew = *(UNALIGNED PBYTE*)pbTarget;\n            DETOUR_TRACE(\"%p->%p: skipped over import table.\\n\", pbCode, pbNew);\n            pbCode = pbNew;\n        }\n    }\n\n    // Then, skip over a patch jump\n    if (pbCode[0] == 0xeb)\n    {\n        // jmp +imm8\n        PBYTE pbNew = pbCode + 2 + *(CHAR*)&pbCode[1];\n        DETOUR_TRACE(\"%p->%p: skipped over short jump.\\n\", pbCode, pbNew);\n        pbCode = pbNew;\n        pbCodeOriginal = pbCode;\n\n        // First, skip over the import vector if there is one.\n        if (pbCode[0] == 0xff && pbCode[1] == 0x25)\n        {\n            // Looks like an import alias jump, then get the code it points to.\n#if defined(_X86_)\n            // jmp [imm32]\n            PBYTE pbTarget = *(UNALIGNED PBYTE*) & pbCode[2];\n#else\n            // jmp [+imm32]\n            PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32*) & pbCode[2];\n#endif\n            if (detour_is_imported(pbCode, pbTarget))\n            {\n                pbNew = *(UNALIGNED PBYTE*)pbTarget;\n                DETOUR_TRACE(\"%p->%p: skipped over import table.\\n\", pbCode, pbNew);\n                pbCode = pbNew;\n            }\n        }\n        // Finally, skip over a long jump if it is the target of the patch jump.\n        else if (pbCode[0] == 0xe9)\n        {\n            // jmp +imm32\n            pbNew = pbCode + 5 + *(UNALIGNED INT32*) & pbCode[1];\n            DETOUR_TRACE(\"%p->%p: skipped over long jump.\\n\", pbCode, pbNew);\n            pbCode = pbNew;\n\n            // Patches applied by the OS will jump through an HPAT page to get\n            // the target function in the patch image. The jump is always performed\n            // to the target function found at the current instruction pointer + PAGE_SIZE - 6 (size of jump).\n            // If this is an OS patch, we want to detour at the point of the target function in the base image. \n            if (pbCode[0] == 0xff &&\n                pbCode[1] == 0x25 &&\n#if defined(_X86_)\n                // Ideally, we would detour at the target function, but\n                // since it's patched it begins with a short jump (to padding) which isn't long\n                // enough to hold the detour code bytes.\n                *(UNALIGNED INT32*)&pbCode[2] == (UNALIGNED INT32)(pbCode + PAGE_SIZE))\n#else\n                // Since we need 5 bytes to perform the jump, detour at the\n                // point of the long jump instead of the short jump at the start of the target.\n                *(UNALIGNED INT32*)&pbCode[2] == PAGE_SIZE - 6)\n#endif\n            {\n                // jmp [+PAGE_SIZE-6]\n                DETOUR_TRACE(\"%p->%p: OS patch encountered, reset back to long jump 5 bytes prior to target function.\\n\",\n                             pbCode,\n                             pbCodeOriginal);\n                pbCode = pbCodeOriginal;\n            }\n        }\n    }\n    return pbCode;\n}\n\nVOID\ndetour_find_jmp_bounds(\n    _In_ PBYTE pbCode,\n    _Outptr_ PVOID* ppLower,\n    _Outptr_ PVOID* ppUpper)\n{\n    // We have to place trampolines within +/- 2GB of code.\n    PVOID lo = detour_memory_2gb_below(pbCode);\n    PVOID hi = detour_memory_2gb_above(pbCode);\n    DETOUR_TRACE(\"[%p..%p..%p]\\n\", lo, pbCode, hi);\n\n    // And, within +/- 2GB of relative jmp targets.\n    if (pbCode[0] == 0xe9)\n    {\n        // jmp +imm32\n        PBYTE pbNew = pbCode + 5 + *(UNALIGNED INT32*) & pbCode[1];\n\n        if (pbNew < pbCode)\n        {\n            hi = detour_memory_2gb_above(pbNew);\n        } else\n        {\n            lo = detour_memory_2gb_below(pbNew);\n        }\n        DETOUR_TRACE(\"[%p..%p..%p] +imm32\\n\", lo, pbCode, hi);\n    }\n#if defined(_AMD64_)\n    // And, within +/- 2GB of relative jmp vectors.\n    else if (pbCode[0] == 0xff && pbCode[1] == 0x25)\n    {\n        // jmp [+imm32]\n        PBYTE pbNew = pbCode + 6 + *(UNALIGNED INT32*) & pbCode[2];\n\n        if (pbNew < pbCode)\n        {\n            hi = detour_memory_2gb_above(pbNew);\n        } else\n        {\n            lo = detour_memory_2gb_below(pbNew);\n        }\n        DETOUR_TRACE(\"[%p..%p..%p] [+imm32]\\n\", lo, pbCode, hi);\n    }\n#endif\n\n    *ppLower = lo;\n    *ppUpper = hi;\n}\n\nBOOL\ndetour_does_code_end_function(\n    _In_ PBYTE pbCode)\n{\n    if (pbCode[0] == 0xeb ||    // jmp +imm8\n        pbCode[0] == 0xe9 ||    // jmp +imm32\n        pbCode[0] == 0xe0 ||    // jmp eax\n        pbCode[0] == 0xc2 ||    // ret +imm8\n        pbCode[0] == 0xc3 ||    // ret\n        pbCode[0] == 0xcc)\n    {\n        // brk\n        return TRUE;\n    } else if (pbCode[0] == 0xf3 && pbCode[1] == 0xc3)\n    {\n        // rep ret\n        return TRUE;\n    } else if (pbCode[0] == 0xff && pbCode[1] == 0x25)\n    {\n        // jmp [+imm32]\n        return TRUE;\n    } else if ((pbCode[0] == 0x26 ||      // jmp es:\n                pbCode[0] == 0x2e ||      // jmp cs:\n                pbCode[0] == 0x36 ||      // jmp ss:\n                pbCode[0] == 0x3e ||      // jmp ds:\n                pbCode[0] == 0x64 ||      // jmp fs:\n                pbCode[0] == 0x65) &&     // jmp gs:\n               pbCode[1] == 0xff &&       // jmp [+imm32]\n               pbCode[2] == 0x25)\n    {\n        return TRUE;\n    }\n    return FALSE;\n}\n\nULONG\ndetour_is_code_filler(\n    _In_ PBYTE pbCode)\n{\n    // 1-byte through 11-byte NOPs.\n    if (pbCode[0] == 0x90)\n    {\n        return 1;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x90)\n    {\n        return 2;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x00)\n    {\n        return 3;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x40 && pbCode[3] == 0x00)\n    {\n        return 4;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x44 && pbCode[3] == 0x00 && pbCode[4] == 0x00)\n    {\n        return 5;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && pbCode[3] == 0x44 && pbCode[4] == 0x00 &&\n        pbCode[5] == 0x00)\n    {\n        return 6;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x80 && pbCode[3] == 0x00 && pbCode[4] == 0x00 &&\n        pbCode[5] == 0x00 && pbCode[6] == 0x00)\n    {\n        return 7;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x84 && pbCode[3] == 0x00 && pbCode[4] == 0x00 &&\n        pbCode[5] == 0x00 && pbCode[6] == 0x00 && pbCode[7] == 0x00)\n    {\n        return 8;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && pbCode[3] == 0x84 && pbCode[4] == 0x00 &&\n        pbCode[5] == 0x00 && pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00)\n    {\n        return 9;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x0F && pbCode[3] == 0x1F && pbCode[4] == 0x84 &&\n        pbCode[5] == 0x00 && pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && pbCode[9] == 0x00)\n    {\n        return 10;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x66 && pbCode[3] == 0x0F && pbCode[4] == 0x1F &&\n        pbCode[5] == 0x84 && pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && pbCode[9] == 0x00 &&\n        pbCode[10] == 0x00)\n    {\n        return 11;\n    }\n\n    // int 3.\n    if (pbCode[0] == 0xCC)\n    {\n        return 1;\n    }\n    return 0;\n}\n\n#endif // defined(_X86_) || defined(_AMD64_)\n\n#if defined(_ARM64_)\ninline\nULONG\nfetch_opcode(\n    PBYTE pbCode)\n{\n    return *(ULONG*)pbCode;\n}\n\ninline\nPBYTE\nwrite_opcode(\n    PBYTE pbCode,\n    ULONG Opcode)\n{\n    *(ULONG*)pbCode = Opcode;\n    return pbCode + 4;\n}\n\nstruct ARM64_INDIRECT_JMP\n{\n    struct\n    {\n        ULONG Rd : 5;\n        ULONG immhi : 19;\n        ULONG iop : 5;\n        ULONG immlo : 2;\n        ULONG op : 1;\n    } ardp;\n\n    struct\n    {\n        ULONG Rt : 5;\n        ULONG Rn : 5;\n        ULONG imm : 12;\n        ULONG opc : 2;\n        ULONG iop1 : 2;\n        ULONG V : 1;\n        ULONG iop2 : 3;\n        ULONG size : 2;\n    } ldr;\n\n    ULONG br;\n};\n\nunion ARM64_INDIRECT_IMM\n{\n    struct\n    {\n        ULONG64 pad : 12;\n        ULONG64 adrp_immlo : 2;\n        ULONG64 adrp_immhi : 19;\n    };\n\n    LONG64 value;\n};\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_indirect(\n    _In_ PBYTE pbCode,\n    _In_ PULONG64 pbJmpVal)\n{\n    // adrp x17, [jmpval]\n    // ldr x17, [x17, jmpval]\n    // br x17\n\n    struct ARM64_INDIRECT_JMP* pIndJmp;\n    union ARM64_INDIRECT_IMM jmpIndAddr;\n\n    jmpIndAddr.value = (((LONG64)pbJmpVal) & 0xFFFFFFFFFFFFF000) -\n        (((LONG64)pbCode) & 0xFFFFFFFFFFFFF000);\n\n    pIndJmp = (struct ARM64_INDIRECT_JMP*)pbCode;\n    pbCode = (PBYTE)(pIndJmp + 1);\n\n    pIndJmp->ardp.Rd = 17;\n    pIndJmp->ardp.immhi = (ULONG)jmpIndAddr.adrp_immhi;\n    pIndJmp->ardp.iop = 0x10;\n    pIndJmp->ardp.immlo = (ULONG)jmpIndAddr.adrp_immlo;\n    pIndJmp->ardp.op = 1;\n\n    pIndJmp->ldr.Rt = 17;\n    pIndJmp->ldr.Rn = 17;\n    pIndJmp->ldr.imm = (((ULONG64)pbJmpVal) & 0xFFF) / 8;\n    pIndJmp->ldr.opc = 1;\n    pIndJmp->ldr.iop1 = 1;\n    pIndJmp->ldr.V = 0;\n    pIndJmp->ldr.iop2 = 7;\n    pIndJmp->ldr.size = 3;\n\n    pIndJmp->br = 0xD61F0220;\n\n    return pbCode;\n}\n\nBOOL\ndetour_is_jmp_indirect_to(\n    _In_ PBYTE pbCode,\n    _In_ PULONG64 pbJmpVal)\n{\n    const struct ARM64_INDIRECT_JMP* pIndJmp;\n    union ARM64_INDIRECT_IMM jmpIndAddr;\n\n    jmpIndAddr.value = (((LONG64)pbJmpVal) & 0xFFFFFFFFFFFFF000) -\n        (((LONG64)pbCode) & 0xFFFFFFFFFFFFF000);\n\n    pIndJmp = (const struct ARM64_INDIRECT_JMP*)pbCode;\n\n    return pIndJmp->ardp.Rd == 17 &&\n        pIndJmp->ardp.immhi == (ULONG)jmpIndAddr.adrp_immhi &&\n        pIndJmp->ardp.iop == 0x10 &&\n        pIndJmp->ardp.immlo == (ULONG)jmpIndAddr.adrp_immlo &&\n        pIndJmp->ardp.op == 1 &&\n\n        pIndJmp->ldr.Rt == 17 &&\n        pIndJmp->ldr.Rn == 17 &&\n        pIndJmp->ldr.imm == (((ULONG64)pbJmpVal) & 0xFFF) / 8 &&\n        pIndJmp->ldr.opc == 1 &&\n        pIndJmp->ldr.iop1 == 1 &&\n        pIndJmp->ldr.V == 0 &&\n        pIndJmp->ldr.iop2 == 7 &&\n        pIndJmp->ldr.size == 3 &&\n\n        pIndJmp->br == 0xD61F0220;\n}\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_immediate(\n    _In_ PBYTE pbCode,\n    _In_opt_ PBYTE* ppPool,\n    _In_ PBYTE pbJmpVal)\n{\n    PBYTE pbLiteral;\n    if (ppPool != NULL)\n    {\n        *ppPool = *ppPool - 8;\n        pbLiteral = *ppPool;\n    } else\n    {\n        pbLiteral = pbCode + 8;\n    }\n\n    *((PBYTE*)pbLiteral) = pbJmpVal;\n    LONG delta = (LONG)(pbLiteral - pbCode);\n\n    pbCode = write_opcode(pbCode, 0x58000011 | ((delta / 4) << 5)); // LDR X17,[PC+n]\n    pbCode = write_opcode(pbCode, 0xd61f0000 | (17 << 5));          // BR X17\n\n    if (ppPool == NULL)\n    {\n        pbCode += 8;\n    }\n    return pbCode;\n}\n\n_Ret_notnull_\nPBYTE\ndetour_gen_brk(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbLimit)\n{\n    while (pbCode < pbLimit)\n    {\n        pbCode = write_opcode(pbCode, 0xd4100000 | (0xf000 << 5));\n    }\n    return pbCode;\n}\n\ninline\nINT64\ndetour_sign_extend(\n    UINT64 value,\n    UINT bits)\n{\n    const UINT left = 64 - bits;\n    const INT64 m1 = -1;\n    const INT64 wide = (INT64)(value << left);\n    const INT64 sign = (wide < 0) ? (m1 << left) : 0;\n    return value | sign;\n}\n\n_Ret_notnull_\nPBYTE\ndetour_skip_jmp(\n    _In_ PBYTE pbCode)\n{\n    // Skip over the import jump if there is one.\n    pbCode = (PBYTE)pbCode;\n    ULONG Opcode = fetch_opcode(pbCode);\n\n    if ((Opcode & 0x9f00001f) == 0x90000010)\n    {\n        // adrp  x16, IAT\n        ULONG Opcode2 = fetch_opcode(pbCode + 4);\n\n        if ((Opcode2 & 0xffe003ff) == 0xf9400210)\n        {\n            // ldr   x16, [x16, IAT]\n            ULONG Opcode3 = fetch_opcode(pbCode + 8);\n\n            if (Opcode3 == 0xd61f0200)\n            {\n                // br    x16\n\n/* https://static.docs.arm.com/ddi0487/bb/DDI0487B_b_armv8_arm.pdf\n    The ADRP instruction shifts a signed, 21-bit immediate left by 12 bits, adds it to the value of the program counter with\n    the bottom 12 bits cleared to zero, and then writes the result to a general-purpose register. This permits the\n    calculation of the address at a 4KB aligned memory region. In conjunction with an ADD (immediate) instruction, or\n    a Load/Store instruction with a 12-bit immediate offset, this allows for the calculation of, or access to, any address\n    within +/- 4GB of the current PC.\n\nPC-rel. addressing\n    This section describes the encoding of the PC-rel. addressing instruction class. The encodings in this section are\n    decoded from Data Processing -- Immediate on page C4-226.\n    Add/subtract (immediate)\n    This section describes the encoding of the Add/subtract (immediate) instruction class. The encodings in this section\n    are decoded from Data Processing -- Immediate on page C4-226.\n    Decode fields\n    Instruction page\n    op\n    0 ADR\n    1 ADRP\n\nC6.2.10 ADRP\n    Form PC-relative address to 4KB page adds an immediate value that is shifted left by 12 bits, to the PC value to\n    form a PC-relative address, with the bottom 12 bits masked out, and writes the result to the destination register.\n    ADRP <Xd>, <label>\n    imm = SignExtend(immhi:immlo:Zeros(12), 64);\n\n    31  30 29 28 27 26 25 24 23 5    4 0\n    1   immlo  1  0  0  0  0  immhi  Rd\n         9             0\n\nRd is hardcoded as 0x10 above.\nImmediate is 21 signed bits split into 2 bits and 19 bits, and is scaled by 4K.\n*/\n                UINT64 const pageLow2 = (Opcode >> 29) & 3;\n                UINT64 const pageHigh19 = (Opcode >> 5) & ~(~0ui64 << 19);\n                INT64 const page = detour_sign_extend((pageHigh19 << 2) | pageLow2, 21) << 12;\n\n/* https://static.docs.arm.com/ddi0487/bb/DDI0487B_b_armv8_arm.pdf\n\n    C6.2.101 LDR (immediate)\n    Load Register (immediate) loads a word or doubleword from memory and writes it to a register. The address that is\n    used for the load is calculated from a base register and an immediate offset.\n    The Unsigned offset variant scales the immediate offset value by the size of the value accessed before adding it\n    to the base register value.\n\nUnsigned offset\n64-bit variant Applies when size == 11.\n    31 30 29 28  27 26 25 24  23 22  21   10   9 5   4 0\n     1  x  1  1   1  0  0  1   0  1  imm12      Rn    Rt\n         F             9        4              200    10\n\nThat is, two low 5 bit fields are registers, hardcoded as 0x10 and 0x10 << 5 above,\nthen unsigned size-unscaled (8) 12-bit offset, then opcode bits 0xF94.\n*/\n                UINT64 const offset = ((Opcode2 >> 10) & ~(~0ui64 << 12)) << 3;\n\n                PBYTE const pbTarget = (PBYTE)((ULONG64)pbCode & 0xfffffffffffff000ULL) + page + offset;\n\n                if (detour_is_imported(pbCode, pbTarget))\n                {\n                    PBYTE pbNew = *(PBYTE*)pbTarget;\n                    DETOUR_TRACE(\"%p->%p: skipped over import table.\\n\", pbCode, pbNew);\n                    return pbNew;\n                }\n            }\n        }\n    }\n    return pbCode;\n}\n\nVOID\ndetour_find_jmp_bounds(\n    _In_ PBYTE pbCode,\n    _Outptr_ PVOID* ppLower,\n    _Outptr_ PVOID* ppUpper)\n{\n    // The encoding used by detour_gen_jmp_indirect actually enables a\n    // displacement of +/- 4GiB. In the future, this could be changed to\n    // reflect that. For now, just reuse the x86 logic which is plenty.\n\n    PVOID lo = detour_memory_2gb_below(pbCode);\n    PVOID hi = detour_memory_2gb_above(pbCode);\n    DETOUR_TRACE(\"[%p..%p..%p]\\n\", lo, pbCode, hi);\n\n    *ppLower = lo;\n    *ppUpper = hi;\n}\n\nstatic\nBOOL\ndetour_is_code_os_patched(\n    _In_ PBYTE pbCode)\n{\n    // Identify whether the provided code pointer is a OS patch jump.\n    // We can do this by checking if a branch (b <imm26>) is present, and if so,\n    // it must be jumping to an HPAT page containing ldr <reg> [PC+PAGE_SIZE-4], br <reg>.\n    ULONG Opcode = fetch_opcode(pbCode);\n\n    if ((Opcode & 0xfc000000) != 0x14000000)\n    {\n        return FALSE;\n    }\n    // The branch must be jumping forward if it's going into the HPAT.\n    // Check that the sign bit is cleared.\n    if ((Opcode & 0x2000000) != 0)\n    {\n        return FALSE;\n    }\n    ULONG Delta = (ULONG)((Opcode & 0x1FFFFFF) * 4);\n    PBYTE BranchTarget = pbCode + Delta;\n\n    // Now inspect the opcodes of the code we jumped to in order to determine if it's HPAT.\n    ULONG HpatOpcode1 = fetch_opcode(BranchTarget);\n    ULONG HpatOpcode2 = fetch_opcode(BranchTarget + 4);\n\n    if (HpatOpcode1 != 0x58008010)\n    {\n        // ldr <reg> [PC+PAGE_SIZE]\n        return FALSE;\n    }\n    if (HpatOpcode2 != 0xd61f0200)\n    {\n        // br <reg>\n        return FALSE;\n    }\n    return TRUE;\n}\n\nBOOL\ndetour_does_code_end_function(\n    _In_ PBYTE pbCode)\n{\n    // When the OS has patched a function entry point, it will incorrectly\n    // appear as though the function is just a single branch instruction.\n    if (detour_is_code_os_patched(pbCode))\n    {\n        return FALSE;\n    }\n\n    ULONG Opcode = fetch_opcode(pbCode);\n    if ((Opcode & 0xffbffc1f) == 0xd61f0000 ||  // ret/br <reg>\n        (Opcode & 0xfc000000) == 0x14000000)    // b <imm26>\n    {\n        return TRUE;\n    }\n    return FALSE;\n}\n\nULONG\ndetour_is_code_filler(\n    _In_ PBYTE pbCode)\n{\n    if (*(ULONG*)pbCode == 0xd503201f)\n    {\n        // nop.\n        return 4;\n    }\n    if (*(ULONG*)pbCode == 0x00000000)\n    {\n        // zero-filled padding.\n        return 4;\n    }\n    return 0;\n}\n\n#endif // defined(_ARM64_)\n\nPVOID\nNTAPI\nSlimDetoursCodeFromPointer(\n    _In_ PVOID pPointer)\n{\n    return detour_skip_jmp((PBYTE)pPointer);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) KNSoft.org\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Memory.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Memory Management\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\n/*\n * Region reserved for system DLLs\n *\n * System reserved a region to make each system DLL was relocated only once\n * when loaded into every process as far as possible. Avoid using this region for trampoline.\n *\n * The region is [0x50000000 ... 0x78000000) (640MB) on 32-bit Windows;\n * and [0x00007FF7FFFF0000 ... 0x00007FFFFFFF0000) (32GB) on 64-bit Windows, which is too large to avoid.\n * In this case, avoiding 1GB range starting at Ntdll.dll makes sense.\n * If ASLR is disabled on NT6.0 or NT6.1, we reserve the top 1GB or 640MB region.\n *\n * The original Microsoft Detours always assumes and reserves [0x70000000 ... 0x80000000] (256MB) for system DLLs,\n * this should be used on NT5.\n *\n * Use MI_ASLR_* provided by KNSoft.NDK instead of hard-coded.\n */\n\n#define SYSTEM_RESERVED_REGION_HIGHEST ((ULONG_PTR)MI_ASLR_HIGHEST_SYSTEM_RANGE_ADDRESS)\n#define SYSTEM_RESERVED_REGION_SIZE (MI_ASLR_BITMAP_SIZE * (ULONG_PTR)CHAR_BIT * MM_ALLOCATION_GRANULARITY)\n#define SYSTEM_RESERVED_REGION_LOWEST (SYSTEM_RESERVED_REGION_HIGHEST - SYSTEM_RESERVED_REGION_SIZE + 1)\n\nstatic ULONG_PTR s_ulSystemRegionLowUpperBound = 0;\nstatic ULONG_PTR s_ulSystemRegionLowLowerBound = 0;\n\n#if defined(_WIN64)\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_HIGHEST + 1 == 0x00007FFFFFFF0000ULL);\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_SIZE == _32GB);\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_LOWEST == 0x00007FF7FFFF0000ULL);\n\nstatic const UNICODE_STRING g_usNtdll = RTL_CONSTANT_STRING(L\"ntdll.dll\");\nstatic ULONG_PTR s_ulSystemRegionHighLowerBound = MAXULONG_PTR;\n#else\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_HIGHEST + 1 == 0x78000000UL);\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_SIZE == _640MB);\n_STATIC_ASSERT(SYSTEM_RESERVED_REGION_LOWEST == 0x50000000UL);\n#endif\n\nstatic const UNICODE_STRING g_MmMoveImages = RTL_CONSTANT_STRING(L\"MoveImages\");\nstatic const UNICODE_STRING g_MmKeyPath = RTL_CONSTANT_STRING(L\"\\\\Registry\\\\Machine\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Memory Management\");\nstatic const OBJECT_ATTRIBUTES g_MmMoveImagesKey = RTL_CONSTANT_OBJECT_ATTRIBUTES(&g_MmKeyPath, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE);\n\n/*\n * System memory information with defaults\n *\n * Result from NtQuerySystemInformation(SystemBasicInformation, ...) is better,\n * and those default values are enough to work properly.\n */\nstatic SYSTEM_BASIC_INFORMATION g_sbi = {\n    .PageSize = PAGE_SIZE,\n    .AllocationGranularity = MM_ALLOCATION_GRANULARITY,\n    .MinimumUserModeAddress = (ULONG_PTR)MM_LOWEST_USER_ADDRESS,\n#if defined(_WIN64)\n    .MaximumUserModeAddress = 0x00007FFFFFFEFFFF,\n#else\n    .MaximumUserModeAddress = 0x7FFEFFFF,\n#endif\n};\n\nstatic HANDLE _detour_memory_heap = NULL;\n\n#if defined(_WIN64)\nstatic\n_Success_(return != NULL)\nPVOID\nGetNtdllBase(VOID)\n{\n    /* Get the first loaded entry */\n    PLDR_DATA_TABLE_ENTRY Entry = CONTAINING_RECORD(NtCurrentPeb()->Ldr->InInitializationOrderModuleList.Flink,\n                                                    LDR_DATA_TABLE_ENTRY,\n                                                    InInitializationOrderLinks);\n\n    /* May be replaced by honey pot by very few tamper security softwares */\n    if (RtlEqualUnicodeString(&Entry->BaseDllName, (PUNICODE_STRING)&g_usNtdll, TRUE))\n    {\n        return Entry->DllBase;\n    }\n\n    /* Fallback to LdrGetDllHandleEx */\n    PVOID NtdllBase;\n    return NT_SUCCESS(LdrGetDllHandleEx(LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT,\n                                        NULL,\n                                        NULL,\n                                        (PUNICODE_STRING)&g_usNtdll,\n                                        &NtdllBase)) ? NtdllBase : NULL;\n}\n#endif\n\n/*\n * For NT6.0 and NT6.1 only, ASLR can be turned off by MmMoveImages registry option,\n * this function returns FALSE if the option was set to 0 explicitly.\n */\nstatic\nFORCEINLINE\nBOOL\ndetour_memory_is_aslr_enabled(VOID)\n{\n    NTSTATUS Status;\n    HANDLE hKey;\n    ULONG Length;\n    DEFINE_ANYSIZE_STRUCT(stRegValue, KEY_VALUE_PARTIAL_INFORMATION, UCHAR, sizeof(DWORD));\n\n    Status = NtOpenKey(&hKey, KEY_QUERY_VALUE, (POBJECT_ATTRIBUTES)&g_MmMoveImagesKey);\n    if (!NT_SUCCESS(Status))\n    {\n        return TRUE;\n    }\n    Status = NtQueryValueKey(hKey,\n                             (PUNICODE_STRING)&g_MmMoveImages,\n                             KeyValuePartialInformation,\n                             &stRegValue,\n                             sizeof(stRegValue),\n                             &Length);\n    NtClose(hKey);\n    return (!NT_SUCCESS(Status) ||\n            Length != sizeof(stRegValue) ||\n            stRegValue.BaseType.Type != REG_DWORD ||\n            *(PDWORD)stRegValue.BaseType.Data != 0);\n}\n\nVOID\ndetour_memory_init(VOID)\n{\n    if (_detour_memory_heap != NULL)\n    {\n        return;\n    }\n\n    /* Initialize memory management information */\n    NtQuerySystemInformation(SystemBasicInformation, &g_sbi, sizeof(g_sbi), NULL);\n\n    if (SharedUserData->NtMajorVersion >= 6)\n    {\n        if (SharedUserData->NtMajorVersion != 6 ||\n            SharedUserData->NtMinorVersion > 1 ||\n            detour_memory_is_aslr_enabled())\n        {\n#if defined(_WIN64)\n            /* 1GB after Ntdll.dll */\n            PVOID NtdllBase = GetNtdllBase();\n\n            /*\n             * Ntdll.dll is expected to be loaded in the system reserved region.\n             * If that's not the case, e.g. due to future changes in Windows or\n             * EDR tampering, we fall back to the non-ASLR reserved region.\n             * \n             * Currently, SYSTEM_RESERVED_REGION_HIGHEST is 0x00007FFFFFFEFFFFULL on 64-bit Windows,\n             * which is the maximum user mode address, so here we compare with SYSTEM_RESERVED_REGION_LOWEST only.\n             */\n            if ((ULONG_PTR)NtdllBase < SYSTEM_RESERVED_REGION_LOWEST)\n            {\n                NtdllBase = NULL;\n            }\n\n            if (NtdllBase)\n            {\n                /*\n                 * Note: The Ntdll.dll region isn't excluded, but it's already\n                 * occupied by ntdll, so that shouldn't be a problem.\n                 */\n                s_ulSystemRegionLowUpperBound = (ULONG_PTR)NtdllBase - 1;\n\n                s_ulSystemRegionLowLowerBound = s_ulSystemRegionLowUpperBound - _1GB + 1;\n                if (s_ulSystemRegionLowLowerBound < SYSTEM_RESERVED_REGION_LOWEST)\n                {\n                    s_ulSystemRegionHighLowerBound = s_ulSystemRegionLowLowerBound + SYSTEM_RESERVED_REGION_SIZE;\n                    s_ulSystemRegionLowLowerBound = SYSTEM_RESERVED_REGION_LOWEST;\n                }\n            } else\n            {\n                /* Reserve a region in the top as a fallback */\n                s_ulSystemRegionLowUpperBound = g_sbi.MaximumUserModeAddress;\n                s_ulSystemRegionLowLowerBound = s_ulSystemRegionLowUpperBound - _1GB + 1;\n            }\n#else\n            s_ulSystemRegionLowUpperBound = SYSTEM_RESERVED_REGION_HIGHEST;\n            s_ulSystemRegionLowLowerBound = SYSTEM_RESERVED_REGION_LOWEST;\n#endif\n        } else\n        {\n            /* Reserve a region in the top */\n            s_ulSystemRegionLowUpperBound = g_sbi.MaximumUserModeAddress;\n            s_ulSystemRegionLowLowerBound = s_ulSystemRegionLowUpperBound -\n#if defined(_WIN64)\n                _1GB\n#else\n                _640MB\n#endif\n                + 1;\n        }\n    } else\n    {\n        /*\n         * This is the original Detours behavior, for NT5 only.\n         * ntdll.dll, kernel32.dll, user32.dll in this range even if on 64-bit process\n         */\n        s_ulSystemRegionLowUpperBound = 0x80000000;\n        s_ulSystemRegionLowLowerBound = 0x70000000;\n    }\n\n    /* Initialize private heap */\n    _detour_memory_heap = RtlCreateHeap(HEAP_NO_SERIALIZE | HEAP_GROWABLE, NULL, 0, 0, NULL, NULL);\n    if (_detour_memory_heap == NULL)\n    {\n        DETOUR_TRACE(\"RtlCreateHeap failed, fallback to use process default heap\\n\");\n        _detour_memory_heap = RtlProcessHeap();\n    }\n}\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\ndetour_memory_alloc(\n    _In_ SIZE_T Size)\n{\n    return RtlAllocateHeap(_detour_memory_heap, 0, Size);\n}\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\ndetour_memory_realloc(\n    _Frees_ptr_opt_ PVOID BaseAddress,\n    _In_ SIZE_T Size)\n{\n    return RtlReAllocateHeap(_detour_memory_heap, 0, BaseAddress, Size);\n}\n\nBOOL\ndetour_memory_free(\n    _Frees_ptr_ PVOID BaseAddress)\n{\n    return RtlFreeHeap(_detour_memory_heap, 0, BaseAddress);\n}\n\nBOOL\ndetour_memory_uninitialize(VOID)\n{\n    if (_detour_memory_heap != NULL && _detour_memory_heap != RtlProcessHeap())\n    {\n        _detour_memory_heap = RtlDestroyHeap(_detour_memory_heap);\n        return _detour_memory_heap == NULL;\n    }\n\n    return TRUE;\n}\n\nBOOL\ndetour_memory_is_system_reserved(\n    _In_ PVOID Address)\n{\n    return\n        ((ULONG_PTR)Address >= s_ulSystemRegionLowLowerBound && (ULONG_PTR)Address <= s_ulSystemRegionLowUpperBound)\n#if defined(_WIN64)\n        || ((ULONG_PTR)Address >= s_ulSystemRegionHighLowerBound &&\n            (ULONG_PTR)Address <= SYSTEM_RESERVED_REGION_HIGHEST)\n#endif\n        ;\n}\n\n_Ret_notnull_\nPVOID\ndetour_memory_2gb_below(\n    _In_ PVOID Address)\n{\n    return (ULONG_PTR)Address > g_sbi.MinimumUserModeAddress + _2GB ?\n        (PBYTE)Address - (_2GB - _512KB) :\n        (PVOID)(g_sbi.MinimumUserModeAddress + _512KB);\n}\n\n_Ret_notnull_\nPVOID\ndetour_memory_2gb_above(\n    _In_ PVOID Address)\n{\n    return (\n#if !defined(_WIN64)\n        g_sbi.MaximumUserModeAddress >= _2GB &&\n#endif\n        (ULONG_PTR)Address <= g_sbi.MaximumUserModeAddress - _2GB) ?\n        (PBYTE)Address + (_2GB - _512KB) :\n        (PVOID)(g_sbi.MaximumUserModeAddress - _512KB);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/SlimDetours.NDK.inl",
    "content": "﻿/*\n * Adapt to NDKs to access low-level Windows NT APIs\n * \n * SlimDetours uses KNSoft.NDK by default, and also support other NDKs.\n * \n * KNSoft.NDK\n *   Used when macro `_USE_KNSOFT_NDK` is defined, this is the default behavior on offical project.\n * \n * ReactOS NDK\n *   Used when macro `__REACTOS__` is defined, can be built with ReactOS.\n * \n * Other NDKs\n *   Include other NDKs (e.g. phnt) header before SlimDetours, they should provide what we need.\n */\n\n#pragma once\n\n#if defined(_USE_KNSOFT_NDK)\n\n#include <KNSoft/NDK/NDK.h>\n\n#elif defined(__REACTOS__)\n\n#define WIN32_NO_STATUS\n#include <windef.h>\n#include <winbase.h>\n\n#define NTOS_MODE_USER\n#include <ndk/exfuncs.h>\n#include <ndk/obfuncs.h>\n#include <ndk/mmfuncs.h>\n#include <ndk/kefuncs.h>\n#include <ndk/psfuncs.h>\n#include <ndk/cmfuncs.h>\n#include <ndk/rtlfuncs.h>\n#include <ndk/umfuncs.h>\n\n#endif\n\n/* Add KNSoft.NDK specific stuff */\n#ifndef _USE_KNSOFT_NDK \n\n/* Use phnt */\n#include <phnt/phnt_windows.h>\n#include <phnt/phnt.h>\n#undef NtCurrentProcessId\n#undef NtCurrentThreadId\n\n#define PAGE_SIZE 0x1000\n#define MM_ALLOCATION_GRANULARITY 0x10000\n\n#if defined(_X86_)\n#define CONTEXT_PC Eip\n#elif defined(_AMD64_)\n#define CONTEXT_PC Rip\n#elif defined(_ARM64_)\n#define CONTEXT_PC Pc\n#endif\n\n#define Add2Ptr(P,I) ((PVOID)((PUCHAR)(P) + (I)))\n#define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))\n\n#define MM_LOWEST_USER_ADDRESS ((PVOID)(LONG_PTR)0x10000)\n\n#if defined(_WIN64)\n\n/* [0x00007FF7FFFF0000 ... 0x00007FFFFFFF0000), 32G */\n#define MI_ASLR_BITMAP_SIZE 0x10000\n#define MI_ASLR_LOWEST_SYSTEM_RANGE_ADDRESS ((PVOID)0x00007FF7FFFF0000ULL)\n#define MI_ASLR_HIGHEST_SYSTEM_RANGE_ADDRESS ((PVOID)0x00007FFFFFFEFFFFULL)\n\n#else\n\n/* [0x50000000 ... 0x78000000), 640M */\n#define MI_ASLR_BITMAP_SIZE 0x500\n#define MI_ASLR_LOWEST_SYSTEM_RANGE_ADDRESS ((PVOID)0x50000000UL)\n#define MI_ASLR_HIGHEST_SYSTEM_RANGE_ADDRESS ((PVOID)0x77FFFFFFUL)\n\n#endif\n\nC_ASSERT((ULONG_PTR)MI_ASLR_HIGHEST_SYSTEM_RANGE_ADDRESS - (ULONG_PTR)MI_ASLR_LOWEST_SYSTEM_RANGE_ADDRESS + 1 == (ULONG_PTR)MI_ASLR_BITMAP_SIZE * 8UL * (ULONG_PTR)MM_ALLOCATION_GRANULARITY);\n\n#define NtCurrentProcessId() ((HANDLE)NtCurrentTeb()->ClientId.UniqueProcess)\n#define NtCurrentThreadId() ((HANDLE)NtCurrentTeb()->ClientId.UniqueThread)\n#define NtGetNtdllBase() (CONTAINING_RECORD(NtCurrentPeb()->Ldr->InInitializationOrderModuleList.Flink, LDR_DATA_TABLE_ENTRY, InInitializationOrderLinks)->DllBase)\n\n#define RtlProcessHeap() (NtCurrentPeb()->ProcessHeap)\n\n#if defined(_WIN64)\n#define DECLSPEC_POINTERALIGN DECLSPEC_ALIGN(8)\n#else\n#define DECLSPEC_POINTERALIGN DECLSPEC_ALIGN(4)\n#endif\n\n#define DEFINE_ANYSIZE_STRUCT(varName, baseType, arrayType, arraySize) struct {\\\n    baseType BaseType;\\\n    arrayType Array[(arraySize) - 1];\\\n} varName\n\n#define _1KB (1024ULL)\n#define _1MB (1024ULL * _1KB)\n#define _1GB (1024ULL * _1MB)\n\n#define _KB(x) ((x) * _1KB)\n#define _MB(x) ((x) * _1MB)\n#define _GB(x) ((x) * _1GB)\n\n#define _512KB  _KB(512)\n#define _640MB  _MB(640)\n#define _2GB    _GB(2)\n#define _32GB   _GB(32)\n\n#define MM_SHARED_USER_DATA_VA 0x7FFE0000\n\n#define SharedUserData ((KUSER_SHARED_DATA * const)MM_SHARED_USER_DATA_VA)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/SlimDetours.h",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours)\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n *\n * Source base on Microsoft Detours:\n *\n * Microsoft Research Detours Package, Version 4.0.1\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\n#pragma once\n\n#include <Windows.h>\n\n#if !defined(_X86_) && !defined(_AMD64_) && !defined(_ARM64_)\n#error Unsupported architecture (x86, amd64, arm64)\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Improved original Detours API */\n\n#define DETOUR_INSTRUCTION_TARGET_NONE ((PVOID)0)\n#define DETOUR_INSTRUCTION_TARGET_DYNAMIC ((PVOID)(LONG_PTR)-1)\n\ntypedef struct _DETOUR_TRANSACTION_OPTIONS\n{\n    BOOL fSuspendThreads;\n} DETOUR_TRANSACTION_OPTIONS, *PDETOUR_TRANSACTION_OPTIONS;\n\ntypedef const DETOUR_TRANSACTION_OPTIONS* PCDETOUR_TRANSACTION_OPTIONS;\n\nHRESULT\nNTAPI\nSlimDetoursTransactionBeginEx(\n    _In_ PCDETOUR_TRANSACTION_OPTIONS pOptions);\n\nFORCEINLINE\nHRESULT\nSlimDetoursTransactionBegin(VOID)\n{\n    DETOUR_TRANSACTION_OPTIONS Options;\n    Options.fSuspendThreads = TRUE;\n    return SlimDetoursTransactionBeginEx(&Options);\n}\n\nHRESULT\nNTAPI\nSlimDetoursTransactionAbort(VOID);\n\nHRESULT\nNTAPI\nSlimDetoursTransactionCommit(VOID);\n\nHRESULT\nNTAPI\nSlimDetoursAttach(\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour);\n\ntypedef struct _DETOUR_DETACH_OPTIONS\n{\n    PVOID *ppTrampolineToFreeManually;\n} DETOUR_DETACH_OPTIONS, *PDETOUR_DETACH_OPTIONS;\n\ntypedef const DETOUR_DETACH_OPTIONS* PCDETOUR_DETACH_OPTIONS;\n\nHRESULT\nNTAPI\nSlimDetoursDetachEx(\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour,\n    _In_ PCDETOUR_DETACH_OPTIONS pOptions);\n\nFORCEINLINE\nHRESULT\nSlimDetoursDetach(\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour)\n{\n    DETOUR_DETACH_OPTIONS Options;\n    Options.ppTrampolineToFreeManually = NULL;\n    return SlimDetoursDetachEx(ppPointer, pDetour, &Options);\n}\n\nHRESULT\nNTAPI\nSlimDetoursFreeTrampoline(\n    _In_ PVOID pTrampoline);\n\nPVOID\nNTAPI\nSlimDetoursCodeFromPointer(\n    _In_ PVOID pPointer);\n\nPVOID\nNTAPI\nSlimDetoursCopyInstruction(\n    _In_opt_ PVOID pDst,\n    _In_ PVOID pSrc,\n    _Out_opt_ PVOID* ppTarget,\n    _Out_opt_ LONG* plExtra);\n\nHRESULT\nNTAPI\nSlimDetoursUninitialize(VOID);\n\n/* Inline Hook, base on Detours */\n\n/// <summary>\n/// Set or unset a single inline hook\n/// </summary>\n/// <param name=\"bEnable\">Set to TRUE to hook, or FALSE to unhook.</param>\n/// <param name=\"ppPointer\">See also SlimDetoursAttach or SlimDetoursDetach.</param>\n/// <param name=\"pDetour\">See also SlimDetoursAttach or SlimDetoursDetach.</param>\n/// <returns>Returns HRESULT</returns>\n/// <seealso cref=\"SlimDetoursAttach\"/>\n/// <seealso cref=\"SlimDetoursDetach\"/>\nHRESULT\nNTAPI\nSlimDetoursInlineHook(\n    _In_ BOOL bEnable,\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour);\n\ntypedef struct _DETOUR_INLINE_HOOK\n{\n    PCSTR pszFuncName;  // Can be an ordinal\n    PVOID* ppPointer;   // Pointer to a variable contains the original function address before hooking,\n                        // and will be replaced with trampoline address after hooking\n    PVOID pDetour;      // Address of detour function\n} DETOUR_INLINE_HOOK, *PDETOUR_INLINE_HOOK;\n\n/// <summary>\n/// Initialize an inline hook array\n/// </summary>\n/// <param name=\"hModule\">Handle to the module exported those functions.</param>\n/// <param name=\"ppPointer\">See also <c>SlimDetoursAttach</c> or <c>SlimDetoursDetach</c>.</param>\n/// <param name=\"pDetour\">See also <c>SlimDetoursAttach</c> or <c>SlimDetoursDetach</c>.</param>\n/// <returns>Return HRESULT</returns>\n/// <remarks>\n/// Get function address by <c>pszFuncName</c> and store in <c>*ppPointer</c>\n/// for each <c>DETOUR_INLINE_HOOK</c> element.\n/// </remarks>\n/// <seealso cref=\"SlimDetoursAttach\"/>\n/// <seealso cref=\"SlimDetoursDetach\"/>\nHRESULT\nNTAPI\nSlimDetoursInitInlineHooks(\n    _In_ HMODULE hModule,\n    _In_ ULONG ulCount,\n    _Inout_updates_(ulCount) PDETOUR_INLINE_HOOK pHooks);\n\n/// <summary>\n/// Set or unset multiple inline hooks in a same target module\n/// </summary>\n/// <param name=\"bEnable\">Set to TRUE to hook, or FALSE to unhook.</param>\n/// <param name=\"ulCount\">Number of elements in <c>pHooks</c> array.</param>\n/// <param name=\"pHooks\">A pointer point to an <c>DETOUR_INLINE_HOOK</c> array.</param>\n/// <returns>Return HRESULT</returns>\n/// <remarks>\n/// <c>*ppPointer</c> and <c>pDetour</c> in <c>DETOUR_INLINE_HOOK</c>\n/// should be initialized before calling this function.\n/// </remarks>\n/// <seealso cref=\"SlimDetoursInitInlineHooks\"/>\n/// <seealso cref=\"SlimDetoursInlineHook\"/>\nHRESULT\nNTAPI\nSlimDetoursInlineHooks(\n    _In_ BOOL bEnable,\n    _In_ ULONG ulCount,\n    _Inout_updates_(ulCount) PDETOUR_INLINE_HOOK pHooks);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/SlimDetours.inl",
    "content": "﻿#pragma once\n\n#include <SdkDdkVer.h>\n\n#include \"SlimDetours.NDK.inl\"\n#include \"SlimDetours.h\"\n\n#include <suppress.h>\n\n#if _DEBUG\n#define DETOUR_TRACE DbgPrint\n#define DETOUR_BREAK() __debugbreak()\n#else\n#define DETOUR_TRACE(Format, ...)\n#define DETOUR_BREAK()\n#endif\n\nEXTERN_C_START\n\n/* Basic structures */\n\ntypedef struct _DETOUR_ALIGN\n{\n    BYTE obTarget : 3;\n    BYTE obTrampoline : 5;\n} DETOUR_ALIGN, *PDETOUR_ALIGN;\n\n_STATIC_ASSERT(sizeof(DETOUR_ALIGN) == 1);\n\ntypedef struct _DETOUR_TRAMPOLINE\n{\n    // An X64 instuction can be 15 bytes long.\n    // In practice 11 seems to be the limit.\n    // \n    // An ARM64 instruction is 4 bytes long.\n    //\n    // The overwrite is always composed of 3 instructions (12 bytes) which perform an indirect jump\n    // using _DETOUR_TRAMPOLINE::pbDetour as the address holding the target location.\n    //\n    // Copied instructions can expand.\n    //\n    // The scheme using MovImmediate can cause an instruction\n    // to grow as much as 6 times.\n    // That would be Bcc or Tbz with a large address space:\n    //   4 instructions to form immediate\n    //   inverted tbz/bcc\n    //   br\n    //\n    // An expansion of 4 is not uncommon -- bl/blr and small address space:\n    //   3 instructions to form immediate\n    //   br or brl\n    //\n    // A theoretical maximum for rbCode is thefore 4*4*6 + 16 = 112 (another 16 for jmp to pbRemain).\n    //\n    // With literals, the maximum expansion is 5, including the literals: 4*4*5 + 16 = 96.\n    //\n    // The number is rounded up to 128. m_rbScratchDst should match this.\n    //\n#if defined(_X86_) || defined(_AMD64_)\n    BYTE            rbCode[30];         // target code + jmp to pbRemain.\n#elif defined(_ARM64_)\n    BYTE            rbCode[128];        // target code + jmp to pbRemain.\n#endif\n    BYTE            cbCode;             // size of moved target code.\n#if defined(_X86_) || defined(_AMD64_)\n    BYTE            cbCodeBreak;        // padding to make debugging easier.\n#elif defined(_ARM64_)\n    BYTE            cbCodeBreak[3];     // padding to make debugging easier.\n#endif\n#if defined(_X86_)\n    BYTE            rbRestore[22];      // original target code.\n#elif defined(_AMD64_)\n    BYTE            rbRestore[30];      // original target code.\n#elif defined(_ARM64_)\n    BYTE            rbRestore[24];      // original target code.\n#endif\n    BYTE            cbRestore;          // size of original target code.\n#if defined(_X86_) || defined(_AMD64_)\n    BYTE            cbRestoreBreak;     // padding to make debugging easier.\n#elif defined(_ARM64_)\n    BYTE            cbRestoreBreak[3];  // padding to make debugging easier.\n#endif\n    DETOUR_ALIGN    rAlign[8];          // instruction alignment array.\n    PBYTE           pbRemain;           // first instruction after moved code. [free list]\n    PBYTE           pbDetour;           // first instruction of detour function.\n#if defined(_X86_) || defined(_AMD64_)\n    BYTE            rbCodeIn[8];        // jmp [pbDetour]\n#endif\n} DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;\n\n#if defined(_X86_)\n_STATIC_ASSERT(sizeof(DETOUR_TRAMPOLINE) == 80);\n#elif defined(_AMD64_)\n_STATIC_ASSERT(sizeof(DETOUR_TRAMPOLINE) == 96);\n#elif defined(_ARM64_)\n_STATIC_ASSERT(sizeof(DETOUR_TRAMPOLINE) == 184);\n#endif\n\nenum\n{\n    DETOUR_OPERATION_NONE = 0,\n    DETOUR_OPERATION_ADD,\n    DETOUR_OPERATION_REMOVE,\n};\n\ntypedef struct _DETOUR_OPERATION DETOUR_OPERATION, *PDETOUR_OPERATION;\n\nstruct _DETOUR_OPERATION\n{\n    PDETOUR_OPERATION pNext;\n    DWORD dwOperation;\n    PBYTE* ppbPointer;\n    PBYTE pbTarget;\n    PDETOUR_TRAMPOLINE pTrampoline;\n    ULONG dwPerm;\n    PVOID* ppTrampolineToFreeManually;\n};\n\n/* Memory management */\n\nVOID\ndetour_memory_init(VOID);\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\ndetour_memory_alloc(\n    _In_ SIZE_T Size);\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\ndetour_memory_realloc(\n    _Frees_ptr_opt_ PVOID BaseAddress,\n    _In_ SIZE_T Size);\n\nBOOL\ndetour_memory_free(\n    _Frees_ptr_ PVOID BaseAddress);\n\nBOOL\ndetour_memory_uninitialize(VOID);\n\nBOOL\ndetour_memory_is_system_reserved(\n    _In_ PVOID Address);\n\n_Ret_notnull_\nPVOID\ndetour_memory_2gb_below(\n    _In_ PVOID Address);\n\n_Ret_notnull_\nPVOID\ndetour_memory_2gb_above(\n    _In_ PVOID Address);\n\n/* Instruction Utility */\n\nenum\n{\n#if defined(_X86_) || defined(_AMD64_)\n    SIZE_OF_JMP = 5\n#elif defined(_ARM64_)\n    SIZE_OF_JMP = 12\n#endif\n};\n\n#if defined(_X86_) || defined(_AMD64_)\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_immediate(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbJmpVal);\n\nBOOL\ndetour_is_jmp_immediate_to(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbJmpVal);\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_indirect(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE* ppbJmpVal);\n\nBOOL\ndetour_is_jmp_indirect_to(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE* ppbJmpVal);\n\n#elif defined(_ARM64_)\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_immediate(\n    _In_ PBYTE pbCode,\n    _In_opt_ PBYTE* ppPool,\n    _In_ PBYTE pbJmpVal);\n\n_Ret_notnull_\nPBYTE\ndetour_gen_jmp_indirect(\n    _In_ PBYTE pbCode,\n    _In_ PULONG64 pbJmpVal);\n\nBOOL\ndetour_is_jmp_indirect_to(\n    _In_ PBYTE pbCode,\n    _In_ PULONG64 pbJmpVal);\n\n#endif\n\n_Ret_notnull_\nPBYTE\ndetour_gen_brk(\n    _In_ PBYTE pbCode,\n    _In_ PBYTE pbLimit);\n\n_Ret_notnull_\nPBYTE\ndetour_skip_jmp(\n    _In_ PBYTE pbCode);\n\nVOID\ndetour_find_jmp_bounds(\n    _In_ PBYTE pbCode,\n    _Outptr_ PVOID* ppLower,\n    _Outptr_ PVOID* ppUpper);\n\nBOOL\ndetour_does_code_end_function(\n    _In_ PBYTE pbCode);\n\nULONG\ndetour_is_code_filler(\n    _In_ PBYTE pbCode);\n\n/* Thread management */\n\nNTSTATUS\ndetour_thread_suspend(\n    _Outptr_result_maybenull_ PHANDLE* SuspendedHandles,\n    _Out_ PULONG SuspendedHandleCount);\n\nVOID\ndetour_thread_resume(\n    _In_reads_(SuspendedHandleCount) _Frees_ptr_ PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount);\n\nNTSTATUS\ndetour_thread_update(\n    _In_ HANDLE ThreadHandle,\n    _In_ PDETOUR_OPERATION PendingOperations);\n\n/* Trampoline management */\n\nNTSTATUS\ndetour_writable_trampoline_regions(VOID);\n\nVOID\ndetour_runnable_trampoline_regions(VOID);\n\n_Ret_maybenull_\nPDETOUR_TRAMPOLINE\ndetour_alloc_trampoline(\n    _In_ PBYTE pbTarget);\n\nVOID\ndetour_free_trampoline(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline);\n\nVOID detour_free_unused_trampoline_regions(VOID);\n\nVOID\ndetour_free_trampoline_region_if_unused(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline);\n\nBYTE\ndetour_align_from_trampoline(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline,\n    BYTE obTrampoline);\n\nBYTE\ndetour_align_from_target(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline,\n    BYTE obTarget);\n\nEXTERN_C_END\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Thread.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Thread management\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\nstatic HANDLE s_Handles[32];\n\n#if _WIN32_WINNT >= _WIN32_WINNT_WIN6\n\nstatic BOOL g_CurrentThreadSkipped = FALSE;\nstatic HANDLE g_PrevThreadHandle = NULL;\n\nstatic\nVOID\ndetour_suspend_next_thread_rest(VOID)\n{\n    g_PrevThreadHandle = NULL;\n    g_CurrentThreadSkipped = FALSE;\n}\n\nstatic\nNTSTATUS\ndetour_suspend_next_thread(\n    _Out_ PHANDLE NextThreadHandle)\n{\n    NTSTATUS Status;\n    THREAD_BASIC_INFORMATION TBI;\n    BOOL ClosePrevThread = FALSE;\n\n_Next_thread:\n    /* Get next thread */\n    Status = NtGetNextThread(NtCurrentProcess(),\n                             g_PrevThreadHandle,\n                             THREAD_QUERY_LIMITED_INFORMATION | THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT,\n                             0,\n                             0,\n                             NextThreadHandle);\n    if (ClosePrevThread)\n    {\n        NtClose(g_PrevThreadHandle);\n    }\n    if (!NT_SUCCESS(Status))\n    {\n        if (Status == STATUS_NO_MORE_ENTRIES)\n        {\n            *NextThreadHandle = NULL;\n            Status = STATUS_SUCCESS;\n        }\n        detour_suspend_next_thread_rest();\n        return Status;\n    }\n\n    /* Skip current thread */\n    if (g_CurrentThreadSkipped)\n    {\n        goto _Suspend_thread;\n    }\n    /* False positive warning, *NextThreadHandle should be already assigned */\n#pragma warning(disable: __WARNING_USING_UNINIT_VAR)\n    Status = NtQueryInformationThread(*NextThreadHandle, ThreadBasicInformation, &TBI, sizeof(TBI), NULL);\n#pragma warning(default: __WARNING_USING_UNINIT_VAR)\n    if (!NT_SUCCESS(Status))\n    {\n        goto _Step_next;\n    }\n    if (TBI.ClientId.UniqueThread == NtCurrentThreadId())\n    {\n        g_CurrentThreadSkipped = TRUE;\n        goto _Step_next;\n    }\n\n_Suspend_thread:\n    if (NT_SUCCESS(NtSuspendThread(*NextThreadHandle, NULL)))\n    {\n        g_PrevThreadHandle = *NextThreadHandle;\n        return STATUS_SUCCESS;\n    }\n_Step_next:\n    g_PrevThreadHandle = *NextThreadHandle;\n    ClosePrevThread = TRUE;\n    goto _Next_thread;\n}\n\n#else\n\nstatic PSYSTEM_PROCESS_INFORMATION g_SPI = NULL;\nstatic PSYSTEM_THREAD_INFORMATION g_STI;\nstatic ULONG g_ThreadCount;\nstatic OBJECT_ATTRIBUTES g_EmptyObjectAttributes = RTL_CONSTANT_OBJECT_ATTRIBUTES(NULL, 0);\n\nstatic\nVOID\ndetour_suspend_next_thread_rest(VOID)\n{\n    detour_memory_free(g_SPI);\n    g_SPI = NULL;\n}\n\nstatic\nNTSTATUS\ndetour_suspend_next_thread(\n    _Out_ PHANDLE ThreadHandle)\n{\n    NTSTATUS Status;\n    ULONG i;\n    PSYSTEM_PROCESS_INFORMATION pSPI;\n    PSYSTEM_THREAD_INFORMATION pSTI;\n\n    if (g_SPI == NULL)\n    {\n        /* Get system process and thread information */\n        i = _1MB;\n_Try_alloc:\n        g_SPI = (PSYSTEM_PROCESS_INFORMATION)detour_memory_alloc(i);\n        if (g_SPI == NULL)\n        {\n            return STATUS_NO_MEMORY;\n        }\n        Status = NtQuerySystemInformation(SystemProcessInformation, g_SPI, i, &i);\n        if (!NT_SUCCESS(Status))\n        {\n            detour_memory_free(g_SPI);\n            if (Status == STATUS_INFO_LENGTH_MISMATCH)\n            {\n                goto _Try_alloc;\n            }\n            g_SPI = NULL;\n            return Status;\n        }\n\n        /* Find current process and threads */\n        pSPI = g_SPI;\n        while (pSPI->UniqueProcessId != NtCurrentProcessId())\n        {\n            if (pSPI->NextEntryOffset == 0)\n            {\n                detour_suspend_next_thread_rest();\n                return STATUS_NOT_FOUND;\n            }\n            pSPI = (PSYSTEM_PROCESS_INFORMATION)Add2Ptr(pSPI, pSPI->NextEntryOffset);\n        }\n        g_ThreadCount = pSPI->NumberOfThreads;\n        pSTI = (PSYSTEM_THREAD_INFORMATION)Add2Ptr(pSPI, sizeof(*pSPI));\n    } else\n    {\n        pSTI = g_STI + 1;\n    }\n    if (g_ThreadCount == 0)\n    {\n        goto _No_more_thread;\n    }\n\n_Suspend_thread:\n    g_ThreadCount--;\n    /* Open and suspend thread, skip current thread */\n    if (pSTI->ClientId.UniqueThread != NtCurrentThreadId() &&\n        NT_SUCCESS(NtOpenThread(ThreadHandle,\n                                THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT,\n                                &g_EmptyObjectAttributes,\n                                &pSTI->ClientId)))\n    {\n        if (NT_SUCCESS(NtSuspendThread(*ThreadHandle, NULL)))\n        {\n            g_STI = pSTI;\n            return STATUS_SUCCESS;\n        } else\n        {\n            NtClose(*ThreadHandle);\n        }\n    }\n\n    if (g_ThreadCount)\n    {\n        pSTI += 1;\n        goto _Suspend_thread;\n    }\n_No_more_thread:\n    *ThreadHandle = NULL;\n    detour_suspend_next_thread_rest();\n    return STATUS_SUCCESS;\n}\n\n#endif\n\nNTSTATUS\ndetour_thread_suspend(\n    _Outptr_result_maybenull_ PHANDLE* SuspendedHandles,\n    _Out_ PULONG SuspendedHandleCount)\n{\n    NTSTATUS Status;\n    PHANDLE Buffer = s_Handles;\n    ULONG BufferCapacity = ARRAYSIZE(s_Handles);\n    ULONG SuspendedCount = 0;\n    HANDLE ThreadHandle;\n\n    /* Suspend next thread and get handle */\n_Suspend_next_thread:\n    Status = detour_suspend_next_thread(&ThreadHandle);\n    if (!NT_SUCCESS(Status))\n    {\n        goto _Fail;\n    } else if (ThreadHandle == NULL)\n    {\n        goto _Exit;\n    }\n\n    /* Allocate buffer dynamically if static buffer is insufficient */\n    if (SuspendedCount >= BufferCapacity)\n    {\n        BufferCapacity *= 2;\n\n        PHANDLE p;\n        if (Buffer == s_Handles)\n        {\n            p = (PHANDLE)detour_memory_alloc(BufferCapacity * sizeof(HANDLE));\n            if (p)\n            {\n                RtlCopyMemory(p, Buffer, SuspendedCount * sizeof(HANDLE));\n            }\n        } else\n        {\n            p = (PHANDLE)detour_memory_realloc(Buffer, BufferCapacity * sizeof(HANDLE));\n        }\n\n        if (p)\n        {\n            Buffer = p;\n        } else\n        {\n            Status = STATUS_NO_MEMORY;\n            NtResumeThread(ThreadHandle, NULL);\n            NtClose(ThreadHandle);\n            detour_suspend_next_thread_rest();\n            goto _Fail;\n        }\n    }\n\n    // Perform a synchronous operation to make sure the thread really is suspended.\n    // https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743\n    CONTEXT cxt;\n    cxt.ContextFlags = CONTEXT_CONTROL;\n    NtGetContextThread(ThreadHandle, &cxt);\n\n    Buffer[SuspendedCount++] = ThreadHandle;\n    goto _Suspend_next_thread;\n\n_Fail:\n    for (ULONG i = 0; i < SuspendedCount; ++i)\n    {\n        NtResumeThread(Buffer[i], NULL);\n        NtClose(Buffer[i]);\n    }\n    if (Buffer != s_Handles)\n    {\n        detour_memory_free(Buffer);\n    }\n\n    Buffer = NULL;\n    SuspendedCount = 0;\n\n_Exit:\n    *SuspendedHandles = Buffer;\n    *SuspendedHandleCount = SuspendedCount;\n\n    return Status;\n}\n\nVOID\ndetour_thread_resume(\n    _In_reads_(SuspendedHandleCount) _Frees_ptr_ PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount)\n{\n    for (ULONG i = 0; i < SuspendedHandleCount; i++)\n    {\n        NtResumeThread(SuspendedHandles[i], NULL);\n        NtClose(SuspendedHandles[i]);\n    }\n\n    if (SuspendedHandles != s_Handles)\n    {\n        detour_memory_free(SuspendedHandles);\n    }\n}\n\nNTSTATUS\ndetour_thread_update(\n    _In_ HANDLE ThreadHandle,\n    _In_ PDETOUR_OPERATION PendingOperations)\n{\n    NTSTATUS Status;\n    CONTEXT cxt;\n    BOOL bUpdateContext;\n\n    /*\n     * Work-around an issue in Arm64 (and Arm64EC) in which LR and FP registers may become zeroed\n     * when CONTEXT_CONTROL is used without CONTEXT_INTEGER.\n     *\n     * See also: https://github.com/microsoft/Detours/pull/313\n     */\n#if defined(_AMD64_) || defined(_ARM64_)\n    cxt.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;\n#else\n    cxt.ContextFlags = CONTEXT_CONTROL;\n#endif\n\n    Status = NtGetContextThread(ThreadHandle, &cxt);\n    if (!NT_SUCCESS(Status))\n    {\n        return Status;\n    }\n\n    bUpdateContext = FALSE;\n    for (PDETOUR_OPERATION o = PendingOperations; o != NULL && !bUpdateContext; o = o->pNext)\n    {\n        if (o->dwOperation == DETOUR_OPERATION_REMOVE)\n        {\n            if (cxt.CONTEXT_PC >= (ULONG_PTR)o->pTrampoline->rbCode &&\n                cxt.CONTEXT_PC < ((ULONG_PTR)o->pTrampoline->rbCode + RTL_FIELD_SIZE(DETOUR_TRAMPOLINE, rbCode)))\n            {\n                cxt.CONTEXT_PC = (ULONG_PTR)o->pbTarget +\n                    detour_align_from_trampoline(o->pTrampoline, (BYTE)(cxt.CONTEXT_PC - (ULONG_PTR)o->pTrampoline));\n                bUpdateContext = TRUE;\n            }\n#if defined(_X86_) || defined(_AMD64_)\n            else if (cxt.CONTEXT_PC == (ULONG_PTR)o->pTrampoline->rbCodeIn)\n            {\n                cxt.CONTEXT_PC = (ULONG_PTR)o->pbTarget;\n                bUpdateContext = TRUE;\n            }\n#endif\n        } else if (o->dwOperation == DETOUR_OPERATION_ADD)\n        {\n            if (cxt.CONTEXT_PC >= (ULONG_PTR)o->pbTarget &&\n                cxt.CONTEXT_PC < ((ULONG_PTR)o->pbTarget + o->pTrampoline->cbRestore))\n            {\n                cxt.CONTEXT_PC = (ULONG_PTR)o->pTrampoline +\n                    detour_align_from_target(o->pTrampoline, (BYTE)(cxt.CONTEXT_PC - (ULONG_PTR)o->pbTarget));\n                bUpdateContext = TRUE;\n            }\n        }\n    }\n\n    if (bUpdateContext)\n    {\n        Status = NtSetContextThread(ThreadHandle, &cxt);\n    }\n\n    return Status;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Trampoline.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Trampoline management\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n *\n * Source base on Microsoft Detours:\n *\n * Microsoft Research Detours Package, Version 4.0.1\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\ntypedef struct _DETOUR_REGION DETOUR_REGION, *PDETOUR_REGION;\n\nstruct _DETOUR_REGION\n{\n    ULONGLONG ullSignature;\n    PDETOUR_REGION pNext;       // Next region in list of regions.\n    PDETOUR_TRAMPOLINE pFree;   // List of free trampolines in this region.\n};\n\n#define DETOUR_REGION_SIGNATURE ((ULONGLONG)'lSNK' << 32 | 'srtD')\n#define DETOUR_REGION_SIZE 0x10000UL\n#define DETOUR_TRAMPOLINES_PER_REGION ((DETOUR_REGION_SIZE / sizeof(DETOUR_TRAMPOLINE)) - 1)\nstatic PDETOUR_REGION s_pRegions = NULL; // List of all regions.\nstatic PDETOUR_REGION s_pRegion = NULL; // Default region.\n\nNTSTATUS\ndetour_writable_trampoline_regions(VOID)\n{\n    NTSTATUS Status;\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n\n    // Mark all of the regions as writable.\n    sMem = DETOUR_REGION_SIZE;\n    for (PDETOUR_REGION pRegion = s_pRegions; pRegion != NULL; pRegion = pRegion->pNext)\n    {\n        pMem = pRegion;\n        Status = NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, PAGE_EXECUTE_READWRITE, &dwOld);\n        if (!NT_SUCCESS(Status))\n        {\n            return Status;\n        }\n    }\n    return STATUS_SUCCESS;\n}\n\nVOID\ndetour_runnable_trampoline_regions(VOID)\n{\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n\n    // Mark all of the regions as executable.\n    sMem = DETOUR_REGION_SIZE;\n    for (PDETOUR_REGION pRegion = s_pRegions; pRegion != NULL; pRegion = pRegion->pNext)\n    {\n        pMem = pRegion;\n        NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, PAGE_EXECUTE_READ, &dwOld);\n        NtFlushInstructionCache(NtCurrentProcess(), pRegion, DETOUR_REGION_SIZE);\n    }\n}\n\nstatic\nPBYTE\ndetour_alloc_round_down_to_region(\n    PBYTE pbTry)\n{\n    // WinXP64 returns free areas that aren't REGION aligned to 32-bit applications.\n    ULONG_PTR extra = ((ULONG_PTR)pbTry) & (DETOUR_REGION_SIZE - 1);\n    if (extra != 0)\n    {\n        pbTry -= extra;\n    }\n    return pbTry;\n}\n\nstatic\nPBYTE\ndetour_alloc_round_up_to_region(\n    PBYTE pbTry)\n{\n    // WinXP64 returns free areas that aren't REGION aligned to 32-bit applications.\n    ULONG_PTR extra = ((ULONG_PTR)pbTry) & (DETOUR_REGION_SIZE - 1);\n    if (extra != 0)\n    {\n        ULONG_PTR adjust = DETOUR_REGION_SIZE - extra;\n        pbTry += adjust;\n    }\n    return pbTry;\n}\n\n// Starting at pbLo, try to allocate a memory region, continue until pbHi.\n\nstatic\nPVOID\ndetour_alloc_region_from_lo(\n    PBYTE pbLo,\n    PBYTE pbHi)\n{\n    NTSTATUS Status;\n    PVOID pMem;\n    SIZE_T sMem;\n    MEMORY_BASIC_INFORMATION mbi;\n\n    PBYTE pbTry = detour_alloc_round_up_to_region(pbLo);\n\n    DETOUR_TRACE(\" Looking for free region in %p..%p from %p:\\n\", pbLo, pbHi, pbTry);\n\n    while (pbTry < pbHi)\n    {\n        if (detour_memory_is_system_reserved(pbTry))\n        {\n            // Skip region reserved for system DLLs, but preserve address space entropy.\n            pbTry += 0x08000000;\n            continue;\n        }\n\n        if (!NT_SUCCESS(NtQueryVirtualMemory(NtCurrentProcess(),\n                                             pbTry,\n                                             MemoryBasicInformation,\n                                             &mbi,\n                                             sizeof(mbi),\n                                             NULL)))\n        {\n            break;\n        }\n\n        DETOUR_TRACE(\"  Try %p => %p..%p %6lx\\n\",\n                     pbTry,\n                     mbi.BaseAddress,\n                     Add2Ptr(mbi.BaseAddress, mbi.RegionSize - 1),\n                     mbi.State);\n\n        if (mbi.State == MEM_FREE && mbi.RegionSize >= DETOUR_REGION_SIZE)\n        {\n            pMem = pbTry;\n            sMem = DETOUR_REGION_SIZE;\n            Status = NtAllocateVirtualMemory(NtCurrentProcess(),\n                                             &pMem,\n                                             0,\n                                             &sMem,\n                                             MEM_COMMIT | MEM_RESERVE,\n                                             PAGE_EXECUTE_READWRITE);\n            if (NT_SUCCESS(Status))\n            {\n                return pMem;\n            } else if (Status == STATUS_DYNAMIC_CODE_BLOCKED)\n            {\n                return NULL;\n            }\n            pbTry += DETOUR_REGION_SIZE;\n        } else\n        {\n            pbTry = detour_alloc_round_up_to_region((PBYTE)mbi.BaseAddress + mbi.RegionSize);\n        }\n    }\n    return NULL;\n}\n\n// Starting at pbHi, try to allocate a memory region, continue until pbLo.\n\nstatic\nPVOID\ndetour_alloc_region_from_hi(\n    PBYTE pbLo,\n    PBYTE pbHi)\n{\n    NTSTATUS Status;\n    PVOID pMem;\n    SIZE_T sMem;\n    MEMORY_BASIC_INFORMATION mbi;\n\n    PBYTE pbTry = detour_alloc_round_down_to_region(pbHi - DETOUR_REGION_SIZE);\n\n    DETOUR_TRACE(\" Looking for free region in %p..%p from %p:\\n\", pbLo, pbHi, pbTry);\n\n    while (pbTry > pbLo)\n    {\n        DETOUR_TRACE(\"  Try %p\\n\", pbTry);\n        if (detour_memory_is_system_reserved(pbTry))\n        {\n            // Skip region reserved for system DLLs, but preserve address space entropy.\n            pbTry -= 0x08000000;\n            continue;\n        }\n\n        if (!NT_SUCCESS(NtQueryVirtualMemory(NtCurrentProcess(),\n                                             pbTry,\n                                             MemoryBasicInformation,\n                                             &mbi,\n                                             sizeof(mbi),\n                                             NULL)))\n        {\n            break;\n        }\n\n        DETOUR_TRACE(\"  Try %p => %p..%p %6lx\\n\",\n                     pbTry,\n                     mbi.BaseAddress,\n                     Add2Ptr(mbi.BaseAddress, mbi.RegionSize - 1),\n                     mbi.State);\n\n        if (mbi.State == MEM_FREE && mbi.RegionSize >= DETOUR_REGION_SIZE)\n        {\n            pMem = pbTry;\n            sMem = DETOUR_REGION_SIZE;\n            Status = NtAllocateVirtualMemory(NtCurrentProcess(),\n                                             &pMem,\n                                             0,\n                                             &sMem,\n                                             MEM_COMMIT | MEM_RESERVE,\n                                             PAGE_EXECUTE_READWRITE);\n            if (NT_SUCCESS(Status))\n            {\n                return pMem;\n            } else if (Status == STATUS_DYNAMIC_CODE_BLOCKED)\n            {\n                return NULL;\n            }\n            pbTry -= DETOUR_REGION_SIZE;\n        } else\n        {\n            pbTry = detour_alloc_round_down_to_region((PBYTE)mbi.AllocationBase - DETOUR_REGION_SIZE);\n        }\n    }\n    return NULL;\n}\n\nstatic\nPVOID\ndetour_alloc_trampoline_allocate_new(\n    PBYTE pbTarget,\n    PDETOUR_TRAMPOLINE pLo,\n    PDETOUR_TRAMPOLINE pHi)\n{\n    PVOID pbTry = NULL;\n\n    // NB: We must always also start the search at an offset from pbTarget\n    //     in order to maintain ASLR entropy.\n\n#if defined(_WIN64)\n    // Try looking 1GB below or lower.\n    if (pbTry == NULL && pbTarget > (PBYTE)0x40000000)\n    {\n        pbTry = detour_alloc_region_from_hi((PBYTE)pLo, pbTarget - 0x40000000);\n    }\n    // Try looking 1GB above or higher.\n    if (pbTry == NULL && pbTarget < (PBYTE)0xffffffff40000000)\n    {\n        pbTry = detour_alloc_region_from_lo(pbTarget + 0x40000000, (PBYTE)pHi);\n    }\n    // Try looking 1GB below or higher.\n    if (pbTry == NULL && pbTarget > (PBYTE)0x40000000)\n    {\n        pbTry = detour_alloc_region_from_lo(pbTarget - 0x40000000, pbTarget);\n    }\n    // Try looking 1GB above or lower.\n    if (pbTry == NULL && pbTarget < (PBYTE)0xffffffff40000000)\n    {\n        pbTry = detour_alloc_region_from_hi(pbTarget, pbTarget + 0x40000000);\n    }\n#endif\n\n    // Try anything below.\n    if (pbTry == NULL)\n    {\n        pbTry = detour_alloc_region_from_hi((PBYTE)pLo, pbTarget);\n    }\n    // Try anything above.\n    if (pbTry == NULL)\n    {\n        pbTry = detour_alloc_region_from_lo(pbTarget, (PBYTE)pHi);\n    }\n\n    return pbTry;\n}\n\n_Ret_maybenull_\nPDETOUR_TRAMPOLINE\ndetour_alloc_trampoline(\n    _In_ PBYTE pbTarget)\n{\n    // We have to place trampolines within +/- 2GB of target.\n\n    PDETOUR_TRAMPOLINE pLo;\n    PDETOUR_TRAMPOLINE pHi;\n\n    detour_find_jmp_bounds(pbTarget, (PVOID*)&pLo, (PVOID*)&pHi);\n\n    PDETOUR_TRAMPOLINE pTrampoline = NULL;\n\n    // Insure that there is a default region.\n    if (s_pRegion == NULL && s_pRegions != NULL)\n    {\n        s_pRegion = s_pRegions;\n    }\n\n    // First check the default region for an valid free block.\n    if (s_pRegion != NULL && s_pRegion->pFree != NULL &&\n        s_pRegion->pFree >= pLo && s_pRegion->pFree <= pHi)\n    {\n\nfound_region:\n        pTrampoline = s_pRegion->pFree;\n        // do a last sanity check on region.\n        if (pTrampoline < pLo || pTrampoline > pHi)\n        {\n            return NULL;\n        }\n        s_pRegion->pFree = (PDETOUR_TRAMPOLINE)pTrampoline->pbRemain;\n        RtlFillMemory(pTrampoline, sizeof(*pTrampoline), 0xcc);\n        return pTrampoline;\n    }\n\n    // Then check the existing regions for a valid free block.\n    for (s_pRegion = s_pRegions; s_pRegion != NULL; s_pRegion = s_pRegion->pNext)\n    {\n        if (s_pRegion != NULL && s_pRegion->pFree != NULL && s_pRegion->pFree >= pLo && s_pRegion->pFree <= pHi)\n        {\n            goto found_region;\n        }\n    }\n\n    // We need to allocate a new region.\n\n    // Round pbTarget down to 64KB block.\n    // /RTCc RuntimeChecks breaks PtrToUlong.\n    pbTarget = pbTarget - (ULONG)((ULONG_PTR)pbTarget & 0xffff);\n\n    PVOID pbNewlyAllocated = detour_alloc_trampoline_allocate_new(pbTarget, pLo, pHi);\n    if (pbNewlyAllocated != NULL)\n    {\n        s_pRegion = (DETOUR_REGION*)pbNewlyAllocated;\n        s_pRegion->ullSignature = DETOUR_REGION_SIGNATURE;\n        s_pRegion->pFree = NULL;\n        s_pRegion->pNext = s_pRegions;\n        s_pRegions = s_pRegion;\n        DETOUR_TRACE(\"  Allocated region %p..%p\\n\\n\", s_pRegion, Add2Ptr(s_pRegion, DETOUR_REGION_SIZE - 1));\n\n        // Put everything but the first trampoline on the free list.\n        PBYTE pFree = NULL;\n        pTrampoline = ((PDETOUR_TRAMPOLINE)s_pRegion) + 1;\n        for (int i = DETOUR_TRAMPOLINES_PER_REGION - 1; i > 1; i--)\n        {\n            pTrampoline[i].pbRemain = pFree;\n            pFree = (PBYTE)&pTrampoline[i];\n        }\n        s_pRegion->pFree = (PDETOUR_TRAMPOLINE)pFree;\n        goto found_region;\n    }\n\n    DETOUR_TRACE(\"Couldn't find available memory region!\\n\");\n    return NULL;\n}\n\nVOID\ndetour_free_trampoline(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline)\n{\n    PDETOUR_REGION pRegion = (PDETOUR_REGION)((ULONG_PTR)pTrampoline & ~(ULONG_PTR)0xffff);\n\n    RtlZeroMemory(pTrampoline, sizeof(*pTrampoline));\n    pTrampoline->pbRemain = (PBYTE)pRegion->pFree;\n    pRegion->pFree = pTrampoline;\n}\n\nstatic\nBOOL\ndetour_is_region_empty(\n    PDETOUR_REGION pRegion)\n{\n    // Stop if the region isn't a region (this would be bad).\n    if (pRegion->ullSignature != DETOUR_REGION_SIGNATURE)\n    {\n        return FALSE;\n    }\n\n    PBYTE pbRegionBeg = (PBYTE)pRegion;\n    PBYTE pbRegionLim = pbRegionBeg + DETOUR_REGION_SIZE;\n\n    // Stop if any of the trampolines aren't free.\n    PDETOUR_TRAMPOLINE pTrampoline = ((PDETOUR_TRAMPOLINE)pRegion) + 1;\n    for (int i = 0; i < DETOUR_TRAMPOLINES_PER_REGION; i++)\n    {\n        if (pTrampoline[i].pbRemain != NULL &&\n            (pTrampoline[i].pbRemain < pbRegionBeg ||\n             pTrampoline[i].pbRemain >= pbRegionLim))\n        {\n            return FALSE;\n        }\n    }\n\n    // OK, the region is empty.\n    return TRUE;\n}\n\nstatic\nVOID\ndetour_free_region(\n    _Out_ PDETOUR_REGION* ppRegionBase,\n    _In_ PDETOUR_REGION pRegion)\n{\n    *ppRegionBase = pRegion->pNext;\n    PVOID pMem = pRegion;\n    SIZE_T sMem = 0;\n    NtFreeVirtualMemory(NtCurrentProcess(), &pMem, &sMem, MEM_RELEASE);\n}\n\nVOID\ndetour_free_unused_trampoline_regions(VOID)\n{\n    PDETOUR_REGION* ppRegionBase = &s_pRegions;\n    PDETOUR_REGION pRegion = s_pRegions;\n\n    while (pRegion != NULL)\n    {\n        if (detour_is_region_empty(pRegion))\n        {\n            detour_free_region(ppRegionBase, pRegion);\n            s_pRegion = NULL;\n        } else\n        {\n            ppRegionBase = &pRegion->pNext;\n        }\n        pRegion = *ppRegionBase;\n    }\n}\n\nVOID\ndetour_free_trampoline_region_if_unused(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline)\n{\n    PDETOUR_REGION pTargetRegion = (PDETOUR_REGION)((ULONG_PTR)pTrampoline & ~(ULONG_PTR)0xffff);\n\n    PDETOUR_REGION* ppRegionBase = &s_pRegions;\n    PDETOUR_REGION pRegion = s_pRegions;\n\n    while (pRegion != NULL)\n    {\n        if (pRegion == pTargetRegion)\n        {\n            if (detour_is_region_empty(pRegion))\n            {\n                detour_free_region(ppRegionBase, pRegion);\n                s_pRegion = NULL;\n            }\n            break;\n        }\n\n        ppRegionBase = &pRegion->pNext;\n        pRegion = *ppRegionBase;\n    }\n}\n\nBYTE\ndetour_align_from_trampoline(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline,\n    BYTE obTrampoline)\n{\n    for (ULONG n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++)\n    {\n        if (pTrampoline->rAlign[n].obTrampoline == obTrampoline)\n        {\n            return pTrampoline->rAlign[n].obTarget;\n        }\n    }\n    return 0;\n}\n\nBYTE\ndetour_align_from_target(\n    _In_ PDETOUR_TRAMPOLINE pTrampoline,\n    BYTE obTarget)\n{\n    for (ULONG n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++)\n    {\n        if (pTrampoline->rAlign[n].obTarget == obTarget)\n        {\n            return pTrampoline->rAlign[n].obTrampoline;\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/MinHook-Detours/SlimDetours/Transaction.c",
    "content": "﻿/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Transaction APIs\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n *\n * Source base on Microsoft Detours:\n *\n * Microsoft Research Detours Package, Version 4.0.1\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include \"SlimDetours.inl\"\n\nstatic _Interlocked_operand_ HANDLE volatile s_nPendingThreadId = NULL; // Thread owning pending transaction.\nstatic PHANDLE s_phSuspendedThreads = NULL;\nstatic ULONG s_ulSuspendedThreadCount = 0;\nstatic PDETOUR_OPERATION s_pPendingOperations = NULL;\n\nHRESULT\nNTAPI\nSlimDetoursTransactionBeginEx(\n    _In_ PCDETOUR_TRANSACTION_OPTIONS pOptions)\n{\n    NTSTATUS Status;\n\n    // Make sure only one thread can start a transaction.\n    if (_InterlockedCompareExchangePointer(&s_nPendingThreadId, NtCurrentThreadId(), NULL) != NULL)\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    // Initialize memory management\n    detour_memory_init();\n\n    // Make sure the trampoline pages are writable.\n    Status = detour_writable_trampoline_regions();\n    if (!NT_SUCCESS(Status))\n    {\n        goto fail;\n    }\n\n    if (pOptions->fSuspendThreads)\n    {\n        Status = detour_thread_suspend(&s_phSuspendedThreads, &s_ulSuspendedThreadCount);\n        if (!NT_SUCCESS(Status))\n        {\n            detour_runnable_trampoline_regions();\n            goto fail;\n        }\n    } else\n    {\n        s_phSuspendedThreads = NULL;\n        s_ulSuspendedThreadCount = 0;\n    }\n\n    s_pPendingOperations = NULL;\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n\nfail:\n#ifdef _MSC_VER\n#pragma warning(disable: __WARNING_INTERLOCKED_ACCESS)\n#endif\n    s_nPendingThreadId = NULL;\n#ifdef _MSC_VER\n#pragma warning(default: __WARNING_INTERLOCKED_ACCESS)\n#endif\n    return HRESULT_FROM_NT(Status);\n}\n\nHRESULT\nNTAPI\nSlimDetoursTransactionAbort(VOID)\n{\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n    BOOL freed = FALSE;\n\n    if (s_nPendingThreadId != NtCurrentThreadId())\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    // Restore all of the page permissions.\n    for (PDETOUR_OPERATION o = s_pPendingOperations; o != NULL;)\n    {\n        // We don't care if this fails, because the code is still accessible.\n        pMem = o->pbTarget;\n        sMem = o->pTrampoline->cbRestore;\n        NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, o->dwPerm, &dwOld);\n        if (o->dwOperation == DETOUR_OPERATION_ADD)\n        {\n            detour_free_trampoline(o->pTrampoline);\n            o->pTrampoline = NULL;\n            freed = TRUE;\n        }\n\n        PDETOUR_OPERATION n = o->pNext;\n        detour_memory_free(o);\n        o = n;\n    }\n    s_pPendingOperations = NULL;\n    if (freed)\n    {\n        detour_free_unused_trampoline_regions();\n    }\n\n    // Make sure the trampoline pages are no longer writable.\n    detour_runnable_trampoline_regions();\n\n    // Resume any suspended threads.\n    detour_thread_resume(s_phSuspendedThreads, s_ulSuspendedThreadCount);\n\n    s_phSuspendedThreads = NULL;\n    s_ulSuspendedThreadCount = 0;\n    s_nPendingThreadId = NULL;\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n}\n\nHRESULT\nNTAPI\nSlimDetoursTransactionCommit(VOID)\n{\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n\n    // Common variables.\n    PDETOUR_OPERATION o, n, m;\n    PBYTE pbCode;\n    BOOL freed = FALSE;\n    ULONG i;\n\n    if (s_nPendingThreadId != NtCurrentThreadId())\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    if (s_pPendingOperations == NULL)\n    {\n        goto _exit;\n    }\n\n    // Insert each of the detours.\n    for (o = s_pPendingOperations; o != NULL; o = o->pNext)\n    {\n        if (o->dwOperation != DETOUR_OPERATION_ADD)\n            continue;\n\n        DETOUR_TRACE(\"detours: pbTramp =%p, pbRemain=%p, pbDetour=%p, cbRestore=%u\\n\",\n            o->pTrampoline,\n            o->pTrampoline->pbRemain,\n            o->pTrampoline->pbDetour,\n            o->pTrampoline->cbRestore);\n\n        DETOUR_TRACE(\"detours: pbTarget=%p: \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x [before]\\n\",\n            o->pbTarget,\n            o->pbTarget[0], o->pbTarget[1], o->pbTarget[2], o->pbTarget[3],\n            o->pbTarget[4], o->pbTarget[5], o->pbTarget[6], o->pbTarget[7],\n            o->pbTarget[8], o->pbTarget[9], o->pbTarget[10], o->pbTarget[11]);\n\n        m = NULL;\n        if (!RtlEqualMemory(o->pbTarget, o->pTrampoline->rbRestore, o->pTrampoline->cbRestore))\n        {\n            DETOUR_TRACE(\"detours: target is modified\\n\");\n\n            for (n = s_pPendingOperations; n != o; n = n->pNext)\n            {\n                if (n->dwOperation == DETOUR_OPERATION_ADD && n->pbTarget == o->pbTarget)\n                {\n                    m = n;\n                }\n            }\n        }\n\n        if (m != NULL)\n        {\n            DETOUR_TRACE(\"detours: chaining to last detour in the transaction\\n\");\n\n#if defined(_X86_) || defined(_AMD64_)\n            pbCode = detour_gen_jmp_indirect(o->pTrampoline->rbCode, &m->pTrampoline->pbDetour);\n#elif defined(_ARM64_)\n            pbCode = detour_gen_jmp_indirect(o->pTrampoline->rbCode, (ULONG64*)&(m->pTrampoline->pbDetour));\n#endif\n            o->pTrampoline->cbCode = 0;\n\n            CopyMemory(o->pTrampoline->rbRestore, o->pbTarget, m->pTrampoline->cbRestore);\n            o->pTrampoline->cbRestore = m->pTrampoline->cbRestore;\n\n            RtlZeroMemory(o->pTrampoline->rAlign, sizeof(o->pTrampoline->rAlign));\n            o->pTrampoline->pbRemain = o->pbTarget + o->pTrampoline->cbRestore;\n        }\n\n#if defined(_X86_) || defined(_AMD64_)\n        pbCode = detour_gen_jmp_indirect(o->pTrampoline->rbCodeIn, &o->pTrampoline->pbDetour);\n        NtFlushInstructionCache(NtCurrentProcess(), o->pTrampoline->rbCodeIn, pbCode - o->pTrampoline->rbCodeIn);\n        pbCode = detour_gen_jmp_immediate(o->pbTarget, o->pTrampoline->rbCodeIn);\n#elif defined(_ARM64_)\n        pbCode = detour_gen_jmp_indirect(o->pbTarget, (ULONG64*)&(o->pTrampoline->pbDetour));\n#endif\n        pbCode = detour_gen_brk(pbCode, o->pTrampoline->pbRemain);\n        NtFlushInstructionCache(NtCurrentProcess(), o->pbTarget, pbCode - o->pbTarget);\n\n        *o->ppbPointer = o->pTrampoline->rbCode;\n\n        DETOUR_TRACE(\"detours: pbTarget=%p: \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x [after]\\n\",\n            o->pbTarget,\n            o->pbTarget[0], o->pbTarget[1], o->pbTarget[2], o->pbTarget[3],\n            o->pbTarget[4], o->pbTarget[5], o->pbTarget[6], o->pbTarget[7],\n            o->pbTarget[8], o->pbTarget[9], o->pbTarget[10], o->pbTarget[11]);\n\n        DETOUR_TRACE(\"detours: pbTramp =%p: \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x \"\n            \"%02x %02x %02x %02x\\n\",\n            o->pTrampoline,\n            o->pTrampoline->rbCode[0], o->pTrampoline->rbCode[1],\n            o->pTrampoline->rbCode[2], o->pTrampoline->rbCode[3],\n            o->pTrampoline->rbCode[4], o->pTrampoline->rbCode[5],\n            o->pTrampoline->rbCode[6], o->pTrampoline->rbCode[7],\n            o->pTrampoline->rbCode[8], o->pTrampoline->rbCode[9],\n            o->pTrampoline->rbCode[10], o->pTrampoline->rbCode[11]);\n    }\n\n    // Remove each of the detours.\n    for (o = s_pPendingOperations; o != NULL; o = o->pNext)\n    {\n        if (o->dwOperation != DETOUR_OPERATION_REMOVE)\n            continue;\n\n        // Check if the jmps still points where we expect, otherwise someone might have hooked us.\n        BOOL hookIsStillThere =\n#if defined(_X86_) || defined(_AMD64_)\n            detour_is_jmp_immediate_to(o->pbTarget, o->pTrampoline->rbCodeIn) &&\n            detour_is_jmp_indirect_to(o->pTrampoline->rbCodeIn, &o->pTrampoline->pbDetour);\n#elif defined(_ARM64_)\n            detour_is_jmp_indirect_to(o->pbTarget, (ULONG64*)&(o->pTrampoline->pbDetour));\n#endif\n\n        if (hookIsStillThere)\n        {\n            RtlCopyMemory(o->pbTarget, o->pTrampoline->rbRestore, o->pTrampoline->cbRestore);\n            NtFlushInstructionCache(NtCurrentProcess(), o->pbTarget, o->pTrampoline->cbRestore);\n        } else\n        {\n            // Don't remove and leak trampoline in this case.\n            o->dwOperation = DETOUR_OPERATION_NONE;\n            DETOUR_TRACE(\"detours: Leaked hook on pbTarget=%p due to external hooking\\n\", o->pbTarget);\n        }\n\n        // Put hook in bypass mode.\n        o->pTrampoline->pbDetour = o->pTrampoline->rbCode;\n\n        *o->ppbPointer = o->pbTarget;\n    }\n\n    // Update any suspended threads.\n    for (i = 0; i < s_ulSuspendedThreadCount; i++)\n    {\n        detour_thread_update(s_phSuspendedThreads[i], s_pPendingOperations);\n    }\n\n    // Restore all of the page permissions and free any trampoline regions that are now unused.\n    for (o = s_pPendingOperations; o != NULL;)\n    {\n        // We don't care if this fails, because the code is still accessible.\n        pMem = o->pbTarget;\n        sMem = o->pTrampoline->cbRestore;\n        NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, o->dwPerm, &dwOld);\n        if (o->dwOperation == DETOUR_OPERATION_REMOVE)\n        {\n            if (!o->ppTrampolineToFreeManually)\n            {\n                detour_free_trampoline(o->pTrampoline);\n                freed = TRUE;\n            } else\n            {\n                // The caller is responsible for freeing the trampoline.\n                *o->ppTrampolineToFreeManually = o->pTrampoline;\n            }\n            o->pTrampoline = NULL;\n        }\n\n        n = o->pNext;\n        detour_memory_free(o);\n        o = n;\n    }\n    s_pPendingOperations = NULL;\n    if (freed)\n    {\n        detour_free_unused_trampoline_regions();\n    }\n\n_exit:\n    // Make sure the trampoline pages are no longer writable.\n    detour_runnable_trampoline_regions();\n\n    // Resume any suspended threads.\n    detour_thread_resume(s_phSuspendedThreads, s_ulSuspendedThreadCount);\n    s_phSuspendedThreads = NULL;\n    s_ulSuspendedThreadCount = 0;\n    s_nPendingThreadId = NULL;\n\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n}\n\nHRESULT\nNTAPI\nSlimDetoursAttach(\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour)\n{\n    NTSTATUS Status;\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n\n    if (s_nPendingThreadId != NtCurrentThreadId())\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    PBYTE pbTarget = (PBYTE)*ppPointer;\n    PDETOUR_TRAMPOLINE pTrampoline = NULL;\n    PDETOUR_OPERATION o = NULL;\n\n    pbTarget = (PBYTE)detour_skip_jmp(pbTarget);\n    pDetour = detour_skip_jmp((PBYTE)pDetour);\n\n    // Don't follow a jump if its destination is the target function.\n    // This happens when the detour does nothing other than call the target.\n    if (pDetour == (PVOID)pbTarget)\n    {\n        Status = STATUS_INVALID_PARAMETER;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    o = detour_memory_alloc(sizeof(DETOUR_OPERATION));\n    if (o == NULL)\n    {\n        Status = STATUS_NO_MEMORY;\nfail:\n        DETOUR_BREAK();\n        if (pTrampoline != NULL)\n        {\n            detour_free_trampoline(pTrampoline);\n            detour_free_trampoline_region_if_unused(pTrampoline);\n            pTrampoline = NULL;\n        }\n        if (o != NULL)\n        {\n            detour_memory_free(o);\n        }\n        return HRESULT_FROM_NT(Status);\n    }\n\n    pTrampoline = detour_alloc_trampoline(pbTarget);\n    if (pTrampoline == NULL)\n    {\n        Status = STATUS_NO_MEMORY;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    DETOUR_TRACE(\"detours: pbTramp=%p, pDetour=%p\\n\", pTrampoline, pDetour);\n\n    RtlZeroMemory(pTrampoline->rAlign, sizeof(pTrampoline->rAlign));\n\n    // Determine the number of movable target instructions.\n    PBYTE pbSrc = pbTarget;\n    PBYTE pbTrampoline = pTrampoline->rbCode;\n    PBYTE pbPool = pbTrampoline + sizeof(pTrampoline->rbCode);\n    ULONG cbTarget = 0;\n    ULONG cbJump = SIZE_OF_JMP;\n    ULONG nAlign = 0;\n\n    while (cbTarget < cbJump)\n    {\n        PBYTE pbOp = pbSrc;\n        LONG lExtra = 0;\n\n        DETOUR_TRACE(\" SlimDetoursCopyInstruction(%p,%p)\\n\", pbTrampoline, pbSrc);\n        pbSrc = (PBYTE)SlimDetoursCopyInstruction(pbTrampoline, pbSrc, NULL, &lExtra);\n        if (pbSrc == NULL)\n        {\n            Status = STATUS_ILLEGAL_INSTRUCTION;\n            DETOUR_BREAK();\n            goto fail;\n        }\n\n        DETOUR_TRACE(\" SlimDetoursCopyInstruction() = %p (%d bytes)\\n\", pbSrc, (int)(pbSrc - pbOp));\n        pbTrampoline += (pbSrc - pbOp) + lExtra;\n        cbTarget = PtrOffset(pbTarget, pbSrc);\n        pTrampoline->rAlign[nAlign].obTarget = (BYTE)cbTarget;\n        pTrampoline->rAlign[nAlign].obTrampoline = (BYTE)(pbTrampoline - pTrampoline->rbCode);\n        nAlign++;\n\n        if (nAlign >= ARRAYSIZE(pTrampoline->rAlign))\n        {\n            break;\n        }\n\n        if (detour_does_code_end_function(pbOp))\n        {\n            break;\n        }\n    }\n\n    // Consume, but don't duplicate padding if it is needed and available.\n    while (cbTarget < cbJump)\n    {\n        LONG cFiller = detour_is_code_filler(pbSrc);\n        if (cFiller == 0)\n        {\n            break;\n        }\n\n        pbSrc += cFiller;\n        cbTarget = PtrOffset(pbTarget, pbSrc);\n    }\n\n#if _DEBUG\n    {\n        DETOUR_TRACE(\" detours: rAlign [\");\n        LONG n = 0;\n        for (n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++)\n        {\n            if (pTrampoline->rAlign[n].obTarget == 0 && pTrampoline->rAlign[n].obTrampoline == 0)\n            {\n                break;\n            }\n            DETOUR_TRACE(\" %u/%u\", pTrampoline->rAlign[n].obTarget, pTrampoline->rAlign[n].obTrampoline);\n\n        }\n        DETOUR_TRACE(\" ]\\n\");\n    }\n#endif\n\n    if (cbTarget < cbJump || nAlign > ARRAYSIZE(pTrampoline->rAlign))\n    {\n        // Too few instructions.\n        Status = STATUS_INVALID_BLOCK_LENGTH;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    if (pbTrampoline > pbPool)\n    {\n        __debugbreak();\n    }\n\n    pTrampoline->cbCode = (BYTE)(pbTrampoline - pTrampoline->rbCode);\n    pTrampoline->cbRestore = (BYTE)cbTarget;\n    RtlCopyMemory(pTrampoline->rbRestore, pbTarget, cbTarget);\n\n    if (cbTarget > sizeof(pTrampoline->rbCode) - cbJump)\n    {\n        // Too many instructions.\n        Status = STATUS_INVALID_HANDLE;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    pTrampoline->pbRemain = pbTarget + cbTarget;\n    pTrampoline->pbDetour = (PBYTE)pDetour;\n\n    pbTrampoline = pTrampoline->rbCode + pTrampoline->cbCode;\n#if defined(_AMD64_)\n    pbTrampoline = detour_gen_jmp_indirect(pbTrampoline, &pTrampoline->pbRemain);\n#elif defined(_X86_)\n    pbTrampoline = detour_gen_jmp_immediate(pbTrampoline, pTrampoline->pbRemain);\n#elif defined(_ARM64_)\n    pbTrampoline = detour_gen_jmp_immediate(pbTrampoline, &pbPool, pTrampoline->pbRemain);\n#endif\n    pbTrampoline = detour_gen_brk(pbTrampoline, pbPool);\n    UNREFERENCED_PARAMETER(pbTrampoline);\n\n    pMem = pbTarget;\n    sMem = cbTarget;\n    Status = NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, PAGE_EXECUTE_READWRITE, &dwOld);\n    if (!NT_SUCCESS(Status))\n    {\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    DETOUR_TRACE(\"detours: pbTarget=%p: \"\n                 \"%02x %02x %02x %02x \"\n                 \"%02x %02x %02x %02x \"\n                 \"%02x %02x %02x %02x\\n\",\n                 pbTarget,\n                 pbTarget[0], pbTarget[1], pbTarget[2], pbTarget[3],\n                 pbTarget[4], pbTarget[5], pbTarget[6], pbTarget[7],\n                 pbTarget[8], pbTarget[9], pbTarget[10], pbTarget[11]);\n    DETOUR_TRACE(\"detours: pbTramp =%p: \"\n                 \"%02x %02x %02x %02x \"\n                 \"%02x %02x %02x %02x \"\n                 \"%02x %02x %02x %02x\\n\",\n                 pTrampoline,\n                 pTrampoline->rbCode[0], pTrampoline->rbCode[1],\n                 pTrampoline->rbCode[2], pTrampoline->rbCode[3],\n                 pTrampoline->rbCode[4], pTrampoline->rbCode[5],\n                 pTrampoline->rbCode[6], pTrampoline->rbCode[7],\n                 pTrampoline->rbCode[8], pTrampoline->rbCode[9],\n                 pTrampoline->rbCode[10], pTrampoline->rbCode[11]);\n\n    o->dwOperation = DETOUR_OPERATION_ADD;\n    o->ppbPointer = (PBYTE*)ppPointer;\n    o->pTrampoline = pTrampoline;\n    o->pbTarget = pbTarget;\n    o->dwPerm = dwOld;\n    o->pNext = s_pPendingOperations;\n    s_pPendingOperations = o;\n\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n}\n\nHRESULT\nNTAPI\nSlimDetoursDetachEx(\n    _Inout_ PVOID* ppPointer,\n    _In_ PVOID pDetour,\n    _In_ PCDETOUR_DETACH_OPTIONS pOptions)\n{\n    NTSTATUS Status;\n    PVOID pMem;\n    SIZE_T sMem;\n    DWORD dwOld;\n\n    if (s_nPendingThreadId != NtCurrentThreadId())\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    PDETOUR_OPERATION o = detour_memory_alloc(sizeof(DETOUR_OPERATION));\n    if (o == NULL)\n    {\n        Status = STATUS_NO_MEMORY;\nfail:\n        DETOUR_BREAK();\n        if (o != NULL)\n        {\n            detour_memory_free(o);\n        }\n        return HRESULT_FROM_NT(Status);\n    }\n\n    PDETOUR_TRAMPOLINE pTrampoline = (PDETOUR_TRAMPOLINE)*ppPointer;\n    pDetour = detour_skip_jmp((PBYTE)pDetour);\n\n    ////////////////////////////////////// Verify that Trampoline is in place.\n    //\n    LONG cbTarget = pTrampoline->cbRestore;\n    PBYTE pbTarget = pTrampoline->pbRemain - cbTarget;\n    if (cbTarget == 0 || cbTarget > sizeof(pTrampoline->rbCode) || pTrampoline->pbDetour != pDetour)\n    {\n        Status = STATUS_INVALID_BLOCK_LENGTH;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    pMem = pbTarget;\n    sMem = cbTarget;\n    Status = NtProtectVirtualMemory(NtCurrentProcess(), &pMem, &sMem, PAGE_EXECUTE_READWRITE, &dwOld);\n    if (!NT_SUCCESS(Status))\n    {\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    o->dwOperation = DETOUR_OPERATION_REMOVE;\n    o->ppbPointer = (PBYTE*)ppPointer;\n    o->pTrampoline = pTrampoline;\n    o->pbTarget = pbTarget;\n    o->dwPerm = dwOld;\n    o->ppTrampolineToFreeManually = pOptions->ppTrampolineToFreeManually;\n    o->pNext = s_pPendingOperations;\n    s_pPendingOperations = o;\n\n    return HRESULT_FROM_NT(STATUS_SUCCESS);\n}\n\nHRESULT\nNTAPI\nSlimDetoursFreeTrampoline(\n    _In_ PVOID pTrampoline)\n{\n    if (pTrampoline == NULL)\n    {\n        return HRESULT_FROM_NT(STATUS_SUCCESS);\n    }\n\n    // This function can be called as part of a transaction or outside of a transaction.\n    HANDLE nPrevPendingThreadId = _InterlockedCompareExchangePointer(&s_nPendingThreadId, NtCurrentThreadId(), NULL);\n    BOOL bInTransaction = nPrevPendingThreadId != NULL;\n    if (bInTransaction && nPrevPendingThreadId != NtCurrentThreadId())\n    {\n        return HRESULT_FROM_NT(STATUS_TRANSACTIONAL_CONFLICT);\n    }\n\n    NTSTATUS Status;\n\n    if (!bInTransaction)\n    {\n        // Make sure the trampoline pages are writable.\n        Status = detour_writable_trampoline_regions();\n        if (!NT_SUCCESS(Status))\n        {\n            goto fail;\n        }\n    }\n\n    detour_free_trampoline((PDETOUR_TRAMPOLINE)pTrampoline);\n    detour_free_trampoline_region_if_unused((PDETOUR_TRAMPOLINE)pTrampoline);\n\n    if (!bInTransaction)\n    {\n        detour_runnable_trampoline_regions();\n    }\n\n    Status = STATUS_SUCCESS;\n\nfail:\n    if (!bInTransaction)\n    {\n#ifdef _MSC_VER\n#pragma warning(disable: __WARNING_INTERLOCKED_ACCESS)\n#endif\n        s_nPendingThreadId = NULL;\n#ifdef _MSC_VER\n#pragma warning(default: __WARNING_INTERLOCKED_ACCESS)\n#endif\n    }\n    return HRESULT_FROM_NT(Status);\n}\n\nHRESULT\nNTAPI\nSlimDetoursUninitialize(VOID)\n{\n    NTSTATUS Status = STATUS_SUCCESS;\n\n    if (!detour_memory_uninitialize())\n    {\n        Status = STATUS_INVALID_HANDLE;\n    }\n\n    return HRESULT_FROM_NT(Status);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/ThreadLocal.h",
    "content": "/*\n * Copyright (c) 2016-2021 WangBin <wbsecg1 at gmail.com>\n * https://github.com/wang-bin/ThreadLocal\n * https://github.com/wang-bin/cppcompat/blob/master/include/cppcompat/thread_local.hpp\n */\n#pragma once\n#include <functional>\n#include <memory> //default_delete\n#include <thread>\n#ifndef TLS_NO_DEBUG\n#include <iostream>\n#endif\n#ifndef USE_STD_THREAD_LOCAL\n#define USE_STD_THREAD_LOCAL 0 // 0: use our own implementation. 1: use c++11 thread_local if possible.\n#endif\n\n#if defined(__MINGW32__) // mingw clang does not support non-trivial destructible types. mingw gcc is still broken: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83562\n// new gcc defines __has_feature but no cxx_thread_local\n#elif (__clang__ + 0) // clang defines _MSC_VER as the cl builds it, or masquerades as gcc4.2, so check clang first\n# if __has_feature(cxx_thread_local)\n#   define CC_HAS_THREAD_LOCAL (!(_LIBCPP_VERSION + 0)/*gnu stl, vcrt*/ || _LIBCPP_VERSION >= 4000)\n# endif\n// apple clang: no cxx_thread_local for iOS(and macOS if xcode<8), no thread_local/__thread. opensource clang: targeting macOS 10.7+\n// apple clang: always implemented in _tlv_atexit(apple/opensource) for darwin, which is available in macOS10.10+/iOS8.0+(arm64,x86_64)/iOS9.0+(armv7)\n// new clang/libc++7.0 supports osx10.4+ (compiler-rt) but not ios<8.0: https://lists.llvm.org/pipermail/llvm-dev/2018-December/128364.html\n// libstdc++(g++4.8+) and libc++4.0+(not apple). implemented in __cxa_thread_atexit in libc++abi, 4.0+ abi has a fallback if no __cxa_thread_atexit_impl (e.g. android<23)\n#elif (_MSC_VER+0) >= 1900\n# define CC_HAS_THREAD_LOCAL 1\n#elif (__GNUC__*100+__GNUC_MINOR__) >= 408 // can't be clang\n# define CC_HAS_THREAD_LOCAL 1\n#endif\n\n#if (CC_HAS_THREAD_LOCAL+0) && USE_STD_THREAD_LOCAL\n#define THREAD_LOCAL(T) thread_local T\n#else\n#define THREAD_LOCAL(T) ThreadLocal<T>\n#endif\n\n// Fibers api is preferred for mingw targeting vista or later, and msvc\n#if defined(_WIN32) // http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system\n#include <windows.h>\n#   if (defined(_MSC_VER) || !defined(USE_PTHREAD)) && _WIN32_WINNT >= 0x0600 // default use fibers api for mingw targeting store/vista\n#       define USE_FLS // vista, winstore\n#   endif\n#endif\n#if !defined(USE_FLS)\n#include <pthread.h>\n#   ifndef USE_PTHREAD\n#       define USE_PTHREAD\n#   endif //USE_PTHREAD\n#endif\n\n#ifndef FUNCINFO\n#if defined(_MSC_VER)\n#define FUNCINFO __FUNCSIG__\n#else\n#define FUNCINFO __PRETTY_FUNCTION__\n#endif\n#endif\n\n/*!\n * differences between `static ThreadLocal<T> t` and `static thread_local T s`\n * 1. t is an object of type ThreadLocal<T>, the thread data is of type T, while s is an object of T.\n * 2. t is constructed only once, while s is constructed when a new thread starts.\n * 3. thread data of t is constructed only when it's accessed in a new thread, or when t is constructed by assignment. while s (thread data is it's self) is constructed when a new thread starts.\n * \\code\n * void f() { static THREAD_LOCAL(int) a = 1; }\n * \\endcode\n * int data of value 1 constructed only once (when constructing ThreadLocal using get()).\n * \\code\n * void f() { static THREAD_LOCAL(int) a(1); }\n * \\endcode\n * int data of value 1 is not constructed because get() is not called.\n * All the diferences above does not affect your program.\n */\ntemplate<typename T>\nclass ThreadLocal\n{\npublic:\n    // force cast to std::function<T*()> to fix android/ios clang ambiguous default ctor. why?\n    ThreadLocal() : ThreadLocal(std::function<T*()>([]{return new T();})) {}\n    ThreadLocal(const T& t) : ThreadLocal([t]{ return new T(t);}) {}\n    ThreadLocal(T&& t) : ThreadLocal([t]{ return new T(std::move(t));}) {}\n    ThreadLocal(std::function<T*()> c, std::function<void(T*)> d = std::default_delete<T>())\n    : ctor_(c)\n    , dtor_(d) {\n#ifdef USE_PTHREAD\n        pthread_key_create(&key_, default_exit);\n#endif\n#ifdef USE_FLS\n        index_ = FlsAlloc(default_exit);\n        if (index_ == FLS_OUT_OF_INDEXES)\n            throw std::system_error(GetLastError(), std::system_category(), \"FlsAlloc error\");\n#endif\n    }\n    //ThreadLocal(const ThreadLocal& t) : ThreadLocal(*t.get()) {}\n    ThreadLocal(ThreadLocal&& t) : ThreadLocal() {\n        t.move_get(get());\n        //t = T();\n    }\n    ThreadLocal& operator=(ThreadLocal&& t) {\n        t.move_get(get());\n        //*get() = std::move(*t.get());\n       // t = T();\n        return *this;\n    }\n    ~ThreadLocal() {\n#ifdef USE_PTHREAD\n        pthread_key_delete(key_);\n#endif\n#ifdef USE_FLS\n        FlsFree(index_);\n#endif\n    }\n    T* operator&() const { return get();}\n    /*!\n     * The following operators let ThreadLocal behaves like c++11 thread_local var, except T's member must be accessed by operator->(),\n     * e.g. t->member (a workaround is explicitly convert to access: ((T&)t).member)\n     */\n    operator T&() const { return *get(); }\n    ThreadLocal& operator=(const T& v) {\n        *get() = v;\n        return *this;\n    }\n    ThreadLocal& operator=(T&& v) {\n        *get() = std::move(v);\n        return *this;\n    }\nprivate:\n    void move_get(T* t) {\n        void* v = nullptr;\n#if defined(USE_PTHREAD)\n        v = pthread_getspecific(key_);\n#elif defined(USE_FLS)\n        v = FlsGetValue(index_);\n#endif\n        if (!v)\n            return;\n        *t = std::move(*static_cast<Data*>(v)->t);\n    }\n    T* get() const {\n        void* v = nullptr;\n#if defined(USE_PTHREAD)\n        v = pthread_getspecific(key_);\n#elif defined(USE_FLS)\n        v = FlsGetValue(index_);\n#else\n        return nullptr;\n#endif\n        if (v)\n            return static_cast<Data*>(v)->t;\n        Data *d = new Data();\n#ifndef TLS_NO_DEBUG\n        std::clog << FUNCINFO << \" allocate and initialize ThreadLocal data\" << std::endl << std::flush;\n#endif\n        d->t = ctor_();\n        d->tl = this;\n#if defined(USE_PTHREAD)\n        pthread_setspecific(key_, d);\n#elif defined(USE_FLS)\n        FlsSetValue(index_, d);\n#endif\n        return d->t;\n    }\n    T* operator->() const { return get(); }\n    static void\n#ifdef USE_FLS\n    WINAPI // WINAPI/__stdcall is required to avoid crash on 32bit target, ignored by x64/arm compiler\n#endif\n    default_exit(void* v) {\n        Data* d = static_cast<Data*>(v);\n        if (d && d->tl->dtor_)\n            d->tl->dtor_(d->t);\n        delete d;\n    }\n\n    struct Data {\n#ifndef TLS_NO_DEBUG\n        Data() { std::clog << FUNCINFO << \" thread: \" << std::this_thread::get_id() << std::endl; }\n        ~Data() { std::clog << FUNCINFO << \" thread: \" << std::this_thread::get_id() << std::endl; }\n#endif\n        const ThreadLocal* tl = nullptr;\n        T* t = nullptr;\n    };\n#ifdef USE_PTHREAD\n    pthread_key_t key_;\n#endif\n#ifdef USE_FLS\n    DWORD index_;\n#endif\n    // static ThreadLocal<T> var, var ctor will be called only once, so must store how var is allocated and initialized, using ctor_\n    std::function<T*()> ctor_ = nullptr;\n    std::function<void(T*)> dtor_ = nullptr;\n};\n"
  },
  {
    "path": "src/windhawk/engine/libraries/Zydis/Zydis.h",
    "content": "// DO NOT EDIT. This file is auto-generated by `amalgamate.py`.\n\n\n//\n// Header: Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Master include file. Includes everything else.\n */\n\n#ifndef ZYDIS_H\n#define ZYDIS_H\n\n\n//\n// Header: Zycore/Defines.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd, Joel Hoener\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * General helper and platform detection macros.\n */\n\n#ifndef ZYCORE_DEFINES_H\n#define ZYCORE_DEFINES_H\n\n/* ============================================================================================== */\n/* Meta macros                                                                                    */\n/* ============================================================================================== */\n\n/**\n * Concatenates two values using the stringify operator (`##`).\n *\n * @param   x   The first value.\n * @param   y   The second value.\n *\n * @return  The combined string of the given values.\n */\n#define ZYAN_MACRO_CONCAT(x, y) x ## y\n\n/**\n * Concatenates two values using the stringify operator (`##`) and expands the value to\n *          be used in another macro.\n *\n * @param   x   The first value.\n * @param   y   The second value.\n *\n * @return  The combined string of the given values.\n */\n#define ZYAN_MACRO_CONCAT_EXPAND(x, y) ZYAN_MACRO_CONCAT(x, y)\n\n/* ============================================================================================== */\n/* Compiler detection                                                                             */\n/* ============================================================================================== */\n\n#if defined(__clang__)\n#   define ZYAN_CLANG\n#   define ZYAN_GNUC\n#elif defined(__ICC) || defined(__INTEL_COMPILER)\n#   define ZYAN_ICC\n#elif defined(__GNUC__) || defined(__GNUG__)\n#   define ZYAN_GCC\n#   define ZYAN_GNUC\n#elif defined(_MSC_VER)\n#   define ZYAN_MSVC\n#elif defined(__BORLANDC__)\n#   define ZYAN_BORLAND\n#else\n#   define ZYAN_UNKNOWN_COMPILER\n#endif\n\n/* ============================================================================================== */\n/* Platform detection                                                                             */\n/* ============================================================================================== */\n\n#if defined(_WIN32)\n#   define ZYAN_WINDOWS\n#elif defined(__EMSCRIPTEN__)\n#   define ZYAN_EMSCRIPTEN\n#elif defined(__wasi__) || defined(__WASI__)\n// via: https://reviews.llvm.org/D57155\n#   define ZYAN_WASI\n#elif defined(__APPLE__)\n#   define ZYAN_APPLE\n#   define ZYAN_POSIX\n#elif defined(__linux)\n#   define ZYAN_LINUX\n#   define ZYAN_POSIX\n#elif defined(__FreeBSD__)\n#   define ZYAN_FREEBSD\n#   define ZYAN_POSIX\n#elif defined(__NetBSD__)\n#   define ZYAN_NETBSD\n#   define ZYAN_POSIX\n#elif defined(sun) || defined(__sun)\n#   define ZYAN_SOLARIS\n#   define ZYAN_POSIX\n#elif defined(__unix) || defined(__unix__)\n#   define ZYAN_UNIX\n#   define ZYAN_POSIX\n#elif defined(__posix)\n#   define ZYAN_POSIX\n#else\n#   define ZYAN_UNKNOWN_PLATFORM\n#endif\n\n/* ============================================================================================== */\n/* Kernel mode detection                                                                          */\n/* ============================================================================================== */\n\n#if (defined(ZYAN_WINDOWS) && defined(_KERNEL_MODE)) || \\\n    (defined(ZYAN_APPLE) && defined(KERNEL)) || \\\n    (defined(ZYAN_LINUX) && defined(__KERNEL__)) || \\\n    (defined(__FreeBSD_kernel__))\n#   define ZYAN_KERNEL\n#else\n#   define ZYAN_USER\n#endif\n\n/* ============================================================================================== */\n/* Architecture detection                                                                         */\n/* ============================================================================================== */\n\n#if defined(_M_AMD64) || defined(__x86_64__)\n#   define ZYAN_X64\n#elif defined(_M_IX86) || defined(__i386__)\n#   define ZYAN_X86\n#elif defined(_M_ARM64) || defined(__aarch64__)\n#   define ZYAN_AARCH64\n#elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__)\n#   define ZYAN_ARM\n#elif defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__WASM__)\n#   define ZYAN_WASM\n#elif defined(__loongarch__)\n#   define ZYAN_LOONGARCH\n#elif defined(__powerpc64__)\n#   define ZYAN_PPC64\n#elif defined(__powerpc__)\n#   define ZYAN_PPC\n#elif defined(__riscv) && __riscv_xlen == 64\n#   define ZYAN_RISCV64\n#else\n#   error \"Unsupported architecture detected\"\n#endif\n\n/* ============================================================================================== */\n/* Debug/Release detection                                                                        */\n/* ============================================================================================== */\n\n#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)\n#   ifdef _DEBUG\n#       define ZYAN_DEBUG\n#   else\n#       define ZYAN_RELEASE\n#   endif\n#elif defined(ZYAN_GNUC) || defined(ZYAN_ICC)\n#   ifdef NDEBUG\n#       define ZYAN_RELEASE\n#   else\n#       define ZYAN_DEBUG\n#   endif\n#else\n#   define ZYAN_RELEASE\n#endif\n\n/* ============================================================================================== */\n/* Deprecation hint                                                                               */\n/* ============================================================================================== */\n\n#if defined(ZYAN_GCC) || defined(ZYAN_CLANG)\n#   define ZYAN_DEPRECATED __attribute__((__deprecated__))\n#elif defined(ZYAN_MSVC)\n#   define ZYAN_DEPRECATED __declspec(deprecated)\n#else\n#   define ZYAN_DEPRECATED\n#endif\n\n/* ============================================================================================== */\n/* Generic DLL import/export helpers                                                              */\n/* ============================================================================================== */\n\n#if defined(ZYAN_MSVC)\n#   define ZYAN_DLLEXPORT __declspec(dllexport)\n#   define ZYAN_DLLIMPORT __declspec(dllimport)\n#else\n#   define ZYAN_DLLEXPORT\n#   define ZYAN_DLLIMPORT\n#endif\n\n/* ============================================================================================== */\n/* Zycore dll{export,import}                                                                      */\n/* ============================================================================================== */\n\n// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To\n// simplify builds without CMake, we define these things manually instead of relying on CMake\n// to generate the header.\n//\n// For static builds, our CMakeList will define `ZYCORE_STATIC_BUILD`. For shared library builds,\n// our CMake will define `ZYCORE_SHOULD_EXPORT` depending on whether the target is being imported or\n// exported. If CMake isn't used, users can manually define these to fit their use-case.\n\n// Backward compatibility: CMake would previously generate these variables names. However, because\n// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For\n// backward compatibility for users that don't use CMake and previously manually defined these, we\n// translate the old defines here and print a warning.\n#if defined(ZYCORE_STATIC_DEFINE)\n#   pragma message(\"ZYCORE_STATIC_DEFINE was renamed to ZYCORE_STATIC_BUILD.\")\n#   define ZYCORE_STATIC_BUILD\n#endif\n#if defined(Zycore_EXPORTS)\n#   pragma message(\"Zycore_EXPORTS was renamed to ZYCORE_SHOULD_EXPORT.\")\n#   define ZYCORE_SHOULD_EXPORT\n#endif\n\n/**\n * Symbol is exported in shared library builds.\n */\n#if defined(ZYCORE_STATIC_BUILD)\n#   define ZYCORE_EXPORT\n#else\n#   if defined(ZYCORE_SHOULD_EXPORT)\n#       define ZYCORE_EXPORT ZYAN_DLLEXPORT\n#   else\n#       define ZYCORE_EXPORT ZYAN_DLLIMPORT\n#   endif\n#endif\n\n/**\n * Symbol is not exported and for internal use only.\n */\n#define ZYCORE_NO_EXPORT\n\n/* ============================================================================================== */\n/* Misc compatibility macros                                                                      */\n/* ============================================================================================== */\n\n#if defined(ZYAN_CLANG)\n#   define ZYAN_NO_SANITIZE(what) __attribute__((no_sanitize(what)))\n#else\n#   define ZYAN_NO_SANITIZE(what)\n#endif\n\n#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)\n#   define ZYAN_INLINE __inline\n#else\n#   define ZYAN_INLINE static inline\n#endif\n\n#if defined(ZYAN_MSVC)\n#   define ZYAN_NOINLINE __declspec(noinline)\n#elif defined(ZYAN_GCC) || defined(ZYAN_CLANG)\n#   define ZYAN_NOINLINE __attribute__((noinline))\n#else\n#   define ZYAN_NOINLINE\n#endif\n\n/* ============================================================================================== */\n/* Debugging and optimization macros                                                              */\n/* ============================================================================================== */\n\n/**\n * Runtime debug assertion.\n */\n#if defined(ZYAN_NO_LIBC)\n#   define ZYAN_ASSERT(condition) (void)(condition)\n#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)\n#   include <wdm.h>\n#   define ZYAN_ASSERT(condition) NT_ASSERT(condition)\n#else\n#   include <assert.h>\n#   define ZYAN_ASSERT(condition) assert(condition)\n#endif\n\n/**\n * Compiler-time assertion.\n */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__cplusplus)\n#   define ZYAN_STATIC_ASSERT(x) _Static_assert(x, #x)\n#elif (defined(__cplusplus) && __cplusplus >= 201103L) || \\\n      (defined(__cplusplus) && defined (_MSC_VER) && (_MSC_VER >= 1600)) || \\\n      (defined (_MSC_VER) && (_MSC_VER >= 1800))\n#   define ZYAN_STATIC_ASSERT(x) static_assert(x, #x)\n#else\n#   define ZYAN_STATIC_ASSERT(x) \\\n        typedef int ZYAN_MACRO_CONCAT_EXPAND(ZYAN_SASSERT_, __COUNTER__) [(x) ? 1 : -1]\n#endif\n\n/**\n * Marks the current code path as unreachable.\n */\n#if defined(ZYAN_RELEASE)\n#   if defined(ZYAN_CLANG) // GCC eagerly evals && RHS, we have to use nested ifs.\n#       if __has_builtin(__builtin_unreachable)\n#           define ZYAN_UNREACHABLE __builtin_unreachable()\n#       else\n#           define ZYAN_UNREACHABLE for(;;)\n#       endif\n#   elif defined(ZYAN_GCC) && ((__GNUC__ == 4 && __GNUC_MINOR__ > 4) || __GNUC__ > 4)\n#       define ZYAN_UNREACHABLE __builtin_unreachable()\n#   elif defined(ZYAN_ICC)\n#       ifdef ZYAN_WINDOWS\n#           include <stdlib.h> // \"missing return statement\" workaround\n#           define ZYAN_UNREACHABLE __assume(0); (void)abort()\n#       else\n#           define ZYAN_UNREACHABLE __builtin_unreachable()\n#       endif\n#   elif defined(ZYAN_MSVC)\n#       define ZYAN_UNREACHABLE __assume(0)\n#   else\n#       define ZYAN_UNREACHABLE for(;;)\n#   endif\n#elif defined(ZYAN_NO_LIBC)\n#   define ZYAN_UNREACHABLE for(;;)\n#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)\n#   define ZYAN_UNREACHABLE { __fastfail(0); for(;;){} }\n#else\n#   include <stdlib.h>\n#   define ZYAN_UNREACHABLE { assert(0); abort(); }\n#endif\n\n/* ============================================================================================== */\n/* Utils                                                                                          */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* General purpose                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Marks the specified parameter as unused.\n *\n * @param   x   The name of the unused parameter.\n */\n#define ZYAN_UNUSED(x) (void)(x)\n\n/**\n * Intentional fallthrough.\n */\n#if defined(ZYAN_GCC) && __GNUC__ >= 7\n#   define ZYAN_FALLTHROUGH ; __attribute__((__fallthrough__))\n#else\n#   define ZYAN_FALLTHROUGH\n#endif\n\n/**\n * Declares a bitfield.\n *\n * @param   x   The size (in bits) of the bitfield.\n */\n#define ZYAN_BITFIELD(x) : x\n\n/**\n * Marks functions that require libc (cannot be used with `ZYAN_NO_LIBC`).\n */\n#define ZYAN_REQUIRES_LIBC\n\n/**\n * Decorator for `printf`-style functions.\n *\n * @param   format_index    The 1-based index of the format string parameter.\n * @param   first_to_check  The 1-based index of the format arguments parameter.\n */\n#if defined(__RESHARPER__)\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check) \\\n        [[gnu::format(printf, format_index, first_to_check)]]\n#elif defined(ZYAN_GCC)\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check) \\\n        __attribute__((format(printf, format_index, first_to_check)))\n#else\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check)\n#endif\n\n/**\n * Decorator for `wprintf`-style functions.\n *\n * @param   format_index    The 1-based index of the format string parameter.\n * @param   first_to_check  The 1-based index of the format arguments parameter.\n */\n#if defined(__RESHARPER__)\n#   define ZYAN_WPRINTF_ATTR(format_index, first_to_check) \\\n        [[rscpp::format(wprintf, format_index, first_to_check)]]\n#else\n#   define ZYAN_WPRINTF_ATTR(format_index, first_to_check)\n#endif\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Arrays                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the length (number of elements) of an array.\n *\n * @param   a   The name of the array.\n *\n * @return  The number of elements of the given array.\n */\n#define ZYAN_ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Arithmetic                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the smaller value of `a` or `b`.\n *\n * @param   a   The first value.\n * @param   b   The second value.\n *\n * @return  The smaller value of `a` or `b`.\n */\n#define ZYAN_MIN(a, b) (((a) < (b)) ? (a) : (b))\n\n/**\n * Returns the bigger value of `a` or `b`.\n *\n * @param   a   The first value.\n * @param   b   The second value.\n *\n * @return  The bigger value of `a` or `b`.\n */\n#define ZYAN_MAX(a, b) (((a) > (b)) ? (a) : (b))\n\n/**\n * Returns the absolute value of `a`.\n *\n * @param   a   The value.\n *\n * @return  The absolute value of `a`.\n */\n#define ZYAN_ABS(a) (((a) < 0) ? -(a) : (a))\n\n/**\n * Checks, if the given value is a power of 2.\n *\n * @param   x   The value.\n *\n * @return  `ZYAN_TRUE`, if the given value is a power of 2 or `ZYAN_FALSE`, if not.\n *\n * Note that this macro always returns `ZYAN_TRUE` for `x == 0`.\n */\n#define ZYAN_IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0)\n\n/**\n * Checks, if the given value is properly aligned.\n *\n * Note that this macro only works for powers of 2.\n */\n#define ZYAN_IS_ALIGNED_TO(x, align) (((x) & ((align) - 1)) == 0)\n\n/**\n * Aligns the value to the nearest given alignment boundary (by rounding it up).\n *\n * @param   x       The value.\n * @param   align   The desired alignment.\n *\n * @return  The aligned value.\n *\n * Note that this macro only works for powers of 2.\n */\n#define ZYAN_ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1))\n\n/**\n * Aligns the value to the nearest given alignment boundary (by rounding it down).\n *\n * @param   x       The value.\n * @param   align   The desired alignment.\n *\n * @return  The aligned value.\n *\n * Note that this macro only works for powers of 2.\n */\n#define ZYAN_ALIGN_DOWN(x, align) (((x) - 1) & ~((align) - 1))\n\n/**\n * Divide the 64bit integer value by the given divisor.\n *\n * @param   n       Variable containing the dividend that will be updated with the result of the\n *                  division.\n * @param   divisor The divisor.\n */\n#if defined(ZYAN_LINUX) && defined(ZYAN_KERNEL)\n#   include <asm/div64.h> /* do_div */\n#   define ZYAN_DIV64(n, divisor) do_div(n, divisor)\n#else\n#   define ZYAN_DIV64(n, divisor) (n /= divisor)\n#endif\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Bit operations                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/*\n * Checks, if the bit at index `b` is required to present the ordinal value `n`.\n *\n * @param   n   The ordinal value.\n * @param   b   The bit index.\n *\n * @return  `ZYAN_TRUE`, if the bit at index `b` is required to present the ordinal value `n` or\n *          `ZYAN_FALSE`, if not.\n *\n * Note that this macro always returns `ZYAN_FALSE` for `n == 0`.\n */\n#define ZYAN_NEEDS_BIT(n, b) (((unsigned long)(n) >> (b)) > 0)\n\n/*\n * Returns the number of bits required to represent the ordinal value `n`.\n *\n * @param   n   The ordinal value.\n *\n * @return  The number of bits required to represent the ordinal value `n`.\n *\n * Note that this macro returns `0` for `n == 0`.\n */\n#define ZYAN_BITS_TO_REPRESENT(n) \\\n    ( \\\n        ZYAN_NEEDS_BIT(n,  0) + ZYAN_NEEDS_BIT(n,  1) + \\\n        ZYAN_NEEDS_BIT(n,  2) + ZYAN_NEEDS_BIT(n,  3) + \\\n        ZYAN_NEEDS_BIT(n,  4) + ZYAN_NEEDS_BIT(n,  5) + \\\n        ZYAN_NEEDS_BIT(n,  6) + ZYAN_NEEDS_BIT(n,  7) + \\\n        ZYAN_NEEDS_BIT(n,  8) + ZYAN_NEEDS_BIT(n,  9) + \\\n        ZYAN_NEEDS_BIT(n, 10) + ZYAN_NEEDS_BIT(n, 11) + \\\n        ZYAN_NEEDS_BIT(n, 12) + ZYAN_NEEDS_BIT(n, 13) + \\\n        ZYAN_NEEDS_BIT(n, 14) + ZYAN_NEEDS_BIT(n, 15) + \\\n        ZYAN_NEEDS_BIT(n, 16) + ZYAN_NEEDS_BIT(n, 17) + \\\n        ZYAN_NEEDS_BIT(n, 18) + ZYAN_NEEDS_BIT(n, 19) + \\\n        ZYAN_NEEDS_BIT(n, 20) + ZYAN_NEEDS_BIT(n, 21) + \\\n        ZYAN_NEEDS_BIT(n, 22) + ZYAN_NEEDS_BIT(n, 23) + \\\n        ZYAN_NEEDS_BIT(n, 24) + ZYAN_NEEDS_BIT(n, 25) + \\\n        ZYAN_NEEDS_BIT(n, 26) + ZYAN_NEEDS_BIT(n, 27) + \\\n        ZYAN_NEEDS_BIT(n, 28) + ZYAN_NEEDS_BIT(n, 29) + \\\n        ZYAN_NEEDS_BIT(n, 30) + ZYAN_NEEDS_BIT(n, 31)   \\\n    )\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#endif /* ZYCORE_DEFINES_H */\n\n//\n// Header: Zycore/Types.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zyan-C)\n\n  Original Author : Florian Bernd, Joel Hoener\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Includes and defines some default data types.\n */\n\n#ifndef ZYCORE_TYPES_H\n#define ZYCORE_TYPES_H\n\n\n/* ============================================================================================== */\n/* Integer types                                                                                  */\n/* ============================================================================================== */\n\n#if defined(ZYAN_NO_LIBC) || \\\n    (defined(ZYAN_MSVC) && defined(ZYAN_KERNEL)) // The WDK LibC lacks stdint.h.\n    // No LibC mode, use compiler built-in types / macros.\n#   if defined(ZYAN_MSVC) || defined(ZYAN_ICC)\n        typedef unsigned __int8                 ZyanU8;\n        typedef unsigned __int16                ZyanU16;\n        typedef unsigned __int32                ZyanU32;\n        typedef unsigned __int64                ZyanU64;\n        typedef   signed __int8                 ZyanI8;\n        typedef   signed __int16                ZyanI16;\n        typedef   signed __int32                ZyanI32;\n        typedef   signed __int64                ZyanI64;\n#       if _WIN64\n           typedef ZyanU64                      ZyanUSize;\n           typedef ZyanI64                      ZyanISize;\n           typedef ZyanU64                      ZyanUPointer;\n           typedef ZyanI64                      ZyanIPointer;\n#       else\n           typedef ZyanU32                      ZyanUSize;\n           typedef ZyanI32                      ZyanISize;\n           typedef ZyanU32                      ZyanUPointer;\n           typedef ZyanI32                      ZyanIPointer;\n#       endif\n#   elif defined(ZYAN_GNUC)\n#       ifdef __UINT8_TYPE__\n            typedef __UINT8_TYPE__              ZyanU8;\n#       else\n            typedef unsigned char               ZyanU8;\n#       endif\n#       ifdef __UINT16_TYPE__\n            typedef __UINT16_TYPE__             ZyanU16;\n#       else\n            typedef unsigned short int          ZyanU16;\n#       endif\n#       ifdef __UINT32_TYPE__\n            typedef __UINT32_TYPE__             ZyanU32;\n#       else\n            typedef unsigned int                ZyanU32;\n#       endif\n#       ifdef __UINT64_TYPE__\n            typedef __UINT64_TYPE__             ZyanU64;\n#       else\n#           if defined(__x86_64__) && !defined(__ILP32__)\n                typedef unsigned long int       ZyanU64;\n#           else\n                typedef unsigned long long int  ZyanU64;\n#           endif\n#       endif\n#       ifdef __INT8_TYPE__\n            typedef __INT8_TYPE__               ZyanI8;\n#       else\n            typedef signed char                 ZyanI8;\n#       endif\n#       ifdef __INT16_TYPE__\n            typedef __INT16_TYPE__              ZyanI16;\n#       else\n            typedef signed short int            ZyanI16;\n#       endif\n#       ifdef __INT32_TYPE__\n            typedef __INT32_TYPE__              ZyanI32;\n#       else\n            typedef signed int                  ZyanI32;\n#       endif\n#       ifdef __INT64_TYPE__\n            typedef __INT64_TYPE__              ZyanI64;\n#       else\n#           if defined(__x86_64__) && !defined( __ILP32__)\n                typedef signed long int         ZyanI64;\n#           else\n                typedef signed long long int    ZyanI64;\n#           endif\n#       endif\n#       ifdef __SIZE_TYPE__\n            typedef __SIZE_TYPE__               ZyanUSize;\n#       else\n            typedef long unsigned int           ZyanUSize;\n#       endif\n#       ifdef __PTRDIFF_TYPE__\n            typedef __PTRDIFF_TYPE__            ZyanISize;\n#       else\n            typedef long int                    ZyanISize;\n#       endif\n#       ifdef __UINTPTR_TYPE__\n            typedef __UINTPTR_TYPE__            ZyanUPointer;\n#       else\n#           if defined(__x86_64__) && !defined( __ILP32__)\n                typedef unsigned long int       ZyanUPointer;\n#           else\n                typedef unsigned int            ZyanUPointer;\n#           endif\n#       endif\n#       ifdef __INTPTR_TYPE__\n            typedef __INTPTR_TYPE__             ZyanIPointer;\n#       else\n#           if defined(__x86_64__) && !defined( __ILP32__)\n                typedef long int                ZyanIPointer;\n#           else\n                typedef int                     ZyanIPointer;\n#           endif\n#       endif\n#   else\n#       error \"Unsupported compiler for no-libc mode.\"\n#   endif\n\n#   if defined(ZYAN_MSVC)\n#       define ZYAN_INT8_MIN            (-127i8 - 1)\n#       define ZYAN_INT16_MIN           (-32767i16 - 1)\n#       define ZYAN_INT32_MIN           (-2147483647i32 - 1)\n#       define ZYAN_INT64_MIN           (-9223372036854775807i64 - 1)\n#       define ZYAN_INT8_MAX            127i8\n#       define ZYAN_INT16_MAX           32767i16\n#       define ZYAN_INT32_MAX           2147483647i32\n#       define ZYAN_INT64_MAX           9223372036854775807i64\n#       define ZYAN_UINT8_MAX           0xffui8\n#       define ZYAN_UINT16_MAX          0xffffui16\n#       define ZYAN_UINT32_MAX          0xffffffffui32\n#       define ZYAN_UINT64_MAX          0xffffffffffffffffui64\n#   else\n#       ifdef __INT8_MAX__\n#           define ZYAN_INT8_MAX        __INT8_MAX__\n#       else\n#           define ZYAN_INT8_MAX        (127)\n#       endif\n#       define ZYAN_INT8_MIN            (-ZYAN_INT8_MAX - 1)\n#       ifdef __INT16_MAX__\n#           define ZYAN_INT16_MAX       __INT16_MAX__\n#       else\n#           define ZYAN_INT16_MAX       (32767)\n#       endif\n#       define ZYAN_INT16_MIN           (-ZYAN_INT16_MAX - 1)\n#       ifdef __INT32_MAX__\n#           define ZYAN_INT32_MAX       __INT32_MAX__\n#       else\n#           define ZYAN_INT32_MAX       (2147483647)\n#       endif\n#       define ZYAN_INT32_MIN           (-ZYAN_INT32_MAX - 1)\n#       ifdef __INT64_MAX__\n#           define ZYAN_INT64_MAX       __INT64_MAX__\n#       else\n#           if defined(__x86_64__) && !defined( __ILP32__)\n#               define ZYAN_INT64_MAX   (9223372036854775807L)\n#           else\n#               define ZYAN_INT64_MAX   (9223372036854775807LL)\n#           endif\n#       endif\n#       define ZYAN_INT64_MIN           (-ZYAN_INT64_MAX - 1)\n#       ifdef __UINT8_MAX__\n#           define ZYAN_UINT8_MAX       __UINT8_MAX__\n#       else\n#           define ZYAN_UINT8_MAX       (255)\n#       endif\n#       ifdef __UINT16_MAX__\n#           define ZYAN_UINT16_MAX      __UINT16_MAX__\n#       else\n#           define ZYAN_UINT16_MAX      (65535)\n#       endif\n#       ifdef __UINT32_MAX__\n#           define ZYAN_UINT32_MAX      __UINT32_MAX__\n#       else\n#           define ZYAN_UINT32_MAX      (4294967295U)\n#       endif\n#       ifdef __UINT64_MAX__\n#           define ZYAN_UINT64_MAX      __UINT64_MAX__\n#       else\n#           if defined(__x86_64__) && !defined( __ILP32__)\n#               define ZYAN_UINT64_MAX  (18446744073709551615UL)\n#           else\n#               define ZYAN_UINT64_MAX  (18446744073709551615ULL)\n#           endif\n#       endif\n#   endif\n#else\n    // If is LibC present, we use stdint types.\n#   include <stdint.h>\n#   include <stddef.h>\n    typedef uint8_t   ZyanU8;\n    typedef uint16_t  ZyanU16;\n    typedef uint32_t  ZyanU32;\n    typedef uint64_t  ZyanU64;\n    typedef int8_t    ZyanI8;\n    typedef int16_t   ZyanI16;\n    typedef int32_t   ZyanI32;\n    typedef int64_t   ZyanI64;\n    typedef size_t    ZyanUSize;\n    typedef ptrdiff_t ZyanISize;\n    typedef uintptr_t ZyanUPointer;\n    typedef intptr_t  ZyanIPointer;\n\n#   define ZYAN_INT8_MIN         INT8_MIN\n#   define ZYAN_INT16_MIN        INT16_MIN\n#   define ZYAN_INT32_MIN        INT32_MIN\n#   define ZYAN_INT64_MIN        INT64_MIN\n#   define ZYAN_INT8_MAX         INT8_MAX\n#   define ZYAN_INT16_MAX        INT16_MAX\n#   define ZYAN_INT32_MAX        INT32_MAX\n#   define ZYAN_INT64_MAX        INT64_MAX\n#   define ZYAN_UINT8_MAX        UINT8_MAX\n#   define ZYAN_UINT16_MAX       UINT16_MAX\n#   define ZYAN_UINT32_MAX       UINT32_MAX\n#   define ZYAN_UINT64_MAX       UINT64_MAX\n#endif\n\n// Verify size assumptions.\nZYAN_STATIC_ASSERT(sizeof(ZyanU8      ) == 1            );\nZYAN_STATIC_ASSERT(sizeof(ZyanU16     ) == 2            );\nZYAN_STATIC_ASSERT(sizeof(ZyanU32     ) == 4            );\nZYAN_STATIC_ASSERT(sizeof(ZyanU64     ) == 8            );\nZYAN_STATIC_ASSERT(sizeof(ZyanI8      ) == 1            );\nZYAN_STATIC_ASSERT(sizeof(ZyanI16     ) == 2            );\nZYAN_STATIC_ASSERT(sizeof(ZyanI32     ) == 4            );\nZYAN_STATIC_ASSERT(sizeof(ZyanI64     ) == 8            );\nZYAN_STATIC_ASSERT(sizeof(ZyanUSize   ) == sizeof(void*)); // TODO: This one is incorrect!\nZYAN_STATIC_ASSERT(sizeof(ZyanISize   ) == sizeof(void*)); // TODO: This one is incorrect!\nZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));\nZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));\n\n// Verify signedness assumptions (relies on size checks above).\nZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));\nZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));\nZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));\nZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));\n\n/* ============================================================================================== */\n/* Pointer                                                                                        */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZyanVoidPointer` data-type.\n */\ntypedef void* ZyanVoidPointer;\n\n/**\n * Defines the `ZyanConstVoidPointer` data-type.\n */\ntypedef const void* ZyanConstVoidPointer;\n\n#define ZYAN_NULL ((void*)0)\n\n/* ============================================================================================== */\n/* Logic types                                                                                    */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Boolean                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n#define ZYAN_FALSE 0u\n#define ZYAN_TRUE  1u\n\n/**\n * Defines the `ZyanBool` data-type.\n *\n * Represents a default boolean data-type where `0` is interpreted as `false` and all other values\n * as `true`.\n */\ntypedef ZyanU8 ZyanBool;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Ternary                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZyanTernary` data-type.\n *\n * The `ZyanTernary` is a balanced ternary type that uses three truth values indicating `true`,\n * `false` and an indeterminate third value.\n */\ntypedef ZyanI8 ZyanTernary;\n\n#define ZYAN_TERNARY_FALSE    (-1)\n#define ZYAN_TERNARY_UNKNOWN  0x00\n#define ZYAN_TERNARY_TRUE     0x01\n\n/* ============================================================================================== */\n/* String types                                                                                   */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* C-style strings                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZyanCharPointer` data-type.\n *\n * This type is most often used to represent null-terminated strings aka. C-style strings.\n */\ntypedef char* ZyanCharPointer;\n\n/**\n * Defines the `ZyanConstCharPointer` data-type.\n *\n * This type is most often used to represent null-terminated strings aka. C-style strings.\n */\ntypedef const char* ZyanConstCharPointer;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#endif /* ZYCORE_TYPES_H */\n\n#if !defined(ZYDIS_DISABLE_DECODER)\n\n//\n// Header: Zydis/Decoder.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Functions for decoding instructions.\n */\n\n#ifndef ZYDIS_DECODER_H\n#define ZYDIS_DECODER_H\n\n\n//\n// Header: Zydis/DecoderTypes.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Defines the basic `ZydisDecodedInstruction` and `ZydisDecodedOperand` structs.\n */\n\n#ifndef ZYDIS_INSTRUCTIONINFO_H\n#define ZYDIS_INSTRUCTIONINFO_H\n\n\n//\n// Header: Zydis/MetaInfo.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * @brief\n */\n\n#ifndef ZYDIS_METAINFO_H\n#define ZYDIS_METAINFO_H\n\n\n//\n// Header: Zydis/Defines.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/MetaInfo.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Joel Hoener\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Import/export defines for MSVC builds.\n */\n\n#ifndef ZYDIS_DEFINES_H\n#define ZYDIS_DEFINES_H\n\n\n// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To\n// simplify builds without CMake, we define these things manually instead of relying on CMake\n// to generate the header.\n//\n// For static builds, our CMakeList will define `ZYDIS_STATIC_BUILD`. For shared library builds,\n// our CMake will define `ZYDIS_SHOULD_EXPORT` depending on whether the target is being imported or\n// exported. If CMake isn't used, users can manually define these to fit their use-case.\n\n// Backward compatibility: CMake would previously generate these variables names. However, because\n// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For\n// backward compatibility for users that don't use CMake and previously manually defined these, we\n// translate the old defines here and print a warning.\n#if defined(ZYDIS_STATIC_DEFINE)\n#   pragma message(\"ZYDIS_STATIC_DEFINE was renamed to ZYDIS_STATIC_BUILD.\")\n#   define ZYDIS_STATIC_BUILD\n#endif\n#if defined(Zydis_EXPORTS)\n#   pragma message(\"Zydis_EXPORTS was renamed to ZYDIS_SHOULD_EXPORT.\")\n#   define ZYDIS_SHOULD_EXPORT\n#endif\n\n/**\n * Symbol is exported in shared library builds.\n */\n#if defined(ZYDIS_STATIC_BUILD)\n#   define ZYDIS_EXPORT\n#else\n#   if defined(ZYDIS_SHOULD_EXPORT)\n#       define ZYDIS_EXPORT ZYAN_DLLEXPORT\n#   else\n#       define ZYDIS_EXPORT ZYAN_DLLIMPORT\n#   endif\n#endif\n\n/**\n * Symbol is not exported and for internal use only.\n */\n#define ZYDIS_NO_EXPORT\n\n#endif // ZYDIS_DEFINES_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n\n//\n// Header: Zydis/Generated/EnumInstructionCategory.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/MetaInfo.h\n//\n\n/**\n * Defines the `ZydisInstructionCategory` enum.\n */\ntypedef enum ZydisInstructionCategory_\n{\n    ZYDIS_CATEGORY_INVALID,\n    ZYDIS_CATEGORY_ADOX_ADCX,\n    ZYDIS_CATEGORY_AES,\n    ZYDIS_CATEGORY_AMD3DNOW,\n    ZYDIS_CATEGORY_AMX_TILE,\n    ZYDIS_CATEGORY_AVX,\n    ZYDIS_CATEGORY_AVX2,\n    ZYDIS_CATEGORY_AVX2GATHER,\n    ZYDIS_CATEGORY_AVX512,\n    ZYDIS_CATEGORY_AVX512_4FMAPS,\n    ZYDIS_CATEGORY_AVX512_4VNNIW,\n    ZYDIS_CATEGORY_AVX512_BITALG,\n    ZYDIS_CATEGORY_AVX512_VBMI,\n    ZYDIS_CATEGORY_AVX512_VP2INTERSECT,\n    ZYDIS_CATEGORY_AVX_IFMA,\n    ZYDIS_CATEGORY_BINARY,\n    ZYDIS_CATEGORY_BITBYTE,\n    ZYDIS_CATEGORY_BLEND,\n    ZYDIS_CATEGORY_BMI1,\n    ZYDIS_CATEGORY_BMI2,\n    ZYDIS_CATEGORY_BROADCAST,\n    ZYDIS_CATEGORY_CALL,\n    ZYDIS_CATEGORY_CET,\n    ZYDIS_CATEGORY_CLDEMOTE,\n    ZYDIS_CATEGORY_CLFLUSHOPT,\n    ZYDIS_CATEGORY_CLWB,\n    ZYDIS_CATEGORY_CLZERO,\n    ZYDIS_CATEGORY_CMOV,\n    ZYDIS_CATEGORY_COMPRESS,\n    ZYDIS_CATEGORY_COND_BR,\n    ZYDIS_CATEGORY_CONFLICT,\n    ZYDIS_CATEGORY_CONVERT,\n    ZYDIS_CATEGORY_DATAXFER,\n    ZYDIS_CATEGORY_DECIMAL,\n    ZYDIS_CATEGORY_ENQCMD,\n    ZYDIS_CATEGORY_EXPAND,\n    ZYDIS_CATEGORY_FCMOV,\n    ZYDIS_CATEGORY_FLAGOP,\n    ZYDIS_CATEGORY_FMA4,\n    ZYDIS_CATEGORY_FP16,\n    ZYDIS_CATEGORY_GATHER,\n    ZYDIS_CATEGORY_GFNI,\n    ZYDIS_CATEGORY_HRESET,\n    ZYDIS_CATEGORY_IFMA,\n    ZYDIS_CATEGORY_INTERRUPT,\n    ZYDIS_CATEGORY_IO,\n    ZYDIS_CATEGORY_IOSTRINGOP,\n    ZYDIS_CATEGORY_KEYLOCKER,\n    ZYDIS_CATEGORY_KEYLOCKER_WIDE,\n    ZYDIS_CATEGORY_KMASK,\n    ZYDIS_CATEGORY_KNC,\n    ZYDIS_CATEGORY_KNCMASK,\n    ZYDIS_CATEGORY_KNCSCALAR,\n    ZYDIS_CATEGORY_LEGACY,\n    ZYDIS_CATEGORY_LOGICAL,\n    ZYDIS_CATEGORY_LOGICAL_FP,\n    ZYDIS_CATEGORY_LZCNT,\n    ZYDIS_CATEGORY_MISC,\n    ZYDIS_CATEGORY_MMX,\n    ZYDIS_CATEGORY_MOVDIR,\n    ZYDIS_CATEGORY_MPX,\n    ZYDIS_CATEGORY_MSRLIST,\n    ZYDIS_CATEGORY_NOP,\n    ZYDIS_CATEGORY_PADLOCK,\n    ZYDIS_CATEGORY_PBNDKB,\n    ZYDIS_CATEGORY_PCLMULQDQ,\n    ZYDIS_CATEGORY_PCOMMIT,\n    ZYDIS_CATEGORY_PCONFIG,\n    ZYDIS_CATEGORY_PKU,\n    ZYDIS_CATEGORY_POP,\n    ZYDIS_CATEGORY_PREFETCH,\n    ZYDIS_CATEGORY_PREFETCHWT1,\n    ZYDIS_CATEGORY_PT,\n    ZYDIS_CATEGORY_PUSH,\n    ZYDIS_CATEGORY_RDPID,\n    ZYDIS_CATEGORY_RDPRU,\n    ZYDIS_CATEGORY_RDRAND,\n    ZYDIS_CATEGORY_RDSEED,\n    ZYDIS_CATEGORY_RDWRFSGS,\n    ZYDIS_CATEGORY_RET,\n    ZYDIS_CATEGORY_ROTATE,\n    ZYDIS_CATEGORY_SCATTER,\n    ZYDIS_CATEGORY_SEGOP,\n    ZYDIS_CATEGORY_SEMAPHORE,\n    ZYDIS_CATEGORY_SERIALIZE,\n    ZYDIS_CATEGORY_SETCC,\n    ZYDIS_CATEGORY_SGX,\n    ZYDIS_CATEGORY_SHA,\n    ZYDIS_CATEGORY_SHA512,\n    ZYDIS_CATEGORY_SHIFT,\n    ZYDIS_CATEGORY_SMAP,\n    ZYDIS_CATEGORY_SSE,\n    ZYDIS_CATEGORY_STRINGOP,\n    ZYDIS_CATEGORY_STTNI,\n    ZYDIS_CATEGORY_SYSCALL,\n    ZYDIS_CATEGORY_SYSRET,\n    ZYDIS_CATEGORY_SYSTEM,\n    ZYDIS_CATEGORY_TBM,\n    ZYDIS_CATEGORY_TSX_LDTRK,\n    ZYDIS_CATEGORY_UFMA,\n    ZYDIS_CATEGORY_UINTR,\n    ZYDIS_CATEGORY_UNCOND_BR,\n    ZYDIS_CATEGORY_VAES,\n    ZYDIS_CATEGORY_VBMI2,\n    ZYDIS_CATEGORY_VEX,\n    ZYDIS_CATEGORY_VFMA,\n    ZYDIS_CATEGORY_VPCLMULQDQ,\n    ZYDIS_CATEGORY_VTX,\n    ZYDIS_CATEGORY_WAITPKG,\n    ZYDIS_CATEGORY_WIDENOP,\n    ZYDIS_CATEGORY_WRMSRNS,\n    ZYDIS_CATEGORY_X87_ALU,\n    ZYDIS_CATEGORY_XOP,\n    ZYDIS_CATEGORY_XSAVE,\n    ZYDIS_CATEGORY_XSAVEOPT,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_CATEGORY_MAX_VALUE = ZYDIS_CATEGORY_XSAVEOPT,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_CATEGORY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CATEGORY_MAX_VALUE)\n} ZydisInstructionCategory;\n\n//\n// Header: Zydis/Generated/EnumISASet.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/MetaInfo.h\n//\n\n/**\n * Defines the `ZydisISASet` enum.\n */\ntypedef enum ZydisISASet_\n{\n    ZYDIS_ISA_SET_INVALID,\n    ZYDIS_ISA_SET_ADOX_ADCX,\n    ZYDIS_ISA_SET_AES,\n    ZYDIS_ISA_SET_AMD,\n    ZYDIS_ISA_SET_AMD3DNOW,\n    ZYDIS_ISA_SET_AMD_INVLPGB,\n    ZYDIS_ISA_SET_AMX_BF16,\n    ZYDIS_ISA_SET_AMX_FP16,\n    ZYDIS_ISA_SET_AMX_INT8,\n    ZYDIS_ISA_SET_AMX_TILE,\n    ZYDIS_ISA_SET_AVX,\n    ZYDIS_ISA_SET_AVX2,\n    ZYDIS_ISA_SET_AVX2GATHER,\n    ZYDIS_ISA_SET_AVX512BW_128,\n    ZYDIS_ISA_SET_AVX512BW_128N,\n    ZYDIS_ISA_SET_AVX512BW_256,\n    ZYDIS_ISA_SET_AVX512BW_512,\n    ZYDIS_ISA_SET_AVX512BW_KOP,\n    ZYDIS_ISA_SET_AVX512CD_128,\n    ZYDIS_ISA_SET_AVX512CD_256,\n    ZYDIS_ISA_SET_AVX512CD_512,\n    ZYDIS_ISA_SET_AVX512DQ_128,\n    ZYDIS_ISA_SET_AVX512DQ_128N,\n    ZYDIS_ISA_SET_AVX512DQ_256,\n    ZYDIS_ISA_SET_AVX512DQ_512,\n    ZYDIS_ISA_SET_AVX512DQ_KOP,\n    ZYDIS_ISA_SET_AVX512DQ_SCALAR,\n    ZYDIS_ISA_SET_AVX512ER_512,\n    ZYDIS_ISA_SET_AVX512ER_SCALAR,\n    ZYDIS_ISA_SET_AVX512F_128,\n    ZYDIS_ISA_SET_AVX512F_128N,\n    ZYDIS_ISA_SET_AVX512F_256,\n    ZYDIS_ISA_SET_AVX512F_512,\n    ZYDIS_ISA_SET_AVX512F_KOP,\n    ZYDIS_ISA_SET_AVX512F_SCALAR,\n    ZYDIS_ISA_SET_AVX512PF_512,\n    ZYDIS_ISA_SET_AVX512_4FMAPS_512,\n    ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR,\n    ZYDIS_ISA_SET_AVX512_4VNNIW_512,\n    ZYDIS_ISA_SET_AVX512_BF16_128,\n    ZYDIS_ISA_SET_AVX512_BF16_256,\n    ZYDIS_ISA_SET_AVX512_BF16_512,\n    ZYDIS_ISA_SET_AVX512_BITALG_128,\n    ZYDIS_ISA_SET_AVX512_BITALG_256,\n    ZYDIS_ISA_SET_AVX512_BITALG_512,\n    ZYDIS_ISA_SET_AVX512_FP16_128,\n    ZYDIS_ISA_SET_AVX512_FP16_128N,\n    ZYDIS_ISA_SET_AVX512_FP16_256,\n    ZYDIS_ISA_SET_AVX512_FP16_512,\n    ZYDIS_ISA_SET_AVX512_FP16_SCALAR,\n    ZYDIS_ISA_SET_AVX512_GFNI_128,\n    ZYDIS_ISA_SET_AVX512_GFNI_256,\n    ZYDIS_ISA_SET_AVX512_GFNI_512,\n    ZYDIS_ISA_SET_AVX512_IFMA_128,\n    ZYDIS_ISA_SET_AVX512_IFMA_256,\n    ZYDIS_ISA_SET_AVX512_IFMA_512,\n    ZYDIS_ISA_SET_AVX512_VAES_128,\n    ZYDIS_ISA_SET_AVX512_VAES_256,\n    ZYDIS_ISA_SET_AVX512_VAES_512,\n    ZYDIS_ISA_SET_AVX512_VBMI2_128,\n    ZYDIS_ISA_SET_AVX512_VBMI2_256,\n    ZYDIS_ISA_SET_AVX512_VBMI2_512,\n    ZYDIS_ISA_SET_AVX512_VBMI_128,\n    ZYDIS_ISA_SET_AVX512_VBMI_256,\n    ZYDIS_ISA_SET_AVX512_VBMI_512,\n    ZYDIS_ISA_SET_AVX512_VNNI_128,\n    ZYDIS_ISA_SET_AVX512_VNNI_256,\n    ZYDIS_ISA_SET_AVX512_VNNI_512,\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128,\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256,\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512,\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128,\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256,\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512,\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128,\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256,\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512,\n    ZYDIS_ISA_SET_AVXAES,\n    ZYDIS_ISA_SET_AVX_GFNI,\n    ZYDIS_ISA_SET_AVX_IFMA,\n    ZYDIS_ISA_SET_AVX_NE_CONVERT,\n    ZYDIS_ISA_SET_AVX_VNNI,\n    ZYDIS_ISA_SET_AVX_VNNI_INT16,\n    ZYDIS_ISA_SET_AVX_VNNI_INT8,\n    ZYDIS_ISA_SET_BMI1,\n    ZYDIS_ISA_SET_BMI2,\n    ZYDIS_ISA_SET_CET,\n    ZYDIS_ISA_SET_CLDEMOTE,\n    ZYDIS_ISA_SET_CLFLUSHOPT,\n    ZYDIS_ISA_SET_CLFSH,\n    ZYDIS_ISA_SET_CLWB,\n    ZYDIS_ISA_SET_CLZERO,\n    ZYDIS_ISA_SET_CMOV,\n    ZYDIS_ISA_SET_CMPXCHG16B,\n    ZYDIS_ISA_SET_ENQCMD,\n    ZYDIS_ISA_SET_F16C,\n    ZYDIS_ISA_SET_FAT_NOP,\n    ZYDIS_ISA_SET_FCMOV,\n    ZYDIS_ISA_SET_FCOMI,\n    ZYDIS_ISA_SET_FMA,\n    ZYDIS_ISA_SET_FMA4,\n    ZYDIS_ISA_SET_FXSAVE,\n    ZYDIS_ISA_SET_FXSAVE64,\n    ZYDIS_ISA_SET_GFNI,\n    ZYDIS_ISA_SET_HRESET,\n    ZYDIS_ISA_SET_I186,\n    ZYDIS_ISA_SET_I286PROTECTED,\n    ZYDIS_ISA_SET_I286REAL,\n    ZYDIS_ISA_SET_I386,\n    ZYDIS_ISA_SET_I486,\n    ZYDIS_ISA_SET_I486REAL,\n    ZYDIS_ISA_SET_I86,\n    ZYDIS_ISA_SET_ICACHE_PREFETCH,\n    ZYDIS_ISA_SET_INVPCID,\n    ZYDIS_ISA_SET_KEYLOCKER,\n    ZYDIS_ISA_SET_KEYLOCKER_WIDE,\n    ZYDIS_ISA_SET_KNCE,\n    ZYDIS_ISA_SET_KNCJKBR,\n    ZYDIS_ISA_SET_KNCSTREAM,\n    ZYDIS_ISA_SET_KNCV,\n    ZYDIS_ISA_SET_KNC_MISC,\n    ZYDIS_ISA_SET_KNC_PF_HINT,\n    ZYDIS_ISA_SET_LAHF,\n    ZYDIS_ISA_SET_LONGMODE,\n    ZYDIS_ISA_SET_LWP,\n    ZYDIS_ISA_SET_LZCNT,\n    ZYDIS_ISA_SET_MCOMMIT,\n    ZYDIS_ISA_SET_MONITOR,\n    ZYDIS_ISA_SET_MONITORX,\n    ZYDIS_ISA_SET_MOVBE,\n    ZYDIS_ISA_SET_MOVDIR,\n    ZYDIS_ISA_SET_MPX,\n    ZYDIS_ISA_SET_MSRLIST,\n    ZYDIS_ISA_SET_PADLOCK_ACE,\n    ZYDIS_ISA_SET_PADLOCK_PHE,\n    ZYDIS_ISA_SET_PADLOCK_PMM,\n    ZYDIS_ISA_SET_PADLOCK_RNG,\n    ZYDIS_ISA_SET_PAUSE,\n    ZYDIS_ISA_SET_PBNDKB,\n    ZYDIS_ISA_SET_PCLMULQDQ,\n    ZYDIS_ISA_SET_PCOMMIT,\n    ZYDIS_ISA_SET_PCONFIG,\n    ZYDIS_ISA_SET_PENTIUMMMX,\n    ZYDIS_ISA_SET_PENTIUMREAL,\n    ZYDIS_ISA_SET_PKU,\n    ZYDIS_ISA_SET_POPCNT,\n    ZYDIS_ISA_SET_PPRO,\n    ZYDIS_ISA_SET_PREFETCHWT1,\n    ZYDIS_ISA_SET_PREFETCH_NOP,\n    ZYDIS_ISA_SET_PT,\n    ZYDIS_ISA_SET_RAO_INT,\n    ZYDIS_ISA_SET_RDPID,\n    ZYDIS_ISA_SET_RDPMC,\n    ZYDIS_ISA_SET_RDPRU,\n    ZYDIS_ISA_SET_RDRAND,\n    ZYDIS_ISA_SET_RDSEED,\n    ZYDIS_ISA_SET_RDTSCP,\n    ZYDIS_ISA_SET_RDWRFSGS,\n    ZYDIS_ISA_SET_RTM,\n    ZYDIS_ISA_SET_SERIALIZE,\n    ZYDIS_ISA_SET_SGX,\n    ZYDIS_ISA_SET_SGX_ENCLV,\n    ZYDIS_ISA_SET_SHA,\n    ZYDIS_ISA_SET_SHA512,\n    ZYDIS_ISA_SET_SM3,\n    ZYDIS_ISA_SET_SM4,\n    ZYDIS_ISA_SET_SMAP,\n    ZYDIS_ISA_SET_SMX,\n    ZYDIS_ISA_SET_SNP,\n    ZYDIS_ISA_SET_SSE,\n    ZYDIS_ISA_SET_SSE2,\n    ZYDIS_ISA_SET_SSE2MMX,\n    ZYDIS_ISA_SET_SSE3,\n    ZYDIS_ISA_SET_SSE3X87,\n    ZYDIS_ISA_SET_SSE4,\n    ZYDIS_ISA_SET_SSE42,\n    ZYDIS_ISA_SET_SSE4A,\n    ZYDIS_ISA_SET_SSEMXCSR,\n    ZYDIS_ISA_SET_SSE_PREFETCH,\n    ZYDIS_ISA_SET_SSSE3,\n    ZYDIS_ISA_SET_SSSE3MMX,\n    ZYDIS_ISA_SET_SVM,\n    ZYDIS_ISA_SET_TBM,\n    ZYDIS_ISA_SET_TDX,\n    ZYDIS_ISA_SET_TSX_LDTRK,\n    ZYDIS_ISA_SET_UINTR,\n    ZYDIS_ISA_SET_VAES,\n    ZYDIS_ISA_SET_VMFUNC,\n    ZYDIS_ISA_SET_VPCLMULQDQ,\n    ZYDIS_ISA_SET_VTX,\n    ZYDIS_ISA_SET_WAITPKG,\n    ZYDIS_ISA_SET_WRMSRNS,\n    ZYDIS_ISA_SET_X87,\n    ZYDIS_ISA_SET_XOP,\n    ZYDIS_ISA_SET_XSAVE,\n    ZYDIS_ISA_SET_XSAVEC,\n    ZYDIS_ISA_SET_XSAVEOPT,\n    ZYDIS_ISA_SET_XSAVES,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ISA_SET_MAX_VALUE = ZYDIS_ISA_SET_XSAVES,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ISA_SET_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_SET_MAX_VALUE)\n} ZydisISASet;\n\n//\n// Header: Zydis/Generated/EnumISAExt.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/MetaInfo.h\n//\n\n/**\n * Defines the `ZydisISAExt` enum.\n */\ntypedef enum ZydisISAExt_\n{\n    ZYDIS_ISA_EXT_INVALID,\n    ZYDIS_ISA_EXT_ADOX_ADCX,\n    ZYDIS_ISA_EXT_AES,\n    ZYDIS_ISA_EXT_AMD3DNOW,\n    ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH,\n    ZYDIS_ISA_EXT_AMD_INVLPGB,\n    ZYDIS_ISA_EXT_AMX_BF16,\n    ZYDIS_ISA_EXT_AMX_FP16,\n    ZYDIS_ISA_EXT_AMX_INT8,\n    ZYDIS_ISA_EXT_AMX_TILE,\n    ZYDIS_ISA_EXT_AVX,\n    ZYDIS_ISA_EXT_AVX2,\n    ZYDIS_ISA_EXT_AVX2GATHER,\n    ZYDIS_ISA_EXT_AVX512EVEX,\n    ZYDIS_ISA_EXT_AVX512VEX,\n    ZYDIS_ISA_EXT_AVXAES,\n    ZYDIS_ISA_EXT_AVX_IFMA,\n    ZYDIS_ISA_EXT_AVX_NE_CONVERT,\n    ZYDIS_ISA_EXT_AVX_VNNI,\n    ZYDIS_ISA_EXT_AVX_VNNI_INT16,\n    ZYDIS_ISA_EXT_AVX_VNNI_INT8,\n    ZYDIS_ISA_EXT_BASE,\n    ZYDIS_ISA_EXT_BMI1,\n    ZYDIS_ISA_EXT_BMI2,\n    ZYDIS_ISA_EXT_CET,\n    ZYDIS_ISA_EXT_CLDEMOTE,\n    ZYDIS_ISA_EXT_CLFLUSHOPT,\n    ZYDIS_ISA_EXT_CLFSH,\n    ZYDIS_ISA_EXT_CLWB,\n    ZYDIS_ISA_EXT_CLZERO,\n    ZYDIS_ISA_EXT_ENQCMD,\n    ZYDIS_ISA_EXT_F16C,\n    ZYDIS_ISA_EXT_FMA,\n    ZYDIS_ISA_EXT_FMA4,\n    ZYDIS_ISA_EXT_GFNI,\n    ZYDIS_ISA_EXT_HRESET,\n    ZYDIS_ISA_EXT_ICACHE_PREFETCH,\n    ZYDIS_ISA_EXT_INVPCID,\n    ZYDIS_ISA_EXT_KEYLOCKER,\n    ZYDIS_ISA_EXT_KEYLOCKER_WIDE,\n    ZYDIS_ISA_EXT_KNC,\n    ZYDIS_ISA_EXT_KNCE,\n    ZYDIS_ISA_EXT_KNCV,\n    ZYDIS_ISA_EXT_LONGMODE,\n    ZYDIS_ISA_EXT_LZCNT,\n    ZYDIS_ISA_EXT_MCOMMIT,\n    ZYDIS_ISA_EXT_MMX,\n    ZYDIS_ISA_EXT_MONITOR,\n    ZYDIS_ISA_EXT_MONITORX,\n    ZYDIS_ISA_EXT_MOVBE,\n    ZYDIS_ISA_EXT_MOVDIR,\n    ZYDIS_ISA_EXT_MPX,\n    ZYDIS_ISA_EXT_MSRLIST,\n    ZYDIS_ISA_EXT_PADLOCK,\n    ZYDIS_ISA_EXT_PAUSE,\n    ZYDIS_ISA_EXT_PBNDKB,\n    ZYDIS_ISA_EXT_PCLMULQDQ,\n    ZYDIS_ISA_EXT_PCOMMIT,\n    ZYDIS_ISA_EXT_PCONFIG,\n    ZYDIS_ISA_EXT_PKU,\n    ZYDIS_ISA_EXT_PREFETCHWT1,\n    ZYDIS_ISA_EXT_PT,\n    ZYDIS_ISA_EXT_RAO_INT,\n    ZYDIS_ISA_EXT_RDPID,\n    ZYDIS_ISA_EXT_RDPRU,\n    ZYDIS_ISA_EXT_RDRAND,\n    ZYDIS_ISA_EXT_RDSEED,\n    ZYDIS_ISA_EXT_RDTSCP,\n    ZYDIS_ISA_EXT_RDWRFSGS,\n    ZYDIS_ISA_EXT_RTM,\n    ZYDIS_ISA_EXT_SERIALIZE,\n    ZYDIS_ISA_EXT_SGX,\n    ZYDIS_ISA_EXT_SGX_ENCLV,\n    ZYDIS_ISA_EXT_SHA,\n    ZYDIS_ISA_EXT_SHA512,\n    ZYDIS_ISA_EXT_SM3,\n    ZYDIS_ISA_EXT_SM4,\n    ZYDIS_ISA_EXT_SMAP,\n    ZYDIS_ISA_EXT_SMX,\n    ZYDIS_ISA_EXT_SNP,\n    ZYDIS_ISA_EXT_SSE,\n    ZYDIS_ISA_EXT_SSE2,\n    ZYDIS_ISA_EXT_SSE3,\n    ZYDIS_ISA_EXT_SSE4,\n    ZYDIS_ISA_EXT_SSE4A,\n    ZYDIS_ISA_EXT_SSSE3,\n    ZYDIS_ISA_EXT_SVM,\n    ZYDIS_ISA_EXT_TBM,\n    ZYDIS_ISA_EXT_TDX,\n    ZYDIS_ISA_EXT_TSX_LDTRK,\n    ZYDIS_ISA_EXT_UINTR,\n    ZYDIS_ISA_EXT_VAES,\n    ZYDIS_ISA_EXT_VMFUNC,\n    ZYDIS_ISA_EXT_VPCLMULQDQ,\n    ZYDIS_ISA_EXT_VTX,\n    ZYDIS_ISA_EXT_WAITPKG,\n    ZYDIS_ISA_EXT_WRMSRNS,\n    ZYDIS_ISA_EXT_X87,\n    ZYDIS_ISA_EXT_XOP,\n    ZYDIS_ISA_EXT_XSAVE,\n    ZYDIS_ISA_EXT_XSAVEC,\n    ZYDIS_ISA_EXT_XSAVEOPT,\n    ZYDIS_ISA_EXT_XSAVES,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ISA_EXT_MAX_VALUE = ZYDIS_ISA_EXT_XSAVES,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ISA_EXT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_EXT_MAX_VALUE)\n} ZydisISAExt;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n /**\n * Returns the specified instruction category string.\n *\n * @param   category    The instruction category.\n *\n * @return  The instruction category string or `ZYAN_NULL`, if an invalid category was passed.\n */\nZYDIS_EXPORT const char* ZydisCategoryGetString(ZydisInstructionCategory category);\n\n/**\n * Returns the specified isa-set string.\n *\n * @param   isa_set The isa-set.\n *\n * @return  The isa-set string or `ZYAN_NULL`, if an invalid isa-set was passed.\n */\nZYDIS_EXPORT const char* ZydisISASetGetString(ZydisISASet isa_set);\n\n/**\n * Returns the specified isa-extension string.\n *\n * @param   isa_ext The isa-extension.\n *\n * @return  The isa-extension string or `ZYAN_NULL`, if an invalid isa-extension was passed.\n */\nZYDIS_EXPORT const char* ZydisISAExtGetString(ZydisISAExt isa_ext);\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_METAINFO_H */\n\n//\n// Header: Zydis/Mnemonic.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Mnemonic constant definitions and helper functions.\n */\n\n#ifndef ZYDIS_MNEMONIC_H\n#define ZYDIS_MNEMONIC_H\n\n\n//\n// Header: Zydis/ShortString.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/Mnemonic.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Defines the immutable and storage-efficient `ZydisShortString` struct, which\n * is used to store strings in the generated tables.\n */\n\n#ifndef ZYDIS_SHORTSTRING_H\n#define ZYDIS_SHORTSTRING_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n#if !defined(ZYAN_APPLE)\n#   pragma pack(push, 1)\n#endif\n\n/**\n * Defines the `ZydisShortString` struct.\n *\n * This compact struct is mainly used for internal string-tables to save up some bytes.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZydisShortString_\n{\n    /**\n     * The buffer that contains the actual (null-terminated) string.\n    */\n    const char* data;\n    /**\n     * The length (number of characters) of the string (without 0-termination).\n    */\n    ZyanU8 size;\n} ZydisShortString;\n\n#if !defined(ZYAN_APPLE)\n#   pragma pack(pop)\n#endif\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/**\n * Declares a `ZydisShortString` from a static C-style string.\n *\n * @param   string  The C-string constant.\n */\n#define ZYDIS_MAKE_SHORTSTRING(string) \\\n    { string, sizeof(string) - 1 }\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_SHORTSTRING_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n\n//\n// Header: Zydis/Generated/EnumMnemonic.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/Mnemonic.h\n//\n\n/**\n * Defines the `ZydisMnemonic` enum.\n */\ntypedef enum ZydisMnemonic_\n{\n    ZYDIS_MNEMONIC_INVALID,\n    ZYDIS_MNEMONIC_AAA,\n    ZYDIS_MNEMONIC_AAD,\n    ZYDIS_MNEMONIC_AADD,\n    ZYDIS_MNEMONIC_AAM,\n    ZYDIS_MNEMONIC_AAND,\n    ZYDIS_MNEMONIC_AAS,\n    ZYDIS_MNEMONIC_ADC,\n    ZYDIS_MNEMONIC_ADCX,\n    ZYDIS_MNEMONIC_ADD,\n    ZYDIS_MNEMONIC_ADDPD,\n    ZYDIS_MNEMONIC_ADDPS,\n    ZYDIS_MNEMONIC_ADDSD,\n    ZYDIS_MNEMONIC_ADDSS,\n    ZYDIS_MNEMONIC_ADDSUBPD,\n    ZYDIS_MNEMONIC_ADDSUBPS,\n    ZYDIS_MNEMONIC_ADOX,\n    ZYDIS_MNEMONIC_AESDEC,\n    ZYDIS_MNEMONIC_AESDEC128KL,\n    ZYDIS_MNEMONIC_AESDEC256KL,\n    ZYDIS_MNEMONIC_AESDECLAST,\n    ZYDIS_MNEMONIC_AESDECWIDE128KL,\n    ZYDIS_MNEMONIC_AESDECWIDE256KL,\n    ZYDIS_MNEMONIC_AESENC,\n    ZYDIS_MNEMONIC_AESENC128KL,\n    ZYDIS_MNEMONIC_AESENC256KL,\n    ZYDIS_MNEMONIC_AESENCLAST,\n    ZYDIS_MNEMONIC_AESENCWIDE128KL,\n    ZYDIS_MNEMONIC_AESENCWIDE256KL,\n    ZYDIS_MNEMONIC_AESIMC,\n    ZYDIS_MNEMONIC_AESKEYGENASSIST,\n    ZYDIS_MNEMONIC_AND,\n    ZYDIS_MNEMONIC_ANDN,\n    ZYDIS_MNEMONIC_ANDNPD,\n    ZYDIS_MNEMONIC_ANDNPS,\n    ZYDIS_MNEMONIC_ANDPD,\n    ZYDIS_MNEMONIC_ANDPS,\n    ZYDIS_MNEMONIC_AOR,\n    ZYDIS_MNEMONIC_ARPL,\n    ZYDIS_MNEMONIC_AXOR,\n    ZYDIS_MNEMONIC_BEXTR,\n    ZYDIS_MNEMONIC_BLCFILL,\n    ZYDIS_MNEMONIC_BLCI,\n    ZYDIS_MNEMONIC_BLCIC,\n    ZYDIS_MNEMONIC_BLCMSK,\n    ZYDIS_MNEMONIC_BLCS,\n    ZYDIS_MNEMONIC_BLENDPD,\n    ZYDIS_MNEMONIC_BLENDPS,\n    ZYDIS_MNEMONIC_BLENDVPD,\n    ZYDIS_MNEMONIC_BLENDVPS,\n    ZYDIS_MNEMONIC_BLSFILL,\n    ZYDIS_MNEMONIC_BLSI,\n    ZYDIS_MNEMONIC_BLSIC,\n    ZYDIS_MNEMONIC_BLSMSK,\n    ZYDIS_MNEMONIC_BLSR,\n    ZYDIS_MNEMONIC_BNDCL,\n    ZYDIS_MNEMONIC_BNDCN,\n    ZYDIS_MNEMONIC_BNDCU,\n    ZYDIS_MNEMONIC_BNDLDX,\n    ZYDIS_MNEMONIC_BNDMK,\n    ZYDIS_MNEMONIC_BNDMOV,\n    ZYDIS_MNEMONIC_BNDSTX,\n    ZYDIS_MNEMONIC_BOUND,\n    ZYDIS_MNEMONIC_BSF,\n    ZYDIS_MNEMONIC_BSR,\n    ZYDIS_MNEMONIC_BSWAP,\n    ZYDIS_MNEMONIC_BT,\n    ZYDIS_MNEMONIC_BTC,\n    ZYDIS_MNEMONIC_BTR,\n    ZYDIS_MNEMONIC_BTS,\n    ZYDIS_MNEMONIC_BZHI,\n    ZYDIS_MNEMONIC_CALL,\n    ZYDIS_MNEMONIC_CBW,\n    ZYDIS_MNEMONIC_CDQ,\n    ZYDIS_MNEMONIC_CDQE,\n    ZYDIS_MNEMONIC_CLAC,\n    ZYDIS_MNEMONIC_CLC,\n    ZYDIS_MNEMONIC_CLD,\n    ZYDIS_MNEMONIC_CLDEMOTE,\n    ZYDIS_MNEMONIC_CLEVICT0,\n    ZYDIS_MNEMONIC_CLEVICT1,\n    ZYDIS_MNEMONIC_CLFLUSH,\n    ZYDIS_MNEMONIC_CLFLUSHOPT,\n    ZYDIS_MNEMONIC_CLGI,\n    ZYDIS_MNEMONIC_CLI,\n    ZYDIS_MNEMONIC_CLRSSBSY,\n    ZYDIS_MNEMONIC_CLTS,\n    ZYDIS_MNEMONIC_CLUI,\n    ZYDIS_MNEMONIC_CLWB,\n    ZYDIS_MNEMONIC_CLZERO,\n    ZYDIS_MNEMONIC_CMC,\n    ZYDIS_MNEMONIC_CMOVB,\n    ZYDIS_MNEMONIC_CMOVBE,\n    ZYDIS_MNEMONIC_CMOVL,\n    ZYDIS_MNEMONIC_CMOVLE,\n    ZYDIS_MNEMONIC_CMOVNB,\n    ZYDIS_MNEMONIC_CMOVNBE,\n    ZYDIS_MNEMONIC_CMOVNL,\n    ZYDIS_MNEMONIC_CMOVNLE,\n    ZYDIS_MNEMONIC_CMOVNO,\n    ZYDIS_MNEMONIC_CMOVNP,\n    ZYDIS_MNEMONIC_CMOVNS,\n    ZYDIS_MNEMONIC_CMOVNZ,\n    ZYDIS_MNEMONIC_CMOVO,\n    ZYDIS_MNEMONIC_CMOVP,\n    ZYDIS_MNEMONIC_CMOVS,\n    ZYDIS_MNEMONIC_CMOVZ,\n    ZYDIS_MNEMONIC_CMP,\n    ZYDIS_MNEMONIC_CMPPD,\n    ZYDIS_MNEMONIC_CMPPS,\n    ZYDIS_MNEMONIC_CMPSB,\n    ZYDIS_MNEMONIC_CMPSD,\n    ZYDIS_MNEMONIC_CMPSQ,\n    ZYDIS_MNEMONIC_CMPSS,\n    ZYDIS_MNEMONIC_CMPSW,\n    ZYDIS_MNEMONIC_CMPXCHG,\n    ZYDIS_MNEMONIC_CMPXCHG16B,\n    ZYDIS_MNEMONIC_CMPXCHG8B,\n    ZYDIS_MNEMONIC_COMISD,\n    ZYDIS_MNEMONIC_COMISS,\n    ZYDIS_MNEMONIC_CPUID,\n    ZYDIS_MNEMONIC_CQO,\n    ZYDIS_MNEMONIC_CRC32,\n    ZYDIS_MNEMONIC_CVTDQ2PD,\n    ZYDIS_MNEMONIC_CVTDQ2PS,\n    ZYDIS_MNEMONIC_CVTPD2DQ,\n    ZYDIS_MNEMONIC_CVTPD2PI,\n    ZYDIS_MNEMONIC_CVTPD2PS,\n    ZYDIS_MNEMONIC_CVTPI2PD,\n    ZYDIS_MNEMONIC_CVTPI2PS,\n    ZYDIS_MNEMONIC_CVTPS2DQ,\n    ZYDIS_MNEMONIC_CVTPS2PD,\n    ZYDIS_MNEMONIC_CVTPS2PI,\n    ZYDIS_MNEMONIC_CVTSD2SI,\n    ZYDIS_MNEMONIC_CVTSD2SS,\n    ZYDIS_MNEMONIC_CVTSI2SD,\n    ZYDIS_MNEMONIC_CVTSI2SS,\n    ZYDIS_MNEMONIC_CVTSS2SD,\n    ZYDIS_MNEMONIC_CVTSS2SI,\n    ZYDIS_MNEMONIC_CVTTPD2DQ,\n    ZYDIS_MNEMONIC_CVTTPD2PI,\n    ZYDIS_MNEMONIC_CVTTPS2DQ,\n    ZYDIS_MNEMONIC_CVTTPS2PI,\n    ZYDIS_MNEMONIC_CVTTSD2SI,\n    ZYDIS_MNEMONIC_CVTTSS2SI,\n    ZYDIS_MNEMONIC_CWD,\n    ZYDIS_MNEMONIC_CWDE,\n    ZYDIS_MNEMONIC_DAA,\n    ZYDIS_MNEMONIC_DAS,\n    ZYDIS_MNEMONIC_DEC,\n    ZYDIS_MNEMONIC_DELAY,\n    ZYDIS_MNEMONIC_DIV,\n    ZYDIS_MNEMONIC_DIVPD,\n    ZYDIS_MNEMONIC_DIVPS,\n    ZYDIS_MNEMONIC_DIVSD,\n    ZYDIS_MNEMONIC_DIVSS,\n    ZYDIS_MNEMONIC_DPPD,\n    ZYDIS_MNEMONIC_DPPS,\n    ZYDIS_MNEMONIC_EMMS,\n    ZYDIS_MNEMONIC_ENCLS,\n    ZYDIS_MNEMONIC_ENCLU,\n    ZYDIS_MNEMONIC_ENCLV,\n    ZYDIS_MNEMONIC_ENCODEKEY128,\n    ZYDIS_MNEMONIC_ENCODEKEY256,\n    ZYDIS_MNEMONIC_ENDBR32,\n    ZYDIS_MNEMONIC_ENDBR64,\n    ZYDIS_MNEMONIC_ENQCMD,\n    ZYDIS_MNEMONIC_ENQCMDS,\n    ZYDIS_MNEMONIC_ENTER,\n    ZYDIS_MNEMONIC_EXTRACTPS,\n    ZYDIS_MNEMONIC_EXTRQ,\n    ZYDIS_MNEMONIC_F2XM1,\n    ZYDIS_MNEMONIC_FABS,\n    ZYDIS_MNEMONIC_FADD,\n    ZYDIS_MNEMONIC_FADDP,\n    ZYDIS_MNEMONIC_FBLD,\n    ZYDIS_MNEMONIC_FBSTP,\n    ZYDIS_MNEMONIC_FCHS,\n    ZYDIS_MNEMONIC_FCMOVB,\n    ZYDIS_MNEMONIC_FCMOVBE,\n    ZYDIS_MNEMONIC_FCMOVE,\n    ZYDIS_MNEMONIC_FCMOVNB,\n    ZYDIS_MNEMONIC_FCMOVNBE,\n    ZYDIS_MNEMONIC_FCMOVNE,\n    ZYDIS_MNEMONIC_FCMOVNU,\n    ZYDIS_MNEMONIC_FCMOVU,\n    ZYDIS_MNEMONIC_FCOM,\n    ZYDIS_MNEMONIC_FCOMI,\n    ZYDIS_MNEMONIC_FCOMIP,\n    ZYDIS_MNEMONIC_FCOMP,\n    ZYDIS_MNEMONIC_FCOMPP,\n    ZYDIS_MNEMONIC_FCOS,\n    ZYDIS_MNEMONIC_FDECSTP,\n    ZYDIS_MNEMONIC_FDISI8087_NOP,\n    ZYDIS_MNEMONIC_FDIV,\n    ZYDIS_MNEMONIC_FDIVP,\n    ZYDIS_MNEMONIC_FDIVR,\n    ZYDIS_MNEMONIC_FDIVRP,\n    ZYDIS_MNEMONIC_FEMMS,\n    ZYDIS_MNEMONIC_FENI8087_NOP,\n    ZYDIS_MNEMONIC_FFREE,\n    ZYDIS_MNEMONIC_FFREEP,\n    ZYDIS_MNEMONIC_FIADD,\n    ZYDIS_MNEMONIC_FICOM,\n    ZYDIS_MNEMONIC_FICOMP,\n    ZYDIS_MNEMONIC_FIDIV,\n    ZYDIS_MNEMONIC_FIDIVR,\n    ZYDIS_MNEMONIC_FILD,\n    ZYDIS_MNEMONIC_FIMUL,\n    ZYDIS_MNEMONIC_FINCSTP,\n    ZYDIS_MNEMONIC_FIST,\n    ZYDIS_MNEMONIC_FISTP,\n    ZYDIS_MNEMONIC_FISTTP,\n    ZYDIS_MNEMONIC_FISUB,\n    ZYDIS_MNEMONIC_FISUBR,\n    ZYDIS_MNEMONIC_FLD,\n    ZYDIS_MNEMONIC_FLD1,\n    ZYDIS_MNEMONIC_FLDCW,\n    ZYDIS_MNEMONIC_FLDENV,\n    ZYDIS_MNEMONIC_FLDL2E,\n    ZYDIS_MNEMONIC_FLDL2T,\n    ZYDIS_MNEMONIC_FLDLG2,\n    ZYDIS_MNEMONIC_FLDLN2,\n    ZYDIS_MNEMONIC_FLDPI,\n    ZYDIS_MNEMONIC_FLDZ,\n    ZYDIS_MNEMONIC_FMUL,\n    ZYDIS_MNEMONIC_FMULP,\n    ZYDIS_MNEMONIC_FNCLEX,\n    ZYDIS_MNEMONIC_FNINIT,\n    ZYDIS_MNEMONIC_FNOP,\n    ZYDIS_MNEMONIC_FNSAVE,\n    ZYDIS_MNEMONIC_FNSTCW,\n    ZYDIS_MNEMONIC_FNSTENV,\n    ZYDIS_MNEMONIC_FNSTSW,\n    ZYDIS_MNEMONIC_FPATAN,\n    ZYDIS_MNEMONIC_FPREM,\n    ZYDIS_MNEMONIC_FPREM1,\n    ZYDIS_MNEMONIC_FPTAN,\n    ZYDIS_MNEMONIC_FRNDINT,\n    ZYDIS_MNEMONIC_FRSTOR,\n    ZYDIS_MNEMONIC_FSCALE,\n    ZYDIS_MNEMONIC_FSETPM287_NOP,\n    ZYDIS_MNEMONIC_FSIN,\n    ZYDIS_MNEMONIC_FSINCOS,\n    ZYDIS_MNEMONIC_FSQRT,\n    ZYDIS_MNEMONIC_FST,\n    ZYDIS_MNEMONIC_FSTP,\n    ZYDIS_MNEMONIC_FSTPNCE,\n    ZYDIS_MNEMONIC_FSUB,\n    ZYDIS_MNEMONIC_FSUBP,\n    ZYDIS_MNEMONIC_FSUBR,\n    ZYDIS_MNEMONIC_FSUBRP,\n    ZYDIS_MNEMONIC_FTST,\n    ZYDIS_MNEMONIC_FUCOM,\n    ZYDIS_MNEMONIC_FUCOMI,\n    ZYDIS_MNEMONIC_FUCOMIP,\n    ZYDIS_MNEMONIC_FUCOMP,\n    ZYDIS_MNEMONIC_FUCOMPP,\n    ZYDIS_MNEMONIC_FWAIT,\n    ZYDIS_MNEMONIC_FXAM,\n    ZYDIS_MNEMONIC_FXCH,\n    ZYDIS_MNEMONIC_FXRSTOR,\n    ZYDIS_MNEMONIC_FXRSTOR64,\n    ZYDIS_MNEMONIC_FXSAVE,\n    ZYDIS_MNEMONIC_FXSAVE64,\n    ZYDIS_MNEMONIC_FXTRACT,\n    ZYDIS_MNEMONIC_FYL2X,\n    ZYDIS_MNEMONIC_FYL2XP1,\n    ZYDIS_MNEMONIC_GETSEC,\n    ZYDIS_MNEMONIC_GF2P8AFFINEINVQB,\n    ZYDIS_MNEMONIC_GF2P8AFFINEQB,\n    ZYDIS_MNEMONIC_GF2P8MULB,\n    ZYDIS_MNEMONIC_HADDPD,\n    ZYDIS_MNEMONIC_HADDPS,\n    ZYDIS_MNEMONIC_HLT,\n    ZYDIS_MNEMONIC_HRESET,\n    ZYDIS_MNEMONIC_HSUBPD,\n    ZYDIS_MNEMONIC_HSUBPS,\n    ZYDIS_MNEMONIC_IDIV,\n    ZYDIS_MNEMONIC_IMUL,\n    ZYDIS_MNEMONIC_IN,\n    ZYDIS_MNEMONIC_INC,\n    ZYDIS_MNEMONIC_INCSSPD,\n    ZYDIS_MNEMONIC_INCSSPQ,\n    ZYDIS_MNEMONIC_INSB,\n    ZYDIS_MNEMONIC_INSD,\n    ZYDIS_MNEMONIC_INSERTPS,\n    ZYDIS_MNEMONIC_INSERTQ,\n    ZYDIS_MNEMONIC_INSW,\n    ZYDIS_MNEMONIC_INT,\n    ZYDIS_MNEMONIC_INT1,\n    ZYDIS_MNEMONIC_INT3,\n    ZYDIS_MNEMONIC_INTO,\n    ZYDIS_MNEMONIC_INVD,\n    ZYDIS_MNEMONIC_INVEPT,\n    ZYDIS_MNEMONIC_INVLPG,\n    ZYDIS_MNEMONIC_INVLPGA,\n    ZYDIS_MNEMONIC_INVLPGB,\n    ZYDIS_MNEMONIC_INVPCID,\n    ZYDIS_MNEMONIC_INVVPID,\n    ZYDIS_MNEMONIC_IRET,\n    ZYDIS_MNEMONIC_IRETD,\n    ZYDIS_MNEMONIC_IRETQ,\n    ZYDIS_MNEMONIC_JB,\n    ZYDIS_MNEMONIC_JBE,\n    ZYDIS_MNEMONIC_JCXZ,\n    ZYDIS_MNEMONIC_JECXZ,\n    ZYDIS_MNEMONIC_JKNZD,\n    ZYDIS_MNEMONIC_JKZD,\n    ZYDIS_MNEMONIC_JL,\n    ZYDIS_MNEMONIC_JLE,\n    ZYDIS_MNEMONIC_JMP,\n    ZYDIS_MNEMONIC_JNB,\n    ZYDIS_MNEMONIC_JNBE,\n    ZYDIS_MNEMONIC_JNL,\n    ZYDIS_MNEMONIC_JNLE,\n    ZYDIS_MNEMONIC_JNO,\n    ZYDIS_MNEMONIC_JNP,\n    ZYDIS_MNEMONIC_JNS,\n    ZYDIS_MNEMONIC_JNZ,\n    ZYDIS_MNEMONIC_JO,\n    ZYDIS_MNEMONIC_JP,\n    ZYDIS_MNEMONIC_JRCXZ,\n    ZYDIS_MNEMONIC_JS,\n    ZYDIS_MNEMONIC_JZ,\n    ZYDIS_MNEMONIC_KADDB,\n    ZYDIS_MNEMONIC_KADDD,\n    ZYDIS_MNEMONIC_KADDQ,\n    ZYDIS_MNEMONIC_KADDW,\n    ZYDIS_MNEMONIC_KAND,\n    ZYDIS_MNEMONIC_KANDB,\n    ZYDIS_MNEMONIC_KANDD,\n    ZYDIS_MNEMONIC_KANDN,\n    ZYDIS_MNEMONIC_KANDNB,\n    ZYDIS_MNEMONIC_KANDND,\n    ZYDIS_MNEMONIC_KANDNQ,\n    ZYDIS_MNEMONIC_KANDNR,\n    ZYDIS_MNEMONIC_KANDNW,\n    ZYDIS_MNEMONIC_KANDQ,\n    ZYDIS_MNEMONIC_KANDW,\n    ZYDIS_MNEMONIC_KCONCATH,\n    ZYDIS_MNEMONIC_KCONCATL,\n    ZYDIS_MNEMONIC_KEXTRACT,\n    ZYDIS_MNEMONIC_KMERGE2L1H,\n    ZYDIS_MNEMONIC_KMERGE2L1L,\n    ZYDIS_MNEMONIC_KMOV,\n    ZYDIS_MNEMONIC_KMOVB,\n    ZYDIS_MNEMONIC_KMOVD,\n    ZYDIS_MNEMONIC_KMOVQ,\n    ZYDIS_MNEMONIC_KMOVW,\n    ZYDIS_MNEMONIC_KNOT,\n    ZYDIS_MNEMONIC_KNOTB,\n    ZYDIS_MNEMONIC_KNOTD,\n    ZYDIS_MNEMONIC_KNOTQ,\n    ZYDIS_MNEMONIC_KNOTW,\n    ZYDIS_MNEMONIC_KOR,\n    ZYDIS_MNEMONIC_KORB,\n    ZYDIS_MNEMONIC_KORD,\n    ZYDIS_MNEMONIC_KORQ,\n    ZYDIS_MNEMONIC_KORTEST,\n    ZYDIS_MNEMONIC_KORTESTB,\n    ZYDIS_MNEMONIC_KORTESTD,\n    ZYDIS_MNEMONIC_KORTESTQ,\n    ZYDIS_MNEMONIC_KORTESTW,\n    ZYDIS_MNEMONIC_KORW,\n    ZYDIS_MNEMONIC_KSHIFTLB,\n    ZYDIS_MNEMONIC_KSHIFTLD,\n    ZYDIS_MNEMONIC_KSHIFTLQ,\n    ZYDIS_MNEMONIC_KSHIFTLW,\n    ZYDIS_MNEMONIC_KSHIFTRB,\n    ZYDIS_MNEMONIC_KSHIFTRD,\n    ZYDIS_MNEMONIC_KSHIFTRQ,\n    ZYDIS_MNEMONIC_KSHIFTRW,\n    ZYDIS_MNEMONIC_KTESTB,\n    ZYDIS_MNEMONIC_KTESTD,\n    ZYDIS_MNEMONIC_KTESTQ,\n    ZYDIS_MNEMONIC_KTESTW,\n    ZYDIS_MNEMONIC_KUNPCKBW,\n    ZYDIS_MNEMONIC_KUNPCKDQ,\n    ZYDIS_MNEMONIC_KUNPCKWD,\n    ZYDIS_MNEMONIC_KXNOR,\n    ZYDIS_MNEMONIC_KXNORB,\n    ZYDIS_MNEMONIC_KXNORD,\n    ZYDIS_MNEMONIC_KXNORQ,\n    ZYDIS_MNEMONIC_KXNORW,\n    ZYDIS_MNEMONIC_KXOR,\n    ZYDIS_MNEMONIC_KXORB,\n    ZYDIS_MNEMONIC_KXORD,\n    ZYDIS_MNEMONIC_KXORQ,\n    ZYDIS_MNEMONIC_KXORW,\n    ZYDIS_MNEMONIC_LAHF,\n    ZYDIS_MNEMONIC_LAR,\n    ZYDIS_MNEMONIC_LDDQU,\n    ZYDIS_MNEMONIC_LDMXCSR,\n    ZYDIS_MNEMONIC_LDS,\n    ZYDIS_MNEMONIC_LDTILECFG,\n    ZYDIS_MNEMONIC_LEA,\n    ZYDIS_MNEMONIC_LEAVE,\n    ZYDIS_MNEMONIC_LES,\n    ZYDIS_MNEMONIC_LFENCE,\n    ZYDIS_MNEMONIC_LFS,\n    ZYDIS_MNEMONIC_LGDT,\n    ZYDIS_MNEMONIC_LGS,\n    ZYDIS_MNEMONIC_LIDT,\n    ZYDIS_MNEMONIC_LLDT,\n    ZYDIS_MNEMONIC_LLWPCB,\n    ZYDIS_MNEMONIC_LMSW,\n    ZYDIS_MNEMONIC_LOADIWKEY,\n    ZYDIS_MNEMONIC_LODSB,\n    ZYDIS_MNEMONIC_LODSD,\n    ZYDIS_MNEMONIC_LODSQ,\n    ZYDIS_MNEMONIC_LODSW,\n    ZYDIS_MNEMONIC_LOOP,\n    ZYDIS_MNEMONIC_LOOPE,\n    ZYDIS_MNEMONIC_LOOPNE,\n    ZYDIS_MNEMONIC_LSL,\n    ZYDIS_MNEMONIC_LSS,\n    ZYDIS_MNEMONIC_LTR,\n    ZYDIS_MNEMONIC_LWPINS,\n    ZYDIS_MNEMONIC_LWPVAL,\n    ZYDIS_MNEMONIC_LZCNT,\n    ZYDIS_MNEMONIC_MASKMOVDQU,\n    ZYDIS_MNEMONIC_MASKMOVQ,\n    ZYDIS_MNEMONIC_MAXPD,\n    ZYDIS_MNEMONIC_MAXPS,\n    ZYDIS_MNEMONIC_MAXSD,\n    ZYDIS_MNEMONIC_MAXSS,\n    ZYDIS_MNEMONIC_MCOMMIT,\n    ZYDIS_MNEMONIC_MFENCE,\n    ZYDIS_MNEMONIC_MINPD,\n    ZYDIS_MNEMONIC_MINPS,\n    ZYDIS_MNEMONIC_MINSD,\n    ZYDIS_MNEMONIC_MINSS,\n    ZYDIS_MNEMONIC_MONITOR,\n    ZYDIS_MNEMONIC_MONITORX,\n    ZYDIS_MNEMONIC_MONTMUL,\n    ZYDIS_MNEMONIC_MOV,\n    ZYDIS_MNEMONIC_MOVAPD,\n    ZYDIS_MNEMONIC_MOVAPS,\n    ZYDIS_MNEMONIC_MOVBE,\n    ZYDIS_MNEMONIC_MOVD,\n    ZYDIS_MNEMONIC_MOVDDUP,\n    ZYDIS_MNEMONIC_MOVDIR64B,\n    ZYDIS_MNEMONIC_MOVDIRI,\n    ZYDIS_MNEMONIC_MOVDQ2Q,\n    ZYDIS_MNEMONIC_MOVDQA,\n    ZYDIS_MNEMONIC_MOVDQU,\n    ZYDIS_MNEMONIC_MOVHLPS,\n    ZYDIS_MNEMONIC_MOVHPD,\n    ZYDIS_MNEMONIC_MOVHPS,\n    ZYDIS_MNEMONIC_MOVLHPS,\n    ZYDIS_MNEMONIC_MOVLPD,\n    ZYDIS_MNEMONIC_MOVLPS,\n    ZYDIS_MNEMONIC_MOVMSKPD,\n    ZYDIS_MNEMONIC_MOVMSKPS,\n    ZYDIS_MNEMONIC_MOVNTDQ,\n    ZYDIS_MNEMONIC_MOVNTDQA,\n    ZYDIS_MNEMONIC_MOVNTI,\n    ZYDIS_MNEMONIC_MOVNTPD,\n    ZYDIS_MNEMONIC_MOVNTPS,\n    ZYDIS_MNEMONIC_MOVNTQ,\n    ZYDIS_MNEMONIC_MOVNTSD,\n    ZYDIS_MNEMONIC_MOVNTSS,\n    ZYDIS_MNEMONIC_MOVQ,\n    ZYDIS_MNEMONIC_MOVQ2DQ,\n    ZYDIS_MNEMONIC_MOVSB,\n    ZYDIS_MNEMONIC_MOVSD,\n    ZYDIS_MNEMONIC_MOVSHDUP,\n    ZYDIS_MNEMONIC_MOVSLDUP,\n    ZYDIS_MNEMONIC_MOVSQ,\n    ZYDIS_MNEMONIC_MOVSS,\n    ZYDIS_MNEMONIC_MOVSW,\n    ZYDIS_MNEMONIC_MOVSX,\n    ZYDIS_MNEMONIC_MOVSXD,\n    ZYDIS_MNEMONIC_MOVUPD,\n    ZYDIS_MNEMONIC_MOVUPS,\n    ZYDIS_MNEMONIC_MOVZX,\n    ZYDIS_MNEMONIC_MPSADBW,\n    ZYDIS_MNEMONIC_MUL,\n    ZYDIS_MNEMONIC_MULPD,\n    ZYDIS_MNEMONIC_MULPS,\n    ZYDIS_MNEMONIC_MULSD,\n    ZYDIS_MNEMONIC_MULSS,\n    ZYDIS_MNEMONIC_MULX,\n    ZYDIS_MNEMONIC_MWAIT,\n    ZYDIS_MNEMONIC_MWAITX,\n    ZYDIS_MNEMONIC_NEG,\n    ZYDIS_MNEMONIC_NOP,\n    ZYDIS_MNEMONIC_NOT,\n    ZYDIS_MNEMONIC_OR,\n    ZYDIS_MNEMONIC_ORPD,\n    ZYDIS_MNEMONIC_ORPS,\n    ZYDIS_MNEMONIC_OUT,\n    ZYDIS_MNEMONIC_OUTSB,\n    ZYDIS_MNEMONIC_OUTSD,\n    ZYDIS_MNEMONIC_OUTSW,\n    ZYDIS_MNEMONIC_PABSB,\n    ZYDIS_MNEMONIC_PABSD,\n    ZYDIS_MNEMONIC_PABSW,\n    ZYDIS_MNEMONIC_PACKSSDW,\n    ZYDIS_MNEMONIC_PACKSSWB,\n    ZYDIS_MNEMONIC_PACKUSDW,\n    ZYDIS_MNEMONIC_PACKUSWB,\n    ZYDIS_MNEMONIC_PADDB,\n    ZYDIS_MNEMONIC_PADDD,\n    ZYDIS_MNEMONIC_PADDQ,\n    ZYDIS_MNEMONIC_PADDSB,\n    ZYDIS_MNEMONIC_PADDSW,\n    ZYDIS_MNEMONIC_PADDUSB,\n    ZYDIS_MNEMONIC_PADDUSW,\n    ZYDIS_MNEMONIC_PADDW,\n    ZYDIS_MNEMONIC_PALIGNR,\n    ZYDIS_MNEMONIC_PAND,\n    ZYDIS_MNEMONIC_PANDN,\n    ZYDIS_MNEMONIC_PAUSE,\n    ZYDIS_MNEMONIC_PAVGB,\n    ZYDIS_MNEMONIC_PAVGUSB,\n    ZYDIS_MNEMONIC_PAVGW,\n    ZYDIS_MNEMONIC_PBLENDVB,\n    ZYDIS_MNEMONIC_PBLENDW,\n    ZYDIS_MNEMONIC_PBNDKB,\n    ZYDIS_MNEMONIC_PCLMULQDQ,\n    ZYDIS_MNEMONIC_PCMPEQB,\n    ZYDIS_MNEMONIC_PCMPEQD,\n    ZYDIS_MNEMONIC_PCMPEQQ,\n    ZYDIS_MNEMONIC_PCMPEQW,\n    ZYDIS_MNEMONIC_PCMPESTRI,\n    ZYDIS_MNEMONIC_PCMPESTRM,\n    ZYDIS_MNEMONIC_PCMPGTB,\n    ZYDIS_MNEMONIC_PCMPGTD,\n    ZYDIS_MNEMONIC_PCMPGTQ,\n    ZYDIS_MNEMONIC_PCMPGTW,\n    ZYDIS_MNEMONIC_PCMPISTRI,\n    ZYDIS_MNEMONIC_PCMPISTRM,\n    ZYDIS_MNEMONIC_PCOMMIT,\n    ZYDIS_MNEMONIC_PCONFIG,\n    ZYDIS_MNEMONIC_PDEP,\n    ZYDIS_MNEMONIC_PEXT,\n    ZYDIS_MNEMONIC_PEXTRB,\n    ZYDIS_MNEMONIC_PEXTRD,\n    ZYDIS_MNEMONIC_PEXTRQ,\n    ZYDIS_MNEMONIC_PEXTRW,\n    ZYDIS_MNEMONIC_PF2ID,\n    ZYDIS_MNEMONIC_PF2IW,\n    ZYDIS_MNEMONIC_PFACC,\n    ZYDIS_MNEMONIC_PFADD,\n    ZYDIS_MNEMONIC_PFCMPEQ,\n    ZYDIS_MNEMONIC_PFCMPGE,\n    ZYDIS_MNEMONIC_PFCMPGT,\n    ZYDIS_MNEMONIC_PFCPIT1,\n    ZYDIS_MNEMONIC_PFMAX,\n    ZYDIS_MNEMONIC_PFMIN,\n    ZYDIS_MNEMONIC_PFMUL,\n    ZYDIS_MNEMONIC_PFNACC,\n    ZYDIS_MNEMONIC_PFPNACC,\n    ZYDIS_MNEMONIC_PFRCP,\n    ZYDIS_MNEMONIC_PFRCPIT2,\n    ZYDIS_MNEMONIC_PFRSQIT1,\n    ZYDIS_MNEMONIC_PFSQRT,\n    ZYDIS_MNEMONIC_PFSUB,\n    ZYDIS_MNEMONIC_PFSUBR,\n    ZYDIS_MNEMONIC_PHADDD,\n    ZYDIS_MNEMONIC_PHADDSW,\n    ZYDIS_MNEMONIC_PHADDW,\n    ZYDIS_MNEMONIC_PHMINPOSUW,\n    ZYDIS_MNEMONIC_PHSUBD,\n    ZYDIS_MNEMONIC_PHSUBSW,\n    ZYDIS_MNEMONIC_PHSUBW,\n    ZYDIS_MNEMONIC_PI2FD,\n    ZYDIS_MNEMONIC_PI2FW,\n    ZYDIS_MNEMONIC_PINSRB,\n    ZYDIS_MNEMONIC_PINSRD,\n    ZYDIS_MNEMONIC_PINSRQ,\n    ZYDIS_MNEMONIC_PINSRW,\n    ZYDIS_MNEMONIC_PMADDUBSW,\n    ZYDIS_MNEMONIC_PMADDWD,\n    ZYDIS_MNEMONIC_PMAXSB,\n    ZYDIS_MNEMONIC_PMAXSD,\n    ZYDIS_MNEMONIC_PMAXSW,\n    ZYDIS_MNEMONIC_PMAXUB,\n    ZYDIS_MNEMONIC_PMAXUD,\n    ZYDIS_MNEMONIC_PMAXUW,\n    ZYDIS_MNEMONIC_PMINSB,\n    ZYDIS_MNEMONIC_PMINSD,\n    ZYDIS_MNEMONIC_PMINSW,\n    ZYDIS_MNEMONIC_PMINUB,\n    ZYDIS_MNEMONIC_PMINUD,\n    ZYDIS_MNEMONIC_PMINUW,\n    ZYDIS_MNEMONIC_PMOVMSKB,\n    ZYDIS_MNEMONIC_PMOVSXBD,\n    ZYDIS_MNEMONIC_PMOVSXBQ,\n    ZYDIS_MNEMONIC_PMOVSXBW,\n    ZYDIS_MNEMONIC_PMOVSXDQ,\n    ZYDIS_MNEMONIC_PMOVSXWD,\n    ZYDIS_MNEMONIC_PMOVSXWQ,\n    ZYDIS_MNEMONIC_PMOVZXBD,\n    ZYDIS_MNEMONIC_PMOVZXBQ,\n    ZYDIS_MNEMONIC_PMOVZXBW,\n    ZYDIS_MNEMONIC_PMOVZXDQ,\n    ZYDIS_MNEMONIC_PMOVZXWD,\n    ZYDIS_MNEMONIC_PMOVZXWQ,\n    ZYDIS_MNEMONIC_PMULDQ,\n    ZYDIS_MNEMONIC_PMULHRSW,\n    ZYDIS_MNEMONIC_PMULHRW,\n    ZYDIS_MNEMONIC_PMULHUW,\n    ZYDIS_MNEMONIC_PMULHW,\n    ZYDIS_MNEMONIC_PMULLD,\n    ZYDIS_MNEMONIC_PMULLW,\n    ZYDIS_MNEMONIC_PMULUDQ,\n    ZYDIS_MNEMONIC_POP,\n    ZYDIS_MNEMONIC_POPA,\n    ZYDIS_MNEMONIC_POPAD,\n    ZYDIS_MNEMONIC_POPCNT,\n    ZYDIS_MNEMONIC_POPF,\n    ZYDIS_MNEMONIC_POPFD,\n    ZYDIS_MNEMONIC_POPFQ,\n    ZYDIS_MNEMONIC_POR,\n    ZYDIS_MNEMONIC_PREFETCH,\n    ZYDIS_MNEMONIC_PREFETCHIT0,\n    ZYDIS_MNEMONIC_PREFETCHIT1,\n    ZYDIS_MNEMONIC_PREFETCHNTA,\n    ZYDIS_MNEMONIC_PREFETCHT0,\n    ZYDIS_MNEMONIC_PREFETCHT1,\n    ZYDIS_MNEMONIC_PREFETCHT2,\n    ZYDIS_MNEMONIC_PREFETCHW,\n    ZYDIS_MNEMONIC_PREFETCHWT1,\n    ZYDIS_MNEMONIC_PSADBW,\n    ZYDIS_MNEMONIC_PSHUFB,\n    ZYDIS_MNEMONIC_PSHUFD,\n    ZYDIS_MNEMONIC_PSHUFHW,\n    ZYDIS_MNEMONIC_PSHUFLW,\n    ZYDIS_MNEMONIC_PSHUFW,\n    ZYDIS_MNEMONIC_PSIGNB,\n    ZYDIS_MNEMONIC_PSIGND,\n    ZYDIS_MNEMONIC_PSIGNW,\n    ZYDIS_MNEMONIC_PSLLD,\n    ZYDIS_MNEMONIC_PSLLDQ,\n    ZYDIS_MNEMONIC_PSLLQ,\n    ZYDIS_MNEMONIC_PSLLW,\n    ZYDIS_MNEMONIC_PSMASH,\n    ZYDIS_MNEMONIC_PSRAD,\n    ZYDIS_MNEMONIC_PSRAW,\n    ZYDIS_MNEMONIC_PSRLD,\n    ZYDIS_MNEMONIC_PSRLDQ,\n    ZYDIS_MNEMONIC_PSRLQ,\n    ZYDIS_MNEMONIC_PSRLW,\n    ZYDIS_MNEMONIC_PSUBB,\n    ZYDIS_MNEMONIC_PSUBD,\n    ZYDIS_MNEMONIC_PSUBQ,\n    ZYDIS_MNEMONIC_PSUBSB,\n    ZYDIS_MNEMONIC_PSUBSW,\n    ZYDIS_MNEMONIC_PSUBUSB,\n    ZYDIS_MNEMONIC_PSUBUSW,\n    ZYDIS_MNEMONIC_PSUBW,\n    ZYDIS_MNEMONIC_PSWAPD,\n    ZYDIS_MNEMONIC_PTEST,\n    ZYDIS_MNEMONIC_PTWRITE,\n    ZYDIS_MNEMONIC_PUNPCKHBW,\n    ZYDIS_MNEMONIC_PUNPCKHDQ,\n    ZYDIS_MNEMONIC_PUNPCKHQDQ,\n    ZYDIS_MNEMONIC_PUNPCKHWD,\n    ZYDIS_MNEMONIC_PUNPCKLBW,\n    ZYDIS_MNEMONIC_PUNPCKLDQ,\n    ZYDIS_MNEMONIC_PUNPCKLQDQ,\n    ZYDIS_MNEMONIC_PUNPCKLWD,\n    ZYDIS_MNEMONIC_PUSH,\n    ZYDIS_MNEMONIC_PUSHA,\n    ZYDIS_MNEMONIC_PUSHAD,\n    ZYDIS_MNEMONIC_PUSHF,\n    ZYDIS_MNEMONIC_PUSHFD,\n    ZYDIS_MNEMONIC_PUSHFQ,\n    ZYDIS_MNEMONIC_PVALIDATE,\n    ZYDIS_MNEMONIC_PXOR,\n    ZYDIS_MNEMONIC_RCL,\n    ZYDIS_MNEMONIC_RCPPS,\n    ZYDIS_MNEMONIC_RCPSS,\n    ZYDIS_MNEMONIC_RCR,\n    ZYDIS_MNEMONIC_RDFSBASE,\n    ZYDIS_MNEMONIC_RDGSBASE,\n    ZYDIS_MNEMONIC_RDMSR,\n    ZYDIS_MNEMONIC_RDMSRLIST,\n    ZYDIS_MNEMONIC_RDPID,\n    ZYDIS_MNEMONIC_RDPKRU,\n    ZYDIS_MNEMONIC_RDPMC,\n    ZYDIS_MNEMONIC_RDPRU,\n    ZYDIS_MNEMONIC_RDRAND,\n    ZYDIS_MNEMONIC_RDSEED,\n    ZYDIS_MNEMONIC_RDSSPD,\n    ZYDIS_MNEMONIC_RDSSPQ,\n    ZYDIS_MNEMONIC_RDTSC,\n    ZYDIS_MNEMONIC_RDTSCP,\n    ZYDIS_MNEMONIC_RET,\n    ZYDIS_MNEMONIC_RMPADJUST,\n    ZYDIS_MNEMONIC_RMPUPDATE,\n    ZYDIS_MNEMONIC_ROL,\n    ZYDIS_MNEMONIC_ROR,\n    ZYDIS_MNEMONIC_RORX,\n    ZYDIS_MNEMONIC_ROUNDPD,\n    ZYDIS_MNEMONIC_ROUNDPS,\n    ZYDIS_MNEMONIC_ROUNDSD,\n    ZYDIS_MNEMONIC_ROUNDSS,\n    ZYDIS_MNEMONIC_RSM,\n    ZYDIS_MNEMONIC_RSQRTPS,\n    ZYDIS_MNEMONIC_RSQRTSS,\n    ZYDIS_MNEMONIC_RSTORSSP,\n    ZYDIS_MNEMONIC_SAHF,\n    ZYDIS_MNEMONIC_SALC,\n    ZYDIS_MNEMONIC_SAR,\n    ZYDIS_MNEMONIC_SARX,\n    ZYDIS_MNEMONIC_SAVEPREVSSP,\n    ZYDIS_MNEMONIC_SBB,\n    ZYDIS_MNEMONIC_SCASB,\n    ZYDIS_MNEMONIC_SCASD,\n    ZYDIS_MNEMONIC_SCASQ,\n    ZYDIS_MNEMONIC_SCASW,\n    ZYDIS_MNEMONIC_SEAMCALL,\n    ZYDIS_MNEMONIC_SEAMOPS,\n    ZYDIS_MNEMONIC_SEAMRET,\n    ZYDIS_MNEMONIC_SENDUIPI,\n    ZYDIS_MNEMONIC_SERIALIZE,\n    ZYDIS_MNEMONIC_SETB,\n    ZYDIS_MNEMONIC_SETBE,\n    ZYDIS_MNEMONIC_SETL,\n    ZYDIS_MNEMONIC_SETLE,\n    ZYDIS_MNEMONIC_SETNB,\n    ZYDIS_MNEMONIC_SETNBE,\n    ZYDIS_MNEMONIC_SETNL,\n    ZYDIS_MNEMONIC_SETNLE,\n    ZYDIS_MNEMONIC_SETNO,\n    ZYDIS_MNEMONIC_SETNP,\n    ZYDIS_MNEMONIC_SETNS,\n    ZYDIS_MNEMONIC_SETNZ,\n    ZYDIS_MNEMONIC_SETO,\n    ZYDIS_MNEMONIC_SETP,\n    ZYDIS_MNEMONIC_SETS,\n    ZYDIS_MNEMONIC_SETSSBSY,\n    ZYDIS_MNEMONIC_SETZ,\n    ZYDIS_MNEMONIC_SFENCE,\n    ZYDIS_MNEMONIC_SGDT,\n    ZYDIS_MNEMONIC_SHA1MSG1,\n    ZYDIS_MNEMONIC_SHA1MSG2,\n    ZYDIS_MNEMONIC_SHA1NEXTE,\n    ZYDIS_MNEMONIC_SHA1RNDS4,\n    ZYDIS_MNEMONIC_SHA256MSG1,\n    ZYDIS_MNEMONIC_SHA256MSG2,\n    ZYDIS_MNEMONIC_SHA256RNDS2,\n    ZYDIS_MNEMONIC_SHL,\n    ZYDIS_MNEMONIC_SHLD,\n    ZYDIS_MNEMONIC_SHLX,\n    ZYDIS_MNEMONIC_SHR,\n    ZYDIS_MNEMONIC_SHRD,\n    ZYDIS_MNEMONIC_SHRX,\n    ZYDIS_MNEMONIC_SHUFPD,\n    ZYDIS_MNEMONIC_SHUFPS,\n    ZYDIS_MNEMONIC_SIDT,\n    ZYDIS_MNEMONIC_SKINIT,\n    ZYDIS_MNEMONIC_SLDT,\n    ZYDIS_MNEMONIC_SLWPCB,\n    ZYDIS_MNEMONIC_SMSW,\n    ZYDIS_MNEMONIC_SPFLT,\n    ZYDIS_MNEMONIC_SQRTPD,\n    ZYDIS_MNEMONIC_SQRTPS,\n    ZYDIS_MNEMONIC_SQRTSD,\n    ZYDIS_MNEMONIC_SQRTSS,\n    ZYDIS_MNEMONIC_STAC,\n    ZYDIS_MNEMONIC_STC,\n    ZYDIS_MNEMONIC_STD,\n    ZYDIS_MNEMONIC_STGI,\n    ZYDIS_MNEMONIC_STI,\n    ZYDIS_MNEMONIC_STMXCSR,\n    ZYDIS_MNEMONIC_STOSB,\n    ZYDIS_MNEMONIC_STOSD,\n    ZYDIS_MNEMONIC_STOSQ,\n    ZYDIS_MNEMONIC_STOSW,\n    ZYDIS_MNEMONIC_STR,\n    ZYDIS_MNEMONIC_STTILECFG,\n    ZYDIS_MNEMONIC_STUI,\n    ZYDIS_MNEMONIC_SUB,\n    ZYDIS_MNEMONIC_SUBPD,\n    ZYDIS_MNEMONIC_SUBPS,\n    ZYDIS_MNEMONIC_SUBSD,\n    ZYDIS_MNEMONIC_SUBSS,\n    ZYDIS_MNEMONIC_SWAPGS,\n    ZYDIS_MNEMONIC_SYSCALL,\n    ZYDIS_MNEMONIC_SYSENTER,\n    ZYDIS_MNEMONIC_SYSEXIT,\n    ZYDIS_MNEMONIC_SYSRET,\n    ZYDIS_MNEMONIC_T1MSKC,\n    ZYDIS_MNEMONIC_TDCALL,\n    ZYDIS_MNEMONIC_TDPBF16PS,\n    ZYDIS_MNEMONIC_TDPBSSD,\n    ZYDIS_MNEMONIC_TDPBSUD,\n    ZYDIS_MNEMONIC_TDPBUSD,\n    ZYDIS_MNEMONIC_TDPBUUD,\n    ZYDIS_MNEMONIC_TDPFP16PS,\n    ZYDIS_MNEMONIC_TEST,\n    ZYDIS_MNEMONIC_TESTUI,\n    ZYDIS_MNEMONIC_TILELOADD,\n    ZYDIS_MNEMONIC_TILELOADDT1,\n    ZYDIS_MNEMONIC_TILERELEASE,\n    ZYDIS_MNEMONIC_TILESTORED,\n    ZYDIS_MNEMONIC_TILEZERO,\n    ZYDIS_MNEMONIC_TLBSYNC,\n    ZYDIS_MNEMONIC_TPAUSE,\n    ZYDIS_MNEMONIC_TZCNT,\n    ZYDIS_MNEMONIC_TZCNTI,\n    ZYDIS_MNEMONIC_TZMSK,\n    ZYDIS_MNEMONIC_UCOMISD,\n    ZYDIS_MNEMONIC_UCOMISS,\n    ZYDIS_MNEMONIC_UD0,\n    ZYDIS_MNEMONIC_UD1,\n    ZYDIS_MNEMONIC_UD2,\n    ZYDIS_MNEMONIC_UIRET,\n    ZYDIS_MNEMONIC_UMONITOR,\n    ZYDIS_MNEMONIC_UMWAIT,\n    ZYDIS_MNEMONIC_UNPCKHPD,\n    ZYDIS_MNEMONIC_UNPCKHPS,\n    ZYDIS_MNEMONIC_UNPCKLPD,\n    ZYDIS_MNEMONIC_UNPCKLPS,\n    ZYDIS_MNEMONIC_V4FMADDPS,\n    ZYDIS_MNEMONIC_V4FMADDSS,\n    ZYDIS_MNEMONIC_V4FNMADDPS,\n    ZYDIS_MNEMONIC_V4FNMADDSS,\n    ZYDIS_MNEMONIC_VADDNPD,\n    ZYDIS_MNEMONIC_VADDNPS,\n    ZYDIS_MNEMONIC_VADDPD,\n    ZYDIS_MNEMONIC_VADDPH,\n    ZYDIS_MNEMONIC_VADDPS,\n    ZYDIS_MNEMONIC_VADDSD,\n    ZYDIS_MNEMONIC_VADDSETSPS,\n    ZYDIS_MNEMONIC_VADDSH,\n    ZYDIS_MNEMONIC_VADDSS,\n    ZYDIS_MNEMONIC_VADDSUBPD,\n    ZYDIS_MNEMONIC_VADDSUBPS,\n    ZYDIS_MNEMONIC_VAESDEC,\n    ZYDIS_MNEMONIC_VAESDECLAST,\n    ZYDIS_MNEMONIC_VAESENC,\n    ZYDIS_MNEMONIC_VAESENCLAST,\n    ZYDIS_MNEMONIC_VAESIMC,\n    ZYDIS_MNEMONIC_VAESKEYGENASSIST,\n    ZYDIS_MNEMONIC_VALIGND,\n    ZYDIS_MNEMONIC_VALIGNQ,\n    ZYDIS_MNEMONIC_VANDNPD,\n    ZYDIS_MNEMONIC_VANDNPS,\n    ZYDIS_MNEMONIC_VANDPD,\n    ZYDIS_MNEMONIC_VANDPS,\n    ZYDIS_MNEMONIC_VBCSTNEBF162PS,\n    ZYDIS_MNEMONIC_VBCSTNESH2PS,\n    ZYDIS_MNEMONIC_VBLENDMPD,\n    ZYDIS_MNEMONIC_VBLENDMPS,\n    ZYDIS_MNEMONIC_VBLENDPD,\n    ZYDIS_MNEMONIC_VBLENDPS,\n    ZYDIS_MNEMONIC_VBLENDVPD,\n    ZYDIS_MNEMONIC_VBLENDVPS,\n    ZYDIS_MNEMONIC_VBROADCASTF128,\n    ZYDIS_MNEMONIC_VBROADCASTF32X2,\n    ZYDIS_MNEMONIC_VBROADCASTF32X4,\n    ZYDIS_MNEMONIC_VBROADCASTF32X8,\n    ZYDIS_MNEMONIC_VBROADCASTF64X2,\n    ZYDIS_MNEMONIC_VBROADCASTF64X4,\n    ZYDIS_MNEMONIC_VBROADCASTI128,\n    ZYDIS_MNEMONIC_VBROADCASTI32X2,\n    ZYDIS_MNEMONIC_VBROADCASTI32X4,\n    ZYDIS_MNEMONIC_VBROADCASTI32X8,\n    ZYDIS_MNEMONIC_VBROADCASTI64X2,\n    ZYDIS_MNEMONIC_VBROADCASTI64X4,\n    ZYDIS_MNEMONIC_VBROADCASTSD,\n    ZYDIS_MNEMONIC_VBROADCASTSS,\n    ZYDIS_MNEMONIC_VCMPPD,\n    ZYDIS_MNEMONIC_VCMPPH,\n    ZYDIS_MNEMONIC_VCMPPS,\n    ZYDIS_MNEMONIC_VCMPSD,\n    ZYDIS_MNEMONIC_VCMPSH,\n    ZYDIS_MNEMONIC_VCMPSS,\n    ZYDIS_MNEMONIC_VCOMISD,\n    ZYDIS_MNEMONIC_VCOMISH,\n    ZYDIS_MNEMONIC_VCOMISS,\n    ZYDIS_MNEMONIC_VCOMPRESSPD,\n    ZYDIS_MNEMONIC_VCOMPRESSPS,\n    ZYDIS_MNEMONIC_VCVTDQ2PD,\n    ZYDIS_MNEMONIC_VCVTDQ2PH,\n    ZYDIS_MNEMONIC_VCVTDQ2PS,\n    ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS,\n    ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ,\n    ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ,\n    ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ,\n    ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ,\n    ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS,\n    ZYDIS_MNEMONIC_VCVTNE2PS2BF16,\n    ZYDIS_MNEMONIC_VCVTNEEBF162PS,\n    ZYDIS_MNEMONIC_VCVTNEEPH2PS,\n    ZYDIS_MNEMONIC_VCVTNEOBF162PS,\n    ZYDIS_MNEMONIC_VCVTNEOPH2PS,\n    ZYDIS_MNEMONIC_VCVTNEPS2BF16,\n    ZYDIS_MNEMONIC_VCVTPD2DQ,\n    ZYDIS_MNEMONIC_VCVTPD2PH,\n    ZYDIS_MNEMONIC_VCVTPD2PS,\n    ZYDIS_MNEMONIC_VCVTPD2QQ,\n    ZYDIS_MNEMONIC_VCVTPD2UDQ,\n    ZYDIS_MNEMONIC_VCVTPD2UQQ,\n    ZYDIS_MNEMONIC_VCVTPH2DQ,\n    ZYDIS_MNEMONIC_VCVTPH2PD,\n    ZYDIS_MNEMONIC_VCVTPH2PS,\n    ZYDIS_MNEMONIC_VCVTPH2PSX,\n    ZYDIS_MNEMONIC_VCVTPH2QQ,\n    ZYDIS_MNEMONIC_VCVTPH2UDQ,\n    ZYDIS_MNEMONIC_VCVTPH2UQQ,\n    ZYDIS_MNEMONIC_VCVTPH2UW,\n    ZYDIS_MNEMONIC_VCVTPH2W,\n    ZYDIS_MNEMONIC_VCVTPS2DQ,\n    ZYDIS_MNEMONIC_VCVTPS2PD,\n    ZYDIS_MNEMONIC_VCVTPS2PH,\n    ZYDIS_MNEMONIC_VCVTPS2PHX,\n    ZYDIS_MNEMONIC_VCVTPS2QQ,\n    ZYDIS_MNEMONIC_VCVTPS2UDQ,\n    ZYDIS_MNEMONIC_VCVTPS2UQQ,\n    ZYDIS_MNEMONIC_VCVTQQ2PD,\n    ZYDIS_MNEMONIC_VCVTQQ2PH,\n    ZYDIS_MNEMONIC_VCVTQQ2PS,\n    ZYDIS_MNEMONIC_VCVTSD2SH,\n    ZYDIS_MNEMONIC_VCVTSD2SI,\n    ZYDIS_MNEMONIC_VCVTSD2SS,\n    ZYDIS_MNEMONIC_VCVTSD2USI,\n    ZYDIS_MNEMONIC_VCVTSH2SD,\n    ZYDIS_MNEMONIC_VCVTSH2SI,\n    ZYDIS_MNEMONIC_VCVTSH2SS,\n    ZYDIS_MNEMONIC_VCVTSH2USI,\n    ZYDIS_MNEMONIC_VCVTSI2SD,\n    ZYDIS_MNEMONIC_VCVTSI2SH,\n    ZYDIS_MNEMONIC_VCVTSI2SS,\n    ZYDIS_MNEMONIC_VCVTSS2SD,\n    ZYDIS_MNEMONIC_VCVTSS2SH,\n    ZYDIS_MNEMONIC_VCVTSS2SI,\n    ZYDIS_MNEMONIC_VCVTSS2USI,\n    ZYDIS_MNEMONIC_VCVTTPD2DQ,\n    ZYDIS_MNEMONIC_VCVTTPD2QQ,\n    ZYDIS_MNEMONIC_VCVTTPD2UDQ,\n    ZYDIS_MNEMONIC_VCVTTPD2UQQ,\n    ZYDIS_MNEMONIC_VCVTTPH2DQ,\n    ZYDIS_MNEMONIC_VCVTTPH2QQ,\n    ZYDIS_MNEMONIC_VCVTTPH2UDQ,\n    ZYDIS_MNEMONIC_VCVTTPH2UQQ,\n    ZYDIS_MNEMONIC_VCVTTPH2UW,\n    ZYDIS_MNEMONIC_VCVTTPH2W,\n    ZYDIS_MNEMONIC_VCVTTPS2DQ,\n    ZYDIS_MNEMONIC_VCVTTPS2QQ,\n    ZYDIS_MNEMONIC_VCVTTPS2UDQ,\n    ZYDIS_MNEMONIC_VCVTTPS2UQQ,\n    ZYDIS_MNEMONIC_VCVTTSD2SI,\n    ZYDIS_MNEMONIC_VCVTTSD2USI,\n    ZYDIS_MNEMONIC_VCVTTSH2SI,\n    ZYDIS_MNEMONIC_VCVTTSH2USI,\n    ZYDIS_MNEMONIC_VCVTTSS2SI,\n    ZYDIS_MNEMONIC_VCVTTSS2USI,\n    ZYDIS_MNEMONIC_VCVTUDQ2PD,\n    ZYDIS_MNEMONIC_VCVTUDQ2PH,\n    ZYDIS_MNEMONIC_VCVTUDQ2PS,\n    ZYDIS_MNEMONIC_VCVTUQQ2PD,\n    ZYDIS_MNEMONIC_VCVTUQQ2PH,\n    ZYDIS_MNEMONIC_VCVTUQQ2PS,\n    ZYDIS_MNEMONIC_VCVTUSI2SD,\n    ZYDIS_MNEMONIC_VCVTUSI2SH,\n    ZYDIS_MNEMONIC_VCVTUSI2SS,\n    ZYDIS_MNEMONIC_VCVTUW2PH,\n    ZYDIS_MNEMONIC_VCVTW2PH,\n    ZYDIS_MNEMONIC_VDBPSADBW,\n    ZYDIS_MNEMONIC_VDIVPD,\n    ZYDIS_MNEMONIC_VDIVPH,\n    ZYDIS_MNEMONIC_VDIVPS,\n    ZYDIS_MNEMONIC_VDIVSD,\n    ZYDIS_MNEMONIC_VDIVSH,\n    ZYDIS_MNEMONIC_VDIVSS,\n    ZYDIS_MNEMONIC_VDPBF16PS,\n    ZYDIS_MNEMONIC_VDPPD,\n    ZYDIS_MNEMONIC_VDPPS,\n    ZYDIS_MNEMONIC_VERR,\n    ZYDIS_MNEMONIC_VERW,\n    ZYDIS_MNEMONIC_VEXP223PS,\n    ZYDIS_MNEMONIC_VEXP2PD,\n    ZYDIS_MNEMONIC_VEXP2PS,\n    ZYDIS_MNEMONIC_VEXPANDPD,\n    ZYDIS_MNEMONIC_VEXPANDPS,\n    ZYDIS_MNEMONIC_VEXTRACTF128,\n    ZYDIS_MNEMONIC_VEXTRACTF32X4,\n    ZYDIS_MNEMONIC_VEXTRACTF32X8,\n    ZYDIS_MNEMONIC_VEXTRACTF64X2,\n    ZYDIS_MNEMONIC_VEXTRACTF64X4,\n    ZYDIS_MNEMONIC_VEXTRACTI128,\n    ZYDIS_MNEMONIC_VEXTRACTI32X4,\n    ZYDIS_MNEMONIC_VEXTRACTI32X8,\n    ZYDIS_MNEMONIC_VEXTRACTI64X2,\n    ZYDIS_MNEMONIC_VEXTRACTI64X4,\n    ZYDIS_MNEMONIC_VEXTRACTPS,\n    ZYDIS_MNEMONIC_VFCMADDCPH,\n    ZYDIS_MNEMONIC_VFCMADDCSH,\n    ZYDIS_MNEMONIC_VFCMULCPH,\n    ZYDIS_MNEMONIC_VFCMULCSH,\n    ZYDIS_MNEMONIC_VFIXUPIMMPD,\n    ZYDIS_MNEMONIC_VFIXUPIMMPS,\n    ZYDIS_MNEMONIC_VFIXUPIMMSD,\n    ZYDIS_MNEMONIC_VFIXUPIMMSS,\n    ZYDIS_MNEMONIC_VFIXUPNANPD,\n    ZYDIS_MNEMONIC_VFIXUPNANPS,\n    ZYDIS_MNEMONIC_VFMADD132PD,\n    ZYDIS_MNEMONIC_VFMADD132PH,\n    ZYDIS_MNEMONIC_VFMADD132PS,\n    ZYDIS_MNEMONIC_VFMADD132SD,\n    ZYDIS_MNEMONIC_VFMADD132SH,\n    ZYDIS_MNEMONIC_VFMADD132SS,\n    ZYDIS_MNEMONIC_VFMADD213PD,\n    ZYDIS_MNEMONIC_VFMADD213PH,\n    ZYDIS_MNEMONIC_VFMADD213PS,\n    ZYDIS_MNEMONIC_VFMADD213SD,\n    ZYDIS_MNEMONIC_VFMADD213SH,\n    ZYDIS_MNEMONIC_VFMADD213SS,\n    ZYDIS_MNEMONIC_VFMADD231PD,\n    ZYDIS_MNEMONIC_VFMADD231PH,\n    ZYDIS_MNEMONIC_VFMADD231PS,\n    ZYDIS_MNEMONIC_VFMADD231SD,\n    ZYDIS_MNEMONIC_VFMADD231SH,\n    ZYDIS_MNEMONIC_VFMADD231SS,\n    ZYDIS_MNEMONIC_VFMADD233PS,\n    ZYDIS_MNEMONIC_VFMADDCPH,\n    ZYDIS_MNEMONIC_VFMADDCSH,\n    ZYDIS_MNEMONIC_VFMADDPD,\n    ZYDIS_MNEMONIC_VFMADDPS,\n    ZYDIS_MNEMONIC_VFMADDSD,\n    ZYDIS_MNEMONIC_VFMADDSS,\n    ZYDIS_MNEMONIC_VFMADDSUB132PD,\n    ZYDIS_MNEMONIC_VFMADDSUB132PH,\n    ZYDIS_MNEMONIC_VFMADDSUB132PS,\n    ZYDIS_MNEMONIC_VFMADDSUB213PD,\n    ZYDIS_MNEMONIC_VFMADDSUB213PH,\n    ZYDIS_MNEMONIC_VFMADDSUB213PS,\n    ZYDIS_MNEMONIC_VFMADDSUB231PD,\n    ZYDIS_MNEMONIC_VFMADDSUB231PH,\n    ZYDIS_MNEMONIC_VFMADDSUB231PS,\n    ZYDIS_MNEMONIC_VFMADDSUBPD,\n    ZYDIS_MNEMONIC_VFMADDSUBPS,\n    ZYDIS_MNEMONIC_VFMSUB132PD,\n    ZYDIS_MNEMONIC_VFMSUB132PH,\n    ZYDIS_MNEMONIC_VFMSUB132PS,\n    ZYDIS_MNEMONIC_VFMSUB132SD,\n    ZYDIS_MNEMONIC_VFMSUB132SH,\n    ZYDIS_MNEMONIC_VFMSUB132SS,\n    ZYDIS_MNEMONIC_VFMSUB213PD,\n    ZYDIS_MNEMONIC_VFMSUB213PH,\n    ZYDIS_MNEMONIC_VFMSUB213PS,\n    ZYDIS_MNEMONIC_VFMSUB213SD,\n    ZYDIS_MNEMONIC_VFMSUB213SH,\n    ZYDIS_MNEMONIC_VFMSUB213SS,\n    ZYDIS_MNEMONIC_VFMSUB231PD,\n    ZYDIS_MNEMONIC_VFMSUB231PH,\n    ZYDIS_MNEMONIC_VFMSUB231PS,\n    ZYDIS_MNEMONIC_VFMSUB231SD,\n    ZYDIS_MNEMONIC_VFMSUB231SH,\n    ZYDIS_MNEMONIC_VFMSUB231SS,\n    ZYDIS_MNEMONIC_VFMSUBADD132PD,\n    ZYDIS_MNEMONIC_VFMSUBADD132PH,\n    ZYDIS_MNEMONIC_VFMSUBADD132PS,\n    ZYDIS_MNEMONIC_VFMSUBADD213PD,\n    ZYDIS_MNEMONIC_VFMSUBADD213PH,\n    ZYDIS_MNEMONIC_VFMSUBADD213PS,\n    ZYDIS_MNEMONIC_VFMSUBADD231PD,\n    ZYDIS_MNEMONIC_VFMSUBADD231PH,\n    ZYDIS_MNEMONIC_VFMSUBADD231PS,\n    ZYDIS_MNEMONIC_VFMSUBADDPD,\n    ZYDIS_MNEMONIC_VFMSUBADDPS,\n    ZYDIS_MNEMONIC_VFMSUBPD,\n    ZYDIS_MNEMONIC_VFMSUBPS,\n    ZYDIS_MNEMONIC_VFMSUBSD,\n    ZYDIS_MNEMONIC_VFMSUBSS,\n    ZYDIS_MNEMONIC_VFMULCPH,\n    ZYDIS_MNEMONIC_VFMULCSH,\n    ZYDIS_MNEMONIC_VFNMADD132PD,\n    ZYDIS_MNEMONIC_VFNMADD132PH,\n    ZYDIS_MNEMONIC_VFNMADD132PS,\n    ZYDIS_MNEMONIC_VFNMADD132SD,\n    ZYDIS_MNEMONIC_VFNMADD132SH,\n    ZYDIS_MNEMONIC_VFNMADD132SS,\n    ZYDIS_MNEMONIC_VFNMADD213PD,\n    ZYDIS_MNEMONIC_VFNMADD213PH,\n    ZYDIS_MNEMONIC_VFNMADD213PS,\n    ZYDIS_MNEMONIC_VFNMADD213SD,\n    ZYDIS_MNEMONIC_VFNMADD213SH,\n    ZYDIS_MNEMONIC_VFNMADD213SS,\n    ZYDIS_MNEMONIC_VFNMADD231PD,\n    ZYDIS_MNEMONIC_VFNMADD231PH,\n    ZYDIS_MNEMONIC_VFNMADD231PS,\n    ZYDIS_MNEMONIC_VFNMADD231SD,\n    ZYDIS_MNEMONIC_VFNMADD231SH,\n    ZYDIS_MNEMONIC_VFNMADD231SS,\n    ZYDIS_MNEMONIC_VFNMADDPD,\n    ZYDIS_MNEMONIC_VFNMADDPS,\n    ZYDIS_MNEMONIC_VFNMADDSD,\n    ZYDIS_MNEMONIC_VFNMADDSS,\n    ZYDIS_MNEMONIC_VFNMSUB132PD,\n    ZYDIS_MNEMONIC_VFNMSUB132PH,\n    ZYDIS_MNEMONIC_VFNMSUB132PS,\n    ZYDIS_MNEMONIC_VFNMSUB132SD,\n    ZYDIS_MNEMONIC_VFNMSUB132SH,\n    ZYDIS_MNEMONIC_VFNMSUB132SS,\n    ZYDIS_MNEMONIC_VFNMSUB213PD,\n    ZYDIS_MNEMONIC_VFNMSUB213PH,\n    ZYDIS_MNEMONIC_VFNMSUB213PS,\n    ZYDIS_MNEMONIC_VFNMSUB213SD,\n    ZYDIS_MNEMONIC_VFNMSUB213SH,\n    ZYDIS_MNEMONIC_VFNMSUB213SS,\n    ZYDIS_MNEMONIC_VFNMSUB231PD,\n    ZYDIS_MNEMONIC_VFNMSUB231PH,\n    ZYDIS_MNEMONIC_VFNMSUB231PS,\n    ZYDIS_MNEMONIC_VFNMSUB231SD,\n    ZYDIS_MNEMONIC_VFNMSUB231SH,\n    ZYDIS_MNEMONIC_VFNMSUB231SS,\n    ZYDIS_MNEMONIC_VFNMSUBPD,\n    ZYDIS_MNEMONIC_VFNMSUBPS,\n    ZYDIS_MNEMONIC_VFNMSUBSD,\n    ZYDIS_MNEMONIC_VFNMSUBSS,\n    ZYDIS_MNEMONIC_VFPCLASSPD,\n    ZYDIS_MNEMONIC_VFPCLASSPH,\n    ZYDIS_MNEMONIC_VFPCLASSPS,\n    ZYDIS_MNEMONIC_VFPCLASSSD,\n    ZYDIS_MNEMONIC_VFPCLASSSH,\n    ZYDIS_MNEMONIC_VFPCLASSSS,\n    ZYDIS_MNEMONIC_VFRCZPD,\n    ZYDIS_MNEMONIC_VFRCZPS,\n    ZYDIS_MNEMONIC_VFRCZSD,\n    ZYDIS_MNEMONIC_VFRCZSS,\n    ZYDIS_MNEMONIC_VGATHERDPD,\n    ZYDIS_MNEMONIC_VGATHERDPS,\n    ZYDIS_MNEMONIC_VGATHERPF0DPD,\n    ZYDIS_MNEMONIC_VGATHERPF0DPS,\n    ZYDIS_MNEMONIC_VGATHERPF0HINTDPD,\n    ZYDIS_MNEMONIC_VGATHERPF0HINTDPS,\n    ZYDIS_MNEMONIC_VGATHERPF0QPD,\n    ZYDIS_MNEMONIC_VGATHERPF0QPS,\n    ZYDIS_MNEMONIC_VGATHERPF1DPD,\n    ZYDIS_MNEMONIC_VGATHERPF1DPS,\n    ZYDIS_MNEMONIC_VGATHERPF1QPD,\n    ZYDIS_MNEMONIC_VGATHERPF1QPS,\n    ZYDIS_MNEMONIC_VGATHERQPD,\n    ZYDIS_MNEMONIC_VGATHERQPS,\n    ZYDIS_MNEMONIC_VGETEXPPD,\n    ZYDIS_MNEMONIC_VGETEXPPH,\n    ZYDIS_MNEMONIC_VGETEXPPS,\n    ZYDIS_MNEMONIC_VGETEXPSD,\n    ZYDIS_MNEMONIC_VGETEXPSH,\n    ZYDIS_MNEMONIC_VGETEXPSS,\n    ZYDIS_MNEMONIC_VGETMANTPD,\n    ZYDIS_MNEMONIC_VGETMANTPH,\n    ZYDIS_MNEMONIC_VGETMANTPS,\n    ZYDIS_MNEMONIC_VGETMANTSD,\n    ZYDIS_MNEMONIC_VGETMANTSH,\n    ZYDIS_MNEMONIC_VGETMANTSS,\n    ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB,\n    ZYDIS_MNEMONIC_VGF2P8AFFINEQB,\n    ZYDIS_MNEMONIC_VGF2P8MULB,\n    ZYDIS_MNEMONIC_VGMAXABSPS,\n    ZYDIS_MNEMONIC_VGMAXPD,\n    ZYDIS_MNEMONIC_VGMAXPS,\n    ZYDIS_MNEMONIC_VGMINPD,\n    ZYDIS_MNEMONIC_VGMINPS,\n    ZYDIS_MNEMONIC_VHADDPD,\n    ZYDIS_MNEMONIC_VHADDPS,\n    ZYDIS_MNEMONIC_VHSUBPD,\n    ZYDIS_MNEMONIC_VHSUBPS,\n    ZYDIS_MNEMONIC_VINSERTF128,\n    ZYDIS_MNEMONIC_VINSERTF32X4,\n    ZYDIS_MNEMONIC_VINSERTF32X8,\n    ZYDIS_MNEMONIC_VINSERTF64X2,\n    ZYDIS_MNEMONIC_VINSERTF64X4,\n    ZYDIS_MNEMONIC_VINSERTI128,\n    ZYDIS_MNEMONIC_VINSERTI32X4,\n    ZYDIS_MNEMONIC_VINSERTI32X8,\n    ZYDIS_MNEMONIC_VINSERTI64X2,\n    ZYDIS_MNEMONIC_VINSERTI64X4,\n    ZYDIS_MNEMONIC_VINSERTPS,\n    ZYDIS_MNEMONIC_VLDDQU,\n    ZYDIS_MNEMONIC_VLDMXCSR,\n    ZYDIS_MNEMONIC_VLOADUNPACKHD,\n    ZYDIS_MNEMONIC_VLOADUNPACKHPD,\n    ZYDIS_MNEMONIC_VLOADUNPACKHPS,\n    ZYDIS_MNEMONIC_VLOADUNPACKHQ,\n    ZYDIS_MNEMONIC_VLOADUNPACKLD,\n    ZYDIS_MNEMONIC_VLOADUNPACKLPD,\n    ZYDIS_MNEMONIC_VLOADUNPACKLPS,\n    ZYDIS_MNEMONIC_VLOADUNPACKLQ,\n    ZYDIS_MNEMONIC_VLOG2PS,\n    ZYDIS_MNEMONIC_VMASKMOVDQU,\n    ZYDIS_MNEMONIC_VMASKMOVPD,\n    ZYDIS_MNEMONIC_VMASKMOVPS,\n    ZYDIS_MNEMONIC_VMAXPD,\n    ZYDIS_MNEMONIC_VMAXPH,\n    ZYDIS_MNEMONIC_VMAXPS,\n    ZYDIS_MNEMONIC_VMAXSD,\n    ZYDIS_MNEMONIC_VMAXSH,\n    ZYDIS_MNEMONIC_VMAXSS,\n    ZYDIS_MNEMONIC_VMCALL,\n    ZYDIS_MNEMONIC_VMCLEAR,\n    ZYDIS_MNEMONIC_VMFUNC,\n    ZYDIS_MNEMONIC_VMINPD,\n    ZYDIS_MNEMONIC_VMINPH,\n    ZYDIS_MNEMONIC_VMINPS,\n    ZYDIS_MNEMONIC_VMINSD,\n    ZYDIS_MNEMONIC_VMINSH,\n    ZYDIS_MNEMONIC_VMINSS,\n    ZYDIS_MNEMONIC_VMLAUNCH,\n    ZYDIS_MNEMONIC_VMLOAD,\n    ZYDIS_MNEMONIC_VMMCALL,\n    ZYDIS_MNEMONIC_VMOVAPD,\n    ZYDIS_MNEMONIC_VMOVAPS,\n    ZYDIS_MNEMONIC_VMOVD,\n    ZYDIS_MNEMONIC_VMOVDDUP,\n    ZYDIS_MNEMONIC_VMOVDQA,\n    ZYDIS_MNEMONIC_VMOVDQA32,\n    ZYDIS_MNEMONIC_VMOVDQA64,\n    ZYDIS_MNEMONIC_VMOVDQU,\n    ZYDIS_MNEMONIC_VMOVDQU16,\n    ZYDIS_MNEMONIC_VMOVDQU32,\n    ZYDIS_MNEMONIC_VMOVDQU64,\n    ZYDIS_MNEMONIC_VMOVDQU8,\n    ZYDIS_MNEMONIC_VMOVHLPS,\n    ZYDIS_MNEMONIC_VMOVHPD,\n    ZYDIS_MNEMONIC_VMOVHPS,\n    ZYDIS_MNEMONIC_VMOVLHPS,\n    ZYDIS_MNEMONIC_VMOVLPD,\n    ZYDIS_MNEMONIC_VMOVLPS,\n    ZYDIS_MNEMONIC_VMOVMSKPD,\n    ZYDIS_MNEMONIC_VMOVMSKPS,\n    ZYDIS_MNEMONIC_VMOVNRAPD,\n    ZYDIS_MNEMONIC_VMOVNRAPS,\n    ZYDIS_MNEMONIC_VMOVNRNGOAPD,\n    ZYDIS_MNEMONIC_VMOVNRNGOAPS,\n    ZYDIS_MNEMONIC_VMOVNTDQ,\n    ZYDIS_MNEMONIC_VMOVNTDQA,\n    ZYDIS_MNEMONIC_VMOVNTPD,\n    ZYDIS_MNEMONIC_VMOVNTPS,\n    ZYDIS_MNEMONIC_VMOVQ,\n    ZYDIS_MNEMONIC_VMOVSD,\n    ZYDIS_MNEMONIC_VMOVSH,\n    ZYDIS_MNEMONIC_VMOVSHDUP,\n    ZYDIS_MNEMONIC_VMOVSLDUP,\n    ZYDIS_MNEMONIC_VMOVSS,\n    ZYDIS_MNEMONIC_VMOVUPD,\n    ZYDIS_MNEMONIC_VMOVUPS,\n    ZYDIS_MNEMONIC_VMOVW,\n    ZYDIS_MNEMONIC_VMPSADBW,\n    ZYDIS_MNEMONIC_VMPTRLD,\n    ZYDIS_MNEMONIC_VMPTRST,\n    ZYDIS_MNEMONIC_VMREAD,\n    ZYDIS_MNEMONIC_VMRESUME,\n    ZYDIS_MNEMONIC_VMRUN,\n    ZYDIS_MNEMONIC_VMSAVE,\n    ZYDIS_MNEMONIC_VMULPD,\n    ZYDIS_MNEMONIC_VMULPH,\n    ZYDIS_MNEMONIC_VMULPS,\n    ZYDIS_MNEMONIC_VMULSD,\n    ZYDIS_MNEMONIC_VMULSH,\n    ZYDIS_MNEMONIC_VMULSS,\n    ZYDIS_MNEMONIC_VMWRITE,\n    ZYDIS_MNEMONIC_VMXOFF,\n    ZYDIS_MNEMONIC_VMXON,\n    ZYDIS_MNEMONIC_VORPD,\n    ZYDIS_MNEMONIC_VORPS,\n    ZYDIS_MNEMONIC_VP2INTERSECTD,\n    ZYDIS_MNEMONIC_VP2INTERSECTQ,\n    ZYDIS_MNEMONIC_VP4DPWSSD,\n    ZYDIS_MNEMONIC_VP4DPWSSDS,\n    ZYDIS_MNEMONIC_VPABSB,\n    ZYDIS_MNEMONIC_VPABSD,\n    ZYDIS_MNEMONIC_VPABSQ,\n    ZYDIS_MNEMONIC_VPABSW,\n    ZYDIS_MNEMONIC_VPACKSSDW,\n    ZYDIS_MNEMONIC_VPACKSSWB,\n    ZYDIS_MNEMONIC_VPACKSTOREHD,\n    ZYDIS_MNEMONIC_VPACKSTOREHPD,\n    ZYDIS_MNEMONIC_VPACKSTOREHPS,\n    ZYDIS_MNEMONIC_VPACKSTOREHQ,\n    ZYDIS_MNEMONIC_VPACKSTORELD,\n    ZYDIS_MNEMONIC_VPACKSTORELPD,\n    ZYDIS_MNEMONIC_VPACKSTORELPS,\n    ZYDIS_MNEMONIC_VPACKSTORELQ,\n    ZYDIS_MNEMONIC_VPACKUSDW,\n    ZYDIS_MNEMONIC_VPACKUSWB,\n    ZYDIS_MNEMONIC_VPADCD,\n    ZYDIS_MNEMONIC_VPADDB,\n    ZYDIS_MNEMONIC_VPADDD,\n    ZYDIS_MNEMONIC_VPADDQ,\n    ZYDIS_MNEMONIC_VPADDSB,\n    ZYDIS_MNEMONIC_VPADDSETCD,\n    ZYDIS_MNEMONIC_VPADDSETSD,\n    ZYDIS_MNEMONIC_VPADDSW,\n    ZYDIS_MNEMONIC_VPADDUSB,\n    ZYDIS_MNEMONIC_VPADDUSW,\n    ZYDIS_MNEMONIC_VPADDW,\n    ZYDIS_MNEMONIC_VPALIGNR,\n    ZYDIS_MNEMONIC_VPAND,\n    ZYDIS_MNEMONIC_VPANDD,\n    ZYDIS_MNEMONIC_VPANDN,\n    ZYDIS_MNEMONIC_VPANDND,\n    ZYDIS_MNEMONIC_VPANDNQ,\n    ZYDIS_MNEMONIC_VPANDQ,\n    ZYDIS_MNEMONIC_VPAVGB,\n    ZYDIS_MNEMONIC_VPAVGW,\n    ZYDIS_MNEMONIC_VPBLENDD,\n    ZYDIS_MNEMONIC_VPBLENDMB,\n    ZYDIS_MNEMONIC_VPBLENDMD,\n    ZYDIS_MNEMONIC_VPBLENDMQ,\n    ZYDIS_MNEMONIC_VPBLENDMW,\n    ZYDIS_MNEMONIC_VPBLENDVB,\n    ZYDIS_MNEMONIC_VPBLENDW,\n    ZYDIS_MNEMONIC_VPBROADCASTB,\n    ZYDIS_MNEMONIC_VPBROADCASTD,\n    ZYDIS_MNEMONIC_VPBROADCASTMB2Q,\n    ZYDIS_MNEMONIC_VPBROADCASTMW2D,\n    ZYDIS_MNEMONIC_VPBROADCASTQ,\n    ZYDIS_MNEMONIC_VPBROADCASTW,\n    ZYDIS_MNEMONIC_VPCLMULQDQ,\n    ZYDIS_MNEMONIC_VPCMOV,\n    ZYDIS_MNEMONIC_VPCMPB,\n    ZYDIS_MNEMONIC_VPCMPD,\n    ZYDIS_MNEMONIC_VPCMPEQB,\n    ZYDIS_MNEMONIC_VPCMPEQD,\n    ZYDIS_MNEMONIC_VPCMPEQQ,\n    ZYDIS_MNEMONIC_VPCMPEQW,\n    ZYDIS_MNEMONIC_VPCMPESTRI,\n    ZYDIS_MNEMONIC_VPCMPESTRM,\n    ZYDIS_MNEMONIC_VPCMPGTB,\n    ZYDIS_MNEMONIC_VPCMPGTD,\n    ZYDIS_MNEMONIC_VPCMPGTQ,\n    ZYDIS_MNEMONIC_VPCMPGTW,\n    ZYDIS_MNEMONIC_VPCMPISTRI,\n    ZYDIS_MNEMONIC_VPCMPISTRM,\n    ZYDIS_MNEMONIC_VPCMPLTD,\n    ZYDIS_MNEMONIC_VPCMPQ,\n    ZYDIS_MNEMONIC_VPCMPUB,\n    ZYDIS_MNEMONIC_VPCMPUD,\n    ZYDIS_MNEMONIC_VPCMPUQ,\n    ZYDIS_MNEMONIC_VPCMPUW,\n    ZYDIS_MNEMONIC_VPCMPW,\n    ZYDIS_MNEMONIC_VPCOMB,\n    ZYDIS_MNEMONIC_VPCOMD,\n    ZYDIS_MNEMONIC_VPCOMPRESSB,\n    ZYDIS_MNEMONIC_VPCOMPRESSD,\n    ZYDIS_MNEMONIC_VPCOMPRESSQ,\n    ZYDIS_MNEMONIC_VPCOMPRESSW,\n    ZYDIS_MNEMONIC_VPCOMQ,\n    ZYDIS_MNEMONIC_VPCOMUB,\n    ZYDIS_MNEMONIC_VPCOMUD,\n    ZYDIS_MNEMONIC_VPCOMUQ,\n    ZYDIS_MNEMONIC_VPCOMUW,\n    ZYDIS_MNEMONIC_VPCOMW,\n    ZYDIS_MNEMONIC_VPCONFLICTD,\n    ZYDIS_MNEMONIC_VPCONFLICTQ,\n    ZYDIS_MNEMONIC_VPDPBSSD,\n    ZYDIS_MNEMONIC_VPDPBSSDS,\n    ZYDIS_MNEMONIC_VPDPBSUD,\n    ZYDIS_MNEMONIC_VPDPBSUDS,\n    ZYDIS_MNEMONIC_VPDPBUSD,\n    ZYDIS_MNEMONIC_VPDPBUSDS,\n    ZYDIS_MNEMONIC_VPDPBUUD,\n    ZYDIS_MNEMONIC_VPDPBUUDS,\n    ZYDIS_MNEMONIC_VPDPWSSD,\n    ZYDIS_MNEMONIC_VPDPWSSDS,\n    ZYDIS_MNEMONIC_VPDPWSUD,\n    ZYDIS_MNEMONIC_VPDPWSUDS,\n    ZYDIS_MNEMONIC_VPDPWUSD,\n    ZYDIS_MNEMONIC_VPDPWUSDS,\n    ZYDIS_MNEMONIC_VPDPWUUD,\n    ZYDIS_MNEMONIC_VPDPWUUDS,\n    ZYDIS_MNEMONIC_VPERM2F128,\n    ZYDIS_MNEMONIC_VPERM2I128,\n    ZYDIS_MNEMONIC_VPERMB,\n    ZYDIS_MNEMONIC_VPERMD,\n    ZYDIS_MNEMONIC_VPERMF32X4,\n    ZYDIS_MNEMONIC_VPERMI2B,\n    ZYDIS_MNEMONIC_VPERMI2D,\n    ZYDIS_MNEMONIC_VPERMI2PD,\n    ZYDIS_MNEMONIC_VPERMI2PS,\n    ZYDIS_MNEMONIC_VPERMI2Q,\n    ZYDIS_MNEMONIC_VPERMI2W,\n    ZYDIS_MNEMONIC_VPERMIL2PD,\n    ZYDIS_MNEMONIC_VPERMIL2PS,\n    ZYDIS_MNEMONIC_VPERMILPD,\n    ZYDIS_MNEMONIC_VPERMILPS,\n    ZYDIS_MNEMONIC_VPERMPD,\n    ZYDIS_MNEMONIC_VPERMPS,\n    ZYDIS_MNEMONIC_VPERMQ,\n    ZYDIS_MNEMONIC_VPERMT2B,\n    ZYDIS_MNEMONIC_VPERMT2D,\n    ZYDIS_MNEMONIC_VPERMT2PD,\n    ZYDIS_MNEMONIC_VPERMT2PS,\n    ZYDIS_MNEMONIC_VPERMT2Q,\n    ZYDIS_MNEMONIC_VPERMT2W,\n    ZYDIS_MNEMONIC_VPERMW,\n    ZYDIS_MNEMONIC_VPEXPANDB,\n    ZYDIS_MNEMONIC_VPEXPANDD,\n    ZYDIS_MNEMONIC_VPEXPANDQ,\n    ZYDIS_MNEMONIC_VPEXPANDW,\n    ZYDIS_MNEMONIC_VPEXTRB,\n    ZYDIS_MNEMONIC_VPEXTRD,\n    ZYDIS_MNEMONIC_VPEXTRQ,\n    ZYDIS_MNEMONIC_VPEXTRW,\n    ZYDIS_MNEMONIC_VPGATHERDD,\n    ZYDIS_MNEMONIC_VPGATHERDQ,\n    ZYDIS_MNEMONIC_VPGATHERQD,\n    ZYDIS_MNEMONIC_VPGATHERQQ,\n    ZYDIS_MNEMONIC_VPHADDBD,\n    ZYDIS_MNEMONIC_VPHADDBQ,\n    ZYDIS_MNEMONIC_VPHADDBW,\n    ZYDIS_MNEMONIC_VPHADDD,\n    ZYDIS_MNEMONIC_VPHADDDQ,\n    ZYDIS_MNEMONIC_VPHADDSW,\n    ZYDIS_MNEMONIC_VPHADDUBD,\n    ZYDIS_MNEMONIC_VPHADDUBQ,\n    ZYDIS_MNEMONIC_VPHADDUBW,\n    ZYDIS_MNEMONIC_VPHADDUDQ,\n    ZYDIS_MNEMONIC_VPHADDUWD,\n    ZYDIS_MNEMONIC_VPHADDUWQ,\n    ZYDIS_MNEMONIC_VPHADDW,\n    ZYDIS_MNEMONIC_VPHADDWD,\n    ZYDIS_MNEMONIC_VPHADDWQ,\n    ZYDIS_MNEMONIC_VPHMINPOSUW,\n    ZYDIS_MNEMONIC_VPHSUBBW,\n    ZYDIS_MNEMONIC_VPHSUBD,\n    ZYDIS_MNEMONIC_VPHSUBDQ,\n    ZYDIS_MNEMONIC_VPHSUBSW,\n    ZYDIS_MNEMONIC_VPHSUBW,\n    ZYDIS_MNEMONIC_VPHSUBWD,\n    ZYDIS_MNEMONIC_VPINSRB,\n    ZYDIS_MNEMONIC_VPINSRD,\n    ZYDIS_MNEMONIC_VPINSRQ,\n    ZYDIS_MNEMONIC_VPINSRW,\n    ZYDIS_MNEMONIC_VPLZCNTD,\n    ZYDIS_MNEMONIC_VPLZCNTQ,\n    ZYDIS_MNEMONIC_VPMACSDD,\n    ZYDIS_MNEMONIC_VPMACSDQH,\n    ZYDIS_MNEMONIC_VPMACSDQL,\n    ZYDIS_MNEMONIC_VPMACSSDD,\n    ZYDIS_MNEMONIC_VPMACSSDQH,\n    ZYDIS_MNEMONIC_VPMACSSDQL,\n    ZYDIS_MNEMONIC_VPMACSSWD,\n    ZYDIS_MNEMONIC_VPMACSSWW,\n    ZYDIS_MNEMONIC_VPMACSWD,\n    ZYDIS_MNEMONIC_VPMACSWW,\n    ZYDIS_MNEMONIC_VPMADCSSWD,\n    ZYDIS_MNEMONIC_VPMADCSWD,\n    ZYDIS_MNEMONIC_VPMADD231D,\n    ZYDIS_MNEMONIC_VPMADD233D,\n    ZYDIS_MNEMONIC_VPMADD52HUQ,\n    ZYDIS_MNEMONIC_VPMADD52LUQ,\n    ZYDIS_MNEMONIC_VPMADDUBSW,\n    ZYDIS_MNEMONIC_VPMADDWD,\n    ZYDIS_MNEMONIC_VPMASKMOVD,\n    ZYDIS_MNEMONIC_VPMASKMOVQ,\n    ZYDIS_MNEMONIC_VPMAXSB,\n    ZYDIS_MNEMONIC_VPMAXSD,\n    ZYDIS_MNEMONIC_VPMAXSQ,\n    ZYDIS_MNEMONIC_VPMAXSW,\n    ZYDIS_MNEMONIC_VPMAXUB,\n    ZYDIS_MNEMONIC_VPMAXUD,\n    ZYDIS_MNEMONIC_VPMAXUQ,\n    ZYDIS_MNEMONIC_VPMAXUW,\n    ZYDIS_MNEMONIC_VPMINSB,\n    ZYDIS_MNEMONIC_VPMINSD,\n    ZYDIS_MNEMONIC_VPMINSQ,\n    ZYDIS_MNEMONIC_VPMINSW,\n    ZYDIS_MNEMONIC_VPMINUB,\n    ZYDIS_MNEMONIC_VPMINUD,\n    ZYDIS_MNEMONIC_VPMINUQ,\n    ZYDIS_MNEMONIC_VPMINUW,\n    ZYDIS_MNEMONIC_VPMOVB2M,\n    ZYDIS_MNEMONIC_VPMOVD2M,\n    ZYDIS_MNEMONIC_VPMOVDB,\n    ZYDIS_MNEMONIC_VPMOVDW,\n    ZYDIS_MNEMONIC_VPMOVM2B,\n    ZYDIS_MNEMONIC_VPMOVM2D,\n    ZYDIS_MNEMONIC_VPMOVM2Q,\n    ZYDIS_MNEMONIC_VPMOVM2W,\n    ZYDIS_MNEMONIC_VPMOVMSKB,\n    ZYDIS_MNEMONIC_VPMOVQ2M,\n    ZYDIS_MNEMONIC_VPMOVQB,\n    ZYDIS_MNEMONIC_VPMOVQD,\n    ZYDIS_MNEMONIC_VPMOVQW,\n    ZYDIS_MNEMONIC_VPMOVSDB,\n    ZYDIS_MNEMONIC_VPMOVSDW,\n    ZYDIS_MNEMONIC_VPMOVSQB,\n    ZYDIS_MNEMONIC_VPMOVSQD,\n    ZYDIS_MNEMONIC_VPMOVSQW,\n    ZYDIS_MNEMONIC_VPMOVSWB,\n    ZYDIS_MNEMONIC_VPMOVSXBD,\n    ZYDIS_MNEMONIC_VPMOVSXBQ,\n    ZYDIS_MNEMONIC_VPMOVSXBW,\n    ZYDIS_MNEMONIC_VPMOVSXDQ,\n    ZYDIS_MNEMONIC_VPMOVSXWD,\n    ZYDIS_MNEMONIC_VPMOVSXWQ,\n    ZYDIS_MNEMONIC_VPMOVUSDB,\n    ZYDIS_MNEMONIC_VPMOVUSDW,\n    ZYDIS_MNEMONIC_VPMOVUSQB,\n    ZYDIS_MNEMONIC_VPMOVUSQD,\n    ZYDIS_MNEMONIC_VPMOVUSQW,\n    ZYDIS_MNEMONIC_VPMOVUSWB,\n    ZYDIS_MNEMONIC_VPMOVW2M,\n    ZYDIS_MNEMONIC_VPMOVWB,\n    ZYDIS_MNEMONIC_VPMOVZXBD,\n    ZYDIS_MNEMONIC_VPMOVZXBQ,\n    ZYDIS_MNEMONIC_VPMOVZXBW,\n    ZYDIS_MNEMONIC_VPMOVZXDQ,\n    ZYDIS_MNEMONIC_VPMOVZXWD,\n    ZYDIS_MNEMONIC_VPMOVZXWQ,\n    ZYDIS_MNEMONIC_VPMULDQ,\n    ZYDIS_MNEMONIC_VPMULHD,\n    ZYDIS_MNEMONIC_VPMULHRSW,\n    ZYDIS_MNEMONIC_VPMULHUD,\n    ZYDIS_MNEMONIC_VPMULHUW,\n    ZYDIS_MNEMONIC_VPMULHW,\n    ZYDIS_MNEMONIC_VPMULLD,\n    ZYDIS_MNEMONIC_VPMULLQ,\n    ZYDIS_MNEMONIC_VPMULLW,\n    ZYDIS_MNEMONIC_VPMULTISHIFTQB,\n    ZYDIS_MNEMONIC_VPMULUDQ,\n    ZYDIS_MNEMONIC_VPOPCNTB,\n    ZYDIS_MNEMONIC_VPOPCNTD,\n    ZYDIS_MNEMONIC_VPOPCNTQ,\n    ZYDIS_MNEMONIC_VPOPCNTW,\n    ZYDIS_MNEMONIC_VPOR,\n    ZYDIS_MNEMONIC_VPORD,\n    ZYDIS_MNEMONIC_VPORQ,\n    ZYDIS_MNEMONIC_VPPERM,\n    ZYDIS_MNEMONIC_VPREFETCH0,\n    ZYDIS_MNEMONIC_VPREFETCH1,\n    ZYDIS_MNEMONIC_VPREFETCH2,\n    ZYDIS_MNEMONIC_VPREFETCHE0,\n    ZYDIS_MNEMONIC_VPREFETCHE1,\n    ZYDIS_MNEMONIC_VPREFETCHE2,\n    ZYDIS_MNEMONIC_VPREFETCHENTA,\n    ZYDIS_MNEMONIC_VPREFETCHNTA,\n    ZYDIS_MNEMONIC_VPROLD,\n    ZYDIS_MNEMONIC_VPROLQ,\n    ZYDIS_MNEMONIC_VPROLVD,\n    ZYDIS_MNEMONIC_VPROLVQ,\n    ZYDIS_MNEMONIC_VPRORD,\n    ZYDIS_MNEMONIC_VPRORQ,\n    ZYDIS_MNEMONIC_VPRORVD,\n    ZYDIS_MNEMONIC_VPRORVQ,\n    ZYDIS_MNEMONIC_VPROTB,\n    ZYDIS_MNEMONIC_VPROTD,\n    ZYDIS_MNEMONIC_VPROTQ,\n    ZYDIS_MNEMONIC_VPROTW,\n    ZYDIS_MNEMONIC_VPSADBW,\n    ZYDIS_MNEMONIC_VPSBBD,\n    ZYDIS_MNEMONIC_VPSBBRD,\n    ZYDIS_MNEMONIC_VPSCATTERDD,\n    ZYDIS_MNEMONIC_VPSCATTERDQ,\n    ZYDIS_MNEMONIC_VPSCATTERQD,\n    ZYDIS_MNEMONIC_VPSCATTERQQ,\n    ZYDIS_MNEMONIC_VPSHAB,\n    ZYDIS_MNEMONIC_VPSHAD,\n    ZYDIS_MNEMONIC_VPSHAQ,\n    ZYDIS_MNEMONIC_VPSHAW,\n    ZYDIS_MNEMONIC_VPSHLB,\n    ZYDIS_MNEMONIC_VPSHLD,\n    ZYDIS_MNEMONIC_VPSHLDD,\n    ZYDIS_MNEMONIC_VPSHLDQ,\n    ZYDIS_MNEMONIC_VPSHLDVD,\n    ZYDIS_MNEMONIC_VPSHLDVQ,\n    ZYDIS_MNEMONIC_VPSHLDVW,\n    ZYDIS_MNEMONIC_VPSHLDW,\n    ZYDIS_MNEMONIC_VPSHLQ,\n    ZYDIS_MNEMONIC_VPSHLW,\n    ZYDIS_MNEMONIC_VPSHRDD,\n    ZYDIS_MNEMONIC_VPSHRDQ,\n    ZYDIS_MNEMONIC_VPSHRDVD,\n    ZYDIS_MNEMONIC_VPSHRDVQ,\n    ZYDIS_MNEMONIC_VPSHRDVW,\n    ZYDIS_MNEMONIC_VPSHRDW,\n    ZYDIS_MNEMONIC_VPSHUFB,\n    ZYDIS_MNEMONIC_VPSHUFBITQMB,\n    ZYDIS_MNEMONIC_VPSHUFD,\n    ZYDIS_MNEMONIC_VPSHUFHW,\n    ZYDIS_MNEMONIC_VPSHUFLW,\n    ZYDIS_MNEMONIC_VPSIGNB,\n    ZYDIS_MNEMONIC_VPSIGND,\n    ZYDIS_MNEMONIC_VPSIGNW,\n    ZYDIS_MNEMONIC_VPSLLD,\n    ZYDIS_MNEMONIC_VPSLLDQ,\n    ZYDIS_MNEMONIC_VPSLLQ,\n    ZYDIS_MNEMONIC_VPSLLVD,\n    ZYDIS_MNEMONIC_VPSLLVQ,\n    ZYDIS_MNEMONIC_VPSLLVW,\n    ZYDIS_MNEMONIC_VPSLLW,\n    ZYDIS_MNEMONIC_VPSRAD,\n    ZYDIS_MNEMONIC_VPSRAQ,\n    ZYDIS_MNEMONIC_VPSRAVD,\n    ZYDIS_MNEMONIC_VPSRAVQ,\n    ZYDIS_MNEMONIC_VPSRAVW,\n    ZYDIS_MNEMONIC_VPSRAW,\n    ZYDIS_MNEMONIC_VPSRLD,\n    ZYDIS_MNEMONIC_VPSRLDQ,\n    ZYDIS_MNEMONIC_VPSRLQ,\n    ZYDIS_MNEMONIC_VPSRLVD,\n    ZYDIS_MNEMONIC_VPSRLVQ,\n    ZYDIS_MNEMONIC_VPSRLVW,\n    ZYDIS_MNEMONIC_VPSRLW,\n    ZYDIS_MNEMONIC_VPSUBB,\n    ZYDIS_MNEMONIC_VPSUBD,\n    ZYDIS_MNEMONIC_VPSUBQ,\n    ZYDIS_MNEMONIC_VPSUBRD,\n    ZYDIS_MNEMONIC_VPSUBRSETBD,\n    ZYDIS_MNEMONIC_VPSUBSB,\n    ZYDIS_MNEMONIC_VPSUBSETBD,\n    ZYDIS_MNEMONIC_VPSUBSW,\n    ZYDIS_MNEMONIC_VPSUBUSB,\n    ZYDIS_MNEMONIC_VPSUBUSW,\n    ZYDIS_MNEMONIC_VPSUBW,\n    ZYDIS_MNEMONIC_VPTERNLOGD,\n    ZYDIS_MNEMONIC_VPTERNLOGQ,\n    ZYDIS_MNEMONIC_VPTEST,\n    ZYDIS_MNEMONIC_VPTESTMB,\n    ZYDIS_MNEMONIC_VPTESTMD,\n    ZYDIS_MNEMONIC_VPTESTMQ,\n    ZYDIS_MNEMONIC_VPTESTMW,\n    ZYDIS_MNEMONIC_VPTESTNMB,\n    ZYDIS_MNEMONIC_VPTESTNMD,\n    ZYDIS_MNEMONIC_VPTESTNMQ,\n    ZYDIS_MNEMONIC_VPTESTNMW,\n    ZYDIS_MNEMONIC_VPUNPCKHBW,\n    ZYDIS_MNEMONIC_VPUNPCKHDQ,\n    ZYDIS_MNEMONIC_VPUNPCKHQDQ,\n    ZYDIS_MNEMONIC_VPUNPCKHWD,\n    ZYDIS_MNEMONIC_VPUNPCKLBW,\n    ZYDIS_MNEMONIC_VPUNPCKLDQ,\n    ZYDIS_MNEMONIC_VPUNPCKLQDQ,\n    ZYDIS_MNEMONIC_VPUNPCKLWD,\n    ZYDIS_MNEMONIC_VPXOR,\n    ZYDIS_MNEMONIC_VPXORD,\n    ZYDIS_MNEMONIC_VPXORQ,\n    ZYDIS_MNEMONIC_VRANGEPD,\n    ZYDIS_MNEMONIC_VRANGEPS,\n    ZYDIS_MNEMONIC_VRANGESD,\n    ZYDIS_MNEMONIC_VRANGESS,\n    ZYDIS_MNEMONIC_VRCP14PD,\n    ZYDIS_MNEMONIC_VRCP14PS,\n    ZYDIS_MNEMONIC_VRCP14SD,\n    ZYDIS_MNEMONIC_VRCP14SS,\n    ZYDIS_MNEMONIC_VRCP23PS,\n    ZYDIS_MNEMONIC_VRCP28PD,\n    ZYDIS_MNEMONIC_VRCP28PS,\n    ZYDIS_MNEMONIC_VRCP28SD,\n    ZYDIS_MNEMONIC_VRCP28SS,\n    ZYDIS_MNEMONIC_VRCPPH,\n    ZYDIS_MNEMONIC_VRCPPS,\n    ZYDIS_MNEMONIC_VRCPSH,\n    ZYDIS_MNEMONIC_VRCPSS,\n    ZYDIS_MNEMONIC_VREDUCEPD,\n    ZYDIS_MNEMONIC_VREDUCEPH,\n    ZYDIS_MNEMONIC_VREDUCEPS,\n    ZYDIS_MNEMONIC_VREDUCESD,\n    ZYDIS_MNEMONIC_VREDUCESH,\n    ZYDIS_MNEMONIC_VREDUCESS,\n    ZYDIS_MNEMONIC_VRNDFXPNTPD,\n    ZYDIS_MNEMONIC_VRNDFXPNTPS,\n    ZYDIS_MNEMONIC_VRNDSCALEPD,\n    ZYDIS_MNEMONIC_VRNDSCALEPH,\n    ZYDIS_MNEMONIC_VRNDSCALEPS,\n    ZYDIS_MNEMONIC_VRNDSCALESD,\n    ZYDIS_MNEMONIC_VRNDSCALESH,\n    ZYDIS_MNEMONIC_VRNDSCALESS,\n    ZYDIS_MNEMONIC_VROUNDPD,\n    ZYDIS_MNEMONIC_VROUNDPS,\n    ZYDIS_MNEMONIC_VROUNDSD,\n    ZYDIS_MNEMONIC_VROUNDSS,\n    ZYDIS_MNEMONIC_VRSQRT14PD,\n    ZYDIS_MNEMONIC_VRSQRT14PS,\n    ZYDIS_MNEMONIC_VRSQRT14SD,\n    ZYDIS_MNEMONIC_VRSQRT14SS,\n    ZYDIS_MNEMONIC_VRSQRT23PS,\n    ZYDIS_MNEMONIC_VRSQRT28PD,\n    ZYDIS_MNEMONIC_VRSQRT28PS,\n    ZYDIS_MNEMONIC_VRSQRT28SD,\n    ZYDIS_MNEMONIC_VRSQRT28SS,\n    ZYDIS_MNEMONIC_VRSQRTPH,\n    ZYDIS_MNEMONIC_VRSQRTPS,\n    ZYDIS_MNEMONIC_VRSQRTSH,\n    ZYDIS_MNEMONIC_VRSQRTSS,\n    ZYDIS_MNEMONIC_VSCALEFPD,\n    ZYDIS_MNEMONIC_VSCALEFPH,\n    ZYDIS_MNEMONIC_VSCALEFPS,\n    ZYDIS_MNEMONIC_VSCALEFSD,\n    ZYDIS_MNEMONIC_VSCALEFSH,\n    ZYDIS_MNEMONIC_VSCALEFSS,\n    ZYDIS_MNEMONIC_VSCALEPS,\n    ZYDIS_MNEMONIC_VSCATTERDPD,\n    ZYDIS_MNEMONIC_VSCATTERDPS,\n    ZYDIS_MNEMONIC_VSCATTERPF0DPD,\n    ZYDIS_MNEMONIC_VSCATTERPF0DPS,\n    ZYDIS_MNEMONIC_VSCATTERPF0HINTDPD,\n    ZYDIS_MNEMONIC_VSCATTERPF0HINTDPS,\n    ZYDIS_MNEMONIC_VSCATTERPF0QPD,\n    ZYDIS_MNEMONIC_VSCATTERPF0QPS,\n    ZYDIS_MNEMONIC_VSCATTERPF1DPD,\n    ZYDIS_MNEMONIC_VSCATTERPF1DPS,\n    ZYDIS_MNEMONIC_VSCATTERPF1QPD,\n    ZYDIS_MNEMONIC_VSCATTERPF1QPS,\n    ZYDIS_MNEMONIC_VSCATTERQPD,\n    ZYDIS_MNEMONIC_VSCATTERQPS,\n    ZYDIS_MNEMONIC_VSHA512MSG1,\n    ZYDIS_MNEMONIC_VSHA512MSG2,\n    ZYDIS_MNEMONIC_VSHA512RNDS2,\n    ZYDIS_MNEMONIC_VSHUFF32X4,\n    ZYDIS_MNEMONIC_VSHUFF64X2,\n    ZYDIS_MNEMONIC_VSHUFI32X4,\n    ZYDIS_MNEMONIC_VSHUFI64X2,\n    ZYDIS_MNEMONIC_VSHUFPD,\n    ZYDIS_MNEMONIC_VSHUFPS,\n    ZYDIS_MNEMONIC_VSM3MSG1,\n    ZYDIS_MNEMONIC_VSM3MSG2,\n    ZYDIS_MNEMONIC_VSM3RNDS2,\n    ZYDIS_MNEMONIC_VSM4KEY4,\n    ZYDIS_MNEMONIC_VSM4RNDS4,\n    ZYDIS_MNEMONIC_VSQRTPD,\n    ZYDIS_MNEMONIC_VSQRTPH,\n    ZYDIS_MNEMONIC_VSQRTPS,\n    ZYDIS_MNEMONIC_VSQRTSD,\n    ZYDIS_MNEMONIC_VSQRTSH,\n    ZYDIS_MNEMONIC_VSQRTSS,\n    ZYDIS_MNEMONIC_VSTMXCSR,\n    ZYDIS_MNEMONIC_VSUBPD,\n    ZYDIS_MNEMONIC_VSUBPH,\n    ZYDIS_MNEMONIC_VSUBPS,\n    ZYDIS_MNEMONIC_VSUBRPD,\n    ZYDIS_MNEMONIC_VSUBRPS,\n    ZYDIS_MNEMONIC_VSUBSD,\n    ZYDIS_MNEMONIC_VSUBSH,\n    ZYDIS_MNEMONIC_VSUBSS,\n    ZYDIS_MNEMONIC_VTESTPD,\n    ZYDIS_MNEMONIC_VTESTPS,\n    ZYDIS_MNEMONIC_VUCOMISD,\n    ZYDIS_MNEMONIC_VUCOMISH,\n    ZYDIS_MNEMONIC_VUCOMISS,\n    ZYDIS_MNEMONIC_VUNPCKHPD,\n    ZYDIS_MNEMONIC_VUNPCKHPS,\n    ZYDIS_MNEMONIC_VUNPCKLPD,\n    ZYDIS_MNEMONIC_VUNPCKLPS,\n    ZYDIS_MNEMONIC_VXORPD,\n    ZYDIS_MNEMONIC_VXORPS,\n    ZYDIS_MNEMONIC_VZEROALL,\n    ZYDIS_MNEMONIC_VZEROUPPER,\n    ZYDIS_MNEMONIC_WBINVD,\n    ZYDIS_MNEMONIC_WRFSBASE,\n    ZYDIS_MNEMONIC_WRGSBASE,\n    ZYDIS_MNEMONIC_WRMSR,\n    ZYDIS_MNEMONIC_WRMSRLIST,\n    ZYDIS_MNEMONIC_WRMSRNS,\n    ZYDIS_MNEMONIC_WRPKRU,\n    ZYDIS_MNEMONIC_WRSSD,\n    ZYDIS_MNEMONIC_WRSSQ,\n    ZYDIS_MNEMONIC_WRUSSD,\n    ZYDIS_MNEMONIC_WRUSSQ,\n    ZYDIS_MNEMONIC_XABORT,\n    ZYDIS_MNEMONIC_XADD,\n    ZYDIS_MNEMONIC_XBEGIN,\n    ZYDIS_MNEMONIC_XCHG,\n    ZYDIS_MNEMONIC_XCRYPT_CBC,\n    ZYDIS_MNEMONIC_XCRYPT_CFB,\n    ZYDIS_MNEMONIC_XCRYPT_CTR,\n    ZYDIS_MNEMONIC_XCRYPT_ECB,\n    ZYDIS_MNEMONIC_XCRYPT_OFB,\n    ZYDIS_MNEMONIC_XEND,\n    ZYDIS_MNEMONIC_XGETBV,\n    ZYDIS_MNEMONIC_XLAT,\n    ZYDIS_MNEMONIC_XOR,\n    ZYDIS_MNEMONIC_XORPD,\n    ZYDIS_MNEMONIC_XORPS,\n    ZYDIS_MNEMONIC_XRESLDTRK,\n    ZYDIS_MNEMONIC_XRSTOR,\n    ZYDIS_MNEMONIC_XRSTOR64,\n    ZYDIS_MNEMONIC_XRSTORS,\n    ZYDIS_MNEMONIC_XRSTORS64,\n    ZYDIS_MNEMONIC_XSAVE,\n    ZYDIS_MNEMONIC_XSAVE64,\n    ZYDIS_MNEMONIC_XSAVEC,\n    ZYDIS_MNEMONIC_XSAVEC64,\n    ZYDIS_MNEMONIC_XSAVEOPT,\n    ZYDIS_MNEMONIC_XSAVEOPT64,\n    ZYDIS_MNEMONIC_XSAVES,\n    ZYDIS_MNEMONIC_XSAVES64,\n    ZYDIS_MNEMONIC_XSETBV,\n    ZYDIS_MNEMONIC_XSHA1,\n    ZYDIS_MNEMONIC_XSHA256,\n    ZYDIS_MNEMONIC_XSTORE,\n    ZYDIS_MNEMONIC_XSUSLDTRK,\n    ZYDIS_MNEMONIC_XTEST,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_MNEMONIC_MAX_VALUE = ZYDIS_MNEMONIC_XTEST,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_MNEMONIC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MNEMONIC_MAX_VALUE)\n} ZydisMnemonic;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup mnemonic Mnemonic\n * Functions for retrieving mnemonic names.\n * @{\n */\n\n/**\n * Returns the specified instruction mnemonic string.\n *\n * @param   mnemonic    The mnemonic.\n *\n * @return  The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.\n */\nZYDIS_EXPORT const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic);\n\n/**\n * Returns the specified instruction mnemonic as `ZydisShortString`.\n *\n * @param   mnemonic    The mnemonic.\n *\n * @return  The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.\n *\n * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.\n */\nZYDIS_EXPORT const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic);\n\n/**\n * @}\n */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_MNEMONIC_H */\n\n//\n// Header: Zydis/Register.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Utility functions and constants for registers.\n */\n\n#ifndef ZYDIS_REGISTER_H\n#define ZYDIS_REGISTER_H\n\n\n//\n// Header: Zydis/SharedTypes.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/Register.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Defines decoder/encoder-shared macros and types.\n */\n\n#ifndef ZYDIS_SHAREDTYPES_H\n#define ZYDIS_SHAREDTYPES_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constants                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n#define ZYDIS_MAX_INSTRUCTION_LENGTH    15\n#define ZYDIS_MAX_OPERAND_COUNT         10 // TODO: Auto generate\n#define ZYDIS_MAX_OPERAND_COUNT_VISIBLE  5 // TODO: Auto generate\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Machine mode                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisMachineMode` enum.\n */\ntypedef enum ZydisMachineMode_\n{\n    /**\n     * 64 bit mode.\n     */\n    ZYDIS_MACHINE_MODE_LONG_64,\n    /**\n     * 32 bit protected mode.\n     */\n    ZYDIS_MACHINE_MODE_LONG_COMPAT_32,\n    /**\n     * 16 bit protected mode.\n     */\n    ZYDIS_MACHINE_MODE_LONG_COMPAT_16,\n    /**\n     * 32 bit protected mode.\n     */\n    ZYDIS_MACHINE_MODE_LEGACY_32,\n    /**\n     * 16 bit protected mode.\n     */\n    ZYDIS_MACHINE_MODE_LEGACY_16,\n    /**\n     * 16 bit real mode.\n     */\n    ZYDIS_MACHINE_MODE_REAL_16,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_MACHINE_MODE_MAX_VALUE = ZYDIS_MACHINE_MODE_REAL_16,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_MACHINE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MACHINE_MODE_MAX_VALUE)\n} ZydisMachineMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Stack width                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisStackWidth` enum.\n */\ntypedef enum ZydisStackWidth_\n{\n    ZYDIS_STACK_WIDTH_16,\n    ZYDIS_STACK_WIDTH_32,\n    ZYDIS_STACK_WIDTH_64,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_STACK_WIDTH_MAX_VALUE = ZYDIS_STACK_WIDTH_64,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_STACK_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_STACK_WIDTH_MAX_VALUE)\n} ZydisStackWidth;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Element type                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisElementType` enum.\n */\ntypedef enum ZydisElementType_\n{\n    ZYDIS_ELEMENT_TYPE_INVALID,\n    /**\n     * A struct type.\n     */\n    ZYDIS_ELEMENT_TYPE_STRUCT,\n    /**\n     * Unsigned integer value.\n     */\n    ZYDIS_ELEMENT_TYPE_UINT,\n    /**\n     * Signed integer value.\n     */\n    ZYDIS_ELEMENT_TYPE_INT,\n    /**\n     * 16-bit floating point value (`half`).\n     */\n    ZYDIS_ELEMENT_TYPE_FLOAT16,\n    /**\n     * 32-bit floating point value (`single`).\n     */\n    ZYDIS_ELEMENT_TYPE_FLOAT32,\n    /**\n     * 64-bit floating point value (`double`).\n     */\n    ZYDIS_ELEMENT_TYPE_FLOAT64,\n    /**\n     * 80-bit floating point value (`extended`).\n     */\n    ZYDIS_ELEMENT_TYPE_FLOAT80,\n    /**\n     * 16-bit brain floating point value.\n     */\n    ZYDIS_ELEMENT_TYPE_BFLOAT16,\n    /**\n     * Binary coded decimal value.\n     */\n    ZYDIS_ELEMENT_TYPE_LONGBCD,\n    /**\n     * A condition code (e.g. used by `CMPPD`, `VCMPPD`, ...).\n     */\n    ZYDIS_ELEMENT_TYPE_CC,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ELEMENT_TYPE_MAX_VALUE = ZYDIS_ELEMENT_TYPE_CC,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ELEMENT_TYPE_MAX_VALUE)\n} ZydisElementType;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Element size                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisElementSize` datatype.\n */\ntypedef ZyanU16 ZydisElementSize;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Operand type                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOperandType` enum.\n */\ntypedef enum ZydisOperandType_\n{\n    /**\n     * The operand is not used.\n     */\n    ZYDIS_OPERAND_TYPE_UNUSED,\n    /**\n     * The operand is a register operand.\n     */\n    ZYDIS_OPERAND_TYPE_REGISTER,\n    /**\n     * The operand is a memory operand.\n     */\n    ZYDIS_OPERAND_TYPE_MEMORY,\n    /**\n     * The operand is a pointer operand with a segment:offset lvalue.\n     */\n    ZYDIS_OPERAND_TYPE_POINTER,\n    /**\n     * The operand is an immediate operand.\n     */\n    ZYDIS_OPERAND_TYPE_IMMEDIATE,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_OPERAND_TYPE_MAX_VALUE = ZYDIS_OPERAND_TYPE_IMMEDIATE,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_OPERAND_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_TYPE_MAX_VALUE)\n} ZydisOperandType;\n\n// If asserts are failing here remember to update encoder table generator before fixing asserts\nZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(\n    ZYDIS_OPERAND_TYPE_MAX_VALUE - ZYDIS_OPERAND_TYPE_REGISTER) == 2);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Operand encoding                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOperandEncoding` enum.\n */\ntypedef enum ZydisOperandEncoding_\n{\n    ZYDIS_OPERAND_ENCODING_NONE,\n    ZYDIS_OPERAND_ENCODING_MODRM_REG,\n    ZYDIS_OPERAND_ENCODING_MODRM_RM,\n    ZYDIS_OPERAND_ENCODING_OPCODE,\n    ZYDIS_OPERAND_ENCODING_NDSNDD,\n    ZYDIS_OPERAND_ENCODING_IS4,\n    ZYDIS_OPERAND_ENCODING_MASK,\n    ZYDIS_OPERAND_ENCODING_DISP8,\n    ZYDIS_OPERAND_ENCODING_DISP16,\n    ZYDIS_OPERAND_ENCODING_DISP32,\n    ZYDIS_OPERAND_ENCODING_DISP64,\n    ZYDIS_OPERAND_ENCODING_DISP16_32_64,\n    ZYDIS_OPERAND_ENCODING_DISP32_32_64,\n    ZYDIS_OPERAND_ENCODING_DISP16_32_32,\n    ZYDIS_OPERAND_ENCODING_UIMM8,\n    ZYDIS_OPERAND_ENCODING_UIMM16,\n    ZYDIS_OPERAND_ENCODING_UIMM32,\n    ZYDIS_OPERAND_ENCODING_UIMM64,\n    ZYDIS_OPERAND_ENCODING_UIMM16_32_64,\n    ZYDIS_OPERAND_ENCODING_UIMM32_32_64,\n    ZYDIS_OPERAND_ENCODING_UIMM16_32_32,\n    ZYDIS_OPERAND_ENCODING_SIMM8,\n    ZYDIS_OPERAND_ENCODING_SIMM16,\n    ZYDIS_OPERAND_ENCODING_SIMM32,\n    ZYDIS_OPERAND_ENCODING_SIMM64,\n    ZYDIS_OPERAND_ENCODING_SIMM16_32_64,\n    ZYDIS_OPERAND_ENCODING_SIMM32_32_64,\n    ZYDIS_OPERAND_ENCODING_SIMM16_32_32,\n    ZYDIS_OPERAND_ENCODING_JIMM8,\n    ZYDIS_OPERAND_ENCODING_JIMM16,\n    ZYDIS_OPERAND_ENCODING_JIMM32,\n    ZYDIS_OPERAND_ENCODING_JIMM64,\n    ZYDIS_OPERAND_ENCODING_JIMM16_32_64,\n    ZYDIS_OPERAND_ENCODING_JIMM32_32_64,\n    ZYDIS_OPERAND_ENCODING_JIMM16_32_32,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_OPERAND_ENCODING_MAX_VALUE = ZYDIS_OPERAND_ENCODING_JIMM16_32_32,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_OPERAND_ENCODING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ENCODING_MAX_VALUE)\n} ZydisOperandEncoding;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Operand visibility                                                                             */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOperandVisibility` enum.\n */\ntypedef enum ZydisOperandVisibility_\n{\n    ZYDIS_OPERAND_VISIBILITY_INVALID,\n    /**\n     * The operand is explicitly encoded in the instruction.\n     */\n    ZYDIS_OPERAND_VISIBILITY_EXPLICIT,\n    /**\n     * The operand is part of the opcode, but listed as an operand.\n     */\n    ZYDIS_OPERAND_VISIBILITY_IMPLICIT,\n    /**\n     * The operand is part of the opcode, and not typically listed as an operand.\n     */\n    ZYDIS_OPERAND_VISIBILITY_HIDDEN,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_OPERAND_VISIBILITY_MAX_VALUE = ZYDIS_OPERAND_VISIBILITY_HIDDEN,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS =\n        ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_VISIBILITY_MAX_VALUE)\n} ZydisOperandVisibility;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Operand action                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOperandAction` enum.\n */\ntypedef enum ZydisOperandAction_\n{\n    /* ------------------------------------------------------------------------------------------ */\n    /* Elemental actions                                                                          */\n    /* ------------------------------------------------------------------------------------------ */\n\n    /**\n     * The operand is read by the instruction.\n     */\n    ZYDIS_OPERAND_ACTION_READ       = 0x01,\n    /**\n     * The operand is written by the instruction (must write).\n     */\n    ZYDIS_OPERAND_ACTION_WRITE      = 0x02,\n    /**\n     * The operand is conditionally read by the instruction.\n     */\n    ZYDIS_OPERAND_ACTION_CONDREAD   = 0x04,\n    /**\n     * The operand is conditionally written by the instruction (may write).\n     */\n    ZYDIS_OPERAND_ACTION_CONDWRITE  = 0x08,\n\n    /* ------------------------------------------------------------------------------------------ */\n    /* Combined actions                                                                           */\n    /* ------------------------------------------------------------------------------------------ */\n\n    /**\n     * The operand is read (must read) and written by the instruction (must write).\n     */\n    ZYDIS_OPERAND_ACTION_READWRITE = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_WRITE,\n    /**\n     * The operand is conditionally read (may read) and conditionally written by\n     * the instruction (may write).\n     */\n    ZYDIS_OPERAND_ACTION_CONDREAD_CONDWRITE =\n        ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_CONDWRITE,\n    /**\n     * The operand is read (must read) and conditionally written by the\n     * instruction (may write).\n     */\n    ZYDIS_OPERAND_ACTION_READ_CONDWRITE =\n        ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDWRITE,\n    /**\n     * The operand is written (must write) and conditionally read by the\n     * instruction (may read).\n     */\n    ZYDIS_OPERAND_ACTION_CONDREAD_WRITE =\n        ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_WRITE,\n\n    /**\n     * Mask combining all reading access flags.\n     */\n    ZYDIS_OPERAND_ACTION_MASK_READ  = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDREAD,\n    /**\n     * Mask combining all writing access flags.\n     */\n    ZYDIS_OPERAND_ACTION_MASK_WRITE = ZYDIS_OPERAND_ACTION_WRITE | ZYDIS_OPERAND_ACTION_CONDWRITE,\n\n    /* ------------------------------------------------------------------------------------------ */\n\n    /**\n     * The minimum number of bits required to represent all values of this bitset.\n     */\n    ZYDIS_OPERAND_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ACTION_CONDWRITE)\n} ZydisOperandAction;\n\n/**\n * Defines the `ZydisOperandActions` data-type.\n */\ntypedef ZyanU8 ZydisOperandActions;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Instruction encoding                                                                           */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisInstructionEncoding` enum.\n */\ntypedef enum ZydisInstructionEncoding_\n{\n    /**\n     * The instruction uses the legacy encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_LEGACY,\n    /**\n     * The instruction uses the AMD 3DNow-encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_3DNOW,\n    /**\n     * The instruction uses the AMD XOP-encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_XOP,\n    /**\n     * The instruction uses the VEX-encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_VEX,\n    /**\n     * The instruction uses the EVEX-encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_EVEX,\n    /**\n     * The instruction uses the MVEX-encoding.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_MVEX,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE = ZYDIS_INSTRUCTION_ENCODING_MVEX,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_INSTRUCTION_ENCODING_REQUIRED_BITS =\n        ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE)\n} ZydisInstructionEncoding;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Opcode map                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOpcodeMap` enum.\n */\ntypedef enum ZydisOpcodeMap_\n{\n    ZYDIS_OPCODE_MAP_DEFAULT,\n    ZYDIS_OPCODE_MAP_0F,\n    ZYDIS_OPCODE_MAP_0F38,\n    ZYDIS_OPCODE_MAP_0F3A,\n    ZYDIS_OPCODE_MAP_MAP4, // not used\n    ZYDIS_OPCODE_MAP_MAP5,\n    ZYDIS_OPCODE_MAP_MAP6,\n    ZYDIS_OPCODE_MAP_MAP7, // not used\n    ZYDIS_OPCODE_MAP_0F0F,\n    ZYDIS_OPCODE_MAP_XOP8,\n    ZYDIS_OPCODE_MAP_XOP9,\n    ZYDIS_OPCODE_MAP_XOPA,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_OPCODE_MAP_MAX_VALUE = ZYDIS_OPCODE_MAP_XOPA,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_OPCODE_MAP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPCODE_MAP_MAX_VALUE)\n} ZydisOpcodeMap;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Instruction attributes                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * @defgroup instruction_attributes Instruction attributes\n *\n * Constants describing various properties of an instruction. Used in the\n * @ref ZydisDecodedInstruction.attributes and @ref ZydisEncoderRequest.prefixes fields.\n *\n * @{\n */\n\n/**\n * Defines the `ZydisInstructionAttributes` data-type.\n */\ntypedef ZyanU64 ZydisInstructionAttributes;\n\n/**\n * The instruction has the `ModRM` byte.\n */\n#define ZYDIS_ATTRIB_HAS_MODRM                  (1ULL <<  0)\n/**\n * The instruction has the `SIB` byte.\n */\n#define ZYDIS_ATTRIB_HAS_SIB                    (1ULL <<  1)\n/**\n * The instruction has the `REX` prefix.\n */\n#define ZYDIS_ATTRIB_HAS_REX                    (1ULL <<  2)\n/**\n * The instruction has the `XOP` prefix.\n */\n#define ZYDIS_ATTRIB_HAS_XOP                    (1ULL <<  3)\n/**\n * The instruction has the `VEX` prefix.\n */\n#define ZYDIS_ATTRIB_HAS_VEX                    (1ULL <<  4)\n/**\n * The instruction has the `EVEX` prefix.\n */\n#define ZYDIS_ATTRIB_HAS_EVEX                   (1ULL <<  5)\n/**\n * The instruction has the `MVEX` prefix.\n */\n#define ZYDIS_ATTRIB_HAS_MVEX                   (1ULL <<  6)\n/**\n * The instruction has one or more operands with position-relative offsets.\n */\n#define ZYDIS_ATTRIB_IS_RELATIVE                (1ULL <<  7)\n/**\n * The instruction is privileged.\n *\n * Privileged instructions are any instructions that require a current ring level below 3.\n */\n#define ZYDIS_ATTRIB_IS_PRIVILEGED              (1ULL <<  8)\n/**\n * The instruction accesses one or more CPU-flags.\n */\n#define ZYDIS_ATTRIB_CPUFLAG_ACCESS             (1ULL <<  9)\n/**\n * The instruction may conditionally read the general CPU state.\n */\n#define ZYDIS_ATTRIB_CPU_STATE_CR               (1ULL << 10)\n/**\n * The instruction may conditionally write the general CPU state.\n */\n#define ZYDIS_ATTRIB_CPU_STATE_CW               (1ULL << 11)\n/**\n * The instruction may conditionally read the FPU state (X87, MMX).\n */\n#define ZYDIS_ATTRIB_FPU_STATE_CR               (1ULL << 12)\n/**\n * The instruction may conditionally write the FPU state (X87, MMX).\n */\n#define ZYDIS_ATTRIB_FPU_STATE_CW               (1ULL << 13)\n/**\n * The instruction may conditionally read the XMM state (AVX, AVX2, AVX-512).\n */\n#define ZYDIS_ATTRIB_XMM_STATE_CR               (1ULL << 14)\n/**\n * The instruction may conditionally write the XMM state (AVX, AVX2, AVX-512).\n */\n#define ZYDIS_ATTRIB_XMM_STATE_CW               (1ULL << 15)\n/**\n * The instruction accepts the `LOCK` prefix (`0xF0`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_LOCK               (1ULL << 16)\n/**\n * The instruction accepts the `REP` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_REP                (1ULL << 17)\n/**\n * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_REPE               (1ULL << 18)\n/**\n * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_REPZ               ZYDIS_ATTRIB_ACCEPTS_REPE\n/**\n * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_REPNE              (1ULL << 19)\n/**\n * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_REPNZ              ZYDIS_ATTRIB_ACCEPTS_REPNE\n/**\n * The instruction accepts the `BND` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_BND                (1ULL << 20)\n/**\n * The instruction accepts the `XACQUIRE` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE           (1ULL << 21)\n/**\n * The instruction accepts the `XRELEASE` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE           (1ULL << 22)\n/**\n * The instruction accepts the `XACQUIRE`/`XRELEASE` prefixes (`0xF2`, `0xF3`)\n * without the `LOCK` prefix (`0x0F`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK   (1ULL << 23)\n/**\n * The instruction accepts branch hints (0x2E, 0x3E).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS       (1ULL << 24)\n/**\n * The instruction accepts the `CET` `no-track` prefix (`0x3E`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_NOTRACK            (1ULL << 25)\n/**\n * The instruction accepts segment prefixes (`0x2E`, `0x36`, `0x3E`, `0x26`,\n * `0x64`, `0x65`).\n */\n#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT            (1ULL << 26)\n/**\n * The instruction has the `LOCK` prefix (`0xF0`).\n */\n#define ZYDIS_ATTRIB_HAS_LOCK                   (1ULL << 27)\n/**\n * The instruction has the `REP` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_HAS_REP                    (1ULL << 28)\n/**\n * The instruction has the `REPE`/`REPZ` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_HAS_REPE                   (1ULL << 29)\n/**\n * The instruction has the `REPE`/`REPZ` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_HAS_REPZ                   ZYDIS_ATTRIB_HAS_REPE\n/**\n * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_HAS_REPNE                  (1ULL << 30)\n/**\n * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_HAS_REPNZ                  ZYDIS_ATTRIB_HAS_REPNE\n/**\n * The instruction has the `BND` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_HAS_BND                    (1ULL << 31)\n/**\n * The instruction has the `XACQUIRE` prefix (`0xF2`).\n */\n#define ZYDIS_ATTRIB_HAS_XACQUIRE               (1ULL << 32)\n/**\n * The instruction has the `XRELEASE` prefix (`0xF3`).\n */\n#define ZYDIS_ATTRIB_HAS_XRELEASE               (1ULL << 33)\n/**\n * The instruction has the branch-not-taken hint (`0x2E`).\n */\n#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN       (1ULL << 34)\n/**\n * The instruction has the branch-taken hint (`0x3E`).\n */\n#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN           (1ULL << 35)\n/**\n * The instruction has the `CET` `no-track` prefix (`0x3E`).\n */\n#define ZYDIS_ATTRIB_HAS_NOTRACK                (1ULL << 36)\n/**\n * The instruction has the `CS` segment modifier (`0x2E`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_CS             (1ULL << 37)\n/**\n * The instruction has the `SS` segment modifier (`0x36`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_SS             (1ULL << 38)\n/**\n * The instruction has the `DS` segment modifier (`0x3E`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_DS             (1ULL << 39)\n/**\n * The instruction has the `ES` segment modifier (`0x26`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_ES             (1ULL << 40)\n/**\n * The instruction has the `FS` segment modifier (`0x64`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_FS             (1ULL << 41)\n/**\n * The instruction has the `GS` segment modifier (`0x65`).\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT_GS             (1ULL << 42)\n/**\n * The instruction has a segment modifier.\n */\n#define ZYDIS_ATTRIB_HAS_SEGMENT                (ZYDIS_ATTRIB_HAS_SEGMENT_CS | \\\n                                                 ZYDIS_ATTRIB_HAS_SEGMENT_SS | \\\n                                                 ZYDIS_ATTRIB_HAS_SEGMENT_DS | \\\n                                                 ZYDIS_ATTRIB_HAS_SEGMENT_ES | \\\n                                                 ZYDIS_ATTRIB_HAS_SEGMENT_FS | \\\n                                                 ZYDIS_ATTRIB_HAS_SEGMENT_GS)\n/**\n * The instruction has the operand-size override prefix (`0x66`).\n */\n#define ZYDIS_ATTRIB_HAS_OPERANDSIZE            (1ULL << 43) // TODO: rename\n/**\n * The instruction has the address-size override prefix (`0x67`).\n */\n#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE            (1ULL << 44) // TODO: rename\n/**\n * The instruction has the `EVEX.b` bit set.\n *\n * This attribute is mainly used by the encoder.\n */\n#define ZYDIS_ATTRIB_HAS_EVEX_B                 (1ULL << 45) // TODO: rename\n\n/**\n * @}\n */\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_SHAREDTYPES_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Registers                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n\n//\n// Header: Zydis/Generated/EnumRegister.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/DecoderTypes.h\n//   - Zydis/Register.h\n//\n\n/**\n * Defines the `ZydisRegister` enum.\n */\ntypedef enum ZydisRegister_\n{\n    ZYDIS_REGISTER_NONE,\n\n    // General purpose registers  8-bit\n    ZYDIS_REGISTER_AL,\n    ZYDIS_REGISTER_CL,\n    ZYDIS_REGISTER_DL,\n    ZYDIS_REGISTER_BL,\n    ZYDIS_REGISTER_AH,\n    ZYDIS_REGISTER_CH,\n    ZYDIS_REGISTER_DH,\n    ZYDIS_REGISTER_BH,\n    ZYDIS_REGISTER_SPL,\n    ZYDIS_REGISTER_BPL,\n    ZYDIS_REGISTER_SIL,\n    ZYDIS_REGISTER_DIL,\n    ZYDIS_REGISTER_R8B,\n    ZYDIS_REGISTER_R9B,\n    ZYDIS_REGISTER_R10B,\n    ZYDIS_REGISTER_R11B,\n    ZYDIS_REGISTER_R12B,\n    ZYDIS_REGISTER_R13B,\n    ZYDIS_REGISTER_R14B,\n    ZYDIS_REGISTER_R15B,\n\n    // General purpose registers 16-bit\n    ZYDIS_REGISTER_AX,\n    ZYDIS_REGISTER_CX,\n    ZYDIS_REGISTER_DX,\n    ZYDIS_REGISTER_BX,\n    ZYDIS_REGISTER_SP,\n    ZYDIS_REGISTER_BP,\n    ZYDIS_REGISTER_SI,\n    ZYDIS_REGISTER_DI,\n    ZYDIS_REGISTER_R8W,\n    ZYDIS_REGISTER_R9W,\n    ZYDIS_REGISTER_R10W,\n    ZYDIS_REGISTER_R11W,\n    ZYDIS_REGISTER_R12W,\n    ZYDIS_REGISTER_R13W,\n    ZYDIS_REGISTER_R14W,\n    ZYDIS_REGISTER_R15W,\n\n    // General purpose registers 32-bit\n    ZYDIS_REGISTER_EAX,\n    ZYDIS_REGISTER_ECX,\n    ZYDIS_REGISTER_EDX,\n    ZYDIS_REGISTER_EBX,\n    ZYDIS_REGISTER_ESP,\n    ZYDIS_REGISTER_EBP,\n    ZYDIS_REGISTER_ESI,\n    ZYDIS_REGISTER_EDI,\n    ZYDIS_REGISTER_R8D,\n    ZYDIS_REGISTER_R9D,\n    ZYDIS_REGISTER_R10D,\n    ZYDIS_REGISTER_R11D,\n    ZYDIS_REGISTER_R12D,\n    ZYDIS_REGISTER_R13D,\n    ZYDIS_REGISTER_R14D,\n    ZYDIS_REGISTER_R15D,\n\n    // General purpose registers 64-bit\n    ZYDIS_REGISTER_RAX,\n    ZYDIS_REGISTER_RCX,\n    ZYDIS_REGISTER_RDX,\n    ZYDIS_REGISTER_RBX,\n    ZYDIS_REGISTER_RSP,\n    ZYDIS_REGISTER_RBP,\n    ZYDIS_REGISTER_RSI,\n    ZYDIS_REGISTER_RDI,\n    ZYDIS_REGISTER_R8,\n    ZYDIS_REGISTER_R9,\n    ZYDIS_REGISTER_R10,\n    ZYDIS_REGISTER_R11,\n    ZYDIS_REGISTER_R12,\n    ZYDIS_REGISTER_R13,\n    ZYDIS_REGISTER_R14,\n    ZYDIS_REGISTER_R15,\n\n    // Floating point legacy registers\n    ZYDIS_REGISTER_ST0,\n    ZYDIS_REGISTER_ST1,\n    ZYDIS_REGISTER_ST2,\n    ZYDIS_REGISTER_ST3,\n    ZYDIS_REGISTER_ST4,\n    ZYDIS_REGISTER_ST5,\n    ZYDIS_REGISTER_ST6,\n    ZYDIS_REGISTER_ST7,\n    ZYDIS_REGISTER_X87CONTROL,\n    ZYDIS_REGISTER_X87STATUS,\n    ZYDIS_REGISTER_X87TAG,\n\n    // Floating point multimedia registers\n    ZYDIS_REGISTER_MM0,\n    ZYDIS_REGISTER_MM1,\n    ZYDIS_REGISTER_MM2,\n    ZYDIS_REGISTER_MM3,\n    ZYDIS_REGISTER_MM4,\n    ZYDIS_REGISTER_MM5,\n    ZYDIS_REGISTER_MM6,\n    ZYDIS_REGISTER_MM7,\n\n    // Floating point vector registers 128-bit\n    ZYDIS_REGISTER_XMM0,\n    ZYDIS_REGISTER_XMM1,\n    ZYDIS_REGISTER_XMM2,\n    ZYDIS_REGISTER_XMM3,\n    ZYDIS_REGISTER_XMM4,\n    ZYDIS_REGISTER_XMM5,\n    ZYDIS_REGISTER_XMM6,\n    ZYDIS_REGISTER_XMM7,\n    ZYDIS_REGISTER_XMM8,\n    ZYDIS_REGISTER_XMM9,\n    ZYDIS_REGISTER_XMM10,\n    ZYDIS_REGISTER_XMM11,\n    ZYDIS_REGISTER_XMM12,\n    ZYDIS_REGISTER_XMM13,\n    ZYDIS_REGISTER_XMM14,\n    ZYDIS_REGISTER_XMM15,\n    ZYDIS_REGISTER_XMM16,\n    ZYDIS_REGISTER_XMM17,\n    ZYDIS_REGISTER_XMM18,\n    ZYDIS_REGISTER_XMM19,\n    ZYDIS_REGISTER_XMM20,\n    ZYDIS_REGISTER_XMM21,\n    ZYDIS_REGISTER_XMM22,\n    ZYDIS_REGISTER_XMM23,\n    ZYDIS_REGISTER_XMM24,\n    ZYDIS_REGISTER_XMM25,\n    ZYDIS_REGISTER_XMM26,\n    ZYDIS_REGISTER_XMM27,\n    ZYDIS_REGISTER_XMM28,\n    ZYDIS_REGISTER_XMM29,\n    ZYDIS_REGISTER_XMM30,\n    ZYDIS_REGISTER_XMM31,\n\n    // Floating point vector registers 256-bit\n    ZYDIS_REGISTER_YMM0,\n    ZYDIS_REGISTER_YMM1,\n    ZYDIS_REGISTER_YMM2,\n    ZYDIS_REGISTER_YMM3,\n    ZYDIS_REGISTER_YMM4,\n    ZYDIS_REGISTER_YMM5,\n    ZYDIS_REGISTER_YMM6,\n    ZYDIS_REGISTER_YMM7,\n    ZYDIS_REGISTER_YMM8,\n    ZYDIS_REGISTER_YMM9,\n    ZYDIS_REGISTER_YMM10,\n    ZYDIS_REGISTER_YMM11,\n    ZYDIS_REGISTER_YMM12,\n    ZYDIS_REGISTER_YMM13,\n    ZYDIS_REGISTER_YMM14,\n    ZYDIS_REGISTER_YMM15,\n    ZYDIS_REGISTER_YMM16,\n    ZYDIS_REGISTER_YMM17,\n    ZYDIS_REGISTER_YMM18,\n    ZYDIS_REGISTER_YMM19,\n    ZYDIS_REGISTER_YMM20,\n    ZYDIS_REGISTER_YMM21,\n    ZYDIS_REGISTER_YMM22,\n    ZYDIS_REGISTER_YMM23,\n    ZYDIS_REGISTER_YMM24,\n    ZYDIS_REGISTER_YMM25,\n    ZYDIS_REGISTER_YMM26,\n    ZYDIS_REGISTER_YMM27,\n    ZYDIS_REGISTER_YMM28,\n    ZYDIS_REGISTER_YMM29,\n    ZYDIS_REGISTER_YMM30,\n    ZYDIS_REGISTER_YMM31,\n\n    // Floating point vector registers 512-bit\n    ZYDIS_REGISTER_ZMM0,\n    ZYDIS_REGISTER_ZMM1,\n    ZYDIS_REGISTER_ZMM2,\n    ZYDIS_REGISTER_ZMM3,\n    ZYDIS_REGISTER_ZMM4,\n    ZYDIS_REGISTER_ZMM5,\n    ZYDIS_REGISTER_ZMM6,\n    ZYDIS_REGISTER_ZMM7,\n    ZYDIS_REGISTER_ZMM8,\n    ZYDIS_REGISTER_ZMM9,\n    ZYDIS_REGISTER_ZMM10,\n    ZYDIS_REGISTER_ZMM11,\n    ZYDIS_REGISTER_ZMM12,\n    ZYDIS_REGISTER_ZMM13,\n    ZYDIS_REGISTER_ZMM14,\n    ZYDIS_REGISTER_ZMM15,\n    ZYDIS_REGISTER_ZMM16,\n    ZYDIS_REGISTER_ZMM17,\n    ZYDIS_REGISTER_ZMM18,\n    ZYDIS_REGISTER_ZMM19,\n    ZYDIS_REGISTER_ZMM20,\n    ZYDIS_REGISTER_ZMM21,\n    ZYDIS_REGISTER_ZMM22,\n    ZYDIS_REGISTER_ZMM23,\n    ZYDIS_REGISTER_ZMM24,\n    ZYDIS_REGISTER_ZMM25,\n    ZYDIS_REGISTER_ZMM26,\n    ZYDIS_REGISTER_ZMM27,\n    ZYDIS_REGISTER_ZMM28,\n    ZYDIS_REGISTER_ZMM29,\n    ZYDIS_REGISTER_ZMM30,\n    ZYDIS_REGISTER_ZMM31,\n\n    // Matrix registers\n    ZYDIS_REGISTER_TMM0,\n    ZYDIS_REGISTER_TMM1,\n    ZYDIS_REGISTER_TMM2,\n    ZYDIS_REGISTER_TMM3,\n    ZYDIS_REGISTER_TMM4,\n    ZYDIS_REGISTER_TMM5,\n    ZYDIS_REGISTER_TMM6,\n    ZYDIS_REGISTER_TMM7,\n\n    // Flags registers\n    ZYDIS_REGISTER_FLAGS,\n    ZYDIS_REGISTER_EFLAGS,\n    ZYDIS_REGISTER_RFLAGS,\n\n    // Instruction-pointer registers\n    ZYDIS_REGISTER_IP,\n    ZYDIS_REGISTER_EIP,\n    ZYDIS_REGISTER_RIP,\n\n    // Segment registers\n    ZYDIS_REGISTER_ES,\n    ZYDIS_REGISTER_CS,\n    ZYDIS_REGISTER_SS,\n    ZYDIS_REGISTER_DS,\n    ZYDIS_REGISTER_FS,\n    ZYDIS_REGISTER_GS,\n\n    // Table registers\n    ZYDIS_REGISTER_GDTR,\n    ZYDIS_REGISTER_LDTR,\n    ZYDIS_REGISTER_IDTR,\n    ZYDIS_REGISTER_TR,\n\n    // Test registers\n    ZYDIS_REGISTER_TR0,\n    ZYDIS_REGISTER_TR1,\n    ZYDIS_REGISTER_TR2,\n    ZYDIS_REGISTER_TR3,\n    ZYDIS_REGISTER_TR4,\n    ZYDIS_REGISTER_TR5,\n    ZYDIS_REGISTER_TR6,\n    ZYDIS_REGISTER_TR7,\n\n    // Control registers\n    ZYDIS_REGISTER_CR0,\n    ZYDIS_REGISTER_CR1,\n    ZYDIS_REGISTER_CR2,\n    ZYDIS_REGISTER_CR3,\n    ZYDIS_REGISTER_CR4,\n    ZYDIS_REGISTER_CR5,\n    ZYDIS_REGISTER_CR6,\n    ZYDIS_REGISTER_CR7,\n    ZYDIS_REGISTER_CR8,\n    ZYDIS_REGISTER_CR9,\n    ZYDIS_REGISTER_CR10,\n    ZYDIS_REGISTER_CR11,\n    ZYDIS_REGISTER_CR12,\n    ZYDIS_REGISTER_CR13,\n    ZYDIS_REGISTER_CR14,\n    ZYDIS_REGISTER_CR15,\n\n    // Debug registers\n    ZYDIS_REGISTER_DR0,\n    ZYDIS_REGISTER_DR1,\n    ZYDIS_REGISTER_DR2,\n    ZYDIS_REGISTER_DR3,\n    ZYDIS_REGISTER_DR4,\n    ZYDIS_REGISTER_DR5,\n    ZYDIS_REGISTER_DR6,\n    ZYDIS_REGISTER_DR7,\n    ZYDIS_REGISTER_DR8,\n    ZYDIS_REGISTER_DR9,\n    ZYDIS_REGISTER_DR10,\n    ZYDIS_REGISTER_DR11,\n    ZYDIS_REGISTER_DR12,\n    ZYDIS_REGISTER_DR13,\n    ZYDIS_REGISTER_DR14,\n    ZYDIS_REGISTER_DR15,\n\n    // Mask registers\n    ZYDIS_REGISTER_K0,\n    ZYDIS_REGISTER_K1,\n    ZYDIS_REGISTER_K2,\n    ZYDIS_REGISTER_K3,\n    ZYDIS_REGISTER_K4,\n    ZYDIS_REGISTER_K5,\n    ZYDIS_REGISTER_K6,\n    ZYDIS_REGISTER_K7,\n\n    // Bound registers\n    ZYDIS_REGISTER_BND0,\n    ZYDIS_REGISTER_BND1,\n    ZYDIS_REGISTER_BND2,\n    ZYDIS_REGISTER_BND3,\n    ZYDIS_REGISTER_BNDCFG,\n    ZYDIS_REGISTER_BNDSTATUS,\n\n    // Uncategorized\n    ZYDIS_REGISTER_MXCSR,\n    ZYDIS_REGISTER_PKRU,\n    ZYDIS_REGISTER_XCR0,\n    ZYDIS_REGISTER_UIF,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_REGISTER_MAX_VALUE = ZYDIS_REGISTER_UIF,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_REGISTER_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGISTER_MAX_VALUE)\n} ZydisRegister;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register kinds                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisRegisterKind` enum.\n *\n * Please note that this enum does not contain a matching entry for all values of the\n * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them\n * for decoding/encoding purposes.\n *\n * These are mainly the registers that can be identified by an id within their corresponding\n * register-class.\n */\ntypedef enum ZydisRegisterKind_\n{\n    ZYDIS_REGKIND_INVALID,\n    ZYDIS_REGKIND_GPR,\n    ZYDIS_REGKIND_X87,\n    ZYDIS_REGKIND_MMX,\n    ZYDIS_REGKIND_VR,\n    ZYDIS_REGKIND_TMM,\n    ZYDIS_REGKIND_SEGMENT,\n    ZYDIS_REGKIND_TEST,\n    ZYDIS_REGKIND_CONTROL,\n    ZYDIS_REGKIND_DEBUG,\n    ZYDIS_REGKIND_MASK,\n    ZYDIS_REGKIND_BOUND,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_REGKIND_MAX_VALUE = ZYDIS_REGKIND_BOUND,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_REGKIND_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGKIND_MAX_VALUE)\n} ZydisRegisterKind;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register classes                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisRegisterClass` enum.\n *\n * Please note that this enum does not contain a matching entry for all values of the\n * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them\n * for decoding/encoding purposes.\n *\n * These are mainly the registers that can be identified by an id within their corresponding\n * register-class. The `IP` and `FLAGS` values are exceptions to this rule.\n */\ntypedef enum ZydisRegisterClass_\n{\n    ZYDIS_REGCLASS_INVALID,\n    /**\n     * 8-bit general-purpose registers.\n     */\n    ZYDIS_REGCLASS_GPR8,\n    /**\n     * 16-bit general-purpose registers.\n     */\n    ZYDIS_REGCLASS_GPR16,\n    /**\n     * 32-bit general-purpose registers.\n     */\n    ZYDIS_REGCLASS_GPR32,\n    /**\n     * 64-bit general-purpose registers.\n     */\n    ZYDIS_REGCLASS_GPR64,\n    /**\n     * Floating point legacy registers.\n     */\n    ZYDIS_REGCLASS_X87,\n    /**\n     * Floating point multimedia registers.\n     */\n    ZYDIS_REGCLASS_MMX,\n    /**\n     * 128-bit vector registers.\n     */\n    ZYDIS_REGCLASS_XMM,\n    /**\n     * 256-bit vector registers.\n     */\n    ZYDIS_REGCLASS_YMM,\n    /**\n     * 512-bit vector registers.\n     */\n    ZYDIS_REGCLASS_ZMM,\n    /**\n     * Matrix registers.\n     */\n    ZYDIS_REGCLASS_TMM,\n    /*\n     * Flags registers.\n     */\n    ZYDIS_REGCLASS_FLAGS,\n    /**\n     * Instruction-pointer registers.\n     */\n    ZYDIS_REGCLASS_IP,\n    /**\n     * Segment registers.\n     */\n    ZYDIS_REGCLASS_SEGMENT,\n    /**\n     * Table registers.\n    */\n    ZYDIS_REGCLASS_TABLE,\n    /**\n     * Test registers.\n     */\n    ZYDIS_REGCLASS_TEST,\n    /**\n     * Control registers.\n     */\n    ZYDIS_REGCLASS_CONTROL,\n    /**\n     * Debug registers.\n     */\n    ZYDIS_REGCLASS_DEBUG,\n    /**\n     * Mask registers.\n     */\n    ZYDIS_REGCLASS_MASK,\n    /**\n     * Bound registers.\n     */\n    ZYDIS_REGCLASS_BOUND,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_REGCLASS_MAX_VALUE = ZYDIS_REGCLASS_BOUND,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_REGCLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGCLASS_MAX_VALUE)\n} ZydisRegisterClass;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register width                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisRegisterWidth` data-type.\n */\ntypedef ZyanU16 ZydisRegisterWidth;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register context                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisRegisterContext` struct.\n */\ntypedef struct ZydisRegisterContext_\n{\n    /**\n     * The values stored in the register context.\n     */\n    ZyanU64 values[ZYDIS_REGISTER_MAX_VALUE + 1];\n} ZydisRegisterContext;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup register Register\n * Functions allowing retrieval of information about registers.\n * @{\n */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register                                                                                       */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the register specified by the `register_class` and `id` tuple.\n *\n * @param   register_class  The register class.\n * @param   id              The register id.\n *\n * @return  The register specified by the `register_class` and `id` tuple or `ZYDIS_REGISTER_NONE`,\n *          if an invalid parameter was passed.\n */\nZYDIS_EXPORT ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id);\n\n/**\n * Returns the id of the specified register.\n *\n * @param   reg The register.\n *\n * @return  The id of the specified register, or -1 if an invalid parameter was passed.\n */\nZYDIS_EXPORT ZyanI8 ZydisRegisterGetId(ZydisRegister reg);\n\n/**\n * Returns the register-class of the specified register.\n *\n * @param   reg The register.\n *\n * @return  The register-class of the specified register.\n */\nZYDIS_EXPORT ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg);\n\n/**\n * Returns the width of the specified register.\n *\n * @param   mode    The active machine mode.\n * @param   reg     The register.\n *\n * @return  The width of the specified register, or `ZYDIS_REGISTER_NONE` if the register is\n *          invalid for the active machine-mode.\n */\nZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg);\n\n/**\n * Returns the largest enclosing register of the given register.\n *\n * @param   mode    The active machine mode.\n * @param   reg     The register.\n *\n * @return  The largest enclosing register of the given register, or `ZYDIS_REGISTER_NONE` if the\n *          register is invalid for the active machine-mode.\n */\nZYDIS_EXPORT ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode,\n    ZydisRegister reg);\n\n/**\n * Returns the specified register string.\n *\n * @param   reg The register.\n *\n * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.\n */\nZYDIS_EXPORT const char* ZydisRegisterGetString(ZydisRegister reg);\n\n/**\n * Returns the specified register string as `ZydisShortString`.\n *\n * @param   reg The register.\n *\n * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.\n *\n * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.\n */\nZYDIS_EXPORT const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Register class                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the width of the specified register-class.\n *\n * @param   mode            The active machine mode.\n * @param   register_class  The register class.\n *\n * @return  The width of the specified register.\n */\nZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode,\n    ZydisRegisterClass register_class);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * @}\n */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_REGISTER_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Decoded operand                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Operand attributes                                                                             */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisOperandAttributes` data-type.\n */\ntypedef ZyanU8 ZydisOperandAttributes;\n\n/**\n * The operand is a `MULTISOURCE4` register operand.\n *\n * This is a special register operand-type used by `4FMAPS` instructions where the given register\n * points to the first register of a register range (4 registers in total).\n *\n * Example: ZMM3 -> [ZMM3..ZMM6]\n */\n#define ZYDIS_OATTRIB_IS_MULTISOURCE4   0x01 // (1 <<  0)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Memory type                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisMemoryOperandType` enum.\n */\ntypedef enum ZydisMemoryOperandType_\n{\n    ZYDIS_MEMOP_TYPE_INVALID,\n    /**\n     * Normal memory operand.\n     */\n    ZYDIS_MEMOP_TYPE_MEM,\n    /**\n     * The memory operand is only used for address-generation. No real memory-access is\n     * caused.\n     */\n    ZYDIS_MEMOP_TYPE_AGEN,\n    /**\n     * A memory operand using `SIB` addressing form, where the index register is not used\n     * in address calculation and scale is ignored. No real memory-access is caused.\n     */\n    ZYDIS_MEMOP_TYPE_MIB,\n    /**\n     * A vector `SIB` memory addressing operand (`VSIB`).\n     */\n    ZYDIS_MEMOP_TYPE_VSIB,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_VSIB,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_MEMOP_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MEMOP_TYPE_MAX_VALUE)\n} ZydisMemoryOperandType;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoded operand                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Extended info for register-operands.\n */\ntypedef struct ZydisDecodedOperandReg_\n{\n    /**\n     * The register value.\n     */\n    ZydisRegister value;\n} ZydisDecodedOperandReg;\n\n/**\n * Extended info for memory-operands.\n */\ntypedef struct ZydisDecodedOperandMem_\n{\n    /**\n     * The type of the memory operand.\n     */\n    ZydisMemoryOperandType type;\n    /**\n     * The segment register.\n     */\n    ZydisRegister segment;\n    /**\n     * The base register.\n     */\n    ZydisRegister base;\n    /**\n     * The index register.\n     */\n    ZydisRegister index;\n    /**\n     * The scale factor.\n     */\n    ZyanU8 scale;\n    /**\n     * Extended info for memory-operands with displacement.\n     */\n    struct ZydisDecodedOperandMemDisp_\n    {\n        /**\n         * Signals, if the displacement value is used.\n         */\n        ZyanBool has_displacement;\n        /**\n         * The displacement value\n         */\n        ZyanI64 value;\n    } disp;\n} ZydisDecodedOperandMem;\n\n/**\n * Extended info for pointer-operands.\n */\ntypedef struct ZydisDecodedOperandPtr_\n{\n    ZyanU16 segment;\n    ZyanU32 offset;\n} ZydisDecodedOperandPtr;\n\n/**\n * Extended info for immediate-operands.\n */\ntypedef struct ZydisDecodedOperandImm_\n{\n    /**\n     * Signals, if the immediate value is signed.\n     */\n    ZyanBool is_signed;\n    /**\n     * Signals, if the immediate value contains a relative offset. You can use\n     * `ZydisCalcAbsoluteAddress` to determine the absolute address value.\n     */\n    ZyanBool is_relative;\n    /**\n     * The immediate value.\n     */\n    union ZydisDecodedOperandImmValue_\n    {\n        ZyanU64 u;\n        ZyanI64 s;\n    } value;\n} ZydisDecodedOperandImm;\n\n/**\n * Defines the `ZydisDecodedOperand` struct.\n */\ntypedef struct ZydisDecodedOperand_\n{\n    /**\n     * The operand-id.\n     */\n    ZyanU8 id;\n    /**\n     * The visibility of the operand.\n     */\n    ZydisOperandVisibility visibility;\n    /**\n     * The operand-actions.\n     */\n    ZydisOperandActions actions;\n    /**\n     * The operand-encoding.\n     */\n    ZydisOperandEncoding encoding;\n    /**\n     * The logical size of the operand (in bits).\n     */\n    ZyanU16 size;\n    /**\n     * The element-type.\n     */\n    ZydisElementType element_type;\n    /**\n     * The size of a single element.\n     */\n    ZydisElementSize element_size;\n    /**\n     * The number of elements.\n     */\n    ZyanU16 element_count;\n    /*\n     * Additional operand attributes.\n     */\n    ZydisOperandAttributes attributes;\n    /**\n     * The type of the operand.\n     */\n    ZydisOperandType type;\n    /*\n     * Operand type specific information.\n     *\n     * The enabled union variant is determined by the `type` field.\n     */\n    union\n    {\n        ZydisDecodedOperandReg reg;\n        ZydisDecodedOperandMem mem;\n        ZydisDecodedOperandPtr ptr;\n        ZydisDecodedOperandImm imm;\n    };\n} ZydisDecodedOperand;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Decoded instruction                                                                            */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* CPU/FPU flags                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisAccessedFlagsMask` data-type.\n */\ntypedef ZyanU32 ZydisAccessedFlagsMask;\n\n/**\n * @defgroup decoder_cpu_flags CPU flags\n * @ingroup decoder\n *\n * Constants used for testing CPU flags accessed by an instruction.\n *\n * @{\n */\n\n/**\n * Carry flag.\n */\n#define ZYDIS_CPUFLAG_CF    (1ul <<  0)\n/**\n * Parity flag.\n */\n#define ZYDIS_CPUFLAG_PF    (1ul <<  2)\n/**\n * Adjust flag.\n */\n#define ZYDIS_CPUFLAG_AF    (1ul <<  4)\n/**\n * Zero flag.\n */\n#define ZYDIS_CPUFLAG_ZF    (1ul <<  6)\n/**\n * Sign flag.\n */\n#define ZYDIS_CPUFLAG_SF    (1ul <<  7)\n/**\n * Trap flag.\n */\n#define ZYDIS_CPUFLAG_TF    (1ul <<  8)\n/**\n * Interrupt enable flag.\n */\n#define ZYDIS_CPUFLAG_IF    (1ul <<  9)\n/**\n * Direction flag.\n */\n#define ZYDIS_CPUFLAG_DF    (1ul << 10)\n/**\n * Overflow flag.\n */\n#define ZYDIS_CPUFLAG_OF    (1ul << 11)\n/**\n * I/O privilege level flag.\n */\n#define ZYDIS_CPUFLAG_IOPL  (1ul << 12)\n/**\n * Nested task flag.\n */\n#define ZYDIS_CPUFLAG_NT    (1ul << 14)\n/**\n * Resume flag.\n */\n#define ZYDIS_CPUFLAG_RF    (1ul << 16)\n/**\n * Virtual 8086 mode flag.\n */\n#define ZYDIS_CPUFLAG_VM    (1ul << 17)\n/**\n * Alignment check.\n */\n#define ZYDIS_CPUFLAG_AC    (1ul << 18)\n/**\n * Virtual interrupt flag.\n */\n#define ZYDIS_CPUFLAG_VIF   (1ul << 19)\n/**\n * Virtual interrupt pending.\n */\n#define ZYDIS_CPUFLAG_VIP   (1ul << 20)\n/**\n * Able to use CPUID instruction.\n */\n#define ZYDIS_CPUFLAG_ID    (1ul << 21)\n\n/**\n * @}\n */\n\n/**\n * @defgroup decoder_fpu_flags FPU flags\n * @ingroup decoder\n *\n * Constants used for testing FPU flags accessed by an instruction.\n *\n * @{\n */\n\n/**\n * FPU condition-code flag 0.\n */\n#define ZYDIS_FPUFLAG_C0    (1ul <<  0)\n/**\n * FPU condition-code flag 1.\n */\n#define ZYDIS_FPUFLAG_C1    (1ul <<  1)\n /**\n  * FPU condition-code flag 2.\n  */\n#define ZYDIS_FPUFLAG_C2    (1ul <<  2)\n/**\n * FPU condition-code flag 3.\n */\n#define ZYDIS_FPUFLAG_C3    (1ul <<  3)\n\n/**\n * @}\n */\n\n/*\n * Information about CPU/FPU flags accessed by the instruction.\n */\ntypedef struct ZydisAccessedFlags_\n{\n    /*\n     * As mask containing the flags `TESTED` by the instruction.\n     */\n    ZydisAccessedFlagsMask tested;\n    /*\n     * As mask containing the flags `MODIFIED` by the instruction.\n     */\n    ZydisAccessedFlagsMask modified;\n    /*\n     * As mask containing the flags `SET_0` by the instruction.\n     */\n    ZydisAccessedFlagsMask set_0;\n    /*\n     * As mask containing the flags `SET_1` by the instruction.\n     */\n    ZydisAccessedFlagsMask set_1;\n    /*\n     * As mask containing the flags `UNDEFINED` by the instruction.\n     */\n    ZydisAccessedFlagsMask undefined;\n} ZydisAccessedFlags;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Branch types                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisBranchType` enum.\n */\ntypedef enum ZydisBranchType_\n{\n    /**\n     * The instruction is not a branch instruction.\n     */\n    ZYDIS_BRANCH_TYPE_NONE,\n    /**\n     * The instruction is a short (8-bit) branch instruction.\n     */\n    ZYDIS_BRANCH_TYPE_SHORT,\n    /**\n     * The instruction is a near (16-bit or 32-bit) branch instruction.\n     */\n    ZYDIS_BRANCH_TYPE_NEAR,\n    /**\n     * The instruction is a far (inter-segment) branch instruction.\n     */\n    ZYDIS_BRANCH_TYPE_FAR,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_BRANCH_TYPE_MAX_VALUE = ZYDIS_BRANCH_TYPE_FAR,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_BRANCH_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_TYPE_MAX_VALUE)\n} ZydisBranchType;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* SSE/AVX exception-class                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisExceptionClass` enum.\n */\ntypedef enum ZydisExceptionClass_\n{\n    ZYDIS_EXCEPTION_CLASS_NONE,\n    // TODO: FP Exceptions\n    ZYDIS_EXCEPTION_CLASS_SSE1,\n    ZYDIS_EXCEPTION_CLASS_SSE2,\n    ZYDIS_EXCEPTION_CLASS_SSE3,\n    ZYDIS_EXCEPTION_CLASS_SSE4,\n    ZYDIS_EXCEPTION_CLASS_SSE5,\n    ZYDIS_EXCEPTION_CLASS_SSE7,\n    ZYDIS_EXCEPTION_CLASS_AVX1,\n    ZYDIS_EXCEPTION_CLASS_AVX2,\n    ZYDIS_EXCEPTION_CLASS_AVX3,\n    ZYDIS_EXCEPTION_CLASS_AVX4,\n    ZYDIS_EXCEPTION_CLASS_AVX5,\n    ZYDIS_EXCEPTION_CLASS_AVX6,\n    ZYDIS_EXCEPTION_CLASS_AVX7,\n    ZYDIS_EXCEPTION_CLASS_AVX8,\n    ZYDIS_EXCEPTION_CLASS_AVX11,\n    ZYDIS_EXCEPTION_CLASS_AVX12,\n    ZYDIS_EXCEPTION_CLASS_E1,\n    ZYDIS_EXCEPTION_CLASS_E1NF,\n    ZYDIS_EXCEPTION_CLASS_E2,\n    ZYDIS_EXCEPTION_CLASS_E2NF,\n    ZYDIS_EXCEPTION_CLASS_E3,\n    ZYDIS_EXCEPTION_CLASS_E3NF,\n    ZYDIS_EXCEPTION_CLASS_E4,\n    ZYDIS_EXCEPTION_CLASS_E4NF,\n    ZYDIS_EXCEPTION_CLASS_E5,\n    ZYDIS_EXCEPTION_CLASS_E5NF,\n    ZYDIS_EXCEPTION_CLASS_E6,\n    ZYDIS_EXCEPTION_CLASS_E6NF,\n    ZYDIS_EXCEPTION_CLASS_E7NM,\n    ZYDIS_EXCEPTION_CLASS_E7NM128,\n    ZYDIS_EXCEPTION_CLASS_E9NF,\n    ZYDIS_EXCEPTION_CLASS_E10,\n    ZYDIS_EXCEPTION_CLASS_E10NF,\n    ZYDIS_EXCEPTION_CLASS_E11,\n    ZYDIS_EXCEPTION_CLASS_E11NF,\n    ZYDIS_EXCEPTION_CLASS_E12,\n    ZYDIS_EXCEPTION_CLASS_E12NP,\n    ZYDIS_EXCEPTION_CLASS_K20,\n    ZYDIS_EXCEPTION_CLASS_K21,\n    ZYDIS_EXCEPTION_CLASS_AMXE1,\n    ZYDIS_EXCEPTION_CLASS_AMXE2,\n    ZYDIS_EXCEPTION_CLASS_AMXE3,\n    ZYDIS_EXCEPTION_CLASS_AMXE4,\n    ZYDIS_EXCEPTION_CLASS_AMXE5,\n    ZYDIS_EXCEPTION_CLASS_AMXE6,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_EXCEPTION_CLASS_MAX_VALUE = ZYDIS_EXCEPTION_CLASS_AMXE6,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EXCEPTION_CLASS_MAX_VALUE)\n} ZydisExceptionClass;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* AVX mask mode                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisMaskMode` enum.\n */\ntypedef enum ZydisMaskMode_\n{\n    ZYDIS_MASK_MODE_INVALID,\n    /**\n     * Masking is disabled for the current instruction (`K0` register is used).\n     */\n    ZYDIS_MASK_MODE_DISABLED,\n    /**\n     * The embedded mask register is used as a merge-mask.\n     */\n    ZYDIS_MASK_MODE_MERGING,\n    /**\n     * The embedded mask register is used as a zero-mask.\n     */\n    ZYDIS_MASK_MODE_ZEROING,\n    /**\n     * The embedded mask register is used as a control-mask (element selector).\n     */\n    ZYDIS_MASK_MODE_CONTROL,\n    /**\n     * The embedded mask register is used as a zeroing control-mask (element selector).\n     */\n    ZYDIS_MASK_MODE_CONTROL_ZEROING,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_MASK_MODE_MAX_VALUE = ZYDIS_MASK_MODE_CONTROL_ZEROING,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_MASK_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_MODE_MAX_VALUE)\n} ZydisMaskMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* AVX broadcast-mode                                                                             */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisBroadcastMode` enum.\n */\ntypedef enum ZydisBroadcastMode_\n{\n    ZYDIS_BROADCAST_MODE_INVALID,\n    ZYDIS_BROADCAST_MODE_1_TO_2,\n    ZYDIS_BROADCAST_MODE_1_TO_4,\n    ZYDIS_BROADCAST_MODE_1_TO_8,\n    ZYDIS_BROADCAST_MODE_1_TO_16,\n    ZYDIS_BROADCAST_MODE_1_TO_32,\n    ZYDIS_BROADCAST_MODE_1_TO_64,\n    ZYDIS_BROADCAST_MODE_2_TO_4,\n    ZYDIS_BROADCAST_MODE_2_TO_8,\n    ZYDIS_BROADCAST_MODE_2_TO_16,\n    ZYDIS_BROADCAST_MODE_4_TO_8,\n    ZYDIS_BROADCAST_MODE_4_TO_16,\n    ZYDIS_BROADCAST_MODE_8_TO_16,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_BROADCAST_MODE_MAX_VALUE = ZYDIS_BROADCAST_MODE_8_TO_16,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_BROADCAST_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BROADCAST_MODE_MAX_VALUE)\n} ZydisBroadcastMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* AVX rounding-mode                                                                              */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisRoundingMode` enum.\n */\ntypedef enum ZydisRoundingMode_\n{\n    ZYDIS_ROUNDING_MODE_INVALID,\n    /**\n     * Round to nearest.\n     */\n    ZYDIS_ROUNDING_MODE_RN,\n    /**\n     * Round down.\n     */\n    ZYDIS_ROUNDING_MODE_RD,\n    /**\n     * Round up.\n     */\n    ZYDIS_ROUNDING_MODE_RU,\n    /**\n     * Round towards zero.\n     */\n    ZYDIS_ROUNDING_MODE_RZ,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ROUNDING_MODE_MAX_VALUE = ZYDIS_ROUNDING_MODE_RZ,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ROUNDING_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ROUNDING_MODE_MAX_VALUE)\n} ZydisRoundingMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* KNC swizzle-mode                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisSwizzleMode` enum.\n */\ntypedef enum ZydisSwizzleMode_\n{\n    ZYDIS_SWIZZLE_MODE_INVALID,\n    ZYDIS_SWIZZLE_MODE_DCBA,\n    ZYDIS_SWIZZLE_MODE_CDAB,\n    ZYDIS_SWIZZLE_MODE_BADC,\n    ZYDIS_SWIZZLE_MODE_DACB,\n    ZYDIS_SWIZZLE_MODE_AAAA,\n    ZYDIS_SWIZZLE_MODE_BBBB,\n    ZYDIS_SWIZZLE_MODE_CCCC,\n    ZYDIS_SWIZZLE_MODE_DDDD,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_SWIZZLE_MODE_MAX_VALUE = ZYDIS_SWIZZLE_MODE_DDDD,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_SWIZZLE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SWIZZLE_MODE_MAX_VALUE)\n} ZydisSwizzleMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* KNC conversion-mode                                                                            */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisConversionMode` enum.\n */\ntypedef enum ZydisConversionMode_\n{\n    ZYDIS_CONVERSION_MODE_INVALID,\n    ZYDIS_CONVERSION_MODE_FLOAT16,\n    ZYDIS_CONVERSION_MODE_SINT8,\n    ZYDIS_CONVERSION_MODE_UINT8,\n    ZYDIS_CONVERSION_MODE_SINT16,\n    ZYDIS_CONVERSION_MODE_UINT16,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_CONVERSION_MODE_MAX_VALUE = ZYDIS_CONVERSION_MODE_UINT16,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_CONVERSION_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CONVERSION_MODE_MAX_VALUE)\n} ZydisConversionMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Legacy prefix type                                                                             */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisPrefixType` enum.\n */\ntypedef enum ZydisPrefixType_\n{\n    /**\n     * The prefix is ignored by the instruction.\n     *\n     * This applies to all prefixes that are not accepted by the instruction in general or the\n     * ones that are overwritten by a prefix of the same group closer to the instruction opcode.\n     */\n    ZYDIS_PREFIX_TYPE_IGNORED,\n    /**\n     * The prefix is effectively used by the instruction.\n     */\n    ZYDIS_PREFIX_TYPE_EFFECTIVE,\n    /**\n     * The prefix is used as a mandatory prefix.\n     *\n     * A mandatory prefix is interpreted as an opcode extension and has no further effect on the\n     * instruction.\n     */\n    ZYDIS_PREFIX_TYPE_MANDATORY,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_PREFIX_TYPE_MAX_VALUE = ZYDIS_PREFIX_TYPE_MANDATORY,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_PREFIX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PREFIX_TYPE_MAX_VALUE)\n} ZydisPrefixType;\n\n// TODO: Check effective for 66/67 prefixes (currently defaults to EFFECTIVE)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoded instruction                                                                            */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Detailed info about the `REX` prefix.\n */\ntypedef struct ZydisDecodedInstructionRawRex_\n{\n    /**\n     * 64-bit operand-size promotion.\n     */\n    ZyanU8 W;\n    /**\n     * Extension of the `ModRM.reg` field.\n     */\n    ZyanU8 R;\n    /**\n     * Extension of the `SIB.index` field.\n     */\n    ZyanU8 X;\n    /**\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field.\n     */\n    ZyanU8 B;\n    /**\n     * The offset of the effective `REX` byte, relative to the beginning of the\n     * instruction, in bytes.\n     *\n     * This offset always points to the \"effective\" `REX` prefix (the one closest to the\n     * instruction opcode), if multiple `REX` prefixes are present.\n     *\n     * Note that the `REX` byte can be the first byte of the instruction, which would lead\n     * to an offset of `0`. Please refer to the instruction attributes to check for the\n     * presence of the `REX` prefix.\n     */\n    ZyanU8 offset;\n} ZydisDecodedInstructionRawRex;\n\n/**\n * Detailed info about the `XOP` prefix.\n */\ntypedef struct ZydisDecodedInstructionRawXop_\n{\n    /**\n     * Extension of the `ModRM.reg` field (inverted).\n     */\n    ZyanU8 R;\n    /**\n     * Extension of the `SIB.index` field (inverted).\n     */\n    ZyanU8 X;\n    /**\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).\n     */\n    ZyanU8 B;\n    /**\n     * Opcode-map specifier.\n     */\n    ZyanU8 m_mmmm;\n    /**\n     * 64-bit operand-size promotion or opcode-extension.\n     */\n    ZyanU8 W;\n    /**\n     * `NDS`/`NDD` (non-destructive-source/destination) register\n     * specifier (inverted).\n     */\n    ZyanU8 vvvv;\n    /**\n     * Vector-length specifier.\n     */\n    ZyanU8 L;\n    /**\n     * Compressed legacy prefix.\n     */\n    ZyanU8 pp;\n    /**\n     * The offset of the first xop byte, relative to the beginning of\n     * the instruction, in bytes.\n     */\n    ZyanU8 offset;\n} ZydisDecodedInstructionRawXop;\n\n/**\n * Detailed info about the `VEX` prefix.\n */\ntypedef struct ZydisDecodedInstructionRawVex_\n{\n    /**\n     * Extension of the `ModRM.reg` field (inverted).\n     */\n    ZyanU8 R;\n    /**\n     * Extension of the `SIB.index` field (inverted).\n     */\n    ZyanU8 X;\n    /**\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).\n     */\n    ZyanU8 B;\n    /**\n     * Opcode-map specifier.\n     */\n    ZyanU8 m_mmmm;\n    /**\n     * 64-bit operand-size promotion or opcode-extension.\n     */\n    ZyanU8 W;\n    /**\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\n     *  (inverted).\n     */\n    ZyanU8 vvvv;\n    /**\n     * Vector-length specifier.\n     */\n    ZyanU8 L;\n    /**\n     * Compressed legacy prefix.\n     */\n    ZyanU8 pp;\n    /**\n     * The offset of the first `VEX` byte, relative to the beginning of the instruction, in\n     * bytes.\n     */\n    ZyanU8 offset;\n    /**\n     * The size of the `VEX` prefix, in bytes.\n     */\n    ZyanU8 size;\n} ZydisDecodedInstructionRawVex;\n\n/**\n * Detailed info about the `EVEX` prefix.\n */\ntypedef struct ZydisDecodedInstructionRawEvex\n{\n    /**\n     * Extension of the `ModRM.reg` field (inverted).\n     */\n    ZyanU8 R;\n    /**\n     * Extension of the `SIB.index/vidx` field (inverted).\n     */\n    ZyanU8 X;\n    /**\n     * Extension of the `ModRM.rm` or `SIB.base` field (inverted).\n     */\n    ZyanU8 B;\n    /**\n     * High-16 register specifier modifier (inverted).\n     */\n    ZyanU8 R2;\n    /**\n     * Opcode-map specifier.\n     */\n    ZyanU8 mmm;\n    /**\n     * 64-bit operand-size promotion or opcode-extension.\n     */\n    ZyanU8 W;\n    /**\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\n     * (inverted).\n     */\n    ZyanU8 vvvv;\n    /**\n     * Compressed legacy prefix.\n     */\n    ZyanU8 pp;\n    /**\n     * Zeroing/Merging.\n     */\n    ZyanU8 z;\n    /**\n     * Vector-length specifier or rounding-control (most significant bit).\n     */\n    ZyanU8 L2;\n    /**\n     * Vector-length specifier or rounding-control (least significant bit).\n     */\n    ZyanU8 L;\n    /**\n     * Broadcast/RC/SAE context.\n     */\n    ZyanU8 b;\n    /**\n     * High-16 `NDS`/`VIDX` register specifier.\n     */\n    ZyanU8 V2;\n    /**\n     * Embedded opmask register specifier.\n     */\n    ZyanU8 aaa;\n    /**\n     * The offset of the first evex byte, relative to the beginning of the\n     * instruction, in bytes.\n     */\n    ZyanU8 offset;\n} ZydisDecodedInstructionRawEvex;\n\n/**\n * Detailed info about the `MVEX` prefix.\n */\ntypedef struct ZydisDecodedInstructionRawMvex_\n{\n    /**\n     * Extension of the `ModRM.reg` field (inverted).\n     */\n    ZyanU8 R;\n    /**\n     * Extension of the `SIB.index/vidx` field (inverted).\n     */\n    ZyanU8 X;\n    /**\n     * Extension of the `ModRM.rm` or `SIB.base` field (inverted).\n     */\n    ZyanU8 B;\n    /**\n     * High-16 register specifier modifier (inverted).\n     */\n    ZyanU8 R2;\n    /**\n     * Opcode-map specifier.\n     */\n    ZyanU8 mmmm;\n    /**\n     * 64-bit operand-size promotion or opcode-extension.\n     */\n    ZyanU8 W;\n    /**\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\n     *  (inverted).\n     */\n    ZyanU8 vvvv;\n    /**\n     * Compressed legacy prefix.\n     */\n    ZyanU8 pp;\n    /**\n     * Non-temporal/eviction hint.\n     */\n    ZyanU8 E;\n    /**\n     * Swizzle/broadcast/up-convert/down-convert/static-rounding controls.\n     */\n    ZyanU8 SSS;\n    /**\n     * High-16 `NDS`/`VIDX` register specifier.\n     */\n    ZyanU8 V2;\n    /**\n     * Embedded opmask register specifier.\n     */\n    ZyanU8 kkk;\n    /**\n     * The offset of the first mvex byte, relative to the beginning of the\n     * instruction, in bytes.\n     */\n    ZyanU8 offset;\n} ZydisDecodedInstructionRawMvex;\n\n/**\n * Extended info for `AVX` instructions.\n */\ntypedef struct ZydisDecodedInstructionAvx_\n{\n    /**\n     * The `AVX` vector-length.\n     */\n    ZyanU16 vector_length;\n    /**\n     * Info about the embedded writemask-register (`AVX-512` and `KNC` only).\n     */\n    struct ZydisDecodedInstructionAvxMask_\n    {\n        /**\n         * The masking mode.\n         */\n        ZydisMaskMode mode;\n        /**\n         * The mask register.\n         */\n        ZydisRegister reg;\n    } mask;\n    /**\n     * Contains info about the `AVX` broadcast.\n     */\n    struct ZydisDecodedInstructionAvxBroadcast_\n    {\n        /**\n         * Signals, if the broadcast is a static broadcast.\n         *\n         * This is the case for instructions with inbuilt broadcast functionality, which is\n         * always active and not controlled by the `EVEX/MVEX.RC` bits.\n         */\n        ZyanBool is_static;\n        /**\n         * The `AVX` broadcast-mode.\n         */\n        ZydisBroadcastMode mode;\n    } broadcast;\n    /**\n     * Contains info about the `AVX` rounding.\n     */\n    struct ZydisDecodedInstructionAvxRounding_\n    {\n        /**\n         * The `AVX` rounding-mode.\n         */\n        ZydisRoundingMode mode;\n    } rounding;\n    /**\n     * Contains info about the `AVX` register-swizzle (`KNC` only).\n     */\n    struct ZydisDecodedInstructionAvxSwizzle_\n    {\n        /**\n         * The `AVX` register-swizzle mode.\n         */\n        ZydisSwizzleMode mode;\n    } swizzle;\n    /**\n     * Contains info about the `AVX` data-conversion (`KNC` only).\n     */\n    struct ZydisDecodedInstructionAvxConversion_\n    {\n        /**\n         * The `AVX` data-conversion mode.\n         */\n        ZydisConversionMode mode;\n    } conversion;\n    /**\n     * Signals, if the `SAE` (suppress-all-exceptions) functionality is\n     * enabled for the instruction.\n     */\n    ZyanBool has_sae;\n    /**\n     * Signals, if the instruction has a memory-eviction-hint (`KNC` only).\n     */\n    ZyanBool has_eviction_hint;\n    // TODO: publish EVEX tuple-type and MVEX functionality\n} ZydisDecodedInstructionAvx;\n\n/**\n * Instruction meta info.\n */\ntypedef struct ZydisDecodedInstructionMeta_\n{\n    /**\n     * The instruction category.\n     */\n    ZydisInstructionCategory category;\n    /**\n     * The ISA-set.\n     */\n    ZydisISASet isa_set;\n    /**\n     * The ISA-set extension.\n     */\n    ZydisISAExt isa_ext;\n    /**\n     * The branch type.\n     */\n    ZydisBranchType branch_type;\n    /**\n     * The exception class.\n     */\n    ZydisExceptionClass exception_class;\n} ZydisDecodedInstructionMeta;\n\n/**\n * Detailed info about different instruction-parts like `ModRM`, `SIB` or\n * encoding-prefixes.\n */\ntypedef struct ZydisDecodedInstructionRaw_\n{\n    /**\n     * The number of legacy prefixes.\n     */\n    ZyanU8 prefix_count;\n    /**\n     * Detailed info about the legacy prefixes (including `REX`).\n     */\n    struct ZydisDecodedInstructionRawPrefixes_\n    {\n        /**\n         * The prefix type.\n         */\n        ZydisPrefixType type;\n        /**\n         * The prefix byte.\n         */\n        ZyanU8 value;\n    } prefixes[ZYDIS_MAX_INSTRUCTION_LENGTH];\n\n    /*\n     * Copy of the `encoding` field.\n     *\n     * This is here to allow the Rust bindings to treat the following union as an `enum`,\n     * sparing us a lot of unsafe code. Prefer using the regular `encoding` field in C/C++ code.\n     */\n    ZydisInstructionEncoding encoding2;\n    /*\n     * Union for things from various mutually exclusive encodings.\n     */\n    union\n    {\n        ZydisDecodedInstructionRawRex rex;\n        ZydisDecodedInstructionRawXop xop;\n        ZydisDecodedInstructionRawVex vex;\n        ZydisDecodedInstructionRawEvex evex;\n        ZydisDecodedInstructionRawMvex mvex;\n    };\n\n    /**\n     * Detailed info about the `ModRM` byte.\n     */\n    struct ZydisDecodedInstructionModRm_\n    {\n        /**\n         * The addressing mode.\n         */\n        ZyanU8 mod;\n        /**\n         * Register specifier or opcode-extension.\n         */\n        ZyanU8 reg;\n        /**\n         * Register specifier or opcode-extension.\n         */\n        ZyanU8 rm;\n        /**\n         * The offset of the `ModRM` byte, relative to the beginning of the\n         * instruction, in bytes.\n         */\n        ZyanU8 offset;\n    } modrm;\n    /**\n     * Detailed info about the `SIB` byte.\n     */\n    struct ZydisDecodedInstructionRawSib_\n    {\n        /**\n         * The scale factor.\n         */\n        ZyanU8 scale;\n        /**\n         * The index-register specifier.\n         */\n        ZyanU8 index;\n        /**\n         * The base-register specifier.\n         */\n        ZyanU8 base;\n        /**\n         * The offset of the `SIB` byte, relative to the beginning of the\n         * instruction, in bytes.\n         */\n        ZyanU8 offset;\n    } sib;\n    /**\n     * Detailed info about displacement-bytes.\n     */\n    struct ZydisDecodedInstructionRawDisp_\n    {\n        /**\n         * The displacement value\n         */\n        ZyanI64 value;\n        /**\n         * The physical displacement size, in bits.\n         */\n        ZyanU8 size;\n        // TODO: publish cd8 scale\n        /**\n         * The offset of the displacement data, relative to the beginning of the\n         * instruction, in bytes.\n         */\n        ZyanU8 offset;\n    } disp;\n    /**\n     * Detailed info about immediate-bytes.\n     */\n    struct ZydisDecodedInstructionRawImm_\n    {\n        /**\n         * Signals, if the immediate value is signed.\n         */\n        ZyanBool is_signed;\n        /**\n         * Signals, if the immediate value contains a relative offset. You can use\n         * `ZydisCalcAbsoluteAddress` to determine the absolute address value.\n         */\n        ZyanBool is_relative;\n        /**\n         * The immediate value.\n         */\n        union ZydisDecodedInstructionRawImmValue_\n        {\n            ZyanU64 u;\n            ZyanI64 s;\n        } value;\n        /**\n         * The physical immediate size, in bits.\n         */\n        ZyanU8 size;\n        /**\n         * The offset of the immediate data, relative to the beginning of the\n         * instruction, in bytes.\n         */\n        ZyanU8 offset;\n    } imm[2];\n} ZydisDecodedInstructionRaw;\n\n/**\n * Information about a decoded instruction.\n */\ntypedef struct ZydisDecodedInstruction_\n{\n    /**\n     * The machine mode used to decode this instruction.\n     */\n    ZydisMachineMode machine_mode;\n    /**\n     * The instruction-mnemonic.\n     */\n    ZydisMnemonic mnemonic;\n    /**\n     * The length of the decoded instruction.\n     */\n    ZyanU8 length;\n    /**\n     * The instruction-encoding (`LEGACY`, `3DNOW`, `VEX`, `EVEX`, `XOP`).\n     */\n    ZydisInstructionEncoding encoding;\n    /**\n     * The opcode-map.\n     */\n    ZydisOpcodeMap opcode_map;\n    /**\n     * The instruction-opcode.\n     */\n    ZyanU8 opcode;\n    /**\n     * The stack width.\n     */\n    ZyanU8 stack_width;\n    /**\n     * The effective operand width.\n     */\n    ZyanU8 operand_width;\n    /**\n     * The effective address width.\n     */\n    ZyanU8 address_width;\n    /**\n     * The number of instruction-operands.\n     *\n     * Explicit and implicit operands are guaranteed to be in the front and ordered as they are\n     * printed by the formatter in `Intel` mode. No assumptions can be made about the order of\n     * hidden operands, except that they always located behind the explicit and implicit operands.\n     */\n    ZyanU8 operand_count;\n    /**\n     * The number of explicit (visible) instruction-operands.\n     *\n     * Explicit and implicit operands are guaranteed to be in the front and ordered as they are\n     * printed by the formatter in `Intel` mode.\n     */\n    ZyanU8 operand_count_visible;\n    /**\n     * See @ref instruction_attributes.\n     */\n    ZydisInstructionAttributes attributes;\n    /**\n     * Information about CPU flags accessed by the instruction.\n     *\n     * The bits in the masks correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS`\n     * register. See @ref decoder_cpu_flags.\n     */\n    const ZydisAccessedFlags* cpu_flags;\n    /**\n     * Information about FPU flags accessed by the instruction.\n     *\n     * See @ref decoder_fpu_flags.\n     */\n    const ZydisAccessedFlags* fpu_flags;\n    /**\n     * Extended info for `AVX` instructions.\n     */\n    ZydisDecodedInstructionAvx avx;\n    /**\n     * Meta info.\n     */\n    ZydisDecodedInstructionMeta meta;\n    /**\n     * Detailed info about different instruction-parts like `ModRM`, `SIB` or\n     * encoding-prefixes.\n     */\n    ZydisDecodedInstructionRaw raw;\n} ZydisDecodedInstruction;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoder context                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * The decoder context is used to preserve some internal state between subsequent decode\n * operations for THE SAME instruction.\n *\n * The context is initialized by @c ZydisDecoderDecodeInstruction and required by e.g.\n * @c ZydisDecoderDecodeOperands.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n *\n * This struct is neither ABI nor API stable!\n */\ntypedef struct ZydisDecoderContext_\n{\n    /**\n     * A pointer to the internal instruction definition.\n     */\n    const void* definition;\n    /**\n     * Contains the effective operand-size index.\n     *\n     * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit\n     */\n    ZyanU8 eosz_index;\n    /**\n     * Contains the effective address-size index.\n     *\n     * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit\n     */\n    ZyanU8 easz_index;\n    /**\n     * Contains some cached REX/XOP/VEX/EVEX/MVEX values to provide uniform access.\n     */\n    struct\n    {\n        ZyanU8 W;\n        ZyanU8 R;\n        ZyanU8 X;\n        ZyanU8 B;\n        ZyanU8 L;\n        ZyanU8 LL;\n        ZyanU8 R2;\n        ZyanU8 V2;\n        ZyanU8 vvvv;\n        ZyanU8 mask;\n    } vector_unified;\n    /**\n     * Information about encoded operand registers.\n     */\n    struct\n    {\n        /**\n         * Signals if the `modrm.mod == 3` or `reg` form is forced for the instruction.\n         */\n        ZyanBool is_mod_reg;\n        /**\n         * The final register id for the `reg` encoded register.\n         */\n        ZyanU8 id_reg;\n        /**\n         * The final register id for the `rm` encoded register.\n         *\n         * This value is only set, if a register is encoded in `modrm.rm`.\n         */\n        ZyanU8 id_rm;\n        /**\n         * The final register id for the `ndsndd` (`.vvvv`) encoded register.\n         */\n        ZyanU8 id_ndsndd;\n        /**\n         * The final register id for the base register.\n         *\n         * This value is only set, if a memory operand is encoded in `modrm.rm`.\n         */\n        ZyanU8 id_base;\n        /**\n         * The final register id for the index register.\n         *\n         * This value is only set, if a memory operand is encoded in `modrm.rm` and the `SIB` byte\n         * is present.\n         */\n        ZyanU8 id_index;\n    } reg_info;\n    /**\n     * Internal EVEX-specific information.\n     */\n    struct\n    {\n        /**\n         * The EVEX tuple-type.\n         */\n        ZyanU8 tuple_type;\n        /**\n         * The EVEX element-size.\n         */\n        ZyanU8 element_size;\n    } evex;\n    /**\n     * Internal MVEX-specific information.\n     */\n    struct\n    {\n        /**\n         * The MVEX functionality.\n         */\n        ZyanU8 functionality;\n    } mvex;\n    /**\n     * The scale factor for EVEX/MVEX compressed 8-bit displacement values.\n     */\n    ZyanU8 cd8_scale; // TODO: Could make sense to expose this in the ZydisDecodedInstruction\n} ZydisDecoderContext;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_INSTRUCTIONINFO_H */\n\n//\n// Header: Zydis/Status.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Status code definitions and check macros.\n */\n\n#ifndef ZYDIS_STATUS_H\n#define ZYDIS_STATUS_H\n\n\n//\n// Header: Zycore/Status.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Decoder.h\n//   - Zydis/Status.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zyan-C)\n\n  Original Author : Florian Bernd, Joel Hoener\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Status code definitions and check macros.\n */\n\n#ifndef ZYCORE_STATUS_H\n#define ZYCORE_STATUS_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZyanStatus` data type.\n */\ntypedef ZyanU32 ZyanStatus;\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Definition                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines a zyan status code.\n *\n * @param   error   `1`, if the status code signals an error or `0`, if not.\n * @param   module  The module id.\n * @param   code    The actual code.\n *\n * @return  The zyan status code.\n */\n#define ZYAN_MAKE_STATUS(error, module, code) \\\n    (ZyanStatus)((((error) & 0x01u) << 31u) | (((module) & 0x7FFu) << 20u) | ((code) & 0xFFFFFu))\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Checks                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Checks if a zyan operation was successful.\n *\n * @param   status  The zyan status-code to check.\n *\n * @return  `ZYAN_TRUE`, if the operation succeeded or `ZYAN_FALSE`, if not.\n */\n#define ZYAN_SUCCESS(status) \\\n    (!((status) & 0x80000000u))\n\n/**\n * Checks if a zyan operation failed.\n *\n * @param   status  The zyan status-code to check.\n *\n * @return  `ZYAN_TRUE`, if the operation failed or `ZYAN_FALSE`, if not.\n */\n#define ZYAN_FAILED(status) \\\n    ((status) & 0x80000000u)\n\n/**\n * Checks if a zyan operation was successful and returns with the status-code, if not.\n *\n * @param   status  The zyan status-code to check.\n */\n#define ZYAN_CHECK(status) \\\n    do \\\n    { \\\n        const ZyanStatus status_047620348 = (status); \\\n        if (!ZYAN_SUCCESS(status_047620348)) \\\n        { \\\n            return status_047620348; \\\n        } \\\n    } while (0)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Information                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n /**\n * Returns the module id of a zyan status-code.\n *\n * @param   status  The zyan status-code.\n *\n * @return  The module id of the zyan status-code.\n */\n#define ZYAN_STATUS_MODULE(status) \\\n    (((status) >> 20) & 0x7FFu)\n\n /**\n * Returns the code of a zyan status-code.\n *\n * @param   status  The zyan status-code.\n *\n * @return  The code of the zyan status-code.\n */\n#define ZYAN_STATUS_CODE(status) \\\n    ((status) & 0xFFFFFu)\n\n/* ============================================================================================== */\n/* Status codes                                                                                   */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Module IDs                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * The zycore generic module id.\n */\n#define ZYAN_MODULE_ZYCORE      0x001u\n\n/**\n * The zycore arg-parse submodule id.\n */\n#define ZYAN_MODULE_ARGPARSE    0x003u\n\n/**\n * The base module id for user-defined status codes.\n */\n#define ZYAN_MODULE_USER        0x3FFu\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Status codes (general purpose)                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * The operation completed successfully.\n */\n#define ZYAN_STATUS_SUCCESS \\\n    ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x00u)\n\n/**\n * The operation failed with an generic error.\n */\n#define ZYAN_STATUS_FAILED \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x01u)\n\n/**\n * The operation completed successfully and returned `ZYAN_TRUE`.\n */\n#define ZYAN_STATUS_TRUE \\\n    ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x02u)\n\n/**\n * The operation completed successfully and returned `ZYAN_FALSE`.\n */\n#define ZYAN_STATUS_FALSE \\\n    ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x03u)\n\n/**\n * An invalid argument was passed to a function.\n */\n#define ZYAN_STATUS_INVALID_ARGUMENT \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x04u)\n\n/**\n * An attempt was made to perform an invalid operation.\n */\n#define ZYAN_STATUS_INVALID_OPERATION \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x05u)\n\n/**\n * Insufficient privileges to perform the requested operation.\n */\n#define ZYAN_STATUS_ACCESS_DENIED \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x06u)\n\n/**\n * The requested entity was not found.\n */\n#define ZYAN_STATUS_NOT_FOUND \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x07u)\n\n/**\n * An index passed to a function was out of bounds.\n */\n#define ZYAN_STATUS_OUT_OF_RANGE \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x08u)\n\n/**\n * A buffer passed to a function was too small to complete the requested operation.\n */\n#define ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x09u)\n\n/**\n * Insufficient memory to perform the operation.\n */\n#define ZYAN_STATUS_NOT_ENOUGH_MEMORY \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Au)\n\n/**\n * An unknown error occurred during a system function call.\n */\n#define ZYAN_STATUS_BAD_SYSTEMCALL \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Bu)\n\n/**\n * The process ran out of resources while performing an operation.\n */\n#define ZYAN_STATUS_OUT_OF_RESOURCES \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Cu)\n\n/**\n * A dependency library was not found or does have an unexpected version number or\n * feature-set.\n */\n#define ZYAN_STATUS_MISSING_DEPENDENCY \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Du)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Status codes (arg parse)                                                                       */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Argument was not expected.\n */\n#define ZYAN_STATUS_ARG_NOT_UNDERSTOOD \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x00u)\n\n/**\n * Too few arguments were provided.\n */\n#define ZYAN_STATUS_TOO_FEW_ARGS \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x01u)\n\n/**\n * Too many arguments were provided.\n */\n#define ZYAN_STATUS_TOO_MANY_ARGS \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x02u)\n\n/**\n * An argument that expected a value misses its value.\n */\n#define ZYAN_STATUS_ARG_MISSES_VALUE \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x03u)\n\n/**\n* A required argument is missing.\n*/\n#define ZYAN_STATUS_REQUIRED_ARG_MISSING \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x04u)\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYCORE_STATUS_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Status codes                                                                                   */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Module IDs                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * The zydis module id.\n */\n#define ZYAN_MODULE_ZYDIS   0x002u\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Status codes                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoder                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * An attempt was made to read data from an input data-source that has no more\n * data available.\n */\n#define ZYDIS_STATUS_NO_MORE_DATA \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x00u)\n\n/**\n * An general error occured while decoding the current instruction. The\n * instruction might be undefined.\n */\n#define ZYDIS_STATUS_DECODING_ERROR \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x01u)\n\n/**\n * The instruction exceeded the maximum length of 15 bytes.\n */\n#define ZYDIS_STATUS_INSTRUCTION_TOO_LONG \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x02u)\n\n/**\n * The instruction encoded an invalid register.\n */\n#define ZYDIS_STATUS_BAD_REGISTER \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x03u)\n\n/**\n * A lock-prefix (F0) was found while decoding an instruction that does not\n * support locking.\n */\n#define ZYDIS_STATUS_ILLEGAL_LOCK \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x04u)\n\n/**\n * A legacy-prefix (F2, F3, 66) was found while decoding a XOP/VEX/EVEX/MVEX\n * instruction.\n */\n#define ZYDIS_STATUS_ILLEGAL_LEGACY_PFX \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x05u)\n\n/**\n * A rex-prefix was found while decoding a XOP/VEX/EVEX/MVEX instruction.\n */\n#define ZYDIS_STATUS_ILLEGAL_REX \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x06u)\n\n/**\n * An invalid opcode-map value was found while decoding a XOP/VEX/EVEX/MVEX-prefix.\n */\n#define ZYDIS_STATUS_INVALID_MAP \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x07u)\n\n/**\n * An error occured while decoding the EVEX-prefix.\n */\n#define ZYDIS_STATUS_MALFORMED_EVEX \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x08u)\n\n/**\n * An error occured while decoding the MVEX-prefix.\n */\n#define ZYDIS_STATUS_MALFORMED_MVEX \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x09u)\n\n/**\n * An invalid write-mask was specified for an EVEX/MVEX instruction.\n */\n#define ZYDIS_STATUS_INVALID_MASK \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Au)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Formatter                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returning this status code in some specified formatter callbacks will cause\n * the formatter to omit the corresponding token.\n *\n * Valid callbacks:\n * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\n */\n#define ZYDIS_STATUS_SKIP_TOKEN \\\n    ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYDIS, 0x0Bu)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Encoder                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n#define ZYDIS_STATUS_IMPOSSIBLE_INSTRUCTION \\\n    ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Cu)\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_STATUS_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoder mode                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisDecoderMode` enum.\n */\ntypedef enum ZydisDecoderMode_\n{\n    /**\n     * Enables minimal instruction decoding without semantic analysis.\n     *\n     * This mode provides access to the mnemonic, the instruction-length, the effective\n     * operand-size, the effective address-width, some attributes (e.g. `ZYDIS_ATTRIB_IS_RELATIVE`)\n     * and all of the information in the `raw` field of the `ZydisDecodedInstruction` struct.\n     *\n     * Operands, most attributes and other specific information (like `AVX` info) are not\n     * accessible in this mode.\n     *\n     * This mode is NOT enabled by default.\n     */\n    ZYDIS_DECODER_MODE_MINIMAL,\n    /**\n     * Enables the `AMD`-branch mode.\n     *\n     * Intel ignores the operand-size override-prefix (`0x66`) for all branches with 32-bit\n     * immediates and forces the operand-size of the instruction to 64-bit in 64-bit mode.\n     * In `AMD`-branch mode `0x66` is not ignored and changes the operand-size and the size of the\n     * immediate to 16-bit.\n     *\n     * This mode is NOT enabled by default.\n     */\n    ZYDIS_DECODER_MODE_AMD_BRANCHES,\n    /**\n     * Enables `KNC` compatibility-mode.\n     *\n     * `KNC` and `KNL+` chips are sharing opcodes and encodings for some mask-related instructions.\n     * Enable this mode to use the old `KNC` specifications (different mnemonics, operands, ..).\n     *\n     * This mode is NOT enabled by default.\n     */\n    ZYDIS_DECODER_MODE_KNC,\n    /**\n     * Enables the `MPX` mode.\n     *\n     * The `MPX` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_MPX,\n    /**\n     * Enables the `CET` mode.\n     *\n     * The `CET` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_CET,\n    /**\n     * Enables the `LZCNT` mode.\n     *\n     * The `LZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_LZCNT,\n    /**\n     * Enables the `TZCNT` mode.\n     *\n     * The `TZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_TZCNT,\n    /**\n     * Enables the `WBNOINVD` mode.\n     *\n     * The `WBINVD` instruction is interpreted as `WBNOINVD` on ICL chips, if a `F3` prefix is\n     * used.\n     *\n     * This mode is disabled by default.\n     */\n    ZYDIS_DECODER_MODE_WBNOINVD,\n     /**\n     * Enables the `CLDEMOTE` mode.\n     *\n     * The `CLDEMOTE` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_CLDEMOTE,\n    /**\n     * Enables the `IPREFETCH` mode.\n     *\n     * The `IPREFETCH` isa-extension reuses (overrides) some of the widenop instruction opcodes.\n     *\n     * This mode is enabled by default.\n     */\n    ZYDIS_DECODER_MODE_IPREFETCH,\n    /**\n     * Enables the `UD0` compatibility mode.\n     *\n     * Some processors decode the `UD0` instruction without a ModR/M byte. Enable this decoder mode\n     * to mimic this behavior.\n     *\n     * This mode is disabled by default.\n     */\n    ZYDIS_DECODER_MODE_UD0_COMPAT,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_DECODER_MODE_MAX_VALUE = ZYDIS_DECODER_MODE_UD0_COMPAT,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_DECODER_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECODER_MODE_MAX_VALUE)\n} ZydisDecoderMode;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decoder struct                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisDecoder` struct.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZydisDecoder_\n{\n    /**\n     * The machine mode.\n     */\n    ZydisMachineMode machine_mode;\n    /**\n     * The stack width.\n     */\n    ZydisStackWidth stack_width;\n    /**\n     * The decoder mode bitmap.\n     */\n    ZyanU32 decoder_mode;\n} ZydisDecoder;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup decoder Decoder\n * Functions allowing decoding of instruction bytes to a machine interpretable struct.\n * @{\n */\n\n/**\n * Initializes the given `ZydisDecoder` instance.\n *\n * @param   decoder         A pointer to the `ZydisDecoder` instance.\n * @param   machine_mode    The machine mode.\n * @param   stack_width     The stack width.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode,\n    ZydisStackWidth stack_width);\n\n/**\n * Enables or disables the specified decoder-mode.\n *\n * @param   decoder A pointer to the `ZydisDecoder` instance.\n * @param   mode    The decoder mode.\n * @param   enabled `ZYAN_TRUE` to enable, or `ZYAN_FALSE` to disable the specified decoder-mode.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode,\n    ZyanBool enabled);\n\n/**\n * Decodes the instruction in the given input `buffer` and returns all details (e.g. operands).\n *\n * @param   decoder         A pointer to the `ZydisDecoder` instance.\n * @param   buffer          A pointer to the input buffer.\n * @param   length          The length of the input buffer. Note that this can be bigger than the\n *                          actual size of the instruction -- you don't have to know the size up\n *                          front. This length is merely used to prevent Zydis from doing\n *                          out-of-bounds reads on your buffer.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct receiving the details\n *                          about the decoded instruction.\n * @param   operands        A pointer to an array with `ZYDIS_MAX_OPERAND_COUNT` entries that\n *                          receives the decoded operands. The number of operands decoded is\n *                          determined by the `instruction.operand_count` field. Excess entries are\n *                          zeroed.\n *\n * This is a convenience function that combines the following functions into one call:\n *\n *   - `ZydisDecoderDecodeInstruction`\n *   - `ZydisDecoderDecodeOperands`\n *\n * Please refer to `ZydisDecoderDecodeInstruction` if operand decoding is not required or should\n * be done separately (`ZydisDecoderDecodeOperands`).\n *\n * This function is not available in MINIMAL_MODE.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder,\n    const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction,\n    ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]);\n\n/**\n * Decodes the instruction in the given input `buffer`.\n *\n * @param   decoder     A pointer to the `ZydisDecoder` instance.\n * @param   context     A pointer to a decoder context struct which is required for further\n *                      decoding (e.g. operand decoding using `ZydisDecoderDecodeOperands`) or\n *                      `ZYAN_NULL` if not needed.\n * @param   buffer      A pointer to the input buffer.\n * @param   length      The length of the input buffer. Note that this can be bigger than the\n *                      actual size of the instruction -- you don't have to know the size up\n *                      front. This length is merely used to prevent Zydis from doing\n *                      out-of-bounds reads on your buffer.\n * @param   instruction A pointer to the `ZydisDecodedInstruction` struct, that receives the\n *                      details about the decoded instruction.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeInstruction(const ZydisDecoder* decoder,\n    ZydisDecoderContext* context, const void* buffer, ZyanUSize length,\n    ZydisDecodedInstruction* instruction);\n\n/**\n * Decodes the instruction operands.\n *\n * @param   decoder         A pointer to the `ZydisDecoder` instance.\n * @param   context         A pointer to the `ZydisDecoderContext` struct.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operands        The array that receives the decoded operands.\n *                          Refer to `ZYDIS_MAX_OPERAND_COUNT` or `ZYDIS_MAX_OPERAND_COUNT_VISIBLE`\n *                          when allocating space for the array to ensure that the buffer size is\n *                          sufficient to always fit all instruction operands.\n *                          Refer to `instruction.operand_count` or\n *                          `instruction.operand_count_visible' when allocating space for the array\n *                          to ensure that the buffer size is sufficient to fit all operands of\n *                          the given instruction.\n * @param   operand_count   The length of the `operands` array.\n *                          This argument as well limits the maximum amount of operands to decode.\n *                          If this value is `0`, no operands will be decoded and `ZYAN_NULL` will\n *                          be accepted for the `operands` argument.\n *\n * This function fails, if `operand_count` is larger than the total number of operands for the\n * given instruction (`instruction.operand_count`).\n *\n * This function is not available in MINIMAL_MODE.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder,\n    const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction,\n    ZydisDecodedOperand* operands, ZyanU8 operand_count);\n\n/** @} */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_DECODER_H */\n#endif\n\n#if !defined(ZYDIS_DISABLE_ENCODER)\n\n//\n// Header: Zydis/Encoder.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Mappa\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Functions for encoding instructions.\n */\n\n#ifndef ZYDIS_ENCODER_H\n#define ZYDIS_ENCODER_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constants                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Maximum number of encodable (explicit and implicit) operands\n */\n#define ZYDIS_ENCODER_MAX_OPERANDS 5\n\n// If asserts are failing here remember to update encoder table generator before fixing asserts\nZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODER_MAX_OPERANDS) == 3);\n\n/**\n * Combination of all user-encodable prefixes\n */\n#define ZYDIS_ENCODABLE_PREFIXES   (ZYDIS_ATTRIB_HAS_LOCK | \\\n                                    ZYDIS_ATTRIB_HAS_REP | \\\n                                    ZYDIS_ATTRIB_HAS_REPE | \\\n                                    ZYDIS_ATTRIB_HAS_REPNE | \\\n                                    ZYDIS_ATTRIB_HAS_BND | \\\n                                    ZYDIS_ATTRIB_HAS_XACQUIRE | \\\n                                    ZYDIS_ATTRIB_HAS_XRELEASE | \\\n                                    ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | \\\n                                    ZYDIS_ATTRIB_HAS_BRANCH_TAKEN | \\\n                                    ZYDIS_ATTRIB_HAS_NOTRACK | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_CS | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_SS | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_DS | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_ES | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_FS | \\\n                                    ZYDIS_ATTRIB_HAS_SEGMENT_GS)\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines possible physical instruction encodings as bit flags, so multiple acceptable encodings\n * can be specified simultaneously.\n */\ntypedef enum ZydisEncodableEncoding_\n{\n    ZYDIS_ENCODABLE_ENCODING_DEFAULT                = 0x00000000,\n    ZYDIS_ENCODABLE_ENCODING_LEGACY                 = 0x00000001,\n    ZYDIS_ENCODABLE_ENCODING_3DNOW                  = 0x00000002,\n    ZYDIS_ENCODABLE_ENCODING_XOP                    = 0x00000004,\n    ZYDIS_ENCODABLE_ENCODING_VEX                    = 0x00000008,\n    ZYDIS_ENCODABLE_ENCODING_EVEX                   = 0x00000010,\n    ZYDIS_ENCODABLE_ENCODING_MVEX                   = 0x00000020,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ENCODABLE_ENCODING_MAX_VALUE              = (ZYDIS_ENCODABLE_ENCODING_MVEX |\n                                                       (ZYDIS_ENCODABLE_ENCODING_MVEX - 1)),\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ENCODABLE_ENCODING_REQUIRED_BITS          =\n        ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODABLE_ENCODING_MAX_VALUE)\n} ZydisEncodableEncoding;\n\n/**\n * Defines encodable physical/effective sizes of relative immediate operands. See\n * `ZydisEncoderRequest.branch_width` for more details.\n */\ntypedef enum ZydisBranchWidth_\n{\n    ZYDIS_BRANCH_WIDTH_NONE,\n    ZYDIS_BRANCH_WIDTH_8,\n    ZYDIS_BRANCH_WIDTH_16,\n    ZYDIS_BRANCH_WIDTH_32,\n    ZYDIS_BRANCH_WIDTH_64,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_BRANCH_WIDTH_MAX_VALUE = ZYDIS_BRANCH_WIDTH_64,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_BRANCH_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_WIDTH_MAX_VALUE)\n} ZydisBranchWidth;\n\n/**\n * Defines possible values for address size hints. See `ZydisEncoderRequest` for more information\n * about address size hints.\n */\ntypedef enum ZydisAddressSizeHint_\n{\n    ZYDIS_ADDRESS_SIZE_HINT_NONE,\n    ZYDIS_ADDRESS_SIZE_HINT_16,\n    ZYDIS_ADDRESS_SIZE_HINT_32,\n    ZYDIS_ADDRESS_SIZE_HINT_64,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE = ZYDIS_ADDRESS_SIZE_HINT_64,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_ADDRESS_SIZE_HINT_REQUIRED_BITS =\n        ZYAN_BITS_TO_REPRESENT(ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE)\n} ZydisAddressSizeHint;\n\n/**\n * Defines possible values for operand size hints. See `ZydisEncoderRequest` for more information\n * about operand size hints.\n */\ntypedef enum ZydisOperandSizeHint_\n{\n    ZYDIS_OPERAND_SIZE_HINT_NONE,\n    ZYDIS_OPERAND_SIZE_HINT_8,\n    ZYDIS_OPERAND_SIZE_HINT_16,\n    ZYDIS_OPERAND_SIZE_HINT_32,\n    ZYDIS_OPERAND_SIZE_HINT_64,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE = ZYDIS_OPERAND_SIZE_HINT_64,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_OPERAND_SIZE_HINT_REQUIRED_BITS =\n        ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE)\n} ZydisOperandSizeHint;\n\n/**\n * Describes explicit or implicit instruction operand.\n */\ntypedef struct ZydisEncoderOperand_\n{\n    /**\n     * The type of the operand.\n     */\n    ZydisOperandType type;\n    /**\n     * Extended info for register-operands.\n     */\n    struct ZydisEncoderOperandReg_\n    {\n        /**\n         * The register value.\n         */\n        ZydisRegister value;\n        /**\n         * Is this 4th operand (`VEX`/`XOP`). Despite its name, `is4` encoding can sometimes be\n         * applied to 3rd operand instead of 4th. This field is used to resolve such ambiguities.\n         * For all other operands it should be set to `ZYAN_FALSE`.\n         */\n        ZyanBool is4;\n    } reg;\n    /**\n     * Extended info for memory-operands.\n     */\n    struct ZydisEncoderOperandMem_\n    {\n        /**\n         * The base register.\n         */\n        ZydisRegister base;\n        /**\n         * The index register.\n         */\n        ZydisRegister index;\n        /**\n         * The scale factor.\n         */\n        ZyanU8 scale;\n        /**\n         * The displacement value. This value is always treated as 64-bit signed integer, so it's\n         * important to take this into account when specifying absolute addresses. For example\n         * to specify a 16-bit address 0x8000 in 16-bit mode it should be sign extended to\n         * `0xFFFFFFFFFFFF8000`. See `address_size_hint` for more information about absolute\n         * addresses.\n         */\n        ZyanI64 displacement;\n        /**\n         * Size of this operand in bytes.\n         */\n        ZyanU16 size;\n    } mem;\n    /**\n     * Extended info for pointer-operands.\n     */\n    struct ZydisEncoderOperandPtr_\n    {\n        /**\n         * The segment value.\n         */\n        ZyanU16 segment;\n        /**\n         * The offset value.\n         */\n        ZyanU32 offset;\n    } ptr;\n    /**\n     * Extended info for immediate-operands.\n     */\n    union ZydisEncoderOperandImm_\n    {\n        /**\n         * The unsigned immediate value.\n         */\n        ZyanU64 u;\n        /**\n         * The signed immediate value.\n         */\n        ZyanI64 s;\n    } imm;\n} ZydisEncoderOperand;\n\n/**\n * Main structure consumed by the encoder. It represents full semantics of an instruction.\n */\ntypedef struct ZydisEncoderRequest_\n{\n    /**\n     * The machine mode used to encode this instruction.\n     */\n    ZydisMachineMode machine_mode;\n    /**\n     * This optional field can be used to restrict allowed physical encodings for desired\n     * instruction. Some mnemonics can be supported by more than one encoding, so this field can\n     * resolve ambiguities e.g. you can disable `AVX-512` extensions by prohibiting usage of `EVEX`\n     * prefix and allow only `VEX` variants.\n     */\n    ZydisEncodableEncoding allowed_encodings;\n    /**\n     * The instruction-mnemonic.\n     */\n    ZydisMnemonic mnemonic;\n    /**\n     * A combination of requested encodable prefixes (`ZYDIS_ATTRIB_HAS_*` flags) for desired\n     * instruction. See `ZYDIS_ENCODABLE_PREFIXES` for list of available prefixes.\n     */\n    ZydisInstructionAttributes prefixes;\n    /**\n     * Branch type (required for branching instructions only). Use `ZYDIS_BRANCH_TYPE_NONE` to let\n     * encoder pick size-optimal branch type automatically (`short` and `near` are prioritized over\n     * `far`).\n     */\n    ZydisBranchType branch_type;\n    /**\n     * Specifies physical size for relative immediate operands. Use `ZYDIS_BRANCH_WIDTH_NONE` to\n     * let encoder pick size-optimal branch width automatically. For segment:offset `far` branches\n     * this field applies to physical size of the offset part. For branching instructions without\n     * relative operands this field affects effective operand size attribute.\n     */\n    ZydisBranchWidth branch_width;\n    /**\n     * Optional address size hint used to resolve ambiguities for some instructions. Generally\n     * encoder deduces address size from `ZydisEncoderOperand` structures that represent\n     * explicit and implicit operands. This hint resolves conflicts when instruction's hidden\n     * operands scale with address size attribute.\n     *\n     * This hint is also used for instructions with absolute memory addresses (memory operands with\n     * displacement and no registers). Since displacement field is a 64-bit signed integer it's not\n     * possible to determine actual size of the address value in all situations. This hint\n     * specifies size of the address value provided inside encoder request rather than desired\n     * address size attribute of encoded instruction. Use `ZYDIS_ADDRESS_SIZE_HINT_NONE` to assume\n     * address size default for specified machine mode.\n     */\n    ZydisAddressSizeHint address_size_hint;\n    /**\n     * Optional operand size hint used to resolve ambiguities for some instructions. Generally\n     * encoder deduces operand size from `ZydisEncoderOperand` structures that represent\n     * explicit and implicit operands. This hint resolves conflicts when instruction's hidden\n     * operands scale with operand size attribute.\n     */\n    ZydisOperandSizeHint operand_size_hint;\n    /**\n     * The number of instruction-operands.\n     */\n    ZyanU8 operand_count;\n    /**\n     * Detailed info for all explicit and implicit instruction operands.\n     */\n    ZydisEncoderOperand operands[ZYDIS_ENCODER_MAX_OPERANDS];\n    /**\n     * Extended info for `EVEX` instructions.\n     */\n    struct ZydisEncoderRequestEvexFeatures_\n    {\n        /**\n         * The broadcast-mode. Specify `ZYDIS_BROADCAST_MODE_INVALID` for instructions with\n         * static broadcast functionality.\n         */\n        ZydisBroadcastMode broadcast;\n        /**\n         * The rounding-mode.\n         */\n        ZydisRoundingMode rounding;\n        /**\n         * Signals, if the `SAE` (suppress-all-exceptions) functionality should be enabled for\n         * the instruction.\n         */\n        ZyanBool sae;\n        /**\n         * Signals, if the zeroing-mask functionality should be enabled for the instruction.\n         * Specify `ZYAN_TRUE` for instructions with forced zeroing mask.\n         */\n        ZyanBool zeroing_mask;\n    } evex;\n    /**\n     * Extended info for `MVEX` instructions.\n     */\n    struct ZydisEncoderRequestMvexFeatures_\n    {\n        /**\n         * The broadcast-mode.\n         */\n        ZydisBroadcastMode broadcast;\n        /**\n         * The data-conversion mode.\n         */\n        ZydisConversionMode conversion;\n        /**\n         * The rounding-mode.\n         */\n        ZydisRoundingMode rounding;\n        /**\n         * The `AVX` register-swizzle mode.\n         */\n        ZydisSwizzleMode swizzle;\n        /**\n         * Signals, if the `SAE` (suppress-all-exceptions) functionality is enabled for\n         * the instruction.\n         */\n        ZyanBool sae;\n        /**\n         * Signals, if the instruction has a memory-eviction-hint (`KNC` only).\n         */\n        ZyanBool eviction_hint;\n    } mvex;\n} ZydisEncoderRequest;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup encoder Encoder\n * Functions allowing encoding of instruction bytes from a machine interpretable struct.\n * @{\n */\n\n/**\n * Encodes instruction with semantics specified in encoder request structure.\n *\n * @param   request     A pointer to the `ZydisEncoderRequest` struct.\n * @param   buffer      A pointer to the output buffer receiving encoded instruction.\n * @param   length      A pointer to the variable containing length of the output buffer. Upon\n *                      successful return this variable receives length of the encoded instruction.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstruction(const ZydisEncoderRequest *request,\n    void *buffer, ZyanUSize *length);\n\n/**\n * Encodes instruction with semantics specified in encoder request structure. This function expects\n * absolute addresses inside encoder request instead of `EIP`/`RIP`-relative values. Function\n * predicts final instruction length prior to encoding and writes back calculated relative operands\n * to provided encoder request.\n *\n * @param   request         A pointer to the `ZydisEncoderRequest` struct.\n * @param   buffer          A pointer to the output buffer receiving encoded instruction.\n * @param   length          A pointer to the variable containing length of the output buffer. Upon\n *                          successful return this variable receives length of the encoded\n *                          instruction.\n * @param   runtime_address The runtime address of the instruction.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstructionAbsolute(ZydisEncoderRequest *request,\n    void *buffer, ZyanUSize *length, ZyanU64 runtime_address);\n\n/**\n * Converts decoded instruction to encoder request that can be passed to\n * `ZydisEncoderEncodeInstruction`.\n *\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operands        A pointer to the decoded operands.\n * @param   operand_count   The operand count.\n * @param   request         A pointer to the `ZydisEncoderRequest` struct, that receives\n *                          information necessary for encoder to re-encode the instruction.\n *\n * This function performs simple structure conversion and does minimal sanity checks on the\n * input. There's no guarantee that produced request will be accepted by\n * `ZydisEncoderEncodeInstruction` if malformed `ZydisDecodedInstruction` or malformed\n * `ZydisDecodedOperands` is passed to this function.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest(\n    const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\n    ZyanU8 operand_count, ZydisEncoderRequest* request);\n\n/**\n * Fills provided buffer with `NOP` instructions using longest possible multi-byte instructions.\n *\n * @param   buffer  A pointer to the output buffer receiving encoded instructions.\n * @param   length  Size of the output buffer.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisEncoderNopFill(void *buffer, ZyanUSize length);\n\n/** @} */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_ENCODER_H */\n#endif\n\n#if !defined(ZYDIS_DISABLE_FORMATTER)\n\n//\n// Header: Zydis/Formatter.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Functions for formatting instructions to human-readable text.\n */\n\n#ifndef ZYDIS_FORMATTER_H\n#define ZYDIS_FORMATTER_H\n\n\n//\n// Header: Zycore/String.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Implements a string type.\n */\n\n#ifndef ZYCORE_STRING_H\n#define ZYCORE_STRING_H\n\n\n//\n// Header: Zycore/Allocator.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//   - Zycore/String.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * @brief\n */\n\n#ifndef ZYCORE_ALLOCATOR_H\n#define ZYCORE_ALLOCATOR_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\nstruct ZyanAllocator_;\n\n/**\n * Defines the `ZyanAllocatorAllocate` function prototype.\n *\n * @param   allocator       A pointer to the `ZyanAllocator` instance.\n * @param   p               Receives a pointer to the first memory block sufficient to hold an\n *                          array of `n` elements with a size of `element_size`.\n * @param   element_size    The size of a single element.\n * @param   n               The number of elements to allocate storage for.\n *\n * @return  A zyan status code.\n *\n * This prototype is used for the `allocate()` and `reallocate()` functions.\n *\n * The result of the `reallocate()` function is undefined, if `p` does not point to a memory block\n * previously obtained by `(re-)allocate()`.\n */\ntypedef ZyanStatus (*ZyanAllocatorAllocate)(struct ZyanAllocator_* allocator, void** p,\n    ZyanUSize element_size, ZyanUSize n);\n\n/**\n * Defines the `ZyanAllocatorDeallocate` function prototype.\n *\n * @param   allocator       A pointer to the `ZyanAllocator` instance.\n * @param   p               The pointer obtained from `(re-)allocate()`.\n * @param   element_size    The size of a single element.\n * @param   n               The number of elements earlier passed to `(re-)allocate()`.\n *\n  * @return  A zyan status code.\n */\ntypedef ZyanStatus (*ZyanAllocatorDeallocate)(struct ZyanAllocator_* allocator, void* p,\n    ZyanUSize element_size, ZyanUSize n);\n\n/**\n * Defines the `ZyanAllocator` struct.\n *\n * This is the base class for all custom allocator implementations.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZyanAllocator_\n{\n    /**\n     * The allocate function.\n     */\n    ZyanAllocatorAllocate allocate;\n    /**\n     * The reallocate function.\n     */\n    ZyanAllocatorAllocate reallocate;\n    /**\n     * The deallocate function.\n     */\n    ZyanAllocatorDeallocate deallocate;\n} ZyanAllocator;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * Initializes the given `ZyanAllocator` instance.\n *\n * @param   allocator   A pointer to the `ZyanAllocator` instance.\n * @param   allocate    The allocate function.\n * @param   reallocate  The reallocate function.\n * @param   deallocate  The deallocate function.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanAllocatorInit(ZyanAllocator* allocator, ZyanAllocatorAllocate allocate,\n    ZyanAllocatorAllocate reallocate, ZyanAllocatorDeallocate deallocate);\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Returns the default `ZyanAllocator` instance.\n *\n * @return  A pointer to the default `ZyanAllocator` instance.\n *\n * The default allocator uses the default memory manager to allocate memory on the heap.\n *\n * You should in no case modify the returned allocator instance to avoid unexpected behavior.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanAllocator* ZyanAllocatorDefault(void);\n\n#endif // ZYAN_NO_LIBC\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYCORE_ALLOCATOR_H */\n\n//\n// Header: Zycore/Vector.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//   - Zycore/String.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Implements the vector container class.\n */\n\n#ifndef ZYCORE_VECTOR_H\n#define ZYCORE_VECTOR_H\n\n\n//\n// Header: Zycore/Comparison.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//   - Zycore/String.h\n//   - Zycore/Vector.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Defines prototypes of general-purpose comparison functions.\n */\n\n#ifndef ZYCORE_COMPARISON_H\n#define ZYCORE_COMPARISON_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZyanEqualityComparison` function prototype.\n *\n * @param   left    A pointer to the first element.\n * @param   right   A pointer to the second element.\n *\n * @return  This function should return `ZYAN_TRUE` if the `left` element equals the `right` one\n *          or `ZYAN_FALSE`, if not.\n */\ntypedef ZyanBool (*ZyanEqualityComparison)(const void* left, const void* right);\n\n/**\n * Defines the `ZyanComparison` function prototype.\n *\n * @param   left    A pointer to the first element.\n * @param   right   A pointer to the second element.\n *\n * @return  This function should return values in the following range:\n *          `left == right -> result == 0`\n *          `left <  right -> result  < 0`\n *          `left >  right -> result  > 0`\n */\ntypedef ZyanI32 (*ZyanComparison)(const void* left, const void* right);\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Equality comparison functions                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Declares a generic equality comparison function for an integral data-type.\n *\n * @param   name    The name of the function.\n * @param   type    The name of the integral data-type.\n */\n#define ZYAN_DECLARE_EQUALITY_COMPARISON(name, type) \\\n    ZyanBool name(const type* left, const type* right) \\\n    { \\\n        ZYAN_ASSERT(left); \\\n        ZYAN_ASSERT(right); \\\n        \\\n        return (*left == *right) ? ZYAN_TRUE : ZYAN_FALSE; \\\n    }\n\n/**\n * Declares a generic equality comparison function that compares a single integral\n *          data-type field of a struct.\n *\n * @param   name        The name of the function.\n * @param   type        The name of the integral data-type.\n * @param   field_name  The name of the struct field.\n */\n#define ZYAN_DECLARE_EQUALITY_COMPARISON_FOR_FIELD(name, type, field_name) \\\n    ZyanBool name(const type* left, const type* right) \\\n    { \\\n        ZYAN_ASSERT(left); \\\n        ZYAN_ASSERT(right); \\\n        \\\n        return (left->field_name == right->field_name) ? ZYAN_TRUE : ZYAN_FALSE; \\\n    }\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Comparison functions                                                                           */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Declares a generic comparison function for an integral data-type.\n *\n * @param   name    The name of the function.\n * @param   type    The name of the integral data-type.\n */\n#define ZYAN_DECLARE_COMPARISON(name, type) \\\n    ZyanI32 name(const type* left, const type* right) \\\n    { \\\n        ZYAN_ASSERT(left); \\\n        ZYAN_ASSERT(right); \\\n        \\\n        if (*left < *right) \\\n        { \\\n            return -1; \\\n        } \\\n        if (*left > *right) \\\n        { \\\n            return  1; \\\n        } \\\n        return 0; \\\n    }\n\n/**\n * Declares a generic comparison function that compares a single integral data-type field\n *          of a struct.\n *\n * @param   name        The name of the function.\n * @param   type        The name of the integral data-type.\n * @param   field_name  The name of the struct field.\n */\n#define ZYAN_DECLARE_COMPARISON_FOR_FIELD(name, type, field_name) \\\n    ZyanI32 name(const type* left, const type* right) \\\n    { \\\n        ZYAN_ASSERT(left); \\\n        ZYAN_ASSERT(right); \\\n        \\\n        if (left->field_name < right->field_name) \\\n        { \\\n            return -1; \\\n        } \\\n        if (left->field_name > right->field_name) \\\n        { \\\n            return  1; \\\n        } \\\n        return 0; \\\n    }\n\n /* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Default equality comparison functions                                                          */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines a default equality comparison function for pointer values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsPointer, void* const)\n\n/**\n * Defines a default equality comparison function for `ZyanBool` values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsBool, ZyanBool)\n\n/**\n * Defines a default equality comparison function for 8-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric8, ZyanU8)\n\n/**\n * Defines a default equality comparison function for 16-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric16, ZyanU16)\n\n/**\n * Defines a default equality comparison function for 32-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric32, ZyanU32)\n\n/**\n * Defines a default equality comparison function for 64-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\n *          not.\n */\nZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric64, ZyanU64)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Default comparison functions                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines a default comparison function for pointer values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanComparePointer, void* const)\n\n/**\n * Defines a default comparison function for `ZyanBool` values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareBool, ZyanBool)\n\n/**\n * Defines a default comparison function for 8-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric8, ZyanU8)\n\n/**\n * Defines a default comparison function for 16-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric16, ZyanU16)\n\n/**\n * Defines a default comparison function for 32-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric32, ZyanU32)\n\n/**\n * Defines a default comparison function for 64-bit numeric values.\n *\n * @param   left    A pointer to the first value.\n * @param   right   A pointer to the second value.\n *\n * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\n *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\n */\nZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric64, ZyanU64)\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYCORE_COMPARISON_H */\n\n//\n// Header: Zycore/Object.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//   - Zycore/String.h\n//   - Zycore/Vector.h\n//\n\n/***************************************************************************************************\n\n  Zyan Core Library (Zycore-C)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Defines some generic object-related datatypes.\n */\n\n#ifndef ZYCORE_OBJECT_H\n#define ZYCORE_OBJECT_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZyanMemberProcedure` function prototype.\n *\n * @param   object  A pointer to the object.\n */\ntypedef void (*ZyanMemberProcedure)(void* object);\n\n/**\n * Defines the `ZyanConstMemberProcedure` function prototype.\n *\n * @param   object  A pointer to the object.\n */\ntypedef void (*ZyanConstMemberProcedure)(const void* object);\n\n/**\n * Defines the `ZyanMemberFunction` function prototype.\n *\n * @param   object  A pointer to the object.\n *\n * @return  A zyan status code.\n */\ntypedef ZyanStatus (*ZyanMemberFunction)(void* object);\n\n/**\n * Defines the `ZyanConstMemberFunction` function prototype.\n *\n * @param   object  A pointer to the object.\n *\n * @return  A zyan status code.\n */\ntypedef ZyanStatus (*ZyanConstMemberFunction)(const void* object);\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYCORE_OBJECT_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Constants                                                                                      */\n/* ============================================================================================== */\n\n/**\n * The initial minimum capacity (number of elements) for all dynamically allocated vector\n * instances.\n */\n#define ZYAN_VECTOR_MIN_CAPACITY                1\n\n/**\n * The default growth factor for all vector instances.\n */\n#define ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR       2\n\n/**\n * The default shrink threshold for all vector instances.\n */\n#define ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD    4\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZyanVector` struct.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZyanVector_\n{\n    /**\n     * The memory allocator.\n     */\n    ZyanAllocator* allocator;\n    /**\n     * The growth factor.\n     */\n    ZyanU8 growth_factor;\n    /**\n     * The shrink threshold.\n     */\n    ZyanU8 shrink_threshold;\n    /**\n     * The current number of elements in the vector.\n     */\n    ZyanUSize size;\n    /**\n     * The maximum capacity (number of elements).\n     */\n    ZyanUSize capacity;\n    /**\n     * The size of a single element in bytes.\n     */\n    ZyanUSize element_size;\n    /**\n     * The element destructor callback.\n     */\n    ZyanMemberProcedure destructor;\n    /**\n     * The data pointer.\n     */\n    void* data;\n} ZyanVector;\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* General                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines an uninitialized `ZyanVector` instance.\n */\n#define ZYAN_VECTOR_INITIALIZER \\\n    { \\\n        /* allocator        */ ZYAN_NULL, \\\n        /* growth_factor    */ 0, \\\n        /* shrink_threshold */ 0, \\\n        /* size             */ 0, \\\n        /* capacity         */ 0, \\\n        /* element_size     */ 0, \\\n        /* destructor       */ ZYAN_NULL, \\\n        /* data             */ ZYAN_NULL \\\n    }\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Helper macros                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the value of the element at the given `index`.\n *\n * @param   type    The desired value type.\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The element index.\n *\n * @result  The value of the desired element in the vector.\n *\n * Note that this function is unsafe and might dereference a null-pointer.\n */\n#ifdef __cplusplus\n#define ZYAN_VECTOR_GET(type, vector, index) \\\n    (*reinterpret_cast<const type*>(ZyanVectorGet(vector, index)))\n#else\n#define ZYAN_VECTOR_GET(type, vector, index) \\\n    (*(const type*)ZyanVectorGet(vector, index))\n#endif\n\n/**\n * Loops through all elements of the vector.\n *\n * @param   type        The desired value type.\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   item_name   The name of the iterator item.\n * @param   body        The body to execute for each item in the vector.\n */\n#define ZYAN_VECTOR_FOREACH(type, vector, item_name, body) \\\n    { \\\n        const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \\\n        for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \\\n            ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \\\n            ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \\\n            ++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \\\n        { \\\n            const type item_name = ZYAN_VECTOR_GET(type, vector, \\\n                ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \\\n            body \\\n        } \\\n    }\n\n/**\n * Loops through all elements of the vector.\n *\n * @param   type        The desired value type.\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   item_name   The name of the iterator item.\n * @param   body        The body to execute for each item in the vector.\n */\n#define ZYAN_VECTOR_FOREACH_MUTABLE(type, vector, item_name, body) \\\n    { \\\n        const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \\\n        for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \\\n            ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \\\n            ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \\\n            ++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \\\n        { \\\n            type* const item_name = ZyanVectorGetMutable(vector, \\\n                ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \\\n            body \\\n        } \\\n    }\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constructor and destructor                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Initializes the given `ZyanVector` instance.\n *\n * @param   vector          A pointer to the `ZyanVector` instance.\n * @param   element_size    The size of a single element in bytes.\n * @param   capacity        The initial capacity (number of elements).\n * @param   destructor      A destructor callback that is invoked every time an item is deleted, or\n *                          `ZYAN_NULL` if not needed.\n *\n * @return  A zyan status code.\n *\n * The memory for the vector elements is dynamically allocated by the default allocator using the\n * default growth factor and the default shrink threshold.\n *\n * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorInit(ZyanVector* vector,\n    ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor);\n\n#endif // ZYAN_NO_LIBC\n\n/**\n * Initializes the given `ZyanVector` instance and sets a custom `allocator` and memory\n * allocation/deallocation parameters.\n *\n * @param   vector              A pointer to the `ZyanVector` instance.\n * @param   element_size        The size of a single element in bytes.\n * @param   capacity            The initial capacity (number of elements).\n * @param   destructor          A destructor callback that is invoked every time an item is deleted,\n *                              or `ZYAN_NULL` if not needed.\n * @param   allocator           A pointer to a `ZyanAllocator` instance.\n * @param   growth_factor       The growth factor.\n * @param   shrink_threshold    The shrink threshold.\n *\n * @return  A zyan status code.\n *\n * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\n * dynamic shrinking.\n *\n * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size,\n    ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator* allocator,\n    ZyanU8 growth_factor, ZyanU8 shrink_threshold);\n\n/**\n * Initializes the given `ZyanVector` instance and configures it to use a custom user\n * defined buffer with a fixed size.\n *\n * @param   vector          A pointer to the `ZyanVector` instance.\n * @param   element_size    The size of a single element in bytes.\n * @param   buffer          A pointer to the buffer that is used as storage for the elements.\n * @param   capacity        The maximum capacity (number of elements) of the buffer.\n * @param   destructor      A destructor callback that is invoked every time an item is deleted, or\n *                          `ZYAN_NULL` if not needed.\n *\n * @return  A zyan status code.\n *\n * Finalization is not required for instances created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector* vector, ZyanUSize element_size,\n    void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor);\n\n/**\n * Destroys the given `ZyanVector` instance.\n *\n * @param   vector  A pointer to the `ZyanVector` instance..\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorDestroy(ZyanVector* vector);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Duplication                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanVector` instance by duplicating an existing vector.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanVector` instance.\n * @param   source      A pointer to the source vector.\n * @param   capacity    The initial capacity (number of elements).\n *\n *                      This value is automatically adjusted to the size of the source vector, if\n *                      a smaller value was passed.\n *\n * @return  A zyan status code.\n *\n * The memory for the vector is dynamically allocated by the default allocator using the default\n * growth factor and the default shrink threshold.\n *\n * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorDuplicate(ZyanVector* destination,\n    const ZyanVector* source, ZyanUSize capacity);\n\n#endif // ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanVector` instance by duplicating an existing vector and sets a\n * custom `allocator` and memory allocation/deallocation parameters.\n *\n * @param   destination         A pointer to the (uninitialized) destination `ZyanVector` instance.\n * @param   source              A pointer to the source vector.\n * @param   capacity            The initial capacity (number of elements).\n\n *                              This value is automatically adjusted to the size of the source\n *                              vector, if a smaller value was passed.\n * @param   allocator           A pointer to a `ZyanAllocator` instance.\n * @param   growth_factor       The growth factor.\n * @param   shrink_threshold    The shrink threshold.\n *\n * @return  A zyan status code.\n *\n * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\n * dynamic shrinking.\n *\n * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateEx(ZyanVector* destination, const ZyanVector* source,\n    ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);\n\n/**\n * Initializes a new `ZyanVector` instance by duplicating an existing vector and\n * configures it to use a custom user defined buffer with a fixed size.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanVector` instance.\n * @param   source      A pointer to the source vector.\n * @param   buffer      A pointer to the buffer that is used as storage for the elements.\n * @param   capacity    The maximum capacity (number of elements) of the buffer.\n\n *                      This function will fail, if the capacity of the buffer is less than the\n *                      size of the source vector.\n *\n * @return  A zyan status code.\n *\n * Finalization is not required for instances created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector* destination,\n    const ZyanVector* source, void* buffer, ZyanUSize capacity);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Element access                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns a constant pointer to the element at the given `index`.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   index       The element index.\n *\n * @return  A constant pointer to the desired element in the vector or `ZYAN_NULL`, if an error\n *          occurred.\n *\n * Note that the returned pointer might get invalid when the vector is resized by either a manual\n * call to the memory-management functions or implicitly by inserting or removing elements.\n *\n * Take a look at `ZyanVectorGetPointer` instead, if you need a function that returns a zyan status\n * code.\n */\nZYCORE_EXPORT const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index);\n\n/**\n * Returns a mutable pointer to the element at the given `index`.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   index       The element index.\n *\n * @return  A mutable pointer to the desired element in the vector or `ZYAN_NULL`, if an error\n *          occurred.\n *\n * Note that the returned pointer might get invalid when the vector is resized by either a manual\n * call to the memory-management functions or implicitly by inserting or removing elements.\n *\n * Take a look at `ZyanVectorGetPointerMutable` instead, if you need a function that returns a\n * zyan status code.\n */\nZYCORE_EXPORT void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index);\n\n/**\n * Returns a constant pointer to the element at the given `index`.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The element index.\n * @param   value   Receives a constant pointer to the desired element in the vector.\n *\n * Note that the returned pointer might get invalid when the vector is resized by either a manual\n * call to the memory-management functions or implicitly by inserting or removing elements.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorGetPointer(const ZyanVector* vector, ZyanUSize index,\n    const void** value);\n\n/**\n * Returns a mutable pointer to the element at the given `index`.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The element index.\n * @param   value Receives a mutable pointer to the desired element in the vector.\n *\n * Note that the returned pointer might get invalid when the vector is resized by either a manual\n * call to the memory-management functions or implicitly by inserting or removing elements.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector* vector, ZyanUSize index,\n    void** value);\n\n/**\n * Assigns a new value to the element at the given `index`.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The value index.\n * @param   value   The value to assign.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorSet(ZyanVector* vector, ZyanUSize index,\n    const void* value);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Insertion                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Adds a new `element` to the end of the vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   element A pointer to the element to add.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorPushBack(ZyanVector* vector, const void* element);\n\n/**\n * Inserts an `element` at the given `index` of the vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The insert index.\n * @param   element A pointer to the element to insert.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorInsert(ZyanVector* vector, ZyanUSize index,\n    const void* element);\n\n/**\n * Inserts multiple `elements` at the given `index` of the vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   index       The insert index.\n * @param   elements    A pointer to the first element.\n * @param   count       The number of elements to insert.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorInsertRange(ZyanVector* vector, ZyanUSize index,\n    const void* elements, ZyanUSize count);\n\n/**\n * Constructs an `element` in-place at the end of the vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   element     Receives a pointer to the new element.\n * @param   constructor The constructor callback or `ZYAN_NULL`. The new element will be in\n *                      undefined state, if no constructor was passed.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorEmplace(ZyanVector* vector, void** element,\n    ZyanMemberFunction constructor);\n\n/**\n * Constructs an `element` in-place and inserts it at the given `index` of the vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   index       The insert index.\n * @param   element     Receives a pointer to the new element.\n * @param   constructor The constructor callback or `ZYAN_NULL`. The new element will be in\n *                      undefined state, if no constructor was passed.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorEmplaceEx(ZyanVector* vector, ZyanUSize index,\n    void** element, ZyanMemberFunction constructor);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Utils                                                                                          */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Swaps the element at `index_first` with the element at `index_second`.\n *\n * @param   vector          A pointer to the `ZyanVector` instance.\n * @param   index_first     The index of the first element.\n * @param   index_second    The index of the second element.\n *\n * @return  A zyan status code.\n *\n * This function requires the vector to have spare capacity for one temporary element. Call\n * `ZyanVectorReserve` before this function to increase capacity, if needed.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorSwapElements(ZyanVector* vector, ZyanUSize index_first,\n    ZyanUSize index_second);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Deletion                                                                                       */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Deletes the element at the given `index` of the vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The element index.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorDelete(ZyanVector* vector, ZyanUSize index);\n\n/**\n * Deletes multiple elements from the given vector, starting at `index`.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   index   The index of the first element to delete.\n * @param   count   The number of elements to delete.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorDeleteRange(ZyanVector* vector, ZyanUSize index,\n    ZyanUSize count);\n\n/**\n * Removes the last element of the vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorPopBack(ZyanVector* vector);\n\n/**\n * Erases all elements of the given vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorClear(ZyanVector* vector);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Searching                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Sequentially searches for the first occurrence of `element` in the given vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   element     A pointer to the element to search for.\n * @param   found_index A pointer to a variable that receives the index of the found element.\n * @param   comparison  The comparison function to use.\n *\n * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\n *          zyan status code if an error occurred.\n *\n * The `found_index` is set to `-1`, if the element was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element,\n    ZyanISize* found_index, ZyanEqualityComparison comparison);\n\n/**\n * Sequentially searches for the first occurrence of `element` in the given vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   element     A pointer to the element to search for.\n * @param   found_index A pointer to a variable that receives the index of the found element.\n * @param   comparison  The comparison function to use.\n * @param   index       The start index.\n * @param   count       The maximum number of elements to iterate, beginning from the start `index`.\n *\n * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\n *          zyan status code if an error occurred.\n *\n * The `found_index` is set to `-1`, if the element was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element,\n    ZyanISize* found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count);\n\n/**\n * Searches for the first occurrence of `element` in the given vector using a binary-\n * search algorithm.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   element     A pointer to the element to search for.\n * @param   found_index A pointer to a variable that receives the index of the found element.\n * @param   comparison  The comparison function to use.\n *\n * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\n *          zyan status code if an error occurred.\n *\n * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`\n * contains the index of the first entry larger than `element`.\n *\n * This function requires all elements in the vector to be strictly ordered (sorted).\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearch(const ZyanVector* vector, const void* element,\n    ZyanUSize* found_index, ZyanComparison comparison);\n\n/**\n * Searches for the first occurrence of `element` in the given vector using a binary-\n * search algorithm.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   element     A pointer to the element to search for.\n * @param   found_index A pointer to a variable that receives the index of the found element.\n * @param   comparison  The comparison function to use.\n * @param   index       The start index.\n * @param   count       The maximum number of elements to iterate, beginning from the start `index`.\n *\n * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\n *          zyan status code if an error occurred.\n *\n * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`\n * contains the index of the first entry larger than `element`.\n *\n * This function requires all elements in the vector to be strictly ordered (sorted).\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector* vector, const void* element,\n    ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Memory management                                                                              */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Resizes the given `ZyanVector` instance.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   size    The new size of the vector.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorResize(ZyanVector* vector, ZyanUSize size);\n\n/**\n * Resizes the given `ZyanVector` instance.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   size        The new size of the vector.\n * @param   initializer A pointer to a value to be used as initializer for new items.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorResizeEx(ZyanVector* vector, ZyanUSize size,\n    const void* initializer);\n\n/**\n * Changes the capacity of the given `ZyanVector` instance.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   capacity    The new minimum capacity of the vector.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorReserve(ZyanVector* vector, ZyanUSize capacity);\n\n/**\n * Shrinks the capacity of the given vector to match it's size.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorShrinkToFit(ZyanVector* vector);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Information                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the current capacity of the vector.\n *\n * @param   vector      A pointer to the `ZyanVector` instance.\n * @param   capacity    Receives the size of the vector.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity);\n\n/**\n * Returns the current size of the vector.\n *\n * @param   vector  A pointer to the `ZyanVector` instance.\n * @param   size    Receives the size of the vector.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYCORE_VECTOR_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Constants                                                                                      */\n/* ============================================================================================== */\n\n/**\n * The initial minimum capacity (number of characters) for all dynamically allocated\n * string instances - not including the terminating '\\0'-character.\n */\n#define ZYAN_STRING_MIN_CAPACITY                32\n\n/**\n * The default growth factor for all string instances.\n */\n#define ZYAN_STRING_DEFAULT_GROWTH_FACTOR       2\n\n/**\n * The default shrink threshold for all string instances.\n */\n#define ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD    4\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* String flags                                                                                   */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZyanStringFlags` data-type.\n */\ntypedef ZyanU8 ZyanStringFlags;\n\n/**\n * The string uses a custom user-defined buffer with a fixed capacity.\n */\n#define ZYAN_STRING_HAS_FIXED_CAPACITY  0x01 // (1 << 0)\n\n/* ---------------------------------------------------------------------------------------------- */\n/* String                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZyanString` struct.\n *\n * The `ZyanString` type is implemented as a size-prefixed string - which allows for a lot of\n * performance optimizations.\n * Nevertheless null-termination is guaranteed at all times to provide maximum compatibility with\n * default C-style strings (use `ZyanStringGetData` to access the C-style string).\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZyanString_\n{\n    /**\n     * String flags.\n     */\n    ZyanStringFlags flags;\n    /**\n     * The vector that contains the actual string.\n     */\n    ZyanVector vector;\n} ZyanString;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* View                                                                                           */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZyanStringView` struct.\n *\n * The `ZyanStringView` type provides a view inside a string (`ZyanString` instances, null-\n * terminated C-style strings, or even not-null-terminated custom strings). A view is immutable\n * by design and can't be directly converted to a C-style string.\n *\n * Views might become invalid (e.g. pointing to invalid memory), if the underlying string gets\n * destroyed or resized.\n *\n * The `ZYAN_STRING_TO_VIEW` macro can be used to cast a `ZyanString` to a `ZyanStringView` pointer\n * without any runtime overhead.\n * Casting a view to a normal string is not supported and will lead to unexpected behavior (use\n * `ZyanStringDuplicate` to create a deep-copy instead).\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZyanStringView_\n{\n    /**\n     * The string data.\n     *\n     * The view internally re-uses the normal string struct to allow casts without any runtime\n     * overhead.\n     */\n    ZyanString string;\n} ZyanStringView;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* General                                                                                        */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines an uninitialized `ZyanString` instance.\n */\n#define ZYAN_STRING_INITIALIZER \\\n    { \\\n        /* flags  */ 0, \\\n        /* vector */ ZYAN_VECTOR_INITIALIZER \\\n    }\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Helper macros                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Casts a `ZyanString` pointer to a constant `ZyanStringView` pointer.\n */\n#define ZYAN_STRING_TO_VIEW(string) (const ZyanStringView*)(string)\n\n/**\n * Defines a `ZyanStringView` struct that provides a view into a static C-style string.\n *\n * @param   string  The C-style string.\n */\n#define ZYAN_DEFINE_STRING_VIEW(string) \\\n    { \\\n        /* string */ \\\n        { \\\n            /* flags  */ 0, \\\n            /* vector */ \\\n            { \\\n                /* allocator        */ ZYAN_NULL, \\\n                /* growth_factor    */ 1, \\\n                /* shrink_threshold */ 0, \\\n                /* size             */ sizeof(string), \\\n                /* capacity         */ sizeof(string), \\\n                /* element_size     */ sizeof(char), \\\n                /* destructor       */ ZYAN_NULL, \\\n                /* data             */ (char*)(string) \\\n            } \\\n        } \\\n    }\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constructor and destructor                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Initializes the given `ZyanString` instance.\n *\n * @param   string          A pointer to the `ZyanString` instance.\n * @param   capacity        The initial capacity (number of characters).\n *\n * @return  A zyan status code.\n *\n * The memory for the string is dynamically allocated by the default allocator using the default\n * growth factor and the default shrink threshold.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringInit(ZyanString* string, ZyanUSize capacity);\n\n#endif // ZYAN_NO_LIBC\n\n/**\n * Initializes the given `ZyanString` instance and sets a custom `allocator` and memory\n * allocation/deallocation parameters.\n *\n * @param   string              A pointer to the `ZyanString` instance.\n * @param   capacity            The initial capacity (number of characters).\n * @param   allocator           A pointer to a `ZyanAllocator` instance.\n * @param   growth_factor       The growth factor.\n * @param   shrink_threshold    The shrink threshold.\n *\n * @return  A zyan status code.\n *\n * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\n * dynamic shrinking.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringInitEx(ZyanString* string, ZyanUSize capacity,\n    ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);\n\n/**\n * Initializes the given `ZyanString` instance and configures it to use a custom user\n * defined buffer with a fixed size.\n *\n * @param   string          A pointer to the `ZyanString` instance.\n * @param   buffer          A pointer to the buffer that is used as storage for the string.\n * @param   capacity        The maximum capacity (number of characters) of the buffer, including\n *                          the terminating '\\0'.\n *\n * @return  A zyan status code.\n *\n * Finalization is not required for strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringInitCustomBuffer(ZyanString* string, char* buffer,\n    ZyanUSize capacity);\n\n/**\n * Destroys the given `ZyanString` instance.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n *\n * @return  A zyan status code.\n *\n */\nZYCORE_EXPORT ZyanStatus ZyanStringDestroy(ZyanString* string);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Duplication                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanString` instance by duplicating an existing string.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\n * @param   source      A pointer to the source string.\n * @param   capacity    The initial capacity (number of characters).\n *\n *                      This value is automatically adjusted to the size of the source string, if\n *                      a smaller value was passed.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `source` is a view into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * The memory for the string is dynamically allocated by the default allocator using the default\n * growth factor and the default shrink threshold.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringDuplicate(ZyanString* destination,\n    const ZyanStringView* source, ZyanUSize capacity);\n\n#endif // ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanString` instance by duplicating an existing string and sets a\n * custom `allocator` and memory allocation/deallocation parameters.\n *\n * @param   destination         A pointer to the (uninitialized) destination `ZyanString` instance.\n * @param   source              A pointer to the source string.\n * @param   capacity            The initial capacity (number of characters).\n\n *                              This value is automatically adjusted to the size of the source\n *                              string, if a smaller value was passed.\n * @param   allocator           A pointer to a `ZyanAllocator` instance.\n * @param   growth_factor       The growth factor.\n * @param   shrink_threshold    The shrink threshold.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `source` is a view into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\n * dynamic shrinking.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringDuplicateEx(ZyanString* destination,\n    const ZyanStringView* source, ZyanUSize capacity, ZyanAllocator* allocator,\n    ZyanU8 growth_factor, ZyanU8 shrink_threshold);\n\n/**\n * Initializes a new `ZyanString` instance by duplicating an existing string and\n * configures it to use a custom user defined buffer with a fixed size.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\n * @param   source      A pointer to the source string.\n * @param   buffer      A pointer to the buffer that is used as storage for the string.\n * @param   capacity    The maximum capacity (number of characters) of the buffer, including the\n *                      terminating '\\0'.\n\n *                      This function will fail, if the capacity of the buffer is less or equal to\n *                      the size of the source string.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `source` is a view into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * Finalization is not required for strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringDuplicateCustomBuffer(ZyanString* destination,\n    const ZyanStringView* source, char* buffer, ZyanUSize capacity);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Concatenation                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n#ifndef ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanString` instance by concatenating two existing strings.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\n *\n *                      This function will fail, if the destination `ZyanString` instance equals\n *                      one of the source strings.\n * @param   s1          A pointer to the first source string.\n * @param   s2          A pointer to the second source string.\n * @param   capacity    The initial capacity (number of characters).\n\n *                      This value is automatically adjusted to the combined size of the source\n *                      strings, if a smaller value was passed.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * The memory for the string is dynamically allocated by the default allocator using the default\n * growth factor and the default shrink threshold.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringConcat(ZyanString* destination,\n    const ZyanStringView* s1, const ZyanStringView* s2, ZyanUSize capacity);\n\n#endif // ZYAN_NO_LIBC\n\n/**\n * Initializes a new `ZyanString` instance by concatenating two existing strings and sets\n * a custom `allocator` and memory allocation/deallocation parameters.\n *\n * @param   destination         A pointer to the (uninitialized) destination `ZyanString` instance.\n *\n *                              This function will fail, if the destination `ZyanString` instance\n *                              equals one of the source strings.\n * @param   s1                  A pointer to the first source string.\n * @param   s2                  A pointer to the second source string.\n * @param   capacity            The initial capacity (number of characters).\n *\n *                              This value is automatically adjusted to the combined size of the\n *                              source strings, if a smaller value was passed.\n * @param   allocator           A pointer to a `ZyanAllocator` instance.\n * @param   growth_factor       The growth factor.\n * @param   shrink_threshold    The shrink threshold.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\n * dynamic shrinking.\n *\n * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\n * space for the terminating '\\0'.\n *\n * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringConcatEx(ZyanString* destination, const ZyanStringView* s1,\n    const ZyanStringView* s2, ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor,\n    ZyanU8 shrink_threshold);\n\n/**\n * Initializes a new `ZyanString` instance by concatenating two existing strings and\n * configures it to use a custom user defined buffer with a fixed size.\n *\n * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\n *\n *                      This function will fail, if the destination `ZyanString` instance equals\n *                      one of the source strings.\n * @param   s1          A pointer to the first source string.\n * @param   s2          A pointer to the second source string.\n * @param   buffer      A pointer to the buffer that is used as storage for the string.\n * @param   capacity    The maximum capacity (number of characters) of the buffer.\n *\n *                      This function will fail, if the capacity of the buffer is less or equal to\n *                      the combined size of the source strings.\n *\n * @return  A zyan status code.\n *\n * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\n * string or `destination` points to an already initialized `ZyanString` instance.\n *\n * Finalization is not required for strings created by this function.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringConcatCustomBuffer(ZyanString* destination,\n    const ZyanStringView* s1, const ZyanStringView* s2, char* buffer, ZyanUSize capacity);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Views                                                                                          */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns a view inside an existing view/string.\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   source  A pointer to the source string.\n *\n * @return  A zyan status code.\n *\n * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the\n * `source` string.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewInsideView(ZyanStringView* view,\n    const ZyanStringView* source);\n\n/**\n * Returns a view inside an existing view/string starting from the given `index`.\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   source  A pointer to the source string.\n * @param   index   The start index.\n * @param   count   The number of characters.\n *\n * @return  A zyan status code.\n *\n * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the\n * `source` string.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewInsideViewEx(ZyanStringView* view,\n    const ZyanStringView* source, ZyanUSize index, ZyanUSize count);\n\n/**\n * Returns a view inside a null-terminated C-style string.\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   string  The C-style string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBuffer(ZyanStringView* view, const char* string);\n\n/**\n * Returns a view inside a character buffer with custom length.\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   buffer  A pointer to the buffer containing the string characters.\n * @param   length  The length of the string (number of characters).\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBufferEx(ZyanStringView* view, const char* buffer,\n    ZyanUSize length);\n\n/**\n * Returns the size (number of characters) of the view.\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   size    Receives the size (number of characters) of the view.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewGetSize(const ZyanStringView* view, ZyanUSize* size);\n\n/**\n * Returns the C-style string of the given `ZyanString` instance.\n *\n * @warning The string is not guaranteed to be null terminated!\n *\n * @param   view    A pointer to the `ZyanStringView` instance.\n * @param   buffer  Receives a pointer to the C-style string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringViewGetData(const ZyanStringView* view, const char** buffer);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Character access                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the character at the given `index`.\n *\n * @param   string  A pointer to the `ZyanStringView` instance.\n * @param   index   The character index.\n * @param   value   Receives the desired character of the string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringGetChar(const ZyanStringView* string, ZyanUSize index,\n    char* value);\n\n/**\n * Returns a pointer to the character at the given `index`.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The character index.\n * @param   value   Receives a pointer to the desired character in the string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringGetCharMutable(ZyanString* string, ZyanUSize index,\n    char** value);\n\n/**\n * Assigns a new value to the character at the given `index`.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The character index.\n * @param   value   The character to assign.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringSetChar(ZyanString* string, ZyanUSize index, char value);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Insertion                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Inserts the content of the source string in the destination string at the given `index`.\n *\n * @param   destination The destination string.\n * @param   index       The insert index.\n * @param   source      The source string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringInsert(ZyanString* destination, ZyanUSize index,\n    const ZyanStringView* source);\n\n/**\n * Inserts `count` characters of the source string in the destination string at the given\n * `index`.\n *\n * @param   destination         The destination string.\n * @param   destination_index   The insert index.\n * @param   source              The source string.\n * @param   source_index        The index of the first character to be inserted from the source\n *                              string.\n * @param   count               The number of chars to insert from the source string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringInsertEx(ZyanString* destination, ZyanUSize destination_index,\n    const ZyanStringView* source, ZyanUSize source_index, ZyanUSize count);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Appending                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Appends the content of the source string to the end of the destination string.\n *\n * @param   destination The destination string.\n * @param   source      The source string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringAppend(ZyanString* destination, const ZyanStringView* source);\n\n/**\n * Appends `count` characters of the source string to the end of the destination string.\n *\n * @param   destination     The destination string.\n * @param   source          The source string.\n * @param   source_index    The index of the first character to be appended from the source string.\n * @param   count           The number of chars to append from the source string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringAppendEx(ZyanString* destination, const ZyanStringView* source,\n    ZyanUSize source_index, ZyanUSize count);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Deletion                                                                                       */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Deletes characters from the given string, starting at `index`.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The index of the first character to delete.\n * @param   count   The number of characters to delete.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringDelete(ZyanString* string, ZyanUSize index, ZyanUSize count);\n\n/**\n * Deletes all remaining characters from the given string, starting at `index`.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The index of the first character to delete.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringTruncate(ZyanString* string, ZyanUSize index);\n\n/**\n * Erases the given string.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringClear(ZyanString* string);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Searching                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Searches for the first occurrence of `needle` in the given `haystack` starting from the\n * left.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occured.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringLPos(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index);\n\n/**\n * Searches for the first occurrence of `needle` in the given `haystack` starting from the\n * left.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n * @param   index       The start index.\n * @param   count       The maximum number of characters to iterate, beginning from the start\n *                      `index`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occured.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringLPosEx(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\n\n/**\n * Performs a case-insensitive search for the first occurrence of `needle` in the given\n * `haystack` starting from the left.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occured.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringLPosI(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index);\n\n/**\n * Performs a case-insensitive search for the first occurrence of `needle` in the given\n * `haystack` starting from the left.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n * @param   index       The start index.\n * @param   count       The maximum number of characters to iterate, beginning from the start\n *                      `index`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringLPosIEx(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\n\n/**\n * Searches for the first occurrence of `needle` in the given `haystack` starting from the\n * right.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringRPos(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index);\n\n/**\n * Searches for the first occurrence of `needle` in the given `haystack` starting from the\n *          right.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n * @param   index       The start index.\n * @param   count       The maximum number of characters to iterate, beginning from the start\n *                      `index`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringRPosEx(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\n\n/**\n * Performs a case-insensitive search for the first occurrence of `needle` in the given\n * `haystack` starting from the right.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringRPosI(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index);\n\n/**\n * Performs a case-insensitive search for the first occurrence of `needle` in the given\n * `haystack` starting from the right.\n *\n * @param   haystack    The string to search in.\n * @param   needle      The sub-string to search for.\n * @param   found_index A pointer to a variable that receives the index of the first occurrence of\n *                      `needle`.\n * @param   index       The start index.\n * @param   count       The maximum number of characters to iterate, beginning from the start\n *                      `index`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n *\n * The `found_index` is set to `-1`, if the needle was not found.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringRPosIEx(const ZyanStringView* haystack,\n    const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Comparing                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Compares two strings.\n *\n * @param   s1      The first string\n * @param   s2      The second string.\n * @param   result  Receives the comparison result.\n *\n *                  Values:\n *                  - `result  < 0` -> The first character that does not match has a lower value\n *                    in `s1` than in `s2`.\n *                  - `result == 0` -> The contents of both strings are equal.\n *                  - `result  > 0` -> The first character that does not match has a greater value\n *                    in `s1` than in `s2`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringCompare(const ZyanStringView* s1, const ZyanStringView* s2,\n    ZyanI32* result);\n\n/**\n * Performs a case-insensitive comparison of two strings.\n *\n * @param   s1      The first string\n * @param   s2      The second string.\n * @param   result  Receives the comparison result.\n *\n *                  Values:\n *                  - `result  < 0` -> The first character that does not match has a lower value\n *                    in `s1` than in `s2`.\n *                  - `result == 0` -> The contents of both strings are equal.\n *                  - `result  > 0` -> The first character that does not match has a greater value\n *                    in `s1` than in `s2`.\n *\n * @return  `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another\n *          zyan status code, if an error occurred.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringCompareI(const ZyanStringView* s1, const ZyanStringView* s2,\n    ZyanI32* result);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Case conversion                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Converts the given string to lowercase letters.\n *\n * @param   string      A pointer to the `ZyanString` instance.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringToLowerCase(ZyanString* string);\n\n/**\n * Converts `count` characters of the given string to lowercase letters.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The start index.\n * @param   count   The number of characters to convert, beginning from the start `index`.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringToLowerCaseEx(ZyanString* string, ZyanUSize index,\n    ZyanUSize count);\n\n/**\n * Converts the given string to uppercase letters.\n *\n * @param   string      A pointer to the `ZyanString` instance.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringToUpperCase(ZyanString* string);\n\n/**\n * Converts `count` characters of the given string to uppercase letters.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   index   The start index.\n * @param   count   The number of characters to convert, beginning from the start `index`.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringToUpperCaseEx(ZyanString* string, ZyanUSize index,\n    ZyanUSize count);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Memory management                                                                              */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Resizes the given `ZyanString` instance.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   size    The new size of the string.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringResize(ZyanString* string, ZyanUSize size);\n\n/**\n * Changes the capacity of the given `ZyanString` instance.\n *\n * @param   string      A pointer to the `ZyanString` instance.\n * @param   capacity    The new minimum capacity of the string.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringReserve(ZyanString* string, ZyanUSize capacity);\n\n/**\n * Shrinks the capacity of the given string to match it's size.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n *\n * @return  A zyan status code.\n *\n * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\n * `ZyanString` instance.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringShrinkToFit(ZyanString* string);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Information                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the current capacity of the string.\n *\n * @param   string      A pointer to the `ZyanString` instance.\n * @param   capacity    Receives the size of the string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringGetCapacity(const ZyanString* string, ZyanUSize* capacity);\n\n/**\n * Returns the current size (number of characters) of the string (excluding the\n * terminating zero character).\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   size    Receives the size (number of characters) of the string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringGetSize(const ZyanString* string, ZyanUSize* size);\n\n/**\n * Returns the C-style string of the given `ZyanString` instance.\n *\n * @param   string  A pointer to the `ZyanString` instance.\n * @param   value   Receives a pointer to the C-style string.\n *\n * @return  A zyan status code.\n */\nZYCORE_EXPORT ZyanStatus ZyanStringGetData(const ZyanString* string, const char** value);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // ZYCORE_STRING_H\n\n//\n// Header: Zydis/FormatterBuffer.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//   - Zydis/Formatter.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Implements the `ZydisFormatterToken` type and provides functions to use it.\n */\n\n#ifndef ZYDIS_FORMATTER_TOKEN_H\n#define ZYDIS_FORMATTER_TOKEN_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Constants                                                                                      */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Token types                                                                                    */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisTokenType` data-type.\n */\ntypedef ZyanU8 ZydisTokenType;\n\n#define ZYDIS_TOKEN_INVALID             0x00\n/**\n * A whitespace character.\n */\n#define ZYDIS_TOKEN_WHITESPACE          0x01\n/**\n * A delimiter character (like `','`, `':'`, `'+'`, `'-'`, `'*'`).\n */\n#define ZYDIS_TOKEN_DELIMITER           0x02\n/**\n * An opening parenthesis character (like `'('`, `'['`, `'{'`).\n */\n#define ZYDIS_TOKEN_PARENTHESIS_OPEN    0x03\n/**\n * A closing parenthesis character (like `')'`, `']'`, `'}'`).\n */\n#define ZYDIS_TOKEN_PARENTHESIS_CLOSE   0x04\n/**\n * A prefix literal (like `\"LOCK\"`, `\"REP\"`).\n */\n#define ZYDIS_TOKEN_PREFIX              0x05\n/**\n * A mnemonic literal (like `\"MOV\"`, `\"VCMPPSD\"`, `\"LCALL\"`).\n */\n#define ZYDIS_TOKEN_MNEMONIC            0x06\n/**\n * A register literal (like `\"RAX\"`, `\"DS\"`, `\"%ECX\"`).\n */\n#define ZYDIS_TOKEN_REGISTER            0x07\n/**\n * An absolute address literal (like `0x00400000`).\n */\n#define ZYDIS_TOKEN_ADDRESS_ABS         0x08\n/**\n * A relative address literal (like `-0x100`).\n */\n#define ZYDIS_TOKEN_ADDRESS_REL         0x09\n/**\n * A displacement literal (like `0xFFFFFFFF`, `-0x100`, `+0x1234`).\n */\n#define ZYDIS_TOKEN_DISPLACEMENT        0x0A\n/**\n * An immediate literal (like `0xC0`, `-0x1234`, `$0x0000`).\n */\n#define ZYDIS_TOKEN_IMMEDIATE           0x0B\n/**\n * A typecast literal (like `DWORD PTR`).\n */\n#define ZYDIS_TOKEN_TYPECAST            0x0C\n/**\n * A decorator literal (like `\"Z\"`, `\"1TO4\"`).\n */\n#define ZYDIS_TOKEN_DECORATOR           0x0D\n/**\n * A symbol literal.\n */\n#define ZYDIS_TOKEN_SYMBOL              0x0E\n\n/**\n * The base for user-defined token types.\n */\n#define ZYDIS_TOKEN_USER                0x80\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Token                                                                                          */\n/* ---------------------------------------------------------------------------------------------- */\n\n#pragma pack(push, 1)\n\n/**\n * Defines the `ZydisFormatterToken` struct.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n */\ntypedef struct ZydisFormatterToken_\n{\n    /**\n     * The token type.\n     */\n    ZydisTokenType type;\n    /**\n     * An offset to the next token, or `0`.\n     */\n    ZyanU8 next;\n} ZydisFormatterToken;\n\n#pragma pack(pop)\n\n/**\n * Defines the `ZydisFormatterTokenConst` data-type.\n */\ntypedef const ZydisFormatterToken ZydisFormatterTokenConst;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Buffer                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisFormatterBuffer` struct.\n *\n * All fields in this struct should be considered as \"private\". Any changes may\n * lead to unexpected behavior.\n */\ntypedef struct ZydisFormatterBuffer_\n{\n    /**\n     * `ZYAN_TRUE`, if the buffer contains a token stream or `ZYAN_FALSE, if it\n     *  contains a simple string.\n     */\n    ZyanBool is_token_list;\n    /**\n     * The remaining capacity of the buffer.\n     */\n    ZyanUSize capacity;\n    /**\n     * The `ZyanString` instance that refers to the literal value of the most\n     * recently added token.\n     */\n    ZyanString string;\n} ZydisFormatterBuffer;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Token                                                                                          */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the `type` and the string `value` of the given `token`.\n *\n * @param   token   A pointer to the `ZydisFormatterToken` struct.\n * @param   type    Receives the token type.\n * @param   value   Receives a pointer to the string value of the token.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token,\n    ZydisTokenType* type, ZyanConstCharPointer* value);\n\n/**\n * Obtains the next `token` linked to the passed one.\n *\n * @param   token   Receives a pointer to the next `ZydisFormatterToken` struct\n *                  linked to the passed one.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Buffer                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the current (most recently added) token.\n *\n * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\n * @param   token   Receives a pointer to the current token.\n *\n * @return  A zyan status code.\n *\n * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least\n * one token.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer,\n    ZydisFormatterTokenConst** token);\n\n/**\n * Returns the `ZyanString` instance associated with the given buffer.\n *\n * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\n * @param   string  Receives a pointer to the `ZyanString` instance associated with the given\n *                  buffer.\n *\n * @return  A zyan status code.\n *\n * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least\n * one token.\n *\n * The returned string always refers to the literal value of the current (most recently added)\n * token and will remain valid until the buffer is destroyed.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer,\n    ZyanString** string);\n\n/**\n * Appends a new token to the `buffer`.\n *\n * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\n * @param   type    The type of the new token.\n *\n * @return  A zyan status code.\n *\n * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will\n * automatically be updated by calling this function.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer,\n    ZydisTokenType type);\n\n/**\n * Returns a snapshot of the buffer-state.\n *\n * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\n * @param   state   Receives a snapshot of the buffer-state.\n *\n * @return  A zyan status code.\n *\n * Note that the buffer-state is saved inside the buffer itself and thus becomes invalid as soon\n * as the buffer gets overwritten or destroyed.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer,\n    ZyanUPointer* state);\n\n/**\n * Restores a previously saved buffer-state.\n *\n * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\n * @param   state   The buffer-state to restore.\n *\n * @return  A zyan status code.\n *\n * All tokens added after obtaining the given `state` snapshot will be removed. This function\n * does NOT restore any string content.\n *\n * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will\n * automatically be updated by calling this function.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer,\n    ZyanUPointer state);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_FORMATTER_TOKEN_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Constants                                                                                      */\n/* ============================================================================================== */\n\n/**\n * Use this constant as value for `runtime_address` in `ZydisFormatterFormatInstruction(Ex)`\n * or `ZydisFormatterFormatOperand(Ex)` to print relative values for all addresses.\n */\n#define ZYDIS_RUNTIME_ADDRESS_NONE (ZyanU64)(-1)\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Formatter style                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum selecting the syntax to format the disassembly in.\n */\ntypedef enum ZydisFormatterStyle_\n{\n    /**\n     * Generates `AT&T`-style disassembly.\n     */\n    ZYDIS_FORMATTER_STYLE_ATT,\n    /**\n     * Generates `Intel`-style disassembly.\n     */\n    ZYDIS_FORMATTER_STYLE_INTEL,\n    /**\n     * Generates `MASM`-style disassembly that is directly accepted as input for\n     * the `MASM` assembler.\n     *\n     * The runtime-address is ignored in this mode.\n     */\n    ZYDIS_FORMATTER_STYLE_INTEL_MASM,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_FORMATTER_STYLE_MAX_VALUE = ZYDIS_FORMATTER_STYLE_INTEL_MASM,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_FORMATTER_STYLE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_STYLE_MAX_VALUE)\n} ZydisFormatterStyle;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Properties                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum selecting a property of the formatter.\n */\ntypedef enum ZydisFormatterProperty_\n{\n    /* ---------------------------------------------------------------------------------------- */\n    /* General                                                                                  */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the printing of effective operand-size suffixes (`AT&T`) or operand-sizes\n     * of memory operands (`INTEL`).\n     *\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the size, or `ZYAN_FALSE`\n     * to only print it if needed.\n     */\n    ZYDIS_FORMATTER_PROP_FORCE_SIZE,\n    /**\n     * Controls the printing of segment prefixes.\n     *\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the segment register of\n     * memory-operands or `ZYAN_FALSE` to omit implicit `DS`/`SS` segments.\n     */\n    ZYDIS_FORMATTER_PROP_FORCE_SEGMENT,\n    /**\n     * Controls the printing of the scale-factor component for memory operands.\n     *\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the scale-factor component\n     * of memory operands or `ZYAN_FALSE` to omit the scale factor for values of `1`.\n     */\n     ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE,\n    /**\n     * Controls the printing of branch addresses.\n     *\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print relative branch addresses\n     * or `ZYAN_FALSE` to use absolute addresses, if a runtime-address different to\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.\n     */\n    ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES,\n    /**\n     * Controls the printing of `EIP`/`RIP`-relative addresses.\n     *\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print relative addresses for\n     * `EIP`/`RIP`-relative operands or `ZYAN_FALSE` to use absolute addresses, if a runtime-\n     * address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.\n     */\n    ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL,\n    /**\n     * Controls the printing of branch-instructions sizes.\n     *\n     * Pass `ZYAN_TRUE` as value to print the size (`short`, `near`) of branch\n     * instructions or `ZYAN_FALSE` to hide it.\n     *\n     * Note that the `far`/`l` modifier is always printed.\n     */\n    ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE,\n\n    /**\n     * Controls the printing of instruction prefixes.\n     *\n     * Pass `ZYAN_TRUE` as value to print all instruction-prefixes (even ignored or duplicate\n     * ones) or `ZYAN_FALSE` to only print prefixes that are effectively used by the instruction.\n     */\n    ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Numeric values                                                                           */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the base of address values.\n     */\n    ZYDIS_FORMATTER_PROP_ADDR_BASE,\n    /**\n     * Controls the signedness of relative addresses. Absolute addresses are\n     * always unsigned.\n     */\n    ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS,\n    /**\n     * Controls the padding of absolute address values.\n     *\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all\n     * addresses to the current address width (hexadecimal only), or any other integer value for\n     * custom padding.\n     */\n    ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE,\n    /**\n     * Controls the padding of relative address values.\n     *\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all\n     * addresses to the current address width (hexadecimal only), or any other integer value for\n     * custom padding.\n     */\n    ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the base of displacement values.\n     */\n    ZYDIS_FORMATTER_PROP_DISP_BASE,\n    /**\n     * Controls the signedness of displacement values.\n     */\n    ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS,\n    /**\n     * Controls the padding of displacement values.\n     *\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, or any other integer value for custom\n     * padding.\n     */\n    ZYDIS_FORMATTER_PROP_DISP_PADDING,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the base of immediate values.\n     */\n    ZYDIS_FORMATTER_PROP_IMM_BASE,\n    /**\n     * Controls the signedness of immediate values.\n     *\n     * Pass `ZYDIS_SIGNEDNESS_AUTO` to automatically choose the most suitable mode based on the\n     * operands `ZydisDecodedOperand.imm.is_signed` attribute.\n     */\n    ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS,\n    /**\n     * Controls the padding of immediate values.\n     *\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all\n     * immediates to the operand-width (hexadecimal only), or any other integer value for custom\n     * padding.\n     */\n    ZYDIS_FORMATTER_PROP_IMM_PADDING,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Text formatting                                                                          */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the letter-case for prefixes.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\n     */\n    ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES,\n    /**\n     * Controls the letter-case for the mnemonic.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\n     */\n    ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC,\n    /**\n     * Controls the letter-case for registers.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\n     */\n    ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS,\n    /**\n     * Controls the letter-case for typecasts.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\n     */\n    ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS,\n    /**\n     * Controls the letter-case for decorators.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\n     *\n     * WARNING: this is currently not implemented (ignored).\n     */\n    ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Number formatting                                                                        */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the prefix for decimal values.\n     *\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\n     * to set a custom prefix, or `ZYAN_NULL` to disable it.\n     *\n     * The string is deep-copied into an internal buffer.\n     */\n    ZYDIS_FORMATTER_PROP_DEC_PREFIX,\n    /**\n     * Controls the suffix for decimal values.\n     *\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\n     * to set a custom suffix, or `ZYAN_NULL` to disable it.\n     *\n     * The string is deep-copied into an internal buffer.\n     */\n    ZYDIS_FORMATTER_PROP_DEC_SUFFIX,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Controls the letter-case of hexadecimal values.\n     *\n     * Pass `ZYAN_TRUE` as value to format in uppercase and `ZYAN_FALSE` to format in lowercase.\n     *\n     * The default value is `ZYAN_TRUE`.\n     */\n    ZYDIS_FORMATTER_PROP_HEX_UPPERCASE,\n    /**\n     * Controls whether to prepend hexadecimal values with a leading zero if the first character\n     * is non-numeric.\n     *\n     * Pass `ZYAN_TRUE` to prepend a leading zero if the first character is non-numeric or\n     * `ZYAN_FALSE` to disable this functionality.\n     *\n     * The default value is `ZYAN_FALSE`.\n     */\n    ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER,\n    /**\n     * Controls the prefix for hexadecimal values.\n     *\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\n     * to set a custom prefix, or `ZYAN_NULL` to disable it.\n     *\n     * The string is deep-copied into an internal buffer.\n     */\n    ZYDIS_FORMATTER_PROP_HEX_PREFIX,\n    /**\n     * Controls the suffix for hexadecimal values.\n     *\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\n     * to set a custom suffix, or `ZYAN_NULL` to disable it.\n     *\n     * The string is deep-copied into an internal buffer.\n     */\n    ZYDIS_FORMATTER_PROP_HEX_SUFFIX,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_FORMATTER_PROP_MAX_VALUE = ZYDIS_FORMATTER_PROP_HEX_SUFFIX,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_FORMATTER_PROP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_PROP_MAX_VALUE)\n} ZydisFormatterProperty;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum defining different mantissae to be used during formatting.\n */\ntypedef enum ZydisNumericBase_\n{\n    /**\n     * Decimal system.\n     */\n    ZYDIS_NUMERIC_BASE_DEC,\n    /**\n     * Hexadecimal system.\n     */\n    ZYDIS_NUMERIC_BASE_HEX,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_NUMERIC_BASE_MAX_VALUE = ZYDIS_NUMERIC_BASE_HEX,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_NUMERIC_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_NUMERIC_BASE_MAX_VALUE)\n} ZydisNumericBase;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum defining the signeness of integers to be used during formatting.\n */\ntypedef enum ZydisSignedness_\n{\n    /**\n     * Automatically choose the most suitable mode based on the operands\n     * ZydisDecodedOperand.imm.is_signed` attribute.\n     */\n    ZYDIS_SIGNEDNESS_AUTO,\n    /**\n     * Force signed values.\n     */\n    ZYDIS_SIGNEDNESS_SIGNED,\n    /**\n     * Force unsigned values.\n     */\n    ZYDIS_SIGNEDNESS_UNSIGNED,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_SIGNEDNESS_MAX_VALUE = ZYDIS_SIGNEDNESS_UNSIGNED,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_SIGNEDNESS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SIGNEDNESS_MAX_VALUE)\n} ZydisSignedness;\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum definining magic values that receive special treatment when used as padding properties\n * of the formatter.\n */\ntypedef enum ZydisPadding_\n{\n    /**\n     * Disables padding.\n     */\n    ZYDIS_PADDING_DISABLED = 0,\n    /**\n     * Padds the value to the current stack-width for addresses, or to the\n     * operand-width for immediate values (hexadecimal only).\n     */\n    ZYDIS_PADDING_AUTO     = (-1),\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_PADDING_MAX_VALUE = ZYDIS_PADDING_AUTO,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_PADDING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PADDING_MAX_VALUE)\n} ZydisPadding;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Function types                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum selecting a formatter function to be replaced with hooks.\n *\n * Do NOT change the order of the values this enum or the function fields inside the\n * `ZydisFormatter` struct.\n */\ntypedef enum ZydisFormatterFunction_\n{\n    /* ---------------------------------------------------------------------------------------- */\n    /* Instruction                                                                              */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked before the formatter formats an instruction.\n     */\n    ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION,\n    /**\n     * This function is invoked after the formatter formatted an instruction.\n     */\n    ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function refers to the main formatting function.\n     *\n     * Replacing this function allows for complete custom formatting, but indirectly disables all\n     * other hooks except for `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` and\n     * `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`.\n     */\n    ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Operands                                                                                 */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked before the formatter formats an operand.\n     */\n    ZYDIS_FORMATTER_FUNC_PRE_OPERAND,\n    /**\n     * This function is invoked after the formatter formatted an operand.\n     */\n    ZYDIS_FORMATTER_FUNC_POST_OPERAND,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked to format a register operand.\n     */\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG,\n    /**\n     * This function is invoked to format a memory operand.\n     *\n     * Replacing this function might indirectly disable some specific calls to the\n     * `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`, `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`,\n     * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` and `ZYDIS_FORMATTER_FUNC_PRINT_DISP` functions.\n     */\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM,\n    /**\n     * This function is invoked to format a pointer operand.\n     */\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR,\n    /**\n     * This function is invoked to format an immediate operand.\n     *\n     * Replacing this function might indirectly disable some specific calls to the\n     * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` and\n     * `ZYDIS_FORMATTER_FUNC_PRINT_IMM` functions.\n     */\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Elemental tokens                                                                         */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked to print the instruction mnemonic.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked to print a register.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_REGISTER,\n    /**\n     * This function is invoked to print absolute addresses.\n     *\n     * Conditionally invoked, if a runtime-address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was\n     * passed:\n     * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\n     * - `MEM` operands with `EIP`/`RIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)\n     *\n     * Always invoked for:\n     * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS,\n    /**\n     * This function is invoked to print relative addresses.\n     *\n     * Conditionally invoked, if `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as runtime-address:\n     * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL,\n    /**\n     * This function is invoked to print a memory displacement value.\n     *\n     * If the memory displacement contains an address and a runtime-address different to\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called\n     * instead.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_DISP,\n    /**\n     * This function is invoked to print an immediate value.\n     *\n     * If the immediate contains an address and a runtime-address different to\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called\n     * instead.\n     *\n     * If the immediate contains an address and `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as\n     * runtime-address, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` is called instead.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_IMM,\n\n    /* ---------------------------------------------------------------------------------------- */\n    /* Optional tokens                                                                          */\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * This function is invoked to print the size of a memory operand (`INTEL` only).\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST,\n    /**\n     * This function is invoked to print the segment-register of a memory operand.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT,\n    /**\n     * This function is invoked to print the instruction prefixes.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES,\n    /**\n     * This function is invoked after formatting an operand to print a `EVEX`/`MVEX`\n     * decorator.\n     */\n    ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,\n\n    /* ---------------------------------------------------------------------------------------- */\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_FORMATTER_FUNC_MAX_VALUE = ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_FORMATTER_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_FUNC_MAX_VALUE)\n} ZydisFormatterFunction;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Decorator types                                                                                */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Enum of all decorator types.\n */\ntypedef enum ZydisDecorator_\n{\n    ZYDIS_DECORATOR_INVALID,\n    /**\n     * The embedded-mask decorator.\n     */\n    ZYDIS_DECORATOR_MASK,\n    /**\n     * The broadcast decorator.\n     */\n    ZYDIS_DECORATOR_BC,\n    /**\n     * The rounding-control decorator.\n     */\n    ZYDIS_DECORATOR_RC,\n    /**\n     * The suppress-all-exceptions decorator.\n     */\n    ZYDIS_DECORATOR_SAE,\n    /**\n     * The register-swizzle decorator.\n     */\n    ZYDIS_DECORATOR_SWIZZLE,\n    /**\n     * The conversion decorator.\n     */\n    ZYDIS_DECORATOR_CONVERSION,\n    /**\n     * The eviction-hint decorator.\n     */\n    ZYDIS_DECORATOR_EH,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_DECORATOR_MAX_VALUE = ZYDIS_DECORATOR_EH,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_DECORATOR_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECORATOR_MAX_VALUE)\n} ZydisDecorator;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Formatter context                                                                              */\n/* ---------------------------------------------------------------------------------------------- */\n\ntypedef struct ZydisFormatter_ ZydisFormatter;\n\n/**\n * Context structure that that is passed to all formatter.\n */\ntypedef struct ZydisFormatterContext_\n{\n    /**\n     * A pointer to the `ZydisDecodedInstruction` struct.\n     */\n    const ZydisDecodedInstruction* instruction;\n    /**\n     * A pointer to the first `ZydisDecodedOperand` struct of the instruction.\n     */\n    const ZydisDecodedOperand* operands;\n    /**\n     * A pointer to the `ZydisDecodedOperand` struct.\n     */\n    const ZydisDecodedOperand* operand;\n    /**\n     * The runtime address of the instruction.\n     */\n    ZyanU64 runtime_address;\n    /**\n     * A pointer to user-defined data.\n     *\n     * This is the value that was previously passed as the `user_data` argument to\n     * @ref ZydisFormatterFormatInstruction or @ref ZydisFormatterTokenizeOperand.\n     */\n    void* user_data;\n} ZydisFormatterContext;\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Function prototypes                                                                            */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Defines the `ZydisFormatterFunc` function prototype.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\n * @param   context     A pointer to the `ZydisFormatterContext` struct.\n *\n * @return  A zyan status code.\n *\n * Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the formatting\n * process to fail (see exceptions below).\n *\n * Returning `ZYDIS_STATUS_SKIP_TOKEN` is valid for functions of the following types and will\n * instruct the formatter to omit the whole operand:\n * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\n *\n * This function prototype is used by functions of the following types:\n * - `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION`\n * - `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`\n * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\n * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_DISP`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_IMM`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`\n * - `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`\n */\ntypedef ZyanStatus (*ZydisFormatterFunc)(const ZydisFormatter* formatter,\n    ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);\n\n /**\n * Defines the `ZydisFormatterRegisterFunc` function prototype.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\n * @param   context     A pointer to the `ZydisFormatterContext` struct.\n * @param   reg         The register.\n *\n * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the\n *          formatting process to fail.\n *\n * This function prototype is used by functions of the following types:\n * - `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER`.\n */\ntypedef ZyanStatus (*ZydisFormatterRegisterFunc)(const ZydisFormatter* formatter,\n    ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);\n\n/**\n * Defines the `ZydisFormatterDecoratorFunc` function prototype.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\n * @param   context     A pointer to the `ZydisFormatterContext` struct.\n * @param   decorator   The decorator type.\n *\n * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the\n *          formatting process to fail.\n *\n * This function type is used for:\n * - `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR`\n */\ntypedef ZyanStatus (*ZydisFormatterDecoratorFunc)(const ZydisFormatter* formatter,\n    ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Formatter struct                                                                               */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Context structure keeping track of internal state of the formatter.\n *\n * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\n * behavior.\n *\n * Do NOT change the order of the function fields or the values of the `ZydisFormatterFunction`\n * enum.\n */\nstruct ZydisFormatter_\n{\n    /**\n     * The formatter style.\n     */\n    ZydisFormatterStyle style;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SIZE` property.\n     */\n    ZyanBool force_memory_size;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SEGMENT` property.\n     */\n    ZyanBool force_memory_segment;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE` property.\n     */\n    ZyanBool force_memory_scale;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES` property.\n     */\n    ZyanBool force_relative_branches;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL` property.\n     */\n    ZyanBool force_relative_riprel;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE` property.\n     */\n    ZyanBool print_branch_size;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES` property.\n     */\n    ZyanBool detailed_prefixes;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_ADDR_BASE` property.\n     */\n    ZydisNumericBase addr_base;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS` property.\n     */\n    ZydisSignedness addr_signedness;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE` property.\n     */\n    ZydisPadding addr_padding_absolute;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE` property.\n     */\n    ZydisPadding addr_padding_relative;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_DISP_BASE` property.\n     */\n    ZydisNumericBase disp_base;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS` property.\n     */\n    ZydisSignedness disp_signedness;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_DISP_PADDING` property.\n     */\n    ZydisPadding disp_padding;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_IMM_BASE` property.\n     */\n    ZydisNumericBase imm_base;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS` property.\n     */\n    ZydisSignedness imm_signedness;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_IMM_PADDING` property.\n     */\n    ZydisPadding imm_padding;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES` property.\n     */\n    ZyanI32 case_prefixes;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC` property.\n     */\n    ZyanI32 case_mnemonic;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS` property.\n     */\n    ZyanI32 case_registers;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS` property.\n     */\n    ZyanI32 case_typecasts;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS` property.\n     */\n    ZyanI32 case_decorators;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_HEX_UPPERCASE` property.\n     */\n    ZyanBool hex_uppercase;\n    /**\n     * The `ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER` property.\n     */\n    ZyanBool hex_force_leading_number;\n    /**\n     * The number formats for all numeric bases.\n     *\n     * Index 0 = prefix\n     * Index 1 = suffix\n     */\n    struct\n    {\n        /**\n         * A pointer to the `ZyanStringView` to use as prefix/suffix.\n         */\n        const ZyanStringView* string;\n        /**\n         * The `ZyanStringView` to use as prefix/suffix\n         */\n        ZyanStringView string_data;\n        /**\n         * The actual string data.\n         */\n        char buffer[11];\n    } number_format[ZYDIS_NUMERIC_BASE_MAX_VALUE + 1][2];\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` function.\n     */\n    ZydisFormatterFunc func_pre_instruction;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION` function.\n     */\n    ZydisFormatterFunc func_post_instruction;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION` function.\n     */\n    ZydisFormatterFunc func_format_instruction;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` function.\n     */\n    ZydisFormatterFunc func_pre_operand;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_POST_OPERAND` function.\n     */\n    ZydisFormatterFunc func_post_operand;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` function.\n     */\n    ZydisFormatterFunc func_format_operand_reg;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` function.\n     */\n    ZydisFormatterFunc func_format_operand_mem;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` function.\n     */\n    ZydisFormatterFunc func_format_operand_ptr;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` function.\n     */\n    ZydisFormatterFunc func_format_operand_imm;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC function.\n     */\n    ZydisFormatterFunc func_print_mnemonic;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER` function.\n     */\n    ZydisFormatterRegisterFunc func_print_register;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` function.\n     */\n    ZydisFormatterFunc func_print_address_abs;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` function.\n     */\n    ZydisFormatterFunc func_print_address_rel;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_DISP` function.\n     */\n    ZydisFormatterFunc func_print_disp;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_IMM` function.\n     */\n    ZydisFormatterFunc func_print_imm;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST` function.\n     */\n    ZydisFormatterFunc func_print_typecast;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT` function.\n     */\n    ZydisFormatterFunc func_print_segment;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES` function.\n     */\n    ZydisFormatterFunc func_print_prefixes;\n    /**\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR` function.\n     */\n    ZydisFormatterDecoratorFunc func_print_decorator;\n};\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup formatter Formatter\n * Functions allowing formatting of previously decoded instructions to human readable text.\n * @{\n */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Initialization                                                                                 */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Initializes the given `ZydisFormatter` instance.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   style       The base formatter style (either `AT&T` or `Intel` style).\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Setter                                                                                         */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Changes the value of the specified formatter `property`.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   property    The id of the formatter-property.\n * @param   value       The new value.\n *\n * @return  A zyan status code.\n *\n * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a property can't be changed for the\n * current formatter-style.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter,\n    ZydisFormatterProperty property, ZyanUPointer value);\n\n/**\n * Replaces a formatter function with a custom callback and/or retrieves the currently\n * used function.\n *\n * @param   formatter   A pointer to the `ZydisFormatter` instance.\n * @param   type        The formatter function-type.\n * @param   callback    A pointer to a variable that contains the pointer of the callback function\n *                      and receives the pointer of the currently used function.\n *\n * @return  A zyan status code.\n *\n * Call this function with `callback` pointing to a `ZYAN_NULL` value to retrieve the currently\n * used function without replacing it.\n *\n * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a function can't be replaced for the\n * current formatter-style.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter,\n    ZydisFormatterFunction type, const void** callback);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Formatting                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Formats the given instruction and writes it into the output buffer.\n *\n * @param   formatter       A pointer to the `ZydisFormatter` instance.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operands        A pointer to the decoded operands array.\n * @param   operand_count   The length of the `operands` array. Must be equal to or greater than\n *                          the value of `instruction->operand_count_visible`.\n * @param   buffer          A pointer to the output buffer.\n * @param   length          The length of the output buffer (in characters).\n * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\n *                          to print relative addresses.\n * @param   user_data       A pointer to user-defined data which can be used in custom formatter\n *                          callbacks. Can be `ZYAN_NULL`.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter,\n    const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\n    ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address,\n    void* user_data);\n\n/**\n * Formats the given operand and writes it into the output buffer.\n *\n * @param   formatter       A pointer to the `ZydisFormatter` instance.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.\n * @param   buffer          A pointer to the output buffer.\n * @param   length          The length of the output buffer (in characters).\n * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\n *                          to print relative addresses.\n * @param   user_data       A pointer to user-defined data which can be used in custom formatter\n *                          callbacks. Can be `ZYAN_NULL`.\n *\n * @return  A zyan status code.\n *\n * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a\n * complete instruction.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter,\n    const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,\n    char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data);\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Tokenizing                                                                                     */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Tokenizes the given instruction and writes it into the output buffer.\n *\n * @param   formatter       A pointer to the `ZydisFormatter` instance.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operands        A pointer to the decoded operands array.\n * @param   operand_count   The length of the `operands` array. Must be equal to or greater than\n *                          the value of `instruction->operand_count_visible`.\n * @param   buffer          A pointer to the output buffer.\n * @param   length          The length of the output buffer (in bytes).\n * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\n *                          to print relative addresses.\n * @param   token           Receives a pointer to the first token in the output buffer.\n * @param   user_data       A pointer to user-defined data which can be used in custom formatter\n *                          callbacks. Can be `ZYAN_NULL`.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter,\n    const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\n    ZyanU8 operand_count, void* buffer, ZyanUSize length, ZyanU64 runtime_address,\n    ZydisFormatterTokenConst** token, void* user_data);\n\n/**\n * Tokenizes the given operand and writes it into the output buffer.\n *\n * @param   formatter       A pointer to the `ZydisFormatter` instance.\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.\n * @param   buffer          A pointer to the output buffer.\n * @param   length          The length of the output buffer (in bytes).\n * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\n *                          to print relative addresses.\n * @param   token           Receives a pointer to the first token in the output buffer.\n * @param   user_data       A pointer to user-defined data which can be used in custom formatter\n *                          callbacks. Can be `ZYAN_NULL`.\n *\n * @return  A zyan status code.\n *\n * Use `ZydisFormatterTokenizeInstruction` to tokenize a complete instruction.\n */\nZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter,\n    const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,\n    void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token,\n    void* user_data);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * @}\n */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_FORMATTER_H */\n#endif\n\n#if !defined(ZYDIS_DISABLE_SEGMENT)\n\n//\n// Header: Zydis/Segment.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Functions and types providing encoding information about individual instruction bytes.\n */\n\n#ifndef ZYDIS_SEGMENT_H\n#define ZYDIS_SEGMENT_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n* @addtogroup segment Segment\n* Functions and types providing encoding information about individual instruction bytes.\n* @{\n*/\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constants                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n#define ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT 9\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZydisInstructionSegment` struct.\n */\ntypedef enum ZydisInstructionSegment_\n{\n    ZYDIS_INSTR_SEGMENT_NONE,\n    /**\n     * The legacy prefixes (including ignored `REX` prefixes).\n     */\n    ZYDIS_INSTR_SEGMENT_PREFIXES,\n    /**\n     * The effective `REX` prefix byte.\n     */\n    ZYDIS_INSTR_SEGMENT_REX,\n    /**\n     * The `XOP` prefix bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_XOP,\n    /**\n     * The `VEX` prefix bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_VEX,\n    /**\n     * The `EVEX` prefix bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_EVEX,\n    /**\n     * The `MVEX` prefix bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_MVEX,\n    /**\n     * The opcode bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_OPCODE,\n    /**\n     * The `ModRM` byte.\n     */\n    ZYDIS_INSTR_SEGMENT_MODRM,\n    /**\n     * The `SIB` byte.\n     */\n    ZYDIS_INSTR_SEGMENT_SIB,\n    /**\n     * The displacement bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_DISPLACEMENT,\n    /**\n     * The immediate bytes.\n     */\n    ZYDIS_INSTR_SEGMENT_IMMEDIATE,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_INSTR_SEGMENT_MAX_VALUE = ZYDIS_INSTR_SEGMENT_IMMEDIATE,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_INSTR_SEGMENT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTR_SEGMENT_MAX_VALUE)\n} ZydisInstructionSegment;\n\n/**\n * Defines the `ZydisInstructionSegments` struct.\n */\ntypedef struct ZydisInstructionSegments_\n{\n    /**\n     * The number of logical instruction segments.\n     */\n    ZyanU8 count;\n    struct\n    {\n        /**\n         * The type of the segment.\n         */\n        ZydisInstructionSegment type;\n        /**\n         * The offset of the segment relative to the start of the instruction (in bytes).\n         */\n        ZyanU8 offset;\n        /**\n         * The size of the segment, in bytes.\n         */\n        ZyanU8 size;\n    } segments[ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT];\n} ZydisInstructionSegments;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * Returns offsets and sizes of all logical instruction segments (e.g. `OPCODE`,\n * `MODRM`, ...).\n *\n * @param   instruction A pointer to the `ZydisDecodedInstruction` struct.\n * @param   segments    Receives the instruction segments information.\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction,\n        ZydisInstructionSegments* segments);\n\n/* ============================================================================================== */\n\n/**\n * @}\n */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_SEGMENT_H */\n#endif\n\n#if !defined(ZYDIS_DISABLE_DECODER) && !defined(ZYDIS_DISABLE_FORMATTER)\n\n//\n// Header: Zydis/Disassembler.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Joel Hoener\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * All-in-one convenience function providing the simplest possible way to use Zydis.\n */\n\n#ifndef ZYDIS_DISASSEMBLER_H\n#define ZYDIS_DISASSEMBLER_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Types                                                                                          */\n/* ============================================================================================== */\n\n/**\n * All commonly used information about a decoded instruction that Zydis can provide.\n *\n * This structure is filled in by calling `ZydisDisassembleIntel` or `ZydisDisassembleATT`.\n */\ntypedef struct ZydisDisassembledInstruction_\n{\n    /**\n     * The runtime address that was passed when disassembling the instruction.\n     */\n    ZyanU64 runtime_address;\n    /**\n     * General information about the decoded instruction in machine-readable format.\n     */\n    ZydisDecodedInstruction info;\n    /**\n     * The operands of the decoded instruction in a machine-readable format.\n     *\n     * The amount of actual operands can be determined by inspecting the corresponding fields\n     * in the `info` member of this struct. Inspect `operand_count_visible` if you care about\n     * visible operands (those that are printed by the formatter) or `operand_count` if you're\n     * also interested in implicit operands (for example the registers implicitly accessed by\n     * `pushad`). Unused entries are zeroed.\n     */\n    ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT];\n    /**\n     * The textual, human-readable representation of the instruction.\n     *\n     * Guaranteed to be zero-terminated.\n     */\n    char text[96];\n} ZydisDisassembledInstruction;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * Disassemble an instruction and format it to human-readable text in a single step (Intel syntax).\n *\n * @param machine_mode      The machine mode to assume when disassembling. When in doubt, pass\n *                          `ZYDIS_MACHINE_MODE_LONG_64` for what is typically referred to as\n *                          \"64-bit mode\" or `ZYDIS_MACHINE_MODE_LEGACY_32` for \"32-bit mode\".\n * @param runtime_address   The program counter (`eip` / `rip`) to assume when formatting the\n *                          instruction. Many instructions behave differently depending on the\n *                          address they are located at.\n * @param buffer            A pointer to the raw instruction bytes that you wish to decode.\n * @param length            The length of the input buffer. Note that this can be bigger than the\n *                          actual size of the instruction -- you don't have to know the size up\n *                          front. This length is merely used to prevent Zydis from doing\n *                          out-of-bounds reads on your buffer.\n * @param instruction       A pointer to receive the decoded instruction information. Can be\n *                          uninitialized and reused on later calls.\n *\n * This is a convenience function intended as a quick path for getting started with using Zydis.\n * It internally calls a range of other more advanced functions to obtain all commonly needed\n * information about the instruction. It is likely that you won't need most of this information in\n * practice, so it is advisable to instead call these more advanced functions directly if you're\n * concerned about performance.\n *\n * This function essentially combines the following more advanced functions into a single call:\n *\n *   - `ZydisDecoderInit`\n *   - `ZydisDecoderDecodeInstruction`\n *   - `ZydisDecoderDecodeOperands`\n *   - `ZydisFormatterInit`\n *   - `ZydisFormatterFormatInstruction`\n *\n * @return  A zyan status code.\n */\nZYDIS_EXPORT ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode,\n    ZyanU64 runtime_address, const void* buffer, ZyanUSize length,\n    ZydisDisassembledInstruction *instruction);\n\n/**\n * Disassemble an instruction and format it to human-readable text in a single step (AT&T syntax).\n *\n * @copydetails ZydisDisassembleIntel\n */\nZYDIS_EXPORT ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode,\n    ZyanU64 runtime_address, const void* buffer, ZyanUSize length,\n    ZydisDisassembledInstruction *instruction);\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_DISASSEMBLER_H */\n#endif\n\n\n//\n// Header: Zydis/Utils.h\n//\n// Include stack:\n//   - Zydis/Zydis.h\n//\n\n/***************************************************************************************************\n\n  Zyan Disassembler Library (Zydis)\n\n  Original Author : Florian Bernd\n\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n\n***************************************************************************************************/\n\n/**\n * @file\n * Other utility functions.\n */\n\n#ifndef ZYDIS_UTILS_H\n#define ZYDIS_UTILS_H\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * @addtogroup utils Utils\n * Miscellaneous utility functions. Address translation and other helpers.\n * @{\n */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Address calculation                                                                            */\n/* ---------------------------------------------------------------------------------------------- */\n\n// TODO: Provide a function that works in minimal-mode and does not require a operand parameter\n\n/**\n * Calculates the absolute address value for the given instruction operand.\n *\n * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operand         A pointer to the `ZydisDecodedOperand` struct.\n * @param   runtime_address The runtime address of the instruction.\n * @param   result_address  A pointer to the memory that receives the absolute address.\n *\n * @return  A zyan status code.\n *\n * You should use this function in the following cases:\n * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\n * - `MEM` operands with `RIP`/`EIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)\n * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)\n *   - The displacement needs to get truncated and zero extended\n */\nZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction,\n    const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address);\n\n/**\n * Calculates the absolute address value for the given instruction operand.\n *\n * @param   instruction         A pointer to the `ZydisDecodedInstruction` struct.\n * @param   operand             A pointer to the `ZydisDecodedOperand` struct.\n * @param   runtime_address     The runtime address of the instruction.\n * @param   register_context    A pointer to the `ZydisRegisterContext` struct.\n * @param   result_address      A pointer to the memory that receives the absolute target-address.\n *\n * @return  A zyan status code.\n *\n * This function behaves like `ZydisCalcAbsoluteAddress` but takes an additional register-context\n * argument to allow calculation of addresses depending on runtime register values.\n *\n * Note that `IP/EIP/RIP` from the register-context will be ignored in favor of the passed\n * runtime-address.\n */\nZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction,\n    const ZydisDecodedOperand* operand, ZyanU64 runtime_address,\n    const ZydisRegisterContext* register_context, ZyanU64* result_address);\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * @}\n */\n\n/* ============================================================================================== */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_UTILS_H */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @addtogroup version Version\n *\n * Functions for checking the library version and build options.\n *\n * @{\n */\n\n/* ============================================================================================== */\n/* Macros                                                                                         */\n/* ============================================================================================== */\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Constants                                                                                      */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * A macro that defines the zydis version.\n */\n#define ZYDIS_VERSION (ZyanU64)0x0004000100000000\n\n/* ---------------------------------------------------------------------------------------------- */\n/* Helper macros                                                                                  */\n/* ---------------------------------------------------------------------------------------------- */\n\n/**\n * Extracts the major-part of the zydis version.\n *\n * @param   version The zydis version value\n */\n#define ZYDIS_VERSION_MAJOR(version) (ZyanU16)(((version) & 0xFFFF000000000000) >> 48)\n\n/**\n * Extracts the minor-part of the zydis version.\n *\n * @param   version The zydis version value\n */\n#define ZYDIS_VERSION_MINOR(version) (ZyanU16)(((version) & 0x0000FFFF00000000) >> 32)\n\n/**\n * Extracts the patch-part of the zydis version.\n *\n * @param   version The zydis version value\n */\n#define ZYDIS_VERSION_PATCH(version) (ZyanU16)(((version) & 0x00000000FFFF0000) >> 16)\n\n/**\n * Extracts the build-part of the zydis version.\n *\n * @param   version The zydis version value\n */\n#define ZYDIS_VERSION_BUILD(version) (ZyanU16)((version) & 0x000000000000FFFF)\n\n/* ---------------------------------------------------------------------------------------------- */\n\n/* ============================================================================================== */\n/* Enums and types                                                                                */\n/* ============================================================================================== */\n\n/**\n * Defines the `ZydisFeature` enum.\n */\ntypedef enum ZydisFeature_\n{\n    ZYDIS_FEATURE_DECODER,\n    ZYDIS_FEATURE_ENCODER,\n    ZYDIS_FEATURE_FORMATTER,\n    ZYDIS_FEATURE_AVX512,\n    ZYDIS_FEATURE_KNC,\n    ZYDIS_FEATURE_SEGMENT,\n\n    /**\n     * Maximum value of this enum.\n     */\n    ZYDIS_FEATURE_MAX_VALUE = ZYDIS_FEATURE_SEGMENT,\n    /**\n     * The minimum number of bits required to represent all values of this enum.\n     */\n    ZYDIS_FEATURE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FEATURE_MAX_VALUE)\n} ZydisFeature;\n\n/* ============================================================================================== */\n/* Exported functions                                                                             */\n/* ============================================================================================== */\n\n/**\n * Returns the zydis version.\n *\n * @return  The zydis version.\n *\n * Use the macros provided in this file to extract the major, minor, patch and build part from the\n * returned version value.\n */\nZYDIS_EXPORT ZyanU64 ZydisGetVersion(void);\n\n/**\n * Checks, if the specified feature is enabled in the current zydis library instance.\n *\n * @param   feature The feature.\n *\n * @return  `ZYAN_STATUS_TRUE` if the feature is enabled, `ZYAN_STATUS_FALSE` if not. Another\n *          zyan status code, if an error occured.\n */\nZYDIS_EXPORT ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature);\n\n/* ============================================================================================== */\n\n/**\n * @}\n */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZYDIS_H */"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/arm64dis.h",
    "content": "#pragma once\n\n#include \"decode.h\"\n#include \"format.h\"\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode.c",
    "content": "#include \"decode.h\"\n#include \"feature_flags.h\"\n\nint decode_spec(context* ctx, Instruction* dec);        // from decode0.cpp\nint decode_scratchpad(context* ctx, Instruction* dec);  // from decode_scratchpad.c\n\nint aarch64_decompose(uint32_t instructionValue, Instruction* instr, uint64_t address)\n{\n\tcontext ctx = {0};\n\tctx.halted = 1;  // enable disassembly of exception instructions like DCPS1\n\tctx.insword = instructionValue;\n\tctx.address = address;\n\tctx.features0 = ARCH_FEATURES_ALL;\n\tctx.features1 = ARCH_FEATURES_ALL;\n\tctx.EDSCR_HDE = 1;\n\n\t/* have the spec-generated code populate all the pcode variables */\n\tint rc = decode_spec(&ctx, instr);\n\n\tif (rc != DECODE_STATUS_OK)\n\t{\n\t\t/* exceptional cases where we accept a non-OK decode status */\n\t\tif (rc == DECODE_STATUS_END_OF_INSTRUCTION && instr->encoding == ENC_HINT_HM_HINTS)\n\t\t{\n\t\t\twhile (0)\n\t\t\t\t;\n\t\t}\n\t\t/* no exception! fail! */\n\t\telse\n\t\t\treturn rc;\n\t}\n\n\t/* if UDF encoding, return undefined */\n\t// if(instr->encoding == ENC_UDF_ONLY_PERM_UNDEF)\n\t//\treturn DECODE_STATUS_UNDEFINED;\n\n\t/* convert the pcode variables to list of operands, etc. */\n\treturn decode_scratchpad(&ctx, instr);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode.h",
    "content": "#pragma once\n\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"feature_flags.h\"\n#include \"operations.h\"\n\n#include \"encodings_dec.h\"\n#include \"regs.h\"\n#include \"sysregs_gen.h\"\n#include \"sysregs_fmt_gen.h\"\n\n#ifdef _MSC_VER\n\t#undef REG_NONE  // collides with winnt's define\n#endif\n\n#ifdef __cplusplus\n\t#define restrict __restrict\n#endif\n\n/* these are used in lookup tables elsewhere, modify with caution */\nenum ArrangementSpec\n{\n\tARRSPEC_NONE = 0,\n\n\tARRSPEC_FULL = 1, /* 128-bit v-reg unsplit, eg: REG_V0_Q0 */\n\n\t/* 128 bit v-reg considered as... */\n\tARRSPEC_2DOUBLES = 2, /* (.2d) two 64-bit double-precision: REG_V0_D1, REG_V0_D0 */\n\tARRSPEC_4SINGLES =\n\t    3, /* (.4s) four 32-bit single-precision: REG_V0_S3, REG_V0_S2, REG_V0_S1, REG_V0_S0 */\n\tARRSPEC_8HALVES =\n\t    4, /* (.8h) eight 16-bit half-precision: REG_V0_H7, REG_V0_H6, (..., REG_V0_H0 */\n\tARRSPEC_16BYTES = 5, /* (.16b) sixteen 8-bit values: REG_V0_B15, REG_V0_B14, (..., REG_V0_B01 */\n\n\t/* low 64-bit of v-reg considered as... */\n\tARRSPEC_1DOUBLE = 6,  /* (.d) one 64-bit double-precision: REG_V0_D0 */\n\tARRSPEC_2SINGLES = 7, /* (.2s) two 32-bit single-precision: REG_V0_S1, REG_V0_S0 */\n\tARRSPEC_4HALVES =\n\t    8, /* (.4h) four 16-bit half-precision: REG_V0_H3, REG_V0_H2, REG_V0_H1, REG_V0_H0 */\n\tARRSPEC_8BYTES = 9, /* (.8b) eight 8-bit values: REG_V0_B7, REG_V0_B6, (..., REG_V0_B0 */\n\n\t/* low 32-bit of v-reg considered as... */\n\tARRSPEC_1SINGLE = 10, /* (.s) one 32-bit single-precision: REG_V0_S0 */\n\tARRSPEC_2HALVES = 11, /* (.2h) two 16-bit half-precision: REG_V0_H1, REG_V0_H0 */\n\tARRSPEC_4BYTES = 12,  /* (.4b) four 8-bit values: REG_V0_B3, REG_V0_B2, REG_V0_B1, REG_V0_B0 */\n\n\t/* low 16-bit of v-reg considered as... */\n\tARRSPEC_1HALF = 13, /* (.h) one 16-bit half-precision: REG_V0_H0 */\n\n\t/* low 8-bit of v-reg considered as... */\n\tARRSPEC_1BYTE = 14 /* (.b) one 8-bit byte: REG_V0_B0 */\n};\n\nenum SliceIndicator\n{\n\tSLICE_NONE = -1,\n\tSLICE_HORIZONTAL = 0, /* same values as read from fields32 */\n\tSLICE_VERTICAL = 1\n};\n\n//-----------------------------------------------------------------------------\n// decode return values\n//-----------------------------------------------------------------------------\n\n#define DECODE_STATUS_OK        0   // success! the resulting named encoding is accurate\n#define DECODE_STATUS_RESERVED  -1  // spec says this space is reserved, eg: RESERVED_36_asisdsame\n#define DECODE_STATUS_UNMATCHED -2  // decoding logic fell through the spec's checks\n#define DECODE_STATUS_UNALLOCATED \\\n\t-3  // spec says this space is unallocated, eg: UNALLOCATED_10_branch_reg\n#define DECODE_STATUS_UNDEFINED \\\n\t-4  // spec says this encoding is undefined, often due to a disallowed field\n\t    // or a missing feature, eg: \"if !HaveBF16Ext() then UNDEFINED;\"\n#define DECODE_STATUS_END_OF_INSTRUCTION \\\n\t-5  // spec decode EndOfInstruction(), instruction executes as NOP\n#define DECODE_STATUS_LOST           -6  // descended past checks, ie: \"SEE encoding_up_higher\"\n#define DECODE_STATUS_UNREACHABLE    -7  // ran into pcode Unreachable()\n#define DECODE_STATUS_ASSERT_FAILED  -8  // failed an assert\n#define DECODE_STATUS_ERROR_OPERANDS -9\n\n//-----------------------------------------------------------------------------\n// floating point condition register values\n//-----------------------------------------------------------------------------\n\n#define FPCR_AHP    ((uint64_t)1 << 26)\n#define FPCR_DN     ((uint64_t)1 << 25)\n#define FPCR_FZ     ((uint64_t)1 << 24)\n#define FPCR_RMode  (uint64_t)0xC00000  // [23,22]\n#define FPCR_Stride (uint64_t)0x300000  // [21,20]\n#define FPCR_FZ16   ((uint64_t)1 << 19)\n#define FPCR_Len    (uint64_t)0x30000  // [18:16]\n#define FPCR_IDE    ((uint64_t)1 << 15)\n#define FPCR_IXE    ((uint64_t)1 << 12)\n#define FPCR_UFE    ((uint64_t)1 << 11)\n#define FPCR_OFE    ((uint64_t)1 << 10)\n#define FPCR_DZE    ((uint64_t)1 << 9)\n#define FPCR_IOE    ((uint64_t)1 << 8)\n\n#define FPCR_GET_AHP(X)    SLICE(X, 26, 26)\n#define FPCR_GET_DN(X)     SLICE(X, 25, 25)\n#define FPCR_GET_FZ(X)     SLICE(X, 24, 24)\n#define FPCR_GET_RMode(X)  SLICE(X, 23, 22)\n#define FPCR_GET_Stride(X) SLICE(X, 21, 20)\n#define FPCR_GET_FZ16(X)   SLICE(X, 19, 19)\n#define FPCR_GET_Len(X)    SLICE(X, 18, 16)\n#define FPCR_GET_IDE(X)    SLICE(X, 15, 15)\n#define FPCR_GET_IXE(X)    SLICE(X, 12, 12)\n#define FPCR_GET_UFE(X)    SLICE(X, 11, 11)\n#define FPCR_GET_OFE(X)    SLICE(X, 10, 10)\n#define FPCR_GET_DZE(X)    SLICE(X, 9, 9)\n#define FPCR_GET_IOE(X)    SLICE(X, 8, 8)\n\n//-----------------------------------------------------------------------------\n// <tlbi_op>: TLBI operands\n//-----------------------------------------------------------------------------\n#define TLBI_OP(op1, crn, crm, op2) (((op1 & 7) << 11) | ((crn & 0xF) << 7) | ((crm & 0xF) << 3) | ((op2) & 7))\n\n//-----------------------------------------------------------------------------\n// <at_op>: AT operands\n//-----------------------------------------------------------------------------\n#define AT_OP(op1, crm, op2) (TLBI_OP(op1, 7, crm, op2))\n\n//-----------------------------------------------------------------------------\n// <dc_op>: DC operands\n//-----------------------------------------------------------------------------\n#define DC_OP(op1, crm, op2) (TLBI_OP(op1, 7, crm, op2))\n\n//-----------------------------------------------------------------------------\n// disassembly context (INPUT into disassembler)\n//-----------------------------------------------------------------------------\n\ntypedef struct context_\n{\n\tuint32_t insword;\n\tuint64_t address;\n\tuint64_t features0;  // bitmask of ARCH_FEATURE_XXX\n\tuint64_t features1;  // bitmask of ARCH_FEATURE_XXX\n\t// uint32_t exception_level; // used by AArch64.CheckSystemAccess()\n\t// uint32_t security_state;\n\tuint8_t pstate_btype;  // used by BTypeCompatible_BTI()\n\tuint8_t pstate_el;\n\tuint8_t pstate_uao;\n\tbool BTypeCompatible;\n\tuint8_t BTypeNext;\n\tbool halted;     // is CPU halted? used by Halted()\n\tuint64_t FPCR;   // floating point control register\n\tbool EDSCR_HDE;  // External Debug Status and Control Register, Halting debug enable\n\n\t/* specification scratchpad: ~300 possible named fields */\n\tuint64_t A;\n\tuint64_t ADD;\n\tuint64_t AccType_NORMAL;\n\tuint64_t AccType_STREAM;\n\tuint64_t AccType_UNPRIV;\n\tuint64_t AccType_VEC;\n\tuint64_t AccType_VECSTREAM;\n\tuint64_t B;\n\tuint64_t C;\n\tuint64_t CRm;\n\tuint64_t CRn;\n\tuint64_t dst, D;\n\tuint64_t E;\n\tuint64_t H;\n\tuint64_t HCR_EL2_E2H, HCR_EL2_NV, HCR_EL2_NV1, HCR_EL2_TGE;\n\tuint64_t k;\n\tuint64_t L;\n\tuint64_t LL;\n\tuint64_t M;\n\tuint64_t N;\n\tuint64_t O;\n\tuint64_t Op0, Op3;\n\tuint64_t P;\n\tuint64_t Pd, Pdm, Pdn, Pg, Pm, Pn, Pt;\n\tuint64_t Q, Qa, Qd, Qm, Qn, Qt, Qt2;\n\tuint64_t reason, retry;\n\tuint64_t R, Ra, Rd, Rdn, Rm, Rmhi, Rn, Rs, Rt, Rt2, Rv;\n\tuint64_t s1, s2, sel1, sel2, S, Sa, Sd, Sm, Sn, St, St2;\n\tuint64_t S10;\n\tuint64_t SCTLR_EL1_UMA;\n\tuint64_t T;\n\tuint64_t U;\n\tuint64_t US;\n\tuint64_t V, Va, Vd, Vdn, Vm, Vn, Vt, Vt2;\n\tuint64_t W, Wa, Wd, Wdn, Wm, Wn, Ws, Wt, Wt2;\n\tuint64_t Xa, Xd, Xdn, Xm, Xn, Xs, Xt, Xt2;\n\tuint64_t Z, Za, Zd, Zda, Zdn, Zm, Zn, Zt;\n\tuint64_t a;\n\tuint64_t abs;\n\tuint64_t ac;\n\tuint64_t acc;\n\tuint64_t acctype;\n\tuint64_t accumulate;\n\tuint64_t alias;\n\tuint64_t amount;\n\tuint64_t and_test;\n\tuint64_t asimdimm;\n\tuint64_t b;\n\tuint64_t b40;\n\tuint64_t b5;\n\tuint64_t bit_pos;\n\tuint64_t bit_val;\n\tuint64_t branch_type;\n\tuint64_t c;\n\tuint64_t cmode;\n\tuint64_t cmp, cmph, cmpl, cmp_eq, cmp_with_zero;\n\tuint64_t comment;\n\tuint64_t comparison;\n\tuint64_t cond; /* careful! this is the pcode scratchpad .cond, NOT the .cond field of a struct\n\t                  InstructionOperand */\n\tuint64_t condition;\n\tuint64_t container_size;\n\tuint64_t containers;\n\tuint64_t countop;\n\tuint64_t crc32c;\n\tuint64_t csize;\n\tuint64_t d, da, data, datasize, double_table;\n\tuint64_t dtype, dtypeh, dtypel;\n\tuint64_t d_esize;\n\tuint64_t decrypt;\n\tuint64_t destsize;\n\tuint64_t dm;\n\tuint64_t dn;\n\tuint64_t domain;\n\tuint64_t dst_index;\n\tuint64_t dst_unsigned;\n\tuint64_t dstsize;\n\tuint64_t e;\n\tuint64_t elements;\n\tuint64_t elements_per_container;\n\tuint64_t else_inc;\n\tuint64_t else_inv;\n\tuint64_t elsize;\n\tuint64_t eq;\n\tuint64_t esize;\n\tuint64_t exact;\n\tuint64_t extend;\n\tuint64_t extend_type;\n\tuint64_t f, ff;\n\tuint64_t field;\n\tuint64_t flags;\n\tuint64_t fltsize;\n\tuint64_t fpop;\n\tuint64_t fracbits;\n\tuint64_t ftype;\n\tuint64_t g;\n\tuint64_t h;\n\tuint64_t has_result;\n\tuint64_t hi;\n\tuint64_t hw;\n\tuint64_t i, i1, i2, i2h, i2l, i3h, i3l;\n\tuint64_t idxdsize;\n\tuint64_t imm;\n\tuint64_t imm1;\n\tuint64_t imm12;\n\tuint64_t imm13;\n\tuint64_t imm14;\n\tuint64_t imm16;\n\tuint64_t imm19;\n\tuint64_t imm2;\n\tuint64_t imm26;\n\tuint64_t imm3;\n\tuint64_t imm4;\n\tuint64_t imm5;\n\tuint64_t imm5b;\n\tuint64_t imm6;\n\tuint64_t imm64;\n\tuint64_t imm7;\n\tuint64_t imm8;\n\tuint64_t imm8h;\n\tuint64_t imm8l;\n\tuint64_t imm9;\n\tuint64_t imm9h;\n\tuint64_t imm9l;\n\tuint64_t immb;\n\tuint64_t immh;\n\tuint64_t immhi;\n\tuint64_t immlo;\n\tuint64_t immr;\n\tuint64_t imms;\n\tuint64_t index;\n\tuint64_t init_scale;\n\tuint64_t intsize;\n\tuint64_t int_U;\n\tuint64_t invert;\n\tuint64_t inzero;\n\tuint64_t isBefore;\n\tuint64_t is_tbl;\n\tuint64_t iszero;\n\tuint64_t ldacctype;\n\tuint64_t len;\n\tuint64_t level;\n\tuint64_t lsb;\n\tuint64_t lt;\n\tuint64_t m;\n\tuint64_t mask;\n\tuint64_t mbytes;\n\tuint64_t memop;\n\tuint64_t merging;\n\tuint64_t min;\n\tuint64_t min_EL;\n\tuint64_t minimum;\n\tuint64_t msb;\n\tuint64_t msize;\n\tuint64_t msz;\n\tuint64_t mulx_op;\n\tuint64_t n;\n\tuint64_t ne;\n\tuint64_t need_secure;\n\tuint64_t neg;\n\tuint64_t neg_i;\n\tuint64_t neg_r;\n\tuint64_t negated;\n\tuint64_t nreg;\n\tuint64_t nzcv;\n\tuint64_t nXS;\n\tuint64_t o0, o1, o2, o3;\n\tuint64_t offs_size;\n\tuint64_t offs_unsigned;\n\tuint64_t offset;\n\tuint64_t op1_neg;\n\tuint64_t op1_unsigned;\n\tuint64_t op, op0, op1, op2, op3, op4, op21, op31, op54;\n\tuint64_t op2_unsigned;\n\tuint64_t op3_neg;\n\tuint64_t opa_neg;\n\tuint64_t opc;\n\tuint64_t opc2;\n\tuint64_t opcode, opcode2;\n\tuint64_t operand;\n\tuint64_t operation_;\n\tuint64_t opt, option;\n\tuint64_t osize;\n\tuint64_t pac;\n\tuint64_t page;\n\tuint64_t pair;\n\tuint64_t pairs;\n\tuint64_t part;\n\tuint64_t part1;\n\tuint64_t pat;\n\tuint64_t pattern;\n\tuint64_t poly;\n\tuint64_t pos;\n\tuint64_t position;\n\tuint64_t postindex;\n\tuint64_t pref_hint;\n\tuint64_t prfop;\n\tuint64_t ptype;\n\tuint64_t rd;\n\tuint64_t read;\n\tuint64_t regs;\n\tuint64_t regsize;\n\tuint64_t replicate;\n\tuint64_t rmode;\n\tuint64_t rot;\n\tuint64_t round;\n\tuint64_t rounding;\n\tuint64_t rpt;\n\tuint64_t rsize;\n\tuint64_t rn_unknown, rt_unknown;\n\tuint64_t rw;\n\tuint64_t s;\n\tuint64_t s_esize;\n\tuint64_t saturating;\n\tuint64_t scale;\n\tuint64_t sel;\n\tuint64_t sel_a;\n\tuint64_t sel_b;\n\tuint64_t selem;\n\tuint64_t setflags;\n\tuint64_t sf;\n\tuint64_t sh;\n\tuint64_t shift;\n\tuint64_t shift_amount;\n\tuint64_t shift_type;\n\tuint64_t signal_all_nans;\n\tuint64_t signed_;\n\tuint64_t simm7;\n\tuint64_t size;\n\tuint64_t source_is_sp;\n\tuint64_t src_index;\n\tuint64_t src_unsigned;\n\tuint64_t srcsize;\n\tuint64_t ssize, ssz;\n\tuint64_t stacctype;\n\tuint64_t stream;\n\tuint64_t sub_i;\n\tuint64_t sub_op;\n\tuint64_t sub_r;\n\tuint64_t swsize;\n\tuint64_t sys_crm;\n\tuint64_t sys_crn;\n\tuint64_t sys_op0;\n\tuint64_t sys_op1;\n\tuint64_t sys_op2;\n\tuint64_t sz;\n\tuint64_t t, t2, tb;\n\tuint64_t tag_checked;\n\tuint64_t tag_offset;\n\tuint64_t target_level;\n\tuint64_t tmask;\n\tuint64_t tsize;\n\tuint64_t tsz;\n\tuint64_t tszh;\n\tuint64_t tszl;\n\tuint64_t types;\n\tuint64_t u0, u1;\n\tuint64_t uimm4;\n\tuint64_t uimm6;\n\tuint64_t unpriv_at_el1;\n\tuint64_t unpriv_at_el2;\n\tuint64_t uns;\n\tuint64_t unsigned_;\n\tuint64_t use_key_a;\n\tuint64_t user_access_override;\n\tuint64_t v, vertical;\n\tuint64_t wback;\n\tuint64_t wb_unknown;\n\tuint64_t wmask;\n\tuint64_t writeback;\n\tuint64_t xs;\n\tuint64_t ZAda, ZAd, ZAn, ZAt, Zk, zero_data;\n\n} context;\n\n//-----------------------------------------------------------------------------\n// Instruction definition (OUTPUT from disassembler)\n//-----------------------------------------------------------------------------\n\nenum OperandClass\n{                          // syntax                      example\n\tNONE = 0,              // --------------------------- ---------------------\n\tIMM32 = 1,\n\tIMM64 = 2,\n\tFIMM32 = 3,\n\tSTR_IMM = 4,\n\tREG = 5,\n\tMULTI_REG = 6,\n\tSYS_REG = 7,\n\tMEM_REG = 8,\n\tMEM_PRE_IDX = 9,\n\tMEM_POST_IDX = 10,\n\tMEM_OFFSET = 11,\n\tMEM_EXTENDED = 12,\n\tSME_TILE = 13,\n\tINDEXED_ELEMENT = 14,        // <Pn>.<T>[<Wm>{, #<imm>}]    p12.d[w15, #15]\n\tACCUM_ARRAY = 15,\t\t\t// ZA[<Wv>, #<imm>]            ZA[w13, #8]\n\tLABEL = 16,\n\tCONDITION = 17,\n\tNAME = 18,\n\tIMPLEMENTATION_SPECIFIC = 19\n};\n\nenum Condition\n{\n\tCOND_EQ,\n\tCOND_NE,\n\tCOND_CS,\n\tCOND_CC,\n\tCOND_MI,\n\tCOND_PL,\n\tCOND_VS,\n\tCOND_VC,\n\tCOND_HI,\n\tCOND_LS,\n\tCOND_GE,\n\tCOND_LT,\n\tCOND_GT,\n\tCOND_LE,\n\tCOND_AL,\n\tCOND_NV,\n\tEND_CONDITION\n};\n\nenum ShiftType\n{\n\tShiftType_NONE,\n\tShiftType_LSL,\n\tShiftType_LSR,\n\tShiftType_ASR,\n\tShiftType_ROR,\n\tShiftType_UXTW,\n\tShiftType_SXTW,\n\tShiftType_SXTX,\n\tShiftType_UXTX,\n\tShiftType_SXTB,\n\tShiftType_SXTH,\n\tShiftType_UXTH,\n\tShiftType_UXTB,\n\tShiftType_MSL,\n\tShiftType_END,\n};\n\nenum Group\n{\n\tGROUP_UNALLOCATED,\n\tGROUP_DATA_PROCESSING_IMM,\n\tGROUP_BRANCH_EXCEPTION_SYSTEM,\n\tGROUP_LOAD_STORE,\n\tGROUP_DATA_PROCESSING_REG,\n\tGROUP_DATA_PROCESSING_SIMD,\n\tGROUP_DATA_PROCESSING_SIMD2,\n\tEND_GROUP\n};\n\nenum FlagEffect\n{\n\tFLAGEFFECT_NONE=0, // doesn't set flags\n\tFLAGEFFECT_SETS=1, // sets flags, but unknown which type\n\tFLAGEFFECT_SETS_NORMAL=2, // sets flags after normal comparison\n\tFLAGEFFECT_SETS_FLOAT=3 // sets flags after float comparison\n};\n\nenum ImplSpec\n{\n\tOP0 = 0,\n\tOP1 = 1,\n\tCRN = 2,\n\tCRM = 3,\n\tOP2 = 4\n};\n\nenum ATOp\n{\n\tAT_OP_INVALID=-1,\n\tAT_OP_S1E1R=AT_OP(0b000, 0b1000, 0b000),\n\tAT_OP_S1E1W=AT_OP(0b000, 0b1000, 0b001),\n\tAT_OP_S1E0R=AT_OP(0b000, 0b1000, 0b010),\n\tAT_OP_S1E0W=AT_OP(0b000, 0b1000, 0b011),\n\tAT_OP_S1E1RP=AT_OP(0b000, 0b1001, 0b000),\n\tAT_OP_S1E1WP=AT_OP(0b000, 0b1001, 0b001),\n\tAT_OP_S1E1A=AT_OP(0b000, 0b1001, 0b010),\n\tAT_OP_S1E2R=AT_OP(0b100, 0b1000, 0b000),\n\tAT_OP_S1E2W=AT_OP(0b100, 0b1000, 0b001),\n\tAT_OP_S12E1R=AT_OP(0b100, 0b1000, 0b100),\n\tAT_OP_S12E1W=AT_OP(0b100, 0b1000, 0b101),\n\tAT_OP_S12E0R=AT_OP(0b100, 0b1000, 0b110),\n\tAT_OP_S12E0W=AT_OP(0b100, 0b1000, 0b111),\n\tAT_OP_S1E2A=AT_OP(0b100, 0b1001, 0b010),\n\tAT_OP_S1E3R=AT_OP(0b110, 0b1000, 0b000),\n\tAT_OP_S1E3W=AT_OP(0b110, 0b1000, 0b001),\n\tAT_OP_S1E3A=AT_OP(0b110, 0b1001, 0b010),\n};\n\nenum TlbiOp\n{\n\tTLBI_INVALID=-1,\n\tTLBI_VMALLE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b000),\n\tTLBI_VAE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b001),\n\tTLBI_ASIDE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b010),\n\tTLBI_VAAE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b011),\n\tTLBI_VALE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b101),\n\tTLBI_VAALE1OS=TLBI_OP(0b000, 0b1000, 0b0001, 0b111),\n\tTLBI_RVAE1IS=TLBI_OP(0b000, 0b1000, 0b0010, 0b001),\n\tTLBI_RVAAE1IS=TLBI_OP(0b000, 0b1000, 0b0010, 0b011),\n\tTLBI_RVALE1IS=TLBI_OP(0b000, 0b1000, 0b0010, 0b101),\n\tTLBI_RVAALE1IS=TLBI_OP(0b000, 0b1000, 0b0010, 0b111),\n\tTLBI_VMALLE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b000),\n\tTLBI_VAE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b001),\n\tTLBI_ASIDE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b010),\n\tTLBI_VAAE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b011),\n\tTLBI_VALE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b101),\n\tTLBI_VAALE1IS=TLBI_OP(0b000, 0b1000, 0b0011, 0b111),\n\tTLBI_RVAE1OS=TLBI_OP(0b000, 0b1000, 0b0101, 0b001),\n\tTLBI_RVAAE1OS=TLBI_OP(0b000, 0b1000, 0b0101, 0b011),\n\tTLBI_RVALE1OS=TLBI_OP(0b000, 0b1000, 0b0101, 0b101),\n\tTLBI_RVAALE1OS=TLBI_OP(0b000, 0b1000, 0b0101, 0b111),\n\tTLBI_RVAE1=TLBI_OP(0b000, 0b1000, 0b0110, 0b001),\n\tTLBI_RVAAE1=TLBI_OP(0b000, 0b1000, 0b0110, 0b011),\n\tTLBI_RVALE1=TLBI_OP(0b000, 0b1000, 0b0110, 0b101),\n\tTLBI_RVAALE1=TLBI_OP(0b000, 0b1000, 0b0110, 0b111),\n\tTLBI_VMALLE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b000),\n\tTLBI_VAE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b001),\n\tTLBI_ASIDE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b010),\n\tTLBI_VAAE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b011),\n\tTLBI_VALE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b101),\n\tTLBI_VAALE1=TLBI_OP(0b000, 0b1000, 0b0111, 0b111),\n\tTLBI_VMALLE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b000),\n\tTLBI_VAE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b001),\n\tTLBI_ASIDE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b010),\n\tTLBI_VAAE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b011),\n\tTLBI_VALE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b101),\n\tTLBI_VAALE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0001, 0b111),\n\tTLBI_RVAE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0010, 0b001),\n\tTLBI_RVAAE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0010, 0b011),\n\tTLBI_RVALE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0010, 0b101),\n\tTLBI_RVAALE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0010, 0b111),\n\tTLBI_VMALLE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b000),\n\tTLBI_VAE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b001),\n\tTLBI_ASIDE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b010),\n\tTLBI_VAAE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b011),\n\tTLBI_VALE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b101),\n\tTLBI_VAALE1ISNXS=TLBI_OP(0b000, 0b1001, 0b0011, 0b111),\n\tTLBI_RVAE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0101, 0b001),\n\tTLBI_RVAAE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0101, 0b011),\n\tTLBI_RVALE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0101, 0b101),\n\tTLBI_RVAALE1OSNXS=TLBI_OP(0b000, 0b1001, 0b0101, 0b111),\n\tTLBI_RVAE1NXS=TLBI_OP(0b000, 0b1001, 0b0110, 0b001),\n\tTLBI_RVAAE1NXS=TLBI_OP(0b000, 0b1001, 0b0110, 0b011),\n\tTLBI_RVALE1NXS=TLBI_OP(0b000, 0b1001, 0b0110, 0b101),\n\tTLBI_RVAALE1NXS=TLBI_OP(0b000, 0b1001, 0b0110, 0b111),\n\tTLBI_VMALLE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b000),\n\tTLBI_VAE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b001),\n\tTLBI_ASIDE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b010),\n\tTLBI_VAAE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b011),\n\tTLBI_VALE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b101),\n\tTLBI_VAALE1NXS=TLBI_OP(0b000, 0b1001, 0b0111, 0b111),\n\tTLBI_IPAS2E1IS=TLBI_OP(0b100, 0b1000, 0b0000, 0b001),\n\tTLBI_RIPAS2E1IS=TLBI_OP(0b100, 0b1000, 0b0000, 0b010),\n\tTLBI_IPAS2LE1IS=TLBI_OP(0b100, 0b1000, 0b0000, 0b101),\n\tTLBI_RIPAS2LE1IS=TLBI_OP(0b100, 0b1000, 0b0000, 0b110),\n\tTLBI_ALLE2OS=TLBI_OP(0b100, 0b1000, 0b0001, 0b000),\n\tTLBI_VAE2OS=TLBI_OP(0b100, 0b1000, 0b0001, 0b001),\n\tTLBI_ALLE1OS=TLBI_OP(0b100, 0b1000, 0b0001, 0b100),\n\tTLBI_VALE2OS=TLBI_OP(0b100, 0b1000, 0b0001, 0b101),\n\tTLBI_VMALLS12E1OS=TLBI_OP(0b100, 0b1000, 0b0001, 0b110),\n\tTLBI_RVAE2IS=TLBI_OP(0b100, 0b1000, 0b0010, 0b001),\n\tTLBI_VMALLWS2E1IS=TLBI_OP(0b100, 0b1000, 0b0010, 0b010),\n\tTLBI_RVALE2IS=TLBI_OP(0b100, 0b1000, 0b0010, 0b101),\n\tTLBI_ALLE2IS=TLBI_OP(0b100, 0b1000, 0b0011, 0b000),\n\tTLBI_VAE2IS=TLBI_OP(0b100, 0b1000, 0b0011, 0b001),\n\tTLBI_ALLE1IS=TLBI_OP(0b100, 0b1000, 0b0011, 0b100),\n\tTLBI_VALE2IS=TLBI_OP(0b100, 0b1000, 0b0011, 0b101),\n\tTLBI_VMALLS12E1IS=TLBI_OP(0b100, 0b1000, 0b0011, 0b110),\n\tTLBI_IPAS2E1OS=TLBI_OP(0b100, 0b1000, 0b0100, 0b000),\n\tTLBI_IPAS2E1=TLBI_OP(0b100, 0b1000, 0b0100, 0b001),\n\tTLBI_RIPAS2E1=TLBI_OP(0b100, 0b1000, 0b0100, 0b010),\n\tTLBI_RIPAS2E1OS=TLBI_OP(0b100, 0b1000, 0b0100, 0b011),\n\tTLBI_IPAS2LE1OS=TLBI_OP(0b100, 0b1000, 0b0100, 0b100),\n\tTLBI_IPAS2LE1=TLBI_OP(0b100, 0b1000, 0b0100, 0b101),\n\tTLBI_RIPAS2LE1=TLBI_OP(0b100, 0b1000, 0b0100, 0b110),\n\tTLBI_RIPAS2LE1OS=TLBI_OP(0b100, 0b1000, 0b0100, 0b111),\n\tTLBI_RVAE2OS=TLBI_OP(0b100, 0b1000, 0b0101, 0b001),\n\tTLBI_VMALLWS2E1OS=TLBI_OP(0b100, 0b1000, 0b0101, 0b010),\n\tTLBI_RVALE2OS=TLBI_OP(0b100, 0b1000, 0b0101, 0b101),\n\tTLBI_RVAE2=TLBI_OP(0b100, 0b1000, 0b0110, 0b001),\n\tTLBI_VMALLWS2E1=TLBI_OP(0b100, 0b1000, 0b0110, 0b010),\n\tTLBI_RVALE2=TLBI_OP(0b100, 0b1000, 0b0110, 0b101),\n\tTLBI_ALLE2=TLBI_OP(0b100, 0b1000, 0b0111, 0b000),\n\tTLBI_VAE2=TLBI_OP(0b100, 0b1000, 0b0111, 0b001),\n\tTLBI_ALLE1=TLBI_OP(0b100, 0b1000, 0b0111, 0b100),\n\tTLBI_VALE2=TLBI_OP(0b100, 0b1000, 0b0111, 0b101),\n\tTLBI_VMALLS12E1=TLBI_OP(0b100, 0b1000, 0b0111, 0b110),\n\tTLBI_IPAS2E1ISNXS=TLBI_OP(0b100, 0b1001, 0b0000, 0b001),\n\tTLBI_RIPAS2E1ISNXS=TLBI_OP(0b100, 0b1001, 0b0000, 0b010),\n\tTLBI_IPAS2LE1ISNXS=TLBI_OP(0b100, 0b1001, 0b0000, 0b101),\n\tTLBI_RIPAS2LE1ISNXS=TLBI_OP(0b100, 0b1001, 0b0000, 0b110),\n\tTLBI_ALLE2OSNXS=TLBI_OP(0b100, 0b1001, 0b0001, 0b000),\n\tTLBI_VAE2OSNXS=TLBI_OP(0b100, 0b1001, 0b0001, 0b001),\n\tTLBI_ALLE1OSNXS=TLBI_OP(0b100, 0b1001, 0b0001, 0b100),\n\tTLBI_VALE2OSNXS=TLBI_OP(0b100, 0b1001, 0b0001, 0b101),\n\tTLBI_VMALLS12E1OSNXS=TLBI_OP(0b100, 0b1001, 0b0001, 0b110),\n\tTLBI_RVAE2ISNXS=TLBI_OP(0b100, 0b1001, 0b0010, 0b001),\n\tTLBI_VMALLWS2E1ISNXS=TLBI_OP(0b100, 0b1001, 0b0010, 0b010),\n\tTLBI_RVALE2ISNXS=TLBI_OP(0b100, 0b1001, 0b0010, 0b101),\n\tTLBI_ALLE2ISNXS=TLBI_OP(0b100, 0b1001, 0b0011, 0b000),\n\tTLBI_VAE2ISNXS=TLBI_OP(0b100, 0b1001, 0b0011, 0b001),\n\tTLBI_ALLE1ISNXS=TLBI_OP(0b100, 0b1001, 0b0011, 0b100),\n\tTLBI_VALE2ISNXS=TLBI_OP(0b100, 0b1001, 0b0011, 0b101),\n\tTLBI_VMALLS12E1ISNXS=TLBI_OP(0b100, 0b1001, 0b0011, 0b110),\n\tTLBI_IPAS2E1OSNXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b000),\n\tTLBI_IPAS2E1NXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b001),\n\tTLBI_RIPAS2E1NXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b010),\n\tTLBI_RIPAS2E1OSNXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b011),\n\tTLBI_IPAS2LE1OSNXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b100),\n\tTLBI_IPAS2LE1NXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b101),\n\tTLBI_RIPAS2LE1NXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b110),\n\tTLBI_RIPAS2LE1OSNXS=TLBI_OP(0b100, 0b1001, 0b0100, 0b111),\n\tTLBI_RVAE2OSNXS=TLBI_OP(0b100, 0b1001, 0b0101, 0b001),\n\tTLBI_VMALLWS2E1OSNXS=TLBI_OP(0b100, 0b1001, 0b0101, 0b010),\n\tTLBI_RVALE2OSNXS=TLBI_OP(0b100, 0b1001, 0b0101, 0b101),\n\tTLBI_RVAE2NXS=TLBI_OP(0b100, 0b1001, 0b0110, 0b001),\n\tTLBI_VMALLWS2E1NXS=TLBI_OP(0b100, 0b1001, 0b0110, 0b010),\n\tTLBI_RVALE2NXS=TLBI_OP(0b100, 0b1001, 0b0110, 0b101),\n\tTLBI_ALLE2NXS=TLBI_OP(0b100, 0b1001, 0b0111, 0b000),\n\tTLBI_VAE2NXS=TLBI_OP(0b100, 0b1001, 0b0111, 0b001),\n\tTLBI_ALLE1NXS=TLBI_OP(0b100, 0b1001, 0b0111, 0b100),\n\tTLBI_VALE2NXS=TLBI_OP(0b100, 0b1001, 0b0111, 0b101),\n\tTLBI_VMALLS12E1NXS=TLBI_OP(0b100, 0b1001, 0b0111, 0b110),\n\tTLBI_ALLE3OS=TLBI_OP(0b110, 0b1000, 0b0001, 0b000),\n\tTLBI_VAE3OS=TLBI_OP(0b110, 0b1000, 0b0001, 0b001),\n\tTLBI_PAALLOS=TLBI_OP(0b110, 0b1000, 0b0001, 0b100),\n\tTLBI_VALE3OS=TLBI_OP(0b110, 0b1000, 0b0001, 0b101),\n\tTLBI_RVAE3IS=TLBI_OP(0b110, 0b1000, 0b0010, 0b001),\n\tTLBI_RVALE3IS=TLBI_OP(0b110, 0b1000, 0b0010, 0b101),\n\tTLBI_ALLE3IS=TLBI_OP(0b110, 0b1000, 0b0011, 0b000),\n\tTLBI_VAE3IS=TLBI_OP(0b110, 0b1000, 0b0011, 0b001),\n\tTLBI_VALE3IS=TLBI_OP(0b110, 0b1000, 0b0011, 0b101),\n\tTLBI_RPAOS=TLBI_OP(0b110, 0b1000, 0b0100, 0b011),\n\tTLBI_RPALOS=TLBI_OP(0b110, 0b1000, 0b0100, 0b111),\n\tTLBI_RVAE3OS=TLBI_OP(0b110, 0b1000, 0b0101, 0b001),\n\tTLBI_RVALE3OS=TLBI_OP(0b110, 0b1000, 0b0101, 0b101),\n\tTLBI_RVAE3=TLBI_OP(0b110, 0b1000, 0b0110, 0b001),\n\tTLBI_RVALE3=TLBI_OP(0b110, 0b1000, 0b0110, 0b101),\n\tTLBI_ALLE3=TLBI_OP(0b110, 0b1000, 0b0111, 0b000),\n\tTLBI_VAE3=TLBI_OP(0b110, 0b1000, 0b0111, 0b001),\n\tTLBI_PAALL=TLBI_OP(0b110, 0b1000, 0b0111, 0b100),\n\tTLBI_VALE3=TLBI_OP(0b110, 0b1000, 0b0111, 0b101),\n\tTLBI_ALLE3OSNXS=TLBI_OP(0b110, 0b1001, 0b0001, 0b000),\n\tTLBI_VAE3OSNXS=TLBI_OP(0b110, 0b1001, 0b0001, 0b001),\n\tTLBI_VALE3OSNXS=TLBI_OP(0b110, 0b1001, 0b0001, 0b101),\n\tTLBI_RVAE3ISNXS=TLBI_OP(0b110, 0b1001, 0b0010, 0b001),\n\tTLBI_RVALE3ISNXS=TLBI_OP(0b110, 0b1001, 0b0010, 0b101),\n\tTLBI_ALLE3ISNXS=TLBI_OP(0b110, 0b1001, 0b0011, 0b000),\n\tTLBI_VAE3ISNXS=TLBI_OP(0b110, 0b1001, 0b0011, 0b001),\n\tTLBI_VALE3ISNXS=TLBI_OP(0b110, 0b1001, 0b0011, 0b101),\n\tTLBI_RVAE3OSNXS=TLBI_OP(0b110, 0b1001, 0b0101, 0b001),\n\tTLBI_RVALE3OSNXS=TLBI_OP(0b110, 0b1001, 0b0101, 0b101),\n\tTLBI_RVAE3NXS=TLBI_OP(0b110, 0b1001, 0b0110, 0b001),\n\tTLBI_RVALE3NXS=TLBI_OP(0b110, 0b1001, 0b0110, 0b101),\n\tTLBI_ALLE3NXS=TLBI_OP(0b110, 0b1001, 0b0111, 0b000),\n\tTLBI_VAE3NXS=TLBI_OP(0b110, 0b1001, 0b0111, 0b001),\n\tTLBI_VALE3NXS=TLBI_OP(0b110, 0b1001, 0b0111, 0b101),\n};\n\nenum DCOp\n{\n\tDC_OP_INVALID=-1,\n\tDC_OP_IVAC=DC_OP(0b000, 0b0110, 0b001),\n\tDC_OP_ISW=DC_OP(0b000, 0b0110, 0b010),\n\tDC_OP_IGVAC=DC_OP(0b000, 0b0110, 0b011),\n\tDC_OP_IGSW=DC_OP(0b000, 0b0110, 0b100),\n\tDC_OP_IGDVAC=DC_OP(0b000, 0b0110, 0b101),\n\tDC_OP_IGDSW=DC_OP(0b000, 0b0110, 0b110),\n\tDC_OP_CSW=DC_OP(0b000, 0b1010, 0b010),\n\tDC_OP_CGSW=DC_OP(0b000, 0b1010, 0b100),\n\tDC_OP_CGDSW=DC_OP(0b000, 0b1010, 0b110),\n\tDC_OP_CISW=DC_OP(0b000, 0b1110, 0b010),\n\tDC_OP_CIGSW=DC_OP(0b000, 0b1110, 0b100),\n\tDC_OP_CIGDSW=DC_OP(0b000, 0b1110, 0b110),\n\tDC_OP_CIVAPS=DC_OP(0b000, 0b1111, 0b001),\n\tDC_OP_CIGDVAPS=DC_OP(0b000, 0b1111, 0b101),\n\tDC_OP_ZVA=DC_OP(0b011, 0b0100, 0b001),\n\tDC_OP_GVA=DC_OP(0b011, 0b0100, 0b011),\n\tDC_OP_GZVA=DC_OP(0b011, 0b0100, 0b100),\n\tDC_OP_CVAC=DC_OP(0b011, 0b1010, 0b001),\n\tDC_OP_CGVAC=DC_OP(0b011, 0b1010, 0b011),\n\tDC_OP_CGDVAC=DC_OP(0b011, 0b1010, 0b101),\n\tDC_OP_CVAOC=DC_OP(0b011, 0b1011, 0b000),\n\tDC_OP_CVAU=DC_OP(0b011, 0b1011, 0b001),\n\tDC_OP_CGDVAOC=DC_OP(0b011, 0b1011, 0b111),\n\tDC_OP_CVAP=DC_OP(0b011, 0b1100, 0b001),\n\tDC_OP_CGVAP=DC_OP(0b011, 0b1100, 0b011),\n\tDC_OP_CGDVAP=DC_OP(0b011, 0b1100, 0b101),\n\tDC_OP_CVADP=DC_OP(0b011, 0b1101, 0b001),\n\tDC_OP_CGVADP=DC_OP(0b011, 0b1101, 0b011),\n\tDC_OP_CGDVADP=DC_OP(0b011, 0b1101, 0b101),\n\tDC_OP_CIVAC=DC_OP(0b011, 0b1110, 0b001),\n\tDC_OP_CIGVAC=DC_OP(0b011, 0b1110, 0b011),\n\tDC_OP_CIGDVAC=DC_OP(0b011, 0b1110, 0b101),\n\tDC_OP_CIVAOC=DC_OP(0b011, 0b1111, 0b000),\n\tDC_OP_CIGDVAOC=DC_OP(0b011, 0b1111, 0b111),\n\tDC_OP_CIPAE=DC_OP(0b100, 0b1110, 0b000),\n\tDC_OP_CIGDPAE=DC_OP(0b100, 0b1110, 0b111),\n\tDC_OP_CIPAPA=DC_OP(0b110, 0b1110, 0b001),\n\tDC_OP_CIGDPAPA=DC_OP(0b110, 0b1110, 0b101),\n};\n\n#ifndef __cplusplus\ntypedef enum SystemReg SystemReg;\ntypedef enum OperandClass OperandClass;\ntypedef enum Register Register;\ntypedef enum Condition Condition;\ntypedef enum ShiftType ShiftType;\ntypedef enum Operation Operation;\ntypedef enum Group Group;\ntypedef enum ArrangementSpec ArrangementSpec;\ntypedef enum SliceIndicator SliceIndicator;\ntypedef enum ImplSpec ImplSpec;\ntypedef enum TlbiOp TlbiOp;\n#endif\n\n#define MAX_REGISTERS 5\n#define MAX_NAME      16\n\nstruct InstructionOperand\n{\n\tOperandClass operandClass;\n\tArrangementSpec arrSpec;\n\tRegister reg[MAX_REGISTERS];\n\n\t/* for class CONDITION */\n\tCondition cond;\n\n\t/* for class IMPLEMENTATION_SPECIFIC */\n\tuint8_t implspec[MAX_REGISTERS];\n\n\t/* for class SYS_REG */\n\tSystemReg sysreg;\n\n\tbool laneUsed;\n\tuint32_t lane;\n\tuint64_t immediate;\n\tShiftType shiftType;\n\tbool shiftValueUsed;\n\tuint32_t shiftValue;\n\tShiftType extend;\n\tbool signedImm;\n\tchar pred_qual;\t\t\t// predicate register qualifier ('z' or 'm')\n\tbool mul_vl;\t\t\t// whether MEM_OFFSET has the offset \"mul vl\"\n\n\t/* for class SME_TILE */\n\tuint16_t tile;\n\tSliceIndicator slice;\n\n\t/* for class NAME */\n\tchar name[MAX_NAME];\n};\n\n#ifndef __cplusplus\ntypedef struct InstructionOperand InstructionOperand;\n#endif\n\n#define MAX_OPERANDS 5\n\nstruct Instruction\n{\n\tuint32_t insword;\n\tenum ENCODING encoding;\n\n\tenum Operation operation;\n\tInstructionOperand operands[MAX_OPERANDS];\n\n\tenum FlagEffect setflags;\n};\n\n#ifndef __cplusplus\ntypedef struct Instruction Instruction;\n#endif\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n\tint aarch64_decompose(uint32_t instructionValue, Instruction* instr, uint64_t address);\n\tsize_t get_register_size(enum Register);\n\t// const char* tlbi_op(int32_t op);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode0.c",
    "content": "/* GENERATED FILE */\n#include <stddef.h>\n#include <stdbool.h>\n\n#include \"decode.h\"\n#include \"decode1.h\"\n#include \"pcode.h\"\n\nint decode_spec(context *ctx, Instruction *dec)\n{\n\tuint32_t op0, op1, op2, op3, op4;\n\n\tdec->insword = ctx->insword;\n\t/* GROUP: root */\n\top0 = INSWORD>>31;\n\top1 = (INSWORD>>25)&15;\n\tif(!op0 && !op1) {\n\t\t/* GROUP: reserved */\n\t\top0 = (INSWORD>>29)&3;\n\t\top1 = (INSWORD>>16)&0x1ff;\n\t\tif(!op0 && !op1)\n\t\t\treturn decode_iclass_perm_undef(ctx, dec);\n\t\tif(op1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unallocate3\n\t\tif(op0)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unallocate4\n\t\tRESERVED(ENC_UNKNOWN); // group: reserved\n\t}\n\tif(op0 && !op1) {\n\t\t/* GROUP: sme */\n\t\top0 = (INSWORD>>29)&3;\n\t\top1 = (INSWORD>>19)&0x3f;\n\t\top2 = (INSWORD>>17)&1;\n\t\top3 = (INSWORD>>9)&1;\n\t\top4 = (INSWORD>>2)&7;\n\t\tif(!(op0&2) && (op1&0x18)==0x10 && !(op4&1)) {\n\t\t\t/* GROUP: mortlach_32bit_prod */\n\t\t\top0 = (INSWORD>>29)&1;\n\t\t\top1 = (INSWORD>>24)&1;\n\t\t\top2 = (INSWORD>>21)&1;\n\t\t\top3 = (INSWORD>>3)&1;\n\t\t\tif(!op0 && !op1 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_f32f32_prod(ctx, dec);\n\t\t\tif(!op0 && !op1 && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_48\n\t\t\tif(!op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_49\n\t\t\tif(!op0 && op1 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_b16f32_prod(ctx, dec);\n\t\t\tif(!op0 && op1 && op2 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_f16f32_prod(ctx, dec);\n\t\t\tif(!op0 && op1 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_51\n\t\t\tif(op0 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_i8i32_prod(ctx, dec);\n\t\t\tif(op0 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_58\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!(op0&2) && (op1&0x18)==0x18 && !(op4&2)) {\n\t\t\t/* GROUP: mortlach_64bit_prod */\n\t\t\top0 = (INSWORD>>29)&1;\n\t\t\top1 = (INSWORD>>24)&1;\n\t\t\top2 = (INSWORD>>21)&1;\n\t\t\tif(!op0 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_mortlach_f64f64_prod(ctx, dec);\n\t\t\tif(!op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_50\n\t\t\tif(!op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_52\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_mortlach_i16i64_prod(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && !(op1&0x27) && !op2 && !(op4&4)) {\n\t\t\t/* GROUP: mortlach_ins */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_mortlach_insert_pred(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_62\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && !(op1&0x27) && op2 && !op3) {\n\t\t\t/* GROUP: mortlach_ext */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_mortlach_extract_pred(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_63\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&0x27)==1) {\n\t\t\t/* GROUP: mortlach_misc */\n\t\t\top0 = (INSWORD>>22)&3;\n\t\t\top1 = (INSWORD>>8)&0x7ff;\n\t\t\tif(!op0 && !op1)\n\t\t\t\treturn decode_iclass_mortlach_zero(ctx, dec);\n\t\t\tif(!op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_132\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_133\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&0x27)==2 && !(op4&2)) {\n\t\t\t/* GROUP: mortlach_hvadd */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>17)&3;\n\t\t\top2 = (INSWORD>>4)&1;\n\t\t\tif(!op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_64\n\t\t\tif(op0 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_mortlach_addhv(ctx, dec);\n\t\t\tif(op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_65\n\t\t\tif(op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_126\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3) {\n\t\t\t/* GROUP: mortlach_mem */\n\t\t\top0 = (INSWORD>>21)&15;\n\t\t\top1 = (INSWORD>>15)&0x3f;\n\t\t\top2 = (INSWORD>>10)&7;\n\t\t\top3 = (INSWORD>>4)&1;\n\t\t\tif(!(op0&9) && !op3)\n\t\t\t\treturn decode_iclass_mortlach_contig_load(ctx, dec);\n\t\t\tif((op0&9)==1 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_contig_store(ctx, dec);\n\t\t\tif(!(op0&8) && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_70\n\t\t\tif((op0&14)==8 && !op1 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_ctxt_ldst(ctx, dec);\n\t\t\tif((op0&14)==8 && !op1 && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_71\n\t\t\tif((op0&14)==8 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_113\n\t\t\tif((op0&14)==8 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_114\n\t\t\tif((op0&14)==10)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_72\n\t\t\tif((op0&14)==12)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_73\n\t\t\tif(op0==14 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_contig_qload(ctx, dec);\n\t\t\tif(op0==15 && !op3)\n\t\t\t\treturn decode_iclass_mortlach_contig_qstore(ctx, dec);\n\t\t\tif((op0&14)==14 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_74\n\t\t\tUNMATCHED;\n\t\t}\n\t\tUNMATCHED;\n\t}\n\tif(op1==1)\n\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unallocate1\n\tif(op1==2) {\n\t\t/* GROUP: sve */\n\t\top0 = INSWORD>>29;\n\t\top1 = (INSWORD>>23)&3;\n\t\top2 = (INSWORD>>17)&0x1f;\n\t\top3 = (INSWORD>>10)&0x3f;\n\t\top4 = (INSWORD>>4)&1;\n\t\tif(!op0 && !(op1&2) && !(op2&0x10) && (op3&0x10)==0x10) {\n\t\t\t/* GROUP: sve_int_muladd_pred */\n\t\t\top0 = (INSWORD>>15)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_mlas_vvv_pred(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_int_mladdsub_vvv_pred(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && !(op2&0x10) && !(op3&0x38)) {\n\t\t\t/* GROUP: sve_int_pred_bin */\n\t\t\top0 = (INSWORD>>18)&7;\n\t\t\tif(!(op0&6))\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_arit_0(ctx, dec);\n\t\t\tif((op0&6)==2)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_arit_1(ctx, dec);\n\t\t\tif(op0==4)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_arit_2(ctx, dec);\n\t\t\tif(op0==5)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_div(ctx, dec);\n\t\t\tif((op0&6)==6)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_log(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && !(op2&0x10) && (op3&0x38)==8) {\n\t\t\t/* GROUP: sve_int_pred_red */\n\t\t\top0 = (INSWORD>>18)&7;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_reduce_0(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_reduce_1(ctx, dec);\n\t\t\tif((op0&5)==1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_1\n\t\t\tif((op0&6)==4)\n\t\t\t\treturn decode_iclass_sve_int_movprfx_pred(ctx, dec);\n\t\t\tif(op0==6)\n\t\t\t\treturn decode_iclass_sve_int_reduce_2(ctx, dec);\n\t\t\tif(op0==7)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_2\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && !(op2&0x10) && (op3&0x38)==0x20) {\n\t\t\t/* GROUP: sve_int_pred_shift */\n\t\t\top0 = (INSWORD>>19)&3;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_shift_0(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_shift_1(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_int_bin_pred_shift_2(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && !(op2&0x10) && (op3&0x38)==0x28) {\n\t\t\t/* GROUP: sve_int_pred_un */\n\t\t\top0 = (INSWORD>>19)&3;\n\t\t\tif(!(op0&2))\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_0\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_un_pred_arit_0(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_int_un_pred_arit_1(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && !(op3&0x38))\n\t\t\treturn decode_iclass_sve_int_bin_cons_arit_0(ctx, dec);\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x38)==8) {\n\t\t\t/* GROUP: sve_int_unpred_logical */\n\t\t\top0 = (INSWORD>>10)&7;\n\t\t\tif(!(op0&4))\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_3\n\t\t\tif(op0==4)\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_log(ctx, dec);\n\t\t\tif(op0==5)\n\t\t\t\treturn decode_iclass_sve_int_rotate_imm(ctx, dec);\n\t\t\tif((op0&6)==6)\n\t\t\t\treturn decode_iclass_sve_int_tern_log(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==0x10) {\n\t\t\t/* GROUP: sve_index */\n\t\t\top0 = (INSWORD>>10)&3;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_index_ii(ctx, dec);\n\t\t\tif(op0==1)\n\t\t\t\treturn decode_iclass_sve_int_index_ri(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_index_ir(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_int_index_rr(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==0x14) {\n\t\t\t/* GROUP: sve_alloca */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>11)&1;\n\t\t\tif(!op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_arith_vl(ctx, dec);\n\t\t\tif(op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_read_vl_a(ctx, dec);\n\t\t\tif(op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_4\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x38)==0x18) {\n\t\t\t/* GROUP: sve_int_unpred_arit_b */\n\t\t\top0 = (INSWORD>>11)&3;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_int_mul_b(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_sqdmulh(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_5\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x38)==0x20) {\n\t\t\t/* GROUP: sve_int_unpred_shift */\n\t\t\top0 = (INSWORD>>12)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_shift_a(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_shift_b(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==0x28)\n\t\t\treturn decode_iclass_sve_int_bin_cons_misc_0_a(ctx, dec);\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==0x2c) {\n\t\t\t/* GROUP: sve_int_unpred_misc */\n\t\t\top0 = (INSWORD>>10)&3;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_misc_0_b(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_misc_0_c(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_int_bin_cons_misc_0_d(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x30)==0x30) {\n\t\t\t/* GROUP: sve_countelt */\n\t\t\top0 = (INSWORD>>20)&1;\n\t\t\top1 = (INSWORD>>11)&7;\n\t\t\tif(!op0 && !(op1&6))\n\t\t\t\treturn decode_iclass_sve_int_countvlv0(ctx, dec);\n\t\t\tif(!op0 && op1==4)\n\t\t\t\treturn decode_iclass_sve_int_count(ctx, dec);\n\t\t\tif(!op0 && op1==5)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_7\n\t\t\tif(op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_countvlv1(ctx, dec);\n\t\t\tif(op0 && op1==4)\n\t\t\t\treturn decode_iclass_sve_int_pred_pattern_a(ctx, dec);\n\t\t\tif(op0 && (op1&3)==1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_8\n\t\t\tif((op1&6)==2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_6\n\t\t\tif((op1&6)==6)\n\t\t\t\treturn decode_iclass_sve_int_pred_pattern_b(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && !(op2&0x18)) {\n\t\t\t/* GROUP: sve_maskimm */\n\t\t\top0 = (INSWORD>>22)&3;\n\t\t\top1 = (INSWORD>>18)&3;\n\t\t\tif(op0==3 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_dup_mask_imm(ctx, dec);\n\t\t\tif(op0!=3 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_log_imm(ctx, dec);\n\t\t\tif(op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_127\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && (op2&0x18)==8) {\n\t\t\t/* GROUP: sve_wideimm_pred */\n\t\t\top0 = (INSWORD>>13)&7;\n\t\t\tif(!(op0&4))\n\t\t\t\treturn decode_iclass_sve_int_dup_imm_pred(ctx, dec);\n\t\t\tif((op0&6)==4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_9\n\t\t\tif(op0==6)\n\t\t\t\treturn decode_iclass_sve_int_dup_fpimm_pred(ctx, dec);\n\t\t\tif(op0==7)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_10\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && op3==8)\n\t\t\treturn decode_iclass_sve_int_perm_dup_i(ctx, dec);\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && op3==9)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_0\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x3e)==10)\n\t\t\treturn decode_iclass_sve_int_perm_tbl_3src(ctx, dec);\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x3d)==13)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_1\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && op3==12)\n\t\t\treturn decode_iclass_sve_int_perm_tbl(ctx, dec);\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && op3==14) {\n\t\t\t/* GROUP: sve_perm_unpred_d */\n\t\t\top0 = (INSWORD>>19)&3;\n\t\t\top1 = (INSWORD>>16)&7;\n\t\t\tif(!op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_perm_dup_r(ctx, dec);\n\t\t\tif(!op0 && op1==4)\n\t\t\t\treturn decode_iclass_sve_int_perm_insrs(ctx, dec);\n\t\t\tif(!op0 && (op1&3)==2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_83\n\t\t\tif(!op0 && op1&1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_82\n\t\t\tif(op0==1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_13\n\t\t\tif(op0==2 && !(op1&4))\n\t\t\t\treturn decode_iclass_sve_int_perm_unpk(ctx, dec);\n\t\t\tif(op0==2 && op1==4)\n\t\t\t\treturn decode_iclass_sve_int_perm_insrv(ctx, dec);\n\t\t\tif(op0==2 && op1==6)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_91\n\t\t\tif(op0==2 && (op1&5)==5)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_90\n\t\t\tif(op0==3 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_perm_reverse_z(ctx, dec);\n\t\t\tif(op0==3 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_120\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x10) {\n\t\t\t/* GROUP: sve_perm_predicates */\n\t\t\top0 = (INSWORD>>22)&3;\n\t\t\top1 = (INSWORD>>16)&0x1f;\n\t\t\top2 = (INSWORD>>9)&15;\n\t\t\top3 = (INSWORD>>4)&1;\n\t\t\tif(!op0 && (op1&0x1e)==0x10 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_punpk(ctx, dec);\n\t\t\tif(op0==1 && (op1&0x1e)==0x10 && !op2 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_92\n\t\t\tif(op0==2 && (op1&0x1e)==0x10 && !op2 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_93\n\t\t\tif(op0==3 && (op1&0x1e)==0x10 && !op2 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_94\n\t\t\tif(!(op1&0x10) && !(op2&1) && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_bin_perm_pp(ctx, dec);\n\t\t\tif(!(op1&0x10) && op2&1 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_81\n\t\t\tif(op1==0x14 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_reverse_p(ctx, dec);\n\t\t\tif(op1==0x15 && !op2 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_18\n\t\t\tif((op1&0x1a)==0x10 && op2==8 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_89\n\t\t\tif((op1&0x1a)==0x10 && (op2&7)==4 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_88\n\t\t\tif((op1&0x1a)==0x10 && (op2&3)==2 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_87\n\t\t\tif((op1&0x1a)==0x10 && op2&1 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_86\n\t\t\tif((op1&0x1a)==0x12 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_17\n\t\t\tif((op1&0x18)==0x18 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_19\n\t\t\tif(op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_80\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x18)\n\t\t\treturn decode_iclass_sve_int_perm_bin_perm_zz(ctx, dec);\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x30)==0x20) {\n\t\t\t/* GROUP: sve_perm_pred */\n\t\t\top0 = (INSWORD>>20)&1;\n\t\t\top1 = (INSWORD>>17)&7;\n\t\t\top2 = (INSWORD>>16)&1;\n\t\t\top3 = (INSWORD>>13)&1;\n\t\t\tif(!op0 && !op1 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_cpy_v(ctx, dec);\n\t\t\tif(!op0 && !op1 && op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_compact(ctx, dec);\n\t\t\tif(!op0 && !op1 && op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_last_r(ctx, dec);\n\t\t\tif(!op0 && op1==1 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_last_v(ctx, dec);\n\t\t\tif(!op0 && (op1&6)==2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_rev(ctx, dec);\n\t\t\tif(!op0 && (op1&6)==2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_12\n\t\t\tif(!op0 && op1==4 && !op2 && op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_cpy_r(ctx, dec);\n\t\t\tif(!op0 && op1==4 && op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_14\n\t\t\tif(!op0 && op1==4 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_clast_zz(ctx, dec);\n\t\t\tif(!op0 && op1==5 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_clast_vz(ctx, dec);\n\t\t\tif(!op0 && op1==6 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_splice(ctx, dec);\n\t\t\tif(!op0 && op1==6 && op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_intx_perm_splice(ctx, dec);\n\t\t\tif(!op0 && op1==6 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_15\n\t\t\tif(!op0 && op1==7 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_revd(ctx, dec);\n\t\t\tif(!op0 && op1==7 && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_84\n\t\t\tif(!op0 && op1==7 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_85\n\t\t\tif(!op0 && (op1&3)==1 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_11\n\t\t\tif(op0 && !op1 && !op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_16\n\t\t\tif(op0 && !op1 && op3)\n\t\t\t\treturn decode_iclass_sve_int_perm_clast_rz(ctx, dec);\n\t\t\tif(op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_111\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x30)==0x30)\n\t\t\treturn decode_iclass_sve_int_sel_vvv(ctx, dec);\n\t\tif(!op0 && op1==2 && (op2&0x10)==0x10 && !(op3&0x38)) {\n\t\t\t/* GROUP: sve_perm_extract */\n\t\t\top0 = (INSWORD>>22)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_perm_extract_i(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_intx_perm_extract_i(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(!op0 && op1==3 && (op2&0x10)==0x10 && !(op3&0x38))\n\t\t\treturn decode_iclass_sve_int_perm_bin_long_perm_zz(ctx, dec);\n\t\tif(op0==1 && !(op1&2) && !(op2&0x10)) {\n\t\t\t/* GROUP: sve_cmpvec */\n\t\t\top0 = (INSWORD>>14)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_cmp_0(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_int_cmp_1(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && !(op1&2) && (op2&0x10)==0x10)\n\t\t\treturn decode_iclass_sve_int_ucmp_vi(ctx, dec);\n\t\tif(op0==1 && (op1&2)==2 && !(op2&0x10) && !(op3&0x10))\n\t\t\treturn decode_iclass_sve_int_scmp_vi(ctx, dec);\n\t\tif(op0==1 && (op1&2)==2 && !(op2&0x18) && (op3&0x30)==0x10)\n\t\t\treturn decode_iclass_sve_int_pred_log(ctx, dec);\n\t\tif(op0==1 && (op1&2)==2 && !(op2&0x18) && (op3&0x30)==0x30) {\n\t\t\t/* GROUP: sve_pred_gen_b */\n\t\t\top0 = (INSWORD>>9)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_brkp(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_20\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x18)==8 && (op3&0x30)==0x10) {\n\t\t\t/* GROUP: sve_pred_gen_c */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>16)&15;\n\t\t\top2 = (INSWORD>>9)&1;\n\t\t\top3 = (INSWORD>>4)&1;\n\t\t\tif(!op0 && op1==8 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_int_brkn(ctx, dec);\n\t\t\tif(!op0 && op1==8 && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_22\n\t\t\tif(!op0 && !(op1&7) && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_21\n\t\t\tif(!op0 && (op1&4)==4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_101\n\t\t\tif(!op0 && (op1&2)==2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_99\n\t\t\tif(!op0 && op1&1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_97\n\t\t\tif(op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_28\n\t\t\tif(op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_138\n\t\t\tif(!op1 && !op2)\n\t\t\t\treturn decode_iclass_sve_int_break(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x18)==8 && (op3&0x30)==0x30) {\n\t\t\t/* GROUP: sve_pred_gen_d */\n\t\t\top0 = (INSWORD>>16)&15;\n\t\t\top1 = (INSWORD>>11)&7;\n\t\t\top2 = (INSWORD>>9)&3;\n\t\t\top3 = (INSWORD>>5)&15;\n\t\t\top4 = (INSWORD>>4)&1;\n\t\t\tif(!op0 && !(op2&1) && !op4)\n\t\t\t\treturn decode_iclass_sve_int_ptest(ctx, dec);\n\t\t\tif(op0==4 && !(op2&1) && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_102\n\t\t\tif((op0&11)==2 && !(op2&1) && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_100\n\t\t\tif((op0&9)==1 && !(op2&1) && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_98\n\t\t\tif(!(op0&8) && op2&1 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_96\n\t\t\tif(op0==8 && !op1 && !op2 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_pfirst(ctx, dec);\n\t\t\tif(op0==8 && !op1 && op2 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_128\n\t\t\tif(op0==8 && op1==4 && op2==2 && !op3 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_pfalse(ctx, dec);\n\t\t\tif(op0==8 && op1==4 && op2==2 && op3 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_129\n\t\t\tif(op0==8 && op1==6 && !op2 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_rdffr(ctx, dec);\n\t\t\tif(op0==9 && !op1 && !(op2&2) && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_24\n\t\t\tif(op0==9 && !op1 && op2==2 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_pnext(ctx, dec);\n\t\t\tif(op0==9 && !op1 && op2==3 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_25\n\t\t\tif(op0==9 && op1==4 && op2==2 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_26\n\t\t\tif(op0==9 && op1==6 && !op2 && !op3 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_rdffr_2(ctx, dec);\n\t\t\tif(op0==9 && op1==6 && !op2 && op3 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_131\n\t\t\tif((op0&14)==8 && op1==2 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_23\n\t\t\tif((op0&14)==8 && op1==4 && !(op2&2) && !op4)\n\t\t\t\treturn decode_iclass_sve_int_ptrue(ctx, dec);\n\t\t\tif((op0&14)==8 && op1==4 && op2==3 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_104\n\t\t\tif((op0&14)==8 && op1==6 && op2 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_130\n\t\t\tif((op0&14)==8 && op1&1 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_103\n\t\t\tif((op0&14)==12 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_106\n\t\t\tif((op0&10)==10 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_105\n\t\t\tif(op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_95\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x10)==0x10 && !(op3&0x30)) {\n\t\t\t/* GROUP: sve_cmpgpr */\n\t\t\top0 = (INSWORD>>12)&3;\n\t\t\top1 = (INSWORD>>10)&3;\n\t\t\top2 = INSWORD&15;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_int_while_rr(ctx, dec);\n\t\t\tif(op0==2 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_sve_int_cterm(ctx, dec);\n\t\t\tif(op0==2 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_121\n\t\t\tif(op0==3 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_whilenc(ctx, dec);\n\t\t\tif((op0&2)==2 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_122\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x30)==0x10 && !op4)\n\t\t\treturn decode_iclass_sve_int_pred_dup(ctx, dec);\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x30)==0x10 && op4)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_3\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x30)==0x30) {\n\t\t\t/* GROUP: sve_wideimm_unpred */\n\t\t\top0 = (INSWORD>>19)&3;\n\t\t\top1 = (INSWORD>>16)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_arith_imm0(ctx, dec);\n\t\t\tif(op0==1)\n\t\t\t\treturn decode_iclass_sve_int_arith_imm1(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_int_arith_imm2(ctx, dec);\n\t\t\tif(op0==3 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_dup_imm(ctx, dec);\n\t\t\tif(op0==3 && op1)\n\t\t\t\treturn decode_iclass_sve_int_dup_fpimm(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x1c)==0x10 && (op3&0x30)==0x20) {\n\t\t\t/* GROUP: sve_pred_count_a */\n\t\t\top0 = (INSWORD>>9)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_int_pcount_pred(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_27\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x1c)==0x14 && (op3&0x3c)==0x20) {\n\t\t\t/* GROUP: sve_pred_count_b */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\top1 = (INSWORD>>11)&1;\n\t\t\tif(!op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_count_v_sat(ctx, dec);\n\t\t\tif(!op0 && op1)\n\t\t\t\treturn decode_iclass_sve_int_count_r_sat(ctx, dec);\n\t\t\tif(op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_int_count_v(ctx, dec);\n\t\t\tif(op0 && op1)\n\t\t\t\treturn decode_iclass_sve_int_count_r(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x1c)==0x14 && (op3&0x3c)==0x24) {\n\t\t\t/* GROUP: sve_pred_wrffr */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\top1 = (INSWORD>>16)&3;\n\t\t\top2 = (INSWORD>>9)&7;\n\t\t\top3 = (INSWORD>>5)&15;\n\t\t\top4 = INSWORD&0x1f;\n\t\t\tif(!op0 && !op1 && !op2 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_wrffr(ctx, dec);\n\t\t\tif(op0 && !op1 && !op2 && !op3 && !op4)\n\t\t\t\treturn decode_iclass_sve_int_setffr(ctx, dec);\n\t\t\tif(op0 && !op1 && !op2 && (op3&8)==8 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_110\n\t\t\tif(op0 && !op1 && !op2 && (op3&4)==4 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_109\n\t\t\tif(op0 && !op1 && !op2 && (op3&2)==2 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_108\n\t\t\tif(op0 && !op1 && !op2 && op3&1 && !op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_107\n\t\t\tif(!op1 && !op2 && op4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_134\n\t\t\tif(!op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_135\n\t\t\tif(op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_136\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x1c)==0x14 && (op3&0x38)==0x28)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_2\n\t\tif(op0==1 && (op1&2)==2 && (op2&0x18)==0x18 && (op3&0x30)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_4\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && !(op3&0x20)) {\n\t\t\t/* GROUP: sve_intx_muladd_unpred */\n\t\t\top0 = (INSWORD>>10)&0x1f;\n\t\t\tif(!(op0&0x1e))\n\t\t\t\treturn decode_iclass_sve_intx_dot(ctx, dec);\n\t\t\tif((op0&0x1e)==2)\n\t\t\t\treturn decode_iclass_sve_intx_qdmlalbt(ctx, dec);\n\t\t\tif((op0&0x1c)==4)\n\t\t\t\treturn decode_iclass_sve_intx_cdot(ctx, dec);\n\t\t\tif((op0&0x18)==8)\n\t\t\t\treturn decode_iclass_sve_intx_cmla(ctx, dec);\n\t\t\tif((op0&0x18)==0x10)\n\t\t\t\treturn decode_iclass_sve_intx_mlal_long(ctx, dec);\n\t\t\tif((op0&0x1c)==0x18)\n\t\t\t\treturn decode_iclass_sve_intx_qdmlal_long(ctx, dec);\n\t\t\tif((op0&0x1e)==0x1c)\n\t\t\t\treturn decode_iclass_sve_intx_qrdmlah(ctx, dec);\n\t\t\tif(op0==0x1e)\n\t\t\t\treturn decode_iclass_sve_intx_mixed_dot(ctx, dec);\n\t\t\tif(op0==0x1f)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_29\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && (op3&0x30)==0x20) {\n\t\t\t/* GROUP: sve_intx_predicated */\n\t\t\top0 = (INSWORD>>17)&15;\n\t\t\top1 = (INSWORD>>13)&1;\n\t\t\tif(op0==2 && op1)\n\t\t\t\treturn decode_iclass_sve_intx_accumulate_long_pairs(ctx, dec);\n\t\t\tif(op0==3 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_30\n\t\t\tif((op0&14)==6 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_31\n\t\t\tif(!(op0&10) && op1)\n\t\t\t\treturn decode_iclass_sve_intx_pred_arith_unary(ctx, dec);\n\t\t\tif(!(op0&8) && !op1)\n\t\t\t\treturn decode_iclass_sve_intx_bin_pred_shift_sat_round(ctx, dec);\n\t\t\tif((op0&12)==8 && !op1)\n\t\t\t\treturn decode_iclass_sve_intx_pred_arith_binary(ctx, dec);\n\t\t\tif((op0&12)==8 && op1)\n\t\t\t\treturn decode_iclass_sve_intx_arith_binary_pairs(ctx, dec);\n\t\t\tif((op0&12)==12 && !op1)\n\t\t\t\treturn decode_iclass_sve_intx_pred_arith_binary_sat(ctx, dec);\n\t\t\tif((op0&12)==12 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_32\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && (op3&0x3e)==0x30)\n\t\t\treturn decode_iclass_sve_intx_clamp(ctx, dec);\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && (op3&0x3e)==0x32)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_5\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && (op3&0x3c)==0x34)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_6\n\t\tif(op0==2 && !(op1&2) && !(op2&0x10) && (op3&0x38)==0x38)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_7\n\t\tif(op0==2 && !(op1&2) && (op2&0x10)==0x10) {\n\t\t\t/* GROUP: sve_intx_by_indexed_elem */\n\t\t\top0 = (INSWORD>>10)&0x3f;\n\t\t\tif(!(op0&0x3e))\n\t\t\t\treturn decode_iclass_sve_intx_dot_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3e)==2)\n\t\t\t\treturn decode_iclass_sve_intx_mla_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3e)==4)\n\t\t\t\treturn decode_iclass_sve_intx_qrdmlah_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3e)==6)\n\t\t\t\treturn decode_iclass_sve_intx_mixed_dot_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x38)==8)\n\t\t\t\treturn decode_iclass_sve_intx_qdmla_long_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3c)==0x10)\n\t\t\t\treturn decode_iclass_sve_intx_cdot_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3c)==0x14)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_33\n\t\t\tif((op0&0x3c)==0x18)\n\t\t\t\treturn decode_iclass_sve_intx_cmla_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3c)==0x1c)\n\t\t\t\treturn decode_iclass_sve_intx_qrdcmla_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x30)==0x20)\n\t\t\t\treturn decode_iclass_sve_intx_mla_long_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x38)==0x30)\n\t\t\t\treturn decode_iclass_sve_intx_mul_long_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3c)==0x38)\n\t\t\t\treturn decode_iclass_sve_intx_qdmul_long_by_indexed_elem(ctx, dec);\n\t\t\tif((op0&0x3e)==0x3c)\n\t\t\t\treturn decode_iclass_sve_intx_qdmulh_by_indexed_elem(ctx, dec);\n\t\t\tif(op0==0x3e)\n\t\t\t\treturn decode_iclass_sve_intx_mul_by_indexed_elem(ctx, dec);\n\t\t\tif(op0==0x3f)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_34\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && !(op2&0x10) && !(op3&0x20)) {\n\t\t\t/* GROUP: sve_intx_cons_widening */\n\t\t\top0 = (INSWORD>>13)&3;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_intx_cons_arith_long(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_intx_cons_arith_wide(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_intx_cons_mul_long(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && !(op2&0x10) && (op3&0x30)==0x20) {\n\t\t\t/* GROUP: sve_intx_constructive */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>10)&15;\n\t\t\tif(!op0 && (op1&12)==8)\n\t\t\t\treturn decode_iclass_sve_intx_shift_long(ctx, dec);\n\t\t\tif(op0 && (op1&12)==8)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_40\n\t\t\tif(!(op1&12))\n\t\t\t\treturn decode_iclass_sve_intx_clong(ctx, dec);\n\t\t\tif((op1&14)==4)\n\t\t\t\treturn decode_iclass_sve_intx_eorx(ctx, dec);\n\t\t\tif(op1==6)\n\t\t\t\treturn decode_iclass_sve_intx_mmla(ctx, dec);\n\t\t\tif(op1==7)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_35\n\t\t\tif((op1&12)==12)\n\t\t\t\treturn decode_iclass_sve_intx_perm_bit(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && !(op2&0x10) && (op3&0x30)==0x30) {\n\t\t\t/* GROUP: sve_intx_acc */\n\t\t\top0 = (INSWORD>>17)&15;\n\t\t\top1 = (INSWORD>>11)&7;\n\t\t\tif(!op0 && op1==3)\n\t\t\t\treturn decode_iclass_sve_intx_cadd(ctx, dec);\n\t\t\tif(op0 && op1==3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_125\n\t\t\tif(!(op1&6))\n\t\t\t\treturn decode_iclass_sve_intx_aba_long(ctx, dec);\n\t\t\tif(op1==2)\n\t\t\t\treturn decode_iclass_sve_intx_adc_long(ctx, dec);\n\t\t\tif((op1&6)==4)\n\t\t\t\treturn decode_iclass_sve_intx_sra(ctx, dec);\n\t\t\tif(op1==6)\n\t\t\t\treturn decode_iclass_sve_intx_shift_insert(ctx, dec);\n\t\t\tif(op1==7)\n\t\t\t\treturn decode_iclass_sve_intx_aba(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && (op2&0x10)==0x10 && !(op3&0x20)) {\n\t\t\t/* GROUP: sve_intx_narrowing */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>16)&7;\n\t\t\top2 = (INSWORD>>13)&3;\n\t\t\tif(!op0 && !op1 && op2==2)\n\t\t\t\treturn decode_iclass_sve_intx_extract_narrow(ctx, dec);\n\t\t\tif(!op0 && op1 && op2==2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_137\n\t\t\tif(!op0 && !(op2&2))\n\t\t\t\treturn decode_iclass_sve_intx_shift_narrow(ctx, dec);\n\t\t\tif(op0 && !(op2&2))\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_41\n\t\t\tif(op0 && op2==2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_42\n\t\t\tif(op2==3)\n\t\t\t\treturn decode_iclass_sve_intx_arith_narrow(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x20)\n\t\t\treturn decode_iclass_sve_intx_match(ctx, dec);\n\t\tif(op0==2 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x28) {\n\t\t\t/* GROUP: sve_intx_histseg */\n\t\t\top0 = (INSWORD>>10)&7;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_intx_histseg(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_119\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==2 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x30)\n\t\t\treturn decode_iclass_sve_intx_histcnt(ctx, dec);\n\t\tif(op0==2 && (op1&2)==2 && (op2&0x10)==0x10 && (op3&0x38)==0x38) {\n\t\t\t/* GROUP: sve_intx_crypto */\n\t\t\top0 = (INSWORD>>18)&7;\n\t\t\top1 = (INSWORD>>16)&3;\n\t\t\top2 = (INSWORD>>11)&3;\n\t\t\top3 = (INSWORD>>5)&0x1f;\n\t\t\tif(!op0 && !op1 && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_crypto_unary(ctx, dec);\n\t\t\tif(!op0 && !op1 && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_116\n\t\t\tif(!op0 && !op1 && op2&1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_36\n\t\t\tif(!op0 && op1==1 && !(op2&2))\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_37\n\t\t\tif(!op0 && op1==1 && op2==3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_38\n\t\t\tif(!op0 && (op1&2)==2 && !op2)\n\t\t\t\treturn decode_iclass_sve_crypto_binary_dest(ctx, dec);\n\t\t\tif(!op0 && (op1&2)==2 && op2&1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_39\n\t\t\tif(op0 && !(op2&2))\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_117\n\t\t\tif(op0 && op2==3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_118\n\t\t\tif(op2==2)\n\t\t\t\treturn decode_iclass_sve_crypto_binary_const(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && !(op1&2) && !(op2&0x10) && !(op3&0x20))\n\t\t\treturn decode_iclass_sve_fp_fcmla(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x1a)==2 && (op3&0x20)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_13\n\t\tif(op0==3 && !(op1&2) && !op2 && (op3&0x38)==0x20)\n\t\t\treturn decode_iclass_sve_fp_fcadd(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && !op2 && (op3&0x38)==0x28)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_8\n\t\tif(op0==3 && !(op1&2) && !op2 && (op3&0x30)==0x30)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_9\n\t\tif(op0==3 && !(op1&2) && op2==1 && (op3&0x20)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_10\n\t\tif(op0==3 && !(op1&2) && (op2&0x1e)==4 && (op3&0x38)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_11\n\t\tif(op0==3 && !(op1&2) && (op2&0x1e)==4 && (op3&0x38)==0x28)\n\t\t\treturn decode_iclass_sve_fp_fcvt2(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x1e)==4 && (op3&0x30)==0x30)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_12\n\t\tif(op0==3 && !(op1&2) && (op2&0x1c)==8 && (op3&0x38)==0x20)\n\t\t\treturn decode_iclass_sve_fp_pairwise(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x1c)==8 && (op3&0x38)==0x28)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_14\n\t\tif(op0==3 && !(op1&2) && (op2&0x1c)==8 && (op3&0x30)==0x30)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_15\n\t\tif(op0==3 && !(op1&2) && (op2&0x1c)==12 && (op3&0x20)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_16\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x16)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_20\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && !(op3&0x3e))\n\t\t\treturn decode_iclass_sve_fp_fma_by_indexed_elem(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==4)\n\t\t\treturn decode_iclass_sve_fp_fcmla_by_indexed_elem(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && op3==8)\n\t\t\treturn decode_iclass_sve_fp_fmul_by_indexed_elem(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && op3==9)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_17\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==12)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_18\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x34)==0x10) {\n\t\t\t/* GROUP: sve_fp_fma_w_by_indexed_elem */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>13)&1;\n\t\t\top2 = (INSWORD>>10)&3;\n\t\t\tif(!op0 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_sve_fp_fdot_by_indexed_elem(ctx, dec);\n\t\t\tif(!op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_112\n\t\t\tif(!op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_43\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_fp_fma_long_by_indexed_elem(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x34)==0x14)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_19\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x36)==0x20) {\n\t\t\t/* GROUP: sve_fp_fma_w */\n\t\t\top0 = (INSWORD>>23)&1;\n\t\t\top1 = (INSWORD>>13)&1;\n\t\t\top2 = (INSWORD>>10)&1;\n\t\t\tif(!op0 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_sve_fp_fdot(ctx, dec);\n\t\t\tif(!op0 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_44\n\t\t\tif(!op0 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_45\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_fp_fma_long(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x34)==0x24)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_21\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x38)==0x30)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_22\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && op3==0x38)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_23\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && op3==0x39)\n\t\t\treturn decode_iclass_sve_fp_fmmla(ctx, dec);\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3e)==0x3a)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_24\n\t\tif(op0==3 && !(op1&2) && (op2&0x10)==0x10 && (op3&0x3c)==0x3c)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_25\n\t\tif(op0==3 && (op1&2)==2 && !(op2&0x10) && (op3&0x10)==0x10)\n\t\t\treturn decode_iclass_sve_fp_3op_p_pd(ctx, dec);\n\t\tif(op0==3 && (op1&2)==2 && !(op2&0x10) && !(op3&0x38))\n\t\t\treturn decode_iclass_sve_fp_3op_u_zd(ctx, dec);\n\t\tif(op0==3 && (op1&2)==2 && !(op2&0x10) && (op3&0x38)==0x20) {\n\t\t\t/* GROUP: sve_fp_pred */\n\t\t\top0 = (INSWORD>>19)&3;\n\t\t\top1 = (INSWORD>>10)&7;\n\t\t\top2 = (INSWORD>>6)&15;\n\t\t\tif(!(op0&2))\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zds(ctx, dec);\n\t\t\tif(op0==2 && !op1)\n\t\t\t\treturn decode_iclass_sve_fp_ftmad(ctx, dec);\n\t\t\tif(op0==2 && op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_123\n\t\t\tif(op0==3 && !op2)\n\t\t\t\treturn decode_iclass_sve_fp_2op_i_p_zds(ctx, dec);\n\t\t\tif(op0==3 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_124\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && (op1&2)==2 && !(op2&0x10) && (op3&0x38)==0x28) {\n\t\t\t/* GROUP: sve_fp_unary */\n\t\t\top0 = (INSWORD>>18)&7;\n\t\t\tif(!(op0&6))\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zd_a(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zd_b_0(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zd_b_1(ctx, dec);\n\t\t\tif((op0&6)==4)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zd_c(ctx, dec);\n\t\t\tif((op0&6)==6)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_zd_d(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && (op1&2)==2 && !(op2&0x1c) && (op3&0x38)==8)\n\t\t\treturn decode_iclass_sve_fp_fast_red(ctx, dec);\n\t\tif(op0==3 && (op1&2)==2 && (op2&0x1c)==4 && (op3&0x3c)==8)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unalloc_26\n\t\tif(op0==3 && (op1&2)==2 && (op2&0x1c)==4 && (op3&0x3c)==12) {\n\t\t\t/* GROUP: sve_fp_unary_unpred */\n\t\t\top0 = (INSWORD>>10)&3;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_fp_2op_u_zd(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_115\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && (op1&2)==2 && (op2&0x1c)==8 && (op3&0x38)==8) {\n\t\t\t/* GROUP: sve_fp_cmpzero */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_pd(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_46\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && (op1&2)==2 && (op2&0x1c)==12 && (op3&0x38)==8) {\n\t\t\t/* GROUP: sve_fp_slowreduce */\n\t\t\top0 = (INSWORD>>18)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_fp_2op_p_vd(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_47\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==3 && (op1&2)==2 && (op2&0x10)==0x10) {\n\t\t\t/* GROUP: sve_fp_fma */\n\t\t\top0 = (INSWORD>>15)&1;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_fp_3op_p_zds_a(ctx, dec);\n\t\t\tif(op0)\n\t\t\t\treturn decode_iclass_sve_fp_3op_p_zds_b(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==4) {\n\t\t\t/* GROUP: sve_mem32 */\n\t\t\top0 = (INSWORD>>23)&3;\n\t\t\top1 = (INSWORD>>21)&3;\n\t\t\top2 = (INSWORD>>13)&7;\n\t\t\top3 = (INSWORD>>4)&1;\n\t\t\tif(!op0 && op1&1 && !(op2&4) && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_32b_prfm_sv(ctx, dec);\n\t\t\tif(!op0 && op1&1 && !(op2&4) && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_54\n\t\t\tif(op0==1 && op1&1 && !(op2&4))\n\t\t\t\treturn decode_iclass_sve_mem_32b_gld_sv_a(ctx, dec);\n\t\t\tif(op0==2 && op1&1 && !(op2&4))\n\t\t\t\treturn decode_iclass_sve_mem_32b_gld_sv_b(ctx, dec);\n\t\t\tif(op0==3 && !(op1&2) && !op2 && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_32b_pfill(ctx, dec);\n\t\t\tif(op0==3 && !(op1&2) && !op2 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_55\n\t\t\tif(op0==3 && !(op1&2) && op2==2)\n\t\t\t\treturn decode_iclass_sve_mem_32b_fill(ctx, dec);\n\t\t\tif(op0==3 && !(op1&2) && (op2&5)==1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_56\n\t\t\tif(op0==3 && (op1&2)==2 && !(op2&4) && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_prfm_si(ctx, dec);\n\t\t\tif(op0==3 && (op1&2)==2 && !(op2&4) && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_57\n\t\t\tif(op0!=3 && !(op1&1) && !(op2&4))\n\t\t\t\treturn decode_iclass_sve_mem_32b_gld_vs(ctx, dec);\n\t\t\tif(!op1 && (op2&6)==4)\n\t\t\t\treturn decode_iclass_sve_mem_32b_gldnt_vs(ctx, dec);\n\t\t\tif(!op1 && op2==6 && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_prfm_ss(ctx, dec);\n\t\t\tif(!op1 && op2==7 && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_32b_prfm_vi(ctx, dec);\n\t\t\tif(!op1 && (op2&6)==6 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_53\n\t\t\tif(op1==1 && (op2&4)==4)\n\t\t\t\treturn decode_iclass_sve_mem_32b_gld_vi(ctx, dec);\n\t\t\tif((op1&2)==2 && (op2&4)==4)\n\t\t\t\treturn decode_iclass_sve_mem_ld_dup(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==5) {\n\t\t\t/* GROUP: sve_memcld */\n\t\t\top0 = (INSWORD>>21)&3;\n\t\t\top1 = (INSWORD>>20)&1;\n\t\t\top2 = (INSWORD>>13)&7;\n\t\t\tif(!op0 && !op1 && op2==7)\n\t\t\t\treturn decode_iclass_sve_mem_cldnt_si(ctx, dec);\n\t\t\tif(!op0 && op2==6)\n\t\t\t\treturn decode_iclass_sve_mem_cldnt_ss(ctx, dec);\n\t\t\tif(op0 && !op1 && op2==7)\n\t\t\t\treturn decode_iclass_sve_mem_eld_si(ctx, dec);\n\t\t\tif(op0 && op2==6)\n\t\t\t\treturn decode_iclass_sve_mem_eld_ss(ctx, dec);\n\t\t\tif(!op1 && op2==1)\n\t\t\t\treturn decode_iclass_sve_mem_ldqr_si(ctx, dec);\n\t\t\tif(!op1 && op2==5)\n\t\t\t\treturn decode_iclass_sve_mem_cld_si(ctx, dec);\n\t\t\tif(op1 && op2==1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_60\n\t\t\tif(op1 && op2==5)\n\t\t\t\treturn decode_iclass_sve_mem_cldnf_si(ctx, dec);\n\t\t\tif(op1 && op2==7)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_61\n\t\t\tif(!op2)\n\t\t\t\treturn decode_iclass_sve_mem_ldqr_ss(ctx, dec);\n\t\t\tif(op2==2)\n\t\t\t\treturn decode_iclass_sve_mem_cld_ss(ctx, dec);\n\t\t\tif(op2==3)\n\t\t\t\treturn decode_iclass_sve_mem_cldff_ss(ctx, dec);\n\t\t\tif(op2==4)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_59\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==6) {\n\t\t\t/* GROUP: sve_mem64 */\n\t\t\top0 = (INSWORD>>23)&3;\n\t\t\top1 = (INSWORD>>21)&3;\n\t\t\top2 = (INSWORD>>13)&7;\n\t\t\top3 = (INSWORD>>4)&1;\n\t\t\tif(!op0 && op1==1 && !(op2&4) && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_68\n\t\t\tif(!op0 && op1==3 && (op2&4)==4 && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_64b_prfm_sv2(ctx, dec);\n\t\t\tif(!op0 && op1==3 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_69\n\t\t\tif(!op0 && op1&1 && !(op2&4) && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_64b_prfm_sv(ctx, dec);\n\t\t\tif(op0 && op1==3 && (op2&4)==4)\n\t\t\t\treturn decode_iclass_sve_mem_64b_gld_sv2(ctx, dec);\n\t\t\tif(op0 && op1&1 && !(op2&4))\n\t\t\t\treturn decode_iclass_sve_mem_64b_gld_sv(ctx, dec);\n\t\t\tif(!op1 && op2==5)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_66\n\t\t\tif(!op1 && op2==7 && !op3)\n\t\t\t\treturn decode_iclass_sve_mem_64b_prfm_vi(ctx, dec);\n\t\t\tif(!op1 && op2==7 && op3)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_67\n\t\t\tif(!op1 && (op2&5)==4)\n\t\t\t\treturn decode_iclass_sve_mem_64b_gldnt_vs(ctx, dec);\n\t\t\tif(op1==1 && (op2&4)==4)\n\t\t\t\treturn decode_iclass_sve_mem_64b_gld_vi(ctx, dec);\n\t\t\tif(op1==2 && (op2&4)==4)\n\t\t\t\treturn decode_iclass_sve_mem_64b_gld_vs2(ctx, dec);\n\t\t\tif(!(op1&1) && !(op2&4))\n\t\t\t\treturn decode_iclass_sve_mem_64b_gld_vs(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==7 && !(op3&0x28)) {\n\t\t\t/* GROUP: sve_memst_cs */\n\t\t\top0 = (INSWORD>>22)&7;\n\t\t\top1 = (INSWORD>>14)&1;\n\t\t\top2 = (INSWORD>>4)&1;\n\t\t\tif(!(op0&4) && !op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_75\n\t\t\tif((op0&6)==4 && !op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_77\n\t\t\tif(op0==6 && !op1 && !op2)\n\t\t\t\treturn decode_iclass_sve_mem_pspill(ctx, dec);\n\t\t\tif(op0==6 && !op1 && op2)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_78\n\t\t\tif(op0==6 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_spill(ctx, dec);\n\t\t\tif(op0==7 && !op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_79\n\t\t\tif(op0!=6 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_cst_ss(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==7 && (op3&0x28)==8) {\n\t\t\t/* GROUP: sve_memst_nt */\n\t\t\top0 = (INSWORD>>21)&3;\n\t\t\top1 = (INSWORD>>14)&1;\n\t\t\tif(!op0 && !op1)\n\t\t\t\treturn decode_iclass_sve_mem_sstnt_64b_vs(ctx, dec);\n\t\t\tif(!op0 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_cstnt_ss(ctx, dec);\n\t\t\tif(op0==2 && !op1)\n\t\t\t\treturn decode_iclass_sve_mem_sstnt_32b_vs(ctx, dec);\n\t\t\tif(op0 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_est_ss(ctx, dec);\n\t\t\tif(op0&1 && !op1)\n\t\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_76\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==7 && (op3&0x28)==0x20) {\n\t\t\t/* GROUP: sve_memst_ss */\n\t\t\top0 = (INSWORD>>21)&3;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_mem_sst_vs_a(ctx, dec);\n\t\t\tif(op0==1)\n\t\t\t\treturn decode_iclass_sve_mem_sst_sv_a(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_mem_sst_vs_b(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_mem_sst_sv_b(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==7 && (op3&0x38)==0x28) {\n\t\t\t/* GROUP: sve_memst_ss2 */\n\t\t\top0 = (INSWORD>>21)&3;\n\t\t\tif(!op0)\n\t\t\t\treturn decode_iclass_sve_mem_sst_vs2(ctx, dec);\n\t\t\tif(op0==1)\n\t\t\t\treturn decode_iclass_sve_mem_sst_sv2(ctx, dec);\n\t\t\tif(op0==2)\n\t\t\t\treturn decode_iclass_sve_mem_sst_vi_a(ctx, dec);\n\t\t\tif(op0==3)\n\t\t\t\treturn decode_iclass_sve_mem_sst_vi_b(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tif(op0==7 && (op3&0x38)==0x38) {\n\t\t\t/* GROUP: sve_memst_si */\n\t\t\top0 = (INSWORD>>21)&3;\n\t\t\top1 = (INSWORD>>20)&1;\n\t\t\tif(!op0 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_cstnt_si(ctx, dec);\n\t\t\tif(op0 && op1)\n\t\t\t\treturn decode_iclass_sve_mem_est_si(ctx, dec);\n\t\t\tif(!op1)\n\t\t\t\treturn decode_iclass_sve_mem_cst_si(ctx, dec);\n\t\t\tUNMATCHED;\n\t\t}\n\t\tUNMATCHED;\n\t}\n\tif(op1==3)\n\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: unallocate2\n\tif((op1&14)==8) {\n\t\t/* GROUP: dpimm */\n\t\top0 = (INSWORD>>23)&7;\n\t\tif(!(op0&6))\n\t\t\treturn decode_iclass_pcreladdr(ctx, dec);\n\t\tif(op0==2)\n\t\t\treturn decode_iclass_addsub_imm(ctx, dec);\n\t\tif(op0==3)\n\t\t\treturn decode_iclass_addsub_immtags(ctx, dec);\n\t\tif(op0==4)\n\t\t\treturn decode_iclass_log_imm(ctx, dec);\n\t\tif(op0==5)\n\t\t\treturn decode_iclass_movewide(ctx, dec);\n\t\tif(op0==6)\n\t\t\treturn decode_iclass_bitfield(ctx, dec);\n\t\tif(op0==7)\n\t\t\treturn decode_iclass_extract(ctx, dec);\n\t\tUNMATCHED;\n\t}\n\tif((op1&14)==10) {\n\t\t/* GROUP: control */\n\t\top0 = INSWORD>>29;\n\t\top1 = (INSWORD>>12)&0x3fff;\n\t\top2 = INSWORD&0x1f;\n\t\tif(op0==2 && !(op1&0x2000))\n\t\t\treturn decode_iclass_condbranch(ctx, dec);\n\t\tif(op0==6 && !(op1&0x3000))\n\t\t\treturn decode_iclass_exception(ctx, dec);\n\t\tif(op0==6 && op1==0x1031)\n\t\t\treturn decode_iclass_systeminstrswithreg(ctx, dec);\n\t\tif(op0==6 && op1==0x1032 && op2==0x1f)\n\t\t\treturn decode_iclass_hints(ctx, dec);\n\t\tif(op0==6 && op1==0x1033)\n\t\t\treturn decode_iclass_barriers(ctx, dec);\n\t\tif(op0==6 && (op1&0x3f8f)==0x1004)\n\t\t\treturn decode_iclass_pstate(ctx, dec);\n\t\tif(op0==6 && (op1&0x3f80)==0x1200)\n\t\t\treturn decode_iclass_systemresult(ctx, dec);\n\t\tif(op0==6 && (op1&0x3d80)==0x1080)\n\t\t\treturn decode_iclass_systeminstrs(ctx, dec);\n\t\tif(op0==6 && (op1&0x3d00)==0x1100)\n\t\t\treturn decode_iclass_systemmove(ctx, dec);\n\t\tif(op0==6 && (op1&0x2000)==0x2000)\n\t\t\treturn decode_iclass_branch_reg(ctx, dec);\n\t\tif(!(op0&3))\n\t\t\treturn decode_iclass_branch_imm(ctx, dec);\n\t\tif((op0&3)==1 && !(op1&0x2000))\n\t\t\treturn decode_iclass_compbranch(ctx, dec);\n\t\tif((op0&3)==1 && (op1&0x2000)==0x2000)\n\t\t\treturn decode_iclass_testbranch(ctx, dec);\n\t\tUNMATCHED;\n\t}\n\tif((op1&5)==4) {\n\t\t/* GROUP: ldst */\n\t\top0 = INSWORD>>28;\n\t\top1 = (INSWORD>>26)&1;\n\t\top2 = (INSWORD>>23)&3;\n\t\top3 = (INSWORD>>16)&0x3f;\n\t\top4 = (INSWORD>>10)&3;\n\t\tif(!(op0&11) && !op1 && !op2 && (op3&0x20)==0x20)\n\t\t\treturn decode_iclass_comswappr(ctx, dec);\n\t\tif(!(op0&11) && op1 && !op2 && !op3)\n\t\t\treturn decode_iclass_asisdlse(ctx, dec);\n\t\tif(!(op0&11) && op1 && op2==1 && !(op3&0x20))\n\t\t\treturn decode_iclass_asisdlsep(ctx, dec);\n\t\tif(!(op0&11) && op1 && !(op2&2) && (op3&0x20)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_85\n\t\tif(!(op0&11) && op1 && op2==2 && !(op3&0x1f))\n\t\t\treturn decode_iclass_asisdlso(ctx, dec);\n\t\tif(!(op0&11) && op1 && op2==3)\n\t\t\treturn decode_iclass_asisdlsop(ctx, dec);\n\t\tif(!(op0&11) && op1 && !(op2&1) && (op3&0x10)==0x10)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_94\n\t\tif(!(op0&11) && op1 && !(op2&1) && (op3&8)==8)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_93\n\t\tif(!(op0&11) && op1 && !(op2&1) && (op3&4)==4)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_92\n\t\tif(!(op0&11) && op1 && !(op2&1) && (op3&2)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_91\n\t\tif(!(op0&11) && op1 && !(op2&1) && op3&1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_90\n\t\tif(op0==13 && !op1 && (op2&2)==2 && (op3&0x20)==0x20)\n\t\t\treturn decode_iclass_ldsttags(ctx, dec);\n\t\tif((op0&11)==8 && !op1 && !op2 && (op3&0x20)==0x20)\n\t\t\treturn decode_iclass_ldstexclp(ctx, dec);\n\t\tif((op0&11)==8 && op1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_83\n\t\tif(!(op0&3) && !op1 && !op2 && !(op3&0x20))\n\t\t\treturn decode_iclass_ldstexclr(ctx, dec);\n\t\tif(!(op0&3) && !op1 && op2==1 && !(op3&0x20))\n\t\t\treturn decode_iclass_ldstord(ctx, dec);\n\t\tif(!(op0&3) && !op1 && op2==1 && (op3&0x20)==0x20)\n\t\t\treturn decode_iclass_comswap(ctx, dec);\n\t\tif((op0&3)==1 && !op1 && (op2&2)==2 && !(op3&0x20) && !op4)\n\t\t\treturn decode_iclass_ldapstl_unscaled(ctx, dec);\n\t\tif((op0&3)==1 && !(op2&2))\n\t\t\treturn decode_iclass_loadlit(ctx, dec);\n\t\tif((op0&3)==2 && !op2)\n\t\t\treturn decode_iclass_ldstnapair_offs(ctx, dec);\n\t\tif((op0&3)==2 && op2==1)\n\t\t\treturn decode_iclass_ldstpair_post(ctx, dec);\n\t\tif((op0&3)==2 && op2==2)\n\t\t\treturn decode_iclass_ldstpair_off(ctx, dec);\n\t\tif((op0&3)==2 && op2==3)\n\t\t\treturn decode_iclass_ldstpair_pre(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && !(op3&0x20) && !op4)\n\t\t\treturn decode_iclass_ldst_unscaled(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && !(op3&0x20) && op4==1)\n\t\t\treturn decode_iclass_ldst_immpost(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && !(op3&0x20) && op4==2)\n\t\t\treturn decode_iclass_ldst_unpriv(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && !(op3&0x20) && op4==3)\n\t\t\treturn decode_iclass_ldst_immpre(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && (op3&0x20)==0x20 && !op4)\n\t\t\treturn decode_iclass_memop(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && (op3&0x20)==0x20 && op4==2)\n\t\t\treturn decode_iclass_ldst_regoff(ctx, dec);\n\t\tif((op0&3)==3 && !(op2&2) && (op3&0x20)==0x20 && op4&1)\n\t\t\treturn decode_iclass_ldst_pac(ctx, dec);\n\t\tif((op0&3)==3 && (op2&2)==2)\n\t\t\treturn decode_iclass_ldst_pos(ctx, dec);\n\t\tUNMATCHED;\n\t}\n\tif((op1&7)==5) {\n\t\t/* GROUP: dpreg */\n\t\top0 = (INSWORD>>30)&1;\n\t\top1 = (INSWORD>>28)&1;\n\t\top2 = (INSWORD>>21)&15;\n\t\top3 = (INSWORD>>10)&0x3f;\n\t\tif(!op0 && op1 && op2==6)\n\t\t\treturn decode_iclass_dp_2src(ctx, dec);\n\t\tif(op0 && op1 && op2==6)\n\t\t\treturn decode_iclass_dp_1src(ctx, dec);\n\t\tif(!op1 && !(op2&8))\n\t\t\treturn decode_iclass_log_shift(ctx, dec);\n\t\tif(!op1 && (op2&9)==8)\n\t\t\treturn decode_iclass_addsub_shift(ctx, dec);\n\t\tif(!op1 && (op2&9)==9)\n\t\t\treturn decode_iclass_addsub_ext(ctx, dec);\n\t\tif(op1 && !op2 && !op3)\n\t\t\treturn decode_iclass_addsub_carry(ctx, dec);\n\t\tif(op1 && !op2 && (op3&0x1f)==1)\n\t\t\treturn decode_iclass_rmif(ctx, dec);\n\t\tif(op1 && !op2 && (op3&15)==2)\n\t\t\treturn decode_iclass_setf(ctx, dec);\n\t\tif(op1 && op2==2 && !(op3&2))\n\t\t\treturn decode_iclass_condcmp_reg(ctx, dec);\n\t\tif(op1 && op2==2 && (op3&2)==2)\n\t\t\treturn decode_iclass_condcmp_imm(ctx, dec);\n\t\tif(op1 && op2==4)\n\t\t\treturn decode_iclass_condsel(ctx, dec);\n\t\tif(op1 && (op2&8)==8)\n\t\t\treturn decode_iclass_dp_3src(ctx, dec);\n\t\tUNMATCHED;\n\t}\n\tif((op1&7)==7) {\n\t\t/* GROUP: simd_dp */\n\t\top0 = INSWORD>>28;\n\t\top1 = (INSWORD>>23)&3;\n\t\top2 = (INSWORD>>19)&15;\n\t\top3 = (INSWORD>>10)&0x1ff;\n\t\tif(!op0 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_26\n\t\tif(op0==2 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_27\n\t\tif(op0==4 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_cryptoaes(ctx, dec);\n\t\tif(op0==5 && !(op1&2) && !(op2&4) && !(op3&0x23))\n\t\t\treturn decode_iclass_cryptosha3(ctx, dec);\n\t\tif(op0==5 && !(op1&2) && !(op2&4) && (op3&0x23)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_52\n\t\tif(op0==5 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_cryptosha2(ctx, dec);\n\t\tif(op0==6 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_29\n\t\tif(op0==7 && !(op1&2) && !(op2&4) && !(op3&0x21))\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_53\n\t\tif(op0==7 && !(op1&2) && (op2&7)==5 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_63\n\t\tif((op0&13)==5 && !op1 && !(op2&12) && (op3&0x21)==1)\n\t\t\treturn decode_iclass_asisdone(ctx, dec);\n\t\tif((op0&13)==5 && op1==1 && !(op2&12) && (op3&0x21)==1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_55\n\t\tif((op0&13)==5 && !(op1&2) && op2==7 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_65\n\t\tif((op0&13)==5 && !(op1&2) && (op2&12)==8 && (op3&0x31)==1)\n\t\t\treturn decode_iclass_asisdsamefp16(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && (op2&12)==8 && (op3&0x31)==0x11)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_57\n\t\tif((op0&13)==5 && !(op1&2) && op2==15 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asisdmiscfp16(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && !(op2&4) && (op3&0x21)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_49\n\t\tif((op0&13)==5 && !(op1&2) && !(op2&4) && (op3&0x21)==0x21)\n\t\t\treturn decode_iclass_asisdsame2(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && (op2&7)==4 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asisdmisc(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && (op2&7)==6 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asisdpair(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && (op2&4)==4 && (op3&0x103)==0x102)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_67\n\t\tif((op0&13)==5 && !(op1&2) && (op2&4)==4 && (op3&0x83)==0x82)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_68\n\t\tif((op0&13)==5 && !(op1&2) && (op2&4)==4 && !(op3&3))\n\t\t\treturn decode_iclass_asisddiff(ctx, dec);\n\t\tif((op0&13)==5 && !(op1&2) && (op2&4)==4 && op3&1)\n\t\t\treturn decode_iclass_asisdsame(ctx, dec);\n\t\tif((op0&13)==5 && op1==2 && op3&1)\n\t\t\treturn decode_iclass_asisdshf(ctx, dec);\n\t\tif((op0&13)==5 && op1==3 && op3&1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_70\n\t\tif((op0&13)==5 && (op1&2)==2 && !(op3&1))\n\t\t\treturn decode_iclass_asisdelem(ctx, dec);\n\t\tif(!(op0&11) && !(op1&2) && !(op2&4) && !(op3&0x23))\n\t\t\treturn decode_iclass_asimdtbl(ctx, dec);\n\t\tif(!(op0&11) && !(op1&2) && !(op2&4) && (op3&0x23)==2)\n\t\t\treturn decode_iclass_asimdperm(ctx, dec);\n\t\tif((op0&11)==2 && !(op1&2) && !(op2&4) && !(op3&0x21))\n\t\t\treturn decode_iclass_asimdext(ctx, dec);\n\t\tif(!(op0&9) && !op1 && !(op2&12) && (op3&0x21)==1)\n\t\t\treturn decode_iclass_asimdins(ctx, dec);\n\t\tif(!(op0&9) && op1==1 && !(op2&12) && (op3&0x21)==1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_19\n\t\tif(!(op0&9) && !(op1&2) && op2==7 && (op3&0x183)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_31\n\t\tif(!(op0&9) && !(op1&2) && (op2&12)==8 && (op3&0x31)==1)\n\t\t\treturn decode_iclass_asimdsamefp16(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && (op2&12)==8 && (op3&0x31)==0x11)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_21\n\t\tif(!(op0&9) && !(op1&2) && op2==15 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asimdmiscfp16(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && !(op2&4) && (op3&0x21)==0x20)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_13\n\t\tif(!(op0&9) && !(op1&2) && !(op2&4) && (op3&0x21)==0x21)\n\t\t\treturn decode_iclass_asimdsame2(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && (op2&7)==4 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asimdmisc(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && (op2&7)==6 && (op3&0x183)==2)\n\t\t\treturn decode_iclass_asimdall(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && (op2&4)==4 && (op3&0x103)==0x102)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_33\n\t\tif(!(op0&9) && !(op1&2) && (op2&4)==4 && (op3&0x83)==0x82)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_34\n\t\tif(!(op0&9) && !(op1&2) && (op2&4)==4 && !(op3&3))\n\t\t\treturn decode_iclass_asimddiff(ctx, dec);\n\t\tif(!(op0&9) && !(op1&2) && (op2&4)==4 && op3&1)\n\t\t\treturn decode_iclass_asimdsame(ctx, dec);\n\t\tif(!(op0&9) && op1==2 && !op2 && op3&1)\n\t\t\treturn decode_iclass_asimdimm(ctx, dec);\n\t\tif(!(op0&9) && op1==2 && op2 && op3&1)\n\t\t\treturn decode_iclass_asimdshf(ctx, dec);\n\t\tif(!(op0&9) && op1==3 && op3&1)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_36\n\t\tif(!(op0&9) && (op1&2)==2 && !(op3&1))\n\t\t\treturn decode_iclass_asimdelem(ctx, dec);\n\t\tif(op0==12 && !op1 && (op2&12)==8 && (op3&0x30)==0x20)\n\t\t\treturn decode_iclass_crypto3_imm2(ctx, dec);\n\t\tif(op0==12 && !op1 && (op2&12)==12 && (op3&0x2c)==0x20)\n\t\t\treturn decode_iclass_cryptosha512_3(ctx, dec);\n\t\tif(op0==12 && !op1 && !(op3&0x20))\n\t\t\treturn decode_iclass_crypto4(ctx, dec);\n\t\tif(op0==12 && op1==1 && !(op2&12))\n\t\t\treturn decode_iclass_crypto3_imm6(ctx, dec);\n\t\tif(op0==12 && op1==1 && op2==8 && (op3&0x1fc)==0x20)\n\t\t\treturn decode_iclass_cryptosha512_2(ctx, dec);\n\t\tif((op0&9)==8 && (op1&2)==2)\n\t\t\tUNALLOCATED(ENC_UNKNOWN); // iclass: UNALLOCATED_advsimd_11\n\t\tif((op0&5)==1 && !(op1&2) && !(op2&4))\n\t\t\treturn decode_iclass_float2fix(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && !(op3&0x3f))\n\t\t\treturn decode_iclass_float2int(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&0x1f)==0x10)\n\t\t\treturn decode_iclass_floatdp1(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&15)==8)\n\t\t\treturn decode_iclass_floatcmp(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&7)==4)\n\t\t\treturn decode_iclass_floatimm(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&3)==1)\n\t\t\treturn decode_iclass_floatccmp(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&3)==2)\n\t\t\treturn decode_iclass_floatdp2(ctx, dec);\n\t\tif((op0&5)==1 && !(op1&2) && (op2&4)==4 && (op3&3)==3)\n\t\t\treturn decode_iclass_floatsel(ctx, dec);\n\t\tif((op0&5)==1 && (op1&2)==2)\n\t\t\treturn decode_iclass_floatdp3(ctx, dec);\n\t\tUNMATCHED;\n\t}\n\tUNMATCHED;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode1.c",
    "content": "/* GENERATED FILE */\n#include <stddef.h>\n#include <stdbool.h>\n\n#include \"operations.h\"\n#include \"encodings_dec.h\"\n#include \"decode.h\"\n#include \"decode2.h\"\n#include \"pcode.h\"\n\nint decode_iclass_barriers(context *ctx, Instruction *dec)\n{\n\tuint32_t CRm=(INSWORD>>8)&15, op2=(INSWORD>>5)&7, Rt=INSWORD&0x1f;\n\tif(!CRm && op2==3 && Rt==0x1f && HasTME()) return TCOMMIT(ctx, dec); // -> TCOMMIT_only_barriers\n\tif((CRm&3)==2 && op2==1 && Rt==0x1f && HasXS()) return DSB(ctx, dec); // -> DSB_BOn_barriers\n\tif((CRm&3)==3 && op2==1 && Rt==0x1f) UNALLOCATED(ENC_UNALLOCATED_14_BARRIERS);\n\tif(!(CRm&2) && op2==1 && Rt==0x1f) UNALLOCATED(ENC_UNALLOCATED_12_BARRIERS);\n\tif(op2==1 && Rt!=0x1f) UNALLOCATED(ENC_UNALLOCATED_11_BARRIERS);\n\tif(op2==2 && Rt==0x1f) return CLREX(ctx, dec); // -> CLREX_BN_barriers\n\tif(op2==4 && Rt==0x1f) return DSB(ctx, dec); // -> DSB_BO_barriers\n\tif(op2==5 && Rt==0x1f) return DMB(ctx, dec); // -> DMB_BO_barriers\n\tif(op2==6 && Rt==0x1f) return ISB(ctx, dec); // -> ISB_BI_barriers\n\tif(op2==7 && Rt!=0x1f) UNALLOCATED(ENC_UNALLOCATED_25_BARRIERS);\n\tif(op2==7 && Rt==0x1f) return SB(ctx, dec); // -> SB_only_barriers\n\tif(CRm==1 && op2==3) UNALLOCATED(ENC_UNALLOCATED_17_BARRIERS);\n\tif((CRm&14)==2 && op2==3) UNALLOCATED(ENC_UNALLOCATED_18_BARRIERS);\n\tif((CRm&12)==4 && op2==3) UNALLOCATED(ENC_UNALLOCATED_19_BARRIERS);\n\tif((CRm&8)==8 && op2==3) UNALLOCATED(ENC_UNALLOCATED_20_BARRIERS);\n\tif(!op2) UNALLOCATED(ENC_UNALLOCATED_10_BARRIERS);\n\tUNMATCHED;\n}\n\nint decode_iclass_compbranch(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>24)&1;\n\tif(!sf && !op) return CBZ(ctx, dec); // -> CBZ_32_compbranch\n\tif(!sf && op) return CBNZ(ctx, dec); // -> CBNZ_32_compbranch\n\tif(sf && !op) return CBZ(ctx, dec); // -> CBZ_64_compbranch\n\tif(sf && op) return CBNZ(ctx, dec); // -> CBNZ_64_compbranch\n\tUNMATCHED;\n}\n\nint decode_iclass_condbranch(context *ctx, Instruction *dec)\n{\n\tuint32_t o1=(INSWORD>>24)&1, o0=(INSWORD>>4)&1;\n\tif(!o1 && !o0) return B_cond(ctx, dec); // -> B_only_condbranch\n\tif(!o1 && o0) UNALLOCATED(ENC_UNALLOCATED_11_CONDBRANCH);\n\tif(o1) UNALLOCATED(ENC_UNALLOCATED_12_CONDBRANCH);\n\tUNMATCHED;\n}\n\nint decode_iclass_exception(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>21)&7, op2=(INSWORD>>2)&7, LL=INSWORD&3;\n\tif(!opc && !op2 && !LL) UNALLOCATED(ENC_UNALLOCATED_10_EXCEPTION);\n\tif(!opc && !op2 && LL==1) return SVC(ctx, dec); // -> SVC_EX_exception\n\tif(!opc && !op2 && LL==2) return HVC(ctx, dec); // -> HVC_EX_exception\n\tif(!opc && !op2 && LL==3) return SMC(ctx, dec); // -> SMC_EX_exception\n\tif(opc==1 && !op2 && !LL) return BRK(ctx, dec); // -> BRK_EX_exception\n\tif(opc==2 && !op2 && !LL) return HLT(ctx, dec); // -> HLT_EX_exception\n\tif(opc==3 && !op2 && !LL && HasTME()) return TCANCEL(ctx, dec); // -> TCANCEL_EX_exception\n\tif(opc==3 && !op2 && LL==1) UNALLOCATED(ENC_UNALLOCATED_21_EXCEPTION);\n\tif(opc==5 && !op2 && !LL) UNALLOCATED(ENC_UNALLOCATED_24_EXCEPTION);\n\tif(opc==5 && !op2 && LL==1) return DCPS1(ctx, dec); // -> DCPS1_DC_exception\n\tif(opc==5 && !op2 && LL==2) return DCPS2(ctx, dec); // -> DCPS2_DC_exception\n\tif(opc==5 && !op2 && LL==3) return DCPS3(ctx, dec); // -> DCPS3_DC_exception\n\tif(opc==1 && !op2 && LL&1) UNALLOCATED(ENC_UNALLOCATED_15_EXCEPTION);\n\tif(opc==1 && !op2 && (LL&2)==2) UNALLOCATED(ENC_UNALLOCATED_16_EXCEPTION);\n\tif(opc==2 && !op2 && LL&1) UNALLOCATED(ENC_UNALLOCATED_18_EXCEPTION);\n\tif(opc==2 && !op2 && (LL&2)==2) UNALLOCATED(ENC_UNALLOCATED_19_EXCEPTION);\n\tif(opc==3 && !op2 && (LL&2)==2) UNALLOCATED(ENC_UNALLOCATED_22_EXCEPTION);\n\tif(opc==4 && !op2) UNALLOCATED(ENC_UNALLOCATED_23_EXCEPTION);\n\tif(opc==6 && !op2) UNALLOCATED(ENC_UNALLOCATED_28_EXCEPTION);\n\tif(opc==7 && !op2) UNALLOCATED(ENC_UNALLOCATED_29_EXCEPTION);\n\tif(op2==1) UNALLOCATED(ENC_UNALLOCATED_30_EXCEPTION);\n\tif((op2&6)==2) UNALLOCATED(ENC_UNALLOCATED_31_EXCEPTION);\n\tif((op2&4)==4) UNALLOCATED(ENC_UNALLOCATED_32_EXCEPTION);\n\tUNMATCHED;\n}\n\nint decode_iclass_hints(context *ctx, Instruction *dec)\n{\n\tuint32_t CRm=(INSWORD>>8)&15, op2=(INSWORD>>5)&7;\n\tif(!CRm && !op2) return NOP(ctx, dec); // -> NOP_HI_hints\n\tif(!CRm && op2==1) return YIELD(ctx, dec); // -> YIELD_HI_hints\n\tif(!CRm && op2==2) return WFE(ctx, dec); // -> WFE_HI_hints\n\tif(!CRm && op2==3) return WFI(ctx, dec); // -> WFI_HI_hints\n\tif(!CRm && op2==4) return SEV(ctx, dec); // -> SEV_HI_hints\n\tif(!CRm && op2==5) return SEVL(ctx, dec); // -> SEVL_HI_hints\n\tif(!CRm && op2==6 && HasDGH()) return DGH(ctx, dec); // -> DGH_HI_hints\n\tif(!CRm && op2==7 && HasPAuth()) return XPAC(ctx, dec); // -> XPACLRI_HI_hints\n\tif(CRm==1 && !op2 && HasPAuth()) return PACIA(ctx, dec); // -> PACIA1716_HI_hints\n\tif(CRm==1 && op2==2 && HasPAuth()) return PACIB(ctx, dec); // -> PACIB1716_HI_hints\n\tif(CRm==1 && op2==4 && HasPAuth()) return AUTIA(ctx, dec); // -> AUTIA1716_HI_hints\n\tif(CRm==1 && op2==6 && HasPAuth()) return AUTIB(ctx, dec); // -> AUTIB1716_HI_hints\n\tif(CRm==2 && !op2 && HasRAS()) return ESB(ctx, dec); // -> ESB_HI_hints\n\tif(CRm==2 && op2==1 && HasSPE()) return PSB(ctx, dec); // -> PSB_HC_hints\n\tif(CRm==2 && op2==2 && HasTRF()) return TSB(ctx, dec); // -> TSB_HC_hints\n\tif(CRm==2 && op2==4) return CSDB(ctx, dec); // -> CSDB_HI_hints\n\tif(CRm==3 && !op2 && HasPAuth()) return PACIA(ctx, dec); // -> PACIAZ_HI_hints\n\tif(CRm==3 && op2==1 && HasPAuth()) return PACIA(ctx, dec); // -> PACIASP_HI_hints\n\tif(CRm==3 && op2==2 && HasPAuth()) return PACIB(ctx, dec); // -> PACIBZ_HI_hints\n\tif(CRm==3 && op2==3 && HasPAuth()) return PACIB(ctx, dec); // -> PACIBSP_HI_hints\n\tif(CRm==3 && op2==4 && HasPAuth()) return AUTIA(ctx, dec); // -> AUTIAZ_HI_hints\n\tif(CRm==3 && op2==5 && HasPAuth()) return AUTIA(ctx, dec); // -> AUTIASP_HI_hints\n\tif(CRm==3 && op2==6 && HasPAuth()) return AUTIB(ctx, dec); // -> AUTIBZ_HI_hints\n\tif(CRm==3 && op2==7 && HasPAuth()) return AUTIB(ctx, dec); // -> AUTIBSP_HI_hints\n\tif(CRm==4 && !(op2&1) && HasBTI()) return BTI(ctx, dec); // -> BTI_HB_hints\n\tif(1) return HINT(ctx, dec); // -> HINT_HM_hints\n\tUNMATCHED;\n}\n\nint decode_iclass_pstate(context *ctx, Instruction *dec)\n{\n\tuint32_t op1=(INSWORD>>16)&7, op2=(INSWORD>>5)&7, Rt=INSWORD&0x1f;\n\tif(!op1 && !op2 && Rt==0x1f && HasFlagM()) return CFINV(ctx, dec); // -> CFINV_M_pstate\n\tif(!op1 && op2==1 && Rt==0x1f && HasFlagM2()) return XAFLAG(ctx, dec); // -> XAFLAG_M_pstate\n\tif(!op1 && op2==2 && Rt==0x1f && HasFlagM2()) return AXFLAG(ctx, dec); // -> AXFLAG_M_pstate\n\tif(Rt!=0x1f) UNALLOCATED(ENC_UNALLOCATED_10_PSTATE);\n\tif(Rt==0x1f) return MSR_imm(ctx, dec); // -> MSR_SI_pstate\n\tUNMATCHED;\n}\n\nint decode_iclass_systeminstrs(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>21)&1;\n\tif(!L) return SYS(ctx, dec); // -> SYS_CR_systeminstrs\n\tif(L) return SYSL(ctx, dec); // -> SYSL_RC_systeminstrs\n\tUNMATCHED;\n}\n\nint decode_iclass_systeminstrswithreg(context *ctx, Instruction *dec)\n{\n\tuint32_t CRm=(INSWORD>>8)&15, op2=(INSWORD>>5)&7;\n\tif(!CRm && !op2 && HasWFxT()) return WFET(ctx, dec); // -> WFET_only_systeminstrswithreg\n\tif(!CRm && op2==1 && HasWFxT()) return WFIT(ctx, dec); // -> WFIT_only_systeminstrswithreg\n\tif(!CRm && (op2&6)==2) UNALLOCATED(ENC_UNALLOCATED_12_SYSTEMINSTRSWITHREG);\n\tif(!CRm && (op2&4)==4) UNALLOCATED(ENC_UNALLOCATED_13_SYSTEMINSTRSWITHREG);\n\tif(CRm) UNALLOCATED(ENC_UNALLOCATED_14_SYSTEMINSTRSWITHREG);\n\tUNMATCHED;\n}\n\nint decode_iclass_systemmove(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>21)&1;\n\tif(!L) return MSR_reg(ctx, dec); // -> MSR_SR_systemmove\n\tif(L) return MRS(ctx, dec); // -> MRS_RS_systemmove\n\tUNMATCHED;\n}\n\nint decode_iclass_systemresult(context *ctx, Instruction *dec)\n{\n\tuint32_t op1=(INSWORD>>16)&7, CRn=(INSWORD>>12)&15, CRm=(INSWORD>>8)&15, op2=(INSWORD>>5)&7;\n\tif(op1==3 && CRn==3 && !CRm && op2==3 && HasTME()) return TSTART(ctx, dec); // -> TSTART_BR_systemresult\n\tif(op1==3 && CRn==3 && CRm==1 && op2==3 && HasTME()) return TTEST(ctx, dec); // -> TTEST_BR_systemresult\n\tif(op1==3 && CRn==3 && CRm&14 && op2==3) UNALLOCATED(ENC_UNALLOCATED_13_SYSTEMRESULT);\n\tif(op1==3 && CRn==3 && op2!=3) UNALLOCATED(ENC_UNALLOCATED_12_SYSTEMRESULT);\n\tif(op1==3 && CRn!=3) UNALLOCATED(ENC_UNALLOCATED_11_SYSTEMRESULT);\n\tif(op1!=3) UNALLOCATED(ENC_UNALLOCATED_10_SYSTEMRESULT);\n\tUNMATCHED;\n}\n\nint decode_iclass_testbranch(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>24)&1;\n\tif(!op) return TBZ(ctx, dec); // -> TBZ_only_testbranch\n\tif(op) return TBNZ(ctx, dec); // -> TBNZ_only_testbranch\n\tUNMATCHED;\n}\n\nint decode_iclass_branch_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t op=INSWORD>>31;\n\tif(!op) return B_uncond(ctx, dec); // -> B_only_branch_imm\n\tif(op) return BL(ctx, dec); // -> BL_only_branch_imm\n\tUNMATCHED;\n}\n\nint decode_iclass_branch_reg(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>21)&15, op2=(INSWORD>>16)&0x1f, op3=(INSWORD>>10)&0x3f, Rn=(INSWORD>>5)&0x1f, op4=INSWORD&0x1f;\n\tif(opc==2 && op2==0x1f && op3==2 && Rn!=0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_37_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && op3==2 && Rn==0x1f && op4==0x1f && HasPAuth()) return RETA(ctx, dec); // -> RETAA_64E_branch_reg\n\tif(opc==2 && op2==0x1f && op3==3 && Rn!=0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_39_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && op3==3 && Rn==0x1f && op4==0x1f && HasPAuth()) return RETA(ctx, dec); // -> RETAB_64E_branch_reg\n\tif(opc==4 && op2==0x1f && !op3 && Rn!=0x1f && op4) UNALLOCATED(ENC_UNALLOCATED_48_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && !op3 && Rn!=0x1f && !op4) UNALLOCATED(ENC_UNALLOCATED_46_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && !op3 && Rn==0x1f && op4) UNALLOCATED(ENC_UNALLOCATED_47_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && !op3 && Rn==0x1f && !op4) return ERET(ctx, dec); // -> ERET_64E_branch_reg\n\tif(opc==4 && op2==0x1f && op3==2 && Rn!=0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_53_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==2 && Rn!=0x1f && op4==0x1f) UNALLOCATED(ENC_UNALLOCATED_52_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==2 && Rn==0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_51_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==2 && Rn==0x1f && op4==0x1f && HasPAuth()) return ERETA(ctx, dec); // -> ERETAA_64E_branch_reg\n\tif(opc==4 && op2==0x1f && op3==3 && Rn!=0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_57_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==3 && Rn!=0x1f && op4==0x1f) UNALLOCATED(ENC_UNALLOCATED_56_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==3 && Rn==0x1f && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_55_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==3 && Rn==0x1f && op4==0x1f && HasPAuth()) return ERETA(ctx, dec); // -> ERETAB_64E_branch_reg\n\tif(opc==5 && op2==0x1f && !op3 && Rn!=0x1f && op4) UNALLOCATED(ENC_UNALLOCATED_65_BRANCH_REG);\n\tif(opc==5 && op2==0x1f && !op3 && Rn!=0x1f && !op4) UNALLOCATED(ENC_UNALLOCATED_63_BRANCH_REG);\n\tif(opc==5 && op2==0x1f && !op3 && Rn==0x1f && op4) UNALLOCATED(ENC_UNALLOCATED_64_BRANCH_REG);\n\tif(opc==5 && op2==0x1f && !op3 && Rn==0x1f && !op4) return DRPS(ctx, dec); // -> DRPS_64E_branch_reg\n\tif(!opc && op2==0x1f && !op3 && op4) UNALLOCATED(ENC_UNALLOCATED_12_BRANCH_REG);\n\tif(!opc && op2==0x1f && !op3 && !op4) return BR(ctx, dec); // -> BR_64_branch_reg\n\tif(!opc && op2==0x1f && op3==2 && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_15_BRANCH_REG);\n\tif(!opc && op2==0x1f && op3==2 && op4==0x1f && HasPAuth()) return BRA(ctx, dec); // -> BRAAZ_64_branch_reg\n\tif(!opc && op2==0x1f && op3==3 && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_17_BRANCH_REG);\n\tif(!opc && op2==0x1f && op3==3 && op4==0x1f && HasPAuth()) return BRA(ctx, dec); // -> BRABZ_64_branch_reg\n\tif(opc==1 && op2==0x1f && !op3 && op4) UNALLOCATED(ENC_UNALLOCATED_23_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && !op3 && !op4) return BLR(ctx, dec); // -> BLR_64_branch_reg\n\tif(opc==1 && op2==0x1f && op3==2 && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_26_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && op3==2 && op4==0x1f && HasPAuth()) return BLRA(ctx, dec); // -> BLRAAZ_64_branch_reg\n\tif(opc==1 && op2==0x1f && op3==3 && op4!=0x1f) UNALLOCATED(ENC_UNALLOCATED_28_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && op3==3 && op4==0x1f && HasPAuth()) return BLRA(ctx, dec); // -> BLRABZ_64_branch_reg\n\tif(opc==2 && op2==0x1f && !op3 && op4) UNALLOCATED(ENC_UNALLOCATED_34_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && !op3 && !op4) return RET(ctx, dec); // -> RET_64R_branch_reg\n\tif(!opc && op2==0x1f && op3==1) UNALLOCATED(ENC_UNALLOCATED_13_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && op3==1) UNALLOCATED(ENC_UNALLOCATED_24_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && op3==1) UNALLOCATED(ENC_UNALLOCATED_35_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && op3==1) UNALLOCATED(ENC_UNALLOCATED_49_BRANCH_REG);\n\tif(opc==5 && op2==0x1f && op3) UNALLOCATED(ENC_UNALLOCATED_66_BRANCH_REG);\n\tif(opc==8 && op2==0x1f && op3==2 && HasPAuth()) return BRA(ctx, dec); // -> BRAA_64P_branch_reg\n\tif(opc==8 && op2==0x1f && op3==3 && HasPAuth()) return BRA(ctx, dec); // -> BRAB_64P_branch_reg\n\tif(opc==9 && op2==0x1f && op3==2 && HasPAuth()) return BLRA(ctx, dec); // -> BLRAA_64P_branch_reg\n\tif(opc==9 && op2==0x1f && op3==3 && HasPAuth()) return BLRA(ctx, dec); // -> BLRAB_64P_branch_reg\n\tif(opc==8 && op2==0x1f && !(op3&0x3e)) UNALLOCATED(ENC_UNALLOCATED_68_BRANCH_REG);\n\tif(opc==9 && op2==0x1f && !(op3&0x3e)) UNALLOCATED(ENC_UNALLOCATED_75_BRANCH_REG);\n\tif(!opc && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_18_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_29_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_40_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_58_BRANCH_REG);\n\tif(opc==8 && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_71_BRANCH_REG);\n\tif(opc==9 && op2==0x1f && (op3&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_78_BRANCH_REG);\n\tif(!opc && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_19_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_30_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_41_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_59_BRANCH_REG);\n\tif(opc==8 && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_72_BRANCH_REG);\n\tif(opc==9 && op2==0x1f && (op3&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_79_BRANCH_REG);\n\tif(!opc && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_20_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_31_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_42_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_60_BRANCH_REG);\n\tif(opc==8 && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_73_BRANCH_REG);\n\tif(opc==9 && op2==0x1f && (op3&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_80_BRANCH_REG);\n\tif(!opc && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_21_BRANCH_REG);\n\tif(opc==1 && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_32_BRANCH_REG);\n\tif(opc==2 && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_43_BRANCH_REG);\n\tif(opc==4 && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_61_BRANCH_REG);\n\tif(opc==8 && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_74_BRANCH_REG);\n\tif(opc==9 && op2==0x1f && (op3&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_81_BRANCH_REG);\n\tif(opc==3 && op2==0x1f) UNALLOCATED(ENC_UNALLOCATED_44_BRANCH_REG);\n\tif((opc&14)==6 && op2==0x1f) UNALLOCATED(ENC_UNALLOCATED_67_BRANCH_REG);\n\tif((opc&14)==10 && op2==0x1f) UNALLOCATED(ENC_UNALLOCATED_82_BRANCH_REG);\n\tif((opc&12)==12 && op2==0x1f) UNALLOCATED(ENC_UNALLOCATED_83_BRANCH_REG);\n\tif(op2!=0x1f) UNALLOCATED(ENC_UNALLOCATED_10_BRANCH_REG);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdlse(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>22)&1, opcode=(INSWORD>>12)&15;\n\tif(!L && !opcode) return ST4_advsimd_mult(ctx, dec); // -> ST4_asisdlse_R4\n\tif(!L && opcode==1) UNALLOCATED(ENC_UNALLOCATED_12_ASISDLSE);\n\tif(!L && opcode==2) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlse_R4_4v\n\tif(!L && opcode==3) UNALLOCATED(ENC_UNALLOCATED_14_ASISDLSE);\n\tif(!L && opcode==4) return ST3_advsimd_mult(ctx, dec); // -> ST3_asisdlse_R3\n\tif(!L && opcode==5) UNALLOCATED(ENC_UNALLOCATED_16_ASISDLSE);\n\tif(!L && opcode==6) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlse_R3_3v\n\tif(!L && opcode==7) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlse_R1_1v\n\tif(!L && opcode==8) return ST2_advsimd_mult(ctx, dec); // -> ST2_asisdlse_R2\n\tif(!L && opcode==9) UNALLOCATED(ENC_UNALLOCATED_20_ASISDLSE);\n\tif(!L && opcode==10) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlse_R2_2v\n\tif(!L && opcode==11) UNALLOCATED(ENC_UNALLOCATED_22_ASISDLSE);\n\tif(L && !opcode) return LD4_advsimd_mult(ctx, dec); // -> LD4_asisdlse_R4\n\tif(L && opcode==1) UNALLOCATED(ENC_UNALLOCATED_25_ASISDLSE);\n\tif(L && opcode==2) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlse_R4_4v\n\tif(L && opcode==3) UNALLOCATED(ENC_UNALLOCATED_27_ASISDLSE);\n\tif(L && opcode==4) return LD3_advsimd_mult(ctx, dec); // -> LD3_asisdlse_R3\n\tif(L && opcode==5) UNALLOCATED(ENC_UNALLOCATED_29_ASISDLSE);\n\tif(L && opcode==6) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlse_R3_3v\n\tif(L && opcode==7) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlse_R1_1v\n\tif(L && opcode==8) return LD2_advsimd_mult(ctx, dec); // -> LD2_asisdlse_R2\n\tif(L && opcode==9) UNALLOCATED(ENC_UNALLOCATED_33_ASISDLSE);\n\tif(L && opcode==10) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlse_R2_2v\n\tif(L && opcode==11) UNALLOCATED(ENC_UNALLOCATED_35_ASISDLSE);\n\tif(!L && (opcode&12)==12) UNALLOCATED(ENC_UNALLOCATED_23_ASISDLSE);\n\tif(L && (opcode&12)==12) UNALLOCATED(ENC_UNALLOCATED_36_ASISDLSE);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdlsep(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>22)&1, Rm=(INSWORD>>16)&0x1f, opcode=(INSWORD>>12)&15;\n\tif(!L && Rm!=0x1f && !opcode) return ST4_advsimd_mult(ctx, dec); // -> ST4_asisdlsep_R4_r\n\tif(!L && Rm!=0x1f && opcode==2) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_R4_r4\n\tif(!L && Rm!=0x1f && opcode==4) return ST3_advsimd_mult(ctx, dec); // -> ST3_asisdlsep_R3_r\n\tif(!L && Rm!=0x1f && opcode==6) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_R3_r3\n\tif(!L && Rm!=0x1f && opcode==7) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_R1_r1\n\tif(!L && Rm!=0x1f && opcode==8) return ST2_advsimd_mult(ctx, dec); // -> ST2_asisdlsep_R2_r\n\tif(!L && Rm!=0x1f && opcode==10) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_R2_r2\n\tif(!L && Rm==0x1f && !opcode) return ST4_advsimd_mult(ctx, dec); // -> ST4_asisdlsep_I4_i\n\tif(!L && Rm==0x1f && opcode==2) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_I4_i4\n\tif(!L && Rm==0x1f && opcode==4) return ST3_advsimd_mult(ctx, dec); // -> ST3_asisdlsep_I3_i\n\tif(!L && Rm==0x1f && opcode==6) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_I3_i3\n\tif(!L && Rm==0x1f && opcode==7) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_I1_i1\n\tif(!L && Rm==0x1f && opcode==8) return ST2_advsimd_mult(ctx, dec); // -> ST2_asisdlsep_I2_i\n\tif(!L && Rm==0x1f && opcode==10) return ST1_advsimd_mult(ctx, dec); // -> ST1_asisdlsep_I2_i2\n\tif(L && Rm!=0x1f && !opcode) return LD4_advsimd_mult(ctx, dec); // -> LD4_asisdlsep_R4_r\n\tif(L && Rm!=0x1f && opcode==2) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_R4_r4\n\tif(L && Rm!=0x1f && opcode==4) return LD3_advsimd_mult(ctx, dec); // -> LD3_asisdlsep_R3_r\n\tif(L && Rm!=0x1f && opcode==6) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_R3_r3\n\tif(L && Rm!=0x1f && opcode==7) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_R1_r1\n\tif(L && Rm!=0x1f && opcode==8) return LD2_advsimd_mult(ctx, dec); // -> LD2_asisdlsep_R2_r\n\tif(L && Rm!=0x1f && opcode==10) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_R2_r2\n\tif(L && Rm==0x1f && !opcode) return LD4_advsimd_mult(ctx, dec); // -> LD4_asisdlsep_I4_i\n\tif(L && Rm==0x1f && opcode==2) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_I4_i4\n\tif(L && Rm==0x1f && opcode==4) return LD3_advsimd_mult(ctx, dec); // -> LD3_asisdlsep_I3_i\n\tif(L && Rm==0x1f && opcode==6) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_I3_i3\n\tif(L && Rm==0x1f && opcode==7) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_I1_i1\n\tif(L && Rm==0x1f && opcode==8) return LD2_advsimd_mult(ctx, dec); // -> LD2_asisdlsep_I2_i\n\tif(L && Rm==0x1f && opcode==10) return LD1_advsimd_mult(ctx, dec); // -> LD1_asisdlsep_I2_i2\n\tif(!L && opcode==1) UNALLOCATED(ENC_UNALLOCATED_13_ASISDLSEP);\n\tif(!L && opcode==3) UNALLOCATED(ENC_UNALLOCATED_16_ASISDLSEP);\n\tif(!L && opcode==5) UNALLOCATED(ENC_UNALLOCATED_19_ASISDLSEP);\n\tif(!L && opcode==9) UNALLOCATED(ENC_UNALLOCATED_26_ASISDLSEP);\n\tif(!L && opcode==11) UNALLOCATED(ENC_UNALLOCATED_29_ASISDLSEP);\n\tif(L && opcode==1) UNALLOCATED(ENC_UNALLOCATED_33_ASISDLSEP);\n\tif(L && opcode==3) UNALLOCATED(ENC_UNALLOCATED_36_ASISDLSEP);\n\tif(L && opcode==5) UNALLOCATED(ENC_UNALLOCATED_39_ASISDLSEP);\n\tif(L && opcode==9) UNALLOCATED(ENC_UNALLOCATED_46_ASISDLSEP);\n\tif(L && opcode==11) UNALLOCATED(ENC_UNALLOCATED_49_ASISDLSEP);\n\tif(!L && (opcode&12)==12) UNALLOCATED(ENC_UNALLOCATED_30_ASISDLSEP);\n\tif(L && (opcode&12)==12) UNALLOCATED(ENC_UNALLOCATED_50_ASISDLSEP);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdlso(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>22)&1, R=(INSWORD>>21)&1, opcode=(INSWORD>>13)&7, S=(INSWORD>>12)&1, size=(INSWORD>>10)&3;\n\tif(!L && !R && opcode==4 && !S && size==1) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlso_D1_1d\n\tif(!L && !R && opcode==4 && S && size==1) UNALLOCATED(ENC_UNALLOCATED_18_ASISDLSO);\n\tif(!L && !R && opcode==5 && !S && size==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlso_D3_3d\n\tif(!L && !R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_33_ASISDLSO);\n\tif(!L && R && opcode==4 && !S && size==1) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlso_D2_2d\n\tif(!L && R && opcode==4 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_25_ASISDLSO);\n\tif(!L && R && opcode==5 && !S && size==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlso_D4_4d\n\tif(!L && R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_41_ASISDLSO);\n\tif(L && !R && opcode==4 && !S && size==1) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlso_D1_1d\n\tif(L && !R && opcode==4 && S && size==1) UNALLOCATED(ENC_UNALLOCATED_48_ASISDLSO);\n\tif(L && !R && opcode==5 && !S && size==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlso_D3_3d\n\tif(L && !R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_68_ASISDLSO);\n\tif(L && R && opcode==4 && !S && size==1) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlso_D2_2d\n\tif(L && R && opcode==4 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_58_ASISDLSO);\n\tif(L && R && opcode==5 && !S && size==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlso_D4_4d\n\tif(L && R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_78_ASISDLSO);\n\tif(!L && !R && opcode==4 && !size) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlso_S1_1s\n\tif(!L && !R && opcode==5 && !size) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlso_S3_3s\n\tif(!L && !R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_31_ASISDLSO);\n\tif(!L && !R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_34_ASISDLSO);\n\tif(!L && R && opcode==4 && !size) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlso_S2_2s\n\tif(!L && R && opcode==4 && size==2) UNALLOCATED(ENC_UNALLOCATED_23_ASISDLSO);\n\tif(!L && R && opcode==4 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_26_ASISDLSO);\n\tif(!L && R && opcode==5 && !size) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlso_S4_4s\n\tif(!L && R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_39_ASISDLSO);\n\tif(!L && R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_42_ASISDLSO);\n\tif(L && !R && opcode==4 && !size) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlso_S1_1s\n\tif(L && !R && opcode==5 && !size) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlso_S3_3s\n\tif(L && !R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_66_ASISDLSO);\n\tif(L && !R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_69_ASISDLSO);\n\tif(L && R && opcode==4 && !size) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlso_S2_2s\n\tif(L && R && opcode==4 && size==2) UNALLOCATED(ENC_UNALLOCATED_56_ASISDLSO);\n\tif(L && R && opcode==4 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_59_ASISDLSO);\n\tif(L && R && opcode==5 && !size) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlso_S4_4s\n\tif(L && R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_76_ASISDLSO);\n\tif(L && R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_79_ASISDLSO);\n\tif(!L && !R && opcode==2 && !(size&1)) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlso_H1_1h\n\tif(!L && !R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_14_ASISDLSO);\n\tif(!L && !R && opcode==3 && !(size&1)) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlso_H3_3h\n\tif(!L && !R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_29_ASISDLSO);\n\tif(!L && !R && opcode==4 && (size&2)==2) UNALLOCATED(ENC_UNALLOCATED_16_ASISDLSO);\n\tif(!L && R && opcode==2 && !(size&1)) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlso_H2_2h\n\tif(!L && R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_21_ASISDLSO);\n\tif(!L && R && opcode==3 && !(size&1)) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlso_H4_4h\n\tif(!L && R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_37_ASISDLSO);\n\tif(L && !R && opcode==2 && !(size&1)) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlso_H1_1h\n\tif(L && !R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_45_ASISDLSO);\n\tif(L && !R && opcode==3 && !(size&1)) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlso_H3_3h\n\tif(L && !R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_64_ASISDLSO);\n\tif(L && !R && opcode==4 && (size&2)==2) UNALLOCATED(ENC_UNALLOCATED_49_ASISDLSO);\n\tif(L && !R && opcode==6 && !S) return LD1R_advsimd(ctx, dec); // -> LD1R_asisdlso_R1\n\tif(L && !R && opcode==6 && S) UNALLOCATED(ENC_UNALLOCATED_51_ASISDLSO);\n\tif(L && !R && opcode==7 && !S) return LD3R_advsimd(ctx, dec); // -> LD3R_asisdlso_R3\n\tif(L && !R && opcode==7 && S) UNALLOCATED(ENC_UNALLOCATED_71_ASISDLSO);\n\tif(L && R && opcode==2 && !(size&1)) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlso_H2_2h\n\tif(L && R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_54_ASISDLSO);\n\tif(L && R && opcode==3 && !(size&1)) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlso_H4_4h\n\tif(L && R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_74_ASISDLSO);\n\tif(L && R && opcode==6 && !S) return LD2R_advsimd(ctx, dec); // -> LD2R_asisdlso_R2\n\tif(L && R && opcode==6 && S) UNALLOCATED(ENC_UNALLOCATED_61_ASISDLSO);\n\tif(L && R && opcode==7 && !S) return LD4R_advsimd(ctx, dec); // -> LD4R_asisdlso_R4\n\tif(L && R && opcode==7 && S) UNALLOCATED(ENC_UNALLOCATED_81_ASISDLSO);\n\tif(!L && !R && !opcode) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlso_B1_1b\n\tif(!L && !R && opcode==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlso_B3_3b\n\tif(!L && R && !opcode) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlso_B2_2b\n\tif(!L && R && opcode==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlso_B4_4b\n\tif(L && !R && !opcode) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlso_B1_1b\n\tif(L && !R && opcode==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlso_B3_3b\n\tif(L && R && !opcode) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlso_B2_2b\n\tif(L && R && opcode==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlso_B4_4b\n\tif(!L && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_11_ASISDLSO);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdlsop(context *ctx, Instruction *dec)\n{\n\tuint32_t L=(INSWORD>>22)&1, R=(INSWORD>>21)&1, Rm=(INSWORD>>16)&0x1f, opcode=(INSWORD>>13)&7, S=(INSWORD>>12)&1, size=(INSWORD>>10)&3;\n\tif(!L && !R && Rm!=0x1f && opcode==4 && !S && size==1) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_DX1_r1d\n\tif(!L && !R && Rm!=0x1f && opcode==5 && !S && size==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_DX3_r3d\n\tif(!L && !R && Rm==0x1f && opcode==4 && !S && size==1) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_D1_i1d\n\tif(!L && !R && Rm==0x1f && opcode==5 && !S && size==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_D3_i3d\n\tif(!L && R && Rm!=0x1f && opcode==4 && !S && size==1) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_DX2_r2d\n\tif(!L && R && Rm!=0x1f && opcode==5 && !S && size==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_DX4_r4d\n\tif(!L && R && Rm==0x1f && opcode==4 && !S && size==1) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_D2_i2d\n\tif(!L && R && Rm==0x1f && opcode==5 && !S && size==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_D4_i4d\n\tif(L && !R && Rm!=0x1f && opcode==4 && !S && size==1) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_DX1_r1d\n\tif(L && !R && Rm!=0x1f && opcode==5 && !S && size==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_DX3_r3d\n\tif(L && !R && Rm==0x1f && opcode==4 && !S && size==1) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_D1_i1d\n\tif(L && !R && Rm==0x1f && opcode==5 && !S && size==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_D3_i3d\n\tif(L && R && Rm!=0x1f && opcode==4 && !S && size==1) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_DX2_r2d\n\tif(L && R && Rm!=0x1f && opcode==5 && !S && size==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_DX4_r4d\n\tif(L && R && Rm==0x1f && opcode==4 && !S && size==1) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_D2_i2d\n\tif(L && R && Rm==0x1f && opcode==5 && !S && size==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_D4_i4d\n\tif(!L && !R && Rm!=0x1f && opcode==4 && !size) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_SX1_r1s\n\tif(!L && !R && Rm!=0x1f && opcode==5 && !size) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_SX3_r3s\n\tif(!L && !R && Rm==0x1f && opcode==4 && !size) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_S1_i1s\n\tif(!L && !R && Rm==0x1f && opcode==5 && !size) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_S3_i3s\n\tif(!L && R && Rm!=0x1f && opcode==4 && !size) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_SX2_r2s\n\tif(!L && R && Rm!=0x1f && opcode==5 && !size) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_SX4_r4s\n\tif(!L && R && Rm==0x1f && opcode==4 && !size) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_S2_i2s\n\tif(!L && R && Rm==0x1f && opcode==5 && !size) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_S4_i4s\n\tif(L && !R && Rm!=0x1f && opcode==4 && !size) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_SX1_r1s\n\tif(L && !R && Rm!=0x1f && opcode==5 && !size) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_SX3_r3s\n\tif(L && !R && Rm==0x1f && opcode==4 && !size) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_S1_i1s\n\tif(L && !R && Rm==0x1f && opcode==5 && !size) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_S3_i3s\n\tif(L && R && Rm!=0x1f && opcode==4 && !size) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_SX2_r2s\n\tif(L && R && Rm!=0x1f && opcode==5 && !size) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_SX4_r4s\n\tif(L && R && Rm==0x1f && opcode==4 && !size) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_S2_i2s\n\tif(L && R && Rm==0x1f && opcode==5 && !size) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_S4_i4s\n\tif(!L && !R && Rm!=0x1f && opcode==2 && !(size&1)) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_HX1_r1h\n\tif(!L && !R && Rm!=0x1f && opcode==3 && !(size&1)) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_HX3_r3h\n\tif(!L && !R && Rm==0x1f && opcode==2 && !(size&1)) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_H1_i1h\n\tif(!L && !R && Rm==0x1f && opcode==3 && !(size&1)) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_H3_i3h\n\tif(!L && R && Rm!=0x1f && opcode==2 && !(size&1)) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_HX2_r2h\n\tif(!L && R && Rm!=0x1f && opcode==3 && !(size&1)) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_HX4_r4h\n\tif(!L && R && Rm==0x1f && opcode==2 && !(size&1)) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_H2_i2h\n\tif(!L && R && Rm==0x1f && opcode==3 && !(size&1)) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_H4_i4h\n\tif(L && !R && Rm!=0x1f && opcode==2 && !(size&1)) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_HX1_r1h\n\tif(L && !R && Rm!=0x1f && opcode==3 && !(size&1)) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_HX3_r3h\n\tif(L && !R && Rm!=0x1f && opcode==6 && !S) return LD1R_advsimd(ctx, dec); // -> LD1R_asisdlsop_RX1_r\n\tif(L && !R && Rm!=0x1f && opcode==7 && !S) return LD3R_advsimd(ctx, dec); // -> LD3R_asisdlsop_RX3_r\n\tif(L && !R && Rm==0x1f && opcode==2 && !(size&1)) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_H1_i1h\n\tif(L && !R && Rm==0x1f && opcode==3 && !(size&1)) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_H3_i3h\n\tif(L && !R && Rm==0x1f && opcode==6 && !S) return LD1R_advsimd(ctx, dec); // -> LD1R_asisdlsop_R1_i\n\tif(L && !R && Rm==0x1f && opcode==7 && !S) return LD3R_advsimd(ctx, dec); // -> LD3R_asisdlsop_R3_i\n\tif(L && R && Rm!=0x1f && opcode==2 && !(size&1)) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_HX2_r2h\n\tif(L && R && Rm!=0x1f && opcode==3 && !(size&1)) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_HX4_r4h\n\tif(L && R && Rm!=0x1f && opcode==6 && !S) return LD2R_advsimd(ctx, dec); // -> LD2R_asisdlsop_RX2_r\n\tif(L && R && Rm!=0x1f && opcode==7 && !S) return LD4R_advsimd(ctx, dec); // -> LD4R_asisdlsop_RX4_r\n\tif(L && R && Rm==0x1f && opcode==2 && !(size&1)) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_H2_i2h\n\tif(L && R && Rm==0x1f && opcode==3 && !(size&1)) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_H4_i4h\n\tif(L && R && Rm==0x1f && opcode==6 && !S) return LD2R_advsimd(ctx, dec); // -> LD2R_asisdlsop_R2_i\n\tif(L && R && Rm==0x1f && opcode==7 && !S) return LD4R_advsimd(ctx, dec); // -> LD4R_asisdlsop_R4_i\n\tif(!L && !R && Rm!=0x1f && !opcode) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_BX1_r1b\n\tif(!L && !R && Rm!=0x1f && opcode==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_BX3_r3b\n\tif(!L && !R && Rm==0x1f && !opcode) return ST1_advsimd_sngl(ctx, dec); // -> ST1_asisdlsop_B1_i1b\n\tif(!L && !R && Rm==0x1f && opcode==1) return ST3_advsimd_sngl(ctx, dec); // -> ST3_asisdlsop_B3_i3b\n\tif(!L && R && Rm!=0x1f && !opcode) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_BX2_r2b\n\tif(!L && R && Rm!=0x1f && opcode==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_BX4_r4b\n\tif(!L && R && Rm==0x1f && !opcode) return ST2_advsimd_sngl(ctx, dec); // -> ST2_asisdlsop_B2_i2b\n\tif(!L && R && Rm==0x1f && opcode==1) return ST4_advsimd_sngl(ctx, dec); // -> ST4_asisdlsop_B4_i4b\n\tif(L && !R && Rm!=0x1f && !opcode) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_BX1_r1b\n\tif(L && !R && Rm!=0x1f && opcode==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_BX3_r3b\n\tif(L && !R && Rm==0x1f && !opcode) return LD1_advsimd_sngl(ctx, dec); // -> LD1_asisdlsop_B1_i1b\n\tif(L && !R && Rm==0x1f && opcode==1) return LD3_advsimd_sngl(ctx, dec); // -> LD3_asisdlsop_B3_i3b\n\tif(L && R && Rm!=0x1f && !opcode) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_BX2_r2b\n\tif(L && R && Rm!=0x1f && opcode==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_BX4_r4b\n\tif(L && R && Rm==0x1f && !opcode) return LD2_advsimd_sngl(ctx, dec); // -> LD2_asisdlsop_B2_i2b\n\tif(L && R && Rm==0x1f && opcode==1) return LD4_advsimd_sngl(ctx, dec); // -> LD4_asisdlsop_B4_i4b\n\tif(!L && !R && opcode==4 && S && size==1) UNALLOCATED(ENC_UNALLOCATED_18_ASISDLSOP);\n\tif(!L && !R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_33_ASISDLSOP);\n\tif(!L && R && opcode==4 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_25_ASISDLSOP);\n\tif(!L && R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_41_ASISDLSOP);\n\tif(L && !R && opcode==4 && S && size==1) UNALLOCATED(ENC_UNALLOCATED_48_ASISDLSOP);\n\tif(L && !R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_68_ASISDLSOP);\n\tif(L && R && opcode==4 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_58_ASISDLSOP);\n\tif(L && R && opcode==5 && !S && size==3) UNALLOCATED(ENC_UNALLOCATED_78_ASISDLSOP);\n\tif(!L && !R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_31_ASISDLSOP);\n\tif(!L && !R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_34_ASISDLSOP);\n\tif(!L && R && opcode==4 && size==2) UNALLOCATED(ENC_UNALLOCATED_23_ASISDLSOP);\n\tif(!L && R && opcode==4 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_26_ASISDLSOP);\n\tif(!L && R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_39_ASISDLSOP);\n\tif(!L && R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_42_ASISDLSOP);\n\tif(L && !R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_66_ASISDLSOP);\n\tif(L && !R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_69_ASISDLSOP);\n\tif(L && R && opcode==4 && size==2) UNALLOCATED(ENC_UNALLOCATED_56_ASISDLSOP);\n\tif(L && R && opcode==4 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_59_ASISDLSOP);\n\tif(L && R && opcode==5 && size==2) UNALLOCATED(ENC_UNALLOCATED_76_ASISDLSOP);\n\tif(L && R && opcode==5 && S && size&1) UNALLOCATED(ENC_UNALLOCATED_79_ASISDLSOP);\n\tif(!L && !R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_14_ASISDLSOP);\n\tif(!L && !R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_29_ASISDLSOP);\n\tif(!L && !R && opcode==4 && (size&2)==2) UNALLOCATED(ENC_UNALLOCATED_16_ASISDLSOP);\n\tif(!L && R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_21_ASISDLSOP);\n\tif(!L && R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_37_ASISDLSOP);\n\tif(L && !R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_45_ASISDLSOP);\n\tif(L && !R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_64_ASISDLSOP);\n\tif(L && !R && opcode==4 && (size&2)==2) UNALLOCATED(ENC_UNALLOCATED_49_ASISDLSOP);\n\tif(L && !R && opcode==6 && S) UNALLOCATED(ENC_UNALLOCATED_51_ASISDLSOP);\n\tif(L && !R && opcode==7 && S) UNALLOCATED(ENC_UNALLOCATED_71_ASISDLSOP);\n\tif(L && R && opcode==2 && size&1) UNALLOCATED(ENC_UNALLOCATED_54_ASISDLSOP);\n\tif(L && R && opcode==3 && size&1) UNALLOCATED(ENC_UNALLOCATED_74_ASISDLSOP);\n\tif(L && R && opcode==6 && S) UNALLOCATED(ENC_UNALLOCATED_61_ASISDLSOP);\n\tif(L && R && opcode==7 && S) UNALLOCATED(ENC_UNALLOCATED_81_ASISDLSOP);\n\tif(!L && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_11_ASISDLSOP);\n\tUNMATCHED;\n}\n\nint decode_iclass_memop(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, A=(INSWORD>>23)&1, R=(INSWORD>>22)&1, Rs=(INSWORD>>16)&0x1f, o3=(INSWORD>>15)&1, opc=(INSWORD>>12)&7;\n\tif(size==3 && !V && !A && !R && Rs==0x1f && o3 && opc==1 && HasLS64()) return ST64B(ctx, dec); // -> ST64B_64L_memop\n\tif(size==3 && !V && !A && !R && Rs==0x1f && o3 && opc==5 && HasLS64()) return LD64B(ctx, dec); // -> LD64B_64L_memop\n\tif(!size && !V && !A && !R && !o3 && !opc && HasLSE()) return LDADDB(ctx, dec); // -> LDADDB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==1 && HasLSE()) return LDCLRB(ctx, dec); // -> LDCLRB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==2 && HasLSE()) return LDEORB(ctx, dec); // -> LDEORB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==3 && HasLSE()) return LDSETB(ctx, dec); // -> LDSETB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==4 && HasLSE()) return LDSMAXB(ctx, dec); // -> LDSMAXB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==5 && HasLSE()) return LDSMINB(ctx, dec); // -> LDSMINB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==6 && HasLSE()) return LDUMAXB(ctx, dec); // -> LDUMAXB_32_memop\n\tif(!size && !V && !A && !R && !o3 && opc==7 && HasLSE()) return LDUMINB(ctx, dec); // -> LDUMINB_32_memop\n\tif(!size && !V && !A && !R && o3 && !opc && HasLSE()) return SWPB(ctx, dec); // -> SWPB_32_memop\n\tif(!size && !V && !A && !R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_154_MEMOP);\n\tif(!size && !V && !A && !R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_161_MEMOP);\n\tif(!size && !V && !A && !R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_168_MEMOP);\n\tif(!size && !V && !A && !R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_181_MEMOP);\n\tif(!size && !V && !A && R && !o3 && !opc && HasLSE()) return LDADDB(ctx, dec); // -> LDADDLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==1 && HasLSE()) return LDCLRB(ctx, dec); // -> LDCLRLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==2 && HasLSE()) return LDEORB(ctx, dec); // -> LDEORLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==3 && HasLSE()) return LDSETB(ctx, dec); // -> LDSETLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==4 && HasLSE()) return LDSMAXB(ctx, dec); // -> LDSMAXLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==5 && HasLSE()) return LDSMINB(ctx, dec); // -> LDSMINLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==6 && HasLSE()) return LDUMAXB(ctx, dec); // -> LDUMAXLB_32_memop\n\tif(!size && !V && !A && R && !o3 && opc==7 && HasLSE()) return LDUMINB(ctx, dec); // -> LDUMINLB_32_memop\n\tif(!size && !V && !A && R && o3 && !opc && HasLSE()) return SWPB(ctx, dec); // -> SWPLB_32_memop\n\tif(!size && !V && A && !R && !o3 && !opc && HasLSE()) return LDADDB(ctx, dec); // -> LDADDAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==1 && HasLSE()) return LDCLRB(ctx, dec); // -> LDCLRAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==2 && HasLSE()) return LDEORB(ctx, dec); // -> LDEORAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==3 && HasLSE()) return LDSETB(ctx, dec); // -> LDSETAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==4 && HasLSE()) return LDSMAXB(ctx, dec); // -> LDSMAXAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==5 && HasLSE()) return LDSMINB(ctx, dec); // -> LDSMINAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==6 && HasLSE()) return LDUMAXB(ctx, dec); // -> LDUMAXAB_32_memop\n\tif(!size && !V && A && !R && !o3 && opc==7 && HasLSE()) return LDUMINB(ctx, dec); // -> LDUMINAB_32_memop\n\tif(!size && !V && A && !R && o3 && !opc && HasLSE()) return SWPB(ctx, dec); // -> SWPAB_32_memop\n\tif(!size && !V && A && !R && o3 && opc==4 && HasLRCPC()) return LDAPRB(ctx, dec); // -> LDAPRB_32L_memop\n\tif(!size && !V && A && R && !o3 && !opc && HasLSE()) return LDADDB(ctx, dec); // -> LDADDALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==1 && HasLSE()) return LDCLRB(ctx, dec); // -> LDCLRALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==2 && HasLSE()) return LDEORB(ctx, dec); // -> LDEORALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==3 && HasLSE()) return LDSETB(ctx, dec); // -> LDSETALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==4 && HasLSE()) return LDSMAXB(ctx, dec); // -> LDSMAXALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==5 && HasLSE()) return LDSMINB(ctx, dec); // -> LDSMINALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==6 && HasLSE()) return LDUMAXB(ctx, dec); // -> LDUMAXALB_32_memop\n\tif(!size && !V && A && R && !o3 && opc==7 && HasLSE()) return LDUMINB(ctx, dec); // -> LDUMINALB_32_memop\n\tif(!size && !V && A && R && o3 && !opc && HasLSE()) return SWPB(ctx, dec); // -> SWPALB_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && !opc && HasLSE()) return LDADDH(ctx, dec); // -> LDADDH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==1 && HasLSE()) return LDCLRH(ctx, dec); // -> LDCLRH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==2 && HasLSE()) return LDEORH(ctx, dec); // -> LDEORH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==3 && HasLSE()) return LDSETH(ctx, dec); // -> LDSETH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==4 && HasLSE()) return LDSMAXH(ctx, dec); // -> LDSMAXH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==5 && HasLSE()) return LDSMINH(ctx, dec); // -> LDSMINH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==6 && HasLSE()) return LDUMAXH(ctx, dec); // -> LDUMAXH_32_memop\n\tif(size==1 && !V && !A && !R && !o3 && opc==7 && HasLSE()) return LDUMINH(ctx, dec); // -> LDUMINH_32_memop\n\tif(size==1 && !V && !A && !R && o3 && !opc && HasLSE()) return SWPH(ctx, dec); // -> SWPH_32_memop\n\tif(size==1 && !V && !A && !R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_155_MEMOP);\n\tif(size==1 && !V && !A && !R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_162_MEMOP);\n\tif(size==1 && !V && !A && !R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_169_MEMOP);\n\tif(size==1 && !V && !A && !R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_182_MEMOP);\n\tif(size==1 && !V && !A && R && !o3 && !opc && HasLSE()) return LDADDH(ctx, dec); // -> LDADDLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==1 && HasLSE()) return LDCLRH(ctx, dec); // -> LDCLRLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==2 && HasLSE()) return LDEORH(ctx, dec); // -> LDEORLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==3 && HasLSE()) return LDSETH(ctx, dec); // -> LDSETLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==4 && HasLSE()) return LDSMAXH(ctx, dec); // -> LDSMAXLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==5 && HasLSE()) return LDSMINH(ctx, dec); // -> LDSMINLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==6 && HasLSE()) return LDUMAXH(ctx, dec); // -> LDUMAXLH_32_memop\n\tif(size==1 && !V && !A && R && !o3 && opc==7 && HasLSE()) return LDUMINH(ctx, dec); // -> LDUMINLH_32_memop\n\tif(size==1 && !V && !A && R && o3 && !opc && HasLSE()) return SWPH(ctx, dec); // -> SWPLH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && !opc && HasLSE()) return LDADDH(ctx, dec); // -> LDADDAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==1 && HasLSE()) return LDCLRH(ctx, dec); // -> LDCLRAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==2 && HasLSE()) return LDEORH(ctx, dec); // -> LDEORAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==3 && HasLSE()) return LDSETH(ctx, dec); // -> LDSETAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==4 && HasLSE()) return LDSMAXH(ctx, dec); // -> LDSMAXAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==5 && HasLSE()) return LDSMINH(ctx, dec); // -> LDSMINAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==6 && HasLSE()) return LDUMAXH(ctx, dec); // -> LDUMAXAH_32_memop\n\tif(size==1 && !V && A && !R && !o3 && opc==7 && HasLSE()) return LDUMINH(ctx, dec); // -> LDUMINAH_32_memop\n\tif(size==1 && !V && A && !R && o3 && !opc && HasLSE()) return SWPH(ctx, dec); // -> SWPAH_32_memop\n\tif(size==1 && !V && A && !R && o3 && opc==4 && HasLRCPC()) return LDAPRH(ctx, dec); // -> LDAPRH_32L_memop\n\tif(size==1 && !V && A && R && !o3 && !opc && HasLSE()) return LDADDH(ctx, dec); // -> LDADDALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==1 && HasLSE()) return LDCLRH(ctx, dec); // -> LDCLRALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==2 && HasLSE()) return LDEORH(ctx, dec); // -> LDEORALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==3 && HasLSE()) return LDSETH(ctx, dec); // -> LDSETALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==4 && HasLSE()) return LDSMAXH(ctx, dec); // -> LDSMAXALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==5 && HasLSE()) return LDSMINH(ctx, dec); // -> LDSMINALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==6 && HasLSE()) return LDUMAXH(ctx, dec); // -> LDUMAXALH_32_memop\n\tif(size==1 && !V && A && R && !o3 && opc==7 && HasLSE()) return LDUMINH(ctx, dec); // -> LDUMINALH_32_memop\n\tif(size==1 && !V && A && R && o3 && !opc && HasLSE()) return SWPH(ctx, dec); // -> SWPALH_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADD_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLR_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEOR_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSET_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAX_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMIN_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAX_32_memop\n\tif(size==2 && !V && !A && !R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMIN_32_memop\n\tif(size==2 && !V && !A && !R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWP_32_memop\n\tif(size==2 && !V && !A && !R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_156_MEMOP);\n\tif(size==2 && !V && !A && !R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_163_MEMOP);\n\tif(size==2 && !V && !A && !R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_170_MEMOP);\n\tif(size==2 && !V && !A && !R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_183_MEMOP);\n\tif(size==2 && !V && !A && R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXL_32_memop\n\tif(size==2 && !V && !A && R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINL_32_memop\n\tif(size==2 && !V && !A && R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPL_32_memop\n\tif(size==2 && !V && A && !R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXA_32_memop\n\tif(size==2 && !V && A && !R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINA_32_memop\n\tif(size==2 && !V && A && !R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPA_32_memop\n\tif(size==2 && !V && A && !R && o3 && opc==4 && HasLRCPC()) return LDAPR(ctx, dec); // -> LDAPR_32L_memop\n\tif(size==2 && !V && A && R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXAL_32_memop\n\tif(size==2 && !V && A && R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINAL_32_memop\n\tif(size==2 && !V && A && R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPAL_32_memop\n\tif(size==3 && !V && !A && !R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADD_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLR_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEOR_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSET_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAX_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMIN_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAX_64_memop\n\tif(size==3 && !V && !A && !R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMIN_64_memop\n\tif(size==3 && !V && !A && !R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWP_64_memop\n\tif(size==3 && !V && !A && !R && o3 && opc==2 && HasLS64_V()) return ST64BV0(ctx, dec); // -> ST64BV0_64_memop\n\tif(size==3 && !V && !A && !R && o3 && opc==3 && HasLS64_V()) return ST64BV(ctx, dec); // -> ST64BV_64_memop\n\tif(size==3 && !V && !A && R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXL_64_memop\n\tif(size==3 && !V && !A && R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINL_64_memop\n\tif(size==3 && !V && !A && R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPL_64_memop\n\tif(size==3 && !V && A && !R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXA_64_memop\n\tif(size==3 && !V && A && !R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINA_64_memop\n\tif(size==3 && !V && A && !R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPA_64_memop\n\tif(size==3 && !V && A && !R && o3 && opc==4 && HasLRCPC()) return LDAPR(ctx, dec); // -> LDAPR_64L_memop\n\tif(size==3 && !V && A && R && !o3 && !opc && HasLSE()) return LDADD(ctx, dec); // -> LDADDAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==1 && HasLSE()) return LDCLR(ctx, dec); // -> LDCLRAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==2 && HasLSE()) return LDEOR(ctx, dec); // -> LDEORAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==3 && HasLSE()) return LDSET(ctx, dec); // -> LDSETAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==4 && HasLSE()) return LDSMAX(ctx, dec); // -> LDSMAXAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==5 && HasLSE()) return LDSMIN(ctx, dec); // -> LDSMINAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==6 && HasLSE()) return LDUMAX(ctx, dec); // -> LDUMAXAL_64_memop\n\tif(size==3 && !V && A && R && !o3 && opc==7 && HasLSE()) return LDUMIN(ctx, dec); // -> LDUMINAL_64_memop\n\tif(size==3 && !V && A && R && o3 && !opc && HasLSE()) return SWP(ctx, dec); // -> SWPAL_64_memop\n\tif(!V && !A && R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_158_MEMOP);\n\tif(!V && !A && R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_165_MEMOP);\n\tif(!V && !A && R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_172_MEMOP);\n\tif(!V && !A && R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_185_MEMOP);\n\tif(!V && A && !R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_159_MEMOP);\n\tif(!V && A && !R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_166_MEMOP);\n\tif(!V && A && !R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_173_MEMOP);\n\tif(!V && A && !R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_186_MEMOP);\n\tif(!V && A && R && o3 && opc==1) UNALLOCATED(ENC_UNALLOCATED_160_MEMOP);\n\tif(!V && A && R && o3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_167_MEMOP);\n\tif(!V && A && R && o3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_174_MEMOP);\n\tif(!V && A && R && o3 && opc==4) UNALLOCATED(ENC_UNALLOCATED_180_MEMOP);\n\tif(!V && A && R && o3 && opc==5) UNALLOCATED(ENC_UNALLOCATED_187_MEMOP);\n\tif(!V && !A && o3 && opc==4) UNALLOCATED(ENC_UNALLOCATED_175_MEMOP);\n\tif(!V && o3 && (opc&6)==6) UNALLOCATED(ENC_UNALLOCATED_188_MEMOP);\n\tif(V) UNALLOCATED(ENC_UNALLOCATED_189_MEMOP);\n\tUNMATCHED;\n}\n\nint decode_iclass_comswap(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, L=(INSWORD>>22)&1, o0=(INSWORD>>15)&1, Rt2=(INSWORD>>10)&0x1f;\n\tif(!size && !L && !o0 && Rt2==0x1f && HasLSE()) return CASB(ctx, dec); // -> CASB_C32_comswap\n\tif(!size && !L && o0 && Rt2==0x1f && HasLSE()) return CASB(ctx, dec); // -> CASLB_C32_comswap\n\tif(!size && L && !o0 && Rt2==0x1f && HasLSE()) return CASB(ctx, dec); // -> CASAB_C32_comswap\n\tif(!size && L && o0 && Rt2==0x1f && HasLSE()) return CASB(ctx, dec); // -> CASALB_C32_comswap\n\tif(size==1 && !L && !o0 && Rt2==0x1f && HasLSE()) return CASH(ctx, dec); // -> CASH_C32_comswap\n\tif(size==1 && !L && o0 && Rt2==0x1f && HasLSE()) return CASH(ctx, dec); // -> CASLH_C32_comswap\n\tif(size==1 && L && !o0 && Rt2==0x1f && HasLSE()) return CASH(ctx, dec); // -> CASAH_C32_comswap\n\tif(size==1 && L && o0 && Rt2==0x1f && HasLSE()) return CASH(ctx, dec); // -> CASALH_C32_comswap\n\tif(size==2 && !L && !o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CAS_C32_comswap\n\tif(size==2 && !L && o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASL_C32_comswap\n\tif(size==2 && L && !o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASA_C32_comswap\n\tif(size==2 && L && o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASAL_C32_comswap\n\tif(size==3 && !L && !o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CAS_C64_comswap\n\tif(size==3 && !L && o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASL_C64_comswap\n\tif(size==3 && L && !o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASA_C64_comswap\n\tif(size==3 && L && o0 && Rt2==0x1f && HasLSE()) return CAS(ctx, dec); // -> CASAL_C64_comswap\n\tif(Rt2!=0x1f) UNALLOCATED(ENC_UNALLOCATED_10_COMSWAP);\n\tUNMATCHED;\n}\n\nint decode_iclass_comswappr(context *ctx, Instruction *dec)\n{\n\tuint32_t sz=(INSWORD>>30)&1, L=(INSWORD>>22)&1, o0=(INSWORD>>15)&1, Rt2=(INSWORD>>10)&0x1f;\n\tif(!sz && !L && !o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASP_CP32_comswappr\n\tif(!sz && !L && o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPL_CP32_comswappr\n\tif(!sz && L && !o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPA_CP32_comswappr\n\tif(!sz && L && o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPAL_CP32_comswappr\n\tif(sz && !L && !o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASP_CP64_comswappr\n\tif(sz && !L && o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPL_CP64_comswappr\n\tif(sz && L && !o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPA_CP64_comswappr\n\tif(sz && L && o0 && Rt2==0x1f && HasLSE()) return CASP(ctx, dec); // -> CASPAL_CP64_comswappr\n\tif(Rt2!=0x1f) UNALLOCATED(ENC_UNALLOCATED_10_COMSWAPPR);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldapstl_unscaled(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, opc=(INSWORD>>22)&3;\n\tif(!size && !opc && HasLRCPC2()) return STLURB(ctx, dec); // -> STLURB_32_ldapstl_unscaled\n\tif(!size && opc==1 && HasLRCPC2()) return LDAPURB(ctx, dec); // -> LDAPURB_32_ldapstl_unscaled\n\tif(!size && opc==2 && HasLRCPC2()) return LDAPURSB(ctx, dec); // -> LDAPURSB_64_ldapstl_unscaled\n\tif(!size && opc==3 && HasLRCPC2()) return LDAPURSB(ctx, dec); // -> LDAPURSB_32_ldapstl_unscaled\n\tif(size==1 && !opc && HasLRCPC2()) return STLURH(ctx, dec); // -> STLURH_32_ldapstl_unscaled\n\tif(size==1 && opc==1 && HasLRCPC2()) return LDAPURH(ctx, dec); // -> LDAPURH_32_ldapstl_unscaled\n\tif(size==1 && opc==2 && HasLRCPC2()) return LDAPURSH(ctx, dec); // -> LDAPURSH_64_ldapstl_unscaled\n\tif(size==1 && opc==3 && HasLRCPC2()) return LDAPURSH(ctx, dec); // -> LDAPURSH_32_ldapstl_unscaled\n\tif(size==2 && !opc && HasLRCPC2()) return STLUR_gen(ctx, dec); // -> STLUR_32_ldapstl_unscaled\n\tif(size==2 && opc==1 && HasLRCPC2()) return LDAPUR_gen(ctx, dec); // -> LDAPUR_32_ldapstl_unscaled\n\tif(size==2 && opc==2 && HasLRCPC2()) return LDAPURSW(ctx, dec); // -> LDAPURSW_64_ldapstl_unscaled\n\tif(size==2 && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDAPSTL_UNSCALED);\n\tif(size==3 && !opc && HasLRCPC2()) return STLUR_gen(ctx, dec); // -> STLUR_64_ldapstl_unscaled\n\tif(size==3 && opc==1 && HasLRCPC2()) return LDAPUR_gen(ctx, dec); // -> LDAPUR_64_ldapstl_unscaled\n\tif(size==3 && opc==2) UNALLOCATED(ENC_UNALLOCATED_21_LDAPSTL_UNSCALED);\n\tif(size==3 && opc==3) UNALLOCATED(ENC_UNALLOCATED_25_LDAPSTL_UNSCALED);\n\tUNMATCHED;\n}\n\nint decode_iclass_loadlit(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=INSWORD>>30, V=(INSWORD>>26)&1;\n\tif(!opc && !V) return LDR_lit_gen(ctx, dec); // -> LDR_32_loadlit\n\tif(!opc && V) return LDR_lit_fpsimd(ctx, dec); // -> LDR_S_loadlit\n\tif(opc==1 && !V) return LDR_lit_gen(ctx, dec); // -> LDR_64_loadlit\n\tif(opc==1 && V) return LDR_lit_fpsimd(ctx, dec); // -> LDR_D_loadlit\n\tif(opc==2 && !V) return LDRSW_lit(ctx, dec); // -> LDRSW_64_loadlit\n\tif(opc==2 && V) return LDR_lit_fpsimd(ctx, dec); // -> LDR_Q_loadlit\n\tif(opc==3 && !V) return PRFM_lit(ctx, dec); // -> PRFM_P_loadlit\n\tif(opc==3 && V) UNALLOCATED(ENC_UNALLOCATED_17_LOADLIT);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstexclp(context *ctx, Instruction *dec)\n{\n\tuint32_t sz=(INSWORD>>30)&1, L=(INSWORD>>22)&1, o0=(INSWORD>>15)&1;\n\tif(!sz && !L && !o0) return STXP(ctx, dec); // -> STXP_SP32_ldstexclp\n\tif(!sz && !L && o0) return STLXP(ctx, dec); // -> STLXP_SP32_ldstexclp\n\tif(!sz && L && !o0) return LDXP(ctx, dec); // -> LDXP_LP32_ldstexclp\n\tif(!sz && L && o0) return LDAXP(ctx, dec); // -> LDAXP_LP32_ldstexclp\n\tif(sz && !L && !o0) return STXP(ctx, dec); // -> STXP_SP64_ldstexclp\n\tif(sz && !L && o0) return STLXP(ctx, dec); // -> STLXP_SP64_ldstexclp\n\tif(sz && L && !o0) return LDXP(ctx, dec); // -> LDXP_LP64_ldstexclp\n\tif(sz && L && o0) return LDAXP(ctx, dec); // -> LDAXP_LP64_ldstexclp\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstexclr(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, L=(INSWORD>>22)&1, o0=(INSWORD>>15)&1;\n\tif(!size && !L && !o0) return STXRB(ctx, dec); // -> STXRB_SR32_ldstexclr\n\tif(!size && !L && o0) return STLXRB(ctx, dec); // -> STLXRB_SR32_ldstexclr\n\tif(!size && L && !o0) return LDXRB(ctx, dec); // -> LDXRB_LR32_ldstexclr\n\tif(!size && L && o0) return LDAXRB(ctx, dec); // -> LDAXRB_LR32_ldstexclr\n\tif(size==1 && !L && !o0) return STXRH(ctx, dec); // -> STXRH_SR32_ldstexclr\n\tif(size==1 && !L && o0) return STLXRH(ctx, dec); // -> STLXRH_SR32_ldstexclr\n\tif(size==1 && L && !o0) return LDXRH(ctx, dec); // -> LDXRH_LR32_ldstexclr\n\tif(size==1 && L && o0) return LDAXRH(ctx, dec); // -> LDAXRH_LR32_ldstexclr\n\tif(size==2 && !L && !o0) return STXR(ctx, dec); // -> STXR_SR32_ldstexclr\n\tif(size==2 && !L && o0) return STLXR(ctx, dec); // -> STLXR_SR32_ldstexclr\n\tif(size==2 && L && !o0) return LDXR(ctx, dec); // -> LDXR_LR32_ldstexclr\n\tif(size==2 && L && o0) return LDAXR(ctx, dec); // -> LDAXR_LR32_ldstexclr\n\tif(size==3 && !L && !o0) return STXR(ctx, dec); // -> STXR_SR64_ldstexclr\n\tif(size==3 && !L && o0) return STLXR(ctx, dec); // -> STLXR_SR64_ldstexclr\n\tif(size==3 && L && !o0) return LDXR(ctx, dec); // -> LDXR_LR64_ldstexclr\n\tif(size==3 && L && o0) return LDAXR(ctx, dec); // -> LDAXR_LR64_ldstexclr\n\tUNMATCHED;\n}\n\nint decode_iclass_ldsttags(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, imm9=(INSWORD>>12)&0x1ff, op2=(INSWORD>>10)&3;\n\tif(!opc && !imm9 && !op2 && HasMTE2()) return STZGM(ctx, dec); // -> STZGM_64bulk_ldsttags\n\tif(opc==2 && imm9 && !op2) UNALLOCATED(ENC_UNALLOCATED_13_LDSTTAGS);\n\tif(opc==2 && !imm9 && !op2 && HasMTE2()) return STGM(ctx, dec); // -> STGM_64bulk_ldsttags\n\tif(opc==3 && imm9 && !op2) UNALLOCATED(ENC_UNALLOCATED_15_LDSTTAGS);\n\tif(opc==3 && !imm9 && !op2 && HasMTE2()) return LDGM(ctx, dec); // -> LDGM_64bulk_ldsttags\n\tif(!opc && op2==1 && HasMTE()) return STG(ctx, dec); // -> STG_64Spost_ldsttags\n\tif(!opc && op2==2 && HasMTE()) return STG(ctx, dec); // -> STG_64Soffset_ldsttags\n\tif(!opc && op2==3 && HasMTE()) return STG(ctx, dec); // -> STG_64Spre_ldsttags\n\tif(opc==1 && !op2 && HasMTE()) return LDG(ctx, dec); // -> LDG_64Loffset_ldsttags\n\tif(opc==1 && op2==1 && HasMTE()) return STZG(ctx, dec); // -> STZG_64Spost_ldsttags\n\tif(opc==1 && op2==2 && HasMTE()) return STZG(ctx, dec); // -> STZG_64Soffset_ldsttags\n\tif(opc==1 && op2==3 && HasMTE()) return STZG(ctx, dec); // -> STZG_64Spre_ldsttags\n\tif(opc==2 && op2==1 && HasMTE()) return ST2G(ctx, dec); // -> ST2G_64Spost_ldsttags\n\tif(opc==2 && op2==2 && HasMTE()) return ST2G(ctx, dec); // -> ST2G_64Soffset_ldsttags\n\tif(opc==2 && op2==3 && HasMTE()) return ST2G(ctx, dec); // -> ST2G_64Spre_ldsttags\n\tif(opc==3 && op2==1 && HasMTE()) return STZ2G(ctx, dec); // -> STZ2G_64Spost_ldsttags\n\tif(opc==3 && op2==2 && HasMTE()) return STZ2G(ctx, dec); // -> STZ2G_64Soffset_ldsttags\n\tif(opc==3 && op2==3 && HasMTE()) return STZ2G(ctx, dec); // -> STZ2G_64Spre_ldsttags\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstnapair_offs(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=INSWORD>>30, V=(INSWORD>>26)&1, L=(INSWORD>>22)&1;\n\tif(!opc && !V && !L) return STNP_gen(ctx, dec); // -> STNP_32_ldstnapair_offs\n\tif(!opc && !V && L) return LDNP_gen(ctx, dec); // -> LDNP_32_ldstnapair_offs\n\tif(!opc && V && !L) return STNP_fpsimd(ctx, dec); // -> STNP_S_ldstnapair_offs\n\tif(!opc && V && L) return LDNP_fpsimd(ctx, dec); // -> LDNP_S_ldstnapair_offs\n\tif(opc==1 && V && !L) return STNP_fpsimd(ctx, dec); // -> STNP_D_ldstnapair_offs\n\tif(opc==1 && V && L) return LDNP_fpsimd(ctx, dec); // -> LDNP_D_ldstnapair_offs\n\tif(opc==2 && !V && !L) return STNP_gen(ctx, dec); // -> STNP_64_ldstnapair_offs\n\tif(opc==2 && !V && L) return LDNP_gen(ctx, dec); // -> LDNP_64_ldstnapair_offs\n\tif(opc==2 && V && !L) return STNP_fpsimd(ctx, dec); // -> STNP_Q_ldstnapair_offs\n\tif(opc==2 && V && L) return LDNP_fpsimd(ctx, dec); // -> LDNP_Q_ldstnapair_offs\n\tif(opc==1 && !V) UNALLOCATED(ENC_UNALLOCATED_12_LDSTNAPAIR_OFFS);\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_21_LDSTNAPAIR_OFFS);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstord(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, L=(INSWORD>>22)&1, o0=(INSWORD>>15)&1;\n\tif(!size && !L && !o0 && HasLOR()) return STLLRB(ctx, dec); // -> STLLRB_SL32_ldstord\n\tif(!size && !L && o0) return STLRB(ctx, dec); // -> STLRB_SL32_ldstord\n\tif(!size && L && !o0 && HasLOR()) return LDLARB(ctx, dec); // -> LDLARB_LR32_ldstord\n\tif(!size && L && o0) return LDARB(ctx, dec); // -> LDARB_LR32_ldstord\n\tif(size==1 && !L && !o0 && HasLOR()) return STLLRH(ctx, dec); // -> STLLRH_SL32_ldstord\n\tif(size==1 && !L && o0) return STLRH(ctx, dec); // -> STLRH_SL32_ldstord\n\tif(size==1 && L && !o0 && HasLOR()) return LDLARH(ctx, dec); // -> LDLARH_LR32_ldstord\n\tif(size==1 && L && o0) return LDARH(ctx, dec); // -> LDARH_LR32_ldstord\n\tif(size==2 && !L && !o0 && HasLOR()) return STLLR(ctx, dec); // -> STLLR_SL32_ldstord\n\tif(size==2 && !L && o0) return STLR(ctx, dec); // -> STLR_SL32_ldstord\n\tif(size==2 && L && !o0 && HasLOR()) return LDLAR(ctx, dec); // -> LDLAR_LR32_ldstord\n\tif(size==2 && L && o0) return LDAR(ctx, dec); // -> LDAR_LR32_ldstord\n\tif(size==3 && !L && !o0 && HasLOR()) return STLLR(ctx, dec); // -> STLLR_SL64_ldstord\n\tif(size==3 && !L && o0) return STLR(ctx, dec); // -> STLR_SL64_ldstord\n\tif(size==3 && L && !o0 && HasLOR()) return LDLAR(ctx, dec); // -> LDLAR_LR64_ldstord\n\tif(size==3 && L && o0) return LDAR(ctx, dec); // -> LDAR_LR64_ldstord\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_immpost(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3;\n\tif(!size && !V && !opc) return STRB_imm(ctx, dec); // -> STRB_32_ldst_immpost\n\tif(!size && !V && opc==1) return LDRB_imm(ctx, dec); // -> LDRB_32_ldst_immpost\n\tif(!size && !V && opc==2) return LDRSB_imm(ctx, dec); // -> LDRSB_64_ldst_immpost\n\tif(!size && !V && opc==3) return LDRSB_imm(ctx, dec); // -> LDRSB_32_ldst_immpost\n\tif(!size && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_B_ldst_immpost\n\tif(!size && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_B_ldst_immpost\n\tif(!size && V && opc==2) return STR_imm_fpsimd(ctx, dec); // -> STR_Q_ldst_immpost\n\tif(!size && V && opc==3) return LDR_imm_fpsimd(ctx, dec); // -> LDR_Q_ldst_immpost\n\tif(size==1 && !V && !opc) return STRH_imm(ctx, dec); // -> STRH_32_ldst_immpost\n\tif(size==1 && !V && opc==1) return LDRH_imm(ctx, dec); // -> LDRH_32_ldst_immpost\n\tif(size==1 && !V && opc==2) return LDRSH_imm(ctx, dec); // -> LDRSH_64_ldst_immpost\n\tif(size==1 && !V && opc==3) return LDRSH_imm(ctx, dec); // -> LDRSH_32_ldst_immpost\n\tif(size==1 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_H_ldst_immpost\n\tif(size==1 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_H_ldst_immpost\n\tif(size==2 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_32_ldst_immpost\n\tif(size==2 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_32_ldst_immpost\n\tif(size==2 && !V && opc==2) return LDRSW_imm(ctx, dec); // -> LDRSW_64_ldst_immpost\n\tif(size==2 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_S_ldst_immpost\n\tif(size==2 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_S_ldst_immpost\n\tif(size==3 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_64_ldst_immpost\n\tif(size==3 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_64_ldst_immpost\n\tif(size==3 && !V && opc==2) UNALLOCATED(ENC_UNALLOCATED_21_LDST_IMMPOST);\n\tif(size==3 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_D_ldst_immpost\n\tif(size==3 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_D_ldst_immpost\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDST_IMMPOST);\n\tif(size&1 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_35_LDST_IMMPOST);\n\tif((size&2)==2 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_36_LDST_IMMPOST);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_immpre(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3;\n\tif(!size && !V && !opc) return STRB_imm(ctx, dec); // -> STRB_32_ldst_immpre\n\tif(!size && !V && opc==1) return LDRB_imm(ctx, dec); // -> LDRB_32_ldst_immpre\n\tif(!size && !V && opc==2) return LDRSB_imm(ctx, dec); // -> LDRSB_64_ldst_immpre\n\tif(!size && !V && opc==3) return LDRSB_imm(ctx, dec); // -> LDRSB_32_ldst_immpre\n\tif(!size && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_B_ldst_immpre\n\tif(!size && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_B_ldst_immpre\n\tif(!size && V && opc==2) return STR_imm_fpsimd(ctx, dec); // -> STR_Q_ldst_immpre\n\tif(!size && V && opc==3) return LDR_imm_fpsimd(ctx, dec); // -> LDR_Q_ldst_immpre\n\tif(size==1 && !V && !opc) return STRH_imm(ctx, dec); // -> STRH_32_ldst_immpre\n\tif(size==1 && !V && opc==1) return LDRH_imm(ctx, dec); // -> LDRH_32_ldst_immpre\n\tif(size==1 && !V && opc==2) return LDRSH_imm(ctx, dec); // -> LDRSH_64_ldst_immpre\n\tif(size==1 && !V && opc==3) return LDRSH_imm(ctx, dec); // -> LDRSH_32_ldst_immpre\n\tif(size==1 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_H_ldst_immpre\n\tif(size==1 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_H_ldst_immpre\n\tif(size==2 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_32_ldst_immpre\n\tif(size==2 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_32_ldst_immpre\n\tif(size==2 && !V && opc==2) return LDRSW_imm(ctx, dec); // -> LDRSW_64_ldst_immpre\n\tif(size==2 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_S_ldst_immpre\n\tif(size==2 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_S_ldst_immpre\n\tif(size==3 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_64_ldst_immpre\n\tif(size==3 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_64_ldst_immpre\n\tif(size==3 && !V && opc==2) UNALLOCATED(ENC_UNALLOCATED_21_LDST_IMMPRE);\n\tif(size==3 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_D_ldst_immpre\n\tif(size==3 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_D_ldst_immpre\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDST_IMMPRE);\n\tif(size&1 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_35_LDST_IMMPRE);\n\tif((size&2)==2 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_36_LDST_IMMPRE);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_pac(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, M=(INSWORD>>23)&1, W=(INSWORD>>11)&1;\n\tif(size==3 && !V && !M && !W && HasPAuth()) return LDRA(ctx, dec); // -> LDRAA_64_ldst_pac\n\tif(size==3 && !V && !M && W && HasPAuth()) return LDRA(ctx, dec); // -> LDRAA_64W_ldst_pac\n\tif(size==3 && !V && M && !W && HasPAuth()) return LDRA(ctx, dec); // -> LDRAB_64_ldst_pac\n\tif(size==3 && !V && M && W && HasPAuth()) return LDRA(ctx, dec); // -> LDRAB_64W_ldst_pac\n\tif(size==3 && V) UNALLOCATED(ENC_UNALLOCATED_15_LDST_PAC);\n\tif(size!=3) UNALLOCATED(ENC_UNALLOCATED_14_LDST_PAC);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_regoff(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3, option=(INSWORD>>13)&7;\n\tif(!size && !V && !opc && option!=3) return STRB_reg(ctx, dec); // -> STRB_32B_ldst_regoff\n\tif(!size && !V && !opc && option==3) return STRB_reg(ctx, dec); // -> STRB_32BL_ldst_regoff\n\tif(!size && !V && opc==1 && option!=3) return LDRB_reg(ctx, dec); // -> LDRB_32B_ldst_regoff\n\tif(!size && !V && opc==1 && option==3) return LDRB_reg(ctx, dec); // -> LDRB_32BL_ldst_regoff\n\tif(!size && !V && opc==2 && option!=3) return LDRSB_reg(ctx, dec); // -> LDRSB_64B_ldst_regoff\n\tif(!size && !V && opc==2 && option==3) return LDRSB_reg(ctx, dec); // -> LDRSB_64BL_ldst_regoff\n\tif(!size && !V && opc==3 && option!=3) return LDRSB_reg(ctx, dec); // -> LDRSB_32B_ldst_regoff\n\tif(!size && !V && opc==3 && option==3) return LDRSB_reg(ctx, dec); // -> LDRSB_32BL_ldst_regoff\n\tif(!size && V && !opc && option!=3) return STR_reg_fpsimd(ctx, dec); // -> STR_B_ldst_regoff\n\tif(!size && V && !opc && option==3) return STR_reg_fpsimd(ctx, dec); // -> STR_BL_ldst_regoff\n\tif(!size && V && opc==1 && option!=3) return LDR_reg_fpsimd(ctx, dec); // -> LDR_B_ldst_regoff\n\tif(!size && V && opc==1 && option==3) return LDR_reg_fpsimd(ctx, dec); // -> LDR_BL_ldst_regoff\n\tif(!size && V && opc==2) return STR_reg_fpsimd(ctx, dec); // -> STR_Q_ldst_regoff\n\tif(!size && V && opc==3) return LDR_reg_fpsimd(ctx, dec); // -> LDR_Q_ldst_regoff\n\tif(size==1 && !V && !opc) return STRH_reg(ctx, dec); // -> STRH_32_ldst_regoff\n\tif(size==1 && !V && opc==1) return LDRH_reg(ctx, dec); // -> LDRH_32_ldst_regoff\n\tif(size==1 && !V && opc==2) return LDRSH_reg(ctx, dec); // -> LDRSH_64_ldst_regoff\n\tif(size==1 && !V && opc==3) return LDRSH_reg(ctx, dec); // -> LDRSH_32_ldst_regoff\n\tif(size==1 && V && !opc) return STR_reg_fpsimd(ctx, dec); // -> STR_H_ldst_regoff\n\tif(size==1 && V && opc==1) return LDR_reg_fpsimd(ctx, dec); // -> LDR_H_ldst_regoff\n\tif(size==2 && !V && !opc) return STR_reg_gen(ctx, dec); // -> STR_32_ldst_regoff\n\tif(size==2 && !V && opc==1) return LDR_reg_gen(ctx, dec); // -> LDR_32_ldst_regoff\n\tif(size==2 && !V && opc==2) return LDRSW_reg(ctx, dec); // -> LDRSW_64_ldst_regoff\n\tif(size==2 && V && !opc) return STR_reg_fpsimd(ctx, dec); // -> STR_S_ldst_regoff\n\tif(size==2 && V && opc==1) return LDR_reg_fpsimd(ctx, dec); // -> LDR_S_ldst_regoff\n\tif(size==3 && !V && !opc) return STR_reg_gen(ctx, dec); // -> STR_64_ldst_regoff\n\tif(size==3 && !V && opc==1) return LDR_reg_gen(ctx, dec); // -> LDR_64_ldst_regoff\n\tif(size==3 && !V && opc==2) return PRFM_reg(ctx, dec); // -> PRFM_P_ldst_regoff\n\tif(size==3 && V && !opc) return STR_reg_fpsimd(ctx, dec); // -> STR_D_ldst_regoff\n\tif(size==3 && V && opc==1) return LDR_reg_fpsimd(ctx, dec); // -> LDR_D_ldst_regoff\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_28_LDST_REGOFF);\n\tif(size&1 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_41_LDST_REGOFF);\n\tif((size&2)==2 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_42_LDST_REGOFF);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_unpriv(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3;\n\tif(!size && !V && !opc) return STTRB(ctx, dec); // -> STTRB_32_ldst_unpriv\n\tif(!size && !V && opc==1) return LDTRB(ctx, dec); // -> LDTRB_32_ldst_unpriv\n\tif(!size && !V && opc==2) return LDTRSB(ctx, dec); // -> LDTRSB_64_ldst_unpriv\n\tif(!size && !V && opc==3) return LDTRSB(ctx, dec); // -> LDTRSB_32_ldst_unpriv\n\tif(size==1 && !V && !opc) return STTRH(ctx, dec); // -> STTRH_32_ldst_unpriv\n\tif(size==1 && !V && opc==1) return LDTRH(ctx, dec); // -> LDTRH_32_ldst_unpriv\n\tif(size==1 && !V && opc==2) return LDTRSH(ctx, dec); // -> LDTRSH_64_ldst_unpriv\n\tif(size==1 && !V && opc==3) return LDTRSH(ctx, dec); // -> LDTRSH_32_ldst_unpriv\n\tif(size==2 && !V && !opc) return STTR(ctx, dec); // -> STTR_32_ldst_unpriv\n\tif(size==2 && !V && opc==1) return LDTR(ctx, dec); // -> LDTR_32_ldst_unpriv\n\tif(size==2 && !V && opc==2) return LDTRSW(ctx, dec); // -> LDTRSW_64_ldst_unpriv\n\tif(size==3 && !V && !opc) return STTR(ctx, dec); // -> STTR_64_ldst_unpriv\n\tif(size==3 && !V && opc==1) return LDTR(ctx, dec); // -> LDTR_64_ldst_unpriv\n\tif(size==3 && !V && opc==2) UNALLOCATED(ENC_UNALLOCATED_21_LDST_UNPRIV);\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDST_UNPRIV);\n\tif(V) UNALLOCATED(ENC_UNALLOCATED_25_LDST_UNPRIV);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_unscaled(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3;\n\tif(!size && !V && !opc) return STURB(ctx, dec); // -> STURB_32_ldst_unscaled\n\tif(!size && !V && opc==1) return LDURB(ctx, dec); // -> LDURB_32_ldst_unscaled\n\tif(!size && !V && opc==2) return LDURSB(ctx, dec); // -> LDURSB_64_ldst_unscaled\n\tif(!size && !V && opc==3) return LDURSB(ctx, dec); // -> LDURSB_32_ldst_unscaled\n\tif(!size && V && !opc) return STUR_fpsimd(ctx, dec); // -> STUR_B_ldst_unscaled\n\tif(!size && V && opc==1) return LDUR_fpsimd(ctx, dec); // -> LDUR_B_ldst_unscaled\n\tif(!size && V && opc==2) return STUR_fpsimd(ctx, dec); // -> STUR_Q_ldst_unscaled\n\tif(!size && V && opc==3) return LDUR_fpsimd(ctx, dec); // -> LDUR_Q_ldst_unscaled\n\tif(size==1 && !V && !opc) return STURH(ctx, dec); // -> STURH_32_ldst_unscaled\n\tif(size==1 && !V && opc==1) return LDURH(ctx, dec); // -> LDURH_32_ldst_unscaled\n\tif(size==1 && !V && opc==2) return LDURSH(ctx, dec); // -> LDURSH_64_ldst_unscaled\n\tif(size==1 && !V && opc==3) return LDURSH(ctx, dec); // -> LDURSH_32_ldst_unscaled\n\tif(size==1 && V && !opc) return STUR_fpsimd(ctx, dec); // -> STUR_H_ldst_unscaled\n\tif(size==1 && V && opc==1) return LDUR_fpsimd(ctx, dec); // -> LDUR_H_ldst_unscaled\n\tif(size==2 && !V && !opc) return STUR_gen(ctx, dec); // -> STUR_32_ldst_unscaled\n\tif(size==2 && !V && opc==1) return LDUR_gen(ctx, dec); // -> LDUR_32_ldst_unscaled\n\tif(size==2 && !V && opc==2) return LDURSW(ctx, dec); // -> LDURSW_64_ldst_unscaled\n\tif(size==2 && V && !opc) return STUR_fpsimd(ctx, dec); // -> STUR_S_ldst_unscaled\n\tif(size==2 && V && opc==1) return LDUR_fpsimd(ctx, dec); // -> LDUR_S_ldst_unscaled\n\tif(size==3 && !V && !opc) return STUR_gen(ctx, dec); // -> STUR_64_ldst_unscaled\n\tif(size==3 && !V && opc==1) return LDUR_gen(ctx, dec); // -> LDUR_64_ldst_unscaled\n\tif(size==3 && !V && opc==2) return PRFUM(ctx, dec); // -> PRFUM_P_ldst_unscaled\n\tif(size==3 && V && !opc) return STUR_fpsimd(ctx, dec); // -> STUR_D_ldst_unscaled\n\tif(size==3 && V && opc==1) return LDUR_fpsimd(ctx, dec); // -> LDUR_D_ldst_unscaled\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDST_UNSCALED);\n\tif(size&1 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_35_LDST_UNSCALED);\n\tif((size&2)==2 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_36_LDST_UNSCALED);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldst_pos(context *ctx, Instruction *dec)\n{\n\tuint32_t size=INSWORD>>30, V=(INSWORD>>26)&1, opc=(INSWORD>>22)&3;\n\tif(!size && !V && !opc) return STRB_imm(ctx, dec); // -> STRB_32_ldst_pos\n\tif(!size && !V && opc==1) return LDRB_imm(ctx, dec); // -> LDRB_32_ldst_pos\n\tif(!size && !V && opc==2) return LDRSB_imm(ctx, dec); // -> LDRSB_64_ldst_pos\n\tif(!size && !V && opc==3) return LDRSB_imm(ctx, dec); // -> LDRSB_32_ldst_pos\n\tif(!size && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_B_ldst_pos\n\tif(!size && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_B_ldst_pos\n\tif(!size && V && opc==2) return STR_imm_fpsimd(ctx, dec); // -> STR_Q_ldst_pos\n\tif(!size && V && opc==3) return LDR_imm_fpsimd(ctx, dec); // -> LDR_Q_ldst_pos\n\tif(size==1 && !V && !opc) return STRH_imm(ctx, dec); // -> STRH_32_ldst_pos\n\tif(size==1 && !V && opc==1) return LDRH_imm(ctx, dec); // -> LDRH_32_ldst_pos\n\tif(size==1 && !V && opc==2) return LDRSH_imm(ctx, dec); // -> LDRSH_64_ldst_pos\n\tif(size==1 && !V && opc==3) return LDRSH_imm(ctx, dec); // -> LDRSH_32_ldst_pos\n\tif(size==1 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_H_ldst_pos\n\tif(size==1 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_H_ldst_pos\n\tif(size==2 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_32_ldst_pos\n\tif(size==2 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_32_ldst_pos\n\tif(size==2 && !V && opc==2) return LDRSW_imm(ctx, dec); // -> LDRSW_64_ldst_pos\n\tif(size==2 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_S_ldst_pos\n\tif(size==2 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_S_ldst_pos\n\tif(size==3 && !V && !opc) return STR_imm_gen(ctx, dec); // -> STR_64_ldst_pos\n\tif(size==3 && !V && opc==1) return LDR_imm_gen(ctx, dec); // -> LDR_64_ldst_pos\n\tif(size==3 && !V && opc==2) return PRFM_imm(ctx, dec); // -> PRFM_P_ldst_pos\n\tif(size==3 && V && !opc) return STR_imm_fpsimd(ctx, dec); // -> STR_D_ldst_pos\n\tif(size==3 && V && opc==1) return LDR_imm_fpsimd(ctx, dec); // -> LDR_D_ldst_pos\n\tif((size&2)==2 && !V && opc==3) UNALLOCATED(ENC_UNALLOCATED_24_LDST_POS);\n\tif(size&1 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_35_LDST_POS);\n\tif((size&2)==2 && V && (opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_36_LDST_POS);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstpair_off(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=INSWORD>>30, V=(INSWORD>>26)&1, L=(INSWORD>>22)&1;\n\tif(!opc && !V && !L) return STP_gen(ctx, dec); // -> STP_32_ldstpair_off\n\tif(!opc && !V && L) return LDP_gen(ctx, dec); // -> LDP_32_ldstpair_off\n\tif(!opc && V && !L) return STP_fpsimd(ctx, dec); // -> STP_S_ldstpair_off\n\tif(!opc && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_S_ldstpair_off\n\tif(opc==1 && !V && !L && HasMTE()) return STGP(ctx, dec); // -> STGP_64_ldstpair_off\n\tif(opc==1 && !V && L) return LDPSW(ctx, dec); // -> LDPSW_64_ldstpair_off\n\tif(opc==1 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_D_ldstpair_off\n\tif(opc==1 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_D_ldstpair_off\n\tif(opc==2 && !V && !L) return STP_gen(ctx, dec); // -> STP_64_ldstpair_off\n\tif(opc==2 && !V && L) return LDP_gen(ctx, dec); // -> LDP_64_ldstpair_off\n\tif(opc==2 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_Q_ldstpair_off\n\tif(opc==2 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_Q_ldstpair_off\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_22_LDSTPAIR_OFF);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstpair_post(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=INSWORD>>30, V=(INSWORD>>26)&1, L=(INSWORD>>22)&1;\n\tif(!opc && !V && !L) return STP_gen(ctx, dec); // -> STP_32_ldstpair_post\n\tif(!opc && !V && L) return LDP_gen(ctx, dec); // -> LDP_32_ldstpair_post\n\tif(!opc && V && !L) return STP_fpsimd(ctx, dec); // -> STP_S_ldstpair_post\n\tif(!opc && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_S_ldstpair_post\n\tif(opc==1 && !V && !L && HasMTE()) return STGP(ctx, dec); // -> STGP_64_ldstpair_post\n\tif(opc==1 && !V && L) return LDPSW(ctx, dec); // -> LDPSW_64_ldstpair_post\n\tif(opc==1 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_D_ldstpair_post\n\tif(opc==1 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_D_ldstpair_post\n\tif(opc==2 && !V && !L) return STP_gen(ctx, dec); // -> STP_64_ldstpair_post\n\tif(opc==2 && !V && L) return LDP_gen(ctx, dec); // -> LDP_64_ldstpair_post\n\tif(opc==2 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_Q_ldstpair_post\n\tif(opc==2 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_Q_ldstpair_post\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_22_LDSTPAIR_POST);\n\tUNMATCHED;\n}\n\nint decode_iclass_ldstpair_pre(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=INSWORD>>30, V=(INSWORD>>26)&1, L=(INSWORD>>22)&1;\n\tif(!opc && !V && !L) return STP_gen(ctx, dec); // -> STP_32_ldstpair_pre\n\tif(!opc && !V && L) return LDP_gen(ctx, dec); // -> LDP_32_ldstpair_pre\n\tif(!opc && V && !L) return STP_fpsimd(ctx, dec); // -> STP_S_ldstpair_pre\n\tif(!opc && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_S_ldstpair_pre\n\tif(opc==1 && !V && !L && HasMTE()) return STGP(ctx, dec); // -> STGP_64_ldstpair_pre\n\tif(opc==1 && !V && L) return LDPSW(ctx, dec); // -> LDPSW_64_ldstpair_pre\n\tif(opc==1 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_D_ldstpair_pre\n\tif(opc==1 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_D_ldstpair_pre\n\tif(opc==2 && !V && !L) return STP_gen(ctx, dec); // -> STP_64_ldstpair_pre\n\tif(opc==2 && !V && L) return LDP_gen(ctx, dec); // -> LDP_64_ldstpair_pre\n\tif(opc==2 && V && !L) return STP_fpsimd(ctx, dec); // -> STP_Q_ldstpair_pre\n\tif(opc==2 && V && L) return LDP_fpsimd(ctx, dec); // -> LDP_Q_ldstpair_pre\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_22_LDSTPAIR_PRE);\n\tUNMATCHED;\n}\n\nint decode_iclass_addsub_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1;\n\tif(!sf && !op && !S) return ADD_addsub_imm(ctx, dec); // -> ADD_32_addsub_imm\n\tif(!sf && !op && S) return ADDS_addsub_imm(ctx, dec); // -> ADDS_32S_addsub_imm\n\tif(!sf && op && !S) return SUB_addsub_imm(ctx, dec); // -> SUB_32_addsub_imm\n\tif(!sf && op && S) return SUBS_addsub_imm(ctx, dec); // -> SUBS_32S_addsub_imm\n\tif(sf && !op && !S) return ADD_addsub_imm(ctx, dec); // -> ADD_64_addsub_imm\n\tif(sf && !op && S) return ADDS_addsub_imm(ctx, dec); // -> ADDS_64S_addsub_imm\n\tif(sf && op && !S) return SUB_addsub_imm(ctx, dec); // -> SUB_64_addsub_imm\n\tif(sf && op && S) return SUBS_addsub_imm(ctx, dec); // -> SUBS_64S_addsub_imm\n\tUNMATCHED;\n}\n\nint decode_iclass_addsub_immtags(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, o2=(INSWORD>>22)&1;\n\tif(sf && !op && !S && !o2 && HasMTE()) return ADDG(ctx, dec); // -> ADDG_64_addsub_immtags\n\tif(sf && op && !S && !o2 && HasMTE()) return SUBG(ctx, dec); // -> SUBG_64_addsub_immtags\n\tif(sf && S && !o2) UNALLOCATED(ENC_UNALLOCATED_11_ADDSUB_IMMTAGS);\n\tif(!sf && !o2) UNALLOCATED(ENC_UNALLOCATED_10_ADDSUB_IMMTAGS);\n\tif(o2) UNALLOCATED(ENC_UNALLOCATED_14_ADDSUB_IMMTAGS);\n\tUNMATCHED;\n}\n\nint decode_iclass_bitfield(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, opc=(INSWORD>>29)&3, N=(INSWORD>>22)&1;\n\tif(!sf && !opc && !N) return SBFM(ctx, dec); // -> SBFM_32M_bitfield\n\tif(!sf && opc==1 && !N) return BFM(ctx, dec); // -> BFM_32M_bitfield\n\tif(!sf && opc==2 && !N) return UBFM(ctx, dec); // -> UBFM_32M_bitfield\n\tif(sf && !opc && N) return SBFM(ctx, dec); // -> SBFM_64M_bitfield\n\tif(sf && opc==1 && N) return BFM(ctx, dec); // -> BFM_64M_bitfield\n\tif(sf && opc==2 && N) return UBFM(ctx, dec); // -> UBFM_64M_bitfield\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_19_BITFIELD);\n\tif(!sf && N) UNALLOCATED(ENC_UNALLOCATED_12_BITFIELD);\n\tif(sf && !N) UNALLOCATED(ENC_UNALLOCATED_11_BITFIELD);\n\tUNMATCHED;\n}\n\nint decode_iclass_extract(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op21=(INSWORD>>29)&3, N=(INSWORD>>22)&1, o0=(INSWORD>>21)&1, imms=(INSWORD>>10)&0x3f;\n\tif(!sf && !op21 && !N && !o0 && !(imms&0x20)) return EXTR(ctx, dec); // -> EXTR_32_extract\n\tif(sf && !op21 && N && !o0) return EXTR(ctx, dec); // -> EXTR_64_extract\n\tif(!op21 && o0) UNALLOCATED(ENC_UNALLOCATED_16_EXTRACT);\n\tif(!sf && (imms&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_13_EXTRACT);\n\tif(!sf && N) UNALLOCATED(ENC_UNALLOCATED_12_EXTRACT);\n\tif(sf && !N) UNALLOCATED(ENC_UNALLOCATED_11_EXTRACT);\n\tif(op21&1) UNALLOCATED(ENC_UNALLOCATED_17_EXTRACT);\n\tif((op21&2)==2) UNALLOCATED(ENC_UNALLOCATED_18_EXTRACT);\n\tUNMATCHED;\n}\n\nint decode_iclass_log_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, opc=(INSWORD>>29)&3, N=(INSWORD>>22)&1;\n\tif(!sf && !opc && !N) return AND_log_imm(ctx, dec); // -> AND_32_log_imm\n\tif(!sf && opc==1 && !N) return ORR_log_imm(ctx, dec); // -> ORR_32_log_imm\n\tif(!sf && opc==2 && !N) return EOR_log_imm(ctx, dec); // -> EOR_32_log_imm\n\tif(!sf && opc==3 && !N) return ANDS_log_imm(ctx, dec); // -> ANDS_32S_log_imm\n\tif(sf && !opc) return AND_log_imm(ctx, dec); // -> AND_64_log_imm\n\tif(sf && opc==1) return ORR_log_imm(ctx, dec); // -> ORR_64_log_imm\n\tif(sf && opc==2) return EOR_log_imm(ctx, dec); // -> EOR_64_log_imm\n\tif(sf && opc==3) return ANDS_log_imm(ctx, dec); // -> ANDS_64S_log_imm\n\tif(!sf && N) UNALLOCATED(ENC_UNALLOCATED_10_LOG_IMM);\n\tUNMATCHED;\n}\n\nint decode_iclass_movewide(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, opc=(INSWORD>>29)&3, hw=(INSWORD>>21)&3;\n\tif(!sf && !opc && !(hw&2)) return MOVN(ctx, dec); // -> MOVN_32_movewide\n\tif(!sf && opc==2 && !(hw&2)) return MOVZ(ctx, dec); // -> MOVZ_32_movewide\n\tif(!sf && opc==3 && !(hw&2)) return MOVK(ctx, dec); // -> MOVK_32_movewide\n\tif(sf && !opc) return MOVN(ctx, dec); // -> MOVN_64_movewide\n\tif(sf && opc==2) return MOVZ(ctx, dec); // -> MOVZ_64_movewide\n\tif(sf && opc==3) return MOVK(ctx, dec); // -> MOVK_64_movewide\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_13_MOVEWIDE);\n\tif(!sf && (hw&2)==2) UNALLOCATED(ENC_UNALLOCATED_10_MOVEWIDE);\n\tUNMATCHED;\n}\n\nint decode_iclass_pcreladdr(context *ctx, Instruction *dec)\n{\n\tuint32_t op=INSWORD>>31;\n\tif(!op) return ADR(ctx, dec); // -> ADR_only_pcreladdr\n\tif(op) return ADRP(ctx, dec); // -> ADRP_only_pcreladdr\n\tUNMATCHED;\n}\n\nint decode_iclass_addsub_ext(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, opt=(INSWORD>>22)&3, imm3=(INSWORD>>10)&7;\n\tif(!sf && !op && !S && !opt) return ADD_addsub_ext(ctx, dec); // -> ADD_32_addsub_ext\n\tif(!sf && !op && S && !opt) return ADDS_addsub_ext(ctx, dec); // -> ADDS_32S_addsub_ext\n\tif(!sf && op && !S && !opt) return SUB_addsub_ext(ctx, dec); // -> SUB_32_addsub_ext\n\tif(!sf && op && S && !opt) return SUBS_addsub_ext(ctx, dec); // -> SUBS_32S_addsub_ext\n\tif(sf && !op && !S && !opt) return ADD_addsub_ext(ctx, dec); // -> ADD_64_addsub_ext\n\tif(sf && !op && S && !opt) return ADDS_addsub_ext(ctx, dec); // -> ADDS_64S_addsub_ext\n\tif(sf && op && !S && !opt) return SUB_addsub_ext(ctx, dec); // -> SUB_64_addsub_ext\n\tif(sf && op && S && !opt) return SUBS_addsub_ext(ctx, dec); // -> SUBS_64S_addsub_ext\n\tif((imm3&5)==5) UNALLOCATED(ENC_UNALLOCATED_12_ADDSUB_EXT);\n\tif((imm3&6)==6) UNALLOCATED(ENC_UNALLOCATED_13_ADDSUB_EXT);\n\tif(opt&1) UNALLOCATED(ENC_UNALLOCATED_11_ADDSUB_EXT);\n\tif((opt&2)==2) UNALLOCATED(ENC_UNALLOCATED_10_ADDSUB_EXT);\n\tUNMATCHED;\n}\n\nint decode_iclass_addsub_shift(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, shift=(INSWORD>>22)&3, imm6=(INSWORD>>10)&0x3f;\n\tif(!sf && !op && !S) return ADD_addsub_shift(ctx, dec); // -> ADD_32_addsub_shift\n\tif(!sf && !op && S) return ADDS_addsub_shift(ctx, dec); // -> ADDS_32_addsub_shift\n\tif(!sf && op && !S) return SUB_addsub_shift(ctx, dec); // -> SUB_32_addsub_shift\n\tif(!sf && op && S) return SUBS_addsub_shift(ctx, dec); // -> SUBS_32_addsub_shift\n\tif(sf && !op && !S) return ADD_addsub_shift(ctx, dec); // -> ADD_64_addsub_shift\n\tif(sf && !op && S) return ADDS_addsub_shift(ctx, dec); // -> ADDS_64_addsub_shift\n\tif(sf && op && !S) return SUB_addsub_shift(ctx, dec); // -> SUB_64_addsub_shift\n\tif(sf && op && S) return SUBS_addsub_shift(ctx, dec); // -> SUBS_64_addsub_shift\n\tif(shift==3) UNALLOCATED(ENC_UNALLOCATED_10_ADDSUB_SHIFT);\n\tif(!sf && (imm6&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_11_ADDSUB_SHIFT);\n\tUNMATCHED;\n}\n\nint decode_iclass_addsub_carry(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1;\n\tif(!sf && !op && !S) return ADC(ctx, dec); // -> ADC_32_addsub_carry\n\tif(!sf && !op && S) return ADCS(ctx, dec); // -> ADCS_32_addsub_carry\n\tif(!sf && op && !S) return SBC(ctx, dec); // -> SBC_32_addsub_carry\n\tif(!sf && op && S) return SBCS(ctx, dec); // -> SBCS_32_addsub_carry\n\tif(sf && !op && !S) return ADC(ctx, dec); // -> ADC_64_addsub_carry\n\tif(sf && !op && S) return ADCS(ctx, dec); // -> ADCS_64_addsub_carry\n\tif(sf && op && !S) return SBC(ctx, dec); // -> SBC_64_addsub_carry\n\tif(sf && op && S) return SBCS(ctx, dec); // -> SBCS_64_addsub_carry\n\tUNMATCHED;\n}\n\nint decode_iclass_condcmp_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, o2=(INSWORD>>10)&1, o3=(INSWORD>>4)&1;\n\tif(!sf && !op && S && !o2 && !o3) return CCMN_imm(ctx, dec); // -> CCMN_32_condcmp_imm\n\tif(!sf && op && S && !o2 && !o3) return CCMP_imm(ctx, dec); // -> CCMP_32_condcmp_imm\n\tif(sf && !op && S && !o2 && !o3) return CCMN_imm(ctx, dec); // -> CCMN_64_condcmp_imm\n\tif(sf && op && S && !o2 && !o3) return CCMP_imm(ctx, dec); // -> CCMP_64_condcmp_imm\n\tif(o3) UNALLOCATED(ENC_UNALLOCATED_11_CONDCMP_IMM);\n\tif(o2) UNALLOCATED(ENC_UNALLOCATED_10_CONDCMP_IMM);\n\tif(!S) UNALLOCATED(ENC_UNALLOCATED_12_CONDCMP_IMM);\n\tUNMATCHED;\n}\n\nint decode_iclass_condcmp_reg(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, o2=(INSWORD>>10)&1, o3=(INSWORD>>4)&1;\n\tif(!sf && !op && S && !o2 && !o3) return CCMN_reg(ctx, dec); // -> CCMN_32_condcmp_reg\n\tif(!sf && op && S && !o2 && !o3) return CCMP_reg(ctx, dec); // -> CCMP_32_condcmp_reg\n\tif(sf && !op && S && !o2 && !o3) return CCMN_reg(ctx, dec); // -> CCMN_64_condcmp_reg\n\tif(sf && op && S && !o2 && !o3) return CCMP_reg(ctx, dec); // -> CCMP_64_condcmp_reg\n\tif(o3) UNALLOCATED(ENC_UNALLOCATED_11_CONDCMP_REG);\n\tif(o2) UNALLOCATED(ENC_UNALLOCATED_10_CONDCMP_REG);\n\tif(!S) UNALLOCATED(ENC_UNALLOCATED_12_CONDCMP_REG);\n\tUNMATCHED;\n}\n\nint decode_iclass_condsel(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, op2=(INSWORD>>10)&3;\n\tif(!sf && !op && !S && !op2) return CSEL(ctx, dec); // -> CSEL_32_condsel\n\tif(!sf && !op && !S && op2==1) return CSINC(ctx, dec); // -> CSINC_32_condsel\n\tif(!sf && op && !S && !op2) return CSINV(ctx, dec); // -> CSINV_32_condsel\n\tif(!sf && op && !S && op2==1) return CSNEG(ctx, dec); // -> CSNEG_32_condsel\n\tif(sf && !op && !S && !op2) return CSEL(ctx, dec); // -> CSEL_64_condsel\n\tif(sf && !op && !S && op2==1) return CSINC(ctx, dec); // -> CSINC_64_condsel\n\tif(sf && op && !S && !op2) return CSINV(ctx, dec); // -> CSINV_64_condsel\n\tif(sf && op && !S && op2==1) return CSNEG(ctx, dec); // -> CSNEG_64_condsel\n\tif((op2&2)==2) UNALLOCATED(ENC_UNALLOCATED_10_CONDSEL);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_11_CONDSEL);\n\tUNMATCHED;\n}\n\nint decode_iclass_dp_1src(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, S=(INSWORD>>29)&1, opcode2=(INSWORD>>16)&0x1f, opcode=(INSWORD>>10)&0x3f, Rn=(INSWORD>>5)&0x1f;\n\tif(sf && !S && opcode2==1 && opcode==8 && Rn==0x1f && HasPAuth()) return PACIA(ctx, dec); // -> PACIZA_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==9 && Rn==0x1f && HasPAuth()) return PACIB(ctx, dec); // -> PACIZB_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==10 && Rn==0x1f && HasPAuth()) return PACDA(ctx, dec); // -> PACDZA_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==11 && Rn==0x1f && HasPAuth()) return PACDB(ctx, dec); // -> PACDZB_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==12 && Rn==0x1f && HasPAuth()) return AUTIA(ctx, dec); // -> AUTIZA_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==13 && Rn==0x1f && HasPAuth()) return AUTIB(ctx, dec); // -> AUTIZB_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==14 && Rn==0x1f && HasPAuth()) return AUTDA(ctx, dec); // -> AUTDZA_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==15 && Rn==0x1f && HasPAuth()) return AUTDB(ctx, dec); // -> AUTDZB_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==0x10 && Rn==0x1f && HasPAuth()) return XPAC(ctx, dec); // -> XPACI_64Z_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==0x11 && Rn==0x1f && HasPAuth()) return XPAC(ctx, dec); // -> XPACD_64Z_dp_1src\n\tif(!sf && !S && !opcode2 && !opcode) return RBIT_int(ctx, dec); // -> RBIT_32_dp_1src\n\tif(!sf && !S && !opcode2 && opcode==1) return REV16_int(ctx, dec); // -> REV16_32_dp_1src\n\tif(!sf && !S && !opcode2 && opcode==2) return REV(ctx, dec); // -> REV_32_dp_1src\n\tif(!sf && !S && !opcode2 && opcode==3) UNALLOCATED(ENC_UNALLOCATED_28_DP_1SRC);\n\tif(!sf && !S && !opcode2 && opcode==4) return CLZ_int(ctx, dec); // -> CLZ_32_dp_1src\n\tif(!sf && !S && !opcode2 && opcode==5) return CLS_int(ctx, dec); // -> CLS_32_dp_1src\n\tif(sf && !S && !opcode2 && !opcode) return RBIT_int(ctx, dec); // -> RBIT_64_dp_1src\n\tif(sf && !S && !opcode2 && opcode==1) return REV16_int(ctx, dec); // -> REV16_64_dp_1src\n\tif(sf && !S && !opcode2 && opcode==2) return REV32_int(ctx, dec); // -> REV32_64_dp_1src\n\tif(sf && !S && !opcode2 && opcode==3) return REV(ctx, dec); // -> REV_64_dp_1src\n\tif(sf && !S && !opcode2 && opcode==4) return CLZ_int(ctx, dec); // -> CLZ_64_dp_1src\n\tif(sf && !S && !opcode2 && opcode==5) return CLS_int(ctx, dec); // -> CLS_64_dp_1src\n\tif(sf && !S && opcode2==1 && !opcode && HasPAuth()) return PACIA(ctx, dec); // -> PACIA_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==1 && HasPAuth()) return PACIB(ctx, dec); // -> PACIB_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==2 && HasPAuth()) return PACDA(ctx, dec); // -> PACDA_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==3 && HasPAuth()) return PACDB(ctx, dec); // -> PACDB_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==4 && HasPAuth()) return AUTIA(ctx, dec); // -> AUTIA_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==5 && HasPAuth()) return AUTIB(ctx, dec); // -> AUTIB_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==6 && HasPAuth()) return AUTDA(ctx, dec); // -> AUTDA_64P_dp_1src\n\tif(sf && !S && opcode2==1 && opcode==7 && HasPAuth()) return AUTDB(ctx, dec); // -> AUTDB_64P_dp_1src\n\tif(sf && !S && opcode2==1 && (opcode&0x3e)==0x12) UNALLOCATED(ENC_UNALLOCATED_15_DP_1SRC);\n\tif(!S && !opcode2 && (opcode&0x3e)==6) UNALLOCATED(ENC_UNALLOCATED_34_DP_1SRC);\n\tif(sf && !S && opcode2==1 && (opcode&0x3c)==0x14) UNALLOCATED(ENC_UNALLOCATED_16_DP_1SRC);\n\tif(sf && !S && opcode2==1 && (opcode&0x38)==0x18) UNALLOCATED(ENC_UNALLOCATED_17_DP_1SRC);\n\tif(!S && !opcode2 && (opcode&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_11_DP_1SRC);\n\tif(!S && !opcode2 && (opcode&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_12_DP_1SRC);\n\tif(!sf && opcode2==1) UNALLOCATED(ENC_UNALLOCATED_14_DP_1SRC);\n\tif((opcode&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_13_DP_1SRC);\n\tif((opcode2&2)==2) UNALLOCATED(ENC_UNALLOCATED_18_DP_1SRC);\n\tif((opcode2&4)==4) UNALLOCATED(ENC_UNALLOCATED_19_DP_1SRC);\n\tif((opcode2&8)==8) UNALLOCATED(ENC_UNALLOCATED_20_DP_1SRC);\n\tif((opcode2&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_21_DP_1SRC);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_DP_1SRC);\n\tUNMATCHED;\n}\n\nint decode_iclass_dp_2src(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, S=(INSWORD>>29)&1, opcode=(INSWORD>>10)&0x3f;\n\tif(!sf && !S && opcode==2) return UDIV(ctx, dec); // -> UDIV_32_dp_2src\n\tif(!sf && !S && opcode==3) return SDIV(ctx, dec); // -> SDIV_32_dp_2src\n\tif(!sf && !S && opcode==8) return LSLV(ctx, dec); // -> LSLV_32_dp_2src\n\tif(!sf && !S && opcode==9) return LSRV(ctx, dec); // -> LSRV_32_dp_2src\n\tif(!sf && !S && opcode==10) return ASRV(ctx, dec); // -> ASRV_32_dp_2src\n\tif(!sf && !S && opcode==11) return RORV(ctx, dec); // -> RORV_32_dp_2src\n\tif(!sf && !S && opcode==12) UNALLOCATED(ENC_UNALLOCATED_36_DP_2SRC);\n\tif(!sf && !S && opcode==0x10) return CRC32(ctx, dec); // -> CRC32B_32C_dp_2src\n\tif(!sf && !S && opcode==0x11) return CRC32(ctx, dec); // -> CRC32H_32C_dp_2src\n\tif(!sf && !S && opcode==0x12) return CRC32(ctx, dec); // -> CRC32W_32C_dp_2src\n\tif(!sf && !S && opcode==0x14) return CRC32C(ctx, dec); // -> CRC32CB_32C_dp_2src\n\tif(!sf && !S && opcode==0x15) return CRC32C(ctx, dec); // -> CRC32CH_32C_dp_2src\n\tif(!sf && !S && opcode==0x16) return CRC32C(ctx, dec); // -> CRC32CW_32C_dp_2src\n\tif(sf && !S && !opcode && HasMTE()) return SUBP(ctx, dec); // -> SUBP_64S_dp_2src\n\tif(sf && !S && opcode==2) return UDIV(ctx, dec); // -> UDIV_64_dp_2src\n\tif(sf && !S && opcode==3) return SDIV(ctx, dec); // -> SDIV_64_dp_2src\n\tif(sf && !S && opcode==4 && HasMTE()) return IRG(ctx, dec); // -> IRG_64I_dp_2src\n\tif(sf && !S && opcode==5 && HasMTE()) return GMI(ctx, dec); // -> GMI_64G_dp_2src\n\tif(sf && !S && opcode==8) return LSLV(ctx, dec); // -> LSLV_64_dp_2src\n\tif(sf && !S && opcode==9) return LSRV(ctx, dec); // -> LSRV_64_dp_2src\n\tif(sf && !S && opcode==10) return ASRV(ctx, dec); // -> ASRV_64_dp_2src\n\tif(sf && !S && opcode==11) return RORV(ctx, dec); // -> RORV_64_dp_2src\n\tif(sf && !S && opcode==12 && HasPAuth()) return PACGA(ctx, dec); // -> PACGA_64P_dp_2src\n\tif(sf && !S && opcode==0x13) return CRC32(ctx, dec); // -> CRC32X_64C_dp_2src\n\tif(sf && !S && opcode==0x17) return CRC32C(ctx, dec); // -> CRC32CX_64C_dp_2src\n\tif(sf && S && !opcode && HasMTE()) return SUBPS(ctx, dec); // -> SUBPS_64S_dp_2src\n\tif(!S && opcode==13) UNALLOCATED(ENC_UNALLOCATED_34_DP_2SRC);\n\tif(!sf && !opcode) UNALLOCATED(ENC_UNALLOCATED_11_DP_2SRC);\n\tif(!sf && !S && (opcode&0x3e)==4) UNALLOCATED(ENC_UNALLOCATED_21_DP_2SRC);\n\tif(!sf && !S && (opcode&0x3b)==0x13) UNALLOCATED(ENC_UNALLOCATED_47_DP_2SRC);\n\tif(opcode==1) UNALLOCATED(ENC_UNALLOCATED_14_DP_2SRC);\n\tif(!S && (opcode&0x3e)==6) UNALLOCATED(ENC_UNALLOCATED_24_DP_2SRC);\n\tif(!S && (opcode&0x3e)==14) UNALLOCATED(ENC_UNALLOCATED_35_DP_2SRC);\n\tif(S && (opcode&0x3e)==2) UNALLOCATED(ENC_UNALLOCATED_15_DP_2SRC);\n\tif(sf && !S && (opcode&0x39)==0x10) UNALLOCATED(ENC_UNALLOCATED_49_DP_2SRC);\n\tif(sf && !S && (opcode&0x3a)==0x10) UNALLOCATED(ENC_UNALLOCATED_48_DP_2SRC);\n\tif(S && (opcode&0x3c)==4) UNALLOCATED(ENC_UNALLOCATED_20_DP_2SRC);\n\tif(S && (opcode&0x38)==8) UNALLOCATED(ENC_UNALLOCATED_25_DP_2SRC);\n\tif((opcode&0x38)==0x18) UNALLOCATED(ENC_UNALLOCATED_50_DP_2SRC);\n\tif(S && (opcode&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_38_DP_2SRC);\n\tif((opcode&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_51_DP_2SRC);\n\tUNMATCHED;\n}\n\nint decode_iclass_dp_3src(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op54=(INSWORD>>29)&3, op31=(INSWORD>>21)&7, o0=(INSWORD>>15)&1;\n\tif(!sf && !op54 && !op31 && !o0) return MADD(ctx, dec); // -> MADD_32A_dp_3src\n\tif(!sf && !op54 && !op31 && o0) return MSUB(ctx, dec); // -> MSUB_32A_dp_3src\n\tif(!sf && !op54 && op31==1 && !o0) UNALLOCATED(ENC_UNALLOCATED_14_DP_3SRC);\n\tif(!sf && !op54 && op31==1 && o0) UNALLOCATED(ENC_UNALLOCATED_16_DP_3SRC);\n\tif(!sf && !op54 && op31==2 && !o0) UNALLOCATED(ENC_UNALLOCATED_18_DP_3SRC);\n\tif(!sf && !op54 && op31==5 && !o0) UNALLOCATED(ENC_UNALLOCATED_23_DP_3SRC);\n\tif(!sf && !op54 && op31==5 && o0) UNALLOCATED(ENC_UNALLOCATED_25_DP_3SRC);\n\tif(!sf && !op54 && op31==6 && !o0) UNALLOCATED(ENC_UNALLOCATED_27_DP_3SRC);\n\tif(sf && !op54 && !op31 && !o0) return MADD(ctx, dec); // -> MADD_64A_dp_3src\n\tif(sf && !op54 && !op31 && o0) return MSUB(ctx, dec); // -> MSUB_64A_dp_3src\n\tif(sf && !op54 && op31==1 && !o0) return SMADDL(ctx, dec); // -> SMADDL_64WA_dp_3src\n\tif(sf && !op54 && op31==1 && o0) return SMSUBL(ctx, dec); // -> SMSUBL_64WA_dp_3src\n\tif(sf && !op54 && op31==2 && !o0) return SMULH(ctx, dec); // -> SMULH_64_dp_3src\n\tif(sf && !op54 && op31==5 && !o0) return UMADDL(ctx, dec); // -> UMADDL_64WA_dp_3src\n\tif(sf && !op54 && op31==5 && o0) return UMSUBL(ctx, dec); // -> UMSUBL_64WA_dp_3src\n\tif(sf && !op54 && op31==6 && !o0) return UMULH(ctx, dec); // -> UMULH_64_dp_3src\n\tif(!op54 && op31==2 && o0) UNALLOCATED(ENC_UNALLOCATED_20_DP_3SRC);\n\tif(!op54 && op31==6 && o0) UNALLOCATED(ENC_UNALLOCATED_29_DP_3SRC);\n\tif(!op54 && op31==3) UNALLOCATED(ENC_UNALLOCATED_21_DP_3SRC);\n\tif(!op54 && op31==4) UNALLOCATED(ENC_UNALLOCATED_22_DP_3SRC);\n\tif(!op54 && op31==7) UNALLOCATED(ENC_UNALLOCATED_30_DP_3SRC);\n\tif(op54==1) UNALLOCATED(ENC_UNALLOCATED_31_DP_3SRC);\n\tif((op54&2)==2) UNALLOCATED(ENC_UNALLOCATED_32_DP_3SRC);\n\tUNMATCHED;\n}\n\nint decode_iclass_setf(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, opcode2=(INSWORD>>15)&0x3f, sz=(INSWORD>>14)&1, o3=(INSWORD>>4)&1, mask=INSWORD&15;\n\tif(!sf && !op && S && !opcode2 && !sz && !o3 && mask==13 && HasFlagM()) return SETF(ctx, dec); // -> SETF8_only_setf\n\tif(!sf && !op && S && !opcode2 && sz && !o3 && mask==13 && HasFlagM()) return SETF(ctx, dec); // -> SETF16_only_setf\n\tif(!sf && !op && S && !opcode2 && !o3 && mask!=13) UNALLOCATED(ENC_UNALLOCATED_11_SETF);\n\tif(!sf && !op && S && !opcode2 && o3) UNALLOCATED(ENC_UNALLOCATED_14_SETF);\n\tif(!sf && !op && S && opcode2) UNALLOCATED(ENC_UNALLOCATED_15_SETF);\n\tif(!sf && !op && !S) UNALLOCATED(ENC_UNALLOCATED_10_SETF);\n\tif(!sf && op) UNALLOCATED(ENC_UNALLOCATED_16_SETF);\n\tif(sf) UNALLOCATED(ENC_UNALLOCATED_17_SETF);\n\tUNMATCHED;\n}\n\nint decode_iclass_log_shift(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, opc=(INSWORD>>29)&3, N=(INSWORD>>21)&1, imm6=(INSWORD>>10)&0x3f;\n\tif(!sf && !opc && !N) return AND_log_shift(ctx, dec); // -> AND_32_log_shift\n\tif(!sf && !opc && N) return BIC_log_shift(ctx, dec); // -> BIC_32_log_shift\n\tif(!sf && opc==1 && !N) return ORR_log_shift(ctx, dec); // -> ORR_32_log_shift\n\tif(!sf && opc==1 && N) return ORN_log_shift(ctx, dec); // -> ORN_32_log_shift\n\tif(!sf && opc==2 && !N) return EOR_log_shift(ctx, dec); // -> EOR_32_log_shift\n\tif(!sf && opc==2 && N) return EON(ctx, dec); // -> EON_32_log_shift\n\tif(!sf && opc==3 && !N) return ANDS_log_shift(ctx, dec); // -> ANDS_32_log_shift\n\tif(!sf && opc==3 && N) return BICS(ctx, dec); // -> BICS_32_log_shift\n\tif(sf && !opc && !N) return AND_log_shift(ctx, dec); // -> AND_64_log_shift\n\tif(sf && !opc && N) return BIC_log_shift(ctx, dec); // -> BIC_64_log_shift\n\tif(sf && opc==1 && !N) return ORR_log_shift(ctx, dec); // -> ORR_64_log_shift\n\tif(sf && opc==1 && N) return ORN_log_shift(ctx, dec); // -> ORN_64_log_shift\n\tif(sf && opc==2 && !N) return EOR_log_shift(ctx, dec); // -> EOR_64_log_shift\n\tif(sf && opc==2 && N) return EON(ctx, dec); // -> EON_64_log_shift\n\tif(sf && opc==3 && !N) return ANDS_log_shift(ctx, dec); // -> ANDS_64_log_shift\n\tif(sf && opc==3 && N) return BICS(ctx, dec); // -> BICS_64_log_shift\n\tif(!sf && (imm6&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_10_LOG_SHIFT);\n\tUNMATCHED;\n}\n\nint decode_iclass_rmif(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, op=(INSWORD>>30)&1, S=(INSWORD>>29)&1, o2=(INSWORD>>4)&1;\n\tif(sf && !op && S && !o2 && HasFlagM()) return RMIF(ctx, dec); // -> RMIF_only_rmif\n\tif(sf && !op && S && o2) UNALLOCATED(ENC_UNALLOCATED_13_RMIF);\n\tif(sf && !op && !S) UNALLOCATED(ENC_UNALLOCATED_11_RMIF);\n\tif(sf && op) UNALLOCATED(ENC_UNALLOCATED_14_RMIF);\n\tif(!sf) UNALLOCATED(ENC_UNALLOCATED_10_RMIF);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdall(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && !size && opcode==12 && HasFP16()) return FMAXNMV_advsimd(ctx, dec); // -> FMAXNMV_asimdall_only_H\n\tif(!U && !size && opcode==15 && HasFP16()) return FMAXV_advsimd(ctx, dec); // -> FMAXV_asimdall_only_H\n\tif(!U && size==1 && opcode==12) UNALLOCATED(ENC_UNALLOCATED_21_ASIMDALL);\n\tif(!U && size==1 && opcode==15) UNALLOCATED(ENC_UNALLOCATED_29_ASIMDALL);\n\tif(!U && size==2 && opcode==12 && HasFP16()) return FMINNMV_advsimd(ctx, dec); // -> FMINNMV_asimdall_only_H\n\tif(!U && size==2 && opcode==15 && HasFP16()) return FMINV_advsimd(ctx, dec); // -> FMINV_asimdall_only_H\n\tif(!U && size==3 && opcode==12) UNALLOCATED(ENC_UNALLOCATED_24_ASIMDALL);\n\tif(!U && size==3 && opcode==15) UNALLOCATED(ENC_UNALLOCATED_32_ASIMDALL);\n\tif(U && !(size&2) && opcode==12) return FMAXNMV_advsimd(ctx, dec); // -> FMAXNMV_asimdall_only_SD\n\tif(U && !(size&2) && opcode==15) return FMAXV_advsimd(ctx, dec); // -> FMAXV_asimdall_only_SD\n\tif(U && (size&2)==2 && opcode==12) return FMINNMV_advsimd(ctx, dec); // -> FMINNMV_asimdall_only_SD\n\tif(U && (size&2)==2 && opcode==15) return FMINV_advsimd(ctx, dec); // -> FMINV_asimdall_only_SD\n\tif(!U && opcode==3) return SADDLV_advsimd(ctx, dec); // -> SADDLV_asimdall_only\n\tif(!U && opcode==10) return SMAXV_advsimd(ctx, dec); // -> SMAXV_asimdall_only\n\tif(!U && opcode==0x1a) return SMINV_advsimd(ctx, dec); // -> SMINV_asimdall_only\n\tif(!U && opcode==0x1b) return ADDV_advsimd(ctx, dec); // -> ADDV_asimdall_only\n\tif(U && opcode==3) return UADDLV_advsimd(ctx, dec); // -> UADDLV_asimdall_only\n\tif(U && opcode==10) return UMAXV_advsimd(ctx, dec); // -> UMAXV_asimdall_only\n\tif(U && opcode==0x1a) return UMINV_advsimd(ctx, dec); // -> UMINV_asimdall_only\n\tif(U && opcode==0x1b) UNALLOCATED(ENC_UNALLOCATED_39_ASIMDALL);\n\tif(opcode==2) UNALLOCATED(ENC_UNALLOCATED_12_ASIMDALL);\n\tif(opcode==11) UNALLOCATED(ENC_UNALLOCATED_19_ASIMDALL);\n\tif(opcode==13) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDALL);\n\tif(opcode==14) UNALLOCATED(ENC_UNALLOCATED_27_ASIMDALL);\n\tif(!(opcode&0x1e)) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDALL);\n\tif((opcode&0x1e)==8) UNALLOCATED(ENC_UNALLOCATED_16_ASIMDALL);\n\tif((opcode&0x1e)==0x18) UNALLOCATED(ENC_UNALLOCATED_35_ASIMDALL);\n\tif((opcode&0x1c)==4) UNALLOCATED(ENC_UNALLOCATED_15_ASIMDALL);\n\tif((opcode&0x1c)==0x1c) UNALLOCATED(ENC_UNALLOCATED_40_ASIMDALL);\n\tif((opcode&0x18)==0x10) UNALLOCATED(ENC_UNALLOCATED_34_ASIMDALL);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdins(context *ctx, Instruction *dec)\n{\n\tuint32_t Q=(INSWORD>>30)&1, op=(INSWORD>>29)&1, imm5=(INSWORD>>16)&0x1f, imm4=(INSWORD>>11)&15;\n\tif(Q && !op && (imm5&15)==8 && imm4==7) return UMOV_advsimd(ctx, dec); // -> UMOV_asimdins_X_x\n\tif(!Q && !op && imm4==3) UNALLOCATED(ENC_UNALLOCATED_17_ASIMDINS);\n\tif(!Q && !op && imm4==5) return SMOV_advsimd(ctx, dec); // -> SMOV_asimdins_W_w\n\tif(!Q && !op && imm4==7) return UMOV_advsimd(ctx, dec); // -> UMOV_asimdins_W_w\n\tif(Q && !op && imm4==3) return INS_advsimd_gen(ctx, dec); // -> INS_asimdins_IR_r\n\tif(Q && !op && imm4==5) return SMOV_advsimd(ctx, dec); // -> SMOV_asimdins_X_x\n\tif(!op && !imm4) return DUP_advsimd_elt(ctx, dec); // -> DUP_asimdins_DV_v\n\tif(!op && imm4==1) return DUP_advsimd_gen(ctx, dec); // -> DUP_asimdins_DR_r\n\tif(!op && imm4==2) UNALLOCATED(ENC_UNALLOCATED_15_ASIMDINS);\n\tif(!op && imm4==4) UNALLOCATED(ENC_UNALLOCATED_18_ASIMDINS);\n\tif(!op && imm4==6) UNALLOCATED(ENC_UNALLOCATED_21_ASIMDINS);\n\tif(!(imm5&15)) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDINS);\n\tif(!op && (imm4&8)==8) UNALLOCATED(ENC_UNALLOCATED_24_ASIMDINS);\n\tif(!Q && op) UNALLOCATED(ENC_UNALLOCATED_12_ASIMDINS);\n\tif(Q && op) return INS_advsimd_elt(ctx, dec); // -> INS_asimdins_IV_v\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdext(context *ctx, Instruction *dec)\n{\n\tuint32_t op2=(INSWORD>>22)&3;\n\tif(!op2) return EXT_advsimd(ctx, dec); // -> EXT_asimdext_only\n\tif(op2&1) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDEXT);\n\tif((op2&2)==2) UNALLOCATED(ENC_UNALLOCATED_12_ASIMDEXT);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdimm(context *ctx, Instruction *dec)\n{\n\tuint32_t Q=(INSWORD>>30)&1, op=(INSWORD>>29)&1, cmode=(INSWORD>>12)&15, o2=(INSWORD>>11)&1;\n\tif(!Q && op && cmode==14 && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_D_ds\n\tif(!Q && op && cmode==15 && !o2) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDIMM);\n\tif(Q && op && cmode==14 && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_D2_d\n\tif(Q && op && cmode==15 && !o2) return FMOV_advsimd(ctx, dec); // -> FMOV_asimdimm_D2_d\n\tif(!op && cmode==14 && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_N_b\n\tif(!op && cmode==14 && o2) UNALLOCATED(ENC_UNALLOCATED_31_ASIMDIMM);\n\tif(!op && cmode==15 && !o2) return FMOV_advsimd(ctx, dec); // -> FMOV_asimdimm_S_s\n\tif(!op && cmode==15 && o2 && HasFP16()) return FMOV_advsimd(ctx, dec); // -> FMOV_asimdimm_H_h\n\tif(!op && (cmode&13)==8 && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_L_hl\n\tif(!op && (cmode&13)==9 && !o2) return ORR_advsimd_imm(ctx, dec); // -> ORR_asimdimm_L_hl\n\tif(!op && (cmode&14)==12 && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_M_sm\n\tif(!op && (cmode&14)==12 && o2) UNALLOCATED(ENC_UNALLOCATED_30_ASIMDIMM);\n\tif(op && (cmode&13)==8 && !o2) return MVNI_advsimd(ctx, dec); // -> MVNI_asimdimm_L_hl\n\tif(op && (cmode&13)==9 && !o2) return BIC_advsimd_imm(ctx, dec); // -> BIC_asimdimm_L_hl\n\tif(op && (cmode&14)==12 && !o2) return MVNI_advsimd(ctx, dec); // -> MVNI_asimdimm_M_sm\n\tif(!op && !(cmode&9) && !o2) return MOVI_advsimd(ctx, dec); // -> MOVI_asimdimm_L_sl\n\tif(!op && (cmode&9)==1 && !o2) return ORR_advsimd_imm(ctx, dec); // -> ORR_asimdimm_L_sl\n\tif(!op && (cmode&12)==8 && o2) UNALLOCATED(ENC_UNALLOCATED_29_ASIMDIMM);\n\tif(op && !(cmode&9) && !o2) return MVNI_advsimd(ctx, dec); // -> MVNI_asimdimm_L_sl\n\tif(op && (cmode&9)==1 && !o2) return BIC_advsimd_imm(ctx, dec); // -> BIC_asimdimm_L_sl\n\tif(!op && !(cmode&8) && o2) UNALLOCATED(ENC_UNALLOCATED_28_ASIMDIMM);\n\tif(op && o2) UNALLOCATED(ENC_UNALLOCATED_27_ASIMDIMM);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdperm(context *ctx, Instruction *dec)\n{\n\tuint32_t opcode=(INSWORD>>12)&7;\n\tif(!opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDPERM);\n\tif(opcode==1) return UZP1_advsimd(ctx, dec); // -> UZP1_asimdperm_only\n\tif(opcode==2) return TRN1_advsimd(ctx, dec); // -> TRN1_asimdperm_only\n\tif(opcode==3) return ZIP1_advsimd(ctx, dec); // -> ZIP1_asimdperm_only\n\tif(opcode==4) UNALLOCATED(ENC_UNALLOCATED_15_ASIMDPERM);\n\tif(opcode==5) return UZP2_advsimd(ctx, dec); // -> UZP2_asimdperm_only\n\tif(opcode==6) return TRN2_advsimd(ctx, dec); // -> TRN2_asimdperm_only\n\tif(opcode==7) return ZIP2_advsimd(ctx, dec); // -> ZIP2_asimdperm_only\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdone(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>29)&1, imm4=(INSWORD>>11)&15;\n\tif(!op && !imm4) return DUP_advsimd_elt(ctx, dec); // -> DUP_asisdone_only\n\tif(!op && imm4&1) UNALLOCATED(ENC_UNALLOCATED_15_ASISDONE);\n\tif(!op && (imm4&2)==2) UNALLOCATED(ENC_UNALLOCATED_14_ASISDONE);\n\tif(!op && (imm4&4)==4) UNALLOCATED(ENC_UNALLOCATED_13_ASISDONE);\n\tif(!op && (imm4&8)==8) UNALLOCATED(ENC_UNALLOCATED_12_ASISDONE);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_17_ASISDONE);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdpair(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && !(size&2) && opcode==12 && HasFP16()) return FMAXNMP_advsimd_pair(ctx, dec); // -> FMAXNMP_asisdpair_only_H\n\tif(!U && !(size&2) && opcode==13 && HasFP16()) return FADDP_advsimd_pair(ctx, dec); // -> FADDP_asisdpair_only_H\n\tif(!U && !(size&2) && opcode==15 && HasFP16()) return FMAXP_advsimd_pair(ctx, dec); // -> FMAXP_asisdpair_only_H\n\tif(!U && (size&2)==2 && opcode==12 && HasFP16()) return FMINNMP_advsimd_pair(ctx, dec); // -> FMINNMP_asisdpair_only_H\n\tif(!U && (size&2)==2 && opcode==15 && HasFP16()) return FMINP_advsimd_pair(ctx, dec); // -> FMINP_asisdpair_only_H\n\tif(U && !(size&2) && opcode==12) return FMAXNMP_advsimd_pair(ctx, dec); // -> FMAXNMP_asisdpair_only_SD\n\tif(U && !(size&2) && opcode==13) return FADDP_advsimd_pair(ctx, dec); // -> FADDP_asisdpair_only_SD\n\tif(U && !(size&2) && opcode==15) return FMAXP_advsimd_pair(ctx, dec); // -> FMAXP_asisdpair_only_SD\n\tif(U && (size&2)==2 && opcode==12) return FMINNMP_advsimd_pair(ctx, dec); // -> FMINNMP_asisdpair_only_SD\n\tif(U && (size&2)==2 && opcode==15) return FMINP_advsimd_pair(ctx, dec); // -> FMINP_asisdpair_only_SD\n\tif((size&2)==2 && opcode==13) UNALLOCATED(ENC_UNALLOCATED_19_ASISDPAIR);\n\tif(!U && opcode==0x1b) return ADDP_advsimd_pair(ctx, dec); // -> ADDP_asisdpair_only\n\tif(U && opcode==0x1b) UNALLOCATED(ENC_UNALLOCATED_29_ASISDPAIR);\n\tif(opcode==14) UNALLOCATED(ENC_UNALLOCATED_20_ASISDPAIR);\n\tif(opcode==0x1a) UNALLOCATED(ENC_UNALLOCATED_27_ASISDPAIR);\n\tif((opcode&0x1e)==0x18) UNALLOCATED(ENC_UNALLOCATED_26_ASISDPAIR);\n\tif((opcode&0x1c)==8) UNALLOCATED(ENC_UNALLOCATED_12_ASISDPAIR);\n\tif((opcode&0x1c)==0x1c) UNALLOCATED(ENC_UNALLOCATED_30_ASISDPAIR);\n\tif(!(opcode&0x18)) UNALLOCATED(ENC_UNALLOCATED_11_ASISDPAIR);\n\tif((opcode&0x18)==0x10) UNALLOCATED(ENC_UNALLOCATED_25_ASISDPAIR);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdshf(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, immh=(INSWORD>>19)&15, opcode=(INSWORD>>11)&0x1f;\n\tif(!U && immh && !opcode) return SSHR_advsimd(ctx, dec); // -> SSHR_asisdshf_R\n\tif(!U && immh && opcode==2) return SSRA_advsimd(ctx, dec); // -> SSRA_asisdshf_R\n\tif(!U && immh && opcode==4) return SRSHR_advsimd(ctx, dec); // -> SRSHR_asisdshf_R\n\tif(!U && immh && opcode==6) return SRSRA_advsimd(ctx, dec); // -> SRSRA_asisdshf_R\n\tif(!U && immh && opcode==8) UNALLOCATED(ENC_UNALLOCATED_24_ASISDSHF);\n\tif(!U && immh && opcode==10) return SHL_advsimd(ctx, dec); // -> SHL_asisdshf_R\n\tif(!U && immh && opcode==12) UNALLOCATED(ENC_UNALLOCATED_30_ASISDSHF);\n\tif(!U && immh && opcode==14) return SQSHL_advsimd_imm(ctx, dec); // -> SQSHL_asisdshf_R\n\tif(!U && immh && opcode==0x10) UNALLOCATED(ENC_UNALLOCATED_36_ASISDSHF);\n\tif(!U && immh && opcode==0x11) UNALLOCATED(ENC_UNALLOCATED_38_ASISDSHF);\n\tif(!U && immh && opcode==0x12) return SQSHRN_advsimd(ctx, dec); // -> SQSHRN_asisdshf_N\n\tif(!U && immh && opcode==0x13) return SQRSHRN_advsimd(ctx, dec); // -> SQRSHRN_asisdshf_N\n\tif(!U && immh && opcode==0x1c) return SCVTF_advsimd_fix(ctx, dec); // -> SCVTF_asisdshf_C\n\tif(!U && immh && opcode==0x1f) return FCVTZS_advsimd_fix(ctx, dec); // -> FCVTZS_asisdshf_C\n\tif(U && immh && !opcode) return USHR_advsimd(ctx, dec); // -> USHR_asisdshf_R\n\tif(U && immh && opcode==2) return USRA_advsimd(ctx, dec); // -> USRA_asisdshf_R\n\tif(U && immh && opcode==4) return URSHR_advsimd(ctx, dec); // -> URSHR_asisdshf_R\n\tif(U && immh && opcode==6) return URSRA_advsimd(ctx, dec); // -> URSRA_asisdshf_R\n\tif(U && immh && opcode==8) return SRI_advsimd(ctx, dec); // -> SRI_asisdshf_R\n\tif(U && immh && opcode==10) return SLI_advsimd(ctx, dec); // -> SLI_asisdshf_R\n\tif(U && immh && opcode==12) return SQSHLU_advsimd(ctx, dec); // -> SQSHLU_asisdshf_R\n\tif(U && immh && opcode==14) return UQSHL_advsimd_imm(ctx, dec); // -> UQSHL_asisdshf_R\n\tif(U && immh && opcode==0x10) return SQSHRUN_advsimd(ctx, dec); // -> SQSHRUN_asisdshf_N\n\tif(U && immh && opcode==0x11) return SQRSHRUN_advsimd(ctx, dec); // -> SQRSHRUN_asisdshf_N\n\tif(U && immh && opcode==0x12) return UQSHRN_advsimd(ctx, dec); // -> UQSHRN_asisdshf_N\n\tif(U && immh && opcode==0x13) return UQRSHRN_advsimd(ctx, dec); // -> UQRSHRN_asisdshf_N\n\tif(U && immh && opcode==0x1c) return UCVTF_advsimd_fix(ctx, dec); // -> UCVTF_asisdshf_C\n\tif(U && immh && opcode==0x1f) return FCVTZU_advsimd_fix(ctx, dec); // -> FCVTZU_asisdshf_C\n\tif(immh && opcode==1) UNALLOCATED(ENC_UNALLOCATED_14_ASISDSHF);\n\tif(immh && opcode==3) UNALLOCATED(ENC_UNALLOCATED_17_ASISDSHF);\n\tif(immh && opcode==5) UNALLOCATED(ENC_UNALLOCATED_20_ASISDSHF);\n\tif(immh && opcode==7) UNALLOCATED(ENC_UNALLOCATED_23_ASISDSHF);\n\tif(immh && opcode==9) UNALLOCATED(ENC_UNALLOCATED_26_ASISDSHF);\n\tif(immh && opcode==11) UNALLOCATED(ENC_UNALLOCATED_29_ASISDSHF);\n\tif(immh && opcode==13) UNALLOCATED(ENC_UNALLOCATED_32_ASISDSHF);\n\tif(immh && opcode==15) UNALLOCATED(ENC_UNALLOCATED_35_ASISDSHF);\n\tif(immh && opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_48_ASISDSHF);\n\tif(immh && opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_49_ASISDSHF);\n\tif(immh && (opcode&0x1c)==0x14) UNALLOCATED(ENC_UNALLOCATED_44_ASISDSHF);\n\tif(immh && (opcode&0x1c)==0x18) UNALLOCATED(ENC_UNALLOCATED_45_ASISDSHF);\n\tif(!immh) UNALLOCATED(ENC_UNALLOCATED_11_ASISDSHF);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisddiff(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, opcode=(INSWORD>>12)&15;\n\tif(!U && opcode==9) return SQDMLAL_advsimd_vec(ctx, dec); // -> SQDMLAL_asisddiff_only\n\tif(!U && opcode==11) return SQDMLSL_advsimd_vec(ctx, dec); // -> SQDMLSL_asisddiff_only\n\tif(!U && opcode==13) return SQDMULL_advsimd_vec(ctx, dec); // -> SQDMULL_asisddiff_only\n\tif(U && opcode==9) UNALLOCATED(ENC_UNALLOCATED_15_ASISDDIFF);\n\tif(U && opcode==11) UNALLOCATED(ENC_UNALLOCATED_18_ASISDDIFF);\n\tif(U && opcode==13) UNALLOCATED(ENC_UNALLOCATED_21_ASISDDIFF);\n\tif(opcode==8) UNALLOCATED(ENC_UNALLOCATED_13_ASISDDIFF);\n\tif(opcode==10) UNALLOCATED(ENC_UNALLOCATED_16_ASISDDIFF);\n\tif(opcode==12) UNALLOCATED(ENC_UNALLOCATED_19_ASISDDIFF);\n\tif((opcode&14)==14) UNALLOCATED(ENC_UNALLOCATED_22_ASISDDIFF);\n\tif(!(opcode&12)) UNALLOCATED(ENC_UNALLOCATED_11_ASISDDIFF);\n\tif((opcode&12)==4) UNALLOCATED(ENC_UNALLOCATED_12_ASISDDIFF);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdsame(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>11)&0x1f;\n\tif(!U && !(size&2) && opcode==0x18) RESERVED(ENC_RESERVED_44_ASISDSAME);\n\tif(!U && !(size&2) && opcode==0x19) RESERVED(ENC_RESERVED_48_ASISDSAME);\n\tif(!U && !(size&2) && opcode==0x1a) RESERVED(ENC_RESERVED_52_ASISDSAME);\n\tif(!U && !(size&2) && opcode==0x1b) return FMULX_advsimd_vec(ctx, dec); // -> FMULX_asisdsame_only\n\tif(!U && !(size&2) && opcode==0x1c) return FCMEQ_advsimd_reg(ctx, dec); // -> FCMEQ_asisdsame_only\n\tif(!U && !(size&2) && opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_63_ASISDSAME);\n\tif(!U && !(size&2) && opcode==0x1e) RESERVED(ENC_RESERVED_67_ASISDSAME);\n\tif(!U && !(size&2) && opcode==0x1f) return FRECPS_advsimd(ctx, dec); // -> FRECPS_asisdsame_only\n\tif(!U && (size&2)==2 && opcode==0x18) RESERVED(ENC_RESERVED_46_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x19) RESERVED(ENC_RESERVED_50_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1a) RESERVED(ENC_RESERVED_54_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1c) UNALLOCATED(ENC_UNALLOCATED_61_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_65_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1e) RESERVED(ENC_RESERVED_69_ASISDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1f) return FRSQRTS_advsimd(ctx, dec); // -> FRSQRTS_asisdsame_only\n\tif(U && !(size&2) && opcode==0x18) RESERVED(ENC_RESERVED_45_ASISDSAME);\n\tif(U && !(size&2) && opcode==0x19) UNALLOCATED(ENC_UNALLOCATED_49_ASISDSAME);\n\tif(U && !(size&2) && opcode==0x1a) RESERVED(ENC_RESERVED_53_ASISDSAME);\n\tif(U && !(size&2) && opcode==0x1b) RESERVED(ENC_RESERVED_57_ASISDSAME);\n\tif(U && !(size&2) && opcode==0x1c) return FCMGE_advsimd_reg(ctx, dec); // -> FCMGE_asisdsame_only\n\tif(U && !(size&2) && opcode==0x1d) return FACGE_advsimd(ctx, dec); // -> FACGE_asisdsame_only\n\tif(U && !(size&2) && opcode==0x1e) RESERVED(ENC_RESERVED_68_ASISDSAME);\n\tif(U && !(size&2) && opcode==0x1f) RESERVED(ENC_RESERVED_72_ASISDSAME);\n\tif(U && (size&2)==2 && opcode==0x18) RESERVED(ENC_RESERVED_47_ASISDSAME);\n\tif(U && (size&2)==2 && opcode==0x19) UNALLOCATED(ENC_UNALLOCATED_51_ASISDSAME);\n\tif(U && (size&2)==2 && opcode==0x1a) return FABD_advsimd(ctx, dec); // -> FABD_asisdsame_only\n\tif(U && (size&2)==2 && opcode==0x1c) return FCMGT_advsimd_reg(ctx, dec); // -> FCMGT_asisdsame_only\n\tif(U && (size&2)==2 && opcode==0x1d) return FACGT_advsimd(ctx, dec); // -> FACGT_asisdsame_only\n\tif(U && (size&2)==2 && opcode==0x1e) RESERVED(ENC_RESERVED_70_ASISDSAME);\n\tif(U && (size&2)==2 && opcode==0x1f) RESERVED(ENC_RESERVED_74_ASISDSAME);\n\tif((size&2)==2 && opcode==0x1b) UNALLOCATED(ENC_UNALLOCATED_58_ASISDSAME);\n\tif(!U && opcode==1) return SQADD_advsimd(ctx, dec); // -> SQADD_asisdsame_only\n\tif(!U && opcode==5) return SQSUB_advsimd(ctx, dec); // -> SQSUB_asisdsame_only\n\tif(!U && opcode==6) return CMGT_advsimd_reg(ctx, dec); // -> CMGT_asisdsame_only\n\tif(!U && opcode==7) return CMGE_advsimd_reg(ctx, dec); // -> CMGE_asisdsame_only\n\tif(!U && opcode==8) return SSHL_advsimd(ctx, dec); // -> SSHL_asisdsame_only\n\tif(!U && opcode==9) return SQSHL_advsimd_reg(ctx, dec); // -> SQSHL_asisdsame_only\n\tif(!U && opcode==10) return SRSHL_advsimd(ctx, dec); // -> SRSHL_asisdsame_only\n\tif(!U && opcode==11) return SQRSHL_advsimd(ctx, dec); // -> SQRSHL_asisdsame_only\n\tif(!U && opcode==0x10) return ADD_advsimd(ctx, dec); // -> ADD_asisdsame_only\n\tif(!U && opcode==0x11) return CMTST_advsimd(ctx, dec); // -> CMTST_asisdsame_only\n\tif(!U && opcode==0x14) RESERVED(ENC_RESERVED_36_ASISDSAME);\n\tif(!U && opcode==0x15) RESERVED(ENC_RESERVED_38_ASISDSAME);\n\tif(!U && opcode==0x16) return SQDMULH_advsimd_vec(ctx, dec); // -> SQDMULH_asisdsame_only\n\tif(!U && opcode==0x17) RESERVED(ENC_RESERVED_42_ASISDSAME);\n\tif(U && opcode==1) return UQADD_advsimd(ctx, dec); // -> UQADD_asisdsame_only\n\tif(U && opcode==5) return UQSUB_advsimd(ctx, dec); // -> UQSUB_asisdsame_only\n\tif(U && opcode==6) return CMHI_advsimd(ctx, dec); // -> CMHI_asisdsame_only\n\tif(U && opcode==7) return CMHS_advsimd(ctx, dec); // -> CMHS_asisdsame_only\n\tif(U && opcode==8) return USHL_advsimd(ctx, dec); // -> USHL_asisdsame_only\n\tif(U && opcode==9) return UQSHL_advsimd_reg(ctx, dec); // -> UQSHL_asisdsame_only\n\tif(U && opcode==10) return URSHL_advsimd(ctx, dec); // -> URSHL_asisdsame_only\n\tif(U && opcode==11) return UQRSHL_advsimd(ctx, dec); // -> UQRSHL_asisdsame_only\n\tif(U && opcode==0x10) return SUB_advsimd(ctx, dec); // -> SUB_asisdsame_only\n\tif(U && opcode==0x11) return CMEQ_advsimd_reg(ctx, dec); // -> CMEQ_asisdsame_only\n\tif(U && opcode==0x14) RESERVED(ENC_RESERVED_37_ASISDSAME);\n\tif(U && opcode==0x15) RESERVED(ENC_RESERVED_39_ASISDSAME);\n\tif(U && opcode==0x16) return SQRDMULH_advsimd_vec(ctx, dec); // -> SQRDMULH_asisdsame_only\n\tif(U && opcode==0x17) UNALLOCATED(ENC_UNALLOCATED_43_ASISDSAME);\n\tif(!opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASISDSAME);\n\tif(opcode==4) UNALLOCATED(ENC_UNALLOCATED_15_ASISDSAME);\n\tif((opcode&0x1e)==2) UNALLOCATED(ENC_UNALLOCATED_14_ASISDSAME);\n\tif((opcode&0x1e)==0x12) UNALLOCATED(ENC_UNALLOCATED_35_ASISDSAME);\n\tif((opcode&0x1c)==12) UNALLOCATED(ENC_UNALLOCATED_30_ASISDSAME);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdsamefp16(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, a=(INSWORD>>23)&1, opcode=(INSWORD>>11)&7;\n\tif(!U && !a && opcode==3 && HasFP16()) return FMULX_advsimd_vec(ctx, dec); // -> FMULX_asisdsamefp16_only\n\tif(!U && !a && opcode==4 && HasFP16()) return FCMEQ_advsimd_reg(ctx, dec); // -> FCMEQ_asisdsamefp16_only\n\tif(!U && !a && opcode==5) UNALLOCATED(ENC_UNALLOCATED_19_ASISDSAMEFP16);\n\tif(!U && !a && opcode==7 && HasFP16()) return FRECPS_advsimd(ctx, dec); // -> FRECPS_asisdsamefp16_only\n\tif(!U && a && opcode==4) UNALLOCATED(ENC_UNALLOCATED_17_ASISDSAMEFP16);\n\tif(!U && a && opcode==5) UNALLOCATED(ENC_UNALLOCATED_21_ASISDSAMEFP16);\n\tif(!U && a && opcode==7 && HasFP16()) return FRSQRTS_advsimd(ctx, dec); // -> FRSQRTS_asisdsamefp16_only\n\tif(U && !a && opcode==3) UNALLOCATED(ENC_UNALLOCATED_13_ASISDSAMEFP16);\n\tif(U && !a && opcode==4 && HasFP16()) return FCMGE_advsimd_reg(ctx, dec); // -> FCMGE_asisdsamefp16_only\n\tif(U && !a && opcode==5 && HasFP16()) return FACGE_advsimd(ctx, dec); // -> FACGE_asisdsamefp16_only\n\tif(U && !a && opcode==7) UNALLOCATED(ENC_UNALLOCATED_25_ASISDSAMEFP16);\n\tif(U && a && opcode==2 && HasFP16()) return FABD_advsimd(ctx, dec); // -> FABD_asisdsamefp16_only\n\tif(U && a && opcode==4 && HasFP16()) return FCMGT_advsimd_reg(ctx, dec); // -> FCMGT_asisdsamefp16_only\n\tif(U && a && opcode==5 && HasFP16()) return FACGT_advsimd(ctx, dec); // -> FACGT_asisdsamefp16_only\n\tif(U && a && opcode==7) UNALLOCATED(ENC_UNALLOCATED_27_ASISDSAMEFP16);\n\tif(a && opcode==3) UNALLOCATED(ENC_UNALLOCATED_14_ASISDSAMEFP16);\n\tif(opcode==6) UNALLOCATED(ENC_UNALLOCATED_23_ASISDSAMEFP16);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdsame2(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, opcode=(INSWORD>>11)&15;\n\tif(!U && !opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASISDSAME2);\n\tif(!U && opcode==1) UNALLOCATED(ENC_UNALLOCATED_13_ASISDSAME2);\n\tif(U && !opcode && HasRDM()) return SQRDMLAH_advsimd_vec(ctx, dec); // -> SQRDMLAH_asisdsame2_only\n\tif(U && opcode==1 && HasRDM()) return SQRDMLSH_advsimd_vec(ctx, dec); // -> SQRDMLSH_asisdsame2_only\n\tif((opcode&14)==2) UNALLOCATED(ENC_UNALLOCATED_15_ASISDSAME2);\n\tif((opcode&12)==4) UNALLOCATED(ENC_UNALLOCATED_16_ASISDSAME2);\n\tif((opcode&8)==8) UNALLOCATED(ENC_UNALLOCATED_17_ASISDSAME2);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdmisc(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && !(size&2) && opcode==0x16) UNALLOCATED(ENC_UNALLOCATED_42_ASISDMISC);\n\tif(!U && !(size&2) && opcode==0x1a) return FCVTNS_advsimd(ctx, dec); // -> FCVTNS_asisdmisc_R\n\tif(!U && !(size&2) && opcode==0x1b) return FCVTMS_advsimd(ctx, dec); // -> FCVTMS_asisdmisc_R\n\tif(!U && !(size&2) && opcode==0x1c) return FCVTAS_advsimd(ctx, dec); // -> FCVTAS_asisdmisc_R\n\tif(!U && !(size&2) && opcode==0x1d) return SCVTF_advsimd_int(ctx, dec); // -> SCVTF_asisdmisc_R\n\tif(!U && (size&2)==2 && opcode==12) return FCMGT_advsimd_zero(ctx, dec); // -> FCMGT_asisdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==13) return FCMEQ_advsimd_zero(ctx, dec); // -> FCMEQ_asisdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==14) return FCMLT_advsimd(ctx, dec); // -> FCMLT_asisdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==0x1a) return FCVTPS_advsimd(ctx, dec); // -> FCVTPS_asisdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1b) return FCVTZS_advsimd_int(ctx, dec); // -> FCVTZS_asisdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1d) return FRECPE_advsimd(ctx, dec); // -> FRECPE_asisdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1f) return FRECPX_advsimd(ctx, dec); // -> FRECPX_asisdmisc_R\n\tif(U && !(size&2) && opcode==0x16) return FCVTXN_advsimd(ctx, dec); // -> FCVTXN_asisdmisc_N\n\tif(U && !(size&2) && opcode==0x1a) return FCVTNU_advsimd(ctx, dec); // -> FCVTNU_asisdmisc_R\n\tif(U && !(size&2) && opcode==0x1b) return FCVTMU_advsimd(ctx, dec); // -> FCVTMU_asisdmisc_R\n\tif(U && !(size&2) && opcode==0x1c) return FCVTAU_advsimd(ctx, dec); // -> FCVTAU_asisdmisc_R\n\tif(U && !(size&2) && opcode==0x1d) return UCVTF_advsimd_int(ctx, dec); // -> UCVTF_asisdmisc_R\n\tif(U && (size&2)==2 && opcode==12) return FCMGE_advsimd_zero(ctx, dec); // -> FCMGE_asisdmisc_FZ\n\tif(U && (size&2)==2 && opcode==13) return FCMLE_advsimd(ctx, dec); // -> FCMLE_asisdmisc_FZ\n\tif(U && (size&2)==2 && opcode==14) UNALLOCATED(ENC_UNALLOCATED_33_ASISDMISC);\n\tif(U && (size&2)==2 && opcode==0x1a) return FCVTPU_advsimd(ctx, dec); // -> FCVTPU_asisdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1b) return FCVTZU_advsimd_int(ctx, dec); // -> FCVTZU_asisdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1d) return FRSQRTE_advsimd(ctx, dec); // -> FRSQRTE_asisdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_65_ASISDMISC);\n\tif(!(size&2) && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_63_ASISDMISC);\n\tif((size&2)==2 && opcode==0x16) UNALLOCATED(ENC_UNALLOCATED_44_ASISDMISC);\n\tif((size&2)==2 && opcode==0x1c) UNALLOCATED(ENC_UNALLOCATED_57_ASISDMISC);\n\tif(!U && opcode==3) return SUQADD_advsimd(ctx, dec); // -> SUQADD_asisdmisc_R\n\tif(!U && opcode==7) return SQABS_advsimd(ctx, dec); // -> SQABS_asisdmisc_R\n\tif(!U && opcode==8) return CMGT_advsimd_zero(ctx, dec); // -> CMGT_asisdmisc_Z\n\tif(!U && opcode==9) return CMEQ_advsimd_zero(ctx, dec); // -> CMEQ_asisdmisc_Z\n\tif(!U && opcode==10) return CMLT_advsimd(ctx, dec); // -> CMLT_asisdmisc_Z\n\tif(!U && opcode==11) return ABS_advsimd(ctx, dec); // -> ABS_asisdmisc_R\n\tif(!U && opcode==0x12) UNALLOCATED(ENC_UNALLOCATED_36_ASISDMISC);\n\tif(!U && opcode==0x14) return SQXTN_advsimd(ctx, dec); // -> SQXTN_asisdmisc_N\n\tif(U && opcode==3) return USQADD_advsimd(ctx, dec); // -> USQADD_asisdmisc_R\n\tif(U && opcode==7) return SQNEG_advsimd(ctx, dec); // -> SQNEG_asisdmisc_R\n\tif(U && opcode==8) return CMGE_advsimd_zero(ctx, dec); // -> CMGE_asisdmisc_Z\n\tif(U && opcode==9) return CMLE_advsimd(ctx, dec); // -> CMLE_asisdmisc_Z\n\tif(U && opcode==10) UNALLOCATED(ENC_UNALLOCATED_24_ASISDMISC);\n\tif(U && opcode==11) return NEG_advsimd(ctx, dec); // -> NEG_asisdmisc_R\n\tif(U && opcode==0x12) return SQXTUN_advsimd(ctx, dec); // -> SQXTUN_asisdmisc_N\n\tif(U && opcode==0x14) return UQXTN_advsimd(ctx, dec); // -> UQXTN_asisdmisc_N\n\tif(opcode==2) UNALLOCATED(ENC_UNALLOCATED_12_ASISDMISC);\n\tif(opcode==6) UNALLOCATED(ENC_UNALLOCATED_16_ASISDMISC);\n\tif(opcode==15) UNALLOCATED(ENC_UNALLOCATED_34_ASISDMISC);\n\tif(opcode==0x13) UNALLOCATED(ENC_UNALLOCATED_38_ASISDMISC);\n\tif(opcode==0x15) UNALLOCATED(ENC_UNALLOCATED_41_ASISDMISC);\n\tif(opcode==0x17) UNALLOCATED(ENC_UNALLOCATED_45_ASISDMISC);\n\tif(opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_62_ASISDMISC);\n\tif(!(opcode&0x1e)) UNALLOCATED(ENC_UNALLOCATED_11_ASISDMISC);\n\tif((opcode&0x1e)==4) UNALLOCATED(ENC_UNALLOCATED_15_ASISDMISC);\n\tif((opcode&0x1e)==0x10) UNALLOCATED(ENC_UNALLOCATED_35_ASISDMISC);\n\tif((opcode&0x1e)==0x18) UNALLOCATED(ENC_UNALLOCATED_46_ASISDMISC);\n\tif(!(size&2) && (opcode&0x1c)==12) UNALLOCATED(ENC_UNALLOCATED_27_ASISDMISC);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdmiscfp16(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, a=(INSWORD>>23)&1, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && !a && opcode==0x1a && HasFP16()) return FCVTNS_advsimd(ctx, dec); // -> FCVTNS_asisdmiscfp16_R\n\tif(!U && !a && opcode==0x1b && HasFP16()) return FCVTMS_advsimd(ctx, dec); // -> FCVTMS_asisdmiscfp16_R\n\tif(!U && !a && opcode==0x1c && HasFP16()) return FCVTAS_advsimd(ctx, dec); // -> FCVTAS_asisdmiscfp16_R\n\tif(!U && !a && opcode==0x1d && HasFP16()) return SCVTF_advsimd_int(ctx, dec); // -> SCVTF_asisdmiscfp16_R\n\tif(!U && a && opcode==12 && HasFP16()) return FCMGT_advsimd_zero(ctx, dec); // -> FCMGT_asisdmiscfp16_FZ\n\tif(!U && a && opcode==13 && HasFP16()) return FCMEQ_advsimd_zero(ctx, dec); // -> FCMEQ_asisdmiscfp16_FZ\n\tif(!U && a && opcode==14 && HasFP16()) return FCMLT_advsimd(ctx, dec); // -> FCMLT_asisdmiscfp16_FZ\n\tif(!U && a && opcode==0x1a && HasFP16()) return FCVTPS_advsimd(ctx, dec); // -> FCVTPS_asisdmiscfp16_R\n\tif(!U && a && opcode==0x1b && HasFP16()) return FCVTZS_advsimd_int(ctx, dec); // -> FCVTZS_asisdmiscfp16_R\n\tif(!U && a && opcode==0x1d && HasFP16()) return FRECPE_advsimd(ctx, dec); // -> FRECPE_asisdmiscfp16_R\n\tif(!U && a && opcode==0x1f && HasFP16()) return FRECPX_advsimd(ctx, dec); // -> FRECPX_asisdmiscfp16_R\n\tif(U && !a && opcode==0x1a && HasFP16()) return FCVTNU_advsimd(ctx, dec); // -> FCVTNU_asisdmiscfp16_R\n\tif(U && !a && opcode==0x1b && HasFP16()) return FCVTMU_advsimd(ctx, dec); // -> FCVTMU_asisdmiscfp16_R\n\tif(U && !a && opcode==0x1c && HasFP16()) return FCVTAU_advsimd(ctx, dec); // -> FCVTAU_asisdmiscfp16_R\n\tif(U && !a && opcode==0x1d && HasFP16()) return UCVTF_advsimd_int(ctx, dec); // -> UCVTF_asisdmiscfp16_R\n\tif(U && a && opcode==12 && HasFP16()) return FCMGE_advsimd_zero(ctx, dec); // -> FCMGE_asisdmiscfp16_FZ\n\tif(U && a && opcode==13 && HasFP16()) return FCMLE_advsimd(ctx, dec); // -> FCMLE_asisdmiscfp16_FZ\n\tif(U && a && opcode==14) UNALLOCATED(ENC_UNALLOCATED_19_ASISDMISCFP16);\n\tif(U && a && opcode==0x1a && HasFP16()) return FCVTPU_advsimd(ctx, dec); // -> FCVTPU_asisdmiscfp16_R\n\tif(U && a && opcode==0x1b && HasFP16()) return FCVTZU_advsimd_int(ctx, dec); // -> FCVTZU_asisdmiscfp16_R\n\tif(U && a && opcode==0x1d && HasFP16()) return FRSQRTE_advsimd(ctx, dec); // -> FRSQRTE_asisdmiscfp16_R\n\tif(U && a && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_41_ASISDMISCFP16);\n\tif(!a && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_39_ASISDMISCFP16);\n\tif(a && opcode==15) UNALLOCATED(ENC_UNALLOCATED_20_ASISDMISCFP16);\n\tif(a && opcode==0x1c) UNALLOCATED(ENC_UNALLOCATED_33_ASISDMISCFP16);\n\tif(opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_38_ASISDMISCFP16);\n\tif((opcode&0x1e)==0x18) UNALLOCATED(ENC_UNALLOCATED_22_ASISDMISCFP16);\n\tif(!a && (opcode&0x1c)==12) UNALLOCATED(ENC_UNALLOCATED_13_ASISDMISCFP16);\n\tif((opcode&0x1c)==8) UNALLOCATED(ENC_UNALLOCATED_12_ASISDMISCFP16);\n\tif(!(opcode&0x18)) UNALLOCATED(ENC_UNALLOCATED_11_ASISDMISCFP16);\n\tif((opcode&0x18)==0x10) UNALLOCATED(ENC_UNALLOCATED_21_ASISDMISCFP16);\n\tUNMATCHED;\n}\n\nint decode_iclass_asisdelem(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&15;\n\tif(!U && !size && opcode==1 && HasFP16()) return FMLA_advsimd_elt(ctx, dec); // -> FMLA_asisdelem_RH_H\n\tif(!U && !size && opcode==5 && HasFP16()) return FMLS_advsimd_elt(ctx, dec); // -> FMLS_asisdelem_RH_H\n\tif(!U && !size && opcode==9 && HasFP16()) return FMUL_advsimd_elt(ctx, dec); // -> FMUL_asisdelem_RH_H\n\tif(U && !size && opcode==1) UNALLOCATED(ENC_UNALLOCATED_13_ASISDELEM);\n\tif(U && !size && opcode==5) UNALLOCATED(ENC_UNALLOCATED_22_ASISDELEM);\n\tif(U && !size && opcode==9 && HasFP16()) return FMULX_advsimd_elt(ctx, dec); // -> FMULX_asisdelem_RH_H\n\tif(size==1 && opcode==1) UNALLOCATED(ENC_UNALLOCATED_14_ASISDELEM);\n\tif(size==1 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_23_ASISDELEM);\n\tif(size==1 && opcode==9) UNALLOCATED(ENC_UNALLOCATED_32_ASISDELEM);\n\tif(!U && (size&2)==2 && opcode==1) return FMLA_advsimd_elt(ctx, dec); // -> FMLA_asisdelem_R_SD\n\tif(!U && (size&2)==2 && opcode==5) return FMLS_advsimd_elt(ctx, dec); // -> FMLS_asisdelem_R_SD\n\tif(!U && (size&2)==2 && opcode==9) return FMUL_advsimd_elt(ctx, dec); // -> FMUL_asisdelem_R_SD\n\tif(U && (size&2)==2 && opcode==1) UNALLOCATED(ENC_UNALLOCATED_16_ASISDELEM);\n\tif(U && (size&2)==2 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_25_ASISDELEM);\n\tif(U && (size&2)==2 && opcode==9) return FMULX_advsimd_elt(ctx, dec); // -> FMULX_asisdelem_R_SD\n\tif(!U && opcode==3) return SQDMLAL_advsimd_elt(ctx, dec); // -> SQDMLAL_asisdelem_L\n\tif(!U && opcode==7) return SQDMLSL_advsimd_elt(ctx, dec); // -> SQDMLSL_asisdelem_L\n\tif(!U && opcode==11) return SQDMULL_advsimd_elt(ctx, dec); // -> SQDMULL_asisdelem_L\n\tif(!U && opcode==12) return SQDMULH_advsimd_elt(ctx, dec); // -> SQDMULH_asisdelem_R\n\tif(!U && opcode==13) return SQRDMULH_advsimd_elt(ctx, dec); // -> SQRDMULH_asisdelem_R\n\tif(!U && opcode==15) UNALLOCATED(ENC_UNALLOCATED_43_ASISDELEM);\n\tif(U && opcode==3) UNALLOCATED(ENC_UNALLOCATED_19_ASISDELEM);\n\tif(U && opcode==7) UNALLOCATED(ENC_UNALLOCATED_28_ASISDELEM);\n\tif(U && opcode==11) UNALLOCATED(ENC_UNALLOCATED_37_ASISDELEM);\n\tif(U && opcode==12) UNALLOCATED(ENC_UNALLOCATED_39_ASISDELEM);\n\tif(U && opcode==13 && HasRDM()) return SQRDMLAH_advsimd_elt(ctx, dec); // -> SQRDMLAH_asisdelem_R\n\tif(U && opcode==15 && HasRDM()) return SQRDMLSH_advsimd_elt(ctx, dec); // -> SQRDMLSH_asisdelem_R\n\tif(!opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASISDELEM);\n\tif(opcode==2) UNALLOCATED(ENC_UNALLOCATED_17_ASISDELEM);\n\tif(opcode==4) UNALLOCATED(ENC_UNALLOCATED_20_ASISDELEM);\n\tif(opcode==6) UNALLOCATED(ENC_UNALLOCATED_26_ASISDELEM);\n\tif(opcode==8) UNALLOCATED(ENC_UNALLOCATED_29_ASISDELEM);\n\tif(opcode==10) UNALLOCATED(ENC_UNALLOCATED_35_ASISDELEM);\n\tif(opcode==14) UNALLOCATED(ENC_UNALLOCATED_42_ASISDELEM);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdshf(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, opcode=(INSWORD>>11)&0x1f;\n\tif(!U && !opcode) return SSHR_advsimd(ctx, dec); // -> SSHR_asimdshf_R\n\tif(!U && opcode==2) return SSRA_advsimd(ctx, dec); // -> SSRA_asimdshf_R\n\tif(!U && opcode==4) return SRSHR_advsimd(ctx, dec); // -> SRSHR_asimdshf_R\n\tif(!U && opcode==6) return SRSRA_advsimd(ctx, dec); // -> SRSRA_asimdshf_R\n\tif(!U && opcode==8) UNALLOCATED(ENC_UNALLOCATED_23_ASIMDSHF);\n\tif(!U && opcode==10) return SHL_advsimd(ctx, dec); // -> SHL_asimdshf_R\n\tif(!U && opcode==12) UNALLOCATED(ENC_UNALLOCATED_29_ASIMDSHF);\n\tif(!U && opcode==14) return SQSHL_advsimd_imm(ctx, dec); // -> SQSHL_asimdshf_R\n\tif(!U && opcode==0x10) return SHRN_advsimd(ctx, dec); // -> SHRN_asimdshf_N\n\tif(!U && opcode==0x11) return RSHRN_advsimd(ctx, dec); // -> RSHRN_asimdshf_N\n\tif(!U && opcode==0x12) return SQSHRN_advsimd(ctx, dec); // -> SQSHRN_asimdshf_N\n\tif(!U && opcode==0x13) return SQRSHRN_advsimd(ctx, dec); // -> SQRSHRN_asimdshf_N\n\tif(!U && opcode==0x14) return SSHLL_advsimd(ctx, dec); // -> SSHLL_asimdshf_L\n\tif(!U && opcode==0x1c) return SCVTF_advsimd_fix(ctx, dec); // -> SCVTF_asimdshf_C\n\tif(!U && opcode==0x1f) return FCVTZS_advsimd_fix(ctx, dec); // -> FCVTZS_asimdshf_C\n\tif(U && !opcode) return USHR_advsimd(ctx, dec); // -> USHR_asimdshf_R\n\tif(U && opcode==2) return USRA_advsimd(ctx, dec); // -> USRA_asimdshf_R\n\tif(U && opcode==4) return URSHR_advsimd(ctx, dec); // -> URSHR_asimdshf_R\n\tif(U && opcode==6) return URSRA_advsimd(ctx, dec); // -> URSRA_asimdshf_R\n\tif(U && opcode==8) return SRI_advsimd(ctx, dec); // -> SRI_asimdshf_R\n\tif(U && opcode==10) return SLI_advsimd(ctx, dec); // -> SLI_asimdshf_R\n\tif(U && opcode==12) return SQSHLU_advsimd(ctx, dec); // -> SQSHLU_asimdshf_R\n\tif(U && opcode==14) return UQSHL_advsimd_imm(ctx, dec); // -> UQSHL_asimdshf_R\n\tif(U && opcode==0x10) return SQSHRUN_advsimd(ctx, dec); // -> SQSHRUN_asimdshf_N\n\tif(U && opcode==0x11) return SQRSHRUN_advsimd(ctx, dec); // -> SQRSHRUN_asimdshf_N\n\tif(U && opcode==0x12) return UQSHRN_advsimd(ctx, dec); // -> UQSHRN_asimdshf_N\n\tif(U && opcode==0x13) return UQRSHRN_advsimd(ctx, dec); // -> UQRSHRN_asimdshf_N\n\tif(U && opcode==0x14) return USHLL_advsimd(ctx, dec); // -> USHLL_asimdshf_L\n\tif(U && opcode==0x1c) return UCVTF_advsimd_fix(ctx, dec); // -> UCVTF_asimdshf_C\n\tif(U && opcode==0x1f) return FCVTZU_advsimd_fix(ctx, dec); // -> FCVTZU_asimdshf_C\n\tif(opcode==1) UNALLOCATED(ENC_UNALLOCATED_13_ASIMDSHF);\n\tif(opcode==3) UNALLOCATED(ENC_UNALLOCATED_16_ASIMDSHF);\n\tif(opcode==5) UNALLOCATED(ENC_UNALLOCATED_19_ASIMDSHF);\n\tif(opcode==7) UNALLOCATED(ENC_UNALLOCATED_22_ASIMDSHF);\n\tif(opcode==9) UNALLOCATED(ENC_UNALLOCATED_25_ASIMDSHF);\n\tif(opcode==11) UNALLOCATED(ENC_UNALLOCATED_28_ASIMDSHF);\n\tif(opcode==13) UNALLOCATED(ENC_UNALLOCATED_31_ASIMDSHF);\n\tif(opcode==15) UNALLOCATED(ENC_UNALLOCATED_34_ASIMDSHF);\n\tif(opcode==0x15) UNALLOCATED(ENC_UNALLOCATED_45_ASIMDSHF);\n\tif(opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_50_ASIMDSHF);\n\tif(opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_51_ASIMDSHF);\n\tif((opcode&0x1e)==0x16) UNALLOCATED(ENC_UNALLOCATED_46_ASIMDSHF);\n\tif((opcode&0x1c)==0x18) UNALLOCATED(ENC_UNALLOCATED_47_ASIMDSHF);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdtbl(context *ctx, Instruction *dec)\n{\n\tuint32_t op2=(INSWORD>>22)&3, len=(INSWORD>>13)&3, op=(INSWORD>>12)&1;\n\tif(!op2 && !len && !op) return TBL_advsimd(ctx, dec); // -> TBL_asimdtbl_L1_1\n\tif(!op2 && !len && op) return TBX_advsimd(ctx, dec); // -> TBX_asimdtbl_L1_1\n\tif(!op2 && len==1 && !op) return TBL_advsimd(ctx, dec); // -> TBL_asimdtbl_L2_2\n\tif(!op2 && len==1 && op) return TBX_advsimd(ctx, dec); // -> TBX_asimdtbl_L2_2\n\tif(!op2 && len==2 && !op) return TBL_advsimd(ctx, dec); // -> TBL_asimdtbl_L3_3\n\tif(!op2 && len==2 && op) return TBX_advsimd(ctx, dec); // -> TBX_asimdtbl_L3_3\n\tif(!op2 && len==3 && !op) return TBL_advsimd(ctx, dec); // -> TBL_asimdtbl_L4_4\n\tif(!op2 && len==3 && op) return TBX_advsimd(ctx, dec); // -> TBX_asimdtbl_L4_4\n\tif(op2&1) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDTBL);\n\tif((op2&2)==2) UNALLOCATED(ENC_UNALLOCATED_12_ASIMDTBL);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimddiff(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, opcode=(INSWORD>>12)&15;\n\tif(!U && !opcode) return SADDL_advsimd(ctx, dec); // -> SADDL_asimddiff_L\n\tif(!U && opcode==1) return SADDW_advsimd(ctx, dec); // -> SADDW_asimddiff_W\n\tif(!U && opcode==2) return SSUBL_advsimd(ctx, dec); // -> SSUBL_asimddiff_L\n\tif(!U && opcode==3) return SSUBW_advsimd(ctx, dec); // -> SSUBW_asimddiff_W\n\tif(!U && opcode==4) return ADDHN_advsimd(ctx, dec); // -> ADDHN_asimddiff_N\n\tif(!U && opcode==5) return SABAL_advsimd(ctx, dec); // -> SABAL_asimddiff_L\n\tif(!U && opcode==6) return SUBHN_advsimd(ctx, dec); // -> SUBHN_asimddiff_N\n\tif(!U && opcode==7) return SABDL_advsimd(ctx, dec); // -> SABDL_asimddiff_L\n\tif(!U && opcode==8) return SMLAL_advsimd_vec(ctx, dec); // -> SMLAL_asimddiff_L\n\tif(!U && opcode==9) return SQDMLAL_advsimd_vec(ctx, dec); // -> SQDMLAL_asimddiff_L\n\tif(!U && opcode==10) return SMLSL_advsimd_vec(ctx, dec); // -> SMLSL_asimddiff_L\n\tif(!U && opcode==11) return SQDMLSL_advsimd_vec(ctx, dec); // -> SQDMLSL_asimddiff_L\n\tif(!U && opcode==12) return SMULL_advsimd_vec(ctx, dec); // -> SMULL_asimddiff_L\n\tif(!U && opcode==13) return SQDMULL_advsimd_vec(ctx, dec); // -> SQDMULL_asimddiff_L\n\tif(!U && opcode==14) return PMULL_advsimd(ctx, dec); // -> PMULL_asimddiff_L\n\tif(U && !opcode) return UADDL_advsimd(ctx, dec); // -> UADDL_asimddiff_L\n\tif(U && opcode==1) return UADDW_advsimd(ctx, dec); // -> UADDW_asimddiff_W\n\tif(U && opcode==2) return USUBL_advsimd(ctx, dec); // -> USUBL_asimddiff_L\n\tif(U && opcode==3) return USUBW_advsimd(ctx, dec); // -> USUBW_asimddiff_W\n\tif(U && opcode==4) return RADDHN_advsimd(ctx, dec); // -> RADDHN_asimddiff_N\n\tif(U && opcode==5) return UABAL_advsimd(ctx, dec); // -> UABAL_asimddiff_L\n\tif(U && opcode==6) return RSUBHN_advsimd(ctx, dec); // -> RSUBHN_asimddiff_N\n\tif(U && opcode==7) return UABDL_advsimd(ctx, dec); // -> UABDL_asimddiff_L\n\tif(U && opcode==8) return UMLAL_advsimd_vec(ctx, dec); // -> UMLAL_asimddiff_L\n\tif(U && opcode==9) UNALLOCATED(ENC_UNALLOCATED_32_ASIMDDIFF);\n\tif(U && opcode==10) return UMLSL_advsimd_vec(ctx, dec); // -> UMLSL_asimddiff_L\n\tif(U && opcode==11) UNALLOCATED(ENC_UNALLOCATED_34_ASIMDDIFF);\n\tif(U && opcode==12) return UMULL_advsimd_vec(ctx, dec); // -> UMULL_asimddiff_L\n\tif(U && opcode==13) UNALLOCATED(ENC_UNALLOCATED_38_ASIMDDIFF);\n\tif(U && opcode==14) UNALLOCATED(ENC_UNALLOCATED_40_ASIMDDIFF);\n\tif(opcode==15) UNALLOCATED(ENC_UNALLOCATED_41_ASIMDDIFF);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdsame(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>11)&0x1f;\n\tif(!U && !size && opcode==3) return AND_advsimd(ctx, dec); // -> AND_asimdsame_only\n\tif(!U && !size && opcode==0x1d && HasFHM()) return FMLAL_advsimd_vec(ctx, dec); // -> FMLAL_asimdsame_F\n\tif(!U && size==1 && opcode==3) return BIC_advsimd_reg(ctx, dec); // -> BIC_asimdsame_only\n\tif(!U && size==1 && opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_88_ASIMDSAME);\n\tif(!U && size==2 && opcode==3) return ORR_advsimd_reg(ctx, dec); // -> ORR_asimdsame_only\n\tif(!U && size==2 && opcode==0x1d && HasFHM()) return FMLSL_advsimd_vec(ctx, dec); // -> FMLSL_asimdsame_F\n\tif(!U && size==3 && opcode==3) return ORN_advsimd(ctx, dec); // -> ORN_asimdsame_only\n\tif(!U && size==3 && opcode==0x1d) UNALLOCATED(ENC_UNALLOCATED_91_ASIMDSAME);\n\tif(U && !size && opcode==3) return EOR_advsimd(ctx, dec); // -> EOR_asimdsame_only\n\tif(U && !size && opcode==0x19 && HasFHM()) return FMLAL_advsimd_vec(ctx, dec); // -> FMLAL2_asimdsame_F\n\tif(U && size==1 && opcode==3) return BSL_advsimd(ctx, dec); // -> BSL_asimdsame_only\n\tif(U && size==1 && opcode==0x19) UNALLOCATED(ENC_UNALLOCATED_71_ASIMDSAME);\n\tif(U && size==2 && opcode==3) return BIT_advsimd(ctx, dec); // -> BIT_asimdsame_only\n\tif(U && size==2 && opcode==0x19 && HasFHM()) return FMLSL_advsimd_vec(ctx, dec); // -> FMLSL2_asimdsame_F\n\tif(U && size==3 && opcode==3) return BIF_advsimd(ctx, dec); // -> BIF_asimdsame_only\n\tif(U && size==3 && opcode==0x19) UNALLOCATED(ENC_UNALLOCATED_74_ASIMDSAME);\n\tif(!U && !(size&2) && opcode==0x18) return FMAXNM_advsimd(ctx, dec); // -> FMAXNM_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x19) return FMLA_advsimd_vec(ctx, dec); // -> FMLA_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x1a) return FADD_advsimd(ctx, dec); // -> FADD_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x1b) return FMULX_advsimd_vec(ctx, dec); // -> FMULX_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x1c) return FCMEQ_advsimd_reg(ctx, dec); // -> FCMEQ_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x1e) return FMAX_advsimd(ctx, dec); // -> FMAX_asimdsame_only\n\tif(!U && !(size&2) && opcode==0x1f) return FRECPS_advsimd(ctx, dec); // -> FRECPS_asimdsame_only\n\tif(!U && (size&2)==2 && opcode==0x18) return FMINNM_advsimd(ctx, dec); // -> FMINNM_asimdsame_only\n\tif(!U && (size&2)==2 && opcode==0x19) return FMLS_advsimd_vec(ctx, dec); // -> FMLS_asimdsame_only\n\tif(!U && (size&2)==2 && opcode==0x1a) return FSUB_advsimd(ctx, dec); // -> FSUB_asimdsame_only\n\tif(!U && (size&2)==2 && opcode==0x1b) UNALLOCATED(ENC_UNALLOCATED_81_ASIMDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1c) UNALLOCATED(ENC_UNALLOCATED_85_ASIMDSAME);\n\tif(!U && (size&2)==2 && opcode==0x1e) return FMIN_advsimd(ctx, dec); // -> FMIN_asimdsame_only\n\tif(!U && (size&2)==2 && opcode==0x1f) return FRSQRTS_advsimd(ctx, dec); // -> FRSQRTS_asimdsame_only\n\tif(U && !(size&2) && opcode==0x18) return FMAXNMP_advsimd_vec(ctx, dec); // -> FMAXNMP_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1a) return FADDP_advsimd_vec(ctx, dec); // -> FADDP_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1b) return FMUL_advsimd_vec(ctx, dec); // -> FMUL_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1c) return FCMGE_advsimd_reg(ctx, dec); // -> FCMGE_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1d) return FACGE_advsimd(ctx, dec); // -> FACGE_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1e) return FMAXP_advsimd_vec(ctx, dec); // -> FMAXP_asimdsame_only\n\tif(U && !(size&2) && opcode==0x1f) return FDIV_advsimd(ctx, dec); // -> FDIV_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x18) return FMINNMP_advsimd_vec(ctx, dec); // -> FMINNMP_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x1a) return FABD_advsimd(ctx, dec); // -> FABD_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x1b) UNALLOCATED(ENC_UNALLOCATED_82_ASIMDSAME);\n\tif(U && (size&2)==2 && opcode==0x1c) return FCMGT_advsimd_reg(ctx, dec); // -> FCMGT_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x1d) return FACGT_advsimd(ctx, dec); // -> FACGT_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x1e) return FMINP_advsimd_vec(ctx, dec); // -> FMINP_asimdsame_only\n\tif(U && (size&2)==2 && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_100_ASIMDSAME);\n\tif(!U && !opcode) return SHADD_advsimd(ctx, dec); // -> SHADD_asimdsame_only\n\tif(!U && opcode==1) return SQADD_advsimd(ctx, dec); // -> SQADD_asimdsame_only\n\tif(!U && opcode==2) return SRHADD_advsimd(ctx, dec); // -> SRHADD_asimdsame_only\n\tif(!U && opcode==4) return SHSUB_advsimd(ctx, dec); // -> SHSUB_asimdsame_only\n\tif(!U && opcode==5) return SQSUB_advsimd(ctx, dec); // -> SQSUB_asimdsame_only\n\tif(!U && opcode==6) return CMGT_advsimd_reg(ctx, dec); // -> CMGT_asimdsame_only\n\tif(!U && opcode==7) return CMGE_advsimd_reg(ctx, dec); // -> CMGE_asimdsame_only\n\tif(!U && opcode==8) return SSHL_advsimd(ctx, dec); // -> SSHL_asimdsame_only\n\tif(!U && opcode==9) return SQSHL_advsimd_reg(ctx, dec); // -> SQSHL_asimdsame_only\n\tif(!U && opcode==10) return SRSHL_advsimd(ctx, dec); // -> SRSHL_asimdsame_only\n\tif(!U && opcode==11) return SQRSHL_advsimd(ctx, dec); // -> SQRSHL_asimdsame_only\n\tif(!U && opcode==12) return SMAX_advsimd(ctx, dec); // -> SMAX_asimdsame_only\n\tif(!U && opcode==13) return SMIN_advsimd(ctx, dec); // -> SMIN_asimdsame_only\n\tif(!U && opcode==14) return SABD_advsimd(ctx, dec); // -> SABD_asimdsame_only\n\tif(!U && opcode==15) return SABA_advsimd(ctx, dec); // -> SABA_asimdsame_only\n\tif(!U && opcode==0x10) return ADD_advsimd(ctx, dec); // -> ADD_asimdsame_only\n\tif(!U && opcode==0x11) return CMTST_advsimd(ctx, dec); // -> CMTST_asimdsame_only\n\tif(!U && opcode==0x12) return MLA_advsimd_vec(ctx, dec); // -> MLA_asimdsame_only\n\tif(!U && opcode==0x13) return MUL_advsimd_vec(ctx, dec); // -> MUL_asimdsame_only\n\tif(!U && opcode==0x14) return SMAXP_advsimd(ctx, dec); // -> SMAXP_asimdsame_only\n\tif(!U && opcode==0x15) return SMINP_advsimd(ctx, dec); // -> SMINP_asimdsame_only\n\tif(!U && opcode==0x16) return SQDMULH_advsimd_vec(ctx, dec); // -> SQDMULH_asimdsame_only\n\tif(!U && opcode==0x17) return ADDP_advsimd_vec(ctx, dec); // -> ADDP_asimdsame_only\n\tif(U && !opcode) return UHADD_advsimd(ctx, dec); // -> UHADD_asimdsame_only\n\tif(U && opcode==1) return UQADD_advsimd(ctx, dec); // -> UQADD_asimdsame_only\n\tif(U && opcode==2) return URHADD_advsimd(ctx, dec); // -> URHADD_asimdsame_only\n\tif(U && opcode==4) return UHSUB_advsimd(ctx, dec); // -> UHSUB_asimdsame_only\n\tif(U && opcode==5) return UQSUB_advsimd(ctx, dec); // -> UQSUB_asimdsame_only\n\tif(U && opcode==6) return CMHI_advsimd(ctx, dec); // -> CMHI_asimdsame_only\n\tif(U && opcode==7) return CMHS_advsimd(ctx, dec); // -> CMHS_asimdsame_only\n\tif(U && opcode==8) return USHL_advsimd(ctx, dec); // -> USHL_asimdsame_only\n\tif(U && opcode==9) return UQSHL_advsimd_reg(ctx, dec); // -> UQSHL_asimdsame_only\n\tif(U && opcode==10) return URSHL_advsimd(ctx, dec); // -> URSHL_asimdsame_only\n\tif(U && opcode==11) return UQRSHL_advsimd(ctx, dec); // -> UQRSHL_asimdsame_only\n\tif(U && opcode==12) return UMAX_advsimd(ctx, dec); // -> UMAX_asimdsame_only\n\tif(U && opcode==13) return UMIN_advsimd(ctx, dec); // -> UMIN_asimdsame_only\n\tif(U && opcode==14) return UABD_advsimd(ctx, dec); // -> UABD_asimdsame_only\n\tif(U && opcode==15) return UABA_advsimd(ctx, dec); // -> UABA_asimdsame_only\n\tif(U && opcode==0x10) return SUB_advsimd(ctx, dec); // -> SUB_asimdsame_only\n\tif(U && opcode==0x11) return CMEQ_advsimd_reg(ctx, dec); // -> CMEQ_asimdsame_only\n\tif(U && opcode==0x12) return MLS_advsimd_vec(ctx, dec); // -> MLS_asimdsame_only\n\tif(U && opcode==0x13) return PMUL_advsimd(ctx, dec); // -> PMUL_asimdsame_only\n\tif(U && opcode==0x14) return UMAXP_advsimd(ctx, dec); // -> UMAXP_asimdsame_only\n\tif(U && opcode==0x15) return UMINP_advsimd(ctx, dec); // -> UMINP_asimdsame_only\n\tif(U && opcode==0x16) return SQRDMULH_advsimd_vec(ctx, dec); // -> SQRDMULH_asimdsame_only\n\tif(U && opcode==0x17) UNALLOCATED(ENC_UNALLOCATED_64_ASIMDSAME);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdsamefp16(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, a=(INSWORD>>23)&1, opcode=(INSWORD>>11)&7;\n\tif(!U && !a && !opcode && HasFP16()) return FMAXNM_advsimd(ctx, dec); // -> FMAXNM_asimdsamefp16_only\n\tif(!U && !a && opcode==1 && HasFP16()) return FMLA_advsimd_vec(ctx, dec); // -> FMLA_asimdsamefp16_only\n\tif(!U && !a && opcode==2 && HasFP16()) return FADD_advsimd(ctx, dec); // -> FADD_asimdsamefp16_only\n\tif(!U && !a && opcode==3 && HasFP16()) return FMULX_advsimd_vec(ctx, dec); // -> FMULX_asimdsamefp16_only\n\tif(!U && !a && opcode==4 && HasFP16()) return FCMEQ_advsimd_reg(ctx, dec); // -> FCMEQ_asimdsamefp16_only\n\tif(!U && !a && opcode==5) UNALLOCATED(ENC_UNALLOCATED_31_ASIMDSAMEFP16);\n\tif(!U && !a && opcode==6 && HasFP16()) return FMAX_advsimd(ctx, dec); // -> FMAX_asimdsamefp16_only\n\tif(!U && !a && opcode==7 && HasFP16()) return FRECPS_advsimd(ctx, dec); // -> FRECPS_asimdsamefp16_only\n\tif(!U && a && !opcode && HasFP16()) return FMINNM_advsimd(ctx, dec); // -> FMINNM_asimdsamefp16_only\n\tif(!U && a && opcode==1 && HasFP16()) return FMLS_advsimd_vec(ctx, dec); // -> FMLS_asimdsamefp16_only\n\tif(!U && a && opcode==2 && HasFP16()) return FSUB_advsimd(ctx, dec); // -> FSUB_asimdsamefp16_only\n\tif(!U && a && opcode==3) UNALLOCATED(ENC_UNALLOCATED_25_ASIMDSAMEFP16);\n\tif(!U && a && opcode==4) UNALLOCATED(ENC_UNALLOCATED_29_ASIMDSAMEFP16);\n\tif(!U && a && opcode==5) UNALLOCATED(ENC_UNALLOCATED_33_ASIMDSAMEFP16);\n\tif(!U && a && opcode==6 && HasFP16()) return FMIN_advsimd(ctx, dec); // -> FMIN_asimdsamefp16_only\n\tif(!U && a && opcode==7 && HasFP16()) return FRSQRTS_advsimd(ctx, dec); // -> FRSQRTS_asimdsamefp16_only\n\tif(U && !a && !opcode && HasFP16()) return FMAXNMP_advsimd_vec(ctx, dec); // -> FMAXNMP_asimdsamefp16_only\n\tif(U && !a && opcode==1) UNALLOCATED(ENC_UNALLOCATED_16_ASIMDSAMEFP16);\n\tif(U && !a && opcode==2 && HasFP16()) return FADDP_advsimd_vec(ctx, dec); // -> FADDP_asimdsamefp16_only\n\tif(U && !a && opcode==3 && HasFP16()) return FMUL_advsimd_vec(ctx, dec); // -> FMUL_asimdsamefp16_only\n\tif(U && !a && opcode==4 && HasFP16()) return FCMGE_advsimd_reg(ctx, dec); // -> FCMGE_asimdsamefp16_only\n\tif(U && !a && opcode==5 && HasFP16()) return FACGE_advsimd(ctx, dec); // -> FACGE_asimdsamefp16_only\n\tif(U && !a && opcode==6 && HasFP16()) return FMAXP_advsimd_vec(ctx, dec); // -> FMAXP_asimdsamefp16_only\n\tif(U && !a && opcode==7 && HasFP16()) return FDIV_advsimd(ctx, dec); // -> FDIV_asimdsamefp16_only\n\tif(U && a && !opcode && HasFP16()) return FMINNMP_advsimd_vec(ctx, dec); // -> FMINNMP_asimdsamefp16_only\n\tif(U && a && opcode==1) UNALLOCATED(ENC_UNALLOCATED_18_ASIMDSAMEFP16);\n\tif(U && a && opcode==2 && HasFP16()) return FABD_advsimd(ctx, dec); // -> FABD_asimdsamefp16_only\n\tif(U && a && opcode==3) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDSAMEFP16);\n\tif(U && a && opcode==4 && HasFP16()) return FCMGT_advsimd_reg(ctx, dec); // -> FCMGT_asimdsamefp16_only\n\tif(U && a && opcode==5 && HasFP16()) return FACGT_advsimd(ctx, dec); // -> FACGT_asimdsamefp16_only\n\tif(U && a && opcode==6 && HasFP16()) return FMINP_advsimd_vec(ctx, dec); // -> FMINP_asimdsamefp16_only\n\tif(U && a && opcode==7) UNALLOCATED(ENC_UNALLOCATED_42_ASIMDSAMEFP16);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdsame2(context *ctx, Instruction *dec)\n{\n\tuint32_t Q=(INSWORD>>30)&1, U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>11)&15;\n\tif(!Q && U && size==1 && opcode==13) UNALLOCATED(ENC_UNALLOCATED_32_ASIMDSAME2);\n\tif(Q && !U && size==2 && opcode==4 && HasI8MM()) return SMMLA_advsimd_vec(ctx, dec); // -> SMMLA_asimdsame2_G\n\tif(Q && !U && size==2 && opcode==5 && HasI8MM()) return USMMLA_advsimd_vec(ctx, dec); // -> USMMLA_asimdsame2_G\n\tif(Q && U && size==1 && opcode==13 && HasBF16()) return BFMMLA_advsimd(ctx, dec); // -> BFMMLA_asimdsame2_E\n\tif(Q && U && size==2 && opcode==4 && HasI8MM()) return UMMLA_advsimd_vec(ctx, dec); // -> UMMLA_asimdsame2_G\n\tif(Q && U && size==2 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDSAME2);\n\tif(!U && size==2 && opcode==3 && HasI8MM()) return USDOT_advsimd_vec(ctx, dec); // -> USDOT_asimdsame2_D\n\tif(U && !size && opcode==13) UNALLOCATED(ENC_UNALLOCATED_31_ASIMDSAME2);\n\tif(U && !size && opcode==15) UNALLOCATED(ENC_UNALLOCATED_35_ASIMDSAME2);\n\tif(U && size==1 && opcode==15 && HasBF16()) return BFDOT_advsimd_vec(ctx, dec); // -> BFDOT_asimdsame2_D\n\tif(U && size==2 && opcode==3) UNALLOCATED(ENC_UNALLOCATED_19_ASIMDSAME2);\n\tif(U && size==2 && opcode==15) UNALLOCATED(ENC_UNALLOCATED_38_ASIMDSAME2);\n\tif(U && size==3 && opcode==15 && HasBF16()) return BFMLAL_advsimd_vec(ctx, dec); // -> BFMLAL_asimdsame2_F_\n\tif(size==3 && opcode==3) UNALLOCATED(ENC_UNALLOCATED_20_ASIMDSAME2);\n\tif(U && (size&2)==2 && opcode==13) UNALLOCATED(ENC_UNALLOCATED_34_ASIMDSAME2);\n\tif(!(size&2) && opcode==3) UNALLOCATED(ENC_UNALLOCATED_17_ASIMDSAME2);\n\tif(!U && !opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDSAME2);\n\tif(!U && opcode==1) UNALLOCATED(ENC_UNALLOCATED_13_ASIMDSAME2);\n\tif(!U && opcode==2 && HasDotProd()) return SDOT_advsimd_vec(ctx, dec); // -> SDOT_asimdsame2_D\n\tif(U && !opcode && HasRDM()) return SQRDMLAH_advsimd_vec(ctx, dec); // -> SQRDMLAH_asimdsame2_only\n\tif(U && opcode==1 && HasRDM()) return SQRDMLSH_advsimd_vec(ctx, dec); // -> SQRDMLSH_asimdsame2_only\n\tif(U && opcode==2 && HasDotProd()) return UDOT_advsimd_vec(ctx, dec); // -> UDOT_asimdsame2_D\n\tif(Q && (size&2)==2 && (opcode&14)==6) UNALLOCATED(ENC_UNALLOCATED_27_ASIMDSAME2);\n\tif(U && (opcode&13)==12 && HasFCMA()) return FCADD_advsimd_vec(ctx, dec); // -> FCADD_asimdsame2_C\n\tif(Q && !(size&2) && (opcode&12)==4) UNALLOCATED(ENC_UNALLOCATED_22_ASIMDSAME2);\n\tif(U && (opcode&12)==8 && HasFCMA()) return FCMLA_advsimd_vec(ctx, dec); // -> FCMLA_asimdsame2_C\n\tif(!Q && (opcode&12)==4) UNALLOCATED(ENC_UNALLOCATED_21_ASIMDSAME2);\n\tif(!U && (opcode&8)==8) UNALLOCATED(ENC_UNALLOCATED_28_ASIMDSAME2);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdmisc(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && size==2 && opcode==0x16 && HasBF16()) return BFCVTN_advsimd(ctx, dec); // -> BFCVTN_asimdmisc_4S\n\tif(U && !size && opcode==5) return NOT_advsimd(ctx, dec); // -> NOT_asimdmisc_R\n\tif(U && size==1 && opcode==5) return RBIT_advsimd(ctx, dec); // -> RBIT_asimdmisc_R\n\tif(U && size==2 && opcode==0x16) UNALLOCATED(ENC_UNALLOCATED_57_ASIMDMISC);\n\tif(size==3 && opcode==0x16) UNALLOCATED(ENC_UNALLOCATED_58_ASIMDMISC);\n\tif(!U && !(size&2) && opcode==0x16) return FCVTN_advsimd(ctx, dec); // -> FCVTN_asimdmisc_N\n\tif(!U && !(size&2) && opcode==0x17) return FCVTL_advsimd(ctx, dec); // -> FCVTL_asimdmisc_L\n\tif(!U && !(size&2) && opcode==0x18) return FRINTN_advsimd(ctx, dec); // -> FRINTN_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x19) return FRINTM_advsimd(ctx, dec); // -> FRINTM_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1a) return FCVTNS_advsimd(ctx, dec); // -> FCVTNS_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1b) return FCVTMS_advsimd(ctx, dec); // -> FCVTMS_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1c) return FCVTAS_advsimd(ctx, dec); // -> FCVTAS_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1d) return SCVTF_advsimd_int(ctx, dec); // -> SCVTF_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1e && HasFRINTTS()) return FRINT32Z_advsimd(ctx, dec); // -> FRINT32Z_asimdmisc_R\n\tif(!U && !(size&2) && opcode==0x1f && HasFRINTTS()) return FRINT64Z_advsimd(ctx, dec); // -> FRINT64Z_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==12) return FCMGT_advsimd_zero(ctx, dec); // -> FCMGT_asimdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==13) return FCMEQ_advsimd_zero(ctx, dec); // -> FCMEQ_asimdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==14) return FCMLT_advsimd(ctx, dec); // -> FCMLT_asimdmisc_FZ\n\tif(!U && (size&2)==2 && opcode==15) return FABS_advsimd(ctx, dec); // -> FABS_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x18) return FRINTP_advsimd(ctx, dec); // -> FRINTP_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x19) return FRINTZ_advsimd(ctx, dec); // -> FRINTZ_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1a) return FCVTPS_advsimd(ctx, dec); // -> FCVTPS_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1b) return FCVTZS_advsimd_int(ctx, dec); // -> FCVTZS_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1c) return URECPE_advsimd(ctx, dec); // -> URECPE_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1d) return FRECPE_advsimd(ctx, dec); // -> FRECPE_asimdmisc_R\n\tif(!U && (size&2)==2 && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_91_ASIMDMISC);\n\tif(U && !(size&2) && opcode==0x16) return FCVTXN_advsimd(ctx, dec); // -> FCVTXN_asimdmisc_N\n\tif(U && !(size&2) && opcode==0x17) UNALLOCATED(ENC_UNALLOCATED_60_ASIMDMISC);\n\tif(U && !(size&2) && opcode==0x18) return FRINTA_advsimd(ctx, dec); // -> FRINTA_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x19) return FRINTX_advsimd(ctx, dec); // -> FRINTX_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1a) return FCVTNU_advsimd(ctx, dec); // -> FCVTNU_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1b) return FCVTMU_advsimd(ctx, dec); // -> FCVTMU_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1c) return FCVTAU_advsimd(ctx, dec); // -> FCVTAU_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1d) return UCVTF_advsimd_int(ctx, dec); // -> UCVTF_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1e && HasFRINTTS()) return FRINT32X_advsimd(ctx, dec); // -> FRINT32X_asimdmisc_R\n\tif(U && !(size&2) && opcode==0x1f && HasFRINTTS()) return FRINT64X_advsimd(ctx, dec); // -> FRINT64X_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_24_ASIMDMISC);\n\tif(U && (size&2)==2 && opcode==12) return FCMGE_advsimd_zero(ctx, dec); // -> FCMGE_asimdmisc_FZ\n\tif(U && (size&2)==2 && opcode==13) return FCMLE_advsimd(ctx, dec); // -> FCMLE_asimdmisc_FZ\n\tif(U && (size&2)==2 && opcode==14) UNALLOCATED(ENC_UNALLOCATED_43_ASIMDMISC);\n\tif(U && (size&2)==2 && opcode==15) return FNEG_advsimd(ctx, dec); // -> FNEG_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x18) UNALLOCATED(ENC_UNALLOCATED_65_ASIMDMISC);\n\tif(U && (size&2)==2 && opcode==0x19) return FRINTI_advsimd(ctx, dec); // -> FRINTI_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1a) return FCVTPU_advsimd(ctx, dec); // -> FCVTPU_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1b) return FCVTZU_advsimd_int(ctx, dec); // -> FCVTZU_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1c) return URSQRTE_advsimd(ctx, dec); // -> URSQRTE_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1d) return FRSQRTE_advsimd(ctx, dec); // -> FRSQRTE_asimdmisc_R\n\tif(U && (size&2)==2 && opcode==0x1f) return FSQRT_advsimd(ctx, dec); // -> FSQRT_asimdmisc_R\n\tif((size&2)==2 && opcode==0x17) UNALLOCATED(ENC_UNALLOCATED_61_ASIMDMISC);\n\tif((size&2)==2 && opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_88_ASIMDMISC);\n\tif(!U && !opcode) return REV64_advsimd(ctx, dec); // -> REV64_asimdmisc_R\n\tif(!U && opcode==1) return REV16_advsimd(ctx, dec); // -> REV16_asimdmisc_R\n\tif(!U && opcode==2) return SADDLP_advsimd(ctx, dec); // -> SADDLP_asimdmisc_P\n\tif(!U && opcode==3) return SUQADD_advsimd(ctx, dec); // -> SUQADD_asimdmisc_R\n\tif(!U && opcode==4) return CLS_advsimd(ctx, dec); // -> CLS_asimdmisc_R\n\tif(!U && opcode==5) return CNT_advsimd(ctx, dec); // -> CNT_asimdmisc_R\n\tif(!U && opcode==6) return SADALP_advsimd(ctx, dec); // -> SADALP_asimdmisc_P\n\tif(!U && opcode==7) return SQABS_advsimd(ctx, dec); // -> SQABS_asimdmisc_R\n\tif(!U && opcode==8) return CMGT_advsimd_zero(ctx, dec); // -> CMGT_asimdmisc_Z\n\tif(!U && opcode==9) return CMEQ_advsimd_zero(ctx, dec); // -> CMEQ_asimdmisc_Z\n\tif(!U && opcode==10) return CMLT_advsimd(ctx, dec); // -> CMLT_asimdmisc_Z\n\tif(!U && opcode==11) return ABS_advsimd(ctx, dec); // -> ABS_asimdmisc_R\n\tif(!U && opcode==0x12) return XTN_advsimd(ctx, dec); // -> XTN_asimdmisc_N\n\tif(!U && opcode==0x13) UNALLOCATED(ENC_UNALLOCATED_49_ASIMDMISC);\n\tif(!U && opcode==0x14) return SQXTN_advsimd(ctx, dec); // -> SQXTN_asimdmisc_N\n\tif(U && !opcode) return REV32_advsimd(ctx, dec); // -> REV32_asimdmisc_R\n\tif(U && opcode==1) UNALLOCATED(ENC_UNALLOCATED_14_ASIMDMISC);\n\tif(U && opcode==2) return UADDLP_advsimd(ctx, dec); // -> UADDLP_asimdmisc_P\n\tif(U && opcode==3) return USQADD_advsimd(ctx, dec); // -> USQADD_asimdmisc_R\n\tif(U && opcode==4) return CLZ_advsimd(ctx, dec); // -> CLZ_asimdmisc_R\n\tif(U && opcode==6) return UADALP_advsimd(ctx, dec); // -> UADALP_asimdmisc_P\n\tif(U && opcode==7) return SQNEG_advsimd(ctx, dec); // -> SQNEG_asimdmisc_R\n\tif(U && opcode==8) return CMGE_advsimd_zero(ctx, dec); // -> CMGE_asimdmisc_Z\n\tif(U && opcode==9) return CMLE_advsimd(ctx, dec); // -> CMLE_asimdmisc_Z\n\tif(U && opcode==10) UNALLOCATED(ENC_UNALLOCATED_34_ASIMDMISC);\n\tif(U && opcode==11) return NEG_advsimd(ctx, dec); // -> NEG_asimdmisc_R\n\tif(U && opcode==0x12) return SQXTUN_advsimd(ctx, dec); // -> SQXTUN_asimdmisc_N\n\tif(U && opcode==0x13) return SHLL_advsimd(ctx, dec); // -> SHLL_asimdmisc_S\n\tif(U && opcode==0x14) return UQXTN_advsimd(ctx, dec); // -> UQXTN_asimdmisc_N\n\tif(opcode==0x15) UNALLOCATED(ENC_UNALLOCATED_53_ASIMDMISC);\n\tif((opcode&0x1e)==0x10) UNALLOCATED(ENC_UNALLOCATED_46_ASIMDMISC);\n\tif(!(size&2) && (opcode&0x1c)==12) UNALLOCATED(ENC_UNALLOCATED_37_ASIMDMISC);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdmiscfp16(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, a=(INSWORD>>23)&1, opcode=(INSWORD>>12)&0x1f;\n\tif(!U && !a && opcode==0x18 && HasFP16()) return FRINTN_advsimd(ctx, dec); // -> FRINTN_asimdmiscfp16_R\n\tif(!U && !a && opcode==0x19 && HasFP16()) return FRINTM_advsimd(ctx, dec); // -> FRINTM_asimdmiscfp16_R\n\tif(!U && !a && opcode==0x1a && HasFP16()) return FCVTNS_advsimd(ctx, dec); // -> FCVTNS_asimdmiscfp16_R\n\tif(!U && !a && opcode==0x1b && HasFP16()) return FCVTMS_advsimd(ctx, dec); // -> FCVTMS_asimdmiscfp16_R\n\tif(!U && !a && opcode==0x1c && HasFP16()) return FCVTAS_advsimd(ctx, dec); // -> FCVTAS_asimdmiscfp16_R\n\tif(!U && !a && opcode==0x1d && HasFP16()) return SCVTF_advsimd_int(ctx, dec); // -> SCVTF_asimdmiscfp16_R\n\tif(!U && a && opcode==12 && HasFP16()) return FCMGT_advsimd_zero(ctx, dec); // -> FCMGT_asimdmiscfp16_FZ\n\tif(!U && a && opcode==13 && HasFP16()) return FCMEQ_advsimd_zero(ctx, dec); // -> FCMEQ_asimdmiscfp16_FZ\n\tif(!U && a && opcode==14 && HasFP16()) return FCMLT_advsimd(ctx, dec); // -> FCMLT_asimdmiscfp16_FZ\n\tif(!U && a && opcode==15 && HasFP16()) return FABS_advsimd(ctx, dec); // -> FABS_asimdmiscfp16_R\n\tif(!U && a && opcode==0x18 && HasFP16()) return FRINTP_advsimd(ctx, dec); // -> FRINTP_asimdmiscfp16_R\n\tif(!U && a && opcode==0x19 && HasFP16()) return FRINTZ_advsimd(ctx, dec); // -> FRINTZ_asimdmiscfp16_R\n\tif(!U && a && opcode==0x1a && HasFP16()) return FCVTPS_advsimd(ctx, dec); // -> FCVTPS_asimdmiscfp16_R\n\tif(!U && a && opcode==0x1b && HasFP16()) return FCVTZS_advsimd_int(ctx, dec); // -> FCVTZS_asimdmiscfp16_R\n\tif(!U && a && opcode==0x1d && HasFP16()) return FRECPE_advsimd(ctx, dec); // -> FRECPE_asimdmiscfp16_R\n\tif(!U && a && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_48_ASIMDMISCFP16);\n\tif(U && !a && opcode==0x18 && HasFP16()) return FRINTA_advsimd(ctx, dec); // -> FRINTA_asimdmiscfp16_R\n\tif(U && !a && opcode==0x19 && HasFP16()) return FRINTX_advsimd(ctx, dec); // -> FRINTX_asimdmiscfp16_R\n\tif(U && !a && opcode==0x1a && HasFP16()) return FCVTNU_advsimd(ctx, dec); // -> FCVTNU_asimdmiscfp16_R\n\tif(U && !a && opcode==0x1b && HasFP16()) return FCVTMU_advsimd(ctx, dec); // -> FCVTMU_asimdmiscfp16_R\n\tif(U && !a && opcode==0x1c && HasFP16()) return FCVTAU_advsimd(ctx, dec); // -> FCVTAU_asimdmiscfp16_R\n\tif(U && !a && opcode==0x1d && HasFP16()) return UCVTF_advsimd_int(ctx, dec); // -> UCVTF_asimdmiscfp16_R\n\tif(U && a && opcode==12 && HasFP16()) return FCMGE_advsimd_zero(ctx, dec); // -> FCMGE_asimdmiscfp16_FZ\n\tif(U && a && opcode==13 && HasFP16()) return FCMLE_advsimd(ctx, dec); // -> FCMLE_asimdmiscfp16_FZ\n\tif(U && a && opcode==14) UNALLOCATED(ENC_UNALLOCATED_19_ASIMDMISCFP16);\n\tif(U && a && opcode==15 && HasFP16()) return FNEG_advsimd(ctx, dec); // -> FNEG_asimdmiscfp16_R\n\tif(U && a && opcode==0x18) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDMISCFP16);\n\tif(U && a && opcode==0x19 && HasFP16()) return FRINTI_advsimd(ctx, dec); // -> FRINTI_asimdmiscfp16_R\n\tif(U && a && opcode==0x1a && HasFP16()) return FCVTPU_advsimd(ctx, dec); // -> FCVTPU_asimdmiscfp16_R\n\tif(U && a && opcode==0x1b && HasFP16()) return FCVTZU_advsimd_int(ctx, dec); // -> FCVTZU_asimdmiscfp16_R\n\tif(U && a && opcode==0x1d && HasFP16()) return FRSQRTE_advsimd(ctx, dec); // -> FRSQRTE_asimdmiscfp16_R\n\tif(U && a && opcode==0x1f && HasFP16()) return FSQRT_advsimd(ctx, dec); // -> FSQRT_asimdmiscfp16_R\n\tif(!a && opcode==0x1f) UNALLOCATED(ENC_UNALLOCATED_47_ASIMDMISCFP16);\n\tif(a && opcode==0x1c) UNALLOCATED(ENC_UNALLOCATED_41_ASIMDMISCFP16);\n\tif(opcode==0x1e) UNALLOCATED(ENC_UNALLOCATED_46_ASIMDMISCFP16);\n\tif(!a && (opcode&0x1c)==12) UNALLOCATED(ENC_UNALLOCATED_13_ASIMDMISCFP16);\n\tif((opcode&0x1c)==8) UNALLOCATED(ENC_UNALLOCATED_12_ASIMDMISCFP16);\n\tif(!(opcode&0x18)) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDMISCFP16);\n\tif((opcode&0x18)==0x10) UNALLOCATED(ENC_UNALLOCATED_22_ASIMDMISCFP16);\n\tUNMATCHED;\n}\n\nint decode_iclass_asimdelem(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>29)&1, size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&15;\n\tif(!U && !size && opcode==1 && HasFP16()) return FMLA_advsimd_elt(ctx, dec); // -> FMLA_asimdelem_RH_H\n\tif(!U && !size && opcode==5 && HasFP16()) return FMLS_advsimd_elt(ctx, dec); // -> FMLS_asimdelem_RH_H\n\tif(!U && !size && opcode==9 && HasFP16()) return FMUL_advsimd_elt(ctx, dec); // -> FMUL_asimdelem_RH_H\n\tif(!U && !size && opcode==15 && HasI8MM()) return SUDOT_advsimd_elt(ctx, dec); // -> SUDOT_asimdelem_D\n\tif(!U && size==1 && opcode==1) UNALLOCATED(ENC_UNALLOCATED_17_ASIMDELEM);\n\tif(!U && size==1 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_33_ASIMDELEM);\n\tif(!U && size==1 && opcode==15 && HasBF16()) return BFDOT_advsimd_elt(ctx, dec); // -> BFDOT_asimdelem_E\n\tif(!U && size==2 && !opcode && HasFHM()) return FMLAL_advsimd_elt(ctx, dec); // -> FMLAL_asimdelem_LH\n\tif(!U && size==2 && opcode==4 && HasFHM()) return FMLSL_advsimd_elt(ctx, dec); // -> FMLSL_asimdelem_LH\n\tif(!U && size==2 && opcode==15 && HasI8MM()) return USDOT_advsimd_elt(ctx, dec); // -> USDOT_asimdelem_D\n\tif(!U && size==3 && !opcode) UNALLOCATED(ENC_UNALLOCATED_13_ASIMDELEM);\n\tif(!U && size==3 && opcode==4) UNALLOCATED(ENC_UNALLOCATED_29_ASIMDELEM);\n\tif(!U && size==3 && opcode==15 && HasBF16()) return BFMLAL_advsimd_elt(ctx, dec); // -> BFMLAL_asimdelem_F\n\tif(U && !size && opcode==1) UNALLOCATED(ENC_UNALLOCATED_16_ASIMDELEM);\n\tif(U && !size && opcode==3) UNALLOCATED(ENC_UNALLOCATED_25_ASIMDELEM);\n\tif(U && !size && opcode==5) UNALLOCATED(ENC_UNALLOCATED_32_ASIMDELEM);\n\tif(U && !size && opcode==7) UNALLOCATED(ENC_UNALLOCATED_39_ASIMDELEM);\n\tif(U && !size && opcode==9 && HasFP16()) return FMULX_advsimd_elt(ctx, dec); // -> FMULX_asimdelem_RH_H\n\tif(U && size==2 && opcode==8 && HasFHM()) return FMLAL_advsimd_elt(ctx, dec); // -> FMLAL2_asimdelem_LH\n\tif(U && size==2 && opcode==12 && HasFHM()) return FMLSL_advsimd_elt(ctx, dec); // -> FMLSL2_asimdelem_LH\n\tif(U && size==3 && opcode==1) RESERVED(ENC_RESERVED_21_ASIMDELEM);\n\tif(U && size==3 && opcode==3) UNALLOCATED(ENC_UNALLOCATED_26_ASIMDELEM);\n\tif(U && size==3 && opcode==5) RESERVED(ENC_RESERVED_35_ASIMDELEM);\n\tif(U && size==3 && opcode==7) UNALLOCATED(ENC_UNALLOCATED_40_ASIMDELEM);\n\tif(U && size==3 && opcode==8) UNALLOCATED(ENC_UNALLOCATED_44_ASIMDELEM);\n\tif(U && size==3 && opcode==12) UNALLOCATED(ENC_UNALLOCATED_57_ASIMDELEM);\n\tif(size==1 && opcode==9) UNALLOCATED(ENC_UNALLOCATED_47_ASIMDELEM);\n\tif(!U && !(size&2) && !opcode) UNALLOCATED(ENC_UNALLOCATED_11_ASIMDELEM);\n\tif(!U && !(size&2) && opcode==4) UNALLOCATED(ENC_UNALLOCATED_27_ASIMDELEM);\n\tif(!U && (size&2)==2 && opcode==1) return FMLA_advsimd_elt(ctx, dec); // -> FMLA_asimdelem_R_SD\n\tif(!U && (size&2)==2 && opcode==5) return FMLS_advsimd_elt(ctx, dec); // -> FMLS_asimdelem_R_SD\n\tif(!U && (size&2)==2 && opcode==9) return FMUL_advsimd_elt(ctx, dec); // -> FMUL_asimdelem_R_SD\n\tif(U && !(size&2) && opcode==8) UNALLOCATED(ENC_UNALLOCATED_42_ASIMDELEM);\n\tif(U && !(size&2) && opcode==12) UNALLOCATED(ENC_UNALLOCATED_55_ASIMDELEM);\n\tif(U && (size&2)==2 && opcode==9) return FMULX_advsimd_elt(ctx, dec); // -> FMULX_asimdelem_R_SD\n\tif(!U && opcode==2) return SMLAL_advsimd_elt(ctx, dec); // -> SMLAL_asimdelem_L\n\tif(!U && opcode==3) return SQDMLAL_advsimd_elt(ctx, dec); // -> SQDMLAL_asimdelem_L\n\tif(!U && opcode==6) return SMLSL_advsimd_elt(ctx, dec); // -> SMLSL_asimdelem_L\n\tif(!U && opcode==7) return SQDMLSL_advsimd_elt(ctx, dec); // -> SQDMLSL_asimdelem_L\n\tif(!U && opcode==8) return MUL_advsimd_elt(ctx, dec); // -> MUL_asimdelem_R\n\tif(!U && opcode==10) return SMULL_advsimd_elt(ctx, dec); // -> SMULL_asimdelem_L\n\tif(!U && opcode==11) return SQDMULL_advsimd_elt(ctx, dec); // -> SQDMULL_asimdelem_L\n\tif(!U && opcode==12) return SQDMULH_advsimd_elt(ctx, dec); // -> SQDMULH_asimdelem_R\n\tif(!U && opcode==13) return SQRDMULH_advsimd_elt(ctx, dec); // -> SQRDMULH_asimdelem_R\n\tif(!U && opcode==14 && HasDotProd()) return SDOT_advsimd_elt(ctx, dec); // -> SDOT_asimdelem_D\n\tif(U && !opcode) return MLA_advsimd_elt(ctx, dec); // -> MLA_asimdelem_R\n\tif(U && opcode==2) return UMLAL_advsimd_elt(ctx, dec); // -> UMLAL_asimdelem_L\n\tif(U && opcode==4) return MLS_advsimd_elt(ctx, dec); // -> MLS_asimdelem_R\n\tif(U && opcode==6) return UMLSL_advsimd_elt(ctx, dec); // -> UMLSL_asimdelem_L\n\tif(U && opcode==10) return UMULL_advsimd_elt(ctx, dec); // -> UMULL_asimdelem_L\n\tif(U && opcode==11) UNALLOCATED(ENC_UNALLOCATED_53_ASIMDELEM);\n\tif(U && opcode==13 && HasRDM()) return SQRDMLAH_advsimd_elt(ctx, dec); // -> SQRDMLAH_asimdelem_R\n\tif(U && opcode==14 && HasDotProd()) return UDOT_advsimd_elt(ctx, dec); // -> UDOT_asimdelem_D\n\tif(U && opcode==15 && HasRDM()) return SQRDMLSH_advsimd_elt(ctx, dec); // -> SQRDMLSH_asimdelem_R\n\tif(U && size==1 && (opcode&9)==1 && HasFCMA()) return FCMLA_advsimd_elt(ctx, dec); // -> FCMLA_asimdelem_C_H\n\tif(U && size==2 && (opcode&9)==1 && HasFCMA()) return FCMLA_advsimd_elt(ctx, dec); // -> FCMLA_asimdelem_C_S\n\tUNMATCHED;\n}\n\nint decode_iclass_float2fix(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, rmode=(INSWORD>>19)&3, opcode=(INSWORD>>16)&7, scale=(INSWORD>>10)&0x3f;\n\tif(!sf && !S && !ptype && !rmode && opcode==2) return SCVTF_float_fix(ctx, dec); // -> SCVTF_S32_float2fix\n\tif(!sf && !S && !ptype && !rmode && opcode==3) return UCVTF_float_fix(ctx, dec); // -> UCVTF_S32_float2fix\n\tif(!sf && !S && !ptype && rmode==3 && !opcode) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_32S_float2fix\n\tif(!sf && !S && !ptype && rmode==3 && opcode==1) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_32S_float2fix\n\tif(!sf && !S && ptype==1 && !rmode && opcode==2) return SCVTF_float_fix(ctx, dec); // -> SCVTF_D32_float2fix\n\tif(!sf && !S && ptype==1 && !rmode && opcode==3) return UCVTF_float_fix(ctx, dec); // -> UCVTF_D32_float2fix\n\tif(!sf && !S && ptype==1 && rmode==3 && !opcode) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_32D_float2fix\n\tif(!sf && !S && ptype==1 && rmode==3 && opcode==1) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_32D_float2fix\n\tif(!sf && !S && ptype==3 && !rmode && opcode==2 && HasFP16()) return SCVTF_float_fix(ctx, dec); // -> SCVTF_H32_float2fix\n\tif(!sf && !S && ptype==3 && !rmode && opcode==3 && HasFP16()) return UCVTF_float_fix(ctx, dec); // -> UCVTF_H32_float2fix\n\tif(!sf && !S && ptype==3 && rmode==3 && !opcode && HasFP16()) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_32H_float2fix\n\tif(!sf && !S && ptype==3 && rmode==3 && opcode==1 && HasFP16()) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_32H_float2fix\n\tif(sf && !S && !ptype && !rmode && opcode==2) return SCVTF_float_fix(ctx, dec); // -> SCVTF_S64_float2fix\n\tif(sf && !S && !ptype && !rmode && opcode==3) return UCVTF_float_fix(ctx, dec); // -> UCVTF_S64_float2fix\n\tif(sf && !S && !ptype && rmode==3 && !opcode) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_64S_float2fix\n\tif(sf && !S && !ptype && rmode==3 && opcode==1) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_64S_float2fix\n\tif(sf && !S && ptype==1 && !rmode && opcode==2) return SCVTF_float_fix(ctx, dec); // -> SCVTF_D64_float2fix\n\tif(sf && !S && ptype==1 && !rmode && opcode==3) return UCVTF_float_fix(ctx, dec); // -> UCVTF_D64_float2fix\n\tif(sf && !S && ptype==1 && rmode==3 && !opcode) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_64D_float2fix\n\tif(sf && !S && ptype==1 && rmode==3 && opcode==1) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_64D_float2fix\n\tif(sf && !S && ptype==3 && !rmode && opcode==2 && HasFP16()) return SCVTF_float_fix(ctx, dec); // -> SCVTF_H64_float2fix\n\tif(sf && !S && ptype==3 && !rmode && opcode==3 && HasFP16()) return UCVTF_float_fix(ctx, dec); // -> UCVTF_H64_float2fix\n\tif(sf && !S && ptype==3 && rmode==3 && !opcode && HasFP16()) return FCVTZS_float_fix(ctx, dec); // -> FCVTZS_64H_float2fix\n\tif(sf && !S && ptype==3 && rmode==3 && opcode==1 && HasFP16()) return FCVTZU_float_fix(ctx, dec); // -> FCVTZU_64H_float2fix\n\tif(!(rmode&1) && !(opcode&6)) UNALLOCATED(ENC_UNALLOCATED_13_FLOAT2FIX);\n\tif(rmode&1 && (opcode&6)==2) UNALLOCATED(ENC_UNALLOCATED_15_FLOAT2FIX);\n\tif(!(rmode&2) && !(opcode&6)) UNALLOCATED(ENC_UNALLOCATED_14_FLOAT2FIX);\n\tif((rmode&2)==2 && (opcode&6)==2) UNALLOCATED(ENC_UNALLOCATED_16_FLOAT2FIX);\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_11_FLOAT2FIX);\n\tif(!sf && !(scale&0x20)) UNALLOCATED(ENC_UNALLOCATED_12_FLOAT2FIX);\n\tif((opcode&4)==4) UNALLOCATED(ENC_UNALLOCATED_17_FLOAT2FIX);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOAT2FIX);\n\tUNMATCHED;\n}\n\nint decode_iclass_float2int(context *ctx, Instruction *dec)\n{\n\tuint32_t sf=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, rmode=(INSWORD>>19)&3, opcode=(INSWORD>>16)&7;\n\tif(!sf && !S && !ptype && !rmode && !opcode) return FCVTNS_float(ctx, dec); // -> FCVTNS_32S_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==1) return FCVTNU_float(ctx, dec); // -> FCVTNU_32S_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==2) return SCVTF_float_int(ctx, dec); // -> SCVTF_S32_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==3) return UCVTF_float_int(ctx, dec); // -> UCVTF_S32_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==4) return FCVTAS_float(ctx, dec); // -> FCVTAS_32S_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==5) return FCVTAU_float(ctx, dec); // -> FCVTAU_32S_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==6) return FMOV_float_gen(ctx, dec); // -> FMOV_32S_float2int\n\tif(!sf && !S && !ptype && !rmode && opcode==7) return FMOV_float_gen(ctx, dec); // -> FMOV_S32_float2int\n\tif(!sf && !S && !ptype && rmode==1 && !opcode) return FCVTPS_float(ctx, dec); // -> FCVTPS_32S_float2int\n\tif(!sf && !S && !ptype && rmode==1 && opcode==1) return FCVTPU_float(ctx, dec); // -> FCVTPU_32S_float2int\n\tif(!sf && !S && !ptype && rmode==2 && !opcode) return FCVTMS_float(ctx, dec); // -> FCVTMS_32S_float2int\n\tif(!sf && !S && !ptype && rmode==2 && opcode==1) return FCVTMU_float(ctx, dec); // -> FCVTMU_32S_float2int\n\tif(!sf && !S && !ptype && rmode==3 && !opcode) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_32S_float2int\n\tif(!sf && !S && !ptype && rmode==3 && opcode==1) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_32S_float2int\n\tif(!sf && !S && ptype==1 && !rmode && !opcode) return FCVTNS_float(ctx, dec); // -> FCVTNS_32D_float2int\n\tif(!sf && !S && ptype==1 && !rmode && opcode==1) return FCVTNU_float(ctx, dec); // -> FCVTNU_32D_float2int\n\tif(!sf && !S && ptype==1 && !rmode && opcode==2) return SCVTF_float_int(ctx, dec); // -> SCVTF_D32_float2int\n\tif(!sf && !S && ptype==1 && !rmode && opcode==3) return UCVTF_float_int(ctx, dec); // -> UCVTF_D32_float2int\n\tif(!sf && !S && ptype==1 && !rmode && opcode==4) return FCVTAS_float(ctx, dec); // -> FCVTAS_32D_float2int\n\tif(!sf && !S && ptype==1 && !rmode && opcode==5) return FCVTAU_float(ctx, dec); // -> FCVTAU_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==1 && !opcode) return FCVTPS_float(ctx, dec); // -> FCVTPS_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==1 && opcode==1) return FCVTPU_float(ctx, dec); // -> FCVTPU_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==2 && !opcode) return FCVTMS_float(ctx, dec); // -> FCVTMS_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==2 && opcode==1) return FCVTMU_float(ctx, dec); // -> FCVTMU_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==3 && !opcode) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==3 && opcode==1) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==3 && opcode==6 && HasJSCVT()) return FJCVTZS(ctx, dec); // -> FJCVTZS_32D_float2int\n\tif(!sf && !S && ptype==1 && rmode==3 && opcode==7) UNALLOCATED(ENC_UNALLOCATED_71_FLOAT2INT);\n\tif(!sf && !S && ptype==3 && !rmode && !opcode && HasFP16()) return FCVTNS_float(ctx, dec); // -> FCVTNS_32H_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==1 && HasFP16()) return FCVTNU_float(ctx, dec); // -> FCVTNU_32H_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==2 && HasFP16()) return SCVTF_float_int(ctx, dec); // -> SCVTF_H32_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==3 && HasFP16()) return UCVTF_float_int(ctx, dec); // -> UCVTF_H32_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==4 && HasFP16()) return FCVTAS_float(ctx, dec); // -> FCVTAS_32H_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==5 && HasFP16()) return FCVTAU_float(ctx, dec); // -> FCVTAU_32H_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==6 && HasFP16()) return FMOV_float_gen(ctx, dec); // -> FMOV_32H_float2int\n\tif(!sf && !S && ptype==3 && !rmode && opcode==7 && HasFP16()) return FMOV_float_gen(ctx, dec); // -> FMOV_H32_float2int\n\tif(!sf && !S && ptype==3 && rmode==1 && !opcode && HasFP16()) return FCVTPS_float(ctx, dec); // -> FCVTPS_32H_float2int\n\tif(!sf && !S && ptype==3 && rmode==1 && opcode==1 && HasFP16()) return FCVTPU_float(ctx, dec); // -> FCVTPU_32H_float2int\n\tif(!sf && !S && ptype==3 && rmode==2 && !opcode && HasFP16()) return FCVTMS_float(ctx, dec); // -> FCVTMS_32H_float2int\n\tif(!sf && !S && ptype==3 && rmode==2 && opcode==1 && HasFP16()) return FCVTMU_float(ctx, dec); // -> FCVTMU_32H_float2int\n\tif(!sf && !S && ptype==3 && rmode==3 && !opcode && HasFP16()) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_32H_float2int\n\tif(!sf && !S && ptype==3 && rmode==3 && opcode==1 && HasFP16()) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_32H_float2int\n\tif(sf && !S && !ptype && !rmode && !opcode) return FCVTNS_float(ctx, dec); // -> FCVTNS_64S_float2int\n\tif(sf && !S && !ptype && !rmode && opcode==1) return FCVTNU_float(ctx, dec); // -> FCVTNU_64S_float2int\n\tif(sf && !S && !ptype && !rmode && opcode==2) return SCVTF_float_int(ctx, dec); // -> SCVTF_S64_float2int\n\tif(sf && !S && !ptype && !rmode && opcode==3) return UCVTF_float_int(ctx, dec); // -> UCVTF_S64_float2int\n\tif(sf && !S && !ptype && !rmode && opcode==4) return FCVTAS_float(ctx, dec); // -> FCVTAS_64S_float2int\n\tif(sf && !S && !ptype && !rmode && opcode==5) return FCVTAU_float(ctx, dec); // -> FCVTAU_64S_float2int\n\tif(sf && !S && !ptype && rmode==1 && !opcode) return FCVTPS_float(ctx, dec); // -> FCVTPS_64S_float2int\n\tif(sf && !S && !ptype && rmode==1 && opcode==1) return FCVTPU_float(ctx, dec); // -> FCVTPU_64S_float2int\n\tif(sf && !S && !ptype && rmode==2 && !opcode) return FCVTMS_float(ctx, dec); // -> FCVTMS_64S_float2int\n\tif(sf && !S && !ptype && rmode==2 && opcode==1) return FCVTMU_float(ctx, dec); // -> FCVTMU_64S_float2int\n\tif(sf && !S && !ptype && rmode==3 && !opcode) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_64S_float2int\n\tif(sf && !S && !ptype && rmode==3 && opcode==1) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_64S_float2int\n\tif(sf && !S && ptype==1 && !rmode && !opcode) return FCVTNS_float(ctx, dec); // -> FCVTNS_64D_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==1) return FCVTNU_float(ctx, dec); // -> FCVTNU_64D_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==2) return SCVTF_float_int(ctx, dec); // -> SCVTF_D64_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==3) return UCVTF_float_int(ctx, dec); // -> UCVTF_D64_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==4) return FCVTAS_float(ctx, dec); // -> FCVTAS_64D_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==5) return FCVTAU_float(ctx, dec); // -> FCVTAU_64D_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==6) return FMOV_float_gen(ctx, dec); // -> FMOV_64D_float2int\n\tif(sf && !S && ptype==1 && !rmode && opcode==7) return FMOV_float_gen(ctx, dec); // -> FMOV_D64_float2int\n\tif(sf && !S && ptype==1 && rmode==1 && !opcode) return FCVTPS_float(ctx, dec); // -> FCVTPS_64D_float2int\n\tif(sf && !S && ptype==1 && rmode==1 && opcode==1) return FCVTPU_float(ctx, dec); // -> FCVTPU_64D_float2int\n\tif(sf && !S && ptype==1 && rmode==2 && !opcode) return FCVTMS_float(ctx, dec); // -> FCVTMS_64D_float2int\n\tif(sf && !S && ptype==1 && rmode==2 && opcode==1) return FCVTMU_float(ctx, dec); // -> FCVTMU_64D_float2int\n\tif(sf && !S && ptype==1 && rmode==3 && !opcode) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_64D_float2int\n\tif(sf && !S && ptype==1 && rmode==3 && opcode==1) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_64D_float2int\n\tif(sf && !S && ptype==2 && rmode==1 && opcode==6) return FMOV_float_gen(ctx, dec); // -> FMOV_64VX_float2int\n\tif(sf && !S && ptype==2 && rmode==1 && opcode==7) return FMOV_float_gen(ctx, dec); // -> FMOV_V64I_float2int\n\tif(sf && !S && ptype==3 && !rmode && !opcode && HasFP16()) return FCVTNS_float(ctx, dec); // -> FCVTNS_64H_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==1 && HasFP16()) return FCVTNU_float(ctx, dec); // -> FCVTNU_64H_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==2 && HasFP16()) return SCVTF_float_int(ctx, dec); // -> SCVTF_H64_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==3 && HasFP16()) return UCVTF_float_int(ctx, dec); // -> UCVTF_H64_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==4 && HasFP16()) return FCVTAS_float(ctx, dec); // -> FCVTAS_64H_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==5 && HasFP16()) return FCVTAU_float(ctx, dec); // -> FCVTAU_64H_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==6 && HasFP16()) return FMOV_float_gen(ctx, dec); // -> FMOV_64H_float2int\n\tif(sf && !S && ptype==3 && !rmode && opcode==7 && HasFP16()) return FMOV_float_gen(ctx, dec); // -> FMOV_H64_float2int\n\tif(sf && !S && ptype==3 && rmode==1 && !opcode && HasFP16()) return FCVTPS_float(ctx, dec); // -> FCVTPS_64H_float2int\n\tif(sf && !S && ptype==3 && rmode==1 && opcode==1 && HasFP16()) return FCVTPU_float(ctx, dec); // -> FCVTPU_64H_float2int\n\tif(sf && !S && ptype==3 && rmode==2 && !opcode && HasFP16()) return FCVTMS_float(ctx, dec); // -> FCVTMS_64H_float2int\n\tif(sf && !S && ptype==3 && rmode==2 && opcode==1 && HasFP16()) return FCVTMU_float(ctx, dec); // -> FCVTMU_64H_float2int\n\tif(sf && !S && ptype==3 && rmode==3 && !opcode && HasFP16()) return FCVTZS_float_int(ctx, dec); // -> FCVTZS_64H_float2int\n\tif(sf && !S && ptype==3 && rmode==3 && opcode==1 && HasFP16()) return FCVTZU_float_int(ctx, dec); // -> FCVTZU_64H_float2int\n\tif(!sf && !S && ptype==1 && rmode==2 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_69_FLOAT2INT);\n\tif(!sf && !S && !ptype && rmode&1 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_40_FLOAT2INT);\n\tif(!sf && !S && !ptype && (rmode&2)==2 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_41_FLOAT2INT);\n\tif(!sf && !S && ptype==1 && !(rmode&2) && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_68_FLOAT2INT);\n\tif(sf && !S && ptype==1 && rmode&1 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_72_FLOAT2INT);\n\tif(sf && !S && ptype==1 && (rmode&2)==2 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_73_FLOAT2INT);\n\tif(sf && !S && ptype==2 && !(rmode&1) && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_79_FLOAT2INT);\n\tif(sf && !S && ptype==2 && (rmode&2)==2 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_80_FLOAT2INT);\n\tif(!sf && !S && ptype==2 && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_78_FLOAT2INT);\n\tif(sf && !S && !ptype && (opcode&6)==6) UNALLOCATED(ENC_UNALLOCATED_39_FLOAT2INT);\n\tif(!S && ptype==2 && (opcode&6)==4) UNALLOCATED(ENC_UNALLOCATED_77_FLOAT2INT);\n\tif(!S && ptype==2 && !(opcode&4)) UNALLOCATED(ENC_UNALLOCATED_76_FLOAT2INT);\n\tif(rmode&1 && (opcode&6)==2) UNALLOCATED(ENC_UNALLOCATED_11_FLOAT2INT);\n\tif(rmode&1 && (opcode&6)==4) UNALLOCATED(ENC_UNALLOCATED_13_FLOAT2INT);\n\tif((rmode&2)==2 && (opcode&6)==2) UNALLOCATED(ENC_UNALLOCATED_12_FLOAT2INT);\n\tif((rmode&2)==2 && (opcode&6)==4) UNALLOCATED(ENC_UNALLOCATED_14_FLOAT2INT);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOAT2INT);\n\tUNMATCHED;\n}\n\nint decode_iclass_cryptoaes(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!size && opcode==4) return AESE_advsimd(ctx, dec); // -> AESE_B_cryptoaes\n\tif(!size && opcode==5) return AESD_advsimd(ctx, dec); // -> AESD_B_cryptoaes\n\tif(!size && opcode==6) return AESMC_advsimd(ctx, dec); // -> AESMC_B_cryptoaes\n\tif(!size && opcode==7) return AESIMC_advsimd(ctx, dec); // -> AESIMC_B_cryptoaes\n\tif(!(opcode&0x1c)) UNALLOCATED(ENC_UNALLOCATED_13_CRYPTOAES);\n\tif((opcode&8)==8) UNALLOCATED(ENC_UNALLOCATED_18_CRYPTOAES);\n\tif((opcode&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_19_CRYPTOAES);\n\tif(size&1) UNALLOCATED(ENC_UNALLOCATED_12_CRYPTOAES);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_11_CRYPTOAES);\n\tUNMATCHED;\n}\n\nint decode_iclass_crypto4(context *ctx, Instruction *dec)\n{\n\tuint32_t Op0=(INSWORD>>21)&3;\n\tif(!Op0 && HasSHA3()) return EOR3_advsimd(ctx, dec); // -> EOR3_VVV16_crypto4\n\tif(Op0==1 && HasSHA3()) return BCAX_advsimd(ctx, dec); // -> BCAX_VVV16_crypto4\n\tif(Op0==2 && HasSM3()) return SM3SS1_advsimd(ctx, dec); // -> SM3SS1_VVV4_crypto4\n\tif(Op0==3) UNALLOCATED(ENC_UNALLOCATED_14_CRYPTO4);\n\tUNMATCHED;\n}\n\nint decode_iclass_cryptosha3(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&7;\n\tif(!size && !opcode) return SHA1C_advsimd(ctx, dec); // -> SHA1C_QSV_cryptosha3\n\tif(!size && opcode==1) return SHA1P_advsimd(ctx, dec); // -> SHA1P_QSV_cryptosha3\n\tif(!size && opcode==2) return SHA1M_advsimd(ctx, dec); // -> SHA1M_QSV_cryptosha3\n\tif(!size && opcode==3) return SHA1SU0_advsimd(ctx, dec); // -> SHA1SU0_VVV_cryptosha3\n\tif(!size && opcode==4) return SHA256H_advsimd(ctx, dec); // -> SHA256H_QQV_cryptosha3\n\tif(!size && opcode==5) return SHA256H2_advsimd(ctx, dec); // -> SHA256H2_QQV_cryptosha3\n\tif(!size && opcode==6) return SHA256SU1_advsimd(ctx, dec); // -> SHA256SU1_VVV_cryptosha3\n\tif(opcode==7) UNALLOCATED(ENC_UNALLOCATED_20_CRYPTOSHA3);\n\tif(size&1) UNALLOCATED(ENC_UNALLOCATED_11_CRYPTOSHA3);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_12_CRYPTOSHA3);\n\tUNMATCHED;\n}\n\nint decode_iclass_cryptosha512_3(context *ctx, Instruction *dec)\n{\n\tuint32_t O=(INSWORD>>14)&1, opcode=(INSWORD>>10)&3;\n\tif(!O && !opcode && HasSHA512()) return SHA512H_advsimd(ctx, dec); // -> SHA512H_QQV_cryptosha512_3\n\tif(!O && opcode==1 && HasSHA512()) return SHA512H2_advsimd(ctx, dec); // -> SHA512H2_QQV_cryptosha512_3\n\tif(!O && opcode==2 && HasSHA512()) return SHA512SU1_advsimd(ctx, dec); // -> SHA512SU1_VVV2_cryptosha512_3\n\tif(!O && opcode==3 && HasSHA3()) return RAX1_advsimd(ctx, dec); // -> RAX1_VVV2_cryptosha512_3\n\tif(O && !opcode && HasSM3()) return SM3PARTW1_advsimd(ctx, dec); // -> SM3PARTW1_VVV4_cryptosha512_3\n\tif(O && opcode==1 && HasSM3()) return SM3PARTW2_advsimd(ctx, dec); // -> SM3PARTW2_VVV4_cryptosha512_3\n\tif(O && opcode==2 && HasSM4()) return SM4EKEY_advsimd(ctx, dec); // -> SM4EKEY_VVV4_cryptosha512_3\n\tif(O && opcode==3) UNALLOCATED(ENC_UNALLOCATED_18_CRYPTOSHA512_3);\n\tUNMATCHED;\n}\n\nint decode_iclass_crypto3_imm2(context *ctx, Instruction *dec)\n{\n\tuint32_t opcode=(INSWORD>>10)&3;\n\tif(!opcode && HasSM3()) return SM3TT1A_advsimd(ctx, dec); // -> SM3TT1A_VVV4_crypto3_imm2\n\tif(opcode==1 && HasSM3()) return SM3TT1B_advsimd(ctx, dec); // -> SM3TT1B_VVV4_crypto3_imm2\n\tif(opcode==2 && HasSM3()) return SM3TT2A_advsimd(ctx, dec); // -> SM3TT2A_VVV4_crypto3_imm2\n\tif(opcode==3 && HasSM3()) return SM3TT2B_advsimd(ctx, dec); // -> SM3TT2B_VVV_crypto3_imm2\n\tUNMATCHED;\n}\n\nint decode_iclass_crypto3_imm6(context *ctx, Instruction *dec)\n{\n\treturn XAR_advsimd(ctx, dec);\n}\n\nint decode_iclass_cryptosha2(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, opcode=(INSWORD>>12)&0x1f;\n\tif(!size && !opcode) return SHA1H_advsimd(ctx, dec); // -> SHA1H_SS_cryptosha2\n\tif(!size && opcode==1) return SHA1SU1_advsimd(ctx, dec); // -> SHA1SU1_VV_cryptosha2\n\tif(!size && opcode==2) return SHA256SU0_advsimd(ctx, dec); // -> SHA256SU0_VV_cryptosha2\n\tif(!size && opcode==3) UNALLOCATED(ENC_UNALLOCATED_16_CRYPTOSHA2);\n\tif((opcode&4)==4) UNALLOCATED(ENC_UNALLOCATED_17_CRYPTOSHA2);\n\tif((opcode&8)==8) UNALLOCATED(ENC_UNALLOCATED_18_CRYPTOSHA2);\n\tif((opcode&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_19_CRYPTOSHA2);\n\tif(size&1) UNALLOCATED(ENC_UNALLOCATED_11_CRYPTOSHA2);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_12_CRYPTOSHA2);\n\tUNMATCHED;\n}\n\nint decode_iclass_cryptosha512_2(context *ctx, Instruction *dec)\n{\n\tuint32_t opcode=(INSWORD>>10)&3;\n\tif(!opcode && HasSHA512()) return SHA512SU0_advsimd(ctx, dec); // -> SHA512SU0_VV2_cryptosha512_2\n\tif(opcode==1 && HasSM4()) return SM4E_advsimd(ctx, dec); // -> SM4E_VV4_cryptosha512_2\n\tif((opcode&2)==2) UNALLOCATED(ENC_UNALLOCATED_11_CRYPTOSHA512_2);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatcmp(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, op=(INSWORD>>14)&3, opcode2=INSWORD&0x1f;\n\tif(!M && !S && !ptype && !op && !opcode2) return FCMP_float(ctx, dec); // -> FCMP_S_floatcmp\n\tif(!M && !S && !ptype && !op && opcode2==8) return FCMP_float(ctx, dec); // -> FCMP_SZ_floatcmp\n\tif(!M && !S && !ptype && !op && opcode2==0x10) return FCMPE_float(ctx, dec); // -> FCMPE_S_floatcmp\n\tif(!M && !S && !ptype && !op && opcode2==0x18) return FCMPE_float(ctx, dec); // -> FCMPE_SZ_floatcmp\n\tif(!M && !S && ptype==1 && !op && !opcode2) return FCMP_float(ctx, dec); // -> FCMP_D_floatcmp\n\tif(!M && !S && ptype==1 && !op && opcode2==8) return FCMP_float(ctx, dec); // -> FCMP_DZ_floatcmp\n\tif(!M && !S && ptype==1 && !op && opcode2==0x10) return FCMPE_float(ctx, dec); // -> FCMPE_D_floatcmp\n\tif(!M && !S && ptype==1 && !op && opcode2==0x18) return FCMPE_float(ctx, dec); // -> FCMPE_DZ_floatcmp\n\tif(!M && !S && ptype==3 && !op && !opcode2 && HasFP16()) return FCMP_float(ctx, dec); // -> FCMP_H_floatcmp\n\tif(!M && !S && ptype==3 && !op && opcode2==8 && HasFP16()) return FCMP_float(ctx, dec); // -> FCMP_HZ_floatcmp\n\tif(!M && !S && ptype==3 && !op && opcode2==0x10 && HasFP16()) return FCMPE_float(ctx, dec); // -> FCMPE_H_floatcmp\n\tif(!M && !S && ptype==3 && !op && opcode2==0x18 && HasFP16()) return FCMPE_float(ctx, dec); // -> FCMPE_HZ_floatcmp\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_17_FLOATCMP);\n\tif(opcode2&1) UNALLOCATED(ENC_UNALLOCATED_12_FLOATCMP);\n\tif((opcode2&2)==2) UNALLOCATED(ENC_UNALLOCATED_13_FLOATCMP);\n\tif((opcode2&4)==4) UNALLOCATED(ENC_UNALLOCATED_14_FLOATCMP);\n\tif(op&1) UNALLOCATED(ENC_UNALLOCATED_15_FLOATCMP);\n\tif((op&2)==2) UNALLOCATED(ENC_UNALLOCATED_16_FLOATCMP);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOATCMP);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_11_FLOATCMP);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatccmp(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, op=(INSWORD>>4)&1;\n\tif(!M && !S && !ptype && !op) return FCCMP_float(ctx, dec); // -> FCCMP_S_floatccmp\n\tif(!M && !S && !ptype && op) return FCCMPE_float(ctx, dec); // -> FCCMPE_S_floatccmp\n\tif(!M && !S && ptype==1 && !op) return FCCMP_float(ctx, dec); // -> FCCMP_D_floatccmp\n\tif(!M && !S && ptype==1 && op) return FCCMPE_float(ctx, dec); // -> FCCMPE_D_floatccmp\n\tif(!M && !S && ptype==3 && !op && HasFP16()) return FCCMP_float(ctx, dec); // -> FCCMP_H_floatccmp\n\tif(!M && !S && ptype==3 && op && HasFP16()) return FCCMPE_float(ctx, dec); // -> FCCMPE_H_floatccmp\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_12_FLOATCCMP);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOATCCMP);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_11_FLOATCCMP);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatsel(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3;\n\tif(!M && !S && !ptype) return FCSEL_float(ctx, dec); // -> FCSEL_S_floatsel\n\tif(!M && !S && ptype==1) return FCSEL_float(ctx, dec); // -> FCSEL_D_floatsel\n\tif(!M && !S && ptype==3 && HasFP16()) return FCSEL_float(ctx, dec); // -> FCSEL_H_floatsel\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_12_FLOATSEL);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOATSEL);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_11_FLOATSEL);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatdp1(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, opcode=(INSWORD>>15)&0x3f;\n\tif(!M && !S && !ptype && !opcode) return FMOV_float(ctx, dec); // -> FMOV_S_floatdp1\n\tif(!M && !S && !ptype && opcode==1) return FABS_float(ctx, dec); // -> FABS_S_floatdp1\n\tif(!M && !S && !ptype && opcode==2) return FNEG_float(ctx, dec); // -> FNEG_S_floatdp1\n\tif(!M && !S && !ptype && opcode==3) return FSQRT_float(ctx, dec); // -> FSQRT_S_floatdp1\n\tif(!M && !S && !ptype && opcode==4) UNALLOCATED(ENC_UNALLOCATED_17_FLOATDP1);\n\tif(!M && !S && !ptype && opcode==5) return FCVT_float(ctx, dec); // -> FCVT_DS_floatdp1\n\tif(!M && !S && !ptype && opcode==6) UNALLOCATED(ENC_UNALLOCATED_19_FLOATDP1);\n\tif(!M && !S && !ptype && opcode==7) return FCVT_float(ctx, dec); // -> FCVT_HS_floatdp1\n\tif(!M && !S && !ptype && opcode==8) return FRINTN_float(ctx, dec); // -> FRINTN_S_floatdp1\n\tif(!M && !S && !ptype && opcode==9) return FRINTP_float(ctx, dec); // -> FRINTP_S_floatdp1\n\tif(!M && !S && !ptype && opcode==10) return FRINTM_float(ctx, dec); // -> FRINTM_S_floatdp1\n\tif(!M && !S && !ptype && opcode==11) return FRINTZ_float(ctx, dec); // -> FRINTZ_S_floatdp1\n\tif(!M && !S && !ptype && opcode==12) return FRINTA_float(ctx, dec); // -> FRINTA_S_floatdp1\n\tif(!M && !S && !ptype && opcode==13) UNALLOCATED(ENC_UNALLOCATED_26_FLOATDP1);\n\tif(!M && !S && !ptype && opcode==14) return FRINTX_float(ctx, dec); // -> FRINTX_S_floatdp1\n\tif(!M && !S && !ptype && opcode==15) return FRINTI_float(ctx, dec); // -> FRINTI_S_floatdp1\n\tif(!M && !S && !ptype && opcode==0x10 && HasFRINTTS()) return FRINT32Z_float(ctx, dec); // -> FRINT32Z_S_floatdp1\n\tif(!M && !S && !ptype && opcode==0x11 && HasFRINTTS()) return FRINT32X_float(ctx, dec); // -> FRINT32X_S_floatdp1\n\tif(!M && !S && !ptype && opcode==0x12 && HasFRINTTS()) return FRINT64Z_float(ctx, dec); // -> FRINT64Z_S_floatdp1\n\tif(!M && !S && !ptype && opcode==0x13 && HasFRINTTS()) return FRINT64X_float(ctx, dec); // -> FRINT64X_S_floatdp1\n\tif(!M && !S && ptype==1 && !opcode) return FMOV_float(ctx, dec); // -> FMOV_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==1) return FABS_float(ctx, dec); // -> FABS_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==2) return FNEG_float(ctx, dec); // -> FNEG_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==3) return FSQRT_float(ctx, dec); // -> FSQRT_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==4) return FCVT_float(ctx, dec); // -> FCVT_SD_floatdp1\n\tif(!M && !S && ptype==1 && opcode==5) UNALLOCATED(ENC_UNALLOCATED_40_FLOATDP1);\n\tif(!M && !S && ptype==1 && opcode==6 && HasBF16()) return BFCVT_float(ctx, dec); // -> BFCVT_BS_floatdp1\n\tif(!M && !S && ptype==1 && opcode==7) return FCVT_float(ctx, dec); // -> FCVT_HD_floatdp1\n\tif(!M && !S && ptype==1 && opcode==8) return FRINTN_float(ctx, dec); // -> FRINTN_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==9) return FRINTP_float(ctx, dec); // -> FRINTP_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==10) return FRINTM_float(ctx, dec); // -> FRINTM_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==11) return FRINTZ_float(ctx, dec); // -> FRINTZ_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==12) return FRINTA_float(ctx, dec); // -> FRINTA_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==13) UNALLOCATED(ENC_UNALLOCATED_48_FLOATDP1);\n\tif(!M && !S && ptype==1 && opcode==14) return FRINTX_float(ctx, dec); // -> FRINTX_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==15) return FRINTI_float(ctx, dec); // -> FRINTI_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==0x10 && HasFRINTTS()) return FRINT32Z_float(ctx, dec); // -> FRINT32Z_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==0x11 && HasFRINTTS()) return FRINT32X_float(ctx, dec); // -> FRINT32X_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==0x12 && HasFRINTTS()) return FRINT64Z_float(ctx, dec); // -> FRINT64Z_D_floatdp1\n\tif(!M && !S && ptype==1 && opcode==0x13 && HasFRINTTS()) return FRINT64X_float(ctx, dec); // -> FRINT64X_D_floatdp1\n\tif(!M && !S && ptype==3 && !opcode && HasFP16()) return FMOV_float(ctx, dec); // -> FMOV_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==1 && HasFP16()) return FABS_float(ctx, dec); // -> FABS_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==2 && HasFP16()) return FNEG_float(ctx, dec); // -> FNEG_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==3 && HasFP16()) return FSQRT_float(ctx, dec); // -> FSQRT_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==4) return FCVT_float(ctx, dec); // -> FCVT_SH_floatdp1\n\tif(!M && !S && ptype==3 && opcode==5) return FCVT_float(ctx, dec); // -> FCVT_DH_floatdp1\n\tif(!M && !S && ptype==3 && opcode==8 && HasFP16()) return FRINTN_float(ctx, dec); // -> FRINTN_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==9 && HasFP16()) return FRINTP_float(ctx, dec); // -> FRINTP_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==10 && HasFP16()) return FRINTM_float(ctx, dec); // -> FRINTM_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==11 && HasFP16()) return FRINTZ_float(ctx, dec); // -> FRINTZ_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==12 && HasFP16()) return FRINTA_float(ctx, dec); // -> FRINTA_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==13) UNALLOCATED(ENC_UNALLOCATED_70_FLOATDP1);\n\tif(!M && !S && ptype==3 && opcode==14 && HasFP16()) return FRINTX_float(ctx, dec); // -> FRINTX_H_floatdp1\n\tif(!M && !S && ptype==3 && opcode==15 && HasFP16()) return FRINTI_float(ctx, dec); // -> FRINTI_H_floatdp1\n\tif(!M && !S && ptype==3 && (opcode&0x3e)==6) UNALLOCATED(ENC_UNALLOCATED_64_FLOATDP1);\n\tif(!M && !S && !ptype && (opcode&0x3c)==0x14) UNALLOCATED(ENC_UNALLOCATED_33_FLOATDP1);\n\tif(!M && !S && ptype==1 && (opcode&0x3c)==0x14) UNALLOCATED(ENC_UNALLOCATED_55_FLOATDP1);\n\tif(!M && !S && !ptype && (opcode&0x38)==0x18) UNALLOCATED(ENC_UNALLOCATED_34_FLOATDP1);\n\tif(!M && !S && ptype==1 && (opcode&0x38)==0x18) UNALLOCATED(ENC_UNALLOCATED_56_FLOATDP1);\n\tif(!M && !S && ptype==3 && (opcode&0x30)==0x10) UNALLOCATED(ENC_UNALLOCATED_73_FLOATDP1);\n\tif(!M && !S && ptype==2 && !(opcode&0x20)) UNALLOCATED(ENC_UNALLOCATED_57_FLOATDP1);\n\tif((opcode&0x20)==0x20) UNALLOCATED(ENC_UNALLOCATED_12_FLOATDP1);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_10_FLOATDP1);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_11_FLOATDP1);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatdp2(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, opcode=(INSWORD>>12)&15;\n\tif(!M && !S && !ptype && !opcode) return FMUL_float(ctx, dec); // -> FMUL_S_floatdp2\n\tif(!M && !S && !ptype && opcode==1) return FDIV_float(ctx, dec); // -> FDIV_S_floatdp2\n\tif(!M && !S && !ptype && opcode==2) return FADD_float(ctx, dec); // -> FADD_S_floatdp2\n\tif(!M && !S && !ptype && opcode==3) return FSUB_float(ctx, dec); // -> FSUB_S_floatdp2\n\tif(!M && !S && !ptype && opcode==4) return FMAX_float(ctx, dec); // -> FMAX_S_floatdp2\n\tif(!M && !S && !ptype && opcode==5) return FMIN_float(ctx, dec); // -> FMIN_S_floatdp2\n\tif(!M && !S && !ptype && opcode==6) return FMAXNM_float(ctx, dec); // -> FMAXNM_S_floatdp2\n\tif(!M && !S && !ptype && opcode==7) return FMINNM_float(ctx, dec); // -> FMINNM_S_floatdp2\n\tif(!M && !S && !ptype && opcode==8) return FNMUL_float(ctx, dec); // -> FNMUL_S_floatdp2\n\tif(!M && !S && ptype==1 && !opcode) return FMUL_float(ctx, dec); // -> FMUL_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==1) return FDIV_float(ctx, dec); // -> FDIV_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==2) return FADD_float(ctx, dec); // -> FADD_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==3) return FSUB_float(ctx, dec); // -> FSUB_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==4) return FMAX_float(ctx, dec); // -> FMAX_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==5) return FMIN_float(ctx, dec); // -> FMIN_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==6) return FMAXNM_float(ctx, dec); // -> FMAXNM_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==7) return FMINNM_float(ctx, dec); // -> FMINNM_D_floatdp2\n\tif(!M && !S && ptype==1 && opcode==8) return FNMUL_float(ctx, dec); // -> FNMUL_D_floatdp2\n\tif(!M && !S && ptype==3 && !opcode && HasFP16()) return FMUL_float(ctx, dec); // -> FMUL_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==1 && HasFP16()) return FDIV_float(ctx, dec); // -> FDIV_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==2 && HasFP16()) return FADD_float(ctx, dec); // -> FADD_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==3 && HasFP16()) return FSUB_float(ctx, dec); // -> FSUB_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==4 && HasFP16()) return FMAX_float(ctx, dec); // -> FMAX_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==5 && HasFP16()) return FMIN_float(ctx, dec); // -> FMIN_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==6 && HasFP16()) return FMAXNM_float(ctx, dec); // -> FMAXNM_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==7 && HasFP16()) return FMINNM_float(ctx, dec); // -> FMINNM_H_floatdp2\n\tif(!M && !S && ptype==3 && opcode==8 && HasFP16()) return FNMUL_float(ctx, dec); // -> FNMUL_H_floatdp2\n\tif((opcode&9)==9) UNALLOCATED(ENC_UNALLOCATED_13_FLOATDP2);\n\tif((opcode&10)==10) UNALLOCATED(ENC_UNALLOCATED_14_FLOATDP2);\n\tif((opcode&12)==12) UNALLOCATED(ENC_UNALLOCATED_15_FLOATDP2);\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_10_FLOATDP2);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_11_FLOATDP2);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_12_FLOATDP2);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatdp3(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, o1=(INSWORD>>21)&1, o0=(INSWORD>>15)&1;\n\tif(!M && !S && !ptype && !o1 && !o0) return FMADD_float(ctx, dec); // -> FMADD_S_floatdp3\n\tif(!M && !S && !ptype && !o1 && o0) return FMSUB_float(ctx, dec); // -> FMSUB_S_floatdp3\n\tif(!M && !S && !ptype && o1 && !o0) return FNMADD_float(ctx, dec); // -> FNMADD_S_floatdp3\n\tif(!M && !S && !ptype && o1 && o0) return FNMSUB_float(ctx, dec); // -> FNMSUB_S_floatdp3\n\tif(!M && !S && ptype==1 && !o1 && !o0) return FMADD_float(ctx, dec); // -> FMADD_D_floatdp3\n\tif(!M && !S && ptype==1 && !o1 && o0) return FMSUB_float(ctx, dec); // -> FMSUB_D_floatdp3\n\tif(!M && !S && ptype==1 && o1 && !o0) return FNMADD_float(ctx, dec); // -> FNMADD_D_floatdp3\n\tif(!M && !S && ptype==1 && o1 && o0) return FNMSUB_float(ctx, dec); // -> FNMSUB_D_floatdp3\n\tif(!M && !S && ptype==3 && !o1 && !o0 && HasFP16()) return FMADD_float(ctx, dec); // -> FMADD_H_floatdp3\n\tif(!M && !S && ptype==3 && !o1 && o0 && HasFP16()) return FMSUB_float(ctx, dec); // -> FMSUB_H_floatdp3\n\tif(!M && !S && ptype==3 && o1 && !o0 && HasFP16()) return FNMADD_float(ctx, dec); // -> FNMADD_H_floatdp3\n\tif(!M && !S && ptype==3 && o1 && o0 && HasFP16()) return FNMSUB_float(ctx, dec); // -> FNMSUB_H_floatdp3\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_10_FLOATDP3);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_12_FLOATDP3);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_11_FLOATDP3);\n\tUNMATCHED;\n}\n\nint decode_iclass_floatimm(context *ctx, Instruction *dec)\n{\n\tuint32_t M=INSWORD>>31, S=(INSWORD>>29)&1, ptype=(INSWORD>>22)&3, imm5=(INSWORD>>5)&0x1f;\n\tif(!M && !S && !ptype && !imm5) return FMOV_float_imm(ctx, dec); // -> FMOV_S_floatimm\n\tif(!M && !S && ptype==1 && !imm5) return FMOV_float_imm(ctx, dec); // -> FMOV_D_floatimm\n\tif(!M && !S && ptype==3 && !imm5 && HasFP16()) return FMOV_float_imm(ctx, dec); // -> FMOV_H_floatimm\n\tif(ptype==2) UNALLOCATED(ENC_UNALLOCATED_17_FLOATIMM);\n\tif(imm5&1) UNALLOCATED(ENC_UNALLOCATED_10_FLOATIMM);\n\tif((imm5&2)==2) UNALLOCATED(ENC_UNALLOCATED_11_FLOATIMM);\n\tif((imm5&4)==4) UNALLOCATED(ENC_UNALLOCATED_12_FLOATIMM);\n\tif((imm5&8)==8) UNALLOCATED(ENC_UNALLOCATED_13_FLOATIMM);\n\tif((imm5&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_14_FLOATIMM);\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_15_FLOATIMM);\n\tif(M) UNALLOCATED(ENC_UNALLOCATED_16_FLOATIMM);\n\tUNMATCHED;\n}\n\nint decode_iclass_perm_undef(context *ctx, Instruction *dec)\n{\n\treturn UDF_perm_undef(ctx, dec);\n}\n\nint decode_iclass_sve_int_bin_pred_log(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return orr_z_p_zz(ctx, dec); // -> orr_z_p_zz_\n\tif(opc==1) return eor_z_p_zz(ctx, dec); // -> eor_z_p_zz_\n\tif(opc==2) return and_z_p_zz(ctx, dec); // -> and_z_p_zz_\n\tif(opc==3) return bic_z_p_zz(ctx, dec); // -> bic_z_p_zz_\n\tif((opc&4)==4) UNALLOCATED(ENC_UNALLOCATED_153);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_arit_0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return add_z_p_zz(ctx, dec); // -> add_z_p_zz_\n\tif(opc==1) return sub_z_p_zz(ctx, dec); // -> sub_z_p_zz_\n\tif(opc==2) UNALLOCATED(ENC_UNALLOCATED_139);\n\tif(opc==3) return subr_z_p_zz(ctx, dec); // -> subr_z_p_zz_\n\tif((opc&4)==4) UNALLOCATED(ENC_UNALLOCATED_142);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_div(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!R && !U) return sdiv_z_p_zz(ctx, dec); // -> sdiv_z_p_zz_\n\tif(!R && U) return udiv_z_p_zz(ctx, dec); // -> udiv_z_p_zz_\n\tif(R && !U) return sdivr_z_p_zz(ctx, dec); // -> sdivr_z_p_zz_\n\tif(R && U) return udivr_z_p_zz(ctx, dec); // -> udivr_z_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_arit_1(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>17)&3, U=(INSWORD>>16)&1;\n\tif(!opc && !U) return smax_z_p_zz(ctx, dec); // -> smax_z_p_zz_\n\tif(!opc && U) return umax_z_p_zz(ctx, dec); // -> umax_z_p_zz_\n\tif(opc==1 && !U) return smin_z_p_zz(ctx, dec); // -> smin_z_p_zz_\n\tif(opc==1 && U) return umin_z_p_zz(ctx, dec); // -> umin_z_p_zz_\n\tif(opc==2 && !U) return sabd_z_p_zz(ctx, dec); // -> sabd_z_p_zz_\n\tif(opc==2 && U) return uabd_z_p_zz(ctx, dec); // -> uabd_z_p_zz_\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_145);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_arit_2(context *ctx, Instruction *dec)\n{\n\tuint32_t H=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!H && !U) return mul_z_p_zz(ctx, dec); // -> mul_z_p_zz_\n\tif(!H && U) UNALLOCATED(ENC_UNALLOCATED_147);\n\tif(H && !U) return smulh_z_p_zz(ctx, dec); // -> smulh_z_p_zz_\n\tif(H && U) return umulh_z_p_zz(ctx, dec); // -> umulh_z_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_reduce_2(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&3;\n\tif(!opc) return orv_r_p_z(ctx, dec); // -> orv_r_p_z_\n\tif(opc==1) return eorv_r_p_z(ctx, dec); // -> eorv_r_p_z_\n\tif(opc==2) return andv_r_p_z(ctx, dec); // -> andv_r_p_z_\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_152);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_movprfx_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>17)&3;\n\tif(!opc) return movprfx_z_p_z(ctx, dec); // -> movprfx_z_p_z_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_148);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_150);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_reduce_0(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!op && !U) return saddv_r_p_z(ctx, dec); // -> saddv_r_p_z_\n\tif(!op && U) return uaddv_r_p_z(ctx, dec); // -> uaddv_r_p_z_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_140);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_reduce_1(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!op && !U) return smaxv_r_p_z(ctx, dec); // -> smaxv_r_p_z_\n\tif(!op && U) return umaxv_r_p_z(ctx, dec); // -> umaxv_r_p_z_\n\tif(op && !U) return sminv_r_p_z(ctx, dec); // -> sminv_r_p_z_\n\tif(op && U) return uminv_r_p_z(ctx, dec); // -> uminv_r_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_shift_0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>18)&3, L=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!opc && !L && !U) return asr_z_p_zi(ctx, dec); // -> asr_z_p_zi_\n\tif(!opc && !L && U) return lsr_z_p_zi(ctx, dec); // -> lsr_z_p_zi_\n\tif(!opc && L && !U) UNALLOCATED(ENC_UNALLOCATED_141);\n\tif(!opc && L && U) return lsl_z_p_zi(ctx, dec); // -> lsl_z_p_zi_\n\tif(opc==1 && !L && !U) return asrd_z_p_zi(ctx, dec); // -> asrd_z_p_zi_\n\tif(opc==1 && !L && U) UNALLOCATED(ENC_UNALLOCATED_143);\n\tif(opc==1 && L && !U) return sqshl_z_p_zi(ctx, dec); // -> sqshl_z_p_zi_\n\tif(opc==1 && L && U) return uqshl_z_p_zi(ctx, dec); // -> uqshl_z_p_zi_\n\tif(opc==3 && !L && !U) return srshr_z_p_zi(ctx, dec); // -> srshr_z_p_zi_\n\tif(opc==3 && !L && U) return urshr_z_p_zi(ctx, dec); // -> urshr_z_p_zi_\n\tif(opc==3 && L && !U) UNALLOCATED(ENC_UNALLOCATED_146);\n\tif(opc==3 && L && U) return sqshlu_z_p_zi(ctx, dec); // -> sqshlu_z_p_zi_\n\tif(opc==2) UNALLOCATED(ENC_UNALLOCATED_144);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_shift_1(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>18)&1, L=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!R && !L && !U) return asr_z_p_zz(ctx, dec); // -> asr_z_p_zz_\n\tif(!R && !L && U) return lsr_z_p_zz(ctx, dec); // -> lsr_z_p_zz_\n\tif(!R && L && U) return lsl_z_p_zz(ctx, dec); // -> lsl_z_p_zz_\n\tif(R && !L && !U) return asrr_z_p_zz(ctx, dec); // -> asrr_z_p_zz_\n\tif(R && !L && U) return lsrr_z_p_zz(ctx, dec); // -> lsrr_z_p_zz_\n\tif(R && L && U) return lslr_z_p_zz(ctx, dec); // -> lslr_z_p_zz_\n\tif(L && !U) UNALLOCATED(ENC_UNALLOCATED_149);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_pred_shift_2(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>18)&1, L=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!R && !L && !U) return asr_z_p_zw(ctx, dec); // -> asr_z_p_zw_\n\tif(!R && !L && U) return lsr_z_p_zw(ctx, dec); // -> lsr_z_p_zw_\n\tif(!R && L && !U) UNALLOCATED(ENC_UNALLOCATED_151);\n\tif(!R && L && U) return lsl_z_p_zw(ctx, dec); // -> lsl_z_p_zw_\n\tif(R) UNALLOCATED(ENC_UNALLOCATED_154);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_un_pred_arit_1(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return cls_z_p_z(ctx, dec); // -> cls_z_p_z_\n\tif(opc==1) return clz_z_p_z(ctx, dec); // -> clz_z_p_z_\n\tif(opc==2) return cnt_z_p_z(ctx, dec); // -> cnt_z_p_z_\n\tif(opc==3) return cnot_z_p_z(ctx, dec); // -> cnot_z_p_z_\n\tif(opc==4) return fabs_z_p_z(ctx, dec); // -> fabs_z_p_z_\n\tif(opc==5) return fneg_z_p_z(ctx, dec); // -> fneg_z_p_z_\n\tif(opc==6) return not_z_p_z(ctx, dec); // -> not_z_p_z_\n\tif(opc==7) UNALLOCATED(ENC_UNALLOCATED_155);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_un_pred_arit_0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return sxtb_z_p_z(ctx, dec); // -> sxtb_z_p_z_\n\tif(opc==1) return uxtb_z_p_z(ctx, dec); // -> uxtb_z_p_z_\n\tif(opc==2) return sxtb_z_p_z(ctx, dec); // -> sxth_z_p_z_\n\tif(opc==3) return uxtb_z_p_z(ctx, dec); // -> uxth_z_p_z_\n\tif(opc==4) return sxtb_z_p_z(ctx, dec); // -> sxtw_z_p_z_\n\tif(opc==5) return uxtb_z_p_z(ctx, dec); // -> uxtw_z_p_z_\n\tif(opc==6) return abs_z_p_z(ctx, dec); // -> abs_z_p_z_\n\tif(opc==7) return neg_z_p_z(ctx, dec); // -> neg_z_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_mlas_vvv_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>13)&1;\n\tif(!op) return mla_z_p_zzz(ctx, dec); // -> mla_z_p_zzz_\n\tif(op) return mls_z_p_zzz(ctx, dec); // -> mls_z_p_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_mladdsub_vvv_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>13)&1;\n\tif(!op) return mad_z_p_zzz(ctx, dec); // -> mad_z_p_zzz_\n\tif(op) return msb_z_p_zzz(ctx, dec); // -> msb_z_p_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_arit_0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&7;\n\tif(!opc) return add_z_zz(ctx, dec); // -> add_z_zz_\n\tif(opc==1) return sub_z_zz(ctx, dec); // -> sub_z_zz_\n\tif(opc==4) return sqadd_z_zz(ctx, dec); // -> sqadd_z_zz_\n\tif(opc==5) return uqadd_z_zz(ctx, dec); // -> uqadd_z_zz_\n\tif(opc==6) return sqsub_z_zz(ctx, dec); // -> sqsub_z_zz_\n\tif(opc==7) return uqsub_z_zz(ctx, dec); // -> uqsub_z_zz_\n\tif((opc&6)==2) UNALLOCATED(ENC_UNALLOCATED_156);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_log(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) return and_z_zz(ctx, dec); // -> and_z_zz_\n\tif(opc==1) return orr_z_zz(ctx, dec); // -> orr_z_zz_\n\tif(opc==2) return eor_z_zz(ctx, dec); // -> eor_z_zz_\n\tif(opc==3) return bic_z_zz(ctx, dec); // -> bic_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_tern_log(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, o2=(INSWORD>>10)&1;\n\tif(!opc && !o2) return eor3_z_zzz(ctx, dec); // -> eor3_z_zzz_\n\tif(!opc && o2) return bsl_z_zzz(ctx, dec); // -> bsl_z_zzz_\n\tif(opc==1 && !o2) return bcax_z_zzz(ctx, dec); // -> bcax_z_zzz_\n\tif(opc==1 && o2) return bsl1n_z_zzz(ctx, dec); // -> bsl1n_z_zzz_\n\tif(opc==2 && o2) return bsl2n_z_zzz(ctx, dec); // -> bsl2n_z_zzz_\n\tif(opc==3 && o2) return nbsl_z_zzz(ctx, dec); // -> nbsl_z_zzz_\n\tif((opc&2)==2 && !o2) UNALLOCATED(ENC_UNALLOCATED_175);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_rotate_imm(context *ctx, Instruction *dec)\n{\n\treturn xar_z_zzi(ctx, dec);\n}\n\nint decode_iclass_sve_int_index_ii(context *ctx, Instruction *dec)\n{\n\treturn index_z_ii(ctx, dec);\n}\n\nint decode_iclass_sve_int_index_ir(context *ctx, Instruction *dec)\n{\n\treturn index_z_ir(ctx, dec);\n}\n\nint decode_iclass_sve_int_index_ri(context *ctx, Instruction *dec)\n{\n\treturn index_z_ri(ctx, dec);\n}\n\nint decode_iclass_sve_int_index_rr(context *ctx, Instruction *dec)\n{\n\treturn index_z_rr(ctx, dec);\n}\n\nint decode_iclass_sve_int_arith_vl(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1;\n\tif(!op) return addvl_r_ri(ctx, dec); // -> addvl_r_ri_\n\tif(op) return addpl_r_ri(ctx, dec); // -> addpl_r_ri_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_read_vl_a(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1, opc2=(INSWORD>>16)&0x1f;\n\tif(!op && opc2==0x1e) UNALLOCATED(ENC_UNALLOCATED_182);\n\tif(!op && opc2==0x1f) return rdvl_r_i(ctx, dec); // -> rdvl_r_i_\n\tif(!op && (opc2&0x1e)==0x1c) UNALLOCATED(ENC_UNALLOCATED_181);\n\tif(!op && (opc2&0x1c)==0x18) UNALLOCATED(ENC_UNALLOCATED_180);\n\tif(!op && (opc2&0x18)==0x10) UNALLOCATED(ENC_UNALLOCATED_179);\n\tif(!op && !(opc2&0x10)) UNALLOCATED(ENC_UNALLOCATED_176);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_183);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_mul_b(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, opc=(INSWORD>>10)&3;\n\tif(!size && opc==1) return pmul_z_zz(ctx, dec); // -> pmul_z_zz_\n\tif(size==1 && opc==1) UNALLOCATED(ENC_UNALLOCATED_173);\n\tif((size&2)==2 && opc==1) UNALLOCATED(ENC_UNALLOCATED_177);\n\tif(!opc) return mul_z_zz(ctx, dec); // -> mul_z_zz_\n\tif(opc==2) return smulh_z_zz(ctx, dec); // -> smulh_z_zz_\n\tif(opc==3) return umulh_z_zz(ctx, dec); // -> umulh_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_sqdmulh(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>10)&1;\n\tif(!R) return sqdmulh_z_zz(ctx, dec); // -> sqdmulh_z_zz_\n\tif(R) return sqrdmulh_z_zz(ctx, dec); // -> sqrdmulh_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_shift_b(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&3;\n\tif(!opc) return asr_z_zi(ctx, dec); // -> asr_z_zi_\n\tif(opc==1) return lsr_z_zi(ctx, dec); // -> lsr_z_zi_\n\tif(opc==2) UNALLOCATED(ENC_UNALLOCATED_158);\n\tif(opc==3) return lsl_z_zi(ctx, dec); // -> lsl_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_shift_a(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&3;\n\tif(!opc) return asr_z_zw(ctx, dec); // -> asr_z_zw_\n\tif(opc==1) return lsr_z_zw(ctx, dec); // -> lsr_z_zw_\n\tif(opc==2) UNALLOCATED(ENC_UNALLOCATED_157);\n\tif(opc==3) return lsl_z_zw(ctx, dec); // -> lsl_z_zw_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_misc_0_a(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) return adr_z_az(ctx, dec); // -> adr_z_az_d_s32_scaled\n\tif(opc==1) return adr_z_az(ctx, dec); // -> adr_z_az_d_u32_scaled\n\tif((opc&2)==2) return adr_z_az(ctx, dec); // -> adr_z_az_sd_same_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_misc_0_d(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, opc2=(INSWORD>>16)&0x1f;\n\tif(!opc && !opc2) return movprfx_z_z(ctx, dec); // -> movprfx_z_z_\n\tif(!opc && opc2==1) UNALLOCATED(ENC_UNALLOCATED_163);\n\tif(!opc && (opc2&0x1e)==2) UNALLOCATED(ENC_UNALLOCATED_165);\n\tif(!opc && (opc2&0x1c)==4) UNALLOCATED(ENC_UNALLOCATED_167);\n\tif(!opc && (opc2&0x18)==8) UNALLOCATED(ENC_UNALLOCATED_169);\n\tif(!opc && (opc2&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_171);\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_174);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_178);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_misc_0_c(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&0x1f;\n\tif(!opc) return fexpa_z_z(ctx, dec); // -> fexpa_z_z_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_162);\n\tif((opc&0x1e)==2) UNALLOCATED(ENC_UNALLOCATED_164);\n\tif((opc&0x1c)==4) UNALLOCATED(ENC_UNALLOCATED_166);\n\tif((opc&0x18)==8) UNALLOCATED(ENC_UNALLOCATED_168);\n\tif((opc&0x10)==0x10) UNALLOCATED(ENC_UNALLOCATED_170);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_bin_cons_misc_0_b(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>10)&1;\n\tif(!op) return ftssel_z_zz(ctx, dec); // -> ftssel_z_zz_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_159);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_count(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, op=(INSWORD>>10)&1;\n\tif(!size && !op) return cntb_r_s(ctx, dec); // -> cntb_r_s_\n\tif(size==1 && !op) return cntb_r_s(ctx, dec); // -> cnth_r_s_\n\tif(size==2 && !op) return cntb_r_s(ctx, dec); // -> cntw_r_s_\n\tif(size==3 && !op) return cntb_r_s(ctx, dec); // -> cntd_r_s_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_161);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pred_pattern_a(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, D=(INSWORD>>10)&1;\n\tif(!size && !D) return incb_r_rs(ctx, dec); // -> incb_r_rs_\n\tif(!size && D) return decb_r_rs(ctx, dec); // -> decb_r_rs_\n\tif(size==1 && !D) return incb_r_rs(ctx, dec); // -> inch_r_rs_\n\tif(size==1 && D) return decb_r_rs(ctx, dec); // -> dech_r_rs_\n\tif(size==2 && !D) return incb_r_rs(ctx, dec); // -> incw_r_rs_\n\tif(size==2 && D) return decb_r_rs(ctx, dec); // -> decw_r_rs_\n\tif(size==3 && !D) return incb_r_rs(ctx, dec); // -> incd_r_rs_\n\tif(size==3 && D) return decb_r_rs(ctx, dec); // -> decd_r_rs_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_countvlv1(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, D=(INSWORD>>10)&1;\n\tif(size==1 && !D) return incd_z_zs(ctx, dec); // -> inch_z_zs_\n\tif(size==1 && D) return decd_z_zs(ctx, dec); // -> dech_z_zs_\n\tif(size==2 && !D) return incd_z_zs(ctx, dec); // -> incw_z_zs_\n\tif(size==2 && D) return decd_z_zs(ctx, dec); // -> decw_z_zs_\n\tif(size==3 && !D) return incd_z_zs(ctx, dec); // -> incd_z_zs_\n\tif(size==3 && D) return decd_z_zs(ctx, dec); // -> decd_z_zs_\n\tif(!size) UNALLOCATED(ENC_UNALLOCATED_172);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pred_pattern_b(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, sf=(INSWORD>>20)&1, D=(INSWORD>>11)&1, U=(INSWORD>>10)&1;\n\tif(!size && !sf && !D && !U) return sqincb_r_rs(ctx, dec); // -> sqincb_r_rs_sx\n\tif(!size && !sf && !D && U) return uqincb_r_rs(ctx, dec); // -> uqincb_r_rs_uw\n\tif(!size && !sf && D && !U) return sqdecb_r_rs(ctx, dec); // -> sqdecb_r_rs_sx\n\tif(!size && !sf && D && U) return uqdecb_r_rs(ctx, dec); // -> uqdecb_r_rs_uw\n\tif(!size && sf && !D && !U) return sqincb_r_rs(ctx, dec); // -> sqincb_r_rs_x\n\tif(!size && sf && !D && U) return uqincb_r_rs(ctx, dec); // -> uqincb_r_rs_x\n\tif(!size && sf && D && !U) return sqdecb_r_rs(ctx, dec); // -> sqdecb_r_rs_x\n\tif(!size && sf && D && U) return uqdecb_r_rs(ctx, dec); // -> uqdecb_r_rs_x\n\tif(size==1 && !sf && !D && !U) return sqinch_r_rs(ctx, dec); // -> sqinch_r_rs_sx\n\tif(size==1 && !sf && !D && U) return uqinch_r_rs(ctx, dec); // -> uqinch_r_rs_uw\n\tif(size==1 && !sf && D && !U) return sqdech_r_rs(ctx, dec); // -> sqdech_r_rs_sx\n\tif(size==1 && !sf && D && U) return uqdech_r_rs(ctx, dec); // -> uqdech_r_rs_uw\n\tif(size==1 && sf && !D && !U) return sqinch_r_rs(ctx, dec); // -> sqinch_r_rs_x\n\tif(size==1 && sf && !D && U) return uqinch_r_rs(ctx, dec); // -> uqinch_r_rs_x\n\tif(size==1 && sf && D && !U) return sqdech_r_rs(ctx, dec); // -> sqdech_r_rs_x\n\tif(size==1 && sf && D && U) return uqdech_r_rs(ctx, dec); // -> uqdech_r_rs_x\n\tif(size==2 && !sf && !D && !U) return sqincw_r_rs(ctx, dec); // -> sqincw_r_rs_sx\n\tif(size==2 && !sf && !D && U) return uqincw_r_rs(ctx, dec); // -> uqincw_r_rs_uw\n\tif(size==2 && !sf && D && !U) return sqdecw_r_rs(ctx, dec); // -> sqdecw_r_rs_sx\n\tif(size==2 && !sf && D && U) return uqdecw_r_rs(ctx, dec); // -> uqdecw_r_rs_uw\n\tif(size==2 && sf && !D && !U) return sqincw_r_rs(ctx, dec); // -> sqincw_r_rs_x\n\tif(size==2 && sf && !D && U) return uqincw_r_rs(ctx, dec); // -> uqincw_r_rs_x\n\tif(size==2 && sf && D && !U) return sqdecw_r_rs(ctx, dec); // -> sqdecw_r_rs_x\n\tif(size==2 && sf && D && U) return uqdecw_r_rs(ctx, dec); // -> uqdecw_r_rs_x\n\tif(size==3 && !sf && !D && !U) return sqincd_r_rs(ctx, dec); // -> sqincd_r_rs_sx\n\tif(size==3 && !sf && !D && U) return uqincd_r_rs(ctx, dec); // -> uqincd_r_rs_uw\n\tif(size==3 && !sf && D && !U) return sqdecd_r_rs(ctx, dec); // -> sqdecd_r_rs_sx\n\tif(size==3 && !sf && D && U) return uqdecd_r_rs(ctx, dec); // -> uqdecd_r_rs_uw\n\tif(size==3 && sf && !D && !U) return sqincd_r_rs(ctx, dec); // -> sqincd_r_rs_x\n\tif(size==3 && sf && !D && U) return uqincd_r_rs(ctx, dec); // -> uqincd_r_rs_x\n\tif(size==3 && sf && D && !U) return sqdecd_r_rs(ctx, dec); // -> sqdecd_r_rs_x\n\tif(size==3 && sf && D && U) return uqdecd_r_rs(ctx, dec); // -> uqdecd_r_rs_x\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_countvlv0(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, D=(INSWORD>>11)&1, U=(INSWORD>>10)&1;\n\tif(size==1 && !D && !U) return sqinch_z_zs(ctx, dec); // -> sqinch_z_zs_\n\tif(size==1 && !D && U) return uqinch_z_zs(ctx, dec); // -> uqinch_z_zs_\n\tif(size==1 && D && !U) return sqdech_z_zs(ctx, dec); // -> sqdech_z_zs_\n\tif(size==1 && D && U) return uqdech_z_zs(ctx, dec); // -> uqdech_z_zs_\n\tif(size==2 && !D && !U) return sqincw_z_zs(ctx, dec); // -> sqincw_z_zs_\n\tif(size==2 && !D && U) return uqincw_z_zs(ctx, dec); // -> uqincw_z_zs_\n\tif(size==2 && D && !U) return sqdecw_z_zs(ctx, dec); // -> sqdecw_z_zs_\n\tif(size==2 && D && U) return uqdecw_z_zs(ctx, dec); // -> uqdecw_z_zs_\n\tif(size==3 && !D && !U) return sqincd_z_zs(ctx, dec); // -> sqincd_z_zs_\n\tif(size==3 && !D && U) return uqincd_z_zs(ctx, dec); // -> uqincd_z_zs_\n\tif(size==3 && D && !U) return sqdecd_z_zs(ctx, dec); // -> sqdecd_z_zs_\n\tif(size==3 && D && U) return uqdecd_z_zs(ctx, dec); // -> uqdecd_z_zs_\n\tif(!size) UNALLOCATED(ENC_UNALLOCATED_160);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_extract_i(context *ctx, Instruction *dec)\n{\n\treturn ext_z_zi(ctx, dec);\n}\n\nint decode_iclass_sve_intx_perm_extract_i(context *ctx, Instruction *dec)\n{\n\treturn ext_z_zi(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_bin_long_perm_zz(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1, opc2=(INSWORD>>10)&7;\n\tif(!op && !opc2 && HasF64MM()) return zip1_z_zz(ctx, dec); // -> zip1_z_zz_q\n\tif(!op && opc2==1 && HasF64MM()) return zip1_z_zz(ctx, dec); // -> zip2_z_zz_q\n\tif(!op && opc2==2 && HasF64MM()) return uzp1_z_zz(ctx, dec); // -> uzp1_z_zz_q\n\tif(!op && opc2==3 && HasF64MM()) return uzp1_z_zz(ctx, dec); // -> uzp2_z_zz_q\n\tif(!op && opc2==6 && HasF64MM()) return trn1_z_zz(ctx, dec); // -> trn1_z_zz_q\n\tif(!op && opc2==7 && HasF64MM()) return trn1_z_zz(ctx, dec); // -> trn2_z_zz_q\n\tif(!op && (opc2&6)==4) UNALLOCATED(ENC_UNALLOCATED_187);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_189);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_log_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) return orr_z_zi(ctx, dec); // -> orr_z_zi_\n\tif(opc==1) return eor_z_zi(ctx, dec); // -> eor_z_zi_\n\tif(opc==2) return and_z_zi(ctx, dec); // -> and_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_dup_mask_imm(context *ctx, Instruction *dec)\n{\n\treturn dupm_z_i(ctx, dec);\n}\n\nint decode_iclass_sve_int_dup_fpimm_pred(context *ctx, Instruction *dec)\n{\n\treturn fcpy_z_p_i(ctx, dec);\n}\n\nint decode_iclass_sve_int_dup_imm_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t M=(INSWORD>>14)&1;\n\tif(!M) return cpy_z_o_i(ctx, dec); // -> cpy_z_o_i_\n\tif(M) return cpy_z_p_i(ctx, dec); // -> cpy_z_p_i_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_dup_i(context *ctx, Instruction *dec)\n{\n\treturn dup_z_zi(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_tbl_3src(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>10)&1;\n\tif(!op) return tbl_z_zz(ctx, dec); // -> tbl_z_zz_2\n\tif(op) return tbx_z_zz(ctx, dec); // -> tbx_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_tbl(context *ctx, Instruction *dec)\n{\n\treturn tbl_z_zz(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_dup_r(context *ctx, Instruction *dec)\n{\n\treturn dup_z_r(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_insrv(context *ctx, Instruction *dec)\n{\n\treturn insr_z_v(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_insrs(context *ctx, Instruction *dec)\n{\n\treturn insr_z_r(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_reverse_z(context *ctx, Instruction *dec)\n{\n\treturn rev_z_z(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_unpk(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>17)&1, H=(INSWORD>>16)&1;\n\tif(!U && !H) return sunpkhi_z_z(ctx, dec); // -> sunpklo_z_z_\n\tif(!U && H) return sunpkhi_z_z(ctx, dec); // -> sunpkhi_z_z_\n\tif(U && !H) return uunpkhi_z_z(ctx, dec); // -> uunpklo_z_z_\n\tif(U && H) return uunpkhi_z_z(ctx, dec); // -> uunpkhi_z_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_bin_perm_pp(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>11)&3, H=(INSWORD>>10)&1;\n\tif(!opc && !H) return zip1_p_pp(ctx, dec); // -> zip1_p_pp_\n\tif(!opc && H) return zip1_p_pp(ctx, dec); // -> zip2_p_pp_\n\tif(opc==1 && !H) return uzp1_p_pp(ctx, dec); // -> uzp1_p_pp_\n\tif(opc==1 && H) return uzp1_p_pp(ctx, dec); // -> uzp2_p_pp_\n\tif(opc==2 && !H) return trn1_p_pp(ctx, dec); // -> trn1_p_pp_\n\tif(opc==2 && H) return trn1_p_pp(ctx, dec); // -> trn2_p_pp_\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_184);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_reverse_p(context *ctx, Instruction *dec)\n{\n\treturn rev_p_p(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_punpk(context *ctx, Instruction *dec)\n{\n\tuint32_t H=(INSWORD>>16)&1;\n\tif(!H) return punpkhi_p_p(ctx, dec); // -> punpklo_p_p_\n\tif(H) return punpkhi_p_p(ctx, dec); // -> punpkhi_p_p_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_bin_perm_zz(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&7;\n\tif(!opc) return zip1_z_zz(ctx, dec); // -> zip1_z_zz_\n\tif(opc==1) return zip1_z_zz(ctx, dec); // -> zip2_z_zz_\n\tif(opc==2) return uzp1_z_zz(ctx, dec); // -> uzp1_z_zz_\n\tif(opc==3) return uzp1_z_zz(ctx, dec); // -> uzp2_z_zz_\n\tif(opc==4) return trn1_z_zz(ctx, dec); // -> trn1_z_zz_\n\tif(opc==5) return trn1_z_zz(ctx, dec); // -> trn2_z_zz_\n\tif((opc&6)==6) UNALLOCATED(ENC_UNALLOCATED_185);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_compact(context *ctx, Instruction *dec)\n{\n\treturn compact_z_p_z(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_clast_zz(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>16)&1;\n\tif(!B) return clasta_z_p_zz(ctx, dec); // -> clasta_z_p_zz_\n\tif(B) return clastb_z_p_zz(ctx, dec); // -> clastb_z_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_clast_vz(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>16)&1;\n\tif(!B) return clasta_v_p_z(ctx, dec); // -> clasta_v_p_z_\n\tif(B) return clastb_v_p_z(ctx, dec); // -> clastb_v_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_clast_rz(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>16)&1;\n\tif(!B) return clasta_r_p_z(ctx, dec); // -> clasta_r_p_z_\n\tif(B) return clastb_r_p_z(ctx, dec); // -> clastb_r_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_cpy_v(context *ctx, Instruction *dec)\n{\n\treturn cpy_z_p_v(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_cpy_r(context *ctx, Instruction *dec)\n{\n\treturn cpy_z_p_r(ctx, dec);\n}\n\nint decode_iclass_sve_int_perm_last_v(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>16)&1;\n\tif(!B) return lasta_v_p_z(ctx, dec); // -> lasta_v_p_z_\n\tif(B) return lastb_v_p_z(ctx, dec); // -> lastb_v_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_last_r(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>16)&1;\n\tif(!B) return lasta_r_p_z(ctx, dec); // -> lasta_r_p_z_\n\tif(B) return lastb_r_p_z(ctx, dec); // -> lastb_r_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_revd(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(!size) return revd_z_p_z(ctx, dec); // -> revd_z_p_z_\n\tif(size==1) UNALLOCATED(ENC_UNALLOCATED_186);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_188);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_rev(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&3;\n\tif(!opc) return revb_z_z(ctx, dec); // -> revb_z_z_\n\tif(opc==1) return revb_z_z(ctx, dec); // -> revh_z_z_\n\tif(opc==2) return revb_z_z(ctx, dec); // -> revw_z_z_\n\tif(opc==3) return rbit_z_p_z(ctx, dec); // -> rbit_z_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_perm_splice(context *ctx, Instruction *dec)\n{\n\treturn splice_z_p_zz(ctx, dec);\n}\n\nint decode_iclass_sve_intx_perm_splice(context *ctx, Instruction *dec)\n{\n\treturn splice_z_p_zz(ctx, dec);\n}\n\nint decode_iclass_sve_int_sel_vvv(context *ctx, Instruction *dec)\n{\n\treturn sel_z_p_zz(ctx, dec);\n}\n\nint decode_iclass_sve_int_cmp_0(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>15)&1, o2=(INSWORD>>13)&1, ne=(INSWORD>>4)&1;\n\tif(!op && !o2 && !ne) return cmpeq_p_p_zz(ctx, dec); // -> cmphs_p_p_zz_\n\tif(!op && !o2 && ne) return cmpeq_p_p_zz(ctx, dec); // -> cmphi_p_p_zz_\n\tif(!op && o2 && !ne) return cmpeq_p_p_zw(ctx, dec); // -> cmpeq_p_p_zw_\n\tif(!op && o2 && ne) return cmpeq_p_p_zw(ctx, dec); // -> cmpne_p_p_zw_\n\tif(op && !o2 && !ne) return cmpeq_p_p_zz(ctx, dec); // -> cmpge_p_p_zz_\n\tif(op && !o2 && ne) return cmpeq_p_p_zz(ctx, dec); // -> cmpgt_p_p_zz_\n\tif(op && o2 && !ne) return cmpeq_p_p_zz(ctx, dec); // -> cmpeq_p_p_zz_\n\tif(op && o2 && ne) return cmpeq_p_p_zz(ctx, dec); // -> cmpne_p_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_cmp_1(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>15)&1, lt=(INSWORD>>13)&1, ne=(INSWORD>>4)&1;\n\tif(!U && !lt && !ne) return cmpeq_p_p_zw(ctx, dec); // -> cmpge_p_p_zw_\n\tif(!U && !lt && ne) return cmpeq_p_p_zw(ctx, dec); // -> cmpgt_p_p_zw_\n\tif(!U && lt && !ne) return cmpeq_p_p_zw(ctx, dec); // -> cmplt_p_p_zw_\n\tif(!U && lt && ne) return cmpeq_p_p_zw(ctx, dec); // -> cmple_p_p_zw_\n\tif(U && !lt && !ne) return cmpeq_p_p_zw(ctx, dec); // -> cmphs_p_p_zw_\n\tif(U && !lt && ne) return cmpeq_p_p_zw(ctx, dec); // -> cmphi_p_p_zw_\n\tif(U && lt && !ne) return cmpeq_p_p_zw(ctx, dec); // -> cmplo_p_p_zw_\n\tif(U && lt && ne) return cmpeq_p_p_zw(ctx, dec); // -> cmpls_p_p_zw_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_ucmp_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t lt=(INSWORD>>13)&1, ne=(INSWORD>>4)&1;\n\tif(!lt && !ne) return cmpeq_p_p_zi(ctx, dec); // -> cmphs_p_p_zi_\n\tif(!lt && ne) return cmpeq_p_p_zi(ctx, dec); // -> cmphi_p_p_zi_\n\tif(lt && !ne) return cmpeq_p_p_zi(ctx, dec); // -> cmplo_p_p_zi_\n\tif(lt && ne) return cmpeq_p_p_zi(ctx, dec); // -> cmpls_p_p_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pred_log(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1, o2=(INSWORD>>9)&1, o3=(INSWORD>>4)&1;\n\tif(!op && !S && !o2 && !o3) return and_p_p_pp(ctx, dec); // -> and_p_p_pp_z\n\tif(!op && !S && !o2 && o3) return bic_p_p_pp(ctx, dec); // -> bic_p_p_pp_z\n\tif(!op && !S && o2 && !o3) return eor_p_p_pp(ctx, dec); // -> eor_p_p_pp_z\n\tif(!op && !S && o2 && o3) return sel_p_p_pp(ctx, dec); // -> sel_p_p_pp_\n\tif(!op && S && !o2 && !o3) return ands_p_p_pp(ctx, dec); // -> ands_p_p_pp_z\n\tif(!op && S && !o2 && o3) return bics_p_p_pp(ctx, dec); // -> bics_p_p_pp_z\n\tif(!op && S && o2 && !o3) return eors_p_p_pp(ctx, dec); // -> eors_p_p_pp_z\n\tif(!op && S && o2 && o3) UNALLOCATED(ENC_UNALLOCATED_219);\n\tif(op && !S && !o2 && !o3) return orr_p_p_pp(ctx, dec); // -> orr_p_p_pp_z\n\tif(op && !S && !o2 && o3) return orn_p_p_pp(ctx, dec); // -> orn_p_p_pp_z\n\tif(op && !S && o2 && !o3) return nor_p_p_pp(ctx, dec); // -> nor_p_p_pp_z\n\tif(op && !S && o2 && o3) return nand_p_p_pp(ctx, dec); // -> nand_p_p_pp_z\n\tif(op && S && !o2 && !o3) return orrs_p_p_pp(ctx, dec); // -> orrs_p_p_pp_z\n\tif(op && S && !o2 && o3) return orns_p_p_pp(ctx, dec); // -> orns_p_p_pp_z\n\tif(op && S && o2 && !o3) return nors_p_p_pp(ctx, dec); // -> nors_p_p_pp_z\n\tif(op && S && o2 && o3) return nands_p_p_pp(ctx, dec); // -> nands_p_p_pp_z\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_brkp(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1, B=(INSWORD>>4)&1;\n\tif(!op && !S && !B) return brkpa_p_p_pp(ctx, dec); // -> brkpa_p_p_pp_\n\tif(!op && !S && B) return brkpb_p_p_pp(ctx, dec); // -> brkpb_p_p_pp_\n\tif(!op && S && !B) return brkpas_p_p_pp(ctx, dec); // -> brkpas_p_p_pp_\n\tif(!op && S && B) return brkpbs_p_p_pp(ctx, dec); // -> brkpbs_p_p_pp_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_229);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_break(context *ctx, Instruction *dec)\n{\n\tuint32_t B=(INSWORD>>23)&1, S=(INSWORD>>22)&1, M=(INSWORD>>4)&1;\n\tif(!B && S && !M) return brkas_p_p_p(ctx, dec); // -> brkas_p_p_p_z\n\tif(B && S && !M) return brkbs_p_p_p(ctx, dec); // -> brkbs_p_p_p_z\n\tif(S && M) UNALLOCATED(ENC_UNALLOCATED_220);\n\tif(!B && !S) return brka_p_p_p(ctx, dec); // -> brka_p_p_p_\n\tif(B && !S) return brkb_p_p_p(ctx, dec); // -> brkb_p_p_p_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_brkn(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>22)&1;\n\tif(!S) return brkn_p_p_pp(ctx, dec); // -> brkn_p_p_pp_\n\tif(S) return brkns_p_p_pp(ctx, dec); // -> brkns_p_p_pp_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pfirst(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1;\n\tif(!op && !S) UNALLOCATED(ENC_UNALLOCATED_192);\n\tif(!op && S) return pfirst_p_p_p(ctx, dec); // -> pfirst_p_p_p_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_231);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_ptrue(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>16)&1;\n\tif(!S) return ptrue_p_s(ctx, dec); // -> ptrue_p_s_\n\tif(S) return ptrues_p_s(ctx, dec); // -> ptrues_p_s_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pnext(context *ctx, Instruction *dec)\n{\n\treturn pnext_p_p_p(ctx, dec);\n}\n\nint decode_iclass_sve_int_rdffr(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1;\n\tif(!op && !S) return rdffr_p_p_f(ctx, dec); // -> rdffr_p_p_f_\n\tif(!op && S) return rdffrs_p_p_f(ctx, dec); // -> rdffrs_p_p_f_\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_233);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_rdffr_2(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1;\n\tif(!op && !S) return rdffr_p_f(ctx, dec); // -> rdffr_p_f_\n\tif(!op && S) UNALLOCATED(ENC_UNALLOCATED_226);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_234);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_ptest(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1, opc2=INSWORD&15;\n\tif(!op && S && !opc2) return ptest_p_p(ctx, dec); // -> ptest_p_p_\n\tif(!op && S && opc2==1) UNALLOCATED(ENC_UNALLOCATED_221);\n\tif(!op && S && (opc2&14)==2) UNALLOCATED(ENC_UNALLOCATED_222);\n\tif(!op && S && (opc2&12)==4) UNALLOCATED(ENC_UNALLOCATED_223);\n\tif(!op && S && (opc2&8)==8) UNALLOCATED(ENC_UNALLOCATED_224);\n\tif(!op && !S) UNALLOCATED(ENC_UNALLOCATED_191);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_230);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pfalse(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, S=(INSWORD>>22)&1;\n\tif(!op && !S) return pfalse_p(ctx, dec); // -> pfalse_p_\n\tif(!op && S) UNALLOCATED(ENC_UNALLOCATED_225);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_232);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_scmp_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>15)&1, o2=(INSWORD>>13)&1, ne=(INSWORD>>4)&1;\n\tif(!op && !o2 && !ne) return cmpeq_p_p_zi(ctx, dec); // -> cmpge_p_p_zi_\n\tif(!op && !o2 && ne) return cmpeq_p_p_zi(ctx, dec); // -> cmpgt_p_p_zi_\n\tif(!op && o2 && !ne) return cmpeq_p_p_zi(ctx, dec); // -> cmplt_p_p_zi_\n\tif(!op && o2 && ne) return cmpeq_p_p_zi(ctx, dec); // -> cmple_p_p_zi_\n\tif(op && !o2 && !ne) return cmpeq_p_p_zi(ctx, dec); // -> cmpeq_p_p_zi_\n\tif(op && !o2 && ne) return cmpeq_p_p_zi(ctx, dec); // -> cmpne_p_p_zi_\n\tif(op && o2) UNALLOCATED(ENC_UNALLOCATED_190);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pcount_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return cntp_r_p_p(ctx, dec); // -> cntp_r_p_p_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_195);\n\tif((opc&6)==2) UNALLOCATED(ENC_UNALLOCATED_196);\n\tif((opc&4)==4) UNALLOCATED(ENC_UNALLOCATED_198);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_count_r(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>17)&1, D=(INSWORD>>16)&1, opc2=(INSWORD>>9)&3;\n\tif(!op && !D && !opc2) return incp_r_p_r(ctx, dec); // -> incp_r_p_r_\n\tif(!op && D && !opc2) return decp_r_p_r(ctx, dec); // -> decp_r_p_r_\n\tif(!op && opc2==1) UNALLOCATED(ENC_UNALLOCATED_205);\n\tif(!op && (opc2&2)==2) UNALLOCATED(ENC_UNALLOCATED_206);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_209);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_count_v(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>17)&1, D=(INSWORD>>16)&1, opc2=(INSWORD>>9)&3;\n\tif(!op && !D && !opc2) return incp_z_p_z(ctx, dec); // -> incp_z_p_z_\n\tif(!op && D && !opc2) return decp_z_p_z(ctx, dec); // -> decp_z_p_z_\n\tif(!op && opc2==1) UNALLOCATED(ENC_UNALLOCATED_203);\n\tif(!op && (opc2&2)==2) UNALLOCATED(ENC_UNALLOCATED_204);\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_208);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_count_r_sat(context *ctx, Instruction *dec)\n{\n\tuint32_t D=(INSWORD>>17)&1, U=(INSWORD>>16)&1, sf=(INSWORD>>10)&1, op=(INSWORD>>9)&1;\n\tif(!D && !U && !sf && !op) return sqincp_r_p_r(ctx, dec); // -> sqincp_r_p_r_sx\n\tif(!D && !U && sf && !op) return sqincp_r_p_r(ctx, dec); // -> sqincp_r_p_r_x\n\tif(!D && U && !sf && !op) return uqincp_r_p_r(ctx, dec); // -> uqincp_r_p_r_uw\n\tif(!D && U && sf && !op) return uqincp_r_p_r(ctx, dec); // -> uqincp_r_p_r_x\n\tif(D && !U && !sf && !op) return sqdecp_r_p_r(ctx, dec); // -> sqdecp_r_p_r_sx\n\tif(D && !U && sf && !op) return sqdecp_r_p_r(ctx, dec); // -> sqdecp_r_p_r_x\n\tif(D && U && !sf && !op) return uqdecp_r_p_r(ctx, dec); // -> uqdecp_r_p_r_uw\n\tif(D && U && sf && !op) return uqdecp_r_p_r(ctx, dec); // -> uqdecp_r_p_r_x\n\tif(op) UNALLOCATED(ENC_UNALLOCATED_201);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_count_v_sat(context *ctx, Instruction *dec)\n{\n\tuint32_t D=(INSWORD>>17)&1, U=(INSWORD>>16)&1, opc=(INSWORD>>9)&3;\n\tif(!D && !U && !opc) return sqincp_z_p_z(ctx, dec); // -> sqincp_z_p_z_\n\tif(!D && U && !opc) return uqincp_z_p_z(ctx, dec); // -> uqincp_z_p_z_\n\tif(D && !U && !opc) return sqdecp_z_p_z(ctx, dec); // -> sqdecp_z_p_z_\n\tif(D && U && !opc) return uqdecp_z_p_z(ctx, dec); // -> uqdecp_z_p_z_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_199);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_200);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_setffr(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) return setffr_f(ctx, dec); // -> setffr_f_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_228);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_236);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_wrffr(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) return wrffr_f_p(ctx, dec); // -> wrffr_f_p_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_227);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_235);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_cterm(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>23)&1, ne=(INSWORD>>4)&1;\n\tif(op && !ne) return ctermeq_rr(ctx, dec); // -> ctermeq_rr_\n\tif(op && ne) return ctermeq_rr(ctx, dec); // -> ctermne_rr_\n\tif(!op) UNALLOCATED(ENC_UNALLOCATED_193);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_while_rr(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>11)&1, lt=(INSWORD>>10)&1, eq=(INSWORD>>4)&1;\n\tif(!U && !lt && !eq) return whilege_p_p_rr(ctx, dec); // -> whilege_p_p_rr_\n\tif(!U && !lt && eq) return whilegt_p_p_rr(ctx, dec); // -> whilegt_p_p_rr_\n\tif(!U && lt && !eq) return whilelt_p_p_rr(ctx, dec); // -> whilelt_p_p_rr_\n\tif(!U && lt && eq) return whilele_p_p_rr(ctx, dec); // -> whilele_p_p_rr_\n\tif(U && !lt && !eq) return whilehs_p_p_rr(ctx, dec); // -> whilehs_p_p_rr_\n\tif(U && !lt && eq) return whilehi_p_p_rr(ctx, dec); // -> whilehi_p_p_rr_\n\tif(U && lt && !eq) return whilelo_p_p_rr(ctx, dec); // -> whilelo_p_p_rr_\n\tif(U && lt && eq) return whilels_p_p_rr(ctx, dec); // -> whilels_p_p_rr_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_whilenc(context *ctx, Instruction *dec)\n{\n\tuint32_t rw=(INSWORD>>4)&1;\n\tif(!rw) return whilewr_p_rr(ctx, dec); // -> whilewr_p_rr_\n\tif(rw) return whilerw_p_rr(ctx, dec); // -> whilerw_p_rr_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_pred_dup(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>9)&1;\n\tif(!S) return dup_p_p_pi(ctx, dec); // -> dup_p_p_pi_\n\tif(S) UNALLOCATED(ENC_UNALLOCATED_194);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_dup_fpimm(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>17)&3, o2=(INSWORD>>13)&1;\n\tif(!opc && !o2) return fdup_z_i(ctx, dec); // -> fdup_z_i_\n\tif(!opc && o2) UNALLOCATED(ENC_UNALLOCATED_214);\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_216);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_218);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_dup_imm(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>17)&3;\n\tif(!opc) return dup_z_i(ctx, dec); // -> dup_z_i_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_215);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_217);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_arith_imm0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return add_z_zi(ctx, dec); // -> add_z_zi_\n\tif(opc==1) return sub_z_zi(ctx, dec); // -> sub_z_zi_\n\tif(opc==2) UNALLOCATED(ENC_UNALLOCATED_197);\n\tif(opc==3) return subr_z_zi(ctx, dec); // -> subr_z_zi_\n\tif(opc==4) return sqadd_z_zi(ctx, dec); // -> sqadd_z_zi_\n\tif(opc==5) return uqadd_z_zi(ctx, dec); // -> uqadd_z_zi_\n\tif(opc==6) return sqsub_z_zi(ctx, dec); // -> sqsub_z_zi_\n\tif(opc==7) return uqsub_z_zi(ctx, dec); // -> uqsub_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_arith_imm1(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7, o2=(INSWORD>>13)&1;\n\tif(!opc && !o2) return smax_z_zi(ctx, dec); // -> smax_z_zi_\n\tif(opc==1 && !o2) return umax_z_zi(ctx, dec); // -> umax_z_zi_\n\tif(opc==2 && !o2) return smin_z_zi(ctx, dec); // -> smin_z_zi_\n\tif(opc==3 && !o2) return umin_z_zi(ctx, dec); // -> umin_z_zi_\n\tif(!(opc&4) && o2) UNALLOCATED(ENC_UNALLOCATED_202);\n\tif((opc&4)==4) UNALLOCATED(ENC_UNALLOCATED_207);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_int_arith_imm2(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7, o2=(INSWORD>>13)&1;\n\tif(!opc && !o2) return mul_z_zi(ctx, dec); // -> mul_z_zi_\n\tif(!opc && o2) UNALLOCATED(ENC_UNALLOCATED_210);\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_211);\n\tif((opc&6)==2) UNALLOCATED(ENC_UNALLOCATED_212);\n\tif((opc&4)==4) UNALLOCATED(ENC_UNALLOCATED_213);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_dot(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>10)&1;\n\tif(!U) return sdot_z_zzz(ctx, dec); // -> sdot_z_zzz_\n\tif(U) return udot_z_zzz(ctx, dec); // -> udot_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mixed_dot(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2 && HasI8MM()) return usdot_z_zzz(ctx, dec); // -> usdot_z_zzz_s\n\tif(size==3) UNALLOCATED(ENC_UNALLOCATED_251);\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_237);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cdot(context *ctx, Instruction *dec)\n{\n\treturn cdot_z_zzz(ctx, dec);\n}\n\nint decode_iclass_sve_intx_cmla(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>12)&1;\n\tif(!op) return cmla_z_zzz(ctx, dec); // -> cmla_z_zzz_\n\tif(op) return sqrdcmlah_z_zzz(ctx, dec); // -> sqrdcmlah_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mlal_long(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>12)&1, U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!S && !U && !T) return smlalb_z_zzz(ctx, dec); // -> smlalb_z_zzz_\n\tif(!S && !U && T) return smlalt_z_zzz(ctx, dec); // -> smlalt_z_zzz_\n\tif(!S && U && !T) return umlalb_z_zzz(ctx, dec); // -> umlalb_z_zzz_\n\tif(!S && U && T) return umlalt_z_zzz(ctx, dec); // -> umlalt_z_zzz_\n\tif(S && !U && !T) return smlslb_z_zzz(ctx, dec); // -> smlslb_z_zzz_\n\tif(S && !U && T) return smlslt_z_zzz(ctx, dec); // -> smlslt_z_zzz_\n\tif(S && U && !T) return umlslb_z_zzz(ctx, dec); // -> umlslb_z_zzz_\n\tif(S && U && T) return umlslt_z_zzz(ctx, dec); // -> umlslt_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qdmlal_long(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!S && !T) return sqdmlalb_z_zzz(ctx, dec); // -> sqdmlalb_z_zzz_\n\tif(!S && T) return sqdmlalt_z_zzz(ctx, dec); // -> sqdmlalt_z_zzz_\n\tif(S && !T) return sqdmlslb_z_zzz(ctx, dec); // -> sqdmlslb_z_zzz_\n\tif(S && T) return sqdmlslt_z_zzz(ctx, dec); // -> sqdmlslt_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qrdmlah(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>10)&1;\n\tif(!S) return sqrdmlah_z_zzz(ctx, dec); // -> sqrdmlah_z_zzz_\n\tif(S) return sqrdmlsh_z_zzz(ctx, dec); // -> sqrdmlsh_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qdmlalbt(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>10)&1;\n\tif(!S) return sqdmlalbt_z_zzz(ctx, dec); // -> sqdmlalbt_z_zzz_\n\tif(S) return sqdmlslbt_z_zzz(ctx, dec); // -> sqdmlslbt_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_pred_arith_binary(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>18)&1, S=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!R && !S && !U) return shadd_z_p_zz(ctx, dec); // -> shadd_z_p_zz_\n\tif(!R && !S && U) return uhadd_z_p_zz(ctx, dec); // -> uhadd_z_p_zz_\n\tif(!R && S && !U) return shsub_z_p_zz(ctx, dec); // -> shsub_z_p_zz_\n\tif(!R && S && U) return uhsub_z_p_zz(ctx, dec); // -> uhsub_z_p_zz_\n\tif(R && !S && !U) return srhadd_z_p_zz(ctx, dec); // -> srhadd_z_p_zz_\n\tif(R && !S && U) return urhadd_z_p_zz(ctx, dec); // -> urhadd_z_p_zz_\n\tif(R && S && !U) return shsubr_z_p_zz(ctx, dec); // -> shsubr_z_p_zz_\n\tif(R && S && U) return uhsubr_z_p_zz(ctx, dec); // -> uhsubr_z_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_accumulate_long_pairs(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>16)&1;\n\tif(!U) return sadalp_z_p_z(ctx, dec); // -> sadalp_z_p_z_\n\tif(U) return uadalp_z_p_z(ctx, dec); // -> uadalp_z_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_arith_binary_pairs(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>17)&3, U=(INSWORD>>16)&1;\n\tif(!opc && !U) UNALLOCATED(ENC_UNALLOCATED_240);\n\tif(!opc && U) return addp_z_p_zz(ctx, dec); // -> addp_z_p_zz_\n\tif(opc==2 && !U) return smaxp_z_p_zz(ctx, dec); // -> smaxp_z_p_zz_\n\tif(opc==2 && U) return umaxp_z_p_zz(ctx, dec); // -> umaxp_z_p_zz_\n\tif(opc==3 && !U) return sminp_z_p_zz(ctx, dec); // -> sminp_z_p_zz_\n\tif(opc==3 && U) return uminp_z_p_zz(ctx, dec); // -> uminp_z_p_zz_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_241);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_pred_arith_unary(context *ctx, Instruction *dec)\n{\n\tuint32_t Q=(INSWORD>>19)&1, opc=(INSWORD>>16)&3;\n\tif(!Q && !opc) return urecpe_z_p_z(ctx, dec); // -> urecpe_z_p_z_\n\tif(!Q && opc==1) return ursqrte_z_p_z(ctx, dec); // -> ursqrte_z_p_z_\n\tif(Q && !opc) return sqabs_z_p_z(ctx, dec); // -> sqabs_z_p_z_\n\tif(Q && opc==1) return sqneg_z_p_z(ctx, dec); // -> sqneg_z_p_z_\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_239);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_pred_arith_binary_sat(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>18)&1, S=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!op && !S && !U) return sqadd_z_p_zz(ctx, dec); // -> sqadd_z_p_zz_\n\tif(!op && !S && U) return uqadd_z_p_zz(ctx, dec); // -> uqadd_z_p_zz_\n\tif(!op && S && !U) return sqsub_z_p_zz(ctx, dec); // -> sqsub_z_p_zz_\n\tif(!op && S && U) return uqsub_z_p_zz(ctx, dec); // -> uqsub_z_p_zz_\n\tif(op && !S && !U) return suqadd_z_p_zz(ctx, dec); // -> suqadd_z_p_zz_\n\tif(op && !S && U) return usqadd_z_p_zz(ctx, dec); // -> usqadd_z_p_zz_\n\tif(op && S && !U) return sqsubr_z_p_zz(ctx, dec); // -> sqsubr_z_p_zz_\n\tif(op && S && U) return uqsubr_z_p_zz(ctx, dec); // -> uqsubr_z_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_bin_pred_shift_sat_round(context *ctx, Instruction *dec)\n{\n\tuint32_t Q=(INSWORD>>19)&1, R=(INSWORD>>18)&1, N=(INSWORD>>17)&1, U=(INSWORD>>16)&1;\n\tif(!Q && !R && N && !U) return srshl_z_p_zz(ctx, dec); // -> srshl_z_p_zz_\n\tif(!Q && !R && N && U) return urshl_z_p_zz(ctx, dec); // -> urshl_z_p_zz_\n\tif(!Q && R && N && !U) return srshlr_z_p_zz(ctx, dec); // -> srshlr_z_p_zz_\n\tif(!Q && R && N && U) return urshlr_z_p_zz(ctx, dec); // -> urshlr_z_p_zz_\n\tif(Q && !R && !N && !U) return sqshl_z_p_zz(ctx, dec); // -> sqshl_z_p_zz_\n\tif(Q && !R && !N && U) return uqshl_z_p_zz(ctx, dec); // -> uqshl_z_p_zz_\n\tif(Q && !R && N && !U) return sqrshl_z_p_zz(ctx, dec); // -> sqrshl_z_p_zz_\n\tif(Q && !R && N && U) return uqrshl_z_p_zz(ctx, dec); // -> uqrshl_z_p_zz_\n\tif(Q && R && !N && !U) return sqshlr_z_p_zz(ctx, dec); // -> sqshlr_z_p_zz_\n\tif(Q && R && !N && U) return uqshlr_z_p_zz(ctx, dec); // -> uqshlr_z_p_zz_\n\tif(Q && R && N && !U) return sqrshlr_z_p_zz(ctx, dec); // -> sqrshlr_z_p_zz_\n\tif(Q && R && N && U) return uqrshlr_z_p_zz(ctx, dec); // -> uqrshlr_z_p_zz_\n\tif(!Q && !N) UNALLOCATED(ENC_UNALLOCATED_238);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_clamp(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>10)&1;\n\tif(!U) return sclamp_z_zz(ctx, dec); // -> sclamp_z_zz_\n\tif(U) return uclamp_z_zz(ctx, dec); // -> uclamp_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_dot_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, U=(INSWORD>>10)&1;\n\tif(size==2 && !U) return sdot_z_zzzi(ctx, dec); // -> sdot_z_zzzi_s\n\tif(size==2 && U) return udot_z_zzzi(ctx, dec); // -> udot_z_zzzi_s\n\tif(size==3 && !U) return sdot_z_zzzi(ctx, dec); // -> sdot_z_zzzi_d\n\tif(size==3 && U) return udot_z_zzzi(ctx, dec); // -> udot_z_zzzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_242);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mixed_dot_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, U=(INSWORD>>10)&1;\n\tif(size==2 && !U && HasI8MM()) return usdot_z_zzzi(ctx, dec); // -> usdot_z_zzzi_s\n\tif(size==2 && U && HasI8MM()) return sudot_z_zzzi(ctx, dec); // -> sudot_z_zzzi_s\n\tif(size==3) UNALLOCATED(ENC_UNALLOCATED_252);\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_243);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cdot_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return cdot_z_zzzi(ctx, dec); // -> cdot_z_zzzi_s\n\tif(size==3) return cdot_z_zzzi(ctx, dec); // -> cdot_z_zzzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_245);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cmla_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return cmla_z_zzzi(ctx, dec); // -> cmla_z_zzzi_h\n\tif(size==3) return cmla_z_zzzi(ctx, dec); // -> cmla_z_zzzi_s\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_246);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qrdcmla_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return sqrdcmlah_z_zzzi(ctx, dec); // -> sqrdcmlah_z_zzzi_h\n\tif(size==3) return sqrdcmlah_z_zzzi(ctx, dec); // -> sqrdcmlah_z_zzzi_s\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_247);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mul_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return mul_z_zzi(ctx, dec); // -> mul_z_zzi_s\n\tif(size==3) return mul_z_zzi(ctx, dec); // -> mul_z_zzi_d\n\tif(!(size&2)) return mul_z_zzi(ctx, dec); // -> mul_z_zzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mul_long_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, U=(INSWORD>>12)&1, T=(INSWORD>>10)&1;\n\tif(size==2 && !U && !T) return smullb_z_zzi(ctx, dec); // -> smullb_z_zzi_s\n\tif(size==2 && !U && T) return smullt_z_zzi(ctx, dec); // -> smullt_z_zzi_s\n\tif(size==2 && U && !T) return umullb_z_zzi(ctx, dec); // -> umullb_z_zzi_s\n\tif(size==2 && U && T) return umullt_z_zzi(ctx, dec); // -> umullt_z_zzi_s\n\tif(size==3 && !U && !T) return smullb_z_zzi(ctx, dec); // -> smullb_z_zzi_d\n\tif(size==3 && !U && T) return smullt_z_zzi(ctx, dec); // -> smullt_z_zzi_d\n\tif(size==3 && U && !T) return umullb_z_zzi(ctx, dec); // -> umullb_z_zzi_d\n\tif(size==3 && U && T) return umullt_z_zzi(ctx, dec); // -> umullt_z_zzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_249);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mla_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, S=(INSWORD>>10)&1;\n\tif(size==2 && !S) return mla_z_zzzi(ctx, dec); // -> mla_z_zzzi_s\n\tif(size==2 && S) return mls_z_zzzi(ctx, dec); // -> mls_z_zzzi_s\n\tif(size==3 && !S) return mla_z_zzzi(ctx, dec); // -> mla_z_zzzi_d\n\tif(size==3 && S) return mls_z_zzzi(ctx, dec); // -> mls_z_zzzi_d\n\tif(!(size&2) && !S) return mla_z_zzzi(ctx, dec); // -> mla_z_zzzi_h\n\tif(!(size&2) && S) return mls_z_zzzi(ctx, dec); // -> mls_z_zzzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mla_long_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, S=(INSWORD>>13)&1, U=(INSWORD>>12)&1, T=(INSWORD>>10)&1;\n\tif(size==2 && !S && !U && !T) return smlalb_z_zzzi(ctx, dec); // -> smlalb_z_zzzi_s\n\tif(size==2 && !S && !U && T) return smlalt_z_zzzi(ctx, dec); // -> smlalt_z_zzzi_s\n\tif(size==2 && !S && U && !T) return umlalb_z_zzzi(ctx, dec); // -> umlalb_z_zzzi_s\n\tif(size==2 && !S && U && T) return umlalt_z_zzzi(ctx, dec); // -> umlalt_z_zzzi_s\n\tif(size==2 && S && !U && !T) return smlslb_z_zzzi(ctx, dec); // -> smlslb_z_zzzi_s\n\tif(size==2 && S && !U && T) return smlslt_z_zzzi(ctx, dec); // -> smlslt_z_zzzi_s\n\tif(size==2 && S && U && !T) return umlslb_z_zzzi(ctx, dec); // -> umlslb_z_zzzi_s\n\tif(size==2 && S && U && T) return umlslt_z_zzzi(ctx, dec); // -> umlslt_z_zzzi_s\n\tif(size==3 && !S && !U && !T) return smlalb_z_zzzi(ctx, dec); // -> smlalb_z_zzzi_d\n\tif(size==3 && !S && !U && T) return smlalt_z_zzzi(ctx, dec); // -> smlalt_z_zzzi_d\n\tif(size==3 && !S && U && !T) return umlalb_z_zzzi(ctx, dec); // -> umlalb_z_zzzi_d\n\tif(size==3 && !S && U && T) return umlalt_z_zzzi(ctx, dec); // -> umlalt_z_zzzi_d\n\tif(size==3 && S && !U && !T) return smlslb_z_zzzi(ctx, dec); // -> smlslb_z_zzzi_d\n\tif(size==3 && S && !U && T) return smlslt_z_zzzi(ctx, dec); // -> smlslt_z_zzzi_d\n\tif(size==3 && S && U && !T) return umlslb_z_zzzi(ctx, dec); // -> umlslb_z_zzzi_d\n\tif(size==3 && S && U && T) return umlslt_z_zzzi(ctx, dec); // -> umlslt_z_zzzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_248);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qdmulh_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, R=(INSWORD>>10)&1;\n\tif(size==2 && !R) return sqdmulh_z_zzi(ctx, dec); // -> sqdmulh_z_zzi_s\n\tif(size==2 && R) return sqrdmulh_z_zzi(ctx, dec); // -> sqrdmulh_z_zzi_s\n\tif(size==3 && !R) return sqdmulh_z_zzi(ctx, dec); // -> sqdmulh_z_zzi_d\n\tif(size==3 && R) return sqrdmulh_z_zzi(ctx, dec); // -> sqrdmulh_z_zzi_d\n\tif(!(size&2) && !R) return sqdmulh_z_zzi(ctx, dec); // -> sqdmulh_z_zzi_h\n\tif(!(size&2) && R) return sqrdmulh_z_zzi(ctx, dec); // -> sqrdmulh_z_zzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qdmul_long_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, T=(INSWORD>>10)&1;\n\tif(size==2 && !T) return sqdmullb_z_zzi(ctx, dec); // -> sqdmullb_z_zzi_s\n\tif(size==2 && T) return sqdmullt_z_zzi(ctx, dec); // -> sqdmullt_z_zzi_s\n\tif(size==3 && !T) return sqdmullb_z_zzi(ctx, dec); // -> sqdmullb_z_zzi_d\n\tif(size==3 && T) return sqdmullt_z_zzi(ctx, dec); // -> sqdmullt_z_zzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_250);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qdmla_long_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, S=(INSWORD>>12)&1, T=(INSWORD>>10)&1;\n\tif(size==2 && !S && !T) return sqdmlalb_z_zzzi(ctx, dec); // -> sqdmlalb_z_zzzi_s\n\tif(size==2 && !S && T) return sqdmlalt_z_zzzi(ctx, dec); // -> sqdmlalt_z_zzzi_s\n\tif(size==2 && S && !T) return sqdmlslb_z_zzzi(ctx, dec); // -> sqdmlslb_z_zzzi_s\n\tif(size==2 && S && T) return sqdmlslt_z_zzzi(ctx, dec); // -> sqdmlslt_z_zzzi_s\n\tif(size==3 && !S && !T) return sqdmlalb_z_zzzi(ctx, dec); // -> sqdmlalb_z_zzzi_d\n\tif(size==3 && !S && T) return sqdmlalt_z_zzzi(ctx, dec); // -> sqdmlalt_z_zzzi_d\n\tif(size==3 && S && !T) return sqdmlslb_z_zzzi(ctx, dec); // -> sqdmlslb_z_zzzi_d\n\tif(size==3 && S && T) return sqdmlslt_z_zzzi(ctx, dec); // -> sqdmlslt_z_zzzi_d\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_244);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_qrdmlah_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, S=(INSWORD>>10)&1;\n\tif(size==2 && !S) return sqrdmlah_z_zzzi(ctx, dec); // -> sqrdmlah_z_zzzi_s\n\tif(size==2 && S) return sqrdmlsh_z_zzzi(ctx, dec); // -> sqrdmlsh_z_zzzi_s\n\tif(size==3 && !S) return sqrdmlah_z_zzzi(ctx, dec); // -> sqrdmlah_z_zzzi_d\n\tif(size==3 && S) return sqrdmlsh_z_zzzi(ctx, dec); // -> sqrdmlsh_z_zzzi_d\n\tif(!(size&2) && !S) return sqrdmlah_z_zzzi(ctx, dec); // -> sqrdmlah_z_zzzi_h\n\tif(!(size&2) && S) return sqrdmlsh_z_zzzi(ctx, dec); // -> sqrdmlsh_z_zzzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cons_arith_long(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>13)&1, S=(INSWORD>>12)&1, U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!op && !S && !U && !T) return saddlb_z_zz(ctx, dec); // -> saddlb_z_zz_\n\tif(!op && !S && !U && T) return saddlt_z_zz(ctx, dec); // -> saddlt_z_zz_\n\tif(!op && !S && U && !T) return uaddlb_z_zz(ctx, dec); // -> uaddlb_z_zz_\n\tif(!op && !S && U && T) return uaddlt_z_zz(ctx, dec); // -> uaddlt_z_zz_\n\tif(!op && S && !U && !T) return ssublb_z_zz(ctx, dec); // -> ssublb_z_zz_\n\tif(!op && S && !U && T) return ssublt_z_zz(ctx, dec); // -> ssublt_z_zz_\n\tif(!op && S && U && !T) return usublb_z_zz(ctx, dec); // -> usublb_z_zz_\n\tif(!op && S && U && T) return usublt_z_zz(ctx, dec); // -> usublt_z_zz_\n\tif(op && S && !U && !T) return sabdlb_z_zz(ctx, dec); // -> sabdlb_z_zz_\n\tif(op && S && !U && T) return sabdlt_z_zz(ctx, dec); // -> sabdlt_z_zz_\n\tif(op && S && U && !T) return uabdlb_z_zz(ctx, dec); // -> uabdlb_z_zz_\n\tif(op && S && U && T) return uabdlt_z_zz(ctx, dec); // -> uabdlt_z_zz_\n\tif(op && !S) UNALLOCATED(ENC_UNALLOCATED_253);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cons_arith_wide(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>12)&1, U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!S && !U && !T) return saddwb_z_zz(ctx, dec); // -> saddwb_z_zz_\n\tif(!S && !U && T) return saddwt_z_zz(ctx, dec); // -> saddwt_z_zz_\n\tif(!S && U && !T) return uaddwb_z_zz(ctx, dec); // -> uaddwb_z_zz_\n\tif(!S && U && T) return uaddwt_z_zz(ctx, dec); // -> uaddwt_z_zz_\n\tif(S && !U && !T) return ssubwb_z_zz(ctx, dec); // -> ssubwb_z_zz_\n\tif(S && !U && T) return ssubwt_z_zz(ctx, dec); // -> ssubwt_z_zz_\n\tif(S && U && !T) return usubwb_z_zz(ctx, dec); // -> usubwb_z_zz_\n\tif(S && U && T) return usubwt_z_zz(ctx, dec); // -> usubwt_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cons_mul_long(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>12)&1, U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!op && !U && !T) return sqdmullb_z_zz(ctx, dec); // -> sqdmullb_z_zz_\n\tif(!op && !U && T) return sqdmullt_z_zz(ctx, dec); // -> sqdmullt_z_zz_\n\tif(!op && U && !T) return pmullb_z_zz(ctx, dec); // -> pmullb_z_zz_\n\tif(!op && U && T) return pmullt_z_zz(ctx, dec); // -> pmullt_z_zz_\n\tif(op && !U && !T) return smullb_z_zz(ctx, dec); // -> smullb_z_zz_\n\tif(op && !U && T) return smullt_z_zz(ctx, dec); // -> smullt_z_zz_\n\tif(op && U && !T) return umullb_z_zz(ctx, dec); // -> umullb_z_zz_\n\tif(op && U && T) return umullt_z_zz(ctx, dec); // -> umullt_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_mmla(context *ctx, Instruction *dec)\n{\n\tuint32_t uns=(INSWORD>>22)&3;\n\tif(!uns && HasI8MM()) return smmla_z_zzz(ctx, dec); // -> smmla_z_zzz_\n\tif(uns==1) UNALLOCATED(ENC_UNALLOCATED_258);\n\tif(uns==2 && HasI8MM()) return usmmla_z_zzz(ctx, dec); // -> usmmla_z_zzz_\n\tif(uns==3 && HasI8MM()) return ummla_z_zzz(ctx, dec); // -> ummla_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_eorx(context *ctx, Instruction *dec)\n{\n\tuint32_t tb=(INSWORD>>10)&1;\n\tif(!tb) return eorbt_z_zz(ctx, dec); // -> eorbt_z_zz_\n\tif(tb) return eortb_z_zz(ctx, dec); // -> eortb_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_perm_bit(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&3;\n\tif(!opc && HasSVE_BitPerm()) return bext_z_zz(ctx, dec); // -> bext_z_zz_\n\tif(opc==1 && HasSVE_BitPerm()) return bdep_z_zz(ctx, dec); // -> bdep_z_zz_\n\tif(opc==2 && HasSVE_BitPerm()) return bgrp_z_zz(ctx, dec); // -> bgrp_z_zz_\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_255);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_shift_long(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!U && !T) return sshllb_z_zi(ctx, dec); // -> sshllb_z_zi_\n\tif(!U && T) return sshllt_z_zi(ctx, dec); // -> sshllt_z_zi_\n\tif(U && !T) return ushllb_z_zi(ctx, dec); // -> ushllb_z_zi_\n\tif(U && T) return ushllt_z_zi(ctx, dec); // -> ushllt_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_clong(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>11)&1, tb=(INSWORD>>10)&1;\n\tif(!S && !tb) return saddlbt_z_zz(ctx, dec); // -> saddlbt_z_zz_\n\tif(!S && tb) UNALLOCATED(ENC_UNALLOCATED_254);\n\tif(S && !tb) return ssublbt_z_zz(ctx, dec); // -> ssublbt_z_zz_\n\tif(S && tb) return ssubltb_z_zz(ctx, dec); // -> ssubltb_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_shift_insert(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>10)&1;\n\tif(!op) return sri_z_zzi(ctx, dec); // -> sri_z_zzi_\n\tif(op) return sli_z_zzi(ctx, dec); // -> sli_z_zzi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_sra(context *ctx, Instruction *dec)\n{\n\tuint32_t R=(INSWORD>>11)&1, U=(INSWORD>>10)&1;\n\tif(!R && !U) return ssra_z_zi(ctx, dec); // -> ssra_z_zi_\n\tif(!R && U) return usra_z_zi(ctx, dec); // -> usra_z_zi_\n\tif(R && !U) return srsra_z_zi(ctx, dec); // -> srsra_z_zi_\n\tif(R && U) return ursra_z_zi(ctx, dec); // -> ursra_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_cadd(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>16)&1;\n\tif(!op) return cadd_z_zz(ctx, dec); // -> cadd_z_zz_\n\tif(op) return sqcadd_z_zz(ctx, dec); // -> sqcadd_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_aba(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>10)&1;\n\tif(!U) return saba_z_zzz(ctx, dec); // -> saba_z_zzz_\n\tif(U) return uaba_z_zzz(ctx, dec); // -> uaba_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_aba_long(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!U && !T) return sabalb_z_zzz(ctx, dec); // -> sabalb_z_zzz_\n\tif(!U && T) return sabalt_z_zzz(ctx, dec); // -> sabalt_z_zzz_\n\tif(U && !T) return uabalb_z_zzz(ctx, dec); // -> uabalb_z_zzz_\n\tif(U && T) return uabalt_z_zzz(ctx, dec); // -> uabalt_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_adc_long(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, T=(INSWORD>>10)&1;\n\tif(!(size&2) && !T) return adclb_z_zzz(ctx, dec); // -> adclb_z_zzz_\n\tif(!(size&2) && T) return adclt_z_zzz(ctx, dec); // -> adclt_z_zzz_\n\tif((size&2)==2 && !T) return sbclb_z_zzz(ctx, dec); // -> sbclb_z_zzz_\n\tif((size&2)==2 && T) return sbclt_z_zzz(ctx, dec); // -> sbclt_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_shift_narrow(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>13)&1, U=(INSWORD>>12)&1, R=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!op && !U && !R && !T) return sqshrunb_z_zi(ctx, dec); // -> sqshrunb_z_zi_\n\tif(!op && !U && !R && T) return sqshrunt_z_zi(ctx, dec); // -> sqshrunt_z_zi_\n\tif(!op && !U && R && !T) return sqrshrunb_z_zi(ctx, dec); // -> sqrshrunb_z_zi_\n\tif(!op && !U && R && T) return sqrshrunt_z_zi(ctx, dec); // -> sqrshrunt_z_zi_\n\tif(!op && U && !R && !T) return shrnb_z_zi(ctx, dec); // -> shrnb_z_zi_\n\tif(!op && U && !R && T) return shrnt_z_zi(ctx, dec); // -> shrnt_z_zi_\n\tif(!op && U && R && !T) return rshrnb_z_zi(ctx, dec); // -> rshrnb_z_zi_\n\tif(!op && U && R && T) return rshrnt_z_zi(ctx, dec); // -> rshrnt_z_zi_\n\tif(op && !U && !R && !T) return sqshrnb_z_zi(ctx, dec); // -> sqshrnb_z_zi_\n\tif(op && !U && !R && T) return sqshrnt_z_zi(ctx, dec); // -> sqshrnt_z_zi_\n\tif(op && !U && R && !T) return sqrshrnb_z_zi(ctx, dec); // -> sqrshrnb_z_zi_\n\tif(op && !U && R && T) return sqrshrnt_z_zi(ctx, dec); // -> sqrshrnt_z_zi_\n\tif(op && U && !R && !T) return uqshrnb_z_zi(ctx, dec); // -> uqshrnb_z_zi_\n\tif(op && U && !R && T) return uqshrnt_z_zi(ctx, dec); // -> uqshrnt_z_zi_\n\tif(op && U && R && !T) return uqrshrnb_z_zi(ctx, dec); // -> uqrshrnb_z_zi_\n\tif(op && U && R && T) return uqrshrnt_z_zi(ctx, dec); // -> uqrshrnt_z_zi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_arith_narrow(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>12)&1, R=(INSWORD>>11)&1, T=(INSWORD>>10)&1;\n\tif(!S && !R && !T) return addhnb_z_zz(ctx, dec); // -> addhnb_z_zz_\n\tif(!S && !R && T) return addhnt_z_zz(ctx, dec); // -> addhnt_z_zz_\n\tif(!S && R && !T) return raddhnb_z_zz(ctx, dec); // -> raddhnb_z_zz_\n\tif(!S && R && T) return raddhnt_z_zz(ctx, dec); // -> raddhnt_z_zz_\n\tif(S && !R && !T) return subhnb_z_zz(ctx, dec); // -> subhnb_z_zz_\n\tif(S && !R && T) return subhnt_z_zz(ctx, dec); // -> subhnt_z_zz_\n\tif(S && R && !T) return rsubhnb_z_zz(ctx, dec); // -> rsubhnb_z_zz_\n\tif(S && R && T) return rsubhnt_z_zz(ctx, dec); // -> rsubhnt_z_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_extract_narrow(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>11)&3, T=(INSWORD>>10)&1;\n\tif(!opc && !T) return sqxtnb_z_zz(ctx, dec); // -> sqxtnb_z_zz_\n\tif(!opc && T) return sqxtnt_z_zz(ctx, dec); // -> sqxtnt_z_zz_\n\tif(opc==1 && !T) return uqxtnb_z_zz(ctx, dec); // -> uqxtnb_z_zz_\n\tif(opc==1 && T) return uqxtnt_z_zz(ctx, dec); // -> uqxtnt_z_zz_\n\tif(opc==2 && !T) return sqxtunb_z_zz(ctx, dec); // -> sqxtunb_z_zz_\n\tif(opc==2 && T) return sqxtunt_z_zz(ctx, dec); // -> sqxtunt_z_zz_\n\tif(opc==3) UNALLOCATED(ENC_UNALLOCATED_256);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_match(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>4)&1;\n\tif(!op) return match_p_p_zz(ctx, dec); // -> match_p_p_zz_\n\tif(op) return nmatch_p_p_zz(ctx, dec); // -> nmatch_p_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_intx_histseg(context *ctx, Instruction *dec)\n{\n\treturn histseg_z_zz(ctx, dec);\n}\n\nint decode_iclass_sve_intx_histcnt(context *ctx, Instruction *dec)\n{\n\treturn histcnt_z_p_zz(ctx, dec);\n}\n\nint decode_iclass_sve_crypto_binary_const(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, op=(INSWORD>>10)&1;\n\tif(!size && !op && HasSVE_SM4()) return sm4ekey_z_zz(ctx, dec); // -> sm4ekey_z_zz_\n\tif(!size && op && HasSVE_SHA3()) return rax1_z_zz(ctx, dec); // -> rax1_z_zz_\n\tif(size==1) UNALLOCATED(ENC_UNALLOCATED_260);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_263);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_crypto_binary_dest(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, op=(INSWORD>>16)&1, o2=(INSWORD>>10)&1;\n\tif(!size && !op && !o2 && HasSVE_AES()) return aese_z_zz(ctx, dec); // -> aese_z_zz_\n\tif(!size && !op && o2 && HasSVE_AES()) return aesd_z_zz(ctx, dec); // -> aesd_z_zz_\n\tif(!size && op && !o2 && HasSVE_SM4()) return sm4e_z_zz(ctx, dec); // -> sm4e_z_zz_\n\tif(!size && op && o2) UNALLOCATED(ENC_UNALLOCATED_257);\n\tif(size==1) UNALLOCATED(ENC_UNALLOCATED_261);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_264);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_crypto_unary(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, op=(INSWORD>>10)&1;\n\tif(!size && !op && HasSVE_AES()) return aesmc_z_z(ctx, dec); // -> aesmc_z_z_\n\tif(!size && op && HasSVE_AES()) return aesimc_z_z(ctx, dec); // -> aesimc_z_z_\n\tif(size==1) UNALLOCATED(ENC_UNALLOCATED_259);\n\tif((size&2)==2) UNALLOCATED(ENC_UNALLOCATED_262);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fcadd(context *ctx, Instruction *dec)\n{\n\treturn fcadd_z_p_zz(ctx, dec);\n}\n\nint decode_iclass_sve_fp_fcvt2(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, opc2=(INSWORD>>16)&3;\n\tif(!opc && opc2==2) return fcvtxnt_z_p_z(ctx, dec); // -> fcvtxnt_z_p_z_d2s\n\tif(opc==2 && !opc2) return fcvtnt_z_p_z(ctx, dec); // -> fcvtnt_z_p_z_s2h\n\tif(opc==2 && opc2==1) return fcvtlt_z_p_z(ctx, dec); // -> fcvtlt_z_p_z_h2s\n\tif(opc==2 && opc2==2 && HasBF16()) return bfcvtnt_z_p_z(ctx, dec); // -> bfcvtnt_z_p_z_s2bf\n\tif(opc==3 && opc2==2) return fcvtnt_z_p_z(ctx, dec); // -> fcvtnt_z_p_z_d2s\n\tif(opc==3 && opc2==3) return fcvtlt_z_p_z(ctx, dec); // -> fcvtlt_z_p_z_s2d\n\tif(!(opc&1) && opc2==3) UNALLOCATED(ENC_UNALLOCATED_266);\n\tif(!opc && !(opc2&2)) UNALLOCATED(ENC_UNALLOCATED_265);\n\tif(opc==3 && !(opc2&2)) UNALLOCATED(ENC_UNALLOCATED_274);\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_273);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_pairwise(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return faddp_z_p_zz(ctx, dec); // -> faddp_z_p_zz_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_267);\n\tif(opc==4) return fmaxnmp_z_p_zz(ctx, dec); // -> fmaxnmp_z_p_zz_\n\tif(opc==5) return fminnmp_z_p_zz(ctx, dec); // -> fminnmp_z_p_zz_\n\tif(opc==6) return fmaxp_z_p_zz(ctx, dec); // -> fmaxp_z_p_zz_\n\tif(opc==7) return fminp_z_p_zz(ctx, dec); // -> fminp_z_p_zz_\n\tif((opc&6)==2) UNALLOCATED(ENC_UNALLOCATED_268);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fcmla(context *ctx, Instruction *dec)\n{\n\treturn fcmla_z_p_zzz(ctx, dec);\n}\n\nint decode_iclass_sve_fp_fma_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, op=(INSWORD>>10)&1;\n\tif(size==2 && !op) return fmla_z_zzzi(ctx, dec); // -> fmla_z_zzzi_s\n\tif(size==2 && op) return fmls_z_zzzi(ctx, dec); // -> fmls_z_zzzi_s\n\tif(size==3 && !op) return fmla_z_zzzi(ctx, dec); // -> fmla_z_zzzi_d\n\tif(size==3 && op) return fmls_z_zzzi(ctx, dec); // -> fmls_z_zzzi_d\n\tif(!(size&2) && !op) return fmla_z_zzzi(ctx, dec); // -> fmla_z_zzzi_h\n\tif(!(size&2) && op) return fmls_z_zzzi(ctx, dec); // -> fmls_z_zzzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fcmla_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return fcmla_z_zzzi(ctx, dec); // -> fcmla_z_zzzi_h\n\tif(size==3) return fcmla_z_zzzi(ctx, dec); // -> fcmla_z_zzzi_s\n\tif(!(size&2)) UNALLOCATED(ENC_UNALLOCATED_269);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fmul_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3;\n\tif(size==2) return fmul_z_zzi(ctx, dec); // -> fmul_z_zzi_s\n\tif(size==3) return fmul_z_zzi(ctx, dec); // -> fmul_z_zzi_d\n\tif(!(size&2)) return fmul_z_zzi(ctx, dec); // -> fmul_z_zzi_h\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fdot_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1;\n\tif(!op) UNALLOCATED(ENC_UNALLOCATED_270);\n\tif(op && HasBF16()) return bfdot_z_zzzi(ctx, dec); // -> bfdot_z_zzzi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fma_long_by_indexed_elem(context *ctx, Instruction *dec)\n{\n\tuint32_t o2=(INSWORD>>22)&1, op=(INSWORD>>13)&1, T=(INSWORD>>10)&1;\n\tif(!o2 && !op && !T) return fmlalb_z_zzzi(ctx, dec); // -> fmlalb_z_zzzi_s\n\tif(!o2 && !op && T) return fmlalt_z_zzzi(ctx, dec); // -> fmlalt_z_zzzi_s\n\tif(!o2 && op && !T) return fmlslb_z_zzzi(ctx, dec); // -> fmlslb_z_zzzi_s\n\tif(!o2 && op && T) return fmlslt_z_zzzi(ctx, dec); // -> fmlslt_z_zzzi_s\n\tif(o2 && !op && !T && HasBF16()) return bfmlalb_z_zzzi(ctx, dec); // -> bfmlalb_z_zzzi_\n\tif(o2 && !op && T && HasBF16()) return bfmlalt_z_zzzi(ctx, dec); // -> bfmlalt_z_zzzi_\n\tif(o2 && op) UNALLOCATED(ENC_UNALLOCATED_275);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fdot(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1;\n\tif(!op) UNALLOCATED(ENC_UNALLOCATED_271);\n\tif(op && HasBF16()) return bfdot_z_zzz(ctx, dec); // -> bfdot_z_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fma_long(context *ctx, Instruction *dec)\n{\n\tuint32_t o2=(INSWORD>>22)&1, op=(INSWORD>>13)&1, T=(INSWORD>>10)&1;\n\tif(!o2 && !op && !T) return fmlalb_z_zzz(ctx, dec); // -> fmlalb_z_zzz_\n\tif(!o2 && !op && T) return fmlalt_z_zzz(ctx, dec); // -> fmlalt_z_zzz_\n\tif(!o2 && op && !T) return fmlslb_z_zzz(ctx, dec); // -> fmlslb_z_zzz_\n\tif(!o2 && op && T) return fmlslt_z_zzz(ctx, dec); // -> fmlslt_z_zzz_\n\tif(o2 && !op && !T && HasBF16()) return bfmlalb_z_zzz(ctx, dec); // -> bfmlalb_z_zzz_\n\tif(o2 && !op && T && HasBF16()) return bfmlalt_z_zzz(ctx, dec); // -> bfmlalt_z_zzz_\n\tif(o2 && op) UNALLOCATED(ENC_UNALLOCATED_276);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fmmla(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3;\n\tif(!opc) UNALLOCATED(ENC_UNALLOCATED_272);\n\tif(opc==1 && HasBF16()) return bfmmla_z_zzz(ctx, dec); // -> bfmmla_z_zzz_\n\tif(opc==2 && HasF32MM()) return fmmla_z_zzz(ctx, dec); // -> fmmla_z_zzz_s\n\tif(opc==3 && HasF64MM()) return fmmla_z_zzz(ctx, dec); // -> fmmla_z_zzz_d\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_fast_red(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return faddv_v_p_z(ctx, dec); // -> faddv_v_p_z_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_279);\n\tif(opc==4) return fmaxnmv_v_p_z(ctx, dec); // -> fmaxnmv_v_p_z_\n\tif(opc==5) return fminnmv_v_p_z(ctx, dec); // -> fminnmv_v_p_z_\n\tif(opc==6) return fmaxv_v_p_z(ctx, dec); // -> fmaxv_v_p_z_\n\tif(opc==7) return fminv_v_p_z(ctx, dec); // -> fminv_v_p_z_\n\tif((opc&6)==2) UNALLOCATED(ENC_UNALLOCATED_280);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_u_zd(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(opc==6) return frecpe_z_z(ctx, dec); // -> frecpe_z_z_\n\tif(opc==7) return frsqrte_z_z(ctx, dec); // -> frsqrte_z_z_\n\tif((opc&6)==4) UNALLOCATED(ENC_UNALLOCATED_286);\n\tif(!(opc&4)) UNALLOCATED(ENC_UNALLOCATED_282);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_pd(context *ctx, Instruction *dec)\n{\n\tuint32_t eq=(INSWORD>>17)&1, lt=(INSWORD>>16)&1, ne=(INSWORD>>4)&1;\n\tif(!eq && !lt && !ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmge_p_p_z0_\n\tif(!eq && !lt && ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmgt_p_p_z0_\n\tif(!eq && lt && !ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmlt_p_p_z0_\n\tif(!eq && lt && ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmle_p_p_z0_\n\tif(eq && !lt && !ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmeq_p_p_z0_\n\tif(eq && lt && !ne) return fcmeq_p_p_z0(ctx, dec); // -> fcmne_p_p_z0_\n\tif(eq && ne) UNALLOCATED(ENC_UNALLOCATED_290);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_vd(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&3;\n\tif(!opc) return fadda_v_p_z(ctx, dec); // -> fadda_v_p_z_\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_291);\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_293);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_3op_u_zd(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>10)&7;\n\tif(!opc) return fadd_z_zz(ctx, dec); // -> fadd_z_zz_\n\tif(opc==1) return fsub_z_zz(ctx, dec); // -> fsub_z_zz_\n\tif(opc==2) return fmul_z_zz(ctx, dec); // -> fmul_z_zz_\n\tif(opc==3) return ftsmul_z_zz(ctx, dec); // -> ftsmul_z_zz_\n\tif(opc==6) return frecps_z_zz(ctx, dec); // -> frecps_z_zz_\n\tif(opc==7) return frsqrts_z_zz(ctx, dec); // -> frsqrts_z_zz_\n\tif((opc&6)==4) UNALLOCATED(ENC_UNALLOCATED_277);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_zds(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&15;\n\tif(!opc) return fadd_z_p_zz(ctx, dec); // -> fadd_z_p_zz_\n\tif(opc==1) return fsub_z_p_zz(ctx, dec); // -> fsub_z_p_zz_\n\tif(opc==2) return fmul_z_p_zz(ctx, dec); // -> fmul_z_p_zz_\n\tif(opc==3) return fsubr_z_p_zz(ctx, dec); // -> fsubr_z_p_zz_\n\tif(opc==4) return fmaxnm_z_p_zz(ctx, dec); // -> fmaxnm_z_p_zz_\n\tif(opc==5) return fminnm_z_p_zz(ctx, dec); // -> fminnm_z_p_zz_\n\tif(opc==6) return fmax_z_p_zz(ctx, dec); // -> fmax_z_p_zz_\n\tif(opc==7) return fmin_z_p_zz(ctx, dec); // -> fmin_z_p_zz_\n\tif(opc==8) return fabd_z_p_zz(ctx, dec); // -> fabd_z_p_zz_\n\tif(opc==9) return fscale_z_p_zz(ctx, dec); // -> fscale_z_p_zz_\n\tif(opc==10) return fmulx_z_p_zz(ctx, dec); // -> fmulx_z_p_zz_\n\tif(opc==11) UNALLOCATED(ENC_UNALLOCATED_284);\n\tif(opc==12) return fdivr_z_p_zz(ctx, dec); // -> fdivr_z_p_zz_\n\tif(opc==13) return fdiv_z_p_zz(ctx, dec); // -> fdiv_z_p_zz_\n\tif((opc&14)==14) UNALLOCATED(ENC_UNALLOCATED_287);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_i_p_zds(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return fadd_z_p_zs(ctx, dec); // -> fadd_z_p_zs_\n\tif(opc==1) return fsub_z_p_zs(ctx, dec); // -> fsub_z_p_zs_\n\tif(opc==2) return fmul_z_p_zs(ctx, dec); // -> fmul_z_p_zs_\n\tif(opc==3) return fsubr_z_p_zs(ctx, dec); // -> fsubr_z_p_zs_\n\tif(opc==4) return fmaxnm_z_p_zs(ctx, dec); // -> fmaxnm_z_p_zs_\n\tif(opc==5) return fminnm_z_p_zs(ctx, dec); // -> fminnm_z_p_zs_\n\tif(opc==6) return fmax_z_p_zs(ctx, dec); // -> fmax_z_p_zs_\n\tif(opc==7) return fmin_z_p_zs(ctx, dec); // -> fmin_z_p_zs_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_ftmad(context *ctx, Instruction *dec)\n{\n\treturn ftmad_z_zzi(ctx, dec);\n}\n\nint decode_iclass_sve_fp_2op_p_zd_b_0(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, opc2=(INSWORD>>16)&3;\n\tif(!opc && opc2==2) return fcvtx_z_p_z(ctx, dec); // -> fcvtx_z_p_z_d2s\n\tif(opc==2 && !opc2) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_s2h\n\tif(opc==2 && opc2==1) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_h2s\n\tif(opc==2 && opc2==2 && HasBF16()) return bfcvt_z_p_z(ctx, dec); // -> bfcvt_z_p_z_s2bf\n\tif(opc==3 && !opc2) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_d2h\n\tif(opc==3 && opc2==1) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_h2d\n\tif(opc==3 && opc2==2) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_d2s\n\tif(opc==3 && opc2==3) return fcvt_z_p_z(ctx, dec); // -> fcvt_z_p_z_s2d\n\tif(!(opc&1) && opc2==3) UNALLOCATED(ENC_UNALLOCATED_285);\n\tif(!opc && !(opc2&2)) UNALLOCATED(ENC_UNALLOCATED_283);\n\tif(opc==1) UNALLOCATED(ENC_UNALLOCATED_294);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_zd_d(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, opc2=(INSWORD>>17)&3, U=(INSWORD>>16)&1;\n\tif(opc==1 && opc2==1 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_fp162h\n\tif(opc==1 && opc2==1 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_fp162h\n\tif(opc==1 && opc2==2 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_fp162w\n\tif(opc==1 && opc2==2 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_fp162w\n\tif(opc==1 && opc2==3 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_fp162x\n\tif(opc==1 && opc2==3 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_fp162x\n\tif(opc==2 && opc2==2 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_s2w\n\tif(opc==2 && opc2==2 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_s2w\n\tif(opc==3 && !opc2 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_d2w\n\tif(opc==3 && !opc2 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_d2w\n\tif(opc==3 && opc2==2 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_s2x\n\tif(opc==3 && opc2==2 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_s2x\n\tif(opc==3 && opc2==3 && !U) return fcvtzs_z_p_z(ctx, dec); // -> fcvtzs_z_p_z_d2x\n\tif(opc==3 && opc2==3 && U) return fcvtzu_z_p_z(ctx, dec); // -> fcvtzu_z_p_z_d2x\n\tif(opc==1 && !opc2) UNALLOCATED(ENC_UNALLOCATED_296);\n\tif(opc==2 && opc2==3) UNALLOCATED(ENC_UNALLOCATED_300);\n\tif(opc==3 && opc2==1) UNALLOCATED(ENC_UNALLOCATED_302);\n\tif(!opc && !U) return flogb_z_p_z(ctx, dec); // -> flogb_z_p_z_\n\tif(!opc && U) UNALLOCATED(ENC_UNALLOCATED_292);\n\tif(opc==2 && !(opc2&2)) UNALLOCATED(ENC_UNALLOCATED_299);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_zd_a(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&7;\n\tif(!opc) return frinta_z_p_z(ctx, dec); // -> frintn_z_p_z_\n\tif(opc==1) return frinta_z_p_z(ctx, dec); // -> frintp_z_p_z_\n\tif(opc==2) return frinta_z_p_z(ctx, dec); // -> frintm_z_p_z_\n\tif(opc==3) return frinta_z_p_z(ctx, dec); // -> frintz_z_p_z_\n\tif(opc==4) return frinta_z_p_z(ctx, dec); // -> frinta_z_p_z_\n\tif(opc==5) UNALLOCATED(ENC_UNALLOCATED_281);\n\tif(opc==6) return frinta_z_p_z(ctx, dec); // -> frintx_z_p_z_\n\tif(opc==7) return frinta_z_p_z(ctx, dec); // -> frinti_z_p_z_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_zd_b_1(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>16)&3;\n\tif(!opc) return frecpx_z_p_z(ctx, dec); // -> frecpx_z_p_z_\n\tif(opc==1) return fsqrt_z_p_z(ctx, dec); // -> fsqrt_z_p_z_\n\tif((opc&2)==2) UNALLOCATED(ENC_UNALLOCATED_288);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_2op_p_zd_c(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&3, opc2=(INSWORD>>17)&3, U=(INSWORD>>16)&1;\n\tif(opc==1 && opc2==1 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_h2fp16\n\tif(opc==1 && opc2==1 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_h2fp16\n\tif(opc==1 && opc2==2 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_w2fp16\n\tif(opc==1 && opc2==2 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_w2fp16\n\tif(opc==1 && opc2==3 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_x2fp16\n\tif(opc==1 && opc2==3 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_x2fp16\n\tif(opc==2 && opc2==2 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_w2s\n\tif(opc==2 && opc2==2 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_w2s\n\tif(opc==3 && !opc2 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_w2d\n\tif(opc==3 && !opc2 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_w2d\n\tif(opc==3 && opc2==2 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_x2s\n\tif(opc==3 && opc2==2 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_x2s\n\tif(opc==3 && opc2==3 && !U) return scvtf_z_p_z(ctx, dec); // -> scvtf_z_p_z_x2d\n\tif(opc==3 && opc2==3 && U) return ucvtf_z_p_z(ctx, dec); // -> ucvtf_z_p_z_x2d\n\tif(opc==1 && !opc2) UNALLOCATED(ENC_UNALLOCATED_295);\n\tif(opc==2 && opc2==3) UNALLOCATED(ENC_UNALLOCATED_298);\n\tif(opc==3 && opc2==1) UNALLOCATED(ENC_UNALLOCATED_301);\n\tif(opc==2 && !(opc2&2)) UNALLOCATED(ENC_UNALLOCATED_297);\n\tif(!opc) UNALLOCATED(ENC_UNALLOCATED_289);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_3op_p_pd(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>15)&1, o2=(INSWORD>>13)&1, o3=(INSWORD>>4)&1;\n\tif(!op && !o2 && !o3) return fcmeq_p_p_zz(ctx, dec); // -> fcmge_p_p_zz_\n\tif(!op && !o2 && o3) return fcmeq_p_p_zz(ctx, dec); // -> fcmgt_p_p_zz_\n\tif(!op && o2 && !o3) return fcmeq_p_p_zz(ctx, dec); // -> fcmeq_p_p_zz_\n\tif(!op && o2 && o3) return fcmeq_p_p_zz(ctx, dec); // -> fcmne_p_p_zz_\n\tif(op && !o2 && !o3) return fcmeq_p_p_zz(ctx, dec); // -> fcmuo_p_p_zz_\n\tif(op && !o2 && o3) return facge_p_p_zz(ctx, dec); // -> facge_p_p_zz_\n\tif(op && o2 && !o3) UNALLOCATED(ENC_UNALLOCATED_278);\n\tif(op && o2 && o3) return facge_p_p_zz(ctx, dec); // -> facgt_p_p_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_3op_p_zds_a(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>13)&3;\n\tif(!opc) return fmla_z_p_zzz(ctx, dec); // -> fmla_z_p_zzz_\n\tif(opc==1) return fmls_z_p_zzz(ctx, dec); // -> fmls_z_p_zzz_\n\tif(opc==2) return fnmla_z_p_zzz(ctx, dec); // -> fnmla_z_p_zzz_\n\tif(opc==3) return fnmls_z_p_zzz(ctx, dec); // -> fnmls_z_p_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_fp_3op_p_zds_b(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>13)&3;\n\tif(!opc) return fmad_z_p_zzz(ctx, dec); // -> fmad_z_p_zzz_\n\tif(opc==1) return fmsb_z_p_zzz(ctx, dec); // -> fmsb_z_p_zzz_\n\tif(opc==2) return fnmad_z_p_zzz(ctx, dec); // -> fnmad_z_p_zzz_\n\tif(opc==3) return fnmsb_z_p_zzz(ctx, dec); // -> fnmsb_z_p_zzz_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_gld_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!opc && !U && !ff) return ld1sb_z_p_bz(ctx, dec); // -> ld1sb_z_p_bz_s_x32_unscaled\n\tif(!opc && !U && ff) return ldff1sb_z_p_bz(ctx, dec); // -> ldff1sb_z_p_bz_s_x32_unscaled\n\tif(!opc && U && !ff) return ld1b_z_p_bz(ctx, dec); // -> ld1b_z_p_bz_s_x32_unscaled\n\tif(!opc && U && ff) return ldff1b_z_p_bz(ctx, dec); // -> ldff1b_z_p_bz_s_x32_unscaled\n\tif(opc==1 && !U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_s_x32_unscaled\n\tif(opc==1 && !U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_s_x32_unscaled\n\tif(opc==1 && U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_s_x32_unscaled\n\tif(opc==1 && U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_s_x32_unscaled\n\tif(opc==2 && U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_s_x32_unscaled\n\tif(opc==2 && U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_s_x32_unscaled\n\tif(opc==2 && !U) UNALLOCATED(ENC_UNALLOCATED_303);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_gld_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!msz && !U && !ff) return ld1sb_z_p_ai(ctx, dec); // -> ld1sb_z_p_ai_s\n\tif(!msz && !U && ff) return ldff1sb_z_p_ai(ctx, dec); // -> ldff1sb_z_p_ai_s\n\tif(!msz && U && !ff) return ld1b_z_p_ai(ctx, dec); // -> ld1b_z_p_ai_s\n\tif(!msz && U && ff) return ldff1b_z_p_ai(ctx, dec); // -> ldff1b_z_p_ai_s\n\tif(msz==1 && !U && !ff) return ld1sh_z_p_ai(ctx, dec); // -> ld1sh_z_p_ai_s\n\tif(msz==1 && !U && ff) return ldff1sh_z_p_ai(ctx, dec); // -> ldff1sh_z_p_ai_s\n\tif(msz==1 && U && !ff) return ld1h_z_p_ai(ctx, dec); // -> ld1h_z_p_ai_s\n\tif(msz==1 && U && ff) return ldff1h_z_p_ai(ctx, dec); // -> ldff1h_z_p_ai_s\n\tif(msz==2 && U && !ff) return ld1w_z_p_ai(ctx, dec); // -> ld1w_z_p_ai_s\n\tif(msz==2 && U && ff) return ldff1w_z_p_ai(ctx, dec); // -> ldff1w_z_p_ai_s\n\tif(msz==2 && !U) UNALLOCATED(ENC_UNALLOCATED_306);\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_308);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_gld_sv_a(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_s_x32_scaled\n\tif(!U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_s_x32_scaled\n\tif(U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_s_x32_scaled\n\tif(U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_s_x32_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_gld_sv_b(context *ctx, Instruction *dec)\n{\n\tuint32_t U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_s_x32_scaled\n\tif(U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_s_x32_scaled\n\tif(!U) UNALLOCATED(ENC_UNALLOCATED_305);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_prfm_sv(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>13)&3;\n\tif(!msz) return prfb_i_p_bz(ctx, dec); // -> prfb_i_p_bz_s_x32_scaled\n\tif(msz==1) return prfh_i_p_bz(ctx, dec); // -> prfh_i_p_bz_s_x32_scaled\n\tif(msz==2) return prfw_i_p_bz(ctx, dec); // -> prfw_i_p_bz_s_x32_scaled\n\tif(msz==3) return prfd_i_p_bz(ctx, dec); // -> prfd_i_p_bz_s_x32_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_prfm_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return prfb_i_p_ai(ctx, dec); // -> prfb_i_p_ai_s\n\tif(msz==1) return prfh_i_p_ai(ctx, dec); // -> prfh_i_p_ai_s\n\tif(msz==2) return prfw_i_p_ai(ctx, dec); // -> prfw_i_p_ai_s\n\tif(msz==3) return prfd_i_p_ai(ctx, dec); // -> prfd_i_p_ai_s\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_prfm_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>13)&3;\n\tif(!msz) return prfb_i_p_bi(ctx, dec); // -> prfb_i_p_bi_s\n\tif(msz==1) return prfh_i_p_bi(ctx, dec); // -> prfh_i_p_bi_s\n\tif(msz==2) return prfw_i_p_bi(ctx, dec); // -> prfw_i_p_bi_s\n\tif(msz==3) return prfd_i_p_bi(ctx, dec); // -> prfd_i_p_bi_s\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_prfm_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return prfb_i_p_br(ctx, dec); // -> prfb_i_p_br_s\n\tif(msz==1) return prfh_i_p_br(ctx, dec); // -> prfh_i_p_br_s\n\tif(msz==2) return prfw_i_p_br(ctx, dec); // -> prfw_i_p_br_s\n\tif(msz==3) return prfd_i_p_br(ctx, dec); // -> prfd_i_p_br_s\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_ld_dup(context *ctx, Instruction *dec)\n{\n\tuint32_t dtypeh=(INSWORD>>23)&3, dtypel=(INSWORD>>13)&3;\n\tif(!dtypeh && !dtypel) return ld1rb_z_p_bi(ctx, dec); // -> ld1rb_z_p_bi_u8\n\tif(!dtypeh && dtypel==1) return ld1rb_z_p_bi(ctx, dec); // -> ld1rb_z_p_bi_u16\n\tif(!dtypeh && dtypel==2) return ld1rb_z_p_bi(ctx, dec); // -> ld1rb_z_p_bi_u32\n\tif(!dtypeh && dtypel==3) return ld1rb_z_p_bi(ctx, dec); // -> ld1rb_z_p_bi_u64\n\tif(dtypeh==1 && !dtypel) return ld1rsw_z_p_bi(ctx, dec); // -> ld1rsw_z_p_bi_s64\n\tif(dtypeh==1 && dtypel==1) return ld1rh_z_p_bi(ctx, dec); // -> ld1rh_z_p_bi_u16\n\tif(dtypeh==1 && dtypel==2) return ld1rh_z_p_bi(ctx, dec); // -> ld1rh_z_p_bi_u32\n\tif(dtypeh==1 && dtypel==3) return ld1rh_z_p_bi(ctx, dec); // -> ld1rh_z_p_bi_u64\n\tif(dtypeh==2 && !dtypel) return ld1rsh_z_p_bi(ctx, dec); // -> ld1rsh_z_p_bi_s64\n\tif(dtypeh==2 && dtypel==1) return ld1rsh_z_p_bi(ctx, dec); // -> ld1rsh_z_p_bi_s32\n\tif(dtypeh==2 && dtypel==2) return ld1rw_z_p_bi(ctx, dec); // -> ld1rw_z_p_bi_u32\n\tif(dtypeh==2 && dtypel==3) return ld1rw_z_p_bi(ctx, dec); // -> ld1rw_z_p_bi_u64\n\tif(dtypeh==3 && !dtypel) return ld1rsb_z_p_bi(ctx, dec); // -> ld1rsb_z_p_bi_s64\n\tif(dtypeh==3 && dtypel==1) return ld1rsb_z_p_bi(ctx, dec); // -> ld1rsb_z_p_bi_s32\n\tif(dtypeh==3 && dtypel==2) return ld1rsb_z_p_bi(ctx, dec); // -> ld1rsb_z_p_bi_s16\n\tif(dtypeh==3 && dtypel==3) return ld1rd_z_p_bi(ctx, dec); // -> ld1rd_z_p_bi_u64\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_32b_pfill(context *ctx, Instruction *dec)\n{\n\treturn ldr_p_bi(ctx, dec);\n}\n\nint decode_iclass_sve_mem_32b_fill(context *ctx, Instruction *dec)\n{\n\treturn ldr_z_bi(ctx, dec);\n}\n\nint decode_iclass_sve_mem_32b_gldnt_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>13)&1;\n\tif(!msz && !U) return ldnt1sb_z_p_ar(ctx, dec); // -> ldnt1sb_z_p_ar_s_x32_unscaled\n\tif(!msz && U) return ldnt1b_z_p_ar(ctx, dec); // -> ldnt1b_z_p_ar_s_x32_unscaled\n\tif(msz==1 && !U) return ldnt1sh_z_p_ar(ctx, dec); // -> ldnt1sh_z_p_ar_s_x32_unscaled\n\tif(msz==1 && U) return ldnt1h_z_p_ar(ctx, dec); // -> ldnt1h_z_p_ar_s_x32_unscaled\n\tif(msz==2 && !U) UNALLOCATED(ENC_UNALLOCATED_304);\n\tif(msz==2 && U) return ldnt1w_z_p_ar(ctx, dec); // -> ldnt1w_z_p_ar_s_x32_unscaled\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_307);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cldff_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t dtype=(INSWORD>>21)&15;\n\tif(!dtype) return ldff1b_z_p_br(ctx, dec); // -> ldff1b_z_p_br_u8\n\tif(dtype==1) return ldff1b_z_p_br(ctx, dec); // -> ldff1b_z_p_br_u16\n\tif(dtype==2) return ldff1b_z_p_br(ctx, dec); // -> ldff1b_z_p_br_u32\n\tif(dtype==3) return ldff1b_z_p_br(ctx, dec); // -> ldff1b_z_p_br_u64\n\tif(dtype==4) return ldff1sw_z_p_br(ctx, dec); // -> ldff1sw_z_p_br_s64\n\tif(dtype==5) return ldff1h_z_p_br(ctx, dec); // -> ldff1h_z_p_br_u16\n\tif(dtype==6) return ldff1h_z_p_br(ctx, dec); // -> ldff1h_z_p_br_u32\n\tif(dtype==7) return ldff1h_z_p_br(ctx, dec); // -> ldff1h_z_p_br_u64\n\tif(dtype==8) return ldff1sh_z_p_br(ctx, dec); // -> ldff1sh_z_p_br_s64\n\tif(dtype==9) return ldff1sh_z_p_br(ctx, dec); // -> ldff1sh_z_p_br_s32\n\tif(dtype==10) return ldff1w_z_p_br(ctx, dec); // -> ldff1w_z_p_br_u32\n\tif(dtype==11) return ldff1w_z_p_br(ctx, dec); // -> ldff1w_z_p_br_u64\n\tif(dtype==12) return ldff1sb_z_p_br(ctx, dec); // -> ldff1sb_z_p_br_s64\n\tif(dtype==13) return ldff1sb_z_p_br(ctx, dec); // -> ldff1sb_z_p_br_s32\n\tif(dtype==14) return ldff1sb_z_p_br(ctx, dec); // -> ldff1sb_z_p_br_s16\n\tif(dtype==15) return ldff1d_z_p_br(ctx, dec); // -> ldff1d_z_p_br_u64\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cld_si(context *ctx, Instruction *dec)\n{\n\tuint32_t dtype=(INSWORD>>21)&15;\n\tif(!dtype) return ld1b_z_p_bi(ctx, dec); // -> ld1b_z_p_bi_u8\n\tif(dtype==1) return ld1b_z_p_bi(ctx, dec); // -> ld1b_z_p_bi_u16\n\tif(dtype==2) return ld1b_z_p_bi(ctx, dec); // -> ld1b_z_p_bi_u32\n\tif(dtype==3) return ld1b_z_p_bi(ctx, dec); // -> ld1b_z_p_bi_u64\n\tif(dtype==4) return ld1sw_z_p_bi(ctx, dec); // -> ld1sw_z_p_bi_s64\n\tif(dtype==5) return ld1h_z_p_bi(ctx, dec); // -> ld1h_z_p_bi_u16\n\tif(dtype==6) return ld1h_z_p_bi(ctx, dec); // -> ld1h_z_p_bi_u32\n\tif(dtype==7) return ld1h_z_p_bi(ctx, dec); // -> ld1h_z_p_bi_u64\n\tif(dtype==8) return ld1sh_z_p_bi(ctx, dec); // -> ld1sh_z_p_bi_s64\n\tif(dtype==9) return ld1sh_z_p_bi(ctx, dec); // -> ld1sh_z_p_bi_s32\n\tif(dtype==10) return ld1w_z_p_bi(ctx, dec); // -> ld1w_z_p_bi_u32\n\tif(dtype==11) return ld1w_z_p_bi(ctx, dec); // -> ld1w_z_p_bi_u64\n\tif(dtype==12) return ld1sb_z_p_bi(ctx, dec); // -> ld1sb_z_p_bi_s64\n\tif(dtype==13) return ld1sb_z_p_bi(ctx, dec); // -> ld1sb_z_p_bi_s32\n\tif(dtype==14) return ld1sb_z_p_bi(ctx, dec); // -> ld1sb_z_p_bi_s16\n\tif(dtype==15) return ld1d_z_p_bi(ctx, dec); // -> ld1d_z_p_bi_u64\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cld_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t dtype=(INSWORD>>21)&15;\n\tif(!dtype) return ld1b_z_p_br(ctx, dec); // -> ld1b_z_p_br_u8\n\tif(dtype==1) return ld1b_z_p_br(ctx, dec); // -> ld1b_z_p_br_u16\n\tif(dtype==2) return ld1b_z_p_br(ctx, dec); // -> ld1b_z_p_br_u32\n\tif(dtype==3) return ld1b_z_p_br(ctx, dec); // -> ld1b_z_p_br_u64\n\tif(dtype==4) return ld1sw_z_p_br(ctx, dec); // -> ld1sw_z_p_br_s64\n\tif(dtype==5) return ld1h_z_p_br(ctx, dec); // -> ld1h_z_p_br_u16\n\tif(dtype==6) return ld1h_z_p_br(ctx, dec); // -> ld1h_z_p_br_u32\n\tif(dtype==7) return ld1h_z_p_br(ctx, dec); // -> ld1h_z_p_br_u64\n\tif(dtype==8) return ld1sh_z_p_br(ctx, dec); // -> ld1sh_z_p_br_s64\n\tif(dtype==9) return ld1sh_z_p_br(ctx, dec); // -> ld1sh_z_p_br_s32\n\tif(dtype==10) return ld1w_z_p_br(ctx, dec); // -> ld1w_z_p_br_u32\n\tif(dtype==11) return ld1w_z_p_br(ctx, dec); // -> ld1w_z_p_br_u64\n\tif(dtype==12) return ld1sb_z_p_br(ctx, dec); // -> ld1sb_z_p_br_s64\n\tif(dtype==13) return ld1sb_z_p_br(ctx, dec); // -> ld1sb_z_p_br_s32\n\tif(dtype==14) return ld1sb_z_p_br(ctx, dec); // -> ld1sb_z_p_br_s16\n\tif(dtype==15) return ld1d_z_p_br(ctx, dec); // -> ld1d_z_p_br_u64\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cldnf_si(context *ctx, Instruction *dec)\n{\n\tuint32_t dtype=(INSWORD>>21)&15;\n\tif(!dtype) return ldnf1b_z_p_bi(ctx, dec); // -> ldnf1b_z_p_bi_u8\n\tif(dtype==1) return ldnf1b_z_p_bi(ctx, dec); // -> ldnf1b_z_p_bi_u16\n\tif(dtype==2) return ldnf1b_z_p_bi(ctx, dec); // -> ldnf1b_z_p_bi_u32\n\tif(dtype==3) return ldnf1b_z_p_bi(ctx, dec); // -> ldnf1b_z_p_bi_u64\n\tif(dtype==4) return ldnf1sw_z_p_bi(ctx, dec); // -> ldnf1sw_z_p_bi_s64\n\tif(dtype==5) return ldnf1h_z_p_bi(ctx, dec); // -> ldnf1h_z_p_bi_u16\n\tif(dtype==6) return ldnf1h_z_p_bi(ctx, dec); // -> ldnf1h_z_p_bi_u32\n\tif(dtype==7) return ldnf1h_z_p_bi(ctx, dec); // -> ldnf1h_z_p_bi_u64\n\tif(dtype==8) return ldnf1sh_z_p_bi(ctx, dec); // -> ldnf1sh_z_p_bi_s64\n\tif(dtype==9) return ldnf1sh_z_p_bi(ctx, dec); // -> ldnf1sh_z_p_bi_s32\n\tif(dtype==10) return ldnf1w_z_p_bi(ctx, dec); // -> ldnf1w_z_p_bi_u32\n\tif(dtype==11) return ldnf1w_z_p_bi(ctx, dec); // -> ldnf1w_z_p_bi_u64\n\tif(dtype==12) return ldnf1sb_z_p_bi(ctx, dec); // -> ldnf1sb_z_p_bi_s64\n\tif(dtype==13) return ldnf1sb_z_p_bi(ctx, dec); // -> ldnf1sb_z_p_bi_s32\n\tif(dtype==14) return ldnf1sb_z_p_bi(ctx, dec); // -> ldnf1sb_z_p_bi_s16\n\tif(dtype==15) return ldnf1d_z_p_bi(ctx, dec); // -> ldnf1d_z_p_bi_u64\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cldnt_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return ldnt1b_z_p_bi(ctx, dec); // -> ldnt1b_z_p_bi_contiguous\n\tif(msz==1) return ldnt1h_z_p_bi(ctx, dec); // -> ldnt1h_z_p_bi_contiguous\n\tif(msz==2) return ldnt1w_z_p_bi(ctx, dec); // -> ldnt1w_z_p_bi_contiguous\n\tif(msz==3) return ldnt1d_z_p_bi(ctx, dec); // -> ldnt1d_z_p_bi_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cldnt_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return ldnt1b_z_p_br(ctx, dec); // -> ldnt1b_z_p_br_contiguous\n\tif(msz==1) return ldnt1h_z_p_br(ctx, dec); // -> ldnt1h_z_p_br_contiguous\n\tif(msz==2) return ldnt1w_z_p_br(ctx, dec); // -> ldnt1w_z_p_br_contiguous\n\tif(msz==3) return ldnt1d_z_p_br(ctx, dec); // -> ldnt1d_z_p_br_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_ldqr_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, ssz=(INSWORD>>21)&3;\n\tif(!msz && !ssz) return ld1rqb_z_p_bi(ctx, dec); // -> ld1rqb_z_p_bi_u8\n\tif(!msz && ssz==1 && HasF64MM()) return ld1rob_z_p_bi(ctx, dec); // -> ld1rob_z_p_bi_u8\n\tif(msz==1 && !ssz) return ld1rqh_z_p_bi(ctx, dec); // -> ld1rqh_z_p_bi_u16\n\tif(msz==1 && ssz==1 && HasF64MM()) return ld1roh_z_p_bi(ctx, dec); // -> ld1roh_z_p_bi_u16\n\tif(msz==2 && !ssz) return ld1rqw_z_p_bi(ctx, dec); // -> ld1rqw_z_p_bi_u32\n\tif(msz==2 && ssz==1 && HasF64MM()) return ld1row_z_p_bi(ctx, dec); // -> ld1row_z_p_bi_u32\n\tif(msz==3 && !ssz) return ld1rqd_z_p_bi(ctx, dec); // -> ld1rqd_z_p_bi_u64\n\tif(msz==3 && ssz==1 && HasF64MM()) return ld1rod_z_p_bi(ctx, dec); // -> ld1rod_z_p_bi_u64\n\tif((ssz&2)==2) UNALLOCATED(ENC_UNALLOCATED_310);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_ldqr_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, ssz=(INSWORD>>21)&3;\n\tif(!msz && !ssz) return ld1rqb_z_p_br(ctx, dec); // -> ld1rqb_z_p_br_contiguous\n\tif(!msz && ssz==1 && HasF64MM()) return ld1rob_z_p_br(ctx, dec); // -> ld1rob_z_p_br_contiguous\n\tif(msz==1 && !ssz) return ld1rqh_z_p_br(ctx, dec); // -> ld1rqh_z_p_br_contiguous\n\tif(msz==1 && ssz==1 && HasF64MM()) return ld1roh_z_p_br(ctx, dec); // -> ld1roh_z_p_br_contiguous\n\tif(msz==2 && !ssz) return ld1rqw_z_p_br(ctx, dec); // -> ld1rqw_z_p_br_contiguous\n\tif(msz==2 && ssz==1 && HasF64MM()) return ld1row_z_p_br(ctx, dec); // -> ld1row_z_p_br_contiguous\n\tif(msz==3 && !ssz) return ld1rqd_z_p_br(ctx, dec); // -> ld1rqd_z_p_br_contiguous\n\tif(msz==3 && ssz==1 && HasF64MM()) return ld1rod_z_p_br(ctx, dec); // -> ld1rod_z_p_br_contiguous\n\tif((ssz&2)==2) UNALLOCATED(ENC_UNALLOCATED_309);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_eld_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, opc=(INSWORD>>21)&3;\n\tif(!msz && opc==1) return ld2b_z_p_bi(ctx, dec); // -> ld2b_z_p_bi_contiguous\n\tif(!msz && opc==2) return ld3b_z_p_bi(ctx, dec); // -> ld3b_z_p_bi_contiguous\n\tif(!msz && opc==3) return ld4b_z_p_bi(ctx, dec); // -> ld4b_z_p_bi_contiguous\n\tif(msz==1 && opc==1) return ld2h_z_p_bi(ctx, dec); // -> ld2h_z_p_bi_contiguous\n\tif(msz==1 && opc==2) return ld3h_z_p_bi(ctx, dec); // -> ld3h_z_p_bi_contiguous\n\tif(msz==1 && opc==3) return ld4h_z_p_bi(ctx, dec); // -> ld4h_z_p_bi_contiguous\n\tif(msz==2 && opc==1) return ld2w_z_p_bi(ctx, dec); // -> ld2w_z_p_bi_contiguous\n\tif(msz==2 && opc==2) return ld3w_z_p_bi(ctx, dec); // -> ld3w_z_p_bi_contiguous\n\tif(msz==2 && opc==3) return ld4w_z_p_bi(ctx, dec); // -> ld4w_z_p_bi_contiguous\n\tif(msz==3 && opc==1) return ld2d_z_p_bi(ctx, dec); // -> ld2d_z_p_bi_contiguous\n\tif(msz==3 && opc==2) return ld3d_z_p_bi(ctx, dec); // -> ld3d_z_p_bi_contiguous\n\tif(msz==3 && opc==3) return ld4d_z_p_bi(ctx, dec); // -> ld4d_z_p_bi_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_eld_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, opc=(INSWORD>>21)&3;\n\tif(!msz && opc==1) return ld2b_z_p_br(ctx, dec); // -> ld2b_z_p_br_contiguous\n\tif(!msz && opc==2) return ld3b_z_p_br(ctx, dec); // -> ld3b_z_p_br_contiguous\n\tif(!msz && opc==3) return ld4b_z_p_br(ctx, dec); // -> ld4b_z_p_br_contiguous\n\tif(msz==1 && opc==1) return ld2h_z_p_br(ctx, dec); // -> ld2h_z_p_br_contiguous\n\tif(msz==1 && opc==2) return ld3h_z_p_br(ctx, dec); // -> ld3h_z_p_br_contiguous\n\tif(msz==1 && opc==3) return ld4h_z_p_br(ctx, dec); // -> ld4h_z_p_br_contiguous\n\tif(msz==2 && opc==1) return ld2w_z_p_br(ctx, dec); // -> ld2w_z_p_br_contiguous\n\tif(msz==2 && opc==2) return ld3w_z_p_br(ctx, dec); // -> ld3w_z_p_br_contiguous\n\tif(msz==2 && opc==3) return ld4w_z_p_br(ctx, dec); // -> ld4w_z_p_br_contiguous\n\tif(msz==3 && opc==1) return ld2d_z_p_br(ctx, dec); // -> ld2d_z_p_br_contiguous\n\tif(msz==3 && opc==2) return ld3d_z_p_br(ctx, dec); // -> ld3d_z_p_br_contiguous\n\tif(msz==3 && opc==3) return ld4d_z_p_br(ctx, dec); // -> ld4d_z_p_br_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gld_sv(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(opc==1 && !U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_d_x32_scaled\n\tif(opc==1 && !U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_d_x32_scaled\n\tif(opc==1 && U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_d_x32_scaled\n\tif(opc==1 && U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_d_x32_scaled\n\tif(opc==2 && !U && !ff) return ld1sw_z_p_bz(ctx, dec); // -> ld1sw_z_p_bz_d_x32_scaled\n\tif(opc==2 && !U && ff) return ldff1sw_z_p_bz(ctx, dec); // -> ldff1sw_z_p_bz_d_x32_scaled\n\tif(opc==2 && U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_d_x32_scaled\n\tif(opc==2 && U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_d_x32_scaled\n\tif(opc==3 && U && !ff) return ld1d_z_p_bz(ctx, dec); // -> ld1d_z_p_bz_d_x32_scaled\n\tif(opc==3 && U && ff) return ldff1d_z_p_bz(ctx, dec); // -> ldff1d_z_p_bz_d_x32_scaled\n\tif(opc==3 && !U) UNALLOCATED(ENC_UNALLOCATED_318);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gld_sv2(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(opc==1 && !U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_d_64_scaled\n\tif(opc==1 && !U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_d_64_scaled\n\tif(opc==1 && U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_d_64_scaled\n\tif(opc==1 && U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_d_64_scaled\n\tif(opc==2 && !U && !ff) return ld1sw_z_p_bz(ctx, dec); // -> ld1sw_z_p_bz_d_64_scaled\n\tif(opc==2 && !U && ff) return ldff1sw_z_p_bz(ctx, dec); // -> ldff1sw_z_p_bz_d_64_scaled\n\tif(opc==2 && U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_d_64_scaled\n\tif(opc==2 && U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_d_64_scaled\n\tif(opc==3 && U && !ff) return ld1d_z_p_bz(ctx, dec); // -> ld1d_z_p_bz_d_64_scaled\n\tif(opc==3 && U && ff) return ldff1d_z_p_bz(ctx, dec); // -> ldff1d_z_p_bz_d_64_scaled\n\tif(opc==3 && !U) UNALLOCATED(ENC_UNALLOCATED_321);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gld_vs2(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!msz && !U && !ff) return ld1sb_z_p_bz(ctx, dec); // -> ld1sb_z_p_bz_d_64_unscaled\n\tif(!msz && !U && ff) return ldff1sb_z_p_bz(ctx, dec); // -> ldff1sb_z_p_bz_d_64_unscaled\n\tif(!msz && U && !ff) return ld1b_z_p_bz(ctx, dec); // -> ld1b_z_p_bz_d_64_unscaled\n\tif(!msz && U && ff) return ldff1b_z_p_bz(ctx, dec); // -> ldff1b_z_p_bz_d_64_unscaled\n\tif(msz==1 && !U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_d_64_unscaled\n\tif(msz==1 && !U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_d_64_unscaled\n\tif(msz==1 && U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_d_64_unscaled\n\tif(msz==1 && U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_d_64_unscaled\n\tif(msz==2 && !U && !ff) return ld1sw_z_p_bz(ctx, dec); // -> ld1sw_z_p_bz_d_64_unscaled\n\tif(msz==2 && !U && ff) return ldff1sw_z_p_bz(ctx, dec); // -> ldff1sw_z_p_bz_d_64_unscaled\n\tif(msz==2 && U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_d_64_unscaled\n\tif(msz==2 && U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_d_64_unscaled\n\tif(msz==3 && U && !ff) return ld1d_z_p_bz(ctx, dec); // -> ld1d_z_p_bz_d_64_unscaled\n\tif(msz==3 && U && ff) return ldff1d_z_p_bz(ctx, dec); // -> ldff1d_z_p_bz_d_64_unscaled\n\tif(msz==3 && !U) UNALLOCATED(ENC_UNALLOCATED_320);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gld_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!msz && !U && !ff) return ld1sb_z_p_bz(ctx, dec); // -> ld1sb_z_p_bz_d_x32_unscaled\n\tif(!msz && !U && ff) return ldff1sb_z_p_bz(ctx, dec); // -> ldff1sb_z_p_bz_d_x32_unscaled\n\tif(!msz && U && !ff) return ld1b_z_p_bz(ctx, dec); // -> ld1b_z_p_bz_d_x32_unscaled\n\tif(!msz && U && ff) return ldff1b_z_p_bz(ctx, dec); // -> ldff1b_z_p_bz_d_x32_unscaled\n\tif(msz==1 && !U && !ff) return ld1sh_z_p_bz(ctx, dec); // -> ld1sh_z_p_bz_d_x32_unscaled\n\tif(msz==1 && !U && ff) return ldff1sh_z_p_bz(ctx, dec); // -> ldff1sh_z_p_bz_d_x32_unscaled\n\tif(msz==1 && U && !ff) return ld1h_z_p_bz(ctx, dec); // -> ld1h_z_p_bz_d_x32_unscaled\n\tif(msz==1 && U && ff) return ldff1h_z_p_bz(ctx, dec); // -> ldff1h_z_p_bz_d_x32_unscaled\n\tif(msz==2 && !U && !ff) return ld1sw_z_p_bz(ctx, dec); // -> ld1sw_z_p_bz_d_x32_unscaled\n\tif(msz==2 && !U && ff) return ldff1sw_z_p_bz(ctx, dec); // -> ldff1sw_z_p_bz_d_x32_unscaled\n\tif(msz==2 && U && !ff) return ld1w_z_p_bz(ctx, dec); // -> ld1w_z_p_bz_d_x32_unscaled\n\tif(msz==2 && U && ff) return ldff1w_z_p_bz(ctx, dec); // -> ldff1w_z_p_bz_d_x32_unscaled\n\tif(msz==3 && U && !ff) return ld1d_z_p_bz(ctx, dec); // -> ld1d_z_p_bz_d_x32_unscaled\n\tif(msz==3 && U && ff) return ldff1d_z_p_bz(ctx, dec); // -> ldff1d_z_p_bz_d_x32_unscaled\n\tif(msz==3 && !U) UNALLOCATED(ENC_UNALLOCATED_316);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gld_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>14)&1, ff=(INSWORD>>13)&1;\n\tif(!msz && !U && !ff) return ld1sb_z_p_ai(ctx, dec); // -> ld1sb_z_p_ai_d\n\tif(!msz && !U && ff) return ldff1sb_z_p_ai(ctx, dec); // -> ldff1sb_z_p_ai_d\n\tif(!msz && U && !ff) return ld1b_z_p_ai(ctx, dec); // -> ld1b_z_p_ai_d\n\tif(!msz && U && ff) return ldff1b_z_p_ai(ctx, dec); // -> ldff1b_z_p_ai_d\n\tif(msz==1 && !U && !ff) return ld1sh_z_p_ai(ctx, dec); // -> ld1sh_z_p_ai_d\n\tif(msz==1 && !U && ff) return ldff1sh_z_p_ai(ctx, dec); // -> ldff1sh_z_p_ai_d\n\tif(msz==1 && U && !ff) return ld1h_z_p_ai(ctx, dec); // -> ld1h_z_p_ai_d\n\tif(msz==1 && U && ff) return ldff1h_z_p_ai(ctx, dec); // -> ldff1h_z_p_ai_d\n\tif(msz==2 && !U && !ff) return ld1sw_z_p_ai(ctx, dec); // -> ld1sw_z_p_ai_d\n\tif(msz==2 && !U && ff) return ldff1sw_z_p_ai(ctx, dec); // -> ldff1sw_z_p_ai_d\n\tif(msz==2 && U && !ff) return ld1w_z_p_ai(ctx, dec); // -> ld1w_z_p_ai_d\n\tif(msz==2 && U && ff) return ldff1w_z_p_ai(ctx, dec); // -> ldff1w_z_p_ai_d\n\tif(msz==3 && U && !ff) return ld1d_z_p_ai(ctx, dec); // -> ld1d_z_p_ai_d\n\tif(msz==3 && U && ff) return ldff1d_z_p_ai(ctx, dec); // -> ldff1d_z_p_ai_d\n\tif(msz==3 && !U) UNALLOCATED(ENC_UNALLOCATED_319);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_prfm_sv2(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>13)&3;\n\tif(!msz) return prfb_i_p_bz(ctx, dec); // -> prfb_i_p_bz_d_64_scaled\n\tif(msz==1) return prfh_i_p_bz(ctx, dec); // -> prfh_i_p_bz_d_64_scaled\n\tif(msz==2) return prfw_i_p_bz(ctx, dec); // -> prfw_i_p_bz_d_64_scaled\n\tif(msz==3) return prfd_i_p_bz(ctx, dec); // -> prfd_i_p_bz_d_64_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_prfm_sv(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>13)&3;\n\tif(!msz) return prfb_i_p_bz(ctx, dec); // -> prfb_i_p_bz_d_x32_scaled\n\tif(msz==1) return prfh_i_p_bz(ctx, dec); // -> prfh_i_p_bz_d_x32_scaled\n\tif(msz==2) return prfw_i_p_bz(ctx, dec); // -> prfw_i_p_bz_d_x32_scaled\n\tif(msz==3) return prfd_i_p_bz(ctx, dec); // -> prfd_i_p_bz_d_x32_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_prfm_vi(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return prfb_i_p_ai(ctx, dec); // -> prfb_i_p_ai_d\n\tif(msz==1) return prfh_i_p_ai(ctx, dec); // -> prfh_i_p_ai_d\n\tif(msz==2) return prfw_i_p_ai(ctx, dec); // -> prfw_i_p_ai_d\n\tif(msz==3) return prfd_i_p_ai(ctx, dec); // -> prfd_i_p_ai_d\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_64b_gldnt_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, U=(INSWORD>>14)&1;\n\tif(!msz && !U) return ldnt1sb_z_p_ar(ctx, dec); // -> ldnt1sb_z_p_ar_d_64_unscaled\n\tif(!msz && U) return ldnt1b_z_p_ar(ctx, dec); // -> ldnt1b_z_p_ar_d_64_unscaled\n\tif(msz==1 && !U) return ldnt1sh_z_p_ar(ctx, dec); // -> ldnt1sh_z_p_ar_d_64_unscaled\n\tif(msz==1 && U) return ldnt1h_z_p_ar(ctx, dec); // -> ldnt1h_z_p_ar_d_64_unscaled\n\tif(msz==2 && !U) return ldnt1sw_z_p_ar(ctx, dec); // -> ldnt1sw_z_p_ar_d_64_unscaled\n\tif(msz==2 && U) return ldnt1w_z_p_ar(ctx, dec); // -> ldnt1w_z_p_ar_d_64_unscaled\n\tif(msz==3 && !U) UNALLOCATED(ENC_UNALLOCATED_317);\n\tif(msz==3 && U) return ldnt1d_z_p_ar(ctx, dec); // -> ldnt1d_z_p_ar_d_64_unscaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cst_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t opc=(INSWORD>>22)&7, o2=(INSWORD>>21)&1;\n\tif(opc==7 && !o2) UNALLOCATED(ENC_UNALLOCATED_326);\n\tif(opc==7 && o2) return st1d_z_p_br(ctx, dec); // -> st1d_z_p_br_\n\tif(!(opc&6)) return st1b_z_p_br(ctx, dec); // -> st1b_z_p_br_\n\tif((opc&6)==2) return st1h_z_p_br(ctx, dec); // -> st1h_z_p_br_\n\tif((opc&6)==4) return st1w_z_p_br(ctx, dec); // -> st1w_z_p_br_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_pspill(context *ctx, Instruction *dec)\n{\n\treturn str_p_bi(ctx, dec);\n}\n\nint decode_iclass_sve_mem_spill(context *ctx, Instruction *dec)\n{\n\treturn str_z_bi(ctx, dec);\n}\n\nint decode_iclass_sve_mem_cstnt_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return stnt1b_z_p_br(ctx, dec); // -> stnt1b_z_p_br_contiguous\n\tif(msz==1) return stnt1h_z_p_br(ctx, dec); // -> stnt1h_z_p_br_contiguous\n\tif(msz==2) return stnt1w_z_p_br(ctx, dec); // -> stnt1w_z_p_br_contiguous\n\tif(msz==3) return stnt1d_z_p_br(ctx, dec); // -> stnt1d_z_p_br_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_est_ss(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, opc=(INSWORD>>21)&3;\n\tif(!msz && opc==1) return st2b_z_p_br(ctx, dec); // -> st2b_z_p_br_contiguous\n\tif(!msz && opc==2) return st3b_z_p_br(ctx, dec); // -> st3b_z_p_br_contiguous\n\tif(!msz && opc==3) return st4b_z_p_br(ctx, dec); // -> st4b_z_p_br_contiguous\n\tif(msz==1 && opc==1) return st2h_z_p_br(ctx, dec); // -> st2h_z_p_br_contiguous\n\tif(msz==1 && opc==2) return st3h_z_p_br(ctx, dec); // -> st3h_z_p_br_contiguous\n\tif(msz==1 && opc==3) return st4h_z_p_br(ctx, dec); // -> st4h_z_p_br_contiguous\n\tif(msz==2 && opc==1) return st2w_z_p_br(ctx, dec); // -> st2w_z_p_br_contiguous\n\tif(msz==2 && opc==2) return st3w_z_p_br(ctx, dec); // -> st3w_z_p_br_contiguous\n\tif(msz==2 && opc==3) return st4w_z_p_br(ctx, dec); // -> st4w_z_p_br_contiguous\n\tif(msz==3 && opc==1) return st2d_z_p_br(ctx, dec); // -> st2d_z_p_br_contiguous\n\tif(msz==3 && opc==2) return st3d_z_p_br(ctx, dec); // -> st3d_z_p_br_contiguous\n\tif(msz==3 && opc==3) return st4d_z_p_br(ctx, dec); // -> st4d_z_p_br_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sstnt_32b_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return stnt1b_z_p_ar(ctx, dec); // -> stnt1b_z_p_ar_s_x32_unscaled\n\tif(msz==1) return stnt1h_z_p_ar(ctx, dec); // -> stnt1h_z_p_ar_s_x32_unscaled\n\tif(msz==2) return stnt1w_z_p_ar(ctx, dec); // -> stnt1w_z_p_ar_s_x32_unscaled\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_325);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sstnt_64b_vs(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return stnt1b_z_p_ar(ctx, dec); // -> stnt1b_z_p_ar_d_64_unscaled\n\tif(msz==1) return stnt1h_z_p_ar(ctx, dec); // -> stnt1h_z_p_ar_d_64_unscaled\n\tif(msz==2) return stnt1w_z_p_ar(ctx, dec); // -> stnt1w_z_p_ar_d_64_unscaled\n\tif(msz==3) return stnt1d_z_p_ar(ctx, dec); // -> stnt1d_z_p_ar_d_64_unscaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_vi_b(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_ai(ctx, dec); // -> st1b_z_p_ai_s\n\tif(msz==1) return st1h_z_p_ai(ctx, dec); // -> st1h_z_p_ai_s\n\tif(msz==2) return st1w_z_p_ai(ctx, dec); // -> st1w_z_p_ai_s\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_329);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_sv2(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) UNALLOCATED(ENC_UNALLOCATED_323);\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_d_64_scaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_d_64_scaled\n\tif(msz==3) return st1d_z_p_bz(ctx, dec); // -> st1d_z_p_bz_d_64_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_vs2(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_bz(ctx, dec); // -> st1b_z_p_bz_d_64_unscaled\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_d_64_unscaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_d_64_unscaled\n\tif(msz==3) return st1d_z_p_bz(ctx, dec); // -> st1d_z_p_bz_d_64_unscaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_vi_a(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_ai(ctx, dec); // -> st1b_z_p_ai_d\n\tif(msz==1) return st1h_z_p_ai(ctx, dec); // -> st1h_z_p_ai_d\n\tif(msz==2) return st1w_z_p_ai(ctx, dec); // -> st1w_z_p_ai_d\n\tif(msz==3) return st1d_z_p_ai(ctx, dec); // -> st1d_z_p_ai_d\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cstnt_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return stnt1b_z_p_bi(ctx, dec); // -> stnt1b_z_p_bi_contiguous\n\tif(msz==1) return stnt1h_z_p_bi(ctx, dec); // -> stnt1h_z_p_bi_contiguous\n\tif(msz==2) return stnt1w_z_p_bi(ctx, dec); // -> stnt1w_z_p_bi_contiguous\n\tif(msz==3) return stnt1d_z_p_bi(ctx, dec); // -> stnt1d_z_p_bi_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_cst_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_bi(ctx, dec); // -> st1b_z_p_bi_\n\tif(msz==1) return st1h_z_p_bi(ctx, dec); // -> st1h_z_p_bi_\n\tif(msz==2) return st1w_z_p_bi(ctx, dec); // -> st1w_z_p_bi_\n\tif(msz==3) return st1d_z_p_bi(ctx, dec); // -> st1d_z_p_bi_\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_est_si(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3, opc=(INSWORD>>21)&3;\n\tif(!msz && opc==1) return st2b_z_p_bi(ctx, dec); // -> st2b_z_p_bi_contiguous\n\tif(!msz && opc==2) return st3b_z_p_bi(ctx, dec); // -> st3b_z_p_bi_contiguous\n\tif(!msz && opc==3) return st4b_z_p_bi(ctx, dec); // -> st4b_z_p_bi_contiguous\n\tif(msz==1 && opc==1) return st2h_z_p_bi(ctx, dec); // -> st2h_z_p_bi_contiguous\n\tif(msz==1 && opc==2) return st3h_z_p_bi(ctx, dec); // -> st3h_z_p_bi_contiguous\n\tif(msz==1 && opc==3) return st4h_z_p_bi(ctx, dec); // -> st4h_z_p_bi_contiguous\n\tif(msz==2 && opc==1) return st2w_z_p_bi(ctx, dec); // -> st2w_z_p_bi_contiguous\n\tif(msz==2 && opc==2) return st3w_z_p_bi(ctx, dec); // -> st3w_z_p_bi_contiguous\n\tif(msz==2 && opc==3) return st4w_z_p_bi(ctx, dec); // -> st4w_z_p_bi_contiguous\n\tif(msz==3 && opc==1) return st2d_z_p_bi(ctx, dec); // -> st2d_z_p_bi_contiguous\n\tif(msz==3 && opc==2) return st3d_z_p_bi(ctx, dec); // -> st3d_z_p_bi_contiguous\n\tif(msz==3 && opc==3) return st4d_z_p_bi(ctx, dec); // -> st4d_z_p_bi_contiguous\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_sv_b(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) UNALLOCATED(ENC_UNALLOCATED_324);\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_s_x32_scaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_s_x32_scaled\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_328);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_vs_b(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_bz(ctx, dec); // -> st1b_z_p_bz_s_x32_unscaled\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_s_x32_unscaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_s_x32_unscaled\n\tif(msz==3) UNALLOCATED(ENC_UNALLOCATED_327);\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_sv_a(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) UNALLOCATED(ENC_UNALLOCATED_322);\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_d_x32_scaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_d_x32_scaled\n\tif(msz==3) return st1d_z_p_bz(ctx, dec); // -> st1d_z_p_bz_d_x32_scaled\n\tUNMATCHED;\n}\n\nint decode_iclass_sve_mem_sst_vs_a(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>23)&3;\n\tif(!msz) return st1b_z_p_bz(ctx, dec); // -> st1b_z_p_bz_d_x32_unscaled\n\tif(msz==1) return st1h_z_p_bz(ctx, dec); // -> st1h_z_p_bz_d_x32_unscaled\n\tif(msz==2) return st1w_z_p_bz(ctx, dec); // -> st1w_z_p_bz_d_x32_unscaled\n\tif(msz==3) return st1d_z_p_bz(ctx, dec); // -> st1d_z_p_bz_d_x32_unscaled\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_b16f32_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>4)&1;\n\tif(!S && HasSME()) return bfmopa_za32_pp_zz(ctx, dec); // -> bfmopa_za32_pp_zz_\n\tif(S && HasSME()) return bfmops_za32_pp_zz(ctx, dec); // -> bfmops_za32_pp_zz_\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_f16f32_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>4)&1;\n\tif(!S && HasSME()) return fmopa_za32_pp_zz(ctx, dec); // -> fmopa_za32_pp_zz_16\n\tif(S && HasSME()) return fmops_za32_pp_zz(ctx, dec); // -> fmops_za32_pp_zz_16\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_f32f32_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>4)&1;\n\tif(!S && HasSME()) return fmopa_za_pp_zz(ctx, dec); // -> fmopa_za_pp_zz_32\n\tif(S && HasSME()) return fmops_za_pp_zz(ctx, dec); // -> fmops_za_pp_zz_32\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_i8i32_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t u0=(INSWORD>>24)&1, u1=(INSWORD>>21)&1, S=(INSWORD>>4)&1;\n\tif(!u0 && !u1 && !S && HasSME()) return smopa_za_pp_zz(ctx, dec); // -> smopa_za_pp_zz_32\n\tif(!u0 && !u1 && S && HasSME()) return smops_za_pp_zz(ctx, dec); // -> smops_za_pp_zz_32\n\tif(!u0 && u1 && !S && HasSME()) return sumopa_za_pp_zz(ctx, dec); // -> sumopa_za_pp_zz_32\n\tif(!u0 && u1 && S && HasSME()) return sumops_za_pp_zz(ctx, dec); // -> sumops_za_pp_zz_32\n\tif(u0 && !u1 && !S && HasSME()) return usmopa_za_pp_zz(ctx, dec); // -> usmopa_za_pp_zz_32\n\tif(u0 && !u1 && S && HasSME()) return usmops_za_pp_zz(ctx, dec); // -> usmops_za_pp_zz_32\n\tif(u0 && u1 && !S && HasSME()) return umopa_za_pp_zz(ctx, dec); // -> umopa_za_pp_zz_32\n\tif(u0 && u1 && S && HasSME()) return umops_za_pp_zz(ctx, dec); // -> umops_za_pp_zz_32\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_f64f64_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t S=(INSWORD>>4)&1;\n\tif(!S && HasSME_F64F64()) return fmopa_za_pp_zz(ctx, dec); // -> fmopa_za_pp_zz_64\n\tif(S && HasSME_F64F64()) return fmops_za_pp_zz(ctx, dec); // -> fmops_za_pp_zz_64\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_i16i64_prod(context *ctx, Instruction *dec)\n{\n\tuint32_t u0=(INSWORD>>24)&1, u1=(INSWORD>>21)&1, S=(INSWORD>>4)&1;\n\tif(!u0 && !u1 && !S && HasSME_I16I64()) return smopa_za_pp_zz(ctx, dec); // -> smopa_za_pp_zz_64\n\tif(!u0 && !u1 && S && HasSME_I16I64()) return smops_za_pp_zz(ctx, dec); // -> smops_za_pp_zz_64\n\tif(!u0 && u1 && !S && HasSME_I16I64()) return sumopa_za_pp_zz(ctx, dec); // -> sumopa_za_pp_zz_64\n\tif(!u0 && u1 && S && HasSME_I16I64()) return sumops_za_pp_zz(ctx, dec); // -> sumops_za_pp_zz_64\n\tif(u0 && !u1 && !S && HasSME_I16I64()) return usmopa_za_pp_zz(ctx, dec); // -> usmopa_za_pp_zz_64\n\tif(u0 && !u1 && S && HasSME_I16I64()) return usmops_za_pp_zz(ctx, dec); // -> usmops_za_pp_zz_64\n\tif(u0 && u1 && !S && HasSME_I16I64()) return umopa_za_pp_zz(ctx, dec); // -> umopa_za_pp_zz_64\n\tif(u0 && u1 && S && HasSME_I16I64()) return umops_za_pp_zz(ctx, dec); // -> umops_za_pp_zz_64\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_insert_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, Q=(INSWORD>>16)&1;\n\tif(!size && !Q && HasSME()) return mova_za_p_rz(ctx, dec); // -> mova_za_p_rz_b\n\tif(size==1 && !Q && HasSME()) return mova_za_p_rz(ctx, dec); // -> mova_za_p_rz_h\n\tif(size==2 && !Q && HasSME()) return mova_za_p_rz(ctx, dec); // -> mova_za_p_rz_w\n\tif(size==2 && Q) UNALLOCATED(ENC_UNALLOCATED_313);\n\tif(size==3 && !Q && HasSME()) return mova_za_p_rz(ctx, dec); // -> mova_za_p_rz_d\n\tif(size==3 && Q && HasSME()) return mova_za_p_rz(ctx, dec); // -> mova_za_p_rz_q\n\tif(!(size&2) && Q) UNALLOCATED(ENC_UNALLOCATED_311);\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_extract_pred(context *ctx, Instruction *dec)\n{\n\tuint32_t size=(INSWORD>>22)&3, Q=(INSWORD>>16)&1;\n\tif(!size && !Q && HasSME()) return mova_z_p_rza(ctx, dec); // -> mova_z_p_rza_b\n\tif(size==1 && !Q && HasSME()) return mova_z_p_rza(ctx, dec); // -> mova_z_p_rza_h\n\tif(size==2 && !Q && HasSME()) return mova_z_p_rza(ctx, dec); // -> mova_z_p_rza_w\n\tif(size==2 && Q) UNALLOCATED(ENC_UNALLOCATED_314);\n\tif(size==3 && !Q && HasSME()) return mova_z_p_rza(ctx, dec); // -> mova_z_p_rza_d\n\tif(size==3 && Q && HasSME()) return mova_z_p_rza(ctx, dec); // -> mova_z_p_rza_q\n\tif(!(size&2) && Q) UNALLOCATED(ENC_UNALLOCATED_312);\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_zero(context *ctx, Instruction *dec)\n{\n\treturn zero_za_i(ctx, dec);\n}\n\nint decode_iclass_mortlach_addhv(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>22)&1, V=(INSWORD>>16)&1, opc2=INSWORD&7;\n\tif(!op && !V && !(opc2&4) && HasSME()) return addha_za_pp_z(ctx, dec); // -> addha_za_pp_z_32\n\tif(!op && V && !(opc2&4) && HasSME()) return addva_za_pp_z(ctx, dec); // -> addva_za_pp_z_32\n\tif(!op && (opc2&4)==4) UNALLOCATED(ENC_UNALLOCATED_315);\n\tif(op && !V && HasSME_I16I64()) return addha_za_pp_z(ctx, dec); // -> addha_za_pp_z_64\n\tif(op && V && HasSME_I16I64()) return addva_za_pp_z(ctx, dec); // -> addva_za_pp_z_64\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_contig_load(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>22)&3;\n\tif(!msz && HasSME()) return ld1b_za_p_rrr(ctx, dec); // -> ld1b_za_p_rrr_\n\tif(msz==1 && HasSME()) return ld1h_za_p_rrr(ctx, dec); // -> ld1h_za_p_rrr_\n\tif(msz==2 && HasSME()) return ld1w_za_p_rrr(ctx, dec); // -> ld1w_za_p_rrr_\n\tif(msz==3 && HasSME()) return ld1d_za_p_rrr(ctx, dec); // -> ld1d_za_p_rrr_\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_contig_qload(context *ctx, Instruction *dec)\n{\n\treturn ld1q_za_p_rrr(ctx, dec);\n}\n\nint decode_iclass_mortlach_ctxt_ldst(context *ctx, Instruction *dec)\n{\n\tuint32_t op=(INSWORD>>21)&1;\n\tif(!op && HasSME()) return ldr_za_ri(ctx, dec); // -> ldr_za_ri_\n\tif(op && HasSME()) return str_za_ri(ctx, dec); // -> str_za_ri_\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_contig_store(context *ctx, Instruction *dec)\n{\n\tuint32_t msz=(INSWORD>>22)&3;\n\tif(!msz && HasSME()) return st1b_za_p_rrr(ctx, dec); // -> st1b_za_p_rrr_\n\tif(msz==1 && HasSME()) return st1h_za_p_rrr(ctx, dec); // -> st1h_za_p_rrr_\n\tif(msz==2 && HasSME()) return st1w_za_p_rrr(ctx, dec); // -> st1w_za_p_rrr_\n\tif(msz==3 && HasSME()) return st1d_za_p_rrr(ctx, dec); // -> st1d_za_p_rrr_\n\tUNMATCHED;\n}\n\nint decode_iclass_mortlach_contig_qstore(context *ctx, Instruction *dec)\n{\n\treturn st1q_za_p_rrr(ctx, dec);\n}\n\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode1.h",
    "content": "/* GENERATED FILE */\n#pragma once\nint decode_iclass_barriers(context *ctx, Instruction *dec);\nint decode_iclass_compbranch(context *ctx, Instruction *dec);\nint decode_iclass_condbranch(context *ctx, Instruction *dec);\nint decode_iclass_exception(context *ctx, Instruction *dec);\nint decode_iclass_hints(context *ctx, Instruction *dec);\nint decode_iclass_pstate(context *ctx, Instruction *dec);\nint decode_iclass_systeminstrs(context *ctx, Instruction *dec);\nint decode_iclass_systeminstrswithreg(context *ctx, Instruction *dec);\nint decode_iclass_systemmove(context *ctx, Instruction *dec);\nint decode_iclass_systemresult(context *ctx, Instruction *dec);\nint decode_iclass_testbranch(context *ctx, Instruction *dec);\nint decode_iclass_branch_imm(context *ctx, Instruction *dec);\nint decode_iclass_branch_reg(context *ctx, Instruction *dec);\nint decode_iclass_asisdlse(context *ctx, Instruction *dec);\nint decode_iclass_asisdlsep(context *ctx, Instruction *dec);\nint decode_iclass_asisdlso(context *ctx, Instruction *dec);\nint decode_iclass_asisdlsop(context *ctx, Instruction *dec);\nint decode_iclass_memop(context *ctx, Instruction *dec);\nint decode_iclass_comswap(context *ctx, Instruction *dec);\nint decode_iclass_comswappr(context *ctx, Instruction *dec);\nint decode_iclass_ldapstl_unscaled(context *ctx, Instruction *dec);\nint decode_iclass_loadlit(context *ctx, Instruction *dec);\nint decode_iclass_ldstexclp(context *ctx, Instruction *dec);\nint decode_iclass_ldstexclr(context *ctx, Instruction *dec);\nint decode_iclass_ldsttags(context *ctx, Instruction *dec);\nint decode_iclass_ldstnapair_offs(context *ctx, Instruction *dec);\nint decode_iclass_ldstord(context *ctx, Instruction *dec);\nint decode_iclass_ldst_immpost(context *ctx, Instruction *dec);\nint decode_iclass_ldst_immpre(context *ctx, Instruction *dec);\nint decode_iclass_ldst_pac(context *ctx, Instruction *dec);\nint decode_iclass_ldst_regoff(context *ctx, Instruction *dec);\nint decode_iclass_ldst_unpriv(context *ctx, Instruction *dec);\nint decode_iclass_ldst_unscaled(context *ctx, Instruction *dec);\nint decode_iclass_ldst_pos(context *ctx, Instruction *dec);\nint decode_iclass_ldstpair_off(context *ctx, Instruction *dec);\nint decode_iclass_ldstpair_post(context *ctx, Instruction *dec);\nint decode_iclass_ldstpair_pre(context *ctx, Instruction *dec);\nint decode_iclass_addsub_imm(context *ctx, Instruction *dec);\nint decode_iclass_addsub_immtags(context *ctx, Instruction *dec);\nint decode_iclass_bitfield(context *ctx, Instruction *dec);\nint decode_iclass_extract(context *ctx, Instruction *dec);\nint decode_iclass_log_imm(context *ctx, Instruction *dec);\nint decode_iclass_movewide(context *ctx, Instruction *dec);\nint decode_iclass_pcreladdr(context *ctx, Instruction *dec);\nint decode_iclass_addsub_ext(context *ctx, Instruction *dec);\nint decode_iclass_addsub_shift(context *ctx, Instruction *dec);\nint decode_iclass_addsub_carry(context *ctx, Instruction *dec);\nint decode_iclass_condcmp_imm(context *ctx, Instruction *dec);\nint decode_iclass_condcmp_reg(context *ctx, Instruction *dec);\nint decode_iclass_condsel(context *ctx, Instruction *dec);\nint decode_iclass_dp_1src(context *ctx, Instruction *dec);\nint decode_iclass_dp_2src(context *ctx, Instruction *dec);\nint decode_iclass_dp_3src(context *ctx, Instruction *dec);\nint decode_iclass_setf(context *ctx, Instruction *dec);\nint decode_iclass_log_shift(context *ctx, Instruction *dec);\nint decode_iclass_rmif(context *ctx, Instruction *dec);\nint decode_iclass_asimdall(context *ctx, Instruction *dec);\nint decode_iclass_asimdins(context *ctx, Instruction *dec);\nint decode_iclass_asimdext(context *ctx, Instruction *dec);\nint decode_iclass_asimdimm(context *ctx, Instruction *dec);\nint decode_iclass_asimdperm(context *ctx, Instruction *dec);\nint decode_iclass_asisdone(context *ctx, Instruction *dec);\nint decode_iclass_asisdpair(context *ctx, Instruction *dec);\nint decode_iclass_asisdshf(context *ctx, Instruction *dec);\nint decode_iclass_asisddiff(context *ctx, Instruction *dec);\nint decode_iclass_asisdsame(context *ctx, Instruction *dec);\nint decode_iclass_asisdsamefp16(context *ctx, Instruction *dec);\nint decode_iclass_asisdsame2(context *ctx, Instruction *dec);\nint decode_iclass_asisdmisc(context *ctx, Instruction *dec);\nint decode_iclass_asisdmiscfp16(context *ctx, Instruction *dec);\nint decode_iclass_asisdelem(context *ctx, Instruction *dec);\nint decode_iclass_asimdshf(context *ctx, Instruction *dec);\nint decode_iclass_asimdtbl(context *ctx, Instruction *dec);\nint decode_iclass_asimddiff(context *ctx, Instruction *dec);\nint decode_iclass_asimdsame(context *ctx, Instruction *dec);\nint decode_iclass_asimdsamefp16(context *ctx, Instruction *dec);\nint decode_iclass_asimdsame2(context *ctx, Instruction *dec);\nint decode_iclass_asimdmisc(context *ctx, Instruction *dec);\nint decode_iclass_asimdmiscfp16(context *ctx, Instruction *dec);\nint decode_iclass_asimdelem(context *ctx, Instruction *dec);\nint decode_iclass_float2fix(context *ctx, Instruction *dec);\nint decode_iclass_float2int(context *ctx, Instruction *dec);\nint decode_iclass_cryptoaes(context *ctx, Instruction *dec);\nint decode_iclass_crypto4(context *ctx, Instruction *dec);\nint decode_iclass_cryptosha3(context *ctx, Instruction *dec);\nint decode_iclass_cryptosha512_3(context *ctx, Instruction *dec);\nint decode_iclass_crypto3_imm2(context *ctx, Instruction *dec);\nint decode_iclass_crypto3_imm6(context *ctx, Instruction *dec);\nint decode_iclass_cryptosha2(context *ctx, Instruction *dec);\nint decode_iclass_cryptosha512_2(context *ctx, Instruction *dec);\nint decode_iclass_floatcmp(context *ctx, Instruction *dec);\nint decode_iclass_floatccmp(context *ctx, Instruction *dec);\nint decode_iclass_floatsel(context *ctx, Instruction *dec);\nint decode_iclass_floatdp1(context *ctx, Instruction *dec);\nint decode_iclass_floatdp2(context *ctx, Instruction *dec);\nint decode_iclass_floatdp3(context *ctx, Instruction *dec);\nint decode_iclass_floatimm(context *ctx, Instruction *dec);\nint decode_iclass_perm_undef(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_log(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_arit_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_div(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_arit_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_arit_2(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_reduce_2(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_movprfx_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_reduce_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_reduce_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_shift_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_shift_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_pred_shift_2(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_un_pred_arit_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_un_pred_arit_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_mlas_vvv_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_mladdsub_vvv_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_arit_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_log(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_tern_log(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_rotate_imm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_index_ii(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_index_ir(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_index_ri(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_index_rr(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_arith_vl(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_read_vl_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_mul_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_sqdmulh(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_shift_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_shift_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_misc_0_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_misc_0_d(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_misc_0_c(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_bin_cons_misc_0_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_count(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pred_pattern_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_countvlv1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pred_pattern_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_countvlv0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_extract_i(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_perm_extract_i(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_bin_long_perm_zz(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_log_imm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_dup_mask_imm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_dup_fpimm_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_dup_imm_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_dup_i(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_tbl_3src(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_tbl(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_dup_r(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_insrv(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_insrs(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_reverse_z(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_unpk(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_bin_perm_pp(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_reverse_p(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_punpk(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_bin_perm_zz(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_compact(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_clast_zz(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_clast_vz(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_clast_rz(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_cpy_v(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_cpy_r(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_last_v(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_last_r(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_revd(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_rev(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_perm_splice(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_perm_splice(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_sel_vvv(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_cmp_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_cmp_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_ucmp_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pred_log(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_brkp(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_break(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_brkn(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pfirst(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_ptrue(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pnext(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_rdffr(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_rdffr_2(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_ptest(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pfalse(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_scmp_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pcount_pred(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_count_r(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_count_v(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_count_r_sat(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_count_v_sat(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_setffr(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_wrffr(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_cterm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_while_rr(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_whilenc(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_pred_dup(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_dup_fpimm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_dup_imm(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_arith_imm0(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_arith_imm1(context *ctx, Instruction *dec);\nint decode_iclass_sve_int_arith_imm2(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_dot(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mixed_dot(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cdot(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cmla(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mlal_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qdmlal_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qrdmlah(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qdmlalbt(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_pred_arith_binary(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_accumulate_long_pairs(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_arith_binary_pairs(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_pred_arith_unary(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_pred_arith_binary_sat(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_bin_pred_shift_sat_round(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_clamp(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_dot_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mixed_dot_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cdot_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cmla_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qrdcmla_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mul_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mul_long_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mla_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mla_long_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qdmulh_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qdmul_long_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qdmla_long_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_qrdmlah_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cons_arith_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cons_arith_wide(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cons_mul_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_mmla(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_eorx(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_perm_bit(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_shift_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_clong(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_shift_insert(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_sra(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_cadd(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_aba(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_aba_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_adc_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_shift_narrow(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_arith_narrow(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_extract_narrow(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_match(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_histseg(context *ctx, Instruction *dec);\nint decode_iclass_sve_intx_histcnt(context *ctx, Instruction *dec);\nint decode_iclass_sve_crypto_binary_const(context *ctx, Instruction *dec);\nint decode_iclass_sve_crypto_binary_dest(context *ctx, Instruction *dec);\nint decode_iclass_sve_crypto_unary(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fcadd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fcvt2(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_pairwise(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fcmla(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fma_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fcmla_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fmul_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fdot_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fma_long_by_indexed_elem(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fdot(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fma_long(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fmmla(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_fast_red(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_u_zd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_pd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_vd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_3op_u_zd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zds(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_i_p_zds(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_ftmad(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zd_b_0(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zd_d(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zd_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zd_b_1(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_2op_p_zd_c(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_3op_p_pd(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_3op_p_zds_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_fp_3op_p_zds_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_gld_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_gld_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_gld_sv_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_gld_sv_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_prfm_sv(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_prfm_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_prfm_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_prfm_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_ld_dup(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_pfill(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_fill(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_32b_gldnt_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cldff_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cld_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cld_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cldnf_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cldnt_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cldnt_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_ldqr_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_ldqr_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_eld_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_eld_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gld_sv(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gld_sv2(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gld_vs2(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gld_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gld_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_prfm_sv2(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_prfm_sv(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_prfm_vi(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_64b_gldnt_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cst_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_pspill(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_spill(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cstnt_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_est_ss(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sstnt_32b_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sstnt_64b_vs(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_vi_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_sv2(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_vs2(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_vi_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cstnt_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_cst_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_est_si(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_sv_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_vs_b(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_sv_a(context *ctx, Instruction *dec);\nint decode_iclass_sve_mem_sst_vs_a(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_b16f32_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_f16f32_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_f32f32_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_i8i32_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_f64f64_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_i16i64_prod(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_insert_pred(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_extract_pred(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_zero(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_addhv(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_contig_load(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_contig_qload(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_ctxt_ldst(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_contig_store(context *ctx, Instruction *dec);\nint decode_iclass_mortlach_contig_qstore(context *ctx, Instruction *dec);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode2.c",
    "content": "/* GENERATED FILE */\n#include <stdint.h>\n#include <stddef.h>\n#include <stdbool.h>\n\n#include \"decode.h\"\n#include \"decode2.h\"\n#include \"pcode.h\"\n#include \"decode_fields32.h\"\n\n/* abs_advsimd.xml */\nint ABS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E20B800) {\n\t\tdecode_fields32(ENC_ABS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_ABS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE20B800) {\n\t\tdecode_fields32(ENC_ABS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_ABS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* adc.xml */\nint ADC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=0|S=0|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1A000000) {\n\t\tdecode_fields32(ENC_ADC_32_ADDSUB_CARRY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->sf==0) OK(ENC_ADC_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_ADC_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* adcs.xml */\nint ADCS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x3A000000) {\n\t\tdecode_fields32(ENC_ADCS_32_ADDSUB_CARRY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->sf==0) OK(ENC_ADCS_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_ADCS_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* addg.xml */\nint ADDG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|op=0|S=0|100011|o2=0|uimm6=xxxxxx|op3=(0)(0)|uimm4=xxxx|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x91800000) {\n\t\tdecode_fields32(ENC_ADDG_64_ADDSUB_IMMTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->tag_offset = ctx->uimm4;\n\t\tctx->offset = LSL(ZeroExtend(ctx->uimm6,0x40),LOG2_TAG_GRANULE);\n\t\tctx->ADD = TRUE;\n\t\tOK(ENC_ADDG_64_ADDSUB_IMMTAGS);\n\t}\n\treturn rc;\n}\n\n/* addhn_advsimd.xml */\nint ADDHN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE204000) {\n\t\tdecode_fields32(ENC_ADDHN_ASIMDDIFF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->round = (ctx->U==1);\n\t\tOK(ENC_ADDHN_ASIMDDIFF_N);\n\t}\n\treturn rc;\n}\n\n/* addp_advsimd_pair.xml */\nint ADDP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01|U=0|11110|size=xx|11000|opcode=11011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E31B800) {\n\t\tdecode_fields32(ENC_ADDP_ASISDPAIR_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = ReduceOp_ADD;\n\t\tOK(ENC_ADDP_ASISDPAIR_ONLY);\n\t}\n\treturn rc;\n}\n\n/* addp_advsimd_vec.xml */\nint ADDP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20BC00) {\n\t\tdecode_fields32(ENC_ADDP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_ADDP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* adds_addsub_ext.xml */\nint ADDS_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00000)==0x2B200000) {\n\t\tdecode_fields32(ENC_ADDS_32S_ADDSUB_EXT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = UINT(ctx->imm3);\n\t\tif(ctx->shift>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMN_ADDS_addsub_ext(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ADDS_32S_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_ADDS_64S_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* adds_addsub_imm.xml */\nint ADDS_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x31000000) {\n\t\tdecode_fields32(ENC_ADDS_32S_ADDSUB_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(!ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(ctx->imm12,ctx->datasize);\n\t\t}\n\t\telse if(ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(((ctx->imm12<<12)|0),ctx->datasize);\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMN_ADDS_addsub_imm(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ADDS_32S_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_ADDS_64S_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* adds_addsub_shift.xml */\nint ADDS_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x2B000000) {\n\t\tdecode_fields32(ENC_ADDS_32_ADDSUB_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->shift==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMN_ADDS_addsub_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ADDS_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_ADDS_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* addv_advsimd.xml */\nint ADDV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=0|01110|size=xx|11000|opcode=11011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE31B800) {\n\t\tdecode_fields32(ENC_ADDV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = ReduceOp_ADD;\n\t\tOK(ENC_ADDV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* add_addsub_ext.xml */\nint ADD_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=0|S=0|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00000)==0xB200000) {\n\t\tdecode_fields32(ENC_ADD_32_ADDSUB_EXT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = UINT(ctx->imm3);\n\t\tif(ctx->shift>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0) OK(ENC_ADD_32_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_ADD_64_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* add_addsub_imm.xml */\nint ADD_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=0|S=0|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x11000000) {\n\t\tdecode_fields32(ENC_ADD_32_ADDSUB_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(!ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(ctx->imm12,ctx->datasize);\n\t\t}\n\t\telse if(ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(((ctx->imm12<<12)|0),ctx->datasize);\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->sh==0 && ctx->imm12==0 && (ctx->Rd==0x1f || ctx->Rn==0x1f)) return MOV_ADD_addsub_imm(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ADD_32_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_ADD_64_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* add_addsub_shift.xml */\nint ADD_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=0|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0xB000000) {\n\t\tdecode_fields32(ENC_ADD_32_ADDSUB_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->shift==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tif(ctx->sf==0) OK(ENC_ADD_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_ADD_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* add_advsimd.xml */\nint ADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E208400) {\n\t\tdecode_fields32(ENC_ADD_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_ADD_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE208400) {\n\t\tdecode_fields32(ENC_ADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_ADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* adr.xml */\nint ADR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* op=0|immlo=xx|10000|immhi=xxxxxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x9F000000)==0x10000000) {\n\t\tdecode_fields32(ENC_ADR_ONLY_PCRELADDR, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->page = (ctx->op==1);\n\t\tif(ctx->page) {\n\t\t\tctx->imm = SignExtend(((ctx->immhi<<14)|(ctx->immlo<<12)|0),33);\n\t\t}\n\t\telse {\n\t\t\tctx->imm = SignExtend(((ctx->immhi<<2)|ctx->immlo),21);\n\t\t}\n\t\tOK(ENC_ADR_ONLY_PCRELADDR);\n\t}\n\treturn rc;\n}\n\n/* adrp.xml */\nint ADRP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* op=1|immlo=xx|10000|immhi=xxxxxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x9F000000)==0x90000000) {\n\t\tdecode_fields32(ENC_ADRP_ONLY_PCRELADDR, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->page = (ctx->op==1);\n\t\tif(ctx->page) {\n\t\t\tctx->imm = SignExtend(((ctx->immhi<<14)|(ctx->immlo<<12)|0),33);\n\t\t}\n\t\telse {\n\t\t\tctx->imm = SignExtend(((ctx->immhi<<2)|ctx->immlo),21);\n\t\t}\n\t\tOK(ENC_ADRP_ONLY_PCRELADDR);\n\t}\n\treturn rc;\n}\n\n/* aesd_advsimd.xml */\nint AESD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01001110|size=00|10100|opcode[4:1]=0010|D=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4E285800) {\n\t\tdecode_fields32(ENC_AESD_B_CRYPTOAES, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveAESExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->decrypt = (ctx->D==1);\n\t\tOK(ENC_AESD_B_CRYPTOAES);\n\t}\n\treturn rc;\n}\n\n/* aese_advsimd.xml */\nint AESE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01001110|size=00|10100|opcode[4:1]=0010|D=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4E284800) {\n\t\tdecode_fields32(ENC_AESE_B_CRYPTOAES, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveAESExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->decrypt = (ctx->D==1);\n\t\tOK(ENC_AESE_B_CRYPTOAES);\n\t}\n\treturn rc;\n}\n\n/* aesimc_advsimd.xml */\nint AESIMC_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01001110|size=00|10100|opcode[4:1]=0011|D=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4E287800) {\n\t\tdecode_fields32(ENC_AESIMC_B_CRYPTOAES, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveAESExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->decrypt = (ctx->D==1);\n\t\tOK(ENC_AESIMC_B_CRYPTOAES);\n\t}\n\treturn rc;\n}\n\n/* aesmc_advsimd.xml */\nint AESMC_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01001110|size=00|10100|opcode[4:1]=0011|D=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4E286800) {\n\t\tdecode_fields32(ENC_AESMC_B_CRYPTOAES, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveAESExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->decrypt = (ctx->D==1);\n\t\tOK(ENC_AESMC_B_CRYPTOAES);\n\t}\n\treturn rc;\n}\n\n/* ands_log_imm.xml */\nint ANDS_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|opc=11|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x72000000) {\n\t\tdecode_fields32(ENC_ANDS_32S_LOG_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->N!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tDecodeBitMasksCheckUndefined(ctx->N,ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->imm = dbmrt.wmask;\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return TST_ANDS_log_imm(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_ANDS_32S_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_ANDS_64S_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* ands_log_shift.xml */\nint ANDS_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|opc=11|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x6A000000) {\n\t\tdecode_fields32(ENC_ANDS_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return TST_ANDS_log_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ANDS_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_ANDS_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* and_advsimd.xml */\nint AND_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=00|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE201C00) {\n\t\tdecode_fields32(ENC_AND_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->invert = (SLICE(ctx->size,0,0)==1);\n\t\tctx->op = (SLICE(ctx->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;\n\t\tOK(ENC_AND_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* and_log_imm.xml */\nint AND_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=00|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x12000000) {\n\t\tdecode_fields32(ENC_AND_32_LOG_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->N!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tDecodeBitMasksCheckUndefined(ctx->N,ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->imm = dbmrt.wmask;\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_AND_32_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_AND_64_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* and_log_shift.xml */\nint AND_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=00|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0xA000000) {\n\t\tdecode_fields32(ENC_AND_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\tif(ctx->sf==0) OK(ENC_AND_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_AND_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* asrv.xml */\nint ASRV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02800) {\n\t\tdecode_fields32(ENC_ASRV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->shift_type = DecodeShift(ctx->op2);\n\t\t/* unconditional alias */\n\t\tif(ASR_ASRV(ctx, instr)==0) return 0;\n\t\tif(ctx->sf==0) OK(ENC_ASRV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_ASRV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* asr_asrv.xml */\nint ASR_ASRV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02800) {\n\t\tdecode_fields32(ENC_ASR_ASRV_32_DP_2SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ASR_ASRV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_ASR_ASRV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* asr_sbfm.xml */\nint ASR_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=x11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F807C00)==0x13007C00) {\n\t\tdecode_fields32(ENC_ASR_SBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0 && ctx->imms==0x1f) OK(ENC_ASR_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1 && ctx->imms==0x3f) OK(ENC_ASR_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* at_sys.xml */\nint AT_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=100x|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF8FE00)==0xD5087800) {\n\t\tdecode_fields32(ENC_AT_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_AT_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* autda.xml */\nint AUTDA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=110|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC11800) {\n\t\tdecode_fields32(ENC_AUTDA_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_AUTDA_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_AUTDZA_64Z_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* autdb.xml */\nint AUTDB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC11C00) {\n\t\tdecode_fields32(ENC_AUTDB_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_AUTDB_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_AUTDZB_64Z_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* autia.xml */\nint AUTIA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=100|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC11000) {\n\t\tdecode_fields32(ENC_AUTIA_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_AUTIA_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_AUTIZA_64Z_DP_1SRC);\n\t}\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=10x|Rt=11111 */\n\tif((INSWORD & 0xFFFFFDDF)==0xD503219F) {\n\t\tdecode_fields32(ENC_AUTIA1716_HI_HINTS, ctx, instr);\n\t\tif(ctx->CRm==1 && ctx->op2==4) OK(ENC_AUTIA1716_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==5) OK(ENC_AUTIASP_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==4) OK(ENC_AUTIAZ_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* autib.xml */\nint AUTIB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=101|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC11400) {\n\t\tdecode_fields32(ENC_AUTIB_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_AUTIB_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_AUTIZB_64Z_DP_1SRC);\n\t}\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=11x|Rt=11111 */\n\tif((INSWORD & 0xFFFFFDDF)==0xD50321DF) {\n\t\tdecode_fields32(ENC_AUTIB1716_HI_HINTS, ctx, instr);\n\t\tif(ctx->CRm==1 && ctx->op2==6) OK(ENC_AUTIB1716_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==7) OK(ENC_AUTIBSP_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==6) OK(ENC_AUTIBZ_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* axflag.xml */\nint AXFLAG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=010|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD500405F) {\n\t\tdecode_fields32(ENC_AXFLAG_M_PSTATE, ctx, instr);\n\t\tif(!HaveFlagFormatExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_AXFLAG_M_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* bcax_advsimd.xml */\nint BCAX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 110011100|Op0=01|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0xCE200000) {\n\t\tdecode_fields32(ENC_BCAX_VVV16_CRYPTO4, ctx, instr);\n\t\tif(!HaveSHA3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tOK(ENC_BCAX_VVV16_CRYPTO4);\n\t}\n\treturn rc;\n}\n\n/* bfcvtn_advsimd.xml */\nint BFCVTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_bf16 */\n\t/* 0|Q=x|U=0|01110|size=10|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEA16800) {\n\t\tdecode_fields32(ENC_BFCVTN_ASIMDMISC_4S, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((0x10) ? ((0x40) / (0x10)) : 0);\n\t\tOK(ENC_BFCVTN_ASIMDMISC_4S);\n\t}\n\treturn rc;\n}\n\n/* bfcvt_float.xml */\nint BFCVT_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single_to_bf16 */\n\t/* M=0|0|S=0|11110|ptype=01|1|opcode=000110|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x1E634000) {\n\t\tdecode_fields32(ENC_BFCVT_BS_FLOATDP1, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_BFCVT_BS_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* bfc_bfm.xml */\nint BFC_BFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_nofill */\n\t/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7F8003E0)==0x330003E0) {\n\t\tdecode_fields32(ENC_BFC_BFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_BFC_BFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_BFC_BFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* bfdot_advsimd_elt.xml */\nint BFDOT_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=01|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF40F000) {\n\t\tdecode_fields32(ENC_BFDOT_ASIMDELEM_E, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->i = UINT(((ctx->H<<1)|ctx->L));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((0x20) ? ((ctx->datasize) / (0x20)) : 0);\n\t\tOK(ENC_BFDOT_ASIMDELEM_E);\n\t}\n\treturn rc;\n}\n\n/* bfdot_advsimd_vec.xml */\nint BFDOT_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=01|0|Rm=xxxxx|1|opcode=1111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E40FC00) {\n\t\tdecode_fields32(ENC_BFDOT_ASIMDSAME2_D, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((0x20) ? ((ctx->datasize) / (0x20)) : 0);\n\t\tOK(ENC_BFDOT_ASIMDSAME2_D);\n\t}\n\treturn rc;\n}\n\n/* bfi_bfm.xml */\nint BFI_BFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_nofill */\n\t/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn!=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x33000000 && (INSWORD & 0x3E0)!=0x3E0) {\n\t\tdecode_fields32(ENC_BFI_BFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_BFI_BFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_BFI_BFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* bfm.xml */\nint BFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_nofill */\n\t/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x33000000) {\n\t\tdecode_fields32(ENC_BFM_32M_BITFIELD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = TRUE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->inzero = FALSE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==1 && ctx->N!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && (ctx->N!=0 || SLICE(ctx->immr,5,5)!=0 || SLICE(ctx->imms,5,5)!=0)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->R = UINT(ctx->immr);\n\t\tctx->S = UINT(ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->wmask = dbmrt.wmask;\n\t\tctx->tmask = dbmrt.tmask;\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f && UINT(ctx->imms)<UINT(ctx->immr)) return BFC_BFM(ctx, instr);\n\t\tif(ctx->Rn!=0x1f && UINT(ctx->imms)<UINT(ctx->immr)) return BFI_BFM(ctx, instr);\n\t\tif((UINT(ctx->imms)) >= (UINT(ctx->immr))) return BFXIL_BFM(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_BFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_BFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* bfmlal_advsimd_elt.xml */\nint BFMLAL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=11|L=x|M=x|Rm=xxxx|opcode[3]=1|opcode[2]=1|opcode[1:0]=11|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xFC0F000) {\n\t\tdecode_fields32(ENC_BFMLAL_ASIMDELEM_F, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->elements = ((0x20) ? ((0x80) / (0x20)) : 0);\n\t\tctx->sel = UINT(ctx->Q);\n\t\tOK(ENC_BFMLAL_ASIMDELEM_F);\n\t}\n\treturn rc;\n}\n\n/* bfmlal_advsimd_vec.xml */\nint BFMLAL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=11|0|Rm=xxxxx|1|opcode<3:2>=11|opcode=11|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC0FC00) {\n\t\tdecode_fields32(ENC_BFMLAL_ASIMDSAME2_F_, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->elements = ((0x20) ? ((0x80) / (0x20)) : 0);\n\t\tctx->sel = UINT(ctx->Q);\n\t\tOK(ENC_BFMLAL_ASIMDSAME2_F_);\n\t}\n\treturn rc;\n}\n\n/* bfmmla_advsimd.xml */\nint BFMMLA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=1|U=1|01110|size=01|0|Rm=xxxxx|1|opcode=1101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x6E40EC00) {\n\t\tdecode_fields32(ENC_BFMMLA_ASIMDSAME2_E, ctx, instr);\n\t\tif(!HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_BFMMLA_ASIMDSAME2_E);\n\t}\n\treturn rc;\n}\n\n/* bfxil_bfm.xml */\nint BFXIL_BFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_nofill */\n\t/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x33000000) {\n\t\tdecode_fields32(ENC_BFXIL_BFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_BFXIL_BFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_BFXIL_BFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* bics.xml */\nint BICS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|opc=11|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x6A200000) {\n\t\tdecode_fields32(ENC_BICS_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\tif(ctx->sf==0) OK(ENC_BICS_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_BICS_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* bic_advsimd_imm.xml */\nint BIC_advsimd_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_shifted_immediate */\n\t/* 0|Q=x|op=1|0111100000|a=x|b=x|c=x|cmode=xxx1|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0xBFF81C00)==0x2F001400) {\n\t\tdecode_fields32(ENC_BIC_ASIMDIMM_L_HL, ctx, instr);\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tif(!(((ctx->cmode<<1)|ctx->op)&0x13)) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==1) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==2) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==3) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x10) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x11) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x12) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x13) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x18) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x19) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1e)==0x1c) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1e) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1f) {\n\t\t\tif(ctx->Q==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\tctx->imm64 = AdvSIMDExpandImm(ctx->op,ctx->cmode,((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h));\n\t\tctx->imm = Replicate(ctx->imm64, ((0x40) ? ((ctx->datasize) / (0x40)) : 0), 64);\n\t\tif((ctx->cmode&13)==9) OK(ENC_BIC_ASIMDIMM_L_HL);\n\t\tif((ctx->cmode&9)==1) OK(ENC_BIC_ASIMDIMM_L_SL);\n\t}\n\treturn rc;\n}\n\n/* bic_advsimd_reg.xml */\nint BIC_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=01|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE601C00) {\n\t\tdecode_fields32(ENC_BIC_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->invert = (SLICE(ctx->size,0,0)==1);\n\t\tctx->op = (SLICE(ctx->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;\n\t\tOK(ENC_BIC_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* bic_and_z_zi.xml */\nint BIC_and_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=10|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5800000) {\n\t\tdecode_fields32(ENC_BIC_AND_Z_ZI_, ctx, instr);\n\t\tOK(ENC_BIC_AND_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* bic_log_shift.xml */\nint BIC_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=00|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0xA200000) {\n\t\tdecode_fields32(ENC_BIC_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\tif(ctx->sf==0) OK(ENC_BIC_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_BIC_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* bif_advsimd.xml */\nint BIF_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|opc2=11|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EE01C00) {\n\t\tdecode_fields32(ENC_BIF_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!ctx->opc2) {\n\t\t\tctx->op = VBitOp_VEOR;\n\t\t}\n\t\telse if(ctx->opc2==1) {\n\t\t\tctx->op = VBitOp_VBSL;\n\t\t}\n\t\telse if(ctx->opc2==2) {\n\t\t\tctx->op = VBitOp_VBIT;\n\t\t}\n\t\telse if(ctx->opc2==3) {\n\t\t\tctx->op = VBitOp_VBIF;\n\t\t}\n\t\tOK(ENC_BIF_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* bit_advsimd.xml */\nint BIT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|opc2=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EA01C00) {\n\t\tdecode_fields32(ENC_BIT_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!ctx->opc2) {\n\t\t\tctx->op = VBitOp_VEOR;\n\t\t}\n\t\telse if(ctx->opc2==1) {\n\t\t\tctx->op = VBitOp_VBSL;\n\t\t}\n\t\telse if(ctx->opc2==2) {\n\t\t\tctx->op = VBitOp_VBIT;\n\t\t}\n\t\telse if(ctx->opc2==3) {\n\t\t\tctx->op = VBitOp_VBIF;\n\t\t}\n\t\tOK(ENC_BIT_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* bl.xml */\nint BL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br26 */\n\t/* op=1|00101|imm26=xxxxxxxxxxxxxxxxxxxxxxxxxx */\n\tif((INSWORD & 0xFC000000)==0x94000000) {\n\t\tdecode_fields32(ENC_BL_ONLY_BRANCH_IMM, ctx, instr);\n\t\tctx->branch_type = (ctx->op==1) ? BranchType_DIRCALL : BranchType_DIR;\n\t\tctx->offset = SignExtend((ctx->imm26<<2),28);\n\t\tOK(ENC_BL_ONLY_BRANCH_IMM);\n\t}\n\treturn rc;\n}\n\n/* blr.xml */\nint BLR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=0|opc[2:1]=0|op=01|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */\n\tif((INSWORD & 0xFFFFFC1F)==0xD63F0000) {\n\t\tdecode_fields32(ENC_BLR_64_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tOK(ENC_BLR_64_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* blra.xml */\nint BLRA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=x|opc[2:1]=0|op=01|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=xxxxx|Rm=xxxxx */\n\tif((INSWORD & 0xFEFFF800)==0xD63F0800) {\n\t\tdecode_fields32(ENC_BLRAAZ_64_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0 && ctx->M==0 && ctx->Rm==0x1f) OK(ENC_BLRAAZ_64_BRANCH_REG);\n\t\tif(ctx->Z==1 && ctx->M==0) OK(ENC_BLRAA_64P_BRANCH_REG);\n\t\tif(ctx->Z==0 && ctx->M==1 && ctx->Rm==0x1f) OK(ENC_BLRABZ_64_BRANCH_REG);\n\t\tif(ctx->Z==1 && ctx->M==1) OK(ENC_BLRAB_64P_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* br.xml */\nint BR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=0|opc[2:1]=0|op=00|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */\n\tif((INSWORD & 0xFFFFFC1F)==0xD61F0000) {\n\t\tdecode_fields32(ENC_BR_64_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tOK(ENC_BR_64_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* bra.xml */\nint BRA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=x|opc[2:1]=0|op=00|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=xxxxx|Rm=xxxxx */\n\tif((INSWORD & 0xFEFFF800)==0xD61F0800) {\n\t\tdecode_fields32(ENC_BRAAZ_64_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0 && ctx->M==0 && ctx->Rm==0x1f) OK(ENC_BRAAZ_64_BRANCH_REG);\n\t\tif(ctx->Z==1 && ctx->M==0) OK(ENC_BRAA_64P_BRANCH_REG);\n\t\tif(ctx->Z==0 && ctx->M==1 && ctx->Rm==0x1f) OK(ENC_BRABZ_64_BRANCH_REG);\n\t\tif(ctx->Z==1 && ctx->M==1) OK(ENC_BRAB_64P_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* brk.xml */\nint BRK(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=001|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=00 */\n\tif((INSWORD & 0xFFE0001F)==0xD4200000) {\n\t\tdecode_fields32(ENC_BRK_EX_EXCEPTION, ctx, instr);\n\t\tctx->comment = ctx->imm16;\n\t\tif(HaveBTIExt()) {\n\t\t\tSetBTypeCompatible(TRUE);\n\t\t}\n\t\tOK(ENC_BRK_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* bsl_advsimd.xml */\nint BSL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|opc2=01|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E601C00) {\n\t\tdecode_fields32(ENC_BSL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!ctx->opc2) {\n\t\t\tctx->op = VBitOp_VEOR;\n\t\t}\n\t\telse if(ctx->opc2==1) {\n\t\t\tctx->op = VBitOp_VBSL;\n\t\t}\n\t\telse if(ctx->opc2==2) {\n\t\t\tctx->op = VBitOp_VBIT;\n\t\t}\n\t\telse if(ctx->opc2==3) {\n\t\t\tctx->op = VBitOp_VBIF;\n\t\t}\n\t\tOK(ENC_BSL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* bti.xml */\nint BTI(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0100|op2=xx0|Rt=11111 */\n\tif((INSWORD & 0xFFFFFF3F)==0xD503241F) {\n\t\tdecode_fields32(ENC_BTI_HB_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_BTI_HB_HINTS);\n\t}\n\treturn rc;\n}\n\n/* b_cond.xml */\nint B_cond(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br19 */\n\t/* 0101010|o1=0|imm19=xxxxxxxxxxxxxxxxxxx|o0=0|cond=xxxx */\n\tif((INSWORD & 0xFF000010)==0x54000000) {\n\t\tdecode_fields32(ENC_B_ONLY_CONDBRANCH, ctx, instr);\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tctx->condition = ctx->cond;\n\t\tOK(ENC_B_ONLY_CONDBRANCH);\n\t}\n\treturn rc;\n}\n\n/* b_uncond.xml */\nint B_uncond(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br26 */\n\t/* op=0|00101|imm26=xxxxxxxxxxxxxxxxxxxxxxxxxx */\n\tif((INSWORD & 0xFC000000)==0x14000000) {\n\t\tdecode_fields32(ENC_B_ONLY_BRANCH_IMM, ctx, instr);\n\t\tctx->branch_type = (ctx->op==1) ? BranchType_DIRCALL : BranchType_DIR;\n\t\tctx->offset = SignExtend((ctx->imm26<<2),28);\n\t\tOK(ENC_B_ONLY_BRANCH_IMM);\n\t}\n\treturn rc;\n}\n\n/* cas.xml */\nint CAS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|0010001|L=x|1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFA07C00)==0x88A07C00) {\n\t\tdecode_fields32(ENC_CAS_C32_COMSWAP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2 && ctx->L==0 && ctx->o0==0) OK(ENC_CAS_C32_COMSWAP);\n\t\tif(ctx->size==2 && ctx->L==1 && ctx->o0==0) OK(ENC_CASA_C32_COMSWAP);\n\t\tif(ctx->size==2 && ctx->L==1 && ctx->o0==1) OK(ENC_CASAL_C32_COMSWAP);\n\t\tif(ctx->size==2 && ctx->L==0 && ctx->o0==1) OK(ENC_CASL_C32_COMSWAP);\n\t\tif(ctx->size==3 && ctx->L==0 && ctx->o0==0) OK(ENC_CAS_C64_COMSWAP);\n\t\tif(ctx->size==3 && ctx->L==1 && ctx->o0==0) OK(ENC_CASA_C64_COMSWAP);\n\t\tif(ctx->size==3 && ctx->L==1 && ctx->o0==1) OK(ENC_CASAL_C64_COMSWAP);\n\t\tif(ctx->size==3 && ctx->L==0 && ctx->o0==1) OK(ENC_CASL_C64_COMSWAP);\n\t}\n\treturn rc;\n}\n\n/* casb.xml */\nint CASB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|0010001|L=x|1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA07C00)==0x8A07C00) {\n\t\tdecode_fields32(ENC_CASAB_C32_COMSWAP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->L==1 && ctx->o0==0) OK(ENC_CASAB_C32_COMSWAP);\n\t\tif(ctx->L==1 && ctx->o0==1) OK(ENC_CASALB_C32_COMSWAP);\n\t\tif(ctx->L==0 && ctx->o0==0) OK(ENC_CASB_C32_COMSWAP);\n\t\tif(ctx->L==0 && ctx->o0==1) OK(ENC_CASLB_C32_COMSWAP);\n\t}\n\treturn rc;\n}\n\n/* cash.xml */\nint CASH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|0010001|L=x|1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA07C00)==0x48A07C00) {\n\t\tdecode_fields32(ENC_CASAH_C32_COMSWAP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->L==1 && ctx->o0==0) OK(ENC_CASAH_C32_COMSWAP);\n\t\tif(ctx->L==1 && ctx->o0==1) OK(ENC_CASALH_C32_COMSWAP);\n\t\tif(ctx->L==0 && ctx->o0==0) OK(ENC_CASH_C32_COMSWAP);\n\t\tif(ctx->L==0 && ctx->o0==1) OK(ENC_CASLH_C32_COMSWAP);\n\t}\n\treturn rc;\n}\n\n/* casp.xml */\nint CASP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* 0|sz=x|001000|o2=0|L=x|o1=1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFA07C00)==0x8207C00) {\n\t\tdecode_fields32(ENC_CASP_CP32_COMSWAPPR, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rs,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rt,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (0x20) << (UINT(ctx->sz));\n\t\tctx->regsize = ctx->datasize;\n\t\tctx->ldacctype = (ctx->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->sz==0 && ctx->L==0 && ctx->o0==0) OK(ENC_CASP_CP32_COMSWAPPR);\n\t\tif(ctx->sz==0 && ctx->L==1 && ctx->o0==0) OK(ENC_CASPA_CP32_COMSWAPPR);\n\t\tif(ctx->sz==0 && ctx->L==1 && ctx->o0==1) OK(ENC_CASPAL_CP32_COMSWAPPR);\n\t\tif(ctx->sz==0 && ctx->L==0 && ctx->o0==1) OK(ENC_CASPL_CP32_COMSWAPPR);\n\t\tif(ctx->sz==1 && ctx->L==0 && ctx->o0==0) OK(ENC_CASP_CP64_COMSWAPPR);\n\t\tif(ctx->sz==1 && ctx->L==1 && ctx->o0==0) OK(ENC_CASPA_CP64_COMSWAPPR);\n\t\tif(ctx->sz==1 && ctx->L==1 && ctx->o0==1) OK(ENC_CASPAL_CP64_COMSWAPPR);\n\t\tif(ctx->sz==1 && ctx->L==0 && ctx->o0==1) OK(ENC_CASPL_CP64_COMSWAPPR);\n\t}\n\treturn rc;\n}\n\n/* cbnz.xml */\nint CBNZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br19 */\n\t/* sf=x|011010|op=1|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7F000000)==0x35000000) {\n\t\tdecode_fields32(ENC_CBNZ_32_COMPBRANCH, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->iszero = (ctx->op==0);\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tif(ctx->sf==0) OK(ENC_CBNZ_32_COMPBRANCH);\n\t\tif(ctx->sf==1) OK(ENC_CBNZ_64_COMPBRANCH);\n\t}\n\treturn rc;\n}\n\n/* cbz.xml */\nint CBZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br19 */\n\t/* sf=x|011010|op=0|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7F000000)==0x34000000) {\n\t\tdecode_fields32(ENC_CBZ_32_COMPBRANCH, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->iszero = (ctx->op==0);\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tif(ctx->sf==0) OK(ENC_CBZ_32_COMPBRANCH);\n\t\tif(ctx->sf==1) OK(ENC_CBZ_64_COMPBRANCH);\n\t}\n\treturn rc;\n}\n\n/* ccmn_imm.xml */\nint CCMN_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm5u */\n\t/* sf=x|op=0|S=1|11010010|imm5=xxxxx|cond=xxxx|1|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */\n\tif((INSWORD & 0x7FE00C10)==0x3A400800) {\n\t\tdecode_fields32(ENC_CCMN_32_CONDCMP_IMM, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tctx->imm = ZeroExtend(ctx->imm5,ctx->datasize);\n\t\tif(ctx->sf==0) OK(ENC_CCMN_32_CONDCMP_IMM);\n\t\tif(ctx->sf==1) OK(ENC_CCMN_64_CONDCMP_IMM);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_NORMAL;\n\treturn rc;\n}\n\n/* ccmn_reg.xml */\nint CCMN_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=1|11010010|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */\n\tif((INSWORD & 0x7FE00C10)==0x3A400000) {\n\t\tdecode_fields32(ENC_CCMN_32_CONDCMP_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tif(ctx->sf==0) OK(ENC_CCMN_32_CONDCMP_REG);\n\t\tif(ctx->sf==1) OK(ENC_CCMN_64_CONDCMP_REG);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_NORMAL;\n\treturn rc;\n}\n\n/* ccmp_imm.xml */\nint CCMP_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm5u */\n\t/* sf=x|op=1|S=1|11010010|imm5=xxxxx|cond=xxxx|1|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */\n\tif((INSWORD & 0x7FE00C10)==0x7A400800) {\n\t\tdecode_fields32(ENC_CCMP_32_CONDCMP_IMM, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tctx->imm = ZeroExtend(ctx->imm5,ctx->datasize);\n\t\tif(ctx->sf==0) OK(ENC_CCMP_32_CONDCMP_IMM);\n\t\tif(ctx->sf==1) OK(ENC_CCMP_64_CONDCMP_IMM);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_NORMAL;\n\treturn rc;\n}\n\n/* ccmp_reg.xml */\nint CCMP_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=1|11010010|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */\n\tif((INSWORD & 0x7FE00C10)==0x7A400000) {\n\t\tdecode_fields32(ENC_CCMP_32_CONDCMP_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tif(ctx->sf==0) OK(ENC_CCMP_32_CONDCMP_REG);\n\t\tif(ctx->sf==1) OK(ENC_CCMP_64_CONDCMP_REG);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_NORMAL;\n\treturn rc;\n}\n\n/* cfinv.xml */\nint CFINV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0[1]=0|op0[0]=0|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=000|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD500401F) {\n\t\tdecode_fields32(ENC_CFINV_M_PSTATE, ctx, instr);\n\t\tif(!HaveFlagManipulateExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_CFINV_M_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* cfp_sys.xml */\nint CFP_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=100|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD50B7380) {\n\t\tdecode_fields32(ENC_CFP_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_CFP_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* cinc_csinc.xml */\nint CINC_CSINC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010100|Rm!=11111|cond!=111x|op2[1]=0|o2=1|Rn!=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x1A800400 && (INSWORD & 0x1FE3E0)!=0x1FE3E0) {\n\t\tdecode_fields32(ENC_CINC_CSINC_32_CONDSEL, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CINC_CSINC_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CINC_CSINC_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* cinv_csinv.xml */\nint CINV_CSINV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=0|11010100|Rm!=11111|cond!=111x|op2[1]=0|o2=0|Rn!=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x5A800000 && (INSWORD & 0x1FE3E0)!=0x1FE3E0) {\n\t\tdecode_fields32(ENC_CINV_CSINV_32_CONDSEL, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CINV_CSINV_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CINV_CSINV_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* clrex.xml */\nint CLREX(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|op2=010|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD503305F) {\n\t\tdecode_fields32(ENC_CLREX_BN_BARRIERS, ctx, instr);\n\t\tOK(ENC_CLREX_BN_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* cls_advsimd.xml */\nint CLS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE204800) {\n\t\tdecode_fields32(ENC_CLS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->countop = (ctx->U==1) ? CountOp_CLZ : CountOp_CLS;\n\t\tOK(ENC_CLS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* cls_int.xml */\nint CLS_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:1]=00010|op=1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFFC00)==0x5AC01400) {\n\t\tdecode_fields32(ENC_CLS_32_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->opcode = (ctx->op==0) ? CountOp_CLZ : CountOp_CLS;\n\t\tif(ctx->sf==0) OK(ENC_CLS_32_DP_1SRC);\n\t\tif(ctx->sf==1) OK(ENC_CLS_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* clz_advsimd.xml */\nint CLZ_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E204800) {\n\t\tdecode_fields32(ENC_CLZ_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->countop = (ctx->U==1) ? CountOp_CLZ : CountOp_CLS;\n\t\tOK(ENC_CLZ_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* clz_int.xml */\nint CLZ_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:1]=00010|op=0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFFC00)==0x5AC01000) {\n\t\tdecode_fields32(ENC_CLZ_32_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->opcode = (ctx->op==0) ? CountOp_CLZ : CountOp_CLS;\n\t\tif(ctx->sf==0) OK(ENC_CLZ_32_DP_1SRC);\n\t\tif(ctx->sf==1) OK(ENC_CLZ_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* cmeq_advsimd_reg.xml */\nint CMEQ_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E208C00) {\n\t\tdecode_fields32(ENC_CMEQ_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->and_test = (ctx->U==0);\n\t\tOK(ENC_CMEQ_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E208C00) {\n\t\tdecode_fields32(ENC_CMEQ_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->and_test = (ctx->U==0);\n\t\tOK(ENC_CMEQ_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cmeq_advsimd_zero.xml */\nint CMEQ_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode[4:1]=0100|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E209800) {\n\t\tdecode_fields32(ENC_CMEQ_ASISDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMEQ_ASISDMISC_Z);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:1]=0100|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE209800) {\n\t\tdecode_fields32(ENC_CMEQ_ASIMDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMEQ_ASIMDMISC_Z);\n\t}\n\treturn rc;\n}\n\n/* cmge_advsimd_reg.xml */\nint CMGE_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E203C00) {\n\t\tdecode_fields32(ENC_CMGE_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMGE_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE203C00) {\n\t\tdecode_fields32(ENC_CMGE_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMGE_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cmge_advsimd_zero.xml */\nint CMGE_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode[4:1]=0100|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E208800) {\n\t\tdecode_fields32(ENC_CMGE_ASISDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMGE_ASISDMISC_Z);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode[4:1]=0100|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E208800) {\n\t\tdecode_fields32(ENC_CMGE_ASIMDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMGE_ASIMDMISC_Z);\n\t}\n\treturn rc;\n}\n\n/* cmgt_advsimd_reg.xml */\nint CMGT_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E203400) {\n\t\tdecode_fields32(ENC_CMGT_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMGT_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE203400) {\n\t\tdecode_fields32(ENC_CMGT_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMGT_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cmgt_advsimd_zero.xml */\nint CMGT_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode[4:1]=0100|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E208800) {\n\t\tdecode_fields32(ENC_CMGT_ASISDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMGT_ASISDMISC_Z);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:1]=0100|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE208800) {\n\t\tdecode_fields32(ENC_CMGT_ASIMDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMGT_ASIMDMISC_Z);\n\t}\n\treturn rc;\n}\n\n/* cmhi_advsimd.xml */\nint CMHI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E203400) {\n\t\tdecode_fields32(ENC_CMHI_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMHI_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E203400) {\n\t\tdecode_fields32(ENC_CMHI_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMHI_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cmhs_advsimd.xml */\nint CMHS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E203C00) {\n\t\tdecode_fields32(ENC_CMHS_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMHS_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E203C00) {\n\t\tdecode_fields32(ENC_CMHS_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->cmp_eq = (ctx->eq==1);\n\t\tOK(ENC_CMHS_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cmle_advsimd.xml */\nint CMLE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode[4:1]=0100|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E209800) {\n\t\tdecode_fields32(ENC_CMLE_ASISDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMLE_ASISDMISC_Z);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode[4:1]=0100|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E209800) {\n\t\tdecode_fields32(ENC_CMLE_ASIMDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_CMLE_ASIMDMISC_Z);\n\t}\n\treturn rc;\n}\n\n/* cmlt_advsimd.xml */\nint CMLT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode=01010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E20A800) {\n\t\tdecode_fields32(ENC_CMLT_ASISDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_CMLT_ASISDMISC_Z);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=01010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE20A800) {\n\t\tdecode_fields32(ENC_CMLT_ASIMDMISC_Z, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_CMLT_ASIMDMISC_Z);\n\t}\n\treturn rc;\n}\n\n/* cmn_adds_addsub_ext.xml */\nint CMN_ADDS_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7FE0001F)==0x2B20001F) {\n\t\tdecode_fields32(ENC_CMN_ADDS_32S_ADDSUB_EXT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMN_ADDS_32S_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_CMN_ADDS_64S_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* cmn_adds_addsub_imm.xml */\nint CMN_ADDS_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F80001F)==0x3100001F) {\n\t\tdecode_fields32(ENC_CMN_ADDS_32S_ADDSUB_IMM, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMN_ADDS_32S_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_CMN_ADDS_64S_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* cmn_adds_addsub_shift.xml */\nint CMN_ADDS_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=0|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F20001F)==0x2B00001F) {\n\t\tdecode_fields32(ENC_CMN_ADDS_32_ADDSUB_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMN_ADDS_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_CMN_ADDS_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* cmple_cmpeq_p_p_zz.xml */\nint CMPLE_cmpeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_ge */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24008000) {\n\t\tdecode_fields32(ENC_CMPLE_CMPGE_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_CMPLE_CMPGE_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cmplo_cmpeq_p_p_zz.xml */\nint CMPLO_cmpeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_hi */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24000010) {\n\t\tdecode_fields32(ENC_CMPLO_CMPHI_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_CMPLO_CMPHI_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cmpls_cmpeq_p_p_zz.xml */\nint CMPLS_cmpeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_hs */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24000000) {\n\t\tdecode_fields32(ENC_CMPLS_CMPHS_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_CMPLS_CMPHS_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cmplt_cmpeq_p_p_zz.xml */\nint CMPLT_cmpeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_gt */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24008010) {\n\t\tdecode_fields32(ENC_CMPLT_CMPGT_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_CMPLT_CMPGT_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cmpp_subps.xml */\nint CMPP_SUBPS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|0|S=1|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=11111 */\n\tif((INSWORD & 0xFFE0FC1F)==0xBAC0001F) {\n\t\tdecode_fields32(ENC_CMPP_SUBPS_64S_DP_2SRC, ctx, instr);\n\t\tOK(ENC_CMPP_SUBPS_64S_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* cmp_subs_addsub_ext.xml */\nint CMP_SUBS_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7FE0001F)==0x6B20001F) {\n\t\tdecode_fields32(ENC_CMP_SUBS_32S_ADDSUB_EXT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMP_SUBS_32S_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_CMP_SUBS_64S_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* cmp_subs_addsub_imm.xml */\nint CMP_SUBS_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F80001F)==0x7100001F) {\n\t\tdecode_fields32(ENC_CMP_SUBS_32S_ADDSUB_IMM, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMP_SUBS_32S_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_CMP_SUBS_64S_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* cmp_subs_addsub_shift.xml */\nint CMP_SUBS_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F20001F)==0x6B00001F) {\n\t\tdecode_fields32(ENC_CMP_SUBS_32_ADDSUB_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CMP_SUBS_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_CMP_SUBS_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* cmtst_advsimd.xml */\nint CMTST_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E208C00) {\n\t\tdecode_fields32(ENC_CMTST_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->and_test = (ctx->U==0);\n\t\tOK(ENC_CMTST_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE208C00) {\n\t\tdecode_fields32(ENC_CMTST_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->and_test = (ctx->U==0);\n\t\tOK(ENC_CMTST_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* cneg_csneg.xml */\nint CNEG_CSNEG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond!=111x|op2[1]=0|o2=1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x5A800400 && (INSWORD & 0xE000)!=0xE000) {\n\t\tdecode_fields32(ENC_CNEG_CSNEG_32_CONDSEL, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CNEG_CSNEG_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CNEG_CSNEG_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* cnt_advsimd.xml */\nint CNT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE205800) {\n\t\tdecode_fields32(ENC_CNT_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((8) ? ((ctx->datasize) / (8)) : 0);\n\t\tOK(ENC_CNT_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* cpp_sys.xml */\nint CPP_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=111|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD50B73E0) {\n\t\tdecode_fields32(ENC_CPP_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_CPP_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* crc32.xml */\nint CRC32(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_crc */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:3]=010|C=0|sz=xx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0F000)==0x1AC04000) {\n\t\tdecode_fields32(ENC_CRC32B_32C_DP_2SRC, ctx, instr);\n\t\tif(!HaveCRCExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sf==1 && ctx->sz!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->sz==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->size = (8) << (UINT(ctx->sz));\n\t\tctx->crc32c = (ctx->C==1);\n\t\tif(ctx->sf==0 && ctx->sz==0) OK(ENC_CRC32B_32C_DP_2SRC);\n\t\tif(ctx->sf==0 && ctx->sz==1) OK(ENC_CRC32H_32C_DP_2SRC);\n\t\tif(ctx->sf==0 && ctx->sz==2) OK(ENC_CRC32W_32C_DP_2SRC);\n\t\tif(ctx->sf==1 && ctx->sz==3) OK(ENC_CRC32X_64C_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* crc32c.xml */\nint CRC32C(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_crc */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:3]=010|C=1|sz=xx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0F000)==0x1AC05000) {\n\t\tdecode_fields32(ENC_CRC32CB_32C_DP_2SRC, ctx, instr);\n\t\tif(!HaveCRCExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sf==1 && ctx->sz!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->sz==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->size = (8) << (UINT(ctx->sz));\n\t\tctx->crc32c = (ctx->C==1);\n\t\tif(ctx->sf==0 && ctx->sz==0) OK(ENC_CRC32CB_32C_DP_2SRC);\n\t\tif(ctx->sf==0 && ctx->sz==1) OK(ENC_CRC32CH_32C_DP_2SRC);\n\t\tif(ctx->sf==0 && ctx->sz==2) OK(ENC_CRC32CW_32C_DP_2SRC);\n\t\tif(ctx->sf==1 && ctx->sz==3) OK(ENC_CRC32CX_64C_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* csdb.xml */\nint CSDB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=100|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503229F) {\n\t\tdecode_fields32(ENC_CSDB_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_CSDB_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* csel.xml */\nint CSEL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010100|Rm=xxxxx|cond=xxxx|op2[1]=0|o2=0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x1A800000) {\n\t\tdecode_fields32(ENC_CSEL_32_CONDSEL, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->condition = ctx->cond;\n\t\tctx->else_inv = (ctx->op==1);\n\t\tctx->else_inc = (ctx->o2==1);\n\t\tif(ctx->sf==0) OK(ENC_CSEL_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSEL_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* csetm_csinv.xml */\nint CSETM_CSINV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=0|11010100|Rm=11111|cond!=111x|op2[1]=0|o2=0|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FFF0FE0)==0x5A9F03E0 && (INSWORD & 0xE000)!=0xE000) {\n\t\tdecode_fields32(ENC_CSETM_CSINV_32_CONDSEL, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CSETM_CSINV_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSETM_CSINV_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* cset_csinc.xml */\nint CSET_CSINC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010100|Rm=11111|cond!=111x|op2[1]=0|o2=1|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FFF0FE0)==0x1A9F07E0 && (INSWORD & 0xE000)!=0xE000) {\n\t\tdecode_fields32(ENC_CSET_CSINC_32_CONDSEL, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CSET_CSINC_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSET_CSINC_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* csinc.xml */\nint CSINC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010100|Rm=xxxxx|cond=xxxx|op2[1]=0|o2=1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x1A800400) {\n\t\tdecode_fields32(ENC_CSINC_32_CONDSEL, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->condition = ctx->cond;\n\t\tctx->else_inv = (ctx->op==1);\n\t\tctx->else_inc = (ctx->o2==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Rm!=0x1f && (ctx->cond&14)!=14 && ctx->Rn!=0x1f && ctx->Rn==ctx->Rm) return CINC_CSINC(ctx, instr);\n\t\tif(ctx->Rm==0x1f && (ctx->cond&14)!=14 && ctx->Rn==0x1f) return CSET_CSINC(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CSINC_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSINC_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* csinv.xml */\nint CSINV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond=xxxx|op2[1]=0|o2=0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x5A800000) {\n\t\tdecode_fields32(ENC_CSINV_32_CONDSEL, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->condition = ctx->cond;\n\t\tctx->else_inv = (ctx->op==1);\n\t\tctx->else_inc = (ctx->o2==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Rm!=0x1f && (ctx->cond&14)!=14 && ctx->Rn!=0x1f && ctx->Rn==ctx->Rm) return CINV_CSINV(ctx, instr);\n\t\tif(ctx->Rm==0x1f && (ctx->cond&14)!=14 && ctx->Rn==0x1f) return CSETM_CSINV(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CSINV_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSINV_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* csneg.xml */\nint CSNEG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond=xxxx|op2[1]=0|o2=1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00C00)==0x5A800400) {\n\t\tdecode_fields32(ENC_CSNEG_32_CONDSEL, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->condition = ctx->cond;\n\t\tctx->else_inv = (ctx->op==1);\n\t\tctx->else_inc = (ctx->o2==1);\n\t\t/* regular aliases */\n\t\tif((ctx->cond&14)!=14 && ctx->Rn==ctx->Rm) return CNEG_CSNEG(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_CSNEG_32_CONDSEL);\n\t\tif(ctx->sf==1) OK(ENC_CSNEG_64_CONDSEL);\n\t}\n\treturn rc;\n}\n\n/* dcps1.xml */\nint DCPS1(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=01 */\n\tif((INSWORD & 0xFFE0001F)==0xD4A00001) {\n\t\tdecode_fields32(ENC_DCPS1_DC_EXCEPTION, ctx, instr);\n\t\tctx->target_level = ctx->LL;\n\t\tif(ctx->LL==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* if(!Halted()) { UNDEFINED; } */\n\t\tOK(ENC_DCPS1_DC_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* dcps2.xml */\nint DCPS2(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=10 */\n\tif((INSWORD & 0xFFE0001F)==0xD4A00002) {\n\t\tdecode_fields32(ENC_DCPS2_DC_EXCEPTION, ctx, instr);\n\t\tctx->target_level = ctx->LL;\n\t\tif(ctx->LL==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* if(!Halted()) { UNDEFINED; } */\n\t\tOK(ENC_DCPS2_DC_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* dcps3.xml */\nint DCPS3(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=11 */\n\tif((INSWORD & 0xFFE0001F)==0xD4A00003) {\n\t\tdecode_fields32(ENC_DCPS3_DC_EXCEPTION, ctx, instr);\n\t\tctx->target_level = ctx->LL;\n\t\tif(ctx->LL==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* if(!Halted()) { UNDEFINED; } */\n\t\tOK(ENC_DCPS3_DC_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* dc_sys.xml */\nint DC_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF8F000)==0xD5087000) {\n\t\tdecode_fields32(ENC_DC_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_DC_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* dgh.xml */\nint DGH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=110|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD50320DF) {\n\t\tdecode_fields32(ENC_DGH_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_DGH_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* dmb.xml */\nint DMB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|op2[2]=1|opc=01|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD50330BF) {\n\t\tdecode_fields32(ENC_DMB_BO_BARRIERS, ctx, instr);\n\t\tif(!SLICE(ctx->CRm,3,2)) {\n\t\t\tctx->domain = MBReqDomain_OuterShareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==1) {\n\t\t\tctx->domain = MBReqDomain_Nonshareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==2) {\n\t\t\tctx->domain = MBReqDomain_InnerShareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==3) {\n\t\t\tctx->domain = MBReqDomain_FullSystem;\n\t\t}\n\t\tif(!SLICE(ctx->CRm,1,0)) {\n\t\t\tctx->types = MBReqTypes_All;\n\t\t\tctx->domain = MBReqDomain_FullSystem;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==1) {\n\t\t\tctx->types = MBReqTypes_Reads;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==2) {\n\t\t\tctx->types = MBReqTypes_Writes;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==3) {\n\t\t\tctx->types = MBReqTypes_All;\n\t\t}\n\t\tOK(ENC_DMB_BO_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* drps.xml */\nint DRPS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101011|opc=0101|op2=11111|op3=000000|Rt=11111|op4=00000 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD6BF03E0) {\n\t\tdecode_fields32(ENC_DRPS_64E_BRANCH_REG, ctx, instr);\n\t\t/* if(!Halted() || ctx->pstate_el==EL0) { UNDEFINED; } */\n\t\tOK(ENC_DRPS_64E_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* dsb.xml */\nint DSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_dsb_memory */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|op2[2]=1|opc=00|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD503309F) {\n\t\tdecode_fields32(ENC_DSB_BO_BARRIERS, ctx, instr);\n\t\tctx->nXS = FALSE;\n\t\tif(!ctx->CRm) {\n\t\t\tctx->alias = DSBAlias_SSBB;\n\t\t}\n\t\telse if(ctx->CRm==4) {\n\t\t\tctx->alias = DSBAlias_PSSBB;\n\t\t}\n\t\telse {\n\t\t\tctx->alias = DSBAlias_DSB;\n\t\t}\n\t\tif(!SLICE(ctx->CRm,3,2)) {\n\t\t\tctx->domain = MBReqDomain_OuterShareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==1) {\n\t\t\tctx->domain = MBReqDomain_Nonshareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==2) {\n\t\t\tctx->domain = MBReqDomain_InnerShareable;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,3,2)==3) {\n\t\t\tctx->domain = MBReqDomain_FullSystem;\n\t\t}\n\t\tif(!SLICE(ctx->CRm,1,0)) {\n\t\t\tctx->types = MBReqTypes_All;\n\t\t\tctx->domain = MBReqDomain_FullSystem;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==1) {\n\t\t\tctx->types = MBReqTypes_Reads;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==2) {\n\t\t\tctx->types = MBReqTypes_Writes;\n\t\t}\n\t\telse if(SLICE(ctx->CRm,1,0)==3) {\n\t\t\tctx->types = MBReqTypes_All;\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->CRm==4) return PSSBB_DSB(ctx, instr);\n\t\tif(ctx->CRm==0) return SSBB_DSB(ctx, instr);\n\t\tOK(ENC_DSB_BO_BARRIERS);\n\t}\n\t/* class iclass_dsb_nxs */\n\t/* 11010101000000110011|imm2=xx|10|op2<2>=0|op2<1:0>=01|Rt=11111 */\n\tif((INSWORD & 0xFFFFF3FF)==0xD503323F) {\n\t\tdecode_fields32(ENC_DSB_BON_BARRIERS, ctx, instr);\n\t\tif(!HaveFeatXS()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->types = MBReqTypes_All;\n\t\tctx->nXS = TRUE;\n\t\tctx->alias = DSBAlias_DSB;\n\t\tif(!ctx->imm2) {\n\t\t\tctx->domain = MBReqDomain_OuterShareable;\n\t\t}\n\t\telse if(ctx->imm2==1) {\n\t\t\tctx->domain = MBReqDomain_Nonshareable;\n\t\t}\n\t\telse if(ctx->imm2==2) {\n\t\t\tctx->domain = MBReqDomain_InnerShareable;\n\t\t}\n\t\telse if(ctx->imm2==3) {\n\t\t\tctx->domain = MBReqDomain_FullSystem;\n\t\t}\n\t\t/* regular aliases */\n\t\t// alias:PSSBB_DSB with preference:[\"CRm == '0100'\"] does not apply\n\t\t// alias:SSBB_DSB with preference:[\"CRm == '0000'\"] does not apply\n\t\tOK(ENC_DSB_BON_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* dup_advsimd_elt.xml */\nint DUP_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_scalar_from_element */\n\t/* 01|op=0|11110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E000400) {\n\t\tdecode_fields32(ENC_DUP_ASISDONE_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->size = LowestSetBit(ctx->imm5);\n\t\tif(ctx->size>3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->idxdsize = (SLICE(ctx->imm5,4,4)==1) ? 0x80 : 0x40;\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\t/* unconditional alias */\n\t\tif(MOV_DUP_advsimd_elt(ctx, instr)==0) return 0;\n\t\tOK(ENC_DUP_ASISDONE_ONLY);\n\t}\n\t/* class iclass_vector_from_element */\n\t/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE000400) {\n\t\tdecode_fields32(ENC_DUP_ASIMDINS_DV_V, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->size = LowestSetBit(ctx->imm5);\n\t\tif(ctx->size>3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->idxdsize = (SLICE(ctx->imm5,4,4)==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==3 && ctx->Q==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\t/* unconditional alias */\n\t\tif(MOV_DUP_advsimd_elt(ctx, instr)==0) return 0;\n\t\tOK(ENC_DUP_ASIMDINS_DV_V);\n\t}\n\treturn rc;\n}\n\n/* dup_advsimd_gen.xml */\nint DUP_advsimd_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4=0001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE000C00) {\n\t\tdecode_fields32(ENC_DUP_ASIMDINS_DR_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->size = LowestSetBit(ctx->imm5);\n\t\tif(ctx->size>3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3 && ctx->Q==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_DUP_ASIMDINS_DR_R);\n\t}\n\treturn rc;\n}\n\n/* dvp_sys.xml */\nint DVP_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=101|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD50B73A0) {\n\t\tdecode_fields32(ENC_DVP_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_DVP_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* eon.xml */\nint EON(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=10|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x4A200000) {\n\t\tdecode_fields32(ENC_EON_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\tif(ctx->sf==0) OK(ENC_EON_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_EON_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* eon_eor_z_zi.xml */\nint EON_eor_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=01|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5400000) {\n\t\tdecode_fields32(ENC_EON_EOR_Z_ZI_, ctx, instr);\n\t\tOK(ENC_EON_EOR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* eor3_advsimd.xml */\nint EOR3_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 110011100|Op0=00|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0xCE000000) {\n\t\tdecode_fields32(ENC_EOR3_VVV16_CRYPTO4, ctx, instr);\n\t\tif(!HaveSHA3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tOK(ENC_EOR3_VVV16_CRYPTO4);\n\t}\n\treturn rc;\n}\n\n/* eor_advsimd.xml */\nint EOR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|opc2=00|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E201C00) {\n\t\tdecode_fields32(ENC_EOR_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!ctx->opc2) {\n\t\t\tctx->op = VBitOp_VEOR;\n\t\t}\n\t\telse if(ctx->opc2==1) {\n\t\t\tctx->op = VBitOp_VBSL;\n\t\t}\n\t\telse if(ctx->opc2==2) {\n\t\t\tctx->op = VBitOp_VBIT;\n\t\t}\n\t\telse if(ctx->opc2==3) {\n\t\t\tctx->op = VBitOp_VBIF;\n\t\t}\n\t\tOK(ENC_EOR_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* eor_log_imm.xml */\nint EOR_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=10|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x52000000) {\n\t\tdecode_fields32(ENC_EOR_32_LOG_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->N!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tDecodeBitMasksCheckUndefined(ctx->N,ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->imm = dbmrt.wmask;\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_EOR_32_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_EOR_64_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* eor_log_shift.xml */\nint EOR_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|opc=10|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x4A000000) {\n\t\tdecode_fields32(ENC_EOR_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\tif(ctx->sf==0) OK(ENC_EOR_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_EOR_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* eret.xml */\nint ERET(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101011|opc[3]=0|opc[2:0]=100|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=11111|op4=00000 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD69F03E0) {\n\t\tdecode_fields32(ENC_ERET_64E_BRANCH_REG, ctx, instr);\n\t\t/* if(ctx->pstate_el==EL0) { UNDEFINED; } */\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tif(!ctx->pac && ctx->op4!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && (!HavePACExt() || ctx->op4!=0x1f)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rn!=0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_ERET_64E_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* ereta.xml */\nint ERETA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|opc[3]=0|opc[2:0]=100|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=11111|op4=11111 */\n\tif((INSWORD & 0xFFFFFBFF)==0xD69F0BFF) {\n\t\tdecode_fields32(ENC_ERETAA_64E_BRANCH_REG, ctx, instr);\n\t\t/* if(ctx->pstate_el==EL0) { UNDEFINED; } */\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tif(!ctx->pac && ctx->op4!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && (!HavePACExt() || ctx->op4!=0x1f)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rn!=0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->M==0) OK(ENC_ERETAA_64E_BRANCH_REG);\n\t\tif(ctx->M==1) OK(ENC_ERETAB_64E_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* esb.xml */\nint ESB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=000|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503221F) {\n\t\tdecode_fields32(ENC_ESB_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_ESB_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* extr.xml */\nint EXTR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op21=00|100111|N=x|o0=0|Rm=xxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FA00000)==0x13800000) {\n\t\tdecode_fields32(ENC_EXTR_32_EXTRACT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(ctx->N!=ctx->sf) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imms,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->lsb = UINT(ctx->imms);\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==ctx->Rm) return ROR_EXTR(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0 && !(ctx->imms&0x20)) OK(ENC_EXTR_32_EXTRACT);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_EXTR_64_EXTRACT);\n\t}\n\treturn rc;\n}\n\n/* ext_advsimd.xml */\nint EXT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|101110|op2=00|0|Rm=xxxxx|0|imm4=xxxx|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE08400)==0x2E000000) {\n\t\tdecode_fields32(ENC_EXT_ASIMDEXT_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->Q==0 && SLICE(ctx->imm4,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->position = (UINT(ctx->imm4)) << (3);\n\t\tOK(ENC_EXT_ASIMDEXT_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fabd_advsimd.xml */\nint FABD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x7EC01400) {\n\t\tdecode_fields32(ENC_FABD_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->abs = TRUE;\n\t\tOK(ENC_FABD_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x7EA0D400) {\n\t\tdecode_fields32(ENC_FABD_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->abs = TRUE;\n\t\tOK(ENC_FABD_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC01400) {\n\t\tdecode_fields32(ENC_FABD_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->abs = (ctx->U==1);\n\t\tOK(ENC_FABD_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2EA0D400) {\n\t\tdecode_fields32(ENC_FABD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->abs = (ctx->U==1);\n\t\tOK(ENC_FABD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fabs_advsimd.xml */\nint FABS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=1|111100|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF8F800) {\n\t\tdecode_fields32(ENC_FABS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_FABS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA0F800) {\n\t\tdecode_fields32(ENC_FABS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_FABS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fabs_float.xml */\nint FABS_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:2]=0000|opc=01|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E20C000) {\n\t\tdecode_fields32(ENC_FABS_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->opc) {\n\t\t\tctx->fpop = FPUnaryOp_MOV;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->fpop = FPUnaryOp_ABS;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->fpop = FPUnaryOp_NEG;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->fpop = FPUnaryOp_SQRT;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FABS_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FABS_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FABS_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* facge_advsimd.xml */\nint FACGE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x7E402C00) {\n\t\tdecode_fields32(ENC_FACGE_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGE_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x7E20EC00) {\n\t\tdecode_fields32(ENC_FACGE_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGE_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E402C00) {\n\t\tdecode_fields32(ENC_FACGE_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGE_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20EC00) {\n\t\tdecode_fields32(ENC_FACGE_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGE_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* facgt_advsimd.xml */\nint FACGT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|E=1|10|Rm=xxxxx|00|opcode[2:1]=10|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x7EC02C00) {\n\t\tdecode_fields32(ENC_FACGT_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGT_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|E=1|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x7EA0EC00) {\n\t\tdecode_fields32(ENC_FACGT_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGT_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|E=1|10|Rm=xxxxx|00|opcode[2:1]=10|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC02C00) {\n\t\tdecode_fields32(ENC_FACGT_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGT_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|E=1|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2EA0EC00) {\n\t\tdecode_fields32(ENC_FACGT_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FACGT_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* facle_facge_p_p_zz.xml */\nint FACLE_facge_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_ge */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x6500C010) {\n\t\tdecode_fields32(ENC_FACLE_FACGE_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_FACLE_FACGE_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* faclt_facge_p_p_zz.xml */\nint FACLT_facge_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_gt */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=1|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x6500E010) {\n\t\tdecode_fields32(ENC_FACLT_FACGT_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_FACLT_FACGT_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* faddp_advsimd_pair.xml */\nint FADDP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|size[1]=0|sz=x|11000|opcode=01101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E30D800) {\n\t\tdecode_fields32(ENC_FADDP_ASISDPAIR_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = ReduceOp_FADD;\n\t\tOK(ENC_FADDP_ASISDPAIR_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=1|11110|size[1]=0|sz=x|11000|opcode=01101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E30D800) {\n\t\tdecode_fields32(ENC_FADDP_ASISDPAIR_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = ReduceOp_FADD;\n\t\tOK(ENC_FADDP_ASISDPAIR_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* faddp_advsimd_vec.xml */\nint FADDP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E401400) {\n\t\tdecode_fields32(ENC_FADDP_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tOK(ENC_FADDP_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20D400) {\n\t\tdecode_fields32(ENC_FADDP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tOK(ENC_FADDP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fadd_advsimd.xml */\nint FADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE401400) {\n\t\tdecode_fields32(ENC_FADD_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tOK(ENC_FADD_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20D400) {\n\t\tdecode_fields32(ENC_FADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tOK(ENC_FADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fadd_float.xml */\nint FADD_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:1]=001|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E202800) {\n\t\tdecode_fields32(ENC_FADD_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->sub_op = (ctx->op==1);\n\t\tif(ctx->ftype==3) OK(ENC_FADD_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FADD_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FADD_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fcadd_advsimd_vec.xml */\nint FCADD_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|11|rot=x|0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20EC00)==0x2E00E400) {\n\t\tdecode_fields32(ENC_FCADD_ASIMDSAME2_C, ctx, instr);\n\t\tif(!HaveFCADDExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Q==0 && ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tif(!HaveFP16Ext() && ctx->esize==0x10) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FCADD_ASIMDSAME2_C);\n\t}\n\treturn rc;\n}\n\n/* fccmpe_float.xml */\nint FCCMPE_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|01|Rn=xxxxx|op=1|nzcv=xxxx */\n\tif((INSWORD & 0xFF200C10)==0x1E200410) {\n\t\tdecode_fields32(ENC_FCCMPE_H_FLOATCCMP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->signal_all_nans = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tif(ctx->ftype==3) OK(ENC_FCCMPE_H_FLOATCCMP);\n\t\tif(ctx->ftype==0) OK(ENC_FCCMPE_S_FLOATCCMP);\n\t\tif(ctx->ftype==1) OK(ENC_FCCMPE_D_FLOATCCMP);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_FLOAT;\n\treturn rc;\n}\n\n/* fccmp_float.xml */\nint FCCMP_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|01|Rn=xxxxx|op=0|nzcv=xxxx */\n\tif((INSWORD & 0xFF200C10)==0x1E200400) {\n\t\tdecode_fields32(ENC_FCCMP_H_FLOATCCMP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->signal_all_nans = (ctx->op==1);\n\t\tctx->condition = ctx->cond;\n\t\tctx->flags = ctx->nzcv;\n\t\tif(ctx->ftype==3) OK(ENC_FCCMP_H_FLOATCCMP);\n\t\tif(ctx->ftype==0) OK(ENC_FCCMP_S_FLOATCCMP);\n\t\tif(ctx->ftype==1) OK(ENC_FCCMP_D_FLOATCCMP);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_FLOAT;\n\treturn rc;\n}\n\n/* fcmeq_advsimd_reg.xml */\nint FCMEQ_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E402400) {\n\t\tdecode_fields32(ENC_FCMEQ_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x5E20E400) {\n\t\tdecode_fields32(ENC_FCMEQ_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE402400) {\n\t\tdecode_fields32(ENC_FCMEQ_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20E400) {\n\t\tdecode_fields32(ENC_FCMEQ_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fcmeq_advsimd_zero.xml */\nint FCMEQ_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=1|111100|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF8D800) {\n\t\tdecode_fields32(ENC_FCMEQ_ASISDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASISDMISCFP16_FZ);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA0D800) {\n\t\tdecode_fields32(ENC_FCMEQ_ASISDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASISDMISC_FZ);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=1|111100|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF8D800) {\n\t\tdecode_fields32(ENC_FCMEQ_ASIMDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASIMDMISCFP16_FZ);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA0D800) {\n\t\tdecode_fields32(ENC_FCMEQ_ASIMDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMEQ_ASIMDMISC_FZ);\n\t}\n\treturn rc;\n}\n\n/* fcmge_advsimd_reg.xml */\nint FCMGE_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x7E402400) {\n\t\tdecode_fields32(ENC_FCMGE_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGE_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x7E20E400) {\n\t\tdecode_fields32(ENC_FCMGE_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGE_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|E=0|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E402400) {\n\t\tdecode_fields32(ENC_FCMGE_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGE_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|E=0|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20E400) {\n\t\tdecode_fields32(ENC_FCMGE_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGE_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fcmge_advsimd_zero.xml */\nint FCMGE_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|a=1|111100|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7EF8C800) {\n\t\tdecode_fields32(ENC_FCMGE_ASISDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGE_ASISDMISCFP16_FZ);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EA0C800) {\n\t\tdecode_fields32(ENC_FCMGE_ASISDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGE_ASISDMISC_FZ);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=1|111100|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF8C800) {\n\t\tdecode_fields32(ENC_FCMGE_ASIMDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGE_ASIMDMISCFP16_FZ);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA0C800) {\n\t\tdecode_fields32(ENC_FCMGE_ASIMDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGE_ASIMDMISC_FZ);\n\t}\n\treturn rc;\n}\n\n/* fcmgt_advsimd_reg.xml */\nint FCMGT_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|E=1|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x7EC02400) {\n\t\tdecode_fields32(ENC_FCMGT_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGT_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|E=1|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x7EA0E400) {\n\t\tdecode_fields32(ENC_FCMGT_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGT_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|E=1|10|Rm=xxxxx|00|opcode[2:1]=10|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC02400) {\n\t\tdecode_fields32(ENC_FCMGT_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGT_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|E=1|sz=x|1|Rm=xxxxx|opcode[4:1]=1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2EA0E400) {\n\t\tdecode_fields32(ENC_FCMGT_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->E<<2)|(ctx->U<<1)|ctx->ac)) {\n\t\t\tctx->cmp = CompareOp_EQ;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==2) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==3) {\n\t\t\tctx->cmp = CompareOp_GE;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==6) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = FALSE;\n\t\t}\n\t\telse if(((ctx->E<<2)|(ctx->U<<1)|ctx->ac)==7) {\n\t\t\tctx->cmp = CompareOp_GT;\n\t\t\tctx->abs = TRUE;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FCMGT_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fcmgt_advsimd_zero.xml */\nint FCMGT_advsimd_zero(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=1|111100|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF8C800) {\n\t\tdecode_fields32(ENC_FCMGT_ASISDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGT_ASISDMISCFP16_FZ);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA0C800) {\n\t\tdecode_fields32(ENC_FCMGT_ASISDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGT_ASISDMISC_FZ);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=1|111100|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF8C800) {\n\t\tdecode_fields32(ENC_FCMGT_ASIMDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGT_ASIMDMISCFP16_FZ);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA0C800) {\n\t\tdecode_fields32(ENC_FCMGT_ASIMDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMGT_ASIMDMISC_FZ);\n\t}\n\treturn rc;\n}\n\n/* fcmla_advsimd_elt.xml */\nint FCMLA_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|rot=xx|opcode[0]=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF009400)==0x2F001000) {\n\t\tdecode_fields32(ENC_FCMLA_ASIMDELEM_C_H, ctx, instr);\n\t\tif(!HaveFCADDExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\tif(ctx->size==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tif(!HaveFP16Ext() && ctx->esize==0x10) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(ctx->size==2 && (ctx->L==1 || ctx->Q==0)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==1 && ctx->H==1 && ctx->Q==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==1) OK(ENC_FCMLA_ASIMDELEM_C_H);\n\t\tif(ctx->size==2) OK(ENC_FCMLA_ASIMDELEM_C_S);\n\t}\n\treturn rc;\n}\n\n/* fcmla_advsimd_vec.xml */\nint FCMLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|10|rot=xx|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20E400)==0x2E00C400) {\n\t\tdecode_fields32(ENC_FCMLA_ASIMDSAME2_C, ctx, instr);\n\t\tif(!HaveFCADDExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Q==0 && ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tif(!HaveFP16Ext() && ctx->esize==0x10) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FCMLA_ASIMDSAME2_C);\n\t}\n\treturn rc;\n}\n\n/* fcmle_advsimd.xml */\nint FCMLE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|a=1|111100|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7EF8D800) {\n\t\tdecode_fields32(ENC_FCMLE_ASISDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMLE_ASISDMISCFP16_FZ);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EA0D800) {\n\t\tdecode_fields32(ENC_FCMLE_ASISDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMLE_ASISDMISC_FZ);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=1|111100|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF8D800) {\n\t\tdecode_fields32(ENC_FCMLE_ASIMDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMLE_ASIMDMISCFP16_FZ);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode[4:1]=0110|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA0D800) {\n\t\tdecode_fields32(ENC_FCMLE_ASIMDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tctx->comparison = CompareOp_GT;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->comparison = CompareOp_GE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->comparison = CompareOp_EQ;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->comparison = CompareOp_LE;\n\t\t}\n\t\tOK(ENC_FCMLE_ASIMDMISC_FZ);\n\t}\n\treturn rc;\n}\n\n/* fcmle_fcmeq_p_p_zz.xml */\nint FCMLE_fcmeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_ge */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65004000) {\n\t\tdecode_fields32(ENC_FCMLE_FCMGE_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_FCMLE_FCMGE_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fcmlt_advsimd.xml */\nint FCMLT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=1|111100|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF8E800) {\n\t\tdecode_fields32(ENC_FCMLT_ASISDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_FCMLT_ASISDMISCFP16_FZ);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|10000|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA0E800) {\n\t\tdecode_fields32(ENC_FCMLT_ASISDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_FCMLT_ASISDMISC_FZ);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=1|111100|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF8E800) {\n\t\tdecode_fields32(ENC_FCMLT_ASIMDMISCFP16_FZ, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_FCMLT_ASIMDMISCFP16_FZ);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA0E800) {\n\t\tdecode_fields32(ENC_FCMLT_ASIMDMISC_FZ, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->comparison = CompareOp_LT;\n\t\tOK(ENC_FCMLT_ASIMDMISC_FZ);\n\t}\n\treturn rc;\n}\n\n/* fcmlt_fcmeq_p_p_zz.xml */\nint FCMLT_fcmeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_gt */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65004010) {\n\t\tdecode_fields32(ENC_FCMLT_FCMGT_P_P_ZZ_, ctx, instr);\n\t\tOK(ENC_FCMLT_FCMGT_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fcmpe_float.xml */\nint FCMPE_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=00|1000|Rn=xxxxx|opc=1x|opcode2[2:0]=000 */\n\tif((INSWORD & 0xFF20FC17)==0x1E202010) {\n\t\tdecode_fields32(ENC_FCMPE_H_FLOATCMP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->signal_all_nans = (SLICE(ctx->opc,1,1)==1);\n\t\tctx->cmp_with_zero = (SLICE(ctx->opc,0,0)==1);\n\t\tif(ctx->ftype==3 && ctx->opc==2) OK(ENC_FCMPE_H_FLOATCMP);\n\t\tif(ctx->ftype==3 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==3) OK(ENC_FCMPE_HZ_FLOATCMP);\n\t\tif(ctx->ftype==0 && ctx->opc==2) OK(ENC_FCMPE_S_FLOATCMP);\n\t\tif(ctx->ftype==0 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==3) OK(ENC_FCMPE_SZ_FLOATCMP);\n\t\tif(ctx->ftype==1 && ctx->opc==2) OK(ENC_FCMPE_D_FLOATCMP);\n\t\tif(ctx->ftype==1 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==3) OK(ENC_FCMPE_DZ_FLOATCMP);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_FLOAT;\n\treturn rc;\n}\n\n/* fcmp_float.xml */\nint FCMP_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=00|1000|Rn=xxxxx|opc=0x|opcode2[2:0]=000 */\n\tif((INSWORD & 0xFF20FC17)==0x1E202000) {\n\t\tdecode_fields32(ENC_FCMP_H_FLOATCMP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->signal_all_nans = (SLICE(ctx->opc,1,1)==1);\n\t\tctx->cmp_with_zero = (SLICE(ctx->opc,0,0)==1);\n\t\tif(ctx->ftype==3 && ctx->opc==0) OK(ENC_FCMP_H_FLOATCMP);\n\t\tif(ctx->ftype==3 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==1) OK(ENC_FCMP_HZ_FLOATCMP);\n\t\tif(ctx->ftype==0 && ctx->opc==0) OK(ENC_FCMP_S_FLOATCMP);\n\t\tif(ctx->ftype==0 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==1) OK(ENC_FCMP_SZ_FLOATCMP);\n\t\tif(ctx->ftype==1 && ctx->opc==0) OK(ENC_FCMP_D_FLOATCMP);\n\t\tif(ctx->ftype==1 && /* PreferBitsEqual(['ctx->Rm'],'00000') */ true && ctx->opc==1) OK(ENC_FCMP_DZ_FLOATCMP);\n\t}\n\t/* relevant operational pcode */\n\tinstr->setflags = FLAGEFFECT_SETS_FLOAT;\n\treturn rc;\n}\n\n/* fcsel_float.xml */\nint FCSEL_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF200C00)==0x1E200C00) {\n\t\tdecode_fields32(ENC_FCSEL_H_FLOATSEL, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->condition = ctx->cond;\n\t\tif(ctx->ftype==3) OK(ENC_FCSEL_H_FLOATSEL);\n\t\tif(ctx->ftype==0) OK(ENC_FCSEL_S_FLOATSEL);\n\t\tif(ctx->ftype==1) OK(ENC_FCSEL_D_FLOATSEL);\n\t}\n\treturn rc;\n}\n\n/* fcvtas_advsimd.xml */\nint FCVTAS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|size[1]=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E79C800) {\n\t\tdecode_fields32(ENC_FCVTAS_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAS_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E21C800) {\n\t\tdecode_fields32(ENC_FCVTAS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE79C800) {\n\t\tdecode_fields32(ENC_FCVTAS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21C800) {\n\t\tdecode_fields32(ENC_FCVTAS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtas_float.xml */\nint FCVTAS_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=100|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E240000) {\n\t\tdecode_fields32(ENC_FCVTAS_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTAS_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTAS_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTAS_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTAS_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTAS_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTAS_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtau_advsimd.xml */\nint FCVTAU_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|size[1]=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7E79C800) {\n\t\tdecode_fields32(ENC_FCVTAU_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAU_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E21C800) {\n\t\tdecode_fields32(ENC_FCVTAU_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAU_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E79C800) {\n\t\tdecode_fields32(ENC_FCVTAU_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAU_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21C800) {\n\t\tdecode_fields32(ENC_FCVTAU_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTAU_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtau_float.xml */\nint FCVTAU_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=101|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E250000) {\n\t\tdecode_fields32(ENC_FCVTAU_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTAU_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTAU_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTAU_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTAU_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTAU_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTAU_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtl_advsimd.xml */\nint FCVTL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|10000|opcode=10111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE217800) {\n\t\tdecode_fields32(ENC_FCVTL_ASIMDMISC_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x10) << (UINT(ctx->sz));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FCVTL_ASIMDMISC_L);\n\t}\n\treturn rc;\n}\n\n/* fcvtms_advsimd.xml */\nint FCVTMS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|o2=0|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E79B800) {\n\t\tdecode_fields32(ENC_FCVTMS_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMS_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E21B800) {\n\t\tdecode_fields32(ENC_FCVTMS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|o2=0|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE79B800) {\n\t\tdecode_fields32(ENC_FCVTMS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21B800) {\n\t\tdecode_fields32(ENC_FCVTMS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtms_float.xml */\nint FCVTMS_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=10|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E300000) {\n\t\tdecode_fields32(ENC_FCVTMS_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTMS_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTMS_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTMS_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTMS_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTMS_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTMS_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtmu_advsimd.xml */\nint FCVTMU_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|o2=0|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7E79B800) {\n\t\tdecode_fields32(ENC_FCVTMU_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMU_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E21B800) {\n\t\tdecode_fields32(ENC_FCVTMU_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMU_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|o2=0|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E79B800) {\n\t\tdecode_fields32(ENC_FCVTMU_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMU_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21B800) {\n\t\tdecode_fields32(ENC_FCVTMU_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTMU_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtmu_float.xml */\nint FCVTMU_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=10|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E310000) {\n\t\tdecode_fields32(ENC_FCVTMU_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTMU_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTMU_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTMU_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTMU_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTMU_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTMU_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtns_advsimd.xml */\nint FCVTNS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|o2=0|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E79A800) {\n\t\tdecode_fields32(ENC_FCVTNS_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNS_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E21A800) {\n\t\tdecode_fields32(ENC_FCVTNS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|o2=0|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE79A800) {\n\t\tdecode_fields32(ENC_FCVTNS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21A800) {\n\t\tdecode_fields32(ENC_FCVTNS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtns_float.xml */\nint FCVTNS_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E200000) {\n\t\tdecode_fields32(ENC_FCVTNS_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTNS_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTNS_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTNS_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTNS_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTNS_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTNS_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtnu_advsimd.xml */\nint FCVTNU_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|o2=0|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7E79A800) {\n\t\tdecode_fields32(ENC_FCVTNU_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNU_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E21A800) {\n\t\tdecode_fields32(ENC_FCVTNU_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNU_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|o2=0|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E79A800) {\n\t\tdecode_fields32(ENC_FCVTNU_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNU_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21A800) {\n\t\tdecode_fields32(ENC_FCVTNU_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTNU_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtnu_float.xml */\nint FCVTNU_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E210000) {\n\t\tdecode_fields32(ENC_FCVTNU_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTNU_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTNU_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTNU_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTNU_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTNU_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTNU_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtn_advsimd.xml */\nint FCVTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE216800) {\n\t\tdecode_fields32(ENC_FCVTN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x10) << (UINT(ctx->sz));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FCVTN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* fcvtps_advsimd.xml */\nint FCVTPS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|o2=1|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF9A800) {\n\t\tdecode_fields32(ENC_FCVTPS_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPS_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA1A800) {\n\t\tdecode_fields32(ENC_FCVTPS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|o2=1|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF9A800) {\n\t\tdecode_fields32(ENC_FCVTPS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA1A800) {\n\t\tdecode_fields32(ENC_FCVTPS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtps_float.xml */\nint FCVTPS_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=01|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E280000) {\n\t\tdecode_fields32(ENC_FCVTPS_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTPS_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTPS_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTPS_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTPS_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTPS_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTPS_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtpu_advsimd.xml */\nint FCVTPU_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|o2=1|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7EF9A800) {\n\t\tdecode_fields32(ENC_FCVTPU_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPU_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EA1A800) {\n\t\tdecode_fields32(ENC_FCVTPU_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPU_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|o2=1|111100|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF9A800) {\n\t\tdecode_fields32(ENC_FCVTPU_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPU_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA1A800) {\n\t\tdecode_fields32(ENC_FCVTPU_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTPU_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtpu_float.xml */\nint FCVTPU_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=01|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E290000) {\n\t\tdecode_fields32(ENC_FCVTPU_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTPU_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTPU_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTPU_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTPU_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTPU_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTPU_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtxn_advsimd.xml */\nint FCVTXN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size[1]=0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E216800) {\n\t\tdecode_fields32(ENC_FCVTXN_ASISDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->sz==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tOK(ENC_FCVTXN_ASISDMISC_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E216800) {\n\t\tdecode_fields32(ENC_FCVTXN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->sz==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = 0x40;\n\t\tctx->elements = 2;\n\t\tctx->part = UINT(ctx->Q);\n\t\tOK(ENC_FCVTXN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* fcvtzs_advsimd_fix.xml */\nint FCVTZS_advsimd_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F00FC00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_FCVTZS_ASISDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_ASISDSHF_C);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF00FC00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_FCVTZS_ASIMDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_ASIMDSHF_C);\n\t}\n\treturn rc;\n}\n\n/* fcvtzs_advsimd_int.xml */\nint FCVTZS_advsimd_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|o2=1|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF9B800) {\n\t\tdecode_fields32(ENC_FCVTZS_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZS_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA1B800) {\n\t\tdecode_fields32(ENC_FCVTZS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|o2=1|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF9B800) {\n\t\tdecode_fields32(ENC_FCVTZS_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZS_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA1B800) {\n\t\tdecode_fields32(ENC_FCVTZS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtzs_float_fix.xml */\nint FCVTZS_float_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|0|rmode=11|opcode=000|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3F0000)==0x1E180000) {\n\t\tdecode_fields32(ENC_FCVTZS_32H_FLOAT2FIX, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->scale,5,5)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->fracbits = 0x40-UINT(ctx->scale);\n\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==3) {\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTZS_32H_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTZS_64H_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTZS_32S_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTZS_64S_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTZS_32D_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTZS_64D_FLOAT2FIX);\n\t}\n\treturn rc;\n}\n\n/* fcvtzs_float_int.xml */\nint FCVTZS_float_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=11|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E380000) {\n\t\tdecode_fields32(ENC_FCVTZS_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTZS_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTZS_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTZS_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTZS_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTZS_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTZS_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvtzu_advsimd_fix.xml */\nint FCVTZU_advsimd_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F00FC00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_FCVTZU_ASISDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_ASISDSHF_C);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F00FC00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_FCVTZU_ASIMDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_ASIMDSHF_C);\n\t}\n\treturn rc;\n}\n\n/* fcvtzu_advsimd_int.xml */\nint FCVTZU_advsimd_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|o2=1|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7EF9B800) {\n\t\tdecode_fields32(ENC_FCVTZU_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZU_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EA1B800) {\n\t\tdecode_fields32(ENC_FCVTZU_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZU_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|o2=1|111100|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF9B800) {\n\t\tdecode_fields32(ENC_FCVTZU_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZU_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|opcode[4:1]=1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA1B800) {\n\t\tdecode_fields32(ENC_FCVTZU_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_FCVTZU_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fcvtzu_float_fix.xml */\nint FCVTZU_float_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|0|rmode=11|opcode=001|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3F0000)==0x1E190000) {\n\t\tdecode_fields32(ENC_FCVTZU_32H_FLOAT2FIX, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->scale,5,5)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->fracbits = 0x40-UINT(ctx->scale);\n\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==3) {\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTZU_32H_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTZU_64H_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTZU_32S_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTZU_64S_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTZU_32D_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTZU_64D_FLOAT2FIX);\n\t}\n\treturn rc;\n}\n\n/* fcvtzu_float_int.xml */\nint FCVTZU_float_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=11|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E390000) {\n\t\tdecode_fields32(ENC_FCVTZU_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_FCVTZU_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_FCVTZU_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_FCVTZU_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_FCVTZU_64S_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_FCVTZU_32D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_FCVTZU_64D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fcvt_float.xml */\nint FCVT_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:2]=0001|opc=xx|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3E7C00)==0x1E224000) {\n\t\tdecode_fields32(ENC_FCVT_SH_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->ftype==ctx->opc) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->ftype) {\n\t\t\tctx->srcsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->srcsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tctx->srcsize = 0x10;\n\t\t}\n\t\tif(!ctx->opc) {\n\t\t\tctx->dstsize = 0x20;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->dstsize = 0x40;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->dstsize = 0x10;\n\t\t}\n\t\tif(ctx->ftype==3 && ctx->opc==0) OK(ENC_FCVT_SH_FLOATDP1);\n\t\tif(ctx->ftype==3 && ctx->opc==1) OK(ENC_FCVT_DH_FLOATDP1);\n\t\tif(ctx->ftype==0 && ctx->opc==3) OK(ENC_FCVT_HS_FLOATDP1);\n\t\tif(ctx->ftype==0 && ctx->opc==1) OK(ENC_FCVT_DS_FLOATDP1);\n\t\tif(ctx->ftype==1 && ctx->opc==3) OK(ENC_FCVT_HD_FLOATDP1);\n\t\tif(ctx->ftype==1 && ctx->opc==0) OK(ENC_FCVT_SD_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* fdiv_advsimd.xml */\nint FDIV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E403C00) {\n\t\tdecode_fields32(ENC_FDIV_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FDIV_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20FC00) {\n\t\tdecode_fields32(ENC_FDIV_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FDIV_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fdiv_float.xml */\nint FDIV_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode=0001|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E201800) {\n\t\tdecode_fields32(ENC_FDIV_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FDIV_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FDIV_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FDIV_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fjcvtzs.xml */\nint FJCVTZS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_double_to_32 */\n\t/* sf=0|0|S=0|11110|ftype=01|1|rmode=11|opcode=110|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x1E7E0000) {\n\t\tdecode_fields32(ENC_FJCVTZS_32D_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_FJCVTZS_32D_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fmadd_float.xml */\nint FMADD_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11111|ftype=xx|o1=0|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF208000)==0x1F000000) {\n\t\tdecode_fields32(ENC_FMADD_H_FLOATDP3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->opa_neg = (ctx->o1==1);\n\t\tctx->op1_neg = (ctx->o0!=ctx->o1);\n\t\tif(ctx->ftype==3) OK(ENC_FMADD_H_FLOATDP3);\n\t\tif(ctx->ftype==0) OK(ENC_FMADD_S_FLOATDP3);\n\t\tif(ctx->ftype==1) OK(ENC_FMADD_D_FLOATDP3);\n\t}\n\treturn rc;\n}\n\n/* fmaxnmp_advsimd_pair.xml */\nint FMAXNMP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|o1=0|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E30C800) {\n\t\tdecode_fields32(ENC_FMAXNMP_ASISDPAIR_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMAXNMP_ASISDPAIR_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=1|11110|o1=0|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E30C800) {\n\t\tdecode_fields32(ENC_FMAXNMP_ASISDPAIR_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMAXNMP_ASISDPAIR_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fmaxnmp_advsimd_vec.xml */\nint FMAXNMP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E400400) {\n\t\tdecode_fields32(ENC_FMAXNMP_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->a==1);\n\t\tOK(ENC_FMAXNMP_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20C400) {\n\t\tdecode_fields32(ENC_FMAXNMP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAXNMP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmaxnmv_advsimd.xml */\nint FMAXNMV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=0|size[0]=0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE30C800) {\n\t\tdecode_fields32(ENC_FMAXNMV_ASIMDALL_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMAXNMV_ASIMDALL_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=0|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E30C800) {\n\t\tdecode_fields32(ENC_FMAXNMV_ASIMDALL_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMAXNMV_ASIMDALL_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fmaxnm_advsimd.xml */\nint FMAXNM_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE400400) {\n\t\tdecode_fields32(ENC_FMAXNM_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->a==1);\n\t\tOK(ENC_FMAXNM_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20C400) {\n\t\tdecode_fields32(ENC_FMAXNM_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAXNM_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmaxnm_float.xml */\nint FMAXNM_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:2]=01|op=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E206800) {\n\t\tdecode_fields32(ENC_FMAXNM_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAX;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->operation_ = FPMaxMinOp_MIN;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAXNUM;\n\t\t}\n\t\telse if(ctx->op==3) {\n\t\t\tctx->operation_ = FPMaxMinOp_MINNUM;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FMAXNM_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FMAXNM_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FMAXNM_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fmaxp_advsimd_pair.xml */\nint FMAXP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|o1=0|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E30F800) {\n\t\tdecode_fields32(ENC_FMAXP_ASISDPAIR_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMAXP_ASISDPAIR_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=1|11110|o1=0|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E30F800) {\n\t\tdecode_fields32(ENC_FMAXP_ASISDPAIR_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMAXP_ASISDPAIR_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fmaxp_advsimd_vec.xml */\nint FMAXP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|o1=0|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E403400) {\n\t\tdecode_fields32(ENC_FMAXP_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAXP_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20F400) {\n\t\tdecode_fields32(ENC_FMAXP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAXP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmaxv_advsimd.xml */\nint FMAXV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=0|0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE30F800) {\n\t\tdecode_fields32(ENC_FMAXV_ASIMDALL_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMAXV_ASIMDALL_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=0|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E30F800) {\n\t\tdecode_fields32(ENC_FMAXV_ASIMDALL_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMAXV_ASIMDALL_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fmax_advsimd.xml */\nint FMAX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=0|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE403400) {\n\t\tdecode_fields32(ENC_FMAX_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAX_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20F400) {\n\t\tdecode_fields32(ENC_FMAX_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMAX_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmax_float.xml */\nint FMAX_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:2]=01|op=00|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E204800) {\n\t\tdecode_fields32(ENC_FMAX_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAX;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->operation_ = FPMaxMinOp_MIN;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAXNUM;\n\t\t}\n\t\telse if(ctx->op==3) {\n\t\t\tctx->operation_ = FPMaxMinOp_MINNUM;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FMAX_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FMAX_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FMAX_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fminnmp_advsimd_pair.xml */\nint FMINNMP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|o1=1|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EB0C800) {\n\t\tdecode_fields32(ENC_FMINNMP_ASISDPAIR_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMINNMP_ASISDPAIR_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=1|11110|o1=1|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EB0C800) {\n\t\tdecode_fields32(ENC_FMINNMP_ASISDPAIR_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMINNMP_ASISDPAIR_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fminnmp_advsimd_vec.xml */\nint FMINNMP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=1|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC00400) {\n\t\tdecode_fields32(ENC_FMINNMP_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->a==1);\n\t\tOK(ENC_FMINNMP_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2EA0C400) {\n\t\tdecode_fields32(ENC_FMINNMP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMINNMP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fminnmv_advsimd.xml */\nint FMINNMV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=1|size[0]=0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEB0C800) {\n\t\tdecode_fields32(ENC_FMINNMV_ASIMDALL_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMINNMV_ASIMDALL_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=1|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EB0C800) {\n\t\tdecode_fields32(ENC_FMINNMV_ASIMDALL_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;\n\t\tOK(ENC_FMINNMV_ASIMDALL_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fminnm_advsimd.xml */\nint FMINNM_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEC00400) {\n\t\tdecode_fields32(ENC_FMINNM_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->a==1);\n\t\tOK(ENC_FMINNM_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xEA0C400) {\n\t\tdecode_fields32(ENC_FMINNM_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMINNM_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fminnm_float.xml */\nint FMINNM_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:2]=01|op=11|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E207800) {\n\t\tdecode_fields32(ENC_FMINNM_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAX;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->operation_ = FPMaxMinOp_MIN;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAXNUM;\n\t\t}\n\t\telse if(ctx->op==3) {\n\t\t\tctx->operation_ = FPMaxMinOp_MINNUM;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FMINNM_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FMINNM_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FMINNM_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fminp_advsimd_pair.xml */\nint FMINP_advsimd_pair(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|o1=1|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EB0F800) {\n\t\tdecode_fields32(ENC_FMINP_ASISDPAIR_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMINP_ASISDPAIR_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=1|11110|o1=1|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EB0F800) {\n\t\tdecode_fields32(ENC_FMINP_ASISDPAIR_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->esize) * (2);\n\t\tctx->elements = 2;\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMINP_ASISDPAIR_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fminp_advsimd_vec.xml */\nint FMINP_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|o1=1|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EC03400) {\n\t\tdecode_fields32(ENC_FMINP_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMINP_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2EA0F400) {\n\t\tdecode_fields32(ENC_FMINP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMINP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fminv_advsimd.xml */\nint FMINV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=1|0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEB0F800) {\n\t\tdecode_fields32(ENC_FMINV_ASIMDALL_ONLY_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMINV_ASIMDALL_ONLY_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o1=1|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EB0F800) {\n\t\tdecode_fields32(ENC_FMINV_ASIMDALL_ONLY_SD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->op = (ctx->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;\n\t\tOK(ENC_FMINV_ASIMDALL_ONLY_SD);\n\t}\n\treturn rc;\n}\n\n/* fmin_advsimd.xml */\nint FMIN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o1=1|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEC03400) {\n\t\tdecode_fields32(ENC_FMIN_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMIN_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xEA0F400) {\n\t\tdecode_fields32(ENC_FMIN_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->pair = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_FMIN_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmin_float.xml */\nint FMIN_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:2]=01|op=01|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E205800) {\n\t\tdecode_fields32(ENC_FMIN_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAX;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->operation_ = FPMaxMinOp_MIN;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->operation_ = FPMaxMinOp_MAXNUM;\n\t\t}\n\t\telse if(ctx->op==3) {\n\t\t\tctx->operation_ = FPMaxMinOp_MINNUM;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FMIN_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FMIN_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FMIN_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fmlal_advsimd_elt.xml */\nint FMLAL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fmlal */\n\t/* 0|Q=x|U=0|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=0|S=0|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF800000) {\n\t\tdecode_fields32(ENC_FMLAL_ASIMDELEM_LH, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 0;\n\t\tOK(ENC_FMLAL_ASIMDELEM_LH);\n\t}\n\t/* class iclass_fmlal2 */\n\t/* 0|Q=x|U=1|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=1|S=0|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0x2F808000) {\n\t\tdecode_fields32(ENC_FMLAL2_ASIMDELEM_LH, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 1;\n\t\tOK(ENC_FMLAL2_ASIMDELEM_LH);\n\t}\n\treturn rc;\n}\n\n/* fmlal_advsimd_vec.xml */\nint FMLAL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fmlal */\n\t/* 0|Q=x|U=0|01110|S=0|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE20EC00) {\n\t\tdecode_fields32(ENC_FMLAL_ASIMDSAME_F, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 0;\n\t\tOK(ENC_FMLAL_ASIMDSAME_F);\n\t}\n\t/* class iclass_fmlal2 */\n\t/* 0|Q=x|U=1|01110|S=0|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E20CC00) {\n\t\tdecode_fields32(ENC_FMLAL2_ASIMDSAME_F, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 1;\n\t\tOK(ENC_FMLAL2_ASIMDSAME_F);\n\t}\n\treturn rc;\n}\n\n/* fmla_advsimd_elt.xml */\nint FMLA_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar_half */\n\t/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFC0F400)==0x5F001000) {\n\t\tdecode_fields32(ENC_FMLA_ASISDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLA_ASISDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_scalar_single_and_double */\n\t/* 01|U=0|11111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80F400)==0x5F801000) {\n\t\tdecode_fields32(ENC_FMLA_ASISDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLA_ASISDELEM_R_SD);\n\t}\n\t/* class iclass_2reg_element_half */\n\t/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF001000) {\n\t\tdecode_fields32(ENC_FMLA_ASIMDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLA_ASIMDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_element_single_and_double */\n\t/* 0|Q=x|U=0|01111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80F400)==0xF801000) {\n\t\tdecode_fields32(ENC_FMLA_ASIMDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLA_ASIMDELEM_R_SD);\n\t}\n\treturn rc;\n}\n\n/* fmla_advsimd_vec.xml */\nint FMLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE400C00) {\n\t\tdecode_fields32(ENC_FMLA_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->a==1);\n\t\tOK(ENC_FMLA_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|op=0|sz=x|1|Rm=xxxxx|opcode=11001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20CC00) {\n\t\tdecode_fields32(ENC_FMLA_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->op==1);\n\t\tOK(ENC_FMLA_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmlsl_advsimd_elt.xml */\nint FMLSL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fmlsl */\n\t/* 0|Q=x|U=0|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=0|S=1|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF804000) {\n\t\tdecode_fields32(ENC_FMLSL_ASIMDELEM_LH, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 0;\n\t\tOK(ENC_FMLSL_ASIMDELEM_LH);\n\t}\n\t/* class iclass_fmlsl2 */\n\t/* 0|Q=x|U=1|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=1|S=1|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0x2F80C000) {\n\t\tdecode_fields32(ENC_FMLSL2_ASIMDELEM_LH, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 1;\n\t\tOK(ENC_FMLSL2_ASIMDELEM_LH);\n\t}\n\treturn rc;\n}\n\n/* fmlsl_advsimd_vec.xml */\nint FMLSL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fmlsl */\n\t/* 0|Q=x|U=0|01110|S=1|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEA0EC00) {\n\t\tdecode_fields32(ENC_FMLSL_ASIMDSAME_F, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 0;\n\t\tOK(ENC_FMLSL_ASIMDSAME_F);\n\t}\n\t/* class iclass_fmlsl2 */\n\t/* 0|Q=x|U=1|01110|S=1|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2EA0CC00) {\n\t\tdecode_fields32(ENC_FMLSL2_ASIMDSAME_F, ctx, instr);\n\t\tif(!HaveFP16MulNoRoundingToFP32Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->S==1);\n\t\tctx->part = 1;\n\t\tOK(ENC_FMLSL2_ASIMDSAME_F);\n\t}\n\treturn rc;\n}\n\n/* fmls_advsimd_elt.xml */\nint FMLS_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar_half */\n\t/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFC0F400)==0x5F005000) {\n\t\tdecode_fields32(ENC_FMLS_ASISDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLS_ASISDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_scalar_single_and_double */\n\t/* 01|U=0|11111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80F400)==0x5F805000) {\n\t\tdecode_fields32(ENC_FMLS_ASISDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLS_ASISDELEM_R_SD);\n\t}\n\t/* class iclass_2reg_element_half */\n\t/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF005000) {\n\t\tdecode_fields32(ENC_FMLS_ASIMDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLS_ASIMDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_element_single_and_double */\n\t/* 0|Q=x|U=0|01111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=01|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80F400)==0xF805000) {\n\t\tdecode_fields32(ENC_FMLS_ASIMDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_FMLS_ASIMDELEM_R_SD);\n\t}\n\treturn rc;\n}\n\n/* fmls_advsimd_vec.xml */\nint FMLS_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEC00C00) {\n\t\tdecode_fields32(ENC_FMLS_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->a==1);\n\t\tOK(ENC_FMLS_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|op=1|sz=x|1|Rm=xxxxx|opcode=11001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xEA0CC00) {\n\t\tdecode_fields32(ENC_FMLS_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->op==1);\n\t\tOK(ENC_FMLS_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmov_advsimd.xml */\nint FMOV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_half */\n\t/* 0|Q=x|op=0|0111100000|a=x|b=x|c=x|cmode=1111|o2=1|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0xBFF8FC00)==0xF00FC00) {\n\t\tdecode_fields32(ENC_FMOV_ASIMDIMM_H_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->imm8 = ((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h);\n\t\tctx->imm16 = ((SLICE(ctx->imm8,7,7)<<15)|(NOT(SLICE(ctx->imm8,6,6),1)<<14)|(Replicate(SLICE(ctx->imm8,6,6), 2, 1)<<12)|(SLICE(ctx->imm8,5,0)<<6)|0);\n\t\tctx->imm = Replicate(ctx->imm16, ((0x10) ? ((ctx->datasize) / (0x10)) : 0), 16);\n\t\tOK(ENC_FMOV_ASIMDIMM_H_H);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|op=x|0111100000|a=x|b=x|c=x|cmode=1111|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0x9FF8FC00)==0xF00F400) {\n\t\tdecode_fields32(ENC_FMOV_ASIMDIMM_S_S, ctx, instr);\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tif(!(((ctx->cmode<<1)|ctx->op)&0x13)) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==1) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==2) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==3) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x10) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x11) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x12) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x13) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x18) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x19) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1e)==0x1c) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1e) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1f) {\n\t\t\tif(ctx->Q==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\tctx->imm64 = AdvSIMDExpandImm(ctx->op,ctx->cmode,((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h));\n\t\tctx->imm = Replicate(ctx->imm64, ((0x40) ? ((ctx->datasize) / (0x40)) : 0), 64);\n\t\tif(ctx->op==0) OK(ENC_FMOV_ASIMDIMM_S_S);\n\t\tif(ctx->Q==1 && ctx->op==1) OK(ENC_FMOV_ASIMDIMM_D2_D);\n\t}\n\treturn rc;\n}\n\n/* fmov_cpy_z_p_i.xml */\nint FMOV_cpy_z_p_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=0|imm8=00000000|Zd=xxxxx */\n\tif((INSWORD & 0xFF30FFE0)==0x5104000) {\n\t\tdecode_fields32(ENC_FMOV_CPY_Z_P_I_, ctx, instr);\n\t\tOK(ENC_FMOV_CPY_Z_P_I_);\n\t}\n\treturn rc;\n}\n\n/* fmov_dup_z_i.xml */\nint FMOV_dup_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|111|opc=00|011|sh=0|imm8=00000000|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFFE0)==0x2538C000) {\n\t\tdecode_fields32(ENC_FMOV_DUP_Z_I_, ctx, instr);\n\t\tOK(ENC_FMOV_DUP_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* fmov_fcpy_z_p_i.xml */\nint FMOV_fcpy_z_p_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|110|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30E000)==0x510C000) {\n\t\tdecode_fields32(ENC_FMOV_FCPY_Z_P_I_, ctx, instr);\n\t\tOK(ENC_FMOV_FCPY_Z_P_I_);\n\t}\n\treturn rc;\n}\n\n/* fmov_fdup_z_i.xml */\nint FMOV_fdup_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|111|opc=00|111|o2=0|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x2539C000) {\n\t\tdecode_fields32(ENC_FMOV_FDUP_Z_I_, ctx, instr);\n\t\tOK(ENC_FMOV_FDUP_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* fmov_float.xml */\nint FMOV_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:2]=0000|opc=00|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E204000) {\n\t\tdecode_fields32(ENC_FMOV_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->opc) {\n\t\t\tctx->fpop = FPUnaryOp_MOV;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->fpop = FPUnaryOp_ABS;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->fpop = FPUnaryOp_NEG;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->fpop = FPUnaryOp_SQRT;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FMOV_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FMOV_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FMOV_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* fmov_float_gen.xml */\nint FMOV_float_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=0x|opcode=11x|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F36FC00)==0x1E260000) {\n\t\tdecode_fields32(ENC_FMOV_32H_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3 && ctx->rmode==0 && ctx->opcode==6) OK(ENC_FMOV_32H_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3 && ctx->rmode==0 && ctx->opcode==6) OK(ENC_FMOV_64H_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==3 && ctx->rmode==0 && ctx->opcode==7) OK(ENC_FMOV_H32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0 && ctx->rmode==0 && ctx->opcode==7) OK(ENC_FMOV_S32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0 && ctx->rmode==0 && ctx->opcode==6) OK(ENC_FMOV_32S_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3 && ctx->rmode==0 && ctx->opcode==7) OK(ENC_FMOV_H64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1 && ctx->rmode==0 && ctx->opcode==7) OK(ENC_FMOV_D64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==2 && ctx->rmode==1 && ctx->opcode==7) OK(ENC_FMOV_V64I_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1 && ctx->rmode==0 && ctx->opcode==6) OK(ENC_FMOV_64D_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==2 && ctx->rmode==1 && ctx->opcode==6) OK(ENC_FMOV_64VX_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* fmov_float_imm.xml */\nint FMOV_float_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm8f */\n\t/* M=0|0|S=0|11110|ftype=xx|1|imm8=xxxxxxxx|100|imm5=00000|Rd=xxxxx */\n\tif((INSWORD & 0xFF201FE0)==0x1E201000) {\n\t\tdecode_fields32(ENC_FMOV_H_FLOATIMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->datasize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->datasize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->datasize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->imm = VFPExpandImm(ctx->imm8,8);\n\t\tif(ctx->ftype==3) OK(ENC_FMOV_H_FLOATIMM);\n\t\tif(ctx->ftype==0) OK(ENC_FMOV_S_FLOATIMM);\n\t\tif(ctx->ftype==1) OK(ENC_FMOV_D_FLOATIMM);\n\t}\n\treturn rc;\n}\n\n/* fmsub_float.xml */\nint FMSUB_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11111|ftype=xx|o1=0|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF208000)==0x1F008000) {\n\t\tdecode_fields32(ENC_FMSUB_H_FLOATDP3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->opa_neg = (ctx->o1==1);\n\t\tctx->op1_neg = (ctx->o0!=ctx->o1);\n\t\tif(ctx->ftype==3) OK(ENC_FMSUB_H_FLOATDP3);\n\t\tif(ctx->ftype==0) OK(ENC_FMSUB_S_FLOATDP3);\n\t\tif(ctx->ftype==1) OK(ENC_FMSUB_D_FLOATDP3);\n\t}\n\treturn rc;\n}\n\n/* fmulx_advsimd_elt.xml */\nint FMULX_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar_half */\n\t/* 01|U=1|11111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFC0F400)==0x7F009000) {\n\t\tdecode_fields32(ENC_FMULX_ASISDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMULX_ASISDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_scalar_single_and_double */\n\t/* 01|U=1|11111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80F400)==0x7F809000) {\n\t\tdecode_fields32(ENC_FMULX_ASISDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMULX_ASISDELEM_R_SD);\n\t}\n\t/* class iclass_2reg_element_half */\n\t/* 0|Q=x|U=1|01111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0x2F009000) {\n\t\tdecode_fields32(ENC_FMULX_ASIMDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMULX_ASIMDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_element_single_and_double */\n\t/* 0|Q=x|U=1|01111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80F400)==0x2F809000) {\n\t\tdecode_fields32(ENC_FMULX_ASIMDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMULX_ASIMDELEM_R_SD);\n\t}\n\treturn rc;\n}\n\n/* fmulx_advsimd_vec.xml */\nint FMULX_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E401C00) {\n\t\tdecode_fields32(ENC_FMULX_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FMULX_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x5E20DC00) {\n\t\tdecode_fields32(ENC_FMULX_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FMULX_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE401C00) {\n\t\tdecode_fields32(ENC_FMULX_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FMULX_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20DC00) {\n\t\tdecode_fields32(ENC_FMULX_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FMULX_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmul_advsimd_elt.xml */\nint FMUL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar_half */\n\t/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFC0F400)==0x5F009000) {\n\t\tdecode_fields32(ENC_FMUL_ASISDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMUL_ASISDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_scalar_single_and_double */\n\t/* 01|U=0|11111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80F400)==0x5F809000) {\n\t\tdecode_fields32(ENC_FMUL_ASISDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMUL_ASISDELEM_R_SD);\n\t}\n\t/* class iclass_2reg_element_half */\n\t/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF009000) {\n\t\tdecode_fields32(ENC_FMUL_ASIMDELEM_RH_H, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMUL_ASIMDELEM_RH_H);\n\t}\n\t/* class iclass_2reg_element_single_and_double */\n\t/* 0|Q=x|U=0|01111|size[1]=1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80F400)==0xF809000) {\n\t\tdecode_fields32(ENC_FMUL_ASIMDELEM_R_SD, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tctx->Rmhi = ctx->M;\n\t\tif(!(((ctx->sz<<1)|ctx->L)&2)) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==2) {\n\t\t\tctx->index = UINT(ctx->H);\n\t\t}\n\t\telse if(((ctx->sz<<1)|ctx->L)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->mulx_op = (ctx->U==1);\n\t\tOK(ENC_FMUL_ASIMDELEM_R_SD);\n\t}\n\treturn rc;\n}\n\n/* fmul_advsimd_vec.xml */\nint FMUL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0x2E401C00) {\n\t\tdecode_fields32(ENC_FMUL_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FMUL_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0x2E20DC00) {\n\t\tdecode_fields32(ENC_FMUL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FMUL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fmul_float.xml */\nint FMUL_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=0|opcode[2:0]=000|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E200800) {\n\t\tdecode_fields32(ENC_FMUL_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->negated = (ctx->op==1);\n\t\tif(ctx->ftype==3) OK(ENC_FMUL_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FMUL_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FMUL_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* fneg_advsimd.xml */\nint FNEG_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=1|111100|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF8F800) {\n\t\tdecode_fields32(ENC_FNEG_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_FNEG_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA0F800) {\n\t\tdecode_fields32(ENC_FNEG_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_FNEG_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fneg_float.xml */\nint FNEG_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:2]=0000|opc=10|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E214000) {\n\t\tdecode_fields32(ENC_FNEG_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->opc) {\n\t\t\tctx->fpop = FPUnaryOp_MOV;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->fpop = FPUnaryOp_ABS;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->fpop = FPUnaryOp_NEG;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->fpop = FPUnaryOp_SQRT;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FNEG_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FNEG_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FNEG_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* fnmadd_float.xml */\nint FNMADD_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11111|ftype=xx|o1=1|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF208000)==0x1F200000) {\n\t\tdecode_fields32(ENC_FNMADD_H_FLOATDP3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->opa_neg = (ctx->o1==1);\n\t\tctx->op1_neg = (ctx->o0!=ctx->o1);\n\t\tif(ctx->ftype==3) OK(ENC_FNMADD_H_FLOATDP3);\n\t\tif(ctx->ftype==0) OK(ENC_FNMADD_S_FLOATDP3);\n\t\tif(ctx->ftype==1) OK(ENC_FNMADD_D_FLOATDP3);\n\t}\n\treturn rc;\n}\n\n/* fnmsub_float.xml */\nint FNMSUB_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11111|ftype=xx|o1=1|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF208000)==0x1F208000) {\n\t\tdecode_fields32(ENC_FNMSUB_H_FLOATDP3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->opa_neg = (ctx->o1==1);\n\t\tctx->op1_neg = (ctx->o0!=ctx->o1);\n\t\tif(ctx->ftype==3) OK(ENC_FNMSUB_H_FLOATDP3);\n\t\tif(ctx->ftype==0) OK(ENC_FNMSUB_S_FLOATDP3);\n\t\tif(ctx->ftype==1) OK(ENC_FNMSUB_D_FLOATDP3);\n\t}\n\treturn rc;\n}\n\n/* fnmul_float.xml */\nint FNMUL_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=1|opcode[2:0]=000|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E208800) {\n\t\tdecode_fields32(ENC_FNMUL_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->negated = (ctx->op==1);\n\t\tif(ctx->ftype==3) OK(ENC_FNMUL_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FNMUL_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FNMUL_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* frecpe_advsimd.xml */\nint FRECPE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|size[1]=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF9D800) {\n\t\tdecode_fields32(ENC_FRECPE_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRECPE_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA1D800) {\n\t\tdecode_fields32(ENC_FRECPE_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRECPE_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF9D800) {\n\t\tdecode_fields32(ENC_FRECPE_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRECPE_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA1D800) {\n\t\tdecode_fields32(ENC_FRECPE_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRECPE_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frecps_advsimd.xml */\nint FRECPS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E403C00) {\n\t\tdecode_fields32(ENC_FRECPS_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRECPS_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x5E20FC00) {\n\t\tdecode_fields32(ENC_FRECPS_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRECPS_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE403C00) {\n\t\tdecode_fields32(ENC_FRECPS_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRECPS_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xE20FC00) {\n\t\tdecode_fields32(ENC_FRECPS_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRECPS_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* frecpx_advsimd.xml */\nint FRECPX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01|U=0|11110|a=1|111100|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5EF9F800) {\n\t\tdecode_fields32(ENC_FRECPX_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tOK(ENC_FRECPX_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|10000|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5EA1F800) {\n\t\tdecode_fields32(ENC_FRECPX_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tOK(ENC_FRECPX_ASISDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frint32x_advsimd.xml */\nint FRINT32X_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|0|sz=x|10000|1111|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21E800) {\n\t\tdecode_fields32(ENC_FRINT32X_ASIMDMISC_R, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->intsize = (ctx->op==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (ctx->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINT32X_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frint32x_float.xml */\nint FRINT32X_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=0x|1|0100|op=01|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x1E28C000) {\n\t\tdecode_fields32(ENC_FRINT32X_S_FLOATDP1, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if((ctx->ftype&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->intsize = (SLICE(ctx->op,1,1)==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (SLICE(ctx->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tif(ctx->ftype==0) OK(ENC_FRINT32X_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINT32X_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frint32z_advsimd.xml */\nint FRINT32Z_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|0|sz=x|10000|1111|op=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21E800) {\n\t\tdecode_fields32(ENC_FRINT32Z_ASIMDMISC_R, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->intsize = (ctx->op==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (ctx->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINT32Z_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frint32z_float.xml */\nint FRINT32Z_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=0x|1|0100|op=00|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x1E284000) {\n\t\tdecode_fields32(ENC_FRINT32Z_S_FLOATDP1, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if((ctx->ftype&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->intsize = (SLICE(ctx->op,1,1)==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (SLICE(ctx->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tif(ctx->ftype==0) OK(ENC_FRINT32Z_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINT32Z_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frint64x_advsimd.xml */\nint FRINT64X_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|0|sz=x|10000|1111|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21F800) {\n\t\tdecode_fields32(ENC_FRINT64X_ASIMDMISC_R, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->intsize = (ctx->op==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (ctx->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINT64X_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frint64x_float.xml */\nint FRINT64X_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=0x|1|0100|op=11|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x1E29C000) {\n\t\tdecode_fields32(ENC_FRINT64X_S_FLOATDP1, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if((ctx->ftype&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->intsize = (SLICE(ctx->op,1,1)==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (SLICE(ctx->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tif(ctx->ftype==0) OK(ENC_FRINT64X_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINT64X_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frint64z_advsimd.xml */\nint FRINT64Z_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|0|sz=x|10000|1111|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21F800) {\n\t\tdecode_fields32(ENC_FRINT64Z_ASIMDMISC_R, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->intsize = (ctx->op==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (ctx->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINT64Z_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frint64z_float.xml */\nint FRINT64Z_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=0x|1|0100|op=10|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x1E294000) {\n\t\tdecode_fields32(ENC_FRINT64Z_S_FLOATDP1, ctx, instr);\n\t\tif(!HaveFrintExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if((ctx->ftype&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->intsize = (SLICE(ctx->op,1,1)==0) ? 0x20 : 0x40;\n\t\tctx->rounding = (SLICE(ctx->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);\n\t\tif(ctx->ftype==0) OK(ENC_FRINT64Z_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINT64Z_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frinta_advsimd.xml */\nint FRINTA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|o2=0|111100|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E798800) {\n\t\tdecode_fields32(ENC_FRINTA_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTA_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E218800) {\n\t\tdecode_fields32(ENC_FRINTA_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTA_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frinta_float.xml */\nint FRINTA_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=100|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E264000) {\n\t\tdecode_fields32(ENC_FRINTA_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTA_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTA_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTA_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frinti_advsimd.xml */\nint FRINTI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|o2=1|111100|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF99800) {\n\t\tdecode_fields32(ENC_FRINTI_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTI_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA19800) {\n\t\tdecode_fields32(ENC_FRINTI_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTI_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frinti_float.xml */\nint FRINTI_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=111|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E27C000) {\n\t\tdecode_fields32(ENC_FRINTI_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTI_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTI_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTI_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frintm_advsimd.xml */\nint FRINTM_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o2=0|111100|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE799800) {\n\t\tdecode_fields32(ENC_FRINTM_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTM_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE219800) {\n\t\tdecode_fields32(ENC_FRINTM_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTM_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frintm_float.xml */\nint FRINTM_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=010|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E254000) {\n\t\tdecode_fields32(ENC_FRINTM_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTM_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTM_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTM_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frintn_advsimd.xml */\nint FRINTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o2=0|111100|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE798800) {\n\t\tdecode_fields32(ENC_FRINTN_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTN_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE218800) {\n\t\tdecode_fields32(ENC_FRINTN_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTN_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frintn_float.xml */\nint FRINTN_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=000|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E244000) {\n\t\tdecode_fields32(ENC_FRINTN_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTN_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTN_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTN_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frintp_advsimd.xml */\nint FRINTP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o2=1|111100|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF98800) {\n\t\tdecode_fields32(ENC_FRINTP_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTP_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|opcode[4:1]=1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA18800) {\n\t\tdecode_fields32(ENC_FRINTP_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTP_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frintp_float.xml */\nint FRINTP_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=001|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E24C000) {\n\t\tdecode_fields32(ENC_FRINTP_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTP_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTP_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTP_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frintx_advsimd.xml */\nint FRINTX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|o2=0|111100|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E799800) {\n\t\tdecode_fields32(ENC_FRINTX_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTX_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E219800) {\n\t\tdecode_fields32(ENC_FRINTX_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTX_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frintx_float.xml */\nint FRINTX_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=110|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E274000) {\n\t\tdecode_fields32(ENC_FRINTX_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTX_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTX_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTX_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frintz_advsimd.xml */\nint FRINTZ_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|o2=1|111100|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xEF99800) {\n\t\tdecode_fields32(ENC_FRINTZ_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTZ_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|opcode[4:1]=1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA19800) {\n\t\tdecode_fields32(ENC_FRINTZ_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->exact = FALSE;\n\t\tif(!(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(((ctx->o1<<1)|ctx->o2));\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(((ctx->U<<2)|(ctx->o1<<1)|ctx->o2)==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tOK(ENC_FRINTZ_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frintz_float.xml */\nint FRINTZ_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=011|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E25C000) {\n\t\tdecode_fields32(ENC_FRINTZ_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->exact = FALSE;\n\t\tif(!(ctx->rmode&4)) {\n\t\t\tctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));\n\t\t}\n\t\telse if(ctx->rmode==4) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t}\n\t\telse if(ctx->rmode==5) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->rmode==6) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->exact = TRUE;\n\t\t}\n\t\telse if(ctx->rmode==7) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FRINTZ_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FRINTZ_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FRINTZ_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* frsqrte_advsimd.xml */\nint FRSQRTE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7EF9D800) {\n\t\tdecode_fields32(ENC_FRSQRTE_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRSQRTE_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7EA1D800) {\n\t\tdecode_fields32(ENC_FRSQRTE_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRSQRTE_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF9D800) {\n\t\tdecode_fields32(ENC_FRSQRTE_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRSQRTE_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA1D800) {\n\t\tdecode_fields32(ENC_FRSQRTE_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRSQRTE_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* frsqrts_advsimd.xml */\nint FRSQRTS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=1|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5EC03C00) {\n\t\tdecode_fields32(ENC_FRSQRTS_ASISDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRSQRTS_ASISDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=1|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x5EA0FC00) {\n\t\tdecode_fields32(ENC_FRSQRTS_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tOK(ENC_FRSQRTS_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEC03C00) {\n\t\tdecode_fields32(ENC_FRSQRTS_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRSQRTS_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xEA0FC00) {\n\t\tdecode_fields32(ENC_FRSQRTS_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FRSQRTS_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fsqrt_advsimd.xml */\nint FSQRT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=1|01110|a=1|111100|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2EF9F800) {\n\t\tdecode_fields32(ENC_FSQRT_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FSQRT_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA1F800) {\n\t\tdecode_fields32(ENC_FSQRT_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_FSQRT_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* fsqrt_float.xml */\nint FSQRT_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|opcode[5:2]=0000|opc=11|10000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x1E21C000) {\n\t\tdecode_fields32(ENC_FSQRT_H_FLOATDP1, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!ctx->opc) {\n\t\t\tctx->fpop = FPUnaryOp_MOV;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->fpop = FPUnaryOp_ABS;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->fpop = FPUnaryOp_NEG;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->fpop = FPUnaryOp_SQRT;\n\t\t}\n\t\tif(ctx->ftype==3) OK(ENC_FSQRT_H_FLOATDP1);\n\t\tif(ctx->ftype==0) OK(ENC_FSQRT_S_FLOATDP1);\n\t\tif(ctx->ftype==1) OK(ENC_FSQRT_D_FLOATDP1);\n\t}\n\treturn rc;\n}\n\n/* fsub_advsimd.xml */\nint FSUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEC01400) {\n\t\tdecode_fields32(ENC_FSUB_ASIMDSAMEFP16_ONLY, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->abs = (ctx->U==1);\n\t\tOK(ENC_FSUB_ASIMDSAMEFP16_ONLY);\n\t}\n\t/* class iclass_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFA0FC00)==0xEA0D400) {\n\t\tdecode_fields32(ENC_FSUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->abs = (ctx->U==1);\n\t\tOK(ENC_FSUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* fsub_float.xml */\nint FSUB_float(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode[3:1]=001|op=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x1E203800) {\n\t\tdecode_fields32(ENC_FSUB_H_FLOATDP2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!ctx->ftype) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->esize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tctx->sub_op = (ctx->op==1);\n\t\tif(ctx->ftype==3) OK(ENC_FSUB_H_FLOATDP2);\n\t\tif(ctx->ftype==0) OK(ENC_FSUB_S_FLOATDP2);\n\t\tif(ctx->ftype==1) OK(ENC_FSUB_D_FLOATDP2);\n\t}\n\treturn rc;\n}\n\n/* gmi.xml */\nint GMI(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000101|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9AC01400) {\n\t\tdecode_fields32(ENC_GMI_64G_DP_2SRC, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->m = UINT(ctx->Xm);\n\t\tOK(ENC_GMI_64G_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* hint.xml */\nint HINT(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=xxxx|op2=xxx|Rt=11111 */\n\tif((INSWORD & 0xFFFFF01F)==0xD503201F) {\n\t\tdecode_fields32(ENC_HINT_HM_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_HINT_HM_HINTS);\n\t}\n\treturn rc;\n}\n\n/* hlt.xml */\nint HLT(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=010|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=00 */\n\tif((INSWORD & 0xFFE0001F)==0xD4400000) {\n\t\tdecode_fields32(ENC_HLT_EX_EXCEPTION, ctx, instr);\n\t\tif(ctx->EDSCR_HDE==0 || !HaltingAllowed()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(HaveBTIExt()) {\n\t\t\tSetBTypeCompatible(TRUE);\n\t\t}\n\t\tOK(ENC_HLT_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* hvc.xml */\nint HVC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=10 */\n\tif((INSWORD & 0xFFE0001F)==0xD4000002) {\n\t\tdecode_fields32(ENC_HVC_EX_EXCEPTION, ctx, instr);\n\t\tOK(ENC_HVC_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* ic_sys.xml */\nint IC_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF8F000)==0xD5087000) {\n\t\tdecode_fields32(ENC_IC_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_IC_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* ins_advsimd_elt.xml */\nint INS_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=1|op=1|01110000|imm5=xxxxx|0|imm4=xxxx|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08400)==0x6E000400) {\n\t\tdecode_fields32(ENC_INS_ASIMDINS_IV_V, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->size = LowestSetBit(ctx->imm5);\n\t\tif(ctx->size>3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dst_index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->src_index = UINT(SLICE(ctx->imm4,3,ctx->size));\n\t\tctx->idxdsize = (SLICE(ctx->imm4,3,3)==1) ? 0x80 : 0x40;\n\t\tctx->esize = (8) << (ctx->size);\n\t\t/* unconditional alias */\n\t\tif(MOV_INS_advsimd_elt(ctx, instr)==0) return 0;\n\t\tOK(ENC_INS_ASIMDINS_IV_V);\n\t}\n\treturn rc;\n}\n\n/* ins_advsimd_gen.xml */\nint INS_advsimd_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=1|op=0|01110000|imm5=xxxxx|0|imm4=0011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E001C00) {\n\t\tdecode_fields32(ENC_INS_ASIMDINS_IR_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->size = LowestSetBit(ctx->imm5);\n\t\tif(ctx->size>3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = 0x80;\n\t\t/* unconditional alias */\n\t\tif(MOV_INS_advsimd_gen(ctx, instr)==0) return 0;\n\t\tOK(ENC_INS_ASIMDINS_IR_R);\n\t}\n\treturn rc;\n}\n\n/* irg.xml */\nint IRG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000100|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9AC01000) {\n\t\tdecode_fields32(ENC_IRG_64I_DP_2SRC, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->m = UINT(ctx->Xm);\n\t\tOK(ENC_IRG_64I_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* isb.xml */\nint ISB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|op2[2]=1|opc=10|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD50330DF) {\n\t\tdecode_fields32(ENC_ISB_BI_BARRIERS, ctx, instr);\n\t\tOK(ENC_ISB_BI_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* ld1r_advsimd.xml */\nint LD1R_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=0|00000|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xD40C000) {\n\t\tdecode_fields32(ENC_LD1R_ASISDLSO_R1, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD1R_ASISDLSO_R1);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xDC0C000) {\n\t\tdecode_fields32(ENC_LD1R_ASISDLSOP_R1_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD1R_ASISDLSOP_R1_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD1R_ASISDLSOP_RX1_R);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld1_advsimd_mult.xml */\nint LD1_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=1|000000|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xC402000) {\n\t\tdecode_fields32(ENC_LD1_ASISDLSE_R1_1V, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==7) OK(ENC_LD1_ASISDLSE_R1_1V);\n\t\tif(ctx->opcode==10) OK(ENC_LD1_ASISDLSE_R2_2V);\n\t\tif(ctx->opcode==6) OK(ENC_LD1_ASISDLSE_R3_3V);\n\t\tif(ctx->opcode==2) OK(ENC_LD1_ASISDLSE_R4_4V);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xCC02000) {\n\t\tdecode_fields32(ENC_LD1_ASISDLSEP_I1_I1, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==7) OK(ENC_LD1_ASISDLSEP_I1_I1);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==7) OK(ENC_LD1_ASISDLSEP_R1_R1);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==10) OK(ENC_LD1_ASISDLSEP_I2_I2);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==10) OK(ENC_LD1_ASISDLSEP_R2_R2);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==6) OK(ENC_LD1_ASISDLSEP_I3_I3);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==6) OK(ENC_LD1_ASISDLSEP_R3_R3);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2) OK(ENC_LD1_ASISDLSEP_I4_I4);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2) OK(ENC_LD1_ASISDLSEP_R4_R4);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* ld1_advsimd_sngl.xml */\nint LD1_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=0|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD400000) {\n\t\tdecode_fields32(ENC_LD1_ASISDLSO_B1_1B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==0) OK(ENC_LD1_ASISDLSO_B1_1B);\n\t\tif(ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD1_ASISDLSO_H1_1H);\n\t\tif(ctx->opcode==4 && ctx->size==0) OK(ENC_LD1_ASISDLSO_S1_1S);\n\t\tif(ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD1_ASISDLSO_D1_1D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDC00000) {\n\t\tdecode_fields32(ENC_LD1_ASISDLSOP_B1_I1B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==0) OK(ENC_LD1_ASISDLSOP_B1_I1B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==0) OK(ENC_LD1_ASISDLSOP_BX1_R1B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD1_ASISDLSOP_H1_I1H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD1_ASISDLSOP_HX1_R1H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_LD1_ASISDLSOP_S1_I1S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_LD1_ASISDLSOP_SX1_R1S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD1_ASISDLSOP_D1_I1D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD1_ASISDLSOP_DX1_R1D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld2r_advsimd.xml */\nint LD2R_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=1|00000|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xD60C000) {\n\t\tdecode_fields32(ENC_LD2R_ASISDLSO_R2, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD2R_ASISDLSO_R2);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xDE0C000) {\n\t\tdecode_fields32(ENC_LD2R_ASISDLSOP_R2_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD2R_ASISDLSOP_R2_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD2R_ASISDLSOP_RX2_R);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld2_advsimd_mult.xml */\nint LD2_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=1|000000|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC408000) {\n\t\tdecode_fields32(ENC_LD2_ASISDLSE_R2, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD2_ASISDLSE_R2);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xCC08000) {\n\t\tdecode_fields32(ENC_LD2_ASISDLSEP_I2_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD2_ASISDLSEP_I2_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD2_ASISDLSEP_R2_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* ld2_advsimd_sngl.xml */\nint LD2_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=1|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD600000) {\n\t\tdecode_fields32(ENC_LD2_ASISDLSO_B2_2B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==0) OK(ENC_LD2_ASISDLSO_B2_2B);\n\t\tif(ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD2_ASISDLSO_H2_2H);\n\t\tif(ctx->opcode==4 && ctx->size==0) OK(ENC_LD2_ASISDLSO_S2_2S);\n\t\tif(ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD2_ASISDLSO_D2_2D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDE00000) {\n\t\tdecode_fields32(ENC_LD2_ASISDLSOP_B2_I2B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==0) OK(ENC_LD2_ASISDLSOP_B2_I2B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==0) OK(ENC_LD2_ASISDLSOP_BX2_R2B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD2_ASISDLSOP_H2_I2H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_LD2_ASISDLSOP_HX2_R2H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_LD2_ASISDLSOP_S2_I2S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_LD2_ASISDLSOP_SX2_R2S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD2_ASISDLSOP_D2_I2D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_LD2_ASISDLSOP_DX2_R2D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld3r_advsimd.xml */\nint LD3R_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=0|00000|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xD40E000) {\n\t\tdecode_fields32(ENC_LD3R_ASISDLSO_R3, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD3R_ASISDLSO_R3);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xDC0E000) {\n\t\tdecode_fields32(ENC_LD3R_ASISDLSOP_R3_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD3R_ASISDLSOP_R3_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD3R_ASISDLSOP_RX3_R);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld3_advsimd_mult.xml */\nint LD3_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=1|000000|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC404000) {\n\t\tdecode_fields32(ENC_LD3_ASISDLSE_R3, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD3_ASISDLSE_R3);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xCC04000) {\n\t\tdecode_fields32(ENC_LD3_ASISDLSEP_I3_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD3_ASISDLSEP_I3_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD3_ASISDLSEP_R3_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* ld3_advsimd_sngl.xml */\nint LD3_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=0|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD402000) {\n\t\tdecode_fields32(ENC_LD3_ASISDLSO_B3_3B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==1) OK(ENC_LD3_ASISDLSO_B3_3B);\n\t\tif(ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD3_ASISDLSO_H3_3H);\n\t\tif(ctx->opcode==5 && ctx->size==0) OK(ENC_LD3_ASISDLSO_S3_3S);\n\t\tif(ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD3_ASISDLSO_D3_3D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDC02000) {\n\t\tdecode_fields32(ENC_LD3_ASISDLSOP_B3_I3B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==1) OK(ENC_LD3_ASISDLSOP_B3_I3B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==1) OK(ENC_LD3_ASISDLSOP_BX3_R3B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD3_ASISDLSOP_H3_I3H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD3_ASISDLSOP_HX3_R3H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_LD3_ASISDLSOP_S3_I3S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_LD3_ASISDLSOP_SX3_R3S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD3_ASISDLSOP_D3_I3D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD3_ASISDLSOP_DX3_R3D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld4r_advsimd.xml */\nint LD4R_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=1|00000|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xD60E000) {\n\t\tdecode_fields32(ENC_LD4R_ASISDLSO_R4, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD4R_ASISDLSO_R4);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xDE0E000) {\n\t\tdecode_fields32(ENC_LD4R_ASISDLSOP_R4_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD4R_ASISDLSOP_R4_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD4R_ASISDLSOP_RX4_R);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld4_advsimd_mult.xml */\nint LD4_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=1|000000|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC400000) {\n\t\tdecode_fields32(ENC_LD4_ASISDLSE_R4, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_LD4_ASISDLSE_R4);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xCC00000) {\n\t\tdecode_fields32(ENC_LD4_ASISDLSEP_I4_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_LD4_ASISDLSEP_I4_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_LD4_ASISDLSEP_R4_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* ld4_advsimd_sngl.xml */\nint LD4_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=1|R=1|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD602000) {\n\t\tdecode_fields32(ENC_LD4_ASISDLSO_B4_4B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==1) OK(ENC_LD4_ASISDLSO_B4_4B);\n\t\tif(ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD4_ASISDLSO_H4_4H);\n\t\tif(ctx->opcode==5 && ctx->size==0) OK(ENC_LD4_ASISDLSO_S4_4S);\n\t\tif(ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD4_ASISDLSO_D4_4D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDE02000) {\n\t\tdecode_fields32(ENC_LD4_ASISDLSOP_B4_I4B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==1) OK(ENC_LD4_ASISDLSOP_B4_I4B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==1) OK(ENC_LD4_ASISDLSOP_BX4_R4B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD4_ASISDLSOP_H4_I4H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_LD4_ASISDLSOP_HX4_R4H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_LD4_ASISDLSOP_S4_I4S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_LD4_ASISDLSOP_SX4_R4S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD4_ASISDLSOP_D4_I4D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_LD4_ASISDLSOP_DX4_R4D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* ld64b.xml */\nint LD64B(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=11|111|V=0|00|A=0|R=0|1|Rs=11111|o3=1|opc=101|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xF83FD000) {\n\t\tdecode_fields32(ENC_LD64B_64L_MEMOP, ctx, instr);\n\t\tif(!HaveFeatLS64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rt,4,3)==3 || SLICE(ctx->Rt,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LD64B_64L_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldadd.xml */\nint LDADD(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8200000) {\n\t\tdecode_fields32(ENC_LDADD_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STADD_LDADD(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDADD_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDADDA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDADDAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDADDL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDADD_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDADDA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDADDAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDADDL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldaddb.xml */\nint LDADDB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38200000) {\n\t\tdecode_fields32(ENC_LDADDAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STADDB_LDADDB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDADDAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDADDALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDADDB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDADDLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldaddh.xml */\nint LDADDH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78200000) {\n\t\tdecode_fields32(ENC_LDADDAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STADDH_LDADDH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDADDAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDADDALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDADDH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDADDLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldapr.xml */\nint LDAPR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xB8A0C000) {\n\t\tdecode_fields32(ENC_LDAPR_32L_MEMOP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = AccType_ORDERED;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2) OK(ENC_LDAPR_32L_MEMOP);\n\t\tif(ctx->size==3) OK(ENC_LDAPR_64L_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldaprb.xml */\nint LDAPRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x38A0C000) {\n\t\tdecode_fields32(ENC_LDAPRB_32L_MEMOP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = AccType_ORDERED;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDAPRB_32L_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldaprh.xml */\nint LDAPRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x78A0C000) {\n\t\tdecode_fields32(ENC_LDAPRH_32L_MEMOP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = AccType_ORDERED;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDAPRH_32L_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldapurb.xml */\nint LDAPURB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x19400000) {\n\t\tdecode_fields32(ENC_LDAPURB_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDAPURB_32_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldapurh.xml */\nint LDAPURH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x59400000) {\n\t\tdecode_fields32(ENC_LDAPURH_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDAPURH_32_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldapursb.xml */\nint LDAPURSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|011001|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x19800000) {\n\t\tdecode_fields32(ENC_LDAPURSB_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDAPURSB_32_LDAPSTL_UNSCALED);\n\t\tif(ctx->opc==2) OK(ENC_LDAPURSB_64_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldapursh.xml */\nint LDAPURSH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|011001|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x59800000) {\n\t\tdecode_fields32(ENC_LDAPURSH_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDAPURSH_32_LDAPSTL_UNSCALED);\n\t\tif(ctx->opc==2) OK(ENC_LDAPURSH_64_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldapursw.xml */\nint LDAPURSW(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=10|011001|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x99800000) {\n\t\tdecode_fields32(ENC_LDAPURSW_64_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDAPURSW_64_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldapur_gen.xml */\nint LDAPUR_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0x99400000) {\n\t\tdecode_fields32(ENC_LDAPUR_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_LDAPUR_32_LDAPSTL_UNSCALED);\n\t\tif(ctx->size==3) OK(ENC_LDAPUR_64_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldar.xml */\nint LDAR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88C08000) {\n\t\tdecode_fields32(ENC_LDAR_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2) OK(ENC_LDAR_LR32_LDSTORD);\n\t\tif(ctx->size==3) OK(ENC_LDAR_LR64_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldarb.xml */\nint LDARB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8C08000) {\n\t\tdecode_fields32(ENC_LDARB_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDARB_LR32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldarh.xml */\nint LDARH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48C08000) {\n\t\tdecode_fields32(ENC_LDARH_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDARH_LR32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldaxp.xml */\nint LDAXP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* 1|sz=x|001000|o2=0|L=1|o1=1|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88608000) {\n\t\tdecode_fields32(ENC_LDAXP_LP32_LDSTEXCLP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = TRUE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (0x20) << (UINT(ctx->sz));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->sz==0) OK(ENC_LDAXP_LP32_LDSTEXCLP);\n\t\tif(ctx->sz==1) OK(ENC_LDAXP_LP64_LDSTEXCLP);\n\t}\n\treturn rc;\n}\n\n/* ldaxr.xml */\nint LDAXR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88408000) {\n\t\tdecode_fields32(ENC_LDAXR_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->size==2) OK(ENC_LDAXR_LR32_LDSTEXCLR);\n\t\tif(ctx->size==3) OK(ENC_LDAXR_LR64_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* ldaxrb.xml */\nint LDAXRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8408000) {\n\t\tdecode_fields32(ENC_LDAXRB_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_LDAXRB_LR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* ldaxrh.xml */\nint LDAXRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48408000) {\n\t\tdecode_fields32(ENC_LDAXRH_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_LDAXRH_LR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* ldclr.xml */\nint LDCLR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8201000) {\n\t\tdecode_fields32(ENC_LDCLR_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STCLR_LDCLR(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDCLR_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDCLRA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDCLRAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDCLRL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDCLR_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDCLRA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDCLRAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDCLRL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldclrb.xml */\nint LDCLRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38201000) {\n\t\tdecode_fields32(ENC_LDCLRAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STCLRB_LDCLRB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDCLRAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDCLRALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDCLRB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDCLRLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldclrh.xml */\nint LDCLRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78201000) {\n\t\tdecode_fields32(ENC_LDCLRAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STCLRH_LDCLRH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDCLRAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDCLRALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDCLRH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDCLRLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldeor.xml */\nint LDEOR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8202000) {\n\t\tdecode_fields32(ENC_LDEOR_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STEOR_LDEOR(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDEOR_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDEORA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDEORAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDEORL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDEOR_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDEORA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDEORAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDEORL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldeorb.xml */\nint LDEORB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38202000) {\n\t\tdecode_fields32(ENC_LDEORAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STEORB_LDEORB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDEORAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDEORALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDEORB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDEORLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldeorh.xml */\nint LDEORH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78202000) {\n\t\tdecode_fields32(ENC_LDEORAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STEORH_LDEORH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDEORAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDEORALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDEORH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDEORLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldg.xml */\nint LDG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=00|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9600000) {\n\t\tdecode_fields32(ENC_LDG_64LOFFSET_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tOK(ENC_LDG_64LOFFSET_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* ldgm.xml */\nint LDGM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 11011001|opc=11|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xD9E00000) {\n\t\tdecode_fields32(ENC_LDGM_64BULK_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTE2Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tOK(ENC_LDGM_64BULK_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* ldlar.xml */\nint LDLAR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88C00000) {\n\t\tdecode_fields32(ENC_LDLAR_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2) OK(ENC_LDLAR_LR32_LDSTORD);\n\t\tif(ctx->size==3) OK(ENC_LDLAR_LR64_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldlarb.xml */\nint LDLARB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8C00000) {\n\t\tdecode_fields32(ENC_LDLARB_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDLARB_LR32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldlarh.xml */\nint LDLARH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48C00000) {\n\t\tdecode_fields32(ENC_LDLARH_LR32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_LDLARH_LR32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* ldnp_fpsimd.xml */\nint LDNP_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=xx|101|V=1|000|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2C400000) {\n\t\tdecode_fields32(ENC_LDNP_S_LDSTNAPAIR_OFFS, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDNP_S_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==1) OK(ENC_LDNP_D_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==2) OK(ENC_LDNP_Q_LDSTNAPAIR_OFFS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_VECSTREAM;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(ctx->opc);\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldnp_gen.xml */\nint LDNP_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=x0|101|V=0|000|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x28400000) {\n\t\tdecode_fields32(ENC_LDNP_32_LDSTNAPAIR_OFFS, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDNP_32_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==2) OK(ENC_LDNP_64_LDSTNAPAIR_OFFS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_STREAM;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(SLICE(ctx->opc,0,0)==1) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(SLICE(ctx->opc,1,1));\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldpsw.xml */\nint LDPSW(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=01|101|V=0|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x68C00000) {\n\t\tdecode_fields32(ENC_LDPSW_64_LDSTPAIR_POST, ctx, instr);\n\t\tOK(ENC_LDPSW_64_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=01|101|V=0|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x69C00000) {\n\t\tdecode_fields32(ENC_LDPSW_64_LDSTPAIR_PRE, ctx, instr);\n\t\tOK(ENC_LDPSW_64_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=01|101|V=0|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x69400000) {\n\t\tdecode_fields32(ENC_LDPSW_64_LDSTPAIR_OFF, ctx, instr);\n\t\tOK(ENC_LDPSW_64_LDSTPAIR_OFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(((ctx->L<<1)|SLICE(ctx->opc,0,0))==1 || ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->signed_ = (SLICE(ctx->opc,0,0)!=0);\n\tctx->scale = 2+UINT(SLICE(ctx->opc,1,1));\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tctx->wb_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldp_fpsimd.xml */\nint LDP_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=xx|101|V=1|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2CC00000) {\n\t\tdecode_fields32(ENC_LDP_S_LDSTPAIR_POST, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_S_LDSTPAIR_POST);\n\t\tif(ctx->opc==1) OK(ENC_LDP_D_LDSTPAIR_POST);\n\t\tif(ctx->opc==2) OK(ENC_LDP_Q_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=xx|101|V=1|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2DC00000) {\n\t\tdecode_fields32(ENC_LDP_S_LDSTPAIR_PRE, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_S_LDSTPAIR_PRE);\n\t\tif(ctx->opc==1) OK(ENC_LDP_D_LDSTPAIR_PRE);\n\t\tif(ctx->opc==2) OK(ENC_LDP_Q_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=xx|101|V=1|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2D400000) {\n\t\tdecode_fields32(ENC_LDP_S_LDSTPAIR_OFF, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_S_LDSTPAIR_OFF);\n\t\tif(ctx->opc==1) OK(ENC_LDP_D_LDSTPAIR_OFF);\n\t\tif(ctx->opc==2) OK(ENC_LDP_Q_LDSTPAIR_OFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(ctx->opc);\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldp_gen.xml */\nint LDP_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=x0|101|V=0|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x28C00000) {\n\t\tdecode_fields32(ENC_LDP_32_LDSTPAIR_POST, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_32_LDSTPAIR_POST);\n\t\tif(ctx->opc==2) OK(ENC_LDP_64_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=x0|101|V=0|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x29C00000) {\n\t\tdecode_fields32(ENC_LDP_32_LDSTPAIR_PRE, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_32_LDSTPAIR_PRE);\n\t\tif(ctx->opc==2) OK(ENC_LDP_64_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=x0|101|V=0|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x29400000) {\n\t\tdecode_fields32(ENC_LDP_32_LDSTPAIR_OFF, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_LDP_32_LDSTPAIR_OFF);\n\t\tif(ctx->opc==2) OK(ENC_LDP_64_LDSTPAIR_OFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(((ctx->L<<1)|SLICE(ctx->opc,0,0))==1 || ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->signed_ = (SLICE(ctx->opc,0,0)!=0);\n\tctx->scale = 2+UINT(SLICE(ctx->opc,1,1));\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tctx->wb_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldra.xml */\nint LDRA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=11|111|V=0|00|M=x|S=x|1|imm9=xxxxxxxxx|W=x|1|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF200400)==0xF8200400) {\n\t\tdecode_fields32(ENC_LDRAA_64_LDST_PAC, ctx, instr);\n\t\tif(!HavePACExt() || ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->wback = (ctx->W==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->S10 = ((ctx->S<<9)|ctx->imm9);\n\t\tctx->scale = 3;\n\t\tctx->offset = LSL(SignExtend(ctx->S10,10),ctx->scale);\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->M==0 && ctx->W==0) OK(ENC_LDRAA_64_LDST_PAC);\n\t\tif(ctx->M==0 && ctx->W==1) OK(ENC_LDRAA_64W_LDST_PAC);\n\t\tif(ctx->M==1 && ctx->W==0) OK(ENC_LDRAB_64_LDST_PAC);\n\t\tif(ctx->M==1 && ctx->W==1) OK(ENC_LDRAB_64W_LDST_PAC);\n\t}\n\treturn rc;\n}\n\n/* ldrb_imm.xml */\nint LDRB_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38400400) {\n\t\tdecode_fields32(ENC_LDRB_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRB_32_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38400C00) {\n\t\tdecode_fields32(ENC_LDRB_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRB_32_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=00|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x39400000) {\n\t\tdecode_fields32(ENC_LDRB_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_LDRB_32_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrb_reg.xml */\nint LDRB_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32 */\n\t/* size=00|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38600800) {\n\t\tdecode_fields32(ENC_LDRB_32B_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->option!=3) OK(ENC_LDRB_32B_LDST_REGOFF);\n\t\tif(ctx->option==3) OK(ENC_LDRB_32BL_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrh_imm.xml */\nint LDRH_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78400400) {\n\t\tdecode_fields32(ENC_LDRH_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRH_32_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78400C00) {\n\t\tdecode_fields32(ENC_LDRH_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRH_32_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=01|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x79400000) {\n\t\tdecode_fields32(ENC_LDRH_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_LDRH_32_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrh_reg.xml */\nint LDRH_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32 */\n\t/* size=01|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78600800) {\n\t\tdecode_fields32(ENC_LDRH_32_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tOK(ENC_LDRH_32_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsb_imm.xml */\nint LDRSB_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x38800400) {\n\t\tdecode_fields32(ENC_LDRSB_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDRSB_32_LDST_IMMPOST);\n\t\tif(ctx->opc==2) OK(ENC_LDRSB_64_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x38800C00) {\n\t\tdecode_fields32(ENC_LDRSB_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDRSB_32_LDST_IMMPRE);\n\t\tif(ctx->opc==2) OK(ENC_LDRSB_64_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=00|111|V=0|01|opc=1x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF800000)==0x39800000) {\n\t\tdecode_fields32(ENC_LDRSB_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->opc==3) OK(ENC_LDRSB_32_LDST_POS);\n\t\tif(ctx->opc==2) OK(ENC_LDRSB_64_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsb_reg.xml */\nint LDRSB_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|opc=1x|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x38A00800) {\n\t\tdecode_fields32(ENC_LDRSB_32B_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->opc==3 && ctx->option!=3) OK(ENC_LDRSB_32B_LDST_REGOFF);\n\t\tif(ctx->opc==3 && ctx->option==3) OK(ENC_LDRSB_32BL_LDST_REGOFF);\n\t\tif(ctx->opc==2 && ctx->option!=3) OK(ENC_LDRSB_64B_LDST_REGOFF);\n\t\tif(ctx->opc==2 && ctx->option==3) OK(ENC_LDRSB_64BL_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsh_imm.xml */\nint LDRSH_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x78800400) {\n\t\tdecode_fields32(ENC_LDRSH_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDRSH_32_LDST_IMMPOST);\n\t\tif(ctx->opc==2) OK(ENC_LDRSH_64_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x78800C00) {\n\t\tdecode_fields32(ENC_LDRSH_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDRSH_32_LDST_IMMPRE);\n\t\tif(ctx->opc==2) OK(ENC_LDRSH_64_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=01|111|V=0|01|opc=1x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF800000)==0x79800000) {\n\t\tdecode_fields32(ENC_LDRSH_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->opc==3) OK(ENC_LDRSH_32_LDST_POS);\n\t\tif(ctx->opc==2) OK(ENC_LDRSH_64_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsh_reg.xml */\nint LDRSH_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|opc=1x|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x78A00800) {\n\t\tdecode_fields32(ENC_LDRSH_32_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->opc==3) OK(ENC_LDRSH_32_LDST_REGOFF);\n\t\tif(ctx->opc==2) OK(ENC_LDRSH_64_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsw_imm.xml */\nint LDRSW_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xB8800400) {\n\t\tdecode_fields32(ENC_LDRSW_64_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRSW_64_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xB8800C00) {\n\t\tdecode_fields32(ENC_LDRSW_64_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDRSW_64_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=10|111|V=0|01|opc=10|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0xB9800000) {\n\t\tdecode_fields32(ENC_LDRSW_64_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_LDRSW_64_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldrsw_lit.xml */\nint LDRSW_lit(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* opc=10|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF000000)==0x98000000) {\n\t\tdecode_fields32(ENC_LDRSW_64_LOADLIT, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->memop = MemOp_LOAD;\n\t\tctx->signed_ = FALSE;\n\t\tif(!ctx->opc) {\n\t\t\tctx->size = 4;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->size = 8;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->size = 4;\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t}\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tctx->tag_checked = FALSE;\n\t\tOK(ENC_LDRSW_64_LOADLIT);\n\t}\n\treturn rc;\n}\n\n/* ldrsw_reg.xml */\nint LDRSW_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* size=10|111|V=0|00|opc=10|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xB8A00800) {\n\t\tdecode_fields32(ENC_LDRSW_64_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tOK(ENC_LDRSW_64_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldr_imm_fpsimd.xml */\nint LDR_imm_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C400400) {\n\t\tdecode_fields32(ENC_LDR_B_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==1) OK(ENC_LDR_B_LDST_IMMPOST);\n\t\tif(ctx->size==1 && ctx->opc==1) OK(ENC_LDR_H_LDST_IMMPOST);\n\t\tif(ctx->size==2 && ctx->opc==1) OK(ENC_LDR_S_LDST_IMMPOST);\n\t\tif(ctx->size==3 && ctx->opc==1) OK(ENC_LDR_D_LDST_IMMPOST);\n\t\tif(ctx->size==0 && ctx->opc==3) OK(ENC_LDR_Q_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C400C00) {\n\t\tdecode_fields32(ENC_LDR_B_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==1) OK(ENC_LDR_B_LDST_IMMPRE);\n\t\tif(ctx->size==1 && ctx->opc==1) OK(ENC_LDR_H_LDST_IMMPRE);\n\t\tif(ctx->size==2 && ctx->opc==1) OK(ENC_LDR_S_LDST_IMMPRE);\n\t\tif(ctx->size==3 && ctx->opc==1) OK(ENC_LDR_D_LDST_IMMPRE);\n\t\tif(ctx->size==0 && ctx->opc==3) OK(ENC_LDR_Q_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=xx|111|V=1|01|opc=x1|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F400000)==0x3D400000) {\n\t\tdecode_fields32(ENC_LDR_B_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->size==0 && ctx->opc==1) OK(ENC_LDR_B_LDST_POS);\n\t\tif(ctx->size==1 && ctx->opc==1) OK(ENC_LDR_H_LDST_POS);\n\t\tif(ctx->size==2 && ctx->opc==1) OK(ENC_LDR_S_LDST_POS);\n\t\tif(ctx->size==3 && ctx->opc==1) OK(ENC_LDR_D_LDST_POS);\n\t\tif(ctx->size==0 && ctx->opc==3) OK(ENC_LDR_Q_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\treturn rc;\n}\n\n/* ldr_imm_gen.xml */\nint LDR_imm_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8400400) {\n\t\tdecode_fields32(ENC_LDR_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_LDR_32_LDST_IMMPOST);\n\t\tif(ctx->size==3) OK(ENC_LDR_64_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8400C00) {\n\t\tdecode_fields32(ENC_LDR_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_LDR_32_LDST_IMMPRE);\n\t\tif(ctx->size==3) OK(ENC_LDR_64_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=1x|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFC00000)==0xB9400000) {\n\t\tdecode_fields32(ENC_LDR_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->size==2) OK(ENC_LDR_32_LDST_POS);\n\t\tif(ctx->size==3) OK(ENC_LDR_64_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldr_lit_fpsimd.xml */\nint LDR_lit_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* opc=xx|011|V=1|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F000000)==0x1C000000) {\n\t\tdecode_fields32(ENC_LDR_S_LOADLIT, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tif(!ctx->opc) {\n\t\t\tctx->size = 4;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->size = 8;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->size = 0x10;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tctx->tag_checked = FALSE;\n\t\tif(ctx->opc==0) OK(ENC_LDR_S_LOADLIT);\n\t\tif(ctx->opc==1) OK(ENC_LDR_D_LOADLIT);\n\t\tif(ctx->opc==2) OK(ENC_LDR_Q_LOADLIT);\n\t}\n\treturn rc;\n}\n\n/* ldr_lit_gen.xml */\nint LDR_lit_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* opc=0x|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF000000)==0x18000000) {\n\t\tdecode_fields32(ENC_LDR_32_LOADLIT, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->memop = MemOp_LOAD;\n\t\tctx->signed_ = FALSE;\n\t\tif(!ctx->opc) {\n\t\t\tctx->size = 4;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->size = 8;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->size = 4;\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t}\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tctx->tag_checked = FALSE;\n\t\tif(ctx->opc==0) OK(ENC_LDR_32_LOADLIT);\n\t\tif(ctx->opc==1) OK(ENC_LDR_64_LOADLIT);\n\t}\n\treturn rc;\n}\n\n/* ldr_reg_fpsimd.xml */\nint LDR_reg_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fpsimd */\n\t/* size=xx|111|V=1|00|opc=x1|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C600800) {\n\t\tdecode_fields32(ENC_LDR_B_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->size==0 && ctx->opc==1 && ctx->option!=3) OK(ENC_LDR_B_LDST_REGOFF);\n\t\tif(ctx->size==0 && ctx->opc==1 && ctx->option==3) OK(ENC_LDR_BL_LDST_REGOFF);\n\t\tif(ctx->size==1 && ctx->opc==1) OK(ENC_LDR_H_LDST_REGOFF);\n\t\tif(ctx->size==2 && ctx->opc==1) OK(ENC_LDR_S_LDST_REGOFF);\n\t\tif(ctx->size==3 && ctx->opc==1) OK(ENC_LDR_D_LDST_REGOFF);\n\t\tif(ctx->size==0 && ctx->opc==3) OK(ENC_LDR_Q_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\treturn rc;\n}\n\n/* ldr_reg_gen.xml */\nint LDR_reg_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8600800) {\n\t\tdecode_fields32(ENC_LDR_32_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->size==2) OK(ENC_LDR_32_LDST_REGOFF);\n\t\tif(ctx->size==3) OK(ENC_LDR_64_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldset.xml */\nint LDSET(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8203000) {\n\t\tdecode_fields32(ENC_LDSET_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSET_LDSET(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDSET_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDSETA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDSETAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDSETL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDSET_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDSETA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDSETAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDSETL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsetb.xml */\nint LDSETB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38203000) {\n\t\tdecode_fields32(ENC_LDSETAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSETB_LDSETB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSETAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSETALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSETB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSETLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldseth.xml */\nint LDSETH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78203000) {\n\t\tdecode_fields32(ENC_LDSETAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSETH_LDSETH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSETAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSETALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSETH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSETLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsmax.xml */\nint LDSMAX(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8204000) {\n\t\tdecode_fields32(ENC_LDSMAX_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMAX_LDSMAX(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDSMAX_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDSMAXA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDSMAXAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDSMAXL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDSMAX_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDSMAXA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDSMAXAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDSMAXL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsmaxb.xml */\nint LDSMAXB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38204000) {\n\t\tdecode_fields32(ENC_LDSMAXAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMAXB_LDSMAXB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSMAXAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSMAXALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSMAXB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSMAXLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsmaxh.xml */\nint LDSMAXH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78204000) {\n\t\tdecode_fields32(ENC_LDSMAXAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMAXH_LDSMAXH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSMAXAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSMAXALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSMAXH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSMAXLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsmin.xml */\nint LDSMIN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8205000) {\n\t\tdecode_fields32(ENC_LDSMIN_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMIN_LDSMIN(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDSMIN_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDSMINA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDSMINAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDSMINL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDSMIN_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDSMINA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDSMINAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDSMINL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsminb.xml */\nint LDSMINB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38205000) {\n\t\tdecode_fields32(ENC_LDSMINAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMINB_LDSMINB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSMINAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSMINALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSMINB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSMINLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldsminh.xml */\nint LDSMINH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78205000) {\n\t\tdecode_fields32(ENC_LDSMINAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STSMINH_LDSMINH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDSMINAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDSMINALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDSMINH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDSMINLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldtr.xml */\nint LDTR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8400800) {\n\t\tdecode_fields32(ENC_LDTR_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_LDTR_32_LDST_UNPRIV);\n\t\tif(ctx->size==3) OK(ENC_LDTR_64_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldtrb.xml */\nint LDTRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38400800) {\n\t\tdecode_fields32(ENC_LDTRB_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDTRB_32_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldtrh.xml */\nint LDTRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78400800) {\n\t\tdecode_fields32(ENC_LDTRH_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDTRH_32_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldtrsb.xml */\nint LDTRSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x38800800) {\n\t\tdecode_fields32(ENC_LDTRSB_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDTRSB_32_LDST_UNPRIV);\n\t\tif(ctx->opc==2) OK(ENC_LDTRSB_64_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldtrsh.xml */\nint LDTRSH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x78800800) {\n\t\tdecode_fields32(ENC_LDTRSH_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDTRSH_32_LDST_UNPRIV);\n\t\tif(ctx->opc==2) OK(ENC_LDTRSH_64_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldtrsw.xml */\nint LDTRSW(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xB8800800) {\n\t\tdecode_fields32(ENC_LDTRSW_64_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDTRSW_64_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldumax.xml */\nint LDUMAX(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8206000) {\n\t\tdecode_fields32(ENC_LDUMAX_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMAX_LDUMAX(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDUMAX_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDUMAXA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDUMAXAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDUMAXL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDUMAX_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDUMAXA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDUMAXAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDUMAXL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldumaxb.xml */\nint LDUMAXB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38206000) {\n\t\tdecode_fields32(ENC_LDUMAXAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMAXB_LDUMAXB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDUMAXAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDUMAXALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDUMAXB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDUMAXLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldumaxh.xml */\nint LDUMAXH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78206000) {\n\t\tdecode_fields32(ENC_LDUMAXAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMAXH_LDUMAXH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDUMAXAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDUMAXALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDUMAXH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDUMAXLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldumin.xml */\nint LDUMIN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8207000) {\n\t\tdecode_fields32(ENC_LDUMIN_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMIN_LDUMIN(ctx, instr);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDUMIN_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDUMINA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDUMINAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDUMINL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDUMIN_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDUMINA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDUMINAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDUMINL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* lduminb.xml */\nint LDUMINB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38207000) {\n\t\tdecode_fields32(ENC_LDUMINAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMINB_LDUMINB(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDUMINAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDUMINALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDUMINB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDUMINLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* lduminh.xml */\nint LDUMINH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78207000) {\n\t\tdecode_fields32(ENC_LDUMINAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = MemAtomicOp_ADD;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = MemAtomicOp_BIC;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = MemAtomicOp_EOR;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = MemAtomicOp_ORR;\n\t\t}\n\t\telse if(ctx->opc==4) {\n\t\t\tctx->op = MemAtomicOp_SMAX;\n\t\t}\n\t\telse if(ctx->opc==5) {\n\t\t\tctx->op = MemAtomicOp_SMIN;\n\t\t}\n\t\telse if(ctx->opc==6) {\n\t\t\tctx->op = MemAtomicOp_UMAX;\n\t\t}\n\t\telse if(ctx->opc==7) {\n\t\t\tctx->op = MemAtomicOp_UMIN;\n\t\t}\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\t/* regular aliases */\n\t\tif(ctx->A==0 && ctx->Rt==0x1f) return STUMINH_LDUMINH(ctx, instr);\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_LDUMINAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_LDUMINALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_LDUMINH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_LDUMINLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* ldurb.xml */\nint LDURB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38400000) {\n\t\tdecode_fields32(ENC_LDURB_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDURB_32_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldurh.xml */\nint LDURH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78400000) {\n\t\tdecode_fields32(ENC_LDURH_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDURH_32_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldursb.xml */\nint LDURSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x38800000) {\n\t\tdecode_fields32(ENC_LDURSB_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDURSB_32_LDST_UNSCALED);\n\t\tif(ctx->opc==2) OK(ENC_LDURSB_64_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldursh.xml */\nint LDURSH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFA00C00)==0x78800000) {\n\t\tdecode_fields32(ENC_LDURSH_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->opc==3) OK(ENC_LDURSH_32_LDST_UNSCALED);\n\t\tif(ctx->opc==2) OK(ENC_LDURSH_64_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldursw.xml */\nint LDURSW(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xB8800000) {\n\t\tdecode_fields32(ENC_LDURSW_64_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_LDURSW_64_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldur_fpsimd.xml */\nint LDUR_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C400000) {\n\t\tdecode_fields32(ENC_LDUR_B_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==1) OK(ENC_LDUR_B_LDST_UNSCALED);\n\t\tif(ctx->size==1 && ctx->opc==1) OK(ENC_LDUR_H_LDST_UNSCALED);\n\t\tif(ctx->size==2 && ctx->opc==1) OK(ENC_LDUR_S_LDST_UNSCALED);\n\t\tif(ctx->size==3 && ctx->opc==1) OK(ENC_LDUR_D_LDST_UNSCALED);\n\t\tif(ctx->size==0 && ctx->opc==3) OK(ENC_LDUR_Q_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\treturn rc;\n}\n\n/* ldur_gen.xml */\nint LDUR_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8400000) {\n\t\tdecode_fields32(ENC_LDUR_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_LDUR_32_LDST_UNSCALED);\n\t\tif(ctx->size==3) OK(ENC_LDUR_64_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* ldxp.xml */\nint LDXP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* 1|sz=x|001000|o2=0|L=1|o1=1|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88600000) {\n\t\tdecode_fields32(ENC_LDXP_LP32_LDSTEXCLP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = TRUE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (0x20) << (UINT(ctx->sz));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->sz==0) OK(ENC_LDXP_LP32_LDSTEXCLP);\n\t\tif(ctx->sz==1) OK(ENC_LDXP_LP64_LDSTEXCLP);\n\t}\n\treturn rc;\n}\n\n/* ldxr.xml */\nint LDXR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88400000) {\n\t\tdecode_fields32(ENC_LDXR_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->size==2) OK(ENC_LDXR_LR32_LDSTEXCLR);\n\t\tif(ctx->size==3) OK(ENC_LDXR_LR64_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* ldxrb.xml */\nint LDXRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8400000) {\n\t\tdecode_fields32(ENC_LDXRB_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_LDXRB_LR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* ldxrh.xml */\nint LDXRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48400000) {\n\t\tdecode_fields32(ENC_LDXRH_LR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_LDXRH_LR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* lslv.xml */\nint LSLV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02000) {\n\t\tdecode_fields32(ENC_LSLV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->shift_type = DecodeShift(ctx->op2);\n\t\t/* unconditional alias */\n\t\tif(LSL_LSLV(ctx, instr)==0) return 0;\n\t\tif(ctx->sf==0) OK(ENC_LSLV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_LSLV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* lsl_lslv.xml */\nint LSL_LSLV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02000) {\n\t\tdecode_fields32(ENC_LSL_LSLV_32_DP_2SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_LSL_LSLV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_LSL_LSLV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* lsl_ubfm.xml */\nint LSL_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x53000000) {\n\t\tdecode_fields32(ENC_LSL_UBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0 && ctx->imms!=0x1f) OK(ENC_LSL_UBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1 && ctx->imms!=0x3f) OK(ENC_LSL_UBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* lsrv.xml */\nint LSRV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02400) {\n\t\tdecode_fields32(ENC_LSRV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->shift_type = DecodeShift(ctx->op2);\n\t\t/* unconditional alias */\n\t\tif(LSR_LSRV(ctx, instr)==0) return 0;\n\t\tif(ctx->sf==0) OK(ENC_LSRV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_LSRV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* lsr_lsrv.xml */\nint LSR_LSRV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02400) {\n\t\tdecode_fields32(ENC_LSR_LSRV_32_DP_2SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_LSR_LSRV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_LSR_LSRV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* lsr_ubfm.xml */\nint LSR_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=x11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F807C00)==0x53007C00) {\n\t\tdecode_fields32(ENC_LSR_UBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0 && ctx->imms==0x1f) OK(ENC_LSR_UBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1 && ctx->imms==0x3f) OK(ENC_LSR_UBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* madd.xml */\nint MADD(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE08000)==0x1B000000) {\n\t\tdecode_fields32(ENC_MADD_32A_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->destsize;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return MUL_MADD(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MADD_32A_DP_3SRC);\n\t\tif(ctx->sf==1) OK(ENC_MADD_64A_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* mla_advsimd_elt.xml */\nint MLA_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F000000) {\n\t\tdecode_fields32(ENC_MLA_ASIMDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_MLA_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* mla_advsimd_vec.xml */\nint MLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE209400) {\n\t\tdecode_fields32(ENC_MLA_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_MLA_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* mls_advsimd_elt.xml */\nint MLS_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F004000) {\n\t\tdecode_fields32(ENC_MLS_ASIMDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_MLS_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* mls_advsimd_vec.xml */\nint MLS_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E209400) {\n\t\tdecode_fields32(ENC_MLS_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_MLS_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* mneg_msub.xml */\nint MNEG_MSUB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1B00FC00) {\n\t\tdecode_fields32(ENC_MNEG_MSUB_32A_DP_3SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MNEG_MSUB_32A_DP_3SRC);\n\t\tif(ctx->sf==1) OK(ENC_MNEG_MSUB_64A_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* movi_advsimd.xml */\nint MOVI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=x|0111100000|a=x|b=x|c=x|cmode=xxxx|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0x9FF80C00)==0xF000400) {\n\t\tdecode_fields32(ENC_MOVI_ASIMDIMM_N_B, ctx, instr);\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tif(!(((ctx->cmode<<1)|ctx->op)&0x13)) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==1) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==2) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==3) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x10) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x11) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x12) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x13) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x18) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x19) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1e)==0x1c) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1e) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1f) {\n\t\t\tif(ctx->Q==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\tctx->imm64 = AdvSIMDExpandImm(ctx->op,ctx->cmode,((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h));\n\t\tctx->imm = Replicate(ctx->imm64, ((0x40) ? ((ctx->datasize) / (0x40)) : 0), 64);\n\t\tif(ctx->op==0 && ctx->cmode==14) OK(ENC_MOVI_ASIMDIMM_N_B);\n\t\tif(ctx->op==0 && (ctx->cmode&13)==8) OK(ENC_MOVI_ASIMDIMM_L_HL);\n\t\tif(ctx->op==0 && !(ctx->cmode&9)) OK(ENC_MOVI_ASIMDIMM_L_SL);\n\t\tif(ctx->op==0 && (ctx->cmode&14)==12) OK(ENC_MOVI_ASIMDIMM_M_SM);\n\t\tif(ctx->Q==0 && ctx->op==1 && ctx->cmode==14) OK(ENC_MOVI_ASIMDIMM_D_DS);\n\t\tif(ctx->Q==1 && ctx->op==1 && ctx->cmode==14) OK(ENC_MOVI_ASIMDIMM_D2_D);\n\t}\n\treturn rc;\n}\n\n/* movk.xml */\nint MOVK(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm18_packed */\n\t/* sf=x|opc=11|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x72800000) {\n\t\tdecode_fields32(ENC_MOVK_32_MOVEWIDE, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->imm = ctx->imm16;\n\t\tif(!ctx->opc) {\n\t\t\tctx->opcode = MoveWideOp_N;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->opcode = MoveWideOp_Z;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->opcode = MoveWideOp_K;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->hw,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->pos = UINT((ctx->hw<<4));\n\t\tif(ctx->sf==0 && !(ctx->hw&2)) OK(ENC_MOVK_32_MOVEWIDE);\n\t\tif(ctx->sf==1) OK(ENC_MOVK_64_MOVEWIDE);\n\t}\n\treturn rc;\n}\n\n/* movn.xml */\nint MOVN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm18_packed */\n\t/* sf=x|opc=00|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x12800000) {\n\t\tdecode_fields32(ENC_MOVN_32_MOVEWIDE, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->imm = ctx->imm16;\n\t\tif(!ctx->opc) {\n\t\t\tctx->opcode = MoveWideOp_N;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->opcode = MoveWideOp_Z;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->opcode = MoveWideOp_K;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->hw,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->pos = UINT((ctx->hw<<4));\n\t\t/* regular aliases */\n\t\tbool encoding32 = ctx->sf==0 && !(ctx->hw&2);\n\t\tbool encoding64 = ctx->sf==1;\n\t\tif((!(IsZero(ctx->imm16) && ctx->hw!=0) && EncodingLabeled64Bit()) || (!(IsZero(ctx->imm16) && ctx->hw!=0) && !IsOnes(ctx->imm16,16) && EncodingLabeled32Bit())) return MOV_MOVN(ctx, instr);\n\t\tif(ctx->sf==0 && !(ctx->hw&2)) OK(ENC_MOVN_32_MOVEWIDE);\n\t\tif(ctx->sf==1) OK(ENC_MOVN_64_MOVEWIDE);\n\t}\n\treturn rc;\n}\n\n/* movs_ands_p_p_pp.xml */\nint MOVS_ands_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25404000) {\n\t\tdecode_fields32(ENC_MOVS_ANDS_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_MOVS_ANDS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* movs_orrs_p_p_pp.xml */\nint MOVS_orrs_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25C04000) {\n\t\tdecode_fields32(ENC_MOVS_ORRS_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_MOVS_ORRS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* movz.xml */\nint MOVZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm18_packed */\n\t/* sf=x|opc=10|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x52800000) {\n\t\tdecode_fields32(ENC_MOVZ_32_MOVEWIDE, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->imm = ctx->imm16;\n\t\tif(!ctx->opc) {\n\t\t\tctx->opcode = MoveWideOp_N;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->opcode = MoveWideOp_Z;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->opcode = MoveWideOp_K;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->hw,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->pos = UINT((ctx->hw<<4));\n\t\t/* regular aliases */\n\t\tif(!(IsZero(ctx->imm16) && ctx->hw!=0)) return MOV_MOVZ(ctx, instr);\n\t\tif(ctx->sf==0 && !(ctx->hw&2)) OK(ENC_MOVZ_32_MOVEWIDE);\n\t\tif(ctx->sf==1) OK(ENC_MOVZ_64_MOVEWIDE);\n\t}\n\treturn rc;\n}\n\n/* mov_add_addsub_imm.xml */\nint MOV_ADD_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=0|S=0|100010|sh=0|imm12=000000000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFFC00)==0x11000000) {\n\t\tdecode_fields32(ENC_MOV_ADD_32_ADDSUB_IMM, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MOV_ADD_32_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_MOV_ADD_64_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* mov_dup_advsimd_elt.xml */\nint MOV_DUP_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_scalar_from_element */\n\t/* 01|op=0|11110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E000400) {\n\t\tdecode_fields32(ENC_MOV_DUP_ASISDONE_ONLY, ctx, instr);\n\t\tOK(ENC_MOV_DUP_ASISDONE_ONLY);\n\t}\n\treturn rc;\n}\n\n/* mov_ins_advsimd_elt.xml */\nint MOV_INS_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=1|op=1|01110000|imm5=xxxxx|0|imm4=xxxx|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08400)==0x6E000400) {\n\t\tdecode_fields32(ENC_MOV_INS_ASIMDINS_IV_V, ctx, instr);\n\t\tOK(ENC_MOV_INS_ASIMDINS_IV_V);\n\t}\n\treturn rc;\n}\n\n/* mov_ins_advsimd_gen.xml */\nint MOV_INS_advsimd_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=1|op=0|01110000|imm5=xxxxx|0|imm4=0011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E001C00) {\n\t\tdecode_fields32(ENC_MOV_INS_ASIMDINS_IR_R, ctx, instr);\n\t\tOK(ENC_MOV_INS_ASIMDINS_IR_R);\n\t}\n\treturn rc;\n}\n\n/* mov_movn.xml */\nint MOV_MOVN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm18_packed */\n\t/* sf=x|opc=00|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x12800000) {\n\t\tdecode_fields32(ENC_MOV_MOVN_32_MOVEWIDE, ctx, instr);\n\t\tif(ctx->sf==0 && !(ctx->hw&2)) OK(ENC_MOV_MOVN_32_MOVEWIDE);\n\t\tif(ctx->sf==1) OK(ENC_MOV_MOVN_64_MOVEWIDE);\n\t}\n\treturn rc;\n}\n\n/* mov_movz.xml */\nint MOV_MOVZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_imm18_packed */\n\t/* sf=x|opc=10|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x52800000) {\n\t\tdecode_fields32(ENC_MOV_MOVZ_32_MOVEWIDE, ctx, instr);\n\t\tif(ctx->sf==0 && !(ctx->hw&2)) OK(ENC_MOV_MOVZ_32_MOVEWIDE);\n\t\tif(ctx->sf==1) OK(ENC_MOV_MOVZ_64_MOVEWIDE);\n\t}\n\treturn rc;\n}\n\n/* mov_orr_advsimd_reg.xml */\nint MOV_ORR_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEA01C00) {\n\t\tdecode_fields32(ENC_MOV_ORR_ASIMDSAME_ONLY, ctx, instr);\n\t\tOK(ENC_MOV_ORR_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* mov_orr_log_imm.xml */\nint MOV_ORR_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7F8003E0)==0x320003E0) {\n\t\tdecode_fields32(ENC_MOV_ORR_32_LOG_IMM, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_MOV_ORR_32_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_MOV_ORR_64_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* mov_orr_log_shift.xml */\nint MOV_ORR_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|01010|shift=00|N=0|Rm=xxxxx|imm6=000000|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FFE0)==0x2A0003E0) {\n\t\tdecode_fields32(ENC_MOV_ORR_32_LOG_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MOV_ORR_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_MOV_ORR_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* mov_umov_advsimd.xml */\nint MOV_UMOV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=0|01110000|imm5=xxx00|0|imm4[3:2]=01|imm4[1]=1|imm4[0]=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE3FC00)==0xE003C00) {\n\t\tdecode_fields32(ENC_MOV_UMOV_ASIMDINS_W_W, ctx, instr);\n\t\tif(ctx->Q==0 && (ctx->imm5&7)==4) OK(ENC_MOV_UMOV_ASIMDINS_W_W);\n\t\tif(ctx->Q==1 && (ctx->imm5&15)==8) OK(ENC_MOV_UMOV_ASIMDINS_X_X);\n\t}\n\treturn rc;\n}\n\n/* mov_and_p_p_pp.xml */\nint MOV_and_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004000) {\n\t\tdecode_fields32(ENC_MOV_AND_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_MOV_AND_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* mov_cpy_z_o_i.xml */\nint MOV_cpy_z_o_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|0|M=0|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30C000)==0x5100000) {\n\t\tdecode_fields32(ENC_MOV_CPY_Z_O_I_, ctx, instr);\n\t\tOK(ENC_MOV_CPY_Z_O_I_);\n\t}\n\treturn rc;\n}\n\n/* mov_cpy_z_p_i.xml */\nint MOV_cpy_z_p_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30C000)==0x5104000) {\n\t\tdecode_fields32(ENC_MOV_CPY_Z_P_I_, ctx, instr);\n\t\tOK(ENC_MOV_CPY_Z_P_I_);\n\t}\n\treturn rc;\n}\n\n/* mov_cpy_z_p_r.xml */\nint MOV_cpy_z_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|101000101|Pg=xxx|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x528A000) {\n\t\tdecode_fields32(ENC_MOV_CPY_Z_P_R_, ctx, instr);\n\t\tOK(ENC_MOV_CPY_Z_P_R_);\n\t}\n\treturn rc;\n}\n\n/* mov_cpy_z_p_v.xml */\nint MOV_cpy_z_p_v(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100000100|Pg=xxx|Vn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5208000) {\n\t\tdecode_fields32(ENC_MOV_CPY_Z_P_V_, ctx, instr);\n\t\tOK(ENC_MOV_CPY_Z_P_V_);\n\t}\n\treturn rc;\n}\n\n/* mov_dup_z_i.xml */\nint MOV_dup_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|111|opc=00|011|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2538C000) {\n\t\tdecode_fields32(ENC_MOV_DUP_Z_I_, ctx, instr);\n\t\tOK(ENC_MOV_DUP_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* mov_dup_z_r.xml */\nint MOV_dup_z_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100000001110|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5203800) {\n\t\tdecode_fields32(ENC_MOV_DUP_Z_R_, ctx, instr);\n\t\tOK(ENC_MOV_DUP_Z_R_);\n\t}\n\treturn rc;\n}\n\n/* mov_dup_z_zi.xml */\nint MOV_dup_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|imm2=xx|1|tsz=xxxxx|001000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5202000) {\n\t\tdecode_fields32(ENC_MOV_DUP_Z_ZI_, ctx, instr);\n\t\tif(BitCount(((ctx->imm2<<5)|ctx->tsz))==1) OK(ENC_MOV_DUP_Z_ZI_);\n\t\tif(BitCount(((ctx->imm2<<5)|ctx->tsz))>1) OK(ENC_MOV_DUP_Z_ZI_2);\n\t}\n\treturn rc;\n}\n\n/* mov_dupm_z_i.xml */\nint MOV_dupm_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101110000|imm13=xxxxxxxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5C00000) {\n\t\tdecode_fields32(ENC_MOV_DUPM_Z_I_, ctx, instr);\n\t\tOK(ENC_MOV_DUPM_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* mov_mova_z_p_rza.xml */\nint MOV_mova_z_p_rza(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_byte */\n\t/* 11000000|size=00|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|imm4=xxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0020000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_Z_P_RZA_B, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_Z_P_RZA_B);\n\t}\n\t/* class iclass_per_halfword */\n\t/* 11000000|size=01|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=x|imm3=xxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0420000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_Z_P_RZA_H, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_Z_P_RZA_H);\n\t}\n\t/* class iclass_per_word */\n\t/* 11000000|size=10|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=xx|imm2=xx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0820000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_Z_P_RZA_W, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_Z_P_RZA_W);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11000000|size=11|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=xxx|i1=x|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0C20000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_Z_P_RZA_D, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_Z_P_RZA_D);\n\t}\n\t/* class iclass_per_quadword */\n\t/* 11000000|size=11|00001|Q=1|V=x|Rs=xx|Pg=xxx|0|ZAn=xxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0C30000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_Z_P_RZA_Q, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_Z_P_RZA_Q);\n\t}\n\treturn rc;\n}\n\n/* mov_mova_za_p_rz.xml */\nint MOV_mova_za_p_rz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_byte */\n\t/* 11000000|size=00|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0000000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_ZA_P_RZ_B, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_ZA_P_RZ_B);\n\t}\n\t/* class iclass_per_halfword */\n\t/* 11000000|size=01|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=x|imm3=xxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0400000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_ZA_P_RZ_H, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_ZA_P_RZ_H);\n\t}\n\t/* class iclass_per_word */\n\t/* 11000000|size=10|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xx|imm2=xx */\n\tif((INSWORD & 0xFFFF0010)==0xC0800000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_ZA_P_RZ_W, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_ZA_P_RZ_W);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11000000|size=11|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xxx|i1=x */\n\tif((INSWORD & 0xFFFF0010)==0xC0C00000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_ZA_P_RZ_D, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_ZA_P_RZ_D);\n\t}\n\t/* class iclass_per_quadword */\n\t/* 11000000|size=11|00000|Q=1|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xxxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0C10000) {\n\t\tdecode_fields32(ENC_MOV_MOVA_ZA_P_RZ_Q, ctx, instr);\n\t\tOK(ENC_MOV_MOVA_ZA_P_RZ_Q);\n\t}\n\treturn rc;\n}\n\n/* mov_orr_p_p_pp.xml */\nint MOV_orr_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25804000) {\n\t\tdecode_fields32(ENC_MOV_ORR_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_MOV_ORR_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* mov_orr_z_zz.xml */\nint MOV_orr_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=01|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4603000) {\n\t\tdecode_fields32(ENC_MOV_ORR_Z_ZZ_, ctx, instr);\n\t\tOK(ENC_MOV_ORR_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mov_sel_p_p_pp.xml */\nint MOV_sel_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004210) {\n\t\tdecode_fields32(ENC_MOV_SEL_P_P_PP_, ctx, instr);\n\t\tOK(ENC_MOV_SEL_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* mov_sel_z_p_zz.xml */\nint MOV_sel_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|1|Zm=xxxxx|11|Pg=xxxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20C000)==0x520C000) {\n\t\tdecode_fields32(ENC_MOV_SEL_Z_P_ZZ_, ctx, instr);\n\t\tOK(ENC_MOV_SEL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mrs.xml */\nint MRS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=1|op0[1]=1|o0=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF00000)==0xD5300000) {\n\t\tdecode_fields32(ENC_MRS_RS_SYSTEMMOVE, ctx, instr);\n\t\tCheckSystemAccess(((1<<1)|ctx->o0),ctx->op1,ctx->CRn,ctx->CRm,ctx->op2,ctx->Rt,ctx->L);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->sys_op0 = 2+UINT(ctx->o0);\n\t\tctx->sys_op1 = UINT(ctx->op1);\n\t\tctx->sys_op2 = UINT(ctx->op2);\n\t\tctx->sys_crn = UINT(ctx->CRn);\n\t\tctx->sys_crm = UINT(ctx->CRm);\n\t\tctx->read = (ctx->L==1);\n\t\tOK(ENC_MRS_RS_SYSTEMMOVE);\n\t}\n\treturn rc;\n}\n\n/* msr_imm.xml */\nint MSR_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=xxx|CRn=0100|CRm=xxxx|op2=xxx|Rt=11111 */\n\tif((INSWORD & 0xFFF8F01F)==0xD500401F) {\n\t\tdecode_fields32(ENC_MSR_SI_PSTATE, ctx, instr);\n\t\tif(ctx->op1==0 && ctx->op2==0) {\n\t\t\tSEE /* CFINV */;\n\t\t}\n\t\tif(ctx->op1==0 && ctx->op2==1) {\n\t\t\tSEE /* XAFLAG */;\n\t\t}\n\t\tif(ctx->op1==0 && ctx->op2==2) {\n\t\t\tSEE /* AXFLAG */;\n\t\t}\n\t\tCheckSystemAccess(0,ctx->op1,4,ctx->CRm,ctx->op2,0x1f,0);\n\t\tctx->need_secure = FALSE;\n\t\tif(!(ctx->op1&6)) {\n\t\t\tctx->min_EL = EL1;\n\t\t}\n\t\telse if(ctx->op1==2) {\n\t\t\tctx->min_EL = EL1;\n\t\t}\n\t\telse if(ctx->op1==3) {\n\t\t\tctx->min_EL = EL0;\n\t\t}\n\t\telse if(ctx->op1==4) {\n\t\t\tctx->min_EL = EL2;\n\t\t}\n\t\telse if(ctx->op1==5) {\n\t\t\tif(!HaveVirtHostExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->min_EL = EL2;\n\t\t}\n\t\telse if(ctx->op1==6) {\n\t\t\tctx->min_EL = EL3;\n\t\t}\n\t\telse if(ctx->op1==7) {\n\t\t\tctx->min_EL = EL1;\n\t\t\tctx->need_secure = TRUE;\n\t\t}\n\t\t/* if(UINT(ctx->pstate_el)<UINT(ctx->min_EL) || (ctx->need_secure && !IsSecure())) { UNDEFINED; } */\n\t\tctx->operand = ctx->CRm;\n\t\tif(((ctx->op1<<3)|ctx->op2)==3) {\n\t\t\tif(!HaveUAOExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->field = PSTATEField_UAO;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==4) {\n\t\t\tif(!HavePANExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->field = PSTATEField_PAN;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==5) {\n\t\t\tctx->field = PSTATEField_SP;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x1a) {\n\t\t\tif(!HaveDITExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->field = PSTATEField_DIT;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x1b) {\n\t\t\tif((ctx->CRm&14)==2) {\n\t\t\t\tif(!HaveSME()) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->field = PSTATEField_SVCRSM;\n\t\t\t}\n\t\t\telse if((ctx->CRm&14)==4) {\n\t\t\t\tif(!HaveSME()) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->field = PSTATEField_SVCRZA;\n\t\t\t}\n\t\t\telse if((ctx->CRm&14)==6) {\n\t\t\t\tif(!HaveSME()) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->field = PSTATEField_SVCRSMZA;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x1c) {\n\t\t\tif(!HaveMTEExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->field = PSTATEField_TCO;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x1e) {\n\t\t\tctx->field = PSTATEField_DAIFSet;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x1f) {\n\t\t\tctx->field = PSTATEField_DAIFClr;\n\t\t}\n\t\telse if(((ctx->op1<<3)|ctx->op2)==0x19) {\n\t\t\tif(!HaveSSBSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->field = PSTATEField_SSBS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* if(ctx->pstate_el==EL0 && (ctx->field==PSTATEField_DAIFSet || ctx->field==PSTATEField_DAIFClr)) { if(!ELUsingAArch32(EL1) && ((EL2Enabled() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3) || ctx->SCTLR_EL1_UMA==0)) {\tif(EL2Enabled() && !ELUsingAArch32(EL2) && ctx->HCR_EL2_TGE==1) {\t\tSystemAccessTrap(EL2,0x18);\t}\telse {\t\tSystemAccessTrap(EL1,0x18);\t}} } */\n\t\t/* regular aliases */\n\t\tif(ctx->op1==3 && (ctx->CRm&9)==1 && ctx->op2==3) return SMSTART_MSR_imm(ctx, instr);\n\t\tif(ctx->op1==3 && !(ctx->CRm&9) && ctx->op2==3) return SMSTOP_MSR_imm(ctx, instr);\n\t\tOK(ENC_MSR_SI_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* msr_reg.xml */\nint MSR_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0[1]=1|o0=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF00000)==0xD5100000) {\n\t\tdecode_fields32(ENC_MSR_SR_SYSTEMMOVE, ctx, instr);\n\t\tCheckSystemAccess(((1<<1)|ctx->o0),ctx->op1,ctx->CRn,ctx->CRm,ctx->op2,ctx->Rt,ctx->L);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->sys_op0 = 2+UINT(ctx->o0);\n\t\tctx->sys_op1 = UINT(ctx->op1);\n\t\tctx->sys_op2 = UINT(ctx->op2);\n\t\tctx->sys_crn = UINT(ctx->CRn);\n\t\tctx->sys_crm = UINT(ctx->CRm);\n\t\tctx->read = (ctx->L==1);\n\t\tOK(ENC_MSR_SR_SYSTEMMOVE);\n\t}\n\treturn rc;\n}\n\n/* msub.xml */\nint MSUB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE08000)==0x1B008000) {\n\t\tdecode_fields32(ENC_MSUB_32A_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->destsize;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return MNEG_MSUB(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MSUB_32A_DP_3SRC);\n\t\tif(ctx->sf==1) OK(ENC_MSUB_64A_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* mul_madd.xml */\nint MUL_MADD(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1B007C00) {\n\t\tdecode_fields32(ENC_MUL_MADD_32A_DP_3SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MUL_MADD_32A_DP_3SRC);\n\t\tif(ctx->sf==1) OK(ENC_MUL_MADD_64A_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* mul_advsimd_elt.xml */\nint MUL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1000|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF008000) {\n\t\tdecode_fields32(ENC_MUL_ASIMDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_MUL_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* mul_advsimd_vec.xml */\nint MUL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE209C00) {\n\t\tdecode_fields32(ENC_MUL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->U==1 && ctx->size!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->poly = (ctx->U==1);\n\t\tOK(ENC_MUL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* mvni_advsimd.xml */\nint MVNI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=1|0111100000|a=x|b=x|c=x|cmode=xxxx|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0xBFF80C00)==0x2F000400) {\n\t\tdecode_fields32(ENC_MVNI_ASIMDIMM_L_HL, ctx, instr);\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tif(!(((ctx->cmode<<1)|ctx->op)&0x13)) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==1) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==2) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==3) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x10) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x11) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x12) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x13) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x18) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x19) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1e)==0x1c) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1e) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1f) {\n\t\t\tif(ctx->Q==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\tctx->imm64 = AdvSIMDExpandImm(ctx->op,ctx->cmode,((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h));\n\t\tctx->imm = Replicate(ctx->imm64, ((0x40) ? ((ctx->datasize) / (0x40)) : 0), 64);\n\t\tif((ctx->cmode&13)==8) OK(ENC_MVNI_ASIMDIMM_L_HL);\n\t\tif(!(ctx->cmode&9)) OK(ENC_MVNI_ASIMDIMM_L_SL);\n\t\tif((ctx->cmode&14)==12) OK(ENC_MVNI_ASIMDIMM_M_SM);\n\t}\n\treturn rc;\n}\n\n/* mvn_not_advsimd.xml */\nint MVN_NOT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=00|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E205800) {\n\t\tdecode_fields32(ENC_MVN_NOT_ASIMDMISC_R, ctx, instr);\n\t\tOK(ENC_MVN_NOT_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* mvn_orn_log_shift.xml */\nint MVN_ORN_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7F2003E0)==0x2A2003E0) {\n\t\tdecode_fields32(ENC_MVN_ORN_32_LOG_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_MVN_ORN_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_MVN_ORN_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* negs_subs_addsub_shift.xml */\nint NEGS_SUBS_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd!=11111 */\n\tif((INSWORD & 0x7F2003E0)==0x6B0003E0 && (INSWORD & 0x1F)!=0x1F) {\n\t\tdecode_fields32(ENC_NEGS_SUBS_32_ADDSUB_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_NEGS_SUBS_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_NEGS_SUBS_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* neg_sub_addsub_shift.xml */\nint NEG_SUB_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7F2003E0)==0x4B0003E0) {\n\t\tdecode_fields32(ENC_NEG_SUB_32_ADDSUB_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_NEG_SUB_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_NEG_SUB_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* neg_advsimd.xml */\nint NEG_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E20B800) {\n\t\tdecode_fields32(ENC_NEG_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_NEG_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E20B800) {\n\t\tdecode_fields32(ENC_NEG_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_NEG_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* ngcs_sbcs.xml */\nint NGCS_SBCS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|11010000|Rm=xxxxx|000000|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FFE0)==0x7A0003E0) {\n\t\tdecode_fields32(ENC_NGCS_SBCS_32_ADDSUB_CARRY, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_NGCS_SBCS_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_NGCS_SBCS_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* ngc_sbc.xml */\nint NGC_SBC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|11010000|Rm=xxxxx|000000|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FFE0)==0x5A0003E0) {\n\t\tdecode_fields32(ENC_NGC_SBC_32_ADDSUB_CARRY, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_NGC_SBC_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_NGC_SBC_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* nop.xml */\nint NOP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=000|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503201F) {\n\t\tdecode_fields32(ENC_NOP_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_NOP_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* nots_eors_p_p_pp.xml */\nint NOTS_eors_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25404200) {\n\t\tdecode_fields32(ENC_NOTS_EORS_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_NOTS_EORS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* not_advsimd.xml */\nint NOT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=00|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E205800) {\n\t\tdecode_fields32(ENC_NOT_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((8) ? ((ctx->datasize) / (8)) : 0);\n\t\t/* unconditional alias */\n\t\tif(MVN_NOT_advsimd(ctx, instr)==0) return 0;\n\t\tOK(ENC_NOT_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* not_eor_p_p_pp.xml */\nint NOT_eor_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004200) {\n\t\tdecode_fields32(ENC_NOT_EOR_P_P_PP_Z, ctx, instr);\n\t\tOK(ENC_NOT_EOR_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* orn_advsimd.xml */\nint ORN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=11|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEE01C00) {\n\t\tdecode_fields32(ENC_ORN_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->invert = (SLICE(ctx->size,0,0)==1);\n\t\tctx->op = (SLICE(ctx->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;\n\t\tOK(ENC_ORN_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* orn_log_shift.xml */\nint ORN_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x2A200000) {\n\t\tdecode_fields32(ENC_ORN_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f) return MVN_ORN_log_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ORN_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_ORN_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* orn_orr_z_zi.xml */\nint ORN_orr_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=00|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5000000) {\n\t\tdecode_fields32(ENC_ORN_ORR_Z_ZI_, ctx, instr);\n\t\tOK(ENC_ORN_ORR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* orr_advsimd_imm.xml */\nint ORR_advsimd_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_shifted_immediate */\n\t/* 0|Q=x|op=0|0111100000|a=x|b=x|c=x|cmode=xxx1|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */\n\tif((INSWORD & 0xBFF81C00)==0xF001400) {\n\t\tdecode_fields32(ENC_ORR_ASIMDIMM_L_HL, ctx, instr);\n\t\tctx->rd = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tif(!(((ctx->cmode<<1)|ctx->op)&0x13)) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==1) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==2) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x13)==3) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x10) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x11) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x12) {\n\t\t\tctx->operation_ = ImmediateOp_ORR;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1b)==0x13) {\n\t\t\tctx->operation_ = ImmediateOp_BIC;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x18) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1d)==0x19) {\n\t\t\tctx->operation_ = ImmediateOp_MVNI;\n\t\t}\n\t\telse if((((ctx->cmode<<1)|ctx->op)&0x1e)==0x1c) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1e) {\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\telse if(((ctx->cmode<<1)|ctx->op)==0x1f) {\n\t\t\tif(ctx->Q==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->operation_ = ImmediateOp_MOVI;\n\t\t}\n\t\tctx->imm64 = AdvSIMDExpandImm(ctx->op,ctx->cmode,((ctx->a<<7)|(ctx->b<<6)|(ctx->c<<5)|(ctx->d<<4)|(ctx->e<<3)|(ctx->f<<2)|(ctx->g<<1)|ctx->h));\n\t\tctx->imm = Replicate(ctx->imm64, ((0x40) ? ((ctx->datasize) / (0x40)) : 0), 64);\n\t\tif((ctx->cmode&13)==9) OK(ENC_ORR_ASIMDIMM_L_HL);\n\t\tif((ctx->cmode&9)==1) OK(ENC_ORR_ASIMDIMM_L_SL);\n\t}\n\treturn rc;\n}\n\n/* orr_advsimd_reg.xml */\nint ORR_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xEA01C00) {\n\t\tdecode_fields32(ENC_ORR_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->invert = (SLICE(ctx->size,0,0)==1);\n\t\tctx->op = (SLICE(ctx->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;\n\t\t/* regular aliases */\n\t\tif(ctx->Rm==ctx->Rn) return MOV_ORR_advsimd_reg(ctx, instr);\n\t\tOK(ENC_ORR_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* orr_log_imm.xml */\nint ORR_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x32000000) {\n\t\tdecode_fields32(ENC_ORR_32_LOG_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->N!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tDecodeBitMasksCheckUndefined(ctx->N,ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->imm = dbmrt.wmask;\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f && !MoveWidePreferred(ctx->sf,ctx->N,ctx->imms,ctx->immr)) return MOV_ORR_log_imm(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_ORR_32_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_ORR_64_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* orr_log_shift.xml */\nint ORR_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|opc=01|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x2A000000) {\n\t\tdecode_fields32(ENC_ORR_32_LOG_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->op = LogicalOp_ORR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->op = LogicalOp_EOR;\n\t\t\tctx->setflags = FALSE;\n\t\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->op = LogicalOp_AND;\n\t\t\tctx->setflags = TRUE;\n\t\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\tctx->invert = (ctx->N==1);\n\t\t/* regular aliases */\n\t\tif(ctx->shift==0 && ctx->imm6==0 && ctx->Rn==0x1f) return MOV_ORR_log_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ORR_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_ORR_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* pacda.xml */\nint PACDA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=010|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC10800) {\n\t\tdecode_fields32(ENC_PACDA_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_PACDA_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_PACDZA_64Z_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* pacdb.xml */\nint PACDB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=011|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC10C00) {\n\t\tdecode_fields32(ENC_PACDB_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_PACDB_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_PACDZB_64Z_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* pacga.xml */\nint PACGA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|op=0|S=0|11010110|Rm=xxxxx|opcode2=001100|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9AC03000) {\n\t\tdecode_fields32(ENC_PACGA_64P_DP_2SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->m==0x1f) {\n\t\t\tctx->source_is_sp = TRUE;\n\t\t}\n\t\tOK(ENC_PACGA_64P_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* pacia.xml */\nint PACIA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC10000) {\n\t\tdecode_fields32(ENC_PACIA_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_PACIA_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_PACIZA_64Z_DP_1SRC);\n\t}\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=00x|Rt=11111 */\n\tif((INSWORD & 0xFFFFFDDF)==0xD503211F) {\n\t\tdecode_fields32(ENC_PACIA1716_HI_HINTS, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tif(((ctx->CRm<<3)|ctx->op2)==0x18) {\n\t\t\tctx->d = 0x1e;\n\t\t\tctx->n = 0x1f;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x19) {\n\t\t\tctx->d = 0x1e;\n\t\t\tctx->source_is_sp = TRUE;\n\t\t\tif(HaveBTIExt()) {\n\t\t\t\tSetBTypeCompatible(BTypeCompatible_PACIXSP());\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==8) {\n\t\t\tctx->d = 0x11;\n\t\t\tctx->n = 0x10;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==10) {\n\t\t\tSEE /* PACIB */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==12) {\n\t\t\tSEE /* AUTIA */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==14) {\n\t\t\tSEE /* AUTIB */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x1a) {\n\t\t\tSEE /* PACIB */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x1c) {\n\t\t\tSEE /* AUTIA */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x1e) {\n\t\t\tSEE /* AUTIB */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse {\n\t\t\tSEE /* HINT */;\n\t\t}\n\t\tif(ctx->CRm==1 && ctx->op2==0) OK(ENC_PACIA1716_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==1) OK(ENC_PACIASP_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==0) OK(ENC_PACIAZ_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* pacib.xml */\nint PACIB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=001|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFDC00)==0xDAC10400) {\n\t\tdecode_fields32(ENC_PACIB_64P_DP_1SRC, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Z==0) {\n\t\t\tif(ctx->n==0x1f) {\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->Z==0) OK(ENC_PACIB_64P_DP_1SRC);\n\t\tif(ctx->Z==1 && ctx->Rn==0x1f) OK(ENC_PACIZB_64Z_DP_1SRC);\n\t}\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=01x|Rt=11111 */\n\tif((INSWORD & 0xFFFFFDDF)==0xD503215F) {\n\t\tdecode_fields32(ENC_PACIB1716_HI_HINTS, ctx, instr);\n\t\tctx->source_is_sp = FALSE;\n\t\tif(((ctx->CRm<<3)|ctx->op2)==0x1a) {\n\t\t\tctx->d = 0x1e;\n\t\t\tctx->n = 0x1f;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x1b) {\n\t\t\tctx->d = 0x1e;\n\t\t\tctx->source_is_sp = TRUE;\n\t\t\tif(HaveBTIExt()) {\n\t\t\t\tSetBTypeCompatible(BTypeCompatible_PACIXSP());\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==10) {\n\t\t\tctx->d = 0x11;\n\t\t\tctx->n = 0x10;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==8) {\n\t\t\tSEE /* PACIA */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==12) {\n\t\t\tSEE /* AUTIA */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==14) {\n\t\t\tSEE /* AUTIB */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x18) {\n\t\t\tSEE /* PACIA */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x1c) {\n\t\t\tSEE /* AUTIA */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x7e)==0x1e) {\n\t\t\tSEE /* AUTIB */;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse {\n\t\t\tSEE /* HINT */;\n\t\t}\n\t\tif(ctx->CRm==1 && ctx->op2==2) OK(ENC_PACIB1716_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==3) OK(ENC_PACIBSP_HI_HINTS);\n\t\tif(ctx->CRm==3 && ctx->op2==2) OK(ENC_PACIBZ_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* pmull_advsimd.xml */\nint PMULL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=1110|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20E000) {\n\t\tdecode_fields32(ENC_PMULL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==1 || ctx->size==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3 && !HaveBit128PMULLExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_PMULL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* pmul_advsimd.xml */\nint PMUL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E209C00) {\n\t\tdecode_fields32(ENC_PMUL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->U==1 && ctx->size!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->poly = (ctx->U==1);\n\t\tOK(ENC_PMUL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* prfm_imm.xml */\nint PRFM_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=11|111|V=0|01|opc=10|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0xF9800000) {\n\t\tdecode_fields32(ENC_PRFM_P_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_PRFM_P_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* prfm_lit.xml */\nint PRFM_lit(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_literal */\n\t/* opc=11|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF000000)==0xD8000000) {\n\t\tdecode_fields32(ENC_PRFM_P_LOADLIT, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->memop = MemOp_LOAD;\n\t\tctx->signed_ = FALSE;\n\t\tif(!ctx->opc) {\n\t\t\tctx->size = 4;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->size = 8;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->size = 4;\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t}\n\t\tctx->offset = SignExtend((ctx->imm19<<2),21);\n\t\tctx->tag_checked = FALSE;\n\t\tOK(ENC_PRFM_P_LOADLIT);\n\t}\n\treturn rc;\n}\n\n/* prfm_reg.xml */\nint PRFM_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=11|111|V=0|00|opc=10|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xF8A00800) {\n\t\tdecode_fields32(ENC_PRFM_P_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tOK(ENC_PRFM_P_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* prfum.xml */\nint PRFUM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=11|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xF8800000) {\n\t\tdecode_fields32(ENC_PRFUM_P_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_PRFUM_P_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* psb.xml */\nint PSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=001|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503223F) {\n\t\tdecode_fields32(ENC_PSB_HC_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_PSB_HC_HINTS);\n\t}\n\treturn rc;\n}\n\n/* pssbb_dsb.xml */\nint PSSBB_DSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_dsb_memory */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=0100|op2[2]=1|opc=00|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503349F) {\n\t\tdecode_fields32(ENC_PSSBB_DSB_BO_BARRIERS, ctx, instr);\n\t\tOK(ENC_PSSBB_DSB_BO_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* raddhn_advsimd.xml */\nint RADDHN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E204000) {\n\t\tdecode_fields32(ENC_RADDHN_ASIMDDIFF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->round = (ctx->U==1);\n\t\tOK(ENC_RADDHN_ASIMDDIFF_N);\n\t}\n\treturn rc;\n}\n\n/* rax1_advsimd.xml */\nint RAX1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE608C00) {\n\t\tdecode_fields32(ENC_RAX1_VVV2_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSHA3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_RAX1_VVV2_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* rbit_advsimd.xml */\nint RBIT_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=01|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E605800) {\n\t\tdecode_fields32(ENC_RBIT_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 8;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((8) ? ((ctx->datasize) / (8)) : 0);\n\t\tOK(ENC_RBIT_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* rbit_int.xml */\nint RBIT_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opcode[1:0]=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFFC00)==0x5AC00000) {\n\t\tdecode_fields32(ENC_RBIT_32_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(ctx->sf==0) OK(ENC_RBIT_32_DP_1SRC);\n\t\tif(ctx->sf==1) OK(ENC_RBIT_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* ret.xml */\nint RET(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=0|opc[2:1]=0|op=10|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */\n\tif((INSWORD & 0xFFFFFC1F)==0xD65F0000) {\n\t\tdecode_fields32(ENC_RET_64R_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tOK(ENC_RET_64R_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* reta.xml */\nint RETA(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 1101011|Z=0|opc[2:1]=0|op=10|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=11111|Rm=11111 */\n\tif((INSWORD & 0xFFFFFBFF)==0xD65F0BFF) {\n\t\tdecode_fields32(ENC_RETAA_64E_BRANCH_REG, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->pac = (ctx->A==1);\n\t\tctx->use_key_a = (ctx->M==0);\n\t\tctx->source_is_sp = ((ctx->Z==1) && (ctx->m==0x1f));\n\t\tif(!ctx->pac && ctx->m!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->pac && !HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->op) {\n\t\t\tctx->branch_type = BranchType_INDIR;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->branch_type = BranchType_INDCALL;\n\t\t}\n\t\telse if(ctx->op==2) {\n\t\t\tctx->branch_type = BranchType_RET;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->pac) {\n\t\t\tif(ctx->Z==0 && ctx->m!=0x1f) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(ctx->branch_type==BranchType_RET) {\n\t\t\t\tif(ctx->n!=0x1f) {\n\t\t\t\t\tUNDEFINED;\n\t\t\t\t}\n\t\t\t\tctx->n = 0x1e;\n\t\t\t\tctx->source_is_sp = TRUE;\n\t\t\t}\n\t\t}\n\t\tif(ctx->M==0) OK(ENC_RETAA_64E_BRANCH_REG);\n\t\tif(ctx->M==1) OK(ENC_RETAB_64E_BRANCH_REG);\n\t}\n\treturn rc;\n}\n\n/* rev.xml */\nint REV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=1x|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFF800)==0x5AC00800) {\n\t\tdecode_fields32(ENC_REV_32_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tif(ctx->sf==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->opc==2) OK(ENC_REV_32_DP_1SRC);\n\t\tif(ctx->sf==1 && ctx->opc==3) OK(ENC_REV_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* rev16_advsimd.xml */\nint REV16_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:1]=0000|o0=1|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE201800) {\n\t\tdecode_fields32(ENC_REV16_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->op = ((ctx->o0<<1)|ctx->U);\n\t\tif((UINT(ctx->op)+UINT(ctx->size)) >= (3)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->op==2) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(!ctx->op) {\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tctx->containers = ((ctx->container_size) ? ((ctx->datasize) / (ctx->container_size)) : 0);\n\t\tctx->elements_per_container = ((ctx->esize) ? ((ctx->container_size) / (ctx->esize)) : 0);\n\t\tOK(ENC_REV16_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* rev16_int.xml */\nint REV16_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FFFFC00)==0x5AC00400) {\n\t\tdecode_fields32(ENC_REV16_32_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tif(ctx->sf==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tif(ctx->sf==0) OK(ENC_REV16_32_DP_1SRC);\n\t\tif(ctx->sf==1) OK(ENC_REV16_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* rev32_advsimd.xml */\nint REV32_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode[4:1]=0000|o0=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E200800) {\n\t\tdecode_fields32(ENC_REV32_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->op = ((ctx->o0<<1)|ctx->U);\n\t\tif((UINT(ctx->op)+UINT(ctx->size)) >= (3)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->op==2) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(!ctx->op) {\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tctx->containers = ((ctx->container_size) ? ((ctx->datasize) / (ctx->container_size)) : 0);\n\t\tctx->elements_per_container = ((ctx->esize) ? ((ctx->container_size) / (ctx->esize)) : 0);\n\t\tOK(ENC_REV32_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* rev32_int.xml */\nint REV32_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xDAC00800) {\n\t\tdecode_fields32(ENC_REV32_64_DP_1SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tif(ctx->sf==0) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tOK(ENC_REV32_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* rev64_rev.xml */\nint REV64_REV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xDAC00C00) {\n\t\tdecode_fields32(ENC_REV64_REV_64_DP_1SRC, ctx, instr);\n\t\tOK(ENC_REV64_REV_64_DP_1SRC);\n\t}\n\treturn rc;\n}\n\n/* rev64_advsimd.xml */\nint REV64_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:1]=0000|o0=0|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE200800) {\n\t\tdecode_fields32(ENC_REV64_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->op = ((ctx->o0<<1)|ctx->U);\n\t\tif((UINT(ctx->op)+UINT(ctx->size)) >= (3)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->op==2) {\n\t\t\tctx->container_size = 0x10;\n\t\t}\n\t\telse if(ctx->op==1) {\n\t\t\tctx->container_size = 0x20;\n\t\t}\n\t\telse if(!ctx->op) {\n\t\t\tctx->container_size = 0x40;\n\t\t}\n\t\tctx->containers = ((ctx->container_size) ? ((ctx->datasize) / (ctx->container_size)) : 0);\n\t\tctx->elements_per_container = ((ctx->esize) ? ((ctx->container_size) / (ctx->esize)) : 0);\n\t\tOK(ENC_REV64_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* rmif.xml */\nint RMIF(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|op=0|S=1|11010000|imm6=xxxxxx|00001|Rn=xxxxx|o2=0|mask=xxxx */\n\tif((INSWORD & 0xFFE07C10)==0xBA000400) {\n\t\tdecode_fields32(ENC_RMIF_ONLY_RMIF, ctx, instr);\n\t\tif(!HaveFlagManipulateExt() || ctx->sf!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->lsb = UINT(ctx->imm6);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tOK(ENC_RMIF_ONLY_RMIF);\n\t}\n\treturn rc;\n}\n\n/* rorv.xml */\nint RORV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02C00) {\n\t\tdecode_fields32(ENC_RORV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->shift_type = DecodeShift(ctx->op2);\n\t\t/* unconditional alias */\n\t\tif(ROR_RORV(ctx, instr)==0) return 0;\n\t\tif(ctx->sf==0) OK(ENC_RORV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_RORV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* ror_extr.xml */\nint ROR_EXTR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op21=00|100111|N=x|o0=0|Rm=xxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FA00000)==0x13800000) {\n\t\tdecode_fields32(ENC_ROR_EXTR_32_EXTRACT, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0 && !(ctx->imms&0x20)) OK(ENC_ROR_EXTR_32_EXTRACT);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_ROR_EXTR_64_EXTRACT);\n\t}\n\treturn rc;\n}\n\n/* ror_rorv.xml */\nint ROR_RORV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:2]=0010|op2=11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC02C00) {\n\t\tdecode_fields32(ENC_ROR_RORV_32_DP_2SRC, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_ROR_RORV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_ROR_RORV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* rshrn_advsimd.xml */\nint RSHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF008C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_RSHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_RSHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* rsubhn_advsimd.xml */\nint RSUBHN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E206000) {\n\t\tdecode_fields32(ENC_RSUBHN_ASIMDDIFF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->round = (ctx->U==1);\n\t\tOK(ENC_RSUBHN_ASIMDDIFF_N);\n\t}\n\treturn rc;\n}\n\n/* sabal_advsimd.xml */\nint SABAL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|op=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE205000) {\n\t\tdecode_fields32(ENC_SABAL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->accumulate = (ctx->op==0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SABAL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* saba_advsimd.xml */\nint SABA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0111|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE207C00) {\n\t\tdecode_fields32(ENC_SABA_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->accumulate = (ctx->ac==1);\n\t\tOK(ENC_SABA_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sabdl_advsimd.xml */\nint SABDL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|op=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE207000) {\n\t\tdecode_fields32(ENC_SABDL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->accumulate = (ctx->op==0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SABDL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* sabd_advsimd.xml */\nint SABD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0111|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE207400) {\n\t\tdecode_fields32(ENC_SABD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->accumulate = (ctx->ac==1);\n\t\tOK(ENC_SABD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sadalp_advsimd.xml */\nint SADALP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:3]=00|op=1|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE206800) {\n\t\tdecode_fields32(ENC_SADALP_ASIMDMISC_P, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((((2) * (ctx->esize))) ? ((ctx->datasize) / (((2) * (ctx->esize)))) : 0);\n\t\tctx->acc = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SADALP_ASIMDMISC_P);\n\t}\n\treturn rc;\n}\n\n/* saddlp_advsimd.xml */\nint SADDLP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode[4:3]=00|op=0|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE202800) {\n\t\tdecode_fields32(ENC_SADDLP_ASIMDMISC_P, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((((2) * (ctx->esize))) ? ((ctx->datasize) / (((2) * (ctx->esize)))) : 0);\n\t\tctx->acc = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SADDLP_ASIMDMISC_P);\n\t}\n\treturn rc;\n}\n\n/* saddlv_advsimd.xml */\nint SADDLV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=0|01110|size=xx|11000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE303800) {\n\t\tdecode_fields32(ENC_SADDLV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SADDLV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* saddl_advsimd.xml */\nint SADDL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE200000) {\n\t\tdecode_fields32(ENC_SADDL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SADDL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* saddw_advsimd.xml */\nint SADDW_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE201000) {\n\t\tdecode_fields32(ENC_SADDW_ASIMDDIFF_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SADDW_ASIMDDIFF_W);\n\t}\n\treturn rc;\n}\n\n/* sb.xml */\nint SB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=(0)(0)(0)(0)|op2[2]=1|opc=11|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD50330FF) {\n\t\tdecode_fields32(ENC_SB_ONLY_BARRIERS, ctx, instr);\n\t\tif(!HaveSBExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SB_ONLY_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* sbc.xml */\nint SBC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x5A000000) {\n\t\tdecode_fields32(ENC_SBC_32_ADDSUB_CARRY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f) return NGC_SBC(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SBC_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_SBC_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* sbcs.xml */\nint SBCS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x7A000000) {\n\t\tdecode_fields32(ENC_SBCS_32_ADDSUB_CARRY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f) return NGCS_SBCS(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SBCS_32_ADDSUB_CARRY);\n\t\tif(ctx->sf==1) OK(ENC_SBCS_64_ADDSUB_CARRY);\n\t}\n\treturn rc;\n}\n\n/* sbfiz_sbfm.xml */\nint SBFIZ_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x13000000) {\n\t\tdecode_fields32(ENC_SBFIZ_SBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_SBFIZ_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_SBFIZ_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* sbfm.xml */\nint SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x13000000) {\n\t\tdecode_fields32(ENC_SBFM_32M_BITFIELD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = TRUE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->inzero = FALSE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==1 && ctx->N!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && (ctx->N!=0 || SLICE(ctx->immr,5,5)!=0 || SLICE(ctx->imms,5,5)!=0)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->R = UINT(ctx->immr);\n\t\tctx->S = UINT(ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->wmask = dbmrt.wmask;\n\t\tctx->tmask = dbmrt.tmask;\n\t\t/* regular aliases */\n\t\tbool encoding32 = ctx->sf==0 && ctx->N==0;\n\t\tbool encoding64 = ctx->sf==1 && ctx->N==1;\n\t\tif((ctx->imms==0x1f && EncodingLabeled32Bit()) || (ctx->imms==0x3f && EncodingLabeled64Bit())) return ASR_SBFM(ctx, instr);\n\t\tif(UINT(ctx->imms)<UINT(ctx->immr)) return SBFIZ_SBFM(ctx, instr);\n\t\tif(BFXPreferred(ctx->sf,SLICE(ctx->opc,1,1),ctx->imms,ctx->immr)) return SBFX_SBFM(ctx, instr);\n\t\tif(ctx->immr==0 && ctx->imms==7) return SXTB_SBFM(ctx, instr);\n\t\tif(ctx->immr==0 && ctx->imms==15) return SXTH_SBFM(ctx, instr);\n\t\tif(ctx->immr==0 && ctx->imms==0x1f) return SXTW_SBFM(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* sbfx_sbfm.xml */\nint SBFX_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x13000000) {\n\t\tdecode_fields32(ENC_SBFX_SBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_SBFX_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_SBFX_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* scvtf_advsimd_fix.xml */\nint SCVTF_advsimd_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F00E400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SCVTF_ASISDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_ASISDSHF_C);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF00E400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SCVTF_ASIMDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_ASIMDSHF_C);\n\t}\n\treturn rc;\n}\n\n/* scvtf_advsimd_int.xml */\nint SCVTF_advsimd_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=0|11110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E79D800) {\n\t\tdecode_fields32(ENC_SCVTF_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SCVTF_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=0|11110|size[1]=0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x5E21D800) {\n\t\tdecode_fields32(ENC_SCVTF_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SCVTF_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=0|01110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0xE79D800) {\n\t\tdecode_fields32(ENC_SCVTF_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SCVTF_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=0|01110|size[1]=0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xE21D800) {\n\t\tdecode_fields32(ENC_SCVTF_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SCVTF_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* scvtf_float_fix.xml */\nint SCVTF_float_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|0|rmode=00|opcode=010|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3F0000)==0x1E020000) {\n\t\tdecode_fields32(ENC_SCVTF_H32_FLOAT2FIX, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->scale,5,5)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->fracbits = 0x40-UINT(ctx->scale);\n\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==3) {\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_SCVTF_H32_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_SCVTF_S32_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_SCVTF_D32_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_SCVTF_H64_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_SCVTF_S64_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_SCVTF_D64_FLOAT2FIX);\n\t}\n\treturn rc;\n}\n\n/* scvtf_float_int.xml */\nint SCVTF_float_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=010|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E220000) {\n\t\tdecode_fields32(ENC_SCVTF_H32_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_SCVTF_H32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_SCVTF_S32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_SCVTF_D32_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_SCVTF_H64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_SCVTF_S64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_SCVTF_D64_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* sdiv.xml */\nint SDIV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:1]=00001|o1=1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC00C00) {\n\t\tdecode_fields32(ENC_SDIV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->unsigned_ = (ctx->o1==0);\n\t\tif(ctx->sf==0) OK(ENC_SDIV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_SDIV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* sdot_advsimd_elt.xml */\nint SDOT_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1110|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF00E000) {\n\t\tdecode_fields32(ENC_SDOT_ASIMDELEM_D, ctx, instr);\n\t\tif(!HaveDOTPExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->signed_ = (ctx->U==0);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_SDOT_ASIMDELEM_D);\n\t}\n\treturn rc;\n}\n\n/* sdot_advsimd_vec.xml */\nint SDOT_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|0|Rm=xxxxx|1|opcode=0010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE009400) {\n\t\tdecode_fields32(ENC_SDOT_ASIMDSAME2_D, ctx, instr);\n\t\tif(!HaveDOTPExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->signed_ = (ctx->U==0);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_SDOT_ASIMDSAME2_D);\n\t}\n\treturn rc;\n}\n\n/* setf.xml */\nint SETF(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=0|op=0|S=1|11010000|opcode2=000000|sz=x|0010|Rn=xxxxx|o3=0|mask=1101 */\n\tif((INSWORD & 0xFFFFBC1F)==0x3A00080D) {\n\t\tdecode_fields32(ENC_SETF8_ONLY_SETF, ctx, instr);\n\t\tif(!HaveFlagManipulateExt() || ctx->sf!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->msb = (ctx->sz==1) ? 15 : 7;\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->sz==0) OK(ENC_SETF8_ONLY_SETF);\n\t\tif(ctx->sz==1) OK(ENC_SETF16_ONLY_SETF);\n\t}\n\treturn rc;\n}\n\n/* sev.xml */\nint SEV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=100|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503209F) {\n\t\tdecode_fields32(ENC_SEV_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_SEV_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* sevl.xml */\nint SEVL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=101|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD50320BF) {\n\t\tdecode_fields32(ENC_SEVL_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_SEVL_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* sha1c_advsimd.xml */\nint SHA1C_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode=000|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E000000) {\n\t\tdecode_fields32(ENC_SHA1C_QSV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1C_QSV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha1h_advsimd.xml */\nint SHA1H_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|10100|opcode=00000|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E280800) {\n\t\tdecode_fields32(ENC_SHA1H_SS_CRYPTOSHA2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1H_SS_CRYPTOSHA2);\n\t}\n\treturn rc;\n}\n\n/* sha1m_advsimd.xml */\nint SHA1M_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode=010|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E002000) {\n\t\tdecode_fields32(ENC_SHA1M_QSV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1M_QSV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha1p_advsimd.xml */\nint SHA1P_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode=001|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E001000) {\n\t\tdecode_fields32(ENC_SHA1P_QSV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1P_QSV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha1su0_advsimd.xml */\nint SHA1SU0_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode=011|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E003000) {\n\t\tdecode_fields32(ENC_SHA1SU0_VVV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1SU0_VVV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha1su1_advsimd.xml */\nint SHA1SU1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|10100|opcode=00001|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E281800) {\n\t\tdecode_fields32(ENC_SHA1SU1_VV_CRYPTOSHA2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveSHA1Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA1SU1_VV_CRYPTOSHA2);\n\t}\n\treturn rc;\n}\n\n/* sha256h2_advsimd.xml */\nint SHA256H2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode[2:1]=10|P=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E005000) {\n\t\tdecode_fields32(ENC_SHA256H2_QQV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA256Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->part1 = (ctx->P==0);\n\t\tOK(ENC_SHA256H2_QQV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha256h_advsimd.xml */\nint SHA256H_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode[2:1]=10|P=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E004000) {\n\t\tdecode_fields32(ENC_SHA256H_QQV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA256Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->part1 = (ctx->P==0);\n\t\tOK(ENC_SHA256H_QQV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha256su0_advsimd.xml */\nint SHA256SU0_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|10100|opcode=00010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x5E282800) {\n\t\tdecode_fields32(ENC_SHA256SU0_VV_CRYPTOSHA2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HaveSHA256Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA256SU0_VV_CRYPTOSHA2);\n\t}\n\treturn rc;\n}\n\n/* sha256su1_advsimd.xml */\nint SHA256SU1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 01011110|size=00|0|Rm=xxxxx|0|opcode=110|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5E006000) {\n\t\tdecode_fields32(ENC_SHA256SU1_VVV_CRYPTOSHA3, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(!HaveSHA256Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SHA256SU1_VVV_CRYPTOSHA3);\n\t}\n\treturn rc;\n}\n\n/* sha512h2_advsimd.xml */\nint SHA512H2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE608400) {\n\t\tdecode_fields32(ENC_SHA512H2_QQV_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSHA512Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SHA512H2_QQV_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* sha512h_advsimd.xml */\nint SHA512H_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE608000) {\n\t\tdecode_fields32(ENC_SHA512H_QQV_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSHA512Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SHA512H_QQV_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* sha512su0_advsimd.xml */\nint SHA512SU0_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110110000001000|opcode=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xCEC08000) {\n\t\tdecode_fields32(ENC_SHA512SU0_VV2_CRYPTOSHA512_2, ctx, instr);\n\t\tif(!HaveSHA512Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tOK(ENC_SHA512SU0_VV2_CRYPTOSHA512_2);\n\t}\n\treturn rc;\n}\n\n/* sha512su1_advsimd.xml */\nint SHA512SU1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE608800) {\n\t\tdecode_fields32(ENC_SHA512SU1_VVV2_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSHA512Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SHA512SU1_VVV2_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* shadd_advsimd.xml */\nint SHADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE200400) {\n\t\tdecode_fields32(ENC_SHADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SHADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* shll_advsimd.xml */\nint SHLL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E213800) {\n\t\tdecode_fields32(ENC_SHLL_ASIMDMISC_S, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ctx->esize;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SHLL_ASIMDMISC_S);\n\t}\n\treturn rc;\n}\n\n/* shl_advsimd.xml */\nint SHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F005400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SHL_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tOK(ENC_SHL_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF005400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SHL_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tOK(ENC_SHL_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* shrn_advsimd.xml */\nint SHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF008400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* shsub_advsimd.xml */\nint SHSUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE202400) {\n\t\tdecode_fields32(ENC_SHSUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SHSUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sli_advsimd.xml */\nint SLI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F005400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SLI_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tOK(ENC_SLI_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F005400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SLI_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tOK(ENC_SLI_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* sm3partw1_advsimd.xml */\nint SM3PARTW1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE60C000) {\n\t\tdecode_fields32(ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* sm3partw2_advsimd.xml */\nint SM3PARTW2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE60C400) {\n\t\tdecode_fields32(ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* sm3ss1_advsimd.xml */\nint SM3SS1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 110011100|Op0=10|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0xCE400000) {\n\t\tdecode_fields32(ENC_SM3SS1_VVV4_CRYPTO4, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tOK(ENC_SM3SS1_VVV4_CRYPTO4);\n\t}\n\treturn rc;\n}\n\n/* sm3tt1a_advsimd.xml */\nint SM3TT1A_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0CC00)==0xCE408000) {\n\t\tdecode_fields32(ENC_SM3TT1A_VVV4_CRYPTO3_IMM2, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->i = UINT(ctx->imm2);\n\t\tOK(ENC_SM3TT1A_VVV4_CRYPTO3_IMM2);\n\t}\n\treturn rc;\n}\n\n/* sm3tt1b_advsimd.xml */\nint SM3TT1B_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0CC00)==0xCE408400) {\n\t\tdecode_fields32(ENC_SM3TT1B_VVV4_CRYPTO3_IMM2, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->i = UINT(ctx->imm2);\n\t\tOK(ENC_SM3TT1B_VVV4_CRYPTO3_IMM2);\n\t}\n\treturn rc;\n}\n\n/* sm3tt2a_advsimd.xml */\nint SM3TT2A_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0CC00)==0xCE408800) {\n\t\tdecode_fields32(ENC_SM3TT2A_VVV4_CRYPTO3_IMM2, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->i = UINT(ctx->imm2);\n\t\tOK(ENC_SM3TT2A_VVV4_CRYPTO3_IMM2);\n\t}\n\treturn rc;\n}\n\n/* sm3tt2b_advsimd.xml */\nint SM3TT2B_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=11|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0CC00)==0xCE408C00) {\n\t\tdecode_fields32(ENC_SM3TT2B_VVV_CRYPTO3_IMM2, ctx, instr);\n\t\tif(!HaveSM3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->i = UINT(ctx->imm2);\n\t\tOK(ENC_SM3TT2B_VVV_CRYPTO3_IMM2);\n\t}\n\treturn rc;\n}\n\n/* sm4ekey_advsimd.xml */\nint SM4EKEY_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xCE60C800) {\n\t\tdecode_fields32(ENC_SM4EKEY_VVV4_CRYPTOSHA512_3, ctx, instr);\n\t\tif(!HaveSM4Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_SM4EKEY_VVV4_CRYPTOSHA512_3);\n\t}\n\treturn rc;\n}\n\n/* sm4e_advsimd.xml */\nint SM4E_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110110000001000|opcode=01|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xCEC08400) {\n\t\tdecode_fields32(ENC_SM4E_VV4_CRYPTOSHA512_2, ctx, instr);\n\t\tif(!HaveSM4Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tOK(ENC_SM4E_VV4_CRYPTOSHA512_2);\n\t}\n\treturn rc;\n}\n\n/* smaddl.xml */\nint SMADDL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=0|op31[1:0]=01|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9B200000) {\n\t\tdecode_fields32(ENC_SMADDL_64WA_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = 0x20;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return SMULL_SMADDL(ctx, instr);\n\t\tOK(ENC_SMADDL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* smaxp_advsimd.xml */\nint SMAXP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=1010|o1=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20A400) {\n\t\tdecode_fields32(ENC_SMAXP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_SMAXP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* smaxv_advsimd.xml */\nint SMAXV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=0|01110|size=xx|11000|op=0|opcode[3:0]=1010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE30A800) {\n\t\tdecode_fields32(ENC_SMAXV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->min = (ctx->op==1);\n\t\tOK(ENC_SMAXV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* smax_advsimd.xml */\nint SMAX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0110|o1=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE206400) {\n\t\tdecode_fields32(ENC_SMAX_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_SMAX_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* smc.xml */\nint SMC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=11 */\n\tif((INSWORD & 0xFFE0001F)==0xD4000003) {\n\t\tdecode_fields32(ENC_SMC_EX_EXCEPTION, ctx, instr);\n\t\tOK(ENC_SMC_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* sminp_advsimd.xml */\nint SMINP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=1010|o1=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20AC00) {\n\t\tdecode_fields32(ENC_SMINP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_SMINP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sminv_advsimd.xml */\nint SMINV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=0|01110|size=xx|11000|op=1|opcode[3:0]=1010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE31A800) {\n\t\tdecode_fields32(ENC_SMINV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->min = (ctx->op==1);\n\t\tOK(ENC_SMINV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* smin_advsimd.xml */\nint SMIN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0110|o1=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE206C00) {\n\t\tdecode_fields32(ENC_SMIN_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_SMIN_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* smlal_advsimd_elt.xml */\nint SMLAL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=10|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF002000) {\n\t\tdecode_fields32(ENC_SMLAL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SMLAL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* smlal_advsimd_vec.xml */\nint SMLAL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE208000) {\n\t\tdecode_fields32(ENC_SMLAL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SMLAL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* smlsl_advsimd_elt.xml */\nint SMLSL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=10|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF006000) {\n\t\tdecode_fields32(ENC_SMLSL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SMLSL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* smlsl_advsimd_vec.xml */\nint SMLSL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20A000) {\n\t\tdecode_fields32(ENC_SMLSL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SMLSL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* smmla_advsimd_vec.xml */\nint SMMLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=1|U=0|01110|size=10|0|Rm=xxxxx|1|010|B=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E80A400) {\n\t\tdecode_fields32(ENC_SMMLA_ASIMDSAME2_G, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!((ctx->B<<1)|ctx->U)) {\n\t\t\tctx->op1_unsigned = FALSE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==1) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==2) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_SMMLA_ASIMDSAME2_G);\n\t}\n\treturn rc;\n}\n\n/* smnegl_smsubl.xml */\nint SMNEGL_SMSUBL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=0|op31[1:0]=01|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9B20FC00) {\n\t\tdecode_fields32(ENC_SMNEGL_SMSUBL_64WA_DP_3SRC, ctx, instr);\n\t\tOK(ENC_SMNEGL_SMSUBL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* smov_advsimd.xml */\nint SMOV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4[3:2]=01|imm4[1]=0|imm4[0]=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE002C00) {\n\t\tdecode_fields32(ENC_SMOV_ASIMDINS_W_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->Q<<5)|ctx->imm5)&1) {\n\t\t\tctx->size = 0;\n\t\t}\n\t\telse if((((ctx->Q<<5)|ctx->imm5)&3)==2) {\n\t\t\tctx->size = 1;\n\t\t}\n\t\telse if((((ctx->Q<<5)|ctx->imm5)&0x27)==0x24) {\n\t\t\tctx->size = 2;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (SLICE(ctx->imm5,4,4)==1) ? 0x80 : 0x40;\n\t\tctx->index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = (ctx->Q==1) ? 0x40 : 0x20;\n\t\tif(ctx->Q==0) OK(ENC_SMOV_ASIMDINS_W_W);\n\t\tif(ctx->Q==1) OK(ENC_SMOV_ASIMDINS_X_X);\n\t}\n\treturn rc;\n}\n\n/* smstart_msr_imm.xml */\nint SMSTART_MSR_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0100|CRm=0xx1|op2=011|Rt=11111 */\n\tif((INSWORD & 0xFFFFF9FF)==0xD503417F) {\n\t\tdecode_fields32(ENC_SMSTART_MSR_SI_PSTATE, ctx, instr);\n\t\tOK(ENC_SMSTART_MSR_SI_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* smstop_msr_imm.xml */\nint SMSTOP_MSR_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0100|CRm=0xx0|op2=011|Rt=11111 */\n\tif((INSWORD & 0xFFFFF9FF)==0xD503407F) {\n\t\tdecode_fields32(ENC_SMSTOP_MSR_SI_PSTATE, ctx, instr);\n\t\tOK(ENC_SMSTOP_MSR_SI_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* smsubl.xml */\nint SMSUBL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=0|op31[1:0]=01|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9B208000) {\n\t\tdecode_fields32(ENC_SMSUBL_64WA_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = 0x20;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return SMNEGL_SMSUBL(ctx, instr);\n\t\tOK(ENC_SMSUBL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* smulh.xml */\nint SMULH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=0|op31[1:0]=10|Rm=xxxxx|o0=0|Ra=(1)(1)(1)(1)(1)|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9B400000) {\n\t\tdecode_fields32(ENC_SMULH_64_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = ctx->destsize;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SMULH_64_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* smull_smaddl.xml */\nint SMULL_SMADDL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=0|op31[1:0]=01|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9B207C00) {\n\t\tdecode_fields32(ENC_SMULL_SMADDL_64WA_DP_3SRC, ctx, instr);\n\t\tOK(ENC_SMULL_SMADDL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* smull_advsimd_elt.xml */\nint SMULL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1010|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF00A000) {\n\t\tdecode_fields32(ENC_SMULL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SMULL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* smull_advsimd_vec.xml */\nint SMULL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3]=1|opcode[2]=1|opcode[1]=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20C000) {\n\t\tdecode_fields32(ENC_SMULL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SMULL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* sqabs_advsimd.xml */\nint SQABS_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E207800) {\n\t\tdecode_fields32(ENC_SQABS_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_SQABS_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE207800) {\n\t\tdecode_fields32(ENC_SQABS_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_SQABS_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* sqadd_advsimd.xml */\nint SQADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E200C00) {\n\t\tdecode_fields32(ENC_SQADD_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQADD_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE200C00) {\n\t\tdecode_fields32(ENC_SQADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqdmlal_advsimd_elt.xml */\nint SQDMLAL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=11|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x5F003000) {\n\t\tdecode_fields32(ENC_SQDMLAL_ASISDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SQDMLAL_ASISDELEM_L);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=11|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF003000) {\n\t\tdecode_fields32(ENC_SQDMLAL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SQDMLAL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* sqdmlal_advsimd_vec.xml */\nint SQDMLAL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E209000) {\n\t\tdecode_fields32(ENC_SQDMLAL_ASISDDIFF_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tOK(ENC_SQDMLAL_ASISDDIFF_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE209000) {\n\t\tdecode_fields32(ENC_SQDMLAL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tOK(ENC_SQDMLAL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* sqdmlsl_advsimd_elt.xml */\nint SQDMLSL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=11|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x5F007000) {\n\t\tdecode_fields32(ENC_SQDMLSL_ASISDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SQDMLSL_ASISDELEM_L);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=11|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF007000) {\n\t\tdecode_fields32(ENC_SQDMLSL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_SQDMLSL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* sqdmlsl_advsimd_vec.xml */\nint SQDMLSL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E20B000) {\n\t\tdecode_fields32(ENC_SQDMLSL_ASISDDIFF_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tOK(ENC_SQDMLSL_ASISDDIFF_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20B000) {\n\t\tdecode_fields32(ENC_SQDMLSL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tOK(ENC_SQDMLSL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* sqdmulh_advsimd_elt.xml */\nint SQDMULH_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=110|op=0|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x5F00C000) {\n\t\tdecode_fields32(ENC_SQDMULH_ASISDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQDMULH_ASISDELEM_R);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=110|op=0|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF00C000) {\n\t\tdecode_fields32(ENC_SQDMULH_ASIMDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQDMULH_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* sqdmulh_advsimd_vec.xml */\nint SQDMULH_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E20B400) {\n\t\tdecode_fields32(ENC_SQDMULH_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = (ctx->U==1);\n\t\tOK(ENC_SQDMULH_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20B400) {\n\t\tdecode_fields32(ENC_SQDMULH_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = (ctx->U==1);\n\t\tOK(ENC_SQDMULH_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqdmull_advsimd_elt.xml */\nint SQDMULL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode=1011|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x5F00B000) {\n\t\tdecode_fields32(ENC_SQDMULL_ASISDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tOK(ENC_SQDMULL_ASISDELEM_L);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1011|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF00B000) {\n\t\tdecode_fields32(ENC_SQDMULL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_SQDMULL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* sqdmull_advsimd_vec.xml */\nint SQDMULL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=1101|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E20D000) {\n\t\tdecode_fields32(ENC_SQDMULL_ASISDDIFF_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tOK(ENC_SQDMULL_ASISDDIFF_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=1101|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE20D000) {\n\t\tdecode_fields32(ENC_SQDMULL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==0 || ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_SQDMULL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* sqneg_advsimd.xml */\nint SQNEG_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E207800) {\n\t\tdecode_fields32(ENC_SQNEG_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_SQNEG_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E207800) {\n\t\tdecode_fields32(ENC_SQNEG_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->neg = (ctx->U==1);\n\t\tOK(ENC_SQNEG_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlah_advsimd_elt.xml */\nint SQRDMLAH_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=1|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=11|S=0|opcode[0]=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x7F00D000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_ASISDELEM_R, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLAH_ASISDELEM_R);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=11|S=0|opcode[0]=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F00D000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_ASIMDELEM_R, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLAH_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlah_advsimd_vec.xml */\nint SQRDMLAH_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|0|Rm=xxxxx|1|opcode[3:1]=000|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E008400) {\n\t\tdecode_fields32(ENC_SQRDMLAH_ASISDSAME2_ONLY, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLAH_ASISDSAME2_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|opcode[3:1]=000|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E008400) {\n\t\tdecode_fields32(ENC_SQRDMLAH_ASIMDSAME2_ONLY, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLAH_ASIMDSAME2_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlsh_advsimd_elt.xml */\nint SQRDMLSH_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=1|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=11|S=1|opcode[0]=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x7F00F000) {\n\t\tdecode_fields32(ENC_SQRDMLSH_ASISDELEM_R, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLSH_ASISDELEM_R);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=11|S=1|opcode[0]=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F00F000) {\n\t\tdecode_fields32(ENC_SQRDMLSH_ASIMDELEM_R, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLSH_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlsh_advsimd_vec.xml */\nint SQRDMLSH_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|0|Rm=xxxxx|1|opcode[3:1]=000|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E008C00) {\n\t\tdecode_fields32(ENC_SQRDMLSH_ASISDSAME2_ONLY, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLSH_ASISDSAME2_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|opcode[3:1]=000|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E008C00) {\n\t\tdecode_fields32(ENC_SQRDMLSH_ASIMDSAME2_ONLY, ctx, instr);\n\t\tif(!HaveQRDMLAHExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = TRUE;\n\t\tctx->sub_op = (ctx->S==1);\n\t\tOK(ENC_SQRDMLSH_ASIMDSAME2_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqrdmulh_advsimd_elt.xml */\nint SQRDMULH_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_scalar */\n\t/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=110|op=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF00F400)==0x5F00D000) {\n\t\tdecode_fields32(ENC_SQRDMULH_ASISDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQRDMULH_ASISDELEM_R);\n\t}\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=110|op=1|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0xF00D000) {\n\t\tdecode_fields32(ENC_SQRDMULH_ASIMDELEM_R, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQRDMULH_ASIMDELEM_R);\n\t}\n\treturn rc;\n}\n\n/* sqrdmulh_advsimd_vec.xml */\nint SQRDMULH_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E20B400) {\n\t\tdecode_fields32(ENC_SQRDMULH_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->rounding = (ctx->U==1);\n\t\tOK(ENC_SQRDMULH_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E20B400) {\n\t\tdecode_fields32(ENC_SQRDMULH_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3 || ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->rounding = (ctx->U==1);\n\t\tOK(ENC_SQRDMULH_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqrshl_advsimd.xml */\nint SQRSHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E205C00) {\n\t\tdecode_fields32(ENC_SQRSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SQRSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE205C00) {\n\t\tdecode_fields32(ENC_SQRSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_SQRSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqrshrn_advsimd.xml */\nint SQRSHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F009C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQRSHRN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQRSHRN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF009C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQRSHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQRSHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* sqrshrun_advsimd.xml */\nint SQRSHRUN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F008C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQRSHRUN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQRSHRUN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F008C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQRSHRUN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQRSHRUN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* sqshlu_advsimd.xml */\nint SQSHLU_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:2]=011|op=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F006400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHLU_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_SQSHLU_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:2]=011|op=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F006400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHLU_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_SQSHLU_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* sqshl_advsimd_imm.xml */\nint SQSHL_advsimd_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:2]=011|op=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F007400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHL_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_SQSHL_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:2]=011|op=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF007400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHL_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_SQSHL_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* sqshl_advsimd_reg.xml */\nint SQSHL_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E204C00) {\n\t\tdecode_fields32(ENC_SQSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SQSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE204C00) {\n\t\tdecode_fields32(ENC_SQSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_SQSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqshrn_advsimd.xml */\nint SQSHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F009400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHRN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQSHRN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF009400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQSHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* sqshrun_advsimd.xml */\nint SQSHRUN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F008400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHRUN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQSHRUN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:1]=1000|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F008400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SQSHRUN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tOK(ENC_SQSHRUN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* sqsub_advsimd.xml */\nint SQSUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E202C00) {\n\t\tdecode_fields32(ENC_SQSUB_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQSUB_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE202C00) {\n\t\tdecode_fields32(ENC_SQSUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQSUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sqxtn_advsimd.xml */\nint SQXTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E214800) {\n\t\tdecode_fields32(ENC_SQXTN_ASISDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->part = 0;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQXTN_ASISDMISC_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE214800) {\n\t\tdecode_fields32(ENC_SQXTN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SQXTN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* sqxtun_advsimd.xml */\nint SQXTUN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E212800) {\n\t\tdecode_fields32(ENC_SQXTUN_ASISDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->part = 0;\n\t\tctx->elements = 1;\n\t\tOK(ENC_SQXTUN_ASISDMISC_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E212800) {\n\t\tdecode_fields32(ENC_SQXTUN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_SQXTUN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* srhadd_advsimd.xml */\nint SRHADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE201400) {\n\t\tdecode_fields32(ENC_SRHADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SRHADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sri_advsimd.xml */\nint SRI_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=01000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F004400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRI_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tOK(ENC_SRI_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=01000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F004400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRI_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tOK(ENC_SRI_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* srshl_advsimd.xml */\nint SRSHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E205400) {\n\t\tdecode_fields32(ENC_SRSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SRSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE205400) {\n\t\tdecode_fields32(ENC_SRSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_SRSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* srshr_advsimd.xml */\nint SRSHR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F002400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRSHR_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SRSHR_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF002400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRSHR_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SRSHR_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* srsra_advsimd.xml */\nint SRSRA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F003400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRSRA_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SRSRA_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF003400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SRSRA_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SRSRA_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* ssbb_dsb.xml */\nint SSBB_DSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_dsb_memory */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=0000|op2[2]=1|opc=00|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503309F) {\n\t\tdecode_fields32(ENC_SSBB_DSB_BO_BARRIERS, ctx, instr);\n\t\tOK(ENC_SSBB_DSB_BO_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* sshll_advsimd.xml */\nint SSHLL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF00A400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SSHLL_ASIMDSHF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->immb==0 && BitCount(ctx->immh)==1) return SXTL_SSHLL_advsimd(ctx, instr);\n\t\tOK(ENC_SSHLL_ASIMDSHF_L);\n\t}\n\treturn rc;\n}\n\n/* sshl_advsimd.xml */\nint SSHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5E204400) {\n\t\tdecode_fields32(ENC_SSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE204400) {\n\t\tdecode_fields32(ENC_SSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_SSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sshr_advsimd.xml */\nint SSHR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F000400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SSHR_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SSHR_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF000400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SSHR_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SSHR_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* ssra_advsimd.xml */\nint SSRA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x5F001400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SSRA_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SSRA_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0xF001400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SSRA_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_SSRA_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* ssubl_advsimd.xml */\nint SSUBL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE202000) {\n\t\tdecode_fields32(ENC_SSUBL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SSUBL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* ssubw_advsimd.xml */\nint SSUBW_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE203000) {\n\t\tdecode_fields32(ENC_SSUBW_ASIMDDIFF_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SSUBW_ASIMDDIFF_W);\n\t}\n\treturn rc;\n}\n\n/* st1_advsimd_mult.xml */\nint ST1_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=0|000000|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xC002000) {\n\t\tdecode_fields32(ENC_ST1_ASISDLSE_R1_1V, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==7) OK(ENC_ST1_ASISDLSE_R1_1V);\n\t\tif(ctx->opcode==10) OK(ENC_ST1_ASISDLSE_R2_2V);\n\t\tif(ctx->opcode==6) OK(ENC_ST1_ASISDLSE_R3_3V);\n\t\tif(ctx->opcode==2) OK(ENC_ST1_ASISDLSE_R4_4V);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xC802000) {\n\t\tdecode_fields32(ENC_ST1_ASISDLSEP_I1_I1, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==7) OK(ENC_ST1_ASISDLSEP_I1_I1);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==7) OK(ENC_ST1_ASISDLSEP_R1_R1);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==10) OK(ENC_ST1_ASISDLSEP_I2_I2);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==10) OK(ENC_ST1_ASISDLSEP_R2_R2);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==6) OK(ENC_ST1_ASISDLSEP_I3_I3);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==6) OK(ENC_ST1_ASISDLSEP_R3_R3);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2) OK(ENC_ST1_ASISDLSEP_I4_I4);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2) OK(ENC_ST1_ASISDLSEP_R4_R4);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* st1_advsimd_sngl.xml */\nint ST1_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=0|R=0|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD000000) {\n\t\tdecode_fields32(ENC_ST1_ASISDLSO_B1_1B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==0) OK(ENC_ST1_ASISDLSO_B1_1B);\n\t\tif(ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST1_ASISDLSO_H1_1H);\n\t\tif(ctx->opcode==4 && ctx->size==0) OK(ENC_ST1_ASISDLSO_S1_1S);\n\t\tif(ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST1_ASISDLSO_D1_1D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=0|R=0|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xD800000) {\n\t\tdecode_fields32(ENC_ST1_ASISDLSOP_B1_I1B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==0) OK(ENC_ST1_ASISDLSOP_B1_I1B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==0) OK(ENC_ST1_ASISDLSOP_BX1_R1B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST1_ASISDLSOP_H1_I1H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST1_ASISDLSOP_HX1_R1H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_ST1_ASISDLSOP_S1_I1S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_ST1_ASISDLSOP_SX1_R1S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST1_ASISDLSOP_D1_I1D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST1_ASISDLSOP_DX1_R1D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* st2g.xml */\nint ST2G(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9A00400) {\n\t\tdecode_fields32(ENC_ST2G_64SPOST_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_ST2G_64SPOST_LDSTTAGS);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9A00C00) {\n\t\tdecode_fields32(ENC_ST2G_64SPRE_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_ST2G_64SPRE_LDSTTAGS);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9A00800) {\n\t\tdecode_fields32(ENC_ST2G_64SOFFSET_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_ST2G_64SOFFSET_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* st2_advsimd_mult.xml */\nint ST2_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=0|000000|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC008000) {\n\t\tdecode_fields32(ENC_ST2_ASISDLSE_R2, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_ST2_ASISDLSE_R2);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xC808000) {\n\t\tdecode_fields32(ENC_ST2_ASISDLSEP_I2_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_ST2_ASISDLSEP_I2_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_ST2_ASISDLSEP_R2_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* st2_advsimd_sngl.xml */\nint ST2_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=0|R=1|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD200000) {\n\t\tdecode_fields32(ENC_ST2_ASISDLSO_B2_2B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==0) OK(ENC_ST2_ASISDLSO_B2_2B);\n\t\tif(ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST2_ASISDLSO_H2_2H);\n\t\tif(ctx->opcode==4 && ctx->size==0) OK(ENC_ST2_ASISDLSO_S2_2S);\n\t\tif(ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST2_ASISDLSO_D2_2D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=0|R=1|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDA00000) {\n\t\tdecode_fields32(ENC_ST2_ASISDLSOP_B2_I2B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==0) OK(ENC_ST2_ASISDLSOP_B2_I2B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==0) OK(ENC_ST2_ASISDLSOP_BX2_R2B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST2_ASISDLSOP_H2_I2H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==2 && !(ctx->size&1)) OK(ENC_ST2_ASISDLSOP_HX2_R2H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_ST2_ASISDLSOP_S2_I2S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->size==0) OK(ENC_ST2_ASISDLSOP_SX2_R2S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST2_ASISDLSOP_D2_I2D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==4 && ctx->S==0 && ctx->size==1) OK(ENC_ST2_ASISDLSOP_DX2_R2D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* st3_advsimd_mult.xml */\nint ST3_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=0|000000|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC004000) {\n\t\tdecode_fields32(ENC_ST3_ASISDLSE_R3, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_ST3_ASISDLSE_R3);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xC804000) {\n\t\tdecode_fields32(ENC_ST3_ASISDLSEP_I3_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_ST3_ASISDLSEP_I3_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_ST3_ASISDLSEP_R3_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* st3_advsimd_sngl.xml */\nint ST3_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=0|R=0|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD002000) {\n\t\tdecode_fields32(ENC_ST3_ASISDLSO_B3_3B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==1) OK(ENC_ST3_ASISDLSO_B3_3B);\n\t\tif(ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST3_ASISDLSO_H3_3H);\n\t\tif(ctx->opcode==5 && ctx->size==0) OK(ENC_ST3_ASISDLSO_S3_3S);\n\t\tif(ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST3_ASISDLSO_D3_3D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=0|R=0|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xD802000) {\n\t\tdecode_fields32(ENC_ST3_ASISDLSOP_B3_I3B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==1) OK(ENC_ST3_ASISDLSOP_B3_I3B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==1) OK(ENC_ST3_ASISDLSOP_BX3_R3B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST3_ASISDLSOP_H3_I3H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST3_ASISDLSOP_HX3_R3H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_ST3_ASISDLSOP_S3_I3S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_ST3_ASISDLSOP_SX3_R3S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST3_ASISDLSOP_D3_I3D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST3_ASISDLSOP_DX3_R3D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* st4_advsimd_mult.xml */\nint ST4_advsimd_mult(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011000|L=0|000000|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFFF000)==0xC000000) {\n\t\tdecode_fields32(ENC_ST4_ASISDLSE_R4, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tOK(ENC_ST4_ASISDLSE_R4);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE0F000)==0xC800000) {\n\t\tdecode_fields32(ENC_ST4_ASISDLSEP_I4_I, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f) OK(ENC_ST4_ASISDLSEP_I4_I);\n\t\tif(ctx->Rm!=0x1f) OK(ENC_ST4_ASISDLSEP_R4_R);\n\t}\n\t/* post-decode pcode */\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (UINT(ctx->size));\n\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\tif(!ctx->opcode) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 4;\n\t}\n\telse if(ctx->opcode==2) {\n\t\tctx->rpt = 4;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==4) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 3;\n\t}\n\telse if(ctx->opcode==6) {\n\t\tctx->rpt = 3;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==7) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 1;\n\t}\n\telse if(ctx->opcode==8) {\n\t\tctx->rpt = 1;\n\t\tctx->selem = 2;\n\t}\n\telse if(ctx->opcode==10) {\n\t\tctx->rpt = 2;\n\t\tctx->selem = 1;\n\t}\n\telse {\n\t\tUNDEFINED;\n\t}\n\tif(((ctx->size<<1)|ctx->Q)==6 && ctx->selem!=1) {\n\t\tUNDEFINED;\n\t}\n\treturn rc;\n}\n\n/* st4_advsimd_sngl.xml */\nint ST4_advsimd_sngl(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_as_no_post_index */\n\t/* 0|Q=x|0011010|L=0|R=1|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFFF2000)==0xD202000) {\n\t\tdecode_fields32(ENC_ST4_ASISDLSO_B4_4B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = 0;\n\t\tctx->wback = FALSE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->opcode==1) OK(ENC_ST4_ASISDLSO_B4_4B);\n\t\tif(ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST4_ASISDLSO_H4_4H);\n\t\tif(ctx->opcode==5 && ctx->size==0) OK(ENC_ST4_ASISDLSO_S4_4S);\n\t\tif(ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST4_ASISDLSO_D4_4D);\n\t}\n\t/* class iclass_as_post_index */\n\t/* 0|Q=x|0011011|L=0|R=1|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE02000)==0xDA02000) {\n\t\tdecode_fields32(ENC_ST4_ASISDLSOP_B4_I4B, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->wback = TRUE;\n\t\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\t\tif(ctx->Rm==0x1f && ctx->opcode==1) OK(ENC_ST4_ASISDLSOP_B4_I4B);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==1) OK(ENC_ST4_ASISDLSOP_BX4_R4B);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST4_ASISDLSOP_H4_I4H);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==3 && !(ctx->size&1)) OK(ENC_ST4_ASISDLSOP_HX4_R4H);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_ST4_ASISDLSOP_S4_I4S);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->size==0) OK(ENC_ST4_ASISDLSOP_SX4_R4S);\n\t\tif(ctx->Rm==0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST4_ASISDLSOP_D4_I4D);\n\t\tif(ctx->Rm!=0x1f && ctx->opcode==5 && ctx->S==0 && ctx->size==1) OK(ENC_ST4_ASISDLSOP_DX4_R4D);\n\t}\n\t/* post-decode pcode */\n\tctx->init_scale = UINT(SLICE(ctx->opcode,2,1));\n\tctx->scale = ctx->init_scale;\n\tctx->selem = UINT(((SLICE(ctx->opcode,0,0)<<1)|ctx->R))+1;\n\tctx->replicate = FALSE;\n\tif(ctx->scale==3) {\n\t\tif(ctx->L==0 || ctx->S==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->replicate = TRUE;\n\t}\n\telse if(ctx->scale==0) {\n\t\tctx->index = UINT(((ctx->Q<<3)|(ctx->S<<2)|ctx->size));\n\t}\n\telse if(ctx->scale==1) {\n\t\tif(SLICE(ctx->size,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->index = UINT(((ctx->Q<<2)|(ctx->S<<1)|SLICE(ctx->size,1,1)));\n\t}\n\telse if(ctx->scale==2) {\n\t\tif(SLICE(ctx->size,1,1)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->size,0,0)==0) {\n\t\t\tctx->index = UINT(((ctx->Q<<1)|ctx->S));\n\t\t}\n\t\telse {\n\t\t\tif(ctx->S==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->index = UINT(ctx->Q);\n\t\t\tctx->scale = 3;\n\t\t}\n\t}\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\tctx->esize = (8) << (ctx->scale);\n\treturn rc;\n}\n\n/* st64b.xml */\nint ST64B(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=11|111|V=0|00|A=0|R=0|1|Rs=11111|o3=1|opc=001|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xF83F9000) {\n\t\tdecode_fields32(ENC_ST64B_64L_MEMOP, ctx, instr);\n\t\tif(!HaveFeatLS64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rt,4,3)==3 || SLICE(ctx->Rt,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_ST64B_64L_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* st64bv.xml */\nint ST64BV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=11|111|V=0|00|A=0|R=0|1|Rs=xxxxx|o3=1|opc=011|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xF820B000) {\n\t\tdecode_fields32(ENC_ST64BV_64_MEMOP, ctx, instr);\n\t\tif(!HaveFeatLS64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rt,4,3)==3 || SLICE(ctx->Rt,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_ST64BV_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* st64bv0.xml */\nint ST64BV0(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=11|111|V=0|00|A=0|R=0|1|Rs=xxxxx|o3=1|opc=010|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xF820A000) {\n\t\tdecode_fields32(ENC_ST64BV0_64_MEMOP, ctx, instr);\n\t\tif(!HaveFeatLS64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->Rt,4,3)==3 || SLICE(ctx->Rt,0,0)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_ST64BV0_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* staddb_ldaddb.xml */\nint STADDB_LDADDB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820001F) {\n\t\tdecode_fields32(ENC_STADDB_LDADDB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STADDB_LDADDB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STADDLB_LDADDLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* staddh_ldaddh.xml */\nint STADDH_LDADDH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820001F) {\n\t\tdecode_fields32(ENC_STADDH_LDADDH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STADDH_LDADDH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STADDLH_LDADDLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stadd_ldadd.xml */\nint STADD_LDADD(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820001F) {\n\t\tdecode_fields32(ENC_STADD_LDADD_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STADD_LDADD_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STADDL_LDADDL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STADD_LDADD_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STADDL_LDADDL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stclrb_ldclrb.xml */\nint STCLRB_LDCLRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820101F) {\n\t\tdecode_fields32(ENC_STCLRB_LDCLRB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STCLRB_LDCLRB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STCLRLB_LDCLRLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stclrh_ldclrh.xml */\nint STCLRH_LDCLRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820101F) {\n\t\tdecode_fields32(ENC_STCLRH_LDCLRH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STCLRH_LDCLRH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STCLRLH_LDCLRLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stclr_ldclr.xml */\nint STCLR_LDCLR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820101F) {\n\t\tdecode_fields32(ENC_STCLR_LDCLR_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STCLR_LDCLR_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STCLRL_LDCLRL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STCLR_LDCLR_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STCLRL_LDCLRL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* steorb_ldeorb.xml */\nint STEORB_LDEORB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820201F) {\n\t\tdecode_fields32(ENC_STEORB_LDEORB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STEORB_LDEORB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STEORLB_LDEORLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* steorh_ldeorh.xml */\nint STEORH_LDEORH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820201F) {\n\t\tdecode_fields32(ENC_STEORH_LDEORH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STEORH_LDEORH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STEORLH_LDEORLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* steor_ldeor.xml */\nint STEOR_LDEOR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820201F) {\n\t\tdecode_fields32(ENC_STEOR_LDEOR_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STEOR_LDEOR_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STEORL_LDEORL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STEOR_LDEOR_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STEORL_LDEORL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stg.xml */\nint STG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9200400) {\n\t\tdecode_fields32(ENC_STG_64SPOST_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_STG_64SPOST_LDSTTAGS);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9200C00) {\n\t\tdecode_fields32(ENC_STG_64SPRE_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_STG_64SPRE_LDSTTAGS);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9200800) {\n\t\tdecode_fields32(ENC_STG_64SOFFSET_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = FALSE;\n\t\tOK(ENC_STG_64SOFFSET_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* stgm.xml */\nint STGM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 11011001|opc=10|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xD9A00000) {\n\t\tdecode_fields32(ENC_STGM_64BULK_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTE2Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tOK(ENC_STGM_64BULK_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* stgp.xml */\nint STGP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=01|101|V=0|001|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x68800000) {\n\t\tdecode_fields32(ENC_STGP_64_LDSTPAIR_POST, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->t2 = UINT(ctx->Xt2);\n\t\tctx->offset = LSL(SignExtend(ctx->simm7,7),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tOK(ENC_STGP_64_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=01|101|V=0|011|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x69800000) {\n\t\tdecode_fields32(ENC_STGP_64_LDSTPAIR_PRE, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->t2 = UINT(ctx->Xt2);\n\t\tctx->offset = LSL(SignExtend(ctx->simm7,7),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tOK(ENC_STGP_64_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=01|101|V=0|010|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x69000000) {\n\t\tdecode_fields32(ENC_STGP_64_LDSTPAIR_OFF, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->t2 = UINT(ctx->Xt2);\n\t\tctx->offset = LSL(SignExtend(ctx->simm7,7),LOG2_TAG_GRANULE);\n\t\tctx->writeback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tOK(ENC_STGP_64_LDSTPAIR_OFF);\n\t}\n\treturn rc;\n}\n\n/* stllr.xml */\nint STLLR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88800000) {\n\t\tdecode_fields32(ENC_STLLR_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2) OK(ENC_STLLR_SL32_LDSTORD);\n\t\tif(ctx->size==3) OK(ENC_STLLR_SL64_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stllrb.xml */\nint STLLRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8800000) {\n\t\tdecode_fields32(ENC_STLLRB_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_STLLRB_SL32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stllrh.xml */\nint STLLRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48800000) {\n\t\tdecode_fields32(ENC_STLLRH_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_STLLRH_SL32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stlr.xml */\nint STLR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88808000) {\n\t\tdecode_fields32(ENC_STLR_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2) OK(ENC_STLR_SL32_LDSTORD);\n\t\tif(ctx->size==3) OK(ENC_STLR_SL64_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stlrb.xml */\nint STLRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8808000) {\n\t\tdecode_fields32(ENC_STLRB_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_STLRB_SL32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stlrh.xml */\nint STLRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48808000) {\n\t\tdecode_fields32(ENC_STLRH_SL32_LDSTORD, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tOK(ENC_STLRH_SL32_LDSTORD);\n\t}\n\treturn rc;\n}\n\n/* stlurb.xml */\nint STLURB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x19000000) {\n\t\tdecode_fields32(ENC_STLURB_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STLURB_32_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stlurh.xml */\nint STLURH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x59000000) {\n\t\tdecode_fields32(ENC_STLURH_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STLURH_32_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stlur_gen.xml */\nint STLUR_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0x99000000) {\n\t\tdecode_fields32(ENC_STLUR_32_LDAPSTL_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_STLUR_32_LDAPSTL_UNSCALED);\n\t\tif(ctx->size==3) OK(ENC_STLUR_64_LDAPSTL_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = AccType_ORDERED;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stlxp.xml */\nint STLXP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* 1|sz=x|001000|o2=0|L=0|o1=1|Rs=xxxxx|o0=1|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88208000) {\n\t\tdecode_fields32(ENC_STLXP_SP32_LDSTEXCLP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = TRUE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (0x20) << (UINT(ctx->sz));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->sz==0) OK(ENC_STLXP_SP32_LDSTEXCLP);\n\t\tif(ctx->sz==1) OK(ENC_STLXP_SP64_LDSTEXCLP);\n\t}\n\treturn rc;\n}\n\n/* stlxr.xml */\nint STLXR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88008000) {\n\t\tdecode_fields32(ENC_STLXR_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->size==2) OK(ENC_STLXR_SR32_LDSTEXCLR);\n\t\tif(ctx->size==3) OK(ENC_STLXR_SR64_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stlxrb.xml */\nint STLXRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8008000) {\n\t\tdecode_fields32(ENC_STLXRB_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_STLXRB_SR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stlxrh.xml */\nint STLXRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48008000) {\n\t\tdecode_fields32(ENC_STLXRH_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_STLXRH_SR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stnp_fpsimd.xml */\nint STNP_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=xx|101|V=1|000|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2C000000) {\n\t\tdecode_fields32(ENC_STNP_S_LDSTNAPAIR_OFFS, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STNP_S_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==1) OK(ENC_STNP_D_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==2) OK(ENC_STNP_Q_LDSTNAPAIR_OFFS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_VECSTREAM;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(ctx->opc);\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stnp_gen.xml */\nint STNP_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=x0|101|V=0|000|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x28000000) {\n\t\tdecode_fields32(ENC_STNP_32_LDSTNAPAIR_OFFS, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STNP_32_LDSTNAPAIR_OFFS);\n\t\tif(ctx->opc==2) OK(ENC_STNP_64_LDSTNAPAIR_OFFS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_STREAM;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(SLICE(ctx->opc,0,0)==1) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(SLICE(ctx->opc,1,1));\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stp_fpsimd.xml */\nint STP_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=xx|101|V=1|001|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2C800000) {\n\t\tdecode_fields32(ENC_STP_S_LDSTPAIR_POST, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_POST);\n\t\tif(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_POST);\n\t\tif(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=xx|101|V=1|011|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2D800000) {\n\t\tdecode_fields32(ENC_STP_S_LDSTPAIR_PRE, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_PRE);\n\t\tif(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_PRE);\n\t\tif(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=xx|101|V=1|010|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3FC00000)==0x2D000000) {\n\t\tdecode_fields32(ENC_STP_S_LDSTPAIR_OFF, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_OFF);\n\t\tif(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_OFF);\n\t\tif(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_OFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->scale = 2+UINT(ctx->opc);\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stp_gen.xml */\nint STP_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* opc=x0|101|V=0|001|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x28800000) {\n\t\tdecode_fields32(ENC_STP_32_LDSTPAIR_POST, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_32_LDSTPAIR_POST);\n\t\tif(ctx->opc==2) OK(ENC_STP_64_LDSTPAIR_POST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* opc=x0|101|V=0|011|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x29800000) {\n\t\tdecode_fields32(ENC_STP_32_LDSTPAIR_PRE, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_32_LDSTPAIR_PRE);\n\t\tif(ctx->opc==2) OK(ENC_STP_64_LDSTPAIR_PRE);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* opc=x0|101|V=0|010|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7FC00000)==0x29000000) {\n\t\tdecode_fields32(ENC_STP_32_LDSTPAIR_OFF, ctx, instr);\n\t\tif(ctx->opc==0) OK(ENC_STP_32_LDSTPAIR_OFF);\n\t\tif(ctx->opc==2) OK(ENC_STP_64_LDSTPAIR_OFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->t2 = UINT(ctx->Rt2);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\tif(((ctx->L<<1)|SLICE(ctx->opc,0,0))==1 || ctx->opc==3) {\n\t\tUNDEFINED;\n\t}\n\tctx->signed_ = (SLICE(ctx->opc,0,0)!=0);\n\tctx->scale = 2+UINT(SLICE(ctx->opc,1,1));\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale);\n\tctx->tag_checked = ctx->wback || ctx->n!=0x1f;\n\tctx->rt_unknown = FALSE;\n\tctx->wb_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && (ctx->t==ctx->n || ctx->t2==ctx->n) && ctx->n!=0x1f) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) {\n\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* strb_imm.xml */\nint STRB_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38000400) {\n\t\tdecode_fields32(ENC_STRB_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STRB_32_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38000C00) {\n\t\tdecode_fields32(ENC_STRB_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STRB_32_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=00|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x39000000) {\n\t\tdecode_fields32(ENC_STRB_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_STRB_32_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* strb_reg.xml */\nint STRB_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32 */\n\t/* size=00|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38200800) {\n\t\tdecode_fields32(ENC_STRB_32B_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->option!=3) OK(ENC_STRB_32B_LDST_REGOFF);\n\t\tif(ctx->option==3) OK(ENC_STRB_32BL_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* strh_imm.xml */\nint STRH_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78000400) {\n\t\tdecode_fields32(ENC_STRH_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STRH_32_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78000C00) {\n\t\tdecode_fields32(ENC_STRH_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STRH_32_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=01|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0x79000000) {\n\t\tdecode_fields32(ENC_STRH_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tOK(ENC_STRH_32_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* strh_reg.xml */\nint STRH_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32 */\n\t/* size=01|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78200800) {\n\t\tdecode_fields32(ENC_STRH_32_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tOK(ENC_STRH_32_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* str_imm_fpsimd.xml */\nint STR_imm_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C000400) {\n\t\tdecode_fields32(ENC_STR_B_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==0) OK(ENC_STR_B_LDST_IMMPOST);\n\t\tif(ctx->size==1 && ctx->opc==0) OK(ENC_STR_H_LDST_IMMPOST);\n\t\tif(ctx->size==2 && ctx->opc==0) OK(ENC_STR_S_LDST_IMMPOST);\n\t\tif(ctx->size==3 && ctx->opc==0) OK(ENC_STR_D_LDST_IMMPOST);\n\t\tif(ctx->size==0 && ctx->opc==2) OK(ENC_STR_Q_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C000C00) {\n\t\tdecode_fields32(ENC_STR_B_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==0) OK(ENC_STR_B_LDST_IMMPRE);\n\t\tif(ctx->size==1 && ctx->opc==0) OK(ENC_STR_H_LDST_IMMPRE);\n\t\tif(ctx->size==2 && ctx->opc==0) OK(ENC_STR_S_LDST_IMMPRE);\n\t\tif(ctx->size==3 && ctx->opc==0) OK(ENC_STR_D_LDST_IMMPRE);\n\t\tif(ctx->size==0 && ctx->opc==2) OK(ENC_STR_Q_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=xx|111|V=1|01|opc=x0|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F400000)==0x3D000000) {\n\t\tdecode_fields32(ENC_STR_B_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->size==0 && ctx->opc==0) OK(ENC_STR_B_LDST_POS);\n\t\tif(ctx->size==1 && ctx->opc==0) OK(ENC_STR_H_LDST_POS);\n\t\tif(ctx->size==2 && ctx->opc==0) OK(ENC_STR_S_LDST_POS);\n\t\tif(ctx->size==3 && ctx->opc==0) OK(ENC_STR_D_LDST_POS);\n\t\tif(ctx->size==0 && ctx->opc==2) OK(ENC_STR_Q_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\treturn rc;\n}\n\n/* str_imm_gen.xml */\nint STR_imm_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8000400) {\n\t\tdecode_fields32(ENC_STR_32_LDST_IMMPOST, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_STR_32_LDST_IMMPOST);\n\t\tif(ctx->size==3) OK(ENC_STR_64_LDST_IMMPOST);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8000C00) {\n\t\tdecode_fields32(ENC_STR_32_LDST_IMMPRE, ctx, instr);\n\t\tctx->wback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_STR_32_LDST_IMMPRE);\n\t\tif(ctx->size==3) OK(ENC_STR_64_LDST_IMMPRE);\n\t}\n\t/* class iclass_unsigned_scaled_offset */\n\t/* size=1x|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFC00000)==0xB9000000) {\n\t\tdecode_fields32(ENC_STR_32_LDST_POS, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = LSL(ZeroExtend(ctx->imm12,0x40),ctx->scale);\n\t\tif(ctx->size==2) OK(ENC_STR_32_LDST_POS);\n\t\tif(ctx->size==3) OK(ENC_STR_64_LDST_POS);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* str_reg_fpsimd.xml */\nint STR_reg_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_fpsimd */\n\t/* size=xx|111|V=1|00|opc=x0|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C200800) {\n\t\tdecode_fields32(ENC_STR_B_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->size==0 && ctx->opc==0 && ctx->option!=3) OK(ENC_STR_B_LDST_REGOFF);\n\t\tif(ctx->size==0 && ctx->opc==0 && ctx->option==3) OK(ENC_STR_BL_LDST_REGOFF);\n\t\tif(ctx->size==1 && ctx->opc==0) OK(ENC_STR_H_LDST_REGOFF);\n\t\tif(ctx->size==2 && ctx->opc==0) OK(ENC_STR_S_LDST_REGOFF);\n\t\tif(ctx->size==3 && ctx->opc==0) OK(ENC_STR_D_LDST_REGOFF);\n\t\tif(ctx->size==0 && ctx->opc==2) OK(ENC_STR_Q_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\treturn rc;\n}\n\n/* str_reg_gen.xml */\nint STR_reg_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8200800) {\n\t\tdecode_fields32(ENC_STR_32_LDST_REGOFF, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tif(SLICE(ctx->option,1,1)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = (ctx->S==1) ? ctx->scale : 0;\n\t\tif(ctx->size==2) OK(ENC_STR_32_LDST_REGOFF);\n\t\tif(ctx->size==3) OK(ENC_STR_64_LDST_REGOFF);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->m = UINT(ctx->Rm);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH;\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stsetb_ldsetb.xml */\nint STSETB_LDSETB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820301F) {\n\t\tdecode_fields32(ENC_STSETB_LDSETB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSETB_LDSETB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSETLB_LDSETLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stseth_ldseth.xml */\nint STSETH_LDSETH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820301F) {\n\t\tdecode_fields32(ENC_STSETH_LDSETH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSETH_LDSETH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSETLH_LDSETLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stset_ldset.xml */\nint STSET_LDSET(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820301F) {\n\t\tdecode_fields32(ENC_STSET_LDSET_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STSET_LDSET_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STSETL_LDSETL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STSET_LDSET_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STSETL_LDSETL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsmaxb_ldsmaxb.xml */\nint STSMAXB_LDSMAXB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820401F) {\n\t\tdecode_fields32(ENC_STSMAXB_LDSMAXB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSMAXB_LDSMAXB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSMAXLB_LDSMAXLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsmaxh_ldsmaxh.xml */\nint STSMAXH_LDSMAXH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820401F) {\n\t\tdecode_fields32(ENC_STSMAXH_LDSMAXH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSMAXH_LDSMAXH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSMAXLH_LDSMAXLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsmax_ldsmax.xml */\nint STSMAX_LDSMAX(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820401F) {\n\t\tdecode_fields32(ENC_STSMAX_LDSMAX_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STSMAX_LDSMAX_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STSMAXL_LDSMAXL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STSMAX_LDSMAX_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STSMAXL_LDSMAXL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsminb_ldsminb.xml */\nint STSMINB_LDSMINB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820501F) {\n\t\tdecode_fields32(ENC_STSMINB_LDSMINB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSMINB_LDSMINB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSMINLB_LDSMINLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsminh_ldsminh.xml */\nint STSMINH_LDSMINH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820501F) {\n\t\tdecode_fields32(ENC_STSMINH_LDSMINH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STSMINH_LDSMINH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STSMINLH_LDSMINLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stsmin_ldsmin.xml */\nint STSMIN_LDSMIN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820501F) {\n\t\tdecode_fields32(ENC_STSMIN_LDSMIN_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STSMIN_LDSMIN_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STSMINL_LDSMINL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STSMIN_LDSMIN_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STSMINL_LDSMINL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* sttr.xml */\nint STTR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8000800) {\n\t\tdecode_fields32(ENC_STTR_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_STTR_32_LDST_UNPRIV);\n\t\tif(ctx->size==3) OK(ENC_STTR_64_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* sttrb.xml */\nint STTRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38000800) {\n\t\tdecode_fields32(ENC_STTRB_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STTRB_32_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* sttrh.xml */\nint STTRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78000800) {\n\t\tdecode_fields32(ENC_STTRH_32_LDST_UNPRIV, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STTRH_32_LDST_UNPRIV);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);\n\tctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;\n\tctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;\n\tif(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {\n\t\tctx->acctype = ctx->AccType_UNPRIV;\n\t}\n\telse {\n\t\tctx->acctype = ctx->AccType_NORMAL;\n\t}\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stumaxb_ldumaxb.xml */\nint STUMAXB_LDUMAXB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820601F) {\n\t\tdecode_fields32(ENC_STUMAXB_LDUMAXB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STUMAXB_LDUMAXB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STUMAXLB_LDUMAXLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stumaxh_ldumaxh.xml */\nint STUMAXH_LDUMAXH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820601F) {\n\t\tdecode_fields32(ENC_STUMAXH_LDUMAXH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STUMAXH_LDUMAXH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STUMAXLH_LDUMAXLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stumax_ldumax.xml */\nint STUMAX_LDUMAX(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820601F) {\n\t\tdecode_fields32(ENC_STUMAX_LDUMAX_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STUMAX_LDUMAX_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STUMAXL_LDUMAXL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STUMAX_LDUMAX_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STUMAXL_LDUMAXL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stuminb_lduminb.xml */\nint STUMINB_LDUMINB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x3820701F) {\n\t\tdecode_fields32(ENC_STUMINB_LDUMINB_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STUMINB_LDUMINB_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STUMINLB_LDUMINLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stuminh_lduminh.xml */\nint STUMINH_LDUMINH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xFFA0FC1F)==0x7820701F) {\n\t\tdecode_fields32(ENC_STUMINH_LDUMINH_32_MEMOP, ctx, instr);\n\t\tif(ctx->R==0) OK(ENC_STUMINH_LDUMINH_32_MEMOP);\n\t\tif(ctx->R==1) OK(ENC_STUMINLH_LDUMINLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* stumin_ldumin.xml */\nint STUMIN_LDUMIN(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */\n\tif((INSWORD & 0xBFA0FC1F)==0xB820701F) {\n\t\tdecode_fields32(ENC_STUMIN_LDUMIN_32_MEMOP, ctx, instr);\n\t\tif(ctx->size==2 && ctx->R==0) OK(ENC_STUMIN_LDUMIN_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->R==1) OK(ENC_STUMINL_LDUMINL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==0) OK(ENC_STUMIN_LDUMIN_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->R==1) OK(ENC_STUMINL_LDUMINL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* sturb.xml */\nint STURB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x38000000) {\n\t\tdecode_fields32(ENC_STURB_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STURB_32_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* sturh.xml */\nint STURH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0x78000000) {\n\t\tdecode_fields32(ENC_STURH_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tOK(ENC_STURH_32_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stur_fpsimd.xml */\nint STUR_fpsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x3F600C00)==0x3C000000) {\n\t\tdecode_fields32(ENC_STUR_B_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(((SLICE(ctx->opc,1,1)<<2)|ctx->size));\n\t\tif(ctx->scale>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==0 && ctx->opc==0) OK(ENC_STUR_B_LDST_UNSCALED);\n\t\tif(ctx->size==1 && ctx->opc==0) OK(ENC_STUR_H_LDST_UNSCALED);\n\t\tif(ctx->size==2 && ctx->opc==0) OK(ENC_STUR_S_LDST_UNSCALED);\n\t\tif(ctx->size==3 && ctx->opc==0) OK(ENC_STUR_D_LDST_UNSCALED);\n\t\tif(ctx->size==0 && ctx->opc==2) OK(ENC_STUR_Q_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_VEC;\n\tctx->memop = (SLICE(ctx->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\treturn rc;\n}\n\n/* stur_gen.xml */\nint STUR_gen(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_plus_offset */\n\t/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE00C00)==0xB8000000) {\n\t\tdecode_fields32(ENC_STUR_32_LDST_UNSCALED, ctx, instr);\n\t\tctx->wback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->scale = UINT(ctx->size);\n\t\tctx->offset = SignExtend(ctx->imm9,9);\n\t\tif(ctx->size==2) OK(ENC_STUR_32_LDST_UNSCALED);\n\t\tif(ctx->size==3) OK(ENC_STUR_64_LDST_UNSCALED);\n\t}\n\t/* post-decode pcode */\n\tctx->n = UINT(ctx->Rn);\n\tctx->t = UINT(ctx->Rt);\n\tctx->acctype = ctx->AccType_NORMAL;\n\tif(SLICE(ctx->opc,1,1)==0) {\n\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t};\n\t\tif(ctx->size==3) {\n\t\t\tctx->regsize = 0x40;\n\t\t};\n\t\tctx->signed_ = FALSE;\n\t}\n\telse {\n\t\tif(ctx->size==3) {\n\t\t\tctx->memop = MemOp_PREFETCH;\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctx->memop = MemOp_LOAD;\n\t\t\tif(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opc,0,0)==1) {\n\t\t\t\tctx->regsize = 0x20;\n\t\t\t};\n\t\t\tctx->signed_ = TRUE;\n\t\t}\n\t}\n\tctx->datasize = (8) << (ctx->scale);\n\tctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);\n\tctx->wb_unknown = FALSE;\n\tctx->rt_unknown = FALSE;\n\tif(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\tif(ctx->memop==MemOp_STORE && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {\n\t\t// assignment from ConstrainUnpredictable()\n\t\t// assert\n\t\t// switch on constraint\n\t}\n\treturn rc;\n}\n\n/* stxp.xml */\nint STXP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* 1|sz=x|001000|o2=0|L=0|o1=1|Rs=xxxxx|o0=0|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88200000) {\n\t\tdecode_fields32(ENC_STXP_SP32_LDSTEXCLP, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = TRUE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (0x20) << (UINT(ctx->sz));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->sz==0) OK(ENC_STXP_SP32_LDSTEXCLP);\n\t\tif(ctx->sz==1) OK(ENC_STXP_SP64_LDSTEXCLP);\n\t}\n\treturn rc;\n}\n\n/* stxr.xml */\nint STXR(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=1x|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBFE08000)==0x88000000) {\n\t\tdecode_fields32(ENC_STXR_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tif(ctx->size==2) OK(ENC_STXR_SR32_LDSTEXCLR);\n\t\tif(ctx->size==3) OK(ENC_STXR_SR64_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stxrb.xml */\nint STXRB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=00|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x8000000) {\n\t\tdecode_fields32(ENC_STXRB_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_STXRB_SR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stxrh.xml */\nint STXRH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_base_register */\n\t/* size=01|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x48000000) {\n\t\tdecode_fields32(ENC_STXRH_SR32_LDSTEXCLR, ctx, instr);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->t2 = UINT(ctx->Rt2);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;\n\t\tctx->pair = FALSE;\n\t\tctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE;\n\t\tctx->elsize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20;\n\t\tctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tctx->rt_unknown = FALSE;\n\t\tctx->rn_unknown = FALSE;\n\t\tif(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) {\n\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP);\n\t\t\t// assert\n\t\t\t// switch on constraint\n\t\t}\n\t\tif(ctx->memop==MemOp_STORE) {\n\t\t\tif(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t\tif(ctx->s==ctx->n && ctx->n!=0x1f) {\n\t\t\t\tctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP);\n\t\t\t\t// assert\n\t\t\t\t// switch on constraint\n\t\t\t}\n\t\t}\n\t\tOK(ENC_STXRH_SR32_LDSTEXCLR);\n\t}\n\treturn rc;\n}\n\n/* stz2g.xml */\nint STZ2G(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9E00400) {\n\t\tdecode_fields32(ENC_STZ2G_64SPOST_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZ2G_64SPOST_LDSTTAGS);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9E00C00) {\n\t\tdecode_fields32(ENC_STZ2G_64SPRE_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZ2G_64SPRE_LDSTTAGS);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9E00800) {\n\t\tdecode_fields32(ENC_STZ2G_64SOFFSET_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZ2G_64SOFFSET_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* stzg.xml */\nint STZG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_post_indexed */\n\t/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9600400) {\n\t\tdecode_fields32(ENC_STZG_64SPOST_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = TRUE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZG_64SPOST_LDSTTAGS);\n\t}\n\t/* class iclass_pre_indexed */\n\t/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9600C00) {\n\t\tdecode_fields32(ENC_STZG_64SPRE_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = TRUE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZG_64SPRE_LDSTTAGS);\n\t}\n\t/* class iclass_signed_scaled_offset */\n\t/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFE00C00)==0xD9600800) {\n\t\tdecode_fields32(ENC_STZG_64SOFFSET_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->offset = LSL(SignExtend(ctx->imm9,9),LOG2_TAG_GRANULE);\n\t\tctx->writeback = FALSE;\n\t\tctx->postindex = FALSE;\n\t\tctx->zero_data = TRUE;\n\t\tOK(ENC_STZG_64SOFFSET_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* stzgm.xml */\nint STZGM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 11011001|opc=00|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0xD9200000) {\n\t\tdecode_fields32(ENC_STZGM_64BULK_LDSTTAGS, ctx, instr);\n\t\tif(!HaveMTE2Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Xt);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tOK(ENC_STZGM_64BULK_LDSTTAGS);\n\t}\n\treturn rc;\n}\n\n/* subg.xml */\nint SUBG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|op=1|S=0|100011|o2=0|uimm6=xxxxxx|op3=(0)(0)|uimm4=xxxx|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFC00000)==0xD1800000) {\n\t\tdecode_fields32(ENC_SUBG_64_ADDSUB_IMMTAGS, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->tag_offset = ctx->uimm4;\n\t\tctx->offset = LSL(ZeroExtend(ctx->uimm6,0x40),LOG2_TAG_GRANULE);\n\t\tctx->ADD = FALSE;\n\t\tOK(ENC_SUBG_64_ADDSUB_IMMTAGS);\n\t}\n\treturn rc;\n}\n\n/* subhn_advsimd.xml */\nint SUBHN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE206000) {\n\t\tdecode_fields32(ENC_SUBHN_ASIMDDIFF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->round = (ctx->U==1);\n\t\tOK(ENC_SUBHN_ASIMDDIFF_N);\n\t}\n\treturn rc;\n}\n\n/* subp.xml */\nint SUBP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9AC00000) {\n\t\tdecode_fields32(ENC_SUBP_64S_DP_2SRC, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->m = UINT(ctx->Xm);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_SUBP_64S_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* subps.xml */\nint SUBPS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|0|S=1|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0xBAC00000) {\n\t\tdecode_fields32(ENC_SUBPS_64S_DP_2SRC, ctx, instr);\n\t\tif(!HaveMTEExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Xd);\n\t\tctx->n = UINT(ctx->Xn);\n\t\tctx->m = UINT(ctx->Xm);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t/* regular aliases */\n\t\tif(ctx->S==1 && ctx->Xd==0x1f) return CMPP_SUBPS(ctx, instr);\n\t\tOK(ENC_SUBPS_64S_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* subs_addsub_ext.xml */\nint SUBS_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00000)==0x6B200000) {\n\t\tdecode_fields32(ENC_SUBS_32S_ADDSUB_EXT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = UINT(ctx->imm3);\n\t\tif(ctx->shift>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMP_SUBS_addsub_ext(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SUBS_32S_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_SUBS_64S_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* subs_addsub_imm.xml */\nint SUBS_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x71000000) {\n\t\tdecode_fields32(ENC_SUBS_32S_ADDSUB_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(!ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(ctx->imm12,ctx->datasize);\n\t\t}\n\t\telse if(ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(((ctx->imm12<<12)|0),ctx->datasize);\n\t\t}\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMP_SUBS_addsub_imm(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SUBS_32S_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_SUBS_64S_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* subs_addsub_shift.xml */\nint SUBS_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x6B000000) {\n\t\tdecode_fields32(ENC_SUBS_32_ADDSUB_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->shift==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\t/* regular aliases */\n\t\tif(ctx->Rd==0x1f) return CMP_SUBS_addsub_shift(ctx, instr);\n\t\tif(ctx->Rn==0x1f && ctx->Rd!=0x1f) return NEGS_SUBS_addsub_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SUBS_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_SUBS_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* sub_addsub_ext.xml */\nint SUB_addsub_ext(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE00000)==0x4B200000) {\n\t\tdecode_fields32(ENC_SUB_32_ADDSUB_EXT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tctx->extend_type = DecodeRegExtend(ctx->option);\n\t\tctx->shift = UINT(ctx->imm3);\n\t\tif(ctx->shift>4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0) OK(ENC_SUB_32_ADDSUB_EXT);\n\t\tif(ctx->sf==1) OK(ENC_SUB_64_ADDSUB_EXT);\n\t}\n\treturn rc;\n}\n\n/* sub_addsub_imm.xml */\nint SUB_addsub_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x51000000) {\n\t\tdecode_fields32(ENC_SUB_32_ADDSUB_IMM, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(!ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(ctx->imm12,ctx->datasize);\n\t\t}\n\t\telse if(ctx->sh) {\n\t\t\tctx->imm = ZeroExtend(((ctx->imm12<<12)|0),ctx->datasize);\n\t\t}\n\t\tif(ctx->sf==0) OK(ENC_SUB_32_ADDSUB_IMM);\n\t\tif(ctx->sf==1) OK(ENC_SUB_64_ADDSUB_IMM);\n\t}\n\treturn rc;\n}\n\n/* sub_addsub_shift.xml */\nint SUB_addsub_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* sf=x|op=1|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F200000)==0x4B000000) {\n\t\tdecode_fields32(ENC_SUB_32_ADDSUB_SHIFT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->sub_op = (ctx->op==1);\n\t\tctx->setflags = (ctx->S==1);\n\t\tinstr->setflags = (ctx->S==1) ? FLAGEFFECT_SETS : FLAGEFFECT_NONE;\n\t\tif(ctx->shift==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->imm6,5,5)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->shift_type = DecodeShift(ctx->shift);\n\t\tctx->shift_amount = UINT(ctx->imm6);\n\t\t/* regular aliases */\n\t\tif(ctx->Rn==0x1f) return NEG_SUB_addsub_shift(ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_SUB_32_ADDSUB_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_SUB_64_ADDSUB_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* sub_advsimd.xml */\nint SUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E208400) {\n\t\tdecode_fields32(ENC_SUB_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_SUB_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E208400) {\n\t\tdecode_fields32(ENC_SUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->U==1);\n\t\tOK(ENC_SUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* sudot_advsimd_elt.xml */\nint SUDOT_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|US=0|0|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF00F000) {\n\t\tdecode_fields32(ENC_SUDOT_ASIMDELEM_D, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->op1_unsigned = (ctx->US==1);\n\t\tctx->op2_unsigned = (ctx->US==0);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->i = UINT(((ctx->H<<1)|ctx->L));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((0x20) ? ((ctx->datasize) / (0x20)) : 0);\n\t\tOK(ENC_SUDOT_ASIMDELEM_D);\n\t}\n\treturn rc;\n}\n\n/* suqadd_advsimd.xml */\nint SUQADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=0|11110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5E203800) {\n\t\tdecode_fields32(ENC_SUQADD_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SUQADD_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE203800) {\n\t\tdecode_fields32(ENC_SUQADD_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_SUQADD_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* svc.xml */\nint SVC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=01 */\n\tif((INSWORD & 0xFFE0001F)==0xD4000001) {\n\t\tdecode_fields32(ENC_SVC_EX_EXCEPTION, ctx, instr);\n\t\tOK(ENC_SVC_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* swp.xml */\nint SWP(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xB8208000) {\n\t\tdecode_fields32(ENC_SWP_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_SWP_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_SWPA_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_SWPAL_32_MEMOP);\n\t\tif(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_SWPL_32_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_SWP_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_SWPA_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_SWPAL_64_MEMOP);\n\t\tif(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_SWPL_64_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* swpb.xml */\nint SWPB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x38208000) {\n\t\tdecode_fields32(ENC_SWPAB_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_SWPAB_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_SWPALB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_SWPB_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_SWPLB_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* swph.xml */\nint SWPH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x78208000) {\n\t\tdecode_fields32(ENC_SWPAH_32_MEMOP, ctx, instr);\n\t\tif(!HaveAtomicExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->s = UINT(ctx->Rs);\n\t\tctx->datasize = (8) << (UINT(ctx->size));\n\t\tctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;\n\t\tctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;\n\t\tctx->tag_checked = ctx->n!=0x1f;\n\t\tif(ctx->A==1 && ctx->R==0) OK(ENC_SWPAH_32_MEMOP);\n\t\tif(ctx->A==1 && ctx->R==1) OK(ENC_SWPALH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==0) OK(ENC_SWPH_32_MEMOP);\n\t\tif(ctx->A==0 && ctx->R==1) OK(ENC_SWPLH_32_MEMOP);\n\t}\n\treturn rc;\n}\n\n/* sxtb_sbfm.xml */\nint SXTB_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=000000|imms=000111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FBFFC00)==0x13001C00) {\n\t\tdecode_fields32(ENC_SXTB_SBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_SXTB_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_SXTB_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* sxth_sbfm.xml */\nint SXTH_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=x|opc=00|100110|N=x|immr=000000|imms=001111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FBFFC00)==0x13003C00) {\n\t\tdecode_fields32(ENC_SXTH_SBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_SXTH_SBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_SXTH_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* sxtl_sshll_advsimd.xml */\nint SXTL_SSHLL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|011110|immh!=0000|immb=000|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF87FC00)==0xF00A400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_SXTL_SSHLL_ASIMDSHF_L, ctx, instr);\n\t\tOK(ENC_SXTL_SSHLL_ASIMDSHF_L);\n\t}\n\treturn rc;\n}\n\n/* sxtw_sbfm.xml */\nint SXTW_SBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_signed_fill */\n\t/* sf=1|opc=00|100110|N=1|immr=000000|imms=011111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x93407C00) {\n\t\tdecode_fields32(ENC_SXTW_SBFM_64M_BITFIELD, ctx, instr);\n\t\tOK(ENC_SXTW_SBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* sys.xml */\nint SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=01|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF80000)==0xD5080000) {\n\t\tdecode_fields32(ENC_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tCheckSystemAccess(1,ctx->op1,ctx->CRn,ctx->CRm,ctx->op2,ctx->Rt,ctx->L);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->sys_op0 = 1;\n\t\tctx->sys_op1 = UINT(ctx->op1);\n\t\tctx->sys_op2 = UINT(ctx->op2);\n\t\tctx->sys_crn = UINT(ctx->CRn);\n\t\tctx->sys_crm = UINT(ctx->CRm);\n\t\tctx->has_result = (ctx->L==1);\n\t\t/* regular aliases */\n\t\tif(ctx->CRn==7 && (ctx->CRm&14)==8 && SysOp(ctx->op1,7,ctx->CRm,ctx->op2)==Sys_AT) return AT_SYS(ctx, instr);\n\t\tif(ctx->op1==3 && ctx->CRn==7 && ctx->CRm==3 && ctx->op2==4) return CFP_SYS(ctx, instr);\n\t\tif(ctx->op1==3 && ctx->CRn==7 && ctx->CRm==3 && ctx->op2==7) return CPP_SYS(ctx, instr);\n\t\tif(ctx->CRn==7 && SysOp(ctx->op1,7,ctx->CRm,ctx->op2)==Sys_DC) return DC_SYS(ctx, instr);\n\t\tif(ctx->op1==3 && ctx->CRn==7 && ctx->CRm==3 && ctx->op2==5) return DVP_SYS(ctx, instr);\n\t\tif(ctx->CRn==7 && SysOp(ctx->op1,7,ctx->CRm,ctx->op2)==Sys_IC) return IC_SYS(ctx, instr);\n\t\t// if(ctx->CRn==8 && SysOp(ctx->op1,8,ctx->CRm,ctx->op2)==Sys_TLBI) return TLBI_SYS(ctx, instr);\n\t\tif(((ctx->CRn&14)==8) && SysOp(ctx->op1,ctx->CRn,ctx->CRm,ctx->op2)==Sys_TLBI) return TLBI_SYS(ctx, instr);\n\t\tOK(ENC_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* sysl.xml */\nint SYSL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=1|op0=01|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF80000)==0xD5280000) {\n\t\tdecode_fields32(ENC_SYSL_RC_SYSTEMINSTRS, ctx, instr);\n\t\tCheckSystemAccess(1,ctx->op1,ctx->CRn,ctx->CRm,ctx->op2,ctx->Rt,ctx->L);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->sys_op0 = 1;\n\t\tctx->sys_op1 = UINT(ctx->op1);\n\t\tctx->sys_op2 = UINT(ctx->op2);\n\t\tctx->sys_crn = UINT(ctx->CRn);\n\t\tctx->sys_crm = UINT(ctx->CRm);\n\t\tctx->has_result = (ctx->L==1);\n\t\tOK(ENC_SYSL_RC_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* tbl_advsimd.xml */\nint TBL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|op2=00|0|Rm=xxxxx|0|len=xx|op=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE09C00)==0xE000000) {\n\t\tdecode_fields32(ENC_TBL_ASIMDTBL_L2_2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((8) ? ((ctx->datasize) / (8)) : 0);\n\t\tctx->regs = UINT(ctx->len)+1;\n\t\tctx->is_tbl = (ctx->op==0);\n\t\tif(ctx->len==1) OK(ENC_TBL_ASIMDTBL_L2_2);\n\t\tif(ctx->len==2) OK(ENC_TBL_ASIMDTBL_L3_3);\n\t\tif(ctx->len==3) OK(ENC_TBL_ASIMDTBL_L4_4);\n\t\tif(ctx->len==0) OK(ENC_TBL_ASIMDTBL_L1_1);\n\t}\n\treturn rc;\n}\n\n/* tbnz.xml */\nint TBNZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br14 */\n\t/* b5=x|011011|op=1|b40=xxxxx|imm14=xxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7F000000)==0x37000000) {\n\t\tdecode_fields32(ENC_TBNZ_ONLY_TESTBRANCH, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->datasize = (ctx->b5==1) ? 0x40 : 0x20;\n\t\tctx->bit_pos = UINT(((ctx->b5<<5)|ctx->b40));\n\t\tctx->bit_val = ctx->op;\n\t\tctx->offset = SignExtend((ctx->imm14<<2),16);\n\t\tOK(ENC_TBNZ_ONLY_TESTBRANCH);\n\t}\n\treturn rc;\n}\n\n/* tbx_advsimd.xml */\nint TBX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|op2=00|0|Rm=xxxxx|0|len=xx|op=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE09C00)==0xE001000) {\n\t\tdecode_fields32(ENC_TBX_ASIMDTBL_L2_2, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((8) ? ((ctx->datasize) / (8)) : 0);\n\t\tctx->regs = UINT(ctx->len)+1;\n\t\tctx->is_tbl = (ctx->op==0);\n\t\tif(ctx->len==1) OK(ENC_TBX_ASIMDTBL_L2_2);\n\t\tif(ctx->len==2) OK(ENC_TBX_ASIMDTBL_L3_3);\n\t\tif(ctx->len==3) OK(ENC_TBX_ASIMDTBL_L4_4);\n\t\tif(ctx->len==0) OK(ENC_TBX_ASIMDTBL_L1_1);\n\t}\n\treturn rc;\n}\n\n/* tbz.xml */\nint TBZ(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_br14 */\n\t/* b5=x|011011|op=0|b40=xxxxx|imm14=xxxxxxxxxxxxxx|Rt=xxxxx */\n\tif((INSWORD & 0x7F000000)==0x36000000) {\n\t\tdecode_fields32(ENC_TBZ_ONLY_TESTBRANCH, ctx, instr);\n\t\tctx->t = UINT(ctx->Rt);\n\t\tctx->datasize = (ctx->b5==1) ? 0x40 : 0x20;\n\t\tctx->bit_pos = UINT(((ctx->b5<<5)|ctx->b40));\n\t\tctx->bit_val = ctx->op;\n\t\tctx->offset = SignExtend((ctx->imm14<<2),16);\n\t\tOK(ENC_TBZ_ONLY_TESTBRANCH);\n\t}\n\treturn rc;\n}\n\n/* tcancel.xml */\nint TCANCEL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010100|opc=011|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=00 */\n\tif((INSWORD & 0xFFE0001F)==0xD4600000) {\n\t\tdecode_fields32(ENC_TCANCEL_EX_EXCEPTION, ctx, instr);\n\t\tif(!HaveTME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->retry = (SLICE(ctx->imm16,15,15)==1);\n\t\tctx->reason = SLICE(ctx->imm16,14,0);\n\t\tOK(ENC_TCANCEL_EX_EXCEPTION);\n\t}\n\treturn rc;\n}\n\n/* tcommit.xml */\nint TCOMMIT(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=0000|op2=011|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503307F) {\n\t\tdecode_fields32(ENC_TCOMMIT_ONLY_BARRIERS, ctx, instr);\n\t\tif(!HaveTME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_TCOMMIT_ONLY_BARRIERS);\n\t}\n\treturn rc;\n}\n\n/* tlbi_sys.xml */\nint TLBI_SYS(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t// /* 1101010100|L=0|op0=01|op1=xxx|CRn=1000|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\t// if((INSWORD & 0xFFF8F000)==0xD5088000) {\n\t/* 110|101|0100|L=0|01|op1=xxx|CRn=100x|CRm=xxxx|op2=xxx|Rt=xxxxx */\n\tif((INSWORD & 0xFFF8E000)==0xD5088000) {\n\t\tdecode_fields32(ENC_TLBI_SYS_CR_SYSTEMINSTRS, ctx, instr);\n\t\tOK(ENC_TLBI_SYS_CR_SYSTEMINSTRS);\n\t}\n\treturn rc;\n}\n\n/* trn1_advsimd.xml */\nint TRN1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE002800) {\n\t\tdecode_fields32(ENC_TRN1_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tctx->pairs = ((2) ? ((ctx->elements) / (2)) : 0);\n\t\tOK(ENC_TRN1_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* trn2_advsimd.xml */\nint TRN2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE006800) {\n\t\tdecode_fields32(ENC_TRN2_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tctx->pairs = ((2) ? ((ctx->elements) / (2)) : 0);\n\t\tOK(ENC_TRN2_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* tsb.xml */\nint TSB(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=010|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503225F) {\n\t\tdecode_fields32(ENC_TSB_HC_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_TSB_HC_HINTS);\n\t}\n\treturn rc;\n}\n\n/* tstart.xml */\nint TSTART(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=1|op0=00|op1=011|CRn=0011|CRm=0000|op2=011|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD5233060) {\n\t\tdecode_fields32(ENC_TSTART_BR_SYSTEMRESULT, ctx, instr);\n\t\tif(!HaveTME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tOK(ENC_TSTART_BR_SYSTEMRESULT);\n\t}\n\treturn rc;\n}\n\n/* tst_ands_log_imm.xml */\nint TST_ANDS_log_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|opc=11|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F80001F)==0x7200001F) {\n\t\tdecode_fields32(ENC_TST_ANDS_32S_LOG_IMM, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_TST_ANDS_32S_LOG_IMM);\n\t\tif(ctx->sf==1) OK(ENC_TST_ANDS_64S_LOG_IMM);\n\t}\n\treturn rc;\n}\n\n/* tst_ands_log_shift.xml */\nint TST_ANDS_log_shift(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* sf=x|opc=11|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */\n\tif((INSWORD & 0x7F20001F)==0x6A00001F) {\n\t\tdecode_fields32(ENC_TST_ANDS_32_LOG_SHIFT, ctx, instr);\n\t\tif(ctx->sf==0) OK(ENC_TST_ANDS_32_LOG_SHIFT);\n\t\tif(ctx->sf==1) OK(ENC_TST_ANDS_64_LOG_SHIFT);\n\t}\n\treturn rc;\n}\n\n/* ttest.xml */\nint TTEST(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=1|op0=00|op1=011|CRn=0011|CRm=0001|op2=011|Rt=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD5233160) {\n\t\tdecode_fields32(ENC_TTEST_BR_SYSTEMRESULT, ctx, instr);\n\t\tif(!HaveTME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Rt);\n\t\tOK(ENC_TTEST_BR_SYSTEMRESULT);\n\t}\n\treturn rc;\n}\n\n/* uabal_advsimd.xml */\nint UABAL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|op=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E205000) {\n\t\tdecode_fields32(ENC_UABAL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->accumulate = (ctx->op==0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UABAL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* uaba_advsimd.xml */\nint UABA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0111|ac=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E207C00) {\n\t\tdecode_fields32(ENC_UABA_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->accumulate = (ctx->ac==1);\n\t\tOK(ENC_UABA_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uabdl_advsimd.xml */\nint UABDL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=01|op=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E207000) {\n\t\tdecode_fields32(ENC_UABDL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->accumulate = (ctx->op==0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UABDL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* uabd_advsimd.xml */\nint UABD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0111|ac=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E207400) {\n\t\tdecode_fields32(ENC_UABD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->accumulate = (ctx->ac==1);\n\t\tOK(ENC_UABD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uadalp_advsimd.xml */\nint UADALP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode[4:3]=00|op=1|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E206800) {\n\t\tdecode_fields32(ENC_UADALP_ASIMDMISC_P, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((((2) * (ctx->esize))) ? ((ctx->datasize) / (((2) * (ctx->esize)))) : 0);\n\t\tctx->acc = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UADALP_ASIMDMISC_P);\n\t}\n\treturn rc;\n}\n\n/* uaddlp_advsimd.xml */\nint UADDLP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode[4:3]=00|op=0|opcode[1:0]=10|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E202800) {\n\t\tdecode_fields32(ENC_UADDLP_ASIMDMISC_P, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((((2) * (ctx->esize))) ? ((ctx->datasize) / (((2) * (ctx->esize)))) : 0);\n\t\tctx->acc = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UADDLP_ASIMDMISC_P);\n\t}\n\treturn rc;\n}\n\n/* uaddlv_advsimd.xml */\nint UADDLV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=1|01110|size=xx|11000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E303800) {\n\t\tdecode_fields32(ENC_UADDLV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UADDLV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uaddl_advsimd.xml */\nint UADDL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E200000) {\n\t\tdecode_fields32(ENC_UADDL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UADDL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* uaddw_advsimd.xml */\nint UADDW_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=0|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E201000) {\n\t\tdecode_fields32(ENC_UADDW_ASIMDDIFF_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UADDW_ASIMDDIFF_W);\n\t}\n\treturn rc;\n}\n\n/* ubfiz_ubfm.xml */\nint UBFIZ_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x53000000) {\n\t\tdecode_fields32(ENC_UBFIZ_UBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_UBFIZ_UBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_UBFIZ_UBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* ubfm.xml */\nint UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x53000000) {\n\t\tdecode_fields32(ENC_UBFM_32M_BITFIELD, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->opc) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = TRUE;\n\t\t}\n\t\telse if(ctx->opc==1) {\n\t\t\tctx->inzero = FALSE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==2) {\n\t\t\tctx->inzero = TRUE;\n\t\t\tctx->extend = FALSE;\n\t\t}\n\t\telse if(ctx->opc==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==1 && ctx->N!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && (ctx->N!=0 || SLICE(ctx->immr,5,5)!=0 || SLICE(ctx->imms,5,5)!=0)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->R = UINT(ctx->immr);\n\t\tctx->S = UINT(ctx->imms);\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(ctx->N,ctx->imms,ctx->immr);\n\t\tctx->wmask = dbmrt.wmask;\n\t\tctx->tmask = dbmrt.tmask;\n\t\t/* regular aliases */\n\t\tbool encoding32 = ctx->sf==0 && ctx->N==0;\n\t\tbool encoding64 = ctx->sf==1 && ctx->N==1;\n\t\tif((ctx->imms!=0x1f && ctx->imms+1==ctx->immr && EncodingLabeled32Bit()) || (ctx->imms!=0x3f && ctx->imms+1==ctx->immr && EncodingLabeled64Bit())) return LSL_UBFM(ctx, instr);\n\t\tif((ctx->imms==0x1f && EncodingLabeled32Bit()) || (ctx->imms==0x3f && EncodingLabeled64Bit())) return LSR_UBFM(ctx, instr);\n\t\tif(UINT(ctx->imms)<UINT(ctx->immr)) return UBFIZ_UBFM(ctx, instr);\n\t\tif(BFXPreferred(ctx->sf,SLICE(ctx->opc,1,1),ctx->imms,ctx->immr)) return UBFX_UBFM(ctx, instr);\n\t\tif(ctx->immr==0 && ctx->imms==7) return UXTB_UBFM(ctx, instr);\n\t\tif(ctx->immr==0 && ctx->imms==15) return UXTH_UBFM(ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_UBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_UBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* ubfx_ubfm.xml */\nint UBFX_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F800000)==0x53000000) {\n\t\tdecode_fields32(ENC_UBFX_UBFM_32M_BITFIELD, ctx, instr);\n\t\tif(ctx->sf==0 && ctx->N==0) OK(ENC_UBFX_UBFM_32M_BITFIELD);\n\t\tif(ctx->sf==1 && ctx->N==1) OK(ENC_UBFX_UBFM_64M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* ucvtf_advsimd_fix.xml */\nint UCVTF_advsimd_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F00E400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UCVTF_ASISDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_ASISDSHF_C);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F00E400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UCVTF_ASIMDSHF_C, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(!(ctx->immh&14) || ((ctx->immh&14)==2 && !HaveFP16Ext())) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = ((ctx->immh&8)==8) ? 0x40 : (((ctx->immh&12)==4) ? 0x20 : 0x10);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->fracbits = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_ASIMDSHF_C);\n\t}\n\treturn rc;\n}\n\n/* ucvtf_advsimd_int.xml */\nint UCVTF_advsimd_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd_half */\n\t/* 01|U=1|11110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x7E79D800) {\n\t\tdecode_fields32(ENC_UCVTF_ASISDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UCVTF_ASISDMISCFP16_R);\n\t}\n\t/* class iclass_sisd_single_and_double */\n\t/* 01|U=1|11110|size[1]=0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFBFFC00)==0x7E21D800) {\n\t\tdecode_fields32(ENC_UCVTF_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UCVTF_ASISDMISC_R);\n\t}\n\t/* class iclass_simd_half */\n\t/* 0|Q=x|U=1|01110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFFFFC00)==0x2E79D800) {\n\t\tdecode_fields32(ENC_UCVTF_ASIMDMISCFP16_R, ctx, instr);\n\t\tif(!HaveFP16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = 0x10;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UCVTF_ASIMDMISCFP16_R);\n\t}\n\t/* class iclass_simd_single_and_double */\n\t/* 0|Q=x|U=1|01110|size[1]=0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2E21D800) {\n\t\tdecode_fields32(ENC_UCVTF_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->sz<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UCVTF_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* ucvtf_float_fix.xml */\nint UCVTF_float_fix(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|0|rmode=00|opcode=011|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3F0000)==0x1E030000) {\n\t\tdecode_fields32(ENC_UCVTF_H32_FLOAT2FIX, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(ctx->sf==0 && SLICE(ctx->scale,5,5)==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->fracbits = 0x40-UINT(ctx->scale);\n\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==3) {\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_UCVTF_H32_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_UCVTF_S32_FLOAT2FIX);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_UCVTF_D32_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_UCVTF_H64_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_UCVTF_S64_FLOAT2FIX);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_UCVTF_D64_FLOAT2FIX);\n\t}\n\treturn rc;\n}\n\n/* ucvtf_float_int.xml */\nint UCVTF_float_int(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_float */\n\t/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=011|000000|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7F3FFC00)==0x1E230000) {\n\t\tdecode_fields32(ENC_UCVTF_H32_FLOAT2INT, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->intsize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tif(!ctx->ftype) {\n\t\t\tctx->fltsize = 0x20;\n\t\t}\n\t\telse if(ctx->ftype==1) {\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(ctx->ftype==2) {\n\t\t\tif(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)!=13) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->fltsize = 0x80;\n\t\t}\n\t\telse if(ctx->ftype==3) {\n\t\t\tif(HaveFP16Ext()) {\n\t\t\t\tctx->fltsize = 0x10;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t}\n\t\tif(!(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)&12)) {\n\t\t\tctx->rounding = FPDecodeRounding(ctx->rmode);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==4) {\n\t\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_ItoF;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==8) {\n\t\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==12) {\n\t\t\tif(ctx->fltsize!=0x10 && ctx->fltsize!=ctx->intsize) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 0;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==13) {\n\t\t\tif(ctx->intsize!=0x40 || ctx->fltsize!=0x80) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tif(SLICE(ctx->opcode,0,0)==1) {\n\t\t\t\tctx->op = FPConvOp_MOV_ItoF;\n\t\t\t};\n\t\t\tctx->part = 1;\n\t\t\tctx->fltsize = 0x40;\n\t\t}\n\t\telse if(((SLICE(ctx->opcode,2,1)<<2)|ctx->rmode)==15) {\n\t\t\tif(!HaveFJCVTZSExt()) {\n\t\t\t\tUNDEFINED;\n\t\t\t}\n\t\t\tctx->rounding = FPRounding_ZERO;\n\t\t\tctx->unsigned_ = (SLICE(ctx->opcode,0,0)==1);\n\t\t\tctx->op = FPConvOp_CVT_FtoI_JS;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->sf==0 && ctx->ftype==3) OK(ENC_UCVTF_H32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==0) OK(ENC_UCVTF_S32_FLOAT2INT);\n\t\tif(ctx->sf==0 && ctx->ftype==1) OK(ENC_UCVTF_D32_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==3) OK(ENC_UCVTF_H64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==0) OK(ENC_UCVTF_S64_FLOAT2INT);\n\t\tif(ctx->sf==1 && ctx->ftype==1) OK(ENC_UCVTF_D64_FLOAT2INT);\n\t}\n\treturn rc;\n}\n\n/* udf_perm_undef.xml */\nint UDF_perm_undef(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* 0000000000000000|imm16=xxxxxxxxxxxxxxxx */\n\tif((INSWORD & 0xFFFF0000)==0x0) {\n\t\tdecode_fields32(ENC_UDF_ONLY_PERM_UNDEF, ctx, instr);\n\t\tOK(ENC_UDF_ONLY_PERM_UNDEF);\n\t}\n\treturn rc;\n}\n\n/* udiv.xml */\nint UDIV(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2[5:1]=00001|o1=0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0x7FE0FC00)==0x1AC00800) {\n\t\tdecode_fields32(ENC_UDIV_32_DP_2SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->datasize = (ctx->sf==1) ? 0x40 : 0x20;\n\t\tctx->unsigned_ = (ctx->o1==0);\n\t\tif(ctx->sf==0) OK(ENC_UDIV_32_DP_2SRC);\n\t\tif(ctx->sf==1) OK(ENC_UDIV_64_DP_2SRC);\n\t}\n\treturn rc;\n}\n\n/* udot_advsimd_elt.xml */\nint UDOT_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1110|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F00E000) {\n\t\tdecode_fields32(ENC_UDOT_ASIMDELEM_D, ctx, instr);\n\t\tif(!HaveDOTPExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->signed_ = (ctx->U==0);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_UDOT_ASIMDELEM_D);\n\t}\n\treturn rc;\n}\n\n/* udot_advsimd_vec.xml */\nint UDOT_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|opcode=0010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E009400) {\n\t\tdecode_fields32(ENC_UDOT_ASIMDSAME2_D, ctx, instr);\n\t\tif(!HaveDOTPExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->signed_ = (ctx->U==0);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_UDOT_ASIMDSAME2_D);\n\t}\n\treturn rc;\n}\n\n/* uhadd_advsimd.xml */\nint UHADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00000|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E200400) {\n\t\tdecode_fields32(ENC_UHADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UHADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uhsub_advsimd.xml */\nint UHSUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E202400) {\n\t\tdecode_fields32(ENC_UHSUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UHSUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* umaddl.xml */\nint UMADDL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=1|op31[1:0]=01|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9BA00000) {\n\t\tdecode_fields32(ENC_UMADDL_64WA_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = 0x20;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return UMULL_UMADDL(ctx, instr);\n\t\tOK(ENC_UMADDL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* umaxp_advsimd.xml */\nint UMAXP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=1010|o1=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E20A400) {\n\t\tdecode_fields32(ENC_UMAXP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_UMAXP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* umaxv_advsimd.xml */\nint UMAXV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=1|01110|size=xx|11000|op=0|opcode[3:0]=1010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E30A800) {\n\t\tdecode_fields32(ENC_UMAXV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->min = (ctx->op==1);\n\t\tOK(ENC_UMAXV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* umax_advsimd.xml */\nint UMAX_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0110|o1=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E206400) {\n\t\tdecode_fields32(ENC_UMAX_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_UMAX_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uminp_advsimd.xml */\nint UMINP_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=1010|o1=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E20AC00) {\n\t\tdecode_fields32(ENC_UMINP_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_UMINP_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uminv_advsimd.xml */\nint UMINV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|U=1|01110|size=xx|11000|op=1|opcode[3:0]=1010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E31A800) {\n\t\tdecode_fields32(ENC_UMINV_ASIMDALL_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==4) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->min = (ctx->op==1);\n\t\tOK(ENC_UMINV_ASIMDALL_ONLY);\n\t}\n\treturn rc;\n}\n\n/* umin_advsimd.xml */\nint UMIN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:1]=0110|o1=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E206C00) {\n\t\tdecode_fields32(ENC_UMIN_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->minimum = (ctx->o1==1);\n\t\tOK(ENC_UMIN_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* umlal_advsimd_elt.xml */\nint UMLAL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=0|opcode[1:0]=10|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F002000) {\n\t\tdecode_fields32(ENC_UMLAL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_UMLAL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* umlal_advsimd_vec.xml */\nint UMLAL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E208000) {\n\t\tdecode_fields32(ENC_UMLAL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UMLAL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* umlsl_advsimd_elt.xml */\nint UMLSL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=0|o2=1|opcode[1:0]=10|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F006000) {\n\t\tdecode_fields32(ENC_UMLSL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->sub_op = (ctx->o2==1);\n\t\tOK(ENC_UMLSL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* umlsl_advsimd_vec.xml */\nint UMLSL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=10|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E20A000) {\n\t\tdecode_fields32(ENC_UMLSL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UMLSL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* ummla_advsimd_vec.xml */\nint UMMLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=1|U=1|01110|size=10|0|Rm=xxxxx|1|010|B=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x6E80A400) {\n\t\tdecode_fields32(ENC_UMMLA_ASIMDSAME2_G, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!((ctx->B<<1)|ctx->U)) {\n\t\t\tctx->op1_unsigned = FALSE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==1) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==2) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_UMMLA_ASIMDSAME2_G);\n\t}\n\treturn rc;\n}\n\n/* umnegl_umsubl.xml */\nint UMNEGL_UMSUBL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=1|op31[1:0]=01|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9BA0FC00) {\n\t\tdecode_fields32(ENC_UMNEGL_UMSUBL_64WA_DP_3SRC, ctx, instr);\n\t\tOK(ENC_UMNEGL_UMSUBL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* umov_advsimd.xml */\nint UMOV_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4[3:2]=01|imm4[1]=1|imm4[0]=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE003C00) {\n\t\tdecode_fields32(ENC_UMOV_ASIMDINS_W_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif((((ctx->Q<<5)|ctx->imm5)&0x21)==1) {\n\t\t\tctx->size = 0;\n\t\t}\n\t\telse if((((ctx->Q<<5)|ctx->imm5)&0x23)==2) {\n\t\t\tctx->size = 1;\n\t\t}\n\t\telse if((((ctx->Q<<5)|ctx->imm5)&0x27)==4) {\n\t\t\tctx->size = 2;\n\t\t}\n\t\telse if((((ctx->Q<<5)|ctx->imm5)&0x2f)==0x28) {\n\t\t\tctx->size = 3;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->idxdsize = (SLICE(ctx->imm5,4,4)==1) ? 0x80 : 0x40;\n\t\tctx->index = UINT(SLICE(ctx->imm5,4,ctx->size+1));\n\t\tctx->esize = (8) << (ctx->size);\n\t\tctx->datasize = (ctx->Q==1) ? 0x40 : 0x20;\n\t\t/* regular aliases */\n\t\tif(((ctx->imm5&15)==8) || ((ctx->imm5&7)==4)) return MOV_UMOV_advsimd(ctx, instr);\n\t\tif(ctx->Q==0) OK(ENC_UMOV_ASIMDINS_W_W);\n\t\tif(ctx->Q==1 && (ctx->imm5&15)==8) OK(ENC_UMOV_ASIMDINS_X_X);\n\t}\n\treturn rc;\n}\n\n/* umsubl.xml */\nint UMSUBL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=1|op31[1:0]=01|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9BA08000) {\n\t\tdecode_fields32(ENC_UMSUBL_64WA_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = 0x20;\n\t\tctx->sub_op = (ctx->o0==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->Ra==0x1f) return UMNEGL_UMSUBL(ctx, instr);\n\t\tOK(ENC_UMSUBL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* umulh.xml */\nint UMULH(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=1|op31[1:0]=10|Rm=xxxxx|o0=0|Ra=(1)(1)(1)(1)(1)|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE08000)==0x9BC00000) {\n\t\tdecode_fields32(ENC_UMULH_64_DP_3SRC, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->a = UINT(ctx->Ra);\n\t\tctx->destsize = 0x40;\n\t\tctx->datasize = ctx->destsize;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UMULH_64_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* umull_umaddl.xml */\nint UMULL_UMADDL(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_64 */\n\t/* sf=1|op54=00|11011|U=1|op31[1:0]=01|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x9BA07C00) {\n\t\tdecode_fields32(ENC_UMULL_UMADDL_64WA_DP_3SRC, ctx, instr);\n\t\tOK(ENC_UMULL_UMADDL_64WA_DP_3SRC);\n\t}\n\treturn rc;\n}\n\n/* umull_advsimd_elt.xml */\nint UMULL_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1010|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF00F400)==0x2F00A000) {\n\t\tdecode_fields32(ENC_UMULL_ASIMDELEM_L, ctx, instr);\n\t\tctx->idxdsize = (ctx->H==1) ? 0x80 : 0x40;\n\t\tif(ctx->size==1) {\n\t\t\tctx->index = UINT(((ctx->H<<2)|(ctx->L<<1)|ctx->M));\n\t\t\tctx->Rmhi = 0;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tctx->index = UINT(((ctx->H<<1)|ctx->L));\n\t\t\tctx->Rmhi = ctx->M;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->Rmhi<<4)|ctx->Rm));\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UMULL_ASIMDELEM_L);\n\t}\n\treturn rc;\n}\n\n/* umull_advsimd_vec.xml */\nint UMULL_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3]=1|opcode[2]=1|opcode[1]=0|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E20C000) {\n\t\tdecode_fields32(ENC_UMULL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UMULL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* uqadd_advsimd.xml */\nint UQADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E200C00) {\n\t\tdecode_fields32(ENC_UQADD_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQADD_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E200C00) {\n\t\tdecode_fields32(ENC_UQADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uqrshl_advsimd.xml */\nint UQRSHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E205C00) {\n\t\tdecode_fields32(ENC_UQRSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_UQRSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E205C00) {\n\t\tdecode_fields32(ENC_UQRSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_UQRSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uqrshrn_advsimd.xml */\nint UQRSHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F009C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQRSHRN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQRSHRN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F009C00 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQRSHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQRSHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* uqshl_advsimd_imm.xml */\nint UQSHL_advsimd_imm(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:2]=011|op=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F007400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQSHL_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_UQSHL_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:2]=011|op=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F007400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQSHL_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tif(!((ctx->op<<1)|ctx->U)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==1) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==2) {\n\t\t\tctx->src_unsigned = FALSE;\n\t\t\tctx->dst_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->op<<1)|ctx->U)==3) {\n\t\t\tctx->src_unsigned = TRUE;\n\t\t\tctx->dst_unsigned = TRUE;\n\t\t}\n\t\tOK(ENC_UQSHL_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* uqshl_advsimd_reg.xml */\nint UQSHL_advsimd_reg(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E204C00) {\n\t\tdecode_fields32(ENC_UQSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_UQSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E204C00) {\n\t\tdecode_fields32(ENC_UQSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_UQSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uqshrn_advsimd.xml */\nint UQSHRN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F009400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQSHRN_ASISDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->part = 0;\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQSHRN_ASISDSHF_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:1]=1001|op=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F009400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UQSHRN_ASIMDSHF_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->round = (ctx->op==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQSHRN_ASIMDSHF_N);\n\t}\n\treturn rc;\n}\n\n/* uqsub_advsimd.xml */\nint UQSUB_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E202C00) {\n\t\tdecode_fields32(ENC_UQSUB_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQSUB_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E202C00) {\n\t\tdecode_fields32(ENC_UQSUB_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQSUB_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uqxtn_advsimd.xml */\nint UQXTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E214800) {\n\t\tdecode_fields32(ENC_UQXTN_ASISDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->part = 0;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQXTN_ASISDMISC_N);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E214800) {\n\t\tdecode_fields32(ENC_UQXTN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_UQXTN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* urecpe_advsimd.xml */\nint URECPE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size[1]=1|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0xEA1C800) {\n\t\tdecode_fields32(ENC_URECPE_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_URECPE_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* urhadd_advsimd.xml */\nint URHADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_same */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00010|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E201400) {\n\t\tdecode_fields32(ENC_URHADD_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_URHADD_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* urshl_advsimd.xml */\nint URSHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E205400) {\n\t\tdecode_fields32(ENC_URSHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_URSHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E205400) {\n\t\tdecode_fields32(ENC_URSHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_URSHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* urshr_advsimd.xml */\nint URSHR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F002400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_URSHR_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_URSHR_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F002400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_URSHR_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_URSHR_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* ursqrte_advsimd.xml */\nint URSQRTE_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size[1]=1|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFBFFC00)==0x2EA1C800) {\n\t\tdecode_fields32(ENC_URSQRTE_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->sz==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_URSQRTE_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* ursra_advsimd.xml */\nint URSRA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F003400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_URSRA_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_URSRA_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=1|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F003400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_URSRA_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_URSRA_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* usdot_advsimd_elt.xml */\nint USDOT_advsimd_elt(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_2reg_element */\n\t/* 0|Q=x|U=0|01111|US=1|0|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFC0F400)==0xF80F000) {\n\t\tdecode_fields32(ENC_USDOT_ASIMDELEM_D, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->op1_unsigned = (ctx->US==1);\n\t\tctx->op2_unsigned = (ctx->US==0);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(((ctx->M<<4)|ctx->Rm));\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->i = UINT(((ctx->H<<1)|ctx->L));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((0x20) ? ((ctx->datasize) / (0x20)) : 0);\n\t\tOK(ENC_USDOT_ASIMDELEM_D);\n\t}\n\treturn rc;\n}\n\n/* usdot_advsimd_vec.xml */\nint USDOT_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=10|0|Rm=xxxxx|1|opcode=0011|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBFE0FC00)==0xE809C00) {\n\t\tdecode_fields32(ENC_USDOT_ASIMDSAME2_D, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((0x20) ? ((ctx->datasize) / (0x20)) : 0);\n\t\tOK(ENC_USDOT_ASIMDSAME2_D);\n\t}\n\treturn rc;\n}\n\n/* ushll_advsimd.xml */\nint USHLL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F00A400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_USHLL_ASIMDSHF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(SLICE(ctx->immh,3,3)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = UINT(((ctx->immh<<3)|ctx->immb))-ctx->esize;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\t/* regular aliases */\n\t\tif(ctx->immb==0 && BitCount(ctx->immh)==1) return UXTL_USHLL_advsimd(ctx, instr);\n\t\tOK(ENC_USHLL_ASIMDSHF_L);\n\t}\n\treturn rc;\n}\n\n/* ushl_advsimd.xml */\nint USHL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x7E204400) {\n\t\tdecode_fields32(ENC_USHL_ASISDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tif(ctx->S==0 && ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_USHL_ASISDSAME_ONLY);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[4:2]=010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E204400) {\n\t\tdecode_fields32(ENC_USHL_ASIMDSAME_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->rounding = (ctx->R==1);\n\t\tctx->saturating = (ctx->S==1);\n\t\tOK(ENC_USHL_ASIMDSAME_ONLY);\n\t}\n\treturn rc;\n}\n\n/* ushr_advsimd.xml */\nint USHR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F000400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_USHR_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_USHR_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=0|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F000400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_USHR_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_USHR_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* usmmla_advsimd_vec.xml */\nint USMMLA_advsimd_vec(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=1|U=0|01110|size=10|0|Rm=xxxxx|1|010|B=1|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E80AC00) {\n\t\tdecode_fields32(ENC_USMMLA_ASIMDSAME2_G, ctx, instr);\n\t\tif(!HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!((ctx->B<<1)|ctx->U)) {\n\t\t\tctx->op1_unsigned = FALSE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==1) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = TRUE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==2) {\n\t\t\tctx->op1_unsigned = TRUE;\n\t\t\tctx->op2_unsigned = FALSE;\n\t\t}\n\t\telse if(((ctx->B<<1)|ctx->U)==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_USMMLA_ASIMDSAME2_G);\n\t}\n\treturn rc;\n}\n\n/* usqadd_advsimd.xml */\nint USQADD_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|11110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x7E203800) {\n\t\tdecode_fields32(ENC_USQADD_ASISDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_USQADD_ASISDMISC_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0x2E203800) {\n\t\tdecode_fields32(ENC_USQADD_ASIMDMISC_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_USQADD_ASIMDMISC_R);\n\t}\n\treturn rc;\n}\n\n/* usra_advsimd.xml */\nint USRA_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sisd */\n\t/* 01|U=1|111110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF80FC00)==0x7F001400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_USRA_ASISDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(SLICE(ctx->immh,3,3)!=1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (3);\n\t\tctx->datasize = ctx->esize;\n\t\tctx->elements = 1;\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_USRA_ASISDSHF_R);\n\t}\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode[4:3]=00|o1=0|o0=1|opcode[0]=0|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF80FC00)==0x2F001400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_USRA_ASIMDSHF_R, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->immh==0) {\n\t\t\tSEE /* asimdimm */;\n\t\t}\n\t\tif(((SLICE(ctx->immh,3,3)<<1)|ctx->Q)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (HighestSetBit(ctx->immh));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->shift = ((ctx->esize) * (2))-UINT(((ctx->immh<<3)|ctx->immb));\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tctx->round = (ctx->o1==1);\n\t\tctx->accumulate = (ctx->o0==1);\n\t\tOK(ENC_USRA_ASIMDSHF_R);\n\t}\n\treturn rc;\n}\n\n/* usubl_advsimd.xml */\nint USUBL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=1|opcode[0]=0|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E202000) {\n\t\tdecode_fields32(ENC_USUBL_ASIMDDIFF_L, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_USUBL_ASIMDDIFF_L);\n\t}\n\treturn rc;\n}\n\n/* usubw_advsimd.xml */\nint USUBW_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_3reg_diff */\n\t/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode[3:2]=00|o1=1|opcode[0]=1|00|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0x2E203000) {\n\t\tdecode_fields32(ENC_USUBW_ASIMDDIFF_W, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->sub_op = (ctx->o1==1);\n\t\tctx->unsigned_ = (ctx->U==1);\n\t\tOK(ENC_USUBW_ASIMDDIFF_W);\n\t}\n\treturn rc;\n}\n\n/* uxtb_ubfm.xml */\nint UXTB_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=0|opc=10|100110|N=0|immr=000000|imms=000111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x53001C00) {\n\t\tdecode_fields32(ENC_UXTB_UBFM_32M_BITFIELD, ctx, instr);\n\t\tOK(ENC_UXTB_UBFM_32M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* uxth_ubfm.xml */\nint UXTH_UBFM(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_zero_fill */\n\t/* sf=0|opc=10|100110|N=0|immr=000000|imms=001111|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x53003C00) {\n\t\tdecode_fields32(ENC_UXTH_UBFM_32M_BITFIELD, ctx, instr);\n\t\tOK(ENC_UXTH_UBFM_32M_BITFIELD);\n\t}\n\treturn rc;\n}\n\n/* uxtl_ushll_advsimd.xml */\nint UXTL_USHLL_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=1|011110|immh!=0000|immb=000|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF87FC00)==0x2F00A400 && (INSWORD & 0x780000)!=0x0) {\n\t\tdecode_fields32(ENC_UXTL_USHLL_ASIMDSHF_L, ctx, instr);\n\t\tOK(ENC_UXTL_USHLL_ASIMDSHF_L);\n\t}\n\treturn rc;\n}\n\n/* uzp1_advsimd.xml */\nint UZP1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|opcode[1:0]=01|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE001800) {\n\t\tdecode_fields32(ENC_UZP1_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tOK(ENC_UZP1_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* uzp2_advsimd.xml */\nint UZP2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|opcode[1:0]=01|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE005800) {\n\t\tdecode_fields32(ENC_UZP2_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tOK(ENC_UZP2_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* wfe.xml */\nint WFE(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=010|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503205F) {\n\t\tdecode_fields32(ENC_WFE_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_WFE_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* wfet.xml */\nint WFET(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010101000000110001|CRm=0000|op2=000|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD5031000) {\n\t\tdecode_fields32(ENC_WFET_ONLY_SYSTEMINSTRSWITHREG, ctx, instr);\n\t\tif(!HaveFeatWFxT()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tif(!ctx->op2) {\n\t\t\tctx->op = SystemHintOp_WFET;\n\t\t}\n\t\telse if(ctx->op2==1) {\n\t\t\tctx->op = SystemHintOp_WFIT;\n\t\t}\n\t\tOK(ENC_WFET_ONLY_SYSTEMINSTRSWITHREG);\n\t}\n\treturn rc;\n}\n\n/* wfi.xml */\nint WFI(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=011|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503207F) {\n\t\tdecode_fields32(ENC_WFI_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_WFI_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* wfit.xml */\nint WFIT(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 11010101000000110001|CRm=0000|op2=001|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0xD5031020) {\n\t\tdecode_fields32(ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG, ctx, instr);\n\t\tif(!HaveFeatWFxT()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tif(!ctx->op2) {\n\t\t\tctx->op = SystemHintOp_WFET;\n\t\t}\n\t\telse if(ctx->op2==1) {\n\t\t\tctx->op = SystemHintOp_WFIT;\n\t\t}\n\t\tOK(ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG);\n\t}\n\treturn rc;\n}\n\n/* xaflag.xml */\nint XAFLAG(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=001|Rt=11111 */\n\tif((INSWORD & 0xFFFFF0FF)==0xD500403F) {\n\t\tdecode_fields32(ENC_XAFLAG_M_PSTATE, ctx, instr);\n\t\tif(!HaveFlagFormatExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_XAFLAG_M_PSTATE);\n\t}\n\treturn rc;\n}\n\n/* xar_advsimd.xml */\nint XAR_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 11001110100|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE00000)==0xCE800000) {\n\t\tdecode_fields32(ENC_XAR_VVV2_CRYPTO3_IMM6, ctx, instr);\n\t\tif(!HaveSHA3Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_XAR_VVV2_CRYPTO3_IMM6);\n\t}\n\treturn rc;\n}\n\n/* xpac.xml */\nint XPAC(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_general */\n\t/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=1|opcode[3:1]=000|D=x|Rn=11111|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFFBE0)==0xDAC143E0) {\n\t\tdecode_fields32(ENC_XPACD_64Z_DP_1SRC, ctx, instr);\n\t\tctx->data = (ctx->D==1);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(!HavePACExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->n!=0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->D==1) OK(ENC_XPACD_64Z_DP_1SRC);\n\t\tif(ctx->D==0) OK(ENC_XPACI_64Z_DP_1SRC);\n\t}\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=111|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD50320FF) {\n\t\tdecode_fields32(ENC_XPACLRI_HI_HINTS, ctx, instr);\n\t\tOK(ENC_XPACLRI_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* xtn_advsimd.xml */\nint XTN_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_simd */\n\t/* 0|Q=x|U=0|01110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF3FFC00)==0xE212800) {\n\t\tdecode_fields32(ENC_XTN_ASIMDMISC_N, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = 0x40;\n\t\tctx->part = UINT(ctx->Q);\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tOK(ENC_XTN_ASIMDMISC_N);\n\t}\n\treturn rc;\n}\n\n/* yield.xml */\nint YIELD(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_system */\n\t/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=001|Rt=11111 */\n\tif((INSWORD & 0xFFFFFFFF)==0xD503203F) {\n\t\tdecode_fields32(ENC_YIELD_HI_HINTS, ctx, instr);\n\t\tif(!((ctx->CRm<<3)|ctx->op2)) {\n\t\t\tctx->op = SystemHintOp_NOP;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==1) {\n\t\t\tctx->op = SystemHintOp_YIELD;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==2) {\n\t\t\tctx->op = SystemHintOp_WFE;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==3) {\n\t\t\tctx->op = SystemHintOp_WFI;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==4) {\n\t\t\tctx->op = SystemHintOp_SEV;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==5) {\n\t\t\tctx->op = SystemHintOp_SEVL;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==6) {\n\t\t\tif(!HaveDGHExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_DGH;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==7) {\n\t\t\tSEE /* XPACLRI */;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==8) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIB1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIA1716 */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIB1716 */;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x10) {\n\t\t\tif(!HaveRASExt()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_ESB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x11) {\n\t\t\tif(!HaveStatisticalProfiling()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_PSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x12) {\n\t\t\tif(!HaveSelfHostedTrace()) {\n\t\t\t\tENDOFINSTRUCTION;\n\t\t\t}\n\t\t\tctx->op = SystemHintOp_TSB;\n\t\t}\n\t\telse if(((ctx->CRm<<3)|ctx->op2)==0x14) {\n\t\t\tctx->op = SystemHintOp_CSDB;\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x78)==0x18) {\n\t\t\tif(!ctx->op2) {\n\t\t\t\tSEE /* PACIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==1) {\n\t\t\t\tSEE /* PACIASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==2) {\n\t\t\t\tSEE /* PACIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==3) {\n\t\t\t\tSEE /* PACIBSP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==4) {\n\t\t\t\tSEE /* AUTIAZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==5) {\n\t\t\t\tSEE /* AUTHASP */;\n\t\t\t}\n\t\t\telse if(ctx->op2==6) {\n\t\t\t\tSEE /* AUTIBZ */;\n\t\t\t}\n\t\t\telse if(ctx->op2==7) {\n\t\t\t\tSEE /* AUTIBSP */;\n\t\t\t}\n\t\t}\n\t\telse if((((ctx->CRm<<3)|ctx->op2)&0x79)==0x20) {\n\t\t\tctx->op = SystemHintOp_BTI;\n\t\t\tSetBTypeCompatible(BTypeCompatible_BTI(SLICE(ctx->op2,2,1), ctx->pstate_btype));\n\t\t}\n\t\telse {\n\t\t\tENDOFINSTRUCTION;\n\t\t}\n\t\tOK(ENC_YIELD_HI_HINTS);\n\t}\n\treturn rc;\n}\n\n/* zip1_advsimd.xml */\nint ZIP1_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|opcode[1:0]=11|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE003800) {\n\t\tdecode_fields32(ENC_ZIP1_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tctx->pairs = ((2) ? ((ctx->elements) / (2)) : 0);\n\t\tOK(ENC_ZIP1_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* zip2_advsimd.xml */\nint ZIP2_advsimd(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_advsimd */\n\t/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|opcode[1:0]=11|10|Rn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xBF20FC00)==0xE007800) {\n\t\tdecode_fields32(ENC_ZIP2_ASIMDPERM_ONLY, ctx, instr);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tif(((ctx->size<<1)|ctx->Q)==6) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->datasize = (ctx->Q==1) ? 0x80 : 0x40;\n\t\tctx->elements = ((ctx->esize) ? ((ctx->datasize) / (ctx->esize)) : 0);\n\t\tctx->part = UINT(ctx->op);\n\t\tctx->pairs = ((2) ? ((ctx->elements) / (2)) : 0);\n\t\tOK(ENC_ZIP2_ASIMDPERM_ONLY);\n\t}\n\treturn rc;\n}\n\n/* abs_z_p_z.xml */\nint abs_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x416A000) {\n\t\tdecode_fields32(ENC_ABS_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_ABS_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* adclb_z_zzz.xml */\nint adclb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|0|sz=x|0|Zm=xxxxx|11010|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500D000) {\n\t\tdecode_fields32(ENC_ADCLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_ADCLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* adclt_z_zzz.xml */\nint adclt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|0|sz=x|0|Zm=xxxxx|11010|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500D400) {\n\t\tdecode_fields32(ENC_ADCLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_ADCLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* add_z_p_zz.xml */\nint add_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|000|opc<2:1>=00|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4000000) {\n\t\tdecode_fields32(ENC_ADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_ADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* add_z_zi.xml */\nint add_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2520C000) {\n\t\tdecode_fields32(ENC_ADD_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tOK(ENC_ADD_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* add_z_zz.xml */\nint add_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|opc<2:1>=00|opc<0>=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4200000) {\n\t\tdecode_fields32(ENC_ADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_ADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* addha_za_pp_z.xml */\nint addha_za_pp_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 11|0000001|op=0|01|000|V=0|Pm=xxx|Pn=xxx|Zn=xxxxx|0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFFF001C)==0xC0900000) {\n\t\tdecode_fields32(ENC_ADDHA_ZA_PP_Z_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tOK(ENC_ADDHA_ZA_PP_Z_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11|0000001|op=1|01000|V=0|Pm=xxx|Pn=xxx|Zn=xxxxx|0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFFF0018)==0xC0D00000) {\n\t\tdecode_fields32(ENC_ADDHA_ZA_PP_Z_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tOK(ENC_ADDHA_ZA_PP_Z_64);\n\t}\n\treturn rc;\n}\n\n/* addhnb_z_zz.xml */\nint addhnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=0|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45206000) {\n\t\tdecode_fields32(ENC_ADDHNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_ADDHNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* addhnt_z_zz.xml */\nint addhnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=0|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45206400) {\n\t\tdecode_fields32(ENC_ADDHNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_ADDHNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* addp_z_p_zz.xml */\nint addp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|opc=00|U=1|101|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4411A000) {\n\t\tdecode_fields32(ENC_ADDP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_ADDP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* addpl_r_ri.xml */\nint addpl_r_ri(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 000001000|op=1|1|Rn=xxxxx|01010|imm6=xxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0F800)==0x4605000) {\n\t\tdecode_fields32(ENC_ADDPL_R_RI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->imm = SInt(ctx->imm6,6);\n\t\tOK(ENC_ADDPL_R_RI_);\n\t}\n\treturn rc;\n}\n\n/* addva_za_pp_z.xml */\nint addva_za_pp_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 11|0000001|op=0|01|000|V=1|Pm=xxx|Pn=xxx|Zn=xxxxx|0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFFF001C)==0xC0910000) {\n\t\tdecode_fields32(ENC_ADDVA_ZA_PP_Z_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tOK(ENC_ADDVA_ZA_PP_Z_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11|0000001|op=1|01000|V=1|Pm=xxx|Pn=xxx|Zn=xxxxx|0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFFF0018)==0xC0D10000) {\n\t\tdecode_fields32(ENC_ADDVA_ZA_PP_Z_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tOK(ENC_ADDVA_ZA_PP_Z_64);\n\t}\n\treturn rc;\n}\n\n/* addvl_r_ri.xml */\nint addvl_r_ri(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 000001000|op=0|1|Rn=xxxxx|01010|imm6=xxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFE0F800)==0x4205000) {\n\t\tdecode_fields32(ENC_ADDVL_R_RI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->imm = SInt(ctx->imm6,6);\n\t\tOK(ENC_ADDVL_R_RI_);\n\t}\n\treturn rc;\n}\n\n/* adr_z_az.xml */\nint adr_z_az(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_pkd */\n\t/* 00000100|1|sz=x|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0F000)==0x4A0A000) {\n\t\tdecode_fields32(ENC_ADR_Z_AZ_SD_SAME_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->osize = ctx->esize;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->mbytes = (1) << (UINT(ctx->msz));\n\t\tOK(ENC_ADR_Z_AZ_SD_SAME_SCALED);\n\t}\n\t/* class iclass_off_s_s32 */\n\t/* 00000100|opc=00|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x420A000) {\n\t\tdecode_fields32(ENC_ADR_Z_AZ_D_S32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->osize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->mbytes = (1) << (UINT(ctx->msz));\n\t\tOK(ENC_ADR_Z_AZ_D_S32_SCALED);\n\t}\n\t/* class iclass_off_s_u32 */\n\t/* 00000100|opc=01|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x460A000) {\n\t\tdecode_fields32(ENC_ADR_Z_AZ_D_U32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->osize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->mbytes = (1) << (UINT(ctx->msz));\n\t\tOK(ENC_ADR_Z_AZ_D_U32_SCALED);\n\t}\n\treturn rc;\n}\n\n/* aesd_z_zz.xml */\nint aesd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|10001|op=0|11100|o2=1|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4522E400) {\n\t\tdecode_fields32(ENC_AESD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2AES()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_AESD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* aese_z_zz.xml */\nint aese_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|10001|op=0|11100|o2=0|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4522E000) {\n\t\tdecode_fields32(ENC_AESE_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2AES()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_AESE_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* aesimc_z_z.xml */\nint aesimc_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|10000011100|op=1|00000|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0x4520E400) {\n\t\tdecode_fields32(ENC_AESIMC_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE2AES()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_AESIMC_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* aesmc_z_z.xml */\nint aesmc_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|10000011100|op=0|00000|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFFFFE0)==0x4520E000) {\n\t\tdecode_fields32(ENC_AESMC_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE2AES()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_AESMC_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* and_p_p_pp.xml */\nint and_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004000) {\n\t\tdecode_fields32(ENC_AND_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t/* regular aliases */\n\t\tif(ctx->S==0 && ctx->Pn==ctx->Pm) return MOV_and_p_p_pp(ctx, instr);\n\t\tOK(ENC_AND_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* and_z_p_zz.xml */\nint and_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41A0000) {\n\t\tdecode_fields32(ENC_AND_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_AND_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* and_z_zi.xml */\nint and_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=10|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5800000) {\n\t\tdecode_fields32(ENC_AND_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tDecodeBitMasksCheckUndefined(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0));\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0),SLICE(ctx->imm13,11,6));\n\t\tctx->imm = dbmrt.wmask;\n\t\tOK(ENC_AND_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* and_z_zz.xml */\nint and_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=00|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4203000) {\n\t\tdecode_fields32(ENC_AND_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_AND_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ands_p_p_pp.xml */\nint ands_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25404000) {\n\t\tdecode_fields32(ENC_ANDS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t/* regular aliases */\n\t\tif(ctx->S==1 && ctx->Pn==ctx->Pm) return MOVS_ands_p_p_pp(ctx, instr);\n\t\tOK(ENC_ANDS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* andv_r_p_z.xml */\nint andv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0110|opc=10|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41A2000) {\n\t\tdecode_fields32(ENC_ANDV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_ANDV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* asr_z_p_zi.xml */\nint asr_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|00|opc=00|L=0|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4008000) {\n\t\tdecode_fields32(ENC_ASR_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_ASR_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* asr_z_p_zw.xml */\nint asr_z_p_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|R=0|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4188000) {\n\t\tdecode_fields32(ENC_ASR_Z_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_ASR_Z_P_ZW_);\n\t}\n\treturn rc;\n}\n\n/* asr_z_p_zz.xml */\nint asr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=0|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4108000) {\n\t\tdecode_fields32(ENC_ASR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_ASR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* asr_z_zi.xml */\nint asr_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|0|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4209000) {\n\t\tdecode_fields32(ENC_ASR_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_ASR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* asr_z_zw.xml */\nint asr_z_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|1000|0|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4208000) {\n\t\tdecode_fields32(ENC_ASR_Z_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_ASR_Z_ZW_);\n\t}\n\treturn rc;\n}\n\n/* asrd_z_p_zi.xml */\nint asrd_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|00|opc=01|L=0|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4048000) {\n\t\tdecode_fields32(ENC_ASRD_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_ASRD_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* asrr_z_p_zz.xml */\nint asrr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=1|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4148000) {\n\t\tdecode_fields32(ENC_ASRR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_ASRR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bcax_z_zzz.xml */\nint bcax_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=01|1|Zm=xxxxx|00111|o2=0|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4603800) {\n\t\tdecode_fields32(ENC_BCAX_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_BCAX_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bdep_z_zz.xml */\nint bdep_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1011|opc=01|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500B400) {\n\t\tdecode_fields32(ENC_BDEP_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2BitPerm()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BDEP_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bext_z_zz.xml */\nint bext_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1011|opc=00|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500B000) {\n\t\tdecode_fields32(ENC_BEXT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2BitPerm()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BEXT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfcvt_z_p_z.xml */\nint bfcvt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|opc=10|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x658AA000) {\n\t\tdecode_fields32(ENC_BFCVT_Z_P_Z_S2BF, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BFCVT_Z_P_Z_S2BF);\n\t}\n\treturn rc;\n}\n\n/* bfcvtnt_z_p_z.xml */\nint bfcvtnt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100100|opc=10|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x648AA000) {\n\t\tdecode_fields32(ENC_BFCVTNT_Z_P_Z_S2BF, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BFCVTNT_Z_P_Z_S2BF);\n\t}\n\treturn rc;\n}\n\n/* bfdot_z_zzz.xml */\nint bfdot_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001000|op=1|1|Zm=xxxxx|100000|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64608000) {\n\t\tdecode_fields32(ENC_BFDOT_Z_ZZZ_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_BFDOT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfdot_z_zzzi.xml */\nint bfdot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001000|op=1|1|i2=xx|Zm=xxx|010000|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64604000) {\n\t\tdecode_fields32(ENC_BFDOT_Z_ZZZI_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(ctx->i2);\n\t\tOK(ENC_BFDOT_Z_ZZZI_);\n\t}\n\treturn rc;\n}\n\n/* bfmlalb_z_zzz.xml */\nint bfmlalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001001|o2=1|1|Zm=xxxxx|10|op=0|00|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E08000) {\n\t\tdecode_fields32(ENC_BFMLALB_Z_ZZZ_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_BFMLALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfmlalb_z_zzzi.xml */\nint bfmlalb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001001|o2=1|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64E04000) {\n\t\tdecode_fields32(ENC_BFMLALB_Z_ZZZI_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tOK(ENC_BFMLALB_Z_ZZZI_);\n\t}\n\treturn rc;\n}\n\n/* bfmlalt_z_zzz.xml */\nint bfmlalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001001|o2=1|1|Zm=xxxxx|10|op=0|00|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E08400) {\n\t\tdecode_fields32(ENC_BFMLALT_Z_ZZZ_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_BFMLALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfmlalt_z_zzzi.xml */\nint bfmlalt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 011001001|o2=1|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64E04400) {\n\t\tdecode_fields32(ENC_BFMLALT_Z_ZZZI_, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tOK(ENC_BFMLALT_Z_ZZZI_);\n\t}\n\treturn rc;\n}\n\n/* bfmmla_z_zzz.xml */\nint bfmmla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100100|opc=01|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x6460E400) {\n\t\tdecode_fields32(ENC_BFMMLA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() || !HaveBF16Ext()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_BFMMLA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfmopa_za32_pp_zz.xml */\nint bfmopa_za32_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 10|000001100|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x81800000) {\n\t\tdecode_fields32(ENC_BFMOPA_ZA32_PP_ZZ_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_BFMOPA_ZA32_PP_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bfmops_za32_pp_zz.xml */\nint bfmops_za32_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 10|000001100|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x81800010) {\n\t\tdecode_fields32(ENC_BFMOPS_ZA32_PP_ZZ_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_BFMOPS_ZA32_PP_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bgrp_z_zz.xml */\nint bgrp_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1011|opc=10|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500B800) {\n\t\tdecode_fields32(ENC_BGRP_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2BitPerm()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BGRP_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bic_p_p_pp.xml */\nint bic_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004010) {\n\t\tdecode_fields32(ENC_BIC_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BIC_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* bic_z_p_zz.xml */\nint bic_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41B0000) {\n\t\tdecode_fields32(ENC_BIC_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_BIC_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bic_z_zz.xml */\nint bic_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=11|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E03000) {\n\t\tdecode_fields32(ENC_BIC_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_BIC_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* bics_p_p_pp.xml */\nint bics_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25404010) {\n\t\tdecode_fields32(ENC_BICS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BICS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* brka_p_p_p.xml */\nint brka_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|B=0|S=0|01000001|Pg=xxxx|0|Pn=xxxx|M=x|Pd=xxxx */\n\tif((INSWORD & 0xFFFFC200)==0x25104000) {\n\t\tdecode_fields32(ENC_BRKA_P_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->merging = (ctx->M==1);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BRKA_P_P_P_);\n\t}\n\treturn rc;\n}\n\n/* brkas_p_p_p.xml */\nint brkas_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|B=0|S=1|01000001|Pg=xxxx|0|Pn=xxxx|M=0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFC210)==0x25504000) {\n\t\tdecode_fields32(ENC_BRKAS_P_P_P_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->merging = FALSE;\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BRKAS_P_P_P_Z);\n\t}\n\treturn rc;\n}\n\n/* brkb_p_p_p.xml */\nint brkb_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|B=1|S=0|01000001|Pg=xxxx|0|Pn=xxxx|M=x|Pd=xxxx */\n\tif((INSWORD & 0xFFFFC200)==0x25904000) {\n\t\tdecode_fields32(ENC_BRKB_P_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->merging = (ctx->M==1);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BRKB_P_P_P_);\n\t}\n\treturn rc;\n}\n\n/* brkbs_p_p_p.xml */\nint brkbs_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|B=1|S=1|01000001|Pg=xxxx|0|Pn=xxxx|M=0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFC210)==0x25D04000) {\n\t\tdecode_fields32(ENC_BRKBS_P_P_P_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->merging = FALSE;\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BRKBS_P_P_P_Z);\n\t}\n\treturn rc;\n}\n\n/* brkn_p_p_pp.xml */\nint brkn_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 001001010|S=0|01100001|Pg=xxxx|0|Pn=xxxx|0|Pdm=xxxx */\n\tif((INSWORD & 0xFFFFC210)==0x25184000) {\n\t\tdecode_fields32(ENC_BRKN_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->dm = UINT(ctx->Pdm);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BRKN_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* brkns_p_p_pp.xml */\nint brkns_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 001001010|S=1|01100001|Pg=xxxx|0|Pn=xxxx|0|Pdm=xxxx */\n\tif((INSWORD & 0xFFFFC210)==0x25584000) {\n\t\tdecode_fields32(ENC_BRKNS_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->dm = UINT(ctx->Pdm);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BRKNS_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* brkpa_p_p_pp.xml */\nint brkpa_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x2500C000) {\n\t\tdecode_fields32(ENC_BRKPA_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BRKPA_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* brkpas_p_p_pp.xml */\nint brkpas_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x2540C000) {\n\t\tdecode_fields32(ENC_BRKPAS_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BRKPAS_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* brkpb_p_p_pp.xml */\nint brkpb_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x2500C010) {\n\t\tdecode_fields32(ENC_BRKPB_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_BRKPB_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* brkpbs_p_p_pp.xml */\nint brkpbs_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x2540C010) {\n\t\tdecode_fields32(ENC_BRKPBS_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_BRKPBS_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* bsl1n_z_zzz.xml */\nint bsl1n_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=01|1|Zm=xxxxx|00111|o2=1|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4603C00) {\n\t\tdecode_fields32(ENC_BSL1N_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_BSL1N_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bsl2n_z_zzz.xml */\nint bsl2n_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=10|1|Zm=xxxxx|00111|o2=1|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4A03C00) {\n\t\tdecode_fields32(ENC_BSL2N_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_BSL2N_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* bsl_z_zzz.xml */\nint bsl_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=00|1|Zm=xxxxx|00111|o2=1|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4203C00) {\n\t\tdecode_fields32(ENC_BSL_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_BSL_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* cadd_z_zz.xml */\nint cadd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|00000|op=0|11011|rot=x|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FF800)==0x4500D800) {\n\t\tdecode_fields32(ENC_CADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->sub_i = (ctx->rot==0);\n\t\tctx->sub_r = (ctx->rot==1);\n\t\tOK(ENC_CADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cdot_z_zzz.xml */\nint cdot_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|0001|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20F000)==0x44001000) {\n\t\tdecode_fields32(ENC_CDOT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_i = (SLICE(ctx->rot,0,0)==SLICE(ctx->rot,1,1));\n\t\tOK(ENC_CDOT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* cdot_z_zzzi.xml */\nint cdot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|0100|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44A04000) {\n\t\tdecode_fields32(ENC_CDOT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_i = (SLICE(ctx->rot,0,0)==SLICE(ctx->rot,1,1));\n\t\tOK(ENC_CDOT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|0100|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44E04000) {\n\t\tdecode_fields32(ENC_CDOT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_i = (SLICE(ctx->rot,0,0)==SLICE(ctx->rot,1,1));\n\t\tOK(ENC_CDOT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* clasta_r_p_z.xml */\nint clasta_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|11000|B=0|101|Pg=xxx|Zm=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x530A000) {\n\t\tdecode_fields32(ENC_CLASTA_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->csize = (ctx->esize<0x40) ? 0x20 : 0x40;\n\t\tctx->isBefore = FALSE;\n\t\tOK(ENC_CLASTA_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* clasta_v_p_z.xml */\nint clasta_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10101|B=0|100|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x52A8000) {\n\t\tdecode_fields32(ENC_CLASTA_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Vdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->isBefore = FALSE;\n\t\tOK(ENC_CLASTA_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* clasta_z_p_zz.xml */\nint clasta_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10100|B=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5288000) {\n\t\tdecode_fields32(ENC_CLASTA_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->isBefore = FALSE;\n\t\tOK(ENC_CLASTA_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* clastb_r_p_z.xml */\nint clastb_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|11000|B=1|101|Pg=xxx|Zm=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x531A000) {\n\t\tdecode_fields32(ENC_CLASTB_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->csize = (ctx->esize<0x40) ? 0x20 : 0x40;\n\t\tctx->isBefore = TRUE;\n\t\tOK(ENC_CLASTB_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* clastb_v_p_z.xml */\nint clastb_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10101|B=1|100|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x52B8000) {\n\t\tdecode_fields32(ENC_CLASTB_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Vdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->isBefore = TRUE;\n\t\tOK(ENC_CLASTB_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* clastb_z_p_zz.xml */\nint clastb_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10100|B=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5298000) {\n\t\tdecode_fields32(ENC_CLASTB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->isBefore = TRUE;\n\t\tOK(ENC_CLASTB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cls_z_p_z.xml */\nint cls_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x418A000) {\n\t\tdecode_fields32(ENC_CLS_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_CLS_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* clz_z_p_z.xml */\nint clz_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x419A000) {\n\t\tdecode_fields32(ENC_CLZ_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_CLZ_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* cmla_z_zzz.xml */\nint cmla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|001|op=0|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20F000)==0x44002000) {\n\t\tdecode_fields32(ENC_CMLA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_CMLA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* cmla_z_zzzi.xml */\nint cmla_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|0110|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44A06000) {\n\t\tdecode_fields32(ENC_CMLA_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_CMLA_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|0110|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44E06000) {\n\t\tdecode_fields32(ENC_CMLA_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_CMLA_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* cmpeq_p_p_zi.xml */\nint cmpeq_p_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25008000) {\n\t\tdecode_fields32(ENC_CMPEQ_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_EQ;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPEQ_P_P_ZI_);\n\t}\n\t/* class iclass_gt */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25000010) {\n\t\tdecode_fields32(ENC_CMPGT_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGT_P_P_ZI_);\n\t}\n\t/* class iclass_ge */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25000000) {\n\t\tdecode_fields32(ENC_CMPGE_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGE_P_P_ZI_);\n\t}\n\t/* class iclass_hi */\n\t/* 00100100|size=xx|1|imm7=xxxxxxx|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF202010)==0x24200010) {\n\t\tdecode_fields32(ENC_CMPHI_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->imm = UINT(ctx->imm7);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHI_P_P_ZI_);\n\t}\n\t/* class iclass_hs */\n\t/* 00100100|size=xx|1|imm7=xxxxxxx|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF202010)==0x24200000) {\n\t\tdecode_fields32(ENC_CMPHS_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->imm = UINT(ctx->imm7);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHS_P_P_ZI_);\n\t}\n\t/* class iclass_lt */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25002000) {\n\t\tdecode_fields32(ENC_CMPLT_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LT;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPLT_P_P_ZI_);\n\t}\n\t/* class iclass_le */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25002010) {\n\t\tdecode_fields32(ENC_CMPLE_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LE;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPLE_P_P_ZI_);\n\t}\n\t/* class iclass_lo */\n\t/* 00100100|size=xx|1|imm7=xxxxxxx|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF202010)==0x24202000) {\n\t\tdecode_fields32(ENC_CMPLO_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LT;\n\t\tctx->imm = UINT(ctx->imm7);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPLO_P_P_ZI_);\n\t}\n\t/* class iclass_ls */\n\t/* 00100100|size=xx|1|imm7=xxxxxxx|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF202010)==0x24202010) {\n\t\tdecode_fields32(ENC_CMPLS_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LE;\n\t\tctx->imm = UINT(ctx->imm7);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPLS_P_P_ZI_);\n\t}\n\t/* class iclass_ne */\n\t/* 00100101|size=xx|0|imm5=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x25008010) {\n\t\tdecode_fields32(ENC_CMPNE_P_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_NE;\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPNE_P_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* cmpeq_p_p_zw.xml */\nint cmpeq_p_p_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24002000) {\n\t\tdecode_fields32(ENC_CMPEQ_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_EQ;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPEQ_P_P_ZW_);\n\t}\n\t/* class iclass_gt */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24004010) {\n\t\tdecode_fields32(ENC_CMPGT_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGT_P_P_ZW_);\n\t}\n\t/* class iclass_ge */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24004000) {\n\t\tdecode_fields32(ENC_CMPGE_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGE_P_P_ZW_);\n\t}\n\t/* class iclass_hi */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400C010) {\n\t\tdecode_fields32(ENC_CMPHI_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHI_P_P_ZW_);\n\t}\n\t/* class iclass_hs */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400C000) {\n\t\tdecode_fields32(ENC_CMPHS_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHS_P_P_ZW_);\n\t}\n\t/* class iclass_lt */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24006000) {\n\t\tdecode_fields32(ENC_CMPLT_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LT;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPLT_P_P_ZW_);\n\t}\n\t/* class iclass_le */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24006010) {\n\t\tdecode_fields32(ENC_CMPLE_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LE;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPLE_P_P_ZW_);\n\t}\n\t/* class iclass_lo */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400E000) {\n\t\tdecode_fields32(ENC_CMPLO_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LT;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPLO_P_P_ZW_);\n\t}\n\t/* class iclass_ls */\n\t/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400E010) {\n\t\tdecode_fields32(ENC_CMPLS_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LE;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPLS_P_P_ZW_);\n\t}\n\t/* class iclass_ne */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24002010) {\n\t\tdecode_fields32(ENC_CMPNE_P_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_NE;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPNE_P_P_ZW_);\n\t}\n\treturn rc;\n}\n\n/* cmpeq_p_p_zz.xml */\nint cmpeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400A000) {\n\t\tdecode_fields32(ENC_CMPEQ_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_EQ;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPEQ_P_P_ZZ_);\n\t}\n\t/* class iclass_gt */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24008010) {\n\t\tdecode_fields32(ENC_CMPGT_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGT_P_P_ZZ_);\n\t}\n\t/* class iclass_ge */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24008000) {\n\t\tdecode_fields32(ENC_CMPGE_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPGE_P_P_ZZ_);\n\t}\n\t/* class iclass_hi */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24000010) {\n\t\tdecode_fields32(ENC_CMPHI_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHI_P_P_ZZ_);\n\t}\n\t/* class iclass_hs */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x24000000) {\n\t\tdecode_fields32(ENC_CMPHS_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_CMPHS_P_P_ZZ_);\n\t}\n\t/* class iclass_ne */\n\t/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x2400A010) {\n\t\tdecode_fields32(ENC_CMPNE_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_NE;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_CMPNE_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* cnot_z_p_z.xml */\nint cnot_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41BA000) {\n\t\tdecode_fields32(ENC_CNOT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_CNOT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* cnt_z_p_z.xml */\nint cnt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41AA000) {\n\t\tdecode_fields32(ENC_CNT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_CNT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* cntb_r_s.xml */\nint cntb_r_s(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000100|size=00|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x420E000) {\n\t\tdecode_fields32(ENC_CNTB_R_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_CNTB_R_S_);\n\t}\n\t/* class iclass_esize_doubleword */\n\t/* 00000100|size=11|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0E000) {\n\t\tdecode_fields32(ENC_CNTD_R_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_CNTD_R_S_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=01|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460E000) {\n\t\tdecode_fields32(ENC_CNTH_R_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_CNTH_R_S_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=10|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0E000) {\n\t\tdecode_fields32(ENC_CNTW_R_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_CNTW_R_S_);\n\t}\n\treturn rc;\n}\n\n/* cntp_r_p_p.xml */\nint cntp_r_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=0|10|Pg=xxxx|0|Pn=xxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FC200)==0x25208000) {\n\t\tdecode_fields32(ENC_CNTP_R_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tOK(ENC_CNTP_R_P_P_);\n\t}\n\treturn rc;\n}\n\n/* compact_z_p_z.xml */\nint compact_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100001100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5218000) {\n\t\tdecode_fields32(ENC_COMPACT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_COMPACT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* cpy_z_o_i.xml */\nint cpy_z_o_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|0|M=0|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30C000)==0x5100000) {\n\t\tdecode_fields32(ENC_CPY_Z_O_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->merging = FALSE;\n\t\tctx->imm = SInt(ctx->imm8,8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\t/* unconditional alias */\n\t\tif(MOV_cpy_z_o_i(ctx, instr)==0) return 0;\n\t\tOK(ENC_CPY_Z_O_I_);\n\t}\n\treturn rc;\n}\n\n/* cpy_z_p_i.xml */\nint cpy_z_p_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30C000)==0x5104000) {\n\t\tdecode_fields32(ENC_CPY_Z_P_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->merging = TRUE;\n\t\tctx->imm = SInt(ctx->imm8,8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\t/* unconditional alias */\n\t\tif(MOV_cpy_z_p_i(ctx, instr)==0) return 0;\n\t\tOK(ENC_CPY_Z_P_I_);\n\t}\n\treturn rc;\n}\n\n/* cpy_z_p_r.xml */\nint cpy_z_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|101000101|Pg=xxx|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x528A000) {\n\t\tdecode_fields32(ENC_CPY_Z_P_R_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* unconditional alias */\n\t\tif(MOV_cpy_z_p_r(ctx, instr)==0) return 0;\n\t\tOK(ENC_CPY_Z_P_R_);\n\t}\n\treturn rc;\n}\n\n/* cpy_z_p_v.xml */\nint cpy_z_p_v(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100000100|Pg=xxx|Vn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5208000) {\n\t\tdecode_fields32(ENC_CPY_Z_P_V_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Vn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* unconditional alias */\n\t\tif(MOV_cpy_z_p_v(ctx, instr)==0) return 0;\n\t\tOK(ENC_CPY_Z_P_V_);\n\t}\n\treturn rc;\n}\n\n/* ctermeq_rr.xml */\nint ctermeq_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 00|100101|op=1|sz=x|1|Rm=xxxxx|001000|Rn=xxxxx|ne=0|0|0|00 */\n\tif((INSWORD & 0xFFA0FC1F)==0x25A02000) {\n\t\tdecode_fields32(ENC_CTERMEQ_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->op = Cmp_EQ;\n\t\tOK(ENC_CTERMEQ_RR_);\n\t}\n\t/* class iclass_ne */\n\t/* 00|100101|op=1|sz=x|1|Rm=xxxxx|001000|Rn=xxxxx|ne=1|0|0|00 */\n\tif((INSWORD & 0xFFA0FC1F)==0x25A02010) {\n\t\tdecode_fields32(ENC_CTERMNE_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->op = Cmp_NE;\n\t\tOK(ENC_CTERMNE_RR_);\n\t}\n\treturn rc;\n}\n\n/* decb_r_rs.xml */\nint decb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000100|size=00|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430E400) {\n\t\tdecode_fields32(ENC_DECB_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECB_R_RS_);\n\t}\n\t/* class iclass_esize_doubleword */\n\t/* 00000100|size=11|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0E400) {\n\t\tdecode_fields32(ENC_DECD_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECD_R_RS_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=01|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470E400) {\n\t\tdecode_fields32(ENC_DECH_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECH_R_RS_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=10|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0E400) {\n\t\tdecode_fields32(ENC_DECW_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECW_R_RS_);\n\t}\n\treturn rc;\n}\n\n/* decd_z_zs.xml */\nint decd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_doubleword */\n\t/* 00000100|size=11|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0C400) {\n\t\tdecode_fields32(ENC_DECD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECD_Z_ZS_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=01|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470C400) {\n\t\tdecode_fields32(ENC_DECH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECH_Z_ZS_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=10|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0C400) {\n\t\tdecode_fields32(ENC_DECW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_DECW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* decp_r_p_r.xml */\nint decp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1011|op=0|D=1|10001|opc2=00|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252D8800) {\n\t\tdecode_fields32(ENC_DECP_R_P_R_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tOK(ENC_DECP_R_P_R_);\n\t}\n\treturn rc;\n}\n\n/* decp_z_p_z.xml */\nint decp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1011|op=0|D=1|10000|opc2=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252D8000) {\n\t\tdecode_fields32(ENC_DECP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_DECP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* dup_p_p_pi.xml */\nint dup_p_p_pi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|i1=x|tszh=x|1|tszl=xxx|Rm=xx|01|Pg=xxxx|S=0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF20C210)==0x25204000) {\n\t\tdecode_fields32(ENC_DUP_P_P_PI_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->imm = ((ctx->i1<<4)|(ctx->tszh<<3)|ctx->tszl);\n\t\tif(!((ctx->tszh<<3)|ctx->tszl)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(((ctx->tszh<<3)|ctx->tszl)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t\tctx->offset = UINT(SLICE(ctx->imm,4,4));\n\t\t}\n\t\telse if((((ctx->tszh<<3)|ctx->tszl)&7)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t\tctx->offset = UINT(SLICE(ctx->imm,4,3));\n\t\t}\n\t\telse if((((ctx->tszh<<3)|ctx->tszl)&3)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t\tctx->offset = UINT(SLICE(ctx->imm,4,2));\n\t\t}\n\t\telse if(((ctx->tszh<<3)|ctx->tszl)&1) {\n\t\t\tctx->esize = 8;\n\t\t\tctx->offset = UINT(SLICE(ctx->imm,4,1));\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->m = UINT(((3<<2)|ctx->Rm));\n\t\tOK(ENC_DUP_P_P_PI_);\n\t}\n\treturn rc;\n}\n\n/* dup_z_i.xml */\nint dup_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|111|opc=00|011|sh=x|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2538C000) {\n\t\tdecode_fields32(ENC_DUP_Z_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm = SInt(ctx->imm8,8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\t/* unconditional alias */\n\t\tif(MOV_dup_z_i(ctx, instr)==0) return 0;\n\t\tOK(ENC_DUP_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* dup_z_r.xml */\nint dup_z_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100000001110|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5203800) {\n\t\tdecode_fields32(ENC_DUP_Z_R_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* unconditional alias */\n\t\tif(MOV_dup_z_r(ctx, instr)==0) return 0;\n\t\tOK(ENC_DUP_Z_R_);\n\t}\n\treturn rc;\n}\n\n/* dup_z_zi.xml */\nint dup_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|imm2=xx|1|tsz=xxxxx|001000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5202000) {\n\t\tdecode_fields32(ENC_DUP_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->imm = ((ctx->imm2<<5)|ctx->tsz);\n\t\tif(!ctx->tsz) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsz==0x10) {\n\t\t\tctx->esize = 0x80;\n\t\t\tctx->index = UINT(SLICE(ctx->imm,6,5));\n\t\t}\n\t\telse if((ctx->tsz&15)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t\tctx->index = UINT(SLICE(ctx->imm,6,4));\n\t\t}\n\t\telse if((ctx->tsz&7)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t\tctx->index = UINT(SLICE(ctx->imm,6,3));\n\t\t}\n\t\telse if((ctx->tsz&3)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t\tctx->index = UINT(SLICE(ctx->imm,6,2));\n\t\t}\n\t\telse if(ctx->tsz&1) {\n\t\t\tctx->esize = 8;\n\t\t\tctx->index = UINT(SLICE(ctx->imm,6,1));\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* regular aliases */\n\t\tif((BitCount(((ctx->imm2<<5)|ctx->tsz))==1) || (BitCount(((ctx->imm2<<5)|ctx->tsz))>1)) return MOV_dup_z_zi(ctx, instr);\n\t\tOK(ENC_DUP_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* dupm_z_i.xml */\nint dupm_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101110000|imm13=xxxxxxxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5C00000) {\n\t\tdecode_fields32(ENC_DUPM_Z_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tDecodeBitMasksCheckUndefined(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0));\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0),SLICE(ctx->imm13,11,6));\n\t\tctx->imm = dbmrt.wmask;\n\t\t/* regular aliases */\n\t\tif(SVEMoveMaskPreferred(ctx->imm13)) return MOV_dupm_z_i(ctx, instr);\n\t\tOK(ENC_DUPM_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* eor3_z_zzz.xml */\nint eor3_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=00|1|Zm=xxxxx|00111|o2=0|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4203800) {\n\t\tdecode_fields32(ENC_EOR3_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_EOR3_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* eor_p_p_pp.xml */\nint eor_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004200) {\n\t\tdecode_fields32(ENC_EOR_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t/* regular aliases */\n\t\tif(ctx->Pm==ctx->Pg) return NOT_eor_p_p_pp(ctx, instr);\n\t\tOK(ENC_EOR_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* eor_z_p_zz.xml */\nint eor_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4190000) {\n\t\tdecode_fields32(ENC_EOR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_EOR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* eor_z_zi.xml */\nint eor_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=01|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5400000) {\n\t\tdecode_fields32(ENC_EOR_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tDecodeBitMasksCheckUndefined(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0));\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0),SLICE(ctx->imm13,11,6));\n\t\tctx->imm = dbmrt.wmask;\n\t\tOK(ENC_EOR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* eor_z_zz.xml */\nint eor_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=10|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4A03000) {\n\t\tdecode_fields32(ENC_EOR_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_EOR_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* eorbt_z_zz.xml */\nint eorbt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|10010|tb=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45009000) {\n\t\tdecode_fields32(ENC_EORBT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 1;\n\t\tOK(ENC_EORBT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* eors_p_p_pp.xml */\nint eors_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25404200) {\n\t\tdecode_fields32(ENC_EORS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t/* regular aliases */\n\t\tif(ctx->Pm==ctx->Pg) return NOTS_eors_p_p_pp(ctx, instr);\n\t\tOK(ENC_EORS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* eortb_z_zz.xml */\nint eortb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|10010|tb=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45009400) {\n\t\tdecode_fields32(ENC_EORTB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 0;\n\t\tOK(ENC_EORTB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* eorv_r_p_z.xml */\nint eorv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0110|opc=01|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4192000) {\n\t\tdecode_fields32(ENC_EORV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_EORV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* ext_z_zi.xml */\nint ext_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_const */\n\t/* 00000101011|imm8h=xxxxx|000|imm8l=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x5600000) {\n\t\tdecode_fields32(ENC_EXT_Z_ZI_CON, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dst = UINT(ctx->Zd);\n\t\tctx->s1 = UINT(ctx->Zn);\n\t\tctx->s2 = ((ctx->s1+1)) % 32;\n\t\tctx->position = UINT(((ctx->imm8h<<3)|ctx->imm8l));\n\t\tOK(ENC_EXT_Z_ZI_CON);\n\t}\n\t/* class iclass_sve_dest */\n\t/* 00000101001|imm8h=xxxxx|000|imm8l=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x5200000) {\n\t\tdecode_fields32(ENC_EXT_Z_ZI_DES, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dst = UINT(ctx->Zdn);\n\t\tctx->s1 = ctx->dst;\n\t\tctx->s2 = UINT(ctx->Zm);\n\t\tctx->position = UINT(((ctx->imm8h<<3)|ctx->imm8l));\n\t\tOK(ENC_EXT_Z_ZI_DES);\n\t}\n\treturn rc;\n}\n\n/* fabd_z_p_zz.xml */\nint fabd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=100|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65088000) {\n\t\tdecode_fields32(ENC_FABD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FABD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fabs_z_p_z.xml */\nint fabs_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=10|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41CA000) {\n\t\tdecode_fields32(ENC_FABS_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FABS_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* facge_p_p_zz.xml */\nint facge_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_gt */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=1|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x6500E010) {\n\t\tdecode_fields32(ENC_FACGT_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tOK(ENC_FACGT_P_P_ZZ_);\n\t}\n\t/* class iclass_ge */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x6500C010) {\n\t\tdecode_fields32(ENC_FACGE_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tOK(ENC_FACGE_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fadd_z_p_zs.xml */\nint fadd_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=00|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x65188000) {\n\t\tdecode_fields32(ENC_FADD_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? FPPointFive(0,ctx->esize) : FPOne(0,ctx->esize);\n\t\tOK(ENC_FADD_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fadd_z_p_zz.xml */\nint fadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=000|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65008000) {\n\t\tdecode_fields32(ENC_FADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fadd_z_zz.xml */\nint fadd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=00|opc<0>=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65000000) {\n\t\tdecode_fields32(ENC_FADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fadda_v_p_z.xml */\nint fadda_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0110|opc=00|001|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65182000) {\n\t\tdecode_fields32(ENC_FADDA_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Vdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FADDA_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* faddp_z_p_zz.xml */\nint faddp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100100|size=xx|010|opc<2:1>=00|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x64108000) {\n\t\tdecode_fields32(ENC_FADDP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_FADDP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* faddv_v_p_z.xml */\nint faddv_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65002000) {\n\t\tdecode_fields32(ENC_FADDV_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_FADDV_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fcadd_z_p_zz.xml */\nint fcadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100100|size=xx|00000|rot=x|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3EE000)==0x64008000) {\n\t\tdecode_fields32(ENC_FCADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->sub_i = (ctx->rot==0);\n\t\tctx->sub_r = (ctx->rot==1);\n\t\tOK(ENC_FCADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fcmeq_p_p_z0.xml */\nint fcmeq_p_p_z0(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 01100101|size=xx|0100|eq=1|lt=0|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65122000) {\n\t\tdecode_fields32(ENC_FCMEQ_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_EQ;\n\t\tOK(ENC_FCMEQ_P_P_Z0_);\n\t}\n\t/* class iclass_gt */\n\t/* 01100101|size=xx|0100|eq=0|lt=0|001|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65102010) {\n\t\tdecode_fields32(ENC_FCMGT_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tOK(ENC_FCMGT_P_P_Z0_);\n\t}\n\t/* class iclass_ge */\n\t/* 01100101|size=xx|0100|eq=0|lt=0|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65102000) {\n\t\tdecode_fields32(ENC_FCMGE_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tOK(ENC_FCMGE_P_P_Z0_);\n\t}\n\t/* class iclass_lt */\n\t/* 01100101|size=xx|0100|eq=0|lt=1|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65112000) {\n\t\tdecode_fields32(ENC_FCMLT_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LT;\n\t\tOK(ENC_FCMLT_P_P_Z0_);\n\t}\n\t/* class iclass_le */\n\t/* 01100101|size=xx|0100|eq=0|lt=1|001|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65112010) {\n\t\tdecode_fields32(ENC_FCMLE_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_LE;\n\t\tOK(ENC_FCMLE_P_P_Z0_);\n\t}\n\t/* class iclass_ne */\n\t/* 01100101|size=xx|0100|eq=1|lt=1|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FE010)==0x65132000) {\n\t\tdecode_fields32(ENC_FCMNE_P_P_Z0_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_NE;\n\t\tOK(ENC_FCMNE_P_P_Z0_);\n\t}\n\treturn rc;\n}\n\n/* fcmeq_p_p_zz.xml */\nint fcmeq_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_eq */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=1|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65006000) {\n\t\tdecode_fields32(ENC_FCMEQ_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_EQ;\n\t\tOK(ENC_FCMEQ_P_P_ZZ_);\n\t}\n\t/* class iclass_gt */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65004010) {\n\t\tdecode_fields32(ENC_FCMGT_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GT;\n\t\tOK(ENC_FCMGT_P_P_ZZ_);\n\t}\n\t/* class iclass_ge */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65004000) {\n\t\tdecode_fields32(ENC_FCMGE_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_GE;\n\t\tOK(ENC_FCMGE_P_P_ZZ_);\n\t}\n\t/* class iclass_ne */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=1|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x65006010) {\n\t\tdecode_fields32(ENC_FCMNE_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_NE;\n\t\tOK(ENC_FCMNE_P_P_ZZ_);\n\t}\n\t/* class iclass_uo */\n\t/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x6500C000) {\n\t\tdecode_fields32(ENC_FCMUO_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->op = Cmp_UN;\n\t\tOK(ENC_FCMUO_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fcmla_z_p_zzz.xml */\nint fcmla_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100100|size=xx|0|Zm=xxxxx|0|rot=xx|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF208000)==0x64000000) {\n\t\tdecode_fields32(ENC_FCMLA_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->neg_i = (SLICE(ctx->rot,1,1)==1);\n\t\tctx->neg_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tOK(ENC_FCMLA_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fcmla_z_zzzi.xml */\nint fcmla_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01100100|size=10|1|i2=xx|Zm=xxx|0001|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x64A01000) {\n\t\tdecode_fields32(ENC_FCMLA_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->neg_i = (SLICE(ctx->rot,1,1)==1);\n\t\tctx->neg_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tOK(ENC_FCMLA_Z_ZZZI_H);\n\t}\n\t/* class iclass_single */\n\t/* 01100100|size=11|1|i1=x|Zm=xxxx|0001|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x64E01000) {\n\t\tdecode_fields32(ENC_FCMLA_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->neg_i = (SLICE(ctx->rot,1,1)==1);\n\t\tctx->neg_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tOK(ENC_FCMLA_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* fcpy_z_p_i.xml */\nint fcpy_z_p_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|01|Pg=xxxx|110|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF30E000)==0x510C000) {\n\t\tdecode_fields32(ENC_FCPY_Z_P_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm = VFPExpandImm(ctx->imm8,8);\n\t\t/* unconditional alias */\n\t\tif(FMOV_fcpy_z_p_i(ctx, instr)==0) return 0;\n\t\tOK(ENC_FCPY_Z_P_I_);\n\t}\n\treturn rc;\n}\n\n/* fcvt_z_p_z.xml */\nint fcvt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half_to_single */\n\t/* 01100101|opc=10|0010|opc2=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6589A000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_H2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x20;\n\t\tOK(ENC_FCVT_Z_P_Z_H2S);\n\t}\n\t/* class iclass_half_to_double */\n\t/* 01100101|opc=11|0010|opc2=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65C9A000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_H2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x40;\n\t\tOK(ENC_FCVT_Z_P_Z_H2D);\n\t}\n\t/* class iclass_single_to_half */\n\t/* 01100101|opc=10|0010|opc2=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6588A000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_S2H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x10;\n\t\tOK(ENC_FCVT_Z_P_Z_S2H);\n\t}\n\t/* class iclass_single_to_double */\n\t/* 01100101|opc=11|0010|opc2=11|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65CBA000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_S2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x40;\n\t\tOK(ENC_FCVT_Z_P_Z_S2D);\n\t}\n\t/* class iclass_double_to_half */\n\t/* 01100101|opc=11|0010|opc2=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65C8A000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_D2H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x10;\n\t\tOK(ENC_FCVT_Z_P_Z_D2H);\n\t}\n\t/* class iclass_double_to_single */\n\t/* 01100101|opc=11|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65CAA000) {\n\t\tdecode_fields32(ENC_FCVT_Z_P_Z_D2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tOK(ENC_FCVT_Z_P_Z_D2S);\n\t}\n\treturn rc;\n}\n\n/* fcvtlt_z_p_z.xml */\nint fcvtlt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half_to_single */\n\t/* 01100100|opc=10|0010|opc2=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6489A000) {\n\t\tdecode_fields32(ENC_FCVTLT_Z_P_Z_H2S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FCVTLT_Z_P_Z_H2S);\n\t}\n\t/* class iclass_single_to_double */\n\t/* 01100100|opc=11|0010|opc2=11|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x64CBA000) {\n\t\tdecode_fields32(ENC_FCVTLT_Z_P_Z_S2D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FCVTLT_Z_P_Z_S2D);\n\t}\n\treturn rc;\n}\n\n/* fcvtnt_z_p_z.xml */\nint fcvtnt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single_to_half */\n\t/* 01100100|opc=10|0010|opc2=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6488A000) {\n\t\tdecode_fields32(ENC_FCVTNT_Z_P_Z_S2H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FCVTNT_Z_P_Z_S2H);\n\t}\n\t/* class iclass_double_to_single */\n\t/* 01100100|opc=11|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x64CAA000) {\n\t\tdecode_fields32(ENC_FCVTNT_Z_P_Z_D2S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FCVTNT_Z_P_Z_D2S);\n\t}\n\treturn rc;\n}\n\n/* fcvtx_z_p_z.xml */\nint fcvtx_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_double_to_single */\n\t/* 01100101|opc=00|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x650AA000) {\n\t\tdecode_fields32(ENC_FCVTX_Z_P_Z_D2S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tOK(ENC_FCVTX_Z_P_Z_D2S);\n\t}\n\treturn rc;\n}\n\n/* fcvtxnt_z_p_z.xml */\nint fcvtxnt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_double_to_single */\n\t/* 01100100|opc=00|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x640AA000) {\n\t\tdecode_fields32(ENC_FCVTXNT_Z_P_Z_D2S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FCVTXNT_Z_P_Z_D2S);\n\t}\n\treturn rc;\n}\n\n/* fcvtzs_z_p_z.xml */\nint fcvtzs_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half_to_16 */\n\t/* 01100101|opc=01|011|opc2=01|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655AA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_FP162H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_FP162H);\n\t}\n\t/* class iclass_half_to_32 */\n\t/* 01100101|opc=01|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655CA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_FP162W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_FP162W);\n\t}\n\t/* class iclass_half_to_64 */\n\t/* 01100101|opc=01|011|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655EA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_FP162X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_FP162X);\n\t}\n\t/* class iclass_single_to_32 */\n\t/* 01100101|opc=10|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x659CA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_S2W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_S2W);\n\t}\n\t/* class iclass_single_to_64 */\n\t/* 01100101|opc=11|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65DCA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_S2X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_S2X);\n\t}\n\t/* class iclass_double_to_32 */\n\t/* 01100101|opc=11|011|opc2=00|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D8A000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_D2W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_D2W);\n\t}\n\t/* class iclass_double_to_64 */\n\t/* 01100101|opc=11|011|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65DEA000) {\n\t\tdecode_fields32(ENC_FCVTZS_Z_P_Z_D2X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZS_Z_P_Z_D2X);\n\t}\n\treturn rc;\n}\n\n/* fcvtzu_z_p_z.xml */\nint fcvtzu_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half_to_16 */\n\t/* 01100101|opc=01|011|opc2=01|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655BA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_FP162H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_FP162H);\n\t}\n\t/* class iclass_half_to_32 */\n\t/* 01100101|opc=01|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655DA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_FP162W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_FP162W);\n\t}\n\t/* class iclass_half_to_64 */\n\t/* 01100101|opc=01|011|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x655FA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_FP162X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_FP162X);\n\t}\n\t/* class iclass_single_to_32 */\n\t/* 01100101|opc=10|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x659DA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_S2W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_S2W);\n\t}\n\t/* class iclass_single_to_64 */\n\t/* 01100101|opc=11|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65DDA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_S2X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_S2X);\n\t}\n\t/* class iclass_double_to_32 */\n\t/* 01100101|opc=11|011|opc2=00|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D9A000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_D2W, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_D2W);\n\t}\n\t/* class iclass_double_to_64 */\n\t/* 01100101|opc=11|011|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65DFA000) {\n\t\tdecode_fields32(ENC_FCVTZU_Z_P_Z_D2X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FCVTZU_Z_P_Z_D2X);\n\t}\n\treturn rc;\n}\n\n/* fdiv_z_p_zz.xml */\nint fdiv_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=110|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x650D8000) {\n\t\tdecode_fields32(ENC_FDIV_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FDIV_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fdivr_z_p_zz.xml */\nint fdivr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=110|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x650C8000) {\n\t\tdecode_fields32(ENC_FDIVR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FDIVR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fdup_z_i.xml */\nint fdup_z_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|111|opc=00|111|o2=0|imm8=xxxxxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x2539C000) {\n\t\tdecode_fields32(ENC_FDUP_Z_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm = VFPExpandImm(ctx->imm8,8);\n\t\t/* unconditional alias */\n\t\tif(FMOV_fdup_z_i(ctx, instr)==0) return 0;\n\t\tOK(ENC_FDUP_Z_I_);\n\t}\n\treturn rc;\n}\n\n/* fexpa_z_z.xml */\nint fexpa_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|opc<4:1>=0000|opc<0>=0|101110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x420B800) {\n\t\tdecode_fields32(ENC_FEXPA_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FEXPA_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* flogb_z_p_z.xml */\nint flogb_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100101|opc=00|011|size=xx|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFF9E000)==0x6518A000) {\n\t\tdecode_fields32(ENC_FLOGB_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FLOGB_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fmad_z_p_zzz.xml */\nint fmad_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Za=xxxxx|1|N=0|op=0|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x65208000) {\n\t\tdecode_fields32(ENC_FMAD_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMAD_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmax_z_p_zs.xml */\nint fmax_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=11|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651E8000) {\n\t\tdecode_fields32(ENC_FMAX_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? 0 : FPOne(0,ctx->esize);\n\t\tOK(ENC_FMAX_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fmax_z_p_zz.xml */\nint fmax_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=011|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65068000) {\n\t\tdecode_fields32(ENC_FMAX_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMAX_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmaxnm_z_p_zs.xml */\nint fmaxnm_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=10|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651C8000) {\n\t\tdecode_fields32(ENC_FMAXNM_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? 0 : FPOne(0,ctx->esize);\n\t\tOK(ENC_FMAXNM_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fmaxnm_z_p_zz.xml */\nint fmaxnm_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=010|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65048000) {\n\t\tdecode_fields32(ENC_FMAXNM_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMAXNM_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmaxnmp_z_p_zz.xml */\nint fmaxnmp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100100|size=xx|010|opc<2:1>=10|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x64148000) {\n\t\tdecode_fields32(ENC_FMAXNMP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_FMAXNMP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmaxnmv_v_p_z.xml */\nint fmaxnmv_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65042000) {\n\t\tdecode_fields32(ENC_FMAXNMV_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_FMAXNMV_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fmaxp_z_p_zz.xml */\nint fmaxp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100100|size=xx|010|opc<2:1>=11|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x64168000) {\n\t\tdecode_fields32(ENC_FMAXP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_FMAXP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmaxv_v_p_z.xml */\nint fmaxv_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65062000) {\n\t\tdecode_fields32(ENC_FMAXV_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_FMAXV_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fmin_z_p_zs.xml */\nint fmin_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=11|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651F8000) {\n\t\tdecode_fields32(ENC_FMIN_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? 0 : FPOne(0,ctx->esize);\n\t\tOK(ENC_FMIN_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fmin_z_p_zz.xml */\nint fmin_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=011|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65078000) {\n\t\tdecode_fields32(ENC_FMIN_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMIN_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fminnm_z_p_zs.xml */\nint fminnm_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=10|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651D8000) {\n\t\tdecode_fields32(ENC_FMINNM_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? 0 : FPOne(0,ctx->esize);\n\t\tOK(ENC_FMINNM_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fminnm_z_p_zz.xml */\nint fminnm_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=010|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65058000) {\n\t\tdecode_fields32(ENC_FMINNM_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMINNM_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fminnmp_z_p_zz.xml */\nint fminnmp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100100|size=xx|010|opc<2:1>=10|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x64158000) {\n\t\tdecode_fields32(ENC_FMINNMP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_FMINNMP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fminnmv_v_p_z.xml */\nint fminnmv_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65052000) {\n\t\tdecode_fields32(ENC_FMINNMV_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_FMINNMV_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fminp_z_p_zz.xml */\nint fminp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01100100|size=xx|010|opc<2:1>=11|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x64178000) {\n\t\tdecode_fields32(ENC_FMINP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_FMINP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fminv_v_p_z.xml */\nint fminv_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65072000) {\n\t\tdecode_fields32(ENC_FMINV_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_FMINV_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fmla_z_p_zzz.xml */\nint fmla_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Zm=xxxxx|0|N=0|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x65200000) {\n\t\tdecode_fields32(ENC_FMLA_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLA_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmla_z_zzzi.xml */\nint fmla_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x64200000) {\n\t\tdecode_fields32(ENC_FMLA_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLA_Z_ZZZI_H);\n\t}\n\t/* class iclass_single */\n\t/* 01100100|size=10|1|i2=xx|Zm=xxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A00000) {\n\t\tdecode_fields32(ENC_FMLA_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLA_Z_ZZZI_S);\n\t}\n\t/* class iclass_double */\n\t/* 01100100|size=11|1|i1=x|Zm=xxxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E00000) {\n\t\tdecode_fields32(ENC_FMLA_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLA_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* fmlalb_z_zzz.xml */\nint fmlalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 011001001|o2=0|1|Zm=xxxxx|10|op=0|00|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A08000) {\n\t\tdecode_fields32(ENC_FMLALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tOK(ENC_FMLALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmlalb_z_zzzi.xml */\nint fmlalb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single */\n\t/* 011001001|o2=0|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64A04000) {\n\t\tdecode_fields32(ENC_FMLALB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->op1_neg = FALSE;\n\t\tOK(ENC_FMLALB_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* fmlalt_z_zzz.xml */\nint fmlalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 011001001|o2=0|1|Zm=xxxxx|10|op=0|00|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A08400) {\n\t\tdecode_fields32(ENC_FMLALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tOK(ENC_FMLALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmlalt_z_zzzi.xml */\nint fmlalt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single */\n\t/* 011001001|o2=0|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64A04400) {\n\t\tdecode_fields32(ENC_FMLALT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->op1_neg = FALSE;\n\t\tOK(ENC_FMLALT_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* fmls_z_p_zzz.xml */\nint fmls_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Zm=xxxxx|0|N=0|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x65202000) {\n\t\tdecode_fields32(ENC_FMLS_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLS_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmls_z_zzzi.xml */\nint fmls_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x64200400) {\n\t\tdecode_fields32(ENC_FMLS_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLS_Z_ZZZI_H);\n\t}\n\t/* class iclass_single */\n\t/* 01100100|size=10|1|i2=xx|Zm=xxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A00400) {\n\t\tdecode_fields32(ENC_FMLS_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLS_Z_ZZZI_S);\n\t}\n\t/* class iclass_double */\n\t/* 01100100|size=11|1|i1=x|Zm=xxxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E00400) {\n\t\tdecode_fields32(ENC_FMLS_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMLS_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* fmlslb_z_zzz.xml */\nint fmlslb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 011001001|o2=0|1|Zm=xxxxx|10|op=1|00|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A0A000) {\n\t\tdecode_fields32(ENC_FMLSLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tOK(ENC_FMLSLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmlslb_z_zzzi.xml */\nint fmlslb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single */\n\t/* 011001001|o2=0|1|i3h=xx|Zm=xxx|01|op=1|0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64A06000) {\n\t\tdecode_fields32(ENC_FMLSLB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->op1_neg = TRUE;\n\t\tOK(ENC_FMLSLB_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* fmlslt_z_zzz.xml */\nint fmlslt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 011001001|o2=0|1|Zm=xxxxx|10|op=1|00|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A0A400) {\n\t\tdecode_fields32(ENC_FMLSLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tOK(ENC_FMLSLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmlslt_z_zzzi.xml */\nint fmlslt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_single */\n\t/* 011001001|o2=0|1|i3h=xx|Zm=xxx|01|op=1|0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x64A06400) {\n\t\tdecode_fields32(ENC_FMLSLT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->op1_neg = TRUE;\n\t\tOK(ENC_FMLSLT_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* fmmla_z_zzz.xml */\nint fmmla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 01100100|opc=10|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A0E400) {\n\t\tdecode_fields32(ENC_FMMLA_Z_ZZZ_S, ctx, instr);\n\t\tif(!HaveSVEFP32MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_FMMLA_Z_ZZZ_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 01100100|opc=11|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E0E400) {\n\t\tdecode_fields32(ENC_FMMLA_Z_ZZZ_D, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_FMMLA_Z_ZZZ_D);\n\t}\n\treturn rc;\n}\n\n/* fmopa_za32_pp_zz.xml */\nint fmopa_za32_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 10|000001101|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x81A00000) {\n\t\tdecode_fields32(ENC_FMOPA_ZA32_PP_ZZ_16, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_FMOPA_ZA32_PP_ZZ_16);\n\t}\n\treturn rc;\n}\n\n/* fmopa_za_pp_zz.xml */\nint fmopa_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_single */\n\t/* 10|000000100|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x80800000) {\n\t\tdecode_fields32(ENC_FMOPA_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_FMOPA_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_double */\n\t/* 10|000000110|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0x80C00000) {\n\t\tdecode_fields32(ENC_FMOPA_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEF64F64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_FMOPA_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* fmops_za32_pp_zz.xml */\nint fmops_za32_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 10|000001101|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x81A00010) {\n\t\tdecode_fields32(ENC_FMOPS_ZA32_PP_ZZ_16, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_FMOPS_ZA32_PP_ZZ_16);\n\t}\n\treturn rc;\n}\n\n/* fmops_za_pp_zz.xml */\nint fmops_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_single */\n\t/* 10|000000100|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0x80800010) {\n\t\tdecode_fields32(ENC_FMOPS_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_FMOPS_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_double */\n\t/* 10|000000110|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0x80C00010) {\n\t\tdecode_fields32(ENC_FMOPS_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEF64F64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_FMOPS_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* fmsb_z_p_zzz.xml */\nint fmsb_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Za=xxxxx|1|N=0|op=1|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x6520A000) {\n\t\tdecode_fields32(ENC_FMSB_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = FALSE;\n\t\tOK(ENC_FMSB_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmul_z_p_zs.xml */\nint fmul_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=01|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651A8000) {\n\t\tdecode_fields32(ENC_FMUL_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? FPPointFive(0,ctx->esize) : FPTwo(0,ctx->esize);\n\t\tOK(ENC_FMUL_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fmul_z_p_zz.xml */\nint fmul_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=001|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65028000) {\n\t\tdecode_fields32(ENC_FMUL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMUL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmul_z_zz.xml */\nint fmul_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=01|opc<0>=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65000800) {\n\t\tdecode_fields32(ENC_FMUL_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FMUL_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fmul_z_zzi.xml */\nint fmul_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_half */\n\t/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|001000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x64202000) {\n\t\tdecode_fields32(ENC_FMUL_Z_ZZI_H, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FMUL_Z_ZZI_H);\n\t}\n\t/* class iclass_single */\n\t/* 01100100|size=10|1|i2=xx|Zm=xxx|001000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64A02000) {\n\t\tdecode_fields32(ENC_FMUL_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FMUL_Z_ZZI_S);\n\t}\n\t/* class iclass_double */\n\t/* 01100100|size=11|1|i1=x|Zm=xxxx|001000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x64E02000) {\n\t\tdecode_fields32(ENC_FMUL_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FMUL_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* fmulx_z_p_zz.xml */\nint fmulx_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=101|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x650A8000) {\n\t\tdecode_fields32(ENC_FMULX_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FMULX_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fneg_z_p_z.xml */\nint fneg_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=10|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41DA000) {\n\t\tdecode_fields32(ENC_FNEG_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FNEG_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fnmad_z_p_zzz.xml */\nint fnmad_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Za=xxxxx|1|N=1|op=0|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x6520C000) {\n\t\tdecode_fields32(ENC_FNMAD_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = TRUE;\n\t\tOK(ENC_FNMAD_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fnmla_z_p_zzz.xml */\nint fnmla_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Zm=xxxxx|0|N=1|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x65204000) {\n\t\tdecode_fields32(ENC_FNMLA_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = TRUE;\n\t\tctx->op3_neg = TRUE;\n\t\tOK(ENC_FNMLA_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fnmls_z_p_zzz.xml */\nint fnmls_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Zm=xxxxx|0|N=1|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x65206000) {\n\t\tdecode_fields32(ENC_FNMLS_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = TRUE;\n\t\tOK(ENC_FNMLS_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* fnmsb_z_p_zzz.xml */\nint fnmsb_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|1|Za=xxxxx|1|N=1|op=1|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x6520E000) {\n\t\tdecode_fields32(ENC_FNMSB_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->op1_neg = FALSE;\n\t\tctx->op3_neg = TRUE;\n\t\tOK(ENC_FNMSB_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* frecpe_z_z.xml */\nint frecpe_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|001|opc<2:1>=11|opc<0>=0|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x650E3000) {\n\t\tdecode_fields32(ENC_FRECPE_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FRECPE_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* frecps_z_zz.xml */\nint frecps_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=11|opc<0>=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65001800) {\n\t\tdecode_fields32(ENC_FRECPS_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FRECPS_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* frecpx_z_p_z.xml */\nint frecpx_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0011|opc=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x650CA000) {\n\t\tdecode_fields32(ENC_FRECPX_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FRECPX_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* frinta_z_p_z.xml */\nint frinta_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_frint_i */\n\t/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6507A000) {\n\t\tdecode_fields32(ENC_FRINTI_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINTI_Z_P_Z_);\n\t}\n\t/* class iclass_frint_x */\n\t/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6506A000) {\n\t\tdecode_fields32(ENC_FRINTX_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_FRINTX_Z_P_Z_);\n\t}\n\t/* class iclass_frint_a */\n\t/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6504A000) {\n\t\tdecode_fields32(ENC_FRINTA_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRounding_TIEAWAY;\n\t\tOK(ENC_FRINTA_Z_P_Z_);\n\t}\n\t/* class iclass_frint_n */\n\t/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6500A000) {\n\t\tdecode_fields32(ENC_FRINTN_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRounding_TIEEVEN;\n\t\tOK(ENC_FRINTN_Z_P_Z_);\n\t}\n\t/* class iclass_frint_z */\n\t/* 01100101|size=xx|000|opc<2:1>=01|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6503A000) {\n\t\tdecode_fields32(ENC_FRINTZ_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRounding_ZERO;\n\t\tOK(ENC_FRINTZ_Z_P_Z_);\n\t}\n\t/* class iclass_frint_m */\n\t/* 01100101|size=xx|000|opc<2:1>=01|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6502A000) {\n\t\tdecode_fields32(ENC_FRINTM_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRounding_NEGINF;\n\t\tOK(ENC_FRINTM_Z_P_Z_);\n\t}\n\t/* class iclass_frint_p */\n\t/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x6501A000) {\n\t\tdecode_fields32(ENC_FRINTP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->exact = FALSE;\n\t\tctx->rounding = FPRounding_POSINF;\n\t\tOK(ENC_FRINTP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* frsqrte_z_z.xml */\nint frsqrte_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|001|opc<2:1>=11|opc<0>=1|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x650F3000) {\n\t\tdecode_fields32(ENC_FRSQRTE_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FRSQRTE_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* frsqrts_z_zz.xml */\nint frsqrts_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=11|opc<0>=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65001C00) {\n\t\tdecode_fields32(ENC_FRSQRTS_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FRSQRTS_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fscale_z_p_zz.xml */\nint fscale_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=100|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65098000) {\n\t\tdecode_fields32(ENC_FSCALE_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FSCALE_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fsqrt_z_p_z.xml */\nint fsqrt_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0011|opc=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x650DA000) {\n\t\tdecode_fields32(ENC_FSQRT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FSQRT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* fsub_z_p_zs.xml */\nint fsub_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=00|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x65198000) {\n\t\tdecode_fields32(ENC_FSUB_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? FPPointFive(0,ctx->esize) : FPOne(0,ctx->esize);\n\t\tOK(ENC_FSUB_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fsub_z_p_zz.xml */\nint fsub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=000|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65018000) {\n\t\tdecode_fields32(ENC_FSUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FSUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fsub_z_zz.xml */\nint fsub_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=00|opc<0>=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65000400) {\n\t\tdecode_fields32(ENC_FSUB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FSUB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* fsubr_z_p_zs.xml */\nint fsubr_z_p_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|011|opc<2:1>=01|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE3C0)==0x651B8000) {\n\t\tdecode_fields32(ENC_FSUBR_Z_P_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = (ctx->i1==0) ? FPPointFive(0,ctx->esize) : FPOne(0,ctx->esize);\n\t\tOK(ENC_FSUBR_Z_P_ZS_);\n\t}\n\treturn rc;\n}\n\n/* fsubr_z_p_zz.xml */\nint fsubr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|00|opc<3:1>=001|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x65038000) {\n\t\tdecode_fields32(ENC_FSUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_FSUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ftmad_z_zzi.xml */\nint ftmad_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|010|imm3=xxx|100000|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF38FC00)==0x65108000) {\n\t\tdecode_fields32(ENC_FTMAD_Z_ZZI_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->imm = UINT(ctx->imm3);\n\t\tOK(ENC_FTMAD_Z_ZZI_);\n\t}\n\treturn rc;\n}\n\n/* ftsmul_z_zz.xml */\nint ftsmul_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=01|opc<0>=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x65000C00) {\n\t\tdecode_fields32(ENC_FTSMUL_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FTSMUL_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ftssel_z_zz.xml */\nint ftssel_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|10110|op=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x420B000) {\n\t\tdecode_fields32(ENC_FTSSEL_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_FTSSEL_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* histcnt_z_p_zz.xml */\nint histcnt_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|110|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x4520C000) {\n\t\tdecode_fields32(ENC_HISTCNT_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_HISTCNT_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* histseg_z_zz.xml */\nint histseg_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|101000|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4520A000) {\n\t\tdecode_fields32(ENC_HISTSEG_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_HISTSEG_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* incb_r_rs.xml */\nint incb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000100|size=00|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430E000) {\n\t\tdecode_fields32(ENC_INCB_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCB_R_RS_);\n\t}\n\t/* class iclass_esize_doubleword */\n\t/* 00000100|size=11|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0E000) {\n\t\tdecode_fields32(ENC_INCD_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCD_R_RS_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=01|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470E000) {\n\t\tdecode_fields32(ENC_INCH_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCH_R_RS_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=10|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0E000) {\n\t\tdecode_fields32(ENC_INCW_R_RS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCW_R_RS_);\n\t}\n\treturn rc;\n}\n\n/* incd_z_zs.xml */\nint incd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_doubleword */\n\t/* 00000100|size=11|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0C000) {\n\t\tdecode_fields32(ENC_INCD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCD_Z_ZS_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=01|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470C000) {\n\t\tdecode_fields32(ENC_INCH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCH_Z_ZS_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=10|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0C000) {\n\t\tdecode_fields32(ENC_INCW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tOK(ENC_INCW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* incp_r_p_r.xml */\nint incp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1011|op=0|D=0|10001|opc2=00|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252C8800) {\n\t\tdecode_fields32(ENC_INCP_R_P_R_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tOK(ENC_INCP_R_P_R_);\n\t}\n\treturn rc;\n}\n\n/* incp_z_p_z.xml */\nint incp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1011|op=0|D=0|10000|opc2=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252C8000) {\n\t\tdecode_fields32(ENC_INCP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_INCP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* index_z_ii.xml */\nint index_z_ii(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|imm5b=xxxxx|010000|imm5=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4204000) {\n\t\tdecode_fields32(ENC_INDEX_Z_II_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm1 = SInt(ctx->imm5,5);\n\t\tctx->imm2 = SInt(ctx->imm5b,5);\n\t\tOK(ENC_INDEX_Z_II_);\n\t}\n\treturn rc;\n}\n\n/* index_z_ir.xml */\nint index_z_ir(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Rm=xxxxx|010010|imm5=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4204800) {\n\t\tdecode_fields32(ENC_INDEX_Z_IR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tOK(ENC_INDEX_Z_IR_);\n\t}\n\treturn rc;\n}\n\n/* index_z_ri.xml */\nint index_z_ri(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|imm5=xxxxx|010001|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4204400) {\n\t\tdecode_fields32(ENC_INDEX_Z_RI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->imm = SInt(ctx->imm5,5);\n\t\tOK(ENC_INDEX_Z_RI_);\n\t}\n\treturn rc;\n}\n\n/* index_z_rr.xml */\nint index_z_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Rm=xxxxx|010011|Rn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4204C00) {\n\t\tdecode_fields32(ENC_INDEX_Z_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_INDEX_Z_RR_);\n\t}\n\treturn rc;\n}\n\n/* insr_z_r.xml */\nint insr_z_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|100100001110|Rm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5243800) {\n\t\tdecode_fields32(ENC_INSR_Z_R_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tOK(ENC_INSR_Z_R_);\n\t}\n\treturn rc;\n}\n\n/* insr_z_v.xml */\nint insr_z_v(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|110100001110|Vm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5343800) {\n\t\tdecode_fields32(ENC_INSR_Z_V_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Vm);\n\t\tOK(ENC_INSR_Z_V_);\n\t}\n\treturn rc;\n}\n\n/* lasta_r_p_z.xml */\nint lasta_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10000|B=0|101|Pg=xxx|Zn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x520A000) {\n\t\tdecode_fields32(ENC_LASTA_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (ctx->esize<0x40) ? 0x20 : 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->isBefore = FALSE;\n\t\tOK(ENC_LASTA_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* lasta_v_p_z.xml */\nint lasta_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10001|B=0|100|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5228000) {\n\t\tdecode_fields32(ENC_LASTA_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->isBefore = FALSE;\n\t\tOK(ENC_LASTA_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* lastb_r_p_z.xml */\nint lastb_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10000|B=1|101|Pg=xxx|Zn=xxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x521A000) {\n\t\tdecode_fields32(ENC_LASTB_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (ctx->esize<0x40) ? 0x20 : 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->isBefore = TRUE;\n\t\tOK(ENC_LASTB_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* lastb_v_p_z.xml */\nint lastb_v_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|10001|B=1|100|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5238000) {\n\t\tdecode_fields32(ENC_LASTB_V_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->isBefore = TRUE;\n\t\tOK(ENC_LASTB_V_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* ld1b_z_p_ai.xml */\nint ld1b_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=00|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8420C000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1B_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=00|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC420C000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1B_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1b_z_p_bi.xml */\nint ld1b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_8_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA400A000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BI_U8, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1B_Z_P_BI_U8);\n\t}\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA420A000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1B_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA440A000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1B_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA460A000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1B_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1b_z_p_br.xml */\nint ld1b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_8_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4004000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BR_U8, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1B_Z_P_BR_U8);\n\t}\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4204000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BR_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1B_Z_P_BR_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4404000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1B_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4604000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1B_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1b_z_p_bz.xml */\nint ld1b_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4004000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1B_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84004000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1B_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC440C000) {\n\t\tdecode_fields32(ENC_LD1B_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1B_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1b_za_p_rrr.xml */\nint ld1b_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=00|0|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFE00010)==0xE0000000) {\n\t\tdecode_fields32(ENC_LD1B_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = 0;\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tctx->esize = 8;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_LD1B_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* ld1d_z_p_ai.xml */\nint ld1d_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1100010|msz=11|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5A0C000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1D_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1d_z_p_bi.xml */\nint ld1d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5E0A000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1D_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1d_z_p_br.xml */\nint ld1d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5E04000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1D_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1d_z_p_bz.xml */\nint ld1d_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=11|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5A04000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 3;\n\t\tOK(ENC_LD1D_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=11|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5804000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1D_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=11|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5E0C000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 3;\n\t\tOK(ENC_LD1D_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=11|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5C0C000) {\n\t\tdecode_fields32(ENC_LD1D_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1D_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1d_za_p_rrr.xml */\nint ld1d_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=11|0|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xxx|i1=x */\n\tif((INSWORD & 0xFFE00010)==0xE0C00000) {\n\t\tdecode_fields32(ENC_LD1D_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->i1);\n\t\tctx->esize = 0x40;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_LD1D_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* ld1h_z_p_ai.xml */\nint ld1h_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=01|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84A0C000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1H_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=01|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4A0C000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1H_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1h_z_p_bi.xml */\nint ld1h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4A0A000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1H_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4C0A000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1H_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4E0A000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1H_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1h_z_p_br.xml */\nint ld1h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4A04000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BR_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1H_Z_P_BR_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4C04000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1H_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4E04000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1H_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1h_z_p_bz.xml */\nint ld1h_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001001|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84A04000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1H_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4A04000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1H_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4804000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1H_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84804000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1H_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=01|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4E0C000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1H_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4C0C000) {\n\t\tdecode_fields32(ENC_LD1H_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1H_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1h_za_p_rrr.xml */\nint ld1h_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=01|0|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=x|imm3=xxx */\n\tif((INSWORD & 0xFFE00010)==0xE0400000) {\n\t\tdecode_fields32(ENC_LD1H_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->imm3);\n\t\tctx->esize = 0x10;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_LD1H_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* ld1q_za_p_rrr.xml */\nint ld1q_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100001110|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xxxx */\n\tif((INSWORD & 0xFFE00010)==0xE1C00000) {\n\t\tdecode_fields32(ENC_LD1Q_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = 0;\n\t\tctx->esize = 0x80;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_LD1Q_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* ld1rb_z_p_bi.xml */\nint ld1rb_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_8_elem */\n\t/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x84408000) {\n\t\tdecode_fields32(ENC_LD1RB_Z_P_BI_U8, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RB_Z_P_BI_U8);\n\t}\n\t/* class iclass_16_elem */\n\t/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8440A000) {\n\t\tdecode_fields32(ENC_LD1RB_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RB_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8440C000) {\n\t\tdecode_fields32(ENC_LD1RB_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RB_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8440E000) {\n\t\tdecode_fields32(ENC_LD1RB_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RB_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1rd_z_p_bi.xml */\nint ld1rd_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85C0E000) {\n\t\tdecode_fields32(ENC_LD1RD_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RD_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1rh_z_p_bi.xml */\nint ld1rh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x84C0A000) {\n\t\tdecode_fields32(ENC_LD1RH_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RH_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x84C0C000) {\n\t\tdecode_fields32(ENC_LD1RH_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RH_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x84C0E000) {\n\t\tdecode_fields32(ENC_LD1RH_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RH_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1rob_z_p_bi.xml */\nint ld1rob_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4202000) {\n\t\tdecode_fields32(ENC_LD1ROB_Z_P_BI_U8, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1ROB_Z_P_BI_U8);\n\t}\n\treturn rc;\n}\n\n/* ld1rob_z_p_br.xml */\nint ld1rob_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4200000) {\n\t\tdecode_fields32(ENC_LD1ROB_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tOK(ENC_LD1ROB_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rod_z_p_bi.xml */\nint ld1rod_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5A02000) {\n\t\tdecode_fields32(ENC_LD1ROD_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1ROD_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1rod_z_p_br.xml */\nint ld1rod_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5A00000) {\n\t\tdecode_fields32(ENC_LD1ROD_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tOK(ENC_LD1ROD_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1roh_z_p_bi.xml */\nint ld1roh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4A02000) {\n\t\tdecode_fields32(ENC_LD1ROH_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1ROH_Z_P_BI_U16);\n\t}\n\treturn rc;\n}\n\n/* ld1roh_z_p_br.xml */\nint ld1roh_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4A00000) {\n\t\tdecode_fields32(ENC_LD1ROH_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tOK(ENC_LD1ROH_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1row_z_p_bi.xml */\nint ld1row_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5202000) {\n\t\tdecode_fields32(ENC_LD1ROW_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1ROW_Z_P_BI_U32);\n\t}\n\treturn rc;\n}\n\n/* ld1row_z_p_br.xml */\nint ld1row_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5200000) {\n\t\tdecode_fields32(ENC_LD1ROW_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tOK(ENC_LD1ROW_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rqb_z_p_bi.xml */\nint ld1rqb_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4002000) {\n\t\tdecode_fields32(ENC_LD1RQB_Z_P_BI_U8, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1RQB_Z_P_BI_U8);\n\t}\n\treturn rc;\n}\n\n/* ld1rqb_z_p_br.xml */\nint ld1rqb_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4000000) {\n\t\tdecode_fields32(ENC_LD1RQB_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tOK(ENC_LD1RQB_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rqd_z_p_bi.xml */\nint ld1rqd_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5802000) {\n\t\tdecode_fields32(ENC_LD1RQD_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1RQD_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1rqd_z_p_br.xml */\nint ld1rqd_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5800000) {\n\t\tdecode_fields32(ENC_LD1RQD_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tOK(ENC_LD1RQD_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rqh_z_p_bi.xml */\nint ld1rqh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4802000) {\n\t\tdecode_fields32(ENC_LD1RQH_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1RQH_Z_P_BI_U16);\n\t}\n\treturn rc;\n}\n\n/* ld1rqh_z_p_br.xml */\nint ld1rqh_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4800000) {\n\t\tdecode_fields32(ENC_LD1RQH_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tOK(ENC_LD1RQH_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rqw_z_p_bi.xml */\nint ld1rqw_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5002000) {\n\t\tdecode_fields32(ENC_LD1RQW_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1RQW_Z_P_BI_U32);\n\t}\n\treturn rc;\n}\n\n/* ld1rqw_z_p_br.xml */\nint ld1rqw_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5000000) {\n\t\tdecode_fields32(ENC_LD1RQW_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tOK(ENC_LD1RQW_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld1rsb_z_p_bi.xml */\nint ld1rsb_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85C0C000) {\n\t\tdecode_fields32(ENC_LD1RSB_Z_P_BI_S16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSB_Z_P_BI_S16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85C0A000) {\n\t\tdecode_fields32(ENC_LD1RSB_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSB_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85C08000) {\n\t\tdecode_fields32(ENC_LD1RSB_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSB_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1rsh_z_p_bi.xml */\nint ld1rsh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8540A000) {\n\t\tdecode_fields32(ENC_LD1RSH_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSH_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85408000) {\n\t\tdecode_fields32(ENC_LD1RSH_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSH_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1rsw_z_p_bi.xml */\nint ld1rsw_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x84C08000) {\n\t\tdecode_fields32(ENC_LD1RSW_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RSW_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1rw_z_p_bi.xml */\nint ld1rw_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8540C000) {\n\t\tdecode_fields32(ENC_LD1RW_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RW_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x8540E000) {\n\t\tdecode_fields32(ENC_LD1RW_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm6);\n\t\tOK(ENC_LD1RW_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1sb_z_p_ai.xml */\nint ld1sb_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=00|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84208000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1SB_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=00|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4208000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1SB_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1sb_z_p_bi.xml */\nint ld1sb_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5C0A000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BI_S16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SB_Z_P_BI_S16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5A0A000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SB_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA580A000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SB_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sb_z_p_br.xml */\nint ld1sb_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5C04000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BR_S16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SB_Z_P_BR_S16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5A04000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BR_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SB_Z_P_BR_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5804000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SB_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sb_z_p_bz.xml */\nint ld1sb_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4000000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84000000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4408000) {\n\t\tdecode_fields32(ENC_LD1SB_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SB_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1sh_z_p_ai.xml */\nint ld1sh_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=01|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84A08000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1SH_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=01|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4A08000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1SH_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1sh_z_p_bi.xml */\nint ld1sh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA520A000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SH_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA500A000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SH_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sh_z_p_br.xml */\nint ld1sh_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5204000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BR_S32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SH_Z_P_BR_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5004000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SH_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sh_z_p_bz.xml */\nint ld1sh_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001001|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84A00000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1SH_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4A00000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1SH_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4800000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84800000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=01|11|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4E08000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LD1SH_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4C08000) {\n\t\tdecode_fields32(ENC_LD1SH_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SH_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1sw_z_p_ai.xml */\nint ld1sw_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1100010|msz=10|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5208000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1SW_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1sw_z_p_bi.xml */\nint ld1sw_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA480A000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1SW_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sw_z_p_br.xml */\nint ld1sw_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4804000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LD1SW_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ld1sw_z_p_bz.xml */\nint ld1sw_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5200000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LD1SW_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5000000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=10|11|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5608000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LD1SW_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=10|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5408000) {\n\t\tdecode_fields32(ENC_LD1SW_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1SW_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1w_z_p_ai.xml */\nint ld1w_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=10|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8520C000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1W_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=10|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC520C000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LD1W_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ld1w_z_p_bi.xml */\nint ld1w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA540A000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1W_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA560A000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LD1W_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1w_z_p_br.xml */\nint ld1w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5404000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1W_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5604000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LD1W_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ld1w_z_p_bz.xml */\nint ld1w_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001010|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x85204000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LD1W_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5204000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LD1W_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5004000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1W_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=10|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x85004000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1W_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=10|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC560C000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LD1W_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=10|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC540C000) {\n\t\tdecode_fields32(ENC_LD1W_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LD1W_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ld1w_za_p_rrr.xml */\nint ld1w_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=10|0|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xx|imm2=xx */\n\tif((INSWORD & 0xFFE00010)==0xE0800000) {\n\t\tdecode_fields32(ENC_LD1W_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->imm2);\n\t\tctx->esize = 0x20;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_LD1W_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* ld2b_z_p_bi.xml */\nint ld2b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA420E000) {\n\t\tdecode_fields32(ENC_LD2B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2b_z_p_br.xml */\nint ld2b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA420C000) {\n\t\tdecode_fields32(ENC_LD2B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2d_z_p_bi.xml */\nint ld2d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5A0E000) {\n\t\tdecode_fields32(ENC_LD2D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2d_z_p_br.xml */\nint ld2d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5A0C000) {\n\t\tdecode_fields32(ENC_LD2D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2h_z_p_bi.xml */\nint ld2h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4A0E000) {\n\t\tdecode_fields32(ENC_LD2H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2h_z_p_br.xml */\nint ld2h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4A0C000) {\n\t\tdecode_fields32(ENC_LD2H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2w_z_p_bi.xml */\nint ld2w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA520E000) {\n\t\tdecode_fields32(ENC_LD2W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld2w_z_p_br.xml */\nint ld2w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA520C000) {\n\t\tdecode_fields32(ENC_LD2W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_LD2W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3b_z_p_bi.xml */\nint ld3b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA440E000) {\n\t\tdecode_fields32(ENC_LD3B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3b_z_p_br.xml */\nint ld3b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA440C000) {\n\t\tdecode_fields32(ENC_LD3B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3d_z_p_bi.xml */\nint ld3d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5C0E000) {\n\t\tdecode_fields32(ENC_LD3D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3d_z_p_br.xml */\nint ld3d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5C0C000) {\n\t\tdecode_fields32(ENC_LD3D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3h_z_p_bi.xml */\nint ld3h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4C0E000) {\n\t\tdecode_fields32(ENC_LD3H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3h_z_p_br.xml */\nint ld3h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4C0C000) {\n\t\tdecode_fields32(ENC_LD3H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3w_z_p_bi.xml */\nint ld3w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA540E000) {\n\t\tdecode_fields32(ENC_LD3W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld3w_z_p_br.xml */\nint ld3w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA540C000) {\n\t\tdecode_fields32(ENC_LD3W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_LD3W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4b_z_p_bi.xml */\nint ld4b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA460E000) {\n\t\tdecode_fields32(ENC_LD4B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4b_z_p_br.xml */\nint ld4b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA460C000) {\n\t\tdecode_fields32(ENC_LD4B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4d_z_p_bi.xml */\nint ld4d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5E0E000) {\n\t\tdecode_fields32(ENC_LD4D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4d_z_p_br.xml */\nint ld4d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5E0C000) {\n\t\tdecode_fields32(ENC_LD4D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4h_z_p_bi.xml */\nint ld4h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4E0E000) {\n\t\tdecode_fields32(ENC_LD4H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4h_z_p_br.xml */\nint ld4h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4E0C000) {\n\t\tdecode_fields32(ENC_LD4H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4w_z_p_bi.xml */\nint ld4w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA560E000) {\n\t\tdecode_fields32(ENC_LD4W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ld4w_z_p_br.xml */\nint ld4w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA560C000) {\n\t\tdecode_fields32(ENC_LD4W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_LD4W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldff1b_z_p_ai.xml */\nint ldff1b_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=00|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8420E000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1B_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=00|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC420E000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1B_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1b_z_p_br.xml */\nint ldff1b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_8_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4006000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BR_U8, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1B_Z_P_BR_U8);\n\t}\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4206000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BR_U16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1B_Z_P_BR_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4406000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1B_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4606000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1B_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ldff1b_z_p_bz.xml */\nint ldff1b_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4006000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84006000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC440E000) {\n\t\tdecode_fields32(ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1d_z_p_ai.xml */\nint ldff1d_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1100010|msz=11|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5A0E000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1D_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1d_z_p_br.xml */\nint ldff1d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5E06000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1D_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ldff1d_z_p_bz.xml */\nint ldff1d_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=11|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5A06000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 3;\n\t\tOK(ENC_LDFF1D_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=11|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5806000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=11|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5E0E000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 3;\n\t\tOK(ENC_LDFF1D_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=11|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5C0E000) {\n\t\tdecode_fields32(ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1h_z_p_ai.xml */\nint ldff1h_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=01|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84A0E000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1H_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=01|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4A0E000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1H_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1h_z_p_br.xml */\nint ldff1h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4A06000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BR_U16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1H_Z_P_BR_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4C06000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1H_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4E06000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1H_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ldff1h_z_p_bz.xml */\nint ldff1h_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001001|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84A06000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4A06000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4806000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84806000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=01|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4E0E000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4C0E000) {\n\t\tdecode_fields32(ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1sb_z_p_ai.xml */\nint ldff1sb_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=00|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8420A000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1SB_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=00|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC420A000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1SB_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1sb_z_p_br.xml */\nint ldff1sb_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5C06000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BR_S16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SB_Z_P_BR_S16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5A06000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BR_S32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SB_Z_P_BR_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5806000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SB_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ldff1sb_z_p_bz.xml */\nint ldff1sb_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4002000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84002000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC440A000) {\n\t\tdecode_fields32(ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1sh_z_p_ai.xml */\nint ldff1sh_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=01|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84A0A000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1SH_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=01|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4A0A000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1SH_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1sh_z_p_br.xml */\nint ldff1sh_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5206000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BR_S32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SH_Z_P_BR_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5006000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SH_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ldff1sh_z_p_bz.xml */\nint ldff1sh_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001001|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84A02000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4A02000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC4802000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x84802000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=01|11|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4E0A000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4C0A000) {\n\t\tdecode_fields32(ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1sw_z_p_ai.xml */\nint ldff1sw_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1100010|msz=10|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC520A000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1SW_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1sw_z_p_br.xml */\nint ldff1sw_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA4806000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_BR_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDFF1SW_Z_P_BR_S64);\n\t}\n\treturn rc;\n}\n\n/* ldff1sw_z_p_bz.xml */\nint ldff1sw_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5202000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5002000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=10|11|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC560A000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LDFF1SW_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=10|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC540A000) {\n\t\tdecode_fields32(ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldff1w_z_p_ai.xml */\nint ldff1w_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=10|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8520E000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1W_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=10|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC520E000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_LDFF1W_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* ldff1w_z_p_br.xml */\nint ldff1w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5406000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BR_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1W_Z_P_BR_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA5606000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BR_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDFF1W_Z_P_BR_U64);\n\t}\n\treturn rc;\n}\n\n/* ldff1w_z_p_bz.xml */\nint ldff1w_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001010|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x85206000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5206000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0xC5006000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|opc=10|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFA0E000)==0x85006000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1100010|opc=10|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC560E000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=10|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC540E000) {\n\t\tdecode_fields32(ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnf1b_z_p_bi.xml */\nint ldnf1b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_8_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA410A000) {\n\t\tdecode_fields32(ENC_LDNF1B_Z_P_BI_U8, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1B_Z_P_BI_U8);\n\t}\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=000|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA430A000) {\n\t\tdecode_fields32(ENC_LDNF1B_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1B_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA450A000) {\n\t\tdecode_fields32(ENC_LDNF1B_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1B_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=001|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA470A000) {\n\t\tdecode_fields32(ENC_LDNF1B_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1B_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1d_z_p_bi.xml */\nint ldnf1d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5F0A000) {\n\t\tdecode_fields32(ENC_LDNF1D_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1D_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1h_z_p_bi.xml */\nint ldnf1h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4B0A000) {\n\t\tdecode_fields32(ENC_LDNF1H_Z_P_BI_U16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1H_Z_P_BI_U16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4D0A000) {\n\t\tdecode_fields32(ENC_LDNF1H_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1H_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=011|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA4F0A000) {\n\t\tdecode_fields32(ENC_LDNF1H_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1H_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1sb_z_p_bi.xml */\nint ldnf1sb_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_elem */\n\t/* 1010010|dtype<3:1>=111|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5D0A000) {\n\t\tdecode_fields32(ENC_LDNF1SB_Z_P_BI_S16, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SB_Z_P_BI_S16);\n\t}\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA5B0A000) {\n\t\tdecode_fields32(ENC_LDNF1SB_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SB_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=110|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA590A000) {\n\t\tdecode_fields32(ENC_LDNF1SB_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SB_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1sh_z_p_bi.xml */\nint ldnf1sh_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA530A000) {\n\t\tdecode_fields32(ENC_LDNF1SH_Z_P_BI_S32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SH_Z_P_BI_S32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=100|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA510A000) {\n\t\tdecode_fields32(ENC_LDNF1SH_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SH_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1sw_z_p_bi.xml */\nint ldnf1sw_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|dtype<3:1>=010|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA490A000) {\n\t\tdecode_fields32(ENC_LDNF1SW_Z_P_BI_S64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1SW_Z_P_BI_S64);\n\t}\n\treturn rc;\n}\n\n/* ldnf1w_z_p_bi.xml */\nint ldnf1w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA550A000) {\n\t\tdecode_fields32(ENC_LDNF1W_Z_P_BI_U32, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1W_Z_P_BI_U32);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1010010|dtype<3:1>=101|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA570A000) {\n\t\tdecode_fields32(ENC_LDNF1W_Z_P_BI_U64, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNF1W_Z_P_BI_U64);\n\t}\n\treturn rc;\n}\n\n/* ldnt1b_z_p_ar.xml */\nint ldnt1b_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|msz=00|00|Rm=xxxxx|10|U=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8400A000) {\n\t\tdecode_fields32(ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|00|Rm=xxxxx|1|U=1|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC400C000) {\n\t\tdecode_fields32(ENC_LDNT1B_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1B_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1b_z_p_bi.xml */\nint ldnt1b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA400E000) {\n\t\tdecode_fields32(ENC_LDNT1B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNT1B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1b_z_p_br.xml */\nint ldnt1b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=00|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA400C000) {\n\t\tdecode_fields32(ENC_LDNT1B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tOK(ENC_LDNT1B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1d_z_p_ar.xml */\nint ldnt1d_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 1100010|msz=11|00|Rm=xxxxx|1|U=1|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC580C000) {\n\t\tdecode_fields32(ENC_LDNT1D_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1D_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1d_z_p_bi.xml */\nint ldnt1d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA580E000) {\n\t\tdecode_fields32(ENC_LDNT1D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNT1D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1d_z_p_br.xml */\nint ldnt1d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=11|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA580C000) {\n\t\tdecode_fields32(ENC_LDNT1D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tOK(ENC_LDNT1D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1h_z_p_ar.xml */\nint ldnt1h_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|msz=01|00|Rm=xxxxx|10|U=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8480A000) {\n\t\tdecode_fields32(ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|00|Rm=xxxxx|1|U=1|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC480C000) {\n\t\tdecode_fields32(ENC_LDNT1H_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1H_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1h_z_p_bi.xml */\nint ldnt1h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA480E000) {\n\t\tdecode_fields32(ENC_LDNT1H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNT1H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1h_z_p_br.xml */\nint ldnt1h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=01|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA480C000) {\n\t\tdecode_fields32(ENC_LDNT1H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tOK(ENC_LDNT1H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1sb_z_p_ar.xml */\nint ldnt1sb_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|msz=00|00|Rm=xxxxx|10|U=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84008000) {\n\t\tdecode_fields32(ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=00|00|Rm=xxxxx|1|U=0|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4008000) {\n\t\tdecode_fields32(ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1sh_z_p_ar.xml */\nint ldnt1sh_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|msz=01|00|Rm=xxxxx|10|U=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x84808000) {\n\t\tdecode_fields32(ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=01|00|Rm=xxxxx|1|U=0|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC4808000) {\n\t\tdecode_fields32(ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1sw_z_p_ar.xml */\nint ldnt1sw_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 1100010|msz=10|00|Rm=xxxxx|1|U=0|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC5008000) {\n\t\tdecode_fields32(ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1w_z_p_ar.xml */\nint ldnt1w_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1000010|msz=10|00|Rm=xxxxx|10|U=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0x8500A000) {\n\t\tdecode_fields32(ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1100010|msz=10|00|Rm=xxxxx|1|U=1|0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xC500C000) {\n\t\tdecode_fields32(ENC_LDNT1W_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_LDNT1W_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* ldnt1w_z_p_bi.xml */\nint ldnt1w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xA500E000) {\n\t\tdecode_fields32(ENC_LDNT1W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_LDNT1W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldnt1w_z_p_br.xml */\nint ldnt1w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1010010|msz=10|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xA500C000) {\n\t\tdecode_fields32(ENC_LDNT1W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tOK(ENC_LDNT1W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* ldr_p_bi.xml */\nint ldr_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010110|imm9h=xxxxxx|000|imm9l=xxx|Rn=xxxxx|0|Pt=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0x85800000) {\n\t\tdecode_fields32(ENC_LDR_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Pt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->imm = SInt(((ctx->imm9h<<3)|ctx->imm9l),9);\n\t\tOK(ENC_LDR_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* ldr_z_bi.xml */\nint ldr_z_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010110|imm9h=xxxxxx|010|imm9l=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0x85804000) {\n\t\tdecode_fields32(ENC_LDR_Z_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->imm = SInt(((ctx->imm9h<<3)|ctx->imm9l),9);\n\t\tOK(ENC_LDR_Z_BI_);\n\t}\n\treturn rc;\n}\n\n/* ldr_za_ri.xml */\nint ldr_za_ri(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 1110000100|op=0|000000|Rv=xx|000|Rn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFFF9C10)==0xE1000000) {\n\t\tdecode_fields32(ENC_LDR_ZA_RI_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->v = UINT(((3<<2)|ctx->Rv));\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tOK(ENC_LDR_ZA_RI_);\n\t}\n\treturn rc;\n}\n\n/* lsl_z_p_zi.xml */\nint lsl_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|00|opc=00|L=1|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4038000) {\n\t\tdecode_fields32(ENC_LSL_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_LSL_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* lsl_z_p_zw.xml */\nint lsl_z_p_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|R=0|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41B8000) {\n\t\tdecode_fields32(ENC_LSL_Z_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSL_Z_P_ZW_);\n\t}\n\treturn rc;\n}\n\n/* lsl_z_p_zz.xml */\nint lsl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=0|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4138000) {\n\t\tdecode_fields32(ENC_LSL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* lsl_z_zi.xml */\nint lsl_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|opc=11|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4209C00) {\n\t\tdecode_fields32(ENC_LSL_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_LSL_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* lsl_z_zw.xml */\nint lsl_z_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|1000|opc=11|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4208C00) {\n\t\tdecode_fields32(ENC_LSL_Z_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_LSL_Z_ZW_);\n\t}\n\treturn rc;\n}\n\n/* lslr_z_p_zz.xml */\nint lslr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=1|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4178000) {\n\t\tdecode_fields32(ENC_LSLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* lsr_z_p_zi.xml */\nint lsr_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|00|opc=00|L=0|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4018000) {\n\t\tdecode_fields32(ENC_LSR_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_LSR_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* lsr_z_p_zw.xml */\nint lsr_z_p_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|R=0|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4198000) {\n\t\tdecode_fields32(ENC_LSR_Z_P_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSR_Z_P_ZW_);\n\t}\n\treturn rc;\n}\n\n/* lsr_z_p_zz.xml */\nint lsr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=0|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4118000) {\n\t\tdecode_fields32(ENC_LSR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* lsr_z_zi.xml */\nint lsr_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|0|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4209400) {\n\t\tdecode_fields32(ENC_LSR_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_LSR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* lsr_z_zw.xml */\nint lsr_z_zw(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|1000|0|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4208400) {\n\t\tdecode_fields32(ENC_LSR_Z_ZW_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_LSR_Z_ZW_);\n\t}\n\treturn rc;\n}\n\n/* lsrr_z_p_zz.xml */\nint lsrr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|R=1|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4158000) {\n\t\tdecode_fields32(ENC_LSRR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_LSRR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mad_z_p_zzz.xml */\nint mad_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0|Zm=xxxxx|11|op=0|Pg=xxx|Za=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x400C000) {\n\t\tdecode_fields32(ENC_MAD_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_MAD_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* match_p_p_zz.xml */\nint match_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|100|Pg=xxx|Zn=xxxxx|op=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x45208000) {\n\t\tdecode_fields32(ENC_MATCH_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_MATCH_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mla_z_p_zzz.xml */\nint mla_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0|Zm=xxxxx|01|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x4004000) {\n\t\tdecode_fields32(ENC_MLA_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sub_op = FALSE;\n\t\tOK(ENC_MLA_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* mla_z_zzzi.xml */\nint mla_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|00001|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x44200800) {\n\t\tdecode_fields32(ENC_MLA_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLA_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00001|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A00800) {\n\t\tdecode_fields32(ENC_MLA_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLA_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00001|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E00800) {\n\t\tdecode_fields32(ENC_MLA_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLA_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* mls_z_p_zzz.xml */\nint mls_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0|Zm=xxxxx|01|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x4006000) {\n\t\tdecode_fields32(ENC_MLS_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_MLS_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* mls_z_zzzi.xml */\nint mls_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|00001|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x44200C00) {\n\t\tdecode_fields32(ENC_MLS_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLS_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00001|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A00C00) {\n\t\tdecode_fields32(ENC_MLS_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLS_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00001|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E00C00) {\n\t\tdecode_fields32(ENC_MLS_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_MLS_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* mova_z_p_rza.xml */\nint mova_z_p_rza(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_byte */\n\t/* 11000000|size=00|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|imm4=xxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0020000) {\n\t\tdecode_fields32(ENC_MOVA_Z_P_RZA_B, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = 0;\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tctx->esize = 8;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_z_p_rza(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_Z_P_RZA_B);\n\t}\n\t/* class iclass_per_halfword */\n\t/* 11000000|size=01|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=x|imm3=xxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0420000) {\n\t\tdecode_fields32(ENC_MOVA_Z_P_RZA_H, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->ZAn);\n\t\tctx->imm = UINT(ctx->imm3);\n\t\tctx->esize = 0x10;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_z_p_rza(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_Z_P_RZA_H);\n\t}\n\t/* class iclass_per_word */\n\t/* 11000000|size=10|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=xx|imm2=xx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0820000) {\n\t\tdecode_fields32(ENC_MOVA_Z_P_RZA_W, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->ZAn);\n\t\tctx->imm = UINT(ctx->imm2);\n\t\tctx->esize = 0x20;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_z_p_rza(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_Z_P_RZA_W);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11000000|size=11|00001|Q=0|V=x|Rs=xx|Pg=xxx|0|ZAn=xxx|i1=x|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0C20000) {\n\t\tdecode_fields32(ENC_MOVA_Z_P_RZA_D, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->ZAn);\n\t\tctx->imm = UINT(ctx->i1);\n\t\tctx->esize = 0x40;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_z_p_rza(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_Z_P_RZA_D);\n\t}\n\t/* class iclass_per_quadword */\n\t/* 11000000|size=11|00001|Q=1|V=x|Rs=xx|Pg=xxx|0|ZAn=xxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFF0200)==0xC0C30000) {\n\t\tdecode_fields32(ENC_MOVA_Z_P_RZA_Q, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->ZAn);\n\t\tctx->imm = 0;\n\t\tctx->esize = 0x80;\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_z_p_rza(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_Z_P_RZA_Q);\n\t}\n\treturn rc;\n}\n\n/* mova_za_p_rz.xml */\nint mova_za_p_rz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_byte */\n\t/* 11000000|size=00|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0000000) {\n\t\tdecode_fields32(ENC_MOVA_ZA_P_RZ_B, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = 0;\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tctx->esize = 8;\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_za_p_rz(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_ZA_P_RZ_B);\n\t}\n\t/* class iclass_per_halfword */\n\t/* 11000000|size=01|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=x|imm3=xxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0400000) {\n\t\tdecode_fields32(ENC_MOVA_ZA_P_RZ_H, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->ZAd);\n\t\tctx->imm = UINT(ctx->imm3);\n\t\tctx->esize = 0x10;\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_za_p_rz(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_ZA_P_RZ_H);\n\t}\n\t/* class iclass_per_word */\n\t/* 11000000|size=10|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xx|imm2=xx */\n\tif((INSWORD & 0xFFFF0010)==0xC0800000) {\n\t\tdecode_fields32(ENC_MOVA_ZA_P_RZ_W, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->ZAd);\n\t\tctx->imm = UINT(ctx->imm2);\n\t\tctx->esize = 0x20;\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_za_p_rz(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_ZA_P_RZ_W);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 11000000|size=11|00000|Q=0|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xxx|i1=x */\n\tif((INSWORD & 0xFFFF0010)==0xC0C00000) {\n\t\tdecode_fields32(ENC_MOVA_ZA_P_RZ_D, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->ZAd);\n\t\tctx->imm = UINT(ctx->i1);\n\t\tctx->esize = 0x40;\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_za_p_rz(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_ZA_P_RZ_D);\n\t}\n\t/* class iclass_per_quadword */\n\t/* 11000000|size=11|00000|Q=1|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|0|ZAd=xxxx */\n\tif((INSWORD & 0xFFFF0010)==0xC0C10000) {\n\t\tdecode_fields32(ENC_MOVA_ZA_P_RZ_Q, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->ZAd);\n\t\tctx->imm = 0;\n\t\tctx->esize = 0x80;\n\t\tctx->vertical = ctx->V==1;\n\t\t/* unconditional alias */\n\t\tif(MOV_mova_za_p_rz(ctx, instr)==0) return 0;\n\t\tOK(ENC_MOVA_ZA_P_RZ_Q);\n\t}\n\treturn rc;\n}\n\n/* movprfx_z_p_z.xml */\nint movprfx_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|opc=00|M=x|001|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3EE000)==0x4102000) {\n\t\tdecode_fields32(ENC_MOVPRFX_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->merging = (ctx->M==1);\n\t\tOK(ENC_MOVPRFX_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* movprfx_z_z.xml */\nint movprfx_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=00|1|opc2<4:1>=0000|opc2<0>=0|101111|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x420BC00) {\n\t\tdecode_fields32(ENC_MOVPRFX_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_MOVPRFX_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* msb_z_p_zzz.xml */\nint msb_z_p_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0|Zm=xxxxx|11|op=1|Pg=xxx|Za=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20E000)==0x400E000) {\n\t\tdecode_fields32(ENC_MSB_Z_P_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->a = UINT(ctx->Za);\n\t\tctx->sub_op = TRUE;\n\t\tOK(ENC_MSB_Z_P_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* mul_z_p_zz.xml */\nint mul_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0100|H=0|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4100000) {\n\t\tdecode_fields32(ENC_MUL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_MUL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mul_z_zi.xml */\nint mul_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|110|opc<2:1>=00|opc<0>=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x2530C000) {\n\t\tdecode_fields32(ENC_MUL_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = SInt(ctx->imm8,8);\n\t\tOK(ENC_MUL_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* mul_z_zz.xml */\nint mul_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=xx|1|Zm=xxxxx|0110|opc=00|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4206000) {\n\t\tdecode_fields32(ENC_MUL_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_MUL_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* mul_z_zzi.xml */\nint mul_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|111110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4420F800) {\n\t\tdecode_fields32(ENC_MUL_Z_ZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_MUL_Z_ZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|111110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A0F800) {\n\t\tdecode_fields32(ENC_MUL_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_MUL_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|111110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E0F800) {\n\t\tdecode_fields32(ENC_MUL_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_MUL_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* nand_p_p_pp.xml */\nint nand_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25804210) {\n\t\tdecode_fields32(ENC_NAND_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_NAND_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* nands_p_p_pp.xml */\nint nands_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25C04210) {\n\t\tdecode_fields32(ENC_NANDS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_NANDS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* nbsl_z_zzz.xml */\nint nbsl_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|opc=11|1|Zm=xxxxx|00111|o2=1|Zk=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4E03C00) {\n\t\tdecode_fields32(ENC_NBSL_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->k = UINT(ctx->Zk);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_NBSL_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* neg_z_p_z.xml */\nint neg_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|010|opc<2:1>=11|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x417A000) {\n\t\tdecode_fields32(ENC_NEG_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_NEG_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* nmatch_p_p_zz.xml */\nint nmatch_p_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|100|Pg=xxx|Zn=xxxxx|op=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20E010)==0x45208010) {\n\t\tdecode_fields32(ENC_NMATCH_P_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_NMATCH_P_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* nor_p_p_pp.xml */\nint nor_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25804200) {\n\t\tdecode_fields32(ENC_NOR_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_NOR_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* nors_p_p_pp.xml */\nint nors_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25C04200) {\n\t\tdecode_fields32(ENC_NORS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_NORS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* not_z_p_z.xml */\nint not_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x41EA000) {\n\t\tdecode_fields32(ENC_NOT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_NOT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* orn_p_p_pp.xml */\nint orn_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25804010) {\n\t\tdecode_fields32(ENC_ORN_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_ORN_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* orns_p_p_pp.xml */\nint orns_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25C04010) {\n\t\tdecode_fields32(ENC_ORNS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_ORNS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* orr_p_p_pp.xml */\nint orr_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25804000) {\n\t\tdecode_fields32(ENC_ORR_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\t/* regular aliases */\n\t\tif(ctx->S==0 && ctx->Pn==ctx->Pm && ctx->Pm==ctx->Pg) return MOV_orr_p_p_pp(ctx, instr);\n\t\tOK(ENC_ORR_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* orr_z_p_zz.xml */\nint orr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4180000) {\n\t\tdecode_fields32(ENC_ORR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_ORR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* orr_z_zi.xml */\nint orr_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|opc=00|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFC0000)==0x5000000) {\n\t\tdecode_fields32(ENC_ORR_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tDecodeBitMasksCheckUndefined(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0));\n\t\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(ctx->imm13,12,12),SLICE(ctx->imm13,5,0),SLICE(ctx->imm13,11,6));\n\t\tctx->imm = dbmrt.wmask;\n\t\tOK(ENC_ORR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* orr_z_zz.xml */\nint orr_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|opc=01|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4603000) {\n\t\tdecode_fields32(ENC_ORR_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* regular aliases */\n\t\tif(ctx->Zn==ctx->Zm) return MOV_orr_z_zz(ctx, instr);\n\t\tOK(ENC_ORR_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* orrs_p_p_pp.xml */\nint orrs_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25C04000) {\n\t\tdecode_fields32(ENC_ORRS_P_P_PP_Z, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\t/* regular aliases */\n\t\tif(ctx->S==1 && ctx->Pn==ctx->Pm && ctx->Pm==ctx->Pg) return MOVS_orrs_p_p_pp(ctx, instr);\n\t\tOK(ENC_ORRS_P_P_PP_Z);\n\t}\n\treturn rc;\n}\n\n/* orv_r_p_z.xml */\nint orv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0110|opc=00|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4182000) {\n\t\tdecode_fields32(ENC_ORV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_ORV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* pfalse_p.xml */\nint pfalse_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|op=0|S=0|011000111001|000000|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFFF0)==0x2518E400) {\n\t\tdecode_fields32(ENC_PFALSE_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Pd);\n\t\tOK(ENC_PFALSE_P_);\n\t}\n\treturn rc;\n}\n\n/* pfirst_p_p_p.xml */\nint pfirst_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|op=0|S=1|011000110000|0|Pg=xxxx|0|Pdn=xxxx */\n\tif((INSWORD & 0xFFFFFE10)==0x2558C000) {\n\t\tdecode_fields32(ENC_PFIRST_P_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Pdn);\n\t\tOK(ENC_PFIRST_P_P_P_);\n\t}\n\treturn rc;\n}\n\n/* pmul_z_zz.xml */\nint pmul_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=00|1|Zm=xxxxx|0110|opc=01|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4206400) {\n\t\tdecode_fields32(ENC_PMUL_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_PMUL_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* pmullb_z_zz.xml */\nint pmullb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=0|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45006800) {\n\t\tdecode_fields32(ENC_PMULLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0 && !HaveSVE2PMULL128()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->size) {\n\t\t\tctx->esize = 0x80;\n\t\t}\n\t\telse if(ctx->size==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->size==3) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_PMULLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* pmullt_z_zz.xml */\nint pmullt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=0|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45006C00) {\n\t\tdecode_fields32(ENC_PMULLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0 && !HaveSVE2PMULL128()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!ctx->size) {\n\t\t\tctx->esize = 0x80;\n\t\t}\n\t\telse if(ctx->size==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->size==2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->size==3) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_PMULLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* pnext_p_p_p.xml */\nint pnext_p_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|011001110001|0|Pg=xxxx|0|Pdn=xxxx */\n\tif((INSWORD & 0xFF3FFE10)==0x2519C400) {\n\t\tdecode_fields32(ENC_PNEXT_P_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Pdn);\n\t\tOK(ENC_PNEXT_P_P_P_);\n\t}\n\treturn rc;\n}\n\n/* prfb_i_p_ai.xml */\nint prfb_i_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=00|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8400E000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 0;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFB_I_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=00|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC400E000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 0;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFB_I_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* prfb_i_p_bi.xml */\nint prfb_i_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010111|imm6=xxxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0x85C00000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_BI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 0;\n\t\tctx->offset = SInt(ctx->imm6,6);\n\t\tOK(ENC_PRFB_I_P_BI_S);\n\t}\n\treturn rc;\n}\n\n/* prfb_i_p_br.xml */\nint prfb_i_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|msz=00|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8400C000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_BR_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 0;\n\t\tOK(ENC_PRFB_I_P_BR_S);\n\t}\n\treturn rc;\n}\n\n/* prfb_i_p_bz.xml */\nint prfb_i_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001000|xs=x|1|Zm=xxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0x84200000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 0;\n\t\tOK(ENC_PRFB_I_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 110001000|xs=x|1|Zm=xxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0xC4200000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 0;\n\t\tOK(ENC_PRFB_I_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 11000100011|Zm=xxxxx|1|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC4608000) {\n\t\tdecode_fields32(ENC_PRFB_I_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_PRFB_I_P_BZ_D_64_SCALED);\n\t}\n\treturn rc;\n}\n\n/* prfd_i_p_ai.xml */\nint prfd_i_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=11|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8580E000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 3;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFD_I_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=11|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC580E000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 3;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFD_I_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* prfd_i_p_bi.xml */\nint prfd_i_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010111|imm6=xxxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0x85C06000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_BI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 3;\n\t\tctx->offset = SInt(ctx->imm6,6);\n\t\tOK(ENC_PRFD_I_P_BI_S);\n\t}\n\treturn rc;\n}\n\n/* prfd_i_p_br.xml */\nint prfd_i_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|msz=11|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8580C000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_BR_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 3;\n\t\tOK(ENC_PRFD_I_P_BR_S);\n\t}\n\treturn rc;\n}\n\n/* prfd_i_p_bz.xml */\nint prfd_i_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001000|xs=x|1|Zm=xxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0x84206000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 3;\n\t\tOK(ENC_PRFD_I_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 110001000|xs=x|1|Zm=xxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0xC4206000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 3;\n\t\tOK(ENC_PRFD_I_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 11000100011|Zm=xxxxx|1|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC460E000) {\n\t\tdecode_fields32(ENC_PRFD_I_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 3;\n\t\tOK(ENC_PRFD_I_P_BZ_D_64_SCALED);\n\t}\n\treturn rc;\n}\n\n/* prfh_i_p_ai.xml */\nint prfh_i_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=01|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8480E000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 1;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFH_I_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=01|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC480E000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 1;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFH_I_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* prfh_i_p_bi.xml */\nint prfh_i_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010111|imm6=xxxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0x85C02000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_BI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 1;\n\t\tctx->offset = SInt(ctx->imm6,6);\n\t\tOK(ENC_PRFH_I_P_BI_S);\n\t}\n\treturn rc;\n}\n\n/* prfh_i_p_br.xml */\nint prfh_i_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|msz=01|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8480C000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_BR_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 1;\n\t\tOK(ENC_PRFH_I_P_BR_S);\n\t}\n\treturn rc;\n}\n\n/* prfh_i_p_bz.xml */\nint prfh_i_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001000|xs=x|1|Zm=xxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0x84202000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 1;\n\t\tOK(ENC_PRFH_I_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 110001000|xs=x|1|Zm=xxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0xC4202000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 1;\n\t\tOK(ENC_PRFH_I_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 11000100011|Zm=xxxxx|1|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC460A000) {\n\t\tdecode_fields32(ENC_PRFH_I_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_PRFH_I_P_BZ_D_64_SCALED);\n\t}\n\treturn rc;\n}\n\n/* prfw_i_p_ai.xml */\nint prfw_i_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1000010|msz=10|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8500E000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 2;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFW_I_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1100010|msz=10|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC500E000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 2;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_PRFW_I_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* prfw_i_p_bi.xml */\nint prfw_i_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010111|imm6=xxxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0x85C04000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_BI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 2;\n\t\tctx->offset = SInt(ctx->imm6,6);\n\t\tOK(ENC_PRFW_I_P_BI_S);\n\t}\n\treturn rc;\n}\n\n/* prfw_i_p_br.xml */\nint prfw_i_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1000010|msz=10|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0x8500C000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_BR_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->scale = 2;\n\t\tOK(ENC_PRFW_I_P_BR_S);\n\t}\n\treturn rc;\n}\n\n/* prfw_i_p_bz.xml */\nint prfw_i_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 100001000|xs=x|1|Zm=xxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0x84204000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 2;\n\t\tOK(ENC_PRFW_I_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 110001000|xs=x|1|Zm=xxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFA0E010)==0xC4204000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = (ctx->xs==0);\n\t\tctx->scale = 2;\n\t\tOK(ENC_PRFW_I_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 11000100011|Zm=xxxxx|1|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */\n\tif((INSWORD & 0xFFE0E010)==0xC460C000) {\n\t\tdecode_fields32(ENC_PRFW_I_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->level = UINT(SLICE(ctx->prfop,2,1));\n\t\tctx->stream = (SLICE(ctx->prfop,0,0)==1);\n\t\tif(SLICE(ctx->prfop,3,3)==0) {\n\t\t\tctx->pref_hint = Prefetch_READ;\n\t\t};\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_PRFW_I_P_BZ_D_64_SCALED);\n\t}\n\treturn rc;\n}\n\n/* ptest_p_p.xml */\nint ptest_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00|100101|op=0|S=1|01|000011|Pg=xxxx|0|Pn=xxxx|0|opc2=0000 */\n\tif((INSWORD & 0xFFFFC21F)==0x2550C000) {\n\t\tdecode_fields32(ENC_PTEST_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tOK(ENC_PTEST_P_P_);\n\t}\n\treturn rc;\n}\n\n/* ptrue_p_s.xml */\nint ptrue_p_s(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|size=xx|01100|S=0|111000|pattern=xxxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FFC10)==0x2518E000) {\n\t\tdecode_fields32(ENC_PTRUE_P_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tctx->pat = ctx->pattern;\n\t\tOK(ENC_PTRUE_P_S_);\n\t}\n\treturn rc;\n}\n\n/* ptrues_p_s.xml */\nint ptrues_p_s(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|size=xx|01100|S=1|111000|pattern=xxxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FFC10)==0x2519E000) {\n\t\tdecode_fields32(ENC_PTRUES_P_S_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tctx->pat = ctx->pattern;\n\t\tOK(ENC_PTRUES_P_S_);\n\t}\n\treturn rc;\n}\n\n/* punpkhi_p_p.xml */\nint punpkhi_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_high_half */\n\t/* 000001010011000|H=1|010000|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFE10)==0x5314000) {\n\t\tdecode_fields32(ENC_PUNPKHI_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->hi = TRUE;\n\t\tOK(ENC_PUNPKHI_P_P_);\n\t}\n\t/* class iclass_sve_low_half */\n\t/* 000001010011000|H=0|010000|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFE10)==0x5304000) {\n\t\tdecode_fields32(ENC_PUNPKLO_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->hi = FALSE;\n\t\tOK(ENC_PUNPKLO_P_P_);\n\t}\n\treturn rc;\n}\n\n/* raddhnb_z_zz.xml */\nint raddhnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=0|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45206800) {\n\t\tdecode_fields32(ENC_RADDHNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RADDHNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* raddhnt_z_zz.xml */\nint raddhnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=0|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45206C00) {\n\t\tdecode_fields32(ENC_RADDHNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RADDHNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* rax1_z_zz.xml */\nint rax1_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|1|Zm=xxxxx|11110|op=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4520F400) {\n\t\tdecode_fields32(ENC_RAX1_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2SHA3()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RAX1_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* rbit_z_p_z.xml */\nint rbit_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|1001|opc=11|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5278000) {\n\t\tdecode_fields32(ENC_RBIT_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RBIT_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* rdffr_p_f.xml */\nint rdffr_p_f(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|op=0|S=0|011001111100|000000|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFFF0)==0x2519F000) {\n\t\tdecode_fields32(ENC_RDFFR_P_F_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Pd);\n\t\tOK(ENC_RDFFR_P_F_);\n\t}\n\treturn rc;\n}\n\n/* rdffr_p_p_f.xml */\nint rdffr_p_p_f(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_no_s */\n\t/* 00100101|op=0|S=0|011000111100|0|Pg=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFE10)==0x2518F000) {\n\t\tdecode_fields32(ENC_RDFFR_P_P_F_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = FALSE;\n\t\tinstr->setflags = FLAGEFFECT_NONE;\n\t\tOK(ENC_RDFFR_P_P_F_);\n\t}\n\treturn rc;\n}\n\n/* rdffrs_p_p_f.xml */\nint rdffrs_p_p_f(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_s */\n\t/* 00100101|op=0|S=1|011000111100|0|Pg=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFFFFFE10)==0x2558F000) {\n\t\tdecode_fields32(ENC_RDFFRS_P_P_F_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->setflags = TRUE;\n\t\tinstr->setflags = FLAGEFFECT_SETS;\n\t\tOK(ENC_RDFFRS_P_P_F_);\n\t}\n\treturn rc;\n}\n\n/* rdvl_r_i.xml */\nint rdvl_r_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 000001001|op=0|1|opc2<4:1>=1111|opc2<0>=1|01010|imm6=xxxxxx|Rd=xxxxx */\n\tif((INSWORD & 0xFFFFF800)==0x4BF5000) {\n\t\tdecode_fields32(ENC_RDVL_R_I_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->d = UINT(ctx->Rd);\n\t\tctx->imm = SInt(ctx->imm6,6);\n\t\tOK(ENC_RDVL_R_I_);\n\t}\n\treturn rc;\n}\n\n/* rev_p_p.xml */\nint rev_p_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|110100010000|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF3FFE10)==0x5344000) {\n\t\tdecode_fields32(ENC_REV_P_P_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tOK(ENC_REV_P_P_);\n\t}\n\treturn rc;\n}\n\n/* rev_z_z.xml */\nint rev_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|111000001110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5383800) {\n\t\tdecode_fields32(ENC_REV_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_REV_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* revb_z_z.xml */\nint revb_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000101|size=xx|1001|opc=00|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5248000) {\n\t\tdecode_fields32(ENC_REVB_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->swsize = 8;\n\t\tOK(ENC_REVB_Z_Z_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000101|size=xx|1001|opc=01|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5258000) {\n\t\tdecode_fields32(ENC_REVH_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->swsize = 0x10;\n\t\tOK(ENC_REVH_Z_Z_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000101|size=xx|1001|opc=10|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x5268000) {\n\t\tdecode_fields32(ENC_REVW_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->swsize = 0x20;\n\t\tOK(ENC_REVW_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* revd_z_p_z.xml */\nint revd_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000101|size=00|101110100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x52E8000) {\n\t\tdecode_fields32(ENC_REVD_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->swsize = 0x40;\n\t\tOK(ENC_REVD_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* rshrnb_z_zi.xml */\nint rshrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=1|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45201800) {\n\t\tdecode_fields32(ENC_RSHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_RSHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* rshrnt_z_zi.xml */\nint rshrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=1|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45201C00) {\n\t\tdecode_fields32(ENC_RSHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_RSHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* rsubhnb_z_zz.xml */\nint rsubhnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=1|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45207800) {\n\t\tdecode_fields32(ENC_RSUBHNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RSUBHNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* rsubhnt_z_zz.xml */\nint rsubhnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=1|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45207C00) {\n\t\tdecode_fields32(ENC_RSUBHNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_RSUBHNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* saba_z_zzz.xml */\nint saba_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|11111|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500F800) {\n\t\tdecode_fields32(ENC_SABA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SABA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sabalb_z_zzz.xml */\nint sabalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1100|U=0|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500C000) {\n\t\tdecode_fields32(ENC_SABALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SABALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sabalt_z_zzz.xml */\nint sabalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1100|U=0|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500C400) {\n\t\tdecode_fields32(ENC_SABALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SABALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sabd_z_p_zz.xml */\nint sabd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=10|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40C0000) {\n\t\tdecode_fields32(ENC_SABD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SABD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sabdlb_z_zz.xml */\nint sabdlb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=1|S=1|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45003000) {\n\t\tdecode_fields32(ENC_SABDLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SABDLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sabdlt_z_zz.xml */\nint sabdlt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=1|S=1|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45003400) {\n\t\tdecode_fields32(ENC_SABDLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SABDLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sadalp_z_p_z.xml */\nint sadalp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00010|U=0|101|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4404A000) {\n\t\tdecode_fields32(ENC_SADALP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SADALP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* saddlb_z_zz.xml */\nint saddlb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=0|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45000000) {\n\t\tdecode_fields32(ENC_SADDLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SADDLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* saddlbt_z_zz.xml */\nint saddlbt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1000|S=0|tb=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45008000) {\n\t\tdecode_fields32(ENC_SADDLBT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SADDLBT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* saddlt_z_zz.xml */\nint saddlt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=0|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45000400) {\n\t\tdecode_fields32(ENC_SADDLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SADDLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* saddv_r_p_z.xml */\nint saddv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0000|op=0|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4002000) {\n\t\tdecode_fields32(ENC_SADDV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_SADDV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* saddwb_z_zz.xml */\nint saddwb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=0|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45004000) {\n\t\tdecode_fields32(ENC_SADDWB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SADDWB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* saddwt_z_zz.xml */\nint saddwt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=0|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45004400) {\n\t\tdecode_fields32(ENC_SADDWT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SADDWT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sbclb_z_zzz.xml */\nint sbclb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|1|sz=x|0|Zm=xxxxx|11010|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4580D000) {\n\t\tdecode_fields32(ENC_SBCLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SBCLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sbclt_z_zzz.xml */\nint sbclt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|1|sz=x|0|Zm=xxxxx|11010|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4580D400) {\n\t\tdecode_fields32(ENC_SBCLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (0x20) << (UINT(ctx->sz));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SBCLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sclamp_z_zz.xml */\nint sclamp_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|11000|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4400C000) {\n\t\tdecode_fields32(ENC_SCLAMP_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SCLAMP_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* scvtf_z_p_z.xml */\nint scvtf_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_to_half */\n\t/* 01100101|opc=01|010|opc2=01|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6552A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_H2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_H2FP16);\n\t}\n\t/* class iclass_32_to_half */\n\t/* 01100101|opc=01|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6554A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_W2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_W2FP16);\n\t}\n\t/* class iclass_32_to_single */\n\t/* 01100101|opc=10|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6594A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_W2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_W2S);\n\t}\n\t/* class iclass_32_to_double */\n\t/* 01100101|opc=11|010|opc2=00|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D0A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_W2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_W2D);\n\t}\n\t/* class iclass_64_to_half */\n\t/* 01100101|opc=01|010|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6556A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_X2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_X2FP16);\n\t}\n\t/* class iclass_64_to_single */\n\t/* 01100101|opc=11|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D4A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_X2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_X2S);\n\t}\n\t/* class iclass_64_to_double */\n\t/* 01100101|opc=11|010|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D6A000) {\n\t\tdecode_fields32(ENC_SCVTF_Z_P_Z_X2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_SCVTF_Z_P_Z_X2D);\n\t}\n\treturn rc;\n}\n\n/* sdiv_z_p_zz.xml */\nint sdiv_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0101|R=0|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4140000) {\n\t\tdecode_fields32(ENC_SDIV_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SDIV_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sdivr_z_p_zz.xml */\nint sdivr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0101|R=1|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4160000) {\n\t\tdecode_fields32(ENC_SDIVR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SDIVR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sdot_z_zzz.xml */\nint sdot_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000100|size=xx|0|Zm=xxxxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44000000) {\n\t\tdecode_fields32(ENC_SDOT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SDOT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sdot_z_zzzi.xml */\nint sdot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A00000) {\n\t\tdecode_fields32(ENC_SDOT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SDOT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E00000) {\n\t\tdecode_fields32(ENC_SDOT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SDOT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sel_p_p_pp.xml */\nint sel_p_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */\n\tif((INSWORD & 0xFFF0C210)==0x25004210) {\n\t\tdecode_fields32(ENC_SEL_P_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\t/* regular aliases */\n\t\tif(ctx->Pd==ctx->Pm) return MOV_sel_p_p_pp(ctx, instr);\n\t\tOK(ENC_SEL_P_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* sel_z_p_zz.xml */\nint sel_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|1|Zm=xxxxx|11|Pg=xxxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20C000)==0x520C000) {\n\t\tdecode_fields32(ENC_SEL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\t/* regular aliases */\n\t\tif(ctx->Zd==ctx->Zm) return MOV_sel_z_p_zz(ctx, instr);\n\t\tOK(ENC_SEL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* setffr_f.xml */\nint setffr_f(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00|100101|opc=00|10|1100100100|000000|0|0|00 */\n\tif((INSWORD & 0xFFFFFFFF)==0x252C9000) {\n\t\tdecode_fields32(ENC_SETFFR_F_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tOK(ENC_SETFFR_F_);\n\t}\n\treturn rc;\n}\n\n/* shadd_z_p_zz.xml */\nint shadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=0|S=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44108000) {\n\t\tdecode_fields32(ENC_SHADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SHADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* shared_pseudocode.xml */\nint shared_pseudocode(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\treturn rc;\n}\n\n/* shrnb_z_zi.xml */\nint shrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=1|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45201000) {\n\t\tdecode_fields32(ENC_SHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* shrnt_z_zi.xml */\nint shrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=1|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45201400) {\n\t\tdecode_fields32(ENC_SHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* shsub_z_p_zz.xml */\nint shsub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=0|S=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44128000) {\n\t\tdecode_fields32(ENC_SHSUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SHSUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* shsubr_z_p_zz.xml */\nint shsubr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=1|S=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44168000) {\n\t\tdecode_fields32(ENC_SHSUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SHSUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sli_z_zzi.xml */\nint sli_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|11110|op=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500F400) {\n\t\tdecode_fields32(ENC_SLI_Z_ZZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_SLI_Z_ZZI_);\n\t}\n\treturn rc;\n}\n\n/* sm4e_z_zz.xml */\nint sm4e_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|10001|op=1|11100|o2=0|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFFFFC00)==0x4523E000) {\n\t\tdecode_fields32(ENC_SM4E_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2SM4()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SM4E_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sm4ekey_z_zz.xml */\nint sm4ekey_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=00|1|Zm=xxxxx|11110|op=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x4520F000) {\n\t\tdecode_fields32(ENC_SM4EKEY_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2SM4()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SM4EKEY_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smax_z_p_zz.xml */\nint smax_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=00|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4080000) {\n\t\tdecode_fields32(ENC_SMAX_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMAX_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smax_z_zi.xml */\nint smax_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|101|00|U=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x2528C000) {\n\t\tdecode_fields32(ENC_SMAX_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tOK(ENC_SMAX_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* smaxp_z_p_zz.xml */\nint smaxp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|opc=10|U=0|101|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4414A000) {\n\t\tdecode_fields32(ENC_SMAXP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SMAXP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smaxv_r_p_z.xml */\nint smaxv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0010|op=0|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4082000) {\n\t\tdecode_fields32(ENC_SMAXV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMAXV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* smin_z_p_zz.xml */\nint smin_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=01|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40A0000) {\n\t\tdecode_fields32(ENC_SMIN_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMIN_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smin_z_zi.xml */\nint smin_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|101|01|U=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x252AC000) {\n\t\tdecode_fields32(ENC_SMIN_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tOK(ENC_SMIN_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sminp_z_p_zz.xml */\nint sminp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|opc=11|U=0|101|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4416A000) {\n\t\tdecode_fields32(ENC_SMINP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SMINP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sminv_r_p_z.xml */\nint sminv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0010|op=1|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40A2000) {\n\t\tdecode_fields32(ENC_SMINV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMINV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* smlalb_z_zzz.xml */\nint smlalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=0|U=0|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44004000) {\n\t\tdecode_fields32(ENC_SMLALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SMLALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* smlalb_z_zzzi.xml */\nint smlalb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=0|U=0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A08000) {\n\t\tdecode_fields32(ENC_SMLALB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMLALB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=0|U=0|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E08000) {\n\t\tdecode_fields32(ENC_SMLALB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMLALB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* smlalt_z_zzz.xml */\nint smlalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=0|U=0|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44004400) {\n\t\tdecode_fields32(ENC_SMLALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SMLALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* smlalt_z_zzzi.xml */\nint smlalt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=0|U=0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A08400) {\n\t\tdecode_fields32(ENC_SMLALT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMLALT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=0|U=0|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E08400) {\n\t\tdecode_fields32(ENC_SMLALT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMLALT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* smlslb_z_zzz.xml */\nint smlslb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=1|U=0|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44005000) {\n\t\tdecode_fields32(ENC_SMLSLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SMLSLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* smlslb_z_zzzi.xml */\nint smlslb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=1|U=0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0A000) {\n\t\tdecode_fields32(ENC_SMLSLB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMLSLB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=1|U=0|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0A000) {\n\t\tdecode_fields32(ENC_SMLSLB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMLSLB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* smlslt_z_zzz.xml */\nint smlslt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=1|U=0|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44005400) {\n\t\tdecode_fields32(ENC_SMLSLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SMLSLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* smlslt_z_zzzi.xml */\nint smlslt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=1|U=0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0A400) {\n\t\tdecode_fields32(ENC_SMLSLT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMLSLT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=1|U=0|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0A400) {\n\t\tdecode_fields32(ENC_SMLSLT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMLSLT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* smmla_z_zzz.xml */\nint smmla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000101|uns=00|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x45009800) {\n\t\tdecode_fields32(ENC_SMMLA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_SMMLA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* smopa_za_pp_zz.xml */\nint smopa_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=0|10|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA0800000) {\n\t\tdecode_fields32(ENC_SMOPA_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_SMOPA_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=0|11|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA0C00000) {\n\t\tdecode_fields32(ENC_SMOPA_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_SMOPA_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* smops_za_pp_zz.xml */\nint smops_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=0|10|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA0800010) {\n\t\tdecode_fields32(ENC_SMOPS_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_SMOPS_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=0|11|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA0C00010) {\n\t\tdecode_fields32(ENC_SMOPS_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_SMOPS_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* smulh_z_p_zz.xml */\nint smulh_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0100|H=1|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4120000) {\n\t\tdecode_fields32(ENC_SMULH_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMULH_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smulh_z_zz.xml */\nint smulh_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=xx|1|Zm=xxxxx|0110|1|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4206800) {\n\t\tdecode_fields32(ENC_SMULH_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SMULH_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smullb_z_zz.xml */\nint smullb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=1|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45007000) {\n\t\tdecode_fields32(ENC_SMULLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SMULLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smullb_z_zzi.xml */\nint smullb_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|110|U=0|i3l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0C000) {\n\t\tdecode_fields32(ENC_SMULLB_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMULLB_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|110|U=0|i2l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0C000) {\n\t\tdecode_fields32(ENC_SMULLB_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SMULLB_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* smullt_z_zz.xml */\nint smullt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=1|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45007400) {\n\t\tdecode_fields32(ENC_SMULLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SMULLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* smullt_z_zzi.xml */\nint smullt_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|110|U=0|i3l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0C400) {\n\t\tdecode_fields32(ENC_SMULLT_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMULLT_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|110|U=0|i2l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0C400) {\n\t\tdecode_fields32(ENC_SMULLT_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SMULLT_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* splice_z_p_zz.xml */\nint splice_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_const */\n\t/* 00000101|size=xx|101101100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x52D8000) {\n\t\tdecode_fields32(ENC_SPLICE_Z_P_ZZ_CON, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dst = UINT(ctx->Zd);\n\t\tctx->s1 = UINT(ctx->Zn);\n\t\tctx->s2 = ((ctx->s1+1)) % 32;\n\t\tOK(ENC_SPLICE_Z_P_ZZ_CON);\n\t}\n\t/* class iclass_sve_dest */\n\t/* 00000101|size=xx|101100100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x52C8000) {\n\t\tdecode_fields32(ENC_SPLICE_Z_P_ZZ_DES, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dst = UINT(ctx->Zdn);\n\t\tctx->s1 = ctx->dst;\n\t\tctx->s2 = UINT(ctx->Zm);\n\t\tOK(ENC_SPLICE_Z_P_ZZ_DES);\n\t}\n\treturn rc;\n}\n\n/* sqabs_z_p_z.xml */\nint sqabs_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|0|opc=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4408A000) {\n\t\tdecode_fields32(ENC_SQABS_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQABS_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* sqadd_z_p_zz.xml */\nint sqadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=0|S=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44188000) {\n\t\tdecode_fields32(ENC_SQADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqadd_z_zi.xml */\nint sqadd_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|10|U=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2524C000) {\n\t\tdecode_fields32(ENC_SQADD_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQADD_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqadd_z_zz.xml */\nint sqadd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|10|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4201000) {\n\t\tdecode_fields32(ENC_SQADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqcadd_z_zz.xml */\nint sqcadd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|00000|op=1|11011|rot=x|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FF800)==0x4501D800) {\n\t\tdecode_fields32(ENC_SQCADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->sub_i = (ctx->rot==0);\n\t\tctx->sub_r = (ctx->rot==1);\n\t\tOK(ENC_SQCADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdecb_r_rs.xml */\nint sqdecb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x420F800) {\n\t\tdecode_fields32(ENC_SQDECB_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQDECB_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430F800) {\n\t\tdecode_fields32(ENC_SQDECB_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQDECB_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqdecd_r_rs.xml */\nint sqdecd_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0F800) {\n\t\tdecode_fields32(ENC_SQDECD_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQDECD_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0F800) {\n\t\tdecode_fields32(ENC_SQDECD_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQDECD_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqdecd_z_zs.xml */\nint sqdecd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=11|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0C800) {\n\t\tdecode_fields32(ENC_SQDECD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQDECD_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqdech_r_rs.xml */\nint sqdech_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460F800) {\n\t\tdecode_fields32(ENC_SQDECH_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQDECH_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470F800) {\n\t\tdecode_fields32(ENC_SQDECH_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQDECH_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqdech_z_zs.xml */\nint sqdech_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=01|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460C800) {\n\t\tdecode_fields32(ENC_SQDECH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQDECH_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqdecp_r_p_r.xml */\nint sqdecp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00100101|size=xx|1010|D=1|U=0|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252A8800) {\n\t\tdecode_fields32(ENC_SQDECP_R_P_R_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQDECP_R_P_R_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00100101|size=xx|1010|D=1|U=0|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252A8C00) {\n\t\tdecode_fields32(ENC_SQDECP_R_P_R_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQDECP_R_P_R_X);\n\t}\n\treturn rc;\n}\n\n/* sqdecp_z_p_z.xml */\nint sqdecp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1010|D=1|U=0|10000|opc=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252A8000) {\n\t\tdecode_fields32(ENC_SQDECP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQDECP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* sqdecw_r_rs.xml */\nint sqdecw_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0F800) {\n\t\tdecode_fields32(ENC_SQDECW_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQDECW_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0F800) {\n\t\tdecode_fields32(ENC_SQDECW_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQDECW_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqdecw_z_zs.xml */\nint sqdecw_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=10|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0C800) {\n\t\tdecode_fields32(ENC_SQDECW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQDECW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlalb_z_zzz.xml */\nint sqdmlalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|0110|S=0|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44006000) {\n\t\tdecode_fields32(ENC_SQDMLALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tOK(ENC_SQDMLALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlalb_z_zzzi.xml */\nint sqdmlalb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|001|S=0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A02000) {\n\t\tdecode_fields32(ENC_SQDMLALB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMLALB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|001|S=0|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E02000) {\n\t\tdecode_fields32(ENC_SQDMLALB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMLALB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmlalbt_z_zzz.xml */\nint sqdmlalbt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|00001|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44000800) {\n\t\tdecode_fields32(ENC_SQDMLALBT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 1;\n\t\tOK(ENC_SQDMLALBT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlalt_z_zzz.xml */\nint sqdmlalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|0110|S=0|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44006400) {\n\t\tdecode_fields32(ENC_SQDMLALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tOK(ENC_SQDMLALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlalt_z_zzzi.xml */\nint sqdmlalt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|001|S=0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A02400) {\n\t\tdecode_fields32(ENC_SQDMLALT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMLALT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|001|S=0|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E02400) {\n\t\tdecode_fields32(ENC_SQDMLALT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMLALT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmlslb_z_zzz.xml */\nint sqdmlslb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|0110|S=1|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44006800) {\n\t\tdecode_fields32(ENC_SQDMLSLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tOK(ENC_SQDMLSLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlslb_z_zzzi.xml */\nint sqdmlslb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|001|S=1|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A03000) {\n\t\tdecode_fields32(ENC_SQDMLSLB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMLSLB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|001|S=1|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E03000) {\n\t\tdecode_fields32(ENC_SQDMLSLB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMLSLB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmlslbt_z_zzz.xml */\nint sqdmlslbt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|00001|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44000C00) {\n\t\tdecode_fields32(ENC_SQDMLSLBT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 1;\n\t\tOK(ENC_SQDMLSLBT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlslt_z_zzz.xml */\nint sqdmlslt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|0110|S=1|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44006C00) {\n\t\tdecode_fields32(ENC_SQDMLSLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tOK(ENC_SQDMLSLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmlslt_z_zzzi.xml */\nint sqdmlslt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|001|S=1|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A03400) {\n\t\tdecode_fields32(ENC_SQDMLSLT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMLSLT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|001|S=1|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E03400) {\n\t\tdecode_fields32(ENC_SQDMLSLT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMLSLT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmulh_z_zz.xml */\nint sqdmulh_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=xx|1|Zm=xxxxx|01110|R=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4207000) {\n\t\tdecode_fields32(ENC_SQDMULH_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULH_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmulh_z_zzi.xml */\nint sqdmulh_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|11110|R=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4420F000) {\n\t\tdecode_fields32(ENC_SQDMULH_Z_ZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULH_Z_ZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|11110|R=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A0F000) {\n\t\tdecode_fields32(ENC_SQDMULH_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULH_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|11110|R=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E0F000) {\n\t\tdecode_fields32(ENC_SQDMULH_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULH_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmullb_z_zz.xml */\nint sqdmullb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=0|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45006000) {\n\t\tdecode_fields32(ENC_SQDMULLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmullb_z_zzi.xml */\nint sqdmullb_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|1110|i3l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0E000) {\n\t\tdecode_fields32(ENC_SQDMULLB_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMULLB_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|1110|i2l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0E000) {\n\t\tdecode_fields32(ENC_SQDMULLB_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_SQDMULLB_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqdmullt_z_zz.xml */\nint sqdmullt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=0|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45006400) {\n\t\tdecode_fields32(ENC_SQDMULLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQDMULLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqdmullt_z_zzi.xml */\nint sqdmullt_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|1110|i3l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0E400) {\n\t\tdecode_fields32(ENC_SQDMULLT_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMULLT_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|1110|i2l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0E400) {\n\t\tdecode_fields32(ENC_SQDMULLT_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_SQDMULLT_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqincb_r_rs.xml */\nint sqincb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x420F000) {\n\t\tdecode_fields32(ENC_SQINCB_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQINCB_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430F000) {\n\t\tdecode_fields32(ENC_SQINCB_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQINCB_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqincd_r_rs.xml */\nint sqincd_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0F000) {\n\t\tdecode_fields32(ENC_SQINCD_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQINCD_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0F000) {\n\t\tdecode_fields32(ENC_SQINCD_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQINCD_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqincd_z_zs.xml */\nint sqincd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=11|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0C000) {\n\t\tdecode_fields32(ENC_SQINCD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQINCD_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqinch_r_rs.xml */\nint sqinch_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460F000) {\n\t\tdecode_fields32(ENC_SQINCH_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQINCH_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470F000) {\n\t\tdecode_fields32(ENC_SQINCH_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQINCH_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqinch_z_zs.xml */\nint sqinch_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=01|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460C000) {\n\t\tdecode_fields32(ENC_SQINCH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQINCH_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqincp_r_p_r.xml */\nint sqincp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00100101|size=xx|1010|D=0|U=0|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25288800) {\n\t\tdecode_fields32(ENC_SQINCP_R_P_R_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQINCP_R_P_R_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00100101|size=xx|1010|D=0|U=0|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25288C00) {\n\t\tdecode_fields32(ENC_SQINCP_R_P_R_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQINCP_R_P_R_X);\n\t}\n\treturn rc;\n}\n\n/* sqincp_z_p_z.xml */\nint sqincp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1010|D=0|U=0|10000|opc=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25288000) {\n\t\tdecode_fields32(ENC_SQINCP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQINCP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* sqincw_r_rs.xml */\nint sqincw_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0F000) {\n\t\tdecode_fields32(ENC_SQINCW_R_RS_SX, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_SQINCW_R_RS_SX);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0F000) {\n\t\tdecode_fields32(ENC_SQINCW_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_SQINCW_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* sqincw_z_zs.xml */\nint sqincw_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=10|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0C000) {\n\t\tdecode_fields32(ENC_SQINCW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQINCW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* sqneg_z_p_z.xml */\nint sqneg_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|0|opc=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4409A000) {\n\t\tdecode_fields32(ENC_SQNEG_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQNEG_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* sqrdcmlah_z_zzz.xml */\nint sqrdcmlah_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|001|op=1|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20F000)==0x44003000) {\n\t\tdecode_fields32(ENC_SQRDCMLAH_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_SQRDCMLAH_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrdcmlah_z_zzzi.xml */\nint sqrdcmlah_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|0111|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44A07000) {\n\t\tdecode_fields32(ENC_SQRDCMLAH_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_SQRDCMLAH_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|0111|rot=xx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F000)==0x44E07000) {\n\t\tdecode_fields32(ENC_SQRDCMLAH_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel_a = UINT(SLICE(ctx->rot,0,0));\n\t\tctx->sel_b = UINT(NOT(SLICE(ctx->rot,0,0),1));\n\t\tctx->sub_r = (SLICE(ctx->rot,0,0)!=SLICE(ctx->rot,1,1));\n\t\tctx->sub_i = (SLICE(ctx->rot,1,1)==1);\n\t\tOK(ENC_SQRDCMLAH_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlah_z_zzz.xml */\nint sqrdmlah_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|01110|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44007000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLAH_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlah_z_zzzi.xml */\nint sqrdmlah_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|00010|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x44201000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLAH_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00010|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A01000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLAH_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00010|S=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E01000) {\n\t\tdecode_fields32(ENC_SQRDMLAH_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLAH_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlsh_z_zzz.xml */\nint sqrdmlsh_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|01110|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44007400) {\n\t\tdecode_fields32(ENC_SQRDMLSH_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLSH_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrdmlsh_z_zzzi.xml */\nint sqrdmlsh_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|00010|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x44201400) {\n\t\tdecode_fields32(ENC_SQRDMLSH_Z_ZZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLSH_Z_ZZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00010|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A01400) {\n\t\tdecode_fields32(ENC_SQRDMLSH_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLSH_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00010|S=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E01400) {\n\t\tdecode_fields32(ENC_SQRDMLSH_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SQRDMLSH_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqrdmulh_z_zz.xml */\nint sqrdmulh_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=xx|1|Zm=xxxxx|01110|R=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4207400) {\n\t\tdecode_fields32(ENC_SQRDMULH_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQRDMULH_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrdmulh_z_zzi.xml */\nint sqrdmulh_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_halfwords */\n\t/* 01000100|0|i3h=x|1|i3l=xx|Zm=xxx|11110|R=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4420F400) {\n\t\tdecode_fields32(ENC_SQRDMULH_Z_ZZI_H, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<2)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQRDMULH_Z_ZZI_H);\n\t}\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|11110|R=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A0F400) {\n\t\tdecode_fields32(ENC_SQRDMULH_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQRDMULH_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|11110|R=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E0F400) {\n\t\tdecode_fields32(ENC_SQRDMULH_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQRDMULH_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* sqrshl_z_p_zz.xml */\nint sqrshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=0|N=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440A8000) {\n\t\tdecode_fields32(ENC_SQRSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SQRSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrshlr_z_p_zz.xml */\nint sqrshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=1|N=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440E8000) {\n\t\tdecode_fields32(ENC_SQRSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SQRSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqrshrnb_z_zi.xml */\nint sqrshrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=0|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45202800) {\n\t\tdecode_fields32(ENC_SQRSHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQRSHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqrshrnt_z_zi.xml */\nint sqrshrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=0|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45202C00) {\n\t\tdecode_fields32(ENC_SQRSHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQRSHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqrshrunb_z_zi.xml */\nint sqrshrunb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=0|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45200800) {\n\t\tdecode_fields32(ENC_SQRSHRUNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQRSHRUNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqrshrunt_z_zi.xml */\nint sqrshrunt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=0|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45200C00) {\n\t\tdecode_fields32(ENC_SQRSHRUNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQRSHRUNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshl_z_p_zi.xml */\nint sqshl_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|00|opc=01|L=1|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4068000) {\n\t\tdecode_fields32(ENC_SQSHL_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_SQSHL_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshl_z_p_zz.xml */\nint sqshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=0|N=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44088000) {\n\t\tdecode_fields32(ENC_SQSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SQSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqshlr_z_p_zz.xml */\nint sqshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=1|N=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440C8000) {\n\t\tdecode_fields32(ENC_SQSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SQSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqshlu_z_p_zi.xml */\nint sqshlu_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|00|opc=11|L=1|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40F8000) {\n\t\tdecode_fields32(ENC_SQSHLU_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_SQSHLU_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshrnb_z_zi.xml */\nint sqshrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=0|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45202000) {\n\t\tdecode_fields32(ENC_SQSHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQSHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshrnt_z_zi.xml */\nint sqshrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=0|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45202400) {\n\t\tdecode_fields32(ENC_SQSHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQSHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshrunb_z_zi.xml */\nint sqshrunb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=0|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45200000) {\n\t\tdecode_fields32(ENC_SQSHRUNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQSHRUNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqshrunt_z_zi.xml */\nint sqshrunt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=0|U=0|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45200400) {\n\t\tdecode_fields32(ENC_SQSHRUNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SQSHRUNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqsub_z_p_zz.xml */\nint sqsub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=0|S=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441A8000) {\n\t\tdecode_fields32(ENC_SQSUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQSUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqsub_z_zi.xml */\nint sqsub_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|11|U=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2526C000) {\n\t\tdecode_fields32(ENC_SQSUB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQSUB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sqsub_z_zz.xml */\nint sqsub_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|11|U=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4201800) {\n\t\tdecode_fields32(ENC_SQSUB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQSUB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqsubr_z_p_zz.xml */\nint sqsubr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=1|S=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441E8000) {\n\t\tdecode_fields32(ENC_SQSUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SQSUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqxtnb_z_zz.xml */\nint sqxtnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|0|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45204000) {\n\t\tdecode_fields32(ENC_SQXTNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQXTNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqxtnt_z_zz.xml */\nint sqxtnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|0|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45204400) {\n\t\tdecode_fields32(ENC_SQXTNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQXTNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqxtunb_z_zz.xml */\nint sqxtunb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|opc=10|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45205000) {\n\t\tdecode_fields32(ENC_SQXTUNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQXTUNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sqxtunt_z_zz.xml */\nint sqxtunt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|opc=10|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45205400) {\n\t\tdecode_fields32(ENC_SQXTUNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SQXTUNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* srhadd_z_p_zz.xml */\nint srhadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=1|S=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44148000) {\n\t\tdecode_fields32(ENC_SRHADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SRHADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sri_z_zzi.xml */\nint sri_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|11110|op=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500F000) {\n\t\tdecode_fields32(ENC_SRI_Z_ZZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SRI_Z_ZZI_);\n\t}\n\treturn rc;\n}\n\n/* srshl_z_p_zz.xml */\nint srshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|R=0|N=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44028000) {\n\t\tdecode_fields32(ENC_SRSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SRSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* srshlr_z_p_zz.xml */\nint srshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|R=1|N=1|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44068000) {\n\t\tdecode_fields32(ENC_SRSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_SRSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* srshr_z_p_zi.xml */\nint srshr_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|00|opc=11|L=0|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40C8000) {\n\t\tdecode_fields32(ENC_SRSHR_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SRSHR_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* srsra_z_zi.xml */\nint srsra_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|1110|R=1|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500E800) {\n\t\tdecode_fields32(ENC_SRSRA_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SRSRA_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sshllb_z_zi.xml */\nint sshllb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|0|tszl=xx|imm3=xxx|1010|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500A000) {\n\t\tdecode_fields32(ENC_SSHLLB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_SSHLLB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sshllt_z_zi.xml */\nint sshllt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|0|tszl=xx|imm3=xxx|1010|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500A400) {\n\t\tdecode_fields32(ENC_SSHLLT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_SSHLLT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* ssra_z_zi.xml */\nint ssra_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|1110|R=0|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500E000) {\n\t\tdecode_fields32(ENC_SSRA_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_SSRA_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* ssublb_z_zz.xml */\nint ssublb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=1|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45001000) {\n\t\tdecode_fields32(ENC_SSUBLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SSUBLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ssublbt_z_zz.xml */\nint ssublbt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1000|S=1|tb=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45008800) {\n\t\tdecode_fields32(ENC_SSUBLBT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SSUBLBT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ssublt_z_zz.xml */\nint ssublt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=1|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45001400) {\n\t\tdecode_fields32(ENC_SSUBLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SSUBLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ssubltb_z_zz.xml */\nint ssubltb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1000|S=1|tb=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45008C00) {\n\t\tdecode_fields32(ENC_SSUBLTB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 0;\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SSUBLTB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ssubwb_z_zz.xml */\nint ssubwb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=1|U=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45005000) {\n\t\tdecode_fields32(ENC_SSUBWB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SSUBWB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ssubwt_z_zz.xml */\nint ssubwt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=1|U=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45005400) {\n\t\tdecode_fields32(ENC_SSUBWT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SSUBWT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* st1b_z_p_ai.xml */\nint st1b_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1110010|msz=00|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE460A000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1B_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1110010|msz=00|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE440A000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1B_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* st1b_z_p_bi.xml */\nint st1b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF90E000)==0xE400E000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_ST1B_Z_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* st1b_z_p_br.xml */\nint st1b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|00|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF80E000)==0xE4004000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_BR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 8;\n\t\tOK(ENC_ST1B_Z_P_BR_);\n\t}\n\treturn rc;\n}\n\n/* st1b_z_p_bz.xml */\nint st1b_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1110010|msz=00|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4008000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1B_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=00|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4408000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1B_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=00|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE400A000) {\n\t\tdecode_fields32(ENC_ST1B_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1B_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* st1b_za_p_rrr.xml */\nint st1b_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=00|1|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFE00010)==0xE0200000) {\n\t\tdecode_fields32(ENC_ST1B_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = 0;\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tctx->esize = 8;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_ST1B_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* st1d_z_p_ai.xml */\nint st1d_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5C0A000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1D_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* st1d_z_p_bi.xml */\nint st1d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF90E000)==0xE580E000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_ST1D_Z_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* st1d_z_p_br.xml */\nint st1d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|opc<2:1>=11|opc<0>=1|o2=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5E04000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tOK(ENC_ST1D_Z_P_BR_);\n\t}\n\treturn rc;\n}\n\n/* st1d_z_p_bz.xml */\nint st1d_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1110010|msz=11|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5A08000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 3;\n\t\tOK(ENC_ST1D_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1110010|msz=11|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5808000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1D_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1110010|msz=11|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5A0A000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 3;\n\t\tOK(ENC_ST1D_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=11|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE580A000) {\n\t\tdecode_fields32(ENC_ST1D_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1D_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* st1d_za_p_rrr.xml */\nint st1d_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=11|1|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xxx|i1=x */\n\tif((INSWORD & 0xFFE00010)==0xE0E00000) {\n\t\tdecode_fields32(ENC_ST1D_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->i1);\n\t\tctx->esize = 0x40;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_ST1D_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* st1h_z_p_ai.xml */\nint st1h_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1110010|msz=01|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4E0A000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1H_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1110010|msz=01|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4C0A000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1H_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* st1h_z_p_bi.xml */\nint st1h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF90E000)==0xE480E000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_ST1H_Z_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* st1h_z_p_br.xml */\nint st1h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|01|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF80E000)==0xE4804000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 0x10;\n\t\tOK(ENC_ST1H_Z_P_BR_);\n\t}\n\treturn rc;\n}\n\n/* st1h_z_p_bz.xml */\nint st1h_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 1110010|msz=01|11|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4E08000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_ST1H_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1110010|msz=01|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4A08000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 1;\n\t\tOK(ENC_ST1H_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1110010|msz=01|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4808000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1H_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=01|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE4C08000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1H_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1110010|msz=01|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4A0A000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 1;\n\t\tOK(ENC_ST1H_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=01|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE480A000) {\n\t\tdecode_fields32(ENC_ST1H_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1H_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* st1h_za_p_rrr.xml */\nint st1h_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=01|1|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=x|imm3=xxx */\n\tif((INSWORD & 0xFFE00010)==0xE0600000) {\n\t\tdecode_fields32(ENC_ST1H_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->imm3);\n\t\tctx->esize = 0x10;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_ST1H_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* st1q_za_p_rrr.xml */\nint st1q_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100001111|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xxxx */\n\tif((INSWORD & 0xFFE00010)==0xE1E00000) {\n\t\tdecode_fields32(ENC_ST1Q_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = 0;\n\t\tctx->esize = 0x80;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_ST1Q_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* st1w_z_p_ai.xml */\nint st1w_z_p_ai(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_elem */\n\t/* 1110010|msz=10|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE560A000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_AI_S, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1W_Z_P_AI_S);\n\t}\n\t/* class iclass_64_elem */\n\t/* 1110010|msz=10|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE540A000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_AI_D, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offset = UINT(ctx->imm5);\n\t\tOK(ENC_ST1W_Z_P_AI_D);\n\t}\n\treturn rc;\n}\n\n/* st1w_z_p_bi.xml */\nint st1w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF90E000)==0xE500E000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_ST1W_Z_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* st1w_z_p_br.xml */\nint st1w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|10|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFF80E000)==0xE5004000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->msize = 0x20;\n\t\tOK(ENC_ST1W_Z_P_BR_);\n\t}\n\treturn rc;\n}\n\n/* st1w_z_p_bz.xml */\nint st1w_z_p_bz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_scaled */\n\t/* 1110010|msz=10|11|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5608000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_S_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_ST1W_Z_P_BZ_S_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_scaled */\n\t/* 1110010|msz=10|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5208000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_D_X32_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 2;\n\t\tOK(ENC_ST1W_Z_P_BZ_D_X32_SCALED);\n\t}\n\t/* class iclass_off_d_x32_unscaled */\n\t/* 1110010|msz=10|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5008000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_D_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1W_Z_P_BZ_D_X32_UNSCALED);\n\t}\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=10|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0A000)==0xE5408000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x20;\n\t\tctx->offs_unsigned = ctx->xs==0;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1W_Z_P_BZ_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_scaled */\n\t/* 1110010|msz=10|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE520A000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_D_64_SCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 2;\n\t\tOK(ENC_ST1W_Z_P_BZ_D_64_SCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=10|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE500A000) {\n\t\tdecode_fields32(ENC_ST1W_Z_P_BZ_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tctx->offs_size = 0x40;\n\t\tctx->offs_unsigned = TRUE;\n\t\tctx->scale = 0;\n\t\tOK(ENC_ST1W_Z_P_BZ_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* st1w_za_p_rrr.xml */\nint st1w_za_p_rrr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 11100000|msz=10|1|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|0|ZAt=xx|imm2=xx */\n\tif((INSWORD & 0xFFE00010)==0xE0A00000) {\n\t\tdecode_fields32(ENC_ST1W_ZA_P_RRR_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->s = UINT(((3<<2)|ctx->Rs));\n\t\tctx->t = UINT(ctx->ZAt);\n\t\tctx->imm = UINT(ctx->imm2);\n\t\tctx->esize = 0x20;\n\t\tctx->vertical = ctx->V==1;\n\t\tOK(ENC_ST1W_ZA_P_RRR_);\n\t}\n\treturn rc;\n}\n\n/* st2b_z_p_bi.xml */\nint st2b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE430E000) {\n\t\tdecode_fields32(ENC_ST2B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2b_z_p_br.xml */\nint st2b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4206000) {\n\t\tdecode_fields32(ENC_ST2B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2d_z_p_bi.xml */\nint st2d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE5B0E000) {\n\t\tdecode_fields32(ENC_ST2D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2d_z_p_br.xml */\nint st2d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5A06000) {\n\t\tdecode_fields32(ENC_ST2D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2h_z_p_bi.xml */\nint st2h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE4B0E000) {\n\t\tdecode_fields32(ENC_ST2H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2h_z_p_br.xml */\nint st2h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4A06000) {\n\t\tdecode_fields32(ENC_ST2H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2w_z_p_bi.xml */\nint st2w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE530E000) {\n\t\tdecode_fields32(ENC_ST2W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st2w_z_p_br.xml */\nint st2w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5206000) {\n\t\tdecode_fields32(ENC_ST2W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 2;\n\t\tOK(ENC_ST2W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3b_z_p_bi.xml */\nint st3b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE450E000) {\n\t\tdecode_fields32(ENC_ST3B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3b_z_p_br.xml */\nint st3b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4406000) {\n\t\tdecode_fields32(ENC_ST3B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3d_z_p_bi.xml */\nint st3d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE5D0E000) {\n\t\tdecode_fields32(ENC_ST3D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3d_z_p_br.xml */\nint st3d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5C06000) {\n\t\tdecode_fields32(ENC_ST3D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3h_z_p_bi.xml */\nint st3h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE4D0E000) {\n\t\tdecode_fields32(ENC_ST3H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3h_z_p_br.xml */\nint st3h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4C06000) {\n\t\tdecode_fields32(ENC_ST3H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3w_z_p_bi.xml */\nint st3w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE550E000) {\n\t\tdecode_fields32(ENC_ST3W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st3w_z_p_br.xml */\nint st3w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5406000) {\n\t\tdecode_fields32(ENC_ST3W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 3;\n\t\tOK(ENC_ST3W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4b_z_p_bi.xml */\nint st4b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE470E000) {\n\t\tdecode_fields32(ENC_ST4B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4b_z_p_br.xml */\nint st4b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4606000) {\n\t\tdecode_fields32(ENC_ST4B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4d_z_p_bi.xml */\nint st4d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE5F0E000) {\n\t\tdecode_fields32(ENC_ST4D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4d_z_p_br.xml */\nint st4d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5E06000) {\n\t\tdecode_fields32(ENC_ST4D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4h_z_p_bi.xml */\nint st4h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE4F0E000) {\n\t\tdecode_fields32(ENC_ST4H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4h_z_p_br.xml */\nint st4h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4E06000) {\n\t\tdecode_fields32(ENC_ST4H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4w_z_p_bi.xml */\nint st4w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE570E000) {\n\t\tdecode_fields32(ENC_ST4W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* st4w_z_p_br.xml */\nint st4w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5606000) {\n\t\tdecode_fields32(ENC_ST4W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->nreg = 4;\n\t\tOK(ENC_ST4W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1b_z_p_ar.xml */\nint stnt1b_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=00|10|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4402000) {\n\t\tdecode_fields32(ENC_STNT1B_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 8;\n\t\tOK(ENC_STNT1B_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=00|00|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4002000) {\n\t\tdecode_fields32(ENC_STNT1B_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 8;\n\t\tOK(ENC_STNT1B_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* stnt1b_z_p_bi.xml */\nint stnt1b_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE410E000) {\n\t\tdecode_fields32(ENC_STNT1B_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_STNT1B_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1b_z_p_br.xml */\nint stnt1b_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=00|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4006000) {\n\t\tdecode_fields32(ENC_STNT1B_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 8;\n\t\tOK(ENC_STNT1B_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1d_z_p_ar.xml */\nint stnt1d_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 1110010|msz=11|00|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5802000) {\n\t\tdecode_fields32(ENC_STNT1D_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x40;\n\t\tOK(ENC_STNT1D_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* stnt1d_z_p_bi.xml */\nint stnt1d_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE590E000) {\n\t\tdecode_fields32(ENC_STNT1D_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_STNT1D_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1d_z_p_br.xml */\nint stnt1d_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=11|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5806000) {\n\t\tdecode_fields32(ENC_STNT1D_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tOK(ENC_STNT1D_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1h_z_p_ar.xml */\nint stnt1h_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=01|10|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4C02000) {\n\t\tdecode_fields32(ENC_STNT1H_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x10;\n\t\tOK(ENC_STNT1H_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=01|00|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4802000) {\n\t\tdecode_fields32(ENC_STNT1H_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x10;\n\t\tOK(ENC_STNT1H_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* stnt1h_z_p_bi.xml */\nint stnt1h_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE490E000) {\n\t\tdecode_fields32(ENC_STNT1H_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_STNT1H_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1h_z_p_br.xml */\nint stnt1h_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=01|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE4806000) {\n\t\tdecode_fields32(ENC_STNT1H_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x10;\n\t\tOK(ENC_STNT1H_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1w_z_p_ar.xml */\nint stnt1w_z_p_ar(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_off_s_x32_unscaled */\n\t/* 1110010|msz=10|10|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5402000) {\n\t\tdecode_fields32(ENC_STNT1W_Z_P_AR_S_X32_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->msize = 0x20;\n\t\tOK(ENC_STNT1W_Z_P_AR_S_X32_UNSCALED);\n\t}\n\t/* class iclass_off_d_64_unscaled */\n\t/* 1110010|msz=10|00|Rm=xxxxx|001|Pg=xxx|Zn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5002000) {\n\t\tdecode_fields32(ENC_STNT1W_Z_P_AR_D_64_UNSCALED, ctx, instr);\n\t\tif(!HaveSVE2()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x40;\n\t\tctx->msize = 0x20;\n\t\tOK(ENC_STNT1W_Z_P_AR_D_64_UNSCALED);\n\t}\n\treturn rc;\n}\n\n/* stnt1w_z_p_bi.xml */\nint stnt1w_z_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFF0E000)==0xE510E000) {\n\t\tdecode_fields32(ENC_STNT1W_Z_P_BI_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tctx->offset = SInt(ctx->imm4,4);\n\t\tOK(ENC_STNT1W_Z_P_BI_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* stnt1w_z_p_br.xml */\nint stnt1w_z_p_br(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010|msz=10|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFE0E000)==0xE5006000) {\n\t\tdecode_fields32(ENC_STNT1W_Z_P_BR_CONTIGUOUS, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->Rm==0x1f) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->esize = 0x20;\n\t\tOK(ENC_STNT1W_Z_P_BR_CONTIGUOUS);\n\t}\n\treturn rc;\n}\n\n/* str_p_bi.xml */\nint str_p_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010110|imm9h=xxxxxx|000|imm9l=xxx|Rn=xxxxx|0|Pt=xxxx */\n\tif((INSWORD & 0xFFC0E010)==0xE5800000) {\n\t\tdecode_fields32(ENC_STR_P_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Pt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->imm = SInt(((ctx->imm9h<<3)|ctx->imm9l),9);\n\t\tOK(ENC_STR_P_BI_);\n\t}\n\treturn rc;\n}\n\n/* str_z_bi.xml */\nint str_z_bi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 1110010110|imm9h=xxxxxx|010|imm9l=xxx|Rn=xxxxx|Zt=xxxxx */\n\tif((INSWORD & 0xFFC0E000)==0xE5804000) {\n\t\tdecode_fields32(ENC_STR_Z_BI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->t = UINT(ctx->Zt);\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->imm = SInt(((ctx->imm9h<<3)|ctx->imm9l),9);\n\t\tOK(ENC_STR_Z_BI_);\n\t}\n\treturn rc;\n}\n\n/* str_za_ri.xml */\nint str_za_ri(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 1110000100|op=1|000000|Rv=xx|000|Rn=xxxxx|0|imm4=xxxx */\n\tif((INSWORD & 0xFFFF9C10)==0xE1200000) {\n\t\tdecode_fields32(ENC_STR_ZA_RI_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->v = UINT(((3<<2)|ctx->Rv));\n\t\tctx->imm = UINT(ctx->imm4);\n\t\tOK(ENC_STR_ZA_RI_);\n\t}\n\treturn rc;\n}\n\n/* sub_z_p_zz.xml */\nint sub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|000|opc<2:1>=00|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4010000) {\n\t\tdecode_fields32(ENC_SUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sub_z_zi.xml */\nint sub_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2521C000) {\n\t\tdecode_fields32(ENC_SUB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tOK(ENC_SUB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sub_z_zz.xml */\nint sub_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|opc<2:1>=00|opc<0>=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4200400) {\n\t\tdecode_fields32(ENC_SUB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SUB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* subhnb_z_zz.xml */\nint subhnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=1|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45207000) {\n\t\tdecode_fields32(ENC_SUBHNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SUBHNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* subhnt_z_zz.xml */\nint subhnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|1|Zm=xxxxx|011|S=1|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45207400) {\n\t\tdecode_fields32(ENC_SUBHNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_SUBHNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* subr_z_p_zz.xml */\nint subr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|000|opc<2:1>=01|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4030000) {\n\t\tdecode_fields32(ENC_SUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* subr_z_zi.xml */\nint subr_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|opc<2:1>=01|opc<0>=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2523C000) {\n\t\tdecode_fields32(ENC_SUBR_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tOK(ENC_SUBR_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* sudot_z_zzzi.xml */\nint sudot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00011|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A01C00) {\n\t\tdecode_fields32(ENC_SUDOT_Z_ZZZI_S, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_SUDOT_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* sumopa_za_pp_zz.xml */\nint sumopa_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=0|10|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA0A00000) {\n\t\tdecode_fields32(ENC_SUMOPA_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_SUMOPA_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=0|11|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA0E00000) {\n\t\tdecode_fields32(ENC_SUMOPA_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_SUMOPA_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* sumops_za_pp_zz.xml */\nint sumops_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=0|10|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA0A00010) {\n\t\tdecode_fields32(ENC_SUMOPS_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_SUMOPS_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=0|11|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA0E00010) {\n\t\tdecode_fields32(ENC_SUMOPS_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = FALSE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_SUMOPS_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* sunpkhi_z_z.xml */\nint sunpkhi_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_high_half */\n\t/* 00000101|size=xx|1100|U=0|H=1|001110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5313800) {\n\t\tdecode_fields32(ENC_SUNPKHI_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->hi = TRUE;\n\t\tOK(ENC_SUNPKHI_Z_Z_);\n\t}\n\t/* class iclass_sve_low_half */\n\t/* 00000101|size=xx|1100|U=0|H=0|001110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5303800) {\n\t\tdecode_fields32(ENC_SUNPKLO_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->hi = FALSE;\n\t\tOK(ENC_SUNPKLO_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* suqadd_z_p_zz.xml */\nint suqadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=1|S=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441C8000) {\n\t\tdecode_fields32(ENC_SUQADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_SUQADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* sxtb_z_p_z.xml */\nint sxtb_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000100|size=xx|010|00|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x410A000) {\n\t\tdecode_fields32(ENC_SXTB_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SXTB_Z_P_Z_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=xx|010|01|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x412A000) {\n\t\tdecode_fields32(ENC_SXTH_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SXTH_Z_P_Z_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=xx|010|10|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x414A000) {\n\t\tdecode_fields32(ENC_SXTW_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = FALSE;\n\t\tOK(ENC_SXTW_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* tbl_z_zz.xml */\nint tbl_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000101|size=xx|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5203000) {\n\t\tdecode_fields32(ENC_TBL_Z_ZZ_1, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->double_table = FALSE;\n\t\tOK(ENC_TBL_Z_ZZ_1);\n\t}\n\t/* class iclass_sve2 */\n\t/* 00000101|size=xx|1|Zm=xxxxx|00101|op=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5202800) {\n\t\tdecode_fields32(ENC_TBL_Z_ZZ_2, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->double_table = TRUE;\n\t\tOK(ENC_TBL_Z_ZZ_2);\n\t}\n\treturn rc;\n}\n\n/* tbx_z_zz.xml */\nint tbx_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000101|size=xx|1|Zm=xxxxx|00101|op=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5202C00) {\n\t\tdecode_fields32(ENC_TBX_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_TBX_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* trn1_p_pp.xml */\nint trn1_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_even */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=10|H=0|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5205000) {\n\t\tdecode_fields32(ENC_TRN1_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 0;\n\t\tOK(ENC_TRN1_P_PP_);\n\t}\n\t/* class iclass_sve_odd */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=10|H=1|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5205400) {\n\t\tdecode_fields32(ENC_TRN2_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 1;\n\t\tOK(ENC_TRN2_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* trn1_z_zz.xml */\nint trn1_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_even */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|10|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5207000) {\n\t\tdecode_fields32(ENC_TRN1_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_TRN1_Z_ZZ_);\n\t}\n\t/* class iclass_sve_even_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|11|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A01800) {\n\t\tdecode_fields32(ENC_TRN1_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_TRN1_Z_ZZ_Q);\n\t}\n\t/* class iclass_sve_odd */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|10|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5207400) {\n\t\tdecode_fields32(ENC_TRN2_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_TRN2_Z_ZZ_);\n\t}\n\t/* class iclass_sve_odd_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|11|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A01C00) {\n\t\tdecode_fields32(ENC_TRN2_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_TRN2_Z_ZZ_Q);\n\t}\n\treturn rc;\n}\n\n/* uaba_z_zzz.xml */\nint uaba_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|11111|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500FC00) {\n\t\tdecode_fields32(ENC_UABA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UABA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* uabalb_z_zzz.xml */\nint uabalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1100|U=1|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500C800) {\n\t\tdecode_fields32(ENC_UABALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UABALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* uabalt_z_zzz.xml */\nint uabalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|1100|U=1|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500CC00) {\n\t\tdecode_fields32(ENC_UABALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UABALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* uabd_z_p_zz.xml */\nint uabd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=10|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40D0000) {\n\t\tdecode_fields32(ENC_UABD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UABD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uabdlb_z_zz.xml */\nint uabdlb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=1|S=1|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45003800) {\n\t\tdecode_fields32(ENC_UABDLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UABDLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uabdlt_z_zz.xml */\nint uabdlt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=1|S=1|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45003C00) {\n\t\tdecode_fields32(ENC_UABDLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UABDLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uadalp_z_p_z.xml */\nint uadalp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00010|U=1|101|Pg=xxx|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4405A000) {\n\t\tdecode_fields32(ENC_UADALP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UADALP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* uaddlb_z_zz.xml */\nint uaddlb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=0|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45000800) {\n\t\tdecode_fields32(ENC_UADDLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UADDLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uaddlt_z_zz.xml */\nint uaddlt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=0|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45000C00) {\n\t\tdecode_fields32(ENC_UADDLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UADDLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uaddv_r_p_z.xml */\nint uaddv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0000|op=0|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4012000) {\n\t\tdecode_fields32(ENC_UADDV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tOK(ENC_UADDV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* uaddwb_z_zz.xml */\nint uaddwb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=0|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45004800) {\n\t\tdecode_fields32(ENC_UADDWB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UADDWB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uaddwt_z_zz.xml */\nint uaddwt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=0|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45004C00) {\n\t\tdecode_fields32(ENC_UADDWT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UADDWT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uclamp_z_zz.xml */\nint uclamp_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|11000|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4400C400) {\n\t\tdecode_fields32(ENC_UCLAMP_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UCLAMP_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* ucvtf_z_p_z.xml */\nint ucvtf_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_16_to_half */\n\t/* 01100101|opc=01|010|opc2=01|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6553A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_H2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x10;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_H2FP16);\n\t}\n\t/* class iclass_32_to_half */\n\t/* 01100101|opc=01|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6555A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_W2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_W2FP16);\n\t}\n\t/* class iclass_32_to_single */\n\t/* 01100101|opc=10|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6595A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_W2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_W2S);\n\t}\n\t/* class iclass_32_to_double */\n\t/* 01100101|opc=11|010|opc2=00|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D1A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_W2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x20;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_W2D);\n\t}\n\t/* class iclass_64_to_half */\n\t/* 01100101|opc=01|010|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x6557A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_X2FP16, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x10;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_X2FP16);\n\t}\n\t/* class iclass_64_to_single */\n\t/* 01100101|opc=11|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D5A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_X2S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x20;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_X2S);\n\t}\n\t/* class iclass_64_to_double */\n\t/* 01100101|opc=11|010|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFFFE000)==0x65D7A000) {\n\t\tdecode_fields32(ENC_UCVTF_Z_P_Z_X2D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->s_esize = 0x40;\n\t\tctx->d_esize = 0x40;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->rounding = FPRoundingMode(ctx->FPCR);\n\t\tOK(ENC_UCVTF_Z_P_Z_X2D);\n\t}\n\treturn rc;\n}\n\n/* udiv_z_p_zz.xml */\nint udiv_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0101|R=0|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4150000) {\n\t\tdecode_fields32(ENC_UDIV_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UDIV_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* udivr_z_p_zz.xml */\nint udivr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0101|R=1|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4170000) {\n\t\tdecode_fields32(ENC_UDIVR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UDIVR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* udot_z_zzz.xml */\nint udot_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000100|size=xx|0|Zm=xxxxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44000400) {\n\t\tdecode_fields32(ENC_UDOT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(!(ctx->size&2)) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UDOT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* udot_z_zzzi.xml */\nint udot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A00400) {\n\t\tdecode_fields32(ENC_UDOT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UDOT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i1=x|Zm=xxxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44E00400) {\n\t\tdecode_fields32(ENC_UDOT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->index = UINT(ctx->i1);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UDOT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* uhadd_z_p_zz.xml */\nint uhadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=0|S=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44118000) {\n\t\tdecode_fields32(ENC_UHADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_UHADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uhsub_z_p_zz.xml */\nint uhsub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=0|S=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44138000) {\n\t\tdecode_fields32(ENC_UHSUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_UHSUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uhsubr_z_p_zz.xml */\nint uhsubr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=1|S=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44178000) {\n\t\tdecode_fields32(ENC_UHSUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_UHSUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umax_z_p_zz.xml */\nint umax_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=00|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4090000) {\n\t\tdecode_fields32(ENC_UMAX_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMAX_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umax_z_zi.xml */\nint umax_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|101|00|U=1|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x2529C000) {\n\t\tdecode_fields32(ENC_UMAX_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tOK(ENC_UMAX_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* umaxp_z_p_zz.xml */\nint umaxp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|opc=10|U=1|101|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4415A000) {\n\t\tdecode_fields32(ENC_UMAXP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UMAXP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umaxv_r_p_z.xml */\nint umaxv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0010|op=0|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4092000) {\n\t\tdecode_fields32(ENC_UMAXV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMAXV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* umin_z_p_zz.xml */\nint umin_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|001|opc=01|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40B0000) {\n\t\tdecode_fields32(ENC_UMIN_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMIN_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umin_z_zi.xml */\nint umin_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|101|01|U=1|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x252BC000) {\n\t\tdecode_fields32(ENC_UMIN_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tOK(ENC_UMIN_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uminp_z_p_zz.xml */\nint uminp_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|opc=11|U=1|101|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4417A000) {\n\t\tdecode_fields32(ENC_UMINP_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UMINP_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uminv_r_p_z.xml */\nint uminv_r_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0010|op=1|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40B2000) {\n\t\tdecode_fields32(ENC_UMINV_R_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Vd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMINV_R_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* umlalb_z_zzz.xml */\nint umlalb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=0|U=1|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44004800) {\n\t\tdecode_fields32(ENC_UMLALB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UMLALB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* umlalb_z_zzzi.xml */\nint umlalb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=0|U=1|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A09000) {\n\t\tdecode_fields32(ENC_UMLALB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMLALB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=0|U=1|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E09000) {\n\t\tdecode_fields32(ENC_UMLALB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMLALB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* umlalt_z_zzz.xml */\nint umlalt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=0|U=1|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44004C00) {\n\t\tdecode_fields32(ENC_UMLALT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UMLALT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* umlalt_z_zzzi.xml */\nint umlalt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=0|U=1|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A09400) {\n\t\tdecode_fields32(ENC_UMLALT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMLALT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=0|U=1|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E09400) {\n\t\tdecode_fields32(ENC_UMLALT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMLALT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* umlslb_z_zzz.xml */\nint umlslb_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=1|U=1|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44005800) {\n\t\tdecode_fields32(ENC_UMLSLB_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UMLSLB_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* umlslb_z_zzzi.xml */\nint umlslb_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=1|U=1|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0B000) {\n\t\tdecode_fields32(ENC_UMLSLB_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMLSLB_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=1|U=1|i2l=x|T=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0B000) {\n\t\tdecode_fields32(ENC_UMLSLB_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMLSLB_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* umlslt_z_zzz.xml */\nint umlslt_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|0|Zm=xxxxx|010|S=1|U=1|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x44005C00) {\n\t\tdecode_fields32(ENC_UMLSLT_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_UMLSLT_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* umlslt_z_zzzi.xml */\nint umlslt_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|10|S=1|U=1|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0B400) {\n\t\tdecode_fields32(ENC_UMLSLT_Z_ZZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMLSLT_Z_ZZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|10|S=1|U=1|i2l=x|T=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0B400) {\n\t\tdecode_fields32(ENC_UMLSLT_Z_ZZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMLSLT_Z_ZZZI_D);\n\t}\n\treturn rc;\n}\n\n/* ummla_z_zzz.xml */\nint ummla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000101|uns=11|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x45C09800) {\n\t\tdecode_fields32(ENC_UMMLA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_UMMLA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* umopa_za_pp_zz.xml */\nint umopa_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=1|10|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA1A00000) {\n\t\tdecode_fields32(ENC_UMOPA_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_UMOPA_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=1|11|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA1E00000) {\n\t\tdecode_fields32(ENC_UMOPA_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_UMOPA_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* umops_za_pp_zz.xml */\nint umops_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=1|10|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA1A00010) {\n\t\tdecode_fields32(ENC_UMOPS_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_UMOPS_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=1|11|u1=1|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA1E00010) {\n\t\tdecode_fields32(ENC_UMOPS_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = TRUE;\n\t\tOK(ENC_UMOPS_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* umulh_z_p_zz.xml */\nint umulh_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|0100|H=1|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4130000) {\n\t\tdecode_fields32(ENC_UMULH_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMULH_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umulh_z_zz.xml */\nint umulh_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|size=xx|1|Zm=xxxxx|0110|1|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4206C00) {\n\t\tdecode_fields32(ENC_UMULH_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UMULH_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umullb_z_zz.xml */\nint umullb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=1|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45007800) {\n\t\tdecode_fields32(ENC_UMULLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UMULLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umullb_z_zzi.xml */\nint umullb_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|110|U=1|i3l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0D000) {\n\t\tdecode_fields32(ENC_UMULLB_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMULLB_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|110|U=1|i2l=x|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0D000) {\n\t\tdecode_fields32(ENC_UMULLB_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 0;\n\t\tOK(ENC_UMULLB_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* umullt_z_zz.xml */\nint umullt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|011|op=1|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45007C00) {\n\t\tdecode_fields32(ENC_UMULLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UMULLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* umullt_z_zzi.xml */\nint umullt_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_of_words */\n\t/* 01000100|size=10|1|i3h=xx|Zm=xxx|110|U=1|i3l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44A0D400) {\n\t\tdecode_fields32(ENC_UMULLT_Z_ZZI_S, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->index = UINT(((ctx->i3h<<1)|ctx->i3l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMULLT_Z_ZZI_S);\n\t}\n\t/* class iclass_of_doublewords */\n\t/* 01000100|size=11|1|i2h=x|Zm=xxxx|110|U=1|i2l=x|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0F400)==0x44E0D400) {\n\t\tdecode_fields32(ENC_UMULLT_Z_ZZI_D, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(((ctx->i2h<<1)|ctx->i2l));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel = 1;\n\t\tOK(ENC_UMULLT_Z_ZZI_D);\n\t}\n\treturn rc;\n}\n\n/* uqadd_z_p_zz.xml */\nint uqadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=0|S=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44198000) {\n\t\tdecode_fields32(ENC_UQADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqadd_z_zi.xml */\nint uqadd_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|10|U=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2525C000) {\n\t\tdecode_fields32(ENC_UQADD_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQADD_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqadd_z_zz.xml */\nint uqadd_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|10|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4201400) {\n\t\tdecode_fields32(ENC_UQADD_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQADD_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqdecb_r_rs.xml */\nint uqdecb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x420FC00) {\n\t\tdecode_fields32(ENC_UQDECB_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQDECB_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430FC00) {\n\t\tdecode_fields32(ENC_UQDECB_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQDECB_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqdecd_r_rs.xml */\nint uqdecd_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0FC00) {\n\t\tdecode_fields32(ENC_UQDECD_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQDECD_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0FC00) {\n\t\tdecode_fields32(ENC_UQDECD_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQDECD_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqdecd_z_zs.xml */\nint uqdecd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=11|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0CC00) {\n\t\tdecode_fields32(ENC_UQDECD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQDECD_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqdech_r_rs.xml */\nint uqdech_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460FC00) {\n\t\tdecode_fields32(ENC_UQDECH_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQDECH_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470FC00) {\n\t\tdecode_fields32(ENC_UQDECH_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQDECH_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqdech_z_zs.xml */\nint uqdech_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=01|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460CC00) {\n\t\tdecode_fields32(ENC_UQDECH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQDECH_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqdecp_r_p_r.xml */\nint uqdecp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00100101|size=xx|1010|D=1|U=1|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252B8800) {\n\t\tdecode_fields32(ENC_UQDECP_R_P_R_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQDECP_R_P_R_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00100101|size=xx|1010|D=1|U=1|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252B8C00) {\n\t\tdecode_fields32(ENC_UQDECP_R_P_R_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQDECP_R_P_R_X);\n\t}\n\treturn rc;\n}\n\n/* uqdecp_z_p_z.xml */\nint uqdecp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1010|D=1|U=1|10000|opc=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x252B8000) {\n\t\tdecode_fields32(ENC_UQDECP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQDECP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* uqdecw_r_rs.xml */\nint uqdecw_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0FC00) {\n\t\tdecode_fields32(ENC_UQDECW_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQDECW_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0FC00) {\n\t\tdecode_fields32(ENC_UQDECW_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQDECW_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqdecw_z_zs.xml */\nint uqdecw_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=10|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0CC00) {\n\t\tdecode_fields32(ENC_UQDECW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQDECW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqincb_r_rs.xml */\nint uqincb_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x420F400) {\n\t\tdecode_fields32(ENC_UQINCB_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQINCB_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x430F400) {\n\t\tdecode_fields32(ENC_UQINCB_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 8;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQINCB_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqincd_r_rs.xml */\nint uqincd_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0F400) {\n\t\tdecode_fields32(ENC_UQINCD_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQINCD_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4F0F400) {\n\t\tdecode_fields32(ENC_UQINCD_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQINCD_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqincd_z_zs.xml */\nint uqincd_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=11|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4E0C400) {\n\t\tdecode_fields32(ENC_UQINCD_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQINCD_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqinch_r_rs.xml */\nint uqinch_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460F400) {\n\t\tdecode_fields32(ENC_UQINCH_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQINCH_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x470F400) {\n\t\tdecode_fields32(ENC_UQINCH_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQINCH_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqinch_z_zs.xml */\nint uqinch_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=01|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x460C400) {\n\t\tdecode_fields32(ENC_UQINCH_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x10;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQINCH_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqincp_r_p_r.xml */\nint uqincp_r_p_r(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00100101|size=xx|1010|D=0|U=1|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25298800) {\n\t\tdecode_fields32(ENC_UQINCP_R_P_R_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQINCP_R_P_R_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00100101|size=xx|1010|D=0|U=1|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25298C00) {\n\t\tdecode_fields32(ENC_UQINCP_R_P_R_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQINCP_R_P_R_X);\n\t}\n\treturn rc;\n}\n\n/* uqincp_z_p_z.xml */\nint uqincp_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1010|D=0|U=1|10000|opc=00|Pm=xxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FFE00)==0x25298000) {\n\t\tdecode_fields32(ENC_UQINCP_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQINCP_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* uqincw_r_rs.xml */\nint uqincw_r_rs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_32_fsreg */\n\t/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0F400) {\n\t\tdecode_fields32(ENC_UQINCW_R_RS_UW, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x20;\n\t\tOK(ENC_UQINCW_R_RS_UW);\n\t}\n\t/* class iclass_64_fsreg */\n\t/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4B0F400) {\n\t\tdecode_fields32(ENC_UQINCW_R_RS_X, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Rdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->ssize = 0x40;\n\t\tOK(ENC_UQINCW_R_RS_X);\n\t}\n\treturn rc;\n}\n\n/* uqincw_z_zs.xml */\nint uqincw_z_zs(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=10|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFFF0FC00)==0x4A0C400) {\n\t\tdecode_fields32(ENC_UQINCW_Z_ZS_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->pat = ctx->pattern;\n\t\tctx->imm = UINT(ctx->imm4)+1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQINCW_Z_ZS_);\n\t}\n\treturn rc;\n}\n\n/* uqrshl_z_p_zz.xml */\nint uqrshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=0|N=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440B8000) {\n\t\tdecode_fields32(ENC_UQRSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UQRSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqrshlr_z_p_zz.xml */\nint uqrshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=1|N=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440F8000) {\n\t\tdecode_fields32(ENC_UQRSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UQRSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqrshrnb_z_zi.xml */\nint uqrshrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=1|R=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45203800) {\n\t\tdecode_fields32(ENC_UQRSHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_UQRSHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqrshrnt_z_zi.xml */\nint uqrshrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=1|R=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45203C00) {\n\t\tdecode_fields32(ENC_UQRSHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_UQRSHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqshl_z_p_zi.xml */\nint uqshl_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|00|opc=01|L=1|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4078000) {\n\t\tdecode_fields32(ENC_UQSHL_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_UQSHL_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqshl_z_p_zz.xml */\nint uqshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=0|N=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44098000) {\n\t\tdecode_fields32(ENC_UQSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UQSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqshlr_z_p_zz.xml */\nint uqshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=1|R=1|N=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x440D8000) {\n\t\tdecode_fields32(ENC_UQSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_UQSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqshrnb_z_zi.xml */\nint uqshrnb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=1|R=0|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45203000) {\n\t\tdecode_fields32(ENC_UQSHRNB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_UQSHRNB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqshrnt_z_zi.xml */\nint uqshrnt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|imm3=xxx|00|op=1|U=1|R=0|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x45203400) {\n\t\tdecode_fields32(ENC_UQSHRNT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_UQSHRNT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqsub_z_p_zz.xml */\nint uqsub_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=0|S=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441B8000) {\n\t\tdecode_fields32(ENC_UQSUB_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQSUB_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqsub_z_zi.xml */\nint uqsub_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|100|11|U=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FC000)==0x2527C000) {\n\t\tdecode_fields32(ENC_UQSUB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(((ctx->size<<1)|ctx->sh)==1) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->imm = UINT(ctx->imm8);\n\t\tif(ctx->sh==1) {\n\t\t\tctx->imm = (ctx->imm) << (8);\n\t\t}\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQSUB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* uqsub_z_zz.xml */\nint uqsub_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00000100|size=xx|1|Zm=xxxxx|000|11|U=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4201C00) {\n\t\tdecode_fields32(ENC_UQSUB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQSUB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqsubr_z_p_zz.xml */\nint uqsubr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=1|S=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441F8000) {\n\t\tdecode_fields32(ENC_UQSUBR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UQSUBR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqxtnb_z_zz.xml */\nint uqxtnb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|0|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45204800) {\n\t\tdecode_fields32(ENC_UQXTNB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UQXTNB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uqxtnt_z_zz.xml */\nint uqxtnt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|1|tszl=xx|000010|0|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA7FC00)==0x45204C00) {\n\t\tdecode_fields32(ENC_UQXTNT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(ctx->tsize==1) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if(ctx->tsize==2) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if(ctx->tsize==4) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\telse {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_UQXTNT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* urecpe_z_p_z.xml */\nint urecpe_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|0|opc=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4400A000) {\n\t\tdecode_fields32(ENC_URECPE_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_URECPE_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* urhadd_z_p_zz.xml */\nint urhadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|010|R=1|S=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44158000) {\n\t\tdecode_fields32(ENC_URHADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_URHADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* urshl_z_p_zz.xml */\nint urshl_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|R=0|N=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44038000) {\n\t\tdecode_fields32(ENC_URSHL_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_URSHL_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* urshlr_z_p_zz.xml */\nint urshlr_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|R=1|N=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x44078000) {\n\t\tdecode_fields32(ENC_URSHLR_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tOK(ENC_URSHLR_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* urshr_z_p_zi.xml */\nint urshr_z_p_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|00|opc=11|L=0|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x40D8000) {\n\t\tdecode_fields32(ENC_URSHR_Z_P_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_URSHR_Z_P_ZI_);\n\t}\n\treturn rc;\n}\n\n/* ursqrte_z_p_z.xml */\nint ursqrte_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|00|Q=0|0|opc=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x4401A000) {\n\t\tdecode_fields32(ENC_URSQRTE_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_URSQRTE_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* ursra_z_zi.xml */\nint ursra_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|1110|R=1|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500EC00) {\n\t\tdecode_fields32(ENC_URSRA_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_URSRA_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* usdot_z_zzz.xml */\nint usdot_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000100|size=10|0|Zm=xxxxx|011110|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44807800) {\n\t\tdecode_fields32(ENC_USDOT_Z_ZZZ_S, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_USDOT_Z_ZZZ_S);\n\t}\n\treturn rc;\n}\n\n/* usdot_z_zzzi.xml */\nint usdot_z_zzzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000100|size=10|1|i2=xx|Zm=xxx|00011|U=0|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x44A01800) {\n\t\tdecode_fields32(ENC_USDOT_Z_ZZZI_S, ctx, instr);\n\t\tif((!HaveSVE() && !HaveSME()) || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->index = UINT(ctx->i2);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tOK(ENC_USDOT_Z_ZZZI_S);\n\t}\n\treturn rc;\n}\n\n/* ushllb_z_zi.xml */\nint ushllb_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|0|tszl=xx|imm3=xxx|1010|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500A800) {\n\t\tdecode_fields32(ENC_USHLLB_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_USHLLB_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* ushllt_z_zi.xml */\nint ushllt_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 010001010|tszh=x|0|tszl=xx|imm3=xxx|1010|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFA0FC00)==0x4500AC00) {\n\t\tdecode_fields32(ENC_USHLLT_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&6)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&4)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->shift = UINT(((ctx->tsize<<3)|ctx->imm3))-ctx->esize;\n\t\tOK(ENC_USHLLT_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* usmmla_z_zzz.xml */\nint usmmla_z_zzz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 01000101|uns=10|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x45809800) {\n\t\tdecode_fields32(ENC_USMMLA_Z_ZZZ_, ctx, instr);\n\t\tif(!HaveSVE() || !HaveInt8MatMulExt()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_USMMLA_Z_ZZZ_);\n\t}\n\treturn rc;\n}\n\n/* usmopa_za_pp_zz.xml */\nint usmopa_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=1|10|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA1800000) {\n\t\tdecode_fields32(ENC_USMOPA_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_USMOPA_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=1|11|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=0|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA1C00000) {\n\t\tdecode_fields32(ENC_USMOPA_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = FALSE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_USMOPA_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* usmops_za_pp_zz.xml */\nint usmops_za_pp_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_per_word */\n\t/* 10|10000|u0=1|10|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|0|ZAda=xx */\n\tif((INSWORD & 0xFFE0001C)==0xA1800010) {\n\t\tdecode_fields32(ENC_USMOPS_ZA_PP_ZZ_32, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x20;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_USMOPS_ZA_PP_ZZ_32);\n\t}\n\t/* class iclass_per_doubleword */\n\t/* 10|10000|u0=1|11|u1=0|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=1|0|ZAda=xxx */\n\tif((INSWORD & 0xFFE00018)==0xA1C00010) {\n\t\tdecode_fields32(ENC_USMOPS_ZA_PP_ZZ_64, ctx, instr);\n\t\tif(!HaveSMEI16I64()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x40;\n\t\tctx->a = UINT(ctx->Pn);\n\t\tctx->b = UINT(ctx->Pm);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->da = UINT(ctx->ZAda);\n\t\tctx->sub_op = TRUE;\n\t\tctx->op1_unsigned = TRUE;\n\t\tctx->op2_unsigned = FALSE;\n\t\tOK(ENC_USMOPS_ZA_PP_ZZ_64);\n\t}\n\treturn rc;\n}\n\n/* usqadd_z_p_zz.xml */\nint usqadd_z_p_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000100|size=xx|011|op=1|S=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x441D8000) {\n\t\tdecode_fields32(ENC_USQADD_Z_P_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tOK(ENC_USQADD_Z_P_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* usra_z_zi.xml */\nint usra_z_zi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|tszh=xx|0|tszl=xx|imm3=xxx|1110|R=0|U=1|Zn=xxxxx|Zda=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4500E400) {\n\t\tdecode_fields32(ENC_USRA_Z_ZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->da = UINT(ctx->Zda);\n\t\tctx->shift = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_USRA_Z_ZI_);\n\t}\n\treturn rc;\n}\n\n/* usublb_z_zz.xml */\nint usublb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=1|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45001800) {\n\t\tdecode_fields32(ENC_USUBLB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 0;\n\t\tctx->sel2 = 0;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_USUBLB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* usublt_z_zz.xml */\nint usublt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|00|op=0|S=1|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45001C00) {\n\t\tdecode_fields32(ENC_USUBLT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->sel1 = 1;\n\t\tctx->sel2 = 1;\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_USUBLT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* usubwb_z_zz.xml */\nint usubwb_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=1|U=1|T=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45005800) {\n\t\tdecode_fields32(ENC_USUBWB_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_USUBWB_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* usubwt_z_zz.xml */\nint usubwt_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 01000101|size=xx|0|Zm=xxxxx|010|S=1|U=1|T=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x45005C00) {\n\t\tdecode_fields32(ENC_USUBWT_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tOK(ENC_USUBWT_Z_ZZ_);\n\t}\n\treturn rc;\n}\n\n/* uunpkhi_z_z.xml */\nint uunpkhi_z_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_high_half */\n\t/* 00000101|size=xx|1100|U=1|H=1|001110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5333800) {\n\t\tdecode_fields32(ENC_UUNPKHI_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->hi = TRUE;\n\t\tOK(ENC_UUNPKHI_Z_Z_);\n\t}\n\t/* class iclass_sve_low_half */\n\t/* 00000101|size=xx|1100|U=1|H=0|001110|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FFC00)==0x5323800) {\n\t\tdecode_fields32(ENC_UUNPKLO_Z_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->hi = FALSE;\n\t\tOK(ENC_UUNPKLO_Z_Z_);\n\t}\n\treturn rc;\n}\n\n/* uxtb_z_p_z.xml */\nint uxtb_z_p_z(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_esize_byte */\n\t/* 00000100|size=xx|010|00|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x411A000) {\n\t\tdecode_fields32(ENC_UXTB_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size==0) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 8;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UXTB_Z_P_Z_);\n\t}\n\t/* class iclass_esize_halfword */\n\t/* 00000100|size=xx|010|01|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x413A000) {\n\t\tdecode_fields32(ENC_UXTH_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif((ctx->size&2)!=2) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 0x10;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UXTH_Z_P_Z_);\n\t}\n\t/* class iclass_esize_word */\n\t/* 00000100|size=xx|010|10|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF3FE000)==0x415A000) {\n\t\tdecode_fields32(ENC_UXTW_Z_P_Z_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tif(ctx->size!=3) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->s_esize = 0x20;\n\t\tctx->g = UINT(ctx->Pg);\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->unsigned_ = TRUE;\n\t\tOK(ENC_UXTW_Z_P_Z_);\n\t}\n\treturn rc;\n}\n\n/* uzp1_p_pp.xml */\nint uzp1_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_even */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=01|H=0|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5204800) {\n\t\tdecode_fields32(ENC_UZP1_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 0;\n\t\tOK(ENC_UZP1_P_PP_);\n\t}\n\t/* class iclass_sve_odd */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=01|H=1|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5204C00) {\n\t\tdecode_fields32(ENC_UZP2_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 1;\n\t\tOK(ENC_UZP2_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* uzp1_z_zz.xml */\nint uzp1_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_even */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|01|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5206800) {\n\t\tdecode_fields32(ENC_UZP1_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_UZP1_Z_ZZ_);\n\t}\n\t/* class iclass_sve_even_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|01|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A00800) {\n\t\tdecode_fields32(ENC_UZP1_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_UZP1_Z_ZZ_Q);\n\t}\n\t/* class iclass_sve_odd */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|01|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5206C00) {\n\t\tdecode_fields32(ENC_UZP2_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_UZP2_Z_ZZ_);\n\t}\n\t/* class iclass_sve_odd_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|01|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A00C00) {\n\t\tdecode_fields32(ENC_UZP2_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_UZP2_Z_ZZ_Q);\n\t}\n\treturn rc;\n}\n\n/* whilege_p_p_rr.xml */\nint whilege_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=0|Rn=xxxxx|eq=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200000) {\n\t\tdecode_fields32(ENC_WHILEGE_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->op = Cmp_GE;\n\t\tOK(ENC_WHILEGE_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilegt_p_p_rr.xml */\nint whilegt_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=0|Rn=xxxxx|eq=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200010) {\n\t\tdecode_fields32(ENC_WHILEGT_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->op = Cmp_GT;\n\t\tOK(ENC_WHILEGT_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilehi_p_p_rr.xml */\nint whilehi_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=0|Rn=xxxxx|eq=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200810) {\n\t\tdecode_fields32(ENC_WHILEHI_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->op = Cmp_GT;\n\t\tOK(ENC_WHILEHI_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilehs_p_p_rr.xml */\nint whilehs_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=0|Rn=xxxxx|eq=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200800) {\n\t\tdecode_fields32(ENC_WHILEHS_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->op = Cmp_GE;\n\t\tOK(ENC_WHILEHS_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilele_p_p_rr.xml */\nint whilele_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=1|Rn=xxxxx|eq=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200410) {\n\t\tdecode_fields32(ENC_WHILELE_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->op = Cmp_LE;\n\t\tOK(ENC_WHILELE_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilelo_p_p_rr.xml */\nint whilelo_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=1|Rn=xxxxx|eq=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200C00) {\n\t\tdecode_fields32(ENC_WHILELO_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->op = Cmp_LT;\n\t\tOK(ENC_WHILELO_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilels_p_p_rr.xml */\nint whilels_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=1|Rn=xxxxx|eq=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200C10) {\n\t\tdecode_fields32(ENC_WHILELS_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = TRUE;\n\t\tctx->op = Cmp_LE;\n\t\tOK(ENC_WHILELS_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilelt_p_p_rr.xml */\nint whilelt_p_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=1|Rn=xxxxx|eq=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20EC10)==0x25200400) {\n\t\tdecode_fields32(ENC_WHILELT_P_P_RR_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->rsize = (0x20) << (UINT(ctx->sf));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->unsigned_ = FALSE;\n\t\tctx->op = Cmp_LT;\n\t\tOK(ENC_WHILELT_P_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilerw_p_rr.xml */\nint whilerw_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|001100|Rn=xxxxx|rw=1|Pd=xxxx */\n\tif((INSWORD & 0xFF20FC10)==0x25203010) {\n\t\tdecode_fields32(ENC_WHILERW_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tOK(ENC_WHILERW_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* whilewr_p_rr.xml */\nint whilewr_p_rr(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00100101|size=xx|1|Rm=xxxxx|001100|Rn=xxxxx|rw=0|Pd=xxxx */\n\tif((INSWORD & 0xFF20FC10)==0x25203000) {\n\t\tdecode_fields32(ENC_WHILEWR_P_RR_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Rn);\n\t\tctx->m = UINT(ctx->Rm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tOK(ENC_WHILEWR_P_RR_);\n\t}\n\treturn rc;\n}\n\n/* wrffr_f_p.xml */\nint wrffr_f_p(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve */\n\t/* 00|100101|opc=00|10|1000100100|0|Pn=xxxx|0|0|0|00 */\n\tif((INSWORD & 0xFFFFFE1F)==0x25289000) {\n\t\tdecode_fields32(ENC_WRFFR_F_P_, ctx, instr);\n\t\tif(!HaveSVE()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->n = UINT(ctx->Pn);\n\t\tOK(ENC_WRFFR_F_P_);\n\t}\n\treturn rc;\n}\n\n/* xar_z_zzi.xml */\nint xar_z_zzi(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve2 */\n\t/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|001101|Zm=xxxxx|Zdn=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x4203400) {\n\t\tdecode_fields32(ENC_XAR_Z_ZZI_, ctx, instr);\n\t\tif(!HaveSVE2() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->tsize = ((ctx->tszh<<2)|ctx->tszl);\n\t\tif(!ctx->tsize) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\telse if(ctx->tsize==1) {\n\t\t\tctx->esize = 8;\n\t\t}\n\t\telse if((ctx->tsize&14)==2) {\n\t\t\tctx->esize = 0x10;\n\t\t}\n\t\telse if((ctx->tsize&12)==4) {\n\t\t\tctx->esize = 0x20;\n\t\t}\n\t\telse if((ctx->tsize&8)==8) {\n\t\t\tctx->esize = 0x40;\n\t\t}\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->dn = UINT(ctx->Zdn);\n\t\tctx->rot = ((2) * (ctx->esize))-UINT(((ctx->tsize<<3)|ctx->imm3));\n\t\tOK(ENC_XAR_Z_ZZI_);\n\t}\n\treturn rc;\n}\n\n/* zero_za_i.xml */\nint zero_za_i(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_mortlach */\n\t/* 1100000000001000000000|00|imm8=xxxxxxxx */\n\tif((INSWORD & 0xFFFFFF00)==0xC0080000) {\n\t\tdecode_fields32(ENC_ZERO_ZA_I_, ctx, instr);\n\t\tif(!HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->mask = ctx->imm8;\n\t\tctx->esize = 0x40;\n\t\tOK(ENC_ZERO_ZA_I_);\n\t}\n\treturn rc;\n}\n\n/* zip1_p_pp.xml */\nint zip1_p_pp(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_high_halves */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=00|H=1|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5204400) {\n\t\tdecode_fields32(ENC_ZIP2_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 1;\n\t\tOK(ENC_ZIP2_P_PP_);\n\t}\n\t/* class iclass_sve_low_halves */\n\t/* 00000101|size=xx|10|Pm=xxxx|010|opc=00|H=0|0|Pn=xxxx|0|Pd=xxxx */\n\tif((INSWORD & 0xFF30FE10)==0x5204000) {\n\t\tdecode_fields32(ENC_ZIP1_P_PP_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Pn);\n\t\tctx->m = UINT(ctx->Pm);\n\t\tctx->d = UINT(ctx->Pd);\n\t\tctx->part = 0;\n\t\tOK(ENC_ZIP1_P_PP_);\n\t}\n\treturn rc;\n}\n\n/* zip1_z_zz.xml */\nint zip1_z_zz(context *ctx, Instruction *instr)\n{\n\tint rc = DECODE_STATUS_UNMATCHED;\n\t/* class iclass_sve_high_halves */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|00|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5206400) {\n\t\tdecode_fields32(ENC_ZIP2_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_ZIP2_Z_ZZ_);\n\t}\n\t/* class iclass_sve_high_halves_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|00|H=1|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A00400) {\n\t\tdecode_fields32(ENC_ZIP2_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 1;\n\t\tOK(ENC_ZIP2_Z_ZZ_Q);\n\t}\n\t/* class iclass_sve_low_halves */\n\t/* 00000101|size=xx|1|Zm=xxxxx|011|00|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFF20FC00)==0x5206000) {\n\t\tdecode_fields32(ENC_ZIP1_Z_ZZ_, ctx, instr);\n\t\tif(!HaveSVE() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = (8) << (UINT(ctx->size));\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_ZIP1_Z_ZZ_);\n\t}\n\t/* class iclass_sve_low_halves_quad */\n\t/* 000001011|op=0|1|Zm=xxxxx|000|00|H=0|Zn=xxxxx|Zd=xxxxx */\n\tif((INSWORD & 0xFFE0FC00)==0x5A00000) {\n\t\tdecode_fields32(ENC_ZIP1_Z_ZZ_Q, ctx, instr);\n\t\tif(!HaveSVEFP64MatMulExt() && !HaveSME()) {\n\t\t\tUNDEFINED;\n\t\t}\n\t\tctx->esize = 0x80;\n\t\tctx->n = UINT(ctx->Zn);\n\t\tctx->m = UINT(ctx->Zm);\n\t\tctx->d = UINT(ctx->Zd);\n\t\tctx->part = 0;\n\t\tOK(ENC_ZIP1_Z_ZZ_Q);\n\t}\n\treturn rc;\n}\n\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode2.h",
    "content": "/* GENERATED FILE */\n#pragma once\nint ABS_advsimd(context *ctx, Instruction *instr);\nint ADC(context *ctx, Instruction *instr);\nint ADCS(context *ctx, Instruction *instr);\nint ADDG(context *ctx, Instruction *instr);\nint ADDHN_advsimd(context *ctx, Instruction *instr);\nint ADDP_advsimd_pair(context *ctx, Instruction *instr);\nint ADDP_advsimd_vec(context *ctx, Instruction *instr);\nint ADDS_addsub_ext(context *ctx, Instruction *instr);\nint ADDS_addsub_imm(context *ctx, Instruction *instr);\nint ADDS_addsub_shift(context *ctx, Instruction *instr);\nint ADDV_advsimd(context *ctx, Instruction *instr);\nint ADD_addsub_ext(context *ctx, Instruction *instr);\nint ADD_addsub_imm(context *ctx, Instruction *instr);\nint ADD_addsub_shift(context *ctx, Instruction *instr);\nint ADD_advsimd(context *ctx, Instruction *instr);\nint ADR(context *ctx, Instruction *instr);\nint ADRP(context *ctx, Instruction *instr);\nint AESD_advsimd(context *ctx, Instruction *instr);\nint AESE_advsimd(context *ctx, Instruction *instr);\nint AESIMC_advsimd(context *ctx, Instruction *instr);\nint AESMC_advsimd(context *ctx, Instruction *instr);\nint ANDS_log_imm(context *ctx, Instruction *instr);\nint ANDS_log_shift(context *ctx, Instruction *instr);\nint AND_advsimd(context *ctx, Instruction *instr);\nint AND_log_imm(context *ctx, Instruction *instr);\nint AND_log_shift(context *ctx, Instruction *instr);\nint ASRV(context *ctx, Instruction *instr);\nint ASR_ASRV(context *ctx, Instruction *instr);\nint ASR_SBFM(context *ctx, Instruction *instr);\nint AT_SYS(context *ctx, Instruction *instr);\nint AUTDA(context *ctx, Instruction *instr);\nint AUTDB(context *ctx, Instruction *instr);\nint AUTIA(context *ctx, Instruction *instr);\nint AUTIB(context *ctx, Instruction *instr);\nint AXFLAG(context *ctx, Instruction *instr);\nint BCAX_advsimd(context *ctx, Instruction *instr);\nint BFCVTN_advsimd(context *ctx, Instruction *instr);\nint BFCVT_float(context *ctx, Instruction *instr);\nint BFC_BFM(context *ctx, Instruction *instr);\nint BFDOT_advsimd_elt(context *ctx, Instruction *instr);\nint BFDOT_advsimd_vec(context *ctx, Instruction *instr);\nint BFI_BFM(context *ctx, Instruction *instr);\nint BFM(context *ctx, Instruction *instr);\nint BFMLAL_advsimd_elt(context *ctx, Instruction *instr);\nint BFMLAL_advsimd_vec(context *ctx, Instruction *instr);\nint BFMMLA_advsimd(context *ctx, Instruction *instr);\nint BFXIL_BFM(context *ctx, Instruction *instr);\nint BICS(context *ctx, Instruction *instr);\nint BIC_advsimd_imm(context *ctx, Instruction *instr);\nint BIC_advsimd_reg(context *ctx, Instruction *instr);\nint BIC_and_z_zi(context *ctx, Instruction *instr);\nint BIC_log_shift(context *ctx, Instruction *instr);\nint BIF_advsimd(context *ctx, Instruction *instr);\nint BIT_advsimd(context *ctx, Instruction *instr);\nint BL(context *ctx, Instruction *instr);\nint BLR(context *ctx, Instruction *instr);\nint BLRA(context *ctx, Instruction *instr);\nint BR(context *ctx, Instruction *instr);\nint BRA(context *ctx, Instruction *instr);\nint BRK(context *ctx, Instruction *instr);\nint BSL_advsimd(context *ctx, Instruction *instr);\nint BTI(context *ctx, Instruction *instr);\nint B_cond(context *ctx, Instruction *instr);\nint B_uncond(context *ctx, Instruction *instr);\nint CAS(context *ctx, Instruction *instr);\nint CASB(context *ctx, Instruction *instr);\nint CASH(context *ctx, Instruction *instr);\nint CASP(context *ctx, Instruction *instr);\nint CBNZ(context *ctx, Instruction *instr);\nint CBZ(context *ctx, Instruction *instr);\nint CCMN_imm(context *ctx, Instruction *instr);\nint CCMN_reg(context *ctx, Instruction *instr);\nint CCMP_imm(context *ctx, Instruction *instr);\nint CCMP_reg(context *ctx, Instruction *instr);\nint CFINV(context *ctx, Instruction *instr);\nint CFP_SYS(context *ctx, Instruction *instr);\nint CINC_CSINC(context *ctx, Instruction *instr);\nint CINV_CSINV(context *ctx, Instruction *instr);\nint CLREX(context *ctx, Instruction *instr);\nint CLS_advsimd(context *ctx, Instruction *instr);\nint CLS_int(context *ctx, Instruction *instr);\nint CLZ_advsimd(context *ctx, Instruction *instr);\nint CLZ_int(context *ctx, Instruction *instr);\nint CMEQ_advsimd_reg(context *ctx, Instruction *instr);\nint CMEQ_advsimd_zero(context *ctx, Instruction *instr);\nint CMGE_advsimd_reg(context *ctx, Instruction *instr);\nint CMGE_advsimd_zero(context *ctx, Instruction *instr);\nint CMGT_advsimd_reg(context *ctx, Instruction *instr);\nint CMGT_advsimd_zero(context *ctx, Instruction *instr);\nint CMHI_advsimd(context *ctx, Instruction *instr);\nint CMHS_advsimd(context *ctx, Instruction *instr);\nint CMLE_advsimd(context *ctx, Instruction *instr);\nint CMLT_advsimd(context *ctx, Instruction *instr);\nint CMN_ADDS_addsub_ext(context *ctx, Instruction *instr);\nint CMN_ADDS_addsub_imm(context *ctx, Instruction *instr);\nint CMN_ADDS_addsub_shift(context *ctx, Instruction *instr);\nint CMPLE_cmpeq_p_p_zz(context *ctx, Instruction *instr);\nint CMPLO_cmpeq_p_p_zz(context *ctx, Instruction *instr);\nint CMPLS_cmpeq_p_p_zz(context *ctx, Instruction *instr);\nint CMPLT_cmpeq_p_p_zz(context *ctx, Instruction *instr);\nint CMPP_SUBPS(context *ctx, Instruction *instr);\nint CMP_SUBS_addsub_ext(context *ctx, Instruction *instr);\nint CMP_SUBS_addsub_imm(context *ctx, Instruction *instr);\nint CMP_SUBS_addsub_shift(context *ctx, Instruction *instr);\nint CMTST_advsimd(context *ctx, Instruction *instr);\nint CNEG_CSNEG(context *ctx, Instruction *instr);\nint CNT_advsimd(context *ctx, Instruction *instr);\nint CPP_SYS(context *ctx, Instruction *instr);\nint CRC32(context *ctx, Instruction *instr);\nint CRC32C(context *ctx, Instruction *instr);\nint CSDB(context *ctx, Instruction *instr);\nint CSEL(context *ctx, Instruction *instr);\nint CSETM_CSINV(context *ctx, Instruction *instr);\nint CSET_CSINC(context *ctx, Instruction *instr);\nint CSINC(context *ctx, Instruction *instr);\nint CSINV(context *ctx, Instruction *instr);\nint CSNEG(context *ctx, Instruction *instr);\nint DCPS1(context *ctx, Instruction *instr);\nint DCPS2(context *ctx, Instruction *instr);\nint DCPS3(context *ctx, Instruction *instr);\nint DC_SYS(context *ctx, Instruction *instr);\nint DGH(context *ctx, Instruction *instr);\nint DMB(context *ctx, Instruction *instr);\nint DRPS(context *ctx, Instruction *instr);\nint DSB(context *ctx, Instruction *instr);\nint DUP_advsimd_elt(context *ctx, Instruction *instr);\nint DUP_advsimd_gen(context *ctx, Instruction *instr);\nint DVP_SYS(context *ctx, Instruction *instr);\nint EON(context *ctx, Instruction *instr);\nint EON_eor_z_zi(context *ctx, Instruction *instr);\nint EOR3_advsimd(context *ctx, Instruction *instr);\nint EOR_advsimd(context *ctx, Instruction *instr);\nint EOR_log_imm(context *ctx, Instruction *instr);\nint EOR_log_shift(context *ctx, Instruction *instr);\nint ERET(context *ctx, Instruction *instr);\nint ERETA(context *ctx, Instruction *instr);\nint ESB(context *ctx, Instruction *instr);\nint EXTR(context *ctx, Instruction *instr);\nint EXT_advsimd(context *ctx, Instruction *instr);\nint FABD_advsimd(context *ctx, Instruction *instr);\nint FABS_advsimd(context *ctx, Instruction *instr);\nint FABS_float(context *ctx, Instruction *instr);\nint FACGE_advsimd(context *ctx, Instruction *instr);\nint FACGT_advsimd(context *ctx, Instruction *instr);\nint FACLE_facge_p_p_zz(context *ctx, Instruction *instr);\nint FACLT_facge_p_p_zz(context *ctx, Instruction *instr);\nint FADDP_advsimd_pair(context *ctx, Instruction *instr);\nint FADDP_advsimd_vec(context *ctx, Instruction *instr);\nint FADD_advsimd(context *ctx, Instruction *instr);\nint FADD_float(context *ctx, Instruction *instr);\nint FCADD_advsimd_vec(context *ctx, Instruction *instr);\nint FCCMPE_float(context *ctx, Instruction *instr);\nint FCCMP_float(context *ctx, Instruction *instr);\nint FCMEQ_advsimd_reg(context *ctx, Instruction *instr);\nint FCMEQ_advsimd_zero(context *ctx, Instruction *instr);\nint FCMGE_advsimd_reg(context *ctx, Instruction *instr);\nint FCMGE_advsimd_zero(context *ctx, Instruction *instr);\nint FCMGT_advsimd_reg(context *ctx, Instruction *instr);\nint FCMGT_advsimd_zero(context *ctx, Instruction *instr);\nint FCMLA_advsimd_elt(context *ctx, Instruction *instr);\nint FCMLA_advsimd_vec(context *ctx, Instruction *instr);\nint FCMLE_advsimd(context *ctx, Instruction *instr);\nint FCMLE_fcmeq_p_p_zz(context *ctx, Instruction *instr);\nint FCMLT_advsimd(context *ctx, Instruction *instr);\nint FCMLT_fcmeq_p_p_zz(context *ctx, Instruction *instr);\nint FCMPE_float(context *ctx, Instruction *instr);\nint FCMP_float(context *ctx, Instruction *instr);\nint FCSEL_float(context *ctx, Instruction *instr);\nint FCVTAS_advsimd(context *ctx, Instruction *instr);\nint FCVTAS_float(context *ctx, Instruction *instr);\nint FCVTAU_advsimd(context *ctx, Instruction *instr);\nint FCVTAU_float(context *ctx, Instruction *instr);\nint FCVTL_advsimd(context *ctx, Instruction *instr);\nint FCVTMS_advsimd(context *ctx, Instruction *instr);\nint FCVTMS_float(context *ctx, Instruction *instr);\nint FCVTMU_advsimd(context *ctx, Instruction *instr);\nint FCVTMU_float(context *ctx, Instruction *instr);\nint FCVTNS_advsimd(context *ctx, Instruction *instr);\nint FCVTNS_float(context *ctx, Instruction *instr);\nint FCVTNU_advsimd(context *ctx, Instruction *instr);\nint FCVTNU_float(context *ctx, Instruction *instr);\nint FCVTN_advsimd(context *ctx, Instruction *instr);\nint FCVTPS_advsimd(context *ctx, Instruction *instr);\nint FCVTPS_float(context *ctx, Instruction *instr);\nint FCVTPU_advsimd(context *ctx, Instruction *instr);\nint FCVTPU_float(context *ctx, Instruction *instr);\nint FCVTXN_advsimd(context *ctx, Instruction *instr);\nint FCVTZS_advsimd_fix(context *ctx, Instruction *instr);\nint FCVTZS_advsimd_int(context *ctx, Instruction *instr);\nint FCVTZS_float_fix(context *ctx, Instruction *instr);\nint FCVTZS_float_int(context *ctx, Instruction *instr);\nint FCVTZU_advsimd_fix(context *ctx, Instruction *instr);\nint FCVTZU_advsimd_int(context *ctx, Instruction *instr);\nint FCVTZU_float_fix(context *ctx, Instruction *instr);\nint FCVTZU_float_int(context *ctx, Instruction *instr);\nint FCVT_float(context *ctx, Instruction *instr);\nint FDIV_advsimd(context *ctx, Instruction *instr);\nint FDIV_float(context *ctx, Instruction *instr);\nint FJCVTZS(context *ctx, Instruction *instr);\nint FMADD_float(context *ctx, Instruction *instr);\nint FMAXNMP_advsimd_pair(context *ctx, Instruction *instr);\nint FMAXNMP_advsimd_vec(context *ctx, Instruction *instr);\nint FMAXNMV_advsimd(context *ctx, Instruction *instr);\nint FMAXNM_advsimd(context *ctx, Instruction *instr);\nint FMAXNM_float(context *ctx, Instruction *instr);\nint FMAXP_advsimd_pair(context *ctx, Instruction *instr);\nint FMAXP_advsimd_vec(context *ctx, Instruction *instr);\nint FMAXV_advsimd(context *ctx, Instruction *instr);\nint FMAX_advsimd(context *ctx, Instruction *instr);\nint FMAX_float(context *ctx, Instruction *instr);\nint FMINNMP_advsimd_pair(context *ctx, Instruction *instr);\nint FMINNMP_advsimd_vec(context *ctx, Instruction *instr);\nint FMINNMV_advsimd(context *ctx, Instruction *instr);\nint FMINNM_advsimd(context *ctx, Instruction *instr);\nint FMINNM_float(context *ctx, Instruction *instr);\nint FMINP_advsimd_pair(context *ctx, Instruction *instr);\nint FMINP_advsimd_vec(context *ctx, Instruction *instr);\nint FMINV_advsimd(context *ctx, Instruction *instr);\nint FMIN_advsimd(context *ctx, Instruction *instr);\nint FMIN_float(context *ctx, Instruction *instr);\nint FMLAL_advsimd_elt(context *ctx, Instruction *instr);\nint FMLAL_advsimd_vec(context *ctx, Instruction *instr);\nint FMLA_advsimd_elt(context *ctx, Instruction *instr);\nint FMLA_advsimd_vec(context *ctx, Instruction *instr);\nint FMLSL_advsimd_elt(context *ctx, Instruction *instr);\nint FMLSL_advsimd_vec(context *ctx, Instruction *instr);\nint FMLS_advsimd_elt(context *ctx, Instruction *instr);\nint FMLS_advsimd_vec(context *ctx, Instruction *instr);\nint FMOV_advsimd(context *ctx, Instruction *instr);\nint FMOV_cpy_z_p_i(context *ctx, Instruction *instr);\nint FMOV_dup_z_i(context *ctx, Instruction *instr);\nint FMOV_fcpy_z_p_i(context *ctx, Instruction *instr);\nint FMOV_fdup_z_i(context *ctx, Instruction *instr);\nint FMOV_float(context *ctx, Instruction *instr);\nint FMOV_float_gen(context *ctx, Instruction *instr);\nint FMOV_float_imm(context *ctx, Instruction *instr);\nint FMSUB_float(context *ctx, Instruction *instr);\nint FMULX_advsimd_elt(context *ctx, Instruction *instr);\nint FMULX_advsimd_vec(context *ctx, Instruction *instr);\nint FMUL_advsimd_elt(context *ctx, Instruction *instr);\nint FMUL_advsimd_vec(context *ctx, Instruction *instr);\nint FMUL_float(context *ctx, Instruction *instr);\nint FNEG_advsimd(context *ctx, Instruction *instr);\nint FNEG_float(context *ctx, Instruction *instr);\nint FNMADD_float(context *ctx, Instruction *instr);\nint FNMSUB_float(context *ctx, Instruction *instr);\nint FNMUL_float(context *ctx, Instruction *instr);\nint FRECPE_advsimd(context *ctx, Instruction *instr);\nint FRECPS_advsimd(context *ctx, Instruction *instr);\nint FRECPX_advsimd(context *ctx, Instruction *instr);\nint FRINT32X_advsimd(context *ctx, Instruction *instr);\nint FRINT32X_float(context *ctx, Instruction *instr);\nint FRINT32Z_advsimd(context *ctx, Instruction *instr);\nint FRINT32Z_float(context *ctx, Instruction *instr);\nint FRINT64X_advsimd(context *ctx, Instruction *instr);\nint FRINT64X_float(context *ctx, Instruction *instr);\nint FRINT64Z_advsimd(context *ctx, Instruction *instr);\nint FRINT64Z_float(context *ctx, Instruction *instr);\nint FRINTA_advsimd(context *ctx, Instruction *instr);\nint FRINTA_float(context *ctx, Instruction *instr);\nint FRINTI_advsimd(context *ctx, Instruction *instr);\nint FRINTI_float(context *ctx, Instruction *instr);\nint FRINTM_advsimd(context *ctx, Instruction *instr);\nint FRINTM_float(context *ctx, Instruction *instr);\nint FRINTN_advsimd(context *ctx, Instruction *instr);\nint FRINTN_float(context *ctx, Instruction *instr);\nint FRINTP_advsimd(context *ctx, Instruction *instr);\nint FRINTP_float(context *ctx, Instruction *instr);\nint FRINTX_advsimd(context *ctx, Instruction *instr);\nint FRINTX_float(context *ctx, Instruction *instr);\nint FRINTZ_advsimd(context *ctx, Instruction *instr);\nint FRINTZ_float(context *ctx, Instruction *instr);\nint FRSQRTE_advsimd(context *ctx, Instruction *instr);\nint FRSQRTS_advsimd(context *ctx, Instruction *instr);\nint FSQRT_advsimd(context *ctx, Instruction *instr);\nint FSQRT_float(context *ctx, Instruction *instr);\nint FSUB_advsimd(context *ctx, Instruction *instr);\nint FSUB_float(context *ctx, Instruction *instr);\nint GMI(context *ctx, Instruction *instr);\nint HINT(context *ctx, Instruction *instr);\nint HLT(context *ctx, Instruction *instr);\nint HVC(context *ctx, Instruction *instr);\nint IC_SYS(context *ctx, Instruction *instr);\nint INS_advsimd_elt(context *ctx, Instruction *instr);\nint INS_advsimd_gen(context *ctx, Instruction *instr);\nint IRG(context *ctx, Instruction *instr);\nint ISB(context *ctx, Instruction *instr);\nint LD1R_advsimd(context *ctx, Instruction *instr);\nint LD1_advsimd_mult(context *ctx, Instruction *instr);\nint LD1_advsimd_sngl(context *ctx, Instruction *instr);\nint LD2R_advsimd(context *ctx, Instruction *instr);\nint LD2_advsimd_mult(context *ctx, Instruction *instr);\nint LD2_advsimd_sngl(context *ctx, Instruction *instr);\nint LD3R_advsimd(context *ctx, Instruction *instr);\nint LD3_advsimd_mult(context *ctx, Instruction *instr);\nint LD3_advsimd_sngl(context *ctx, Instruction *instr);\nint LD4R_advsimd(context *ctx, Instruction *instr);\nint LD4_advsimd_mult(context *ctx, Instruction *instr);\nint LD4_advsimd_sngl(context *ctx, Instruction *instr);\nint LD64B(context *ctx, Instruction *instr);\nint LDADD(context *ctx, Instruction *instr);\nint LDADDB(context *ctx, Instruction *instr);\nint LDADDH(context *ctx, Instruction *instr);\nint LDAPR(context *ctx, Instruction *instr);\nint LDAPRB(context *ctx, Instruction *instr);\nint LDAPRH(context *ctx, Instruction *instr);\nint LDAPURB(context *ctx, Instruction *instr);\nint LDAPURH(context *ctx, Instruction *instr);\nint LDAPURSB(context *ctx, Instruction *instr);\nint LDAPURSH(context *ctx, Instruction *instr);\nint LDAPURSW(context *ctx, Instruction *instr);\nint LDAPUR_gen(context *ctx, Instruction *instr);\nint LDAR(context *ctx, Instruction *instr);\nint LDARB(context *ctx, Instruction *instr);\nint LDARH(context *ctx, Instruction *instr);\nint LDAXP(context *ctx, Instruction *instr);\nint LDAXR(context *ctx, Instruction *instr);\nint LDAXRB(context *ctx, Instruction *instr);\nint LDAXRH(context *ctx, Instruction *instr);\nint LDCLR(context *ctx, Instruction *instr);\nint LDCLRB(context *ctx, Instruction *instr);\nint LDCLRH(context *ctx, Instruction *instr);\nint LDEOR(context *ctx, Instruction *instr);\nint LDEORB(context *ctx, Instruction *instr);\nint LDEORH(context *ctx, Instruction *instr);\nint LDG(context *ctx, Instruction *instr);\nint LDGM(context *ctx, Instruction *instr);\nint LDLAR(context *ctx, Instruction *instr);\nint LDLARB(context *ctx, Instruction *instr);\nint LDLARH(context *ctx, Instruction *instr);\nint LDNP_fpsimd(context *ctx, Instruction *instr);\nint LDNP_gen(context *ctx, Instruction *instr);\nint LDPSW(context *ctx, Instruction *instr);\nint LDP_fpsimd(context *ctx, Instruction *instr);\nint LDP_gen(context *ctx, Instruction *instr);\nint LDRA(context *ctx, Instruction *instr);\nint LDRB_imm(context *ctx, Instruction *instr);\nint LDRB_reg(context *ctx, Instruction *instr);\nint LDRH_imm(context *ctx, Instruction *instr);\nint LDRH_reg(context *ctx, Instruction *instr);\nint LDRSB_imm(context *ctx, Instruction *instr);\nint LDRSB_reg(context *ctx, Instruction *instr);\nint LDRSH_imm(context *ctx, Instruction *instr);\nint LDRSH_reg(context *ctx, Instruction *instr);\nint LDRSW_imm(context *ctx, Instruction *instr);\nint LDRSW_lit(context *ctx, Instruction *instr);\nint LDRSW_reg(context *ctx, Instruction *instr);\nint LDR_imm_fpsimd(context *ctx, Instruction *instr);\nint LDR_imm_gen(context *ctx, Instruction *instr);\nint LDR_lit_fpsimd(context *ctx, Instruction *instr);\nint LDR_lit_gen(context *ctx, Instruction *instr);\nint LDR_reg_fpsimd(context *ctx, Instruction *instr);\nint LDR_reg_gen(context *ctx, Instruction *instr);\nint LDSET(context *ctx, Instruction *instr);\nint LDSETB(context *ctx, Instruction *instr);\nint LDSETH(context *ctx, Instruction *instr);\nint LDSMAX(context *ctx, Instruction *instr);\nint LDSMAXB(context *ctx, Instruction *instr);\nint LDSMAXH(context *ctx, Instruction *instr);\nint LDSMIN(context *ctx, Instruction *instr);\nint LDSMINB(context *ctx, Instruction *instr);\nint LDSMINH(context *ctx, Instruction *instr);\nint LDTR(context *ctx, Instruction *instr);\nint LDTRB(context *ctx, Instruction *instr);\nint LDTRH(context *ctx, Instruction *instr);\nint LDTRSB(context *ctx, Instruction *instr);\nint LDTRSH(context *ctx, Instruction *instr);\nint LDTRSW(context *ctx, Instruction *instr);\nint LDUMAX(context *ctx, Instruction *instr);\nint LDUMAXB(context *ctx, Instruction *instr);\nint LDUMAXH(context *ctx, Instruction *instr);\nint LDUMIN(context *ctx, Instruction *instr);\nint LDUMINB(context *ctx, Instruction *instr);\nint LDUMINH(context *ctx, Instruction *instr);\nint LDURB(context *ctx, Instruction *instr);\nint LDURH(context *ctx, Instruction *instr);\nint LDURSB(context *ctx, Instruction *instr);\nint LDURSH(context *ctx, Instruction *instr);\nint LDURSW(context *ctx, Instruction *instr);\nint LDUR_fpsimd(context *ctx, Instruction *instr);\nint LDUR_gen(context *ctx, Instruction *instr);\nint LDXP(context *ctx, Instruction *instr);\nint LDXR(context *ctx, Instruction *instr);\nint LDXRB(context *ctx, Instruction *instr);\nint LDXRH(context *ctx, Instruction *instr);\nint LSLV(context *ctx, Instruction *instr);\nint LSL_LSLV(context *ctx, Instruction *instr);\nint LSL_UBFM(context *ctx, Instruction *instr);\nint LSRV(context *ctx, Instruction *instr);\nint LSR_LSRV(context *ctx, Instruction *instr);\nint LSR_UBFM(context *ctx, Instruction *instr);\nint MADD(context *ctx, Instruction *instr);\nint MLA_advsimd_elt(context *ctx, Instruction *instr);\nint MLA_advsimd_vec(context *ctx, Instruction *instr);\nint MLS_advsimd_elt(context *ctx, Instruction *instr);\nint MLS_advsimd_vec(context *ctx, Instruction *instr);\nint MNEG_MSUB(context *ctx, Instruction *instr);\nint MOVI_advsimd(context *ctx, Instruction *instr);\nint MOVK(context *ctx, Instruction *instr);\nint MOVN(context *ctx, Instruction *instr);\nint MOVS_ands_p_p_pp(context *ctx, Instruction *instr);\nint MOVS_orrs_p_p_pp(context *ctx, Instruction *instr);\nint MOVZ(context *ctx, Instruction *instr);\nint MOV_ADD_addsub_imm(context *ctx, Instruction *instr);\nint MOV_DUP_advsimd_elt(context *ctx, Instruction *instr);\nint MOV_INS_advsimd_elt(context *ctx, Instruction *instr);\nint MOV_INS_advsimd_gen(context *ctx, Instruction *instr);\nint MOV_MOVN(context *ctx, Instruction *instr);\nint MOV_MOVZ(context *ctx, Instruction *instr);\nint MOV_ORR_advsimd_reg(context *ctx, Instruction *instr);\nint MOV_ORR_log_imm(context *ctx, Instruction *instr);\nint MOV_ORR_log_shift(context *ctx, Instruction *instr);\nint MOV_UMOV_advsimd(context *ctx, Instruction *instr);\nint MOV_and_p_p_pp(context *ctx, Instruction *instr);\nint MOV_cpy_z_o_i(context *ctx, Instruction *instr);\nint MOV_cpy_z_p_i(context *ctx, Instruction *instr);\nint MOV_cpy_z_p_r(context *ctx, Instruction *instr);\nint MOV_cpy_z_p_v(context *ctx, Instruction *instr);\nint MOV_dup_z_i(context *ctx, Instruction *instr);\nint MOV_dup_z_r(context *ctx, Instruction *instr);\nint MOV_dup_z_zi(context *ctx, Instruction *instr);\nint MOV_dupm_z_i(context *ctx, Instruction *instr);\nint MOV_mova_z_p_rza(context *ctx, Instruction *instr);\nint MOV_mova_za_p_rz(context *ctx, Instruction *instr);\nint MOV_orr_p_p_pp(context *ctx, Instruction *instr);\nint MOV_orr_z_zz(context *ctx, Instruction *instr);\nint MOV_sel_p_p_pp(context *ctx, Instruction *instr);\nint MOV_sel_z_p_zz(context *ctx, Instruction *instr);\nint MRS(context *ctx, Instruction *instr);\nint MSR_imm(context *ctx, Instruction *instr);\nint MSR_reg(context *ctx, Instruction *instr);\nint MSUB(context *ctx, Instruction *instr);\nint MUL_MADD(context *ctx, Instruction *instr);\nint MUL_advsimd_elt(context *ctx, Instruction *instr);\nint MUL_advsimd_vec(context *ctx, Instruction *instr);\nint MVNI_advsimd(context *ctx, Instruction *instr);\nint MVN_NOT_advsimd(context *ctx, Instruction *instr);\nint MVN_ORN_log_shift(context *ctx, Instruction *instr);\nint NEGS_SUBS_addsub_shift(context *ctx, Instruction *instr);\nint NEG_SUB_addsub_shift(context *ctx, Instruction *instr);\nint NEG_advsimd(context *ctx, Instruction *instr);\nint NGCS_SBCS(context *ctx, Instruction *instr);\nint NGC_SBC(context *ctx, Instruction *instr);\nint NOP(context *ctx, Instruction *instr);\nint NOTS_eors_p_p_pp(context *ctx, Instruction *instr);\nint NOT_advsimd(context *ctx, Instruction *instr);\nint NOT_eor_p_p_pp(context *ctx, Instruction *instr);\nint ORN_advsimd(context *ctx, Instruction *instr);\nint ORN_log_shift(context *ctx, Instruction *instr);\nint ORN_orr_z_zi(context *ctx, Instruction *instr);\nint ORR_advsimd_imm(context *ctx, Instruction *instr);\nint ORR_advsimd_reg(context *ctx, Instruction *instr);\nint ORR_log_imm(context *ctx, Instruction *instr);\nint ORR_log_shift(context *ctx, Instruction *instr);\nint PACDA(context *ctx, Instruction *instr);\nint PACDB(context *ctx, Instruction *instr);\nint PACGA(context *ctx, Instruction *instr);\nint PACIA(context *ctx, Instruction *instr);\nint PACIB(context *ctx, Instruction *instr);\nint PMULL_advsimd(context *ctx, Instruction *instr);\nint PMUL_advsimd(context *ctx, Instruction *instr);\nint PRFM_imm(context *ctx, Instruction *instr);\nint PRFM_lit(context *ctx, Instruction *instr);\nint PRFM_reg(context *ctx, Instruction *instr);\nint PRFUM(context *ctx, Instruction *instr);\nint PSB(context *ctx, Instruction *instr);\nint PSSBB_DSB(context *ctx, Instruction *instr);\nint RADDHN_advsimd(context *ctx, Instruction *instr);\nint RAX1_advsimd(context *ctx, Instruction *instr);\nint RBIT_advsimd(context *ctx, Instruction *instr);\nint RBIT_int(context *ctx, Instruction *instr);\nint RET(context *ctx, Instruction *instr);\nint RETA(context *ctx, Instruction *instr);\nint REV(context *ctx, Instruction *instr);\nint REV16_advsimd(context *ctx, Instruction *instr);\nint REV16_int(context *ctx, Instruction *instr);\nint REV32_advsimd(context *ctx, Instruction *instr);\nint REV32_int(context *ctx, Instruction *instr);\nint REV64_REV(context *ctx, Instruction *instr);\nint REV64_advsimd(context *ctx, Instruction *instr);\nint RMIF(context *ctx, Instruction *instr);\nint RORV(context *ctx, Instruction *instr);\nint ROR_EXTR(context *ctx, Instruction *instr);\nint ROR_RORV(context *ctx, Instruction *instr);\nint RSHRN_advsimd(context *ctx, Instruction *instr);\nint RSUBHN_advsimd(context *ctx, Instruction *instr);\nint SABAL_advsimd(context *ctx, Instruction *instr);\nint SABA_advsimd(context *ctx, Instruction *instr);\nint SABDL_advsimd(context *ctx, Instruction *instr);\nint SABD_advsimd(context *ctx, Instruction *instr);\nint SADALP_advsimd(context *ctx, Instruction *instr);\nint SADDLP_advsimd(context *ctx, Instruction *instr);\nint SADDLV_advsimd(context *ctx, Instruction *instr);\nint SADDL_advsimd(context *ctx, Instruction *instr);\nint SADDW_advsimd(context *ctx, Instruction *instr);\nint SB(context *ctx, Instruction *instr);\nint SBC(context *ctx, Instruction *instr);\nint SBCS(context *ctx, Instruction *instr);\nint SBFIZ_SBFM(context *ctx, Instruction *instr);\nint SBFM(context *ctx, Instruction *instr);\nint SBFX_SBFM(context *ctx, Instruction *instr);\nint SCVTF_advsimd_fix(context *ctx, Instruction *instr);\nint SCVTF_advsimd_int(context *ctx, Instruction *instr);\nint SCVTF_float_fix(context *ctx, Instruction *instr);\nint SCVTF_float_int(context *ctx, Instruction *instr);\nint SDIV(context *ctx, Instruction *instr);\nint SDOT_advsimd_elt(context *ctx, Instruction *instr);\nint SDOT_advsimd_vec(context *ctx, Instruction *instr);\nint SETF(context *ctx, Instruction *instr);\nint SEV(context *ctx, Instruction *instr);\nint SEVL(context *ctx, Instruction *instr);\nint SHA1C_advsimd(context *ctx, Instruction *instr);\nint SHA1H_advsimd(context *ctx, Instruction *instr);\nint SHA1M_advsimd(context *ctx, Instruction *instr);\nint SHA1P_advsimd(context *ctx, Instruction *instr);\nint SHA1SU0_advsimd(context *ctx, Instruction *instr);\nint SHA1SU1_advsimd(context *ctx, Instruction *instr);\nint SHA256H2_advsimd(context *ctx, Instruction *instr);\nint SHA256H_advsimd(context *ctx, Instruction *instr);\nint SHA256SU0_advsimd(context *ctx, Instruction *instr);\nint SHA256SU1_advsimd(context *ctx, Instruction *instr);\nint SHA512H2_advsimd(context *ctx, Instruction *instr);\nint SHA512H_advsimd(context *ctx, Instruction *instr);\nint SHA512SU0_advsimd(context *ctx, Instruction *instr);\nint SHA512SU1_advsimd(context *ctx, Instruction *instr);\nint SHADD_advsimd(context *ctx, Instruction *instr);\nint SHLL_advsimd(context *ctx, Instruction *instr);\nint SHL_advsimd(context *ctx, Instruction *instr);\nint SHRN_advsimd(context *ctx, Instruction *instr);\nint SHSUB_advsimd(context *ctx, Instruction *instr);\nint SLI_advsimd(context *ctx, Instruction *instr);\nint SM3PARTW1_advsimd(context *ctx, Instruction *instr);\nint SM3PARTW2_advsimd(context *ctx, Instruction *instr);\nint SM3SS1_advsimd(context *ctx, Instruction *instr);\nint SM3TT1A_advsimd(context *ctx, Instruction *instr);\nint SM3TT1B_advsimd(context *ctx, Instruction *instr);\nint SM3TT2A_advsimd(context *ctx, Instruction *instr);\nint SM3TT2B_advsimd(context *ctx, Instruction *instr);\nint SM4EKEY_advsimd(context *ctx, Instruction *instr);\nint SM4E_advsimd(context *ctx, Instruction *instr);\nint SMADDL(context *ctx, Instruction *instr);\nint SMAXP_advsimd(context *ctx, Instruction *instr);\nint SMAXV_advsimd(context *ctx, Instruction *instr);\nint SMAX_advsimd(context *ctx, Instruction *instr);\nint SMC(context *ctx, Instruction *instr);\nint SMINP_advsimd(context *ctx, Instruction *instr);\nint SMINV_advsimd(context *ctx, Instruction *instr);\nint SMIN_advsimd(context *ctx, Instruction *instr);\nint SMLAL_advsimd_elt(context *ctx, Instruction *instr);\nint SMLAL_advsimd_vec(context *ctx, Instruction *instr);\nint SMLSL_advsimd_elt(context *ctx, Instruction *instr);\nint SMLSL_advsimd_vec(context *ctx, Instruction *instr);\nint SMMLA_advsimd_vec(context *ctx, Instruction *instr);\nint SMNEGL_SMSUBL(context *ctx, Instruction *instr);\nint SMOV_advsimd(context *ctx, Instruction *instr);\nint SMSTART_MSR_imm(context *ctx, Instruction *instr);\nint SMSTOP_MSR_imm(context *ctx, Instruction *instr);\nint SMSUBL(context *ctx, Instruction *instr);\nint SMULH(context *ctx, Instruction *instr);\nint SMULL_SMADDL(context *ctx, Instruction *instr);\nint SMULL_advsimd_elt(context *ctx, Instruction *instr);\nint SMULL_advsimd_vec(context *ctx, Instruction *instr);\nint SQABS_advsimd(context *ctx, Instruction *instr);\nint SQADD_advsimd(context *ctx, Instruction *instr);\nint SQDMLAL_advsimd_elt(context *ctx, Instruction *instr);\nint SQDMLAL_advsimd_vec(context *ctx, Instruction *instr);\nint SQDMLSL_advsimd_elt(context *ctx, Instruction *instr);\nint SQDMLSL_advsimd_vec(context *ctx, Instruction *instr);\nint SQDMULH_advsimd_elt(context *ctx, Instruction *instr);\nint SQDMULH_advsimd_vec(context *ctx, Instruction *instr);\nint SQDMULL_advsimd_elt(context *ctx, Instruction *instr);\nint SQDMULL_advsimd_vec(context *ctx, Instruction *instr);\nint SQNEG_advsimd(context *ctx, Instruction *instr);\nint SQRDMLAH_advsimd_elt(context *ctx, Instruction *instr);\nint SQRDMLAH_advsimd_vec(context *ctx, Instruction *instr);\nint SQRDMLSH_advsimd_elt(context *ctx, Instruction *instr);\nint SQRDMLSH_advsimd_vec(context *ctx, Instruction *instr);\nint SQRDMULH_advsimd_elt(context *ctx, Instruction *instr);\nint SQRDMULH_advsimd_vec(context *ctx, Instruction *instr);\nint SQRSHL_advsimd(context *ctx, Instruction *instr);\nint SQRSHRN_advsimd(context *ctx, Instruction *instr);\nint SQRSHRUN_advsimd(context *ctx, Instruction *instr);\nint SQSHLU_advsimd(context *ctx, Instruction *instr);\nint SQSHL_advsimd_imm(context *ctx, Instruction *instr);\nint SQSHL_advsimd_reg(context *ctx, Instruction *instr);\nint SQSHRN_advsimd(context *ctx, Instruction *instr);\nint SQSHRUN_advsimd(context *ctx, Instruction *instr);\nint SQSUB_advsimd(context *ctx, Instruction *instr);\nint SQXTN_advsimd(context *ctx, Instruction *instr);\nint SQXTUN_advsimd(context *ctx, Instruction *instr);\nint SRHADD_advsimd(context *ctx, Instruction *instr);\nint SRI_advsimd(context *ctx, Instruction *instr);\nint SRSHL_advsimd(context *ctx, Instruction *instr);\nint SRSHR_advsimd(context *ctx, Instruction *instr);\nint SRSRA_advsimd(context *ctx, Instruction *instr);\nint SSBB_DSB(context *ctx, Instruction *instr);\nint SSHLL_advsimd(context *ctx, Instruction *instr);\nint SSHL_advsimd(context *ctx, Instruction *instr);\nint SSHR_advsimd(context *ctx, Instruction *instr);\nint SSRA_advsimd(context *ctx, Instruction *instr);\nint SSUBL_advsimd(context *ctx, Instruction *instr);\nint SSUBW_advsimd(context *ctx, Instruction *instr);\nint ST1_advsimd_mult(context *ctx, Instruction *instr);\nint ST1_advsimd_sngl(context *ctx, Instruction *instr);\nint ST2G(context *ctx, Instruction *instr);\nint ST2_advsimd_mult(context *ctx, Instruction *instr);\nint ST2_advsimd_sngl(context *ctx, Instruction *instr);\nint ST3_advsimd_mult(context *ctx, Instruction *instr);\nint ST3_advsimd_sngl(context *ctx, Instruction *instr);\nint ST4_advsimd_mult(context *ctx, Instruction *instr);\nint ST4_advsimd_sngl(context *ctx, Instruction *instr);\nint ST64B(context *ctx, Instruction *instr);\nint ST64BV(context *ctx, Instruction *instr);\nint ST64BV0(context *ctx, Instruction *instr);\nint STADDB_LDADDB(context *ctx, Instruction *instr);\nint STADDH_LDADDH(context *ctx, Instruction *instr);\nint STADD_LDADD(context *ctx, Instruction *instr);\nint STCLRB_LDCLRB(context *ctx, Instruction *instr);\nint STCLRH_LDCLRH(context *ctx, Instruction *instr);\nint STCLR_LDCLR(context *ctx, Instruction *instr);\nint STEORB_LDEORB(context *ctx, Instruction *instr);\nint STEORH_LDEORH(context *ctx, Instruction *instr);\nint STEOR_LDEOR(context *ctx, Instruction *instr);\nint STG(context *ctx, Instruction *instr);\nint STGM(context *ctx, Instruction *instr);\nint STGP(context *ctx, Instruction *instr);\nint STLLR(context *ctx, Instruction *instr);\nint STLLRB(context *ctx, Instruction *instr);\nint STLLRH(context *ctx, Instruction *instr);\nint STLR(context *ctx, Instruction *instr);\nint STLRB(context *ctx, Instruction *instr);\nint STLRH(context *ctx, Instruction *instr);\nint STLURB(context *ctx, Instruction *instr);\nint STLURH(context *ctx, Instruction *instr);\nint STLUR_gen(context *ctx, Instruction *instr);\nint STLXP(context *ctx, Instruction *instr);\nint STLXR(context *ctx, Instruction *instr);\nint STLXRB(context *ctx, Instruction *instr);\nint STLXRH(context *ctx, Instruction *instr);\nint STNP_fpsimd(context *ctx, Instruction *instr);\nint STNP_gen(context *ctx, Instruction *instr);\nint STP_fpsimd(context *ctx, Instruction *instr);\nint STP_gen(context *ctx, Instruction *instr);\nint STRB_imm(context *ctx, Instruction *instr);\nint STRB_reg(context *ctx, Instruction *instr);\nint STRH_imm(context *ctx, Instruction *instr);\nint STRH_reg(context *ctx, Instruction *instr);\nint STR_imm_fpsimd(context *ctx, Instruction *instr);\nint STR_imm_gen(context *ctx, Instruction *instr);\nint STR_reg_fpsimd(context *ctx, Instruction *instr);\nint STR_reg_gen(context *ctx, Instruction *instr);\nint STSETB_LDSETB(context *ctx, Instruction *instr);\nint STSETH_LDSETH(context *ctx, Instruction *instr);\nint STSET_LDSET(context *ctx, Instruction *instr);\nint STSMAXB_LDSMAXB(context *ctx, Instruction *instr);\nint STSMAXH_LDSMAXH(context *ctx, Instruction *instr);\nint STSMAX_LDSMAX(context *ctx, Instruction *instr);\nint STSMINB_LDSMINB(context *ctx, Instruction *instr);\nint STSMINH_LDSMINH(context *ctx, Instruction *instr);\nint STSMIN_LDSMIN(context *ctx, Instruction *instr);\nint STTR(context *ctx, Instruction *instr);\nint STTRB(context *ctx, Instruction *instr);\nint STTRH(context *ctx, Instruction *instr);\nint STUMAXB_LDUMAXB(context *ctx, Instruction *instr);\nint STUMAXH_LDUMAXH(context *ctx, Instruction *instr);\nint STUMAX_LDUMAX(context *ctx, Instruction *instr);\nint STUMINB_LDUMINB(context *ctx, Instruction *instr);\nint STUMINH_LDUMINH(context *ctx, Instruction *instr);\nint STUMIN_LDUMIN(context *ctx, Instruction *instr);\nint STURB(context *ctx, Instruction *instr);\nint STURH(context *ctx, Instruction *instr);\nint STUR_fpsimd(context *ctx, Instruction *instr);\nint STUR_gen(context *ctx, Instruction *instr);\nint STXP(context *ctx, Instruction *instr);\nint STXR(context *ctx, Instruction *instr);\nint STXRB(context *ctx, Instruction *instr);\nint STXRH(context *ctx, Instruction *instr);\nint STZ2G(context *ctx, Instruction *instr);\nint STZG(context *ctx, Instruction *instr);\nint STZGM(context *ctx, Instruction *instr);\nint SUBG(context *ctx, Instruction *instr);\nint SUBHN_advsimd(context *ctx, Instruction *instr);\nint SUBP(context *ctx, Instruction *instr);\nint SUBPS(context *ctx, Instruction *instr);\nint SUBS_addsub_ext(context *ctx, Instruction *instr);\nint SUBS_addsub_imm(context *ctx, Instruction *instr);\nint SUBS_addsub_shift(context *ctx, Instruction *instr);\nint SUB_addsub_ext(context *ctx, Instruction *instr);\nint SUB_addsub_imm(context *ctx, Instruction *instr);\nint SUB_addsub_shift(context *ctx, Instruction *instr);\nint SUB_advsimd(context *ctx, Instruction *instr);\nint SUDOT_advsimd_elt(context *ctx, Instruction *instr);\nint SUQADD_advsimd(context *ctx, Instruction *instr);\nint SVC(context *ctx, Instruction *instr);\nint SWP(context *ctx, Instruction *instr);\nint SWPB(context *ctx, Instruction *instr);\nint SWPH(context *ctx, Instruction *instr);\nint SXTB_SBFM(context *ctx, Instruction *instr);\nint SXTH_SBFM(context *ctx, Instruction *instr);\nint SXTL_SSHLL_advsimd(context *ctx, Instruction *instr);\nint SXTW_SBFM(context *ctx, Instruction *instr);\nint SYS(context *ctx, Instruction *instr);\nint SYSL(context *ctx, Instruction *instr);\nint TBL_advsimd(context *ctx, Instruction *instr);\nint TBNZ(context *ctx, Instruction *instr);\nint TBX_advsimd(context *ctx, Instruction *instr);\nint TBZ(context *ctx, Instruction *instr);\nint TCANCEL(context *ctx, Instruction *instr);\nint TCOMMIT(context *ctx, Instruction *instr);\nint TLBI_SYS(context *ctx, Instruction *instr);\nint TRN1_advsimd(context *ctx, Instruction *instr);\nint TRN2_advsimd(context *ctx, Instruction *instr);\nint TSB(context *ctx, Instruction *instr);\nint TSTART(context *ctx, Instruction *instr);\nint TST_ANDS_log_imm(context *ctx, Instruction *instr);\nint TST_ANDS_log_shift(context *ctx, Instruction *instr);\nint TTEST(context *ctx, Instruction *instr);\nint UABAL_advsimd(context *ctx, Instruction *instr);\nint UABA_advsimd(context *ctx, Instruction *instr);\nint UABDL_advsimd(context *ctx, Instruction *instr);\nint UABD_advsimd(context *ctx, Instruction *instr);\nint UADALP_advsimd(context *ctx, Instruction *instr);\nint UADDLP_advsimd(context *ctx, Instruction *instr);\nint UADDLV_advsimd(context *ctx, Instruction *instr);\nint UADDL_advsimd(context *ctx, Instruction *instr);\nint UADDW_advsimd(context *ctx, Instruction *instr);\nint UBFIZ_UBFM(context *ctx, Instruction *instr);\nint UBFM(context *ctx, Instruction *instr);\nint UBFX_UBFM(context *ctx, Instruction *instr);\nint UCVTF_advsimd_fix(context *ctx, Instruction *instr);\nint UCVTF_advsimd_int(context *ctx, Instruction *instr);\nint UCVTF_float_fix(context *ctx, Instruction *instr);\nint UCVTF_float_int(context *ctx, Instruction *instr);\nint UDF_perm_undef(context *ctx, Instruction *instr);\nint UDIV(context *ctx, Instruction *instr);\nint UDOT_advsimd_elt(context *ctx, Instruction *instr);\nint UDOT_advsimd_vec(context *ctx, Instruction *instr);\nint UHADD_advsimd(context *ctx, Instruction *instr);\nint UHSUB_advsimd(context *ctx, Instruction *instr);\nint UMADDL(context *ctx, Instruction *instr);\nint UMAXP_advsimd(context *ctx, Instruction *instr);\nint UMAXV_advsimd(context *ctx, Instruction *instr);\nint UMAX_advsimd(context *ctx, Instruction *instr);\nint UMINP_advsimd(context *ctx, Instruction *instr);\nint UMINV_advsimd(context *ctx, Instruction *instr);\nint UMIN_advsimd(context *ctx, Instruction *instr);\nint UMLAL_advsimd_elt(context *ctx, Instruction *instr);\nint UMLAL_advsimd_vec(context *ctx, Instruction *instr);\nint UMLSL_advsimd_elt(context *ctx, Instruction *instr);\nint UMLSL_advsimd_vec(context *ctx, Instruction *instr);\nint UMMLA_advsimd_vec(context *ctx, Instruction *instr);\nint UMNEGL_UMSUBL(context *ctx, Instruction *instr);\nint UMOV_advsimd(context *ctx, Instruction *instr);\nint UMSUBL(context *ctx, Instruction *instr);\nint UMULH(context *ctx, Instruction *instr);\nint UMULL_UMADDL(context *ctx, Instruction *instr);\nint UMULL_advsimd_elt(context *ctx, Instruction *instr);\nint UMULL_advsimd_vec(context *ctx, Instruction *instr);\nint UQADD_advsimd(context *ctx, Instruction *instr);\nint UQRSHL_advsimd(context *ctx, Instruction *instr);\nint UQRSHRN_advsimd(context *ctx, Instruction *instr);\nint UQSHL_advsimd_imm(context *ctx, Instruction *instr);\nint UQSHL_advsimd_reg(context *ctx, Instruction *instr);\nint UQSHRN_advsimd(context *ctx, Instruction *instr);\nint UQSUB_advsimd(context *ctx, Instruction *instr);\nint UQXTN_advsimd(context *ctx, Instruction *instr);\nint URECPE_advsimd(context *ctx, Instruction *instr);\nint URHADD_advsimd(context *ctx, Instruction *instr);\nint URSHL_advsimd(context *ctx, Instruction *instr);\nint URSHR_advsimd(context *ctx, Instruction *instr);\nint URSQRTE_advsimd(context *ctx, Instruction *instr);\nint URSRA_advsimd(context *ctx, Instruction *instr);\nint USDOT_advsimd_elt(context *ctx, Instruction *instr);\nint USDOT_advsimd_vec(context *ctx, Instruction *instr);\nint USHLL_advsimd(context *ctx, Instruction *instr);\nint USHL_advsimd(context *ctx, Instruction *instr);\nint USHR_advsimd(context *ctx, Instruction *instr);\nint USMMLA_advsimd_vec(context *ctx, Instruction *instr);\nint USQADD_advsimd(context *ctx, Instruction *instr);\nint USRA_advsimd(context *ctx, Instruction *instr);\nint USUBL_advsimd(context *ctx, Instruction *instr);\nint USUBW_advsimd(context *ctx, Instruction *instr);\nint UXTB_UBFM(context *ctx, Instruction *instr);\nint UXTH_UBFM(context *ctx, Instruction *instr);\nint UXTL_USHLL_advsimd(context *ctx, Instruction *instr);\nint UZP1_advsimd(context *ctx, Instruction *instr);\nint UZP2_advsimd(context *ctx, Instruction *instr);\nint WFE(context *ctx, Instruction *instr);\nint WFET(context *ctx, Instruction *instr);\nint WFI(context *ctx, Instruction *instr);\nint WFIT(context *ctx, Instruction *instr);\nint XAFLAG(context *ctx, Instruction *instr);\nint XAR_advsimd(context *ctx, Instruction *instr);\nint XPAC(context *ctx, Instruction *instr);\nint XTN_advsimd(context *ctx, Instruction *instr);\nint YIELD(context *ctx, Instruction *instr);\nint ZIP1_advsimd(context *ctx, Instruction *instr);\nint ZIP2_advsimd(context *ctx, Instruction *instr);\nint abs_z_p_z(context *ctx, Instruction *instr);\nint adclb_z_zzz(context *ctx, Instruction *instr);\nint adclt_z_zzz(context *ctx, Instruction *instr);\nint add_z_p_zz(context *ctx, Instruction *instr);\nint add_z_zi(context *ctx, Instruction *instr);\nint add_z_zz(context *ctx, Instruction *instr);\nint addha_za_pp_z(context *ctx, Instruction *instr);\nint addhnb_z_zz(context *ctx, Instruction *instr);\nint addhnt_z_zz(context *ctx, Instruction *instr);\nint addp_z_p_zz(context *ctx, Instruction *instr);\nint addpl_r_ri(context *ctx, Instruction *instr);\nint addva_za_pp_z(context *ctx, Instruction *instr);\nint addvl_r_ri(context *ctx, Instruction *instr);\nint adr_z_az(context *ctx, Instruction *instr);\nint aesd_z_zz(context *ctx, Instruction *instr);\nint aese_z_zz(context *ctx, Instruction *instr);\nint aesimc_z_z(context *ctx, Instruction *instr);\nint aesmc_z_z(context *ctx, Instruction *instr);\nint and_p_p_pp(context *ctx, Instruction *instr);\nint and_z_p_zz(context *ctx, Instruction *instr);\nint and_z_zi(context *ctx, Instruction *instr);\nint and_z_zz(context *ctx, Instruction *instr);\nint ands_p_p_pp(context *ctx, Instruction *instr);\nint andv_r_p_z(context *ctx, Instruction *instr);\nint asr_z_p_zi(context *ctx, Instruction *instr);\nint asr_z_p_zw(context *ctx, Instruction *instr);\nint asr_z_p_zz(context *ctx, Instruction *instr);\nint asr_z_zi(context *ctx, Instruction *instr);\nint asr_z_zw(context *ctx, Instruction *instr);\nint asrd_z_p_zi(context *ctx, Instruction *instr);\nint asrr_z_p_zz(context *ctx, Instruction *instr);\nint bcax_z_zzz(context *ctx, Instruction *instr);\nint bdep_z_zz(context *ctx, Instruction *instr);\nint bext_z_zz(context *ctx, Instruction *instr);\nint bfcvt_z_p_z(context *ctx, Instruction *instr);\nint bfcvtnt_z_p_z(context *ctx, Instruction *instr);\nint bfdot_z_zzz(context *ctx, Instruction *instr);\nint bfdot_z_zzzi(context *ctx, Instruction *instr);\nint bfmlalb_z_zzz(context *ctx, Instruction *instr);\nint bfmlalb_z_zzzi(context *ctx, Instruction *instr);\nint bfmlalt_z_zzz(context *ctx, Instruction *instr);\nint bfmlalt_z_zzzi(context *ctx, Instruction *instr);\nint bfmmla_z_zzz(context *ctx, Instruction *instr);\nint bfmopa_za32_pp_zz(context *ctx, Instruction *instr);\nint bfmops_za32_pp_zz(context *ctx, Instruction *instr);\nint bgrp_z_zz(context *ctx, Instruction *instr);\nint bic_p_p_pp(context *ctx, Instruction *instr);\nint bic_z_p_zz(context *ctx, Instruction *instr);\nint bic_z_zz(context *ctx, Instruction *instr);\nint bics_p_p_pp(context *ctx, Instruction *instr);\nint brka_p_p_p(context *ctx, Instruction *instr);\nint brkas_p_p_p(context *ctx, Instruction *instr);\nint brkb_p_p_p(context *ctx, Instruction *instr);\nint brkbs_p_p_p(context *ctx, Instruction *instr);\nint brkn_p_p_pp(context *ctx, Instruction *instr);\nint brkns_p_p_pp(context *ctx, Instruction *instr);\nint brkpa_p_p_pp(context *ctx, Instruction *instr);\nint brkpas_p_p_pp(context *ctx, Instruction *instr);\nint brkpb_p_p_pp(context *ctx, Instruction *instr);\nint brkpbs_p_p_pp(context *ctx, Instruction *instr);\nint bsl1n_z_zzz(context *ctx, Instruction *instr);\nint bsl2n_z_zzz(context *ctx, Instruction *instr);\nint bsl_z_zzz(context *ctx, Instruction *instr);\nint cadd_z_zz(context *ctx, Instruction *instr);\nint cdot_z_zzz(context *ctx, Instruction *instr);\nint cdot_z_zzzi(context *ctx, Instruction *instr);\nint clasta_r_p_z(context *ctx, Instruction *instr);\nint clasta_v_p_z(context *ctx, Instruction *instr);\nint clasta_z_p_zz(context *ctx, Instruction *instr);\nint clastb_r_p_z(context *ctx, Instruction *instr);\nint clastb_v_p_z(context *ctx, Instruction *instr);\nint clastb_z_p_zz(context *ctx, Instruction *instr);\nint cls_z_p_z(context *ctx, Instruction *instr);\nint clz_z_p_z(context *ctx, Instruction *instr);\nint cmla_z_zzz(context *ctx, Instruction *instr);\nint cmla_z_zzzi(context *ctx, Instruction *instr);\nint cmpeq_p_p_zi(context *ctx, Instruction *instr);\nint cmpeq_p_p_zw(context *ctx, Instruction *instr);\nint cmpeq_p_p_zz(context *ctx, Instruction *instr);\nint cnot_z_p_z(context *ctx, Instruction *instr);\nint cnt_z_p_z(context *ctx, Instruction *instr);\nint cntb_r_s(context *ctx, Instruction *instr);\nint cntp_r_p_p(context *ctx, Instruction *instr);\nint compact_z_p_z(context *ctx, Instruction *instr);\nint cpy_z_o_i(context *ctx, Instruction *instr);\nint cpy_z_p_i(context *ctx, Instruction *instr);\nint cpy_z_p_r(context *ctx, Instruction *instr);\nint cpy_z_p_v(context *ctx, Instruction *instr);\nint ctermeq_rr(context *ctx, Instruction *instr);\nint decb_r_rs(context *ctx, Instruction *instr);\nint decd_z_zs(context *ctx, Instruction *instr);\nint decp_r_p_r(context *ctx, Instruction *instr);\nint decp_z_p_z(context *ctx, Instruction *instr);\nint dup_p_p_pi(context *ctx, Instruction *instr);\nint dup_z_i(context *ctx, Instruction *instr);\nint dup_z_r(context *ctx, Instruction *instr);\nint dup_z_zi(context *ctx, Instruction *instr);\nint dupm_z_i(context *ctx, Instruction *instr);\nint eor3_z_zzz(context *ctx, Instruction *instr);\nint eor_p_p_pp(context *ctx, Instruction *instr);\nint eor_z_p_zz(context *ctx, Instruction *instr);\nint eor_z_zi(context *ctx, Instruction *instr);\nint eor_z_zz(context *ctx, Instruction *instr);\nint eorbt_z_zz(context *ctx, Instruction *instr);\nint eors_p_p_pp(context *ctx, Instruction *instr);\nint eortb_z_zz(context *ctx, Instruction *instr);\nint eorv_r_p_z(context *ctx, Instruction *instr);\nint ext_z_zi(context *ctx, Instruction *instr);\nint fabd_z_p_zz(context *ctx, Instruction *instr);\nint fabs_z_p_z(context *ctx, Instruction *instr);\nint facge_p_p_zz(context *ctx, Instruction *instr);\nint fadd_z_p_zs(context *ctx, Instruction *instr);\nint fadd_z_p_zz(context *ctx, Instruction *instr);\nint fadd_z_zz(context *ctx, Instruction *instr);\nint fadda_v_p_z(context *ctx, Instruction *instr);\nint faddp_z_p_zz(context *ctx, Instruction *instr);\nint faddv_v_p_z(context *ctx, Instruction *instr);\nint fcadd_z_p_zz(context *ctx, Instruction *instr);\nint fcmeq_p_p_z0(context *ctx, Instruction *instr);\nint fcmeq_p_p_zz(context *ctx, Instruction *instr);\nint fcmla_z_p_zzz(context *ctx, Instruction *instr);\nint fcmla_z_zzzi(context *ctx, Instruction *instr);\nint fcpy_z_p_i(context *ctx, Instruction *instr);\nint fcvt_z_p_z(context *ctx, Instruction *instr);\nint fcvtlt_z_p_z(context *ctx, Instruction *instr);\nint fcvtnt_z_p_z(context *ctx, Instruction *instr);\nint fcvtx_z_p_z(context *ctx, Instruction *instr);\nint fcvtxnt_z_p_z(context *ctx, Instruction *instr);\nint fcvtzs_z_p_z(context *ctx, Instruction *instr);\nint fcvtzu_z_p_z(context *ctx, Instruction *instr);\nint fdiv_z_p_zz(context *ctx, Instruction *instr);\nint fdivr_z_p_zz(context *ctx, Instruction *instr);\nint fdup_z_i(context *ctx, Instruction *instr);\nint fexpa_z_z(context *ctx, Instruction *instr);\nint flogb_z_p_z(context *ctx, Instruction *instr);\nint fmad_z_p_zzz(context *ctx, Instruction *instr);\nint fmax_z_p_zs(context *ctx, Instruction *instr);\nint fmax_z_p_zz(context *ctx, Instruction *instr);\nint fmaxnm_z_p_zs(context *ctx, Instruction *instr);\nint fmaxnm_z_p_zz(context *ctx, Instruction *instr);\nint fmaxnmp_z_p_zz(context *ctx, Instruction *instr);\nint fmaxnmv_v_p_z(context *ctx, Instruction *instr);\nint fmaxp_z_p_zz(context *ctx, Instruction *instr);\nint fmaxv_v_p_z(context *ctx, Instruction *instr);\nint fmin_z_p_zs(context *ctx, Instruction *instr);\nint fmin_z_p_zz(context *ctx, Instruction *instr);\nint fminnm_z_p_zs(context *ctx, Instruction *instr);\nint fminnm_z_p_zz(context *ctx, Instruction *instr);\nint fminnmp_z_p_zz(context *ctx, Instruction *instr);\nint fminnmv_v_p_z(context *ctx, Instruction *instr);\nint fminp_z_p_zz(context *ctx, Instruction *instr);\nint fminv_v_p_z(context *ctx, Instruction *instr);\nint fmla_z_p_zzz(context *ctx, Instruction *instr);\nint fmla_z_zzzi(context *ctx, Instruction *instr);\nint fmlalb_z_zzz(context *ctx, Instruction *instr);\nint fmlalb_z_zzzi(context *ctx, Instruction *instr);\nint fmlalt_z_zzz(context *ctx, Instruction *instr);\nint fmlalt_z_zzzi(context *ctx, Instruction *instr);\nint fmls_z_p_zzz(context *ctx, Instruction *instr);\nint fmls_z_zzzi(context *ctx, Instruction *instr);\nint fmlslb_z_zzz(context *ctx, Instruction *instr);\nint fmlslb_z_zzzi(context *ctx, Instruction *instr);\nint fmlslt_z_zzz(context *ctx, Instruction *instr);\nint fmlslt_z_zzzi(context *ctx, Instruction *instr);\nint fmmla_z_zzz(context *ctx, Instruction *instr);\nint fmopa_za32_pp_zz(context *ctx, Instruction *instr);\nint fmopa_za_pp_zz(context *ctx, Instruction *instr);\nint fmops_za32_pp_zz(context *ctx, Instruction *instr);\nint fmops_za_pp_zz(context *ctx, Instruction *instr);\nint fmsb_z_p_zzz(context *ctx, Instruction *instr);\nint fmul_z_p_zs(context *ctx, Instruction *instr);\nint fmul_z_p_zz(context *ctx, Instruction *instr);\nint fmul_z_zz(context *ctx, Instruction *instr);\nint fmul_z_zzi(context *ctx, Instruction *instr);\nint fmulx_z_p_zz(context *ctx, Instruction *instr);\nint fneg_z_p_z(context *ctx, Instruction *instr);\nint fnmad_z_p_zzz(context *ctx, Instruction *instr);\nint fnmla_z_p_zzz(context *ctx, Instruction *instr);\nint fnmls_z_p_zzz(context *ctx, Instruction *instr);\nint fnmsb_z_p_zzz(context *ctx, Instruction *instr);\nint frecpe_z_z(context *ctx, Instruction *instr);\nint frecps_z_zz(context *ctx, Instruction *instr);\nint frecpx_z_p_z(context *ctx, Instruction *instr);\nint frinta_z_p_z(context *ctx, Instruction *instr);\nint frsqrte_z_z(context *ctx, Instruction *instr);\nint frsqrts_z_zz(context *ctx, Instruction *instr);\nint fscale_z_p_zz(context *ctx, Instruction *instr);\nint fsqrt_z_p_z(context *ctx, Instruction *instr);\nint fsub_z_p_zs(context *ctx, Instruction *instr);\nint fsub_z_p_zz(context *ctx, Instruction *instr);\nint fsub_z_zz(context *ctx, Instruction *instr);\nint fsubr_z_p_zs(context *ctx, Instruction *instr);\nint fsubr_z_p_zz(context *ctx, Instruction *instr);\nint ftmad_z_zzi(context *ctx, Instruction *instr);\nint ftsmul_z_zz(context *ctx, Instruction *instr);\nint ftssel_z_zz(context *ctx, Instruction *instr);\nint histcnt_z_p_zz(context *ctx, Instruction *instr);\nint histseg_z_zz(context *ctx, Instruction *instr);\nint incb_r_rs(context *ctx, Instruction *instr);\nint incd_z_zs(context *ctx, Instruction *instr);\nint incp_r_p_r(context *ctx, Instruction *instr);\nint incp_z_p_z(context *ctx, Instruction *instr);\nint index_z_ii(context *ctx, Instruction *instr);\nint index_z_ir(context *ctx, Instruction *instr);\nint index_z_ri(context *ctx, Instruction *instr);\nint index_z_rr(context *ctx, Instruction *instr);\nint insr_z_r(context *ctx, Instruction *instr);\nint insr_z_v(context *ctx, Instruction *instr);\nint lasta_r_p_z(context *ctx, Instruction *instr);\nint lasta_v_p_z(context *ctx, Instruction *instr);\nint lastb_r_p_z(context *ctx, Instruction *instr);\nint lastb_v_p_z(context *ctx, Instruction *instr);\nint ld1b_z_p_ai(context *ctx, Instruction *instr);\nint ld1b_z_p_bi(context *ctx, Instruction *instr);\nint ld1b_z_p_br(context *ctx, Instruction *instr);\nint ld1b_z_p_bz(context *ctx, Instruction *instr);\nint ld1b_za_p_rrr(context *ctx, Instruction *instr);\nint ld1d_z_p_ai(context *ctx, Instruction *instr);\nint ld1d_z_p_bi(context *ctx, Instruction *instr);\nint ld1d_z_p_br(context *ctx, Instruction *instr);\nint ld1d_z_p_bz(context *ctx, Instruction *instr);\nint ld1d_za_p_rrr(context *ctx, Instruction *instr);\nint ld1h_z_p_ai(context *ctx, Instruction *instr);\nint ld1h_z_p_bi(context *ctx, Instruction *instr);\nint ld1h_z_p_br(context *ctx, Instruction *instr);\nint ld1h_z_p_bz(context *ctx, Instruction *instr);\nint ld1h_za_p_rrr(context *ctx, Instruction *instr);\nint ld1q_za_p_rrr(context *ctx, Instruction *instr);\nint ld1rb_z_p_bi(context *ctx, Instruction *instr);\nint ld1rd_z_p_bi(context *ctx, Instruction *instr);\nint ld1rh_z_p_bi(context *ctx, Instruction *instr);\nint ld1rob_z_p_bi(context *ctx, Instruction *instr);\nint ld1rob_z_p_br(context *ctx, Instruction *instr);\nint ld1rod_z_p_bi(context *ctx, Instruction *instr);\nint ld1rod_z_p_br(context *ctx, Instruction *instr);\nint ld1roh_z_p_bi(context *ctx, Instruction *instr);\nint ld1roh_z_p_br(context *ctx, Instruction *instr);\nint ld1row_z_p_bi(context *ctx, Instruction *instr);\nint ld1row_z_p_br(context *ctx, Instruction *instr);\nint ld1rqb_z_p_bi(context *ctx, Instruction *instr);\nint ld1rqb_z_p_br(context *ctx, Instruction *instr);\nint ld1rqd_z_p_bi(context *ctx, Instruction *instr);\nint ld1rqd_z_p_br(context *ctx, Instruction *instr);\nint ld1rqh_z_p_bi(context *ctx, Instruction *instr);\nint ld1rqh_z_p_br(context *ctx, Instruction *instr);\nint ld1rqw_z_p_bi(context *ctx, Instruction *instr);\nint ld1rqw_z_p_br(context *ctx, Instruction *instr);\nint ld1rsb_z_p_bi(context *ctx, Instruction *instr);\nint ld1rsh_z_p_bi(context *ctx, Instruction *instr);\nint ld1rsw_z_p_bi(context *ctx, Instruction *instr);\nint ld1rw_z_p_bi(context *ctx, Instruction *instr);\nint ld1sb_z_p_ai(context *ctx, Instruction *instr);\nint ld1sb_z_p_bi(context *ctx, Instruction *instr);\nint ld1sb_z_p_br(context *ctx, Instruction *instr);\nint ld1sb_z_p_bz(context *ctx, Instruction *instr);\nint ld1sh_z_p_ai(context *ctx, Instruction *instr);\nint ld1sh_z_p_bi(context *ctx, Instruction *instr);\nint ld1sh_z_p_br(context *ctx, Instruction *instr);\nint ld1sh_z_p_bz(context *ctx, Instruction *instr);\nint ld1sw_z_p_ai(context *ctx, Instruction *instr);\nint ld1sw_z_p_bi(context *ctx, Instruction *instr);\nint ld1sw_z_p_br(context *ctx, Instruction *instr);\nint ld1sw_z_p_bz(context *ctx, Instruction *instr);\nint ld1w_z_p_ai(context *ctx, Instruction *instr);\nint ld1w_z_p_bi(context *ctx, Instruction *instr);\nint ld1w_z_p_br(context *ctx, Instruction *instr);\nint ld1w_z_p_bz(context *ctx, Instruction *instr);\nint ld1w_za_p_rrr(context *ctx, Instruction *instr);\nint ld2b_z_p_bi(context *ctx, Instruction *instr);\nint ld2b_z_p_br(context *ctx, Instruction *instr);\nint ld2d_z_p_bi(context *ctx, Instruction *instr);\nint ld2d_z_p_br(context *ctx, Instruction *instr);\nint ld2h_z_p_bi(context *ctx, Instruction *instr);\nint ld2h_z_p_br(context *ctx, Instruction *instr);\nint ld2w_z_p_bi(context *ctx, Instruction *instr);\nint ld2w_z_p_br(context *ctx, Instruction *instr);\nint ld3b_z_p_bi(context *ctx, Instruction *instr);\nint ld3b_z_p_br(context *ctx, Instruction *instr);\nint ld3d_z_p_bi(context *ctx, Instruction *instr);\nint ld3d_z_p_br(context *ctx, Instruction *instr);\nint ld3h_z_p_bi(context *ctx, Instruction *instr);\nint ld3h_z_p_br(context *ctx, Instruction *instr);\nint ld3w_z_p_bi(context *ctx, Instruction *instr);\nint ld3w_z_p_br(context *ctx, Instruction *instr);\nint ld4b_z_p_bi(context *ctx, Instruction *instr);\nint ld4b_z_p_br(context *ctx, Instruction *instr);\nint ld4d_z_p_bi(context *ctx, Instruction *instr);\nint ld4d_z_p_br(context *ctx, Instruction *instr);\nint ld4h_z_p_bi(context *ctx, Instruction *instr);\nint ld4h_z_p_br(context *ctx, Instruction *instr);\nint ld4w_z_p_bi(context *ctx, Instruction *instr);\nint ld4w_z_p_br(context *ctx, Instruction *instr);\nint ldff1b_z_p_ai(context *ctx, Instruction *instr);\nint ldff1b_z_p_br(context *ctx, Instruction *instr);\nint ldff1b_z_p_bz(context *ctx, Instruction *instr);\nint ldff1d_z_p_ai(context *ctx, Instruction *instr);\nint ldff1d_z_p_br(context *ctx, Instruction *instr);\nint ldff1d_z_p_bz(context *ctx, Instruction *instr);\nint ldff1h_z_p_ai(context *ctx, Instruction *instr);\nint ldff1h_z_p_br(context *ctx, Instruction *instr);\nint ldff1h_z_p_bz(context *ctx, Instruction *instr);\nint ldff1sb_z_p_ai(context *ctx, Instruction *instr);\nint ldff1sb_z_p_br(context *ctx, Instruction *instr);\nint ldff1sb_z_p_bz(context *ctx, Instruction *instr);\nint ldff1sh_z_p_ai(context *ctx, Instruction *instr);\nint ldff1sh_z_p_br(context *ctx, Instruction *instr);\nint ldff1sh_z_p_bz(context *ctx, Instruction *instr);\nint ldff1sw_z_p_ai(context *ctx, Instruction *instr);\nint ldff1sw_z_p_br(context *ctx, Instruction *instr);\nint ldff1sw_z_p_bz(context *ctx, Instruction *instr);\nint ldff1w_z_p_ai(context *ctx, Instruction *instr);\nint ldff1w_z_p_br(context *ctx, Instruction *instr);\nint ldff1w_z_p_bz(context *ctx, Instruction *instr);\nint ldnf1b_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1d_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1h_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1sb_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1sh_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1sw_z_p_bi(context *ctx, Instruction *instr);\nint ldnf1w_z_p_bi(context *ctx, Instruction *instr);\nint ldnt1b_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1b_z_p_bi(context *ctx, Instruction *instr);\nint ldnt1b_z_p_br(context *ctx, Instruction *instr);\nint ldnt1d_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1d_z_p_bi(context *ctx, Instruction *instr);\nint ldnt1d_z_p_br(context *ctx, Instruction *instr);\nint ldnt1h_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1h_z_p_bi(context *ctx, Instruction *instr);\nint ldnt1h_z_p_br(context *ctx, Instruction *instr);\nint ldnt1sb_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1sh_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1sw_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1w_z_p_ar(context *ctx, Instruction *instr);\nint ldnt1w_z_p_bi(context *ctx, Instruction *instr);\nint ldnt1w_z_p_br(context *ctx, Instruction *instr);\nint ldr_p_bi(context *ctx, Instruction *instr);\nint ldr_z_bi(context *ctx, Instruction *instr);\nint ldr_za_ri(context *ctx, Instruction *instr);\nint lsl_z_p_zi(context *ctx, Instruction *instr);\nint lsl_z_p_zw(context *ctx, Instruction *instr);\nint lsl_z_p_zz(context *ctx, Instruction *instr);\nint lsl_z_zi(context *ctx, Instruction *instr);\nint lsl_z_zw(context *ctx, Instruction *instr);\nint lslr_z_p_zz(context *ctx, Instruction *instr);\nint lsr_z_p_zi(context *ctx, Instruction *instr);\nint lsr_z_p_zw(context *ctx, Instruction *instr);\nint lsr_z_p_zz(context *ctx, Instruction *instr);\nint lsr_z_zi(context *ctx, Instruction *instr);\nint lsr_z_zw(context *ctx, Instruction *instr);\nint lsrr_z_p_zz(context *ctx, Instruction *instr);\nint mad_z_p_zzz(context *ctx, Instruction *instr);\nint match_p_p_zz(context *ctx, Instruction *instr);\nint mla_z_p_zzz(context *ctx, Instruction *instr);\nint mla_z_zzzi(context *ctx, Instruction *instr);\nint mls_z_p_zzz(context *ctx, Instruction *instr);\nint mls_z_zzzi(context *ctx, Instruction *instr);\nint mova_z_p_rza(context *ctx, Instruction *instr);\nint mova_za_p_rz(context *ctx, Instruction *instr);\nint movprfx_z_p_z(context *ctx, Instruction *instr);\nint movprfx_z_z(context *ctx, Instruction *instr);\nint msb_z_p_zzz(context *ctx, Instruction *instr);\nint mul_z_p_zz(context *ctx, Instruction *instr);\nint mul_z_zi(context *ctx, Instruction *instr);\nint mul_z_zz(context *ctx, Instruction *instr);\nint mul_z_zzi(context *ctx, Instruction *instr);\nint nand_p_p_pp(context *ctx, Instruction *instr);\nint nands_p_p_pp(context *ctx, Instruction *instr);\nint nbsl_z_zzz(context *ctx, Instruction *instr);\nint neg_z_p_z(context *ctx, Instruction *instr);\nint nmatch_p_p_zz(context *ctx, Instruction *instr);\nint nor_p_p_pp(context *ctx, Instruction *instr);\nint nors_p_p_pp(context *ctx, Instruction *instr);\nint not_z_p_z(context *ctx, Instruction *instr);\nint orn_p_p_pp(context *ctx, Instruction *instr);\nint orns_p_p_pp(context *ctx, Instruction *instr);\nint orr_p_p_pp(context *ctx, Instruction *instr);\nint orr_z_p_zz(context *ctx, Instruction *instr);\nint orr_z_zi(context *ctx, Instruction *instr);\nint orr_z_zz(context *ctx, Instruction *instr);\nint orrs_p_p_pp(context *ctx, Instruction *instr);\nint orv_r_p_z(context *ctx, Instruction *instr);\nint pfalse_p(context *ctx, Instruction *instr);\nint pfirst_p_p_p(context *ctx, Instruction *instr);\nint pmul_z_zz(context *ctx, Instruction *instr);\nint pmullb_z_zz(context *ctx, Instruction *instr);\nint pmullt_z_zz(context *ctx, Instruction *instr);\nint pnext_p_p_p(context *ctx, Instruction *instr);\nint prfb_i_p_ai(context *ctx, Instruction *instr);\nint prfb_i_p_bi(context *ctx, Instruction *instr);\nint prfb_i_p_br(context *ctx, Instruction *instr);\nint prfb_i_p_bz(context *ctx, Instruction *instr);\nint prfd_i_p_ai(context *ctx, Instruction *instr);\nint prfd_i_p_bi(context *ctx, Instruction *instr);\nint prfd_i_p_br(context *ctx, Instruction *instr);\nint prfd_i_p_bz(context *ctx, Instruction *instr);\nint prfh_i_p_ai(context *ctx, Instruction *instr);\nint prfh_i_p_bi(context *ctx, Instruction *instr);\nint prfh_i_p_br(context *ctx, Instruction *instr);\nint prfh_i_p_bz(context *ctx, Instruction *instr);\nint prfw_i_p_ai(context *ctx, Instruction *instr);\nint prfw_i_p_bi(context *ctx, Instruction *instr);\nint prfw_i_p_br(context *ctx, Instruction *instr);\nint prfw_i_p_bz(context *ctx, Instruction *instr);\nint ptest_p_p(context *ctx, Instruction *instr);\nint ptrue_p_s(context *ctx, Instruction *instr);\nint ptrues_p_s(context *ctx, Instruction *instr);\nint punpkhi_p_p(context *ctx, Instruction *instr);\nint raddhnb_z_zz(context *ctx, Instruction *instr);\nint raddhnt_z_zz(context *ctx, Instruction *instr);\nint rax1_z_zz(context *ctx, Instruction *instr);\nint rbit_z_p_z(context *ctx, Instruction *instr);\nint rdffr_p_f(context *ctx, Instruction *instr);\nint rdffr_p_p_f(context *ctx, Instruction *instr);\nint rdffrs_p_p_f(context *ctx, Instruction *instr);\nint rdvl_r_i(context *ctx, Instruction *instr);\nint rev_p_p(context *ctx, Instruction *instr);\nint rev_z_z(context *ctx, Instruction *instr);\nint revb_z_z(context *ctx, Instruction *instr);\nint revd_z_p_z(context *ctx, Instruction *instr);\nint rshrnb_z_zi(context *ctx, Instruction *instr);\nint rshrnt_z_zi(context *ctx, Instruction *instr);\nint rsubhnb_z_zz(context *ctx, Instruction *instr);\nint rsubhnt_z_zz(context *ctx, Instruction *instr);\nint saba_z_zzz(context *ctx, Instruction *instr);\nint sabalb_z_zzz(context *ctx, Instruction *instr);\nint sabalt_z_zzz(context *ctx, Instruction *instr);\nint sabd_z_p_zz(context *ctx, Instruction *instr);\nint sabdlb_z_zz(context *ctx, Instruction *instr);\nint sabdlt_z_zz(context *ctx, Instruction *instr);\nint sadalp_z_p_z(context *ctx, Instruction *instr);\nint saddlb_z_zz(context *ctx, Instruction *instr);\nint saddlbt_z_zz(context *ctx, Instruction *instr);\nint saddlt_z_zz(context *ctx, Instruction *instr);\nint saddv_r_p_z(context *ctx, Instruction *instr);\nint saddwb_z_zz(context *ctx, Instruction *instr);\nint saddwt_z_zz(context *ctx, Instruction *instr);\nint sbclb_z_zzz(context *ctx, Instruction *instr);\nint sbclt_z_zzz(context *ctx, Instruction *instr);\nint sclamp_z_zz(context *ctx, Instruction *instr);\nint scvtf_z_p_z(context *ctx, Instruction *instr);\nint sdiv_z_p_zz(context *ctx, Instruction *instr);\nint sdivr_z_p_zz(context *ctx, Instruction *instr);\nint sdot_z_zzz(context *ctx, Instruction *instr);\nint sdot_z_zzzi(context *ctx, Instruction *instr);\nint sel_p_p_pp(context *ctx, Instruction *instr);\nint sel_z_p_zz(context *ctx, Instruction *instr);\nint setffr_f(context *ctx, Instruction *instr);\nint shadd_z_p_zz(context *ctx, Instruction *instr);\nint shared_pseudocode(context *ctx, Instruction *instr);\nint shrnb_z_zi(context *ctx, Instruction *instr);\nint shrnt_z_zi(context *ctx, Instruction *instr);\nint shsub_z_p_zz(context *ctx, Instruction *instr);\nint shsubr_z_p_zz(context *ctx, Instruction *instr);\nint sli_z_zzi(context *ctx, Instruction *instr);\nint sm4e_z_zz(context *ctx, Instruction *instr);\nint sm4ekey_z_zz(context *ctx, Instruction *instr);\nint smax_z_p_zz(context *ctx, Instruction *instr);\nint smax_z_zi(context *ctx, Instruction *instr);\nint smaxp_z_p_zz(context *ctx, Instruction *instr);\nint smaxv_r_p_z(context *ctx, Instruction *instr);\nint smin_z_p_zz(context *ctx, Instruction *instr);\nint smin_z_zi(context *ctx, Instruction *instr);\nint sminp_z_p_zz(context *ctx, Instruction *instr);\nint sminv_r_p_z(context *ctx, Instruction *instr);\nint smlalb_z_zzz(context *ctx, Instruction *instr);\nint smlalb_z_zzzi(context *ctx, Instruction *instr);\nint smlalt_z_zzz(context *ctx, Instruction *instr);\nint smlalt_z_zzzi(context *ctx, Instruction *instr);\nint smlslb_z_zzz(context *ctx, Instruction *instr);\nint smlslb_z_zzzi(context *ctx, Instruction *instr);\nint smlslt_z_zzz(context *ctx, Instruction *instr);\nint smlslt_z_zzzi(context *ctx, Instruction *instr);\nint smmla_z_zzz(context *ctx, Instruction *instr);\nint smopa_za_pp_zz(context *ctx, Instruction *instr);\nint smops_za_pp_zz(context *ctx, Instruction *instr);\nint smulh_z_p_zz(context *ctx, Instruction *instr);\nint smulh_z_zz(context *ctx, Instruction *instr);\nint smullb_z_zz(context *ctx, Instruction *instr);\nint smullb_z_zzi(context *ctx, Instruction *instr);\nint smullt_z_zz(context *ctx, Instruction *instr);\nint smullt_z_zzi(context *ctx, Instruction *instr);\nint splice_z_p_zz(context *ctx, Instruction *instr);\nint sqabs_z_p_z(context *ctx, Instruction *instr);\nint sqadd_z_p_zz(context *ctx, Instruction *instr);\nint sqadd_z_zi(context *ctx, Instruction *instr);\nint sqadd_z_zz(context *ctx, Instruction *instr);\nint sqcadd_z_zz(context *ctx, Instruction *instr);\nint sqdecb_r_rs(context *ctx, Instruction *instr);\nint sqdecd_r_rs(context *ctx, Instruction *instr);\nint sqdecd_z_zs(context *ctx, Instruction *instr);\nint sqdech_r_rs(context *ctx, Instruction *instr);\nint sqdech_z_zs(context *ctx, Instruction *instr);\nint sqdecp_r_p_r(context *ctx, Instruction *instr);\nint sqdecp_z_p_z(context *ctx, Instruction *instr);\nint sqdecw_r_rs(context *ctx, Instruction *instr);\nint sqdecw_z_zs(context *ctx, Instruction *instr);\nint sqdmlalb_z_zzz(context *ctx, Instruction *instr);\nint sqdmlalb_z_zzzi(context *ctx, Instruction *instr);\nint sqdmlalbt_z_zzz(context *ctx, Instruction *instr);\nint sqdmlalt_z_zzz(context *ctx, Instruction *instr);\nint sqdmlalt_z_zzzi(context *ctx, Instruction *instr);\nint sqdmlslb_z_zzz(context *ctx, Instruction *instr);\nint sqdmlslb_z_zzzi(context *ctx, Instruction *instr);\nint sqdmlslbt_z_zzz(context *ctx, Instruction *instr);\nint sqdmlslt_z_zzz(context *ctx, Instruction *instr);\nint sqdmlslt_z_zzzi(context *ctx, Instruction *instr);\nint sqdmulh_z_zz(context *ctx, Instruction *instr);\nint sqdmulh_z_zzi(context *ctx, Instruction *instr);\nint sqdmullb_z_zz(context *ctx, Instruction *instr);\nint sqdmullb_z_zzi(context *ctx, Instruction *instr);\nint sqdmullt_z_zz(context *ctx, Instruction *instr);\nint sqdmullt_z_zzi(context *ctx, Instruction *instr);\nint sqincb_r_rs(context *ctx, Instruction *instr);\nint sqincd_r_rs(context *ctx, Instruction *instr);\nint sqincd_z_zs(context *ctx, Instruction *instr);\nint sqinch_r_rs(context *ctx, Instruction *instr);\nint sqinch_z_zs(context *ctx, Instruction *instr);\nint sqincp_r_p_r(context *ctx, Instruction *instr);\nint sqincp_z_p_z(context *ctx, Instruction *instr);\nint sqincw_r_rs(context *ctx, Instruction *instr);\nint sqincw_z_zs(context *ctx, Instruction *instr);\nint sqneg_z_p_z(context *ctx, Instruction *instr);\nint sqrdcmlah_z_zzz(context *ctx, Instruction *instr);\nint sqrdcmlah_z_zzzi(context *ctx, Instruction *instr);\nint sqrdmlah_z_zzz(context *ctx, Instruction *instr);\nint sqrdmlah_z_zzzi(context *ctx, Instruction *instr);\nint sqrdmlsh_z_zzz(context *ctx, Instruction *instr);\nint sqrdmlsh_z_zzzi(context *ctx, Instruction *instr);\nint sqrdmulh_z_zz(context *ctx, Instruction *instr);\nint sqrdmulh_z_zzi(context *ctx, Instruction *instr);\nint sqrshl_z_p_zz(context *ctx, Instruction *instr);\nint sqrshlr_z_p_zz(context *ctx, Instruction *instr);\nint sqrshrnb_z_zi(context *ctx, Instruction *instr);\nint sqrshrnt_z_zi(context *ctx, Instruction *instr);\nint sqrshrunb_z_zi(context *ctx, Instruction *instr);\nint sqrshrunt_z_zi(context *ctx, Instruction *instr);\nint sqshl_z_p_zi(context *ctx, Instruction *instr);\nint sqshl_z_p_zz(context *ctx, Instruction *instr);\nint sqshlr_z_p_zz(context *ctx, Instruction *instr);\nint sqshlu_z_p_zi(context *ctx, Instruction *instr);\nint sqshrnb_z_zi(context *ctx, Instruction *instr);\nint sqshrnt_z_zi(context *ctx, Instruction *instr);\nint sqshrunb_z_zi(context *ctx, Instruction *instr);\nint sqshrunt_z_zi(context *ctx, Instruction *instr);\nint sqsub_z_p_zz(context *ctx, Instruction *instr);\nint sqsub_z_zi(context *ctx, Instruction *instr);\nint sqsub_z_zz(context *ctx, Instruction *instr);\nint sqsubr_z_p_zz(context *ctx, Instruction *instr);\nint sqxtnb_z_zz(context *ctx, Instruction *instr);\nint sqxtnt_z_zz(context *ctx, Instruction *instr);\nint sqxtunb_z_zz(context *ctx, Instruction *instr);\nint sqxtunt_z_zz(context *ctx, Instruction *instr);\nint srhadd_z_p_zz(context *ctx, Instruction *instr);\nint sri_z_zzi(context *ctx, Instruction *instr);\nint srshl_z_p_zz(context *ctx, Instruction *instr);\nint srshlr_z_p_zz(context *ctx, Instruction *instr);\nint srshr_z_p_zi(context *ctx, Instruction *instr);\nint srsra_z_zi(context *ctx, Instruction *instr);\nint sshllb_z_zi(context *ctx, Instruction *instr);\nint sshllt_z_zi(context *ctx, Instruction *instr);\nint ssra_z_zi(context *ctx, Instruction *instr);\nint ssublb_z_zz(context *ctx, Instruction *instr);\nint ssublbt_z_zz(context *ctx, Instruction *instr);\nint ssublt_z_zz(context *ctx, Instruction *instr);\nint ssubltb_z_zz(context *ctx, Instruction *instr);\nint ssubwb_z_zz(context *ctx, Instruction *instr);\nint ssubwt_z_zz(context *ctx, Instruction *instr);\nint st1b_z_p_ai(context *ctx, Instruction *instr);\nint st1b_z_p_bi(context *ctx, Instruction *instr);\nint st1b_z_p_br(context *ctx, Instruction *instr);\nint st1b_z_p_bz(context *ctx, Instruction *instr);\nint st1b_za_p_rrr(context *ctx, Instruction *instr);\nint st1d_z_p_ai(context *ctx, Instruction *instr);\nint st1d_z_p_bi(context *ctx, Instruction *instr);\nint st1d_z_p_br(context *ctx, Instruction *instr);\nint st1d_z_p_bz(context *ctx, Instruction *instr);\nint st1d_za_p_rrr(context *ctx, Instruction *instr);\nint st1h_z_p_ai(context *ctx, Instruction *instr);\nint st1h_z_p_bi(context *ctx, Instruction *instr);\nint st1h_z_p_br(context *ctx, Instruction *instr);\nint st1h_z_p_bz(context *ctx, Instruction *instr);\nint st1h_za_p_rrr(context *ctx, Instruction *instr);\nint st1q_za_p_rrr(context *ctx, Instruction *instr);\nint st1w_z_p_ai(context *ctx, Instruction *instr);\nint st1w_z_p_bi(context *ctx, Instruction *instr);\nint st1w_z_p_br(context *ctx, Instruction *instr);\nint st1w_z_p_bz(context *ctx, Instruction *instr);\nint st1w_za_p_rrr(context *ctx, Instruction *instr);\nint st2b_z_p_bi(context *ctx, Instruction *instr);\nint st2b_z_p_br(context *ctx, Instruction *instr);\nint st2d_z_p_bi(context *ctx, Instruction *instr);\nint st2d_z_p_br(context *ctx, Instruction *instr);\nint st2h_z_p_bi(context *ctx, Instruction *instr);\nint st2h_z_p_br(context *ctx, Instruction *instr);\nint st2w_z_p_bi(context *ctx, Instruction *instr);\nint st2w_z_p_br(context *ctx, Instruction *instr);\nint st3b_z_p_bi(context *ctx, Instruction *instr);\nint st3b_z_p_br(context *ctx, Instruction *instr);\nint st3d_z_p_bi(context *ctx, Instruction *instr);\nint st3d_z_p_br(context *ctx, Instruction *instr);\nint st3h_z_p_bi(context *ctx, Instruction *instr);\nint st3h_z_p_br(context *ctx, Instruction *instr);\nint st3w_z_p_bi(context *ctx, Instruction *instr);\nint st3w_z_p_br(context *ctx, Instruction *instr);\nint st4b_z_p_bi(context *ctx, Instruction *instr);\nint st4b_z_p_br(context *ctx, Instruction *instr);\nint st4d_z_p_bi(context *ctx, Instruction *instr);\nint st4d_z_p_br(context *ctx, Instruction *instr);\nint st4h_z_p_bi(context *ctx, Instruction *instr);\nint st4h_z_p_br(context *ctx, Instruction *instr);\nint st4w_z_p_bi(context *ctx, Instruction *instr);\nint st4w_z_p_br(context *ctx, Instruction *instr);\nint stnt1b_z_p_ar(context *ctx, Instruction *instr);\nint stnt1b_z_p_bi(context *ctx, Instruction *instr);\nint stnt1b_z_p_br(context *ctx, Instruction *instr);\nint stnt1d_z_p_ar(context *ctx, Instruction *instr);\nint stnt1d_z_p_bi(context *ctx, Instruction *instr);\nint stnt1d_z_p_br(context *ctx, Instruction *instr);\nint stnt1h_z_p_ar(context *ctx, Instruction *instr);\nint stnt1h_z_p_bi(context *ctx, Instruction *instr);\nint stnt1h_z_p_br(context *ctx, Instruction *instr);\nint stnt1w_z_p_ar(context *ctx, Instruction *instr);\nint stnt1w_z_p_bi(context *ctx, Instruction *instr);\nint stnt1w_z_p_br(context *ctx, Instruction *instr);\nint str_p_bi(context *ctx, Instruction *instr);\nint str_z_bi(context *ctx, Instruction *instr);\nint str_za_ri(context *ctx, Instruction *instr);\nint sub_z_p_zz(context *ctx, Instruction *instr);\nint sub_z_zi(context *ctx, Instruction *instr);\nint sub_z_zz(context *ctx, Instruction *instr);\nint subhnb_z_zz(context *ctx, Instruction *instr);\nint subhnt_z_zz(context *ctx, Instruction *instr);\nint subr_z_p_zz(context *ctx, Instruction *instr);\nint subr_z_zi(context *ctx, Instruction *instr);\nint sudot_z_zzzi(context *ctx, Instruction *instr);\nint sumopa_za_pp_zz(context *ctx, Instruction *instr);\nint sumops_za_pp_zz(context *ctx, Instruction *instr);\nint sunpkhi_z_z(context *ctx, Instruction *instr);\nint suqadd_z_p_zz(context *ctx, Instruction *instr);\nint sxtb_z_p_z(context *ctx, Instruction *instr);\nint tbl_z_zz(context *ctx, Instruction *instr);\nint tbx_z_zz(context *ctx, Instruction *instr);\nint trn1_p_pp(context *ctx, Instruction *instr);\nint trn1_z_zz(context *ctx, Instruction *instr);\nint uaba_z_zzz(context *ctx, Instruction *instr);\nint uabalb_z_zzz(context *ctx, Instruction *instr);\nint uabalt_z_zzz(context *ctx, Instruction *instr);\nint uabd_z_p_zz(context *ctx, Instruction *instr);\nint uabdlb_z_zz(context *ctx, Instruction *instr);\nint uabdlt_z_zz(context *ctx, Instruction *instr);\nint uadalp_z_p_z(context *ctx, Instruction *instr);\nint uaddlb_z_zz(context *ctx, Instruction *instr);\nint uaddlt_z_zz(context *ctx, Instruction *instr);\nint uaddv_r_p_z(context *ctx, Instruction *instr);\nint uaddwb_z_zz(context *ctx, Instruction *instr);\nint uaddwt_z_zz(context *ctx, Instruction *instr);\nint uclamp_z_zz(context *ctx, Instruction *instr);\nint ucvtf_z_p_z(context *ctx, Instruction *instr);\nint udiv_z_p_zz(context *ctx, Instruction *instr);\nint udivr_z_p_zz(context *ctx, Instruction *instr);\nint udot_z_zzz(context *ctx, Instruction *instr);\nint udot_z_zzzi(context *ctx, Instruction *instr);\nint uhadd_z_p_zz(context *ctx, Instruction *instr);\nint uhsub_z_p_zz(context *ctx, Instruction *instr);\nint uhsubr_z_p_zz(context *ctx, Instruction *instr);\nint umax_z_p_zz(context *ctx, Instruction *instr);\nint umax_z_zi(context *ctx, Instruction *instr);\nint umaxp_z_p_zz(context *ctx, Instruction *instr);\nint umaxv_r_p_z(context *ctx, Instruction *instr);\nint umin_z_p_zz(context *ctx, Instruction *instr);\nint umin_z_zi(context *ctx, Instruction *instr);\nint uminp_z_p_zz(context *ctx, Instruction *instr);\nint uminv_r_p_z(context *ctx, Instruction *instr);\nint umlalb_z_zzz(context *ctx, Instruction *instr);\nint umlalb_z_zzzi(context *ctx, Instruction *instr);\nint umlalt_z_zzz(context *ctx, Instruction *instr);\nint umlalt_z_zzzi(context *ctx, Instruction *instr);\nint umlslb_z_zzz(context *ctx, Instruction *instr);\nint umlslb_z_zzzi(context *ctx, Instruction *instr);\nint umlslt_z_zzz(context *ctx, Instruction *instr);\nint umlslt_z_zzzi(context *ctx, Instruction *instr);\nint ummla_z_zzz(context *ctx, Instruction *instr);\nint umopa_za_pp_zz(context *ctx, Instruction *instr);\nint umops_za_pp_zz(context *ctx, Instruction *instr);\nint umulh_z_p_zz(context *ctx, Instruction *instr);\nint umulh_z_zz(context *ctx, Instruction *instr);\nint umullb_z_zz(context *ctx, Instruction *instr);\nint umullb_z_zzi(context *ctx, Instruction *instr);\nint umullt_z_zz(context *ctx, Instruction *instr);\nint umullt_z_zzi(context *ctx, Instruction *instr);\nint uqadd_z_p_zz(context *ctx, Instruction *instr);\nint uqadd_z_zi(context *ctx, Instruction *instr);\nint uqadd_z_zz(context *ctx, Instruction *instr);\nint uqdecb_r_rs(context *ctx, Instruction *instr);\nint uqdecd_r_rs(context *ctx, Instruction *instr);\nint uqdecd_z_zs(context *ctx, Instruction *instr);\nint uqdech_r_rs(context *ctx, Instruction *instr);\nint uqdech_z_zs(context *ctx, Instruction *instr);\nint uqdecp_r_p_r(context *ctx, Instruction *instr);\nint uqdecp_z_p_z(context *ctx, Instruction *instr);\nint uqdecw_r_rs(context *ctx, Instruction *instr);\nint uqdecw_z_zs(context *ctx, Instruction *instr);\nint uqincb_r_rs(context *ctx, Instruction *instr);\nint uqincd_r_rs(context *ctx, Instruction *instr);\nint uqincd_z_zs(context *ctx, Instruction *instr);\nint uqinch_r_rs(context *ctx, Instruction *instr);\nint uqinch_z_zs(context *ctx, Instruction *instr);\nint uqincp_r_p_r(context *ctx, Instruction *instr);\nint uqincp_z_p_z(context *ctx, Instruction *instr);\nint uqincw_r_rs(context *ctx, Instruction *instr);\nint uqincw_z_zs(context *ctx, Instruction *instr);\nint uqrshl_z_p_zz(context *ctx, Instruction *instr);\nint uqrshlr_z_p_zz(context *ctx, Instruction *instr);\nint uqrshrnb_z_zi(context *ctx, Instruction *instr);\nint uqrshrnt_z_zi(context *ctx, Instruction *instr);\nint uqshl_z_p_zi(context *ctx, Instruction *instr);\nint uqshl_z_p_zz(context *ctx, Instruction *instr);\nint uqshlr_z_p_zz(context *ctx, Instruction *instr);\nint uqshrnb_z_zi(context *ctx, Instruction *instr);\nint uqshrnt_z_zi(context *ctx, Instruction *instr);\nint uqsub_z_p_zz(context *ctx, Instruction *instr);\nint uqsub_z_zi(context *ctx, Instruction *instr);\nint uqsub_z_zz(context *ctx, Instruction *instr);\nint uqsubr_z_p_zz(context *ctx, Instruction *instr);\nint uqxtnb_z_zz(context *ctx, Instruction *instr);\nint uqxtnt_z_zz(context *ctx, Instruction *instr);\nint urecpe_z_p_z(context *ctx, Instruction *instr);\nint urhadd_z_p_zz(context *ctx, Instruction *instr);\nint urshl_z_p_zz(context *ctx, Instruction *instr);\nint urshlr_z_p_zz(context *ctx, Instruction *instr);\nint urshr_z_p_zi(context *ctx, Instruction *instr);\nint ursqrte_z_p_z(context *ctx, Instruction *instr);\nint ursra_z_zi(context *ctx, Instruction *instr);\nint usdot_z_zzz(context *ctx, Instruction *instr);\nint usdot_z_zzzi(context *ctx, Instruction *instr);\nint ushllb_z_zi(context *ctx, Instruction *instr);\nint ushllt_z_zi(context *ctx, Instruction *instr);\nint usmmla_z_zzz(context *ctx, Instruction *instr);\nint usmopa_za_pp_zz(context *ctx, Instruction *instr);\nint usmops_za_pp_zz(context *ctx, Instruction *instr);\nint usqadd_z_p_zz(context *ctx, Instruction *instr);\nint usra_z_zi(context *ctx, Instruction *instr);\nint usublb_z_zz(context *ctx, Instruction *instr);\nint usublt_z_zz(context *ctx, Instruction *instr);\nint usubwb_z_zz(context *ctx, Instruction *instr);\nint usubwt_z_zz(context *ctx, Instruction *instr);\nint uunpkhi_z_z(context *ctx, Instruction *instr);\nint uxtb_z_p_z(context *ctx, Instruction *instr);\nint uzp1_p_pp(context *ctx, Instruction *instr);\nint uzp1_z_zz(context *ctx, Instruction *instr);\nint whilege_p_p_rr(context *ctx, Instruction *instr);\nint whilegt_p_p_rr(context *ctx, Instruction *instr);\nint whilehi_p_p_rr(context *ctx, Instruction *instr);\nint whilehs_p_p_rr(context *ctx, Instruction *instr);\nint whilele_p_p_rr(context *ctx, Instruction *instr);\nint whilelo_p_p_rr(context *ctx, Instruction *instr);\nint whilels_p_p_rr(context *ctx, Instruction *instr);\nint whilelt_p_p_rr(context *ctx, Instruction *instr);\nint whilerw_p_rr(context *ctx, Instruction *instr);\nint whilewr_p_rr(context *ctx, Instruction *instr);\nint wrffr_f_p(context *ctx, Instruction *instr);\nint xar_z_zzi(context *ctx, Instruction *instr);\nint zero_za_i(context *ctx, Instruction *instr);\nint zip1_p_pp(context *ctx, Instruction *instr);\nint zip1_z_zz(context *ctx, Instruction *instr);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode_fields32.c",
    "content": "/* GENERATED FILE */\n#include <stddef.h>\n#include <stdint.h>\n#include <stdbool.h>\n\n#include \"decode.h\"\n\nvoid decode_fields32(enum ENCODING enc, context *ctx, Instruction *instr)\n{\n\tuint32_t insword = instr->insword;\n\tinstr->encoding = enc; /* record current path of decoding */\n\tswitch(enc) {\n\t\tcase ENC_FMADD_H_FLOATDP3:\n\t\tcase ENC_FMADD_S_FLOATDP3:\n\t\tcase ENC_FMADD_D_FLOATDP3:\n\t\tcase ENC_FMSUB_H_FLOATDP3:\n\t\tcase ENC_FMSUB_S_FLOATDP3:\n\t\tcase ENC_FMSUB_D_FLOATDP3:\n\t\tcase ENC_FNMADD_H_FLOATDP3:\n\t\tcase ENC_FNMADD_S_FLOATDP3:\n\t\tcase ENC_FNMADD_D_FLOATDP3:\n\t\tcase ENC_FNMSUB_H_FLOATDP3:\n\t\tcase ENC_FNMSUB_S_FLOATDP3:\n\t\tcase ENC_FNMSUB_D_FLOATDP3:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|o1=x|Rm=xxxxx|o0=x|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->o1 = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Ra = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCSEL_H_FLOATSEL:\n\t\tcase ENC_FCSEL_S_FLOATSEL:\n\t\tcase ENC_FCSEL_D_FLOATSEL:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|cond=xxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->cond = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCCMPE_H_FLOATCCMP:\n\t\tcase ENC_FCCMPE_S_FLOATCCMP:\n\t\tcase ENC_FCCMPE_D_FLOATCCMP:\n\t\tcase ENC_FCCMP_H_FLOATCCMP:\n\t\tcase ENC_FCCMP_S_FLOATCCMP:\n\t\tcase ENC_FCCMP_D_FLOATCCMP:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|cond=xxxx|xx|Rn=xxxxx|op=x|nzcv=xxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->cond = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->op = (insword>>4)&1;\n\t\t\tctx->nzcv = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_FCMPE_H_FLOATCMP:\n\t\tcase ENC_FCMPE_HZ_FLOATCMP:\n\t\tcase ENC_FCMPE_S_FLOATCMP:\n\t\tcase ENC_FCMPE_SZ_FLOATCMP:\n\t\tcase ENC_FCMPE_D_FLOATCMP:\n\t\tcase ENC_FCMPE_DZ_FLOATCMP:\n\t\tcase ENC_FCMP_H_FLOATCMP:\n\t\tcase ENC_FCMP_HZ_FLOATCMP:\n\t\tcase ENC_FCMP_S_FLOATCMP:\n\t\tcase ENC_FCMP_SZ_FLOATCMP:\n\t\tcase ENC_FCMP_D_FLOATCMP:\n\t\tcase ENC_FCMP_DZ_FLOATCMP:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|op=xx|xxxx|Rn=xxxxx|opc=xx|opcode2[2:0]=xxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>14)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->opc = (insword>>3)&3;\n\t\t\tctx->opcode2 = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_FMUL_H_FLOATDP2:\n\t\tcase ENC_FMUL_S_FLOATDP2:\n\t\tcase ENC_FMUL_D_FLOATDP2:\n\t\tcase ENC_FNMUL_H_FLOATDP2:\n\t\tcase ENC_FNMUL_S_FLOATDP2:\n\t\tcase ENC_FNMUL_D_FLOATDP2:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|op=x|opcode[2:0]=xxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>12)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FDIV_H_FLOATDP2:\n\t\tcase ENC_FDIV_S_FLOATDP2:\n\t\tcase ENC_FDIV_D_FLOATDP2:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|opcode=xxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FADD_H_FLOATDP2:\n\t\tcase ENC_FADD_S_FLOATDP2:\n\t\tcase ENC_FADD_D_FLOATDP2:\n\t\tcase ENC_FSUB_H_FLOATDP2:\n\t\tcase ENC_FSUB_S_FLOATDP2:\n\t\tcase ENC_FSUB_D_FLOATDP2:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|opcode[3:1]=xxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNM_H_FLOATDP2:\n\t\tcase ENC_FMAXNM_S_FLOATDP2:\n\t\tcase ENC_FMAXNM_D_FLOATDP2:\n\t\tcase ENC_FMAX_H_FLOATDP2:\n\t\tcase ENC_FMAX_S_FLOATDP2:\n\t\tcase ENC_FMAX_D_FLOATDP2:\n\t\tcase ENC_FMINNM_H_FLOATDP2:\n\t\tcase ENC_FMINNM_S_FLOATDP2:\n\t\tcase ENC_FMINNM_D_FLOATDP2:\n\t\tcase ENC_FMIN_H_FLOATDP2:\n\t\tcase ENC_FMIN_S_FLOATDP2:\n\t\tcase ENC_FMIN_D_FLOATDP2:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|Rm=xxxxx|opcode[3:2]=xx|op=xx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->op = (insword>>12)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOV_H_FLOATIMM:\n\t\tcase ENC_FMOV_S_FLOATIMM:\n\t\tcase ENC_FMOV_D_FLOATIMM:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|imm8=xxxxxxxx|xxx|imm5=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->imm8 = (insword>>13)&0xff;\n\t\t\tctx->imm5 = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABS_H_FLOATDP1:\n\t\tcase ENC_FABS_S_FLOATDP1:\n\t\tcase ENC_FABS_D_FLOATDP1:\n\t\tcase ENC_FCVT_SH_FLOATDP1:\n\t\tcase ENC_FCVT_DH_FLOATDP1:\n\t\tcase ENC_FCVT_HS_FLOATDP1:\n\t\tcase ENC_FCVT_DS_FLOATDP1:\n\t\tcase ENC_FCVT_HD_FLOATDP1:\n\t\tcase ENC_FCVT_SD_FLOATDP1:\n\t\tcase ENC_FMOV_H_FLOATDP1:\n\t\tcase ENC_FMOV_S_FLOATDP1:\n\t\tcase ENC_FMOV_D_FLOATDP1:\n\t\tcase ENC_FNEG_H_FLOATDP1:\n\t\tcase ENC_FNEG_S_FLOATDP1:\n\t\tcase ENC_FNEG_D_FLOATDP1:\n\t\tcase ENC_FSQRT_H_FLOATDP1:\n\t\tcase ENC_FSQRT_S_FLOATDP1:\n\t\tcase ENC_FSQRT_D_FLOATDP1:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|opcode[5:2]=xxxx|opc=xx|xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>17)&15;\n\t\t\tctx->opc = (insword>>15)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FRINTA_H_FLOATDP1:\n\t\tcase ENC_FRINTA_S_FLOATDP1:\n\t\tcase ENC_FRINTA_D_FLOATDP1:\n\t\tcase ENC_FRINTI_H_FLOATDP1:\n\t\tcase ENC_FRINTI_S_FLOATDP1:\n\t\tcase ENC_FRINTI_D_FLOATDP1:\n\t\tcase ENC_FRINTM_H_FLOATDP1:\n\t\tcase ENC_FRINTM_S_FLOATDP1:\n\t\tcase ENC_FRINTM_D_FLOATDP1:\n\t\tcase ENC_FRINTN_H_FLOATDP1:\n\t\tcase ENC_FRINTN_S_FLOATDP1:\n\t\tcase ENC_FRINTN_D_FLOATDP1:\n\t\tcase ENC_FRINTP_H_FLOATDP1:\n\t\tcase ENC_FRINTP_S_FLOATDP1:\n\t\tcase ENC_FRINTP_D_FLOATDP1:\n\t\tcase ENC_FRINTX_H_FLOATDP1:\n\t\tcase ENC_FRINTX_S_FLOATDP1:\n\t\tcase ENC_FRINTX_D_FLOATDP1:\n\t\tcase ENC_FRINTZ_H_FLOATDP1:\n\t\tcase ENC_FRINTZ_S_FLOATDP1:\n\t\tcase ENC_FRINTZ_D_FLOATDP1:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|opcode[5:3]=xxx|rmode=xxx|xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>18)&7;\n\t\t\tctx->rmode = (insword>>15)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FRINT32X_S_FLOATDP1:\n\t\tcase ENC_FRINT32X_D_FLOATDP1:\n\t\tcase ENC_FRINT32Z_S_FLOATDP1:\n\t\tcase ENC_FRINT32Z_D_FLOATDP1:\n\t\tcase ENC_FRINT64X_S_FLOATDP1:\n\t\tcase ENC_FRINT64X_D_FLOATDP1:\n\t\tcase ENC_FRINT64Z_S_FLOATDP1:\n\t\tcase ENC_FRINT64Z_D_FLOATDP1:\n\t\t\t// M=x|x|S=x|xxxxx|ftype=xx|x|xxxx|op=xx|xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->op = (insword>>15)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFCVT_BS_FLOATDP1:\n\t\t\t// M=x|x|S=x|xxxxx|ptype=xx|x|opcode=xxxxxx|xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->M = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ptype = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>15)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TBNZ_ONLY_TESTBRANCH:\n\t\tcase ENC_TBZ_ONLY_TESTBRANCH:\n\t\t\t// b5=x|xxxxxx|op=x|b40=xxxxx|imm14=xxxxxxxxxxxxxx|Rt=xxxxx\n\t\t\tctx->b5 = insword>>31;\n\t\t\tctx->op = (insword>>24)&1;\n\t\t\tctx->b40 = (insword>>19)&0x1f;\n\t\t\tctx->imm14 = (insword>>5)&0x3fff;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADR_ONLY_PCRELADDR:\n\t\tcase ENC_ADRP_ONLY_PCRELADDR:\n\t\t\t// op=x|immlo=xx|xxxxx|immhi=xxxxxxxxxxxxxxxxxxx|Rd=xxxxx\n\t\t\tctx->op = insword>>31;\n\t\t\tctx->immlo = (insword>>29)&3;\n\t\t\tctx->immhi = (insword>>5)&0x7ffff;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BL_ONLY_BRANCH_IMM:\n\t\tcase ENC_B_ONLY_BRANCH_IMM:\n\t\t\t// op=x|xxxxx|imm26=xxxxxxxxxxxxxxxxxxxxxxxxxx\n\t\t\tctx->op = insword>>31;\n\t\t\tctx->imm26 = insword&0x3ffffff;\n\t\t\tbreak;\n\t\tcase ENC_LDNP_S_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_D_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_Q_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_32_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_64_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDPSW_64_LDSTPAIR_POST:\n\t\tcase ENC_LDPSW_64_LDSTPAIR_PRE:\n\t\tcase ENC_LDPSW_64_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_S_LDSTPAIR_POST:\n\t\tcase ENC_LDP_D_LDSTPAIR_POST:\n\t\tcase ENC_LDP_Q_LDSTPAIR_POST:\n\t\tcase ENC_LDP_S_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_D_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_Q_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_S_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_D_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_Q_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_32_LDSTPAIR_POST:\n\t\tcase ENC_LDP_64_LDSTPAIR_POST:\n\t\tcase ENC_LDP_32_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_64_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_32_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_64_LDSTPAIR_OFF:\n\t\tcase ENC_STNP_S_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_D_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_Q_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_32_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_64_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STP_S_LDSTPAIR_POST:\n\t\tcase ENC_STP_D_LDSTPAIR_POST:\n\t\tcase ENC_STP_Q_LDSTPAIR_POST:\n\t\tcase ENC_STP_S_LDSTPAIR_PRE:\n\t\tcase ENC_STP_D_LDSTPAIR_PRE:\n\t\tcase ENC_STP_Q_LDSTPAIR_PRE:\n\t\tcase ENC_STP_S_LDSTPAIR_OFF:\n\t\tcase ENC_STP_D_LDSTPAIR_OFF:\n\t\tcase ENC_STP_Q_LDSTPAIR_OFF:\n\t\tcase ENC_STP_32_LDSTPAIR_POST:\n\t\tcase ENC_STP_64_LDSTPAIR_POST:\n\t\tcase ENC_STP_32_LDSTPAIR_PRE:\n\t\tcase ENC_STP_64_LDSTPAIR_PRE:\n\t\tcase ENC_STP_32_LDSTPAIR_OFF:\n\t\tcase ENC_STP_64_LDSTPAIR_OFF:\n\t\t\t// opc=xx|xxx|V=x|xxx|L=x|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->opc = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->imm7 = (insword>>15)&0x7f;\n\t\t\tctx->Rt2 = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_STGP_64_LDSTPAIR_POST:\n\t\tcase ENC_STGP_64_LDSTPAIR_PRE:\n\t\tcase ENC_STGP_64_LDSTPAIR_OFF:\n\t\t\t// opc=xx|xxx|V=x|xxx|L=x|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx\n\t\t\tctx->opc = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->simm7 = (insword>>15)&0x7f;\n\t\t\tctx->Xt2 = (insword>>10)&0x1f;\n\t\t\tctx->Xn = (insword>>5)&0x1f;\n\t\t\tctx->Xt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDRSW_64_LOADLIT:\n\t\tcase ENC_LDR_S_LOADLIT:\n\t\tcase ENC_LDR_D_LOADLIT:\n\t\tcase ENC_LDR_Q_LOADLIT:\n\t\tcase ENC_LDR_32_LOADLIT:\n\t\tcase ENC_LDR_64_LOADLIT:\n\t\tcase ENC_PRFM_P_LOADLIT:\n\t\t\t// opc=xx|xxx|V=x|xx|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx\n\t\t\tctx->opc = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->imm19 = (insword>>5)&0x7ffff;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_EXTR_32_EXTRACT:\n\t\tcase ENC_EXTR_64_EXTRACT:\n\t\tcase ENC_ROR_EXTR_32_EXTRACT:\n\t\tcase ENC_ROR_EXTR_64_EXTRACT:\n\t\t\t// sf=x|op21=xx|xxxxxx|N=x|o0=x|Rm=xxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op21 = (insword>>29)&3;\n\t\t\tctx->N = (insword>>22)&1;\n\t\t\tctx->o0 = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imms = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMADDL_64WA_DP_3SRC:\n\t\tcase ENC_SMNEGL_SMSUBL_64WA_DP_3SRC:\n\t\tcase ENC_SMSUBL_64WA_DP_3SRC:\n\t\tcase ENC_SMULH_64_DP_3SRC:\n\t\tcase ENC_SMULL_SMADDL_64WA_DP_3SRC:\n\t\tcase ENC_UMADDL_64WA_DP_3SRC:\n\t\tcase ENC_UMNEGL_UMSUBL_64WA_DP_3SRC:\n\t\tcase ENC_UMSUBL_64WA_DP_3SRC:\n\t\tcase ENC_UMULH_64_DP_3SRC:\n\t\tcase ENC_UMULL_UMADDL_64WA_DP_3SRC:\n\t\t\t// sf=x|op54=xx|xxxxx|U=x|op31[1:0]=xx|Rm=xxxxx|o0=x|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op54 = (insword>>29)&3;\n\t\t\tctx->U = (insword>>23)&1;\n\t\t\tctx->op31 = (insword>>21)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Ra = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MADD_32A_DP_3SRC:\n\t\tcase ENC_MADD_64A_DP_3SRC:\n\t\tcase ENC_MNEG_MSUB_32A_DP_3SRC:\n\t\tcase ENC_MNEG_MSUB_64A_DP_3SRC:\n\t\tcase ENC_MSUB_32A_DP_3SRC:\n\t\tcase ENC_MSUB_64A_DP_3SRC:\n\t\tcase ENC_MUL_MADD_32A_DP_3SRC:\n\t\tcase ENC_MUL_MADD_64A_DP_3SRC:\n\t\t\t// sf=x|op54=xx|xxxxx|op31=xxx|Rm=xxxxx|o0=x|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op54 = (insword>>29)&3;\n\t\t\tctx->op31 = (insword>>21)&7;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Ra = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CINC_CSINC_32_CONDSEL:\n\t\tcase ENC_CINC_CSINC_64_CONDSEL:\n\t\tcase ENC_CINV_CSINV_32_CONDSEL:\n\t\tcase ENC_CINV_CSINV_64_CONDSEL:\n\t\tcase ENC_CNEG_CSNEG_32_CONDSEL:\n\t\tcase ENC_CNEG_CSNEG_64_CONDSEL:\n\t\tcase ENC_CSEL_32_CONDSEL:\n\t\tcase ENC_CSEL_64_CONDSEL:\n\t\tcase ENC_CSETM_CSINV_32_CONDSEL:\n\t\tcase ENC_CSETM_CSINV_64_CONDSEL:\n\t\tcase ENC_CSET_CSINC_32_CONDSEL:\n\t\tcase ENC_CSET_CSINC_64_CONDSEL:\n\t\tcase ENC_CSINC_32_CONDSEL:\n\t\tcase ENC_CSINC_64_CONDSEL:\n\t\tcase ENC_CSINV_32_CONDSEL:\n\t\tcase ENC_CSINV_64_CONDSEL:\n\t\tcase ENC_CSNEG_32_CONDSEL:\n\t\tcase ENC_CSNEG_64_CONDSEL:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|cond=xxxx|op2[1]=x|o2=x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->cond = (insword>>12)&15;\n\t\t\tctx->op2 = (insword>>11)&1;\n\t\t\tctx->o2 = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CCMN_32_CONDCMP_REG:\n\t\tcase ENC_CCMN_64_CONDCMP_REG:\n\t\tcase ENC_CCMP_32_CONDCMP_REG:\n\t\tcase ENC_CCMP_64_CONDCMP_REG:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|cond=xxxx|x|o2=x|Rn=xxxxx|o3=x|nzcv=xxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->cond = (insword>>12)&15;\n\t\t\tctx->o2 = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->o3 = (insword>>4)&1;\n\t\t\tctx->nzcv = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_PACGA_64P_DP_2SRC:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|opcode2=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode2 = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SDIV_32_DP_2SRC:\n\t\tcase ENC_SDIV_64_DP_2SRC:\n\t\tcase ENC_UDIV_32_DP_2SRC:\n\t\tcase ENC_UDIV_64_DP_2SRC:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|opcode2[5:1]=xxxxx|o1=x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode2 = (insword>>11)&0x1f;\n\t\t\tctx->o1 = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ASRV_32_DP_2SRC:\n\t\tcase ENC_ASRV_64_DP_2SRC:\n\t\tcase ENC_ASR_ASRV_32_DP_2SRC:\n\t\tcase ENC_ASR_ASRV_64_DP_2SRC:\n\t\tcase ENC_LSLV_32_DP_2SRC:\n\t\tcase ENC_LSLV_64_DP_2SRC:\n\t\tcase ENC_LSL_LSLV_32_DP_2SRC:\n\t\tcase ENC_LSL_LSLV_64_DP_2SRC:\n\t\tcase ENC_LSRV_32_DP_2SRC:\n\t\tcase ENC_LSRV_64_DP_2SRC:\n\t\tcase ENC_LSR_LSRV_32_DP_2SRC:\n\t\tcase ENC_LSR_LSRV_64_DP_2SRC:\n\t\tcase ENC_RORV_32_DP_2SRC:\n\t\tcase ENC_RORV_64_DP_2SRC:\n\t\tcase ENC_ROR_RORV_32_DP_2SRC:\n\t\tcase ENC_ROR_RORV_64_DP_2SRC:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|opcode2[5:2]=xxxx|op2=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode2 = (insword>>12)&15;\n\t\t\tctx->op2 = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CRC32B_32C_DP_2SRC:\n\t\tcase ENC_CRC32H_32C_DP_2SRC:\n\t\tcase ENC_CRC32W_32C_DP_2SRC:\n\t\tcase ENC_CRC32X_64C_DP_2SRC:\n\t\tcase ENC_CRC32CB_32C_DP_2SRC:\n\t\tcase ENC_CRC32CH_32C_DP_2SRC:\n\t\tcase ENC_CRC32CW_32C_DP_2SRC:\n\t\tcase ENC_CRC32CX_64C_DP_2SRC:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|opcode2[5:3]=xxx|C=x|sz=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode2 = (insword>>13)&7;\n\t\t\tctx->C = (insword>>12)&1;\n\t\t\tctx->sz = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADC_32_ADDSUB_CARRY:\n\t\tcase ENC_ADC_64_ADDSUB_CARRY:\n\t\tcase ENC_ADCS_32_ADDSUB_CARRY:\n\t\tcase ENC_ADCS_64_ADDSUB_CARRY:\n\t\tcase ENC_NGCS_SBCS_32_ADDSUB_CARRY:\n\t\tcase ENC_NGCS_SBCS_64_ADDSUB_CARRY:\n\t\tcase ENC_NGC_SBC_32_ADDSUB_CARRY:\n\t\tcase ENC_NGC_SBC_64_ADDSUB_CARRY:\n\t\tcase ENC_SBC_32_ADDSUB_CARRY:\n\t\tcase ENC_SBC_64_ADDSUB_CARRY:\n\t\tcase ENC_SBCS_32_ADDSUB_CARRY:\n\t\tcase ENC_SBCS_64_ADDSUB_CARRY:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|Rm=xxxxx|xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CCMN_32_CONDCMP_IMM:\n\t\tcase ENC_CCMN_64_CONDCMP_IMM:\n\t\tcase ENC_CCMP_32_CONDCMP_IMM:\n\t\tcase ENC_CCMP_64_CONDCMP_IMM:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|imm5=xxxxx|cond=xxxx|x|o2=x|Rn=xxxxx|o3=x|nzcv=xxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->cond = (insword>>12)&15;\n\t\t\tctx->o2 = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->o3 = (insword>>4)&1;\n\t\t\tctx->nzcv = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_RMIF_ONLY_RMIF:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|imm6=xxxxxx|xxxxx|Rn=xxxxx|o2=x|mask=xxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->imm6 = (insword>>15)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->o2 = (insword>>4)&1;\n\t\t\tctx->mask = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_SETF8_ONLY_SETF:\n\t\tcase ENC_SETF16_ONLY_SETF:\n\t\t\t// sf=x|op=x|S=x|xxxxxxxx|opcode2=xxxxxx|sz=x|xxxx|Rn=xxxxx|o3=x|mask=xxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>15)&0x3f;\n\t\t\tctx->sz = (insword>>14)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->o3 = (insword>>4)&1;\n\t\t\tctx->mask = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_ADDG_64_ADDSUB_IMMTAGS:\n\t\tcase ENC_SUBG_64_ADDSUB_IMMTAGS:\n\t\t\t// sf=x|op=x|S=x|xxxxxx|o2=x|uimm6=xxxxxx|op3=xx|uimm4=xxxx|Xn=xxxxx|Xd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->o2 = (insword>>22)&1;\n\t\t\tctx->uimm6 = (insword>>16)&0x3f;\n\t\t\tctx->op3 = (insword>>14)&3;\n\t\t\tctx->uimm4 = (insword>>10)&15;\n\t\t\tctx->Xn = (insword>>5)&0x1f;\n\t\t\tctx->Xd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDS_32S_ADDSUB_IMM:\n\t\tcase ENC_ADDS_64S_ADDSUB_IMM:\n\t\tcase ENC_ADD_32_ADDSUB_IMM:\n\t\tcase ENC_ADD_64_ADDSUB_IMM:\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_IMM:\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_IMM:\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_IMM:\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_IMM:\n\t\tcase ENC_MOV_ADD_32_ADDSUB_IMM:\n\t\tcase ENC_MOV_ADD_64_ADDSUB_IMM:\n\t\tcase ENC_SUBS_32S_ADDSUB_IMM:\n\t\tcase ENC_SUBS_64S_ADDSUB_IMM:\n\t\tcase ENC_SUB_32_ADDSUB_IMM:\n\t\tcase ENC_SUB_64_ADDSUB_IMM:\n\t\t\t// sf=x|op=x|S=x|xxxxxx|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->sh = (insword>>22)&1;\n\t\t\tctx->imm12 = (insword>>10)&0xfff;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDS_32S_ADDSUB_EXT:\n\t\tcase ENC_ADDS_64S_ADDSUB_EXT:\n\t\tcase ENC_ADD_32_ADDSUB_EXT:\n\t\tcase ENC_ADD_64_ADDSUB_EXT:\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_EXT:\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_EXT:\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_EXT:\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_EXT:\n\t\tcase ENC_SUBS_32S_ADDSUB_EXT:\n\t\tcase ENC_SUBS_64S_ADDSUB_EXT:\n\t\tcase ENC_SUB_32_ADDSUB_EXT:\n\t\tcase ENC_SUB_64_ADDSUB_EXT:\n\t\t\t// sf=x|op=x|S=x|xxxxx|opt=xx|x|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opt = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->option = (insword>>13)&7;\n\t\t\tctx->imm3 = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDS_32_ADDSUB_SHIFT:\n\t\tcase ENC_ADDS_64_ADDSUB_SHIFT:\n\t\tcase ENC_ADD_32_ADDSUB_SHIFT:\n\t\tcase ENC_ADD_64_ADDSUB_SHIFT:\n\t\tcase ENC_CMN_ADDS_32_ADDSUB_SHIFT:\n\t\tcase ENC_CMN_ADDS_64_ADDSUB_SHIFT:\n\t\tcase ENC_CMP_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_CMP_SUBS_64_ADDSUB_SHIFT:\n\t\tcase ENC_NEGS_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_NEGS_SUBS_64_ADDSUB_SHIFT:\n\t\tcase ENC_NEG_SUB_32_ADDSUB_SHIFT:\n\t\tcase ENC_NEG_SUB_64_ADDSUB_SHIFT:\n\t\tcase ENC_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_SUBS_64_ADDSUB_SHIFT:\n\t\tcase ENC_SUB_32_ADDSUB_SHIFT:\n\t\tcase ENC_SUB_64_ADDSUB_SHIFT:\n\t\t\t// sf=x|op=x|S=x|xxxxx|shift=xx|x|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>30)&1;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->shift = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm6 = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ANDS_32S_LOG_IMM:\n\t\tcase ENC_ANDS_64S_LOG_IMM:\n\t\tcase ENC_AND_32_LOG_IMM:\n\t\tcase ENC_AND_64_LOG_IMM:\n\t\tcase ENC_ASR_SBFM_32M_BITFIELD:\n\t\tcase ENC_ASR_SBFM_64M_BITFIELD:\n\t\tcase ENC_BFC_BFM_32M_BITFIELD:\n\t\tcase ENC_BFC_BFM_64M_BITFIELD:\n\t\tcase ENC_BFI_BFM_32M_BITFIELD:\n\t\tcase ENC_BFI_BFM_64M_BITFIELD:\n\t\tcase ENC_BFM_32M_BITFIELD:\n\t\tcase ENC_BFM_64M_BITFIELD:\n\t\tcase ENC_BFXIL_BFM_32M_BITFIELD:\n\t\tcase ENC_BFXIL_BFM_64M_BITFIELD:\n\t\tcase ENC_EOR_32_LOG_IMM:\n\t\tcase ENC_EOR_64_LOG_IMM:\n\t\tcase ENC_LSL_UBFM_32M_BITFIELD:\n\t\tcase ENC_LSL_UBFM_64M_BITFIELD:\n\t\tcase ENC_LSR_UBFM_32M_BITFIELD:\n\t\tcase ENC_LSR_UBFM_64M_BITFIELD:\n\t\tcase ENC_MOV_ORR_32_LOG_IMM:\n\t\tcase ENC_MOV_ORR_64_LOG_IMM:\n\t\tcase ENC_ORR_32_LOG_IMM:\n\t\tcase ENC_ORR_64_LOG_IMM:\n\t\tcase ENC_SBFIZ_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFIZ_SBFM_64M_BITFIELD:\n\t\tcase ENC_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFM_64M_BITFIELD:\n\t\tcase ENC_SBFX_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFX_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTB_SBFM_32M_BITFIELD:\n\t\tcase ENC_SXTB_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTH_SBFM_32M_BITFIELD:\n\t\tcase ENC_SXTH_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTW_SBFM_64M_BITFIELD:\n\t\tcase ENC_TST_ANDS_32S_LOG_IMM:\n\t\tcase ENC_TST_ANDS_64S_LOG_IMM:\n\t\tcase ENC_UBFIZ_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFIZ_UBFM_64M_BITFIELD:\n\t\tcase ENC_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFM_64M_BITFIELD:\n\t\tcase ENC_UBFX_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFX_UBFM_64M_BITFIELD:\n\t\tcase ENC_UXTB_UBFM_32M_BITFIELD:\n\t\tcase ENC_UXTH_UBFM_32M_BITFIELD:\n\t\t\t// sf=x|opc=xx|xxxxxx|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->opc = (insword>>29)&3;\n\t\t\tctx->N = (insword>>22)&1;\n\t\t\tctx->immr = (insword>>16)&0x3f;\n\t\t\tctx->imms = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOVK_32_MOVEWIDE:\n\t\tcase ENC_MOVK_64_MOVEWIDE:\n\t\tcase ENC_MOVN_32_MOVEWIDE:\n\t\tcase ENC_MOVN_64_MOVEWIDE:\n\t\tcase ENC_MOVZ_32_MOVEWIDE:\n\t\tcase ENC_MOVZ_64_MOVEWIDE:\n\t\tcase ENC_MOV_MOVN_32_MOVEWIDE:\n\t\tcase ENC_MOV_MOVN_64_MOVEWIDE:\n\t\tcase ENC_MOV_MOVZ_32_MOVEWIDE:\n\t\tcase ENC_MOV_MOVZ_64_MOVEWIDE:\n\t\t\t// sf=x|opc=xx|xxxxxx|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->opc = (insword>>29)&3;\n\t\t\tctx->hw = (insword>>21)&3;\n\t\t\tctx->imm16 = (insword>>5)&0xffff;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ANDS_32_LOG_SHIFT:\n\t\tcase ENC_ANDS_64_LOG_SHIFT:\n\t\tcase ENC_AND_32_LOG_SHIFT:\n\t\tcase ENC_AND_64_LOG_SHIFT:\n\t\tcase ENC_BICS_32_LOG_SHIFT:\n\t\tcase ENC_BICS_64_LOG_SHIFT:\n\t\tcase ENC_BIC_32_LOG_SHIFT:\n\t\tcase ENC_BIC_64_LOG_SHIFT:\n\t\tcase ENC_EON_32_LOG_SHIFT:\n\t\tcase ENC_EON_64_LOG_SHIFT:\n\t\tcase ENC_EOR_32_LOG_SHIFT:\n\t\tcase ENC_EOR_64_LOG_SHIFT:\n\t\tcase ENC_MOV_ORR_32_LOG_SHIFT:\n\t\tcase ENC_MOV_ORR_64_LOG_SHIFT:\n\t\tcase ENC_MVN_ORN_32_LOG_SHIFT:\n\t\tcase ENC_MVN_ORN_64_LOG_SHIFT:\n\t\tcase ENC_ORN_32_LOG_SHIFT:\n\t\tcase ENC_ORN_64_LOG_SHIFT:\n\t\tcase ENC_ORR_32_LOG_SHIFT:\n\t\tcase ENC_ORR_64_LOG_SHIFT:\n\t\tcase ENC_TST_ANDS_32_LOG_SHIFT:\n\t\tcase ENC_TST_ANDS_64_LOG_SHIFT:\n\t\t\t// sf=x|opc=xx|xxxxx|shift=xx|N=x|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->opc = (insword>>29)&3;\n\t\t\tctx->shift = (insword>>22)&3;\n\t\t\tctx->N = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm6 = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CBNZ_32_COMPBRANCH:\n\t\tcase ENC_CBNZ_64_COMPBRANCH:\n\t\tcase ENC_CBZ_32_COMPBRANCH:\n\t\tcase ENC_CBZ_64_COMPBRANCH:\n\t\t\t// sf=x|xxxxxx|op=x|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->op = (insword>>24)&1;\n\t\t\tctx->imm19 = (insword>>5)&0x7ffff;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMPP_SUBPS_64S_DP_2SRC:\n\t\tcase ENC_GMI_64G_DP_2SRC:\n\t\tcase ENC_IRG_64I_DP_2SRC:\n\t\tcase ENC_SUBP_64S_DP_2SRC:\n\t\tcase ENC_SUBPS_64S_DP_2SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|Xm=xxxxx|opcode=xxxxxx|Xn=xxxxx|Xd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->Xm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>10)&0x3f;\n\t\t\tctx->Xn = (insword>>5)&0x1f;\n\t\t\tctx->Xd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CLS_32_DP_1SRC:\n\t\tcase ENC_CLS_64_DP_1SRC:\n\t\tcase ENC_CLZ_32_DP_1SRC:\n\t\tcase ENC_CLZ_64_DP_1SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|opcode2=xxxxx|opcode[5:1]=xxxxx|op=x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_REV_32_DP_1SRC:\n\t\tcase ENC_REV_64_DP_1SRC:\n\t\tcase ENC_REV16_32_DP_1SRC:\n\t\tcase ENC_REV16_64_DP_1SRC:\n\t\tcase ENC_REV32_64_DP_1SRC:\n\t\tcase ENC_REV64_REV_64_DP_1SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|opcode2=xxxxx|opcode[5:2]=xxxx|opc=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->opc = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_RBIT_32_DP_1SRC:\n\t\tcase ENC_RBIT_64_DP_1SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|opcode2=xxxxx|opcode[5:2]=xxxx|opcode[1:0]=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->opcode = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_AUTDA_64P_DP_1SRC:\n\t\tcase ENC_AUTDZA_64Z_DP_1SRC:\n\t\tcase ENC_AUTDB_64P_DP_1SRC:\n\t\tcase ENC_AUTDZB_64Z_DP_1SRC:\n\t\tcase ENC_AUTIA_64P_DP_1SRC:\n\t\tcase ENC_AUTIZA_64Z_DP_1SRC:\n\t\tcase ENC_AUTIB_64P_DP_1SRC:\n\t\tcase ENC_AUTIZB_64Z_DP_1SRC:\n\t\tcase ENC_PACDA_64P_DP_1SRC:\n\t\tcase ENC_PACDZA_64Z_DP_1SRC:\n\t\tcase ENC_PACDB_64P_DP_1SRC:\n\t\tcase ENC_PACDZB_64Z_DP_1SRC:\n\t\tcase ENC_PACIA_64P_DP_1SRC:\n\t\tcase ENC_PACIZA_64Z_DP_1SRC:\n\t\tcase ENC_PACIB_64P_DP_1SRC:\n\t\tcase ENC_PACIZB_64Z_DP_1SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|opcode2=xxxxx|opcode[5]=x|opcode[4]=x|Z=x|opcode[2:0]=xxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>14)&1;\n\t\t\tctx->Z = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_XPACD_64Z_DP_1SRC:\n\t\tcase ENC_XPACI_64Z_DP_1SRC:\n\t\t\t// sf=x|x|S=x|xxxxxxxx|opcode2=xxxxx|opcode[5]=x|opcode[4]=x|opcode[3:1]=xxx|D=x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->opcode2 = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>11)&7;\n\t\t\tctx->D = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTZS_32H_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64H_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_32S_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64S_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_32D_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64D_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32H_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64H_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32S_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64S_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32D_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64D_FLOAT2FIX:\n\t\tcase ENC_SCVTF_H32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_S32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_D32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_H64_FLOAT2FIX:\n\t\tcase ENC_SCVTF_S64_FLOAT2FIX:\n\t\tcase ENC_SCVTF_D64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_H32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_S32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_D32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_H64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_S64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_D64_FLOAT2FIX:\n\t\t\t// sf=x|x|S=x|xxxxx|ftype=xx|x|rmode=xx|opcode=xxx|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->rmode = (insword>>19)&3;\n\t\t\tctx->opcode = (insword>>16)&7;\n\t\t\tctx->scale = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTAS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTAS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTAS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTAU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTAU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTAU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64D_FLOAT2INT:\n\t\tcase ENC_FCVTMS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTMS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTMS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTMU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTMU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTMU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64D_FLOAT2INT:\n\t\tcase ENC_FCVTNS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTNS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTNS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTNU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTNU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTNU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64D_FLOAT2INT:\n\t\tcase ENC_FCVTPS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTPS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTPS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTPU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTPU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTPU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64D_FLOAT2INT:\n\t\tcase ENC_FCVTZS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTZS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTZS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTZU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTZU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTZU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64D_FLOAT2INT:\n\t\tcase ENC_FJCVTZS_32D_FLOAT2INT:\n\t\tcase ENC_FMOV_32H_FLOAT2INT:\n\t\tcase ENC_FMOV_64H_FLOAT2INT:\n\t\tcase ENC_FMOV_H32_FLOAT2INT:\n\t\tcase ENC_FMOV_S32_FLOAT2INT:\n\t\tcase ENC_FMOV_32S_FLOAT2INT:\n\t\tcase ENC_FMOV_H64_FLOAT2INT:\n\t\tcase ENC_FMOV_D64_FLOAT2INT:\n\t\tcase ENC_FMOV_V64I_FLOAT2INT:\n\t\tcase ENC_FMOV_64D_FLOAT2INT:\n\t\tcase ENC_FMOV_64VX_FLOAT2INT:\n\t\tcase ENC_SCVTF_H32_FLOAT2INT:\n\t\tcase ENC_SCVTF_S32_FLOAT2INT:\n\t\tcase ENC_SCVTF_D32_FLOAT2INT:\n\t\tcase ENC_SCVTF_H64_FLOAT2INT:\n\t\tcase ENC_SCVTF_S64_FLOAT2INT:\n\t\tcase ENC_SCVTF_D64_FLOAT2INT:\n\t\tcase ENC_UCVTF_H32_FLOAT2INT:\n\t\tcase ENC_UCVTF_S32_FLOAT2INT:\n\t\tcase ENC_UCVTF_D32_FLOAT2INT:\n\t\tcase ENC_UCVTF_H64_FLOAT2INT:\n\t\tcase ENC_UCVTF_S64_FLOAT2INT:\n\t\tcase ENC_UCVTF_D64_FLOAT2INT:\n\t\t\t// sf=x|x|S=x|xxxxx|ftype=xx|x|rmode=xx|opcode=xxx|xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->sf = insword>>31;\n\t\t\tctx->S = (insword>>29)&1;\n\t\t\tctx->ftype = (insword>>22)&3;\n\t\t\tctx->rmode = (insword>>19)&3;\n\t\t\tctx->opcode = (insword>>16)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CAS_C32_COMSWAP:\n\t\tcase ENC_CASA_C32_COMSWAP:\n\t\tcase ENC_CASAL_C32_COMSWAP:\n\t\tcase ENC_CASL_C32_COMSWAP:\n\t\tcase ENC_CAS_C64_COMSWAP:\n\t\tcase ENC_CASA_C64_COMSWAP:\n\t\tcase ENC_CASAL_C64_COMSWAP:\n\t\tcase ENC_CASL_C64_COMSWAP:\n\t\tcase ENC_CASAB_C32_COMSWAP:\n\t\tcase ENC_CASALB_C32_COMSWAP:\n\t\tcase ENC_CASB_C32_COMSWAP:\n\t\tcase ENC_CASLB_C32_COMSWAP:\n\t\tcase ENC_CASAH_C32_COMSWAP:\n\t\tcase ENC_CASALH_C32_COMSWAP:\n\t\tcase ENC_CASH_C32_COMSWAP:\n\t\tcase ENC_CASLH_C32_COMSWAP:\n\t\t\t// size=xx|xxxxxxx|L=x|x|Rs=xxxxx|o0=x|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->Rs = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Rt2 = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDAR_LR32_LDSTORD:\n\t\tcase ENC_LDAR_LR64_LDSTORD:\n\t\tcase ENC_LDARB_LR32_LDSTORD:\n\t\tcase ENC_LDARH_LR32_LDSTORD:\n\t\tcase ENC_LDAXR_LR32_LDSTEXCLR:\n\t\tcase ENC_LDAXR_LR64_LDSTEXCLR:\n\t\tcase ENC_LDAXRB_LR32_LDSTEXCLR:\n\t\tcase ENC_LDAXRH_LR32_LDSTEXCLR:\n\t\tcase ENC_LDLAR_LR32_LDSTORD:\n\t\tcase ENC_LDLAR_LR64_LDSTORD:\n\t\tcase ENC_LDLARB_LR32_LDSTORD:\n\t\tcase ENC_LDLARH_LR32_LDSTORD:\n\t\tcase ENC_LDXR_LR32_LDSTEXCLR:\n\t\tcase ENC_LDXR_LR64_LDSTEXCLR:\n\t\tcase ENC_LDXRB_LR32_LDSTEXCLR:\n\t\tcase ENC_LDXRH_LR32_LDSTEXCLR:\n\t\tcase ENC_STLLR_SL32_LDSTORD:\n\t\tcase ENC_STLLR_SL64_LDSTORD:\n\t\tcase ENC_STLLRB_SL32_LDSTORD:\n\t\tcase ENC_STLLRH_SL32_LDSTORD:\n\t\tcase ENC_STLR_SL32_LDSTORD:\n\t\tcase ENC_STLR_SL64_LDSTORD:\n\t\tcase ENC_STLRB_SL32_LDSTORD:\n\t\tcase ENC_STLRH_SL32_LDSTORD:\n\t\tcase ENC_STLXR_SR32_LDSTEXCLR:\n\t\tcase ENC_STLXR_SR64_LDSTEXCLR:\n\t\tcase ENC_STLXRB_SR32_LDSTEXCLR:\n\t\tcase ENC_STLXRH_SR32_LDSTEXCLR:\n\t\tcase ENC_STXR_SR32_LDSTEXCLR:\n\t\tcase ENC_STXR_SR64_LDSTEXCLR:\n\t\tcase ENC_STXRB_SR32_LDSTEXCLR:\n\t\tcase ENC_STXRH_SR32_LDSTEXCLR:\n\t\t\t// size=xx|xxxxxx|o2=x|L=x|o1=x|Rs=xxxxx|o0=x|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->o1 = (insword>>21)&1;\n\t\t\tctx->Rs = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Rt2 = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDAPURB_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURH_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSB_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSB_64_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSH_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSH_64_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSW_64_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPUR_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPUR_64_LDAPSTL_UNSCALED:\n\t\tcase ENC_STLURB_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_STLURH_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_STLUR_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_STLUR_64_LDAPSTL_UNSCALED:\n\t\t\t// size=xx|xxxxxx|opc=xx|x|imm9=xxxxxxxxx|xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->imm9 = (insword>>12)&0x1ff;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD64B_64L_MEMOP:\n\t\tcase ENC_LDADD_32_MEMOP:\n\t\tcase ENC_LDADDA_32_MEMOP:\n\t\tcase ENC_LDADDAL_32_MEMOP:\n\t\tcase ENC_LDADDL_32_MEMOP:\n\t\tcase ENC_LDADD_64_MEMOP:\n\t\tcase ENC_LDADDA_64_MEMOP:\n\t\tcase ENC_LDADDAL_64_MEMOP:\n\t\tcase ENC_LDADDL_64_MEMOP:\n\t\tcase ENC_LDADDAB_32_MEMOP:\n\t\tcase ENC_LDADDALB_32_MEMOP:\n\t\tcase ENC_LDADDB_32_MEMOP:\n\t\tcase ENC_LDADDLB_32_MEMOP:\n\t\tcase ENC_LDADDAH_32_MEMOP:\n\t\tcase ENC_LDADDALH_32_MEMOP:\n\t\tcase ENC_LDADDH_32_MEMOP:\n\t\tcase ENC_LDADDLH_32_MEMOP:\n\t\tcase ENC_LDAPR_32L_MEMOP:\n\t\tcase ENC_LDAPR_64L_MEMOP:\n\t\tcase ENC_LDAPRB_32L_MEMOP:\n\t\tcase ENC_LDAPRH_32L_MEMOP:\n\t\tcase ENC_LDCLR_32_MEMOP:\n\t\tcase ENC_LDCLRA_32_MEMOP:\n\t\tcase ENC_LDCLRAL_32_MEMOP:\n\t\tcase ENC_LDCLRL_32_MEMOP:\n\t\tcase ENC_LDCLR_64_MEMOP:\n\t\tcase ENC_LDCLRA_64_MEMOP:\n\t\tcase ENC_LDCLRAL_64_MEMOP:\n\t\tcase ENC_LDCLRL_64_MEMOP:\n\t\tcase ENC_LDCLRAB_32_MEMOP:\n\t\tcase ENC_LDCLRALB_32_MEMOP:\n\t\tcase ENC_LDCLRB_32_MEMOP:\n\t\tcase ENC_LDCLRLB_32_MEMOP:\n\t\tcase ENC_LDCLRAH_32_MEMOP:\n\t\tcase ENC_LDCLRALH_32_MEMOP:\n\t\tcase ENC_LDCLRH_32_MEMOP:\n\t\tcase ENC_LDCLRLH_32_MEMOP:\n\t\tcase ENC_LDEOR_32_MEMOP:\n\t\tcase ENC_LDEORA_32_MEMOP:\n\t\tcase ENC_LDEORAL_32_MEMOP:\n\t\tcase ENC_LDEORL_32_MEMOP:\n\t\tcase ENC_LDEOR_64_MEMOP:\n\t\tcase ENC_LDEORA_64_MEMOP:\n\t\tcase ENC_LDEORAL_64_MEMOP:\n\t\tcase ENC_LDEORL_64_MEMOP:\n\t\tcase ENC_LDEORAB_32_MEMOP:\n\t\tcase ENC_LDEORALB_32_MEMOP:\n\t\tcase ENC_LDEORB_32_MEMOP:\n\t\tcase ENC_LDEORLB_32_MEMOP:\n\t\tcase ENC_LDEORAH_32_MEMOP:\n\t\tcase ENC_LDEORALH_32_MEMOP:\n\t\tcase ENC_LDEORH_32_MEMOP:\n\t\tcase ENC_LDEORLH_32_MEMOP:\n\t\tcase ENC_LDSET_32_MEMOP:\n\t\tcase ENC_LDSETA_32_MEMOP:\n\t\tcase ENC_LDSETAL_32_MEMOP:\n\t\tcase ENC_LDSETL_32_MEMOP:\n\t\tcase ENC_LDSET_64_MEMOP:\n\t\tcase ENC_LDSETA_64_MEMOP:\n\t\tcase ENC_LDSETAL_64_MEMOP:\n\t\tcase ENC_LDSETL_64_MEMOP:\n\t\tcase ENC_LDSETAB_32_MEMOP:\n\t\tcase ENC_LDSETALB_32_MEMOP:\n\t\tcase ENC_LDSETB_32_MEMOP:\n\t\tcase ENC_LDSETLB_32_MEMOP:\n\t\tcase ENC_LDSETAH_32_MEMOP:\n\t\tcase ENC_LDSETALH_32_MEMOP:\n\t\tcase ENC_LDSETH_32_MEMOP:\n\t\tcase ENC_LDSETLH_32_MEMOP:\n\t\tcase ENC_LDSMAX_32_MEMOP:\n\t\tcase ENC_LDSMAXA_32_MEMOP:\n\t\tcase ENC_LDSMAXAL_32_MEMOP:\n\t\tcase ENC_LDSMAXL_32_MEMOP:\n\t\tcase ENC_LDSMAX_64_MEMOP:\n\t\tcase ENC_LDSMAXA_64_MEMOP:\n\t\tcase ENC_LDSMAXAL_64_MEMOP:\n\t\tcase ENC_LDSMAXL_64_MEMOP:\n\t\tcase ENC_LDSMAXAB_32_MEMOP:\n\t\tcase ENC_LDSMAXALB_32_MEMOP:\n\t\tcase ENC_LDSMAXB_32_MEMOP:\n\t\tcase ENC_LDSMAXLB_32_MEMOP:\n\t\tcase ENC_LDSMAXAH_32_MEMOP:\n\t\tcase ENC_LDSMAXALH_32_MEMOP:\n\t\tcase ENC_LDSMAXH_32_MEMOP:\n\t\tcase ENC_LDSMAXLH_32_MEMOP:\n\t\tcase ENC_LDSMIN_32_MEMOP:\n\t\tcase ENC_LDSMINA_32_MEMOP:\n\t\tcase ENC_LDSMINAL_32_MEMOP:\n\t\tcase ENC_LDSMINL_32_MEMOP:\n\t\tcase ENC_LDSMIN_64_MEMOP:\n\t\tcase ENC_LDSMINA_64_MEMOP:\n\t\tcase ENC_LDSMINAL_64_MEMOP:\n\t\tcase ENC_LDSMINL_64_MEMOP:\n\t\tcase ENC_LDSMINAB_32_MEMOP:\n\t\tcase ENC_LDSMINALB_32_MEMOP:\n\t\tcase ENC_LDSMINB_32_MEMOP:\n\t\tcase ENC_LDSMINLB_32_MEMOP:\n\t\tcase ENC_LDSMINAH_32_MEMOP:\n\t\tcase ENC_LDSMINALH_32_MEMOP:\n\t\tcase ENC_LDSMINH_32_MEMOP:\n\t\tcase ENC_LDSMINLH_32_MEMOP:\n\t\tcase ENC_LDUMAX_32_MEMOP:\n\t\tcase ENC_LDUMAXA_32_MEMOP:\n\t\tcase ENC_LDUMAXAL_32_MEMOP:\n\t\tcase ENC_LDUMAXL_32_MEMOP:\n\t\tcase ENC_LDUMAX_64_MEMOP:\n\t\tcase ENC_LDUMAXA_64_MEMOP:\n\t\tcase ENC_LDUMAXAL_64_MEMOP:\n\t\tcase ENC_LDUMAXL_64_MEMOP:\n\t\tcase ENC_LDUMAXAB_32_MEMOP:\n\t\tcase ENC_LDUMAXALB_32_MEMOP:\n\t\tcase ENC_LDUMAXB_32_MEMOP:\n\t\tcase ENC_LDUMAXLB_32_MEMOP:\n\t\tcase ENC_LDUMAXAH_32_MEMOP:\n\t\tcase ENC_LDUMAXALH_32_MEMOP:\n\t\tcase ENC_LDUMAXH_32_MEMOP:\n\t\tcase ENC_LDUMAXLH_32_MEMOP:\n\t\tcase ENC_LDUMIN_32_MEMOP:\n\t\tcase ENC_LDUMINA_32_MEMOP:\n\t\tcase ENC_LDUMINAL_32_MEMOP:\n\t\tcase ENC_LDUMINL_32_MEMOP:\n\t\tcase ENC_LDUMIN_64_MEMOP:\n\t\tcase ENC_LDUMINA_64_MEMOP:\n\t\tcase ENC_LDUMINAL_64_MEMOP:\n\t\tcase ENC_LDUMINL_64_MEMOP:\n\t\tcase ENC_LDUMINAB_32_MEMOP:\n\t\tcase ENC_LDUMINALB_32_MEMOP:\n\t\tcase ENC_LDUMINB_32_MEMOP:\n\t\tcase ENC_LDUMINLB_32_MEMOP:\n\t\tcase ENC_LDUMINAH_32_MEMOP:\n\t\tcase ENC_LDUMINALH_32_MEMOP:\n\t\tcase ENC_LDUMINH_32_MEMOP:\n\t\tcase ENC_LDUMINLH_32_MEMOP:\n\t\tcase ENC_ST64B_64L_MEMOP:\n\t\tcase ENC_ST64BV_64_MEMOP:\n\t\tcase ENC_ST64BV0_64_MEMOP:\n\t\tcase ENC_STADDB_LDADDB_32_MEMOP:\n\t\tcase ENC_STADDLB_LDADDLB_32_MEMOP:\n\t\tcase ENC_STADDH_LDADDH_32_MEMOP:\n\t\tcase ENC_STADDLH_LDADDLH_32_MEMOP:\n\t\tcase ENC_STADD_LDADD_32_MEMOP:\n\t\tcase ENC_STADDL_LDADDL_32_MEMOP:\n\t\tcase ENC_STADD_LDADD_64_MEMOP:\n\t\tcase ENC_STADDL_LDADDL_64_MEMOP:\n\t\tcase ENC_STCLRB_LDCLRB_32_MEMOP:\n\t\tcase ENC_STCLRLB_LDCLRLB_32_MEMOP:\n\t\tcase ENC_STCLRH_LDCLRH_32_MEMOP:\n\t\tcase ENC_STCLRLH_LDCLRLH_32_MEMOP:\n\t\tcase ENC_STCLR_LDCLR_32_MEMOP:\n\t\tcase ENC_STCLRL_LDCLRL_32_MEMOP:\n\t\tcase ENC_STCLR_LDCLR_64_MEMOP:\n\t\tcase ENC_STCLRL_LDCLRL_64_MEMOP:\n\t\tcase ENC_STEORB_LDEORB_32_MEMOP:\n\t\tcase ENC_STEORLB_LDEORLB_32_MEMOP:\n\t\tcase ENC_STEORH_LDEORH_32_MEMOP:\n\t\tcase ENC_STEORLH_LDEORLH_32_MEMOP:\n\t\tcase ENC_STEOR_LDEOR_32_MEMOP:\n\t\tcase ENC_STEORL_LDEORL_32_MEMOP:\n\t\tcase ENC_STEOR_LDEOR_64_MEMOP:\n\t\tcase ENC_STEORL_LDEORL_64_MEMOP:\n\t\tcase ENC_STSETB_LDSETB_32_MEMOP:\n\t\tcase ENC_STSETLB_LDSETLB_32_MEMOP:\n\t\tcase ENC_STSETH_LDSETH_32_MEMOP:\n\t\tcase ENC_STSETLH_LDSETLH_32_MEMOP:\n\t\tcase ENC_STSET_LDSET_32_MEMOP:\n\t\tcase ENC_STSETL_LDSETL_32_MEMOP:\n\t\tcase ENC_STSET_LDSET_64_MEMOP:\n\t\tcase ENC_STSETL_LDSETL_64_MEMOP:\n\t\tcase ENC_STSMAXB_LDSMAXB_32_MEMOP:\n\t\tcase ENC_STSMAXLB_LDSMAXLB_32_MEMOP:\n\t\tcase ENC_STSMAXH_LDSMAXH_32_MEMOP:\n\t\tcase ENC_STSMAXLH_LDSMAXLH_32_MEMOP:\n\t\tcase ENC_STSMAX_LDSMAX_32_MEMOP:\n\t\tcase ENC_STSMAXL_LDSMAXL_32_MEMOP:\n\t\tcase ENC_STSMAX_LDSMAX_64_MEMOP:\n\t\tcase ENC_STSMAXL_LDSMAXL_64_MEMOP:\n\t\tcase ENC_STSMINB_LDSMINB_32_MEMOP:\n\t\tcase ENC_STSMINLB_LDSMINLB_32_MEMOP:\n\t\tcase ENC_STSMINH_LDSMINH_32_MEMOP:\n\t\tcase ENC_STSMINLH_LDSMINLH_32_MEMOP:\n\t\tcase ENC_STSMIN_LDSMIN_32_MEMOP:\n\t\tcase ENC_STSMINL_LDSMINL_32_MEMOP:\n\t\tcase ENC_STSMIN_LDSMIN_64_MEMOP:\n\t\tcase ENC_STSMINL_LDSMINL_64_MEMOP:\n\t\tcase ENC_STUMAXB_LDUMAXB_32_MEMOP:\n\t\tcase ENC_STUMAXLB_LDUMAXLB_32_MEMOP:\n\t\tcase ENC_STUMAXH_LDUMAXH_32_MEMOP:\n\t\tcase ENC_STUMAXLH_LDUMAXLH_32_MEMOP:\n\t\tcase ENC_STUMAX_LDUMAX_32_MEMOP:\n\t\tcase ENC_STUMAXL_LDUMAXL_32_MEMOP:\n\t\tcase ENC_STUMAX_LDUMAX_64_MEMOP:\n\t\tcase ENC_STUMAXL_LDUMAXL_64_MEMOP:\n\t\tcase ENC_STUMINB_LDUMINB_32_MEMOP:\n\t\tcase ENC_STUMINLB_LDUMINLB_32_MEMOP:\n\t\tcase ENC_STUMINH_LDUMINH_32_MEMOP:\n\t\tcase ENC_STUMINLH_LDUMINLH_32_MEMOP:\n\t\tcase ENC_STUMIN_LDUMIN_32_MEMOP:\n\t\tcase ENC_STUMINL_LDUMINL_32_MEMOP:\n\t\tcase ENC_STUMIN_LDUMIN_64_MEMOP:\n\t\tcase ENC_STUMINL_LDUMINL_64_MEMOP:\n\t\tcase ENC_SWP_32_MEMOP:\n\t\tcase ENC_SWPA_32_MEMOP:\n\t\tcase ENC_SWPAL_32_MEMOP:\n\t\tcase ENC_SWPL_32_MEMOP:\n\t\tcase ENC_SWP_64_MEMOP:\n\t\tcase ENC_SWPA_64_MEMOP:\n\t\tcase ENC_SWPAL_64_MEMOP:\n\t\tcase ENC_SWPL_64_MEMOP:\n\t\tcase ENC_SWPAB_32_MEMOP:\n\t\tcase ENC_SWPALB_32_MEMOP:\n\t\tcase ENC_SWPB_32_MEMOP:\n\t\tcase ENC_SWPLB_32_MEMOP:\n\t\tcase ENC_SWPAH_32_MEMOP:\n\t\tcase ENC_SWPALH_32_MEMOP:\n\t\tcase ENC_SWPH_32_MEMOP:\n\t\tcase ENC_SWPLH_32_MEMOP:\n\t\t\t// size=xx|xxx|V=x|xx|A=x|R=x|x|Rs=xxxxx|o3=x|opc=xxx|xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->A = (insword>>23)&1;\n\t\t\tctx->R = (insword>>22)&1;\n\t\t\tctx->Rs = (insword>>16)&0x1f;\n\t\t\tctx->o3 = (insword>>15)&1;\n\t\t\tctx->opc = (insword>>12)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDRAA_64_LDST_PAC:\n\t\tcase ENC_LDRAA_64W_LDST_PAC:\n\t\tcase ENC_LDRAB_64_LDST_PAC:\n\t\tcase ENC_LDRAB_64W_LDST_PAC:\n\t\t\t// size=xx|xxx|V=x|xx|M=x|S=x|x|imm9=xxxxxxxxx|W=x|x|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->M = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->imm9 = (insword>>12)&0x1ff;\n\t\t\tctx->W = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDRB_32_LDST_POS:\n\t\tcase ENC_LDRH_32_LDST_POS:\n\t\tcase ENC_LDRSB_32_LDST_POS:\n\t\tcase ENC_LDRSB_64_LDST_POS:\n\t\tcase ENC_LDRSH_32_LDST_POS:\n\t\tcase ENC_LDRSH_64_LDST_POS:\n\t\tcase ENC_LDRSW_64_LDST_POS:\n\t\tcase ENC_LDR_B_LDST_POS:\n\t\tcase ENC_LDR_H_LDST_POS:\n\t\tcase ENC_LDR_S_LDST_POS:\n\t\tcase ENC_LDR_D_LDST_POS:\n\t\tcase ENC_LDR_Q_LDST_POS:\n\t\tcase ENC_LDR_32_LDST_POS:\n\t\tcase ENC_LDR_64_LDST_POS:\n\t\tcase ENC_PRFM_P_LDST_POS:\n\t\tcase ENC_STRB_32_LDST_POS:\n\t\tcase ENC_STRH_32_LDST_POS:\n\t\tcase ENC_STR_B_LDST_POS:\n\t\tcase ENC_STR_H_LDST_POS:\n\t\tcase ENC_STR_S_LDST_POS:\n\t\tcase ENC_STR_D_LDST_POS:\n\t\tcase ENC_STR_Q_LDST_POS:\n\t\tcase ENC_STR_32_LDST_POS:\n\t\tcase ENC_STR_64_LDST_POS:\n\t\t\t// size=xx|xxx|V=x|xx|opc=xx|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->imm12 = (insword>>10)&0xfff;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDRB_32B_LDST_REGOFF:\n\t\tcase ENC_LDRB_32BL_LDST_REGOFF:\n\t\tcase ENC_LDRH_32_LDST_REGOFF:\n\t\tcase ENC_LDRSB_32B_LDST_REGOFF:\n\t\tcase ENC_LDRSB_32BL_LDST_REGOFF:\n\t\tcase ENC_LDRSB_64B_LDST_REGOFF:\n\t\tcase ENC_LDRSB_64BL_LDST_REGOFF:\n\t\tcase ENC_LDRSH_32_LDST_REGOFF:\n\t\tcase ENC_LDRSH_64_LDST_REGOFF:\n\t\tcase ENC_LDRSW_64_LDST_REGOFF:\n\t\tcase ENC_LDR_B_LDST_REGOFF:\n\t\tcase ENC_LDR_BL_LDST_REGOFF:\n\t\tcase ENC_LDR_H_LDST_REGOFF:\n\t\tcase ENC_LDR_S_LDST_REGOFF:\n\t\tcase ENC_LDR_D_LDST_REGOFF:\n\t\tcase ENC_LDR_Q_LDST_REGOFF:\n\t\tcase ENC_LDR_32_LDST_REGOFF:\n\t\tcase ENC_LDR_64_LDST_REGOFF:\n\t\tcase ENC_PRFM_P_LDST_REGOFF:\n\t\tcase ENC_STRB_32B_LDST_REGOFF:\n\t\tcase ENC_STRB_32BL_LDST_REGOFF:\n\t\tcase ENC_STRH_32_LDST_REGOFF:\n\t\tcase ENC_STR_B_LDST_REGOFF:\n\t\tcase ENC_STR_BL_LDST_REGOFF:\n\t\tcase ENC_STR_H_LDST_REGOFF:\n\t\tcase ENC_STR_S_LDST_REGOFF:\n\t\tcase ENC_STR_D_LDST_REGOFF:\n\t\tcase ENC_STR_Q_LDST_REGOFF:\n\t\tcase ENC_STR_32_LDST_REGOFF:\n\t\tcase ENC_STR_64_LDST_REGOFF:\n\t\t\t// size=xx|xxx|V=x|xx|opc=xx|x|Rm=xxxxx|option=xxx|S=x|xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->option = (insword>>13)&7;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDRB_32_LDST_IMMPOST:\n\t\tcase ENC_LDRB_32_LDST_IMMPRE:\n\t\tcase ENC_LDRH_32_LDST_IMMPOST:\n\t\tcase ENC_LDRH_32_LDST_IMMPRE:\n\t\tcase ENC_LDRSB_32_LDST_IMMPOST:\n\t\tcase ENC_LDRSB_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSB_32_LDST_IMMPRE:\n\t\tcase ENC_LDRSB_64_LDST_IMMPRE:\n\t\tcase ENC_LDRSH_32_LDST_IMMPOST:\n\t\tcase ENC_LDRSH_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSH_32_LDST_IMMPRE:\n\t\tcase ENC_LDRSH_64_LDST_IMMPRE:\n\t\tcase ENC_LDRSW_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSW_64_LDST_IMMPRE:\n\t\tcase ENC_LDR_B_LDST_IMMPOST:\n\t\tcase ENC_LDR_H_LDST_IMMPOST:\n\t\tcase ENC_LDR_S_LDST_IMMPOST:\n\t\tcase ENC_LDR_D_LDST_IMMPOST:\n\t\tcase ENC_LDR_Q_LDST_IMMPOST:\n\t\tcase ENC_LDR_B_LDST_IMMPRE:\n\t\tcase ENC_LDR_H_LDST_IMMPRE:\n\t\tcase ENC_LDR_S_LDST_IMMPRE:\n\t\tcase ENC_LDR_D_LDST_IMMPRE:\n\t\tcase ENC_LDR_Q_LDST_IMMPRE:\n\t\tcase ENC_LDR_32_LDST_IMMPOST:\n\t\tcase ENC_LDR_64_LDST_IMMPOST:\n\t\tcase ENC_LDR_32_LDST_IMMPRE:\n\t\tcase ENC_LDR_64_LDST_IMMPRE:\n\t\tcase ENC_LDTR_32_LDST_UNPRIV:\n\t\tcase ENC_LDTR_64_LDST_UNPRIV:\n\t\tcase ENC_LDTRB_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRH_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRSB_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRSB_64_LDST_UNPRIV:\n\t\tcase ENC_LDTRSH_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRSH_64_LDST_UNPRIV:\n\t\tcase ENC_LDTRSW_64_LDST_UNPRIV:\n\t\tcase ENC_LDURB_32_LDST_UNSCALED:\n\t\tcase ENC_LDURH_32_LDST_UNSCALED:\n\t\tcase ENC_LDURSB_32_LDST_UNSCALED:\n\t\tcase ENC_LDURSB_64_LDST_UNSCALED:\n\t\tcase ENC_LDURSH_32_LDST_UNSCALED:\n\t\tcase ENC_LDURSH_64_LDST_UNSCALED:\n\t\tcase ENC_LDURSW_64_LDST_UNSCALED:\n\t\tcase ENC_LDUR_B_LDST_UNSCALED:\n\t\tcase ENC_LDUR_H_LDST_UNSCALED:\n\t\tcase ENC_LDUR_S_LDST_UNSCALED:\n\t\tcase ENC_LDUR_D_LDST_UNSCALED:\n\t\tcase ENC_LDUR_Q_LDST_UNSCALED:\n\t\tcase ENC_LDUR_32_LDST_UNSCALED:\n\t\tcase ENC_LDUR_64_LDST_UNSCALED:\n\t\tcase ENC_PRFUM_P_LDST_UNSCALED:\n\t\tcase ENC_STRB_32_LDST_IMMPOST:\n\t\tcase ENC_STRB_32_LDST_IMMPRE:\n\t\tcase ENC_STRH_32_LDST_IMMPOST:\n\t\tcase ENC_STRH_32_LDST_IMMPRE:\n\t\tcase ENC_STR_B_LDST_IMMPOST:\n\t\tcase ENC_STR_H_LDST_IMMPOST:\n\t\tcase ENC_STR_S_LDST_IMMPOST:\n\t\tcase ENC_STR_D_LDST_IMMPOST:\n\t\tcase ENC_STR_Q_LDST_IMMPOST:\n\t\tcase ENC_STR_B_LDST_IMMPRE:\n\t\tcase ENC_STR_H_LDST_IMMPRE:\n\t\tcase ENC_STR_S_LDST_IMMPRE:\n\t\tcase ENC_STR_D_LDST_IMMPRE:\n\t\tcase ENC_STR_Q_LDST_IMMPRE:\n\t\tcase ENC_STR_32_LDST_IMMPOST:\n\t\tcase ENC_STR_64_LDST_IMMPOST:\n\t\tcase ENC_STR_32_LDST_IMMPRE:\n\t\tcase ENC_STR_64_LDST_IMMPRE:\n\t\tcase ENC_STTR_32_LDST_UNPRIV:\n\t\tcase ENC_STTR_64_LDST_UNPRIV:\n\t\tcase ENC_STTRB_32_LDST_UNPRIV:\n\t\tcase ENC_STTRH_32_LDST_UNPRIV:\n\t\tcase ENC_STURB_32_LDST_UNSCALED:\n\t\tcase ENC_STURH_32_LDST_UNSCALED:\n\t\tcase ENC_STUR_B_LDST_UNSCALED:\n\t\tcase ENC_STUR_H_LDST_UNSCALED:\n\t\tcase ENC_STUR_S_LDST_UNSCALED:\n\t\tcase ENC_STUR_D_LDST_UNSCALED:\n\t\tcase ENC_STUR_Q_LDST_UNSCALED:\n\t\tcase ENC_STUR_32_LDST_UNSCALED:\n\t\tcase ENC_STUR_64_LDST_UNSCALED:\n\t\t\t// size=xx|xxx|V=x|xx|opc=xx|x|imm9=xxxxxxxxx|xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->size = insword>>30;\n\t\t\tctx->V = (insword>>26)&1;\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->imm9 = (insword>>12)&0x1ff;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ZERO_ZA_I_:\n\t\t\t// xxxxxxxxxxxxxxxxxxxxxx|xx|imm8=xxxxxxxx\n\t\t\tctx->imm8 = insword&0xff;\n\t\t\tbreak;\n\t\tcase ENC_WFET_ONLY_SYSTEMINSTRSWITHREG:\n\t\tcase ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG:\n\t\t\t// xxxxxxxxxxxxxxxxxxxx|CRm=xxxx|op2=xxx|Rd=xxxxx\n\t\t\tctx->CRm = (insword>>8)&15;\n\t\t\tctx->op2 = (insword>>5)&7;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DSB_BON_BARRIERS:\n\t\t\t// xxxxxxxxxxxxxxxxxxxx|imm2=xx|xx|op2<2>=x|op2<1:0>=xx|Rt=xxxxx\n\t\t\tctx->imm2 = (insword>>10)&3;\n\t\t\tctx->op2 = (insword>>7)&1;\n\t\t\tctx->op2 = (insword>>5)&3;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SHA512SU0_VV2_CRYPTOSHA512_2:\n\t\tcase ENC_SM4E_VV4_CRYPTOSHA512_2:\n\t\t\t// xxxxxxxxxxxxxxxxxxxx|opcode=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->opcode = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_UDF_ONLY_PERM_UNDEF:\n\t\t\t// xxxxxxxxxxxxxxxx|imm16=xxxxxxxxxxxxxxxx\n\t\t\tctx->imm16 = insword&0xffff;\n\t\t\tbreak;\n\t\tcase ENC_PUNPKHI_P_P_:\n\t\tcase ENC_PUNPKLO_P_P_:\n\t\t\t// xxxxxxxxxxxxxxx|H=x|xxxxxx|x|Pn=xxxx|x|Pd=xxxx\n\t\t\tctx->H = (insword>>16)&1;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_MOV_DUPM_Z_I_:\n\t\tcase ENC_DUPM_Z_I_:\n\t\t\t// xxxxxxxxxxxxxx|imm13=xxxxxxxxxxxxx|Zd=xxxxx\n\t\t\tctx->imm13 = (insword>>5)&0x1fff;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1Q_ZA_P_RRR_:\n\t\tcase ENC_ST1Q_ZA_P_RRR_:\n\t\t\t// xxxxxxxxxxx|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|x|ZAt=xxxx\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->ZAt = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_XAR_VVV2_CRYPTO3_IMM6:\n\t\t\t// xxxxxxxxxxx|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm6 = (insword>>10)&0x3f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SM3TT1A_VVV4_CRYPTO3_IMM2:\n\t\tcase ENC_SM3TT1B_VVV4_CRYPTO3_IMM2:\n\t\tcase ENC_SM3TT2A_VVV4_CRYPTO3_IMM2:\n\t\tcase ENC_SM3TT2B_VVV_CRYPTO3_IMM2:\n\t\t\t// xxxxxxxxxxx|Rm=xxxxx|xx|imm2=xx|opcode=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm2 = (insword>>12)&3;\n\t\t\tctx->opcode = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_RAX1_VVV2_CRYPTOSHA512_3:\n\t\tcase ENC_SHA512H2_QQV_CRYPTOSHA512_3:\n\t\tcase ENC_SHA512H_QQV_CRYPTOSHA512_3:\n\t\tcase ENC_SHA512SU1_VVV2_CRYPTOSHA512_3:\n\t\tcase ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3:\n\t\tcase ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3:\n\t\tcase ENC_SM4EKEY_VVV4_CRYPTOSHA512_3:\n\t\t\t// xxxxxxxxxxx|Rm=xxxxx|x|O=x|xx|opcode=xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->O = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PRFB_I_P_BZ_D_64_SCALED:\n\t\tcase ENC_PRFD_I_P_BZ_D_64_SCALED:\n\t\tcase ENC_PRFH_I_P_BZ_D_64_SCALED:\n\t\tcase ENC_PRFW_I_P_BZ_D_64_SCALED:\n\t\t\t// xxxxxxxxxxx|Zm=xxxxx|x|msz=xx|Pg=xxx|Rn=xxxxx|x|prfop=xxxx\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->msz = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->prfop = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_EXT_Z_ZI_DES:\n\t\t\t// xxxxxxxxxxx|imm8h=xxxxx|xxx|imm8l=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->imm8h = (insword>>16)&0x1f;\n\t\t\tctx->imm8l = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_EXT_Z_ZI_CON:\n\t\t\t// xxxxxxxxxxx|imm8h=xxxxx|xxx|imm8l=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->imm8h = (insword>>16)&0x1f;\n\t\t\tctx->imm8l = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_AT_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_AUTIA1716_HI_HINTS:\n\t\tcase ENC_AUTIASP_HI_HINTS:\n\t\tcase ENC_AUTIAZ_HI_HINTS:\n\t\tcase ENC_AUTIB1716_HI_HINTS:\n\t\tcase ENC_AUTIBSP_HI_HINTS:\n\t\tcase ENC_AUTIBZ_HI_HINTS:\n\t\tcase ENC_AXFLAG_M_PSTATE:\n\t\tcase ENC_BTI_HB_HINTS:\n\t\tcase ENC_CFP_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_CLREX_BN_BARRIERS:\n\t\tcase ENC_CPP_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_CSDB_HI_HINTS:\n\t\tcase ENC_DC_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_DGH_HI_HINTS:\n\t\tcase ENC_DVP_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_ESB_HI_HINTS:\n\t\tcase ENC_HINT_HM_HINTS:\n\t\tcase ENC_IC_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_MSR_SI_PSTATE:\n\t\tcase ENC_NOP_HI_HINTS:\n\t\tcase ENC_PACIA1716_HI_HINTS:\n\t\tcase ENC_PACIASP_HI_HINTS:\n\t\tcase ENC_PACIAZ_HI_HINTS:\n\t\tcase ENC_PACIB1716_HI_HINTS:\n\t\tcase ENC_PACIBSP_HI_HINTS:\n\t\tcase ENC_PACIBZ_HI_HINTS:\n\t\tcase ENC_PSB_HC_HINTS:\n\t\tcase ENC_SEV_HI_HINTS:\n\t\tcase ENC_SEVL_HI_HINTS:\n\t\tcase ENC_SMSTART_MSR_SI_PSTATE:\n\t\tcase ENC_SMSTOP_MSR_SI_PSTATE:\n\t\tcase ENC_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_SYSL_RC_SYSTEMINSTRS:\n\t\tcase ENC_TCOMMIT_ONLY_BARRIERS:\n\t\tcase ENC_TLBI_SYS_CR_SYSTEMINSTRS:\n\t\tcase ENC_TSB_HC_HINTS:\n\t\tcase ENC_TSTART_BR_SYSTEMRESULT:\n\t\tcase ENC_TTEST_BR_SYSTEMRESULT:\n\t\tcase ENC_WFE_HI_HINTS:\n\t\tcase ENC_WFI_HI_HINTS:\n\t\tcase ENC_XAFLAG_M_PSTATE:\n\t\tcase ENC_XPACLRI_HI_HINTS:\n\t\tcase ENC_YIELD_HI_HINTS:\n\t\t//['19:1101010100000:1101010100000', '16:op1:011', '12:0100:0100', '8:CRm:0111', '5:op2:110', '0:Rt:11111']\n\t\t\t// xxxxxxxxxx|L=x|op0=xx|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->op0 = (insword>>19)&3;\n\t\t\tctx->op1 = (insword>>16)&7;\n\t\t\tctx->CRn = (insword>>12)&15;\n\t\t\tctx->CRm = (insword>>8)&15;\n\t\t\tctx->op2 = (insword>>5)&7;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DMB_BO_BARRIERS:\n\t\tcase ENC_DSB_BO_BARRIERS:\n\t\tcase ENC_ISB_BI_BARRIERS:\n\t\tcase ENC_PSSBB_DSB_BO_BARRIERS:\n\t\tcase ENC_SB_ONLY_BARRIERS:\n\t\tcase ENC_SSBB_DSB_BO_BARRIERS:\n\t\t\t// xxxxxxxxxx|L=x|op0=xx|op1=xxx|CRn=xxxx|CRm=xxxx|op2[2]=x|opc=xx|Rt=xxxxx\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->op0 = (insword>>19)&3;\n\t\t\tctx->op1 = (insword>>16)&7;\n\t\t\tctx->CRn = (insword>>12)&15;\n\t\t\tctx->CRm = (insword>>8)&15;\n\t\t\tctx->op2 = (insword>>7)&1;\n\t\t\tctx->opc = (insword>>5)&3;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MRS_RS_SYSTEMMOVE:\n\t\tcase ENC_MSR_SR_SYSTEMMOVE:\n\t\t\t// xxxxxxxxxx|L=x|op0[1]=x|o0=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->op0 = (insword>>20)&1;\n\t\t\tctx->o0 = (insword>>19)&1;\n\t\t\tctx->op1 = (insword>>16)&7;\n\t\t\tctx->CRn = (insword>>12)&15;\n\t\t\tctx->CRm = (insword>>8)&15;\n\t\t\tctx->op2 = (insword>>5)&7;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CFINV_M_PSTATE:\n\t\t\t// xxxxxxxxxx|L=x|op0[1]=x|op0[0]=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->op0 = (insword>>20)&1;\n\t\t\tctx->op0 = (insword>>19)&1;\n\t\t\tctx->op1 = (insword>>16)&7;\n\t\t\tctx->CRn = (insword>>12)&15;\n\t\t\tctx->CRm = (insword>>8)&15;\n\t\t\tctx->op2 = (insword>>5)&7;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PRFB_I_P_BI_S:\n\t\tcase ENC_PRFD_I_P_BI_S:\n\t\tcase ENC_PRFH_I_P_BI_S:\n\t\tcase ENC_PRFW_I_P_BI_S:\n\t\t\t// xxxxxxxxxx|imm6=xxxxxx|x|msz=xx|Pg=xxx|Rn=xxxxx|x|prfop=xxxx\n\t\t\tctx->imm6 = (insword>>16)&0x3f;\n\t\t\tctx->msz = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->prfop = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_LDR_Z_BI_:\n\t\tcase ENC_STR_Z_BI_:\n\t\t\t// xxxxxxxxxx|imm9h=xxxxxx|xxx|imm9l=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->imm9h = (insword>>16)&0x3f;\n\t\t\tctx->imm9l = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDR_P_BI_:\n\t\tcase ENC_STR_P_BI_:\n\t\t\t// xxxxxxxxxx|imm9h=xxxxxx|xxx|imm9l=xxx|Rn=xxxxx|x|Pt=xxxx\n\t\t\tctx->imm9h = (insword>>16)&0x3f;\n\t\t\tctx->imm9l = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Pt = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_LDR_ZA_RI_:\n\t\tcase ENC_STR_ZA_RI_:\n\t\t\t// xxxxxxxxxx|op=x|xxxxxx|Rv=xx|xxx|Rn=xxxxx|x|imm4=xxxx\n\t\t\tctx->op = (insword>>21)&1;\n\t\t\tctx->Rv = (insword>>13)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->imm4 = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_BCAX_VVV16_CRYPTO4:\n\t\tcase ENC_EOR3_VVV16_CRYPTO4:\n\t\tcase ENC_SM3SS1_VVV4_CRYPTO4:\n\t\t\t// xxxxxxxxx|Op0=xx|Rm=xxxxx|x|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Op0 = (insword>>21)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Ra = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BRKN_P_P_PP_:\n\t\tcase ENC_BRKNS_P_P_PP_:\n\t\t\t// xxxxxxxxx|S=x|xxxxxxxx|Pg=xxxx|x|Pn=xxxx|x|Pdm=xxxx\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Pdm = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_BFMLALB_Z_ZZZ_:\n\t\tcase ENC_BFMLALT_Z_ZZZ_:\n\t\tcase ENC_FMLALB_Z_ZZZ_:\n\t\tcase ENC_FMLALT_Z_ZZZ_:\n\t\tcase ENC_FMLSLB_Z_ZZZ_:\n\t\tcase ENC_FMLSLT_Z_ZZZ_:\n\t\t\t// xxxxxxxxx|o2=x|x|Zm=xxxxx|xx|op=x|xx|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->o2 = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFMLALB_Z_ZZZI_:\n\t\tcase ENC_BFMLALT_Z_ZZZI_:\n\t\tcase ENC_FMLALB_Z_ZZZI_S:\n\t\tcase ENC_FMLALT_Z_ZZZI_S:\n\t\tcase ENC_FMLSLB_Z_ZZZI_S:\n\t\tcase ENC_FMLSLT_Z_ZZZI_S:\n\t\t\t// xxxxxxxxx|o2=x|x|i3h=xx|Zm=xxx|xx|op=x|x|i3l=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->o2 = (insword>>22)&1;\n\t\t\tctx->i3h = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->i3l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDPL_R_RI_:\n\t\tcase ENC_ADDVL_R_RI_:\n\t\t\t// xxxxxxxxx|op=x|x|Rn=xxxxx|xxxxx|imm6=xxxxxx|Rd=xxxxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->Rn = (insword>>16)&0x1f;\n\t\t\tctx->imm6 = (insword>>5)&0x3f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFDOT_Z_ZZZ_:\n\t\t\t// xxxxxxxxx|op=x|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TRN1_Z_ZZ_Q:\n\t\tcase ENC_TRN2_Z_ZZ_Q:\n\t\tcase ENC_UZP1_Z_ZZ_Q:\n\t\tcase ENC_UZP2_Z_ZZ_Q:\n\t\tcase ENC_ZIP2_Z_ZZ_Q:\n\t\tcase ENC_ZIP1_Z_ZZ_Q:\n\t\t\t// xxxxxxxxx|op=x|x|Zm=xxxxx|xxx|xx|H=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->H = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFDOT_Z_ZZZI_:\n\t\t\t// xxxxxxxxx|op=x|x|i2=xx|Zm=xxx|xxxxxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_RDVL_R_I_:\n\t\t\t// xxxxxxxxx|op=x|x|opc2<4:1>=xxxx|opc2<0>=x|xxxxx|imm6=xxxxxx|Rd=xxxxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->opc2 = (insword>>17)&15;\n\t\t\tctx->opc2 = (insword>>16)&1;\n\t\t\tctx->imm6 = (insword>>5)&0x3f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SSHLLB_Z_ZI_:\n\t\tcase ENC_SSHLLT_Z_ZI_:\n\t\tcase ENC_USHLLB_Z_ZI_:\n\t\tcase ENC_USHLLT_Z_ZI_:\n\t\t\t// xxxxxxxxx|tszh=x|x|tszl=xx|imm3=xxx|xxxx|U=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&1;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_RSHRNB_Z_ZI_:\n\t\tcase ENC_RSHRNT_Z_ZI_:\n\t\tcase ENC_SHRNB_Z_ZI_:\n\t\tcase ENC_SHRNT_Z_ZI_:\n\t\tcase ENC_SQRSHRNB_Z_ZI_:\n\t\tcase ENC_SQRSHRNT_Z_ZI_:\n\t\tcase ENC_SQRSHRUNB_Z_ZI_:\n\t\tcase ENC_SQRSHRUNT_Z_ZI_:\n\t\tcase ENC_SQSHRNB_Z_ZI_:\n\t\tcase ENC_SQSHRNT_Z_ZI_:\n\t\tcase ENC_SQSHRUNB_Z_ZI_:\n\t\tcase ENC_SQSHRUNT_Z_ZI_:\n\t\tcase ENC_UQRSHRNB_Z_ZI_:\n\t\tcase ENC_UQRSHRNT_Z_ZI_:\n\t\tcase ENC_UQSHRNB_Z_ZI_:\n\t\tcase ENC_UQSHRNT_Z_ZI_:\n\t\t\t// xxxxxxxxx|tszh=x|x|tszl=xx|imm3=xxx|xx|op=x|U=x|R=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&1;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->U = (insword>>12)&1;\n\t\t\tctx->R = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQXTUNB_Z_ZZ_:\n\t\tcase ENC_SQXTUNT_Z_ZZ_:\n\t\t\t// xxxxxxxxx|tszh=x|x|tszl=xx|xxxxxx|opc=xx|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&1;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->opc = (insword>>11)&3;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQXTNB_Z_ZZ_:\n\t\tcase ENC_SQXTNT_Z_ZZ_:\n\t\tcase ENC_UQXTNB_Z_ZZ_:\n\t\tcase ENC_UQXTNT_Z_ZZ_:\n\t\t\t// xxxxxxxxx|tszh=x|x|tszl=xx|xxxxxx|x|U=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&1;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_SCALED:\n\t\t\t// xxxxxxxxx|xs=x|x|Zm=xxxxx|x|U=x|ff=x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->xs = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PRFB_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFB_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFD_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFD_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFH_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFH_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFW_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFW_I_P_BZ_D_X32_SCALED:\n\t\t\t// xxxxxxxxx|xs=x|x|Zm=xxxxx|x|msz=xx|Pg=xxx|Rn=xxxxx|x|prfop=xxxx\n\t\t\tctx->xs = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->msz = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->prfop = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_BRKA_P_P_P_:\n\t\tcase ENC_BRKAS_P_P_P_Z:\n\t\tcase ENC_BRKB_P_P_P_:\n\t\tcase ENC_BRKBS_P_P_P_Z:\n\t\t\t// xxxxxxxx|B=x|S=x|xxxxxxxx|Pg=xxxx|x|Pn=xxxx|M=x|Pd=xxxx\n\t\t\tctx->B = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->M = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_DUP_P_P_PI_:\n\t\t\t// xxxxxxxx|i1=x|tszh=x|x|tszl=xxx|Rm=xx|xx|Pg=xxxx|S=x|Pn=xxxx|x|Pd=xxxx\n\t\t\tctx->i1 = (insword>>23)&1;\n\t\t\tctx->tszh = (insword>>22)&1;\n\t\t\tctx->tszl = (insword>>18)&7;\n\t\t\tctx->Rm = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->S = (insword>>9)&1;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_MOV_DUP_Z_ZI_:\n\t\tcase ENC_MOV_DUP_Z_ZI_2:\n\t\tcase ENC_DUP_Z_ZI_:\n\t\t\t// xxxxxxxx|imm2=xx|x|tsz=xxxxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->imm2 = (insword>>22)&3;\n\t\t\tctx->tsz = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1D_ZA_P_RRR_:\n\t\tcase ENC_ST1D_ZA_P_RRR_:\n\t\t\t// xxxxxxxx|msz=xx|x|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|x|ZAt=xxx|i1=x\n\t\t\tctx->msz = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->ZAt = (insword>>1)&7;\n\t\t\tctx->i1 = insword&1;\n\t\t\tbreak;\n\t\tcase ENC_LD1W_ZA_P_RRR_:\n\t\tcase ENC_ST1W_ZA_P_RRR_:\n\t\t\t// xxxxxxxx|msz=xx|x|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|x|ZAt=xx|imm2=xx\n\t\t\tctx->msz = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->ZAt = (insword>>2)&3;\n\t\t\tctx->imm2 = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_LD1H_ZA_P_RRR_:\n\t\tcase ENC_ST1H_ZA_P_RRR_:\n\t\t\t// xxxxxxxx|msz=xx|x|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|x|ZAt=x|imm3=xxx\n\t\t\tctx->msz = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->ZAt = (insword>>3)&1;\n\t\t\tctx->imm3 = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_ZA_P_RRR_:\n\t\tcase ENC_ST1B_ZA_P_RRR_:\n\t\t\t// xxxxxxxx|msz=xx|x|Rm=xxxxx|V=x|Rs=xx|Pg=xxx|Rn=xxxxx|x|imm4=xxxx\n\t\t\tctx->msz = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->imm4 = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_PFALSE_P_:\n\t\tcase ENC_RDFFR_P_F_:\n\t\t\t// xxxxxxxx|op=x|S=x|xxxxxxxxxxxx|xxxxxx|Pd=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_RDFFR_P_P_F_:\n\t\tcase ENC_RDFFRS_P_P_F_:\n\t\t\t// xxxxxxxx|op=x|S=x|xxxxxxxxxxxx|x|Pg=xxxx|x|Pd=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pg = (insword>>5)&15;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_PFIRST_P_P_P_:\n\t\t\t// xxxxxxxx|op=x|S=x|xxxxxxxxxxxx|x|Pg=xxxx|x|Pdn=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pg = (insword>>5)&15;\n\t\t\tctx->Pdn = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_MOVS_ANDS_P_P_PP_Z:\n\t\tcase ENC_MOVS_ORRS_P_P_PP_Z:\n\t\tcase ENC_MOV_AND_P_P_PP_Z:\n\t\tcase ENC_MOV_ORR_P_P_PP_Z:\n\t\tcase ENC_MOV_SEL_P_P_PP_:\n\t\tcase ENC_NOTS_EORS_P_P_PP_Z:\n\t\tcase ENC_NOT_EOR_P_P_PP_Z:\n\t\tcase ENC_AND_P_P_PP_Z:\n\t\tcase ENC_ANDS_P_P_PP_Z:\n\t\tcase ENC_BIC_P_P_PP_Z:\n\t\tcase ENC_BICS_P_P_PP_Z:\n\t\tcase ENC_EOR_P_P_PP_Z:\n\t\tcase ENC_EORS_P_P_PP_Z:\n\t\tcase ENC_NAND_P_P_PP_Z:\n\t\tcase ENC_NANDS_P_P_PP_Z:\n\t\tcase ENC_NOR_P_P_PP_Z:\n\t\tcase ENC_NORS_P_P_PP_Z:\n\t\tcase ENC_ORN_P_P_PP_Z:\n\t\tcase ENC_ORNS_P_P_PP_Z:\n\t\tcase ENC_ORR_P_P_PP_Z:\n\t\tcase ENC_ORRS_P_P_PP_Z:\n\t\tcase ENC_SEL_P_P_PP_:\n\t\t\t// xxxxxxxx|op=x|S=x|xx|Pm=xxxx|xx|Pg=xxxx|o2=x|Pn=xxxx|o3=x|Pd=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pm = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->o2 = (insword>>9)&1;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->o3 = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_BRKPA_P_P_PP_:\n\t\tcase ENC_BRKPAS_P_P_PP_:\n\t\tcase ENC_BRKPB_P_P_PP_:\n\t\tcase ENC_BRKPBS_P_P_PP_:\n\t\t\t// xxxxxxxx|op=x|S=x|xx|Pm=xxxx|xx|Pg=xxxx|x|Pn=xxxx|B=x|Pd=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pm = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->B = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_BRK_EX_EXCEPTION:\n\t\tcase ENC_DCPS1_DC_EXCEPTION:\n\t\tcase ENC_DCPS2_DC_EXCEPTION:\n\t\tcase ENC_DCPS3_DC_EXCEPTION:\n\t\tcase ENC_HLT_EX_EXCEPTION:\n\t\tcase ENC_HVC_EX_EXCEPTION:\n\t\tcase ENC_SMC_EX_EXCEPTION:\n\t\tcase ENC_SVC_EX_EXCEPTION:\n\t\tcase ENC_TCANCEL_EX_EXCEPTION:\n\t\t\t// xxxxxxxx|opc=xxx|imm16=xxxxxxxxxxxxxxxx|op2=xxx|LL=xx\n\t\t\tctx->opc = (insword>>21)&7;\n\t\t\tctx->imm16 = (insword>>5)&0xffff;\n\t\t\tctx->op2 = (insword>>2)&7;\n\t\t\tctx->LL = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_BIC_AND_Z_ZI_:\n\t\tcase ENC_EON_EOR_Z_ZI_:\n\t\tcase ENC_ORN_ORR_Z_ZI_:\n\t\tcase ENC_AND_Z_ZI_:\n\t\tcase ENC_EOR_Z_ZI_:\n\t\tcase ENC_ORR_Z_ZI_:\n\t\t\t// xxxxxxxx|opc=xx|xxxx|imm13=xxxxxxxxxxxxx|Zdn=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->imm13 = (insword>>5)&0x1fff;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFCVT_Z_P_Z_S2BF:\n\t\tcase ENC_BFCVTNT_Z_P_Z_S2BF:\n\t\tcase ENC_FCVT_Z_P_Z_H2S:\n\t\tcase ENC_FCVT_Z_P_Z_H2D:\n\t\tcase ENC_FCVT_Z_P_Z_S2H:\n\t\tcase ENC_FCVT_Z_P_Z_S2D:\n\t\tcase ENC_FCVT_Z_P_Z_D2H:\n\t\tcase ENC_FCVT_Z_P_Z_D2S:\n\t\tcase ENC_FCVTLT_Z_P_Z_H2S:\n\t\tcase ENC_FCVTLT_Z_P_Z_S2D:\n\t\tcase ENC_FCVTNT_Z_P_Z_S2H:\n\t\tcase ENC_FCVTNT_Z_P_Z_D2S:\n\t\tcase ENC_FCVTX_Z_P_Z_D2S:\n\t\tcase ENC_FCVTXNT_Z_P_Z_D2S:\n\t\t\t// xxxxxxxx|opc=xx|xxxx|opc2=xx|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->opc2 = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162H:\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162W:\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162X:\n\t\tcase ENC_FCVTZS_Z_P_Z_S2W:\n\t\tcase ENC_FCVTZS_Z_P_Z_S2X:\n\t\tcase ENC_FCVTZS_Z_P_Z_D2W:\n\t\tcase ENC_FCVTZS_Z_P_Z_D2X:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162H:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162W:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162X:\n\t\tcase ENC_FCVTZU_Z_P_Z_S2W:\n\t\tcase ENC_FCVTZU_Z_P_Z_S2X:\n\t\tcase ENC_FCVTZU_Z_P_Z_D2W:\n\t\tcase ENC_FCVTZU_Z_P_Z_D2X:\n\t\tcase ENC_SCVTF_Z_P_Z_H2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_W2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_W2S:\n\t\tcase ENC_SCVTF_Z_P_Z_W2D:\n\t\tcase ENC_SCVTF_Z_P_Z_X2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_X2S:\n\t\tcase ENC_SCVTF_Z_P_Z_X2D:\n\t\tcase ENC_UCVTF_Z_P_Z_H2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_W2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_W2S:\n\t\tcase ENC_UCVTF_Z_P_Z_W2D:\n\t\tcase ENC_UCVTF_Z_P_Z_X2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_X2S:\n\t\tcase ENC_UCVTF_Z_P_Z_X2D:\n\t\t\t// xxxxxxxx|opc=xx|xxx|opc2=xx|int_U=x|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->opc2 = (insword>>17)&3;\n\t\t\tctx->int_U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FLOGB_Z_P_Z_:\n\t\t\t// xxxxxxxx|opc=xx|xxx|size=xx|U=x|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->size = (insword>>17)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_ORR_Z_ZZ_:\n\t\tcase ENC_AND_Z_ZZ_:\n\t\tcase ENC_BIC_Z_ZZ_:\n\t\tcase ENC_EOR_Z_ZZ_:\n\t\tcase ENC_ORR_Z_ZZ_:\n\t\t\t// xxxxxxxx|opc=xx|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFMMLA_Z_ZZZ_:\n\t\tcase ENC_FMMLA_Z_ZZZ_S:\n\t\tcase ENC_FMMLA_Z_ZZZ_D:\n\t\t\t// xxxxxxxx|opc=xx|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BCAX_Z_ZZZ_:\n\t\tcase ENC_BSL1N_Z_ZZZ_:\n\t\tcase ENC_BSL2N_Z_ZZZ_:\n\t\tcase ENC_BSL_Z_ZZZ_:\n\t\tcase ENC_EOR3_Z_ZZZ_:\n\t\tcase ENC_NBSL_Z_ZZZ_:\n\t\t\t// xxxxxxxx|opc=xx|x|Zm=xxxxx|xxxxx|o2=x|Zk=xxxxx|Zdn=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->o2 = (insword>>10)&1;\n\t\t\tctx->Zk = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADR_Z_AZ_D_S32_SCALED:\n\t\tcase ENC_ADR_Z_AZ_D_U32_SCALED:\n\t\t\t// xxxxxxxx|opc=xx|x|Zm=xxxxx|xxxx|msz=xx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->msz = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDG_64LOFFSET_LDSTTAGS:\n\t\tcase ENC_LDGM_64BULK_LDSTTAGS:\n\t\tcase ENC_ST2G_64SPOST_LDSTTAGS:\n\t\tcase ENC_ST2G_64SPRE_LDSTTAGS:\n\t\tcase ENC_ST2G_64SOFFSET_LDSTTAGS:\n\t\tcase ENC_STG_64SPOST_LDSTTAGS:\n\t\tcase ENC_STG_64SPRE_LDSTTAGS:\n\t\tcase ENC_STG_64SOFFSET_LDSTTAGS:\n\t\tcase ENC_STGM_64BULK_LDSTTAGS:\n\t\tcase ENC_STZ2G_64SPOST_LDSTTAGS:\n\t\tcase ENC_STZ2G_64SPRE_LDSTTAGS:\n\t\tcase ENC_STZ2G_64SOFFSET_LDSTTAGS:\n\t\tcase ENC_STZG_64SPOST_LDSTTAGS:\n\t\tcase ENC_STZG_64SPRE_LDSTTAGS:\n\t\tcase ENC_STZG_64SOFFSET_LDSTTAGS:\n\t\tcase ENC_STZGM_64BULK_LDSTTAGS:\n\t\t\t// xxxxxxxx|opc=xx|x|imm9=xxxxxxxxx|op2=xx|Xn=xxxxx|Xt=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->imm9 = (insword>>12)&0x1ff;\n\t\t\tctx->op2 = (insword>>10)&3;\n\t\t\tctx->Xn = (insword>>5)&0x1f;\n\t\t\tctx->Xt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOVPRFX_Z_Z_:\n\t\t\t// xxxxxxxx|opc=xx|x|opc2<4:1>=xxxx|opc2<0>=x|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->opc2 = (insword>>17)&15;\n\t\t\tctx->opc2 = (insword>>16)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_INSR_Z_R_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|Rm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_DUP_Z_R_:\n\t\tcase ENC_DUP_Z_R_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|Rn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_INSR_Z_V_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|Vm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Vm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_REV_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PNEXT_P_P_P_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|x|Pg=xxxx|x|Pdn=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>5)&15;\n\t\t\tctx->Pdn = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_REV_P_P_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxxx|x|Pn=xxxx|x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_AESIMC_Z_Z_:\n\t\tcase ENC_AESMC_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxxxx|op=x|xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_CPY_Z_P_R_:\n\t\tcase ENC_CPY_Z_P_R_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxx|Pg=xxx|Rn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_CPY_Z_P_V_:\n\t\tcase ENC_CPY_Z_P_V_:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxx|Pg=xxx|Vn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Vn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SPLICE_Z_P_ZZ_DES:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_COMPACT_Z_P_Z_:\n\t\tcase ENC_REVD_Z_P_Z_:\n\t\tcase ENC_SPLICE_Z_P_ZZ_CON:\n\t\t\t// xxxxxxxx|size=xx|xxxxxxxxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CLASTA_R_P_Z_:\n\t\tcase ENC_CLASTB_R_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|B=x|xxx|Pg=xxx|Zm=xxxxx|Rdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->B = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Rdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CLASTA_V_P_Z_:\n\t\tcase ENC_CLASTB_V_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|B=x|xxx|Pg=xxx|Zm=xxxxx|Vdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->B = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Vdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CLASTA_Z_P_ZZ_:\n\t\tcase ENC_CLASTB_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|B=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->B = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LASTA_R_P_Z_:\n\t\tcase ENC_LASTB_R_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|B=x|xxx|Pg=xxx|Zn=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->B = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LASTA_V_P_Z_:\n\t\tcase ENC_LASTB_V_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|B=x|xxx|Pg=xxx|Zn=xxxxx|Vd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->B = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Vd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_Q:\n\t\tcase ENC_MOVA_ZA_P_RZ_Q:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|x|ZAd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_D:\n\t\tcase ENC_MOVA_ZA_P_RZ_D:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|x|ZAd=xxx|i1=x\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAd = (insword>>1)&7;\n\t\t\tctx->i1 = insword&1;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_W:\n\t\tcase ENC_MOVA_ZA_P_RZ_W:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|x|ZAd=xx|imm2=xx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAd = (insword>>2)&3;\n\t\t\tctx->imm2 = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_H:\n\t\tcase ENC_MOVA_ZA_P_RZ_H:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|x|ZAd=x|imm3=xxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAd = (insword>>3)&1;\n\t\t\tctx->imm3 = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_B:\n\t\tcase ENC_MOVA_ZA_P_RZ_B:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|Zn=xxxxx|x|imm4=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->imm4 = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_Q:\n\t\tcase ENC_MOVA_Z_P_RZA_Q:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|x|ZAn=xxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->ZAn = (insword>>5)&15;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_D:\n\t\tcase ENC_MOVA_Z_P_RZA_D:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|x|ZAn=xxx|i1=x|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->ZAn = (insword>>6)&7;\n\t\t\tctx->i1 = (insword>>5)&1;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_W:\n\t\tcase ENC_MOVA_Z_P_RZA_W:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|x|ZAn=xx|imm2=xx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->ZAn = (insword>>7)&3;\n\t\t\tctx->imm2 = (insword>>5)&3;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_H:\n\t\tcase ENC_MOVA_Z_P_RZA_H:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|x|ZAn=x|imm3=xxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->ZAn = (insword>>8)&1;\n\t\t\tctx->imm3 = (insword>>5)&7;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_B:\n\t\tcase ENC_MOVA_Z_P_RZA_B:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|Q=x|V=x|Rs=xx|Pg=xxx|x|imm4=xxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>16)&1;\n\t\t\tctx->V = (insword>>15)&1;\n\t\t\tctx->Rs = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->imm4 = (insword>>5)&15;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PTRUE_P_S_:\n\t\tcase ENC_PTRUES_P_S_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|S=x|xxxxxx|pattern=xxxxx|x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->S = (insword>>16)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_SADALP_Z_P_Z_:\n\t\tcase ENC_UADALP_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|U=x|xxx|Pg=xxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_AESD_Z_ZZ_:\n\t\tcase ENC_AESE_Z_ZZ_:\n\t\tcase ENC_SM4E_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|op=x|xxxxx|o2=x|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>16)&1;\n\t\t\tctx->o2 = (insword>>10)&1;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CADD_Z_ZZ_:\n\t\tcase ENC_SQCADD_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|op=x|xxxxx|rot=x|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>16)&1;\n\t\t\tctx->rot = (insword>>10)&1;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SHA1H_SS_CRYPTOSHA2:\n\t\tcase ENC_SHA1SU1_VV_CRYPTOSHA2:\n\t\tcase ENC_SHA256SU0_VV_CRYPTOSHA2:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_AESD_B_CRYPTOAES:\n\t\tcase ENC_AESE_B_CRYPTOAES:\n\t\tcase ENC_AESIMC_B_CRYPTOAES:\n\t\tcase ENC_AESMC_B_CRYPTOAES:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|opcode[4:1]=xxxx|D=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->D = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCADD_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxxx|rot=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->rot = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDECP_Z_P_Z_:\n\t\tcase ENC_SQINCP_Z_P_Z_:\n\t\tcase ENC_UQDECP_Z_P_Z_:\n\t\tcase ENC_UQINCP_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|D=x|U=x|xxxxx|opc=xx|Pm=xxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->D = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->opc = (insword>>9)&3;\n\t\t\tctx->Pm = (insword>>5)&15;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDECP_R_P_R_SX:\n\t\tcase ENC_SQDECP_R_P_R_X:\n\t\tcase ENC_SQINCP_R_P_R_SX:\n\t\tcase ENC_SQINCP_R_P_R_X:\n\t\tcase ENC_UQDECP_R_P_R_UW:\n\t\tcase ENC_UQDECP_R_P_R_X:\n\t\tcase ENC_UQINCP_R_P_R_UW:\n\t\tcase ENC_UQINCP_R_P_R_X:\n\t\t\t// xxxxxxxx|size=xx|xxxx|D=x|U=x|xxxxx|sf=x|op=x|Pm=xxxx|Rdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->D = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->sf = (insword>>10)&1;\n\t\t\tctx->op = (insword>>9)&1;\n\t\t\tctx->Pm = (insword>>5)&15;\n\t\t\tctx->Rdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MUL_Z_P_ZZ_:\n\t\tcase ENC_SMULH_Z_P_ZZ_:\n\t\tcase ENC_UMULH_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|H=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->H = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SDIV_Z_P_ZZ_:\n\t\tcase ENC_SDIVR_Z_P_ZZ_:\n\t\tcase ENC_UDIV_Z_P_ZZ_:\n\t\tcase ENC_UDIVR_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|R=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->R = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SUNPKHI_Z_Z_:\n\t\tcase ENC_SUNPKLO_Z_Z_:\n\t\tcase ENC_UUNPKHI_Z_Z_:\n\t\tcase ENC_UUNPKLO_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|U=x|H=x|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->U = (insword>>17)&1;\n\t\t\tctx->H = (insword>>16)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMEQ_P_P_Z0_:\n\t\tcase ENC_FCMGT_P_P_Z0_:\n\t\tcase ENC_FCMGE_P_P_Z0_:\n\t\tcase ENC_FCMLT_P_P_Z0_:\n\t\tcase ENC_FCMLE_P_P_Z0_:\n\t\tcase ENC_FCMNE_P_P_Z0_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|eq=x|lt=x|xxx|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->eq = (insword>>17)&1;\n\t\t\tctx->lt = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_DECP_R_P_R_:\n\t\tcase ENC_INCP_R_P_R_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|op=x|D=x|xxxxx|opc2=xx|Pm=xxxx|Rdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>17)&1;\n\t\t\tctx->D = (insword>>16)&1;\n\t\t\tctx->opc2 = (insword>>9)&3;\n\t\t\tctx->Pm = (insword>>5)&15;\n\t\t\tctx->Rdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DECP_Z_P_Z_:\n\t\tcase ENC_INCP_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|op=x|D=x|xxxxx|opc2=xx|Pm=xxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>17)&1;\n\t\t\tctx->D = (insword>>16)&1;\n\t\t\tctx->opc2 = (insword>>9)&3;\n\t\t\tctx->Pm = (insword>>5)&15;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SADDV_R_P_Z_:\n\t\tcase ENC_SMAXV_R_P_Z_:\n\t\tcase ENC_SMINV_R_P_Z_:\n\t\tcase ENC_UADDV_R_P_Z_:\n\t\tcase ENC_UMAXV_R_P_Z_:\n\t\tcase ENC_UMINV_R_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|op=x|U=x|xxx|Pg=xxx|Zn=xxxxx|Vd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Vd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FADDA_V_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|opc=xx|xxx|Pg=xxx|Zm=xxxxx|Vdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Vdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ANDV_R_P_Z_:\n\t\tcase ENC_EORV_R_P_Z_:\n\t\tcase ENC_ORV_R_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|opc=xx|xxx|Pg=xxx|Zn=xxxxx|Vd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Vd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FRECPX_Z_P_Z_:\n\t\tcase ENC_FSQRT_Z_P_Z_:\n\t\tcase ENC_RBIT_Z_P_Z_:\n\t\tcase ENC_REVB_Z_Z_:\n\t\tcase ENC_REVH_Z_Z_:\n\t\tcase ENC_REVW_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxxx|opc=xx|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ASR_Z_P_ZW_:\n\t\tcase ENC_ASR_Z_P_ZZ_:\n\t\tcase ENC_ASRR_Z_P_ZZ_:\n\t\tcase ENC_LSL_Z_P_ZW_:\n\t\tcase ENC_LSL_Z_P_ZZ_:\n\t\tcase ENC_LSLR_Z_P_ZZ_:\n\t\tcase ENC_LSR_Z_P_ZW_:\n\t\tcase ENC_LSR_Z_P_ZZ_:\n\t\tcase ENC_LSRR_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxx|R=x|L=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->R = (insword>>18)&1;\n\t\t\tctx->L = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SHADD_Z_P_ZZ_:\n\t\tcase ENC_SHSUB_Z_P_ZZ_:\n\t\tcase ENC_SHSUBR_Z_P_ZZ_:\n\t\tcase ENC_SRHADD_Z_P_ZZ_:\n\t\tcase ENC_UHADD_Z_P_ZZ_:\n\t\tcase ENC_UHSUB_Z_P_ZZ_:\n\t\tcase ENC_UHSUBR_Z_P_ZZ_:\n\t\tcase ENC_URHADD_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxx|R=x|S=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->R = (insword>>18)&1;\n\t\t\tctx->S = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FTMAD_Z_ZZI_:\n\t\t\t// xxxxxxxx|size=xx|xxx|imm3=xxx|xxxxxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQADD_Z_P_ZZ_:\n\t\tcase ENC_SQSUB_Z_P_ZZ_:\n\t\tcase ENC_SQSUBR_Z_P_ZZ_:\n\t\tcase ENC_SUQADD_Z_P_ZZ_:\n\t\tcase ENC_UQADD_Z_P_ZZ_:\n\t\tcase ENC_UQSUB_Z_P_ZZ_:\n\t\tcase ENC_UQSUBR_Z_P_ZZ_:\n\t\tcase ENC_USQADD_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxx|op=x|S=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>18)&1;\n\t\t\tctx->S = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FRECPE_Z_Z_:\n\t\tcase ENC_FRSQRTE_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADD_Z_P_ZZ_:\n\t\tcase ENC_AND_Z_P_ZZ_:\n\t\tcase ENC_BIC_Z_P_ZZ_:\n\t\tcase ENC_EOR_Z_P_ZZ_:\n\t\tcase ENC_FADDP_Z_P_ZZ_:\n\t\tcase ENC_FMAXNMP_Z_P_ZZ_:\n\t\tcase ENC_FMAXP_Z_P_ZZ_:\n\t\tcase ENC_FMINNMP_Z_P_ZZ_:\n\t\tcase ENC_FMINP_Z_P_ZZ_:\n\t\tcase ENC_ORR_Z_P_ZZ_:\n\t\tcase ENC_SUB_Z_P_ZZ_:\n\t\tcase ENC_SUBR_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FADDV_V_P_Z_:\n\t\tcase ENC_FMAXNMV_V_P_Z_:\n\t\tcase ENC_FMAXV_V_P_Z_:\n\t\tcase ENC_FMINNMV_V_P_Z_:\n\t\tcase ENC_FMINV_V_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xxx|Pg=xxx|Zn=xxxxx|Vd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Vd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ABS_Z_P_Z_:\n\t\tcase ENC_CLS_Z_P_Z_:\n\t\tcase ENC_CLZ_Z_P_Z_:\n\t\tcase ENC_CNOT_Z_P_Z_:\n\t\tcase ENC_CNT_Z_P_Z_:\n\t\tcase ENC_FABS_Z_P_Z_:\n\t\tcase ENC_FNEG_Z_P_Z_:\n\t\tcase ENC_FRINTI_Z_P_Z_:\n\t\tcase ENC_FRINTX_Z_P_Z_:\n\t\tcase ENC_FRINTA_Z_P_Z_:\n\t\tcase ENC_FRINTN_Z_P_Z_:\n\t\tcase ENC_FRINTZ_Z_P_Z_:\n\t\tcase ENC_FRINTM_Z_P_Z_:\n\t\tcase ENC_FRINTP_Z_P_Z_:\n\t\tcase ENC_NEG_Z_P_Z_:\n\t\tcase ENC_NOT_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FADD_Z_P_ZS_:\n\t\tcase ENC_FMAX_Z_P_ZS_:\n\t\tcase ENC_FMAXNM_Z_P_ZS_:\n\t\tcase ENC_FMIN_Z_P_ZS_:\n\t\tcase ENC_FMINNM_Z_P_ZS_:\n\t\tcase ENC_FMUL_Z_P_ZS_:\n\t\tcase ENC_FSUB_Z_P_ZS_:\n\t\tcase ENC_FSUBR_Z_P_ZS_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xxx|Pg=xxx|xxxx|i1=x|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->i1 = (insword>>5)&1;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CNTP_R_P_P_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xx|Pg=xxxx|x|Pn=xxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MUL_Z_ZI_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xx|o2=x|imm8=xxxxxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADD_Z_ZI_:\n\t\tcase ENC_SUB_Z_ZI_:\n\t\tcase ENC_SUBR_Z_ZI_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc<2:1>=xx|opc<0>=x|xx|sh=x|imm8=xxxxxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->sh = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOVPRFX_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc=xx|M=x|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->M = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDP_Z_P_ZZ_:\n\t\tcase ENC_SABD_Z_P_ZZ_:\n\t\tcase ENC_SMAX_Z_P_ZZ_:\n\t\tcase ENC_SMAXP_Z_P_ZZ_:\n\t\tcase ENC_SMIN_Z_P_ZZ_:\n\t\tcase ENC_SMINP_Z_P_ZZ_:\n\t\tcase ENC_UABD_Z_P_ZZ_:\n\t\tcase ENC_UMAX_Z_P_ZZ_:\n\t\tcase ENC_UMAXP_Z_P_ZZ_:\n\t\tcase ENC_UMIN_Z_P_ZZ_:\n\t\tcase ENC_UMINP_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc=xx|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOV_FDUP_Z_I_:\n\t\tcase ENC_FDUP_Z_I_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc=xx|xxx|o2=x|imm8=xxxxxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOV_DUP_Z_I_:\n\t\tcase ENC_MOV_DUP_Z_I_:\n\t\tcase ENC_DUP_Z_I_:\n\t\t\t// xxxxxxxx|size=xx|xxx|opc=xx|xxx|sh=x|imm8=xxxxxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&3;\n\t\t\tctx->sh = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SXTB_Z_P_Z_:\n\t\tcase ENC_SXTH_Z_P_Z_:\n\t\tcase ENC_SXTW_Z_P_Z_:\n\t\tcase ENC_UXTB_Z_P_Z_:\n\t\tcase ENC_UXTH_Z_P_Z_:\n\t\tcase ENC_UXTW_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xxx|xx|U=x|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMAX_Z_ZI_:\n\t\tcase ENC_SMIN_Z_ZI_:\n\t\tcase ENC_UMAX_Z_ZI_:\n\t\tcase ENC_UMIN_Z_ZI_:\n\t\t\t// xxxxxxxx|size=xx|xxx|xx|U=x|xx|o2=x|imm8=xxxxxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQADD_Z_ZI_:\n\t\tcase ENC_SQSUB_Z_ZI_:\n\t\tcase ENC_UQADD_Z_ZI_:\n\t\tcase ENC_UQSUB_Z_ZI_:\n\t\t\t// xxxxxxxx|size=xx|xxx|xx|U=x|xx|sh=x|imm8=xxxxxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->sh = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOV_FCPY_Z_P_I_:\n\t\tcase ENC_FCPY_Z_P_I_:\n\t\t\t// xxxxxxxx|size=xx|xx|Pg=xxxx|xxx|imm8=xxxxxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>16)&15;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOV_CPY_Z_P_I_:\n\t\tcase ENC_MOV_CPY_Z_O_I_:\n\t\tcase ENC_MOV_CPY_Z_P_I_:\n\t\tcase ENC_CPY_Z_O_I_:\n\t\tcase ENC_CPY_Z_P_I_:\n\t\t\t// xxxxxxxx|size=xx|xx|Pg=xxxx|x|M=x|sh=x|imm8=xxxxxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pg = (insword>>16)&15;\n\t\t\tctx->M = (insword>>14)&1;\n\t\t\tctx->sh = (insword>>13)&1;\n\t\t\tctx->imm8 = (insword>>5)&0xff;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TRN1_P_PP_:\n\t\tcase ENC_TRN2_P_PP_:\n\t\tcase ENC_UZP1_P_PP_:\n\t\tcase ENC_UZP2_P_PP_:\n\t\tcase ENC_ZIP2_P_PP_:\n\t\tcase ENC_ZIP1_P_PP_:\n\t\t\t// xxxxxxxx|size=xx|xx|Pm=xxxx|xxx|opc=xx|H=x|x|Pn=xxxx|x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Pm = (insword>>16)&15;\n\t\t\tctx->opc = (insword>>11)&3;\n\t\t\tctx->H = (insword>>10)&1;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_SQRSHL_Z_P_ZZ_:\n\t\tcase ENC_SQRSHLR_Z_P_ZZ_:\n\t\tcase ENC_SQSHL_Z_P_ZZ_:\n\t\tcase ENC_SQSHLR_Z_P_ZZ_:\n\t\tcase ENC_SRSHL_Z_P_ZZ_:\n\t\tcase ENC_SRSHLR_Z_P_ZZ_:\n\t\tcase ENC_UQRSHL_Z_P_ZZ_:\n\t\tcase ENC_UQRSHLR_Z_P_ZZ_:\n\t\tcase ENC_UQSHL_Z_P_ZZ_:\n\t\tcase ENC_UQSHLR_Z_P_ZZ_:\n\t\tcase ENC_URSHL_Z_P_ZZ_:\n\t\tcase ENC_URSHLR_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xx|Q=x|R=x|N=x|U=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>19)&1;\n\t\t\tctx->R = (insword>>18)&1;\n\t\t\tctx->N = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQABS_Z_P_Z_:\n\t\tcase ENC_SQNEG_Z_P_Z_:\n\t\tcase ENC_URECPE_Z_P_Z_:\n\t\tcase ENC_URSQRTE_Z_P_Z_:\n\t\t\t// xxxxxxxx|size=xx|xx|Q=x|x|opc=xx|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Q = (insword>>19)&1;\n\t\t\tctx->opc = (insword>>16)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DECB_R_RS_:\n\t\tcase ENC_DECD_R_RS_:\n\t\tcase ENC_DECH_R_RS_:\n\t\tcase ENC_DECW_R_RS_:\n\t\tcase ENC_INCB_R_RS_:\n\t\tcase ENC_INCD_R_RS_:\n\t\tcase ENC_INCH_R_RS_:\n\t\tcase ENC_INCW_R_RS_:\n\t\t\t// xxxxxxxx|size=xx|xx|imm4=xxxx|xxxxx|D=x|pattern=xxxxx|Rdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->D = (insword>>10)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Rdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DECD_Z_ZS_:\n\t\tcase ENC_DECH_Z_ZS_:\n\t\tcase ENC_DECW_Z_ZS_:\n\t\tcase ENC_INCD_Z_ZS_:\n\t\tcase ENC_INCH_Z_ZS_:\n\t\tcase ENC_INCW_Z_ZS_:\n\t\t\t// xxxxxxxx|size=xx|xx|imm4=xxxx|xxxxx|D=x|pattern=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->D = (insword>>10)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CNTB_R_S_:\n\t\tcase ENC_CNTD_R_S_:\n\t\tcase ENC_CNTH_R_S_:\n\t\tcase ENC_CNTW_R_S_:\n\t\t\t// xxxxxxxx|size=xx|xx|imm4=xxxx|xxxxx|op=x|pattern=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDECD_Z_ZS_:\n\t\tcase ENC_SQDECH_Z_ZS_:\n\t\tcase ENC_SQDECW_Z_ZS_:\n\t\tcase ENC_SQINCD_Z_ZS_:\n\t\tcase ENC_SQINCH_Z_ZS_:\n\t\tcase ENC_SQINCW_Z_ZS_:\n\t\tcase ENC_UQDECD_Z_ZS_:\n\t\tcase ENC_UQDECH_Z_ZS_:\n\t\tcase ENC_UQDECW_Z_ZS_:\n\t\tcase ENC_UQINCD_Z_ZS_:\n\t\tcase ENC_UQINCH_Z_ZS_:\n\t\tcase ENC_UQINCW_Z_ZS_:\n\t\t\t// xxxxxxxx|size=xx|xx|imm4=xxxx|xxxx|D=x|U=x|pattern=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->D = (insword>>11)&1;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABD_Z_P_ZZ_:\n\t\tcase ENC_FADD_Z_P_ZZ_:\n\t\tcase ENC_FDIV_Z_P_ZZ_:\n\t\tcase ENC_FDIVR_Z_P_ZZ_:\n\t\tcase ENC_FMAX_Z_P_ZZ_:\n\t\tcase ENC_FMAXNM_Z_P_ZZ_:\n\t\tcase ENC_FMIN_Z_P_ZZ_:\n\t\tcase ENC_FMINNM_Z_P_ZZ_:\n\t\tcase ENC_FMUL_Z_P_ZZ_:\n\t\tcase ENC_FMULX_Z_P_ZZ_:\n\t\tcase ENC_FSCALE_Z_P_ZZ_:\n\t\tcase ENC_FSUB_Z_P_ZZ_:\n\t\tcase ENC_FSUBR_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|xx|opc<3:1>=xxx|opc<0>=x|xxx|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&7;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_INDEX_Z_RR_:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|xxxxxx|Rn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_WHILERW_P_RR_:\n\t\tcase ENC_WHILEWR_P_RR_:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|xxxxxx|Rn=xxxxx|rw=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->rw = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_INDEX_Z_IR_:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|xxxxxx|imm5=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm5 = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_WHILEGE_P_P_RR_:\n\t\tcase ENC_WHILEGT_P_P_RR_:\n\t\tcase ENC_WHILEHI_P_P_RR_:\n\t\tcase ENC_WHILEHS_P_P_RR_:\n\t\tcase ENC_WHILELE_P_P_RR_:\n\t\tcase ENC_WHILELO_P_P_RR_:\n\t\tcase ENC_WHILELS_P_P_RR_:\n\t\tcase ENC_WHILELT_P_P_RR_:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|xxx|sf=x|U=x|lt=x|Rn=xxxxx|eq=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->sf = (insword>>12)&1;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->lt = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->eq = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_SHA1C_QSV_CRYPTOSHA3:\n\t\tcase ENC_SHA1M_QSV_CRYPTOSHA3:\n\t\tcase ENC_SHA1P_QSV_CRYPTOSHA3:\n\t\tcase ENC_SHA1SU0_VVV_CRYPTOSHA3:\n\t\tcase ENC_SHA256SU1_VVV_CRYPTOSHA3:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|x|opcode=xxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SHA256H2_QQV_CRYPTOSHA3:\n\t\tcase ENC_SHA256H_QQV_CRYPTOSHA3:\n\t\t\t// xxxxxxxx|size=xx|x|Rm=xxxxx|x|opcode[2:1]=xx|P=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&3;\n\t\t\tctx->P = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAD_Z_P_ZZZ_:\n\t\tcase ENC_FMSB_Z_P_ZZZ_:\n\t\tcase ENC_FNMAD_Z_P_ZZZ_:\n\t\tcase ENC_FNMSB_Z_P_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Za=xxxxx|x|N=x|op=x|Pg=xxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Za = (insword>>16)&0x1f;\n\t\t\tctx->N = (insword>>14)&1;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMPGT_P_P_ZW_:\n\t\tcase ENC_CMPGE_P_P_ZW_:\n\t\tcase ENC_CMPHI_P_P_ZW_:\n\t\tcase ENC_CMPHS_P_P_ZW_:\n\t\tcase ENC_CMPLT_P_P_ZW_:\n\t\tcase ENC_CMPLE_P_P_ZW_:\n\t\tcase ENC_CMPLO_P_P_ZW_:\n\t\tcase ENC_CMPLS_P_P_ZW_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|U=x|x|lt=x|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>15)&1;\n\t\t\tctx->lt = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_FCMLE_FCMGE_P_P_ZZ_:\n\t\tcase ENC_FCMLT_FCMGT_P_P_ZZ_:\n\t\tcase ENC_FCMEQ_P_P_ZZ_:\n\t\tcase ENC_FCMGT_P_P_ZZ_:\n\t\tcase ENC_FCMGE_P_P_ZZ_:\n\t\tcase ENC_FCMNE_P_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|op=x|x|cmph=x|Pg=xxx|Zn=xxxxx|cmpl=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->cmph = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->cmpl = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_CMPLE_CMPGE_P_P_ZZ_:\n\t\tcase ENC_CMPLO_CMPHI_P_P_ZZ_:\n\t\tcase ENC_CMPLS_CMPHS_P_P_ZZ_:\n\t\tcase ENC_CMPLT_CMPGT_P_P_ZZ_:\n\t\tcase ENC_CMPEQ_P_P_ZW_:\n\t\tcase ENC_CMPNE_P_P_ZW_:\n\t\tcase ENC_CMPEQ_P_P_ZZ_:\n\t\tcase ENC_CMPGT_P_P_ZZ_:\n\t\tcase ENC_CMPGE_P_P_ZZ_:\n\t\tcase ENC_CMPHI_P_P_ZZ_:\n\t\tcase ENC_CMPHS_P_P_ZZ_:\n\t\tcase ENC_CMPNE_P_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|op=x|x|o2=x|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_FACLE_FACGE_P_P_ZZ_:\n\t\tcase ENC_FACLT_FACGT_P_P_ZZ_:\n\t\tcase ENC_FACGT_P_P_ZZ_:\n\t\tcase ENC_FACGE_P_P_ZZ_:\n\t\tcase ENC_FCMUO_P_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|op=x|x|o2=x|Pg=xxx|Zn=xxxxx|o3=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->o3 = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_HISTSEG_Z_ZZ_:\n\t\tcase ENC_TBL_Z_ZZ_1:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_USDOT_Z_ZZZ_S:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_Z_ZZ_:\n\t\tcase ENC_SQRDMULH_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|R=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->R = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMLALBT_Z_ZZZ_:\n\t\tcase ENC_SQDMLSLBT_Z_ZZZ_:\n\t\tcase ENC_SQRDMLAH_Z_ZZZ_:\n\t\tcase ENC_SQRDMLSH_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|S=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SCLAMP_Z_ZZ_:\n\t\tcase ENC_UCLAMP_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|U=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SABA_Z_ZZZ_:\n\t\tcase ENC_SDOT_Z_ZZZ_:\n\t\tcase ENC_UABA_Z_ZZZ_:\n\t\tcase ENC_UDOT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|U=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FTSSEL_Z_ZZ_:\n\t\tcase ENC_RAX1_Z_ZZ_:\n\t\tcase ENC_SM4EKEY_Z_ZZ_:\n\t\tcase ENC_TBL_Z_ZZ_2:\n\t\tcase ENC_TBX_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|op=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_EORBT_Z_ZZ_:\n\t\tcase ENC_EORTB_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxxx|tb=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->tb = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMLALB_Z_ZZZ_:\n\t\tcase ENC_SQDMLALT_Z_ZZZ_:\n\t\tcase ENC_SQDMLSLB_Z_ZZZ_:\n\t\tcase ENC_SQDMLSLT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|S=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SADDLBT_Z_ZZ_:\n\t\tcase ENC_SSUBLBT_Z_ZZ_:\n\t\tcase ENC_SSUBLTB_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|S=x|tb=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->tb = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SABALB_Z_ZZZ_:\n\t\tcase ENC_SABALT_Z_ZZZ_:\n\t\tcase ENC_UABALB_Z_ZZZ_:\n\t\tcase ENC_UABALT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|U=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BDEP_Z_ZZ_:\n\t\tcase ENC_BEXT_Z_ZZ_:\n\t\tcase ENC_BGRP_Z_ZZ_:\n\t\tcase ENC_LSL_Z_ZW_:\n\t\tcase ENC_MUL_Z_ZZ_:\n\t\tcase ENC_PMUL_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|opc=xx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->opc = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CDOT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|rot=xx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->rot = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ASR_Z_ZW_:\n\t\tcase ENC_LSR_Z_ZW_:\n\t\tcase ENC_SMULH_Z_ZZ_:\n\t\tcase ENC_UMULH_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxxx|x|U=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_HISTCNT_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|Pg=xxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MATCH_P_P_ZZ_:\n\t\tcase ENC_NMATCH_P_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|Pg=xxx|Zn=xxxxx|op=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->op = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_ADDHNB_Z_ZZ_:\n\t\tcase ENC_ADDHNT_Z_ZZ_:\n\t\tcase ENC_RADDHNB_Z_ZZ_:\n\t\tcase ENC_RADDHNT_Z_ZZ_:\n\t\tcase ENC_RSUBHNB_Z_ZZ_:\n\t\tcase ENC_RSUBHNT_Z_ZZ_:\n\t\tcase ENC_SUBHNB_Z_ZZ_:\n\t\tcase ENC_SUBHNT_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|S=x|R=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->R = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SADDWB_Z_ZZ_:\n\t\tcase ENC_SADDWT_Z_ZZ_:\n\t\tcase ENC_SSUBWB_Z_ZZ_:\n\t\tcase ENC_SSUBWT_Z_ZZ_:\n\t\tcase ENC_UADDWB_Z_ZZ_:\n\t\tcase ENC_UADDWT_Z_ZZ_:\n\t\tcase ENC_USUBWB_Z_ZZ_:\n\t\tcase ENC_USUBWT_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|S=x|U=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMLALB_Z_ZZZ_:\n\t\tcase ENC_SMLALT_Z_ZZZ_:\n\t\tcase ENC_SMLSLB_Z_ZZZ_:\n\t\tcase ENC_SMLSLT_Z_ZZZ_:\n\t\tcase ENC_UMLALB_Z_ZZZ_:\n\t\tcase ENC_UMLALT_Z_ZZZ_:\n\t\tcase ENC_UMLSLB_Z_ZZZ_:\n\t\tcase ENC_UMLSLT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|S=x|U=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PMULLB_Z_ZZ_:\n\t\tcase ENC_PMULLT_Z_ZZ_:\n\t\tcase ENC_SMULLB_Z_ZZ_:\n\t\tcase ENC_SMULLT_Z_ZZ_:\n\t\tcase ENC_SQDMULLB_Z_ZZ_:\n\t\tcase ENC_SQDMULLT_Z_ZZ_:\n\t\tcase ENC_UMULLB_Z_ZZ_:\n\t\tcase ENC_UMULLT_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|op=x|U=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMLA_Z_ZZZ_:\n\t\tcase ENC_SQRDCMLAH_Z_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|op=x|rot=xx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->rot = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADD_Z_ZZ_:\n\t\tcase ENC_FADD_Z_ZZ_:\n\t\tcase ENC_FMUL_Z_ZZ_:\n\t\tcase ENC_FRECPS_Z_ZZ_:\n\t\tcase ENC_FRSQRTS_Z_ZZ_:\n\t\tcase ENC_FSUB_Z_ZZ_:\n\t\tcase ENC_FTSMUL_Z_ZZ_:\n\t\tcase ENC_SUB_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|opc<2:1>=xx|opc<0>=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->opc = (insword>>11)&3;\n\t\t\tctx->opc = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TRN1_Z_ZZ_:\n\t\tcase ENC_TRN2_Z_ZZ_:\n\t\tcase ENC_UZP1_Z_ZZ_:\n\t\tcase ENC_UZP2_Z_ZZ_:\n\t\tcase ENC_ZIP2_Z_ZZ_:\n\t\tcase ENC_ZIP1_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|xx|H=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->H = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQADD_Z_ZZ_:\n\t\tcase ENC_SQSUB_Z_ZZ_:\n\t\tcase ENC_UQADD_Z_ZZ_:\n\t\tcase ENC_UQSUB_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xxx|xx|U=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_SEL_Z_P_ZZ_:\n\t\tcase ENC_SEL_Z_P_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xx|Pg=xxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MAD_Z_P_ZZZ_:\n\t\tcase ENC_MSB_Z_P_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xx|op=x|Pg=xxx|Za=xxxxx|Zdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Za = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MLA_Z_P_ZZZ_:\n\t\tcase ENC_MLS_Z_P_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xx|op=x|Pg=xxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SABDLB_Z_ZZ_:\n\t\tcase ENC_SABDLT_Z_ZZ_:\n\t\tcase ENC_SADDLB_Z_ZZ_:\n\t\tcase ENC_SADDLT_Z_ZZ_:\n\t\tcase ENC_SSUBLB_Z_ZZ_:\n\t\tcase ENC_SSUBLT_Z_ZZ_:\n\t\tcase ENC_UABDLB_Z_ZZ_:\n\t\tcase ENC_UABDLT_Z_ZZ_:\n\t\tcase ENC_UADDLB_Z_ZZ_:\n\t\tcase ENC_UADDLT_Z_ZZ_:\n\t\tcase ENC_USUBLB_Z_ZZ_:\n\t\tcase ENC_USUBLT_Z_ZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|xx|op=x|S=x|U=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->U = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_Z_P_ZZZ_:\n\t\tcase ENC_FMLS_Z_P_ZZZ_:\n\t\tcase ENC_FNMLA_Z_P_ZZZ_:\n\t\tcase ENC_FNMLS_Z_P_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|x|N=x|op=x|Pg=xxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->N = (insword>>14)&1;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMLA_Z_P_ZZZ_:\n\t\t\t// xxxxxxxx|size=xx|x|Zm=xxxxx|x|rot=xx|Pg=xxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->rot = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMUL_Z_ZZI_D:\n\t\tcase ENC_MUL_Z_ZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_Z_ZZI_D:\n\t\tcase ENC_SQRDMULH_Z_ZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxxx|R=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->R = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MLA_Z_ZZZI_D:\n\t\tcase ENC_MLS_Z_ZZZI_D:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_D:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxxx|S=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->S = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SDOT_Z_ZZZI_D:\n\t\tcase ENC_UDOT_Z_ZZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxxx|U=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_Z_ZZZI_D:\n\t\tcase ENC_FMLS_Z_ZZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxxx|op=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CDOT_Z_ZZZI_D:\n\t\tcase ENC_CMLA_Z_ZZZI_S:\n\t\tcase ENC_FCMLA_Z_ZZZI_S:\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i1=x|Zm=xxxx|xxxx|rot=xx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i1 = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->rot = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMUL_Z_ZZI_S:\n\t\tcase ENC_MUL_Z_ZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_Z_ZZI_S:\n\t\tcase ENC_SQRDMULH_Z_ZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxxx|R=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->R = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MLA_Z_ZZZI_S:\n\t\tcase ENC_MLS_Z_ZZZI_S:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_S:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxxx|S=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->S = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SDOT_Z_ZZZI_S:\n\t\tcase ENC_SUDOT_Z_ZZZI_S:\n\t\tcase ENC_UDOT_Z_ZZZI_S:\n\t\tcase ENC_USDOT_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxxx|U=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_Z_ZZZI_S:\n\t\tcase ENC_FMLS_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxxx|op=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CDOT_Z_ZZZI_S:\n\t\tcase ENC_CMLA_Z_ZZZI_H:\n\t\tcase ENC_FCMLA_Z_ZZZI_H:\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_H:\n\t\t\t// xxxxxxxx|size=xx|x|i2=xx|Zm=xxx|xxxx|rot=xx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2 = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->rot = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULLB_Z_ZZI_D:\n\t\tcase ENC_SQDMULLT_Z_ZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i2h=x|Zm=xxxx|xxxx|i2l=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2h = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->i2l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMLALB_Z_ZZZI_D:\n\t\tcase ENC_SQDMLALT_Z_ZZZI_D:\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_D:\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i2h=x|Zm=xxxx|xxx|S=x|i2l=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2h = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->i2l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMULLB_Z_ZZI_D:\n\t\tcase ENC_SMULLT_Z_ZZI_D:\n\t\tcase ENC_UMULLB_Z_ZZI_D:\n\t\tcase ENC_UMULLT_Z_ZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i2h=x|Zm=xxxx|xxx|U=x|i2l=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2h = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->U = (insword>>12)&1;\n\t\t\tctx->i2l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMLALB_Z_ZZZI_D:\n\t\tcase ENC_SMLALT_Z_ZZZI_D:\n\t\tcase ENC_SMLSLB_Z_ZZZI_D:\n\t\tcase ENC_SMLSLT_Z_ZZZI_D:\n\t\tcase ENC_UMLALB_Z_ZZZI_D:\n\t\tcase ENC_UMLALT_Z_ZZZI_D:\n\t\tcase ENC_UMLSLB_Z_ZZZI_D:\n\t\tcase ENC_UMLSLT_Z_ZZZI_D:\n\t\t\t// xxxxxxxx|size=xx|x|i2h=x|Zm=xxxx|xx|S=x|U=x|i2l=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i2h = (insword>>20)&1;\n\t\t\tctx->Zm = (insword>>16)&15;\n\t\t\tctx->S = (insword>>13)&1;\n\t\t\tctx->U = (insword>>12)&1;\n\t\t\tctx->i2l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULLB_Z_ZZI_S:\n\t\tcase ENC_SQDMULLT_Z_ZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i3h=xx|Zm=xxx|xxxx|i3l=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i3h = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->i3l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMLALB_Z_ZZZI_S:\n\t\tcase ENC_SQDMLALT_Z_ZZZI_S:\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_S:\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i3h=xx|Zm=xxx|xxx|S=x|i3l=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i3h = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->i3l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMULLB_Z_ZZI_S:\n\t\tcase ENC_SMULLT_Z_ZZI_S:\n\t\tcase ENC_UMULLB_Z_ZZI_S:\n\t\tcase ENC_UMULLT_Z_ZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i3h=xx|Zm=xxx|xxx|U=x|i3l=x|T=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i3h = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->U = (insword>>12)&1;\n\t\t\tctx->i3l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMLALB_Z_ZZZI_S:\n\t\tcase ENC_SMLALT_Z_ZZZI_S:\n\t\tcase ENC_SMLSLB_Z_ZZZI_S:\n\t\tcase ENC_SMLSLT_Z_ZZZI_S:\n\t\tcase ENC_UMLALB_Z_ZZZI_S:\n\t\tcase ENC_UMLALT_Z_ZZZI_S:\n\t\tcase ENC_UMLSLB_Z_ZZZI_S:\n\t\tcase ENC_UMLSLT_Z_ZZZI_S:\n\t\t\t// xxxxxxxx|size=xx|x|i3h=xx|Zm=xxx|xx|S=x|U=x|i3l=x|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->i3h = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->S = (insword>>13)&1;\n\t\t\tctx->U = (insword>>12)&1;\n\t\t\tctx->i3l = (insword>>11)&1;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMPGT_P_P_ZI_:\n\t\tcase ENC_CMPGE_P_P_ZI_:\n\t\tcase ENC_CMPLT_P_P_ZI_:\n\t\tcase ENC_CMPLE_P_P_ZI_:\n\t\t\t// xxxxxxxx|size=xx|x|imm5=xxxxx|op=x|x|lt=x|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->lt = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_CMPEQ_P_P_ZI_:\n\t\tcase ENC_CMPNE_P_P_ZI_:\n\t\t\t// xxxxxxxx|size=xx|x|imm5=xxxxx|op=x|x|o2=x|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_INDEX_Z_RI_:\n\t\t\t// xxxxxxxx|size=xx|x|imm5=xxxxx|xxxxxx|Rn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_INDEX_Z_II_:\n\t\t\t// xxxxxxxx|size=xx|x|imm5b=xxxxx|xxxxxx|imm5=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm5b = (insword>>16)&0x1f;\n\t\t\tctx->imm5 = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMPHI_P_P_ZI_:\n\t\tcase ENC_CMPHS_P_P_ZI_:\n\t\tcase ENC_CMPLO_P_P_ZI_:\n\t\tcase ENC_CMPLS_P_P_ZI_:\n\t\t\t// xxxxxxxx|size=xx|x|imm7=xxxxxxx|lt=x|Pg=xxx|Zn=xxxxx|ne=x|Pd=xxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->imm7 = (insword>>14)&0x7f;\n\t\t\tctx->lt = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tctx->Pd = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_FEXPA_Z_Z_:\n\t\t\t// xxxxxxxx|size=xx|x|opc<4:1>=xxxx|opc<0>=x|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>17)&15;\n\t\t\tctx->opc = (insword>>16)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDECB_R_RS_SX:\n\t\tcase ENC_SQDECB_R_RS_X:\n\t\tcase ENC_SQDECD_R_RS_SX:\n\t\tcase ENC_SQDECD_R_RS_X:\n\t\tcase ENC_SQDECH_R_RS_SX:\n\t\tcase ENC_SQDECH_R_RS_X:\n\t\tcase ENC_SQDECW_R_RS_SX:\n\t\tcase ENC_SQDECW_R_RS_X:\n\t\tcase ENC_SQINCB_R_RS_SX:\n\t\tcase ENC_SQINCB_R_RS_X:\n\t\tcase ENC_SQINCD_R_RS_SX:\n\t\tcase ENC_SQINCD_R_RS_X:\n\t\tcase ENC_SQINCH_R_RS_SX:\n\t\tcase ENC_SQINCH_R_RS_X:\n\t\tcase ENC_SQINCW_R_RS_SX:\n\t\tcase ENC_SQINCW_R_RS_X:\n\t\tcase ENC_UQDECB_R_RS_UW:\n\t\tcase ENC_UQDECB_R_RS_X:\n\t\tcase ENC_UQDECD_R_RS_UW:\n\t\tcase ENC_UQDECD_R_RS_X:\n\t\tcase ENC_UQDECH_R_RS_UW:\n\t\tcase ENC_UQDECH_R_RS_X:\n\t\tcase ENC_UQDECW_R_RS_UW:\n\t\tcase ENC_UQDECW_R_RS_X:\n\t\tcase ENC_UQINCB_R_RS_UW:\n\t\tcase ENC_UQINCB_R_RS_X:\n\t\tcase ENC_UQINCD_R_RS_UW:\n\t\tcase ENC_UQINCD_R_RS_X:\n\t\tcase ENC_UQINCH_R_RS_UW:\n\t\tcase ENC_UQINCH_R_RS_X:\n\t\tcase ENC_UQINCW_R_RS_UW:\n\t\tcase ENC_UQINCW_R_RS_X:\n\t\t\t// xxxxxxxx|size=xx|x|sf=x|imm4=xxxx|xxxx|D=x|U=x|pattern=xxxxx|Rdn=xxxxx\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->sf = (insword>>20)&1;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->D = (insword>>11)&1;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->pattern = (insword>>5)&0x1f;\n\t\t\tctx->Rdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ASR_Z_P_ZI_:\n\t\tcase ENC_ASRD_Z_P_ZI_:\n\t\tcase ENC_LSL_Z_P_ZI_:\n\t\tcase ENC_LSR_Z_P_ZI_:\n\t\tcase ENC_SQSHL_Z_P_ZI_:\n\t\tcase ENC_SQSHLU_Z_P_ZI_:\n\t\tcase ENC_SRSHR_Z_P_ZI_:\n\t\tcase ENC_UQSHL_Z_P_ZI_:\n\t\tcase ENC_URSHR_Z_P_ZI_:\n\t\t\t// xxxxxxxx|tszh=xx|xx|opc=xx|L=x|U=x|xxx|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->opc = (insword>>18)&3;\n\t\t\tctx->L = (insword>>17)&1;\n\t\t\tctx->U = (insword>>16)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->tszl = (insword>>8)&3;\n\t\t\tctx->imm3 = (insword>>5)&7;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_XAR_Z_ZZI_:\n\t\t\t// xxxxxxxx|tszh=xx|x|tszl=xx|imm3=xxx|xxxxxx|Zm=xxxxx|Zdn=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->Zm = (insword>>5)&0x1f;\n\t\t\tctx->Zdn = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SLI_Z_ZZI_:\n\t\tcase ENC_SRI_Z_ZZI_:\n\t\t\t// xxxxxxxx|tszh=xx|x|tszl=xx|imm3=xxx|xxxxx|op=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SRSRA_Z_ZI_:\n\t\tcase ENC_SSRA_Z_ZI_:\n\t\tcase ENC_URSRA_Z_ZI_:\n\t\tcase ENC_USRA_Z_ZI_:\n\t\t\t// xxxxxxxx|tszh=xx|x|tszl=xx|imm3=xxx|xxxx|R=x|U=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->R = (insword>>11)&1;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LSL_Z_ZI_:\n\t\t\t// xxxxxxxx|tszh=xx|x|tszl=xx|imm3=xxx|xxxx|opc=xx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->opc = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ASR_Z_ZI_:\n\t\tcase ENC_LSR_Z_ZI_:\n\t\t\t// xxxxxxxx|tszh=xx|x|tszl=xx|imm3=xxx|xxxx|x|U=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->tszh = (insword>>22)&3;\n\t\t\tctx->tszl = (insword>>19)&3;\n\t\t\tctx->imm3 = (insword>>16)&7;\n\t\t\tctx->U = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMMLA_Z_ZZZ_:\n\t\tcase ENC_UMMLA_Z_ZZZ_:\n\t\tcase ENC_USMMLA_Z_ZZZ_:\n\t\t\t// xxxxxxxx|uns=xx|x|Zm=xxxxx|xxxxxx|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->uns = (insword>>22)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMUL_Z_ZZI_H:\n\t\tcase ENC_MUL_Z_ZZI_H:\n\t\t\t// xxxxxxxx|x|i3h=x|x|i3l=xx|Zm=xxx|xxxxxx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->i3h = (insword>>22)&1;\n\t\t\tctx->i3l = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_Z_ZZI_H:\n\t\tcase ENC_SQRDMULH_Z_ZZI_H:\n\t\t\t// xxxxxxxx|x|i3h=x|x|i3l=xx|Zm=xxx|xxxxx|R=x|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->i3h = (insword>>22)&1;\n\t\t\tctx->i3l = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->R = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MLA_Z_ZZZI_H:\n\t\tcase ENC_MLS_Z_ZZZI_H:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_H:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_H:\n\t\t\t// xxxxxxxx|x|i3h=x|x|i3l=xx|Zm=xxx|xxxxx|S=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->i3h = (insword>>22)&1;\n\t\t\tctx->i3l = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->S = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_Z_ZZZI_H:\n\t\tcase ENC_FMLS_Z_ZZZI_H:\n\t\t\t// xxxxxxxx|x|i3h=x|x|i3l=xx|Zm=xxx|xxxxx|op=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->i3h = (insword>>22)&1;\n\t\t\tctx->i3l = (insword>>19)&3;\n\t\t\tctx->Zm = (insword>>16)&7;\n\t\t\tctx->op = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADCLB_Z_ZZZ_:\n\t\tcase ENC_ADCLT_Z_ZZZ_:\n\t\tcase ENC_SBCLB_Z_ZZZ_:\n\t\tcase ENC_SBCLT_Z_ZZZ_:\n\t\t\t// xxxxxxxx|x|sz=x|x|Zm=xxxxx|xxxxx|T=x|Zn=xxxxx|Zda=xxxxx\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->T = (insword>>10)&1;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zda = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADR_Z_AZ_SD_SAME_SCALED:\n\t\t\t// xxxxxxxx|x|sz=x|x|Zm=xxxxx|xxxx|msz=xx|Zn=xxxxx|Zd=xxxxx\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->msz = (insword>>10)&3;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BLR_64_BRANCH_REG:\n\t\tcase ENC_BLRAAZ_64_BRANCH_REG:\n\t\tcase ENC_BLRAA_64P_BRANCH_REG:\n\t\tcase ENC_BLRABZ_64_BRANCH_REG:\n\t\tcase ENC_BLRAB_64P_BRANCH_REG:\n\t\tcase ENC_BR_64_BRANCH_REG:\n\t\tcase ENC_BRAAZ_64_BRANCH_REG:\n\t\tcase ENC_BRAA_64P_BRANCH_REG:\n\t\tcase ENC_BRABZ_64_BRANCH_REG:\n\t\tcase ENC_BRAB_64P_BRANCH_REG:\n\t\tcase ENC_RET_64R_BRANCH_REG:\n\t\tcase ENC_RETAA_64E_BRANCH_REG:\n\t\tcase ENC_RETAB_64E_BRANCH_REG:\n\t\t\t// xxxxxxx|Z=x|opc[2:1]=x|op=xx|op2=xxxxx|op3[5:2]=xxxx|A=x|M=x|Rn=xxxxx|Rm=xxxxx\n\t\t\tctx->Z = (insword>>24)&1;\n\t\t\tctx->opc = (insword>>23)&1;\n\t\t\tctx->op = (insword>>21)&3;\n\t\t\tctx->op2 = (insword>>16)&0x1f;\n\t\t\tctx->op3 = (insword>>12)&15;\n\t\t\tctx->A = (insword>>11)&1;\n\t\t\tctx->M = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rm = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_BR_U8:\n\t\tcase ENC_LD1B_Z_P_BR_U16:\n\t\tcase ENC_LD1B_Z_P_BR_U32:\n\t\tcase ENC_LD1B_Z_P_BR_U64:\n\t\tcase ENC_LD1D_Z_P_BR_U64:\n\t\tcase ENC_LD1H_Z_P_BR_U16:\n\t\tcase ENC_LD1H_Z_P_BR_U32:\n\t\tcase ENC_LD1H_Z_P_BR_U64:\n\t\tcase ENC_LD1SB_Z_P_BR_S16:\n\t\tcase ENC_LD1SB_Z_P_BR_S32:\n\t\tcase ENC_LD1SB_Z_P_BR_S64:\n\t\tcase ENC_LD1SH_Z_P_BR_S32:\n\t\tcase ENC_LD1SH_Z_P_BR_S64:\n\t\tcase ENC_LD1SW_Z_P_BR_S64:\n\t\tcase ENC_LD1W_Z_P_BR_U32:\n\t\tcase ENC_LD1W_Z_P_BR_U64:\n\t\tcase ENC_LDFF1B_Z_P_BR_U8:\n\t\tcase ENC_LDFF1B_Z_P_BR_U16:\n\t\tcase ENC_LDFF1B_Z_P_BR_U32:\n\t\tcase ENC_LDFF1B_Z_P_BR_U64:\n\t\tcase ENC_LDFF1D_Z_P_BR_U64:\n\t\tcase ENC_LDFF1H_Z_P_BR_U16:\n\t\tcase ENC_LDFF1H_Z_P_BR_U32:\n\t\tcase ENC_LDFF1H_Z_P_BR_U64:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S16:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S32:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S64:\n\t\tcase ENC_LDFF1SH_Z_P_BR_S32:\n\t\tcase ENC_LDFF1SH_Z_P_BR_S64:\n\t\tcase ENC_LDFF1SW_Z_P_BR_S64:\n\t\tcase ENC_LDFF1W_Z_P_BR_U32:\n\t\tcase ENC_LDFF1W_Z_P_BR_U64:\n\t\t\t// xxxxxxx|dtype<3:1>=xxx|dtype<0>=x|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->dtype = (insword>>22)&7;\n\t\t\tctx->dtype = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_BI_U8:\n\t\tcase ENC_LD1B_Z_P_BI_U16:\n\t\tcase ENC_LD1B_Z_P_BI_U32:\n\t\tcase ENC_LD1B_Z_P_BI_U64:\n\t\tcase ENC_LD1D_Z_P_BI_U64:\n\t\tcase ENC_LD1H_Z_P_BI_U16:\n\t\tcase ENC_LD1H_Z_P_BI_U32:\n\t\tcase ENC_LD1H_Z_P_BI_U64:\n\t\tcase ENC_LD1SB_Z_P_BI_S16:\n\t\tcase ENC_LD1SB_Z_P_BI_S32:\n\t\tcase ENC_LD1SB_Z_P_BI_S64:\n\t\tcase ENC_LD1SH_Z_P_BI_S32:\n\t\tcase ENC_LD1SH_Z_P_BI_S64:\n\t\tcase ENC_LD1SW_Z_P_BI_S64:\n\t\tcase ENC_LD1W_Z_P_BI_U32:\n\t\tcase ENC_LD1W_Z_P_BI_U64:\n\t\tcase ENC_LDNF1B_Z_P_BI_U8:\n\t\tcase ENC_LDNF1B_Z_P_BI_U16:\n\t\tcase ENC_LDNF1B_Z_P_BI_U32:\n\t\tcase ENC_LDNF1B_Z_P_BI_U64:\n\t\tcase ENC_LDNF1D_Z_P_BI_U64:\n\t\tcase ENC_LDNF1H_Z_P_BI_U16:\n\t\tcase ENC_LDNF1H_Z_P_BI_U32:\n\t\tcase ENC_LDNF1H_Z_P_BI_U64:\n\t\tcase ENC_LDNF1SB_Z_P_BI_S16:\n\t\tcase ENC_LDNF1SB_Z_P_BI_S32:\n\t\tcase ENC_LDNF1SB_Z_P_BI_S64:\n\t\tcase ENC_LDNF1SH_Z_P_BI_S32:\n\t\tcase ENC_LDNF1SH_Z_P_BI_S64:\n\t\tcase ENC_LDNF1SW_Z_P_BI_S64:\n\t\tcase ENC_LDNF1W_Z_P_BI_U32:\n\t\tcase ENC_LDNF1W_Z_P_BI_U64:\n\t\t\t// xxxxxxx|dtype<3:1>=xxx|dtype<0>=x|x|imm4=xxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->dtype = (insword>>22)&7;\n\t\t\tctx->dtype = (insword>>21)&1;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1RB_Z_P_BI_U8:\n\t\tcase ENC_LD1RB_Z_P_BI_U16:\n\t\tcase ENC_LD1RB_Z_P_BI_U32:\n\t\tcase ENC_LD1RB_Z_P_BI_U64:\n\t\tcase ENC_LD1RD_Z_P_BI_U64:\n\t\tcase ENC_LD1RH_Z_P_BI_U16:\n\t\tcase ENC_LD1RH_Z_P_BI_U32:\n\t\tcase ENC_LD1RH_Z_P_BI_U64:\n\t\tcase ENC_LD1RSB_Z_P_BI_S16:\n\t\tcase ENC_LD1RSB_Z_P_BI_S32:\n\t\tcase ENC_LD1RSB_Z_P_BI_S64:\n\t\tcase ENC_LD1RSH_Z_P_BI_S32:\n\t\tcase ENC_LD1RSH_Z_P_BI_S64:\n\t\tcase ENC_LD1RSW_Z_P_BI_S64:\n\t\tcase ENC_LD1RW_Z_P_BI_U32:\n\t\tcase ENC_LD1RW_Z_P_BI_U64:\n\t\t\t// xxxxxxx|dtypeh=xx|x|imm6=xxxxxx|x|dtypel=xx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->dtypeh = (insword>>23)&3;\n\t\t\tctx->imm6 = (insword>>16)&0x3f;\n\t\t\tctx->dtypel = (insword>>13)&3;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD2B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD2D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD2H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD2W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD3B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD3D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD3H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD3W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD4B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD4D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD4H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD4W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST2B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST2D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST2H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST2W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST3B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST3D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST3H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST3W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST4B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST4D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST4H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_ST4W_Z_P_BR_CONTIGUOUS:\n\t\t\t// xxxxxxx|msz=xx|opc=xx|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->opc = (insword>>21)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD2B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4W_Z_P_BI_CONTIGUOUS:\n\t\t\t// xxxxxxx|msz=xx|opc=xx|x|imm4=xxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->opc = (insword>>21)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ST1B_Z_P_BI_:\n\t\tcase ENC_ST1D_Z_P_BI_:\n\t\tcase ENC_ST1H_Z_P_BI_:\n\t\tcase ENC_ST1W_Z_P_BI_:\n\t\t\t// xxxxxxx|msz=xx|size=xx|x|imm4=xxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->size = (insword>>21)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1ROB_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1ROD_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1ROH_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1ROW_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1RQB_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1RQD_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1RQH_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LD1RQW_Z_P_BR_CONTIGUOUS:\n\t\t\t// xxxxxxx|msz=xx|ssz=xx|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->ssz = (insword>>21)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1ROB_Z_P_BI_U8:\n\t\tcase ENC_LD1ROD_Z_P_BI_U64:\n\t\tcase ENC_LD1ROH_Z_P_BI_U16:\n\t\tcase ENC_LD1ROW_Z_P_BI_U32:\n\t\tcase ENC_LD1RQB_Z_P_BI_U8:\n\t\tcase ENC_LD1RQD_Z_P_BI_U64:\n\t\tcase ENC_LD1RQH_Z_P_BI_U16:\n\t\tcase ENC_LD1RQW_Z_P_BI_U32:\n\t\t\t// xxxxxxx|msz=xx|ssz=xx|x|imm4=xxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->ssz = (insword>>21)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xs=x|x|Zm=xxxxx|x|U=x|ff=x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->xs = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDNT1B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1W_Z_P_BI_CONTIGUOUS:\n\t\t\t// xxxxxxx|msz=xx|xxx|imm4=xxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->imm4 = (insword>>16)&15;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDNT1B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LDNT1D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LDNT1H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_LDNT1W_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_STNT1B_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_STNT1D_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_STNT1H_Z_P_BR_CONTIGUOUS:\n\t\tcase ENC_STNT1W_Z_P_BR_CONTIGUOUS:\n\t\t\t// xxxxxxx|msz=xx|xx|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PRFB_I_P_BR_S:\n\t\tcase ENC_PRFD_I_P_BR_S:\n\t\tcase ENC_PRFH_I_P_BR_S:\n\t\tcase ENC_PRFW_I_P_BR_S:\n\t\t\t// xxxxxxx|msz=xx|xx|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|x|prfop=xxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->prfop = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_STNT1B_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1B_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1D_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1H_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1H_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1W_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1W_Z_P_AR_D_64_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Rm=xxxxx|xxx|Pg=xxx|Zn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Rm=xxxxx|xx|U=x|Pg=xxx|Zn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LDNT1B_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1D_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1H_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1W_Z_P_AR_D_64_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Rm=xxxxx|x|U=x|x|Pg=xxx|Zn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ST1B_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Zm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1SB_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Zm=xxxxx|x|U=x|ff=x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ST1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_UNSCALED:\n\t\t\t// xxxxxxx|msz=xx|xx|Zm=xxxxx|x|xs=x|x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->xs = (insword>>14)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ST1B_Z_P_AI_S:\n\t\tcase ENC_ST1B_Z_P_AI_D:\n\t\tcase ENC_ST1D_Z_P_AI_D:\n\t\tcase ENC_ST1H_Z_P_AI_S:\n\t\tcase ENC_ST1H_Z_P_AI_D:\n\t\tcase ENC_ST1W_Z_P_AI_S:\n\t\tcase ENC_ST1W_Z_P_AI_D:\n\t\t\t// xxxxxxx|msz=xx|xx|imm5=xxxxx|xxx|Pg=xxx|Zn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PRFB_I_P_AI_S:\n\t\tcase ENC_PRFB_I_P_AI_D:\n\t\tcase ENC_PRFD_I_P_AI_S:\n\t\tcase ENC_PRFD_I_P_AI_D:\n\t\tcase ENC_PRFH_I_P_AI_S:\n\t\tcase ENC_PRFH_I_P_AI_D:\n\t\tcase ENC_PRFW_I_P_AI_S:\n\t\tcase ENC_PRFW_I_P_AI_D:\n\t\t\t// xxxxxxx|msz=xx|xx|imm5=xxxxx|xxx|Pg=xxx|Zn=xxxxx|x|prfop=xxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->prfop = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_AI_S:\n\t\tcase ENC_LD1B_Z_P_AI_D:\n\t\tcase ENC_LD1D_Z_P_AI_D:\n\t\tcase ENC_LD1H_Z_P_AI_S:\n\t\tcase ENC_LD1H_Z_P_AI_D:\n\t\tcase ENC_LD1SB_Z_P_AI_S:\n\t\tcase ENC_LD1SB_Z_P_AI_D:\n\t\tcase ENC_LD1SH_Z_P_AI_S:\n\t\tcase ENC_LD1SH_Z_P_AI_D:\n\t\tcase ENC_LD1SW_Z_P_AI_D:\n\t\tcase ENC_LD1W_Z_P_AI_S:\n\t\tcase ENC_LD1W_Z_P_AI_D:\n\t\tcase ENC_LDFF1B_Z_P_AI_S:\n\t\tcase ENC_LDFF1B_Z_P_AI_D:\n\t\tcase ENC_LDFF1D_Z_P_AI_D:\n\t\tcase ENC_LDFF1H_Z_P_AI_S:\n\t\tcase ENC_LDFF1H_Z_P_AI_D:\n\t\tcase ENC_LDFF1SB_Z_P_AI_S:\n\t\tcase ENC_LDFF1SB_Z_P_AI_D:\n\t\tcase ENC_LDFF1SH_Z_P_AI_S:\n\t\tcase ENC_LDFF1SH_Z_P_AI_D:\n\t\tcase ENC_LDFF1SW_Z_P_AI_D:\n\t\tcase ENC_LDFF1W_Z_P_AI_S:\n\t\tcase ENC_LDFF1W_Z_P_AI_D:\n\t\t\t// xxxxxxx|msz=xx|xx|imm5=xxxxx|x|U=x|ff=x|Pg=xxx|Zn=xxxxx|Zt=xxxxx\n\t\t\tctx->msz = (insword>>23)&3;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_B_ONLY_CONDBRANCH:\n\t\t\t// xxxxxxx|o1=x|imm19=xxxxxxxxxxxxxxxxxxx|o0=x|cond=xxxx\n\t\t\tctx->o1 = (insword>>24)&1;\n\t\t\tctx->imm19 = (insword>>5)&0x7ffff;\n\t\t\tctx->o0 = (insword>>4)&1;\n\t\t\tctx->cond = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_ST1D_Z_P_BR_:\n\t\t\t// xxxxxxx|opc<2:1>=xx|opc<0>=x|o2=x|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->opc = (insword>>23)&3;\n\t\t\tctx->opc = (insword>>22)&1;\n\t\t\tctx->o2 = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DRPS_64E_BRANCH_REG:\n\t\t\t// xxxxxxx|opc=xxxx|op2=xxxxx|op3=xxxxxx|Rt=xxxxx|op4=xxxxx\n\t\t\tctx->opc = (insword>>21)&15;\n\t\t\tctx->op2 = (insword>>16)&0x1f;\n\t\t\tctx->op3 = (insword>>10)&0x3f;\n\t\t\tctx->Rt = (insword>>5)&0x1f;\n\t\t\tctx->op4 = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED:\n\t\t\t// xxxxxxx|opc=xx|xs=x|x|Zm=xxxxx|x|U=x|ff=x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->opc = (insword>>23)&3;\n\t\t\tctx->xs = (insword>>22)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_SCALED:\n\t\t\t// xxxxxxx|opc=xx|xx|Zm=xxxxx|x|U=x|ff=x|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->opc = (insword>>23)&3;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->U = (insword>>14)&1;\n\t\t\tctx->ff = (insword>>13)&1;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ERET_64E_BRANCH_REG:\n\t\tcase ENC_ERETAA_64E_BRANCH_REG:\n\t\tcase ENC_ERETAB_64E_BRANCH_REG:\n\t\t\t// xxxxxxx|opc[3]=x|opc[2:0]=xxx|op2=xxxxx|op3[5:2]=xxxx|A=x|M=x|Rn=xxxxx|op4=xxxxx\n\t\t\tctx->opc = (insword>>24)&1;\n\t\t\tctx->opc = (insword>>21)&7;\n\t\t\tctx->op2 = (insword>>16)&0x1f;\n\t\t\tctx->op3 = (insword>>12)&15;\n\t\t\tctx->A = (insword>>11)&1;\n\t\t\tctx->M = (insword>>10)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->op4 = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ST1B_Z_P_BR_:\n\t\tcase ENC_ST1H_Z_P_BR_:\n\t\tcase ENC_ST1W_Z_P_BR_:\n\t\t\t// xxxxxxx|xx|size=xx|Rm=xxxxx|xxx|Pg=xxx|Rn=xxxxx|Zt=xxxxx\n\t\t\tctx->size = (insword>>21)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Pg = (insword>>10)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Zt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTZS_ASISDSHF_C:\n\t\tcase ENC_FCVTZU_ASISDSHF_C:\n\t\tcase ENC_SCVTF_ASISDSHF_C:\n\t\tcase ENC_SHL_ASISDSHF_R:\n\t\tcase ENC_SLI_ASISDSHF_R:\n\t\tcase ENC_SRI_ASISDSHF_R:\n\t\tcase ENC_UCVTF_ASISDSHF_C:\n\t\t\t// xx|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRSHRN_ASISDSHF_N:\n\t\tcase ENC_SQRSHRUN_ASISDSHF_N:\n\t\tcase ENC_SQSHRN_ASISDSHF_N:\n\t\tcase ENC_SQSHRUN_ASISDSHF_N:\n\t\tcase ENC_UQRSHRN_ASISDSHF_N:\n\t\tcase ENC_UQSHRN_ASISDSHF_N:\n\t\t\t// xx|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:1]=xxxx|op=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->op = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQSHLU_ASISDSHF_R:\n\t\tcase ENC_SQSHL_ASISDSHF_R:\n\t\tcase ENC_UQSHL_ASISDSHF_R:\n\t\t\t// xx|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:2]=xxx|op=x|opcode[0]=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->opcode = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SRSHR_ASISDSHF_R:\n\t\tcase ENC_SRSRA_ASISDSHF_R:\n\t\tcase ENC_SSHR_ASISDSHF_R:\n\t\tcase ENC_SSRA_ASISDSHF_R:\n\t\tcase ENC_URSHR_ASISDSHF_R:\n\t\tcase ENC_URSRA_ASISDSHF_R:\n\t\tcase ENC_USHR_ASISDSHF_R:\n\t\tcase ENC_USRA_ASISDSHF_R:\n\t\t\t// xx|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:3]=xx|o1=x|o0=x|opcode[0]=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->o1 = (insword>>13)&1;\n\t\t\tctx->o0 = (insword>>12)&1;\n\t\t\tctx->opcode = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FACGE_ASISDSAME_ONLY:\n\t\tcase ENC_FACGT_ASISDSAME_ONLY:\n\t\tcase ENC_FCMEQ_ASISDSAME_ONLY:\n\t\tcase ENC_FCMGE_ASISDSAME_ONLY:\n\t\tcase ENC_FCMGT_ASISDSAME_ONLY:\n\t\t\t// xx|U=x|xxxxx|E=x|sz=x|x|Rm=xxxxx|opcode[4:1]=xxxx|ac=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->E = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->ac = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FACGE_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FACGT_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMEQ_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGE_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGT_ASISDSAMEFP16_ONLY:\n\t\t\t// xx|U=x|xxxxx|E=x|xx|Rm=xxxxx|xx|opcode[2:1]=xx|ac=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->E = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->ac = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMLT_ASISDMISCFP16_FZ:\n\t\tcase ENC_FRECPX_ASISDMISCFP16_R:\n\t\tcase ENC_FRSQRTE_ASISDMISCFP16_R:\n\t\tcase ENC_SCVTF_ASISDMISCFP16_R:\n\t\tcase ENC_UCVTF_ASISDMISCFP16_R:\n\t\t\t// xx|U=x|xxxxx|a=x|xxxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMEQ_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMGE_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMGT_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMLE_ASISDMISCFP16_FZ:\n\t\t\t// xx|U=x|xxxxx|a=x|xxxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABD_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FMULX_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FRECPS_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FRSQRTS_ASISDSAMEFP16_ONLY:\n\t\t\t// xx|U=x|xxxxx|a=x|xx|Rm=xxxxx|xx|opcode=xxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_SD:\n\t\t\t// xx|U=x|xxxxx|o1=x|sz=x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTMS_ASISDMISC_R:\n\t\tcase ENC_FCVTMU_ASISDMISC_R:\n\t\tcase ENC_FCVTNS_ASISDMISC_R:\n\t\tcase ENC_FCVTNU_ASISDMISC_R:\n\t\tcase ENC_FCVTPS_ASISDMISC_R:\n\t\tcase ENC_FCVTPU_ASISDMISC_R:\n\t\tcase ENC_FCVTZS_ASISDMISC_R:\n\t\tcase ENC_FCVTZU_ASISDMISC_R:\n\t\t\t// xx|U=x|xxxxx|o2=x|sz=x|xxxxx|opcode[4:1]=xxxx|o1=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->o1 = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTMS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTMU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTNS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTNU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTPS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTPU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTZS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTZU_ASISDMISCFP16_R:\n\t\t\t// xx|U=x|xxxxx|o2=x|xxxxxx|opcode[4:1]=xxxx|o1=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->o1 = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMULX_ASISDELEM_RH_H:\n\t\tcase ENC_FMUL_ASISDELEM_RH_H:\n\t\tcase ENC_SQDMULL_ASISDELEM_L:\n\t\t\t// xx|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode=xxxx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_ASISDELEM_R:\n\t\tcase ENC_SQRDMULH_ASISDELEM_R:\n\t\t\t// xx|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=xxx|op=x|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRDMLAH_ASISDELEM_R:\n\t\tcase ENC_SQRDMLSH_ASISDELEM_R:\n\t\t\t// xx|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=xx|S=x|opcode[0]=x|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->S = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_ASISDELEM_RH_H:\n\t\tcase ENC_FMLS_ASISDELEM_RH_H:\n\t\tcase ENC_SQDMLAL_ASISDELEM_L:\n\t\tcase ENC_SQDMLSL_ASISDELEM_L:\n\t\t\t// xx|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=x|o2=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ABS_ASISDMISC_R:\n\t\tcase ENC_ADDP_ASISDPAIR_ONLY:\n\t\tcase ENC_CMLT_ASISDMISC_Z:\n\t\tcase ENC_NEG_ASISDMISC_R:\n\t\tcase ENC_SQABS_ASISDMISC_R:\n\t\tcase ENC_SQNEG_ASISDMISC_R:\n\t\tcase ENC_SQXTN_ASISDMISC_N:\n\t\tcase ENC_SQXTUN_ASISDMISC_N:\n\t\tcase ENC_SUQADD_ASISDMISC_R:\n\t\tcase ENC_UQXTN_ASISDMISC_N:\n\t\tcase ENC_USQADD_ASISDMISC_R:\n\t\t\t// xx|U=x|xxxxx|size=xx|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMEQ_ASISDMISC_Z:\n\t\tcase ENC_CMGE_ASISDMISC_Z:\n\t\tcase ENC_CMGT_ASISDMISC_Z:\n\t\tcase ENC_CMLE_ASISDMISC_Z:\n\t\t\t// xx|U=x|xxxxx|size=xx|xxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADD_ASISDSAME_ONLY:\n\t\tcase ENC_CMEQ_ASISDSAME_ONLY:\n\t\tcase ENC_CMTST_ASISDSAME_ONLY:\n\t\tcase ENC_SQADD_ASISDSAME_ONLY:\n\t\tcase ENC_SQDMULH_ASISDSAME_ONLY:\n\t\tcase ENC_SQRDMULH_ASISDSAME_ONLY:\n\t\tcase ENC_SQSUB_ASISDSAME_ONLY:\n\t\tcase ENC_SUB_ASISDSAME_ONLY:\n\t\tcase ENC_UQADD_ASISDSAME_ONLY:\n\t\tcase ENC_UQSUB_ASISDSAME_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULL_ASISDDIFF_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode=xxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMLAL_ASISDDIFF_ONLY:\n\t\tcase ENC_SQDMLSL_ASISDDIFF_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[3:2]=xx|o1=x|opcode[0]=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->o1 = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMGE_ASISDSAME_ONLY:\n\t\tcase ENC_CMGT_ASISDSAME_ONLY:\n\t\tcase ENC_CMHI_ASISDSAME_ONLY:\n\t\tcase ENC_CMHS_ASISDSAME_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:1]=xxxx|eq=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->eq = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SQSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SSHL_ASISDSAME_ONLY:\n\t\tcase ENC_UQRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_UQSHL_ASISDSAME_ONLY:\n\t\tcase ENC_URSHL_ASISDSAME_ONLY:\n\t\tcase ENC_USHL_ASISDSAME_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:2]=xxx|R=x|S=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->R = (insword>>12)&1;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRDMLAH_ASISDSAME2_ONLY:\n\t\tcase ENC_SQRDMLSH_ASISDSAME2_ONLY:\n\t\t\t// xx|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|opcode[3:1]=xxx|S=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&7;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMULX_ASISDELEM_R_SD:\n\t\tcase ENC_FMUL_ASISDELEM_R_SD:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|sz=x|L=x|M=x|Rm=xxxx|opcode=xxxx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_ASISDELEM_R_SD:\n\t\tcase ENC_FMLS_ASISDELEM_R_SD:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=x|o2=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FCMLT_ASISDMISC_FZ:\n\t\tcase ENC_FCVTAS_ASISDMISC_R:\n\t\tcase ENC_FCVTAU_ASISDMISC_R:\n\t\tcase ENC_FCVTXN_ASISDMISC_N:\n\t\tcase ENC_FRECPE_ASISDMISC_R:\n\t\tcase ENC_FRECPX_ASISDMISC_R:\n\t\tcase ENC_FRSQRTE_ASISDMISC_R:\n\t\tcase ENC_SCVTF_ASISDMISC_R:\n\t\tcase ENC_UCVTF_ASISDMISC_R:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|sz=x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMEQ_ASISDMISC_FZ:\n\t\tcase ENC_FCMGE_ASISDMISC_FZ:\n\t\tcase ENC_FCMGT_ASISDMISC_FZ:\n\t\tcase ENC_FCMLE_ASISDMISC_FZ:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|sz=x|xxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABD_ASISDSAME_ONLY:\n\t\tcase ENC_FMULX_ASISDSAME_ONLY:\n\t\tcase ENC_FRECPS_ASISDSAME_ONLY:\n\t\tcase ENC_FRSQRTS_ASISDSAME_ONLY:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|sz=x|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTAS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTAU_ASISDMISCFP16_R:\n\t\tcase ENC_FRECPE_ASISDMISCFP16_R:\n\t\t\t// xx|U=x|xxxxx|size[1]=x|xxxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DUP_ASISDONE_ONLY:\n\t\tcase ENC_MOV_DUP_ASISDONE_ONLY:\n\t\t\t// xx|op=x|xxxxxxxx|imm5=xxxxx|x|imm4=xxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->op = (insword>>29)&1;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->imm4 = (insword>>11)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_64:\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_64:\n\t\t\t// xx|xxxxxxxxx|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=x|x|ZAda=xxx\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->S = (insword>>4)&1;\n\t\t\tctx->ZAda = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_BFMOPA_ZA32_PP_ZZ_:\n\t\tcase ENC_BFMOPS_ZA32_PP_ZZ_:\n\t\tcase ENC_FMOPA_ZA32_PP_ZZ_16:\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_FMOPS_ZA32_PP_ZZ_16:\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_32:\n\t\t\t// xx|xxxxxxxxx|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=x|x|x|ZAda=xx\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->S = (insword>>4)&1;\n\t\t\tctx->ZAda = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_ADDHA_ZA_PP_Z_64:\n\t\tcase ENC_ADDVA_ZA_PP_Z_64:\n\t\t\t// xx|xxxxxxx|op=x|xxxxx|V=x|Pm=xxx|Pn=xxx|Zn=xxxxx|x|x|ZAda=xxx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->V = (insword>>16)&1;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAda = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_ADDHA_ZA_PP_Z_32:\n\t\tcase ENC_ADDVA_ZA_PP_Z_32:\n\t\t\t// xx|xxxxxxx|op=x|xx|xxx|V=x|Pm=xxx|Pn=xxx|Zn=xxxxx|x|x|x|ZAda=xx\n\t\t\tctx->op = (insword>>22)&1;\n\t\t\tctx->V = (insword>>16)&1;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->ZAda = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_PTEST_P_P_:\n\t\t\t// xx|xxxxxx|op=x|S=x|xx|xxxxxx|Pg=xxxx|x|Pn=xxxx|x|opc2=xxxx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->S = (insword>>22)&1;\n\t\t\tctx->Pg = (insword>>10)&15;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tctx->opc2 = insword&15;\n\t\t\tbreak;\n\t\tcase ENC_CTERMEQ_RR_:\n\t\tcase ENC_CTERMNE_RR_:\n\t\t\t// xx|xxxxxx|op=x|sz=x|x|Rm=xxxxx|xxxxxx|Rn=xxxxx|ne=x|x|x|xx\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->ne = (insword>>4)&1;\n\t\t\tbreak;\n\t\tcase ENC_SETFFR_F_:\n\t\t\t// xx|xxxxxx|opc=xx|xx|xxxxxxxxxx|xxxxxx|x|x|xx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tbreak;\n\t\tcase ENC_WRFFR_F_P_:\n\t\t\t// xx|xxxxxx|opc=xx|xx|xxxxxxxxxx|x|Pn=xxxx|x|x|x|xx\n\t\t\tctx->opc = (insword>>22)&3;\n\t\t\tctx->Pn = (insword>>5)&15;\n\t\t\tbreak;\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_64:\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_64:\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_64:\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_64:\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_64:\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_64:\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_64:\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_64:\n\t\t\t// xx|xxxxx|u0=x|xx|u1=x|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=x|x|ZAda=xxx\n\t\t\tctx->u0 = (insword>>24)&1;\n\t\t\tctx->u1 = (insword>>21)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->S = (insword>>4)&1;\n\t\t\tctx->ZAda = insword&7;\n\t\t\tbreak;\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_32:\n\t\t\t// xx|xxxxx|u0=x|xx|u1=x|Zm=xxxxx|Pm=xxx|Pn=xxx|Zn=xxxxx|S=x|x|x|ZAda=xx\n\t\t\tctx->u0 = (insword>>24)&1;\n\t\t\tctx->u1 = (insword>>21)&1;\n\t\t\tctx->Zm = (insword>>16)&0x1f;\n\t\t\tctx->Pm = (insword>>13)&7;\n\t\t\tctx->Pn = (insword>>10)&7;\n\t\t\tctx->Zn = (insword>>5)&0x1f;\n\t\t\tctx->S = (insword>>4)&1;\n\t\t\tctx->ZAda = insword&3;\n\t\t\tbreak;\n\t\tcase ENC_FCVTZS_ASIMDSHF_C:\n\t\tcase ENC_FCVTZU_ASIMDSHF_C:\n\t\tcase ENC_SCVTF_ASIMDSHF_C:\n\t\tcase ENC_SHL_ASIMDSHF_R:\n\t\tcase ENC_SLI_ASIMDSHF_R:\n\t\tcase ENC_SRI_ASIMDSHF_R:\n\t\tcase ENC_SSHLL_ASIMDSHF_L:\n\t\tcase ENC_SXTL_SSHLL_ASIMDSHF_L:\n\t\tcase ENC_UCVTF_ASIMDSHF_C:\n\t\tcase ENC_USHLL_ASIMDSHF_L:\n\t\tcase ENC_UXTL_USHLL_ASIMDSHF_L:\n\t\t\t// x|Q=x|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_RSHRN_ASIMDSHF_N:\n\t\tcase ENC_SHRN_ASIMDSHF_N:\n\t\tcase ENC_SQRSHRN_ASIMDSHF_N:\n\t\tcase ENC_SQRSHRUN_ASIMDSHF_N:\n\t\tcase ENC_SQSHRN_ASIMDSHF_N:\n\t\tcase ENC_SQSHRUN_ASIMDSHF_N:\n\t\tcase ENC_UQRSHRN_ASIMDSHF_N:\n\t\tcase ENC_UQSHRN_ASIMDSHF_N:\n\t\t\t// x|Q=x|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:1]=xxxx|op=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->op = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQSHLU_ASIMDSHF_R:\n\t\tcase ENC_SQSHL_ASIMDSHF_R:\n\t\tcase ENC_UQSHL_ASIMDSHF_R:\n\t\t\t// x|Q=x|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:2]=xxx|op=x|opcode[0]=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->opcode = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SRSHR_ASIMDSHF_R:\n\t\tcase ENC_SRSRA_ASIMDSHF_R:\n\t\tcase ENC_SSHR_ASIMDSHF_R:\n\t\tcase ENC_SSRA_ASIMDSHF_R:\n\t\tcase ENC_URSHR_ASIMDSHF_R:\n\t\tcase ENC_URSRA_ASIMDSHF_R:\n\t\tcase ENC_USHR_ASIMDSHF_R:\n\t\tcase ENC_USRA_ASIMDSHF_R:\n\t\t\t// x|Q=x|U=x|xxxxxx|immh=xxxx|immb=xxx|opcode[4:3]=xx|o1=x|o0=x|opcode[0]=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->immh = (insword>>19)&15;\n\t\t\tctx->immb = (insword>>16)&7;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->o1 = (insword>>13)&1;\n\t\t\tctx->o0 = (insword>>12)&1;\n\t\t\tctx->opcode = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FACGE_ASIMDSAME_ONLY:\n\t\tcase ENC_FACGT_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMEQ_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMGE_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMGT_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|E=x|sz=x|x|Rm=xxxxx|opcode[4:1]=xxxx|ac=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->E = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->ac = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FACGE_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FACGT_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMEQ_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGE_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGT_ASIMDSAMEFP16_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|E=x|xx|Rm=xxxxx|xx|opcode[2:1]=xx|ac=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->E = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->ac = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLAL_ASIMDSAME_F:\n\t\tcase ENC_FMLAL2_ASIMDSAME_F:\n\t\tcase ENC_FMLSL_ASIMDSAME_F:\n\t\tcase ENC_FMLSL2_ASIMDSAME_F:\n\t\t\t// x|Q=x|U=x|xxxxx|S=x|sz=x|x|Rm=xxxxx|opcode[4]=x|opcode[3:0]=xxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->S = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>11)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SUDOT_ASIMDELEM_D:\n\t\tcase ENC_USDOT_ASIMDELEM_D:\n\t\t\t// x|Q=x|U=x|xxxxx|US=x|x|L=x|M=x|Rm=xxxx|opcode=xxxx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->US = (insword>>23)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCMLT_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCVTAS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTAU_ASIMDMISCFP16_R:\n\t\tcase ENC_FNEG_ASIMDMISCFP16_R:\n\t\tcase ENC_FRECPE_ASIMDMISCFP16_R:\n\t\tcase ENC_FRSQRTE_ASIMDMISCFP16_R:\n\t\tcase ENC_FSQRT_ASIMDMISCFP16_R:\n\t\tcase ENC_SCVTF_ASIMDMISCFP16_R:\n\t\tcase ENC_UCVTF_ASIMDMISCFP16_R:\n\t\t\t// x|Q=x|U=x|xxxxx|a=x|xxxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMEQ_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMGE_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMGT_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMLE_ASIMDMISCFP16_FZ:\n\t\t\t// x|Q=x|U=x|xxxxx|a=x|xxxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNMP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAXNM_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINNMP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINNM_ASIMDSAMEFP16_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|a=x|xx|Rm=xxxxx|xx|Op3=xxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->Op3 = (insword>>11)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABD_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FADDP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FADD_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FDIV_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMLA_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMLS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMULX_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMUL_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FRECPS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FRSQRTS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FSUB_ASIMDSAMEFP16_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|a=x|xx|Rm=xxxxx|xx|opcode=xxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->a = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_H:\n\t\t\t// x|Q=x|U=x|xxxxx|o1=x|size[0]=x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->size = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_SD:\n\t\t\t// x|Q=x|U=x|xxxxx|o1=x|sz=x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXNMP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAXNM_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINNMP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINNM_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMIN_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|o1=x|sz=x|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAX_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMIN_ASIMDSAMEFP16_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|o1=x|xx|Rm=xxxxx|xx|opcode=xxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&7;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_H:\n\t\t\t// x|Q=x|U=x|xxxxx|o1=x|x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o1 = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTMS_ASIMDMISC_R:\n\t\tcase ENC_FCVTMU_ASIMDMISC_R:\n\t\tcase ENC_FCVTNS_ASIMDMISC_R:\n\t\tcase ENC_FCVTNU_ASIMDMISC_R:\n\t\tcase ENC_FCVTPS_ASIMDMISC_R:\n\t\tcase ENC_FCVTPU_ASIMDMISC_R:\n\t\tcase ENC_FCVTZS_ASIMDMISC_R:\n\t\tcase ENC_FCVTZU_ASIMDMISC_R:\n\t\tcase ENC_FRINTA_ASIMDMISC_R:\n\t\tcase ENC_FRINTI_ASIMDMISC_R:\n\t\tcase ENC_FRINTM_ASIMDMISC_R:\n\t\tcase ENC_FRINTN_ASIMDMISC_R:\n\t\tcase ENC_FRINTP_ASIMDMISC_R:\n\t\tcase ENC_FRINTX_ASIMDMISC_R:\n\t\tcase ENC_FRINTZ_ASIMDMISC_R:\n\t\t\t// x|Q=x|U=x|xxxxx|o2=x|sz=x|xxxxx|opcode[4:1]=xxxx|o1=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->o1 = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCVTMS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTMU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTNS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTNU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTPS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTPU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTZS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTZU_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTA_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTI_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTM_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTN_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTP_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTX_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTZ_ASIMDMISCFP16_R:\n\t\t\t// x|Q=x|U=x|xxxxx|o2=x|xxxxxx|opcode[4:1]=xxxx|o1=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->o1 = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_ASIMDSAME_ONLY:\n\t\tcase ENC_FMLS_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|op=x|sz=x|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->op = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BIF_ASIMDSAME_ONLY:\n\t\tcase ENC_BIT_ASIMDSAME_ONLY:\n\t\tcase ENC_BSL_ASIMDSAME_ONLY:\n\t\tcase ENC_EOR_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|opc2=xx|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->opc2 = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFDOT_ASIMDELEM_E:\n\t\tcase ENC_FMULX_ASIMDELEM_RH_H:\n\t\tcase ENC_FMUL_ASIMDELEM_RH_H:\n\t\tcase ENC_MUL_ASIMDELEM_R:\n\t\tcase ENC_SDOT_ASIMDELEM_D:\n\t\tcase ENC_SMULL_ASIMDELEM_L:\n\t\tcase ENC_SQDMULL_ASIMDELEM_L:\n\t\tcase ENC_UDOT_ASIMDELEM_D:\n\t\tcase ENC_UMULL_ASIMDELEM_L:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode=xxxx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQDMULH_ASIMDELEM_R:\n\t\tcase ENC_SQRDMULH_ASIMDELEM_R:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3:1]=xxx|op=x|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRDMLAH_ASIMDELEM_R:\n\t\tcase ENC_SQRDMLSH_ASIMDELEM_R:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3:2]=xx|S=x|opcode[0]=x|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->S = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_ASIMDELEM_RH_H:\n\t\tcase ENC_FMLS_ASIMDELEM_RH_H:\n\t\tcase ENC_MLA_ASIMDELEM_R:\n\t\tcase ENC_MLS_ASIMDELEM_R:\n\t\tcase ENC_SMLAL_ASIMDELEM_L:\n\t\tcase ENC_SMLSL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLAL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLSL_ASIMDELEM_L:\n\t\tcase ENC_UMLAL_ASIMDELEM_L:\n\t\tcase ENC_UMLSL_ASIMDELEM_L:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=x|o2=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFMLAL_ASIMDELEM_F:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=x|opcode[2]=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMLA_ASIMDELEM_C_H:\n\t\tcase ENC_FCMLA_ASIMDELEM_C_S:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|L=x|M=x|Rm=xxxx|opcode[3]=x|rot=xx|opcode[0]=x|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->rot = (insword>>13)&3;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMAXV_ASIMDALL_ONLY:\n\t\tcase ENC_SMINV_ASIMDALL_ONLY:\n\t\tcase ENC_UMAXV_ASIMDALL_ONLY:\n\t\tcase ENC_UMINV_ASIMDALL_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|xxxxx|op=x|opcode[3:0]=xxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->op = (insword>>16)&1;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ABS_ASIMDMISC_R:\n\t\tcase ENC_ADDV_ASIMDALL_ONLY:\n\t\tcase ENC_BFCVTN_ASIMDMISC_4S:\n\t\tcase ENC_CLS_ASIMDMISC_R:\n\t\tcase ENC_CLZ_ASIMDMISC_R:\n\t\tcase ENC_CMLT_ASIMDMISC_Z:\n\t\tcase ENC_CNT_ASIMDMISC_R:\n\t\tcase ENC_MVN_NOT_ASIMDMISC_R:\n\t\tcase ENC_NEG_ASIMDMISC_R:\n\t\tcase ENC_NOT_ASIMDMISC_R:\n\t\tcase ENC_RBIT_ASIMDMISC_R:\n\t\tcase ENC_SADDLV_ASIMDALL_ONLY:\n\t\tcase ENC_SHLL_ASIMDMISC_S:\n\t\tcase ENC_SQABS_ASIMDMISC_R:\n\t\tcase ENC_SQNEG_ASIMDMISC_R:\n\t\tcase ENC_SQXTN_ASIMDMISC_N:\n\t\tcase ENC_SQXTUN_ASIMDMISC_N:\n\t\tcase ENC_SUQADD_ASIMDMISC_R:\n\t\tcase ENC_UADDLV_ASIMDALL_ONLY:\n\t\tcase ENC_UQXTN_ASIMDMISC_N:\n\t\tcase ENC_USQADD_ASIMDMISC_R:\n\t\tcase ENC_XTN_ASIMDMISC_N:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_REV16_ASIMDMISC_R:\n\t\tcase ENC_REV32_ASIMDMISC_R:\n\t\tcase ENC_REV64_ASIMDMISC_R:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|xxxxx|opcode[4:1]=xxxx|o0=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->o0 = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMEQ_ASIMDMISC_Z:\n\t\tcase ENC_CMGE_ASIMDMISC_Z:\n\t\tcase ENC_CMGT_ASIMDMISC_Z:\n\t\tcase ENC_CMLE_ASIMDMISC_Z:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|xxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SADALP_ASIMDMISC_P:\n\t\tcase ENC_SADDLP_ASIMDMISC_P:\n\t\tcase ENC_UADALP_ASIMDMISC_P:\n\t\tcase ENC_UADDLP_ASIMDMISC_P:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|xxxxx|opcode[4:3]=xx|op=x|opcode[1:0]=xx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->opcode = (insword>>15)&3;\n\t\t\tctx->op = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDP_ASIMDSAME_ONLY:\n\t\tcase ENC_ADD_ASIMDSAME_ONLY:\n\t\tcase ENC_AND_ASIMDSAME_ONLY:\n\t\tcase ENC_BIC_ASIMDSAME_ONLY:\n\t\tcase ENC_CMEQ_ASIMDSAME_ONLY:\n\t\tcase ENC_CMTST_ASIMDSAME_ONLY:\n\t\tcase ENC_MLA_ASIMDSAME_ONLY:\n\t\tcase ENC_MLS_ASIMDSAME_ONLY:\n\t\tcase ENC_MOV_ORR_ASIMDSAME_ONLY:\n\t\tcase ENC_MUL_ASIMDSAME_ONLY:\n\t\tcase ENC_ORN_ASIMDSAME_ONLY:\n\t\tcase ENC_ORR_ASIMDSAME_ONLY:\n\t\tcase ENC_PMUL_ASIMDSAME_ONLY:\n\t\tcase ENC_SHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SHSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_SQADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SQDMULH_ASIMDSAME_ONLY:\n\t\tcase ENC_SQRDMULH_ASIMDSAME_ONLY:\n\t\tcase ENC_SQSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_SRHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SUB_ASIMDSAME_ONLY:\n\t\tcase ENC_UHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_UHSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_UQADD_ASIMDSAME_ONLY:\n\t\tcase ENC_UQSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_URHADD_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_PMULL_ASIMDDIFF_L:\n\t\tcase ENC_SQDMULL_ASIMDDIFF_L:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode=xxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_ADDHN_ASIMDDIFF_N:\n\t\tcase ENC_RADDHN_ASIMDDIFF_N:\n\t\tcase ENC_RSUBHN_ASIMDDIFF_N:\n\t\tcase ENC_SADDL_ASIMDDIFF_L:\n\t\tcase ENC_SADDW_ASIMDDIFF_W:\n\t\tcase ENC_SMLAL_ASIMDDIFF_L:\n\t\tcase ENC_SMLSL_ASIMDDIFF_L:\n\t\tcase ENC_SQDMLAL_ASIMDDIFF_L:\n\t\tcase ENC_SQDMLSL_ASIMDDIFF_L:\n\t\tcase ENC_SSUBL_ASIMDDIFF_L:\n\t\tcase ENC_SSUBW_ASIMDDIFF_W:\n\t\tcase ENC_SUBHN_ASIMDDIFF_N:\n\t\tcase ENC_UADDL_ASIMDDIFF_L:\n\t\tcase ENC_UADDW_ASIMDDIFF_W:\n\t\tcase ENC_UMLAL_ASIMDDIFF_L:\n\t\tcase ENC_UMLSL_ASIMDDIFF_L:\n\t\tcase ENC_USUBL_ASIMDDIFF_L:\n\t\tcase ENC_USUBW_ASIMDDIFF_W:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[3:2]=xx|o1=x|opcode[0]=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->o1 = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SABAL_ASIMDDIFF_L:\n\t\tcase ENC_SABDL_ASIMDDIFF_L:\n\t\tcase ENC_UABAL_ASIMDDIFF_L:\n\t\tcase ENC_UABDL_ASIMDDIFF_L:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[3:2]=xx|op=x|opcode[0]=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>14)&3;\n\t\t\tctx->op = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMULL_ASIMDDIFF_L:\n\t\tcase ENC_UMULL_ASIMDDIFF_L:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[3]=x|opcode[2]=x|opcode[1]=x|opcode[0]=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->opcode = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>13)&1;\n\t\t\tctx->opcode = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SABA_ASIMDSAME_ONLY:\n\t\tcase ENC_SABD_ASIMDSAME_ONLY:\n\t\tcase ENC_UABA_ASIMDSAME_ONLY:\n\t\tcase ENC_UABD_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:1]=xxxx|ac=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->ac = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CMGE_ASIMDSAME_ONLY:\n\t\tcase ENC_CMGT_ASIMDSAME_ONLY:\n\t\tcase ENC_CMHI_ASIMDSAME_ONLY:\n\t\tcase ENC_CMHS_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:1]=xxxx|eq=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->eq = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_SMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_SMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_SMIN_ASIMDSAME_ONLY:\n\t\tcase ENC_UMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_UMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_UMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_UMIN_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:1]=xxxx|o1=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->o1 = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SQSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_UQRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_UQSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_URSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_USHL_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|opcode[4:2]=xxx|R=x|S=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->R = (insword>>12)&1;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFMLAL_ASIMDSAME2_F_:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|opcode<3:2>=xx|opcode=xx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&3;\n\t\t\tctx->opcode = (insword>>11)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BFDOT_ASIMDSAME2_D:\n\t\tcase ENC_BFMMLA_ASIMDSAME2_E:\n\t\tcase ENC_SDOT_ASIMDSAME2_D:\n\t\tcase ENC_UDOT_ASIMDSAME2_D:\n\t\tcase ENC_USDOT_ASIMDSAME2_D:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|opcode=xxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SQRDMLAH_ASIMDSAME2_ONLY:\n\t\tcase ENC_SQRDMLSH_ASIMDSAME2_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|opcode[3:1]=xxx|S=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&7;\n\t\t\tctx->S = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_SMMLA_ASIMDSAME2_G:\n\t\tcase ENC_UMMLA_ASIMDSAME2_G:\n\t\tcase ENC_USMMLA_ASIMDSAME2_G:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|xxx|B=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->B = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMLA_ASIMDSAME2_C:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|xx|rot=xx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->rot = (insword>>11)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCADD_ASIMDSAME2_C:\n\t\t\t// x|Q=x|U=x|xxxxx|size=xx|x|Rm=xxxxx|x|xx|rot=x|x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->rot = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMULX_ASIMDELEM_R_SD:\n\t\tcase ENC_FMUL_ASIMDELEM_R_SD:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|L=x|M=x|Rm=xxxx|opcode=xxxx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLAL_ASIMDELEM_LH:\n\t\tcase ENC_FMLAL2_ASIMDELEM_LH:\n\t\tcase ENC_FMLSL_ASIMDELEM_LH:\n\t\tcase ENC_FMLSL2_ASIMDELEM_LH:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=x|S=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->S = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FMLA_ASIMDELEM_R_SD:\n\t\tcase ENC_FMLS_ASIMDELEM_R_SD:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|L=x|M=x|Rm=xxxx|opcode[3]=x|o2=x|opcode[1:0]=xx|H=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->L = (insword>>21)&1;\n\t\t\tctx->M = (insword>>20)&1;\n\t\t\tctx->Rm = (insword>>16)&15;\n\t\t\tctx->opcode = (insword>>15)&1;\n\t\t\tctx->o2 = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->H = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABS_ASIMDMISC_R:\n\t\tcase ENC_FCMLT_ASIMDMISC_FZ:\n\t\tcase ENC_FCVTAS_ASIMDMISC_R:\n\t\tcase ENC_FCVTAU_ASIMDMISC_R:\n\t\tcase ENC_FCVTL_ASIMDMISC_L:\n\t\tcase ENC_FCVTN_ASIMDMISC_N:\n\t\tcase ENC_FCVTXN_ASIMDMISC_N:\n\t\tcase ENC_FNEG_ASIMDMISC_R:\n\t\tcase ENC_FRECPE_ASIMDMISC_R:\n\t\tcase ENC_FRSQRTE_ASIMDMISC_R:\n\t\tcase ENC_FSQRT_ASIMDMISC_R:\n\t\tcase ENC_SCVTF_ASIMDMISC_R:\n\t\tcase ENC_UCVTF_ASIMDMISC_R:\n\t\tcase ENC_URECPE_ASIMDMISC_R:\n\t\tcase ENC_URSQRTE_ASIMDMISC_R:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|xxxxx|opcode=xxxxx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FCMEQ_ASIMDMISC_FZ:\n\t\tcase ENC_FCMGE_ASIMDMISC_FZ:\n\t\tcase ENC_FCMGT_ASIMDMISC_FZ:\n\t\tcase ENC_FCMLE_ASIMDMISC_FZ:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|xxxxx|opcode[4:1]=xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>13)&15;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FABD_ASIMDSAME_ONLY:\n\t\tcase ENC_FADDP_ASIMDSAME_ONLY:\n\t\tcase ENC_FADD_ASIMDSAME_ONLY:\n\t\tcase ENC_FDIV_ASIMDSAME_ONLY:\n\t\tcase ENC_FMULX_ASIMDSAME_ONLY:\n\t\tcase ENC_FMUL_ASIMDSAME_ONLY:\n\t\tcase ENC_FRECPS_ASIMDSAME_ONLY:\n\t\tcase ENC_FRSQRTS_ASIMDSAME_ONLY:\n\t\tcase ENC_FSUB_ASIMDSAME_ONLY:\n\t\t\t// x|Q=x|U=x|xxxxx|size[1]=x|sz=x|x|Rm=xxxxx|opcode=xxxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->size = (insword>>23)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>11)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_FRINT32X_ASIMDMISC_R:\n\t\tcase ENC_FRINT32Z_ASIMDMISC_R:\n\t\tcase ENC_FRINT64X_ASIMDMISC_R:\n\t\tcase ENC_FRINT64Z_ASIMDMISC_R:\n\t\t\t// x|Q=x|U=x|xxxxx|x|sz=x|xxxxx|xxxx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->U = (insword>>29)&1;\n\t\t\tctx->sz = (insword>>22)&1;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_BIC_ASIMDIMM_L_HL:\n\t\tcase ENC_BIC_ASIMDIMM_L_SL:\n\t\tcase ENC_FMOV_ASIMDIMM_H_H:\n\t\tcase ENC_FMOV_ASIMDIMM_S_S:\n\t\tcase ENC_FMOV_ASIMDIMM_D2_D:\n\t\tcase ENC_MOVI_ASIMDIMM_N_B:\n\t\tcase ENC_MOVI_ASIMDIMM_L_HL:\n\t\tcase ENC_MOVI_ASIMDIMM_L_SL:\n\t\tcase ENC_MOVI_ASIMDIMM_M_SM:\n\t\tcase ENC_MOVI_ASIMDIMM_D_DS:\n\t\tcase ENC_MOVI_ASIMDIMM_D2_D:\n\t\tcase ENC_MVNI_ASIMDIMM_L_HL:\n\t\tcase ENC_MVNI_ASIMDIMM_L_SL:\n\t\tcase ENC_MVNI_ASIMDIMM_M_SM:\n\t\tcase ENC_ORR_ASIMDIMM_L_HL:\n\t\tcase ENC_ORR_ASIMDIMM_L_SL:\n\t\t\t// x|Q=x|op=x|xxxxxxxxxx|a=x|b=x|c=x|cmode=xxxx|o2=x|x|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->op = (insword>>29)&1;\n\t\t\tctx->a = (insword>>18)&1;\n\t\t\tctx->b = (insword>>17)&1;\n\t\t\tctx->c = (insword>>16)&1;\n\t\t\tctx->cmode = (insword>>12)&15;\n\t\t\tctx->o2 = (insword>>11)&1;\n\t\t\tctx->d = (insword>>9)&1;\n\t\t\tctx->e = (insword>>8)&1;\n\t\t\tctx->f = (insword>>7)&1;\n\t\t\tctx->g = (insword>>6)&1;\n\t\t\tctx->h = (insword>>5)&1;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_DUP_ASIMDINS_DV_V:\n\t\tcase ENC_DUP_ASIMDINS_DR_R:\n\t\tcase ENC_INS_ASIMDINS_IV_V:\n\t\tcase ENC_INS_ASIMDINS_IR_R:\n\t\tcase ENC_MOV_INS_ASIMDINS_IV_V:\n\t\tcase ENC_MOV_INS_ASIMDINS_IR_R:\n\t\t\t// x|Q=x|op=x|xxxxxxxx|imm5=xxxxx|x|imm4=xxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->op = (insword>>29)&1;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->imm4 = (insword>>11)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_MOV_UMOV_ASIMDINS_W_W:\n\t\tcase ENC_MOV_UMOV_ASIMDINS_X_X:\n\t\tcase ENC_SMOV_ASIMDINS_W_W:\n\t\tcase ENC_SMOV_ASIMDINS_X_X:\n\t\tcase ENC_UMOV_ASIMDINS_W_W:\n\t\tcase ENC_UMOV_ASIMDINS_X_X:\n\t\t\t// x|Q=x|op=x|xxxxxxxx|imm5=xxxxx|x|imm4[3:2]=xx|imm4[1]=x|imm4[0]=x|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->op = (insword>>29)&1;\n\t\t\tctx->imm5 = (insword>>16)&0x1f;\n\t\t\tctx->imm4 = (insword>>13)&3;\n\t\t\tctx->imm4 = (insword>>12)&1;\n\t\t\tctx->imm4 = (insword>>11)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1R_ASISDLSOP_R1_I:\n\t\tcase ENC_LD1R_ASISDLSOP_RX1_R:\n\t\tcase ENC_LD1_ASISDLSOP_B1_I1B:\n\t\tcase ENC_LD1_ASISDLSOP_BX1_R1B:\n\t\tcase ENC_LD1_ASISDLSOP_H1_I1H:\n\t\tcase ENC_LD1_ASISDLSOP_HX1_R1H:\n\t\tcase ENC_LD1_ASISDLSOP_S1_I1S:\n\t\tcase ENC_LD1_ASISDLSOP_SX1_R1S:\n\t\tcase ENC_LD1_ASISDLSOP_D1_I1D:\n\t\tcase ENC_LD1_ASISDLSOP_DX1_R1D:\n\t\tcase ENC_LD2R_ASISDLSOP_R2_I:\n\t\tcase ENC_LD2R_ASISDLSOP_RX2_R:\n\t\tcase ENC_LD2_ASISDLSOP_B2_I2B:\n\t\tcase ENC_LD2_ASISDLSOP_BX2_R2B:\n\t\tcase ENC_LD2_ASISDLSOP_H2_I2H:\n\t\tcase ENC_LD2_ASISDLSOP_HX2_R2H:\n\t\tcase ENC_LD2_ASISDLSOP_S2_I2S:\n\t\tcase ENC_LD2_ASISDLSOP_SX2_R2S:\n\t\tcase ENC_LD2_ASISDLSOP_D2_I2D:\n\t\tcase ENC_LD2_ASISDLSOP_DX2_R2D:\n\t\tcase ENC_LD3R_ASISDLSOP_R3_I:\n\t\tcase ENC_LD3R_ASISDLSOP_RX3_R:\n\t\tcase ENC_LD3_ASISDLSOP_B3_I3B:\n\t\tcase ENC_LD3_ASISDLSOP_BX3_R3B:\n\t\tcase ENC_LD3_ASISDLSOP_H3_I3H:\n\t\tcase ENC_LD3_ASISDLSOP_HX3_R3H:\n\t\tcase ENC_LD3_ASISDLSOP_S3_I3S:\n\t\tcase ENC_LD3_ASISDLSOP_SX3_R3S:\n\t\tcase ENC_LD3_ASISDLSOP_D3_I3D:\n\t\tcase ENC_LD3_ASISDLSOP_DX3_R3D:\n\t\tcase ENC_LD4R_ASISDLSOP_R4_I:\n\t\tcase ENC_LD4R_ASISDLSOP_RX4_R:\n\t\tcase ENC_LD4_ASISDLSOP_B4_I4B:\n\t\tcase ENC_LD4_ASISDLSOP_BX4_R4B:\n\t\tcase ENC_LD4_ASISDLSOP_H4_I4H:\n\t\tcase ENC_LD4_ASISDLSOP_HX4_R4H:\n\t\tcase ENC_LD4_ASISDLSOP_S4_I4S:\n\t\tcase ENC_LD4_ASISDLSOP_SX4_R4S:\n\t\tcase ENC_LD4_ASISDLSOP_D4_I4D:\n\t\tcase ENC_LD4_ASISDLSOP_DX4_R4D:\n\t\tcase ENC_ST1_ASISDLSOP_B1_I1B:\n\t\tcase ENC_ST1_ASISDLSOP_BX1_R1B:\n\t\tcase ENC_ST1_ASISDLSOP_H1_I1H:\n\t\tcase ENC_ST1_ASISDLSOP_HX1_R1H:\n\t\tcase ENC_ST1_ASISDLSOP_S1_I1S:\n\t\tcase ENC_ST1_ASISDLSOP_SX1_R1S:\n\t\tcase ENC_ST1_ASISDLSOP_D1_I1D:\n\t\tcase ENC_ST1_ASISDLSOP_DX1_R1D:\n\t\tcase ENC_ST2_ASISDLSOP_B2_I2B:\n\t\tcase ENC_ST2_ASISDLSOP_BX2_R2B:\n\t\tcase ENC_ST2_ASISDLSOP_H2_I2H:\n\t\tcase ENC_ST2_ASISDLSOP_HX2_R2H:\n\t\tcase ENC_ST2_ASISDLSOP_S2_I2S:\n\t\tcase ENC_ST2_ASISDLSOP_SX2_R2S:\n\t\tcase ENC_ST2_ASISDLSOP_D2_I2D:\n\t\tcase ENC_ST2_ASISDLSOP_DX2_R2D:\n\t\tcase ENC_ST3_ASISDLSOP_B3_I3B:\n\t\tcase ENC_ST3_ASISDLSOP_BX3_R3B:\n\t\tcase ENC_ST3_ASISDLSOP_H3_I3H:\n\t\tcase ENC_ST3_ASISDLSOP_HX3_R3H:\n\t\tcase ENC_ST3_ASISDLSOP_S3_I3S:\n\t\tcase ENC_ST3_ASISDLSOP_SX3_R3S:\n\t\tcase ENC_ST3_ASISDLSOP_D3_I3D:\n\t\tcase ENC_ST3_ASISDLSOP_DX3_R3D:\n\t\tcase ENC_ST4_ASISDLSOP_B4_I4B:\n\t\tcase ENC_ST4_ASISDLSOP_BX4_R4B:\n\t\tcase ENC_ST4_ASISDLSOP_H4_I4H:\n\t\tcase ENC_ST4_ASISDLSOP_HX4_R4H:\n\t\tcase ENC_ST4_ASISDLSOP_S4_I4S:\n\t\tcase ENC_ST4_ASISDLSOP_SX4_R4S:\n\t\tcase ENC_ST4_ASISDLSOP_D4_I4D:\n\t\tcase ENC_ST4_ASISDLSOP_DX4_R4D:\n\t\t\t// x|Q=x|xxxxxxx|L=x|R=x|Rm=xxxxx|opcode=xxx|S=x|size=xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->R = (insword>>21)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->size = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1R_ASISDLSO_R1:\n\t\tcase ENC_LD1_ASISDLSO_B1_1B:\n\t\tcase ENC_LD1_ASISDLSO_H1_1H:\n\t\tcase ENC_LD1_ASISDLSO_S1_1S:\n\t\tcase ENC_LD1_ASISDLSO_D1_1D:\n\t\tcase ENC_LD2R_ASISDLSO_R2:\n\t\tcase ENC_LD2_ASISDLSO_B2_2B:\n\t\tcase ENC_LD2_ASISDLSO_H2_2H:\n\t\tcase ENC_LD2_ASISDLSO_S2_2S:\n\t\tcase ENC_LD2_ASISDLSO_D2_2D:\n\t\tcase ENC_LD3R_ASISDLSO_R3:\n\t\tcase ENC_LD3_ASISDLSO_B3_3B:\n\t\tcase ENC_LD3_ASISDLSO_H3_3H:\n\t\tcase ENC_LD3_ASISDLSO_S3_3S:\n\t\tcase ENC_LD3_ASISDLSO_D3_3D:\n\t\tcase ENC_LD4R_ASISDLSO_R4:\n\t\tcase ENC_LD4_ASISDLSO_B4_4B:\n\t\tcase ENC_LD4_ASISDLSO_H4_4H:\n\t\tcase ENC_LD4_ASISDLSO_S4_4S:\n\t\tcase ENC_LD4_ASISDLSO_D4_4D:\n\t\tcase ENC_ST1_ASISDLSO_B1_1B:\n\t\tcase ENC_ST1_ASISDLSO_H1_1H:\n\t\tcase ENC_ST1_ASISDLSO_S1_1S:\n\t\tcase ENC_ST1_ASISDLSO_D1_1D:\n\t\tcase ENC_ST2_ASISDLSO_B2_2B:\n\t\tcase ENC_ST2_ASISDLSO_H2_2H:\n\t\tcase ENC_ST2_ASISDLSO_S2_2S:\n\t\tcase ENC_ST2_ASISDLSO_D2_2D:\n\t\tcase ENC_ST3_ASISDLSO_B3_3B:\n\t\tcase ENC_ST3_ASISDLSO_H3_3H:\n\t\tcase ENC_ST3_ASISDLSO_S3_3S:\n\t\tcase ENC_ST3_ASISDLSO_D3_3D:\n\t\tcase ENC_ST4_ASISDLSO_B4_4B:\n\t\tcase ENC_ST4_ASISDLSO_H4_4H:\n\t\tcase ENC_ST4_ASISDLSO_S4_4S:\n\t\tcase ENC_ST4_ASISDLSO_D4_4D:\n\t\t\t// x|Q=x|xxxxxxx|L=x|R=x|xxxxx|opcode=xxx|S=x|size=xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->R = (insword>>21)&1;\n\t\t\tctx->opcode = (insword>>13)&7;\n\t\t\tctx->S = (insword>>12)&1;\n\t\t\tctx->size = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1_ASISDLSE_R1_1V:\n\t\tcase ENC_LD1_ASISDLSE_R2_2V:\n\t\tcase ENC_LD1_ASISDLSE_R3_3V:\n\t\tcase ENC_LD1_ASISDLSE_R4_4V:\n\t\tcase ENC_LD2_ASISDLSE_R2:\n\t\tcase ENC_LD3_ASISDLSE_R3:\n\t\tcase ENC_LD4_ASISDLSE_R4:\n\t\tcase ENC_ST1_ASISDLSE_R1_1V:\n\t\tcase ENC_ST1_ASISDLSE_R2_2V:\n\t\tcase ENC_ST1_ASISDLSE_R3_3V:\n\t\tcase ENC_ST1_ASISDLSE_R4_4V:\n\t\tcase ENC_ST2_ASISDLSE_R2:\n\t\tcase ENC_ST3_ASISDLSE_R3:\n\t\tcase ENC_ST4_ASISDLSE_R4:\n\t\t\t// x|Q=x|xxxxxxx|L=x|xxxxxx|opcode=xxxx|size=xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->size = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_LD1_ASISDLSEP_I1_I1:\n\t\tcase ENC_LD1_ASISDLSEP_R1_R1:\n\t\tcase ENC_LD1_ASISDLSEP_I2_I2:\n\t\tcase ENC_LD1_ASISDLSEP_R2_R2:\n\t\tcase ENC_LD1_ASISDLSEP_I3_I3:\n\t\tcase ENC_LD1_ASISDLSEP_R3_R3:\n\t\tcase ENC_LD1_ASISDLSEP_I4_I4:\n\t\tcase ENC_LD1_ASISDLSEP_R4_R4:\n\t\tcase ENC_LD2_ASISDLSEP_I2_I:\n\t\tcase ENC_LD2_ASISDLSEP_R2_R:\n\t\tcase ENC_LD3_ASISDLSEP_I3_I:\n\t\tcase ENC_LD3_ASISDLSEP_R3_R:\n\t\tcase ENC_LD4_ASISDLSEP_I4_I:\n\t\tcase ENC_LD4_ASISDLSEP_R4_R:\n\t\tcase ENC_ST1_ASISDLSEP_I1_I1:\n\t\tcase ENC_ST1_ASISDLSEP_R1_R1:\n\t\tcase ENC_ST1_ASISDLSEP_I2_I2:\n\t\tcase ENC_ST1_ASISDLSEP_R2_R2:\n\t\tcase ENC_ST1_ASISDLSEP_I3_I3:\n\t\tcase ENC_ST1_ASISDLSEP_R3_R3:\n\t\tcase ENC_ST1_ASISDLSEP_I4_I4:\n\t\tcase ENC_ST1_ASISDLSEP_R4_R4:\n\t\tcase ENC_ST2_ASISDLSEP_I2_I:\n\t\tcase ENC_ST2_ASISDLSEP_R2_R:\n\t\tcase ENC_ST3_ASISDLSEP_I3_I:\n\t\tcase ENC_ST3_ASISDLSEP_R3_R:\n\t\tcase ENC_ST4_ASISDLSEP_I4_I:\n\t\tcase ENC_ST4_ASISDLSEP_R4_R:\n\t\t\t// x|Q=x|xxxxxxx|L=x|x|Rm=xxxxx|opcode=xxxx|size=xx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->opcode = (insword>>12)&15;\n\t\t\tctx->size = (insword>>10)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_EXT_ASIMDEXT_ONLY:\n\t\t\t// x|Q=x|xxxxxx|op2=xx|x|Rm=xxxxx|x|imm4=xxxx|x|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->op2 = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->imm4 = (insword>>11)&15;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TBL_ASIMDTBL_L2_2:\n\t\tcase ENC_TBL_ASIMDTBL_L3_3:\n\t\tcase ENC_TBL_ASIMDTBL_L4_4:\n\t\tcase ENC_TBL_ASIMDTBL_L1_1:\n\t\tcase ENC_TBX_ASIMDTBL_L2_2:\n\t\tcase ENC_TBX_ASIMDTBL_L3_3:\n\t\tcase ENC_TBX_ASIMDTBL_L4_4:\n\t\tcase ENC_TBX_ASIMDTBL_L1_1:\n\t\t\t// x|Q=x|xxxxxx|op2=xx|x|Rm=xxxxx|x|len=xx|op=x|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->op2 = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->len = (insword>>13)&3;\n\t\t\tctx->op = (insword>>12)&1;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_TRN1_ASIMDPERM_ONLY:\n\t\tcase ENC_TRN2_ASIMDPERM_ONLY:\n\t\tcase ENC_UZP1_ASIMDPERM_ONLY:\n\t\tcase ENC_UZP2_ASIMDPERM_ONLY:\n\t\tcase ENC_ZIP1_ASIMDPERM_ONLY:\n\t\tcase ENC_ZIP2_ASIMDPERM_ONLY:\n\t\t\t// x|Q=x|xxxxxx|size=xx|x|Rm=xxxxx|x|op=x|opcode[1:0]=xx|xx|Rn=xxxxx|Rd=xxxxx\n\t\t\tctx->Q = (insword>>30)&1;\n\t\t\tctx->size = (insword>>22)&3;\n\t\t\tctx->Rm = (insword>>16)&0x1f;\n\t\t\tctx->op = (insword>>14)&1;\n\t\t\tctx->opcode = (insword>>12)&3;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rd = insword&0x1f;\n\t\t\tbreak;\n\t\tcase ENC_CASP_CP32_COMSWAPPR:\n\t\tcase ENC_CASPA_CP32_COMSWAPPR:\n\t\tcase ENC_CASPAL_CP32_COMSWAPPR:\n\t\tcase ENC_CASPL_CP32_COMSWAPPR:\n\t\tcase ENC_CASP_CP64_COMSWAPPR:\n\t\tcase ENC_CASPA_CP64_COMSWAPPR:\n\t\tcase ENC_CASPAL_CP64_COMSWAPPR:\n\t\tcase ENC_CASPL_CP64_COMSWAPPR:\n\t\tcase ENC_LDAXP_LP32_LDSTEXCLP:\n\t\tcase ENC_LDAXP_LP64_LDSTEXCLP:\n\t\tcase ENC_LDXP_LP32_LDSTEXCLP:\n\t\tcase ENC_LDXP_LP64_LDSTEXCLP:\n\t\tcase ENC_STLXP_SP32_LDSTEXCLP:\n\t\tcase ENC_STLXP_SP64_LDSTEXCLP:\n\t\tcase ENC_STXP_SP32_LDSTEXCLP:\n\t\tcase ENC_STXP_SP64_LDSTEXCLP:\n\t\t\t// x|sz=x|xxxxxx|o2=x|L=x|o1=x|Rs=xxxxx|o0=x|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx\n\t\t\tctx->sz = (insword>>30)&1;\n\t\t\tctx->o2 = (insword>>23)&1;\n\t\t\tctx->L = (insword>>22)&1;\n\t\t\tctx->o1 = (insword>>21)&1;\n\t\t\tctx->Rs = (insword>>16)&0x1f;\n\t\t\tctx->o0 = (insword>>15)&1;\n\t\t\tctx->Rt2 = (insword>>10)&0x1f;\n\t\t\tctx->Rn = (insword>>5)&0x1f;\n\t\t\tctx->Rt = insword&0x1f;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode_fields32.h",
    "content": "/* GENERATED FILE */\n#pragma once\nvoid decode_fields32(enum ENCODING enc, context *ctx, Instruction *dec);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decode_scratchpad.c",
    "content": "#include \"decode.h\"\n#include \"pcode.h\"\n#include <stdbool.h>\n#include <stdint.h>\n#include <string.h>\n\n#if defined(_MSC_VER)\n// Disable warning: Unary minus operator applied to unsigned type, result still\n// unsigned. This warning is treated as an error with the /sdl flag.\n#pragma warning(disable : 4146)\n#endif\n\n//-----------------------------------------------------------------------------\n// registers\n//-----------------------------------------------------------------------------\n\n// regMap[0][?][?] uses SP for R31\n// regMap[1][?][?] uses ZR for R31\nstatic const Register regMap[2][10][32] = {\n    {\n        {\n            REG_W0,\n            REG_W1,\n            REG_W2,\n            REG_W3,\n            REG_W4,\n            REG_W5,\n            REG_W6,\n            REG_W7,\n            REG_W8,\n            REG_W9,\n            REG_W10,\n            REG_W11,\n            REG_W12,\n            REG_W13,\n            REG_W14,\n            REG_W15,\n            REG_W16,\n            REG_W17,\n            REG_W18,\n            REG_W19,\n            REG_W20,\n            REG_W21,\n            REG_W22,\n            REG_W23,\n            REG_W24,\n            REG_W25,\n            REG_W26,\n            REG_W27,\n            REG_W28,\n            REG_W29,\n            REG_W30,\n            REG_WSP,\n        },\n        {REG_X0, REG_X1, REG_X2, REG_X3, REG_X4, REG_X5, REG_X6, REG_X7, REG_X8, REG_X9, REG_X10,\n            REG_X11, REG_X12, REG_X13, REG_X14, REG_X15, REG_X16, REG_X17, REG_X18, REG_X19,\n            REG_X20, REG_X21, REG_X22, REG_X23, REG_X24, REG_X25, REG_X26, REG_X27, REG_X28,\n            REG_X29, REG_X30, REG_SP},\n        {REG_V0, REG_V1, REG_V2, REG_V3, REG_V4, REG_V5, REG_V6, REG_V7, REG_V8, REG_V9, REG_V10,\n            REG_V11, REG_V12, REG_V13, REG_V14, REG_V15, REG_V16, REG_V17, REG_V18, REG_V19,\n            REG_V20, REG_V21, REG_V22, REG_V23, REG_V24, REG_V25, REG_V26, REG_V27, REG_V28,\n            REG_V29, REG_V30, REG_V31},\n        {REG_B0, REG_B1, REG_B2, REG_B3, REG_B4, REG_B5, REG_B6, REG_B7, REG_B8, REG_B9, REG_B10,\n            REG_B11, REG_B12, REG_B13, REG_B14, REG_B15, REG_B16, REG_B17, REG_B18, REG_B19,\n            REG_B20, REG_B21, REG_B22, REG_B23, REG_B24, REG_B25, REG_B26, REG_B27, REG_B28,\n            REG_B29, REG_B30, REG_B31},\n        {REG_H0, REG_H1, REG_H2, REG_H3, REG_H4, REG_H5, REG_H6, REG_H7, REG_H8, REG_H9, REG_H10,\n            REG_H11, REG_H12, REG_H13, REG_H14, REG_H15, REG_H16, REG_H17, REG_H18, REG_H19,\n            REG_H20, REG_H21, REG_H22, REG_H23, REG_H24, REG_H25, REG_H26, REG_H27, REG_H28,\n            REG_H29, REG_H30, REG_H31},\n        {REG_S0, REG_S1, REG_S2, REG_S3, REG_S4, REG_S5, REG_S6, REG_S7, REG_S8, REG_S9, REG_S10,\n            REG_S11, REG_S12, REG_S13, REG_S14, REG_S15, REG_S16, REG_S17, REG_S18, REG_S19,\n            REG_S20, REG_S21, REG_S22, REG_S23, REG_S24, REG_S25, REG_S26, REG_S27, REG_S28,\n            REG_S29, REG_S30, REG_S31},\n        {REG_D0, REG_D1, REG_D2, REG_D3, REG_D4, REG_D5, REG_D6, REG_D7, REG_D8, REG_D9, REG_D10,\n            REG_D11, REG_D12, REG_D13, REG_D14, REG_D15, REG_D16, REG_D17, REG_D18, REG_D19,\n            REG_D20, REG_D21, REG_D22, REG_D23, REG_D24, REG_D25, REG_D26, REG_D27, REG_D28,\n            REG_D29, REG_D30, REG_D31},\n        {REG_Q0, REG_Q1, REG_Q2, REG_Q3, REG_Q4, REG_Q5, REG_Q6, REG_Q7, REG_Q8, REG_Q9, REG_Q10,\n            REG_Q11, REG_Q12, REG_Q13, REG_Q14, REG_Q15, REG_Q16, REG_Q17, REG_Q18, REG_Q19,\n            REG_Q20, REG_Q21, REG_Q22, REG_Q23, REG_Q24, REG_Q25, REG_Q26, REG_Q27, REG_Q28,\n            REG_Q29, REG_Q30, REG_Q31},\n        {REG_Z0, REG_Z1, REG_Z2, REG_Z3, REG_Z4, REG_Z5, REG_Z6, REG_Z7, REG_Z8, REG_Z9, REG_Z10,\n            REG_Z11, REG_Z12, REG_Z13, REG_Z14, REG_Z15, REG_Z16, REG_Z17, REG_Z18, REG_Z19,\n            REG_Z20, REG_Z21, REG_Z22, REG_Z23, REG_Z24, REG_Z25, REG_Z26, REG_Z27, REG_Z28,\n            REG_Z29, REG_Z30, REG_Z31},\n        {REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_P6, REG_P7, REG_P8, REG_P9, REG_P10,\n            REG_P11, REG_P12, REG_P13, REG_P14, REG_P15, REG_P16, REG_P17, REG_P18, REG_P19,\n            REG_P20, REG_P21, REG_P22, REG_P23, REG_P24, REG_P25, REG_P26, REG_P27, REG_P28,\n            REG_P29, REG_P30, REG_P31},\n    },\n    {{\n         REG_W0,\n         REG_W1,\n         REG_W2,\n         REG_W3,\n         REG_W4,\n         REG_W5,\n         REG_W6,\n         REG_W7,\n         REG_W8,\n         REG_W9,\n         REG_W10,\n         REG_W11,\n         REG_W12,\n         REG_W13,\n         REG_W14,\n         REG_W15,\n         REG_W16,\n         REG_W17,\n         REG_W18,\n         REG_W19,\n         REG_W20,\n         REG_W21,\n         REG_W22,\n         REG_W23,\n         REG_W24,\n         REG_W25,\n         REG_W26,\n         REG_W27,\n         REG_W28,\n         REG_W29,\n         REG_W30,\n         REG_WZR,\n     },\n        {\n            REG_X0,\n            REG_X1,\n            REG_X2,\n            REG_X3,\n            REG_X4,\n            REG_X5,\n            REG_X6,\n            REG_X7,\n            REG_X8,\n            REG_X9,\n            REG_X10,\n            REG_X11,\n            REG_X12,\n            REG_X13,\n            REG_X14,\n            REG_X15,\n            REG_X16,\n            REG_X17,\n            REG_X18,\n            REG_X19,\n            REG_X20,\n            REG_X21,\n            REG_X22,\n            REG_X23,\n            REG_X24,\n            REG_X25,\n            REG_X26,\n            REG_X27,\n            REG_X28,\n            REG_X29,\n            REG_X30,\n            REG_XZR,\n        },\n        {\n            REG_V0,\n            REG_V1,\n            REG_V2,\n            REG_V3,\n            REG_V4,\n            REG_V5,\n            REG_V6,\n            REG_V7,\n            REG_V8,\n            REG_V9,\n            REG_V10,\n            REG_V11,\n            REG_V12,\n            REG_V13,\n            REG_V14,\n            REG_V15,\n            REG_V16,\n            REG_V17,\n            REG_V18,\n            REG_V19,\n            REG_V20,\n            REG_V21,\n            REG_V22,\n            REG_V23,\n            REG_V24,\n            REG_V25,\n            REG_V26,\n            REG_V27,\n            REG_V28,\n            REG_V29,\n            REG_V30,\n            REG_V31,\n        },\n        {\n            REG_B0,\n            REG_B1,\n            REG_B2,\n            REG_B3,\n            REG_B4,\n            REG_B5,\n            REG_B6,\n            REG_B7,\n            REG_B8,\n            REG_B9,\n            REG_B10,\n            REG_B11,\n            REG_B12,\n            REG_B13,\n            REG_B14,\n            REG_B15,\n            REG_B16,\n            REG_B17,\n            REG_B18,\n            REG_B19,\n            REG_B20,\n            REG_B21,\n            REG_B22,\n            REG_B23,\n            REG_B24,\n            REG_B25,\n            REG_B26,\n            REG_B27,\n            REG_B28,\n            REG_B29,\n            REG_B30,\n            REG_B31,\n        },\n        {\n            REG_H0,\n            REG_H1,\n            REG_H2,\n            REG_H3,\n            REG_H4,\n            REG_H5,\n            REG_H6,\n            REG_H7,\n            REG_H8,\n            REG_H9,\n            REG_H10,\n            REG_H11,\n            REG_H12,\n            REG_H13,\n            REG_H14,\n            REG_H15,\n            REG_H16,\n            REG_H17,\n            REG_H18,\n            REG_H19,\n            REG_H20,\n            REG_H21,\n            REG_H22,\n            REG_H23,\n            REG_H24,\n            REG_H25,\n            REG_H26,\n            REG_H27,\n            REG_H28,\n            REG_H29,\n            REG_H30,\n            REG_H31,\n        },\n        {\n            REG_S0,\n            REG_S1,\n            REG_S2,\n            REG_S3,\n            REG_S4,\n            REG_S5,\n            REG_S6,\n            REG_S7,\n            REG_S8,\n            REG_S9,\n            REG_S10,\n            REG_S11,\n            REG_S12,\n            REG_S13,\n            REG_S14,\n            REG_S15,\n            REG_S16,\n            REG_S17,\n            REG_S18,\n            REG_S19,\n            REG_S20,\n            REG_S21,\n            REG_S22,\n            REG_S23,\n            REG_S24,\n            REG_S25,\n            REG_S26,\n            REG_S27,\n            REG_S28,\n            REG_S29,\n            REG_S30,\n            REG_S31,\n        },\n        {\n            REG_D0,\n            REG_D1,\n            REG_D2,\n            REG_D3,\n            REG_D4,\n            REG_D5,\n            REG_D6,\n            REG_D7,\n            REG_D8,\n            REG_D9,\n            REG_D10,\n            REG_D11,\n            REG_D12,\n            REG_D13,\n            REG_D14,\n            REG_D15,\n            REG_D16,\n            REG_D17,\n            REG_D18,\n            REG_D19,\n            REG_D20,\n            REG_D21,\n            REG_D22,\n            REG_D23,\n            REG_D24,\n            REG_D25,\n            REG_D26,\n            REG_D27,\n            REG_D28,\n            REG_D29,\n            REG_D30,\n            REG_D31,\n        },\n        {REG_Q0, REG_Q1, REG_Q2, REG_Q3, REG_Q4, REG_Q5, REG_Q6, REG_Q7, REG_Q8, REG_Q9, REG_Q10,\n            REG_Q11, REG_Q12, REG_Q13, REG_Q14, REG_Q15, REG_Q16, REG_Q17, REG_Q18, REG_Q19,\n            REG_Q20, REG_Q21, REG_Q22, REG_Q23, REG_Q24, REG_Q25, REG_Q26, REG_Q27, REG_Q28,\n            REG_Q29, REG_Q30, REG_Q31},\n        {REG_Z0, REG_Z1, REG_Z2, REG_Z3, REG_Z4, REG_Z5, REG_Z6, REG_Z7, REG_Z8, REG_Z9, REG_Z10,\n            REG_Z11, REG_Z12, REG_Z13, REG_Z14, REG_Z15, REG_Z16, REG_Z17, REG_Z18, REG_Z19,\n            REG_Z20, REG_Z21, REG_Z22, REG_Z23, REG_Z24, REG_Z25, REG_Z26, REG_Z27, REG_Z28,\n            REG_Z29, REG_Z30, REG_Z31},\n        {REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_P6, REG_P7, REG_P8, REG_P9, REG_P10,\n            REG_P11, REG_P12, REG_P13, REG_P14, REG_P15, REG_P16, REG_P17, REG_P18, REG_P19,\n            REG_P20, REG_P21, REG_P22, REG_P23, REG_P24, REG_P25, REG_P26, REG_P27, REG_P28,\n            REG_P29, REG_P30, REG_P31},\n        }};\n\n/* first coordinate into regMap */\n#define REGSET_SP 0\n#define REGSET_ZR 1\n\n/* second coordinate into regMap */\n#define REG_W_BASE  0\n#define REG_X_BASE  1\n#define REG_V_BASE  2\n#define REG_B_BASE  3\n#define REG_H_BASE  4\n#define REG_S_BASE  5\n#define REG_D_BASE  6\n#define REG_Q_BASE  7\n#define REG_Z_BASE  8\n#define REG_P_BASE  9\n\n/* third coordinate into regMap is [0,31] */\n\nint table_wbase_xbase[2] = {REG_W_BASE, REG_X_BASE};\n\n#define REG(SP_OR_ZR, REG_BASE, REG_NUM) regMap[(SP_OR_ZR)][(REG_BASE)][(REG_NUM)]\n\n/* prefetch operation */\nconst char* prfop_lookup(unsigned prfop)\n{\n\tswitch (prfop)\n\t{\n\tcase 0b00000:\n\t\treturn \"pldl1keep\";\n\tcase 0b00001:\n\t\treturn \"pldl1strm\";\n\tcase 0b00010:\n\t\treturn \"pldl2keep\";\n\tcase 0b00011:\n\t\treturn \"pldl2strm\";\n\tcase 0b00100:\n\t\treturn \"pldl3keep\";\n\tcase 0b00101:\n\t\treturn \"pldl3strm\";\n\tcase 0b00110:\n\t\treturn \"#6\";\n\tcase 0b00111:\n\t\treturn \"#7\";\n\tcase 0b01000:\n\t\treturn \"plil1keep\";\n\tcase 0b01001:\n\t\treturn \"plil1strm\";\n\tcase 0b01010:\n\t\treturn \"plil2keep\";\n\tcase 0b01011:\n\t\treturn \"plil2strm\";\n\tcase 0b01100:\n\t\treturn \"plil3keep\";\n\tcase 0b01101:\n\t\treturn \"plil3strm\";\n\tcase 0b01110:\n\t\treturn \"#14\";\n\tcase 0b01111:\n\t\treturn \"#15\";\n\tcase 0b10000:\n\t\treturn \"pstl1keep\";\n\tcase 0b10001:\n\t\treturn \"pstl1strm\";\n\tcase 0b10010:\n\t\treturn \"pstl2keep\";\n\tcase 0b10011:\n\t\treturn \"pstl2strm\";\n\tcase 0b10100:\n\t\treturn \"pstl3keep\";\n\tcase 0b10101:\n\t\treturn \"pstl3strm\";\n\tcase 0b10110:\n\t\treturn \"#22\";\n\tcase 0b10111:\n\t\treturn \"#23\";\n\tcase 0b11000:\n\t\treturn \"#24\";\n\tcase 0b11001:\n\t\treturn \"#25\";\n\tcase 0b11010:\n\t\treturn \"#26\";\n\tcase 0b11011:\n\t\treturn \"#27\";\n\tcase 0b11100:\n\t\treturn \"#28\";\n\tcase 0b11101:\n\t\treturn \"#29\";\n\tcase 0b11110:\n\t\treturn \"#30\";\n\tcase 0b11111:\n\t\treturn \"#31\";\n\tdefault:\n\t\treturn \"error\";\n\t}\n}\n\n/* prefetch operation */\nconst char* prfop_lookup_4(unsigned prfop)\n{\n\tswitch (prfop)\n\t{\n\tcase 0b0000:\n\t\treturn \"pldl1keep\";\n\tcase 0b0001:\n\t\treturn \"pldl1strm\";\n\tcase 0b0010:\n\t\treturn \"pldl2keep\";\n\tcase 0b0011:\n\t\treturn \"pldl2strm\";\n\tcase 0b0100:\n\t\treturn \"pldl3keep\";\n\tcase 0b0101:\n\t\treturn \"pldl3strm\";\n\tcase 0b0110:\n\t\treturn \"#6\";\n\tcase 0b0111:\n\t\treturn \"#7\";\n\tcase 0b1000:\n\t\treturn \"pstl1keep\";\n\tcase 0b1001:\n\t\treturn \"pstl1strm\";\n\tcase 0b1010:\n\t\treturn \"pstl2keep\";\n\tcase 0b1011:\n\t\treturn \"pstl2strm\";\n\tcase 0b1100:\n\t\treturn \"pstl3keep\";\n\tcase 0b1101:\n\t\treturn \"pstl3strm\";\n\tcase 0b1110:\n\t\treturn \"#14\";\n\tcase 0b1111:\n\t\treturn \"#15\";\n\tdefault:\n\t\treturn \"error\";\n\t}\n}\n\nconst char* pattern_lookup(unsigned pattern, unsigned uimm5)\n{\n\tswitch (pattern & 0x1f)\n\t{\n\tcase 0b00000:\n\t\treturn \"pow2\";\n\tcase 0b00001:\n\t\treturn \"vl1\";\n\tcase 0b00010:\n\t\treturn \"vl2\";\n\tcase 0b00011:\n\t\treturn \"vl3\";\n\tcase 0b00100:\n\t\treturn \"vl4\";\n\tcase 0b00101:\n\t\treturn \"vl5\";\n\tcase 0b00110:\n\t\treturn \"vl6\";\n\tcase 0b00111:\n\t\treturn \"vl7\";\n\tcase 0b01000:\n\t\treturn \"vl8\";\n\tcase 0b01001:\n\t\treturn \"vl16\";\n\tcase 0b01010:\n\t\treturn \"vl32\";\n\tcase 0b01011:\n\t\treturn \"vl64\";\n\tcase 0b01100:\n\t\treturn \"vl128\";\n\tcase 0b01101:\n\t\treturn \"vl256\";\n\tcase 0b11101:\n\t\treturn \"mul4\";\n\tcase 0b11110:\n\t\treturn \"mul3\";\n\tcase 0b11111:\n\t\treturn \"all\";\n\tdefault:\n\t\treturn \"error\";\n\t}\n}\n\n//-----------------------------------------------------------------------------\n// arrangement specifiers and lookups (usually fills in a \".<T>\", \".<Ta>\", \"<.Tb>\")\n//-----------------------------------------------------------------------------\n\n#define _1B  ARRSPEC_1BYTE\n#define _1H  ARRSPEC_1HALF\n#define _1S  ARRSPEC_1SINGLE\n#define _1D  ARRSPEC_1DOUBLE\n#define _1Q  ARRSPEC_FULL\n#define _2H  ARRSPEC_2HALVES\n#define _2S  ARRSPEC_2SINGLES\n#define _2D  ARRSPEC_2DOUBLES\n#define _4B  ARRSPEC_4BYTES\n#define _4H  ARRSPEC_4HALVES\n#define _4S  ARRSPEC_4SINGLES\n#define _8B  ARRSPEC_8BYTES\n#define _8H  ARRSPEC_8HALVES\n#define _16B ARRSPEC_16BYTES\n\n/* arrangement specifiers\n0000 x SEE Advanced SIMD modified immediate\n0001 0 8B\n0001 1 16B\n001x 0 4H\n001x 1 8H\n01xx 0 2S\n01xx 1 4S\n1xxx x RESERVED\n*/\nArrangementSpec arr_spec_method0(uint32_t imm5, uint32_t Q)\n{\n\tif (Q == 0)\n\t{\n\t\tif (imm5 & 1)\n\t\t\treturn _8B;\n\t\tif (imm5 & 2)\n\t\t\treturn _4H;\n\t\tif (imm5 & 4)\n\t\t\treturn _2S;\n\t}\n\telse\n\t{\n\t\tif (imm5 & 1)\n\t\t\treturn _16B;\n\t\tif (imm5 & 2)\n\t\t\treturn _8H;\n\t\tif (imm5 & 4)\n\t\t\treturn _4S;\n\t\tif (imm5 & 8)\n\t\t\treturn _2D;\n\t}\n\treturn ARRSPEC_NONE;\n}\n\nArrangementSpec arr_spec_method1(unsigned key)\n{\n\t// 00000 RESERVED\n\t// xxxx1 B\n\t// xxx10 H\n\t// xx100 S\n\t// x1000 D\n\t// 10000 Q\n\tif ((key & 0b00001) == 0b00001)\n\t\treturn _1B;  // xxxx1 B\n\tif ((key & 0b00011) == 0b00010)\n\t\treturn _1H;  // xxx10 H\n\tif ((key & 0b00111) == 0b00100)\n\t\treturn _1S;  // xx100 S\n\tif ((key & 0b01111) == 0b01000)\n\t\treturn _1D;  // x1000 D\n\tif ((key & 0b11111) == 0b10000)\n\t\treturn _1Q;  // 10000 Q\n\treturn ARRSPEC_NONE;\n}\n\nArrangementSpec arr_spec_method2(unsigned immh)\n{\n\t// 0000 SEE Advanced SIMD modified immediate\n\tif (immh == 1)\n\t\treturn _8H;  // 0001 8H\n\tif ((immh & 0b1110) == 0b0010)\n\t\treturn _4S;  // 001x 4S\n\tif ((immh & 0b1100) == 0b0100)\n\t\treturn _2D;         // 01xx 2D\n\treturn ARRSPEC_NONE;  // 1xxx RESERVED\n}\n\nArrangementSpec arr_spec_method3(unsigned immh, unsigned q)\n{\n\tswitch ((immh << 1) | q)\n\t{\n\t\t// 0000 x SEE Advanced SIMD modified immediate\n\tcase 0b00010:\n\t\treturn _8B;  // 0001 0 8B\n\tcase 0b00011:\n\t\treturn _16B;  // 0001 1 16B\n\tcase 0b00100:\n\tcase 0b00110:\n\t\treturn _4H;  // 001x 0 4H\n\tcase 0b00101:\n\tcase 0b00111:\n\t\treturn _8H;  // 001x 1 8H\n\tcase 0b01000:\n\tcase 0b01010:\n\tcase 0b01100:\n\tcase 0b01110:\n\t\treturn _2S;  // 01xx 0 2S\n\tcase 0b01001:\n\tcase 0b01011:\n\tcase 0b01101:\n\tcase 0b01111:\n\t\treturn _4S;  // 01xx 1 4S\n\tcase 0b10001:\n\tcase 0b10011:\n\tcase 0b10101:\n\tcase 0b10111:\n\tcase 0b11001:\n\tcase 0b11011:\n\tcase 0b11101:\n\tcase 0b11111:\n\t\treturn _2D;\n\tdefault:\n\t\tbreak;  // 1xxx 1 RESERVED\n\t}\n\treturn ARRSPEC_NONE;\n}\n\nArrangementSpec arr_spec_method4(unsigned imm5, unsigned q)\n{\n\tunsigned key = (imm5 << 1) | q;\n\t// if((key & 0b011110) == 0b000000) return RESERVED;\t\t\t\t\t// x0000 x RESERVED\n\tif ((key & 0b000011) == 0b000010)\n\t\treturn _8B;  // xxxx1 0 8B\n\tif ((key & 0b000011) == 0b000011)\n\t\treturn _16B;  // xxxx1 1 16B\n\tif ((key & 0b000111) == 0b000100)\n\t\treturn _4H;  // xxx10 0 4H\n\tif ((key & 0b000111) == 0b000101)\n\t\treturn _8H;  // xxx10 1 8H\n\tif ((key & 0b001111) == 0b001000)\n\t\treturn _2S;  // xx100 0 2S\n\tif ((key & 0b001111) == 0b001001)\n\t\treturn _4S;  // xx100 1 4S\n\t// if((key & 0b011111) == 0b010000) return RESERVED;\t\t\t\t\t// x1000 0 RESERVED\n\tif ((key & 0b011111) == 0b010001)\n\t\treturn _2D;  // x1000 1 2D\n\treturn ARRSPEC_NONE;\n}\n\nArrangementSpec table_1s_1d[2] = {_1S, _1D};\nArrangementSpec table_2s_4s[2] = {_2S, _4S};\nArrangementSpec table_2s_2d[2] = {_2S, _2D};\nArrangementSpec table_2h_4h[2] = {_2H, _4H};\nArrangementSpec table_4h_8h[2] = {_4H, _8H};\nArrangementSpec table_4s_2d[2] = {_4S, _2D};\nArrangementSpec table_8b_16b[2] = {_8B, _16B};\nArrangementSpec table_2s_r_4s_2d[4] = {_2S, ARRSPEC_NONE, _4S, _2D};\nArrangementSpec table_2s_4s_r_2d[4] = {_2S, _4S, ARRSPEC_NONE, _2D};\nArrangementSpec table_8h_4s_2d_1q[4] = {_8H, _4S, _2D, _1Q};\nArrangementSpec table_4h_8h_2s_4s_1d_2d_r_r[8] = {\n    _4H, _8H, _2S, _4S, _1D, _2D, ARRSPEC_NONE, ARRSPEC_NONE};\nArrangementSpec table_8b_16b_4h_8h_2s_4s_1d_2d[8] = {_8B, _16B, _4H, _8H, _2S, _4S, _1D, _2D};\nArrangementSpec table_r_b_h_r_r_s_r_r[8] = {\n    ARRSPEC_NONE, _1B, _1H, ARRSPEC_NONE, ARRSPEC_NONE, _1S, ARRSPEC_NONE, ARRSPEC_NONE};\nArrangementSpec table_r_h_s_r_r_d_r_r[8] = {\n    ARRSPEC_NONE, _1H, _1S, ARRSPEC_NONE, ARRSPEC_NONE, _1D, ARRSPEC_NONE, ARRSPEC_NONE};\nArrangementSpec table_r_h_s_s_d_d_d_d[8] = {\n\tARRSPEC_NONE, _1H, _1S, _1S, _1D, _1D, _1D, _1D};\nArrangementSpec table_r_b_h_h_s_s_s_s[8] = {\n\tARRSPEC_NONE, _1B, _1H, _1H, _1S, _1S, _1S, _1S};\nArrangementSpec table16_r_b_h_s_d[16] = {\n    ARRSPEC_NONE, _1B, _1H, _1H, _1S, _1S, _1S, _1S, _1D, _1D, _1D, _1D, _1D, _1D, _1D, _1D};\n\n//-----------------------------------------------------------------------------\n// element size (usually to fill in a \".<T>\")\n//-----------------------------------------------------------------------------\n\nArrangementSpec size_spec_method0(uint8_t /*bit*/ a, uint8_t /*bit(6)*/ b)\n{\n\tif (a == 0)\n\t{\n\t\tif ((b & 0x20) == 0)\n\t\t\treturn _1S;\n\t\tif ((b & 0x30) == 0x20)\n\t\t\treturn _1H;\n\t\tif ((b & 0x38) == 0x30)\n\t\t\treturn _1B;\n\t\tif ((b & 0x3C) == 0x38)\n\t\t\treturn _1B;\n\t\tif ((b & 0x3E) == 0x3C)\n\t\t\treturn _1B;\n\t\treturn 0;\n\t}\n\telse\n\t{\n\t\treturn _1D;\n\t}\n}\n\nArrangementSpec size_spec_method1(unsigned imm13)\n{\n\tunsigned key = (((imm13 >> 12) & 1) << 6) | (imm13 & 0b111111);\n\n\tif ((key & 0b1100000) == 0b0000000)\n\t\treturn _1S;  // 0 0xxxxx\tS\n\tif ((key & 0b1110000) == 0b0100000)\n\t\treturn _1H;  // 0 10xxxx\tH\n\tif ((key & 0b1111000) == 0b0110000)\n\t\treturn _1B;  // 0 110xxx\tB\n\tif ((key & 0b1111100) == 0b0111000)\n\t\treturn _1B;  // 0 1110xx\tB\n\tif ((key & 0b1111110) == 0b0111100)\n\t\treturn _1B;  // 0 11110x\tB\n\t// if((key & 0b1111111) == 0b0111110) return \"RESERVED\";\t// 0 111110\tRESERVED\n\t// if((key & 0b1111111) == 0b0111111) return \"RESERVED\";\t// 0 111111\tRESERVED\n\tif ((key & 0b1000000) == 0b1000000)\n\t\treturn _1D;  // 1 xxxxxx\tD\n\treturn 0;\n}\n\nArrangementSpec size_spec_method3(int x)\n{\n\tif ((x & 0b01111) == 0b00000)\n\t\treturn ARRSPEC_NONE;  // x0000 RESERVED\n\tif ((x & 0b00001) == 0b00001)\n\t\treturn _1B;  // xxxx1 B\n\tif ((x & 0b00011) == 0b00010)\n\t\treturn _1H;  // xxx10 H\n\tif ((x & 0b00111) == 0b00100)\n\t\treturn _1S;  // xx100 S\n\tif ((x & 0b01111) == 0b01000)\n\t\treturn _1D;  // x1000 D\n\treturn 0;\n}\n\nArrangementSpec table_b_h[2] = {_1B, _1H};\nArrangementSpec table_s_d[2] = {_1S, _1D};\nArrangementSpec table_b_d_h_s[4] = {_1B, _1D, _1H, _1S};\nArrangementSpec table_b_h_s_d[4] = {_1B, _1H, _1S, _1D};\nArrangementSpec table_d_b_h_s[4] = {_1D, _1B, _1H, _1S};\nArrangementSpec table_q_h_s_d[4] = {_1Q, _1H, _1S, _1D};\nArrangementSpec table_r_h_s_d[4] = {ARRSPEC_NONE, _1H, _1S, _1D};\nArrangementSpec table_r_b_h_s[4] = {ARRSPEC_NONE, _1B, _1H, _1S};\nArrangementSpec table_r_s_d_r[4] = {ARRSPEC_NONE, _1S, _1D, ARRSPEC_NONE};\n\n//-----------------------------------------------------------------------------\n// other tables\n//-----------------------------------------------------------------------------\n\n\nenum Condition table_cond[16] = {COND_EQ, COND_NE, COND_CS, COND_CC, COND_MI, COND_PL, COND_VS,\n    COND_VC, COND_HI, COND_LS, COND_GE, COND_LT, COND_GT, COND_LE, COND_AL, COND_NV};\nenum Condition table_cond_neg[16] = {COND_NE, COND_EQ, COND_CC, COND_CS, COND_PL, COND_MI, COND_VC,\n    COND_VS, COND_LS, COND_HI, COND_LT, COND_GE, COND_LE, COND_GT, COND_NV, COND_AL};\n\nfloat table_imm8_to_float[256] = {2.000000000000000000e+00, 2.125000000000000000e+00,\n    2.250000000000000000e+00, 2.375000000000000000e+00, 2.500000000000000000e+00,\n    2.625000000000000000e+00, 2.750000000000000000e+00, 2.875000000000000000e+00,\n    3.000000000000000000e+00, 3.125000000000000000e+00, 3.250000000000000000e+00,\n    3.375000000000000000e+00, 3.500000000000000000e+00, 3.625000000000000000e+00,\n    3.750000000000000000e+00, 3.875000000000000000e+00, 4.000000000000000000e+00,\n    4.250000000000000000e+00, 4.500000000000000000e+00, 4.750000000000000000e+00,\n    5.000000000000000000e+00, 5.250000000000000000e+00, 5.500000000000000000e+00,\n    5.750000000000000000e+00, 6.000000000000000000e+00, 6.250000000000000000e+00,\n    6.500000000000000000e+00, 6.750000000000000000e+00, 7.000000000000000000e+00,\n    7.250000000000000000e+00, 7.500000000000000000e+00, 7.750000000000000000e+00,\n    8.000000000000000000e+00, 8.500000000000000000e+00, 9.000000000000000000e+00,\n    9.500000000000000000e+00, 1.000000000000000000e+01, 1.050000000000000000e+01,\n    1.100000000000000000e+01, 1.150000000000000000e+01, 1.200000000000000000e+01,\n    1.250000000000000000e+01, 1.300000000000000000e+01, 1.350000000000000000e+01,\n    1.400000000000000000e+01, 1.450000000000000000e+01, 1.500000000000000000e+01,\n    1.550000000000000000e+01, 1.600000000000000000e+01, 1.700000000000000000e+01,\n    1.800000000000000000e+01, 1.900000000000000000e+01, 2.000000000000000000e+01,\n    2.100000000000000000e+01, 2.200000000000000000e+01, 2.300000000000000000e+01,\n    2.400000000000000000e+01, 2.500000000000000000e+01, 2.600000000000000000e+01,\n    2.700000000000000000e+01, 2.800000000000000000e+01, 2.900000000000000000e+01,\n    3.000000000000000000e+01, 3.100000000000000000e+01, 1.250000000000000000e-01,\n    1.328125000000000000e-01, 1.406250000000000000e-01, 1.484375000000000000e-01,\n    1.562500000000000000e-01, 1.640625000000000000e-01, 1.718750000000000000e-01,\n    1.796875000000000000e-01, 1.875000000000000000e-01, 1.953125000000000000e-01,\n    2.031250000000000000e-01, 2.109375000000000000e-01, 2.187500000000000000e-01,\n    2.265625000000000000e-01, 2.343750000000000000e-01, 2.421875000000000000e-01,\n    2.500000000000000000e-01, 2.656250000000000000e-01, 2.812500000000000000e-01,\n    2.968750000000000000e-01, 3.125000000000000000e-01, 3.281250000000000000e-01,\n    3.437500000000000000e-01, 3.593750000000000000e-01, 3.750000000000000000e-01,\n    3.906250000000000000e-01, 4.062500000000000000e-01, 4.218750000000000000e-01,\n    4.375000000000000000e-01, 4.531250000000000000e-01, 4.687500000000000000e-01,\n    4.843750000000000000e-01, 5.000000000000000000e-01, 5.312500000000000000e-01,\n    5.625000000000000000e-01, 5.937500000000000000e-01, 6.250000000000000000e-01,\n    6.562500000000000000e-01, 6.875000000000000000e-01, 7.187500000000000000e-01,\n    7.500000000000000000e-01, 7.812500000000000000e-01, 8.125000000000000000e-01,\n    8.437500000000000000e-01, 8.750000000000000000e-01, 9.062500000000000000e-01,\n    9.375000000000000000e-01, 9.687500000000000000e-01, 1.000000000000000000e+00,\n    1.062500000000000000e+00, 1.125000000000000000e+00, 1.187500000000000000e+00,\n    1.250000000000000000e+00, 1.312500000000000000e+00, 1.375000000000000000e+00,\n    1.437500000000000000e+00, 1.500000000000000000e+00, 1.562500000000000000e+00,\n    1.625000000000000000e+00, 1.687500000000000000e+00, 1.750000000000000000e+00,\n    1.812500000000000000e+00, 1.875000000000000000e+00, 1.937500000000000000e+00,\n    -2.000000000000000000e+00, -2.125000000000000000e+00, -2.250000000000000000e+00,\n    -2.375000000000000000e+00, -2.500000000000000000e+00, -2.625000000000000000e+00,\n    -2.750000000000000000e+00, -2.875000000000000000e+00, -3.000000000000000000e+00,\n    -3.125000000000000000e+00, -3.250000000000000000e+00, -3.375000000000000000e+00,\n    -3.500000000000000000e+00, -3.625000000000000000e+00, -3.750000000000000000e+00,\n    -3.875000000000000000e+00, -4.000000000000000000e+00, -4.250000000000000000e+00,\n    -4.500000000000000000e+00, -4.750000000000000000e+00, -5.000000000000000000e+00,\n    -5.250000000000000000e+00, -5.500000000000000000e+00, -5.750000000000000000e+00,\n    -6.000000000000000000e+00, -6.250000000000000000e+00, -6.500000000000000000e+00,\n    -6.750000000000000000e+00, -7.000000000000000000e+00, -7.250000000000000000e+00,\n    -7.500000000000000000e+00, -7.750000000000000000e+00, -8.000000000000000000e+00,\n    -8.500000000000000000e+00, -9.000000000000000000e+00, -9.500000000000000000e+00,\n    -1.000000000000000000e+01, -1.050000000000000000e+01, -1.100000000000000000e+01,\n    -1.150000000000000000e+01, -1.200000000000000000e+01, -1.250000000000000000e+01,\n    -1.300000000000000000e+01, -1.350000000000000000e+01, -1.400000000000000000e+01,\n    -1.450000000000000000e+01, -1.500000000000000000e+01, -1.550000000000000000e+01,\n    -1.600000000000000000e+01, -1.700000000000000000e+01, -1.800000000000000000e+01,\n    -1.900000000000000000e+01, -2.000000000000000000e+01, -2.100000000000000000e+01,\n    -2.200000000000000000e+01, -2.300000000000000000e+01, -2.400000000000000000e+01,\n    -2.500000000000000000e+01, -2.600000000000000000e+01, -2.700000000000000000e+01,\n    -2.800000000000000000e+01, -2.900000000000000000e+01, -3.000000000000000000e+01,\n    -3.100000000000000000e+01, -1.250000000000000000e-01, -1.328125000000000000e-01,\n    -1.406250000000000000e-01, -1.484375000000000000e-01, -1.562500000000000000e-01,\n    -1.640625000000000000e-01, -1.718750000000000000e-01, -1.796875000000000000e-01,\n    -1.875000000000000000e-01, -1.953125000000000000e-01, -2.031250000000000000e-01,\n    -2.109375000000000000e-01, -2.187500000000000000e-01, -2.265625000000000000e-01,\n    -2.343750000000000000e-01, -2.421875000000000000e-01, -2.500000000000000000e-01,\n    -2.656250000000000000e-01, -2.812500000000000000e-01, -2.968750000000000000e-01,\n    -3.125000000000000000e-01, -3.281250000000000000e-01, -3.437500000000000000e-01,\n    -3.593750000000000000e-01, -3.750000000000000000e-01, -3.906250000000000000e-01,\n    -4.062500000000000000e-01, -4.218750000000000000e-01, -4.375000000000000000e-01,\n    -4.531250000000000000e-01, -4.687500000000000000e-01, -4.843750000000000000e-01,\n    -5.000000000000000000e-01, -5.312500000000000000e-01, -5.625000000000000000e-01,\n    -5.937500000000000000e-01, -6.250000000000000000e-01, -6.562500000000000000e-01,\n    -6.875000000000000000e-01, -7.187500000000000000e-01, -7.500000000000000000e-01,\n    -7.812500000000000000e-01, -8.125000000000000000e-01, -8.437500000000000000e-01,\n    -8.750000000000000000e-01, -9.062500000000000000e-01, -9.375000000000000000e-01,\n    -9.687500000000000000e-01, -1.000000000000000000e+00, -1.062500000000000000e+00,\n    -1.125000000000000000e+00, -1.187500000000000000e+00, -1.250000000000000000e+00,\n    -1.312500000000000000e+00, -1.375000000000000000e+00, -1.437500000000000000e+00,\n    -1.500000000000000000e+00, -1.562500000000000000e+00, -1.625000000000000000e+00,\n    -1.687500000000000000e+00, -1.750000000000000000e+00, -1.812500000000000000e+00,\n    -1.875000000000000000e+00, -1.937500000000000000e+00};\n\nconst char* reg_lookup_c[16] = {\"c0\", \"c1\", \"c2\", \"c3\", \"c4\", \"c5\", \"c6\", \"c7\", \"c8\", \"c9\", \"c10\",\n    \"c11\", \"c12\", \"c13\", \"c14\", \"c15\"};\n\n#define ABCDEFGH \\\n\t((ctx->a << 7) | (ctx->b << 6) | (ctx->c << 5) | (ctx->d << 4) | (ctx->e << 3) | (ctx->f << 2) | \\\n\t    (ctx->g << 1) | ctx->h)\n#define IMMR  ctx->immr\n#define IMMS  ctx->imms\n#define INDEX ctx->index\n\n/* register operand macros */\n#define ADD_OPERAND_REG(REGSET, BASE, REGNUM) \\\n\tinstr->operands[i].operandClass = REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\ti++;\n\n#define ADD_OPERAND_BT ADD_OPERAND_REG(REGSET_ZR, REG_B_BASE, ctx->t);\n\n#define ADD_OPERAND_DA  ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->a);\n#define ADD_OPERAND_DD  ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n#define ADD_OPERAND_DN  ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->n);\n#define ADD_OPERAND_DM  ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->m);\n#define ADD_OPERAND_DT  ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->t);\n#define ADD_OPERAND_DT1 ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->t);\n#define ADD_OPERAND_DT2 ADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->t2);\n\n#define ADD_OPERAND_HA ADD_OPERAND_REG(REGSET_ZR, REG_H_BASE, ctx->a);\n#define ADD_OPERAND_HD ADD_OPERAND_REG(REGSET_ZR, REG_H_BASE, ctx->d);\n#define ADD_OPERAND_HN ADD_OPERAND_REG(REGSET_ZR, REG_H_BASE, ctx->n);\n#define ADD_OPERAND_HM ADD_OPERAND_REG(REGSET_ZR, REG_H_BASE, ctx->m);\n#define ADD_OPERAND_HT ADD_OPERAND_REG(REGSET_ZR, REG_H_BASE, ctx->t);\n\n#define ADD_OPERAND_QA  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->a);\n#define ADD_OPERAND_QD  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->d);\n#define ADD_OPERAND_QDN ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->n);\n#define ADD_OPERAND_QN  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->n);\n#define ADD_OPERAND_QM  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->m);\n#define ADD_OPERAND_QS  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->s);\n#define ADD_OPERAND_QT  ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->t);\n#define ADD_OPERAND_QT1 ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->t);\n#define ADD_OPERAND_QT2 ADD_OPERAND_REG(REGSET_ZR, REG_Q_BASE, ctx->t2);\n\n#define ADD_OPERAND_SA  ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->a);\n#define ADD_OPERAND_SD  ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->d);\n#define ADD_OPERAND_SN  ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->n);\n#define ADD_OPERAND_SM  ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->m);\n#define ADD_OPERAND_ST  ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->t);\n#define ADD_OPERAND_ST1 ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->t);\n#define ADD_OPERAND_ST2 ADD_OPERAND_REG(REGSET_ZR, REG_S_BASE, ctx->t2);\n\n#define ADD_OPERAND_WA  ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->a);\n#define ADD_OPERAND_WD  ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->d);\n#define ADD_OPERAND_WDN ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->dn);\n#define ADD_OPERAND_WN  ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->n);\n#define ADD_OPERAND_WM  ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->m);\n#define ADD_OPERAND_WS  ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->s);\n#define ADD_OPERAND_WT \\\n\tADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->t); \\\n\t;\n#define ADD_OPERAND_WT1 ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->t);\n#define ADD_OPERAND_WT2 ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, ctx->t2);\n\n#define ADD_OPERAND_WS_PLUS_1 ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, (ctx->s + 1) % 32);\n#define ADD_OPERAND_WT_PLUS_1 ADD_OPERAND_REG(REGSET_ZR, REG_W_BASE, (ctx->t + 1) % 32);\n\n#define ADD_OPERAND_WD_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->d);\n#define ADD_OPERAND_WN_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->n);\n#define ADD_OPERAND_WM_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->m);\n#define ADD_OPERAND_WT_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->n);\n\n#define ADD_OPERAND_XA  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->a);\n#define ADD_OPERAND_XD  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->d);\n#define ADD_OPERAND_XDN ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->Rdn);\n#define ADD_OPERAND_XN  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->n);\n#define ADD_OPERAND_XM  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->m);\n#define ADD_OPERAND_XS  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->s);\n#define ADD_OPERAND_XT  ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->t);\n#define ADD_OPERAND_XT1 ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->t);\n#define ADD_OPERAND_XT2 ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, ctx->t2);\n\n#define ADD_OPERAND_XS_PLUS_1 ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, (ctx->s + 1) % 32);\n#define ADD_OPERAND_XT_PLUS_1 ADD_OPERAND_REG(REGSET_ZR, REG_X_BASE, (ctx->t + 1) % 32);\n\n#define ADD_OPERAND_XD_SP  ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->d);\n#define ADD_OPERAND_XN_SP  ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->n);\n#define ADD_OPERAND_XDN_SP ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->n);\n#define ADD_OPERAND_XM_SP  ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->m);\n#define ADD_OPERAND_XT_SP  ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->t);\n#define ADD_OPERAND_XT2_SP ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->t2);\n\n#define ADD_OPERAND_ZD ADD_OPERAND_REG(REGSET_ZR, REG_Z_BASE, ctx->d);\n#define ADD_OPERAND_ZM ADD_OPERAND_REG(REGSET_ZR, REG_Z_BASE, ctx->m);\n#define ADD_OPERAND_ZN ADD_OPERAND_REG(REGSET_ZR, REG_Z_BASE, ctx->n);\n#define ADD_OPERAND_ZT ADD_OPERAND_REG(REGSET_ZR, REG_Z_BASE, ctx->t);\n\n#define ADD_OPERAND_PRED_REG(REGNUM) ADD_OPERAND_REG(REGSET_ZR, REG_P_BASE, REGNUM);\n\n#define ADD_OPERAND_PRED_REG_T(REGNUM, ARR_SPEC) \\\n\tADD_OPERAND_PRED_REG(REGNUM); \\\n\tinstr->operands[i - 1].arrSpec = ARR_SPEC;\n\n#define ADD_OPERAND_PRED_REG_QUAL(REGNUM, QUALIFIER) \\\n\tADD_OPERAND_PRED_REG(REGNUM); \\\n\tinstr->operands[i - 1].pred_qual = QUALIFIER;\n\n/* indexed element */\n// <Pn>.<T>[<Wm>{, #<imm>}]\n#define ADD_INDEXED_ELEMENT(REGNUM, ARRSPEC, REGINDEX, IMM) \\\n\tinstr->operands[i].operandClass = INDEXED_ELEMENT; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, REG_P_BASE, (REGNUM)); \\\n\tinstr->operands[i].arrSpec = (ARRSPEC); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, REG_W_BASE, (REGINDEX)); \\\n\tinstr->operands[i].immediate = (IMM); \\\n\ti++\n\n/* register indirect adder */\n#define ADD_OPERAND_MEM_REG(REGSET, BASE, REGNUM) \\\n\tinstr->operands[i].operandClass = MEM_REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\ti++\n\n#define ADD_OPERAND_MEM_XN_SP ADD_OPERAND_MEM_REG(REGSET_SP, REG_X_BASE, ctx->n);\n\n/* general register indirect + offset adder */\n// [<Rn>{, #<imm>}]\n#define ADD_OPERAND_MEM_REG_OFFSET(REGSET, BASE, REGNUM, OFFSET) \\\n\tinstr->operands[i].operandClass = MEM_OFFSET; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\tinstr->operands[i].immediate = OFFSET; \\\n\tinstr->operands[i].signedImm = 1; \\\n\ti++;\n\n// [<Rn>.X{, #<imm>}]\n#define ADD_OPERAND_MEM_REG_OFFSET_T(REGSET, BASE, REGNUM, OFFSET, ARR_SPEC) \\\n\tinstr->operands[i].operandClass = MEM_OFFSET; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\tinstr->operands[i].immediate = OFFSET; \\\n\tinstr->operands[i].signedImm = 1; \\\n\ti++;\n\n// [<Rn>{, #<imm>, MUL VL}]\n#define ADD_OPERAND_MEM_REG_OFFSET_VL(REGSET, BASE, REGNUM, OFFSET) \\\n\tADD_OPERAND_MEM_REG_OFFSET(REGSET, BASE, REGNUM, OFFSET); \\\n\tinstr->operands[i - 1].mul_vl = 1;\n\n/* general mem post index */\n// [<Rn>], #<imm>\n#define ADD_OPERAND_MEM_POST_INDEX(REGSET, BASE, REGNUM, OFFSET) \\\n\tinstr->operands[i].operandClass = MEM_POST_IDX; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\tinstr->operands[i].immediate = OFFSET; \\\n\tinstr->operands[i].signedImm = 1;\n\n// [<Rn>],<Xm>\n#define ADD_OPERAND_MEM_POST_INDEX_REG(REGSET, BASE, REGNUM, REG_PIDX) \\\n\tinstr->operands[i].operandClass = MEM_POST_IDX; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, REG_X_BASE, REG_PIDX);\n\n/* mem pre index */\n// [<Rn>, #<simm>]\n#define ADD_OPERAND_MEM_PRE_INDEX(REGSET, BASE, REGNUM, OFFSET) \\\n\tinstr->operands[i].operandClass = MEM_PRE_IDX; \\\n\tinstr->operands[i].reg[0] = REG(REGSET, BASE, REGNUM); \\\n\tinstr->operands[i].immediate = OFFSET; \\\n\tinstr->operands[i].signedImm = 1;\n\n/* mem extended */\n// [<Rn>, <Rm>]\n// [<Xn|SP>,<Xm>{, LSL #0}] with optional LSL\n#define ADD_OPERAND_MEM_EXTENDED(BASE, REGNUM0, REGNUM1) \\\n\tinstr->operands[i].operandClass = MEM_EXTENDED; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_SP, REG_X_BASE, REGNUM0); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, BASE, REGNUM1); \\\n\ti++;\n\n#define ADD_OPERAND_XN_SP ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->n);\n#define ADD_OPERAND_XM_SP ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->m);\n#define ADD_OPERAND_XT_SP ADD_OPERAND_REG(REGSET_SP, REG_X_BASE, ctx->t);\n\n#define ADD_OPERAND_WD_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->d);\n#define ADD_OPERAND_WN_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->n);\n#define ADD_OPERAND_WM_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->m);\n#define ADD_OPERAND_WT_SP ADD_OPERAND_REG(REGSET_SP, REG_W_BASE, ctx->n);\n\n#define ADD_OPERAND_MEM_EXTENDED_T(BASE0, REGNUM0, BASE1, REGNUM1, ARR_SPEC) \\\n\tinstr->operands[i].operandClass = MEM_EXTENDED; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_SP, BASE0, REGNUM0); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, BASE1, REGNUM1); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_MEM_EXTENDED_T_SHIFT( \\\n    BASE0, REGNUM0, SZ0, BASE1, REGNUM1, SZ1, SHIFT_TYPE, SHIFT_AMT, SHIFT_USED) \\\n\tinstr->operands[i].operandClass = MEM_EXTENDED; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_SP, BASE0, REGNUM0); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, BASE1, REGNUM1); \\\n\tinstr->operands[i].arrSpec = SZ1; \\\n\tinstr->operands[i].shiftType = SHIFT_TYPE; \\\n\tinstr->operands[i].shiftValue = SHIFT_AMT; \\\n\tinstr->operands[i].shiftValueUsed = SHIFT_USED; \\\n\ti += 1;\n\n/* general immediate operand adder */\n#define ADD_OPERAND_IMM32(VALUE, SIGNED) \\\n\tinstr->operands[i].operandClass = IMM32; \\\n\tinstr->operands[i].signedImm = SIGNED; \\\n\tinstr->operands[i].immediate = VALUE; \\\n\ti++;\n\n#define ADD_OPERAND_IMM64(VALUE, SIGNED) \\\n\tinstr->operands[i].operandClass = IMM64; \\\n\tinstr->operands[i].signedImm = SIGNED; \\\n\tinstr->operands[i].immediate = VALUE; \\\n\ti++;\n\n#define ADD_OPERAND_FLOAT32(VALUE) \\\n\tinstr->operands[i].operandClass = FIMM32; \\\n\t*(float*)&(instr->operands[i].immediate) = VALUE; \\\n\ti++;\n\n#define ADD_OPERAND_CONST  ADD_OPERAND_IMM64(const_, 0)\n#define ADD_OPERAND_FBITS  ADD_OPERAND_IMM32(fbits, 0)\n#define ADD_OPERAND_FIMM   ADD_OPERAND_FLOAT32(fimm)\n#define ADD_OPERAND_IMM0   ADD_OPERAND_IMM32(0, 0)\n#define ADD_OPERAND_IMM1   ADD_OPERAND_IMM32(imm1, 0)\n#define ADD_OPERAND_IMM2   ADD_OPERAND_IMM32(imm2, 0)\n#define ADD_OPERAND_IMM6   ADD_OPERAND_IMM32(imm6, 0)\n#define ADD_OPERAND_IMM8   ADD_OPERAND_IMM32(imm8, 0)\n#define ADD_OPERAND_LSB    ADD_OPERAND_IMM32(lsb, 0)\n#define ADD_OPERAND_NZCV   ADD_OPERAND_IMM32(ctx->nzcv, 0)\n#define ADD_OPERAND_ROTATE ADD_OPERAND_IMM32(rotate, 0)\n#define ADD_OPERAND_WIDTH  ADD_OPERAND_IMM32(width, 0)\n\n//#define SEXT4(x) (x & 0x\n\n/* string immediate (like \"mul #0x12\") */\n#define ADD_OPERAND_STR_IMM(STRING, VALUE) \\\n\tinstr->operands[i].operandClass = STR_IMM; \\\n\tinstr->operands[i].immediate = VALUE; \\\n\tinstr->operands[i].signedImm = 0; \\\n\tstrcpy(instr->operands[i].name, STRING); \\\n\ti++;\n\n/* specialized immediate operands */\n#define ADD_OPERAND_NAME(VALUE) \\\n\tinstr->operands[i].operandClass = NAME; \\\n\tstrcpy(instr->operands[i].name, VALUE); \\\n\ti++;\n\n/* multi reg stuff, like {v0.b, v1.b} */\n#define ADD_OPERAND_MULTIREG_1(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tinstr->operands[i].operandClass = MULTI_REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, REG_BASE, REGNUM); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_MULTIREG_2(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tinstr->operands[i].operandClass = MULTI_REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, REG_BASE, REGNUM); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, REG_BASE, (REGNUM + 1) % 32); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_MULTIREG_3(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tinstr->operands[i].operandClass = MULTI_REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, REG_BASE, REGNUM); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, REG_BASE, (REGNUM + 1) % 32); \\\n\tinstr->operands[i].reg[2] = REG(REGSET_ZR, REG_BASE, (REGNUM + 2) % 32); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_MULTIREG_4(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tinstr->operands[i].operandClass = MULTI_REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, REG_BASE, REGNUM); \\\n\tinstr->operands[i].reg[1] = REG(REGSET_ZR, REG_BASE, (REGNUM + 1) % 32); \\\n\tinstr->operands[i].reg[2] = REG(REGSET_ZR, REG_BASE, (REGNUM + 2) % 32); \\\n\tinstr->operands[i].reg[3] = REG(REGSET_ZR, REG_BASE, (REGNUM + 3) % 32); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_MULTIREG_1_LANE(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tADD_OPERAND_MULTIREG_1(REG_BASE, ARR_SPEC, REGNUM); \\\n\tinstr->operands[i - 1].laneUsed = 1; \\\n\tinstr->operands[i - 1].lane = ctx->index;\n\n#define ADD_OPERAND_MULTIREG_2_LANE(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tADD_OPERAND_MULTIREG_2(REG_BASE, ARR_SPEC, REGNUM); \\\n\tinstr->operands[i - 1].laneUsed = 1; \\\n\tinstr->operands[i - 1].lane = ctx->index;\n\n#define ADD_OPERAND_MULTIREG_3_LANE(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tADD_OPERAND_MULTIREG_3(REG_BASE, ARR_SPEC, REGNUM) \\\n\tinstr->operands[i - 1].laneUsed = 1; \\\n\tinstr->operands[i - 1].lane = ctx->index;\n\n#define ADD_OPERAND_MULTIREG_4_LANE(REG_BASE, ARR_SPEC, REGNUM) \\\n\t; \\\n\tADD_OPERAND_MULTIREG_4(REG_BASE, ARR_SPEC, REGNUM) \\\n\tinstr->operands[i - 1].laneUsed = 1; \\\n\tinstr->operands[i - 1].lane = ctx->index;\n\n/* v register plus ARRANGEMENT specifier: {1,2,4,8,16} x {b,h,s,d,q} */\n#define ADD_OPERAND_REG_T(BASE, ARR_SPEC, REGNUM) \\\n\tinstr->operands[i].operandClass = REG; \\\n\tinstr->operands[i].reg[0] = REG(REGSET_ZR, BASE, REGNUM); \\\n\tinstr->operands[i].arrSpec = ARR_SPEC; \\\n\ti++;\n\n#define ADD_OPERAND_VREG_T(REGNUM, ARR_SPEC) ADD_OPERAND_REG_T(REG_V_BASE, ARR_SPEC, REGNUM)\n\n#define ADD_OPERAND_ZREG_T(REGNUM, ARR_SPEC) ADD_OPERAND_REG_T(REG_Z_BASE, ARR_SPEC, REGNUM)\n\n/* and with lane */\n#define ADD_OPERAND_VREG_T_LANE(REGNUM, ARR_SPEC, INDEX_VALUE) \\\n\tADD_OPERAND_VREG_T(REGNUM, ARR_SPEC) \\\n\tinstr->operands[i - 1].lane = INDEX_VALUE; \\\n\tinstr->operands[i - 1].laneUsed = 1;\n\n#define ADD_OPERAND_ZREG_T_LANE(REGNUM, ARR_SPEC, INDEX_VALUE) \\\n\tADD_OPERAND_ZREG_T(REGNUM, ARR_SPEC) \\\n\tinstr->operands[i - 1].lane = INDEX_VALUE; \\\n\tinstr->operands[i - 1].laneUsed = 1;\n\n/* */\n#define ADD_OPERAND_COND \\\n\tinstr->operands[i].operandClass = CONDITION; \\\n\tinstr->operands[i].cond = table_cond[ctx->condition]; \\\n\ti++;\n\n#define ADD_OPERAND_COND_NEG \\\n\tinstr->operands[i].operandClass = CONDITION; \\\n\tinstr->operands[i].cond = table_cond_neg[ctx->condition]; \\\n\ti++;\n\n#define ADD_OPERAND_LABEL \\\n\tinstr->operands[i].operandClass = LABEL; \\\n\tinstr->operands[i].immediate = eaddr; \\\n\ti++;\n\n#define ADD_OPERAND_SYSTEMREG_IMPL_SPEC(SR) \\\n\tinstr->operands[i].operandClass = IMPLEMENTATION_SPECIFIC; \\\n\tinstr->operands[i].implspec[0] = ctx->sys_op0; \\\n\tinstr->operands[i].implspec[1] = ctx->sys_op1; \\\n\tinstr->operands[i].implspec[2] = ctx->sys_crn; \\\n\tinstr->operands[i].implspec[3] = ctx->sys_crm; \\\n\tinstr->operands[i].implspec[4] = ctx->sys_op2; \\\n\tinstr->operands[i].sysreg = (SR); \\\n\ti++;\n\n#define ADD_OPERAND_SYSTEMREG(R) \\\n\tinstr->operands[i].operandClass = SYS_REG; \\\n\tinstr->operands[i].implspec[0] = ctx->sys_op0; \\\n\tinstr->operands[i].implspec[1] = ctx->sys_op1; \\\n\tinstr->operands[i].implspec[2] = ctx->sys_crn; \\\n\tinstr->operands[i].implspec[3] = ctx->sys_crm; \\\n\tinstr->operands[i].implspec[4] = ctx->sys_op2; \\\n\tinstr->operands[i].sysreg = (R); \\\n\ti++;\n\n#define ADD_OPERAND_SYSTEMREG_SENSE \\\n\t{ \\\n\t\tSystemReg sr = ((ctx->sys_op0 << 14) | (ctx->sys_op1 << 11) | (ctx->sys_crn << 7) | \\\n\t\t                (ctx->sys_crm << 3) | ctx->sys_op2); \\\n\t\tconst char* name = get_system_register_name(sr); \\\n\t\tif (name[0]) \\\n\t\t{ \\\n\t\t\tADD_OPERAND_SYSTEMREG(sr); \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tADD_OPERAND_SYSTEMREG_IMPL_SPEC(sr); \\\n\t\t} \\\n\t}\n\n#define ADD_OPERAND_PATTERN \\\n\tif (ctx->pattern > 0b1101 && ctx->pattern < 0b11101) \\\n\t{ \\\n\t\tADD_OPERAND_IMM32(ctx->pattern, 0); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tADD_OPERAND_NAME(pattern_lookup(ctx->pattern, ctx->imm)); \\\n\t}\n\n/* SME */\n#define ADD_OPERAND_SME_TILE(TILE_NUM, SLICE_INDICATOR, ARRSPEC, BASEREG, OFFSET) \\\n\tinstr->operands[i].operandClass = SME_TILE; \\\n\tinstr->operands[i].tile = (TILE_NUM); \\\n\tinstr->operands[i].slice = (SLICE_INDICATOR); \\\n\tinstr->operands[i].arrSpec = (ARRSPEC); \\\n\tinstr->operands[i].reg[0] = (BASEREG); \\\n\tinstr->operands[i].immediate = (OFFSET); \\\n\tinstr->operands[i].signedImm = 1; \\\n\ti++;\n\n#define ADD_OPERAND_ACCUM_ARRAY(BASEREG, OFFSET) \\\n\tinstr->operands[i].operandClass = ACCUM_ARRAY; \\\n\tinstr->operands[i].reg[0] = (BASEREG); \\\n\tinstr->operands[i].immediate = (OFFSET); \\\n\ti++;\n\n//-----------------------------------------------------------------------------\n// register base lookups\n//-----------------------------------------------------------------------------\n\nunsigned rwwwx_0123x_reg(int x, int r)\n{\n\tif ((x & 0b01111) == 0b00000)\n\t\treturn 0;  // x0000 RESERVED\n\tif ((x & 0b00001) == 0b00001)\n\t\treturn REG_W_BASE;  // xxxx1 W\n\tif ((x & 0b00011) == 0b00010)\n\t\treturn REG_W_BASE;  // xxx10 W\n\tif ((x & 0b00111) == 0b00100)\n\t\treturn REG_W_BASE;  // xx100 W\n\tif ((x & 0b01111) == 0b01000)\n\t\treturn REG_X_BASE;  // x1000 X\n\treturn 0;\n}\n\nunsigned rbhsdq_5bit_reg(unsigned key)\n{\n\t// if((key & 0b01111) == 0b00000) return 0;\t\t\t// x0000 RESERVED\n\tif (key == 0)\n\t\treturn 0;  // x0000 RESERVED\n\tif ((key & 0b00001) == 0b00001)\n\t\treturn REG_B_BASE;  // xxxx1 B\n\tif ((key & 0b00011) == 0b00010)\n\t\treturn REG_H_BASE;  // xxx10 H\n\tif ((key & 0b00111) == 0b00100)\n\t\treturn REG_S_BASE;  // xx100 S\n\tif ((key & 0b01111) == 0b01000)\n\t\treturn REG_D_BASE;  // xx100 D\n\tif ((key & 0b11111) == 0b10000)\n\t\treturn REG_Q_BASE;  // xx100 Q\n\treturn 0;\n}\n\nunsigned wwwx_0123_reg(unsigned size)\n{\n\tif (size == 0b11)\n\t\treturn REG_X_BASE;\n\treturn REG_W_BASE;\n}\n\nunsigned sd_01_reg(int v)\n{\n\tswitch (v & 1)\n\t{\n\tcase 0:\n\t\treturn REG_S_BASE;\n\tcase 1:\n\t\treturn REG_D_BASE;\n\t}\n\treturn 0;\n}\n\n// <V><d>,<V><n>,<V><m>\nunsigned bhsd_0123_reg(int v)\n{\n\tswitch (v & 3)\n\t{\n\tcase 0:\n\t\treturn REG_B_BASE;\n\tcase 1:\n\t\treturn REG_H_BASE;\n\tcase 2:\n\t\treturn REG_S_BASE;\n\tcase 3:\n\t\treturn REG_D_BASE;\n\t}\n\treturn 0;\n}\n\nunsigned rsdr_0123_reg(int v)\n{\n\tswitch (v & 3)\n\t{\n\tcase 1:\n\t\treturn REG_S_BASE;\n\tcase 2:\n\t\treturn REG_D_BASE;\n\t}\n\treturn 0;\n}\n\nunsigned hsdr_0123_reg(int v)\n{\n\tswitch (v & 3)\n\t{\n\tcase 0:\n\t\treturn REG_H_BASE;\n\tcase 1:\n\t\treturn REG_S_BASE;\n\tcase 2:\n\t\treturn REG_D_BASE;\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\nunsigned rhsd_0123_reg(int v)\n{\n\tif (v == 1)\n\t\treturn REG_H_BASE;\n\tif (v == 2)\n\t\treturn REG_S_BASE;\n\treturn 0;\n}\n\nunsigned rhsd_0123x_reg(int v)\n{\n\t// if(x & 0xE == 0) return 0;\t\t// 000x\n\tif ((v & 0xE) == 2)\n\t\treturn REG_H_BASE;  // 001x\n\tif ((v & 0xC) == 4)\n\t\treturn REG_S_BASE;  // 01xx\n\tif ((v & 0x8) == 8)\n\t\treturn REG_D_BASE;  // 1xxx\n\treturn 0;\n}\n\nunsigned rbhsd_0123x_reg(int v)\n{  // 0000 RESERVED\n\tif (v == 1)\n\t\treturn REG_B_BASE;  // 0001 B\n\tif ((v & 0b1110) == 0b0010)\n\t\treturn REG_H_BASE;  // 001x H\n\tif ((v & 0b1100) == 0b0100)\n\t\treturn REG_S_BASE;  // 01xx S\n\tif ((v & 0b1000) == 0b1000)\n\t\treturn REG_D_BASE;  // 1xxx D\n\treturn 0;\n}\n\nunsigned rhsdr_0123x_reg(int v)\n{\n\tif (v == 1)\n\t\treturn REG_H_BASE;\n\tif ((v & 0b1110) == 0b0010)\n\t\treturn REG_S_BASE;\n\tif ((v & 0b1100) == 0b0100)\n\t\treturn REG_D_BASE;\n\treturn 0;\n}\n\n#define OPTIONAL_SHIFT_AMOUNT \\\n\tif (!(ctx->shift_type == 1 && ctx->shift_amount == 0)) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftType = ctx->shift_type; \\\n\t\tinstr->operands[i - 1].shiftValue = ctx->shift_amount; \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 0; \\\n\t}\n\n#define OPTIONAL_EXTEND_AMOUNT(SPECIAL_LSL) \\\n\tinstr->operands[i - 1].shiftType = ctx->extend_type; \\\n\tinstr->operands[i - 1].shiftValue = ctx->shift; \\\n\tif (ctx->option == SPECIAL_LSL) \\\n\t{ \\\n\t\tif (ctx->shift) \\\n\t\t{ \\\n\t\t\tinstr->operands[i - 1].shiftType = ShiftType_LSL; \\\n\t\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t\t} \\\n\t\telse \\\n\t\t\tinstr->operands[i - 1].shiftType = ShiftType_NONE; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftValueUsed = ctx->shift ? 1 : 0; \\\n\t}\n\n#define OPTIONAL_EXTEND_AMOUNT_0 \\\n\tinstr->operands[i - 1].shiftType = ctx->extend_type; \\\n\tinstr->operands[i - 1].shiftValue = 0; \\\n\tinstr->operands[i - 1].shiftValueUsed = ctx->S ? 1 : 0;\n\n#define OPTIONAL_EXTEND_LSL0 \\\n\tif (ctx->S) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftType = ShiftType_LSL; \\\n\t\tinstr->operands[i - 1].shiftValue = 0; \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t} \\\n\telse \\\n\t\tinstr->operands[i - 1].shiftType = ShiftType_NONE;\n\n#define OPTIONAL_EXTEND_AMOUNT_32(EXCEPTIONAL_REG) \\\n\tShiftType st = DecodeRegExtend(ctx->option); \\\n\tif (st == ShiftType_UXTW) \\\n\t{ \\\n\t\tif (EXCEPTIONAL_REG == 31 && ctx->imm3 != 0) \\\n\t\t{ \\\n\t\t\tst = ShiftType_LSL; \\\n\t\t} \\\n\t} \\\n\tinstr->operands[i - 1].shiftType = st; \\\n\tinstr->operands[i - 1].shiftValue = ctx->shift; \\\n\tif (ctx->shift) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t}\n\n#define OPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR0 \\\n\tShiftType st = DecodeRegExtend(ctx->option); \\\n\tif (ctx->Rn == 31 && ctx->option == 3) \\\n\t{ \\\n\t\tst = ShiftType_LSL; \\\n\t\tif (ctx->imm3 == 0) \\\n\t\t\tst = ShiftType_NONE; \\\n\t} \\\n\tif (st != ShiftType_NONE) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftType = st; \\\n\t\tinstr->operands[i - 1].shiftValue = ctx->shift; \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t} \\\n\tif (!ctx->shift) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 0; \\\n\t}\n\n#define OPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR1 \\\n\tShiftType st = DecodeRegExtend(ctx->option); \\\n\tif ((ctx->Rd == 31 || ctx->Rn == 31) && ctx->option == 3) \\\n\t{ \\\n\t\tst = ShiftType_LSL; \\\n\t\tif (ctx->imm3 == 0) \\\n\t\t\tst = ShiftType_NONE; \\\n\t} \\\n\tif (st != ShiftType_NONE) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftType = st; \\\n\t\tinstr->operands[i - 1].shiftValue = ctx->shift; \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 1; \\\n\t} \\\n\tif (!ctx->shift) \\\n\t{ \\\n\t\tinstr->operands[i - 1].shiftValueUsed = 0; \\\n\t}\n\n#define LAST_OPERAND_SHIFT(SHIFT_TYPE, SHIFT_VALUE) \\\n\tinstr->operands[i - 1].shiftType = SHIFT_TYPE; \\\n\tinstr->operands[i - 1].shiftValue = SHIFT_VALUE; \\\n\tinstr->operands[i - 1].shiftValueUsed = 1;\n\n#define LAST_OPERAND_LSL_12 LAST_OPERAND_SHIFT(ShiftType_LSL, 12)\n\n#define ADD_OPERAND_OPTIONAL_PATTERN_MUL \\\n\t{ \\\n\t\tbool print_mul = ctx->imm != 1; \\\n\t\tbool print_pattern = print_mul || ctx->pattern != 0x1f; \\\n\t\tif (print_pattern) \\\n\t\t{ \\\n\t\t\tADD_OPERAND_PATTERN; \\\n\t\t} \\\n\t\tif (print_mul) \\\n\t\t{ \\\n\t\t\tADD_OPERAND_STR_IMM(\"mul\", ctx->imm); \\\n\t\t} \\\n\t}\n\n#define ADD_OPERAND_OPTIONAL_PATTERN \\\n\tif (ctx->pattern != 0x1f) \\\n\t{ \\\n\t\tADD_OPERAND_PATTERN; \\\n\t}\n\n/* convert the result of pcode execution to a human-friendly list of operands */\nint decode_scratchpad(context* ctx, Instruction* instr)\n{\n\tArrangementSpec arr_spec = _1B;\n\n\t/* index of operand array, as it's built */\n\tint i = 0;\n\n\t/* populate operation */\n\tinstr->operation = enc_to_oper(instr->encoding);\n\n\t/* default to 0 operands */\n\tInstructionOperand zero = {0};\n\tfor (uint32_t ii = 0; ii < MAX_OPERANDS; ++ii)\n\t\tinstr->operands[ii] = zero;\n\n\tswitch (instr->encoding)\n\t{\n\t/* instrucitons with no operands */\n\tcase ENC_AUTIA1716_HI_HINTS:\n\tcase ENC_AUTIASP_HI_HINTS:\n\tcase ENC_AUTIAZ_HI_HINTS:\n\tcase ENC_AUTIB1716_HI_HINTS:\n\tcase ENC_AUTIBSP_HI_HINTS:\n\tcase ENC_AUTIBZ_HI_HINTS:\n\tcase ENC_AXFLAG_M_PSTATE:\n\tcase ENC_CFINV_M_PSTATE:\n\tcase ENC_CSDB_HI_HINTS:\n\tcase ENC_DGH_HI_HINTS:\n\tcase ENC_DRPS_64E_BRANCH_REG:\n\tcase ENC_ERETAA_64E_BRANCH_REG:\n\tcase ENC_ERETAB_64E_BRANCH_REG:\n\tcase ENC_ERET_64E_BRANCH_REG:\n\tcase ENC_ESB_HI_HINTS:\n\tcase ENC_NOP_HI_HINTS:\n\tcase ENC_PACIA1716_HI_HINTS:\n\tcase ENC_PACIASP_HI_HINTS:\n\tcase ENC_PACIAZ_HI_HINTS:\n\tcase ENC_PACIB1716_HI_HINTS:\n\tcase ENC_PACIBSP_HI_HINTS:\n\tcase ENC_PACIBZ_HI_HINTS:\n\tcase ENC_RETAA_64E_BRANCH_REG:\n\tcase ENC_RETAB_64E_BRANCH_REG:\n\tcase ENC_SEVL_HI_HINTS:\n\tcase ENC_SEV_HI_HINTS:\n\tcase ENC_WFE_HI_HINTS:\n\tcase ENC_WFI_HI_HINTS:\n\tcase ENC_XAFLAG_M_PSTATE:\n\tcase ENC_XPACLRI_HI_HINTS:\n\tcase ENC_YIELD_HI_HINTS:\n\tcase ENC_SETFFR_F_:\n\t// case ENC_SSBB_ONLY_BARRIERS:\n\t// case ENC_PSSBB_ONLY_BARRIERS:\n\tcase ENC_SB_ONLY_BARRIERS:\n\tcase ENC_TCOMMIT_ONLY_BARRIERS:\n\tcase ENC_PSSBB_DSB_BO_BARRIERS:\n\tcase ENC_SSBB_DSB_BO_BARRIERS:\n\t\tbreak;\n\tcase ENC_WFET_ONLY_SYSTEMINSTRSWITHREG:\n\tcase ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG:\n\t{\n\t\t// <Xt>\n\t\tADD_OPERAND_XD;\n\t\tbreak;\n\t}\n\tcase ENC_PSB_HC_HINTS:\n\tcase ENC_TSB_HC_HINTS:\n\t{\n\t\tADD_OPERAND_NAME(\"csync\");\n\t\tbreak;\n\t}\n\tcase ENC_LDR_B_LDST_IMMPRE:\n\tcase ENC_STR_B_LDST_IMMPRE:\n\t{\n\t\t// <Bt>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_B_LDST_REGOFF:\n\tcase ENC_STR_B_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Bt>, [<Xn|SP>, (<Wm>|<Xm>),<extend>{<amount>}]\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tif (ctx->option & 1)\n\t\t{\n\t\t\tOPTIONAL_EXTEND_AMOUNT_32(3);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR1;\n\t\t}\n\t\tif (ctx->S)\n\t\t{\n\t\t\tOPTIONAL_EXTEND_AMOUNT_0\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_LDR_BL_LDST_REGOFF:\n\tcase ENC_STR_BL_LDST_REGOFF:\n\t{\n\t\t// <Bt>, [<Xn|SP>,<Xm>{, LSL #0}]\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_LSL0;\n\t\tbreak;\n\t}\n\tcase ENC_LDR_B_LDST_IMMPOST:\n\tcase ENC_STR_B_LDST_IMMPOST:\n\t{\n\t\t// <Bt>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_B_LDST_POS:\n\tcase ENC_STR_B_LDST_POS:\n\t{\n\t\t// <Bt>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDUR_B_LDST_UNSCALED:\n\tcase ENC_STUR_B_LDST_UNSCALED:\n\t{\n\t\t// <Bt>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_BT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_MOVI_ASIMDIMM_D_DS:  // display as hex\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Dd>, #<imm64>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->rd);\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_D_FLOATIMM:  // display as float\n\t{\n\t\tfloat fimm = table_imm8_to_float[ctx->imm8];\n\t\t// <Dd>, #<fimm>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_FABS_D_FLOATDP1:\n\tcase ENC_FMOV_D_FLOATDP1:\n\tcase ENC_FNEG_D_FLOATDP1:\n\tcase ENC_FRINT32X_D_FLOATDP1:\n\tcase ENC_FRINT32Z_D_FLOATDP1:\n\tcase ENC_FRINT64X_D_FLOATDP1:\n\tcase ENC_FRINT64Z_D_FLOATDP1:\n\tcase ENC_FRINTA_D_FLOATDP1:\n\tcase ENC_FRINTI_D_FLOATDP1:\n\tcase ENC_FRINTM_D_FLOATDP1:\n\tcase ENC_FRINTN_D_FLOATDP1:\n\tcase ENC_FRINTP_D_FLOATDP1:\n\tcase ENC_FRINTX_D_FLOATDP1:\n\tcase ENC_FRINTZ_D_FLOATDP1:\n\tcase ENC_FSQRT_D_FLOATDP1:\n\t{\n\t\t// <Dd>,<Dn>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_DN;\n\t\tbreak;\n\t}\n\tcase ENC_FADD_D_FLOATDP2:\n\tcase ENC_FDIV_D_FLOATDP2:\n\tcase ENC_FMAXNM_D_FLOATDP2:\n\tcase ENC_FMAX_D_FLOATDP2:\n\tcase ENC_FMINNM_D_FLOATDP2:\n\tcase ENC_FMIN_D_FLOATDP2:\n\tcase ENC_FMUL_D_FLOATDP2:\n\tcase ENC_FNMUL_D_FLOATDP2:\n\tcase ENC_FSUB_D_FLOATDP2:\n\t{\n\t\t// <Dd>,<Dn>,<Dm>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_DM;\n\t\tbreak;\n\t}\n\tcase ENC_FMADD_D_FLOATDP3:\n\tcase ENC_FMSUB_D_FLOATDP3:\n\tcase ENC_FNMADD_D_FLOATDP3:\n\tcase ENC_FNMSUB_D_FLOATDP3:\n\t{\n\t\t// <Dd>,<Dn>,<Dm>,<Da>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_DM;\n\t\tADD_OPERAND_DA;\n\t\tbreak;\n\t}\n\tcase ENC_FCSEL_D_FLOATSEL:\n\t{\n\t\t// <Dd>,<Dn>,<Dm>,<cond>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_DM;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_DH_FLOATDP1:\n\t{\n\t\t// <Dd>,<Hn>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_HN;\n\t\tbreak;\n\t}\n\tcase ENC_SADDV_R_P_Z_:\n\tcase ENC_UADDV_R_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Dd>,<Pg>,<Zn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_DS_FLOATDP1:\n\t{\n\t\t// <Dd>,<Sn>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_SN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_D32_FLOAT2INT:\n\tcase ENC_UCVTF_D32_FLOAT2INT:\n\t{\n\t\t// <Dd>,<Wn>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_D32_FLOAT2FIX:\n\tcase ENC_UCVTF_D32_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Dd>,<Wn>, #<fbits>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_D64_FLOAT2INT:\n\tcase ENC_SCVTF_D64_FLOAT2INT:\n\tcase ENC_UCVTF_D64_FLOAT2INT:\n\t{\n\t\t// <Dd>,<Xn>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_D64_FLOAT2FIX:\n\tcase ENC_UCVTF_D64_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Dd>,<Xn>, #<fbits>\n\t\tADD_OPERAND_REG(REGSET_ZR, REG_D_BASE, ctx->d);\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_DZ_FLOATCMP:\n\tcase ENC_FCMP_DZ_FLOATCMP:\n\t{\n\t\t// <Dn>, #0.0\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_D_FLOATCMP:\n\tcase ENC_FCMP_D_FLOATCMP:\n\t{\n\t\t// <Dn>,<Dm>\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_DM;\n\t\tbreak;\n\t}\n\tcase ENC_FCCMPE_D_FLOATCCMP:\n\tcase ENC_FCCMP_D_FLOATCCMP:\n\t{\n\t\t// <Dn>,<Dm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_DM;\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_LDP_D_LDSTPAIR_PRE:\n\tcase ENC_STP_D_LDSTPAIR_PRE:\n\t{\n\t\t// <Dt1>,<Dt2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_DT1;\n\t\tADD_OPERAND_DT2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_D_LDSTPAIR_POST:\n\tcase ENC_STP_D_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Dt1>,<Dt2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_DT1;\n\t\tADD_OPERAND_DT2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDNP_D_LDSTNAPAIR_OFFS:\n\tcase ENC_LDP_D_LDSTPAIR_OFF:\n\tcase ENC_STNP_D_LDSTNAPAIR_OFFS:\n\tcase ENC_STP_D_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Dt1>,<Dt2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_DT1;\n\t\tADD_OPERAND_DT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_D_LDST_IMMPRE:\n\tcase ENC_STR_D_LDST_IMMPRE:\n\t{\n\t\t// <Dt>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_D_LDST_REGOFF:\n\tcase ENC_STR_D_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Dt>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_D_LDST_IMMPOST:\n\tcase ENC_STR_D_LDST_IMMPOST:\n\t{\n\t\t// <Dt>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_D_LDST_POS:\n\tcase ENC_STR_D_LDST_POS:\n\t{\n\t\t// <Dt>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDUR_D_LDST_UNSCALED:\n\tcase ENC_STUR_D_LDST_UNSCALED:\n\t{\n\t\t// <Dt>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_D_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <Dt>,<label>\n\t\tADD_OPERAND_DT;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_H_FLOATIMM:\n\t{\n\t\tfloat fimm = table_imm8_to_float[ctx->imm8];\n\t\t// <Hd>, #<fimm>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_HD_FLOATDP1:\n\t{\n\t\t// <Hd>,<Dn>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_DN;\n\t\tbreak;\n\t}\n\tcase ENC_FABS_H_FLOATDP1:\n\tcase ENC_FCVTAS_ASISDMISCFP16_R:\n\tcase ENC_FCVTAU_ASISDMISCFP16_R:\n\tcase ENC_FCVTMS_ASISDMISCFP16_R:\n\tcase ENC_FCVTMU_ASISDMISCFP16_R:\n\tcase ENC_FCVTNS_ASISDMISCFP16_R:\n\tcase ENC_FCVTNU_ASISDMISCFP16_R:\n\tcase ENC_FCVTPS_ASISDMISCFP16_R:\n\tcase ENC_FCVTPU_ASISDMISCFP16_R:\n\tcase ENC_FCVTZS_ASISDMISCFP16_R:\n\tcase ENC_FCVTZU_ASISDMISCFP16_R:\n\tcase ENC_FMOV_H_FLOATDP1:\n\tcase ENC_FNEG_H_FLOATDP1:\n\tcase ENC_FRECPE_ASISDMISCFP16_R:\n\tcase ENC_FRECPX_ASISDMISCFP16_R:\n\tcase ENC_FRINTA_H_FLOATDP1:\n\tcase ENC_FRINTI_H_FLOATDP1:\n\tcase ENC_FRINTM_H_FLOATDP1:\n\tcase ENC_FRINTN_H_FLOATDP1:\n\tcase ENC_FRINTP_H_FLOATDP1:\n\tcase ENC_FRINTX_H_FLOATDP1:\n\tcase ENC_FRINTZ_H_FLOATDP1:\n\tcase ENC_FRSQRTE_ASISDMISCFP16_R:\n\tcase ENC_FSQRT_H_FLOATDP1:\n\tcase ENC_SCVTF_ASISDMISCFP16_R:\n\tcase ENC_UCVTF_ASISDMISCFP16_R:\n\t{\n\t\t// <Hd>,<Hn>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tbreak;\n\t}\n\tcase ENC_FCMEQ_ASISDMISCFP16_FZ:\n\tcase ENC_FCMGE_ASISDMISCFP16_FZ:\n\tcase ENC_FCMGT_ASISDMISCFP16_FZ:\n\tcase ENC_FCMLE_ASISDMISCFP16_FZ:\n\tcase ENC_FCMLT_ASISDMISCFP16_FZ:\n\t{\n\t\t// <Hd>,<Hn>, #0.0\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FABD_ASISDSAMEFP16_ONLY:\n\tcase ENC_FACGE_ASISDSAMEFP16_ONLY:\n\tcase ENC_FACGT_ASISDSAMEFP16_ONLY:\n\tcase ENC_FADD_H_FLOATDP2:\n\tcase ENC_FCMEQ_ASISDSAMEFP16_ONLY:\n\tcase ENC_FCMGE_ASISDSAMEFP16_ONLY:\n\tcase ENC_FCMGT_ASISDSAMEFP16_ONLY:\n\tcase ENC_FDIV_H_FLOATDP2:\n\tcase ENC_FMAXNM_H_FLOATDP2:\n\tcase ENC_FMAX_H_FLOATDP2:\n\tcase ENC_FMINNM_H_FLOATDP2:\n\tcase ENC_FMIN_H_FLOATDP2:\n\tcase ENC_FMULX_ASISDSAMEFP16_ONLY:\n\tcase ENC_FMUL_H_FLOATDP2:\n\tcase ENC_FNMUL_H_FLOATDP2:\n\tcase ENC_FRECPS_ASISDSAMEFP16_ONLY:\n\tcase ENC_FRSQRTS_ASISDSAMEFP16_ONLY:\n\tcase ENC_FSUB_H_FLOATDP2:\n\t{\n\t\t// <Hd>,<Hn>,<Hm>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_HM;\n\t\tbreak;\n\t}\n\tcase ENC_FMADD_H_FLOATDP3:\n\tcase ENC_FMSUB_H_FLOATDP3:\n\tcase ENC_FNMADD_H_FLOATDP3:\n\tcase ENC_FNMSUB_H_FLOATDP3:\n\t{\n\t\t// <Hd>,<Hn>,<Hm>,<Ha>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_HM;\n\t\tADD_OPERAND_HA;\n\t\tbreak;\n\t}\n\tcase ENC_FCSEL_H_FLOATSEL:\n\t{\n\t\t// <Hd>,<Hn>,<Hm>,<cond>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_HM;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_ASISDELEM_RH_H:\n\tcase ENC_FMLS_ASISDELEM_RH_H:\n\tcase ENC_FMULX_ASISDELEM_RH_H:\n\tcase ENC_FMUL_ASISDELEM_RH_H:\n\t{\n\t\t// <Hd>,<Hn>,<Vm>.H[<index>]\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_BFCVT_BS_FLOATDP1:\n\tcase ENC_FCVT_HS_FLOATDP1:\n\t{\n\t\t// <Hd>,<Sn>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_SN;\n\t\tbreak;\n\t}\n\tcase ENC_BFCVT_Z_P_Z_S2BF:\n\tcase ENC_BFCVTNT_Z_P_Z_S2BF:\n\t{\n\t\t// <Zd>.H,<Pg>/M,<Zn>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_BFMOPA_ZA32_PP_ZZ_:\n\tcase ENC_BFMOPS_ZA32_PP_ZZ_:\n\tcase ENC_FMOPA_ZA32_PP_ZZ_16:\n\tcase ENC_FMOPA_ZA_PP_ZZ_32:\n\tcase ENC_FMOPA_ZA_PP_ZZ_64:\n\tcase ENC_FMOPS_ZA32_PP_ZZ_16:\n\tcase ENC_FMOPS_ZA_PP_ZZ_32:\n\tcase ENC_FMOPS_ZA_PP_ZZ_64:\n\tcase ENC_UMOPA_ZA_PP_ZZ_32:\n\tcase ENC_UMOPA_ZA_PP_ZZ_64:\n\tcase ENC_UMOPS_ZA_PP_ZZ_32:\n\tcase ENC_UMOPS_ZA_PP_ZZ_64:\n\tcase ENC_USMOPA_ZA_PP_ZZ_32:\n\tcase ENC_USMOPA_ZA_PP_ZZ_64:\n\tcase ENC_USMOPS_ZA_PP_ZZ_32:\n\tcase ENC_USMOPS_ZA_PP_ZZ_64:\n\tcase ENC_SMOPA_ZA_PP_ZZ_32:\n\tcase ENC_SMOPA_ZA_PP_ZZ_64:\n\tcase ENC_SMOPS_ZA_PP_ZZ_32:\n\tcase ENC_SMOPS_ZA_PP_ZZ_64:\n\tcase ENC_SUMOPA_ZA_PP_ZZ_32:\n\tcase ENC_SUMOPA_ZA_PP_ZZ_64:\n\tcase ENC_SUMOPS_ZA_PP_ZZ_32:\n\tcase ENC_SUMOPS_ZA_PP_ZZ_64:\n\t{\n\t\t// BFMOPA <ZAda>.S, <Pn>/M, <Pm>/M, <Zn>.H, <Zm>.H\n\t\t// BFMOPS <ZAda>.S, <Pn>/M, <Pm>/M, <Zn>.H, <Zm>.H\n\t\tArrangementSpec as0=ARRSPEC_NONE, as1=ARRSPEC_NONE;\n\n\t\tswitch(instr->encoding)\n\t\t{\n\t\t\tcase ENC_BFMOPA_ZA32_PP_ZZ_:\n\t\t\tcase ENC_BFMOPS_ZA32_PP_ZZ_:\n\t\t\t\tas0 = _1S; as1 = _1H; break;\n\t\t\tcase ENC_FMOPA_ZA_PP_ZZ_32:\n\t\t\tcase ENC_FMOPS_ZA_PP_ZZ_32:\n\t\t\t\tas0 = _1S; as1 = _1S; break;\n\t\t\tcase ENC_FMOPA_ZA_PP_ZZ_64:\n\t\t\tcase ENC_FMOPS_ZA_PP_ZZ_64:\n\t\t\t\tas0 = _1D; as1 = _1D; break;\n\t\t\tcase ENC_FMOPA_ZA32_PP_ZZ_16:\n\t\t\tcase ENC_FMOPS_ZA32_PP_ZZ_16:\n\t\t\t\tas0 = _1S; as1 = _1H; break;\n\t\t\tcase ENC_USMOPS_ZA_PP_ZZ_64:\n\t\t\tcase ENC_USMOPA_ZA_PP_ZZ_64:\n\t\t\tcase ENC_UMOPS_ZA_PP_ZZ_64:\n\t\t\tcase ENC_UMOPA_ZA_PP_ZZ_64:\n\t\t\tcase ENC_SUMOPS_ZA_PP_ZZ_64:\n\t\t\tcase ENC_SUMOPA_ZA_PP_ZZ_64:\n\t\t\tcase ENC_SMOPS_ZA_PP_ZZ_64:\n\t\t\tcase ENC_SMOPA_ZA_PP_ZZ_64:\n\t\t\t\tas0 = _1D; as1 = _1H; break;\n\t\t\tcase ENC_USMOPS_ZA_PP_ZZ_32:\n\t\t\tcase ENC_USMOPA_ZA_PP_ZZ_32:\n\t\t\tcase ENC_UMOPS_ZA_PP_ZZ_32:\n\t\t\tcase ENC_UMOPA_ZA_PP_ZZ_32:\n\t\t\tcase ENC_SUMOPS_ZA_PP_ZZ_32:\n\t\t\tcase ENC_SUMOPA_ZA_PP_ZZ_32:\n\t\t\tcase ENC_SMOPS_ZA_PP_ZZ_32:\n\t\t\tcase ENC_SMOPA_ZA_PP_ZZ_32:\n\t\t\t\tas0 = _1S; as1 = _1B; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tADD_OPERAND_SME_TILE(ctx->ZAda, SLICE_NONE, as0, REG_NONE, 0);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pn, 'm');\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pm, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, as1);\n\t\tADD_OPERAND_ZREG_T(ctx->Zm, as1);\n\t\tbreak;\n\t}\n\n\tcase ENC_URECPE_Z_P_Z_:\n\tcase ENC_URSQRTE_Z_P_Z_:\n\t{\n\t\t// <Zd>.S,<Pg>/M,<Zn>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_H32_FLOAT2INT:\n\tcase ENC_SCVTF_H32_FLOAT2INT:\n\tcase ENC_UCVTF_H32_FLOAT2INT:\n\t{\n\t\t// <Hd>,<Wn>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_H32_FLOAT2FIX:\n\tcase ENC_UCVTF_H32_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Hd>,<Wn>, #<fbits>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_H64_FLOAT2INT:\n\tcase ENC_SCVTF_H64_FLOAT2INT:\n\tcase ENC_UCVTF_H64_FLOAT2INT:\n\t{\n\t\t// <Hd>,<Xn>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_H64_FLOAT2FIX:\n\tcase ENC_UCVTF_H64_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Hd>,<Xn>, #<fbits>\n\t\tADD_OPERAND_HD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_HZ_FLOATCMP:\n\tcase ENC_FCMP_HZ_FLOATCMP:\n\t{\n\t\t// <Hn>, #0.0\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_H_FLOATCMP:\n\tcase ENC_FCMP_H_FLOATCMP:\n\t{\n\t\t// <Hn>,<Hm>\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_HM;\n\t\tbreak;\n\t}\n\tcase ENC_FCCMPE_H_FLOATCCMP:\n\tcase ENC_FCCMP_H_FLOATCCMP:\n\t{\n\t\t// <Hn>,<Hm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_HM;\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_LDR_H_LDST_IMMPRE:\n\tcase ENC_STR_H_LDST_IMMPRE:\n\t{\n\t\t// <Ht>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_HT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_H_LDST_REGOFF:  // 16-fsreg,LDR-16-fsreg (size == 01 && opc == 01)\n\tcase ENC_STR_H_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Ht>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_HT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_H_LDST_IMMPOST:\n\tcase ENC_STR_H_LDST_IMMPOST:\n\t{\n\t\t// <Ht>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_HT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_H_LDST_POS:\n\tcase ENC_STR_H_LDST_POS:\n\t{\n\t\t// <Ht>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_HT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDUR_H_LDST_UNSCALED:\n\tcase ENC_STUR_H_LDST_UNSCALED:\n\t{\n\t\t// <Ht>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_HT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_CMPLE_CMPGE_P_P_ZZ_:\n\tcase ENC_CMPLO_CMPHI_P_P_ZZ_:\n\tcase ENC_CMPLS_CMPHS_P_P_ZZ_:\n\tcase ENC_CMPLT_CMPGT_P_P_ZZ_:\n\tcase ENC_FACLE_FACGE_P_P_ZZ_:\n\tcase ENC_FACLT_FACGT_P_P_ZZ_:\n\tcase ENC_FCMLE_FCMGE_P_P_ZZ_:\n\tcase ENC_FCMLT_FCMGT_P_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_d_h_s[ctx->size];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zm>.<T>,<Zn>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCMEQ_P_P_Z0_:\n\tcase ENC_FCMGE_P_P_Z0_:\n\tcase ENC_FCMGT_P_P_Z0_:\n\tcase ENC_FCMLE_P_P_Z0_:\n\tcase ENC_FCMLT_P_P_Z0_:\n\tcase ENC_FCMNE_P_P_Z0_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zn>.<T>, #0.0\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_CMPEQ_P_P_ZI_:\n\tcase ENC_CMPGE_P_P_ZI_:\n\tcase ENC_CMPGT_P_P_ZI_:\n\tcase ENC_CMPHI_P_P_ZI_:\n\tcase ENC_CMPHS_P_P_ZI_:\n\tcase ENC_CMPLE_P_P_ZI_:\n\tcase ENC_CMPLO_P_P_ZI_:\n\tcase ENC_CMPLS_P_P_ZI_:\n\tcase ENC_CMPLT_P_P_ZI_:\n\tcase ENC_CMPNE_P_P_ZI_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zn>.<T>, #<imm>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CMPEQ_P_P_ZZ_:\n\tcase ENC_CMPGE_P_P_ZZ_:\n\tcase ENC_CMPGT_P_P_ZZ_:\n\tcase ENC_CMPHI_P_P_ZZ_:\n\tcase ENC_CMPHS_P_P_ZZ_:\n\tcase ENC_CMPNE_P_P_ZZ_:\n\tcase ENC_FACGE_P_P_ZZ_:\n\tcase ENC_FACGT_P_P_ZZ_:\n\tcase ENC_FCMEQ_P_P_ZZ_:\n\tcase ENC_FCMGE_P_P_ZZ_:\n\tcase ENC_FCMGT_P_P_ZZ_:\n\tcase ENC_FCMNE_P_P_ZZ_:\n\tcase ENC_FCMUO_P_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_CMPEQ_P_P_ZW_:\n\tcase ENC_CMPGE_P_P_ZW_:\n\tcase ENC_CMPGT_P_P_ZW_:\n\tcase ENC_CMPHI_P_P_ZW_:\n\tcase ENC_CMPHS_P_P_ZW_:\n\tcase ENC_CMPLE_P_P_ZW_:\n\tcase ENC_CMPLO_P_P_ZW_:\n\tcase ENC_CMPLS_P_P_ZW_:\n\tcase ENC_CMPLT_P_P_ZW_:\n\tcase ENC_CMPNE_P_P_ZW_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zn>.<T>,<Zm>.D\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_REV_P_P_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pn>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_TRN1_P_PP_:\n\tcase ENC_TRN2_P_PP_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pn>.<T>,<Pm>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, arr_spec);\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_UZP1_P_PP_:\n\tcase ENC_UZP2_P_PP_:\n\tcase ENC_ZIP1_P_PP_:\n\tcase ENC_ZIP2_P_PP_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Pn>.<T>,<Pm>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, arr_spec);\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_WHILELE_P_P_RR_:\n\tcase ENC_WHILELO_P_P_RR_:\n\tcase ENC_WHILELS_P_P_RR_:\n\tcase ENC_WHILELT_P_P_RR_:\n\tcase ENC_WHILEGE_P_P_RR_:\n\tcase ENC_WHILEGT_P_P_RR_:\n\tcase ENC_WHILEHI_P_P_RR_:\n\tcase ENC_WHILEHS_P_P_RR_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = ctx->sf ? REG_X_BASE : REG_W_BASE;\n\t\tunsigned rm_base = rn_base;\n\t\t// <Pd>.<T>,<R><n>,<R><m>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_PTRUE_P_S_:\n\tcase ENC_PTRUES_P_S_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>{,<pattern>}\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_OPTIONAL_PATTERN;\n\t\tbreak;\n\t}\n\tcase ENC_PFALSE_P_:\n\tcase ENC_RDFFR_P_F_:\n\t{\n\t\t// <Pd>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_SEL_P_P_PP_:\n\t{\n\t\t// <Pd>.B,<Pg>,<Pn>.B,<Pm>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_BRKA_P_P_P_:\n\tcase ENC_BRKB_P_P_P_:\n\t{\n\t\tchar pred_qual = ctx->M ? 'm' : 'z';\n\t\t// <Pd>.B,<Pg>/<ZM>,<Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, pred_qual);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_REVD_Z_P_Z_: // <Zd>.Q,<Pg>/M,<Zn>.Q\n\t{\n\t\tADD_OPERAND_ZREG_T(ctx->Zd, _1Q);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zd, _1Q);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_MOVA_Z_P_RZA_B: // <Zd>.B,<Pg>/M,  ZA0<HV>.B[<Ws>, #<imm>]\n\tcase ENC_MOV_MOVA_Z_P_RZA_H: // <Zd>.H,<Pg>/M,<ZAn><HV>.H[<Ws>, #<imm>]\n\tcase ENC_MOV_MOVA_Z_P_RZA_W: // <Zd>.S,<Pg>/M,<ZAn><HV>.S[<Ws>, #<imm>]\n\tcase ENC_MOV_MOVA_Z_P_RZA_D: // <Zd>.D,<Pg>/M,<ZAn><HV>.D[<Ws>, #<imm>]\n\tcase ENC_MOV_MOVA_Z_P_RZA_Q: // <Zd>.Q,<Pg>/M,<ZAn><HV>.Q[<Ws>]\n\t{\n\t\tinstr->operation = ARM64_MOVA;\n\t\tArrangementSpec as = ARRSPEC_NONE;\n\t\tuint64_t imm=0, n=0;\n\t\tswitch(instr->encoding) {\n\t\t\tcase ENC_MOV_MOVA_Z_P_RZA_B: as=_1B; imm=ctx->imm4; n=0; break;\n\t\t\tcase ENC_MOV_MOVA_Z_P_RZA_H: as=_1H; imm=ctx->imm3; n=ctx->n; break;\n\t\t\tcase ENC_MOV_MOVA_Z_P_RZA_W: as=_1S; imm=ctx->imm2; n=ctx->n; break;\n\t\t\tcase ENC_MOV_MOVA_Z_P_RZA_D: as=_1D; imm=ctx->i1;   n=ctx->n; break;\n\t\t\tcase ENC_MOV_MOVA_Z_P_RZA_Q: as=_1Q; imm=0;         n=ctx->n; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tADD_OPERAND_ZREG_T(ctx->Zd, as);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_SME_TILE(n, ctx->V, as, REG_W0+12+ctx->Rs, imm);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_MOVA_ZA_P_RZ_B: // ZA0<HV>.B[<Ws>,   #<imm>], <Pg>/M, <Zn>.B\n\tcase ENC_MOV_MOVA_ZA_P_RZ_H: // <ZAd><HV>.H[<Ws>, #<imm>], <Pg>/M, <Zn>.H\n    case ENC_MOV_MOVA_ZA_P_RZ_W: // <ZAd><HV>.S[<Ws>, #<imm>], <Pg>/M, <Zn>.S\n\tcase ENC_MOV_MOVA_ZA_P_RZ_D: // <ZAd><HV>.D[<Ws>, #<imm>], <Pg>/M, <Zn>.D\n    case ENC_MOV_MOVA_ZA_P_RZ_Q: // <ZAd><HV>.Q[<Ws>        ], <Pg>/M, <Zn>.Q\n\t{\n\t\tinstr->operation = ARM64_MOVA;\n\t\tArrangementSpec as = ARRSPEC_NONE;\n\t\tuint64_t imm=0, d=0;\n\t\tswitch(instr->encoding) {\n\t\t\tcase ENC_MOV_MOVA_ZA_P_RZ_B: as=_1B; imm=ctx->imm4; d=0; break;\n\t\t\tcase ENC_MOV_MOVA_ZA_P_RZ_H: as=_1H; imm=ctx->imm3; d=ctx->d; break;\n\t\t\tcase ENC_MOV_MOVA_ZA_P_RZ_W: as=_1S; imm=ctx->imm2; d=ctx->d; break;\n\t\t\tcase ENC_MOV_MOVA_ZA_P_RZ_D: as=_1D; imm=ctx->i1;   d=ctx->d; break;\n\t\t\tcase ENC_MOV_MOVA_ZA_P_RZ_Q: as=_1Q; imm=0;         d=ctx->d; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tADD_OPERAND_SME_TILE(d, ctx->V, as, REG_W0+12+ctx->Rs, imm);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, as);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_SEL_P_P_PP_:\n\t{\n\t\t// <Pd>.B,<Pg>/M,<Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_RDFFR_P_P_F_:\n\tcase ENC_RDFFRS_P_P_F_:\n\t{\n\t\t// <Pd>.B,<Pg>/Z\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tbreak;\n\t}\n\tcase ENC_MOVS_ANDS_P_P_PP_Z:\n\tcase ENC_MOV_AND_P_P_PP_Z:\n\tcase ENC_NOTS_EORS_P_P_PP_Z:\n\tcase ENC_NOT_EOR_P_P_PP_Z:\n\tcase ENC_BRKAS_P_P_P_Z:\n\tcase ENC_BRKBS_P_P_P_Z:\n\t{\n\t\t// <Pd>.B,<Pg>/Z,<Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_AND_P_P_PP_Z:\n\tcase ENC_ANDS_P_P_PP_Z:\n\tcase ENC_BIC_P_P_PP_Z:\n\tcase ENC_BICS_P_P_PP_Z:\n\tcase ENC_BRKPA_P_P_PP_:\n\tcase ENC_BRKPAS_P_P_PP_:\n\tcase ENC_BRKPB_P_P_PP_:\n\tcase ENC_BRKPBS_P_P_PP_:\n\tcase ENC_EOR_P_P_PP_Z:\n\tcase ENC_EORS_P_P_PP_Z:\n\tcase ENC_NAND_P_P_PP_Z:\n\tcase ENC_NANDS_P_P_PP_Z:\n\tcase ENC_NOR_P_P_PP_Z:\n\tcase ENC_NORS_P_P_PP_Z:\n\tcase ENC_ORN_P_P_PP_Z:\n\tcase ENC_ORNS_P_P_PP_Z:\n\tcase ENC_ORR_P_P_PP_Z:\n\tcase ENC_ORRS_P_P_PP_Z:\n\t{\n\t\t// <Pd>.B,<Pg>/Z,<Pn>.B,<Pm>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_MATCH_P_P_ZZ_:\n\tcase ENC_NMATCH_P_P_ZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h[ctx->size & 1];\n\t\t// <Pd>.<T>,<Pg>/Z,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, T);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, T);\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, T);\n\t\tbreak;\n\t}\n\tcase ENC_MOVS_ORRS_P_P_PP_Z:\n\tcase ENC_MOV_ORR_P_P_PP_Z:\n\t{\n\t\t// <Pd>.B,<Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1B);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_PUNPKHI_P_P_:\n\tcase ENC_PUNPKLO_P_P_:\n\t{\n\t\t// <Pd>.H,<Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, _1H);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_BRKN_P_P_PP_:\n\tcase ENC_BRKNS_P_P_PP_:\n\t{\n\t\t// <Pdm>.B,<Pg>/Z,<Pn>.B,<Pdm>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdm, _1B);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdm, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_PNEXT_P_P_P_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Pdn>.<T>,<Pg>,<Pdn>.<T>\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdn, arr_spec);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdn, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_PFIRST_P_P_P_:\n\t{\n\t\t// <Pdn>.B,<Pg>,<Pdn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdn, _1B);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_PRED_REG_T(ctx->Pdn, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_PTEST_P_P_:\n\t{\n\t\t// <Pg>,<Pn>.B\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_WRFFR_F_P_:\n\t{\n\t\t// <Pn>.B\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, _1B);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_P_BI_:\n\tcase ENC_STR_P_BI_:\n\t{\n\t\tsigned imm = ctx->imm;\n\t\t// <Pt>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_PRED_REG(ctx->t);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_SHA512H2_QQV_CRYPTOSHA512_3:\n\tcase ENC_SHA512H_QQV_CRYPTOSHA512_3:\n\t{\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\t// <Qd>,<Qn>,<Vm>.2D\n\t\tADD_OPERAND_QD;\n\t\tADD_OPERAND_QN;\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_2d)\n\t\tbreak;\n\t}\n\tcase ENC_SHA256H2_QQV_CRYPTOSHA3:\n\tcase ENC_SHA256H_QQV_CRYPTOSHA3:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Qd>,<Qn>,<Vm>.4S\n\t\tADD_OPERAND_QD;\n\t\tADD_OPERAND_QN;\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_SHA1C_QSV_CRYPTOSHA3:\n\tcase ENC_SHA1M_QSV_CRYPTOSHA3:\n\tcase ENC_SHA1P_QSV_CRYPTOSHA3:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Qd>,<Sn>,<Vm>.4S\n\t\tADD_OPERAND_QD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_LDP_Q_LDSTPAIR_PRE:\n\tcase ENC_STP_Q_LDSTPAIR_PRE:\n\t{\n\t\t// <Qt1>,<Qt2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_QT1;\n\t\tADD_OPERAND_QT2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_Q_LDSTPAIR_POST:\n\tcase ENC_STP_Q_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Qt1>,<Qt2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_QT1;\n\t\tADD_OPERAND_QT2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDNP_Q_LDSTNAPAIR_OFFS:\n\tcase ENC_LDP_Q_LDSTPAIR_OFF:\n\tcase ENC_STNP_Q_LDSTNAPAIR_OFFS:\n\tcase ENC_STP_Q_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Qt1>,<Qt2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_QT1;\n\t\tADD_OPERAND_QT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Q_LDST_IMMPRE:\n\tcase ENC_STR_Q_LDST_IMMPRE:\n\t{\n\t\t// <Qt>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Q_LDST_REGOFF:\n\tcase ENC_STR_Q_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Qt>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Q_LDST_IMMPOST:\n\tcase ENC_STR_Q_LDST_IMMPOST:\n\t{\n\t\t// <Qt>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Q_LDST_POS:\n\tcase ENC_STR_Q_LDST_POS:\n\t{\n\t\t// <Qt>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDUR_Q_LDST_UNSCALED:\n\tcase ENC_STUR_Q_LDST_UNSCALED:\n\t{\n\t\t// <Qt>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Q_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <Qt>,<label>\n\t\tADD_OPERAND_QT;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_LASTA_R_P_Z_:\n\tcase ENC_LASTB_R_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rd_base = wwwx_0123_reg(ctx->size);\n\t\t// <R><d>,<Pg>,<Zn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_CLASTA_R_P_Z_:\n\tcase ENC_CLASTB_R_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rdn_base = wwwx_0123_reg(ctx->size);\n\t\t// <R><dn>,<Pg>,<R><dn>,<Zm>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rdn_base, ctx->Rdn);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_REG(REGSET_ZR, rdn_base, ctx->Rdn);\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_CTERMEQ_RR_:\n\tcase ENC_CTERMNE_RR_:\n\t{\n\t\tunsigned rn_base = ctx->sz ? REG_X_BASE : REG_W_BASE;\n\t\tunsigned rm_base = rn_base;\n\t\t// <R><n>,<R><m>\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_TBNZ_ONLY_TESTBRANCH:\n\tcase ENC_TBZ_ONLY_TESTBRANCH:\n\t{\n\t\tuint64_t imm = ctx->bit_pos;\n\t\tunsigned rt_base = ctx->datasize == 32 ? REG_W_BASE : REG_X_BASE;\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <R><t>, #<imm>,<label>\n\t\tADD_OPERAND_REG(REGSET_ZR, rt_base, ctx->Rt);\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_S_FLOATIMM:\n\t{\n\t\tfloat fimm = table_imm8_to_float[ctx->imm8];\n\t\t// <Sd>, #<fimm>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_SD_FLOATDP1:\n\t{\n\t\t// <Sd>,<Dn>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_DN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_SH_FLOATDP1:\n\t{\n\t\t// <Sd>,<Hn>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_HN;\n\t\tbreak;\n\t}\n\tcase ENC_FABS_S_FLOATDP1:\n\tcase ENC_FMOV_S_FLOATDP1:\n\tcase ENC_FNEG_S_FLOATDP1:\n\tcase ENC_FRINT32X_S_FLOATDP1:\n\tcase ENC_FRINT32Z_S_FLOATDP1:\n\tcase ENC_FRINT64X_S_FLOATDP1:\n\tcase ENC_FRINT64Z_S_FLOATDP1:\n\tcase ENC_FRINTA_S_FLOATDP1:\n\tcase ENC_FRINTI_S_FLOATDP1:\n\tcase ENC_FRINTM_S_FLOATDP1:\n\tcase ENC_FRINTN_S_FLOATDP1:\n\tcase ENC_FRINTP_S_FLOATDP1:\n\tcase ENC_FRINTX_S_FLOATDP1:\n\tcase ENC_FRINTZ_S_FLOATDP1:\n\tcase ENC_FSQRT_S_FLOATDP1:\n\tcase ENC_SHA1H_SS_CRYPTOSHA2:\n\t{\n\t\t// <Sd>,<Sn>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_SN;\n\t\tbreak;\n\t}\n\tcase ENC_FADD_S_FLOATDP2:\n\tcase ENC_FDIV_S_FLOATDP2:\n\tcase ENC_FMAXNM_S_FLOATDP2:\n\tcase ENC_FMAX_S_FLOATDP2:\n\tcase ENC_FMINNM_S_FLOATDP2:\n\tcase ENC_FMIN_S_FLOATDP2:\n\tcase ENC_FMUL_S_FLOATDP2:\n\tcase ENC_FNMUL_S_FLOATDP2:\n\tcase ENC_FSUB_S_FLOATDP2:\n\t{\n\t\t// <Sd>,<Sn>,<Sm>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_SM;\n\t\tbreak;\n\t}\n\tcase ENC_FMADD_S_FLOATDP3:\n\tcase ENC_FMSUB_S_FLOATDP3:\n\tcase ENC_FNMADD_S_FLOATDP3:\n\tcase ENC_FNMSUB_S_FLOATDP3:\n\t{\n\t\t// <Sd>,<Sn>,<Sm>,<Sa>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_SM;\n\t\tADD_OPERAND_SA;\n\t\tbreak;\n\t}\n\tcase ENC_FCSEL_S_FLOATSEL:\n\t{\n\t\t// <Sd>,<Sn>,<Sm>,<cond>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_SM;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_S32_FLOAT2INT:\n\tcase ENC_SCVTF_S32_FLOAT2INT:\n\tcase ENC_UCVTF_S32_FLOAT2INT:\n\t{\n\t\t// <Sd>,<Wn>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_S32_FLOAT2FIX:\n\tcase ENC_UCVTF_S32_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Sd>,<Wn>, #<fbits>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_S64_FLOAT2INT:\n\tcase ENC_UCVTF_S64_FLOAT2INT:\n\t{\n\t\t// <Sd>,<Xn>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_SCVTF_S64_FLOAT2FIX:\n\tcase ENC_UCVTF_S64_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Sd>,<Xn>, #<fbits>\n\t\tADD_OPERAND_SD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_SZ_FLOATCMP:\n\tcase ENC_FCMP_SZ_FLOATCMP:\n\t{\n\t\t// <Sn>, #0.0\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FCMPE_S_FLOATCMP:\n\tcase ENC_FCMP_S_FLOATCMP:\n\t{\n\t\t// <Sn>,<Sm>\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_SM;\n\t\tbreak;\n\t}\n\tcase ENC_FCCMPE_S_FLOATCCMP:\n\tcase ENC_FCCMP_S_FLOATCCMP:\n\t{\n\t\t// <Sn>,<Sm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_SM;\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_LDP_S_LDSTPAIR_PRE:\n\tcase ENC_STP_S_LDSTPAIR_PRE:\n\t{\n\t\t// <St1>,<St2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_ST1;\n\t\tADD_OPERAND_ST2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_S_LDSTPAIR_POST:\n\tcase ENC_STP_S_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <St1>,<St2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_ST1;\n\t\tADD_OPERAND_ST2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDNP_S_LDSTNAPAIR_OFFS:\n\tcase ENC_LDP_S_LDSTPAIR_OFF:\n\tcase ENC_STNP_S_LDSTNAPAIR_OFFS:\n\tcase ENC_STP_S_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <St1>,<St2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_ST1;\n\t\tADD_OPERAND_ST2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_S_LDST_IMMPRE:\n\tcase ENC_STR_S_LDST_IMMPRE:\n\t{\n\t\t// <St>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_S_LDST_REGOFF:\n\tcase ENC_STR_S_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <St>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_S_LDST_IMMPOST:\n\tcase ENC_STR_S_LDST_IMMPOST:\n\t{\n\t\t// <St>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_S_LDST_POS:\n\tcase ENC_STR_S_LDST_POS:\n\t{\n\t\t// <St>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDUR_S_LDST_UNSCALED:\n\tcase ENC_STUR_S_LDST_UNSCALED:\n\t{\n\t\t// <St>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_S_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <St>,<label>\n\t\tADD_OPERAND_ST;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_ANDV_R_P_Z_:\n\tcase ENC_EORV_R_P_Z_:\n\tcase ENC_FADDV_V_P_Z_:\n\tcase ENC_FMAXNMV_V_P_Z_:\n\tcase ENC_FMAXV_V_P_Z_:\n\tcase ENC_FMINNMV_V_P_Z_:\n\tcase ENC_FMINV_V_P_Z_:\n\tcase ENC_LASTA_V_P_Z_:\n\tcase ENC_LASTB_V_P_Z_:\n\tcase ENC_ORV_R_P_Z_:\n\tcase ENC_SMAXV_R_P_Z_:\n\tcase ENC_SMINV_R_P_Z_:\n\tcase ENC_UMAXV_R_P_Z_:\n\tcase ENC_UMINV_R_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\t// <V><d>,<Pg>,<Zn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_ASISDMISC_R:\n\tcase ENC_FCVTAU_ASISDMISC_R:\n\tcase ENC_FCVTMS_ASISDMISC_R:\n\tcase ENC_FCVTMU_ASISDMISC_R:\n\tcase ENC_FCVTNS_ASISDMISC_R:\n\tcase ENC_FCVTNU_ASISDMISC_R:\n\tcase ENC_FCVTPS_ASISDMISC_R:\n\tcase ENC_FCVTPU_ASISDMISC_R:\n\tcase ENC_FCVTZS_ASISDMISC_R:\n\tcase ENC_FCVTZU_ASISDMISC_R:\n\tcase ENC_FRECPE_ASISDMISC_R:\n\tcase ENC_FRECPX_ASISDMISC_R:\n\tcase ENC_FRSQRTE_ASISDMISC_R:\n\tcase ENC_SCVTF_ASISDMISC_R:\n\tcase ENC_UCVTF_ASISDMISC_R:\n\t{\n\t\tunsigned rn_base = sd_01_reg(ctx->sz);\n\t\tunsigned rd_base = sd_01_reg(ctx->sz);\n\t\t// <V><d>,<V><n>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_ABS_ASISDMISC_R:\n\tcase ENC_NEG_ASISDMISC_R:\n\tcase ENC_SQABS_ASISDMISC_R:\n\tcase ENC_SQNEG_ASISDMISC_R:\n\tcase ENC_SUQADD_ASISDMISC_R:\n\tcase ENC_USQADD_ASISDMISC_R:\n\t{\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\t// <V><d>,<V><n>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_CMEQ_ASISDMISC_Z:\n\tcase ENC_CMGE_ASISDMISC_Z:\n\tcase ENC_CMGT_ASISDMISC_Z:\n\tcase ENC_CMLE_ASISDMISC_Z:\n\tcase ENC_CMLT_ASISDMISC_Z:\n\t{\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\t// <V><d>,<V><n>, #0\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_IMM32(0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_FCMEQ_ASISDMISC_FZ:\n\tcase ENC_FCMGE_ASISDMISC_FZ:\n\tcase ENC_FCMGT_ASISDMISC_FZ:\n\tcase ENC_FCMLE_ASISDMISC_FZ:\n\tcase ENC_FCMLT_ASISDMISC_FZ:\n\t{\n\t\tunsigned rn_base = sd_01_reg(ctx->sz);\n\t\tunsigned rd_base = sd_01_reg(ctx->sz);\n\t\t// <V><d>,<V><n>, #0.0\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_ASISDSHF_C:\n\tcase ENC_FCVTZU_ASISDSHF_C:\n\tcase ENC_SCVTF_ASISDSHF_C:\n\tcase ENC_UCVTF_ASISDSHF_C:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\tunsigned rn_base = rhsd_0123x_reg(ctx->immh);\n\t\tunsigned rd_base = rhsd_0123x_reg(ctx->immh);\n\t\t// <V><d>,<V><n>, #<fbits>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_SHL_ASISDSHF_R:\n\tcase ENC_SLI_ASISDSHF_R:\n\tcase ENC_SQSHLU_ASISDSHF_R:\n\tcase ENC_SQSHL_ASISDSHF_R:\n\tcase ENC_SRI_ASISDSHF_R:\n\tcase ENC_SRSHR_ASISDSHF_R:\n\tcase ENC_SRSRA_ASISDSHF_R:\n\tcase ENC_SSHR_ASISDSHF_R:  // 0F080400\n\tcase ENC_SSRA_ASISDSHF_R:\n\tcase ENC_UQSHL_ASISDSHF_R:\n\tcase ENC_URSHR_ASISDSHF_R:\n\tcase ENC_URSRA_ASISDSHF_R:\n\tcase ENC_USHR_ASISDSHF_R:\n\tcase ENC_USRA_ASISDSHF_R:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tunsigned rd_base, rn_base;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_UQSHL_ASISDSHF_R:\n\t\tcase ENC_SQSHLU_ASISDSHF_R:\n\t\tcase ENC_SQSHL_ASISDSHF_R:\n\t\t\trn_base = rbhsd_0123x_reg(ctx->immh);\n\t\t\trd_base = rbhsd_0123x_reg(ctx->immh);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\trn_base = rd_base = REG_D_BASE;\n\t\t}\n\t\t// <V><d>,<V><n>, #<shift>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ADD_ASISDSAME_ONLY:\n\tcase ENC_CMEQ_ASISDSAME_ONLY:\n\tcase ENC_CMGE_ASISDSAME_ONLY:\n\tcase ENC_CMGT_ASISDSAME_ONLY:\n\tcase ENC_CMHI_ASISDSAME_ONLY:\n\tcase ENC_CMHS_ASISDSAME_ONLY:\n\tcase ENC_CMTST_ASISDSAME_ONLY:\n\tcase ENC_SQADD_ASISDSAME_ONLY:\n\tcase ENC_SQDMULH_ASISDSAME_ONLY:\n\tcase ENC_SQRDMLAH_ASISDSAME2_ONLY:\n\tcase ENC_SQRDMLSH_ASISDSAME2_ONLY:\n\tcase ENC_SQRDMULH_ASISDSAME_ONLY:\n\tcase ENC_SQRSHL_ASISDSAME_ONLY:\n\tcase ENC_SQSHL_ASISDSAME_ONLY:\n\tcase ENC_SQSUB_ASISDSAME_ONLY:\n\tcase ENC_SRSHL_ASISDSAME_ONLY:\n\tcase ENC_SSHL_ASISDSAME_ONLY:\n\tcase ENC_SUB_ASISDSAME_ONLY:\n\tcase ENC_UQADD_ASISDSAME_ONLY:\n\tcase ENC_UQRSHL_ASISDSAME_ONLY:\n\tcase ENC_UQSHL_ASISDSAME_ONLY:\n\tcase ENC_UQSUB_ASISDSAME_ONLY:\n\tcase ENC_URSHL_ASISDSAME_ONLY:\n\tcase ENC_USHL_ASISDSAME_ONLY:\n\t{\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rm_base = bhsd_0123_reg(ctx->size);\n\t\t// <V><d>,<V><n>,<V><m>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_FACGE_ASISDSAME_ONLY:\n\tcase ENC_FABD_ASISDSAME_ONLY:\n\tcase ENC_FACGT_ASISDSAME_ONLY:\n\tcase ENC_FCMEQ_ASISDSAME_ONLY:\n\tcase ENC_FCMGE_ASISDSAME_ONLY:\n\tcase ENC_FCMGT_ASISDSAME_ONLY:\n\tcase ENC_FMULX_ASISDSAME_ONLY:\n\tcase ENC_FRSQRTS_ASISDSAME_ONLY:\n\tcase ENC_FRECPS_ASISDSAME_ONLY:\n\t{\n\t\tunsigned rn_base = sd_01_reg(ctx->sz);\n\t\tunsigned rd_base = sd_01_reg(ctx->sz);\n\t\tunsigned rm_base = sd_01_reg(ctx->sz);\n\t\t// <V><d>,<V><n>,<V><m>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_ASISDELEM_R_SD:\n\tcase ENC_FMLS_ASISDELEM_R_SD:\n\tcase ENC_FMULX_ASISDELEM_R_SD:\n\tcase ENC_FMUL_ASISDELEM_R_SD:\n\t{\n\t\tunsigned rn_base = sd_01_reg(ctx->sz);\n\t\tunsigned rd_base = sd_01_reg(ctx->sz);\n\t\tArrangementSpec arr_spec = table_s_d[ctx->sz];\n\t\t// <V><d>,<V><n>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SQDMULH_ASISDELEM_R:\n\tcase ENC_SQRDMLAH_ASISDELEM_R:\n\tcase ENC_SQRDMLSH_ASISDELEM_R:\n\tcase ENC_SQRDMULH_ASISDELEM_R:\n\t{\n\t\tunsigned rd_base = rhsd_0123_reg(ctx->size);\n\t\tunsigned rn_base = rhsd_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <V><d>,<V><n>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_ADDHA_ZA_PP_Z_32:\n\t{\n\t\t// <ZAda>.S,<Pn>/M,<Pm>/M,<Zn>.S\n\t\tADD_OPERAND_SME_TILE(ctx->ZAda, SLICE_NONE, _1S, REG_NONE, 0);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pn, 'm');\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pm, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_ADDHA_ZA_PP_Z_64:\n\t{\n\t\t// <ZAda>.D,<Pn>/M,<Pm>/M,<Zn>.D\n\t\tADD_OPERAND_SME_TILE(ctx->ZAda, SLICE_NONE, _1D, REG_NONE, 0);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pn, 'm');\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pm, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_ADDVA_ZA_PP_Z_32:\n\t{\n\t\t// <ZAda>.S,<Pn>/M,<Pm>/M,<Zn>.S\n\t\tADD_OPERAND_SME_TILE(ctx->ZAda, SLICE_NONE, _1S, REG_NONE, 0);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pn, 'm');\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pm, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_ADDVA_ZA_PP_Z_64:\n\t{\n\t\t// <ZAda>.D,<Pn>/M,<Pm>/M,<Zn>.D\n\t\tADD_OPERAND_SME_TILE(ctx->ZAda, SLICE_NONE, _1D, REG_NONE, 0);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pn, 'm');\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->Pm, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zn, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_ADDP_ASISDPAIR_ONLY:\n\t{\n\t\tunsigned rd_base = REG_D_BASE;\n\t\tArrangementSpec arr_spec = _2D;\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FADDP_ASISDPAIR_ONLY_SD:\n\t{\n\t\tunsigned rd_base = ctx->sz ? REG_D_BASE : REG_S_BASE;\n\t\tarr_spec = table_2s_2d[ctx->sz];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ADDV_ASIMDALL_ONLY:\n\t{\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_H:\n\tcase ENC_FMAXP_ASISDPAIR_ONLY_H:\n\tcase ENC_FMINNMP_ASISDPAIR_ONLY_H:\n\tcase ENC_FMINP_ASISDPAIR_ONLY_H:\n\tcase ENC_FADDP_ASISDPAIR_ONLY_H:\n\t{\n\t\tunsigned rd_base = REG_H_BASE;\n\t\tarr_spec = _2H;\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_SD:\n\tcase ENC_FMAXP_ASISDPAIR_ONLY_SD:\n\tcase ENC_FMINNMP_ASISDPAIR_ONLY_SD:\n\tcase ENC_FMINP_ASISDPAIR_ONLY_SD:\n\t{\n\t\tunsigned rd_base = sd_01_reg(ctx->sz);\n\t\tArrangementSpec arr_spec = table_2s_2d[ctx->sz];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FMAXNMV_ASIMDALL_ONLY_H:\n\tcase ENC_FMAXV_ASIMDALL_ONLY_H:\n\tcase ENC_FMINNMV_ASIMDALL_ONLY_H:\n\tcase ENC_FMINV_ASIMDALL_ONLY_H:\n\t{\n\t\tunsigned rd_base = REG_H_BASE;\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\n\tcase ENC_FMAXNMV_ASIMDALL_ONLY_SD:\n\tcase ENC_FMAXV_ASIMDALL_ONLY_SD:\n\tcase ENC_FMINNMV_ASIMDALL_ONLY_SD:\n\tcase ENC_FMINV_ASIMDALL_ONLY_SD:\n\t{\n\t\tunsigned rd_base = REG_S_BASE;\n\t\tArrangementSpec arr_spec = _4S;\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_UADDLV_ASIMDALL_ONLY:\n\tcase ENC_SADDLV_ASIMDALL_ONLY:\n\t{\n\t\tunsigned rd_base = hsdr_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_UMAXV_ASIMDALL_ONLY:\n\tcase ENC_UMINV_ASIMDALL_ONLY:\n\tcase ENC_SMAXV_ASIMDALL_ONLY:\n\tcase ENC_SMINV_ASIMDALL_ONLY:\n\t{\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <V><d>,<Vn>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_MOV_DUP_ASISDONE_ONLY:\n\t{\n\t\tunsigned rd_base = rbhsdq_5bit_reg(ctx->imm5);\n\t\tArrangementSpec arr_spec = arr_spec_method1(ctx->imm5);\n\t\t// <V><d>,<Vn>.<T>[<index>]\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_DUP_ASISDONE_ONLY:\n\t{\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_b_d_h_s[ctx->size];\n\t\t// <V><d>,<Vn>.<T>[<index>]\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_DUP_P_P_PI_:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method1((ctx->tszh << 3) | ctx->tszl);\n\t\t// DUP <Pd>.<T>, <Pg>/Z, <Pn>.<T>[<Wm>{, #<imm>}]\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, arr_spec);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_INDEXED_ELEMENT(ctx->n, arr_spec, ctx->m, ctx->imm);\n\t\tbreak;\n\t}\n\tcase ENC_CLASTA_V_P_Z_:\n\tcase ENC_CLASTB_V_P_Z_:\n\tcase ENC_FADDA_V_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rdn_base = bhsd_0123_reg(ctx->size);\n\t\t// <V><dn>,<Pg>,<V><dn>,<Zm>.<T>\n\t\tADD_OPERAND_REG(REGSET_ZR, rdn_base, ctx->Vdn);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_REG(REGSET_ZR, rdn_base, ctx->Vdn);\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_SQDMLAL_ASISDDIFF_ONLY:\n\tcase ENC_SQDMLSL_ASISDDIFF_ONLY:\n\tcase ENC_SQDMULL_ASISDDIFF_ONLY:\n\t{\n\t\tunsigned rd_base = rsdr_0123_reg(ctx->size);\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rm_base = bhsd_0123_reg(ctx->size);\n\t\t// <Va><d>,<Vb><n>,<Vb><m>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_SQDMLAL_ASISDELEM_L:\n\tcase ENC_SQDMLSL_ASISDELEM_L:\n\tcase ENC_SQDMULL_ASISDELEM_L:\n\t{\n\t\tunsigned rd_base = rsdr_0123_reg(ctx->size);\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Va><d>,<Vb><n>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SQXTN_ASISDMISC_N:\n\tcase ENC_UQXTN_ASISDMISC_N:\n\tcase ENC_SQXTUN_ASISDMISC_N:\n\t{\n\t\tunsigned rd_base = bhsd_0123_reg(ctx->size);\n\t\tunsigned rn_base = hsdr_0123_reg(ctx->size);\n\t\t// <Vb><d>,<Va><n>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTXN_ASISDMISC_N:\n\t{\n\t\tunsigned rd_base = REG_S_BASE;\n\t\tunsigned rn_base = REG_D_BASE;\n\t\t// <Vb><d>,<Va><n>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_SQRSHRN_ASISDSHF_N:\n\tcase ENC_SQRSHRUN_ASISDSHF_N:\n\tcase ENC_SQSHRN_ASISDSHF_N:\n\tcase ENC_SQSHRUN_ASISDSHF_N:\n\tcase ENC_UQRSHRN_ASISDSHF_N:\n\tcase ENC_UQSHRN_ASISDSHF_N:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tunsigned rd_base = rbhsd_0123x_reg(ctx->immh);\n\t\tunsigned rn_base = rhsdr_0123x_reg(ctx->immh);\n\t\t// <Vb><d>,<Va><n>, #<shift>\n\t\tADD_OPERAND_REG(REGSET_ZR, rd_base, ctx->d);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_AESD_B_CRYPTOAES:\n\tcase ENC_AESE_B_CRYPTOAES:\n\tcase ENC_AESIMC_B_CRYPTOAES:\n\tcase ENC_AESMC_B_CRYPTOAES:\n\t{\n\t\tArrangementSpec arr_spec_16b = _16B;\n\t\t// <Vd>.16B,<Vn>.16B\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_16b)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_16b)\n\t\tbreak;\n\t}\n\tcase ENC_BCAX_VVV16_CRYPTO4:\n\tcase ENC_EOR3_VVV16_CRYPTO4:\n\t{\n\t\tArrangementSpec arr_spec_16b = _16B;\n\t\t// <Vd>.16B,<Vn>.16B,<Vm>.16B,<Va>.16B\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_16b)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_16b)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_16b)\n\t\tADD_OPERAND_VREG_T(ctx->a, arr_spec_16b)\n\t\tbreak;\n\t}\n\tcase ENC_MOVI_ASIMDIMM_D2_D:  // display as int\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\t// <Vd>.2D, #<imm64>\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec_2d)\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_ASIMDIMM_D2_D:  // display as float\n\t{\n\t\tfloat fimm = table_imm8_to_float[ABCDEFGH];\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\t// <Vd>.2D, #<fimm>\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec_2d)\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_SHA512SU0_VV2_CRYPTOSHA512_2:\n\t{\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\t// <Vd>.2D,<Vn>.2D\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_2d)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_2d)\n\t\tbreak;\n\t}\n\tcase ENC_RAX1_VVV2_CRYPTOSHA512_3:\n\tcase ENC_SHA512SU1_VVV2_CRYPTOSHA512_3:\n\t{\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\t// <Vd>.2D,<Vn>.2D,<Vm>.2D\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_2d)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_2d)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_2d)\n\t\tbreak;\n\t}\n\tcase ENC_XAR_VVV2_CRYPTO3_IMM6:\n\t{\n\t\tArrangementSpec arr_spec_2d = _2D;\n\t\tuint64_t imm6 = ctx->imm6;\n\t\t// <Vd>.2D,<Vn>.2D,<Vm>.2D, #<imm6>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_2d)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_2d)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_2d)\n\t\tADD_OPERAND_IMM6;\n\t\tbreak;\n\t}\n\tcase ENC_SMMLA_ASIMDSAME2_G:\n\tcase ENC_UMMLA_ASIMDSAME2_G:\n\tcase ENC_USMMLA_ASIMDSAME2_G:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\tArrangementSpec arr_spec_16b = _16B;\n\t\t// <Vd>.4S,<Vn>.16B,<Vm>.16B\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_16b)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_16b)\n\t\tbreak;\n\t}\n\tcase ENC_SHA1SU1_VV_CRYPTOSHA2:\n\tcase ENC_SHA256SU0_VV_CRYPTOSHA2:\n\tcase ENC_SM4E_VV4_CRYPTOSHA512_2:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Vd>.4S,<Vn>.4S\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_SHA1SU0_VVV_CRYPTOSHA3:\n\tcase ENC_SHA256SU1_VVV_CRYPTOSHA3:\n\tcase ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3:\n\tcase ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3:\n\tcase ENC_SM4EKEY_VVV4_CRYPTOSHA512_3:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Vd>.4S,<Vn>.4S,<Vm>.4S\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_SM3SS1_VVV4_CRYPTO4:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Vd>.4S,<Vn>.4S,<Vm>.4S,<Va>.4S\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->a, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_SM3TT1A_VVV4_CRYPTO3_IMM2:\n\tcase ENC_SM3TT1B_VVV4_CRYPTO3_IMM2:\n\tcase ENC_SM3TT2A_VVV4_CRYPTO3_IMM2:\n\tcase ENC_SM3TT2B_VVV_CRYPTO3_IMM2:\n\t{\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// <Vd>.4S,<Vn>.4S,<Vm>.S[<imm2>]\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_4s)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, _1S, ctx->imm2);\n\t\tbreak;\n\t}\n\tcase ENC_MOVI_ASIMDIMM_M_SM:  // \"shifting ones\" around\n\tcase ENC_MVNI_ASIMDIMM_M_SM:  // 32-bit shifting ones (cmode == 110x)\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = table_2s_4s[ctx->Q];\n\t\t// <Vd>.<T>, #<imm8>, MSL #<amount>\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tinstr->operands[1].shiftType = ShiftType_MSL;\n\t\tinstr->operands[1].shiftValue = (ctx->cmode & 1) ? 16 : 8;\n\t\tinstr->operands[1].shiftValueUsed = 1;\n\t\tbreak;\n\t}\n\tcase ENC_MOVI_ASIMDIMM_N_B:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b[ctx->Q];\n\t\tuint64_t imm8 = ctx->imm & 0xFF;\n\t\t// <Vd>.<T>, #<imm8>{, LSL #0}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tbreak;\n\t}\n\tcase ENC_ORR_ASIMDIMM_L_SL:\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = table_2s_4s[ctx->Q];\n\t\tint AMOUNT = 8 * ((ctx->cmode >> 1) & 0b11);\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ORR_ASIMDIMM_L_HL:\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\tint AMOUNT = (ctx->cmode & 2) ? 8 : 0;\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase ENC_MOVI_ASIMDIMM_L_HL:  // 16-bit shifted immediate (op == 0 && cmode == 10x0)\n\tcase ENC_MVNI_ASIMDIMM_L_HL:  // 16-bit shifted immediate (cmode == 10x0)\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\tunsigned AMOUNT = (ctx->cmode & 0b10) << 2;\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\t\tbreak;\n\t}\n\t// IFORM: MVNI_advsimd\n\tcase ENC_MVNI_ASIMDIMM_L_SL:  // cmode == '0xx0' (32-bit shifted immediate)\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = table_2s_4s[ctx->Q];\n\t\tunsigned AMOUNT = (ctx->cmode & 0b0110) << 2;\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BIC_ASIMDIMM_L_HL:\n\tcase ENC_BIC_ASIMDIMM_L_SL:\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tArrangementSpec arr_spec = ARRSPEC_NONE;\n\t\tunsigned AMOUNT = 0;\n\t\tif ((ctx->cmode & 0b1101) == 0b1001)\n\t\t{  // 16-bit (cmode == 10x1)\n\t\t\tarr_spec = table_4h_8h[ctx->Q];\n\t\t\tAMOUNT = (ctx->cmode & 0b10) << 2;\n\t\t}\n\t\telse if ((ctx->cmode & 0b1001) == 0b0001)\n\t\t{  // 32-bit (cmode == 0xx1)\n\t\t\tarr_spec = table_2s_4s[ctx->Q];\n\t\t\tAMOUNT = (ctx->cmode & 0b110) << 2;\n\t\t}\n\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t// IFORM: MOVI_advsimd\n\tcase ENC_MOVI_ASIMDIMM_L_SL:  // op == '0' && cmode == '0xx0' (32-bit shifted immediate)\n\t{\n\t\tuint64_t imm8 = ABCDEFGH;\n\t\tunsigned AMOUNT = (ctx->cmode & 0b110) << 2;\n\t\tArrangementSpec arr_spec = table_2s_4s[ctx->Q];\n\t\t// <Vd>.<T>, #<imm8>{, LSL #<amount>}\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_IMM8;\n\t\tif (AMOUNT)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, AMOUNT);\n\t\t}\n\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_ASIMDIMM_H_H:\n\t{\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\tfloat fimm = table_imm8_to_float[ABCDEFGH];\n\t\t// <Vd>.<T>, #<fimm>\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_ASIMDIMM_S_S:\n\t{\n\t\tArrangementSpec arr_spec = table_2s_4s[ctx->Q];\n\t\tfloat fimm = table_imm8_to_float[ABCDEFGH];\n\t\t// <Vd>.<T>, #<fimm>\n\t\tADD_OPERAND_VREG_T(ctx->rd, arr_spec)\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_DUP_ASIMDINS_DR_R:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method4(ctx->imm5, ctx->Q);\n\t\tunsigned rn_base = rwwwx_0123x_reg(ctx->imm5, ctx->Rn);\n\t\t// <Vd>.<T>,<R><n>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_FABS_ASIMDMISCFP16_R:\n\tcase ENC_FNEG_ASIMDMISCFP16_R:\n\tcase ENC_FSQRT_ASIMDMISCFP16_R:\n\tcase ENC_SCVTF_ASIMDMISCFP16_R:\n\tcase ENC_UCVTF_ASIMDMISCFP16_R:\n\tcase ENC_FCVTAS_ASIMDMISCFP16_R:\n\tcase ENC_FCVTAU_ASIMDMISCFP16_R:\n\tcase ENC_FCVTMS_ASIMDMISCFP16_R:\n\tcase ENC_FCVTMU_ASIMDMISCFP16_R:\n\tcase ENC_FCVTNS_ASIMDMISCFP16_R:\n\tcase ENC_FCVTNU_ASIMDMISCFP16_R:\n\tcase ENC_FCVTPS_ASIMDMISCFP16_R:\n\tcase ENC_FCVTPU_ASIMDMISCFP16_R:\n\tcase ENC_FCVTZS_ASIMDMISCFP16_R:\n\tcase ENC_FCVTZU_ASIMDMISCFP16_R:\n\tcase ENC_FRECPE_ASIMDMISCFP16_R:\n\tcase ENC_FRINTA_ASIMDMISCFP16_R:\n\tcase ENC_FRINTI_ASIMDMISCFP16_R:\n\tcase ENC_FRINTM_ASIMDMISCFP16_R:\n\tcase ENC_FRINTN_ASIMDMISCFP16_R:\n\tcase ENC_FRINTP_ASIMDMISCFP16_R:\n\tcase ENC_FRINTX_ASIMDMISCFP16_R:\n\tcase ENC_FRINTZ_ASIMDMISCFP16_R:\n\tcase ENC_FRSQRTE_ASIMDMISCFP16_R:\n\t{\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FRINT64Z_ASIMDMISC_R:\n\tcase ENC_FRINT64X_ASIMDMISC_R:\n\tcase ENC_FRINTM_ASIMDMISC_R:\n\tcase ENC_FRINTI_ASIMDMISC_R:\n\tcase ENC_FRECPE_ASIMDMISC_R:\n\tcase ENC_FRINTN_ASIMDMISC_R:\n\tcase ENC_FABS_ASIMDMISC_R:\n\tcase ENC_SCVTF_ASIMDMISC_R:\n\tcase ENC_UCVTF_ASIMDMISC_R:\n\tcase ENC_FCVTNS_ASIMDMISC_R:\n\tcase ENC_FCVTZU_ASIMDMISC_R:\n\t{\n\t\tArrangementSpec arr_spec = table_2s_4s_r_2d[(ctx->sz << 1) | ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ABS_ASIMDMISC_R:\n\tcase ENC_CLS_ASIMDMISC_R:\n\tcase ENC_CLZ_ASIMDMISC_R:\n\tcase ENC_CNT_ASIMDMISC_R:\n\tcase ENC_NEG_ASIMDMISC_R:\n\tcase ENC_NOT_ASIMDMISC_R:\n\tcase ENC_REV16_ASIMDMISC_R:\n\tcase ENC_REV32_ASIMDMISC_R:\n\tcase ENC_REV64_ASIMDMISC_R:\n\tcase ENC_SQABS_ASIMDMISC_R:\n\tcase ENC_SQNEG_ASIMDMISC_R:\n\tcase ENC_USQADD_ASIMDMISC_R:\n\tcase ENC_SUQADD_ASIMDMISC_R:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_ASIMDSAME_ONLY:\n\tcase ENC_MVN_NOT_ASIMDMISC_R:\n\tcase ENC_RBIT_ASIMDMISC_R:\n\t{\n\t\tarr_spec = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCVTMS_ASIMDMISC_R:\n\tcase ENC_FCVTMU_ASIMDMISC_R:\n\tcase ENC_FCVTNU_ASIMDMISC_R:\n\tcase ENC_FCVTPS_ASIMDMISC_R:\n\tcase ENC_FCVTPU_ASIMDMISC_R:\n\tcase ENC_FCVTZS_ASIMDMISC_R:\n\tcase ENC_FNEG_ASIMDMISC_R:\n\tcase ENC_FRINT32X_ASIMDMISC_R:\n\tcase ENC_FRINT32Z_ASIMDMISC_R:\n\tcase ENC_FRINTA_ASIMDMISC_R:\n\tcase ENC_FRINTP_ASIMDMISC_R:\n\tcase ENC_FRINTX_ASIMDMISC_R:\n\tcase ENC_FRINTZ_ASIMDMISC_R:\n\tcase ENC_FRSQRTE_ASIMDMISC_R:\n\tcase ENC_FSQRT_ASIMDMISC_R:\n\tcase ENC_FCVTAS_ASIMDMISC_R:\n\tcase ENC_FCVTAU_ASIMDMISC_R:\n\tcase ENC_URECPE_ASIMDMISC_R:\n\tcase ENC_URSQRTE_ASIMDMISC_R:\n\t{\n\t\tArrangementSpec arr_spec = table_2s_4s_r_2d[(ctx->sz << 1) | ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCMEQ_ASIMDMISC_FZ:\n\tcase ENC_FCMGE_ASIMDMISC_FZ:\n\tcase ENC_FCMGT_ASIMDMISC_FZ:\n\tcase ENC_FCMLE_ASIMDMISC_FZ:\n\tcase ENC_FCMLT_ASIMDMISC_FZ:\n\t{\n\t\tArrangementSpec arr_spec = table_2s_4s_r_2d[(ctx->sz << 1) | ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>, #0.0\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FCMEQ_ASIMDMISCFP16_FZ:  // half precision variant\n\tcase ENC_FCMGE_ASIMDMISCFP16_FZ:\n\tcase ENC_FCMGT_ASIMDMISCFP16_FZ:\n\tcase ENC_FCMLE_ASIMDMISCFP16_FZ:\n\tcase ENC_FCMLT_ASIMDMISCFP16_FZ:\n\t{\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>, #0.0\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_CMEQ_ASIMDMISC_Z:\n\tcase ENC_CMGE_ASIMDMISC_Z:\n\tcase ENC_CMGT_ASIMDMISC_Z:\n\tcase ENC_CMLE_ASIMDMISC_Z:\n\tcase ENC_CMLT_ASIMDMISC_Z:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>, #0\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_IMM32(0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_ASIMDSHF_C:\n\tcase ENC_FCVTZU_ASIMDSHF_C:\n\tcase ENC_SCVTF_ASIMDSHF_C:\n\tcase ENC_UCVTF_ASIMDSHF_C:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method3(ctx->immh, ctx->Q);\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Vd>.<T>,<Vn>.<T>, #<fbits>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_SHL_ASIMDSHF_R:\n\tcase ENC_SLI_ASIMDSHF_R:\n\tcase ENC_SQSHLU_ASIMDSHF_R:\n\tcase ENC_SQSHL_ASIMDSHF_R:\n\tcase ENC_SRI_ASIMDSHF_R:\n\tcase ENC_SRSHR_ASIMDSHF_R:\n\tcase ENC_SRSRA_ASIMDSHF_R:\n\tcase ENC_SSHR_ASIMDSHF_R:\n\tcase ENC_SSRA_ASIMDSHF_R:\n\tcase ENC_UQSHL_ASIMDSHF_R:\n\tcase ENC_URSHR_ASIMDSHF_R:\n\tcase ENC_URSRA_ASIMDSHF_R:\n\tcase ENC_USHR_ASIMDSHF_R:\n\tcase ENC_USRA_ASIMDSHF_R:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tArrangementSpec arr_spec = arr_spec_method3(ctx->immh, ctx->Q);\n\t\t// <Vd>.<T>,<Vn>.<T>, #<shift>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_FABD_ASIMDSAME_ONLY:\n\tcase ENC_FABD_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FACGE_ASIMDSAME_ONLY:\n\tcase ENC_FACGE_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FACGT_ASIMDSAME_ONLY:\n\tcase ENC_FACGT_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FADDP_ASIMDSAME_ONLY:\n\tcase ENC_FADDP_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FADD_ASIMDSAME_ONLY:\n\tcase ENC_FADD_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FCMEQ_ASIMDSAME_ONLY:\n\tcase ENC_FCMEQ_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FCMGE_ASIMDSAME_ONLY:\n\tcase ENC_FCMGE_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FCMGT_ASIMDSAME_ONLY:\n\tcase ENC_FCMGT_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FDIV_ASIMDSAME_ONLY:\n\tcase ENC_FDIV_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMAXNMP_ASIMDSAME_ONLY:\n\tcase ENC_FMAXNMP_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMAXNM_ASIMDSAME_ONLY:\n\tcase ENC_FMAXNM_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMAXP_ASIMDSAME_ONLY:\n\tcase ENC_FMAXP_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMAX_ASIMDSAME_ONLY:\n\tcase ENC_FMAX_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMINNMP_ASIMDSAME_ONLY:\n\tcase ENC_FMINNMP_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMINNM_ASIMDSAME_ONLY:\n\tcase ENC_FMINNM_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMINP_ASIMDSAME_ONLY:\n\tcase ENC_FMINP_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMIN_ASIMDSAME_ONLY:\n\tcase ENC_FMIN_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMLA_ASIMDSAME_ONLY:\n\tcase ENC_FMLA_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMLS_ASIMDSAME_ONLY:\n\tcase ENC_FMLS_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMULX_ASIMDSAME_ONLY:\n\tcase ENC_FMULX_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FMUL_ASIMDSAME_ONLY:\n\tcase ENC_FMUL_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FRECPS_ASIMDSAME_ONLY:\n\tcase ENC_FRECPS_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FRSQRTS_ASIMDSAME_ONLY:\n\tcase ENC_FRSQRTS_ASIMDSAMEFP16_ONLY:\n\tcase ENC_FSUB_ASIMDSAME_ONLY:\n\tcase ENC_FSUB_ASIMDSAMEFP16_ONLY:\n\t{\n\t\tif (ctx->esize <= 16)  // half precision\n\t\t\tarr_spec = table_4h_8h[ctx->Q];\n\t\telse\n\t\t{  // single, double precision\n\t\t\tarr_spec = table_2s_4s_r_2d[(ctx->sz << 1) | ctx->Q];\n\t\t}\n\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\n\tcase ENC_ADDP_ASIMDSAME_ONLY:\n\tcase ENC_ADD_ASIMDSAME_ONLY:\n\tcase ENC_AND_ASIMDSAME_ONLY:\n\tcase ENC_BIF_ASIMDSAME_ONLY:\n\tcase ENC_BIT_ASIMDSAME_ONLY:\n\tcase ENC_BSL_ASIMDSAME_ONLY:\n\tcase ENC_CMEQ_ASIMDSAME_ONLY:\n\tcase ENC_CMGE_ASIMDSAME_ONLY:\n\tcase ENC_CMGT_ASIMDSAME_ONLY:\n\tcase ENC_CMHI_ASIMDSAME_ONLY:\n\tcase ENC_CMHS_ASIMDSAME_ONLY:\n\tcase ENC_CMTST_ASIMDSAME_ONLY:\n\tcase ENC_EOR_ASIMDSAME_ONLY:\n\tcase ENC_MLA_ASIMDSAME_ONLY:\n\tcase ENC_MLS_ASIMDSAME_ONLY:\n\tcase ENC_MUL_ASIMDSAME_ONLY:\n\tcase ENC_PMUL_ASIMDSAME_ONLY:\n\tcase ENC_SABA_ASIMDSAME_ONLY:\n\tcase ENC_SABD_ASIMDSAME_ONLY:\n\tcase ENC_SHADD_ASIMDSAME_ONLY:\n\tcase ENC_SHSUB_ASIMDSAME_ONLY:\n\tcase ENC_SMAXP_ASIMDSAME_ONLY:\n\tcase ENC_SMAX_ASIMDSAME_ONLY:\n\tcase ENC_SMINP_ASIMDSAME_ONLY:\n\tcase ENC_SMIN_ASIMDSAME_ONLY:\n\tcase ENC_SQADD_ASIMDSAME_ONLY:\n\tcase ENC_SQDMULH_ASIMDSAME_ONLY:\n\tcase ENC_SQRDMLAH_ASIMDSAME2_ONLY:\n\tcase ENC_SQRDMLSH_ASIMDSAME2_ONLY:\n\tcase ENC_SQRDMULH_ASIMDSAME_ONLY:\n\tcase ENC_SQRSHL_ASIMDSAME_ONLY:\n\tcase ENC_SQSHL_ASIMDSAME_ONLY:\n\tcase ENC_SQSUB_ASIMDSAME_ONLY:\n\tcase ENC_SRHADD_ASIMDSAME_ONLY:\n\tcase ENC_SRSHL_ASIMDSAME_ONLY:\n\tcase ENC_SSHL_ASIMDSAME_ONLY:\n\tcase ENC_SUB_ASIMDSAME_ONLY:\n\tcase ENC_TRN1_ASIMDPERM_ONLY:\n\tcase ENC_TRN2_ASIMDPERM_ONLY:\n\tcase ENC_UABA_ASIMDSAME_ONLY:\n\tcase ENC_UABD_ASIMDSAME_ONLY:\n\tcase ENC_UHADD_ASIMDSAME_ONLY:\n\tcase ENC_UHSUB_ASIMDSAME_ONLY:\n\tcase ENC_UMAXP_ASIMDSAME_ONLY:\n\tcase ENC_UMAX_ASIMDSAME_ONLY:\n\tcase ENC_UMINP_ASIMDSAME_ONLY:\n\tcase ENC_UMIN_ASIMDSAME_ONLY:\n\tcase ENC_UQADD_ASIMDSAME_ONLY:\n\tcase ENC_UQRSHL_ASIMDSAME_ONLY:\n\tcase ENC_UQSHL_ASIMDSAME_ONLY:\n\tcase ENC_UQSUB_ASIMDSAME_ONLY:\n\tcase ENC_URHADD_ASIMDSAME_ONLY:\n\tcase ENC_URSHL_ASIMDSAME_ONLY:\n\tcase ENC_USHL_ASIMDSAME_ONLY:\n\tcase ENC_UZP1_ASIMDPERM_ONLY:\n\tcase ENC_UZP2_ASIMDPERM_ONLY:\n\tcase ENC_ZIP1_ASIMDPERM_ONLY:\n\tcase ENC_ZIP2_ASIMDPERM_ONLY:\n\tcase ENC_ORR_ASIMDSAME_ONLY:\n\t{\n\t\tif (instr->encoding == ENC_ORR_ASIMDSAME_ONLY)\n\t\t\tarr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[ctx->Q];\n\t\telse\n\t\t\tarr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[ctx->size * 2 + ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ORN_ASIMDSAME_ONLY:\n\tcase ENC_BIC_ASIMDSAME_ONLY:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_EXT_ASIMDEXT_ONLY:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b[ctx->Q];\n\t\tuint64_t const_ = ctx->imm4;\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>, #<const>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_FCADD_ASIMDSAME2_C:\n\tcase ENC_FCMLA_ASIMDSAME2_C:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tuint64_t rotate;\n\t\tif (instr->encoding == ENC_FCADD_ASIMDSAME2_C)\n\t\t\trotate = ctx->rot ? 270 : 90;\n\t\telse\n\t\t\trotate = 90 * ctx->rot;\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>, #<rotate>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_ASIMDELEM_R_SD:\n\tcase ENC_FMLS_ASIMDELEM_R_SD:\n\tcase ENC_FMULX_ASIMDELEM_R_SD:\n\tcase ENC_FMUL_ASIMDELEM_R_SD:\n\t{\n\t\tArrangementSpec arr_spec0 = table_2s_r_4s_2d[(ctx->Q << 1) | ctx->sz];\n\t\tArrangementSpec arr_spec1 = table_s_d[ctx->sz];\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec0)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec0)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec1, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MLA_ASIMDELEM_R:\n\tcase ENC_MLS_ASIMDELEM_R:\n\tcase ENC_MUL_ASIMDELEM_R:\n\tcase ENC_SQDMULH_ASIMDELEM_R:\n\tcase ENC_SQRDMLAH_ASIMDELEM_R:\n\tcase ENC_SQRDMLSH_ASIMDELEM_R:\n\tcase ENC_SQRDMULH_ASIMDELEM_R:\n\t{\n\t\tArrangementSpec arr_spec0 = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tArrangementSpec arr_spec1 = table_r_h_s_d[ctx->size];\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec0)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec0)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec1, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCMLA_ASIMDELEM_C_H:\n\tcase ENC_FCMLA_ASIMDELEM_C_S:\n\t{\n\t\tArrangementSpec arr_spec0 = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tArrangementSpec arr_spec1 = table_r_h_s_d[ctx->size];\n\t\tuint64_t rotate = 90 * ctx->rot;\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.<T>[<index>], #<rotate>\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec0)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec0)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec1, ctx->index);\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_ASIMDELEM_RH_H:\n\tcase ENC_FMLS_ASIMDELEM_RH_H:\n\tcase ENC_FMULX_ASIMDELEM_RH_H:\n\tcase ENC_FMUL_ASIMDELEM_RH_H:\n\t{\n\t\tArrangementSpec arr_spec = table_4h_8h[ctx->Q];\n\t\t// <Vd>.<T>,<Vn>.<T>,<Vm>.H[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_DUP_ASIMDINS_DV_V:\n\t{\n\t\tArrangementSpec arr_spec0 = arr_spec_method4(ctx->imm5, ctx->Q);\n\t\tArrangementSpec arr_spec1 = size_spec_method3(ctx->imm5);\n\t\t// <Vd>.<T>,<Vn>.<T>[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, arr_spec0)\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec1, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SADALP_ASIMDMISC_P:\n\tcase ENC_SADDLP_ASIMDMISC_P:\n\tcase ENC_UADALP_ASIMDMISC_P:\n\tcase ENC_UADDLP_ASIMDMISC_P:\n\t{\n\t\tArrangementSpec Ta = table_4h_8h_2s_4s_1d_2d_r_r[(ctx->size << 1) | ctx->Q];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_SDOT_ASIMDELEM_D:\n\tcase ENC_SUDOT_ASIMDELEM_D:\n\tcase ENC_UDOT_ASIMDELEM_D:\n\tcase ENC_USDOT_ASIMDELEM_D:\n\t{\n\t\tArrangementSpec arr_spec_4b = _4B;\n\t\tArrangementSpec Ta = table_2s_4s[ctx->Q];\n\t\tArrangementSpec Tb = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>,<Vm>.4B[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec_4b, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FMLSL2_ASIMDSAME_F:\n\tcase ENC_FMLAL2_ASIMDSAME_F:\n\t{\n\t\tArrangementSpec Ta = table_2s_4s[ctx->Q];\n\t\tArrangementSpec Tb = table_2h_4h[ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>,<Vm>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->m, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_BFDOT_ASIMDSAME2_D:\n\tcase ENC_FMLAL_ASIMDSAME_F:\n\tcase ENC_FMLSL_ASIMDSAME_F:\n\t{\n\t\tArrangementSpec Ta = table_2s_4s[ctx->Q];\n\t\tArrangementSpec Tb = table_2h_4h[ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>,<Vm>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->m, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_HISTSEG_Z_ZZ_:\n\tcase ENC_PMUL_Z_ZZ_:\n\t{\n\t\t// <Zda>.B,<Zn>.B,<Zm>.B\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1B)\n\t\tbreak;\n\t}\n\tcase ENC_SMMLA_Z_ZZZ_:\n\tcase ENC_UMMLA_Z_ZZZ_:\n\tcase ENC_USDOT_Z_ZZZ_S:\n\tcase ENC_USMMLA_Z_ZZZ_:\n\t{\n\t\t// <Zda>.S,<Zn>.B,<Zm>.B\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1B)\n\t\tbreak;\n\t}\n\tcase ENC_FMMLA_Z_ZZZ_S:\n\t{\n\t\t// <Zda>.S,<Zn>.S,<Zm>.S\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_SM4E_Z_ZZ_:\n\t{\n\t\t// <Zdn>.S,<Zdn>.S,<Zm>.S\n\t\tADD_OPERAND_ZREG_T(ctx->dn, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->dn, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_SM4EKEY_Z_ZZ_:\n\t{\n\t\t// <Zd>.S,<Zn>.S,<Zm>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_BFDOT_Z_ZZZ_:\n\tcase ENC_BFMLALB_Z_ZZZ_:\n\tcase ENC_BFMLALT_Z_ZZZ_:\n\tcase ENC_BFMMLA_Z_ZZZ_:\n\tcase ENC_FMLALB_Z_ZZZ_:\n\tcase ENC_FMLALT_Z_ZZZ_:\n\tcase ENC_FMLSLB_Z_ZZZ_:\n\tcase ENC_FMLSLT_Z_ZZZ_:\n\t{\n\t\t// <Zda>.S,<Zn>.H,<Zm>.H\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1H)\n\t\tbreak;\n\t}\n\tcase ENC_USDOT_Z_ZZZI_S:\n\tcase ENC_SUDOT_Z_ZZZI_S:\n\t{\n\t\t// <Zda>.S,<Zn>.B,<Zm>.B[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1B)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1B, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_BFDOT_Z_ZZZI_:\n\tcase ENC_BFMLALB_Z_ZZZI_:\n\tcase ENC_BFMLALT_Z_ZZZI_:\n\tcase ENC_FMLALB_Z_ZZZI_S:\n\tcase ENC_FMLALT_Z_ZZZI_S:\n\tcase ENC_FMLSLB_Z_ZZZI_S:\n\tcase ENC_FMLSLT_Z_ZZZI_S:\n\tcase ENC_SMLALB_Z_ZZZI_S:\n\tcase ENC_SMLALT_Z_ZZZI_S:\n\tcase ENC_SMLSLB_Z_ZZZI_S:\n\tcase ENC_SMLSLT_Z_ZZZI_S:\n\tcase ENC_SQDMLALB_Z_ZZZI_S:\n\tcase ENC_SQDMLALT_Z_ZZZI_S:\n\tcase ENC_SQDMLSLB_Z_ZZZI_S:\n\tcase ENC_SQDMLSLT_Z_ZZZI_S:\n\tcase ENC_UMLALB_Z_ZZZI_S:\n\tcase ENC_UMLALT_Z_ZZZI_S:\n\tcase ENC_UMLSLB_Z_ZZZI_S:\n\tcase ENC_UMLSLT_Z_ZZZI_S:\n\t{\n\t\t// <Zda>.S,<Zn>.H,<Zm>.H[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SMULLB_Z_ZZI_S:\n\tcase ENC_SMULLT_Z_ZZI_S:\n\tcase ENC_SQDMULLB_Z_ZZI_S:\n\tcase ENC_SQDMULLT_Z_ZZI_S:\n\tcase ENC_UMULLB_Z_ZZI_S:\n\tcase ENC_UMULLT_Z_ZZI_S:\n\t{\n\t\t// <Zd>.S,<Zn>.H,<Zm>.H[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SMULLB_Z_ZZI_D:\n\tcase ENC_SMULLT_Z_ZZI_D:\n\tcase ENC_SQDMULLB_Z_ZZI_D:\n\tcase ENC_SQDMULLT_Z_ZZI_D:\n\tcase ENC_UMULLB_Z_ZZI_D:\n\tcase ENC_UMULLT_Z_ZZI_D:\n\t{\n\t\t// <Zd>.D,<Zn>.S,<Zm>.S[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SMLALB_Z_ZZZI_D:\n\tcase ENC_SMLALT_Z_ZZZI_D:\n\tcase ENC_SMLSLB_Z_ZZZI_D:\n\tcase ENC_SMLSLT_Z_ZZZI_D:\n\tcase ENC_SQDMLALB_Z_ZZZI_D:\n\tcase ENC_SQDMLALT_Z_ZZZI_D:\n\tcase ENC_SQDMLSLB_Z_ZZZI_D:\n\tcase ENC_SQDMLSLT_Z_ZZZI_D:\n\tcase ENC_UMLALB_Z_ZZZI_D:\n\tcase ENC_UMLALT_Z_ZZZI_D:\n\tcase ENC_UMLSLB_Z_ZZZI_D:\n\tcase ENC_UMLSLT_Z_ZZZI_D:\n\t{\n\t\t// <Zda>.D,<Zn>.S,<Zm>.S[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_TRN1_Z_ZZ_Q:\n\tcase ENC_TRN2_Z_ZZ_Q:\n\tcase ENC_UZP1_Z_ZZ_Q:\n\tcase ENC_UZP2_Z_ZZ_Q:\n\tcase ENC_ZIP1_Z_ZZ_Q:\n\tcase ENC_ZIP2_Z_ZZ_Q:\n\t{\n\t\t// <Zd>.Q,<Zn>.Q,<Zm>.Q\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1Q)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1Q)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1Q)\n\t\tbreak;\n\t}\n\tcase ENC_SDOT_ASIMDSAME2_D:\n\tcase ENC_UDOT_ASIMDSAME2_D:\n\tcase ENC_USDOT_ASIMDSAME2_D:\n\t{\n\t\tArrangementSpec Ta = table_2s_4s[ctx->Q];\n\t\tArrangementSpec Tb = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>,<Vm>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->m, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_FMLAL2_ASIMDELEM_LH:\n\tcase ENC_FMLAL_ASIMDELEM_LH:\n\tcase ENC_FMLSL2_ASIMDELEM_LH:\n\tcase ENC_FMLSL_ASIMDELEM_LH:\n\t{\n\t\tArrangementSpec Ta = table_2s_4s[ctx->Q];\n\t\tArrangementSpec Tb = table_2h_4h[ctx->Q];\n\t\t// <Vd>.<Ta>,<Vn>.<Tb>,<Vm>.H[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_TBL_ASIMDTBL_L4_4:\n\tcase ENC_TBX_ASIMDTBL_L4_4:\n\t{\n\t\tArrangementSpec Ta = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,{<Vn>.16B,<Vn+1>.16B,<Vn+2>.16B,<Vn+3>.16B},<Vm>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_MULTIREG_4(REG_V_BASE, _16B, ctx->n);\n\t\tADD_OPERAND_VREG_T(ctx->m, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_TBL_ASIMDTBL_L3_3:\n\tcase ENC_TBX_ASIMDTBL_L3_3:\n\t{\n\t\tArrangementSpec Ta = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,{<Vn>.16B,<Vn+1>.16B,<Vn+2>.16B},<Vm>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, _16B, ctx->n);\n\t\tADD_OPERAND_VREG_T(ctx->m, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_TBL_ASIMDTBL_L2_2:\n\tcase ENC_TBX_ASIMDTBL_L2_2:\n\t{\n\t\tArrangementSpec Ta = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,{<Vn>.16B,<Vn+1>.16B},<Vm>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_MULTIREG_2(REG_V_BASE, _16B, ctx->n);\n\t\tADD_OPERAND_VREG_T(ctx->m, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_TBL_ASIMDTBL_L1_1:\n\tcase ENC_TBX_ASIMDTBL_L1_1:\n\t{\n\t\tArrangementSpec Ta = table_8b_16b[ctx->Q];\n\t\t// <Vd>.<Ta>,{<Vn>.16B},<Vm>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_MULTIREG_1(REG_V_BASE, _16B, ctx->n);\n\t\tADD_OPERAND_VREG_T(ctx->m, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_INS_ASIMDINS_IV_V:\n\tcase ENC_MOV_INS_ASIMDINS_IV_V:\n\t{\n\t\tArrangementSpec arr_spec = size_spec_method3(ctx->imm5);\n\n\t\t/*\n\t\tuint64_t INDEX1= 0, INDEX2 = 0;\n\t\tif ((ctx->imm5 & 1) == 1)\n\t\t{\n\t\t\tINDEX1 = (ctx->imm5 >> 1) & 15;\n\t\t\tINDEX2 = (ctx->imm4 >> 0) & 15;\n\t\t}\n\t\tif ((ctx->imm5 & 3) == 2)\n\t\t{\n\t\t\tINDEX1 = (ctx->imm5 >> 2) & 7;\n\t\t\tINDEX2 = (ctx->imm4 >> 1) & 7;\n\t\t}\n\t\tif ((ctx->imm5 & 7) == 4)\n\t\t{\n\t\t\tINDEX1 = (ctx->imm5 >> 3) & 3;\n\t\t\tINDEX2 = (ctx->imm4 >> 2) & 3;\n\t\t}\n\t\tif ((ctx->imm5 & 15) == 8)\n\t\t{\n\t\t\tINDEX1 = (ctx->imm5 >> 4) & 1;\n\t\t\tINDEX2 = (ctx->imm4 >> 3) & 1;\n\t\t}\n\t\t*/\n\n\t\t// <Vd>.<T>[<index1>],<Vn>.<T>[<index2>]\n\t\tADD_OPERAND_VREG_T_LANE(ctx->d, arr_spec, ctx->dst_index);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec, ctx->src_index);\n\t\tbreak;\n\t}\n\tcase ENC_INS_ASIMDINS_IR_R:\n\tcase ENC_MOV_INS_ASIMDINS_IR_R:\n\t{\n\t\tunsigned rn_base = rwwwx_0123x_reg(ctx->imm5, ctx->Rn);\n\t\tArrangementSpec arr_spec = size_spec_method3(ctx->imm5);\n\t\t// <Vd>.<T>[<index>],<R><n>\n\t\tADD_OPERAND_VREG_T_LANE(ctx->d, arr_spec, ctx->index);\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_V64I_FLOAT2INT:\n\t{\n\t\t// <Vd>.D[1],<Xn>\n\t\tADD_OPERAND_VREG_T_LANE(ctx->d, _1D, 1);\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_MOV_MOVN_32_MOVEWIDE:\n\tcase ENC_MOV_MOVZ_32_MOVEWIDE:\n\t{\n\t\tint32_t imm = ctx->imm << (ctx->hw * 16);\n\t\tif (instr->encoding == ENC_MOV_MOVN_32_MOVEWIDE)\n\t\t\timm ^= 0xFFFFFFFF;\n\n\t\t// <Wd>, #<imm32>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_MOVK_32_MOVEWIDE:\n\tcase ENC_MOVN_32_MOVEWIDE:\n\tcase ENC_MOVZ_32_MOVEWIDE:\n\t{\n\t\tuint64_t imm = ctx->imm & 0xFFFFFFFF;\n\t\t// <Wd>, #<imm32>{, LSL #<shift>}\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tif (ctx->hw)\n\t\t{\n\t\t\tinstr->operands[1].shiftType = ShiftType_LSL;\n\t\t\tinstr->operands[1].shiftValue = 16;\n\t\t\tinstr->operands[1].shiftValueUsed = 1;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BFC_BFM_32M_BITFIELD:  // 32-bit (sf == 0 && N == 0)\n\t{\n\t\tunsigned lsb = 32 - IMMR;\n\t\tunsigned width = IMMS + 1;\n\t\t// <Wd>, #<lsb>, #<width>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_32D_FLOAT2INT:\n\tcase ENC_FCVTAU_32D_FLOAT2INT:\n\tcase ENC_FCVTMS_32D_FLOAT2INT:\n\tcase ENC_FCVTMU_32D_FLOAT2INT:\n\tcase ENC_FCVTNS_32D_FLOAT2INT:\n\tcase ENC_FCVTNU_32D_FLOAT2INT:\n\tcase ENC_FCVTPS_32D_FLOAT2INT:\n\tcase ENC_FCVTPU_32D_FLOAT2INT:\n\tcase ENC_FCVTZS_32D_FLOAT2INT:\n\tcase ENC_FCVTZU_32D_FLOAT2INT:\n\tcase ENC_FJCVTZS_32D_FLOAT2INT:\n\t{\n\t\t// <Wd>,<Dn>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_DN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_32D_FLOAT2FIX:\n\tcase ENC_FCVTZU_32D_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Wd>,<Dn>, #<fbits>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_32H_FLOAT2INT:\n\tcase ENC_FCVTAU_32H_FLOAT2INT:\n\tcase ENC_FCVTMS_32H_FLOAT2INT:\n\tcase ENC_FCVTMU_32H_FLOAT2INT:\n\tcase ENC_FCVTNS_32H_FLOAT2INT:\n\tcase ENC_FCVTNU_32H_FLOAT2INT:\n\tcase ENC_FCVTPS_32H_FLOAT2INT:\n\tcase ENC_FCVTPU_32H_FLOAT2INT:\n\tcase ENC_FCVTZS_32H_FLOAT2INT:\n\tcase ENC_FCVTZU_32H_FLOAT2INT:\n\tcase ENC_FMOV_32H_FLOAT2INT:\n\t{\n\t\t// <Wd>,<Hn>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_HN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_32H_FLOAT2FIX:\n\tcase ENC_FCVTZU_32H_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Wd>,<Hn>, #<fbits>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_32S_FLOAT2INT:\n\tcase ENC_FCVTAU_32S_FLOAT2INT:\n\tcase ENC_FCVTMS_32S_FLOAT2INT:\n\tcase ENC_FCVTMU_32S_FLOAT2INT:\n\tcase ENC_FCVTNS_32S_FLOAT2INT:\n\tcase ENC_FCVTNU_32S_FLOAT2INT:\n\tcase ENC_FCVTPS_32S_FLOAT2INT:\n\tcase ENC_FCVTPU_32S_FLOAT2INT:\n\tcase ENC_FCVTZS_32S_FLOAT2INT:\n\tcase ENC_FCVTZU_32S_FLOAT2INT:\n\tcase ENC_FMOV_32S_FLOAT2INT:\n\t{\n\t\t// <Wd>,<Sn>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_SN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_32S_FLOAT2FIX:\n\tcase ENC_FCVTZU_32S_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Wd>,<Sn>, #<fbits>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_SMOV_ASIMDINS_W_W:\n\tcase ENC_UMOV_ASIMDINS_W_W:\n\t{\n\t\tArrangementSpec arr_spec = ctx->esize == 16 ? _1H : _1B;\n\t\t// <Wd>,<Vn>.<T>[<index>]\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_UMOV_ASIMDINS_W_W:\n\t{\n\t\t// <Wd>,<Vn>.S[<index>]\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_32_LOG_SHIFT:\n\tcase ENC_NGCS_SBCS_32_ADDSUB_CARRY:\n\tcase ENC_NGC_SBC_32_ADDSUB_CARRY:\n\t{\n\t\t// <Wd>,<Wm>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WM;\n\t\tbreak;\n\t}\n\tcase ENC_MVN_ORN_32_LOG_SHIFT:\n\tcase ENC_NEGS_SUBS_32_ADDSUB_SHIFT:\n\tcase ENC_NEG_SUB_32_ADDSUB_SHIFT:\n\t{\n\t\t// <Wd>,<Wm>{,<shift>#<amount>}\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_CLS_32_DP_1SRC:\n\tcase ENC_CLZ_32_DP_1SRC:\n\tcase ENC_RBIT_32_DP_1SRC:\n\tcase ENC_REV16_32_DP_1SRC:\n\tcase ENC_REV_32_DP_1SRC:\n\tcase ENC_SXTB_SBFM_32M_BITFIELD:\n\tcase ENC_SXTH_SBFM_32M_BITFIELD:\n\tcase ENC_UXTB_UBFM_32M_BITFIELD:\n\tcase ENC_UXTH_UBFM_32M_BITFIELD:\n\t{\n\t\t// <Wd>,<Wn>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_ANDS_32S_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm & 0xFFFFFFFF;\n\t\t// <Wd>,<Wn>, #<imm>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_BFI_BFM_32M_BITFIELD:\n\tcase ENC_SBFIZ_SBFM_32M_BITFIELD:\n\tcase ENC_UBFIZ_UBFM_32M_BITFIELD:\n\tcase ENC_UBFX_UBFM_32M_BITFIELD:\n\t{\n\t\tunsigned lsb, width;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_BFI_BFM_32M_BITFIELD:\n\t\tcase ENC_SBFIZ_SBFM_32M_BITFIELD:\n\t\tcase ENC_UBFIZ_UBFM_32M_BITFIELD:\n\t\t\tlsb = -IMMR % 32;\n\t\t\twidth = IMMS + 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlsb = IMMR;\n\t\t\twidth = IMMS - IMMR + 1;\n\t\t}\n\n\t\t// <Wd>,<Wn>, #<lsb>, #<width>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_BFXIL_BFM_32M_BITFIELD:\n\tcase ENC_SBFX_SBFM_32M_BITFIELD:\n\t{\n\t\tunsigned lsb = IMMR;\n\t\tunsigned width = IMMS - IMMR + 1;\n\t\t// <Wd>,<Wn>, #<lsb>, #<width>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_ASR_SBFM_32M_BITFIELD:\n\tcase ENC_LSL_UBFM_32M_BITFIELD:\n\tcase ENC_LSR_UBFM_32M_BITFIELD:\n\t{\n\t\tunsigned const_ = (instr->encoding == ENC_LSL_UBFM_32M_BITFIELD) ? 31 - ctx->imms : ctx->immr;\n\t\t// <Wd>,<Wn>, #<const>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_ADCS_32_ADDSUB_CARRY:\n\tcase ENC_ADC_32_ADDSUB_CARRY:\n\tcase ENC_ASRV_32_DP_2SRC:\n\tcase ENC_ASR_ASRV_32_DP_2SRC:\n\tcase ENC_CRC32B_32C_DP_2SRC:\n\tcase ENC_CRC32CB_32C_DP_2SRC:\n\tcase ENC_CRC32CH_32C_DP_2SRC:\n\tcase ENC_CRC32CW_32C_DP_2SRC:\n\tcase ENC_CRC32H_32C_DP_2SRC:\n\tcase ENC_CRC32W_32C_DP_2SRC:\n\tcase ENC_LSLV_32_DP_2SRC:\n\tcase ENC_LSL_LSLV_32_DP_2SRC:\n\tcase ENC_LSRV_32_DP_2SRC:\n\tcase ENC_LSR_LSRV_32_DP_2SRC:\n\tcase ENC_MNEG_MSUB_32A_DP_3SRC:\n\tcase ENC_MUL_MADD_32A_DP_3SRC:\n\tcase ENC_RORV_32_DP_2SRC:\n\tcase ENC_ROR_RORV_32_DP_2SRC:\n\tcase ENC_SBCS_32_ADDSUB_CARRY:\n\tcase ENC_SBC_32_ADDSUB_CARRY:\n\tcase ENC_SDIV_32_DP_2SRC:\n\tcase ENC_UDIV_32_DP_2SRC:\n\t{\n\t\t// <Wd>,<Wn>,<Wm>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tbreak;\n\t}\n\tcase ENC_EXTR_32_EXTRACT:\n\t{\n\t\tunsigned lsb = ctx->lsb;\n\t\t// <Wd>,<Wn>,<Wm>, #<lsb>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tADD_OPERAND_LSB;\n\t\tbreak;\n\t}\n\tcase ENC_MADD_32A_DP_3SRC:\n\tcase ENC_MSUB_32A_DP_3SRC:\n\t{\n\t\t// <Wd>,<Wn>,<Wm>,<Wa>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tADD_OPERAND_WA;\n\t\tbreak;\n\t}\n\tcase ENC_CSEL_32_CONDSEL:\n\tcase ENC_CSINC_32_CONDSEL:\n\tcase ENC_CSINV_32_CONDSEL:\n\tcase ENC_CSNEG_32_CONDSEL:\n\t{\n\t\t// <Wd>,<Wn>,<Wm>,<cond>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_32_ADDSUB_SHIFT:\n\tcase ENC_ADD_32_ADDSUB_SHIFT:\n\tcase ENC_ANDS_32_LOG_SHIFT:\n\tcase ENC_AND_32_LOG_SHIFT:\n\tcase ENC_BICS_32_LOG_SHIFT:\n\tcase ENC_BIC_32_LOG_SHIFT:\n\tcase ENC_EON_32_LOG_SHIFT:\n\tcase ENC_EOR_32_LOG_SHIFT:\n\tcase ENC_ORN_32_LOG_SHIFT:\n\tcase ENC_ORR_32_LOG_SHIFT:\n\tcase ENC_SUBS_32_ADDSUB_SHIFT:\n\tcase ENC_SUB_32_ADDSUB_SHIFT:\n\t{\n\t\t// <Wd>,<Wn>,<Wm>{,<shift>#<amount>}\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_CRC32CX_64C_DP_2SRC:\n\tcase ENC_CRC32X_64C_DP_2SRC:\n\t{\n\t\t// <Wd>,<Wn>,<Xm>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_XM;\n\t\tbreak;\n\t}\n\tcase ENC_CINC_CSINC_32_CONDSEL:\n\tcase ENC_CINV_CSINV_32_CONDSEL:\n\tcase ENC_CNEG_CSNEG_32_CONDSEL:\n\t{\n\t\t// <Wd>,<Wn>,<cond_neg>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_COND_NEG;\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_32S_ADDSUB_IMM:\n\tcase ENC_SUBS_32S_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Wd>,<Wn|WSP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_32S_ADDSUB_EXT:\n\tcase ENC_SUBS_32S_ADDSUB_EXT:\n\t{\n\t\t// <Wd>,<Wn|WSP>,<Wm>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_EXTEND_AMOUNT_32(ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_ROR_EXTR_32_EXTRACT:\n\t{\n\t\tunsigned shift = IMMS;\n\t\t// <Wd>,<Wn>, #<shift>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CSETM_CSINV_32_CONDSEL:\n\tcase ENC_CSET_CSINC_32_CONDSEL:\n\t{\n\t\t// <Wd>,<cond_neg>\n\t\tADD_OPERAND_WD;\n\t\tADD_OPERAND_COND_NEG;\n\t\tbreak;\n\t}\n\tcase ENC_UQDECP_R_P_R_UW:\n\tcase ENC_UQINCP_R_P_R_UW:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Wdn>,<Pm>.<T>\n\t\tADD_OPERAND_WDN;\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_UQDECB_R_RS_UW:\n\tcase ENC_UQDECD_R_RS_UW:\n\tcase ENC_UQDECH_R_RS_UW:\n\tcase ENC_UQDECW_R_RS_UW:\n\tcase ENC_UQINCB_R_RS_UW:\n\tcase ENC_UQINCD_R_RS_UW:\n\tcase ENC_UQINCH_R_RS_UW:\n\tcase ENC_UQINCW_R_RS_UW:\n\t{\n\t\t// <Wdn>{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_WDN;\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_32_LOG_IMM:\n\t{\n\t\tuint32_t imm = ctx->imm & 0xFFFFFFFF;\n\t\t// <Wd|WSP>, #<imm>\n\t\tADD_OPERAND_WD_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_AND_32_LOG_IMM:\n\tcase ENC_EOR_32_LOG_IMM:\n\tcase ENC_ORR_32_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm & 0xFFFFFFFF;\n\t\t// <Wd|WSP>,<Wn>, #<imm>\n\t\tADD_OPERAND_WD_SP;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ADD_32_ADDSUB_IMM:\n\t{\n\t\t// <Wd|WSP>,<Wn|WSP>\n\t\tADD_OPERAND_WD_SP;\n\t\tADD_OPERAND_WN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_ADD_32_ADDSUB_IMM:\n\tcase ENC_SUB_32_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Wd|WSP>,<Wn|WSP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_WD_SP;\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADD_32_ADDSUB_EXT:\n\tcase ENC_SUB_32_ADDSUB_EXT:\n\t{\n\t\t// <Wd|WSP>,<Wn|WSP>,<Wm>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_WD_SP;\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_EXTEND_AMOUNT_32(ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_SETF16_ONLY_SETF:\n\tcase ENC_SETF8_ONLY_SETF:\n\t{\n\t\t// <Wn>\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_TST_ANDS_32S_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm & 0xFFFFFFFF;\n\t\t// <Wn>, #<imm>\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CCMN_32_CONDCMP_IMM:\n\tcase ENC_CCMP_32_CONDCMP_IMM:\n\t{\n\t\tuint32_t imm = ctx->imm;\n\t\t// <Wn>, #<imm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_CCMN_32_CONDCMP_REG:\n\tcase ENC_CCMP_32_CONDCMP_REG:\n\t{\n\t\t// <Wn>,<Wm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_32_ADDSUB_SHIFT:\n\tcase ENC_CMP_SUBS_32_ADDSUB_SHIFT:\n\tcase ENC_TST_ANDS_32_LOG_SHIFT:\n\t{\n\t\t// <Wn>,<Wm>{,<shift>#<amount>}\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_32S_ADDSUB_IMM:\n\tcase ENC_CMP_SUBS_32S_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Wn|WSP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_32S_ADDSUB_EXT:\n\tcase ENC_CMP_SUBS_32S_ADDSUB_EXT:\n\t{\n\t\t// <Wn|WSP>,<Wm>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_WN_SP;\n\t\tADD_OPERAND_WM;\n\t\tOPTIONAL_EXTEND_AMOUNT_32(ctx->n);\n\t\t// instr->operands[i-1].shiftValueUsed = 1;\n\t\tbreak;\n\t}\n\tcase ENC_STADDB_LDADDB_32_MEMOP:\n\tcase ENC_STADDH_LDADDH_32_MEMOP:\n\tcase ENC_STADDLB_LDADDLB_32_MEMOP:\n\tcase ENC_STADDLH_LDADDLH_32_MEMOP:\n\tcase ENC_STADDL_LDADDL_32_MEMOP:\n\tcase ENC_STADD_LDADD_32_MEMOP:\n\tcase ENC_STCLRB_LDCLRB_32_MEMOP:\n\tcase ENC_STCLRH_LDCLRH_32_MEMOP:\n\tcase ENC_STCLRLB_LDCLRLB_32_MEMOP:\n\tcase ENC_STCLRLH_LDCLRLH_32_MEMOP:\n\tcase ENC_STCLRL_LDCLRL_32_MEMOP:\n\tcase ENC_STCLR_LDCLR_32_MEMOP:\n\tcase ENC_STEORB_LDEORB_32_MEMOP:\n\tcase ENC_STEORH_LDEORH_32_MEMOP:\n\tcase ENC_STEORLB_LDEORLB_32_MEMOP:\n\tcase ENC_STEORLH_LDEORLH_32_MEMOP:\n\tcase ENC_STEORL_LDEORL_32_MEMOP:\n\tcase ENC_STEOR_LDEOR_32_MEMOP:\n\tcase ENC_STSETB_LDSETB_32_MEMOP:\n\tcase ENC_STSETH_LDSETH_32_MEMOP:\n\tcase ENC_STSETLB_LDSETLB_32_MEMOP:\n\tcase ENC_STSETLH_LDSETLH_32_MEMOP:\n\tcase ENC_STSETL_LDSETL_32_MEMOP:\n\tcase ENC_STSET_LDSET_32_MEMOP:\n\tcase ENC_STSMAXB_LDSMAXB_32_MEMOP:\n\tcase ENC_STSMAXH_LDSMAXH_32_MEMOP:\n\tcase ENC_STSMAXLB_LDSMAXLB_32_MEMOP:\n\tcase ENC_STSMAXLH_LDSMAXLH_32_MEMOP:\n\tcase ENC_STSMAXL_LDSMAXL_32_MEMOP:\n\tcase ENC_STSMAX_LDSMAX_32_MEMOP:\n\tcase ENC_STSMINB_LDSMINB_32_MEMOP:\n\tcase ENC_STSMINH_LDSMINH_32_MEMOP:\n\tcase ENC_STSMINLB_LDSMINLB_32_MEMOP:\n\tcase ENC_STSMINLH_LDSMINLH_32_MEMOP:\n\tcase ENC_STSMINL_LDSMINL_32_MEMOP:\n\tcase ENC_STSMIN_LDSMIN_32_MEMOP:\n\tcase ENC_STUMAXB_LDUMAXB_32_MEMOP:\n\tcase ENC_STUMAXH_LDUMAXH_32_MEMOP:\n\tcase ENC_STUMAXLB_LDUMAXLB_32_MEMOP:\n\tcase ENC_STUMAXLH_LDUMAXLH_32_MEMOP:\n\tcase ENC_STUMAXL_LDUMAXL_32_MEMOP:\n\tcase ENC_STUMAX_LDUMAX_32_MEMOP:\n\tcase ENC_STUMINB_LDUMINB_32_MEMOP:\n\tcase ENC_STUMINH_LDUMINH_32_MEMOP:\n\tcase ENC_STUMINLB_LDUMINLB_32_MEMOP:\n\tcase ENC_STUMINLH_LDUMINLH_32_MEMOP:\n\tcase ENC_STUMINL_LDUMINL_32_MEMOP:\n\tcase ENC_STUMIN_LDUMIN_32_MEMOP:\n\t{\n\t\t// <Ws>, [<Xn|SP>]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CASPAL_CP32_COMSWAPPR:\n\tcase ENC_CASPA_CP32_COMSWAPPR:\n\tcase ENC_CASPL_CP32_COMSWAPPR:\n\tcase ENC_CASP_CP32_COMSWAPPR:\n\t{\n\t\t// <Ws>,<W(s+1)>,<Wt>,<W(t+1)>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_WS_PLUS_1;\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_WT_PLUS_1;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_STLXP_SP32_LDSTEXCLP:\n\tcase ENC_STXP_SP32_LDSTEXCLP:\n\t{\n\t\t// <Ws>,<Wt1>,<Wt2>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_WT1;\n\t\tADD_OPERAND_WT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LDADDAB_32_MEMOP:\n\tcase ENC_LDADDAH_32_MEMOP:\n\tcase ENC_LDADDALB_32_MEMOP:\n\tcase ENC_LDADDALH_32_MEMOP:\n\tcase ENC_LDADDAL_32_MEMOP:\n\tcase ENC_LDADDA_32_MEMOP:\n\tcase ENC_LDADDB_32_MEMOP:\n\tcase ENC_LDADDH_32_MEMOP:\n\tcase ENC_LDADDLB_32_MEMOP:\n\tcase ENC_LDADDLH_32_MEMOP:\n\tcase ENC_LDADDL_32_MEMOP:\n\tcase ENC_LDADD_32_MEMOP:\n\tcase ENC_LDCLRAB_32_MEMOP:\n\tcase ENC_LDCLRAH_32_MEMOP:\n\tcase ENC_LDCLRALB_32_MEMOP:\n\tcase ENC_LDCLRALH_32_MEMOP:\n\tcase ENC_LDCLRAL_32_MEMOP:\n\tcase ENC_LDCLRA_32_MEMOP:\n\tcase ENC_LDCLRB_32_MEMOP:\n\tcase ENC_LDCLRH_32_MEMOP:\n\tcase ENC_LDCLRLB_32_MEMOP:\n\tcase ENC_LDCLRLH_32_MEMOP:\n\tcase ENC_LDCLRL_32_MEMOP:\n\tcase ENC_LDCLR_32_MEMOP:\n\tcase ENC_LDEORAB_32_MEMOP:\n\tcase ENC_LDEORAH_32_MEMOP:\n\tcase ENC_LDEORALB_32_MEMOP:\n\tcase ENC_LDEORALH_32_MEMOP:\n\tcase ENC_LDEORAL_32_MEMOP:\n\tcase ENC_LDEORA_32_MEMOP:\n\tcase ENC_LDEORB_32_MEMOP:\n\tcase ENC_LDEORH_32_MEMOP:\n\tcase ENC_LDEORLB_32_MEMOP:\n\tcase ENC_LDEORLH_32_MEMOP:\n\tcase ENC_LDEORL_32_MEMOP:\n\tcase ENC_LDEOR_32_MEMOP:\n\tcase ENC_LDSETAB_32_MEMOP:\n\tcase ENC_LDSETAH_32_MEMOP:\n\tcase ENC_LDSETALB_32_MEMOP:\n\tcase ENC_LDSETALH_32_MEMOP:\n\tcase ENC_LDSETAL_32_MEMOP:\n\tcase ENC_LDSETA_32_MEMOP:\n\tcase ENC_LDSETB_32_MEMOP:\n\tcase ENC_LDSETH_32_MEMOP:\n\tcase ENC_LDSETLB_32_MEMOP:\n\tcase ENC_LDSETLH_32_MEMOP:\n\tcase ENC_LDSETL_32_MEMOP:\n\tcase ENC_LDSET_32_MEMOP:\n\tcase ENC_LDSMAXAB_32_MEMOP:\n\tcase ENC_LDSMAXAH_32_MEMOP:\n\tcase ENC_LDSMAXALB_32_MEMOP:\n\tcase ENC_LDSMAXALH_32_MEMOP:\n\tcase ENC_LDSMAXAL_32_MEMOP:\n\tcase ENC_LDSMAXA_32_MEMOP:\n\tcase ENC_LDSMAXB_32_MEMOP:\n\tcase ENC_LDSMAXH_32_MEMOP:\n\tcase ENC_LDSMAXLB_32_MEMOP:\n\tcase ENC_LDSMAXLH_32_MEMOP:\n\tcase ENC_LDSMAXL_32_MEMOP:\n\tcase ENC_LDSMAX_32_MEMOP:\n\tcase ENC_LDSMINAB_32_MEMOP:\n\tcase ENC_LDSMINAH_32_MEMOP:\n\tcase ENC_LDSMINALB_32_MEMOP:\n\tcase ENC_LDSMINALH_32_MEMOP:\n\tcase ENC_LDSMINAL_32_MEMOP:\n\tcase ENC_LDSMINA_32_MEMOP:\n\tcase ENC_LDSMINB_32_MEMOP:\n\tcase ENC_LDSMINH_32_MEMOP:\n\tcase ENC_LDSMINLB_32_MEMOP:\n\tcase ENC_LDSMINLH_32_MEMOP:\n\tcase ENC_LDSMINL_32_MEMOP:\n\tcase ENC_LDSMIN_32_MEMOP:\n\tcase ENC_LDUMAXAB_32_MEMOP:\n\tcase ENC_LDUMAXAH_32_MEMOP:\n\tcase ENC_LDUMAXALB_32_MEMOP:\n\tcase ENC_LDUMAXALH_32_MEMOP:\n\tcase ENC_LDUMAXAL_32_MEMOP:\n\tcase ENC_LDUMAXA_32_MEMOP:\n\tcase ENC_LDUMAXB_32_MEMOP:\n\tcase ENC_LDUMAXH_32_MEMOP:\n\tcase ENC_LDUMAXLB_32_MEMOP:\n\tcase ENC_LDUMAXLH_32_MEMOP:\n\tcase ENC_LDUMAXL_32_MEMOP:\n\tcase ENC_LDUMAX_32_MEMOP:\n\tcase ENC_LDUMINAB_32_MEMOP:\n\tcase ENC_LDUMINAH_32_MEMOP:\n\tcase ENC_LDUMINALB_32_MEMOP:\n\tcase ENC_LDUMINALH_32_MEMOP:\n\tcase ENC_LDUMINAL_32_MEMOP:\n\tcase ENC_LDUMINA_32_MEMOP:\n\tcase ENC_LDUMINB_32_MEMOP:\n\tcase ENC_LDUMINH_32_MEMOP:\n\tcase ENC_LDUMINLB_32_MEMOP:\n\tcase ENC_LDUMINLH_32_MEMOP:\n\tcase ENC_LDUMINL_32_MEMOP:\n\tcase ENC_LDUMIN_32_MEMOP:\n\tcase ENC_SWPAB_32_MEMOP:\n\tcase ENC_SWPAH_32_MEMOP:\n\tcase ENC_SWPALB_32_MEMOP:\n\tcase ENC_SWPALH_32_MEMOP:\n\tcase ENC_SWPAL_32_MEMOP:\n\tcase ENC_SWPA_32_MEMOP:\n\tcase ENC_SWPB_32_MEMOP:\n\tcase ENC_SWPH_32_MEMOP:\n\tcase ENC_SWPLB_32_MEMOP:\n\tcase ENC_SWPLH_32_MEMOP:\n\tcase ENC_SWPL_32_MEMOP:\n\tcase ENC_SWP_32_MEMOP:\n\t{\n\t\t// <Ws>,<Wt>, [<Xn|SP>]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CASAB_C32_COMSWAP:\n\tcase ENC_CASAH_C32_COMSWAP:\n\tcase ENC_CASALB_C32_COMSWAP:\n\tcase ENC_CASALH_C32_COMSWAP:\n\tcase ENC_CASAL_C32_COMSWAP:\n\tcase ENC_CASA_C32_COMSWAP:\n\tcase ENC_CASB_C32_COMSWAP:\n\tcase ENC_CASH_C32_COMSWAP:\n\tcase ENC_CASLB_C32_COMSWAP:\n\tcase ENC_CASLH_C32_COMSWAP:\n\tcase ENC_CASL_C32_COMSWAP:\n\tcase ENC_CAS_C32_COMSWAP:\n\tcase ENC_STLXRB_SR32_LDSTEXCLR:\n\tcase ENC_STLXRH_SR32_LDSTEXCLR:\n\tcase ENC_STLXR_SR32_LDSTEXCLR:\n\tcase ENC_STXRB_SR32_LDSTEXCLR:\n\tcase ENC_STXRH_SR32_LDSTEXCLR:\n\tcase ENC_STXR_SR32_LDSTEXCLR:\n\t{\n\t\t// <Ws>,<Wt>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_STLXP_SP64_LDSTEXCLP:\n\tcase ENC_STXP_SP64_LDSTEXCLP:\n\t{\n\t\t// <Ws>,<Xt1>,<Xt2>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_STLXR_SR64_LDSTEXCLR:\n\tcase ENC_STXR_SR64_LDSTEXCLR:\n\t{\n\t\t// <Ws>,<Xt>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WS;\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_32_LDSTPAIR_PRE:\n\tcase ENC_STP_32_LDSTPAIR_PRE:\n\t{\n\t\t// <Wt1>,<Wt2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_WT1;\n\t\tADD_OPERAND_WT2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_32_LDSTPAIR_POST:\n\tcase ENC_STP_32_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Wt1>,<Wt2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_WT1;\n\t\tADD_OPERAND_WT2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDNP_32_LDSTNAPAIR_OFFS:\n\tcase ENC_LDP_32_LDSTPAIR_OFF:\n\tcase ENC_STNP_32_LDSTNAPAIR_OFFS:\n\tcase ENC_STP_32_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Wt1>,<Wt2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_WT1;\n\t\tADD_OPERAND_WT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDAXP_LP32_LDSTEXCLP:\n\tcase ENC_LDXP_LP32_LDSTEXCLP:\n\t{\n\t\t// <Wt1>,<Wt2>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WT1;\n\t\tADD_OPERAND_WT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LDRB_32_LDST_IMMPRE:\n\tcase ENC_LDRH_32_LDST_IMMPRE:\n\tcase ENC_LDRSB_32_LDST_IMMPRE:\n\tcase ENC_LDRSH_32_LDST_IMMPRE:\n\tcase ENC_LDR_32_LDST_IMMPRE:\n\tcase ENC_STRB_32_LDST_IMMPRE:\n\tcase ENC_STRH_32_LDST_IMMPRE:\n\tcase ENC_STR_32_LDST_IMMPRE:\n\t{\n\t\t// <Wt>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDRB_32B_LDST_REGOFF:\n\tcase ENC_LDRSB_32B_LDST_REGOFF:\n\tcase ENC_STRB_32B_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Wt>, [<Xn|SP>, (<Wm>|<Xm>),<extend>{<amount>}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT_0;\n\t\tbreak;\n\t}\n\tcase ENC_LDRH_32_LDST_REGOFF:\n\tcase ENC_LDRSH_32_LDST_REGOFF:\n\tcase ENC_LDR_32_LDST_REGOFF:\n\tcase ENC_STRH_32_LDST_REGOFF:\n\tcase ENC_STR_32_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Wt>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDRB_32BL_LDST_REGOFF:\n\tcase ENC_LDRSB_32BL_LDST_REGOFF:\n\tcase ENC_STRB_32BL_LDST_REGOFF:\n\t{\n\t\t// <Wt>, [<Xn|SP>,<Xm>{, LSL #0}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_LSL0;\n\t\tbreak;\n\t}\n\tcase ENC_ST64B_64L_MEMOP:\n\tcase ENC_LD64B_64L_MEMOP:\n\t{\n\t\t// <Xt>, [<Xn|SP> {,#0}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ST64BV_64_MEMOP:\n\tcase ENC_ST64BV0_64_MEMOP:\n\t{\n\t\t// <Xs>,<Xt>, [<Xn|SP> {,#0}]\n\t\tADD_OPERAND_XS;\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LDRB_32_LDST_IMMPOST:\n\tcase ENC_LDRH_32_LDST_IMMPOST:\n\tcase ENC_LDRSB_32_LDST_IMMPOST:\n\tcase ENC_LDRSH_32_LDST_IMMPOST:\n\tcase ENC_LDR_32_LDST_IMMPOST:\n\tcase ENC_STRB_32_LDST_IMMPOST:\n\tcase ENC_STRH_32_LDST_IMMPOST:\n\tcase ENC_STR_32_LDST_IMMPOST:\n\t{\n\t\t// <Wt>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDRB_32_LDST_POS:\n\tcase ENC_LDRH_32_LDST_POS:\n\tcase ENC_LDRSB_32_LDST_POS:\n\tcase ENC_LDRSH_32_LDST_POS:\n\tcase ENC_LDR_32_LDST_POS:\n\tcase ENC_STRB_32_LDST_POS:\n\tcase ENC_STRH_32_LDST_POS:\n\tcase ENC_STR_32_LDST_POS:\n\t{\n\t\t// <Wt>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDAPURB_32_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPURH_32_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPURSB_32_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPURSH_32_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPUR_32_LDAPSTL_UNSCALED:\n\tcase ENC_LDTRB_32_LDST_UNPRIV:\n\tcase ENC_LDTRH_32_LDST_UNPRIV:\n\tcase ENC_LDTRSB_32_LDST_UNPRIV:\n\tcase ENC_LDTRSH_32_LDST_UNPRIV:\n\tcase ENC_LDTR_32_LDST_UNPRIV:\n\tcase ENC_LDURB_32_LDST_UNSCALED:\n\tcase ENC_LDURH_32_LDST_UNSCALED:\n\tcase ENC_LDURSB_32_LDST_UNSCALED:\n\tcase ENC_LDURSH_32_LDST_UNSCALED:\n\tcase ENC_LDUR_32_LDST_UNSCALED:\n\tcase ENC_STLURB_32_LDAPSTL_UNSCALED:\n\tcase ENC_STLURH_32_LDAPSTL_UNSCALED:\n\tcase ENC_STLUR_32_LDAPSTL_UNSCALED:\n\tcase ENC_STTRB_32_LDST_UNPRIV:\n\tcase ENC_STTRH_32_LDST_UNPRIV:\n\tcase ENC_STTR_32_LDST_UNPRIV:\n\tcase ENC_STURB_32_LDST_UNSCALED:\n\tcase ENC_STURH_32_LDST_UNSCALED:\n\tcase ENC_STUR_32_LDST_UNSCALED:\n\t{\n\t\t// <Wt>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDAPRB_32L_MEMOP:\n\tcase ENC_LDAPRH_32L_MEMOP:\n\tcase ENC_LDAPR_32L_MEMOP:\n\tcase ENC_LDARB_LR32_LDSTORD:\n\tcase ENC_LDARH_LR32_LDSTORD:\n\tcase ENC_LDAR_LR32_LDSTORD:\n\tcase ENC_LDAXRB_LR32_LDSTEXCLR:\n\tcase ENC_LDAXRH_LR32_LDSTEXCLR:\n\tcase ENC_LDAXR_LR32_LDSTEXCLR:\n\tcase ENC_LDLARB_LR32_LDSTORD:\n\tcase ENC_LDLARH_LR32_LDSTORD:\n\tcase ENC_LDLAR_LR32_LDSTORD:\n\tcase ENC_LDXRB_LR32_LDSTEXCLR:\n\tcase ENC_LDXRH_LR32_LDSTEXCLR:\n\tcase ENC_LDXR_LR32_LDSTEXCLR:\n\tcase ENC_STLLRB_SL32_LDSTORD:\n\tcase ENC_STLLRH_SL32_LDSTORD:\n\tcase ENC_STLLR_SL32_LDSTORD:\n\tcase ENC_STLRB_SL32_LDSTORD:\n\tcase ENC_STLRH_SL32_LDSTORD:\n\tcase ENC_STLR_SL32_LDSTORD:\n\t{\n\t\t// <Wt>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CBNZ_32_COMPBRANCH:\n\tcase ENC_CBZ_32_COMPBRANCH:\n\tcase ENC_LDR_32_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <Wt>,<label>\n\t\tADD_OPERAND_WT;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_AUTDZA_64Z_DP_1SRC:\n\tcase ENC_AUTDZB_64Z_DP_1SRC:\n\tcase ENC_AUTIZA_64Z_DP_1SRC:\n\tcase ENC_AUTIZB_64Z_DP_1SRC:\n\tcase ENC_PACDZA_64Z_DP_1SRC:\n\tcase ENC_PACDZB_64Z_DP_1SRC:\n\tcase ENC_PACIZA_64Z_DP_1SRC:\n\tcase ENC_PACIZB_64Z_DP_1SRC:\n\tcase ENC_XPACD_64Z_DP_1SRC:\n\tcase ENC_XPACI_64Z_DP_1SRC:\n\t{\n\t\t// <Xd>\n\t\tADD_OPERAND_XD;\n\t\tbreak;\n\t}\n\tcase ENC_RDVL_R_I_:\n\tcase ENC_MOV_MOVZ_64_MOVEWIDE:\n\t{\n\t\tint64_t imm = ctx->imm << (ctx->hw * 16);\n\t\t// <Xd>, #<imm64>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\n\tcase ENC_MOV_MOVN_64_MOVEWIDE:\n\t{\n\t\tint64_t imm = (ctx->imm << (ctx->hw * 16)) ^ 0xFFFFFFFFFFFFFFFF;\n\t\t// <Xd>, #<imm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_MOVK_64_MOVEWIDE:\n\tcase ENC_MOVN_64_MOVEWIDE:\n\tcase ENC_MOVZ_64_MOVEWIDE:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Xd>, #<imm>{, LSL #<shift>}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tif (ctx->hw)\n\t\t{\n\t\t\tinstr->operands[1].shiftType = ShiftType_LSL;\n\t\t\tinstr->operands[1].shiftValue = 16 * ctx->hw;\n\t\t\tinstr->operands[1].shiftValueUsed = 1;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BFC_BFM_64M_BITFIELD:\n\t{\n\t\tunsigned lsb = IMMR ? 64 - IMMR : 0;\n\t\tunsigned width = IMMS + 1;\n\t\t// <Xd>, #<lsb>, #<width>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_64D_FLOAT2INT:\n\tcase ENC_FCVTAU_64D_FLOAT2INT:\n\tcase ENC_FCVTMS_64D_FLOAT2INT:\n\tcase ENC_FCVTMU_64D_FLOAT2INT:\n\tcase ENC_FCVTNS_64D_FLOAT2INT:\n\tcase ENC_FCVTNU_64D_FLOAT2INT:\n\tcase ENC_FCVTPS_64D_FLOAT2INT:\n\tcase ENC_FCVTPU_64D_FLOAT2INT:\n\tcase ENC_FCVTZS_64D_FLOAT2INT:\n\tcase ENC_FCVTZU_64D_FLOAT2INT:\n\tcase ENC_FMOV_64D_FLOAT2INT:\n\t{\n\t\t// <Xd>,<Dn>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_DN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_64D_FLOAT2FIX:\n\tcase ENC_FCVTZU_64D_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Xd>,<Dn>, #<fbits>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_DN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_64H_FLOAT2INT:\n\tcase ENC_FCVTAU_64H_FLOAT2INT:\n\tcase ENC_FCVTMS_64H_FLOAT2INT:\n\tcase ENC_FCVTMU_64H_FLOAT2INT:\n\tcase ENC_FCVTNS_64H_FLOAT2INT:\n\tcase ENC_FCVTNU_64H_FLOAT2INT:\n\tcase ENC_FCVTPS_64H_FLOAT2INT:\n\tcase ENC_FCVTPU_64H_FLOAT2INT:\n\tcase ENC_FCVTZS_64H_FLOAT2INT:\n\tcase ENC_FCVTZU_64H_FLOAT2INT:\n\tcase ENC_FMOV_64H_FLOAT2INT:\n\t{\n\t\t// <Xd>,<Hn>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_HN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_64H_FLOAT2FIX:\n\tcase ENC_FCVTZU_64H_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Xd>,<Hn>, #<fbits>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_HN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_CNTP_R_P_P_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Xd>,<Pg>,<Pn>.<T>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_PRED_REG_T(ctx->n, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTAS_64S_FLOAT2INT:\n\tcase ENC_FCVTAU_64S_FLOAT2INT:\n\tcase ENC_FCVTMS_64S_FLOAT2INT:\n\tcase ENC_FCVTMU_64S_FLOAT2INT:\n\tcase ENC_FCVTNS_64S_FLOAT2INT:\n\tcase ENC_FCVTNU_64S_FLOAT2INT:\n\tcase ENC_FCVTPS_64S_FLOAT2INT:\n\tcase ENC_FCVTPU_64S_FLOAT2INT:\n\tcase ENC_FCVTZS_64S_FLOAT2INT:\n\tcase ENC_FCVTZU_64S_FLOAT2INT:\n\t{\n\t\t// <Xd>,<Sn>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_SN;\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_64S_FLOAT2FIX:\n\tcase ENC_FCVTZU_64S_FLOAT2FIX:\n\t{\n\t\tuint64_t fbits = ctx->fracbits;\n\t\t// <Xd>,<Sn>, #<fbits>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_SN;\n\t\tADD_OPERAND_FBITS;\n\t\tbreak;\n\t}\n\tcase ENC_SMOV_ASIMDINS_X_X:\n\tcase ENC_UMOV_ASIMDINS_X_X:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Xd>,<Vn>.<T>[<index>]\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_64VX_FLOAT2INT:\n\t{\n\t\t// <Xd>,<Vn>.D[1]\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, _1D, 1);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_UMOV_ASIMDINS_X_X:\n\t{\n\t\t// <Xd>,<Vn>.D[<index>]\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_VREG_T_LANE(ctx->n, _1D, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SXTB_SBFM_64M_BITFIELD:\n\tcase ENC_SXTH_SBFM_64M_BITFIELD:\n\tcase ENC_SXTW_SBFM_64M_BITFIELD:\n\t{\n\t\t// <Xd>,<Wn>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_WN;\n\t\tbreak;\n\t}\n\tcase ENC_SMNEGL_SMSUBL_64WA_DP_3SRC:\n\tcase ENC_SMULL_SMADDL_64WA_DP_3SRC:\n\tcase ENC_UMNEGL_UMSUBL_64WA_DP_3SRC:\n\tcase ENC_UMULL_UMADDL_64WA_DP_3SRC:\n\t{\n\t\t// <Xd>,<Wn>,<Wm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tbreak;\n\t}\n\tcase ENC_SMADDL_64WA_DP_3SRC:\n\tcase ENC_SMSUBL_64WA_DP_3SRC:\n\tcase ENC_UMADDL_64WA_DP_3SRC:\n\tcase ENC_UMSUBL_64WA_DP_3SRC:\n\t{\n\t\t// <Xd>,<Wn>,<Wm>,<Xa>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_WN;\n\t\tADD_OPERAND_WM;\n\t\tADD_OPERAND_XA;\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_64_LOG_SHIFT:\n\tcase ENC_NGCS_SBCS_64_ADDSUB_CARRY:\n\tcase ENC_NGC_SBC_64_ADDSUB_CARRY:\n\t{\n\t\t// <Xd>,<Xm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XM;\n\t\tbreak;\n\t}\n\tcase ENC_MVN_ORN_64_LOG_SHIFT:\n\tcase ENC_NEGS_SUBS_64_ADDSUB_SHIFT:\n\tcase ENC_NEG_SUB_64_ADDSUB_SHIFT:\n\t{\n\t\t// <Xd>,<Xm>{,<shift>#<amount>}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_CLS_64_DP_1SRC:\n\tcase ENC_CLZ_64_DP_1SRC:\n\tcase ENC_RBIT_64_DP_1SRC:\n\tcase ENC_REV16_64_DP_1SRC:\n\tcase ENC_REV32_64_DP_1SRC:\n\tcase ENC_REV64_REV_64_DP_1SRC:\n\tcase ENC_REV_64_DP_1SRC:\n\t{\n\t\t// <Xd>,<Xn>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_ANDS_64S_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Xd>,<Xn>, #<imm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_BFI_BFM_64M_BITFIELD:\n\tcase ENC_SBFIZ_SBFM_64M_BITFIELD:\n\tcase ENC_UBFIZ_UBFM_64M_BITFIELD:\n\t{\n\t\tunsigned lsb = IMMR ? 64 - IMMR : 0;\n\t\tunsigned width = IMMS + 1;\n\t\t// <Xd>,<Xn>, #<lsb>, #<width>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_BFXIL_BFM_64M_BITFIELD:\n\tcase ENC_SBFX_SBFM_64M_BITFIELD:\n\tcase ENC_UBFX_UBFM_64M_BITFIELD:\n\t{\n\t\tunsigned lsb = IMMR;\n\t\tunsigned width = IMMS - IMMR + 1;\n\t\t// <Xd>,<Xn>, #<lsb>, #<width>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_LSB;\n\t\tADD_OPERAND_WIDTH;\n\t\tbreak;\n\t}\n\tcase ENC_ASR_SBFM_64M_BITFIELD:\n\tcase ENC_LSL_UBFM_64M_BITFIELD:\n\tcase ENC_LSR_UBFM_64M_BITFIELD:\n\t{\n\t\tunsigned const_ = (instr->encoding == ENC_LSL_UBFM_64M_BITFIELD) ? 64 - ctx->immr : ctx->immr;\n\t\t// <Xd>,<Xn>, #<const>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_ADCS_64_ADDSUB_CARRY:\n\tcase ENC_ADC_64_ADDSUB_CARRY:\n\tcase ENC_ASRV_64_DP_2SRC:\n\tcase ENC_ASR_ASRV_64_DP_2SRC:\n\tcase ENC_LSLV_64_DP_2SRC:\n\tcase ENC_LSL_LSLV_64_DP_2SRC:\n\tcase ENC_LSRV_64_DP_2SRC:\n\tcase ENC_LSR_LSRV_64_DP_2SRC:\n\tcase ENC_MNEG_MSUB_64A_DP_3SRC:\n\tcase ENC_MUL_MADD_64A_DP_3SRC:\n\tcase ENC_RORV_64_DP_2SRC:\n\tcase ENC_ROR_RORV_64_DP_2SRC:\n\tcase ENC_SBCS_64_ADDSUB_CARRY:\n\tcase ENC_SBC_64_ADDSUB_CARRY:\n\tcase ENC_SDIV_64_DP_2SRC:\n\tcase ENC_SMULH_64_DP_3SRC:\n\tcase ENC_UDIV_64_DP_2SRC:\n\tcase ENC_UMULH_64_DP_3SRC:\n\t{\n\t\t// <Xd>,<Xn>,<Xm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tbreak;\n\t}\n\tcase ENC_EXTR_64_EXTRACT:\n\t{\n\t\tunsigned lsb = ctx->lsb;\n\t\t// <Xd>,<Xn>,<Xm>, #<lsb>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tADD_OPERAND_LSB;\n\t\tbreak;\n\t}\n\tcase ENC_MADD_64A_DP_3SRC:\n\tcase ENC_MSUB_64A_DP_3SRC:\n\t{\n\t\t// <Xd>,<Xn>,<Xm>,<Xa>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tADD_OPERAND_XA;\n\t\tbreak;\n\t}\n\tcase ENC_CSEL_64_CONDSEL:\n\tcase ENC_CSINC_64_CONDSEL:\n\tcase ENC_CSINV_64_CONDSEL:\n\tcase ENC_CSNEG_64_CONDSEL:\n\t{\n\t\t// <Xd>,<Xn>,<Xm>,<cond>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_64_ADDSUB_SHIFT:\n\tcase ENC_ADD_64_ADDSUB_SHIFT:\n\tcase ENC_ANDS_64_LOG_SHIFT:\n\tcase ENC_AND_64_LOG_SHIFT:\n\tcase ENC_BICS_64_LOG_SHIFT:\n\tcase ENC_BIC_64_LOG_SHIFT:\n\tcase ENC_EON_64_LOG_SHIFT:\n\tcase ENC_EOR_64_LOG_SHIFT:\n\tcase ENC_ORN_64_LOG_SHIFT:\n\tcase ENC_ORR_64_LOG_SHIFT:\n\tcase ENC_SUBS_64_ADDSUB_SHIFT:\n\tcase ENC_SUB_64_ADDSUB_SHIFT:\n\t{\n\t\t// <Xd>,<Xn>,<Xm>{,<shift>#<amount>}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_PACGA_64P_DP_2SRC:\n\t{\n\t\t// <Xd>,<Xn>,<Xm|SP>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CINC_CSINC_64_CONDSEL:\n\tcase ENC_CINV_CSINV_64_CONDSEL:\n\tcase ENC_CNEG_CSNEG_64_CONDSEL:\n\t{\n\t\t// <Xd>,<Xn>,<cond_neg>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_COND_NEG;\n\t\tbreak;\n\t}\n\tcase ENC_AUTDA_64P_DP_1SRC:\n\tcase ENC_AUTDB_64P_DP_1SRC:\n\tcase ENC_AUTIA_64P_DP_1SRC:\n\tcase ENC_AUTIB_64P_DP_1SRC:\n\tcase ENC_PACDA_64P_DP_1SRC:\n\tcase ENC_PACDB_64P_DP_1SRC:\n\tcase ENC_PACIA_64P_DP_1SRC:\n\tcase ENC_PACIB_64P_DP_1SRC:\n\t{\n\t\t// <Xd>,<Xn|SP>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_64S_ADDSUB_IMM:\n\tcase ENC_SUBS_64S_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Xd>,<Xn|SP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADDS_64S_ADDSUB_EXT:\n\tcase ENC_SUBS_64S_ADDSUB_EXT:\n\t{\n\t\tunsigned rm_base = (ctx->option & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Xd>,<Xn|SP>,<R><m>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR1;\n\t\tbreak;\n\t}\n\tcase ENC_GMI_64G_DP_2SRC:\n\t{\n\t\t// <Xd>,<Xn|SP>,<Xm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_XM;\n\t\tbreak;\n\t}\n\tcase ENC_SUBPS_64S_DP_2SRC:\n\tcase ENC_SUBP_64S_DP_2SRC:\n\t{\n\t\t// <Xd>,<Xn|SP>,<Xm|SP>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_XM_SP;\n\t\tbreak;\n\t}\n\tcase ENC_ROR_EXTR_64_EXTRACT:\n\t{\n\t\tunsigned imm = IMMS;\n\t\t// <Xd>,<Xn>, #<imm>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CSETM_CSINV_64_CONDSEL:\n\tcase ENC_CSET_CSINC_64_CONDSEL:\n\t{\n\t\t// <Xd>,<cond_neg>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_COND_NEG;\n\t\tbreak;\n\t}\n\tcase ENC_ADRP_ONLY_PCRELADDR:\n\tcase ENC_ADR_ONLY_PCRELADDR:\n\t{\n\t\tuint64_t eaddr =\n\t\t    ctx->page ? (ctx->address & 0xFFFFFFFFFFFFF000) + ctx->imm : ctx->address + ctx->imm;\n\t\t// <Xd>,<label>\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_CNTB_R_S_:\n\tcase ENC_CNTD_R_S_:\n\tcase ENC_CNTH_R_S_:\n\tcase ENC_CNTW_R_S_:\n\t{\n\t\t// <Xd>{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_XD;\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_DECP_R_P_R_:\n\tcase ENC_INCP_R_P_R_:\n\tcase ENC_SQDECP_R_P_R_X:\n\tcase ENC_SQINCP_R_P_R_X:\n\tcase ENC_UQDECP_R_P_R_X:\n\tcase ENC_UQINCP_R_P_R_X:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Xdn>,<Pm>.<T>\n\t\tADD_OPERAND_XDN;\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, arr_spec);\n\t\tbreak;\n\t}\n\tcase ENC_SQDECP_R_P_R_SX:\n\tcase ENC_SQINCP_R_P_R_SX:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Xdn>,<Pm>.<T>,<Wdn>\n\t\tADD_OPERAND_XDN;\n\t\tADD_OPERAND_PRED_REG_T(ctx->m, arr_spec);\n\t\tADD_OPERAND_WDN;\n\t\tbreak;\n\t}\n\tcase ENC_SQDECB_R_RS_SX:\n\tcase ENC_SQDECD_R_RS_SX:\n\tcase ENC_SQDECH_R_RS_SX:\n\tcase ENC_SQDECW_R_RS_SX:\n\tcase ENC_SQINCB_R_RS_SX:\n\tcase ENC_SQINCD_R_RS_SX:\n\tcase ENC_SQINCH_R_RS_SX:\n\tcase ENC_SQINCW_R_RS_SX:\n\t{\n\t\t// <Xdn>,<Wdn>{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_XDN;\n\t\tADD_OPERAND_WDN;\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_DECB_R_RS_:\n\tcase ENC_DECD_R_RS_:\n\tcase ENC_DECH_R_RS_:\n\tcase ENC_DECW_R_RS_:  // pattern \"all\" is required\n\tcase ENC_INCB_R_RS_:\n\tcase ENC_INCD_R_RS_:\n\tcase ENC_INCH_R_RS_:\n\tcase ENC_INCW_R_RS_:  // pattern \"all\" is dropped\n\tcase ENC_SQDECB_R_RS_X:\n\tcase ENC_SQDECD_R_RS_X:\n\tcase ENC_SQDECH_R_RS_X:\n\tcase ENC_SQDECW_R_RS_X:\n\tcase ENC_SQINCB_R_RS_X:\n\tcase ENC_SQINCD_R_RS_X:\n\tcase ENC_SQINCH_R_RS_X:\n\tcase ENC_SQINCW_R_RS_X:\n\tcase ENC_UQDECB_R_RS_X:\n\tcase ENC_UQDECD_R_RS_X:\n\tcase ENC_UQDECH_R_RS_X:\n\tcase ENC_UQDECW_R_RS_X:\n\tcase ENC_UQINCB_R_RS_X:\n\tcase ENC_UQINCD_R_RS_X:\n\tcase ENC_UQINCH_R_RS_X:\n\tcase ENC_UQINCW_R_RS_X:\n\t{\n\t\t// NONSYNTAX: <Xdn> {,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_XDN;\n\n\t\tbool print_mul = ctx->imm != 1;\n\t\tbool print_pattern = print_mul || ctx->pattern != 0x1f;\n\n\t\tif (print_pattern)\n\t\t{\n\t\t\tADD_OPERAND_PATTERN;\n\t\t}\n\n\t\tif (print_mul)\n\t\t{\n\t\t\tADD_OPERAND_STR_IMM(\"mul\", ctx->imm);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_64_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Xd|SP>, #<imm>\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_AND_64_LOG_IMM:\n\tcase ENC_EOR_64_LOG_IMM:\n\tcase ENC_ORR_64_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Xd|SP>,<Xn>, #<imm>\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ADD_64_ADDSUB_IMM:\n\t{\n\t\t// <Xd|SP>,<Xn|SP>\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_ADDPL_R_RI_:\n\tcase ENC_ADDVL_R_RI_:\n\t{\n\t\tuint32_t imm = ctx->imm;\n\t\t// <Xd|SP>,<Xn|SP>, #<imm>\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ADD_64_ADDSUB_IMM:\n\tcase ENC_SUB_64_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Xd|SP>,<Xn|SP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADDG_64_ADDSUB_IMMTAGS:\n\tcase ENC_SUBG_64_ADDSUB_IMMTAGS:\n\t{\n\t\tuint64_t uimm6 = ctx->offset;\n\t\tuint64_t uimm4 = ctx->tag_offset;\n\t\t// <Xd|SP>,<Xn|SP>, #<uimm6>, #<uimm4>\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_IMM32(uimm6, 0);\n\t\tADD_OPERAND_IMM32(uimm4, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ADD_64_ADDSUB_EXT:\n\tcase ENC_SUB_64_ADDSUB_EXT:\n\t{\n\t\tunsigned rm_base = (ctx->option & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Xd|SP>,<Xn|SP>,<R><m>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR1;\n\t\tbreak;\n\t}\n\tcase ENC_IRG_64I_DP_2SRC:\n\t{\n\t\t// <Xd|SP>,<Xn|SP>{,<Xm>}\n\t\tADD_OPERAND_XD_SP;\n\t\tADD_OPERAND_XN_SP;\n\t\tif (ctx->Xm != 31)\n\t\t{\n\t\t\tADD_OPERAND_XM\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BLRAAZ_64_BRANCH_REG:\n\tcase ENC_BLRABZ_64_BRANCH_REG:\n\tcase ENC_BLR_64_BRANCH_REG:\n\tcase ENC_BRAAZ_64_BRANCH_REG:\n\tcase ENC_BRABZ_64_BRANCH_REG:\n\tcase ENC_BR_64_BRANCH_REG:\n\t{\n\t\t// <Xn>\n\t\tADD_OPERAND_XN;\n\t\tbreak;\n\t}\n\tcase ENC_TST_ANDS_64S_LOG_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\t// <Xn>, #<imm>\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CCMN_64_CONDCMP_IMM:\n\tcase ENC_CCMP_64_CONDCMP_IMM:\n\t{\n\t\tuint32_t imm = ctx->imm;\n\t\t// <Xn>, #<imm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_RMIF_ONLY_RMIF:\n\t{\n\t\tunsigned mask = ctx->mask;\n\t\tunsigned shift = ctx->imm6;\n\t\t// <Xn>, #<shift>, #<mask>\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tADD_OPERAND_IMM32(mask, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CCMN_64_CONDCMP_REG:\n\tcase ENC_CCMP_64_CONDCMP_REG:\n\t{\n\t\t// <Xn>,<Xm>, #<nzcv>,<cond>\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tADD_OPERAND_NZCV;\n\t\tADD_OPERAND_COND;\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_64_ADDSUB_SHIFT:\n\tcase ENC_CMP_SUBS_64_ADDSUB_SHIFT:\n\tcase ENC_TST_ANDS_64_LOG_SHIFT:\n\t{\n\t\t// <Xn>,<Xm>{,<shift>#<amount>}\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tOPTIONAL_SHIFT_AMOUNT;\n\t\tbreak;\n\t}\n\tcase ENC_BLRAA_64P_BRANCH_REG:\n\tcase ENC_BLRAB_64P_BRANCH_REG:\n\tcase ENC_BRAA_64P_BRANCH_REG:\n\tcase ENC_BRAB_64P_BRANCH_REG:\n\t{\n\t\t// <Xn>,<Xm|SP>\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_64S_ADDSUB_IMM:\n\tcase ENC_CMP_SUBS_64S_ADDSUB_IMM:\n\t{\n\t\tuint64_t imm = ctx->imm12;\n\t\t// <Xn|SP>, #<imm>{,<shift>}\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_IMM64(imm, 0);\n\t\tif (ctx->sh)\n\t\t{\n\t\t\tLAST_OPERAND_LSL_12;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_CMN_ADDS_64S_ADDSUB_EXT:\n\tcase ENC_CMP_SUBS_64S_ADDSUB_EXT:\n\t{\n\t\tunsigned rm_base = (ctx->option & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Xn|SP>,<R><m>{,<extend>{#<amount>}}\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT_64_BEHAVIOR0;\n\t\tbreak;\n\t}\n\tcase ENC_CMPP_SUBPS_64S_DP_2SRC:\n\t{\n\t\t// <Xn|SP>,<Xm|SP>\n\t\tADD_OPERAND_XN_SP;\n\t\tADD_OPERAND_XM_SP;\n\t\tbreak;\n\t}\n\tcase ENC_STADDL_LDADDL_64_MEMOP:\n\tcase ENC_STADD_LDADD_64_MEMOP:\n\tcase ENC_STCLRL_LDCLRL_64_MEMOP:\n\tcase ENC_STCLR_LDCLR_64_MEMOP:\n\tcase ENC_STEORL_LDEORL_64_MEMOP:\n\tcase ENC_STEOR_LDEOR_64_MEMOP:\n\tcase ENC_STSETL_LDSETL_64_MEMOP:\n\tcase ENC_STSET_LDSET_64_MEMOP:\n\tcase ENC_STSMAXL_LDSMAXL_64_MEMOP:\n\tcase ENC_STSMAX_LDSMAX_64_MEMOP:\n\tcase ENC_STSMINL_LDSMINL_64_MEMOP:\n\tcase ENC_STSMIN_LDSMIN_64_MEMOP:\n\tcase ENC_STUMAXL_LDUMAXL_64_MEMOP:\n\tcase ENC_STUMAX_LDUMAX_64_MEMOP:\n\tcase ENC_STUMINL_LDUMINL_64_MEMOP:\n\tcase ENC_STUMIN_LDUMIN_64_MEMOP:\n\t{\n\t\t// <Xs>, [<Xn|SP>]\n\t\tADD_OPERAND_XS;\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CASPAL_CP64_COMSWAPPR:\n\tcase ENC_CASPA_CP64_COMSWAPPR:\n\tcase ENC_CASPL_CP64_COMSWAPPR:\n\tcase ENC_CASP_CP64_COMSWAPPR:\n\t{\n\t\t// <Xs>,<X(s+1)>,<Xt>,<X(t+1)>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_XS;\n\t\tADD_OPERAND_XS_PLUS_1;\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_XT_PLUS_1;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LDADDAL_64_MEMOP:\n\tcase ENC_LDADDA_64_MEMOP:\n\tcase ENC_LDADDL_64_MEMOP:\n\tcase ENC_LDADD_64_MEMOP:\n\tcase ENC_LDCLRAL_64_MEMOP:\n\tcase ENC_LDCLRA_64_MEMOP:\n\tcase ENC_LDCLRL_64_MEMOP:\n\tcase ENC_LDCLR_64_MEMOP:\n\tcase ENC_LDEORAL_64_MEMOP:\n\tcase ENC_LDEORA_64_MEMOP:\n\tcase ENC_LDEORL_64_MEMOP:\n\tcase ENC_LDEOR_64_MEMOP:\n\tcase ENC_LDSETAL_64_MEMOP:\n\tcase ENC_LDSETA_64_MEMOP:\n\tcase ENC_LDSETL_64_MEMOP:\n\tcase ENC_LDSET_64_MEMOP:\n\tcase ENC_LDSMAXAL_64_MEMOP:\n\tcase ENC_LDSMAXA_64_MEMOP:\n\tcase ENC_LDSMAXL_64_MEMOP:\n\tcase ENC_LDSMAX_64_MEMOP:\n\tcase ENC_LDSMINAL_64_MEMOP:\n\tcase ENC_LDSMINA_64_MEMOP:\n\tcase ENC_LDSMINL_64_MEMOP:\n\tcase ENC_LDSMIN_64_MEMOP:\n\tcase ENC_LDUMAXAL_64_MEMOP:\n\tcase ENC_LDUMAXA_64_MEMOP:\n\tcase ENC_LDUMAXL_64_MEMOP:\n\tcase ENC_LDUMAX_64_MEMOP:\n\tcase ENC_LDUMINAL_64_MEMOP:\n\tcase ENC_LDUMINA_64_MEMOP:\n\tcase ENC_LDUMINL_64_MEMOP:\n\tcase ENC_LDUMIN_64_MEMOP:\n\tcase ENC_SWPAL_64_MEMOP:\n\tcase ENC_SWPA_64_MEMOP:\n\tcase ENC_SWPL_64_MEMOP:\n\tcase ENC_SWP_64_MEMOP:\n\t{\n\t\t// <Xs>,<Xt>, [<Xn|SP>]\n\t\tADD_OPERAND_XS;\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_CASAL_C64_COMSWAP:\n\tcase ENC_CASA_C64_COMSWAP:\n\tcase ENC_CASL_C64_COMSWAP:\n\tcase ENC_CAS_C64_COMSWAP:\n\t{\n\t\t// <Xs>,<Xt>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_XS;\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_STGP_64_LDSTPAIR_PRE:\n\t{\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDP_64_LDSTPAIR_PRE:\n\tcase ENC_LDPSW_64_LDSTPAIR_PRE:\n\tcase ENC_STP_64_LDSTPAIR_PRE:\n\t{\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>, #<imm>]!\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDPSW_64_LDSTPAIR_POST:\n\tcase ENC_LDP_64_LDSTPAIR_POST:\n\tcase ENC_STGP_64_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_STP_64_LDSTPAIR_POST:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_STGP_64_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDNP_64_LDSTNAPAIR_OFFS:\n\tcase ENC_LDPSW_64_LDSTPAIR_OFF:\n\tcase ENC_LDP_64_LDSTPAIR_OFF:\n\tcase ENC_STNP_64_LDSTNAPAIR_OFFS:\n\tcase ENC_STP_64_LDSTPAIR_OFF:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDAXP_LP64_LDSTEXCLP:\n\tcase ENC_LDXP_LP64_LDSTEXCLP:\n\t{\n\t\t// <Xt1>,<Xt2>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_XT1;\n\t\tADD_OPERAND_XT2;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CFP_SYS_CR_SYSTEMINSTRS:\n\tcase ENC_CPP_SYS_CR_SYSTEMINSTRS:\n\tcase ENC_DVP_SYS_CR_SYSTEMINSTRS:\n\t{\n\t\tADD_OPERAND_NAME(\"rctx\");\n\t\t// RCTX,<Xt>\n\t\tADD_OPERAND_XT;\n\t\tbreak;\n\t}\n\tcase ENC_SYSL_RC_SYSTEMINSTRS:\n\t{\n\t\t// <Xt>, #<op1>,<Cn>,<Cm>, #<op2>\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_IMM32(ctx->op1, 0);\n\t\tADD_OPERAND_NAME(reg_lookup_c[ctx->sys_crn & 0xF]);\n\t\tADD_OPERAND_NAME(reg_lookup_c[ctx->sys_crm & 0xF]);\n\t\tADD_OPERAND_IMM32(ctx->op2, 0);\n\t\tbreak;\n\t}\n\tcase ENC_MRS_RS_SYSTEMMOVE:\n\t{\n\t\t// <Xt>, (<systemreg>|S<op0>_<op1>_<Cn>_<Cm>_<op2>)\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_SYSTEMREG_SENSE;\n\t\tbreak;\n\t}\n\tcase ENC_LDRSB_64_LDST_IMMPRE:\n\tcase ENC_LDRSH_64_LDST_IMMPRE:\n\tcase ENC_LDRSW_64_LDST_IMMPRE:\n\tcase ENC_LDR_64_LDST_IMMPRE:\n\tcase ENC_STR_64_LDST_IMMPRE:\n\t{\n\t\t// <Xt>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDRSB_64B_LDST_REGOFF:\n\t{\n\t\tint reg_base = ctx->option & 1 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Xt>, [<Xn|SP>, (<Wm>|<Xm>),<extend>{<amount>}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT_0;\n\t\tbreak;\n\t}\n\tcase ENC_LDRSH_64_LDST_REGOFF:\n\tcase ENC_LDRSW_64_LDST_REGOFF:\n\tcase ENC_LDR_64_LDST_REGOFF:\n\tcase ENC_STR_64_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// <Xt>, [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_LDRSB_64BL_LDST_REGOFF:\n\t{\n\t\t// <Xt>, [<Xn|SP>,<Xm>{, LSL #0}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_LSL0;\n\t\tbreak;\n\t}\n\tcase ENC_LDGM_64BULK_LDSTTAGS:\n\tcase ENC_STGM_64BULK_LDSTTAGS:\n\tcase ENC_STZGM_64BULK_LDSTTAGS:\n\t{\n\t\t// <Xt>, [<Xn|SP>]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LDRSB_64_LDST_IMMPOST:\n\tcase ENC_LDRSH_64_LDST_IMMPOST:\n\tcase ENC_LDRSW_64_LDST_IMMPOST:\n\tcase ENC_LDR_64_LDST_IMMPOST:\n\tcase ENC_STR_64_LDST_IMMPOST:\n\t{\n\t\t// <Xt>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDRSB_64_LDST_POS:\n\tcase ENC_LDRSH_64_LDST_POS:\n\tcase ENC_LDRSW_64_LDST_POS:\n\tcase ENC_LDR_64_LDST_POS:\n\tcase ENC_STR_64_LDST_POS:\n\t{\n\t\t// <Xt>, [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_LDAPURSB_64_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPURSH_64_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPURSW_64_LDAPSTL_UNSCALED:\n\tcase ENC_LDAPUR_64_LDAPSTL_UNSCALED:\n\tcase ENC_LDG_64LOFFSET_LDSTTAGS:\n\tcase ENC_LDRAA_64_LDST_PAC:\n\tcase ENC_LDRAB_64_LDST_PAC:\n\tcase ENC_LDTRSB_64_LDST_UNPRIV:\n\tcase ENC_LDTRSH_64_LDST_UNPRIV:\n\tcase ENC_LDTRSW_64_LDST_UNPRIV:\n\tcase ENC_LDTR_64_LDST_UNPRIV:\n\tcase ENC_LDURSB_64_LDST_UNSCALED:\n\tcase ENC_LDURSH_64_LDST_UNSCALED:\n\tcase ENC_LDURSW_64_LDST_UNSCALED:\n\tcase ENC_LDUR_64_LDST_UNSCALED:\n\tcase ENC_STLUR_64_LDAPSTL_UNSCALED:\n\tcase ENC_STTR_64_LDST_UNPRIV:\n\tcase ENC_STUR_64_LDST_UNSCALED:\n\t{\n\t\t// <Xt>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\n\tcase ENC_LDRAA_64W_LDST_PAC:\n\tcase ENC_LDRAB_64W_LDST_PAC:\n\t{\n\t\t// <Xt>, [<Xn|SP>{, #<simm>}]!\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\n\tcase ENC_LDAPR_64L_MEMOP:\n\tcase ENC_LDAR_LR64_LDSTORD:\n\tcase ENC_LDAXR_LR64_LDSTEXCLR:\n\tcase ENC_LDLAR_LR64_LDSTORD:\n\tcase ENC_LDXR_LR64_LDSTEXCLR:\n\tcase ENC_STLLR_SL64_LDSTORD:\n\tcase ENC_STLR_SL64_LDSTORD:\n\t{\n\t\t// <Xt>, [<Xn|SP>{,#0}]\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, 0);\n\t\tbreak;\n\t}\n\tcase ENC_CBNZ_64_COMPBRANCH:\n\tcase ENC_CBZ_64_COMPBRANCH:\n\tcase ENC_LDRSW_64_LOADLIT:\n\tcase ENC_LDR_64_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <Xt>,<label>\n\t\tADD_OPERAND_XT;\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_ST2G_64SPRE_LDSTTAGS:\n\tcase ENC_STG_64SPRE_LDSTTAGS:\n\tcase ENC_STZ2G_64SPRE_LDSTTAGS:\n\tcase ENC_STZG_64SPRE_LDSTTAGS:\n\t{\n\t\t// <Xt|SP>, [<Xn|SP>, #<simm>]!\n\t\tADD_OPERAND_XT_SP;\n\t\tADD_OPERAND_MEM_PRE_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_ST2G_64SPOST_LDSTTAGS:\n\tcase ENC_STG_64SPOST_LDSTTAGS:\n\tcase ENC_STZ2G_64SPOST_LDSTTAGS:\n\tcase ENC_STZG_64SPOST_LDSTTAGS:\n\t{\n\t\t// <Xt|SP>, [<Xn|SP>], #<simm>\n\t\tADD_OPERAND_XT_SP;\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_ST2G_64SOFFSET_LDSTTAGS:\n\tcase ENC_STG_64SOFFSET_LDSTTAGS:\n\tcase ENC_STZ2G_64SOFFSET_LDSTTAGS:\n\tcase ENC_STZG_64SOFFSET_LDSTTAGS:\n\t{\n\t\t// <Xt|SP>, [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_XT_SP;\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_MOVPRFX_Z_Z_:\n\t{\n\t\t// <Zd>,<Zn>\n\t\tADD_OPERAND_ZD;\n\t\tADD_OPERAND_ZN;\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_DUP_Z_I_:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method0(ctx->immh, ctx->Q);\n\t\t// <Zd>.<T>, #0.0\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_FDUP_Z_I_:\n\tcase ENC_FDUP_Z_I_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tfloat fimm = table_imm8_to_float[ctx->imm8];\n\t\t// <Zd>.<T>, #<fimm>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\n\tcase ENC_MOV_DUPM_Z_I_:\n\tcase ENC_DUPM_Z_I_:\n\t{\n\t\tArrangementSpec arr_spec = size_spec_method1(ctx->imm13);\n\t\tuint64_t const_ = ctx->imm;\n\t\tif (arr_spec == _1B)\n\t\t\tconst_ &= 0xFF;\n\t\tif (arr_spec == _1H)\n\t\t\tconst_ &= 0xFFFF;\n\t\tif (arr_spec == _1S)\n\t\t\tconst_ &= 0xFFFFFFFF;\n\t\t// <Zd>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_INDEX_Z_II_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tuint64_t imm1 = ctx->imm1;\n\t\tuint64_t imm2 = ctx->imm2;\n\t\t// <Zd>.<T>, #<imm1>, #<imm2>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_IMM1;\n\t\tADD_OPERAND_IMM2;\n\t\tbreak;\n\t}\n\tcase ENC_INDEX_Z_IR_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rm_base = wwwx_0123_reg(ctx->size);\n\t\t// <Zd>.<T>, #<imm>,<R><m>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_DUP_Z_I_:\n\tcase ENC_DUP_Z_I_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>, #<imm>{,<shift>}\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t// imm is the imm8 with shift applied, no need to print\n\t\tbreak;\n\t}\n\tcase ENC_ADR_Z_AZ_SD_SAME_SCALED:\n\t{\n\t\tArrangementSpec arr_spec = ctx->sz ? _1D : _1S;\n\t\t// <Zd>.<T>, [<Zn>.<T>,<Zm>.<T>{,<mod><amount>}]\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_Z_BASE, ctx->m, arr_spec);\n\t\tif (ctx->msz)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, ctx->msz)\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_COMPACT_Z_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec0 = table_1s_1d[ctx->size & 1];\n\t\t// <Zd>.<T>,<Pg>,<Zn>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec0)\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec0)\n\t\tbreak;\n\t}\n\tcase ENC_SEL_Z_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_HISTCNT_Z_P_ZZ_:\n\t{\n\t\tArrangementSpec T = table_s_d[ctx->size & 1];\n\t\t// <Zd>.<T>,<Pg>/Z,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tbreak;\n\t}\n\tcase ENC_FLOGB_Z_P_Z_:\n\tcase ENC_SQABS_Z_P_Z_:\n\tcase ENC_SQNEG_Z_P_Z_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>/M,<Zn>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tbreak;\n\t}\n\tcase ENC_SADALP_Z_P_Z_:\n\tcase ENC_UADALP_Z_P_Z_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_d_b_h_s[ctx->size];\n\t\t// <Zda>.<T>,<Pg>/M,<Zn>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_MOVPRFX_Z_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tchar pred_qual = ctx->M ? 'm' : 'z';\n\t\t// <Zd>.<T>,<Pg>/<ZM>,<Zn>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, pred_qual);\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_CPY_Z_P_I_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_d_h_s[ctx->size];\n\t\t// <Zd>.<T>,<Pg>/M, #0.0\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_FLOAT32(0);\n\t\tbreak;\n\t}\n\tcase ENC_FMOV_FCPY_Z_P_I_:\n\tcase ENC_FCPY_Z_P_I_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tfloat fimm = table_imm8_to_float[ctx->imm8];\n\t\t// <Zd>.<T>,<Pg>/M, #<fimm>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_MOV_CPY_Z_P_I_:\n\tcase ENC_CPY_Z_P_I_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>/M, #<imm>{,<shift>}\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t// imm is the imm8 with shift applied, no need to print\n\t\tbreak;\n\t}\n\tcase ENC_MOV_CPY_Z_P_R_:\n\tcase ENC_CPY_Z_P_R_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = ctx->size == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Zd>.<T>,<Pg>/M,<R><n|SP>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_REG(REGSET_SP, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_CPY_Z_P_V_:\n\tcase ENC_CPY_Z_P_V_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = bhsd_0123_reg(ctx->size);\n\t\t// <Zd>.<T>,<Pg>/M,<V><n>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_SEL_Z_P_ZZ_:\n\tcase ENC_ABS_Z_P_Z_:\n\tcase ENC_CLS_Z_P_Z_:\n\tcase ENC_CLZ_Z_P_Z_:\n\tcase ENC_CNOT_Z_P_Z_:\n\tcase ENC_CNT_Z_P_Z_:\n\tcase ENC_FABS_Z_P_Z_:\n\tcase ENC_FNEG_Z_P_Z_:\n\tcase ENC_FRECPX_Z_P_Z_:\n\tcase ENC_FRINTA_Z_P_Z_:\n\tcase ENC_FRINTI_Z_P_Z_:\n\tcase ENC_FRINTM_Z_P_Z_:\n\tcase ENC_FRINTN_Z_P_Z_:\n\tcase ENC_FRINTP_Z_P_Z_:\n\tcase ENC_FRINTX_Z_P_Z_:\n\tcase ENC_FRINTZ_Z_P_Z_:\n\tcase ENC_FSQRT_Z_P_Z_:\n\tcase ENC_NEG_Z_P_Z_:\n\tcase ENC_NOT_Z_P_Z_:\n\tcase ENC_RBIT_Z_P_Z_:\n\tcase ENC_REVB_Z_Z_:\n\tcase ENC_REVH_Z_Z_:\n\tcase ENC_SXTB_Z_P_Z_:\n\tcase ENC_SXTH_Z_P_Z_:\n\tcase ENC_UXTB_Z_P_Z_:\n\tcase ENC_UXTH_Z_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>/M,<Zn>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_MOV_CPY_Z_O_I_:\n\tcase ENC_CPY_Z_O_I_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>/Z, #<imm>{,<shift>}\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t// imm is the imm8 with shift applied, no need to print\n\t\tbreak;\n\t}\n\tcase ENC_INDEX_Z_RI_:  // checked bhsd, on 04b346fd\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = wwwx_0123_reg(ctx->size);\n\t\t// <Zd>.<T>,<R><n>, #<imm>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_INDEX_Z_RR_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = (ctx->size & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\tunsigned rm_base = (ctx->size & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Zd>.<T>,<R><n>,<R><m>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_DUP_Z_R_:\n\tcase ENC_DUP_Z_R_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rn_base = (ctx->size & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Zd>.<T>,<R><n|SP>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_SP, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_DUP_Z_ZI_:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method1(ctx->tsz);\n\t\tunsigned rn_base = rbhsdq_5bit_reg(ctx->tsz);\n\t\t// <Zd>.<T>,<V><n>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_FEXPA_Z_Z_:\n\tcase ENC_FRECPE_Z_Z_:\n\tcase ENC_FRSQRTE_Z_Z_:\n\tcase ENC_REV_Z_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ASR_Z_ZI_:\n\tcase ENC_LSL_Z_ZI_:\n\tcase ENC_LSR_Z_ZI_:\n\t{\n\t\tArrangementSpec arr_spec = table16_r_b_h_s_d[(ctx->tszh << 2) | ctx->tszl];\n\t\tuint64_t const_ = ctx->shift;\n\t\t// <Zd>.<T>,<Zn>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_ADD_Z_ZZ_:\n\tcase ENC_FADD_Z_ZZ_:\n\tcase ENC_FMUL_Z_ZZ_:\n\tcase ENC_FRECPS_Z_ZZ_:\n\tcase ENC_FRSQRTS_Z_ZZ_:\n\tcase ENC_FSUB_Z_ZZ_:\n\tcase ENC_FTSMUL_Z_ZZ_:\n\tcase ENC_FTSSEL_Z_ZZ_:\n\tcase ENC_SCLAMP_Z_ZZ_:\n\tcase ENC_SQADD_Z_ZZ_:\n\tcase ENC_SQSUB_Z_ZZ_:\n\tcase ENC_SUB_Z_ZZ_:\n\tcase ENC_TRN1_Z_ZZ_:\n\tcase ENC_TRN2_Z_ZZ_:\n\tcase ENC_UCLAMP_Z_ZZ_:\n\tcase ENC_UQADD_Z_ZZ_:\n\tcase ENC_UQSUB_Z_ZZ_:\n\tcase ENC_UZP1_Z_ZZ_:\n\tcase ENC_UZP2_Z_ZZ_:\n\tcase ENC_ZIP1_Z_ZZ_:\n\tcase ENC_ZIP2_Z_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ASR_Z_ZW_:\n\tcase ENC_LSL_Z_ZW_:\n\tcase ENC_LSR_Z_ZW_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<T>,<Zm>.D\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_DUP_Z_ZI_:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method1(ctx->tsz);\n\t\tunsigned rn_base = rbhsdq_5bit_reg(ctx->tsz);\n\t\t// <Zd>.<T>,<V><n>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rn_base, ctx->n);\n\t\tbreak;\n\t}\n\tcase ENC_MOV_DUP_Z_ZI_2:\n\t{\n\t\tArrangementSpec arr_spec = arr_spec_method1(ctx->tsz);\n\t\t// <Zd>.<T>,<Zn>.<T>[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->n, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SQXTNB_Z_ZZ_:\n\tcase ENC_SQXTNT_Z_ZZ_:\n\tcase ENC_SQXTUNB_Z_ZZ_:\n\tcase ENC_SQXTUNT_Z_ZZ_:\n\tcase ENC_UQXTNB_Z_ZZ_:\n\tcase ENC_UQXTNT_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_r_b_h_r_r_s_r_r[ctx->tsize];\n\t\tArrangementSpec Tb = table_r_h_s_r_r_d_r_r[ctx->tsize];\n\t\t// <Zd>.<T>,<Zn>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_SUNPKHI_Z_Z_:\n\tcase ENC_SUNPKLO_Z_Z_:\n\tcase ENC_UUNPKHI_Z_Z_:\n\tcase ENC_UUNPKLO_Z_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_d_b_h_s[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_TBL_Z_ZZ_1:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,{<Zn>.<T>},<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, arr_spec)\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, arr_spec, ctx->n);\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ADR_Z_AZ_D_S32_SCALED:\n\t{\n\t\t// <Zd>.D, [<Zn>.D,<Zm>.D, SXTW{<amount>}]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_Z_BASE, ctx->m, _1D);\n\t\tif (ctx->msz)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_SXTW, ctx->msz)\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADR_Z_AZ_D_U32_SCALED:\n\t{\n\t\t// <Zd>.D, [<Zn>.D,<Zm>.D, UXTW{<amount>}]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_Z_BASE, ctx->m, _1D);\n\t\tif (ctx->msz)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_UXTW, ctx->msz)\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_Z_P_Z_D2X:\n\tcase ENC_FCVTZU_Z_P_Z_D2X:\n\tcase ENC_REVW_Z_Z_:\n\tcase ENC_SCVTF_Z_P_Z_X2D:\n\tcase ENC_SXTW_Z_P_Z_:\n\tcase ENC_UCVTF_Z_P_Z_X2D:\n\tcase ENC_UXTW_Z_P_Z_:\n\t{\n\t\t// <Zd>.D,<Pg>/M,<Zn>.D\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_H2D:\n\tcase ENC_FCVTZS_Z_P_Z_FP162X:\n\tcase ENC_FCVTZU_Z_P_Z_FP162X:\n\t{\n\t\t// <Zd>.D,<Pg>/M,<Zn>.H\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_S2D:\n\tcase ENC_FCVTZS_Z_P_Z_S2X:\n\tcase ENC_FCVTZU_Z_P_Z_S2X:\n\tcase ENC_SCVTF_Z_P_Z_W2D:\n\tcase ENC_UCVTF_Z_P_Z_W2D:\n\tcase ENC_FCVTLT_Z_P_Z_S2D:\n\t{\n\t\t// <Zd>.D,<Pg>/M,<Zn>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_MOV_ORR_Z_ZZ_:\n\t{\n\t\t// <Zd>.D,<Zn>.D\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_AND_Z_ZZ_:\n\tcase ENC_BIC_Z_ZZ_:\n\tcase ENC_EOR_Z_ZZ_:\n\tcase ENC_ORR_Z_ZZ_:\n\tcase ENC_FMMLA_Z_ZZZ_D:\n\tcase ENC_RAX1_Z_ZZ_:\n\t{\n\t\t// <Zd>.D,<Zn>.D,<Zm>.D\n\t\tif (instr->encoding == ENC_FMMLA_Z_ZZZ_D)\n\t\t{\n\t\t\tADD_OPERAND_ZREG_T(ctx->da, _1D)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\t}\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_FMUL_Z_ZZI_D:\n\t{\n\t\t// <Zd>.D,<Zn>.D,<Zm>.D[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1D, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_D2H:\n\tcase ENC_SCVTF_Z_P_Z_X2FP16:\n\tcase ENC_UCVTF_Z_P_Z_X2FP16:\n\t{\n\t\t// <Zd>.H,<Pg>/M,<Zn>.D\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_Z_P_Z_FP162H:\n\tcase ENC_FCVTZU_Z_P_Z_FP162H:\n\tcase ENC_SCVTF_Z_P_Z_H2FP16:\n\tcase ENC_UCVTF_Z_P_Z_H2FP16:\n\t{\n\t\t// <Zd>.H,<Pg>/M,<Zn>.H\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_S2H:\n\tcase ENC_SCVTF_Z_P_Z_W2FP16:\n\tcase ENC_UCVTF_Z_P_Z_W2FP16:\n\tcase ENC_FCVTNT_Z_P_Z_S2H:\n\t{\n\t\t// <Zd>.H,<Pg>/M,<Zn>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_FMUL_Z_ZZI_H:\n\t{\n\t\t// <Zd>.H,<Zn>.H,<Zm>.H[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_D2S:\n\tcase ENC_FCVTZS_Z_P_Z_D2W:\n\tcase ENC_FCVTZU_Z_P_Z_D2W:\n\tcase ENC_SCVTF_Z_P_Z_X2S:\n\tcase ENC_UCVTF_Z_P_Z_X2S:\n\tcase ENC_FCVTNT_Z_P_Z_D2S:\n\tcase ENC_FCVTX_Z_P_Z_D2S:\n\tcase ENC_FCVTXNT_Z_P_Z_D2S:\n\t{\n\t\t// <Zd>.S,<Pg>/M,<Zn>.D\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_FCVT_Z_P_Z_H2S:\n\tcase ENC_FCVTZS_Z_P_Z_FP162W:\n\tcase ENC_FCVTZU_Z_P_Z_FP162W:\n\tcase ENC_FCVTLT_Z_P_Z_H2S:\n\t{\n\t\t// <Zd>.S,<Pg>/M,<Zn>.H\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tbreak;\n\t}\n\tcase ENC_FCVTZS_Z_P_Z_S2W:\n\tcase ENC_FCVTZU_Z_P_Z_S2W:\n\tcase ENC_SCVTF_Z_P_Z_W2S:\n\tcase ENC_UCVTF_Z_P_Z_W2S:\n\t{\n\t\t// <Zd>.S,<Pg>/M,<Zn>.S\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tbreak;\n\t}\n\tcase ENC_FMUL_Z_ZZI_S:\n\t{\n\t\t// <Zd>.S,<Zn>.S,<Zm>.S[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_Z_P_ZZZ_:\n\tcase ENC_FMLS_Z_P_ZZZ_:\n\tcase ENC_FNMLA_Z_P_ZZZ_:\n\tcase ENC_FNMLS_Z_P_ZZZ_:\n\tcase ENC_MLA_Z_P_ZZZ_:\n\tcase ENC_MLS_Z_P_ZZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zda>.<T>,<Pg>/M,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCMLA_Z_P_ZZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tuint64_t const_ = 90 * ctx->rot;\n\t\t// <Zda>.<T>,<Pg>/M,<Zn>.<T>,<Zm>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_Z_ZZZI_D:\n\tcase ENC_FMLS_Z_ZZZI_D:\n\t{\n\t\t// <Zda>.D,<Zn>.D,<Zm>.D[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1D, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_SDOT_Z_ZZZI_D:\n\tcase ENC_UDOT_Z_ZZZI_D:\n\t{\n\t\t// <Zda>.D,<Zn>.H,<Zm>.H[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_Z_ZZZI_H:\n\tcase ENC_FMLS_Z_ZZZI_H:\n\t{\n\t\t// <Zda>.H,<Zn>.H,<Zm>.H[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCMLA_Z_ZZZI_H:\n\t{\n\t\tuint64_t const_ = 90 * ctx->rot;\n\t\t// <Zda>.H,<Zn>.H,<Zm>.H[<index>], #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_SDOT_Z_ZZZI_S:\n\tcase ENC_UDOT_Z_ZZZI_S:\n\t{\n\t\t// <Zda>.S,<Zn>.B,<Zm>.B[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1B)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1B, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FMLA_Z_ZZZI_S:\n\tcase ENC_FMLS_Z_ZZZI_S:\n\t{\n\t\t// <Zda>.S,<Zn>.S,<Zm>.S[<index>]\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCMLA_Z_ZZZI_S:\n\t{\n\t\tuint64_t const_ = 90 * ctx->rot;\n\t\t// <Zda>.S,<Zn>.S,<Zm>.S[<index>], #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zda, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_CLASTA_Z_P_ZZ_:\n\tcase ENC_CLASTB_Z_P_ZZ_:\n\tcase ENC_SPLICE_Z_P_ZZ_DES:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pg>,<Zdn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->Zm, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ADDP_Z_P_ZZ_:\n\tcase ENC_FADDP_Z_P_ZZ_:\n\tcase ENC_FMAXNMP_Z_P_ZZ_:\n\tcase ENC_FMAXP_Z_P_ZZ_:\n\tcase ENC_FMINNMP_Z_P_ZZ_:\n\tcase ENC_FMINP_Z_P_ZZ_:\n\tcase ENC_SHADD_Z_P_ZZ_:\n\tcase ENC_SHSUB_Z_P_ZZ_:\n\tcase ENC_SHSUBR_Z_P_ZZ_:\n\tcase ENC_SMAXP_Z_P_ZZ_:\n\tcase ENC_SMINP_Z_P_ZZ_:\n\tcase ENC_SQADD_Z_P_ZZ_:\n\tcase ENC_SQRSHL_Z_P_ZZ_:\n\tcase ENC_SQRSHLR_Z_P_ZZ_:\n\tcase ENC_SQSHL_Z_P_ZZ_:\n\tcase ENC_SQSHLR_Z_P_ZZ_:\n\tcase ENC_SQSUB_Z_P_ZZ_:\n\tcase ENC_SQSUBR_Z_P_ZZ_:\n\tcase ENC_SRHADD_Z_P_ZZ_:\n\tcase ENC_SRSHL_Z_P_ZZ_:\n\tcase ENC_SRSHLR_Z_P_ZZ_:\n\tcase ENC_SUQADD_Z_P_ZZ_:\n\tcase ENC_UHADD_Z_P_ZZ_:\n\tcase ENC_UHSUB_Z_P_ZZ_:\n\tcase ENC_UHSUBR_Z_P_ZZ_:\n\tcase ENC_UMAXP_Z_P_ZZ_:\n\tcase ENC_UMINP_Z_P_ZZ_:\n\tcase ENC_UQADD_Z_P_ZZ_:\n\tcase ENC_UQRSHL_Z_P_ZZ_:\n\tcase ENC_UQRSHLR_Z_P_ZZ_:\n\tcase ENC_UQSHL_Z_P_ZZ_:\n\tcase ENC_UQSHLR_Z_P_ZZ_:\n\tcase ENC_UQSUB_Z_P_ZZ_:\n\tcase ENC_UQSUBR_Z_P_ZZ_:\n\tcase ENC_URHADD_Z_P_ZZ_:\n\tcase ENC_URSHL_Z_P_ZZ_:\n\tcase ENC_URSHLR_Z_P_ZZ_:\n\tcase ENC_USQADD_Z_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->dn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->dn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_ASR_Z_P_ZI_:\n\tcase ENC_ASRD_Z_P_ZI_:\n\tcase ENC_LSL_Z_P_ZI_:\n\tcase ENC_LSR_Z_P_ZI_:\n\tcase ENC_SQSHL_Z_P_ZI_:\n\tcase ENC_SQSHLU_Z_P_ZI_:\n\tcase ENC_SRSHR_Z_P_ZI_:\n\tcase ENC_UQSHL_Z_P_ZI_:\n\tcase ENC_URSHR_Z_P_ZI_:\n\t{\n\t\tuint64_t const_ = ctx->shift;\n\t\tArrangementSpec T = table16_r_b_h_s_d[ctx->tsize];\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->dn, T)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->dn, T)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_ADD_Z_P_ZZ_:\n\tcase ENC_AND_Z_P_ZZ_:\n\tcase ENC_ASR_Z_P_ZZ_:\n\tcase ENC_ASRR_Z_P_ZZ_:\n\tcase ENC_BIC_Z_P_ZZ_:\n\tcase ENC_EOR_Z_P_ZZ_:\n\tcase ENC_FABD_Z_P_ZZ_:\n\tcase ENC_FADD_Z_P_ZZ_:\n\tcase ENC_FDIV_Z_P_ZZ_:\n\tcase ENC_FDIVR_Z_P_ZZ_:\n\tcase ENC_FMAX_Z_P_ZZ_:\n\tcase ENC_FMAXNM_Z_P_ZZ_:\n\tcase ENC_FMIN_Z_P_ZZ_:\n\tcase ENC_FMINNM_Z_P_ZZ_:\n\tcase ENC_FMUL_Z_P_ZZ_:\n\tcase ENC_FMULX_Z_P_ZZ_:\n\tcase ENC_FSCALE_Z_P_ZZ_:\n\tcase ENC_FSUB_Z_P_ZZ_:\n\tcase ENC_FSUBR_Z_P_ZZ_:\n\tcase ENC_LSL_Z_P_ZZ_:\n\tcase ENC_LSLR_Z_P_ZZ_:\n\tcase ENC_LSR_Z_P_ZZ_:\n\tcase ENC_LSRR_Z_P_ZZ_:\n\tcase ENC_MUL_Z_P_ZZ_:\n\tcase ENC_ORR_Z_P_ZZ_:\n\tcase ENC_SABD_Z_P_ZZ_:\n\tcase ENC_SDIV_Z_P_ZZ_:\n\tcase ENC_SDIVR_Z_P_ZZ_:\n\tcase ENC_SMAX_Z_P_ZZ_:\n\tcase ENC_SMIN_Z_P_ZZ_:\n\tcase ENC_SMULH_Z_P_ZZ_:\n\tcase ENC_SUB_Z_P_ZZ_:\n\tcase ENC_SUBR_Z_P_ZZ_:\n\tcase ENC_UABD_Z_P_ZZ_:\n\tcase ENC_UDIV_Z_P_ZZ_:\n\tcase ENC_UDIVR_Z_P_ZZ_:\n\tcase ENC_UMAX_Z_P_ZZ_:\n\tcase ENC_UMIN_Z_P_ZZ_:\n\tcase ENC_UMULH_Z_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_FCADD_Z_P_ZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tuint64_t const_ = ctx->rot ? 270 : 90;\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>,<Zm>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_ASR_Z_P_ZW_:\n\tcase ENC_LSL_Z_P_ZW_:\n\tcase ENC_LSR_Z_P_ZW_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>,<Zm>.D\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_FADD_Z_P_ZS_:\n\tcase ENC_FMAX_Z_P_ZS_:\n\tcase ENC_FMAXNM_Z_P_ZS_:\n\tcase ENC_FMIN_Z_P_ZS_:\n\tcase ENC_FMINNM_Z_P_ZS_:\n\tcase ENC_FMUL_Z_P_ZS_:\n\tcase ENC_FSUB_Z_P_ZS_:\n\tcase ENC_FSUBR_Z_P_ZS_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tfloat fimm;\n\t\tif (instr->encoding == ENC_FADD_Z_P_ZS_ || instr->encoding == ENC_FSUB_Z_P_ZS_ ||\n\t\t    instr->encoding == ENC_FSUBR_Z_P_ZS_)\n\t\t\tfimm = ctx->i1 ? 1.0 : 0.5;\n\t\telse if (instr->encoding == ENC_FMUL_Z_P_ZS_)\n\t\t\tfimm = ctx->i1 ? 2.0 : 0.5;\n\t\telse\n\t\t\tfimm = ctx->i1 ? 1.0 : 0;\n\t\t// <Zdn>.<T>,<Pg>/M,<Zdn>.<T>, #<fimm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_FIMM;\n\t\tbreak;\n\t}\n\tcase ENC_FMAD_Z_P_ZZZ_:\n\tcase ENC_FMSB_Z_P_ZZZ_:\n\tcase ENC_FNMAD_Z_P_ZZZ_:\n\tcase ENC_FNMSB_Z_P_ZZZ_:\n\tcase ENC_MAD_Z_P_ZZZ_:\n\tcase ENC_MSB_Z_P_ZZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pg>/M,<Zm>.<T>,<Za>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'm');\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->a, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_DECP_Z_P_Z_:\n\tcase ENC_INCP_Z_P_Z_:\n\tcase ENC_SQDECP_Z_P_Z_:\n\tcase ENC_SQINCP_Z_P_Z_:\n\tcase ENC_UQDECP_Z_P_Z_:\n\tcase ENC_UQINCP_Z_P_Z_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Pm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_PRED_REG(ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_INSR_Z_R_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rm_base = (ctx->size & 0x3) == 3 ? REG_X_BASE : REG_W_BASE;\n\t\t// <Zdn>.<T>,<R><m>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_INSR_Z_V_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\tunsigned rm_base = bhsd_0123_reg(ctx->size);\n\t\t// <Zdn>.<T>,<V><m>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_REG(REGSET_ZR, rm_base, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_BIC_AND_Z_ZI_:\n\tcase ENC_EON_EOR_Z_ZI_:\n\tcase ENC_ORN_ORR_Z_ZI_:\n\tcase ENC_AND_Z_ZI_:\n\tcase ENC_EOR_Z_ZI_:\n\tcase ENC_ORR_Z_ZI_:\n\t{\n\t\tArrangementSpec arr_spec = size_spec_method0((ctx->imm13 >> 12) & 1, ctx->imm13 & 0x3F);\n\t\tuint64_t const_ = ctx->imm;\n\t\tswitch (arr_spec)\n\t\t{\n\t\tcase _1B:\n\t\t\tconst_ &= 0xFF;\n\t\t\tbreak;\n\t\tcase _1H:\n\t\t\tconst_ &= 0xFFFF;\n\t\t\tbreak;\n\t\tcase _1S:\n\t\t\tconst_ &= 0xFFFFFFFF;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\t// <Zdn>.<T>,<Zdn>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_CONST;\n\t\tbreak;\n\t}\n\tcase ENC_MUL_Z_ZI_:\n\tcase ENC_SMAX_Z_ZI_:\n\tcase ENC_SMIN_Z_ZI_:\n\tcase ENC_UMAX_Z_ZI_:\n\tcase ENC_UMIN_Z_ZI_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Zdn>.<T>, #<imm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ADD_Z_ZI_:\n\tcase ENC_SQADD_Z_ZI_:\n\tcase ENC_SQSUB_Z_ZI_:\n\tcase ENC_SUB_Z_ZI_:\n\tcase ENC_SUBR_Z_ZI_:\n\tcase ENC_UQSUB_Z_ZI_:\n\tcase ENC_UQADD_Z_ZI_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Zdn>.<T>, #<imm>{,<shift>}\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tif (instr->encoding == ENC_UQADD_Z_ZI_ && ctx->sh && !imm)\n\t\t{\n\t\t\tLAST_OPERAND_SHIFT(ShiftType_LSL, 8);\n\t\t}\n\t\t// else imm is the imm8 with shift applied, no need to print\n\t\tbreak;\n\t}\n\tcase ENC_FTMAD_Z_ZZI_:\n\t{\n\t\tuint64_t imm = ctx->imm;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// <Zdn>.<T>,<Zdn>.<T>,<Zm>.<T>, #<imm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_XAR_Z_ZZI_:\n\t{\n\t\tArrangementSpec T = table16_r_b_h_s_d[ctx->tsize];\n\t\t// <Zdn>.<T>,<Zdn>.<T>,<Zm>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, T)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tADD_OPERAND_IMM32(ctx->rot, 0)\n\t\tbreak;\n\t}\n\tcase ENC_EXT_Z_ZI_DES:\n\t{\n\t\tuint64_t imm = ctx->position;\n\t\t// <Zdn>.B,<Zdn>.B,<Zm>.B, #<imm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->Zm, _1B)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_AESD_Z_ZZ_:\n\tcase ENC_AESE_Z_ZZ_:\n\t{\n\t\t// <Zdn>.B,<Zdn>.B,<Zm>.B\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->Zm, _1B)\n\t\tbreak;\n\t}\n\tcase ENC_AESIMC_Z_Z_:\n\tcase ENC_AESMC_Z_Z_:\n\t{\n\t\t// <Zdn>.B,<Zdn>.B\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1B)\n\t\tbreak;\n\t}\n\tcase ENC_DECD_Z_ZS_:\n\tcase ENC_INCD_Z_ZS_:\n\tcase ENC_SQDECD_Z_ZS_:\n\tcase ENC_SQINCD_Z_ZS_:\n\tcase ENC_UQDECD_Z_ZS_:\n\tcase ENC_UQINCD_Z_ZS_:\n\t{\n\t\t// <Zdn>.D{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1D)\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_DECH_Z_ZS_:\n\tcase ENC_INCH_Z_ZS_:\n\tcase ENC_SQDECH_Z_ZS_:\n\tcase ENC_SQINCH_Z_ZS_:\n\tcase ENC_UQDECH_Z_ZS_:\n\tcase ENC_UQINCH_Z_ZS_:\n\t{\n\t\t// <Zdn>.H{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1H)\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_DECW_Z_ZS_:\n\tcase ENC_INCW_Z_ZS_:\n\tcase ENC_SQDECW_Z_ZS_:\n\tcase ENC_SQINCW_Z_ZS_:\n\tcase ENC_UQDECW_Z_ZS_:\n\tcase ENC_UQINCW_Z_ZS_:\n\t{\n\t\t// <Zdn>.S{,<pattern>{, MUL #<imm>}}\n\t\tADD_OPERAND_ZREG_T(ctx->Zdn, _1S)\n\t\tADD_OPERAND_OPTIONAL_PATTERN_MUL;\n\t\tbreak;\n\t}\n\tcase ENC_LDR_ZA_RI_: // ZA[<Wv>, #<imm>], [<Xn|SP>{, #<imm>, MUL VL}]\n\tcase ENC_STR_ZA_RI_: // ZA[<Wv>, #<imm>], [<Xn|SP>{, #<imm>, MUL VL}]\n\t{\n\t\tADD_OPERAND_ACCUM_ARRAY(REG_W0+12+ctx->Rv, ctx->imm);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, ctx->imm4);\n\t\tbreak;\n\t}\n\tcase ENC_LDR_Z_BI_:\n\tcase ENC_STR_Z_BI_:\n\t{\n\t\tsigned imm = ctx->imm;\n\t\t// <Zt>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_ZT;\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_AT_SYS_CR_SYSTEMINSTRS:\n\t{\n\t\tchar* at_op = \"\";\n\t\tswitch (AT_OP(ctx->sys_op1, ctx->sys_crm, ctx->sys_op2))\n\t\t{\n\t\tcase AT_OP(0b000, 0b1000, 0b000): at_op = \"S1E1R\"; break;\n\t\tcase AT_OP(0b000, 0b1000, 0b001): at_op = \"S1E1W\"; break;\n\t\tcase AT_OP(0b000, 0b1000, 0b010): at_op = \"S1E0R\"; break;\n\t\tcase AT_OP(0b000, 0b1000, 0b011): at_op = \"S1E0W\"; break;\n\t\tcase AT_OP(0b000, 0b1001, 0b000): at_op = \"S1E1RP\"; break;\n\t\tcase AT_OP(0b000, 0b1001, 0b001): at_op = \"S1E1WP\"; break;\n\t\tcase AT_OP(0b000, 0b1001, 0b010): at_op = \"S1E1A\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b000): at_op = \"S1E2R\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b001): at_op = \"S1E2W\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b100): at_op = \"S12E1R\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b101): at_op = \"S12E1W\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b110): at_op = \"S12E0R\"; break;\n\t\tcase AT_OP(0b100, 0b1000, 0b111): at_op = \"S12E0W\"; break;\n\t\tcase AT_OP(0b100, 0b1001, 0b010): at_op = \"S1E2A\"; break;\n\t\tcase AT_OP(0b110, 0b1000, 0b000): at_op = \"S1E3R\"; break;\n\t\tcase AT_OP(0b110, 0b1000, 0b001): at_op = \"S1E3W\"; break;\n\t\tcase AT_OP(0b110, 0b1001, 0b010): at_op = \"S1E3A\"; break;\n\t\t}\n\t\t// switch ((ctx->sys_op1 << 4) | ((ctx->sys_crm & 1) << 3) | (ctx->sys_op2 & 7))\n\t\t// {\n\t\t// case 0b0000000:\n\t\t// \tat_op = \"S1E1R\";\n\t\t// \tbreak;\n\t\t// case 0b0000001:\n\t\t// \tat_op = \"S1E1W\";\n\t\t// \tbreak;\n\t\t// case 0b0000010:\n\t\t// \tat_op = \"S1E0R\";\n\t\t// \tbreak;\n\t\t// case 0b0000011:\n\t\t// \tat_op = \"S1E0W\";\n\t\t// \tbreak;\n\t\t// case 0b0001000:\n\t\t// \tat_op = \"S1E1RP\";\n\t\t// \tbreak;\n\t\t// case 0b0001001:\n\t\t// \tat_op = \"S1E1WP\";\n\t\t// \tbreak;\n\t\t// case 0b1000000:\n\t\t// \tat_op = \"S1E2R\";\n\t\t// \tbreak;\n\t\t// case 0b1000001:\n\t\t// \tat_op = \"S1E2W\";\n\t\t// \tbreak;\n\t\t// case 0b1000100:\n\t\t// \tat_op = \"S12E1R\";\n\t\t// \tbreak;\n\t\t// case 0b1000101:\n\t\t// \tat_op = \"S12E1W\";\n\t\t// \tbreak;\n\t\t// case 0b1000110:\n\t\t// \tat_op = \"S12E1R\";\n\t\t// \tbreak;\n\t\t// case 0b1000111:\n\t\t// \tat_op = \"S12E0W\";\n\t\t// \tbreak;\n\t\t// case 0b1100000:\n\t\t// \tat_op = \"S1E3R\";\n\t\t// \tbreak;\n\t\t// case 0b1100001:\n\t\t// \tat_op = \"S1E3W\";\n\t\t// \tbreak;\n\t\t// }\n\t\tinstr->operands[i].immediate = AT_OP(ctx->sys_op1, ctx->sys_crm, ctx->sys_op2);\n\t\t// <at_op>\n\t\tADD_OPERAND_NAME(at_op)\n\t\t// <Xt>\n\t\tADD_OPERAND_XT\n\t\tbreak;\n\t}\n\tcase ENC_B_ONLY_CONDBRANCH:\n\t{\n\t\tOperation lookup[16] = {ARM64_B_EQ, ARM64_B_NE, ARM64_B_CS, ARM64_B_CC, ARM64_B_MI, ARM64_B_PL,\n\t\t    ARM64_B_VS, ARM64_B_VC, ARM64_B_HI, ARM64_B_LS, ARM64_B_GE, ARM64_B_LT, ARM64_B_GT,\n\t\t    ARM64_B_LE, ARM64_B_AL, ARM64_B_NV};\n\n\t\tinstr->operation = lookup[ctx->condition];\n\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <label>\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_DC_SYS_CR_SYSTEMINSTRS:\n\t{\n#define HavePoP() (1)\n#define HavePoPS() (1)\n#define HaveMT() (1)\n#define HaveMTE() (1)\n#define HaveDP() (1)\n#define HaveDPB() (1)\n#define HaveOCCM() (1)\n#define HaveOCCMO() (1)\n#define HaveRM() (1)\n#define HaveRME() (1)\n#define HaveME() (1)\n#define HaveMEC() (1)\n\t\tconst char* dc_op = \"RESERVED\";\n\t\tuint64_t op1 = ctx->op1;\n\t\tuint64_t op2 = ctx->op2;\n\t\tuint64_t CRm = ctx->CRm;\n\t\tswitch (DC_OP(op1, CRm, op2)) {\n\t\tcase DC_OP(0b000, 0b0110, 0b001): dc_op = \"IVAC\"; break;\n\t\tcase DC_OP(0b000, 0b0110, 0b010): dc_op = \"ISW\"; break;\n\t\tcase DC_OP(0b000, 0b0110, 0b011): if (HaveMTE()) dc_op = \"IGVAC\"; break;\n\t\tcase DC_OP(0b000, 0b0110, 0b100): if (HaveMTE()) dc_op = \"IGSW\"; break;\n\t\tcase DC_OP(0b000, 0b0110, 0b101): if (HaveMTE()) dc_op = \"IGDVAC\"; break;\n\t\tcase DC_OP(0b000, 0b0110, 0b110): if (HaveMTE()) dc_op = \"IGDSW\"; break;\n\t\tcase DC_OP(0b000, 0b1010, 0b010): dc_op = \"CSW\"; break;\n\t\tcase DC_OP(0b000, 0b1010, 0b100): if (HaveMTE()) dc_op = \"CGSW\"; break;\n\t\tcase DC_OP(0b000, 0b1010, 0b110): if (HaveMTE()) dc_op = \"CGDSW\"; break;\n\t\tcase DC_OP(0b000, 0b1110, 0b010): dc_op = \"CISW\"; break;\n\t\tcase DC_OP(0b000, 0b1110, 0b100): if (HaveMTE()) dc_op = \"CIGSW\"; break;\n\t\tcase DC_OP(0b000, 0b1110, 0b110): if (HaveMTE()) dc_op = \"CIGDSW\"; break;\n\t\tcase DC_OP(0b000, 0b1111, 0b001): if (HavePoP()) dc_op = \"CIVAPS\"; break;\n\t\tcase DC_OP(0b000, 0b1111, 0b101): if (HavePoPS() && HaveMTE()) dc_op = \"CIGDVAPS\"; break;\n\t\tcase DC_OP(0b011, 0b0100, 0b001): dc_op = \"ZVA\"; break;\n\t\tcase DC_OP(0b011, 0b0100, 0b011): if (HaveMT()) dc_op = \"GVA\"; break;\n\t\tcase DC_OP(0b011, 0b0100, 0b100): if (HaveMT()) dc_op = \"GZVA\"; break;\n\t\tcase DC_OP(0b011, 0b1010, 0b001): dc_op = \"CVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1010, 0b011): if (HaveMT()) dc_op = \"CGVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1010, 0b101): if (HaveMT()) dc_op = \"CGDVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1011, 0b000): if (HaveOCCM()) dc_op = \"CVAOC\"; break;\n\t\tcase DC_OP(0b011, 0b1011, 0b001): dc_op = \"CVAU\"; break;\n\t\tcase DC_OP(0b011, 0b1011, 0b111): if (HaveOCCMO() && HaveMT()) dc_op = \"CGDVAOC\"; break;\n\t\tcase DC_OP(0b011, 0b1100, 0b001): if (HaveDP()) dc_op = \"CVAP\"; break;\n\t\tcase DC_OP(0b011, 0b1100, 0b011): if (HaveMT()) dc_op = \"CGVAP\"; break;\n\t\tcase DC_OP(0b011, 0b1100, 0b101): if (HaveMT()) dc_op = \"CGDVAP\"; break;\n\t\tcase DC_OP(0b011, 0b1101, 0b001): if (HaveDPB()) dc_op = \"CVADP\"; break;\n\t\tcase DC_OP(0b011, 0b1101, 0b011): if (HaveMT()) dc_op = \"CGVADP\"; break;\n\t\tcase DC_OP(0b011, 0b1101, 0b101): if (HaveMT()) dc_op = \"CGDVADP\"; break;\n\t\tcase DC_OP(0b011, 0b1110, 0b001): dc_op = \"CIVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1110, 0b011): if (HaveMT()) dc_op = \"CIGVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1110, 0b101): if (HaveMT()) dc_op = \"CIGDVAC\"; break;\n\t\tcase DC_OP(0b011, 0b1111, 0b000): if (HaveOCCM()) dc_op = \"CIVAOC\"; break;\n\t\tcase DC_OP(0b011, 0b1111, 0b111): if (HaveOCCMO() && HaveMT()) dc_op = \"CIGDVAOC\"; break;\n\t\tcase DC_OP(0b100, 0b1110, 0b000): if (HaveME()) dc_op = \"CIPAE\"; break;\n\t\tcase DC_OP(0b100, 0b1110, 0b111): if (HaveMEC() && HaveMTE()) dc_op = \"CIGDPAE\"; break;\n\t\tcase DC_OP(0b110, 0b1110, 0b001): if (HaveRM()) dc_op = \"CIPAPA\"; break;\n\t\tcase DC_OP(0b110, 0b1110, 0b101): if (HaveRME() && HaveMTE()) dc_op = \"CIGDPAPA\"; break;\n\t\t}\n//\t\tif (op1 == 0b000 && CRm == 0b0110 && op2 == 0b001)\n//\t\t\tdc_op = \"ivac\";\n//\t\telse if (op1 == 0b000 && CRm == 0b0110 && op2 == 0b010)\n//\t\t\tdc_op = \"isw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b0110 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"igvac\";\n//\t\telse if (op1 == 0b000 && CRm == 0b0110 && op2 == 0b100 && HasMTE())\n//\t\t\tdc_op = \"igsw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b0110 && op2 == 0b101 && HasMTE())\n//\t\t\tdc_op = \"igdvac\";\n//\t\telse if (op1 == 0b000 && CRm == 0b0110 && op2 == 0b110 && HasMTE())\n//\t\t\tdc_op = \"igdsw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1010 && op2 == 0b010)\n//\t\t\tdc_op = \"csw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1010 && op2 == 0b100 && HasMTE())\n//\t\t\tdc_op = \"cgsw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1010 && op2 == 0b010 && HasMTE())\n//\t\t\tdc_op = \"cgdsw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1110 && op2 == 0b010)\n//\t\t\tdc_op = \"cisw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1110 && op2 == 0b100 && HasMTE())\n//\t\t\tdc_op = \"cigsw\";\n//\t\telse if (op1 == 0b000 && CRm == 0b1110 && op2 == 0b110 && HasMTE())\n//\t\t\tdc_op = \"cigdsw\";\n//\t\telse if (op1 == 0b011 && CRm == 0b0100 && op2 == 0b001)\n//\t\t\tdc_op = \"zva\";\n//\t\telse if (op1 == 0b011 && CRm == 0b0100 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"gva\";\n//\t\telse if (op1 == 0b011 && CRm == 0b0100 && op2 == 0b100 && HasMTE())\n//\t\t\tdc_op = \"gzva\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1010 && op2 == 0b001)\n//\t\t\tdc_op = \"cvac\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1010 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"cgvac\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1010 && op2 == 0b101 && HasMTE())\n//\t\t\tdc_op = \"cgdvac\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1011 && op2 == 0b001)\n//\t\t\tdc_op = \"cvau\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1100 && op2 == 0b001 && HaveDCPoP())\n//\t\t\tdc_op = \"cvap\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1100 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"cgvap\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1100 && op2 == 0b101 && HasMTE())\n//\t\t\tdc_op = \"cgdvap\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1101 && op2 == 0b001 && HaveDCCVADP())\n//\t\t\tdc_op = \"cvadp\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1101 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"cgvadp\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1101 && op2 == 0b101 && HasMTE())\n//\t\t\tdc_op = \"cgdvadp\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1110 && op2 == 0b001)\n//\t\t\tdc_op = \"civac\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1110 && op2 == 0b011 && HasMTE())\n//\t\t\tdc_op = \"cigvac\";\n//\t\telse if (op1 == 0b011 && CRm == 0b1110 && op2 == 0b101 && HasMTE())\n//\t\t\tdc_op = \"cgdvac\";\n\t\tinstr->operands[i].immediate = DC_OP(op1, CRm, op2);\n\t\t// <dc_op>\n\t\tADD_OPERAND_NAME(dc_op);\n        // <Xt>\n\t\tADD_OPERAND_XT;\n\n\t\tbreak;\n\t}\n\tcase ENC_IC_SYS_CR_SYSTEMINSTRS:\n\t{\n\t\tconst char* ic_op = \"RESERVED\";\n\t\tbool include_reg = false;\n\t\tuint64_t op1 = ctx->op1;\n\t\tuint64_t op2 = ctx->op2;\n\t\tuint64_t CRm = ctx->CRm;\n\t\tif (op1 == 0b000 && CRm == 0b0001 && op2 == 0b000)\n\t\t\tic_op = \"ialluis\";\n\t\telse if (op1 == 0b000 && CRm == 0b0101 && op2 == 0b000)\n\t\t\tic_op = \"iallu\";\n\t\telse if (op1 == 0b011 && CRm == 0b0101 && op2 == 0b001)\n\t\t{\n\t\t\tic_op = \"ivau\";\n\t\t\tinclude_reg = true;\n\t\t}\n\n\t\t// <ic_op>{,<Xt>}\n\t\tADD_OPERAND_NAME(ic_op);\n\n\t\t// neither llvm nor libopcodes include this\n\t\tif (include_reg)\n\t\t{\n\t\t\tADD_OPERAND_XT\n\t\t}\n\n\t\tbreak;\n\t}\n\tcase ENC_BRK_EX_EXCEPTION:\n\tcase ENC_HLT_EX_EXCEPTION:\n\tcase ENC_HVC_EX_EXCEPTION:\n\tcase ENC_SMC_EX_EXCEPTION:\n\tcase ENC_SVC_EX_EXCEPTION:\n\tcase ENC_UDF_ONLY_PERM_UNDEF:\n\t{\n\t\tuint64_t imm = ctx->imm16;\n\t\t// #<imm>\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_HINT_HM_HINTS:\n\t{\n\t\tuint64_t imm = (ctx->CRm << 3) | ctx->op2;\n\t\t// #<imm>\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_BL_ONLY_BRANCH_IMM:\n\tcase ENC_B_ONLY_BRANCH_IMM:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// <label>\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_SYS_CR_SYSTEMINSTRS:\n\t{\n\t\t// sys #<op1>,<Cn>,<Cm>, #<op2>{,<Xt>}\n\t\tADD_OPERAND_IMM32(ctx->op1, 0);\n\t\tADD_OPERAND_NAME(reg_lookup_c[ctx->sys_crn & 0xF]);\n\t\tADD_OPERAND_NAME(reg_lookup_c[ctx->sys_crm & 0xF]);\n\t\tADD_OPERAND_IMM32(ctx->op2, 0);\n\t\t// {,<Xt>}\n\t\tif (ctx->Rt != 31)\n\t\t{\n\t\t\tADD_OPERAND_XT\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_DMB_BO_BARRIERS:\n\tcase ENC_DSB_BO_BARRIERS:\n\t{\n\t\tconst char* table_barrier_limitations[16] = {\"#0\", \"oshld\", \"oshst\", \"osh\", \"#4\", \"nshld\",\n\t\t    \"nshst\", \"nsh\", \"#8\", \"ishld\", \"ishst\", \"ish\", \"#12\", \"ld\", \"st\", \"sy\"};\n\t\tADD_OPERAND_NAME(table_barrier_limitations[ctx->CRm & 0xF]);\n\t\tbreak;\n\t}\n\tcase ENC_DSB_BON_BARRIERS:\n\t{\n\t\tconst char* table_barrier_limitations[4] = {\"oshnXS\", \"nshnXS\", \"ishnXS\", \"synXS\"};\n\t\t// DSB <option>nXS|#<imm>\n\t\tADD_OPERAND_NAME(table_barrier_limitations[ctx->imm2]);\n\t\tbreak;\n\t}\n\tcase ENC_PRFH_I_P_BR_S:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFW_I_P_BR_S:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFD_I_P_BR_S:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_BR_S:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_PRFH_I_P_BZ_D_64_SCALED:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D, LSL #1]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFW_I_P_BZ_D_64_SCALED:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D, LSL #2]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFD_I_P_BZ_D_64_SCALED:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D, LSL #3]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFH_I_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D,<mod>#1]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFW_I_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D,<mod>#2]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFD_I_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D,<mod>#3]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D,<mod>]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_BZ_D_64_SCALED:\n\t{\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.D]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_X_BASE, ctx->n, REG_Z_BASE, ctx->m, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_PRFH_I_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.S,<mod>#1]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFW_I_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.S,<mod>#2]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFD_I_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.S,<mod>#3]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>,<Zm>.S,<mod>]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_BI_S:\n\tcase ENC_PRFD_I_P_BI_S:\n\tcase ENC_PRFH_I_P_BI_S:\n\tcase ENC_PRFW_I_P_BI_S:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\n\t\t/*\n\t\tunsigned factor;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\t// case ENC_PRFH_I_P_BI_S: factor = 2; break;\n\t\t// case ENC_PRFW_I_P_BI_S: factor = 4; break;\n\t\t// case ENC_PRFD_I_P_BI_S: factor = 8; break;\n\t\tdefault:\n\t\t\tfactor = 1;\n\t\t}\n\t\t*/\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_AI_D:\n\tcase ENC_PRFD_I_P_AI_D:\n\tcase ENC_PRFH_I_P_AI_D:\n\tcase ENC_PRFW_I_P_AI_D:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_PRFH_I_P_AI_D:\n\t\t\timm *= 2;\n\t\t\tbreak;\n\t\tcase ENC_PRFW_I_P_AI_D:\n\t\t\timm *= 4;\n\t\t\tbreak;\n\t\tcase ENC_PRFD_I_P_AI_D:\n\t\t\timm *= 8;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Zn>.D{, #<imm>}]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_PRFB_I_P_AI_S:\n\tcase ENC_PRFD_I_P_AI_S:\n\tcase ENC_PRFH_I_P_AI_S:\n\tcase ENC_PRFW_I_P_AI_S:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_PRFH_I_P_AI_S:\n\t\t\timm *= 2;\n\t\t\tbreak;\n\t\tcase ENC_PRFW_I_P_AI_S:\n\t\t\timm *= 4;\n\t\t\tbreak;\n\t\tcase ENC_PRFD_I_P_AI_S:\n\t\t\timm *= 8;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tconst char* prfop = prfop_lookup_4(ctx->prfop);\n\t\t// <prfop>,<Pg>, [<Zn>.S{, #<imm>}]\n\t\tADD_OPERAND_NAME(prfop);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_PRFM_P_LDST_REGOFF:\n\t{\n\t\tint reg_base = table_wbase_xbase[ctx->option & 1];\n\t\t// (<prfop>|#<imm5>), [<Xn|SP>, (<Wm>|<Xm>){,<extend>{<amount>}}]\n\t\tADD_OPERAND_NAME(prfop_lookup(ctx->Rt));\n\t\tADD_OPERAND_MEM_EXTENDED(reg_base, ctx->n, ctx->m);\n\t\tOPTIONAL_EXTEND_AMOUNT(3);\n\t\tbreak;\n\t}\n\tcase ENC_PRFM_P_LDST_POS:\n\t{\n\t\t// (<prfop>|#<imm5>), [<Xn|SP>{, #<pimm>}]\n\t\tADD_OPERAND_NAME(prfop_lookup(ctx->Rt));\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\n\t\tbreak;\n\t}\n\tcase ENC_PRFUM_P_LDST_UNSCALED:\n\t{\n\t\t// (<prfop>|#<imm5>), [<Xn|SP>{, #<simm>}]\n\t\tADD_OPERAND_NAME(prfop_lookup(ctx->Rt));\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, ctx->offset);\n\t\tbreak;\n\t}\n\tcase ENC_PRFM_P_LOADLIT:\n\t{\n\t\tuint64_t eaddr = ctx->address + ctx->offset;\n\t\t// (<prfop>|#<imm5>),<label>\n\t\tADD_OPERAND_NAME(prfop_lookup(ctx->Rt));\n\t\tADD_OPERAND_LABEL;\n\t\tbreak;\n\t}\n\tcase ENC_SMSTART_MSR_SI_PSTATE:\n\tcase ENC_SMSTOP_MSR_SI_PSTATE:\n\t{\n\t\tchar *option = NULL;\n\t\tswitch((ctx->CRm >> 1) & 3) {\n\t\t\tcase 0: option = \"RESERVED\"; break;\n\t\t\tcase 1: option = \"SM\"; break;\n\t\t\tcase 2: option = \"ZA\"; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tif(option) {\n\t\t\tADD_OPERAND_NAME(option);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_MSR_SI_PSTATE:\n\t{\n\t\tSystemReg sr = SYSREG_NONE;\n\t\tif (ctx->op1 == 0 && ctx->op2 == 3 && HaveUAOExt())\n\t\t\tsr = REG_UAO;  // \"UAO\";\n\t\telse if (ctx->op1 == 0 && ctx->op2 == 4 && HavePANExt())\n\t\t\tsr = REG_PAN;  // \"PAN\";\n\t\telse if (ctx->op1 == 0 && ctx->op2 == 5)\n\t\t\tsr = REG_PSTATE_SPSEL;  // \"SPSel\";\n\t\telse if (ctx->op1 == 3 && ctx->op2 == 1 && HaveSSBSExt())\n\t\t\tsr = REG_SSBS;  // \"SSBS\";\n\t\telse if (ctx->op1 == 3 && ctx->op2 == 2 && HaveDITExt())\n\t\t\tsr = REG_DIT;  // \"DIT\";\n\t\telse if (ctx->op1 == 3 && ctx->op2 == 4 && HasMTE())\n\t\t\tsr = REG_TCO;  // \"TCO\";\n\t\telse if (ctx->op1 == 3 && ctx->op2 == 6 && HasMTE())\n\t\t\tsr = REG_DAIFSET;  // \"DAIFSet\";\n\t\telse if (ctx->op1 == 3 && ctx->op2 == 7 && HasMTE())\n\t\t\tsr = REG_DAIFCLR;  // \"DAIFClr\";\n\n\t\tif (sr == SYSREG_NONE)\n\t\t{\n\t\t\tADD_OPERAND_SYSTEMREG_IMPL_SPEC(sr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tADD_OPERAND_SYSTEMREG(sr);\n\t\t}\n\n\t\tunsigned imm = ctx->CRm;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\n\t\tbreak;\n\t}\n\tcase ENC_MSR_SR_SYSTEMMOVE:\n\t{\n\t\t// (<systemreg>|S<op0>_<op1>_<Cn>_<Cm>_<op2>),<Xt>\n\t\tADD_OPERAND_SYSTEMREG_SENSE;\n\t\tADD_OPERAND_XT;\n\t\tbreak;\n\t}\n\tcase ENC_TCANCEL_EX_EXCEPTION:\n\t{\n\t\tunsigned imm = ctx->imm16;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_TSTART_BR_SYSTEMRESULT:\n\tcase ENC_TTEST_BR_SYSTEMRESULT:\n\t{\n\t\tADD_OPERAND_XT;\n\t\tbreak;\n\t}\n\tcase ENC_TLBI_SYS_CR_SYSTEMINSTRS:\n\t{\n\t\tuint64_t op1 = ctx->op1;\n\t\tuint64_t op2 = ctx->op2;\n\t\tuint64_t crn = ctx->CRn;\n\t\tuint64_t crm = ctx->CRm;\n\t\tconst char* tlbi_op = \"error\";\n\t\tinstr->operands[i].immediate = -1;\n\t\tswitch (TLBI_OP(op1, crn, crm, op2))\n\t\t{\n#define HaveXS() (1)\n#define HaveTLBIW() (1)\n#define HaveRME() (1)\n\t\tcase TLBI_OP(0b000, 0b1000, 0b0001, 0b000): if HaveTLBIOS() tlbi_op = \"vmalle1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0001, 0b001): if HaveTLBIOS() tlbi_op = \"vae1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0001, 0b010): if HaveTLBIOS() tlbi_op = \"aside1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0001, 0b011): if HaveTLBIOS() tlbi_op = \"vaae1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0001, 0b101): if HaveTLBIOS() tlbi_op = \"vale1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0001, 0b111): if HaveTLBIOS() tlbi_op = \"vaale1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0010, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0010, 0b011): if HaveTLBIRANGE() tlbi_op = \"rvaae1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0010, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0010, 0b111): if HaveTLBIRANGE() tlbi_op = \"rvaale1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b000): tlbi_op = \"vmalle1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b001): tlbi_op = \"vae1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b010): tlbi_op = \"aside1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b011): tlbi_op = \"vaae1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b101): tlbi_op = \"vale1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0011, 0b111): tlbi_op = \"vaale1is\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0101, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0101, 0b011): if HaveTLBIRANGE() tlbi_op = \"rvaae1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0101, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0101, 0b111): if HaveTLBIRANGE() tlbi_op = \"rvaale1os\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0110, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0110, 0b011): if HaveTLBIRANGE() tlbi_op = \"rvaae1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0110, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0110, 0b111): if HaveTLBIRANGE() tlbi_op = \"rvaale1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b000): tlbi_op = \"vmalle1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b001): tlbi_op = \"vae1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b010): tlbi_op = \"aside1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b011): tlbi_op = \"vaae1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b101): tlbi_op = \"vale1\"; break;\n        case TLBI_OP(0b000, 0b1000, 0b0111, 0b111): tlbi_op = \"vaale1\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b000): if HaveXS() tlbi_op = \"vmalle1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b001): if HaveXS() tlbi_op = \"vae1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b010): if HaveXS() tlbi_op = \"aside1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b011): if HaveXS() tlbi_op = \"vaae1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b101): if HaveXS() tlbi_op = \"vale1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0001, 0b111): if HaveXS() tlbi_op = \"vaale1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0010, 0b001): if HaveXS() tlbi_op = \"rvae1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0010, 0b011): if HaveXS() tlbi_op = \"rvaae1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0010, 0b101): if HaveXS() tlbi_op = \"rvale1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0010, 0b111): if HaveXS() tlbi_op = \"rvaale1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b000): if HaveXS() tlbi_op = \"vmalle1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b001): if HaveXS() tlbi_op = \"vae1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b010): if HaveXS() tlbi_op = \"aside1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b011): if HaveXS() tlbi_op = \"vaae1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b101): if HaveXS() tlbi_op = \"vale1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0011, 0b111): if HaveXS() tlbi_op = \"vaale1isnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0101, 0b001): if HaveXS() tlbi_op = \"rvae1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0101, 0b011): if HaveXS() tlbi_op = \"rvaae1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0101, 0b101): if HaveXS() tlbi_op = \"rvale1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0101, 0b111): if HaveXS() tlbi_op = \"rvaale1osnxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0110, 0b001): if HaveXS() tlbi_op = \"rvae1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0110, 0b011): if HaveXS() tlbi_op = \"rvaae1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0110, 0b101): if HaveXS() tlbi_op = \"rvale1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0110, 0b111): if HaveXS() tlbi_op = \"rvaale1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b000): if HaveXS() tlbi_op = \"vmalle1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b001): if HaveXS() tlbi_op = \"vae1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b010): if HaveXS() tlbi_op = \"aside1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b011): if HaveXS() tlbi_op = \"vaae1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b101): if HaveXS() tlbi_op = \"vale1nxs\"; break;\n        case TLBI_OP(0b000, 0b1001, 0b0111, 0b111): if HaveXS() tlbi_op = \"vaale1nxs\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0000, 0b001): tlbi_op = \"ipas2e1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0000, 0b010): if HaveTLBIRANGE() tlbi_op = \"ripas2e1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0000, 0b101): tlbi_op = \"ipas2le1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0000, 0b110): if HaveTLBIRANGE() tlbi_op = \"ripas2le1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0001, 0b000): if HaveTLBIOS() tlbi_op = \"alle2os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0001, 0b001): if HaveTLBIOS() tlbi_op = \"vae2os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0001, 0b100): if HaveTLBIOS() tlbi_op = \"alle1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0001, 0b101): if HaveTLBIOS() tlbi_op = \"vale2os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0001, 0b110): if HaveTLBIOS() tlbi_op = \"vmalls12e1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0010, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae2is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0010, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0010, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale2is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0011, 0b000): tlbi_op = \"alle2is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0011, 0b001): tlbi_op = \"vae2is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0011, 0b100): tlbi_op = \"alle1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0011, 0b101): tlbi_op = \"vale2is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0011, 0b110): tlbi_op = \"vmalls12e1is\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b000): if HaveTLBIOS() tlbi_op = \"ipas2e1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b001): tlbi_op = \"ipas2e1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b010): if HaveTLBIRANGE() tlbi_op = \"ripas2e1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b011): if HaveTLBIRANGE() tlbi_op = \"ripas2e1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b100): if HaveTLBIOS() tlbi_op = \"ipas2le1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b101): tlbi_op = \"ipas2le1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b110): if HaveTLBIRANGE() tlbi_op = \"ripas2le1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0100, 0b111): if HaveTLBIRANGE() tlbi_op = \"ripas2le1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0101, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae2os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0101, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0101, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale2os\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0110, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae2\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0110, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0110, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale2\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0111, 0b000): tlbi_op = \"alle2\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0111, 0b001): tlbi_op = \"vae2\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0111, 0b100): tlbi_op = \"alle1\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0111, 0b101): tlbi_op = \"vale2\"; break;\n        case TLBI_OP(0b100, 0b1000, 0b0111, 0b110): tlbi_op = \"vmalls12e1\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0000, 0b001): if HaveXS() tlbi_op = \"ipas2e1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0000, 0b010): if HaveXS() tlbi_op = \"ripas2e1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0000, 0b101): if HaveXS() tlbi_op = \"ipas2le1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0000, 0b110): if HaveXS() tlbi_op = \"ripas2le1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0001, 0b000): if HaveXS() tlbi_op = \"alle2osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0001, 0b001): if HaveXS() tlbi_op = \"vae2osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0001, 0b100): if HaveXS() tlbi_op = \"alle1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0001, 0b101): if HaveXS() tlbi_op = \"vale2osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0001, 0b110): if HaveXS() tlbi_op = \"vmalls12e1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0010, 0b001): if HaveXS() tlbi_op = \"rvae2isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0010, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0010, 0b101): if HaveXS() tlbi_op = \"rvale2isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0011, 0b000): if HaveXS() tlbi_op = \"alle2isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0011, 0b001): if HaveXS() tlbi_op = \"vae2isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0011, 0b100): if HaveXS() tlbi_op = \"alle1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0011, 0b101): if HaveXS() tlbi_op = \"vale2isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0011, 0b110): if HaveXS() tlbi_op = \"vmalls12e1isnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b000): if HaveXS() tlbi_op = \"ipas2e1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b001): if HaveXS() tlbi_op = \"ipas2e1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b010): if HaveXS() tlbi_op = \"ripas2e1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b011): if HaveXS() tlbi_op = \"ripas2e1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b100): if HaveXS() tlbi_op = \"ipas2le1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b101): if HaveXS() tlbi_op = \"ipas2le1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b110): if HaveXS() tlbi_op = \"ripas2le1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0100, 0b111): if HaveXS() tlbi_op = \"ripas2le1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0101, 0b001): if HaveXS() tlbi_op = \"rvae2osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0101, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0101, 0b101): if HaveXS() tlbi_op = \"rvale2osnxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0110, 0b001): if HaveXS() tlbi_op = \"rvae2nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0110, 0b010): if HaveTLBIW() tlbi_op = \"vmallws2e1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0110, 0b101): if HaveXS() tlbi_op = \"rvale2nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0111, 0b000): if HaveXS() tlbi_op = \"alle2nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0111, 0b001): if HaveXS() tlbi_op = \"vae2nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0111, 0b100): if HaveXS() tlbi_op = \"alle1nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0111, 0b101): if HaveXS() tlbi_op = \"vale2nxs\"; break;\n        case TLBI_OP(0b100, 0b1001, 0b0111, 0b110): if HaveXS() tlbi_op = \"vmalls12e1nxs\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0001, 0b000): if HaveTLBIOS() tlbi_op = \"alle3os\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0001, 0b001): if HaveTLBIOS() tlbi_op = \"vae3os\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0001, 0b100): if HaveRME() tlbi_op = \"paallos\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0001, 0b101): if HaveTLBIOS() tlbi_op = \"vale3os\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0010, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae3is\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0010, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale3is\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0011, 0b000): tlbi_op = \"alle3is\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0011, 0b001): tlbi_op = \"vae3is\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0011, 0b101): tlbi_op = \"vale3is\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0100, 0b011): if HaveRME() tlbi_op = \"rpaos\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0100, 0b111): if HaveRME() tlbi_op = \"rpalos\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0101, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae3os\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0101, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale3os\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0110, 0b001): if HaveTLBIRANGE() tlbi_op = \"rvae3\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0110, 0b101): if HaveTLBIRANGE() tlbi_op = \"rvale3\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0111, 0b000): tlbi_op = \"alle3\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0111, 0b001): tlbi_op = \"vae3\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0111, 0b100): if HaveRME() tlbi_op = \"paall\"; break;\n        case TLBI_OP(0b110, 0b1000, 0b0111, 0b101): tlbi_op = \"vale3\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0001, 0b000): if HaveXS() tlbi_op = \"alle3osnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0001, 0b001): if HaveXS() tlbi_op = \"vae3osnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0001, 0b101): if HaveXS() tlbi_op = \"vale3osnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0010, 0b001): if HaveXS() tlbi_op = \"rvae3isnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0010, 0b101): if HaveXS() tlbi_op = \"rvale3isnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0011, 0b000): if HaveXS() tlbi_op = \"alle3isnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0011, 0b001): if HaveXS() tlbi_op = \"vae3isnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0011, 0b101): if HaveXS() tlbi_op = \"vale3isnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0101, 0b001): if HaveXS() tlbi_op = \"rvae3osnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0101, 0b101): if HaveXS() tlbi_op = \"rvale3osnxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0110, 0b001): if HaveXS() tlbi_op = \"rvae3nxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0110, 0b101): if HaveXS() tlbi_op = \"rvale3nxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0111, 0b000): if HaveXS() tlbi_op = \"alle3nxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0111, 0b001): if HaveXS() tlbi_op = \"vae3nxs\"; break;\n        case TLBI_OP(0b110, 0b1001, 0b0111, 0b101): if HaveXS() tlbi_op = \"vale3nxs\"; break;\n\n\n\t\t}\n\t\t// if (op1 == 0b000 && crm == 0b0001 && op2 == 0b000 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vmalle1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0001 && op2 == 0b001 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vae1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0001 && op2 == 0b010 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"aside1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0001 && op2 == 0b011 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vaae1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0001 && op2 == 0b101 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vale1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0001 && op2 == 0b111 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vaale1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0010 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0010 && op2 == 0b011 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaae1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0010 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0010 && op2 == 0b111 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaale1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b000)\n\t\t// \ttlbi_op = \"vmalle1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b010)\n\t\t// \ttlbi_op = \"aside1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b011)\n\t\t// \ttlbi_op = \"vaae1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0011 && op2 == 0b111)\n\t\t// \ttlbi_op = \"vaale1is\";\n\t\t// else if (op1 == 0b000 && crm == 0b0101 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0101 && op2 == 0b011 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaae1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0101 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0101 && op2 == 0b111 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaale1os\";\n\t\t// else if (op1 == 0b000 && crm == 0b0110 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0110 && op2 == 0b011 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaae1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0110 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0110 && op2 == 0b111 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvaale1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b000)\n\t\t// \ttlbi_op = \"vmalle1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b010)\n\t\t// \ttlbi_op = \"aside1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b011)\n\t\t// \ttlbi_op = \"vaae1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale1\";\n\t\t// else if (op1 == 0b000 && crm == 0b0111 && op2 == 0b111)\n\t\t// \ttlbi_op = \"vaale1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0000 && op2 == 0b001)\n\t\t// \ttlbi_op = \"ipas2e1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0000 && op2 == 0b010 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2e1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0000 && op2 == 0b101)\n\t\t// \ttlbi_op = \"ipas2le1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0000 && op2 == 0b110 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2le1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0001 && op2 == 0b000 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"alle2os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0001 && op2 == 0b001 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vae2os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0001 && op2 == 0b100 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"alle1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0001 && op2 == 0b101 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vale2os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0001 && op2 == 0b110 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vmalls12e1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0010 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae2is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0010 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale2is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0011 && op2 == 0b000)\n\t\t// \ttlbi_op = \"alle2is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0011 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae2is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0011 && op2 == 0b100)\n\t\t// \ttlbi_op = \"alle1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0011 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale2is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0011 && op2 == 0b110)\n\t\t// \ttlbi_op = \"vmalls12e1is\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b000 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"ipas2e1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b001)\n\t\t// \ttlbi_op = \"ipas2e1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b010 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2e1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b011 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2e1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b100 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"ipas2le1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b101)\n\t\t// \ttlbi_op = \"ipas2le1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b110 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2le1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0100 && op2 == 0b111 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"ripas2le1os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0101 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae2os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0101 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale2os\";\n\t\t// else if (op1 == 0b100 && crm == 0b0110 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae2\";\n\t\t// else if (op1 == 0b100 && crm == 0b0110 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale2\";\n\t\t// else if (op1 == 0b100 && crm == 0b0111 && op2 == 0b000)\n\t\t// \ttlbi_op = \"alle2\";\n\t\t// else if (op1 == 0b100 && crm == 0b0111 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae2\";\n\t\t// else if (op1 == 0b100 && crm == 0b0111 && op2 == 0b100)\n\t\t// \ttlbi_op = \"alle1\";\n\t\t// else if (op1 == 0b100 && crm == 0b0111 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale2\";\n\t\t// else if (op1 == 0b100 && crm == 0b0111 && op2 == 0b110)\n\t\t// \ttlbi_op = \"vmalls12e1\";\n\t\t// else if (op1 == 0b110 && crm == 0b0001 && op2 == 0b000 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"alle3os\";\n\t\t// else if (op1 == 0b110 && crm == 0b0001 && op2 == 0b001 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vae3os\";\n\t\t// else if (op1 == 0b110 && crm == 0b0001 && op2 == 0b101 && HaveTLBIOS())\n\t\t// \ttlbi_op = \"vale3os\";\n\t\t// else if (op1 == 0b110 && crm == 0b0010 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae3is\";\n\t\t// else if (op1 == 0b110 && crm == 0b0010 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale3is\";\n\t\t// else if (op1 == 0b110 && crm == 0b0011 && op2 == 0b000)\n\t\t// \ttlbi_op = \"alle3is\";\n\t\t// else if (op1 == 0b110 && crm == 0b0011 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae3is\";\n\t\t// else if (op1 == 0b110 && crm == 0b0011 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale3is\";\n\t\t// else if (op1 == 0b110 && crm == 0b0101 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae3os\";\n\t\t// else if (op1 == 0b110 && crm == 0b0101 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale3os\";\n\t\t// else if (op1 == 0b110 && crm == 0b0110 && op2 == 0b001 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvae3\";\n\t\t// else if (op1 == 0b110 && crm == 0b0110 && op2 == 0b101 && HaveTLBIRANGE())\n\t\t// \ttlbi_op = \"rvale3\";\n\t\t// else if (op1 == 0b110 && crm == 0b0111 && op2 == 0b000)\n\t\t// \ttlbi_op = \"alle3\";\n\t\t// else if (op1 == 0b110 && crm == 0b0111 && op2 == 0b001)\n\t\t// \ttlbi_op = \"vae3\";\n\t\t// else if (op1 == 0b110 && crm == 0b0111 && op2 == 0b101)\n\t\t// \ttlbi_op = \"vale3\";\n\t\tinstr->operands[i].implspec[OP1] = op1;\n\t\tinstr->operands[i].implspec[CRM] = crm;\n\t\tinstr->operands[i].implspec[OP2] = op2;\n\t\tinstr->operands[i].immediate = TLBI_OP(op1, crn, crm, op2);\n\t\t// NON-SYNTAX: <tlbi_op>{,<Xt>}\n\t\tADD_OPERAND_NAME(tlbi_op);\n\t\tif (ctx->Rt != 31)\n\t\t{\n\t\t\tADD_OPERAND_XT;\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_DCPS1_DC_EXCEPTION:\n\tcase ENC_DCPS2_DC_EXCEPTION:\n\tcase ENC_DCPS3_DC_EXCEPTION:\n\t{\n\t\tuint64_t imm = ctx->imm16;\n\t\t// NON-SYNTAX: #<imm>\n\t\tif (imm)\n\t\t{\n\t\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase ENC_CLREX_BN_BARRIERS:\n\t{\n\t\tunsigned imm = ctx->CRm;\n\t\t// NON-SYNTAX: #<imm>\n\t\tif (imm != 15)\n\t\t{\n\t\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BFCVTN_ASIMDMISC_4S:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec arr_spec_4s = _4S;\n\t\t// {2}<Vd>.<Ta>,<Vn>.4S\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, arr_spec_4s)\n\t\tbreak;\n\t}\n\tcase ENC_SADDW_ASIMDDIFF_W:\n\tcase ENC_SSUBW_ASIMDDIFF_W:\n\tcase ENC_UADDW_ASIMDDIFF_W:\n\tcase ENC_USUBW_ASIMDDIFF_W:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Ta>,<Vm>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->m, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTL_ASIMDMISC_L:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_4s_2d[ctx->sz];\n\t\tArrangementSpec Tb = table_4h_8h_2s_4s_1d_2d_r_r[(ctx->sz << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_SXTL_SSHLL_ASIMDSHF_L:\n\tcase ENC_UXTL_USHLL_ASIMDSHF_L:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = arr_spec_method2(ctx->immh);\n\t\tArrangementSpec Tb = arr_spec_method3(ctx->immh, ctx->Q);\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_SHLL_ASIMDMISC_S:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>, #<shift>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_SSHLL_ASIMDSHF_L:\n\tcase ENC_USHLL_ASIMDSHF_L:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = arr_spec_method2(ctx->immh);\n\t\tArrangementSpec Tb = arr_spec_method3(ctx->immh, ctx->Q);\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>, #<shift>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_PMULL_ASIMDDIFF_L:\n\tcase ENC_SABAL_ASIMDDIFF_L:\n\tcase ENC_SABDL_ASIMDDIFF_L:\n\tcase ENC_SADDL_ASIMDDIFF_L:\n\tcase ENC_SMLAL_ASIMDDIFF_L:\n\tcase ENC_SMLSL_ASIMDDIFF_L:\n\tcase ENC_SMULL_ASIMDDIFF_L:\n\tcase ENC_SQDMLAL_ASIMDDIFF_L:\n\tcase ENC_SQDMLSL_ASIMDDIFF_L:\n\tcase ENC_SQDMULL_ASIMDDIFF_L:\n\tcase ENC_SSUBL_ASIMDDIFF_L:\n\tcase ENC_UABAL_ASIMDDIFF_L:\n\tcase ENC_UABDL_ASIMDDIFF_L:\n\tcase ENC_UADDL_ASIMDDIFF_L:\n\tcase ENC_UMLAL_ASIMDDIFF_L:\n\tcase ENC_UMLSL_ASIMDDIFF_L:\n\tcase ENC_UMULL_ASIMDDIFF_L:\n\tcase ENC_USUBL_ASIMDDIFF_L:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>,<Vm>.<Tb>\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->m, Tb);\n\t\tbreak;\n\t}\n\tcase ENC_SMLAL_ASIMDELEM_L:\n\tcase ENC_SMLSL_ASIMDELEM_L:\n\tcase ENC_SMULL_ASIMDELEM_L:\n\tcase ENC_SQDMLAL_ASIMDELEM_L:\n\tcase ENC_SQDMLSL_ASIMDELEM_L:\n\tcase ENC_SQDMULL_ASIMDELEM_L:\n\tcase ENC_UMLAL_ASIMDELEM_L:\n\tcase ENC_UMLSL_ASIMDELEM_L:\n\tcase ENC_UMULL_ASIMDELEM_L:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tArrangementSpec arr_spec = table_r_h_s_d[ctx->size];\n\t\t// {2}<Vd>.<Ta>,<Vn>.<Tb>,<Vm>.<T>[<index>]\n\t\tADD_OPERAND_VREG_T(ctx->d, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->n, Tb);\n\t\tADD_OPERAND_VREG_T_LANE(ctx->m, arr_spec, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_FCVTN_ASIMDMISC_N:\n\tcase ENC_FCVTXN_ASIMDMISC_N:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_4s_2d[ctx->sz];\n\t\tArrangementSpec Tb = table_4h_8h_2s_4s_1d_2d_r_r[(ctx->sz << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Tb>,<Vn>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->n, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_SQXTN_ASIMDMISC_N:\n\tcase ENC_SQXTUN_ASIMDMISC_N:\n\tcase ENC_UQXTN_ASIMDMISC_N:\n\tcase ENC_XTN_ASIMDMISC_N:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Tb>,<Vn>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->n, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_RSHRN_ASIMDSHF_N:\n\tcase ENC_SHRN_ASIMDSHF_N:\n\tcase ENC_SQRSHRN_ASIMDSHF_N:\n\tcase ENC_SQRSHRUN_ASIMDSHF_N:\n\tcase ENC_SQSHRN_ASIMDSHF_N:\n\tcase ENC_SQSHRUN_ASIMDSHF_N:\n\tcase ENC_UQRSHRN_ASIMDSHF_N:\n\tcase ENC_UQSHRN_ASIMDSHF_N:\n\t{\n\t\tunsigned shift = ctx->shift;\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = arr_spec_method2(ctx->immh);\n\t\tArrangementSpec Tb = arr_spec_method3(ctx->immh, ctx->Q);\n\t\t// {2}<Vd>.<Tb>,<Vn>.<Ta>, #<shift>\n\t\tADD_OPERAND_VREG_T(ctx->d, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->n, Ta);\n\t\tADD_OPERAND_IMM32(shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ADDHN_ASIMDDIFF_N:\n\tcase ENC_RADDHN_ASIMDDIFF_N:\n\tcase ENC_RSUBHN_ASIMDDIFF_N:\n\tcase ENC_SUBHN_ASIMDDIFF_N:\n\t{\n\t\tif (ctx->Q)\n\t\t\tinstr->operation = enc_to_oper2(instr->encoding);\n\t\tArrangementSpec Ta = table_8h_4s_2d_1q[ctx->size];\n\t\tArrangementSpec Tb = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {2}<Vd>.<Tb>,<Vn>.<Ta>,<Vm>.<Ta>\n\t\tADD_OPERAND_VREG_T(ctx->d, Tb);\n\t\tADD_OPERAND_VREG_T(ctx->n, Ta);\n\t\tADD_OPERAND_VREG_T(ctx->m, Ta);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSE_R4_4V:\n\tcase ENC_LD4R_ASISDLSO_R4:\n\tcase ENC_LD4_ASISDLSE_R4:\n\tcase ENC_ST1_ASISDLSE_R4_4V:\n\tcase ENC_ST4_ASISDLSE_R4:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>,<Vt4>.<T>}, [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_4(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_R4_R4:\n\tcase ENC_LD4R_ASISDLSOP_RX4_R:\n\tcase ENC_LD4_ASISDLSEP_R4_R:\n\tcase ENC_ST1_ASISDLSEP_R4_R4:\n\tcase ENC_ST4_ASISDLSEP_R4_R:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>,<Vt4>.<T>}, [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_4(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_I4_I4:\n\tcase ENC_LD4R_ASISDLSOP_R4_I:\n\tcase ENC_LD4_ASISDLSEP_I4_I:\n\tcase ENC_ST1_ASISDLSEP_I4_I4:  // four registers, immediate offset (Rm == 11111 && opcode == 0010)\n\tcase ENC_ST4_ASISDLSEP_I4_I:\n\t{\n\t\tunsigned imm;\n\t\tif (instr->encoding == ENC_LD4R_ASISDLSOP_R4_I)\n\t\t\timm = 4 << (ctx->size);\n\t\telse\n\t\t\timm = ctx->Q ? 64 : 32;\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>,<Vt4>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_4(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSE_R3_3V:\n\tcase ENC_LD3R_ASISDLSO_R3:\n\tcase ENC_LD3_ASISDLSE_R3:\n\tcase ENC_ST1_ASISDLSE_R3_3V:\n\tcase ENC_ST3_ASISDLSE_R3:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>}, [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_R3_R3:\n\tcase ENC_LD3R_ASISDLSOP_RX3_R:\n\tcase ENC_LD3_ASISDLSEP_R3_R:\n\tcase ENC_ST1_ASISDLSEP_R3_R3:\n\tcase ENC_ST3_ASISDLSEP_R3_R:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>}, [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_I3_I3:\n\tcase ENC_ST1_ASISDLSEP_I3_I3:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tunsigned imm = ctx->Q ? 48 : 24;\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSEP_I3_I:\n\tcase ENC_ST3_ASISDLSEP_I3_I:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tunsigned imm = ctx->Q ? 48 : 24;\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\n\tcase ENC_LD3R_ASISDLSOP_R3_I:\n\t{\n\t\tuint32_t imm = 3 << ctx->size;\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>,<Vt3>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_3(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\n\tcase ENC_LD1_ASISDLSE_R2_2V:\n\tcase ENC_LD2R_ASISDLSO_R2:\n\tcase ENC_LD2_ASISDLSE_R2:\n\tcase ENC_ST1_ASISDLSE_R2_2V:\n\tcase ENC_ST2_ASISDLSE_R2:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>}, [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_2(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_R2_R2:\n\tcase ENC_LD2R_ASISDLSOP_RX2_R:\n\tcase ENC_LD2_ASISDLSEP_R2_R:\n\tcase ENC_ST1_ASISDLSEP_R2_R2:\n\tcase ENC_ST2_ASISDLSEP_R2_R:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>}, [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_2(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2R_ASISDLSOP_R2_I:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\tunsigned imm = 2 << ctx->size;\n\t\t// {<Vt>.<T>,<Vt2>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_2(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_I2_I2:\n\tcase ENC_LD2_ASISDLSEP_I2_I:\n\tcase ENC_ST1_ASISDLSEP_I2_I2:\n\tcase ENC_ST2_ASISDLSEP_I2_I:\n\t{\n\t\tunsigned imm = ctx->Q ? 32 : 16;\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>,<Vt2>.<T>}, [<Xn|SP>], #<imm>\n\t\tADD_OPERAND_MULTIREG_2(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1R_ASISDLSO_R1:\n\tcase ENC_LD1_ASISDLSE_R1_1V:\n\tcase ENC_ST1_ASISDLSE_R1_1V:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>}, [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_1(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1R_ASISDLSOP_RX1_R:\n\tcase ENC_LD1_ASISDLSEP_R1_R1:\n\tcase ENC_ST1_ASISDLSEP_R1_R1:\n\t{\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>}, [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_1(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1R_ASISDLSOP_R1_I:\n\t{\n\t\tunsigned imm = 1 << ctx->size;\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>}, [<Xn|SP>],#<imm>\n\t\tADD_OPERAND_MULTIREG_1(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSEP_I1_I1:  // one register, immediate offset\n\tcase ENC_ST1_ASISDLSEP_I1_I1:\n\t{\n\t\tunsigned imm = ctx->Q ? 16 : 8;\n\t\tArrangementSpec arr_spec = table_8b_16b_4h_8h_2s_4s_1d_2d[(ctx->size << 1) | ctx->Q];\n\t\t// {<Vt>.<T>}, [<Xn|SP>],<imm>\n\t\tADD_OPERAND_MULTIREG_1(REG_V_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSO_B4_4B:\n\tcase ENC_ST4_ASISDLSO_B4_4B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B,<Vt4>.B}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_B4_I4B:\n\tcase ENC_ST4_ASISDLSOP_B4_I4B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B,<Vt4>.B}[<index>], [<Xn|SP>], #4\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 4);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_BX4_R4B:\n\tcase ENC_ST4_ASISDLSOP_BX4_R4B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B,<Vt4>.B}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSO_B3_3B:\n\tcase ENC_ST3_ASISDLSO_B3_3B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_B3_I3B:\n\tcase ENC_ST3_ASISDLSOP_B3_I3B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B}[<index>], [<Xn|SP>], #3\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 3);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_BX3_R3B:\n\tcase ENC_ST3_ASISDLSOP_BX3_R3B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B,<Vt3>.B}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSO_B2_2B:\n\tcase ENC_ST2_ASISDLSO_B2_2B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_B2_I2B:\n\tcase ENC_ST2_ASISDLSOP_B2_I2B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B}[<index>], [<Xn|SP>], #2\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 2);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_BX2_R2B:\n\tcase ENC_ST2_ASISDLSOP_BX2_R2B:\n\t{\n\t\t// {<Vt>.B,<Vt2>.B}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSO_B1_1B:\n\tcase ENC_ST1_ASISDLSO_B1_1B:\n\t{\n\t\t// {<Vt>.B}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_B1_I1B:\n\tcase ENC_ST1_ASISDLSOP_B1_I1B:\n\t{\n\t\t// {<Vt>.B}[<index>], [<Xn|SP>], #1\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_BX1_R1B:\n\tcase ENC_ST1_ASISDLSOP_BX1_R1B:\n\t{\n\t\t// {<Vt>.B}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSO_D4_4D:\n\tcase ENC_ST4_ASISDLSO_D4_4D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D,<Vt4>.D}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_D4_I4D:\n\tcase ENC_ST4_ASISDLSOP_D4_I4D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D,<Vt4>.D}[<index>], [<Xn|SP>], #32\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 32);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_DX4_R4D:\n\tcase ENC_ST4_ASISDLSOP_DX4_R4D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D,<Vt4>.D}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSO_D3_3D:\n\tcase ENC_ST3_ASISDLSO_D3_3D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_D3_I3D:\n\tcase ENC_ST3_ASISDLSOP_D3_I3D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D}[<index>], [<Xn|SP>], #24\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 24);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_DX3_R3D:\n\tcase ENC_ST3_ASISDLSOP_DX3_R3D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D,<Vt3>.D}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSO_D2_2D:\n\tcase ENC_ST2_ASISDLSO_D2_2D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_D2_I2D:\n\tcase ENC_ST2_ASISDLSOP_D2_I2D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D}[<index>], [<Xn|SP>], #16\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 16);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_DX2_R2D:\n\tcase ENC_ST2_ASISDLSOP_DX2_R2D:\n\t{\n\t\t// {<Vt>.D,<Vt2>.D}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSO_D1_1D:\n\tcase ENC_ST1_ASISDLSO_D1_1D:\n\t{\n\t\t// {<Vt>.D}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_D1_I1D:\n\tcase ENC_ST1_ASISDLSOP_D1_I1D:\n\t{\n\t\t// {<Vt>.D}[<index>], [<Xn|SP>], #8\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 8);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_DX1_R1D:\n\tcase ENC_ST1_ASISDLSOP_DX1_R1D:\n\t{\n\t\t// {<Vt>.D}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSO_H4_4H:\n\tcase ENC_ST4_ASISDLSO_H4_4H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H,<Vt4>.H}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_H4_I4H:\n\tcase ENC_ST4_ASISDLSOP_H4_I4H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H,<Vt4>.H}[<index>], [<Xn|SP>], #8\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 8);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_HX4_R4H:\n\tcase ENC_ST4_ASISDLSOP_HX4_R4H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H,<Vt4>.H}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSO_H3_3H:\n\tcase ENC_ST3_ASISDLSO_H3_3H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_H3_I3H:\n\tcase ENC_ST3_ASISDLSOP_H3_I3H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H}[<index>], [<Xn|SP>], #6\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tADD_OPERAND_IMM32(6, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_HX3_R3H:\n\tcase ENC_ST3_ASISDLSOP_HX3_R3H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H,<Vt3>.H}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSO_H2_2H:\n\tcase ENC_ST2_ASISDLSO_H2_2H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_H2_I2H:\n\tcase ENC_ST2_ASISDLSOP_H2_I2H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H}[<index>], [<Xn|SP>], #4\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 4);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_HX2_R2H:\n\tcase ENC_ST2_ASISDLSOP_HX2_R2H:\n\t{\n\t\t// {<Vt>.H,<Vt2>.H}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSO_H1_1H:\n\tcase ENC_ST1_ASISDLSO_H1_1H:\n\t{\n\t\t// {<Vt>.H}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_H1_I1H:\n\tcase ENC_ST1_ASISDLSOP_H1_I1H:\n\t{\n\t\t// {<Vt>.H}[<index>], [<Xn|SP>], #2\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 2);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_HX1_R1H:\n\tcase ENC_ST1_ASISDLSOP_HX1_R1H:\n\t{\n\t\t// {<Vt>.H}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSO_S4_4S:\n\tcase ENC_ST4_ASISDLSO_S4_4S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S,<Vt4>.S}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_S4_I4S:\n\tcase ENC_ST4_ASISDLSOP_S4_I4S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S,<Vt4>.S}[<index>], [<Xn|SP>], #16\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 16);\n\t\tbreak;\n\t}\n\tcase ENC_LD4_ASISDLSOP_SX4_R4S:\n\tcase ENC_ST4_ASISDLSOP_SX4_R4S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S,<Vt4>.S}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_4_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSO_S3_3S:\n\tcase ENC_ST3_ASISDLSO_S3_3S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_S3_I3S:\n\tcase ENC_ST3_ASISDLSOP_S3_I3S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S}[<index>], [<Xn|SP>], #12\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 12);\n\t\tbreak;\n\t}\n\tcase ENC_LD3_ASISDLSOP_SX3_R3S:\n\tcase ENC_ST3_ASISDLSOP_SX3_R3S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S,<Vt3>.S}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_3_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSO_S2_2S:\n\tcase ENC_ST2_ASISDLSO_S2_2S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_S2_I2S:\n\tcase ENC_ST2_ASISDLSOP_S2_I2S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S}[<index>], [<Xn|SP>], #8\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 8);\n\t\tbreak;\n\t}\n\tcase ENC_LD2_ASISDLSOP_SX2_R2S:\n\tcase ENC_ST2_ASISDLSOP_SX2_R2S:\n\t{\n\t\t// {<Vt>.S,<Vt2>.S}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_2_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSO_S1_1S:\n\tcase ENC_ST1_ASISDLSO_S1_1S:\n\t{\n\t\t// {<Vt>.S}[<index>], [<Xn|SP>]\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_XN_SP;\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_S1_I1S:\n\tcase ENC_ST1_ASISDLSOP_S1_I1S:\n\t{\n\t\t// {<Vt>.S}[<index>], [<Xn|SP>], #4\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX(REGSET_SP, REG_X_BASE, ctx->n, 4);\n\t\tbreak;\n\t}\n\tcase ENC_LD1_ASISDLSOP_SX1_R1S:\n\tcase ENC_ST1_ASISDLSOP_SX1_R1S:\n\t{\n\t\t// {<Vt>.S}[<index>], [<Xn|SP>],<Xm>\n\t\tADD_OPERAND_MULTIREG_1_LANE(REG_V_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_MEM_POST_INDEX_REG(REGSET_SP, REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_RET_64R_BRANCH_REG:\n\t{\n\t\t// NON-SYNTAX: {<Xn>}\n\t\tif (ctx->Rn != 30)\n\t\t{\n\t\t\tADD_OPERAND_XN\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ST4B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B,<Zt4>.B},<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_ST4B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B,<Zt4>.B},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD4B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B,<Zt4>.B},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD4B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B,<Zt4>.B},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST3B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B},<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_ST3B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD3B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD3B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B,<Zt3>.B},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST2B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B},<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_ST2B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD2B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.B,<Zt2>.B},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD2B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.B,<Zt2>.B},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST4D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D,<Zt4>.D},<Pg>, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, _1Q, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST4D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D,<Zt4>.D},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD4D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D,<Zt4>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD4D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D,<Zt4>.D},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST3D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D},<Pg>, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST3D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD3D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD3D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D,<Zt3>.D},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST2D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D},<Pg>, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST2D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD2D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.D,<Zt2>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD2D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.D,<Zt2>.D},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST4H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H,<Zt4>.H},<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST4H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H,<Zt4>.H},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD4H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H,<Zt4>.H},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD4H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H,<Zt4>.H},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST3H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H},<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST3H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD3H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD3H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H,<Zt3>.H},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST2H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H},<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST2H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD2H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.H,<Zt2>.H},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD2H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.H,<Zt2>.H},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST4W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S,<Zt4>.S},<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST4W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S,<Zt4>.S},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD4W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S,<Zt4>.S},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD4W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 4 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S,<Zt4>.S},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_4(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST3W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S},<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST3W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD3W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD3W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 3 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S,<Zt3>.S},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_3(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST2W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S},<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST2W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD2W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt1>.S,<Zt2>.S},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD2W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = 2 * ctx->offset;\n\t\t// {<Zt1>.S,<Zt2>.S},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST1H_Z_P_BR_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// {<Zt>.<T>},<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1W_Z_P_BR_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// {<Zt>.<T>},<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_BR_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// {<Zt>.<T>},<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_BI_:\n\tcase ENC_ST1H_Z_P_BI_:\n\tcase ENC_ST1W_Z_P_BI_:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->size];\n\t\t// {<Zt>.<T>},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, arr_spec, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.B},<Pg>, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.B},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BR_U8:\n\tcase ENC_LD1RQB_Z_P_BR_CONTIGUOUS:\n\tcase ENC_LDNT1B_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.B},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BI_U8:\n\tcase ENC_LDNF1B_Z_P_BI_U8:\n\tcase ENC_LDNT1B_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.B},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1RB_Z_P_BI_U8:\n\tcase ENC_LD1RQB_Z_P_BI_U8:\n\tcase ENC_LD1ROB_Z_P_BI_U8:\n\t{\n\t\tsigned imm = (instr->encoding == ENC_LD1RQB_Z_P_BI_U8) ? 16 * (ctx->offset) : ctx->offset;\n\t\t// {<Zt>.B},<Pg>/Z, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1B_Z_P_BR_U8:\n\tcase ENC_LD1ROB_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.B},<Pg>/Z, [<Xn|SP>{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1B, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1B_Z_P_BR_U16:\n\tcase ENC_LDFF1SB_Z_P_BR_S16:\n\t{\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1B_Z_P_BR_U32:\n\tcase ENC_LDFF1SB_Z_P_BR_S32:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1B_Z_P_BR_U64:\n\tcase ENC_LDFF1SB_Z_P_BR_S64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Zn>.S{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_X_BASE, ctx->m, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_LDNT1B_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1D_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1H_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_LDNT1W_Z_P_AR_D_64_UNSCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Zn>.D{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_X_BASE, ctx->m, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1B_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_STNT1H_Z_P_AR_S_X32_UNSCALED:\n\tcase ENC_STNT1W_Z_P_AR_S_X32_UNSCALED:\n\t{\n\t\t// {<Zt>.S},<Pg>, [<Zn>.S{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_X_BASE, ctx->m, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1B_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_STNT1D_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_STNT1H_Z_P_AR_D_64_UNSCALED:\n\tcase ENC_STNT1W_Z_P_AR_D_64_UNSCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Zn>.D{,<Xm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_Z_BASE, ctx->n, REG_X_BASE, ctx->m, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_ST1D_Z_P_BR_:\n\tcase ENC_STNT1D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1H_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1W_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1D_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D, LSL #3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1H_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D,<mod>#1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1W_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D,<mod>#2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1D_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D,<mod>#3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_ST1D_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_ST1H_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_ST1W_Z_P_BZ_D_X32_UNSCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D,<mod>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_ST1D_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_ST1H_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_ST1W_Z_P_BZ_D_64_UNSCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>,<Zm>.D]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_X_BASE, ctx->n, REG_Z_BASE, ctx->m, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_ST1D_Z_P_BI_:\n\tcase ENC_STNT1D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.D},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST1H_Z_P_AI_D:\n\tcase ENC_ST1B_Z_P_AI_D:\n\tcase ENC_ST1D_Z_P_AI_D:\n\tcase ENC_ST1W_Z_P_AI_D:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_ST1H_Z_P_AI_D:\n\t\t\timm *= 2;\n\t\t\tbreak;\n\t\tcase ENC_ST1W_Z_P_AI_D:\n\t\t\timm *= 4;\n\t\t\tbreak;\n\t\tcase ENC_ST1D_Z_P_AI_D:\n\t\t\timm *= 8;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\t// {<Zt>.D},<Pg>, [<Zn>.D{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1D);\n\t\tbreak;\n\t}\n\n\tcase ENC_ST1B_ZA_P_RRR_: // ST1B {  ZA0<HV>.B[<Ws>, #<imm>]}, <Pg>,   [<Xn|SP>{,<Xm>}]\n\tcase ENC_ST1H_ZA_P_RRR_: // ST1H {<ZAt><HV>.H[<Ws>, #<imm>]}, <Pg>,   [<Xn|SP>{,<Xm>, LSL #1}]\n\tcase ENC_ST1W_ZA_P_RRR_: // ST1W {<ZAt><HV>.S[<Ws>, #<imm>]}, <Pg>,   [<Xn|SP>{,<Xm>, LSL #2}]\n\tcase ENC_ST1D_ZA_P_RRR_: // ST1D {<ZAt><HV>.D[<Ws>, #<imm>]}, <Pg>,   [<Xn|SP>{,<Xm>, LSL #3}]\n\tcase ENC_ST1Q_ZA_P_RRR_: // ST1Q {<ZAt><HV>.Q[<Ws>]        }, <Pg>,   [<Xn|SP>{,<Xm>, LSL #4}]\n\tcase ENC_LD1B_ZA_P_RRR_: // LD1B {  ZA0<HV>.B[<Ws>, #<imm>]}, <Pg>/Z, [<Xn|SP>{,<Xm>}]\n\tcase ENC_LD1H_ZA_P_RRR_: // LD1H {<ZAt><HV>.H[<Ws>, #<imm>]}, <Pg>/Z, [<Xn|SP>{,<Xm>, LSL #1}]\n\tcase ENC_LD1W_ZA_P_RRR_: // LD1W {<ZAt><HV>.S[<Ws>, #<imm>]}, <Pg>/Z, [<Xn|SP>{,<Xm>, LSL #2}]\n\tcase ENC_LD1D_ZA_P_RRR_: // LD1D {<ZAt><HV>.D[<Ws>, #<imm>]}, <Pg>/Z, [<Xn|SP>{,<Xm>, LSL #3}]\n\tcase ENC_LD1Q_ZA_P_RRR_: // LD1Q {<ZAt><HV>.Q[<Ws>]        }, <Pg>/Z, [<Xn|SP>{,<Xm>, LSL #4}]\n\t{\n\t\tint shamt = 0;\n\t\tchar qual = 0;\n\t\tArrangementSpec as = ARRSPEC_NONE;\n\t\tswitch(instr->encoding) {\n\t\t\tcase ENC_ST1B_ZA_P_RRR_: as=_1B; shamt=0; break;\n\t\t\tcase ENC_LD1B_ZA_P_RRR_: as=_1B; shamt=0; qual='z'; break;\n\t\t\tcase ENC_ST1H_ZA_P_RRR_: as=_1H; shamt=1; break;\n\t\t\tcase ENC_LD1H_ZA_P_RRR_: as=_1H; shamt=1; qual='z'; break;\n\t\t\tcase ENC_ST1W_ZA_P_RRR_: as=_1S; shamt=2; break;\n\t\t\tcase ENC_LD1W_ZA_P_RRR_: as=_1S; shamt=2; qual='z'; break;\n\t\t\tcase ENC_ST1D_ZA_P_RRR_: as=_1D; shamt=3; break;\n\t\t\tcase ENC_LD1D_ZA_P_RRR_: as=_1D; shamt=3; qual='z'; break;\n\t\t\tcase ENC_ST1Q_ZA_P_RRR_: as=_1Q; shamt=4; break;\n\t\t\tcase ENC_LD1Q_ZA_P_RRR_: as=_1Q; shamt=4; qual='z'; break;\n\t\t\tdefault: break;\n\t\t}\n\n\t\tADD_OPERAND_SME_TILE(0, ctx->vertical, as, REG_W0+12+ctx->Rs, ctx->imm);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, qual);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0,\n\t\t    REG_X_BASE, ctx->m, 0,\n\t\t    shamt ? ShiftType_LSL : ShiftType_NONE, shamt, 1\n\t\t);\t\t\n\t\tbreak;\n\t}\n\n\tcase ENC_LD1H_Z_P_BR_U64:\n\tcase ENC_LD1SH_Z_P_BR_S64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1SW_Z_P_BR_S64:\n\tcase ENC_LD1W_Z_P_BR_U64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1D_Z_P_BR_U64:\n\tcase ENC_LD1RQD_Z_P_BR_CONTIGUOUS:\n\tcase ENC_LDNT1D_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BR_U64:\n\tcase ENC_LD1SB_Z_P_BR_S64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1H_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LD1SH_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1SW_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LD1W_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LDFF1SW_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1D_Z_P_BZ_D_64_SCALED:\n\tcase ENC_LDFF1D_Z_P_BZ_D_64_SCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D, LSL #3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1H_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LD1SH_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D,<mod>#1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1SW_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LD1W_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D,<mod>#2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1D_Z_P_BZ_D_X32_SCALED:\n\tcase ENC_LDFF1D_Z_P_BZ_D_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D,<mod>#3]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1D_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1H_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LD1W_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D,<mod>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1D, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1D_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1H_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1SB_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1SH_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1SW_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LD1W_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>,<Zm>.D]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T(REG_X_BASE, ctx->n, REG_Z_BASE, ctx->m, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BI_U64:\n\tcase ENC_LD1D_Z_P_BI_U64:\n\tcase ENC_LD1H_Z_P_BI_U64:\n\tcase ENC_LD1SB_Z_P_BI_S64:\n\tcase ENC_LD1SH_Z_P_BI_S64:\n\tcase ENC_LD1SW_Z_P_BI_S64:\n\tcase ENC_LD1W_Z_P_BI_U64:\n\tcase ENC_LDNF1B_Z_P_BI_U64:\n\tcase ENC_LDNF1D_Z_P_BI_U64:\n\tcase ENC_LDNF1H_Z_P_BI_U64:\n\tcase ENC_LDNF1SB_Z_P_BI_S64:\n\tcase ENC_LDNF1SH_Z_P_BI_S64:\n\tcase ENC_LDNF1SW_Z_P_BI_S64:\n\tcase ENC_LDNF1W_Z_P_BI_U64:\n\tcase ENC_LDNT1D_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1RB_Z_P_BI_U64:\n\tcase ENC_LD1RD_Z_P_BI_U64:\n\tcase ENC_LD1RH_Z_P_BI_U64:\n\tcase ENC_LD1RQD_Z_P_BI_U64:\n\tcase ENC_LD1RSB_Z_P_BI_S64:\n\tcase ENC_LD1RSH_Z_P_BI_S64:\n\tcase ENC_LD1RW_Z_P_BI_U64:\n\tcase ENC_LD1RSW_Z_P_BI_S64:\n\tcase ENC_LD1ROD_Z_P_BI_U64:\n\t{\n\t\tsigned imm;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_LD1RB_Z_P_BI_U64:\n\t\tcase ENC_LD1ROD_Z_P_BI_U64:\n\t\tcase ENC_LD1RSB_Z_P_BI_S64:\n\t\t\timm = ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1RH_Z_P_BI_U64:\n\t\tcase ENC_LD1RSH_Z_P_BI_S64:\n\t\t\timm = 2 * ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1RSW_Z_P_BI_S64:\n\t\tcase ENC_LD1RW_Z_P_BI_U64:\n\t\t\timm = 4 * ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1RD_Z_P_BI_U64:\n\t\t\timm = 8 * ctx->offset;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timm = 16 * ctx->offset;\n\t\t\tbreak;\n\t\t}\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1H_Z_P_BR_U64:\n\tcase ENC_LDFF1SH_Z_P_BR_S64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #1}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1SW_Z_P_BR_S64:\n\tcase ENC_LDFF1W_Z_P_BR_U64:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #2}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1D_Z_P_BR_U64:\n\tcase ENC_LD1ROD_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.D},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #3}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 3, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_AI_D:\n\tcase ENC_LD1SB_Z_P_AI_D:\n\tcase ENC_LDFF1B_Z_P_AI_D:\n\tcase ENC_LDFF1SB_Z_P_AI_D:\n\tcase ENC_LD1H_Z_P_AI_D:\n\tcase ENC_LD1SH_Z_P_AI_D:\n\tcase ENC_LDFF1H_Z_P_AI_D:\n\tcase ENC_LDFF1SH_Z_P_AI_D:\n\tcase ENC_LD1W_Z_P_AI_D:\n\tcase ENC_LD1SW_Z_P_AI_D:\n\tcase ENC_LDFF1W_Z_P_AI_D:\n\tcase ENC_LDFF1SW_Z_P_AI_D:\n\tcase ENC_LD1D_Z_P_AI_D:\n\tcase ENC_LDFF1D_Z_P_AI_D:\n\t{\n\t\tunsigned imm;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_LD1H_Z_P_AI_D:\n\t\tcase ENC_LD1SH_Z_P_AI_D:\n\t\tcase ENC_LDFF1H_Z_P_AI_D:\n\t\tcase ENC_LDFF1SH_Z_P_AI_D:\n\t\t\timm = 2 * ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1W_Z_P_AI_D:\n\t\tcase ENC_LD1SW_Z_P_AI_D:\n\t\tcase ENC_LDFF1W_Z_P_AI_D:\n\t\tcase ENC_LDFF1SW_Z_P_AI_D:\n\t\t\timm = 4 * ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1D_Z_P_AI_D:\n\t\tcase ENC_LDFF1D_Z_P_AI_D:\n\t\t\timm = 8 * ctx->offset;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timm = 1 * ctx->offset;\n\t\t}\n\t\t// {<Zt>.D},<Pg>/Z, [<Zn>.D{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1D, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1D);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.H},<Pg>, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.H},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1H_Z_P_BR_U16:\n\tcase ENC_LD1RQH_Z_P_BR_CONTIGUOUS:\n\tcase ENC_LDNT1H_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BR_U16:\n\tcase ENC_LD1SB_Z_P_BR_S16:\n\t{\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BI_U16:\n\tcase ENC_LD1H_Z_P_BI_U16:\n\tcase ENC_LD1SB_Z_P_BI_S16:\n\tcase ENC_LDNF1B_Z_P_BI_U16:\n\tcase ENC_LDNF1H_Z_P_BI_U16:\n\tcase ENC_LDNF1SB_Z_P_BI_S16:\n\tcase ENC_LDNT1H_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1RB_Z_P_BI_U16:\n\tcase ENC_LD1RH_Z_P_BI_U16:\n\tcase ENC_LD1RQH_Z_P_BI_U16:\n\tcase ENC_LD1RSB_Z_P_BI_S16:\n\tcase ENC_LD1ROH_Z_P_BI_U16:\n\t{\n\t\tsigned imm;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_LD1RH_Z_P_BI_U16:\n\t\t\timm = 2 * ctx->offset;\n\t\t\tbreak;\n\t\tcase ENC_LD1RQH_Z_P_BI_U16:\n\t\t\timm = 16 * ctx->offset;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timm = ctx->offset;\n\t\t\tbreak;\n\t\t}\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1H_Z_P_BR_U16:\n\tcase ENC_LD1ROH_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.H},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #1}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1H, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1W_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.S},<Pg>, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1H_Z_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>, [<Xn|SP>,<Zm>.S,<mod>#1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1W_Z_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>, [<Xn|SP>,<Zm>.S,<mod>#2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_ST1H_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_ST1W_Z_P_BZ_S_X32_UNSCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>, [<Xn|SP>,<Zm>.S,<mod>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_STNT1W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.S},<Pg>, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_ST1B_Z_P_AI_S:\n\tcase ENC_ST1H_Z_P_AI_S:\n\tcase ENC_ST1W_Z_P_AI_S:\n\t{\n\t\tuint64_t imm = ctx->offset;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_ST1H_Z_P_AI_S:\n\t\t\timm *= 2;\n\t\t\tbreak;\n\t\tcase ENC_ST1W_Z_P_AI_S:\n\t\t\timm *= 4;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timm *= 1;\n\t\t\tbreak;\n\t\t}\n\t\t// {<Zt>.S},<Pg>, [<Zn>.S{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_LD1H_Z_P_BR_U32:\n\tcase ENC_LD1SH_Z_P_BR_S32:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1W_Z_P_BR_U32:\n\tcase ENC_LDNT1W_Z_P_BR_CONTIGUOUS:\n\tcase ENC_LD1RQW_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Xm>, LSL #2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BR_U32:\n\tcase ENC_LD1SB_Z_P_BR_S32:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Xm>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED(REG_X_BASE, ctx->n, ctx->m);\n\t\tbreak;\n\t}\n\tcase ENC_LD1H_Z_P_BZ_S_X32_SCALED:\n\tcase ENC_LD1SH_Z_P_BZ_S_X32_SCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_S_X32_SCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Zm>.S,<mod>#1]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1W_Z_P_BZ_S_X32_SCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_S_X32_SCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Zm>.S,<mod>#2]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LD1H_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LD1W_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED:\n\tcase ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED:\n\t{\n\t\tShiftType mod = ctx->xs == 0 ? ShiftType_UXTW : ShiftType_SXTW;\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>,<Zm>.S,<mod>]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(REG_X_BASE, ctx->n, 0, REG_Z_BASE, ctx->m, _1S, mod, 0, 0);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_BI_U32:\n\tcase ENC_LD1H_Z_P_BI_U32:\n\tcase ENC_LD1SB_Z_P_BI_S32:\n\tcase ENC_LD1SH_Z_P_BI_S32:\n\tcase ENC_LD1W_Z_P_BI_U32:\n\tcase ENC_LDNF1B_Z_P_BI_U32:\n\tcase ENC_LDNF1H_Z_P_BI_U32:\n\tcase ENC_LDNF1SB_Z_P_BI_S32:\n\tcase ENC_LDNF1SH_Z_P_BI_S32:\n\tcase ENC_LDNF1W_Z_P_BI_U32:\n\tcase ENC_LDNT1W_Z_P_BI_CONTIGUOUS:\n\t{\n\t\tsigned imm = ctx->offset;\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_VL(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LD1RB_Z_P_BI_U32:\n\tcase ENC_LD1RH_Z_P_BI_U32:\n\tcase ENC_LD1RQW_Z_P_BI_U32:\n\tcase ENC_LD1RSB_Z_P_BI_S32:\n\tcase ENC_LD1RSH_Z_P_BI_S32:\n\tcase ENC_LD1RW_Z_P_BI_U32:\n\tcase ENC_LD1ROW_Z_P_BI_U32:\n\t{\n\t\tunsigned factor;\n\t\tswitch (instr->encoding)\n\t\t{\n\t\tcase ENC_LD1RH_Z_P_BI_U32:\n\t\tcase ENC_LD1RSH_Z_P_BI_S32:\n\t\t\tfactor = 2;\n\t\t\tbreak;\n\t\tcase ENC_LD1RW_Z_P_BI_U32:\n\t\t\tfactor = 4;\n\t\t\tbreak;\n\t\tcase ENC_LD1RQW_Z_P_BI_U32:\n\t\t\tfactor = 16;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tfactor = 1;\n\t\t}\n\t\tsigned imm = factor * ctx->offset;\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET(REGSET_SP, REG_X_BASE, ctx->n, imm);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1H_Z_P_BR_U32:\n\tcase ENC_LDFF1SH_Z_P_BR_S32:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #1}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 1, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LDFF1W_Z_P_BR_U32:\n\tcase ENC_LD1ROW_Z_P_BR_CONTIGUOUS:\n\t{\n\t\t// {<Zt>.S},<Pg>/Z, [<Xn|SP>{,<Xm>, LSL #2}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_EXTENDED_T_SHIFT(\n\t\t    REG_X_BASE, ctx->n, 0, REG_X_BASE, ctx->m, 0, ShiftType_LSL, 2, 1);\n\t\tbreak;\n\t}\n\tcase ENC_LD1B_Z_P_AI_S:\n\tcase ENC_LD1H_Z_P_AI_S:\n\tcase ENC_LD1SB_Z_P_AI_S:\n\tcase ENC_LD1SH_Z_P_AI_S:\n\tcase ENC_LD1W_Z_P_AI_S:\n\tcase ENC_LDFF1B_Z_P_AI_S:\n\tcase ENC_LDFF1H_Z_P_AI_S:\n\tcase ENC_LDFF1SB_Z_P_AI_S:\n\tcase ENC_LDFF1SH_Z_P_AI_S:\n\tcase ENC_LDFF1W_Z_P_AI_S:\n\t{\n\t\tunsigned imm = ctx->msize / 8 * ctx->offset;\n\t\t// {<Zt>.S},<Pg>/Z, [<Zn>.S{, #<imm>}]\n\t\tADD_OPERAND_MULTIREG_1(REG_Z_BASE, _1S, ctx->t);\n\t\tADD_OPERAND_PRED_REG_QUAL(ctx->g, 'z');\n\t\tADD_OPERAND_MEM_REG_OFFSET_T(REGSET_ZR, REG_Z_BASE, ctx->n, imm, _1S);\n\t\tbreak;\n\t}\n\tcase ENC_ISB_BI_BARRIERS:\n\t{\n\t\tuint64_t imm = ctx->CRm;\n\t\t// NON-SYNTAX: OPTION_OR_IMMEDIATE\n\t\tif (ctx->CRm != 15)\n\t\t{\n\t\t\tADD_OPERAND_IMM32(imm, 0);\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_BTI_HB_HINTS:\n\t{\n\t\t// NON-SYNTAX: {<targets>}\n\t\tconst char* table_indirection[4] = {NULL, \"c\", \"j\", \"jc\"};\n\t\tconst char* TARGETS = table_indirection[(ctx->op2 >> 1) & 3];\n\t\tif (TARGETS)\n\t\t{\n\t\t\tADD_OPERAND_NAME(TARGETS)\n\t\t}\n\t\tbreak;\n\t}\n\tcase ENC_ADCLB_Z_ZZZ_:\n\tcase ENC_ADCLT_Z_ZZZ_:\n\tcase ENC_SBCLB_Z_ZZZ_:\n\tcase ENC_SBCLT_Z_ZZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_s_d[ctx->sz];\n\t\t// <Zda>.<T>,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->da, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_SABA_Z_ZZZ_:\n\tcase ENC_SQRDMLAH_Z_ZZZ_:\n\tcase ENC_SQRDMLSH_Z_ZZZ_:\n\tcase ENC_UABA_Z_ZZZ_:\n\t{\n\t\tArrangementSpec arr_spec = table_b_h_s_d[ctx->sz];\n\t\t// <Zda>.<T>,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->da, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->n, arr_spec)\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tbreak;\n\t}\n\tcase ENC_CMLA_Z_ZZZ_:\n\tcase ENC_SQRDCMLAH_Z_ZZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.<T>,<Zn>.<T>,<Zm>.<T>,<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_SRSRA_Z_ZI_:\n\tcase ENC_SSRA_Z_ZI_:\n\tcase ENC_URSRA_Z_ZI_:\n\tcase ENC_USRA_Z_ZI_:\n\t{\n\t\tArrangementSpec T = table16_r_b_h_s_d[ctx->tsize];\n\t\t// <Zda>.<T>,<Zn>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_IMM32(ctx->shift, 0);\n\t\tbreak;\n\t}\n\tcase ENC_BDEP_Z_ZZ_:\n\tcase ENC_BEXT_Z_ZZ_:\n\tcase ENC_BGRP_Z_ZZ_:\n\tcase ENC_EORBT_Z_ZZ_:\n\tcase ENC_EORTB_Z_ZZ_:\n\tcase ENC_MUL_Z_ZZ_:\n\tcase ENC_SMULH_Z_ZZ_:\n\tcase ENC_SQDMULH_Z_ZZ_:\n\tcase ENC_SQRDMULH_Z_ZZ_:\n\tcase ENC_TBX_Z_ZZ_:\n\tcase ENC_UMULH_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<T>,<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tbreak;\n\t}\n\tcase ENC_SADDWB_Z_ZZ_:\n\tcase ENC_SADDWT_Z_ZZ_:\n\tcase ENC_SSUBWB_Z_ZZ_:\n\tcase ENC_SSUBWT_Z_ZZ_:\n\tcase ENC_UADDWB_Z_ZZ_:\n\tcase ENC_UADDWT_Z_ZZ_:\n\tcase ENC_USUBWB_Z_ZZ_:\n\tcase ENC_USUBWT_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_r_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_r_b_h_s[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<T>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_ADDHNB_Z_ZZ_:\n\tcase ENC_ADDHNT_Z_ZZ_:\n\tcase ENC_RADDHNB_Z_ZZ_:\n\tcase ENC_RADDHNT_Z_ZZ_:\n\tcase ENC_RSUBHNB_Z_ZZ_:\n\tcase ENC_RSUBHNT_Z_ZZ_:\n\tcase ENC_SUBHNB_Z_ZZ_:\n\tcase ENC_SUBHNT_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_d_b_h_s[ctx->size];\n\t\tArrangementSpec Tb = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<Tb>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_SLI_Z_ZZI_:\n\tcase ENC_SRI_Z_ZZI_:\n\t{\n\t\tArrangementSpec T = table16_r_b_h_s_d[ctx->tsize];\n\t\t// <Zd>.<T>,<Zn>.<T>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, T)\n\t\tADD_OPERAND_IMM32(ctx->shift, 0)\n\t\tbreak;\n\t}\n\tcase ENC_PMULLB_Z_ZZ_:\n\tcase ENC_PMULLT_Z_ZZ_:\n\tcase ENC_UABDLB_Z_ZZ_:\n\tcase ENC_UABDLT_Z_ZZ_:\n\tcase ENC_UADDLB_Z_ZZ_:\n\tcase ENC_UADDLT_Z_ZZ_:\n\tcase ENC_UMULLB_Z_ZZ_:\n\tcase ENC_UMULLT_Z_ZZ_:\n\tcase ENC_USUBLB_Z_ZZ_:\n\tcase ENC_USUBLT_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_q_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_d_b_h_s[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<Tb>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_SABDLB_Z_ZZ_:\n\tcase ENC_SABDLT_Z_ZZ_:\n\tcase ENC_SADDLB_Z_ZZ_:\n\tcase ENC_SADDLBT_Z_ZZ_:\n\tcase ENC_SADDLT_Z_ZZ_:\n\tcase ENC_SMULLB_Z_ZZ_:\n\tcase ENC_SMULLT_Z_ZZ_:\n\tcase ENC_SQDMULLB_Z_ZZ_:\n\tcase ENC_SQDMULLT_Z_ZZ_:\n\tcase ENC_SSUBLB_Z_ZZ_:\n\tcase ENC_SSUBLBT_Z_ZZ_:\n\tcase ENC_SSUBLT_Z_ZZ_:\n\tcase ENC_SSUBLTB_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_d_b_h_s[ctx->size];\n\t\t// <Zd>.<T>,<Zn>.<Tb>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_RSHRNB_Z_ZI_:\n\tcase ENC_RSHRNT_Z_ZI_:\n\tcase ENC_SHRNB_Z_ZI_:\n\tcase ENC_SHRNT_Z_ZI_:\n\tcase ENC_SQRSHRNB_Z_ZI_:\n\tcase ENC_SQRSHRNT_Z_ZI_:\n\tcase ENC_SQRSHRUNB_Z_ZI_:\n\tcase ENC_SQRSHRUNT_Z_ZI_:\n\tcase ENC_SQSHRNB_Z_ZI_:\n\tcase ENC_SQSHRNT_Z_ZI_:\n\tcase ENC_SQSHRUNB_Z_ZI_:\n\tcase ENC_SQSHRUNT_Z_ZI_:\n\tcase ENC_UQRSHRNB_Z_ZI_:\n\tcase ENC_UQRSHRNT_Z_ZI_:\n\tcase ENC_UQSHRNB_Z_ZI_:\n\tcase ENC_UQSHRNT_Z_ZI_:\n\t{\n\t\tArrangementSpec T = table_r_b_h_h_s_s_s_s[(ctx->tszh << 2) | ctx->tszl];\n\t\tArrangementSpec Tb = table_r_h_s_s_d_d_d_d[(ctx->tszh << 2) | ctx->tszl];\n\t\t// <Zd>.<T>,<Zn>.<Tb>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_IMM32(ctx->shift, 0)\n\t\tbreak;\n\t}\n\tcase ENC_SSHLLT_Z_ZI_:\n\tcase ENC_SSHLLB_Z_ZI_:\n\tcase ENC_USHLLB_Z_ZI_:\n\tcase ENC_USHLLT_Z_ZI_:\n\t{\n\t\tArrangementSpec T = table_r_h_s_s_d_d_d_d[(ctx->tszh << 2) | ctx->tszl];\n\t\tArrangementSpec Tb = table_r_b_h_h_s_s_s_s[(ctx->tszh << 2) | ctx->tszl];\n\t\t// <Zd>.<T>,<Zn>.<Tb>, #<const>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_IMM32(ctx->shift, 0)\n\t\tbreak;\n\t}\n\tcase ENC_BCAX_Z_ZZZ_:\n\tcase ENC_BSL1N_Z_ZZZ_:\n\tcase ENC_BSL2N_Z_ZZZ_:\n\tcase ENC_BSL_Z_ZZZ_:\n\tcase ENC_EOR3_Z_ZZZ_:\n\tcase ENC_NBSL_Z_ZZZ_:\n\t{\n\t\t// <Zdn>.D,<Zdn>.D,<Zm>.D,<Zk>.D\n\t\tADD_OPERAND_ZREG_T(ctx->dn, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->dn, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->m, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->k, _1D)\n\t\tbreak;\n\t}\n\tcase ENC_CADD_Z_ZZ_:\n\tcase ENC_SQCADD_Z_ZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\tuint64_t rotate = ctx->rot ? 270 : 90;\n\t\t// <Zdn>.<T>,<Zdn>.<T>,<Zm>.<T>,<const>\n\t\tADD_OPERAND_ZREG_T(ctx->dn, T)\n\t\tADD_OPERAND_ZREG_T(ctx->dn, T)\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_CDOT_Z_ZZZ_:\n\t{\n\t\tArrangementSpec T = table_s_d[ctx->size & 1];\n\t\tArrangementSpec Tb = table_b_h[ctx->size & 1];\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.<T>,<Zn>.<Tb>,<Zm>.<Tb>,<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_SABALB_Z_ZZZ_:\n\tcase ENC_SABALT_Z_ZZZ_:\n\tcase ENC_SMLALB_Z_ZZZ_:\n\tcase ENC_SMLALT_Z_ZZZ_:\n\tcase ENC_SMLSLB_Z_ZZZ_:\n\tcase ENC_SMLSLT_Z_ZZZ_:\n\tcase ENC_SQDMLALB_Z_ZZZ_:\n\tcase ENC_SQDMLALBT_Z_ZZZ_:\n\tcase ENC_SQDMLALT_Z_ZZZ_:\n\tcase ENC_SQDMLSLB_Z_ZZZ_:\n\tcase ENC_SQDMLSLBT_Z_ZZZ_:\n\tcase ENC_SQDMLSLT_Z_ZZZ_:\n\tcase ENC_UABALB_Z_ZZZ_:\n\tcase ENC_UABALT_Z_ZZZ_:\n\tcase ENC_UMLALB_Z_ZZZ_:\n\tcase ENC_UMLALT_Z_ZZZ_:\n\tcase ENC_UMLSLB_Z_ZZZ_:\n\tcase ENC_UMLSLT_Z_ZZZ_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\tArrangementSpec Tb = table_d_b_h_s[ctx->size];\n\t\t// <Zda>.<T>,<Zn>.<Tb>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_SDOT_Z_ZZZ_:\n\tcase ENC_UDOT_Z_ZZZ_:\n\t{\n\t\tArrangementSpec T = table_s_d[ctx->size & 1];\n\t\tArrangementSpec Tb = table_b_h[ctx->size & 1];\n\t\t// <Zda>.<T>,<Zn>.<Tb>,<Zm>.<Tb>\n\t\tADD_OPERAND_ZREG_T(ctx->da, T)\n\t\tADD_OPERAND_ZREG_T(ctx->n, Tb)\n\t\tADD_OPERAND_ZREG_T(ctx->m, Tb)\n\t\tbreak;\n\t}\n\tcase ENC_CMLA_Z_ZZZI_H:\n\tcase ENC_SQRDCMLAH_Z_ZZZI_H:\n\t{\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.H,<Zn>.H,<Zm>.H[<imm>],<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_CDOT_Z_ZZZI_S:\n\t{\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.S,<Zn>.B,<Zm>.B[<imm>],<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1B)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1B, ctx->index);\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_CDOT_Z_ZZZI_D:\n\t{\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.D,<Zn>.H,<Zm>.H[<imm>],<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_MLA_Z_ZZZI_H:\n\tcase ENC_MLS_Z_ZZZI_H:\n\tcase ENC_SQRDMLAH_Z_ZZZI_H:\n\tcase ENC_SQRDMLSH_Z_ZZZI_H:\n\t{\n\t\t// <Zda>.H,<Zn>.H,<Zm>.H[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MUL_Z_ZZI_H:\n\tcase ENC_SQDMULH_Z_ZZI_H:\n\tcase ENC_SQRDMULH_Z_ZZI_H:\n\t{\n\t\t// <Zd>.H,<Zn>.H,<Zm>.H[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1H)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1H)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1H, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MUL_Z_ZZI_S:\n\tcase ENC_SQDMULH_Z_ZZI_S:\n\tcase ENC_SQRDMULH_Z_ZZI_S:\n\t{\n\t\t// <Zd>.S,<Zn>.S,<Zm>.S[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MUL_Z_ZZI_D:\n\tcase ENC_SQDMULH_Z_ZZI_D:\n\tcase ENC_SQRDMULH_Z_ZZI_D:\n\t{\n\t\t// <Zd>.D,<Zn>.D,<Zm>.D[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->d, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1D, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_CMLA_Z_ZZZI_S:\n\tcase ENC_SQRDCMLAH_Z_ZZZI_S:\n\t{\n\t\tuint64_t rotate = ctx->rot * 90;\n\t\t// <Zda>.S,<Zn>.S,<Zm>.S[<imm>],<const>\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tADD_OPERAND_ROTATE;\n\t\tbreak;\n\t}\n\tcase ENC_MLA_Z_ZZZI_S:\n\tcase ENC_MLS_Z_ZZZI_S:\n\tcase ENC_SQRDMLAH_Z_ZZZI_S:\n\tcase ENC_SQRDMLSH_Z_ZZZI_S:\n\t{\n\t\t// <Zda>.S,<Zn>.S,<Zm>.S[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1S)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1S)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1S, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_MLA_Z_ZZZI_D:\n\tcase ENC_MLS_Z_ZZZI_D:\n\tcase ENC_SQRDMLAH_Z_ZZZI_D:\n\tcase ENC_SQRDMLSH_Z_ZZZI_D:\n\t{\n\t\t// <Zda>.D,<Zn>.D,<Zm>.D[<imm>]\n\t\tADD_OPERAND_ZREG_T(ctx->da, _1D)\n\t\tADD_OPERAND_ZREG_T(ctx->n, _1D)\n\t\tADD_OPERAND_ZREG_T_LANE(ctx->m, _1D, ctx->index);\n\t\tbreak;\n\t}\n\tcase ENC_EXT_Z_ZI_CON:\n\t{\n\t\tunsigned imm = ctx->position;\n\t\t// <Zd>.B,{<Zn1>.B,<Zn2>.B},#<imm>\n\t\tADD_OPERAND_ZREG_T(ctx->Zd, _1B)\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, _1B, ctx->Zn);\n\t\tADD_OPERAND_ZREG_T(ctx->m, arr_spec)\n\t\tADD_OPERAND_IMM32(imm, 0);\n\t\tbreak;\n\t}\n\tcase ENC_SPLICE_Z_P_ZZ_CON:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,<Pg>,{<Zn1>.<T>,<Zn2>.<T>}\n\t\tADD_OPERAND_ZREG_T(ctx->dst, T)\n\t\tADD_OPERAND_PRED_REG(ctx->g);\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, T, ctx->s1);\n\t\tbreak;\n\t}\n\tcase ENC_TBL_Z_ZZ_2:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\t// <Zd>.<T>,{<Zn1>.<T>,<Zn2>.<T>},<Zm>.<T>\n\t\tADD_OPERAND_ZREG_T(ctx->d, T)\n\t\tADD_OPERAND_MULTIREG_2(REG_Z_BASE, T, ctx->n);\n\t\tADD_OPERAND_ZREG_T(ctx->m, T)\n\t\tbreak;\n\t}\n\tcase ENC_WHILERW_P_RR_:\n\tcase ENC_WHILEWR_P_RR_:\n\t{\n\t\tArrangementSpec T = table_b_h_s_d[ctx->size];\n\t\t// <Pd>.<T>,<Xn>,<Xm>\n\t\tADD_OPERAND_PRED_REG_T(ctx->d, T);\n\t\tADD_OPERAND_XN;\n\t\tADD_OPERAND_XM;\n\t\tbreak;\n\t}\n\tdefault:\n\t\tinstr->operation = ARM64_ERROR;\n\t\treturn DECODE_STATUS_ERROR_OPERANDS;\n\t}\n\n\treturn 0;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decompose_and_disassemble.c",
    "content": "#include \"decompose_and_disassemble.h\"\n\n#include \"decode.h\"\n#include \"format.h\"\n\nint aarch64_decompose_and_disassemble(uint64_t address, uint32_t insword, char* result, size_t result_buf_sz)\n{\n\tint rc;\n\tInstruction instr;\n\tmemset(&instr, 0, sizeof(instr));\n\n\trc = aarch64_decompose(insword, &instr, address);\n\tif (rc)\n\t\treturn rc;\n\n\trc = aarch64_disassemble(&instr, result, result_buf_sz);\n\tif (rc)\n\t\treturn rc;\n\n\treturn 0;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/decompose_and_disassemble.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n\tint aarch64_decompose_and_disassemble(uint64_t address, uint32_t insword, char* result, size_t result_buf_sz);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/encodings_dec.c",
    "content": "/* GENERATED FILE */\n/* this is the \"decoding\" side of encodings, no string mappings */\n\n#include \"operations.h\"\n#include \"encodings_dec.h\"\n\nenum Operation enc_to_oper(enum ENCODING enc)\n{\n\tswitch(enc) {\n\t\tcase ENC_ABS_ASISDMISC_R:\n\t\tcase ENC_ABS_ASIMDMISC_R:\n\t\tcase ENC_ABS_Z_P_Z_:\n\t\t\treturn ARM64_ABS;\n\t\tcase ENC_ADC_32_ADDSUB_CARRY:\n\t\tcase ENC_ADC_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_ADC;\n\t\tcase ENC_ADCLB_Z_ZZZ_:\n\t\t\treturn ARM64_ADCLB;\n\t\tcase ENC_ADCLT_Z_ZZZ_:\n\t\t\treturn ARM64_ADCLT;\n\t\tcase ENC_ADCS_32_ADDSUB_CARRY:\n\t\tcase ENC_ADCS_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_ADCS;\n\t\tcase ENC_ADD_32_ADDSUB_EXT:\n\t\tcase ENC_ADD_64_ADDSUB_EXT:\n\t\tcase ENC_ADD_32_ADDSUB_IMM:\n\t\tcase ENC_ADD_64_ADDSUB_IMM:\n\t\tcase ENC_ADD_32_ADDSUB_SHIFT:\n\t\tcase ENC_ADD_64_ADDSUB_SHIFT:\n\t\tcase ENC_ADD_ASISDSAME_ONLY:\n\t\tcase ENC_ADD_ASIMDSAME_ONLY:\n\t\tcase ENC_ADD_Z_P_ZZ_:\n\t\tcase ENC_ADD_Z_ZI_:\n\t\tcase ENC_ADD_Z_ZZ_:\n\t\t\treturn ARM64_ADD;\n\t\tcase ENC_ADDG_64_ADDSUB_IMMTAGS:\n\t\t\treturn ARM64_ADDG;\n\t\tcase ENC_ADDHA_ZA_PP_Z_32:\n\t\tcase ENC_ADDHA_ZA_PP_Z_64:\n\t\t\treturn ARM64_ADDHA;\n\t\tcase ENC_ADDHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_ADDHN;\n\t\t//case ENC_ADDHN_ASIMDDIFF_N:\n\t\t//\treturn ARM64_ADDHN2;\n\t\tcase ENC_ADDHNB_Z_ZZ_:\n\t\t\treturn ARM64_ADDHNB;\n\t\tcase ENC_ADDHNT_Z_ZZ_:\n\t\t\treturn ARM64_ADDHNT;\n\t\tcase ENC_ADDP_ASISDPAIR_ONLY:\n\t\tcase ENC_ADDP_ASIMDSAME_ONLY:\n\t\tcase ENC_ADDP_Z_P_ZZ_:\n\t\t\treturn ARM64_ADDP;\n\t\tcase ENC_ADDPL_R_RI_:\n\t\t\treturn ARM64_ADDPL;\n\t\tcase ENC_ADDS_32S_ADDSUB_EXT:\n\t\tcase ENC_ADDS_64S_ADDSUB_EXT:\n\t\tcase ENC_ADDS_32S_ADDSUB_IMM:\n\t\tcase ENC_ADDS_64S_ADDSUB_IMM:\n\t\tcase ENC_ADDS_32_ADDSUB_SHIFT:\n\t\tcase ENC_ADDS_64_ADDSUB_SHIFT:\n\t\t\treturn ARM64_ADDS;\n\t\tcase ENC_ADDV_ASIMDALL_ONLY:\n\t\t\treturn ARM64_ADDV;\n\t\tcase ENC_ADDVA_ZA_PP_Z_32:\n\t\tcase ENC_ADDVA_ZA_PP_Z_64:\n\t\t\treturn ARM64_ADDVA;\n\t\tcase ENC_ADDVL_R_RI_:\n\t\t\treturn ARM64_ADDVL;\n\t\tcase ENC_ADR_ONLY_PCRELADDR:\n\t\tcase ENC_ADR_Z_AZ_SD_SAME_SCALED:\n\t\tcase ENC_ADR_Z_AZ_D_S32_SCALED:\n\t\tcase ENC_ADR_Z_AZ_D_U32_SCALED:\n\t\t\treturn ARM64_ADR;\n\t\tcase ENC_ADRP_ONLY_PCRELADDR:\n\t\t\treturn ARM64_ADRP;\n\t\tcase ENC_AESD_B_CRYPTOAES:\n\t\tcase ENC_AESD_Z_ZZ_:\n\t\t\treturn ARM64_AESD;\n\t\tcase ENC_AESE_B_CRYPTOAES:\n\t\tcase ENC_AESE_Z_ZZ_:\n\t\t\treturn ARM64_AESE;\n\t\tcase ENC_AESIMC_B_CRYPTOAES:\n\t\tcase ENC_AESIMC_Z_Z_:\n\t\t\treturn ARM64_AESIMC;\n\t\tcase ENC_AESMC_B_CRYPTOAES:\n\t\tcase ENC_AESMC_Z_Z_:\n\t\t\treturn ARM64_AESMC;\n\t\tcase ENC_AND_ASIMDSAME_ONLY:\n\t\tcase ENC_AND_32_LOG_IMM:\n\t\tcase ENC_AND_64_LOG_IMM:\n\t\tcase ENC_AND_32_LOG_SHIFT:\n\t\tcase ENC_AND_64_LOG_SHIFT:\n\t\tcase ENC_AND_P_P_PP_Z:\n\t\tcase ENC_AND_Z_P_ZZ_:\n\t\tcase ENC_AND_Z_ZI_:\n\t\tcase ENC_AND_Z_ZZ_:\n\t\t\treturn ARM64_AND;\n\t\tcase ENC_ANDS_32S_LOG_IMM:\n\t\tcase ENC_ANDS_64S_LOG_IMM:\n\t\tcase ENC_ANDS_32_LOG_SHIFT:\n\t\tcase ENC_ANDS_64_LOG_SHIFT:\n\t\tcase ENC_ANDS_P_P_PP_Z:\n\t\t\treturn ARM64_ANDS;\n\t\tcase ENC_ANDV_R_P_Z_:\n\t\t\treturn ARM64_ANDV;\n\t\tcase ENC_ASR_ASRV_32_DP_2SRC:\n\t\tcase ENC_ASR_ASRV_64_DP_2SRC:\n\t\tcase ENC_ASR_SBFM_32M_BITFIELD:\n\t\tcase ENC_ASR_SBFM_64M_BITFIELD:\n\t\tcase ENC_ASR_Z_P_ZI_:\n\t\tcase ENC_ASR_Z_P_ZW_:\n\t\tcase ENC_ASR_Z_P_ZZ_:\n\t\tcase ENC_ASR_Z_ZI_:\n\t\tcase ENC_ASR_Z_ZW_:\n\t\t\treturn ARM64_ASR;\n\t\tcase ENC_ASRD_Z_P_ZI_:\n\t\t\treturn ARM64_ASRD;\n\t\tcase ENC_ASRR_Z_P_ZZ_:\n\t\t\treturn ARM64_ASRR;\n\t\tcase ENC_ASRV_32_DP_2SRC:\n\t\tcase ENC_ASRV_64_DP_2SRC:\n\t\t\treturn ARM64_ASRV;\n\t\tcase ENC_AT_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_AT;\n\t\tcase ENC_AUTDA_64P_DP_1SRC:\n\t\t\treturn ARM64_AUTDA;\n\t\tcase ENC_AUTDB_64P_DP_1SRC:\n\t\t\treturn ARM64_AUTDB;\n\t\tcase ENC_AUTDZA_64Z_DP_1SRC:\n\t\t\treturn ARM64_AUTDZA;\n\t\tcase ENC_AUTDZB_64Z_DP_1SRC:\n\t\t\treturn ARM64_AUTDZB;\n\t\tcase ENC_AUTIA_64P_DP_1SRC:\n\t\t\treturn ARM64_AUTIA;\n\t\tcase ENC_AUTIA1716_HI_HINTS:\n\t\t\treturn ARM64_AUTIA1716;\n\t\tcase ENC_AUTIASP_HI_HINTS:\n\t\t\treturn ARM64_AUTIASP;\n\t\tcase ENC_AUTIAZ_HI_HINTS:\n\t\t\treturn ARM64_AUTIAZ;\n\t\tcase ENC_AUTIB_64P_DP_1SRC:\n\t\t\treturn ARM64_AUTIB;\n\t\tcase ENC_AUTIB1716_HI_HINTS:\n\t\t\treturn ARM64_AUTIB1716;\n\t\tcase ENC_AUTIBSP_HI_HINTS:\n\t\t\treturn ARM64_AUTIBSP;\n\t\tcase ENC_AUTIBZ_HI_HINTS:\n\t\t\treturn ARM64_AUTIBZ;\n\t\tcase ENC_AUTIZA_64Z_DP_1SRC:\n\t\t\treturn ARM64_AUTIZA;\n\t\tcase ENC_AUTIZB_64Z_DP_1SRC:\n\t\t\treturn ARM64_AUTIZB;\n\t\tcase ENC_AXFLAG_M_PSTATE:\n\t\t\treturn ARM64_AXFLAG;\n\t\tcase ENC_B_ONLY_CONDBRANCH:\n\t\tcase ENC_B_ONLY_BRANCH_IMM:\n\t\t\treturn ARM64_B;\n\t\tcase ENC_BCAX_VVV16_CRYPTO4:\n\t\tcase ENC_BCAX_Z_ZZZ_:\n\t\t\treturn ARM64_BCAX;\n\t\tcase ENC_BDEP_Z_ZZ_:\n\t\t\treturn ARM64_BDEP;\n\t\tcase ENC_BEXT_Z_ZZ_:\n\t\t\treturn ARM64_BEXT;\n\t\tcase ENC_BFC_BFM_32M_BITFIELD:\n\t\tcase ENC_BFC_BFM_64M_BITFIELD:\n\t\t\treturn ARM64_BFC;\n\t\tcase ENC_BFCVT_BS_FLOATDP1:\n\t\tcase ENC_BFCVT_Z_P_Z_S2BF:\n\t\t\treturn ARM64_BFCVT;\n\t\tcase ENC_BFCVTN_ASIMDMISC_4S:\n\t\t\treturn ARM64_BFCVTN;\n\t\t//case ENC_BFCVTN_ASIMDMISC_4S:\n\t\t//\treturn ARM64_BFCVTN2;\n\t\tcase ENC_BFCVTNT_Z_P_Z_S2BF:\n\t\t\treturn ARM64_BFCVTNT;\n\t\tcase ENC_BFDOT_ASIMDELEM_E:\n\t\tcase ENC_BFDOT_ASIMDSAME2_D:\n\t\tcase ENC_BFDOT_Z_ZZZ_:\n\t\tcase ENC_BFDOT_Z_ZZZI_:\n\t\t\treturn ARM64_BFDOT;\n\t\tcase ENC_BFI_BFM_32M_BITFIELD:\n\t\tcase ENC_BFI_BFM_64M_BITFIELD:\n\t\t\treturn ARM64_BFI;\n\t\tcase ENC_BFM_32M_BITFIELD:\n\t\tcase ENC_BFM_64M_BITFIELD:\n\t\t\treturn ARM64_BFM;\n\t\tcase ENC_BFMLAL_ASIMDELEM_F:\n\t\tcase ENC_BFMLAL_ASIMDSAME2_F_:\n\t\t\treturn ARM64_BFMLAL;\n\t\tcase ENC_BFMLALB_Z_ZZZ_:\n\t\tcase ENC_BFMLALB_Z_ZZZI_:\n\t\t\treturn ARM64_BFMLALB;\n\t\tcase ENC_BFMLALT_Z_ZZZ_:\n\t\tcase ENC_BFMLALT_Z_ZZZI_:\n\t\t\treturn ARM64_BFMLALT;\n\t\tcase ENC_BFMMLA_ASIMDSAME2_E:\n\t\tcase ENC_BFMMLA_Z_ZZZ_:\n\t\t\treturn ARM64_BFMMLA;\n\t\tcase ENC_BFMOPA_ZA32_PP_ZZ_:\n\t\t\treturn ARM64_BFMOPA;\n\t\tcase ENC_BFMOPS_ZA32_PP_ZZ_:\n\t\t\treturn ARM64_BFMOPS;\n\t\tcase ENC_BFXIL_BFM_32M_BITFIELD:\n\t\tcase ENC_BFXIL_BFM_64M_BITFIELD:\n\t\t\treturn ARM64_BFXIL;\n\t\tcase ENC_BGRP_Z_ZZ_:\n\t\t\treturn ARM64_BGRP;\n\t\tcase ENC_BIC_ASIMDIMM_L_HL:\n\t\tcase ENC_BIC_ASIMDIMM_L_SL:\n\t\tcase ENC_BIC_ASIMDSAME_ONLY:\n\t\tcase ENC_BIC_AND_Z_ZI_:\n\t\tcase ENC_BIC_32_LOG_SHIFT:\n\t\tcase ENC_BIC_64_LOG_SHIFT:\n\t\tcase ENC_BIC_P_P_PP_Z:\n\t\tcase ENC_BIC_Z_P_ZZ_:\n\t\tcase ENC_BIC_Z_ZZ_:\n\t\t\treturn ARM64_BIC;\n\t\tcase ENC_BICS_32_LOG_SHIFT:\n\t\tcase ENC_BICS_64_LOG_SHIFT:\n\t\tcase ENC_BICS_P_P_PP_Z:\n\t\t\treturn ARM64_BICS;\n\t\tcase ENC_BIF_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_BIF;\n\t\tcase ENC_BIT_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_BIT;\n\t\tcase ENC_BL_ONLY_BRANCH_IMM:\n\t\t\treturn ARM64_BL;\n\t\tcase ENC_BLR_64_BRANCH_REG:\n\t\t\treturn ARM64_BLR;\n\t\tcase ENC_BLRAA_64P_BRANCH_REG:\n\t\t\treturn ARM64_BLRAA;\n\t\tcase ENC_BLRAAZ_64_BRANCH_REG:\n\t\t\treturn ARM64_BLRAAZ;\n\t\tcase ENC_BLRAB_64P_BRANCH_REG:\n\t\t\treturn ARM64_BLRAB;\n\t\tcase ENC_BLRABZ_64_BRANCH_REG:\n\t\t\treturn ARM64_BLRABZ;\n\t\tcase ENC_BR_64_BRANCH_REG:\n\t\t\treturn ARM64_BR;\n\t\tcase ENC_BRAA_64P_BRANCH_REG:\n\t\t\treturn ARM64_BRAA;\n\t\tcase ENC_BRAAZ_64_BRANCH_REG:\n\t\t\treturn ARM64_BRAAZ;\n\t\tcase ENC_BRAB_64P_BRANCH_REG:\n\t\t\treturn ARM64_BRAB;\n\t\tcase ENC_BRABZ_64_BRANCH_REG:\n\t\t\treturn ARM64_BRABZ;\n\t\tcase ENC_BRK_EX_EXCEPTION:\n\t\t\treturn ARM64_BRK;\n\t\tcase ENC_BRKA_P_P_P_:\n\t\t\treturn ARM64_BRKA;\n\t\tcase ENC_BRKAS_P_P_P_Z:\n\t\t\treturn ARM64_BRKAS;\n\t\tcase ENC_BRKB_P_P_P_:\n\t\t\treturn ARM64_BRKB;\n\t\tcase ENC_BRKBS_P_P_P_Z:\n\t\t\treturn ARM64_BRKBS;\n\t\tcase ENC_BRKN_P_P_PP_:\n\t\t\treturn ARM64_BRKN;\n\t\tcase ENC_BRKNS_P_P_PP_:\n\t\t\treturn ARM64_BRKNS;\n\t\tcase ENC_BRKPA_P_P_PP_:\n\t\t\treturn ARM64_BRKPA;\n\t\tcase ENC_BRKPAS_P_P_PP_:\n\t\t\treturn ARM64_BRKPAS;\n\t\tcase ENC_BRKPB_P_P_PP_:\n\t\t\treturn ARM64_BRKPB;\n\t\tcase ENC_BRKPBS_P_P_PP_:\n\t\t\treturn ARM64_BRKPBS;\n\t\tcase ENC_BSL_ASIMDSAME_ONLY:\n\t\tcase ENC_BSL_Z_ZZZ_:\n\t\t\treturn ARM64_BSL;\n\t\tcase ENC_BSL1N_Z_ZZZ_:\n\t\t\treturn ARM64_BSL1N;\n\t\tcase ENC_BSL2N_Z_ZZZ_:\n\t\t\treturn ARM64_BSL2N;\n\t\tcase ENC_BTI_HB_HINTS:\n\t\t\treturn ARM64_BTI;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_AL;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_CC;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_CS;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_EQ;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_GE;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_GT;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_HI;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_LE;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_LS;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_LT;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_MI;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_NE;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_NV;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_PL;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_VC;\n\t\t//case ENC_B_ONLY_CONDBRANCH:\n\t\t//\treturn ARM64_B_VS;\n\t\tcase ENC_CADD_Z_ZZ_:\n\t\t\treturn ARM64_CADD;\n\t\tcase ENC_CAS_C32_COMSWAP:\n\t\tcase ENC_CAS_C64_COMSWAP:\n\t\t\treturn ARM64_CAS;\n\t\tcase ENC_CASA_C32_COMSWAP:\n\t\tcase ENC_CASA_C64_COMSWAP:\n\t\t\treturn ARM64_CASA;\n\t\tcase ENC_CASAB_C32_COMSWAP:\n\t\t\treturn ARM64_CASAB;\n\t\tcase ENC_CASAH_C32_COMSWAP:\n\t\t\treturn ARM64_CASAH;\n\t\tcase ENC_CASAL_C32_COMSWAP:\n\t\tcase ENC_CASAL_C64_COMSWAP:\n\t\t\treturn ARM64_CASAL;\n\t\tcase ENC_CASALB_C32_COMSWAP:\n\t\t\treturn ARM64_CASALB;\n\t\tcase ENC_CASALH_C32_COMSWAP:\n\t\t\treturn ARM64_CASALH;\n\t\tcase ENC_CASB_C32_COMSWAP:\n\t\t\treturn ARM64_CASB;\n\t\tcase ENC_CASH_C32_COMSWAP:\n\t\t\treturn ARM64_CASH;\n\t\tcase ENC_CASL_C32_COMSWAP:\n\t\tcase ENC_CASL_C64_COMSWAP:\n\t\t\treturn ARM64_CASL;\n\t\tcase ENC_CASLB_C32_COMSWAP:\n\t\t\treturn ARM64_CASLB;\n\t\tcase ENC_CASLH_C32_COMSWAP:\n\t\t\treturn ARM64_CASLH;\n\t\tcase ENC_CASP_CP32_COMSWAPPR:\n\t\tcase ENC_CASP_CP64_COMSWAPPR:\n\t\t\treturn ARM64_CASP;\n\t\tcase ENC_CASPA_CP32_COMSWAPPR:\n\t\tcase ENC_CASPA_CP64_COMSWAPPR:\n\t\t\treturn ARM64_CASPA;\n\t\tcase ENC_CASPAL_CP32_COMSWAPPR:\n\t\tcase ENC_CASPAL_CP64_COMSWAPPR:\n\t\t\treturn ARM64_CASPAL;\n\t\tcase ENC_CASPL_CP32_COMSWAPPR:\n\t\tcase ENC_CASPL_CP64_COMSWAPPR:\n\t\t\treturn ARM64_CASPL;\n\t\tcase ENC_CBNZ_32_COMPBRANCH:\n\t\tcase ENC_CBNZ_64_COMPBRANCH:\n\t\t\treturn ARM64_CBNZ;\n\t\tcase ENC_CBZ_32_COMPBRANCH:\n\t\tcase ENC_CBZ_64_COMPBRANCH:\n\t\t\treturn ARM64_CBZ;\n\t\tcase ENC_CCMN_32_CONDCMP_IMM:\n\t\tcase ENC_CCMN_64_CONDCMP_IMM:\n\t\tcase ENC_CCMN_32_CONDCMP_REG:\n\t\tcase ENC_CCMN_64_CONDCMP_REG:\n\t\t\treturn ARM64_CCMN;\n\t\tcase ENC_CCMP_32_CONDCMP_IMM:\n\t\tcase ENC_CCMP_64_CONDCMP_IMM:\n\t\tcase ENC_CCMP_32_CONDCMP_REG:\n\t\tcase ENC_CCMP_64_CONDCMP_REG:\n\t\t\treturn ARM64_CCMP;\n\t\tcase ENC_CDOT_Z_ZZZ_:\n\t\tcase ENC_CDOT_Z_ZZZI_S:\n\t\tcase ENC_CDOT_Z_ZZZI_D:\n\t\t\treturn ARM64_CDOT;\n\t\tcase ENC_CFINV_M_PSTATE:\n\t\t\treturn ARM64_CFINV;\n\t\tcase ENC_CFP_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_CFP;\n\t\tcase ENC_CINC_CSINC_32_CONDSEL:\n\t\tcase ENC_CINC_CSINC_64_CONDSEL:\n\t\t\treturn ARM64_CINC;\n\t\tcase ENC_CINV_CSINV_32_CONDSEL:\n\t\tcase ENC_CINV_CSINV_64_CONDSEL:\n\t\t\treturn ARM64_CINV;\n\t\tcase ENC_CLASTA_R_P_Z_:\n\t\tcase ENC_CLASTA_V_P_Z_:\n\t\tcase ENC_CLASTA_Z_P_ZZ_:\n\t\t\treturn ARM64_CLASTA;\n\t\tcase ENC_CLASTB_R_P_Z_:\n\t\tcase ENC_CLASTB_V_P_Z_:\n\t\tcase ENC_CLASTB_Z_P_ZZ_:\n\t\t\treturn ARM64_CLASTB;\n\t\tcase ENC_CLREX_BN_BARRIERS:\n\t\t\treturn ARM64_CLREX;\n\t\tcase ENC_CLS_ASIMDMISC_R:\n\t\tcase ENC_CLS_32_DP_1SRC:\n\t\tcase ENC_CLS_64_DP_1SRC:\n\t\tcase ENC_CLS_Z_P_Z_:\n\t\t\treturn ARM64_CLS;\n\t\tcase ENC_CLZ_ASIMDMISC_R:\n\t\tcase ENC_CLZ_32_DP_1SRC:\n\t\tcase ENC_CLZ_64_DP_1SRC:\n\t\tcase ENC_CLZ_Z_P_Z_:\n\t\t\treturn ARM64_CLZ;\n\t\tcase ENC_CMEQ_ASISDSAME_ONLY:\n\t\tcase ENC_CMEQ_ASIMDSAME_ONLY:\n\t\tcase ENC_CMEQ_ASISDMISC_Z:\n\t\tcase ENC_CMEQ_ASIMDMISC_Z:\n\t\t\treturn ARM64_CMEQ;\n\t\tcase ENC_CMGE_ASISDSAME_ONLY:\n\t\tcase ENC_CMGE_ASIMDSAME_ONLY:\n\t\tcase ENC_CMGE_ASISDMISC_Z:\n\t\tcase ENC_CMGE_ASIMDMISC_Z:\n\t\t\treturn ARM64_CMGE;\n\t\tcase ENC_CMGT_ASISDSAME_ONLY:\n\t\tcase ENC_CMGT_ASIMDSAME_ONLY:\n\t\tcase ENC_CMGT_ASISDMISC_Z:\n\t\tcase ENC_CMGT_ASIMDMISC_Z:\n\t\t\treturn ARM64_CMGT;\n\t\tcase ENC_CMHI_ASISDSAME_ONLY:\n\t\tcase ENC_CMHI_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_CMHI;\n\t\tcase ENC_CMHS_ASISDSAME_ONLY:\n\t\tcase ENC_CMHS_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_CMHS;\n\t\tcase ENC_CMLA_Z_ZZZ_:\n\t\tcase ENC_CMLA_Z_ZZZI_H:\n\t\tcase ENC_CMLA_Z_ZZZI_S:\n\t\t\treturn ARM64_CMLA;\n\t\tcase ENC_CMLE_ASISDMISC_Z:\n\t\tcase ENC_CMLE_ASIMDMISC_Z:\n\t\t\treturn ARM64_CMLE;\n\t\tcase ENC_CMLT_ASISDMISC_Z:\n\t\tcase ENC_CMLT_ASIMDMISC_Z:\n\t\t\treturn ARM64_CMLT;\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_EXT:\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_EXT:\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_IMM:\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_IMM:\n\t\tcase ENC_CMN_ADDS_32_ADDSUB_SHIFT:\n\t\tcase ENC_CMN_ADDS_64_ADDSUB_SHIFT:\n\t\t\treturn ARM64_CMN;\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_EXT:\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_EXT:\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_IMM:\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_IMM:\n\t\tcase ENC_CMP_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_CMP_SUBS_64_ADDSUB_SHIFT:\n\t\t\treturn ARM64_CMP;\n\t\tcase ENC_CMPEQ_P_P_ZI_:\n\t\tcase ENC_CMPEQ_P_P_ZW_:\n\t\tcase ENC_CMPEQ_P_P_ZZ_:\n\t\t\treturn ARM64_CMPEQ;\n\t\tcase ENC_CMPGE_P_P_ZI_:\n\t\tcase ENC_CMPGE_P_P_ZW_:\n\t\tcase ENC_CMPGE_P_P_ZZ_:\n\t\t\treturn ARM64_CMPGE;\n\t\tcase ENC_CMPGT_P_P_ZI_:\n\t\tcase ENC_CMPGT_P_P_ZW_:\n\t\tcase ENC_CMPGT_P_P_ZZ_:\n\t\t\treturn ARM64_CMPGT;\n\t\tcase ENC_CMPHI_P_P_ZI_:\n\t\tcase ENC_CMPHI_P_P_ZW_:\n\t\tcase ENC_CMPHI_P_P_ZZ_:\n\t\t\treturn ARM64_CMPHI;\n\t\tcase ENC_CMPHS_P_P_ZI_:\n\t\tcase ENC_CMPHS_P_P_ZW_:\n\t\tcase ENC_CMPHS_P_P_ZZ_:\n\t\t\treturn ARM64_CMPHS;\n\t\tcase ENC_CMPLE_CMPGE_P_P_ZZ_:\n\t\tcase ENC_CMPLE_P_P_ZI_:\n\t\tcase ENC_CMPLE_P_P_ZW_:\n\t\t\treturn ARM64_CMPLE;\n\t\tcase ENC_CMPLO_CMPHI_P_P_ZZ_:\n\t\tcase ENC_CMPLO_P_P_ZI_:\n\t\tcase ENC_CMPLO_P_P_ZW_:\n\t\t\treturn ARM64_CMPLO;\n\t\tcase ENC_CMPLS_CMPHS_P_P_ZZ_:\n\t\tcase ENC_CMPLS_P_P_ZI_:\n\t\tcase ENC_CMPLS_P_P_ZW_:\n\t\t\treturn ARM64_CMPLS;\n\t\tcase ENC_CMPLT_CMPGT_P_P_ZZ_:\n\t\tcase ENC_CMPLT_P_P_ZI_:\n\t\tcase ENC_CMPLT_P_P_ZW_:\n\t\t\treturn ARM64_CMPLT;\n\t\tcase ENC_CMPNE_P_P_ZI_:\n\t\tcase ENC_CMPNE_P_P_ZW_:\n\t\tcase ENC_CMPNE_P_P_ZZ_:\n\t\t\treturn ARM64_CMPNE;\n\t\tcase ENC_CMPP_SUBPS_64S_DP_2SRC:\n\t\t\treturn ARM64_CMPP;\n\t\tcase ENC_CMTST_ASISDSAME_ONLY:\n\t\tcase ENC_CMTST_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_CMTST;\n\t\tcase ENC_CNEG_CSNEG_32_CONDSEL:\n\t\tcase ENC_CNEG_CSNEG_64_CONDSEL:\n\t\t\treturn ARM64_CNEG;\n\t\tcase ENC_CNOT_Z_P_Z_:\n\t\t\treturn ARM64_CNOT;\n\t\tcase ENC_CNT_ASIMDMISC_R:\n\t\tcase ENC_CNT_Z_P_Z_:\n\t\t\treturn ARM64_CNT;\n\t\tcase ENC_CNTB_R_S_:\n\t\t\treturn ARM64_CNTB;\n\t\tcase ENC_CNTD_R_S_:\n\t\t\treturn ARM64_CNTD;\n\t\tcase ENC_CNTH_R_S_:\n\t\t\treturn ARM64_CNTH;\n\t\tcase ENC_CNTP_R_P_P_:\n\t\t\treturn ARM64_CNTP;\n\t\tcase ENC_CNTW_R_S_:\n\t\t\treturn ARM64_CNTW;\n\t\tcase ENC_COMPACT_Z_P_Z_:\n\t\t\treturn ARM64_COMPACT;\n\t\tcase ENC_CPP_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_CPP;\n\t\tcase ENC_CPY_Z_O_I_:\n\t\tcase ENC_CPY_Z_P_I_:\n\t\tcase ENC_CPY_Z_P_R_:\n\t\tcase ENC_CPY_Z_P_V_:\n\t\t\treturn ARM64_CPY;\n\t\tcase ENC_CRC32B_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32B;\n\t\tcase ENC_CRC32CB_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32CB;\n\t\tcase ENC_CRC32CH_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32CH;\n\t\tcase ENC_CRC32CW_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32CW;\n\t\tcase ENC_CRC32CX_64C_DP_2SRC:\n\t\t\treturn ARM64_CRC32CX;\n\t\tcase ENC_CRC32H_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32H;\n\t\tcase ENC_CRC32W_32C_DP_2SRC:\n\t\t\treturn ARM64_CRC32W;\n\t\tcase ENC_CRC32X_64C_DP_2SRC:\n\t\t\treturn ARM64_CRC32X;\n\t\tcase ENC_CSDB_HI_HINTS:\n\t\t\treturn ARM64_CSDB;\n\t\tcase ENC_CSEL_32_CONDSEL:\n\t\tcase ENC_CSEL_64_CONDSEL:\n\t\t\treturn ARM64_CSEL;\n\t\tcase ENC_CSET_CSINC_32_CONDSEL:\n\t\tcase ENC_CSET_CSINC_64_CONDSEL:\n\t\t\treturn ARM64_CSET;\n\t\tcase ENC_CSETM_CSINV_32_CONDSEL:\n\t\tcase ENC_CSETM_CSINV_64_CONDSEL:\n\t\t\treturn ARM64_CSETM;\n\t\tcase ENC_CSINC_32_CONDSEL:\n\t\tcase ENC_CSINC_64_CONDSEL:\n\t\t\treturn ARM64_CSINC;\n\t\tcase ENC_CSINV_32_CONDSEL:\n\t\tcase ENC_CSINV_64_CONDSEL:\n\t\t\treturn ARM64_CSINV;\n\t\tcase ENC_CSNEG_32_CONDSEL:\n\t\tcase ENC_CSNEG_64_CONDSEL:\n\t\t\treturn ARM64_CSNEG;\n\t\tcase ENC_CTERMEQ_RR_:\n\t\t\treturn ARM64_CTERMEQ;\n\t\tcase ENC_CTERMNE_RR_:\n\t\t\treturn ARM64_CTERMNE;\n\t\tcase ENC_DC_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_DC;\n\t\tcase ENC_DCPS1_DC_EXCEPTION:\n\t\t\treturn ARM64_DCPS1;\n\t\tcase ENC_DCPS2_DC_EXCEPTION:\n\t\t\treturn ARM64_DCPS2;\n\t\tcase ENC_DCPS3_DC_EXCEPTION:\n\t\t\treturn ARM64_DCPS3;\n\t\tcase ENC_DECB_R_RS_:\n\t\t\treturn ARM64_DECB;\n\t\tcase ENC_DECD_R_RS_:\n\t\tcase ENC_DECD_Z_ZS_:\n\t\t\treturn ARM64_DECD;\n\t\tcase ENC_DECH_R_RS_:\n\t\tcase ENC_DECH_Z_ZS_:\n\t\t\treturn ARM64_DECH;\n\t\tcase ENC_DECP_R_P_R_:\n\t\tcase ENC_DECP_Z_P_Z_:\n\t\t\treturn ARM64_DECP;\n\t\tcase ENC_DECW_R_RS_:\n\t\tcase ENC_DECW_Z_ZS_:\n\t\t\treturn ARM64_DECW;\n\t\tcase ENC_DGH_HI_HINTS:\n\t\t\treturn ARM64_DGH;\n\t\tcase ENC_DMB_BO_BARRIERS:\n\t\t\treturn ARM64_DMB;\n\t\tcase ENC_DRPS_64E_BRANCH_REG:\n\t\t\treturn ARM64_DRPS;\n\t\tcase ENC_DSB_BO_BARRIERS:\n\t\tcase ENC_DSB_BON_BARRIERS:\n\t\t\treturn ARM64_DSB;\n\t\tcase ENC_DUP_ASISDONE_ONLY:\n\t\tcase ENC_DUP_ASIMDINS_DV_V:\n\t\tcase ENC_DUP_ASIMDINS_DR_R:\n\t\tcase ENC_DUP_P_P_PI_:\n\t\tcase ENC_DUP_Z_I_:\n\t\tcase ENC_DUP_Z_R_:\n\t\tcase ENC_DUP_Z_ZI_:\n\t\t\treturn ARM64_DUP;\n\t\tcase ENC_DUPM_Z_I_:\n\t\t\treturn ARM64_DUPM;\n\t\tcase ENC_DVP_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_DVP;\n\t\tcase ENC_EON_32_LOG_SHIFT:\n\t\tcase ENC_EON_64_LOG_SHIFT:\n\t\tcase ENC_EON_EOR_Z_ZI_:\n\t\t\treturn ARM64_EON;\n\t\tcase ENC_EOR_ASIMDSAME_ONLY:\n\t\tcase ENC_EOR_32_LOG_IMM:\n\t\tcase ENC_EOR_64_LOG_IMM:\n\t\tcase ENC_EOR_32_LOG_SHIFT:\n\t\tcase ENC_EOR_64_LOG_SHIFT:\n\t\tcase ENC_EOR_P_P_PP_Z:\n\t\tcase ENC_EOR_Z_P_ZZ_:\n\t\tcase ENC_EOR_Z_ZI_:\n\t\tcase ENC_EOR_Z_ZZ_:\n\t\t\treturn ARM64_EOR;\n\t\tcase ENC_EOR3_VVV16_CRYPTO4:\n\t\tcase ENC_EOR3_Z_ZZZ_:\n\t\t\treturn ARM64_EOR3;\n\t\tcase ENC_EORBT_Z_ZZ_:\n\t\t\treturn ARM64_EORBT;\n\t\tcase ENC_EORS_P_P_PP_Z:\n\t\t\treturn ARM64_EORS;\n\t\tcase ENC_EORTB_Z_ZZ_:\n\t\t\treturn ARM64_EORTB;\n\t\tcase ENC_EORV_R_P_Z_:\n\t\t\treturn ARM64_EORV;\n\t\tcase ENC_ERET_64E_BRANCH_REG:\n\t\t\treturn ARM64_ERET;\n\t\tcase ENC_ERETAA_64E_BRANCH_REG:\n\t\t\treturn ARM64_ERETAA;\n\t\tcase ENC_ERETAB_64E_BRANCH_REG:\n\t\t\treturn ARM64_ERETAB;\n\t\tcase ENC_ESB_HI_HINTS:\n\t\t\treturn ARM64_ESB;\n\t\tcase ENC_EXT_ASIMDEXT_ONLY:\n\t\tcase ENC_EXT_Z_ZI_CON:\n\t\tcase ENC_EXT_Z_ZI_DES:\n\t\t\treturn ARM64_EXT;\n\t\tcase ENC_EXTR_32_EXTRACT:\n\t\tcase ENC_EXTR_64_EXTRACT:\n\t\t\treturn ARM64_EXTR;\n\t\tcase ENC_FABD_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FABD_ASISDSAME_ONLY:\n\t\tcase ENC_FABD_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FABD_ASIMDSAME_ONLY:\n\t\tcase ENC_FABD_Z_P_ZZ_:\n\t\t\treturn ARM64_FABD;\n\t\tcase ENC_FABS_ASIMDMISCFP16_R:\n\t\tcase ENC_FABS_ASIMDMISC_R:\n\t\tcase ENC_FABS_H_FLOATDP1:\n\t\tcase ENC_FABS_S_FLOATDP1:\n\t\tcase ENC_FABS_D_FLOATDP1:\n\t\tcase ENC_FABS_Z_P_Z_:\n\t\t\treturn ARM64_FABS;\n\t\tcase ENC_FACGE_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FACGE_ASISDSAME_ONLY:\n\t\tcase ENC_FACGE_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FACGE_ASIMDSAME_ONLY:\n\t\tcase ENC_FACGE_P_P_ZZ_:\n\t\t\treturn ARM64_FACGE;\n\t\tcase ENC_FACGT_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FACGT_ASISDSAME_ONLY:\n\t\tcase ENC_FACGT_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FACGT_ASIMDSAME_ONLY:\n\t\tcase ENC_FACGT_P_P_ZZ_:\n\t\t\treturn ARM64_FACGT;\n\t\tcase ENC_FACLE_FACGE_P_P_ZZ_:\n\t\t\treturn ARM64_FACLE;\n\t\tcase ENC_FACLT_FACGT_P_P_ZZ_:\n\t\t\treturn ARM64_FACLT;\n\t\tcase ENC_FADD_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FADD_ASIMDSAME_ONLY:\n\t\tcase ENC_FADD_H_FLOATDP2:\n\t\tcase ENC_FADD_S_FLOATDP2:\n\t\tcase ENC_FADD_D_FLOATDP2:\n\t\tcase ENC_FADD_Z_P_ZS_:\n\t\tcase ENC_FADD_Z_P_ZZ_:\n\t\tcase ENC_FADD_Z_ZZ_:\n\t\t\treturn ARM64_FADD;\n\t\tcase ENC_FADDA_V_P_Z_:\n\t\t\treturn ARM64_FADDA;\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FADDP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FADDP_ASIMDSAME_ONLY:\n\t\tcase ENC_FADDP_Z_P_ZZ_:\n\t\t\treturn ARM64_FADDP;\n\t\tcase ENC_FADDV_V_P_Z_:\n\t\t\treturn ARM64_FADDV;\n\t\tcase ENC_FCADD_ASIMDSAME2_C:\n\t\tcase ENC_FCADD_Z_P_ZZ_:\n\t\t\treturn ARM64_FCADD;\n\t\tcase ENC_FCCMP_H_FLOATCCMP:\n\t\tcase ENC_FCCMP_S_FLOATCCMP:\n\t\tcase ENC_FCCMP_D_FLOATCCMP:\n\t\t\treturn ARM64_FCCMP;\n\t\tcase ENC_FCCMPE_H_FLOATCCMP:\n\t\tcase ENC_FCCMPE_S_FLOATCCMP:\n\t\tcase ENC_FCCMPE_D_FLOATCCMP:\n\t\t\treturn ARM64_FCCMPE;\n\t\tcase ENC_FCMEQ_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMEQ_ASISDSAME_ONLY:\n\t\tcase ENC_FCMEQ_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMEQ_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMEQ_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMEQ_ASISDMISC_FZ:\n\t\tcase ENC_FCMEQ_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMEQ_ASIMDMISC_FZ:\n\t\tcase ENC_FCMEQ_P_P_Z0_:\n\t\tcase ENC_FCMEQ_P_P_ZZ_:\n\t\t\treturn ARM64_FCMEQ;\n\t\tcase ENC_FCMGE_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGE_ASISDSAME_ONLY:\n\t\tcase ENC_FCMGE_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGE_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMGE_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMGE_ASISDMISC_FZ:\n\t\tcase ENC_FCMGE_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMGE_ASIMDMISC_FZ:\n\t\tcase ENC_FCMGE_P_P_Z0_:\n\t\tcase ENC_FCMGE_P_P_ZZ_:\n\t\t\treturn ARM64_FCMGE;\n\t\tcase ENC_FCMGT_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGT_ASISDSAME_ONLY:\n\t\tcase ENC_FCMGT_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FCMGT_ASIMDSAME_ONLY:\n\t\tcase ENC_FCMGT_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMGT_ASISDMISC_FZ:\n\t\tcase ENC_FCMGT_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMGT_ASIMDMISC_FZ:\n\t\tcase ENC_FCMGT_P_P_Z0_:\n\t\tcase ENC_FCMGT_P_P_ZZ_:\n\t\t\treturn ARM64_FCMGT;\n\t\tcase ENC_FCMLA_ASIMDELEM_C_H:\n\t\tcase ENC_FCMLA_ASIMDELEM_C_S:\n\t\tcase ENC_FCMLA_ASIMDSAME2_C:\n\t\tcase ENC_FCMLA_Z_P_ZZZ_:\n\t\tcase ENC_FCMLA_Z_ZZZI_H:\n\t\tcase ENC_FCMLA_Z_ZZZI_S:\n\t\t\treturn ARM64_FCMLA;\n\t\tcase ENC_FCMLE_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMLE_ASISDMISC_FZ:\n\t\tcase ENC_FCMLE_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMLE_ASIMDMISC_FZ:\n\t\tcase ENC_FCMLE_FCMGE_P_P_ZZ_:\n\t\tcase ENC_FCMLE_P_P_Z0_:\n\t\t\treturn ARM64_FCMLE;\n\t\tcase ENC_FCMLT_ASISDMISCFP16_FZ:\n\t\tcase ENC_FCMLT_ASISDMISC_FZ:\n\t\tcase ENC_FCMLT_ASIMDMISCFP16_FZ:\n\t\tcase ENC_FCMLT_ASIMDMISC_FZ:\n\t\tcase ENC_FCMLT_FCMGT_P_P_ZZ_:\n\t\tcase ENC_FCMLT_P_P_Z0_:\n\t\t\treturn ARM64_FCMLT;\n\t\tcase ENC_FCMNE_P_P_Z0_:\n\t\tcase ENC_FCMNE_P_P_ZZ_:\n\t\t\treturn ARM64_FCMNE;\n\t\tcase ENC_FCMP_H_FLOATCMP:\n\t\tcase ENC_FCMP_HZ_FLOATCMP:\n\t\tcase ENC_FCMP_S_FLOATCMP:\n\t\tcase ENC_FCMP_SZ_FLOATCMP:\n\t\tcase ENC_FCMP_D_FLOATCMP:\n\t\tcase ENC_FCMP_DZ_FLOATCMP:\n\t\t\treturn ARM64_FCMP;\n\t\tcase ENC_FCMPE_H_FLOATCMP:\n\t\tcase ENC_FCMPE_HZ_FLOATCMP:\n\t\tcase ENC_FCMPE_S_FLOATCMP:\n\t\tcase ENC_FCMPE_SZ_FLOATCMP:\n\t\tcase ENC_FCMPE_D_FLOATCMP:\n\t\tcase ENC_FCMPE_DZ_FLOATCMP:\n\t\t\treturn ARM64_FCMPE;\n\t\tcase ENC_FCMUO_P_P_ZZ_:\n\t\t\treturn ARM64_FCMUO;\n\t\tcase ENC_FCPY_Z_P_I_:\n\t\t\treturn ARM64_FCPY;\n\t\tcase ENC_FCSEL_H_FLOATSEL:\n\t\tcase ENC_FCSEL_S_FLOATSEL:\n\t\tcase ENC_FCSEL_D_FLOATSEL:\n\t\t\treturn ARM64_FCSEL;\n\t\tcase ENC_FCVT_SH_FLOATDP1:\n\t\tcase ENC_FCVT_DH_FLOATDP1:\n\t\tcase ENC_FCVT_HS_FLOATDP1:\n\t\tcase ENC_FCVT_DS_FLOATDP1:\n\t\tcase ENC_FCVT_HD_FLOATDP1:\n\t\tcase ENC_FCVT_SD_FLOATDP1:\n\t\tcase ENC_FCVT_Z_P_Z_H2S:\n\t\tcase ENC_FCVT_Z_P_Z_H2D:\n\t\tcase ENC_FCVT_Z_P_Z_S2H:\n\t\tcase ENC_FCVT_Z_P_Z_S2D:\n\t\tcase ENC_FCVT_Z_P_Z_D2H:\n\t\tcase ENC_FCVT_Z_P_Z_D2S:\n\t\t\treturn ARM64_FCVT;\n\t\tcase ENC_FCVTAS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTAS_ASISDMISC_R:\n\t\tcase ENC_FCVTAS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTAS_ASIMDMISC_R:\n\t\tcase ENC_FCVTAS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTAS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTAS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTAS_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTAS;\n\t\tcase ENC_FCVTAU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTAU_ASISDMISC_R:\n\t\tcase ENC_FCVTAU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTAU_ASIMDMISC_R:\n\t\tcase ENC_FCVTAU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTAU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTAU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTAU_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTAU;\n\t\tcase ENC_FCVTL_ASIMDMISC_L:\n\t\t\treturn ARM64_FCVTL;\n\t\t//case ENC_FCVTL_ASIMDMISC_L:\n\t\t//\treturn ARM64_FCVTL2;\n\t\tcase ENC_FCVTLT_Z_P_Z_H2S:\n\t\tcase ENC_FCVTLT_Z_P_Z_S2D:\n\t\t\treturn ARM64_FCVTLT;\n\t\tcase ENC_FCVTMS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTMS_ASISDMISC_R:\n\t\tcase ENC_FCVTMS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTMS_ASIMDMISC_R:\n\t\tcase ENC_FCVTMS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTMS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTMS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTMS_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTMS;\n\t\tcase ENC_FCVTMU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTMU_ASISDMISC_R:\n\t\tcase ENC_FCVTMU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTMU_ASIMDMISC_R:\n\t\tcase ENC_FCVTMU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTMU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTMU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTMU_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTMU;\n\t\tcase ENC_FCVTN_ASIMDMISC_N:\n\t\t\treturn ARM64_FCVTN;\n\t\t//case ENC_FCVTN_ASIMDMISC_N:\n\t\t//\treturn ARM64_FCVTN2;\n\t\tcase ENC_FCVTNS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTNS_ASISDMISC_R:\n\t\tcase ENC_FCVTNS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTNS_ASIMDMISC_R:\n\t\tcase ENC_FCVTNS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTNS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTNS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTNS_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTNS;\n\t\tcase ENC_FCVTNT_Z_P_Z_S2H:\n\t\tcase ENC_FCVTNT_Z_P_Z_D2S:\n\t\t\treturn ARM64_FCVTNT;\n\t\tcase ENC_FCVTNU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTNU_ASISDMISC_R:\n\t\tcase ENC_FCVTNU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTNU_ASIMDMISC_R:\n\t\tcase ENC_FCVTNU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTNU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTNU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTNU_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTNU;\n\t\tcase ENC_FCVTPS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTPS_ASISDMISC_R:\n\t\tcase ENC_FCVTPS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTPS_ASIMDMISC_R:\n\t\tcase ENC_FCVTPS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTPS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTPS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTPS_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTPS;\n\t\tcase ENC_FCVTPU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTPU_ASISDMISC_R:\n\t\tcase ENC_FCVTPU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTPU_ASIMDMISC_R:\n\t\tcase ENC_FCVTPU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTPU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTPU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTPU_64D_FLOAT2INT:\n\t\t\treturn ARM64_FCVTPU;\n\t\tcase ENC_FCVTX_Z_P_Z_D2S:\n\t\t\treturn ARM64_FCVTX;\n\t\tcase ENC_FCVTXN_ASISDMISC_N:\n\t\tcase ENC_FCVTXN_ASIMDMISC_N:\n\t\t\treturn ARM64_FCVTXN;\n\t\t//case ENC_FCVTXN_ASIMDMISC_N:\n\t\t//\treturn ARM64_FCVTXN2;\n\t\tcase ENC_FCVTXNT_Z_P_Z_D2S:\n\t\t\treturn ARM64_FCVTXNT;\n\t\tcase ENC_FCVTZS_ASISDSHF_C:\n\t\tcase ENC_FCVTZS_ASIMDSHF_C:\n\t\tcase ENC_FCVTZS_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTZS_ASISDMISC_R:\n\t\tcase ENC_FCVTZS_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTZS_ASIMDMISC_R:\n\t\tcase ENC_FCVTZS_32H_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64H_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_32S_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64S_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_32D_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_64D_FLOAT2FIX:\n\t\tcase ENC_FCVTZS_32H_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64H_FLOAT2INT:\n\t\tcase ENC_FCVTZS_32S_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64S_FLOAT2INT:\n\t\tcase ENC_FCVTZS_32D_FLOAT2INT:\n\t\tcase ENC_FCVTZS_64D_FLOAT2INT:\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162H:\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162W:\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162X:\n\t\tcase ENC_FCVTZS_Z_P_Z_S2W:\n\t\tcase ENC_FCVTZS_Z_P_Z_S2X:\n\t\tcase ENC_FCVTZS_Z_P_Z_D2W:\n\t\tcase ENC_FCVTZS_Z_P_Z_D2X:\n\t\t\treturn ARM64_FCVTZS;\n\t\tcase ENC_FCVTZU_ASISDSHF_C:\n\t\tcase ENC_FCVTZU_ASIMDSHF_C:\n\t\tcase ENC_FCVTZU_ASISDMISCFP16_R:\n\t\tcase ENC_FCVTZU_ASISDMISC_R:\n\t\tcase ENC_FCVTZU_ASIMDMISCFP16_R:\n\t\tcase ENC_FCVTZU_ASIMDMISC_R:\n\t\tcase ENC_FCVTZU_32H_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64H_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32S_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64S_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32D_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_64D_FLOAT2FIX:\n\t\tcase ENC_FCVTZU_32H_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64H_FLOAT2INT:\n\t\tcase ENC_FCVTZU_32S_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64S_FLOAT2INT:\n\t\tcase ENC_FCVTZU_32D_FLOAT2INT:\n\t\tcase ENC_FCVTZU_64D_FLOAT2INT:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162H:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162W:\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162X:\n\t\tcase ENC_FCVTZU_Z_P_Z_S2W:\n\t\tcase ENC_FCVTZU_Z_P_Z_S2X:\n\t\tcase ENC_FCVTZU_Z_P_Z_D2W:\n\t\tcase ENC_FCVTZU_Z_P_Z_D2X:\n\t\t\treturn ARM64_FCVTZU;\n\t\tcase ENC_FDIV_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FDIV_ASIMDSAME_ONLY:\n\t\tcase ENC_FDIV_H_FLOATDP2:\n\t\tcase ENC_FDIV_S_FLOATDP2:\n\t\tcase ENC_FDIV_D_FLOATDP2:\n\t\tcase ENC_FDIV_Z_P_ZZ_:\n\t\t\treturn ARM64_FDIV;\n\t\tcase ENC_FDIVR_Z_P_ZZ_:\n\t\t\treturn ARM64_FDIVR;\n\t\tcase ENC_FDUP_Z_I_:\n\t\t\treturn ARM64_FDUP;\n\t\tcase ENC_FEXPA_Z_Z_:\n\t\t\treturn ARM64_FEXPA;\n\t\tcase ENC_FJCVTZS_32D_FLOAT2INT:\n\t\t\treturn ARM64_FJCVTZS;\n\t\tcase ENC_FLOGB_Z_P_Z_:\n\t\t\treturn ARM64_FLOGB;\n\t\tcase ENC_FMAD_Z_P_ZZZ_:\n\t\t\treturn ARM64_FMAD;\n\t\tcase ENC_FMADD_H_FLOATDP3:\n\t\tcase ENC_FMADD_S_FLOATDP3:\n\t\tcase ENC_FMADD_D_FLOATDP3:\n\t\t\treturn ARM64_FMADD;\n\t\tcase ENC_FMAX_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAX_H_FLOATDP2:\n\t\tcase ENC_FMAX_S_FLOATDP2:\n\t\tcase ENC_FMAX_D_FLOATDP2:\n\t\tcase ENC_FMAX_Z_P_ZS_:\n\t\tcase ENC_FMAX_Z_P_ZZ_:\n\t\t\treturn ARM64_FMAX;\n\t\tcase ENC_FMAXNM_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAXNM_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAXNM_H_FLOATDP2:\n\t\tcase ENC_FMAXNM_S_FLOATDP2:\n\t\tcase ENC_FMAXNM_D_FLOATDP2:\n\t\tcase ENC_FMAXNM_Z_P_ZS_:\n\t\tcase ENC_FMAXNM_Z_P_ZZ_:\n\t\t\treturn ARM64_FMAXNM;\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMAXNMP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAXNMP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAXNMP_Z_P_ZZ_:\n\t\t\treturn ARM64_FMAXNMP;\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMAXNMV_V_P_Z_:\n\t\t\treturn ARM64_FMAXNMV;\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMAXP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMAXP_Z_P_ZZ_:\n\t\t\treturn ARM64_FMAXP;\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMAXV_V_P_Z_:\n\t\t\treturn ARM64_FMAXV;\n\t\tcase ENC_FMIN_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMIN_ASIMDSAME_ONLY:\n\t\tcase ENC_FMIN_H_FLOATDP2:\n\t\tcase ENC_FMIN_S_FLOATDP2:\n\t\tcase ENC_FMIN_D_FLOATDP2:\n\t\tcase ENC_FMIN_Z_P_ZS_:\n\t\tcase ENC_FMIN_Z_P_ZZ_:\n\t\t\treturn ARM64_FMIN;\n\t\tcase ENC_FMINNM_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINNM_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINNM_H_FLOATDP2:\n\t\tcase ENC_FMINNM_S_FLOATDP2:\n\t\tcase ENC_FMINNM_D_FLOATDP2:\n\t\tcase ENC_FMINNM_Z_P_ZS_:\n\t\tcase ENC_FMINNM_Z_P_ZZ_:\n\t\t\treturn ARM64_FMINNM;\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMINNMP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINNMP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINNMP_Z_P_ZZ_:\n\t\t\treturn ARM64_FMINNMP;\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMINNMV_V_P_Z_:\n\t\t\treturn ARM64_FMINNMV;\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_H:\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_SD:\n\t\tcase ENC_FMINP_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_FMINP_Z_P_ZZ_:\n\t\t\treturn ARM64_FMINP;\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_H:\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_SD:\n\t\tcase ENC_FMINV_V_P_Z_:\n\t\t\treturn ARM64_FMINV;\n\t\tcase ENC_FMLA_ASISDELEM_RH_H:\n\t\tcase ENC_FMLA_ASISDELEM_R_SD:\n\t\tcase ENC_FMLA_ASIMDELEM_RH_H:\n\t\tcase ENC_FMLA_ASIMDELEM_R_SD:\n\t\tcase ENC_FMLA_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMLA_ASIMDSAME_ONLY:\n\t\tcase ENC_FMLA_Z_P_ZZZ_:\n\t\tcase ENC_FMLA_Z_ZZZI_H:\n\t\tcase ENC_FMLA_Z_ZZZI_S:\n\t\tcase ENC_FMLA_Z_ZZZI_D:\n\t\t\treturn ARM64_FMLA;\n\t\tcase ENC_FMLAL_ASIMDELEM_LH:\n\t\tcase ENC_FMLAL_ASIMDSAME_F:\n\t\t\treturn ARM64_FMLAL;\n\t\tcase ENC_FMLAL2_ASIMDELEM_LH:\n\t\tcase ENC_FMLAL2_ASIMDSAME_F:\n\t\t\treturn ARM64_FMLAL2;\n\t\tcase ENC_FMLALB_Z_ZZZ_:\n\t\tcase ENC_FMLALB_Z_ZZZI_S:\n\t\t\treturn ARM64_FMLALB;\n\t\tcase ENC_FMLALT_Z_ZZZ_:\n\t\tcase ENC_FMLALT_Z_ZZZI_S:\n\t\t\treturn ARM64_FMLALT;\n\t\tcase ENC_FMLS_ASISDELEM_RH_H:\n\t\tcase ENC_FMLS_ASISDELEM_R_SD:\n\t\tcase ENC_FMLS_ASIMDELEM_RH_H:\n\t\tcase ENC_FMLS_ASIMDELEM_R_SD:\n\t\tcase ENC_FMLS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMLS_ASIMDSAME_ONLY:\n\t\tcase ENC_FMLS_Z_P_ZZZ_:\n\t\tcase ENC_FMLS_Z_ZZZI_H:\n\t\tcase ENC_FMLS_Z_ZZZI_S:\n\t\tcase ENC_FMLS_Z_ZZZI_D:\n\t\t\treturn ARM64_FMLS;\n\t\tcase ENC_FMLSL_ASIMDELEM_LH:\n\t\tcase ENC_FMLSL_ASIMDSAME_F:\n\t\t\treturn ARM64_FMLSL;\n\t\tcase ENC_FMLSL2_ASIMDELEM_LH:\n\t\tcase ENC_FMLSL2_ASIMDSAME_F:\n\t\t\treturn ARM64_FMLSL2;\n\t\tcase ENC_FMLSLB_Z_ZZZ_:\n\t\tcase ENC_FMLSLB_Z_ZZZI_S:\n\t\t\treturn ARM64_FMLSLB;\n\t\tcase ENC_FMLSLT_Z_ZZZ_:\n\t\tcase ENC_FMLSLT_Z_ZZZI_S:\n\t\t\treturn ARM64_FMLSLT;\n\t\tcase ENC_FMMLA_Z_ZZZ_S:\n\t\tcase ENC_FMMLA_Z_ZZZ_D:\n\t\t\treturn ARM64_FMMLA;\n\t\tcase ENC_FMOPA_ZA32_PP_ZZ_16:\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_FMOPA;\n\t\tcase ENC_FMOPS_ZA32_PP_ZZ_16:\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_FMOPS;\n\t\tcase ENC_FMOV_ASIMDIMM_H_H:\n\t\tcase ENC_FMOV_ASIMDIMM_S_S:\n\t\tcase ENC_FMOV_ASIMDIMM_D2_D:\n\t\tcase ENC_FMOV_CPY_Z_P_I_:\n\t\tcase ENC_FMOV_DUP_Z_I_:\n\t\tcase ENC_FMOV_FCPY_Z_P_I_:\n\t\tcase ENC_FMOV_FDUP_Z_I_:\n\t\tcase ENC_FMOV_H_FLOATDP1:\n\t\tcase ENC_FMOV_S_FLOATDP1:\n\t\tcase ENC_FMOV_D_FLOATDP1:\n\t\tcase ENC_FMOV_32H_FLOAT2INT:\n\t\tcase ENC_FMOV_64H_FLOAT2INT:\n\t\tcase ENC_FMOV_H32_FLOAT2INT:\n\t\tcase ENC_FMOV_S32_FLOAT2INT:\n\t\tcase ENC_FMOV_32S_FLOAT2INT:\n\t\tcase ENC_FMOV_H64_FLOAT2INT:\n\t\tcase ENC_FMOV_D64_FLOAT2INT:\n\t\tcase ENC_FMOV_V64I_FLOAT2INT:\n\t\tcase ENC_FMOV_64D_FLOAT2INT:\n\t\tcase ENC_FMOV_64VX_FLOAT2INT:\n\t\tcase ENC_FMOV_H_FLOATIMM:\n\t\tcase ENC_FMOV_S_FLOATIMM:\n\t\tcase ENC_FMOV_D_FLOATIMM:\n\t\t\treturn ARM64_FMOV;\n\t\tcase ENC_FMSB_Z_P_ZZZ_:\n\t\t\treturn ARM64_FMSB;\n\t\tcase ENC_FMSUB_H_FLOATDP3:\n\t\tcase ENC_FMSUB_S_FLOATDP3:\n\t\tcase ENC_FMSUB_D_FLOATDP3:\n\t\t\treturn ARM64_FMSUB;\n\t\tcase ENC_FMUL_ASISDELEM_RH_H:\n\t\tcase ENC_FMUL_ASISDELEM_R_SD:\n\t\tcase ENC_FMUL_ASIMDELEM_RH_H:\n\t\tcase ENC_FMUL_ASIMDELEM_R_SD:\n\t\tcase ENC_FMUL_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMUL_ASIMDSAME_ONLY:\n\t\tcase ENC_FMUL_H_FLOATDP2:\n\t\tcase ENC_FMUL_S_FLOATDP2:\n\t\tcase ENC_FMUL_D_FLOATDP2:\n\t\tcase ENC_FMUL_Z_P_ZS_:\n\t\tcase ENC_FMUL_Z_P_ZZ_:\n\t\tcase ENC_FMUL_Z_ZZ_:\n\t\tcase ENC_FMUL_Z_ZZI_H:\n\t\tcase ENC_FMUL_Z_ZZI_S:\n\t\tcase ENC_FMUL_Z_ZZI_D:\n\t\t\treturn ARM64_FMUL;\n\t\tcase ENC_FMULX_ASISDELEM_RH_H:\n\t\tcase ENC_FMULX_ASISDELEM_R_SD:\n\t\tcase ENC_FMULX_ASIMDELEM_RH_H:\n\t\tcase ENC_FMULX_ASIMDELEM_R_SD:\n\t\tcase ENC_FMULX_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FMULX_ASISDSAME_ONLY:\n\t\tcase ENC_FMULX_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FMULX_ASIMDSAME_ONLY:\n\t\tcase ENC_FMULX_Z_P_ZZ_:\n\t\t\treturn ARM64_FMULX;\n\t\tcase ENC_FNEG_ASIMDMISCFP16_R:\n\t\tcase ENC_FNEG_ASIMDMISC_R:\n\t\tcase ENC_FNEG_H_FLOATDP1:\n\t\tcase ENC_FNEG_S_FLOATDP1:\n\t\tcase ENC_FNEG_D_FLOATDP1:\n\t\tcase ENC_FNEG_Z_P_Z_:\n\t\t\treturn ARM64_FNEG;\n\t\tcase ENC_FNMAD_Z_P_ZZZ_:\n\t\t\treturn ARM64_FNMAD;\n\t\tcase ENC_FNMADD_H_FLOATDP3:\n\t\tcase ENC_FNMADD_S_FLOATDP3:\n\t\tcase ENC_FNMADD_D_FLOATDP3:\n\t\t\treturn ARM64_FNMADD;\n\t\tcase ENC_FNMLA_Z_P_ZZZ_:\n\t\t\treturn ARM64_FNMLA;\n\t\tcase ENC_FNMLS_Z_P_ZZZ_:\n\t\t\treturn ARM64_FNMLS;\n\t\tcase ENC_FNMSB_Z_P_ZZZ_:\n\t\t\treturn ARM64_FNMSB;\n\t\tcase ENC_FNMSUB_H_FLOATDP3:\n\t\tcase ENC_FNMSUB_S_FLOATDP3:\n\t\tcase ENC_FNMSUB_D_FLOATDP3:\n\t\t\treturn ARM64_FNMSUB;\n\t\tcase ENC_FNMUL_H_FLOATDP2:\n\t\tcase ENC_FNMUL_S_FLOATDP2:\n\t\tcase ENC_FNMUL_D_FLOATDP2:\n\t\t\treturn ARM64_FNMUL;\n\t\tcase ENC_FRECPE_ASISDMISCFP16_R:\n\t\tcase ENC_FRECPE_ASISDMISC_R:\n\t\tcase ENC_FRECPE_ASIMDMISCFP16_R:\n\t\tcase ENC_FRECPE_ASIMDMISC_R:\n\t\tcase ENC_FRECPE_Z_Z_:\n\t\t\treturn ARM64_FRECPE;\n\t\tcase ENC_FRECPS_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FRECPS_ASISDSAME_ONLY:\n\t\tcase ENC_FRECPS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FRECPS_ASIMDSAME_ONLY:\n\t\tcase ENC_FRECPS_Z_ZZ_:\n\t\t\treturn ARM64_FRECPS;\n\t\tcase ENC_FRECPX_ASISDMISCFP16_R:\n\t\tcase ENC_FRECPX_ASISDMISC_R:\n\t\tcase ENC_FRECPX_Z_P_Z_:\n\t\t\treturn ARM64_FRECPX;\n\t\tcase ENC_FRINT32X_ASIMDMISC_R:\n\t\tcase ENC_FRINT32X_S_FLOATDP1:\n\t\tcase ENC_FRINT32X_D_FLOATDP1:\n\t\t\treturn ARM64_FRINT32X;\n\t\tcase ENC_FRINT32Z_ASIMDMISC_R:\n\t\tcase ENC_FRINT32Z_S_FLOATDP1:\n\t\tcase ENC_FRINT32Z_D_FLOATDP1:\n\t\t\treturn ARM64_FRINT32Z;\n\t\tcase ENC_FRINT64X_ASIMDMISC_R:\n\t\tcase ENC_FRINT64X_S_FLOATDP1:\n\t\tcase ENC_FRINT64X_D_FLOATDP1:\n\t\t\treturn ARM64_FRINT64X;\n\t\tcase ENC_FRINT64Z_ASIMDMISC_R:\n\t\tcase ENC_FRINT64Z_S_FLOATDP1:\n\t\tcase ENC_FRINT64Z_D_FLOATDP1:\n\t\t\treturn ARM64_FRINT64Z;\n\t\tcase ENC_FRINTA_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTA_ASIMDMISC_R:\n\t\tcase ENC_FRINTA_H_FLOATDP1:\n\t\tcase ENC_FRINTA_S_FLOATDP1:\n\t\tcase ENC_FRINTA_D_FLOATDP1:\n\t\tcase ENC_FRINTA_Z_P_Z_:\n\t\t\treturn ARM64_FRINTA;\n\t\tcase ENC_FRINTI_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTI_ASIMDMISC_R:\n\t\tcase ENC_FRINTI_H_FLOATDP1:\n\t\tcase ENC_FRINTI_S_FLOATDP1:\n\t\tcase ENC_FRINTI_D_FLOATDP1:\n\t\tcase ENC_FRINTI_Z_P_Z_:\n\t\t\treturn ARM64_FRINTI;\n\t\tcase ENC_FRINTM_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTM_ASIMDMISC_R:\n\t\tcase ENC_FRINTM_H_FLOATDP1:\n\t\tcase ENC_FRINTM_S_FLOATDP1:\n\t\tcase ENC_FRINTM_D_FLOATDP1:\n\t\tcase ENC_FRINTM_Z_P_Z_:\n\t\t\treturn ARM64_FRINTM;\n\t\tcase ENC_FRINTN_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTN_ASIMDMISC_R:\n\t\tcase ENC_FRINTN_H_FLOATDP1:\n\t\tcase ENC_FRINTN_S_FLOATDP1:\n\t\tcase ENC_FRINTN_D_FLOATDP1:\n\t\tcase ENC_FRINTN_Z_P_Z_:\n\t\t\treturn ARM64_FRINTN;\n\t\tcase ENC_FRINTP_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTP_ASIMDMISC_R:\n\t\tcase ENC_FRINTP_H_FLOATDP1:\n\t\tcase ENC_FRINTP_S_FLOATDP1:\n\t\tcase ENC_FRINTP_D_FLOATDP1:\n\t\tcase ENC_FRINTP_Z_P_Z_:\n\t\t\treturn ARM64_FRINTP;\n\t\tcase ENC_FRINTX_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTX_ASIMDMISC_R:\n\t\tcase ENC_FRINTX_H_FLOATDP1:\n\t\tcase ENC_FRINTX_S_FLOATDP1:\n\t\tcase ENC_FRINTX_D_FLOATDP1:\n\t\tcase ENC_FRINTX_Z_P_Z_:\n\t\t\treturn ARM64_FRINTX;\n\t\tcase ENC_FRINTZ_ASIMDMISCFP16_R:\n\t\tcase ENC_FRINTZ_ASIMDMISC_R:\n\t\tcase ENC_FRINTZ_H_FLOATDP1:\n\t\tcase ENC_FRINTZ_S_FLOATDP1:\n\t\tcase ENC_FRINTZ_D_FLOATDP1:\n\t\tcase ENC_FRINTZ_Z_P_Z_:\n\t\t\treturn ARM64_FRINTZ;\n\t\tcase ENC_FRSQRTE_ASISDMISCFP16_R:\n\t\tcase ENC_FRSQRTE_ASISDMISC_R:\n\t\tcase ENC_FRSQRTE_ASIMDMISCFP16_R:\n\t\tcase ENC_FRSQRTE_ASIMDMISC_R:\n\t\tcase ENC_FRSQRTE_Z_Z_:\n\t\t\treturn ARM64_FRSQRTE;\n\t\tcase ENC_FRSQRTS_ASISDSAMEFP16_ONLY:\n\t\tcase ENC_FRSQRTS_ASISDSAME_ONLY:\n\t\tcase ENC_FRSQRTS_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FRSQRTS_ASIMDSAME_ONLY:\n\t\tcase ENC_FRSQRTS_Z_ZZ_:\n\t\t\treturn ARM64_FRSQRTS;\n\t\tcase ENC_FSCALE_Z_P_ZZ_:\n\t\t\treturn ARM64_FSCALE;\n\t\tcase ENC_FSQRT_ASIMDMISCFP16_R:\n\t\tcase ENC_FSQRT_ASIMDMISC_R:\n\t\tcase ENC_FSQRT_H_FLOATDP1:\n\t\tcase ENC_FSQRT_S_FLOATDP1:\n\t\tcase ENC_FSQRT_D_FLOATDP1:\n\t\tcase ENC_FSQRT_Z_P_Z_:\n\t\t\treturn ARM64_FSQRT;\n\t\tcase ENC_FSUB_ASIMDSAMEFP16_ONLY:\n\t\tcase ENC_FSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_FSUB_H_FLOATDP2:\n\t\tcase ENC_FSUB_S_FLOATDP2:\n\t\tcase ENC_FSUB_D_FLOATDP2:\n\t\tcase ENC_FSUB_Z_P_ZS_:\n\t\tcase ENC_FSUB_Z_P_ZZ_:\n\t\tcase ENC_FSUB_Z_ZZ_:\n\t\t\treturn ARM64_FSUB;\n\t\tcase ENC_FSUBR_Z_P_ZS_:\n\t\tcase ENC_FSUBR_Z_P_ZZ_:\n\t\t\treturn ARM64_FSUBR;\n\t\tcase ENC_FTMAD_Z_ZZI_:\n\t\t\treturn ARM64_FTMAD;\n\t\tcase ENC_FTSMUL_Z_ZZ_:\n\t\t\treturn ARM64_FTSMUL;\n\t\tcase ENC_FTSSEL_Z_ZZ_:\n\t\t\treturn ARM64_FTSSEL;\n\t\tcase ENC_GMI_64G_DP_2SRC:\n\t\t\treturn ARM64_GMI;\n\t\tcase ENC_HINT_HM_HINTS:\n\t\t\treturn ARM64_HINT;\n\t\tcase ENC_HISTCNT_Z_P_ZZ_:\n\t\t\treturn ARM64_HISTCNT;\n\t\tcase ENC_HISTSEG_Z_ZZ_:\n\t\t\treturn ARM64_HISTSEG;\n\t\tcase ENC_HLT_EX_EXCEPTION:\n\t\t\treturn ARM64_HLT;\n\t\tcase ENC_HVC_EX_EXCEPTION:\n\t\t\treturn ARM64_HVC;\n\t\tcase ENC_IC_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_IC;\n\t\tcase ENC_INCB_R_RS_:\n\t\t\treturn ARM64_INCB;\n\t\tcase ENC_INCD_R_RS_:\n\t\tcase ENC_INCD_Z_ZS_:\n\t\t\treturn ARM64_INCD;\n\t\tcase ENC_INCH_R_RS_:\n\t\tcase ENC_INCH_Z_ZS_:\n\t\t\treturn ARM64_INCH;\n\t\tcase ENC_INCP_R_P_R_:\n\t\tcase ENC_INCP_Z_P_Z_:\n\t\t\treturn ARM64_INCP;\n\t\tcase ENC_INCW_R_RS_:\n\t\tcase ENC_INCW_Z_ZS_:\n\t\t\treturn ARM64_INCW;\n\t\tcase ENC_INDEX_Z_II_:\n\t\tcase ENC_INDEX_Z_IR_:\n\t\tcase ENC_INDEX_Z_RI_:\n\t\tcase ENC_INDEX_Z_RR_:\n\t\t\treturn ARM64_INDEX;\n\t\tcase ENC_INS_ASIMDINS_IV_V:\n\t\tcase ENC_INS_ASIMDINS_IR_R:\n\t\t\treturn ARM64_INS;\n\t\tcase ENC_INSR_Z_R_:\n\t\tcase ENC_INSR_Z_V_:\n\t\t\treturn ARM64_INSR;\n\t\tcase ENC_IRG_64I_DP_2SRC:\n\t\t\treturn ARM64_IRG;\n\t\tcase ENC_ISB_BI_BARRIERS:\n\t\t\treturn ARM64_ISB;\n\t\tcase ENC_LASTA_R_P_Z_:\n\t\tcase ENC_LASTA_V_P_Z_:\n\t\t\treturn ARM64_LASTA;\n\t\tcase ENC_LASTB_R_P_Z_:\n\t\tcase ENC_LASTB_V_P_Z_:\n\t\t\treturn ARM64_LASTB;\n\t\tcase ENC_LD1_ASISDLSE_R1_1V:\n\t\tcase ENC_LD1_ASISDLSE_R2_2V:\n\t\tcase ENC_LD1_ASISDLSE_R3_3V:\n\t\tcase ENC_LD1_ASISDLSE_R4_4V:\n\t\tcase ENC_LD1_ASISDLSEP_I1_I1:\n\t\tcase ENC_LD1_ASISDLSEP_R1_R1:\n\t\tcase ENC_LD1_ASISDLSEP_I2_I2:\n\t\tcase ENC_LD1_ASISDLSEP_R2_R2:\n\t\tcase ENC_LD1_ASISDLSEP_I3_I3:\n\t\tcase ENC_LD1_ASISDLSEP_R3_R3:\n\t\tcase ENC_LD1_ASISDLSEP_I4_I4:\n\t\tcase ENC_LD1_ASISDLSEP_R4_R4:\n\t\tcase ENC_LD1_ASISDLSO_B1_1B:\n\t\tcase ENC_LD1_ASISDLSO_H1_1H:\n\t\tcase ENC_LD1_ASISDLSO_S1_1S:\n\t\tcase ENC_LD1_ASISDLSO_D1_1D:\n\t\tcase ENC_LD1_ASISDLSOP_B1_I1B:\n\t\tcase ENC_LD1_ASISDLSOP_BX1_R1B:\n\t\tcase ENC_LD1_ASISDLSOP_H1_I1H:\n\t\tcase ENC_LD1_ASISDLSOP_HX1_R1H:\n\t\tcase ENC_LD1_ASISDLSOP_S1_I1S:\n\t\tcase ENC_LD1_ASISDLSOP_SX1_R1S:\n\t\tcase ENC_LD1_ASISDLSOP_D1_I1D:\n\t\tcase ENC_LD1_ASISDLSOP_DX1_R1D:\n\t\t\treturn ARM64_LD1;\n\t\tcase ENC_LD1B_Z_P_AI_S:\n\t\tcase ENC_LD1B_Z_P_AI_D:\n\t\tcase ENC_LD1B_Z_P_BI_U8:\n\t\tcase ENC_LD1B_Z_P_BI_U16:\n\t\tcase ENC_LD1B_Z_P_BI_U32:\n\t\tcase ENC_LD1B_Z_P_BI_U64:\n\t\tcase ENC_LD1B_Z_P_BR_U8:\n\t\tcase ENC_LD1B_Z_P_BR_U16:\n\t\tcase ENC_LD1B_Z_P_BR_U32:\n\t\tcase ENC_LD1B_Z_P_BR_U64:\n\t\tcase ENC_LD1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1B_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1B_ZA_P_RRR_:\n\t\t\treturn ARM64_LD1B;\n\t\tcase ENC_LD1D_Z_P_AI_D:\n\t\tcase ENC_LD1D_Z_P_BI_U64:\n\t\tcase ENC_LD1D_Z_P_BR_U64:\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1D_ZA_P_RRR_:\n\t\t\treturn ARM64_LD1D;\n\t\tcase ENC_LD1H_Z_P_AI_S:\n\t\tcase ENC_LD1H_Z_P_AI_D:\n\t\tcase ENC_LD1H_Z_P_BI_U16:\n\t\tcase ENC_LD1H_Z_P_BI_U32:\n\t\tcase ENC_LD1H_Z_P_BI_U64:\n\t\tcase ENC_LD1H_Z_P_BR_U16:\n\t\tcase ENC_LD1H_Z_P_BR_U32:\n\t\tcase ENC_LD1H_Z_P_BR_U64:\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1H_ZA_P_RRR_:\n\t\t\treturn ARM64_LD1H;\n\t\tcase ENC_LD1Q_ZA_P_RRR_:\n\t\t\treturn ARM64_LD1Q;\n\t\tcase ENC_LD1R_ASISDLSO_R1:\n\t\tcase ENC_LD1R_ASISDLSOP_R1_I:\n\t\tcase ENC_LD1R_ASISDLSOP_RX1_R:\n\t\t\treturn ARM64_LD1R;\n\t\tcase ENC_LD1RB_Z_P_BI_U8:\n\t\tcase ENC_LD1RB_Z_P_BI_U16:\n\t\tcase ENC_LD1RB_Z_P_BI_U32:\n\t\tcase ENC_LD1RB_Z_P_BI_U64:\n\t\t\treturn ARM64_LD1RB;\n\t\tcase ENC_LD1RD_Z_P_BI_U64:\n\t\t\treturn ARM64_LD1RD;\n\t\tcase ENC_LD1RH_Z_P_BI_U16:\n\t\tcase ENC_LD1RH_Z_P_BI_U32:\n\t\tcase ENC_LD1RH_Z_P_BI_U64:\n\t\t\treturn ARM64_LD1RH;\n\t\tcase ENC_LD1ROB_Z_P_BI_U8:\n\t\tcase ENC_LD1ROB_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1ROB;\n\t\tcase ENC_LD1ROD_Z_P_BI_U64:\n\t\tcase ENC_LD1ROD_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1ROD;\n\t\tcase ENC_LD1ROH_Z_P_BI_U16:\n\t\tcase ENC_LD1ROH_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1ROH;\n\t\tcase ENC_LD1ROW_Z_P_BI_U32:\n\t\tcase ENC_LD1ROW_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1ROW;\n\t\tcase ENC_LD1RQB_Z_P_BI_U8:\n\t\tcase ENC_LD1RQB_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1RQB;\n\t\tcase ENC_LD1RQD_Z_P_BI_U64:\n\t\tcase ENC_LD1RQD_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1RQD;\n\t\tcase ENC_LD1RQH_Z_P_BI_U16:\n\t\tcase ENC_LD1RQH_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1RQH;\n\t\tcase ENC_LD1RQW_Z_P_BI_U32:\n\t\tcase ENC_LD1RQW_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD1RQW;\n\t\tcase ENC_LD1RSB_Z_P_BI_S16:\n\t\tcase ENC_LD1RSB_Z_P_BI_S32:\n\t\tcase ENC_LD1RSB_Z_P_BI_S64:\n\t\t\treturn ARM64_LD1RSB;\n\t\tcase ENC_LD1RSH_Z_P_BI_S32:\n\t\tcase ENC_LD1RSH_Z_P_BI_S64:\n\t\t\treturn ARM64_LD1RSH;\n\t\tcase ENC_LD1RSW_Z_P_BI_S64:\n\t\t\treturn ARM64_LD1RSW;\n\t\tcase ENC_LD1RW_Z_P_BI_U32:\n\t\tcase ENC_LD1RW_Z_P_BI_U64:\n\t\t\treturn ARM64_LD1RW;\n\t\tcase ENC_LD1SB_Z_P_AI_S:\n\t\tcase ENC_LD1SB_Z_P_AI_D:\n\t\tcase ENC_LD1SB_Z_P_BI_S16:\n\t\tcase ENC_LD1SB_Z_P_BI_S32:\n\t\tcase ENC_LD1SB_Z_P_BI_S64:\n\t\tcase ENC_LD1SB_Z_P_BR_S16:\n\t\tcase ENC_LD1SB_Z_P_BR_S32:\n\t\tcase ENC_LD1SB_Z_P_BR_S64:\n\t\tcase ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1SB_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LD1SB;\n\t\tcase ENC_LD1SH_Z_P_AI_S:\n\t\tcase ENC_LD1SH_Z_P_AI_D:\n\t\tcase ENC_LD1SH_Z_P_BI_S32:\n\t\tcase ENC_LD1SH_Z_P_BI_S64:\n\t\tcase ENC_LD1SH_Z_P_BR_S32:\n\t\tcase ENC_LD1SH_Z_P_BR_S64:\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LD1SH;\n\t\tcase ENC_LD1SW_Z_P_AI_D:\n\t\tcase ENC_LD1SW_Z_P_BI_S64:\n\t\tcase ENC_LD1SW_Z_P_BR_S64:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LD1SW;\n\t\tcase ENC_LD1W_Z_P_AI_S:\n\t\tcase ENC_LD1W_Z_P_AI_D:\n\t\tcase ENC_LD1W_Z_P_BI_U32:\n\t\tcase ENC_LD1W_Z_P_BI_U64:\n\t\tcase ENC_LD1W_Z_P_BR_U32:\n\t\tcase ENC_LD1W_Z_P_BR_U64:\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_LD1W_ZA_P_RRR_:\n\t\t\treturn ARM64_LD1W;\n\t\tcase ENC_LD2_ASISDLSE_R2:\n\t\tcase ENC_LD2_ASISDLSEP_I2_I:\n\t\tcase ENC_LD2_ASISDLSEP_R2_R:\n\t\tcase ENC_LD2_ASISDLSO_B2_2B:\n\t\tcase ENC_LD2_ASISDLSO_H2_2H:\n\t\tcase ENC_LD2_ASISDLSO_S2_2S:\n\t\tcase ENC_LD2_ASISDLSO_D2_2D:\n\t\tcase ENC_LD2_ASISDLSOP_B2_I2B:\n\t\tcase ENC_LD2_ASISDLSOP_BX2_R2B:\n\t\tcase ENC_LD2_ASISDLSOP_H2_I2H:\n\t\tcase ENC_LD2_ASISDLSOP_HX2_R2H:\n\t\tcase ENC_LD2_ASISDLSOP_S2_I2S:\n\t\tcase ENC_LD2_ASISDLSOP_SX2_R2S:\n\t\tcase ENC_LD2_ASISDLSOP_D2_I2D:\n\t\tcase ENC_LD2_ASISDLSOP_DX2_R2D:\n\t\t\treturn ARM64_LD2;\n\t\tcase ENC_LD2B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD2B;\n\t\tcase ENC_LD2D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD2D;\n\t\tcase ENC_LD2H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD2H;\n\t\tcase ENC_LD2R_ASISDLSO_R2:\n\t\tcase ENC_LD2R_ASISDLSOP_R2_I:\n\t\tcase ENC_LD2R_ASISDLSOP_RX2_R:\n\t\t\treturn ARM64_LD2R;\n\t\tcase ENC_LD2W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD2W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD2W;\n\t\tcase ENC_LD3_ASISDLSE_R3:\n\t\tcase ENC_LD3_ASISDLSEP_I3_I:\n\t\tcase ENC_LD3_ASISDLSEP_R3_R:\n\t\tcase ENC_LD3_ASISDLSO_B3_3B:\n\t\tcase ENC_LD3_ASISDLSO_H3_3H:\n\t\tcase ENC_LD3_ASISDLSO_S3_3S:\n\t\tcase ENC_LD3_ASISDLSO_D3_3D:\n\t\tcase ENC_LD3_ASISDLSOP_B3_I3B:\n\t\tcase ENC_LD3_ASISDLSOP_BX3_R3B:\n\t\tcase ENC_LD3_ASISDLSOP_H3_I3H:\n\t\tcase ENC_LD3_ASISDLSOP_HX3_R3H:\n\t\tcase ENC_LD3_ASISDLSOP_S3_I3S:\n\t\tcase ENC_LD3_ASISDLSOP_SX3_R3S:\n\t\tcase ENC_LD3_ASISDLSOP_D3_I3D:\n\t\tcase ENC_LD3_ASISDLSOP_DX3_R3D:\n\t\t\treturn ARM64_LD3;\n\t\tcase ENC_LD3B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD3B;\n\t\tcase ENC_LD3D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD3D;\n\t\tcase ENC_LD3H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD3H;\n\t\tcase ENC_LD3R_ASISDLSO_R3:\n\t\tcase ENC_LD3R_ASISDLSOP_R3_I:\n\t\tcase ENC_LD3R_ASISDLSOP_RX3_R:\n\t\t\treturn ARM64_LD3R;\n\t\tcase ENC_LD3W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD3W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD3W;\n\t\tcase ENC_LD4_ASISDLSE_R4:\n\t\tcase ENC_LD4_ASISDLSEP_I4_I:\n\t\tcase ENC_LD4_ASISDLSEP_R4_R:\n\t\tcase ENC_LD4_ASISDLSO_B4_4B:\n\t\tcase ENC_LD4_ASISDLSO_H4_4H:\n\t\tcase ENC_LD4_ASISDLSO_S4_4S:\n\t\tcase ENC_LD4_ASISDLSO_D4_4D:\n\t\tcase ENC_LD4_ASISDLSOP_B4_I4B:\n\t\tcase ENC_LD4_ASISDLSOP_BX4_R4B:\n\t\tcase ENC_LD4_ASISDLSOP_H4_I4H:\n\t\tcase ENC_LD4_ASISDLSOP_HX4_R4H:\n\t\tcase ENC_LD4_ASISDLSOP_S4_I4S:\n\t\tcase ENC_LD4_ASISDLSOP_SX4_R4S:\n\t\tcase ENC_LD4_ASISDLSOP_D4_I4D:\n\t\tcase ENC_LD4_ASISDLSOP_DX4_R4D:\n\t\t\treturn ARM64_LD4;\n\t\tcase ENC_LD4B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD4B;\n\t\tcase ENC_LD4D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD4D;\n\t\tcase ENC_LD4H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD4H;\n\t\tcase ENC_LD4R_ASISDLSO_R4:\n\t\tcase ENC_LD4R_ASISDLSOP_R4_I:\n\t\tcase ENC_LD4R_ASISDLSOP_RX4_R:\n\t\t\treturn ARM64_LD4R;\n\t\tcase ENC_LD4W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LD4W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LD4W;\n\t\tcase ENC_LD64B_64L_MEMOP:\n\t\t\treturn ARM64_LD64B;\n\t\tcase ENC_LDADD_32_MEMOP:\n\t\tcase ENC_LDADD_64_MEMOP:\n\t\t\treturn ARM64_LDADD;\n\t\tcase ENC_LDADDA_32_MEMOP:\n\t\tcase ENC_LDADDA_64_MEMOP:\n\t\t\treturn ARM64_LDADDA;\n\t\tcase ENC_LDADDAB_32_MEMOP:\n\t\t\treturn ARM64_LDADDAB;\n\t\tcase ENC_LDADDAH_32_MEMOP:\n\t\t\treturn ARM64_LDADDAH;\n\t\tcase ENC_LDADDAL_32_MEMOP:\n\t\tcase ENC_LDADDAL_64_MEMOP:\n\t\t\treturn ARM64_LDADDAL;\n\t\tcase ENC_LDADDALB_32_MEMOP:\n\t\t\treturn ARM64_LDADDALB;\n\t\tcase ENC_LDADDALH_32_MEMOP:\n\t\t\treturn ARM64_LDADDALH;\n\t\tcase ENC_LDADDB_32_MEMOP:\n\t\t\treturn ARM64_LDADDB;\n\t\tcase ENC_LDADDH_32_MEMOP:\n\t\t\treturn ARM64_LDADDH;\n\t\tcase ENC_LDADDL_32_MEMOP:\n\t\tcase ENC_LDADDL_64_MEMOP:\n\t\t\treturn ARM64_LDADDL;\n\t\tcase ENC_LDADDLB_32_MEMOP:\n\t\t\treturn ARM64_LDADDLB;\n\t\tcase ENC_LDADDLH_32_MEMOP:\n\t\t\treturn ARM64_LDADDLH;\n\t\tcase ENC_LDAPR_32L_MEMOP:\n\t\tcase ENC_LDAPR_64L_MEMOP:\n\t\t\treturn ARM64_LDAPR;\n\t\tcase ENC_LDAPRB_32L_MEMOP:\n\t\t\treturn ARM64_LDAPRB;\n\t\tcase ENC_LDAPRH_32L_MEMOP:\n\t\t\treturn ARM64_LDAPRH;\n\t\tcase ENC_LDAPUR_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPUR_64_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPUR;\n\t\tcase ENC_LDAPURB_32_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPURB;\n\t\tcase ENC_LDAPURH_32_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPURH;\n\t\tcase ENC_LDAPURSB_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSB_64_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPURSB;\n\t\tcase ENC_LDAPURSH_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_LDAPURSH_64_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPURSH;\n\t\tcase ENC_LDAPURSW_64_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_LDAPURSW;\n\t\tcase ENC_LDAR_LR32_LDSTORD:\n\t\tcase ENC_LDAR_LR64_LDSTORD:\n\t\t\treturn ARM64_LDAR;\n\t\tcase ENC_LDARB_LR32_LDSTORD:\n\t\t\treturn ARM64_LDARB;\n\t\tcase ENC_LDARH_LR32_LDSTORD:\n\t\t\treturn ARM64_LDARH;\n\t\tcase ENC_LDAXP_LP32_LDSTEXCLP:\n\t\tcase ENC_LDAXP_LP64_LDSTEXCLP:\n\t\t\treturn ARM64_LDAXP;\n\t\tcase ENC_LDAXR_LR32_LDSTEXCLR:\n\t\tcase ENC_LDAXR_LR64_LDSTEXCLR:\n\t\t\treturn ARM64_LDAXR;\n\t\tcase ENC_LDAXRB_LR32_LDSTEXCLR:\n\t\t\treturn ARM64_LDAXRB;\n\t\tcase ENC_LDAXRH_LR32_LDSTEXCLR:\n\t\t\treturn ARM64_LDAXRH;\n\t\tcase ENC_LDCLR_32_MEMOP:\n\t\tcase ENC_LDCLR_64_MEMOP:\n\t\t\treturn ARM64_LDCLR;\n\t\tcase ENC_LDCLRA_32_MEMOP:\n\t\tcase ENC_LDCLRA_64_MEMOP:\n\t\t\treturn ARM64_LDCLRA;\n\t\tcase ENC_LDCLRAB_32_MEMOP:\n\t\t\treturn ARM64_LDCLRAB;\n\t\tcase ENC_LDCLRAH_32_MEMOP:\n\t\t\treturn ARM64_LDCLRAH;\n\t\tcase ENC_LDCLRAL_32_MEMOP:\n\t\tcase ENC_LDCLRAL_64_MEMOP:\n\t\t\treturn ARM64_LDCLRAL;\n\t\tcase ENC_LDCLRALB_32_MEMOP:\n\t\t\treturn ARM64_LDCLRALB;\n\t\tcase ENC_LDCLRALH_32_MEMOP:\n\t\t\treturn ARM64_LDCLRALH;\n\t\tcase ENC_LDCLRB_32_MEMOP:\n\t\t\treturn ARM64_LDCLRB;\n\t\tcase ENC_LDCLRH_32_MEMOP:\n\t\t\treturn ARM64_LDCLRH;\n\t\tcase ENC_LDCLRL_32_MEMOP:\n\t\tcase ENC_LDCLRL_64_MEMOP:\n\t\t\treturn ARM64_LDCLRL;\n\t\tcase ENC_LDCLRLB_32_MEMOP:\n\t\t\treturn ARM64_LDCLRLB;\n\t\tcase ENC_LDCLRLH_32_MEMOP:\n\t\t\treturn ARM64_LDCLRLH;\n\t\tcase ENC_LDEOR_32_MEMOP:\n\t\tcase ENC_LDEOR_64_MEMOP:\n\t\t\treturn ARM64_LDEOR;\n\t\tcase ENC_LDEORA_32_MEMOP:\n\t\tcase ENC_LDEORA_64_MEMOP:\n\t\t\treturn ARM64_LDEORA;\n\t\tcase ENC_LDEORAB_32_MEMOP:\n\t\t\treturn ARM64_LDEORAB;\n\t\tcase ENC_LDEORAH_32_MEMOP:\n\t\t\treturn ARM64_LDEORAH;\n\t\tcase ENC_LDEORAL_32_MEMOP:\n\t\tcase ENC_LDEORAL_64_MEMOP:\n\t\t\treturn ARM64_LDEORAL;\n\t\tcase ENC_LDEORALB_32_MEMOP:\n\t\t\treturn ARM64_LDEORALB;\n\t\tcase ENC_LDEORALH_32_MEMOP:\n\t\t\treturn ARM64_LDEORALH;\n\t\tcase ENC_LDEORB_32_MEMOP:\n\t\t\treturn ARM64_LDEORB;\n\t\tcase ENC_LDEORH_32_MEMOP:\n\t\t\treturn ARM64_LDEORH;\n\t\tcase ENC_LDEORL_32_MEMOP:\n\t\tcase ENC_LDEORL_64_MEMOP:\n\t\t\treturn ARM64_LDEORL;\n\t\tcase ENC_LDEORLB_32_MEMOP:\n\t\t\treturn ARM64_LDEORLB;\n\t\tcase ENC_LDEORLH_32_MEMOP:\n\t\t\treturn ARM64_LDEORLH;\n\t\tcase ENC_LDFF1B_Z_P_AI_S:\n\t\tcase ENC_LDFF1B_Z_P_AI_D:\n\t\tcase ENC_LDFF1B_Z_P_BR_U8:\n\t\tcase ENC_LDFF1B_Z_P_BR_U16:\n\t\tcase ENC_LDFF1B_Z_P_BR_U32:\n\t\tcase ENC_LDFF1B_Z_P_BR_U64:\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1B;\n\t\tcase ENC_LDFF1D_Z_P_AI_D:\n\t\tcase ENC_LDFF1D_Z_P_BR_U64:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1D;\n\t\tcase ENC_LDFF1H_Z_P_AI_S:\n\t\tcase ENC_LDFF1H_Z_P_AI_D:\n\t\tcase ENC_LDFF1H_Z_P_BR_U16:\n\t\tcase ENC_LDFF1H_Z_P_BR_U32:\n\t\tcase ENC_LDFF1H_Z_P_BR_U64:\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1H;\n\t\tcase ENC_LDFF1SB_Z_P_AI_S:\n\t\tcase ENC_LDFF1SB_Z_P_AI_D:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S16:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S32:\n\t\tcase ENC_LDFF1SB_Z_P_BR_S64:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1SB;\n\t\tcase ENC_LDFF1SH_Z_P_AI_S:\n\t\tcase ENC_LDFF1SH_Z_P_AI_D:\n\t\tcase ENC_LDFF1SH_Z_P_BR_S32:\n\t\tcase ENC_LDFF1SH_Z_P_BR_S64:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1SH;\n\t\tcase ENC_LDFF1SW_Z_P_AI_D:\n\t\tcase ENC_LDFF1SW_Z_P_BR_S64:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1SW;\n\t\tcase ENC_LDFF1W_Z_P_AI_S:\n\t\tcase ENC_LDFF1W_Z_P_AI_D:\n\t\tcase ENC_LDFF1W_Z_P_BR_U32:\n\t\tcase ENC_LDFF1W_Z_P_BR_U64:\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED:\n\t\t\treturn ARM64_LDFF1W;\n\t\tcase ENC_LDG_64LOFFSET_LDSTTAGS:\n\t\t\treturn ARM64_LDG;\n\t\tcase ENC_LDGM_64BULK_LDSTTAGS:\n\t\t\treturn ARM64_LDGM;\n\t\tcase ENC_LDLAR_LR32_LDSTORD:\n\t\tcase ENC_LDLAR_LR64_LDSTORD:\n\t\t\treturn ARM64_LDLAR;\n\t\tcase ENC_LDLARB_LR32_LDSTORD:\n\t\t\treturn ARM64_LDLARB;\n\t\tcase ENC_LDLARH_LR32_LDSTORD:\n\t\t\treturn ARM64_LDLARH;\n\t\tcase ENC_LDNF1B_Z_P_BI_U8:\n\t\tcase ENC_LDNF1B_Z_P_BI_U16:\n\t\tcase ENC_LDNF1B_Z_P_BI_U32:\n\t\tcase ENC_LDNF1B_Z_P_BI_U64:\n\t\t\treturn ARM64_LDNF1B;\n\t\tcase ENC_LDNF1D_Z_P_BI_U64:\n\t\t\treturn ARM64_LDNF1D;\n\t\tcase ENC_LDNF1H_Z_P_BI_U16:\n\t\tcase ENC_LDNF1H_Z_P_BI_U32:\n\t\tcase ENC_LDNF1H_Z_P_BI_U64:\n\t\t\treturn ARM64_LDNF1H;\n\t\tcase ENC_LDNF1SB_Z_P_BI_S16:\n\t\tcase ENC_LDNF1SB_Z_P_BI_S32:\n\t\tcase ENC_LDNF1SB_Z_P_BI_S64:\n\t\t\treturn ARM64_LDNF1SB;\n\t\tcase ENC_LDNF1SH_Z_P_BI_S32:\n\t\tcase ENC_LDNF1SH_Z_P_BI_S64:\n\t\t\treturn ARM64_LDNF1SH;\n\t\tcase ENC_LDNF1SW_Z_P_BI_S64:\n\t\t\treturn ARM64_LDNF1SW;\n\t\tcase ENC_LDNF1W_Z_P_BI_U32:\n\t\tcase ENC_LDNF1W_Z_P_BI_U64:\n\t\t\treturn ARM64_LDNF1W;\n\t\tcase ENC_LDNP_S_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_D_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_Q_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_32_LDSTNAPAIR_OFFS:\n\t\tcase ENC_LDNP_64_LDSTNAPAIR_OFFS:\n\t\t\treturn ARM64_LDNP;\n\t\tcase ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1B_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LDNT1B;\n\t\tcase ENC_LDNT1D_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LDNT1D;\n\t\tcase ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1H_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LDNT1H;\n\t\tcase ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED:\n\t\t\treturn ARM64_LDNT1SB;\n\t\tcase ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED:\n\t\t\treturn ARM64_LDNT1SH;\n\t\tcase ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED:\n\t\t\treturn ARM64_LDNT1SW;\n\t\tcase ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_LDNT1W_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_LDNT1W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_LDNT1W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_LDNT1W;\n\t\tcase ENC_LDP_S_LDSTPAIR_POST:\n\t\tcase ENC_LDP_D_LDSTPAIR_POST:\n\t\tcase ENC_LDP_Q_LDSTPAIR_POST:\n\t\tcase ENC_LDP_S_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_D_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_Q_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_S_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_D_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_Q_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_32_LDSTPAIR_POST:\n\t\tcase ENC_LDP_64_LDSTPAIR_POST:\n\t\tcase ENC_LDP_32_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_64_LDSTPAIR_PRE:\n\t\tcase ENC_LDP_32_LDSTPAIR_OFF:\n\t\tcase ENC_LDP_64_LDSTPAIR_OFF:\n\t\t\treturn ARM64_LDP;\n\t\tcase ENC_LDPSW_64_LDSTPAIR_POST:\n\t\tcase ENC_LDPSW_64_LDSTPAIR_PRE:\n\t\tcase ENC_LDPSW_64_LDSTPAIR_OFF:\n\t\t\treturn ARM64_LDPSW;\n\t\tcase ENC_LDR_B_LDST_IMMPOST:\n\t\tcase ENC_LDR_H_LDST_IMMPOST:\n\t\tcase ENC_LDR_S_LDST_IMMPOST:\n\t\tcase ENC_LDR_D_LDST_IMMPOST:\n\t\tcase ENC_LDR_Q_LDST_IMMPOST:\n\t\tcase ENC_LDR_B_LDST_IMMPRE:\n\t\tcase ENC_LDR_H_LDST_IMMPRE:\n\t\tcase ENC_LDR_S_LDST_IMMPRE:\n\t\tcase ENC_LDR_D_LDST_IMMPRE:\n\t\tcase ENC_LDR_Q_LDST_IMMPRE:\n\t\tcase ENC_LDR_B_LDST_POS:\n\t\tcase ENC_LDR_H_LDST_POS:\n\t\tcase ENC_LDR_S_LDST_POS:\n\t\tcase ENC_LDR_D_LDST_POS:\n\t\tcase ENC_LDR_Q_LDST_POS:\n\t\tcase ENC_LDR_32_LDST_IMMPOST:\n\t\tcase ENC_LDR_64_LDST_IMMPOST:\n\t\tcase ENC_LDR_32_LDST_IMMPRE:\n\t\tcase ENC_LDR_64_LDST_IMMPRE:\n\t\tcase ENC_LDR_32_LDST_POS:\n\t\tcase ENC_LDR_64_LDST_POS:\n\t\tcase ENC_LDR_S_LOADLIT:\n\t\tcase ENC_LDR_D_LOADLIT:\n\t\tcase ENC_LDR_Q_LOADLIT:\n\t\tcase ENC_LDR_32_LOADLIT:\n\t\tcase ENC_LDR_64_LOADLIT:\n\t\tcase ENC_LDR_B_LDST_REGOFF:\n\t\tcase ENC_LDR_BL_LDST_REGOFF:\n\t\tcase ENC_LDR_H_LDST_REGOFF:\n\t\tcase ENC_LDR_S_LDST_REGOFF:\n\t\tcase ENC_LDR_D_LDST_REGOFF:\n\t\tcase ENC_LDR_Q_LDST_REGOFF:\n\t\tcase ENC_LDR_32_LDST_REGOFF:\n\t\tcase ENC_LDR_64_LDST_REGOFF:\n\t\tcase ENC_LDR_P_BI_:\n\t\tcase ENC_LDR_Z_BI_:\n\t\tcase ENC_LDR_ZA_RI_:\n\t\t\treturn ARM64_LDR;\n\t\tcase ENC_LDRAA_64_LDST_PAC:\n\t\tcase ENC_LDRAA_64W_LDST_PAC:\n\t\t\treturn ARM64_LDRAA;\n\t\tcase ENC_LDRAB_64_LDST_PAC:\n\t\tcase ENC_LDRAB_64W_LDST_PAC:\n\t\t\treturn ARM64_LDRAB;\n\t\tcase ENC_LDRB_32_LDST_IMMPOST:\n\t\tcase ENC_LDRB_32_LDST_IMMPRE:\n\t\tcase ENC_LDRB_32_LDST_POS:\n\t\tcase ENC_LDRB_32B_LDST_REGOFF:\n\t\tcase ENC_LDRB_32BL_LDST_REGOFF:\n\t\t\treturn ARM64_LDRB;\n\t\tcase ENC_LDRH_32_LDST_IMMPOST:\n\t\tcase ENC_LDRH_32_LDST_IMMPRE:\n\t\tcase ENC_LDRH_32_LDST_POS:\n\t\tcase ENC_LDRH_32_LDST_REGOFF:\n\t\t\treturn ARM64_LDRH;\n\t\tcase ENC_LDRSB_32_LDST_IMMPOST:\n\t\tcase ENC_LDRSB_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSB_32_LDST_IMMPRE:\n\t\tcase ENC_LDRSB_64_LDST_IMMPRE:\n\t\tcase ENC_LDRSB_32_LDST_POS:\n\t\tcase ENC_LDRSB_64_LDST_POS:\n\t\tcase ENC_LDRSB_32B_LDST_REGOFF:\n\t\tcase ENC_LDRSB_32BL_LDST_REGOFF:\n\t\tcase ENC_LDRSB_64B_LDST_REGOFF:\n\t\tcase ENC_LDRSB_64BL_LDST_REGOFF:\n\t\t\treturn ARM64_LDRSB;\n\t\tcase ENC_LDRSH_32_LDST_IMMPOST:\n\t\tcase ENC_LDRSH_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSH_32_LDST_IMMPRE:\n\t\tcase ENC_LDRSH_64_LDST_IMMPRE:\n\t\tcase ENC_LDRSH_32_LDST_POS:\n\t\tcase ENC_LDRSH_64_LDST_POS:\n\t\tcase ENC_LDRSH_32_LDST_REGOFF:\n\t\tcase ENC_LDRSH_64_LDST_REGOFF:\n\t\t\treturn ARM64_LDRSH;\n\t\tcase ENC_LDRSW_64_LDST_IMMPOST:\n\t\tcase ENC_LDRSW_64_LDST_IMMPRE:\n\t\tcase ENC_LDRSW_64_LDST_POS:\n\t\tcase ENC_LDRSW_64_LOADLIT:\n\t\tcase ENC_LDRSW_64_LDST_REGOFF:\n\t\t\treturn ARM64_LDRSW;\n\t\tcase ENC_LDSET_32_MEMOP:\n\t\tcase ENC_LDSET_64_MEMOP:\n\t\t\treturn ARM64_LDSET;\n\t\tcase ENC_LDSETA_32_MEMOP:\n\t\tcase ENC_LDSETA_64_MEMOP:\n\t\t\treturn ARM64_LDSETA;\n\t\tcase ENC_LDSETAB_32_MEMOP:\n\t\t\treturn ARM64_LDSETAB;\n\t\tcase ENC_LDSETAH_32_MEMOP:\n\t\t\treturn ARM64_LDSETAH;\n\t\tcase ENC_LDSETAL_32_MEMOP:\n\t\tcase ENC_LDSETAL_64_MEMOP:\n\t\t\treturn ARM64_LDSETAL;\n\t\tcase ENC_LDSETALB_32_MEMOP:\n\t\t\treturn ARM64_LDSETALB;\n\t\tcase ENC_LDSETALH_32_MEMOP:\n\t\t\treturn ARM64_LDSETALH;\n\t\tcase ENC_LDSETB_32_MEMOP:\n\t\t\treturn ARM64_LDSETB;\n\t\tcase ENC_LDSETH_32_MEMOP:\n\t\t\treturn ARM64_LDSETH;\n\t\tcase ENC_LDSETL_32_MEMOP:\n\t\tcase ENC_LDSETL_64_MEMOP:\n\t\t\treturn ARM64_LDSETL;\n\t\tcase ENC_LDSETLB_32_MEMOP:\n\t\t\treturn ARM64_LDSETLB;\n\t\tcase ENC_LDSETLH_32_MEMOP:\n\t\t\treturn ARM64_LDSETLH;\n\t\tcase ENC_LDSMAX_32_MEMOP:\n\t\tcase ENC_LDSMAX_64_MEMOP:\n\t\t\treturn ARM64_LDSMAX;\n\t\tcase ENC_LDSMAXA_32_MEMOP:\n\t\tcase ENC_LDSMAXA_64_MEMOP:\n\t\t\treturn ARM64_LDSMAXA;\n\t\tcase ENC_LDSMAXAB_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXAB;\n\t\tcase ENC_LDSMAXAH_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXAH;\n\t\tcase ENC_LDSMAXAL_32_MEMOP:\n\t\tcase ENC_LDSMAXAL_64_MEMOP:\n\t\t\treturn ARM64_LDSMAXAL;\n\t\tcase ENC_LDSMAXALB_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXALB;\n\t\tcase ENC_LDSMAXALH_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXALH;\n\t\tcase ENC_LDSMAXB_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXB;\n\t\tcase ENC_LDSMAXH_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXH;\n\t\tcase ENC_LDSMAXL_32_MEMOP:\n\t\tcase ENC_LDSMAXL_64_MEMOP:\n\t\t\treturn ARM64_LDSMAXL;\n\t\tcase ENC_LDSMAXLB_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXLB;\n\t\tcase ENC_LDSMAXLH_32_MEMOP:\n\t\t\treturn ARM64_LDSMAXLH;\n\t\tcase ENC_LDSMIN_32_MEMOP:\n\t\tcase ENC_LDSMIN_64_MEMOP:\n\t\t\treturn ARM64_LDSMIN;\n\t\tcase ENC_LDSMINA_32_MEMOP:\n\t\tcase ENC_LDSMINA_64_MEMOP:\n\t\t\treturn ARM64_LDSMINA;\n\t\tcase ENC_LDSMINAB_32_MEMOP:\n\t\t\treturn ARM64_LDSMINAB;\n\t\tcase ENC_LDSMINAH_32_MEMOP:\n\t\t\treturn ARM64_LDSMINAH;\n\t\tcase ENC_LDSMINAL_32_MEMOP:\n\t\tcase ENC_LDSMINAL_64_MEMOP:\n\t\t\treturn ARM64_LDSMINAL;\n\t\tcase ENC_LDSMINALB_32_MEMOP:\n\t\t\treturn ARM64_LDSMINALB;\n\t\tcase ENC_LDSMINALH_32_MEMOP:\n\t\t\treturn ARM64_LDSMINALH;\n\t\tcase ENC_LDSMINB_32_MEMOP:\n\t\t\treturn ARM64_LDSMINB;\n\t\tcase ENC_LDSMINH_32_MEMOP:\n\t\t\treturn ARM64_LDSMINH;\n\t\tcase ENC_LDSMINL_32_MEMOP:\n\t\tcase ENC_LDSMINL_64_MEMOP:\n\t\t\treturn ARM64_LDSMINL;\n\t\tcase ENC_LDSMINLB_32_MEMOP:\n\t\t\treturn ARM64_LDSMINLB;\n\t\tcase ENC_LDSMINLH_32_MEMOP:\n\t\t\treturn ARM64_LDSMINLH;\n\t\tcase ENC_LDTR_32_LDST_UNPRIV:\n\t\tcase ENC_LDTR_64_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTR;\n\t\tcase ENC_LDTRB_32_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTRB;\n\t\tcase ENC_LDTRH_32_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTRH;\n\t\tcase ENC_LDTRSB_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRSB_64_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTRSB;\n\t\tcase ENC_LDTRSH_32_LDST_UNPRIV:\n\t\tcase ENC_LDTRSH_64_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTRSH;\n\t\tcase ENC_LDTRSW_64_LDST_UNPRIV:\n\t\t\treturn ARM64_LDTRSW;\n\t\tcase ENC_LDUMAX_32_MEMOP:\n\t\tcase ENC_LDUMAX_64_MEMOP:\n\t\t\treturn ARM64_LDUMAX;\n\t\tcase ENC_LDUMAXA_32_MEMOP:\n\t\tcase ENC_LDUMAXA_64_MEMOP:\n\t\t\treturn ARM64_LDUMAXA;\n\t\tcase ENC_LDUMAXAB_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXAB;\n\t\tcase ENC_LDUMAXAH_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXAH;\n\t\tcase ENC_LDUMAXAL_32_MEMOP:\n\t\tcase ENC_LDUMAXAL_64_MEMOP:\n\t\t\treturn ARM64_LDUMAXAL;\n\t\tcase ENC_LDUMAXALB_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXALB;\n\t\tcase ENC_LDUMAXALH_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXALH;\n\t\tcase ENC_LDUMAXB_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXB;\n\t\tcase ENC_LDUMAXH_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXH;\n\t\tcase ENC_LDUMAXL_32_MEMOP:\n\t\tcase ENC_LDUMAXL_64_MEMOP:\n\t\t\treturn ARM64_LDUMAXL;\n\t\tcase ENC_LDUMAXLB_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXLB;\n\t\tcase ENC_LDUMAXLH_32_MEMOP:\n\t\t\treturn ARM64_LDUMAXLH;\n\t\tcase ENC_LDUMIN_32_MEMOP:\n\t\tcase ENC_LDUMIN_64_MEMOP:\n\t\t\treturn ARM64_LDUMIN;\n\t\tcase ENC_LDUMINA_32_MEMOP:\n\t\tcase ENC_LDUMINA_64_MEMOP:\n\t\t\treturn ARM64_LDUMINA;\n\t\tcase ENC_LDUMINAB_32_MEMOP:\n\t\t\treturn ARM64_LDUMINAB;\n\t\tcase ENC_LDUMINAH_32_MEMOP:\n\t\t\treturn ARM64_LDUMINAH;\n\t\tcase ENC_LDUMINAL_32_MEMOP:\n\t\tcase ENC_LDUMINAL_64_MEMOP:\n\t\t\treturn ARM64_LDUMINAL;\n\t\tcase ENC_LDUMINALB_32_MEMOP:\n\t\t\treturn ARM64_LDUMINALB;\n\t\tcase ENC_LDUMINALH_32_MEMOP:\n\t\t\treturn ARM64_LDUMINALH;\n\t\tcase ENC_LDUMINB_32_MEMOP:\n\t\t\treturn ARM64_LDUMINB;\n\t\tcase ENC_LDUMINH_32_MEMOP:\n\t\t\treturn ARM64_LDUMINH;\n\t\tcase ENC_LDUMINL_32_MEMOP:\n\t\tcase ENC_LDUMINL_64_MEMOP:\n\t\t\treturn ARM64_LDUMINL;\n\t\tcase ENC_LDUMINLB_32_MEMOP:\n\t\t\treturn ARM64_LDUMINLB;\n\t\tcase ENC_LDUMINLH_32_MEMOP:\n\t\t\treturn ARM64_LDUMINLH;\n\t\tcase ENC_LDUR_B_LDST_UNSCALED:\n\t\tcase ENC_LDUR_H_LDST_UNSCALED:\n\t\tcase ENC_LDUR_S_LDST_UNSCALED:\n\t\tcase ENC_LDUR_D_LDST_UNSCALED:\n\t\tcase ENC_LDUR_Q_LDST_UNSCALED:\n\t\tcase ENC_LDUR_32_LDST_UNSCALED:\n\t\tcase ENC_LDUR_64_LDST_UNSCALED:\n\t\t\treturn ARM64_LDUR;\n\t\tcase ENC_LDURB_32_LDST_UNSCALED:\n\t\t\treturn ARM64_LDURB;\n\t\tcase ENC_LDURH_32_LDST_UNSCALED:\n\t\t\treturn ARM64_LDURH;\n\t\tcase ENC_LDURSB_32_LDST_UNSCALED:\n\t\tcase ENC_LDURSB_64_LDST_UNSCALED:\n\t\t\treturn ARM64_LDURSB;\n\t\tcase ENC_LDURSH_32_LDST_UNSCALED:\n\t\tcase ENC_LDURSH_64_LDST_UNSCALED:\n\t\t\treturn ARM64_LDURSH;\n\t\tcase ENC_LDURSW_64_LDST_UNSCALED:\n\t\t\treturn ARM64_LDURSW;\n\t\tcase ENC_LDXP_LP32_LDSTEXCLP:\n\t\tcase ENC_LDXP_LP64_LDSTEXCLP:\n\t\t\treturn ARM64_LDXP;\n\t\tcase ENC_LDXR_LR32_LDSTEXCLR:\n\t\tcase ENC_LDXR_LR64_LDSTEXCLR:\n\t\t\treturn ARM64_LDXR;\n\t\tcase ENC_LDXRB_LR32_LDSTEXCLR:\n\t\t\treturn ARM64_LDXRB;\n\t\tcase ENC_LDXRH_LR32_LDSTEXCLR:\n\t\t\treturn ARM64_LDXRH;\n\t\tcase ENC_LSL_LSLV_32_DP_2SRC:\n\t\tcase ENC_LSL_LSLV_64_DP_2SRC:\n\t\tcase ENC_LSL_UBFM_32M_BITFIELD:\n\t\tcase ENC_LSL_UBFM_64M_BITFIELD:\n\t\tcase ENC_LSL_Z_P_ZI_:\n\t\tcase ENC_LSL_Z_P_ZW_:\n\t\tcase ENC_LSL_Z_P_ZZ_:\n\t\tcase ENC_LSL_Z_ZI_:\n\t\tcase ENC_LSL_Z_ZW_:\n\t\t\treturn ARM64_LSL;\n\t\tcase ENC_LSLR_Z_P_ZZ_:\n\t\t\treturn ARM64_LSLR;\n\t\tcase ENC_LSLV_32_DP_2SRC:\n\t\tcase ENC_LSLV_64_DP_2SRC:\n\t\t\treturn ARM64_LSLV;\n\t\tcase ENC_LSR_LSRV_32_DP_2SRC:\n\t\tcase ENC_LSR_LSRV_64_DP_2SRC:\n\t\tcase ENC_LSR_UBFM_32M_BITFIELD:\n\t\tcase ENC_LSR_UBFM_64M_BITFIELD:\n\t\tcase ENC_LSR_Z_P_ZI_:\n\t\tcase ENC_LSR_Z_P_ZW_:\n\t\tcase ENC_LSR_Z_P_ZZ_:\n\t\tcase ENC_LSR_Z_ZI_:\n\t\tcase ENC_LSR_Z_ZW_:\n\t\t\treturn ARM64_LSR;\n\t\tcase ENC_LSRR_Z_P_ZZ_:\n\t\t\treturn ARM64_LSRR;\n\t\tcase ENC_LSRV_32_DP_2SRC:\n\t\tcase ENC_LSRV_64_DP_2SRC:\n\t\t\treturn ARM64_LSRV;\n\t\tcase ENC_MAD_Z_P_ZZZ_:\n\t\t\treturn ARM64_MAD;\n\t\tcase ENC_MADD_32A_DP_3SRC:\n\t\tcase ENC_MADD_64A_DP_3SRC:\n\t\t\treturn ARM64_MADD;\n\t\tcase ENC_MATCH_P_P_ZZ_:\n\t\t\treturn ARM64_MATCH;\n\t\tcase ENC_MLA_ASIMDELEM_R:\n\t\tcase ENC_MLA_ASIMDSAME_ONLY:\n\t\tcase ENC_MLA_Z_P_ZZZ_:\n\t\tcase ENC_MLA_Z_ZZZI_H:\n\t\tcase ENC_MLA_Z_ZZZI_S:\n\t\tcase ENC_MLA_Z_ZZZI_D:\n\t\t\treturn ARM64_MLA;\n\t\tcase ENC_MLS_ASIMDELEM_R:\n\t\tcase ENC_MLS_ASIMDSAME_ONLY:\n\t\tcase ENC_MLS_Z_P_ZZZ_:\n\t\tcase ENC_MLS_Z_ZZZI_H:\n\t\tcase ENC_MLS_Z_ZZZI_S:\n\t\tcase ENC_MLS_Z_ZZZI_D:\n\t\t\treturn ARM64_MLS;\n\t\tcase ENC_MNEG_MSUB_32A_DP_3SRC:\n\t\tcase ENC_MNEG_MSUB_64A_DP_3SRC:\n\t\t\treturn ARM64_MNEG;\n\t\tcase ENC_MOV_ADD_32_ADDSUB_IMM:\n\t\tcase ENC_MOV_ADD_64_ADDSUB_IMM:\n\t\tcase ENC_MOV_DUP_ASISDONE_ONLY:\n\t\tcase ENC_MOV_INS_ASIMDINS_IV_V:\n\t\tcase ENC_MOV_INS_ASIMDINS_IR_R:\n\t\tcase ENC_MOV_MOVN_32_MOVEWIDE:\n\t\tcase ENC_MOV_MOVN_64_MOVEWIDE:\n\t\tcase ENC_MOV_MOVZ_32_MOVEWIDE:\n\t\tcase ENC_MOV_MOVZ_64_MOVEWIDE:\n\t\tcase ENC_MOV_ORR_ASIMDSAME_ONLY:\n\t\tcase ENC_MOV_ORR_32_LOG_IMM:\n\t\tcase ENC_MOV_ORR_64_LOG_IMM:\n\t\tcase ENC_MOV_ORR_32_LOG_SHIFT:\n\t\tcase ENC_MOV_ORR_64_LOG_SHIFT:\n\t\tcase ENC_MOV_UMOV_ASIMDINS_W_W:\n\t\tcase ENC_MOV_UMOV_ASIMDINS_X_X:\n\t\tcase ENC_MOV_AND_P_P_PP_Z:\n\t\tcase ENC_MOV_CPY_Z_O_I_:\n\t\tcase ENC_MOV_CPY_Z_P_I_:\n\t\tcase ENC_MOV_CPY_Z_P_R_:\n\t\tcase ENC_MOV_CPY_Z_P_V_:\n\t\tcase ENC_MOV_DUP_Z_I_:\n\t\tcase ENC_MOV_DUP_Z_R_:\n\t\tcase ENC_MOV_DUP_Z_ZI_:\n\t\tcase ENC_MOV_DUP_Z_ZI_2:\n\t\tcase ENC_MOV_DUPM_Z_I_:\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_B:\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_H:\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_W:\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_D:\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_Q:\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_B:\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_H:\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_W:\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_D:\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_Q:\n\t\tcase ENC_MOV_ORR_P_P_PP_Z:\n\t\tcase ENC_MOV_ORR_Z_ZZ_:\n\t\tcase ENC_MOV_SEL_P_P_PP_:\n\t\tcase ENC_MOV_SEL_Z_P_ZZ_:\n\t\t\treturn ARM64_MOV;\n\t\tcase ENC_MOVA_Z_P_RZA_B:\n\t\tcase ENC_MOVA_Z_P_RZA_H:\n\t\tcase ENC_MOVA_Z_P_RZA_W:\n\t\tcase ENC_MOVA_Z_P_RZA_D:\n\t\tcase ENC_MOVA_Z_P_RZA_Q:\n\t\tcase ENC_MOVA_ZA_P_RZ_B:\n\t\tcase ENC_MOVA_ZA_P_RZ_H:\n\t\tcase ENC_MOVA_ZA_P_RZ_W:\n\t\tcase ENC_MOVA_ZA_P_RZ_D:\n\t\tcase ENC_MOVA_ZA_P_RZ_Q:\n\t\t\treturn ARM64_MOVA;\n\t\tcase ENC_MOVI_ASIMDIMM_N_B:\n\t\tcase ENC_MOVI_ASIMDIMM_L_HL:\n\t\tcase ENC_MOVI_ASIMDIMM_L_SL:\n\t\tcase ENC_MOVI_ASIMDIMM_M_SM:\n\t\tcase ENC_MOVI_ASIMDIMM_D_DS:\n\t\tcase ENC_MOVI_ASIMDIMM_D2_D:\n\t\t\treturn ARM64_MOVI;\n\t\tcase ENC_MOVK_32_MOVEWIDE:\n\t\tcase ENC_MOVK_64_MOVEWIDE:\n\t\t\treturn ARM64_MOVK;\n\t\tcase ENC_MOVN_32_MOVEWIDE:\n\t\tcase ENC_MOVN_64_MOVEWIDE:\n\t\t\treturn ARM64_MOVN;\n\t\tcase ENC_MOVPRFX_Z_P_Z_:\n\t\tcase ENC_MOVPRFX_Z_Z_:\n\t\t\treturn ARM64_MOVPRFX;\n\t\tcase ENC_MOVS_ANDS_P_P_PP_Z:\n\t\tcase ENC_MOVS_ORRS_P_P_PP_Z:\n\t\t\treturn ARM64_MOVS;\n\t\tcase ENC_MOVZ_32_MOVEWIDE:\n\t\tcase ENC_MOVZ_64_MOVEWIDE:\n\t\t\treturn ARM64_MOVZ;\n\t\tcase ENC_MRS_RS_SYSTEMMOVE:\n\t\t\treturn ARM64_MRS;\n\t\tcase ENC_MSB_Z_P_ZZZ_:\n\t\t\treturn ARM64_MSB;\n\t\tcase ENC_MSR_SI_PSTATE:\n\t\tcase ENC_MSR_SR_SYSTEMMOVE:\n\t\t\treturn ARM64_MSR;\n\t\tcase ENC_MSUB_32A_DP_3SRC:\n\t\tcase ENC_MSUB_64A_DP_3SRC:\n\t\t\treturn ARM64_MSUB;\n\t\tcase ENC_MUL_MADD_32A_DP_3SRC:\n\t\tcase ENC_MUL_MADD_64A_DP_3SRC:\n\t\tcase ENC_MUL_ASIMDELEM_R:\n\t\tcase ENC_MUL_ASIMDSAME_ONLY:\n\t\tcase ENC_MUL_Z_P_ZZ_:\n\t\tcase ENC_MUL_Z_ZI_:\n\t\tcase ENC_MUL_Z_ZZ_:\n\t\tcase ENC_MUL_Z_ZZI_H:\n\t\tcase ENC_MUL_Z_ZZI_S:\n\t\tcase ENC_MUL_Z_ZZI_D:\n\t\t\treturn ARM64_MUL;\n\t\tcase ENC_MVN_NOT_ASIMDMISC_R:\n\t\tcase ENC_MVN_ORN_32_LOG_SHIFT:\n\t\tcase ENC_MVN_ORN_64_LOG_SHIFT:\n\t\t\treturn ARM64_MVN;\n\t\tcase ENC_MVNI_ASIMDIMM_L_HL:\n\t\tcase ENC_MVNI_ASIMDIMM_L_SL:\n\t\tcase ENC_MVNI_ASIMDIMM_M_SM:\n\t\t\treturn ARM64_MVNI;\n\t\tcase ENC_NAND_P_P_PP_Z:\n\t\t\treturn ARM64_NAND;\n\t\tcase ENC_NANDS_P_P_PP_Z:\n\t\t\treturn ARM64_NANDS;\n\t\tcase ENC_NBSL_Z_ZZZ_:\n\t\t\treturn ARM64_NBSL;\n\t\tcase ENC_NEG_SUB_32_ADDSUB_SHIFT:\n\t\tcase ENC_NEG_SUB_64_ADDSUB_SHIFT:\n\t\tcase ENC_NEG_ASISDMISC_R:\n\t\tcase ENC_NEG_ASIMDMISC_R:\n\t\tcase ENC_NEG_Z_P_Z_:\n\t\t\treturn ARM64_NEG;\n\t\tcase ENC_NEGS_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_NEGS_SUBS_64_ADDSUB_SHIFT:\n\t\t\treturn ARM64_NEGS;\n\t\tcase ENC_NGC_SBC_32_ADDSUB_CARRY:\n\t\tcase ENC_NGC_SBC_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_NGC;\n\t\tcase ENC_NGCS_SBCS_32_ADDSUB_CARRY:\n\t\tcase ENC_NGCS_SBCS_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_NGCS;\n\t\tcase ENC_NMATCH_P_P_ZZ_:\n\t\t\treturn ARM64_NMATCH;\n\t\tcase ENC_NOP_HI_HINTS:\n\t\t\treturn ARM64_NOP;\n\t\tcase ENC_NOR_P_P_PP_Z:\n\t\t\treturn ARM64_NOR;\n\t\tcase ENC_NORS_P_P_PP_Z:\n\t\t\treturn ARM64_NORS;\n\t\tcase ENC_NOT_ASIMDMISC_R:\n\t\tcase ENC_NOT_EOR_P_P_PP_Z:\n\t\tcase ENC_NOT_Z_P_Z_:\n\t\t\treturn ARM64_NOT;\n\t\tcase ENC_NOTS_EORS_P_P_PP_Z:\n\t\t\treturn ARM64_NOTS;\n\t\tcase ENC_ORN_ASIMDSAME_ONLY:\n\t\tcase ENC_ORN_32_LOG_SHIFT:\n\t\tcase ENC_ORN_64_LOG_SHIFT:\n\t\tcase ENC_ORN_ORR_Z_ZI_:\n\t\tcase ENC_ORN_P_P_PP_Z:\n\t\t\treturn ARM64_ORN;\n\t\tcase ENC_ORNS_P_P_PP_Z:\n\t\t\treturn ARM64_ORNS;\n\t\tcase ENC_ORR_ASIMDIMM_L_HL:\n\t\tcase ENC_ORR_ASIMDIMM_L_SL:\n\t\tcase ENC_ORR_ASIMDSAME_ONLY:\n\t\tcase ENC_ORR_32_LOG_IMM:\n\t\tcase ENC_ORR_64_LOG_IMM:\n\t\tcase ENC_ORR_32_LOG_SHIFT:\n\t\tcase ENC_ORR_64_LOG_SHIFT:\n\t\tcase ENC_ORR_P_P_PP_Z:\n\t\tcase ENC_ORR_Z_P_ZZ_:\n\t\tcase ENC_ORR_Z_ZI_:\n\t\tcase ENC_ORR_Z_ZZ_:\n\t\t\treturn ARM64_ORR;\n\t\tcase ENC_ORRS_P_P_PP_Z:\n\t\t\treturn ARM64_ORRS;\n\t\tcase ENC_ORV_R_P_Z_:\n\t\t\treturn ARM64_ORV;\n\t\tcase ENC_PACDA_64P_DP_1SRC:\n\t\t\treturn ARM64_PACDA;\n\t\tcase ENC_PACDB_64P_DP_1SRC:\n\t\t\treturn ARM64_PACDB;\n\t\tcase ENC_PACDZA_64Z_DP_1SRC:\n\t\t\treturn ARM64_PACDZA;\n\t\tcase ENC_PACDZB_64Z_DP_1SRC:\n\t\t\treturn ARM64_PACDZB;\n\t\tcase ENC_PACGA_64P_DP_2SRC:\n\t\t\treturn ARM64_PACGA;\n\t\tcase ENC_PACIA_64P_DP_1SRC:\n\t\t\treturn ARM64_PACIA;\n\t\tcase ENC_PACIA1716_HI_HINTS:\n\t\t\treturn ARM64_PACIA1716;\n\t\tcase ENC_PACIASP_HI_HINTS:\n\t\t\treturn ARM64_PACIASP;\n\t\tcase ENC_PACIAZ_HI_HINTS:\n\t\t\treturn ARM64_PACIAZ;\n\t\tcase ENC_PACIB_64P_DP_1SRC:\n\t\t\treturn ARM64_PACIB;\n\t\tcase ENC_PACIB1716_HI_HINTS:\n\t\t\treturn ARM64_PACIB1716;\n\t\tcase ENC_PACIBSP_HI_HINTS:\n\t\t\treturn ARM64_PACIBSP;\n\t\tcase ENC_PACIBZ_HI_HINTS:\n\t\t\treturn ARM64_PACIBZ;\n\t\tcase ENC_PACIZA_64Z_DP_1SRC:\n\t\t\treturn ARM64_PACIZA;\n\t\tcase ENC_PACIZB_64Z_DP_1SRC:\n\t\t\treturn ARM64_PACIZB;\n\t\tcase ENC_PFALSE_P_:\n\t\t\treturn ARM64_PFALSE;\n\t\tcase ENC_PFIRST_P_P_P_:\n\t\t\treturn ARM64_PFIRST;\n\t\tcase ENC_PMUL_ASIMDSAME_ONLY:\n\t\tcase ENC_PMUL_Z_ZZ_:\n\t\t\treturn ARM64_PMUL;\n\t\tcase ENC_PMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_PMULL;\n\t\t//case ENC_PMULL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_PMULL2;\n\t\tcase ENC_PMULLB_Z_ZZ_:\n\t\t\treturn ARM64_PMULLB;\n\t\tcase ENC_PMULLT_Z_ZZ_:\n\t\t\treturn ARM64_PMULLT;\n\t\tcase ENC_PNEXT_P_P_P_:\n\t\t\treturn ARM64_PNEXT;\n\t\tcase ENC_PRFB_I_P_AI_S:\n\t\tcase ENC_PRFB_I_P_AI_D:\n\t\tcase ENC_PRFB_I_P_BI_S:\n\t\tcase ENC_PRFB_I_P_BR_S:\n\t\tcase ENC_PRFB_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFB_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFB_I_P_BZ_D_64_SCALED:\n\t\t\treturn ARM64_PRFB;\n\t\tcase ENC_PRFD_I_P_AI_S:\n\t\tcase ENC_PRFD_I_P_AI_D:\n\t\tcase ENC_PRFD_I_P_BI_S:\n\t\tcase ENC_PRFD_I_P_BR_S:\n\t\tcase ENC_PRFD_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFD_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFD_I_P_BZ_D_64_SCALED:\n\t\t\treturn ARM64_PRFD;\n\t\tcase ENC_PRFH_I_P_AI_S:\n\t\tcase ENC_PRFH_I_P_AI_D:\n\t\tcase ENC_PRFH_I_P_BI_S:\n\t\tcase ENC_PRFH_I_P_BR_S:\n\t\tcase ENC_PRFH_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFH_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFH_I_P_BZ_D_64_SCALED:\n\t\t\treturn ARM64_PRFH;\n\t\tcase ENC_PRFM_P_LDST_POS:\n\t\tcase ENC_PRFM_P_LOADLIT:\n\t\tcase ENC_PRFM_P_LDST_REGOFF:\n\t\t\treturn ARM64_PRFM;\n\t\tcase ENC_PRFUM_P_LDST_UNSCALED:\n\t\t\treturn ARM64_PRFUM;\n\t\tcase ENC_PRFW_I_P_AI_S:\n\t\tcase ENC_PRFW_I_P_AI_D:\n\t\tcase ENC_PRFW_I_P_BI_S:\n\t\tcase ENC_PRFW_I_P_BR_S:\n\t\tcase ENC_PRFW_I_P_BZ_S_X32_SCALED:\n\t\tcase ENC_PRFW_I_P_BZ_D_X32_SCALED:\n\t\tcase ENC_PRFW_I_P_BZ_D_64_SCALED:\n\t\t\treturn ARM64_PRFW;\n\t\tcase ENC_PSB_HC_HINTS:\n\t\t\treturn ARM64_PSB;\n\t\tcase ENC_PSSBB_DSB_BO_BARRIERS:\n\t\t\treturn ARM64_PSSBB;\n\t\tcase ENC_PTEST_P_P_:\n\t\t\treturn ARM64_PTEST;\n\t\tcase ENC_PTRUE_P_S_:\n\t\t\treturn ARM64_PTRUE;\n\t\tcase ENC_PTRUES_P_S_:\n\t\t\treturn ARM64_PTRUES;\n\t\tcase ENC_PUNPKHI_P_P_:\n\t\t\treturn ARM64_PUNPKHI;\n\t\tcase ENC_PUNPKLO_P_P_:\n\t\t\treturn ARM64_PUNPKLO;\n\t\tcase ENC_RADDHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_RADDHN;\n\t\t//case ENC_RADDHN_ASIMDDIFF_N:\n\t\t//\treturn ARM64_RADDHN2;\n\t\tcase ENC_RADDHNB_Z_ZZ_:\n\t\t\treturn ARM64_RADDHNB;\n\t\tcase ENC_RADDHNT_Z_ZZ_:\n\t\t\treturn ARM64_RADDHNT;\n\t\tcase ENC_RAX1_VVV2_CRYPTOSHA512_3:\n\t\tcase ENC_RAX1_Z_ZZ_:\n\t\t\treturn ARM64_RAX1;\n\t\tcase ENC_RBIT_ASIMDMISC_R:\n\t\tcase ENC_RBIT_32_DP_1SRC:\n\t\tcase ENC_RBIT_64_DP_1SRC:\n\t\tcase ENC_RBIT_Z_P_Z_:\n\t\t\treturn ARM64_RBIT;\n\t\tcase ENC_RDFFR_P_F_:\n\t\tcase ENC_RDFFR_P_P_F_:\n\t\t\treturn ARM64_RDFFR;\n\t\tcase ENC_RDFFRS_P_P_F_:\n\t\t\treturn ARM64_RDFFRS;\n\t\tcase ENC_RDVL_R_I_:\n\t\t\treturn ARM64_RDVL;\n\t\tcase ENC_RET_64R_BRANCH_REG:\n\t\t\treturn ARM64_RET;\n\t\tcase ENC_RETAA_64E_BRANCH_REG:\n\t\t\treturn ARM64_RETAA;\n\t\tcase ENC_RETAB_64E_BRANCH_REG:\n\t\t\treturn ARM64_RETAB;\n\t\tcase ENC_REV_32_DP_1SRC:\n\t\tcase ENC_REV_64_DP_1SRC:\n\t\tcase ENC_REV_P_P_:\n\t\tcase ENC_REV_Z_Z_:\n\t\t\treturn ARM64_REV;\n\t\tcase ENC_REV16_ASIMDMISC_R:\n\t\tcase ENC_REV16_32_DP_1SRC:\n\t\tcase ENC_REV16_64_DP_1SRC:\n\t\t\treturn ARM64_REV16;\n\t\tcase ENC_REV32_ASIMDMISC_R:\n\t\tcase ENC_REV32_64_DP_1SRC:\n\t\t\treturn ARM64_REV32;\n\t\tcase ENC_REV64_REV_64_DP_1SRC:\n\t\tcase ENC_REV64_ASIMDMISC_R:\n\t\t\treturn ARM64_REV64;\n\t\tcase ENC_REVB_Z_Z_:\n\t\t\treturn ARM64_REVB;\n\t\tcase ENC_REVD_Z_P_Z_:\n\t\t\treturn ARM64_REVD;\n\t\tcase ENC_REVH_Z_Z_:\n\t\t\treturn ARM64_REVH;\n\t\tcase ENC_REVW_Z_Z_:\n\t\t\treturn ARM64_REVW;\n\t\tcase ENC_RMIF_ONLY_RMIF:\n\t\t\treturn ARM64_RMIF;\n\t\tcase ENC_ROR_EXTR_32_EXTRACT:\n\t\tcase ENC_ROR_EXTR_64_EXTRACT:\n\t\tcase ENC_ROR_RORV_32_DP_2SRC:\n\t\tcase ENC_ROR_RORV_64_DP_2SRC:\n\t\t\treturn ARM64_ROR;\n\t\tcase ENC_RORV_32_DP_2SRC:\n\t\tcase ENC_RORV_64_DP_2SRC:\n\t\t\treturn ARM64_RORV;\n\t\tcase ENC_RSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_RSHRN;\n\t\t//case ENC_RSHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_RSHRN2;\n\t\tcase ENC_RSHRNB_Z_ZI_:\n\t\t\treturn ARM64_RSHRNB;\n\t\tcase ENC_RSHRNT_Z_ZI_:\n\t\t\treturn ARM64_RSHRNT;\n\t\tcase ENC_RSUBHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_RSUBHN;\n\t\t//case ENC_RSUBHN_ASIMDDIFF_N:\n\t\t//\treturn ARM64_RSUBHN2;\n\t\tcase ENC_RSUBHNB_Z_ZZ_:\n\t\t\treturn ARM64_RSUBHNB;\n\t\tcase ENC_RSUBHNT_Z_ZZ_:\n\t\t\treturn ARM64_RSUBHNT;\n\t\tcase ENC_SABA_ASIMDSAME_ONLY:\n\t\tcase ENC_SABA_Z_ZZZ_:\n\t\t\treturn ARM64_SABA;\n\t\tcase ENC_SABAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SABAL;\n\t\t//case ENC_SABAL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SABAL2;\n\t\tcase ENC_SABALB_Z_ZZZ_:\n\t\t\treturn ARM64_SABALB;\n\t\tcase ENC_SABALT_Z_ZZZ_:\n\t\t\treturn ARM64_SABALT;\n\t\tcase ENC_SABD_ASIMDSAME_ONLY:\n\t\tcase ENC_SABD_Z_P_ZZ_:\n\t\t\treturn ARM64_SABD;\n\t\tcase ENC_SABDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SABDL;\n\t\t//case ENC_SABDL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SABDL2;\n\t\tcase ENC_SABDLB_Z_ZZ_:\n\t\t\treturn ARM64_SABDLB;\n\t\tcase ENC_SABDLT_Z_ZZ_:\n\t\t\treturn ARM64_SABDLT;\n\t\tcase ENC_SADALP_ASIMDMISC_P:\n\t\tcase ENC_SADALP_Z_P_Z_:\n\t\t\treturn ARM64_SADALP;\n\t\tcase ENC_SADDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SADDL;\n\t\t//case ENC_SADDL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SADDL2;\n\t\tcase ENC_SADDLB_Z_ZZ_:\n\t\t\treturn ARM64_SADDLB;\n\t\tcase ENC_SADDLBT_Z_ZZ_:\n\t\t\treturn ARM64_SADDLBT;\n\t\tcase ENC_SADDLP_ASIMDMISC_P:\n\t\t\treturn ARM64_SADDLP;\n\t\tcase ENC_SADDLT_Z_ZZ_:\n\t\t\treturn ARM64_SADDLT;\n\t\tcase ENC_SADDLV_ASIMDALL_ONLY:\n\t\t\treturn ARM64_SADDLV;\n\t\tcase ENC_SADDV_R_P_Z_:\n\t\t\treturn ARM64_SADDV;\n\t\tcase ENC_SADDW_ASIMDDIFF_W:\n\t\t\treturn ARM64_SADDW;\n\t\t//case ENC_SADDW_ASIMDDIFF_W:\n\t\t//\treturn ARM64_SADDW2;\n\t\tcase ENC_SADDWB_Z_ZZ_:\n\t\t\treturn ARM64_SADDWB;\n\t\tcase ENC_SADDWT_Z_ZZ_:\n\t\t\treturn ARM64_SADDWT;\n\t\tcase ENC_SB_ONLY_BARRIERS:\n\t\t\treturn ARM64_SB;\n\t\tcase ENC_SBC_32_ADDSUB_CARRY:\n\t\tcase ENC_SBC_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_SBC;\n\t\tcase ENC_SBCLB_Z_ZZZ_:\n\t\t\treturn ARM64_SBCLB;\n\t\tcase ENC_SBCLT_Z_ZZZ_:\n\t\t\treturn ARM64_SBCLT;\n\t\tcase ENC_SBCS_32_ADDSUB_CARRY:\n\t\tcase ENC_SBCS_64_ADDSUB_CARRY:\n\t\t\treturn ARM64_SBCS;\n\t\tcase ENC_SBFIZ_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFIZ_SBFM_64M_BITFIELD:\n\t\t\treturn ARM64_SBFIZ;\n\t\tcase ENC_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFM_64M_BITFIELD:\n\t\t\treturn ARM64_SBFM;\n\t\tcase ENC_SBFX_SBFM_32M_BITFIELD:\n\t\tcase ENC_SBFX_SBFM_64M_BITFIELD:\n\t\t\treturn ARM64_SBFX;\n\t\tcase ENC_SCLAMP_Z_ZZ_:\n\t\t\treturn ARM64_SCLAMP;\n\t\tcase ENC_SCVTF_ASISDSHF_C:\n\t\tcase ENC_SCVTF_ASIMDSHF_C:\n\t\tcase ENC_SCVTF_ASISDMISCFP16_R:\n\t\tcase ENC_SCVTF_ASISDMISC_R:\n\t\tcase ENC_SCVTF_ASIMDMISCFP16_R:\n\t\tcase ENC_SCVTF_ASIMDMISC_R:\n\t\tcase ENC_SCVTF_H32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_S32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_D32_FLOAT2FIX:\n\t\tcase ENC_SCVTF_H64_FLOAT2FIX:\n\t\tcase ENC_SCVTF_S64_FLOAT2FIX:\n\t\tcase ENC_SCVTF_D64_FLOAT2FIX:\n\t\tcase ENC_SCVTF_H32_FLOAT2INT:\n\t\tcase ENC_SCVTF_S32_FLOAT2INT:\n\t\tcase ENC_SCVTF_D32_FLOAT2INT:\n\t\tcase ENC_SCVTF_H64_FLOAT2INT:\n\t\tcase ENC_SCVTF_S64_FLOAT2INT:\n\t\tcase ENC_SCVTF_D64_FLOAT2INT:\n\t\tcase ENC_SCVTF_Z_P_Z_H2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_W2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_W2S:\n\t\tcase ENC_SCVTF_Z_P_Z_W2D:\n\t\tcase ENC_SCVTF_Z_P_Z_X2FP16:\n\t\tcase ENC_SCVTF_Z_P_Z_X2S:\n\t\tcase ENC_SCVTF_Z_P_Z_X2D:\n\t\t\treturn ARM64_SCVTF;\n\t\tcase ENC_SDIV_32_DP_2SRC:\n\t\tcase ENC_SDIV_64_DP_2SRC:\n\t\tcase ENC_SDIV_Z_P_ZZ_:\n\t\t\treturn ARM64_SDIV;\n\t\tcase ENC_SDIVR_Z_P_ZZ_:\n\t\t\treturn ARM64_SDIVR;\n\t\tcase ENC_SDOT_ASIMDELEM_D:\n\t\tcase ENC_SDOT_ASIMDSAME2_D:\n\t\tcase ENC_SDOT_Z_ZZZ_:\n\t\tcase ENC_SDOT_Z_ZZZI_S:\n\t\tcase ENC_SDOT_Z_ZZZI_D:\n\t\t\treturn ARM64_SDOT;\n\t\tcase ENC_SEL_P_P_PP_:\n\t\tcase ENC_SEL_Z_P_ZZ_:\n\t\t\treturn ARM64_SEL;\n\t\tcase ENC_SETF16_ONLY_SETF:\n\t\t\treturn ARM64_SETF16;\n\t\tcase ENC_SETF8_ONLY_SETF:\n\t\t\treturn ARM64_SETF8;\n\t\tcase ENC_SETFFR_F_:\n\t\t\treturn ARM64_SETFFR;\n\t\tcase ENC_SEV_HI_HINTS:\n\t\t\treturn ARM64_SEV;\n\t\tcase ENC_SEVL_HI_HINTS:\n\t\t\treturn ARM64_SEVL;\n\t\tcase ENC_SHA1C_QSV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA1C;\n\t\tcase ENC_SHA1H_SS_CRYPTOSHA2:\n\t\t\treturn ARM64_SHA1H;\n\t\tcase ENC_SHA1M_QSV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA1M;\n\t\tcase ENC_SHA1P_QSV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA1P;\n\t\tcase ENC_SHA1SU0_VVV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA1SU0;\n\t\tcase ENC_SHA1SU1_VV_CRYPTOSHA2:\n\t\t\treturn ARM64_SHA1SU1;\n\t\tcase ENC_SHA256H_QQV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA256H;\n\t\tcase ENC_SHA256H2_QQV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA256H2;\n\t\tcase ENC_SHA256SU0_VV_CRYPTOSHA2:\n\t\t\treturn ARM64_SHA256SU0;\n\t\tcase ENC_SHA256SU1_VVV_CRYPTOSHA3:\n\t\t\treturn ARM64_SHA256SU1;\n\t\tcase ENC_SHA512H_QQV_CRYPTOSHA512_3:\n\t\t\treturn ARM64_SHA512H;\n\t\tcase ENC_SHA512H2_QQV_CRYPTOSHA512_3:\n\t\t\treturn ARM64_SHA512H2;\n\t\tcase ENC_SHA512SU0_VV2_CRYPTOSHA512_2:\n\t\t\treturn ARM64_SHA512SU0;\n\t\tcase ENC_SHA512SU1_VVV2_CRYPTOSHA512_3:\n\t\t\treturn ARM64_SHA512SU1;\n\t\tcase ENC_SHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SHADD_Z_P_ZZ_:\n\t\t\treturn ARM64_SHADD;\n\t\tcase ENC_SHL_ASISDSHF_R:\n\t\tcase ENC_SHL_ASIMDSHF_R:\n\t\t\treturn ARM64_SHL;\n\t\tcase ENC_SHLL_ASIMDMISC_S:\n\t\t\treturn ARM64_SHLL;\n\t\t//case ENC_SHLL_ASIMDMISC_S:\n\t\t//\treturn ARM64_SHLL2;\n\t\tcase ENC_SHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SHRN;\n\t\t//case ENC_SHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_SHRN2;\n\t\tcase ENC_SHRNB_Z_ZI_:\n\t\t\treturn ARM64_SHRNB;\n\t\tcase ENC_SHRNT_Z_ZI_:\n\t\t\treturn ARM64_SHRNT;\n\t\tcase ENC_SHSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_SHSUB_Z_P_ZZ_:\n\t\t\treturn ARM64_SHSUB;\n\t\tcase ENC_SHSUBR_Z_P_ZZ_:\n\t\t\treturn ARM64_SHSUBR;\n\t\tcase ENC_SLI_ASISDSHF_R:\n\t\tcase ENC_SLI_ASIMDSHF_R:\n\t\tcase ENC_SLI_Z_ZZI_:\n\t\t\treturn ARM64_SLI;\n\t\tcase ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3:\n\t\t\treturn ARM64_SM3PARTW1;\n\t\tcase ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3:\n\t\t\treturn ARM64_SM3PARTW2;\n\t\tcase ENC_SM3SS1_VVV4_CRYPTO4:\n\t\t\treturn ARM64_SM3SS1;\n\t\tcase ENC_SM3TT1A_VVV4_CRYPTO3_IMM2:\n\t\t\treturn ARM64_SM3TT1A;\n\t\tcase ENC_SM3TT1B_VVV4_CRYPTO3_IMM2:\n\t\t\treturn ARM64_SM3TT1B;\n\t\tcase ENC_SM3TT2A_VVV4_CRYPTO3_IMM2:\n\t\t\treturn ARM64_SM3TT2A;\n\t\tcase ENC_SM3TT2B_VVV_CRYPTO3_IMM2:\n\t\t\treturn ARM64_SM3TT2B;\n\t\tcase ENC_SM4E_VV4_CRYPTOSHA512_2:\n\t\tcase ENC_SM4E_Z_ZZ_:\n\t\t\treturn ARM64_SM4E;\n\t\tcase ENC_SM4EKEY_VVV4_CRYPTOSHA512_3:\n\t\tcase ENC_SM4EKEY_Z_ZZ_:\n\t\t\treturn ARM64_SM4EKEY;\n\t\tcase ENC_SMADDL_64WA_DP_3SRC:\n\t\t\treturn ARM64_SMADDL;\n\t\tcase ENC_SMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_SMAX_Z_P_ZZ_:\n\t\tcase ENC_SMAX_Z_ZI_:\n\t\t\treturn ARM64_SMAX;\n\t\tcase ENC_SMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_SMAXP_Z_P_ZZ_:\n\t\t\treturn ARM64_SMAXP;\n\t\tcase ENC_SMAXV_ASIMDALL_ONLY:\n\t\tcase ENC_SMAXV_R_P_Z_:\n\t\t\treturn ARM64_SMAXV;\n\t\tcase ENC_SMC_EX_EXCEPTION:\n\t\t\treturn ARM64_SMC;\n\t\tcase ENC_SMIN_ASIMDSAME_ONLY:\n\t\tcase ENC_SMIN_Z_P_ZZ_:\n\t\tcase ENC_SMIN_Z_ZI_:\n\t\t\treturn ARM64_SMIN;\n\t\tcase ENC_SMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_SMINP_Z_P_ZZ_:\n\t\t\treturn ARM64_SMINP;\n\t\tcase ENC_SMINV_ASIMDALL_ONLY:\n\t\tcase ENC_SMINV_R_P_Z_:\n\t\t\treturn ARM64_SMINV;\n\t\tcase ENC_SMLAL_ASIMDELEM_L:\n\t\tcase ENC_SMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMLAL;\n\t\t//case ENC_SMLAL_ASIMDELEM_L:\n\t\t//case ENC_SMLAL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SMLAL2;\n\t\tcase ENC_SMLALB_Z_ZZZ_:\n\t\tcase ENC_SMLALB_Z_ZZZI_S:\n\t\tcase ENC_SMLALB_Z_ZZZI_D:\n\t\t\treturn ARM64_SMLALB;\n\t\tcase ENC_SMLALT_Z_ZZZ_:\n\t\tcase ENC_SMLALT_Z_ZZZI_S:\n\t\tcase ENC_SMLALT_Z_ZZZI_D:\n\t\t\treturn ARM64_SMLALT;\n\t\tcase ENC_SMLSL_ASIMDELEM_L:\n\t\tcase ENC_SMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMLSL;\n\t\t//case ENC_SMLSL_ASIMDELEM_L:\n\t\t//case ENC_SMLSL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SMLSL2;\n\t\tcase ENC_SMLSLB_Z_ZZZ_:\n\t\tcase ENC_SMLSLB_Z_ZZZI_S:\n\t\tcase ENC_SMLSLB_Z_ZZZI_D:\n\t\t\treturn ARM64_SMLSLB;\n\t\tcase ENC_SMLSLT_Z_ZZZ_:\n\t\tcase ENC_SMLSLT_Z_ZZZI_S:\n\t\tcase ENC_SMLSLT_Z_ZZZI_D:\n\t\t\treturn ARM64_SMLSLT;\n\t\tcase ENC_SMMLA_ASIMDSAME2_G:\n\t\tcase ENC_SMMLA_Z_ZZZ_:\n\t\t\treturn ARM64_SMMLA;\n\t\tcase ENC_SMNEGL_SMSUBL_64WA_DP_3SRC:\n\t\t\treturn ARM64_SMNEGL;\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_SMOPA;\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_SMOPS;\n\t\tcase ENC_SMOV_ASIMDINS_W_W:\n\t\tcase ENC_SMOV_ASIMDINS_X_X:\n\t\t\treturn ARM64_SMOV;\n\t\tcase ENC_SMSTART_MSR_SI_PSTATE:\n\t\t\treturn ARM64_SMSTART;\n\t\tcase ENC_SMSTOP_MSR_SI_PSTATE:\n\t\t\treturn ARM64_SMSTOP;\n\t\tcase ENC_SMSUBL_64WA_DP_3SRC:\n\t\t\treturn ARM64_SMSUBL;\n\t\tcase ENC_SMULH_64_DP_3SRC:\n\t\tcase ENC_SMULH_Z_P_ZZ_:\n\t\tcase ENC_SMULH_Z_ZZ_:\n\t\t\treturn ARM64_SMULH;\n\t\tcase ENC_SMULL_SMADDL_64WA_DP_3SRC:\n\t\tcase ENC_SMULL_ASIMDELEM_L:\n\t\tcase ENC_SMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMULL;\n\t\t//case ENC_SMULL_ASIMDELEM_L:\n\t\t//case ENC_SMULL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SMULL2;\n\t\tcase ENC_SMULLB_Z_ZZ_:\n\t\tcase ENC_SMULLB_Z_ZZI_S:\n\t\tcase ENC_SMULLB_Z_ZZI_D:\n\t\t\treturn ARM64_SMULLB;\n\t\tcase ENC_SMULLT_Z_ZZ_:\n\t\tcase ENC_SMULLT_Z_ZZI_S:\n\t\tcase ENC_SMULLT_Z_ZZI_D:\n\t\t\treturn ARM64_SMULLT;\n\t\tcase ENC_SPLICE_Z_P_ZZ_CON:\n\t\tcase ENC_SPLICE_Z_P_ZZ_DES:\n\t\t\treturn ARM64_SPLICE;\n\t\tcase ENC_SQABS_ASISDMISC_R:\n\t\tcase ENC_SQABS_ASIMDMISC_R:\n\t\tcase ENC_SQABS_Z_P_Z_:\n\t\t\treturn ARM64_SQABS;\n\t\tcase ENC_SQADD_ASISDSAME_ONLY:\n\t\tcase ENC_SQADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SQADD_Z_P_ZZ_:\n\t\tcase ENC_SQADD_Z_ZI_:\n\t\tcase ENC_SQADD_Z_ZZ_:\n\t\t\treturn ARM64_SQADD;\n\t\tcase ENC_SQCADD_Z_ZZ_:\n\t\t\treturn ARM64_SQCADD;\n\t\tcase ENC_SQDECB_R_RS_SX:\n\t\tcase ENC_SQDECB_R_RS_X:\n\t\t\treturn ARM64_SQDECB;\n\t\tcase ENC_SQDECD_R_RS_SX:\n\t\tcase ENC_SQDECD_R_RS_X:\n\t\tcase ENC_SQDECD_Z_ZS_:\n\t\t\treturn ARM64_SQDECD;\n\t\tcase ENC_SQDECH_R_RS_SX:\n\t\tcase ENC_SQDECH_R_RS_X:\n\t\tcase ENC_SQDECH_Z_ZS_:\n\t\t\treturn ARM64_SQDECH;\n\t\tcase ENC_SQDECP_R_P_R_SX:\n\t\tcase ENC_SQDECP_R_P_R_X:\n\t\tcase ENC_SQDECP_Z_P_Z_:\n\t\t\treturn ARM64_SQDECP;\n\t\tcase ENC_SQDECW_R_RS_SX:\n\t\tcase ENC_SQDECW_R_RS_X:\n\t\tcase ENC_SQDECW_Z_ZS_:\n\t\t\treturn ARM64_SQDECW;\n\t\tcase ENC_SQDMLAL_ASISDELEM_L:\n\t\tcase ENC_SQDMLAL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLAL_ASISDDIFF_ONLY:\n\t\tcase ENC_SQDMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMLAL;\n\t\t//case ENC_SQDMLAL_ASIMDELEM_L:\n\t\t//case ENC_SQDMLAL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SQDMLAL2;\n\t\tcase ENC_SQDMLALB_Z_ZZZ_:\n\t\tcase ENC_SQDMLALB_Z_ZZZI_S:\n\t\tcase ENC_SQDMLALB_Z_ZZZI_D:\n\t\t\treturn ARM64_SQDMLALB;\n\t\tcase ENC_SQDMLALBT_Z_ZZZ_:\n\t\t\treturn ARM64_SQDMLALBT;\n\t\tcase ENC_SQDMLALT_Z_ZZZ_:\n\t\tcase ENC_SQDMLALT_Z_ZZZI_S:\n\t\tcase ENC_SQDMLALT_Z_ZZZI_D:\n\t\t\treturn ARM64_SQDMLALT;\n\t\tcase ENC_SQDMLSL_ASISDELEM_L:\n\t\tcase ENC_SQDMLSL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLSL_ASISDDIFF_ONLY:\n\t\tcase ENC_SQDMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMLSL;\n\t\t//case ENC_SQDMLSL_ASIMDELEM_L:\n\t\t//case ENC_SQDMLSL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SQDMLSL2;\n\t\tcase ENC_SQDMLSLB_Z_ZZZ_:\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_S:\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_D:\n\t\t\treturn ARM64_SQDMLSLB;\n\t\tcase ENC_SQDMLSLBT_Z_ZZZ_:\n\t\t\treturn ARM64_SQDMLSLBT;\n\t\tcase ENC_SQDMLSLT_Z_ZZZ_:\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_S:\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_D:\n\t\t\treturn ARM64_SQDMLSLT;\n\t\tcase ENC_SQDMULH_ASISDELEM_R:\n\t\tcase ENC_SQDMULH_ASIMDELEM_R:\n\t\tcase ENC_SQDMULH_ASISDSAME_ONLY:\n\t\tcase ENC_SQDMULH_ASIMDSAME_ONLY:\n\t\tcase ENC_SQDMULH_Z_ZZ_:\n\t\tcase ENC_SQDMULH_Z_ZZI_H:\n\t\tcase ENC_SQDMULH_Z_ZZI_S:\n\t\tcase ENC_SQDMULH_Z_ZZI_D:\n\t\t\treturn ARM64_SQDMULH;\n\t\tcase ENC_SQDMULL_ASISDELEM_L:\n\t\tcase ENC_SQDMULL_ASIMDELEM_L:\n\t\tcase ENC_SQDMULL_ASISDDIFF_ONLY:\n\t\tcase ENC_SQDMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMULL;\n\t\t//case ENC_SQDMULL_ASIMDELEM_L:\n\t\t//case ENC_SQDMULL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SQDMULL2;\n\t\tcase ENC_SQDMULLB_Z_ZZ_:\n\t\tcase ENC_SQDMULLB_Z_ZZI_S:\n\t\tcase ENC_SQDMULLB_Z_ZZI_D:\n\t\t\treturn ARM64_SQDMULLB;\n\t\tcase ENC_SQDMULLT_Z_ZZ_:\n\t\tcase ENC_SQDMULLT_Z_ZZI_S:\n\t\tcase ENC_SQDMULLT_Z_ZZI_D:\n\t\t\treturn ARM64_SQDMULLT;\n\t\tcase ENC_SQINCB_R_RS_SX:\n\t\tcase ENC_SQINCB_R_RS_X:\n\t\t\treturn ARM64_SQINCB;\n\t\tcase ENC_SQINCD_R_RS_SX:\n\t\tcase ENC_SQINCD_R_RS_X:\n\t\tcase ENC_SQINCD_Z_ZS_:\n\t\t\treturn ARM64_SQINCD;\n\t\tcase ENC_SQINCH_R_RS_SX:\n\t\tcase ENC_SQINCH_R_RS_X:\n\t\tcase ENC_SQINCH_Z_ZS_:\n\t\t\treturn ARM64_SQINCH;\n\t\tcase ENC_SQINCP_R_P_R_SX:\n\t\tcase ENC_SQINCP_R_P_R_X:\n\t\tcase ENC_SQINCP_Z_P_Z_:\n\t\t\treturn ARM64_SQINCP;\n\t\tcase ENC_SQINCW_R_RS_SX:\n\t\tcase ENC_SQINCW_R_RS_X:\n\t\tcase ENC_SQINCW_Z_ZS_:\n\t\t\treturn ARM64_SQINCW;\n\t\tcase ENC_SQNEG_ASISDMISC_R:\n\t\tcase ENC_SQNEG_ASIMDMISC_R:\n\t\tcase ENC_SQNEG_Z_P_Z_:\n\t\t\treturn ARM64_SQNEG;\n\t\tcase ENC_SQRDCMLAH_Z_ZZZ_:\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_H:\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_S:\n\t\t\treturn ARM64_SQRDCMLAH;\n\t\tcase ENC_SQRDMLAH_ASISDELEM_R:\n\t\tcase ENC_SQRDMLAH_ASIMDELEM_R:\n\t\tcase ENC_SQRDMLAH_ASISDSAME2_ONLY:\n\t\tcase ENC_SQRDMLAH_ASIMDSAME2_ONLY:\n\t\tcase ENC_SQRDMLAH_Z_ZZZ_:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_H:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_S:\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_D:\n\t\t\treturn ARM64_SQRDMLAH;\n\t\tcase ENC_SQRDMLSH_ASISDELEM_R:\n\t\tcase ENC_SQRDMLSH_ASIMDELEM_R:\n\t\tcase ENC_SQRDMLSH_ASISDSAME2_ONLY:\n\t\tcase ENC_SQRDMLSH_ASIMDSAME2_ONLY:\n\t\tcase ENC_SQRDMLSH_Z_ZZZ_:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_H:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_S:\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_D:\n\t\t\treturn ARM64_SQRDMLSH;\n\t\tcase ENC_SQRDMULH_ASISDELEM_R:\n\t\tcase ENC_SQRDMULH_ASIMDELEM_R:\n\t\tcase ENC_SQRDMULH_ASISDSAME_ONLY:\n\t\tcase ENC_SQRDMULH_ASIMDSAME_ONLY:\n\t\tcase ENC_SQRDMULH_Z_ZZ_:\n\t\tcase ENC_SQRDMULH_Z_ZZI_H:\n\t\tcase ENC_SQRDMULH_Z_ZZI_S:\n\t\tcase ENC_SQRDMULH_Z_ZZI_D:\n\t\t\treturn ARM64_SQRDMULH;\n\t\tcase ENC_SQRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SQRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SQRSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_SQRSHL;\n\t\tcase ENC_SQRSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_SQRSHLR;\n\t\tcase ENC_SQRSHRN_ASISDSHF_N:\n\t\tcase ENC_SQRSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQRSHRN;\n\t\t//case ENC_SQRSHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_SQRSHRN2;\n\t\tcase ENC_SQRSHRNB_Z_ZI_:\n\t\t\treturn ARM64_SQRSHRNB;\n\t\tcase ENC_SQRSHRNT_Z_ZI_:\n\t\t\treturn ARM64_SQRSHRNT;\n\t\tcase ENC_SQRSHRUN_ASISDSHF_N:\n\t\tcase ENC_SQRSHRUN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQRSHRUN;\n\t\t//case ENC_SQRSHRUN_ASIMDSHF_N:\n\t\t//\treturn ARM64_SQRSHRUN2;\n\t\tcase ENC_SQRSHRUNB_Z_ZI_:\n\t\t\treturn ARM64_SQRSHRUNB;\n\t\tcase ENC_SQRSHRUNT_Z_ZI_:\n\t\t\treturn ARM64_SQRSHRUNT;\n\t\tcase ENC_SQSHL_ASISDSHF_R:\n\t\tcase ENC_SQSHL_ASIMDSHF_R:\n\t\tcase ENC_SQSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SQSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SQSHL_Z_P_ZI_:\n\t\tcase ENC_SQSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_SQSHL;\n\t\tcase ENC_SQSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_SQSHLR;\n\t\tcase ENC_SQSHLU_ASISDSHF_R:\n\t\tcase ENC_SQSHLU_ASIMDSHF_R:\n\t\tcase ENC_SQSHLU_Z_P_ZI_:\n\t\t\treturn ARM64_SQSHLU;\n\t\tcase ENC_SQSHRN_ASISDSHF_N:\n\t\tcase ENC_SQSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQSHRN;\n\t\t//case ENC_SQSHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_SQSHRN2;\n\t\tcase ENC_SQSHRNB_Z_ZI_:\n\t\t\treturn ARM64_SQSHRNB;\n\t\tcase ENC_SQSHRNT_Z_ZI_:\n\t\t\treturn ARM64_SQSHRNT;\n\t\tcase ENC_SQSHRUN_ASISDSHF_N:\n\t\tcase ENC_SQSHRUN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQSHRUN;\n\t\t//case ENC_SQSHRUN_ASIMDSHF_N:\n\t\t//\treturn ARM64_SQSHRUN2;\n\t\tcase ENC_SQSHRUNB_Z_ZI_:\n\t\t\treturn ARM64_SQSHRUNB;\n\t\tcase ENC_SQSHRUNT_Z_ZI_:\n\t\t\treturn ARM64_SQSHRUNT;\n\t\tcase ENC_SQSUB_ASISDSAME_ONLY:\n\t\tcase ENC_SQSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_SQSUB_Z_P_ZZ_:\n\t\tcase ENC_SQSUB_Z_ZI_:\n\t\tcase ENC_SQSUB_Z_ZZ_:\n\t\t\treturn ARM64_SQSUB;\n\t\tcase ENC_SQSUBR_Z_P_ZZ_:\n\t\t\treturn ARM64_SQSUBR;\n\t\tcase ENC_SQXTN_ASISDMISC_N:\n\t\tcase ENC_SQXTN_ASIMDMISC_N:\n\t\t\treturn ARM64_SQXTN;\n\t\t//case ENC_SQXTN_ASIMDMISC_N:\n\t\t//\treturn ARM64_SQXTN2;\n\t\tcase ENC_SQXTNB_Z_ZZ_:\n\t\t\treturn ARM64_SQXTNB;\n\t\tcase ENC_SQXTNT_Z_ZZ_:\n\t\t\treturn ARM64_SQXTNT;\n\t\tcase ENC_SQXTUN_ASISDMISC_N:\n\t\tcase ENC_SQXTUN_ASIMDMISC_N:\n\t\t\treturn ARM64_SQXTUN;\n\t\t//case ENC_SQXTUN_ASIMDMISC_N:\n\t\t//\treturn ARM64_SQXTUN2;\n\t\tcase ENC_SQXTUNB_Z_ZZ_:\n\t\t\treturn ARM64_SQXTUNB;\n\t\tcase ENC_SQXTUNT_Z_ZZ_:\n\t\t\treturn ARM64_SQXTUNT;\n\t\tcase ENC_SRHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_SRHADD_Z_P_ZZ_:\n\t\t\treturn ARM64_SRHADD;\n\t\tcase ENC_SRI_ASISDSHF_R:\n\t\tcase ENC_SRI_ASIMDSHF_R:\n\t\tcase ENC_SRI_Z_ZZI_:\n\t\t\treturn ARM64_SRI;\n\t\tcase ENC_SRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_SRSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_SRSHL;\n\t\tcase ENC_SRSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_SRSHLR;\n\t\tcase ENC_SRSHR_ASISDSHF_R:\n\t\tcase ENC_SRSHR_ASIMDSHF_R:\n\t\tcase ENC_SRSHR_Z_P_ZI_:\n\t\t\treturn ARM64_SRSHR;\n\t\tcase ENC_SRSRA_ASISDSHF_R:\n\t\tcase ENC_SRSRA_ASIMDSHF_R:\n\t\tcase ENC_SRSRA_Z_ZI_:\n\t\t\treturn ARM64_SRSRA;\n\t\tcase ENC_SSBB_DSB_BO_BARRIERS:\n\t\t\treturn ARM64_SSBB;\n\t\tcase ENC_SSHL_ASISDSAME_ONLY:\n\t\tcase ENC_SSHL_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_SSHL;\n\t\tcase ENC_SSHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_SSHLL;\n\t\t//case ENC_SSHLL_ASIMDSHF_L:\n\t\t//\treturn ARM64_SSHLL2;\n\t\tcase ENC_SSHLLB_Z_ZI_:\n\t\t\treturn ARM64_SSHLLB;\n\t\tcase ENC_SSHLLT_Z_ZI_:\n\t\t\treturn ARM64_SSHLLT;\n\t\tcase ENC_SSHR_ASISDSHF_R:\n\t\tcase ENC_SSHR_ASIMDSHF_R:\n\t\t\treturn ARM64_SSHR;\n\t\tcase ENC_SSRA_ASISDSHF_R:\n\t\tcase ENC_SSRA_ASIMDSHF_R:\n\t\tcase ENC_SSRA_Z_ZI_:\n\t\t\treturn ARM64_SSRA;\n\t\tcase ENC_SSUBL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SSUBL;\n\t\t//case ENC_SSUBL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_SSUBL2;\n\t\tcase ENC_SSUBLB_Z_ZZ_:\n\t\t\treturn ARM64_SSUBLB;\n\t\tcase ENC_SSUBLBT_Z_ZZ_:\n\t\t\treturn ARM64_SSUBLBT;\n\t\tcase ENC_SSUBLT_Z_ZZ_:\n\t\t\treturn ARM64_SSUBLT;\n\t\tcase ENC_SSUBLTB_Z_ZZ_:\n\t\t\treturn ARM64_SSUBLTB;\n\t\tcase ENC_SSUBW_ASIMDDIFF_W:\n\t\t\treturn ARM64_SSUBW;\n\t\t//case ENC_SSUBW_ASIMDDIFF_W:\n\t\t//\treturn ARM64_SSUBW2;\n\t\tcase ENC_SSUBWB_Z_ZZ_:\n\t\t\treturn ARM64_SSUBWB;\n\t\tcase ENC_SSUBWT_Z_ZZ_:\n\t\t\treturn ARM64_SSUBWT;\n\t\tcase ENC_ST1_ASISDLSE_R1_1V:\n\t\tcase ENC_ST1_ASISDLSE_R2_2V:\n\t\tcase ENC_ST1_ASISDLSE_R3_3V:\n\t\tcase ENC_ST1_ASISDLSE_R4_4V:\n\t\tcase ENC_ST1_ASISDLSEP_I1_I1:\n\t\tcase ENC_ST1_ASISDLSEP_R1_R1:\n\t\tcase ENC_ST1_ASISDLSEP_I2_I2:\n\t\tcase ENC_ST1_ASISDLSEP_R2_R2:\n\t\tcase ENC_ST1_ASISDLSEP_I3_I3:\n\t\tcase ENC_ST1_ASISDLSEP_R3_R3:\n\t\tcase ENC_ST1_ASISDLSEP_I4_I4:\n\t\tcase ENC_ST1_ASISDLSEP_R4_R4:\n\t\tcase ENC_ST1_ASISDLSO_B1_1B:\n\t\tcase ENC_ST1_ASISDLSO_H1_1H:\n\t\tcase ENC_ST1_ASISDLSO_S1_1S:\n\t\tcase ENC_ST1_ASISDLSO_D1_1D:\n\t\tcase ENC_ST1_ASISDLSOP_B1_I1B:\n\t\tcase ENC_ST1_ASISDLSOP_BX1_R1B:\n\t\tcase ENC_ST1_ASISDLSOP_H1_I1H:\n\t\tcase ENC_ST1_ASISDLSOP_HX1_R1H:\n\t\tcase ENC_ST1_ASISDLSOP_S1_I1S:\n\t\tcase ENC_ST1_ASISDLSOP_SX1_R1S:\n\t\tcase ENC_ST1_ASISDLSOP_D1_I1D:\n\t\tcase ENC_ST1_ASISDLSOP_DX1_R1D:\n\t\t\treturn ARM64_ST1;\n\t\tcase ENC_ST1B_Z_P_AI_S:\n\t\tcase ENC_ST1B_Z_P_AI_D:\n\t\tcase ENC_ST1B_Z_P_BI_:\n\t\tcase ENC_ST1B_Z_P_BR_:\n\t\tcase ENC_ST1B_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1B_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_ST1B_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1B_ZA_P_RRR_:\n\t\t\treturn ARM64_ST1B;\n\t\tcase ENC_ST1D_Z_P_AI_D:\n\t\tcase ENC_ST1D_Z_P_BI_:\n\t\tcase ENC_ST1D_Z_P_BR_:\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1D_ZA_P_RRR_:\n\t\t\treturn ARM64_ST1D;\n\t\tcase ENC_ST1H_Z_P_AI_S:\n\t\tcase ENC_ST1H_Z_P_AI_D:\n\t\tcase ENC_ST1H_Z_P_BI_:\n\t\tcase ENC_ST1H_Z_P_BR_:\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1H_ZA_P_RRR_:\n\t\t\treturn ARM64_ST1H;\n\t\tcase ENC_ST1Q_ZA_P_RRR_:\n\t\t\treturn ARM64_ST1Q;\n\t\tcase ENC_ST1W_Z_P_AI_S:\n\t\tcase ENC_ST1W_Z_P_AI_D:\n\t\tcase ENC_ST1W_Z_P_BI_:\n\t\tcase ENC_ST1W_Z_P_BR_:\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_UNSCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_UNSCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_SCALED:\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_UNSCALED:\n\t\tcase ENC_ST1W_ZA_P_RRR_:\n\t\t\treturn ARM64_ST1W;\n\t\tcase ENC_ST2_ASISDLSE_R2:\n\t\tcase ENC_ST2_ASISDLSEP_I2_I:\n\t\tcase ENC_ST2_ASISDLSEP_R2_R:\n\t\tcase ENC_ST2_ASISDLSO_B2_2B:\n\t\tcase ENC_ST2_ASISDLSO_H2_2H:\n\t\tcase ENC_ST2_ASISDLSO_S2_2S:\n\t\tcase ENC_ST2_ASISDLSO_D2_2D:\n\t\tcase ENC_ST2_ASISDLSOP_B2_I2B:\n\t\tcase ENC_ST2_ASISDLSOP_BX2_R2B:\n\t\tcase ENC_ST2_ASISDLSOP_H2_I2H:\n\t\tcase ENC_ST2_ASISDLSOP_HX2_R2H:\n\t\tcase ENC_ST2_ASISDLSOP_S2_I2S:\n\t\tcase ENC_ST2_ASISDLSOP_SX2_R2S:\n\t\tcase ENC_ST2_ASISDLSOP_D2_I2D:\n\t\tcase ENC_ST2_ASISDLSOP_DX2_R2D:\n\t\t\treturn ARM64_ST2;\n\t\tcase ENC_ST2B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST2B;\n\t\tcase ENC_ST2D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST2D;\n\t\tcase ENC_ST2G_64SPOST_LDSTTAGS:\n\t\tcase ENC_ST2G_64SPRE_LDSTTAGS:\n\t\tcase ENC_ST2G_64SOFFSET_LDSTTAGS:\n\t\t\treturn ARM64_ST2G;\n\t\tcase ENC_ST2H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST2H;\n\t\tcase ENC_ST2W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST2W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST2W;\n\t\tcase ENC_ST3_ASISDLSE_R3:\n\t\tcase ENC_ST3_ASISDLSEP_I3_I:\n\t\tcase ENC_ST3_ASISDLSEP_R3_R:\n\t\tcase ENC_ST3_ASISDLSO_B3_3B:\n\t\tcase ENC_ST3_ASISDLSO_H3_3H:\n\t\tcase ENC_ST3_ASISDLSO_S3_3S:\n\t\tcase ENC_ST3_ASISDLSO_D3_3D:\n\t\tcase ENC_ST3_ASISDLSOP_B3_I3B:\n\t\tcase ENC_ST3_ASISDLSOP_BX3_R3B:\n\t\tcase ENC_ST3_ASISDLSOP_H3_I3H:\n\t\tcase ENC_ST3_ASISDLSOP_HX3_R3H:\n\t\tcase ENC_ST3_ASISDLSOP_S3_I3S:\n\t\tcase ENC_ST3_ASISDLSOP_SX3_R3S:\n\t\tcase ENC_ST3_ASISDLSOP_D3_I3D:\n\t\tcase ENC_ST3_ASISDLSOP_DX3_R3D:\n\t\t\treturn ARM64_ST3;\n\t\tcase ENC_ST3B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST3B;\n\t\tcase ENC_ST3D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST3D;\n\t\tcase ENC_ST3H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST3H;\n\t\tcase ENC_ST3W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST3W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST3W;\n\t\tcase ENC_ST4_ASISDLSE_R4:\n\t\tcase ENC_ST4_ASISDLSEP_I4_I:\n\t\tcase ENC_ST4_ASISDLSEP_R4_R:\n\t\tcase ENC_ST4_ASISDLSO_B4_4B:\n\t\tcase ENC_ST4_ASISDLSO_H4_4H:\n\t\tcase ENC_ST4_ASISDLSO_S4_4S:\n\t\tcase ENC_ST4_ASISDLSO_D4_4D:\n\t\tcase ENC_ST4_ASISDLSOP_B4_I4B:\n\t\tcase ENC_ST4_ASISDLSOP_BX4_R4B:\n\t\tcase ENC_ST4_ASISDLSOP_H4_I4H:\n\t\tcase ENC_ST4_ASISDLSOP_HX4_R4H:\n\t\tcase ENC_ST4_ASISDLSOP_S4_I4S:\n\t\tcase ENC_ST4_ASISDLSOP_SX4_R4S:\n\t\tcase ENC_ST4_ASISDLSOP_D4_I4D:\n\t\tcase ENC_ST4_ASISDLSOP_DX4_R4D:\n\t\t\treturn ARM64_ST4;\n\t\tcase ENC_ST4B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST4B;\n\t\tcase ENC_ST4D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST4D;\n\t\tcase ENC_ST4H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST4H;\n\t\tcase ENC_ST4W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_ST4W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_ST4W;\n\t\tcase ENC_ST64B_64L_MEMOP:\n\t\t\treturn ARM64_ST64B;\n\t\tcase ENC_ST64BV_64_MEMOP:\n\t\t\treturn ARM64_ST64BV;\n\t\tcase ENC_ST64BV0_64_MEMOP:\n\t\t\treturn ARM64_ST64BV0;\n\t\tcase ENC_STADD_LDADD_32_MEMOP:\n\t\tcase ENC_STADD_LDADD_64_MEMOP:\n\t\t\treturn ARM64_STADD;\n\t\tcase ENC_STADDB_LDADDB_32_MEMOP:\n\t\t\treturn ARM64_STADDB;\n\t\tcase ENC_STADDH_LDADDH_32_MEMOP:\n\t\t\treturn ARM64_STADDH;\n\t\tcase ENC_STADDL_LDADDL_32_MEMOP:\n\t\tcase ENC_STADDL_LDADDL_64_MEMOP:\n\t\t\treturn ARM64_STADDL;\n\t\tcase ENC_STADDLB_LDADDLB_32_MEMOP:\n\t\t\treturn ARM64_STADDLB;\n\t\tcase ENC_STADDLH_LDADDLH_32_MEMOP:\n\t\t\treturn ARM64_STADDLH;\n\t\tcase ENC_STCLR_LDCLR_32_MEMOP:\n\t\tcase ENC_STCLR_LDCLR_64_MEMOP:\n\t\t\treturn ARM64_STCLR;\n\t\tcase ENC_STCLRB_LDCLRB_32_MEMOP:\n\t\t\treturn ARM64_STCLRB;\n\t\tcase ENC_STCLRH_LDCLRH_32_MEMOP:\n\t\t\treturn ARM64_STCLRH;\n\t\tcase ENC_STCLRL_LDCLRL_32_MEMOP:\n\t\tcase ENC_STCLRL_LDCLRL_64_MEMOP:\n\t\t\treturn ARM64_STCLRL;\n\t\tcase ENC_STCLRLB_LDCLRLB_32_MEMOP:\n\t\t\treturn ARM64_STCLRLB;\n\t\tcase ENC_STCLRLH_LDCLRLH_32_MEMOP:\n\t\t\treturn ARM64_STCLRLH;\n\t\tcase ENC_STEOR_LDEOR_32_MEMOP:\n\t\tcase ENC_STEOR_LDEOR_64_MEMOP:\n\t\t\treturn ARM64_STEOR;\n\t\tcase ENC_STEORB_LDEORB_32_MEMOP:\n\t\t\treturn ARM64_STEORB;\n\t\tcase ENC_STEORH_LDEORH_32_MEMOP:\n\t\t\treturn ARM64_STEORH;\n\t\tcase ENC_STEORL_LDEORL_32_MEMOP:\n\t\tcase ENC_STEORL_LDEORL_64_MEMOP:\n\t\t\treturn ARM64_STEORL;\n\t\tcase ENC_STEORLB_LDEORLB_32_MEMOP:\n\t\t\treturn ARM64_STEORLB;\n\t\tcase ENC_STEORLH_LDEORLH_32_MEMOP:\n\t\t\treturn ARM64_STEORLH;\n\t\tcase ENC_STG_64SPOST_LDSTTAGS:\n\t\tcase ENC_STG_64SPRE_LDSTTAGS:\n\t\tcase ENC_STG_64SOFFSET_LDSTTAGS:\n\t\t\treturn ARM64_STG;\n\t\tcase ENC_STGM_64BULK_LDSTTAGS:\n\t\t\treturn ARM64_STGM;\n\t\tcase ENC_STGP_64_LDSTPAIR_POST:\n\t\tcase ENC_STGP_64_LDSTPAIR_PRE:\n\t\tcase ENC_STGP_64_LDSTPAIR_OFF:\n\t\t\treturn ARM64_STGP;\n\t\tcase ENC_STLLR_SL32_LDSTORD:\n\t\tcase ENC_STLLR_SL64_LDSTORD:\n\t\t\treturn ARM64_STLLR;\n\t\tcase ENC_STLLRB_SL32_LDSTORD:\n\t\t\treturn ARM64_STLLRB;\n\t\tcase ENC_STLLRH_SL32_LDSTORD:\n\t\t\treturn ARM64_STLLRH;\n\t\tcase ENC_STLR_SL32_LDSTORD:\n\t\tcase ENC_STLR_SL64_LDSTORD:\n\t\t\treturn ARM64_STLR;\n\t\tcase ENC_STLRB_SL32_LDSTORD:\n\t\t\treturn ARM64_STLRB;\n\t\tcase ENC_STLRH_SL32_LDSTORD:\n\t\t\treturn ARM64_STLRH;\n\t\tcase ENC_STLUR_32_LDAPSTL_UNSCALED:\n\t\tcase ENC_STLUR_64_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_STLUR;\n\t\tcase ENC_STLURB_32_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_STLURB;\n\t\tcase ENC_STLURH_32_LDAPSTL_UNSCALED:\n\t\t\treturn ARM64_STLURH;\n\t\tcase ENC_STLXP_SP32_LDSTEXCLP:\n\t\tcase ENC_STLXP_SP64_LDSTEXCLP:\n\t\t\treturn ARM64_STLXP;\n\t\tcase ENC_STLXR_SR32_LDSTEXCLR:\n\t\tcase ENC_STLXR_SR64_LDSTEXCLR:\n\t\t\treturn ARM64_STLXR;\n\t\tcase ENC_STLXRB_SR32_LDSTEXCLR:\n\t\t\treturn ARM64_STLXRB;\n\t\tcase ENC_STLXRH_SR32_LDSTEXCLR:\n\t\t\treturn ARM64_STLXRH;\n\t\tcase ENC_STNP_S_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_D_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_Q_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_32_LDSTNAPAIR_OFFS:\n\t\tcase ENC_STNP_64_LDSTNAPAIR_OFFS:\n\t\t\treturn ARM64_STNP;\n\t\tcase ENC_STNT1B_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1B_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1B_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1B_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_STNT1B;\n\t\tcase ENC_STNT1D_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1D_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1D_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_STNT1D;\n\t\tcase ENC_STNT1H_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1H_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1H_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1H_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_STNT1H;\n\t\tcase ENC_STNT1W_Z_P_AR_S_X32_UNSCALED:\n\t\tcase ENC_STNT1W_Z_P_AR_D_64_UNSCALED:\n\t\tcase ENC_STNT1W_Z_P_BI_CONTIGUOUS:\n\t\tcase ENC_STNT1W_Z_P_BR_CONTIGUOUS:\n\t\t\treturn ARM64_STNT1W;\n\t\tcase ENC_STP_S_LDSTPAIR_POST:\n\t\tcase ENC_STP_D_LDSTPAIR_POST:\n\t\tcase ENC_STP_Q_LDSTPAIR_POST:\n\t\tcase ENC_STP_S_LDSTPAIR_PRE:\n\t\tcase ENC_STP_D_LDSTPAIR_PRE:\n\t\tcase ENC_STP_Q_LDSTPAIR_PRE:\n\t\tcase ENC_STP_S_LDSTPAIR_OFF:\n\t\tcase ENC_STP_D_LDSTPAIR_OFF:\n\t\tcase ENC_STP_Q_LDSTPAIR_OFF:\n\t\tcase ENC_STP_32_LDSTPAIR_POST:\n\t\tcase ENC_STP_64_LDSTPAIR_POST:\n\t\tcase ENC_STP_32_LDSTPAIR_PRE:\n\t\tcase ENC_STP_64_LDSTPAIR_PRE:\n\t\tcase ENC_STP_32_LDSTPAIR_OFF:\n\t\tcase ENC_STP_64_LDSTPAIR_OFF:\n\t\t\treturn ARM64_STP;\n\t\tcase ENC_STR_B_LDST_IMMPOST:\n\t\tcase ENC_STR_H_LDST_IMMPOST:\n\t\tcase ENC_STR_S_LDST_IMMPOST:\n\t\tcase ENC_STR_D_LDST_IMMPOST:\n\t\tcase ENC_STR_Q_LDST_IMMPOST:\n\t\tcase ENC_STR_B_LDST_IMMPRE:\n\t\tcase ENC_STR_H_LDST_IMMPRE:\n\t\tcase ENC_STR_S_LDST_IMMPRE:\n\t\tcase ENC_STR_D_LDST_IMMPRE:\n\t\tcase ENC_STR_Q_LDST_IMMPRE:\n\t\tcase ENC_STR_B_LDST_POS:\n\t\tcase ENC_STR_H_LDST_POS:\n\t\tcase ENC_STR_S_LDST_POS:\n\t\tcase ENC_STR_D_LDST_POS:\n\t\tcase ENC_STR_Q_LDST_POS:\n\t\tcase ENC_STR_32_LDST_IMMPOST:\n\t\tcase ENC_STR_64_LDST_IMMPOST:\n\t\tcase ENC_STR_32_LDST_IMMPRE:\n\t\tcase ENC_STR_64_LDST_IMMPRE:\n\t\tcase ENC_STR_32_LDST_POS:\n\t\tcase ENC_STR_64_LDST_POS:\n\t\tcase ENC_STR_B_LDST_REGOFF:\n\t\tcase ENC_STR_BL_LDST_REGOFF:\n\t\tcase ENC_STR_H_LDST_REGOFF:\n\t\tcase ENC_STR_S_LDST_REGOFF:\n\t\tcase ENC_STR_D_LDST_REGOFF:\n\t\tcase ENC_STR_Q_LDST_REGOFF:\n\t\tcase ENC_STR_32_LDST_REGOFF:\n\t\tcase ENC_STR_64_LDST_REGOFF:\n\t\tcase ENC_STR_P_BI_:\n\t\tcase ENC_STR_Z_BI_:\n\t\tcase ENC_STR_ZA_RI_:\n\t\t\treturn ARM64_STR;\n\t\tcase ENC_STRB_32_LDST_IMMPOST:\n\t\tcase ENC_STRB_32_LDST_IMMPRE:\n\t\tcase ENC_STRB_32_LDST_POS:\n\t\tcase ENC_STRB_32B_LDST_REGOFF:\n\t\tcase ENC_STRB_32BL_LDST_REGOFF:\n\t\t\treturn ARM64_STRB;\n\t\tcase ENC_STRH_32_LDST_IMMPOST:\n\t\tcase ENC_STRH_32_LDST_IMMPRE:\n\t\tcase ENC_STRH_32_LDST_POS:\n\t\tcase ENC_STRH_32_LDST_REGOFF:\n\t\t\treturn ARM64_STRH;\n\t\tcase ENC_STSET_LDSET_32_MEMOP:\n\t\tcase ENC_STSET_LDSET_64_MEMOP:\n\t\t\treturn ARM64_STSET;\n\t\tcase ENC_STSETB_LDSETB_32_MEMOP:\n\t\t\treturn ARM64_STSETB;\n\t\tcase ENC_STSETH_LDSETH_32_MEMOP:\n\t\t\treturn ARM64_STSETH;\n\t\tcase ENC_STSETL_LDSETL_32_MEMOP:\n\t\tcase ENC_STSETL_LDSETL_64_MEMOP:\n\t\t\treturn ARM64_STSETL;\n\t\tcase ENC_STSETLB_LDSETLB_32_MEMOP:\n\t\t\treturn ARM64_STSETLB;\n\t\tcase ENC_STSETLH_LDSETLH_32_MEMOP:\n\t\t\treturn ARM64_STSETLH;\n\t\tcase ENC_STSMAX_LDSMAX_32_MEMOP:\n\t\tcase ENC_STSMAX_LDSMAX_64_MEMOP:\n\t\t\treturn ARM64_STSMAX;\n\t\tcase ENC_STSMAXB_LDSMAXB_32_MEMOP:\n\t\t\treturn ARM64_STSMAXB;\n\t\tcase ENC_STSMAXH_LDSMAXH_32_MEMOP:\n\t\t\treturn ARM64_STSMAXH;\n\t\tcase ENC_STSMAXL_LDSMAXL_32_MEMOP:\n\t\tcase ENC_STSMAXL_LDSMAXL_64_MEMOP:\n\t\t\treturn ARM64_STSMAXL;\n\t\tcase ENC_STSMAXLB_LDSMAXLB_32_MEMOP:\n\t\t\treturn ARM64_STSMAXLB;\n\t\tcase ENC_STSMAXLH_LDSMAXLH_32_MEMOP:\n\t\t\treturn ARM64_STSMAXLH;\n\t\tcase ENC_STSMIN_LDSMIN_32_MEMOP:\n\t\tcase ENC_STSMIN_LDSMIN_64_MEMOP:\n\t\t\treturn ARM64_STSMIN;\n\t\tcase ENC_STSMINB_LDSMINB_32_MEMOP:\n\t\t\treturn ARM64_STSMINB;\n\t\tcase ENC_STSMINH_LDSMINH_32_MEMOP:\n\t\t\treturn ARM64_STSMINH;\n\t\tcase ENC_STSMINL_LDSMINL_32_MEMOP:\n\t\tcase ENC_STSMINL_LDSMINL_64_MEMOP:\n\t\t\treturn ARM64_STSMINL;\n\t\tcase ENC_STSMINLB_LDSMINLB_32_MEMOP:\n\t\t\treturn ARM64_STSMINLB;\n\t\tcase ENC_STSMINLH_LDSMINLH_32_MEMOP:\n\t\t\treturn ARM64_STSMINLH;\n\t\tcase ENC_STTR_32_LDST_UNPRIV:\n\t\tcase ENC_STTR_64_LDST_UNPRIV:\n\t\t\treturn ARM64_STTR;\n\t\tcase ENC_STTRB_32_LDST_UNPRIV:\n\t\t\treturn ARM64_STTRB;\n\t\tcase ENC_STTRH_32_LDST_UNPRIV:\n\t\t\treturn ARM64_STTRH;\n\t\tcase ENC_STUMAX_LDUMAX_32_MEMOP:\n\t\tcase ENC_STUMAX_LDUMAX_64_MEMOP:\n\t\t\treturn ARM64_STUMAX;\n\t\tcase ENC_STUMAXB_LDUMAXB_32_MEMOP:\n\t\t\treturn ARM64_STUMAXB;\n\t\tcase ENC_STUMAXH_LDUMAXH_32_MEMOP:\n\t\t\treturn ARM64_STUMAXH;\n\t\tcase ENC_STUMAXL_LDUMAXL_32_MEMOP:\n\t\tcase ENC_STUMAXL_LDUMAXL_64_MEMOP:\n\t\t\treturn ARM64_STUMAXL;\n\t\tcase ENC_STUMAXLB_LDUMAXLB_32_MEMOP:\n\t\t\treturn ARM64_STUMAXLB;\n\t\tcase ENC_STUMAXLH_LDUMAXLH_32_MEMOP:\n\t\t\treturn ARM64_STUMAXLH;\n\t\tcase ENC_STUMIN_LDUMIN_32_MEMOP:\n\t\tcase ENC_STUMIN_LDUMIN_64_MEMOP:\n\t\t\treturn ARM64_STUMIN;\n\t\tcase ENC_STUMINB_LDUMINB_32_MEMOP:\n\t\t\treturn ARM64_STUMINB;\n\t\tcase ENC_STUMINH_LDUMINH_32_MEMOP:\n\t\t\treturn ARM64_STUMINH;\n\t\tcase ENC_STUMINL_LDUMINL_32_MEMOP:\n\t\tcase ENC_STUMINL_LDUMINL_64_MEMOP:\n\t\t\treturn ARM64_STUMINL;\n\t\tcase ENC_STUMINLB_LDUMINLB_32_MEMOP:\n\t\t\treturn ARM64_STUMINLB;\n\t\tcase ENC_STUMINLH_LDUMINLH_32_MEMOP:\n\t\t\treturn ARM64_STUMINLH;\n\t\tcase ENC_STUR_B_LDST_UNSCALED:\n\t\tcase ENC_STUR_H_LDST_UNSCALED:\n\t\tcase ENC_STUR_S_LDST_UNSCALED:\n\t\tcase ENC_STUR_D_LDST_UNSCALED:\n\t\tcase ENC_STUR_Q_LDST_UNSCALED:\n\t\tcase ENC_STUR_32_LDST_UNSCALED:\n\t\tcase ENC_STUR_64_LDST_UNSCALED:\n\t\t\treturn ARM64_STUR;\n\t\tcase ENC_STURB_32_LDST_UNSCALED:\n\t\t\treturn ARM64_STURB;\n\t\tcase ENC_STURH_32_LDST_UNSCALED:\n\t\t\treturn ARM64_STURH;\n\t\tcase ENC_STXP_SP32_LDSTEXCLP:\n\t\tcase ENC_STXP_SP64_LDSTEXCLP:\n\t\t\treturn ARM64_STXP;\n\t\tcase ENC_STXR_SR32_LDSTEXCLR:\n\t\tcase ENC_STXR_SR64_LDSTEXCLR:\n\t\t\treturn ARM64_STXR;\n\t\tcase ENC_STXRB_SR32_LDSTEXCLR:\n\t\t\treturn ARM64_STXRB;\n\t\tcase ENC_STXRH_SR32_LDSTEXCLR:\n\t\t\treturn ARM64_STXRH;\n\t\tcase ENC_STZ2G_64SPOST_LDSTTAGS:\n\t\tcase ENC_STZ2G_64SPRE_LDSTTAGS:\n\t\tcase ENC_STZ2G_64SOFFSET_LDSTTAGS:\n\t\t\treturn ARM64_STZ2G;\n\t\tcase ENC_STZG_64SPOST_LDSTTAGS:\n\t\tcase ENC_STZG_64SPRE_LDSTTAGS:\n\t\tcase ENC_STZG_64SOFFSET_LDSTTAGS:\n\t\t\treturn ARM64_STZG;\n\t\tcase ENC_STZGM_64BULK_LDSTTAGS:\n\t\t\treturn ARM64_STZGM;\n\t\tcase ENC_SUB_32_ADDSUB_EXT:\n\t\tcase ENC_SUB_64_ADDSUB_EXT:\n\t\tcase ENC_SUB_32_ADDSUB_IMM:\n\t\tcase ENC_SUB_64_ADDSUB_IMM:\n\t\tcase ENC_SUB_32_ADDSUB_SHIFT:\n\t\tcase ENC_SUB_64_ADDSUB_SHIFT:\n\t\tcase ENC_SUB_ASISDSAME_ONLY:\n\t\tcase ENC_SUB_ASIMDSAME_ONLY:\n\t\tcase ENC_SUB_Z_P_ZZ_:\n\t\tcase ENC_SUB_Z_ZI_:\n\t\tcase ENC_SUB_Z_ZZ_:\n\t\t\treturn ARM64_SUB;\n\t\tcase ENC_SUBG_64_ADDSUB_IMMTAGS:\n\t\t\treturn ARM64_SUBG;\n\t\tcase ENC_SUBHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_SUBHN;\n\t\t//case ENC_SUBHN_ASIMDDIFF_N:\n\t\t//\treturn ARM64_SUBHN2;\n\t\tcase ENC_SUBHNB_Z_ZZ_:\n\t\t\treturn ARM64_SUBHNB;\n\t\tcase ENC_SUBHNT_Z_ZZ_:\n\t\t\treturn ARM64_SUBHNT;\n\t\tcase ENC_SUBP_64S_DP_2SRC:\n\t\t\treturn ARM64_SUBP;\n\t\tcase ENC_SUBPS_64S_DP_2SRC:\n\t\t\treturn ARM64_SUBPS;\n\t\tcase ENC_SUBR_Z_P_ZZ_:\n\t\tcase ENC_SUBR_Z_ZI_:\n\t\t\treturn ARM64_SUBR;\n\t\tcase ENC_SUBS_32S_ADDSUB_EXT:\n\t\tcase ENC_SUBS_64S_ADDSUB_EXT:\n\t\tcase ENC_SUBS_32S_ADDSUB_IMM:\n\t\tcase ENC_SUBS_64S_ADDSUB_IMM:\n\t\tcase ENC_SUBS_32_ADDSUB_SHIFT:\n\t\tcase ENC_SUBS_64_ADDSUB_SHIFT:\n\t\t\treturn ARM64_SUBS;\n\t\tcase ENC_SUDOT_ASIMDELEM_D:\n\t\tcase ENC_SUDOT_Z_ZZZI_S:\n\t\t\treturn ARM64_SUDOT;\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_SUMOPA;\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_SUMOPS;\n\t\tcase ENC_SUNPKHI_Z_Z_:\n\t\t\treturn ARM64_SUNPKHI;\n\t\tcase ENC_SUNPKLO_Z_Z_:\n\t\t\treturn ARM64_SUNPKLO;\n\t\tcase ENC_SUQADD_ASISDMISC_R:\n\t\tcase ENC_SUQADD_ASIMDMISC_R:\n\t\tcase ENC_SUQADD_Z_P_ZZ_:\n\t\t\treturn ARM64_SUQADD;\n\t\tcase ENC_SVC_EX_EXCEPTION:\n\t\t\treturn ARM64_SVC;\n\t\tcase ENC_SWP_32_MEMOP:\n\t\tcase ENC_SWP_64_MEMOP:\n\t\t\treturn ARM64_SWP;\n\t\tcase ENC_SWPA_32_MEMOP:\n\t\tcase ENC_SWPA_64_MEMOP:\n\t\t\treturn ARM64_SWPA;\n\t\tcase ENC_SWPAB_32_MEMOP:\n\t\t\treturn ARM64_SWPAB;\n\t\tcase ENC_SWPAH_32_MEMOP:\n\t\t\treturn ARM64_SWPAH;\n\t\tcase ENC_SWPAL_32_MEMOP:\n\t\tcase ENC_SWPAL_64_MEMOP:\n\t\t\treturn ARM64_SWPAL;\n\t\tcase ENC_SWPALB_32_MEMOP:\n\t\t\treturn ARM64_SWPALB;\n\t\tcase ENC_SWPALH_32_MEMOP:\n\t\t\treturn ARM64_SWPALH;\n\t\tcase ENC_SWPB_32_MEMOP:\n\t\t\treturn ARM64_SWPB;\n\t\tcase ENC_SWPH_32_MEMOP:\n\t\t\treturn ARM64_SWPH;\n\t\tcase ENC_SWPL_32_MEMOP:\n\t\tcase ENC_SWPL_64_MEMOP:\n\t\t\treturn ARM64_SWPL;\n\t\tcase ENC_SWPLB_32_MEMOP:\n\t\t\treturn ARM64_SWPLB;\n\t\tcase ENC_SWPLH_32_MEMOP:\n\t\t\treturn ARM64_SWPLH;\n\t\tcase ENC_SXTB_SBFM_32M_BITFIELD:\n\t\tcase ENC_SXTB_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTB_Z_P_Z_:\n\t\t\treturn ARM64_SXTB;\n\t\tcase ENC_SXTH_SBFM_32M_BITFIELD:\n\t\tcase ENC_SXTH_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTH_Z_P_Z_:\n\t\t\treturn ARM64_SXTH;\n\t\tcase ENC_SXTL_SSHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_SXTL;\n\t\t//case ENC_SXTL_SSHLL_ASIMDSHF_L:\n\t\t//\treturn ARM64_SXTL2;\n\t\tcase ENC_SXTW_SBFM_64M_BITFIELD:\n\t\tcase ENC_SXTW_Z_P_Z_:\n\t\t\treturn ARM64_SXTW;\n\t\tcase ENC_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_SYS;\n\t\tcase ENC_SYSL_RC_SYSTEMINSTRS:\n\t\t\treturn ARM64_SYSL;\n\t\tcase ENC_TBL_ASIMDTBL_L2_2:\n\t\tcase ENC_TBL_ASIMDTBL_L3_3:\n\t\tcase ENC_TBL_ASIMDTBL_L4_4:\n\t\tcase ENC_TBL_ASIMDTBL_L1_1:\n\t\tcase ENC_TBL_Z_ZZ_1:\n\t\tcase ENC_TBL_Z_ZZ_2:\n\t\t\treturn ARM64_TBL;\n\t\tcase ENC_TBNZ_ONLY_TESTBRANCH:\n\t\t\treturn ARM64_TBNZ;\n\t\tcase ENC_TBX_ASIMDTBL_L2_2:\n\t\tcase ENC_TBX_ASIMDTBL_L3_3:\n\t\tcase ENC_TBX_ASIMDTBL_L4_4:\n\t\tcase ENC_TBX_ASIMDTBL_L1_1:\n\t\tcase ENC_TBX_Z_ZZ_:\n\t\t\treturn ARM64_TBX;\n\t\tcase ENC_TBZ_ONLY_TESTBRANCH:\n\t\t\treturn ARM64_TBZ;\n\t\tcase ENC_TCANCEL_EX_EXCEPTION:\n\t\t\treturn ARM64_TCANCEL;\n\t\tcase ENC_TCOMMIT_ONLY_BARRIERS:\n\t\t\treturn ARM64_TCOMMIT;\n\t\tcase ENC_TLBI_SYS_CR_SYSTEMINSTRS:\n\t\t\treturn ARM64_TLBI;\n\t\tcase ENC_TRN1_ASIMDPERM_ONLY:\n\t\tcase ENC_TRN1_P_PP_:\n\t\tcase ENC_TRN1_Z_ZZ_:\n\t\tcase ENC_TRN1_Z_ZZ_Q:\n\t\t\treturn ARM64_TRN1;\n\t\tcase ENC_TRN2_ASIMDPERM_ONLY:\n\t\tcase ENC_TRN2_P_PP_:\n\t\tcase ENC_TRN2_Z_ZZ_:\n\t\tcase ENC_TRN2_Z_ZZ_Q:\n\t\t\treturn ARM64_TRN2;\n\t\tcase ENC_TSB_HC_HINTS:\n\t\t\treturn ARM64_TSB;\n\t\tcase ENC_TST_ANDS_32S_LOG_IMM:\n\t\tcase ENC_TST_ANDS_64S_LOG_IMM:\n\t\tcase ENC_TST_ANDS_32_LOG_SHIFT:\n\t\tcase ENC_TST_ANDS_64_LOG_SHIFT:\n\t\t\treturn ARM64_TST;\n\t\tcase ENC_TSTART_BR_SYSTEMRESULT:\n\t\t\treturn ARM64_TSTART;\n\t\tcase ENC_TTEST_BR_SYSTEMRESULT:\n\t\t\treturn ARM64_TTEST;\n\t\tcase ENC_UABA_ASIMDSAME_ONLY:\n\t\tcase ENC_UABA_Z_ZZZ_:\n\t\t\treturn ARM64_UABA;\n\t\tcase ENC_UABAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UABAL;\n\t\t//case ENC_UABAL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UABAL2;\n\t\tcase ENC_UABALB_Z_ZZZ_:\n\t\t\treturn ARM64_UABALB;\n\t\tcase ENC_UABALT_Z_ZZZ_:\n\t\t\treturn ARM64_UABALT;\n\t\tcase ENC_UABD_ASIMDSAME_ONLY:\n\t\tcase ENC_UABD_Z_P_ZZ_:\n\t\t\treturn ARM64_UABD;\n\t\tcase ENC_UABDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UABDL;\n\t\t//case ENC_UABDL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UABDL2;\n\t\tcase ENC_UABDLB_Z_ZZ_:\n\t\t\treturn ARM64_UABDLB;\n\t\tcase ENC_UABDLT_Z_ZZ_:\n\t\t\treturn ARM64_UABDLT;\n\t\tcase ENC_UADALP_ASIMDMISC_P:\n\t\tcase ENC_UADALP_Z_P_Z_:\n\t\t\treturn ARM64_UADALP;\n\t\tcase ENC_UADDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UADDL;\n\t\t//case ENC_UADDL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UADDL2;\n\t\tcase ENC_UADDLB_Z_ZZ_:\n\t\t\treturn ARM64_UADDLB;\n\t\tcase ENC_UADDLP_ASIMDMISC_P:\n\t\t\treturn ARM64_UADDLP;\n\t\tcase ENC_UADDLT_Z_ZZ_:\n\t\t\treturn ARM64_UADDLT;\n\t\tcase ENC_UADDLV_ASIMDALL_ONLY:\n\t\t\treturn ARM64_UADDLV;\n\t\tcase ENC_UADDV_R_P_Z_:\n\t\t\treturn ARM64_UADDV;\n\t\tcase ENC_UADDW_ASIMDDIFF_W:\n\t\t\treturn ARM64_UADDW;\n\t\t//case ENC_UADDW_ASIMDDIFF_W:\n\t\t//\treturn ARM64_UADDW2;\n\t\tcase ENC_UADDWB_Z_ZZ_:\n\t\t\treturn ARM64_UADDWB;\n\t\tcase ENC_UADDWT_Z_ZZ_:\n\t\t\treturn ARM64_UADDWT;\n\t\tcase ENC_UBFIZ_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFIZ_UBFM_64M_BITFIELD:\n\t\t\treturn ARM64_UBFIZ;\n\t\tcase ENC_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFM_64M_BITFIELD:\n\t\t\treturn ARM64_UBFM;\n\t\tcase ENC_UBFX_UBFM_32M_BITFIELD:\n\t\tcase ENC_UBFX_UBFM_64M_BITFIELD:\n\t\t\treturn ARM64_UBFX;\n\t\tcase ENC_UCLAMP_Z_ZZ_:\n\t\t\treturn ARM64_UCLAMP;\n\t\tcase ENC_UCVTF_ASISDSHF_C:\n\t\tcase ENC_UCVTF_ASIMDSHF_C:\n\t\tcase ENC_UCVTF_ASISDMISCFP16_R:\n\t\tcase ENC_UCVTF_ASISDMISC_R:\n\t\tcase ENC_UCVTF_ASIMDMISCFP16_R:\n\t\tcase ENC_UCVTF_ASIMDMISC_R:\n\t\tcase ENC_UCVTF_H32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_S32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_D32_FLOAT2FIX:\n\t\tcase ENC_UCVTF_H64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_S64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_D64_FLOAT2FIX:\n\t\tcase ENC_UCVTF_H32_FLOAT2INT:\n\t\tcase ENC_UCVTF_S32_FLOAT2INT:\n\t\tcase ENC_UCVTF_D32_FLOAT2INT:\n\t\tcase ENC_UCVTF_H64_FLOAT2INT:\n\t\tcase ENC_UCVTF_S64_FLOAT2INT:\n\t\tcase ENC_UCVTF_D64_FLOAT2INT:\n\t\tcase ENC_UCVTF_Z_P_Z_H2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_W2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_W2S:\n\t\tcase ENC_UCVTF_Z_P_Z_W2D:\n\t\tcase ENC_UCVTF_Z_P_Z_X2FP16:\n\t\tcase ENC_UCVTF_Z_P_Z_X2S:\n\t\tcase ENC_UCVTF_Z_P_Z_X2D:\n\t\t\treturn ARM64_UCVTF;\n\t\tcase ENC_UDF_ONLY_PERM_UNDEF:\n\t\t\treturn ARM64_UDF;\n\t\tcase ENC_UDIV_32_DP_2SRC:\n\t\tcase ENC_UDIV_64_DP_2SRC:\n\t\tcase ENC_UDIV_Z_P_ZZ_:\n\t\t\treturn ARM64_UDIV;\n\t\tcase ENC_UDIVR_Z_P_ZZ_:\n\t\t\treturn ARM64_UDIVR;\n\t\tcase ENC_UDOT_ASIMDELEM_D:\n\t\tcase ENC_UDOT_ASIMDSAME2_D:\n\t\tcase ENC_UDOT_Z_ZZZ_:\n\t\tcase ENC_UDOT_Z_ZZZI_S:\n\t\tcase ENC_UDOT_Z_ZZZI_D:\n\t\t\treturn ARM64_UDOT;\n\t\tcase ENC_UHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_UHADD_Z_P_ZZ_:\n\t\t\treturn ARM64_UHADD;\n\t\tcase ENC_UHSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_UHSUB_Z_P_ZZ_:\n\t\t\treturn ARM64_UHSUB;\n\t\tcase ENC_UHSUBR_Z_P_ZZ_:\n\t\t\treturn ARM64_UHSUBR;\n\t\tcase ENC_UMADDL_64WA_DP_3SRC:\n\t\t\treturn ARM64_UMADDL;\n\t\tcase ENC_UMAX_ASIMDSAME_ONLY:\n\t\tcase ENC_UMAX_Z_P_ZZ_:\n\t\tcase ENC_UMAX_Z_ZI_:\n\t\t\treturn ARM64_UMAX;\n\t\tcase ENC_UMAXP_ASIMDSAME_ONLY:\n\t\tcase ENC_UMAXP_Z_P_ZZ_:\n\t\t\treturn ARM64_UMAXP;\n\t\tcase ENC_UMAXV_ASIMDALL_ONLY:\n\t\tcase ENC_UMAXV_R_P_Z_:\n\t\t\treturn ARM64_UMAXV;\n\t\tcase ENC_UMIN_ASIMDSAME_ONLY:\n\t\tcase ENC_UMIN_Z_P_ZZ_:\n\t\tcase ENC_UMIN_Z_ZI_:\n\t\t\treturn ARM64_UMIN;\n\t\tcase ENC_UMINP_ASIMDSAME_ONLY:\n\t\tcase ENC_UMINP_Z_P_ZZ_:\n\t\t\treturn ARM64_UMINP;\n\t\tcase ENC_UMINV_ASIMDALL_ONLY:\n\t\tcase ENC_UMINV_R_P_Z_:\n\t\t\treturn ARM64_UMINV;\n\t\tcase ENC_UMLAL_ASIMDELEM_L:\n\t\tcase ENC_UMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMLAL;\n\t\t//case ENC_UMLAL_ASIMDELEM_L:\n\t\t//case ENC_UMLAL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UMLAL2;\n\t\tcase ENC_UMLALB_Z_ZZZ_:\n\t\tcase ENC_UMLALB_Z_ZZZI_S:\n\t\tcase ENC_UMLALB_Z_ZZZI_D:\n\t\t\treturn ARM64_UMLALB;\n\t\tcase ENC_UMLALT_Z_ZZZ_:\n\t\tcase ENC_UMLALT_Z_ZZZI_S:\n\t\tcase ENC_UMLALT_Z_ZZZI_D:\n\t\t\treturn ARM64_UMLALT;\n\t\tcase ENC_UMLSL_ASIMDELEM_L:\n\t\tcase ENC_UMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMLSL;\n\t\t//case ENC_UMLSL_ASIMDELEM_L:\n\t\t//case ENC_UMLSL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UMLSL2;\n\t\tcase ENC_UMLSLB_Z_ZZZ_:\n\t\tcase ENC_UMLSLB_Z_ZZZI_S:\n\t\tcase ENC_UMLSLB_Z_ZZZI_D:\n\t\t\treturn ARM64_UMLSLB;\n\t\tcase ENC_UMLSLT_Z_ZZZ_:\n\t\tcase ENC_UMLSLT_Z_ZZZI_S:\n\t\tcase ENC_UMLSLT_Z_ZZZI_D:\n\t\t\treturn ARM64_UMLSLT;\n\t\tcase ENC_UMMLA_ASIMDSAME2_G:\n\t\tcase ENC_UMMLA_Z_ZZZ_:\n\t\t\treturn ARM64_UMMLA;\n\t\tcase ENC_UMNEGL_UMSUBL_64WA_DP_3SRC:\n\t\t\treturn ARM64_UMNEGL;\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_UMOPA;\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_UMOPS;\n\t\tcase ENC_UMOV_ASIMDINS_W_W:\n\t\tcase ENC_UMOV_ASIMDINS_X_X:\n\t\t\treturn ARM64_UMOV;\n\t\tcase ENC_UMSUBL_64WA_DP_3SRC:\n\t\t\treturn ARM64_UMSUBL;\n\t\tcase ENC_UMULH_64_DP_3SRC:\n\t\tcase ENC_UMULH_Z_P_ZZ_:\n\t\tcase ENC_UMULH_Z_ZZ_:\n\t\t\treturn ARM64_UMULH;\n\t\tcase ENC_UMULL_UMADDL_64WA_DP_3SRC:\n\t\tcase ENC_UMULL_ASIMDELEM_L:\n\t\tcase ENC_UMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMULL;\n\t\t//case ENC_UMULL_ASIMDELEM_L:\n\t\t//case ENC_UMULL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_UMULL2;\n\t\tcase ENC_UMULLB_Z_ZZ_:\n\t\tcase ENC_UMULLB_Z_ZZI_S:\n\t\tcase ENC_UMULLB_Z_ZZI_D:\n\t\t\treturn ARM64_UMULLB;\n\t\tcase ENC_UMULLT_Z_ZZ_:\n\t\tcase ENC_UMULLT_Z_ZZI_S:\n\t\tcase ENC_UMULLT_Z_ZZI_D:\n\t\t\treturn ARM64_UMULLT;\n\t\tcase ENC_UQADD_ASISDSAME_ONLY:\n\t\tcase ENC_UQADD_ASIMDSAME_ONLY:\n\t\tcase ENC_UQADD_Z_P_ZZ_:\n\t\tcase ENC_UQADD_Z_ZI_:\n\t\tcase ENC_UQADD_Z_ZZ_:\n\t\t\treturn ARM64_UQADD;\n\t\tcase ENC_UQDECB_R_RS_UW:\n\t\tcase ENC_UQDECB_R_RS_X:\n\t\t\treturn ARM64_UQDECB;\n\t\tcase ENC_UQDECD_R_RS_UW:\n\t\tcase ENC_UQDECD_R_RS_X:\n\t\tcase ENC_UQDECD_Z_ZS_:\n\t\t\treturn ARM64_UQDECD;\n\t\tcase ENC_UQDECH_R_RS_UW:\n\t\tcase ENC_UQDECH_R_RS_X:\n\t\tcase ENC_UQDECH_Z_ZS_:\n\t\t\treturn ARM64_UQDECH;\n\t\tcase ENC_UQDECP_R_P_R_UW:\n\t\tcase ENC_UQDECP_R_P_R_X:\n\t\tcase ENC_UQDECP_Z_P_Z_:\n\t\t\treturn ARM64_UQDECP;\n\t\tcase ENC_UQDECW_R_RS_UW:\n\t\tcase ENC_UQDECW_R_RS_X:\n\t\tcase ENC_UQDECW_Z_ZS_:\n\t\t\treturn ARM64_UQDECW;\n\t\tcase ENC_UQINCB_R_RS_UW:\n\t\tcase ENC_UQINCB_R_RS_X:\n\t\t\treturn ARM64_UQINCB;\n\t\tcase ENC_UQINCD_R_RS_UW:\n\t\tcase ENC_UQINCD_R_RS_X:\n\t\tcase ENC_UQINCD_Z_ZS_:\n\t\t\treturn ARM64_UQINCD;\n\t\tcase ENC_UQINCH_R_RS_UW:\n\t\tcase ENC_UQINCH_R_RS_X:\n\t\tcase ENC_UQINCH_Z_ZS_:\n\t\t\treturn ARM64_UQINCH;\n\t\tcase ENC_UQINCP_R_P_R_UW:\n\t\tcase ENC_UQINCP_R_P_R_X:\n\t\tcase ENC_UQINCP_Z_P_Z_:\n\t\t\treturn ARM64_UQINCP;\n\t\tcase ENC_UQINCW_R_RS_UW:\n\t\tcase ENC_UQINCW_R_RS_X:\n\t\tcase ENC_UQINCW_Z_ZS_:\n\t\t\treturn ARM64_UQINCW;\n\t\tcase ENC_UQRSHL_ASISDSAME_ONLY:\n\t\tcase ENC_UQRSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_UQRSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_UQRSHL;\n\t\tcase ENC_UQRSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_UQRSHLR;\n\t\tcase ENC_UQRSHRN_ASISDSHF_N:\n\t\tcase ENC_UQRSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_UQRSHRN;\n\t\t//case ENC_UQRSHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_UQRSHRN2;\n\t\tcase ENC_UQRSHRNB_Z_ZI_:\n\t\t\treturn ARM64_UQRSHRNB;\n\t\tcase ENC_UQRSHRNT_Z_ZI_:\n\t\t\treturn ARM64_UQRSHRNT;\n\t\tcase ENC_UQSHL_ASISDSHF_R:\n\t\tcase ENC_UQSHL_ASIMDSHF_R:\n\t\tcase ENC_UQSHL_ASISDSAME_ONLY:\n\t\tcase ENC_UQSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_UQSHL_Z_P_ZI_:\n\t\tcase ENC_UQSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_UQSHL;\n\t\tcase ENC_UQSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_UQSHLR;\n\t\tcase ENC_UQSHRN_ASISDSHF_N:\n\t\tcase ENC_UQSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_UQSHRN;\n\t\t//case ENC_UQSHRN_ASIMDSHF_N:\n\t\t//\treturn ARM64_UQSHRN2;\n\t\tcase ENC_UQSHRNB_Z_ZI_:\n\t\t\treturn ARM64_UQSHRNB;\n\t\tcase ENC_UQSHRNT_Z_ZI_:\n\t\t\treturn ARM64_UQSHRNT;\n\t\tcase ENC_UQSUB_ASISDSAME_ONLY:\n\t\tcase ENC_UQSUB_ASIMDSAME_ONLY:\n\t\tcase ENC_UQSUB_Z_P_ZZ_:\n\t\tcase ENC_UQSUB_Z_ZI_:\n\t\tcase ENC_UQSUB_Z_ZZ_:\n\t\t\treturn ARM64_UQSUB;\n\t\tcase ENC_UQSUBR_Z_P_ZZ_:\n\t\t\treturn ARM64_UQSUBR;\n\t\tcase ENC_UQXTN_ASISDMISC_N:\n\t\tcase ENC_UQXTN_ASIMDMISC_N:\n\t\t\treturn ARM64_UQXTN;\n\t\t//case ENC_UQXTN_ASIMDMISC_N:\n\t\t//\treturn ARM64_UQXTN2;\n\t\tcase ENC_UQXTNB_Z_ZZ_:\n\t\t\treturn ARM64_UQXTNB;\n\t\tcase ENC_UQXTNT_Z_ZZ_:\n\t\t\treturn ARM64_UQXTNT;\n\t\tcase ENC_URECPE_ASIMDMISC_R:\n\t\tcase ENC_URECPE_Z_P_Z_:\n\t\t\treturn ARM64_URECPE;\n\t\tcase ENC_URHADD_ASIMDSAME_ONLY:\n\t\tcase ENC_URHADD_Z_P_ZZ_:\n\t\t\treturn ARM64_URHADD;\n\t\tcase ENC_URSHL_ASISDSAME_ONLY:\n\t\tcase ENC_URSHL_ASIMDSAME_ONLY:\n\t\tcase ENC_URSHL_Z_P_ZZ_:\n\t\t\treturn ARM64_URSHL;\n\t\tcase ENC_URSHLR_Z_P_ZZ_:\n\t\t\treturn ARM64_URSHLR;\n\t\tcase ENC_URSHR_ASISDSHF_R:\n\t\tcase ENC_URSHR_ASIMDSHF_R:\n\t\tcase ENC_URSHR_Z_P_ZI_:\n\t\t\treturn ARM64_URSHR;\n\t\tcase ENC_URSQRTE_ASIMDMISC_R:\n\t\tcase ENC_URSQRTE_Z_P_Z_:\n\t\t\treturn ARM64_URSQRTE;\n\t\tcase ENC_URSRA_ASISDSHF_R:\n\t\tcase ENC_URSRA_ASIMDSHF_R:\n\t\tcase ENC_URSRA_Z_ZI_:\n\t\t\treturn ARM64_URSRA;\n\t\tcase ENC_USDOT_ASIMDELEM_D:\n\t\tcase ENC_USDOT_ASIMDSAME2_D:\n\t\tcase ENC_USDOT_Z_ZZZ_S:\n\t\tcase ENC_USDOT_Z_ZZZI_S:\n\t\t\treturn ARM64_USDOT;\n\t\tcase ENC_USHL_ASISDSAME_ONLY:\n\t\tcase ENC_USHL_ASIMDSAME_ONLY:\n\t\t\treturn ARM64_USHL;\n\t\tcase ENC_USHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_USHLL;\n\t\t//case ENC_USHLL_ASIMDSHF_L:\n\t\t//\treturn ARM64_USHLL2;\n\t\tcase ENC_USHLLB_Z_ZI_:\n\t\t\treturn ARM64_USHLLB;\n\t\tcase ENC_USHLLT_Z_ZI_:\n\t\t\treturn ARM64_USHLLT;\n\t\tcase ENC_USHR_ASISDSHF_R:\n\t\tcase ENC_USHR_ASIMDSHF_R:\n\t\t\treturn ARM64_USHR;\n\t\tcase ENC_USMMLA_ASIMDSAME2_G:\n\t\tcase ENC_USMMLA_Z_ZZZ_:\n\t\t\treturn ARM64_USMMLA;\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_32:\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_USMOPA;\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_32:\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_64:\n\t\t\treturn ARM64_USMOPS;\n\t\tcase ENC_USQADD_ASISDMISC_R:\n\t\tcase ENC_USQADD_ASIMDMISC_R:\n\t\tcase ENC_USQADD_Z_P_ZZ_:\n\t\t\treturn ARM64_USQADD;\n\t\tcase ENC_USRA_ASISDSHF_R:\n\t\tcase ENC_USRA_ASIMDSHF_R:\n\t\tcase ENC_USRA_Z_ZI_:\n\t\t\treturn ARM64_USRA;\n\t\tcase ENC_USUBL_ASIMDDIFF_L:\n\t\t\treturn ARM64_USUBL;\n\t\t//case ENC_USUBL_ASIMDDIFF_L:\n\t\t//\treturn ARM64_USUBL2;\n\t\tcase ENC_USUBLB_Z_ZZ_:\n\t\t\treturn ARM64_USUBLB;\n\t\tcase ENC_USUBLT_Z_ZZ_:\n\t\t\treturn ARM64_USUBLT;\n\t\tcase ENC_USUBW_ASIMDDIFF_W:\n\t\t\treturn ARM64_USUBW;\n\t\t//case ENC_USUBW_ASIMDDIFF_W:\n\t\t//\treturn ARM64_USUBW2;\n\t\tcase ENC_USUBWB_Z_ZZ_:\n\t\t\treturn ARM64_USUBWB;\n\t\tcase ENC_USUBWT_Z_ZZ_:\n\t\t\treturn ARM64_USUBWT;\n\t\tcase ENC_UUNPKHI_Z_Z_:\n\t\t\treturn ARM64_UUNPKHI;\n\t\tcase ENC_UUNPKLO_Z_Z_:\n\t\t\treturn ARM64_UUNPKLO;\n\t\tcase ENC_UXTB_UBFM_32M_BITFIELD:\n\t\tcase ENC_UXTB_Z_P_Z_:\n\t\t\treturn ARM64_UXTB;\n\t\tcase ENC_UXTH_UBFM_32M_BITFIELD:\n\t\tcase ENC_UXTH_Z_P_Z_:\n\t\t\treturn ARM64_UXTH;\n\t\tcase ENC_UXTL_USHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_UXTL;\n\t\t//case ENC_UXTL_USHLL_ASIMDSHF_L:\n\t\t//\treturn ARM64_UXTL2;\n\t\tcase ENC_UXTW_Z_P_Z_:\n\t\t\treturn ARM64_UXTW;\n\t\tcase ENC_UZP1_ASIMDPERM_ONLY:\n\t\tcase ENC_UZP1_P_PP_:\n\t\tcase ENC_UZP1_Z_ZZ_:\n\t\tcase ENC_UZP1_Z_ZZ_Q:\n\t\t\treturn ARM64_UZP1;\n\t\tcase ENC_UZP2_ASIMDPERM_ONLY:\n\t\tcase ENC_UZP2_P_PP_:\n\t\tcase ENC_UZP2_Z_ZZ_:\n\t\tcase ENC_UZP2_Z_ZZ_Q:\n\t\t\treturn ARM64_UZP2;\n\t\tcase ENC_WFE_HI_HINTS:\n\t\t\treturn ARM64_WFE;\n\t\tcase ENC_WFET_ONLY_SYSTEMINSTRSWITHREG:\n\t\t\treturn ARM64_WFET;\n\t\tcase ENC_WFI_HI_HINTS:\n\t\t\treturn ARM64_WFI;\n\t\tcase ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG:\n\t\t\treturn ARM64_WFIT;\n\t\tcase ENC_WHILEGE_P_P_RR_:\n\t\t\treturn ARM64_WHILEGE;\n\t\tcase ENC_WHILEGT_P_P_RR_:\n\t\t\treturn ARM64_WHILEGT;\n\t\tcase ENC_WHILEHI_P_P_RR_:\n\t\t\treturn ARM64_WHILEHI;\n\t\tcase ENC_WHILEHS_P_P_RR_:\n\t\t\treturn ARM64_WHILEHS;\n\t\tcase ENC_WHILELE_P_P_RR_:\n\t\t\treturn ARM64_WHILELE;\n\t\tcase ENC_WHILELO_P_P_RR_:\n\t\t\treturn ARM64_WHILELO;\n\t\tcase ENC_WHILELS_P_P_RR_:\n\t\t\treturn ARM64_WHILELS;\n\t\tcase ENC_WHILELT_P_P_RR_:\n\t\t\treturn ARM64_WHILELT;\n\t\tcase ENC_WHILERW_P_RR_:\n\t\t\treturn ARM64_WHILERW;\n\t\tcase ENC_WHILEWR_P_RR_:\n\t\t\treturn ARM64_WHILEWR;\n\t\tcase ENC_WRFFR_F_P_:\n\t\t\treturn ARM64_WRFFR;\n\t\tcase ENC_XAFLAG_M_PSTATE:\n\t\t\treturn ARM64_XAFLAG;\n\t\tcase ENC_XAR_VVV2_CRYPTO3_IMM6:\n\t\tcase ENC_XAR_Z_ZZI_:\n\t\t\treturn ARM64_XAR;\n\t\tcase ENC_XPACD_64Z_DP_1SRC:\n\t\t\treturn ARM64_XPACD;\n\t\tcase ENC_XPACI_64Z_DP_1SRC:\n\t\t\treturn ARM64_XPACI;\n\t\tcase ENC_XPACLRI_HI_HINTS:\n\t\t\treturn ARM64_XPACLRI;\n\t\tcase ENC_XTN_ASIMDMISC_N:\n\t\t\treturn ARM64_XTN;\n\t\t//case ENC_XTN_ASIMDMISC_N:\n\t\t//\treturn ARM64_XTN2;\n\t\tcase ENC_YIELD_HI_HINTS:\n\t\t\treturn ARM64_YIELD;\n\t\tcase ENC_ZERO_ZA_I_:\n\t\t\treturn ARM64_ZERO;\n\t\tcase ENC_ZIP1_ASIMDPERM_ONLY:\n\t\tcase ENC_ZIP1_P_PP_:\n\t\tcase ENC_ZIP1_Z_ZZ_:\n\t\tcase ENC_ZIP1_Z_ZZ_Q:\n\t\t\treturn ARM64_ZIP1;\n\t\tcase ENC_ZIP2_ASIMDPERM_ONLY:\n\t\tcase ENC_ZIP2_P_PP_:\n\t\tcase ENC_ZIP2_Z_ZZ_:\n\t\tcase ENC_ZIP2_Z_ZZ_Q:\n\t\t\treturn ARM64_ZIP2;\n\t\tdefault:\n\t\t\treturn ARM64_ERROR;\n\t}\n}\n\nenum Operation enc_to_oper2(enum ENCODING enc)\n{\n\tswitch(enc) {\n\t\tcase ENC_ADDHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_ADDHN2;\n\t\tcase ENC_BFCVTN_ASIMDMISC_4S:\n\t\t\treturn ARM64_BFCVTN2;\n\t\tcase ENC_FCVTL_ASIMDMISC_L:\n\t\t\treturn ARM64_FCVTL2;\n\t\tcase ENC_FCVTN_ASIMDMISC_N:\n\t\t\treturn ARM64_FCVTN2;\n\t\tcase ENC_FCVTXN_ASIMDMISC_N:\n\t\t\treturn ARM64_FCVTXN2;\n\t\tcase ENC_PMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_PMULL2;\n\t\tcase ENC_RADDHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_RADDHN2;\n\t\tcase ENC_RSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_RSHRN2;\n\t\tcase ENC_RSUBHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_RSUBHN2;\n\t\tcase ENC_SABAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SABAL2;\n\t\tcase ENC_SABDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SABDL2;\n\t\tcase ENC_SADDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SADDL2;\n\t\tcase ENC_SADDW_ASIMDDIFF_W:\n\t\t\treturn ARM64_SADDW2;\n\t\tcase ENC_SHLL_ASIMDMISC_S:\n\t\t\treturn ARM64_SHLL2;\n\t\tcase ENC_SHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SHRN2;\n\t\tcase ENC_SMLAL_ASIMDELEM_L:\n\t\tcase ENC_SMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMLAL2;\n\t\tcase ENC_SMLSL_ASIMDELEM_L:\n\t\tcase ENC_SMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMLSL2;\n\t\tcase ENC_SMULL_ASIMDELEM_L:\n\t\tcase ENC_SMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SMULL2;\n\t\tcase ENC_SQDMLAL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMLAL2;\n\t\tcase ENC_SQDMLSL_ASIMDELEM_L:\n\t\tcase ENC_SQDMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMLSL2;\n\t\tcase ENC_SQDMULL_ASIMDELEM_L:\n\t\tcase ENC_SQDMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SQDMULL2;\n\t\tcase ENC_SQRSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQRSHRN2;\n\t\tcase ENC_SQRSHRUN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQRSHRUN2;\n\t\tcase ENC_SQSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQSHRN2;\n\t\tcase ENC_SQSHRUN_ASIMDSHF_N:\n\t\t\treturn ARM64_SQSHRUN2;\n\t\tcase ENC_SQXTN_ASIMDMISC_N:\n\t\t\treturn ARM64_SQXTN2;\n\t\tcase ENC_SQXTUN_ASIMDMISC_N:\n\t\t\treturn ARM64_SQXTUN2;\n\t\tcase ENC_SSHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_SSHLL2;\n\t\tcase ENC_SSUBL_ASIMDDIFF_L:\n\t\t\treturn ARM64_SSUBL2;\n\t\tcase ENC_SSUBW_ASIMDDIFF_W:\n\t\t\treturn ARM64_SSUBW2;\n\t\tcase ENC_SUBHN_ASIMDDIFF_N:\n\t\t\treturn ARM64_SUBHN2;\n\t\tcase ENC_SXTL_SSHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_SXTL2;\n\t\tcase ENC_UABAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UABAL2;\n\t\tcase ENC_UABDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UABDL2;\n\t\tcase ENC_UADDL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UADDL2;\n\t\tcase ENC_UADDW_ASIMDDIFF_W:\n\t\t\treturn ARM64_UADDW2;\n\t\tcase ENC_UMLAL_ASIMDELEM_L:\n\t\tcase ENC_UMLAL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMLAL2;\n\t\tcase ENC_UMLSL_ASIMDELEM_L:\n\t\tcase ENC_UMLSL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMLSL2;\n\t\tcase ENC_UMULL_ASIMDELEM_L:\n\t\tcase ENC_UMULL_ASIMDDIFF_L:\n\t\t\treturn ARM64_UMULL2;\n\t\tcase ENC_UQRSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_UQRSHRN2;\n\t\tcase ENC_UQSHRN_ASIMDSHF_N:\n\t\t\treturn ARM64_UQSHRN2;\n\t\tcase ENC_UQXTN_ASIMDMISC_N:\n\t\t\treturn ARM64_UQXTN2;\n\t\tcase ENC_USHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_USHLL2;\n\t\tcase ENC_USUBL_ASIMDDIFF_L:\n\t\t\treturn ARM64_USUBL2;\n\t\tcase ENC_USUBW_ASIMDDIFF_W:\n\t\t\treturn ARM64_USUBW2;\n\t\tcase ENC_UXTL_USHLL_ASIMDSHF_L:\n\t\t\treturn ARM64_UXTL2;\n\t\tcase ENC_XTN_ASIMDMISC_N:\n\t\t\treturn ARM64_XTN2;\n\t\tdefault:\n\t\t\treturn ARM64_ERROR;\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/encodings_dec.h",
    "content": "/* GENERATED FILE */\n#pragma once\n// 3785 total named encodings\n// 2907 are \"real\" (encoding or alias)\n// 220 are alias\n// 2687 are \"base\" (not an alias, not a placeholder)\n// 878 are named placeholders for decoding endpoints\nenum ENCODING {\nENC_UNKNOWN=0, // 0 for easy init/memset\nENC_ABS_ASIMDMISC_R=1,\nENC_ABS_ASISDMISC_R=2,\nENC_ADCS_32_ADDSUB_CARRY=3,\nENC_ADCS_64_ADDSUB_CARRY=4,\nENC_ADC_32_ADDSUB_CARRY=5,\nENC_ADC_64_ADDSUB_CARRY=6,\nENC_ADDG_64_ADDSUB_IMMTAGS=7,\nENC_ADDHN_ASIMDDIFF_N=8,\nENC_ADDP_ASIMDSAME_ONLY=9,\nENC_ADDP_ASISDPAIR_ONLY=10,\nENC_ADDS_32S_ADDSUB_EXT=11,\nENC_ADDS_32S_ADDSUB_IMM=12,\nENC_ADDS_32_ADDSUB_SHIFT=13,\nENC_ADDS_64S_ADDSUB_EXT=14,\nENC_ADDS_64S_ADDSUB_IMM=15,\nENC_ADDS_64_ADDSUB_SHIFT=16,\nENC_ADDV_ASIMDALL_ONLY=17,\nENC_ADD_32_ADDSUB_EXT=18,\nENC_ADD_32_ADDSUB_IMM=19,\nENC_ADD_32_ADDSUB_SHIFT=20,\nENC_ADD_64_ADDSUB_EXT=21,\nENC_ADD_64_ADDSUB_IMM=22,\nENC_ADD_64_ADDSUB_SHIFT=23,\nENC_ADD_ASIMDSAME_ONLY=24,\nENC_ADD_ASISDSAME_ONLY=25,\nENC_ADRP_ONLY_PCRELADDR=26,\nENC_ADR_ONLY_PCRELADDR=27,\nENC_AESD_B_CRYPTOAES=28,\nENC_AESE_B_CRYPTOAES=29,\nENC_AESIMC_B_CRYPTOAES=30,\nENC_AESMC_B_CRYPTOAES=31,\nENC_ANDS_32S_LOG_IMM=32,\nENC_ANDS_32_LOG_SHIFT=33,\nENC_ANDS_64S_LOG_IMM=34,\nENC_ANDS_64_LOG_SHIFT=35,\nENC_AND_32_LOG_IMM=36,\nENC_AND_32_LOG_SHIFT=37,\nENC_AND_64_LOG_IMM=38,\nENC_AND_64_LOG_SHIFT=39,\nENC_AND_ASIMDSAME_ONLY=40,\nENC_ASRV_32_DP_2SRC=41,\nENC_ASRV_64_DP_2SRC=42,\nENC_ASR_ASRV_32_DP_2SRC=43, // alias\nENC_ASR_ASRV_64_DP_2SRC=44, // alias\nENC_ASR_SBFM_32M_BITFIELD=45, // alias\nENC_ASR_SBFM_64M_BITFIELD=46, // alias\nENC_AT_SYS_CR_SYSTEMINSTRS=47, // alias\nENC_AUTDA_64P_DP_1SRC=48,\nENC_AUTDB_64P_DP_1SRC=49,\nENC_AUTDZA_64Z_DP_1SRC=50,\nENC_AUTDZB_64Z_DP_1SRC=51,\nENC_AUTIA1716_HI_HINTS=52,\nENC_AUTIASP_HI_HINTS=53,\nENC_AUTIAZ_HI_HINTS=54,\nENC_AUTIA_64P_DP_1SRC=55,\nENC_AUTIB1716_HI_HINTS=56,\nENC_AUTIBSP_HI_HINTS=57,\nENC_AUTIBZ_HI_HINTS=58,\nENC_AUTIB_64P_DP_1SRC=59,\nENC_AUTIZA_64Z_DP_1SRC=60,\nENC_AUTIZB_64Z_DP_1SRC=61,\nENC_AXFLAG_M_PSTATE=62,\nENC_BCAX_VVV16_CRYPTO4=63,\nENC_BFCVTN_ASIMDMISC_4S=64,\nENC_BFCVT_BS_FLOATDP1=65,\nENC_BFC_BFM_32M_BITFIELD=66, // alias\nENC_BFC_BFM_64M_BITFIELD=67, // alias\nENC_BFDOT_ASIMDELEM_E=68,\nENC_BFDOT_ASIMDSAME2_D=69,\nENC_BFI_BFM_32M_BITFIELD=70, // alias\nENC_BFI_BFM_64M_BITFIELD=71, // alias\nENC_BFMLAL_ASIMDELEM_F=72,\nENC_BFMLAL_ASIMDSAME2_F_=73,\nENC_BFMMLA_ASIMDSAME2_E=74,\nENC_BFM_32M_BITFIELD=75,\nENC_BFM_64M_BITFIELD=76,\nENC_BFXIL_BFM_32M_BITFIELD=77, // alias\nENC_BFXIL_BFM_64M_BITFIELD=78, // alias\nENC_BICS_32_LOG_SHIFT=79,\nENC_BICS_64_LOG_SHIFT=80,\nENC_BIC_32_LOG_SHIFT=81,\nENC_BIC_64_LOG_SHIFT=82,\nENC_BIC_AND_Z_ZI_=83, // alias\nENC_BIC_ASIMDIMM_L_HL=84,\nENC_BIC_ASIMDIMM_L_SL=85,\nENC_BIC_ASIMDSAME_ONLY=86,\nENC_BIF_ASIMDSAME_ONLY=87,\nENC_BIT_ASIMDSAME_ONLY=88,\nENC_BLRAAZ_64_BRANCH_REG=89,\nENC_BLRAA_64P_BRANCH_REG=90,\nENC_BLRABZ_64_BRANCH_REG=91,\nENC_BLRAB_64P_BRANCH_REG=92,\nENC_BLR_64_BRANCH_REG=93,\nENC_BL_ONLY_BRANCH_IMM=94,\nENC_BRAAZ_64_BRANCH_REG=95,\nENC_BRAA_64P_BRANCH_REG=96,\nENC_BRABZ_64_BRANCH_REG=97,\nENC_BRAB_64P_BRANCH_REG=98,\nENC_BRK_EX_EXCEPTION=99,\nENC_BR_64_BRANCH_REG=100,\nENC_BSL_ASIMDSAME_ONLY=101,\nENC_BTI_HB_HINTS=102,\nENC_B_ONLY_BRANCH_IMM=103,\nENC_B_ONLY_CONDBRANCH=104,\nENC_CASAB_C32_COMSWAP=105,\nENC_CASAH_C32_COMSWAP=106,\nENC_CASALB_C32_COMSWAP=107,\nENC_CASALH_C32_COMSWAP=108,\nENC_CASAL_C32_COMSWAP=109,\nENC_CASAL_C64_COMSWAP=110,\nENC_CASA_C32_COMSWAP=111,\nENC_CASA_C64_COMSWAP=112,\nENC_CASB_C32_COMSWAP=113,\nENC_CASH_C32_COMSWAP=114,\nENC_CASLB_C32_COMSWAP=115,\nENC_CASLH_C32_COMSWAP=116,\nENC_CASL_C32_COMSWAP=117,\nENC_CASL_C64_COMSWAP=118,\nENC_CASPAL_CP32_COMSWAPPR=119,\nENC_CASPAL_CP64_COMSWAPPR=120,\nENC_CASPA_CP32_COMSWAPPR=121,\nENC_CASPA_CP64_COMSWAPPR=122,\nENC_CASPL_CP32_COMSWAPPR=123,\nENC_CASPL_CP64_COMSWAPPR=124,\nENC_CASP_CP32_COMSWAPPR=125,\nENC_CASP_CP64_COMSWAPPR=126,\nENC_CAS_C32_COMSWAP=127,\nENC_CAS_C64_COMSWAP=128,\nENC_CBNZ_32_COMPBRANCH=129,\nENC_CBNZ_64_COMPBRANCH=130,\nENC_CBZ_32_COMPBRANCH=131,\nENC_CBZ_64_COMPBRANCH=132,\nENC_CCMN_32_CONDCMP_IMM=133,\nENC_CCMN_32_CONDCMP_REG=134,\nENC_CCMN_64_CONDCMP_IMM=135,\nENC_CCMN_64_CONDCMP_REG=136,\nENC_CCMP_32_CONDCMP_IMM=137,\nENC_CCMP_32_CONDCMP_REG=138,\nENC_CCMP_64_CONDCMP_IMM=139,\nENC_CCMP_64_CONDCMP_REG=140,\nENC_CFINV_M_PSTATE=141,\nENC_CFP_SYS_CR_SYSTEMINSTRS=142, // alias\nENC_CINC_CSINC_32_CONDSEL=143, // alias\nENC_CINC_CSINC_64_CONDSEL=144, // alias\nENC_CINV_CSINV_32_CONDSEL=145, // alias\nENC_CINV_CSINV_64_CONDSEL=146, // alias\nENC_CLREX_BN_BARRIERS=147,\nENC_CLS_32_DP_1SRC=148,\nENC_CLS_64_DP_1SRC=149,\nENC_CLS_ASIMDMISC_R=150,\nENC_CLZ_32_DP_1SRC=151,\nENC_CLZ_64_DP_1SRC=152,\nENC_CLZ_ASIMDMISC_R=153,\nENC_CMEQ_ASIMDMISC_Z=154,\nENC_CMEQ_ASIMDSAME_ONLY=155,\nENC_CMEQ_ASISDMISC_Z=156,\nENC_CMEQ_ASISDSAME_ONLY=157,\nENC_CMGE_ASIMDMISC_Z=158,\nENC_CMGE_ASIMDSAME_ONLY=159,\nENC_CMGE_ASISDMISC_Z=160,\nENC_CMGE_ASISDSAME_ONLY=161,\nENC_CMGT_ASIMDMISC_Z=162,\nENC_CMGT_ASIMDSAME_ONLY=163,\nENC_CMGT_ASISDMISC_Z=164,\nENC_CMGT_ASISDSAME_ONLY=165,\nENC_CMHI_ASIMDSAME_ONLY=166,\nENC_CMHI_ASISDSAME_ONLY=167,\nENC_CMHS_ASIMDSAME_ONLY=168,\nENC_CMHS_ASISDSAME_ONLY=169,\nENC_CMLE_ASIMDMISC_Z=170,\nENC_CMLE_ASISDMISC_Z=171,\nENC_CMLT_ASIMDMISC_Z=172,\nENC_CMLT_ASISDMISC_Z=173,\nENC_CMN_ADDS_32S_ADDSUB_EXT=174, // alias\nENC_CMN_ADDS_32S_ADDSUB_IMM=175, // alias\nENC_CMN_ADDS_32_ADDSUB_SHIFT=176, // alias\nENC_CMN_ADDS_64S_ADDSUB_EXT=177, // alias\nENC_CMN_ADDS_64S_ADDSUB_IMM=178, // alias\nENC_CMN_ADDS_64_ADDSUB_SHIFT=179, // alias\nENC_CMPLE_CMPGE_P_P_ZZ_=180, // alias\nENC_CMPLO_CMPHI_P_P_ZZ_=181, // alias\nENC_CMPLS_CMPHS_P_P_ZZ_=182, // alias\nENC_CMPLT_CMPGT_P_P_ZZ_=183, // alias\nENC_CMPP_SUBPS_64S_DP_2SRC=184, // alias\nENC_CMP_SUBS_32S_ADDSUB_EXT=185, // alias\nENC_CMP_SUBS_32S_ADDSUB_IMM=186, // alias\nENC_CMP_SUBS_32_ADDSUB_SHIFT=187, // alias\nENC_CMP_SUBS_64S_ADDSUB_EXT=188, // alias\nENC_CMP_SUBS_64S_ADDSUB_IMM=189, // alias\nENC_CMP_SUBS_64_ADDSUB_SHIFT=190, // alias\nENC_CMTST_ASIMDSAME_ONLY=191,\nENC_CMTST_ASISDSAME_ONLY=192,\nENC_CNEG_CSNEG_32_CONDSEL=193, // alias\nENC_CNEG_CSNEG_64_CONDSEL=194, // alias\nENC_CNT_ASIMDMISC_R=195,\nENC_CPP_SYS_CR_SYSTEMINSTRS=196, // alias\nENC_CRC32B_32C_DP_2SRC=197,\nENC_CRC32CB_32C_DP_2SRC=198,\nENC_CRC32CH_32C_DP_2SRC=199,\nENC_CRC32CW_32C_DP_2SRC=200,\nENC_CRC32CX_64C_DP_2SRC=201,\nENC_CRC32H_32C_DP_2SRC=202,\nENC_CRC32W_32C_DP_2SRC=203,\nENC_CRC32X_64C_DP_2SRC=204,\nENC_CSDB_HI_HINTS=205,\nENC_CSEL_32_CONDSEL=206,\nENC_CSEL_64_CONDSEL=207,\nENC_CSETM_CSINV_32_CONDSEL=208, // alias\nENC_CSETM_CSINV_64_CONDSEL=209, // alias\nENC_CSET_CSINC_32_CONDSEL=210, // alias\nENC_CSET_CSINC_64_CONDSEL=211, // alias\nENC_CSINC_32_CONDSEL=212,\nENC_CSINC_64_CONDSEL=213,\nENC_CSINV_32_CONDSEL=214,\nENC_CSINV_64_CONDSEL=215,\nENC_CSNEG_32_CONDSEL=216,\nENC_CSNEG_64_CONDSEL=217,\nENC_DCPS1_DC_EXCEPTION=218,\nENC_DCPS2_DC_EXCEPTION=219,\nENC_DCPS3_DC_EXCEPTION=220,\nENC_DC_SYS_CR_SYSTEMINSTRS=221, // alias\nENC_DGH_HI_HINTS=222,\nENC_DMB_BO_BARRIERS=223,\nENC_DRPS_64E_BRANCH_REG=224,\nENC_DSB_BO_BARRIERS=225,\nENC_DSB_BON_BARRIERS=226,\nENC_DUP_ASIMDINS_DR_R=227,\nENC_DUP_ASIMDINS_DV_V=228,\nENC_DUP_ASISDONE_ONLY=229,\nENC_DVP_SYS_CR_SYSTEMINSTRS=230, // alias\nENC_EON_32_LOG_SHIFT=231,\nENC_EON_64_LOG_SHIFT=232,\nENC_EON_EOR_Z_ZI_=233, // alias\nENC_EOR3_VVV16_CRYPTO4=234,\nENC_EOR_32_LOG_IMM=235,\nENC_EOR_32_LOG_SHIFT=236,\nENC_EOR_64_LOG_IMM=237,\nENC_EOR_64_LOG_SHIFT=238,\nENC_EOR_ASIMDSAME_ONLY=239,\nENC_ERETAA_64E_BRANCH_REG=240,\nENC_ERETAB_64E_BRANCH_REG=241,\nENC_ERET_64E_BRANCH_REG=242,\nENC_ESB_HI_HINTS=243,\nENC_EXTR_32_EXTRACT=244,\nENC_EXTR_64_EXTRACT=245,\nENC_EXT_ASIMDEXT_ONLY=246,\nENC_FABD_ASIMDSAME_ONLY=247,\nENC_FABD_ASIMDSAMEFP16_ONLY=248,\nENC_FABD_ASISDSAME_ONLY=249,\nENC_FABD_ASISDSAMEFP16_ONLY=250,\nENC_FABS_D_FLOATDP1=251,\nENC_FABS_H_FLOATDP1=252,\nENC_FABS_S_FLOATDP1=253,\nENC_FABS_ASIMDMISC_R=254,\nENC_FABS_ASIMDMISCFP16_R=255,\nENC_FACGE_ASIMDSAME_ONLY=256,\nENC_FACGE_ASIMDSAMEFP16_ONLY=257,\nENC_FACGE_ASISDSAME_ONLY=258,\nENC_FACGE_ASISDSAMEFP16_ONLY=259,\nENC_FACGT_ASIMDSAME_ONLY=260,\nENC_FACGT_ASIMDSAMEFP16_ONLY=261,\nENC_FACGT_ASISDSAME_ONLY=262,\nENC_FACGT_ASISDSAMEFP16_ONLY=263,\nENC_FACLE_FACGE_P_P_ZZ_=264, // alias\nENC_FACLT_FACGT_P_P_ZZ_=265, // alias\nENC_FADDP_ASIMDSAME_ONLY=266,\nENC_FADDP_ASIMDSAMEFP16_ONLY=267,\nENC_FADDP_ASISDPAIR_ONLY_H=268,\nENC_FADDP_ASISDPAIR_ONLY_SD=269,\nENC_FADD_D_FLOATDP2=270,\nENC_FADD_H_FLOATDP2=271,\nENC_FADD_S_FLOATDP2=272,\nENC_FADD_ASIMDSAME_ONLY=273,\nENC_FADD_ASIMDSAMEFP16_ONLY=274,\nENC_FCADD_ASIMDSAME2_C=275,\nENC_FCCMPE_D_FLOATCCMP=276,\nENC_FCCMPE_H_FLOATCCMP=277,\nENC_FCCMPE_S_FLOATCCMP=278,\nENC_FCCMP_D_FLOATCCMP=279,\nENC_FCCMP_H_FLOATCCMP=280,\nENC_FCCMP_S_FLOATCCMP=281,\nENC_FCMEQ_ASIMDMISC_FZ=282,\nENC_FCMEQ_ASIMDMISCFP16_FZ=283,\nENC_FCMEQ_ASIMDSAME_ONLY=284,\nENC_FCMEQ_ASIMDSAMEFP16_ONLY=285,\nENC_FCMEQ_ASISDMISC_FZ=286,\nENC_FCMEQ_ASISDMISCFP16_FZ=287,\nENC_FCMEQ_ASISDSAME_ONLY=288,\nENC_FCMEQ_ASISDSAMEFP16_ONLY=289,\nENC_FCMGE_ASIMDMISC_FZ=290,\nENC_FCMGE_ASIMDMISCFP16_FZ=291,\nENC_FCMGE_ASIMDSAME_ONLY=292,\nENC_FCMGE_ASIMDSAMEFP16_ONLY=293,\nENC_FCMGE_ASISDMISC_FZ=294,\nENC_FCMGE_ASISDMISCFP16_FZ=295,\nENC_FCMGE_ASISDSAME_ONLY=296,\nENC_FCMGE_ASISDSAMEFP16_ONLY=297,\nENC_FCMGT_ASIMDMISC_FZ=298,\nENC_FCMGT_ASIMDMISCFP16_FZ=299,\nENC_FCMGT_ASIMDSAME_ONLY=300,\nENC_FCMGT_ASIMDSAMEFP16_ONLY=301,\nENC_FCMGT_ASISDMISC_FZ=302,\nENC_FCMGT_ASISDMISCFP16_FZ=303,\nENC_FCMGT_ASISDSAME_ONLY=304,\nENC_FCMGT_ASISDSAMEFP16_ONLY=305,\nENC_FCMLA_ASIMDELEM_C_H=306,\nENC_FCMLA_ASIMDELEM_C_S=307,\nENC_FCMLA_ASIMDSAME2_C=308,\nENC_FCMLE_ASIMDMISC_FZ=309,\nENC_FCMLE_ASIMDMISCFP16_FZ=310,\nENC_FCMLE_ASISDMISC_FZ=311,\nENC_FCMLE_ASISDMISCFP16_FZ=312,\nENC_FCMLE_FCMGE_P_P_ZZ_=313, // alias\nENC_FCMLT_ASIMDMISC_FZ=314,\nENC_FCMLT_ASIMDMISCFP16_FZ=315,\nENC_FCMLT_ASISDMISC_FZ=316,\nENC_FCMLT_ASISDMISCFP16_FZ=317,\nENC_FCMLT_FCMGT_P_P_ZZ_=318, // alias\nENC_FCMPE_DZ_FLOATCMP=319,\nENC_FCMPE_D_FLOATCMP=320,\nENC_FCMPE_HZ_FLOATCMP=321,\nENC_FCMPE_H_FLOATCMP=322,\nENC_FCMPE_SZ_FLOATCMP=323,\nENC_FCMPE_S_FLOATCMP=324,\nENC_FCMP_DZ_FLOATCMP=325,\nENC_FCMP_D_FLOATCMP=326,\nENC_FCMP_HZ_FLOATCMP=327,\nENC_FCMP_H_FLOATCMP=328,\nENC_FCMP_SZ_FLOATCMP=329,\nENC_FCMP_S_FLOATCMP=330,\nENC_FCSEL_D_FLOATSEL=331,\nENC_FCSEL_H_FLOATSEL=332,\nENC_FCSEL_S_FLOATSEL=333,\nENC_FCVTAS_32D_FLOAT2INT=334,\nENC_FCVTAS_32H_FLOAT2INT=335,\nENC_FCVTAS_32S_FLOAT2INT=336,\nENC_FCVTAS_64D_FLOAT2INT=337,\nENC_FCVTAS_64H_FLOAT2INT=338,\nENC_FCVTAS_64S_FLOAT2INT=339,\nENC_FCVTAS_ASIMDMISC_R=340,\nENC_FCVTAS_ASIMDMISCFP16_R=341,\nENC_FCVTAS_ASISDMISC_R=342,\nENC_FCVTAS_ASISDMISCFP16_R=343,\nENC_FCVTAU_32D_FLOAT2INT=344,\nENC_FCVTAU_32H_FLOAT2INT=345,\nENC_FCVTAU_32S_FLOAT2INT=346,\nENC_FCVTAU_64D_FLOAT2INT=347,\nENC_FCVTAU_64H_FLOAT2INT=348,\nENC_FCVTAU_64S_FLOAT2INT=349,\nENC_FCVTAU_ASIMDMISC_R=350,\nENC_FCVTAU_ASIMDMISCFP16_R=351,\nENC_FCVTAU_ASISDMISC_R=352,\nENC_FCVTAU_ASISDMISCFP16_R=353,\nENC_FCVTL_ASIMDMISC_L=354,\nENC_FCVTMS_32D_FLOAT2INT=355,\nENC_FCVTMS_32H_FLOAT2INT=356,\nENC_FCVTMS_32S_FLOAT2INT=357,\nENC_FCVTMS_64D_FLOAT2INT=358,\nENC_FCVTMS_64H_FLOAT2INT=359,\nENC_FCVTMS_64S_FLOAT2INT=360,\nENC_FCVTMS_ASIMDMISC_R=361,\nENC_FCVTMS_ASIMDMISCFP16_R=362,\nENC_FCVTMS_ASISDMISC_R=363,\nENC_FCVTMS_ASISDMISCFP16_R=364,\nENC_FCVTMU_32D_FLOAT2INT=365,\nENC_FCVTMU_32H_FLOAT2INT=366,\nENC_FCVTMU_32S_FLOAT2INT=367,\nENC_FCVTMU_64D_FLOAT2INT=368,\nENC_FCVTMU_64H_FLOAT2INT=369,\nENC_FCVTMU_64S_FLOAT2INT=370,\nENC_FCVTMU_ASIMDMISC_R=371,\nENC_FCVTMU_ASIMDMISCFP16_R=372,\nENC_FCVTMU_ASISDMISC_R=373,\nENC_FCVTMU_ASISDMISCFP16_R=374,\nENC_FCVTNS_32D_FLOAT2INT=375,\nENC_FCVTNS_32H_FLOAT2INT=376,\nENC_FCVTNS_32S_FLOAT2INT=377,\nENC_FCVTNS_64D_FLOAT2INT=378,\nENC_FCVTNS_64H_FLOAT2INT=379,\nENC_FCVTNS_64S_FLOAT2INT=380,\nENC_FCVTNS_ASIMDMISC_R=381,\nENC_FCVTNS_ASIMDMISCFP16_R=382,\nENC_FCVTNS_ASISDMISC_R=383,\nENC_FCVTNS_ASISDMISCFP16_R=384,\nENC_FCVTNU_32D_FLOAT2INT=385,\nENC_FCVTNU_32H_FLOAT2INT=386,\nENC_FCVTNU_32S_FLOAT2INT=387,\nENC_FCVTNU_64D_FLOAT2INT=388,\nENC_FCVTNU_64H_FLOAT2INT=389,\nENC_FCVTNU_64S_FLOAT2INT=390,\nENC_FCVTNU_ASIMDMISC_R=391,\nENC_FCVTNU_ASIMDMISCFP16_R=392,\nENC_FCVTNU_ASISDMISC_R=393,\nENC_FCVTNU_ASISDMISCFP16_R=394,\nENC_FCVTN_ASIMDMISC_N=395,\nENC_FCVTPS_32D_FLOAT2INT=396,\nENC_FCVTPS_32H_FLOAT2INT=397,\nENC_FCVTPS_32S_FLOAT2INT=398,\nENC_FCVTPS_64D_FLOAT2INT=399,\nENC_FCVTPS_64H_FLOAT2INT=400,\nENC_FCVTPS_64S_FLOAT2INT=401,\nENC_FCVTPS_ASIMDMISC_R=402,\nENC_FCVTPS_ASIMDMISCFP16_R=403,\nENC_FCVTPS_ASISDMISC_R=404,\nENC_FCVTPS_ASISDMISCFP16_R=405,\nENC_FCVTPU_32D_FLOAT2INT=406,\nENC_FCVTPU_32H_FLOAT2INT=407,\nENC_FCVTPU_32S_FLOAT2INT=408,\nENC_FCVTPU_64D_FLOAT2INT=409,\nENC_FCVTPU_64H_FLOAT2INT=410,\nENC_FCVTPU_64S_FLOAT2INT=411,\nENC_FCVTPU_ASIMDMISC_R=412,\nENC_FCVTPU_ASIMDMISCFP16_R=413,\nENC_FCVTPU_ASISDMISC_R=414,\nENC_FCVTPU_ASISDMISCFP16_R=415,\nENC_FCVTXN_ASIMDMISC_N=416,\nENC_FCVTXN_ASISDMISC_N=417,\nENC_FCVTZS_32D_FLOAT2FIX=418,\nENC_FCVTZS_32D_FLOAT2INT=419,\nENC_FCVTZS_32H_FLOAT2FIX=420,\nENC_FCVTZS_32H_FLOAT2INT=421,\nENC_FCVTZS_32S_FLOAT2FIX=422,\nENC_FCVTZS_32S_FLOAT2INT=423,\nENC_FCVTZS_64D_FLOAT2FIX=424,\nENC_FCVTZS_64D_FLOAT2INT=425,\nENC_FCVTZS_64H_FLOAT2FIX=426,\nENC_FCVTZS_64H_FLOAT2INT=427,\nENC_FCVTZS_64S_FLOAT2FIX=428,\nENC_FCVTZS_64S_FLOAT2INT=429,\nENC_FCVTZS_ASIMDMISC_R=430,\nENC_FCVTZS_ASIMDMISCFP16_R=431,\nENC_FCVTZS_ASIMDSHF_C=432,\nENC_FCVTZS_ASISDMISC_R=433,\nENC_FCVTZS_ASISDMISCFP16_R=434,\nENC_FCVTZS_ASISDSHF_C=435,\nENC_FCVTZU_32D_FLOAT2FIX=436,\nENC_FCVTZU_32D_FLOAT2INT=437,\nENC_FCVTZU_32H_FLOAT2FIX=438,\nENC_FCVTZU_32H_FLOAT2INT=439,\nENC_FCVTZU_32S_FLOAT2FIX=440,\nENC_FCVTZU_32S_FLOAT2INT=441,\nENC_FCVTZU_64D_FLOAT2FIX=442,\nENC_FCVTZU_64D_FLOAT2INT=443,\nENC_FCVTZU_64H_FLOAT2FIX=444,\nENC_FCVTZU_64H_FLOAT2INT=445,\nENC_FCVTZU_64S_FLOAT2FIX=446,\nENC_FCVTZU_64S_FLOAT2INT=447,\nENC_FCVTZU_ASIMDMISC_R=448,\nENC_FCVTZU_ASIMDMISCFP16_R=449,\nENC_FCVTZU_ASIMDSHF_C=450,\nENC_FCVTZU_ASISDMISC_R=451,\nENC_FCVTZU_ASISDMISCFP16_R=452,\nENC_FCVTZU_ASISDSHF_C=453,\nENC_FCVT_DH_FLOATDP1=454,\nENC_FCVT_DS_FLOATDP1=455,\nENC_FCVT_HD_FLOATDP1=456,\nENC_FCVT_HS_FLOATDP1=457,\nENC_FCVT_SD_FLOATDP1=458,\nENC_FCVT_SH_FLOATDP1=459,\nENC_FDIV_D_FLOATDP2=460,\nENC_FDIV_H_FLOATDP2=461,\nENC_FDIV_S_FLOATDP2=462,\nENC_FDIV_ASIMDSAME_ONLY=463,\nENC_FDIV_ASIMDSAMEFP16_ONLY=464,\nENC_FJCVTZS_32D_FLOAT2INT=465,\nENC_FMADD_D_FLOATDP3=466,\nENC_FMADD_H_FLOATDP3=467,\nENC_FMADD_S_FLOATDP3=468,\nENC_FMAXNMP_ASIMDSAME_ONLY=469,\nENC_FMAXNMP_ASIMDSAMEFP16_ONLY=470,\nENC_FMAXNMP_ASISDPAIR_ONLY_H=471,\nENC_FMAXNMP_ASISDPAIR_ONLY_SD=472,\nENC_FMAXNMV_ASIMDALL_ONLY_H=473,\nENC_FMAXNMV_ASIMDALL_ONLY_SD=474,\nENC_FMAXNM_D_FLOATDP2=475,\nENC_FMAXNM_H_FLOATDP2=476,\nENC_FMAXNM_S_FLOATDP2=477,\nENC_FMAXNM_ASIMDSAME_ONLY=478,\nENC_FMAXNM_ASIMDSAMEFP16_ONLY=479,\nENC_FMAXP_ASIMDSAME_ONLY=480,\nENC_FMAXP_ASIMDSAMEFP16_ONLY=481,\nENC_FMAXP_ASISDPAIR_ONLY_H=482,\nENC_FMAXP_ASISDPAIR_ONLY_SD=483,\nENC_FMAXV_ASIMDALL_ONLY_H=484,\nENC_FMAXV_ASIMDALL_ONLY_SD=485,\nENC_FMAX_D_FLOATDP2=486,\nENC_FMAX_H_FLOATDP2=487,\nENC_FMAX_S_FLOATDP2=488,\nENC_FMAX_ASIMDSAME_ONLY=489,\nENC_FMAX_ASIMDSAMEFP16_ONLY=490,\nENC_FMINNMP_ASIMDSAME_ONLY=491,\nENC_FMINNMP_ASIMDSAMEFP16_ONLY=492,\nENC_FMINNMP_ASISDPAIR_ONLY_H=493,\nENC_FMINNMP_ASISDPAIR_ONLY_SD=494,\nENC_FMINNMV_ASIMDALL_ONLY_H=495,\nENC_FMINNMV_ASIMDALL_ONLY_SD=496,\nENC_FMINNM_D_FLOATDP2=497,\nENC_FMINNM_H_FLOATDP2=498,\nENC_FMINNM_S_FLOATDP2=499,\nENC_FMINNM_ASIMDSAME_ONLY=500,\nENC_FMINNM_ASIMDSAMEFP16_ONLY=501,\nENC_FMINP_ASIMDSAME_ONLY=502,\nENC_FMINP_ASIMDSAMEFP16_ONLY=503,\nENC_FMINP_ASISDPAIR_ONLY_H=504,\nENC_FMINP_ASISDPAIR_ONLY_SD=505,\nENC_FMINV_ASIMDALL_ONLY_H=506,\nENC_FMINV_ASIMDALL_ONLY_SD=507,\nENC_FMIN_D_FLOATDP2=508,\nENC_FMIN_H_FLOATDP2=509,\nENC_FMIN_S_FLOATDP2=510,\nENC_FMIN_ASIMDSAME_ONLY=511,\nENC_FMIN_ASIMDSAMEFP16_ONLY=512,\nENC_FMLAL2_ASIMDELEM_LH=513,\nENC_FMLAL2_ASIMDSAME_F=514,\nENC_FMLAL_ASIMDELEM_LH=515,\nENC_FMLAL_ASIMDSAME_F=516,\nENC_FMLA_ASIMDELEM_RH_H=517,\nENC_FMLA_ASIMDELEM_R_SD=518,\nENC_FMLA_ASIMDSAME_ONLY=519,\nENC_FMLA_ASIMDSAMEFP16_ONLY=520,\nENC_FMLA_ASISDELEM_RH_H=521,\nENC_FMLA_ASISDELEM_R_SD=522,\nENC_FMLSL2_ASIMDELEM_LH=523,\nENC_FMLSL2_ASIMDSAME_F=524,\nENC_FMLSL_ASIMDELEM_LH=525,\nENC_FMLSL_ASIMDSAME_F=526,\nENC_FMLS_ASIMDELEM_RH_H=527,\nENC_FMLS_ASIMDELEM_R_SD=528,\nENC_FMLS_ASIMDSAME_ONLY=529,\nENC_FMLS_ASIMDSAMEFP16_ONLY=530,\nENC_FMLS_ASISDELEM_RH_H=531,\nENC_FMLS_ASISDELEM_R_SD=532,\nENC_FMOV_32H_FLOAT2INT=533,\nENC_FMOV_32S_FLOAT2INT=534,\nENC_FMOV_64D_FLOAT2INT=535,\nENC_FMOV_64H_FLOAT2INT=536,\nENC_FMOV_64VX_FLOAT2INT=537,\nENC_FMOV_D64_FLOAT2INT=538,\nENC_FMOV_D_FLOATDP1=539,\nENC_FMOV_D_FLOATIMM=540,\nENC_FMOV_H32_FLOAT2INT=541,\nENC_FMOV_H64_FLOAT2INT=542,\nENC_FMOV_H_FLOATDP1=543,\nENC_FMOV_H_FLOATIMM=544,\nENC_FMOV_S32_FLOAT2INT=545,\nENC_FMOV_S_FLOATDP1=546,\nENC_FMOV_S_FLOATIMM=547,\nENC_FMOV_V64I_FLOAT2INT=548,\nENC_FMOV_ASIMDIMM_D2_D=549,\nENC_FMOV_ASIMDIMM_H_H=550,\nENC_FMOV_ASIMDIMM_S_S=551,\nENC_FMOV_CPY_Z_P_I_=552, // alias\nENC_FMOV_DUP_Z_I_=553, // alias\nENC_FMOV_FCPY_Z_P_I_=554, // alias\nENC_FMOV_FDUP_Z_I_=555, // alias\nENC_FMSUB_D_FLOATDP3=556,\nENC_FMSUB_H_FLOATDP3=557,\nENC_FMSUB_S_FLOATDP3=558,\nENC_FMULX_ASIMDELEM_RH_H=559,\nENC_FMULX_ASIMDELEM_R_SD=560,\nENC_FMULX_ASIMDSAME_ONLY=561,\nENC_FMULX_ASIMDSAMEFP16_ONLY=562,\nENC_FMULX_ASISDELEM_RH_H=563,\nENC_FMULX_ASISDELEM_R_SD=564,\nENC_FMULX_ASISDSAME_ONLY=565,\nENC_FMULX_ASISDSAMEFP16_ONLY=566,\nENC_FMUL_D_FLOATDP2=567,\nENC_FMUL_H_FLOATDP2=568,\nENC_FMUL_S_FLOATDP2=569,\nENC_FMUL_ASIMDELEM_RH_H=570,\nENC_FMUL_ASIMDELEM_R_SD=571,\nENC_FMUL_ASIMDSAME_ONLY=572,\nENC_FMUL_ASIMDSAMEFP16_ONLY=573,\nENC_FMUL_ASISDELEM_RH_H=574,\nENC_FMUL_ASISDELEM_R_SD=575,\nENC_FNEG_D_FLOATDP1=576,\nENC_FNEG_H_FLOATDP1=577,\nENC_FNEG_S_FLOATDP1=578,\nENC_FNEG_ASIMDMISC_R=579,\nENC_FNEG_ASIMDMISCFP16_R=580,\nENC_FNMADD_D_FLOATDP3=581,\nENC_FNMADD_H_FLOATDP3=582,\nENC_FNMADD_S_FLOATDP3=583,\nENC_FNMSUB_D_FLOATDP3=584,\nENC_FNMSUB_H_FLOATDP3=585,\nENC_FNMSUB_S_FLOATDP3=586,\nENC_FNMUL_D_FLOATDP2=587,\nENC_FNMUL_H_FLOATDP2=588,\nENC_FNMUL_S_FLOATDP2=589,\nENC_FRECPE_ASIMDMISC_R=590,\nENC_FRECPE_ASIMDMISCFP16_R=591,\nENC_FRECPE_ASISDMISC_R=592,\nENC_FRECPE_ASISDMISCFP16_R=593,\nENC_FRECPS_ASIMDSAME_ONLY=594,\nENC_FRECPS_ASIMDSAMEFP16_ONLY=595,\nENC_FRECPS_ASISDSAME_ONLY=596,\nENC_FRECPS_ASISDSAMEFP16_ONLY=597,\nENC_FRECPX_ASISDMISC_R=598,\nENC_FRECPX_ASISDMISCFP16_R=599,\nENC_FRINT32X_D_FLOATDP1=600,\nENC_FRINT32X_S_FLOATDP1=601,\nENC_FRINT32X_ASIMDMISC_R=602,\nENC_FRINT32Z_D_FLOATDP1=603,\nENC_FRINT32Z_S_FLOATDP1=604,\nENC_FRINT32Z_ASIMDMISC_R=605,\nENC_FRINT64X_D_FLOATDP1=606,\nENC_FRINT64X_S_FLOATDP1=607,\nENC_FRINT64X_ASIMDMISC_R=608,\nENC_FRINT64Z_D_FLOATDP1=609,\nENC_FRINT64Z_S_FLOATDP1=610,\nENC_FRINT64Z_ASIMDMISC_R=611,\nENC_FRINTA_D_FLOATDP1=612,\nENC_FRINTA_H_FLOATDP1=613,\nENC_FRINTA_S_FLOATDP1=614,\nENC_FRINTA_ASIMDMISC_R=615,\nENC_FRINTA_ASIMDMISCFP16_R=616,\nENC_FRINTI_D_FLOATDP1=617,\nENC_FRINTI_H_FLOATDP1=618,\nENC_FRINTI_S_FLOATDP1=619,\nENC_FRINTI_ASIMDMISC_R=620,\nENC_FRINTI_ASIMDMISCFP16_R=621,\nENC_FRINTM_D_FLOATDP1=622,\nENC_FRINTM_H_FLOATDP1=623,\nENC_FRINTM_S_FLOATDP1=624,\nENC_FRINTM_ASIMDMISC_R=625,\nENC_FRINTM_ASIMDMISCFP16_R=626,\nENC_FRINTN_D_FLOATDP1=627,\nENC_FRINTN_H_FLOATDP1=628,\nENC_FRINTN_S_FLOATDP1=629,\nENC_FRINTN_ASIMDMISC_R=630,\nENC_FRINTN_ASIMDMISCFP16_R=631,\nENC_FRINTP_D_FLOATDP1=632,\nENC_FRINTP_H_FLOATDP1=633,\nENC_FRINTP_S_FLOATDP1=634,\nENC_FRINTP_ASIMDMISC_R=635,\nENC_FRINTP_ASIMDMISCFP16_R=636,\nENC_FRINTX_D_FLOATDP1=637,\nENC_FRINTX_H_FLOATDP1=638,\nENC_FRINTX_S_FLOATDP1=639,\nENC_FRINTX_ASIMDMISC_R=640,\nENC_FRINTX_ASIMDMISCFP16_R=641,\nENC_FRINTZ_D_FLOATDP1=642,\nENC_FRINTZ_H_FLOATDP1=643,\nENC_FRINTZ_S_FLOATDP1=644,\nENC_FRINTZ_ASIMDMISC_R=645,\nENC_FRINTZ_ASIMDMISCFP16_R=646,\nENC_FRSQRTE_ASIMDMISC_R=647,\nENC_FRSQRTE_ASIMDMISCFP16_R=648,\nENC_FRSQRTE_ASISDMISC_R=649,\nENC_FRSQRTE_ASISDMISCFP16_R=650,\nENC_FRSQRTS_ASIMDSAME_ONLY=651,\nENC_FRSQRTS_ASIMDSAMEFP16_ONLY=652,\nENC_FRSQRTS_ASISDSAME_ONLY=653,\nENC_FRSQRTS_ASISDSAMEFP16_ONLY=654,\nENC_FSQRT_D_FLOATDP1=655,\nENC_FSQRT_H_FLOATDP1=656,\nENC_FSQRT_S_FLOATDP1=657,\nENC_FSQRT_ASIMDMISC_R=658,\nENC_FSQRT_ASIMDMISCFP16_R=659,\nENC_FSUB_D_FLOATDP2=660,\nENC_FSUB_H_FLOATDP2=661,\nENC_FSUB_S_FLOATDP2=662,\nENC_FSUB_ASIMDSAME_ONLY=663,\nENC_FSUB_ASIMDSAMEFP16_ONLY=664,\nENC_GMI_64G_DP_2SRC=665,\nENC_HINT_HM_HINTS=666,\nENC_HLT_EX_EXCEPTION=667,\nENC_HVC_EX_EXCEPTION=668,\nENC_IC_SYS_CR_SYSTEMINSTRS=669, // alias\nENC_INS_ASIMDINS_IR_R=670,\nENC_INS_ASIMDINS_IV_V=671,\nENC_IRG_64I_DP_2SRC=672,\nENC_ISB_BI_BARRIERS=673,\nENC_LD1R_ASISDLSO_R1=674,\nENC_LD1R_ASISDLSOP_R1_I=675,\nENC_LD1R_ASISDLSOP_RX1_R=676,\nENC_LD1_ASISDLSE_R1_1V=677,\nENC_LD1_ASISDLSE_R2_2V=678,\nENC_LD1_ASISDLSE_R3_3V=679,\nENC_LD1_ASISDLSE_R4_4V=680,\nENC_LD1_ASISDLSEP_I1_I1=681,\nENC_LD1_ASISDLSEP_I2_I2=682,\nENC_LD1_ASISDLSEP_I3_I3=683,\nENC_LD1_ASISDLSEP_I4_I4=684,\nENC_LD1_ASISDLSEP_R1_R1=685,\nENC_LD1_ASISDLSEP_R2_R2=686,\nENC_LD1_ASISDLSEP_R3_R3=687,\nENC_LD1_ASISDLSEP_R4_R4=688,\nENC_LD1_ASISDLSO_B1_1B=689,\nENC_LD1_ASISDLSO_D1_1D=690,\nENC_LD1_ASISDLSO_H1_1H=691,\nENC_LD1_ASISDLSO_S1_1S=692,\nENC_LD1_ASISDLSOP_B1_I1B=693,\nENC_LD1_ASISDLSOP_BX1_R1B=694,\nENC_LD1_ASISDLSOP_D1_I1D=695,\nENC_LD1_ASISDLSOP_DX1_R1D=696,\nENC_LD1_ASISDLSOP_H1_I1H=697,\nENC_LD1_ASISDLSOP_HX1_R1H=698,\nENC_LD1_ASISDLSOP_S1_I1S=699,\nENC_LD1_ASISDLSOP_SX1_R1S=700,\nENC_LD2R_ASISDLSO_R2=701,\nENC_LD2R_ASISDLSOP_R2_I=702,\nENC_LD2R_ASISDLSOP_RX2_R=703,\nENC_LD2_ASISDLSE_R2=704,\nENC_LD2_ASISDLSEP_I2_I=705,\nENC_LD2_ASISDLSEP_R2_R=706,\nENC_LD2_ASISDLSO_B2_2B=707,\nENC_LD2_ASISDLSO_D2_2D=708,\nENC_LD2_ASISDLSO_H2_2H=709,\nENC_LD2_ASISDLSO_S2_2S=710,\nENC_LD2_ASISDLSOP_B2_I2B=711,\nENC_LD2_ASISDLSOP_BX2_R2B=712,\nENC_LD2_ASISDLSOP_D2_I2D=713,\nENC_LD2_ASISDLSOP_DX2_R2D=714,\nENC_LD2_ASISDLSOP_H2_I2H=715,\nENC_LD2_ASISDLSOP_HX2_R2H=716,\nENC_LD2_ASISDLSOP_S2_I2S=717,\nENC_LD2_ASISDLSOP_SX2_R2S=718,\nENC_LD3R_ASISDLSO_R3=719,\nENC_LD3R_ASISDLSOP_R3_I=720,\nENC_LD3R_ASISDLSOP_RX3_R=721,\nENC_LD3_ASISDLSE_R3=722,\nENC_LD3_ASISDLSEP_I3_I=723,\nENC_LD3_ASISDLSEP_R3_R=724,\nENC_LD3_ASISDLSO_B3_3B=725,\nENC_LD3_ASISDLSO_D3_3D=726,\nENC_LD3_ASISDLSO_H3_3H=727,\nENC_LD3_ASISDLSO_S3_3S=728,\nENC_LD3_ASISDLSOP_B3_I3B=729,\nENC_LD3_ASISDLSOP_BX3_R3B=730,\nENC_LD3_ASISDLSOP_D3_I3D=731,\nENC_LD3_ASISDLSOP_DX3_R3D=732,\nENC_LD3_ASISDLSOP_H3_I3H=733,\nENC_LD3_ASISDLSOP_HX3_R3H=734,\nENC_LD3_ASISDLSOP_S3_I3S=735,\nENC_LD3_ASISDLSOP_SX3_R3S=736,\nENC_LD4R_ASISDLSO_R4=737,\nENC_LD4R_ASISDLSOP_R4_I=738,\nENC_LD4R_ASISDLSOP_RX4_R=739,\nENC_LD4_ASISDLSE_R4=740,\nENC_LD4_ASISDLSEP_I4_I=741,\nENC_LD4_ASISDLSEP_R4_R=742,\nENC_LD4_ASISDLSO_B4_4B=743,\nENC_LD4_ASISDLSO_D4_4D=744,\nENC_LD4_ASISDLSO_H4_4H=745,\nENC_LD4_ASISDLSO_S4_4S=746,\nENC_LD4_ASISDLSOP_B4_I4B=747,\nENC_LD4_ASISDLSOP_BX4_R4B=748,\nENC_LD4_ASISDLSOP_D4_I4D=749,\nENC_LD4_ASISDLSOP_DX4_R4D=750,\nENC_LD4_ASISDLSOP_H4_I4H=751,\nENC_LD4_ASISDLSOP_HX4_R4H=752,\nENC_LD4_ASISDLSOP_S4_I4S=753,\nENC_LD4_ASISDLSOP_SX4_R4S=754,\nENC_LD64B_64L_MEMOP=755,\nENC_LDADDAB_32_MEMOP=756,\nENC_LDADDAH_32_MEMOP=757,\nENC_LDADDALB_32_MEMOP=758,\nENC_LDADDALH_32_MEMOP=759,\nENC_LDADDAL_32_MEMOP=760,\nENC_LDADDAL_64_MEMOP=761,\nENC_LDADDA_32_MEMOP=762,\nENC_LDADDA_64_MEMOP=763,\nENC_LDADDB_32_MEMOP=764,\nENC_LDADDH_32_MEMOP=765,\nENC_LDADDLB_32_MEMOP=766,\nENC_LDADDLH_32_MEMOP=767,\nENC_LDADDL_32_MEMOP=768,\nENC_LDADDL_64_MEMOP=769,\nENC_LDADD_32_MEMOP=770,\nENC_LDADD_64_MEMOP=771,\nENC_LDAPRB_32L_MEMOP=772,\nENC_LDAPRH_32L_MEMOP=773,\nENC_LDAPR_32L_MEMOP=774,\nENC_LDAPR_64L_MEMOP=775,\nENC_LDAPURB_32_LDAPSTL_UNSCALED=776,\nENC_LDAPURH_32_LDAPSTL_UNSCALED=777,\nENC_LDAPURSB_32_LDAPSTL_UNSCALED=778,\nENC_LDAPURSB_64_LDAPSTL_UNSCALED=779,\nENC_LDAPURSH_32_LDAPSTL_UNSCALED=780,\nENC_LDAPURSH_64_LDAPSTL_UNSCALED=781,\nENC_LDAPURSW_64_LDAPSTL_UNSCALED=782,\nENC_LDAPUR_32_LDAPSTL_UNSCALED=783,\nENC_LDAPUR_64_LDAPSTL_UNSCALED=784,\nENC_LDARB_LR32_LDSTORD=785,\nENC_LDARH_LR32_LDSTORD=786,\nENC_LDAR_LR32_LDSTORD=787,\nENC_LDAR_LR64_LDSTORD=788,\nENC_LDAXP_LP32_LDSTEXCLP=789,\nENC_LDAXP_LP64_LDSTEXCLP=790,\nENC_LDAXRB_LR32_LDSTEXCLR=791,\nENC_LDAXRH_LR32_LDSTEXCLR=792,\nENC_LDAXR_LR32_LDSTEXCLR=793,\nENC_LDAXR_LR64_LDSTEXCLR=794,\nENC_LDCLRAB_32_MEMOP=795,\nENC_LDCLRAH_32_MEMOP=796,\nENC_LDCLRALB_32_MEMOP=797,\nENC_LDCLRALH_32_MEMOP=798,\nENC_LDCLRAL_32_MEMOP=799,\nENC_LDCLRAL_64_MEMOP=800,\nENC_LDCLRA_32_MEMOP=801,\nENC_LDCLRA_64_MEMOP=802,\nENC_LDCLRB_32_MEMOP=803,\nENC_LDCLRH_32_MEMOP=804,\nENC_LDCLRLB_32_MEMOP=805,\nENC_LDCLRLH_32_MEMOP=806,\nENC_LDCLRL_32_MEMOP=807,\nENC_LDCLRL_64_MEMOP=808,\nENC_LDCLR_32_MEMOP=809,\nENC_LDCLR_64_MEMOP=810,\nENC_LDEORAB_32_MEMOP=811,\nENC_LDEORAH_32_MEMOP=812,\nENC_LDEORALB_32_MEMOP=813,\nENC_LDEORALH_32_MEMOP=814,\nENC_LDEORAL_32_MEMOP=815,\nENC_LDEORAL_64_MEMOP=816,\nENC_LDEORA_32_MEMOP=817,\nENC_LDEORA_64_MEMOP=818,\nENC_LDEORB_32_MEMOP=819,\nENC_LDEORH_32_MEMOP=820,\nENC_LDEORLB_32_MEMOP=821,\nENC_LDEORLH_32_MEMOP=822,\nENC_LDEORL_32_MEMOP=823,\nENC_LDEORL_64_MEMOP=824,\nENC_LDEOR_32_MEMOP=825,\nENC_LDEOR_64_MEMOP=826,\nENC_LDGM_64BULK_LDSTTAGS=827,\nENC_LDG_64LOFFSET_LDSTTAGS=828,\nENC_LDLARB_LR32_LDSTORD=829,\nENC_LDLARH_LR32_LDSTORD=830,\nENC_LDLAR_LR32_LDSTORD=831,\nENC_LDLAR_LR64_LDSTORD=832,\nENC_LDNP_32_LDSTNAPAIR_OFFS=833,\nENC_LDNP_64_LDSTNAPAIR_OFFS=834,\nENC_LDNP_D_LDSTNAPAIR_OFFS=835,\nENC_LDNP_Q_LDSTNAPAIR_OFFS=836,\nENC_LDNP_S_LDSTNAPAIR_OFFS=837,\nENC_LDPSW_64_LDSTPAIR_OFF=838,\nENC_LDPSW_64_LDSTPAIR_POST=839,\nENC_LDPSW_64_LDSTPAIR_PRE=840,\nENC_LDP_32_LDSTPAIR_OFF=841,\nENC_LDP_32_LDSTPAIR_POST=842,\nENC_LDP_32_LDSTPAIR_PRE=843,\nENC_LDP_64_LDSTPAIR_OFF=844,\nENC_LDP_64_LDSTPAIR_POST=845,\nENC_LDP_64_LDSTPAIR_PRE=846,\nENC_LDP_D_LDSTPAIR_OFF=847,\nENC_LDP_D_LDSTPAIR_POST=848,\nENC_LDP_D_LDSTPAIR_PRE=849,\nENC_LDP_Q_LDSTPAIR_OFF=850,\nENC_LDP_Q_LDSTPAIR_POST=851,\nENC_LDP_Q_LDSTPAIR_PRE=852,\nENC_LDP_S_LDSTPAIR_OFF=853,\nENC_LDP_S_LDSTPAIR_POST=854,\nENC_LDP_S_LDSTPAIR_PRE=855,\nENC_LDRAA_64W_LDST_PAC=856,\nENC_LDRAA_64_LDST_PAC=857,\nENC_LDRAB_64W_LDST_PAC=858,\nENC_LDRAB_64_LDST_PAC=859,\nENC_LDRB_32BL_LDST_REGOFF=860,\nENC_LDRB_32B_LDST_REGOFF=861,\nENC_LDRB_32_LDST_IMMPOST=862,\nENC_LDRB_32_LDST_IMMPRE=863,\nENC_LDRB_32_LDST_POS=864,\nENC_LDRH_32_LDST_IMMPOST=865,\nENC_LDRH_32_LDST_IMMPRE=866,\nENC_LDRH_32_LDST_POS=867,\nENC_LDRH_32_LDST_REGOFF=868,\nENC_LDRSB_32BL_LDST_REGOFF=869,\nENC_LDRSB_32B_LDST_REGOFF=870,\nENC_LDRSB_32_LDST_IMMPOST=871,\nENC_LDRSB_32_LDST_IMMPRE=872,\nENC_LDRSB_32_LDST_POS=873,\nENC_LDRSB_64BL_LDST_REGOFF=874,\nENC_LDRSB_64B_LDST_REGOFF=875,\nENC_LDRSB_64_LDST_IMMPOST=876,\nENC_LDRSB_64_LDST_IMMPRE=877,\nENC_LDRSB_64_LDST_POS=878,\nENC_LDRSH_32_LDST_IMMPOST=879,\nENC_LDRSH_32_LDST_IMMPRE=880,\nENC_LDRSH_32_LDST_POS=881,\nENC_LDRSH_32_LDST_REGOFF=882,\nENC_LDRSH_64_LDST_IMMPOST=883,\nENC_LDRSH_64_LDST_IMMPRE=884,\nENC_LDRSH_64_LDST_POS=885,\nENC_LDRSH_64_LDST_REGOFF=886,\nENC_LDRSW_64_LDST_IMMPOST=887,\nENC_LDRSW_64_LDST_IMMPRE=888,\nENC_LDRSW_64_LDST_POS=889,\nENC_LDRSW_64_LDST_REGOFF=890,\nENC_LDRSW_64_LOADLIT=891,\nENC_LDR_32_LDST_IMMPOST=892,\nENC_LDR_32_LDST_IMMPRE=893,\nENC_LDR_32_LDST_POS=894,\nENC_LDR_32_LDST_REGOFF=895,\nENC_LDR_32_LOADLIT=896,\nENC_LDR_64_LDST_IMMPOST=897,\nENC_LDR_64_LDST_IMMPRE=898,\nENC_LDR_64_LDST_POS=899,\nENC_LDR_64_LDST_REGOFF=900,\nENC_LDR_64_LOADLIT=901,\nENC_LDR_BL_LDST_REGOFF=902,\nENC_LDR_B_LDST_IMMPOST=903,\nENC_LDR_B_LDST_IMMPRE=904,\nENC_LDR_B_LDST_POS=905,\nENC_LDR_B_LDST_REGOFF=906,\nENC_LDR_D_LDST_IMMPOST=907,\nENC_LDR_D_LDST_IMMPRE=908,\nENC_LDR_D_LDST_POS=909,\nENC_LDR_D_LDST_REGOFF=910,\nENC_LDR_D_LOADLIT=911,\nENC_LDR_H_LDST_IMMPOST=912,\nENC_LDR_H_LDST_IMMPRE=913,\nENC_LDR_H_LDST_POS=914,\nENC_LDR_H_LDST_REGOFF=915,\nENC_LDR_Q_LDST_IMMPOST=916,\nENC_LDR_Q_LDST_IMMPRE=917,\nENC_LDR_Q_LDST_POS=918,\nENC_LDR_Q_LDST_REGOFF=919,\nENC_LDR_Q_LOADLIT=920,\nENC_LDR_S_LDST_IMMPOST=921,\nENC_LDR_S_LDST_IMMPRE=922,\nENC_LDR_S_LDST_POS=923,\nENC_LDR_S_LDST_REGOFF=924,\nENC_LDR_S_LOADLIT=925,\nENC_LDSETAB_32_MEMOP=926,\nENC_LDSETAH_32_MEMOP=927,\nENC_LDSETALB_32_MEMOP=928,\nENC_LDSETALH_32_MEMOP=929,\nENC_LDSETAL_32_MEMOP=930,\nENC_LDSETAL_64_MEMOP=931,\nENC_LDSETA_32_MEMOP=932,\nENC_LDSETA_64_MEMOP=933,\nENC_LDSETB_32_MEMOP=934,\nENC_LDSETH_32_MEMOP=935,\nENC_LDSETLB_32_MEMOP=936,\nENC_LDSETLH_32_MEMOP=937,\nENC_LDSETL_32_MEMOP=938,\nENC_LDSETL_64_MEMOP=939,\nENC_LDSET_32_MEMOP=940,\nENC_LDSET_64_MEMOP=941,\nENC_LDSMAXAB_32_MEMOP=942,\nENC_LDSMAXAH_32_MEMOP=943,\nENC_LDSMAXALB_32_MEMOP=944,\nENC_LDSMAXALH_32_MEMOP=945,\nENC_LDSMAXAL_32_MEMOP=946,\nENC_LDSMAXAL_64_MEMOP=947,\nENC_LDSMAXA_32_MEMOP=948,\nENC_LDSMAXA_64_MEMOP=949,\nENC_LDSMAXB_32_MEMOP=950,\nENC_LDSMAXH_32_MEMOP=951,\nENC_LDSMAXLB_32_MEMOP=952,\nENC_LDSMAXLH_32_MEMOP=953,\nENC_LDSMAXL_32_MEMOP=954,\nENC_LDSMAXL_64_MEMOP=955,\nENC_LDSMAX_32_MEMOP=956,\nENC_LDSMAX_64_MEMOP=957,\nENC_LDSMINAB_32_MEMOP=958,\nENC_LDSMINAH_32_MEMOP=959,\nENC_LDSMINALB_32_MEMOP=960,\nENC_LDSMINALH_32_MEMOP=961,\nENC_LDSMINAL_32_MEMOP=962,\nENC_LDSMINAL_64_MEMOP=963,\nENC_LDSMINA_32_MEMOP=964,\nENC_LDSMINA_64_MEMOP=965,\nENC_LDSMINB_32_MEMOP=966,\nENC_LDSMINH_32_MEMOP=967,\nENC_LDSMINLB_32_MEMOP=968,\nENC_LDSMINLH_32_MEMOP=969,\nENC_LDSMINL_32_MEMOP=970,\nENC_LDSMINL_64_MEMOP=971,\nENC_LDSMIN_32_MEMOP=972,\nENC_LDSMIN_64_MEMOP=973,\nENC_LDTRB_32_LDST_UNPRIV=974,\nENC_LDTRH_32_LDST_UNPRIV=975,\nENC_LDTRSB_32_LDST_UNPRIV=976,\nENC_LDTRSB_64_LDST_UNPRIV=977,\nENC_LDTRSH_32_LDST_UNPRIV=978,\nENC_LDTRSH_64_LDST_UNPRIV=979,\nENC_LDTRSW_64_LDST_UNPRIV=980,\nENC_LDTR_32_LDST_UNPRIV=981,\nENC_LDTR_64_LDST_UNPRIV=982,\nENC_LDUMAXAB_32_MEMOP=983,\nENC_LDUMAXAH_32_MEMOP=984,\nENC_LDUMAXALB_32_MEMOP=985,\nENC_LDUMAXALH_32_MEMOP=986,\nENC_LDUMAXAL_32_MEMOP=987,\nENC_LDUMAXAL_64_MEMOP=988,\nENC_LDUMAXA_32_MEMOP=989,\nENC_LDUMAXA_64_MEMOP=990,\nENC_LDUMAXB_32_MEMOP=991,\nENC_LDUMAXH_32_MEMOP=992,\nENC_LDUMAXLB_32_MEMOP=993,\nENC_LDUMAXLH_32_MEMOP=994,\nENC_LDUMAXL_32_MEMOP=995,\nENC_LDUMAXL_64_MEMOP=996,\nENC_LDUMAX_32_MEMOP=997,\nENC_LDUMAX_64_MEMOP=998,\nENC_LDUMINAB_32_MEMOP=999,\nENC_LDUMINAH_32_MEMOP=1000,\nENC_LDUMINALB_32_MEMOP=1001,\nENC_LDUMINALH_32_MEMOP=1002,\nENC_LDUMINAL_32_MEMOP=1003,\nENC_LDUMINAL_64_MEMOP=1004,\nENC_LDUMINA_32_MEMOP=1005,\nENC_LDUMINA_64_MEMOP=1006,\nENC_LDUMINB_32_MEMOP=1007,\nENC_LDUMINH_32_MEMOP=1008,\nENC_LDUMINLB_32_MEMOP=1009,\nENC_LDUMINLH_32_MEMOP=1010,\nENC_LDUMINL_32_MEMOP=1011,\nENC_LDUMINL_64_MEMOP=1012,\nENC_LDUMIN_32_MEMOP=1013,\nENC_LDUMIN_64_MEMOP=1014,\nENC_LDURB_32_LDST_UNSCALED=1015,\nENC_LDURH_32_LDST_UNSCALED=1016,\nENC_LDURSB_32_LDST_UNSCALED=1017,\nENC_LDURSB_64_LDST_UNSCALED=1018,\nENC_LDURSH_32_LDST_UNSCALED=1019,\nENC_LDURSH_64_LDST_UNSCALED=1020,\nENC_LDURSW_64_LDST_UNSCALED=1021,\nENC_LDUR_32_LDST_UNSCALED=1022,\nENC_LDUR_64_LDST_UNSCALED=1023,\nENC_LDUR_B_LDST_UNSCALED=1024,\nENC_LDUR_D_LDST_UNSCALED=1025,\nENC_LDUR_H_LDST_UNSCALED=1026,\nENC_LDUR_Q_LDST_UNSCALED=1027,\nENC_LDUR_S_LDST_UNSCALED=1028,\nENC_LDXP_LP32_LDSTEXCLP=1029,\nENC_LDXP_LP64_LDSTEXCLP=1030,\nENC_LDXRB_LR32_LDSTEXCLR=1031,\nENC_LDXRH_LR32_LDSTEXCLR=1032,\nENC_LDXR_LR32_LDSTEXCLR=1033,\nENC_LDXR_LR64_LDSTEXCLR=1034,\nENC_LSLV_32_DP_2SRC=1035,\nENC_LSLV_64_DP_2SRC=1036,\nENC_LSL_LSLV_32_DP_2SRC=1037, // alias\nENC_LSL_LSLV_64_DP_2SRC=1038, // alias\nENC_LSL_UBFM_32M_BITFIELD=1039, // alias\nENC_LSL_UBFM_64M_BITFIELD=1040, // alias\nENC_LSRV_32_DP_2SRC=1041,\nENC_LSRV_64_DP_2SRC=1042,\nENC_LSR_LSRV_32_DP_2SRC=1043, // alias\nENC_LSR_LSRV_64_DP_2SRC=1044, // alias\nENC_LSR_UBFM_32M_BITFIELD=1045, // alias\nENC_LSR_UBFM_64M_BITFIELD=1046, // alias\nENC_MADD_32A_DP_3SRC=1047,\nENC_MADD_64A_DP_3SRC=1048,\nENC_MLA_ASIMDELEM_R=1049,\nENC_MLA_ASIMDSAME_ONLY=1050,\nENC_MLS_ASIMDELEM_R=1051,\nENC_MLS_ASIMDSAME_ONLY=1052,\nENC_MNEG_MSUB_32A_DP_3SRC=1053, // alias\nENC_MNEG_MSUB_64A_DP_3SRC=1054, // alias\nENC_MOVI_ASIMDIMM_D2_D=1055,\nENC_MOVI_ASIMDIMM_D_DS=1056,\nENC_MOVI_ASIMDIMM_L_HL=1057,\nENC_MOVI_ASIMDIMM_L_SL=1058,\nENC_MOVI_ASIMDIMM_M_SM=1059,\nENC_MOVI_ASIMDIMM_N_B=1060,\nENC_MOVK_32_MOVEWIDE=1061,\nENC_MOVK_64_MOVEWIDE=1062,\nENC_MOVN_32_MOVEWIDE=1063,\nENC_MOVN_64_MOVEWIDE=1064,\nENC_MOVS_ANDS_P_P_PP_Z=1065, // alias\nENC_MOVS_ORRS_P_P_PP_Z=1066, // alias\nENC_MOVZ_32_MOVEWIDE=1067,\nENC_MOVZ_64_MOVEWIDE=1068,\nENC_MOV_ADD_32_ADDSUB_IMM=1069, // alias\nENC_MOV_ADD_64_ADDSUB_IMM=1070, // alias\nENC_MOV_DUP_ASISDONE_ONLY=1071, // alias\nENC_MOV_INS_ASIMDINS_IR_R=1072, // alias\nENC_MOV_INS_ASIMDINS_IV_V=1073, // alias\nENC_MOV_MOVN_32_MOVEWIDE=1074, // alias\nENC_MOV_MOVN_64_MOVEWIDE=1075, // alias\nENC_MOV_MOVZ_32_MOVEWIDE=1076, // alias\nENC_MOV_MOVZ_64_MOVEWIDE=1077, // alias\nENC_MOV_ORR_32_LOG_IMM=1078, // alias\nENC_MOV_ORR_32_LOG_SHIFT=1079, // alias\nENC_MOV_ORR_64_LOG_IMM=1080, // alias\nENC_MOV_ORR_64_LOG_SHIFT=1081, // alias\nENC_MOV_ORR_ASIMDSAME_ONLY=1082, // alias\nENC_MOV_UMOV_ASIMDINS_W_W=1083, // alias\nENC_MOV_UMOV_ASIMDINS_X_X=1084, // alias\nENC_MOV_AND_P_P_PP_Z=1085, // alias\nENC_MOV_CPY_Z_O_I_=1086, // alias\nENC_MOV_CPY_Z_P_I_=1087, // alias\nENC_MOV_CPY_Z_P_R_=1088, // alias\nENC_MOV_CPY_Z_P_V_=1089, // alias\nENC_MOV_DUP_Z_I_=1090, // alias\nENC_MOV_DUP_Z_R_=1091, // alias\nENC_MOV_DUP_Z_ZI_=1092, // alias\nENC_MOV_DUP_Z_ZI_2=1093, // alias\nENC_MOV_DUPM_Z_I_=1094, // alias\nENC_MOV_MOVA_Z_P_RZA_B=1095, // alias\nENC_MOV_MOVA_Z_P_RZA_D=1096, // alias\nENC_MOV_MOVA_Z_P_RZA_H=1097, // alias\nENC_MOV_MOVA_Z_P_RZA_Q=1098, // alias\nENC_MOV_MOVA_Z_P_RZA_W=1099, // alias\nENC_MOV_MOVA_ZA_P_RZ_B=1100, // alias\nENC_MOV_MOVA_ZA_P_RZ_D=1101, // alias\nENC_MOV_MOVA_ZA_P_RZ_H=1102, // alias\nENC_MOV_MOVA_ZA_P_RZ_Q=1103, // alias\nENC_MOV_MOVA_ZA_P_RZ_W=1104, // alias\nENC_MOV_ORR_P_P_PP_Z=1105, // alias\nENC_MOV_ORR_Z_ZZ_=1106, // alias\nENC_MOV_SEL_P_P_PP_=1107, // alias\nENC_MOV_SEL_Z_P_ZZ_=1108, // alias\nENC_MRS_RS_SYSTEMMOVE=1109,\nENC_MSR_SI_PSTATE=1110,\nENC_MSR_SR_SYSTEMMOVE=1111,\nENC_MSUB_32A_DP_3SRC=1112,\nENC_MSUB_64A_DP_3SRC=1113,\nENC_MUL_MADD_32A_DP_3SRC=1114, // alias\nENC_MUL_MADD_64A_DP_3SRC=1115, // alias\nENC_MUL_ASIMDELEM_R=1116,\nENC_MUL_ASIMDSAME_ONLY=1117,\nENC_MVNI_ASIMDIMM_L_HL=1118,\nENC_MVNI_ASIMDIMM_L_SL=1119,\nENC_MVNI_ASIMDIMM_M_SM=1120,\nENC_MVN_NOT_ASIMDMISC_R=1121, // alias\nENC_MVN_ORN_32_LOG_SHIFT=1122, // alias\nENC_MVN_ORN_64_LOG_SHIFT=1123, // alias\nENC_NEGS_SUBS_32_ADDSUB_SHIFT=1124, // alias\nENC_NEGS_SUBS_64_ADDSUB_SHIFT=1125, // alias\nENC_NEG_SUB_32_ADDSUB_SHIFT=1126, // alias\nENC_NEG_SUB_64_ADDSUB_SHIFT=1127, // alias\nENC_NEG_ASIMDMISC_R=1128,\nENC_NEG_ASISDMISC_R=1129,\nENC_NGCS_SBCS_32_ADDSUB_CARRY=1130, // alias\nENC_NGCS_SBCS_64_ADDSUB_CARRY=1131, // alias\nENC_NGC_SBC_32_ADDSUB_CARRY=1132, // alias\nENC_NGC_SBC_64_ADDSUB_CARRY=1133, // alias\nENC_NOP_HI_HINTS=1134,\nENC_NOTS_EORS_P_P_PP_Z=1135, // alias\nENC_NOT_ASIMDMISC_R=1136,\nENC_NOT_EOR_P_P_PP_Z=1137, // alias\nENC_ORN_32_LOG_SHIFT=1138,\nENC_ORN_64_LOG_SHIFT=1139,\nENC_ORN_ASIMDSAME_ONLY=1140,\nENC_ORN_ORR_Z_ZI_=1141, // alias\nENC_ORR_32_LOG_IMM=1142,\nENC_ORR_32_LOG_SHIFT=1143,\nENC_ORR_64_LOG_IMM=1144,\nENC_ORR_64_LOG_SHIFT=1145,\nENC_ORR_ASIMDIMM_L_HL=1146,\nENC_ORR_ASIMDIMM_L_SL=1147,\nENC_ORR_ASIMDSAME_ONLY=1148,\nENC_PACDA_64P_DP_1SRC=1149,\nENC_PACDB_64P_DP_1SRC=1150,\nENC_PACDZA_64Z_DP_1SRC=1151,\nENC_PACDZB_64Z_DP_1SRC=1152,\nENC_PACGA_64P_DP_2SRC=1153,\nENC_PACIA1716_HI_HINTS=1154,\nENC_PACIASP_HI_HINTS=1155,\nENC_PACIAZ_HI_HINTS=1156,\nENC_PACIA_64P_DP_1SRC=1157,\nENC_PACIB1716_HI_HINTS=1158,\nENC_PACIBSP_HI_HINTS=1159,\nENC_PACIBZ_HI_HINTS=1160,\nENC_PACIB_64P_DP_1SRC=1161,\nENC_PACIZA_64Z_DP_1SRC=1162,\nENC_PACIZB_64Z_DP_1SRC=1163,\nENC_PMULL_ASIMDDIFF_L=1164,\nENC_PMUL_ASIMDSAME_ONLY=1165,\nENC_PRFM_P_LDST_POS=1166,\nENC_PRFM_P_LDST_REGOFF=1167,\nENC_PRFM_P_LOADLIT=1168,\nENC_PRFUM_P_LDST_UNSCALED=1169,\nENC_PSB_HC_HINTS=1170,\nENC_PSSBB_DSB_BO_BARRIERS=1171, // alias\nENC_RADDHN_ASIMDDIFF_N=1172,\nENC_RAX1_VVV2_CRYPTOSHA512_3=1173,\nENC_RBIT_32_DP_1SRC=1174,\nENC_RBIT_64_DP_1SRC=1175,\nENC_RBIT_ASIMDMISC_R=1176,\nENC_RESERVED_21_ASIMDELEM=1177, // terminal\nENC_RESERVED_35_ASIMDELEM=1178, // terminal\nENC_RESERVED_36_ASISDSAME=1179, // terminal\nENC_RESERVED_37_ASISDSAME=1180, // terminal\nENC_RESERVED_38_ASISDSAME=1181, // terminal\nENC_RESERVED_39_ASISDSAME=1182, // terminal\nENC_RESERVED_42_ASISDSAME=1183, // terminal\nENC_RESERVED_44_ASISDSAME=1184, // terminal\nENC_RESERVED_45_ASISDSAME=1185, // terminal\nENC_RESERVED_46_ASISDSAME=1186, // terminal\nENC_RESERVED_47_ASISDSAME=1187, // terminal\nENC_RESERVED_48_ASISDSAME=1188, // terminal\nENC_RESERVED_50_ASISDSAME=1189, // terminal\nENC_RESERVED_52_ASISDSAME=1190, // terminal\nENC_RESERVED_53_ASISDSAME=1191, // terminal\nENC_RESERVED_54_ASISDSAME=1192, // terminal\nENC_RESERVED_57_ASISDSAME=1193, // terminal\nENC_RESERVED_67_ASISDSAME=1194, // terminal\nENC_RESERVED_68_ASISDSAME=1195, // terminal\nENC_RESERVED_69_ASISDSAME=1196, // terminal\nENC_RESERVED_70_ASISDSAME=1197, // terminal\nENC_RESERVED_72_ASISDSAME=1198, // terminal\nENC_RESERVED_74_ASISDSAME=1199, // terminal\nENC_RETAA_64E_BRANCH_REG=1200,\nENC_RETAB_64E_BRANCH_REG=1201,\nENC_RET_64R_BRANCH_REG=1202,\nENC_REV16_32_DP_1SRC=1203,\nENC_REV16_64_DP_1SRC=1204,\nENC_REV16_ASIMDMISC_R=1205,\nENC_REV32_64_DP_1SRC=1206,\nENC_REV32_ASIMDMISC_R=1207,\nENC_REV64_REV_64_DP_1SRC=1208, // alias\nENC_REV64_ASIMDMISC_R=1209,\nENC_REV_32_DP_1SRC=1210,\nENC_REV_64_DP_1SRC=1211,\nENC_RMIF_ONLY_RMIF=1212,\nENC_RORV_32_DP_2SRC=1213,\nENC_RORV_64_DP_2SRC=1214,\nENC_ROR_EXTR_32_EXTRACT=1215, // alias\nENC_ROR_EXTR_64_EXTRACT=1216, // alias\nENC_ROR_RORV_32_DP_2SRC=1217, // alias\nENC_ROR_RORV_64_DP_2SRC=1218, // alias\nENC_RSHRN_ASIMDSHF_N=1219,\nENC_RSUBHN_ASIMDDIFF_N=1220,\nENC_SABAL_ASIMDDIFF_L=1221,\nENC_SABA_ASIMDSAME_ONLY=1222,\nENC_SABDL_ASIMDDIFF_L=1223,\nENC_SABD_ASIMDSAME_ONLY=1224,\nENC_SADALP_ASIMDMISC_P=1225,\nENC_SADDLP_ASIMDMISC_P=1226,\nENC_SADDLV_ASIMDALL_ONLY=1227,\nENC_SADDL_ASIMDDIFF_L=1228,\nENC_SADDW_ASIMDDIFF_W=1229,\nENC_SBCS_32_ADDSUB_CARRY=1230,\nENC_SBCS_64_ADDSUB_CARRY=1231,\nENC_SBC_32_ADDSUB_CARRY=1232,\nENC_SBC_64_ADDSUB_CARRY=1233,\nENC_SBFIZ_SBFM_32M_BITFIELD=1234, // alias\nENC_SBFIZ_SBFM_64M_BITFIELD=1235, // alias\nENC_SBFM_32M_BITFIELD=1236,\nENC_SBFM_64M_BITFIELD=1237,\nENC_SBFX_SBFM_32M_BITFIELD=1238, // alias\nENC_SBFX_SBFM_64M_BITFIELD=1239, // alias\nENC_SB_ONLY_BARRIERS=1240,\nENC_SCVTF_D32_FLOAT2FIX=1241,\nENC_SCVTF_D32_FLOAT2INT=1242,\nENC_SCVTF_D64_FLOAT2FIX=1243,\nENC_SCVTF_D64_FLOAT2INT=1244,\nENC_SCVTF_H32_FLOAT2FIX=1245,\nENC_SCVTF_H32_FLOAT2INT=1246,\nENC_SCVTF_H64_FLOAT2FIX=1247,\nENC_SCVTF_H64_FLOAT2INT=1248,\nENC_SCVTF_S32_FLOAT2FIX=1249,\nENC_SCVTF_S32_FLOAT2INT=1250,\nENC_SCVTF_S64_FLOAT2FIX=1251,\nENC_SCVTF_S64_FLOAT2INT=1252,\nENC_SCVTF_ASIMDMISC_R=1253,\nENC_SCVTF_ASIMDMISCFP16_R=1254,\nENC_SCVTF_ASIMDSHF_C=1255,\nENC_SCVTF_ASISDMISC_R=1256,\nENC_SCVTF_ASISDMISCFP16_R=1257,\nENC_SCVTF_ASISDSHF_C=1258,\nENC_SDIV_32_DP_2SRC=1259,\nENC_SDIV_64_DP_2SRC=1260,\nENC_SDOT_ASIMDELEM_D=1261,\nENC_SDOT_ASIMDSAME2_D=1262,\nENC_SETF16_ONLY_SETF=1263,\nENC_SETF8_ONLY_SETF=1264,\nENC_SEVL_HI_HINTS=1265,\nENC_SEV_HI_HINTS=1266,\nENC_SHA1C_QSV_CRYPTOSHA3=1267,\nENC_SHA1H_SS_CRYPTOSHA2=1268,\nENC_SHA1M_QSV_CRYPTOSHA3=1269,\nENC_SHA1P_QSV_CRYPTOSHA3=1270,\nENC_SHA1SU0_VVV_CRYPTOSHA3=1271,\nENC_SHA1SU1_VV_CRYPTOSHA2=1272,\nENC_SHA256H2_QQV_CRYPTOSHA3=1273,\nENC_SHA256H_QQV_CRYPTOSHA3=1274,\nENC_SHA256SU0_VV_CRYPTOSHA2=1275,\nENC_SHA256SU1_VVV_CRYPTOSHA3=1276,\nENC_SHA512H2_QQV_CRYPTOSHA512_3=1277,\nENC_SHA512H_QQV_CRYPTOSHA512_3=1278,\nENC_SHA512SU0_VV2_CRYPTOSHA512_2=1279,\nENC_SHA512SU1_VVV2_CRYPTOSHA512_3=1280,\nENC_SHADD_ASIMDSAME_ONLY=1281,\nENC_SHLL_ASIMDMISC_S=1282,\nENC_SHL_ASIMDSHF_R=1283,\nENC_SHL_ASISDSHF_R=1284,\nENC_SHRN_ASIMDSHF_N=1285,\nENC_SHSUB_ASIMDSAME_ONLY=1286,\nENC_SLI_ASIMDSHF_R=1287,\nENC_SLI_ASISDSHF_R=1288,\nENC_SM3PARTW1_VVV4_CRYPTOSHA512_3=1289,\nENC_SM3PARTW2_VVV4_CRYPTOSHA512_3=1290,\nENC_SM3SS1_VVV4_CRYPTO4=1291,\nENC_SM3TT1A_VVV4_CRYPTO3_IMM2=1292,\nENC_SM3TT1B_VVV4_CRYPTO3_IMM2=1293,\nENC_SM3TT2A_VVV4_CRYPTO3_IMM2=1294,\nENC_SM3TT2B_VVV_CRYPTO3_IMM2=1295,\nENC_SM4EKEY_VVV4_CRYPTOSHA512_3=1296,\nENC_SM4E_VV4_CRYPTOSHA512_2=1297,\nENC_SMADDL_64WA_DP_3SRC=1298,\nENC_SMAXP_ASIMDSAME_ONLY=1299,\nENC_SMAXV_ASIMDALL_ONLY=1300,\nENC_SMAX_ASIMDSAME_ONLY=1301,\nENC_SMC_EX_EXCEPTION=1302,\nENC_SMINP_ASIMDSAME_ONLY=1303,\nENC_SMINV_ASIMDALL_ONLY=1304,\nENC_SMIN_ASIMDSAME_ONLY=1305,\nENC_SMLAL_ASIMDDIFF_L=1306,\nENC_SMLAL_ASIMDELEM_L=1307,\nENC_SMLSL_ASIMDDIFF_L=1308,\nENC_SMLSL_ASIMDELEM_L=1309,\nENC_SMMLA_ASIMDSAME2_G=1310,\nENC_SMNEGL_SMSUBL_64WA_DP_3SRC=1311, // alias\nENC_SMOV_ASIMDINS_W_W=1312,\nENC_SMOV_ASIMDINS_X_X=1313,\nENC_SMSTART_MSR_SI_PSTATE=1314, // alias\nENC_SMSTOP_MSR_SI_PSTATE=1315, // alias\nENC_SMSUBL_64WA_DP_3SRC=1316,\nENC_SMULH_64_DP_3SRC=1317,\nENC_SMULL_SMADDL_64WA_DP_3SRC=1318, // alias\nENC_SMULL_ASIMDDIFF_L=1319,\nENC_SMULL_ASIMDELEM_L=1320,\nENC_SQABS_ASIMDMISC_R=1321,\nENC_SQABS_ASISDMISC_R=1322,\nENC_SQADD_ASIMDSAME_ONLY=1323,\nENC_SQADD_ASISDSAME_ONLY=1324,\nENC_SQDMLAL_ASIMDDIFF_L=1325,\nENC_SQDMLAL_ASIMDELEM_L=1326,\nENC_SQDMLAL_ASISDDIFF_ONLY=1327,\nENC_SQDMLAL_ASISDELEM_L=1328,\nENC_SQDMLSL_ASIMDDIFF_L=1329,\nENC_SQDMLSL_ASIMDELEM_L=1330,\nENC_SQDMLSL_ASISDDIFF_ONLY=1331,\nENC_SQDMLSL_ASISDELEM_L=1332,\nENC_SQDMULH_ASIMDELEM_R=1333,\nENC_SQDMULH_ASIMDSAME_ONLY=1334,\nENC_SQDMULH_ASISDELEM_R=1335,\nENC_SQDMULH_ASISDSAME_ONLY=1336,\nENC_SQDMULL_ASIMDDIFF_L=1337,\nENC_SQDMULL_ASIMDELEM_L=1338,\nENC_SQDMULL_ASISDDIFF_ONLY=1339,\nENC_SQDMULL_ASISDELEM_L=1340,\nENC_SQNEG_ASIMDMISC_R=1341,\nENC_SQNEG_ASISDMISC_R=1342,\nENC_SQRDMLAH_ASIMDELEM_R=1343,\nENC_SQRDMLAH_ASIMDSAME2_ONLY=1344,\nENC_SQRDMLAH_ASISDELEM_R=1345,\nENC_SQRDMLAH_ASISDSAME2_ONLY=1346,\nENC_SQRDMLSH_ASIMDELEM_R=1347,\nENC_SQRDMLSH_ASIMDSAME2_ONLY=1348,\nENC_SQRDMLSH_ASISDELEM_R=1349,\nENC_SQRDMLSH_ASISDSAME2_ONLY=1350,\nENC_SQRDMULH_ASIMDELEM_R=1351,\nENC_SQRDMULH_ASIMDSAME_ONLY=1352,\nENC_SQRDMULH_ASISDELEM_R=1353,\nENC_SQRDMULH_ASISDSAME_ONLY=1354,\nENC_SQRSHL_ASIMDSAME_ONLY=1355,\nENC_SQRSHL_ASISDSAME_ONLY=1356,\nENC_SQRSHRN_ASIMDSHF_N=1357,\nENC_SQRSHRN_ASISDSHF_N=1358,\nENC_SQRSHRUN_ASIMDSHF_N=1359,\nENC_SQRSHRUN_ASISDSHF_N=1360,\nENC_SQSHLU_ASIMDSHF_R=1361,\nENC_SQSHLU_ASISDSHF_R=1362,\nENC_SQSHL_ASIMDSAME_ONLY=1363,\nENC_SQSHL_ASIMDSHF_R=1364,\nENC_SQSHL_ASISDSAME_ONLY=1365,\nENC_SQSHL_ASISDSHF_R=1366,\nENC_SQSHRN_ASIMDSHF_N=1367,\nENC_SQSHRN_ASISDSHF_N=1368,\nENC_SQSHRUN_ASIMDSHF_N=1369,\nENC_SQSHRUN_ASISDSHF_N=1370,\nENC_SQSUB_ASIMDSAME_ONLY=1371,\nENC_SQSUB_ASISDSAME_ONLY=1372,\nENC_SQXTN_ASIMDMISC_N=1373,\nENC_SQXTN_ASISDMISC_N=1374,\nENC_SQXTUN_ASIMDMISC_N=1375,\nENC_SQXTUN_ASISDMISC_N=1376,\nENC_SRHADD_ASIMDSAME_ONLY=1377,\nENC_SRI_ASIMDSHF_R=1378,\nENC_SRI_ASISDSHF_R=1379,\nENC_SRSHL_ASIMDSAME_ONLY=1380,\nENC_SRSHL_ASISDSAME_ONLY=1381,\nENC_SRSHR_ASIMDSHF_R=1382,\nENC_SRSHR_ASISDSHF_R=1383,\nENC_SRSRA_ASIMDSHF_R=1384,\nENC_SRSRA_ASISDSHF_R=1385,\nENC_SSBB_DSB_BO_BARRIERS=1386, // alias\nENC_SSHLL_ASIMDSHF_L=1387,\nENC_SSHL_ASIMDSAME_ONLY=1388,\nENC_SSHL_ASISDSAME_ONLY=1389,\nENC_SSHR_ASIMDSHF_R=1390,\nENC_SSHR_ASISDSHF_R=1391,\nENC_SSRA_ASIMDSHF_R=1392,\nENC_SSRA_ASISDSHF_R=1393,\nENC_SSUBL_ASIMDDIFF_L=1394,\nENC_SSUBW_ASIMDDIFF_W=1395,\nENC_ST1_ASISDLSE_R1_1V=1396,\nENC_ST1_ASISDLSE_R2_2V=1397,\nENC_ST1_ASISDLSE_R3_3V=1398,\nENC_ST1_ASISDLSE_R4_4V=1399,\nENC_ST1_ASISDLSEP_I1_I1=1400,\nENC_ST1_ASISDLSEP_I2_I2=1401,\nENC_ST1_ASISDLSEP_I3_I3=1402,\nENC_ST1_ASISDLSEP_I4_I4=1403,\nENC_ST1_ASISDLSEP_R1_R1=1404,\nENC_ST1_ASISDLSEP_R2_R2=1405,\nENC_ST1_ASISDLSEP_R3_R3=1406,\nENC_ST1_ASISDLSEP_R4_R4=1407,\nENC_ST1_ASISDLSO_B1_1B=1408,\nENC_ST1_ASISDLSO_D1_1D=1409,\nENC_ST1_ASISDLSO_H1_1H=1410,\nENC_ST1_ASISDLSO_S1_1S=1411,\nENC_ST1_ASISDLSOP_B1_I1B=1412,\nENC_ST1_ASISDLSOP_BX1_R1B=1413,\nENC_ST1_ASISDLSOP_D1_I1D=1414,\nENC_ST1_ASISDLSOP_DX1_R1D=1415,\nENC_ST1_ASISDLSOP_H1_I1H=1416,\nENC_ST1_ASISDLSOP_HX1_R1H=1417,\nENC_ST1_ASISDLSOP_S1_I1S=1418,\nENC_ST1_ASISDLSOP_SX1_R1S=1419,\nENC_ST2G_64SOFFSET_LDSTTAGS=1420,\nENC_ST2G_64SPOST_LDSTTAGS=1421,\nENC_ST2G_64SPRE_LDSTTAGS=1422,\nENC_ST2_ASISDLSE_R2=1423,\nENC_ST2_ASISDLSEP_I2_I=1424,\nENC_ST2_ASISDLSEP_R2_R=1425,\nENC_ST2_ASISDLSO_B2_2B=1426,\nENC_ST2_ASISDLSO_D2_2D=1427,\nENC_ST2_ASISDLSO_H2_2H=1428,\nENC_ST2_ASISDLSO_S2_2S=1429,\nENC_ST2_ASISDLSOP_B2_I2B=1430,\nENC_ST2_ASISDLSOP_BX2_R2B=1431,\nENC_ST2_ASISDLSOP_D2_I2D=1432,\nENC_ST2_ASISDLSOP_DX2_R2D=1433,\nENC_ST2_ASISDLSOP_H2_I2H=1434,\nENC_ST2_ASISDLSOP_HX2_R2H=1435,\nENC_ST2_ASISDLSOP_S2_I2S=1436,\nENC_ST2_ASISDLSOP_SX2_R2S=1437,\nENC_ST3_ASISDLSE_R3=1438,\nENC_ST3_ASISDLSEP_I3_I=1439,\nENC_ST3_ASISDLSEP_R3_R=1440,\nENC_ST3_ASISDLSO_B3_3B=1441,\nENC_ST3_ASISDLSO_D3_3D=1442,\nENC_ST3_ASISDLSO_H3_3H=1443,\nENC_ST3_ASISDLSO_S3_3S=1444,\nENC_ST3_ASISDLSOP_B3_I3B=1445,\nENC_ST3_ASISDLSOP_BX3_R3B=1446,\nENC_ST3_ASISDLSOP_D3_I3D=1447,\nENC_ST3_ASISDLSOP_DX3_R3D=1448,\nENC_ST3_ASISDLSOP_H3_I3H=1449,\nENC_ST3_ASISDLSOP_HX3_R3H=1450,\nENC_ST3_ASISDLSOP_S3_I3S=1451,\nENC_ST3_ASISDLSOP_SX3_R3S=1452,\nENC_ST4_ASISDLSE_R4=1453,\nENC_ST4_ASISDLSEP_I4_I=1454,\nENC_ST4_ASISDLSEP_R4_R=1455,\nENC_ST4_ASISDLSO_B4_4B=1456,\nENC_ST4_ASISDLSO_D4_4D=1457,\nENC_ST4_ASISDLSO_H4_4H=1458,\nENC_ST4_ASISDLSO_S4_4S=1459,\nENC_ST4_ASISDLSOP_B4_I4B=1460,\nENC_ST4_ASISDLSOP_BX4_R4B=1461,\nENC_ST4_ASISDLSOP_D4_I4D=1462,\nENC_ST4_ASISDLSOP_DX4_R4D=1463,\nENC_ST4_ASISDLSOP_H4_I4H=1464,\nENC_ST4_ASISDLSOP_HX4_R4H=1465,\nENC_ST4_ASISDLSOP_S4_I4S=1466,\nENC_ST4_ASISDLSOP_SX4_R4S=1467,\nENC_ST64BV0_64_MEMOP=1468,\nENC_ST64BV_64_MEMOP=1469,\nENC_ST64B_64L_MEMOP=1470,\nENC_STADDB_LDADDB_32_MEMOP=1471, // alias\nENC_STADDH_LDADDH_32_MEMOP=1472, // alias\nENC_STADDLB_LDADDLB_32_MEMOP=1473, // alias\nENC_STADDLH_LDADDLH_32_MEMOP=1474, // alias\nENC_STADDL_LDADDL_32_MEMOP=1475, // alias\nENC_STADDL_LDADDL_64_MEMOP=1476, // alias\nENC_STADD_LDADD_32_MEMOP=1477, // alias\nENC_STADD_LDADD_64_MEMOP=1478, // alias\nENC_STCLRB_LDCLRB_32_MEMOP=1479, // alias\nENC_STCLRH_LDCLRH_32_MEMOP=1480, // alias\nENC_STCLRLB_LDCLRLB_32_MEMOP=1481, // alias\nENC_STCLRLH_LDCLRLH_32_MEMOP=1482, // alias\nENC_STCLRL_LDCLRL_32_MEMOP=1483, // alias\nENC_STCLRL_LDCLRL_64_MEMOP=1484, // alias\nENC_STCLR_LDCLR_32_MEMOP=1485, // alias\nENC_STCLR_LDCLR_64_MEMOP=1486, // alias\nENC_STEORB_LDEORB_32_MEMOP=1487, // alias\nENC_STEORH_LDEORH_32_MEMOP=1488, // alias\nENC_STEORLB_LDEORLB_32_MEMOP=1489, // alias\nENC_STEORLH_LDEORLH_32_MEMOP=1490, // alias\nENC_STEORL_LDEORL_32_MEMOP=1491, // alias\nENC_STEORL_LDEORL_64_MEMOP=1492, // alias\nENC_STEOR_LDEOR_32_MEMOP=1493, // alias\nENC_STEOR_LDEOR_64_MEMOP=1494, // alias\nENC_STGM_64BULK_LDSTTAGS=1495,\nENC_STGP_64_LDSTPAIR_OFF=1496,\nENC_STGP_64_LDSTPAIR_POST=1497,\nENC_STGP_64_LDSTPAIR_PRE=1498,\nENC_STG_64SOFFSET_LDSTTAGS=1499,\nENC_STG_64SPOST_LDSTTAGS=1500,\nENC_STG_64SPRE_LDSTTAGS=1501,\nENC_STLLRB_SL32_LDSTORD=1502,\nENC_STLLRH_SL32_LDSTORD=1503,\nENC_STLLR_SL32_LDSTORD=1504,\nENC_STLLR_SL64_LDSTORD=1505,\nENC_STLRB_SL32_LDSTORD=1506,\nENC_STLRH_SL32_LDSTORD=1507,\nENC_STLR_SL32_LDSTORD=1508,\nENC_STLR_SL64_LDSTORD=1509,\nENC_STLURB_32_LDAPSTL_UNSCALED=1510,\nENC_STLURH_32_LDAPSTL_UNSCALED=1511,\nENC_STLUR_32_LDAPSTL_UNSCALED=1512,\nENC_STLUR_64_LDAPSTL_UNSCALED=1513,\nENC_STLXP_SP32_LDSTEXCLP=1514,\nENC_STLXP_SP64_LDSTEXCLP=1515,\nENC_STLXRB_SR32_LDSTEXCLR=1516,\nENC_STLXRH_SR32_LDSTEXCLR=1517,\nENC_STLXR_SR32_LDSTEXCLR=1518,\nENC_STLXR_SR64_LDSTEXCLR=1519,\nENC_STNP_32_LDSTNAPAIR_OFFS=1520,\nENC_STNP_64_LDSTNAPAIR_OFFS=1521,\nENC_STNP_D_LDSTNAPAIR_OFFS=1522,\nENC_STNP_Q_LDSTNAPAIR_OFFS=1523,\nENC_STNP_S_LDSTNAPAIR_OFFS=1524,\nENC_STP_32_LDSTPAIR_OFF=1525,\nENC_STP_32_LDSTPAIR_POST=1526,\nENC_STP_32_LDSTPAIR_PRE=1527,\nENC_STP_64_LDSTPAIR_OFF=1528,\nENC_STP_64_LDSTPAIR_POST=1529,\nENC_STP_64_LDSTPAIR_PRE=1530,\nENC_STP_D_LDSTPAIR_OFF=1531,\nENC_STP_D_LDSTPAIR_POST=1532,\nENC_STP_D_LDSTPAIR_PRE=1533,\nENC_STP_Q_LDSTPAIR_OFF=1534,\nENC_STP_Q_LDSTPAIR_POST=1535,\nENC_STP_Q_LDSTPAIR_PRE=1536,\nENC_STP_S_LDSTPAIR_OFF=1537,\nENC_STP_S_LDSTPAIR_POST=1538,\nENC_STP_S_LDSTPAIR_PRE=1539,\nENC_STRB_32BL_LDST_REGOFF=1540,\nENC_STRB_32B_LDST_REGOFF=1541,\nENC_STRB_32_LDST_IMMPOST=1542,\nENC_STRB_32_LDST_IMMPRE=1543,\nENC_STRB_32_LDST_POS=1544,\nENC_STRH_32_LDST_IMMPOST=1545,\nENC_STRH_32_LDST_IMMPRE=1546,\nENC_STRH_32_LDST_POS=1547,\nENC_STRH_32_LDST_REGOFF=1548,\nENC_STR_32_LDST_IMMPOST=1549,\nENC_STR_32_LDST_IMMPRE=1550,\nENC_STR_32_LDST_POS=1551,\nENC_STR_32_LDST_REGOFF=1552,\nENC_STR_64_LDST_IMMPOST=1553,\nENC_STR_64_LDST_IMMPRE=1554,\nENC_STR_64_LDST_POS=1555,\nENC_STR_64_LDST_REGOFF=1556,\nENC_STR_BL_LDST_REGOFF=1557,\nENC_STR_B_LDST_IMMPOST=1558,\nENC_STR_B_LDST_IMMPRE=1559,\nENC_STR_B_LDST_POS=1560,\nENC_STR_B_LDST_REGOFF=1561,\nENC_STR_D_LDST_IMMPOST=1562,\nENC_STR_D_LDST_IMMPRE=1563,\nENC_STR_D_LDST_POS=1564,\nENC_STR_D_LDST_REGOFF=1565,\nENC_STR_H_LDST_IMMPOST=1566,\nENC_STR_H_LDST_IMMPRE=1567,\nENC_STR_H_LDST_POS=1568,\nENC_STR_H_LDST_REGOFF=1569,\nENC_STR_Q_LDST_IMMPOST=1570,\nENC_STR_Q_LDST_IMMPRE=1571,\nENC_STR_Q_LDST_POS=1572,\nENC_STR_Q_LDST_REGOFF=1573,\nENC_STR_S_LDST_IMMPOST=1574,\nENC_STR_S_LDST_IMMPRE=1575,\nENC_STR_S_LDST_POS=1576,\nENC_STR_S_LDST_REGOFF=1577,\nENC_STSETB_LDSETB_32_MEMOP=1578, // alias\nENC_STSETH_LDSETH_32_MEMOP=1579, // alias\nENC_STSETLB_LDSETLB_32_MEMOP=1580, // alias\nENC_STSETLH_LDSETLH_32_MEMOP=1581, // alias\nENC_STSETL_LDSETL_32_MEMOP=1582, // alias\nENC_STSETL_LDSETL_64_MEMOP=1583, // alias\nENC_STSET_LDSET_32_MEMOP=1584, // alias\nENC_STSET_LDSET_64_MEMOP=1585, // alias\nENC_STSMAXB_LDSMAXB_32_MEMOP=1586, // alias\nENC_STSMAXH_LDSMAXH_32_MEMOP=1587, // alias\nENC_STSMAXLB_LDSMAXLB_32_MEMOP=1588, // alias\nENC_STSMAXLH_LDSMAXLH_32_MEMOP=1589, // alias\nENC_STSMAXL_LDSMAXL_32_MEMOP=1590, // alias\nENC_STSMAXL_LDSMAXL_64_MEMOP=1591, // alias\nENC_STSMAX_LDSMAX_32_MEMOP=1592, // alias\nENC_STSMAX_LDSMAX_64_MEMOP=1593, // alias\nENC_STSMINB_LDSMINB_32_MEMOP=1594, // alias\nENC_STSMINH_LDSMINH_32_MEMOP=1595, // alias\nENC_STSMINLB_LDSMINLB_32_MEMOP=1596, // alias\nENC_STSMINLH_LDSMINLH_32_MEMOP=1597, // alias\nENC_STSMINL_LDSMINL_32_MEMOP=1598, // alias\nENC_STSMINL_LDSMINL_64_MEMOP=1599, // alias\nENC_STSMIN_LDSMIN_32_MEMOP=1600, // alias\nENC_STSMIN_LDSMIN_64_MEMOP=1601, // alias\nENC_STTRB_32_LDST_UNPRIV=1602,\nENC_STTRH_32_LDST_UNPRIV=1603,\nENC_STTR_32_LDST_UNPRIV=1604,\nENC_STTR_64_LDST_UNPRIV=1605,\nENC_STUMAXB_LDUMAXB_32_MEMOP=1606, // alias\nENC_STUMAXH_LDUMAXH_32_MEMOP=1607, // alias\nENC_STUMAXLB_LDUMAXLB_32_MEMOP=1608, // alias\nENC_STUMAXLH_LDUMAXLH_32_MEMOP=1609, // alias\nENC_STUMAXL_LDUMAXL_32_MEMOP=1610, // alias\nENC_STUMAXL_LDUMAXL_64_MEMOP=1611, // alias\nENC_STUMAX_LDUMAX_32_MEMOP=1612, // alias\nENC_STUMAX_LDUMAX_64_MEMOP=1613, // alias\nENC_STUMINB_LDUMINB_32_MEMOP=1614, // alias\nENC_STUMINH_LDUMINH_32_MEMOP=1615, // alias\nENC_STUMINLB_LDUMINLB_32_MEMOP=1616, // alias\nENC_STUMINLH_LDUMINLH_32_MEMOP=1617, // alias\nENC_STUMINL_LDUMINL_32_MEMOP=1618, // alias\nENC_STUMINL_LDUMINL_64_MEMOP=1619, // alias\nENC_STUMIN_LDUMIN_32_MEMOP=1620, // alias\nENC_STUMIN_LDUMIN_64_MEMOP=1621, // alias\nENC_STURB_32_LDST_UNSCALED=1622,\nENC_STURH_32_LDST_UNSCALED=1623,\nENC_STUR_32_LDST_UNSCALED=1624,\nENC_STUR_64_LDST_UNSCALED=1625,\nENC_STUR_B_LDST_UNSCALED=1626,\nENC_STUR_D_LDST_UNSCALED=1627,\nENC_STUR_H_LDST_UNSCALED=1628,\nENC_STUR_Q_LDST_UNSCALED=1629,\nENC_STUR_S_LDST_UNSCALED=1630,\nENC_STXP_SP32_LDSTEXCLP=1631,\nENC_STXP_SP64_LDSTEXCLP=1632,\nENC_STXRB_SR32_LDSTEXCLR=1633,\nENC_STXRH_SR32_LDSTEXCLR=1634,\nENC_STXR_SR32_LDSTEXCLR=1635,\nENC_STXR_SR64_LDSTEXCLR=1636,\nENC_STZ2G_64SOFFSET_LDSTTAGS=1637,\nENC_STZ2G_64SPOST_LDSTTAGS=1638,\nENC_STZ2G_64SPRE_LDSTTAGS=1639,\nENC_STZGM_64BULK_LDSTTAGS=1640,\nENC_STZG_64SOFFSET_LDSTTAGS=1641,\nENC_STZG_64SPOST_LDSTTAGS=1642,\nENC_STZG_64SPRE_LDSTTAGS=1643,\nENC_SUBG_64_ADDSUB_IMMTAGS=1644,\nENC_SUBHN_ASIMDDIFF_N=1645,\nENC_SUBPS_64S_DP_2SRC=1646,\nENC_SUBP_64S_DP_2SRC=1647,\nENC_SUBS_32S_ADDSUB_EXT=1648,\nENC_SUBS_32S_ADDSUB_IMM=1649,\nENC_SUBS_32_ADDSUB_SHIFT=1650,\nENC_SUBS_64S_ADDSUB_EXT=1651,\nENC_SUBS_64S_ADDSUB_IMM=1652,\nENC_SUBS_64_ADDSUB_SHIFT=1653,\nENC_SUB_32_ADDSUB_EXT=1654,\nENC_SUB_32_ADDSUB_IMM=1655,\nENC_SUB_32_ADDSUB_SHIFT=1656,\nENC_SUB_64_ADDSUB_EXT=1657,\nENC_SUB_64_ADDSUB_IMM=1658,\nENC_SUB_64_ADDSUB_SHIFT=1659,\nENC_SUB_ASIMDSAME_ONLY=1660,\nENC_SUB_ASISDSAME_ONLY=1661,\nENC_SUDOT_ASIMDELEM_D=1662,\nENC_SUQADD_ASIMDMISC_R=1663,\nENC_SUQADD_ASISDMISC_R=1664,\nENC_SVC_EX_EXCEPTION=1665,\nENC_SWPAB_32_MEMOP=1666,\nENC_SWPAH_32_MEMOP=1667,\nENC_SWPALB_32_MEMOP=1668,\nENC_SWPALH_32_MEMOP=1669,\nENC_SWPAL_32_MEMOP=1670,\nENC_SWPAL_64_MEMOP=1671,\nENC_SWPA_32_MEMOP=1672,\nENC_SWPA_64_MEMOP=1673,\nENC_SWPB_32_MEMOP=1674,\nENC_SWPH_32_MEMOP=1675,\nENC_SWPLB_32_MEMOP=1676,\nENC_SWPLH_32_MEMOP=1677,\nENC_SWPL_32_MEMOP=1678,\nENC_SWPL_64_MEMOP=1679,\nENC_SWP_32_MEMOP=1680,\nENC_SWP_64_MEMOP=1681,\nENC_SXTB_SBFM_32M_BITFIELD=1682, // alias\nENC_SXTB_SBFM_64M_BITFIELD=1683, // alias\nENC_SXTH_SBFM_32M_BITFIELD=1684, // alias\nENC_SXTH_SBFM_64M_BITFIELD=1685, // alias\nENC_SXTL_SSHLL_ASIMDSHF_L=1686, // alias\nENC_SXTW_SBFM_64M_BITFIELD=1687, // alias\nENC_SYSL_RC_SYSTEMINSTRS=1688,\nENC_SYS_CR_SYSTEMINSTRS=1689,\nENC_TBL_ASIMDTBL_L1_1=1690,\nENC_TBL_ASIMDTBL_L2_2=1691,\nENC_TBL_ASIMDTBL_L3_3=1692,\nENC_TBL_ASIMDTBL_L4_4=1693,\nENC_TBNZ_ONLY_TESTBRANCH=1694,\nENC_TBX_ASIMDTBL_L1_1=1695,\nENC_TBX_ASIMDTBL_L2_2=1696,\nENC_TBX_ASIMDTBL_L3_3=1697,\nENC_TBX_ASIMDTBL_L4_4=1698,\nENC_TBZ_ONLY_TESTBRANCH=1699,\nENC_TCANCEL_EX_EXCEPTION=1700,\nENC_TCOMMIT_ONLY_BARRIERS=1701,\nENC_TLBI_SYS_CR_SYSTEMINSTRS=1702, // alias\nENC_TRN1_ASIMDPERM_ONLY=1703,\nENC_TRN2_ASIMDPERM_ONLY=1704,\nENC_TSB_HC_HINTS=1705,\nENC_TSTART_BR_SYSTEMRESULT=1706,\nENC_TST_ANDS_32S_LOG_IMM=1707, // alias\nENC_TST_ANDS_32_LOG_SHIFT=1708, // alias\nENC_TST_ANDS_64S_LOG_IMM=1709, // alias\nENC_TST_ANDS_64_LOG_SHIFT=1710, // alias\nENC_TTEST_BR_SYSTEMRESULT=1711,\nENC_UABAL_ASIMDDIFF_L=1712,\nENC_UABA_ASIMDSAME_ONLY=1713,\nENC_UABDL_ASIMDDIFF_L=1714,\nENC_UABD_ASIMDSAME_ONLY=1715,\nENC_UADALP_ASIMDMISC_P=1716,\nENC_UADDLP_ASIMDMISC_P=1717,\nENC_UADDLV_ASIMDALL_ONLY=1718,\nENC_UADDL_ASIMDDIFF_L=1719,\nENC_UADDW_ASIMDDIFF_W=1720,\nENC_UBFIZ_UBFM_32M_BITFIELD=1721, // alias\nENC_UBFIZ_UBFM_64M_BITFIELD=1722, // alias\nENC_UBFM_32M_BITFIELD=1723,\nENC_UBFM_64M_BITFIELD=1724,\nENC_UBFX_UBFM_32M_BITFIELD=1725, // alias\nENC_UBFX_UBFM_64M_BITFIELD=1726, // alias\nENC_UCVTF_D32_FLOAT2FIX=1727,\nENC_UCVTF_D32_FLOAT2INT=1728,\nENC_UCVTF_D64_FLOAT2FIX=1729,\nENC_UCVTF_D64_FLOAT2INT=1730,\nENC_UCVTF_H32_FLOAT2FIX=1731,\nENC_UCVTF_H32_FLOAT2INT=1732,\nENC_UCVTF_H64_FLOAT2FIX=1733,\nENC_UCVTF_H64_FLOAT2INT=1734,\nENC_UCVTF_S32_FLOAT2FIX=1735,\nENC_UCVTF_S32_FLOAT2INT=1736,\nENC_UCVTF_S64_FLOAT2FIX=1737,\nENC_UCVTF_S64_FLOAT2INT=1738,\nENC_UCVTF_ASIMDMISC_R=1739,\nENC_UCVTF_ASIMDMISCFP16_R=1740,\nENC_UCVTF_ASIMDSHF_C=1741,\nENC_UCVTF_ASISDMISC_R=1742,\nENC_UCVTF_ASISDMISCFP16_R=1743,\nENC_UCVTF_ASISDSHF_C=1744,\nENC_UDF_ONLY_PERM_UNDEF=1745,\nENC_UDIV_32_DP_2SRC=1746,\nENC_UDIV_64_DP_2SRC=1747,\nENC_UDOT_ASIMDELEM_D=1748,\nENC_UDOT_ASIMDSAME2_D=1749,\nENC_UHADD_ASIMDSAME_ONLY=1750,\nENC_UHSUB_ASIMDSAME_ONLY=1751,\nENC_UMADDL_64WA_DP_3SRC=1752,\nENC_UMAXP_ASIMDSAME_ONLY=1753,\nENC_UMAXV_ASIMDALL_ONLY=1754,\nENC_UMAX_ASIMDSAME_ONLY=1755,\nENC_UMINP_ASIMDSAME_ONLY=1756,\nENC_UMINV_ASIMDALL_ONLY=1757,\nENC_UMIN_ASIMDSAME_ONLY=1758,\nENC_UMLAL_ASIMDDIFF_L=1759,\nENC_UMLAL_ASIMDELEM_L=1760,\nENC_UMLSL_ASIMDDIFF_L=1761,\nENC_UMLSL_ASIMDELEM_L=1762,\nENC_UMMLA_ASIMDSAME2_G=1763,\nENC_UMNEGL_UMSUBL_64WA_DP_3SRC=1764, // alias\nENC_UMOV_ASIMDINS_W_W=1765,\nENC_UMOV_ASIMDINS_X_X=1766,\nENC_UMSUBL_64WA_DP_3SRC=1767,\nENC_UMULH_64_DP_3SRC=1768,\nENC_UMULL_UMADDL_64WA_DP_3SRC=1769, // alias\nENC_UMULL_ASIMDDIFF_L=1770,\nENC_UMULL_ASIMDELEM_L=1771,\nENC_UNALLOCATED_100_ASIMDSAME=1772, // terminal\nENC_UNALLOCATED_10_ADDSUB_EXT=1773, // terminal\nENC_UNALLOCATED_10_ADDSUB_IMMTAGS=1774, // terminal\nENC_UNALLOCATED_10_ADDSUB_SHIFT=1775, // terminal\nENC_UNALLOCATED_10_BARRIERS=1776, // terminal\nENC_UNALLOCATED_10_BRANCH_REG=1777, // terminal\nENC_UNALLOCATED_10_COMSWAP=1778, // terminal\nENC_UNALLOCATED_10_COMSWAPPR=1779, // terminal\nENC_UNALLOCATED_10_CONDCMP_IMM=1780, // terminal\nENC_UNALLOCATED_10_CONDCMP_REG=1781, // terminal\nENC_UNALLOCATED_10_CONDSEL=1782, // terminal\nENC_UNALLOCATED_10_DP_1SRC=1783, // terminal\nENC_UNALLOCATED_10_EXCEPTION=1784, // terminal\nENC_UNALLOCATED_10_FLOAT2FIX=1785, // terminal\nENC_UNALLOCATED_10_FLOAT2INT=1786, // terminal\nENC_UNALLOCATED_10_FLOATCCMP=1787, // terminal\nENC_UNALLOCATED_10_FLOATCMP=1788, // terminal\nENC_UNALLOCATED_10_FLOATDP1=1789, // terminal\nENC_UNALLOCATED_10_FLOATDP2=1790, // terminal\nENC_UNALLOCATED_10_FLOATDP3=1791, // terminal\nENC_UNALLOCATED_10_FLOATIMM=1792, // terminal\nENC_UNALLOCATED_10_FLOATSEL=1793, // terminal\nENC_UNALLOCATED_10_LOG_IMM=1794, // terminal\nENC_UNALLOCATED_10_LOG_SHIFT=1795, // terminal\nENC_UNALLOCATED_10_MOVEWIDE=1796, // terminal\nENC_UNALLOCATED_10_PSTATE=1797, // terminal\nENC_UNALLOCATED_10_RMIF=1798, // terminal\nENC_UNALLOCATED_10_SETF=1799, // terminal\nENC_UNALLOCATED_10_SYSTEMRESULT=1800, // terminal\nENC_UNALLOCATED_11_ADDSUB_EXT=1801, // terminal\nENC_UNALLOCATED_11_ADDSUB_IMMTAGS=1802, // terminal\nENC_UNALLOCATED_11_ADDSUB_SHIFT=1803, // terminal\nENC_UNALLOCATED_11_ASIMDALL=1804, // terminal\nENC_UNALLOCATED_11_ASIMDELEM=1805, // terminal\nENC_UNALLOCATED_11_ASIMDEXT=1806, // terminal\nENC_UNALLOCATED_11_ASIMDINS=1807, // terminal\nENC_UNALLOCATED_11_ASIMDMISCFP16=1808, // terminal\nENC_UNALLOCATED_11_ASIMDPERM=1809, // terminal\nENC_UNALLOCATED_11_ASIMDSAME2=1810, // terminal\nENC_UNALLOCATED_11_ASIMDTBL=1811, // terminal\nENC_UNALLOCATED_11_ASISDDIFF=1812, // terminal\nENC_UNALLOCATED_11_ASISDELEM=1813, // terminal\nENC_UNALLOCATED_11_ASISDLSO=1814, // terminal\nENC_UNALLOCATED_11_ASISDLSOP=1815, // terminal\nENC_UNALLOCATED_11_ASISDMISC=1816, // terminal\nENC_UNALLOCATED_11_ASISDMISCFP16=1817, // terminal\nENC_UNALLOCATED_11_ASISDPAIR=1818, // terminal\nENC_UNALLOCATED_11_ASISDSAME=1819, // terminal\nENC_UNALLOCATED_11_ASISDSAME2=1820, // terminal\nENC_UNALLOCATED_11_ASISDSHF=1821, // terminal\nENC_UNALLOCATED_11_BARRIERS=1822, // terminal\nENC_UNALLOCATED_11_BITFIELD=1823, // terminal\nENC_UNALLOCATED_11_CONDBRANCH=1824, // terminal\nENC_UNALLOCATED_11_CONDCMP_IMM=1825, // terminal\nENC_UNALLOCATED_11_CONDCMP_REG=1826, // terminal\nENC_UNALLOCATED_11_CONDSEL=1827, // terminal\nENC_UNALLOCATED_11_CRYPTOAES=1828, // terminal\nENC_UNALLOCATED_11_CRYPTOSHA2=1829, // terminal\nENC_UNALLOCATED_11_CRYPTOSHA3=1830, // terminal\nENC_UNALLOCATED_11_CRYPTOSHA512_2=1831, // terminal\nENC_UNALLOCATED_11_DP_1SRC=1832, // terminal\nENC_UNALLOCATED_11_DP_2SRC=1833, // terminal\nENC_UNALLOCATED_11_EXTRACT=1834, // terminal\nENC_UNALLOCATED_11_FLOAT2FIX=1835, // terminal\nENC_UNALLOCATED_11_FLOAT2INT=1836, // terminal\nENC_UNALLOCATED_11_FLOATCCMP=1837, // terminal\nENC_UNALLOCATED_11_FLOATCMP=1838, // terminal\nENC_UNALLOCATED_11_FLOATDP1=1839, // terminal\nENC_UNALLOCATED_11_FLOATDP2=1840, // terminal\nENC_UNALLOCATED_11_FLOATDP3=1841, // terminal\nENC_UNALLOCATED_11_FLOATIMM=1842, // terminal\nENC_UNALLOCATED_11_FLOATSEL=1843, // terminal\nENC_UNALLOCATED_11_RMIF=1844, // terminal\nENC_UNALLOCATED_11_SETF=1845, // terminal\nENC_UNALLOCATED_11_SYSTEMRESULT=1846, // terminal\nENC_UNALLOCATED_12_ADDSUB_EXT=1847, // terminal\nENC_UNALLOCATED_12_ASIMDALL=1848, // terminal\nENC_UNALLOCATED_12_ASIMDEXT=1849, // terminal\nENC_UNALLOCATED_12_ASIMDINS=1850, // terminal\nENC_UNALLOCATED_12_ASIMDMISCFP16=1851, // terminal\nENC_UNALLOCATED_12_ASIMDTBL=1852, // terminal\nENC_UNALLOCATED_12_ASISDDIFF=1853, // terminal\nENC_UNALLOCATED_12_ASISDLSE=1854, // terminal\nENC_UNALLOCATED_12_ASISDMISC=1855, // terminal\nENC_UNALLOCATED_12_ASISDMISCFP16=1856, // terminal\nENC_UNALLOCATED_12_ASISDONE=1857, // terminal\nENC_UNALLOCATED_12_ASISDPAIR=1858, // terminal\nENC_UNALLOCATED_12_BARRIERS=1859, // terminal\nENC_UNALLOCATED_12_BITFIELD=1860, // terminal\nENC_UNALLOCATED_12_BRANCH_REG=1861, // terminal\nENC_UNALLOCATED_12_CONDBRANCH=1862, // terminal\nENC_UNALLOCATED_12_CONDCMP_IMM=1863, // terminal\nENC_UNALLOCATED_12_CONDCMP_REG=1864, // terminal\nENC_UNALLOCATED_12_CRYPTOAES=1865, // terminal\nENC_UNALLOCATED_12_CRYPTOSHA2=1866, // terminal\nENC_UNALLOCATED_12_CRYPTOSHA3=1867, // terminal\nENC_UNALLOCATED_12_DP_1SRC=1868, // terminal\nENC_UNALLOCATED_12_EXTRACT=1869, // terminal\nENC_UNALLOCATED_12_FLOAT2FIX=1870, // terminal\nENC_UNALLOCATED_12_FLOAT2INT=1871, // terminal\nENC_UNALLOCATED_12_FLOATCCMP=1872, // terminal\nENC_UNALLOCATED_12_FLOATCMP=1873, // terminal\nENC_UNALLOCATED_12_FLOATDP1=1874, // terminal\nENC_UNALLOCATED_12_FLOATDP2=1875, // terminal\nENC_UNALLOCATED_12_FLOATDP3=1876, // terminal\nENC_UNALLOCATED_12_FLOATIMM=1877, // terminal\nENC_UNALLOCATED_12_FLOATSEL=1878, // terminal\nENC_UNALLOCATED_12_LDSTNAPAIR_OFFS=1879, // terminal\nENC_UNALLOCATED_12_SYSTEMINSTRSWITHREG=1880, // terminal\nENC_UNALLOCATED_12_SYSTEMRESULT=1881, // terminal\nENC_UNALLOCATED_139=1882, // terminal\nENC_UNALLOCATED_13_ADDSUB_EXT=1883, // terminal\nENC_UNALLOCATED_13_ASIMDELEM=1884, // terminal\nENC_UNALLOCATED_13_ASIMDMISCFP16=1885, // terminal\nENC_UNALLOCATED_13_ASIMDSAME2=1886, // terminal\nENC_UNALLOCATED_13_ASIMDSHF=1887, // terminal\nENC_UNALLOCATED_13_ASISDDIFF=1888, // terminal\nENC_UNALLOCATED_13_ASISDELEM=1889, // terminal\nENC_UNALLOCATED_13_ASISDLSEP=1890, // terminal\nENC_UNALLOCATED_13_ASISDMISCFP16=1891, // terminal\nENC_UNALLOCATED_13_ASISDONE=1892, // terminal\nENC_UNALLOCATED_13_ASISDSAME2=1893, // terminal\nENC_UNALLOCATED_13_ASISDSAMEFP16=1894, // terminal\nENC_UNALLOCATED_13_BRANCH_REG=1895, // terminal\nENC_UNALLOCATED_13_CRYPTOAES=1896, // terminal\nENC_UNALLOCATED_13_DP_1SRC=1897, // terminal\nENC_UNALLOCATED_13_EXTRACT=1898, // terminal\nENC_UNALLOCATED_13_FLOAT2FIX=1899, // terminal\nENC_UNALLOCATED_13_FLOAT2INT=1900, // terminal\nENC_UNALLOCATED_13_FLOATCMP=1901, // terminal\nENC_UNALLOCATED_13_FLOATDP2=1902, // terminal\nENC_UNALLOCATED_13_FLOATIMM=1903, // terminal\nENC_UNALLOCATED_13_LDSTTAGS=1904, // terminal\nENC_UNALLOCATED_13_MOVEWIDE=1905, // terminal\nENC_UNALLOCATED_13_RMIF=1906, // terminal\nENC_UNALLOCATED_13_SYSTEMINSTRSWITHREG=1907, // terminal\nENC_UNALLOCATED_13_SYSTEMRESULT=1908, // terminal\nENC_UNALLOCATED_140=1909, // terminal\nENC_UNALLOCATED_141=1910, // terminal\nENC_UNALLOCATED_142=1911, // terminal\nENC_UNALLOCATED_143=1912, // terminal\nENC_UNALLOCATED_144=1913, // terminal\nENC_UNALLOCATED_145=1914, // terminal\nENC_UNALLOCATED_146=1915, // terminal\nENC_UNALLOCATED_147=1916, // terminal\nENC_UNALLOCATED_148=1917, // terminal\nENC_UNALLOCATED_149=1918, // terminal\nENC_UNALLOCATED_14_ADDSUB_IMMTAGS=1919, // terminal\nENC_UNALLOCATED_14_ASIMDMISC=1920, // terminal\nENC_UNALLOCATED_14_ASISDELEM=1921, // terminal\nENC_UNALLOCATED_14_ASISDLSE=1922, // terminal\nENC_UNALLOCATED_14_ASISDLSO=1923, // terminal\nENC_UNALLOCATED_14_ASISDLSOP=1924, // terminal\nENC_UNALLOCATED_14_ASISDONE=1925, // terminal\nENC_UNALLOCATED_14_ASISDSAME=1926, // terminal\nENC_UNALLOCATED_14_ASISDSAMEFP16=1927, // terminal\nENC_UNALLOCATED_14_ASISDSHF=1928, // terminal\nENC_UNALLOCATED_14_BARRIERS=1929, // terminal\nENC_UNALLOCATED_14_CRYPTO4=1930, // terminal\nENC_UNALLOCATED_14_DP_1SRC=1931, // terminal\nENC_UNALLOCATED_14_DP_2SRC=1932, // terminal\nENC_UNALLOCATED_14_DP_3SRC=1933, // terminal\nENC_UNALLOCATED_14_FLOAT2FIX=1934, // terminal\nENC_UNALLOCATED_14_FLOAT2INT=1935, // terminal\nENC_UNALLOCATED_14_FLOATCMP=1936, // terminal\nENC_UNALLOCATED_14_FLOATDP2=1937, // terminal\nENC_UNALLOCATED_14_FLOATIMM=1938, // terminal\nENC_UNALLOCATED_14_LDST_PAC=1939, // terminal\nENC_UNALLOCATED_14_RMIF=1940, // terminal\nENC_UNALLOCATED_14_SETF=1941, // terminal\nENC_UNALLOCATED_14_SYSTEMINSTRSWITHREG=1942, // terminal\nENC_UNALLOCATED_150=1943, // terminal\nENC_UNALLOCATED_151=1944, // terminal\nENC_UNALLOCATED_152=1945, // terminal\nENC_UNALLOCATED_153=1946, // terminal\nENC_UNALLOCATED_154=1947, // terminal\nENC_UNALLOCATED_154_MEMOP=1948, // terminal\nENC_UNALLOCATED_155=1949, // terminal\nENC_UNALLOCATED_155_MEMOP=1950, // terminal\nENC_UNALLOCATED_156=1951, // terminal\nENC_UNALLOCATED_156_MEMOP=1952, // terminal\nENC_UNALLOCATED_157=1953, // terminal\nENC_UNALLOCATED_158=1954, // terminal\nENC_UNALLOCATED_158_MEMOP=1955, // terminal\nENC_UNALLOCATED_159=1956, // terminal\nENC_UNALLOCATED_159_MEMOP=1957, // terminal\nENC_UNALLOCATED_15_ASIMDALL=1958, // terminal\nENC_UNALLOCATED_15_ASIMDINS=1959, // terminal\nENC_UNALLOCATED_15_ASIMDPERM=1960, // terminal\nENC_UNALLOCATED_15_ASISDDIFF=1961, // terminal\nENC_UNALLOCATED_15_ASISDMISC=1962, // terminal\nENC_UNALLOCATED_15_ASISDONE=1963, // terminal\nENC_UNALLOCATED_15_ASISDSAME=1964, // terminal\nENC_UNALLOCATED_15_ASISDSAME2=1965, // terminal\nENC_UNALLOCATED_15_BRANCH_REG=1966, // terminal\nENC_UNALLOCATED_15_DP_1SRC=1967, // terminal\nENC_UNALLOCATED_15_DP_2SRC=1968, // terminal\nENC_UNALLOCATED_15_EXCEPTION=1969, // terminal\nENC_UNALLOCATED_15_FLOAT2FIX=1970, // terminal\nENC_UNALLOCATED_15_FLOATCMP=1971, // terminal\nENC_UNALLOCATED_15_FLOATDP2=1972, // terminal\nENC_UNALLOCATED_15_FLOATIMM=1973, // terminal\nENC_UNALLOCATED_15_LDST_PAC=1974, // terminal\nENC_UNALLOCATED_15_LDSTTAGS=1975, // terminal\nENC_UNALLOCATED_15_SETF=1976, // terminal\nENC_UNALLOCATED_160=1977, // terminal\nENC_UNALLOCATED_160_MEMOP=1978, // terminal\nENC_UNALLOCATED_161=1979, // terminal\nENC_UNALLOCATED_161_MEMOP=1980, // terminal\nENC_UNALLOCATED_162=1981, // terminal\nENC_UNALLOCATED_162_MEMOP=1982, // terminal\nENC_UNALLOCATED_163=1983, // terminal\nENC_UNALLOCATED_163_MEMOP=1984, // terminal\nENC_UNALLOCATED_164=1985, // terminal\nENC_UNALLOCATED_165=1986, // terminal\nENC_UNALLOCATED_165_MEMOP=1987, // terminal\nENC_UNALLOCATED_166=1988, // terminal\nENC_UNALLOCATED_166_MEMOP=1989, // terminal\nENC_UNALLOCATED_167=1990, // terminal\nENC_UNALLOCATED_167_MEMOP=1991, // terminal\nENC_UNALLOCATED_168=1992, // terminal\nENC_UNALLOCATED_168_MEMOP=1993, // terminal\nENC_UNALLOCATED_169=1994, // terminal\nENC_UNALLOCATED_169_MEMOP=1995, // terminal\nENC_UNALLOCATED_16_ASIMDALL=1996, // terminal\nENC_UNALLOCATED_16_ASIMDELEM=1997, // terminal\nENC_UNALLOCATED_16_ASIMDSAMEFP16=1998, // terminal\nENC_UNALLOCATED_16_ASIMDSHF=1999, // terminal\nENC_UNALLOCATED_16_ASISDDIFF=2000, // terminal\nENC_UNALLOCATED_16_ASISDELEM=2001, // terminal\nENC_UNALLOCATED_16_ASISDLSE=2002, // terminal\nENC_UNALLOCATED_16_ASISDLSEP=2003, // terminal\nENC_UNALLOCATED_16_ASISDLSO=2004, // terminal\nENC_UNALLOCATED_16_ASISDLSOP=2005, // terminal\nENC_UNALLOCATED_16_ASISDMISC=2006, // terminal\nENC_UNALLOCATED_16_ASISDSAME2=2007, // terminal\nENC_UNALLOCATED_16_CRYPTOSHA2=2008, // terminal\nENC_UNALLOCATED_16_DP_1SRC=2009, // terminal\nENC_UNALLOCATED_16_DP_3SRC=2010, // terminal\nENC_UNALLOCATED_16_EXCEPTION=2011, // terminal\nENC_UNALLOCATED_16_EXTRACT=2012, // terminal\nENC_UNALLOCATED_16_FLOAT2FIX=2013, // terminal\nENC_UNALLOCATED_16_FLOATCMP=2014, // terminal\nENC_UNALLOCATED_16_FLOATIMM=2015, // terminal\nENC_UNALLOCATED_16_SETF=2016, // terminal\nENC_UNALLOCATED_170=2017, // terminal\nENC_UNALLOCATED_170_MEMOP=2018, // terminal\nENC_UNALLOCATED_171=2019, // terminal\nENC_UNALLOCATED_172=2020, // terminal\nENC_UNALLOCATED_172_MEMOP=2021, // terminal\nENC_UNALLOCATED_173=2022, // terminal\nENC_UNALLOCATED_173_MEMOP=2023, // terminal\nENC_UNALLOCATED_174=2024, // terminal\nENC_UNALLOCATED_174_MEMOP=2025, // terminal\nENC_UNALLOCATED_175=2026, // terminal\nENC_UNALLOCATED_175_MEMOP=2027, // terminal\nENC_UNALLOCATED_176=2028, // terminal\nENC_UNALLOCATED_177=2029, // terminal\nENC_UNALLOCATED_178=2030, // terminal\nENC_UNALLOCATED_179=2031, // terminal\nENC_UNALLOCATED_17_ASIMDELEM=2032, // terminal\nENC_UNALLOCATED_17_ASIMDINS=2033, // terminal\nENC_UNALLOCATED_17_ASIMDSAME2=2034, // terminal\nENC_UNALLOCATED_17_ASISDELEM=2035, // terminal\nENC_UNALLOCATED_17_ASISDONE=2036, // terminal\nENC_UNALLOCATED_17_ASISDSAME2=2037, // terminal\nENC_UNALLOCATED_17_ASISDSAMEFP16=2038, // terminal\nENC_UNALLOCATED_17_ASISDSHF=2039, // terminal\nENC_UNALLOCATED_17_BARRIERS=2040, // terminal\nENC_UNALLOCATED_17_BRANCH_REG=2041, // terminal\nENC_UNALLOCATED_17_CRYPTOSHA2=2042, // terminal\nENC_UNALLOCATED_17_DP_1SRC=2043, // terminal\nENC_UNALLOCATED_17_EXTRACT=2044, // terminal\nENC_UNALLOCATED_17_FLOAT2FIX=2045, // terminal\nENC_UNALLOCATED_17_FLOATCMP=2046, // terminal\nENC_UNALLOCATED_17_FLOATDP1=2047, // terminal\nENC_UNALLOCATED_17_FLOATIMM=2048, // terminal\nENC_UNALLOCATED_17_LOADLIT=2049, // terminal\nENC_UNALLOCATED_17_SETF=2050, // terminal\nENC_UNALLOCATED_180=2051, // terminal\nENC_UNALLOCATED_180_MEMOP=2052, // terminal\nENC_UNALLOCATED_181=2053, // terminal\nENC_UNALLOCATED_181_MEMOP=2054, // terminal\nENC_UNALLOCATED_182=2055, // terminal\nENC_UNALLOCATED_182_MEMOP=2056, // terminal\nENC_UNALLOCATED_183=2057, // terminal\nENC_UNALLOCATED_183_MEMOP=2058, // terminal\nENC_UNALLOCATED_184=2059, // terminal\nENC_UNALLOCATED_185=2060, // terminal\nENC_UNALLOCATED_185_MEMOP=2061, // terminal\nENC_UNALLOCATED_186=2062, // terminal\nENC_UNALLOCATED_186_MEMOP=2063, // terminal\nENC_UNALLOCATED_187=2064, // terminal\nENC_UNALLOCATED_187_MEMOP=2065, // terminal\nENC_UNALLOCATED_188=2066, // terminal\nENC_UNALLOCATED_188_MEMOP=2067, // terminal\nENC_UNALLOCATED_189=2068, // terminal\nENC_UNALLOCATED_189_MEMOP=2069, // terminal\nENC_UNALLOCATED_18_ASIMDINS=2070, // terminal\nENC_UNALLOCATED_18_ASIMDSAMEFP16=2071, // terminal\nENC_UNALLOCATED_18_ASISDDIFF=2072, // terminal\nENC_UNALLOCATED_18_ASISDLSO=2073, // terminal\nENC_UNALLOCATED_18_ASISDLSOP=2074, // terminal\nENC_UNALLOCATED_18_BARRIERS=2075, // terminal\nENC_UNALLOCATED_18_BRANCH_REG=2076, // terminal\nENC_UNALLOCATED_18_CRYPTOAES=2077, // terminal\nENC_UNALLOCATED_18_CRYPTOSHA2=2078, // terminal\nENC_UNALLOCATED_18_CRYPTOSHA512_3=2079, // terminal\nENC_UNALLOCATED_18_DP_1SRC=2080, // terminal\nENC_UNALLOCATED_18_DP_3SRC=2081, // terminal\nENC_UNALLOCATED_18_EXCEPTION=2082, // terminal\nENC_UNALLOCATED_18_EXTRACT=2083, // terminal\nENC_UNALLOCATED_190=2084, // terminal\nENC_UNALLOCATED_191=2085, // terminal\nENC_UNALLOCATED_192=2086, // terminal\nENC_UNALLOCATED_193=2087, // terminal\nENC_UNALLOCATED_194=2088, // terminal\nENC_UNALLOCATED_195=2089, // terminal\nENC_UNALLOCATED_196=2090, // terminal\nENC_UNALLOCATED_197=2091, // terminal\nENC_UNALLOCATED_198=2092, // terminal\nENC_UNALLOCATED_199=2093, // terminal\nENC_UNALLOCATED_19_ASIMDALL=2094, // terminal\nENC_UNALLOCATED_19_ASIMDMISCFP16=2095, // terminal\nENC_UNALLOCATED_19_ASIMDSAME2=2096, // terminal\nENC_UNALLOCATED_19_ASIMDSHF=2097, // terminal\nENC_UNALLOCATED_19_ASISDDIFF=2098, // terminal\nENC_UNALLOCATED_19_ASISDELEM=2099, // terminal\nENC_UNALLOCATED_19_ASISDLSEP=2100, // terminal\nENC_UNALLOCATED_19_ASISDMISCFP16=2101, // terminal\nENC_UNALLOCATED_19_ASISDPAIR=2102, // terminal\nENC_UNALLOCATED_19_ASISDSAMEFP16=2103, // terminal\nENC_UNALLOCATED_19_BARRIERS=2104, // terminal\nENC_UNALLOCATED_19_BITFIELD=2105, // terminal\nENC_UNALLOCATED_19_BRANCH_REG=2106, // terminal\nENC_UNALLOCATED_19_CRYPTOAES=2107, // terminal\nENC_UNALLOCATED_19_CRYPTOSHA2=2108, // terminal\nENC_UNALLOCATED_19_DP_1SRC=2109, // terminal\nENC_UNALLOCATED_19_EXCEPTION=2110, // terminal\nENC_UNALLOCATED_19_FLOATDP1=2111, // terminal\nENC_UNALLOCATED_200=2112, // terminal\nENC_UNALLOCATED_201=2113, // terminal\nENC_UNALLOCATED_202=2114, // terminal\nENC_UNALLOCATED_203=2115, // terminal\nENC_UNALLOCATED_204=2116, // terminal\nENC_UNALLOCATED_205=2117, // terminal\nENC_UNALLOCATED_206=2118, // terminal\nENC_UNALLOCATED_207=2119, // terminal\nENC_UNALLOCATED_208=2120, // terminal\nENC_UNALLOCATED_209=2121, // terminal\nENC_UNALLOCATED_20_ASIMDSAME2=2122, // terminal\nENC_UNALLOCATED_20_ASISDELEM=2123, // terminal\nENC_UNALLOCATED_20_ASISDLSE=2124, // terminal\nENC_UNALLOCATED_20_ASISDMISCFP16=2125, // terminal\nENC_UNALLOCATED_20_ASISDPAIR=2126, // terminal\nENC_UNALLOCATED_20_ASISDSHF=2127, // terminal\nENC_UNALLOCATED_20_BARRIERS=2128, // terminal\nENC_UNALLOCATED_20_BRANCH_REG=2129, // terminal\nENC_UNALLOCATED_20_CRYPTOSHA3=2130, // terminal\nENC_UNALLOCATED_20_DP_1SRC=2131, // terminal\nENC_UNALLOCATED_20_DP_2SRC=2132, // terminal\nENC_UNALLOCATED_20_DP_3SRC=2133, // terminal\nENC_UNALLOCATED_210=2134, // terminal\nENC_UNALLOCATED_211=2135, // terminal\nENC_UNALLOCATED_212=2136, // terminal\nENC_UNALLOCATED_213=2137, // terminal\nENC_UNALLOCATED_214=2138, // terminal\nENC_UNALLOCATED_215=2139, // terminal\nENC_UNALLOCATED_216=2140, // terminal\nENC_UNALLOCATED_217=2141, // terminal\nENC_UNALLOCATED_218=2142, // terminal\nENC_UNALLOCATED_219=2143, // terminal\nENC_UNALLOCATED_21_ASIMDALL=2144, // terminal\nENC_UNALLOCATED_21_ASIMDINS=2145, // terminal\nENC_UNALLOCATED_21_ASIMDSAME2=2146, // terminal\nENC_UNALLOCATED_21_ASISDDIFF=2147, // terminal\nENC_UNALLOCATED_21_ASISDLSO=2148, // terminal\nENC_UNALLOCATED_21_ASISDLSOP=2149, // terminal\nENC_UNALLOCATED_21_ASISDMISCFP16=2150, // terminal\nENC_UNALLOCATED_21_ASISDSAMEFP16=2151, // terminal\nENC_UNALLOCATED_21_BRANCH_REG=2152, // terminal\nENC_UNALLOCATED_21_DP_1SRC=2153, // terminal\nENC_UNALLOCATED_21_DP_2SRC=2154, // terminal\nENC_UNALLOCATED_21_DP_3SRC=2155, // terminal\nENC_UNALLOCATED_21_EXCEPTION=2156, // terminal\nENC_UNALLOCATED_21_LDAPSTL_UNSCALED=2157, // terminal\nENC_UNALLOCATED_21_LDST_IMMPOST=2158, // terminal\nENC_UNALLOCATED_21_LDST_IMMPRE=2159, // terminal\nENC_UNALLOCATED_21_LDST_UNPRIV=2160, // terminal\nENC_UNALLOCATED_21_LDSTNAPAIR_OFFS=2161, // terminal\nENC_UNALLOCATED_220=2162, // terminal\nENC_UNALLOCATED_221=2163, // terminal\nENC_UNALLOCATED_222=2164, // terminal\nENC_UNALLOCATED_223=2165, // terminal\nENC_UNALLOCATED_224=2166, // terminal\nENC_UNALLOCATED_225=2167, // terminal\nENC_UNALLOCATED_226=2168, // terminal\nENC_UNALLOCATED_227=2169, // terminal\nENC_UNALLOCATED_228=2170, // terminal\nENC_UNALLOCATED_229=2171, // terminal\nENC_UNALLOCATED_22_ASIMDMISCFP16=2172, // terminal\nENC_UNALLOCATED_22_ASIMDSAME2=2173, // terminal\nENC_UNALLOCATED_22_ASIMDSHF=2174, // terminal\nENC_UNALLOCATED_22_ASISDDIFF=2175, // terminal\nENC_UNALLOCATED_22_ASISDELEM=2176, // terminal\nENC_UNALLOCATED_22_ASISDLSE=2177, // terminal\nENC_UNALLOCATED_22_ASISDMISCFP16=2178, // terminal\nENC_UNALLOCATED_22_DP_3SRC=2179, // terminal\nENC_UNALLOCATED_22_EXCEPTION=2180, // terminal\nENC_UNALLOCATED_22_LDSTPAIR_OFF=2181, // terminal\nENC_UNALLOCATED_22_LDSTPAIR_POST=2182, // terminal\nENC_UNALLOCATED_22_LDSTPAIR_PRE=2183, // terminal\nENC_UNALLOCATED_230=2184, // terminal\nENC_UNALLOCATED_231=2185, // terminal\nENC_UNALLOCATED_232=2186, // terminal\nENC_UNALLOCATED_233=2187, // terminal\nENC_UNALLOCATED_234=2188, // terminal\nENC_UNALLOCATED_235=2189, // terminal\nENC_UNALLOCATED_236=2190, // terminal\nENC_UNALLOCATED_237=2191, // terminal\nENC_UNALLOCATED_238=2192, // terminal\nENC_UNALLOCATED_239=2193, // terminal\nENC_UNALLOCATED_23_ASIMDSHF=2194, // terminal\nENC_UNALLOCATED_23_ASISDELEM=2195, // terminal\nENC_UNALLOCATED_23_ASISDLSE=2196, // terminal\nENC_UNALLOCATED_23_ASISDLSO=2197, // terminal\nENC_UNALLOCATED_23_ASISDLSOP=2198, // terminal\nENC_UNALLOCATED_23_ASISDSAMEFP16=2199, // terminal\nENC_UNALLOCATED_23_ASISDSHF=2200, // terminal\nENC_UNALLOCATED_23_BRANCH_REG=2201, // terminal\nENC_UNALLOCATED_23_DP_3SRC=2202, // terminal\nENC_UNALLOCATED_23_EXCEPTION=2203, // terminal\nENC_UNALLOCATED_240=2204, // terminal\nENC_UNALLOCATED_241=2205, // terminal\nENC_UNALLOCATED_242=2206, // terminal\nENC_UNALLOCATED_243=2207, // terminal\nENC_UNALLOCATED_244=2208, // terminal\nENC_UNALLOCATED_245=2209, // terminal\nENC_UNALLOCATED_246=2210, // terminal\nENC_UNALLOCATED_247=2211, // terminal\nENC_UNALLOCATED_248=2212, // terminal\nENC_UNALLOCATED_249=2213, // terminal\nENC_UNALLOCATED_24_ASIMDALL=2214, // terminal\nENC_UNALLOCATED_24_ASIMDINS=2215, // terminal\nENC_UNALLOCATED_24_ASIMDMISC=2216, // terminal\nENC_UNALLOCATED_24_ASISDMISC=2217, // terminal\nENC_UNALLOCATED_24_ASISDSHF=2218, // terminal\nENC_UNALLOCATED_24_BRANCH_REG=2219, // terminal\nENC_UNALLOCATED_24_DP_2SRC=2220, // terminal\nENC_UNALLOCATED_24_EXCEPTION=2221, // terminal\nENC_UNALLOCATED_24_LDAPSTL_UNSCALED=2222, // terminal\nENC_UNALLOCATED_24_LDST_IMMPOST=2223, // terminal\nENC_UNALLOCATED_24_LDST_IMMPRE=2224, // terminal\nENC_UNALLOCATED_24_LDST_POS=2225, // terminal\nENC_UNALLOCATED_24_LDST_UNPRIV=2226, // terminal\nENC_UNALLOCATED_24_LDST_UNSCALED=2227, // terminal\nENC_UNALLOCATED_250=2228, // terminal\nENC_UNALLOCATED_251=2229, // terminal\nENC_UNALLOCATED_252=2230, // terminal\nENC_UNALLOCATED_253=2231, // terminal\nENC_UNALLOCATED_254=2232, // terminal\nENC_UNALLOCATED_255=2233, // terminal\nENC_UNALLOCATED_256=2234, // terminal\nENC_UNALLOCATED_257=2235, // terminal\nENC_UNALLOCATED_258=2236, // terminal\nENC_UNALLOCATED_259=2237, // terminal\nENC_UNALLOCATED_25_ASIMDELEM=2238, // terminal\nENC_UNALLOCATED_25_ASIMDSAMEFP16=2239, // terminal\nENC_UNALLOCATED_25_ASIMDSHF=2240, // terminal\nENC_UNALLOCATED_25_ASISDELEM=2241, // terminal\nENC_UNALLOCATED_25_ASISDLSE=2242, // terminal\nENC_UNALLOCATED_25_ASISDLSO=2243, // terminal\nENC_UNALLOCATED_25_ASISDLSOP=2244, // terminal\nENC_UNALLOCATED_25_ASISDPAIR=2245, // terminal\nENC_UNALLOCATED_25_ASISDSAMEFP16=2246, // terminal\nENC_UNALLOCATED_25_BARRIERS=2247, // terminal\nENC_UNALLOCATED_25_DP_2SRC=2248, // terminal\nENC_UNALLOCATED_25_DP_3SRC=2249, // terminal\nENC_UNALLOCATED_25_LDAPSTL_UNSCALED=2250, // terminal\nENC_UNALLOCATED_25_LDST_UNPRIV=2251, // terminal\nENC_UNALLOCATED_260=2252, // terminal\nENC_UNALLOCATED_261=2253, // terminal\nENC_UNALLOCATED_262=2254, // terminal\nENC_UNALLOCATED_263=2255, // terminal\nENC_UNALLOCATED_264=2256, // terminal\nENC_UNALLOCATED_265=2257, // terminal\nENC_UNALLOCATED_266=2258, // terminal\nENC_UNALLOCATED_267=2259, // terminal\nENC_UNALLOCATED_268=2260, // terminal\nENC_UNALLOCATED_269=2261, // terminal\nENC_UNALLOCATED_26_ASIMDALL=2262, // terminal\nENC_UNALLOCATED_26_ASIMDELEM=2263, // terminal\nENC_UNALLOCATED_26_ASIMDIMM=2264, // terminal\nENC_UNALLOCATED_26_ASIMDMISCFP16=2265, // terminal\nENC_UNALLOCATED_26_ASIMDSAME2=2266, // terminal\nENC_UNALLOCATED_26_ASIMDSAMEFP16=2267, // terminal\nENC_UNALLOCATED_26_ASISDELEM=2268, // terminal\nENC_UNALLOCATED_26_ASISDLSEP=2269, // terminal\nENC_UNALLOCATED_26_ASISDLSO=2270, // terminal\nENC_UNALLOCATED_26_ASISDLSOP=2271, // terminal\nENC_UNALLOCATED_26_ASISDPAIR=2272, // terminal\nENC_UNALLOCATED_26_ASISDSHF=2273, // terminal\nENC_UNALLOCATED_26_BRANCH_REG=2274, // terminal\nENC_UNALLOCATED_26_FLOATDP1=2275, // terminal\nENC_UNALLOCATED_270=2276, // terminal\nENC_UNALLOCATED_271=2277, // terminal\nENC_UNALLOCATED_272=2278, // terminal\nENC_UNALLOCATED_273=2279, // terminal\nENC_UNALLOCATED_274=2280, // terminal\nENC_UNALLOCATED_275=2281, // terminal\nENC_UNALLOCATED_276=2282, // terminal\nENC_UNALLOCATED_277=2283, // terminal\nENC_UNALLOCATED_278=2284, // terminal\nENC_UNALLOCATED_279=2285, // terminal\nENC_UNALLOCATED_27_ASIMDALL=2286, // terminal\nENC_UNALLOCATED_27_ASIMDELEM=2287, // terminal\nENC_UNALLOCATED_27_ASIMDIMM=2288, // terminal\nENC_UNALLOCATED_27_ASIMDSAME2=2289, // terminal\nENC_UNALLOCATED_27_ASISDLSE=2290, // terminal\nENC_UNALLOCATED_27_ASISDMISC=2291, // terminal\nENC_UNALLOCATED_27_ASISDPAIR=2292, // terminal\nENC_UNALLOCATED_27_ASISDSAMEFP16=2293, // terminal\nENC_UNALLOCATED_27_DP_3SRC=2294, // terminal\nENC_UNALLOCATED_280=2295, // terminal\nENC_UNALLOCATED_281=2296, // terminal\nENC_UNALLOCATED_282=2297, // terminal\nENC_UNALLOCATED_283=2298, // terminal\nENC_UNALLOCATED_284=2299, // terminal\nENC_UNALLOCATED_285=2300, // terminal\nENC_UNALLOCATED_286=2301, // terminal\nENC_UNALLOCATED_287=2302, // terminal\nENC_UNALLOCATED_288=2303, // terminal\nENC_UNALLOCATED_289=2304, // terminal\nENC_UNALLOCATED_28_ASIMDIMM=2305, // terminal\nENC_UNALLOCATED_28_ASIMDSAME2=2306, // terminal\nENC_UNALLOCATED_28_ASIMDSHF=2307, // terminal\nENC_UNALLOCATED_28_ASISDELEM=2308, // terminal\nENC_UNALLOCATED_28_BRANCH_REG=2309, // terminal\nENC_UNALLOCATED_28_DP_1SRC=2310, // terminal\nENC_UNALLOCATED_28_EXCEPTION=2311, // terminal\nENC_UNALLOCATED_28_LDST_REGOFF=2312, // terminal\nENC_UNALLOCATED_290=2313, // terminal\nENC_UNALLOCATED_291=2314, // terminal\nENC_UNALLOCATED_292=2315, // terminal\nENC_UNALLOCATED_293=2316, // terminal\nENC_UNALLOCATED_294=2317, // terminal\nENC_UNALLOCATED_295=2318, // terminal\nENC_UNALLOCATED_296=2319, // terminal\nENC_UNALLOCATED_297=2320, // terminal\nENC_UNALLOCATED_298=2321, // terminal\nENC_UNALLOCATED_299=2322, // terminal\nENC_UNALLOCATED_29_ASIMDALL=2323, // terminal\nENC_UNALLOCATED_29_ASIMDELEM=2324, // terminal\nENC_UNALLOCATED_29_ASIMDIMM=2325, // terminal\nENC_UNALLOCATED_29_ASIMDSAMEFP16=2326, // terminal\nENC_UNALLOCATED_29_ASIMDSHF=2327, // terminal\nENC_UNALLOCATED_29_ASISDELEM=2328, // terminal\nENC_UNALLOCATED_29_ASISDLSE=2329, // terminal\nENC_UNALLOCATED_29_ASISDLSEP=2330, // terminal\nENC_UNALLOCATED_29_ASISDLSO=2331, // terminal\nENC_UNALLOCATED_29_ASISDLSOP=2332, // terminal\nENC_UNALLOCATED_29_ASISDPAIR=2333, // terminal\nENC_UNALLOCATED_29_ASISDSHF=2334, // terminal\nENC_UNALLOCATED_29_BRANCH_REG=2335, // terminal\nENC_UNALLOCATED_29_DP_3SRC=2336, // terminal\nENC_UNALLOCATED_29_EXCEPTION=2337, // terminal\nENC_UNALLOCATED_300=2338, // terminal\nENC_UNALLOCATED_301=2339, // terminal\nENC_UNALLOCATED_302=2340, // terminal\nENC_UNALLOCATED_303=2341, // terminal\nENC_UNALLOCATED_304=2342, // terminal\nENC_UNALLOCATED_305=2343, // terminal\nENC_UNALLOCATED_306=2344, // terminal\nENC_UNALLOCATED_307=2345, // terminal\nENC_UNALLOCATED_308=2346, // terminal\nENC_UNALLOCATED_309=2347, // terminal\nENC_UNALLOCATED_30_ASIMDIMM=2348, // terminal\nENC_UNALLOCATED_30_ASISDLSEP=2349, // terminal\nENC_UNALLOCATED_30_ASISDPAIR=2350, // terminal\nENC_UNALLOCATED_30_ASISDSAME=2351, // terminal\nENC_UNALLOCATED_30_ASISDSHF=2352, // terminal\nENC_UNALLOCATED_30_BRANCH_REG=2353, // terminal\nENC_UNALLOCATED_30_DP_3SRC=2354, // terminal\nENC_UNALLOCATED_30_EXCEPTION=2355, // terminal\nENC_UNALLOCATED_310=2356, // terminal\nENC_UNALLOCATED_311=2357, // terminal\nENC_UNALLOCATED_312=2358, // terminal\nENC_UNALLOCATED_313=2359, // terminal\nENC_UNALLOCATED_314=2360, // terminal\nENC_UNALLOCATED_315=2361, // terminal\nENC_UNALLOCATED_316=2362, // terminal\nENC_UNALLOCATED_317=2363, // terminal\nENC_UNALLOCATED_318=2364, // terminal\nENC_UNALLOCATED_319=2365, // terminal\nENC_UNALLOCATED_31_ASIMDIMM=2366, // terminal\nENC_UNALLOCATED_31_ASIMDSAME2=2367, // terminal\nENC_UNALLOCATED_31_ASIMDSAMEFP16=2368, // terminal\nENC_UNALLOCATED_31_ASIMDSHF=2369, // terminal\nENC_UNALLOCATED_31_ASISDLSO=2370, // terminal\nENC_UNALLOCATED_31_ASISDLSOP=2371, // terminal\nENC_UNALLOCATED_31_BRANCH_REG=2372, // terminal\nENC_UNALLOCATED_31_DP_3SRC=2373, // terminal\nENC_UNALLOCATED_31_EXCEPTION=2374, // terminal\nENC_UNALLOCATED_320=2375, // terminal\nENC_UNALLOCATED_321=2376, // terminal\nENC_UNALLOCATED_322=2377, // terminal\nENC_UNALLOCATED_323=2378, // terminal\nENC_UNALLOCATED_324=2379, // terminal\nENC_UNALLOCATED_325=2380, // terminal\nENC_UNALLOCATED_326=2381, // terminal\nENC_UNALLOCATED_327=2382, // terminal\nENC_UNALLOCATED_328=2383, // terminal\nENC_UNALLOCATED_329=2384, // terminal\nENC_UNALLOCATED_32_ASIMDALL=2385, // terminal\nENC_UNALLOCATED_32_ASIMDDIFF=2386, // terminal\nENC_UNALLOCATED_32_ASIMDELEM=2387, // terminal\nENC_UNALLOCATED_32_ASIMDSAME2=2388, // terminal\nENC_UNALLOCATED_32_ASISDELEM=2389, // terminal\nENC_UNALLOCATED_32_ASISDSHF=2390, // terminal\nENC_UNALLOCATED_32_BRANCH_REG=2391, // terminal\nENC_UNALLOCATED_32_DP_3SRC=2392, // terminal\nENC_UNALLOCATED_32_EXCEPTION=2393, // terminal\nENC_UNALLOCATED_33_ASIMDELEM=2394, // terminal\nENC_UNALLOCATED_33_ASIMDSAMEFP16=2395, // terminal\nENC_UNALLOCATED_33_ASISDLSE=2396, // terminal\nENC_UNALLOCATED_33_ASISDLSEP=2397, // terminal\nENC_UNALLOCATED_33_ASISDLSO=2398, // terminal\nENC_UNALLOCATED_33_ASISDLSOP=2399, // terminal\nENC_UNALLOCATED_33_ASISDMISC=2400, // terminal\nENC_UNALLOCATED_33_ASISDMISCFP16=2401, // terminal\nENC_UNALLOCATED_33_FLOATDP1=2402, // terminal\nENC_UNALLOCATED_34_ASIMDALL=2403, // terminal\nENC_UNALLOCATED_34_ASIMDDIFF=2404, // terminal\nENC_UNALLOCATED_34_ASIMDMISC=2405, // terminal\nENC_UNALLOCATED_34_ASIMDSAME2=2406, // terminal\nENC_UNALLOCATED_34_ASIMDSHF=2407, // terminal\nENC_UNALLOCATED_34_ASISDLSO=2408, // terminal\nENC_UNALLOCATED_34_ASISDLSOP=2409, // terminal\nENC_UNALLOCATED_34_ASISDMISC=2410, // terminal\nENC_UNALLOCATED_34_BRANCH_REG=2411, // terminal\nENC_UNALLOCATED_34_DP_1SRC=2412, // terminal\nENC_UNALLOCATED_34_DP_2SRC=2413, // terminal\nENC_UNALLOCATED_34_FLOATDP1=2414, // terminal\nENC_UNALLOCATED_35_ASIMDALL=2415, // terminal\nENC_UNALLOCATED_35_ASIMDSAME2=2416, // terminal\nENC_UNALLOCATED_35_ASISDELEM=2417, // terminal\nENC_UNALLOCATED_35_ASISDLSE=2418, // terminal\nENC_UNALLOCATED_35_ASISDMISC=2419, // terminal\nENC_UNALLOCATED_35_ASISDSAME=2420, // terminal\nENC_UNALLOCATED_35_ASISDSHF=2421, // terminal\nENC_UNALLOCATED_35_BRANCH_REG=2422, // terminal\nENC_UNALLOCATED_35_DP_2SRC=2423, // terminal\nENC_UNALLOCATED_35_LDST_IMMPOST=2424, // terminal\nENC_UNALLOCATED_35_LDST_IMMPRE=2425, // terminal\nENC_UNALLOCATED_35_LDST_POS=2426, // terminal\nENC_UNALLOCATED_35_LDST_UNSCALED=2427, // terminal\nENC_UNALLOCATED_36_ASISDLSE=2428, // terminal\nENC_UNALLOCATED_36_ASISDLSEP=2429, // terminal\nENC_UNALLOCATED_36_ASISDMISC=2430, // terminal\nENC_UNALLOCATED_36_ASISDSHF=2431, // terminal\nENC_UNALLOCATED_36_DP_2SRC=2432, // terminal\nENC_UNALLOCATED_36_LDST_IMMPOST=2433, // terminal\nENC_UNALLOCATED_36_LDST_IMMPRE=2434, // terminal\nENC_UNALLOCATED_36_LDST_POS=2435, // terminal\nENC_UNALLOCATED_36_LDST_UNSCALED=2436, // terminal\nENC_UNALLOCATED_37_ASIMDMISC=2437, // terminal\nENC_UNALLOCATED_37_ASISDELEM=2438, // terminal\nENC_UNALLOCATED_37_ASISDLSO=2439, // terminal\nENC_UNALLOCATED_37_ASISDLSOP=2440, // terminal\nENC_UNALLOCATED_37_BRANCH_REG=2441, // terminal\nENC_UNALLOCATED_38_ASIMDDIFF=2442, // terminal\nENC_UNALLOCATED_38_ASIMDSAME2=2443, // terminal\nENC_UNALLOCATED_38_ASISDMISC=2444, // terminal\nENC_UNALLOCATED_38_ASISDMISCFP16=2445, // terminal\nENC_UNALLOCATED_38_ASISDSHF=2446, // terminal\nENC_UNALLOCATED_38_DP_2SRC=2447, // terminal\nENC_UNALLOCATED_39_ASIMDALL=2448, // terminal\nENC_UNALLOCATED_39_ASIMDELEM=2449, // terminal\nENC_UNALLOCATED_39_ASISDELEM=2450, // terminal\nENC_UNALLOCATED_39_ASISDLSEP=2451, // terminal\nENC_UNALLOCATED_39_ASISDLSO=2452, // terminal\nENC_UNALLOCATED_39_ASISDLSOP=2453, // terminal\nENC_UNALLOCATED_39_ASISDMISCFP16=2454, // terminal\nENC_UNALLOCATED_39_BRANCH_REG=2455, // terminal\nENC_UNALLOCATED_39_FLOAT2INT=2456, // terminal\nENC_UNALLOCATED_40_ASIMDALL=2457, // terminal\nENC_UNALLOCATED_40_ASIMDDIFF=2458, // terminal\nENC_UNALLOCATED_40_ASIMDELEM=2459, // terminal\nENC_UNALLOCATED_40_BRANCH_REG=2460, // terminal\nENC_UNALLOCATED_40_FLOAT2INT=2461, // terminal\nENC_UNALLOCATED_40_FLOATDP1=2462, // terminal\nENC_UNALLOCATED_41_ASIMDDIFF=2463, // terminal\nENC_UNALLOCATED_41_ASIMDMISCFP16=2464, // terminal\nENC_UNALLOCATED_41_ASISDLSO=2465, // terminal\nENC_UNALLOCATED_41_ASISDLSOP=2466, // terminal\nENC_UNALLOCATED_41_ASISDMISC=2467, // terminal\nENC_UNALLOCATED_41_ASISDMISCFP16=2468, // terminal\nENC_UNALLOCATED_41_BRANCH_REG=2469, // terminal\nENC_UNALLOCATED_41_FLOAT2INT=2470, // terminal\nENC_UNALLOCATED_41_LDST_REGOFF=2471, // terminal\nENC_UNALLOCATED_42_ASIMDELEM=2472, // terminal\nENC_UNALLOCATED_42_ASIMDSAMEFP16=2473, // terminal\nENC_UNALLOCATED_42_ASISDELEM=2474, // terminal\nENC_UNALLOCATED_42_ASISDLSO=2475, // terminal\nENC_UNALLOCATED_42_ASISDLSOP=2476, // terminal\nENC_UNALLOCATED_42_ASISDMISC=2477, // terminal\nENC_UNALLOCATED_42_BRANCH_REG=2478, // terminal\nENC_UNALLOCATED_42_LDST_REGOFF=2479, // terminal\nENC_UNALLOCATED_43_ASIMDMISC=2480, // terminal\nENC_UNALLOCATED_43_ASISDELEM=2481, // terminal\nENC_UNALLOCATED_43_ASISDSAME=2482, // terminal\nENC_UNALLOCATED_43_BRANCH_REG=2483, // terminal\nENC_UNALLOCATED_44_ASIMDELEM=2484, // terminal\nENC_UNALLOCATED_44_ASISDMISC=2485, // terminal\nENC_UNALLOCATED_44_ASISDSHF=2486, // terminal\nENC_UNALLOCATED_44_BRANCH_REG=2487, // terminal\nENC_UNALLOCATED_45_ASIMDSHF=2488, // terminal\nENC_UNALLOCATED_45_ASISDLSO=2489, // terminal\nENC_UNALLOCATED_45_ASISDLSOP=2490, // terminal\nENC_UNALLOCATED_45_ASISDMISC=2491, // terminal\nENC_UNALLOCATED_45_ASISDSHF=2492, // terminal\nENC_UNALLOCATED_46_ASIMDMISC=2493, // terminal\nENC_UNALLOCATED_46_ASIMDMISCFP16=2494, // terminal\nENC_UNALLOCATED_46_ASIMDSHF=2495, // terminal\nENC_UNALLOCATED_46_ASISDLSEP=2496, // terminal\nENC_UNALLOCATED_46_ASISDMISC=2497, // terminal\nENC_UNALLOCATED_46_BRANCH_REG=2498, // terminal\nENC_UNALLOCATED_47_ASIMDELEM=2499, // terminal\nENC_UNALLOCATED_47_ASIMDMISCFP16=2500, // terminal\nENC_UNALLOCATED_47_ASIMDSHF=2501, // terminal\nENC_UNALLOCATED_47_BRANCH_REG=2502, // terminal\nENC_UNALLOCATED_47_DP_2SRC=2503, // terminal\nENC_UNALLOCATED_48_ASIMDMISCFP16=2504, // terminal\nENC_UNALLOCATED_48_ASISDLSO=2505, // terminal\nENC_UNALLOCATED_48_ASISDLSOP=2506, // terminal\nENC_UNALLOCATED_48_ASISDSHF=2507, // terminal\nENC_UNALLOCATED_48_BRANCH_REG=2508, // terminal\nENC_UNALLOCATED_48_DP_2SRC=2509, // terminal\nENC_UNALLOCATED_48_FLOATDP1=2510, // terminal\nENC_UNALLOCATED_49_ASIMDMISC=2511, // terminal\nENC_UNALLOCATED_49_ASISDLSEP=2512, // terminal\nENC_UNALLOCATED_49_ASISDLSO=2513, // terminal\nENC_UNALLOCATED_49_ASISDLSOP=2514, // terminal\nENC_UNALLOCATED_49_ASISDSAME=2515, // terminal\nENC_UNALLOCATED_49_ASISDSHF=2516, // terminal\nENC_UNALLOCATED_49_BRANCH_REG=2517, // terminal\nENC_UNALLOCATED_49_DP_2SRC=2518, // terminal\nENC_UNALLOCATED_50_ASIMDSHF=2519, // terminal\nENC_UNALLOCATED_50_ASISDLSEP=2520, // terminal\nENC_UNALLOCATED_50_DP_2SRC=2521, // terminal\nENC_UNALLOCATED_51_ASIMDSHF=2522, // terminal\nENC_UNALLOCATED_51_ASISDLSO=2523, // terminal\nENC_UNALLOCATED_51_ASISDLSOP=2524, // terminal\nENC_UNALLOCATED_51_ASISDSAME=2525, // terminal\nENC_UNALLOCATED_51_BRANCH_REG=2526, // terminal\nENC_UNALLOCATED_51_DP_2SRC=2527, // terminal\nENC_UNALLOCATED_52_BRANCH_REG=2528, // terminal\nENC_UNALLOCATED_53_ASIMDELEM=2529, // terminal\nENC_UNALLOCATED_53_ASIMDMISC=2530, // terminal\nENC_UNALLOCATED_53_BRANCH_REG=2531, // terminal\nENC_UNALLOCATED_54_ASISDLSO=2532, // terminal\nENC_UNALLOCATED_54_ASISDLSOP=2533, // terminal\nENC_UNALLOCATED_55_ASIMDELEM=2534, // terminal\nENC_UNALLOCATED_55_BRANCH_REG=2535, // terminal\nENC_UNALLOCATED_55_FLOATDP1=2536, // terminal\nENC_UNALLOCATED_56_ASISDLSO=2537, // terminal\nENC_UNALLOCATED_56_ASISDLSOP=2538, // terminal\nENC_UNALLOCATED_56_BRANCH_REG=2539, // terminal\nENC_UNALLOCATED_56_FLOATDP1=2540, // terminal\nENC_UNALLOCATED_57_ASIMDELEM=2541, // terminal\nENC_UNALLOCATED_57_ASIMDMISC=2542, // terminal\nENC_UNALLOCATED_57_ASISDMISC=2543, // terminal\nENC_UNALLOCATED_57_BRANCH_REG=2544, // terminal\nENC_UNALLOCATED_57_FLOATDP1=2545, // terminal\nENC_UNALLOCATED_58_ASIMDMISC=2546, // terminal\nENC_UNALLOCATED_58_ASISDLSO=2547, // terminal\nENC_UNALLOCATED_58_ASISDLSOP=2548, // terminal\nENC_UNALLOCATED_58_ASISDSAME=2549, // terminal\nENC_UNALLOCATED_58_BRANCH_REG=2550, // terminal\nENC_UNALLOCATED_59_ASISDLSO=2551, // terminal\nENC_UNALLOCATED_59_ASISDLSOP=2552, // terminal\nENC_UNALLOCATED_59_BRANCH_REG=2553, // terminal\nENC_UNALLOCATED_60_ASIMDMISC=2554, // terminal\nENC_UNALLOCATED_60_BRANCH_REG=2555, // terminal\nENC_UNALLOCATED_61_ASIMDMISC=2556, // terminal\nENC_UNALLOCATED_61_ASISDLSO=2557, // terminal\nENC_UNALLOCATED_61_ASISDLSOP=2558, // terminal\nENC_UNALLOCATED_61_ASISDSAME=2559, // terminal\nENC_UNALLOCATED_61_BRANCH_REG=2560, // terminal\nENC_UNALLOCATED_62_ASISDMISC=2561, // terminal\nENC_UNALLOCATED_63_ASISDMISC=2562, // terminal\nENC_UNALLOCATED_63_ASISDSAME=2563, // terminal\nENC_UNALLOCATED_63_BRANCH_REG=2564, // terminal\nENC_UNALLOCATED_64_ASIMDSAME=2565, // terminal\nENC_UNALLOCATED_64_ASISDLSO=2566, // terminal\nENC_UNALLOCATED_64_ASISDLSOP=2567, // terminal\nENC_UNALLOCATED_64_BRANCH_REG=2568, // terminal\nENC_UNALLOCATED_64_FLOATDP1=2569, // terminal\nENC_UNALLOCATED_65_ASIMDMISC=2570, // terminal\nENC_UNALLOCATED_65_ASISDMISC=2571, // terminal\nENC_UNALLOCATED_65_ASISDSAME=2572, // terminal\nENC_UNALLOCATED_65_BRANCH_REG=2573, // terminal\nENC_UNALLOCATED_66_ASISDLSO=2574, // terminal\nENC_UNALLOCATED_66_ASISDLSOP=2575, // terminal\nENC_UNALLOCATED_66_BRANCH_REG=2576, // terminal\nENC_UNALLOCATED_67_BRANCH_REG=2577, // terminal\nENC_UNALLOCATED_68_ASISDLSO=2578, // terminal\nENC_UNALLOCATED_68_ASISDLSOP=2579, // terminal\nENC_UNALLOCATED_68_BRANCH_REG=2580, // terminal\nENC_UNALLOCATED_68_FLOAT2INT=2581, // terminal\nENC_UNALLOCATED_69_ASISDLSO=2582, // terminal\nENC_UNALLOCATED_69_ASISDLSOP=2583, // terminal\nENC_UNALLOCATED_69_FLOAT2INT=2584, // terminal\nENC_UNALLOCATED_70_FLOATDP1=2585, // terminal\nENC_UNALLOCATED_71_ASIMDSAME=2586, // terminal\nENC_UNALLOCATED_71_ASISDLSO=2587, // terminal\nENC_UNALLOCATED_71_ASISDLSOP=2588, // terminal\nENC_UNALLOCATED_71_BRANCH_REG=2589, // terminal\nENC_UNALLOCATED_71_FLOAT2INT=2590, // terminal\nENC_UNALLOCATED_72_BRANCH_REG=2591, // terminal\nENC_UNALLOCATED_72_FLOAT2INT=2592, // terminal\nENC_UNALLOCATED_73_BRANCH_REG=2593, // terminal\nENC_UNALLOCATED_73_FLOAT2INT=2594, // terminal\nENC_UNALLOCATED_73_FLOATDP1=2595, // terminal\nENC_UNALLOCATED_74_ASIMDSAME=2596, // terminal\nENC_UNALLOCATED_74_ASISDLSO=2597, // terminal\nENC_UNALLOCATED_74_ASISDLSOP=2598, // terminal\nENC_UNALLOCATED_74_BRANCH_REG=2599, // terminal\nENC_UNALLOCATED_75_BRANCH_REG=2600, // terminal\nENC_UNALLOCATED_76_ASISDLSO=2601, // terminal\nENC_UNALLOCATED_76_ASISDLSOP=2602, // terminal\nENC_UNALLOCATED_76_FLOAT2INT=2603, // terminal\nENC_UNALLOCATED_77_FLOAT2INT=2604, // terminal\nENC_UNALLOCATED_78_ASISDLSO=2605, // terminal\nENC_UNALLOCATED_78_ASISDLSOP=2606, // terminal\nENC_UNALLOCATED_78_BRANCH_REG=2607, // terminal\nENC_UNALLOCATED_78_FLOAT2INT=2608, // terminal\nENC_UNALLOCATED_79_ASISDLSO=2609, // terminal\nENC_UNALLOCATED_79_ASISDLSOP=2610, // terminal\nENC_UNALLOCATED_79_BRANCH_REG=2611, // terminal\nENC_UNALLOCATED_79_FLOAT2INT=2612, // terminal\nENC_UNALLOCATED_80_BRANCH_REG=2613, // terminal\nENC_UNALLOCATED_80_FLOAT2INT=2614, // terminal\nENC_UNALLOCATED_81_ASIMDSAME=2615, // terminal\nENC_UNALLOCATED_81_ASISDLSO=2616, // terminal\nENC_UNALLOCATED_81_ASISDLSOP=2617, // terminal\nENC_UNALLOCATED_81_BRANCH_REG=2618, // terminal\nENC_UNALLOCATED_82_ASIMDSAME=2619, // terminal\nENC_UNALLOCATED_82_BRANCH_REG=2620, // terminal\nENC_UNALLOCATED_83_BRANCH_REG=2621, // terminal\nENC_UNALLOCATED_85_ASIMDSAME=2622, // terminal\nENC_UNALLOCATED_88_ASIMDMISC=2623, // terminal\nENC_UNALLOCATED_88_ASIMDSAME=2624, // terminal\nENC_UNALLOCATED_91_ASIMDMISC=2625, // terminal\nENC_UNALLOCATED_91_ASIMDSAME=2626, // terminal\nENC_UQADD_ASIMDSAME_ONLY=2627,\nENC_UQADD_ASISDSAME_ONLY=2628,\nENC_UQRSHL_ASIMDSAME_ONLY=2629,\nENC_UQRSHL_ASISDSAME_ONLY=2630,\nENC_UQRSHRN_ASIMDSHF_N=2631,\nENC_UQRSHRN_ASISDSHF_N=2632,\nENC_UQSHL_ASIMDSAME_ONLY=2633,\nENC_UQSHL_ASIMDSHF_R=2634,\nENC_UQSHL_ASISDSAME_ONLY=2635,\nENC_UQSHL_ASISDSHF_R=2636,\nENC_UQSHRN_ASIMDSHF_N=2637,\nENC_UQSHRN_ASISDSHF_N=2638,\nENC_UQSUB_ASIMDSAME_ONLY=2639,\nENC_UQSUB_ASISDSAME_ONLY=2640,\nENC_UQXTN_ASIMDMISC_N=2641,\nENC_UQXTN_ASISDMISC_N=2642,\nENC_URECPE_ASIMDMISC_R=2643,\nENC_URHADD_ASIMDSAME_ONLY=2644,\nENC_URSHL_ASIMDSAME_ONLY=2645,\nENC_URSHL_ASISDSAME_ONLY=2646,\nENC_URSHR_ASIMDSHF_R=2647,\nENC_URSHR_ASISDSHF_R=2648,\nENC_URSQRTE_ASIMDMISC_R=2649,\nENC_URSRA_ASIMDSHF_R=2650,\nENC_URSRA_ASISDSHF_R=2651,\nENC_USDOT_ASIMDELEM_D=2652,\nENC_USDOT_ASIMDSAME2_D=2653,\nENC_USHLL_ASIMDSHF_L=2654,\nENC_USHL_ASIMDSAME_ONLY=2655,\nENC_USHL_ASISDSAME_ONLY=2656,\nENC_USHR_ASIMDSHF_R=2657,\nENC_USHR_ASISDSHF_R=2658,\nENC_USMMLA_ASIMDSAME2_G=2659,\nENC_USQADD_ASIMDMISC_R=2660,\nENC_USQADD_ASISDMISC_R=2661,\nENC_USRA_ASIMDSHF_R=2662,\nENC_USRA_ASISDSHF_R=2663,\nENC_USUBL_ASIMDDIFF_L=2664,\nENC_USUBW_ASIMDDIFF_W=2665,\nENC_UXTB_UBFM_32M_BITFIELD=2666, // alias\nENC_UXTH_UBFM_32M_BITFIELD=2667, // alias\nENC_UXTL_USHLL_ASIMDSHF_L=2668, // alias\nENC_UZP1_ASIMDPERM_ONLY=2669,\nENC_UZP2_ASIMDPERM_ONLY=2670,\nENC_WFET_ONLY_SYSTEMINSTRSWITHREG=2671,\nENC_WFE_HI_HINTS=2672,\nENC_WFIT_ONLY_SYSTEMINSTRSWITHREG=2673,\nENC_WFI_HI_HINTS=2674,\nENC_XAFLAG_M_PSTATE=2675,\nENC_XAR_VVV2_CRYPTO3_IMM6=2676,\nENC_XPACD_64Z_DP_1SRC=2677,\nENC_XPACI_64Z_DP_1SRC=2678,\nENC_XPACLRI_HI_HINTS=2679,\nENC_XTN_ASIMDMISC_N=2680,\nENC_YIELD_HI_HINTS=2681,\nENC_ZIP1_ASIMDPERM_ONLY=2682,\nENC_ZIP2_ASIMDPERM_ONLY=2683,\nENC_ABS_Z_P_Z_=2684,\nENC_ADCLB_Z_ZZZ_=2685,\nENC_ADCLT_Z_ZZZ_=2686,\nENC_ADD_Z_P_ZZ_=2687,\nENC_ADD_Z_ZI_=2688,\nENC_ADD_Z_ZZ_=2689,\nENC_ADDHA_ZA_PP_Z_32=2690,\nENC_ADDHA_ZA_PP_Z_64=2691,\nENC_ADDHNB_Z_ZZ_=2692,\nENC_ADDHNT_Z_ZZ_=2693,\nENC_ADDP_Z_P_ZZ_=2694,\nENC_ADDPL_R_RI_=2695,\nENC_ADDVA_ZA_PP_Z_32=2696,\nENC_ADDVA_ZA_PP_Z_64=2697,\nENC_ADDVL_R_RI_=2698,\nENC_ADR_Z_AZ_D_S32_SCALED=2699,\nENC_ADR_Z_AZ_D_U32_SCALED=2700,\nENC_ADR_Z_AZ_SD_SAME_SCALED=2701,\nENC_AESD_Z_ZZ_=2702,\nENC_AESE_Z_ZZ_=2703,\nENC_AESIMC_Z_Z_=2704,\nENC_AESMC_Z_Z_=2705,\nENC_AND_P_P_PP_Z=2706,\nENC_AND_Z_P_ZZ_=2707,\nENC_AND_Z_ZI_=2708,\nENC_AND_Z_ZZ_=2709,\nENC_ANDS_P_P_PP_Z=2710,\nENC_ANDV_R_P_Z_=2711,\nENC_ASR_Z_P_ZI_=2712,\nENC_ASR_Z_P_ZW_=2713,\nENC_ASR_Z_P_ZZ_=2714,\nENC_ASR_Z_ZI_=2715,\nENC_ASR_Z_ZW_=2716,\nENC_ASRD_Z_P_ZI_=2717,\nENC_ASRR_Z_P_ZZ_=2718,\nENC_BCAX_Z_ZZZ_=2719,\nENC_BDEP_Z_ZZ_=2720,\nENC_BEXT_Z_ZZ_=2721,\nENC_BFCVT_Z_P_Z_S2BF=2722,\nENC_BFCVTNT_Z_P_Z_S2BF=2723,\nENC_BFDOT_Z_ZZZ_=2724,\nENC_BFDOT_Z_ZZZI_=2725,\nENC_BFMLALB_Z_ZZZ_=2726,\nENC_BFMLALB_Z_ZZZI_=2727,\nENC_BFMLALT_Z_ZZZ_=2728,\nENC_BFMLALT_Z_ZZZI_=2729,\nENC_BFMMLA_Z_ZZZ_=2730,\nENC_BFMOPA_ZA32_PP_ZZ_=2731,\nENC_BFMOPS_ZA32_PP_ZZ_=2732,\nENC_BGRP_Z_ZZ_=2733,\nENC_BIC_P_P_PP_Z=2734,\nENC_BIC_Z_P_ZZ_=2735,\nENC_BIC_Z_ZZ_=2736,\nENC_BICS_P_P_PP_Z=2737,\nENC_BRKA_P_P_P_=2738,\nENC_BRKAS_P_P_P_Z=2739,\nENC_BRKB_P_P_P_=2740,\nENC_BRKBS_P_P_P_Z=2741,\nENC_BRKN_P_P_PP_=2742,\nENC_BRKNS_P_P_PP_=2743,\nENC_BRKPA_P_P_PP_=2744,\nENC_BRKPAS_P_P_PP_=2745,\nENC_BRKPB_P_P_PP_=2746,\nENC_BRKPBS_P_P_PP_=2747,\nENC_BSL1N_Z_ZZZ_=2748,\nENC_BSL2N_Z_ZZZ_=2749,\nENC_BSL_Z_ZZZ_=2750,\nENC_CADD_Z_ZZ_=2751,\nENC_CDOT_Z_ZZZ_=2752,\nENC_CDOT_Z_ZZZI_D=2753,\nENC_CDOT_Z_ZZZI_S=2754,\nENC_CLASTA_R_P_Z_=2755,\nENC_CLASTA_V_P_Z_=2756,\nENC_CLASTA_Z_P_ZZ_=2757,\nENC_CLASTB_R_P_Z_=2758,\nENC_CLASTB_V_P_Z_=2759,\nENC_CLASTB_Z_P_ZZ_=2760,\nENC_CLS_Z_P_Z_=2761,\nENC_CLZ_Z_P_Z_=2762,\nENC_CMLA_Z_ZZZ_=2763,\nENC_CMLA_Z_ZZZI_H=2764,\nENC_CMLA_Z_ZZZI_S=2765,\nENC_CMPEQ_P_P_ZI_=2766,\nENC_CMPEQ_P_P_ZW_=2767,\nENC_CMPEQ_P_P_ZZ_=2768,\nENC_CMPGE_P_P_ZI_=2769,\nENC_CMPGE_P_P_ZW_=2770,\nENC_CMPGE_P_P_ZZ_=2771,\nENC_CMPGT_P_P_ZI_=2772,\nENC_CMPGT_P_P_ZW_=2773,\nENC_CMPGT_P_P_ZZ_=2774,\nENC_CMPHI_P_P_ZI_=2775,\nENC_CMPHI_P_P_ZW_=2776,\nENC_CMPHI_P_P_ZZ_=2777,\nENC_CMPHS_P_P_ZI_=2778,\nENC_CMPHS_P_P_ZW_=2779,\nENC_CMPHS_P_P_ZZ_=2780,\nENC_CMPLE_P_P_ZI_=2781,\nENC_CMPLE_P_P_ZW_=2782,\nENC_CMPLO_P_P_ZI_=2783,\nENC_CMPLO_P_P_ZW_=2784,\nENC_CMPLS_P_P_ZI_=2785,\nENC_CMPLS_P_P_ZW_=2786,\nENC_CMPLT_P_P_ZI_=2787,\nENC_CMPLT_P_P_ZW_=2788,\nENC_CMPNE_P_P_ZI_=2789,\nENC_CMPNE_P_P_ZW_=2790,\nENC_CMPNE_P_P_ZZ_=2791,\nENC_CNOT_Z_P_Z_=2792,\nENC_CNT_Z_P_Z_=2793,\nENC_CNTB_R_S_=2794,\nENC_CNTD_R_S_=2795,\nENC_CNTH_R_S_=2796,\nENC_CNTP_R_P_P_=2797,\nENC_CNTW_R_S_=2798,\nENC_COMPACT_Z_P_Z_=2799,\nENC_CPY_Z_O_I_=2800,\nENC_CPY_Z_P_I_=2801,\nENC_CPY_Z_P_R_=2802,\nENC_CPY_Z_P_V_=2803,\nENC_CTERMEQ_RR_=2804,\nENC_CTERMNE_RR_=2805,\nENC_DECB_R_RS_=2806,\nENC_DECD_R_RS_=2807,\nENC_DECD_Z_ZS_=2808,\nENC_DECH_R_RS_=2809,\nENC_DECH_Z_ZS_=2810,\nENC_DECP_R_P_R_=2811,\nENC_DECP_Z_P_Z_=2812,\nENC_DECW_R_RS_=2813,\nENC_DECW_Z_ZS_=2814,\nENC_DUP_P_P_PI_=2815,\nENC_DUP_Z_I_=2816,\nENC_DUP_Z_R_=2817,\nENC_DUP_Z_ZI_=2818,\nENC_DUPM_Z_I_=2819,\nENC_EOR3_Z_ZZZ_=2820,\nENC_EOR_P_P_PP_Z=2821,\nENC_EOR_Z_P_ZZ_=2822,\nENC_EOR_Z_ZI_=2823,\nENC_EOR_Z_ZZ_=2824,\nENC_EORBT_Z_ZZ_=2825,\nENC_EORS_P_P_PP_Z=2826,\nENC_EORTB_Z_ZZ_=2827,\nENC_EORV_R_P_Z_=2828,\nENC_EXT_Z_ZI_CON=2829,\nENC_EXT_Z_ZI_DES=2830,\nENC_FABD_Z_P_ZZ_=2831,\nENC_FABS_Z_P_Z_=2832,\nENC_FACGE_P_P_ZZ_=2833,\nENC_FACGT_P_P_ZZ_=2834,\nENC_FADD_Z_P_ZS_=2835,\nENC_FADD_Z_P_ZZ_=2836,\nENC_FADD_Z_ZZ_=2837,\nENC_FADDA_V_P_Z_=2838,\nENC_FADDP_Z_P_ZZ_=2839,\nENC_FADDV_V_P_Z_=2840,\nENC_FCADD_Z_P_ZZ_=2841,\nENC_FCMEQ_P_P_Z0_=2842,\nENC_FCMEQ_P_P_ZZ_=2843,\nENC_FCMGE_P_P_Z0_=2844,\nENC_FCMGE_P_P_ZZ_=2845,\nENC_FCMGT_P_P_Z0_=2846,\nENC_FCMGT_P_P_ZZ_=2847,\nENC_FCMLA_Z_P_ZZZ_=2848,\nENC_FCMLA_Z_ZZZI_H=2849,\nENC_FCMLA_Z_ZZZI_S=2850,\nENC_FCMLE_P_P_Z0_=2851,\nENC_FCMLT_P_P_Z0_=2852,\nENC_FCMNE_P_P_Z0_=2853,\nENC_FCMNE_P_P_ZZ_=2854,\nENC_FCMUO_P_P_ZZ_=2855,\nENC_FCPY_Z_P_I_=2856,\nENC_FCVT_Z_P_Z_D2H=2857,\nENC_FCVT_Z_P_Z_D2S=2858,\nENC_FCVT_Z_P_Z_H2D=2859,\nENC_FCVT_Z_P_Z_H2S=2860,\nENC_FCVT_Z_P_Z_S2D=2861,\nENC_FCVT_Z_P_Z_S2H=2862,\nENC_FCVTLT_Z_P_Z_H2S=2863,\nENC_FCVTLT_Z_P_Z_S2D=2864,\nENC_FCVTNT_Z_P_Z_D2S=2865,\nENC_FCVTNT_Z_P_Z_S2H=2866,\nENC_FCVTX_Z_P_Z_D2S=2867,\nENC_FCVTXNT_Z_P_Z_D2S=2868,\nENC_FCVTZS_Z_P_Z_D2W=2869,\nENC_FCVTZS_Z_P_Z_D2X=2870,\nENC_FCVTZS_Z_P_Z_FP162H=2871,\nENC_FCVTZS_Z_P_Z_FP162W=2872,\nENC_FCVTZS_Z_P_Z_FP162X=2873,\nENC_FCVTZS_Z_P_Z_S2W=2874,\nENC_FCVTZS_Z_P_Z_S2X=2875,\nENC_FCVTZU_Z_P_Z_D2W=2876,\nENC_FCVTZU_Z_P_Z_D2X=2877,\nENC_FCVTZU_Z_P_Z_FP162H=2878,\nENC_FCVTZU_Z_P_Z_FP162W=2879,\nENC_FCVTZU_Z_P_Z_FP162X=2880,\nENC_FCVTZU_Z_P_Z_S2W=2881,\nENC_FCVTZU_Z_P_Z_S2X=2882,\nENC_FDIV_Z_P_ZZ_=2883,\nENC_FDIVR_Z_P_ZZ_=2884,\nENC_FDUP_Z_I_=2885,\nENC_FEXPA_Z_Z_=2886,\nENC_FLOGB_Z_P_Z_=2887,\nENC_FMAD_Z_P_ZZZ_=2888,\nENC_FMAX_Z_P_ZS_=2889,\nENC_FMAX_Z_P_ZZ_=2890,\nENC_FMAXNM_Z_P_ZS_=2891,\nENC_FMAXNM_Z_P_ZZ_=2892,\nENC_FMAXNMP_Z_P_ZZ_=2893,\nENC_FMAXNMV_V_P_Z_=2894,\nENC_FMAXP_Z_P_ZZ_=2895,\nENC_FMAXV_V_P_Z_=2896,\nENC_FMIN_Z_P_ZS_=2897,\nENC_FMIN_Z_P_ZZ_=2898,\nENC_FMINNM_Z_P_ZS_=2899,\nENC_FMINNM_Z_P_ZZ_=2900,\nENC_FMINNMP_Z_P_ZZ_=2901,\nENC_FMINNMV_V_P_Z_=2902,\nENC_FMINP_Z_P_ZZ_=2903,\nENC_FMINV_V_P_Z_=2904,\nENC_FMLA_Z_P_ZZZ_=2905,\nENC_FMLA_Z_ZZZI_D=2906,\nENC_FMLA_Z_ZZZI_H=2907,\nENC_FMLA_Z_ZZZI_S=2908,\nENC_FMLALB_Z_ZZZ_=2909,\nENC_FMLALB_Z_ZZZI_S=2910,\nENC_FMLALT_Z_ZZZ_=2911,\nENC_FMLALT_Z_ZZZI_S=2912,\nENC_FMLS_Z_P_ZZZ_=2913,\nENC_FMLS_Z_ZZZI_D=2914,\nENC_FMLS_Z_ZZZI_H=2915,\nENC_FMLS_Z_ZZZI_S=2916,\nENC_FMLSLB_Z_ZZZ_=2917,\nENC_FMLSLB_Z_ZZZI_S=2918,\nENC_FMLSLT_Z_ZZZ_=2919,\nENC_FMLSLT_Z_ZZZI_S=2920,\nENC_FMMLA_Z_ZZZ_D=2921,\nENC_FMMLA_Z_ZZZ_S=2922,\nENC_FMOPA_ZA32_PP_ZZ_16=2923,\nENC_FMOPA_ZA_PP_ZZ_32=2924,\nENC_FMOPA_ZA_PP_ZZ_64=2925,\nENC_FMOPS_ZA32_PP_ZZ_16=2926,\nENC_FMOPS_ZA_PP_ZZ_32=2927,\nENC_FMOPS_ZA_PP_ZZ_64=2928,\nENC_FMSB_Z_P_ZZZ_=2929,\nENC_FMUL_Z_P_ZS_=2930,\nENC_FMUL_Z_P_ZZ_=2931,\nENC_FMUL_Z_ZZ_=2932,\nENC_FMUL_Z_ZZI_D=2933,\nENC_FMUL_Z_ZZI_H=2934,\nENC_FMUL_Z_ZZI_S=2935,\nENC_FMULX_Z_P_ZZ_=2936,\nENC_FNEG_Z_P_Z_=2937,\nENC_FNMAD_Z_P_ZZZ_=2938,\nENC_FNMLA_Z_P_ZZZ_=2939,\nENC_FNMLS_Z_P_ZZZ_=2940,\nENC_FNMSB_Z_P_ZZZ_=2941,\nENC_FRECPE_Z_Z_=2942,\nENC_FRECPS_Z_ZZ_=2943,\nENC_FRECPX_Z_P_Z_=2944,\nENC_FRINTA_Z_P_Z_=2945,\nENC_FRINTI_Z_P_Z_=2946,\nENC_FRINTM_Z_P_Z_=2947,\nENC_FRINTN_Z_P_Z_=2948,\nENC_FRINTP_Z_P_Z_=2949,\nENC_FRINTX_Z_P_Z_=2950,\nENC_FRINTZ_Z_P_Z_=2951,\nENC_FRSQRTE_Z_Z_=2952,\nENC_FRSQRTS_Z_ZZ_=2953,\nENC_FSCALE_Z_P_ZZ_=2954,\nENC_FSQRT_Z_P_Z_=2955,\nENC_FSUB_Z_P_ZS_=2956,\nENC_FSUB_Z_P_ZZ_=2957,\nENC_FSUB_Z_ZZ_=2958,\nENC_FSUBR_Z_P_ZS_=2959,\nENC_FSUBR_Z_P_ZZ_=2960,\nENC_FTMAD_Z_ZZI_=2961,\nENC_FTSMUL_Z_ZZ_=2962,\nENC_FTSSEL_Z_ZZ_=2963,\nENC_HISTCNT_Z_P_ZZ_=2964,\nENC_HISTSEG_Z_ZZ_=2965,\nENC_INCB_R_RS_=2966,\nENC_INCD_R_RS_=2967,\nENC_INCD_Z_ZS_=2968,\nENC_INCH_R_RS_=2969,\nENC_INCH_Z_ZS_=2970,\nENC_INCP_R_P_R_=2971,\nENC_INCP_Z_P_Z_=2972,\nENC_INCW_R_RS_=2973,\nENC_INCW_Z_ZS_=2974,\nENC_INDEX_Z_II_=2975,\nENC_INDEX_Z_IR_=2976,\nENC_INDEX_Z_RI_=2977,\nENC_INDEX_Z_RR_=2978,\nENC_INSR_Z_R_=2979,\nENC_INSR_Z_V_=2980,\nENC_LASTA_R_P_Z_=2981,\nENC_LASTA_V_P_Z_=2982,\nENC_LASTB_R_P_Z_=2983,\nENC_LASTB_V_P_Z_=2984,\nENC_LD1B_Z_P_AI_D=2985,\nENC_LD1B_Z_P_AI_S=2986,\nENC_LD1B_Z_P_BI_U16=2987,\nENC_LD1B_Z_P_BI_U32=2988,\nENC_LD1B_Z_P_BI_U64=2989,\nENC_LD1B_Z_P_BI_U8=2990,\nENC_LD1B_Z_P_BR_U16=2991,\nENC_LD1B_Z_P_BR_U32=2992,\nENC_LD1B_Z_P_BR_U64=2993,\nENC_LD1B_Z_P_BR_U8=2994,\nENC_LD1B_Z_P_BZ_D_64_UNSCALED=2995,\nENC_LD1B_Z_P_BZ_D_X32_UNSCALED=2996,\nENC_LD1B_Z_P_BZ_S_X32_UNSCALED=2997,\nENC_LD1B_ZA_P_RRR_=2998,\nENC_LD1D_Z_P_AI_D=2999,\nENC_LD1D_Z_P_BI_U64=3000,\nENC_LD1D_Z_P_BR_U64=3001,\nENC_LD1D_Z_P_BZ_D_64_SCALED=3002,\nENC_LD1D_Z_P_BZ_D_64_UNSCALED=3003,\nENC_LD1D_Z_P_BZ_D_X32_SCALED=3004,\nENC_LD1D_Z_P_BZ_D_X32_UNSCALED=3005,\nENC_LD1D_ZA_P_RRR_=3006,\nENC_LD1H_Z_P_AI_D=3007,\nENC_LD1H_Z_P_AI_S=3008,\nENC_LD1H_Z_P_BI_U16=3009,\nENC_LD1H_Z_P_BI_U32=3010,\nENC_LD1H_Z_P_BI_U64=3011,\nENC_LD1H_Z_P_BR_U16=3012,\nENC_LD1H_Z_P_BR_U32=3013,\nENC_LD1H_Z_P_BR_U64=3014,\nENC_LD1H_Z_P_BZ_D_64_SCALED=3015,\nENC_LD1H_Z_P_BZ_D_64_UNSCALED=3016,\nENC_LD1H_Z_P_BZ_D_X32_SCALED=3017,\nENC_LD1H_Z_P_BZ_D_X32_UNSCALED=3018,\nENC_LD1H_Z_P_BZ_S_X32_SCALED=3019,\nENC_LD1H_Z_P_BZ_S_X32_UNSCALED=3020,\nENC_LD1H_ZA_P_RRR_=3021,\nENC_LD1Q_ZA_P_RRR_=3022,\nENC_LD1RB_Z_P_BI_U16=3023,\nENC_LD1RB_Z_P_BI_U32=3024,\nENC_LD1RB_Z_P_BI_U64=3025,\nENC_LD1RB_Z_P_BI_U8=3026,\nENC_LD1RD_Z_P_BI_U64=3027,\nENC_LD1RH_Z_P_BI_U16=3028,\nENC_LD1RH_Z_P_BI_U32=3029,\nENC_LD1RH_Z_P_BI_U64=3030,\nENC_LD1ROB_Z_P_BI_U8=3031,\nENC_LD1ROB_Z_P_BR_CONTIGUOUS=3032,\nENC_LD1ROD_Z_P_BI_U64=3033,\nENC_LD1ROD_Z_P_BR_CONTIGUOUS=3034,\nENC_LD1ROH_Z_P_BI_U16=3035,\nENC_LD1ROH_Z_P_BR_CONTIGUOUS=3036,\nENC_LD1ROW_Z_P_BI_U32=3037,\nENC_LD1ROW_Z_P_BR_CONTIGUOUS=3038,\nENC_LD1RQB_Z_P_BI_U8=3039,\nENC_LD1RQB_Z_P_BR_CONTIGUOUS=3040,\nENC_LD1RQD_Z_P_BI_U64=3041,\nENC_LD1RQD_Z_P_BR_CONTIGUOUS=3042,\nENC_LD1RQH_Z_P_BI_U16=3043,\nENC_LD1RQH_Z_P_BR_CONTIGUOUS=3044,\nENC_LD1RQW_Z_P_BI_U32=3045,\nENC_LD1RQW_Z_P_BR_CONTIGUOUS=3046,\nENC_LD1RSB_Z_P_BI_S16=3047,\nENC_LD1RSB_Z_P_BI_S32=3048,\nENC_LD1RSB_Z_P_BI_S64=3049,\nENC_LD1RSH_Z_P_BI_S32=3050,\nENC_LD1RSH_Z_P_BI_S64=3051,\nENC_LD1RSW_Z_P_BI_S64=3052,\nENC_LD1RW_Z_P_BI_U32=3053,\nENC_LD1RW_Z_P_BI_U64=3054,\nENC_LD1SB_Z_P_AI_D=3055,\nENC_LD1SB_Z_P_AI_S=3056,\nENC_LD1SB_Z_P_BI_S16=3057,\nENC_LD1SB_Z_P_BI_S32=3058,\nENC_LD1SB_Z_P_BI_S64=3059,\nENC_LD1SB_Z_P_BR_S16=3060,\nENC_LD1SB_Z_P_BR_S32=3061,\nENC_LD1SB_Z_P_BR_S64=3062,\nENC_LD1SB_Z_P_BZ_D_64_UNSCALED=3063,\nENC_LD1SB_Z_P_BZ_D_X32_UNSCALED=3064,\nENC_LD1SB_Z_P_BZ_S_X32_UNSCALED=3065,\nENC_LD1SH_Z_P_AI_D=3066,\nENC_LD1SH_Z_P_AI_S=3067,\nENC_LD1SH_Z_P_BI_S32=3068,\nENC_LD1SH_Z_P_BI_S64=3069,\nENC_LD1SH_Z_P_BR_S32=3070,\nENC_LD1SH_Z_P_BR_S64=3071,\nENC_LD1SH_Z_P_BZ_D_64_SCALED=3072,\nENC_LD1SH_Z_P_BZ_D_64_UNSCALED=3073,\nENC_LD1SH_Z_P_BZ_D_X32_SCALED=3074,\nENC_LD1SH_Z_P_BZ_D_X32_UNSCALED=3075,\nENC_LD1SH_Z_P_BZ_S_X32_SCALED=3076,\nENC_LD1SH_Z_P_BZ_S_X32_UNSCALED=3077,\nENC_LD1SW_Z_P_AI_D=3078,\nENC_LD1SW_Z_P_BI_S64=3079,\nENC_LD1SW_Z_P_BR_S64=3080,\nENC_LD1SW_Z_P_BZ_D_64_SCALED=3081,\nENC_LD1SW_Z_P_BZ_D_64_UNSCALED=3082,\nENC_LD1SW_Z_P_BZ_D_X32_SCALED=3083,\nENC_LD1SW_Z_P_BZ_D_X32_UNSCALED=3084,\nENC_LD1W_Z_P_AI_D=3085,\nENC_LD1W_Z_P_AI_S=3086,\nENC_LD1W_Z_P_BI_U32=3087,\nENC_LD1W_Z_P_BI_U64=3088,\nENC_LD1W_Z_P_BR_U32=3089,\nENC_LD1W_Z_P_BR_U64=3090,\nENC_LD1W_Z_P_BZ_D_64_SCALED=3091,\nENC_LD1W_Z_P_BZ_D_64_UNSCALED=3092,\nENC_LD1W_Z_P_BZ_D_X32_SCALED=3093,\nENC_LD1W_Z_P_BZ_D_X32_UNSCALED=3094,\nENC_LD1W_Z_P_BZ_S_X32_SCALED=3095,\nENC_LD1W_Z_P_BZ_S_X32_UNSCALED=3096,\nENC_LD1W_ZA_P_RRR_=3097,\nENC_LD2B_Z_P_BI_CONTIGUOUS=3098,\nENC_LD2B_Z_P_BR_CONTIGUOUS=3099,\nENC_LD2D_Z_P_BI_CONTIGUOUS=3100,\nENC_LD2D_Z_P_BR_CONTIGUOUS=3101,\nENC_LD2H_Z_P_BI_CONTIGUOUS=3102,\nENC_LD2H_Z_P_BR_CONTIGUOUS=3103,\nENC_LD2W_Z_P_BI_CONTIGUOUS=3104,\nENC_LD2W_Z_P_BR_CONTIGUOUS=3105,\nENC_LD3B_Z_P_BI_CONTIGUOUS=3106,\nENC_LD3B_Z_P_BR_CONTIGUOUS=3107,\nENC_LD3D_Z_P_BI_CONTIGUOUS=3108,\nENC_LD3D_Z_P_BR_CONTIGUOUS=3109,\nENC_LD3H_Z_P_BI_CONTIGUOUS=3110,\nENC_LD3H_Z_P_BR_CONTIGUOUS=3111,\nENC_LD3W_Z_P_BI_CONTIGUOUS=3112,\nENC_LD3W_Z_P_BR_CONTIGUOUS=3113,\nENC_LD4B_Z_P_BI_CONTIGUOUS=3114,\nENC_LD4B_Z_P_BR_CONTIGUOUS=3115,\nENC_LD4D_Z_P_BI_CONTIGUOUS=3116,\nENC_LD4D_Z_P_BR_CONTIGUOUS=3117,\nENC_LD4H_Z_P_BI_CONTIGUOUS=3118,\nENC_LD4H_Z_P_BR_CONTIGUOUS=3119,\nENC_LD4W_Z_P_BI_CONTIGUOUS=3120,\nENC_LD4W_Z_P_BR_CONTIGUOUS=3121,\nENC_LDFF1B_Z_P_AI_D=3122,\nENC_LDFF1B_Z_P_AI_S=3123,\nENC_LDFF1B_Z_P_BR_U16=3124,\nENC_LDFF1B_Z_P_BR_U32=3125,\nENC_LDFF1B_Z_P_BR_U64=3126,\nENC_LDFF1B_Z_P_BR_U8=3127,\nENC_LDFF1B_Z_P_BZ_D_64_UNSCALED=3128,\nENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED=3129,\nENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED=3130,\nENC_LDFF1D_Z_P_AI_D=3131,\nENC_LDFF1D_Z_P_BR_U64=3132,\nENC_LDFF1D_Z_P_BZ_D_64_SCALED=3133,\nENC_LDFF1D_Z_P_BZ_D_64_UNSCALED=3134,\nENC_LDFF1D_Z_P_BZ_D_X32_SCALED=3135,\nENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED=3136,\nENC_LDFF1H_Z_P_AI_D=3137,\nENC_LDFF1H_Z_P_AI_S=3138,\nENC_LDFF1H_Z_P_BR_U16=3139,\nENC_LDFF1H_Z_P_BR_U32=3140,\nENC_LDFF1H_Z_P_BR_U64=3141,\nENC_LDFF1H_Z_P_BZ_D_64_SCALED=3142,\nENC_LDFF1H_Z_P_BZ_D_64_UNSCALED=3143,\nENC_LDFF1H_Z_P_BZ_D_X32_SCALED=3144,\nENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED=3145,\nENC_LDFF1H_Z_P_BZ_S_X32_SCALED=3146,\nENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED=3147,\nENC_LDFF1SB_Z_P_AI_D=3148,\nENC_LDFF1SB_Z_P_AI_S=3149,\nENC_LDFF1SB_Z_P_BR_S16=3150,\nENC_LDFF1SB_Z_P_BR_S32=3151,\nENC_LDFF1SB_Z_P_BR_S64=3152,\nENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED=3153,\nENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED=3154,\nENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED=3155,\nENC_LDFF1SH_Z_P_AI_D=3156,\nENC_LDFF1SH_Z_P_AI_S=3157,\nENC_LDFF1SH_Z_P_BR_S32=3158,\nENC_LDFF1SH_Z_P_BR_S64=3159,\nENC_LDFF1SH_Z_P_BZ_D_64_SCALED=3160,\nENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED=3161,\nENC_LDFF1SH_Z_P_BZ_D_X32_SCALED=3162,\nENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED=3163,\nENC_LDFF1SH_Z_P_BZ_S_X32_SCALED=3164,\nENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED=3165,\nENC_LDFF1SW_Z_P_AI_D=3166,\nENC_LDFF1SW_Z_P_BR_S64=3167,\nENC_LDFF1SW_Z_P_BZ_D_64_SCALED=3168,\nENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED=3169,\nENC_LDFF1SW_Z_P_BZ_D_X32_SCALED=3170,\nENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED=3171,\nENC_LDFF1W_Z_P_AI_D=3172,\nENC_LDFF1W_Z_P_AI_S=3173,\nENC_LDFF1W_Z_P_BR_U32=3174,\nENC_LDFF1W_Z_P_BR_U64=3175,\nENC_LDFF1W_Z_P_BZ_D_64_SCALED=3176,\nENC_LDFF1W_Z_P_BZ_D_64_UNSCALED=3177,\nENC_LDFF1W_Z_P_BZ_D_X32_SCALED=3178,\nENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED=3179,\nENC_LDFF1W_Z_P_BZ_S_X32_SCALED=3180,\nENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED=3181,\nENC_LDNF1B_Z_P_BI_U16=3182,\nENC_LDNF1B_Z_P_BI_U32=3183,\nENC_LDNF1B_Z_P_BI_U64=3184,\nENC_LDNF1B_Z_P_BI_U8=3185,\nENC_LDNF1D_Z_P_BI_U64=3186,\nENC_LDNF1H_Z_P_BI_U16=3187,\nENC_LDNF1H_Z_P_BI_U32=3188,\nENC_LDNF1H_Z_P_BI_U64=3189,\nENC_LDNF1SB_Z_P_BI_S16=3190,\nENC_LDNF1SB_Z_P_BI_S32=3191,\nENC_LDNF1SB_Z_P_BI_S64=3192,\nENC_LDNF1SH_Z_P_BI_S32=3193,\nENC_LDNF1SH_Z_P_BI_S64=3194,\nENC_LDNF1SW_Z_P_BI_S64=3195,\nENC_LDNF1W_Z_P_BI_U32=3196,\nENC_LDNF1W_Z_P_BI_U64=3197,\nENC_LDNT1B_Z_P_AR_D_64_UNSCALED=3198,\nENC_LDNT1B_Z_P_AR_S_X32_UNSCALED=3199,\nENC_LDNT1B_Z_P_BI_CONTIGUOUS=3200,\nENC_LDNT1B_Z_P_BR_CONTIGUOUS=3201,\nENC_LDNT1D_Z_P_AR_D_64_UNSCALED=3202,\nENC_LDNT1D_Z_P_BI_CONTIGUOUS=3203,\nENC_LDNT1D_Z_P_BR_CONTIGUOUS=3204,\nENC_LDNT1H_Z_P_AR_D_64_UNSCALED=3205,\nENC_LDNT1H_Z_P_AR_S_X32_UNSCALED=3206,\nENC_LDNT1H_Z_P_BI_CONTIGUOUS=3207,\nENC_LDNT1H_Z_P_BR_CONTIGUOUS=3208,\nENC_LDNT1SB_Z_P_AR_D_64_UNSCALED=3209,\nENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED=3210,\nENC_LDNT1SH_Z_P_AR_D_64_UNSCALED=3211,\nENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED=3212,\nENC_LDNT1SW_Z_P_AR_D_64_UNSCALED=3213,\nENC_LDNT1W_Z_P_AR_D_64_UNSCALED=3214,\nENC_LDNT1W_Z_P_AR_S_X32_UNSCALED=3215,\nENC_LDNT1W_Z_P_BI_CONTIGUOUS=3216,\nENC_LDNT1W_Z_P_BR_CONTIGUOUS=3217,\nENC_LDR_P_BI_=3218,\nENC_LDR_Z_BI_=3219,\nENC_LDR_ZA_RI_=3220,\nENC_LSL_Z_P_ZI_=3221,\nENC_LSL_Z_P_ZW_=3222,\nENC_LSL_Z_P_ZZ_=3223,\nENC_LSL_Z_ZI_=3224,\nENC_LSL_Z_ZW_=3225,\nENC_LSLR_Z_P_ZZ_=3226,\nENC_LSR_Z_P_ZI_=3227,\nENC_LSR_Z_P_ZW_=3228,\nENC_LSR_Z_P_ZZ_=3229,\nENC_LSR_Z_ZI_=3230,\nENC_LSR_Z_ZW_=3231,\nENC_LSRR_Z_P_ZZ_=3232,\nENC_MAD_Z_P_ZZZ_=3233,\nENC_MATCH_P_P_ZZ_=3234,\nENC_MLA_Z_P_ZZZ_=3235,\nENC_MLA_Z_ZZZI_D=3236,\nENC_MLA_Z_ZZZI_H=3237,\nENC_MLA_Z_ZZZI_S=3238,\nENC_MLS_Z_P_ZZZ_=3239,\nENC_MLS_Z_ZZZI_D=3240,\nENC_MLS_Z_ZZZI_H=3241,\nENC_MLS_Z_ZZZI_S=3242,\nENC_MOVA_Z_P_RZA_B=3243,\nENC_MOVA_Z_P_RZA_D=3244,\nENC_MOVA_Z_P_RZA_H=3245,\nENC_MOVA_Z_P_RZA_Q=3246,\nENC_MOVA_Z_P_RZA_W=3247,\nENC_MOVA_ZA_P_RZ_B=3248,\nENC_MOVA_ZA_P_RZ_D=3249,\nENC_MOVA_ZA_P_RZ_H=3250,\nENC_MOVA_ZA_P_RZ_Q=3251,\nENC_MOVA_ZA_P_RZ_W=3252,\nENC_MOVPRFX_Z_P_Z_=3253,\nENC_MOVPRFX_Z_Z_=3254,\nENC_MSB_Z_P_ZZZ_=3255,\nENC_MUL_Z_P_ZZ_=3256,\nENC_MUL_Z_ZI_=3257,\nENC_MUL_Z_ZZ_=3258,\nENC_MUL_Z_ZZI_D=3259,\nENC_MUL_Z_ZZI_H=3260,\nENC_MUL_Z_ZZI_S=3261,\nENC_NAND_P_P_PP_Z=3262,\nENC_NANDS_P_P_PP_Z=3263,\nENC_NBSL_Z_ZZZ_=3264,\nENC_NEG_Z_P_Z_=3265,\nENC_NMATCH_P_P_ZZ_=3266,\nENC_NOR_P_P_PP_Z=3267,\nENC_NORS_P_P_PP_Z=3268,\nENC_NOT_Z_P_Z_=3269,\nENC_ORN_P_P_PP_Z=3270,\nENC_ORNS_P_P_PP_Z=3271,\nENC_ORR_P_P_PP_Z=3272,\nENC_ORR_Z_P_ZZ_=3273,\nENC_ORR_Z_ZI_=3274,\nENC_ORR_Z_ZZ_=3275,\nENC_ORRS_P_P_PP_Z=3276,\nENC_ORV_R_P_Z_=3277,\nENC_PFALSE_P_=3278,\nENC_PFIRST_P_P_P_=3279,\nENC_PMUL_Z_ZZ_=3280,\nENC_PMULLB_Z_ZZ_=3281,\nENC_PMULLT_Z_ZZ_=3282,\nENC_PNEXT_P_P_P_=3283,\nENC_PRFB_I_P_AI_D=3284,\nENC_PRFB_I_P_AI_S=3285,\nENC_PRFB_I_P_BI_S=3286,\nENC_PRFB_I_P_BR_S=3287,\nENC_PRFB_I_P_BZ_D_64_SCALED=3288,\nENC_PRFB_I_P_BZ_D_X32_SCALED=3289,\nENC_PRFB_I_P_BZ_S_X32_SCALED=3290,\nENC_PRFD_I_P_AI_D=3291,\nENC_PRFD_I_P_AI_S=3292,\nENC_PRFD_I_P_BI_S=3293,\nENC_PRFD_I_P_BR_S=3294,\nENC_PRFD_I_P_BZ_D_64_SCALED=3295,\nENC_PRFD_I_P_BZ_D_X32_SCALED=3296,\nENC_PRFD_I_P_BZ_S_X32_SCALED=3297,\nENC_PRFH_I_P_AI_D=3298,\nENC_PRFH_I_P_AI_S=3299,\nENC_PRFH_I_P_BI_S=3300,\nENC_PRFH_I_P_BR_S=3301,\nENC_PRFH_I_P_BZ_D_64_SCALED=3302,\nENC_PRFH_I_P_BZ_D_X32_SCALED=3303,\nENC_PRFH_I_P_BZ_S_X32_SCALED=3304,\nENC_PRFW_I_P_AI_D=3305,\nENC_PRFW_I_P_AI_S=3306,\nENC_PRFW_I_P_BI_S=3307,\nENC_PRFW_I_P_BR_S=3308,\nENC_PRFW_I_P_BZ_D_64_SCALED=3309,\nENC_PRFW_I_P_BZ_D_X32_SCALED=3310,\nENC_PRFW_I_P_BZ_S_X32_SCALED=3311,\nENC_PTEST_P_P_=3312,\nENC_PTRUE_P_S_=3313,\nENC_PTRUES_P_S_=3314,\nENC_PUNPKHI_P_P_=3315,\nENC_PUNPKLO_P_P_=3316,\nENC_RADDHNB_Z_ZZ_=3317,\nENC_RADDHNT_Z_ZZ_=3318,\nENC_RAX1_Z_ZZ_=3319,\nENC_RBIT_Z_P_Z_=3320,\nENC_RDFFR_P_F_=3321,\nENC_RDFFR_P_P_F_=3322,\nENC_RDFFRS_P_P_F_=3323,\nENC_RDVL_R_I_=3324,\nENC_REV_P_P_=3325,\nENC_REV_Z_Z_=3326,\nENC_REVB_Z_Z_=3327,\nENC_REVD_Z_P_Z_=3328,\nENC_REVH_Z_Z_=3329,\nENC_REVW_Z_Z_=3330,\nENC_RSHRNB_Z_ZI_=3331,\nENC_RSHRNT_Z_ZI_=3332,\nENC_RSUBHNB_Z_ZZ_=3333,\nENC_RSUBHNT_Z_ZZ_=3334,\nENC_SABA_Z_ZZZ_=3335,\nENC_SABALB_Z_ZZZ_=3336,\nENC_SABALT_Z_ZZZ_=3337,\nENC_SABD_Z_P_ZZ_=3338,\nENC_SABDLB_Z_ZZ_=3339,\nENC_SABDLT_Z_ZZ_=3340,\nENC_SADALP_Z_P_Z_=3341,\nENC_SADDLB_Z_ZZ_=3342,\nENC_SADDLBT_Z_ZZ_=3343,\nENC_SADDLT_Z_ZZ_=3344,\nENC_SADDV_R_P_Z_=3345,\nENC_SADDWB_Z_ZZ_=3346,\nENC_SADDWT_Z_ZZ_=3347,\nENC_SBCLB_Z_ZZZ_=3348,\nENC_SBCLT_Z_ZZZ_=3349,\nENC_SCLAMP_Z_ZZ_=3350,\nENC_SCVTF_Z_P_Z_H2FP16=3351,\nENC_SCVTF_Z_P_Z_W2D=3352,\nENC_SCVTF_Z_P_Z_W2FP16=3353,\nENC_SCVTF_Z_P_Z_W2S=3354,\nENC_SCVTF_Z_P_Z_X2D=3355,\nENC_SCVTF_Z_P_Z_X2FP16=3356,\nENC_SCVTF_Z_P_Z_X2S=3357,\nENC_SDIV_Z_P_ZZ_=3358,\nENC_SDIVR_Z_P_ZZ_=3359,\nENC_SDOT_Z_ZZZ_=3360,\nENC_SDOT_Z_ZZZI_D=3361,\nENC_SDOT_Z_ZZZI_S=3362,\nENC_SEL_P_P_PP_=3363,\nENC_SEL_Z_P_ZZ_=3364,\nENC_SETFFR_F_=3365,\nENC_SHADD_Z_P_ZZ_=3366,\nENC_SHRNB_Z_ZI_=3367,\nENC_SHRNT_Z_ZI_=3368,\nENC_SHSUB_Z_P_ZZ_=3369,\nENC_SHSUBR_Z_P_ZZ_=3370,\nENC_SLI_Z_ZZI_=3371,\nENC_SM4E_Z_ZZ_=3372,\nENC_SM4EKEY_Z_ZZ_=3373,\nENC_SMAX_Z_P_ZZ_=3374,\nENC_SMAX_Z_ZI_=3375,\nENC_SMAXP_Z_P_ZZ_=3376,\nENC_SMAXV_R_P_Z_=3377,\nENC_SMIN_Z_P_ZZ_=3378,\nENC_SMIN_Z_ZI_=3379,\nENC_SMINP_Z_P_ZZ_=3380,\nENC_SMINV_R_P_Z_=3381,\nENC_SMLALB_Z_ZZZ_=3382,\nENC_SMLALB_Z_ZZZI_D=3383,\nENC_SMLALB_Z_ZZZI_S=3384,\nENC_SMLALT_Z_ZZZ_=3385,\nENC_SMLALT_Z_ZZZI_D=3386,\nENC_SMLALT_Z_ZZZI_S=3387,\nENC_SMLSLB_Z_ZZZ_=3388,\nENC_SMLSLB_Z_ZZZI_D=3389,\nENC_SMLSLB_Z_ZZZI_S=3390,\nENC_SMLSLT_Z_ZZZ_=3391,\nENC_SMLSLT_Z_ZZZI_D=3392,\nENC_SMLSLT_Z_ZZZI_S=3393,\nENC_SMMLA_Z_ZZZ_=3394,\nENC_SMOPA_ZA_PP_ZZ_32=3395,\nENC_SMOPA_ZA_PP_ZZ_64=3396,\nENC_SMOPS_ZA_PP_ZZ_32=3397,\nENC_SMOPS_ZA_PP_ZZ_64=3398,\nENC_SMULH_Z_P_ZZ_=3399,\nENC_SMULH_Z_ZZ_=3400,\nENC_SMULLB_Z_ZZ_=3401,\nENC_SMULLB_Z_ZZI_D=3402,\nENC_SMULLB_Z_ZZI_S=3403,\nENC_SMULLT_Z_ZZ_=3404,\nENC_SMULLT_Z_ZZI_D=3405,\nENC_SMULLT_Z_ZZI_S=3406,\nENC_SPLICE_Z_P_ZZ_CON=3407,\nENC_SPLICE_Z_P_ZZ_DES=3408,\nENC_SQABS_Z_P_Z_=3409,\nENC_SQADD_Z_P_ZZ_=3410,\nENC_SQADD_Z_ZI_=3411,\nENC_SQADD_Z_ZZ_=3412,\nENC_SQCADD_Z_ZZ_=3413,\nENC_SQDECB_R_RS_SX=3414,\nENC_SQDECB_R_RS_X=3415,\nENC_SQDECD_R_RS_SX=3416,\nENC_SQDECD_R_RS_X=3417,\nENC_SQDECD_Z_ZS_=3418,\nENC_SQDECH_R_RS_SX=3419,\nENC_SQDECH_R_RS_X=3420,\nENC_SQDECH_Z_ZS_=3421,\nENC_SQDECP_R_P_R_SX=3422,\nENC_SQDECP_R_P_R_X=3423,\nENC_SQDECP_Z_P_Z_=3424,\nENC_SQDECW_R_RS_SX=3425,\nENC_SQDECW_R_RS_X=3426,\nENC_SQDECW_Z_ZS_=3427,\nENC_SQDMLALB_Z_ZZZ_=3428,\nENC_SQDMLALB_Z_ZZZI_D=3429,\nENC_SQDMLALB_Z_ZZZI_S=3430,\nENC_SQDMLALBT_Z_ZZZ_=3431,\nENC_SQDMLALT_Z_ZZZ_=3432,\nENC_SQDMLALT_Z_ZZZI_D=3433,\nENC_SQDMLALT_Z_ZZZI_S=3434,\nENC_SQDMLSLB_Z_ZZZ_=3435,\nENC_SQDMLSLB_Z_ZZZI_D=3436,\nENC_SQDMLSLB_Z_ZZZI_S=3437,\nENC_SQDMLSLBT_Z_ZZZ_=3438,\nENC_SQDMLSLT_Z_ZZZ_=3439,\nENC_SQDMLSLT_Z_ZZZI_D=3440,\nENC_SQDMLSLT_Z_ZZZI_S=3441,\nENC_SQDMULH_Z_ZZ_=3442,\nENC_SQDMULH_Z_ZZI_D=3443,\nENC_SQDMULH_Z_ZZI_H=3444,\nENC_SQDMULH_Z_ZZI_S=3445,\nENC_SQDMULLB_Z_ZZ_=3446,\nENC_SQDMULLB_Z_ZZI_D=3447,\nENC_SQDMULLB_Z_ZZI_S=3448,\nENC_SQDMULLT_Z_ZZ_=3449,\nENC_SQDMULLT_Z_ZZI_D=3450,\nENC_SQDMULLT_Z_ZZI_S=3451,\nENC_SQINCB_R_RS_SX=3452,\nENC_SQINCB_R_RS_X=3453,\nENC_SQINCD_R_RS_SX=3454,\nENC_SQINCD_R_RS_X=3455,\nENC_SQINCD_Z_ZS_=3456,\nENC_SQINCH_R_RS_SX=3457,\nENC_SQINCH_R_RS_X=3458,\nENC_SQINCH_Z_ZS_=3459,\nENC_SQINCP_R_P_R_SX=3460,\nENC_SQINCP_R_P_R_X=3461,\nENC_SQINCP_Z_P_Z_=3462,\nENC_SQINCW_R_RS_SX=3463,\nENC_SQINCW_R_RS_X=3464,\nENC_SQINCW_Z_ZS_=3465,\nENC_SQNEG_Z_P_Z_=3466,\nENC_SQRDCMLAH_Z_ZZZ_=3467,\nENC_SQRDCMLAH_Z_ZZZI_H=3468,\nENC_SQRDCMLAH_Z_ZZZI_S=3469,\nENC_SQRDMLAH_Z_ZZZ_=3470,\nENC_SQRDMLAH_Z_ZZZI_D=3471,\nENC_SQRDMLAH_Z_ZZZI_H=3472,\nENC_SQRDMLAH_Z_ZZZI_S=3473,\nENC_SQRDMLSH_Z_ZZZ_=3474,\nENC_SQRDMLSH_Z_ZZZI_D=3475,\nENC_SQRDMLSH_Z_ZZZI_H=3476,\nENC_SQRDMLSH_Z_ZZZI_S=3477,\nENC_SQRDMULH_Z_ZZ_=3478,\nENC_SQRDMULH_Z_ZZI_D=3479,\nENC_SQRDMULH_Z_ZZI_H=3480,\nENC_SQRDMULH_Z_ZZI_S=3481,\nENC_SQRSHL_Z_P_ZZ_=3482,\nENC_SQRSHLR_Z_P_ZZ_=3483,\nENC_SQRSHRNB_Z_ZI_=3484,\nENC_SQRSHRNT_Z_ZI_=3485,\nENC_SQRSHRUNB_Z_ZI_=3486,\nENC_SQRSHRUNT_Z_ZI_=3487,\nENC_SQSHL_Z_P_ZI_=3488,\nENC_SQSHL_Z_P_ZZ_=3489,\nENC_SQSHLR_Z_P_ZZ_=3490,\nENC_SQSHLU_Z_P_ZI_=3491,\nENC_SQSHRNB_Z_ZI_=3492,\nENC_SQSHRNT_Z_ZI_=3493,\nENC_SQSHRUNB_Z_ZI_=3494,\nENC_SQSHRUNT_Z_ZI_=3495,\nENC_SQSUB_Z_P_ZZ_=3496,\nENC_SQSUB_Z_ZI_=3497,\nENC_SQSUB_Z_ZZ_=3498,\nENC_SQSUBR_Z_P_ZZ_=3499,\nENC_SQXTNB_Z_ZZ_=3500,\nENC_SQXTNT_Z_ZZ_=3501,\nENC_SQXTUNB_Z_ZZ_=3502,\nENC_SQXTUNT_Z_ZZ_=3503,\nENC_SRHADD_Z_P_ZZ_=3504,\nENC_SRI_Z_ZZI_=3505,\nENC_SRSHL_Z_P_ZZ_=3506,\nENC_SRSHLR_Z_P_ZZ_=3507,\nENC_SRSHR_Z_P_ZI_=3508,\nENC_SRSRA_Z_ZI_=3509,\nENC_SSHLLB_Z_ZI_=3510,\nENC_SSHLLT_Z_ZI_=3511,\nENC_SSRA_Z_ZI_=3512,\nENC_SSUBLB_Z_ZZ_=3513,\nENC_SSUBLBT_Z_ZZ_=3514,\nENC_SSUBLT_Z_ZZ_=3515,\nENC_SSUBLTB_Z_ZZ_=3516,\nENC_SSUBWB_Z_ZZ_=3517,\nENC_SSUBWT_Z_ZZ_=3518,\nENC_ST1B_Z_P_AI_D=3519,\nENC_ST1B_Z_P_AI_S=3520,\nENC_ST1B_Z_P_BI_=3521,\nENC_ST1B_Z_P_BR_=3522,\nENC_ST1B_Z_P_BZ_D_64_UNSCALED=3523,\nENC_ST1B_Z_P_BZ_D_X32_UNSCALED=3524,\nENC_ST1B_Z_P_BZ_S_X32_UNSCALED=3525,\nENC_ST1B_ZA_P_RRR_=3526,\nENC_ST1D_Z_P_AI_D=3527,\nENC_ST1D_Z_P_BI_=3528,\nENC_ST1D_Z_P_BR_=3529,\nENC_ST1D_Z_P_BZ_D_64_SCALED=3530,\nENC_ST1D_Z_P_BZ_D_64_UNSCALED=3531,\nENC_ST1D_Z_P_BZ_D_X32_SCALED=3532,\nENC_ST1D_Z_P_BZ_D_X32_UNSCALED=3533,\nENC_ST1D_ZA_P_RRR_=3534,\nENC_ST1H_Z_P_AI_D=3535,\nENC_ST1H_Z_P_AI_S=3536,\nENC_ST1H_Z_P_BI_=3537,\nENC_ST1H_Z_P_BR_=3538,\nENC_ST1H_Z_P_BZ_D_64_SCALED=3539,\nENC_ST1H_Z_P_BZ_D_64_UNSCALED=3540,\nENC_ST1H_Z_P_BZ_D_X32_SCALED=3541,\nENC_ST1H_Z_P_BZ_D_X32_UNSCALED=3542,\nENC_ST1H_Z_P_BZ_S_X32_SCALED=3543,\nENC_ST1H_Z_P_BZ_S_X32_UNSCALED=3544,\nENC_ST1H_ZA_P_RRR_=3545,\nENC_ST1Q_ZA_P_RRR_=3546,\nENC_ST1W_Z_P_AI_D=3547,\nENC_ST1W_Z_P_AI_S=3548,\nENC_ST1W_Z_P_BI_=3549,\nENC_ST1W_Z_P_BR_=3550,\nENC_ST1W_Z_P_BZ_D_64_SCALED=3551,\nENC_ST1W_Z_P_BZ_D_64_UNSCALED=3552,\nENC_ST1W_Z_P_BZ_D_X32_SCALED=3553,\nENC_ST1W_Z_P_BZ_D_X32_UNSCALED=3554,\nENC_ST1W_Z_P_BZ_S_X32_SCALED=3555,\nENC_ST1W_Z_P_BZ_S_X32_UNSCALED=3556,\nENC_ST1W_ZA_P_RRR_=3557,\nENC_ST2B_Z_P_BI_CONTIGUOUS=3558,\nENC_ST2B_Z_P_BR_CONTIGUOUS=3559,\nENC_ST2D_Z_P_BI_CONTIGUOUS=3560,\nENC_ST2D_Z_P_BR_CONTIGUOUS=3561,\nENC_ST2H_Z_P_BI_CONTIGUOUS=3562,\nENC_ST2H_Z_P_BR_CONTIGUOUS=3563,\nENC_ST2W_Z_P_BI_CONTIGUOUS=3564,\nENC_ST2W_Z_P_BR_CONTIGUOUS=3565,\nENC_ST3B_Z_P_BI_CONTIGUOUS=3566,\nENC_ST3B_Z_P_BR_CONTIGUOUS=3567,\nENC_ST3D_Z_P_BI_CONTIGUOUS=3568,\nENC_ST3D_Z_P_BR_CONTIGUOUS=3569,\nENC_ST3H_Z_P_BI_CONTIGUOUS=3570,\nENC_ST3H_Z_P_BR_CONTIGUOUS=3571,\nENC_ST3W_Z_P_BI_CONTIGUOUS=3572,\nENC_ST3W_Z_P_BR_CONTIGUOUS=3573,\nENC_ST4B_Z_P_BI_CONTIGUOUS=3574,\nENC_ST4B_Z_P_BR_CONTIGUOUS=3575,\nENC_ST4D_Z_P_BI_CONTIGUOUS=3576,\nENC_ST4D_Z_P_BR_CONTIGUOUS=3577,\nENC_ST4H_Z_P_BI_CONTIGUOUS=3578,\nENC_ST4H_Z_P_BR_CONTIGUOUS=3579,\nENC_ST4W_Z_P_BI_CONTIGUOUS=3580,\nENC_ST4W_Z_P_BR_CONTIGUOUS=3581,\nENC_STNT1B_Z_P_AR_D_64_UNSCALED=3582,\nENC_STNT1B_Z_P_AR_S_X32_UNSCALED=3583,\nENC_STNT1B_Z_P_BI_CONTIGUOUS=3584,\nENC_STNT1B_Z_P_BR_CONTIGUOUS=3585,\nENC_STNT1D_Z_P_AR_D_64_UNSCALED=3586,\nENC_STNT1D_Z_P_BI_CONTIGUOUS=3587,\nENC_STNT1D_Z_P_BR_CONTIGUOUS=3588,\nENC_STNT1H_Z_P_AR_D_64_UNSCALED=3589,\nENC_STNT1H_Z_P_AR_S_X32_UNSCALED=3590,\nENC_STNT1H_Z_P_BI_CONTIGUOUS=3591,\nENC_STNT1H_Z_P_BR_CONTIGUOUS=3592,\nENC_STNT1W_Z_P_AR_D_64_UNSCALED=3593,\nENC_STNT1W_Z_P_AR_S_X32_UNSCALED=3594,\nENC_STNT1W_Z_P_BI_CONTIGUOUS=3595,\nENC_STNT1W_Z_P_BR_CONTIGUOUS=3596,\nENC_STR_P_BI_=3597,\nENC_STR_Z_BI_=3598,\nENC_STR_ZA_RI_=3599,\nENC_SUB_Z_P_ZZ_=3600,\nENC_SUB_Z_ZI_=3601,\nENC_SUB_Z_ZZ_=3602,\nENC_SUBHNB_Z_ZZ_=3603,\nENC_SUBHNT_Z_ZZ_=3604,\nENC_SUBR_Z_P_ZZ_=3605,\nENC_SUBR_Z_ZI_=3606,\nENC_SUDOT_Z_ZZZI_S=3607,\nENC_SUMOPA_ZA_PP_ZZ_32=3608,\nENC_SUMOPA_ZA_PP_ZZ_64=3609,\nENC_SUMOPS_ZA_PP_ZZ_32=3610,\nENC_SUMOPS_ZA_PP_ZZ_64=3611,\nENC_SUNPKHI_Z_Z_=3612,\nENC_SUNPKLO_Z_Z_=3613,\nENC_SUQADD_Z_P_ZZ_=3614,\nENC_SXTB_Z_P_Z_=3615,\nENC_SXTH_Z_P_Z_=3616,\nENC_SXTW_Z_P_Z_=3617,\nENC_TBL_Z_ZZ_1=3618,\nENC_TBL_Z_ZZ_2=3619,\nENC_TBX_Z_ZZ_=3620,\nENC_TRN1_P_PP_=3621,\nENC_TRN1_Z_ZZ_=3622,\nENC_TRN1_Z_ZZ_Q=3623,\nENC_TRN2_P_PP_=3624,\nENC_TRN2_Z_ZZ_=3625,\nENC_TRN2_Z_ZZ_Q=3626,\nENC_UABA_Z_ZZZ_=3627,\nENC_UABALB_Z_ZZZ_=3628,\nENC_UABALT_Z_ZZZ_=3629,\nENC_UABD_Z_P_ZZ_=3630,\nENC_UABDLB_Z_ZZ_=3631,\nENC_UABDLT_Z_ZZ_=3632,\nENC_UADALP_Z_P_Z_=3633,\nENC_UADDLB_Z_ZZ_=3634,\nENC_UADDLT_Z_ZZ_=3635,\nENC_UADDV_R_P_Z_=3636,\nENC_UADDWB_Z_ZZ_=3637,\nENC_UADDWT_Z_ZZ_=3638,\nENC_UCLAMP_Z_ZZ_=3639,\nENC_UCVTF_Z_P_Z_H2FP16=3640,\nENC_UCVTF_Z_P_Z_W2D=3641,\nENC_UCVTF_Z_P_Z_W2FP16=3642,\nENC_UCVTF_Z_P_Z_W2S=3643,\nENC_UCVTF_Z_P_Z_X2D=3644,\nENC_UCVTF_Z_P_Z_X2FP16=3645,\nENC_UCVTF_Z_P_Z_X2S=3646,\nENC_UDIV_Z_P_ZZ_=3647,\nENC_UDIVR_Z_P_ZZ_=3648,\nENC_UDOT_Z_ZZZ_=3649,\nENC_UDOT_Z_ZZZI_D=3650,\nENC_UDOT_Z_ZZZI_S=3651,\nENC_UHADD_Z_P_ZZ_=3652,\nENC_UHSUB_Z_P_ZZ_=3653,\nENC_UHSUBR_Z_P_ZZ_=3654,\nENC_UMAX_Z_P_ZZ_=3655,\nENC_UMAX_Z_ZI_=3656,\nENC_UMAXP_Z_P_ZZ_=3657,\nENC_UMAXV_R_P_Z_=3658,\nENC_UMIN_Z_P_ZZ_=3659,\nENC_UMIN_Z_ZI_=3660,\nENC_UMINP_Z_P_ZZ_=3661,\nENC_UMINV_R_P_Z_=3662,\nENC_UMLALB_Z_ZZZ_=3663,\nENC_UMLALB_Z_ZZZI_D=3664,\nENC_UMLALB_Z_ZZZI_S=3665,\nENC_UMLALT_Z_ZZZ_=3666,\nENC_UMLALT_Z_ZZZI_D=3667,\nENC_UMLALT_Z_ZZZI_S=3668,\nENC_UMLSLB_Z_ZZZ_=3669,\nENC_UMLSLB_Z_ZZZI_D=3670,\nENC_UMLSLB_Z_ZZZI_S=3671,\nENC_UMLSLT_Z_ZZZ_=3672,\nENC_UMLSLT_Z_ZZZI_D=3673,\nENC_UMLSLT_Z_ZZZI_S=3674,\nENC_UMMLA_Z_ZZZ_=3675,\nENC_UMOPA_ZA_PP_ZZ_32=3676,\nENC_UMOPA_ZA_PP_ZZ_64=3677,\nENC_UMOPS_ZA_PP_ZZ_32=3678,\nENC_UMOPS_ZA_PP_ZZ_64=3679,\nENC_UMULH_Z_P_ZZ_=3680,\nENC_UMULH_Z_ZZ_=3681,\nENC_UMULLB_Z_ZZ_=3682,\nENC_UMULLB_Z_ZZI_D=3683,\nENC_UMULLB_Z_ZZI_S=3684,\nENC_UMULLT_Z_ZZ_=3685,\nENC_UMULLT_Z_ZZI_D=3686,\nENC_UMULLT_Z_ZZI_S=3687,\nENC_UQADD_Z_P_ZZ_=3688,\nENC_UQADD_Z_ZI_=3689,\nENC_UQADD_Z_ZZ_=3690,\nENC_UQDECB_R_RS_UW=3691,\nENC_UQDECB_R_RS_X=3692,\nENC_UQDECD_R_RS_UW=3693,\nENC_UQDECD_R_RS_X=3694,\nENC_UQDECD_Z_ZS_=3695,\nENC_UQDECH_R_RS_UW=3696,\nENC_UQDECH_R_RS_X=3697,\nENC_UQDECH_Z_ZS_=3698,\nENC_UQDECP_R_P_R_UW=3699,\nENC_UQDECP_R_P_R_X=3700,\nENC_UQDECP_Z_P_Z_=3701,\nENC_UQDECW_R_RS_UW=3702,\nENC_UQDECW_R_RS_X=3703,\nENC_UQDECW_Z_ZS_=3704,\nENC_UQINCB_R_RS_UW=3705,\nENC_UQINCB_R_RS_X=3706,\nENC_UQINCD_R_RS_UW=3707,\nENC_UQINCD_R_RS_X=3708,\nENC_UQINCD_Z_ZS_=3709,\nENC_UQINCH_R_RS_UW=3710,\nENC_UQINCH_R_RS_X=3711,\nENC_UQINCH_Z_ZS_=3712,\nENC_UQINCP_R_P_R_UW=3713,\nENC_UQINCP_R_P_R_X=3714,\nENC_UQINCP_Z_P_Z_=3715,\nENC_UQINCW_R_RS_UW=3716,\nENC_UQINCW_R_RS_X=3717,\nENC_UQINCW_Z_ZS_=3718,\nENC_UQRSHL_Z_P_ZZ_=3719,\nENC_UQRSHLR_Z_P_ZZ_=3720,\nENC_UQRSHRNB_Z_ZI_=3721,\nENC_UQRSHRNT_Z_ZI_=3722,\nENC_UQSHL_Z_P_ZI_=3723,\nENC_UQSHL_Z_P_ZZ_=3724,\nENC_UQSHLR_Z_P_ZZ_=3725,\nENC_UQSHRNB_Z_ZI_=3726,\nENC_UQSHRNT_Z_ZI_=3727,\nENC_UQSUB_Z_P_ZZ_=3728,\nENC_UQSUB_Z_ZI_=3729,\nENC_UQSUB_Z_ZZ_=3730,\nENC_UQSUBR_Z_P_ZZ_=3731,\nENC_UQXTNB_Z_ZZ_=3732,\nENC_UQXTNT_Z_ZZ_=3733,\nENC_URECPE_Z_P_Z_=3734,\nENC_URHADD_Z_P_ZZ_=3735,\nENC_URSHL_Z_P_ZZ_=3736,\nENC_URSHLR_Z_P_ZZ_=3737,\nENC_URSHR_Z_P_ZI_=3738,\nENC_URSQRTE_Z_P_Z_=3739,\nENC_URSRA_Z_ZI_=3740,\nENC_USDOT_Z_ZZZ_S=3741,\nENC_USDOT_Z_ZZZI_S=3742,\nENC_USHLLB_Z_ZI_=3743,\nENC_USHLLT_Z_ZI_=3744,\nENC_USMMLA_Z_ZZZ_=3745,\nENC_USMOPA_ZA_PP_ZZ_32=3746,\nENC_USMOPA_ZA_PP_ZZ_64=3747,\nENC_USMOPS_ZA_PP_ZZ_32=3748,\nENC_USMOPS_ZA_PP_ZZ_64=3749,\nENC_USQADD_Z_P_ZZ_=3750,\nENC_USRA_Z_ZI_=3751,\nENC_USUBLB_Z_ZZ_=3752,\nENC_USUBLT_Z_ZZ_=3753,\nENC_USUBWB_Z_ZZ_=3754,\nENC_USUBWT_Z_ZZ_=3755,\nENC_UUNPKHI_Z_Z_=3756,\nENC_UUNPKLO_Z_Z_=3757,\nENC_UXTB_Z_P_Z_=3758,\nENC_UXTH_Z_P_Z_=3759,\nENC_UXTW_Z_P_Z_=3760,\nENC_UZP1_P_PP_=3761,\nENC_UZP1_Z_ZZ_=3762,\nENC_UZP1_Z_ZZ_Q=3763,\nENC_UZP2_P_PP_=3764,\nENC_UZP2_Z_ZZ_=3765,\nENC_UZP2_Z_ZZ_Q=3766,\nENC_WHILEGE_P_P_RR_=3767,\nENC_WHILEGT_P_P_RR_=3768,\nENC_WHILEHI_P_P_RR_=3769,\nENC_WHILEHS_P_P_RR_=3770,\nENC_WHILELE_P_P_RR_=3771,\nENC_WHILELO_P_P_RR_=3772,\nENC_WHILELS_P_P_RR_=3773,\nENC_WHILELT_P_P_RR_=3774,\nENC_WHILERW_P_RR_=3775,\nENC_WHILEWR_P_RR_=3776,\nENC_WRFFR_F_P_=3777,\nENC_XAR_Z_ZZI_=3778,\nENC_ZERO_ZA_I_=3779,\nENC_ZIP1_P_PP_=3780,\nENC_ZIP1_Z_ZZ_=3781,\nENC_ZIP1_Z_ZZ_Q=3782,\nENC_ZIP2_P_PP_=3783,\nENC_ZIP2_Z_ZZ_=3784,\nENC_ZIP2_Z_ZZ_Q=3785,\n};\nenum Operation enc_to_oper(enum ENCODING);\nenum Operation enc_to_oper2(enum ENCODING);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/encodings_fmt.c",
    "content": "/* GENERATED FILE */\n/* this is the \"format\" side of encodings, dealing with string mappings */\n\n#include \"operations.h\"\n#include \"encodings_dec.h\"\n#include \"encodings_fmt.h\"\n\nconst char *enc_to_str(enum ENCODING enc)\n{\n\tswitch(enc) {\n\t\tcase ENC_ABS_ASIMDMISC_R: return \"ABS_asimdmisc_R\";\n\t\tcase ENC_ABS_ASISDMISC_R: return \"ABS_asisdmisc_R\";\n\t\tcase ENC_ADCS_32_ADDSUB_CARRY: return \"ADCS_32_addsub_carry\";\n\t\tcase ENC_ADCS_64_ADDSUB_CARRY: return \"ADCS_64_addsub_carry\";\n\t\tcase ENC_ADC_32_ADDSUB_CARRY: return \"ADC_32_addsub_carry\";\n\t\tcase ENC_ADC_64_ADDSUB_CARRY: return \"ADC_64_addsub_carry\";\n\t\tcase ENC_ADDG_64_ADDSUB_IMMTAGS: return \"ADDG_64_addsub_immtags\";\n\t\tcase ENC_ADDHN_ASIMDDIFF_N: return \"ADDHN_asimddiff_N\";\n\t\tcase ENC_ADDP_ASIMDSAME_ONLY: return \"ADDP_asimdsame_only\";\n\t\tcase ENC_ADDP_ASISDPAIR_ONLY: return \"ADDP_asisdpair_only\";\n\t\tcase ENC_ADDS_32S_ADDSUB_EXT: return \"ADDS_32S_addsub_ext\";\n\t\tcase ENC_ADDS_32S_ADDSUB_IMM: return \"ADDS_32S_addsub_imm\";\n\t\tcase ENC_ADDS_32_ADDSUB_SHIFT: return \"ADDS_32_addsub_shift\";\n\t\tcase ENC_ADDS_64S_ADDSUB_EXT: return \"ADDS_64S_addsub_ext\";\n\t\tcase ENC_ADDS_64S_ADDSUB_IMM: return \"ADDS_64S_addsub_imm\";\n\t\tcase ENC_ADDS_64_ADDSUB_SHIFT: return \"ADDS_64_addsub_shift\";\n\t\tcase ENC_ADDV_ASIMDALL_ONLY: return \"ADDV_asimdall_only\";\n\t\tcase ENC_ADD_32_ADDSUB_EXT: return \"ADD_32_addsub_ext\";\n\t\tcase ENC_ADD_32_ADDSUB_IMM: return \"ADD_32_addsub_imm\";\n\t\tcase ENC_ADD_32_ADDSUB_SHIFT: return \"ADD_32_addsub_shift\";\n\t\tcase ENC_ADD_64_ADDSUB_EXT: return \"ADD_64_addsub_ext\";\n\t\tcase ENC_ADD_64_ADDSUB_IMM: return \"ADD_64_addsub_imm\";\n\t\tcase ENC_ADD_64_ADDSUB_SHIFT: return \"ADD_64_addsub_shift\";\n\t\tcase ENC_ADD_ASIMDSAME_ONLY: return \"ADD_asimdsame_only\";\n\t\tcase ENC_ADD_ASISDSAME_ONLY: return \"ADD_asisdsame_only\";\n\t\tcase ENC_ADRP_ONLY_PCRELADDR: return \"ADRP_only_pcreladdr\";\n\t\tcase ENC_ADR_ONLY_PCRELADDR: return \"ADR_only_pcreladdr\";\n\t\tcase ENC_AESD_B_CRYPTOAES: return \"AESD_B_cryptoaes\";\n\t\tcase ENC_AESE_B_CRYPTOAES: return \"AESE_B_cryptoaes\";\n\t\tcase ENC_AESIMC_B_CRYPTOAES: return \"AESIMC_B_cryptoaes\";\n\t\tcase ENC_AESMC_B_CRYPTOAES: return \"AESMC_B_cryptoaes\";\n\t\tcase ENC_ANDS_32S_LOG_IMM: return \"ANDS_32S_log_imm\";\n\t\tcase ENC_ANDS_32_LOG_SHIFT: return \"ANDS_32_log_shift\";\n\t\tcase ENC_ANDS_64S_LOG_IMM: return \"ANDS_64S_log_imm\";\n\t\tcase ENC_ANDS_64_LOG_SHIFT: return \"ANDS_64_log_shift\";\n\t\tcase ENC_AND_32_LOG_IMM: return \"AND_32_log_imm\";\n\t\tcase ENC_AND_32_LOG_SHIFT: return \"AND_32_log_shift\";\n\t\tcase ENC_AND_64_LOG_IMM: return \"AND_64_log_imm\";\n\t\tcase ENC_AND_64_LOG_SHIFT: return \"AND_64_log_shift\";\n\t\tcase ENC_AND_ASIMDSAME_ONLY: return \"AND_asimdsame_only\";\n\t\tcase ENC_ASRV_32_DP_2SRC: return \"ASRV_32_dp_2src\";\n\t\tcase ENC_ASRV_64_DP_2SRC: return \"ASRV_64_dp_2src\";\n\t\tcase ENC_ASR_ASRV_32_DP_2SRC: return \"ASR_ASRV_32_dp_2src\";\n\t\tcase ENC_ASR_ASRV_64_DP_2SRC: return \"ASR_ASRV_64_dp_2src\";\n\t\tcase ENC_ASR_SBFM_32M_BITFIELD: return \"ASR_SBFM_32M_bitfield\";\n\t\tcase ENC_ASR_SBFM_64M_BITFIELD: return \"ASR_SBFM_64M_bitfield\";\n\t\tcase ENC_AT_SYS_CR_SYSTEMINSTRS: return \"AT_SYS_CR_systeminstrs\";\n\t\tcase ENC_AUTDA_64P_DP_1SRC: return \"AUTDA_64P_dp_1src\";\n\t\tcase ENC_AUTDB_64P_DP_1SRC: return \"AUTDB_64P_dp_1src\";\n\t\tcase ENC_AUTDZA_64Z_DP_1SRC: return \"AUTDZA_64Z_dp_1src\";\n\t\tcase ENC_AUTDZB_64Z_DP_1SRC: return \"AUTDZB_64Z_dp_1src\";\n\t\tcase ENC_AUTIA1716_HI_HINTS: return \"AUTIA1716_HI_hints\";\n\t\tcase ENC_AUTIASP_HI_HINTS: return \"AUTIASP_HI_hints\";\n\t\tcase ENC_AUTIAZ_HI_HINTS: return \"AUTIAZ_HI_hints\";\n\t\tcase ENC_AUTIA_64P_DP_1SRC: return \"AUTIA_64P_dp_1src\";\n\t\tcase ENC_AUTIB1716_HI_HINTS: return \"AUTIB1716_HI_hints\";\n\t\tcase ENC_AUTIBSP_HI_HINTS: return \"AUTIBSP_HI_hints\";\n\t\tcase ENC_AUTIBZ_HI_HINTS: return \"AUTIBZ_HI_hints\";\n\t\tcase ENC_AUTIB_64P_DP_1SRC: return \"AUTIB_64P_dp_1src\";\n\t\tcase ENC_AUTIZA_64Z_DP_1SRC: return \"AUTIZA_64Z_dp_1src\";\n\t\tcase ENC_AUTIZB_64Z_DP_1SRC: return \"AUTIZB_64Z_dp_1src\";\n\t\tcase ENC_AXFLAG_M_PSTATE: return \"AXFLAG_M_pstate\";\n\t\tcase ENC_BCAX_VVV16_CRYPTO4: return \"BCAX_VVV16_crypto4\";\n\t\tcase ENC_BFCVTN_ASIMDMISC_4S: return \"BFCVTN_asimdmisc_4S\";\n\t\tcase ENC_BFCVT_BS_FLOATDP1: return \"BFCVT_BS_floatdp1\";\n\t\tcase ENC_BFC_BFM_32M_BITFIELD: return \"BFC_BFM_32M_bitfield\";\n\t\tcase ENC_BFC_BFM_64M_BITFIELD: return \"BFC_BFM_64M_bitfield\";\n\t\tcase ENC_BFDOT_ASIMDELEM_E: return \"BFDOT_asimdelem_E\";\n\t\tcase ENC_BFDOT_ASIMDSAME2_D: return \"BFDOT_asimdsame2_D\";\n\t\tcase ENC_BFI_BFM_32M_BITFIELD: return \"BFI_BFM_32M_bitfield\";\n\t\tcase ENC_BFI_BFM_64M_BITFIELD: return \"BFI_BFM_64M_bitfield\";\n\t\tcase ENC_BFMLAL_ASIMDELEM_F: return \"BFMLAL_asimdelem_F\";\n\t\tcase ENC_BFMLAL_ASIMDSAME2_F_: return \"BFMLAL_asimdsame2_F_\";\n\t\tcase ENC_BFMMLA_ASIMDSAME2_E: return \"BFMMLA_asimdsame2_E\";\n\t\tcase ENC_BFM_32M_BITFIELD: return \"BFM_32M_bitfield\";\n\t\tcase ENC_BFM_64M_BITFIELD: return \"BFM_64M_bitfield\";\n\t\tcase ENC_BFXIL_BFM_32M_BITFIELD: return \"BFXIL_BFM_32M_bitfield\";\n\t\tcase ENC_BFXIL_BFM_64M_BITFIELD: return \"BFXIL_BFM_64M_bitfield\";\n\t\tcase ENC_BICS_32_LOG_SHIFT: return \"BICS_32_log_shift\";\n\t\tcase ENC_BICS_64_LOG_SHIFT: return \"BICS_64_log_shift\";\n\t\tcase ENC_BIC_32_LOG_SHIFT: return \"BIC_32_log_shift\";\n\t\tcase ENC_BIC_64_LOG_SHIFT: return \"BIC_64_log_shift\";\n\t\tcase ENC_BIC_AND_Z_ZI_: return \"BIC_and_z_zi_\";\n\t\tcase ENC_BIC_ASIMDIMM_L_HL: return \"BIC_asimdimm_L_hl\";\n\t\tcase ENC_BIC_ASIMDIMM_L_SL: return \"BIC_asimdimm_L_sl\";\n\t\tcase ENC_BIC_ASIMDSAME_ONLY: return \"BIC_asimdsame_only\";\n\t\tcase ENC_BIF_ASIMDSAME_ONLY: return \"BIF_asimdsame_only\";\n\t\tcase ENC_BIT_ASIMDSAME_ONLY: return \"BIT_asimdsame_only\";\n\t\tcase ENC_BLRAAZ_64_BRANCH_REG: return \"BLRAAZ_64_branch_reg\";\n\t\tcase ENC_BLRAA_64P_BRANCH_REG: return \"BLRAA_64P_branch_reg\";\n\t\tcase ENC_BLRABZ_64_BRANCH_REG: return \"BLRABZ_64_branch_reg\";\n\t\tcase ENC_BLRAB_64P_BRANCH_REG: return \"BLRAB_64P_branch_reg\";\n\t\tcase ENC_BLR_64_BRANCH_REG: return \"BLR_64_branch_reg\";\n\t\tcase ENC_BL_ONLY_BRANCH_IMM: return \"BL_only_branch_imm\";\n\t\tcase ENC_BRAAZ_64_BRANCH_REG: return \"BRAAZ_64_branch_reg\";\n\t\tcase ENC_BRAA_64P_BRANCH_REG: return \"BRAA_64P_branch_reg\";\n\t\tcase ENC_BRABZ_64_BRANCH_REG: return \"BRABZ_64_branch_reg\";\n\t\tcase ENC_BRAB_64P_BRANCH_REG: return \"BRAB_64P_branch_reg\";\n\t\tcase ENC_BRK_EX_EXCEPTION: return \"BRK_EX_exception\";\n\t\tcase ENC_BR_64_BRANCH_REG: return \"BR_64_branch_reg\";\n\t\tcase ENC_BSL_ASIMDSAME_ONLY: return \"BSL_asimdsame_only\";\n\t\tcase ENC_BTI_HB_HINTS: return \"BTI_HB_hints\";\n\t\tcase ENC_B_ONLY_BRANCH_IMM: return \"B_only_branch_imm\";\n\t\tcase ENC_B_ONLY_CONDBRANCH: return \"B_only_condbranch\";\n\t\tcase ENC_CASAB_C32_COMSWAP: return \"CASAB_C32_comswap\";\n\t\tcase ENC_CASAH_C32_COMSWAP: return \"CASAH_C32_comswap\";\n\t\tcase ENC_CASALB_C32_COMSWAP: return \"CASALB_C32_comswap\";\n\t\tcase ENC_CASALH_C32_COMSWAP: return \"CASALH_C32_comswap\";\n\t\tcase ENC_CASAL_C32_COMSWAP: return \"CASAL_C32_comswap\";\n\t\tcase ENC_CASAL_C64_COMSWAP: return \"CASAL_C64_comswap\";\n\t\tcase ENC_CASA_C32_COMSWAP: return \"CASA_C32_comswap\";\n\t\tcase ENC_CASA_C64_COMSWAP: return \"CASA_C64_comswap\";\n\t\tcase ENC_CASB_C32_COMSWAP: return \"CASB_C32_comswap\";\n\t\tcase ENC_CASH_C32_COMSWAP: return \"CASH_C32_comswap\";\n\t\tcase ENC_CASLB_C32_COMSWAP: return \"CASLB_C32_comswap\";\n\t\tcase ENC_CASLH_C32_COMSWAP: return \"CASLH_C32_comswap\";\n\t\tcase ENC_CASL_C32_COMSWAP: return \"CASL_C32_comswap\";\n\t\tcase ENC_CASL_C64_COMSWAP: return \"CASL_C64_comswap\";\n\t\tcase ENC_CASPAL_CP32_COMSWAPPR: return \"CASPAL_CP32_comswappr\";\n\t\tcase ENC_CASPAL_CP64_COMSWAPPR: return \"CASPAL_CP64_comswappr\";\n\t\tcase ENC_CASPA_CP32_COMSWAPPR: return \"CASPA_CP32_comswappr\";\n\t\tcase ENC_CASPA_CP64_COMSWAPPR: return \"CASPA_CP64_comswappr\";\n\t\tcase ENC_CASPL_CP32_COMSWAPPR: return \"CASPL_CP32_comswappr\";\n\t\tcase ENC_CASPL_CP64_COMSWAPPR: return \"CASPL_CP64_comswappr\";\n\t\tcase ENC_CASP_CP32_COMSWAPPR: return \"CASP_CP32_comswappr\";\n\t\tcase ENC_CASP_CP64_COMSWAPPR: return \"CASP_CP64_comswappr\";\n\t\tcase ENC_CAS_C32_COMSWAP: return \"CAS_C32_comswap\";\n\t\tcase ENC_CAS_C64_COMSWAP: return \"CAS_C64_comswap\";\n\t\tcase ENC_CBNZ_32_COMPBRANCH: return \"CBNZ_32_compbranch\";\n\t\tcase ENC_CBNZ_64_COMPBRANCH: return \"CBNZ_64_compbranch\";\n\t\tcase ENC_CBZ_32_COMPBRANCH: return \"CBZ_32_compbranch\";\n\t\tcase ENC_CBZ_64_COMPBRANCH: return \"CBZ_64_compbranch\";\n\t\tcase ENC_CCMN_32_CONDCMP_IMM: return \"CCMN_32_condcmp_imm\";\n\t\tcase ENC_CCMN_32_CONDCMP_REG: return \"CCMN_32_condcmp_reg\";\n\t\tcase ENC_CCMN_64_CONDCMP_IMM: return \"CCMN_64_condcmp_imm\";\n\t\tcase ENC_CCMN_64_CONDCMP_REG: return \"CCMN_64_condcmp_reg\";\n\t\tcase ENC_CCMP_32_CONDCMP_IMM: return \"CCMP_32_condcmp_imm\";\n\t\tcase ENC_CCMP_32_CONDCMP_REG: return \"CCMP_32_condcmp_reg\";\n\t\tcase ENC_CCMP_64_CONDCMP_IMM: return \"CCMP_64_condcmp_imm\";\n\t\tcase ENC_CCMP_64_CONDCMP_REG: return \"CCMP_64_condcmp_reg\";\n\t\tcase ENC_CFINV_M_PSTATE: return \"CFINV_M_pstate\";\n\t\tcase ENC_CFP_SYS_CR_SYSTEMINSTRS: return \"CFP_SYS_CR_systeminstrs\";\n\t\tcase ENC_CINC_CSINC_32_CONDSEL: return \"CINC_CSINC_32_condsel\";\n\t\tcase ENC_CINC_CSINC_64_CONDSEL: return \"CINC_CSINC_64_condsel\";\n\t\tcase ENC_CINV_CSINV_32_CONDSEL: return \"CINV_CSINV_32_condsel\";\n\t\tcase ENC_CINV_CSINV_64_CONDSEL: return \"CINV_CSINV_64_condsel\";\n\t\tcase ENC_CLREX_BN_BARRIERS: return \"CLREX_BN_barriers\";\n\t\tcase ENC_CLS_32_DP_1SRC: return \"CLS_32_dp_1src\";\n\t\tcase ENC_CLS_64_DP_1SRC: return \"CLS_64_dp_1src\";\n\t\tcase ENC_CLS_ASIMDMISC_R: return \"CLS_asimdmisc_R\";\n\t\tcase ENC_CLZ_32_DP_1SRC: return \"CLZ_32_dp_1src\";\n\t\tcase ENC_CLZ_64_DP_1SRC: return \"CLZ_64_dp_1src\";\n\t\tcase ENC_CLZ_ASIMDMISC_R: return \"CLZ_asimdmisc_R\";\n\t\tcase ENC_CMEQ_ASIMDMISC_Z: return \"CMEQ_asimdmisc_Z\";\n\t\tcase ENC_CMEQ_ASIMDSAME_ONLY: return \"CMEQ_asimdsame_only\";\n\t\tcase ENC_CMEQ_ASISDMISC_Z: return \"CMEQ_asisdmisc_Z\";\n\t\tcase ENC_CMEQ_ASISDSAME_ONLY: return \"CMEQ_asisdsame_only\";\n\t\tcase ENC_CMGE_ASIMDMISC_Z: return \"CMGE_asimdmisc_Z\";\n\t\tcase ENC_CMGE_ASIMDSAME_ONLY: return \"CMGE_asimdsame_only\";\n\t\tcase ENC_CMGE_ASISDMISC_Z: return \"CMGE_asisdmisc_Z\";\n\t\tcase ENC_CMGE_ASISDSAME_ONLY: return \"CMGE_asisdsame_only\";\n\t\tcase ENC_CMGT_ASIMDMISC_Z: return \"CMGT_asimdmisc_Z\";\n\t\tcase ENC_CMGT_ASIMDSAME_ONLY: return \"CMGT_asimdsame_only\";\n\t\tcase ENC_CMGT_ASISDMISC_Z: return \"CMGT_asisdmisc_Z\";\n\t\tcase ENC_CMGT_ASISDSAME_ONLY: return \"CMGT_asisdsame_only\";\n\t\tcase ENC_CMHI_ASIMDSAME_ONLY: return \"CMHI_asimdsame_only\";\n\t\tcase ENC_CMHI_ASISDSAME_ONLY: return \"CMHI_asisdsame_only\";\n\t\tcase ENC_CMHS_ASIMDSAME_ONLY: return \"CMHS_asimdsame_only\";\n\t\tcase ENC_CMHS_ASISDSAME_ONLY: return \"CMHS_asisdsame_only\";\n\t\tcase ENC_CMLE_ASIMDMISC_Z: return \"CMLE_asimdmisc_Z\";\n\t\tcase ENC_CMLE_ASISDMISC_Z: return \"CMLE_asisdmisc_Z\";\n\t\tcase ENC_CMLT_ASIMDMISC_Z: return \"CMLT_asimdmisc_Z\";\n\t\tcase ENC_CMLT_ASISDMISC_Z: return \"CMLT_asisdmisc_Z\";\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_EXT: return \"CMN_ADDS_32S_addsub_ext\";\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_IMM: return \"CMN_ADDS_32S_addsub_imm\";\n\t\tcase ENC_CMN_ADDS_32_ADDSUB_SHIFT: return \"CMN_ADDS_32_addsub_shift\";\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_EXT: return \"CMN_ADDS_64S_addsub_ext\";\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_IMM: return \"CMN_ADDS_64S_addsub_imm\";\n\t\tcase ENC_CMN_ADDS_64_ADDSUB_SHIFT: return \"CMN_ADDS_64_addsub_shift\";\n\t\tcase ENC_CMPLE_CMPGE_P_P_ZZ_: return \"CMPLE_cmpge_p_p_zz_\";\n\t\tcase ENC_CMPLO_CMPHI_P_P_ZZ_: return \"CMPLO_cmphi_p_p_zz_\";\n\t\tcase ENC_CMPLS_CMPHS_P_P_ZZ_: return \"CMPLS_cmphs_p_p_zz_\";\n\t\tcase ENC_CMPLT_CMPGT_P_P_ZZ_: return \"CMPLT_cmpgt_p_p_zz_\";\n\t\tcase ENC_CMPP_SUBPS_64S_DP_2SRC: return \"CMPP_SUBPS_64S_dp_2src\";\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_EXT: return \"CMP_SUBS_32S_addsub_ext\";\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_IMM: return \"CMP_SUBS_32S_addsub_imm\";\n\t\tcase ENC_CMP_SUBS_32_ADDSUB_SHIFT: return \"CMP_SUBS_32_addsub_shift\";\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_EXT: return \"CMP_SUBS_64S_addsub_ext\";\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_IMM: return \"CMP_SUBS_64S_addsub_imm\";\n\t\tcase ENC_CMP_SUBS_64_ADDSUB_SHIFT: return \"CMP_SUBS_64_addsub_shift\";\n\t\tcase ENC_CMTST_ASIMDSAME_ONLY: return \"CMTST_asimdsame_only\";\n\t\tcase ENC_CMTST_ASISDSAME_ONLY: return \"CMTST_asisdsame_only\";\n\t\tcase ENC_CNEG_CSNEG_32_CONDSEL: return \"CNEG_CSNEG_32_condsel\";\n\t\tcase ENC_CNEG_CSNEG_64_CONDSEL: return \"CNEG_CSNEG_64_condsel\";\n\t\tcase ENC_CNT_ASIMDMISC_R: return \"CNT_asimdmisc_R\";\n\t\tcase ENC_CPP_SYS_CR_SYSTEMINSTRS: return \"CPP_SYS_CR_systeminstrs\";\n\t\tcase ENC_CRC32B_32C_DP_2SRC: return \"CRC32B_32C_dp_2src\";\n\t\tcase ENC_CRC32CB_32C_DP_2SRC: return \"CRC32CB_32C_dp_2src\";\n\t\tcase ENC_CRC32CH_32C_DP_2SRC: return \"CRC32CH_32C_dp_2src\";\n\t\tcase ENC_CRC32CW_32C_DP_2SRC: return \"CRC32CW_32C_dp_2src\";\n\t\tcase ENC_CRC32CX_64C_DP_2SRC: return \"CRC32CX_64C_dp_2src\";\n\t\tcase ENC_CRC32H_32C_DP_2SRC: return \"CRC32H_32C_dp_2src\";\n\t\tcase ENC_CRC32W_32C_DP_2SRC: return \"CRC32W_32C_dp_2src\";\n\t\tcase ENC_CRC32X_64C_DP_2SRC: return \"CRC32X_64C_dp_2src\";\n\t\tcase ENC_CSDB_HI_HINTS: return \"CSDB_HI_hints\";\n\t\tcase ENC_CSEL_32_CONDSEL: return \"CSEL_32_condsel\";\n\t\tcase ENC_CSEL_64_CONDSEL: return \"CSEL_64_condsel\";\n\t\tcase ENC_CSETM_CSINV_32_CONDSEL: return \"CSETM_CSINV_32_condsel\";\n\t\tcase ENC_CSETM_CSINV_64_CONDSEL: return \"CSETM_CSINV_64_condsel\";\n\t\tcase ENC_CSET_CSINC_32_CONDSEL: return \"CSET_CSINC_32_condsel\";\n\t\tcase ENC_CSET_CSINC_64_CONDSEL: return \"CSET_CSINC_64_condsel\";\n\t\tcase ENC_CSINC_32_CONDSEL: return \"CSINC_32_condsel\";\n\t\tcase ENC_CSINC_64_CONDSEL: return \"CSINC_64_condsel\";\n\t\tcase ENC_CSINV_32_CONDSEL: return \"CSINV_32_condsel\";\n\t\tcase ENC_CSINV_64_CONDSEL: return \"CSINV_64_condsel\";\n\t\tcase ENC_CSNEG_32_CONDSEL: return \"CSNEG_32_condsel\";\n\t\tcase ENC_CSNEG_64_CONDSEL: return \"CSNEG_64_condsel\";\n\t\tcase ENC_DCPS1_DC_EXCEPTION: return \"DCPS1_DC_exception\";\n\t\tcase ENC_DCPS2_DC_EXCEPTION: return \"DCPS2_DC_exception\";\n\t\tcase ENC_DCPS3_DC_EXCEPTION: return \"DCPS3_DC_exception\";\n\t\tcase ENC_DC_SYS_CR_SYSTEMINSTRS: return \"DC_SYS_CR_systeminstrs\";\n\t\tcase ENC_DGH_HI_HINTS: return \"DGH_HI_hints\";\n\t\tcase ENC_DMB_BO_BARRIERS: return \"DMB_BO_barriers\";\n\t\tcase ENC_DRPS_64E_BRANCH_REG: return \"DRPS_64E_branch_reg\";\n\t\tcase ENC_DSB_BO_BARRIERS: return \"DSB_BO_barriers\";\n\t\tcase ENC_DSB_BON_BARRIERS: return \"DSB_BOn_barriers\";\n\t\tcase ENC_DUP_ASIMDINS_DR_R: return \"DUP_asimdins_DR_r\";\n\t\tcase ENC_DUP_ASIMDINS_DV_V: return \"DUP_asimdins_DV_v\";\n\t\tcase ENC_DUP_ASISDONE_ONLY: return \"DUP_asisdone_only\";\n\t\tcase ENC_DVP_SYS_CR_SYSTEMINSTRS: return \"DVP_SYS_CR_systeminstrs\";\n\t\tcase ENC_EON_32_LOG_SHIFT: return \"EON_32_log_shift\";\n\t\tcase ENC_EON_64_LOG_SHIFT: return \"EON_64_log_shift\";\n\t\tcase ENC_EON_EOR_Z_ZI_: return \"EON_eor_z_zi_\";\n\t\tcase ENC_EOR3_VVV16_CRYPTO4: return \"EOR3_VVV16_crypto4\";\n\t\tcase ENC_EOR_32_LOG_IMM: return \"EOR_32_log_imm\";\n\t\tcase ENC_EOR_32_LOG_SHIFT: return \"EOR_32_log_shift\";\n\t\tcase ENC_EOR_64_LOG_IMM: return \"EOR_64_log_imm\";\n\t\tcase ENC_EOR_64_LOG_SHIFT: return \"EOR_64_log_shift\";\n\t\tcase ENC_EOR_ASIMDSAME_ONLY: return \"EOR_asimdsame_only\";\n\t\tcase ENC_ERETAA_64E_BRANCH_REG: return \"ERETAA_64E_branch_reg\";\n\t\tcase ENC_ERETAB_64E_BRANCH_REG: return \"ERETAB_64E_branch_reg\";\n\t\tcase ENC_ERET_64E_BRANCH_REG: return \"ERET_64E_branch_reg\";\n\t\tcase ENC_ESB_HI_HINTS: return \"ESB_HI_hints\";\n\t\tcase ENC_EXTR_32_EXTRACT: return \"EXTR_32_extract\";\n\t\tcase ENC_EXTR_64_EXTRACT: return \"EXTR_64_extract\";\n\t\tcase ENC_EXT_ASIMDEXT_ONLY: return \"EXT_asimdext_only\";\n\t\tcase ENC_FABD_ASIMDSAME_ONLY: return \"FABD_asimdsame_only\";\n\t\tcase ENC_FABD_ASIMDSAMEFP16_ONLY: return \"FABD_asimdsamefp16_only\";\n\t\tcase ENC_FABD_ASISDSAME_ONLY: return \"FABD_asisdsame_only\";\n\t\tcase ENC_FABD_ASISDSAMEFP16_ONLY: return \"FABD_asisdsamefp16_only\";\n\t\tcase ENC_FABS_D_FLOATDP1: return \"FABS_D_floatdp1\";\n\t\tcase ENC_FABS_H_FLOATDP1: return \"FABS_H_floatdp1\";\n\t\tcase ENC_FABS_S_FLOATDP1: return \"FABS_S_floatdp1\";\n\t\tcase ENC_FABS_ASIMDMISC_R: return \"FABS_asimdmisc_R\";\n\t\tcase ENC_FABS_ASIMDMISCFP16_R: return \"FABS_asimdmiscfp16_R\";\n\t\tcase ENC_FACGE_ASIMDSAME_ONLY: return \"FACGE_asimdsame_only\";\n\t\tcase ENC_FACGE_ASIMDSAMEFP16_ONLY: return \"FACGE_asimdsamefp16_only\";\n\t\tcase ENC_FACGE_ASISDSAME_ONLY: return \"FACGE_asisdsame_only\";\n\t\tcase ENC_FACGE_ASISDSAMEFP16_ONLY: return \"FACGE_asisdsamefp16_only\";\n\t\tcase ENC_FACGT_ASIMDSAME_ONLY: return \"FACGT_asimdsame_only\";\n\t\tcase ENC_FACGT_ASIMDSAMEFP16_ONLY: return \"FACGT_asimdsamefp16_only\";\n\t\tcase ENC_FACGT_ASISDSAME_ONLY: return \"FACGT_asisdsame_only\";\n\t\tcase ENC_FACGT_ASISDSAMEFP16_ONLY: return \"FACGT_asisdsamefp16_only\";\n\t\tcase ENC_FACLE_FACGE_P_P_ZZ_: return \"FACLE_facge_p_p_zz_\";\n\t\tcase ENC_FACLT_FACGT_P_P_ZZ_: return \"FACLT_facgt_p_p_zz_\";\n\t\tcase ENC_FADDP_ASIMDSAME_ONLY: return \"FADDP_asimdsame_only\";\n\t\tcase ENC_FADDP_ASIMDSAMEFP16_ONLY: return \"FADDP_asimdsamefp16_only\";\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_H: return \"FADDP_asisdpair_only_H\";\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_SD: return \"FADDP_asisdpair_only_SD\";\n\t\tcase ENC_FADD_D_FLOATDP2: return \"FADD_D_floatdp2\";\n\t\tcase ENC_FADD_H_FLOATDP2: return \"FADD_H_floatdp2\";\n\t\tcase ENC_FADD_S_FLOATDP2: return \"FADD_S_floatdp2\";\n\t\tcase ENC_FADD_ASIMDSAME_ONLY: return \"FADD_asimdsame_only\";\n\t\tcase ENC_FADD_ASIMDSAMEFP16_ONLY: return \"FADD_asimdsamefp16_only\";\n\t\tcase ENC_FCADD_ASIMDSAME2_C: return \"FCADD_asimdsame2_C\";\n\t\tcase ENC_FCCMPE_D_FLOATCCMP: return \"FCCMPE_D_floatccmp\";\n\t\tcase ENC_FCCMPE_H_FLOATCCMP: return \"FCCMPE_H_floatccmp\";\n\t\tcase ENC_FCCMPE_S_FLOATCCMP: return \"FCCMPE_S_floatccmp\";\n\t\tcase ENC_FCCMP_D_FLOATCCMP: return \"FCCMP_D_floatccmp\";\n\t\tcase ENC_FCCMP_H_FLOATCCMP: return \"FCCMP_H_floatccmp\";\n\t\tcase ENC_FCCMP_S_FLOATCCMP: return \"FCCMP_S_floatccmp\";\n\t\tcase ENC_FCMEQ_ASIMDMISC_FZ: return \"FCMEQ_asimdmisc_FZ\";\n\t\tcase ENC_FCMEQ_ASIMDMISCFP16_FZ: return \"FCMEQ_asimdmiscfp16_FZ\";\n\t\tcase ENC_FCMEQ_ASIMDSAME_ONLY: return \"FCMEQ_asimdsame_only\";\n\t\tcase ENC_FCMEQ_ASIMDSAMEFP16_ONLY: return \"FCMEQ_asimdsamefp16_only\";\n\t\tcase ENC_FCMEQ_ASISDMISC_FZ: return \"FCMEQ_asisdmisc_FZ\";\n\t\tcase ENC_FCMEQ_ASISDMISCFP16_FZ: return \"FCMEQ_asisdmiscfp16_FZ\";\n\t\tcase ENC_FCMEQ_ASISDSAME_ONLY: return \"FCMEQ_asisdsame_only\";\n\t\tcase ENC_FCMEQ_ASISDSAMEFP16_ONLY: return \"FCMEQ_asisdsamefp16_only\";\n\t\tcase ENC_FCMGE_ASIMDMISC_FZ: return \"FCMGE_asimdmisc_FZ\";\n\t\tcase ENC_FCMGE_ASIMDMISCFP16_FZ: return \"FCMGE_asimdmiscfp16_FZ\";\n\t\tcase ENC_FCMGE_ASIMDSAME_ONLY: return \"FCMGE_asimdsame_only\";\n\t\tcase ENC_FCMGE_ASIMDSAMEFP16_ONLY: return \"FCMGE_asimdsamefp16_only\";\n\t\tcase ENC_FCMGE_ASISDMISC_FZ: return \"FCMGE_asisdmisc_FZ\";\n\t\tcase ENC_FCMGE_ASISDMISCFP16_FZ: return \"FCMGE_asisdmiscfp16_FZ\";\n\t\tcase ENC_FCMGE_ASISDSAME_ONLY: return \"FCMGE_asisdsame_only\";\n\t\tcase ENC_FCMGE_ASISDSAMEFP16_ONLY: return \"FCMGE_asisdsamefp16_only\";\n\t\tcase ENC_FCMGT_ASIMDMISC_FZ: return \"FCMGT_asimdmisc_FZ\";\n\t\tcase ENC_FCMGT_ASIMDMISCFP16_FZ: return \"FCMGT_asimdmiscfp16_FZ\";\n\t\tcase ENC_FCMGT_ASIMDSAME_ONLY: return \"FCMGT_asimdsame_only\";\n\t\tcase ENC_FCMGT_ASIMDSAMEFP16_ONLY: return \"FCMGT_asimdsamefp16_only\";\n\t\tcase ENC_FCMGT_ASISDMISC_FZ: return \"FCMGT_asisdmisc_FZ\";\n\t\tcase ENC_FCMGT_ASISDMISCFP16_FZ: return \"FCMGT_asisdmiscfp16_FZ\";\n\t\tcase ENC_FCMGT_ASISDSAME_ONLY: return \"FCMGT_asisdsame_only\";\n\t\tcase ENC_FCMGT_ASISDSAMEFP16_ONLY: return \"FCMGT_asisdsamefp16_only\";\n\t\tcase ENC_FCMLA_ASIMDELEM_C_H: return \"FCMLA_asimdelem_C_H\";\n\t\tcase ENC_FCMLA_ASIMDELEM_C_S: return \"FCMLA_asimdelem_C_S\";\n\t\tcase ENC_FCMLA_ASIMDSAME2_C: return \"FCMLA_asimdsame2_C\";\n\t\tcase ENC_FCMLE_ASIMDMISC_FZ: return \"FCMLE_asimdmisc_FZ\";\n\t\tcase ENC_FCMLE_ASIMDMISCFP16_FZ: return \"FCMLE_asimdmiscfp16_FZ\";\n\t\tcase ENC_FCMLE_ASISDMISC_FZ: return \"FCMLE_asisdmisc_FZ\";\n\t\tcase ENC_FCMLE_ASISDMISCFP16_FZ: return \"FCMLE_asisdmiscfp16_FZ\";\n\t\tcase ENC_FCMLE_FCMGE_P_P_ZZ_: return \"FCMLE_fcmge_p_p_zz_\";\n\t\tcase ENC_FCMLT_ASIMDMISC_FZ: return \"FCMLT_asimdmisc_FZ\";\n\t\tcase ENC_FCMLT_ASIMDMISCFP16_FZ: return \"FCMLT_asimdmiscfp16_FZ\";\n\t\tcase ENC_FCMLT_ASISDMISC_FZ: return \"FCMLT_asisdmisc_FZ\";\n\t\tcase ENC_FCMLT_ASISDMISCFP16_FZ: return \"FCMLT_asisdmiscfp16_FZ\";\n\t\tcase ENC_FCMLT_FCMGT_P_P_ZZ_: return \"FCMLT_fcmgt_p_p_zz_\";\n\t\tcase ENC_FCMPE_DZ_FLOATCMP: return \"FCMPE_DZ_floatcmp\";\n\t\tcase ENC_FCMPE_D_FLOATCMP: return \"FCMPE_D_floatcmp\";\n\t\tcase ENC_FCMPE_HZ_FLOATCMP: return \"FCMPE_HZ_floatcmp\";\n\t\tcase ENC_FCMPE_H_FLOATCMP: return \"FCMPE_H_floatcmp\";\n\t\tcase ENC_FCMPE_SZ_FLOATCMP: return \"FCMPE_SZ_floatcmp\";\n\t\tcase ENC_FCMPE_S_FLOATCMP: return \"FCMPE_S_floatcmp\";\n\t\tcase ENC_FCMP_DZ_FLOATCMP: return \"FCMP_DZ_floatcmp\";\n\t\tcase ENC_FCMP_D_FLOATCMP: return \"FCMP_D_floatcmp\";\n\t\tcase ENC_FCMP_HZ_FLOATCMP: return \"FCMP_HZ_floatcmp\";\n\t\tcase ENC_FCMP_H_FLOATCMP: return \"FCMP_H_floatcmp\";\n\t\tcase ENC_FCMP_SZ_FLOATCMP: return \"FCMP_SZ_floatcmp\";\n\t\tcase ENC_FCMP_S_FLOATCMP: return \"FCMP_S_floatcmp\";\n\t\tcase ENC_FCSEL_D_FLOATSEL: return \"FCSEL_D_floatsel\";\n\t\tcase ENC_FCSEL_H_FLOATSEL: return \"FCSEL_H_floatsel\";\n\t\tcase ENC_FCSEL_S_FLOATSEL: return \"FCSEL_S_floatsel\";\n\t\tcase ENC_FCVTAS_32D_FLOAT2INT: return \"FCVTAS_32D_float2int\";\n\t\tcase ENC_FCVTAS_32H_FLOAT2INT: return \"FCVTAS_32H_float2int\";\n\t\tcase ENC_FCVTAS_32S_FLOAT2INT: return \"FCVTAS_32S_float2int\";\n\t\tcase ENC_FCVTAS_64D_FLOAT2INT: return \"FCVTAS_64D_float2int\";\n\t\tcase ENC_FCVTAS_64H_FLOAT2INT: return \"FCVTAS_64H_float2int\";\n\t\tcase ENC_FCVTAS_64S_FLOAT2INT: return \"FCVTAS_64S_float2int\";\n\t\tcase ENC_FCVTAS_ASIMDMISC_R: return \"FCVTAS_asimdmisc_R\";\n\t\tcase ENC_FCVTAS_ASIMDMISCFP16_R: return \"FCVTAS_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTAS_ASISDMISC_R: return \"FCVTAS_asisdmisc_R\";\n\t\tcase ENC_FCVTAS_ASISDMISCFP16_R: return \"FCVTAS_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTAU_32D_FLOAT2INT: return \"FCVTAU_32D_float2int\";\n\t\tcase ENC_FCVTAU_32H_FLOAT2INT: return \"FCVTAU_32H_float2int\";\n\t\tcase ENC_FCVTAU_32S_FLOAT2INT: return \"FCVTAU_32S_float2int\";\n\t\tcase ENC_FCVTAU_64D_FLOAT2INT: return \"FCVTAU_64D_float2int\";\n\t\tcase ENC_FCVTAU_64H_FLOAT2INT: return \"FCVTAU_64H_float2int\";\n\t\tcase ENC_FCVTAU_64S_FLOAT2INT: return \"FCVTAU_64S_float2int\";\n\t\tcase ENC_FCVTAU_ASIMDMISC_R: return \"FCVTAU_asimdmisc_R\";\n\t\tcase ENC_FCVTAU_ASIMDMISCFP16_R: return \"FCVTAU_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTAU_ASISDMISC_R: return \"FCVTAU_asisdmisc_R\";\n\t\tcase ENC_FCVTAU_ASISDMISCFP16_R: return \"FCVTAU_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTL_ASIMDMISC_L: return \"FCVTL_asimdmisc_L\";\n\t\tcase ENC_FCVTMS_32D_FLOAT2INT: return \"FCVTMS_32D_float2int\";\n\t\tcase ENC_FCVTMS_32H_FLOAT2INT: return \"FCVTMS_32H_float2int\";\n\t\tcase ENC_FCVTMS_32S_FLOAT2INT: return \"FCVTMS_32S_float2int\";\n\t\tcase ENC_FCVTMS_64D_FLOAT2INT: return \"FCVTMS_64D_float2int\";\n\t\tcase ENC_FCVTMS_64H_FLOAT2INT: return \"FCVTMS_64H_float2int\";\n\t\tcase ENC_FCVTMS_64S_FLOAT2INT: return \"FCVTMS_64S_float2int\";\n\t\tcase ENC_FCVTMS_ASIMDMISC_R: return \"FCVTMS_asimdmisc_R\";\n\t\tcase ENC_FCVTMS_ASIMDMISCFP16_R: return \"FCVTMS_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTMS_ASISDMISC_R: return \"FCVTMS_asisdmisc_R\";\n\t\tcase ENC_FCVTMS_ASISDMISCFP16_R: return \"FCVTMS_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTMU_32D_FLOAT2INT: return \"FCVTMU_32D_float2int\";\n\t\tcase ENC_FCVTMU_32H_FLOAT2INT: return \"FCVTMU_32H_float2int\";\n\t\tcase ENC_FCVTMU_32S_FLOAT2INT: return \"FCVTMU_32S_float2int\";\n\t\tcase ENC_FCVTMU_64D_FLOAT2INT: return \"FCVTMU_64D_float2int\";\n\t\tcase ENC_FCVTMU_64H_FLOAT2INT: return \"FCVTMU_64H_float2int\";\n\t\tcase ENC_FCVTMU_64S_FLOAT2INT: return \"FCVTMU_64S_float2int\";\n\t\tcase ENC_FCVTMU_ASIMDMISC_R: return \"FCVTMU_asimdmisc_R\";\n\t\tcase ENC_FCVTMU_ASIMDMISCFP16_R: return \"FCVTMU_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTMU_ASISDMISC_R: return \"FCVTMU_asisdmisc_R\";\n\t\tcase ENC_FCVTMU_ASISDMISCFP16_R: return \"FCVTMU_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTNS_32D_FLOAT2INT: return \"FCVTNS_32D_float2int\";\n\t\tcase ENC_FCVTNS_32H_FLOAT2INT: return \"FCVTNS_32H_float2int\";\n\t\tcase ENC_FCVTNS_32S_FLOAT2INT: return \"FCVTNS_32S_float2int\";\n\t\tcase ENC_FCVTNS_64D_FLOAT2INT: return \"FCVTNS_64D_float2int\";\n\t\tcase ENC_FCVTNS_64H_FLOAT2INT: return \"FCVTNS_64H_float2int\";\n\t\tcase ENC_FCVTNS_64S_FLOAT2INT: return \"FCVTNS_64S_float2int\";\n\t\tcase ENC_FCVTNS_ASIMDMISC_R: return \"FCVTNS_asimdmisc_R\";\n\t\tcase ENC_FCVTNS_ASIMDMISCFP16_R: return \"FCVTNS_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTNS_ASISDMISC_R: return \"FCVTNS_asisdmisc_R\";\n\t\tcase ENC_FCVTNS_ASISDMISCFP16_R: return \"FCVTNS_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTNU_32D_FLOAT2INT: return \"FCVTNU_32D_float2int\";\n\t\tcase ENC_FCVTNU_32H_FLOAT2INT: return \"FCVTNU_32H_float2int\";\n\t\tcase ENC_FCVTNU_32S_FLOAT2INT: return \"FCVTNU_32S_float2int\";\n\t\tcase ENC_FCVTNU_64D_FLOAT2INT: return \"FCVTNU_64D_float2int\";\n\t\tcase ENC_FCVTNU_64H_FLOAT2INT: return \"FCVTNU_64H_float2int\";\n\t\tcase ENC_FCVTNU_64S_FLOAT2INT: return \"FCVTNU_64S_float2int\";\n\t\tcase ENC_FCVTNU_ASIMDMISC_R: return \"FCVTNU_asimdmisc_R\";\n\t\tcase ENC_FCVTNU_ASIMDMISCFP16_R: return \"FCVTNU_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTNU_ASISDMISC_R: return \"FCVTNU_asisdmisc_R\";\n\t\tcase ENC_FCVTNU_ASISDMISCFP16_R: return \"FCVTNU_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTN_ASIMDMISC_N: return \"FCVTN_asimdmisc_N\";\n\t\tcase ENC_FCVTPS_32D_FLOAT2INT: return \"FCVTPS_32D_float2int\";\n\t\tcase ENC_FCVTPS_32H_FLOAT2INT: return \"FCVTPS_32H_float2int\";\n\t\tcase ENC_FCVTPS_32S_FLOAT2INT: return \"FCVTPS_32S_float2int\";\n\t\tcase ENC_FCVTPS_64D_FLOAT2INT: return \"FCVTPS_64D_float2int\";\n\t\tcase ENC_FCVTPS_64H_FLOAT2INT: return \"FCVTPS_64H_float2int\";\n\t\tcase ENC_FCVTPS_64S_FLOAT2INT: return \"FCVTPS_64S_float2int\";\n\t\tcase ENC_FCVTPS_ASIMDMISC_R: return \"FCVTPS_asimdmisc_R\";\n\t\tcase ENC_FCVTPS_ASIMDMISCFP16_R: return \"FCVTPS_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTPS_ASISDMISC_R: return \"FCVTPS_asisdmisc_R\";\n\t\tcase ENC_FCVTPS_ASISDMISCFP16_R: return \"FCVTPS_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTPU_32D_FLOAT2INT: return \"FCVTPU_32D_float2int\";\n\t\tcase ENC_FCVTPU_32H_FLOAT2INT: return \"FCVTPU_32H_float2int\";\n\t\tcase ENC_FCVTPU_32S_FLOAT2INT: return \"FCVTPU_32S_float2int\";\n\t\tcase ENC_FCVTPU_64D_FLOAT2INT: return \"FCVTPU_64D_float2int\";\n\t\tcase ENC_FCVTPU_64H_FLOAT2INT: return \"FCVTPU_64H_float2int\";\n\t\tcase ENC_FCVTPU_64S_FLOAT2INT: return \"FCVTPU_64S_float2int\";\n\t\tcase ENC_FCVTPU_ASIMDMISC_R: return \"FCVTPU_asimdmisc_R\";\n\t\tcase ENC_FCVTPU_ASIMDMISCFP16_R: return \"FCVTPU_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTPU_ASISDMISC_R: return \"FCVTPU_asisdmisc_R\";\n\t\tcase ENC_FCVTPU_ASISDMISCFP16_R: return \"FCVTPU_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTXN_ASIMDMISC_N: return \"FCVTXN_asimdmisc_N\";\n\t\tcase ENC_FCVTXN_ASISDMISC_N: return \"FCVTXN_asisdmisc_N\";\n\t\tcase ENC_FCVTZS_32D_FLOAT2FIX: return \"FCVTZS_32D_float2fix\";\n\t\tcase ENC_FCVTZS_32D_FLOAT2INT: return \"FCVTZS_32D_float2int\";\n\t\tcase ENC_FCVTZS_32H_FLOAT2FIX: return \"FCVTZS_32H_float2fix\";\n\t\tcase ENC_FCVTZS_32H_FLOAT2INT: return \"FCVTZS_32H_float2int\";\n\t\tcase ENC_FCVTZS_32S_FLOAT2FIX: return \"FCVTZS_32S_float2fix\";\n\t\tcase ENC_FCVTZS_32S_FLOAT2INT: return \"FCVTZS_32S_float2int\";\n\t\tcase ENC_FCVTZS_64D_FLOAT2FIX: return \"FCVTZS_64D_float2fix\";\n\t\tcase ENC_FCVTZS_64D_FLOAT2INT: return \"FCVTZS_64D_float2int\";\n\t\tcase ENC_FCVTZS_64H_FLOAT2FIX: return \"FCVTZS_64H_float2fix\";\n\t\tcase ENC_FCVTZS_64H_FLOAT2INT: return \"FCVTZS_64H_float2int\";\n\t\tcase ENC_FCVTZS_64S_FLOAT2FIX: return \"FCVTZS_64S_float2fix\";\n\t\tcase ENC_FCVTZS_64S_FLOAT2INT: return \"FCVTZS_64S_float2int\";\n\t\tcase ENC_FCVTZS_ASIMDMISC_R: return \"FCVTZS_asimdmisc_R\";\n\t\tcase ENC_FCVTZS_ASIMDMISCFP16_R: return \"FCVTZS_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTZS_ASIMDSHF_C: return \"FCVTZS_asimdshf_C\";\n\t\tcase ENC_FCVTZS_ASISDMISC_R: return \"FCVTZS_asisdmisc_R\";\n\t\tcase ENC_FCVTZS_ASISDMISCFP16_R: return \"FCVTZS_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTZS_ASISDSHF_C: return \"FCVTZS_asisdshf_C\";\n\t\tcase ENC_FCVTZU_32D_FLOAT2FIX: return \"FCVTZU_32D_float2fix\";\n\t\tcase ENC_FCVTZU_32D_FLOAT2INT: return \"FCVTZU_32D_float2int\";\n\t\tcase ENC_FCVTZU_32H_FLOAT2FIX: return \"FCVTZU_32H_float2fix\";\n\t\tcase ENC_FCVTZU_32H_FLOAT2INT: return \"FCVTZU_32H_float2int\";\n\t\tcase ENC_FCVTZU_32S_FLOAT2FIX: return \"FCVTZU_32S_float2fix\";\n\t\tcase ENC_FCVTZU_32S_FLOAT2INT: return \"FCVTZU_32S_float2int\";\n\t\tcase ENC_FCVTZU_64D_FLOAT2FIX: return \"FCVTZU_64D_float2fix\";\n\t\tcase ENC_FCVTZU_64D_FLOAT2INT: return \"FCVTZU_64D_float2int\";\n\t\tcase ENC_FCVTZU_64H_FLOAT2FIX: return \"FCVTZU_64H_float2fix\";\n\t\tcase ENC_FCVTZU_64H_FLOAT2INT: return \"FCVTZU_64H_float2int\";\n\t\tcase ENC_FCVTZU_64S_FLOAT2FIX: return \"FCVTZU_64S_float2fix\";\n\t\tcase ENC_FCVTZU_64S_FLOAT2INT: return \"FCVTZU_64S_float2int\";\n\t\tcase ENC_FCVTZU_ASIMDMISC_R: return \"FCVTZU_asimdmisc_R\";\n\t\tcase ENC_FCVTZU_ASIMDMISCFP16_R: return \"FCVTZU_asimdmiscfp16_R\";\n\t\tcase ENC_FCVTZU_ASIMDSHF_C: return \"FCVTZU_asimdshf_C\";\n\t\tcase ENC_FCVTZU_ASISDMISC_R: return \"FCVTZU_asisdmisc_R\";\n\t\tcase ENC_FCVTZU_ASISDMISCFP16_R: return \"FCVTZU_asisdmiscfp16_R\";\n\t\tcase ENC_FCVTZU_ASISDSHF_C: return \"FCVTZU_asisdshf_C\";\n\t\tcase ENC_FCVT_DH_FLOATDP1: return \"FCVT_DH_floatdp1\";\n\t\tcase ENC_FCVT_DS_FLOATDP1: return \"FCVT_DS_floatdp1\";\n\t\tcase ENC_FCVT_HD_FLOATDP1: return \"FCVT_HD_floatdp1\";\n\t\tcase ENC_FCVT_HS_FLOATDP1: return \"FCVT_HS_floatdp1\";\n\t\tcase ENC_FCVT_SD_FLOATDP1: return \"FCVT_SD_floatdp1\";\n\t\tcase ENC_FCVT_SH_FLOATDP1: return \"FCVT_SH_floatdp1\";\n\t\tcase ENC_FDIV_D_FLOATDP2: return \"FDIV_D_floatdp2\";\n\t\tcase ENC_FDIV_H_FLOATDP2: return \"FDIV_H_floatdp2\";\n\t\tcase ENC_FDIV_S_FLOATDP2: return \"FDIV_S_floatdp2\";\n\t\tcase ENC_FDIV_ASIMDSAME_ONLY: return \"FDIV_asimdsame_only\";\n\t\tcase ENC_FDIV_ASIMDSAMEFP16_ONLY: return \"FDIV_asimdsamefp16_only\";\n\t\tcase ENC_FJCVTZS_32D_FLOAT2INT: return \"FJCVTZS_32D_float2int\";\n\t\tcase ENC_FMADD_D_FLOATDP3: return \"FMADD_D_floatdp3\";\n\t\tcase ENC_FMADD_H_FLOATDP3: return \"FMADD_H_floatdp3\";\n\t\tcase ENC_FMADD_S_FLOATDP3: return \"FMADD_S_floatdp3\";\n\t\tcase ENC_FMAXNMP_ASIMDSAME_ONLY: return \"FMAXNMP_asimdsame_only\";\n\t\tcase ENC_FMAXNMP_ASIMDSAMEFP16_ONLY: return \"FMAXNMP_asimdsamefp16_only\";\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_H: return \"FMAXNMP_asisdpair_only_H\";\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_SD: return \"FMAXNMP_asisdpair_only_SD\";\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_H: return \"FMAXNMV_asimdall_only_H\";\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_SD: return \"FMAXNMV_asimdall_only_SD\";\n\t\tcase ENC_FMAXNM_D_FLOATDP2: return \"FMAXNM_D_floatdp2\";\n\t\tcase ENC_FMAXNM_H_FLOATDP2: return \"FMAXNM_H_floatdp2\";\n\t\tcase ENC_FMAXNM_S_FLOATDP2: return \"FMAXNM_S_floatdp2\";\n\t\tcase ENC_FMAXNM_ASIMDSAME_ONLY: return \"FMAXNM_asimdsame_only\";\n\t\tcase ENC_FMAXNM_ASIMDSAMEFP16_ONLY: return \"FMAXNM_asimdsamefp16_only\";\n\t\tcase ENC_FMAXP_ASIMDSAME_ONLY: return \"FMAXP_asimdsame_only\";\n\t\tcase ENC_FMAXP_ASIMDSAMEFP16_ONLY: return \"FMAXP_asimdsamefp16_only\";\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_H: return \"FMAXP_asisdpair_only_H\";\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_SD: return \"FMAXP_asisdpair_only_SD\";\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_H: return \"FMAXV_asimdall_only_H\";\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_SD: return \"FMAXV_asimdall_only_SD\";\n\t\tcase ENC_FMAX_D_FLOATDP2: return \"FMAX_D_floatdp2\";\n\t\tcase ENC_FMAX_H_FLOATDP2: return \"FMAX_H_floatdp2\";\n\t\tcase ENC_FMAX_S_FLOATDP2: return \"FMAX_S_floatdp2\";\n\t\tcase ENC_FMAX_ASIMDSAME_ONLY: return \"FMAX_asimdsame_only\";\n\t\tcase ENC_FMAX_ASIMDSAMEFP16_ONLY: return \"FMAX_asimdsamefp16_only\";\n\t\tcase ENC_FMINNMP_ASIMDSAME_ONLY: return \"FMINNMP_asimdsame_only\";\n\t\tcase ENC_FMINNMP_ASIMDSAMEFP16_ONLY: return \"FMINNMP_asimdsamefp16_only\";\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_H: return \"FMINNMP_asisdpair_only_H\";\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_SD: return \"FMINNMP_asisdpair_only_SD\";\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_H: return \"FMINNMV_asimdall_only_H\";\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_SD: return \"FMINNMV_asimdall_only_SD\";\n\t\tcase ENC_FMINNM_D_FLOATDP2: return \"FMINNM_D_floatdp2\";\n\t\tcase ENC_FMINNM_H_FLOATDP2: return \"FMINNM_H_floatdp2\";\n\t\tcase ENC_FMINNM_S_FLOATDP2: return \"FMINNM_S_floatdp2\";\n\t\tcase ENC_FMINNM_ASIMDSAME_ONLY: return \"FMINNM_asimdsame_only\";\n\t\tcase ENC_FMINNM_ASIMDSAMEFP16_ONLY: return \"FMINNM_asimdsamefp16_only\";\n\t\tcase ENC_FMINP_ASIMDSAME_ONLY: return \"FMINP_asimdsame_only\";\n\t\tcase ENC_FMINP_ASIMDSAMEFP16_ONLY: return \"FMINP_asimdsamefp16_only\";\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_H: return \"FMINP_asisdpair_only_H\";\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_SD: return \"FMINP_asisdpair_only_SD\";\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_H: return \"FMINV_asimdall_only_H\";\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_SD: return \"FMINV_asimdall_only_SD\";\n\t\tcase ENC_FMIN_D_FLOATDP2: return \"FMIN_D_floatdp2\";\n\t\tcase ENC_FMIN_H_FLOATDP2: return \"FMIN_H_floatdp2\";\n\t\tcase ENC_FMIN_S_FLOATDP2: return \"FMIN_S_floatdp2\";\n\t\tcase ENC_FMIN_ASIMDSAME_ONLY: return \"FMIN_asimdsame_only\";\n\t\tcase ENC_FMIN_ASIMDSAMEFP16_ONLY: return \"FMIN_asimdsamefp16_only\";\n\t\tcase ENC_FMLAL2_ASIMDELEM_LH: return \"FMLAL2_asimdelem_LH\";\n\t\tcase ENC_FMLAL2_ASIMDSAME_F: return \"FMLAL2_asimdsame_F\";\n\t\tcase ENC_FMLAL_ASIMDELEM_LH: return \"FMLAL_asimdelem_LH\";\n\t\tcase ENC_FMLAL_ASIMDSAME_F: return \"FMLAL_asimdsame_F\";\n\t\tcase ENC_FMLA_ASIMDELEM_RH_H: return \"FMLA_asimdelem_RH_H\";\n\t\tcase ENC_FMLA_ASIMDELEM_R_SD: return \"FMLA_asimdelem_R_SD\";\n\t\tcase ENC_FMLA_ASIMDSAME_ONLY: return \"FMLA_asimdsame_only\";\n\t\tcase ENC_FMLA_ASIMDSAMEFP16_ONLY: return \"FMLA_asimdsamefp16_only\";\n\t\tcase ENC_FMLA_ASISDELEM_RH_H: return \"FMLA_asisdelem_RH_H\";\n\t\tcase ENC_FMLA_ASISDELEM_R_SD: return \"FMLA_asisdelem_R_SD\";\n\t\tcase ENC_FMLSL2_ASIMDELEM_LH: return \"FMLSL2_asimdelem_LH\";\n\t\tcase ENC_FMLSL2_ASIMDSAME_F: return \"FMLSL2_asimdsame_F\";\n\t\tcase ENC_FMLSL_ASIMDELEM_LH: return \"FMLSL_asimdelem_LH\";\n\t\tcase ENC_FMLSL_ASIMDSAME_F: return \"FMLSL_asimdsame_F\";\n\t\tcase ENC_FMLS_ASIMDELEM_RH_H: return \"FMLS_asimdelem_RH_H\";\n\t\tcase ENC_FMLS_ASIMDELEM_R_SD: return \"FMLS_asimdelem_R_SD\";\n\t\tcase ENC_FMLS_ASIMDSAME_ONLY: return \"FMLS_asimdsame_only\";\n\t\tcase ENC_FMLS_ASIMDSAMEFP16_ONLY: return \"FMLS_asimdsamefp16_only\";\n\t\tcase ENC_FMLS_ASISDELEM_RH_H: return \"FMLS_asisdelem_RH_H\";\n\t\tcase ENC_FMLS_ASISDELEM_R_SD: return \"FMLS_asisdelem_R_SD\";\n\t\tcase ENC_FMOV_32H_FLOAT2INT: return \"FMOV_32H_float2int\";\n\t\tcase ENC_FMOV_32S_FLOAT2INT: return \"FMOV_32S_float2int\";\n\t\tcase ENC_FMOV_64D_FLOAT2INT: return \"FMOV_64D_float2int\";\n\t\tcase ENC_FMOV_64H_FLOAT2INT: return \"FMOV_64H_float2int\";\n\t\tcase ENC_FMOV_64VX_FLOAT2INT: return \"FMOV_64VX_float2int\";\n\t\tcase ENC_FMOV_D64_FLOAT2INT: return \"FMOV_D64_float2int\";\n\t\tcase ENC_FMOV_D_FLOATDP1: return \"FMOV_D_floatdp1\";\n\t\tcase ENC_FMOV_D_FLOATIMM: return \"FMOV_D_floatimm\";\n\t\tcase ENC_FMOV_H32_FLOAT2INT: return \"FMOV_H32_float2int\";\n\t\tcase ENC_FMOV_H64_FLOAT2INT: return \"FMOV_H64_float2int\";\n\t\tcase ENC_FMOV_H_FLOATDP1: return \"FMOV_H_floatdp1\";\n\t\tcase ENC_FMOV_H_FLOATIMM: return \"FMOV_H_floatimm\";\n\t\tcase ENC_FMOV_S32_FLOAT2INT: return \"FMOV_S32_float2int\";\n\t\tcase ENC_FMOV_S_FLOATDP1: return \"FMOV_S_floatdp1\";\n\t\tcase ENC_FMOV_S_FLOATIMM: return \"FMOV_S_floatimm\";\n\t\tcase ENC_FMOV_V64I_FLOAT2INT: return \"FMOV_V64I_float2int\";\n\t\tcase ENC_FMOV_ASIMDIMM_D2_D: return \"FMOV_asimdimm_D2_d\";\n\t\tcase ENC_FMOV_ASIMDIMM_H_H: return \"FMOV_asimdimm_H_h\";\n\t\tcase ENC_FMOV_ASIMDIMM_S_S: return \"FMOV_asimdimm_S_s\";\n\t\tcase ENC_FMOV_CPY_Z_P_I_: return \"FMOV_cpy_z_p_i_\";\n\t\tcase ENC_FMOV_DUP_Z_I_: return \"FMOV_dup_z_i_\";\n\t\tcase ENC_FMOV_FCPY_Z_P_I_: return \"FMOV_fcpy_z_p_i_\";\n\t\tcase ENC_FMOV_FDUP_Z_I_: return \"FMOV_fdup_z_i_\";\n\t\tcase ENC_FMSUB_D_FLOATDP3: return \"FMSUB_D_floatdp3\";\n\t\tcase ENC_FMSUB_H_FLOATDP3: return \"FMSUB_H_floatdp3\";\n\t\tcase ENC_FMSUB_S_FLOATDP3: return \"FMSUB_S_floatdp3\";\n\t\tcase ENC_FMULX_ASIMDELEM_RH_H: return \"FMULX_asimdelem_RH_H\";\n\t\tcase ENC_FMULX_ASIMDELEM_R_SD: return \"FMULX_asimdelem_R_SD\";\n\t\tcase ENC_FMULX_ASIMDSAME_ONLY: return \"FMULX_asimdsame_only\";\n\t\tcase ENC_FMULX_ASIMDSAMEFP16_ONLY: return \"FMULX_asimdsamefp16_only\";\n\t\tcase ENC_FMULX_ASISDELEM_RH_H: return \"FMULX_asisdelem_RH_H\";\n\t\tcase ENC_FMULX_ASISDELEM_R_SD: return \"FMULX_asisdelem_R_SD\";\n\t\tcase ENC_FMULX_ASISDSAME_ONLY: return \"FMULX_asisdsame_only\";\n\t\tcase ENC_FMULX_ASISDSAMEFP16_ONLY: return \"FMULX_asisdsamefp16_only\";\n\t\tcase ENC_FMUL_D_FLOATDP2: return \"FMUL_D_floatdp2\";\n\t\tcase ENC_FMUL_H_FLOATDP2: return \"FMUL_H_floatdp2\";\n\t\tcase ENC_FMUL_S_FLOATDP2: return \"FMUL_S_floatdp2\";\n\t\tcase ENC_FMUL_ASIMDELEM_RH_H: return \"FMUL_asimdelem_RH_H\";\n\t\tcase ENC_FMUL_ASIMDELEM_R_SD: return \"FMUL_asimdelem_R_SD\";\n\t\tcase ENC_FMUL_ASIMDSAME_ONLY: return \"FMUL_asimdsame_only\";\n\t\tcase ENC_FMUL_ASIMDSAMEFP16_ONLY: return \"FMUL_asimdsamefp16_only\";\n\t\tcase ENC_FMUL_ASISDELEM_RH_H: return \"FMUL_asisdelem_RH_H\";\n\t\tcase ENC_FMUL_ASISDELEM_R_SD: return \"FMUL_asisdelem_R_SD\";\n\t\tcase ENC_FNEG_D_FLOATDP1: return \"FNEG_D_floatdp1\";\n\t\tcase ENC_FNEG_H_FLOATDP1: return \"FNEG_H_floatdp1\";\n\t\tcase ENC_FNEG_S_FLOATDP1: return \"FNEG_S_floatdp1\";\n\t\tcase ENC_FNEG_ASIMDMISC_R: return \"FNEG_asimdmisc_R\";\n\t\tcase ENC_FNEG_ASIMDMISCFP16_R: return \"FNEG_asimdmiscfp16_R\";\n\t\tcase ENC_FNMADD_D_FLOATDP3: return \"FNMADD_D_floatdp3\";\n\t\tcase ENC_FNMADD_H_FLOATDP3: return \"FNMADD_H_floatdp3\";\n\t\tcase ENC_FNMADD_S_FLOATDP3: return \"FNMADD_S_floatdp3\";\n\t\tcase ENC_FNMSUB_D_FLOATDP3: return \"FNMSUB_D_floatdp3\";\n\t\tcase ENC_FNMSUB_H_FLOATDP3: return \"FNMSUB_H_floatdp3\";\n\t\tcase ENC_FNMSUB_S_FLOATDP3: return \"FNMSUB_S_floatdp3\";\n\t\tcase ENC_FNMUL_D_FLOATDP2: return \"FNMUL_D_floatdp2\";\n\t\tcase ENC_FNMUL_H_FLOATDP2: return \"FNMUL_H_floatdp2\";\n\t\tcase ENC_FNMUL_S_FLOATDP2: return \"FNMUL_S_floatdp2\";\n\t\tcase ENC_FRECPE_ASIMDMISC_R: return \"FRECPE_asimdmisc_R\";\n\t\tcase ENC_FRECPE_ASIMDMISCFP16_R: return \"FRECPE_asimdmiscfp16_R\";\n\t\tcase ENC_FRECPE_ASISDMISC_R: return \"FRECPE_asisdmisc_R\";\n\t\tcase ENC_FRECPE_ASISDMISCFP16_R: return \"FRECPE_asisdmiscfp16_R\";\n\t\tcase ENC_FRECPS_ASIMDSAME_ONLY: return \"FRECPS_asimdsame_only\";\n\t\tcase ENC_FRECPS_ASIMDSAMEFP16_ONLY: return \"FRECPS_asimdsamefp16_only\";\n\t\tcase ENC_FRECPS_ASISDSAME_ONLY: return \"FRECPS_asisdsame_only\";\n\t\tcase ENC_FRECPS_ASISDSAMEFP16_ONLY: return \"FRECPS_asisdsamefp16_only\";\n\t\tcase ENC_FRECPX_ASISDMISC_R: return \"FRECPX_asisdmisc_R\";\n\t\tcase ENC_FRECPX_ASISDMISCFP16_R: return \"FRECPX_asisdmiscfp16_R\";\n\t\tcase ENC_FRINT32X_D_FLOATDP1: return \"FRINT32X_D_floatdp1\";\n\t\tcase ENC_FRINT32X_S_FLOATDP1: return \"FRINT32X_S_floatdp1\";\n\t\tcase ENC_FRINT32X_ASIMDMISC_R: return \"FRINT32X_asimdmisc_R\";\n\t\tcase ENC_FRINT32Z_D_FLOATDP1: return \"FRINT32Z_D_floatdp1\";\n\t\tcase ENC_FRINT32Z_S_FLOATDP1: return \"FRINT32Z_S_floatdp1\";\n\t\tcase ENC_FRINT32Z_ASIMDMISC_R: return \"FRINT32Z_asimdmisc_R\";\n\t\tcase ENC_FRINT64X_D_FLOATDP1: return \"FRINT64X_D_floatdp1\";\n\t\tcase ENC_FRINT64X_S_FLOATDP1: return \"FRINT64X_S_floatdp1\";\n\t\tcase ENC_FRINT64X_ASIMDMISC_R: return \"FRINT64X_asimdmisc_R\";\n\t\tcase ENC_FRINT64Z_D_FLOATDP1: return \"FRINT64Z_D_floatdp1\";\n\t\tcase ENC_FRINT64Z_S_FLOATDP1: return \"FRINT64Z_S_floatdp1\";\n\t\tcase ENC_FRINT64Z_ASIMDMISC_R: return \"FRINT64Z_asimdmisc_R\";\n\t\tcase ENC_FRINTA_D_FLOATDP1: return \"FRINTA_D_floatdp1\";\n\t\tcase ENC_FRINTA_H_FLOATDP1: return \"FRINTA_H_floatdp1\";\n\t\tcase ENC_FRINTA_S_FLOATDP1: return \"FRINTA_S_floatdp1\";\n\t\tcase ENC_FRINTA_ASIMDMISC_R: return \"FRINTA_asimdmisc_R\";\n\t\tcase ENC_FRINTA_ASIMDMISCFP16_R: return \"FRINTA_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTI_D_FLOATDP1: return \"FRINTI_D_floatdp1\";\n\t\tcase ENC_FRINTI_H_FLOATDP1: return \"FRINTI_H_floatdp1\";\n\t\tcase ENC_FRINTI_S_FLOATDP1: return \"FRINTI_S_floatdp1\";\n\t\tcase ENC_FRINTI_ASIMDMISC_R: return \"FRINTI_asimdmisc_R\";\n\t\tcase ENC_FRINTI_ASIMDMISCFP16_R: return \"FRINTI_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTM_D_FLOATDP1: return \"FRINTM_D_floatdp1\";\n\t\tcase ENC_FRINTM_H_FLOATDP1: return \"FRINTM_H_floatdp1\";\n\t\tcase ENC_FRINTM_S_FLOATDP1: return \"FRINTM_S_floatdp1\";\n\t\tcase ENC_FRINTM_ASIMDMISC_R: return \"FRINTM_asimdmisc_R\";\n\t\tcase ENC_FRINTM_ASIMDMISCFP16_R: return \"FRINTM_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTN_D_FLOATDP1: return \"FRINTN_D_floatdp1\";\n\t\tcase ENC_FRINTN_H_FLOATDP1: return \"FRINTN_H_floatdp1\";\n\t\tcase ENC_FRINTN_S_FLOATDP1: return \"FRINTN_S_floatdp1\";\n\t\tcase ENC_FRINTN_ASIMDMISC_R: return \"FRINTN_asimdmisc_R\";\n\t\tcase ENC_FRINTN_ASIMDMISCFP16_R: return \"FRINTN_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTP_D_FLOATDP1: return \"FRINTP_D_floatdp1\";\n\t\tcase ENC_FRINTP_H_FLOATDP1: return \"FRINTP_H_floatdp1\";\n\t\tcase ENC_FRINTP_S_FLOATDP1: return \"FRINTP_S_floatdp1\";\n\t\tcase ENC_FRINTP_ASIMDMISC_R: return \"FRINTP_asimdmisc_R\";\n\t\tcase ENC_FRINTP_ASIMDMISCFP16_R: return \"FRINTP_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTX_D_FLOATDP1: return \"FRINTX_D_floatdp1\";\n\t\tcase ENC_FRINTX_H_FLOATDP1: return \"FRINTX_H_floatdp1\";\n\t\tcase ENC_FRINTX_S_FLOATDP1: return \"FRINTX_S_floatdp1\";\n\t\tcase ENC_FRINTX_ASIMDMISC_R: return \"FRINTX_asimdmisc_R\";\n\t\tcase ENC_FRINTX_ASIMDMISCFP16_R: return \"FRINTX_asimdmiscfp16_R\";\n\t\tcase ENC_FRINTZ_D_FLOATDP1: return \"FRINTZ_D_floatdp1\";\n\t\tcase ENC_FRINTZ_H_FLOATDP1: return \"FRINTZ_H_floatdp1\";\n\t\tcase ENC_FRINTZ_S_FLOATDP1: return \"FRINTZ_S_floatdp1\";\n\t\tcase ENC_FRINTZ_ASIMDMISC_R: return \"FRINTZ_asimdmisc_R\";\n\t\tcase ENC_FRINTZ_ASIMDMISCFP16_R: return \"FRINTZ_asimdmiscfp16_R\";\n\t\tcase ENC_FRSQRTE_ASIMDMISC_R: return \"FRSQRTE_asimdmisc_R\";\n\t\tcase ENC_FRSQRTE_ASIMDMISCFP16_R: return \"FRSQRTE_asimdmiscfp16_R\";\n\t\tcase ENC_FRSQRTE_ASISDMISC_R: return \"FRSQRTE_asisdmisc_R\";\n\t\tcase ENC_FRSQRTE_ASISDMISCFP16_R: return \"FRSQRTE_asisdmiscfp16_R\";\n\t\tcase ENC_FRSQRTS_ASIMDSAME_ONLY: return \"FRSQRTS_asimdsame_only\";\n\t\tcase ENC_FRSQRTS_ASIMDSAMEFP16_ONLY: return \"FRSQRTS_asimdsamefp16_only\";\n\t\tcase ENC_FRSQRTS_ASISDSAME_ONLY: return \"FRSQRTS_asisdsame_only\";\n\t\tcase ENC_FRSQRTS_ASISDSAMEFP16_ONLY: return \"FRSQRTS_asisdsamefp16_only\";\n\t\tcase ENC_FSQRT_D_FLOATDP1: return \"FSQRT_D_floatdp1\";\n\t\tcase ENC_FSQRT_H_FLOATDP1: return \"FSQRT_H_floatdp1\";\n\t\tcase ENC_FSQRT_S_FLOATDP1: return \"FSQRT_S_floatdp1\";\n\t\tcase ENC_FSQRT_ASIMDMISC_R: return \"FSQRT_asimdmisc_R\";\n\t\tcase ENC_FSQRT_ASIMDMISCFP16_R: return \"FSQRT_asimdmiscfp16_R\";\n\t\tcase ENC_FSUB_D_FLOATDP2: return \"FSUB_D_floatdp2\";\n\t\tcase ENC_FSUB_H_FLOATDP2: return \"FSUB_H_floatdp2\";\n\t\tcase ENC_FSUB_S_FLOATDP2: return \"FSUB_S_floatdp2\";\n\t\tcase ENC_FSUB_ASIMDSAME_ONLY: return \"FSUB_asimdsame_only\";\n\t\tcase ENC_FSUB_ASIMDSAMEFP16_ONLY: return \"FSUB_asimdsamefp16_only\";\n\t\tcase ENC_GMI_64G_DP_2SRC: return \"GMI_64G_dp_2src\";\n\t\tcase ENC_HINT_HM_HINTS: return \"HINT_HM_hints\";\n\t\tcase ENC_HLT_EX_EXCEPTION: return \"HLT_EX_exception\";\n\t\tcase ENC_HVC_EX_EXCEPTION: return \"HVC_EX_exception\";\n\t\tcase ENC_IC_SYS_CR_SYSTEMINSTRS: return \"IC_SYS_CR_systeminstrs\";\n\t\tcase ENC_INS_ASIMDINS_IR_R: return \"INS_asimdins_IR_r\";\n\t\tcase ENC_INS_ASIMDINS_IV_V: return \"INS_asimdins_IV_v\";\n\t\tcase ENC_IRG_64I_DP_2SRC: return \"IRG_64I_dp_2src\";\n\t\tcase ENC_ISB_BI_BARRIERS: return \"ISB_BI_barriers\";\n\t\tcase ENC_LD1R_ASISDLSO_R1: return \"LD1R_asisdlso_R1\";\n\t\tcase ENC_LD1R_ASISDLSOP_R1_I: return \"LD1R_asisdlsop_R1_i\";\n\t\tcase ENC_LD1R_ASISDLSOP_RX1_R: return \"LD1R_asisdlsop_RX1_r\";\n\t\tcase ENC_LD1_ASISDLSE_R1_1V: return \"LD1_asisdlse_R1_1v\";\n\t\tcase ENC_LD1_ASISDLSE_R2_2V: return \"LD1_asisdlse_R2_2v\";\n\t\tcase ENC_LD1_ASISDLSE_R3_3V: return \"LD1_asisdlse_R3_3v\";\n\t\tcase ENC_LD1_ASISDLSE_R4_4V: return \"LD1_asisdlse_R4_4v\";\n\t\tcase ENC_LD1_ASISDLSEP_I1_I1: return \"LD1_asisdlsep_I1_i1\";\n\t\tcase ENC_LD1_ASISDLSEP_I2_I2: return \"LD1_asisdlsep_I2_i2\";\n\t\tcase ENC_LD1_ASISDLSEP_I3_I3: return \"LD1_asisdlsep_I3_i3\";\n\t\tcase ENC_LD1_ASISDLSEP_I4_I4: return \"LD1_asisdlsep_I4_i4\";\n\t\tcase ENC_LD1_ASISDLSEP_R1_R1: return \"LD1_asisdlsep_R1_r1\";\n\t\tcase ENC_LD1_ASISDLSEP_R2_R2: return \"LD1_asisdlsep_R2_r2\";\n\t\tcase ENC_LD1_ASISDLSEP_R3_R3: return \"LD1_asisdlsep_R3_r3\";\n\t\tcase ENC_LD1_ASISDLSEP_R4_R4: return \"LD1_asisdlsep_R4_r4\";\n\t\tcase ENC_LD1_ASISDLSO_B1_1B: return \"LD1_asisdlso_B1_1b\";\n\t\tcase ENC_LD1_ASISDLSO_D1_1D: return \"LD1_asisdlso_D1_1d\";\n\t\tcase ENC_LD1_ASISDLSO_H1_1H: return \"LD1_asisdlso_H1_1h\";\n\t\tcase ENC_LD1_ASISDLSO_S1_1S: return \"LD1_asisdlso_S1_1s\";\n\t\tcase ENC_LD1_ASISDLSOP_B1_I1B: return \"LD1_asisdlsop_B1_i1b\";\n\t\tcase ENC_LD1_ASISDLSOP_BX1_R1B: return \"LD1_asisdlsop_BX1_r1b\";\n\t\tcase ENC_LD1_ASISDLSOP_D1_I1D: return \"LD1_asisdlsop_D1_i1d\";\n\t\tcase ENC_LD1_ASISDLSOP_DX1_R1D: return \"LD1_asisdlsop_DX1_r1d\";\n\t\tcase ENC_LD1_ASISDLSOP_H1_I1H: return \"LD1_asisdlsop_H1_i1h\";\n\t\tcase ENC_LD1_ASISDLSOP_HX1_R1H: return \"LD1_asisdlsop_HX1_r1h\";\n\t\tcase ENC_LD1_ASISDLSOP_S1_I1S: return \"LD1_asisdlsop_S1_i1s\";\n\t\tcase ENC_LD1_ASISDLSOP_SX1_R1S: return \"LD1_asisdlsop_SX1_r1s\";\n\t\tcase ENC_LD2R_ASISDLSO_R2: return \"LD2R_asisdlso_R2\";\n\t\tcase ENC_LD2R_ASISDLSOP_R2_I: return \"LD2R_asisdlsop_R2_i\";\n\t\tcase ENC_LD2R_ASISDLSOP_RX2_R: return \"LD2R_asisdlsop_RX2_r\";\n\t\tcase ENC_LD2_ASISDLSE_R2: return \"LD2_asisdlse_R2\";\n\t\tcase ENC_LD2_ASISDLSEP_I2_I: return \"LD2_asisdlsep_I2_i\";\n\t\tcase ENC_LD2_ASISDLSEP_R2_R: return \"LD2_asisdlsep_R2_r\";\n\t\tcase ENC_LD2_ASISDLSO_B2_2B: return \"LD2_asisdlso_B2_2b\";\n\t\tcase ENC_LD2_ASISDLSO_D2_2D: return \"LD2_asisdlso_D2_2d\";\n\t\tcase ENC_LD2_ASISDLSO_H2_2H: return \"LD2_asisdlso_H2_2h\";\n\t\tcase ENC_LD2_ASISDLSO_S2_2S: return \"LD2_asisdlso_S2_2s\";\n\t\tcase ENC_LD2_ASISDLSOP_B2_I2B: return \"LD2_asisdlsop_B2_i2b\";\n\t\tcase ENC_LD2_ASISDLSOP_BX2_R2B: return \"LD2_asisdlsop_BX2_r2b\";\n\t\tcase ENC_LD2_ASISDLSOP_D2_I2D: return \"LD2_asisdlsop_D2_i2d\";\n\t\tcase ENC_LD2_ASISDLSOP_DX2_R2D: return \"LD2_asisdlsop_DX2_r2d\";\n\t\tcase ENC_LD2_ASISDLSOP_H2_I2H: return \"LD2_asisdlsop_H2_i2h\";\n\t\tcase ENC_LD2_ASISDLSOP_HX2_R2H: return \"LD2_asisdlsop_HX2_r2h\";\n\t\tcase ENC_LD2_ASISDLSOP_S2_I2S: return \"LD2_asisdlsop_S2_i2s\";\n\t\tcase ENC_LD2_ASISDLSOP_SX2_R2S: return \"LD2_asisdlsop_SX2_r2s\";\n\t\tcase ENC_LD3R_ASISDLSO_R3: return \"LD3R_asisdlso_R3\";\n\t\tcase ENC_LD3R_ASISDLSOP_R3_I: return \"LD3R_asisdlsop_R3_i\";\n\t\tcase ENC_LD3R_ASISDLSOP_RX3_R: return \"LD3R_asisdlsop_RX3_r\";\n\t\tcase ENC_LD3_ASISDLSE_R3: return \"LD3_asisdlse_R3\";\n\t\tcase ENC_LD3_ASISDLSEP_I3_I: return \"LD3_asisdlsep_I3_i\";\n\t\tcase ENC_LD3_ASISDLSEP_R3_R: return \"LD3_asisdlsep_R3_r\";\n\t\tcase ENC_LD3_ASISDLSO_B3_3B: return \"LD3_asisdlso_B3_3b\";\n\t\tcase ENC_LD3_ASISDLSO_D3_3D: return \"LD3_asisdlso_D3_3d\";\n\t\tcase ENC_LD3_ASISDLSO_H3_3H: return \"LD3_asisdlso_H3_3h\";\n\t\tcase ENC_LD3_ASISDLSO_S3_3S: return \"LD3_asisdlso_S3_3s\";\n\t\tcase ENC_LD3_ASISDLSOP_B3_I3B: return \"LD3_asisdlsop_B3_i3b\";\n\t\tcase ENC_LD3_ASISDLSOP_BX3_R3B: return \"LD3_asisdlsop_BX3_r3b\";\n\t\tcase ENC_LD3_ASISDLSOP_D3_I3D: return \"LD3_asisdlsop_D3_i3d\";\n\t\tcase ENC_LD3_ASISDLSOP_DX3_R3D: return \"LD3_asisdlsop_DX3_r3d\";\n\t\tcase ENC_LD3_ASISDLSOP_H3_I3H: return \"LD3_asisdlsop_H3_i3h\";\n\t\tcase ENC_LD3_ASISDLSOP_HX3_R3H: return \"LD3_asisdlsop_HX3_r3h\";\n\t\tcase ENC_LD3_ASISDLSOP_S3_I3S: return \"LD3_asisdlsop_S3_i3s\";\n\t\tcase ENC_LD3_ASISDLSOP_SX3_R3S: return \"LD3_asisdlsop_SX3_r3s\";\n\t\tcase ENC_LD4R_ASISDLSO_R4: return \"LD4R_asisdlso_R4\";\n\t\tcase ENC_LD4R_ASISDLSOP_R4_I: return \"LD4R_asisdlsop_R4_i\";\n\t\tcase ENC_LD4R_ASISDLSOP_RX4_R: return \"LD4R_asisdlsop_RX4_r\";\n\t\tcase ENC_LD4_ASISDLSE_R4: return \"LD4_asisdlse_R4\";\n\t\tcase ENC_LD4_ASISDLSEP_I4_I: return \"LD4_asisdlsep_I4_i\";\n\t\tcase ENC_LD4_ASISDLSEP_R4_R: return \"LD4_asisdlsep_R4_r\";\n\t\tcase ENC_LD4_ASISDLSO_B4_4B: return \"LD4_asisdlso_B4_4b\";\n\t\tcase ENC_LD4_ASISDLSO_D4_4D: return \"LD4_asisdlso_D4_4d\";\n\t\tcase ENC_LD4_ASISDLSO_H4_4H: return \"LD4_asisdlso_H4_4h\";\n\t\tcase ENC_LD4_ASISDLSO_S4_4S: return \"LD4_asisdlso_S4_4s\";\n\t\tcase ENC_LD4_ASISDLSOP_B4_I4B: return \"LD4_asisdlsop_B4_i4b\";\n\t\tcase ENC_LD4_ASISDLSOP_BX4_R4B: return \"LD4_asisdlsop_BX4_r4b\";\n\t\tcase ENC_LD4_ASISDLSOP_D4_I4D: return \"LD4_asisdlsop_D4_i4d\";\n\t\tcase ENC_LD4_ASISDLSOP_DX4_R4D: return \"LD4_asisdlsop_DX4_r4d\";\n\t\tcase ENC_LD4_ASISDLSOP_H4_I4H: return \"LD4_asisdlsop_H4_i4h\";\n\t\tcase ENC_LD4_ASISDLSOP_HX4_R4H: return \"LD4_asisdlsop_HX4_r4h\";\n\t\tcase ENC_LD4_ASISDLSOP_S4_I4S: return \"LD4_asisdlsop_S4_i4s\";\n\t\tcase ENC_LD4_ASISDLSOP_SX4_R4S: return \"LD4_asisdlsop_SX4_r4s\";\n\t\tcase ENC_LD64B_64L_MEMOP: return \"LD64B_64L_memop\";\n\t\tcase ENC_LDADDAB_32_MEMOP: return \"LDADDAB_32_memop\";\n\t\tcase ENC_LDADDAH_32_MEMOP: return \"LDADDAH_32_memop\";\n\t\tcase ENC_LDADDALB_32_MEMOP: return \"LDADDALB_32_memop\";\n\t\tcase ENC_LDADDALH_32_MEMOP: return \"LDADDALH_32_memop\";\n\t\tcase ENC_LDADDAL_32_MEMOP: return \"LDADDAL_32_memop\";\n\t\tcase ENC_LDADDAL_64_MEMOP: return \"LDADDAL_64_memop\";\n\t\tcase ENC_LDADDA_32_MEMOP: return \"LDADDA_32_memop\";\n\t\tcase ENC_LDADDA_64_MEMOP: return \"LDADDA_64_memop\";\n\t\tcase ENC_LDADDB_32_MEMOP: return \"LDADDB_32_memop\";\n\t\tcase ENC_LDADDH_32_MEMOP: return \"LDADDH_32_memop\";\n\t\tcase ENC_LDADDLB_32_MEMOP: return \"LDADDLB_32_memop\";\n\t\tcase ENC_LDADDLH_32_MEMOP: return \"LDADDLH_32_memop\";\n\t\tcase ENC_LDADDL_32_MEMOP: return \"LDADDL_32_memop\";\n\t\tcase ENC_LDADDL_64_MEMOP: return \"LDADDL_64_memop\";\n\t\tcase ENC_LDADD_32_MEMOP: return \"LDADD_32_memop\";\n\t\tcase ENC_LDADD_64_MEMOP: return \"LDADD_64_memop\";\n\t\tcase ENC_LDAPRB_32L_MEMOP: return \"LDAPRB_32L_memop\";\n\t\tcase ENC_LDAPRH_32L_MEMOP: return \"LDAPRH_32L_memop\";\n\t\tcase ENC_LDAPR_32L_MEMOP: return \"LDAPR_32L_memop\";\n\t\tcase ENC_LDAPR_64L_MEMOP: return \"LDAPR_64L_memop\";\n\t\tcase ENC_LDAPURB_32_LDAPSTL_UNSCALED: return \"LDAPURB_32_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURH_32_LDAPSTL_UNSCALED: return \"LDAPURH_32_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURSB_32_LDAPSTL_UNSCALED: return \"LDAPURSB_32_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURSB_64_LDAPSTL_UNSCALED: return \"LDAPURSB_64_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURSH_32_LDAPSTL_UNSCALED: return \"LDAPURSH_32_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURSH_64_LDAPSTL_UNSCALED: return \"LDAPURSH_64_ldapstl_unscaled\";\n\t\tcase ENC_LDAPURSW_64_LDAPSTL_UNSCALED: return \"LDAPURSW_64_ldapstl_unscaled\";\n\t\tcase ENC_LDAPUR_32_LDAPSTL_UNSCALED: return \"LDAPUR_32_ldapstl_unscaled\";\n\t\tcase ENC_LDAPUR_64_LDAPSTL_UNSCALED: return \"LDAPUR_64_ldapstl_unscaled\";\n\t\tcase ENC_LDARB_LR32_LDSTORD: return \"LDARB_LR32_ldstord\";\n\t\tcase ENC_LDARH_LR32_LDSTORD: return \"LDARH_LR32_ldstord\";\n\t\tcase ENC_LDAR_LR32_LDSTORD: return \"LDAR_LR32_ldstord\";\n\t\tcase ENC_LDAR_LR64_LDSTORD: return \"LDAR_LR64_ldstord\";\n\t\tcase ENC_LDAXP_LP32_LDSTEXCLP: return \"LDAXP_LP32_ldstexclp\";\n\t\tcase ENC_LDAXP_LP64_LDSTEXCLP: return \"LDAXP_LP64_ldstexclp\";\n\t\tcase ENC_LDAXRB_LR32_LDSTEXCLR: return \"LDAXRB_LR32_ldstexclr\";\n\t\tcase ENC_LDAXRH_LR32_LDSTEXCLR: return \"LDAXRH_LR32_ldstexclr\";\n\t\tcase ENC_LDAXR_LR32_LDSTEXCLR: return \"LDAXR_LR32_ldstexclr\";\n\t\tcase ENC_LDAXR_LR64_LDSTEXCLR: return \"LDAXR_LR64_ldstexclr\";\n\t\tcase ENC_LDCLRAB_32_MEMOP: return \"LDCLRAB_32_memop\";\n\t\tcase ENC_LDCLRAH_32_MEMOP: return \"LDCLRAH_32_memop\";\n\t\tcase ENC_LDCLRALB_32_MEMOP: return \"LDCLRALB_32_memop\";\n\t\tcase ENC_LDCLRALH_32_MEMOP: return \"LDCLRALH_32_memop\";\n\t\tcase ENC_LDCLRAL_32_MEMOP: return \"LDCLRAL_32_memop\";\n\t\tcase ENC_LDCLRAL_64_MEMOP: return \"LDCLRAL_64_memop\";\n\t\tcase ENC_LDCLRA_32_MEMOP: return \"LDCLRA_32_memop\";\n\t\tcase ENC_LDCLRA_64_MEMOP: return \"LDCLRA_64_memop\";\n\t\tcase ENC_LDCLRB_32_MEMOP: return \"LDCLRB_32_memop\";\n\t\tcase ENC_LDCLRH_32_MEMOP: return \"LDCLRH_32_memop\";\n\t\tcase ENC_LDCLRLB_32_MEMOP: return \"LDCLRLB_32_memop\";\n\t\tcase ENC_LDCLRLH_32_MEMOP: return \"LDCLRLH_32_memop\";\n\t\tcase ENC_LDCLRL_32_MEMOP: return \"LDCLRL_32_memop\";\n\t\tcase ENC_LDCLRL_64_MEMOP: return \"LDCLRL_64_memop\";\n\t\tcase ENC_LDCLR_32_MEMOP: return \"LDCLR_32_memop\";\n\t\tcase ENC_LDCLR_64_MEMOP: return \"LDCLR_64_memop\";\n\t\tcase ENC_LDEORAB_32_MEMOP: return \"LDEORAB_32_memop\";\n\t\tcase ENC_LDEORAH_32_MEMOP: return \"LDEORAH_32_memop\";\n\t\tcase ENC_LDEORALB_32_MEMOP: return \"LDEORALB_32_memop\";\n\t\tcase ENC_LDEORALH_32_MEMOP: return \"LDEORALH_32_memop\";\n\t\tcase ENC_LDEORAL_32_MEMOP: return \"LDEORAL_32_memop\";\n\t\tcase ENC_LDEORAL_64_MEMOP: return \"LDEORAL_64_memop\";\n\t\tcase ENC_LDEORA_32_MEMOP: return \"LDEORA_32_memop\";\n\t\tcase ENC_LDEORA_64_MEMOP: return \"LDEORA_64_memop\";\n\t\tcase ENC_LDEORB_32_MEMOP: return \"LDEORB_32_memop\";\n\t\tcase ENC_LDEORH_32_MEMOP: return \"LDEORH_32_memop\";\n\t\tcase ENC_LDEORLB_32_MEMOP: return \"LDEORLB_32_memop\";\n\t\tcase ENC_LDEORLH_32_MEMOP: return \"LDEORLH_32_memop\";\n\t\tcase ENC_LDEORL_32_MEMOP: return \"LDEORL_32_memop\";\n\t\tcase ENC_LDEORL_64_MEMOP: return \"LDEORL_64_memop\";\n\t\tcase ENC_LDEOR_32_MEMOP: return \"LDEOR_32_memop\";\n\t\tcase ENC_LDEOR_64_MEMOP: return \"LDEOR_64_memop\";\n\t\tcase ENC_LDGM_64BULK_LDSTTAGS: return \"LDGM_64bulk_ldsttags\";\n\t\tcase ENC_LDG_64LOFFSET_LDSTTAGS: return \"LDG_64Loffset_ldsttags\";\n\t\tcase ENC_LDLARB_LR32_LDSTORD: return \"LDLARB_LR32_ldstord\";\n\t\tcase ENC_LDLARH_LR32_LDSTORD: return \"LDLARH_LR32_ldstord\";\n\t\tcase ENC_LDLAR_LR32_LDSTORD: return \"LDLAR_LR32_ldstord\";\n\t\tcase ENC_LDLAR_LR64_LDSTORD: return \"LDLAR_LR64_ldstord\";\n\t\tcase ENC_LDNP_32_LDSTNAPAIR_OFFS: return \"LDNP_32_ldstnapair_offs\";\n\t\tcase ENC_LDNP_64_LDSTNAPAIR_OFFS: return \"LDNP_64_ldstnapair_offs\";\n\t\tcase ENC_LDNP_D_LDSTNAPAIR_OFFS: return \"LDNP_D_ldstnapair_offs\";\n\t\tcase ENC_LDNP_Q_LDSTNAPAIR_OFFS: return \"LDNP_Q_ldstnapair_offs\";\n\t\tcase ENC_LDNP_S_LDSTNAPAIR_OFFS: return \"LDNP_S_ldstnapair_offs\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_OFF: return \"LDPSW_64_ldstpair_off\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_POST: return \"LDPSW_64_ldstpair_post\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_PRE: return \"LDPSW_64_ldstpair_pre\";\n\t\tcase ENC_LDP_32_LDSTPAIR_OFF: return \"LDP_32_ldstpair_off\";\n\t\tcase ENC_LDP_32_LDSTPAIR_POST: return \"LDP_32_ldstpair_post\";\n\t\tcase ENC_LDP_32_LDSTPAIR_PRE: return \"LDP_32_ldstpair_pre\";\n\t\tcase ENC_LDP_64_LDSTPAIR_OFF: return \"LDP_64_ldstpair_off\";\n\t\tcase ENC_LDP_64_LDSTPAIR_POST: return \"LDP_64_ldstpair_post\";\n\t\tcase ENC_LDP_64_LDSTPAIR_PRE: return \"LDP_64_ldstpair_pre\";\n\t\tcase ENC_LDP_D_LDSTPAIR_OFF: return \"LDP_D_ldstpair_off\";\n\t\tcase ENC_LDP_D_LDSTPAIR_POST: return \"LDP_D_ldstpair_post\";\n\t\tcase ENC_LDP_D_LDSTPAIR_PRE: return \"LDP_D_ldstpair_pre\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_OFF: return \"LDP_Q_ldstpair_off\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_POST: return \"LDP_Q_ldstpair_post\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_PRE: return \"LDP_Q_ldstpair_pre\";\n\t\tcase ENC_LDP_S_LDSTPAIR_OFF: return \"LDP_S_ldstpair_off\";\n\t\tcase ENC_LDP_S_LDSTPAIR_POST: return \"LDP_S_ldstpair_post\";\n\t\tcase ENC_LDP_S_LDSTPAIR_PRE: return \"LDP_S_ldstpair_pre\";\n\t\tcase ENC_LDRAA_64W_LDST_PAC: return \"LDRAA_64W_ldst_pac\";\n\t\tcase ENC_LDRAA_64_LDST_PAC: return \"LDRAA_64_ldst_pac\";\n\t\tcase ENC_LDRAB_64W_LDST_PAC: return \"LDRAB_64W_ldst_pac\";\n\t\tcase ENC_LDRAB_64_LDST_PAC: return \"LDRAB_64_ldst_pac\";\n\t\tcase ENC_LDRB_32BL_LDST_REGOFF: return \"LDRB_32BL_ldst_regoff\";\n\t\tcase ENC_LDRB_32B_LDST_REGOFF: return \"LDRB_32B_ldst_regoff\";\n\t\tcase ENC_LDRB_32_LDST_IMMPOST: return \"LDRB_32_ldst_immpost\";\n\t\tcase ENC_LDRB_32_LDST_IMMPRE: return \"LDRB_32_ldst_immpre\";\n\t\tcase ENC_LDRB_32_LDST_POS: return \"LDRB_32_ldst_pos\";\n\t\tcase ENC_LDRH_32_LDST_IMMPOST: return \"LDRH_32_ldst_immpost\";\n\t\tcase ENC_LDRH_32_LDST_IMMPRE: return \"LDRH_32_ldst_immpre\";\n\t\tcase ENC_LDRH_32_LDST_POS: return \"LDRH_32_ldst_pos\";\n\t\tcase ENC_LDRH_32_LDST_REGOFF: return \"LDRH_32_ldst_regoff\";\n\t\tcase ENC_LDRSB_32BL_LDST_REGOFF: return \"LDRSB_32BL_ldst_regoff\";\n\t\tcase ENC_LDRSB_32B_LDST_REGOFF: return \"LDRSB_32B_ldst_regoff\";\n\t\tcase ENC_LDRSB_32_LDST_IMMPOST: return \"LDRSB_32_ldst_immpost\";\n\t\tcase ENC_LDRSB_32_LDST_IMMPRE: return \"LDRSB_32_ldst_immpre\";\n\t\tcase ENC_LDRSB_32_LDST_POS: return \"LDRSB_32_ldst_pos\";\n\t\tcase ENC_LDRSB_64BL_LDST_REGOFF: return \"LDRSB_64BL_ldst_regoff\";\n\t\tcase ENC_LDRSB_64B_LDST_REGOFF: return \"LDRSB_64B_ldst_regoff\";\n\t\tcase ENC_LDRSB_64_LDST_IMMPOST: return \"LDRSB_64_ldst_immpost\";\n\t\tcase ENC_LDRSB_64_LDST_IMMPRE: return \"LDRSB_64_ldst_immpre\";\n\t\tcase ENC_LDRSB_64_LDST_POS: return \"LDRSB_64_ldst_pos\";\n\t\tcase ENC_LDRSH_32_LDST_IMMPOST: return \"LDRSH_32_ldst_immpost\";\n\t\tcase ENC_LDRSH_32_LDST_IMMPRE: return \"LDRSH_32_ldst_immpre\";\n\t\tcase ENC_LDRSH_32_LDST_POS: return \"LDRSH_32_ldst_pos\";\n\t\tcase ENC_LDRSH_32_LDST_REGOFF: return \"LDRSH_32_ldst_regoff\";\n\t\tcase ENC_LDRSH_64_LDST_IMMPOST: return \"LDRSH_64_ldst_immpost\";\n\t\tcase ENC_LDRSH_64_LDST_IMMPRE: return \"LDRSH_64_ldst_immpre\";\n\t\tcase ENC_LDRSH_64_LDST_POS: return \"LDRSH_64_ldst_pos\";\n\t\tcase ENC_LDRSH_64_LDST_REGOFF: return \"LDRSH_64_ldst_regoff\";\n\t\tcase ENC_LDRSW_64_LDST_IMMPOST: return \"LDRSW_64_ldst_immpost\";\n\t\tcase ENC_LDRSW_64_LDST_IMMPRE: return \"LDRSW_64_ldst_immpre\";\n\t\tcase ENC_LDRSW_64_LDST_POS: return \"LDRSW_64_ldst_pos\";\n\t\tcase ENC_LDRSW_64_LDST_REGOFF: return \"LDRSW_64_ldst_regoff\";\n\t\tcase ENC_LDRSW_64_LOADLIT: return \"LDRSW_64_loadlit\";\n\t\tcase ENC_LDR_32_LDST_IMMPOST: return \"LDR_32_ldst_immpost\";\n\t\tcase ENC_LDR_32_LDST_IMMPRE: return \"LDR_32_ldst_immpre\";\n\t\tcase ENC_LDR_32_LDST_POS: return \"LDR_32_ldst_pos\";\n\t\tcase ENC_LDR_32_LDST_REGOFF: return \"LDR_32_ldst_regoff\";\n\t\tcase ENC_LDR_32_LOADLIT: return \"LDR_32_loadlit\";\n\t\tcase ENC_LDR_64_LDST_IMMPOST: return \"LDR_64_ldst_immpost\";\n\t\tcase ENC_LDR_64_LDST_IMMPRE: return \"LDR_64_ldst_immpre\";\n\t\tcase ENC_LDR_64_LDST_POS: return \"LDR_64_ldst_pos\";\n\t\tcase ENC_LDR_64_LDST_REGOFF: return \"LDR_64_ldst_regoff\";\n\t\tcase ENC_LDR_64_LOADLIT: return \"LDR_64_loadlit\";\n\t\tcase ENC_LDR_BL_LDST_REGOFF: return \"LDR_BL_ldst_regoff\";\n\t\tcase ENC_LDR_B_LDST_IMMPOST: return \"LDR_B_ldst_immpost\";\n\t\tcase ENC_LDR_B_LDST_IMMPRE: return \"LDR_B_ldst_immpre\";\n\t\tcase ENC_LDR_B_LDST_POS: return \"LDR_B_ldst_pos\";\n\t\tcase ENC_LDR_B_LDST_REGOFF: return \"LDR_B_ldst_regoff\";\n\t\tcase ENC_LDR_D_LDST_IMMPOST: return \"LDR_D_ldst_immpost\";\n\t\tcase ENC_LDR_D_LDST_IMMPRE: return \"LDR_D_ldst_immpre\";\n\t\tcase ENC_LDR_D_LDST_POS: return \"LDR_D_ldst_pos\";\n\t\tcase ENC_LDR_D_LDST_REGOFF: return \"LDR_D_ldst_regoff\";\n\t\tcase ENC_LDR_D_LOADLIT: return \"LDR_D_loadlit\";\n\t\tcase ENC_LDR_H_LDST_IMMPOST: return \"LDR_H_ldst_immpost\";\n\t\tcase ENC_LDR_H_LDST_IMMPRE: return \"LDR_H_ldst_immpre\";\n\t\tcase ENC_LDR_H_LDST_POS: return \"LDR_H_ldst_pos\";\n\t\tcase ENC_LDR_H_LDST_REGOFF: return \"LDR_H_ldst_regoff\";\n\t\tcase ENC_LDR_Q_LDST_IMMPOST: return \"LDR_Q_ldst_immpost\";\n\t\tcase ENC_LDR_Q_LDST_IMMPRE: return \"LDR_Q_ldst_immpre\";\n\t\tcase ENC_LDR_Q_LDST_POS: return \"LDR_Q_ldst_pos\";\n\t\tcase ENC_LDR_Q_LDST_REGOFF: return \"LDR_Q_ldst_regoff\";\n\t\tcase ENC_LDR_Q_LOADLIT: return \"LDR_Q_loadlit\";\n\t\tcase ENC_LDR_S_LDST_IMMPOST: return \"LDR_S_ldst_immpost\";\n\t\tcase ENC_LDR_S_LDST_IMMPRE: return \"LDR_S_ldst_immpre\";\n\t\tcase ENC_LDR_S_LDST_POS: return \"LDR_S_ldst_pos\";\n\t\tcase ENC_LDR_S_LDST_REGOFF: return \"LDR_S_ldst_regoff\";\n\t\tcase ENC_LDR_S_LOADLIT: return \"LDR_S_loadlit\";\n\t\tcase ENC_LDSETAB_32_MEMOP: return \"LDSETAB_32_memop\";\n\t\tcase ENC_LDSETAH_32_MEMOP: return \"LDSETAH_32_memop\";\n\t\tcase ENC_LDSETALB_32_MEMOP: return \"LDSETALB_32_memop\";\n\t\tcase ENC_LDSETALH_32_MEMOP: return \"LDSETALH_32_memop\";\n\t\tcase ENC_LDSETAL_32_MEMOP: return \"LDSETAL_32_memop\";\n\t\tcase ENC_LDSETAL_64_MEMOP: return \"LDSETAL_64_memop\";\n\t\tcase ENC_LDSETA_32_MEMOP: return \"LDSETA_32_memop\";\n\t\tcase ENC_LDSETA_64_MEMOP: return \"LDSETA_64_memop\";\n\t\tcase ENC_LDSETB_32_MEMOP: return \"LDSETB_32_memop\";\n\t\tcase ENC_LDSETH_32_MEMOP: return \"LDSETH_32_memop\";\n\t\tcase ENC_LDSETLB_32_MEMOP: return \"LDSETLB_32_memop\";\n\t\tcase ENC_LDSETLH_32_MEMOP: return \"LDSETLH_32_memop\";\n\t\tcase ENC_LDSETL_32_MEMOP: return \"LDSETL_32_memop\";\n\t\tcase ENC_LDSETL_64_MEMOP: return \"LDSETL_64_memop\";\n\t\tcase ENC_LDSET_32_MEMOP: return \"LDSET_32_memop\";\n\t\tcase ENC_LDSET_64_MEMOP: return \"LDSET_64_memop\";\n\t\tcase ENC_LDSMAXAB_32_MEMOP: return \"LDSMAXAB_32_memop\";\n\t\tcase ENC_LDSMAXAH_32_MEMOP: return \"LDSMAXAH_32_memop\";\n\t\tcase ENC_LDSMAXALB_32_MEMOP: return \"LDSMAXALB_32_memop\";\n\t\tcase ENC_LDSMAXALH_32_MEMOP: return \"LDSMAXALH_32_memop\";\n\t\tcase ENC_LDSMAXAL_32_MEMOP: return \"LDSMAXAL_32_memop\";\n\t\tcase ENC_LDSMAXAL_64_MEMOP: return \"LDSMAXAL_64_memop\";\n\t\tcase ENC_LDSMAXA_32_MEMOP: return \"LDSMAXA_32_memop\";\n\t\tcase ENC_LDSMAXA_64_MEMOP: return \"LDSMAXA_64_memop\";\n\t\tcase ENC_LDSMAXB_32_MEMOP: return \"LDSMAXB_32_memop\";\n\t\tcase ENC_LDSMAXH_32_MEMOP: return \"LDSMAXH_32_memop\";\n\t\tcase ENC_LDSMAXLB_32_MEMOP: return \"LDSMAXLB_32_memop\";\n\t\tcase ENC_LDSMAXLH_32_MEMOP: return \"LDSMAXLH_32_memop\";\n\t\tcase ENC_LDSMAXL_32_MEMOP: return \"LDSMAXL_32_memop\";\n\t\tcase ENC_LDSMAXL_64_MEMOP: return \"LDSMAXL_64_memop\";\n\t\tcase ENC_LDSMAX_32_MEMOP: return \"LDSMAX_32_memop\";\n\t\tcase ENC_LDSMAX_64_MEMOP: return \"LDSMAX_64_memop\";\n\t\tcase ENC_LDSMINAB_32_MEMOP: return \"LDSMINAB_32_memop\";\n\t\tcase ENC_LDSMINAH_32_MEMOP: return \"LDSMINAH_32_memop\";\n\t\tcase ENC_LDSMINALB_32_MEMOP: return \"LDSMINALB_32_memop\";\n\t\tcase ENC_LDSMINALH_32_MEMOP: return \"LDSMINALH_32_memop\";\n\t\tcase ENC_LDSMINAL_32_MEMOP: return \"LDSMINAL_32_memop\";\n\t\tcase ENC_LDSMINAL_64_MEMOP: return \"LDSMINAL_64_memop\";\n\t\tcase ENC_LDSMINA_32_MEMOP: return \"LDSMINA_32_memop\";\n\t\tcase ENC_LDSMINA_64_MEMOP: return \"LDSMINA_64_memop\";\n\t\tcase ENC_LDSMINB_32_MEMOP: return \"LDSMINB_32_memop\";\n\t\tcase ENC_LDSMINH_32_MEMOP: return \"LDSMINH_32_memop\";\n\t\tcase ENC_LDSMINLB_32_MEMOP: return \"LDSMINLB_32_memop\";\n\t\tcase ENC_LDSMINLH_32_MEMOP: return \"LDSMINLH_32_memop\";\n\t\tcase ENC_LDSMINL_32_MEMOP: return \"LDSMINL_32_memop\";\n\t\tcase ENC_LDSMINL_64_MEMOP: return \"LDSMINL_64_memop\";\n\t\tcase ENC_LDSMIN_32_MEMOP: return \"LDSMIN_32_memop\";\n\t\tcase ENC_LDSMIN_64_MEMOP: return \"LDSMIN_64_memop\";\n\t\tcase ENC_LDTRB_32_LDST_UNPRIV: return \"LDTRB_32_ldst_unpriv\";\n\t\tcase ENC_LDTRH_32_LDST_UNPRIV: return \"LDTRH_32_ldst_unpriv\";\n\t\tcase ENC_LDTRSB_32_LDST_UNPRIV: return \"LDTRSB_32_ldst_unpriv\";\n\t\tcase ENC_LDTRSB_64_LDST_UNPRIV: return \"LDTRSB_64_ldst_unpriv\";\n\t\tcase ENC_LDTRSH_32_LDST_UNPRIV: return \"LDTRSH_32_ldst_unpriv\";\n\t\tcase ENC_LDTRSH_64_LDST_UNPRIV: return \"LDTRSH_64_ldst_unpriv\";\n\t\tcase ENC_LDTRSW_64_LDST_UNPRIV: return \"LDTRSW_64_ldst_unpriv\";\n\t\tcase ENC_LDTR_32_LDST_UNPRIV: return \"LDTR_32_ldst_unpriv\";\n\t\tcase ENC_LDTR_64_LDST_UNPRIV: return \"LDTR_64_ldst_unpriv\";\n\t\tcase ENC_LDUMAXAB_32_MEMOP: return \"LDUMAXAB_32_memop\";\n\t\tcase ENC_LDUMAXAH_32_MEMOP: return \"LDUMAXAH_32_memop\";\n\t\tcase ENC_LDUMAXALB_32_MEMOP: return \"LDUMAXALB_32_memop\";\n\t\tcase ENC_LDUMAXALH_32_MEMOP: return \"LDUMAXALH_32_memop\";\n\t\tcase ENC_LDUMAXAL_32_MEMOP: return \"LDUMAXAL_32_memop\";\n\t\tcase ENC_LDUMAXAL_64_MEMOP: return \"LDUMAXAL_64_memop\";\n\t\tcase ENC_LDUMAXA_32_MEMOP: return \"LDUMAXA_32_memop\";\n\t\tcase ENC_LDUMAXA_64_MEMOP: return \"LDUMAXA_64_memop\";\n\t\tcase ENC_LDUMAXB_32_MEMOP: return \"LDUMAXB_32_memop\";\n\t\tcase ENC_LDUMAXH_32_MEMOP: return \"LDUMAXH_32_memop\";\n\t\tcase ENC_LDUMAXLB_32_MEMOP: return \"LDUMAXLB_32_memop\";\n\t\tcase ENC_LDUMAXLH_32_MEMOP: return \"LDUMAXLH_32_memop\";\n\t\tcase ENC_LDUMAXL_32_MEMOP: return \"LDUMAXL_32_memop\";\n\t\tcase ENC_LDUMAXL_64_MEMOP: return \"LDUMAXL_64_memop\";\n\t\tcase ENC_LDUMAX_32_MEMOP: return \"LDUMAX_32_memop\";\n\t\tcase ENC_LDUMAX_64_MEMOP: return \"LDUMAX_64_memop\";\n\t\tcase ENC_LDUMINAB_32_MEMOP: return \"LDUMINAB_32_memop\";\n\t\tcase ENC_LDUMINAH_32_MEMOP: return \"LDUMINAH_32_memop\";\n\t\tcase ENC_LDUMINALB_32_MEMOP: return \"LDUMINALB_32_memop\";\n\t\tcase ENC_LDUMINALH_32_MEMOP: return \"LDUMINALH_32_memop\";\n\t\tcase ENC_LDUMINAL_32_MEMOP: return \"LDUMINAL_32_memop\";\n\t\tcase ENC_LDUMINAL_64_MEMOP: return \"LDUMINAL_64_memop\";\n\t\tcase ENC_LDUMINA_32_MEMOP: return \"LDUMINA_32_memop\";\n\t\tcase ENC_LDUMINA_64_MEMOP: return \"LDUMINA_64_memop\";\n\t\tcase ENC_LDUMINB_32_MEMOP: return \"LDUMINB_32_memop\";\n\t\tcase ENC_LDUMINH_32_MEMOP: return \"LDUMINH_32_memop\";\n\t\tcase ENC_LDUMINLB_32_MEMOP: return \"LDUMINLB_32_memop\";\n\t\tcase ENC_LDUMINLH_32_MEMOP: return \"LDUMINLH_32_memop\";\n\t\tcase ENC_LDUMINL_32_MEMOP: return \"LDUMINL_32_memop\";\n\t\tcase ENC_LDUMINL_64_MEMOP: return \"LDUMINL_64_memop\";\n\t\tcase ENC_LDUMIN_32_MEMOP: return \"LDUMIN_32_memop\";\n\t\tcase ENC_LDUMIN_64_MEMOP: return \"LDUMIN_64_memop\";\n\t\tcase ENC_LDURB_32_LDST_UNSCALED: return \"LDURB_32_ldst_unscaled\";\n\t\tcase ENC_LDURH_32_LDST_UNSCALED: return \"LDURH_32_ldst_unscaled\";\n\t\tcase ENC_LDURSB_32_LDST_UNSCALED: return \"LDURSB_32_ldst_unscaled\";\n\t\tcase ENC_LDURSB_64_LDST_UNSCALED: return \"LDURSB_64_ldst_unscaled\";\n\t\tcase ENC_LDURSH_32_LDST_UNSCALED: return \"LDURSH_32_ldst_unscaled\";\n\t\tcase ENC_LDURSH_64_LDST_UNSCALED: return \"LDURSH_64_ldst_unscaled\";\n\t\tcase ENC_LDURSW_64_LDST_UNSCALED: return \"LDURSW_64_ldst_unscaled\";\n\t\tcase ENC_LDUR_32_LDST_UNSCALED: return \"LDUR_32_ldst_unscaled\";\n\t\tcase ENC_LDUR_64_LDST_UNSCALED: return \"LDUR_64_ldst_unscaled\";\n\t\tcase ENC_LDUR_B_LDST_UNSCALED: return \"LDUR_B_ldst_unscaled\";\n\t\tcase ENC_LDUR_D_LDST_UNSCALED: return \"LDUR_D_ldst_unscaled\";\n\t\tcase ENC_LDUR_H_LDST_UNSCALED: return \"LDUR_H_ldst_unscaled\";\n\t\tcase ENC_LDUR_Q_LDST_UNSCALED: return \"LDUR_Q_ldst_unscaled\";\n\t\tcase ENC_LDUR_S_LDST_UNSCALED: return \"LDUR_S_ldst_unscaled\";\n\t\tcase ENC_LDXP_LP32_LDSTEXCLP: return \"LDXP_LP32_ldstexclp\";\n\t\tcase ENC_LDXP_LP64_LDSTEXCLP: return \"LDXP_LP64_ldstexclp\";\n\t\tcase ENC_LDXRB_LR32_LDSTEXCLR: return \"LDXRB_LR32_ldstexclr\";\n\t\tcase ENC_LDXRH_LR32_LDSTEXCLR: return \"LDXRH_LR32_ldstexclr\";\n\t\tcase ENC_LDXR_LR32_LDSTEXCLR: return \"LDXR_LR32_ldstexclr\";\n\t\tcase ENC_LDXR_LR64_LDSTEXCLR: return \"LDXR_LR64_ldstexclr\";\n\t\tcase ENC_LSLV_32_DP_2SRC: return \"LSLV_32_dp_2src\";\n\t\tcase ENC_LSLV_64_DP_2SRC: return \"LSLV_64_dp_2src\";\n\t\tcase ENC_LSL_LSLV_32_DP_2SRC: return \"LSL_LSLV_32_dp_2src\";\n\t\tcase ENC_LSL_LSLV_64_DP_2SRC: return \"LSL_LSLV_64_dp_2src\";\n\t\tcase ENC_LSL_UBFM_32M_BITFIELD: return \"LSL_UBFM_32M_bitfield\";\n\t\tcase ENC_LSL_UBFM_64M_BITFIELD: return \"LSL_UBFM_64M_bitfield\";\n\t\tcase ENC_LSRV_32_DP_2SRC: return \"LSRV_32_dp_2src\";\n\t\tcase ENC_LSRV_64_DP_2SRC: return \"LSRV_64_dp_2src\";\n\t\tcase ENC_LSR_LSRV_32_DP_2SRC: return \"LSR_LSRV_32_dp_2src\";\n\t\tcase ENC_LSR_LSRV_64_DP_2SRC: return \"LSR_LSRV_64_dp_2src\";\n\t\tcase ENC_LSR_UBFM_32M_BITFIELD: return \"LSR_UBFM_32M_bitfield\";\n\t\tcase ENC_LSR_UBFM_64M_BITFIELD: return \"LSR_UBFM_64M_bitfield\";\n\t\tcase ENC_MADD_32A_DP_3SRC: return \"MADD_32A_dp_3src\";\n\t\tcase ENC_MADD_64A_DP_3SRC: return \"MADD_64A_dp_3src\";\n\t\tcase ENC_MLA_ASIMDELEM_R: return \"MLA_asimdelem_R\";\n\t\tcase ENC_MLA_ASIMDSAME_ONLY: return \"MLA_asimdsame_only\";\n\t\tcase ENC_MLS_ASIMDELEM_R: return \"MLS_asimdelem_R\";\n\t\tcase ENC_MLS_ASIMDSAME_ONLY: return \"MLS_asimdsame_only\";\n\t\tcase ENC_MNEG_MSUB_32A_DP_3SRC: return \"MNEG_MSUB_32A_dp_3src\";\n\t\tcase ENC_MNEG_MSUB_64A_DP_3SRC: return \"MNEG_MSUB_64A_dp_3src\";\n\t\tcase ENC_MOVI_ASIMDIMM_D2_D: return \"MOVI_asimdimm_D2_d\";\n\t\tcase ENC_MOVI_ASIMDIMM_D_DS: return \"MOVI_asimdimm_D_ds\";\n\t\tcase ENC_MOVI_ASIMDIMM_L_HL: return \"MOVI_asimdimm_L_hl\";\n\t\tcase ENC_MOVI_ASIMDIMM_L_SL: return \"MOVI_asimdimm_L_sl\";\n\t\tcase ENC_MOVI_ASIMDIMM_M_SM: return \"MOVI_asimdimm_M_sm\";\n\t\tcase ENC_MOVI_ASIMDIMM_N_B: return \"MOVI_asimdimm_N_b\";\n\t\tcase ENC_MOVK_32_MOVEWIDE: return \"MOVK_32_movewide\";\n\t\tcase ENC_MOVK_64_MOVEWIDE: return \"MOVK_64_movewide\";\n\t\tcase ENC_MOVN_32_MOVEWIDE: return \"MOVN_32_movewide\";\n\t\tcase ENC_MOVN_64_MOVEWIDE: return \"MOVN_64_movewide\";\n\t\tcase ENC_MOVS_ANDS_P_P_PP_Z: return \"MOVS_ands_p_p_pp_z\";\n\t\tcase ENC_MOVS_ORRS_P_P_PP_Z: return \"MOVS_orrs_p_p_pp_z\";\n\t\tcase ENC_MOVZ_32_MOVEWIDE: return \"MOVZ_32_movewide\";\n\t\tcase ENC_MOVZ_64_MOVEWIDE: return \"MOVZ_64_movewide\";\n\t\tcase ENC_MOV_ADD_32_ADDSUB_IMM: return \"MOV_ADD_32_addsub_imm\";\n\t\tcase ENC_MOV_ADD_64_ADDSUB_IMM: return \"MOV_ADD_64_addsub_imm\";\n\t\tcase ENC_MOV_DUP_ASISDONE_ONLY: return \"MOV_DUP_asisdone_only\";\n\t\tcase ENC_MOV_INS_ASIMDINS_IR_R: return \"MOV_INS_asimdins_IR_r\";\n\t\tcase ENC_MOV_INS_ASIMDINS_IV_V: return \"MOV_INS_asimdins_IV_v\";\n\t\tcase ENC_MOV_MOVN_32_MOVEWIDE: return \"MOV_MOVN_32_movewide\";\n\t\tcase ENC_MOV_MOVN_64_MOVEWIDE: return \"MOV_MOVN_64_movewide\";\n\t\tcase ENC_MOV_MOVZ_32_MOVEWIDE: return \"MOV_MOVZ_32_movewide\";\n\t\tcase ENC_MOV_MOVZ_64_MOVEWIDE: return \"MOV_MOVZ_64_movewide\";\n\t\tcase ENC_MOV_ORR_32_LOG_IMM: return \"MOV_ORR_32_log_imm\";\n\t\tcase ENC_MOV_ORR_32_LOG_SHIFT: return \"MOV_ORR_32_log_shift\";\n\t\tcase ENC_MOV_ORR_64_LOG_IMM: return \"MOV_ORR_64_log_imm\";\n\t\tcase ENC_MOV_ORR_64_LOG_SHIFT: return \"MOV_ORR_64_log_shift\";\n\t\tcase ENC_MOV_ORR_ASIMDSAME_ONLY: return \"MOV_ORR_asimdsame_only\";\n\t\tcase ENC_MOV_UMOV_ASIMDINS_W_W: return \"MOV_UMOV_asimdins_W_w\";\n\t\tcase ENC_MOV_UMOV_ASIMDINS_X_X: return \"MOV_UMOV_asimdins_X_x\";\n\t\tcase ENC_MOV_AND_P_P_PP_Z: return \"MOV_and_p_p_pp_z\";\n\t\tcase ENC_MOV_CPY_Z_O_I_: return \"MOV_cpy_z_o_i_\";\n\t\tcase ENC_MOV_CPY_Z_P_I_: return \"MOV_cpy_z_p_i_\";\n\t\tcase ENC_MOV_CPY_Z_P_R_: return \"MOV_cpy_z_p_r_\";\n\t\tcase ENC_MOV_CPY_Z_P_V_: return \"MOV_cpy_z_p_v_\";\n\t\tcase ENC_MOV_DUP_Z_I_: return \"MOV_dup_z_i_\";\n\t\tcase ENC_MOV_DUP_Z_R_: return \"MOV_dup_z_r_\";\n\t\tcase ENC_MOV_DUP_Z_ZI_: return \"MOV_dup_z_zi_\";\n\t\tcase ENC_MOV_DUP_Z_ZI_2: return \"MOV_dup_z_zi_2\";\n\t\tcase ENC_MOV_DUPM_Z_I_: return \"MOV_dupm_z_i_\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_B: return \"MOV_mova_z_p_rza_b\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_D: return \"MOV_mova_z_p_rza_d\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_H: return \"MOV_mova_z_p_rza_h\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_Q: return \"MOV_mova_z_p_rza_q\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_W: return \"MOV_mova_z_p_rza_w\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_B: return \"MOV_mova_za_p_rz_b\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_D: return \"MOV_mova_za_p_rz_d\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_H: return \"MOV_mova_za_p_rz_h\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_Q: return \"MOV_mova_za_p_rz_q\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_W: return \"MOV_mova_za_p_rz_w\";\n\t\tcase ENC_MOV_ORR_P_P_PP_Z: return \"MOV_orr_p_p_pp_z\";\n\t\tcase ENC_MOV_ORR_Z_ZZ_: return \"MOV_orr_z_zz_\";\n\t\tcase ENC_MOV_SEL_P_P_PP_: return \"MOV_sel_p_p_pp_\";\n\t\tcase ENC_MOV_SEL_Z_P_ZZ_: return \"MOV_sel_z_p_zz_\";\n\t\tcase ENC_MRS_RS_SYSTEMMOVE: return \"MRS_RS_systemmove\";\n\t\tcase ENC_MSR_SI_PSTATE: return \"MSR_SI_pstate\";\n\t\tcase ENC_MSR_SR_SYSTEMMOVE: return \"MSR_SR_systemmove\";\n\t\tcase ENC_MSUB_32A_DP_3SRC: return \"MSUB_32A_dp_3src\";\n\t\tcase ENC_MSUB_64A_DP_3SRC: return \"MSUB_64A_dp_3src\";\n\t\tcase ENC_MUL_MADD_32A_DP_3SRC: return \"MUL_MADD_32A_dp_3src\";\n\t\tcase ENC_MUL_MADD_64A_DP_3SRC: return \"MUL_MADD_64A_dp_3src\";\n\t\tcase ENC_MUL_ASIMDELEM_R: return \"MUL_asimdelem_R\";\n\t\tcase ENC_MUL_ASIMDSAME_ONLY: return \"MUL_asimdsame_only\";\n\t\tcase ENC_MVNI_ASIMDIMM_L_HL: return \"MVNI_asimdimm_L_hl\";\n\t\tcase ENC_MVNI_ASIMDIMM_L_SL: return \"MVNI_asimdimm_L_sl\";\n\t\tcase ENC_MVNI_ASIMDIMM_M_SM: return \"MVNI_asimdimm_M_sm\";\n\t\tcase ENC_MVN_NOT_ASIMDMISC_R: return \"MVN_NOT_asimdmisc_R\";\n\t\tcase ENC_MVN_ORN_32_LOG_SHIFT: return \"MVN_ORN_32_log_shift\";\n\t\tcase ENC_MVN_ORN_64_LOG_SHIFT: return \"MVN_ORN_64_log_shift\";\n\t\tcase ENC_NEGS_SUBS_32_ADDSUB_SHIFT: return \"NEGS_SUBS_32_addsub_shift\";\n\t\tcase ENC_NEGS_SUBS_64_ADDSUB_SHIFT: return \"NEGS_SUBS_64_addsub_shift\";\n\t\tcase ENC_NEG_SUB_32_ADDSUB_SHIFT: return \"NEG_SUB_32_addsub_shift\";\n\t\tcase ENC_NEG_SUB_64_ADDSUB_SHIFT: return \"NEG_SUB_64_addsub_shift\";\n\t\tcase ENC_NEG_ASIMDMISC_R: return \"NEG_asimdmisc_R\";\n\t\tcase ENC_NEG_ASISDMISC_R: return \"NEG_asisdmisc_R\";\n\t\tcase ENC_NGCS_SBCS_32_ADDSUB_CARRY: return \"NGCS_SBCS_32_addsub_carry\";\n\t\tcase ENC_NGCS_SBCS_64_ADDSUB_CARRY: return \"NGCS_SBCS_64_addsub_carry\";\n\t\tcase ENC_NGC_SBC_32_ADDSUB_CARRY: return \"NGC_SBC_32_addsub_carry\";\n\t\tcase ENC_NGC_SBC_64_ADDSUB_CARRY: return \"NGC_SBC_64_addsub_carry\";\n\t\tcase ENC_NOP_HI_HINTS: return \"NOP_HI_hints\";\n\t\tcase ENC_NOTS_EORS_P_P_PP_Z: return \"NOTS_eors_p_p_pp_z\";\n\t\tcase ENC_NOT_ASIMDMISC_R: return \"NOT_asimdmisc_R\";\n\t\tcase ENC_NOT_EOR_P_P_PP_Z: return \"NOT_eor_p_p_pp_z\";\n\t\tcase ENC_ORN_32_LOG_SHIFT: return \"ORN_32_log_shift\";\n\t\tcase ENC_ORN_64_LOG_SHIFT: return \"ORN_64_log_shift\";\n\t\tcase ENC_ORN_ASIMDSAME_ONLY: return \"ORN_asimdsame_only\";\n\t\tcase ENC_ORN_ORR_Z_ZI_: return \"ORN_orr_z_zi_\";\n\t\tcase ENC_ORR_32_LOG_IMM: return \"ORR_32_log_imm\";\n\t\tcase ENC_ORR_32_LOG_SHIFT: return \"ORR_32_log_shift\";\n\t\tcase ENC_ORR_64_LOG_IMM: return \"ORR_64_log_imm\";\n\t\tcase ENC_ORR_64_LOG_SHIFT: return \"ORR_64_log_shift\";\n\t\tcase ENC_ORR_ASIMDIMM_L_HL: return \"ORR_asimdimm_L_hl\";\n\t\tcase ENC_ORR_ASIMDIMM_L_SL: return \"ORR_asimdimm_L_sl\";\n\t\tcase ENC_ORR_ASIMDSAME_ONLY: return \"ORR_asimdsame_only\";\n\t\tcase ENC_PACDA_64P_DP_1SRC: return \"PACDA_64P_dp_1src\";\n\t\tcase ENC_PACDB_64P_DP_1SRC: return \"PACDB_64P_dp_1src\";\n\t\tcase ENC_PACDZA_64Z_DP_1SRC: return \"PACDZA_64Z_dp_1src\";\n\t\tcase ENC_PACDZB_64Z_DP_1SRC: return \"PACDZB_64Z_dp_1src\";\n\t\tcase ENC_PACGA_64P_DP_2SRC: return \"PACGA_64P_dp_2src\";\n\t\tcase ENC_PACIA1716_HI_HINTS: return \"PACIA1716_HI_hints\";\n\t\tcase ENC_PACIASP_HI_HINTS: return \"PACIASP_HI_hints\";\n\t\tcase ENC_PACIAZ_HI_HINTS: return \"PACIAZ_HI_hints\";\n\t\tcase ENC_PACIA_64P_DP_1SRC: return \"PACIA_64P_dp_1src\";\n\t\tcase ENC_PACIB1716_HI_HINTS: return \"PACIB1716_HI_hints\";\n\t\tcase ENC_PACIBSP_HI_HINTS: return \"PACIBSP_HI_hints\";\n\t\tcase ENC_PACIBZ_HI_HINTS: return \"PACIBZ_HI_hints\";\n\t\tcase ENC_PACIB_64P_DP_1SRC: return \"PACIB_64P_dp_1src\";\n\t\tcase ENC_PACIZA_64Z_DP_1SRC: return \"PACIZA_64Z_dp_1src\";\n\t\tcase ENC_PACIZB_64Z_DP_1SRC: return \"PACIZB_64Z_dp_1src\";\n\t\tcase ENC_PMULL_ASIMDDIFF_L: return \"PMULL_asimddiff_L\";\n\t\tcase ENC_PMUL_ASIMDSAME_ONLY: return \"PMUL_asimdsame_only\";\n\t\tcase ENC_PRFM_P_LDST_POS: return \"PRFM_P_ldst_pos\";\n\t\tcase ENC_PRFM_P_LDST_REGOFF: return \"PRFM_P_ldst_regoff\";\n\t\tcase ENC_PRFM_P_LOADLIT: return \"PRFM_P_loadlit\";\n\t\tcase ENC_PRFUM_P_LDST_UNSCALED: return \"PRFUM_P_ldst_unscaled\";\n\t\tcase ENC_PSB_HC_HINTS: return \"PSB_HC_hints\";\n\t\tcase ENC_PSSBB_DSB_BO_BARRIERS: return \"PSSBB_DSB_BO_barriers\";\n\t\tcase ENC_RADDHN_ASIMDDIFF_N: return \"RADDHN_asimddiff_N\";\n\t\tcase ENC_RAX1_VVV2_CRYPTOSHA512_3: return \"RAX1_VVV2_cryptosha512_3\";\n\t\tcase ENC_RBIT_32_DP_1SRC: return \"RBIT_32_dp_1src\";\n\t\tcase ENC_RBIT_64_DP_1SRC: return \"RBIT_64_dp_1src\";\n\t\tcase ENC_RBIT_ASIMDMISC_R: return \"RBIT_asimdmisc_R\";\n\t\tcase ENC_RESERVED_21_ASIMDELEM: return \"RESERVED_21_asimdelem\";\n\t\tcase ENC_RESERVED_35_ASIMDELEM: return \"RESERVED_35_asimdelem\";\n\t\tcase ENC_RESERVED_36_ASISDSAME: return \"RESERVED_36_asisdsame\";\n\t\tcase ENC_RESERVED_37_ASISDSAME: return \"RESERVED_37_asisdsame\";\n\t\tcase ENC_RESERVED_38_ASISDSAME: return \"RESERVED_38_asisdsame\";\n\t\tcase ENC_RESERVED_39_ASISDSAME: return \"RESERVED_39_asisdsame\";\n\t\tcase ENC_RESERVED_42_ASISDSAME: return \"RESERVED_42_asisdsame\";\n\t\tcase ENC_RESERVED_44_ASISDSAME: return \"RESERVED_44_asisdsame\";\n\t\tcase ENC_RESERVED_45_ASISDSAME: return \"RESERVED_45_asisdsame\";\n\t\tcase ENC_RESERVED_46_ASISDSAME: return \"RESERVED_46_asisdsame\";\n\t\tcase ENC_RESERVED_47_ASISDSAME: return \"RESERVED_47_asisdsame\";\n\t\tcase ENC_RESERVED_48_ASISDSAME: return \"RESERVED_48_asisdsame\";\n\t\tcase ENC_RESERVED_50_ASISDSAME: return \"RESERVED_50_asisdsame\";\n\t\tcase ENC_RESERVED_52_ASISDSAME: return \"RESERVED_52_asisdsame\";\n\t\tcase ENC_RESERVED_53_ASISDSAME: return \"RESERVED_53_asisdsame\";\n\t\tcase ENC_RESERVED_54_ASISDSAME: return \"RESERVED_54_asisdsame\";\n\t\tcase ENC_RESERVED_57_ASISDSAME: return \"RESERVED_57_asisdsame\";\n\t\tcase ENC_RESERVED_67_ASISDSAME: return \"RESERVED_67_asisdsame\";\n\t\tcase ENC_RESERVED_68_ASISDSAME: return \"RESERVED_68_asisdsame\";\n\t\tcase ENC_RESERVED_69_ASISDSAME: return \"RESERVED_69_asisdsame\";\n\t\tcase ENC_RESERVED_70_ASISDSAME: return \"RESERVED_70_asisdsame\";\n\t\tcase ENC_RESERVED_72_ASISDSAME: return \"RESERVED_72_asisdsame\";\n\t\tcase ENC_RESERVED_74_ASISDSAME: return \"RESERVED_74_asisdsame\";\n\t\tcase ENC_RETAA_64E_BRANCH_REG: return \"RETAA_64E_branch_reg\";\n\t\tcase ENC_RETAB_64E_BRANCH_REG: return \"RETAB_64E_branch_reg\";\n\t\tcase ENC_RET_64R_BRANCH_REG: return \"RET_64R_branch_reg\";\n\t\tcase ENC_REV16_32_DP_1SRC: return \"REV16_32_dp_1src\";\n\t\tcase ENC_REV16_64_DP_1SRC: return \"REV16_64_dp_1src\";\n\t\tcase ENC_REV16_ASIMDMISC_R: return \"REV16_asimdmisc_R\";\n\t\tcase ENC_REV32_64_DP_1SRC: return \"REV32_64_dp_1src\";\n\t\tcase ENC_REV32_ASIMDMISC_R: return \"REV32_asimdmisc_R\";\n\t\tcase ENC_REV64_REV_64_DP_1SRC: return \"REV64_REV_64_dp_1src\";\n\t\tcase ENC_REV64_ASIMDMISC_R: return \"REV64_asimdmisc_R\";\n\t\tcase ENC_REV_32_DP_1SRC: return \"REV_32_dp_1src\";\n\t\tcase ENC_REV_64_DP_1SRC: return \"REV_64_dp_1src\";\n\t\tcase ENC_RMIF_ONLY_RMIF: return \"RMIF_only_rmif\";\n\t\tcase ENC_RORV_32_DP_2SRC: return \"RORV_32_dp_2src\";\n\t\tcase ENC_RORV_64_DP_2SRC: return \"RORV_64_dp_2src\";\n\t\tcase ENC_ROR_EXTR_32_EXTRACT: return \"ROR_EXTR_32_extract\";\n\t\tcase ENC_ROR_EXTR_64_EXTRACT: return \"ROR_EXTR_64_extract\";\n\t\tcase ENC_ROR_RORV_32_DP_2SRC: return \"ROR_RORV_32_dp_2src\";\n\t\tcase ENC_ROR_RORV_64_DP_2SRC: return \"ROR_RORV_64_dp_2src\";\n\t\tcase ENC_RSHRN_ASIMDSHF_N: return \"RSHRN_asimdshf_N\";\n\t\tcase ENC_RSUBHN_ASIMDDIFF_N: return \"RSUBHN_asimddiff_N\";\n\t\tcase ENC_SABAL_ASIMDDIFF_L: return \"SABAL_asimddiff_L\";\n\t\tcase ENC_SABA_ASIMDSAME_ONLY: return \"SABA_asimdsame_only\";\n\t\tcase ENC_SABDL_ASIMDDIFF_L: return \"SABDL_asimddiff_L\";\n\t\tcase ENC_SABD_ASIMDSAME_ONLY: return \"SABD_asimdsame_only\";\n\t\tcase ENC_SADALP_ASIMDMISC_P: return \"SADALP_asimdmisc_P\";\n\t\tcase ENC_SADDLP_ASIMDMISC_P: return \"SADDLP_asimdmisc_P\";\n\t\tcase ENC_SADDLV_ASIMDALL_ONLY: return \"SADDLV_asimdall_only\";\n\t\tcase ENC_SADDL_ASIMDDIFF_L: return \"SADDL_asimddiff_L\";\n\t\tcase ENC_SADDW_ASIMDDIFF_W: return \"SADDW_asimddiff_W\";\n\t\tcase ENC_SBCS_32_ADDSUB_CARRY: return \"SBCS_32_addsub_carry\";\n\t\tcase ENC_SBCS_64_ADDSUB_CARRY: return \"SBCS_64_addsub_carry\";\n\t\tcase ENC_SBC_32_ADDSUB_CARRY: return \"SBC_32_addsub_carry\";\n\t\tcase ENC_SBC_64_ADDSUB_CARRY: return \"SBC_64_addsub_carry\";\n\t\tcase ENC_SBFIZ_SBFM_32M_BITFIELD: return \"SBFIZ_SBFM_32M_bitfield\";\n\t\tcase ENC_SBFIZ_SBFM_64M_BITFIELD: return \"SBFIZ_SBFM_64M_bitfield\";\n\t\tcase ENC_SBFM_32M_BITFIELD: return \"SBFM_32M_bitfield\";\n\t\tcase ENC_SBFM_64M_BITFIELD: return \"SBFM_64M_bitfield\";\n\t\tcase ENC_SBFX_SBFM_32M_BITFIELD: return \"SBFX_SBFM_32M_bitfield\";\n\t\tcase ENC_SBFX_SBFM_64M_BITFIELD: return \"SBFX_SBFM_64M_bitfield\";\n\t\tcase ENC_SB_ONLY_BARRIERS: return \"SB_only_barriers\";\n\t\tcase ENC_SCVTF_D32_FLOAT2FIX: return \"SCVTF_D32_float2fix\";\n\t\tcase ENC_SCVTF_D32_FLOAT2INT: return \"SCVTF_D32_float2int\";\n\t\tcase ENC_SCVTF_D64_FLOAT2FIX: return \"SCVTF_D64_float2fix\";\n\t\tcase ENC_SCVTF_D64_FLOAT2INT: return \"SCVTF_D64_float2int\";\n\t\tcase ENC_SCVTF_H32_FLOAT2FIX: return \"SCVTF_H32_float2fix\";\n\t\tcase ENC_SCVTF_H32_FLOAT2INT: return \"SCVTF_H32_float2int\";\n\t\tcase ENC_SCVTF_H64_FLOAT2FIX: return \"SCVTF_H64_float2fix\";\n\t\tcase ENC_SCVTF_H64_FLOAT2INT: return \"SCVTF_H64_float2int\";\n\t\tcase ENC_SCVTF_S32_FLOAT2FIX: return \"SCVTF_S32_float2fix\";\n\t\tcase ENC_SCVTF_S32_FLOAT2INT: return \"SCVTF_S32_float2int\";\n\t\tcase ENC_SCVTF_S64_FLOAT2FIX: return \"SCVTF_S64_float2fix\";\n\t\tcase ENC_SCVTF_S64_FLOAT2INT: return \"SCVTF_S64_float2int\";\n\t\tcase ENC_SCVTF_ASIMDMISC_R: return \"SCVTF_asimdmisc_R\";\n\t\tcase ENC_SCVTF_ASIMDMISCFP16_R: return \"SCVTF_asimdmiscfp16_R\";\n\t\tcase ENC_SCVTF_ASIMDSHF_C: return \"SCVTF_asimdshf_C\";\n\t\tcase ENC_SCVTF_ASISDMISC_R: return \"SCVTF_asisdmisc_R\";\n\t\tcase ENC_SCVTF_ASISDMISCFP16_R: return \"SCVTF_asisdmiscfp16_R\";\n\t\tcase ENC_SCVTF_ASISDSHF_C: return \"SCVTF_asisdshf_C\";\n\t\tcase ENC_SDIV_32_DP_2SRC: return \"SDIV_32_dp_2src\";\n\t\tcase ENC_SDIV_64_DP_2SRC: return \"SDIV_64_dp_2src\";\n\t\tcase ENC_SDOT_ASIMDELEM_D: return \"SDOT_asimdelem_D\";\n\t\tcase ENC_SDOT_ASIMDSAME2_D: return \"SDOT_asimdsame2_D\";\n\t\tcase ENC_SETF16_ONLY_SETF: return \"SETF16_only_setf\";\n\t\tcase ENC_SETF8_ONLY_SETF: return \"SETF8_only_setf\";\n\t\tcase ENC_SEVL_HI_HINTS: return \"SEVL_HI_hints\";\n\t\tcase ENC_SEV_HI_HINTS: return \"SEV_HI_hints\";\n\t\tcase ENC_SHA1C_QSV_CRYPTOSHA3: return \"SHA1C_QSV_cryptosha3\";\n\t\tcase ENC_SHA1H_SS_CRYPTOSHA2: return \"SHA1H_SS_cryptosha2\";\n\t\tcase ENC_SHA1M_QSV_CRYPTOSHA3: return \"SHA1M_QSV_cryptosha3\";\n\t\tcase ENC_SHA1P_QSV_CRYPTOSHA3: return \"SHA1P_QSV_cryptosha3\";\n\t\tcase ENC_SHA1SU0_VVV_CRYPTOSHA3: return \"SHA1SU0_VVV_cryptosha3\";\n\t\tcase ENC_SHA1SU1_VV_CRYPTOSHA2: return \"SHA1SU1_VV_cryptosha2\";\n\t\tcase ENC_SHA256H2_QQV_CRYPTOSHA3: return \"SHA256H2_QQV_cryptosha3\";\n\t\tcase ENC_SHA256H_QQV_CRYPTOSHA3: return \"SHA256H_QQV_cryptosha3\";\n\t\tcase ENC_SHA256SU0_VV_CRYPTOSHA2: return \"SHA256SU0_VV_cryptosha2\";\n\t\tcase ENC_SHA256SU1_VVV_CRYPTOSHA3: return \"SHA256SU1_VVV_cryptosha3\";\n\t\tcase ENC_SHA512H2_QQV_CRYPTOSHA512_3: return \"SHA512H2_QQV_cryptosha512_3\";\n\t\tcase ENC_SHA512H_QQV_CRYPTOSHA512_3: return \"SHA512H_QQV_cryptosha512_3\";\n\t\tcase ENC_SHA512SU0_VV2_CRYPTOSHA512_2: return \"SHA512SU0_VV2_cryptosha512_2\";\n\t\tcase ENC_SHA512SU1_VVV2_CRYPTOSHA512_3: return \"SHA512SU1_VVV2_cryptosha512_3\";\n\t\tcase ENC_SHADD_ASIMDSAME_ONLY: return \"SHADD_asimdsame_only\";\n\t\tcase ENC_SHLL_ASIMDMISC_S: return \"SHLL_asimdmisc_S\";\n\t\tcase ENC_SHL_ASIMDSHF_R: return \"SHL_asimdshf_R\";\n\t\tcase ENC_SHL_ASISDSHF_R: return \"SHL_asisdshf_R\";\n\t\tcase ENC_SHRN_ASIMDSHF_N: return \"SHRN_asimdshf_N\";\n\t\tcase ENC_SHSUB_ASIMDSAME_ONLY: return \"SHSUB_asimdsame_only\";\n\t\tcase ENC_SLI_ASIMDSHF_R: return \"SLI_asimdshf_R\";\n\t\tcase ENC_SLI_ASISDSHF_R: return \"SLI_asisdshf_R\";\n\t\tcase ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3: return \"SM3PARTW1_VVV4_cryptosha512_3\";\n\t\tcase ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3: return \"SM3PARTW2_VVV4_cryptosha512_3\";\n\t\tcase ENC_SM3SS1_VVV4_CRYPTO4: return \"SM3SS1_VVV4_crypto4\";\n\t\tcase ENC_SM3TT1A_VVV4_CRYPTO3_IMM2: return \"SM3TT1A_VVV4_crypto3_imm2\";\n\t\tcase ENC_SM3TT1B_VVV4_CRYPTO3_IMM2: return \"SM3TT1B_VVV4_crypto3_imm2\";\n\t\tcase ENC_SM3TT2A_VVV4_CRYPTO3_IMM2: return \"SM3TT2A_VVV4_crypto3_imm2\";\n\t\tcase ENC_SM3TT2B_VVV_CRYPTO3_IMM2: return \"SM3TT2B_VVV_crypto3_imm2\";\n\t\tcase ENC_SM4EKEY_VVV4_CRYPTOSHA512_3: return \"SM4EKEY_VVV4_cryptosha512_3\";\n\t\tcase ENC_SM4E_VV4_CRYPTOSHA512_2: return \"SM4E_VV4_cryptosha512_2\";\n\t\tcase ENC_SMADDL_64WA_DP_3SRC: return \"SMADDL_64WA_dp_3src\";\n\t\tcase ENC_SMAXP_ASIMDSAME_ONLY: return \"SMAXP_asimdsame_only\";\n\t\tcase ENC_SMAXV_ASIMDALL_ONLY: return \"SMAXV_asimdall_only\";\n\t\tcase ENC_SMAX_ASIMDSAME_ONLY: return \"SMAX_asimdsame_only\";\n\t\tcase ENC_SMC_EX_EXCEPTION: return \"SMC_EX_exception\";\n\t\tcase ENC_SMINP_ASIMDSAME_ONLY: return \"SMINP_asimdsame_only\";\n\t\tcase ENC_SMINV_ASIMDALL_ONLY: return \"SMINV_asimdall_only\";\n\t\tcase ENC_SMIN_ASIMDSAME_ONLY: return \"SMIN_asimdsame_only\";\n\t\tcase ENC_SMLAL_ASIMDDIFF_L: return \"SMLAL_asimddiff_L\";\n\t\tcase ENC_SMLAL_ASIMDELEM_L: return \"SMLAL_asimdelem_L\";\n\t\tcase ENC_SMLSL_ASIMDDIFF_L: return \"SMLSL_asimddiff_L\";\n\t\tcase ENC_SMLSL_ASIMDELEM_L: return \"SMLSL_asimdelem_L\";\n\t\tcase ENC_SMMLA_ASIMDSAME2_G: return \"SMMLA_asimdsame2_G\";\n\t\tcase ENC_SMNEGL_SMSUBL_64WA_DP_3SRC: return \"SMNEGL_SMSUBL_64WA_dp_3src\";\n\t\tcase ENC_SMOV_ASIMDINS_W_W: return \"SMOV_asimdins_W_w\";\n\t\tcase ENC_SMOV_ASIMDINS_X_X: return \"SMOV_asimdins_X_x\";\n\t\tcase ENC_SMSTART_MSR_SI_PSTATE: return \"SMSTART_MSR_SI_pstate\";\n\t\tcase ENC_SMSTOP_MSR_SI_PSTATE: return \"SMSTOP_MSR_SI_pstate\";\n\t\tcase ENC_SMSUBL_64WA_DP_3SRC: return \"SMSUBL_64WA_dp_3src\";\n\t\tcase ENC_SMULH_64_DP_3SRC: return \"SMULH_64_dp_3src\";\n\t\tcase ENC_SMULL_SMADDL_64WA_DP_3SRC: return \"SMULL_SMADDL_64WA_dp_3src\";\n\t\tcase ENC_SMULL_ASIMDDIFF_L: return \"SMULL_asimddiff_L\";\n\t\tcase ENC_SMULL_ASIMDELEM_L: return \"SMULL_asimdelem_L\";\n\t\tcase ENC_SQABS_ASIMDMISC_R: return \"SQABS_asimdmisc_R\";\n\t\tcase ENC_SQABS_ASISDMISC_R: return \"SQABS_asisdmisc_R\";\n\t\tcase ENC_SQADD_ASIMDSAME_ONLY: return \"SQADD_asimdsame_only\";\n\t\tcase ENC_SQADD_ASISDSAME_ONLY: return \"SQADD_asisdsame_only\";\n\t\tcase ENC_SQDMLAL_ASIMDDIFF_L: return \"SQDMLAL_asimddiff_L\";\n\t\tcase ENC_SQDMLAL_ASIMDELEM_L: return \"SQDMLAL_asimdelem_L\";\n\t\tcase ENC_SQDMLAL_ASISDDIFF_ONLY: return \"SQDMLAL_asisddiff_only\";\n\t\tcase ENC_SQDMLAL_ASISDELEM_L: return \"SQDMLAL_asisdelem_L\";\n\t\tcase ENC_SQDMLSL_ASIMDDIFF_L: return \"SQDMLSL_asimddiff_L\";\n\t\tcase ENC_SQDMLSL_ASIMDELEM_L: return \"SQDMLSL_asimdelem_L\";\n\t\tcase ENC_SQDMLSL_ASISDDIFF_ONLY: return \"SQDMLSL_asisddiff_only\";\n\t\tcase ENC_SQDMLSL_ASISDELEM_L: return \"SQDMLSL_asisdelem_L\";\n\t\tcase ENC_SQDMULH_ASIMDELEM_R: return \"SQDMULH_asimdelem_R\";\n\t\tcase ENC_SQDMULH_ASIMDSAME_ONLY: return \"SQDMULH_asimdsame_only\";\n\t\tcase ENC_SQDMULH_ASISDELEM_R: return \"SQDMULH_asisdelem_R\";\n\t\tcase ENC_SQDMULH_ASISDSAME_ONLY: return \"SQDMULH_asisdsame_only\";\n\t\tcase ENC_SQDMULL_ASIMDDIFF_L: return \"SQDMULL_asimddiff_L\";\n\t\tcase ENC_SQDMULL_ASIMDELEM_L: return \"SQDMULL_asimdelem_L\";\n\t\tcase ENC_SQDMULL_ASISDDIFF_ONLY: return \"SQDMULL_asisddiff_only\";\n\t\tcase ENC_SQDMULL_ASISDELEM_L: return \"SQDMULL_asisdelem_L\";\n\t\tcase ENC_SQNEG_ASIMDMISC_R: return \"SQNEG_asimdmisc_R\";\n\t\tcase ENC_SQNEG_ASISDMISC_R: return \"SQNEG_asisdmisc_R\";\n\t\tcase ENC_SQRDMLAH_ASIMDELEM_R: return \"SQRDMLAH_asimdelem_R\";\n\t\tcase ENC_SQRDMLAH_ASIMDSAME2_ONLY: return \"SQRDMLAH_asimdsame2_only\";\n\t\tcase ENC_SQRDMLAH_ASISDELEM_R: return \"SQRDMLAH_asisdelem_R\";\n\t\tcase ENC_SQRDMLAH_ASISDSAME2_ONLY: return \"SQRDMLAH_asisdsame2_only\";\n\t\tcase ENC_SQRDMLSH_ASIMDELEM_R: return \"SQRDMLSH_asimdelem_R\";\n\t\tcase ENC_SQRDMLSH_ASIMDSAME2_ONLY: return \"SQRDMLSH_asimdsame2_only\";\n\t\tcase ENC_SQRDMLSH_ASISDELEM_R: return \"SQRDMLSH_asisdelem_R\";\n\t\tcase ENC_SQRDMLSH_ASISDSAME2_ONLY: return \"SQRDMLSH_asisdsame2_only\";\n\t\tcase ENC_SQRDMULH_ASIMDELEM_R: return \"SQRDMULH_asimdelem_R\";\n\t\tcase ENC_SQRDMULH_ASIMDSAME_ONLY: return \"SQRDMULH_asimdsame_only\";\n\t\tcase ENC_SQRDMULH_ASISDELEM_R: return \"SQRDMULH_asisdelem_R\";\n\t\tcase ENC_SQRDMULH_ASISDSAME_ONLY: return \"SQRDMULH_asisdsame_only\";\n\t\tcase ENC_SQRSHL_ASIMDSAME_ONLY: return \"SQRSHL_asimdsame_only\";\n\t\tcase ENC_SQRSHL_ASISDSAME_ONLY: return \"SQRSHL_asisdsame_only\";\n\t\tcase ENC_SQRSHRN_ASIMDSHF_N: return \"SQRSHRN_asimdshf_N\";\n\t\tcase ENC_SQRSHRN_ASISDSHF_N: return \"SQRSHRN_asisdshf_N\";\n\t\tcase ENC_SQRSHRUN_ASIMDSHF_N: return \"SQRSHRUN_asimdshf_N\";\n\t\tcase ENC_SQRSHRUN_ASISDSHF_N: return \"SQRSHRUN_asisdshf_N\";\n\t\tcase ENC_SQSHLU_ASIMDSHF_R: return \"SQSHLU_asimdshf_R\";\n\t\tcase ENC_SQSHLU_ASISDSHF_R: return \"SQSHLU_asisdshf_R\";\n\t\tcase ENC_SQSHL_ASIMDSAME_ONLY: return \"SQSHL_asimdsame_only\";\n\t\tcase ENC_SQSHL_ASIMDSHF_R: return \"SQSHL_asimdshf_R\";\n\t\tcase ENC_SQSHL_ASISDSAME_ONLY: return \"SQSHL_asisdsame_only\";\n\t\tcase ENC_SQSHL_ASISDSHF_R: return \"SQSHL_asisdshf_R\";\n\t\tcase ENC_SQSHRN_ASIMDSHF_N: return \"SQSHRN_asimdshf_N\";\n\t\tcase ENC_SQSHRN_ASISDSHF_N: return \"SQSHRN_asisdshf_N\";\n\t\tcase ENC_SQSHRUN_ASIMDSHF_N: return \"SQSHRUN_asimdshf_N\";\n\t\tcase ENC_SQSHRUN_ASISDSHF_N: return \"SQSHRUN_asisdshf_N\";\n\t\tcase ENC_SQSUB_ASIMDSAME_ONLY: return \"SQSUB_asimdsame_only\";\n\t\tcase ENC_SQSUB_ASISDSAME_ONLY: return \"SQSUB_asisdsame_only\";\n\t\tcase ENC_SQXTN_ASIMDMISC_N: return \"SQXTN_asimdmisc_N\";\n\t\tcase ENC_SQXTN_ASISDMISC_N: return \"SQXTN_asisdmisc_N\";\n\t\tcase ENC_SQXTUN_ASIMDMISC_N: return \"SQXTUN_asimdmisc_N\";\n\t\tcase ENC_SQXTUN_ASISDMISC_N: return \"SQXTUN_asisdmisc_N\";\n\t\tcase ENC_SRHADD_ASIMDSAME_ONLY: return \"SRHADD_asimdsame_only\";\n\t\tcase ENC_SRI_ASIMDSHF_R: return \"SRI_asimdshf_R\";\n\t\tcase ENC_SRI_ASISDSHF_R: return \"SRI_asisdshf_R\";\n\t\tcase ENC_SRSHL_ASIMDSAME_ONLY: return \"SRSHL_asimdsame_only\";\n\t\tcase ENC_SRSHL_ASISDSAME_ONLY: return \"SRSHL_asisdsame_only\";\n\t\tcase ENC_SRSHR_ASIMDSHF_R: return \"SRSHR_asimdshf_R\";\n\t\tcase ENC_SRSHR_ASISDSHF_R: return \"SRSHR_asisdshf_R\";\n\t\tcase ENC_SRSRA_ASIMDSHF_R: return \"SRSRA_asimdshf_R\";\n\t\tcase ENC_SRSRA_ASISDSHF_R: return \"SRSRA_asisdshf_R\";\n\t\tcase ENC_SSBB_DSB_BO_BARRIERS: return \"SSBB_DSB_BO_barriers\";\n\t\tcase ENC_SSHLL_ASIMDSHF_L: return \"SSHLL_asimdshf_L\";\n\t\tcase ENC_SSHL_ASIMDSAME_ONLY: return \"SSHL_asimdsame_only\";\n\t\tcase ENC_SSHL_ASISDSAME_ONLY: return \"SSHL_asisdsame_only\";\n\t\tcase ENC_SSHR_ASIMDSHF_R: return \"SSHR_asimdshf_R\";\n\t\tcase ENC_SSHR_ASISDSHF_R: return \"SSHR_asisdshf_R\";\n\t\tcase ENC_SSRA_ASIMDSHF_R: return \"SSRA_asimdshf_R\";\n\t\tcase ENC_SSRA_ASISDSHF_R: return \"SSRA_asisdshf_R\";\n\t\tcase ENC_SSUBL_ASIMDDIFF_L: return \"SSUBL_asimddiff_L\";\n\t\tcase ENC_SSUBW_ASIMDDIFF_W: return \"SSUBW_asimddiff_W\";\n\t\tcase ENC_ST1_ASISDLSE_R1_1V: return \"ST1_asisdlse_R1_1v\";\n\t\tcase ENC_ST1_ASISDLSE_R2_2V: return \"ST1_asisdlse_R2_2v\";\n\t\tcase ENC_ST1_ASISDLSE_R3_3V: return \"ST1_asisdlse_R3_3v\";\n\t\tcase ENC_ST1_ASISDLSE_R4_4V: return \"ST1_asisdlse_R4_4v\";\n\t\tcase ENC_ST1_ASISDLSEP_I1_I1: return \"ST1_asisdlsep_I1_i1\";\n\t\tcase ENC_ST1_ASISDLSEP_I2_I2: return \"ST1_asisdlsep_I2_i2\";\n\t\tcase ENC_ST1_ASISDLSEP_I3_I3: return \"ST1_asisdlsep_I3_i3\";\n\t\tcase ENC_ST1_ASISDLSEP_I4_I4: return \"ST1_asisdlsep_I4_i4\";\n\t\tcase ENC_ST1_ASISDLSEP_R1_R1: return \"ST1_asisdlsep_R1_r1\";\n\t\tcase ENC_ST1_ASISDLSEP_R2_R2: return \"ST1_asisdlsep_R2_r2\";\n\t\tcase ENC_ST1_ASISDLSEP_R3_R3: return \"ST1_asisdlsep_R3_r3\";\n\t\tcase ENC_ST1_ASISDLSEP_R4_R4: return \"ST1_asisdlsep_R4_r4\";\n\t\tcase ENC_ST1_ASISDLSO_B1_1B: return \"ST1_asisdlso_B1_1b\";\n\t\tcase ENC_ST1_ASISDLSO_D1_1D: return \"ST1_asisdlso_D1_1d\";\n\t\tcase ENC_ST1_ASISDLSO_H1_1H: return \"ST1_asisdlso_H1_1h\";\n\t\tcase ENC_ST1_ASISDLSO_S1_1S: return \"ST1_asisdlso_S1_1s\";\n\t\tcase ENC_ST1_ASISDLSOP_B1_I1B: return \"ST1_asisdlsop_B1_i1b\";\n\t\tcase ENC_ST1_ASISDLSOP_BX1_R1B: return \"ST1_asisdlsop_BX1_r1b\";\n\t\tcase ENC_ST1_ASISDLSOP_D1_I1D: return \"ST1_asisdlsop_D1_i1d\";\n\t\tcase ENC_ST1_ASISDLSOP_DX1_R1D: return \"ST1_asisdlsop_DX1_r1d\";\n\t\tcase ENC_ST1_ASISDLSOP_H1_I1H: return \"ST1_asisdlsop_H1_i1h\";\n\t\tcase ENC_ST1_ASISDLSOP_HX1_R1H: return \"ST1_asisdlsop_HX1_r1h\";\n\t\tcase ENC_ST1_ASISDLSOP_S1_I1S: return \"ST1_asisdlsop_S1_i1s\";\n\t\tcase ENC_ST1_ASISDLSOP_SX1_R1S: return \"ST1_asisdlsop_SX1_r1s\";\n\t\tcase ENC_ST2G_64SOFFSET_LDSTTAGS: return \"ST2G_64Soffset_ldsttags\";\n\t\tcase ENC_ST2G_64SPOST_LDSTTAGS: return \"ST2G_64Spost_ldsttags\";\n\t\tcase ENC_ST2G_64SPRE_LDSTTAGS: return \"ST2G_64Spre_ldsttags\";\n\t\tcase ENC_ST2_ASISDLSE_R2: return \"ST2_asisdlse_R2\";\n\t\tcase ENC_ST2_ASISDLSEP_I2_I: return \"ST2_asisdlsep_I2_i\";\n\t\tcase ENC_ST2_ASISDLSEP_R2_R: return \"ST2_asisdlsep_R2_r\";\n\t\tcase ENC_ST2_ASISDLSO_B2_2B: return \"ST2_asisdlso_B2_2b\";\n\t\tcase ENC_ST2_ASISDLSO_D2_2D: return \"ST2_asisdlso_D2_2d\";\n\t\tcase ENC_ST2_ASISDLSO_H2_2H: return \"ST2_asisdlso_H2_2h\";\n\t\tcase ENC_ST2_ASISDLSO_S2_2S: return \"ST2_asisdlso_S2_2s\";\n\t\tcase ENC_ST2_ASISDLSOP_B2_I2B: return \"ST2_asisdlsop_B2_i2b\";\n\t\tcase ENC_ST2_ASISDLSOP_BX2_R2B: return \"ST2_asisdlsop_BX2_r2b\";\n\t\tcase ENC_ST2_ASISDLSOP_D2_I2D: return \"ST2_asisdlsop_D2_i2d\";\n\t\tcase ENC_ST2_ASISDLSOP_DX2_R2D: return \"ST2_asisdlsop_DX2_r2d\";\n\t\tcase ENC_ST2_ASISDLSOP_H2_I2H: return \"ST2_asisdlsop_H2_i2h\";\n\t\tcase ENC_ST2_ASISDLSOP_HX2_R2H: return \"ST2_asisdlsop_HX2_r2h\";\n\t\tcase ENC_ST2_ASISDLSOP_S2_I2S: return \"ST2_asisdlsop_S2_i2s\";\n\t\tcase ENC_ST2_ASISDLSOP_SX2_R2S: return \"ST2_asisdlsop_SX2_r2s\";\n\t\tcase ENC_ST3_ASISDLSE_R3: return \"ST3_asisdlse_R3\";\n\t\tcase ENC_ST3_ASISDLSEP_I3_I: return \"ST3_asisdlsep_I3_i\";\n\t\tcase ENC_ST3_ASISDLSEP_R3_R: return \"ST3_asisdlsep_R3_r\";\n\t\tcase ENC_ST3_ASISDLSO_B3_3B: return \"ST3_asisdlso_B3_3b\";\n\t\tcase ENC_ST3_ASISDLSO_D3_3D: return \"ST3_asisdlso_D3_3d\";\n\t\tcase ENC_ST3_ASISDLSO_H3_3H: return \"ST3_asisdlso_H3_3h\";\n\t\tcase ENC_ST3_ASISDLSO_S3_3S: return \"ST3_asisdlso_S3_3s\";\n\t\tcase ENC_ST3_ASISDLSOP_B3_I3B: return \"ST3_asisdlsop_B3_i3b\";\n\t\tcase ENC_ST3_ASISDLSOP_BX3_R3B: return \"ST3_asisdlsop_BX3_r3b\";\n\t\tcase ENC_ST3_ASISDLSOP_D3_I3D: return \"ST3_asisdlsop_D3_i3d\";\n\t\tcase ENC_ST3_ASISDLSOP_DX3_R3D: return \"ST3_asisdlsop_DX3_r3d\";\n\t\tcase ENC_ST3_ASISDLSOP_H3_I3H: return \"ST3_asisdlsop_H3_i3h\";\n\t\tcase ENC_ST3_ASISDLSOP_HX3_R3H: return \"ST3_asisdlsop_HX3_r3h\";\n\t\tcase ENC_ST3_ASISDLSOP_S3_I3S: return \"ST3_asisdlsop_S3_i3s\";\n\t\tcase ENC_ST3_ASISDLSOP_SX3_R3S: return \"ST3_asisdlsop_SX3_r3s\";\n\t\tcase ENC_ST4_ASISDLSE_R4: return \"ST4_asisdlse_R4\";\n\t\tcase ENC_ST4_ASISDLSEP_I4_I: return \"ST4_asisdlsep_I4_i\";\n\t\tcase ENC_ST4_ASISDLSEP_R4_R: return \"ST4_asisdlsep_R4_r\";\n\t\tcase ENC_ST4_ASISDLSO_B4_4B: return \"ST4_asisdlso_B4_4b\";\n\t\tcase ENC_ST4_ASISDLSO_D4_4D: return \"ST4_asisdlso_D4_4d\";\n\t\tcase ENC_ST4_ASISDLSO_H4_4H: return \"ST4_asisdlso_H4_4h\";\n\t\tcase ENC_ST4_ASISDLSO_S4_4S: return \"ST4_asisdlso_S4_4s\";\n\t\tcase ENC_ST4_ASISDLSOP_B4_I4B: return \"ST4_asisdlsop_B4_i4b\";\n\t\tcase ENC_ST4_ASISDLSOP_BX4_R4B: return \"ST4_asisdlsop_BX4_r4b\";\n\t\tcase ENC_ST4_ASISDLSOP_D4_I4D: return \"ST4_asisdlsop_D4_i4d\";\n\t\tcase ENC_ST4_ASISDLSOP_DX4_R4D: return \"ST4_asisdlsop_DX4_r4d\";\n\t\tcase ENC_ST4_ASISDLSOP_H4_I4H: return \"ST4_asisdlsop_H4_i4h\";\n\t\tcase ENC_ST4_ASISDLSOP_HX4_R4H: return \"ST4_asisdlsop_HX4_r4h\";\n\t\tcase ENC_ST4_ASISDLSOP_S4_I4S: return \"ST4_asisdlsop_S4_i4s\";\n\t\tcase ENC_ST4_ASISDLSOP_SX4_R4S: return \"ST4_asisdlsop_SX4_r4s\";\n\t\tcase ENC_ST64BV0_64_MEMOP: return \"ST64BV0_64_memop\";\n\t\tcase ENC_ST64BV_64_MEMOP: return \"ST64BV_64_memop\";\n\t\tcase ENC_ST64B_64L_MEMOP: return \"ST64B_64L_memop\";\n\t\tcase ENC_STADDB_LDADDB_32_MEMOP: return \"STADDB_LDADDB_32_memop\";\n\t\tcase ENC_STADDH_LDADDH_32_MEMOP: return \"STADDH_LDADDH_32_memop\";\n\t\tcase ENC_STADDLB_LDADDLB_32_MEMOP: return \"STADDLB_LDADDLB_32_memop\";\n\t\tcase ENC_STADDLH_LDADDLH_32_MEMOP: return \"STADDLH_LDADDLH_32_memop\";\n\t\tcase ENC_STADDL_LDADDL_32_MEMOP: return \"STADDL_LDADDL_32_memop\";\n\t\tcase ENC_STADDL_LDADDL_64_MEMOP: return \"STADDL_LDADDL_64_memop\";\n\t\tcase ENC_STADD_LDADD_32_MEMOP: return \"STADD_LDADD_32_memop\";\n\t\tcase ENC_STADD_LDADD_64_MEMOP: return \"STADD_LDADD_64_memop\";\n\t\tcase ENC_STCLRB_LDCLRB_32_MEMOP: return \"STCLRB_LDCLRB_32_memop\";\n\t\tcase ENC_STCLRH_LDCLRH_32_MEMOP: return \"STCLRH_LDCLRH_32_memop\";\n\t\tcase ENC_STCLRLB_LDCLRLB_32_MEMOP: return \"STCLRLB_LDCLRLB_32_memop\";\n\t\tcase ENC_STCLRLH_LDCLRLH_32_MEMOP: return \"STCLRLH_LDCLRLH_32_memop\";\n\t\tcase ENC_STCLRL_LDCLRL_32_MEMOP: return \"STCLRL_LDCLRL_32_memop\";\n\t\tcase ENC_STCLRL_LDCLRL_64_MEMOP: return \"STCLRL_LDCLRL_64_memop\";\n\t\tcase ENC_STCLR_LDCLR_32_MEMOP: return \"STCLR_LDCLR_32_memop\";\n\t\tcase ENC_STCLR_LDCLR_64_MEMOP: return \"STCLR_LDCLR_64_memop\";\n\t\tcase ENC_STEORB_LDEORB_32_MEMOP: return \"STEORB_LDEORB_32_memop\";\n\t\tcase ENC_STEORH_LDEORH_32_MEMOP: return \"STEORH_LDEORH_32_memop\";\n\t\tcase ENC_STEORLB_LDEORLB_32_MEMOP: return \"STEORLB_LDEORLB_32_memop\";\n\t\tcase ENC_STEORLH_LDEORLH_32_MEMOP: return \"STEORLH_LDEORLH_32_memop\";\n\t\tcase ENC_STEORL_LDEORL_32_MEMOP: return \"STEORL_LDEORL_32_memop\";\n\t\tcase ENC_STEORL_LDEORL_64_MEMOP: return \"STEORL_LDEORL_64_memop\";\n\t\tcase ENC_STEOR_LDEOR_32_MEMOP: return \"STEOR_LDEOR_32_memop\";\n\t\tcase ENC_STEOR_LDEOR_64_MEMOP: return \"STEOR_LDEOR_64_memop\";\n\t\tcase ENC_STGM_64BULK_LDSTTAGS: return \"STGM_64bulk_ldsttags\";\n\t\tcase ENC_STGP_64_LDSTPAIR_OFF: return \"STGP_64_ldstpair_off\";\n\t\tcase ENC_STGP_64_LDSTPAIR_POST: return \"STGP_64_ldstpair_post\";\n\t\tcase ENC_STGP_64_LDSTPAIR_PRE: return \"STGP_64_ldstpair_pre\";\n\t\tcase ENC_STG_64SOFFSET_LDSTTAGS: return \"STG_64Soffset_ldsttags\";\n\t\tcase ENC_STG_64SPOST_LDSTTAGS: return \"STG_64Spost_ldsttags\";\n\t\tcase ENC_STG_64SPRE_LDSTTAGS: return \"STG_64Spre_ldsttags\";\n\t\tcase ENC_STLLRB_SL32_LDSTORD: return \"STLLRB_SL32_ldstord\";\n\t\tcase ENC_STLLRH_SL32_LDSTORD: return \"STLLRH_SL32_ldstord\";\n\t\tcase ENC_STLLR_SL32_LDSTORD: return \"STLLR_SL32_ldstord\";\n\t\tcase ENC_STLLR_SL64_LDSTORD: return \"STLLR_SL64_ldstord\";\n\t\tcase ENC_STLRB_SL32_LDSTORD: return \"STLRB_SL32_ldstord\";\n\t\tcase ENC_STLRH_SL32_LDSTORD: return \"STLRH_SL32_ldstord\";\n\t\tcase ENC_STLR_SL32_LDSTORD: return \"STLR_SL32_ldstord\";\n\t\tcase ENC_STLR_SL64_LDSTORD: return \"STLR_SL64_ldstord\";\n\t\tcase ENC_STLURB_32_LDAPSTL_UNSCALED: return \"STLURB_32_ldapstl_unscaled\";\n\t\tcase ENC_STLURH_32_LDAPSTL_UNSCALED: return \"STLURH_32_ldapstl_unscaled\";\n\t\tcase ENC_STLUR_32_LDAPSTL_UNSCALED: return \"STLUR_32_ldapstl_unscaled\";\n\t\tcase ENC_STLUR_64_LDAPSTL_UNSCALED: return \"STLUR_64_ldapstl_unscaled\";\n\t\tcase ENC_STLXP_SP32_LDSTEXCLP: return \"STLXP_SP32_ldstexclp\";\n\t\tcase ENC_STLXP_SP64_LDSTEXCLP: return \"STLXP_SP64_ldstexclp\";\n\t\tcase ENC_STLXRB_SR32_LDSTEXCLR: return \"STLXRB_SR32_ldstexclr\";\n\t\tcase ENC_STLXRH_SR32_LDSTEXCLR: return \"STLXRH_SR32_ldstexclr\";\n\t\tcase ENC_STLXR_SR32_LDSTEXCLR: return \"STLXR_SR32_ldstexclr\";\n\t\tcase ENC_STLXR_SR64_LDSTEXCLR: return \"STLXR_SR64_ldstexclr\";\n\t\tcase ENC_STNP_32_LDSTNAPAIR_OFFS: return \"STNP_32_ldstnapair_offs\";\n\t\tcase ENC_STNP_64_LDSTNAPAIR_OFFS: return \"STNP_64_ldstnapair_offs\";\n\t\tcase ENC_STNP_D_LDSTNAPAIR_OFFS: return \"STNP_D_ldstnapair_offs\";\n\t\tcase ENC_STNP_Q_LDSTNAPAIR_OFFS: return \"STNP_Q_ldstnapair_offs\";\n\t\tcase ENC_STNP_S_LDSTNAPAIR_OFFS: return \"STNP_S_ldstnapair_offs\";\n\t\tcase ENC_STP_32_LDSTPAIR_OFF: return \"STP_32_ldstpair_off\";\n\t\tcase ENC_STP_32_LDSTPAIR_POST: return \"STP_32_ldstpair_post\";\n\t\tcase ENC_STP_32_LDSTPAIR_PRE: return \"STP_32_ldstpair_pre\";\n\t\tcase ENC_STP_64_LDSTPAIR_OFF: return \"STP_64_ldstpair_off\";\n\t\tcase ENC_STP_64_LDSTPAIR_POST: return \"STP_64_ldstpair_post\";\n\t\tcase ENC_STP_64_LDSTPAIR_PRE: return \"STP_64_ldstpair_pre\";\n\t\tcase ENC_STP_D_LDSTPAIR_OFF: return \"STP_D_ldstpair_off\";\n\t\tcase ENC_STP_D_LDSTPAIR_POST: return \"STP_D_ldstpair_post\";\n\t\tcase ENC_STP_D_LDSTPAIR_PRE: return \"STP_D_ldstpair_pre\";\n\t\tcase ENC_STP_Q_LDSTPAIR_OFF: return \"STP_Q_ldstpair_off\";\n\t\tcase ENC_STP_Q_LDSTPAIR_POST: return \"STP_Q_ldstpair_post\";\n\t\tcase ENC_STP_Q_LDSTPAIR_PRE: return \"STP_Q_ldstpair_pre\";\n\t\tcase ENC_STP_S_LDSTPAIR_OFF: return \"STP_S_ldstpair_off\";\n\t\tcase ENC_STP_S_LDSTPAIR_POST: return \"STP_S_ldstpair_post\";\n\t\tcase ENC_STP_S_LDSTPAIR_PRE: return \"STP_S_ldstpair_pre\";\n\t\tcase ENC_STRB_32BL_LDST_REGOFF: return \"STRB_32BL_ldst_regoff\";\n\t\tcase ENC_STRB_32B_LDST_REGOFF: return \"STRB_32B_ldst_regoff\";\n\t\tcase ENC_STRB_32_LDST_IMMPOST: return \"STRB_32_ldst_immpost\";\n\t\tcase ENC_STRB_32_LDST_IMMPRE: return \"STRB_32_ldst_immpre\";\n\t\tcase ENC_STRB_32_LDST_POS: return \"STRB_32_ldst_pos\";\n\t\tcase ENC_STRH_32_LDST_IMMPOST: return \"STRH_32_ldst_immpost\";\n\t\tcase ENC_STRH_32_LDST_IMMPRE: return \"STRH_32_ldst_immpre\";\n\t\tcase ENC_STRH_32_LDST_POS: return \"STRH_32_ldst_pos\";\n\t\tcase ENC_STRH_32_LDST_REGOFF: return \"STRH_32_ldst_regoff\";\n\t\tcase ENC_STR_32_LDST_IMMPOST: return \"STR_32_ldst_immpost\";\n\t\tcase ENC_STR_32_LDST_IMMPRE: return \"STR_32_ldst_immpre\";\n\t\tcase ENC_STR_32_LDST_POS: return \"STR_32_ldst_pos\";\n\t\tcase ENC_STR_32_LDST_REGOFF: return \"STR_32_ldst_regoff\";\n\t\tcase ENC_STR_64_LDST_IMMPOST: return \"STR_64_ldst_immpost\";\n\t\tcase ENC_STR_64_LDST_IMMPRE: return \"STR_64_ldst_immpre\";\n\t\tcase ENC_STR_64_LDST_POS: return \"STR_64_ldst_pos\";\n\t\tcase ENC_STR_64_LDST_REGOFF: return \"STR_64_ldst_regoff\";\n\t\tcase ENC_STR_BL_LDST_REGOFF: return \"STR_BL_ldst_regoff\";\n\t\tcase ENC_STR_B_LDST_IMMPOST: return \"STR_B_ldst_immpost\";\n\t\tcase ENC_STR_B_LDST_IMMPRE: return \"STR_B_ldst_immpre\";\n\t\tcase ENC_STR_B_LDST_POS: return \"STR_B_ldst_pos\";\n\t\tcase ENC_STR_B_LDST_REGOFF: return \"STR_B_ldst_regoff\";\n\t\tcase ENC_STR_D_LDST_IMMPOST: return \"STR_D_ldst_immpost\";\n\t\tcase ENC_STR_D_LDST_IMMPRE: return \"STR_D_ldst_immpre\";\n\t\tcase ENC_STR_D_LDST_POS: return \"STR_D_ldst_pos\";\n\t\tcase ENC_STR_D_LDST_REGOFF: return \"STR_D_ldst_regoff\";\n\t\tcase ENC_STR_H_LDST_IMMPOST: return \"STR_H_ldst_immpost\";\n\t\tcase ENC_STR_H_LDST_IMMPRE: return \"STR_H_ldst_immpre\";\n\t\tcase ENC_STR_H_LDST_POS: return \"STR_H_ldst_pos\";\n\t\tcase ENC_STR_H_LDST_REGOFF: return \"STR_H_ldst_regoff\";\n\t\tcase ENC_STR_Q_LDST_IMMPOST: return \"STR_Q_ldst_immpost\";\n\t\tcase ENC_STR_Q_LDST_IMMPRE: return \"STR_Q_ldst_immpre\";\n\t\tcase ENC_STR_Q_LDST_POS: return \"STR_Q_ldst_pos\";\n\t\tcase ENC_STR_Q_LDST_REGOFF: return \"STR_Q_ldst_regoff\";\n\t\tcase ENC_STR_S_LDST_IMMPOST: return \"STR_S_ldst_immpost\";\n\t\tcase ENC_STR_S_LDST_IMMPRE: return \"STR_S_ldst_immpre\";\n\t\tcase ENC_STR_S_LDST_POS: return \"STR_S_ldst_pos\";\n\t\tcase ENC_STR_S_LDST_REGOFF: return \"STR_S_ldst_regoff\";\n\t\tcase ENC_STSETB_LDSETB_32_MEMOP: return \"STSETB_LDSETB_32_memop\";\n\t\tcase ENC_STSETH_LDSETH_32_MEMOP: return \"STSETH_LDSETH_32_memop\";\n\t\tcase ENC_STSETLB_LDSETLB_32_MEMOP: return \"STSETLB_LDSETLB_32_memop\";\n\t\tcase ENC_STSETLH_LDSETLH_32_MEMOP: return \"STSETLH_LDSETLH_32_memop\";\n\t\tcase ENC_STSETL_LDSETL_32_MEMOP: return \"STSETL_LDSETL_32_memop\";\n\t\tcase ENC_STSETL_LDSETL_64_MEMOP: return \"STSETL_LDSETL_64_memop\";\n\t\tcase ENC_STSET_LDSET_32_MEMOP: return \"STSET_LDSET_32_memop\";\n\t\tcase ENC_STSET_LDSET_64_MEMOP: return \"STSET_LDSET_64_memop\";\n\t\tcase ENC_STSMAXB_LDSMAXB_32_MEMOP: return \"STSMAXB_LDSMAXB_32_memop\";\n\t\tcase ENC_STSMAXH_LDSMAXH_32_MEMOP: return \"STSMAXH_LDSMAXH_32_memop\";\n\t\tcase ENC_STSMAXLB_LDSMAXLB_32_MEMOP: return \"STSMAXLB_LDSMAXLB_32_memop\";\n\t\tcase ENC_STSMAXLH_LDSMAXLH_32_MEMOP: return \"STSMAXLH_LDSMAXLH_32_memop\";\n\t\tcase ENC_STSMAXL_LDSMAXL_32_MEMOP: return \"STSMAXL_LDSMAXL_32_memop\";\n\t\tcase ENC_STSMAXL_LDSMAXL_64_MEMOP: return \"STSMAXL_LDSMAXL_64_memop\";\n\t\tcase ENC_STSMAX_LDSMAX_32_MEMOP: return \"STSMAX_LDSMAX_32_memop\";\n\t\tcase ENC_STSMAX_LDSMAX_64_MEMOP: return \"STSMAX_LDSMAX_64_memop\";\n\t\tcase ENC_STSMINB_LDSMINB_32_MEMOP: return \"STSMINB_LDSMINB_32_memop\";\n\t\tcase ENC_STSMINH_LDSMINH_32_MEMOP: return \"STSMINH_LDSMINH_32_memop\";\n\t\tcase ENC_STSMINLB_LDSMINLB_32_MEMOP: return \"STSMINLB_LDSMINLB_32_memop\";\n\t\tcase ENC_STSMINLH_LDSMINLH_32_MEMOP: return \"STSMINLH_LDSMINLH_32_memop\";\n\t\tcase ENC_STSMINL_LDSMINL_32_MEMOP: return \"STSMINL_LDSMINL_32_memop\";\n\t\tcase ENC_STSMINL_LDSMINL_64_MEMOP: return \"STSMINL_LDSMINL_64_memop\";\n\t\tcase ENC_STSMIN_LDSMIN_32_MEMOP: return \"STSMIN_LDSMIN_32_memop\";\n\t\tcase ENC_STSMIN_LDSMIN_64_MEMOP: return \"STSMIN_LDSMIN_64_memop\";\n\t\tcase ENC_STTRB_32_LDST_UNPRIV: return \"STTRB_32_ldst_unpriv\";\n\t\tcase ENC_STTRH_32_LDST_UNPRIV: return \"STTRH_32_ldst_unpriv\";\n\t\tcase ENC_STTR_32_LDST_UNPRIV: return \"STTR_32_ldst_unpriv\";\n\t\tcase ENC_STTR_64_LDST_UNPRIV: return \"STTR_64_ldst_unpriv\";\n\t\tcase ENC_STUMAXB_LDUMAXB_32_MEMOP: return \"STUMAXB_LDUMAXB_32_memop\";\n\t\tcase ENC_STUMAXH_LDUMAXH_32_MEMOP: return \"STUMAXH_LDUMAXH_32_memop\";\n\t\tcase ENC_STUMAXLB_LDUMAXLB_32_MEMOP: return \"STUMAXLB_LDUMAXLB_32_memop\";\n\t\tcase ENC_STUMAXLH_LDUMAXLH_32_MEMOP: return \"STUMAXLH_LDUMAXLH_32_memop\";\n\t\tcase ENC_STUMAXL_LDUMAXL_32_MEMOP: return \"STUMAXL_LDUMAXL_32_memop\";\n\t\tcase ENC_STUMAXL_LDUMAXL_64_MEMOP: return \"STUMAXL_LDUMAXL_64_memop\";\n\t\tcase ENC_STUMAX_LDUMAX_32_MEMOP: return \"STUMAX_LDUMAX_32_memop\";\n\t\tcase ENC_STUMAX_LDUMAX_64_MEMOP: return \"STUMAX_LDUMAX_64_memop\";\n\t\tcase ENC_STUMINB_LDUMINB_32_MEMOP: return \"STUMINB_LDUMINB_32_memop\";\n\t\tcase ENC_STUMINH_LDUMINH_32_MEMOP: return \"STUMINH_LDUMINH_32_memop\";\n\t\tcase ENC_STUMINLB_LDUMINLB_32_MEMOP: return \"STUMINLB_LDUMINLB_32_memop\";\n\t\tcase ENC_STUMINLH_LDUMINLH_32_MEMOP: return \"STUMINLH_LDUMINLH_32_memop\";\n\t\tcase ENC_STUMINL_LDUMINL_32_MEMOP: return \"STUMINL_LDUMINL_32_memop\";\n\t\tcase ENC_STUMINL_LDUMINL_64_MEMOP: return \"STUMINL_LDUMINL_64_memop\";\n\t\tcase ENC_STUMIN_LDUMIN_32_MEMOP: return \"STUMIN_LDUMIN_32_memop\";\n\t\tcase ENC_STUMIN_LDUMIN_64_MEMOP: return \"STUMIN_LDUMIN_64_memop\";\n\t\tcase ENC_STURB_32_LDST_UNSCALED: return \"STURB_32_ldst_unscaled\";\n\t\tcase ENC_STURH_32_LDST_UNSCALED: return \"STURH_32_ldst_unscaled\";\n\t\tcase ENC_STUR_32_LDST_UNSCALED: return \"STUR_32_ldst_unscaled\";\n\t\tcase ENC_STUR_64_LDST_UNSCALED: return \"STUR_64_ldst_unscaled\";\n\t\tcase ENC_STUR_B_LDST_UNSCALED: return \"STUR_B_ldst_unscaled\";\n\t\tcase ENC_STUR_D_LDST_UNSCALED: return \"STUR_D_ldst_unscaled\";\n\t\tcase ENC_STUR_H_LDST_UNSCALED: return \"STUR_H_ldst_unscaled\";\n\t\tcase ENC_STUR_Q_LDST_UNSCALED: return \"STUR_Q_ldst_unscaled\";\n\t\tcase ENC_STUR_S_LDST_UNSCALED: return \"STUR_S_ldst_unscaled\";\n\t\tcase ENC_STXP_SP32_LDSTEXCLP: return \"STXP_SP32_ldstexclp\";\n\t\tcase ENC_STXP_SP64_LDSTEXCLP: return \"STXP_SP64_ldstexclp\";\n\t\tcase ENC_STXRB_SR32_LDSTEXCLR: return \"STXRB_SR32_ldstexclr\";\n\t\tcase ENC_STXRH_SR32_LDSTEXCLR: return \"STXRH_SR32_ldstexclr\";\n\t\tcase ENC_STXR_SR32_LDSTEXCLR: return \"STXR_SR32_ldstexclr\";\n\t\tcase ENC_STXR_SR64_LDSTEXCLR: return \"STXR_SR64_ldstexclr\";\n\t\tcase ENC_STZ2G_64SOFFSET_LDSTTAGS: return \"STZ2G_64Soffset_ldsttags\";\n\t\tcase ENC_STZ2G_64SPOST_LDSTTAGS: return \"STZ2G_64Spost_ldsttags\";\n\t\tcase ENC_STZ2G_64SPRE_LDSTTAGS: return \"STZ2G_64Spre_ldsttags\";\n\t\tcase ENC_STZGM_64BULK_LDSTTAGS: return \"STZGM_64bulk_ldsttags\";\n\t\tcase ENC_STZG_64SOFFSET_LDSTTAGS: return \"STZG_64Soffset_ldsttags\";\n\t\tcase ENC_STZG_64SPOST_LDSTTAGS: return \"STZG_64Spost_ldsttags\";\n\t\tcase ENC_STZG_64SPRE_LDSTTAGS: return \"STZG_64Spre_ldsttags\";\n\t\tcase ENC_SUBG_64_ADDSUB_IMMTAGS: return \"SUBG_64_addsub_immtags\";\n\t\tcase ENC_SUBHN_ASIMDDIFF_N: return \"SUBHN_asimddiff_N\";\n\t\tcase ENC_SUBPS_64S_DP_2SRC: return \"SUBPS_64S_dp_2src\";\n\t\tcase ENC_SUBP_64S_DP_2SRC: return \"SUBP_64S_dp_2src\";\n\t\tcase ENC_SUBS_32S_ADDSUB_EXT: return \"SUBS_32S_addsub_ext\";\n\t\tcase ENC_SUBS_32S_ADDSUB_IMM: return \"SUBS_32S_addsub_imm\";\n\t\tcase ENC_SUBS_32_ADDSUB_SHIFT: return \"SUBS_32_addsub_shift\";\n\t\tcase ENC_SUBS_64S_ADDSUB_EXT: return \"SUBS_64S_addsub_ext\";\n\t\tcase ENC_SUBS_64S_ADDSUB_IMM: return \"SUBS_64S_addsub_imm\";\n\t\tcase ENC_SUBS_64_ADDSUB_SHIFT: return \"SUBS_64_addsub_shift\";\n\t\tcase ENC_SUB_32_ADDSUB_EXT: return \"SUB_32_addsub_ext\";\n\t\tcase ENC_SUB_32_ADDSUB_IMM: return \"SUB_32_addsub_imm\";\n\t\tcase ENC_SUB_32_ADDSUB_SHIFT: return \"SUB_32_addsub_shift\";\n\t\tcase ENC_SUB_64_ADDSUB_EXT: return \"SUB_64_addsub_ext\";\n\t\tcase ENC_SUB_64_ADDSUB_IMM: return \"SUB_64_addsub_imm\";\n\t\tcase ENC_SUB_64_ADDSUB_SHIFT: return \"SUB_64_addsub_shift\";\n\t\tcase ENC_SUB_ASIMDSAME_ONLY: return \"SUB_asimdsame_only\";\n\t\tcase ENC_SUB_ASISDSAME_ONLY: return \"SUB_asisdsame_only\";\n\t\tcase ENC_SUDOT_ASIMDELEM_D: return \"SUDOT_asimdelem_D\";\n\t\tcase ENC_SUQADD_ASIMDMISC_R: return \"SUQADD_asimdmisc_R\";\n\t\tcase ENC_SUQADD_ASISDMISC_R: return \"SUQADD_asisdmisc_R\";\n\t\tcase ENC_SVC_EX_EXCEPTION: return \"SVC_EX_exception\";\n\t\tcase ENC_SWPAB_32_MEMOP: return \"SWPAB_32_memop\";\n\t\tcase ENC_SWPAH_32_MEMOP: return \"SWPAH_32_memop\";\n\t\tcase ENC_SWPALB_32_MEMOP: return \"SWPALB_32_memop\";\n\t\tcase ENC_SWPALH_32_MEMOP: return \"SWPALH_32_memop\";\n\t\tcase ENC_SWPAL_32_MEMOP: return \"SWPAL_32_memop\";\n\t\tcase ENC_SWPAL_64_MEMOP: return \"SWPAL_64_memop\";\n\t\tcase ENC_SWPA_32_MEMOP: return \"SWPA_32_memop\";\n\t\tcase ENC_SWPA_64_MEMOP: return \"SWPA_64_memop\";\n\t\tcase ENC_SWPB_32_MEMOP: return \"SWPB_32_memop\";\n\t\tcase ENC_SWPH_32_MEMOP: return \"SWPH_32_memop\";\n\t\tcase ENC_SWPLB_32_MEMOP: return \"SWPLB_32_memop\";\n\t\tcase ENC_SWPLH_32_MEMOP: return \"SWPLH_32_memop\";\n\t\tcase ENC_SWPL_32_MEMOP: return \"SWPL_32_memop\";\n\t\tcase ENC_SWPL_64_MEMOP: return \"SWPL_64_memop\";\n\t\tcase ENC_SWP_32_MEMOP: return \"SWP_32_memop\";\n\t\tcase ENC_SWP_64_MEMOP: return \"SWP_64_memop\";\n\t\tcase ENC_SXTB_SBFM_32M_BITFIELD: return \"SXTB_SBFM_32M_bitfield\";\n\t\tcase ENC_SXTB_SBFM_64M_BITFIELD: return \"SXTB_SBFM_64M_bitfield\";\n\t\tcase ENC_SXTH_SBFM_32M_BITFIELD: return \"SXTH_SBFM_32M_bitfield\";\n\t\tcase ENC_SXTH_SBFM_64M_BITFIELD: return \"SXTH_SBFM_64M_bitfield\";\n\t\tcase ENC_SXTL_SSHLL_ASIMDSHF_L: return \"SXTL_SSHLL_asimdshf_L\";\n\t\tcase ENC_SXTW_SBFM_64M_BITFIELD: return \"SXTW_SBFM_64M_bitfield\";\n\t\tcase ENC_SYSL_RC_SYSTEMINSTRS: return \"SYSL_RC_systeminstrs\";\n\t\tcase ENC_SYS_CR_SYSTEMINSTRS: return \"SYS_CR_systeminstrs\";\n\t\tcase ENC_TBL_ASIMDTBL_L1_1: return \"TBL_asimdtbl_L1_1\";\n\t\tcase ENC_TBL_ASIMDTBL_L2_2: return \"TBL_asimdtbl_L2_2\";\n\t\tcase ENC_TBL_ASIMDTBL_L3_3: return \"TBL_asimdtbl_L3_3\";\n\t\tcase ENC_TBL_ASIMDTBL_L4_4: return \"TBL_asimdtbl_L4_4\";\n\t\tcase ENC_TBNZ_ONLY_TESTBRANCH: return \"TBNZ_only_testbranch\";\n\t\tcase ENC_TBX_ASIMDTBL_L1_1: return \"TBX_asimdtbl_L1_1\";\n\t\tcase ENC_TBX_ASIMDTBL_L2_2: return \"TBX_asimdtbl_L2_2\";\n\t\tcase ENC_TBX_ASIMDTBL_L3_3: return \"TBX_asimdtbl_L3_3\";\n\t\tcase ENC_TBX_ASIMDTBL_L4_4: return \"TBX_asimdtbl_L4_4\";\n\t\tcase ENC_TBZ_ONLY_TESTBRANCH: return \"TBZ_only_testbranch\";\n\t\tcase ENC_TCANCEL_EX_EXCEPTION: return \"TCANCEL_EX_exception\";\n\t\tcase ENC_TCOMMIT_ONLY_BARRIERS: return \"TCOMMIT_only_barriers\";\n\t\tcase ENC_TLBI_SYS_CR_SYSTEMINSTRS: return \"TLBI_SYS_CR_systeminstrs\";\n\t\tcase ENC_TRN1_ASIMDPERM_ONLY: return \"TRN1_asimdperm_only\";\n\t\tcase ENC_TRN2_ASIMDPERM_ONLY: return \"TRN2_asimdperm_only\";\n\t\tcase ENC_TSB_HC_HINTS: return \"TSB_HC_hints\";\n\t\tcase ENC_TSTART_BR_SYSTEMRESULT: return \"TSTART_BR_systemresult\";\n\t\tcase ENC_TST_ANDS_32S_LOG_IMM: return \"TST_ANDS_32S_log_imm\";\n\t\tcase ENC_TST_ANDS_32_LOG_SHIFT: return \"TST_ANDS_32_log_shift\";\n\t\tcase ENC_TST_ANDS_64S_LOG_IMM: return \"TST_ANDS_64S_log_imm\";\n\t\tcase ENC_TST_ANDS_64_LOG_SHIFT: return \"TST_ANDS_64_log_shift\";\n\t\tcase ENC_TTEST_BR_SYSTEMRESULT: return \"TTEST_BR_systemresult\";\n\t\tcase ENC_UABAL_ASIMDDIFF_L: return \"UABAL_asimddiff_L\";\n\t\tcase ENC_UABA_ASIMDSAME_ONLY: return \"UABA_asimdsame_only\";\n\t\tcase ENC_UABDL_ASIMDDIFF_L: return \"UABDL_asimddiff_L\";\n\t\tcase ENC_UABD_ASIMDSAME_ONLY: return \"UABD_asimdsame_only\";\n\t\tcase ENC_UADALP_ASIMDMISC_P: return \"UADALP_asimdmisc_P\";\n\t\tcase ENC_UADDLP_ASIMDMISC_P: return \"UADDLP_asimdmisc_P\";\n\t\tcase ENC_UADDLV_ASIMDALL_ONLY: return \"UADDLV_asimdall_only\";\n\t\tcase ENC_UADDL_ASIMDDIFF_L: return \"UADDL_asimddiff_L\";\n\t\tcase ENC_UADDW_ASIMDDIFF_W: return \"UADDW_asimddiff_W\";\n\t\tcase ENC_UBFIZ_UBFM_32M_BITFIELD: return \"UBFIZ_UBFM_32M_bitfield\";\n\t\tcase ENC_UBFIZ_UBFM_64M_BITFIELD: return \"UBFIZ_UBFM_64M_bitfield\";\n\t\tcase ENC_UBFM_32M_BITFIELD: return \"UBFM_32M_bitfield\";\n\t\tcase ENC_UBFM_64M_BITFIELD: return \"UBFM_64M_bitfield\";\n\t\tcase ENC_UBFX_UBFM_32M_BITFIELD: return \"UBFX_UBFM_32M_bitfield\";\n\t\tcase ENC_UBFX_UBFM_64M_BITFIELD: return \"UBFX_UBFM_64M_bitfield\";\n\t\tcase ENC_UCVTF_D32_FLOAT2FIX: return \"UCVTF_D32_float2fix\";\n\t\tcase ENC_UCVTF_D32_FLOAT2INT: return \"UCVTF_D32_float2int\";\n\t\tcase ENC_UCVTF_D64_FLOAT2FIX: return \"UCVTF_D64_float2fix\";\n\t\tcase ENC_UCVTF_D64_FLOAT2INT: return \"UCVTF_D64_float2int\";\n\t\tcase ENC_UCVTF_H32_FLOAT2FIX: return \"UCVTF_H32_float2fix\";\n\t\tcase ENC_UCVTF_H32_FLOAT2INT: return \"UCVTF_H32_float2int\";\n\t\tcase ENC_UCVTF_H64_FLOAT2FIX: return \"UCVTF_H64_float2fix\";\n\t\tcase ENC_UCVTF_H64_FLOAT2INT: return \"UCVTF_H64_float2int\";\n\t\tcase ENC_UCVTF_S32_FLOAT2FIX: return \"UCVTF_S32_float2fix\";\n\t\tcase ENC_UCVTF_S32_FLOAT2INT: return \"UCVTF_S32_float2int\";\n\t\tcase ENC_UCVTF_S64_FLOAT2FIX: return \"UCVTF_S64_float2fix\";\n\t\tcase ENC_UCVTF_S64_FLOAT2INT: return \"UCVTF_S64_float2int\";\n\t\tcase ENC_UCVTF_ASIMDMISC_R: return \"UCVTF_asimdmisc_R\";\n\t\tcase ENC_UCVTF_ASIMDMISCFP16_R: return \"UCVTF_asimdmiscfp16_R\";\n\t\tcase ENC_UCVTF_ASIMDSHF_C: return \"UCVTF_asimdshf_C\";\n\t\tcase ENC_UCVTF_ASISDMISC_R: return \"UCVTF_asisdmisc_R\";\n\t\tcase ENC_UCVTF_ASISDMISCFP16_R: return \"UCVTF_asisdmiscfp16_R\";\n\t\tcase ENC_UCVTF_ASISDSHF_C: return \"UCVTF_asisdshf_C\";\n\t\tcase ENC_UDF_ONLY_PERM_UNDEF: return \"UDF_only_perm_undef\";\n\t\tcase ENC_UDIV_32_DP_2SRC: return \"UDIV_32_dp_2src\";\n\t\tcase ENC_UDIV_64_DP_2SRC: return \"UDIV_64_dp_2src\";\n\t\tcase ENC_UDOT_ASIMDELEM_D: return \"UDOT_asimdelem_D\";\n\t\tcase ENC_UDOT_ASIMDSAME2_D: return \"UDOT_asimdsame2_D\";\n\t\tcase ENC_UHADD_ASIMDSAME_ONLY: return \"UHADD_asimdsame_only\";\n\t\tcase ENC_UHSUB_ASIMDSAME_ONLY: return \"UHSUB_asimdsame_only\";\n\t\tcase ENC_UMADDL_64WA_DP_3SRC: return \"UMADDL_64WA_dp_3src\";\n\t\tcase ENC_UMAXP_ASIMDSAME_ONLY: return \"UMAXP_asimdsame_only\";\n\t\tcase ENC_UMAXV_ASIMDALL_ONLY: return \"UMAXV_asimdall_only\";\n\t\tcase ENC_UMAX_ASIMDSAME_ONLY: return \"UMAX_asimdsame_only\";\n\t\tcase ENC_UMINP_ASIMDSAME_ONLY: return \"UMINP_asimdsame_only\";\n\t\tcase ENC_UMINV_ASIMDALL_ONLY: return \"UMINV_asimdall_only\";\n\t\tcase ENC_UMIN_ASIMDSAME_ONLY: return \"UMIN_asimdsame_only\";\n\t\tcase ENC_UMLAL_ASIMDDIFF_L: return \"UMLAL_asimddiff_L\";\n\t\tcase ENC_UMLAL_ASIMDELEM_L: return \"UMLAL_asimdelem_L\";\n\t\tcase ENC_UMLSL_ASIMDDIFF_L: return \"UMLSL_asimddiff_L\";\n\t\tcase ENC_UMLSL_ASIMDELEM_L: return \"UMLSL_asimdelem_L\";\n\t\tcase ENC_UMMLA_ASIMDSAME2_G: return \"UMMLA_asimdsame2_G\";\n\t\tcase ENC_UMNEGL_UMSUBL_64WA_DP_3SRC: return \"UMNEGL_UMSUBL_64WA_dp_3src\";\n\t\tcase ENC_UMOV_ASIMDINS_W_W: return \"UMOV_asimdins_W_w\";\n\t\tcase ENC_UMOV_ASIMDINS_X_X: return \"UMOV_asimdins_X_x\";\n\t\tcase ENC_UMSUBL_64WA_DP_3SRC: return \"UMSUBL_64WA_dp_3src\";\n\t\tcase ENC_UMULH_64_DP_3SRC: return \"UMULH_64_dp_3src\";\n\t\tcase ENC_UMULL_UMADDL_64WA_DP_3SRC: return \"UMULL_UMADDL_64WA_dp_3src\";\n\t\tcase ENC_UMULL_ASIMDDIFF_L: return \"UMULL_asimddiff_L\";\n\t\tcase ENC_UMULL_ASIMDELEM_L: return \"UMULL_asimdelem_L\";\n\t\tcase ENC_UNALLOCATED_100_ASIMDSAME: return \"UNALLOCATED_100_asimdsame\";\n\t\tcase ENC_UNALLOCATED_10_ADDSUB_EXT: return \"UNALLOCATED_10_addsub_ext\";\n\t\tcase ENC_UNALLOCATED_10_ADDSUB_IMMTAGS: return \"UNALLOCATED_10_addsub_immtags\";\n\t\tcase ENC_UNALLOCATED_10_ADDSUB_SHIFT: return \"UNALLOCATED_10_addsub_shift\";\n\t\tcase ENC_UNALLOCATED_10_BARRIERS: return \"UNALLOCATED_10_barriers\";\n\t\tcase ENC_UNALLOCATED_10_BRANCH_REG: return \"UNALLOCATED_10_branch_reg\";\n\t\tcase ENC_UNALLOCATED_10_COMSWAP: return \"UNALLOCATED_10_comswap\";\n\t\tcase ENC_UNALLOCATED_10_COMSWAPPR: return \"UNALLOCATED_10_comswappr\";\n\t\tcase ENC_UNALLOCATED_10_CONDCMP_IMM: return \"UNALLOCATED_10_condcmp_imm\";\n\t\tcase ENC_UNALLOCATED_10_CONDCMP_REG: return \"UNALLOCATED_10_condcmp_reg\";\n\t\tcase ENC_UNALLOCATED_10_CONDSEL: return \"UNALLOCATED_10_condsel\";\n\t\tcase ENC_UNALLOCATED_10_DP_1SRC: return \"UNALLOCATED_10_dp_1src\";\n\t\tcase ENC_UNALLOCATED_10_EXCEPTION: return \"UNALLOCATED_10_exception\";\n\t\tcase ENC_UNALLOCATED_10_FLOAT2FIX: return \"UNALLOCATED_10_float2fix\";\n\t\tcase ENC_UNALLOCATED_10_FLOAT2INT: return \"UNALLOCATED_10_float2int\";\n\t\tcase ENC_UNALLOCATED_10_FLOATCCMP: return \"UNALLOCATED_10_floatccmp\";\n\t\tcase ENC_UNALLOCATED_10_FLOATCMP: return \"UNALLOCATED_10_floatcmp\";\n\t\tcase ENC_UNALLOCATED_10_FLOATDP1: return \"UNALLOCATED_10_floatdp1\";\n\t\tcase ENC_UNALLOCATED_10_FLOATDP2: return \"UNALLOCATED_10_floatdp2\";\n\t\tcase ENC_UNALLOCATED_10_FLOATDP3: return \"UNALLOCATED_10_floatdp3\";\n\t\tcase ENC_UNALLOCATED_10_FLOATIMM: return \"UNALLOCATED_10_floatimm\";\n\t\tcase ENC_UNALLOCATED_10_FLOATSEL: return \"UNALLOCATED_10_floatsel\";\n\t\tcase ENC_UNALLOCATED_10_LOG_IMM: return \"UNALLOCATED_10_log_imm\";\n\t\tcase ENC_UNALLOCATED_10_LOG_SHIFT: return \"UNALLOCATED_10_log_shift\";\n\t\tcase ENC_UNALLOCATED_10_MOVEWIDE: return \"UNALLOCATED_10_movewide\";\n\t\tcase ENC_UNALLOCATED_10_PSTATE: return \"UNALLOCATED_10_pstate\";\n\t\tcase ENC_UNALLOCATED_10_RMIF: return \"UNALLOCATED_10_rmif\";\n\t\tcase ENC_UNALLOCATED_10_SETF: return \"UNALLOCATED_10_setf\";\n\t\tcase ENC_UNALLOCATED_10_SYSTEMRESULT: return \"UNALLOCATED_10_systemresult\";\n\t\tcase ENC_UNALLOCATED_11_ADDSUB_EXT: return \"UNALLOCATED_11_addsub_ext\";\n\t\tcase ENC_UNALLOCATED_11_ADDSUB_IMMTAGS: return \"UNALLOCATED_11_addsub_immtags\";\n\t\tcase ENC_UNALLOCATED_11_ADDSUB_SHIFT: return \"UNALLOCATED_11_addsub_shift\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDALL: return \"UNALLOCATED_11_asimdall\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDELEM: return \"UNALLOCATED_11_asimdelem\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDEXT: return \"UNALLOCATED_11_asimdext\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDINS: return \"UNALLOCATED_11_asimdins\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDMISCFP16: return \"UNALLOCATED_11_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDPERM: return \"UNALLOCATED_11_asimdperm\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDSAME2: return \"UNALLOCATED_11_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_11_ASIMDTBL: return \"UNALLOCATED_11_asimdtbl\";\n\t\tcase ENC_UNALLOCATED_11_ASISDDIFF: return \"UNALLOCATED_11_asisddiff\";\n\t\tcase ENC_UNALLOCATED_11_ASISDELEM: return \"UNALLOCATED_11_asisdelem\";\n\t\tcase ENC_UNALLOCATED_11_ASISDLSO: return \"UNALLOCATED_11_asisdlso\";\n\t\tcase ENC_UNALLOCATED_11_ASISDLSOP: return \"UNALLOCATED_11_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_11_ASISDMISC: return \"UNALLOCATED_11_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_11_ASISDMISCFP16: return \"UNALLOCATED_11_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_11_ASISDPAIR: return \"UNALLOCATED_11_asisdpair\";\n\t\tcase ENC_UNALLOCATED_11_ASISDSAME: return \"UNALLOCATED_11_asisdsame\";\n\t\tcase ENC_UNALLOCATED_11_ASISDSAME2: return \"UNALLOCATED_11_asisdsame2\";\n\t\tcase ENC_UNALLOCATED_11_ASISDSHF: return \"UNALLOCATED_11_asisdshf\";\n\t\tcase ENC_UNALLOCATED_11_BARRIERS: return \"UNALLOCATED_11_barriers\";\n\t\tcase ENC_UNALLOCATED_11_BITFIELD: return \"UNALLOCATED_11_bitfield\";\n\t\tcase ENC_UNALLOCATED_11_CONDBRANCH: return \"UNALLOCATED_11_condbranch\";\n\t\tcase ENC_UNALLOCATED_11_CONDCMP_IMM: return \"UNALLOCATED_11_condcmp_imm\";\n\t\tcase ENC_UNALLOCATED_11_CONDCMP_REG: return \"UNALLOCATED_11_condcmp_reg\";\n\t\tcase ENC_UNALLOCATED_11_CONDSEL: return \"UNALLOCATED_11_condsel\";\n\t\tcase ENC_UNALLOCATED_11_CRYPTOAES: return \"UNALLOCATED_11_cryptoaes\";\n\t\tcase ENC_UNALLOCATED_11_CRYPTOSHA2: return \"UNALLOCATED_11_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_11_CRYPTOSHA3: return \"UNALLOCATED_11_cryptosha3\";\n\t\tcase ENC_UNALLOCATED_11_CRYPTOSHA512_2: return \"UNALLOCATED_11_cryptosha512_2\";\n\t\tcase ENC_UNALLOCATED_11_DP_1SRC: return \"UNALLOCATED_11_dp_1src\";\n\t\tcase ENC_UNALLOCATED_11_DP_2SRC: return \"UNALLOCATED_11_dp_2src\";\n\t\tcase ENC_UNALLOCATED_11_EXTRACT: return \"UNALLOCATED_11_extract\";\n\t\tcase ENC_UNALLOCATED_11_FLOAT2FIX: return \"UNALLOCATED_11_float2fix\";\n\t\tcase ENC_UNALLOCATED_11_FLOAT2INT: return \"UNALLOCATED_11_float2int\";\n\t\tcase ENC_UNALLOCATED_11_FLOATCCMP: return \"UNALLOCATED_11_floatccmp\";\n\t\tcase ENC_UNALLOCATED_11_FLOATCMP: return \"UNALLOCATED_11_floatcmp\";\n\t\tcase ENC_UNALLOCATED_11_FLOATDP1: return \"UNALLOCATED_11_floatdp1\";\n\t\tcase ENC_UNALLOCATED_11_FLOATDP2: return \"UNALLOCATED_11_floatdp2\";\n\t\tcase ENC_UNALLOCATED_11_FLOATDP3: return \"UNALLOCATED_11_floatdp3\";\n\t\tcase ENC_UNALLOCATED_11_FLOATIMM: return \"UNALLOCATED_11_floatimm\";\n\t\tcase ENC_UNALLOCATED_11_FLOATSEL: return \"UNALLOCATED_11_floatsel\";\n\t\tcase ENC_UNALLOCATED_11_RMIF: return \"UNALLOCATED_11_rmif\";\n\t\tcase ENC_UNALLOCATED_11_SETF: return \"UNALLOCATED_11_setf\";\n\t\tcase ENC_UNALLOCATED_11_SYSTEMRESULT: return \"UNALLOCATED_11_systemresult\";\n\t\tcase ENC_UNALLOCATED_12_ADDSUB_EXT: return \"UNALLOCATED_12_addsub_ext\";\n\t\tcase ENC_UNALLOCATED_12_ASIMDALL: return \"UNALLOCATED_12_asimdall\";\n\t\tcase ENC_UNALLOCATED_12_ASIMDEXT: return \"UNALLOCATED_12_asimdext\";\n\t\tcase ENC_UNALLOCATED_12_ASIMDINS: return \"UNALLOCATED_12_asimdins\";\n\t\tcase ENC_UNALLOCATED_12_ASIMDMISCFP16: return \"UNALLOCATED_12_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_12_ASIMDTBL: return \"UNALLOCATED_12_asimdtbl\";\n\t\tcase ENC_UNALLOCATED_12_ASISDDIFF: return \"UNALLOCATED_12_asisddiff\";\n\t\tcase ENC_UNALLOCATED_12_ASISDLSE: return \"UNALLOCATED_12_asisdlse\";\n\t\tcase ENC_UNALLOCATED_12_ASISDMISC: return \"UNALLOCATED_12_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_12_ASISDMISCFP16: return \"UNALLOCATED_12_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_12_ASISDONE: return \"UNALLOCATED_12_asisdone\";\n\t\tcase ENC_UNALLOCATED_12_ASISDPAIR: return \"UNALLOCATED_12_asisdpair\";\n\t\tcase ENC_UNALLOCATED_12_BARRIERS: return \"UNALLOCATED_12_barriers\";\n\t\tcase ENC_UNALLOCATED_12_BITFIELD: return \"UNALLOCATED_12_bitfield\";\n\t\tcase ENC_UNALLOCATED_12_BRANCH_REG: return \"UNALLOCATED_12_branch_reg\";\n\t\tcase ENC_UNALLOCATED_12_CONDBRANCH: return \"UNALLOCATED_12_condbranch\";\n\t\tcase ENC_UNALLOCATED_12_CONDCMP_IMM: return \"UNALLOCATED_12_condcmp_imm\";\n\t\tcase ENC_UNALLOCATED_12_CONDCMP_REG: return \"UNALLOCATED_12_condcmp_reg\";\n\t\tcase ENC_UNALLOCATED_12_CRYPTOAES: return \"UNALLOCATED_12_cryptoaes\";\n\t\tcase ENC_UNALLOCATED_12_CRYPTOSHA2: return \"UNALLOCATED_12_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_12_CRYPTOSHA3: return \"UNALLOCATED_12_cryptosha3\";\n\t\tcase ENC_UNALLOCATED_12_DP_1SRC: return \"UNALLOCATED_12_dp_1src\";\n\t\tcase ENC_UNALLOCATED_12_EXTRACT: return \"UNALLOCATED_12_extract\";\n\t\tcase ENC_UNALLOCATED_12_FLOAT2FIX: return \"UNALLOCATED_12_float2fix\";\n\t\tcase ENC_UNALLOCATED_12_FLOAT2INT: return \"UNALLOCATED_12_float2int\";\n\t\tcase ENC_UNALLOCATED_12_FLOATCCMP: return \"UNALLOCATED_12_floatccmp\";\n\t\tcase ENC_UNALLOCATED_12_FLOATCMP: return \"UNALLOCATED_12_floatcmp\";\n\t\tcase ENC_UNALLOCATED_12_FLOATDP1: return \"UNALLOCATED_12_floatdp1\";\n\t\tcase ENC_UNALLOCATED_12_FLOATDP2: return \"UNALLOCATED_12_floatdp2\";\n\t\tcase ENC_UNALLOCATED_12_FLOATDP3: return \"UNALLOCATED_12_floatdp3\";\n\t\tcase ENC_UNALLOCATED_12_FLOATIMM: return \"UNALLOCATED_12_floatimm\";\n\t\tcase ENC_UNALLOCATED_12_FLOATSEL: return \"UNALLOCATED_12_floatsel\";\n\t\tcase ENC_UNALLOCATED_12_LDSTNAPAIR_OFFS: return \"UNALLOCATED_12_ldstnapair_offs\";\n\t\tcase ENC_UNALLOCATED_12_SYSTEMINSTRSWITHREG: return \"UNALLOCATED_12_systeminstrswithreg\";\n\t\tcase ENC_UNALLOCATED_12_SYSTEMRESULT: return \"UNALLOCATED_12_systemresult\";\n\t\tcase ENC_UNALLOCATED_139: return \"UNALLOCATED_139\";\n\t\tcase ENC_UNALLOCATED_13_ADDSUB_EXT: return \"UNALLOCATED_13_addsub_ext\";\n\t\tcase ENC_UNALLOCATED_13_ASIMDELEM: return \"UNALLOCATED_13_asimdelem\";\n\t\tcase ENC_UNALLOCATED_13_ASIMDMISCFP16: return \"UNALLOCATED_13_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_13_ASIMDSAME2: return \"UNALLOCATED_13_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_13_ASIMDSHF: return \"UNALLOCATED_13_asimdshf\";\n\t\tcase ENC_UNALLOCATED_13_ASISDDIFF: return \"UNALLOCATED_13_asisddiff\";\n\t\tcase ENC_UNALLOCATED_13_ASISDELEM: return \"UNALLOCATED_13_asisdelem\";\n\t\tcase ENC_UNALLOCATED_13_ASISDLSEP: return \"UNALLOCATED_13_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_13_ASISDMISCFP16: return \"UNALLOCATED_13_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_13_ASISDONE: return \"UNALLOCATED_13_asisdone\";\n\t\tcase ENC_UNALLOCATED_13_ASISDSAME2: return \"UNALLOCATED_13_asisdsame2\";\n\t\tcase ENC_UNALLOCATED_13_ASISDSAMEFP16: return \"UNALLOCATED_13_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_13_BRANCH_REG: return \"UNALLOCATED_13_branch_reg\";\n\t\tcase ENC_UNALLOCATED_13_CRYPTOAES: return \"UNALLOCATED_13_cryptoaes\";\n\t\tcase ENC_UNALLOCATED_13_DP_1SRC: return \"UNALLOCATED_13_dp_1src\";\n\t\tcase ENC_UNALLOCATED_13_EXTRACT: return \"UNALLOCATED_13_extract\";\n\t\tcase ENC_UNALLOCATED_13_FLOAT2FIX: return \"UNALLOCATED_13_float2fix\";\n\t\tcase ENC_UNALLOCATED_13_FLOAT2INT: return \"UNALLOCATED_13_float2int\";\n\t\tcase ENC_UNALLOCATED_13_FLOATCMP: return \"UNALLOCATED_13_floatcmp\";\n\t\tcase ENC_UNALLOCATED_13_FLOATDP2: return \"UNALLOCATED_13_floatdp2\";\n\t\tcase ENC_UNALLOCATED_13_FLOATIMM: return \"UNALLOCATED_13_floatimm\";\n\t\tcase ENC_UNALLOCATED_13_LDSTTAGS: return \"UNALLOCATED_13_ldsttags\";\n\t\tcase ENC_UNALLOCATED_13_MOVEWIDE: return \"UNALLOCATED_13_movewide\";\n\t\tcase ENC_UNALLOCATED_13_RMIF: return \"UNALLOCATED_13_rmif\";\n\t\tcase ENC_UNALLOCATED_13_SYSTEMINSTRSWITHREG: return \"UNALLOCATED_13_systeminstrswithreg\";\n\t\tcase ENC_UNALLOCATED_13_SYSTEMRESULT: return \"UNALLOCATED_13_systemresult\";\n\t\tcase ENC_UNALLOCATED_140: return \"UNALLOCATED_140\";\n\t\tcase ENC_UNALLOCATED_141: return \"UNALLOCATED_141\";\n\t\tcase ENC_UNALLOCATED_142: return \"UNALLOCATED_142\";\n\t\tcase ENC_UNALLOCATED_143: return \"UNALLOCATED_143\";\n\t\tcase ENC_UNALLOCATED_144: return \"UNALLOCATED_144\";\n\t\tcase ENC_UNALLOCATED_145: return \"UNALLOCATED_145\";\n\t\tcase ENC_UNALLOCATED_146: return \"UNALLOCATED_146\";\n\t\tcase ENC_UNALLOCATED_147: return \"UNALLOCATED_147\";\n\t\tcase ENC_UNALLOCATED_148: return \"UNALLOCATED_148\";\n\t\tcase ENC_UNALLOCATED_149: return \"UNALLOCATED_149\";\n\t\tcase ENC_UNALLOCATED_14_ADDSUB_IMMTAGS: return \"UNALLOCATED_14_addsub_immtags\";\n\t\tcase ENC_UNALLOCATED_14_ASIMDMISC: return \"UNALLOCATED_14_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_14_ASISDELEM: return \"UNALLOCATED_14_asisdelem\";\n\t\tcase ENC_UNALLOCATED_14_ASISDLSE: return \"UNALLOCATED_14_asisdlse\";\n\t\tcase ENC_UNALLOCATED_14_ASISDLSO: return \"UNALLOCATED_14_asisdlso\";\n\t\tcase ENC_UNALLOCATED_14_ASISDLSOP: return \"UNALLOCATED_14_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_14_ASISDONE: return \"UNALLOCATED_14_asisdone\";\n\t\tcase ENC_UNALLOCATED_14_ASISDSAME: return \"UNALLOCATED_14_asisdsame\";\n\t\tcase ENC_UNALLOCATED_14_ASISDSAMEFP16: return \"UNALLOCATED_14_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_14_ASISDSHF: return \"UNALLOCATED_14_asisdshf\";\n\t\tcase ENC_UNALLOCATED_14_BARRIERS: return \"UNALLOCATED_14_barriers\";\n\t\tcase ENC_UNALLOCATED_14_CRYPTO4: return \"UNALLOCATED_14_crypto4\";\n\t\tcase ENC_UNALLOCATED_14_DP_1SRC: return \"UNALLOCATED_14_dp_1src\";\n\t\tcase ENC_UNALLOCATED_14_DP_2SRC: return \"UNALLOCATED_14_dp_2src\";\n\t\tcase ENC_UNALLOCATED_14_DP_3SRC: return \"UNALLOCATED_14_dp_3src\";\n\t\tcase ENC_UNALLOCATED_14_FLOAT2FIX: return \"UNALLOCATED_14_float2fix\";\n\t\tcase ENC_UNALLOCATED_14_FLOAT2INT: return \"UNALLOCATED_14_float2int\";\n\t\tcase ENC_UNALLOCATED_14_FLOATCMP: return \"UNALLOCATED_14_floatcmp\";\n\t\tcase ENC_UNALLOCATED_14_FLOATDP2: return \"UNALLOCATED_14_floatdp2\";\n\t\tcase ENC_UNALLOCATED_14_FLOATIMM: return \"UNALLOCATED_14_floatimm\";\n\t\tcase ENC_UNALLOCATED_14_LDST_PAC: return \"UNALLOCATED_14_ldst_pac\";\n\t\tcase ENC_UNALLOCATED_14_RMIF: return \"UNALLOCATED_14_rmif\";\n\t\tcase ENC_UNALLOCATED_14_SETF: return \"UNALLOCATED_14_setf\";\n\t\tcase ENC_UNALLOCATED_14_SYSTEMINSTRSWITHREG: return \"UNALLOCATED_14_systeminstrswithreg\";\n\t\tcase ENC_UNALLOCATED_150: return \"UNALLOCATED_150\";\n\t\tcase ENC_UNALLOCATED_151: return \"UNALLOCATED_151\";\n\t\tcase ENC_UNALLOCATED_152: return \"UNALLOCATED_152\";\n\t\tcase ENC_UNALLOCATED_153: return \"UNALLOCATED_153\";\n\t\tcase ENC_UNALLOCATED_154: return \"UNALLOCATED_154\";\n\t\tcase ENC_UNALLOCATED_154_MEMOP: return \"UNALLOCATED_154_memop\";\n\t\tcase ENC_UNALLOCATED_155: return \"UNALLOCATED_155\";\n\t\tcase ENC_UNALLOCATED_155_MEMOP: return \"UNALLOCATED_155_memop\";\n\t\tcase ENC_UNALLOCATED_156: return \"UNALLOCATED_156\";\n\t\tcase ENC_UNALLOCATED_156_MEMOP: return \"UNALLOCATED_156_memop\";\n\t\tcase ENC_UNALLOCATED_157: return \"UNALLOCATED_157\";\n\t\tcase ENC_UNALLOCATED_158: return \"UNALLOCATED_158\";\n\t\tcase ENC_UNALLOCATED_158_MEMOP: return \"UNALLOCATED_158_memop\";\n\t\tcase ENC_UNALLOCATED_159: return \"UNALLOCATED_159\";\n\t\tcase ENC_UNALLOCATED_159_MEMOP: return \"UNALLOCATED_159_memop\";\n\t\tcase ENC_UNALLOCATED_15_ASIMDALL: return \"UNALLOCATED_15_asimdall\";\n\t\tcase ENC_UNALLOCATED_15_ASIMDINS: return \"UNALLOCATED_15_asimdins\";\n\t\tcase ENC_UNALLOCATED_15_ASIMDPERM: return \"UNALLOCATED_15_asimdperm\";\n\t\tcase ENC_UNALLOCATED_15_ASISDDIFF: return \"UNALLOCATED_15_asisddiff\";\n\t\tcase ENC_UNALLOCATED_15_ASISDMISC: return \"UNALLOCATED_15_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_15_ASISDONE: return \"UNALLOCATED_15_asisdone\";\n\t\tcase ENC_UNALLOCATED_15_ASISDSAME: return \"UNALLOCATED_15_asisdsame\";\n\t\tcase ENC_UNALLOCATED_15_ASISDSAME2: return \"UNALLOCATED_15_asisdsame2\";\n\t\tcase ENC_UNALLOCATED_15_BRANCH_REG: return \"UNALLOCATED_15_branch_reg\";\n\t\tcase ENC_UNALLOCATED_15_DP_1SRC: return \"UNALLOCATED_15_dp_1src\";\n\t\tcase ENC_UNALLOCATED_15_DP_2SRC: return \"UNALLOCATED_15_dp_2src\";\n\t\tcase ENC_UNALLOCATED_15_EXCEPTION: return \"UNALLOCATED_15_exception\";\n\t\tcase ENC_UNALLOCATED_15_FLOAT2FIX: return \"UNALLOCATED_15_float2fix\";\n\t\tcase ENC_UNALLOCATED_15_FLOATCMP: return \"UNALLOCATED_15_floatcmp\";\n\t\tcase ENC_UNALLOCATED_15_FLOATDP2: return \"UNALLOCATED_15_floatdp2\";\n\t\tcase ENC_UNALLOCATED_15_FLOATIMM: return \"UNALLOCATED_15_floatimm\";\n\t\tcase ENC_UNALLOCATED_15_LDST_PAC: return \"UNALLOCATED_15_ldst_pac\";\n\t\tcase ENC_UNALLOCATED_15_LDSTTAGS: return \"UNALLOCATED_15_ldsttags\";\n\t\tcase ENC_UNALLOCATED_15_SETF: return \"UNALLOCATED_15_setf\";\n\t\tcase ENC_UNALLOCATED_160: return \"UNALLOCATED_160\";\n\t\tcase ENC_UNALLOCATED_160_MEMOP: return \"UNALLOCATED_160_memop\";\n\t\tcase ENC_UNALLOCATED_161: return \"UNALLOCATED_161\";\n\t\tcase ENC_UNALLOCATED_161_MEMOP: return \"UNALLOCATED_161_memop\";\n\t\tcase ENC_UNALLOCATED_162: return \"UNALLOCATED_162\";\n\t\tcase ENC_UNALLOCATED_162_MEMOP: return \"UNALLOCATED_162_memop\";\n\t\tcase ENC_UNALLOCATED_163: return \"UNALLOCATED_163\";\n\t\tcase ENC_UNALLOCATED_163_MEMOP: return \"UNALLOCATED_163_memop\";\n\t\tcase ENC_UNALLOCATED_164: return \"UNALLOCATED_164\";\n\t\tcase ENC_UNALLOCATED_165: return \"UNALLOCATED_165\";\n\t\tcase ENC_UNALLOCATED_165_MEMOP: return \"UNALLOCATED_165_memop\";\n\t\tcase ENC_UNALLOCATED_166: return \"UNALLOCATED_166\";\n\t\tcase ENC_UNALLOCATED_166_MEMOP: return \"UNALLOCATED_166_memop\";\n\t\tcase ENC_UNALLOCATED_167: return \"UNALLOCATED_167\";\n\t\tcase ENC_UNALLOCATED_167_MEMOP: return \"UNALLOCATED_167_memop\";\n\t\tcase ENC_UNALLOCATED_168: return \"UNALLOCATED_168\";\n\t\tcase ENC_UNALLOCATED_168_MEMOP: return \"UNALLOCATED_168_memop\";\n\t\tcase ENC_UNALLOCATED_169: return \"UNALLOCATED_169\";\n\t\tcase ENC_UNALLOCATED_169_MEMOP: return \"UNALLOCATED_169_memop\";\n\t\tcase ENC_UNALLOCATED_16_ASIMDALL: return \"UNALLOCATED_16_asimdall\";\n\t\tcase ENC_UNALLOCATED_16_ASIMDELEM: return \"UNALLOCATED_16_asimdelem\";\n\t\tcase ENC_UNALLOCATED_16_ASIMDSAMEFP16: return \"UNALLOCATED_16_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_16_ASIMDSHF: return \"UNALLOCATED_16_asimdshf\";\n\t\tcase ENC_UNALLOCATED_16_ASISDDIFF: return \"UNALLOCATED_16_asisddiff\";\n\t\tcase ENC_UNALLOCATED_16_ASISDELEM: return \"UNALLOCATED_16_asisdelem\";\n\t\tcase ENC_UNALLOCATED_16_ASISDLSE: return \"UNALLOCATED_16_asisdlse\";\n\t\tcase ENC_UNALLOCATED_16_ASISDLSEP: return \"UNALLOCATED_16_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_16_ASISDLSO: return \"UNALLOCATED_16_asisdlso\";\n\t\tcase ENC_UNALLOCATED_16_ASISDLSOP: return \"UNALLOCATED_16_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_16_ASISDMISC: return \"UNALLOCATED_16_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_16_ASISDSAME2: return \"UNALLOCATED_16_asisdsame2\";\n\t\tcase ENC_UNALLOCATED_16_CRYPTOSHA2: return \"UNALLOCATED_16_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_16_DP_1SRC: return \"UNALLOCATED_16_dp_1src\";\n\t\tcase ENC_UNALLOCATED_16_DP_3SRC: return \"UNALLOCATED_16_dp_3src\";\n\t\tcase ENC_UNALLOCATED_16_EXCEPTION: return \"UNALLOCATED_16_exception\";\n\t\tcase ENC_UNALLOCATED_16_EXTRACT: return \"UNALLOCATED_16_extract\";\n\t\tcase ENC_UNALLOCATED_16_FLOAT2FIX: return \"UNALLOCATED_16_float2fix\";\n\t\tcase ENC_UNALLOCATED_16_FLOATCMP: return \"UNALLOCATED_16_floatcmp\";\n\t\tcase ENC_UNALLOCATED_16_FLOATIMM: return \"UNALLOCATED_16_floatimm\";\n\t\tcase ENC_UNALLOCATED_16_SETF: return \"UNALLOCATED_16_setf\";\n\t\tcase ENC_UNALLOCATED_170: return \"UNALLOCATED_170\";\n\t\tcase ENC_UNALLOCATED_170_MEMOP: return \"UNALLOCATED_170_memop\";\n\t\tcase ENC_UNALLOCATED_171: return \"UNALLOCATED_171\";\n\t\tcase ENC_UNALLOCATED_172: return \"UNALLOCATED_172\";\n\t\tcase ENC_UNALLOCATED_172_MEMOP: return \"UNALLOCATED_172_memop\";\n\t\tcase ENC_UNALLOCATED_173: return \"UNALLOCATED_173\";\n\t\tcase ENC_UNALLOCATED_173_MEMOP: return \"UNALLOCATED_173_memop\";\n\t\tcase ENC_UNALLOCATED_174: return \"UNALLOCATED_174\";\n\t\tcase ENC_UNALLOCATED_174_MEMOP: return \"UNALLOCATED_174_memop\";\n\t\tcase ENC_UNALLOCATED_175: return \"UNALLOCATED_175\";\n\t\tcase ENC_UNALLOCATED_175_MEMOP: return \"UNALLOCATED_175_memop\";\n\t\tcase ENC_UNALLOCATED_176: return \"UNALLOCATED_176\";\n\t\tcase ENC_UNALLOCATED_177: return \"UNALLOCATED_177\";\n\t\tcase ENC_UNALLOCATED_178: return \"UNALLOCATED_178\";\n\t\tcase ENC_UNALLOCATED_179: return \"UNALLOCATED_179\";\n\t\tcase ENC_UNALLOCATED_17_ASIMDELEM: return \"UNALLOCATED_17_asimdelem\";\n\t\tcase ENC_UNALLOCATED_17_ASIMDINS: return \"UNALLOCATED_17_asimdins\";\n\t\tcase ENC_UNALLOCATED_17_ASIMDSAME2: return \"UNALLOCATED_17_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_17_ASISDELEM: return \"UNALLOCATED_17_asisdelem\";\n\t\tcase ENC_UNALLOCATED_17_ASISDONE: return \"UNALLOCATED_17_asisdone\";\n\t\tcase ENC_UNALLOCATED_17_ASISDSAME2: return \"UNALLOCATED_17_asisdsame2\";\n\t\tcase ENC_UNALLOCATED_17_ASISDSAMEFP16: return \"UNALLOCATED_17_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_17_ASISDSHF: return \"UNALLOCATED_17_asisdshf\";\n\t\tcase ENC_UNALLOCATED_17_BARRIERS: return \"UNALLOCATED_17_barriers\";\n\t\tcase ENC_UNALLOCATED_17_BRANCH_REG: return \"UNALLOCATED_17_branch_reg\";\n\t\tcase ENC_UNALLOCATED_17_CRYPTOSHA2: return \"UNALLOCATED_17_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_17_DP_1SRC: return \"UNALLOCATED_17_dp_1src\";\n\t\tcase ENC_UNALLOCATED_17_EXTRACT: return \"UNALLOCATED_17_extract\";\n\t\tcase ENC_UNALLOCATED_17_FLOAT2FIX: return \"UNALLOCATED_17_float2fix\";\n\t\tcase ENC_UNALLOCATED_17_FLOATCMP: return \"UNALLOCATED_17_floatcmp\";\n\t\tcase ENC_UNALLOCATED_17_FLOATDP1: return \"UNALLOCATED_17_floatdp1\";\n\t\tcase ENC_UNALLOCATED_17_FLOATIMM: return \"UNALLOCATED_17_floatimm\";\n\t\tcase ENC_UNALLOCATED_17_LOADLIT: return \"UNALLOCATED_17_loadlit\";\n\t\tcase ENC_UNALLOCATED_17_SETF: return \"UNALLOCATED_17_setf\";\n\t\tcase ENC_UNALLOCATED_180: return \"UNALLOCATED_180\";\n\t\tcase ENC_UNALLOCATED_180_MEMOP: return \"UNALLOCATED_180_memop\";\n\t\tcase ENC_UNALLOCATED_181: return \"UNALLOCATED_181\";\n\t\tcase ENC_UNALLOCATED_181_MEMOP: return \"UNALLOCATED_181_memop\";\n\t\tcase ENC_UNALLOCATED_182: return \"UNALLOCATED_182\";\n\t\tcase ENC_UNALLOCATED_182_MEMOP: return \"UNALLOCATED_182_memop\";\n\t\tcase ENC_UNALLOCATED_183: return \"UNALLOCATED_183\";\n\t\tcase ENC_UNALLOCATED_183_MEMOP: return \"UNALLOCATED_183_memop\";\n\t\tcase ENC_UNALLOCATED_184: return \"UNALLOCATED_184\";\n\t\tcase ENC_UNALLOCATED_185: return \"UNALLOCATED_185\";\n\t\tcase ENC_UNALLOCATED_185_MEMOP: return \"UNALLOCATED_185_memop\";\n\t\tcase ENC_UNALLOCATED_186: return \"UNALLOCATED_186\";\n\t\tcase ENC_UNALLOCATED_186_MEMOP: return \"UNALLOCATED_186_memop\";\n\t\tcase ENC_UNALLOCATED_187: return \"UNALLOCATED_187\";\n\t\tcase ENC_UNALLOCATED_187_MEMOP: return \"UNALLOCATED_187_memop\";\n\t\tcase ENC_UNALLOCATED_188: return \"UNALLOCATED_188\";\n\t\tcase ENC_UNALLOCATED_188_MEMOP: return \"UNALLOCATED_188_memop\";\n\t\tcase ENC_UNALLOCATED_189: return \"UNALLOCATED_189\";\n\t\tcase ENC_UNALLOCATED_189_MEMOP: return \"UNALLOCATED_189_memop\";\n\t\tcase ENC_UNALLOCATED_18_ASIMDINS: return \"UNALLOCATED_18_asimdins\";\n\t\tcase ENC_UNALLOCATED_18_ASIMDSAMEFP16: return \"UNALLOCATED_18_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_18_ASISDDIFF: return \"UNALLOCATED_18_asisddiff\";\n\t\tcase ENC_UNALLOCATED_18_ASISDLSO: return \"UNALLOCATED_18_asisdlso\";\n\t\tcase ENC_UNALLOCATED_18_ASISDLSOP: return \"UNALLOCATED_18_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_18_BARRIERS: return \"UNALLOCATED_18_barriers\";\n\t\tcase ENC_UNALLOCATED_18_BRANCH_REG: return \"UNALLOCATED_18_branch_reg\";\n\t\tcase ENC_UNALLOCATED_18_CRYPTOAES: return \"UNALLOCATED_18_cryptoaes\";\n\t\tcase ENC_UNALLOCATED_18_CRYPTOSHA2: return \"UNALLOCATED_18_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_18_CRYPTOSHA512_3: return \"UNALLOCATED_18_cryptosha512_3\";\n\t\tcase ENC_UNALLOCATED_18_DP_1SRC: return \"UNALLOCATED_18_dp_1src\";\n\t\tcase ENC_UNALLOCATED_18_DP_3SRC: return \"UNALLOCATED_18_dp_3src\";\n\t\tcase ENC_UNALLOCATED_18_EXCEPTION: return \"UNALLOCATED_18_exception\";\n\t\tcase ENC_UNALLOCATED_18_EXTRACT: return \"UNALLOCATED_18_extract\";\n\t\tcase ENC_UNALLOCATED_190: return \"UNALLOCATED_190\";\n\t\tcase ENC_UNALLOCATED_191: return \"UNALLOCATED_191\";\n\t\tcase ENC_UNALLOCATED_192: return \"UNALLOCATED_192\";\n\t\tcase ENC_UNALLOCATED_193: return \"UNALLOCATED_193\";\n\t\tcase ENC_UNALLOCATED_194: return \"UNALLOCATED_194\";\n\t\tcase ENC_UNALLOCATED_195: return \"UNALLOCATED_195\";\n\t\tcase ENC_UNALLOCATED_196: return \"UNALLOCATED_196\";\n\t\tcase ENC_UNALLOCATED_197: return \"UNALLOCATED_197\";\n\t\tcase ENC_UNALLOCATED_198: return \"UNALLOCATED_198\";\n\t\tcase ENC_UNALLOCATED_199: return \"UNALLOCATED_199\";\n\t\tcase ENC_UNALLOCATED_19_ASIMDALL: return \"UNALLOCATED_19_asimdall\";\n\t\tcase ENC_UNALLOCATED_19_ASIMDMISCFP16: return \"UNALLOCATED_19_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_19_ASIMDSAME2: return \"UNALLOCATED_19_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_19_ASIMDSHF: return \"UNALLOCATED_19_asimdshf\";\n\t\tcase ENC_UNALLOCATED_19_ASISDDIFF: return \"UNALLOCATED_19_asisddiff\";\n\t\tcase ENC_UNALLOCATED_19_ASISDELEM: return \"UNALLOCATED_19_asisdelem\";\n\t\tcase ENC_UNALLOCATED_19_ASISDLSEP: return \"UNALLOCATED_19_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_19_ASISDMISCFP16: return \"UNALLOCATED_19_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_19_ASISDPAIR: return \"UNALLOCATED_19_asisdpair\";\n\t\tcase ENC_UNALLOCATED_19_ASISDSAMEFP16: return \"UNALLOCATED_19_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_19_BARRIERS: return \"UNALLOCATED_19_barriers\";\n\t\tcase ENC_UNALLOCATED_19_BITFIELD: return \"UNALLOCATED_19_bitfield\";\n\t\tcase ENC_UNALLOCATED_19_BRANCH_REG: return \"UNALLOCATED_19_branch_reg\";\n\t\tcase ENC_UNALLOCATED_19_CRYPTOAES: return \"UNALLOCATED_19_cryptoaes\";\n\t\tcase ENC_UNALLOCATED_19_CRYPTOSHA2: return \"UNALLOCATED_19_cryptosha2\";\n\t\tcase ENC_UNALLOCATED_19_DP_1SRC: return \"UNALLOCATED_19_dp_1src\";\n\t\tcase ENC_UNALLOCATED_19_EXCEPTION: return \"UNALLOCATED_19_exception\";\n\t\tcase ENC_UNALLOCATED_19_FLOATDP1: return \"UNALLOCATED_19_floatdp1\";\n\t\tcase ENC_UNALLOCATED_200: return \"UNALLOCATED_200\";\n\t\tcase ENC_UNALLOCATED_201: return \"UNALLOCATED_201\";\n\t\tcase ENC_UNALLOCATED_202: return \"UNALLOCATED_202\";\n\t\tcase ENC_UNALLOCATED_203: return \"UNALLOCATED_203\";\n\t\tcase ENC_UNALLOCATED_204: return \"UNALLOCATED_204\";\n\t\tcase ENC_UNALLOCATED_205: return \"UNALLOCATED_205\";\n\t\tcase ENC_UNALLOCATED_206: return \"UNALLOCATED_206\";\n\t\tcase ENC_UNALLOCATED_207: return \"UNALLOCATED_207\";\n\t\tcase ENC_UNALLOCATED_208: return \"UNALLOCATED_208\";\n\t\tcase ENC_UNALLOCATED_209: return \"UNALLOCATED_209\";\n\t\tcase ENC_UNALLOCATED_20_ASIMDSAME2: return \"UNALLOCATED_20_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_20_ASISDELEM: return \"UNALLOCATED_20_asisdelem\";\n\t\tcase ENC_UNALLOCATED_20_ASISDLSE: return \"UNALLOCATED_20_asisdlse\";\n\t\tcase ENC_UNALLOCATED_20_ASISDMISCFP16: return \"UNALLOCATED_20_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_20_ASISDPAIR: return \"UNALLOCATED_20_asisdpair\";\n\t\tcase ENC_UNALLOCATED_20_ASISDSHF: return \"UNALLOCATED_20_asisdshf\";\n\t\tcase ENC_UNALLOCATED_20_BARRIERS: return \"UNALLOCATED_20_barriers\";\n\t\tcase ENC_UNALLOCATED_20_BRANCH_REG: return \"UNALLOCATED_20_branch_reg\";\n\t\tcase ENC_UNALLOCATED_20_CRYPTOSHA3: return \"UNALLOCATED_20_cryptosha3\";\n\t\tcase ENC_UNALLOCATED_20_DP_1SRC: return \"UNALLOCATED_20_dp_1src\";\n\t\tcase ENC_UNALLOCATED_20_DP_2SRC: return \"UNALLOCATED_20_dp_2src\";\n\t\tcase ENC_UNALLOCATED_20_DP_3SRC: return \"UNALLOCATED_20_dp_3src\";\n\t\tcase ENC_UNALLOCATED_210: return \"UNALLOCATED_210\";\n\t\tcase ENC_UNALLOCATED_211: return \"UNALLOCATED_211\";\n\t\tcase ENC_UNALLOCATED_212: return \"UNALLOCATED_212\";\n\t\tcase ENC_UNALLOCATED_213: return \"UNALLOCATED_213\";\n\t\tcase ENC_UNALLOCATED_214: return \"UNALLOCATED_214\";\n\t\tcase ENC_UNALLOCATED_215: return \"UNALLOCATED_215\";\n\t\tcase ENC_UNALLOCATED_216: return \"UNALLOCATED_216\";\n\t\tcase ENC_UNALLOCATED_217: return \"UNALLOCATED_217\";\n\t\tcase ENC_UNALLOCATED_218: return \"UNALLOCATED_218\";\n\t\tcase ENC_UNALLOCATED_219: return \"UNALLOCATED_219\";\n\t\tcase ENC_UNALLOCATED_21_ASIMDALL: return \"UNALLOCATED_21_asimdall\";\n\t\tcase ENC_UNALLOCATED_21_ASIMDINS: return \"UNALLOCATED_21_asimdins\";\n\t\tcase ENC_UNALLOCATED_21_ASIMDSAME2: return \"UNALLOCATED_21_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_21_ASISDDIFF: return \"UNALLOCATED_21_asisddiff\";\n\t\tcase ENC_UNALLOCATED_21_ASISDLSO: return \"UNALLOCATED_21_asisdlso\";\n\t\tcase ENC_UNALLOCATED_21_ASISDLSOP: return \"UNALLOCATED_21_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_21_ASISDMISCFP16: return \"UNALLOCATED_21_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_21_ASISDSAMEFP16: return \"UNALLOCATED_21_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_21_BRANCH_REG: return \"UNALLOCATED_21_branch_reg\";\n\t\tcase ENC_UNALLOCATED_21_DP_1SRC: return \"UNALLOCATED_21_dp_1src\";\n\t\tcase ENC_UNALLOCATED_21_DP_2SRC: return \"UNALLOCATED_21_dp_2src\";\n\t\tcase ENC_UNALLOCATED_21_DP_3SRC: return \"UNALLOCATED_21_dp_3src\";\n\t\tcase ENC_UNALLOCATED_21_EXCEPTION: return \"UNALLOCATED_21_exception\";\n\t\tcase ENC_UNALLOCATED_21_LDAPSTL_UNSCALED: return \"UNALLOCATED_21_ldapstl_unscaled\";\n\t\tcase ENC_UNALLOCATED_21_LDST_IMMPOST: return \"UNALLOCATED_21_ldst_immpost\";\n\t\tcase ENC_UNALLOCATED_21_LDST_IMMPRE: return \"UNALLOCATED_21_ldst_immpre\";\n\t\tcase ENC_UNALLOCATED_21_LDST_UNPRIV: return \"UNALLOCATED_21_ldst_unpriv\";\n\t\tcase ENC_UNALLOCATED_21_LDSTNAPAIR_OFFS: return \"UNALLOCATED_21_ldstnapair_offs\";\n\t\tcase ENC_UNALLOCATED_220: return \"UNALLOCATED_220\";\n\t\tcase ENC_UNALLOCATED_221: return \"UNALLOCATED_221\";\n\t\tcase ENC_UNALLOCATED_222: return \"UNALLOCATED_222\";\n\t\tcase ENC_UNALLOCATED_223: return \"UNALLOCATED_223\";\n\t\tcase ENC_UNALLOCATED_224: return \"UNALLOCATED_224\";\n\t\tcase ENC_UNALLOCATED_225: return \"UNALLOCATED_225\";\n\t\tcase ENC_UNALLOCATED_226: return \"UNALLOCATED_226\";\n\t\tcase ENC_UNALLOCATED_227: return \"UNALLOCATED_227\";\n\t\tcase ENC_UNALLOCATED_228: return \"UNALLOCATED_228\";\n\t\tcase ENC_UNALLOCATED_229: return \"UNALLOCATED_229\";\n\t\tcase ENC_UNALLOCATED_22_ASIMDMISCFP16: return \"UNALLOCATED_22_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_22_ASIMDSAME2: return \"UNALLOCATED_22_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_22_ASIMDSHF: return \"UNALLOCATED_22_asimdshf\";\n\t\tcase ENC_UNALLOCATED_22_ASISDDIFF: return \"UNALLOCATED_22_asisddiff\";\n\t\tcase ENC_UNALLOCATED_22_ASISDELEM: return \"UNALLOCATED_22_asisdelem\";\n\t\tcase ENC_UNALLOCATED_22_ASISDLSE: return \"UNALLOCATED_22_asisdlse\";\n\t\tcase ENC_UNALLOCATED_22_ASISDMISCFP16: return \"UNALLOCATED_22_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_22_DP_3SRC: return \"UNALLOCATED_22_dp_3src\";\n\t\tcase ENC_UNALLOCATED_22_EXCEPTION: return \"UNALLOCATED_22_exception\";\n\t\tcase ENC_UNALLOCATED_22_LDSTPAIR_OFF: return \"UNALLOCATED_22_ldstpair_off\";\n\t\tcase ENC_UNALLOCATED_22_LDSTPAIR_POST: return \"UNALLOCATED_22_ldstpair_post\";\n\t\tcase ENC_UNALLOCATED_22_LDSTPAIR_PRE: return \"UNALLOCATED_22_ldstpair_pre\";\n\t\tcase ENC_UNALLOCATED_230: return \"UNALLOCATED_230\";\n\t\tcase ENC_UNALLOCATED_231: return \"UNALLOCATED_231\";\n\t\tcase ENC_UNALLOCATED_232: return \"UNALLOCATED_232\";\n\t\tcase ENC_UNALLOCATED_233: return \"UNALLOCATED_233\";\n\t\tcase ENC_UNALLOCATED_234: return \"UNALLOCATED_234\";\n\t\tcase ENC_UNALLOCATED_235: return \"UNALLOCATED_235\";\n\t\tcase ENC_UNALLOCATED_236: return \"UNALLOCATED_236\";\n\t\tcase ENC_UNALLOCATED_237: return \"UNALLOCATED_237\";\n\t\tcase ENC_UNALLOCATED_238: return \"UNALLOCATED_238\";\n\t\tcase ENC_UNALLOCATED_239: return \"UNALLOCATED_239\";\n\t\tcase ENC_UNALLOCATED_23_ASIMDSHF: return \"UNALLOCATED_23_asimdshf\";\n\t\tcase ENC_UNALLOCATED_23_ASISDELEM: return \"UNALLOCATED_23_asisdelem\";\n\t\tcase ENC_UNALLOCATED_23_ASISDLSE: return \"UNALLOCATED_23_asisdlse\";\n\t\tcase ENC_UNALLOCATED_23_ASISDLSO: return \"UNALLOCATED_23_asisdlso\";\n\t\tcase ENC_UNALLOCATED_23_ASISDLSOP: return \"UNALLOCATED_23_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_23_ASISDSAMEFP16: return \"UNALLOCATED_23_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_23_ASISDSHF: return \"UNALLOCATED_23_asisdshf\";\n\t\tcase ENC_UNALLOCATED_23_BRANCH_REG: return \"UNALLOCATED_23_branch_reg\";\n\t\tcase ENC_UNALLOCATED_23_DP_3SRC: return \"UNALLOCATED_23_dp_3src\";\n\t\tcase ENC_UNALLOCATED_23_EXCEPTION: return \"UNALLOCATED_23_exception\";\n\t\tcase ENC_UNALLOCATED_240: return \"UNALLOCATED_240\";\n\t\tcase ENC_UNALLOCATED_241: return \"UNALLOCATED_241\";\n\t\tcase ENC_UNALLOCATED_242: return \"UNALLOCATED_242\";\n\t\tcase ENC_UNALLOCATED_243: return \"UNALLOCATED_243\";\n\t\tcase ENC_UNALLOCATED_244: return \"UNALLOCATED_244\";\n\t\tcase ENC_UNALLOCATED_245: return \"UNALLOCATED_245\";\n\t\tcase ENC_UNALLOCATED_246: return \"UNALLOCATED_246\";\n\t\tcase ENC_UNALLOCATED_247: return \"UNALLOCATED_247\";\n\t\tcase ENC_UNALLOCATED_248: return \"UNALLOCATED_248\";\n\t\tcase ENC_UNALLOCATED_249: return \"UNALLOCATED_249\";\n\t\tcase ENC_UNALLOCATED_24_ASIMDALL: return \"UNALLOCATED_24_asimdall\";\n\t\tcase ENC_UNALLOCATED_24_ASIMDINS: return \"UNALLOCATED_24_asimdins\";\n\t\tcase ENC_UNALLOCATED_24_ASIMDMISC: return \"UNALLOCATED_24_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_24_ASISDMISC: return \"UNALLOCATED_24_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_24_ASISDSHF: return \"UNALLOCATED_24_asisdshf\";\n\t\tcase ENC_UNALLOCATED_24_BRANCH_REG: return \"UNALLOCATED_24_branch_reg\";\n\t\tcase ENC_UNALLOCATED_24_DP_2SRC: return \"UNALLOCATED_24_dp_2src\";\n\t\tcase ENC_UNALLOCATED_24_EXCEPTION: return \"UNALLOCATED_24_exception\";\n\t\tcase ENC_UNALLOCATED_24_LDAPSTL_UNSCALED: return \"UNALLOCATED_24_ldapstl_unscaled\";\n\t\tcase ENC_UNALLOCATED_24_LDST_IMMPOST: return \"UNALLOCATED_24_ldst_immpost\";\n\t\tcase ENC_UNALLOCATED_24_LDST_IMMPRE: return \"UNALLOCATED_24_ldst_immpre\";\n\t\tcase ENC_UNALLOCATED_24_LDST_POS: return \"UNALLOCATED_24_ldst_pos\";\n\t\tcase ENC_UNALLOCATED_24_LDST_UNPRIV: return \"UNALLOCATED_24_ldst_unpriv\";\n\t\tcase ENC_UNALLOCATED_24_LDST_UNSCALED: return \"UNALLOCATED_24_ldst_unscaled\";\n\t\tcase ENC_UNALLOCATED_250: return \"UNALLOCATED_250\";\n\t\tcase ENC_UNALLOCATED_251: return \"UNALLOCATED_251\";\n\t\tcase ENC_UNALLOCATED_252: return \"UNALLOCATED_252\";\n\t\tcase ENC_UNALLOCATED_253: return \"UNALLOCATED_253\";\n\t\tcase ENC_UNALLOCATED_254: return \"UNALLOCATED_254\";\n\t\tcase ENC_UNALLOCATED_255: return \"UNALLOCATED_255\";\n\t\tcase ENC_UNALLOCATED_256: return \"UNALLOCATED_256\";\n\t\tcase ENC_UNALLOCATED_257: return \"UNALLOCATED_257\";\n\t\tcase ENC_UNALLOCATED_258: return \"UNALLOCATED_258\";\n\t\tcase ENC_UNALLOCATED_259: return \"UNALLOCATED_259\";\n\t\tcase ENC_UNALLOCATED_25_ASIMDELEM: return \"UNALLOCATED_25_asimdelem\";\n\t\tcase ENC_UNALLOCATED_25_ASIMDSAMEFP16: return \"UNALLOCATED_25_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_25_ASIMDSHF: return \"UNALLOCATED_25_asimdshf\";\n\t\tcase ENC_UNALLOCATED_25_ASISDELEM: return \"UNALLOCATED_25_asisdelem\";\n\t\tcase ENC_UNALLOCATED_25_ASISDLSE: return \"UNALLOCATED_25_asisdlse\";\n\t\tcase ENC_UNALLOCATED_25_ASISDLSO: return \"UNALLOCATED_25_asisdlso\";\n\t\tcase ENC_UNALLOCATED_25_ASISDLSOP: return \"UNALLOCATED_25_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_25_ASISDPAIR: return \"UNALLOCATED_25_asisdpair\";\n\t\tcase ENC_UNALLOCATED_25_ASISDSAMEFP16: return \"UNALLOCATED_25_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_25_BARRIERS: return \"UNALLOCATED_25_barriers\";\n\t\tcase ENC_UNALLOCATED_25_DP_2SRC: return \"UNALLOCATED_25_dp_2src\";\n\t\tcase ENC_UNALLOCATED_25_DP_3SRC: return \"UNALLOCATED_25_dp_3src\";\n\t\tcase ENC_UNALLOCATED_25_LDAPSTL_UNSCALED: return \"UNALLOCATED_25_ldapstl_unscaled\";\n\t\tcase ENC_UNALLOCATED_25_LDST_UNPRIV: return \"UNALLOCATED_25_ldst_unpriv\";\n\t\tcase ENC_UNALLOCATED_260: return \"UNALLOCATED_260\";\n\t\tcase ENC_UNALLOCATED_261: return \"UNALLOCATED_261\";\n\t\tcase ENC_UNALLOCATED_262: return \"UNALLOCATED_262\";\n\t\tcase ENC_UNALLOCATED_263: return \"UNALLOCATED_263\";\n\t\tcase ENC_UNALLOCATED_264: return \"UNALLOCATED_264\";\n\t\tcase ENC_UNALLOCATED_265: return \"UNALLOCATED_265\";\n\t\tcase ENC_UNALLOCATED_266: return \"UNALLOCATED_266\";\n\t\tcase ENC_UNALLOCATED_267: return \"UNALLOCATED_267\";\n\t\tcase ENC_UNALLOCATED_268: return \"UNALLOCATED_268\";\n\t\tcase ENC_UNALLOCATED_269: return \"UNALLOCATED_269\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDALL: return \"UNALLOCATED_26_asimdall\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDELEM: return \"UNALLOCATED_26_asimdelem\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDIMM: return \"UNALLOCATED_26_asimdimm\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDMISCFP16: return \"UNALLOCATED_26_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDSAME2: return \"UNALLOCATED_26_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_26_ASIMDSAMEFP16: return \"UNALLOCATED_26_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_26_ASISDELEM: return \"UNALLOCATED_26_asisdelem\";\n\t\tcase ENC_UNALLOCATED_26_ASISDLSEP: return \"UNALLOCATED_26_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_26_ASISDLSO: return \"UNALLOCATED_26_asisdlso\";\n\t\tcase ENC_UNALLOCATED_26_ASISDLSOP: return \"UNALLOCATED_26_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_26_ASISDPAIR: return \"UNALLOCATED_26_asisdpair\";\n\t\tcase ENC_UNALLOCATED_26_ASISDSHF: return \"UNALLOCATED_26_asisdshf\";\n\t\tcase ENC_UNALLOCATED_26_BRANCH_REG: return \"UNALLOCATED_26_branch_reg\";\n\t\tcase ENC_UNALLOCATED_26_FLOATDP1: return \"UNALLOCATED_26_floatdp1\";\n\t\tcase ENC_UNALLOCATED_270: return \"UNALLOCATED_270\";\n\t\tcase ENC_UNALLOCATED_271: return \"UNALLOCATED_271\";\n\t\tcase ENC_UNALLOCATED_272: return \"UNALLOCATED_272\";\n\t\tcase ENC_UNALLOCATED_273: return \"UNALLOCATED_273\";\n\t\tcase ENC_UNALLOCATED_274: return \"UNALLOCATED_274\";\n\t\tcase ENC_UNALLOCATED_275: return \"UNALLOCATED_275\";\n\t\tcase ENC_UNALLOCATED_276: return \"UNALLOCATED_276\";\n\t\tcase ENC_UNALLOCATED_277: return \"UNALLOCATED_277\";\n\t\tcase ENC_UNALLOCATED_278: return \"UNALLOCATED_278\";\n\t\tcase ENC_UNALLOCATED_279: return \"UNALLOCATED_279\";\n\t\tcase ENC_UNALLOCATED_27_ASIMDALL: return \"UNALLOCATED_27_asimdall\";\n\t\tcase ENC_UNALLOCATED_27_ASIMDELEM: return \"UNALLOCATED_27_asimdelem\";\n\t\tcase ENC_UNALLOCATED_27_ASIMDIMM: return \"UNALLOCATED_27_asimdimm\";\n\t\tcase ENC_UNALLOCATED_27_ASIMDSAME2: return \"UNALLOCATED_27_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_27_ASISDLSE: return \"UNALLOCATED_27_asisdlse\";\n\t\tcase ENC_UNALLOCATED_27_ASISDMISC: return \"UNALLOCATED_27_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_27_ASISDPAIR: return \"UNALLOCATED_27_asisdpair\";\n\t\tcase ENC_UNALLOCATED_27_ASISDSAMEFP16: return \"UNALLOCATED_27_asisdsamefp16\";\n\t\tcase ENC_UNALLOCATED_27_DP_3SRC: return \"UNALLOCATED_27_dp_3src\";\n\t\tcase ENC_UNALLOCATED_280: return \"UNALLOCATED_280\";\n\t\tcase ENC_UNALLOCATED_281: return \"UNALLOCATED_281\";\n\t\tcase ENC_UNALLOCATED_282: return \"UNALLOCATED_282\";\n\t\tcase ENC_UNALLOCATED_283: return \"UNALLOCATED_283\";\n\t\tcase ENC_UNALLOCATED_284: return \"UNALLOCATED_284\";\n\t\tcase ENC_UNALLOCATED_285: return \"UNALLOCATED_285\";\n\t\tcase ENC_UNALLOCATED_286: return \"UNALLOCATED_286\";\n\t\tcase ENC_UNALLOCATED_287: return \"UNALLOCATED_287\";\n\t\tcase ENC_UNALLOCATED_288: return \"UNALLOCATED_288\";\n\t\tcase ENC_UNALLOCATED_289: return \"UNALLOCATED_289\";\n\t\tcase ENC_UNALLOCATED_28_ASIMDIMM: return \"UNALLOCATED_28_asimdimm\";\n\t\tcase ENC_UNALLOCATED_28_ASIMDSAME2: return \"UNALLOCATED_28_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_28_ASIMDSHF: return \"UNALLOCATED_28_asimdshf\";\n\t\tcase ENC_UNALLOCATED_28_ASISDELEM: return \"UNALLOCATED_28_asisdelem\";\n\t\tcase ENC_UNALLOCATED_28_BRANCH_REG: return \"UNALLOCATED_28_branch_reg\";\n\t\tcase ENC_UNALLOCATED_28_DP_1SRC: return \"UNALLOCATED_28_dp_1src\";\n\t\tcase ENC_UNALLOCATED_28_EXCEPTION: return \"UNALLOCATED_28_exception\";\n\t\tcase ENC_UNALLOCATED_28_LDST_REGOFF: return \"UNALLOCATED_28_ldst_regoff\";\n\t\tcase ENC_UNALLOCATED_290: return \"UNALLOCATED_290\";\n\t\tcase ENC_UNALLOCATED_291: return \"UNALLOCATED_291\";\n\t\tcase ENC_UNALLOCATED_292: return \"UNALLOCATED_292\";\n\t\tcase ENC_UNALLOCATED_293: return \"UNALLOCATED_293\";\n\t\tcase ENC_UNALLOCATED_294: return \"UNALLOCATED_294\";\n\t\tcase ENC_UNALLOCATED_295: return \"UNALLOCATED_295\";\n\t\tcase ENC_UNALLOCATED_296: return \"UNALLOCATED_296\";\n\t\tcase ENC_UNALLOCATED_297: return \"UNALLOCATED_297\";\n\t\tcase ENC_UNALLOCATED_298: return \"UNALLOCATED_298\";\n\t\tcase ENC_UNALLOCATED_299: return \"UNALLOCATED_299\";\n\t\tcase ENC_UNALLOCATED_29_ASIMDALL: return \"UNALLOCATED_29_asimdall\";\n\t\tcase ENC_UNALLOCATED_29_ASIMDELEM: return \"UNALLOCATED_29_asimdelem\";\n\t\tcase ENC_UNALLOCATED_29_ASIMDIMM: return \"UNALLOCATED_29_asimdimm\";\n\t\tcase ENC_UNALLOCATED_29_ASIMDSAMEFP16: return \"UNALLOCATED_29_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_29_ASIMDSHF: return \"UNALLOCATED_29_asimdshf\";\n\t\tcase ENC_UNALLOCATED_29_ASISDELEM: return \"UNALLOCATED_29_asisdelem\";\n\t\tcase ENC_UNALLOCATED_29_ASISDLSE: return \"UNALLOCATED_29_asisdlse\";\n\t\tcase ENC_UNALLOCATED_29_ASISDLSEP: return \"UNALLOCATED_29_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_29_ASISDLSO: return \"UNALLOCATED_29_asisdlso\";\n\t\tcase ENC_UNALLOCATED_29_ASISDLSOP: return \"UNALLOCATED_29_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_29_ASISDPAIR: return \"UNALLOCATED_29_asisdpair\";\n\t\tcase ENC_UNALLOCATED_29_ASISDSHF: return \"UNALLOCATED_29_asisdshf\";\n\t\tcase ENC_UNALLOCATED_29_BRANCH_REG: return \"UNALLOCATED_29_branch_reg\";\n\t\tcase ENC_UNALLOCATED_29_DP_3SRC: return \"UNALLOCATED_29_dp_3src\";\n\t\tcase ENC_UNALLOCATED_29_EXCEPTION: return \"UNALLOCATED_29_exception\";\n\t\tcase ENC_UNALLOCATED_300: return \"UNALLOCATED_300\";\n\t\tcase ENC_UNALLOCATED_301: return \"UNALLOCATED_301\";\n\t\tcase ENC_UNALLOCATED_302: return \"UNALLOCATED_302\";\n\t\tcase ENC_UNALLOCATED_303: return \"UNALLOCATED_303\";\n\t\tcase ENC_UNALLOCATED_304: return \"UNALLOCATED_304\";\n\t\tcase ENC_UNALLOCATED_305: return \"UNALLOCATED_305\";\n\t\tcase ENC_UNALLOCATED_306: return \"UNALLOCATED_306\";\n\t\tcase ENC_UNALLOCATED_307: return \"UNALLOCATED_307\";\n\t\tcase ENC_UNALLOCATED_308: return \"UNALLOCATED_308\";\n\t\tcase ENC_UNALLOCATED_309: return \"UNALLOCATED_309\";\n\t\tcase ENC_UNALLOCATED_30_ASIMDIMM: return \"UNALLOCATED_30_asimdimm\";\n\t\tcase ENC_UNALLOCATED_30_ASISDLSEP: return \"UNALLOCATED_30_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_30_ASISDPAIR: return \"UNALLOCATED_30_asisdpair\";\n\t\tcase ENC_UNALLOCATED_30_ASISDSAME: return \"UNALLOCATED_30_asisdsame\";\n\t\tcase ENC_UNALLOCATED_30_ASISDSHF: return \"UNALLOCATED_30_asisdshf\";\n\t\tcase ENC_UNALLOCATED_30_BRANCH_REG: return \"UNALLOCATED_30_branch_reg\";\n\t\tcase ENC_UNALLOCATED_30_DP_3SRC: return \"UNALLOCATED_30_dp_3src\";\n\t\tcase ENC_UNALLOCATED_30_EXCEPTION: return \"UNALLOCATED_30_exception\";\n\t\tcase ENC_UNALLOCATED_310: return \"UNALLOCATED_310\";\n\t\tcase ENC_UNALLOCATED_311: return \"UNALLOCATED_311\";\n\t\tcase ENC_UNALLOCATED_312: return \"UNALLOCATED_312\";\n\t\tcase ENC_UNALLOCATED_313: return \"UNALLOCATED_313\";\n\t\tcase ENC_UNALLOCATED_314: return \"UNALLOCATED_314\";\n\t\tcase ENC_UNALLOCATED_315: return \"UNALLOCATED_315\";\n\t\tcase ENC_UNALLOCATED_316: return \"UNALLOCATED_316\";\n\t\tcase ENC_UNALLOCATED_317: return \"UNALLOCATED_317\";\n\t\tcase ENC_UNALLOCATED_318: return \"UNALLOCATED_318\";\n\t\tcase ENC_UNALLOCATED_319: return \"UNALLOCATED_319\";\n\t\tcase ENC_UNALLOCATED_31_ASIMDIMM: return \"UNALLOCATED_31_asimdimm\";\n\t\tcase ENC_UNALLOCATED_31_ASIMDSAME2: return \"UNALLOCATED_31_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_31_ASIMDSAMEFP16: return \"UNALLOCATED_31_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_31_ASIMDSHF: return \"UNALLOCATED_31_asimdshf\";\n\t\tcase ENC_UNALLOCATED_31_ASISDLSO: return \"UNALLOCATED_31_asisdlso\";\n\t\tcase ENC_UNALLOCATED_31_ASISDLSOP: return \"UNALLOCATED_31_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_31_BRANCH_REG: return \"UNALLOCATED_31_branch_reg\";\n\t\tcase ENC_UNALLOCATED_31_DP_3SRC: return \"UNALLOCATED_31_dp_3src\";\n\t\tcase ENC_UNALLOCATED_31_EXCEPTION: return \"UNALLOCATED_31_exception\";\n\t\tcase ENC_UNALLOCATED_320: return \"UNALLOCATED_320\";\n\t\tcase ENC_UNALLOCATED_321: return \"UNALLOCATED_321\";\n\t\tcase ENC_UNALLOCATED_322: return \"UNALLOCATED_322\";\n\t\tcase ENC_UNALLOCATED_323: return \"UNALLOCATED_323\";\n\t\tcase ENC_UNALLOCATED_324: return \"UNALLOCATED_324\";\n\t\tcase ENC_UNALLOCATED_325: return \"UNALLOCATED_325\";\n\t\tcase ENC_UNALLOCATED_326: return \"UNALLOCATED_326\";\n\t\tcase ENC_UNALLOCATED_327: return \"UNALLOCATED_327\";\n\t\tcase ENC_UNALLOCATED_328: return \"UNALLOCATED_328\";\n\t\tcase ENC_UNALLOCATED_329: return \"UNALLOCATED_329\";\n\t\tcase ENC_UNALLOCATED_32_ASIMDALL: return \"UNALLOCATED_32_asimdall\";\n\t\tcase ENC_UNALLOCATED_32_ASIMDDIFF: return \"UNALLOCATED_32_asimddiff\";\n\t\tcase ENC_UNALLOCATED_32_ASIMDELEM: return \"UNALLOCATED_32_asimdelem\";\n\t\tcase ENC_UNALLOCATED_32_ASIMDSAME2: return \"UNALLOCATED_32_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_32_ASISDELEM: return \"UNALLOCATED_32_asisdelem\";\n\t\tcase ENC_UNALLOCATED_32_ASISDSHF: return \"UNALLOCATED_32_asisdshf\";\n\t\tcase ENC_UNALLOCATED_32_BRANCH_REG: return \"UNALLOCATED_32_branch_reg\";\n\t\tcase ENC_UNALLOCATED_32_DP_3SRC: return \"UNALLOCATED_32_dp_3src\";\n\t\tcase ENC_UNALLOCATED_32_EXCEPTION: return \"UNALLOCATED_32_exception\";\n\t\tcase ENC_UNALLOCATED_33_ASIMDELEM: return \"UNALLOCATED_33_asimdelem\";\n\t\tcase ENC_UNALLOCATED_33_ASIMDSAMEFP16: return \"UNALLOCATED_33_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_33_ASISDLSE: return \"UNALLOCATED_33_asisdlse\";\n\t\tcase ENC_UNALLOCATED_33_ASISDLSEP: return \"UNALLOCATED_33_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_33_ASISDLSO: return \"UNALLOCATED_33_asisdlso\";\n\t\tcase ENC_UNALLOCATED_33_ASISDLSOP: return \"UNALLOCATED_33_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_33_ASISDMISC: return \"UNALLOCATED_33_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_33_ASISDMISCFP16: return \"UNALLOCATED_33_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_33_FLOATDP1: return \"UNALLOCATED_33_floatdp1\";\n\t\tcase ENC_UNALLOCATED_34_ASIMDALL: return \"UNALLOCATED_34_asimdall\";\n\t\tcase ENC_UNALLOCATED_34_ASIMDDIFF: return \"UNALLOCATED_34_asimddiff\";\n\t\tcase ENC_UNALLOCATED_34_ASIMDMISC: return \"UNALLOCATED_34_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_34_ASIMDSAME2: return \"UNALLOCATED_34_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_34_ASIMDSHF: return \"UNALLOCATED_34_asimdshf\";\n\t\tcase ENC_UNALLOCATED_34_ASISDLSO: return \"UNALLOCATED_34_asisdlso\";\n\t\tcase ENC_UNALLOCATED_34_ASISDLSOP: return \"UNALLOCATED_34_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_34_ASISDMISC: return \"UNALLOCATED_34_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_34_BRANCH_REG: return \"UNALLOCATED_34_branch_reg\";\n\t\tcase ENC_UNALLOCATED_34_DP_1SRC: return \"UNALLOCATED_34_dp_1src\";\n\t\tcase ENC_UNALLOCATED_34_DP_2SRC: return \"UNALLOCATED_34_dp_2src\";\n\t\tcase ENC_UNALLOCATED_34_FLOATDP1: return \"UNALLOCATED_34_floatdp1\";\n\t\tcase ENC_UNALLOCATED_35_ASIMDALL: return \"UNALLOCATED_35_asimdall\";\n\t\tcase ENC_UNALLOCATED_35_ASIMDSAME2: return \"UNALLOCATED_35_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_35_ASISDELEM: return \"UNALLOCATED_35_asisdelem\";\n\t\tcase ENC_UNALLOCATED_35_ASISDLSE: return \"UNALLOCATED_35_asisdlse\";\n\t\tcase ENC_UNALLOCATED_35_ASISDMISC: return \"UNALLOCATED_35_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_35_ASISDSAME: return \"UNALLOCATED_35_asisdsame\";\n\t\tcase ENC_UNALLOCATED_35_ASISDSHF: return \"UNALLOCATED_35_asisdshf\";\n\t\tcase ENC_UNALLOCATED_35_BRANCH_REG: return \"UNALLOCATED_35_branch_reg\";\n\t\tcase ENC_UNALLOCATED_35_DP_2SRC: return \"UNALLOCATED_35_dp_2src\";\n\t\tcase ENC_UNALLOCATED_35_LDST_IMMPOST: return \"UNALLOCATED_35_ldst_immpost\";\n\t\tcase ENC_UNALLOCATED_35_LDST_IMMPRE: return \"UNALLOCATED_35_ldst_immpre\";\n\t\tcase ENC_UNALLOCATED_35_LDST_POS: return \"UNALLOCATED_35_ldst_pos\";\n\t\tcase ENC_UNALLOCATED_35_LDST_UNSCALED: return \"UNALLOCATED_35_ldst_unscaled\";\n\t\tcase ENC_UNALLOCATED_36_ASISDLSE: return \"UNALLOCATED_36_asisdlse\";\n\t\tcase ENC_UNALLOCATED_36_ASISDLSEP: return \"UNALLOCATED_36_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_36_ASISDMISC: return \"UNALLOCATED_36_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_36_ASISDSHF: return \"UNALLOCATED_36_asisdshf\";\n\t\tcase ENC_UNALLOCATED_36_DP_2SRC: return \"UNALLOCATED_36_dp_2src\";\n\t\tcase ENC_UNALLOCATED_36_LDST_IMMPOST: return \"UNALLOCATED_36_ldst_immpost\";\n\t\tcase ENC_UNALLOCATED_36_LDST_IMMPRE: return \"UNALLOCATED_36_ldst_immpre\";\n\t\tcase ENC_UNALLOCATED_36_LDST_POS: return \"UNALLOCATED_36_ldst_pos\";\n\t\tcase ENC_UNALLOCATED_36_LDST_UNSCALED: return \"UNALLOCATED_36_ldst_unscaled\";\n\t\tcase ENC_UNALLOCATED_37_ASIMDMISC: return \"UNALLOCATED_37_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_37_ASISDELEM: return \"UNALLOCATED_37_asisdelem\";\n\t\tcase ENC_UNALLOCATED_37_ASISDLSO: return \"UNALLOCATED_37_asisdlso\";\n\t\tcase ENC_UNALLOCATED_37_ASISDLSOP: return \"UNALLOCATED_37_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_37_BRANCH_REG: return \"UNALLOCATED_37_branch_reg\";\n\t\tcase ENC_UNALLOCATED_38_ASIMDDIFF: return \"UNALLOCATED_38_asimddiff\";\n\t\tcase ENC_UNALLOCATED_38_ASIMDSAME2: return \"UNALLOCATED_38_asimdsame2\";\n\t\tcase ENC_UNALLOCATED_38_ASISDMISC: return \"UNALLOCATED_38_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_38_ASISDMISCFP16: return \"UNALLOCATED_38_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_38_ASISDSHF: return \"UNALLOCATED_38_asisdshf\";\n\t\tcase ENC_UNALLOCATED_38_DP_2SRC: return \"UNALLOCATED_38_dp_2src\";\n\t\tcase ENC_UNALLOCATED_39_ASIMDALL: return \"UNALLOCATED_39_asimdall\";\n\t\tcase ENC_UNALLOCATED_39_ASIMDELEM: return \"UNALLOCATED_39_asimdelem\";\n\t\tcase ENC_UNALLOCATED_39_ASISDELEM: return \"UNALLOCATED_39_asisdelem\";\n\t\tcase ENC_UNALLOCATED_39_ASISDLSEP: return \"UNALLOCATED_39_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_39_ASISDLSO: return \"UNALLOCATED_39_asisdlso\";\n\t\tcase ENC_UNALLOCATED_39_ASISDLSOP: return \"UNALLOCATED_39_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_39_ASISDMISCFP16: return \"UNALLOCATED_39_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_39_BRANCH_REG: return \"UNALLOCATED_39_branch_reg\";\n\t\tcase ENC_UNALLOCATED_39_FLOAT2INT: return \"UNALLOCATED_39_float2int\";\n\t\tcase ENC_UNALLOCATED_40_ASIMDALL: return \"UNALLOCATED_40_asimdall\";\n\t\tcase ENC_UNALLOCATED_40_ASIMDDIFF: return \"UNALLOCATED_40_asimddiff\";\n\t\tcase ENC_UNALLOCATED_40_ASIMDELEM: return \"UNALLOCATED_40_asimdelem\";\n\t\tcase ENC_UNALLOCATED_40_BRANCH_REG: return \"UNALLOCATED_40_branch_reg\";\n\t\tcase ENC_UNALLOCATED_40_FLOAT2INT: return \"UNALLOCATED_40_float2int\";\n\t\tcase ENC_UNALLOCATED_40_FLOATDP1: return \"UNALLOCATED_40_floatdp1\";\n\t\tcase ENC_UNALLOCATED_41_ASIMDDIFF: return \"UNALLOCATED_41_asimddiff\";\n\t\tcase ENC_UNALLOCATED_41_ASIMDMISCFP16: return \"UNALLOCATED_41_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_41_ASISDLSO: return \"UNALLOCATED_41_asisdlso\";\n\t\tcase ENC_UNALLOCATED_41_ASISDLSOP: return \"UNALLOCATED_41_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_41_ASISDMISC: return \"UNALLOCATED_41_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_41_ASISDMISCFP16: return \"UNALLOCATED_41_asisdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_41_BRANCH_REG: return \"UNALLOCATED_41_branch_reg\";\n\t\tcase ENC_UNALLOCATED_41_FLOAT2INT: return \"UNALLOCATED_41_float2int\";\n\t\tcase ENC_UNALLOCATED_41_LDST_REGOFF: return \"UNALLOCATED_41_ldst_regoff\";\n\t\tcase ENC_UNALLOCATED_42_ASIMDELEM: return \"UNALLOCATED_42_asimdelem\";\n\t\tcase ENC_UNALLOCATED_42_ASIMDSAMEFP16: return \"UNALLOCATED_42_asimdsamefp16\";\n\t\tcase ENC_UNALLOCATED_42_ASISDELEM: return \"UNALLOCATED_42_asisdelem\";\n\t\tcase ENC_UNALLOCATED_42_ASISDLSO: return \"UNALLOCATED_42_asisdlso\";\n\t\tcase ENC_UNALLOCATED_42_ASISDLSOP: return \"UNALLOCATED_42_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_42_ASISDMISC: return \"UNALLOCATED_42_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_42_BRANCH_REG: return \"UNALLOCATED_42_branch_reg\";\n\t\tcase ENC_UNALLOCATED_42_LDST_REGOFF: return \"UNALLOCATED_42_ldst_regoff\";\n\t\tcase ENC_UNALLOCATED_43_ASIMDMISC: return \"UNALLOCATED_43_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_43_ASISDELEM: return \"UNALLOCATED_43_asisdelem\";\n\t\tcase ENC_UNALLOCATED_43_ASISDSAME: return \"UNALLOCATED_43_asisdsame\";\n\t\tcase ENC_UNALLOCATED_43_BRANCH_REG: return \"UNALLOCATED_43_branch_reg\";\n\t\tcase ENC_UNALLOCATED_44_ASIMDELEM: return \"UNALLOCATED_44_asimdelem\";\n\t\tcase ENC_UNALLOCATED_44_ASISDMISC: return \"UNALLOCATED_44_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_44_ASISDSHF: return \"UNALLOCATED_44_asisdshf\";\n\t\tcase ENC_UNALLOCATED_44_BRANCH_REG: return \"UNALLOCATED_44_branch_reg\";\n\t\tcase ENC_UNALLOCATED_45_ASIMDSHF: return \"UNALLOCATED_45_asimdshf\";\n\t\tcase ENC_UNALLOCATED_45_ASISDLSO: return \"UNALLOCATED_45_asisdlso\";\n\t\tcase ENC_UNALLOCATED_45_ASISDLSOP: return \"UNALLOCATED_45_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_45_ASISDMISC: return \"UNALLOCATED_45_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_45_ASISDSHF: return \"UNALLOCATED_45_asisdshf\";\n\t\tcase ENC_UNALLOCATED_46_ASIMDMISC: return \"UNALLOCATED_46_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_46_ASIMDMISCFP16: return \"UNALLOCATED_46_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_46_ASIMDSHF: return \"UNALLOCATED_46_asimdshf\";\n\t\tcase ENC_UNALLOCATED_46_ASISDLSEP: return \"UNALLOCATED_46_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_46_ASISDMISC: return \"UNALLOCATED_46_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_46_BRANCH_REG: return \"UNALLOCATED_46_branch_reg\";\n\t\tcase ENC_UNALLOCATED_47_ASIMDELEM: return \"UNALLOCATED_47_asimdelem\";\n\t\tcase ENC_UNALLOCATED_47_ASIMDMISCFP16: return \"UNALLOCATED_47_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_47_ASIMDSHF: return \"UNALLOCATED_47_asimdshf\";\n\t\tcase ENC_UNALLOCATED_47_BRANCH_REG: return \"UNALLOCATED_47_branch_reg\";\n\t\tcase ENC_UNALLOCATED_47_DP_2SRC: return \"UNALLOCATED_47_dp_2src\";\n\t\tcase ENC_UNALLOCATED_48_ASIMDMISCFP16: return \"UNALLOCATED_48_asimdmiscfp16\";\n\t\tcase ENC_UNALLOCATED_48_ASISDLSO: return \"UNALLOCATED_48_asisdlso\";\n\t\tcase ENC_UNALLOCATED_48_ASISDLSOP: return \"UNALLOCATED_48_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_48_ASISDSHF: return \"UNALLOCATED_48_asisdshf\";\n\t\tcase ENC_UNALLOCATED_48_BRANCH_REG: return \"UNALLOCATED_48_branch_reg\";\n\t\tcase ENC_UNALLOCATED_48_DP_2SRC: return \"UNALLOCATED_48_dp_2src\";\n\t\tcase ENC_UNALLOCATED_48_FLOATDP1: return \"UNALLOCATED_48_floatdp1\";\n\t\tcase ENC_UNALLOCATED_49_ASIMDMISC: return \"UNALLOCATED_49_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_49_ASISDLSEP: return \"UNALLOCATED_49_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_49_ASISDLSO: return \"UNALLOCATED_49_asisdlso\";\n\t\tcase ENC_UNALLOCATED_49_ASISDLSOP: return \"UNALLOCATED_49_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_49_ASISDSAME: return \"UNALLOCATED_49_asisdsame\";\n\t\tcase ENC_UNALLOCATED_49_ASISDSHF: return \"UNALLOCATED_49_asisdshf\";\n\t\tcase ENC_UNALLOCATED_49_BRANCH_REG: return \"UNALLOCATED_49_branch_reg\";\n\t\tcase ENC_UNALLOCATED_49_DP_2SRC: return \"UNALLOCATED_49_dp_2src\";\n\t\tcase ENC_UNALLOCATED_50_ASIMDSHF: return \"UNALLOCATED_50_asimdshf\";\n\t\tcase ENC_UNALLOCATED_50_ASISDLSEP: return \"UNALLOCATED_50_asisdlsep\";\n\t\tcase ENC_UNALLOCATED_50_DP_2SRC: return \"UNALLOCATED_50_dp_2src\";\n\t\tcase ENC_UNALLOCATED_51_ASIMDSHF: return \"UNALLOCATED_51_asimdshf\";\n\t\tcase ENC_UNALLOCATED_51_ASISDLSO: return \"UNALLOCATED_51_asisdlso\";\n\t\tcase ENC_UNALLOCATED_51_ASISDLSOP: return \"UNALLOCATED_51_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_51_ASISDSAME: return \"UNALLOCATED_51_asisdsame\";\n\t\tcase ENC_UNALLOCATED_51_BRANCH_REG: return \"UNALLOCATED_51_branch_reg\";\n\t\tcase ENC_UNALLOCATED_51_DP_2SRC: return \"UNALLOCATED_51_dp_2src\";\n\t\tcase ENC_UNALLOCATED_52_BRANCH_REG: return \"UNALLOCATED_52_branch_reg\";\n\t\tcase ENC_UNALLOCATED_53_ASIMDELEM: return \"UNALLOCATED_53_asimdelem\";\n\t\tcase ENC_UNALLOCATED_53_ASIMDMISC: return \"UNALLOCATED_53_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_53_BRANCH_REG: return \"UNALLOCATED_53_branch_reg\";\n\t\tcase ENC_UNALLOCATED_54_ASISDLSO: return \"UNALLOCATED_54_asisdlso\";\n\t\tcase ENC_UNALLOCATED_54_ASISDLSOP: return \"UNALLOCATED_54_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_55_ASIMDELEM: return \"UNALLOCATED_55_asimdelem\";\n\t\tcase ENC_UNALLOCATED_55_BRANCH_REG: return \"UNALLOCATED_55_branch_reg\";\n\t\tcase ENC_UNALLOCATED_55_FLOATDP1: return \"UNALLOCATED_55_floatdp1\";\n\t\tcase ENC_UNALLOCATED_56_ASISDLSO: return \"UNALLOCATED_56_asisdlso\";\n\t\tcase ENC_UNALLOCATED_56_ASISDLSOP: return \"UNALLOCATED_56_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_56_BRANCH_REG: return \"UNALLOCATED_56_branch_reg\";\n\t\tcase ENC_UNALLOCATED_56_FLOATDP1: return \"UNALLOCATED_56_floatdp1\";\n\t\tcase ENC_UNALLOCATED_57_ASIMDELEM: return \"UNALLOCATED_57_asimdelem\";\n\t\tcase ENC_UNALLOCATED_57_ASIMDMISC: return \"UNALLOCATED_57_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_57_ASISDMISC: return \"UNALLOCATED_57_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_57_BRANCH_REG: return \"UNALLOCATED_57_branch_reg\";\n\t\tcase ENC_UNALLOCATED_57_FLOATDP1: return \"UNALLOCATED_57_floatdp1\";\n\t\tcase ENC_UNALLOCATED_58_ASIMDMISC: return \"UNALLOCATED_58_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_58_ASISDLSO: return \"UNALLOCATED_58_asisdlso\";\n\t\tcase ENC_UNALLOCATED_58_ASISDLSOP: return \"UNALLOCATED_58_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_58_ASISDSAME: return \"UNALLOCATED_58_asisdsame\";\n\t\tcase ENC_UNALLOCATED_58_BRANCH_REG: return \"UNALLOCATED_58_branch_reg\";\n\t\tcase ENC_UNALLOCATED_59_ASISDLSO: return \"UNALLOCATED_59_asisdlso\";\n\t\tcase ENC_UNALLOCATED_59_ASISDLSOP: return \"UNALLOCATED_59_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_59_BRANCH_REG: return \"UNALLOCATED_59_branch_reg\";\n\t\tcase ENC_UNALLOCATED_60_ASIMDMISC: return \"UNALLOCATED_60_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_60_BRANCH_REG: return \"UNALLOCATED_60_branch_reg\";\n\t\tcase ENC_UNALLOCATED_61_ASIMDMISC: return \"UNALLOCATED_61_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_61_ASISDLSO: return \"UNALLOCATED_61_asisdlso\";\n\t\tcase ENC_UNALLOCATED_61_ASISDLSOP: return \"UNALLOCATED_61_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_61_ASISDSAME: return \"UNALLOCATED_61_asisdsame\";\n\t\tcase ENC_UNALLOCATED_61_BRANCH_REG: return \"UNALLOCATED_61_branch_reg\";\n\t\tcase ENC_UNALLOCATED_62_ASISDMISC: return \"UNALLOCATED_62_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_63_ASISDMISC: return \"UNALLOCATED_63_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_63_ASISDSAME: return \"UNALLOCATED_63_asisdsame\";\n\t\tcase ENC_UNALLOCATED_63_BRANCH_REG: return \"UNALLOCATED_63_branch_reg\";\n\t\tcase ENC_UNALLOCATED_64_ASIMDSAME: return \"UNALLOCATED_64_asimdsame\";\n\t\tcase ENC_UNALLOCATED_64_ASISDLSO: return \"UNALLOCATED_64_asisdlso\";\n\t\tcase ENC_UNALLOCATED_64_ASISDLSOP: return \"UNALLOCATED_64_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_64_BRANCH_REG: return \"UNALLOCATED_64_branch_reg\";\n\t\tcase ENC_UNALLOCATED_64_FLOATDP1: return \"UNALLOCATED_64_floatdp1\";\n\t\tcase ENC_UNALLOCATED_65_ASIMDMISC: return \"UNALLOCATED_65_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_65_ASISDMISC: return \"UNALLOCATED_65_asisdmisc\";\n\t\tcase ENC_UNALLOCATED_65_ASISDSAME: return \"UNALLOCATED_65_asisdsame\";\n\t\tcase ENC_UNALLOCATED_65_BRANCH_REG: return \"UNALLOCATED_65_branch_reg\";\n\t\tcase ENC_UNALLOCATED_66_ASISDLSO: return \"UNALLOCATED_66_asisdlso\";\n\t\tcase ENC_UNALLOCATED_66_ASISDLSOP: return \"UNALLOCATED_66_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_66_BRANCH_REG: return \"UNALLOCATED_66_branch_reg\";\n\t\tcase ENC_UNALLOCATED_67_BRANCH_REG: return \"UNALLOCATED_67_branch_reg\";\n\t\tcase ENC_UNALLOCATED_68_ASISDLSO: return \"UNALLOCATED_68_asisdlso\";\n\t\tcase ENC_UNALLOCATED_68_ASISDLSOP: return \"UNALLOCATED_68_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_68_BRANCH_REG: return \"UNALLOCATED_68_branch_reg\";\n\t\tcase ENC_UNALLOCATED_68_FLOAT2INT: return \"UNALLOCATED_68_float2int\";\n\t\tcase ENC_UNALLOCATED_69_ASISDLSO: return \"UNALLOCATED_69_asisdlso\";\n\t\tcase ENC_UNALLOCATED_69_ASISDLSOP: return \"UNALLOCATED_69_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_69_FLOAT2INT: return \"UNALLOCATED_69_float2int\";\n\t\tcase ENC_UNALLOCATED_70_FLOATDP1: return \"UNALLOCATED_70_floatdp1\";\n\t\tcase ENC_UNALLOCATED_71_ASIMDSAME: return \"UNALLOCATED_71_asimdsame\";\n\t\tcase ENC_UNALLOCATED_71_ASISDLSO: return \"UNALLOCATED_71_asisdlso\";\n\t\tcase ENC_UNALLOCATED_71_ASISDLSOP: return \"UNALLOCATED_71_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_71_BRANCH_REG: return \"UNALLOCATED_71_branch_reg\";\n\t\tcase ENC_UNALLOCATED_71_FLOAT2INT: return \"UNALLOCATED_71_float2int\";\n\t\tcase ENC_UNALLOCATED_72_BRANCH_REG: return \"UNALLOCATED_72_branch_reg\";\n\t\tcase ENC_UNALLOCATED_72_FLOAT2INT: return \"UNALLOCATED_72_float2int\";\n\t\tcase ENC_UNALLOCATED_73_BRANCH_REG: return \"UNALLOCATED_73_branch_reg\";\n\t\tcase ENC_UNALLOCATED_73_FLOAT2INT: return \"UNALLOCATED_73_float2int\";\n\t\tcase ENC_UNALLOCATED_73_FLOATDP1: return \"UNALLOCATED_73_floatdp1\";\n\t\tcase ENC_UNALLOCATED_74_ASIMDSAME: return \"UNALLOCATED_74_asimdsame\";\n\t\tcase ENC_UNALLOCATED_74_ASISDLSO: return \"UNALLOCATED_74_asisdlso\";\n\t\tcase ENC_UNALLOCATED_74_ASISDLSOP: return \"UNALLOCATED_74_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_74_BRANCH_REG: return \"UNALLOCATED_74_branch_reg\";\n\t\tcase ENC_UNALLOCATED_75_BRANCH_REG: return \"UNALLOCATED_75_branch_reg\";\n\t\tcase ENC_UNALLOCATED_76_ASISDLSO: return \"UNALLOCATED_76_asisdlso\";\n\t\tcase ENC_UNALLOCATED_76_ASISDLSOP: return \"UNALLOCATED_76_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_76_FLOAT2INT: return \"UNALLOCATED_76_float2int\";\n\t\tcase ENC_UNALLOCATED_77_FLOAT2INT: return \"UNALLOCATED_77_float2int\";\n\t\tcase ENC_UNALLOCATED_78_ASISDLSO: return \"UNALLOCATED_78_asisdlso\";\n\t\tcase ENC_UNALLOCATED_78_ASISDLSOP: return \"UNALLOCATED_78_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_78_BRANCH_REG: return \"UNALLOCATED_78_branch_reg\";\n\t\tcase ENC_UNALLOCATED_78_FLOAT2INT: return \"UNALLOCATED_78_float2int\";\n\t\tcase ENC_UNALLOCATED_79_ASISDLSO: return \"UNALLOCATED_79_asisdlso\";\n\t\tcase ENC_UNALLOCATED_79_ASISDLSOP: return \"UNALLOCATED_79_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_79_BRANCH_REG: return \"UNALLOCATED_79_branch_reg\";\n\t\tcase ENC_UNALLOCATED_79_FLOAT2INT: return \"UNALLOCATED_79_float2int\";\n\t\tcase ENC_UNALLOCATED_80_BRANCH_REG: return \"UNALLOCATED_80_branch_reg\";\n\t\tcase ENC_UNALLOCATED_80_FLOAT2INT: return \"UNALLOCATED_80_float2int\";\n\t\tcase ENC_UNALLOCATED_81_ASIMDSAME: return \"UNALLOCATED_81_asimdsame\";\n\t\tcase ENC_UNALLOCATED_81_ASISDLSO: return \"UNALLOCATED_81_asisdlso\";\n\t\tcase ENC_UNALLOCATED_81_ASISDLSOP: return \"UNALLOCATED_81_asisdlsop\";\n\t\tcase ENC_UNALLOCATED_81_BRANCH_REG: return \"UNALLOCATED_81_branch_reg\";\n\t\tcase ENC_UNALLOCATED_82_ASIMDSAME: return \"UNALLOCATED_82_asimdsame\";\n\t\tcase ENC_UNALLOCATED_82_BRANCH_REG: return \"UNALLOCATED_82_branch_reg\";\n\t\tcase ENC_UNALLOCATED_83_BRANCH_REG: return \"UNALLOCATED_83_branch_reg\";\n\t\tcase ENC_UNALLOCATED_85_ASIMDSAME: return \"UNALLOCATED_85_asimdsame\";\n\t\tcase ENC_UNALLOCATED_88_ASIMDMISC: return \"UNALLOCATED_88_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_88_ASIMDSAME: return \"UNALLOCATED_88_asimdsame\";\n\t\tcase ENC_UNALLOCATED_91_ASIMDMISC: return \"UNALLOCATED_91_asimdmisc\";\n\t\tcase ENC_UNALLOCATED_91_ASIMDSAME: return \"UNALLOCATED_91_asimdsame\";\n\t\tcase ENC_UQADD_ASIMDSAME_ONLY: return \"UQADD_asimdsame_only\";\n\t\tcase ENC_UQADD_ASISDSAME_ONLY: return \"UQADD_asisdsame_only\";\n\t\tcase ENC_UQRSHL_ASIMDSAME_ONLY: return \"UQRSHL_asimdsame_only\";\n\t\tcase ENC_UQRSHL_ASISDSAME_ONLY: return \"UQRSHL_asisdsame_only\";\n\t\tcase ENC_UQRSHRN_ASIMDSHF_N: return \"UQRSHRN_asimdshf_N\";\n\t\tcase ENC_UQRSHRN_ASISDSHF_N: return \"UQRSHRN_asisdshf_N\";\n\t\tcase ENC_UQSHL_ASIMDSAME_ONLY: return \"UQSHL_asimdsame_only\";\n\t\tcase ENC_UQSHL_ASIMDSHF_R: return \"UQSHL_asimdshf_R\";\n\t\tcase ENC_UQSHL_ASISDSAME_ONLY: return \"UQSHL_asisdsame_only\";\n\t\tcase ENC_UQSHL_ASISDSHF_R: return \"UQSHL_asisdshf_R\";\n\t\tcase ENC_UQSHRN_ASIMDSHF_N: return \"UQSHRN_asimdshf_N\";\n\t\tcase ENC_UQSHRN_ASISDSHF_N: return \"UQSHRN_asisdshf_N\";\n\t\tcase ENC_UQSUB_ASIMDSAME_ONLY: return \"UQSUB_asimdsame_only\";\n\t\tcase ENC_UQSUB_ASISDSAME_ONLY: return \"UQSUB_asisdsame_only\";\n\t\tcase ENC_UQXTN_ASIMDMISC_N: return \"UQXTN_asimdmisc_N\";\n\t\tcase ENC_UQXTN_ASISDMISC_N: return \"UQXTN_asisdmisc_N\";\n\t\tcase ENC_URECPE_ASIMDMISC_R: return \"URECPE_asimdmisc_R\";\n\t\tcase ENC_URHADD_ASIMDSAME_ONLY: return \"URHADD_asimdsame_only\";\n\t\tcase ENC_URSHL_ASIMDSAME_ONLY: return \"URSHL_asimdsame_only\";\n\t\tcase ENC_URSHL_ASISDSAME_ONLY: return \"URSHL_asisdsame_only\";\n\t\tcase ENC_URSHR_ASIMDSHF_R: return \"URSHR_asimdshf_R\";\n\t\tcase ENC_URSHR_ASISDSHF_R: return \"URSHR_asisdshf_R\";\n\t\tcase ENC_URSQRTE_ASIMDMISC_R: return \"URSQRTE_asimdmisc_R\";\n\t\tcase ENC_URSRA_ASIMDSHF_R: return \"URSRA_asimdshf_R\";\n\t\tcase ENC_URSRA_ASISDSHF_R: return \"URSRA_asisdshf_R\";\n\t\tcase ENC_USDOT_ASIMDELEM_D: return \"USDOT_asimdelem_D\";\n\t\tcase ENC_USDOT_ASIMDSAME2_D: return \"USDOT_asimdsame2_D\";\n\t\tcase ENC_USHLL_ASIMDSHF_L: return \"USHLL_asimdshf_L\";\n\t\tcase ENC_USHL_ASIMDSAME_ONLY: return \"USHL_asimdsame_only\";\n\t\tcase ENC_USHL_ASISDSAME_ONLY: return \"USHL_asisdsame_only\";\n\t\tcase ENC_USHR_ASIMDSHF_R: return \"USHR_asimdshf_R\";\n\t\tcase ENC_USHR_ASISDSHF_R: return \"USHR_asisdshf_R\";\n\t\tcase ENC_USMMLA_ASIMDSAME2_G: return \"USMMLA_asimdsame2_G\";\n\t\tcase ENC_USQADD_ASIMDMISC_R: return \"USQADD_asimdmisc_R\";\n\t\tcase ENC_USQADD_ASISDMISC_R: return \"USQADD_asisdmisc_R\";\n\t\tcase ENC_USRA_ASIMDSHF_R: return \"USRA_asimdshf_R\";\n\t\tcase ENC_USRA_ASISDSHF_R: return \"USRA_asisdshf_R\";\n\t\tcase ENC_USUBL_ASIMDDIFF_L: return \"USUBL_asimddiff_L\";\n\t\tcase ENC_USUBW_ASIMDDIFF_W: return \"USUBW_asimddiff_W\";\n\t\tcase ENC_UXTB_UBFM_32M_BITFIELD: return \"UXTB_UBFM_32M_bitfield\";\n\t\tcase ENC_UXTH_UBFM_32M_BITFIELD: return \"UXTH_UBFM_32M_bitfield\";\n\t\tcase ENC_UXTL_USHLL_ASIMDSHF_L: return \"UXTL_USHLL_asimdshf_L\";\n\t\tcase ENC_UZP1_ASIMDPERM_ONLY: return \"UZP1_asimdperm_only\";\n\t\tcase ENC_UZP2_ASIMDPERM_ONLY: return \"UZP2_asimdperm_only\";\n\t\tcase ENC_WFET_ONLY_SYSTEMINSTRSWITHREG: return \"WFET_only_systeminstrswithreg\";\n\t\tcase ENC_WFE_HI_HINTS: return \"WFE_HI_hints\";\n\t\tcase ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG: return \"WFIT_only_systeminstrswithreg\";\n\t\tcase ENC_WFI_HI_HINTS: return \"WFI_HI_hints\";\n\t\tcase ENC_XAFLAG_M_PSTATE: return \"XAFLAG_M_pstate\";\n\t\tcase ENC_XAR_VVV2_CRYPTO3_IMM6: return \"XAR_VVV2_crypto3_imm6\";\n\t\tcase ENC_XPACD_64Z_DP_1SRC: return \"XPACD_64Z_dp_1src\";\n\t\tcase ENC_XPACI_64Z_DP_1SRC: return \"XPACI_64Z_dp_1src\";\n\t\tcase ENC_XPACLRI_HI_HINTS: return \"XPACLRI_HI_hints\";\n\t\tcase ENC_XTN_ASIMDMISC_N: return \"XTN_asimdmisc_N\";\n\t\tcase ENC_YIELD_HI_HINTS: return \"YIELD_HI_hints\";\n\t\tcase ENC_ZIP1_ASIMDPERM_ONLY: return \"ZIP1_asimdperm_only\";\n\t\tcase ENC_ZIP2_ASIMDPERM_ONLY: return \"ZIP2_asimdperm_only\";\n\t\tcase ENC_ABS_Z_P_Z_: return \"abs_z_p_z_\";\n\t\tcase ENC_ADCLB_Z_ZZZ_: return \"adclb_z_zzz_\";\n\t\tcase ENC_ADCLT_Z_ZZZ_: return \"adclt_z_zzz_\";\n\t\tcase ENC_ADD_Z_P_ZZ_: return \"add_z_p_zz_\";\n\t\tcase ENC_ADD_Z_ZI_: return \"add_z_zi_\";\n\t\tcase ENC_ADD_Z_ZZ_: return \"add_z_zz_\";\n\t\tcase ENC_ADDHA_ZA_PP_Z_32: return \"addha_za_pp_z_32\";\n\t\tcase ENC_ADDHA_ZA_PP_Z_64: return \"addha_za_pp_z_64\";\n\t\tcase ENC_ADDHNB_Z_ZZ_: return \"addhnb_z_zz_\";\n\t\tcase ENC_ADDHNT_Z_ZZ_: return \"addhnt_z_zz_\";\n\t\tcase ENC_ADDP_Z_P_ZZ_: return \"addp_z_p_zz_\";\n\t\tcase ENC_ADDPL_R_RI_: return \"addpl_r_ri_\";\n\t\tcase ENC_ADDVA_ZA_PP_Z_32: return \"addva_za_pp_z_32\";\n\t\tcase ENC_ADDVA_ZA_PP_Z_64: return \"addva_za_pp_z_64\";\n\t\tcase ENC_ADDVL_R_RI_: return \"addvl_r_ri_\";\n\t\tcase ENC_ADR_Z_AZ_D_S32_SCALED: return \"adr_z_az_d_s32_scaled\";\n\t\tcase ENC_ADR_Z_AZ_D_U32_SCALED: return \"adr_z_az_d_u32_scaled\";\n\t\tcase ENC_ADR_Z_AZ_SD_SAME_SCALED: return \"adr_z_az_sd_same_scaled\";\n\t\tcase ENC_AESD_Z_ZZ_: return \"aesd_z_zz_\";\n\t\tcase ENC_AESE_Z_ZZ_: return \"aese_z_zz_\";\n\t\tcase ENC_AESIMC_Z_Z_: return \"aesimc_z_z_\";\n\t\tcase ENC_AESMC_Z_Z_: return \"aesmc_z_z_\";\n\t\tcase ENC_AND_P_P_PP_Z: return \"and_p_p_pp_z\";\n\t\tcase ENC_AND_Z_P_ZZ_: return \"and_z_p_zz_\";\n\t\tcase ENC_AND_Z_ZI_: return \"and_z_zi_\";\n\t\tcase ENC_AND_Z_ZZ_: return \"and_z_zz_\";\n\t\tcase ENC_ANDS_P_P_PP_Z: return \"ands_p_p_pp_z\";\n\t\tcase ENC_ANDV_R_P_Z_: return \"andv_r_p_z_\";\n\t\tcase ENC_ASR_Z_P_ZI_: return \"asr_z_p_zi_\";\n\t\tcase ENC_ASR_Z_P_ZW_: return \"asr_z_p_zw_\";\n\t\tcase ENC_ASR_Z_P_ZZ_: return \"asr_z_p_zz_\";\n\t\tcase ENC_ASR_Z_ZI_: return \"asr_z_zi_\";\n\t\tcase ENC_ASR_Z_ZW_: return \"asr_z_zw_\";\n\t\tcase ENC_ASRD_Z_P_ZI_: return \"asrd_z_p_zi_\";\n\t\tcase ENC_ASRR_Z_P_ZZ_: return \"asrr_z_p_zz_\";\n\t\tcase ENC_BCAX_Z_ZZZ_: return \"bcax_z_zzz_\";\n\t\tcase ENC_BDEP_Z_ZZ_: return \"bdep_z_zz_\";\n\t\tcase ENC_BEXT_Z_ZZ_: return \"bext_z_zz_\";\n\t\tcase ENC_BFCVT_Z_P_Z_S2BF: return \"bfcvt_z_p_z_s2bf\";\n\t\tcase ENC_BFCVTNT_Z_P_Z_S2BF: return \"bfcvtnt_z_p_z_s2bf\";\n\t\tcase ENC_BFDOT_Z_ZZZ_: return \"bfdot_z_zzz_\";\n\t\tcase ENC_BFDOT_Z_ZZZI_: return \"bfdot_z_zzzi_\";\n\t\tcase ENC_BFMLALB_Z_ZZZ_: return \"bfmlalb_z_zzz_\";\n\t\tcase ENC_BFMLALB_Z_ZZZI_: return \"bfmlalb_z_zzzi_\";\n\t\tcase ENC_BFMLALT_Z_ZZZ_: return \"bfmlalt_z_zzz_\";\n\t\tcase ENC_BFMLALT_Z_ZZZI_: return \"bfmlalt_z_zzzi_\";\n\t\tcase ENC_BFMMLA_Z_ZZZ_: return \"bfmmla_z_zzz_\";\n\t\tcase ENC_BFMOPA_ZA32_PP_ZZ_: return \"bfmopa_za32_pp_zz_\";\n\t\tcase ENC_BFMOPS_ZA32_PP_ZZ_: return \"bfmops_za32_pp_zz_\";\n\t\tcase ENC_BGRP_Z_ZZ_: return \"bgrp_z_zz_\";\n\t\tcase ENC_BIC_P_P_PP_Z: return \"bic_p_p_pp_z\";\n\t\tcase ENC_BIC_Z_P_ZZ_: return \"bic_z_p_zz_\";\n\t\tcase ENC_BIC_Z_ZZ_: return \"bic_z_zz_\";\n\t\tcase ENC_BICS_P_P_PP_Z: return \"bics_p_p_pp_z\";\n\t\tcase ENC_BRKA_P_P_P_: return \"brka_p_p_p_\";\n\t\tcase ENC_BRKAS_P_P_P_Z: return \"brkas_p_p_p_z\";\n\t\tcase ENC_BRKB_P_P_P_: return \"brkb_p_p_p_\";\n\t\tcase ENC_BRKBS_P_P_P_Z: return \"brkbs_p_p_p_z\";\n\t\tcase ENC_BRKN_P_P_PP_: return \"brkn_p_p_pp_\";\n\t\tcase ENC_BRKNS_P_P_PP_: return \"brkns_p_p_pp_\";\n\t\tcase ENC_BRKPA_P_P_PP_: return \"brkpa_p_p_pp_\";\n\t\tcase ENC_BRKPAS_P_P_PP_: return \"brkpas_p_p_pp_\";\n\t\tcase ENC_BRKPB_P_P_PP_: return \"brkpb_p_p_pp_\";\n\t\tcase ENC_BRKPBS_P_P_PP_: return \"brkpbs_p_p_pp_\";\n\t\tcase ENC_BSL1N_Z_ZZZ_: return \"bsl1n_z_zzz_\";\n\t\tcase ENC_BSL2N_Z_ZZZ_: return \"bsl2n_z_zzz_\";\n\t\tcase ENC_BSL_Z_ZZZ_: return \"bsl_z_zzz_\";\n\t\tcase ENC_CADD_Z_ZZ_: return \"cadd_z_zz_\";\n\t\tcase ENC_CDOT_Z_ZZZ_: return \"cdot_z_zzz_\";\n\t\tcase ENC_CDOT_Z_ZZZI_D: return \"cdot_z_zzzi_d\";\n\t\tcase ENC_CDOT_Z_ZZZI_S: return \"cdot_z_zzzi_s\";\n\t\tcase ENC_CLASTA_R_P_Z_: return \"clasta_r_p_z_\";\n\t\tcase ENC_CLASTA_V_P_Z_: return \"clasta_v_p_z_\";\n\t\tcase ENC_CLASTA_Z_P_ZZ_: return \"clasta_z_p_zz_\";\n\t\tcase ENC_CLASTB_R_P_Z_: return \"clastb_r_p_z_\";\n\t\tcase ENC_CLASTB_V_P_Z_: return \"clastb_v_p_z_\";\n\t\tcase ENC_CLASTB_Z_P_ZZ_: return \"clastb_z_p_zz_\";\n\t\tcase ENC_CLS_Z_P_Z_: return \"cls_z_p_z_\";\n\t\tcase ENC_CLZ_Z_P_Z_: return \"clz_z_p_z_\";\n\t\tcase ENC_CMLA_Z_ZZZ_: return \"cmla_z_zzz_\";\n\t\tcase ENC_CMLA_Z_ZZZI_H: return \"cmla_z_zzzi_h\";\n\t\tcase ENC_CMLA_Z_ZZZI_S: return \"cmla_z_zzzi_s\";\n\t\tcase ENC_CMPEQ_P_P_ZI_: return \"cmpeq_p_p_zi_\";\n\t\tcase ENC_CMPEQ_P_P_ZW_: return \"cmpeq_p_p_zw_\";\n\t\tcase ENC_CMPEQ_P_P_ZZ_: return \"cmpeq_p_p_zz_\";\n\t\tcase ENC_CMPGE_P_P_ZI_: return \"cmpge_p_p_zi_\";\n\t\tcase ENC_CMPGE_P_P_ZW_: return \"cmpge_p_p_zw_\";\n\t\tcase ENC_CMPGE_P_P_ZZ_: return \"cmpge_p_p_zz_\";\n\t\tcase ENC_CMPGT_P_P_ZI_: return \"cmpgt_p_p_zi_\";\n\t\tcase ENC_CMPGT_P_P_ZW_: return \"cmpgt_p_p_zw_\";\n\t\tcase ENC_CMPGT_P_P_ZZ_: return \"cmpgt_p_p_zz_\";\n\t\tcase ENC_CMPHI_P_P_ZI_: return \"cmphi_p_p_zi_\";\n\t\tcase ENC_CMPHI_P_P_ZW_: return \"cmphi_p_p_zw_\";\n\t\tcase ENC_CMPHI_P_P_ZZ_: return \"cmphi_p_p_zz_\";\n\t\tcase ENC_CMPHS_P_P_ZI_: return \"cmphs_p_p_zi_\";\n\t\tcase ENC_CMPHS_P_P_ZW_: return \"cmphs_p_p_zw_\";\n\t\tcase ENC_CMPHS_P_P_ZZ_: return \"cmphs_p_p_zz_\";\n\t\tcase ENC_CMPLE_P_P_ZI_: return \"cmple_p_p_zi_\";\n\t\tcase ENC_CMPLE_P_P_ZW_: return \"cmple_p_p_zw_\";\n\t\tcase ENC_CMPLO_P_P_ZI_: return \"cmplo_p_p_zi_\";\n\t\tcase ENC_CMPLO_P_P_ZW_: return \"cmplo_p_p_zw_\";\n\t\tcase ENC_CMPLS_P_P_ZI_: return \"cmpls_p_p_zi_\";\n\t\tcase ENC_CMPLS_P_P_ZW_: return \"cmpls_p_p_zw_\";\n\t\tcase ENC_CMPLT_P_P_ZI_: return \"cmplt_p_p_zi_\";\n\t\tcase ENC_CMPLT_P_P_ZW_: return \"cmplt_p_p_zw_\";\n\t\tcase ENC_CMPNE_P_P_ZI_: return \"cmpne_p_p_zi_\";\n\t\tcase ENC_CMPNE_P_P_ZW_: return \"cmpne_p_p_zw_\";\n\t\tcase ENC_CMPNE_P_P_ZZ_: return \"cmpne_p_p_zz_\";\n\t\tcase ENC_CNOT_Z_P_Z_: return \"cnot_z_p_z_\";\n\t\tcase ENC_CNT_Z_P_Z_: return \"cnt_z_p_z_\";\n\t\tcase ENC_CNTB_R_S_: return \"cntb_r_s_\";\n\t\tcase ENC_CNTD_R_S_: return \"cntd_r_s_\";\n\t\tcase ENC_CNTH_R_S_: return \"cnth_r_s_\";\n\t\tcase ENC_CNTP_R_P_P_: return \"cntp_r_p_p_\";\n\t\tcase ENC_CNTW_R_S_: return \"cntw_r_s_\";\n\t\tcase ENC_COMPACT_Z_P_Z_: return \"compact_z_p_z_\";\n\t\tcase ENC_CPY_Z_O_I_: return \"cpy_z_o_i_\";\n\t\tcase ENC_CPY_Z_P_I_: return \"cpy_z_p_i_\";\n\t\tcase ENC_CPY_Z_P_R_: return \"cpy_z_p_r_\";\n\t\tcase ENC_CPY_Z_P_V_: return \"cpy_z_p_v_\";\n\t\tcase ENC_CTERMEQ_RR_: return \"ctermeq_rr_\";\n\t\tcase ENC_CTERMNE_RR_: return \"ctermne_rr_\";\n\t\tcase ENC_DECB_R_RS_: return \"decb_r_rs_\";\n\t\tcase ENC_DECD_R_RS_: return \"decd_r_rs_\";\n\t\tcase ENC_DECD_Z_ZS_: return \"decd_z_zs_\";\n\t\tcase ENC_DECH_R_RS_: return \"dech_r_rs_\";\n\t\tcase ENC_DECH_Z_ZS_: return \"dech_z_zs_\";\n\t\tcase ENC_DECP_R_P_R_: return \"decp_r_p_r_\";\n\t\tcase ENC_DECP_Z_P_Z_: return \"decp_z_p_z_\";\n\t\tcase ENC_DECW_R_RS_: return \"decw_r_rs_\";\n\t\tcase ENC_DECW_Z_ZS_: return \"decw_z_zs_\";\n\t\tcase ENC_DUP_P_P_PI_: return \"dup_p_p_pi_\";\n\t\tcase ENC_DUP_Z_I_: return \"dup_z_i_\";\n\t\tcase ENC_DUP_Z_R_: return \"dup_z_r_\";\n\t\tcase ENC_DUP_Z_ZI_: return \"dup_z_zi_\";\n\t\tcase ENC_DUPM_Z_I_: return \"dupm_z_i_\";\n\t\tcase ENC_EOR3_Z_ZZZ_: return \"eor3_z_zzz_\";\n\t\tcase ENC_EOR_P_P_PP_Z: return \"eor_p_p_pp_z\";\n\t\tcase ENC_EOR_Z_P_ZZ_: return \"eor_z_p_zz_\";\n\t\tcase ENC_EOR_Z_ZI_: return \"eor_z_zi_\";\n\t\tcase ENC_EOR_Z_ZZ_: return \"eor_z_zz_\";\n\t\tcase ENC_EORBT_Z_ZZ_: return \"eorbt_z_zz_\";\n\t\tcase ENC_EORS_P_P_PP_Z: return \"eors_p_p_pp_z\";\n\t\tcase ENC_EORTB_Z_ZZ_: return \"eortb_z_zz_\";\n\t\tcase ENC_EORV_R_P_Z_: return \"eorv_r_p_z_\";\n\t\tcase ENC_EXT_Z_ZI_CON: return \"ext_z_zi_con\";\n\t\tcase ENC_EXT_Z_ZI_DES: return \"ext_z_zi_des\";\n\t\tcase ENC_FABD_Z_P_ZZ_: return \"fabd_z_p_zz_\";\n\t\tcase ENC_FABS_Z_P_Z_: return \"fabs_z_p_z_\";\n\t\tcase ENC_FACGE_P_P_ZZ_: return \"facge_p_p_zz_\";\n\t\tcase ENC_FACGT_P_P_ZZ_: return \"facgt_p_p_zz_\";\n\t\tcase ENC_FADD_Z_P_ZS_: return \"fadd_z_p_zs_\";\n\t\tcase ENC_FADD_Z_P_ZZ_: return \"fadd_z_p_zz_\";\n\t\tcase ENC_FADD_Z_ZZ_: return \"fadd_z_zz_\";\n\t\tcase ENC_FADDA_V_P_Z_: return \"fadda_v_p_z_\";\n\t\tcase ENC_FADDP_Z_P_ZZ_: return \"faddp_z_p_zz_\";\n\t\tcase ENC_FADDV_V_P_Z_: return \"faddv_v_p_z_\";\n\t\tcase ENC_FCADD_Z_P_ZZ_: return \"fcadd_z_p_zz_\";\n\t\tcase ENC_FCMEQ_P_P_Z0_: return \"fcmeq_p_p_z0_\";\n\t\tcase ENC_FCMEQ_P_P_ZZ_: return \"fcmeq_p_p_zz_\";\n\t\tcase ENC_FCMGE_P_P_Z0_: return \"fcmge_p_p_z0_\";\n\t\tcase ENC_FCMGE_P_P_ZZ_: return \"fcmge_p_p_zz_\";\n\t\tcase ENC_FCMGT_P_P_Z0_: return \"fcmgt_p_p_z0_\";\n\t\tcase ENC_FCMGT_P_P_ZZ_: return \"fcmgt_p_p_zz_\";\n\t\tcase ENC_FCMLA_Z_P_ZZZ_: return \"fcmla_z_p_zzz_\";\n\t\tcase ENC_FCMLA_Z_ZZZI_H: return \"fcmla_z_zzzi_h\";\n\t\tcase ENC_FCMLA_Z_ZZZI_S: return \"fcmla_z_zzzi_s\";\n\t\tcase ENC_FCMLE_P_P_Z0_: return \"fcmle_p_p_z0_\";\n\t\tcase ENC_FCMLT_P_P_Z0_: return \"fcmlt_p_p_z0_\";\n\t\tcase ENC_FCMNE_P_P_Z0_: return \"fcmne_p_p_z0_\";\n\t\tcase ENC_FCMNE_P_P_ZZ_: return \"fcmne_p_p_zz_\";\n\t\tcase ENC_FCMUO_P_P_ZZ_: return \"fcmuo_p_p_zz_\";\n\t\tcase ENC_FCPY_Z_P_I_: return \"fcpy_z_p_i_\";\n\t\tcase ENC_FCVT_Z_P_Z_D2H: return \"fcvt_z_p_z_d2h\";\n\t\tcase ENC_FCVT_Z_P_Z_D2S: return \"fcvt_z_p_z_d2s\";\n\t\tcase ENC_FCVT_Z_P_Z_H2D: return \"fcvt_z_p_z_h2d\";\n\t\tcase ENC_FCVT_Z_P_Z_H2S: return \"fcvt_z_p_z_h2s\";\n\t\tcase ENC_FCVT_Z_P_Z_S2D: return \"fcvt_z_p_z_s2d\";\n\t\tcase ENC_FCVT_Z_P_Z_S2H: return \"fcvt_z_p_z_s2h\";\n\t\tcase ENC_FCVTLT_Z_P_Z_H2S: return \"fcvtlt_z_p_z_h2s\";\n\t\tcase ENC_FCVTLT_Z_P_Z_S2D: return \"fcvtlt_z_p_z_s2d\";\n\t\tcase ENC_FCVTNT_Z_P_Z_D2S: return \"fcvtnt_z_p_z_d2s\";\n\t\tcase ENC_FCVTNT_Z_P_Z_S2H: return \"fcvtnt_z_p_z_s2h\";\n\t\tcase ENC_FCVTX_Z_P_Z_D2S: return \"fcvtx_z_p_z_d2s\";\n\t\tcase ENC_FCVTXNT_Z_P_Z_D2S: return \"fcvtxnt_z_p_z_d2s\";\n\t\tcase ENC_FCVTZS_Z_P_Z_D2W: return \"fcvtzs_z_p_z_d2w\";\n\t\tcase ENC_FCVTZS_Z_P_Z_D2X: return \"fcvtzs_z_p_z_d2x\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162H: return \"fcvtzs_z_p_z_fp162h\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162W: return \"fcvtzs_z_p_z_fp162w\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162X: return \"fcvtzs_z_p_z_fp162x\";\n\t\tcase ENC_FCVTZS_Z_P_Z_S2W: return \"fcvtzs_z_p_z_s2w\";\n\t\tcase ENC_FCVTZS_Z_P_Z_S2X: return \"fcvtzs_z_p_z_s2x\";\n\t\tcase ENC_FCVTZU_Z_P_Z_D2W: return \"fcvtzu_z_p_z_d2w\";\n\t\tcase ENC_FCVTZU_Z_P_Z_D2X: return \"fcvtzu_z_p_z_d2x\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162H: return \"fcvtzu_z_p_z_fp162h\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162W: return \"fcvtzu_z_p_z_fp162w\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162X: return \"fcvtzu_z_p_z_fp162x\";\n\t\tcase ENC_FCVTZU_Z_P_Z_S2W: return \"fcvtzu_z_p_z_s2w\";\n\t\tcase ENC_FCVTZU_Z_P_Z_S2X: return \"fcvtzu_z_p_z_s2x\";\n\t\tcase ENC_FDIV_Z_P_ZZ_: return \"fdiv_z_p_zz_\";\n\t\tcase ENC_FDIVR_Z_P_ZZ_: return \"fdivr_z_p_zz_\";\n\t\tcase ENC_FDUP_Z_I_: return \"fdup_z_i_\";\n\t\tcase ENC_FEXPA_Z_Z_: return \"fexpa_z_z_\";\n\t\tcase ENC_FLOGB_Z_P_Z_: return \"flogb_z_p_z_\";\n\t\tcase ENC_FMAD_Z_P_ZZZ_: return \"fmad_z_p_zzz_\";\n\t\tcase ENC_FMAX_Z_P_ZS_: return \"fmax_z_p_zs_\";\n\t\tcase ENC_FMAX_Z_P_ZZ_: return \"fmax_z_p_zz_\";\n\t\tcase ENC_FMAXNM_Z_P_ZS_: return \"fmaxnm_z_p_zs_\";\n\t\tcase ENC_FMAXNM_Z_P_ZZ_: return \"fmaxnm_z_p_zz_\";\n\t\tcase ENC_FMAXNMP_Z_P_ZZ_: return \"fmaxnmp_z_p_zz_\";\n\t\tcase ENC_FMAXNMV_V_P_Z_: return \"fmaxnmv_v_p_z_\";\n\t\tcase ENC_FMAXP_Z_P_ZZ_: return \"fmaxp_z_p_zz_\";\n\t\tcase ENC_FMAXV_V_P_Z_: return \"fmaxv_v_p_z_\";\n\t\tcase ENC_FMIN_Z_P_ZS_: return \"fmin_z_p_zs_\";\n\t\tcase ENC_FMIN_Z_P_ZZ_: return \"fmin_z_p_zz_\";\n\t\tcase ENC_FMINNM_Z_P_ZS_: return \"fminnm_z_p_zs_\";\n\t\tcase ENC_FMINNM_Z_P_ZZ_: return \"fminnm_z_p_zz_\";\n\t\tcase ENC_FMINNMP_Z_P_ZZ_: return \"fminnmp_z_p_zz_\";\n\t\tcase ENC_FMINNMV_V_P_Z_: return \"fminnmv_v_p_z_\";\n\t\tcase ENC_FMINP_Z_P_ZZ_: return \"fminp_z_p_zz_\";\n\t\tcase ENC_FMINV_V_P_Z_: return \"fminv_v_p_z_\";\n\t\tcase ENC_FMLA_Z_P_ZZZ_: return \"fmla_z_p_zzz_\";\n\t\tcase ENC_FMLA_Z_ZZZI_D: return \"fmla_z_zzzi_d\";\n\t\tcase ENC_FMLA_Z_ZZZI_H: return \"fmla_z_zzzi_h\";\n\t\tcase ENC_FMLA_Z_ZZZI_S: return \"fmla_z_zzzi_s\";\n\t\tcase ENC_FMLALB_Z_ZZZ_: return \"fmlalb_z_zzz_\";\n\t\tcase ENC_FMLALB_Z_ZZZI_S: return \"fmlalb_z_zzzi_s\";\n\t\tcase ENC_FMLALT_Z_ZZZ_: return \"fmlalt_z_zzz_\";\n\t\tcase ENC_FMLALT_Z_ZZZI_S: return \"fmlalt_z_zzzi_s\";\n\t\tcase ENC_FMLS_Z_P_ZZZ_: return \"fmls_z_p_zzz_\";\n\t\tcase ENC_FMLS_Z_ZZZI_D: return \"fmls_z_zzzi_d\";\n\t\tcase ENC_FMLS_Z_ZZZI_H: return \"fmls_z_zzzi_h\";\n\t\tcase ENC_FMLS_Z_ZZZI_S: return \"fmls_z_zzzi_s\";\n\t\tcase ENC_FMLSLB_Z_ZZZ_: return \"fmlslb_z_zzz_\";\n\t\tcase ENC_FMLSLB_Z_ZZZI_S: return \"fmlslb_z_zzzi_s\";\n\t\tcase ENC_FMLSLT_Z_ZZZ_: return \"fmlslt_z_zzz_\";\n\t\tcase ENC_FMLSLT_Z_ZZZI_S: return \"fmlslt_z_zzzi_s\";\n\t\tcase ENC_FMMLA_Z_ZZZ_D: return \"fmmla_z_zzz_d\";\n\t\tcase ENC_FMMLA_Z_ZZZ_S: return \"fmmla_z_zzz_s\";\n\t\tcase ENC_FMOPA_ZA32_PP_ZZ_16: return \"fmopa_za32_pp_zz_16\";\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_32: return \"fmopa_za_pp_zz_32\";\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_64: return \"fmopa_za_pp_zz_64\";\n\t\tcase ENC_FMOPS_ZA32_PP_ZZ_16: return \"fmops_za32_pp_zz_16\";\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_32: return \"fmops_za_pp_zz_32\";\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_64: return \"fmops_za_pp_zz_64\";\n\t\tcase ENC_FMSB_Z_P_ZZZ_: return \"fmsb_z_p_zzz_\";\n\t\tcase ENC_FMUL_Z_P_ZS_: return \"fmul_z_p_zs_\";\n\t\tcase ENC_FMUL_Z_P_ZZ_: return \"fmul_z_p_zz_\";\n\t\tcase ENC_FMUL_Z_ZZ_: return \"fmul_z_zz_\";\n\t\tcase ENC_FMUL_Z_ZZI_D: return \"fmul_z_zzi_d\";\n\t\tcase ENC_FMUL_Z_ZZI_H: return \"fmul_z_zzi_h\";\n\t\tcase ENC_FMUL_Z_ZZI_S: return \"fmul_z_zzi_s\";\n\t\tcase ENC_FMULX_Z_P_ZZ_: return \"fmulx_z_p_zz_\";\n\t\tcase ENC_FNEG_Z_P_Z_: return \"fneg_z_p_z_\";\n\t\tcase ENC_FNMAD_Z_P_ZZZ_: return \"fnmad_z_p_zzz_\";\n\t\tcase ENC_FNMLA_Z_P_ZZZ_: return \"fnmla_z_p_zzz_\";\n\t\tcase ENC_FNMLS_Z_P_ZZZ_: return \"fnmls_z_p_zzz_\";\n\t\tcase ENC_FNMSB_Z_P_ZZZ_: return \"fnmsb_z_p_zzz_\";\n\t\tcase ENC_FRECPE_Z_Z_: return \"frecpe_z_z_\";\n\t\tcase ENC_FRECPS_Z_ZZ_: return \"frecps_z_zz_\";\n\t\tcase ENC_FRECPX_Z_P_Z_: return \"frecpx_z_p_z_\";\n\t\tcase ENC_FRINTA_Z_P_Z_: return \"frinta_z_p_z_\";\n\t\tcase ENC_FRINTI_Z_P_Z_: return \"frinti_z_p_z_\";\n\t\tcase ENC_FRINTM_Z_P_Z_: return \"frintm_z_p_z_\";\n\t\tcase ENC_FRINTN_Z_P_Z_: return \"frintn_z_p_z_\";\n\t\tcase ENC_FRINTP_Z_P_Z_: return \"frintp_z_p_z_\";\n\t\tcase ENC_FRINTX_Z_P_Z_: return \"frintx_z_p_z_\";\n\t\tcase ENC_FRINTZ_Z_P_Z_: return \"frintz_z_p_z_\";\n\t\tcase ENC_FRSQRTE_Z_Z_: return \"frsqrte_z_z_\";\n\t\tcase ENC_FRSQRTS_Z_ZZ_: return \"frsqrts_z_zz_\";\n\t\tcase ENC_FSCALE_Z_P_ZZ_: return \"fscale_z_p_zz_\";\n\t\tcase ENC_FSQRT_Z_P_Z_: return \"fsqrt_z_p_z_\";\n\t\tcase ENC_FSUB_Z_P_ZS_: return \"fsub_z_p_zs_\";\n\t\tcase ENC_FSUB_Z_P_ZZ_: return \"fsub_z_p_zz_\";\n\t\tcase ENC_FSUB_Z_ZZ_: return \"fsub_z_zz_\";\n\t\tcase ENC_FSUBR_Z_P_ZS_: return \"fsubr_z_p_zs_\";\n\t\tcase ENC_FSUBR_Z_P_ZZ_: return \"fsubr_z_p_zz_\";\n\t\tcase ENC_FTMAD_Z_ZZI_: return \"ftmad_z_zzi_\";\n\t\tcase ENC_FTSMUL_Z_ZZ_: return \"ftsmul_z_zz_\";\n\t\tcase ENC_FTSSEL_Z_ZZ_: return \"ftssel_z_zz_\";\n\t\tcase ENC_HISTCNT_Z_P_ZZ_: return \"histcnt_z_p_zz_\";\n\t\tcase ENC_HISTSEG_Z_ZZ_: return \"histseg_z_zz_\";\n\t\tcase ENC_INCB_R_RS_: return \"incb_r_rs_\";\n\t\tcase ENC_INCD_R_RS_: return \"incd_r_rs_\";\n\t\tcase ENC_INCD_Z_ZS_: return \"incd_z_zs_\";\n\t\tcase ENC_INCH_R_RS_: return \"inch_r_rs_\";\n\t\tcase ENC_INCH_Z_ZS_: return \"inch_z_zs_\";\n\t\tcase ENC_INCP_R_P_R_: return \"incp_r_p_r_\";\n\t\tcase ENC_INCP_Z_P_Z_: return \"incp_z_p_z_\";\n\t\tcase ENC_INCW_R_RS_: return \"incw_r_rs_\";\n\t\tcase ENC_INCW_Z_ZS_: return \"incw_z_zs_\";\n\t\tcase ENC_INDEX_Z_II_: return \"index_z_ii_\";\n\t\tcase ENC_INDEX_Z_IR_: return \"index_z_ir_\";\n\t\tcase ENC_INDEX_Z_RI_: return \"index_z_ri_\";\n\t\tcase ENC_INDEX_Z_RR_: return \"index_z_rr_\";\n\t\tcase ENC_INSR_Z_R_: return \"insr_z_r_\";\n\t\tcase ENC_INSR_Z_V_: return \"insr_z_v_\";\n\t\tcase ENC_LASTA_R_P_Z_: return \"lasta_r_p_z_\";\n\t\tcase ENC_LASTA_V_P_Z_: return \"lasta_v_p_z_\";\n\t\tcase ENC_LASTB_R_P_Z_: return \"lastb_r_p_z_\";\n\t\tcase ENC_LASTB_V_P_Z_: return \"lastb_v_p_z_\";\n\t\tcase ENC_LD1B_Z_P_AI_D: return \"ld1b_z_p_ai_d\";\n\t\tcase ENC_LD1B_Z_P_AI_S: return \"ld1b_z_p_ai_s\";\n\t\tcase ENC_LD1B_Z_P_BI_U16: return \"ld1b_z_p_bi_u16\";\n\t\tcase ENC_LD1B_Z_P_BI_U32: return \"ld1b_z_p_bi_u32\";\n\t\tcase ENC_LD1B_Z_P_BI_U64: return \"ld1b_z_p_bi_u64\";\n\t\tcase ENC_LD1B_Z_P_BI_U8: return \"ld1b_z_p_bi_u8\";\n\t\tcase ENC_LD1B_Z_P_BR_U16: return \"ld1b_z_p_br_u16\";\n\t\tcase ENC_LD1B_Z_P_BR_U32: return \"ld1b_z_p_br_u32\";\n\t\tcase ENC_LD1B_Z_P_BR_U64: return \"ld1b_z_p_br_u64\";\n\t\tcase ENC_LD1B_Z_P_BR_U8: return \"ld1b_z_p_br_u8\";\n\t\tcase ENC_LD1B_Z_P_BZ_D_64_UNSCALED: return \"ld1b_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1B_Z_P_BZ_D_X32_UNSCALED: return \"ld1b_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1B_Z_P_BZ_S_X32_UNSCALED: return \"ld1b_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LD1B_ZA_P_RRR_: return \"ld1b_za_p_rrr_\";\n\t\tcase ENC_LD1D_Z_P_AI_D: return \"ld1d_z_p_ai_d\";\n\t\tcase ENC_LD1D_Z_P_BI_U64: return \"ld1d_z_p_bi_u64\";\n\t\tcase ENC_LD1D_Z_P_BR_U64: return \"ld1d_z_p_br_u64\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_SCALED: return \"ld1d_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_UNSCALED: return \"ld1d_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_SCALED: return \"ld1d_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_UNSCALED: return \"ld1d_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1D_ZA_P_RRR_: return \"ld1d_za_p_rrr_\";\n\t\tcase ENC_LD1H_Z_P_AI_D: return \"ld1h_z_p_ai_d\";\n\t\tcase ENC_LD1H_Z_P_AI_S: return \"ld1h_z_p_ai_s\";\n\t\tcase ENC_LD1H_Z_P_BI_U16: return \"ld1h_z_p_bi_u16\";\n\t\tcase ENC_LD1H_Z_P_BI_U32: return \"ld1h_z_p_bi_u32\";\n\t\tcase ENC_LD1H_Z_P_BI_U64: return \"ld1h_z_p_bi_u64\";\n\t\tcase ENC_LD1H_Z_P_BR_U16: return \"ld1h_z_p_br_u16\";\n\t\tcase ENC_LD1H_Z_P_BR_U32: return \"ld1h_z_p_br_u32\";\n\t\tcase ENC_LD1H_Z_P_BR_U64: return \"ld1h_z_p_br_u64\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_SCALED: return \"ld1h_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_UNSCALED: return \"ld1h_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_SCALED: return \"ld1h_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_UNSCALED: return \"ld1h_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_SCALED: return \"ld1h_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_UNSCALED: return \"ld1h_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LD1H_ZA_P_RRR_: return \"ld1h_za_p_rrr_\";\n\t\tcase ENC_LD1Q_ZA_P_RRR_: return \"ld1q_za_p_rrr_\";\n\t\tcase ENC_LD1RB_Z_P_BI_U16: return \"ld1rb_z_p_bi_u16\";\n\t\tcase ENC_LD1RB_Z_P_BI_U32: return \"ld1rb_z_p_bi_u32\";\n\t\tcase ENC_LD1RB_Z_P_BI_U64: return \"ld1rb_z_p_bi_u64\";\n\t\tcase ENC_LD1RB_Z_P_BI_U8: return \"ld1rb_z_p_bi_u8\";\n\t\tcase ENC_LD1RD_Z_P_BI_U64: return \"ld1rd_z_p_bi_u64\";\n\t\tcase ENC_LD1RH_Z_P_BI_U16: return \"ld1rh_z_p_bi_u16\";\n\t\tcase ENC_LD1RH_Z_P_BI_U32: return \"ld1rh_z_p_bi_u32\";\n\t\tcase ENC_LD1RH_Z_P_BI_U64: return \"ld1rh_z_p_bi_u64\";\n\t\tcase ENC_LD1ROB_Z_P_BI_U8: return \"ld1rob_z_p_bi_u8\";\n\t\tcase ENC_LD1ROB_Z_P_BR_CONTIGUOUS: return \"ld1rob_z_p_br_contiguous\";\n\t\tcase ENC_LD1ROD_Z_P_BI_U64: return \"ld1rod_z_p_bi_u64\";\n\t\tcase ENC_LD1ROD_Z_P_BR_CONTIGUOUS: return \"ld1rod_z_p_br_contiguous\";\n\t\tcase ENC_LD1ROH_Z_P_BI_U16: return \"ld1roh_z_p_bi_u16\";\n\t\tcase ENC_LD1ROH_Z_P_BR_CONTIGUOUS: return \"ld1roh_z_p_br_contiguous\";\n\t\tcase ENC_LD1ROW_Z_P_BI_U32: return \"ld1row_z_p_bi_u32\";\n\t\tcase ENC_LD1ROW_Z_P_BR_CONTIGUOUS: return \"ld1row_z_p_br_contiguous\";\n\t\tcase ENC_LD1RQB_Z_P_BI_U8: return \"ld1rqb_z_p_bi_u8\";\n\t\tcase ENC_LD1RQB_Z_P_BR_CONTIGUOUS: return \"ld1rqb_z_p_br_contiguous\";\n\t\tcase ENC_LD1RQD_Z_P_BI_U64: return \"ld1rqd_z_p_bi_u64\";\n\t\tcase ENC_LD1RQD_Z_P_BR_CONTIGUOUS: return \"ld1rqd_z_p_br_contiguous\";\n\t\tcase ENC_LD1RQH_Z_P_BI_U16: return \"ld1rqh_z_p_bi_u16\";\n\t\tcase ENC_LD1RQH_Z_P_BR_CONTIGUOUS: return \"ld1rqh_z_p_br_contiguous\";\n\t\tcase ENC_LD1RQW_Z_P_BI_U32: return \"ld1rqw_z_p_bi_u32\";\n\t\tcase ENC_LD1RQW_Z_P_BR_CONTIGUOUS: return \"ld1rqw_z_p_br_contiguous\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S16: return \"ld1rsb_z_p_bi_s16\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S32: return \"ld1rsb_z_p_bi_s32\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S64: return \"ld1rsb_z_p_bi_s64\";\n\t\tcase ENC_LD1RSH_Z_P_BI_S32: return \"ld1rsh_z_p_bi_s32\";\n\t\tcase ENC_LD1RSH_Z_P_BI_S64: return \"ld1rsh_z_p_bi_s64\";\n\t\tcase ENC_LD1RSW_Z_P_BI_S64: return \"ld1rsw_z_p_bi_s64\";\n\t\tcase ENC_LD1RW_Z_P_BI_U32: return \"ld1rw_z_p_bi_u32\";\n\t\tcase ENC_LD1RW_Z_P_BI_U64: return \"ld1rw_z_p_bi_u64\";\n\t\tcase ENC_LD1SB_Z_P_AI_D: return \"ld1sb_z_p_ai_d\";\n\t\tcase ENC_LD1SB_Z_P_AI_S: return \"ld1sb_z_p_ai_s\";\n\t\tcase ENC_LD1SB_Z_P_BI_S16: return \"ld1sb_z_p_bi_s16\";\n\t\tcase ENC_LD1SB_Z_P_BI_S32: return \"ld1sb_z_p_bi_s32\";\n\t\tcase ENC_LD1SB_Z_P_BI_S64: return \"ld1sb_z_p_bi_s64\";\n\t\tcase ENC_LD1SB_Z_P_BR_S16: return \"ld1sb_z_p_br_s16\";\n\t\tcase ENC_LD1SB_Z_P_BR_S32: return \"ld1sb_z_p_br_s32\";\n\t\tcase ENC_LD1SB_Z_P_BR_S64: return \"ld1sb_z_p_br_s64\";\n\t\tcase ENC_LD1SB_Z_P_BZ_D_64_UNSCALED: return \"ld1sb_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED: return \"ld1sb_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED: return \"ld1sb_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LD1SH_Z_P_AI_D: return \"ld1sh_z_p_ai_d\";\n\t\tcase ENC_LD1SH_Z_P_AI_S: return \"ld1sh_z_p_ai_s\";\n\t\tcase ENC_LD1SH_Z_P_BI_S32: return \"ld1sh_z_p_bi_s32\";\n\t\tcase ENC_LD1SH_Z_P_BI_S64: return \"ld1sh_z_p_bi_s64\";\n\t\tcase ENC_LD1SH_Z_P_BR_S32: return \"ld1sh_z_p_br_s32\";\n\t\tcase ENC_LD1SH_Z_P_BR_S64: return \"ld1sh_z_p_br_s64\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_SCALED: return \"ld1sh_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_UNSCALED: return \"ld1sh_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_SCALED: return \"ld1sh_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED: return \"ld1sh_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_SCALED: return \"ld1sh_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED: return \"ld1sh_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LD1SW_Z_P_AI_D: return \"ld1sw_z_p_ai_d\";\n\t\tcase ENC_LD1SW_Z_P_BI_S64: return \"ld1sw_z_p_bi_s64\";\n\t\tcase ENC_LD1SW_Z_P_BR_S64: return \"ld1sw_z_p_br_s64\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_SCALED: return \"ld1sw_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_UNSCALED: return \"ld1sw_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_SCALED: return \"ld1sw_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED: return \"ld1sw_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1W_Z_P_AI_D: return \"ld1w_z_p_ai_d\";\n\t\tcase ENC_LD1W_Z_P_AI_S: return \"ld1w_z_p_ai_s\";\n\t\tcase ENC_LD1W_Z_P_BI_U32: return \"ld1w_z_p_bi_u32\";\n\t\tcase ENC_LD1W_Z_P_BI_U64: return \"ld1w_z_p_bi_u64\";\n\t\tcase ENC_LD1W_Z_P_BR_U32: return \"ld1w_z_p_br_u32\";\n\t\tcase ENC_LD1W_Z_P_BR_U64: return \"ld1w_z_p_br_u64\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_SCALED: return \"ld1w_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_UNSCALED: return \"ld1w_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_SCALED: return \"ld1w_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_UNSCALED: return \"ld1w_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_SCALED: return \"ld1w_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_UNSCALED: return \"ld1w_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LD1W_ZA_P_RRR_: return \"ld1w_za_p_rrr_\";\n\t\tcase ENC_LD2B_Z_P_BI_CONTIGUOUS: return \"ld2b_z_p_bi_contiguous\";\n\t\tcase ENC_LD2B_Z_P_BR_CONTIGUOUS: return \"ld2b_z_p_br_contiguous\";\n\t\tcase ENC_LD2D_Z_P_BI_CONTIGUOUS: return \"ld2d_z_p_bi_contiguous\";\n\t\tcase ENC_LD2D_Z_P_BR_CONTIGUOUS: return \"ld2d_z_p_br_contiguous\";\n\t\tcase ENC_LD2H_Z_P_BI_CONTIGUOUS: return \"ld2h_z_p_bi_contiguous\";\n\t\tcase ENC_LD2H_Z_P_BR_CONTIGUOUS: return \"ld2h_z_p_br_contiguous\";\n\t\tcase ENC_LD2W_Z_P_BI_CONTIGUOUS: return \"ld2w_z_p_bi_contiguous\";\n\t\tcase ENC_LD2W_Z_P_BR_CONTIGUOUS: return \"ld2w_z_p_br_contiguous\";\n\t\tcase ENC_LD3B_Z_P_BI_CONTIGUOUS: return \"ld3b_z_p_bi_contiguous\";\n\t\tcase ENC_LD3B_Z_P_BR_CONTIGUOUS: return \"ld3b_z_p_br_contiguous\";\n\t\tcase ENC_LD3D_Z_P_BI_CONTIGUOUS: return \"ld3d_z_p_bi_contiguous\";\n\t\tcase ENC_LD3D_Z_P_BR_CONTIGUOUS: return \"ld3d_z_p_br_contiguous\";\n\t\tcase ENC_LD3H_Z_P_BI_CONTIGUOUS: return \"ld3h_z_p_bi_contiguous\";\n\t\tcase ENC_LD3H_Z_P_BR_CONTIGUOUS: return \"ld3h_z_p_br_contiguous\";\n\t\tcase ENC_LD3W_Z_P_BI_CONTIGUOUS: return \"ld3w_z_p_bi_contiguous\";\n\t\tcase ENC_LD3W_Z_P_BR_CONTIGUOUS: return \"ld3w_z_p_br_contiguous\";\n\t\tcase ENC_LD4B_Z_P_BI_CONTIGUOUS: return \"ld4b_z_p_bi_contiguous\";\n\t\tcase ENC_LD4B_Z_P_BR_CONTIGUOUS: return \"ld4b_z_p_br_contiguous\";\n\t\tcase ENC_LD4D_Z_P_BI_CONTIGUOUS: return \"ld4d_z_p_bi_contiguous\";\n\t\tcase ENC_LD4D_Z_P_BR_CONTIGUOUS: return \"ld4d_z_p_br_contiguous\";\n\t\tcase ENC_LD4H_Z_P_BI_CONTIGUOUS: return \"ld4h_z_p_bi_contiguous\";\n\t\tcase ENC_LD4H_Z_P_BR_CONTIGUOUS: return \"ld4h_z_p_br_contiguous\";\n\t\tcase ENC_LD4W_Z_P_BI_CONTIGUOUS: return \"ld4w_z_p_bi_contiguous\";\n\t\tcase ENC_LD4W_Z_P_BR_CONTIGUOUS: return \"ld4w_z_p_br_contiguous\";\n\t\tcase ENC_LDFF1B_Z_P_AI_D: return \"ldff1b_z_p_ai_d\";\n\t\tcase ENC_LDFF1B_Z_P_AI_S: return \"ldff1b_z_p_ai_s\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U16: return \"ldff1b_z_p_br_u16\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U32: return \"ldff1b_z_p_br_u32\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U64: return \"ldff1b_z_p_br_u64\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U8: return \"ldff1b_z_p_br_u8\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED: return \"ldff1b_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED: return \"ldff1b_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED: return \"ldff1b_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LDFF1D_Z_P_AI_D: return \"ldff1d_z_p_ai_d\";\n\t\tcase ENC_LDFF1D_Z_P_BR_U64: return \"ldff1d_z_p_br_u64\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_SCALED: return \"ldff1d_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED: return \"ldff1d_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_SCALED: return \"ldff1d_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED: return \"ldff1d_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1H_Z_P_AI_D: return \"ldff1h_z_p_ai_d\";\n\t\tcase ENC_LDFF1H_Z_P_AI_S: return \"ldff1h_z_p_ai_s\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U16: return \"ldff1h_z_p_br_u16\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U32: return \"ldff1h_z_p_br_u32\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U64: return \"ldff1h_z_p_br_u64\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_SCALED: return \"ldff1h_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED: return \"ldff1h_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_SCALED: return \"ldff1h_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED: return \"ldff1h_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_SCALED: return \"ldff1h_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED: return \"ldff1h_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LDFF1SB_Z_P_AI_D: return \"ldff1sb_z_p_ai_d\";\n\t\tcase ENC_LDFF1SB_Z_P_AI_S: return \"ldff1sb_z_p_ai_s\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S16: return \"ldff1sb_z_p_br_s16\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S32: return \"ldff1sb_z_p_br_s32\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S64: return \"ldff1sb_z_p_br_s64\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED: return \"ldff1sb_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sb_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED: return \"ldff1sb_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LDFF1SH_Z_P_AI_D: return \"ldff1sh_z_p_ai_d\";\n\t\tcase ENC_LDFF1SH_Z_P_AI_S: return \"ldff1sh_z_p_ai_s\";\n\t\tcase ENC_LDFF1SH_Z_P_BR_S32: return \"ldff1sh_z_p_br_s32\";\n\t\tcase ENC_LDFF1SH_Z_P_BR_S64: return \"ldff1sh_z_p_br_s64\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_SCALED: return \"ldff1sh_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED: return \"ldff1sh_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED: return \"ldff1sh_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sh_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED: return \"ldff1sh_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED: return \"ldff1sh_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LDFF1SW_Z_P_AI_D: return \"ldff1sw_z_p_ai_d\";\n\t\tcase ENC_LDFF1SW_Z_P_BR_S64: return \"ldff1sw_z_p_br_s64\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_SCALED: return \"ldff1sw_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED: return \"ldff1sw_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED: return \"ldff1sw_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sw_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1W_Z_P_AI_D: return \"ldff1w_z_p_ai_d\";\n\t\tcase ENC_LDFF1W_Z_P_AI_S: return \"ldff1w_z_p_ai_s\";\n\t\tcase ENC_LDFF1W_Z_P_BR_U32: return \"ldff1w_z_p_br_u32\";\n\t\tcase ENC_LDFF1W_Z_P_BR_U64: return \"ldff1w_z_p_br_u64\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_SCALED: return \"ldff1w_z_p_bz_d_64_scaled\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED: return \"ldff1w_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_SCALED: return \"ldff1w_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED: return \"ldff1w_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_SCALED: return \"ldff1w_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED: return \"ldff1w_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U16: return \"ldnf1b_z_p_bi_u16\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U32: return \"ldnf1b_z_p_bi_u32\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U64: return \"ldnf1b_z_p_bi_u64\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U8: return \"ldnf1b_z_p_bi_u8\";\n\t\tcase ENC_LDNF1D_Z_P_BI_U64: return \"ldnf1d_z_p_bi_u64\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U16: return \"ldnf1h_z_p_bi_u16\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U32: return \"ldnf1h_z_p_bi_u32\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U64: return \"ldnf1h_z_p_bi_u64\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S16: return \"ldnf1sb_z_p_bi_s16\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S32: return \"ldnf1sb_z_p_bi_s32\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S64: return \"ldnf1sb_z_p_bi_s64\";\n\t\tcase ENC_LDNF1SH_Z_P_BI_S32: return \"ldnf1sh_z_p_bi_s32\";\n\t\tcase ENC_LDNF1SH_Z_P_BI_S64: return \"ldnf1sh_z_p_bi_s64\";\n\t\tcase ENC_LDNF1SW_Z_P_BI_S64: return \"ldnf1sw_z_p_bi_s64\";\n\t\tcase ENC_LDNF1W_Z_P_BI_U32: return \"ldnf1w_z_p_bi_u32\";\n\t\tcase ENC_LDNF1W_Z_P_BI_U64: return \"ldnf1w_z_p_bi_u64\";\n\t\tcase ENC_LDNT1B_Z_P_AR_D_64_UNSCALED: return \"ldnt1b_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED: return \"ldnt1b_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_LDNT1B_Z_P_BI_CONTIGUOUS: return \"ldnt1b_z_p_bi_contiguous\";\n\t\tcase ENC_LDNT1B_Z_P_BR_CONTIGUOUS: return \"ldnt1b_z_p_br_contiguous\";\n\t\tcase ENC_LDNT1D_Z_P_AR_D_64_UNSCALED: return \"ldnt1d_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1D_Z_P_BI_CONTIGUOUS: return \"ldnt1d_z_p_bi_contiguous\";\n\t\tcase ENC_LDNT1D_Z_P_BR_CONTIGUOUS: return \"ldnt1d_z_p_br_contiguous\";\n\t\tcase ENC_LDNT1H_Z_P_AR_D_64_UNSCALED: return \"ldnt1h_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED: return \"ldnt1h_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_LDNT1H_Z_P_BI_CONTIGUOUS: return \"ldnt1h_z_p_bi_contiguous\";\n\t\tcase ENC_LDNT1H_Z_P_BR_CONTIGUOUS: return \"ldnt1h_z_p_br_contiguous\";\n\t\tcase ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED: return \"ldnt1sb_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED: return \"ldnt1sb_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED: return \"ldnt1sh_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED: return \"ldnt1sh_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED: return \"ldnt1sw_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1W_Z_P_AR_D_64_UNSCALED: return \"ldnt1w_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED: return \"ldnt1w_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_LDNT1W_Z_P_BI_CONTIGUOUS: return \"ldnt1w_z_p_bi_contiguous\";\n\t\tcase ENC_LDNT1W_Z_P_BR_CONTIGUOUS: return \"ldnt1w_z_p_br_contiguous\";\n\t\tcase ENC_LDR_P_BI_: return \"ldr_p_bi_\";\n\t\tcase ENC_LDR_Z_BI_: return \"ldr_z_bi_\";\n\t\tcase ENC_LDR_ZA_RI_: return \"ldr_za_ri_\";\n\t\tcase ENC_LSL_Z_P_ZI_: return \"lsl_z_p_zi_\";\n\t\tcase ENC_LSL_Z_P_ZW_: return \"lsl_z_p_zw_\";\n\t\tcase ENC_LSL_Z_P_ZZ_: return \"lsl_z_p_zz_\";\n\t\tcase ENC_LSL_Z_ZI_: return \"lsl_z_zi_\";\n\t\tcase ENC_LSL_Z_ZW_: return \"lsl_z_zw_\";\n\t\tcase ENC_LSLR_Z_P_ZZ_: return \"lslr_z_p_zz_\";\n\t\tcase ENC_LSR_Z_P_ZI_: return \"lsr_z_p_zi_\";\n\t\tcase ENC_LSR_Z_P_ZW_: return \"lsr_z_p_zw_\";\n\t\tcase ENC_LSR_Z_P_ZZ_: return \"lsr_z_p_zz_\";\n\t\tcase ENC_LSR_Z_ZI_: return \"lsr_z_zi_\";\n\t\tcase ENC_LSR_Z_ZW_: return \"lsr_z_zw_\";\n\t\tcase ENC_LSRR_Z_P_ZZ_: return \"lsrr_z_p_zz_\";\n\t\tcase ENC_MAD_Z_P_ZZZ_: return \"mad_z_p_zzz_\";\n\t\tcase ENC_MATCH_P_P_ZZ_: return \"match_p_p_zz_\";\n\t\tcase ENC_MLA_Z_P_ZZZ_: return \"mla_z_p_zzz_\";\n\t\tcase ENC_MLA_Z_ZZZI_D: return \"mla_z_zzzi_d\";\n\t\tcase ENC_MLA_Z_ZZZI_H: return \"mla_z_zzzi_h\";\n\t\tcase ENC_MLA_Z_ZZZI_S: return \"mla_z_zzzi_s\";\n\t\tcase ENC_MLS_Z_P_ZZZ_: return \"mls_z_p_zzz_\";\n\t\tcase ENC_MLS_Z_ZZZI_D: return \"mls_z_zzzi_d\";\n\t\tcase ENC_MLS_Z_ZZZI_H: return \"mls_z_zzzi_h\";\n\t\tcase ENC_MLS_Z_ZZZI_S: return \"mls_z_zzzi_s\";\n\t\tcase ENC_MOVA_Z_P_RZA_B: return \"mova_z_p_rza_b\";\n\t\tcase ENC_MOVA_Z_P_RZA_D: return \"mova_z_p_rza_d\";\n\t\tcase ENC_MOVA_Z_P_RZA_H: return \"mova_z_p_rza_h\";\n\t\tcase ENC_MOVA_Z_P_RZA_Q: return \"mova_z_p_rza_q\";\n\t\tcase ENC_MOVA_Z_P_RZA_W: return \"mova_z_p_rza_w\";\n\t\tcase ENC_MOVA_ZA_P_RZ_B: return \"mova_za_p_rz_b\";\n\t\tcase ENC_MOVA_ZA_P_RZ_D: return \"mova_za_p_rz_d\";\n\t\tcase ENC_MOVA_ZA_P_RZ_H: return \"mova_za_p_rz_h\";\n\t\tcase ENC_MOVA_ZA_P_RZ_Q: return \"mova_za_p_rz_q\";\n\t\tcase ENC_MOVA_ZA_P_RZ_W: return \"mova_za_p_rz_w\";\n\t\tcase ENC_MOVPRFX_Z_P_Z_: return \"movprfx_z_p_z_\";\n\t\tcase ENC_MOVPRFX_Z_Z_: return \"movprfx_z_z_\";\n\t\tcase ENC_MSB_Z_P_ZZZ_: return \"msb_z_p_zzz_\";\n\t\tcase ENC_MUL_Z_P_ZZ_: return \"mul_z_p_zz_\";\n\t\tcase ENC_MUL_Z_ZI_: return \"mul_z_zi_\";\n\t\tcase ENC_MUL_Z_ZZ_: return \"mul_z_zz_\";\n\t\tcase ENC_MUL_Z_ZZI_D: return \"mul_z_zzi_d\";\n\t\tcase ENC_MUL_Z_ZZI_H: return \"mul_z_zzi_h\";\n\t\tcase ENC_MUL_Z_ZZI_S: return \"mul_z_zzi_s\";\n\t\tcase ENC_NAND_P_P_PP_Z: return \"nand_p_p_pp_z\";\n\t\tcase ENC_NANDS_P_P_PP_Z: return \"nands_p_p_pp_z\";\n\t\tcase ENC_NBSL_Z_ZZZ_: return \"nbsl_z_zzz_\";\n\t\tcase ENC_NEG_Z_P_Z_: return \"neg_z_p_z_\";\n\t\tcase ENC_NMATCH_P_P_ZZ_: return \"nmatch_p_p_zz_\";\n\t\tcase ENC_NOR_P_P_PP_Z: return \"nor_p_p_pp_z\";\n\t\tcase ENC_NORS_P_P_PP_Z: return \"nors_p_p_pp_z\";\n\t\tcase ENC_NOT_Z_P_Z_: return \"not_z_p_z_\";\n\t\tcase ENC_ORN_P_P_PP_Z: return \"orn_p_p_pp_z\";\n\t\tcase ENC_ORNS_P_P_PP_Z: return \"orns_p_p_pp_z\";\n\t\tcase ENC_ORR_P_P_PP_Z: return \"orr_p_p_pp_z\";\n\t\tcase ENC_ORR_Z_P_ZZ_: return \"orr_z_p_zz_\";\n\t\tcase ENC_ORR_Z_ZI_: return \"orr_z_zi_\";\n\t\tcase ENC_ORR_Z_ZZ_: return \"orr_z_zz_\";\n\t\tcase ENC_ORRS_P_P_PP_Z: return \"orrs_p_p_pp_z\";\n\t\tcase ENC_ORV_R_P_Z_: return \"orv_r_p_z_\";\n\t\tcase ENC_PFALSE_P_: return \"pfalse_p_\";\n\t\tcase ENC_PFIRST_P_P_P_: return \"pfirst_p_p_p_\";\n\t\tcase ENC_PMUL_Z_ZZ_: return \"pmul_z_zz_\";\n\t\tcase ENC_PMULLB_Z_ZZ_: return \"pmullb_z_zz_\";\n\t\tcase ENC_PMULLT_Z_ZZ_: return \"pmullt_z_zz_\";\n\t\tcase ENC_PNEXT_P_P_P_: return \"pnext_p_p_p_\";\n\t\tcase ENC_PRFB_I_P_AI_D: return \"prfb_i_p_ai_d\";\n\t\tcase ENC_PRFB_I_P_AI_S: return \"prfb_i_p_ai_s\";\n\t\tcase ENC_PRFB_I_P_BI_S: return \"prfb_i_p_bi_s\";\n\t\tcase ENC_PRFB_I_P_BR_S: return \"prfb_i_p_br_s\";\n\t\tcase ENC_PRFB_I_P_BZ_D_64_SCALED: return \"prfb_i_p_bz_d_64_scaled\";\n\t\tcase ENC_PRFB_I_P_BZ_D_X32_SCALED: return \"prfb_i_p_bz_d_x32_scaled\";\n\t\tcase ENC_PRFB_I_P_BZ_S_X32_SCALED: return \"prfb_i_p_bz_s_x32_scaled\";\n\t\tcase ENC_PRFD_I_P_AI_D: return \"prfd_i_p_ai_d\";\n\t\tcase ENC_PRFD_I_P_AI_S: return \"prfd_i_p_ai_s\";\n\t\tcase ENC_PRFD_I_P_BI_S: return \"prfd_i_p_bi_s\";\n\t\tcase ENC_PRFD_I_P_BR_S: return \"prfd_i_p_br_s\";\n\t\tcase ENC_PRFD_I_P_BZ_D_64_SCALED: return \"prfd_i_p_bz_d_64_scaled\";\n\t\tcase ENC_PRFD_I_P_BZ_D_X32_SCALED: return \"prfd_i_p_bz_d_x32_scaled\";\n\t\tcase ENC_PRFD_I_P_BZ_S_X32_SCALED: return \"prfd_i_p_bz_s_x32_scaled\";\n\t\tcase ENC_PRFH_I_P_AI_D: return \"prfh_i_p_ai_d\";\n\t\tcase ENC_PRFH_I_P_AI_S: return \"prfh_i_p_ai_s\";\n\t\tcase ENC_PRFH_I_P_BI_S: return \"prfh_i_p_bi_s\";\n\t\tcase ENC_PRFH_I_P_BR_S: return \"prfh_i_p_br_s\";\n\t\tcase ENC_PRFH_I_P_BZ_D_64_SCALED: return \"prfh_i_p_bz_d_64_scaled\";\n\t\tcase ENC_PRFH_I_P_BZ_D_X32_SCALED: return \"prfh_i_p_bz_d_x32_scaled\";\n\t\tcase ENC_PRFH_I_P_BZ_S_X32_SCALED: return \"prfh_i_p_bz_s_x32_scaled\";\n\t\tcase ENC_PRFW_I_P_AI_D: return \"prfw_i_p_ai_d\";\n\t\tcase ENC_PRFW_I_P_AI_S: return \"prfw_i_p_ai_s\";\n\t\tcase ENC_PRFW_I_P_BI_S: return \"prfw_i_p_bi_s\";\n\t\tcase ENC_PRFW_I_P_BR_S: return \"prfw_i_p_br_s\";\n\t\tcase ENC_PRFW_I_P_BZ_D_64_SCALED: return \"prfw_i_p_bz_d_64_scaled\";\n\t\tcase ENC_PRFW_I_P_BZ_D_X32_SCALED: return \"prfw_i_p_bz_d_x32_scaled\";\n\t\tcase ENC_PRFW_I_P_BZ_S_X32_SCALED: return \"prfw_i_p_bz_s_x32_scaled\";\n\t\tcase ENC_PTEST_P_P_: return \"ptest_p_p_\";\n\t\tcase ENC_PTRUE_P_S_: return \"ptrue_p_s_\";\n\t\tcase ENC_PTRUES_P_S_: return \"ptrues_p_s_\";\n\t\tcase ENC_PUNPKHI_P_P_: return \"punpkhi_p_p_\";\n\t\tcase ENC_PUNPKLO_P_P_: return \"punpklo_p_p_\";\n\t\tcase ENC_RADDHNB_Z_ZZ_: return \"raddhnb_z_zz_\";\n\t\tcase ENC_RADDHNT_Z_ZZ_: return \"raddhnt_z_zz_\";\n\t\tcase ENC_RAX1_Z_ZZ_: return \"rax1_z_zz_\";\n\t\tcase ENC_RBIT_Z_P_Z_: return \"rbit_z_p_z_\";\n\t\tcase ENC_RDFFR_P_F_: return \"rdffr_p_f_\";\n\t\tcase ENC_RDFFR_P_P_F_: return \"rdffr_p_p_f_\";\n\t\tcase ENC_RDFFRS_P_P_F_: return \"rdffrs_p_p_f_\";\n\t\tcase ENC_RDVL_R_I_: return \"rdvl_r_i_\";\n\t\tcase ENC_REV_P_P_: return \"rev_p_p_\";\n\t\tcase ENC_REV_Z_Z_: return \"rev_z_z_\";\n\t\tcase ENC_REVB_Z_Z_: return \"revb_z_z_\";\n\t\tcase ENC_REVD_Z_P_Z_: return \"revd_z_p_z_\";\n\t\tcase ENC_REVH_Z_Z_: return \"revh_z_z_\";\n\t\tcase ENC_REVW_Z_Z_: return \"revw_z_z_\";\n\t\tcase ENC_RSHRNB_Z_ZI_: return \"rshrnb_z_zi_\";\n\t\tcase ENC_RSHRNT_Z_ZI_: return \"rshrnt_z_zi_\";\n\t\tcase ENC_RSUBHNB_Z_ZZ_: return \"rsubhnb_z_zz_\";\n\t\tcase ENC_RSUBHNT_Z_ZZ_: return \"rsubhnt_z_zz_\";\n\t\tcase ENC_SABA_Z_ZZZ_: return \"saba_z_zzz_\";\n\t\tcase ENC_SABALB_Z_ZZZ_: return \"sabalb_z_zzz_\";\n\t\tcase ENC_SABALT_Z_ZZZ_: return \"sabalt_z_zzz_\";\n\t\tcase ENC_SABD_Z_P_ZZ_: return \"sabd_z_p_zz_\";\n\t\tcase ENC_SABDLB_Z_ZZ_: return \"sabdlb_z_zz_\";\n\t\tcase ENC_SABDLT_Z_ZZ_: return \"sabdlt_z_zz_\";\n\t\tcase ENC_SADALP_Z_P_Z_: return \"sadalp_z_p_z_\";\n\t\tcase ENC_SADDLB_Z_ZZ_: return \"saddlb_z_zz_\";\n\t\tcase ENC_SADDLBT_Z_ZZ_: return \"saddlbt_z_zz_\";\n\t\tcase ENC_SADDLT_Z_ZZ_: return \"saddlt_z_zz_\";\n\t\tcase ENC_SADDV_R_P_Z_: return \"saddv_r_p_z_\";\n\t\tcase ENC_SADDWB_Z_ZZ_: return \"saddwb_z_zz_\";\n\t\tcase ENC_SADDWT_Z_ZZ_: return \"saddwt_z_zz_\";\n\t\tcase ENC_SBCLB_Z_ZZZ_: return \"sbclb_z_zzz_\";\n\t\tcase ENC_SBCLT_Z_ZZZ_: return \"sbclt_z_zzz_\";\n\t\tcase ENC_SCLAMP_Z_ZZ_: return \"sclamp_z_zz_\";\n\t\tcase ENC_SCVTF_Z_P_Z_H2FP16: return \"scvtf_z_p_z_h2fp16\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2D: return \"scvtf_z_p_z_w2d\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2FP16: return \"scvtf_z_p_z_w2fp16\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2S: return \"scvtf_z_p_z_w2s\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2D: return \"scvtf_z_p_z_x2d\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2FP16: return \"scvtf_z_p_z_x2fp16\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2S: return \"scvtf_z_p_z_x2s\";\n\t\tcase ENC_SDIV_Z_P_ZZ_: return \"sdiv_z_p_zz_\";\n\t\tcase ENC_SDIVR_Z_P_ZZ_: return \"sdivr_z_p_zz_\";\n\t\tcase ENC_SDOT_Z_ZZZ_: return \"sdot_z_zzz_\";\n\t\tcase ENC_SDOT_Z_ZZZI_D: return \"sdot_z_zzzi_d\";\n\t\tcase ENC_SDOT_Z_ZZZI_S: return \"sdot_z_zzzi_s\";\n\t\tcase ENC_SEL_P_P_PP_: return \"sel_p_p_pp_\";\n\t\tcase ENC_SEL_Z_P_ZZ_: return \"sel_z_p_zz_\";\n\t\tcase ENC_SETFFR_F_: return \"setffr_f_\";\n\t\tcase ENC_SHADD_Z_P_ZZ_: return \"shadd_z_p_zz_\";\n\t\tcase ENC_SHRNB_Z_ZI_: return \"shrnb_z_zi_\";\n\t\tcase ENC_SHRNT_Z_ZI_: return \"shrnt_z_zi_\";\n\t\tcase ENC_SHSUB_Z_P_ZZ_: return \"shsub_z_p_zz_\";\n\t\tcase ENC_SHSUBR_Z_P_ZZ_: return \"shsubr_z_p_zz_\";\n\t\tcase ENC_SLI_Z_ZZI_: return \"sli_z_zzi_\";\n\t\tcase ENC_SM4E_Z_ZZ_: return \"sm4e_z_zz_\";\n\t\tcase ENC_SM4EKEY_Z_ZZ_: return \"sm4ekey_z_zz_\";\n\t\tcase ENC_SMAX_Z_P_ZZ_: return \"smax_z_p_zz_\";\n\t\tcase ENC_SMAX_Z_ZI_: return \"smax_z_zi_\";\n\t\tcase ENC_SMAXP_Z_P_ZZ_: return \"smaxp_z_p_zz_\";\n\t\tcase ENC_SMAXV_R_P_Z_: return \"smaxv_r_p_z_\";\n\t\tcase ENC_SMIN_Z_P_ZZ_: return \"smin_z_p_zz_\";\n\t\tcase ENC_SMIN_Z_ZI_: return \"smin_z_zi_\";\n\t\tcase ENC_SMINP_Z_P_ZZ_: return \"sminp_z_p_zz_\";\n\t\tcase ENC_SMINV_R_P_Z_: return \"sminv_r_p_z_\";\n\t\tcase ENC_SMLALB_Z_ZZZ_: return \"smlalb_z_zzz_\";\n\t\tcase ENC_SMLALB_Z_ZZZI_D: return \"smlalb_z_zzzi_d\";\n\t\tcase ENC_SMLALB_Z_ZZZI_S: return \"smlalb_z_zzzi_s\";\n\t\tcase ENC_SMLALT_Z_ZZZ_: return \"smlalt_z_zzz_\";\n\t\tcase ENC_SMLALT_Z_ZZZI_D: return \"smlalt_z_zzzi_d\";\n\t\tcase ENC_SMLALT_Z_ZZZI_S: return \"smlalt_z_zzzi_s\";\n\t\tcase ENC_SMLSLB_Z_ZZZ_: return \"smlslb_z_zzz_\";\n\t\tcase ENC_SMLSLB_Z_ZZZI_D: return \"smlslb_z_zzzi_d\";\n\t\tcase ENC_SMLSLB_Z_ZZZI_S: return \"smlslb_z_zzzi_s\";\n\t\tcase ENC_SMLSLT_Z_ZZZ_: return \"smlslt_z_zzz_\";\n\t\tcase ENC_SMLSLT_Z_ZZZI_D: return \"smlslt_z_zzzi_d\";\n\t\tcase ENC_SMLSLT_Z_ZZZI_S: return \"smlslt_z_zzzi_s\";\n\t\tcase ENC_SMMLA_Z_ZZZ_: return \"smmla_z_zzz_\";\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_32: return \"smopa_za_pp_zz_32\";\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_64: return \"smopa_za_pp_zz_64\";\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_32: return \"smops_za_pp_zz_32\";\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_64: return \"smops_za_pp_zz_64\";\n\t\tcase ENC_SMULH_Z_P_ZZ_: return \"smulh_z_p_zz_\";\n\t\tcase ENC_SMULH_Z_ZZ_: return \"smulh_z_zz_\";\n\t\tcase ENC_SMULLB_Z_ZZ_: return \"smullb_z_zz_\";\n\t\tcase ENC_SMULLB_Z_ZZI_D: return \"smullb_z_zzi_d\";\n\t\tcase ENC_SMULLB_Z_ZZI_S: return \"smullb_z_zzi_s\";\n\t\tcase ENC_SMULLT_Z_ZZ_: return \"smullt_z_zz_\";\n\t\tcase ENC_SMULLT_Z_ZZI_D: return \"smullt_z_zzi_d\";\n\t\tcase ENC_SMULLT_Z_ZZI_S: return \"smullt_z_zzi_s\";\n\t\tcase ENC_SPLICE_Z_P_ZZ_CON: return \"splice_z_p_zz_con\";\n\t\tcase ENC_SPLICE_Z_P_ZZ_DES: return \"splice_z_p_zz_des\";\n\t\tcase ENC_SQABS_Z_P_Z_: return \"sqabs_z_p_z_\";\n\t\tcase ENC_SQADD_Z_P_ZZ_: return \"sqadd_z_p_zz_\";\n\t\tcase ENC_SQADD_Z_ZI_: return \"sqadd_z_zi_\";\n\t\tcase ENC_SQADD_Z_ZZ_: return \"sqadd_z_zz_\";\n\t\tcase ENC_SQCADD_Z_ZZ_: return \"sqcadd_z_zz_\";\n\t\tcase ENC_SQDECB_R_RS_SX: return \"sqdecb_r_rs_sx\";\n\t\tcase ENC_SQDECB_R_RS_X: return \"sqdecb_r_rs_x\";\n\t\tcase ENC_SQDECD_R_RS_SX: return \"sqdecd_r_rs_sx\";\n\t\tcase ENC_SQDECD_R_RS_X: return \"sqdecd_r_rs_x\";\n\t\tcase ENC_SQDECD_Z_ZS_: return \"sqdecd_z_zs_\";\n\t\tcase ENC_SQDECH_R_RS_SX: return \"sqdech_r_rs_sx\";\n\t\tcase ENC_SQDECH_R_RS_X: return \"sqdech_r_rs_x\";\n\t\tcase ENC_SQDECH_Z_ZS_: return \"sqdech_z_zs_\";\n\t\tcase ENC_SQDECP_R_P_R_SX: return \"sqdecp_r_p_r_sx\";\n\t\tcase ENC_SQDECP_R_P_R_X: return \"sqdecp_r_p_r_x\";\n\t\tcase ENC_SQDECP_Z_P_Z_: return \"sqdecp_z_p_z_\";\n\t\tcase ENC_SQDECW_R_RS_SX: return \"sqdecw_r_rs_sx\";\n\t\tcase ENC_SQDECW_R_RS_X: return \"sqdecw_r_rs_x\";\n\t\tcase ENC_SQDECW_Z_ZS_: return \"sqdecw_z_zs_\";\n\t\tcase ENC_SQDMLALB_Z_ZZZ_: return \"sqdmlalb_z_zzz_\";\n\t\tcase ENC_SQDMLALB_Z_ZZZI_D: return \"sqdmlalb_z_zzzi_d\";\n\t\tcase ENC_SQDMLALB_Z_ZZZI_S: return \"sqdmlalb_z_zzzi_s\";\n\t\tcase ENC_SQDMLALBT_Z_ZZZ_: return \"sqdmlalbt_z_zzz_\";\n\t\tcase ENC_SQDMLALT_Z_ZZZ_: return \"sqdmlalt_z_zzz_\";\n\t\tcase ENC_SQDMLALT_Z_ZZZI_D: return \"sqdmlalt_z_zzzi_d\";\n\t\tcase ENC_SQDMLALT_Z_ZZZI_S: return \"sqdmlalt_z_zzzi_s\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZ_: return \"sqdmlslb_z_zzz_\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_D: return \"sqdmlslb_z_zzzi_d\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_S: return \"sqdmlslb_z_zzzi_s\";\n\t\tcase ENC_SQDMLSLBT_Z_ZZZ_: return \"sqdmlslbt_z_zzz_\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZ_: return \"sqdmlslt_z_zzz_\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_D: return \"sqdmlslt_z_zzzi_d\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_S: return \"sqdmlslt_z_zzzi_s\";\n\t\tcase ENC_SQDMULH_Z_ZZ_: return \"sqdmulh_z_zz_\";\n\t\tcase ENC_SQDMULH_Z_ZZI_D: return \"sqdmulh_z_zzi_d\";\n\t\tcase ENC_SQDMULH_Z_ZZI_H: return \"sqdmulh_z_zzi_h\";\n\t\tcase ENC_SQDMULH_Z_ZZI_S: return \"sqdmulh_z_zzi_s\";\n\t\tcase ENC_SQDMULLB_Z_ZZ_: return \"sqdmullb_z_zz_\";\n\t\tcase ENC_SQDMULLB_Z_ZZI_D: return \"sqdmullb_z_zzi_d\";\n\t\tcase ENC_SQDMULLB_Z_ZZI_S: return \"sqdmullb_z_zzi_s\";\n\t\tcase ENC_SQDMULLT_Z_ZZ_: return \"sqdmullt_z_zz_\";\n\t\tcase ENC_SQDMULLT_Z_ZZI_D: return \"sqdmullt_z_zzi_d\";\n\t\tcase ENC_SQDMULLT_Z_ZZI_S: return \"sqdmullt_z_zzi_s\";\n\t\tcase ENC_SQINCB_R_RS_SX: return \"sqincb_r_rs_sx\";\n\t\tcase ENC_SQINCB_R_RS_X: return \"sqincb_r_rs_x\";\n\t\tcase ENC_SQINCD_R_RS_SX: return \"sqincd_r_rs_sx\";\n\t\tcase ENC_SQINCD_R_RS_X: return \"sqincd_r_rs_x\";\n\t\tcase ENC_SQINCD_Z_ZS_: return \"sqincd_z_zs_\";\n\t\tcase ENC_SQINCH_R_RS_SX: return \"sqinch_r_rs_sx\";\n\t\tcase ENC_SQINCH_R_RS_X: return \"sqinch_r_rs_x\";\n\t\tcase ENC_SQINCH_Z_ZS_: return \"sqinch_z_zs_\";\n\t\tcase ENC_SQINCP_R_P_R_SX: return \"sqincp_r_p_r_sx\";\n\t\tcase ENC_SQINCP_R_P_R_X: return \"sqincp_r_p_r_x\";\n\t\tcase ENC_SQINCP_Z_P_Z_: return \"sqincp_z_p_z_\";\n\t\tcase ENC_SQINCW_R_RS_SX: return \"sqincw_r_rs_sx\";\n\t\tcase ENC_SQINCW_R_RS_X: return \"sqincw_r_rs_x\";\n\t\tcase ENC_SQINCW_Z_ZS_: return \"sqincw_z_zs_\";\n\t\tcase ENC_SQNEG_Z_P_Z_: return \"sqneg_z_p_z_\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZ_: return \"sqrdcmlah_z_zzz_\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_H: return \"sqrdcmlah_z_zzzi_h\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_S: return \"sqrdcmlah_z_zzzi_s\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZ_: return \"sqrdmlah_z_zzz_\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_D: return \"sqrdmlah_z_zzzi_d\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_H: return \"sqrdmlah_z_zzzi_h\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_S: return \"sqrdmlah_z_zzzi_s\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZ_: return \"sqrdmlsh_z_zzz_\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_D: return \"sqrdmlsh_z_zzzi_d\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_H: return \"sqrdmlsh_z_zzzi_h\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_S: return \"sqrdmlsh_z_zzzi_s\";\n\t\tcase ENC_SQRDMULH_Z_ZZ_: return \"sqrdmulh_z_zz_\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_D: return \"sqrdmulh_z_zzi_d\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_H: return \"sqrdmulh_z_zzi_h\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_S: return \"sqrdmulh_z_zzi_s\";\n\t\tcase ENC_SQRSHL_Z_P_ZZ_: return \"sqrshl_z_p_zz_\";\n\t\tcase ENC_SQRSHLR_Z_P_ZZ_: return \"sqrshlr_z_p_zz_\";\n\t\tcase ENC_SQRSHRNB_Z_ZI_: return \"sqrshrnb_z_zi_\";\n\t\tcase ENC_SQRSHRNT_Z_ZI_: return \"sqrshrnt_z_zi_\";\n\t\tcase ENC_SQRSHRUNB_Z_ZI_: return \"sqrshrunb_z_zi_\";\n\t\tcase ENC_SQRSHRUNT_Z_ZI_: return \"sqrshrunt_z_zi_\";\n\t\tcase ENC_SQSHL_Z_P_ZI_: return \"sqshl_z_p_zi_\";\n\t\tcase ENC_SQSHL_Z_P_ZZ_: return \"sqshl_z_p_zz_\";\n\t\tcase ENC_SQSHLR_Z_P_ZZ_: return \"sqshlr_z_p_zz_\";\n\t\tcase ENC_SQSHLU_Z_P_ZI_: return \"sqshlu_z_p_zi_\";\n\t\tcase ENC_SQSHRNB_Z_ZI_: return \"sqshrnb_z_zi_\";\n\t\tcase ENC_SQSHRNT_Z_ZI_: return \"sqshrnt_z_zi_\";\n\t\tcase ENC_SQSHRUNB_Z_ZI_: return \"sqshrunb_z_zi_\";\n\t\tcase ENC_SQSHRUNT_Z_ZI_: return \"sqshrunt_z_zi_\";\n\t\tcase ENC_SQSUB_Z_P_ZZ_: return \"sqsub_z_p_zz_\";\n\t\tcase ENC_SQSUB_Z_ZI_: return \"sqsub_z_zi_\";\n\t\tcase ENC_SQSUB_Z_ZZ_: return \"sqsub_z_zz_\";\n\t\tcase ENC_SQSUBR_Z_P_ZZ_: return \"sqsubr_z_p_zz_\";\n\t\tcase ENC_SQXTNB_Z_ZZ_: return \"sqxtnb_z_zz_\";\n\t\tcase ENC_SQXTNT_Z_ZZ_: return \"sqxtnt_z_zz_\";\n\t\tcase ENC_SQXTUNB_Z_ZZ_: return \"sqxtunb_z_zz_\";\n\t\tcase ENC_SQXTUNT_Z_ZZ_: return \"sqxtunt_z_zz_\";\n\t\tcase ENC_SRHADD_Z_P_ZZ_: return \"srhadd_z_p_zz_\";\n\t\tcase ENC_SRI_Z_ZZI_: return \"sri_z_zzi_\";\n\t\tcase ENC_SRSHL_Z_P_ZZ_: return \"srshl_z_p_zz_\";\n\t\tcase ENC_SRSHLR_Z_P_ZZ_: return \"srshlr_z_p_zz_\";\n\t\tcase ENC_SRSHR_Z_P_ZI_: return \"srshr_z_p_zi_\";\n\t\tcase ENC_SRSRA_Z_ZI_: return \"srsra_z_zi_\";\n\t\tcase ENC_SSHLLB_Z_ZI_: return \"sshllb_z_zi_\";\n\t\tcase ENC_SSHLLT_Z_ZI_: return \"sshllt_z_zi_\";\n\t\tcase ENC_SSRA_Z_ZI_: return \"ssra_z_zi_\";\n\t\tcase ENC_SSUBLB_Z_ZZ_: return \"ssublb_z_zz_\";\n\t\tcase ENC_SSUBLBT_Z_ZZ_: return \"ssublbt_z_zz_\";\n\t\tcase ENC_SSUBLT_Z_ZZ_: return \"ssublt_z_zz_\";\n\t\tcase ENC_SSUBLTB_Z_ZZ_: return \"ssubltb_z_zz_\";\n\t\tcase ENC_SSUBWB_Z_ZZ_: return \"ssubwb_z_zz_\";\n\t\tcase ENC_SSUBWT_Z_ZZ_: return \"ssubwt_z_zz_\";\n\t\tcase ENC_ST1B_Z_P_AI_D: return \"st1b_z_p_ai_d\";\n\t\tcase ENC_ST1B_Z_P_AI_S: return \"st1b_z_p_ai_s\";\n\t\tcase ENC_ST1B_Z_P_BI_: return \"st1b_z_p_bi_\";\n\t\tcase ENC_ST1B_Z_P_BR_: return \"st1b_z_p_br_\";\n\t\tcase ENC_ST1B_Z_P_BZ_D_64_UNSCALED: return \"st1b_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_ST1B_Z_P_BZ_D_X32_UNSCALED: return \"st1b_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_ST1B_Z_P_BZ_S_X32_UNSCALED: return \"st1b_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_ST1B_ZA_P_RRR_: return \"st1b_za_p_rrr_\";\n\t\tcase ENC_ST1D_Z_P_AI_D: return \"st1d_z_p_ai_d\";\n\t\tcase ENC_ST1D_Z_P_BI_: return \"st1d_z_p_bi_\";\n\t\tcase ENC_ST1D_Z_P_BR_: return \"st1d_z_p_br_\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_SCALED: return \"st1d_z_p_bz_d_64_scaled\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_UNSCALED: return \"st1d_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_SCALED: return \"st1d_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_UNSCALED: return \"st1d_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_ST1D_ZA_P_RRR_: return \"st1d_za_p_rrr_\";\n\t\tcase ENC_ST1H_Z_P_AI_D: return \"st1h_z_p_ai_d\";\n\t\tcase ENC_ST1H_Z_P_AI_S: return \"st1h_z_p_ai_s\";\n\t\tcase ENC_ST1H_Z_P_BI_: return \"st1h_z_p_bi_\";\n\t\tcase ENC_ST1H_Z_P_BR_: return \"st1h_z_p_br_\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_SCALED: return \"st1h_z_p_bz_d_64_scaled\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_UNSCALED: return \"st1h_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_SCALED: return \"st1h_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_UNSCALED: return \"st1h_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_SCALED: return \"st1h_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_UNSCALED: return \"st1h_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_ST1H_ZA_P_RRR_: return \"st1h_za_p_rrr_\";\n\t\tcase ENC_ST1Q_ZA_P_RRR_: return \"st1q_za_p_rrr_\";\n\t\tcase ENC_ST1W_Z_P_AI_D: return \"st1w_z_p_ai_d\";\n\t\tcase ENC_ST1W_Z_P_AI_S: return \"st1w_z_p_ai_s\";\n\t\tcase ENC_ST1W_Z_P_BI_: return \"st1w_z_p_bi_\";\n\t\tcase ENC_ST1W_Z_P_BR_: return \"st1w_z_p_br_\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_SCALED: return \"st1w_z_p_bz_d_64_scaled\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_UNSCALED: return \"st1w_z_p_bz_d_64_unscaled\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_SCALED: return \"st1w_z_p_bz_d_x32_scaled\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_UNSCALED: return \"st1w_z_p_bz_d_x32_unscaled\";\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_SCALED: return \"st1w_z_p_bz_s_x32_scaled\";\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_UNSCALED: return \"st1w_z_p_bz_s_x32_unscaled\";\n\t\tcase ENC_ST1W_ZA_P_RRR_: return \"st1w_za_p_rrr_\";\n\t\tcase ENC_ST2B_Z_P_BI_CONTIGUOUS: return \"st2b_z_p_bi_contiguous\";\n\t\tcase ENC_ST2B_Z_P_BR_CONTIGUOUS: return \"st2b_z_p_br_contiguous\";\n\t\tcase ENC_ST2D_Z_P_BI_CONTIGUOUS: return \"st2d_z_p_bi_contiguous\";\n\t\tcase ENC_ST2D_Z_P_BR_CONTIGUOUS: return \"st2d_z_p_br_contiguous\";\n\t\tcase ENC_ST2H_Z_P_BI_CONTIGUOUS: return \"st2h_z_p_bi_contiguous\";\n\t\tcase ENC_ST2H_Z_P_BR_CONTIGUOUS: return \"st2h_z_p_br_contiguous\";\n\t\tcase ENC_ST2W_Z_P_BI_CONTIGUOUS: return \"st2w_z_p_bi_contiguous\";\n\t\tcase ENC_ST2W_Z_P_BR_CONTIGUOUS: return \"st2w_z_p_br_contiguous\";\n\t\tcase ENC_ST3B_Z_P_BI_CONTIGUOUS: return \"st3b_z_p_bi_contiguous\";\n\t\tcase ENC_ST3B_Z_P_BR_CONTIGUOUS: return \"st3b_z_p_br_contiguous\";\n\t\tcase ENC_ST3D_Z_P_BI_CONTIGUOUS: return \"st3d_z_p_bi_contiguous\";\n\t\tcase ENC_ST3D_Z_P_BR_CONTIGUOUS: return \"st3d_z_p_br_contiguous\";\n\t\tcase ENC_ST3H_Z_P_BI_CONTIGUOUS: return \"st3h_z_p_bi_contiguous\";\n\t\tcase ENC_ST3H_Z_P_BR_CONTIGUOUS: return \"st3h_z_p_br_contiguous\";\n\t\tcase ENC_ST3W_Z_P_BI_CONTIGUOUS: return \"st3w_z_p_bi_contiguous\";\n\t\tcase ENC_ST3W_Z_P_BR_CONTIGUOUS: return \"st3w_z_p_br_contiguous\";\n\t\tcase ENC_ST4B_Z_P_BI_CONTIGUOUS: return \"st4b_z_p_bi_contiguous\";\n\t\tcase ENC_ST4B_Z_P_BR_CONTIGUOUS: return \"st4b_z_p_br_contiguous\";\n\t\tcase ENC_ST4D_Z_P_BI_CONTIGUOUS: return \"st4d_z_p_bi_contiguous\";\n\t\tcase ENC_ST4D_Z_P_BR_CONTIGUOUS: return \"st4d_z_p_br_contiguous\";\n\t\tcase ENC_ST4H_Z_P_BI_CONTIGUOUS: return \"st4h_z_p_bi_contiguous\";\n\t\tcase ENC_ST4H_Z_P_BR_CONTIGUOUS: return \"st4h_z_p_br_contiguous\";\n\t\tcase ENC_ST4W_Z_P_BI_CONTIGUOUS: return \"st4w_z_p_bi_contiguous\";\n\t\tcase ENC_ST4W_Z_P_BR_CONTIGUOUS: return \"st4w_z_p_br_contiguous\";\n\t\tcase ENC_STNT1B_Z_P_AR_D_64_UNSCALED: return \"stnt1b_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_STNT1B_Z_P_AR_S_X32_UNSCALED: return \"stnt1b_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_STNT1B_Z_P_BI_CONTIGUOUS: return \"stnt1b_z_p_bi_contiguous\";\n\t\tcase ENC_STNT1B_Z_P_BR_CONTIGUOUS: return \"stnt1b_z_p_br_contiguous\";\n\t\tcase ENC_STNT1D_Z_P_AR_D_64_UNSCALED: return \"stnt1d_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_STNT1D_Z_P_BI_CONTIGUOUS: return \"stnt1d_z_p_bi_contiguous\";\n\t\tcase ENC_STNT1D_Z_P_BR_CONTIGUOUS: return \"stnt1d_z_p_br_contiguous\";\n\t\tcase ENC_STNT1H_Z_P_AR_D_64_UNSCALED: return \"stnt1h_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_STNT1H_Z_P_AR_S_X32_UNSCALED: return \"stnt1h_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_STNT1H_Z_P_BI_CONTIGUOUS: return \"stnt1h_z_p_bi_contiguous\";\n\t\tcase ENC_STNT1H_Z_P_BR_CONTIGUOUS: return \"stnt1h_z_p_br_contiguous\";\n\t\tcase ENC_STNT1W_Z_P_AR_D_64_UNSCALED: return \"stnt1w_z_p_ar_d_64_unscaled\";\n\t\tcase ENC_STNT1W_Z_P_AR_S_X32_UNSCALED: return \"stnt1w_z_p_ar_s_x32_unscaled\";\n\t\tcase ENC_STNT1W_Z_P_BI_CONTIGUOUS: return \"stnt1w_z_p_bi_contiguous\";\n\t\tcase ENC_STNT1W_Z_P_BR_CONTIGUOUS: return \"stnt1w_z_p_br_contiguous\";\n\t\tcase ENC_STR_P_BI_: return \"str_p_bi_\";\n\t\tcase ENC_STR_Z_BI_: return \"str_z_bi_\";\n\t\tcase ENC_STR_ZA_RI_: return \"str_za_ri_\";\n\t\tcase ENC_SUB_Z_P_ZZ_: return \"sub_z_p_zz_\";\n\t\tcase ENC_SUB_Z_ZI_: return \"sub_z_zi_\";\n\t\tcase ENC_SUB_Z_ZZ_: return \"sub_z_zz_\";\n\t\tcase ENC_SUBHNB_Z_ZZ_: return \"subhnb_z_zz_\";\n\t\tcase ENC_SUBHNT_Z_ZZ_: return \"subhnt_z_zz_\";\n\t\tcase ENC_SUBR_Z_P_ZZ_: return \"subr_z_p_zz_\";\n\t\tcase ENC_SUBR_Z_ZI_: return \"subr_z_zi_\";\n\t\tcase ENC_SUDOT_Z_ZZZI_S: return \"sudot_z_zzzi_s\";\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_32: return \"sumopa_za_pp_zz_32\";\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_64: return \"sumopa_za_pp_zz_64\";\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_32: return \"sumops_za_pp_zz_32\";\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_64: return \"sumops_za_pp_zz_64\";\n\t\tcase ENC_SUNPKHI_Z_Z_: return \"sunpkhi_z_z_\";\n\t\tcase ENC_SUNPKLO_Z_Z_: return \"sunpklo_z_z_\";\n\t\tcase ENC_SUQADD_Z_P_ZZ_: return \"suqadd_z_p_zz_\";\n\t\tcase ENC_SXTB_Z_P_Z_: return \"sxtb_z_p_z_\";\n\t\tcase ENC_SXTH_Z_P_Z_: return \"sxth_z_p_z_\";\n\t\tcase ENC_SXTW_Z_P_Z_: return \"sxtw_z_p_z_\";\n\t\tcase ENC_TBL_Z_ZZ_1: return \"tbl_z_zz_1\";\n\t\tcase ENC_TBL_Z_ZZ_2: return \"tbl_z_zz_2\";\n\t\tcase ENC_TBX_Z_ZZ_: return \"tbx_z_zz_\";\n\t\tcase ENC_TRN1_P_PP_: return \"trn1_p_pp_\";\n\t\tcase ENC_TRN1_Z_ZZ_: return \"trn1_z_zz_\";\n\t\tcase ENC_TRN1_Z_ZZ_Q: return \"trn1_z_zz_q\";\n\t\tcase ENC_TRN2_P_PP_: return \"trn2_p_pp_\";\n\t\tcase ENC_TRN2_Z_ZZ_: return \"trn2_z_zz_\";\n\t\tcase ENC_TRN2_Z_ZZ_Q: return \"trn2_z_zz_q\";\n\t\tcase ENC_UABA_Z_ZZZ_: return \"uaba_z_zzz_\";\n\t\tcase ENC_UABALB_Z_ZZZ_: return \"uabalb_z_zzz_\";\n\t\tcase ENC_UABALT_Z_ZZZ_: return \"uabalt_z_zzz_\";\n\t\tcase ENC_UABD_Z_P_ZZ_: return \"uabd_z_p_zz_\";\n\t\tcase ENC_UABDLB_Z_ZZ_: return \"uabdlb_z_zz_\";\n\t\tcase ENC_UABDLT_Z_ZZ_: return \"uabdlt_z_zz_\";\n\t\tcase ENC_UADALP_Z_P_Z_: return \"uadalp_z_p_z_\";\n\t\tcase ENC_UADDLB_Z_ZZ_: return \"uaddlb_z_zz_\";\n\t\tcase ENC_UADDLT_Z_ZZ_: return \"uaddlt_z_zz_\";\n\t\tcase ENC_UADDV_R_P_Z_: return \"uaddv_r_p_z_\";\n\t\tcase ENC_UADDWB_Z_ZZ_: return \"uaddwb_z_zz_\";\n\t\tcase ENC_UADDWT_Z_ZZ_: return \"uaddwt_z_zz_\";\n\t\tcase ENC_UCLAMP_Z_ZZ_: return \"uclamp_z_zz_\";\n\t\tcase ENC_UCVTF_Z_P_Z_H2FP16: return \"ucvtf_z_p_z_h2fp16\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2D: return \"ucvtf_z_p_z_w2d\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2FP16: return \"ucvtf_z_p_z_w2fp16\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2S: return \"ucvtf_z_p_z_w2s\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2D: return \"ucvtf_z_p_z_x2d\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2FP16: return \"ucvtf_z_p_z_x2fp16\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2S: return \"ucvtf_z_p_z_x2s\";\n\t\tcase ENC_UDIV_Z_P_ZZ_: return \"udiv_z_p_zz_\";\n\t\tcase ENC_UDIVR_Z_P_ZZ_: return \"udivr_z_p_zz_\";\n\t\tcase ENC_UDOT_Z_ZZZ_: return \"udot_z_zzz_\";\n\t\tcase ENC_UDOT_Z_ZZZI_D: return \"udot_z_zzzi_d\";\n\t\tcase ENC_UDOT_Z_ZZZI_S: return \"udot_z_zzzi_s\";\n\t\tcase ENC_UHADD_Z_P_ZZ_: return \"uhadd_z_p_zz_\";\n\t\tcase ENC_UHSUB_Z_P_ZZ_: return \"uhsub_z_p_zz_\";\n\t\tcase ENC_UHSUBR_Z_P_ZZ_: return \"uhsubr_z_p_zz_\";\n\t\tcase ENC_UMAX_Z_P_ZZ_: return \"umax_z_p_zz_\";\n\t\tcase ENC_UMAX_Z_ZI_: return \"umax_z_zi_\";\n\t\tcase ENC_UMAXP_Z_P_ZZ_: return \"umaxp_z_p_zz_\";\n\t\tcase ENC_UMAXV_R_P_Z_: return \"umaxv_r_p_z_\";\n\t\tcase ENC_UMIN_Z_P_ZZ_: return \"umin_z_p_zz_\";\n\t\tcase ENC_UMIN_Z_ZI_: return \"umin_z_zi_\";\n\t\tcase ENC_UMINP_Z_P_ZZ_: return \"uminp_z_p_zz_\";\n\t\tcase ENC_UMINV_R_P_Z_: return \"uminv_r_p_z_\";\n\t\tcase ENC_UMLALB_Z_ZZZ_: return \"umlalb_z_zzz_\";\n\t\tcase ENC_UMLALB_Z_ZZZI_D: return \"umlalb_z_zzzi_d\";\n\t\tcase ENC_UMLALB_Z_ZZZI_S: return \"umlalb_z_zzzi_s\";\n\t\tcase ENC_UMLALT_Z_ZZZ_: return \"umlalt_z_zzz_\";\n\t\tcase ENC_UMLALT_Z_ZZZI_D: return \"umlalt_z_zzzi_d\";\n\t\tcase ENC_UMLALT_Z_ZZZI_S: return \"umlalt_z_zzzi_s\";\n\t\tcase ENC_UMLSLB_Z_ZZZ_: return \"umlslb_z_zzz_\";\n\t\tcase ENC_UMLSLB_Z_ZZZI_D: return \"umlslb_z_zzzi_d\";\n\t\tcase ENC_UMLSLB_Z_ZZZI_S: return \"umlslb_z_zzzi_s\";\n\t\tcase ENC_UMLSLT_Z_ZZZ_: return \"umlslt_z_zzz_\";\n\t\tcase ENC_UMLSLT_Z_ZZZI_D: return \"umlslt_z_zzzi_d\";\n\t\tcase ENC_UMLSLT_Z_ZZZI_S: return \"umlslt_z_zzzi_s\";\n\t\tcase ENC_UMMLA_Z_ZZZ_: return \"ummla_z_zzz_\";\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_32: return \"umopa_za_pp_zz_32\";\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_64: return \"umopa_za_pp_zz_64\";\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_32: return \"umops_za_pp_zz_32\";\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_64: return \"umops_za_pp_zz_64\";\n\t\tcase ENC_UMULH_Z_P_ZZ_: return \"umulh_z_p_zz_\";\n\t\tcase ENC_UMULH_Z_ZZ_: return \"umulh_z_zz_\";\n\t\tcase ENC_UMULLB_Z_ZZ_: return \"umullb_z_zz_\";\n\t\tcase ENC_UMULLB_Z_ZZI_D: return \"umullb_z_zzi_d\";\n\t\tcase ENC_UMULLB_Z_ZZI_S: return \"umullb_z_zzi_s\";\n\t\tcase ENC_UMULLT_Z_ZZ_: return \"umullt_z_zz_\";\n\t\tcase ENC_UMULLT_Z_ZZI_D: return \"umullt_z_zzi_d\";\n\t\tcase ENC_UMULLT_Z_ZZI_S: return \"umullt_z_zzi_s\";\n\t\tcase ENC_UQADD_Z_P_ZZ_: return \"uqadd_z_p_zz_\";\n\t\tcase ENC_UQADD_Z_ZI_: return \"uqadd_z_zi_\";\n\t\tcase ENC_UQADD_Z_ZZ_: return \"uqadd_z_zz_\";\n\t\tcase ENC_UQDECB_R_RS_UW: return \"uqdecb_r_rs_uw\";\n\t\tcase ENC_UQDECB_R_RS_X: return \"uqdecb_r_rs_x\";\n\t\tcase ENC_UQDECD_R_RS_UW: return \"uqdecd_r_rs_uw\";\n\t\tcase ENC_UQDECD_R_RS_X: return \"uqdecd_r_rs_x\";\n\t\tcase ENC_UQDECD_Z_ZS_: return \"uqdecd_z_zs_\";\n\t\tcase ENC_UQDECH_R_RS_UW: return \"uqdech_r_rs_uw\";\n\t\tcase ENC_UQDECH_R_RS_X: return \"uqdech_r_rs_x\";\n\t\tcase ENC_UQDECH_Z_ZS_: return \"uqdech_z_zs_\";\n\t\tcase ENC_UQDECP_R_P_R_UW: return \"uqdecp_r_p_r_uw\";\n\t\tcase ENC_UQDECP_R_P_R_X: return \"uqdecp_r_p_r_x\";\n\t\tcase ENC_UQDECP_Z_P_Z_: return \"uqdecp_z_p_z_\";\n\t\tcase ENC_UQDECW_R_RS_UW: return \"uqdecw_r_rs_uw\";\n\t\tcase ENC_UQDECW_R_RS_X: return \"uqdecw_r_rs_x\";\n\t\tcase ENC_UQDECW_Z_ZS_: return \"uqdecw_z_zs_\";\n\t\tcase ENC_UQINCB_R_RS_UW: return \"uqincb_r_rs_uw\";\n\t\tcase ENC_UQINCB_R_RS_X: return \"uqincb_r_rs_x\";\n\t\tcase ENC_UQINCD_R_RS_UW: return \"uqincd_r_rs_uw\";\n\t\tcase ENC_UQINCD_R_RS_X: return \"uqincd_r_rs_x\";\n\t\tcase ENC_UQINCD_Z_ZS_: return \"uqincd_z_zs_\";\n\t\tcase ENC_UQINCH_R_RS_UW: return \"uqinch_r_rs_uw\";\n\t\tcase ENC_UQINCH_R_RS_X: return \"uqinch_r_rs_x\";\n\t\tcase ENC_UQINCH_Z_ZS_: return \"uqinch_z_zs_\";\n\t\tcase ENC_UQINCP_R_P_R_UW: return \"uqincp_r_p_r_uw\";\n\t\tcase ENC_UQINCP_R_P_R_X: return \"uqincp_r_p_r_x\";\n\t\tcase ENC_UQINCP_Z_P_Z_: return \"uqincp_z_p_z_\";\n\t\tcase ENC_UQINCW_R_RS_UW: return \"uqincw_r_rs_uw\";\n\t\tcase ENC_UQINCW_R_RS_X: return \"uqincw_r_rs_x\";\n\t\tcase ENC_UQINCW_Z_ZS_: return \"uqincw_z_zs_\";\n\t\tcase ENC_UQRSHL_Z_P_ZZ_: return \"uqrshl_z_p_zz_\";\n\t\tcase ENC_UQRSHLR_Z_P_ZZ_: return \"uqrshlr_z_p_zz_\";\n\t\tcase ENC_UQRSHRNB_Z_ZI_: return \"uqrshrnb_z_zi_\";\n\t\tcase ENC_UQRSHRNT_Z_ZI_: return \"uqrshrnt_z_zi_\";\n\t\tcase ENC_UQSHL_Z_P_ZI_: return \"uqshl_z_p_zi_\";\n\t\tcase ENC_UQSHL_Z_P_ZZ_: return \"uqshl_z_p_zz_\";\n\t\tcase ENC_UQSHLR_Z_P_ZZ_: return \"uqshlr_z_p_zz_\";\n\t\tcase ENC_UQSHRNB_Z_ZI_: return \"uqshrnb_z_zi_\";\n\t\tcase ENC_UQSHRNT_Z_ZI_: return \"uqshrnt_z_zi_\";\n\t\tcase ENC_UQSUB_Z_P_ZZ_: return \"uqsub_z_p_zz_\";\n\t\tcase ENC_UQSUB_Z_ZI_: return \"uqsub_z_zi_\";\n\t\tcase ENC_UQSUB_Z_ZZ_: return \"uqsub_z_zz_\";\n\t\tcase ENC_UQSUBR_Z_P_ZZ_: return \"uqsubr_z_p_zz_\";\n\t\tcase ENC_UQXTNB_Z_ZZ_: return \"uqxtnb_z_zz_\";\n\t\tcase ENC_UQXTNT_Z_ZZ_: return \"uqxtnt_z_zz_\";\n\t\tcase ENC_URECPE_Z_P_Z_: return \"urecpe_z_p_z_\";\n\t\tcase ENC_URHADD_Z_P_ZZ_: return \"urhadd_z_p_zz_\";\n\t\tcase ENC_URSHL_Z_P_ZZ_: return \"urshl_z_p_zz_\";\n\t\tcase ENC_URSHLR_Z_P_ZZ_: return \"urshlr_z_p_zz_\";\n\t\tcase ENC_URSHR_Z_P_ZI_: return \"urshr_z_p_zi_\";\n\t\tcase ENC_URSQRTE_Z_P_Z_: return \"ursqrte_z_p_z_\";\n\t\tcase ENC_URSRA_Z_ZI_: return \"ursra_z_zi_\";\n\t\tcase ENC_USDOT_Z_ZZZ_S: return \"usdot_z_zzz_s\";\n\t\tcase ENC_USDOT_Z_ZZZI_S: return \"usdot_z_zzzi_s\";\n\t\tcase ENC_USHLLB_Z_ZI_: return \"ushllb_z_zi_\";\n\t\tcase ENC_USHLLT_Z_ZI_: return \"ushllt_z_zi_\";\n\t\tcase ENC_USMMLA_Z_ZZZ_: return \"usmmla_z_zzz_\";\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_32: return \"usmopa_za_pp_zz_32\";\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_64: return \"usmopa_za_pp_zz_64\";\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_32: return \"usmops_za_pp_zz_32\";\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_64: return \"usmops_za_pp_zz_64\";\n\t\tcase ENC_USQADD_Z_P_ZZ_: return \"usqadd_z_p_zz_\";\n\t\tcase ENC_USRA_Z_ZI_: return \"usra_z_zi_\";\n\t\tcase ENC_USUBLB_Z_ZZ_: return \"usublb_z_zz_\";\n\t\tcase ENC_USUBLT_Z_ZZ_: return \"usublt_z_zz_\";\n\t\tcase ENC_USUBWB_Z_ZZ_: return \"usubwb_z_zz_\";\n\t\tcase ENC_USUBWT_Z_ZZ_: return \"usubwt_z_zz_\";\n\t\tcase ENC_UUNPKHI_Z_Z_: return \"uunpkhi_z_z_\";\n\t\tcase ENC_UUNPKLO_Z_Z_: return \"uunpklo_z_z_\";\n\t\tcase ENC_UXTB_Z_P_Z_: return \"uxtb_z_p_z_\";\n\t\tcase ENC_UXTH_Z_P_Z_: return \"uxth_z_p_z_\";\n\t\tcase ENC_UXTW_Z_P_Z_: return \"uxtw_z_p_z_\";\n\t\tcase ENC_UZP1_P_PP_: return \"uzp1_p_pp_\";\n\t\tcase ENC_UZP1_Z_ZZ_: return \"uzp1_z_zz_\";\n\t\tcase ENC_UZP1_Z_ZZ_Q: return \"uzp1_z_zz_q\";\n\t\tcase ENC_UZP2_P_PP_: return \"uzp2_p_pp_\";\n\t\tcase ENC_UZP2_Z_ZZ_: return \"uzp2_z_zz_\";\n\t\tcase ENC_UZP2_Z_ZZ_Q: return \"uzp2_z_zz_q\";\n\t\tcase ENC_WHILEGE_P_P_RR_: return \"whilege_p_p_rr_\";\n\t\tcase ENC_WHILEGT_P_P_RR_: return \"whilegt_p_p_rr_\";\n\t\tcase ENC_WHILEHI_P_P_RR_: return \"whilehi_p_p_rr_\";\n\t\tcase ENC_WHILEHS_P_P_RR_: return \"whilehs_p_p_rr_\";\n\t\tcase ENC_WHILELE_P_P_RR_: return \"whilele_p_p_rr_\";\n\t\tcase ENC_WHILELO_P_P_RR_: return \"whilelo_p_p_rr_\";\n\t\tcase ENC_WHILELS_P_P_RR_: return \"whilels_p_p_rr_\";\n\t\tcase ENC_WHILELT_P_P_RR_: return \"whilelt_p_p_rr_\";\n\t\tcase ENC_WHILERW_P_RR_: return \"whilerw_p_rr_\";\n\t\tcase ENC_WHILEWR_P_RR_: return \"whilewr_p_rr_\";\n\t\tcase ENC_WRFFR_F_P_: return \"wrffr_f_p_\";\n\t\tcase ENC_XAR_Z_ZZI_: return \"xar_z_zzi_\";\n\t\tcase ENC_ZERO_ZA_I_: return \"zero_za_i_\";\n\t\tcase ENC_ZIP1_P_PP_: return \"zip1_p_pp_\";\n\t\tcase ENC_ZIP1_Z_ZZ_: return \"zip1_z_zz_\";\n\t\tcase ENC_ZIP1_Z_ZZ_Q: return \"zip1_z_zz_q\";\n\t\tcase ENC_ZIP2_P_PP_: return \"zip2_p_pp_\";\n\t\tcase ENC_ZIP2_Z_ZZ_: return \"zip2_z_zz_\";\n\t\tcase ENC_ZIP2_Z_ZZ_Q: return \"zip2_z_zz_q\";\n\t\tdefault: return \"error\";\n\t}\n}\n\nconst char *enc_to_xml(enum ENCODING enc)\n{\n\tswitch(enc) {\n\t\tcase ENC_ABS_ASIMDMISC_R: return \"abs_advsimd.xml\";\n\t\tcase ENC_ABS_ASISDMISC_R: return \"abs_advsimd.xml\";\n\t\tcase ENC_ADCS_32_ADDSUB_CARRY: return \"adcs.xml\";\n\t\tcase ENC_ADCS_64_ADDSUB_CARRY: return \"adcs.xml\";\n\t\tcase ENC_ADC_32_ADDSUB_CARRY: return \"adc.xml\";\n\t\tcase ENC_ADC_64_ADDSUB_CARRY: return \"adc.xml\";\n\t\tcase ENC_ADDG_64_ADDSUB_IMMTAGS: return \"addg.xml\";\n\t\tcase ENC_ADDHN_ASIMDDIFF_N: return \"addhn_advsimd.xml\";\n\t\tcase ENC_ADDP_ASIMDSAME_ONLY: return \"addp_advsimd_vec.xml\";\n\t\tcase ENC_ADDP_ASISDPAIR_ONLY: return \"addp_advsimd_pair.xml\";\n\t\tcase ENC_ADDS_32S_ADDSUB_EXT: return \"adds_addsub_ext.xml\";\n\t\tcase ENC_ADDS_32S_ADDSUB_IMM: return \"adds_addsub_imm.xml\";\n\t\tcase ENC_ADDS_32_ADDSUB_SHIFT: return \"adds_addsub_shift.xml\";\n\t\tcase ENC_ADDS_64S_ADDSUB_EXT: return \"adds_addsub_ext.xml\";\n\t\tcase ENC_ADDS_64S_ADDSUB_IMM: return \"adds_addsub_imm.xml\";\n\t\tcase ENC_ADDS_64_ADDSUB_SHIFT: return \"adds_addsub_shift.xml\";\n\t\tcase ENC_ADDV_ASIMDALL_ONLY: return \"addv_advsimd.xml\";\n\t\tcase ENC_ADD_32_ADDSUB_EXT: return \"add_addsub_ext.xml\";\n\t\tcase ENC_ADD_32_ADDSUB_IMM: return \"add_addsub_imm.xml\";\n\t\tcase ENC_ADD_32_ADDSUB_SHIFT: return \"add_addsub_shift.xml\";\n\t\tcase ENC_ADD_64_ADDSUB_EXT: return \"add_addsub_ext.xml\";\n\t\tcase ENC_ADD_64_ADDSUB_IMM: return \"add_addsub_imm.xml\";\n\t\tcase ENC_ADD_64_ADDSUB_SHIFT: return \"add_addsub_shift.xml\";\n\t\tcase ENC_ADD_ASIMDSAME_ONLY: return \"add_advsimd.xml\";\n\t\tcase ENC_ADD_ASISDSAME_ONLY: return \"add_advsimd.xml\";\n\t\tcase ENC_ADRP_ONLY_PCRELADDR: return \"adrp.xml\";\n\t\tcase ENC_ADR_ONLY_PCRELADDR: return \"adr.xml\";\n\t\tcase ENC_AESD_B_CRYPTOAES: return \"aesd_advsimd.xml\";\n\t\tcase ENC_AESE_B_CRYPTOAES: return \"aese_advsimd.xml\";\n\t\tcase ENC_AESIMC_B_CRYPTOAES: return \"aesimc_advsimd.xml\";\n\t\tcase ENC_AESMC_B_CRYPTOAES: return \"aesmc_advsimd.xml\";\n\t\tcase ENC_ANDS_32S_LOG_IMM: return \"ands_log_imm.xml\";\n\t\tcase ENC_ANDS_32_LOG_SHIFT: return \"ands_log_shift.xml\";\n\t\tcase ENC_ANDS_64S_LOG_IMM: return \"ands_log_imm.xml\";\n\t\tcase ENC_ANDS_64_LOG_SHIFT: return \"ands_log_shift.xml\";\n\t\tcase ENC_AND_32_LOG_IMM: return \"and_log_imm.xml\";\n\t\tcase ENC_AND_32_LOG_SHIFT: return \"and_log_shift.xml\";\n\t\tcase ENC_AND_64_LOG_IMM: return \"and_log_imm.xml\";\n\t\tcase ENC_AND_64_LOG_SHIFT: return \"and_log_shift.xml\";\n\t\tcase ENC_AND_ASIMDSAME_ONLY: return \"and_advsimd.xml\";\n\t\tcase ENC_ASRV_32_DP_2SRC: return \"asrv.xml\";\n\t\tcase ENC_ASRV_64_DP_2SRC: return \"asrv.xml\";\n\t\tcase ENC_ASR_ASRV_32_DP_2SRC: return \"asr_asrv.xml\";\n\t\tcase ENC_ASR_ASRV_64_DP_2SRC: return \"asr_asrv.xml\";\n\t\tcase ENC_ASR_SBFM_32M_BITFIELD: return \"asr_sbfm.xml\";\n\t\tcase ENC_ASR_SBFM_64M_BITFIELD: return \"asr_sbfm.xml\";\n\t\tcase ENC_AT_SYS_CR_SYSTEMINSTRS: return \"at_sys.xml\";\n\t\tcase ENC_AUTDA_64P_DP_1SRC: return \"autda.xml\";\n\t\tcase ENC_AUTDB_64P_DP_1SRC: return \"autdb.xml\";\n\t\tcase ENC_AUTDZA_64Z_DP_1SRC: return \"autda.xml\";\n\t\tcase ENC_AUTDZB_64Z_DP_1SRC: return \"autdb.xml\";\n\t\tcase ENC_AUTIA1716_HI_HINTS: return \"autia.xml\";\n\t\tcase ENC_AUTIASP_HI_HINTS: return \"autia.xml\";\n\t\tcase ENC_AUTIAZ_HI_HINTS: return \"autia.xml\";\n\t\tcase ENC_AUTIA_64P_DP_1SRC: return \"autia.xml\";\n\t\tcase ENC_AUTIB1716_HI_HINTS: return \"autib.xml\";\n\t\tcase ENC_AUTIBSP_HI_HINTS: return \"autib.xml\";\n\t\tcase ENC_AUTIBZ_HI_HINTS: return \"autib.xml\";\n\t\tcase ENC_AUTIB_64P_DP_1SRC: return \"autib.xml\";\n\t\tcase ENC_AUTIZA_64Z_DP_1SRC: return \"autia.xml\";\n\t\tcase ENC_AUTIZB_64Z_DP_1SRC: return \"autib.xml\";\n\t\tcase ENC_AXFLAG_M_PSTATE: return \"axflag.xml\";\n\t\tcase ENC_BCAX_VVV16_CRYPTO4: return \"bcax_advsimd.xml\";\n\t\tcase ENC_BFCVTN_ASIMDMISC_4S: return \"bfcvtn_advsimd.xml\";\n\t\tcase ENC_BFCVT_BS_FLOATDP1: return \"bfcvt_float.xml\";\n\t\tcase ENC_BFC_BFM_32M_BITFIELD: return \"bfc_bfm.xml\";\n\t\tcase ENC_BFC_BFM_64M_BITFIELD: return \"bfc_bfm.xml\";\n\t\tcase ENC_BFDOT_ASIMDELEM_E: return \"bfdot_advsimd_elt.xml\";\n\t\tcase ENC_BFDOT_ASIMDSAME2_D: return \"bfdot_advsimd_vec.xml\";\n\t\tcase ENC_BFI_BFM_32M_BITFIELD: return \"bfi_bfm.xml\";\n\t\tcase ENC_BFI_BFM_64M_BITFIELD: return \"bfi_bfm.xml\";\n\t\tcase ENC_BFMLAL_ASIMDELEM_F: return \"bfmlal_advsimd_elt.xml\";\n\t\tcase ENC_BFMLAL_ASIMDSAME2_F_: return \"bfmlal_advsimd_vec.xml\";\n\t\tcase ENC_BFMMLA_ASIMDSAME2_E: return \"bfmmla_advsimd.xml\";\n\t\tcase ENC_BFM_32M_BITFIELD: return \"bfm.xml\";\n\t\tcase ENC_BFM_64M_BITFIELD: return \"bfm.xml\";\n\t\tcase ENC_BFXIL_BFM_32M_BITFIELD: return \"bfxil_bfm.xml\";\n\t\tcase ENC_BFXIL_BFM_64M_BITFIELD: return \"bfxil_bfm.xml\";\n\t\tcase ENC_BICS_32_LOG_SHIFT: return \"bics.xml\";\n\t\tcase ENC_BICS_64_LOG_SHIFT: return \"bics.xml\";\n\t\tcase ENC_BIC_32_LOG_SHIFT: return \"bic_log_shift.xml\";\n\t\tcase ENC_BIC_64_LOG_SHIFT: return \"bic_log_shift.xml\";\n\t\tcase ENC_BIC_AND_Z_ZI_: return \"bic_and_z_zi.xml\";\n\t\tcase ENC_BIC_ASIMDIMM_L_HL: return \"bic_advsimd_imm.xml\";\n\t\tcase ENC_BIC_ASIMDIMM_L_SL: return \"bic_advsimd_imm.xml\";\n\t\tcase ENC_BIC_ASIMDSAME_ONLY: return \"bic_advsimd_reg.xml\";\n\t\tcase ENC_BIF_ASIMDSAME_ONLY: return \"bif_advsimd.xml\";\n\t\tcase ENC_BIT_ASIMDSAME_ONLY: return \"bit_advsimd.xml\";\n\t\tcase ENC_BLRAAZ_64_BRANCH_REG: return \"blra.xml\";\n\t\tcase ENC_BLRAA_64P_BRANCH_REG: return \"blra.xml\";\n\t\tcase ENC_BLRABZ_64_BRANCH_REG: return \"blra.xml\";\n\t\tcase ENC_BLRAB_64P_BRANCH_REG: return \"blra.xml\";\n\t\tcase ENC_BLR_64_BRANCH_REG: return \"blr.xml\";\n\t\tcase ENC_BL_ONLY_BRANCH_IMM: return \"bl.xml\";\n\t\tcase ENC_BRAAZ_64_BRANCH_REG: return \"bra.xml\";\n\t\tcase ENC_BRAA_64P_BRANCH_REG: return \"bra.xml\";\n\t\tcase ENC_BRABZ_64_BRANCH_REG: return \"bra.xml\";\n\t\tcase ENC_BRAB_64P_BRANCH_REG: return \"bra.xml\";\n\t\tcase ENC_BRK_EX_EXCEPTION: return \"brk.xml\";\n\t\tcase ENC_BR_64_BRANCH_REG: return \"br.xml\";\n\t\tcase ENC_BSL_ASIMDSAME_ONLY: return \"bsl_advsimd.xml\";\n\t\tcase ENC_BTI_HB_HINTS: return \"bti.xml\";\n\t\tcase ENC_B_ONLY_BRANCH_IMM: return \"b_uncond.xml\";\n\t\tcase ENC_B_ONLY_CONDBRANCH: return \"b_cond.xml\";\n\t\tcase ENC_CASAB_C32_COMSWAP: return \"casb.xml\";\n\t\tcase ENC_CASAH_C32_COMSWAP: return \"cash.xml\";\n\t\tcase ENC_CASALB_C32_COMSWAP: return \"casb.xml\";\n\t\tcase ENC_CASALH_C32_COMSWAP: return \"cash.xml\";\n\t\tcase ENC_CASAL_C32_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASAL_C64_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASA_C32_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASA_C64_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASB_C32_COMSWAP: return \"casb.xml\";\n\t\tcase ENC_CASH_C32_COMSWAP: return \"cash.xml\";\n\t\tcase ENC_CASLB_C32_COMSWAP: return \"casb.xml\";\n\t\tcase ENC_CASLH_C32_COMSWAP: return \"cash.xml\";\n\t\tcase ENC_CASL_C32_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASL_C64_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CASPAL_CP32_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASPAL_CP64_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASPA_CP32_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASPA_CP64_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASPL_CP32_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASPL_CP64_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASP_CP32_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CASP_CP64_COMSWAPPR: return \"casp.xml\";\n\t\tcase ENC_CAS_C32_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CAS_C64_COMSWAP: return \"cas.xml\";\n\t\tcase ENC_CBNZ_32_COMPBRANCH: return \"cbnz.xml\";\n\t\tcase ENC_CBNZ_64_COMPBRANCH: return \"cbnz.xml\";\n\t\tcase ENC_CBZ_32_COMPBRANCH: return \"cbz.xml\";\n\t\tcase ENC_CBZ_64_COMPBRANCH: return \"cbz.xml\";\n\t\tcase ENC_CCMN_32_CONDCMP_IMM: return \"ccmn_imm.xml\";\n\t\tcase ENC_CCMN_32_CONDCMP_REG: return \"ccmn_reg.xml\";\n\t\tcase ENC_CCMN_64_CONDCMP_IMM: return \"ccmn_imm.xml\";\n\t\tcase ENC_CCMN_64_CONDCMP_REG: return \"ccmn_reg.xml\";\n\t\tcase ENC_CCMP_32_CONDCMP_IMM: return \"ccmp_imm.xml\";\n\t\tcase ENC_CCMP_32_CONDCMP_REG: return \"ccmp_reg.xml\";\n\t\tcase ENC_CCMP_64_CONDCMP_IMM: return \"ccmp_imm.xml\";\n\t\tcase ENC_CCMP_64_CONDCMP_REG: return \"ccmp_reg.xml\";\n\t\tcase ENC_CFINV_M_PSTATE: return \"cfinv.xml\";\n\t\tcase ENC_CFP_SYS_CR_SYSTEMINSTRS: return \"cfp_sys.xml\";\n\t\tcase ENC_CINC_CSINC_32_CONDSEL: return \"cinc_csinc.xml\";\n\t\tcase ENC_CINC_CSINC_64_CONDSEL: return \"cinc_csinc.xml\";\n\t\tcase ENC_CINV_CSINV_32_CONDSEL: return \"cinv_csinv.xml\";\n\t\tcase ENC_CINV_CSINV_64_CONDSEL: return \"cinv_csinv.xml\";\n\t\tcase ENC_CLREX_BN_BARRIERS: return \"clrex.xml\";\n\t\tcase ENC_CLS_32_DP_1SRC: return \"cls_int.xml\";\n\t\tcase ENC_CLS_64_DP_1SRC: return \"cls_int.xml\";\n\t\tcase ENC_CLS_ASIMDMISC_R: return \"cls_advsimd.xml\";\n\t\tcase ENC_CLZ_32_DP_1SRC: return \"clz_int.xml\";\n\t\tcase ENC_CLZ_64_DP_1SRC: return \"clz_int.xml\";\n\t\tcase ENC_CLZ_ASIMDMISC_R: return \"clz_advsimd.xml\";\n\t\tcase ENC_CMEQ_ASIMDMISC_Z: return \"cmeq_advsimd_zero.xml\";\n\t\tcase ENC_CMEQ_ASIMDSAME_ONLY: return \"cmeq_advsimd_reg.xml\";\n\t\tcase ENC_CMEQ_ASISDMISC_Z: return \"cmeq_advsimd_zero.xml\";\n\t\tcase ENC_CMEQ_ASISDSAME_ONLY: return \"cmeq_advsimd_reg.xml\";\n\t\tcase ENC_CMGE_ASIMDMISC_Z: return \"cmge_advsimd_zero.xml\";\n\t\tcase ENC_CMGE_ASIMDSAME_ONLY: return \"cmge_advsimd_reg.xml\";\n\t\tcase ENC_CMGE_ASISDMISC_Z: return \"cmge_advsimd_zero.xml\";\n\t\tcase ENC_CMGE_ASISDSAME_ONLY: return \"cmge_advsimd_reg.xml\";\n\t\tcase ENC_CMGT_ASIMDMISC_Z: return \"cmgt_advsimd_zero.xml\";\n\t\tcase ENC_CMGT_ASIMDSAME_ONLY: return \"cmgt_advsimd_reg.xml\";\n\t\tcase ENC_CMGT_ASISDMISC_Z: return \"cmgt_advsimd_zero.xml\";\n\t\tcase ENC_CMGT_ASISDSAME_ONLY: return \"cmgt_advsimd_reg.xml\";\n\t\tcase ENC_CMHI_ASIMDSAME_ONLY: return \"cmhi_advsimd.xml\";\n\t\tcase ENC_CMHI_ASISDSAME_ONLY: return \"cmhi_advsimd.xml\";\n\t\tcase ENC_CMHS_ASIMDSAME_ONLY: return \"cmhs_advsimd.xml\";\n\t\tcase ENC_CMHS_ASISDSAME_ONLY: return \"cmhs_advsimd.xml\";\n\t\tcase ENC_CMLE_ASIMDMISC_Z: return \"cmle_advsimd.xml\";\n\t\tcase ENC_CMLE_ASISDMISC_Z: return \"cmle_advsimd.xml\";\n\t\tcase ENC_CMLT_ASIMDMISC_Z: return \"cmlt_advsimd.xml\";\n\t\tcase ENC_CMLT_ASISDMISC_Z: return \"cmlt_advsimd.xml\";\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_EXT: return \"cmn_adds_addsub_ext.xml\";\n\t\tcase ENC_CMN_ADDS_32S_ADDSUB_IMM: return \"cmn_adds_addsub_imm.xml\";\n\t\tcase ENC_CMN_ADDS_32_ADDSUB_SHIFT: return \"cmn_adds_addsub_shift.xml\";\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_EXT: return \"cmn_adds_addsub_ext.xml\";\n\t\tcase ENC_CMN_ADDS_64S_ADDSUB_IMM: return \"cmn_adds_addsub_imm.xml\";\n\t\tcase ENC_CMN_ADDS_64_ADDSUB_SHIFT: return \"cmn_adds_addsub_shift.xml\";\n\t\tcase ENC_CMPLE_CMPGE_P_P_ZZ_: return \"cmple_cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPLO_CMPHI_P_P_ZZ_: return \"cmplo_cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPLS_CMPHS_P_P_ZZ_: return \"cmpls_cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPLT_CMPGT_P_P_ZZ_: return \"cmplt_cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPP_SUBPS_64S_DP_2SRC: return \"cmpp_subps.xml\";\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_EXT: return \"cmp_subs_addsub_ext.xml\";\n\t\tcase ENC_CMP_SUBS_32S_ADDSUB_IMM: return \"cmp_subs_addsub_imm.xml\";\n\t\tcase ENC_CMP_SUBS_32_ADDSUB_SHIFT: return \"cmp_subs_addsub_shift.xml\";\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_EXT: return \"cmp_subs_addsub_ext.xml\";\n\t\tcase ENC_CMP_SUBS_64S_ADDSUB_IMM: return \"cmp_subs_addsub_imm.xml\";\n\t\tcase ENC_CMP_SUBS_64_ADDSUB_SHIFT: return \"cmp_subs_addsub_shift.xml\";\n\t\tcase ENC_CMTST_ASIMDSAME_ONLY: return \"cmtst_advsimd.xml\";\n\t\tcase ENC_CMTST_ASISDSAME_ONLY: return \"cmtst_advsimd.xml\";\n\t\tcase ENC_CNEG_CSNEG_32_CONDSEL: return \"cneg_csneg.xml\";\n\t\tcase ENC_CNEG_CSNEG_64_CONDSEL: return \"cneg_csneg.xml\";\n\t\tcase ENC_CNT_ASIMDMISC_R: return \"cnt_advsimd.xml\";\n\t\tcase ENC_CPP_SYS_CR_SYSTEMINSTRS: return \"cpp_sys.xml\";\n\t\tcase ENC_CRC32B_32C_DP_2SRC: return \"crc32.xml\";\n\t\tcase ENC_CRC32CB_32C_DP_2SRC: return \"crc32c.xml\";\n\t\tcase ENC_CRC32CH_32C_DP_2SRC: return \"crc32c.xml\";\n\t\tcase ENC_CRC32CW_32C_DP_2SRC: return \"crc32c.xml\";\n\t\tcase ENC_CRC32CX_64C_DP_2SRC: return \"crc32c.xml\";\n\t\tcase ENC_CRC32H_32C_DP_2SRC: return \"crc32.xml\";\n\t\tcase ENC_CRC32W_32C_DP_2SRC: return \"crc32.xml\";\n\t\tcase ENC_CRC32X_64C_DP_2SRC: return \"crc32.xml\";\n\t\tcase ENC_CSDB_HI_HINTS: return \"csdb.xml\";\n\t\tcase ENC_CSEL_32_CONDSEL: return \"csel.xml\";\n\t\tcase ENC_CSEL_64_CONDSEL: return \"csel.xml\";\n\t\tcase ENC_CSETM_CSINV_32_CONDSEL: return \"csetm_csinv.xml\";\n\t\tcase ENC_CSETM_CSINV_64_CONDSEL: return \"csetm_csinv.xml\";\n\t\tcase ENC_CSET_CSINC_32_CONDSEL: return \"cset_csinc.xml\";\n\t\tcase ENC_CSET_CSINC_64_CONDSEL: return \"cset_csinc.xml\";\n\t\tcase ENC_CSINC_32_CONDSEL: return \"csinc.xml\";\n\t\tcase ENC_CSINC_64_CONDSEL: return \"csinc.xml\";\n\t\tcase ENC_CSINV_32_CONDSEL: return \"csinv.xml\";\n\t\tcase ENC_CSINV_64_CONDSEL: return \"csinv.xml\";\n\t\tcase ENC_CSNEG_32_CONDSEL: return \"csneg.xml\";\n\t\tcase ENC_CSNEG_64_CONDSEL: return \"csneg.xml\";\n\t\tcase ENC_DCPS1_DC_EXCEPTION: return \"dcps1.xml\";\n\t\tcase ENC_DCPS2_DC_EXCEPTION: return \"dcps2.xml\";\n\t\tcase ENC_DCPS3_DC_EXCEPTION: return \"dcps3.xml\";\n\t\tcase ENC_DC_SYS_CR_SYSTEMINSTRS: return \"dc_sys.xml\";\n\t\tcase ENC_DGH_HI_HINTS: return \"dgh.xml\";\n\t\tcase ENC_DMB_BO_BARRIERS: return \"dmb.xml\";\n\t\tcase ENC_DRPS_64E_BRANCH_REG: return \"drps.xml\";\n\t\tcase ENC_DSB_BO_BARRIERS: return \"dsb.xml\";\n\t\tcase ENC_DSB_BON_BARRIERS: return \"dsb.xml\";\n\t\tcase ENC_DUP_ASIMDINS_DR_R: return \"dup_advsimd_gen.xml\";\n\t\tcase ENC_DUP_ASIMDINS_DV_V: return \"dup_advsimd_elt.xml\";\n\t\tcase ENC_DUP_ASISDONE_ONLY: return \"dup_advsimd_elt.xml\";\n\t\tcase ENC_DVP_SYS_CR_SYSTEMINSTRS: return \"dvp_sys.xml\";\n\t\tcase ENC_EON_32_LOG_SHIFT: return \"eon.xml\";\n\t\tcase ENC_EON_64_LOG_SHIFT: return \"eon.xml\";\n\t\tcase ENC_EON_EOR_Z_ZI_: return \"eon_eor_z_zi.xml\";\n\t\tcase ENC_EOR3_VVV16_CRYPTO4: return \"eor3_advsimd.xml\";\n\t\tcase ENC_EOR_32_LOG_IMM: return \"eor_log_imm.xml\";\n\t\tcase ENC_EOR_32_LOG_SHIFT: return \"eor_log_shift.xml\";\n\t\tcase ENC_EOR_64_LOG_IMM: return \"eor_log_imm.xml\";\n\t\tcase ENC_EOR_64_LOG_SHIFT: return \"eor_log_shift.xml\";\n\t\tcase ENC_EOR_ASIMDSAME_ONLY: return \"eor_advsimd.xml\";\n\t\tcase ENC_ERETAA_64E_BRANCH_REG: return \"ereta.xml\";\n\t\tcase ENC_ERETAB_64E_BRANCH_REG: return \"ereta.xml\";\n\t\tcase ENC_ERET_64E_BRANCH_REG: return \"eret.xml\";\n\t\tcase ENC_ESB_HI_HINTS: return \"esb.xml\";\n\t\tcase ENC_EXTR_32_EXTRACT: return \"extr.xml\";\n\t\tcase ENC_EXTR_64_EXTRACT: return \"extr.xml\";\n\t\tcase ENC_EXT_ASIMDEXT_ONLY: return \"ext_advsimd.xml\";\n\t\tcase ENC_FABD_ASIMDSAME_ONLY: return \"fabd_advsimd.xml\";\n\t\tcase ENC_FABD_ASIMDSAMEFP16_ONLY: return \"fabd_advsimd.xml\";\n\t\tcase ENC_FABD_ASISDSAME_ONLY: return \"fabd_advsimd.xml\";\n\t\tcase ENC_FABD_ASISDSAMEFP16_ONLY: return \"fabd_advsimd.xml\";\n\t\tcase ENC_FABS_D_FLOATDP1: return \"fabs_float.xml\";\n\t\tcase ENC_FABS_H_FLOATDP1: return \"fabs_float.xml\";\n\t\tcase ENC_FABS_S_FLOATDP1: return \"fabs_float.xml\";\n\t\tcase ENC_FABS_ASIMDMISC_R: return \"fabs_advsimd.xml\";\n\t\tcase ENC_FABS_ASIMDMISCFP16_R: return \"fabs_advsimd.xml\";\n\t\tcase ENC_FACGE_ASIMDSAME_ONLY: return \"facge_advsimd.xml\";\n\t\tcase ENC_FACGE_ASIMDSAMEFP16_ONLY: return \"facge_advsimd.xml\";\n\t\tcase ENC_FACGE_ASISDSAME_ONLY: return \"facge_advsimd.xml\";\n\t\tcase ENC_FACGE_ASISDSAMEFP16_ONLY: return \"facge_advsimd.xml\";\n\t\tcase ENC_FACGT_ASIMDSAME_ONLY: return \"facgt_advsimd.xml\";\n\t\tcase ENC_FACGT_ASIMDSAMEFP16_ONLY: return \"facgt_advsimd.xml\";\n\t\tcase ENC_FACGT_ASISDSAME_ONLY: return \"facgt_advsimd.xml\";\n\t\tcase ENC_FACGT_ASISDSAMEFP16_ONLY: return \"facgt_advsimd.xml\";\n\t\tcase ENC_FACLE_FACGE_P_P_ZZ_: return \"facle_facge_p_p_zz.xml\";\n\t\tcase ENC_FACLT_FACGT_P_P_ZZ_: return \"faclt_facge_p_p_zz.xml\";\n\t\tcase ENC_FADDP_ASIMDSAME_ONLY: return \"faddp_advsimd_vec.xml\";\n\t\tcase ENC_FADDP_ASIMDSAMEFP16_ONLY: return \"faddp_advsimd_vec.xml\";\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_H: return \"faddp_advsimd_pair.xml\";\n\t\tcase ENC_FADDP_ASISDPAIR_ONLY_SD: return \"faddp_advsimd_pair.xml\";\n\t\tcase ENC_FADD_D_FLOATDP2: return \"fadd_float.xml\";\n\t\tcase ENC_FADD_H_FLOATDP2: return \"fadd_float.xml\";\n\t\tcase ENC_FADD_S_FLOATDP2: return \"fadd_float.xml\";\n\t\tcase ENC_FADD_ASIMDSAME_ONLY: return \"fadd_advsimd.xml\";\n\t\tcase ENC_FADD_ASIMDSAMEFP16_ONLY: return \"fadd_advsimd.xml\";\n\t\tcase ENC_FCADD_ASIMDSAME2_C: return \"fcadd_advsimd_vec.xml\";\n\t\tcase ENC_FCCMPE_D_FLOATCCMP: return \"fccmpe_float.xml\";\n\t\tcase ENC_FCCMPE_H_FLOATCCMP: return \"fccmpe_float.xml\";\n\t\tcase ENC_FCCMPE_S_FLOATCCMP: return \"fccmpe_float.xml\";\n\t\tcase ENC_FCCMP_D_FLOATCCMP: return \"fccmp_float.xml\";\n\t\tcase ENC_FCCMP_H_FLOATCCMP: return \"fccmp_float.xml\";\n\t\tcase ENC_FCCMP_S_FLOATCCMP: return \"fccmp_float.xml\";\n\t\tcase ENC_FCMEQ_ASIMDMISC_FZ: return \"fcmeq_advsimd_zero.xml\";\n\t\tcase ENC_FCMEQ_ASIMDMISCFP16_FZ: return \"fcmeq_advsimd_zero.xml\";\n\t\tcase ENC_FCMEQ_ASIMDSAME_ONLY: return \"fcmeq_advsimd_reg.xml\";\n\t\tcase ENC_FCMEQ_ASIMDSAMEFP16_ONLY: return \"fcmeq_advsimd_reg.xml\";\n\t\tcase ENC_FCMEQ_ASISDMISC_FZ: return \"fcmeq_advsimd_zero.xml\";\n\t\tcase ENC_FCMEQ_ASISDMISCFP16_FZ: return \"fcmeq_advsimd_zero.xml\";\n\t\tcase ENC_FCMEQ_ASISDSAME_ONLY: return \"fcmeq_advsimd_reg.xml\";\n\t\tcase ENC_FCMEQ_ASISDSAMEFP16_ONLY: return \"fcmeq_advsimd_reg.xml\";\n\t\tcase ENC_FCMGE_ASIMDMISC_FZ: return \"fcmge_advsimd_zero.xml\";\n\t\tcase ENC_FCMGE_ASIMDMISCFP16_FZ: return \"fcmge_advsimd_zero.xml\";\n\t\tcase ENC_FCMGE_ASIMDSAME_ONLY: return \"fcmge_advsimd_reg.xml\";\n\t\tcase ENC_FCMGE_ASIMDSAMEFP16_ONLY: return \"fcmge_advsimd_reg.xml\";\n\t\tcase ENC_FCMGE_ASISDMISC_FZ: return \"fcmge_advsimd_zero.xml\";\n\t\tcase ENC_FCMGE_ASISDMISCFP16_FZ: return \"fcmge_advsimd_zero.xml\";\n\t\tcase ENC_FCMGE_ASISDSAME_ONLY: return \"fcmge_advsimd_reg.xml\";\n\t\tcase ENC_FCMGE_ASISDSAMEFP16_ONLY: return \"fcmge_advsimd_reg.xml\";\n\t\tcase ENC_FCMGT_ASIMDMISC_FZ: return \"fcmgt_advsimd_zero.xml\";\n\t\tcase ENC_FCMGT_ASIMDMISCFP16_FZ: return \"fcmgt_advsimd_zero.xml\";\n\t\tcase ENC_FCMGT_ASIMDSAME_ONLY: return \"fcmgt_advsimd_reg.xml\";\n\t\tcase ENC_FCMGT_ASIMDSAMEFP16_ONLY: return \"fcmgt_advsimd_reg.xml\";\n\t\tcase ENC_FCMGT_ASISDMISC_FZ: return \"fcmgt_advsimd_zero.xml\";\n\t\tcase ENC_FCMGT_ASISDMISCFP16_FZ: return \"fcmgt_advsimd_zero.xml\";\n\t\tcase ENC_FCMGT_ASISDSAME_ONLY: return \"fcmgt_advsimd_reg.xml\";\n\t\tcase ENC_FCMGT_ASISDSAMEFP16_ONLY: return \"fcmgt_advsimd_reg.xml\";\n\t\tcase ENC_FCMLA_ASIMDELEM_C_H: return \"fcmla_advsimd_elt.xml\";\n\t\tcase ENC_FCMLA_ASIMDELEM_C_S: return \"fcmla_advsimd_elt.xml\";\n\t\tcase ENC_FCMLA_ASIMDSAME2_C: return \"fcmla_advsimd_vec.xml\";\n\t\tcase ENC_FCMLE_ASIMDMISC_FZ: return \"fcmle_advsimd.xml\";\n\t\tcase ENC_FCMLE_ASIMDMISCFP16_FZ: return \"fcmle_advsimd.xml\";\n\t\tcase ENC_FCMLE_ASISDMISC_FZ: return \"fcmle_advsimd.xml\";\n\t\tcase ENC_FCMLE_ASISDMISCFP16_FZ: return \"fcmle_advsimd.xml\";\n\t\tcase ENC_FCMLE_FCMGE_P_P_ZZ_: return \"fcmle_fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMLT_ASIMDMISC_FZ: return \"fcmlt_advsimd.xml\";\n\t\tcase ENC_FCMLT_ASIMDMISCFP16_FZ: return \"fcmlt_advsimd.xml\";\n\t\tcase ENC_FCMLT_ASISDMISC_FZ: return \"fcmlt_advsimd.xml\";\n\t\tcase ENC_FCMLT_ASISDMISCFP16_FZ: return \"fcmlt_advsimd.xml\";\n\t\tcase ENC_FCMLT_FCMGT_P_P_ZZ_: return \"fcmlt_fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMPE_DZ_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMPE_D_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMPE_HZ_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMPE_H_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMPE_SZ_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMPE_S_FLOATCMP: return \"fcmpe_float.xml\";\n\t\tcase ENC_FCMP_DZ_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCMP_D_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCMP_HZ_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCMP_H_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCMP_SZ_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCMP_S_FLOATCMP: return \"fcmp_float.xml\";\n\t\tcase ENC_FCSEL_D_FLOATSEL: return \"fcsel_float.xml\";\n\t\tcase ENC_FCSEL_H_FLOATSEL: return \"fcsel_float.xml\";\n\t\tcase ENC_FCSEL_S_FLOATSEL: return \"fcsel_float.xml\";\n\t\tcase ENC_FCVTAS_32D_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_32H_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_32S_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_64D_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_64H_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_64S_FLOAT2INT: return \"fcvtas_float.xml\";\n\t\tcase ENC_FCVTAS_ASIMDMISC_R: return \"fcvtas_advsimd.xml\";\n\t\tcase ENC_FCVTAS_ASIMDMISCFP16_R: return \"fcvtas_advsimd.xml\";\n\t\tcase ENC_FCVTAS_ASISDMISC_R: return \"fcvtas_advsimd.xml\";\n\t\tcase ENC_FCVTAS_ASISDMISCFP16_R: return \"fcvtas_advsimd.xml\";\n\t\tcase ENC_FCVTAU_32D_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_32H_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_32S_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_64D_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_64H_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_64S_FLOAT2INT: return \"fcvtau_float.xml\";\n\t\tcase ENC_FCVTAU_ASIMDMISC_R: return \"fcvtau_advsimd.xml\";\n\t\tcase ENC_FCVTAU_ASIMDMISCFP16_R: return \"fcvtau_advsimd.xml\";\n\t\tcase ENC_FCVTAU_ASISDMISC_R: return \"fcvtau_advsimd.xml\";\n\t\tcase ENC_FCVTAU_ASISDMISCFP16_R: return \"fcvtau_advsimd.xml\";\n\t\tcase ENC_FCVTL_ASIMDMISC_L: return \"fcvtl_advsimd.xml\";\n\t\tcase ENC_FCVTMS_32D_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_32H_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_32S_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_64D_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_64H_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_64S_FLOAT2INT: return \"fcvtms_float.xml\";\n\t\tcase ENC_FCVTMS_ASIMDMISC_R: return \"fcvtms_advsimd.xml\";\n\t\tcase ENC_FCVTMS_ASIMDMISCFP16_R: return \"fcvtms_advsimd.xml\";\n\t\tcase ENC_FCVTMS_ASISDMISC_R: return \"fcvtms_advsimd.xml\";\n\t\tcase ENC_FCVTMS_ASISDMISCFP16_R: return \"fcvtms_advsimd.xml\";\n\t\tcase ENC_FCVTMU_32D_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_32H_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_32S_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_64D_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_64H_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_64S_FLOAT2INT: return \"fcvtmu_float.xml\";\n\t\tcase ENC_FCVTMU_ASIMDMISC_R: return \"fcvtmu_advsimd.xml\";\n\t\tcase ENC_FCVTMU_ASIMDMISCFP16_R: return \"fcvtmu_advsimd.xml\";\n\t\tcase ENC_FCVTMU_ASISDMISC_R: return \"fcvtmu_advsimd.xml\";\n\t\tcase ENC_FCVTMU_ASISDMISCFP16_R: return \"fcvtmu_advsimd.xml\";\n\t\tcase ENC_FCVTNS_32D_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_32H_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_32S_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_64D_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_64H_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_64S_FLOAT2INT: return \"fcvtns_float.xml\";\n\t\tcase ENC_FCVTNS_ASIMDMISC_R: return \"fcvtns_advsimd.xml\";\n\t\tcase ENC_FCVTNS_ASIMDMISCFP16_R: return \"fcvtns_advsimd.xml\";\n\t\tcase ENC_FCVTNS_ASISDMISC_R: return \"fcvtns_advsimd.xml\";\n\t\tcase ENC_FCVTNS_ASISDMISCFP16_R: return \"fcvtns_advsimd.xml\";\n\t\tcase ENC_FCVTNU_32D_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_32H_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_32S_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_64D_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_64H_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_64S_FLOAT2INT: return \"fcvtnu_float.xml\";\n\t\tcase ENC_FCVTNU_ASIMDMISC_R: return \"fcvtnu_advsimd.xml\";\n\t\tcase ENC_FCVTNU_ASIMDMISCFP16_R: return \"fcvtnu_advsimd.xml\";\n\t\tcase ENC_FCVTNU_ASISDMISC_R: return \"fcvtnu_advsimd.xml\";\n\t\tcase ENC_FCVTNU_ASISDMISCFP16_R: return \"fcvtnu_advsimd.xml\";\n\t\tcase ENC_FCVTN_ASIMDMISC_N: return \"fcvtn_advsimd.xml\";\n\t\tcase ENC_FCVTPS_32D_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_32H_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_32S_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_64D_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_64H_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_64S_FLOAT2INT: return \"fcvtps_float.xml\";\n\t\tcase ENC_FCVTPS_ASIMDMISC_R: return \"fcvtps_advsimd.xml\";\n\t\tcase ENC_FCVTPS_ASIMDMISCFP16_R: return \"fcvtps_advsimd.xml\";\n\t\tcase ENC_FCVTPS_ASISDMISC_R: return \"fcvtps_advsimd.xml\";\n\t\tcase ENC_FCVTPS_ASISDMISCFP16_R: return \"fcvtps_advsimd.xml\";\n\t\tcase ENC_FCVTPU_32D_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_32H_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_32S_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_64D_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_64H_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_64S_FLOAT2INT: return \"fcvtpu_float.xml\";\n\t\tcase ENC_FCVTPU_ASIMDMISC_R: return \"fcvtpu_advsimd.xml\";\n\t\tcase ENC_FCVTPU_ASIMDMISCFP16_R: return \"fcvtpu_advsimd.xml\";\n\t\tcase ENC_FCVTPU_ASISDMISC_R: return \"fcvtpu_advsimd.xml\";\n\t\tcase ENC_FCVTPU_ASISDMISCFP16_R: return \"fcvtpu_advsimd.xml\";\n\t\tcase ENC_FCVTXN_ASIMDMISC_N: return \"fcvtxn_advsimd.xml\";\n\t\tcase ENC_FCVTXN_ASISDMISC_N: return \"fcvtxn_advsimd.xml\";\n\t\tcase ENC_FCVTZS_32D_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_32D_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_32H_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_32H_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_32S_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_32S_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_64D_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_64D_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_64H_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_64H_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_64S_FLOAT2FIX: return \"fcvtzs_float_fix.xml\";\n\t\tcase ENC_FCVTZS_64S_FLOAT2INT: return \"fcvtzs_float_int.xml\";\n\t\tcase ENC_FCVTZS_ASIMDMISC_R: return \"fcvtzs_advsimd_int.xml\";\n\t\tcase ENC_FCVTZS_ASIMDMISCFP16_R: return \"fcvtzs_advsimd_int.xml\";\n\t\tcase ENC_FCVTZS_ASIMDSHF_C: return \"fcvtzs_advsimd_fix.xml\";\n\t\tcase ENC_FCVTZS_ASISDMISC_R: return \"fcvtzs_advsimd_int.xml\";\n\t\tcase ENC_FCVTZS_ASISDMISCFP16_R: return \"fcvtzs_advsimd_int.xml\";\n\t\tcase ENC_FCVTZS_ASISDSHF_C: return \"fcvtzs_advsimd_fix.xml\";\n\t\tcase ENC_FCVTZU_32D_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_32D_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_32H_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_32H_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_32S_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_32S_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_64D_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_64D_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_64H_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_64H_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_64S_FLOAT2FIX: return \"fcvtzu_float_fix.xml\";\n\t\tcase ENC_FCVTZU_64S_FLOAT2INT: return \"fcvtzu_float_int.xml\";\n\t\tcase ENC_FCVTZU_ASIMDMISC_R: return \"fcvtzu_advsimd_int.xml\";\n\t\tcase ENC_FCVTZU_ASIMDMISCFP16_R: return \"fcvtzu_advsimd_int.xml\";\n\t\tcase ENC_FCVTZU_ASIMDSHF_C: return \"fcvtzu_advsimd_fix.xml\";\n\t\tcase ENC_FCVTZU_ASISDMISC_R: return \"fcvtzu_advsimd_int.xml\";\n\t\tcase ENC_FCVTZU_ASISDMISCFP16_R: return \"fcvtzu_advsimd_int.xml\";\n\t\tcase ENC_FCVTZU_ASISDSHF_C: return \"fcvtzu_advsimd_fix.xml\";\n\t\tcase ENC_FCVT_DH_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FCVT_DS_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FCVT_HD_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FCVT_HS_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FCVT_SD_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FCVT_SH_FLOATDP1: return \"fcvt_float.xml\";\n\t\tcase ENC_FDIV_D_FLOATDP2: return \"fdiv_float.xml\";\n\t\tcase ENC_FDIV_H_FLOATDP2: return \"fdiv_float.xml\";\n\t\tcase ENC_FDIV_S_FLOATDP2: return \"fdiv_float.xml\";\n\t\tcase ENC_FDIV_ASIMDSAME_ONLY: return \"fdiv_advsimd.xml\";\n\t\tcase ENC_FDIV_ASIMDSAMEFP16_ONLY: return \"fdiv_advsimd.xml\";\n\t\tcase ENC_FJCVTZS_32D_FLOAT2INT: return \"fjcvtzs.xml\";\n\t\tcase ENC_FMADD_D_FLOATDP3: return \"fmadd_float.xml\";\n\t\tcase ENC_FMADD_H_FLOATDP3: return \"fmadd_float.xml\";\n\t\tcase ENC_FMADD_S_FLOATDP3: return \"fmadd_float.xml\";\n\t\tcase ENC_FMAXNMP_ASIMDSAME_ONLY: return \"fmaxnmp_advsimd_vec.xml\";\n\t\tcase ENC_FMAXNMP_ASIMDSAMEFP16_ONLY: return \"fmaxnmp_advsimd_vec.xml\";\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_H: return \"fmaxnmp_advsimd_pair.xml\";\n\t\tcase ENC_FMAXNMP_ASISDPAIR_ONLY_SD: return \"fmaxnmp_advsimd_pair.xml\";\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_H: return \"fmaxnmv_advsimd.xml\";\n\t\tcase ENC_FMAXNMV_ASIMDALL_ONLY_SD: return \"fmaxnmv_advsimd.xml\";\n\t\tcase ENC_FMAXNM_D_FLOATDP2: return \"fmaxnm_float.xml\";\n\t\tcase ENC_FMAXNM_H_FLOATDP2: return \"fmaxnm_float.xml\";\n\t\tcase ENC_FMAXNM_S_FLOATDP2: return \"fmaxnm_float.xml\";\n\t\tcase ENC_FMAXNM_ASIMDSAME_ONLY: return \"fmaxnm_advsimd.xml\";\n\t\tcase ENC_FMAXNM_ASIMDSAMEFP16_ONLY: return \"fmaxnm_advsimd.xml\";\n\t\tcase ENC_FMAXP_ASIMDSAME_ONLY: return \"fmaxp_advsimd_vec.xml\";\n\t\tcase ENC_FMAXP_ASIMDSAMEFP16_ONLY: return \"fmaxp_advsimd_vec.xml\";\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_H: return \"fmaxp_advsimd_pair.xml\";\n\t\tcase ENC_FMAXP_ASISDPAIR_ONLY_SD: return \"fmaxp_advsimd_pair.xml\";\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_H: return \"fmaxv_advsimd.xml\";\n\t\tcase ENC_FMAXV_ASIMDALL_ONLY_SD: return \"fmaxv_advsimd.xml\";\n\t\tcase ENC_FMAX_D_FLOATDP2: return \"fmax_float.xml\";\n\t\tcase ENC_FMAX_H_FLOATDP2: return \"fmax_float.xml\";\n\t\tcase ENC_FMAX_S_FLOATDP2: return \"fmax_float.xml\";\n\t\tcase ENC_FMAX_ASIMDSAME_ONLY: return \"fmax_advsimd.xml\";\n\t\tcase ENC_FMAX_ASIMDSAMEFP16_ONLY: return \"fmax_advsimd.xml\";\n\t\tcase ENC_FMINNMP_ASIMDSAME_ONLY: return \"fminnmp_advsimd_vec.xml\";\n\t\tcase ENC_FMINNMP_ASIMDSAMEFP16_ONLY: return \"fminnmp_advsimd_vec.xml\";\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_H: return \"fminnmp_advsimd_pair.xml\";\n\t\tcase ENC_FMINNMP_ASISDPAIR_ONLY_SD: return \"fminnmp_advsimd_pair.xml\";\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_H: return \"fminnmv_advsimd.xml\";\n\t\tcase ENC_FMINNMV_ASIMDALL_ONLY_SD: return \"fminnmv_advsimd.xml\";\n\t\tcase ENC_FMINNM_D_FLOATDP2: return \"fminnm_float.xml\";\n\t\tcase ENC_FMINNM_H_FLOATDP2: return \"fminnm_float.xml\";\n\t\tcase ENC_FMINNM_S_FLOATDP2: return \"fminnm_float.xml\";\n\t\tcase ENC_FMINNM_ASIMDSAME_ONLY: return \"fminnm_advsimd.xml\";\n\t\tcase ENC_FMINNM_ASIMDSAMEFP16_ONLY: return \"fminnm_advsimd.xml\";\n\t\tcase ENC_FMINP_ASIMDSAME_ONLY: return \"fminp_advsimd_vec.xml\";\n\t\tcase ENC_FMINP_ASIMDSAMEFP16_ONLY: return \"fminp_advsimd_vec.xml\";\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_H: return \"fminp_advsimd_pair.xml\";\n\t\tcase ENC_FMINP_ASISDPAIR_ONLY_SD: return \"fminp_advsimd_pair.xml\";\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_H: return \"fminv_advsimd.xml\";\n\t\tcase ENC_FMINV_ASIMDALL_ONLY_SD: return \"fminv_advsimd.xml\";\n\t\tcase ENC_FMIN_D_FLOATDP2: return \"fmin_float.xml\";\n\t\tcase ENC_FMIN_H_FLOATDP2: return \"fmin_float.xml\";\n\t\tcase ENC_FMIN_S_FLOATDP2: return \"fmin_float.xml\";\n\t\tcase ENC_FMIN_ASIMDSAME_ONLY: return \"fmin_advsimd.xml\";\n\t\tcase ENC_FMIN_ASIMDSAMEFP16_ONLY: return \"fmin_advsimd.xml\";\n\t\tcase ENC_FMLAL2_ASIMDELEM_LH: return \"fmlal_advsimd_elt.xml\";\n\t\tcase ENC_FMLAL2_ASIMDSAME_F: return \"fmlal_advsimd_vec.xml\";\n\t\tcase ENC_FMLAL_ASIMDELEM_LH: return \"fmlal_advsimd_elt.xml\";\n\t\tcase ENC_FMLAL_ASIMDSAME_F: return \"fmlal_advsimd_vec.xml\";\n\t\tcase ENC_FMLA_ASIMDELEM_RH_H: return \"fmla_advsimd_elt.xml\";\n\t\tcase ENC_FMLA_ASIMDELEM_R_SD: return \"fmla_advsimd_elt.xml\";\n\t\tcase ENC_FMLA_ASIMDSAME_ONLY: return \"fmla_advsimd_vec.xml\";\n\t\tcase ENC_FMLA_ASIMDSAMEFP16_ONLY: return \"fmla_advsimd_vec.xml\";\n\t\tcase ENC_FMLA_ASISDELEM_RH_H: return \"fmla_advsimd_elt.xml\";\n\t\tcase ENC_FMLA_ASISDELEM_R_SD: return \"fmla_advsimd_elt.xml\";\n\t\tcase ENC_FMLSL2_ASIMDELEM_LH: return \"fmlsl_advsimd_elt.xml\";\n\t\tcase ENC_FMLSL2_ASIMDSAME_F: return \"fmlsl_advsimd_vec.xml\";\n\t\tcase ENC_FMLSL_ASIMDELEM_LH: return \"fmlsl_advsimd_elt.xml\";\n\t\tcase ENC_FMLSL_ASIMDSAME_F: return \"fmlsl_advsimd_vec.xml\";\n\t\tcase ENC_FMLS_ASIMDELEM_RH_H: return \"fmls_advsimd_elt.xml\";\n\t\tcase ENC_FMLS_ASIMDELEM_R_SD: return \"fmls_advsimd_elt.xml\";\n\t\tcase ENC_FMLS_ASIMDSAME_ONLY: return \"fmls_advsimd_vec.xml\";\n\t\tcase ENC_FMLS_ASIMDSAMEFP16_ONLY: return \"fmls_advsimd_vec.xml\";\n\t\tcase ENC_FMLS_ASISDELEM_RH_H: return \"fmls_advsimd_elt.xml\";\n\t\tcase ENC_FMLS_ASISDELEM_R_SD: return \"fmls_advsimd_elt.xml\";\n\t\tcase ENC_FMOV_32H_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_32S_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_64D_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_64H_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_64VX_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_D64_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_D_FLOATDP1: return \"fmov_float.xml\";\n\t\tcase ENC_FMOV_D_FLOATIMM: return \"fmov_float_imm.xml\";\n\t\tcase ENC_FMOV_H32_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_H64_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_H_FLOATDP1: return \"fmov_float.xml\";\n\t\tcase ENC_FMOV_H_FLOATIMM: return \"fmov_float_imm.xml\";\n\t\tcase ENC_FMOV_S32_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_S_FLOATDP1: return \"fmov_float.xml\";\n\t\tcase ENC_FMOV_S_FLOATIMM: return \"fmov_float_imm.xml\";\n\t\tcase ENC_FMOV_V64I_FLOAT2INT: return \"fmov_float_gen.xml\";\n\t\tcase ENC_FMOV_ASIMDIMM_D2_D: return \"fmov_advsimd.xml\";\n\t\tcase ENC_FMOV_ASIMDIMM_H_H: return \"fmov_advsimd.xml\";\n\t\tcase ENC_FMOV_ASIMDIMM_S_S: return \"fmov_advsimd.xml\";\n\t\tcase ENC_FMOV_CPY_Z_P_I_: return \"fmov_cpy_z_p_i.xml\";\n\t\tcase ENC_FMOV_DUP_Z_I_: return \"fmov_dup_z_i.xml\";\n\t\tcase ENC_FMOV_FCPY_Z_P_I_: return \"fmov_fcpy_z_p_i.xml\";\n\t\tcase ENC_FMOV_FDUP_Z_I_: return \"fmov_fdup_z_i.xml\";\n\t\tcase ENC_FMSUB_D_FLOATDP3: return \"fmsub_float.xml\";\n\t\tcase ENC_FMSUB_H_FLOATDP3: return \"fmsub_float.xml\";\n\t\tcase ENC_FMSUB_S_FLOATDP3: return \"fmsub_float.xml\";\n\t\tcase ENC_FMULX_ASIMDELEM_RH_H: return \"fmulx_advsimd_elt.xml\";\n\t\tcase ENC_FMULX_ASIMDELEM_R_SD: return \"fmulx_advsimd_elt.xml\";\n\t\tcase ENC_FMULX_ASIMDSAME_ONLY: return \"fmulx_advsimd_vec.xml\";\n\t\tcase ENC_FMULX_ASIMDSAMEFP16_ONLY: return \"fmulx_advsimd_vec.xml\";\n\t\tcase ENC_FMULX_ASISDELEM_RH_H: return \"fmulx_advsimd_elt.xml\";\n\t\tcase ENC_FMULX_ASISDELEM_R_SD: return \"fmulx_advsimd_elt.xml\";\n\t\tcase ENC_FMULX_ASISDSAME_ONLY: return \"fmulx_advsimd_vec.xml\";\n\t\tcase ENC_FMULX_ASISDSAMEFP16_ONLY: return \"fmulx_advsimd_vec.xml\";\n\t\tcase ENC_FMUL_D_FLOATDP2: return \"fmul_float.xml\";\n\t\tcase ENC_FMUL_H_FLOATDP2: return \"fmul_float.xml\";\n\t\tcase ENC_FMUL_S_FLOATDP2: return \"fmul_float.xml\";\n\t\tcase ENC_FMUL_ASIMDELEM_RH_H: return \"fmul_advsimd_elt.xml\";\n\t\tcase ENC_FMUL_ASIMDELEM_R_SD: return \"fmul_advsimd_elt.xml\";\n\t\tcase ENC_FMUL_ASIMDSAME_ONLY: return \"fmul_advsimd_vec.xml\";\n\t\tcase ENC_FMUL_ASIMDSAMEFP16_ONLY: return \"fmul_advsimd_vec.xml\";\n\t\tcase ENC_FMUL_ASISDELEM_RH_H: return \"fmul_advsimd_elt.xml\";\n\t\tcase ENC_FMUL_ASISDELEM_R_SD: return \"fmul_advsimd_elt.xml\";\n\t\tcase ENC_FNEG_D_FLOATDP1: return \"fneg_float.xml\";\n\t\tcase ENC_FNEG_H_FLOATDP1: return \"fneg_float.xml\";\n\t\tcase ENC_FNEG_S_FLOATDP1: return \"fneg_float.xml\";\n\t\tcase ENC_FNEG_ASIMDMISC_R: return \"fneg_advsimd.xml\";\n\t\tcase ENC_FNEG_ASIMDMISCFP16_R: return \"fneg_advsimd.xml\";\n\t\tcase ENC_FNMADD_D_FLOATDP3: return \"fnmadd_float.xml\";\n\t\tcase ENC_FNMADD_H_FLOATDP3: return \"fnmadd_float.xml\";\n\t\tcase ENC_FNMADD_S_FLOATDP3: return \"fnmadd_float.xml\";\n\t\tcase ENC_FNMSUB_D_FLOATDP3: return \"fnmsub_float.xml\";\n\t\tcase ENC_FNMSUB_H_FLOATDP3: return \"fnmsub_float.xml\";\n\t\tcase ENC_FNMSUB_S_FLOATDP3: return \"fnmsub_float.xml\";\n\t\tcase ENC_FNMUL_D_FLOATDP2: return \"fnmul_float.xml\";\n\t\tcase ENC_FNMUL_H_FLOATDP2: return \"fnmul_float.xml\";\n\t\tcase ENC_FNMUL_S_FLOATDP2: return \"fnmul_float.xml\";\n\t\tcase ENC_FRECPE_ASIMDMISC_R: return \"frecpe_advsimd.xml\";\n\t\tcase ENC_FRECPE_ASIMDMISCFP16_R: return \"frecpe_advsimd.xml\";\n\t\tcase ENC_FRECPE_ASISDMISC_R: return \"frecpe_advsimd.xml\";\n\t\tcase ENC_FRECPE_ASISDMISCFP16_R: return \"frecpe_advsimd.xml\";\n\t\tcase ENC_FRECPS_ASIMDSAME_ONLY: return \"frecps_advsimd.xml\";\n\t\tcase ENC_FRECPS_ASIMDSAMEFP16_ONLY: return \"frecps_advsimd.xml\";\n\t\tcase ENC_FRECPS_ASISDSAME_ONLY: return \"frecps_advsimd.xml\";\n\t\tcase ENC_FRECPS_ASISDSAMEFP16_ONLY: return \"frecps_advsimd.xml\";\n\t\tcase ENC_FRECPX_ASISDMISC_R: return \"frecpx_advsimd.xml\";\n\t\tcase ENC_FRECPX_ASISDMISCFP16_R: return \"frecpx_advsimd.xml\";\n\t\tcase ENC_FRINT32X_D_FLOATDP1: return \"frint32x_float.xml\";\n\t\tcase ENC_FRINT32X_S_FLOATDP1: return \"frint32x_float.xml\";\n\t\tcase ENC_FRINT32X_ASIMDMISC_R: return \"frint32x_advsimd.xml\";\n\t\tcase ENC_FRINT32Z_D_FLOATDP1: return \"frint32z_float.xml\";\n\t\tcase ENC_FRINT32Z_S_FLOATDP1: return \"frint32z_float.xml\";\n\t\tcase ENC_FRINT32Z_ASIMDMISC_R: return \"frint32z_advsimd.xml\";\n\t\tcase ENC_FRINT64X_D_FLOATDP1: return \"frint64x_float.xml\";\n\t\tcase ENC_FRINT64X_S_FLOATDP1: return \"frint64x_float.xml\";\n\t\tcase ENC_FRINT64X_ASIMDMISC_R: return \"frint64x_advsimd.xml\";\n\t\tcase ENC_FRINT64Z_D_FLOATDP1: return \"frint64z_float.xml\";\n\t\tcase ENC_FRINT64Z_S_FLOATDP1: return \"frint64z_float.xml\";\n\t\tcase ENC_FRINT64Z_ASIMDMISC_R: return \"frint64z_advsimd.xml\";\n\t\tcase ENC_FRINTA_D_FLOATDP1: return \"frinta_float.xml\";\n\t\tcase ENC_FRINTA_H_FLOATDP1: return \"frinta_float.xml\";\n\t\tcase ENC_FRINTA_S_FLOATDP1: return \"frinta_float.xml\";\n\t\tcase ENC_FRINTA_ASIMDMISC_R: return \"frinta_advsimd.xml\";\n\t\tcase ENC_FRINTA_ASIMDMISCFP16_R: return \"frinta_advsimd.xml\";\n\t\tcase ENC_FRINTI_D_FLOATDP1: return \"frinti_float.xml\";\n\t\tcase ENC_FRINTI_H_FLOATDP1: return \"frinti_float.xml\";\n\t\tcase ENC_FRINTI_S_FLOATDP1: return \"frinti_float.xml\";\n\t\tcase ENC_FRINTI_ASIMDMISC_R: return \"frinti_advsimd.xml\";\n\t\tcase ENC_FRINTI_ASIMDMISCFP16_R: return \"frinti_advsimd.xml\";\n\t\tcase ENC_FRINTM_D_FLOATDP1: return \"frintm_float.xml\";\n\t\tcase ENC_FRINTM_H_FLOATDP1: return \"frintm_float.xml\";\n\t\tcase ENC_FRINTM_S_FLOATDP1: return \"frintm_float.xml\";\n\t\tcase ENC_FRINTM_ASIMDMISC_R: return \"frintm_advsimd.xml\";\n\t\tcase ENC_FRINTM_ASIMDMISCFP16_R: return \"frintm_advsimd.xml\";\n\t\tcase ENC_FRINTN_D_FLOATDP1: return \"frintn_float.xml\";\n\t\tcase ENC_FRINTN_H_FLOATDP1: return \"frintn_float.xml\";\n\t\tcase ENC_FRINTN_S_FLOATDP1: return \"frintn_float.xml\";\n\t\tcase ENC_FRINTN_ASIMDMISC_R: return \"frintn_advsimd.xml\";\n\t\tcase ENC_FRINTN_ASIMDMISCFP16_R: return \"frintn_advsimd.xml\";\n\t\tcase ENC_FRINTP_D_FLOATDP1: return \"frintp_float.xml\";\n\t\tcase ENC_FRINTP_H_FLOATDP1: return \"frintp_float.xml\";\n\t\tcase ENC_FRINTP_S_FLOATDP1: return \"frintp_float.xml\";\n\t\tcase ENC_FRINTP_ASIMDMISC_R: return \"frintp_advsimd.xml\";\n\t\tcase ENC_FRINTP_ASIMDMISCFP16_R: return \"frintp_advsimd.xml\";\n\t\tcase ENC_FRINTX_D_FLOATDP1: return \"frintx_float.xml\";\n\t\tcase ENC_FRINTX_H_FLOATDP1: return \"frintx_float.xml\";\n\t\tcase ENC_FRINTX_S_FLOATDP1: return \"frintx_float.xml\";\n\t\tcase ENC_FRINTX_ASIMDMISC_R: return \"frintx_advsimd.xml\";\n\t\tcase ENC_FRINTX_ASIMDMISCFP16_R: return \"frintx_advsimd.xml\";\n\t\tcase ENC_FRINTZ_D_FLOATDP1: return \"frintz_float.xml\";\n\t\tcase ENC_FRINTZ_H_FLOATDP1: return \"frintz_float.xml\";\n\t\tcase ENC_FRINTZ_S_FLOATDP1: return \"frintz_float.xml\";\n\t\tcase ENC_FRINTZ_ASIMDMISC_R: return \"frintz_advsimd.xml\";\n\t\tcase ENC_FRINTZ_ASIMDMISCFP16_R: return \"frintz_advsimd.xml\";\n\t\tcase ENC_FRSQRTE_ASIMDMISC_R: return \"frsqrte_advsimd.xml\";\n\t\tcase ENC_FRSQRTE_ASIMDMISCFP16_R: return \"frsqrte_advsimd.xml\";\n\t\tcase ENC_FRSQRTE_ASISDMISC_R: return \"frsqrte_advsimd.xml\";\n\t\tcase ENC_FRSQRTE_ASISDMISCFP16_R: return \"frsqrte_advsimd.xml\";\n\t\tcase ENC_FRSQRTS_ASIMDSAME_ONLY: return \"frsqrts_advsimd.xml\";\n\t\tcase ENC_FRSQRTS_ASIMDSAMEFP16_ONLY: return \"frsqrts_advsimd.xml\";\n\t\tcase ENC_FRSQRTS_ASISDSAME_ONLY: return \"frsqrts_advsimd.xml\";\n\t\tcase ENC_FRSQRTS_ASISDSAMEFP16_ONLY: return \"frsqrts_advsimd.xml\";\n\t\tcase ENC_FSQRT_D_FLOATDP1: return \"fsqrt_float.xml\";\n\t\tcase ENC_FSQRT_H_FLOATDP1: return \"fsqrt_float.xml\";\n\t\tcase ENC_FSQRT_S_FLOATDP1: return \"fsqrt_float.xml\";\n\t\tcase ENC_FSQRT_ASIMDMISC_R: return \"fsqrt_advsimd.xml\";\n\t\tcase ENC_FSQRT_ASIMDMISCFP16_R: return \"fsqrt_advsimd.xml\";\n\t\tcase ENC_FSUB_D_FLOATDP2: return \"fsub_float.xml\";\n\t\tcase ENC_FSUB_H_FLOATDP2: return \"fsub_float.xml\";\n\t\tcase ENC_FSUB_S_FLOATDP2: return \"fsub_float.xml\";\n\t\tcase ENC_FSUB_ASIMDSAME_ONLY: return \"fsub_advsimd.xml\";\n\t\tcase ENC_FSUB_ASIMDSAMEFP16_ONLY: return \"fsub_advsimd.xml\";\n\t\tcase ENC_GMI_64G_DP_2SRC: return \"gmi.xml\";\n\t\tcase ENC_HINT_HM_HINTS: return \"hint.xml\";\n\t\tcase ENC_HLT_EX_EXCEPTION: return \"hlt.xml\";\n\t\tcase ENC_HVC_EX_EXCEPTION: return \"hvc.xml\";\n\t\tcase ENC_IC_SYS_CR_SYSTEMINSTRS: return \"ic_sys.xml\";\n\t\tcase ENC_INS_ASIMDINS_IR_R: return \"ins_advsimd_gen.xml\";\n\t\tcase ENC_INS_ASIMDINS_IV_V: return \"ins_advsimd_elt.xml\";\n\t\tcase ENC_IRG_64I_DP_2SRC: return \"irg.xml\";\n\t\tcase ENC_ISB_BI_BARRIERS: return \"isb.xml\";\n\t\tcase ENC_LD1R_ASISDLSO_R1: return \"ld1r_advsimd.xml\";\n\t\tcase ENC_LD1R_ASISDLSOP_R1_I: return \"ld1r_advsimd.xml\";\n\t\tcase ENC_LD1R_ASISDLSOP_RX1_R: return \"ld1r_advsimd.xml\";\n\t\tcase ENC_LD1_ASISDLSE_R1_1V: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSE_R2_2V: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSE_R3_3V: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSE_R4_4V: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_I1_I1: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_I2_I2: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_I3_I3: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_I4_I4: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_R1_R1: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_R2_R2: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_R3_R3: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSEP_R4_R4: return \"ld1_advsimd_mult.xml\";\n\t\tcase ENC_LD1_ASISDLSO_B1_1B: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSO_D1_1D: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSO_H1_1H: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSO_S1_1S: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_B1_I1B: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_BX1_R1B: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_D1_I1D: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_DX1_R1D: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_H1_I1H: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_HX1_R1H: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_S1_I1S: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD1_ASISDLSOP_SX1_R1S: return \"ld1_advsimd_sngl.xml\";\n\t\tcase ENC_LD2R_ASISDLSO_R2: return \"ld2r_advsimd.xml\";\n\t\tcase ENC_LD2R_ASISDLSOP_R2_I: return \"ld2r_advsimd.xml\";\n\t\tcase ENC_LD2R_ASISDLSOP_RX2_R: return \"ld2r_advsimd.xml\";\n\t\tcase ENC_LD2_ASISDLSE_R2: return \"ld2_advsimd_mult.xml\";\n\t\tcase ENC_LD2_ASISDLSEP_I2_I: return \"ld2_advsimd_mult.xml\";\n\t\tcase ENC_LD2_ASISDLSEP_R2_R: return \"ld2_advsimd_mult.xml\";\n\t\tcase ENC_LD2_ASISDLSO_B2_2B: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSO_D2_2D: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSO_H2_2H: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSO_S2_2S: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_B2_I2B: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_BX2_R2B: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_D2_I2D: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_DX2_R2D: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_H2_I2H: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_HX2_R2H: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_S2_I2S: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD2_ASISDLSOP_SX2_R2S: return \"ld2_advsimd_sngl.xml\";\n\t\tcase ENC_LD3R_ASISDLSO_R3: return \"ld3r_advsimd.xml\";\n\t\tcase ENC_LD3R_ASISDLSOP_R3_I: return \"ld3r_advsimd.xml\";\n\t\tcase ENC_LD3R_ASISDLSOP_RX3_R: return \"ld3r_advsimd.xml\";\n\t\tcase ENC_LD3_ASISDLSE_R3: return \"ld3_advsimd_mult.xml\";\n\t\tcase ENC_LD3_ASISDLSEP_I3_I: return \"ld3_advsimd_mult.xml\";\n\t\tcase ENC_LD3_ASISDLSEP_R3_R: return \"ld3_advsimd_mult.xml\";\n\t\tcase ENC_LD3_ASISDLSO_B3_3B: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSO_D3_3D: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSO_H3_3H: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSO_S3_3S: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_B3_I3B: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_BX3_R3B: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_D3_I3D: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_DX3_R3D: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_H3_I3H: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_HX3_R3H: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_S3_I3S: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD3_ASISDLSOP_SX3_R3S: return \"ld3_advsimd_sngl.xml\";\n\t\tcase ENC_LD4R_ASISDLSO_R4: return \"ld4r_advsimd.xml\";\n\t\tcase ENC_LD4R_ASISDLSOP_R4_I: return \"ld4r_advsimd.xml\";\n\t\tcase ENC_LD4R_ASISDLSOP_RX4_R: return \"ld4r_advsimd.xml\";\n\t\tcase ENC_LD4_ASISDLSE_R4: return \"ld4_advsimd_mult.xml\";\n\t\tcase ENC_LD4_ASISDLSEP_I4_I: return \"ld4_advsimd_mult.xml\";\n\t\tcase ENC_LD4_ASISDLSEP_R4_R: return \"ld4_advsimd_mult.xml\";\n\t\tcase ENC_LD4_ASISDLSO_B4_4B: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSO_D4_4D: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSO_H4_4H: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSO_S4_4S: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_B4_I4B: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_BX4_R4B: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_D4_I4D: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_DX4_R4D: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_H4_I4H: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_HX4_R4H: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_S4_I4S: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD4_ASISDLSOP_SX4_R4S: return \"ld4_advsimd_sngl.xml\";\n\t\tcase ENC_LD64B_64L_MEMOP: return \"ld64b.xml\";\n\t\tcase ENC_LDADDAB_32_MEMOP: return \"ldaddb.xml\";\n\t\tcase ENC_LDADDAH_32_MEMOP: return \"ldaddh.xml\";\n\t\tcase ENC_LDADDALB_32_MEMOP: return \"ldaddb.xml\";\n\t\tcase ENC_LDADDALH_32_MEMOP: return \"ldaddh.xml\";\n\t\tcase ENC_LDADDAL_32_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADDAL_64_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADDA_32_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADDA_64_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADDB_32_MEMOP: return \"ldaddb.xml\";\n\t\tcase ENC_LDADDH_32_MEMOP: return \"ldaddh.xml\";\n\t\tcase ENC_LDADDLB_32_MEMOP: return \"ldaddb.xml\";\n\t\tcase ENC_LDADDLH_32_MEMOP: return \"ldaddh.xml\";\n\t\tcase ENC_LDADDL_32_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADDL_64_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADD_32_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDADD_64_MEMOP: return \"ldadd.xml\";\n\t\tcase ENC_LDAPRB_32L_MEMOP: return \"ldaprb.xml\";\n\t\tcase ENC_LDAPRH_32L_MEMOP: return \"ldaprh.xml\";\n\t\tcase ENC_LDAPR_32L_MEMOP: return \"ldapr.xml\";\n\t\tcase ENC_LDAPR_64L_MEMOP: return \"ldapr.xml\";\n\t\tcase ENC_LDAPURB_32_LDAPSTL_UNSCALED: return \"ldapurb.xml\";\n\t\tcase ENC_LDAPURH_32_LDAPSTL_UNSCALED: return \"ldapurh.xml\";\n\t\tcase ENC_LDAPURSB_32_LDAPSTL_UNSCALED: return \"ldapursb.xml\";\n\t\tcase ENC_LDAPURSB_64_LDAPSTL_UNSCALED: return \"ldapursb.xml\";\n\t\tcase ENC_LDAPURSH_32_LDAPSTL_UNSCALED: return \"ldapursh.xml\";\n\t\tcase ENC_LDAPURSH_64_LDAPSTL_UNSCALED: return \"ldapursh.xml\";\n\t\tcase ENC_LDAPURSW_64_LDAPSTL_UNSCALED: return \"ldapursw.xml\";\n\t\tcase ENC_LDAPUR_32_LDAPSTL_UNSCALED: return \"ldapur_gen.xml\";\n\t\tcase ENC_LDAPUR_64_LDAPSTL_UNSCALED: return \"ldapur_gen.xml\";\n\t\tcase ENC_LDARB_LR32_LDSTORD: return \"ldarb.xml\";\n\t\tcase ENC_LDARH_LR32_LDSTORD: return \"ldarh.xml\";\n\t\tcase ENC_LDAR_LR32_LDSTORD: return \"ldar.xml\";\n\t\tcase ENC_LDAR_LR64_LDSTORD: return \"ldar.xml\";\n\t\tcase ENC_LDAXP_LP32_LDSTEXCLP: return \"ldaxp.xml\";\n\t\tcase ENC_LDAXP_LP64_LDSTEXCLP: return \"ldaxp.xml\";\n\t\tcase ENC_LDAXRB_LR32_LDSTEXCLR: return \"ldaxrb.xml\";\n\t\tcase ENC_LDAXRH_LR32_LDSTEXCLR: return \"ldaxrh.xml\";\n\t\tcase ENC_LDAXR_LR32_LDSTEXCLR: return \"ldaxr.xml\";\n\t\tcase ENC_LDAXR_LR64_LDSTEXCLR: return \"ldaxr.xml\";\n\t\tcase ENC_LDCLRAB_32_MEMOP: return \"ldclrb.xml\";\n\t\tcase ENC_LDCLRAH_32_MEMOP: return \"ldclrh.xml\";\n\t\tcase ENC_LDCLRALB_32_MEMOP: return \"ldclrb.xml\";\n\t\tcase ENC_LDCLRALH_32_MEMOP: return \"ldclrh.xml\";\n\t\tcase ENC_LDCLRAL_32_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLRAL_64_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLRA_32_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLRA_64_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLRB_32_MEMOP: return \"ldclrb.xml\";\n\t\tcase ENC_LDCLRH_32_MEMOP: return \"ldclrh.xml\";\n\t\tcase ENC_LDCLRLB_32_MEMOP: return \"ldclrb.xml\";\n\t\tcase ENC_LDCLRLH_32_MEMOP: return \"ldclrh.xml\";\n\t\tcase ENC_LDCLRL_32_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLRL_64_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLR_32_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDCLR_64_MEMOP: return \"ldclr.xml\";\n\t\tcase ENC_LDEORAB_32_MEMOP: return \"ldeorb.xml\";\n\t\tcase ENC_LDEORAH_32_MEMOP: return \"ldeorh.xml\";\n\t\tcase ENC_LDEORALB_32_MEMOP: return \"ldeorb.xml\";\n\t\tcase ENC_LDEORALH_32_MEMOP: return \"ldeorh.xml\";\n\t\tcase ENC_LDEORAL_32_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEORAL_64_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEORA_32_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEORA_64_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEORB_32_MEMOP: return \"ldeorb.xml\";\n\t\tcase ENC_LDEORH_32_MEMOP: return \"ldeorh.xml\";\n\t\tcase ENC_LDEORLB_32_MEMOP: return \"ldeorb.xml\";\n\t\tcase ENC_LDEORLH_32_MEMOP: return \"ldeorh.xml\";\n\t\tcase ENC_LDEORL_32_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEORL_64_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEOR_32_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDEOR_64_MEMOP: return \"ldeor.xml\";\n\t\tcase ENC_LDGM_64BULK_LDSTTAGS: return \"ldgm.xml\";\n\t\tcase ENC_LDG_64LOFFSET_LDSTTAGS: return \"ldg.xml\";\n\t\tcase ENC_LDLARB_LR32_LDSTORD: return \"ldlarb.xml\";\n\t\tcase ENC_LDLARH_LR32_LDSTORD: return \"ldlarh.xml\";\n\t\tcase ENC_LDLAR_LR32_LDSTORD: return \"ldlar.xml\";\n\t\tcase ENC_LDLAR_LR64_LDSTORD: return \"ldlar.xml\";\n\t\tcase ENC_LDNP_32_LDSTNAPAIR_OFFS: return \"ldnp_gen.xml\";\n\t\tcase ENC_LDNP_64_LDSTNAPAIR_OFFS: return \"ldnp_gen.xml\";\n\t\tcase ENC_LDNP_D_LDSTNAPAIR_OFFS: return \"ldnp_fpsimd.xml\";\n\t\tcase ENC_LDNP_Q_LDSTNAPAIR_OFFS: return \"ldnp_fpsimd.xml\";\n\t\tcase ENC_LDNP_S_LDSTNAPAIR_OFFS: return \"ldnp_fpsimd.xml\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_OFF: return \"ldpsw.xml\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_POST: return \"ldpsw.xml\";\n\t\tcase ENC_LDPSW_64_LDSTPAIR_PRE: return \"ldpsw.xml\";\n\t\tcase ENC_LDP_32_LDSTPAIR_OFF: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_32_LDSTPAIR_POST: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_32_LDSTPAIR_PRE: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_64_LDSTPAIR_OFF: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_64_LDSTPAIR_POST: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_64_LDSTPAIR_PRE: return \"ldp_gen.xml\";\n\t\tcase ENC_LDP_D_LDSTPAIR_OFF: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_D_LDSTPAIR_POST: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_D_LDSTPAIR_PRE: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_OFF: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_POST: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_Q_LDSTPAIR_PRE: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_S_LDSTPAIR_OFF: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_S_LDSTPAIR_POST: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDP_S_LDSTPAIR_PRE: return \"ldp_fpsimd.xml\";\n\t\tcase ENC_LDRAA_64W_LDST_PAC: return \"ldra.xml\";\n\t\tcase ENC_LDRAA_64_LDST_PAC: return \"ldra.xml\";\n\t\tcase ENC_LDRAB_64W_LDST_PAC: return \"ldra.xml\";\n\t\tcase ENC_LDRAB_64_LDST_PAC: return \"ldra.xml\";\n\t\tcase ENC_LDRB_32BL_LDST_REGOFF: return \"ldrb_reg.xml\";\n\t\tcase ENC_LDRB_32B_LDST_REGOFF: return \"ldrb_reg.xml\";\n\t\tcase ENC_LDRB_32_LDST_IMMPOST: return \"ldrb_imm.xml\";\n\t\tcase ENC_LDRB_32_LDST_IMMPRE: return \"ldrb_imm.xml\";\n\t\tcase ENC_LDRB_32_LDST_POS: return \"ldrb_imm.xml\";\n\t\tcase ENC_LDRH_32_LDST_IMMPOST: return \"ldrh_imm.xml\";\n\t\tcase ENC_LDRH_32_LDST_IMMPRE: return \"ldrh_imm.xml\";\n\t\tcase ENC_LDRH_32_LDST_POS: return \"ldrh_imm.xml\";\n\t\tcase ENC_LDRH_32_LDST_REGOFF: return \"ldrh_reg.xml\";\n\t\tcase ENC_LDRSB_32BL_LDST_REGOFF: return \"ldrsb_reg.xml\";\n\t\tcase ENC_LDRSB_32B_LDST_REGOFF: return \"ldrsb_reg.xml\";\n\t\tcase ENC_LDRSB_32_LDST_IMMPOST: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSB_32_LDST_IMMPRE: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSB_32_LDST_POS: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSB_64BL_LDST_REGOFF: return \"ldrsb_reg.xml\";\n\t\tcase ENC_LDRSB_64B_LDST_REGOFF: return \"ldrsb_reg.xml\";\n\t\tcase ENC_LDRSB_64_LDST_IMMPOST: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSB_64_LDST_IMMPRE: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSB_64_LDST_POS: return \"ldrsb_imm.xml\";\n\t\tcase ENC_LDRSH_32_LDST_IMMPOST: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_32_LDST_IMMPRE: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_32_LDST_POS: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_32_LDST_REGOFF: return \"ldrsh_reg.xml\";\n\t\tcase ENC_LDRSH_64_LDST_IMMPOST: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_64_LDST_IMMPRE: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_64_LDST_POS: return \"ldrsh_imm.xml\";\n\t\tcase ENC_LDRSH_64_LDST_REGOFF: return \"ldrsh_reg.xml\";\n\t\tcase ENC_LDRSW_64_LDST_IMMPOST: return \"ldrsw_imm.xml\";\n\t\tcase ENC_LDRSW_64_LDST_IMMPRE: return \"ldrsw_imm.xml\";\n\t\tcase ENC_LDRSW_64_LDST_POS: return \"ldrsw_imm.xml\";\n\t\tcase ENC_LDRSW_64_LDST_REGOFF: return \"ldrsw_reg.xml\";\n\t\tcase ENC_LDRSW_64_LOADLIT: return \"ldrsw_lit.xml\";\n\t\tcase ENC_LDR_32_LDST_IMMPOST: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_32_LDST_IMMPRE: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_32_LDST_POS: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_32_LDST_REGOFF: return \"ldr_reg_gen.xml\";\n\t\tcase ENC_LDR_32_LOADLIT: return \"ldr_lit_gen.xml\";\n\t\tcase ENC_LDR_64_LDST_IMMPOST: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_64_LDST_IMMPRE: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_64_LDST_POS: return \"ldr_imm_gen.xml\";\n\t\tcase ENC_LDR_64_LDST_REGOFF: return \"ldr_reg_gen.xml\";\n\t\tcase ENC_LDR_64_LOADLIT: return \"ldr_lit_gen.xml\";\n\t\tcase ENC_LDR_BL_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_B_LDST_IMMPOST: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_B_LDST_IMMPRE: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_B_LDST_POS: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_B_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_D_LDST_IMMPOST: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_D_LDST_IMMPRE: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_D_LDST_POS: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_D_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_D_LOADLIT: return \"ldr_lit_fpsimd.xml\";\n\t\tcase ENC_LDR_H_LDST_IMMPOST: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_H_LDST_IMMPRE: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_H_LDST_POS: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_H_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_Q_LDST_IMMPOST: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_Q_LDST_IMMPRE: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_Q_LDST_POS: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_Q_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_Q_LOADLIT: return \"ldr_lit_fpsimd.xml\";\n\t\tcase ENC_LDR_S_LDST_IMMPOST: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_S_LDST_IMMPRE: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_S_LDST_POS: return \"ldr_imm_fpsimd.xml\";\n\t\tcase ENC_LDR_S_LDST_REGOFF: return \"ldr_reg_fpsimd.xml\";\n\t\tcase ENC_LDR_S_LOADLIT: return \"ldr_lit_fpsimd.xml\";\n\t\tcase ENC_LDSETAB_32_MEMOP: return \"ldsetb.xml\";\n\t\tcase ENC_LDSETAH_32_MEMOP: return \"ldseth.xml\";\n\t\tcase ENC_LDSETALB_32_MEMOP: return \"ldsetb.xml\";\n\t\tcase ENC_LDSETALH_32_MEMOP: return \"ldseth.xml\";\n\t\tcase ENC_LDSETAL_32_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSETAL_64_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSETA_32_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSETA_64_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSETB_32_MEMOP: return \"ldsetb.xml\";\n\t\tcase ENC_LDSETH_32_MEMOP: return \"ldseth.xml\";\n\t\tcase ENC_LDSETLB_32_MEMOP: return \"ldsetb.xml\";\n\t\tcase ENC_LDSETLH_32_MEMOP: return \"ldseth.xml\";\n\t\tcase ENC_LDSETL_32_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSETL_64_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSET_32_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSET_64_MEMOP: return \"ldset.xml\";\n\t\tcase ENC_LDSMAXAB_32_MEMOP: return \"ldsmaxb.xml\";\n\t\tcase ENC_LDSMAXAH_32_MEMOP: return \"ldsmaxh.xml\";\n\t\tcase ENC_LDSMAXALB_32_MEMOP: return \"ldsmaxb.xml\";\n\t\tcase ENC_LDSMAXALH_32_MEMOP: return \"ldsmaxh.xml\";\n\t\tcase ENC_LDSMAXAL_32_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAXAL_64_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAXA_32_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAXA_64_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAXB_32_MEMOP: return \"ldsmaxb.xml\";\n\t\tcase ENC_LDSMAXH_32_MEMOP: return \"ldsmaxh.xml\";\n\t\tcase ENC_LDSMAXLB_32_MEMOP: return \"ldsmaxb.xml\";\n\t\tcase ENC_LDSMAXLH_32_MEMOP: return \"ldsmaxh.xml\";\n\t\tcase ENC_LDSMAXL_32_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAXL_64_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAX_32_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMAX_64_MEMOP: return \"ldsmax.xml\";\n\t\tcase ENC_LDSMINAB_32_MEMOP: return \"ldsminb.xml\";\n\t\tcase ENC_LDSMINAH_32_MEMOP: return \"ldsminh.xml\";\n\t\tcase ENC_LDSMINALB_32_MEMOP: return \"ldsminb.xml\";\n\t\tcase ENC_LDSMINALH_32_MEMOP: return \"ldsminh.xml\";\n\t\tcase ENC_LDSMINAL_32_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMINAL_64_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMINA_32_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMINA_64_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMINB_32_MEMOP: return \"ldsminb.xml\";\n\t\tcase ENC_LDSMINH_32_MEMOP: return \"ldsminh.xml\";\n\t\tcase ENC_LDSMINLB_32_MEMOP: return \"ldsminb.xml\";\n\t\tcase ENC_LDSMINLH_32_MEMOP: return \"ldsminh.xml\";\n\t\tcase ENC_LDSMINL_32_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMINL_64_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMIN_32_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDSMIN_64_MEMOP: return \"ldsmin.xml\";\n\t\tcase ENC_LDTRB_32_LDST_UNPRIV: return \"ldtrb.xml\";\n\t\tcase ENC_LDTRH_32_LDST_UNPRIV: return \"ldtrh.xml\";\n\t\tcase ENC_LDTRSB_32_LDST_UNPRIV: return \"ldtrsb.xml\";\n\t\tcase ENC_LDTRSB_64_LDST_UNPRIV: return \"ldtrsb.xml\";\n\t\tcase ENC_LDTRSH_32_LDST_UNPRIV: return \"ldtrsh.xml\";\n\t\tcase ENC_LDTRSH_64_LDST_UNPRIV: return \"ldtrsh.xml\";\n\t\tcase ENC_LDTRSW_64_LDST_UNPRIV: return \"ldtrsw.xml\";\n\t\tcase ENC_LDTR_32_LDST_UNPRIV: return \"ldtr.xml\";\n\t\tcase ENC_LDTR_64_LDST_UNPRIV: return \"ldtr.xml\";\n\t\tcase ENC_LDUMAXAB_32_MEMOP: return \"ldumaxb.xml\";\n\t\tcase ENC_LDUMAXAH_32_MEMOP: return \"ldumaxh.xml\";\n\t\tcase ENC_LDUMAXALB_32_MEMOP: return \"ldumaxb.xml\";\n\t\tcase ENC_LDUMAXALH_32_MEMOP: return \"ldumaxh.xml\";\n\t\tcase ENC_LDUMAXAL_32_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAXAL_64_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAXA_32_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAXA_64_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAXB_32_MEMOP: return \"ldumaxb.xml\";\n\t\tcase ENC_LDUMAXH_32_MEMOP: return \"ldumaxh.xml\";\n\t\tcase ENC_LDUMAXLB_32_MEMOP: return \"ldumaxb.xml\";\n\t\tcase ENC_LDUMAXLH_32_MEMOP: return \"ldumaxh.xml\";\n\t\tcase ENC_LDUMAXL_32_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAXL_64_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAX_32_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMAX_64_MEMOP: return \"ldumax.xml\";\n\t\tcase ENC_LDUMINAB_32_MEMOP: return \"lduminb.xml\";\n\t\tcase ENC_LDUMINAH_32_MEMOP: return \"lduminh.xml\";\n\t\tcase ENC_LDUMINALB_32_MEMOP: return \"lduminb.xml\";\n\t\tcase ENC_LDUMINALH_32_MEMOP: return \"lduminh.xml\";\n\t\tcase ENC_LDUMINAL_32_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMINAL_64_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMINA_32_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMINA_64_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMINB_32_MEMOP: return \"lduminb.xml\";\n\t\tcase ENC_LDUMINH_32_MEMOP: return \"lduminh.xml\";\n\t\tcase ENC_LDUMINLB_32_MEMOP: return \"lduminb.xml\";\n\t\tcase ENC_LDUMINLH_32_MEMOP: return \"lduminh.xml\";\n\t\tcase ENC_LDUMINL_32_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMINL_64_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMIN_32_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDUMIN_64_MEMOP: return \"ldumin.xml\";\n\t\tcase ENC_LDURB_32_LDST_UNSCALED: return \"ldurb.xml\";\n\t\tcase ENC_LDURH_32_LDST_UNSCALED: return \"ldurh.xml\";\n\t\tcase ENC_LDURSB_32_LDST_UNSCALED: return \"ldursb.xml\";\n\t\tcase ENC_LDURSB_64_LDST_UNSCALED: return \"ldursb.xml\";\n\t\tcase ENC_LDURSH_32_LDST_UNSCALED: return \"ldursh.xml\";\n\t\tcase ENC_LDURSH_64_LDST_UNSCALED: return \"ldursh.xml\";\n\t\tcase ENC_LDURSW_64_LDST_UNSCALED: return \"ldursw.xml\";\n\t\tcase ENC_LDUR_32_LDST_UNSCALED: return \"ldur_gen.xml\";\n\t\tcase ENC_LDUR_64_LDST_UNSCALED: return \"ldur_gen.xml\";\n\t\tcase ENC_LDUR_B_LDST_UNSCALED: return \"ldur_fpsimd.xml\";\n\t\tcase ENC_LDUR_D_LDST_UNSCALED: return \"ldur_fpsimd.xml\";\n\t\tcase ENC_LDUR_H_LDST_UNSCALED: return \"ldur_fpsimd.xml\";\n\t\tcase ENC_LDUR_Q_LDST_UNSCALED: return \"ldur_fpsimd.xml\";\n\t\tcase ENC_LDUR_S_LDST_UNSCALED: return \"ldur_fpsimd.xml\";\n\t\tcase ENC_LDXP_LP32_LDSTEXCLP: return \"ldxp.xml\";\n\t\tcase ENC_LDXP_LP64_LDSTEXCLP: return \"ldxp.xml\";\n\t\tcase ENC_LDXRB_LR32_LDSTEXCLR: return \"ldxrb.xml\";\n\t\tcase ENC_LDXRH_LR32_LDSTEXCLR: return \"ldxrh.xml\";\n\t\tcase ENC_LDXR_LR32_LDSTEXCLR: return \"ldxr.xml\";\n\t\tcase ENC_LDXR_LR64_LDSTEXCLR: return \"ldxr.xml\";\n\t\tcase ENC_LSLV_32_DP_2SRC: return \"lslv.xml\";\n\t\tcase ENC_LSLV_64_DP_2SRC: return \"lslv.xml\";\n\t\tcase ENC_LSL_LSLV_32_DP_2SRC: return \"lsl_lslv.xml\";\n\t\tcase ENC_LSL_LSLV_64_DP_2SRC: return \"lsl_lslv.xml\";\n\t\tcase ENC_LSL_UBFM_32M_BITFIELD: return \"lsl_ubfm.xml\";\n\t\tcase ENC_LSL_UBFM_64M_BITFIELD: return \"lsl_ubfm.xml\";\n\t\tcase ENC_LSRV_32_DP_2SRC: return \"lsrv.xml\";\n\t\tcase ENC_LSRV_64_DP_2SRC: return \"lsrv.xml\";\n\t\tcase ENC_LSR_LSRV_32_DP_2SRC: return \"lsr_lsrv.xml\";\n\t\tcase ENC_LSR_LSRV_64_DP_2SRC: return \"lsr_lsrv.xml\";\n\t\tcase ENC_LSR_UBFM_32M_BITFIELD: return \"lsr_ubfm.xml\";\n\t\tcase ENC_LSR_UBFM_64M_BITFIELD: return \"lsr_ubfm.xml\";\n\t\tcase ENC_MADD_32A_DP_3SRC: return \"madd.xml\";\n\t\tcase ENC_MADD_64A_DP_3SRC: return \"madd.xml\";\n\t\tcase ENC_MLA_ASIMDELEM_R: return \"mla_advsimd_elt.xml\";\n\t\tcase ENC_MLA_ASIMDSAME_ONLY: return \"mla_advsimd_vec.xml\";\n\t\tcase ENC_MLS_ASIMDELEM_R: return \"mls_advsimd_elt.xml\";\n\t\tcase ENC_MLS_ASIMDSAME_ONLY: return \"mls_advsimd_vec.xml\";\n\t\tcase ENC_MNEG_MSUB_32A_DP_3SRC: return \"mneg_msub.xml\";\n\t\tcase ENC_MNEG_MSUB_64A_DP_3SRC: return \"mneg_msub.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_D2_D: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_D_DS: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_L_HL: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_L_SL: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_M_SM: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVI_ASIMDIMM_N_B: return \"movi_advsimd.xml\";\n\t\tcase ENC_MOVK_32_MOVEWIDE: return \"movk.xml\";\n\t\tcase ENC_MOVK_64_MOVEWIDE: return \"movk.xml\";\n\t\tcase ENC_MOVN_32_MOVEWIDE: return \"movn.xml\";\n\t\tcase ENC_MOVN_64_MOVEWIDE: return \"movn.xml\";\n\t\tcase ENC_MOVS_ANDS_P_P_PP_Z: return \"movs_ands_p_p_pp.xml\";\n\t\tcase ENC_MOVS_ORRS_P_P_PP_Z: return \"movs_orrs_p_p_pp.xml\";\n\t\tcase ENC_MOVZ_32_MOVEWIDE: return \"movz.xml\";\n\t\tcase ENC_MOVZ_64_MOVEWIDE: return \"movz.xml\";\n\t\tcase ENC_MOV_ADD_32_ADDSUB_IMM: return \"mov_add_addsub_imm.xml\";\n\t\tcase ENC_MOV_ADD_64_ADDSUB_IMM: return \"mov_add_addsub_imm.xml\";\n\t\tcase ENC_MOV_DUP_ASISDONE_ONLY: return \"mov_dup_advsimd_elt.xml\";\n\t\tcase ENC_MOV_INS_ASIMDINS_IR_R: return \"mov_ins_advsimd_gen.xml\";\n\t\tcase ENC_MOV_INS_ASIMDINS_IV_V: return \"mov_ins_advsimd_elt.xml\";\n\t\tcase ENC_MOV_MOVN_32_MOVEWIDE: return \"mov_movn.xml\";\n\t\tcase ENC_MOV_MOVN_64_MOVEWIDE: return \"mov_movn.xml\";\n\t\tcase ENC_MOV_MOVZ_32_MOVEWIDE: return \"mov_movz.xml\";\n\t\tcase ENC_MOV_MOVZ_64_MOVEWIDE: return \"mov_movz.xml\";\n\t\tcase ENC_MOV_ORR_32_LOG_IMM: return \"mov_orr_log_imm.xml\";\n\t\tcase ENC_MOV_ORR_32_LOG_SHIFT: return \"mov_orr_log_shift.xml\";\n\t\tcase ENC_MOV_ORR_64_LOG_IMM: return \"mov_orr_log_imm.xml\";\n\t\tcase ENC_MOV_ORR_64_LOG_SHIFT: return \"mov_orr_log_shift.xml\";\n\t\tcase ENC_MOV_ORR_ASIMDSAME_ONLY: return \"mov_orr_advsimd_reg.xml\";\n\t\tcase ENC_MOV_UMOV_ASIMDINS_W_W: return \"mov_umov_advsimd.xml\";\n\t\tcase ENC_MOV_UMOV_ASIMDINS_X_X: return \"mov_umov_advsimd.xml\";\n\t\tcase ENC_MOV_AND_P_P_PP_Z: return \"mov_and_p_p_pp.xml\";\n\t\tcase ENC_MOV_CPY_Z_O_I_: return \"mov_cpy_z_o_i.xml\";\n\t\tcase ENC_MOV_CPY_Z_P_I_: return \"mov_cpy_z_p_i.xml\";\n\t\tcase ENC_MOV_CPY_Z_P_R_: return \"mov_cpy_z_p_r.xml\";\n\t\tcase ENC_MOV_CPY_Z_P_V_: return \"mov_cpy_z_p_v.xml\";\n\t\tcase ENC_MOV_DUP_Z_I_: return \"mov_dup_z_i.xml\";\n\t\tcase ENC_MOV_DUP_Z_R_: return \"mov_dup_z_r.xml\";\n\t\tcase ENC_MOV_DUP_Z_ZI_: return \"mov_dup_z_zi.xml\";\n\t\tcase ENC_MOV_DUP_Z_ZI_2: return \"mov_dup_z_zi.xml\";\n\t\tcase ENC_MOV_DUPM_Z_I_: return \"mov_dupm_z_i.xml\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_B: return \"mov_mova_z_p_rza.xml\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_D: return \"mov_mova_z_p_rza.xml\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_H: return \"mov_mova_z_p_rza.xml\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_Q: return \"mov_mova_z_p_rza.xml\";\n\t\tcase ENC_MOV_MOVA_Z_P_RZA_W: return \"mov_mova_z_p_rza.xml\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_B: return \"mov_mova_za_p_rz.xml\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_D: return \"mov_mova_za_p_rz.xml\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_H: return \"mov_mova_za_p_rz.xml\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_Q: return \"mov_mova_za_p_rz.xml\";\n\t\tcase ENC_MOV_MOVA_ZA_P_RZ_W: return \"mov_mova_za_p_rz.xml\";\n\t\tcase ENC_MOV_ORR_P_P_PP_Z: return \"mov_orr_p_p_pp.xml\";\n\t\tcase ENC_MOV_ORR_Z_ZZ_: return \"mov_orr_z_zz.xml\";\n\t\tcase ENC_MOV_SEL_P_P_PP_: return \"mov_sel_p_p_pp.xml\";\n\t\tcase ENC_MOV_SEL_Z_P_ZZ_: return \"mov_sel_z_p_zz.xml\";\n\t\tcase ENC_MRS_RS_SYSTEMMOVE: return \"mrs.xml\";\n\t\tcase ENC_MSR_SI_PSTATE: return \"msr_imm.xml\";\n\t\tcase ENC_MSR_SR_SYSTEMMOVE: return \"msr_reg.xml\";\n\t\tcase ENC_MSUB_32A_DP_3SRC: return \"msub.xml\";\n\t\tcase ENC_MSUB_64A_DP_3SRC: return \"msub.xml\";\n\t\tcase ENC_MUL_MADD_32A_DP_3SRC: return \"mul_madd.xml\";\n\t\tcase ENC_MUL_MADD_64A_DP_3SRC: return \"mul_madd.xml\";\n\t\tcase ENC_MUL_ASIMDELEM_R: return \"mul_advsimd_elt.xml\";\n\t\tcase ENC_MUL_ASIMDSAME_ONLY: return \"mul_advsimd_vec.xml\";\n\t\tcase ENC_MVNI_ASIMDIMM_L_HL: return \"mvni_advsimd.xml\";\n\t\tcase ENC_MVNI_ASIMDIMM_L_SL: return \"mvni_advsimd.xml\";\n\t\tcase ENC_MVNI_ASIMDIMM_M_SM: return \"mvni_advsimd.xml\";\n\t\tcase ENC_MVN_NOT_ASIMDMISC_R: return \"mvn_not_advsimd.xml\";\n\t\tcase ENC_MVN_ORN_32_LOG_SHIFT: return \"mvn_orn_log_shift.xml\";\n\t\tcase ENC_MVN_ORN_64_LOG_SHIFT: return \"mvn_orn_log_shift.xml\";\n\t\tcase ENC_NEGS_SUBS_32_ADDSUB_SHIFT: return \"negs_subs_addsub_shift.xml\";\n\t\tcase ENC_NEGS_SUBS_64_ADDSUB_SHIFT: return \"negs_subs_addsub_shift.xml\";\n\t\tcase ENC_NEG_SUB_32_ADDSUB_SHIFT: return \"neg_sub_addsub_shift.xml\";\n\t\tcase ENC_NEG_SUB_64_ADDSUB_SHIFT: return \"neg_sub_addsub_shift.xml\";\n\t\tcase ENC_NEG_ASIMDMISC_R: return \"neg_advsimd.xml\";\n\t\tcase ENC_NEG_ASISDMISC_R: return \"neg_advsimd.xml\";\n\t\tcase ENC_NGCS_SBCS_32_ADDSUB_CARRY: return \"ngcs_sbcs.xml\";\n\t\tcase ENC_NGCS_SBCS_64_ADDSUB_CARRY: return \"ngcs_sbcs.xml\";\n\t\tcase ENC_NGC_SBC_32_ADDSUB_CARRY: return \"ngc_sbc.xml\";\n\t\tcase ENC_NGC_SBC_64_ADDSUB_CARRY: return \"ngc_sbc.xml\";\n\t\tcase ENC_NOP_HI_HINTS: return \"nop.xml\";\n\t\tcase ENC_NOTS_EORS_P_P_PP_Z: return \"nots_eors_p_p_pp.xml\";\n\t\tcase ENC_NOT_ASIMDMISC_R: return \"not_advsimd.xml\";\n\t\tcase ENC_NOT_EOR_P_P_PP_Z: return \"not_eor_p_p_pp.xml\";\n\t\tcase ENC_ORN_32_LOG_SHIFT: return \"orn_log_shift.xml\";\n\t\tcase ENC_ORN_64_LOG_SHIFT: return \"orn_log_shift.xml\";\n\t\tcase ENC_ORN_ASIMDSAME_ONLY: return \"orn_advsimd.xml\";\n\t\tcase ENC_ORN_ORR_Z_ZI_: return \"orn_orr_z_zi.xml\";\n\t\tcase ENC_ORR_32_LOG_IMM: return \"orr_log_imm.xml\";\n\t\tcase ENC_ORR_32_LOG_SHIFT: return \"orr_log_shift.xml\";\n\t\tcase ENC_ORR_64_LOG_IMM: return \"orr_log_imm.xml\";\n\t\tcase ENC_ORR_64_LOG_SHIFT: return \"orr_log_shift.xml\";\n\t\tcase ENC_ORR_ASIMDIMM_L_HL: return \"orr_advsimd_imm.xml\";\n\t\tcase ENC_ORR_ASIMDIMM_L_SL: return \"orr_advsimd_imm.xml\";\n\t\tcase ENC_ORR_ASIMDSAME_ONLY: return \"orr_advsimd_reg.xml\";\n\t\tcase ENC_PACDA_64P_DP_1SRC: return \"pacda.xml\";\n\t\tcase ENC_PACDB_64P_DP_1SRC: return \"pacdb.xml\";\n\t\tcase ENC_PACDZA_64Z_DP_1SRC: return \"pacda.xml\";\n\t\tcase ENC_PACDZB_64Z_DP_1SRC: return \"pacdb.xml\";\n\t\tcase ENC_PACGA_64P_DP_2SRC: return \"pacga.xml\";\n\t\tcase ENC_PACIA1716_HI_HINTS: return \"pacia.xml\";\n\t\tcase ENC_PACIASP_HI_HINTS: return \"pacia.xml\";\n\t\tcase ENC_PACIAZ_HI_HINTS: return \"pacia.xml\";\n\t\tcase ENC_PACIA_64P_DP_1SRC: return \"pacia.xml\";\n\t\tcase ENC_PACIB1716_HI_HINTS: return \"pacib.xml\";\n\t\tcase ENC_PACIBSP_HI_HINTS: return \"pacib.xml\";\n\t\tcase ENC_PACIBZ_HI_HINTS: return \"pacib.xml\";\n\t\tcase ENC_PACIB_64P_DP_1SRC: return \"pacib.xml\";\n\t\tcase ENC_PACIZA_64Z_DP_1SRC: return \"pacia.xml\";\n\t\tcase ENC_PACIZB_64Z_DP_1SRC: return \"pacib.xml\";\n\t\tcase ENC_PMULL_ASIMDDIFF_L: return \"pmull_advsimd.xml\";\n\t\tcase ENC_PMUL_ASIMDSAME_ONLY: return \"pmul_advsimd.xml\";\n\t\tcase ENC_PRFM_P_LDST_POS: return \"prfm_imm.xml\";\n\t\tcase ENC_PRFM_P_LDST_REGOFF: return \"prfm_reg.xml\";\n\t\tcase ENC_PRFM_P_LOADLIT: return \"prfm_lit.xml\";\n\t\tcase ENC_PRFUM_P_LDST_UNSCALED: return \"prfum.xml\";\n\t\tcase ENC_PSB_HC_HINTS: return \"psb.xml\";\n\t\tcase ENC_PSSBB_DSB_BO_BARRIERS: return \"pssbb_dsb.xml\";\n\t\tcase ENC_RADDHN_ASIMDDIFF_N: return \"raddhn_advsimd.xml\";\n\t\tcase ENC_RAX1_VVV2_CRYPTOSHA512_3: return \"rax1_advsimd.xml\";\n\t\tcase ENC_RBIT_32_DP_1SRC: return \"rbit_int.xml\";\n\t\tcase ENC_RBIT_64_DP_1SRC: return \"rbit_int.xml\";\n\t\tcase ENC_RBIT_ASIMDMISC_R: return \"rbit_advsimd.xml\";\n\t\tcase ENC_RETAA_64E_BRANCH_REG: return \"reta.xml\";\n\t\tcase ENC_RETAB_64E_BRANCH_REG: return \"reta.xml\";\n\t\tcase ENC_RET_64R_BRANCH_REG: return \"ret.xml\";\n\t\tcase ENC_REV16_32_DP_1SRC: return \"rev16_int.xml\";\n\t\tcase ENC_REV16_64_DP_1SRC: return \"rev16_int.xml\";\n\t\tcase ENC_REV16_ASIMDMISC_R: return \"rev16_advsimd.xml\";\n\t\tcase ENC_REV32_64_DP_1SRC: return \"rev32_int.xml\";\n\t\tcase ENC_REV32_ASIMDMISC_R: return \"rev32_advsimd.xml\";\n\t\tcase ENC_REV64_REV_64_DP_1SRC: return \"rev64_rev.xml\";\n\t\tcase ENC_REV64_ASIMDMISC_R: return \"rev64_advsimd.xml\";\n\t\tcase ENC_REV_32_DP_1SRC: return \"rev.xml\";\n\t\tcase ENC_REV_64_DP_1SRC: return \"rev.xml\";\n\t\tcase ENC_RMIF_ONLY_RMIF: return \"rmif.xml\";\n\t\tcase ENC_RORV_32_DP_2SRC: return \"rorv.xml\";\n\t\tcase ENC_RORV_64_DP_2SRC: return \"rorv.xml\";\n\t\tcase ENC_ROR_EXTR_32_EXTRACT: return \"ror_extr.xml\";\n\t\tcase ENC_ROR_EXTR_64_EXTRACT: return \"ror_extr.xml\";\n\t\tcase ENC_ROR_RORV_32_DP_2SRC: return \"ror_rorv.xml\";\n\t\tcase ENC_ROR_RORV_64_DP_2SRC: return \"ror_rorv.xml\";\n\t\tcase ENC_RSHRN_ASIMDSHF_N: return \"rshrn_advsimd.xml\";\n\t\tcase ENC_RSUBHN_ASIMDDIFF_N: return \"rsubhn_advsimd.xml\";\n\t\tcase ENC_SABAL_ASIMDDIFF_L: return \"sabal_advsimd.xml\";\n\t\tcase ENC_SABA_ASIMDSAME_ONLY: return \"saba_advsimd.xml\";\n\t\tcase ENC_SABDL_ASIMDDIFF_L: return \"sabdl_advsimd.xml\";\n\t\tcase ENC_SABD_ASIMDSAME_ONLY: return \"sabd_advsimd.xml\";\n\t\tcase ENC_SADALP_ASIMDMISC_P: return \"sadalp_advsimd.xml\";\n\t\tcase ENC_SADDLP_ASIMDMISC_P: return \"saddlp_advsimd.xml\";\n\t\tcase ENC_SADDLV_ASIMDALL_ONLY: return \"saddlv_advsimd.xml\";\n\t\tcase ENC_SADDL_ASIMDDIFF_L: return \"saddl_advsimd.xml\";\n\t\tcase ENC_SADDW_ASIMDDIFF_W: return \"saddw_advsimd.xml\";\n\t\tcase ENC_SBCS_32_ADDSUB_CARRY: return \"sbcs.xml\";\n\t\tcase ENC_SBCS_64_ADDSUB_CARRY: return \"sbcs.xml\";\n\t\tcase ENC_SBC_32_ADDSUB_CARRY: return \"sbc.xml\";\n\t\tcase ENC_SBC_64_ADDSUB_CARRY: return \"sbc.xml\";\n\t\tcase ENC_SBFIZ_SBFM_32M_BITFIELD: return \"sbfiz_sbfm.xml\";\n\t\tcase ENC_SBFIZ_SBFM_64M_BITFIELD: return \"sbfiz_sbfm.xml\";\n\t\tcase ENC_SBFM_32M_BITFIELD: return \"sbfm.xml\";\n\t\tcase ENC_SBFM_64M_BITFIELD: return \"sbfm.xml\";\n\t\tcase ENC_SBFX_SBFM_32M_BITFIELD: return \"sbfx_sbfm.xml\";\n\t\tcase ENC_SBFX_SBFM_64M_BITFIELD: return \"sbfx_sbfm.xml\";\n\t\tcase ENC_SB_ONLY_BARRIERS: return \"sb.xml\";\n\t\tcase ENC_SCVTF_D32_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_D32_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_D64_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_D64_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_H32_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_H32_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_H64_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_H64_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_S32_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_S32_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_S64_FLOAT2FIX: return \"scvtf_float_fix.xml\";\n\t\tcase ENC_SCVTF_S64_FLOAT2INT: return \"scvtf_float_int.xml\";\n\t\tcase ENC_SCVTF_ASIMDMISC_R: return \"scvtf_advsimd_int.xml\";\n\t\tcase ENC_SCVTF_ASIMDMISCFP16_R: return \"scvtf_advsimd_int.xml\";\n\t\tcase ENC_SCVTF_ASIMDSHF_C: return \"scvtf_advsimd_fix.xml\";\n\t\tcase ENC_SCVTF_ASISDMISC_R: return \"scvtf_advsimd_int.xml\";\n\t\tcase ENC_SCVTF_ASISDMISCFP16_R: return \"scvtf_advsimd_int.xml\";\n\t\tcase ENC_SCVTF_ASISDSHF_C: return \"scvtf_advsimd_fix.xml\";\n\t\tcase ENC_SDIV_32_DP_2SRC: return \"sdiv.xml\";\n\t\tcase ENC_SDIV_64_DP_2SRC: return \"sdiv.xml\";\n\t\tcase ENC_SDOT_ASIMDELEM_D: return \"sdot_advsimd_elt.xml\";\n\t\tcase ENC_SDOT_ASIMDSAME2_D: return \"sdot_advsimd_vec.xml\";\n\t\tcase ENC_SETF16_ONLY_SETF: return \"setf.xml\";\n\t\tcase ENC_SETF8_ONLY_SETF: return \"setf.xml\";\n\t\tcase ENC_SEVL_HI_HINTS: return \"sevl.xml\";\n\t\tcase ENC_SEV_HI_HINTS: return \"sev.xml\";\n\t\tcase ENC_SHA1C_QSV_CRYPTOSHA3: return \"sha1c_advsimd.xml\";\n\t\tcase ENC_SHA1H_SS_CRYPTOSHA2: return \"sha1h_advsimd.xml\";\n\t\tcase ENC_SHA1M_QSV_CRYPTOSHA3: return \"sha1m_advsimd.xml\";\n\t\tcase ENC_SHA1P_QSV_CRYPTOSHA3: return \"sha1p_advsimd.xml\";\n\t\tcase ENC_SHA1SU0_VVV_CRYPTOSHA3: return \"sha1su0_advsimd.xml\";\n\t\tcase ENC_SHA1SU1_VV_CRYPTOSHA2: return \"sha1su1_advsimd.xml\";\n\t\tcase ENC_SHA256H2_QQV_CRYPTOSHA3: return \"sha256h2_advsimd.xml\";\n\t\tcase ENC_SHA256H_QQV_CRYPTOSHA3: return \"sha256h_advsimd.xml\";\n\t\tcase ENC_SHA256SU0_VV_CRYPTOSHA2: return \"sha256su0_advsimd.xml\";\n\t\tcase ENC_SHA256SU1_VVV_CRYPTOSHA3: return \"sha256su1_advsimd.xml\";\n\t\tcase ENC_SHA512H2_QQV_CRYPTOSHA512_3: return \"sha512h2_advsimd.xml\";\n\t\tcase ENC_SHA512H_QQV_CRYPTOSHA512_3: return \"sha512h_advsimd.xml\";\n\t\tcase ENC_SHA512SU0_VV2_CRYPTOSHA512_2: return \"sha512su0_advsimd.xml\";\n\t\tcase ENC_SHA512SU1_VVV2_CRYPTOSHA512_3: return \"sha512su1_advsimd.xml\";\n\t\tcase ENC_SHADD_ASIMDSAME_ONLY: return \"shadd_advsimd.xml\";\n\t\tcase ENC_SHLL_ASIMDMISC_S: return \"shll_advsimd.xml\";\n\t\tcase ENC_SHL_ASIMDSHF_R: return \"shl_advsimd.xml\";\n\t\tcase ENC_SHL_ASISDSHF_R: return \"shl_advsimd.xml\";\n\t\tcase ENC_SHRN_ASIMDSHF_N: return \"shrn_advsimd.xml\";\n\t\tcase ENC_SHSUB_ASIMDSAME_ONLY: return \"shsub_advsimd.xml\";\n\t\tcase ENC_SLI_ASIMDSHF_R: return \"sli_advsimd.xml\";\n\t\tcase ENC_SLI_ASISDSHF_R: return \"sli_advsimd.xml\";\n\t\tcase ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3: return \"sm3partw1_advsimd.xml\";\n\t\tcase ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3: return \"sm3partw2_advsimd.xml\";\n\t\tcase ENC_SM3SS1_VVV4_CRYPTO4: return \"sm3ss1_advsimd.xml\";\n\t\tcase ENC_SM3TT1A_VVV4_CRYPTO3_IMM2: return \"sm3tt1a_advsimd.xml\";\n\t\tcase ENC_SM3TT1B_VVV4_CRYPTO3_IMM2: return \"sm3tt1b_advsimd.xml\";\n\t\tcase ENC_SM3TT2A_VVV4_CRYPTO3_IMM2: return \"sm3tt2a_advsimd.xml\";\n\t\tcase ENC_SM3TT2B_VVV_CRYPTO3_IMM2: return \"sm3tt2b_advsimd.xml\";\n\t\tcase ENC_SM4EKEY_VVV4_CRYPTOSHA512_3: return \"sm4ekey_advsimd.xml\";\n\t\tcase ENC_SM4E_VV4_CRYPTOSHA512_2: return \"sm4e_advsimd.xml\";\n\t\tcase ENC_SMADDL_64WA_DP_3SRC: return \"smaddl.xml\";\n\t\tcase ENC_SMAXP_ASIMDSAME_ONLY: return \"smaxp_advsimd.xml\";\n\t\tcase ENC_SMAXV_ASIMDALL_ONLY: return \"smaxv_advsimd.xml\";\n\t\tcase ENC_SMAX_ASIMDSAME_ONLY: return \"smax_advsimd.xml\";\n\t\tcase ENC_SMC_EX_EXCEPTION: return \"smc.xml\";\n\t\tcase ENC_SMINP_ASIMDSAME_ONLY: return \"sminp_advsimd.xml\";\n\t\tcase ENC_SMINV_ASIMDALL_ONLY: return \"sminv_advsimd.xml\";\n\t\tcase ENC_SMIN_ASIMDSAME_ONLY: return \"smin_advsimd.xml\";\n\t\tcase ENC_SMLAL_ASIMDDIFF_L: return \"smlal_advsimd_vec.xml\";\n\t\tcase ENC_SMLAL_ASIMDELEM_L: return \"smlal_advsimd_elt.xml\";\n\t\tcase ENC_SMLSL_ASIMDDIFF_L: return \"smlsl_advsimd_vec.xml\";\n\t\tcase ENC_SMLSL_ASIMDELEM_L: return \"smlsl_advsimd_elt.xml\";\n\t\tcase ENC_SMMLA_ASIMDSAME2_G: return \"smmla_advsimd_vec.xml\";\n\t\tcase ENC_SMNEGL_SMSUBL_64WA_DP_3SRC: return \"smnegl_smsubl.xml\";\n\t\tcase ENC_SMOV_ASIMDINS_W_W: return \"smov_advsimd.xml\";\n\t\tcase ENC_SMOV_ASIMDINS_X_X: return \"smov_advsimd.xml\";\n\t\tcase ENC_SMSTART_MSR_SI_PSTATE: return \"smstart_msr_imm.xml\";\n\t\tcase ENC_SMSTOP_MSR_SI_PSTATE: return \"smstop_msr_imm.xml\";\n\t\tcase ENC_SMSUBL_64WA_DP_3SRC: return \"smsubl.xml\";\n\t\tcase ENC_SMULH_64_DP_3SRC: return \"smulh.xml\";\n\t\tcase ENC_SMULL_SMADDL_64WA_DP_3SRC: return \"smull_smaddl.xml\";\n\t\tcase ENC_SMULL_ASIMDDIFF_L: return \"smull_advsimd_vec.xml\";\n\t\tcase ENC_SMULL_ASIMDELEM_L: return \"smull_advsimd_elt.xml\";\n\t\tcase ENC_SQABS_ASIMDMISC_R: return \"sqabs_advsimd.xml\";\n\t\tcase ENC_SQABS_ASISDMISC_R: return \"sqabs_advsimd.xml\";\n\t\tcase ENC_SQADD_ASIMDSAME_ONLY: return \"sqadd_advsimd.xml\";\n\t\tcase ENC_SQADD_ASISDSAME_ONLY: return \"sqadd_advsimd.xml\";\n\t\tcase ENC_SQDMLAL_ASIMDDIFF_L: return \"sqdmlal_advsimd_vec.xml\";\n\t\tcase ENC_SQDMLAL_ASIMDELEM_L: return \"sqdmlal_advsimd_elt.xml\";\n\t\tcase ENC_SQDMLAL_ASISDDIFF_ONLY: return \"sqdmlal_advsimd_vec.xml\";\n\t\tcase ENC_SQDMLAL_ASISDELEM_L: return \"sqdmlal_advsimd_elt.xml\";\n\t\tcase ENC_SQDMLSL_ASIMDDIFF_L: return \"sqdmlsl_advsimd_vec.xml\";\n\t\tcase ENC_SQDMLSL_ASIMDELEM_L: return \"sqdmlsl_advsimd_elt.xml\";\n\t\tcase ENC_SQDMLSL_ASISDDIFF_ONLY: return \"sqdmlsl_advsimd_vec.xml\";\n\t\tcase ENC_SQDMLSL_ASISDELEM_L: return \"sqdmlsl_advsimd_elt.xml\";\n\t\tcase ENC_SQDMULH_ASIMDELEM_R: return \"sqdmulh_advsimd_elt.xml\";\n\t\tcase ENC_SQDMULH_ASIMDSAME_ONLY: return \"sqdmulh_advsimd_vec.xml\";\n\t\tcase ENC_SQDMULH_ASISDELEM_R: return \"sqdmulh_advsimd_elt.xml\";\n\t\tcase ENC_SQDMULH_ASISDSAME_ONLY: return \"sqdmulh_advsimd_vec.xml\";\n\t\tcase ENC_SQDMULL_ASIMDDIFF_L: return \"sqdmull_advsimd_vec.xml\";\n\t\tcase ENC_SQDMULL_ASIMDELEM_L: return \"sqdmull_advsimd_elt.xml\";\n\t\tcase ENC_SQDMULL_ASISDDIFF_ONLY: return \"sqdmull_advsimd_vec.xml\";\n\t\tcase ENC_SQDMULL_ASISDELEM_L: return \"sqdmull_advsimd_elt.xml\";\n\t\tcase ENC_SQNEG_ASIMDMISC_R: return \"sqneg_advsimd.xml\";\n\t\tcase ENC_SQNEG_ASISDMISC_R: return \"sqneg_advsimd.xml\";\n\t\tcase ENC_SQRDMLAH_ASIMDELEM_R: return \"sqrdmlah_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMLAH_ASIMDSAME2_ONLY: return \"sqrdmlah_advsimd_vec.xml\";\n\t\tcase ENC_SQRDMLAH_ASISDELEM_R: return \"sqrdmlah_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMLAH_ASISDSAME2_ONLY: return \"sqrdmlah_advsimd_vec.xml\";\n\t\tcase ENC_SQRDMLSH_ASIMDELEM_R: return \"sqrdmlsh_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMLSH_ASIMDSAME2_ONLY: return \"sqrdmlsh_advsimd_vec.xml\";\n\t\tcase ENC_SQRDMLSH_ASISDELEM_R: return \"sqrdmlsh_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMLSH_ASISDSAME2_ONLY: return \"sqrdmlsh_advsimd_vec.xml\";\n\t\tcase ENC_SQRDMULH_ASIMDELEM_R: return \"sqrdmulh_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMULH_ASIMDSAME_ONLY: return \"sqrdmulh_advsimd_vec.xml\";\n\t\tcase ENC_SQRDMULH_ASISDELEM_R: return \"sqrdmulh_advsimd_elt.xml\";\n\t\tcase ENC_SQRDMULH_ASISDSAME_ONLY: return \"sqrdmulh_advsimd_vec.xml\";\n\t\tcase ENC_SQRSHL_ASIMDSAME_ONLY: return \"sqrshl_advsimd.xml\";\n\t\tcase ENC_SQRSHL_ASISDSAME_ONLY: return \"sqrshl_advsimd.xml\";\n\t\tcase ENC_SQRSHRN_ASIMDSHF_N: return \"sqrshrn_advsimd.xml\";\n\t\tcase ENC_SQRSHRN_ASISDSHF_N: return \"sqrshrn_advsimd.xml\";\n\t\tcase ENC_SQRSHRUN_ASIMDSHF_N: return \"sqrshrun_advsimd.xml\";\n\t\tcase ENC_SQRSHRUN_ASISDSHF_N: return \"sqrshrun_advsimd.xml\";\n\t\tcase ENC_SQSHLU_ASIMDSHF_R: return \"sqshlu_advsimd.xml\";\n\t\tcase ENC_SQSHLU_ASISDSHF_R: return \"sqshlu_advsimd.xml\";\n\t\tcase ENC_SQSHL_ASIMDSAME_ONLY: return \"sqshl_advsimd_reg.xml\";\n\t\tcase ENC_SQSHL_ASIMDSHF_R: return \"sqshl_advsimd_imm.xml\";\n\t\tcase ENC_SQSHL_ASISDSAME_ONLY: return \"sqshl_advsimd_reg.xml\";\n\t\tcase ENC_SQSHL_ASISDSHF_R: return \"sqshl_advsimd_imm.xml\";\n\t\tcase ENC_SQSHRN_ASIMDSHF_N: return \"sqshrn_advsimd.xml\";\n\t\tcase ENC_SQSHRN_ASISDSHF_N: return \"sqshrn_advsimd.xml\";\n\t\tcase ENC_SQSHRUN_ASIMDSHF_N: return \"sqshrun_advsimd.xml\";\n\t\tcase ENC_SQSHRUN_ASISDSHF_N: return \"sqshrun_advsimd.xml\";\n\t\tcase ENC_SQSUB_ASIMDSAME_ONLY: return \"sqsub_advsimd.xml\";\n\t\tcase ENC_SQSUB_ASISDSAME_ONLY: return \"sqsub_advsimd.xml\";\n\t\tcase ENC_SQXTN_ASIMDMISC_N: return \"sqxtn_advsimd.xml\";\n\t\tcase ENC_SQXTN_ASISDMISC_N: return \"sqxtn_advsimd.xml\";\n\t\tcase ENC_SQXTUN_ASIMDMISC_N: return \"sqxtun_advsimd.xml\";\n\t\tcase ENC_SQXTUN_ASISDMISC_N: return \"sqxtun_advsimd.xml\";\n\t\tcase ENC_SRHADD_ASIMDSAME_ONLY: return \"srhadd_advsimd.xml\";\n\t\tcase ENC_SRI_ASIMDSHF_R: return \"sri_advsimd.xml\";\n\t\tcase ENC_SRI_ASISDSHF_R: return \"sri_advsimd.xml\";\n\t\tcase ENC_SRSHL_ASIMDSAME_ONLY: return \"srshl_advsimd.xml\";\n\t\tcase ENC_SRSHL_ASISDSAME_ONLY: return \"srshl_advsimd.xml\";\n\t\tcase ENC_SRSHR_ASIMDSHF_R: return \"srshr_advsimd.xml\";\n\t\tcase ENC_SRSHR_ASISDSHF_R: return \"srshr_advsimd.xml\";\n\t\tcase ENC_SRSRA_ASIMDSHF_R: return \"srsra_advsimd.xml\";\n\t\tcase ENC_SRSRA_ASISDSHF_R: return \"srsra_advsimd.xml\";\n\t\tcase ENC_SSBB_DSB_BO_BARRIERS: return \"ssbb_dsb.xml\";\n\t\tcase ENC_SSHLL_ASIMDSHF_L: return \"sshll_advsimd.xml\";\n\t\tcase ENC_SSHL_ASIMDSAME_ONLY: return \"sshl_advsimd.xml\";\n\t\tcase ENC_SSHL_ASISDSAME_ONLY: return \"sshl_advsimd.xml\";\n\t\tcase ENC_SSHR_ASIMDSHF_R: return \"sshr_advsimd.xml\";\n\t\tcase ENC_SSHR_ASISDSHF_R: return \"sshr_advsimd.xml\";\n\t\tcase ENC_SSRA_ASIMDSHF_R: return \"ssra_advsimd.xml\";\n\t\tcase ENC_SSRA_ASISDSHF_R: return \"ssra_advsimd.xml\";\n\t\tcase ENC_SSUBL_ASIMDDIFF_L: return \"ssubl_advsimd.xml\";\n\t\tcase ENC_SSUBW_ASIMDDIFF_W: return \"ssubw_advsimd.xml\";\n\t\tcase ENC_ST1_ASISDLSE_R1_1V: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSE_R2_2V: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSE_R3_3V: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSE_R4_4V: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_I1_I1: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_I2_I2: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_I3_I3: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_I4_I4: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_R1_R1: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_R2_R2: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_R3_R3: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSEP_R4_R4: return \"st1_advsimd_mult.xml\";\n\t\tcase ENC_ST1_ASISDLSO_B1_1B: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSO_D1_1D: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSO_H1_1H: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSO_S1_1S: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_B1_I1B: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_BX1_R1B: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_D1_I1D: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_DX1_R1D: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_H1_I1H: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_HX1_R1H: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_S1_I1S: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST1_ASISDLSOP_SX1_R1S: return \"st1_advsimd_sngl.xml\";\n\t\tcase ENC_ST2G_64SOFFSET_LDSTTAGS: return \"st2g.xml\";\n\t\tcase ENC_ST2G_64SPOST_LDSTTAGS: return \"st2g.xml\";\n\t\tcase ENC_ST2G_64SPRE_LDSTTAGS: return \"st2g.xml\";\n\t\tcase ENC_ST2_ASISDLSE_R2: return \"st2_advsimd_mult.xml\";\n\t\tcase ENC_ST2_ASISDLSEP_I2_I: return \"st2_advsimd_mult.xml\";\n\t\tcase ENC_ST2_ASISDLSEP_R2_R: return \"st2_advsimd_mult.xml\";\n\t\tcase ENC_ST2_ASISDLSO_B2_2B: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSO_D2_2D: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSO_H2_2H: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSO_S2_2S: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_B2_I2B: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_BX2_R2B: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_D2_I2D: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_DX2_R2D: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_H2_I2H: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_HX2_R2H: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_S2_I2S: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST2_ASISDLSOP_SX2_R2S: return \"st2_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSE_R3: return \"st3_advsimd_mult.xml\";\n\t\tcase ENC_ST3_ASISDLSEP_I3_I: return \"st3_advsimd_mult.xml\";\n\t\tcase ENC_ST3_ASISDLSEP_R3_R: return \"st3_advsimd_mult.xml\";\n\t\tcase ENC_ST3_ASISDLSO_B3_3B: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSO_D3_3D: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSO_H3_3H: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSO_S3_3S: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_B3_I3B: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_BX3_R3B: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_D3_I3D: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_DX3_R3D: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_H3_I3H: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_HX3_R3H: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_S3_I3S: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST3_ASISDLSOP_SX3_R3S: return \"st3_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSE_R4: return \"st4_advsimd_mult.xml\";\n\t\tcase ENC_ST4_ASISDLSEP_I4_I: return \"st4_advsimd_mult.xml\";\n\t\tcase ENC_ST4_ASISDLSEP_R4_R: return \"st4_advsimd_mult.xml\";\n\t\tcase ENC_ST4_ASISDLSO_B4_4B: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSO_D4_4D: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSO_H4_4H: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSO_S4_4S: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_B4_I4B: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_BX4_R4B: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_D4_I4D: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_DX4_R4D: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_H4_I4H: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_HX4_R4H: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_S4_I4S: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST4_ASISDLSOP_SX4_R4S: return \"st4_advsimd_sngl.xml\";\n\t\tcase ENC_ST64BV0_64_MEMOP: return \"st64bv0.xml\";\n\t\tcase ENC_ST64BV_64_MEMOP: return \"st64bv.xml\";\n\t\tcase ENC_ST64B_64L_MEMOP: return \"st64b.xml\";\n\t\tcase ENC_STADDB_LDADDB_32_MEMOP: return \"staddb_ldaddb.xml\";\n\t\tcase ENC_STADDH_LDADDH_32_MEMOP: return \"staddh_ldaddh.xml\";\n\t\tcase ENC_STADDLB_LDADDLB_32_MEMOP: return \"staddb_ldaddb.xml\";\n\t\tcase ENC_STADDLH_LDADDLH_32_MEMOP: return \"staddh_ldaddh.xml\";\n\t\tcase ENC_STADDL_LDADDL_32_MEMOP: return \"stadd_ldadd.xml\";\n\t\tcase ENC_STADDL_LDADDL_64_MEMOP: return \"stadd_ldadd.xml\";\n\t\tcase ENC_STADD_LDADD_32_MEMOP: return \"stadd_ldadd.xml\";\n\t\tcase ENC_STADD_LDADD_64_MEMOP: return \"stadd_ldadd.xml\";\n\t\tcase ENC_STCLRB_LDCLRB_32_MEMOP: return \"stclrb_ldclrb.xml\";\n\t\tcase ENC_STCLRH_LDCLRH_32_MEMOP: return \"stclrh_ldclrh.xml\";\n\t\tcase ENC_STCLRLB_LDCLRLB_32_MEMOP: return \"stclrb_ldclrb.xml\";\n\t\tcase ENC_STCLRLH_LDCLRLH_32_MEMOP: return \"stclrh_ldclrh.xml\";\n\t\tcase ENC_STCLRL_LDCLRL_32_MEMOP: return \"stclr_ldclr.xml\";\n\t\tcase ENC_STCLRL_LDCLRL_64_MEMOP: return \"stclr_ldclr.xml\";\n\t\tcase ENC_STCLR_LDCLR_32_MEMOP: return \"stclr_ldclr.xml\";\n\t\tcase ENC_STCLR_LDCLR_64_MEMOP: return \"stclr_ldclr.xml\";\n\t\tcase ENC_STEORB_LDEORB_32_MEMOP: return \"steorb_ldeorb.xml\";\n\t\tcase ENC_STEORH_LDEORH_32_MEMOP: return \"steorh_ldeorh.xml\";\n\t\tcase ENC_STEORLB_LDEORLB_32_MEMOP: return \"steorb_ldeorb.xml\";\n\t\tcase ENC_STEORLH_LDEORLH_32_MEMOP: return \"steorh_ldeorh.xml\";\n\t\tcase ENC_STEORL_LDEORL_32_MEMOP: return \"steor_ldeor.xml\";\n\t\tcase ENC_STEORL_LDEORL_64_MEMOP: return \"steor_ldeor.xml\";\n\t\tcase ENC_STEOR_LDEOR_32_MEMOP: return \"steor_ldeor.xml\";\n\t\tcase ENC_STEOR_LDEOR_64_MEMOP: return \"steor_ldeor.xml\";\n\t\tcase ENC_STGM_64BULK_LDSTTAGS: return \"stgm.xml\";\n\t\tcase ENC_STGP_64_LDSTPAIR_OFF: return \"stgp.xml\";\n\t\tcase ENC_STGP_64_LDSTPAIR_POST: return \"stgp.xml\";\n\t\tcase ENC_STGP_64_LDSTPAIR_PRE: return \"stgp.xml\";\n\t\tcase ENC_STG_64SOFFSET_LDSTTAGS: return \"stg.xml\";\n\t\tcase ENC_STG_64SPOST_LDSTTAGS: return \"stg.xml\";\n\t\tcase ENC_STG_64SPRE_LDSTTAGS: return \"stg.xml\";\n\t\tcase ENC_STLLRB_SL32_LDSTORD: return \"stllrb.xml\";\n\t\tcase ENC_STLLRH_SL32_LDSTORD: return \"stllrh.xml\";\n\t\tcase ENC_STLLR_SL32_LDSTORD: return \"stllr.xml\";\n\t\tcase ENC_STLLR_SL64_LDSTORD: return \"stllr.xml\";\n\t\tcase ENC_STLRB_SL32_LDSTORD: return \"stlrb.xml\";\n\t\tcase ENC_STLRH_SL32_LDSTORD: return \"stlrh.xml\";\n\t\tcase ENC_STLR_SL32_LDSTORD: return \"stlr.xml\";\n\t\tcase ENC_STLR_SL64_LDSTORD: return \"stlr.xml\";\n\t\tcase ENC_STLURB_32_LDAPSTL_UNSCALED: return \"stlurb.xml\";\n\t\tcase ENC_STLURH_32_LDAPSTL_UNSCALED: return \"stlurh.xml\";\n\t\tcase ENC_STLUR_32_LDAPSTL_UNSCALED: return \"stlur_gen.xml\";\n\t\tcase ENC_STLUR_64_LDAPSTL_UNSCALED: return \"stlur_gen.xml\";\n\t\tcase ENC_STLXP_SP32_LDSTEXCLP: return \"stlxp.xml\";\n\t\tcase ENC_STLXP_SP64_LDSTEXCLP: return \"stlxp.xml\";\n\t\tcase ENC_STLXRB_SR32_LDSTEXCLR: return \"stlxrb.xml\";\n\t\tcase ENC_STLXRH_SR32_LDSTEXCLR: return \"stlxrh.xml\";\n\t\tcase ENC_STLXR_SR32_LDSTEXCLR: return \"stlxr.xml\";\n\t\tcase ENC_STLXR_SR64_LDSTEXCLR: return \"stlxr.xml\";\n\t\tcase ENC_STNP_32_LDSTNAPAIR_OFFS: return \"stnp_gen.xml\";\n\t\tcase ENC_STNP_64_LDSTNAPAIR_OFFS: return \"stnp_gen.xml\";\n\t\tcase ENC_STNP_D_LDSTNAPAIR_OFFS: return \"stnp_fpsimd.xml\";\n\t\tcase ENC_STNP_Q_LDSTNAPAIR_OFFS: return \"stnp_fpsimd.xml\";\n\t\tcase ENC_STNP_S_LDSTNAPAIR_OFFS: return \"stnp_fpsimd.xml\";\n\t\tcase ENC_STP_32_LDSTPAIR_OFF: return \"stp_gen.xml\";\n\t\tcase ENC_STP_32_LDSTPAIR_POST: return \"stp_gen.xml\";\n\t\tcase ENC_STP_32_LDSTPAIR_PRE: return \"stp_gen.xml\";\n\t\tcase ENC_STP_64_LDSTPAIR_OFF: return \"stp_gen.xml\";\n\t\tcase ENC_STP_64_LDSTPAIR_POST: return \"stp_gen.xml\";\n\t\tcase ENC_STP_64_LDSTPAIR_PRE: return \"stp_gen.xml\";\n\t\tcase ENC_STP_D_LDSTPAIR_OFF: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_D_LDSTPAIR_POST: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_D_LDSTPAIR_PRE: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_Q_LDSTPAIR_OFF: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_Q_LDSTPAIR_POST: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_Q_LDSTPAIR_PRE: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_S_LDSTPAIR_OFF: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_S_LDSTPAIR_POST: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STP_S_LDSTPAIR_PRE: return \"stp_fpsimd.xml\";\n\t\tcase ENC_STRB_32BL_LDST_REGOFF: return \"strb_reg.xml\";\n\t\tcase ENC_STRB_32B_LDST_REGOFF: return \"strb_reg.xml\";\n\t\tcase ENC_STRB_32_LDST_IMMPOST: return \"strb_imm.xml\";\n\t\tcase ENC_STRB_32_LDST_IMMPRE: return \"strb_imm.xml\";\n\t\tcase ENC_STRB_32_LDST_POS: return \"strb_imm.xml\";\n\t\tcase ENC_STRH_32_LDST_IMMPOST: return \"strh_imm.xml\";\n\t\tcase ENC_STRH_32_LDST_IMMPRE: return \"strh_imm.xml\";\n\t\tcase ENC_STRH_32_LDST_POS: return \"strh_imm.xml\";\n\t\tcase ENC_STRH_32_LDST_REGOFF: return \"strh_reg.xml\";\n\t\tcase ENC_STR_32_LDST_IMMPOST: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_32_LDST_IMMPRE: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_32_LDST_POS: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_32_LDST_REGOFF: return \"str_reg_gen.xml\";\n\t\tcase ENC_STR_64_LDST_IMMPOST: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_64_LDST_IMMPRE: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_64_LDST_POS: return \"str_imm_gen.xml\";\n\t\tcase ENC_STR_64_LDST_REGOFF: return \"str_reg_gen.xml\";\n\t\tcase ENC_STR_BL_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STR_B_LDST_IMMPOST: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_B_LDST_IMMPRE: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_B_LDST_POS: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_B_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STR_D_LDST_IMMPOST: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_D_LDST_IMMPRE: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_D_LDST_POS: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_D_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STR_H_LDST_IMMPOST: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_H_LDST_IMMPRE: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_H_LDST_POS: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_H_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STR_Q_LDST_IMMPOST: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_Q_LDST_IMMPRE: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_Q_LDST_POS: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_Q_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STR_S_LDST_IMMPOST: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_S_LDST_IMMPRE: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_S_LDST_POS: return \"str_imm_fpsimd.xml\";\n\t\tcase ENC_STR_S_LDST_REGOFF: return \"str_reg_fpsimd.xml\";\n\t\tcase ENC_STSETB_LDSETB_32_MEMOP: return \"stsetb_ldsetb.xml\";\n\t\tcase ENC_STSETH_LDSETH_32_MEMOP: return \"stseth_ldseth.xml\";\n\t\tcase ENC_STSETLB_LDSETLB_32_MEMOP: return \"stsetb_ldsetb.xml\";\n\t\tcase ENC_STSETLH_LDSETLH_32_MEMOP: return \"stseth_ldseth.xml\";\n\t\tcase ENC_STSETL_LDSETL_32_MEMOP: return \"stset_ldset.xml\";\n\t\tcase ENC_STSETL_LDSETL_64_MEMOP: return \"stset_ldset.xml\";\n\t\tcase ENC_STSET_LDSET_32_MEMOP: return \"stset_ldset.xml\";\n\t\tcase ENC_STSET_LDSET_64_MEMOP: return \"stset_ldset.xml\";\n\t\tcase ENC_STSMAXB_LDSMAXB_32_MEMOP: return \"stsmaxb_ldsmaxb.xml\";\n\t\tcase ENC_STSMAXH_LDSMAXH_32_MEMOP: return \"stsmaxh_ldsmaxh.xml\";\n\t\tcase ENC_STSMAXLB_LDSMAXLB_32_MEMOP: return \"stsmaxb_ldsmaxb.xml\";\n\t\tcase ENC_STSMAXLH_LDSMAXLH_32_MEMOP: return \"stsmaxh_ldsmaxh.xml\";\n\t\tcase ENC_STSMAXL_LDSMAXL_32_MEMOP: return \"stsmax_ldsmax.xml\";\n\t\tcase ENC_STSMAXL_LDSMAXL_64_MEMOP: return \"stsmax_ldsmax.xml\";\n\t\tcase ENC_STSMAX_LDSMAX_32_MEMOP: return \"stsmax_ldsmax.xml\";\n\t\tcase ENC_STSMAX_LDSMAX_64_MEMOP: return \"stsmax_ldsmax.xml\";\n\t\tcase ENC_STSMINB_LDSMINB_32_MEMOP: return \"stsminb_ldsminb.xml\";\n\t\tcase ENC_STSMINH_LDSMINH_32_MEMOP: return \"stsminh_ldsminh.xml\";\n\t\tcase ENC_STSMINLB_LDSMINLB_32_MEMOP: return \"stsminb_ldsminb.xml\";\n\t\tcase ENC_STSMINLH_LDSMINLH_32_MEMOP: return \"stsminh_ldsminh.xml\";\n\t\tcase ENC_STSMINL_LDSMINL_32_MEMOP: return \"stsmin_ldsmin.xml\";\n\t\tcase ENC_STSMINL_LDSMINL_64_MEMOP: return \"stsmin_ldsmin.xml\";\n\t\tcase ENC_STSMIN_LDSMIN_32_MEMOP: return \"stsmin_ldsmin.xml\";\n\t\tcase ENC_STSMIN_LDSMIN_64_MEMOP: return \"stsmin_ldsmin.xml\";\n\t\tcase ENC_STTRB_32_LDST_UNPRIV: return \"sttrb.xml\";\n\t\tcase ENC_STTRH_32_LDST_UNPRIV: return \"sttrh.xml\";\n\t\tcase ENC_STTR_32_LDST_UNPRIV: return \"sttr.xml\";\n\t\tcase ENC_STTR_64_LDST_UNPRIV: return \"sttr.xml\";\n\t\tcase ENC_STUMAXB_LDUMAXB_32_MEMOP: return \"stumaxb_ldumaxb.xml\";\n\t\tcase ENC_STUMAXH_LDUMAXH_32_MEMOP: return \"stumaxh_ldumaxh.xml\";\n\t\tcase ENC_STUMAXLB_LDUMAXLB_32_MEMOP: return \"stumaxb_ldumaxb.xml\";\n\t\tcase ENC_STUMAXLH_LDUMAXLH_32_MEMOP: return \"stumaxh_ldumaxh.xml\";\n\t\tcase ENC_STUMAXL_LDUMAXL_32_MEMOP: return \"stumax_ldumax.xml\";\n\t\tcase ENC_STUMAXL_LDUMAXL_64_MEMOP: return \"stumax_ldumax.xml\";\n\t\tcase ENC_STUMAX_LDUMAX_32_MEMOP: return \"stumax_ldumax.xml\";\n\t\tcase ENC_STUMAX_LDUMAX_64_MEMOP: return \"stumax_ldumax.xml\";\n\t\tcase ENC_STUMINB_LDUMINB_32_MEMOP: return \"stuminb_lduminb.xml\";\n\t\tcase ENC_STUMINH_LDUMINH_32_MEMOP: return \"stuminh_lduminh.xml\";\n\t\tcase ENC_STUMINLB_LDUMINLB_32_MEMOP: return \"stuminb_lduminb.xml\";\n\t\tcase ENC_STUMINLH_LDUMINLH_32_MEMOP: return \"stuminh_lduminh.xml\";\n\t\tcase ENC_STUMINL_LDUMINL_32_MEMOP: return \"stumin_ldumin.xml\";\n\t\tcase ENC_STUMINL_LDUMINL_64_MEMOP: return \"stumin_ldumin.xml\";\n\t\tcase ENC_STUMIN_LDUMIN_32_MEMOP: return \"stumin_ldumin.xml\";\n\t\tcase ENC_STUMIN_LDUMIN_64_MEMOP: return \"stumin_ldumin.xml\";\n\t\tcase ENC_STURB_32_LDST_UNSCALED: return \"sturb.xml\";\n\t\tcase ENC_STURH_32_LDST_UNSCALED: return \"sturh.xml\";\n\t\tcase ENC_STUR_32_LDST_UNSCALED: return \"stur_gen.xml\";\n\t\tcase ENC_STUR_64_LDST_UNSCALED: return \"stur_gen.xml\";\n\t\tcase ENC_STUR_B_LDST_UNSCALED: return \"stur_fpsimd.xml\";\n\t\tcase ENC_STUR_D_LDST_UNSCALED: return \"stur_fpsimd.xml\";\n\t\tcase ENC_STUR_H_LDST_UNSCALED: return \"stur_fpsimd.xml\";\n\t\tcase ENC_STUR_Q_LDST_UNSCALED: return \"stur_fpsimd.xml\";\n\t\tcase ENC_STUR_S_LDST_UNSCALED: return \"stur_fpsimd.xml\";\n\t\tcase ENC_STXP_SP32_LDSTEXCLP: return \"stxp.xml\";\n\t\tcase ENC_STXP_SP64_LDSTEXCLP: return \"stxp.xml\";\n\t\tcase ENC_STXRB_SR32_LDSTEXCLR: return \"stxrb.xml\";\n\t\tcase ENC_STXRH_SR32_LDSTEXCLR: return \"stxrh.xml\";\n\t\tcase ENC_STXR_SR32_LDSTEXCLR: return \"stxr.xml\";\n\t\tcase ENC_STXR_SR64_LDSTEXCLR: return \"stxr.xml\";\n\t\tcase ENC_STZ2G_64SOFFSET_LDSTTAGS: return \"stz2g.xml\";\n\t\tcase ENC_STZ2G_64SPOST_LDSTTAGS: return \"stz2g.xml\";\n\t\tcase ENC_STZ2G_64SPRE_LDSTTAGS: return \"stz2g.xml\";\n\t\tcase ENC_STZGM_64BULK_LDSTTAGS: return \"stzgm.xml\";\n\t\tcase ENC_STZG_64SOFFSET_LDSTTAGS: return \"stzg.xml\";\n\t\tcase ENC_STZG_64SPOST_LDSTTAGS: return \"stzg.xml\";\n\t\tcase ENC_STZG_64SPRE_LDSTTAGS: return \"stzg.xml\";\n\t\tcase ENC_SUBG_64_ADDSUB_IMMTAGS: return \"subg.xml\";\n\t\tcase ENC_SUBHN_ASIMDDIFF_N: return \"subhn_advsimd.xml\";\n\t\tcase ENC_SUBPS_64S_DP_2SRC: return \"subps.xml\";\n\t\tcase ENC_SUBP_64S_DP_2SRC: return \"subp.xml\";\n\t\tcase ENC_SUBS_32S_ADDSUB_EXT: return \"subs_addsub_ext.xml\";\n\t\tcase ENC_SUBS_32S_ADDSUB_IMM: return \"subs_addsub_imm.xml\";\n\t\tcase ENC_SUBS_32_ADDSUB_SHIFT: return \"subs_addsub_shift.xml\";\n\t\tcase ENC_SUBS_64S_ADDSUB_EXT: return \"subs_addsub_ext.xml\";\n\t\tcase ENC_SUBS_64S_ADDSUB_IMM: return \"subs_addsub_imm.xml\";\n\t\tcase ENC_SUBS_64_ADDSUB_SHIFT: return \"subs_addsub_shift.xml\";\n\t\tcase ENC_SUB_32_ADDSUB_EXT: return \"sub_addsub_ext.xml\";\n\t\tcase ENC_SUB_32_ADDSUB_IMM: return \"sub_addsub_imm.xml\";\n\t\tcase ENC_SUB_32_ADDSUB_SHIFT: return \"sub_addsub_shift.xml\";\n\t\tcase ENC_SUB_64_ADDSUB_EXT: return \"sub_addsub_ext.xml\";\n\t\tcase ENC_SUB_64_ADDSUB_IMM: return \"sub_addsub_imm.xml\";\n\t\tcase ENC_SUB_64_ADDSUB_SHIFT: return \"sub_addsub_shift.xml\";\n\t\tcase ENC_SUB_ASIMDSAME_ONLY: return \"sub_advsimd.xml\";\n\t\tcase ENC_SUB_ASISDSAME_ONLY: return \"sub_advsimd.xml\";\n\t\tcase ENC_SUDOT_ASIMDELEM_D: return \"sudot_advsimd_elt.xml\";\n\t\tcase ENC_SUQADD_ASIMDMISC_R: return \"suqadd_advsimd.xml\";\n\t\tcase ENC_SUQADD_ASISDMISC_R: return \"suqadd_advsimd.xml\";\n\t\tcase ENC_SVC_EX_EXCEPTION: return \"svc.xml\";\n\t\tcase ENC_SWPAB_32_MEMOP: return \"swpb.xml\";\n\t\tcase ENC_SWPAH_32_MEMOP: return \"swph.xml\";\n\t\tcase ENC_SWPALB_32_MEMOP: return \"swpb.xml\";\n\t\tcase ENC_SWPALH_32_MEMOP: return \"swph.xml\";\n\t\tcase ENC_SWPAL_32_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWPAL_64_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWPA_32_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWPA_64_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWPB_32_MEMOP: return \"swpb.xml\";\n\t\tcase ENC_SWPH_32_MEMOP: return \"swph.xml\";\n\t\tcase ENC_SWPLB_32_MEMOP: return \"swpb.xml\";\n\t\tcase ENC_SWPLH_32_MEMOP: return \"swph.xml\";\n\t\tcase ENC_SWPL_32_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWPL_64_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWP_32_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SWP_64_MEMOP: return \"swp.xml\";\n\t\tcase ENC_SXTB_SBFM_32M_BITFIELD: return \"sxtb_sbfm.xml\";\n\t\tcase ENC_SXTB_SBFM_64M_BITFIELD: return \"sxtb_sbfm.xml\";\n\t\tcase ENC_SXTH_SBFM_32M_BITFIELD: return \"sxth_sbfm.xml\";\n\t\tcase ENC_SXTH_SBFM_64M_BITFIELD: return \"sxth_sbfm.xml\";\n\t\tcase ENC_SXTL_SSHLL_ASIMDSHF_L: return \"sxtl_sshll_advsimd.xml\";\n\t\tcase ENC_SXTW_SBFM_64M_BITFIELD: return \"sxtw_sbfm.xml\";\n\t\tcase ENC_SYSL_RC_SYSTEMINSTRS: return \"sysl.xml\";\n\t\tcase ENC_SYS_CR_SYSTEMINSTRS: return \"sys.xml\";\n\t\tcase ENC_TBL_ASIMDTBL_L1_1: return \"tbl_advsimd.xml\";\n\t\tcase ENC_TBL_ASIMDTBL_L2_2: return \"tbl_advsimd.xml\";\n\t\tcase ENC_TBL_ASIMDTBL_L3_3: return \"tbl_advsimd.xml\";\n\t\tcase ENC_TBL_ASIMDTBL_L4_4: return \"tbl_advsimd.xml\";\n\t\tcase ENC_TBNZ_ONLY_TESTBRANCH: return \"tbnz.xml\";\n\t\tcase ENC_TBX_ASIMDTBL_L1_1: return \"tbx_advsimd.xml\";\n\t\tcase ENC_TBX_ASIMDTBL_L2_2: return \"tbx_advsimd.xml\";\n\t\tcase ENC_TBX_ASIMDTBL_L3_3: return \"tbx_advsimd.xml\";\n\t\tcase ENC_TBX_ASIMDTBL_L4_4: return \"tbx_advsimd.xml\";\n\t\tcase ENC_TBZ_ONLY_TESTBRANCH: return \"tbz.xml\";\n\t\tcase ENC_TCANCEL_EX_EXCEPTION: return \"tcancel.xml\";\n\t\tcase ENC_TCOMMIT_ONLY_BARRIERS: return \"tcommit.xml\";\n\t\tcase ENC_TLBI_SYS_CR_SYSTEMINSTRS: return \"tlbi_sys.xml\";\n\t\tcase ENC_TRN1_ASIMDPERM_ONLY: return \"trn1_advsimd.xml\";\n\t\tcase ENC_TRN2_ASIMDPERM_ONLY: return \"trn2_advsimd.xml\";\n\t\tcase ENC_TSB_HC_HINTS: return \"tsb.xml\";\n\t\tcase ENC_TSTART_BR_SYSTEMRESULT: return \"tstart.xml\";\n\t\tcase ENC_TST_ANDS_32S_LOG_IMM: return \"tst_ands_log_imm.xml\";\n\t\tcase ENC_TST_ANDS_32_LOG_SHIFT: return \"tst_ands_log_shift.xml\";\n\t\tcase ENC_TST_ANDS_64S_LOG_IMM: return \"tst_ands_log_imm.xml\";\n\t\tcase ENC_TST_ANDS_64_LOG_SHIFT: return \"tst_ands_log_shift.xml\";\n\t\tcase ENC_TTEST_BR_SYSTEMRESULT: return \"ttest.xml\";\n\t\tcase ENC_UABAL_ASIMDDIFF_L: return \"uabal_advsimd.xml\";\n\t\tcase ENC_UABA_ASIMDSAME_ONLY: return \"uaba_advsimd.xml\";\n\t\tcase ENC_UABDL_ASIMDDIFF_L: return \"uabdl_advsimd.xml\";\n\t\tcase ENC_UABD_ASIMDSAME_ONLY: return \"uabd_advsimd.xml\";\n\t\tcase ENC_UADALP_ASIMDMISC_P: return \"uadalp_advsimd.xml\";\n\t\tcase ENC_UADDLP_ASIMDMISC_P: return \"uaddlp_advsimd.xml\";\n\t\tcase ENC_UADDLV_ASIMDALL_ONLY: return \"uaddlv_advsimd.xml\";\n\t\tcase ENC_UADDL_ASIMDDIFF_L: return \"uaddl_advsimd.xml\";\n\t\tcase ENC_UADDW_ASIMDDIFF_W: return \"uaddw_advsimd.xml\";\n\t\tcase ENC_UBFIZ_UBFM_32M_BITFIELD: return \"ubfiz_ubfm.xml\";\n\t\tcase ENC_UBFIZ_UBFM_64M_BITFIELD: return \"ubfiz_ubfm.xml\";\n\t\tcase ENC_UBFM_32M_BITFIELD: return \"ubfm.xml\";\n\t\tcase ENC_UBFM_64M_BITFIELD: return \"ubfm.xml\";\n\t\tcase ENC_UBFX_UBFM_32M_BITFIELD: return \"ubfx_ubfm.xml\";\n\t\tcase ENC_UBFX_UBFM_64M_BITFIELD: return \"ubfx_ubfm.xml\";\n\t\tcase ENC_UCVTF_D32_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_D32_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_D64_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_D64_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_H32_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_H32_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_H64_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_H64_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_S32_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_S32_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_S64_FLOAT2FIX: return \"ucvtf_float_fix.xml\";\n\t\tcase ENC_UCVTF_S64_FLOAT2INT: return \"ucvtf_float_int.xml\";\n\t\tcase ENC_UCVTF_ASIMDMISC_R: return \"ucvtf_advsimd_int.xml\";\n\t\tcase ENC_UCVTF_ASIMDMISCFP16_R: return \"ucvtf_advsimd_int.xml\";\n\t\tcase ENC_UCVTF_ASIMDSHF_C: return \"ucvtf_advsimd_fix.xml\";\n\t\tcase ENC_UCVTF_ASISDMISC_R: return \"ucvtf_advsimd_int.xml\";\n\t\tcase ENC_UCVTF_ASISDMISCFP16_R: return \"ucvtf_advsimd_int.xml\";\n\t\tcase ENC_UCVTF_ASISDSHF_C: return \"ucvtf_advsimd_fix.xml\";\n\t\tcase ENC_UDF_ONLY_PERM_UNDEF: return \"udf_perm_undef.xml\";\n\t\tcase ENC_UDIV_32_DP_2SRC: return \"udiv.xml\";\n\t\tcase ENC_UDIV_64_DP_2SRC: return \"udiv.xml\";\n\t\tcase ENC_UDOT_ASIMDELEM_D: return \"udot_advsimd_elt.xml\";\n\t\tcase ENC_UDOT_ASIMDSAME2_D: return \"udot_advsimd_vec.xml\";\n\t\tcase ENC_UHADD_ASIMDSAME_ONLY: return \"uhadd_advsimd.xml\";\n\t\tcase ENC_UHSUB_ASIMDSAME_ONLY: return \"uhsub_advsimd.xml\";\n\t\tcase ENC_UMADDL_64WA_DP_3SRC: return \"umaddl.xml\";\n\t\tcase ENC_UMAXP_ASIMDSAME_ONLY: return \"umaxp_advsimd.xml\";\n\t\tcase ENC_UMAXV_ASIMDALL_ONLY: return \"umaxv_advsimd.xml\";\n\t\tcase ENC_UMAX_ASIMDSAME_ONLY: return \"umax_advsimd.xml\";\n\t\tcase ENC_UMINP_ASIMDSAME_ONLY: return \"uminp_advsimd.xml\";\n\t\tcase ENC_UMINV_ASIMDALL_ONLY: return \"uminv_advsimd.xml\";\n\t\tcase ENC_UMIN_ASIMDSAME_ONLY: return \"umin_advsimd.xml\";\n\t\tcase ENC_UMLAL_ASIMDDIFF_L: return \"umlal_advsimd_vec.xml\";\n\t\tcase ENC_UMLAL_ASIMDELEM_L: return \"umlal_advsimd_elt.xml\";\n\t\tcase ENC_UMLSL_ASIMDDIFF_L: return \"umlsl_advsimd_vec.xml\";\n\t\tcase ENC_UMLSL_ASIMDELEM_L: return \"umlsl_advsimd_elt.xml\";\n\t\tcase ENC_UMMLA_ASIMDSAME2_G: return \"ummla_advsimd_vec.xml\";\n\t\tcase ENC_UMNEGL_UMSUBL_64WA_DP_3SRC: return \"umnegl_umsubl.xml\";\n\t\tcase ENC_UMOV_ASIMDINS_W_W: return \"umov_advsimd.xml\";\n\t\tcase ENC_UMOV_ASIMDINS_X_X: return \"umov_advsimd.xml\";\n\t\tcase ENC_UMSUBL_64WA_DP_3SRC: return \"umsubl.xml\";\n\t\tcase ENC_UMULH_64_DP_3SRC: return \"umulh.xml\";\n\t\tcase ENC_UMULL_UMADDL_64WA_DP_3SRC: return \"umull_umaddl.xml\";\n\t\tcase ENC_UMULL_ASIMDDIFF_L: return \"umull_advsimd_vec.xml\";\n\t\tcase ENC_UMULL_ASIMDELEM_L: return \"umull_advsimd_elt.xml\";\n\t\tcase ENC_UQADD_ASIMDSAME_ONLY: return \"uqadd_advsimd.xml\";\n\t\tcase ENC_UQADD_ASISDSAME_ONLY: return \"uqadd_advsimd.xml\";\n\t\tcase ENC_UQRSHL_ASIMDSAME_ONLY: return \"uqrshl_advsimd.xml\";\n\t\tcase ENC_UQRSHL_ASISDSAME_ONLY: return \"uqrshl_advsimd.xml\";\n\t\tcase ENC_UQRSHRN_ASIMDSHF_N: return \"uqrshrn_advsimd.xml\";\n\t\tcase ENC_UQRSHRN_ASISDSHF_N: return \"uqrshrn_advsimd.xml\";\n\t\tcase ENC_UQSHL_ASIMDSAME_ONLY: return \"uqshl_advsimd_reg.xml\";\n\t\tcase ENC_UQSHL_ASIMDSHF_R: return \"uqshl_advsimd_imm.xml\";\n\t\tcase ENC_UQSHL_ASISDSAME_ONLY: return \"uqshl_advsimd_reg.xml\";\n\t\tcase ENC_UQSHL_ASISDSHF_R: return \"uqshl_advsimd_imm.xml\";\n\t\tcase ENC_UQSHRN_ASIMDSHF_N: return \"uqshrn_advsimd.xml\";\n\t\tcase ENC_UQSHRN_ASISDSHF_N: return \"uqshrn_advsimd.xml\";\n\t\tcase ENC_UQSUB_ASIMDSAME_ONLY: return \"uqsub_advsimd.xml\";\n\t\tcase ENC_UQSUB_ASISDSAME_ONLY: return \"uqsub_advsimd.xml\";\n\t\tcase ENC_UQXTN_ASIMDMISC_N: return \"uqxtn_advsimd.xml\";\n\t\tcase ENC_UQXTN_ASISDMISC_N: return \"uqxtn_advsimd.xml\";\n\t\tcase ENC_URECPE_ASIMDMISC_R: return \"urecpe_advsimd.xml\";\n\t\tcase ENC_URHADD_ASIMDSAME_ONLY: return \"urhadd_advsimd.xml\";\n\t\tcase ENC_URSHL_ASIMDSAME_ONLY: return \"urshl_advsimd.xml\";\n\t\tcase ENC_URSHL_ASISDSAME_ONLY: return \"urshl_advsimd.xml\";\n\t\tcase ENC_URSHR_ASIMDSHF_R: return \"urshr_advsimd.xml\";\n\t\tcase ENC_URSHR_ASISDSHF_R: return \"urshr_advsimd.xml\";\n\t\tcase ENC_URSQRTE_ASIMDMISC_R: return \"ursqrte_advsimd.xml\";\n\t\tcase ENC_URSRA_ASIMDSHF_R: return \"ursra_advsimd.xml\";\n\t\tcase ENC_URSRA_ASISDSHF_R: return \"ursra_advsimd.xml\";\n\t\tcase ENC_USDOT_ASIMDELEM_D: return \"usdot_advsimd_elt.xml\";\n\t\tcase ENC_USDOT_ASIMDSAME2_D: return \"usdot_advsimd_vec.xml\";\n\t\tcase ENC_USHLL_ASIMDSHF_L: return \"ushll_advsimd.xml\";\n\t\tcase ENC_USHL_ASIMDSAME_ONLY: return \"ushl_advsimd.xml\";\n\t\tcase ENC_USHL_ASISDSAME_ONLY: return \"ushl_advsimd.xml\";\n\t\tcase ENC_USHR_ASIMDSHF_R: return \"ushr_advsimd.xml\";\n\t\tcase ENC_USHR_ASISDSHF_R: return \"ushr_advsimd.xml\";\n\t\tcase ENC_USMMLA_ASIMDSAME2_G: return \"usmmla_advsimd_vec.xml\";\n\t\tcase ENC_USQADD_ASIMDMISC_R: return \"usqadd_advsimd.xml\";\n\t\tcase ENC_USQADD_ASISDMISC_R: return \"usqadd_advsimd.xml\";\n\t\tcase ENC_USRA_ASIMDSHF_R: return \"usra_advsimd.xml\";\n\t\tcase ENC_USRA_ASISDSHF_R: return \"usra_advsimd.xml\";\n\t\tcase ENC_USUBL_ASIMDDIFF_L: return \"usubl_advsimd.xml\";\n\t\tcase ENC_USUBW_ASIMDDIFF_W: return \"usubw_advsimd.xml\";\n\t\tcase ENC_UXTB_UBFM_32M_BITFIELD: return \"uxtb_ubfm.xml\";\n\t\tcase ENC_UXTH_UBFM_32M_BITFIELD: return \"uxth_ubfm.xml\";\n\t\tcase ENC_UXTL_USHLL_ASIMDSHF_L: return \"uxtl_ushll_advsimd.xml\";\n\t\tcase ENC_UZP1_ASIMDPERM_ONLY: return \"uzp1_advsimd.xml\";\n\t\tcase ENC_UZP2_ASIMDPERM_ONLY: return \"uzp2_advsimd.xml\";\n\t\tcase ENC_WFET_ONLY_SYSTEMINSTRSWITHREG: return \"wfet.xml\";\n\t\tcase ENC_WFE_HI_HINTS: return \"wfe.xml\";\n\t\tcase ENC_WFIT_ONLY_SYSTEMINSTRSWITHREG: return \"wfit.xml\";\n\t\tcase ENC_WFI_HI_HINTS: return \"wfi.xml\";\n\t\tcase ENC_XAFLAG_M_PSTATE: return \"xaflag.xml\";\n\t\tcase ENC_XAR_VVV2_CRYPTO3_IMM6: return \"xar_advsimd.xml\";\n\t\tcase ENC_XPACD_64Z_DP_1SRC: return \"xpac.xml\";\n\t\tcase ENC_XPACI_64Z_DP_1SRC: return \"xpac.xml\";\n\t\tcase ENC_XPACLRI_HI_HINTS: return \"xpac.xml\";\n\t\tcase ENC_XTN_ASIMDMISC_N: return \"xtn_advsimd.xml\";\n\t\tcase ENC_YIELD_HI_HINTS: return \"yield.xml\";\n\t\tcase ENC_ZIP1_ASIMDPERM_ONLY: return \"zip1_advsimd.xml\";\n\t\tcase ENC_ZIP2_ASIMDPERM_ONLY: return \"zip2_advsimd.xml\";\n\t\tcase ENC_ABS_Z_P_Z_: return \"abs_z_p_z.xml\";\n\t\tcase ENC_ADCLB_Z_ZZZ_: return \"adclb_z_zzz.xml\";\n\t\tcase ENC_ADCLT_Z_ZZZ_: return \"adclt_z_zzz.xml\";\n\t\tcase ENC_ADD_Z_P_ZZ_: return \"add_z_p_zz.xml\";\n\t\tcase ENC_ADD_Z_ZI_: return \"add_z_zi.xml\";\n\t\tcase ENC_ADD_Z_ZZ_: return \"add_z_zz.xml\";\n\t\tcase ENC_ADDHA_ZA_PP_Z_32: return \"addha_za_pp_z.xml\";\n\t\tcase ENC_ADDHA_ZA_PP_Z_64: return \"addha_za_pp_z.xml\";\n\t\tcase ENC_ADDHNB_Z_ZZ_: return \"addhnb_z_zz.xml\";\n\t\tcase ENC_ADDHNT_Z_ZZ_: return \"addhnt_z_zz.xml\";\n\t\tcase ENC_ADDP_Z_P_ZZ_: return \"addp_z_p_zz.xml\";\n\t\tcase ENC_ADDPL_R_RI_: return \"addpl_r_ri.xml\";\n\t\tcase ENC_ADDVA_ZA_PP_Z_32: return \"addva_za_pp_z.xml\";\n\t\tcase ENC_ADDVA_ZA_PP_Z_64: return \"addva_za_pp_z.xml\";\n\t\tcase ENC_ADDVL_R_RI_: return \"addvl_r_ri.xml\";\n\t\tcase ENC_ADR_Z_AZ_D_S32_SCALED: return \"adr_z_az.xml\";\n\t\tcase ENC_ADR_Z_AZ_D_U32_SCALED: return \"adr_z_az.xml\";\n\t\tcase ENC_ADR_Z_AZ_SD_SAME_SCALED: return \"adr_z_az.xml\";\n\t\tcase ENC_AESD_Z_ZZ_: return \"aesd_z_zz.xml\";\n\t\tcase ENC_AESE_Z_ZZ_: return \"aese_z_zz.xml\";\n\t\tcase ENC_AESIMC_Z_Z_: return \"aesimc_z_z.xml\";\n\t\tcase ENC_AESMC_Z_Z_: return \"aesmc_z_z.xml\";\n\t\tcase ENC_AND_P_P_PP_Z: return \"and_p_p_pp.xml\";\n\t\tcase ENC_AND_Z_P_ZZ_: return \"and_z_p_zz.xml\";\n\t\tcase ENC_AND_Z_ZI_: return \"and_z_zi.xml\";\n\t\tcase ENC_AND_Z_ZZ_: return \"and_z_zz.xml\";\n\t\tcase ENC_ANDS_P_P_PP_Z: return \"ands_p_p_pp.xml\";\n\t\tcase ENC_ANDV_R_P_Z_: return \"andv_r_p_z.xml\";\n\t\tcase ENC_ASR_Z_P_ZI_: return \"asr_z_p_zi.xml\";\n\t\tcase ENC_ASR_Z_P_ZW_: return \"asr_z_p_zw.xml\";\n\t\tcase ENC_ASR_Z_P_ZZ_: return \"asr_z_p_zz.xml\";\n\t\tcase ENC_ASR_Z_ZI_: return \"asr_z_zi.xml\";\n\t\tcase ENC_ASR_Z_ZW_: return \"asr_z_zw.xml\";\n\t\tcase ENC_ASRD_Z_P_ZI_: return \"asrd_z_p_zi.xml\";\n\t\tcase ENC_ASRR_Z_P_ZZ_: return \"asrr_z_p_zz.xml\";\n\t\tcase ENC_BCAX_Z_ZZZ_: return \"bcax_z_zzz.xml\";\n\t\tcase ENC_BDEP_Z_ZZ_: return \"bdep_z_zz.xml\";\n\t\tcase ENC_BEXT_Z_ZZ_: return \"bext_z_zz.xml\";\n\t\tcase ENC_BFCVT_Z_P_Z_S2BF: return \"bfcvt_z_p_z.xml\";\n\t\tcase ENC_BFCVTNT_Z_P_Z_S2BF: return \"bfcvtnt_z_p_z.xml\";\n\t\tcase ENC_BFDOT_Z_ZZZ_: return \"bfdot_z_zzz.xml\";\n\t\tcase ENC_BFDOT_Z_ZZZI_: return \"bfdot_z_zzzi.xml\";\n\t\tcase ENC_BFMLALB_Z_ZZZ_: return \"bfmlalb_z_zzz.xml\";\n\t\tcase ENC_BFMLALB_Z_ZZZI_: return \"bfmlalb_z_zzzi.xml\";\n\t\tcase ENC_BFMLALT_Z_ZZZ_: return \"bfmlalt_z_zzz.xml\";\n\t\tcase ENC_BFMLALT_Z_ZZZI_: return \"bfmlalt_z_zzzi.xml\";\n\t\tcase ENC_BFMMLA_Z_ZZZ_: return \"bfmmla_z_zzz.xml\";\n\t\tcase ENC_BFMOPA_ZA32_PP_ZZ_: return \"bfmopa_za32_pp_zz.xml\";\n\t\tcase ENC_BFMOPS_ZA32_PP_ZZ_: return \"bfmops_za32_pp_zz.xml\";\n\t\tcase ENC_BGRP_Z_ZZ_: return \"bgrp_z_zz.xml\";\n\t\tcase ENC_BIC_P_P_PP_Z: return \"bic_p_p_pp.xml\";\n\t\tcase ENC_BIC_Z_P_ZZ_: return \"bic_z_p_zz.xml\";\n\t\tcase ENC_BIC_Z_ZZ_: return \"bic_z_zz.xml\";\n\t\tcase ENC_BICS_P_P_PP_Z: return \"bics_p_p_pp.xml\";\n\t\tcase ENC_BRKA_P_P_P_: return \"brka_p_p_p.xml\";\n\t\tcase ENC_BRKAS_P_P_P_Z: return \"brkas_p_p_p.xml\";\n\t\tcase ENC_BRKB_P_P_P_: return \"brkb_p_p_p.xml\";\n\t\tcase ENC_BRKBS_P_P_P_Z: return \"brkbs_p_p_p.xml\";\n\t\tcase ENC_BRKN_P_P_PP_: return \"brkn_p_p_pp.xml\";\n\t\tcase ENC_BRKNS_P_P_PP_: return \"brkns_p_p_pp.xml\";\n\t\tcase ENC_BRKPA_P_P_PP_: return \"brkpa_p_p_pp.xml\";\n\t\tcase ENC_BRKPAS_P_P_PP_: return \"brkpas_p_p_pp.xml\";\n\t\tcase ENC_BRKPB_P_P_PP_: return \"brkpb_p_p_pp.xml\";\n\t\tcase ENC_BRKPBS_P_P_PP_: return \"brkpbs_p_p_pp.xml\";\n\t\tcase ENC_BSL1N_Z_ZZZ_: return \"bsl1n_z_zzz.xml\";\n\t\tcase ENC_BSL2N_Z_ZZZ_: return \"bsl2n_z_zzz.xml\";\n\t\tcase ENC_BSL_Z_ZZZ_: return \"bsl_z_zzz.xml\";\n\t\tcase ENC_CADD_Z_ZZ_: return \"cadd_z_zz.xml\";\n\t\tcase ENC_CDOT_Z_ZZZ_: return \"cdot_z_zzz.xml\";\n\t\tcase ENC_CDOT_Z_ZZZI_D: return \"cdot_z_zzzi.xml\";\n\t\tcase ENC_CDOT_Z_ZZZI_S: return \"cdot_z_zzzi.xml\";\n\t\tcase ENC_CLASTA_R_P_Z_: return \"clasta_r_p_z.xml\";\n\t\tcase ENC_CLASTA_V_P_Z_: return \"clasta_v_p_z.xml\";\n\t\tcase ENC_CLASTA_Z_P_ZZ_: return \"clasta_z_p_zz.xml\";\n\t\tcase ENC_CLASTB_R_P_Z_: return \"clastb_r_p_z.xml\";\n\t\tcase ENC_CLASTB_V_P_Z_: return \"clastb_v_p_z.xml\";\n\t\tcase ENC_CLASTB_Z_P_ZZ_: return \"clastb_z_p_zz.xml\";\n\t\tcase ENC_CLS_Z_P_Z_: return \"cls_z_p_z.xml\";\n\t\tcase ENC_CLZ_Z_P_Z_: return \"clz_z_p_z.xml\";\n\t\tcase ENC_CMLA_Z_ZZZ_: return \"cmla_z_zzz.xml\";\n\t\tcase ENC_CMLA_Z_ZZZI_H: return \"cmla_z_zzzi.xml\";\n\t\tcase ENC_CMLA_Z_ZZZI_S: return \"cmla_z_zzzi.xml\";\n\t\tcase ENC_CMPEQ_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPEQ_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPEQ_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPGE_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPGE_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPGE_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPGT_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPGT_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPGT_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPHI_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPHI_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPHI_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPHS_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPHS_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPHS_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CMPLE_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPLE_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPLO_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPLO_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPLS_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPLS_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPLT_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPLT_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPNE_P_P_ZI_: return \"cmpeq_p_p_zi.xml\";\n\t\tcase ENC_CMPNE_P_P_ZW_: return \"cmpeq_p_p_zw.xml\";\n\t\tcase ENC_CMPNE_P_P_ZZ_: return \"cmpeq_p_p_zz.xml\";\n\t\tcase ENC_CNOT_Z_P_Z_: return \"cnot_z_p_z.xml\";\n\t\tcase ENC_CNT_Z_P_Z_: return \"cnt_z_p_z.xml\";\n\t\tcase ENC_CNTB_R_S_: return \"cntb_r_s.xml\";\n\t\tcase ENC_CNTD_R_S_: return \"cntb_r_s.xml\";\n\t\tcase ENC_CNTH_R_S_: return \"cntb_r_s.xml\";\n\t\tcase ENC_CNTP_R_P_P_: return \"cntp_r_p_p.xml\";\n\t\tcase ENC_CNTW_R_S_: return \"cntb_r_s.xml\";\n\t\tcase ENC_COMPACT_Z_P_Z_: return \"compact_z_p_z.xml\";\n\t\tcase ENC_CPY_Z_O_I_: return \"cpy_z_o_i.xml\";\n\t\tcase ENC_CPY_Z_P_I_: return \"cpy_z_p_i.xml\";\n\t\tcase ENC_CPY_Z_P_R_: return \"cpy_z_p_r.xml\";\n\t\tcase ENC_CPY_Z_P_V_: return \"cpy_z_p_v.xml\";\n\t\tcase ENC_CTERMEQ_RR_: return \"ctermeq_rr.xml\";\n\t\tcase ENC_CTERMNE_RR_: return \"ctermeq_rr.xml\";\n\t\tcase ENC_DECB_R_RS_: return \"decb_r_rs.xml\";\n\t\tcase ENC_DECD_R_RS_: return \"decb_r_rs.xml\";\n\t\tcase ENC_DECD_Z_ZS_: return \"decd_z_zs.xml\";\n\t\tcase ENC_DECH_R_RS_: return \"decb_r_rs.xml\";\n\t\tcase ENC_DECH_Z_ZS_: return \"decd_z_zs.xml\";\n\t\tcase ENC_DECP_R_P_R_: return \"decp_r_p_r.xml\";\n\t\tcase ENC_DECP_Z_P_Z_: return \"decp_z_p_z.xml\";\n\t\tcase ENC_DECW_R_RS_: return \"decb_r_rs.xml\";\n\t\tcase ENC_DECW_Z_ZS_: return \"decd_z_zs.xml\";\n\t\tcase ENC_DUP_P_P_PI_: return \"dup_p_p_pi.xml\";\n\t\tcase ENC_DUP_Z_I_: return \"dup_z_i.xml\";\n\t\tcase ENC_DUP_Z_R_: return \"dup_z_r.xml\";\n\t\tcase ENC_DUP_Z_ZI_: return \"dup_z_zi.xml\";\n\t\tcase ENC_DUPM_Z_I_: return \"dupm_z_i.xml\";\n\t\tcase ENC_EOR3_Z_ZZZ_: return \"eor3_z_zzz.xml\";\n\t\tcase ENC_EOR_P_P_PP_Z: return \"eor_p_p_pp.xml\";\n\t\tcase ENC_EOR_Z_P_ZZ_: return \"eor_z_p_zz.xml\";\n\t\tcase ENC_EOR_Z_ZI_: return \"eor_z_zi.xml\";\n\t\tcase ENC_EOR_Z_ZZ_: return \"eor_z_zz.xml\";\n\t\tcase ENC_EORBT_Z_ZZ_: return \"eorbt_z_zz.xml\";\n\t\tcase ENC_EORS_P_P_PP_Z: return \"eors_p_p_pp.xml\";\n\t\tcase ENC_EORTB_Z_ZZ_: return \"eortb_z_zz.xml\";\n\t\tcase ENC_EORV_R_P_Z_: return \"eorv_r_p_z.xml\";\n\t\tcase ENC_EXT_Z_ZI_CON: return \"ext_z_zi.xml\";\n\t\tcase ENC_EXT_Z_ZI_DES: return \"ext_z_zi.xml\";\n\t\tcase ENC_FABD_Z_P_ZZ_: return \"fabd_z_p_zz.xml\";\n\t\tcase ENC_FABS_Z_P_Z_: return \"fabs_z_p_z.xml\";\n\t\tcase ENC_FACGE_P_P_ZZ_: return \"facge_p_p_zz.xml\";\n\t\tcase ENC_FACGT_P_P_ZZ_: return \"facge_p_p_zz.xml\";\n\t\tcase ENC_FADD_Z_P_ZS_: return \"fadd_z_p_zs.xml\";\n\t\tcase ENC_FADD_Z_P_ZZ_: return \"fadd_z_p_zz.xml\";\n\t\tcase ENC_FADD_Z_ZZ_: return \"fadd_z_zz.xml\";\n\t\tcase ENC_FADDA_V_P_Z_: return \"fadda_v_p_z.xml\";\n\t\tcase ENC_FADDP_Z_P_ZZ_: return \"faddp_z_p_zz.xml\";\n\t\tcase ENC_FADDV_V_P_Z_: return \"faddv_v_p_z.xml\";\n\t\tcase ENC_FCADD_Z_P_ZZ_: return \"fcadd_z_p_zz.xml\";\n\t\tcase ENC_FCMEQ_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMEQ_P_P_ZZ_: return \"fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMGE_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMGE_P_P_ZZ_: return \"fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMGT_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMGT_P_P_ZZ_: return \"fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMLA_Z_P_ZZZ_: return \"fcmla_z_p_zzz.xml\";\n\t\tcase ENC_FCMLA_Z_ZZZI_H: return \"fcmla_z_zzzi.xml\";\n\t\tcase ENC_FCMLA_Z_ZZZI_S: return \"fcmla_z_zzzi.xml\";\n\t\tcase ENC_FCMLE_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMLT_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMNE_P_P_Z0_: return \"fcmeq_p_p_z0.xml\";\n\t\tcase ENC_FCMNE_P_P_ZZ_: return \"fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCMUO_P_P_ZZ_: return \"fcmeq_p_p_zz.xml\";\n\t\tcase ENC_FCPY_Z_P_I_: return \"fcpy_z_p_i.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_D2H: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_D2S: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_H2D: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_H2S: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_S2D: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVT_Z_P_Z_S2H: return \"fcvt_z_p_z.xml\";\n\t\tcase ENC_FCVTLT_Z_P_Z_H2S: return \"fcvtlt_z_p_z.xml\";\n\t\tcase ENC_FCVTLT_Z_P_Z_S2D: return \"fcvtlt_z_p_z.xml\";\n\t\tcase ENC_FCVTNT_Z_P_Z_D2S: return \"fcvtnt_z_p_z.xml\";\n\t\tcase ENC_FCVTNT_Z_P_Z_S2H: return \"fcvtnt_z_p_z.xml\";\n\t\tcase ENC_FCVTX_Z_P_Z_D2S: return \"fcvtx_z_p_z.xml\";\n\t\tcase ENC_FCVTXNT_Z_P_Z_D2S: return \"fcvtxnt_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_D2W: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_D2X: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162H: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162W: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_FP162X: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_S2W: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZS_Z_P_Z_S2X: return \"fcvtzs_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_D2W: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_D2X: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162H: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162W: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_FP162X: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_S2W: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FCVTZU_Z_P_Z_S2X: return \"fcvtzu_z_p_z.xml\";\n\t\tcase ENC_FDIV_Z_P_ZZ_: return \"fdiv_z_p_zz.xml\";\n\t\tcase ENC_FDIVR_Z_P_ZZ_: return \"fdivr_z_p_zz.xml\";\n\t\tcase ENC_FDUP_Z_I_: return \"fdup_z_i.xml\";\n\t\tcase ENC_FEXPA_Z_Z_: return \"fexpa_z_z.xml\";\n\t\tcase ENC_FLOGB_Z_P_Z_: return \"flogb_z_p_z.xml\";\n\t\tcase ENC_FMAD_Z_P_ZZZ_: return \"fmad_z_p_zzz.xml\";\n\t\tcase ENC_FMAX_Z_P_ZS_: return \"fmax_z_p_zs.xml\";\n\t\tcase ENC_FMAX_Z_P_ZZ_: return \"fmax_z_p_zz.xml\";\n\t\tcase ENC_FMAXNM_Z_P_ZS_: return \"fmaxnm_z_p_zs.xml\";\n\t\tcase ENC_FMAXNM_Z_P_ZZ_: return \"fmaxnm_z_p_zz.xml\";\n\t\tcase ENC_FMAXNMP_Z_P_ZZ_: return \"fmaxnmp_z_p_zz.xml\";\n\t\tcase ENC_FMAXNMV_V_P_Z_: return \"fmaxnmv_v_p_z.xml\";\n\t\tcase ENC_FMAXP_Z_P_ZZ_: return \"fmaxp_z_p_zz.xml\";\n\t\tcase ENC_FMAXV_V_P_Z_: return \"fmaxv_v_p_z.xml\";\n\t\tcase ENC_FMIN_Z_P_ZS_: return \"fmin_z_p_zs.xml\";\n\t\tcase ENC_FMIN_Z_P_ZZ_: return \"fmin_z_p_zz.xml\";\n\t\tcase ENC_FMINNM_Z_P_ZS_: return \"fminnm_z_p_zs.xml\";\n\t\tcase ENC_FMINNM_Z_P_ZZ_: return \"fminnm_z_p_zz.xml\";\n\t\tcase ENC_FMINNMP_Z_P_ZZ_: return \"fminnmp_z_p_zz.xml\";\n\t\tcase ENC_FMINNMV_V_P_Z_: return \"fminnmv_v_p_z.xml\";\n\t\tcase ENC_FMINP_Z_P_ZZ_: return \"fminp_z_p_zz.xml\";\n\t\tcase ENC_FMINV_V_P_Z_: return \"fminv_v_p_z.xml\";\n\t\tcase ENC_FMLA_Z_P_ZZZ_: return \"fmla_z_p_zzz.xml\";\n\t\tcase ENC_FMLA_Z_ZZZI_D: return \"fmla_z_zzzi.xml\";\n\t\tcase ENC_FMLA_Z_ZZZI_H: return \"fmla_z_zzzi.xml\";\n\t\tcase ENC_FMLA_Z_ZZZI_S: return \"fmla_z_zzzi.xml\";\n\t\tcase ENC_FMLALB_Z_ZZZ_: return \"fmlalb_z_zzz.xml\";\n\t\tcase ENC_FMLALB_Z_ZZZI_S: return \"fmlalb_z_zzzi.xml\";\n\t\tcase ENC_FMLALT_Z_ZZZ_: return \"fmlalt_z_zzz.xml\";\n\t\tcase ENC_FMLALT_Z_ZZZI_S: return \"fmlalt_z_zzzi.xml\";\n\t\tcase ENC_FMLS_Z_P_ZZZ_: return \"fmls_z_p_zzz.xml\";\n\t\tcase ENC_FMLS_Z_ZZZI_D: return \"fmls_z_zzzi.xml\";\n\t\tcase ENC_FMLS_Z_ZZZI_H: return \"fmls_z_zzzi.xml\";\n\t\tcase ENC_FMLS_Z_ZZZI_S: return \"fmls_z_zzzi.xml\";\n\t\tcase ENC_FMLSLB_Z_ZZZ_: return \"fmlslb_z_zzz.xml\";\n\t\tcase ENC_FMLSLB_Z_ZZZI_S: return \"fmlslb_z_zzzi.xml\";\n\t\tcase ENC_FMLSLT_Z_ZZZ_: return \"fmlslt_z_zzz.xml\";\n\t\tcase ENC_FMLSLT_Z_ZZZI_S: return \"fmlslt_z_zzzi.xml\";\n\t\tcase ENC_FMMLA_Z_ZZZ_D: return \"fmmla_z_zzz.xml\";\n\t\tcase ENC_FMMLA_Z_ZZZ_S: return \"fmmla_z_zzz.xml\";\n\t\tcase ENC_FMOPA_ZA32_PP_ZZ_16: return \"fmopa_za32_pp_zz.xml\";\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_32: return \"fmopa_za_pp_zz.xml\";\n\t\tcase ENC_FMOPA_ZA_PP_ZZ_64: return \"fmopa_za_pp_zz.xml\";\n\t\tcase ENC_FMOPS_ZA32_PP_ZZ_16: return \"fmops_za32_pp_zz.xml\";\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_32: return \"fmops_za_pp_zz.xml\";\n\t\tcase ENC_FMOPS_ZA_PP_ZZ_64: return \"fmops_za_pp_zz.xml\";\n\t\tcase ENC_FMSB_Z_P_ZZZ_: return \"fmsb_z_p_zzz.xml\";\n\t\tcase ENC_FMUL_Z_P_ZS_: return \"fmul_z_p_zs.xml\";\n\t\tcase ENC_FMUL_Z_P_ZZ_: return \"fmul_z_p_zz.xml\";\n\t\tcase ENC_FMUL_Z_ZZ_: return \"fmul_z_zz.xml\";\n\t\tcase ENC_FMUL_Z_ZZI_D: return \"fmul_z_zzi.xml\";\n\t\tcase ENC_FMUL_Z_ZZI_H: return \"fmul_z_zzi.xml\";\n\t\tcase ENC_FMUL_Z_ZZI_S: return \"fmul_z_zzi.xml\";\n\t\tcase ENC_FMULX_Z_P_ZZ_: return \"fmulx_z_p_zz.xml\";\n\t\tcase ENC_FNEG_Z_P_Z_: return \"fneg_z_p_z.xml\";\n\t\tcase ENC_FNMAD_Z_P_ZZZ_: return \"fnmad_z_p_zzz.xml\";\n\t\tcase ENC_FNMLA_Z_P_ZZZ_: return \"fnmla_z_p_zzz.xml\";\n\t\tcase ENC_FNMLS_Z_P_ZZZ_: return \"fnmls_z_p_zzz.xml\";\n\t\tcase ENC_FNMSB_Z_P_ZZZ_: return \"fnmsb_z_p_zzz.xml\";\n\t\tcase ENC_FRECPE_Z_Z_: return \"frecpe_z_z.xml\";\n\t\tcase ENC_FRECPS_Z_ZZ_: return \"frecps_z_zz.xml\";\n\t\tcase ENC_FRECPX_Z_P_Z_: return \"frecpx_z_p_z.xml\";\n\t\tcase ENC_FRINTA_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTI_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTM_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTN_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTP_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTX_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRINTZ_Z_P_Z_: return \"frinta_z_p_z.xml\";\n\t\tcase ENC_FRSQRTE_Z_Z_: return \"frsqrte_z_z.xml\";\n\t\tcase ENC_FRSQRTS_Z_ZZ_: return \"frsqrts_z_zz.xml\";\n\t\tcase ENC_FSCALE_Z_P_ZZ_: return \"fscale_z_p_zz.xml\";\n\t\tcase ENC_FSQRT_Z_P_Z_: return \"fsqrt_z_p_z.xml\";\n\t\tcase ENC_FSUB_Z_P_ZS_: return \"fsub_z_p_zs.xml\";\n\t\tcase ENC_FSUB_Z_P_ZZ_: return \"fsub_z_p_zz.xml\";\n\t\tcase ENC_FSUB_Z_ZZ_: return \"fsub_z_zz.xml\";\n\t\tcase ENC_FSUBR_Z_P_ZS_: return \"fsubr_z_p_zs.xml\";\n\t\tcase ENC_FSUBR_Z_P_ZZ_: return \"fsubr_z_p_zz.xml\";\n\t\tcase ENC_FTMAD_Z_ZZI_: return \"ftmad_z_zzi.xml\";\n\t\tcase ENC_FTSMUL_Z_ZZ_: return \"ftsmul_z_zz.xml\";\n\t\tcase ENC_FTSSEL_Z_ZZ_: return \"ftssel_z_zz.xml\";\n\t\tcase ENC_HISTCNT_Z_P_ZZ_: return \"histcnt_z_p_zz.xml\";\n\t\tcase ENC_HISTSEG_Z_ZZ_: return \"histseg_z_zz.xml\";\n\t\tcase ENC_INCB_R_RS_: return \"incb_r_rs.xml\";\n\t\tcase ENC_INCD_R_RS_: return \"incb_r_rs.xml\";\n\t\tcase ENC_INCD_Z_ZS_: return \"incd_z_zs.xml\";\n\t\tcase ENC_INCH_R_RS_: return \"incb_r_rs.xml\";\n\t\tcase ENC_INCH_Z_ZS_: return \"incd_z_zs.xml\";\n\t\tcase ENC_INCP_R_P_R_: return \"incp_r_p_r.xml\";\n\t\tcase ENC_INCP_Z_P_Z_: return \"incp_z_p_z.xml\";\n\t\tcase ENC_INCW_R_RS_: return \"incb_r_rs.xml\";\n\t\tcase ENC_INCW_Z_ZS_: return \"incd_z_zs.xml\";\n\t\tcase ENC_INDEX_Z_II_: return \"index_z_ii.xml\";\n\t\tcase ENC_INDEX_Z_IR_: return \"index_z_ir.xml\";\n\t\tcase ENC_INDEX_Z_RI_: return \"index_z_ri.xml\";\n\t\tcase ENC_INDEX_Z_RR_: return \"index_z_rr.xml\";\n\t\tcase ENC_INSR_Z_R_: return \"insr_z_r.xml\";\n\t\tcase ENC_INSR_Z_V_: return \"insr_z_v.xml\";\n\t\tcase ENC_LASTA_R_P_Z_: return \"lasta_r_p_z.xml\";\n\t\tcase ENC_LASTA_V_P_Z_: return \"lasta_v_p_z.xml\";\n\t\tcase ENC_LASTB_R_P_Z_: return \"lastb_r_p_z.xml\";\n\t\tcase ENC_LASTB_V_P_Z_: return \"lastb_v_p_z.xml\";\n\t\tcase ENC_LD1B_Z_P_AI_D: return \"ld1b_z_p_ai.xml\";\n\t\tcase ENC_LD1B_Z_P_AI_S: return \"ld1b_z_p_ai.xml\";\n\t\tcase ENC_LD1B_Z_P_BI_U16: return \"ld1b_z_p_bi.xml\";\n\t\tcase ENC_LD1B_Z_P_BI_U32: return \"ld1b_z_p_bi.xml\";\n\t\tcase ENC_LD1B_Z_P_BI_U64: return \"ld1b_z_p_bi.xml\";\n\t\tcase ENC_LD1B_Z_P_BI_U8: return \"ld1b_z_p_bi.xml\";\n\t\tcase ENC_LD1B_Z_P_BR_U16: return \"ld1b_z_p_br.xml\";\n\t\tcase ENC_LD1B_Z_P_BR_U32: return \"ld1b_z_p_br.xml\";\n\t\tcase ENC_LD1B_Z_P_BR_U64: return \"ld1b_z_p_br.xml\";\n\t\tcase ENC_LD1B_Z_P_BR_U8: return \"ld1b_z_p_br.xml\";\n\t\tcase ENC_LD1B_Z_P_BZ_D_64_UNSCALED: return \"ld1b_z_p_bz.xml\";\n\t\tcase ENC_LD1B_Z_P_BZ_D_X32_UNSCALED: return \"ld1b_z_p_bz.xml\";\n\t\tcase ENC_LD1B_Z_P_BZ_S_X32_UNSCALED: return \"ld1b_z_p_bz.xml\";\n\t\tcase ENC_LD1B_ZA_P_RRR_: return \"ld1b_za_p_rrr.xml\";\n\t\tcase ENC_LD1D_Z_P_AI_D: return \"ld1d_z_p_ai.xml\";\n\t\tcase ENC_LD1D_Z_P_BI_U64: return \"ld1d_z_p_bi.xml\";\n\t\tcase ENC_LD1D_Z_P_BR_U64: return \"ld1d_z_p_br.xml\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_SCALED: return \"ld1d_z_p_bz.xml\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_64_UNSCALED: return \"ld1d_z_p_bz.xml\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_SCALED: return \"ld1d_z_p_bz.xml\";\n\t\tcase ENC_LD1D_Z_P_BZ_D_X32_UNSCALED: return \"ld1d_z_p_bz.xml\";\n\t\tcase ENC_LD1D_ZA_P_RRR_: return \"ld1d_za_p_rrr.xml\";\n\t\tcase ENC_LD1H_Z_P_AI_D: return \"ld1h_z_p_ai.xml\";\n\t\tcase ENC_LD1H_Z_P_AI_S: return \"ld1h_z_p_ai.xml\";\n\t\tcase ENC_LD1H_Z_P_BI_U16: return \"ld1h_z_p_bi.xml\";\n\t\tcase ENC_LD1H_Z_P_BI_U32: return \"ld1h_z_p_bi.xml\";\n\t\tcase ENC_LD1H_Z_P_BI_U64: return \"ld1h_z_p_bi.xml\";\n\t\tcase ENC_LD1H_Z_P_BR_U16: return \"ld1h_z_p_br.xml\";\n\t\tcase ENC_LD1H_Z_P_BR_U32: return \"ld1h_z_p_br.xml\";\n\t\tcase ENC_LD1H_Z_P_BR_U64: return \"ld1h_z_p_br.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_SCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_64_UNSCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_SCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_D_X32_UNSCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_SCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_Z_P_BZ_S_X32_UNSCALED: return \"ld1h_z_p_bz.xml\";\n\t\tcase ENC_LD1H_ZA_P_RRR_: return \"ld1h_za_p_rrr.xml\";\n\t\tcase ENC_LD1Q_ZA_P_RRR_: return \"ld1q_za_p_rrr.xml\";\n\t\tcase ENC_LD1RB_Z_P_BI_U16: return \"ld1rb_z_p_bi.xml\";\n\t\tcase ENC_LD1RB_Z_P_BI_U32: return \"ld1rb_z_p_bi.xml\";\n\t\tcase ENC_LD1RB_Z_P_BI_U64: return \"ld1rb_z_p_bi.xml\";\n\t\tcase ENC_LD1RB_Z_P_BI_U8: return \"ld1rb_z_p_bi.xml\";\n\t\tcase ENC_LD1RD_Z_P_BI_U64: return \"ld1rd_z_p_bi.xml\";\n\t\tcase ENC_LD1RH_Z_P_BI_U16: return \"ld1rh_z_p_bi.xml\";\n\t\tcase ENC_LD1RH_Z_P_BI_U32: return \"ld1rh_z_p_bi.xml\";\n\t\tcase ENC_LD1RH_Z_P_BI_U64: return \"ld1rh_z_p_bi.xml\";\n\t\tcase ENC_LD1ROB_Z_P_BI_U8: return \"ld1rob_z_p_bi.xml\";\n\t\tcase ENC_LD1ROB_Z_P_BR_CONTIGUOUS: return \"ld1rob_z_p_br.xml\";\n\t\tcase ENC_LD1ROD_Z_P_BI_U64: return \"ld1rod_z_p_bi.xml\";\n\t\tcase ENC_LD1ROD_Z_P_BR_CONTIGUOUS: return \"ld1rod_z_p_br.xml\";\n\t\tcase ENC_LD1ROH_Z_P_BI_U16: return \"ld1roh_z_p_bi.xml\";\n\t\tcase ENC_LD1ROH_Z_P_BR_CONTIGUOUS: return \"ld1roh_z_p_br.xml\";\n\t\tcase ENC_LD1ROW_Z_P_BI_U32: return \"ld1row_z_p_bi.xml\";\n\t\tcase ENC_LD1ROW_Z_P_BR_CONTIGUOUS: return \"ld1row_z_p_br.xml\";\n\t\tcase ENC_LD1RQB_Z_P_BI_U8: return \"ld1rqb_z_p_bi.xml\";\n\t\tcase ENC_LD1RQB_Z_P_BR_CONTIGUOUS: return \"ld1rqb_z_p_br.xml\";\n\t\tcase ENC_LD1RQD_Z_P_BI_U64: return \"ld1rqd_z_p_bi.xml\";\n\t\tcase ENC_LD1RQD_Z_P_BR_CONTIGUOUS: return \"ld1rqd_z_p_br.xml\";\n\t\tcase ENC_LD1RQH_Z_P_BI_U16: return \"ld1rqh_z_p_bi.xml\";\n\t\tcase ENC_LD1RQH_Z_P_BR_CONTIGUOUS: return \"ld1rqh_z_p_br.xml\";\n\t\tcase ENC_LD1RQW_Z_P_BI_U32: return \"ld1rqw_z_p_bi.xml\";\n\t\tcase ENC_LD1RQW_Z_P_BR_CONTIGUOUS: return \"ld1rqw_z_p_br.xml\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S16: return \"ld1rsb_z_p_bi.xml\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S32: return \"ld1rsb_z_p_bi.xml\";\n\t\tcase ENC_LD1RSB_Z_P_BI_S64: return \"ld1rsb_z_p_bi.xml\";\n\t\tcase ENC_LD1RSH_Z_P_BI_S32: return \"ld1rsh_z_p_bi.xml\";\n\t\tcase ENC_LD1RSH_Z_P_BI_S64: return \"ld1rsh_z_p_bi.xml\";\n\t\tcase ENC_LD1RSW_Z_P_BI_S64: return \"ld1rsw_z_p_bi.xml\";\n\t\tcase ENC_LD1RW_Z_P_BI_U32: return \"ld1rw_z_p_bi.xml\";\n\t\tcase ENC_LD1RW_Z_P_BI_U64: return \"ld1rw_z_p_bi.xml\";\n\t\tcase ENC_LD1SB_Z_P_AI_D: return \"ld1sb_z_p_ai.xml\";\n\t\tcase ENC_LD1SB_Z_P_AI_S: return \"ld1sb_z_p_ai.xml\";\n\t\tcase ENC_LD1SB_Z_P_BI_S16: return \"ld1sb_z_p_bi.xml\";\n\t\tcase ENC_LD1SB_Z_P_BI_S32: return \"ld1sb_z_p_bi.xml\";\n\t\tcase ENC_LD1SB_Z_P_BI_S64: return \"ld1sb_z_p_bi.xml\";\n\t\tcase ENC_LD1SB_Z_P_BR_S16: return \"ld1sb_z_p_br.xml\";\n\t\tcase ENC_LD1SB_Z_P_BR_S32: return \"ld1sb_z_p_br.xml\";\n\t\tcase ENC_LD1SB_Z_P_BR_S64: return \"ld1sb_z_p_br.xml\";\n\t\tcase ENC_LD1SB_Z_P_BZ_D_64_UNSCALED: return \"ld1sb_z_p_bz.xml\";\n\t\tcase ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED: return \"ld1sb_z_p_bz.xml\";\n\t\tcase ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED: return \"ld1sb_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_AI_D: return \"ld1sh_z_p_ai.xml\";\n\t\tcase ENC_LD1SH_Z_P_AI_S: return \"ld1sh_z_p_ai.xml\";\n\t\tcase ENC_LD1SH_Z_P_BI_S32: return \"ld1sh_z_p_bi.xml\";\n\t\tcase ENC_LD1SH_Z_P_BI_S64: return \"ld1sh_z_p_bi.xml\";\n\t\tcase ENC_LD1SH_Z_P_BR_S32: return \"ld1sh_z_p_br.xml\";\n\t\tcase ENC_LD1SH_Z_P_BR_S64: return \"ld1sh_z_p_br.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_SCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_64_UNSCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_SCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_SCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED: return \"ld1sh_z_p_bz.xml\";\n\t\tcase ENC_LD1SW_Z_P_AI_D: return \"ld1sw_z_p_ai.xml\";\n\t\tcase ENC_LD1SW_Z_P_BI_S64: return \"ld1sw_z_p_bi.xml\";\n\t\tcase ENC_LD1SW_Z_P_BR_S64: return \"ld1sw_z_p_br.xml\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_SCALED: return \"ld1sw_z_p_bz.xml\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_64_UNSCALED: return \"ld1sw_z_p_bz.xml\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_SCALED: return \"ld1sw_z_p_bz.xml\";\n\t\tcase ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED: return \"ld1sw_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_AI_D: return \"ld1w_z_p_ai.xml\";\n\t\tcase ENC_LD1W_Z_P_AI_S: return \"ld1w_z_p_ai.xml\";\n\t\tcase ENC_LD1W_Z_P_BI_U32: return \"ld1w_z_p_bi.xml\";\n\t\tcase ENC_LD1W_Z_P_BI_U64: return \"ld1w_z_p_bi.xml\";\n\t\tcase ENC_LD1W_Z_P_BR_U32: return \"ld1w_z_p_br.xml\";\n\t\tcase ENC_LD1W_Z_P_BR_U64: return \"ld1w_z_p_br.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_SCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_64_UNSCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_SCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_D_X32_UNSCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_SCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_Z_P_BZ_S_X32_UNSCALED: return \"ld1w_z_p_bz.xml\";\n\t\tcase ENC_LD1W_ZA_P_RRR_: return \"ld1w_za_p_rrr.xml\";\n\t\tcase ENC_LD2B_Z_P_BI_CONTIGUOUS: return \"ld2b_z_p_bi.xml\";\n\t\tcase ENC_LD2B_Z_P_BR_CONTIGUOUS: return \"ld2b_z_p_br.xml\";\n\t\tcase ENC_LD2D_Z_P_BI_CONTIGUOUS: return \"ld2d_z_p_bi.xml\";\n\t\tcase ENC_LD2D_Z_P_BR_CONTIGUOUS: return \"ld2d_z_p_br.xml\";\n\t\tcase ENC_LD2H_Z_P_BI_CONTIGUOUS: return \"ld2h_z_p_bi.xml\";\n\t\tcase ENC_LD2H_Z_P_BR_CONTIGUOUS: return \"ld2h_z_p_br.xml\";\n\t\tcase ENC_LD2W_Z_P_BI_CONTIGUOUS: return \"ld2w_z_p_bi.xml\";\n\t\tcase ENC_LD2W_Z_P_BR_CONTIGUOUS: return \"ld2w_z_p_br.xml\";\n\t\tcase ENC_LD3B_Z_P_BI_CONTIGUOUS: return \"ld3b_z_p_bi.xml\";\n\t\tcase ENC_LD3B_Z_P_BR_CONTIGUOUS: return \"ld3b_z_p_br.xml\";\n\t\tcase ENC_LD3D_Z_P_BI_CONTIGUOUS: return \"ld3d_z_p_bi.xml\";\n\t\tcase ENC_LD3D_Z_P_BR_CONTIGUOUS: return \"ld3d_z_p_br.xml\";\n\t\tcase ENC_LD3H_Z_P_BI_CONTIGUOUS: return \"ld3h_z_p_bi.xml\";\n\t\tcase ENC_LD3H_Z_P_BR_CONTIGUOUS: return \"ld3h_z_p_br.xml\";\n\t\tcase ENC_LD3W_Z_P_BI_CONTIGUOUS: return \"ld3w_z_p_bi.xml\";\n\t\tcase ENC_LD3W_Z_P_BR_CONTIGUOUS: return \"ld3w_z_p_br.xml\";\n\t\tcase ENC_LD4B_Z_P_BI_CONTIGUOUS: return \"ld4b_z_p_bi.xml\";\n\t\tcase ENC_LD4B_Z_P_BR_CONTIGUOUS: return \"ld4b_z_p_br.xml\";\n\t\tcase ENC_LD4D_Z_P_BI_CONTIGUOUS: return \"ld4d_z_p_bi.xml\";\n\t\tcase ENC_LD4D_Z_P_BR_CONTIGUOUS: return \"ld4d_z_p_br.xml\";\n\t\tcase ENC_LD4H_Z_P_BI_CONTIGUOUS: return \"ld4h_z_p_bi.xml\";\n\t\tcase ENC_LD4H_Z_P_BR_CONTIGUOUS: return \"ld4h_z_p_br.xml\";\n\t\tcase ENC_LD4W_Z_P_BI_CONTIGUOUS: return \"ld4w_z_p_bi.xml\";\n\t\tcase ENC_LD4W_Z_P_BR_CONTIGUOUS: return \"ld4w_z_p_br.xml\";\n\t\tcase ENC_LDFF1B_Z_P_AI_D: return \"ldff1b_z_p_ai.xml\";\n\t\tcase ENC_LDFF1B_Z_P_AI_S: return \"ldff1b_z_p_ai.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U16: return \"ldff1b_z_p_br.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U32: return \"ldff1b_z_p_br.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U64: return \"ldff1b_z_p_br.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BR_U8: return \"ldff1b_z_p_br.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED: return \"ldff1b_z_p_bz.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED: return \"ldff1b_z_p_bz.xml\";\n\t\tcase ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED: return \"ldff1b_z_p_bz.xml\";\n\t\tcase ENC_LDFF1D_Z_P_AI_D: return \"ldff1d_z_p_ai.xml\";\n\t\tcase ENC_LDFF1D_Z_P_BR_U64: return \"ldff1d_z_p_br.xml\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_SCALED: return \"ldff1d_z_p_bz.xml\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED: return \"ldff1d_z_p_bz.xml\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_SCALED: return \"ldff1d_z_p_bz.xml\";\n\t\tcase ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED: return \"ldff1d_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_AI_D: return \"ldff1h_z_p_ai.xml\";\n\t\tcase ENC_LDFF1H_Z_P_AI_S: return \"ldff1h_z_p_ai.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U16: return \"ldff1h_z_p_br.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U32: return \"ldff1h_z_p_br.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BR_U64: return \"ldff1h_z_p_br.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_SCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_SCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_SCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED: return \"ldff1h_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_AI_D: return \"ldff1sb_z_p_ai.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_AI_S: return \"ldff1sb_z_p_ai.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S16: return \"ldff1sb_z_p_br.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S32: return \"ldff1sb_z_p_br.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BR_S64: return \"ldff1sb_z_p_br.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED: return \"ldff1sb_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sb_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED: return \"ldff1sb_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_AI_D: return \"ldff1sh_z_p_ai.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_AI_S: return \"ldff1sh_z_p_ai.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BR_S32: return \"ldff1sh_z_p_br.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BR_S64: return \"ldff1sh_z_p_br.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_SCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED: return \"ldff1sh_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_AI_D: return \"ldff1sw_z_p_ai.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_BR_S64: return \"ldff1sw_z_p_br.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_SCALED: return \"ldff1sw_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED: return \"ldff1sw_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED: return \"ldff1sw_z_p_bz.xml\";\n\t\tcase ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED: return \"ldff1sw_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_AI_D: return \"ldff1w_z_p_ai.xml\";\n\t\tcase ENC_LDFF1W_Z_P_AI_S: return \"ldff1w_z_p_ai.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BR_U32: return \"ldff1w_z_p_br.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BR_U64: return \"ldff1w_z_p_br.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_SCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_SCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_SCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED: return \"ldff1w_z_p_bz.xml\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U16: return \"ldnf1b_z_p_bi.xml\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U32: return \"ldnf1b_z_p_bi.xml\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U64: return \"ldnf1b_z_p_bi.xml\";\n\t\tcase ENC_LDNF1B_Z_P_BI_U8: return \"ldnf1b_z_p_bi.xml\";\n\t\tcase ENC_LDNF1D_Z_P_BI_U64: return \"ldnf1d_z_p_bi.xml\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U16: return \"ldnf1h_z_p_bi.xml\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U32: return \"ldnf1h_z_p_bi.xml\";\n\t\tcase ENC_LDNF1H_Z_P_BI_U64: return \"ldnf1h_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S16: return \"ldnf1sb_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S32: return \"ldnf1sb_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SB_Z_P_BI_S64: return \"ldnf1sb_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SH_Z_P_BI_S32: return \"ldnf1sh_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SH_Z_P_BI_S64: return \"ldnf1sh_z_p_bi.xml\";\n\t\tcase ENC_LDNF1SW_Z_P_BI_S64: return \"ldnf1sw_z_p_bi.xml\";\n\t\tcase ENC_LDNF1W_Z_P_BI_U32: return \"ldnf1w_z_p_bi.xml\";\n\t\tcase ENC_LDNF1W_Z_P_BI_U64: return \"ldnf1w_z_p_bi.xml\";\n\t\tcase ENC_LDNT1B_Z_P_AR_D_64_UNSCALED: return \"ldnt1b_z_p_ar.xml\";\n\t\tcase ENC_LDNT1B_Z_P_AR_S_X32_UNSCALED: return \"ldnt1b_z_p_ar.xml\";\n\t\tcase ENC_LDNT1B_Z_P_BI_CONTIGUOUS: return \"ldnt1b_z_p_bi.xml\";\n\t\tcase ENC_LDNT1B_Z_P_BR_CONTIGUOUS: return \"ldnt1b_z_p_br.xml\";\n\t\tcase ENC_LDNT1D_Z_P_AR_D_64_UNSCALED: return \"ldnt1d_z_p_ar.xml\";\n\t\tcase ENC_LDNT1D_Z_P_BI_CONTIGUOUS: return \"ldnt1d_z_p_bi.xml\";\n\t\tcase ENC_LDNT1D_Z_P_BR_CONTIGUOUS: return \"ldnt1d_z_p_br.xml\";\n\t\tcase ENC_LDNT1H_Z_P_AR_D_64_UNSCALED: return \"ldnt1h_z_p_ar.xml\";\n\t\tcase ENC_LDNT1H_Z_P_AR_S_X32_UNSCALED: return \"ldnt1h_z_p_ar.xml\";\n\t\tcase ENC_LDNT1H_Z_P_BI_CONTIGUOUS: return \"ldnt1h_z_p_bi.xml\";\n\t\tcase ENC_LDNT1H_Z_P_BR_CONTIGUOUS: return \"ldnt1h_z_p_br.xml\";\n\t\tcase ENC_LDNT1SB_Z_P_AR_D_64_UNSCALED: return \"ldnt1sb_z_p_ar.xml\";\n\t\tcase ENC_LDNT1SB_Z_P_AR_S_X32_UNSCALED: return \"ldnt1sb_z_p_ar.xml\";\n\t\tcase ENC_LDNT1SH_Z_P_AR_D_64_UNSCALED: return \"ldnt1sh_z_p_ar.xml\";\n\t\tcase ENC_LDNT1SH_Z_P_AR_S_X32_UNSCALED: return \"ldnt1sh_z_p_ar.xml\";\n\t\tcase ENC_LDNT1SW_Z_P_AR_D_64_UNSCALED: return \"ldnt1sw_z_p_ar.xml\";\n\t\tcase ENC_LDNT1W_Z_P_AR_D_64_UNSCALED: return \"ldnt1w_z_p_ar.xml\";\n\t\tcase ENC_LDNT1W_Z_P_AR_S_X32_UNSCALED: return \"ldnt1w_z_p_ar.xml\";\n\t\tcase ENC_LDNT1W_Z_P_BI_CONTIGUOUS: return \"ldnt1w_z_p_bi.xml\";\n\t\tcase ENC_LDNT1W_Z_P_BR_CONTIGUOUS: return \"ldnt1w_z_p_br.xml\";\n\t\tcase ENC_LDR_P_BI_: return \"ldr_p_bi.xml\";\n\t\tcase ENC_LDR_Z_BI_: return \"ldr_z_bi.xml\";\n\t\tcase ENC_LDR_ZA_RI_: return \"ldr_za_ri.xml\";\n\t\tcase ENC_LSL_Z_P_ZI_: return \"lsl_z_p_zi.xml\";\n\t\tcase ENC_LSL_Z_P_ZW_: return \"lsl_z_p_zw.xml\";\n\t\tcase ENC_LSL_Z_P_ZZ_: return \"lsl_z_p_zz.xml\";\n\t\tcase ENC_LSL_Z_ZI_: return \"lsl_z_zi.xml\";\n\t\tcase ENC_LSL_Z_ZW_: return \"lsl_z_zw.xml\";\n\t\tcase ENC_LSLR_Z_P_ZZ_: return \"lslr_z_p_zz.xml\";\n\t\tcase ENC_LSR_Z_P_ZI_: return \"lsr_z_p_zi.xml\";\n\t\tcase ENC_LSR_Z_P_ZW_: return \"lsr_z_p_zw.xml\";\n\t\tcase ENC_LSR_Z_P_ZZ_: return \"lsr_z_p_zz.xml\";\n\t\tcase ENC_LSR_Z_ZI_: return \"lsr_z_zi.xml\";\n\t\tcase ENC_LSR_Z_ZW_: return \"lsr_z_zw.xml\";\n\t\tcase ENC_LSRR_Z_P_ZZ_: return \"lsrr_z_p_zz.xml\";\n\t\tcase ENC_MAD_Z_P_ZZZ_: return \"mad_z_p_zzz.xml\";\n\t\tcase ENC_MATCH_P_P_ZZ_: return \"match_p_p_zz.xml\";\n\t\tcase ENC_MLA_Z_P_ZZZ_: return \"mla_z_p_zzz.xml\";\n\t\tcase ENC_MLA_Z_ZZZI_D: return \"mla_z_zzzi.xml\";\n\t\tcase ENC_MLA_Z_ZZZI_H: return \"mla_z_zzzi.xml\";\n\t\tcase ENC_MLA_Z_ZZZI_S: return \"mla_z_zzzi.xml\";\n\t\tcase ENC_MLS_Z_P_ZZZ_: return \"mls_z_p_zzz.xml\";\n\t\tcase ENC_MLS_Z_ZZZI_D: return \"mls_z_zzzi.xml\";\n\t\tcase ENC_MLS_Z_ZZZI_H: return \"mls_z_zzzi.xml\";\n\t\tcase ENC_MLS_Z_ZZZI_S: return \"mls_z_zzzi.xml\";\n\t\tcase ENC_MOVA_Z_P_RZA_B: return \"mova_z_p_rza.xml\";\n\t\tcase ENC_MOVA_Z_P_RZA_D: return \"mova_z_p_rza.xml\";\n\t\tcase ENC_MOVA_Z_P_RZA_H: return \"mova_z_p_rza.xml\";\n\t\tcase ENC_MOVA_Z_P_RZA_Q: return \"mova_z_p_rza.xml\";\n\t\tcase ENC_MOVA_Z_P_RZA_W: return \"mova_z_p_rza.xml\";\n\t\tcase ENC_MOVA_ZA_P_RZ_B: return \"mova_za_p_rz.xml\";\n\t\tcase ENC_MOVA_ZA_P_RZ_D: return \"mova_za_p_rz.xml\";\n\t\tcase ENC_MOVA_ZA_P_RZ_H: return \"mova_za_p_rz.xml\";\n\t\tcase ENC_MOVA_ZA_P_RZ_Q: return \"mova_za_p_rz.xml\";\n\t\tcase ENC_MOVA_ZA_P_RZ_W: return \"mova_za_p_rz.xml\";\n\t\tcase ENC_MOVPRFX_Z_P_Z_: return \"movprfx_z_p_z.xml\";\n\t\tcase ENC_MOVPRFX_Z_Z_: return \"movprfx_z_z.xml\";\n\t\tcase ENC_MSB_Z_P_ZZZ_: return \"msb_z_p_zzz.xml\";\n\t\tcase ENC_MUL_Z_P_ZZ_: return \"mul_z_p_zz.xml\";\n\t\tcase ENC_MUL_Z_ZI_: return \"mul_z_zi.xml\";\n\t\tcase ENC_MUL_Z_ZZ_: return \"mul_z_zz.xml\";\n\t\tcase ENC_MUL_Z_ZZI_D: return \"mul_z_zzi.xml\";\n\t\tcase ENC_MUL_Z_ZZI_H: return \"mul_z_zzi.xml\";\n\t\tcase ENC_MUL_Z_ZZI_S: return \"mul_z_zzi.xml\";\n\t\tcase ENC_NAND_P_P_PP_Z: return \"nand_p_p_pp.xml\";\n\t\tcase ENC_NANDS_P_P_PP_Z: return \"nands_p_p_pp.xml\";\n\t\tcase ENC_NBSL_Z_ZZZ_: return \"nbsl_z_zzz.xml\";\n\t\tcase ENC_NEG_Z_P_Z_: return \"neg_z_p_z.xml\";\n\t\tcase ENC_NMATCH_P_P_ZZ_: return \"nmatch_p_p_zz.xml\";\n\t\tcase ENC_NOR_P_P_PP_Z: return \"nor_p_p_pp.xml\";\n\t\tcase ENC_NORS_P_P_PP_Z: return \"nors_p_p_pp.xml\";\n\t\tcase ENC_NOT_Z_P_Z_: return \"not_z_p_z.xml\";\n\t\tcase ENC_ORN_P_P_PP_Z: return \"orn_p_p_pp.xml\";\n\t\tcase ENC_ORNS_P_P_PP_Z: return \"orns_p_p_pp.xml\";\n\t\tcase ENC_ORR_P_P_PP_Z: return \"orr_p_p_pp.xml\";\n\t\tcase ENC_ORR_Z_P_ZZ_: return \"orr_z_p_zz.xml\";\n\t\tcase ENC_ORR_Z_ZI_: return \"orr_z_zi.xml\";\n\t\tcase ENC_ORR_Z_ZZ_: return \"orr_z_zz.xml\";\n\t\tcase ENC_ORRS_P_P_PP_Z: return \"orrs_p_p_pp.xml\";\n\t\tcase ENC_ORV_R_P_Z_: return \"orv_r_p_z.xml\";\n\t\tcase ENC_PFALSE_P_: return \"pfalse_p.xml\";\n\t\tcase ENC_PFIRST_P_P_P_: return \"pfirst_p_p_p.xml\";\n\t\tcase ENC_PMUL_Z_ZZ_: return \"pmul_z_zz.xml\";\n\t\tcase ENC_PMULLB_Z_ZZ_: return \"pmullb_z_zz.xml\";\n\t\tcase ENC_PMULLT_Z_ZZ_: return \"pmullt_z_zz.xml\";\n\t\tcase ENC_PNEXT_P_P_P_: return \"pnext_p_p_p.xml\";\n\t\tcase ENC_PRFB_I_P_AI_D: return \"prfb_i_p_ai.xml\";\n\t\tcase ENC_PRFB_I_P_AI_S: return \"prfb_i_p_ai.xml\";\n\t\tcase ENC_PRFB_I_P_BI_S: return \"prfb_i_p_bi.xml\";\n\t\tcase ENC_PRFB_I_P_BR_S: return \"prfb_i_p_br.xml\";\n\t\tcase ENC_PRFB_I_P_BZ_D_64_SCALED: return \"prfb_i_p_bz.xml\";\n\t\tcase ENC_PRFB_I_P_BZ_D_X32_SCALED: return \"prfb_i_p_bz.xml\";\n\t\tcase ENC_PRFB_I_P_BZ_S_X32_SCALED: return \"prfb_i_p_bz.xml\";\n\t\tcase ENC_PRFD_I_P_AI_D: return \"prfd_i_p_ai.xml\";\n\t\tcase ENC_PRFD_I_P_AI_S: return \"prfd_i_p_ai.xml\";\n\t\tcase ENC_PRFD_I_P_BI_S: return \"prfd_i_p_bi.xml\";\n\t\tcase ENC_PRFD_I_P_BR_S: return \"prfd_i_p_br.xml\";\n\t\tcase ENC_PRFD_I_P_BZ_D_64_SCALED: return \"prfd_i_p_bz.xml\";\n\t\tcase ENC_PRFD_I_P_BZ_D_X32_SCALED: return \"prfd_i_p_bz.xml\";\n\t\tcase ENC_PRFD_I_P_BZ_S_X32_SCALED: return \"prfd_i_p_bz.xml\";\n\t\tcase ENC_PRFH_I_P_AI_D: return \"prfh_i_p_ai.xml\";\n\t\tcase ENC_PRFH_I_P_AI_S: return \"prfh_i_p_ai.xml\";\n\t\tcase ENC_PRFH_I_P_BI_S: return \"prfh_i_p_bi.xml\";\n\t\tcase ENC_PRFH_I_P_BR_S: return \"prfh_i_p_br.xml\";\n\t\tcase ENC_PRFH_I_P_BZ_D_64_SCALED: return \"prfh_i_p_bz.xml\";\n\t\tcase ENC_PRFH_I_P_BZ_D_X32_SCALED: return \"prfh_i_p_bz.xml\";\n\t\tcase ENC_PRFH_I_P_BZ_S_X32_SCALED: return \"prfh_i_p_bz.xml\";\n\t\tcase ENC_PRFW_I_P_AI_D: return \"prfw_i_p_ai.xml\";\n\t\tcase ENC_PRFW_I_P_AI_S: return \"prfw_i_p_ai.xml\";\n\t\tcase ENC_PRFW_I_P_BI_S: return \"prfw_i_p_bi.xml\";\n\t\tcase ENC_PRFW_I_P_BR_S: return \"prfw_i_p_br.xml\";\n\t\tcase ENC_PRFW_I_P_BZ_D_64_SCALED: return \"prfw_i_p_bz.xml\";\n\t\tcase ENC_PRFW_I_P_BZ_D_X32_SCALED: return \"prfw_i_p_bz.xml\";\n\t\tcase ENC_PRFW_I_P_BZ_S_X32_SCALED: return \"prfw_i_p_bz.xml\";\n\t\tcase ENC_PTEST_P_P_: return \"ptest_p_p.xml\";\n\t\tcase ENC_PTRUE_P_S_: return \"ptrue_p_s.xml\";\n\t\tcase ENC_PTRUES_P_S_: return \"ptrues_p_s.xml\";\n\t\tcase ENC_PUNPKHI_P_P_: return \"punpkhi_p_p.xml\";\n\t\tcase ENC_PUNPKLO_P_P_: return \"punpkhi_p_p.xml\";\n\t\tcase ENC_RADDHNB_Z_ZZ_: return \"raddhnb_z_zz.xml\";\n\t\tcase ENC_RADDHNT_Z_ZZ_: return \"raddhnt_z_zz.xml\";\n\t\tcase ENC_RAX1_Z_ZZ_: return \"rax1_z_zz.xml\";\n\t\tcase ENC_RBIT_Z_P_Z_: return \"rbit_z_p_z.xml\";\n\t\tcase ENC_RDFFR_P_F_: return \"rdffr_p_f.xml\";\n\t\tcase ENC_RDFFR_P_P_F_: return \"rdffr_p_p_f.xml\";\n\t\tcase ENC_RDFFRS_P_P_F_: return \"rdffrs_p_p_f.xml\";\n\t\tcase ENC_RDVL_R_I_: return \"rdvl_r_i.xml\";\n\t\tcase ENC_REV_P_P_: return \"rev_p_p.xml\";\n\t\tcase ENC_REV_Z_Z_: return \"rev_z_z.xml\";\n\t\tcase ENC_REVB_Z_Z_: return \"revb_z_z.xml\";\n\t\tcase ENC_REVD_Z_P_Z_: return \"revd_z_p_z.xml\";\n\t\tcase ENC_REVH_Z_Z_: return \"revb_z_z.xml\";\n\t\tcase ENC_REVW_Z_Z_: return \"revb_z_z.xml\";\n\t\tcase ENC_RSHRNB_Z_ZI_: return \"rshrnb_z_zi.xml\";\n\t\tcase ENC_RSHRNT_Z_ZI_: return \"rshrnt_z_zi.xml\";\n\t\tcase ENC_RSUBHNB_Z_ZZ_: return \"rsubhnb_z_zz.xml\";\n\t\tcase ENC_RSUBHNT_Z_ZZ_: return \"rsubhnt_z_zz.xml\";\n\t\tcase ENC_SABA_Z_ZZZ_: return \"saba_z_zzz.xml\";\n\t\tcase ENC_SABALB_Z_ZZZ_: return \"sabalb_z_zzz.xml\";\n\t\tcase ENC_SABALT_Z_ZZZ_: return \"sabalt_z_zzz.xml\";\n\t\tcase ENC_SABD_Z_P_ZZ_: return \"sabd_z_p_zz.xml\";\n\t\tcase ENC_SABDLB_Z_ZZ_: return \"sabdlb_z_zz.xml\";\n\t\tcase ENC_SABDLT_Z_ZZ_: return \"sabdlt_z_zz.xml\";\n\t\tcase ENC_SADALP_Z_P_Z_: return \"sadalp_z_p_z.xml\";\n\t\tcase ENC_SADDLB_Z_ZZ_: return \"saddlb_z_zz.xml\";\n\t\tcase ENC_SADDLBT_Z_ZZ_: return \"saddlbt_z_zz.xml\";\n\t\tcase ENC_SADDLT_Z_ZZ_: return \"saddlt_z_zz.xml\";\n\t\tcase ENC_SADDV_R_P_Z_: return \"saddv_r_p_z.xml\";\n\t\tcase ENC_SADDWB_Z_ZZ_: return \"saddwb_z_zz.xml\";\n\t\tcase ENC_SADDWT_Z_ZZ_: return \"saddwt_z_zz.xml\";\n\t\tcase ENC_SBCLB_Z_ZZZ_: return \"sbclb_z_zzz.xml\";\n\t\tcase ENC_SBCLT_Z_ZZZ_: return \"sbclt_z_zzz.xml\";\n\t\tcase ENC_SCLAMP_Z_ZZ_: return \"sclamp_z_zz.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_H2FP16: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2D: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2FP16: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_W2S: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2D: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2FP16: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SCVTF_Z_P_Z_X2S: return \"scvtf_z_p_z.xml\";\n\t\tcase ENC_SDIV_Z_P_ZZ_: return \"sdiv_z_p_zz.xml\";\n\t\tcase ENC_SDIVR_Z_P_ZZ_: return \"sdivr_z_p_zz.xml\";\n\t\tcase ENC_SDOT_Z_ZZZ_: return \"sdot_z_zzz.xml\";\n\t\tcase ENC_SDOT_Z_ZZZI_D: return \"sdot_z_zzzi.xml\";\n\t\tcase ENC_SDOT_Z_ZZZI_S: return \"sdot_z_zzzi.xml\";\n\t\tcase ENC_SEL_P_P_PP_: return \"sel_p_p_pp.xml\";\n\t\tcase ENC_SEL_Z_P_ZZ_: return \"sel_z_p_zz.xml\";\n\t\tcase ENC_SETFFR_F_: return \"setffr_f.xml\";\n\t\tcase ENC_SHADD_Z_P_ZZ_: return \"shadd_z_p_zz.xml\";\n\t\tcase ENC_SHRNB_Z_ZI_: return \"shrnb_z_zi.xml\";\n\t\tcase ENC_SHRNT_Z_ZI_: return \"shrnt_z_zi.xml\";\n\t\tcase ENC_SHSUB_Z_P_ZZ_: return \"shsub_z_p_zz.xml\";\n\t\tcase ENC_SHSUBR_Z_P_ZZ_: return \"shsubr_z_p_zz.xml\";\n\t\tcase ENC_SLI_Z_ZZI_: return \"sli_z_zzi.xml\";\n\t\tcase ENC_SM4E_Z_ZZ_: return \"sm4e_z_zz.xml\";\n\t\tcase ENC_SM4EKEY_Z_ZZ_: return \"sm4ekey_z_zz.xml\";\n\t\tcase ENC_SMAX_Z_P_ZZ_: return \"smax_z_p_zz.xml\";\n\t\tcase ENC_SMAX_Z_ZI_: return \"smax_z_zi.xml\";\n\t\tcase ENC_SMAXP_Z_P_ZZ_: return \"smaxp_z_p_zz.xml\";\n\t\tcase ENC_SMAXV_R_P_Z_: return \"smaxv_r_p_z.xml\";\n\t\tcase ENC_SMIN_Z_P_ZZ_: return \"smin_z_p_zz.xml\";\n\t\tcase ENC_SMIN_Z_ZI_: return \"smin_z_zi.xml\";\n\t\tcase ENC_SMINP_Z_P_ZZ_: return \"sminp_z_p_zz.xml\";\n\t\tcase ENC_SMINV_R_P_Z_: return \"sminv_r_p_z.xml\";\n\t\tcase ENC_SMLALB_Z_ZZZ_: return \"smlalb_z_zzz.xml\";\n\t\tcase ENC_SMLALB_Z_ZZZI_D: return \"smlalb_z_zzzi.xml\";\n\t\tcase ENC_SMLALB_Z_ZZZI_S: return \"smlalb_z_zzzi.xml\";\n\t\tcase ENC_SMLALT_Z_ZZZ_: return \"smlalt_z_zzz.xml\";\n\t\tcase ENC_SMLALT_Z_ZZZI_D: return \"smlalt_z_zzzi.xml\";\n\t\tcase ENC_SMLALT_Z_ZZZI_S: return \"smlalt_z_zzzi.xml\";\n\t\tcase ENC_SMLSLB_Z_ZZZ_: return \"smlslb_z_zzz.xml\";\n\t\tcase ENC_SMLSLB_Z_ZZZI_D: return \"smlslb_z_zzzi.xml\";\n\t\tcase ENC_SMLSLB_Z_ZZZI_S: return \"smlslb_z_zzzi.xml\";\n\t\tcase ENC_SMLSLT_Z_ZZZ_: return \"smlslt_z_zzz.xml\";\n\t\tcase ENC_SMLSLT_Z_ZZZI_D: return \"smlslt_z_zzzi.xml\";\n\t\tcase ENC_SMLSLT_Z_ZZZI_S: return \"smlslt_z_zzzi.xml\";\n\t\tcase ENC_SMMLA_Z_ZZZ_: return \"smmla_z_zzz.xml\";\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_32: return \"smopa_za_pp_zz.xml\";\n\t\tcase ENC_SMOPA_ZA_PP_ZZ_64: return \"smopa_za_pp_zz.xml\";\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_32: return \"smops_za_pp_zz.xml\";\n\t\tcase ENC_SMOPS_ZA_PP_ZZ_64: return \"smops_za_pp_zz.xml\";\n\t\tcase ENC_SMULH_Z_P_ZZ_: return \"smulh_z_p_zz.xml\";\n\t\tcase ENC_SMULH_Z_ZZ_: return \"smulh_z_zz.xml\";\n\t\tcase ENC_SMULLB_Z_ZZ_: return \"smullb_z_zz.xml\";\n\t\tcase ENC_SMULLB_Z_ZZI_D: return \"smullb_z_zzi.xml\";\n\t\tcase ENC_SMULLB_Z_ZZI_S: return \"smullb_z_zzi.xml\";\n\t\tcase ENC_SMULLT_Z_ZZ_: return \"smullt_z_zz.xml\";\n\t\tcase ENC_SMULLT_Z_ZZI_D: return \"smullt_z_zzi.xml\";\n\t\tcase ENC_SMULLT_Z_ZZI_S: return \"smullt_z_zzi.xml\";\n\t\tcase ENC_SPLICE_Z_P_ZZ_CON: return \"splice_z_p_zz.xml\";\n\t\tcase ENC_SPLICE_Z_P_ZZ_DES: return \"splice_z_p_zz.xml\";\n\t\tcase ENC_SQABS_Z_P_Z_: return \"sqabs_z_p_z.xml\";\n\t\tcase ENC_SQADD_Z_P_ZZ_: return \"sqadd_z_p_zz.xml\";\n\t\tcase ENC_SQADD_Z_ZI_: return \"sqadd_z_zi.xml\";\n\t\tcase ENC_SQADD_Z_ZZ_: return \"sqadd_z_zz.xml\";\n\t\tcase ENC_SQCADD_Z_ZZ_: return \"sqcadd_z_zz.xml\";\n\t\tcase ENC_SQDECB_R_RS_SX: return \"sqdecb_r_rs.xml\";\n\t\tcase ENC_SQDECB_R_RS_X: return \"sqdecb_r_rs.xml\";\n\t\tcase ENC_SQDECD_R_RS_SX: return \"sqdecd_r_rs.xml\";\n\t\tcase ENC_SQDECD_R_RS_X: return \"sqdecd_r_rs.xml\";\n\t\tcase ENC_SQDECD_Z_ZS_: return \"sqdecd_z_zs.xml\";\n\t\tcase ENC_SQDECH_R_RS_SX: return \"sqdech_r_rs.xml\";\n\t\tcase ENC_SQDECH_R_RS_X: return \"sqdech_r_rs.xml\";\n\t\tcase ENC_SQDECH_Z_ZS_: return \"sqdech_z_zs.xml\";\n\t\tcase ENC_SQDECP_R_P_R_SX: return \"sqdecp_r_p_r.xml\";\n\t\tcase ENC_SQDECP_R_P_R_X: return \"sqdecp_r_p_r.xml\";\n\t\tcase ENC_SQDECP_Z_P_Z_: return \"sqdecp_z_p_z.xml\";\n\t\tcase ENC_SQDECW_R_RS_SX: return \"sqdecw_r_rs.xml\";\n\t\tcase ENC_SQDECW_R_RS_X: return \"sqdecw_r_rs.xml\";\n\t\tcase ENC_SQDECW_Z_ZS_: return \"sqdecw_z_zs.xml\";\n\t\tcase ENC_SQDMLALB_Z_ZZZ_: return \"sqdmlalb_z_zzz.xml\";\n\t\tcase ENC_SQDMLALB_Z_ZZZI_D: return \"sqdmlalb_z_zzzi.xml\";\n\t\tcase ENC_SQDMLALB_Z_ZZZI_S: return \"sqdmlalb_z_zzzi.xml\";\n\t\tcase ENC_SQDMLALBT_Z_ZZZ_: return \"sqdmlalbt_z_zzz.xml\";\n\t\tcase ENC_SQDMLALT_Z_ZZZ_: return \"sqdmlalt_z_zzz.xml\";\n\t\tcase ENC_SQDMLALT_Z_ZZZI_D: return \"sqdmlalt_z_zzzi.xml\";\n\t\tcase ENC_SQDMLALT_Z_ZZZI_S: return \"sqdmlalt_z_zzzi.xml\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZ_: return \"sqdmlslb_z_zzz.xml\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_D: return \"sqdmlslb_z_zzzi.xml\";\n\t\tcase ENC_SQDMLSLB_Z_ZZZI_S: return \"sqdmlslb_z_zzzi.xml\";\n\t\tcase ENC_SQDMLSLBT_Z_ZZZ_: return \"sqdmlslbt_z_zzz.xml\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZ_: return \"sqdmlslt_z_zzz.xml\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_D: return \"sqdmlslt_z_zzzi.xml\";\n\t\tcase ENC_SQDMLSLT_Z_ZZZI_S: return \"sqdmlslt_z_zzzi.xml\";\n\t\tcase ENC_SQDMULH_Z_ZZ_: return \"sqdmulh_z_zz.xml\";\n\t\tcase ENC_SQDMULH_Z_ZZI_D: return \"sqdmulh_z_zzi.xml\";\n\t\tcase ENC_SQDMULH_Z_ZZI_H: return \"sqdmulh_z_zzi.xml\";\n\t\tcase ENC_SQDMULH_Z_ZZI_S: return \"sqdmulh_z_zzi.xml\";\n\t\tcase ENC_SQDMULLB_Z_ZZ_: return \"sqdmullb_z_zz.xml\";\n\t\tcase ENC_SQDMULLB_Z_ZZI_D: return \"sqdmullb_z_zzi.xml\";\n\t\tcase ENC_SQDMULLB_Z_ZZI_S: return \"sqdmullb_z_zzi.xml\";\n\t\tcase ENC_SQDMULLT_Z_ZZ_: return \"sqdmullt_z_zz.xml\";\n\t\tcase ENC_SQDMULLT_Z_ZZI_D: return \"sqdmullt_z_zzi.xml\";\n\t\tcase ENC_SQDMULLT_Z_ZZI_S: return \"sqdmullt_z_zzi.xml\";\n\t\tcase ENC_SQINCB_R_RS_SX: return \"sqincb_r_rs.xml\";\n\t\tcase ENC_SQINCB_R_RS_X: return \"sqincb_r_rs.xml\";\n\t\tcase ENC_SQINCD_R_RS_SX: return \"sqincd_r_rs.xml\";\n\t\tcase ENC_SQINCD_R_RS_X: return \"sqincd_r_rs.xml\";\n\t\tcase ENC_SQINCD_Z_ZS_: return \"sqincd_z_zs.xml\";\n\t\tcase ENC_SQINCH_R_RS_SX: return \"sqinch_r_rs.xml\";\n\t\tcase ENC_SQINCH_R_RS_X: return \"sqinch_r_rs.xml\";\n\t\tcase ENC_SQINCH_Z_ZS_: return \"sqinch_z_zs.xml\";\n\t\tcase ENC_SQINCP_R_P_R_SX: return \"sqincp_r_p_r.xml\";\n\t\tcase ENC_SQINCP_R_P_R_X: return \"sqincp_r_p_r.xml\";\n\t\tcase ENC_SQINCP_Z_P_Z_: return \"sqincp_z_p_z.xml\";\n\t\tcase ENC_SQINCW_R_RS_SX: return \"sqincw_r_rs.xml\";\n\t\tcase ENC_SQINCW_R_RS_X: return \"sqincw_r_rs.xml\";\n\t\tcase ENC_SQINCW_Z_ZS_: return \"sqincw_z_zs.xml\";\n\t\tcase ENC_SQNEG_Z_P_Z_: return \"sqneg_z_p_z.xml\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZ_: return \"sqrdcmlah_z_zzz.xml\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_H: return \"sqrdcmlah_z_zzzi.xml\";\n\t\tcase ENC_SQRDCMLAH_Z_ZZZI_S: return \"sqrdcmlah_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZ_: return \"sqrdmlah_z_zzz.xml\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_D: return \"sqrdmlah_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_H: return \"sqrdmlah_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLAH_Z_ZZZI_S: return \"sqrdmlah_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZ_: return \"sqrdmlsh_z_zzz.xml\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_D: return \"sqrdmlsh_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_H: return \"sqrdmlsh_z_zzzi.xml\";\n\t\tcase ENC_SQRDMLSH_Z_ZZZI_S: return \"sqrdmlsh_z_zzzi.xml\";\n\t\tcase ENC_SQRDMULH_Z_ZZ_: return \"sqrdmulh_z_zz.xml\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_D: return \"sqrdmulh_z_zzi.xml\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_H: return \"sqrdmulh_z_zzi.xml\";\n\t\tcase ENC_SQRDMULH_Z_ZZI_S: return \"sqrdmulh_z_zzi.xml\";\n\t\tcase ENC_SQRSHL_Z_P_ZZ_: return \"sqrshl_z_p_zz.xml\";\n\t\tcase ENC_SQRSHLR_Z_P_ZZ_: return \"sqrshlr_z_p_zz.xml\";\n\t\tcase ENC_SQRSHRNB_Z_ZI_: return \"sqrshrnb_z_zi.xml\";\n\t\tcase ENC_SQRSHRNT_Z_ZI_: return \"sqrshrnt_z_zi.xml\";\n\t\tcase ENC_SQRSHRUNB_Z_ZI_: return \"sqrshrunb_z_zi.xml\";\n\t\tcase ENC_SQRSHRUNT_Z_ZI_: return \"sqrshrunt_z_zi.xml\";\n\t\tcase ENC_SQSHL_Z_P_ZI_: return \"sqshl_z_p_zi.xml\";\n\t\tcase ENC_SQSHL_Z_P_ZZ_: return \"sqshl_z_p_zz.xml\";\n\t\tcase ENC_SQSHLR_Z_P_ZZ_: return \"sqshlr_z_p_zz.xml\";\n\t\tcase ENC_SQSHLU_Z_P_ZI_: return \"sqshlu_z_p_zi.xml\";\n\t\tcase ENC_SQSHRNB_Z_ZI_: return \"sqshrnb_z_zi.xml\";\n\t\tcase ENC_SQSHRNT_Z_ZI_: return \"sqshrnt_z_zi.xml\";\n\t\tcase ENC_SQSHRUNB_Z_ZI_: return \"sqshrunb_z_zi.xml\";\n\t\tcase ENC_SQSHRUNT_Z_ZI_: return \"sqshrunt_z_zi.xml\";\n\t\tcase ENC_SQSUB_Z_P_ZZ_: return \"sqsub_z_p_zz.xml\";\n\t\tcase ENC_SQSUB_Z_ZI_: return \"sqsub_z_zi.xml\";\n\t\tcase ENC_SQSUB_Z_ZZ_: return \"sqsub_z_zz.xml\";\n\t\tcase ENC_SQSUBR_Z_P_ZZ_: return \"sqsubr_z_p_zz.xml\";\n\t\tcase ENC_SQXTNB_Z_ZZ_: return \"sqxtnb_z_zz.xml\";\n\t\tcase ENC_SQXTNT_Z_ZZ_: return \"sqxtnt_z_zz.xml\";\n\t\tcase ENC_SQXTUNB_Z_ZZ_: return \"sqxtunb_z_zz.xml\";\n\t\tcase ENC_SQXTUNT_Z_ZZ_: return \"sqxtunt_z_zz.xml\";\n\t\tcase ENC_SRHADD_Z_P_ZZ_: return \"srhadd_z_p_zz.xml\";\n\t\tcase ENC_SRI_Z_ZZI_: return \"sri_z_zzi.xml\";\n\t\tcase ENC_SRSHL_Z_P_ZZ_: return \"srshl_z_p_zz.xml\";\n\t\tcase ENC_SRSHLR_Z_P_ZZ_: return \"srshlr_z_p_zz.xml\";\n\t\tcase ENC_SRSHR_Z_P_ZI_: return \"srshr_z_p_zi.xml\";\n\t\tcase ENC_SRSRA_Z_ZI_: return \"srsra_z_zi.xml\";\n\t\tcase ENC_SSHLLB_Z_ZI_: return \"sshllb_z_zi.xml\";\n\t\tcase ENC_SSHLLT_Z_ZI_: return \"sshllt_z_zi.xml\";\n\t\tcase ENC_SSRA_Z_ZI_: return \"ssra_z_zi.xml\";\n\t\tcase ENC_SSUBLB_Z_ZZ_: return \"ssublb_z_zz.xml\";\n\t\tcase ENC_SSUBLBT_Z_ZZ_: return \"ssublbt_z_zz.xml\";\n\t\tcase ENC_SSUBLT_Z_ZZ_: return \"ssublt_z_zz.xml\";\n\t\tcase ENC_SSUBLTB_Z_ZZ_: return \"ssubltb_z_zz.xml\";\n\t\tcase ENC_SSUBWB_Z_ZZ_: return \"ssubwb_z_zz.xml\";\n\t\tcase ENC_SSUBWT_Z_ZZ_: return \"ssubwt_z_zz.xml\";\n\t\tcase ENC_ST1B_Z_P_AI_D: return \"st1b_z_p_ai.xml\";\n\t\tcase ENC_ST1B_Z_P_AI_S: return \"st1b_z_p_ai.xml\";\n\t\tcase ENC_ST1B_Z_P_BI_: return \"st1b_z_p_bi.xml\";\n\t\tcase ENC_ST1B_Z_P_BR_: return \"st1b_z_p_br.xml\";\n\t\tcase ENC_ST1B_Z_P_BZ_D_64_UNSCALED: return \"st1b_z_p_bz.xml\";\n\t\tcase ENC_ST1B_Z_P_BZ_D_X32_UNSCALED: return \"st1b_z_p_bz.xml\";\n\t\tcase ENC_ST1B_Z_P_BZ_S_X32_UNSCALED: return \"st1b_z_p_bz.xml\";\n\t\tcase ENC_ST1B_ZA_P_RRR_: return \"st1b_za_p_rrr.xml\";\n\t\tcase ENC_ST1D_Z_P_AI_D: return \"st1d_z_p_ai.xml\";\n\t\tcase ENC_ST1D_Z_P_BI_: return \"st1d_z_p_bi.xml\";\n\t\tcase ENC_ST1D_Z_P_BR_: return \"st1d_z_p_br.xml\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_SCALED: return \"st1d_z_p_bz.xml\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_64_UNSCALED: return \"st1d_z_p_bz.xml\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_SCALED: return \"st1d_z_p_bz.xml\";\n\t\tcase ENC_ST1D_Z_P_BZ_D_X32_UNSCALED: return \"st1d_z_p_bz.xml\";\n\t\tcase ENC_ST1D_ZA_P_RRR_: return \"st1d_za_p_rrr.xml\";\n\t\tcase ENC_ST1H_Z_P_AI_D: return \"st1h_z_p_ai.xml\";\n\t\tcase ENC_ST1H_Z_P_AI_S: return \"st1h_z_p_ai.xml\";\n\t\tcase ENC_ST1H_Z_P_BI_: return \"st1h_z_p_bi.xml\";\n\t\tcase ENC_ST1H_Z_P_BR_: return \"st1h_z_p_br.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_SCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_64_UNSCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_SCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_D_X32_UNSCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_SCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_Z_P_BZ_S_X32_UNSCALED: return \"st1h_z_p_bz.xml\";\n\t\tcase ENC_ST1H_ZA_P_RRR_: return \"st1h_za_p_rrr.xml\";\n\t\tcase ENC_ST1Q_ZA_P_RRR_: return \"st1q_za_p_rrr.xml\";\n\t\tcase ENC_ST1W_Z_P_AI_D: return \"st1w_z_p_ai.xml\";\n\t\tcase ENC_ST1W_Z_P_AI_S: return \"st1w_z_p_ai.xml\";\n\t\tcase ENC_ST1W_Z_P_BI_: return \"st1w_z_p_bi.xml\";\n\t\tcase ENC_ST1W_Z_P_BR_: return \"st1w_z_p_br.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_SCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_64_UNSCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_SCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_D_X32_UNSCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_SCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_Z_P_BZ_S_X32_UNSCALED: return \"st1w_z_p_bz.xml\";\n\t\tcase ENC_ST1W_ZA_P_RRR_: return \"st1w_za_p_rrr.xml\";\n\t\tcase ENC_ST2B_Z_P_BI_CONTIGUOUS: return \"st2b_z_p_bi.xml\";\n\t\tcase ENC_ST2B_Z_P_BR_CONTIGUOUS: return \"st2b_z_p_br.xml\";\n\t\tcase ENC_ST2D_Z_P_BI_CONTIGUOUS: return \"st2d_z_p_bi.xml\";\n\t\tcase ENC_ST2D_Z_P_BR_CONTIGUOUS: return \"st2d_z_p_br.xml\";\n\t\tcase ENC_ST2H_Z_P_BI_CONTIGUOUS: return \"st2h_z_p_bi.xml\";\n\t\tcase ENC_ST2H_Z_P_BR_CONTIGUOUS: return \"st2h_z_p_br.xml\";\n\t\tcase ENC_ST2W_Z_P_BI_CONTIGUOUS: return \"st2w_z_p_bi.xml\";\n\t\tcase ENC_ST2W_Z_P_BR_CONTIGUOUS: return \"st2w_z_p_br.xml\";\n\t\tcase ENC_ST3B_Z_P_BI_CONTIGUOUS: return \"st3b_z_p_bi.xml\";\n\t\tcase ENC_ST3B_Z_P_BR_CONTIGUOUS: return \"st3b_z_p_br.xml\";\n\t\tcase ENC_ST3D_Z_P_BI_CONTIGUOUS: return \"st3d_z_p_bi.xml\";\n\t\tcase ENC_ST3D_Z_P_BR_CONTIGUOUS: return \"st3d_z_p_br.xml\";\n\t\tcase ENC_ST3H_Z_P_BI_CONTIGUOUS: return \"st3h_z_p_bi.xml\";\n\t\tcase ENC_ST3H_Z_P_BR_CONTIGUOUS: return \"st3h_z_p_br.xml\";\n\t\tcase ENC_ST3W_Z_P_BI_CONTIGUOUS: return \"st3w_z_p_bi.xml\";\n\t\tcase ENC_ST3W_Z_P_BR_CONTIGUOUS: return \"st3w_z_p_br.xml\";\n\t\tcase ENC_ST4B_Z_P_BI_CONTIGUOUS: return \"st4b_z_p_bi.xml\";\n\t\tcase ENC_ST4B_Z_P_BR_CONTIGUOUS: return \"st4b_z_p_br.xml\";\n\t\tcase ENC_ST4D_Z_P_BI_CONTIGUOUS: return \"st4d_z_p_bi.xml\";\n\t\tcase ENC_ST4D_Z_P_BR_CONTIGUOUS: return \"st4d_z_p_br.xml\";\n\t\tcase ENC_ST4H_Z_P_BI_CONTIGUOUS: return \"st4h_z_p_bi.xml\";\n\t\tcase ENC_ST4H_Z_P_BR_CONTIGUOUS: return \"st4h_z_p_br.xml\";\n\t\tcase ENC_ST4W_Z_P_BI_CONTIGUOUS: return \"st4w_z_p_bi.xml\";\n\t\tcase ENC_ST4W_Z_P_BR_CONTIGUOUS: return \"st4w_z_p_br.xml\";\n\t\tcase ENC_STNT1B_Z_P_AR_D_64_UNSCALED: return \"stnt1b_z_p_ar.xml\";\n\t\tcase ENC_STNT1B_Z_P_AR_S_X32_UNSCALED: return \"stnt1b_z_p_ar.xml\";\n\t\tcase ENC_STNT1B_Z_P_BI_CONTIGUOUS: return \"stnt1b_z_p_bi.xml\";\n\t\tcase ENC_STNT1B_Z_P_BR_CONTIGUOUS: return \"stnt1b_z_p_br.xml\";\n\t\tcase ENC_STNT1D_Z_P_AR_D_64_UNSCALED: return \"stnt1d_z_p_ar.xml\";\n\t\tcase ENC_STNT1D_Z_P_BI_CONTIGUOUS: return \"stnt1d_z_p_bi.xml\";\n\t\tcase ENC_STNT1D_Z_P_BR_CONTIGUOUS: return \"stnt1d_z_p_br.xml\";\n\t\tcase ENC_STNT1H_Z_P_AR_D_64_UNSCALED: return \"stnt1h_z_p_ar.xml\";\n\t\tcase ENC_STNT1H_Z_P_AR_S_X32_UNSCALED: return \"stnt1h_z_p_ar.xml\";\n\t\tcase ENC_STNT1H_Z_P_BI_CONTIGUOUS: return \"stnt1h_z_p_bi.xml\";\n\t\tcase ENC_STNT1H_Z_P_BR_CONTIGUOUS: return \"stnt1h_z_p_br.xml\";\n\t\tcase ENC_STNT1W_Z_P_AR_D_64_UNSCALED: return \"stnt1w_z_p_ar.xml\";\n\t\tcase ENC_STNT1W_Z_P_AR_S_X32_UNSCALED: return \"stnt1w_z_p_ar.xml\";\n\t\tcase ENC_STNT1W_Z_P_BI_CONTIGUOUS: return \"stnt1w_z_p_bi.xml\";\n\t\tcase ENC_STNT1W_Z_P_BR_CONTIGUOUS: return \"stnt1w_z_p_br.xml\";\n\t\tcase ENC_STR_P_BI_: return \"str_p_bi.xml\";\n\t\tcase ENC_STR_Z_BI_: return \"str_z_bi.xml\";\n\t\tcase ENC_STR_ZA_RI_: return \"str_za_ri.xml\";\n\t\tcase ENC_SUB_Z_P_ZZ_: return \"sub_z_p_zz.xml\";\n\t\tcase ENC_SUB_Z_ZI_: return \"sub_z_zi.xml\";\n\t\tcase ENC_SUB_Z_ZZ_: return \"sub_z_zz.xml\";\n\t\tcase ENC_SUBHNB_Z_ZZ_: return \"subhnb_z_zz.xml\";\n\t\tcase ENC_SUBHNT_Z_ZZ_: return \"subhnt_z_zz.xml\";\n\t\tcase ENC_SUBR_Z_P_ZZ_: return \"subr_z_p_zz.xml\";\n\t\tcase ENC_SUBR_Z_ZI_: return \"subr_z_zi.xml\";\n\t\tcase ENC_SUDOT_Z_ZZZI_S: return \"sudot_z_zzzi.xml\";\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_32: return \"sumopa_za_pp_zz.xml\";\n\t\tcase ENC_SUMOPA_ZA_PP_ZZ_64: return \"sumopa_za_pp_zz.xml\";\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_32: return \"sumops_za_pp_zz.xml\";\n\t\tcase ENC_SUMOPS_ZA_PP_ZZ_64: return \"sumops_za_pp_zz.xml\";\n\t\tcase ENC_SUNPKHI_Z_Z_: return \"sunpkhi_z_z.xml\";\n\t\tcase ENC_SUNPKLO_Z_Z_: return \"sunpkhi_z_z.xml\";\n\t\tcase ENC_SUQADD_Z_P_ZZ_: return \"suqadd_z_p_zz.xml\";\n\t\tcase ENC_SXTB_Z_P_Z_: return \"sxtb_z_p_z.xml\";\n\t\tcase ENC_SXTH_Z_P_Z_: return \"sxtb_z_p_z.xml\";\n\t\tcase ENC_SXTW_Z_P_Z_: return \"sxtb_z_p_z.xml\";\n\t\tcase ENC_TBL_Z_ZZ_1: return \"tbl_z_zz.xml\";\n\t\tcase ENC_TBL_Z_ZZ_2: return \"tbl_z_zz.xml\";\n\t\tcase ENC_TBX_Z_ZZ_: return \"tbx_z_zz.xml\";\n\t\tcase ENC_TRN1_P_PP_: return \"trn1_p_pp.xml\";\n\t\tcase ENC_TRN1_Z_ZZ_: return \"trn1_z_zz.xml\";\n\t\tcase ENC_TRN1_Z_ZZ_Q: return \"trn1_z_zz.xml\";\n\t\tcase ENC_TRN2_P_PP_: return \"trn1_p_pp.xml\";\n\t\tcase ENC_TRN2_Z_ZZ_: return \"trn1_z_zz.xml\";\n\t\tcase ENC_TRN2_Z_ZZ_Q: return \"trn1_z_zz.xml\";\n\t\tcase ENC_UABA_Z_ZZZ_: return \"uaba_z_zzz.xml\";\n\t\tcase ENC_UABALB_Z_ZZZ_: return \"uabalb_z_zzz.xml\";\n\t\tcase ENC_UABALT_Z_ZZZ_: return \"uabalt_z_zzz.xml\";\n\t\tcase ENC_UABD_Z_P_ZZ_: return \"uabd_z_p_zz.xml\";\n\t\tcase ENC_UABDLB_Z_ZZ_: return \"uabdlb_z_zz.xml\";\n\t\tcase ENC_UABDLT_Z_ZZ_: return \"uabdlt_z_zz.xml\";\n\t\tcase ENC_UADALP_Z_P_Z_: return \"uadalp_z_p_z.xml\";\n\t\tcase ENC_UADDLB_Z_ZZ_: return \"uaddlb_z_zz.xml\";\n\t\tcase ENC_UADDLT_Z_ZZ_: return \"uaddlt_z_zz.xml\";\n\t\tcase ENC_UADDV_R_P_Z_: return \"uaddv_r_p_z.xml\";\n\t\tcase ENC_UADDWB_Z_ZZ_: return \"uaddwb_z_zz.xml\";\n\t\tcase ENC_UADDWT_Z_ZZ_: return \"uaddwt_z_zz.xml\";\n\t\tcase ENC_UCLAMP_Z_ZZ_: return \"uclamp_z_zz.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_H2FP16: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2D: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2FP16: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_W2S: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2D: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2FP16: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UCVTF_Z_P_Z_X2S: return \"ucvtf_z_p_z.xml\";\n\t\tcase ENC_UDIV_Z_P_ZZ_: return \"udiv_z_p_zz.xml\";\n\t\tcase ENC_UDIVR_Z_P_ZZ_: return \"udivr_z_p_zz.xml\";\n\t\tcase ENC_UDOT_Z_ZZZ_: return \"udot_z_zzz.xml\";\n\t\tcase ENC_UDOT_Z_ZZZI_D: return \"udot_z_zzzi.xml\";\n\t\tcase ENC_UDOT_Z_ZZZI_S: return \"udot_z_zzzi.xml\";\n\t\tcase ENC_UHADD_Z_P_ZZ_: return \"uhadd_z_p_zz.xml\";\n\t\tcase ENC_UHSUB_Z_P_ZZ_: return \"uhsub_z_p_zz.xml\";\n\t\tcase ENC_UHSUBR_Z_P_ZZ_: return \"uhsubr_z_p_zz.xml\";\n\t\tcase ENC_UMAX_Z_P_ZZ_: return \"umax_z_p_zz.xml\";\n\t\tcase ENC_UMAX_Z_ZI_: return \"umax_z_zi.xml\";\n\t\tcase ENC_UMAXP_Z_P_ZZ_: return \"umaxp_z_p_zz.xml\";\n\t\tcase ENC_UMAXV_R_P_Z_: return \"umaxv_r_p_z.xml\";\n\t\tcase ENC_UMIN_Z_P_ZZ_: return \"umin_z_p_zz.xml\";\n\t\tcase ENC_UMIN_Z_ZI_: return \"umin_z_zi.xml\";\n\t\tcase ENC_UMINP_Z_P_ZZ_: return \"uminp_z_p_zz.xml\";\n\t\tcase ENC_UMINV_R_P_Z_: return \"uminv_r_p_z.xml\";\n\t\tcase ENC_UMLALB_Z_ZZZ_: return \"umlalb_z_zzz.xml\";\n\t\tcase ENC_UMLALB_Z_ZZZI_D: return \"umlalb_z_zzzi.xml\";\n\t\tcase ENC_UMLALB_Z_ZZZI_S: return \"umlalb_z_zzzi.xml\";\n\t\tcase ENC_UMLALT_Z_ZZZ_: return \"umlalt_z_zzz.xml\";\n\t\tcase ENC_UMLALT_Z_ZZZI_D: return \"umlalt_z_zzzi.xml\";\n\t\tcase ENC_UMLALT_Z_ZZZI_S: return \"umlalt_z_zzzi.xml\";\n\t\tcase ENC_UMLSLB_Z_ZZZ_: return \"umlslb_z_zzz.xml\";\n\t\tcase ENC_UMLSLB_Z_ZZZI_D: return \"umlslb_z_zzzi.xml\";\n\t\tcase ENC_UMLSLB_Z_ZZZI_S: return \"umlslb_z_zzzi.xml\";\n\t\tcase ENC_UMLSLT_Z_ZZZ_: return \"umlslt_z_zzz.xml\";\n\t\tcase ENC_UMLSLT_Z_ZZZI_D: return \"umlslt_z_zzzi.xml\";\n\t\tcase ENC_UMLSLT_Z_ZZZI_S: return \"umlslt_z_zzzi.xml\";\n\t\tcase ENC_UMMLA_Z_ZZZ_: return \"ummla_z_zzz.xml\";\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_32: return \"umopa_za_pp_zz.xml\";\n\t\tcase ENC_UMOPA_ZA_PP_ZZ_64: return \"umopa_za_pp_zz.xml\";\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_32: return \"umops_za_pp_zz.xml\";\n\t\tcase ENC_UMOPS_ZA_PP_ZZ_64: return \"umops_za_pp_zz.xml\";\n\t\tcase ENC_UMULH_Z_P_ZZ_: return \"umulh_z_p_zz.xml\";\n\t\tcase ENC_UMULH_Z_ZZ_: return \"umulh_z_zz.xml\";\n\t\tcase ENC_UMULLB_Z_ZZ_: return \"umullb_z_zz.xml\";\n\t\tcase ENC_UMULLB_Z_ZZI_D: return \"umullb_z_zzi.xml\";\n\t\tcase ENC_UMULLB_Z_ZZI_S: return \"umullb_z_zzi.xml\";\n\t\tcase ENC_UMULLT_Z_ZZ_: return \"umullt_z_zz.xml\";\n\t\tcase ENC_UMULLT_Z_ZZI_D: return \"umullt_z_zzi.xml\";\n\t\tcase ENC_UMULLT_Z_ZZI_S: return \"umullt_z_zzi.xml\";\n\t\tcase ENC_UQADD_Z_P_ZZ_: return \"uqadd_z_p_zz.xml\";\n\t\tcase ENC_UQADD_Z_ZI_: return \"uqadd_z_zi.xml\";\n\t\tcase ENC_UQADD_Z_ZZ_: return \"uqadd_z_zz.xml\";\n\t\tcase ENC_UQDECB_R_RS_UW: return \"uqdecb_r_rs.xml\";\n\t\tcase ENC_UQDECB_R_RS_X: return \"uqdecb_r_rs.xml\";\n\t\tcase ENC_UQDECD_R_RS_UW: return \"uqdecd_r_rs.xml\";\n\t\tcase ENC_UQDECD_R_RS_X: return \"uqdecd_r_rs.xml\";\n\t\tcase ENC_UQDECD_Z_ZS_: return \"uqdecd_z_zs.xml\";\n\t\tcase ENC_UQDECH_R_RS_UW: return \"uqdech_r_rs.xml\";\n\t\tcase ENC_UQDECH_R_RS_X: return \"uqdech_r_rs.xml\";\n\t\tcase ENC_UQDECH_Z_ZS_: return \"uqdech_z_zs.xml\";\n\t\tcase ENC_UQDECP_R_P_R_UW: return \"uqdecp_r_p_r.xml\";\n\t\tcase ENC_UQDECP_R_P_R_X: return \"uqdecp_r_p_r.xml\";\n\t\tcase ENC_UQDECP_Z_P_Z_: return \"uqdecp_z_p_z.xml\";\n\t\tcase ENC_UQDECW_R_RS_UW: return \"uqdecw_r_rs.xml\";\n\t\tcase ENC_UQDECW_R_RS_X: return \"uqdecw_r_rs.xml\";\n\t\tcase ENC_UQDECW_Z_ZS_: return \"uqdecw_z_zs.xml\";\n\t\tcase ENC_UQINCB_R_RS_UW: return \"uqincb_r_rs.xml\";\n\t\tcase ENC_UQINCB_R_RS_X: return \"uqincb_r_rs.xml\";\n\t\tcase ENC_UQINCD_R_RS_UW: return \"uqincd_r_rs.xml\";\n\t\tcase ENC_UQINCD_R_RS_X: return \"uqincd_r_rs.xml\";\n\t\tcase ENC_UQINCD_Z_ZS_: return \"uqincd_z_zs.xml\";\n\t\tcase ENC_UQINCH_R_RS_UW: return \"uqinch_r_rs.xml\";\n\t\tcase ENC_UQINCH_R_RS_X: return \"uqinch_r_rs.xml\";\n\t\tcase ENC_UQINCH_Z_ZS_: return \"uqinch_z_zs.xml\";\n\t\tcase ENC_UQINCP_R_P_R_UW: return \"uqincp_r_p_r.xml\";\n\t\tcase ENC_UQINCP_R_P_R_X: return \"uqincp_r_p_r.xml\";\n\t\tcase ENC_UQINCP_Z_P_Z_: return \"uqincp_z_p_z.xml\";\n\t\tcase ENC_UQINCW_R_RS_UW: return \"uqincw_r_rs.xml\";\n\t\tcase ENC_UQINCW_R_RS_X: return \"uqincw_r_rs.xml\";\n\t\tcase ENC_UQINCW_Z_ZS_: return \"uqincw_z_zs.xml\";\n\t\tcase ENC_UQRSHL_Z_P_ZZ_: return \"uqrshl_z_p_zz.xml\";\n\t\tcase ENC_UQRSHLR_Z_P_ZZ_: return \"uqrshlr_z_p_zz.xml\";\n\t\tcase ENC_UQRSHRNB_Z_ZI_: return \"uqrshrnb_z_zi.xml\";\n\t\tcase ENC_UQRSHRNT_Z_ZI_: return \"uqrshrnt_z_zi.xml\";\n\t\tcase ENC_UQSHL_Z_P_ZI_: return \"uqshl_z_p_zi.xml\";\n\t\tcase ENC_UQSHL_Z_P_ZZ_: return \"uqshl_z_p_zz.xml\";\n\t\tcase ENC_UQSHLR_Z_P_ZZ_: return \"uqshlr_z_p_zz.xml\";\n\t\tcase ENC_UQSHRNB_Z_ZI_: return \"uqshrnb_z_zi.xml\";\n\t\tcase ENC_UQSHRNT_Z_ZI_: return \"uqshrnt_z_zi.xml\";\n\t\tcase ENC_UQSUB_Z_P_ZZ_: return \"uqsub_z_p_zz.xml\";\n\t\tcase ENC_UQSUB_Z_ZI_: return \"uqsub_z_zi.xml\";\n\t\tcase ENC_UQSUB_Z_ZZ_: return \"uqsub_z_zz.xml\";\n\t\tcase ENC_UQSUBR_Z_P_ZZ_: return \"uqsubr_z_p_zz.xml\";\n\t\tcase ENC_UQXTNB_Z_ZZ_: return \"uqxtnb_z_zz.xml\";\n\t\tcase ENC_UQXTNT_Z_ZZ_: return \"uqxtnt_z_zz.xml\";\n\t\tcase ENC_URECPE_Z_P_Z_: return \"urecpe_z_p_z.xml\";\n\t\tcase ENC_URHADD_Z_P_ZZ_: return \"urhadd_z_p_zz.xml\";\n\t\tcase ENC_URSHL_Z_P_ZZ_: return \"urshl_z_p_zz.xml\";\n\t\tcase ENC_URSHLR_Z_P_ZZ_: return \"urshlr_z_p_zz.xml\";\n\t\tcase ENC_URSHR_Z_P_ZI_: return \"urshr_z_p_zi.xml\";\n\t\tcase ENC_URSQRTE_Z_P_Z_: return \"ursqrte_z_p_z.xml\";\n\t\tcase ENC_URSRA_Z_ZI_: return \"ursra_z_zi.xml\";\n\t\tcase ENC_USDOT_Z_ZZZ_S: return \"usdot_z_zzz.xml\";\n\t\tcase ENC_USDOT_Z_ZZZI_S: return \"usdot_z_zzzi.xml\";\n\t\tcase ENC_USHLLB_Z_ZI_: return \"ushllb_z_zi.xml\";\n\t\tcase ENC_USHLLT_Z_ZI_: return \"ushllt_z_zi.xml\";\n\t\tcase ENC_USMMLA_Z_ZZZ_: return \"usmmla_z_zzz.xml\";\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_32: return \"usmopa_za_pp_zz.xml\";\n\t\tcase ENC_USMOPA_ZA_PP_ZZ_64: return \"usmopa_za_pp_zz.xml\";\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_32: return \"usmops_za_pp_zz.xml\";\n\t\tcase ENC_USMOPS_ZA_PP_ZZ_64: return \"usmops_za_pp_zz.xml\";\n\t\tcase ENC_USQADD_Z_P_ZZ_: return \"usqadd_z_p_zz.xml\";\n\t\tcase ENC_USRA_Z_ZI_: return \"usra_z_zi.xml\";\n\t\tcase ENC_USUBLB_Z_ZZ_: return \"usublb_z_zz.xml\";\n\t\tcase ENC_USUBLT_Z_ZZ_: return \"usublt_z_zz.xml\";\n\t\tcase ENC_USUBWB_Z_ZZ_: return \"usubwb_z_zz.xml\";\n\t\tcase ENC_USUBWT_Z_ZZ_: return \"usubwt_z_zz.xml\";\n\t\tcase ENC_UUNPKHI_Z_Z_: return \"uunpkhi_z_z.xml\";\n\t\tcase ENC_UUNPKLO_Z_Z_: return \"uunpkhi_z_z.xml\";\n\t\tcase ENC_UXTB_Z_P_Z_: return \"uxtb_z_p_z.xml\";\n\t\tcase ENC_UXTH_Z_P_Z_: return \"uxtb_z_p_z.xml\";\n\t\tcase ENC_UXTW_Z_P_Z_: return \"uxtb_z_p_z.xml\";\n\t\tcase ENC_UZP1_P_PP_: return \"uzp1_p_pp.xml\";\n\t\tcase ENC_UZP1_Z_ZZ_: return \"uzp1_z_zz.xml\";\n\t\tcase ENC_UZP1_Z_ZZ_Q: return \"uzp1_z_zz.xml\";\n\t\tcase ENC_UZP2_P_PP_: return \"uzp1_p_pp.xml\";\n\t\tcase ENC_UZP2_Z_ZZ_: return \"uzp1_z_zz.xml\";\n\t\tcase ENC_UZP2_Z_ZZ_Q: return \"uzp1_z_zz.xml\";\n\t\tcase ENC_WHILEGE_P_P_RR_: return \"whilege_p_p_rr.xml\";\n\t\tcase ENC_WHILEGT_P_P_RR_: return \"whilegt_p_p_rr.xml\";\n\t\tcase ENC_WHILEHI_P_P_RR_: return \"whilehi_p_p_rr.xml\";\n\t\tcase ENC_WHILEHS_P_P_RR_: return \"whilehs_p_p_rr.xml\";\n\t\tcase ENC_WHILELE_P_P_RR_: return \"whilele_p_p_rr.xml\";\n\t\tcase ENC_WHILELO_P_P_RR_: return \"whilelo_p_p_rr.xml\";\n\t\tcase ENC_WHILELS_P_P_RR_: return \"whilels_p_p_rr.xml\";\n\t\tcase ENC_WHILELT_P_P_RR_: return \"whilelt_p_p_rr.xml\";\n\t\tcase ENC_WHILERW_P_RR_: return \"whilerw_p_rr.xml\";\n\t\tcase ENC_WHILEWR_P_RR_: return \"whilewr_p_rr.xml\";\n\t\tcase ENC_WRFFR_F_P_: return \"wrffr_f_p.xml\";\n\t\tcase ENC_XAR_Z_ZZI_: return \"xar_z_zzi.xml\";\n\t\tcase ENC_ZERO_ZA_I_: return \"zero_za_i.xml\";\n\t\tcase ENC_ZIP1_P_PP_: return \"zip1_p_pp.xml\";\n\t\tcase ENC_ZIP1_Z_ZZ_: return \"zip1_z_zz.xml\";\n\t\tcase ENC_ZIP1_Z_ZZ_Q: return \"zip1_z_zz.xml\";\n\t\tcase ENC_ZIP2_P_PP_: return \"zip1_p_pp.xml\";\n\t\tcase ENC_ZIP2_Z_ZZ_: return \"zip1_z_zz.xml\";\n\t\tcase ENC_ZIP2_Z_ZZ_Q: return \"zip1_z_zz.xml\";\n\t\tdefault: return \"error\";\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/encodings_fmt.h",
    "content": "/* GENERATED FILE */\n#pragma once\nconst char *enc_to_str(enum ENCODING);\nconst char *enc_to_xml(enum ENCODING);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/feature_flags.h",
    "content": "/* GENERATED FILE */\n#pragma once\n// 41 HasXXX() functions used by decode:\n#define HasBF16() (ctx->features0 & ARCH_FEATURE_BF16)\n#define HasBTI() (ctx->features0 & ARCH_FEATURE_BTI)\n#define HasDGH() (ctx->features0 & ARCH_FEATURE_DGH)\n#define HasDotProd() (ctx->features0 & ARCH_FEATURE_DotProd)\n#define HasF32MM() (ctx->features0 & ARCH_FEATURE_F32MM)\n#define HasF64MM() (ctx->features0 & ARCH_FEATURE_F64MM)\n#define HasFCMA() (ctx->features0 & ARCH_FEATURE_FCMA)\n#define HasFHM() (ctx->features0 & ARCH_FEATURE_FHM)\n#define HasFP16() (ctx->features0 & ARCH_FEATURE_FP16)\n#define HasFRINTTS() (ctx->features0 & ARCH_FEATURE_FRINTTS)\n#define HasFlagM() (ctx->features0 & ARCH_FEATURE_FlagM)\n#define HasFlagM2() (ctx->features0 & ARCH_FEATURE_FlagM2)\n#define HasI8MM() (ctx->features0 & ARCH_FEATURE_I8MM)\n#define HasJSCVT() (ctx->features0 & ARCH_FEATURE_JSCVT)\n#define HasLOR() (ctx->features0 & ARCH_FEATURE_LOR)\n#define HasLRCPC() (ctx->features0 & ARCH_FEATURE_LRCPC)\n#define HasLRCPC2() (ctx->features0 & ARCH_FEATURE_LRCPC2)\n#define HasLS64() (ctx->features0 & ARCH_FEATURE_LS64)\n#define HasLS64_V() (ctx->features0 & ARCH_FEATURE_LS64_V)\n#define HasLSE() (ctx->features0 & ARCH_FEATURE_LSE)\n#define HasMTE() (ctx->features0 & ARCH_FEATURE_MTE)\n#define HasMTE2() (ctx->features0 & ARCH_FEATURE_MTE2)\n#define HasPAuth() (ctx->features0 & ARCH_FEATURE_PAuth)\n#define HasRAS() (ctx->features0 & ARCH_FEATURE_RAS)\n#define HasRDM() (ctx->features0 & ARCH_FEATURE_RDM)\n#define HasSHA3() (ctx->features0 & ARCH_FEATURE_SHA3)\n#define HasSHA512() (ctx->features0 & ARCH_FEATURE_SHA512)\n#define HasSM3() (ctx->features0 & ARCH_FEATURE_SM3)\n#define HasSM4() (ctx->features0 & ARCH_FEATURE_SM4)\n#define HasSME() (ctx->features0 & ARCH_FEATURE_SME)\n#define HasSME_F64F64() (ctx->features0 & ARCH_FEATURE_SME_F64F64)\n#define HasSME_I16I64() (ctx->features0 & ARCH_FEATURE_SME_I16I64)\n#define HasSPE() (ctx->features0 & ARCH_FEATURE_SPE)\n#define HasSVE_AES() (ctx->features0 & ARCH_FEATURE_SVE_AES)\n#define HasSVE_BitPerm() (ctx->features0 & ARCH_FEATURE_SVE_BitPerm)\n#define HasSVE_SHA3() (ctx->features0 & ARCH_FEATURE_SVE_SHA3)\n#define HasSVE_SM4() (ctx->features0 & ARCH_FEATURE_SVE_SM4)\n#define HasTME() (ctx->features0 & ARCH_FEATURE_TME)\n#define HasTRF() (ctx->features0 & ARCH_FEATURE_TRF)\n#define HasWFxT() (ctx->features0 & ARCH_FEATURE_WFxT)\n#define HasXS() (ctx->features0 & ARCH_FEATURE_XS)\n\n// 52 HaveXXX() functions used by pcode:\n#define HaveAESExt() (ctx->features1 & ARCH_FEATURE_AESExt)\n#define HaveAtomicExt() (ctx->features1 & ARCH_FEATURE_AtomicExt)\n#define HaveBF16Ext() (ctx->features1 & ARCH_FEATURE_BF16Ext)\n#define HaveBTIExt() (ctx->features1 & ARCH_FEATURE_BTIExt)\n#define HaveBit128PMULLExt() (ctx->features1 & ARCH_FEATURE_Bit128PMULLExt)\n#define HaveCRCExt() (ctx->features1 & ARCH_FEATURE_CRCExt)\n#define HaveDGHExt() (ctx->features1 & ARCH_FEATURE_DGHExt)\n#define HaveDITExt() (ctx->features1 & ARCH_FEATURE_DITExt)\n#define HaveDOTPExt() (ctx->features1 & ARCH_FEATURE_DOTPExt)\n#define HaveFCADDExt() (ctx->features1 & ARCH_FEATURE_FCADDExt)\n#define HaveFJCVTZSExt() (ctx->features1 & ARCH_FEATURE_FJCVTZSExt)\n#define HaveFP16Ext() (ctx->features1 & ARCH_FEATURE_FP16Ext)\n#define HaveFP16MulNoRoundingToFP32Ext() (ctx->features1 & ARCH_FEATURE_FP16MulNoRoundingToFP32Ext)\n#define HaveFeatLS64() (ctx->features1 & ARCH_FEATURE_FeatLS64)\n#define HaveFeatWFxT() (ctx->features1 & ARCH_FEATURE_FeatWFxT)\n#define HaveFeatXS() (ctx->features1 & ARCH_FEATURE_FeatXS)\n#define HaveFlagFormatExt() (ctx->features1 & ARCH_FEATURE_FlagFormatExt)\n#define HaveFlagManipulateExt() (ctx->features1 & ARCH_FEATURE_FlagManipulateExt)\n#define HaveFrintExt() (ctx->features1 & ARCH_FEATURE_FrintExt)\n#define HaveInt8MatMulExt() (ctx->features1 & ARCH_FEATURE_Int8MatMulExt)\n#define HaveMTE2Ext() (ctx->features1 & ARCH_FEATURE_MTE2Ext)\n#define HaveMTEExt() (ctx->features1 & ARCH_FEATURE_MTEExt)\n#define HaveNVExt() (ctx->features1 & ARCH_FEATURE_NVExt)\n#define HavePACExt() (ctx->features1 & ARCH_FEATURE_PACExt)\n#define HavePANExt() (ctx->features1 & ARCH_FEATURE_PANExt)\n#define HaveQRDMLAHExt() (ctx->features1 & ARCH_FEATURE_QRDMLAHExt)\n#define HaveRASExt() (ctx->features1 & ARCH_FEATURE_RASExt)\n#define HaveSBExt() (ctx->features1 & ARCH_FEATURE_SBExt)\n#define HaveSHA1Ext() (ctx->features1 & ARCH_FEATURE_SHA1Ext)\n#define HaveSHA256Ext() (ctx->features1 & ARCH_FEATURE_SHA256Ext)\n#define HaveSHA3Ext() (ctx->features1 & ARCH_FEATURE_SHA3Ext)\n#define HaveSHA512Ext() (ctx->features1 & ARCH_FEATURE_SHA512Ext)\n#define HaveSM3Ext() (ctx->features1 & ARCH_FEATURE_SM3Ext)\n#define HaveSM4Ext() (ctx->features1 & ARCH_FEATURE_SM4Ext)\n#define HaveSME() (ctx->features1 & ARCH_FEATURE_SME)\n#define HaveSMEF64F64() (ctx->features1 & ARCH_FEATURE_SMEF64F64)\n#define HaveSMEI16I64() (ctx->features1 & ARCH_FEATURE_SMEI16I64)\n#define HaveSSBSExt() (ctx->features1 & ARCH_FEATURE_SSBSExt)\n#define HaveSVE() (ctx->features1 & ARCH_FEATURE_SVE)\n#define HaveSVE2() (ctx->features1 & ARCH_FEATURE_SVE2)\n#define HaveSVE2AES() (ctx->features1 & ARCH_FEATURE_SVE2AES)\n#define HaveSVE2BitPerm() (ctx->features1 & ARCH_FEATURE_SVE2BitPerm)\n#define HaveSVE2PMULL128() (ctx->features1 & ARCH_FEATURE_SVE2PMULL128)\n#define HaveSVE2SHA3() (ctx->features1 & ARCH_FEATURE_SVE2SHA3)\n#define HaveSVE2SM4() (ctx->features1 & ARCH_FEATURE_SVE2SM4)\n#define HaveSVEFP32MatMulExt() (ctx->features1 & ARCH_FEATURE_SVEFP32MatMulExt)\n#define HaveSVEFP64MatMulExt() (ctx->features1 & ARCH_FEATURE_SVEFP64MatMulExt)\n#define HaveSelfHostedTrace() (ctx->features1 & ARCH_FEATURE_SelfHostedTrace)\n#define HaveStatisticalProfiling() (ctx->features1 & ARCH_FEATURE_StatisticalProfiling)\n#define HaveTME() (ctx->features1 & ARCH_FEATURE_TME)\n#define HaveUAOExt() (ctx->features1 & ARCH_FEATURE_UAOExt)\n#define HaveVirtHostExt() (ctx->features1 & ARCH_FEATURE_VirtHostExt)\n\n// defines for features referenced at decode\n#define ARCH_FEATURE_BF16 ((uint64_t)1<<0)\n#define ARCH_FEATURE_BTI ((uint64_t)1<<1)\n#define ARCH_FEATURE_DGH ((uint64_t)1<<2)\n#define ARCH_FEATURE_DotProd ((uint64_t)1<<3)\n#define ARCH_FEATURE_F32MM ((uint64_t)1<<4)\n#define ARCH_FEATURE_F64MM ((uint64_t)1<<5)\n#define ARCH_FEATURE_FCMA ((uint64_t)1<<6)\n#define ARCH_FEATURE_FHM ((uint64_t)1<<7)\n#define ARCH_FEATURE_FP16 ((uint64_t)1<<8)\n#define ARCH_FEATURE_FRINTTS ((uint64_t)1<<9)\n#define ARCH_FEATURE_FlagM ((uint64_t)1<<10)\n#define ARCH_FEATURE_FlagM2 ((uint64_t)1<<11)\n#define ARCH_FEATURE_I8MM ((uint64_t)1<<12)\n#define ARCH_FEATURE_JSCVT ((uint64_t)1<<13)\n#define ARCH_FEATURE_LOR ((uint64_t)1<<14)\n#define ARCH_FEATURE_LRCPC ((uint64_t)1<<15)\n#define ARCH_FEATURE_LRCPC2 ((uint64_t)1<<16)\n#define ARCH_FEATURE_LS64 ((uint64_t)1<<17)\n#define ARCH_FEATURE_LS64_V ((uint64_t)1<<18)\n#define ARCH_FEATURE_LSE ((uint64_t)1<<19)\n#define ARCH_FEATURE_MTE ((uint64_t)1<<20)\n#define ARCH_FEATURE_MTE2 ((uint64_t)1<<21)\n#define ARCH_FEATURE_PAuth ((uint64_t)1<<22)\n#define ARCH_FEATURE_RAS ((uint64_t)1<<23)\n#define ARCH_FEATURE_RDM ((uint64_t)1<<24)\n#define ARCH_FEATURE_SHA3 ((uint64_t)1<<25)\n#define ARCH_FEATURE_SHA512 ((uint64_t)1<<26)\n#define ARCH_FEATURE_SM3 ((uint64_t)1<<27)\n#define ARCH_FEATURE_SM4 ((uint64_t)1<<28)\n#define ARCH_FEATURE_SME ((uint64_t)1<<29)\n#define ARCH_FEATURE_SME_F64F64 ((uint64_t)1<<30)\n#define ARCH_FEATURE_SME_I16I64 ((uint64_t)1<<31)\n#define ARCH_FEATURE_SPE ((uint64_t)1<<32)\n#define ARCH_FEATURE_SVE_AES ((uint64_t)1<<33)\n#define ARCH_FEATURE_SVE_BitPerm ((uint64_t)1<<34)\n#define ARCH_FEATURE_SVE_SHA3 ((uint64_t)1<<35)\n#define ARCH_FEATURE_SVE_SM4 ((uint64_t)1<<36)\n#define ARCH_FEATURE_TME ((uint64_t)1<<37)\n#define ARCH_FEATURE_TRF ((uint64_t)1<<38)\n#define ARCH_FEATURE_WFxT ((uint64_t)1<<39)\n#define ARCH_FEATURE_XS ((uint64_t)1<<40)\n\n// defines for features referenced by pcode\n#define ARCH_FEATURE_AESExt ((uint64_t)1<<0)\n#define ARCH_FEATURE_AtomicExt ((uint64_t)1<<1)\n#define ARCH_FEATURE_BF16Ext ((uint64_t)1<<2)\n#define ARCH_FEATURE_BTIExt ((uint64_t)1<<3)\n#define ARCH_FEATURE_Bit128PMULLExt ((uint64_t)1<<4)\n#define ARCH_FEATURE_CRCExt ((uint64_t)1<<5)\n#define ARCH_FEATURE_DGHExt ((uint64_t)1<<6)\n#define ARCH_FEATURE_DITExt ((uint64_t)1<<7)\n#define ARCH_FEATURE_DOTPExt ((uint64_t)1<<8)\n#define ARCH_FEATURE_FCADDExt ((uint64_t)1<<9)\n#define ARCH_FEATURE_FJCVTZSExt ((uint64_t)1<<10)\n#define ARCH_FEATURE_FP16Ext ((uint64_t)1<<11)\n#define ARCH_FEATURE_FP16MulNoRoundingToFP32Ext ((uint64_t)1<<12)\n#define ARCH_FEATURE_FeatLS64 ((uint64_t)1<<13)\n#define ARCH_FEATURE_FeatWFxT ((uint64_t)1<<14)\n#define ARCH_FEATURE_FeatXS ((uint64_t)1<<15)\n#define ARCH_FEATURE_FlagFormatExt ((uint64_t)1<<16)\n#define ARCH_FEATURE_FlagManipulateExt ((uint64_t)1<<17)\n#define ARCH_FEATURE_FrintExt ((uint64_t)1<<18)\n#define ARCH_FEATURE_Int8MatMulExt ((uint64_t)1<<19)\n#define ARCH_FEATURE_MTE2Ext ((uint64_t)1<<20)\n#define ARCH_FEATURE_MTEExt ((uint64_t)1<<21)\n#define ARCH_FEATURE_NVExt ((uint64_t)1<<22)\n#define ARCH_FEATURE_PACExt ((uint64_t)1<<23)\n#define ARCH_FEATURE_PANExt ((uint64_t)1<<24)\n#define ARCH_FEATURE_QRDMLAHExt ((uint64_t)1<<25)\n#define ARCH_FEATURE_RASExt ((uint64_t)1<<26)\n#define ARCH_FEATURE_SBExt ((uint64_t)1<<27)\n#define ARCH_FEATURE_SHA1Ext ((uint64_t)1<<28)\n#define ARCH_FEATURE_SHA256Ext ((uint64_t)1<<29)\n#define ARCH_FEATURE_SHA3Ext ((uint64_t)1<<30)\n#define ARCH_FEATURE_SHA512Ext ((uint64_t)1<<31)\n#define ARCH_FEATURE_SM3Ext ((uint64_t)1<<32)\n#define ARCH_FEATURE_SM4Ext ((uint64_t)1<<33)\n//#define ARCH_FEATURE_SME ((uint64_t)1<<34)\n#define ARCH_FEATURE_SMEF64F64 ((uint64_t)1<<35)\n#define ARCH_FEATURE_SMEI16I64 ((uint64_t)1<<36)\n#define ARCH_FEATURE_SSBSExt ((uint64_t)1<<37)\n#define ARCH_FEATURE_SVE ((uint64_t)1<<38)\n#define ARCH_FEATURE_SVE2 ((uint64_t)1<<39)\n#define ARCH_FEATURE_SVE2AES ((uint64_t)1<<40)\n#define ARCH_FEATURE_SVE2BitPerm ((uint64_t)1<<41)\n#define ARCH_FEATURE_SVE2PMULL128 ((uint64_t)1<<42)\n#define ARCH_FEATURE_SVE2SHA3 ((uint64_t)1<<43)\n#define ARCH_FEATURE_SVE2SM4 ((uint64_t)1<<44)\n#define ARCH_FEATURE_SVEFP32MatMulExt ((uint64_t)1<<45)\n#define ARCH_FEATURE_SVEFP64MatMulExt ((uint64_t)1<<46)\n#define ARCH_FEATURE_SelfHostedTrace ((uint64_t)1<<47)\n#define ARCH_FEATURE_StatisticalProfiling ((uint64_t)1<<48)\n//#define ARCH_FEATURE_TME ((uint64_t)1<<49)\n#define ARCH_FEATURE_UAOExt ((uint64_t)1<<50)\n#define ARCH_FEATURE_VirtHostExt ((uint64_t)1<<51)\n\n#define ARCH_FEATURES_ALL 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/format.c",
    "content": "#include <stdbool.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdint.h>\n#include <inttypes.h>\n\n#include \"format.h\"\n#include \"regs.h\"\n#include \"pcode.h\"\n\nconst char *get_arrspec_str(ArrangementSpec arrspec)\n{\n\tswitch(arrspec) {\n\t\tcase ARRSPEC_FULL: return \".1q\";\n\t\tcase ARRSPEC_2DOUBLES: return \".2d\";\n\t\tcase ARRSPEC_4SINGLES: return \".4s\";\n\t\tcase ARRSPEC_8HALVES: return \".8h\";\n\t\tcase ARRSPEC_16BYTES: return \".16b\";\n\t\tcase ARRSPEC_1DOUBLE: return \".1d\";\n\t\tcase ARRSPEC_2SINGLES: return \".2s\";\n\t\tcase ARRSPEC_4HALVES: return \".4h\";\n\t\tcase ARRSPEC_8BYTES: return \".8b\";\n\t\tcase ARRSPEC_1SINGLE: return \".1s\";\n\t\tcase ARRSPEC_2HALVES: return \".2h\";\n\t\tcase ARRSPEC_4BYTES: return \".4b\";\n\t\tcase ARRSPEC_1HALF: return \".1h\";\n\t\tcase ARRSPEC_1BYTE: return \".1b\";\n\t\tdefault: return \"\";\n\t}\n}\n\nconst char *get_arrspec_str_truncated(ArrangementSpec arrspec)\n{\n\tswitch(arrspec) {\n\t\tcase ARRSPEC_FULL: return \".q\";\n\t\tcase ARRSPEC_2DOUBLES: return \".d\";\n\t\tcase ARRSPEC_4SINGLES: return \".s\";\n\t\tcase ARRSPEC_8HALVES: return \".h\";\n\t\tcase ARRSPEC_16BYTES: return \".b\";\n\t\tcase ARRSPEC_1DOUBLE: return \".d\";\n\t\tcase ARRSPEC_2SINGLES: return \".s\";\n\t\tcase ARRSPEC_4HALVES: return \".h\";\n\t\tcase ARRSPEC_8BYTES: return \".b\";\n\t\tcase ARRSPEC_1SINGLE: return \".s\";\n\t\tcase ARRSPEC_2HALVES: return \".h\";\n\t\tcase ARRSPEC_4BYTES: return \".4b\"; // not an error, UDOT_asimdelem_D and SDOT_asimdelem_D use this\n\t\tcase ARRSPEC_1HALF: return \".h\";\n\t\tcase ARRSPEC_1BYTE: return \".b\";\n\t\tdefault: return \"\";\n\t}\n}\n\nconst char *get_register_arrspec(Register reg, const InstructionOperand *operand)\n{\n\tif(operand->arrSpec == ARRSPEC_NONE)\n\t\treturn \"\";\n\n\tbool is_simd = reg >= REG_V0 && reg <= REG_V31;\n\tbool is_sve = reg >= REG_Z0 && reg <= REG_Z31;\n\tbool is_pred = reg >= REG_P0 && reg <= REG_P31;\n\n\tif(!is_simd && !is_sve && !is_pred)\n\t\treturn \"\";\n\n\tif(operand->laneUsed || is_sve || is_pred)\n\t\treturn get_arrspec_str_truncated(operand->arrSpec);\n\n\treturn get_arrspec_str(operand->arrSpec);\n}\n\nint get_register_full(Register reg, const InstructionOperand *operand, char *result)\n{\n\tstrcpy(result, get_register_name(reg));\n\tif(result[0] == '\\0')\n\t\treturn -1;\n\n\tstrcat(result, get_register_arrspec(reg, operand));\n\n\treturn 0;\n}\n\n//-----------------------------------------------------------------------------\n// miscellany to string\n//-----------------------------------------------------------------------------\n\nuint32_t get_implementation_specific(const InstructionOperand *operand, char *outBuffer, uint32_t outBufferSize)\n{\n\treturn snprintf(outBuffer,\n\t\t\toutBufferSize,\n\t\t\t\"s%d_%d_c%d_c%d_%d\",\n\t\t\toperand->implspec[0],\n\t\t\toperand->implspec[1],\n\t\t\toperand->implspec[2],\n\t\t\toperand->implspec[3],\n\t\t\toperand->implspec[4]) >= outBufferSize;\n}\n\nconst char *get_operation(const Instruction *inst)\n{\n\treturn operation_to_str(inst->operation);\n}\n\nstatic const char *ConditionString[] = {\n\t\"eq\", \"ne\", \"cs\", \"cc\",\n\t\"mi\", \"pl\", \"vs\", \"vc\",\n\t\"hi\", \"ls\", \"ge\", \"lt\",\n\t\"gt\", \"le\", \"al\", \"nv\"\n};\n\nconst char *get_condition(Condition cond)\n{\n\tif (cond < 0 || cond >= END_CONDITION)\n\t\treturn NULL;\n\n\treturn ConditionString[cond];\n}\n\nstatic const char *ShiftString[] = {\n\t\"NONE\", \"lsl\", \"lsr\", \"asr\",\n\t\"ror\",  \"uxtw\", \"sxtw\", \"sxtx\",\n\t\"uxtx\", \"sxtb\", \"sxth\", \"uxth\",\n\t\"uxtb\", \"msl\"\n};\n\nconst char *get_shift(ShiftType shift)\n{\n\tif (shift <= ShiftType_NONE || shift >= ShiftType_END)\n\t\treturn NULL;\n\n\treturn ShiftString[shift];\n}\n\n//-----------------------------------------------------------------------------\n// operand processing helpers\n//-----------------------------------------------------------------------------\n\nstatic inline uint32_t get_shifted_register(\n\tconst InstructionOperand *operand,\n\tuint32_t registerNumber,\n\tchar *outBuffer,\n\tuint32_t outBufferSize)\n{\n\tchar immBuff[32] = {0};\n\tchar shiftBuff[64] = {0};\n\n\tchar reg[16];\n\tif(get_register_full(operand->reg[registerNumber], operand, reg))\n\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\tif (operand->shiftType != ShiftType_NONE)\n\t{\n\t\tif (operand->shiftValueUsed != 0)\n\t\t{\n\t\t\tif (snprintf(immBuff, sizeof(immBuff), \" #%#x\", operand->shiftValue) >= sizeof(immBuff))\n\t\t\t{\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\t\t\t}\n\t\t}\n\t\tconst char *shiftStr = get_shift(operand->shiftType);\n\t\tif (shiftStr == NULL)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\tsnprintf(\n\t\t\t\tshiftBuff,\n\t\t\t\tsizeof(shiftBuff),\n\t\t\t\t\", %s%s\",\n\t\t\t\tshiftStr,\n\t\t\t\timmBuff);\n\t}\n\tif (snprintf(outBuffer, outBufferSize, \"%s%s\", reg, shiftBuff) < 0)\n\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\treturn DISASM_SUCCESS;\n}\n\nuint32_t get_memory_operand(\n\tconst InstructionOperand *operand,\n\tchar *outBuffer,\n\tuint32_t outBufferSize)\n{\n\tchar immBuff[64]= {0};\n\tchar extendBuff[48] = {0};\n\tchar paramBuff[32] = {0};\n\n\tchar reg0[16]={'\\0'}, reg1[16]={'\\0'};\n\tif(get_register_full(operand->reg[0], operand, reg0))\n\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\tconst char *sign = \"\";\n\tint64_t imm = operand->immediate;\n\tif (operand->signedImm && (int64_t)imm < 0)\n\t{\n\t\tsign = \"-\";\n\t\timm = -imm;\n\t}\n\n\tswitch (operand->operandClass)\n\t{\n\t\tcase MEM_REG:\n\t\t\tif (snprintf(outBuffer, outBufferSize, \"[%s]\", reg0) >= outBufferSize)\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\tbreak;\n\n\t\tcase MEM_PRE_IDX:\n\t\t\tif (snprintf(outBuffer, outBufferSize, \"[%s, #%s%#\" PRIx64 \"]!\", reg0, sign, (uint64_t)imm) >= outBufferSize)\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\tbreak;\n\n\t\tcase MEM_POST_IDX: // [<reg>], <reg|imm>\n\t\t\tif (operand->reg[1] != REG_NONE) {\n\t\t\t\tif(get_register_full((Register)operand->reg[1], operand, reg1))\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\t\t\t\tsnprintf(paramBuff, sizeof(paramBuff), \", %s\", reg1);\n\t\t\t}\n\t\t\telse if (snprintf(paramBuff, sizeof(paramBuff), \", #%s%#\" PRIx64, sign, (uint64_t)imm) >= sizeof(paramBuff))\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\t\t\tif (snprintf(outBuffer, outBufferSize, \"[%s]%s\", reg0, paramBuff) >= outBufferSize)\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\t\t\tbreak;\n\n\t\tcase MEM_OFFSET: // [<reg> optional(imm)]\n\t\t\tif (operand->immediate != 0) {\n\t\t\t\tconst char *mul_vl = operand->mul_vl ? \", mul vl\" : \"\";\n\t\t\t\tif(snprintf(immBuff, sizeof(immBuff), \", #%s%#\" PRIx64 \"%s\", sign, (uint64_t)imm, mul_vl) >= sizeof(immBuff)) {\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (snprintf(outBuffer, outBufferSize, \"[%s%s]\", reg0, immBuff) >= outBufferSize)\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\tbreak;\n\n\t\tcase MEM_EXTENDED:\n\t\t\tif(get_register_full(operand->reg[1], operand, reg1))\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\t\t\tif (reg0[0] == '\\0' || reg1[0] == '\\0') {\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t}\n\n\t\t\t// immBuff, like \"#0x0\"\n\t\t\tif (operand->shiftValueUsed)\n\t\t\t\tif(snprintf(immBuff, sizeof(immBuff), \" #%#x\", operand->shiftValue) >= sizeof(immBuff))\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\t\t\t// extendBuff, like \"lsl #0x0\"\n\t\t\tif (operand->shiftType != ShiftType_NONE)\n\t\t\t{\n\t\t\t\tif (snprintf(extendBuff, sizeof(extendBuff), \", %s%s\",\n\t\t\t\t\t\t\tget_shift(operand->shiftType), immBuff) >= sizeof(extendBuff))\n\t\t\t\t{\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// together, like \"[x24, x30, lsl #0x0]\"\n\t\t\tif (snprintf(outBuffer, outBufferSize, \"[%s, %s%s]\", reg0, reg1, extendBuff) >= outBufferSize)\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn NOT_MEMORY_OPERAND;\n\t}\n\treturn DISASM_SUCCESS;\n}\n\nuint32_t get_register(const InstructionOperand *operand, uint32_t registerNumber, char *outBuffer, uint32_t outBufferSize)\n{\n\t/* 1) handle system registers */\n\tif(operand->operandClass == SYS_REG)\n\t{\n\t\tif (snprintf(outBuffer, outBufferSize, \"%s\",\n\t\t\tget_system_register_name(operand->sysreg)) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\t\treturn 0;\n\t}\n\n\tif(operand->operandClass != REG && operand->operandClass != MULTI_REG)\n\t\treturn OPERAND_IS_NOT_REGISTER;\n\n\t/* 2) handle shifted registers */\n\tif (operand->shiftType != ShiftType_NONE)\n\t{\n\t\treturn get_shifted_register(operand, registerNumber, outBuffer, outBufferSize);\n\t}\n\n\tchar reg_buf[16];\n\tif(get_register_full(operand->reg[registerNumber], operand, reg_buf))\n\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\t/* 3) handle predicate registers */\n\tif(operand->operandClass == REG && operand->pred_qual && operand->reg[0] >= REG_P0 && operand->reg[0] <= REG_P31)\n\t{\n\t\tif(snprintf(outBuffer, outBufferSize, \"%s/%c\", reg_buf, operand->pred_qual) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\t\treturn 0;\n\t}\n\n\t/* 4) handle other registers */\n\tchar index[32] = {0};\n\tif(operand->operandClass == REG && operand->laneUsed)\n\t\tsnprintf(index, sizeof(index), \"[%u]\", operand->lane);\n\n\tif(snprintf(outBuffer, outBufferSize, \"%s%s\", reg_buf, index) >= outBufferSize)\n\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\n\treturn 0;\n}\n\nuint32_t get_multireg_operand(const InstructionOperand *operand, char *result, uint32_t result_sz)\n{\n\tchar lane_str[32] = {0};\n\tchar reg_str[4][32];\n\tuint32_t elem_n;\n\tint rc;\n\tmemset(&reg_str, 0, sizeof(reg_str));\n\n\tfor (elem_n = 0; elem_n < 4 && operand->reg[elem_n] != REG_NONE; elem_n++)\n\t\tif (get_register(operand, elem_n, reg_str[elem_n], 32) != 0)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\tif(operand->laneUsed)\n\t\tsnprintf(lane_str, sizeof(lane_str), \"[%d]\", operand->lane);\n\n\tswitch (elem_n)\n\t{\n\t\tcase 1:\n\t\t\trc = snprintf(result, result_sz, \"{%s}%s\",\n\t\t\t\treg_str[0], lane_str);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\trc = snprintf(result, result_sz, \"{%s, %s}%s\",\n\t\t\t\treg_str[0], reg_str[1], lane_str);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\trc = snprintf(result, result_sz, \"{%s, %s, %s}%s\",\n\t\t\t\treg_str[0], reg_str[1], reg_str[2], lane_str);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\trc = snprintf(result, result_sz, \"{%s, %s, %s, %s}%s\",\n\t\t\t\treg_str[0], reg_str[1], reg_str[2], reg_str[3], lane_str);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\n\treturn rc < 0 ? FAILED_TO_DISASSEMBLE_OPERAND : DISASM_SUCCESS;\n}\n\nuint32_t get_shifted_immediate(const InstructionOperand *instructionOperand, char *outBuffer, uint32_t outBufferSize, uint32_t type)\n{\n\tchar shiftBuff[48] = {0};\n\tchar immBuff[32] = {0};\n\tconst char *sign = \"\";\n\tif (instructionOperand == NULL)\n\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\tuint64_t imm = instructionOperand->immediate;\n\tif (instructionOperand->signedImm == 1 && ((int64_t)imm) < 0)\n\t{\n\t\tsign = \"-\";\n\t\timm = -(int64_t)imm;\n\t}\n\tif (instructionOperand->shiftType != ShiftType_NONE)\n\t{\n\t\tif (instructionOperand->shiftValueUsed != 0)\n\t\t{\n\t\t\tif (snprintf(immBuff, sizeof(immBuff), \" #%#x\", instructionOperand->shiftValue) >= sizeof(immBuff))\n\t\t\t{\n\t\t\t\treturn FAILED_TO_DISASSEMBLE_REGISTER;\n\t\t\t}\n\t\t}\n\t\tconst char *shiftStr = get_shift(instructionOperand->shiftType);\n\t\tif (shiftStr == NULL)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\tsnprintf(\n\t\t\t\tshiftBuff,\n\t\t\t\tsizeof(shiftBuff),\n\t\t\t\t\", %s%s\",\n\t\t\t\tshiftStr,\n\t\t\t\timmBuff);\n\t}\n\tif (type == FIMM32)\n\t{\n\t\tfloat f = *(const float*)&instructionOperand->immediate;\n\t\tif (snprintf(outBuffer, outBufferSize, \"#%.08f%s\", f, shiftBuff) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\telse if (type == IMM32)\n\t{\n\t\tif (snprintf(outBuffer, outBufferSize, \"#%s%#x%s\", sign, (uint32_t)imm, shiftBuff) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\telse if (type == LABEL)\n\t{\n\t\tif (snprintf(outBuffer, outBufferSize, \"0x%\" PRIx64, (uint64_t)imm) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\telse if (type == STR_IMM)\n\t{\n\t\tif (snprintf(outBuffer, outBufferSize, \"%s #0x%\" PRIx64, instructionOperand->name, (uint64_t)imm) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\telse\n\t{\n\t\tif (snprintf(outBuffer, outBufferSize, \"#%s%#\" PRIx64 \"%s\",\n\t\t\t\t\tsign,\n\t\t\t\t\timm,\n\t\t\t\t\tshiftBuff) >= outBufferSize)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t}\n\treturn DISASM_SUCCESS;\n}\n\nuint32_t get_sme_tile(const InstructionOperand *operand, char *outBuffer, uint32_t outBufferSize)\n{\n\tchar base_offset[32] = {'\\0'};\n\tif(operand->reg[0] != REG_NONE) {\n\t\tif(operand->arrSpec == ARRSPEC_FULL)\n\t\t\tsnprintf(base_offset, sizeof(base_offset), \"[%s]\", get_register_name(operand->reg[0]));\n\t\telse\n\t\t\tsnprintf(base_offset, sizeof(base_offset), \"[%s, #%\" PRIu64 \"]\", get_register_name(operand->reg[0]), operand->immediate);\n\t}\n\n\tchar *slice = \"\";\n\tif(operand->slice == SLICE_HORIZONTAL)\n\t\tslice = \"H\";\n\telse if(operand->slice == SLICE_VERTICAL)\n\t\tslice = \"V\";\n\n\tif(snprintf(outBuffer, outBufferSize, \"Z%d%s%s%s\",\n\t  operand->tile,\n\t  slice,\n\t  get_arrspec_str_truncated(operand->arrSpec),\n\t  base_offset\n\t ) >= outBufferSize)\n\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\treturn DISASM_SUCCESS;\n}\n\nuint32_t get_indexed_element(const InstructionOperand *operand, char *outBuffer, uint32_t outBufferSize)\n{\n\t// make the \"{, #<imm>}\"\n\tchar optional_comma_and[32];\n\tif(operand->immediate)\n\t\tif(snprintf(optional_comma_and, 32, \", #%\" PRIu64 \"\", operand->immediate) >= 32)\n\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\t// <Pn>.<T>[<Wm>{, #<imm>}]\n\tif(snprintf(outBuffer, outBufferSize, \"%s%s[%s%s]\",\n\t\tget_register_name(operand->reg[0]),\n\t\tget_arrspec_str_truncated(operand->arrSpec),\n\t\tget_register_name(operand->reg[1]),\n\t\toptional_comma_and\n\t  ) >= outBufferSize)\n\t  \treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\treturn DISASM_SUCCESS;\n}\n\nuint32_t get_accum_array(const InstructionOperand *operand, char *outBuffer, uint32_t outBufferSize)\n{\n\tif(snprintf(outBuffer, outBufferSize, \"ZA[%s, #%\" PRIu64 \"]\",\n\t  get_register_name(operand->reg[0]), operand->immediate\n\t  ) >= outBufferSize)\n\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\n\treturn DISASM_SUCCESS;\n}\n\n//-----------------------------------------------------------------------------\n// disassemble (decoded Instruction -> string)\n//-----------------------------------------------------------------------------\n\nint aarch64_disassemble(Instruction *instruction, char *buf, size_t buf_sz)\n{\n\tchar operandStrings[MAX_OPERANDS][130];\n\tchar tmpOperandString[128];\n\tconst char *operand = tmpOperandString;\n\tif (instruction == NULL || buf_sz == 0 || buf == NULL)\n\t\treturn INVALID_ARGUMENTS;\n\n\tmemset(operandStrings, 0, sizeof(operandStrings));\n\tconst char *operation = get_operation(instruction);\n\tif (operation == NULL)\n\t\treturn FAILED_TO_DISASSEMBLE_OPERATION;\n\n\tfor(int i=0; i<MAX_OPERANDS; i++)\n\t\tmemset(&(operandStrings[i][0]), 0, 128);\n\n\tfor(int i=0; i<MAX_OPERANDS && instruction->operands[i].operandClass != NONE; i++)\n\t{\n\t\tswitch (instruction->operands[i].operandClass)\n\t\t{\n\t\t\tcase CONDITION:\n\t\t\t\tif (snprintf(tmpOperandString, sizeof(tmpOperandString), \"%s\",\n\t\t\t\t\t\t\tget_condition((Condition)instruction->operands[i].cond)) >= sizeof(tmpOperandString))\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase FIMM32:\n\t\t\tcase IMM32:\n\t\t\tcase IMM64:\n\t\t\tcase LABEL:\n\t\t\tcase STR_IMM:\n\t\t\t\tif (get_shifted_immediate(\n\t\t\t\t\t\t\t&instruction->operands[i],\n\t\t\t\t\t\t\ttmpOperandString,\n\t\t\t\t\t\t\tsizeof(tmpOperandString),\n\t\t\t\t\t\t\tinstruction->operands[i].operandClass) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase REG:\n\t\t\t\tif (get_register(\n\t\t\t\t\t\t&instruction->operands[i],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttmpOperandString,\n\t\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase SYS_REG:\n\t\t\t\toperand = get_system_register_name(instruction->operands[i].sysreg);\n\t\t\t\tif (operand == NULL)\n\t\t\t\t{\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase MULTI_REG:\n\t\t\t\tif (get_multireg_operand(\n\t\t\t\t\t\t\t&instruction->operands[i],\n\t\t\t\t\t\t\ttmpOperandString,\n\t\t\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\t}\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase IMPLEMENTATION_SPECIFIC:\n\t\t\t\tif (get_implementation_specific(\n\t\t\t\t\t\t&instruction->operands[i],\n\t\t\t\t\t\ttmpOperandString,\n\t\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\t}\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase MEM_REG:\n\t\t\tcase MEM_OFFSET:\n\t\t\tcase MEM_EXTENDED:\n\t\t\tcase MEM_PRE_IDX:\n\t\t\tcase MEM_POST_IDX:\n\t\t\t\tif (get_memory_operand(&instruction->operands[i],\n\t\t\t\t\t\t\ttmpOperandString,\n\t\t\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase SME_TILE:\n\t\t\t\tif(get_sme_tile(&instruction->operands[i],\n\t\t\t\t\ttmpOperandString,\n\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase INDEXED_ELEMENT:\n\t\t\t\tif(get_indexed_element(&instruction->operands[i],\n\t\t\t\t\ttmpOperandString,\n\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase ACCUM_ARRAY:\n\t\t\t\tif(get_accum_array(&instruction->operands[i],\n\t\t\t\t\ttmpOperandString,\n\t\t\t\t\tsizeof(tmpOperandString)) != DISASM_SUCCESS)\n\t\t\t\t\treturn FAILED_TO_DISASSEMBLE_OPERAND;\n\t\t\t\toperand = tmpOperandString;\n\t\t\t\tbreak;\n\t\t\tcase NAME:\n\t\t\t\toperand = instruction->operands[i].name;\n\t\t\t\tbreak;\n\t\t\tcase NONE:\n\t\t\t\tbreak;\n\t\t}\n\t\tsnprintf(operandStrings[i], sizeof(operandStrings[i]), i==0?\"\\t%s\":\", %s\", operand);\n\t}\n\tmemset(buf, 0, buf_sz);\n\tif (snprintf(buf, buf_sz, \"%s%s%s%s%s%s\",\n\t\t\t\tget_operation(instruction),\n\t\t\t\toperandStrings[0],\n\t\t\t\toperandStrings[1],\n\t\t\t\toperandStrings[2],\n\t\t\t\toperandStrings[3],\n\t\t\t\toperandStrings[4]) >= buf_sz)\n\t\treturn OUTPUT_BUFFER_TOO_SMALL;\n\treturn DISASM_SUCCESS;\n}\n\nvoid print_instruction(Instruction *instr)\n{\n\t//printf(\"print_instruction (TODO)\\n\");\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/format.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <stdbool.h>\n\n#include \"decode.h\"\n#include \"encodings_dec.h\"\n#include \"encodings_fmt.h\"\n#include \"operations.h\"\n#include \"regs.h\"\n#include \"sysregs_fmt_gen.h\"\n\n//-----------------------------------------------------------------------------\n// disassembly function prototypes, return values\n//-----------------------------------------------------------------------------\n\n/* these get returned by the disassemble_instruction() function */\nenum FailureCode {\n\tDISASM_SUCCESS=0,\n\tINVALID_ARGUMENTS,\n\tFAILED_TO_DISASSEMBLE_OPERAND,\n\tFAILED_TO_DISASSEMBLE_OPERATION,\n\tFAILED_TO_DISASSEMBLE_REGISTER,\n\tFAILED_TO_DECODE_INSTRUCTION,\n\tOUTPUT_BUFFER_TOO_SMALL,\n\tOPERAND_IS_NOT_REGISTER,\n\tNOT_MEMORY_OPERAND\n};\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// get a text representation of the decomposed instruction\nint aarch64_disassemble(Instruction *instruction, char *buf, size_t buf_sz);\n\n// register (and related) to string\nint get_register_full(enum Register, const InstructionOperand *, char *result);\nconst char *get_register_arrspec(enum Register, const InstructionOperand *);\n\n// miscellany to string\nconst char *get_operation(const Instruction *instruction);\nconst char *get_shift(ShiftType shift);\nconst char *get_condition(Condition cond);\nuint32_t get_implementation_specific(\n\t\tconst InstructionOperand *operand,\n\t\tchar *outBuffer,\n\t\tuint32_t outBufferSize);\nconst char *get_arrspec_str(ArrangementSpec arrspec);\nconst char *get_arrspec_str_truncated(ArrangementSpec arrspec);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/gofer.c",
    "content": "#include <stdio.h>\n#include <stdint.h>\n#include <stddef.h>\n#include <string.h>\n#include <stdbool.h>\n\n#include \"decode.h\"\n#include \"format.h\"\n\nvoid disassemble(uint64_t addr, uint8_t *data, int len, char *result, bool verbose)\n{\n\tInstruction instr;\n\tmemset(&instr, 0, sizeof(instr));\n\n\taarch64_decompose(*(uint32_t *)data, &instr, addr);\n\n\taarch64_disassemble(&instr, result, 1024);\n}\n\nuint32_t get_encoding(uint8_t *data)\n{\n\tInstruction instr;\n\t//printf(\"sizeof(instr): %lu\\n\", sizeof(instr));\n\t//printf(\"sizeof(instr.encoding): %lu\\n\", sizeof(instr.encoding));\n\tmemset(&instr, 0, sizeof(instr));\n\taarch64_decompose(*(uint32_t *)data, &instr, 0);\n\treturn instr.encoding;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/operations.c",
    "content": "/* GENERATED FILE */\n#include \"operations.h\"\nconst char *operation_to_str(enum Operation oper)\n{\n\tswitch(oper) {\n\t\tcase ARM64_ABS: return \"abs\";\n\t\tcase ARM64_ADC: return \"adc\";\n\t\tcase ARM64_ADCLB: return \"adclb\";\n\t\tcase ARM64_ADCLT: return \"adclt\";\n\t\tcase ARM64_ADCS: return \"adcs\";\n\t\tcase ARM64_ADD: return \"add\";\n\t\tcase ARM64_ADDG: return \"addg\";\n\t\tcase ARM64_ADDHA: return \"addha\";\n\t\tcase ARM64_ADDHN: return \"addhn\";\n\t\tcase ARM64_ADDHN2: return \"addhn2\";\n\t\tcase ARM64_ADDHNB: return \"addhnb\";\n\t\tcase ARM64_ADDHNT: return \"addhnt\";\n\t\tcase ARM64_ADDP: return \"addp\";\n\t\tcase ARM64_ADDPL: return \"addpl\";\n\t\tcase ARM64_ADDS: return \"adds\";\n\t\tcase ARM64_ADDV: return \"addv\";\n\t\tcase ARM64_ADDVA: return \"addva\";\n\t\tcase ARM64_ADDVL: return \"addvl\";\n\t\tcase ARM64_ADR: return \"adr\";\n\t\tcase ARM64_ADRP: return \"adrp\";\n\t\tcase ARM64_AESD: return \"aesd\";\n\t\tcase ARM64_AESE: return \"aese\";\n\t\tcase ARM64_AESIMC: return \"aesimc\";\n\t\tcase ARM64_AESMC: return \"aesmc\";\n\t\tcase ARM64_AND: return \"and\";\n\t\tcase ARM64_ANDS: return \"ands\";\n\t\tcase ARM64_ANDV: return \"andv\";\n\t\tcase ARM64_ASR: return \"asr\";\n\t\tcase ARM64_ASRD: return \"asrd\";\n\t\tcase ARM64_ASRR: return \"asrr\";\n\t\tcase ARM64_ASRV: return \"asrv\";\n\t\tcase ARM64_AT: return \"at\";\n\t\tcase ARM64_AUTDA: return \"autda\";\n\t\tcase ARM64_AUTDB: return \"autdb\";\n\t\tcase ARM64_AUTDZA: return \"autdza\";\n\t\tcase ARM64_AUTDZB: return \"autdzb\";\n\t\tcase ARM64_AUTIA: return \"autia\";\n\t\tcase ARM64_AUTIA1716: return \"autia1716\";\n\t\tcase ARM64_AUTIASP: return \"autiasp\";\n\t\tcase ARM64_AUTIAZ: return \"autiaz\";\n\t\tcase ARM64_AUTIB: return \"autib\";\n\t\tcase ARM64_AUTIB1716: return \"autib1716\";\n\t\tcase ARM64_AUTIBSP: return \"autibsp\";\n\t\tcase ARM64_AUTIBZ: return \"autibz\";\n\t\tcase ARM64_AUTIZA: return \"autiza\";\n\t\tcase ARM64_AUTIZB: return \"autizb\";\n\t\tcase ARM64_AXFLAG: return \"axflag\";\n\t\tcase ARM64_B: return \"b\";\n\t\tcase ARM64_BCAX: return \"bcax\";\n\t\tcase ARM64_BDEP: return \"bdep\";\n\t\tcase ARM64_BEXT: return \"bext\";\n\t\tcase ARM64_BFC: return \"bfc\";\n\t\tcase ARM64_BFCVT: return \"bfcvt\";\n\t\tcase ARM64_BFCVTN: return \"bfcvtn\";\n\t\tcase ARM64_BFCVTN2: return \"bfcvtn2\";\n\t\tcase ARM64_BFCVTNT: return \"bfcvtnt\";\n\t\tcase ARM64_BFDOT: return \"bfdot\";\n\t\tcase ARM64_BFI: return \"bfi\";\n\t\tcase ARM64_BFM: return \"bfm\";\n\t\tcase ARM64_BFMLAL: return \"bfmlal\";\n\t\tcase ARM64_BFMLALB: return \"bfmlalb\";\n\t\tcase ARM64_BFMLALT: return \"bfmlalt\";\n\t\tcase ARM64_BFMMLA: return \"bfmmla\";\n\t\tcase ARM64_BFMOPA: return \"bfmopa\";\n\t\tcase ARM64_BFMOPS: return \"bfmops\";\n\t\tcase ARM64_BFXIL: return \"bfxil\";\n\t\tcase ARM64_BGRP: return \"bgrp\";\n\t\tcase ARM64_BIC: return \"bic\";\n\t\tcase ARM64_BICS: return \"bics\";\n\t\tcase ARM64_BIF: return \"bif\";\n\t\tcase ARM64_BIT: return \"bit\";\n\t\tcase ARM64_BL: return \"bl\";\n\t\tcase ARM64_BLR: return \"blr\";\n\t\tcase ARM64_BLRAA: return \"blraa\";\n\t\tcase ARM64_BLRAAZ: return \"blraaz\";\n\t\tcase ARM64_BLRAB: return \"blrab\";\n\t\tcase ARM64_BLRABZ: return \"blrabz\";\n\t\tcase ARM64_BR: return \"br\";\n\t\tcase ARM64_BRAA: return \"braa\";\n\t\tcase ARM64_BRAAZ: return \"braaz\";\n\t\tcase ARM64_BRAB: return \"brab\";\n\t\tcase ARM64_BRABZ: return \"brabz\";\n\t\tcase ARM64_BRK: return \"brk\";\n\t\tcase ARM64_BRKA: return \"brka\";\n\t\tcase ARM64_BRKAS: return \"brkas\";\n\t\tcase ARM64_BRKB: return \"brkb\";\n\t\tcase ARM64_BRKBS: return \"brkbs\";\n\t\tcase ARM64_BRKN: return \"brkn\";\n\t\tcase ARM64_BRKNS: return \"brkns\";\n\t\tcase ARM64_BRKPA: return \"brkpa\";\n\t\tcase ARM64_BRKPAS: return \"brkpas\";\n\t\tcase ARM64_BRKPB: return \"brkpb\";\n\t\tcase ARM64_BRKPBS: return \"brkpbs\";\n\t\tcase ARM64_BSL: return \"bsl\";\n\t\tcase ARM64_BSL1N: return \"bsl1n\";\n\t\tcase ARM64_BSL2N: return \"bsl2n\";\n\t\tcase ARM64_BTI: return \"bti\";\n\t\tcase ARM64_B_AL: return \"b.al\";\n\t\tcase ARM64_B_CC: return \"b.lo\";\n\t\tcase ARM64_B_CS: return \"b.hs\";\n\t\tcase ARM64_B_EQ: return \"b.eq\";\n\t\tcase ARM64_B_GE: return \"b.ge\";\n\t\tcase ARM64_B_GT: return \"b.gt\";\n\t\tcase ARM64_B_HI: return \"b.hi\";\n\t\tcase ARM64_B_LE: return \"b.le\";\n\t\tcase ARM64_B_LS: return \"b.ls\";\n\t\tcase ARM64_B_LT: return \"b.lt\";\n\t\tcase ARM64_B_MI: return \"b.mi\";\n\t\tcase ARM64_B_NE: return \"b.ne\";\n\t\tcase ARM64_B_NV: return \"b.nv\";\n\t\tcase ARM64_B_PL: return \"b.pl\";\n\t\tcase ARM64_B_VC: return \"b.vc\";\n\t\tcase ARM64_B_VS: return \"b.vs\";\n\t\tcase ARM64_CADD: return \"cadd\";\n\t\tcase ARM64_CAS: return \"cas\";\n\t\tcase ARM64_CASA: return \"casa\";\n\t\tcase ARM64_CASAB: return \"casab\";\n\t\tcase ARM64_CASAH: return \"casah\";\n\t\tcase ARM64_CASAL: return \"casal\";\n\t\tcase ARM64_CASALB: return \"casalb\";\n\t\tcase ARM64_CASALH: return \"casalh\";\n\t\tcase ARM64_CASB: return \"casb\";\n\t\tcase ARM64_CASH: return \"cash\";\n\t\tcase ARM64_CASL: return \"casl\";\n\t\tcase ARM64_CASLB: return \"caslb\";\n\t\tcase ARM64_CASLH: return \"caslh\";\n\t\tcase ARM64_CASP: return \"casp\";\n\t\tcase ARM64_CASPA: return \"caspa\";\n\t\tcase ARM64_CASPAL: return \"caspal\";\n\t\tcase ARM64_CASPL: return \"caspl\";\n\t\tcase ARM64_CBNZ: return \"cbnz\";\n\t\tcase ARM64_CBZ: return \"cbz\";\n\t\tcase ARM64_CCMN: return \"ccmn\";\n\t\tcase ARM64_CCMP: return \"ccmp\";\n\t\tcase ARM64_CDOT: return \"cdot\";\n\t\tcase ARM64_CFINV: return \"cfinv\";\n\t\tcase ARM64_CFP: return \"cfp\";\n\t\tcase ARM64_CINC: return \"cinc\";\n\t\tcase ARM64_CINV: return \"cinv\";\n\t\tcase ARM64_CLASTA: return \"clasta\";\n\t\tcase ARM64_CLASTB: return \"clastb\";\n\t\tcase ARM64_CLREX: return \"clrex\";\n\t\tcase ARM64_CLS: return \"cls\";\n\t\tcase ARM64_CLZ: return \"clz\";\n\t\tcase ARM64_CMEQ: return \"cmeq\";\n\t\tcase ARM64_CMGE: return \"cmge\";\n\t\tcase ARM64_CMGT: return \"cmgt\";\n\t\tcase ARM64_CMHI: return \"cmhi\";\n\t\tcase ARM64_CMHS: return \"cmhs\";\n\t\tcase ARM64_CMLA: return \"cmla\";\n\t\tcase ARM64_CMLE: return \"cmle\";\n\t\tcase ARM64_CMLT: return \"cmlt\";\n\t\tcase ARM64_CMN: return \"cmn\";\n\t\tcase ARM64_CMP: return \"cmp\";\n\t\tcase ARM64_CMPEQ: return \"cmpeq\";\n\t\tcase ARM64_CMPGE: return \"cmpge\";\n\t\tcase ARM64_CMPGT: return \"cmpgt\";\n\t\tcase ARM64_CMPHI: return \"cmphi\";\n\t\tcase ARM64_CMPHS: return \"cmphs\";\n\t\tcase ARM64_CMPLE: return \"cmple\";\n\t\tcase ARM64_CMPLO: return \"cmplo\";\n\t\tcase ARM64_CMPLS: return \"cmpls\";\n\t\tcase ARM64_CMPLT: return \"cmplt\";\n\t\tcase ARM64_CMPNE: return \"cmpne\";\n\t\tcase ARM64_CMPP: return \"cmpp\";\n\t\tcase ARM64_CMTST: return \"cmtst\";\n\t\tcase ARM64_CNEG: return \"cneg\";\n\t\tcase ARM64_CNOT: return \"cnot\";\n\t\tcase ARM64_CNT: return \"cnt\";\n\t\tcase ARM64_CNTB: return \"cntb\";\n\t\tcase ARM64_CNTD: return \"cntd\";\n\t\tcase ARM64_CNTH: return \"cnth\";\n\t\tcase ARM64_CNTP: return \"cntp\";\n\t\tcase ARM64_CNTW: return \"cntw\";\n\t\tcase ARM64_COMPACT: return \"compact\";\n\t\tcase ARM64_CPP: return \"cpp\";\n\t\tcase ARM64_CPY: return \"cpy\";\n\t\tcase ARM64_CRC32B: return \"crc32b\";\n\t\tcase ARM64_CRC32CB: return \"crc32cb\";\n\t\tcase ARM64_CRC32CH: return \"crc32ch\";\n\t\tcase ARM64_CRC32CW: return \"crc32cw\";\n\t\tcase ARM64_CRC32CX: return \"crc32cx\";\n\t\tcase ARM64_CRC32H: return \"crc32h\";\n\t\tcase ARM64_CRC32W: return \"crc32w\";\n\t\tcase ARM64_CRC32X: return \"crc32x\";\n\t\tcase ARM64_CSDB: return \"csdb\";\n\t\tcase ARM64_CSEL: return \"csel\";\n\t\tcase ARM64_CSET: return \"cset\";\n\t\tcase ARM64_CSETM: return \"csetm\";\n\t\tcase ARM64_CSINC: return \"csinc\";\n\t\tcase ARM64_CSINV: return \"csinv\";\n\t\tcase ARM64_CSNEG: return \"csneg\";\n\t\tcase ARM64_CTERMEQ: return \"ctermeq\";\n\t\tcase ARM64_CTERMNE: return \"ctermne\";\n\t\tcase ARM64_DC: return \"dc\";\n\t\tcase ARM64_DCPS1: return \"dcps1\";\n\t\tcase ARM64_DCPS2: return \"dcps2\";\n\t\tcase ARM64_DCPS3: return \"dcps3\";\n\t\tcase ARM64_DECB: return \"decb\";\n\t\tcase ARM64_DECD: return \"decd\";\n\t\tcase ARM64_DECH: return \"dech\";\n\t\tcase ARM64_DECP: return \"decp\";\n\t\tcase ARM64_DECW: return \"decw\";\n\t\tcase ARM64_DGH: return \"dgh\";\n\t\tcase ARM64_DMB: return \"dmb\";\n\t\tcase ARM64_DRPS: return \"drps\";\n\t\tcase ARM64_DSB: return \"dsb\";\n\t\tcase ARM64_DUP: return \"dup\";\n\t\tcase ARM64_DUPM: return \"dupm\";\n\t\tcase ARM64_DVP: return \"dvp\";\n\t\tcase ARM64_EON: return \"eon\";\n\t\tcase ARM64_EOR: return \"eor\";\n\t\tcase ARM64_EOR3: return \"eor3\";\n\t\tcase ARM64_EORBT: return \"eorbt\";\n\t\tcase ARM64_EORS: return \"eors\";\n\t\tcase ARM64_EORTB: return \"eortb\";\n\t\tcase ARM64_EORV: return \"eorv\";\n\t\tcase ARM64_ERET: return \"eret\";\n\t\tcase ARM64_ERETAA: return \"eretaa\";\n\t\tcase ARM64_ERETAB: return \"eretab\";\n\t\tcase ARM64_ESB: return \"esb\";\n\t\tcase ARM64_EXT: return \"ext\";\n\t\tcase ARM64_EXTR: return \"extr\";\n\t\tcase ARM64_FABD: return \"fabd\";\n\t\tcase ARM64_FABS: return \"fabs\";\n\t\tcase ARM64_FACGE: return \"facge\";\n\t\tcase ARM64_FACGT: return \"facgt\";\n\t\tcase ARM64_FACLE: return \"facle\";\n\t\tcase ARM64_FACLT: return \"faclt\";\n\t\tcase ARM64_FADD: return \"fadd\";\n\t\tcase ARM64_FADDA: return \"fadda\";\n\t\tcase ARM64_FADDP: return \"faddp\";\n\t\tcase ARM64_FADDV: return \"faddv\";\n\t\tcase ARM64_FCADD: return \"fcadd\";\n\t\tcase ARM64_FCCMP: return \"fccmp\";\n\t\tcase ARM64_FCCMPE: return \"fccmpe\";\n\t\tcase ARM64_FCMEQ: return \"fcmeq\";\n\t\tcase ARM64_FCMGE: return \"fcmge\";\n\t\tcase ARM64_FCMGT: return \"fcmgt\";\n\t\tcase ARM64_FCMLA: return \"fcmla\";\n\t\tcase ARM64_FCMLE: return \"fcmle\";\n\t\tcase ARM64_FCMLT: return \"fcmlt\";\n\t\tcase ARM64_FCMNE: return \"fcmne\";\n\t\tcase ARM64_FCMP: return \"fcmp\";\n\t\tcase ARM64_FCMPE: return \"fcmpe\";\n\t\tcase ARM64_FCMUO: return \"fcmuo\";\n\t\tcase ARM64_FCPY: return \"fcpy\";\n\t\tcase ARM64_FCSEL: return \"fcsel\";\n\t\tcase ARM64_FCVT: return \"fcvt\";\n\t\tcase ARM64_FCVTAS: return \"fcvtas\";\n\t\tcase ARM64_FCVTAU: return \"fcvtau\";\n\t\tcase ARM64_FCVTL: return \"fcvtl\";\n\t\tcase ARM64_FCVTL2: return \"fcvtl2\";\n\t\tcase ARM64_FCVTLT: return \"fcvtlt\";\n\t\tcase ARM64_FCVTMS: return \"fcvtms\";\n\t\tcase ARM64_FCVTMU: return \"fcvtmu\";\n\t\tcase ARM64_FCVTN: return \"fcvtn\";\n\t\tcase ARM64_FCVTN2: return \"fcvtn2\";\n\t\tcase ARM64_FCVTNS: return \"fcvtns\";\n\t\tcase ARM64_FCVTNT: return \"fcvtnt\";\n\t\tcase ARM64_FCVTNU: return \"fcvtnu\";\n\t\tcase ARM64_FCVTPS: return \"fcvtps\";\n\t\tcase ARM64_FCVTPU: return \"fcvtpu\";\n\t\tcase ARM64_FCVTX: return \"fcvtx\";\n\t\tcase ARM64_FCVTXN: return \"fcvtxn\";\n\t\tcase ARM64_FCVTXN2: return \"fcvtxn2\";\n\t\tcase ARM64_FCVTXNT: return \"fcvtxnt\";\n\t\tcase ARM64_FCVTZS: return \"fcvtzs\";\n\t\tcase ARM64_FCVTZU: return \"fcvtzu\";\n\t\tcase ARM64_FDIV: return \"fdiv\";\n\t\tcase ARM64_FDIVR: return \"fdivr\";\n\t\tcase ARM64_FDUP: return \"fdup\";\n\t\tcase ARM64_FEXPA: return \"fexpa\";\n\t\tcase ARM64_FJCVTZS: return \"fjcvtzs\";\n\t\tcase ARM64_FLOGB: return \"flogb\";\n\t\tcase ARM64_FMAD: return \"fmad\";\n\t\tcase ARM64_FMADD: return \"fmadd\";\n\t\tcase ARM64_FMAX: return \"fmax\";\n\t\tcase ARM64_FMAXNM: return \"fmaxnm\";\n\t\tcase ARM64_FMAXNMP: return \"fmaxnmp\";\n\t\tcase ARM64_FMAXNMV: return \"fmaxnmv\";\n\t\tcase ARM64_FMAXP: return \"fmaxp\";\n\t\tcase ARM64_FMAXV: return \"fmaxv\";\n\t\tcase ARM64_FMIN: return \"fmin\";\n\t\tcase ARM64_FMINNM: return \"fminnm\";\n\t\tcase ARM64_FMINNMP: return \"fminnmp\";\n\t\tcase ARM64_FMINNMV: return \"fminnmv\";\n\t\tcase ARM64_FMINP: return \"fminp\";\n\t\tcase ARM64_FMINV: return \"fminv\";\n\t\tcase ARM64_FMLA: return \"fmla\";\n\t\tcase ARM64_FMLAL: return \"fmlal\";\n\t\tcase ARM64_FMLAL2: return \"fmlal2\";\n\t\tcase ARM64_FMLALB: return \"fmlalb\";\n\t\tcase ARM64_FMLALT: return \"fmlalt\";\n\t\tcase ARM64_FMLS: return \"fmls\";\n\t\tcase ARM64_FMLSL: return \"fmlsl\";\n\t\tcase ARM64_FMLSL2: return \"fmlsl2\";\n\t\tcase ARM64_FMLSLB: return \"fmlslb\";\n\t\tcase ARM64_FMLSLT: return \"fmlslt\";\n\t\tcase ARM64_FMMLA: return \"fmmla\";\n\t\tcase ARM64_FMOPA: return \"fmopa\";\n\t\tcase ARM64_FMOPS: return \"fmops\";\n\t\tcase ARM64_FMOV: return \"fmov\";\n\t\tcase ARM64_FMSB: return \"fmsb\";\n\t\tcase ARM64_FMSUB: return \"fmsub\";\n\t\tcase ARM64_FMUL: return \"fmul\";\n\t\tcase ARM64_FMULX: return \"fmulx\";\n\t\tcase ARM64_FNEG: return \"fneg\";\n\t\tcase ARM64_FNMAD: return \"fnmad\";\n\t\tcase ARM64_FNMADD: return \"fnmadd\";\n\t\tcase ARM64_FNMLA: return \"fnmla\";\n\t\tcase ARM64_FNMLS: return \"fnmls\";\n\t\tcase ARM64_FNMSB: return \"fnmsb\";\n\t\tcase ARM64_FNMSUB: return \"fnmsub\";\n\t\tcase ARM64_FNMUL: return \"fnmul\";\n\t\tcase ARM64_FRECPE: return \"frecpe\";\n\t\tcase ARM64_FRECPS: return \"frecps\";\n\t\tcase ARM64_FRECPX: return \"frecpx\";\n\t\tcase ARM64_FRINT32X: return \"frint32x\";\n\t\tcase ARM64_FRINT32Z: return \"frint32z\";\n\t\tcase ARM64_FRINT64X: return \"frint64x\";\n\t\tcase ARM64_FRINT64Z: return \"frint64z\";\n\t\tcase ARM64_FRINTA: return \"frinta\";\n\t\tcase ARM64_FRINTI: return \"frinti\";\n\t\tcase ARM64_FRINTM: return \"frintm\";\n\t\tcase ARM64_FRINTN: return \"frintn\";\n\t\tcase ARM64_FRINTP: return \"frintp\";\n\t\tcase ARM64_FRINTX: return \"frintx\";\n\t\tcase ARM64_FRINTZ: return \"frintz\";\n\t\tcase ARM64_FRSQRTE: return \"frsqrte\";\n\t\tcase ARM64_FRSQRTS: return \"frsqrts\";\n\t\tcase ARM64_FSCALE: return \"fscale\";\n\t\tcase ARM64_FSQRT: return \"fsqrt\";\n\t\tcase ARM64_FSUB: return \"fsub\";\n\t\tcase ARM64_FSUBR: return \"fsubr\";\n\t\tcase ARM64_FTMAD: return \"ftmad\";\n\t\tcase ARM64_FTSMUL: return \"ftsmul\";\n\t\tcase ARM64_FTSSEL: return \"ftssel\";\n\t\tcase ARM64_GMI: return \"gmi\";\n\t\tcase ARM64_HINT: return \"hint\";\n\t\tcase ARM64_HISTCNT: return \"histcnt\";\n\t\tcase ARM64_HISTSEG: return \"histseg\";\n\t\tcase ARM64_HLT: return \"hlt\";\n\t\tcase ARM64_HVC: return \"hvc\";\n\t\tcase ARM64_IC: return \"ic\";\n\t\tcase ARM64_INCB: return \"incb\";\n\t\tcase ARM64_INCD: return \"incd\";\n\t\tcase ARM64_INCH: return \"inch\";\n\t\tcase ARM64_INCP: return \"incp\";\n\t\tcase ARM64_INCW: return \"incw\";\n\t\tcase ARM64_INDEX: return \"index\";\n\t\tcase ARM64_INS: return \"ins\";\n\t\tcase ARM64_INSR: return \"insr\";\n\t\tcase ARM64_IRG: return \"irg\";\n\t\tcase ARM64_ISB: return \"isb\";\n\t\tcase ARM64_LASTA: return \"lasta\";\n\t\tcase ARM64_LASTB: return \"lastb\";\n\t\tcase ARM64_LD1: return \"ld1\";\n\t\tcase ARM64_LD1B: return \"ld1b\";\n\t\tcase ARM64_LD1D: return \"ld1d\";\n\t\tcase ARM64_LD1H: return \"ld1h\";\n\t\tcase ARM64_LD1Q: return \"ld1q\";\n\t\tcase ARM64_LD1R: return \"ld1r\";\n\t\tcase ARM64_LD1RB: return \"ld1rb\";\n\t\tcase ARM64_LD1RD: return \"ld1rd\";\n\t\tcase ARM64_LD1RH: return \"ld1rh\";\n\t\tcase ARM64_LD1ROB: return \"ld1rob\";\n\t\tcase ARM64_LD1ROD: return \"ld1rod\";\n\t\tcase ARM64_LD1ROH: return \"ld1roh\";\n\t\tcase ARM64_LD1ROW: return \"ld1row\";\n\t\tcase ARM64_LD1RQB: return \"ld1rqb\";\n\t\tcase ARM64_LD1RQD: return \"ld1rqd\";\n\t\tcase ARM64_LD1RQH: return \"ld1rqh\";\n\t\tcase ARM64_LD1RQW: return \"ld1rqw\";\n\t\tcase ARM64_LD1RSB: return \"ld1rsb\";\n\t\tcase ARM64_LD1RSH: return \"ld1rsh\";\n\t\tcase ARM64_LD1RSW: return \"ld1rsw\";\n\t\tcase ARM64_LD1RW: return \"ld1rw\";\n\t\tcase ARM64_LD1SB: return \"ld1sb\";\n\t\tcase ARM64_LD1SH: return \"ld1sh\";\n\t\tcase ARM64_LD1SW: return \"ld1sw\";\n\t\tcase ARM64_LD1W: return \"ld1w\";\n\t\tcase ARM64_LD2: return \"ld2\";\n\t\tcase ARM64_LD2B: return \"ld2b\";\n\t\tcase ARM64_LD2D: return \"ld2d\";\n\t\tcase ARM64_LD2H: return \"ld2h\";\n\t\tcase ARM64_LD2R: return \"ld2r\";\n\t\tcase ARM64_LD2W: return \"ld2w\";\n\t\tcase ARM64_LD3: return \"ld3\";\n\t\tcase ARM64_LD3B: return \"ld3b\";\n\t\tcase ARM64_LD3D: return \"ld3d\";\n\t\tcase ARM64_LD3H: return \"ld3h\";\n\t\tcase ARM64_LD3R: return \"ld3r\";\n\t\tcase ARM64_LD3W: return \"ld3w\";\n\t\tcase ARM64_LD4: return \"ld4\";\n\t\tcase ARM64_LD4B: return \"ld4b\";\n\t\tcase ARM64_LD4D: return \"ld4d\";\n\t\tcase ARM64_LD4H: return \"ld4h\";\n\t\tcase ARM64_LD4R: return \"ld4r\";\n\t\tcase ARM64_LD4W: return \"ld4w\";\n\t\tcase ARM64_LD64B: return \"ld64b\";\n\t\tcase ARM64_LDADD: return \"ldadd\";\n\t\tcase ARM64_LDADDA: return \"ldadda\";\n\t\tcase ARM64_LDADDAB: return \"ldaddab\";\n\t\tcase ARM64_LDADDAH: return \"ldaddah\";\n\t\tcase ARM64_LDADDAL: return \"ldaddal\";\n\t\tcase ARM64_LDADDALB: return \"ldaddalb\";\n\t\tcase ARM64_LDADDALH: return \"ldaddalh\";\n\t\tcase ARM64_LDADDB: return \"ldaddb\";\n\t\tcase ARM64_LDADDH: return \"ldaddh\";\n\t\tcase ARM64_LDADDL: return \"ldaddl\";\n\t\tcase ARM64_LDADDLB: return \"ldaddlb\";\n\t\tcase ARM64_LDADDLH: return \"ldaddlh\";\n\t\tcase ARM64_LDAPR: return \"ldapr\";\n\t\tcase ARM64_LDAPRB: return \"ldaprb\";\n\t\tcase ARM64_LDAPRH: return \"ldaprh\";\n\t\tcase ARM64_LDAPUR: return \"ldapur\";\n\t\tcase ARM64_LDAPURB: return \"ldapurb\";\n\t\tcase ARM64_LDAPURH: return \"ldapurh\";\n\t\tcase ARM64_LDAPURSB: return \"ldapursb\";\n\t\tcase ARM64_LDAPURSH: return \"ldapursh\";\n\t\tcase ARM64_LDAPURSW: return \"ldapursw\";\n\t\tcase ARM64_LDAR: return \"ldar\";\n\t\tcase ARM64_LDARB: return \"ldarb\";\n\t\tcase ARM64_LDARH: return \"ldarh\";\n\t\tcase ARM64_LDAXP: return \"ldaxp\";\n\t\tcase ARM64_LDAXR: return \"ldaxr\";\n\t\tcase ARM64_LDAXRB: return \"ldaxrb\";\n\t\tcase ARM64_LDAXRH: return \"ldaxrh\";\n\t\tcase ARM64_LDCLR: return \"ldclr\";\n\t\tcase ARM64_LDCLRA: return \"ldclra\";\n\t\tcase ARM64_LDCLRAB: return \"ldclrab\";\n\t\tcase ARM64_LDCLRAH: return \"ldclrah\";\n\t\tcase ARM64_LDCLRAL: return \"ldclral\";\n\t\tcase ARM64_LDCLRALB: return \"ldclralb\";\n\t\tcase ARM64_LDCLRALH: return \"ldclralh\";\n\t\tcase ARM64_LDCLRB: return \"ldclrb\";\n\t\tcase ARM64_LDCLRH: return \"ldclrh\";\n\t\tcase ARM64_LDCLRL: return \"ldclrl\";\n\t\tcase ARM64_LDCLRLB: return \"ldclrlb\";\n\t\tcase ARM64_LDCLRLH: return \"ldclrlh\";\n\t\tcase ARM64_LDEOR: return \"ldeor\";\n\t\tcase ARM64_LDEORA: return \"ldeora\";\n\t\tcase ARM64_LDEORAB: return \"ldeorab\";\n\t\tcase ARM64_LDEORAH: return \"ldeorah\";\n\t\tcase ARM64_LDEORAL: return \"ldeoral\";\n\t\tcase ARM64_LDEORALB: return \"ldeoralb\";\n\t\tcase ARM64_LDEORALH: return \"ldeoralh\";\n\t\tcase ARM64_LDEORB: return \"ldeorb\";\n\t\tcase ARM64_LDEORH: return \"ldeorh\";\n\t\tcase ARM64_LDEORL: return \"ldeorl\";\n\t\tcase ARM64_LDEORLB: return \"ldeorlb\";\n\t\tcase ARM64_LDEORLH: return \"ldeorlh\";\n\t\tcase ARM64_LDFF1B: return \"ldff1b\";\n\t\tcase ARM64_LDFF1D: return \"ldff1d\";\n\t\tcase ARM64_LDFF1H: return \"ldff1h\";\n\t\tcase ARM64_LDFF1SB: return \"ldff1sb\";\n\t\tcase ARM64_LDFF1SH: return \"ldff1sh\";\n\t\tcase ARM64_LDFF1SW: return \"ldff1sw\";\n\t\tcase ARM64_LDFF1W: return \"ldff1w\";\n\t\tcase ARM64_LDG: return \"ldg\";\n\t\tcase ARM64_LDGM: return \"ldgm\";\n\t\tcase ARM64_LDLAR: return \"ldlar\";\n\t\tcase ARM64_LDLARB: return \"ldlarb\";\n\t\tcase ARM64_LDLARH: return \"ldlarh\";\n\t\tcase ARM64_LDNF1B: return \"ldnf1b\";\n\t\tcase ARM64_LDNF1D: return \"ldnf1d\";\n\t\tcase ARM64_LDNF1H: return \"ldnf1h\";\n\t\tcase ARM64_LDNF1SB: return \"ldnf1sb\";\n\t\tcase ARM64_LDNF1SH: return \"ldnf1sh\";\n\t\tcase ARM64_LDNF1SW: return \"ldnf1sw\";\n\t\tcase ARM64_LDNF1W: return \"ldnf1w\";\n\t\tcase ARM64_LDNP: return \"ldnp\";\n\t\tcase ARM64_LDNT1B: return \"ldnt1b\";\n\t\tcase ARM64_LDNT1D: return \"ldnt1d\";\n\t\tcase ARM64_LDNT1H: return \"ldnt1h\";\n\t\tcase ARM64_LDNT1SB: return \"ldnt1sb\";\n\t\tcase ARM64_LDNT1SH: return \"ldnt1sh\";\n\t\tcase ARM64_LDNT1SW: return \"ldnt1sw\";\n\t\tcase ARM64_LDNT1W: return \"ldnt1w\";\n\t\tcase ARM64_LDP: return \"ldp\";\n\t\tcase ARM64_LDPSW: return \"ldpsw\";\n\t\tcase ARM64_LDR: return \"ldr\";\n\t\tcase ARM64_LDRAA: return \"ldraa\";\n\t\tcase ARM64_LDRAB: return \"ldrab\";\n\t\tcase ARM64_LDRB: return \"ldrb\";\n\t\tcase ARM64_LDRH: return \"ldrh\";\n\t\tcase ARM64_LDRSB: return \"ldrsb\";\n\t\tcase ARM64_LDRSH: return \"ldrsh\";\n\t\tcase ARM64_LDRSW: return \"ldrsw\";\n\t\tcase ARM64_LDSET: return \"ldset\";\n\t\tcase ARM64_LDSETA: return \"ldseta\";\n\t\tcase ARM64_LDSETAB: return \"ldsetab\";\n\t\tcase ARM64_LDSETAH: return \"ldsetah\";\n\t\tcase ARM64_LDSETAL: return \"ldsetal\";\n\t\tcase ARM64_LDSETALB: return \"ldsetalb\";\n\t\tcase ARM64_LDSETALH: return \"ldsetalh\";\n\t\tcase ARM64_LDSETB: return \"ldsetb\";\n\t\tcase ARM64_LDSETH: return \"ldseth\";\n\t\tcase ARM64_LDSETL: return \"ldsetl\";\n\t\tcase ARM64_LDSETLB: return \"ldsetlb\";\n\t\tcase ARM64_LDSETLH: return \"ldsetlh\";\n\t\tcase ARM64_LDSMAX: return \"ldsmax\";\n\t\tcase ARM64_LDSMAXA: return \"ldsmaxa\";\n\t\tcase ARM64_LDSMAXAB: return \"ldsmaxab\";\n\t\tcase ARM64_LDSMAXAH: return \"ldsmaxah\";\n\t\tcase ARM64_LDSMAXAL: return \"ldsmaxal\";\n\t\tcase ARM64_LDSMAXALB: return \"ldsmaxalb\";\n\t\tcase ARM64_LDSMAXALH: return \"ldsmaxalh\";\n\t\tcase ARM64_LDSMAXB: return \"ldsmaxb\";\n\t\tcase ARM64_LDSMAXH: return \"ldsmaxh\";\n\t\tcase ARM64_LDSMAXL: return \"ldsmaxl\";\n\t\tcase ARM64_LDSMAXLB: return \"ldsmaxlb\";\n\t\tcase ARM64_LDSMAXLH: return \"ldsmaxlh\";\n\t\tcase ARM64_LDSMIN: return \"ldsmin\";\n\t\tcase ARM64_LDSMINA: return \"ldsmina\";\n\t\tcase ARM64_LDSMINAB: return \"ldsminab\";\n\t\tcase ARM64_LDSMINAH: return \"ldsminah\";\n\t\tcase ARM64_LDSMINAL: return \"ldsminal\";\n\t\tcase ARM64_LDSMINALB: return \"ldsminalb\";\n\t\tcase ARM64_LDSMINALH: return \"ldsminalh\";\n\t\tcase ARM64_LDSMINB: return \"ldsminb\";\n\t\tcase ARM64_LDSMINH: return \"ldsminh\";\n\t\tcase ARM64_LDSMINL: return \"ldsminl\";\n\t\tcase ARM64_LDSMINLB: return \"ldsminlb\";\n\t\tcase ARM64_LDSMINLH: return \"ldsminlh\";\n\t\tcase ARM64_LDTR: return \"ldtr\";\n\t\tcase ARM64_LDTRB: return \"ldtrb\";\n\t\tcase ARM64_LDTRH: return \"ldtrh\";\n\t\tcase ARM64_LDTRSB: return \"ldtrsb\";\n\t\tcase ARM64_LDTRSH: return \"ldtrsh\";\n\t\tcase ARM64_LDTRSW: return \"ldtrsw\";\n\t\tcase ARM64_LDUMAX: return \"ldumax\";\n\t\tcase ARM64_LDUMAXA: return \"ldumaxa\";\n\t\tcase ARM64_LDUMAXAB: return \"ldumaxab\";\n\t\tcase ARM64_LDUMAXAH: return \"ldumaxah\";\n\t\tcase ARM64_LDUMAXAL: return \"ldumaxal\";\n\t\tcase ARM64_LDUMAXALB: return \"ldumaxalb\";\n\t\tcase ARM64_LDUMAXALH: return \"ldumaxalh\";\n\t\tcase ARM64_LDUMAXB: return \"ldumaxb\";\n\t\tcase ARM64_LDUMAXH: return \"ldumaxh\";\n\t\tcase ARM64_LDUMAXL: return \"ldumaxl\";\n\t\tcase ARM64_LDUMAXLB: return \"ldumaxlb\";\n\t\tcase ARM64_LDUMAXLH: return \"ldumaxlh\";\n\t\tcase ARM64_LDUMIN: return \"ldumin\";\n\t\tcase ARM64_LDUMINA: return \"ldumina\";\n\t\tcase ARM64_LDUMINAB: return \"lduminab\";\n\t\tcase ARM64_LDUMINAH: return \"lduminah\";\n\t\tcase ARM64_LDUMINAL: return \"lduminal\";\n\t\tcase ARM64_LDUMINALB: return \"lduminalb\";\n\t\tcase ARM64_LDUMINALH: return \"lduminalh\";\n\t\tcase ARM64_LDUMINB: return \"lduminb\";\n\t\tcase ARM64_LDUMINH: return \"lduminh\";\n\t\tcase ARM64_LDUMINL: return \"lduminl\";\n\t\tcase ARM64_LDUMINLB: return \"lduminlb\";\n\t\tcase ARM64_LDUMINLH: return \"lduminlh\";\n\t\tcase ARM64_LDUR: return \"ldur\";\n\t\tcase ARM64_LDURB: return \"ldurb\";\n\t\tcase ARM64_LDURH: return \"ldurh\";\n\t\tcase ARM64_LDURSB: return \"ldursb\";\n\t\tcase ARM64_LDURSH: return \"ldursh\";\n\t\tcase ARM64_LDURSW: return \"ldursw\";\n\t\tcase ARM64_LDXP: return \"ldxp\";\n\t\tcase ARM64_LDXR: return \"ldxr\";\n\t\tcase ARM64_LDXRB: return \"ldxrb\";\n\t\tcase ARM64_LDXRH: return \"ldxrh\";\n\t\tcase ARM64_LSL: return \"lsl\";\n\t\tcase ARM64_LSLR: return \"lslr\";\n\t\tcase ARM64_LSLV: return \"lslv\";\n\t\tcase ARM64_LSR: return \"lsr\";\n\t\tcase ARM64_LSRR: return \"lsrr\";\n\t\tcase ARM64_LSRV: return \"lsrv\";\n\t\tcase ARM64_MAD: return \"mad\";\n\t\tcase ARM64_MADD: return \"madd\";\n\t\tcase ARM64_MATCH: return \"match\";\n\t\tcase ARM64_MLA: return \"mla\";\n\t\tcase ARM64_MLS: return \"mls\";\n\t\tcase ARM64_MNEG: return \"mneg\";\n\t\tcase ARM64_MOV: return \"mov\";\n\t\tcase ARM64_MOVA: return \"mova\";\n\t\tcase ARM64_MOVI: return \"movi\";\n\t\tcase ARM64_MOVK: return \"movk\";\n\t\tcase ARM64_MOVN: return \"movn\";\n\t\tcase ARM64_MOVPRFX: return \"movprfx\";\n\t\tcase ARM64_MOVS: return \"movs\";\n\t\tcase ARM64_MOVZ: return \"movz\";\n\t\tcase ARM64_MRS: return \"mrs\";\n\t\tcase ARM64_MSB: return \"msb\";\n\t\tcase ARM64_MSR: return \"msr\";\n\t\tcase ARM64_MSUB: return \"msub\";\n\t\tcase ARM64_MUL: return \"mul\";\n\t\tcase ARM64_MVN: return \"mvn\";\n\t\tcase ARM64_MVNI: return \"mvni\";\n\t\tcase ARM64_NAND: return \"nand\";\n\t\tcase ARM64_NANDS: return \"nands\";\n\t\tcase ARM64_NBSL: return \"nbsl\";\n\t\tcase ARM64_NEG: return \"neg\";\n\t\tcase ARM64_NEGS: return \"negs\";\n\t\tcase ARM64_NGC: return \"ngc\";\n\t\tcase ARM64_NGCS: return \"ngcs\";\n\t\tcase ARM64_NMATCH: return \"nmatch\";\n\t\tcase ARM64_NOP: return \"nop\";\n\t\tcase ARM64_NOR: return \"nor\";\n\t\tcase ARM64_NORS: return \"nors\";\n\t\tcase ARM64_NOT: return \"not\";\n\t\tcase ARM64_NOTS: return \"nots\";\n\t\tcase ARM64_ORN: return \"orn\";\n\t\tcase ARM64_ORNS: return \"orns\";\n\t\tcase ARM64_ORR: return \"orr\";\n\t\tcase ARM64_ORRS: return \"orrs\";\n\t\tcase ARM64_ORV: return \"orv\";\n\t\tcase ARM64_PACDA: return \"pacda\";\n\t\tcase ARM64_PACDB: return \"pacdb\";\n\t\tcase ARM64_PACDZA: return \"pacdza\";\n\t\tcase ARM64_PACDZB: return \"pacdzb\";\n\t\tcase ARM64_PACGA: return \"pacga\";\n\t\tcase ARM64_PACIA: return \"pacia\";\n\t\tcase ARM64_PACIA1716: return \"pacia1716\";\n\t\tcase ARM64_PACIASP: return \"paciasp\";\n\t\tcase ARM64_PACIAZ: return \"paciaz\";\n\t\tcase ARM64_PACIB: return \"pacib\";\n\t\tcase ARM64_PACIB1716: return \"pacib1716\";\n\t\tcase ARM64_PACIBSP: return \"pacibsp\";\n\t\tcase ARM64_PACIBZ: return \"pacibz\";\n\t\tcase ARM64_PACIZA: return \"paciza\";\n\t\tcase ARM64_PACIZB: return \"pacizb\";\n\t\tcase ARM64_PFALSE: return \"pfalse\";\n\t\tcase ARM64_PFIRST: return \"pfirst\";\n\t\tcase ARM64_PMUL: return \"pmul\";\n\t\tcase ARM64_PMULL: return \"pmull\";\n\t\tcase ARM64_PMULL2: return \"pmull2\";\n\t\tcase ARM64_PMULLB: return \"pmullb\";\n\t\tcase ARM64_PMULLT: return \"pmullt\";\n\t\tcase ARM64_PNEXT: return \"pnext\";\n\t\tcase ARM64_PRFB: return \"prfb\";\n\t\tcase ARM64_PRFD: return \"prfd\";\n\t\tcase ARM64_PRFH: return \"prfh\";\n\t\tcase ARM64_PRFM: return \"prfm\";\n\t\tcase ARM64_PRFUM: return \"prfum\";\n\t\tcase ARM64_PRFW: return \"prfw\";\n\t\tcase ARM64_PSB: return \"psb\";\n\t\tcase ARM64_PSSBB: return \"pssbb\";\n\t\tcase ARM64_PTEST: return \"ptest\";\n\t\tcase ARM64_PTRUE: return \"ptrue\";\n\t\tcase ARM64_PTRUES: return \"ptrues\";\n\t\tcase ARM64_PUNPKHI: return \"punpkhi\";\n\t\tcase ARM64_PUNPKLO: return \"punpklo\";\n\t\tcase ARM64_RADDHN: return \"raddhn\";\n\t\tcase ARM64_RADDHN2: return \"raddhn2\";\n\t\tcase ARM64_RADDHNB: return \"raddhnb\";\n\t\tcase ARM64_RADDHNT: return \"raddhnt\";\n\t\tcase ARM64_RAX1: return \"rax1\";\n\t\tcase ARM64_RBIT: return \"rbit\";\n\t\tcase ARM64_RDFFR: return \"rdffr\";\n\t\tcase ARM64_RDFFRS: return \"rdffrs\";\n\t\tcase ARM64_RDVL: return \"rdvl\";\n\t\tcase ARM64_RET: return \"ret\";\n\t\tcase ARM64_RETAA: return \"retaa\";\n\t\tcase ARM64_RETAB: return \"retab\";\n\t\tcase ARM64_REV: return \"rev\";\n\t\tcase ARM64_REV16: return \"rev16\";\n\t\tcase ARM64_REV32: return \"rev32\";\n\t\tcase ARM64_REV64: return \"rev64\";\n\t\tcase ARM64_REVB: return \"revb\";\n\t\tcase ARM64_REVD: return \"revd\";\n\t\tcase ARM64_REVH: return \"revh\";\n\t\tcase ARM64_REVW: return \"revw\";\n\t\tcase ARM64_RMIF: return \"rmif\";\n\t\tcase ARM64_ROR: return \"ror\";\n\t\tcase ARM64_RORV: return \"rorv\";\n\t\tcase ARM64_RSHRN: return \"rshrn\";\n\t\tcase ARM64_RSHRN2: return \"rshrn2\";\n\t\tcase ARM64_RSHRNB: return \"rshrnb\";\n\t\tcase ARM64_RSHRNT: return \"rshrnt\";\n\t\tcase ARM64_RSUBHN: return \"rsubhn\";\n\t\tcase ARM64_RSUBHN2: return \"rsubhn2\";\n\t\tcase ARM64_RSUBHNB: return \"rsubhnb\";\n\t\tcase ARM64_RSUBHNT: return \"rsubhnt\";\n\t\tcase ARM64_SABA: return \"saba\";\n\t\tcase ARM64_SABAL: return \"sabal\";\n\t\tcase ARM64_SABAL2: return \"sabal2\";\n\t\tcase ARM64_SABALB: return \"sabalb\";\n\t\tcase ARM64_SABALT: return \"sabalt\";\n\t\tcase ARM64_SABD: return \"sabd\";\n\t\tcase ARM64_SABDL: return \"sabdl\";\n\t\tcase ARM64_SABDL2: return \"sabdl2\";\n\t\tcase ARM64_SABDLB: return \"sabdlb\";\n\t\tcase ARM64_SABDLT: return \"sabdlt\";\n\t\tcase ARM64_SADALP: return \"sadalp\";\n\t\tcase ARM64_SADDL: return \"saddl\";\n\t\tcase ARM64_SADDL2: return \"saddl2\";\n\t\tcase ARM64_SADDLB: return \"saddlb\";\n\t\tcase ARM64_SADDLBT: return \"saddlbt\";\n\t\tcase ARM64_SADDLP: return \"saddlp\";\n\t\tcase ARM64_SADDLT: return \"saddlt\";\n\t\tcase ARM64_SADDLV: return \"saddlv\";\n\t\tcase ARM64_SADDV: return \"saddv\";\n\t\tcase ARM64_SADDW: return \"saddw\";\n\t\tcase ARM64_SADDW2: return \"saddw2\";\n\t\tcase ARM64_SADDWB: return \"saddwb\";\n\t\tcase ARM64_SADDWT: return \"saddwt\";\n\t\tcase ARM64_SB: return \"sb\";\n\t\tcase ARM64_SBC: return \"sbc\";\n\t\tcase ARM64_SBCLB: return \"sbclb\";\n\t\tcase ARM64_SBCLT: return \"sbclt\";\n\t\tcase ARM64_SBCS: return \"sbcs\";\n\t\tcase ARM64_SBFIZ: return \"sbfiz\";\n\t\tcase ARM64_SBFM: return \"sbfm\";\n\t\tcase ARM64_SBFX: return \"sbfx\";\n\t\tcase ARM64_SCLAMP: return \"sclamp\";\n\t\tcase ARM64_SCVTF: return \"scvtf\";\n\t\tcase ARM64_SDIV: return \"sdiv\";\n\t\tcase ARM64_SDIVR: return \"sdivr\";\n\t\tcase ARM64_SDOT: return \"sdot\";\n\t\tcase ARM64_SEL: return \"sel\";\n\t\tcase ARM64_SETF16: return \"setf16\";\n\t\tcase ARM64_SETF8: return \"setf8\";\n\t\tcase ARM64_SETFFR: return \"setffr\";\n\t\tcase ARM64_SEV: return \"sev\";\n\t\tcase ARM64_SEVL: return \"sevl\";\n\t\tcase ARM64_SHA1C: return \"sha1c\";\n\t\tcase ARM64_SHA1H: return \"sha1h\";\n\t\tcase ARM64_SHA1M: return \"sha1m\";\n\t\tcase ARM64_SHA1P: return \"sha1p\";\n\t\tcase ARM64_SHA1SU0: return \"sha1su0\";\n\t\tcase ARM64_SHA1SU1: return \"sha1su1\";\n\t\tcase ARM64_SHA256H: return \"sha256h\";\n\t\tcase ARM64_SHA256H2: return \"sha256h2\";\n\t\tcase ARM64_SHA256SU0: return \"sha256su0\";\n\t\tcase ARM64_SHA256SU1: return \"sha256su1\";\n\t\tcase ARM64_SHA512H: return \"sha512h\";\n\t\tcase ARM64_SHA512H2: return \"sha512h2\";\n\t\tcase ARM64_SHA512SU0: return \"sha512su0\";\n\t\tcase ARM64_SHA512SU1: return \"sha512su1\";\n\t\tcase ARM64_SHADD: return \"shadd\";\n\t\tcase ARM64_SHL: return \"shl\";\n\t\tcase ARM64_SHLL: return \"shll\";\n\t\tcase ARM64_SHLL2: return \"shll2\";\n\t\tcase ARM64_SHRN: return \"shrn\";\n\t\tcase ARM64_SHRN2: return \"shrn2\";\n\t\tcase ARM64_SHRNB: return \"shrnb\";\n\t\tcase ARM64_SHRNT: return \"shrnt\";\n\t\tcase ARM64_SHSUB: return \"shsub\";\n\t\tcase ARM64_SHSUBR: return \"shsubr\";\n\t\tcase ARM64_SLI: return \"sli\";\n\t\tcase ARM64_SM3PARTW1: return \"sm3partw1\";\n\t\tcase ARM64_SM3PARTW2: return \"sm3partw2\";\n\t\tcase ARM64_SM3SS1: return \"sm3ss1\";\n\t\tcase ARM64_SM3TT1A: return \"sm3tt1a\";\n\t\tcase ARM64_SM3TT1B: return \"sm3tt1b\";\n\t\tcase ARM64_SM3TT2A: return \"sm3tt2a\";\n\t\tcase ARM64_SM3TT2B: return \"sm3tt2b\";\n\t\tcase ARM64_SM4E: return \"sm4e\";\n\t\tcase ARM64_SM4EKEY: return \"sm4ekey\";\n\t\tcase ARM64_SMADDL: return \"smaddl\";\n\t\tcase ARM64_SMAX: return \"smax\";\n\t\tcase ARM64_SMAXP: return \"smaxp\";\n\t\tcase ARM64_SMAXV: return \"smaxv\";\n\t\tcase ARM64_SMC: return \"smc\";\n\t\tcase ARM64_SMIN: return \"smin\";\n\t\tcase ARM64_SMINP: return \"sminp\";\n\t\tcase ARM64_SMINV: return \"sminv\";\n\t\tcase ARM64_SMLAL: return \"smlal\";\n\t\tcase ARM64_SMLAL2: return \"smlal2\";\n\t\tcase ARM64_SMLALB: return \"smlalb\";\n\t\tcase ARM64_SMLALT: return \"smlalt\";\n\t\tcase ARM64_SMLSL: return \"smlsl\";\n\t\tcase ARM64_SMLSL2: return \"smlsl2\";\n\t\tcase ARM64_SMLSLB: return \"smlslb\";\n\t\tcase ARM64_SMLSLT: return \"smlslt\";\n\t\tcase ARM64_SMMLA: return \"smmla\";\n\t\tcase ARM64_SMNEGL: return \"smnegl\";\n\t\tcase ARM64_SMOPA: return \"smopa\";\n\t\tcase ARM64_SMOPS: return \"smops\";\n\t\tcase ARM64_SMOV: return \"smov\";\n\t\tcase ARM64_SMSTART: return \"smstart\";\n\t\tcase ARM64_SMSTOP: return \"smstop\";\n\t\tcase ARM64_SMSUBL: return \"smsubl\";\n\t\tcase ARM64_SMULH: return \"smulh\";\n\t\tcase ARM64_SMULL: return \"smull\";\n\t\tcase ARM64_SMULL2: return \"smull2\";\n\t\tcase ARM64_SMULLB: return \"smullb\";\n\t\tcase ARM64_SMULLT: return \"smullt\";\n\t\tcase ARM64_SPLICE: return \"splice\";\n\t\tcase ARM64_SQABS: return \"sqabs\";\n\t\tcase ARM64_SQADD: return \"sqadd\";\n\t\tcase ARM64_SQCADD: return \"sqcadd\";\n\t\tcase ARM64_SQDECB: return \"sqdecb\";\n\t\tcase ARM64_SQDECD: return \"sqdecd\";\n\t\tcase ARM64_SQDECH: return \"sqdech\";\n\t\tcase ARM64_SQDECP: return \"sqdecp\";\n\t\tcase ARM64_SQDECW: return \"sqdecw\";\n\t\tcase ARM64_SQDMLAL: return \"sqdmlal\";\n\t\tcase ARM64_SQDMLAL2: return \"sqdmlal2\";\n\t\tcase ARM64_SQDMLALB: return \"sqdmlalb\";\n\t\tcase ARM64_SQDMLALBT: return \"sqdmlalbt\";\n\t\tcase ARM64_SQDMLALT: return \"sqdmlalt\";\n\t\tcase ARM64_SQDMLSL: return \"sqdmlsl\";\n\t\tcase ARM64_SQDMLSL2: return \"sqdmlsl2\";\n\t\tcase ARM64_SQDMLSLB: return \"sqdmlslb\";\n\t\tcase ARM64_SQDMLSLBT: return \"sqdmlslbt\";\n\t\tcase ARM64_SQDMLSLT: return \"sqdmlslt\";\n\t\tcase ARM64_SQDMULH: return \"sqdmulh\";\n\t\tcase ARM64_SQDMULL: return \"sqdmull\";\n\t\tcase ARM64_SQDMULL2: return \"sqdmull2\";\n\t\tcase ARM64_SQDMULLB: return \"sqdmullb\";\n\t\tcase ARM64_SQDMULLT: return \"sqdmullt\";\n\t\tcase ARM64_SQINCB: return \"sqincb\";\n\t\tcase ARM64_SQINCD: return \"sqincd\";\n\t\tcase ARM64_SQINCH: return \"sqinch\";\n\t\tcase ARM64_SQINCP: return \"sqincp\";\n\t\tcase ARM64_SQINCW: return \"sqincw\";\n\t\tcase ARM64_SQNEG: return \"sqneg\";\n\t\tcase ARM64_SQRDCMLAH: return \"sqrdcmlah\";\n\t\tcase ARM64_SQRDMLAH: return \"sqrdmlah\";\n\t\tcase ARM64_SQRDMLSH: return \"sqrdmlsh\";\n\t\tcase ARM64_SQRDMULH: return \"sqrdmulh\";\n\t\tcase ARM64_SQRSHL: return \"sqrshl\";\n\t\tcase ARM64_SQRSHLR: return \"sqrshlr\";\n\t\tcase ARM64_SQRSHRN: return \"sqrshrn\";\n\t\tcase ARM64_SQRSHRN2: return \"sqrshrn2\";\n\t\tcase ARM64_SQRSHRNB: return \"sqrshrnb\";\n\t\tcase ARM64_SQRSHRNT: return \"sqrshrnt\";\n\t\tcase ARM64_SQRSHRUN: return \"sqrshrun\";\n\t\tcase ARM64_SQRSHRUN2: return \"sqrshrun2\";\n\t\tcase ARM64_SQRSHRUNB: return \"sqrshrunb\";\n\t\tcase ARM64_SQRSHRUNT: return \"sqrshrunt\";\n\t\tcase ARM64_SQSHL: return \"sqshl\";\n\t\tcase ARM64_SQSHLR: return \"sqshlr\";\n\t\tcase ARM64_SQSHLU: return \"sqshlu\";\n\t\tcase ARM64_SQSHRN: return \"sqshrn\";\n\t\tcase ARM64_SQSHRN2: return \"sqshrn2\";\n\t\tcase ARM64_SQSHRNB: return \"sqshrnb\";\n\t\tcase ARM64_SQSHRNT: return \"sqshrnt\";\n\t\tcase ARM64_SQSHRUN: return \"sqshrun\";\n\t\tcase ARM64_SQSHRUN2: return \"sqshrun2\";\n\t\tcase ARM64_SQSHRUNB: return \"sqshrunb\";\n\t\tcase ARM64_SQSHRUNT: return \"sqshrunt\";\n\t\tcase ARM64_SQSUB: return \"sqsub\";\n\t\tcase ARM64_SQSUBR: return \"sqsubr\";\n\t\tcase ARM64_SQXTN: return \"sqxtn\";\n\t\tcase ARM64_SQXTN2: return \"sqxtn2\";\n\t\tcase ARM64_SQXTNB: return \"sqxtnb\";\n\t\tcase ARM64_SQXTNT: return \"sqxtnt\";\n\t\tcase ARM64_SQXTUN: return \"sqxtun\";\n\t\tcase ARM64_SQXTUN2: return \"sqxtun2\";\n\t\tcase ARM64_SQXTUNB: return \"sqxtunb\";\n\t\tcase ARM64_SQXTUNT: return \"sqxtunt\";\n\t\tcase ARM64_SRHADD: return \"srhadd\";\n\t\tcase ARM64_SRI: return \"sri\";\n\t\tcase ARM64_SRSHL: return \"srshl\";\n\t\tcase ARM64_SRSHLR: return \"srshlr\";\n\t\tcase ARM64_SRSHR: return \"srshr\";\n\t\tcase ARM64_SRSRA: return \"srsra\";\n\t\tcase ARM64_SSBB: return \"ssbb\";\n\t\tcase ARM64_SSHL: return \"sshl\";\n\t\tcase ARM64_SSHLL: return \"sshll\";\n\t\tcase ARM64_SSHLL2: return \"sshll2\";\n\t\tcase ARM64_SSHLLB: return \"sshllb\";\n\t\tcase ARM64_SSHLLT: return \"sshllt\";\n\t\tcase ARM64_SSHR: return \"sshr\";\n\t\tcase ARM64_SSRA: return \"ssra\";\n\t\tcase ARM64_SSUBL: return \"ssubl\";\n\t\tcase ARM64_SSUBL2: return \"ssubl2\";\n\t\tcase ARM64_SSUBLB: return \"ssublb\";\n\t\tcase ARM64_SSUBLBT: return \"ssublbt\";\n\t\tcase ARM64_SSUBLT: return \"ssublt\";\n\t\tcase ARM64_SSUBLTB: return \"ssubltb\";\n\t\tcase ARM64_SSUBW: return \"ssubw\";\n\t\tcase ARM64_SSUBW2: return \"ssubw2\";\n\t\tcase ARM64_SSUBWB: return \"ssubwb\";\n\t\tcase ARM64_SSUBWT: return \"ssubwt\";\n\t\tcase ARM64_ST1: return \"st1\";\n\t\tcase ARM64_ST1B: return \"st1b\";\n\t\tcase ARM64_ST1D: return \"st1d\";\n\t\tcase ARM64_ST1H: return \"st1h\";\n\t\tcase ARM64_ST1Q: return \"st1q\";\n\t\tcase ARM64_ST1W: return \"st1w\";\n\t\tcase ARM64_ST2: return \"st2\";\n\t\tcase ARM64_ST2B: return \"st2b\";\n\t\tcase ARM64_ST2D: return \"st2d\";\n\t\tcase ARM64_ST2G: return \"st2g\";\n\t\tcase ARM64_ST2H: return \"st2h\";\n\t\tcase ARM64_ST2W: return \"st2w\";\n\t\tcase ARM64_ST3: return \"st3\";\n\t\tcase ARM64_ST3B: return \"st3b\";\n\t\tcase ARM64_ST3D: return \"st3d\";\n\t\tcase ARM64_ST3H: return \"st3h\";\n\t\tcase ARM64_ST3W: return \"st3w\";\n\t\tcase ARM64_ST4: return \"st4\";\n\t\tcase ARM64_ST4B: return \"st4b\";\n\t\tcase ARM64_ST4D: return \"st4d\";\n\t\tcase ARM64_ST4H: return \"st4h\";\n\t\tcase ARM64_ST4W: return \"st4w\";\n\t\tcase ARM64_ST64B: return \"st64b\";\n\t\tcase ARM64_ST64BV: return \"st64bv\";\n\t\tcase ARM64_ST64BV0: return \"st64bv0\";\n\t\tcase ARM64_STADD: return \"stadd\";\n\t\tcase ARM64_STADDB: return \"staddb\";\n\t\tcase ARM64_STADDH: return \"staddh\";\n\t\tcase ARM64_STADDL: return \"staddl\";\n\t\tcase ARM64_STADDLB: return \"staddlb\";\n\t\tcase ARM64_STADDLH: return \"staddlh\";\n\t\tcase ARM64_STCLR: return \"stclr\";\n\t\tcase ARM64_STCLRB: return \"stclrb\";\n\t\tcase ARM64_STCLRH: return \"stclrh\";\n\t\tcase ARM64_STCLRL: return \"stclrl\";\n\t\tcase ARM64_STCLRLB: return \"stclrlb\";\n\t\tcase ARM64_STCLRLH: return \"stclrlh\";\n\t\tcase ARM64_STEOR: return \"steor\";\n\t\tcase ARM64_STEORB: return \"steorb\";\n\t\tcase ARM64_STEORH: return \"steorh\";\n\t\tcase ARM64_STEORL: return \"steorl\";\n\t\tcase ARM64_STEORLB: return \"steorlb\";\n\t\tcase ARM64_STEORLH: return \"steorlh\";\n\t\tcase ARM64_STG: return \"stg\";\n\t\tcase ARM64_STGM: return \"stgm\";\n\t\tcase ARM64_STGP: return \"stgp\";\n\t\tcase ARM64_STLLR: return \"stllr\";\n\t\tcase ARM64_STLLRB: return \"stllrb\";\n\t\tcase ARM64_STLLRH: return \"stllrh\";\n\t\tcase ARM64_STLR: return \"stlr\";\n\t\tcase ARM64_STLRB: return \"stlrb\";\n\t\tcase ARM64_STLRH: return \"stlrh\";\n\t\tcase ARM64_STLUR: return \"stlur\";\n\t\tcase ARM64_STLURB: return \"stlurb\";\n\t\tcase ARM64_STLURH: return \"stlurh\";\n\t\tcase ARM64_STLXP: return \"stlxp\";\n\t\tcase ARM64_STLXR: return \"stlxr\";\n\t\tcase ARM64_STLXRB: return \"stlxrb\";\n\t\tcase ARM64_STLXRH: return \"stlxrh\";\n\t\tcase ARM64_STNP: return \"stnp\";\n\t\tcase ARM64_STNT1B: return \"stnt1b\";\n\t\tcase ARM64_STNT1D: return \"stnt1d\";\n\t\tcase ARM64_STNT1H: return \"stnt1h\";\n\t\tcase ARM64_STNT1W: return \"stnt1w\";\n\t\tcase ARM64_STP: return \"stp\";\n\t\tcase ARM64_STR: return \"str\";\n\t\tcase ARM64_STRB: return \"strb\";\n\t\tcase ARM64_STRH: return \"strh\";\n\t\tcase ARM64_STSET: return \"stset\";\n\t\tcase ARM64_STSETB: return \"stsetb\";\n\t\tcase ARM64_STSETH: return \"stseth\";\n\t\tcase ARM64_STSETL: return \"stsetl\";\n\t\tcase ARM64_STSETLB: return \"stsetlb\";\n\t\tcase ARM64_STSETLH: return \"stsetlh\";\n\t\tcase ARM64_STSMAX: return \"stsmax\";\n\t\tcase ARM64_STSMAXB: return \"stsmaxb\";\n\t\tcase ARM64_STSMAXH: return \"stsmaxh\";\n\t\tcase ARM64_STSMAXL: return \"stsmaxl\";\n\t\tcase ARM64_STSMAXLB: return \"stsmaxlb\";\n\t\tcase ARM64_STSMAXLH: return \"stsmaxlh\";\n\t\tcase ARM64_STSMIN: return \"stsmin\";\n\t\tcase ARM64_STSMINB: return \"stsminb\";\n\t\tcase ARM64_STSMINH: return \"stsminh\";\n\t\tcase ARM64_STSMINL: return \"stsminl\";\n\t\tcase ARM64_STSMINLB: return \"stsminlb\";\n\t\tcase ARM64_STSMINLH: return \"stsminlh\";\n\t\tcase ARM64_STTR: return \"sttr\";\n\t\tcase ARM64_STTRB: return \"sttrb\";\n\t\tcase ARM64_STTRH: return \"sttrh\";\n\t\tcase ARM64_STUMAX: return \"stumax\";\n\t\tcase ARM64_STUMAXB: return \"stumaxb\";\n\t\tcase ARM64_STUMAXH: return \"stumaxh\";\n\t\tcase ARM64_STUMAXL: return \"stumaxl\";\n\t\tcase ARM64_STUMAXLB: return \"stumaxlb\";\n\t\tcase ARM64_STUMAXLH: return \"stumaxlh\";\n\t\tcase ARM64_STUMIN: return \"stumin\";\n\t\tcase ARM64_STUMINB: return \"stuminb\";\n\t\tcase ARM64_STUMINH: return \"stuminh\";\n\t\tcase ARM64_STUMINL: return \"stuminl\";\n\t\tcase ARM64_STUMINLB: return \"stuminlb\";\n\t\tcase ARM64_STUMINLH: return \"stuminlh\";\n\t\tcase ARM64_STUR: return \"stur\";\n\t\tcase ARM64_STURB: return \"sturb\";\n\t\tcase ARM64_STURH: return \"sturh\";\n\t\tcase ARM64_STXP: return \"stxp\";\n\t\tcase ARM64_STXR: return \"stxr\";\n\t\tcase ARM64_STXRB: return \"stxrb\";\n\t\tcase ARM64_STXRH: return \"stxrh\";\n\t\tcase ARM64_STZ2G: return \"stz2g\";\n\t\tcase ARM64_STZG: return \"stzg\";\n\t\tcase ARM64_STZGM: return \"stzgm\";\n\t\tcase ARM64_SUB: return \"sub\";\n\t\tcase ARM64_SUBG: return \"subg\";\n\t\tcase ARM64_SUBHN: return \"subhn\";\n\t\tcase ARM64_SUBHN2: return \"subhn2\";\n\t\tcase ARM64_SUBHNB: return \"subhnb\";\n\t\tcase ARM64_SUBHNT: return \"subhnt\";\n\t\tcase ARM64_SUBP: return \"subp\";\n\t\tcase ARM64_SUBPS: return \"subps\";\n\t\tcase ARM64_SUBR: return \"subr\";\n\t\tcase ARM64_SUBS: return \"subs\";\n\t\tcase ARM64_SUDOT: return \"sudot\";\n\t\tcase ARM64_SUMOPA: return \"sumopa\";\n\t\tcase ARM64_SUMOPS: return \"sumops\";\n\t\tcase ARM64_SUNPKHI: return \"sunpkhi\";\n\t\tcase ARM64_SUNPKLO: return \"sunpklo\";\n\t\tcase ARM64_SUQADD: return \"suqadd\";\n\t\tcase ARM64_SVC: return \"svc\";\n\t\tcase ARM64_SWP: return \"swp\";\n\t\tcase ARM64_SWPA: return \"swpa\";\n\t\tcase ARM64_SWPAB: return \"swpab\";\n\t\tcase ARM64_SWPAH: return \"swpah\";\n\t\tcase ARM64_SWPAL: return \"swpal\";\n\t\tcase ARM64_SWPALB: return \"swpalb\";\n\t\tcase ARM64_SWPALH: return \"swpalh\";\n\t\tcase ARM64_SWPB: return \"swpb\";\n\t\tcase ARM64_SWPH: return \"swph\";\n\t\tcase ARM64_SWPL: return \"swpl\";\n\t\tcase ARM64_SWPLB: return \"swplb\";\n\t\tcase ARM64_SWPLH: return \"swplh\";\n\t\tcase ARM64_SXTB: return \"sxtb\";\n\t\tcase ARM64_SXTH: return \"sxth\";\n\t\tcase ARM64_SXTL: return \"sxtl\";\n\t\tcase ARM64_SXTL2: return \"sxtl2\";\n\t\tcase ARM64_SXTW: return \"sxtw\";\n\t\tcase ARM64_SYS: return \"sys\";\n\t\tcase ARM64_SYSL: return \"sysl\";\n\t\tcase ARM64_TBL: return \"tbl\";\n\t\tcase ARM64_TBNZ: return \"tbnz\";\n\t\tcase ARM64_TBX: return \"tbx\";\n\t\tcase ARM64_TBZ: return \"tbz\";\n\t\tcase ARM64_TCANCEL: return \"tcancel\";\n\t\tcase ARM64_TCOMMIT: return \"tcommit\";\n\t\tcase ARM64_TLBI: return \"tlbi\";\n\t\tcase ARM64_TRN1: return \"trn1\";\n\t\tcase ARM64_TRN2: return \"trn2\";\n\t\tcase ARM64_TSB: return \"tsb\";\n\t\tcase ARM64_TST: return \"tst\";\n\t\tcase ARM64_TSTART: return \"tstart\";\n\t\tcase ARM64_TTEST: return \"ttest\";\n\t\tcase ARM64_UABA: return \"uaba\";\n\t\tcase ARM64_UABAL: return \"uabal\";\n\t\tcase ARM64_UABAL2: return \"uabal2\";\n\t\tcase ARM64_UABALB: return \"uabalb\";\n\t\tcase ARM64_UABALT: return \"uabalt\";\n\t\tcase ARM64_UABD: return \"uabd\";\n\t\tcase ARM64_UABDL: return \"uabdl\";\n\t\tcase ARM64_UABDL2: return \"uabdl2\";\n\t\tcase ARM64_UABDLB: return \"uabdlb\";\n\t\tcase ARM64_UABDLT: return \"uabdlt\";\n\t\tcase ARM64_UADALP: return \"uadalp\";\n\t\tcase ARM64_UADDL: return \"uaddl\";\n\t\tcase ARM64_UADDL2: return \"uaddl2\";\n\t\tcase ARM64_UADDLB: return \"uaddlb\";\n\t\tcase ARM64_UADDLP: return \"uaddlp\";\n\t\tcase ARM64_UADDLT: return \"uaddlt\";\n\t\tcase ARM64_UADDLV: return \"uaddlv\";\n\t\tcase ARM64_UADDV: return \"uaddv\";\n\t\tcase ARM64_UADDW: return \"uaddw\";\n\t\tcase ARM64_UADDW2: return \"uaddw2\";\n\t\tcase ARM64_UADDWB: return \"uaddwb\";\n\t\tcase ARM64_UADDWT: return \"uaddwt\";\n\t\tcase ARM64_UBFIZ: return \"ubfiz\";\n\t\tcase ARM64_UBFM: return \"ubfm\";\n\t\tcase ARM64_UBFX: return \"ubfx\";\n\t\tcase ARM64_UCLAMP: return \"uclamp\";\n\t\tcase ARM64_UCVTF: return \"ucvtf\";\n\t\tcase ARM64_UDF: return \"udf\";\n\t\tcase ARM64_UDIV: return \"udiv\";\n\t\tcase ARM64_UDIVR: return \"udivr\";\n\t\tcase ARM64_UDOT: return \"udot\";\n\t\tcase ARM64_UHADD: return \"uhadd\";\n\t\tcase ARM64_UHSUB: return \"uhsub\";\n\t\tcase ARM64_UHSUBR: return \"uhsubr\";\n\t\tcase ARM64_UMADDL: return \"umaddl\";\n\t\tcase ARM64_UMAX: return \"umax\";\n\t\tcase ARM64_UMAXP: return \"umaxp\";\n\t\tcase ARM64_UMAXV: return \"umaxv\";\n\t\tcase ARM64_UMIN: return \"umin\";\n\t\tcase ARM64_UMINP: return \"uminp\";\n\t\tcase ARM64_UMINV: return \"uminv\";\n\t\tcase ARM64_UMLAL: return \"umlal\";\n\t\tcase ARM64_UMLAL2: return \"umlal2\";\n\t\tcase ARM64_UMLALB: return \"umlalb\";\n\t\tcase ARM64_UMLALT: return \"umlalt\";\n\t\tcase ARM64_UMLSL: return \"umlsl\";\n\t\tcase ARM64_UMLSL2: return \"umlsl2\";\n\t\tcase ARM64_UMLSLB: return \"umlslb\";\n\t\tcase ARM64_UMLSLT: return \"umlslt\";\n\t\tcase ARM64_UMMLA: return \"ummla\";\n\t\tcase ARM64_UMNEGL: return \"umnegl\";\n\t\tcase ARM64_UMOPA: return \"umopa\";\n\t\tcase ARM64_UMOPS: return \"umops\";\n\t\tcase ARM64_UMOV: return \"umov\";\n\t\tcase ARM64_UMSUBL: return \"umsubl\";\n\t\tcase ARM64_UMULH: return \"umulh\";\n\t\tcase ARM64_UMULL: return \"umull\";\n\t\tcase ARM64_UMULL2: return \"umull2\";\n\t\tcase ARM64_UMULLB: return \"umullb\";\n\t\tcase ARM64_UMULLT: return \"umullt\";\n\t\tcase ARM64_UQADD: return \"uqadd\";\n\t\tcase ARM64_UQDECB: return \"uqdecb\";\n\t\tcase ARM64_UQDECD: return \"uqdecd\";\n\t\tcase ARM64_UQDECH: return \"uqdech\";\n\t\tcase ARM64_UQDECP: return \"uqdecp\";\n\t\tcase ARM64_UQDECW: return \"uqdecw\";\n\t\tcase ARM64_UQINCB: return \"uqincb\";\n\t\tcase ARM64_UQINCD: return \"uqincd\";\n\t\tcase ARM64_UQINCH: return \"uqinch\";\n\t\tcase ARM64_UQINCP: return \"uqincp\";\n\t\tcase ARM64_UQINCW: return \"uqincw\";\n\t\tcase ARM64_UQRSHL: return \"uqrshl\";\n\t\tcase ARM64_UQRSHLR: return \"uqrshlr\";\n\t\tcase ARM64_UQRSHRN: return \"uqrshrn\";\n\t\tcase ARM64_UQRSHRN2: return \"uqrshrn2\";\n\t\tcase ARM64_UQRSHRNB: return \"uqrshrnb\";\n\t\tcase ARM64_UQRSHRNT: return \"uqrshrnt\";\n\t\tcase ARM64_UQSHL: return \"uqshl\";\n\t\tcase ARM64_UQSHLR: return \"uqshlr\";\n\t\tcase ARM64_UQSHRN: return \"uqshrn\";\n\t\tcase ARM64_UQSHRN2: return \"uqshrn2\";\n\t\tcase ARM64_UQSHRNB: return \"uqshrnb\";\n\t\tcase ARM64_UQSHRNT: return \"uqshrnt\";\n\t\tcase ARM64_UQSUB: return \"uqsub\";\n\t\tcase ARM64_UQSUBR: return \"uqsubr\";\n\t\tcase ARM64_UQXTN: return \"uqxtn\";\n\t\tcase ARM64_UQXTN2: return \"uqxtn2\";\n\t\tcase ARM64_UQXTNB: return \"uqxtnb\";\n\t\tcase ARM64_UQXTNT: return \"uqxtnt\";\n\t\tcase ARM64_URECPE: return \"urecpe\";\n\t\tcase ARM64_URHADD: return \"urhadd\";\n\t\tcase ARM64_URSHL: return \"urshl\";\n\t\tcase ARM64_URSHLR: return \"urshlr\";\n\t\tcase ARM64_URSHR: return \"urshr\";\n\t\tcase ARM64_URSQRTE: return \"ursqrte\";\n\t\tcase ARM64_URSRA: return \"ursra\";\n\t\tcase ARM64_USDOT: return \"usdot\";\n\t\tcase ARM64_USHL: return \"ushl\";\n\t\tcase ARM64_USHLL: return \"ushll\";\n\t\tcase ARM64_USHLL2: return \"ushll2\";\n\t\tcase ARM64_USHLLB: return \"ushllb\";\n\t\tcase ARM64_USHLLT: return \"ushllt\";\n\t\tcase ARM64_USHR: return \"ushr\";\n\t\tcase ARM64_USMMLA: return \"usmmla\";\n\t\tcase ARM64_USMOPA: return \"usmopa\";\n\t\tcase ARM64_USMOPS: return \"usmops\";\n\t\tcase ARM64_USQADD: return \"usqadd\";\n\t\tcase ARM64_USRA: return \"usra\";\n\t\tcase ARM64_USUBL: return \"usubl\";\n\t\tcase ARM64_USUBL2: return \"usubl2\";\n\t\tcase ARM64_USUBLB: return \"usublb\";\n\t\tcase ARM64_USUBLT: return \"usublt\";\n\t\tcase ARM64_USUBW: return \"usubw\";\n\t\tcase ARM64_USUBW2: return \"usubw2\";\n\t\tcase ARM64_USUBWB: return \"usubwb\";\n\t\tcase ARM64_USUBWT: return \"usubwt\";\n\t\tcase ARM64_UUNPKHI: return \"uunpkhi\";\n\t\tcase ARM64_UUNPKLO: return \"uunpklo\";\n\t\tcase ARM64_UXTB: return \"uxtb\";\n\t\tcase ARM64_UXTH: return \"uxth\";\n\t\tcase ARM64_UXTL: return \"uxtl\";\n\t\tcase ARM64_UXTL2: return \"uxtl2\";\n\t\tcase ARM64_UXTW: return \"uxtw\";\n\t\tcase ARM64_UZP1: return \"uzp1\";\n\t\tcase ARM64_UZP2: return \"uzp2\";\n\t\tcase ARM64_WFE: return \"wfe\";\n\t\tcase ARM64_WFET: return \"wfet\";\n\t\tcase ARM64_WFI: return \"wfi\";\n\t\tcase ARM64_WFIT: return \"wfit\";\n\t\tcase ARM64_WHILEGE: return \"whilege\";\n\t\tcase ARM64_WHILEGT: return \"whilegt\";\n\t\tcase ARM64_WHILEHI: return \"whilehi\";\n\t\tcase ARM64_WHILEHS: return \"whilehs\";\n\t\tcase ARM64_WHILELE: return \"whilele\";\n\t\tcase ARM64_WHILELO: return \"whilelo\";\n\t\tcase ARM64_WHILELS: return \"whilels\";\n\t\tcase ARM64_WHILELT: return \"whilelt\";\n\t\tcase ARM64_WHILERW: return \"whilerw\";\n\t\tcase ARM64_WHILEWR: return \"whilewr\";\n\t\tcase ARM64_WRFFR: return \"wrffr\";\n\t\tcase ARM64_XAFLAG: return \"xaflag\";\n\t\tcase ARM64_XAR: return \"xar\";\n\t\tcase ARM64_XPACD: return \"xpacd\";\n\t\tcase ARM64_XPACI: return \"xpaci\";\n\t\tcase ARM64_XPACLRI: return \"xpaclri\";\n\t\tcase ARM64_XTN: return \"xtn\";\n\t\tcase ARM64_XTN2: return \"xtn2\";\n\t\tcase ARM64_YIELD: return \"yield\";\n\t\tcase ARM64_ZERO: return \"zero\";\n\t\tcase ARM64_ZIP1: return \"zip1\";\n\t\tcase ARM64_ZIP2: return \"zip2\";\n\t\tcase ARM64_ERROR:\n\t\tdefault:\n\t\t\treturn \"error\";\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/operations.h",
    "content": "/* GENERATED FILE */\n#pragma once\n\nenum Operation {\nARM64_ERROR=0,\nARM64_ABS=1,\nARM64_ADC=2,\nARM64_ADCLB=3,\nARM64_ADCLT=4,\nARM64_ADCS=5,\nARM64_ADD=6,\nARM64_ADDG=7,\nARM64_ADDHA=8,\nARM64_ADDHN=9,\nARM64_ADDHN2=10,\nARM64_ADDHNB=11,\nARM64_ADDHNT=12,\nARM64_ADDP=13,\nARM64_ADDPL=14,\nARM64_ADDS=15,\nARM64_ADDV=16,\nARM64_ADDVA=17,\nARM64_ADDVL=18,\nARM64_ADR=19,\nARM64_ADRP=20,\nARM64_AESD=21,\nARM64_AESE=22,\nARM64_AESIMC=23,\nARM64_AESMC=24,\nARM64_AND=25,\nARM64_ANDS=26,\nARM64_ANDV=27,\nARM64_ASR=28,\nARM64_ASRD=29,\nARM64_ASRR=30,\nARM64_ASRV=31,\nARM64_AT=32,\nARM64_AUTDA=33,\nARM64_AUTDB=34,\nARM64_AUTDZA=35,\nARM64_AUTDZB=36,\nARM64_AUTIA=37,\nARM64_AUTIA1716=38,\nARM64_AUTIASP=39,\nARM64_AUTIAZ=40,\nARM64_AUTIB=41,\nARM64_AUTIB1716=42,\nARM64_AUTIBSP=43,\nARM64_AUTIBZ=44,\nARM64_AUTIZA=45,\nARM64_AUTIZB=46,\nARM64_AXFLAG=47,\nARM64_B=48,\nARM64_BCAX=49,\nARM64_BDEP=50,\nARM64_BEXT=51,\nARM64_BFC=52,\nARM64_BFCVT=53,\nARM64_BFCVTN=54,\nARM64_BFCVTN2=55,\nARM64_BFCVTNT=56,\nARM64_BFDOT=57,\nARM64_BFI=58,\nARM64_BFM=59,\nARM64_BFMLAL=60,\nARM64_BFMLALB=61,\nARM64_BFMLALT=62,\nARM64_BFMMLA=63,\nARM64_BFMOPA=64,\nARM64_BFMOPS=65,\nARM64_BFXIL=66,\nARM64_BGRP=67,\nARM64_BIC=68,\nARM64_BICS=69,\nARM64_BIF=70,\nARM64_BIT=71,\nARM64_BL=72,\nARM64_BLR=73,\nARM64_BLRAA=74,\nARM64_BLRAAZ=75,\nARM64_BLRAB=76,\nARM64_BLRABZ=77,\nARM64_BR=78,\nARM64_BRAA=79,\nARM64_BRAAZ=80,\nARM64_BRAB=81,\nARM64_BRABZ=82,\nARM64_BRK=83,\nARM64_BRKA=84,\nARM64_BRKAS=85,\nARM64_BRKB=86,\nARM64_BRKBS=87,\nARM64_BRKN=88,\nARM64_BRKNS=89,\nARM64_BRKPA=90,\nARM64_BRKPAS=91,\nARM64_BRKPB=92,\nARM64_BRKPBS=93,\nARM64_BSL=94,\nARM64_BSL1N=95,\nARM64_BSL2N=96,\nARM64_BTI=97,\nARM64_B_AL=98,\nARM64_B_CC=99,\nARM64_B_CS=100,\nARM64_B_EQ=101,\nARM64_B_GE=102,\nARM64_B_GT=103,\nARM64_B_HI=104,\nARM64_B_LE=105,\nARM64_B_LS=106,\nARM64_B_LT=107,\nARM64_B_MI=108,\nARM64_B_NE=109,\nARM64_B_NV=110,\nARM64_B_PL=111,\nARM64_B_VC=112,\nARM64_B_VS=113,\nARM64_CADD=114,\nARM64_CAS=115,\nARM64_CASA=116,\nARM64_CASAB=117,\nARM64_CASAH=118,\nARM64_CASAL=119,\nARM64_CASALB=120,\nARM64_CASALH=121,\nARM64_CASB=122,\nARM64_CASH=123,\nARM64_CASL=124,\nARM64_CASLB=125,\nARM64_CASLH=126,\nARM64_CASP=127,\nARM64_CASPA=128,\nARM64_CASPAL=129,\nARM64_CASPL=130,\nARM64_CBNZ=131,\nARM64_CBZ=132,\nARM64_CCMN=133,\nARM64_CCMP=134,\nARM64_CDOT=135,\nARM64_CFINV=136,\nARM64_CFP=137,\nARM64_CINC=138,\nARM64_CINV=139,\nARM64_CLASTA=140,\nARM64_CLASTB=141,\nARM64_CLREX=142,\nARM64_CLS=143,\nARM64_CLZ=144,\nARM64_CMEQ=145,\nARM64_CMGE=146,\nARM64_CMGT=147,\nARM64_CMHI=148,\nARM64_CMHS=149,\nARM64_CMLA=150,\nARM64_CMLE=151,\nARM64_CMLT=152,\nARM64_CMN=153,\nARM64_CMP=154,\nARM64_CMPEQ=155,\nARM64_CMPGE=156,\nARM64_CMPGT=157,\nARM64_CMPHI=158,\nARM64_CMPHS=159,\nARM64_CMPLE=160,\nARM64_CMPLO=161,\nARM64_CMPLS=162,\nARM64_CMPLT=163,\nARM64_CMPNE=164,\nARM64_CMPP=165,\nARM64_CMTST=166,\nARM64_CNEG=167,\nARM64_CNOT=168,\nARM64_CNT=169,\nARM64_CNTB=170,\nARM64_CNTD=171,\nARM64_CNTH=172,\nARM64_CNTP=173,\nARM64_CNTW=174,\nARM64_COMPACT=175,\nARM64_CPP=176,\nARM64_CPY=177,\nARM64_CRC32B=178,\nARM64_CRC32CB=179,\nARM64_CRC32CH=180,\nARM64_CRC32CW=181,\nARM64_CRC32CX=182,\nARM64_CRC32H=183,\nARM64_CRC32W=184,\nARM64_CRC32X=185,\nARM64_CSDB=186,\nARM64_CSEL=187,\nARM64_CSET=188,\nARM64_CSETM=189,\nARM64_CSINC=190,\nARM64_CSINV=191,\nARM64_CSNEG=192,\nARM64_CTERMEQ=193,\nARM64_CTERMNE=194,\nARM64_DC=195,\nARM64_DCPS1=196,\nARM64_DCPS2=197,\nARM64_DCPS3=198,\nARM64_DECB=199,\nARM64_DECD=200,\nARM64_DECH=201,\nARM64_DECP=202,\nARM64_DECW=203,\nARM64_DGH=204,\nARM64_DMB=205,\nARM64_DRPS=206,\nARM64_DSB=207,\nARM64_DUP=208,\nARM64_DUPM=209,\nARM64_DVP=210,\nARM64_EON=211,\nARM64_EOR=212,\nARM64_EOR3=213,\nARM64_EORBT=214,\nARM64_EORS=215,\nARM64_EORTB=216,\nARM64_EORV=217,\nARM64_ERET=218,\nARM64_ERETAA=219,\nARM64_ERETAB=220,\nARM64_ESB=221,\nARM64_EXT=222,\nARM64_EXTR=223,\nARM64_FABD=224,\nARM64_FABS=225,\nARM64_FACGE=226,\nARM64_FACGT=227,\nARM64_FACLE=228,\nARM64_FACLT=229,\nARM64_FADD=230,\nARM64_FADDA=231,\nARM64_FADDP=232,\nARM64_FADDV=233,\nARM64_FCADD=234,\nARM64_FCCMP=235,\nARM64_FCCMPE=236,\nARM64_FCMEQ=237,\nARM64_FCMGE=238,\nARM64_FCMGT=239,\nARM64_FCMLA=240,\nARM64_FCMLE=241,\nARM64_FCMLT=242,\nARM64_FCMNE=243,\nARM64_FCMP=244,\nARM64_FCMPE=245,\nARM64_FCMUO=246,\nARM64_FCPY=247,\nARM64_FCSEL=248,\nARM64_FCVT=249,\nARM64_FCVTAS=250,\nARM64_FCVTAU=251,\nARM64_FCVTL=252,\nARM64_FCVTL2=253,\nARM64_FCVTLT=254,\nARM64_FCVTMS=255,\nARM64_FCVTMU=256,\nARM64_FCVTN=257,\nARM64_FCVTN2=258,\nARM64_FCVTNS=259,\nARM64_FCVTNT=260,\nARM64_FCVTNU=261,\nARM64_FCVTPS=262,\nARM64_FCVTPU=263,\nARM64_FCVTX=264,\nARM64_FCVTXN=265,\nARM64_FCVTXN2=266,\nARM64_FCVTXNT=267,\nARM64_FCVTZS=268,\nARM64_FCVTZU=269,\nARM64_FDIV=270,\nARM64_FDIVR=271,\nARM64_FDUP=272,\nARM64_FEXPA=273,\nARM64_FJCVTZS=274,\nARM64_FLOGB=275,\nARM64_FMAD=276,\nARM64_FMADD=277,\nARM64_FMAX=278,\nARM64_FMAXNM=279,\nARM64_FMAXNMP=280,\nARM64_FMAXNMV=281,\nARM64_FMAXP=282,\nARM64_FMAXV=283,\nARM64_FMIN=284,\nARM64_FMINNM=285,\nARM64_FMINNMP=286,\nARM64_FMINNMV=287,\nARM64_FMINP=288,\nARM64_FMINV=289,\nARM64_FMLA=290,\nARM64_FMLAL=291,\nARM64_FMLAL2=292,\nARM64_FMLALB=293,\nARM64_FMLALT=294,\nARM64_FMLS=295,\nARM64_FMLSL=296,\nARM64_FMLSL2=297,\nARM64_FMLSLB=298,\nARM64_FMLSLT=299,\nARM64_FMMLA=300,\nARM64_FMOPA=301,\nARM64_FMOPS=302,\nARM64_FMOV=303,\nARM64_FMSB=304,\nARM64_FMSUB=305,\nARM64_FMUL=306,\nARM64_FMULX=307,\nARM64_FNEG=308,\nARM64_FNMAD=309,\nARM64_FNMADD=310,\nARM64_FNMLA=311,\nARM64_FNMLS=312,\nARM64_FNMSB=313,\nARM64_FNMSUB=314,\nARM64_FNMUL=315,\nARM64_FRECPE=316,\nARM64_FRECPS=317,\nARM64_FRECPX=318,\nARM64_FRINT32X=319,\nARM64_FRINT32Z=320,\nARM64_FRINT64X=321,\nARM64_FRINT64Z=322,\nARM64_FRINTA=323,\nARM64_FRINTI=324,\nARM64_FRINTM=325,\nARM64_FRINTN=326,\nARM64_FRINTP=327,\nARM64_FRINTX=328,\nARM64_FRINTZ=329,\nARM64_FRSQRTE=330,\nARM64_FRSQRTS=331,\nARM64_FSCALE=332,\nARM64_FSQRT=333,\nARM64_FSUB=334,\nARM64_FSUBR=335,\nARM64_FTMAD=336,\nARM64_FTSMUL=337,\nARM64_FTSSEL=338,\nARM64_GMI=339,\nARM64_HINT=340,\nARM64_HISTCNT=341,\nARM64_HISTSEG=342,\nARM64_HLT=343,\nARM64_HVC=344,\nARM64_IC=345,\nARM64_INCB=346,\nARM64_INCD=347,\nARM64_INCH=348,\nARM64_INCP=349,\nARM64_INCW=350,\nARM64_INDEX=351,\nARM64_INS=352,\nARM64_INSR=353,\nARM64_IRG=354,\nARM64_ISB=355,\nARM64_LASTA=356,\nARM64_LASTB=357,\nARM64_LD1=358,\nARM64_LD1B=359,\nARM64_LD1D=360,\nARM64_LD1H=361,\nARM64_LD1Q=362,\nARM64_LD1R=363,\nARM64_LD1RB=364,\nARM64_LD1RD=365,\nARM64_LD1RH=366,\nARM64_LD1ROB=367,\nARM64_LD1ROD=368,\nARM64_LD1ROH=369,\nARM64_LD1ROW=370,\nARM64_LD1RQB=371,\nARM64_LD1RQD=372,\nARM64_LD1RQH=373,\nARM64_LD1RQW=374,\nARM64_LD1RSB=375,\nARM64_LD1RSH=376,\nARM64_LD1RSW=377,\nARM64_LD1RW=378,\nARM64_LD1SB=379,\nARM64_LD1SH=380,\nARM64_LD1SW=381,\nARM64_LD1W=382,\nARM64_LD2=383,\nARM64_LD2B=384,\nARM64_LD2D=385,\nARM64_LD2H=386,\nARM64_LD2R=387,\nARM64_LD2W=388,\nARM64_LD3=389,\nARM64_LD3B=390,\nARM64_LD3D=391,\nARM64_LD3H=392,\nARM64_LD3R=393,\nARM64_LD3W=394,\nARM64_LD4=395,\nARM64_LD4B=396,\nARM64_LD4D=397,\nARM64_LD4H=398,\nARM64_LD4R=399,\nARM64_LD4W=400,\nARM64_LD64B=401,\nARM64_LDADD=402,\nARM64_LDADDA=403,\nARM64_LDADDAB=404,\nARM64_LDADDAH=405,\nARM64_LDADDAL=406,\nARM64_LDADDALB=407,\nARM64_LDADDALH=408,\nARM64_LDADDB=409,\nARM64_LDADDH=410,\nARM64_LDADDL=411,\nARM64_LDADDLB=412,\nARM64_LDADDLH=413,\nARM64_LDAPR=414,\nARM64_LDAPRB=415,\nARM64_LDAPRH=416,\nARM64_LDAPUR=417,\nARM64_LDAPURB=418,\nARM64_LDAPURH=419,\nARM64_LDAPURSB=420,\nARM64_LDAPURSH=421,\nARM64_LDAPURSW=422,\nARM64_LDAR=423,\nARM64_LDARB=424,\nARM64_LDARH=425,\nARM64_LDAXP=426,\nARM64_LDAXR=427,\nARM64_LDAXRB=428,\nARM64_LDAXRH=429,\nARM64_LDCLR=430,\nARM64_LDCLRA=431,\nARM64_LDCLRAB=432,\nARM64_LDCLRAH=433,\nARM64_LDCLRAL=434,\nARM64_LDCLRALB=435,\nARM64_LDCLRALH=436,\nARM64_LDCLRB=437,\nARM64_LDCLRH=438,\nARM64_LDCLRL=439,\nARM64_LDCLRLB=440,\nARM64_LDCLRLH=441,\nARM64_LDEOR=442,\nARM64_LDEORA=443,\nARM64_LDEORAB=444,\nARM64_LDEORAH=445,\nARM64_LDEORAL=446,\nARM64_LDEORALB=447,\nARM64_LDEORALH=448,\nARM64_LDEORB=449,\nARM64_LDEORH=450,\nARM64_LDEORL=451,\nARM64_LDEORLB=452,\nARM64_LDEORLH=453,\nARM64_LDFF1B=454,\nARM64_LDFF1D=455,\nARM64_LDFF1H=456,\nARM64_LDFF1SB=457,\nARM64_LDFF1SH=458,\nARM64_LDFF1SW=459,\nARM64_LDFF1W=460,\nARM64_LDG=461,\nARM64_LDGM=462,\nARM64_LDLAR=463,\nARM64_LDLARB=464,\nARM64_LDLARH=465,\nARM64_LDNF1B=466,\nARM64_LDNF1D=467,\nARM64_LDNF1H=468,\nARM64_LDNF1SB=469,\nARM64_LDNF1SH=470,\nARM64_LDNF1SW=471,\nARM64_LDNF1W=472,\nARM64_LDNP=473,\nARM64_LDNT1B=474,\nARM64_LDNT1D=475,\nARM64_LDNT1H=476,\nARM64_LDNT1SB=477,\nARM64_LDNT1SH=478,\nARM64_LDNT1SW=479,\nARM64_LDNT1W=480,\nARM64_LDP=481,\nARM64_LDPSW=482,\nARM64_LDR=483,\nARM64_LDRAA=484,\nARM64_LDRAB=485,\nARM64_LDRB=486,\nARM64_LDRH=487,\nARM64_LDRSB=488,\nARM64_LDRSH=489,\nARM64_LDRSW=490,\nARM64_LDSET=491,\nARM64_LDSETA=492,\nARM64_LDSETAB=493,\nARM64_LDSETAH=494,\nARM64_LDSETAL=495,\nARM64_LDSETALB=496,\nARM64_LDSETALH=497,\nARM64_LDSETB=498,\nARM64_LDSETH=499,\nARM64_LDSETL=500,\nARM64_LDSETLB=501,\nARM64_LDSETLH=502,\nARM64_LDSMAX=503,\nARM64_LDSMAXA=504,\nARM64_LDSMAXAB=505,\nARM64_LDSMAXAH=506,\nARM64_LDSMAXAL=507,\nARM64_LDSMAXALB=508,\nARM64_LDSMAXALH=509,\nARM64_LDSMAXB=510,\nARM64_LDSMAXH=511,\nARM64_LDSMAXL=512,\nARM64_LDSMAXLB=513,\nARM64_LDSMAXLH=514,\nARM64_LDSMIN=515,\nARM64_LDSMINA=516,\nARM64_LDSMINAB=517,\nARM64_LDSMINAH=518,\nARM64_LDSMINAL=519,\nARM64_LDSMINALB=520,\nARM64_LDSMINALH=521,\nARM64_LDSMINB=522,\nARM64_LDSMINH=523,\nARM64_LDSMINL=524,\nARM64_LDSMINLB=525,\nARM64_LDSMINLH=526,\nARM64_LDTR=527,\nARM64_LDTRB=528,\nARM64_LDTRH=529,\nARM64_LDTRSB=530,\nARM64_LDTRSH=531,\nARM64_LDTRSW=532,\nARM64_LDUMAX=533,\nARM64_LDUMAXA=534,\nARM64_LDUMAXAB=535,\nARM64_LDUMAXAH=536,\nARM64_LDUMAXAL=537,\nARM64_LDUMAXALB=538,\nARM64_LDUMAXALH=539,\nARM64_LDUMAXB=540,\nARM64_LDUMAXH=541,\nARM64_LDUMAXL=542,\nARM64_LDUMAXLB=543,\nARM64_LDUMAXLH=544,\nARM64_LDUMIN=545,\nARM64_LDUMINA=546,\nARM64_LDUMINAB=547,\nARM64_LDUMINAH=548,\nARM64_LDUMINAL=549,\nARM64_LDUMINALB=550,\nARM64_LDUMINALH=551,\nARM64_LDUMINB=552,\nARM64_LDUMINH=553,\nARM64_LDUMINL=554,\nARM64_LDUMINLB=555,\nARM64_LDUMINLH=556,\nARM64_LDUR=557,\nARM64_LDURB=558,\nARM64_LDURH=559,\nARM64_LDURSB=560,\nARM64_LDURSH=561,\nARM64_LDURSW=562,\nARM64_LDXP=563,\nARM64_LDXR=564,\nARM64_LDXRB=565,\nARM64_LDXRH=566,\nARM64_LSL=567,\nARM64_LSLR=568,\nARM64_LSLV=569,\nARM64_LSR=570,\nARM64_LSRR=571,\nARM64_LSRV=572,\nARM64_MAD=573,\nARM64_MADD=574,\nARM64_MATCH=575,\nARM64_MLA=576,\nARM64_MLS=577,\nARM64_MNEG=578,\nARM64_MOV=579,\nARM64_MOVA=580,\nARM64_MOVI=581,\nARM64_MOVK=582,\nARM64_MOVN=583,\nARM64_MOVPRFX=584,\nARM64_MOVS=585,\nARM64_MOVZ=586,\nARM64_MRS=587,\nARM64_MSB=588,\nARM64_MSR=589,\nARM64_MSUB=590,\nARM64_MUL=591,\nARM64_MVN=592,\nARM64_MVNI=593,\nARM64_NAND=594,\nARM64_NANDS=595,\nARM64_NBSL=596,\nARM64_NEG=597,\nARM64_NEGS=598,\nARM64_NGC=599,\nARM64_NGCS=600,\nARM64_NMATCH=601,\nARM64_NOP=602,\nARM64_NOR=603,\nARM64_NORS=604,\nARM64_NOT=605,\nARM64_NOTS=606,\nARM64_ORN=607,\nARM64_ORNS=608,\nARM64_ORR=609,\nARM64_ORRS=610,\nARM64_ORV=611,\nARM64_PACDA=612,\nARM64_PACDB=613,\nARM64_PACDZA=614,\nARM64_PACDZB=615,\nARM64_PACGA=616,\nARM64_PACIA=617,\nARM64_PACIA1716=618,\nARM64_PACIASP=619,\nARM64_PACIAZ=620,\nARM64_PACIB=621,\nARM64_PACIB1716=622,\nARM64_PACIBSP=623,\nARM64_PACIBZ=624,\nARM64_PACIZA=625,\nARM64_PACIZB=626,\nARM64_PFALSE=627,\nARM64_PFIRST=628,\nARM64_PMUL=629,\nARM64_PMULL=630,\nARM64_PMULL2=631,\nARM64_PMULLB=632,\nARM64_PMULLT=633,\nARM64_PNEXT=634,\nARM64_PRFB=635,\nARM64_PRFD=636,\nARM64_PRFH=637,\nARM64_PRFM=638,\nARM64_PRFUM=639,\nARM64_PRFW=640,\nARM64_PSB=641,\nARM64_PSSBB=642,\nARM64_PTEST=643,\nARM64_PTRUE=644,\nARM64_PTRUES=645,\nARM64_PUNPKHI=646,\nARM64_PUNPKLO=647,\nARM64_RADDHN=648,\nARM64_RADDHN2=649,\nARM64_RADDHNB=650,\nARM64_RADDHNT=651,\nARM64_RAX1=652,\nARM64_RBIT=653,\nARM64_RDFFR=654,\nARM64_RDFFRS=655,\nARM64_RDVL=656,\nARM64_RET=657,\nARM64_RETAA=658,\nARM64_RETAB=659,\nARM64_REV=660,\nARM64_REV16=661,\nARM64_REV32=662,\nARM64_REV64=663,\nARM64_REVB=664,\nARM64_REVD=665,\nARM64_REVH=666,\nARM64_REVW=667,\nARM64_RMIF=668,\nARM64_ROR=669,\nARM64_RORV=670,\nARM64_RSHRN=671,\nARM64_RSHRN2=672,\nARM64_RSHRNB=673,\nARM64_RSHRNT=674,\nARM64_RSUBHN=675,\nARM64_RSUBHN2=676,\nARM64_RSUBHNB=677,\nARM64_RSUBHNT=678,\nARM64_SABA=679,\nARM64_SABAL=680,\nARM64_SABAL2=681,\nARM64_SABALB=682,\nARM64_SABALT=683,\nARM64_SABD=684,\nARM64_SABDL=685,\nARM64_SABDL2=686,\nARM64_SABDLB=687,\nARM64_SABDLT=688,\nARM64_SADALP=689,\nARM64_SADDL=690,\nARM64_SADDL2=691,\nARM64_SADDLB=692,\nARM64_SADDLBT=693,\nARM64_SADDLP=694,\nARM64_SADDLT=695,\nARM64_SADDLV=696,\nARM64_SADDV=697,\nARM64_SADDW=698,\nARM64_SADDW2=699,\nARM64_SADDWB=700,\nARM64_SADDWT=701,\nARM64_SB=702,\nARM64_SBC=703,\nARM64_SBCLB=704,\nARM64_SBCLT=705,\nARM64_SBCS=706,\nARM64_SBFIZ=707,\nARM64_SBFM=708,\nARM64_SBFX=709,\nARM64_SCLAMP=710,\nARM64_SCVTF=711,\nARM64_SDIV=712,\nARM64_SDIVR=713,\nARM64_SDOT=714,\nARM64_SEL=715,\nARM64_SETF16=716,\nARM64_SETF8=717,\nARM64_SETFFR=718,\nARM64_SEV=719,\nARM64_SEVL=720,\nARM64_SHA1C=721,\nARM64_SHA1H=722,\nARM64_SHA1M=723,\nARM64_SHA1P=724,\nARM64_SHA1SU0=725,\nARM64_SHA1SU1=726,\nARM64_SHA256H=727,\nARM64_SHA256H2=728,\nARM64_SHA256SU0=729,\nARM64_SHA256SU1=730,\nARM64_SHA512H=731,\nARM64_SHA512H2=732,\nARM64_SHA512SU0=733,\nARM64_SHA512SU1=734,\nARM64_SHADD=735,\nARM64_SHL=736,\nARM64_SHLL=737,\nARM64_SHLL2=738,\nARM64_SHRN=739,\nARM64_SHRN2=740,\nARM64_SHRNB=741,\nARM64_SHRNT=742,\nARM64_SHSUB=743,\nARM64_SHSUBR=744,\nARM64_SLI=745,\nARM64_SM3PARTW1=746,\nARM64_SM3PARTW2=747,\nARM64_SM3SS1=748,\nARM64_SM3TT1A=749,\nARM64_SM3TT1B=750,\nARM64_SM3TT2A=751,\nARM64_SM3TT2B=752,\nARM64_SM4E=753,\nARM64_SM4EKEY=754,\nARM64_SMADDL=755,\nARM64_SMAX=756,\nARM64_SMAXP=757,\nARM64_SMAXV=758,\nARM64_SMC=759,\nARM64_SMIN=760,\nARM64_SMINP=761,\nARM64_SMINV=762,\nARM64_SMLAL=763,\nARM64_SMLAL2=764,\nARM64_SMLALB=765,\nARM64_SMLALT=766,\nARM64_SMLSL=767,\nARM64_SMLSL2=768,\nARM64_SMLSLB=769,\nARM64_SMLSLT=770,\nARM64_SMMLA=771,\nARM64_SMNEGL=772,\nARM64_SMOPA=773,\nARM64_SMOPS=774,\nARM64_SMOV=775,\nARM64_SMSTART=776,\nARM64_SMSTOP=777,\nARM64_SMSUBL=778,\nARM64_SMULH=779,\nARM64_SMULL=780,\nARM64_SMULL2=781,\nARM64_SMULLB=782,\nARM64_SMULLT=783,\nARM64_SPLICE=784,\nARM64_SQABS=785,\nARM64_SQADD=786,\nARM64_SQCADD=787,\nARM64_SQDECB=788,\nARM64_SQDECD=789,\nARM64_SQDECH=790,\nARM64_SQDECP=791,\nARM64_SQDECW=792,\nARM64_SQDMLAL=793,\nARM64_SQDMLAL2=794,\nARM64_SQDMLALB=795,\nARM64_SQDMLALBT=796,\nARM64_SQDMLALT=797,\nARM64_SQDMLSL=798,\nARM64_SQDMLSL2=799,\nARM64_SQDMLSLB=800,\nARM64_SQDMLSLBT=801,\nARM64_SQDMLSLT=802,\nARM64_SQDMULH=803,\nARM64_SQDMULL=804,\nARM64_SQDMULL2=805,\nARM64_SQDMULLB=806,\nARM64_SQDMULLT=807,\nARM64_SQINCB=808,\nARM64_SQINCD=809,\nARM64_SQINCH=810,\nARM64_SQINCP=811,\nARM64_SQINCW=812,\nARM64_SQNEG=813,\nARM64_SQRDCMLAH=814,\nARM64_SQRDMLAH=815,\nARM64_SQRDMLSH=816,\nARM64_SQRDMULH=817,\nARM64_SQRSHL=818,\nARM64_SQRSHLR=819,\nARM64_SQRSHRN=820,\nARM64_SQRSHRN2=821,\nARM64_SQRSHRNB=822,\nARM64_SQRSHRNT=823,\nARM64_SQRSHRUN=824,\nARM64_SQRSHRUN2=825,\nARM64_SQRSHRUNB=826,\nARM64_SQRSHRUNT=827,\nARM64_SQSHL=828,\nARM64_SQSHLR=829,\nARM64_SQSHLU=830,\nARM64_SQSHRN=831,\nARM64_SQSHRN2=832,\nARM64_SQSHRNB=833,\nARM64_SQSHRNT=834,\nARM64_SQSHRUN=835,\nARM64_SQSHRUN2=836,\nARM64_SQSHRUNB=837,\nARM64_SQSHRUNT=838,\nARM64_SQSUB=839,\nARM64_SQSUBR=840,\nARM64_SQXTN=841,\nARM64_SQXTN2=842,\nARM64_SQXTNB=843,\nARM64_SQXTNT=844,\nARM64_SQXTUN=845,\nARM64_SQXTUN2=846,\nARM64_SQXTUNB=847,\nARM64_SQXTUNT=848,\nARM64_SRHADD=849,\nARM64_SRI=850,\nARM64_SRSHL=851,\nARM64_SRSHLR=852,\nARM64_SRSHR=853,\nARM64_SRSRA=854,\nARM64_SSBB=855,\nARM64_SSHL=856,\nARM64_SSHLL=857,\nARM64_SSHLL2=858,\nARM64_SSHLLB=859,\nARM64_SSHLLT=860,\nARM64_SSHR=861,\nARM64_SSRA=862,\nARM64_SSUBL=863,\nARM64_SSUBL2=864,\nARM64_SSUBLB=865,\nARM64_SSUBLBT=866,\nARM64_SSUBLT=867,\nARM64_SSUBLTB=868,\nARM64_SSUBW=869,\nARM64_SSUBW2=870,\nARM64_SSUBWB=871,\nARM64_SSUBWT=872,\nARM64_ST1=873,\nARM64_ST1B=874,\nARM64_ST1D=875,\nARM64_ST1H=876,\nARM64_ST1Q=877,\nARM64_ST1W=878,\nARM64_ST2=879,\nARM64_ST2B=880,\nARM64_ST2D=881,\nARM64_ST2G=882,\nARM64_ST2H=883,\nARM64_ST2W=884,\nARM64_ST3=885,\nARM64_ST3B=886,\nARM64_ST3D=887,\nARM64_ST3H=888,\nARM64_ST3W=889,\nARM64_ST4=890,\nARM64_ST4B=891,\nARM64_ST4D=892,\nARM64_ST4H=893,\nARM64_ST4W=894,\nARM64_ST64B=895,\nARM64_ST64BV=896,\nARM64_ST64BV0=897,\nARM64_STADD=898,\nARM64_STADDB=899,\nARM64_STADDH=900,\nARM64_STADDL=901,\nARM64_STADDLB=902,\nARM64_STADDLH=903,\nARM64_STCLR=904,\nARM64_STCLRB=905,\nARM64_STCLRH=906,\nARM64_STCLRL=907,\nARM64_STCLRLB=908,\nARM64_STCLRLH=909,\nARM64_STEOR=910,\nARM64_STEORB=911,\nARM64_STEORH=912,\nARM64_STEORL=913,\nARM64_STEORLB=914,\nARM64_STEORLH=915,\nARM64_STG=916,\nARM64_STGM=917,\nARM64_STGP=918,\nARM64_STLLR=919,\nARM64_STLLRB=920,\nARM64_STLLRH=921,\nARM64_STLR=922,\nARM64_STLRB=923,\nARM64_STLRH=924,\nARM64_STLUR=925,\nARM64_STLURB=926,\nARM64_STLURH=927,\nARM64_STLXP=928,\nARM64_STLXR=929,\nARM64_STLXRB=930,\nARM64_STLXRH=931,\nARM64_STNP=932,\nARM64_STNT1B=933,\nARM64_STNT1D=934,\nARM64_STNT1H=935,\nARM64_STNT1W=936,\nARM64_STP=937,\nARM64_STR=938,\nARM64_STRB=939,\nARM64_STRH=940,\nARM64_STSET=941,\nARM64_STSETB=942,\nARM64_STSETH=943,\nARM64_STSETL=944,\nARM64_STSETLB=945,\nARM64_STSETLH=946,\nARM64_STSMAX=947,\nARM64_STSMAXB=948,\nARM64_STSMAXH=949,\nARM64_STSMAXL=950,\nARM64_STSMAXLB=951,\nARM64_STSMAXLH=952,\nARM64_STSMIN=953,\nARM64_STSMINB=954,\nARM64_STSMINH=955,\nARM64_STSMINL=956,\nARM64_STSMINLB=957,\nARM64_STSMINLH=958,\nARM64_STTR=959,\nARM64_STTRB=960,\nARM64_STTRH=961,\nARM64_STUMAX=962,\nARM64_STUMAXB=963,\nARM64_STUMAXH=964,\nARM64_STUMAXL=965,\nARM64_STUMAXLB=966,\nARM64_STUMAXLH=967,\nARM64_STUMIN=968,\nARM64_STUMINB=969,\nARM64_STUMINH=970,\nARM64_STUMINL=971,\nARM64_STUMINLB=972,\nARM64_STUMINLH=973,\nARM64_STUR=974,\nARM64_STURB=975,\nARM64_STURH=976,\nARM64_STXP=977,\nARM64_STXR=978,\nARM64_STXRB=979,\nARM64_STXRH=980,\nARM64_STZ2G=981,\nARM64_STZG=982,\nARM64_STZGM=983,\nARM64_SUB=984,\nARM64_SUBG=985,\nARM64_SUBHN=986,\nARM64_SUBHN2=987,\nARM64_SUBHNB=988,\nARM64_SUBHNT=989,\nARM64_SUBP=990,\nARM64_SUBPS=991,\nARM64_SUBR=992,\nARM64_SUBS=993,\nARM64_SUDOT=994,\nARM64_SUMOPA=995,\nARM64_SUMOPS=996,\nARM64_SUNPKHI=997,\nARM64_SUNPKLO=998,\nARM64_SUQADD=999,\nARM64_SVC=1000,\nARM64_SWP=1001,\nARM64_SWPA=1002,\nARM64_SWPAB=1003,\nARM64_SWPAH=1004,\nARM64_SWPAL=1005,\nARM64_SWPALB=1006,\nARM64_SWPALH=1007,\nARM64_SWPB=1008,\nARM64_SWPH=1009,\nARM64_SWPL=1010,\nARM64_SWPLB=1011,\nARM64_SWPLH=1012,\nARM64_SXTB=1013,\nARM64_SXTH=1014,\nARM64_SXTL=1015,\nARM64_SXTL2=1016,\nARM64_SXTW=1017,\nARM64_SYS=1018,\nARM64_SYSL=1019,\nARM64_TBL=1020,\nARM64_TBNZ=1021,\nARM64_TBX=1022,\nARM64_TBZ=1023,\nARM64_TCANCEL=1024,\nARM64_TCOMMIT=1025,\nARM64_TLBI=1026,\nARM64_TRN1=1027,\nARM64_TRN2=1028,\nARM64_TSB=1029,\nARM64_TST=1030,\nARM64_TSTART=1031,\nARM64_TTEST=1032,\nARM64_UABA=1033,\nARM64_UABAL=1034,\nARM64_UABAL2=1035,\nARM64_UABALB=1036,\nARM64_UABALT=1037,\nARM64_UABD=1038,\nARM64_UABDL=1039,\nARM64_UABDL2=1040,\nARM64_UABDLB=1041,\nARM64_UABDLT=1042,\nARM64_UADALP=1043,\nARM64_UADDL=1044,\nARM64_UADDL2=1045,\nARM64_UADDLB=1046,\nARM64_UADDLP=1047,\nARM64_UADDLT=1048,\nARM64_UADDLV=1049,\nARM64_UADDV=1050,\nARM64_UADDW=1051,\nARM64_UADDW2=1052,\nARM64_UADDWB=1053,\nARM64_UADDWT=1054,\nARM64_UBFIZ=1055,\nARM64_UBFM=1056,\nARM64_UBFX=1057,\nARM64_UCLAMP=1058,\nARM64_UCVTF=1059,\nARM64_UDF=1060,\nARM64_UDIV=1061,\nARM64_UDIVR=1062,\nARM64_UDOT=1063,\nARM64_UHADD=1064,\nARM64_UHSUB=1065,\nARM64_UHSUBR=1066,\nARM64_UMADDL=1067,\nARM64_UMAX=1068,\nARM64_UMAXP=1069,\nARM64_UMAXV=1070,\nARM64_UMIN=1071,\nARM64_UMINP=1072,\nARM64_UMINV=1073,\nARM64_UMLAL=1074,\nARM64_UMLAL2=1075,\nARM64_UMLALB=1076,\nARM64_UMLALT=1077,\nARM64_UMLSL=1078,\nARM64_UMLSL2=1079,\nARM64_UMLSLB=1080,\nARM64_UMLSLT=1081,\nARM64_UMMLA=1082,\nARM64_UMNEGL=1083,\nARM64_UMOPA=1084,\nARM64_UMOPS=1085,\nARM64_UMOV=1086,\nARM64_UMSUBL=1087,\nARM64_UMULH=1088,\nARM64_UMULL=1089,\nARM64_UMULL2=1090,\nARM64_UMULLB=1091,\nARM64_UMULLT=1092,\nARM64_UQADD=1093,\nARM64_UQDECB=1094,\nARM64_UQDECD=1095,\nARM64_UQDECH=1096,\nARM64_UQDECP=1097,\nARM64_UQDECW=1098,\nARM64_UQINCB=1099,\nARM64_UQINCD=1100,\nARM64_UQINCH=1101,\nARM64_UQINCP=1102,\nARM64_UQINCW=1103,\nARM64_UQRSHL=1104,\nARM64_UQRSHLR=1105,\nARM64_UQRSHRN=1106,\nARM64_UQRSHRN2=1107,\nARM64_UQRSHRNB=1108,\nARM64_UQRSHRNT=1109,\nARM64_UQSHL=1110,\nARM64_UQSHLR=1111,\nARM64_UQSHRN=1112,\nARM64_UQSHRN2=1113,\nARM64_UQSHRNB=1114,\nARM64_UQSHRNT=1115,\nARM64_UQSUB=1116,\nARM64_UQSUBR=1117,\nARM64_UQXTN=1118,\nARM64_UQXTN2=1119,\nARM64_UQXTNB=1120,\nARM64_UQXTNT=1121,\nARM64_URECPE=1122,\nARM64_URHADD=1123,\nARM64_URSHL=1124,\nARM64_URSHLR=1125,\nARM64_URSHR=1126,\nARM64_URSQRTE=1127,\nARM64_URSRA=1128,\nARM64_USDOT=1129,\nARM64_USHL=1130,\nARM64_USHLL=1131,\nARM64_USHLL2=1132,\nARM64_USHLLB=1133,\nARM64_USHLLT=1134,\nARM64_USHR=1135,\nARM64_USMMLA=1136,\nARM64_USMOPA=1137,\nARM64_USMOPS=1138,\nARM64_USQADD=1139,\nARM64_USRA=1140,\nARM64_USUBL=1141,\nARM64_USUBL2=1142,\nARM64_USUBLB=1143,\nARM64_USUBLT=1144,\nARM64_USUBW=1145,\nARM64_USUBW2=1146,\nARM64_USUBWB=1147,\nARM64_USUBWT=1148,\nARM64_UUNPKHI=1149,\nARM64_UUNPKLO=1150,\nARM64_UXTB=1151,\nARM64_UXTH=1152,\nARM64_UXTL=1153,\nARM64_UXTL2=1154,\nARM64_UXTW=1155,\nARM64_UZP1=1156,\nARM64_UZP2=1157,\nARM64_WFE=1158,\nARM64_WFET=1159,\nARM64_WFI=1160,\nARM64_WFIT=1161,\nARM64_WHILEGE=1162,\nARM64_WHILEGT=1163,\nARM64_WHILEHI=1164,\nARM64_WHILEHS=1165,\nARM64_WHILELE=1166,\nARM64_WHILELO=1167,\nARM64_WHILELS=1168,\nARM64_WHILELT=1169,\nARM64_WHILERW=1170,\nARM64_WHILEWR=1171,\nARM64_WRFFR=1172,\nARM64_XAFLAG=1173,\nARM64_XAR=1174,\nARM64_XPACD=1175,\nARM64_XPACI=1176,\nARM64_XPACLRI=1177,\nARM64_XTN=1178,\nARM64_XTN2=1179,\nARM64_YIELD=1180,\nARM64_ZERO=1181,\nARM64_ZIP1=1182,\nARM64_ZIP2=1183,\n};\nconst char *operation_to_str(enum Operation oper);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/pcode.c",
    "content": "#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"decode.h\"\n#include \"pcode.h\"\n\nint BitCount(uint32_t x)\n{\n\tint result = 0;\n\twhile (x)\n\t{\n\t\tif (x & 1)\n\t\t\tresult += 1;\n\t\tx >>= 1;\n\t}\n\treturn result;\n}\n\nbool BFXPreferred(uint32_t sf, uint32_t uns, uint32_t imms, uint32_t immr)\n{\n\t// must not match UBFIZ/SBFIX alias\n\tif (imms < immr)\n\t\treturn false;\n\n\t// must not match LSR/ASR/LSL alias (imms == 31 or 63)\n\tif (imms == ((sf << 5) | 0x1F))\n\t\treturn false;\n\n\t// must not match UXTx/SXTx alias\n\tif (immr == 0)\n\t{\n\t\t// must not match 32-bit UXT[BH] or SXT[BH]\n\t\tif (sf == 0 && (imms == 7 || imms == 15))\n\t\t\treturn false;\n\n\t\t// must not match 64-bit SXT[BHW]\n\t\tif ((sf == 1 && uns == 0) && (imms == 7 || imms == 15 || imms == 31))\n\t\t\treturn false;\n\t}\n\n\t// must be UBFX/SBFX alias\n\treturn true;\n}\n\nuint64_t rotate_right(uint64_t x, unsigned width, unsigned amount)\n{\n\tamount = amount % width;\n\tx = (x >> amount) | (x << (width - amount));\n\tx = (width < 64) ? x & (((uint64_t)1 << width) - 1) : x;\n\treturn x;\n}\n\nDecodeBitMasks_ReturnType DecodeBitMasks(\n    uint8_t /*bit*/ immN, uint8_t /*bit(6)*/ imms, uint8_t /*bit(6)*/ immr)\n{\n\tint ones_nbits = 0;\n\tif (immN == 1)\n\t\tones_nbits = 6;\n\telse if ((imms & 0x3E) == 0x3C)\n\t\tones_nbits = 1;\n\telse if ((imms & 0x3C) == 0x38)\n\t\tones_nbits = 2;\n\telse if ((imms & 0x38) == 0x30)\n\t\tones_nbits = 3;\n\telse if ((imms & 0x30) == 0x20)\n\t\tones_nbits = 4;\n\telse if ((imms & 0x20) == 0)\n\t\tones_nbits = 5;\n\t// TODO else: return undefined\n\n\t/* set 1's in element */\n\tint ones_n = (imms & ((1 << ones_nbits) - 1)) + 1;\n\tuint64_t result = ((uint64_t)1 << ones_n) - 1;\n\n\t/* rotate element */\n\tint elem_width = 1 << ones_nbits;\n\tresult = rotate_right(result, elem_width, immr);\n\n\t/* replicate element */\n\twhile (elem_width < 64)\n\t{\n\t\tresult = (result << elem_width) | result;\n\t\telem_width *= 2;\n\t}\n\n\tDecodeBitMasks_ReturnType dbmrt;\n\t// TODO: do this right\n\tdbmrt.wmask = result;\n\tdbmrt.tmask = result;\n\treturn dbmrt;\n}\n\n/* idea to abandon pseudocode and compute+compare actual bitmask\n  is from NetBSD sys/arch/aarch64/aarch64/disasm.c */\nbool MoveWidePreferred(uint32_t sf, uint32_t immN, uint32_t immS, uint32_t immR)\n{\n\tuint32_t splat = (immN << 6) | immS;\n\tif (sf == 1 && !((splat & 0x40) == 0x40))\n\t\treturn false;\n\tif (sf == 0 && !((splat & 0x60) == 0x00))\n\t\treturn false;\n\n\tDecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(sf, immS, immR);\n\tuint64_t imm = dbmrt.wmask;\n\n\t/* MOVZ check, at most 16 zeroes not across halfword (16-bit) boundary */\n\tif (sf == 0)\n\t\timm &= 0xffffffff;\n\tif (((imm & 0xffffffffffff0000) == 0) || ((imm & 0xffffffff0000ffff) == 0) ||\n\t    ((imm & 0xffff0000ffffffff) == 0) || ((imm & 0x0000ffffffffffff) == 0))\n\t\treturn true;\n\n\t/* MOVN check, at most 16 ones not across halfword (16-bit) boundary */\n\timm = ~imm;\n\tif (sf == 0)\n\t\timm &= 0xffffffff;\n\tif (((imm & 0xffffffffffff0000) == 0) || ((imm & 0xffffffff0000ffff) == 0) ||\n\t    ((imm & 0xffff0000ffffffff) == 0) || ((imm & 0x0000ffffffffffff) == 0))\n\t\treturn true;\n\n\treturn false;\n}\n\nint HighestSetBit(uint64_t x)\n{\n\tfor (int i = 63; i >= 0 && x; --i)\n\t{\n\t\tif (x & 0x8000000000000000)\n\t\t\treturn i;\n\t\tx <<= 1;\n\t}\n\n\treturn -1;\n}\n\nint LowestSetBit(uint64_t x)\n{\n\tfor (int i = 0; i < 64; ++i)\n\t{\n\t\tif (x & 1)\n\t\t\treturn i;\n\t\tx >>= 1;\n\t}\n\n\treturn -1;\n}\n\nbool SVEMoveMaskPreferred(uint32_t imm13)\n{\n\t// TODO: populate this\n\treturn true;\n}\n\nenum ShiftType DecodeRegExtend(uint8_t op)\n{\n\tswitch (op & 7)\n\t{\n\tcase 0b000:\n\t\treturn ShiftType_UXTB;\n\tcase 0b001:\n\t\treturn ShiftType_UXTH;\n\tcase 0b010:\n\t\treturn ShiftType_UXTW;\n\tcase 0b011:\n\t\treturn ShiftType_UXTX;\n\tcase 0b100:\n\t\treturn ShiftType_SXTB;\n\tcase 0b101:\n\t\treturn ShiftType_SXTH;\n\tcase 0b110:\n\t\treturn ShiftType_SXTW;\n\tcase 0b111:\n\t\treturn ShiftType_SXTX;\n\tdefault:\n\t\treturn ShiftType_NONE;\n\t}\n}\n\nenum ShiftType DecodeShift(uint8_t op)\n{\n\tswitch (op & 3)\n\t{\n\tcase 0b00:\n\t\treturn ShiftType_LSL;\n\tcase 0b01:\n\t\treturn ShiftType_LSR;\n\tcase 0b10:\n\t\treturn ShiftType_ASR;\n\tcase 0b11:\n\t\treturn ShiftType_ROR;\n\tdefault:\n\t\treturn ShiftType_NONE;\n\t}\n}\n\nenum SystemOp SysOp(uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2)\n{\n//\tuint32_t tmp = (op1 << 11) | (CRn << 7) | (CRm << 3) | op2;\n\tuint32_t tmp = (((op1 & 7) << 11) | ((CRn & 0xF) << 7) | ((CRm & 0xF) << 3) | ((op2) & 7));\n\n\tswitch (tmp)\n\t{\n\tcase AT_OP_S1E1R:\n\tcase AT_OP_S1E1W:\n\tcase AT_OP_S1E0R:\n\tcase AT_OP_S1E0W:\n\tcase AT_OP_S1E1RP:\n\tcase AT_OP_S1E1WP:\n\tcase AT_OP_S1E1A:\n\tcase AT_OP_S1E2R:\n\tcase AT_OP_S1E2W:\n\tcase AT_OP_S12E1R:\n\tcase AT_OP_S12E1W:\n\tcase AT_OP_S12E0R:\n\tcase AT_OP_S12E0W:\n\tcase AT_OP_S1E2A:\n\tcase AT_OP_S1E3R:\n\tcase AT_OP_S1E3W:\n\tcase AT_OP_S1E3A:\n\t\treturn Sys_AT;  // S1E1R\n//\tcase 0b00001111000000:\n//\t\treturn Sys_AT;  // S1E1R\n//\tcase 0b10001111000000:\n//\t\treturn Sys_AT;  // S1E2R\n//\tcase 0b11001111000000:\n//\t\treturn Sys_AT;  // S1E3R\n//\tcase 0b00001111000001:\n//\t\treturn Sys_AT;  // S1E1W\n//\tcase 0b00001111001001:\n//\t\treturn Sys_AT;  // S1E1WP\n//\tcase 0b10001111000001:\n//\t\treturn Sys_AT;  // S1E2W\n//\tcase 0b11001111000001:\n//\t\treturn Sys_AT;  // S1E3W\n//\tcase 0b00001111000010:\n//\t\treturn Sys_AT;  // S1E0R\n//\tcase 0b00001111000011:\n//\t\treturn Sys_AT;  // S1E0W\n//\tcase 0b10001111000100:\n//\t\treturn Sys_AT;  // S12E1R\n//\tcase 0b10001111000101:\n//\t\treturn Sys_AT;  // S12E1W\n//\tcase 0b10001111000110:\n//\t\treturn Sys_AT;  // S12E0R\n//\tcase 0b10001111000111:\n//\t\treturn Sys_AT;  // S12E0W\n\tcase 0b01101110100001:\n\t\treturn Sys_DC;  // ZVA\n\tcase 0b00001110110001:\n\t\treturn Sys_DC;  // IVAC\n\tcase 0b00001110110010:\n\t\treturn Sys_DC;  // ISW\n\tcase 0b01101111010001:\n\t\treturn Sys_DC;  // CVAC\n\tcase 0b00001111010010:\n\t\treturn Sys_DC;  // CSW\n\tcase 0b01101111011001:\n\t\treturn Sys_DC;  // CVAU\n\tcase 0b01101111110001:\n\t\treturn Sys_DC;  // CIVAC\n\tcase 0b00001111110010:\n\t\treturn Sys_DC;  // CISW\n\tcase 0b01101111101001:\n\t\treturn Sys_DC;  // CVADP\n\tcase 0b00001110001000:\n\t\treturn Sys_IC;  // IALLUIS\n\tcase 0b00001110101000:\n\t\treturn Sys_IC;  // IALLU\n\tcase 0b01101110101001:\n\t\treturn Sys_IC;  // IVAU\n\tcase TLBI_VMALLE1OS:\n\tcase TLBI_VAE1OS:\n\tcase TLBI_ASIDE1OS:\n\tcase TLBI_VAAE1OS:\n\tcase TLBI_VALE1OS:\n\tcase TLBI_VAALE1OS:\n\tcase TLBI_RVAE1IS:\n\tcase TLBI_RVAAE1IS:\n\tcase TLBI_RVALE1IS:\n\tcase TLBI_RVAALE1IS:\n\tcase TLBI_VMALLE1IS:\n\tcase TLBI_VAE1IS:\n\tcase TLBI_ASIDE1IS:\n\tcase TLBI_VAAE1IS:\n\tcase TLBI_VALE1IS:\n\tcase TLBI_VAALE1IS:\n\tcase TLBI_RVAE1OS:\n\tcase TLBI_RVAAE1OS:\n\tcase TLBI_RVALE1OS:\n\tcase TLBI_RVAALE1OS:\n\tcase TLBI_RVAE1:\n\tcase TLBI_RVAAE1:\n\tcase TLBI_RVALE1:\n\tcase TLBI_RVAALE1:\n\tcase TLBI_VMALLE1:\n\tcase TLBI_VAE1:\n\tcase TLBI_ASIDE1:\n\tcase TLBI_VAAE1:\n\tcase TLBI_VALE1:\n\tcase TLBI_VAALE1:\n\tcase TLBI_VMALLE1OSNXS:\n\tcase TLBI_VAE1OSNXS:\n\tcase TLBI_ASIDE1OSNXS:\n\tcase TLBI_VAAE1OSNXS:\n\tcase TLBI_VALE1OSNXS:\n\tcase TLBI_VAALE1OSNXS:\n\tcase TLBI_RVAE1ISNXS:\n\tcase TLBI_RVAAE1ISNXS:\n\tcase TLBI_RVALE1ISNXS:\n\tcase TLBI_RVAALE1ISNXS:\n\tcase TLBI_VMALLE1ISNXS:\n\tcase TLBI_VAE1ISNXS:\n\tcase TLBI_ASIDE1ISNXS:\n\tcase TLBI_VAAE1ISNXS:\n\tcase TLBI_VALE1ISNXS:\n\tcase TLBI_VAALE1ISNXS:\n\tcase TLBI_RVAE1OSNXS:\n\tcase TLBI_RVAAE1OSNXS:\n\tcase TLBI_RVALE1OSNXS:\n\tcase TLBI_RVAALE1OSNXS:\n\tcase TLBI_RVAE1NXS:\n\tcase TLBI_RVAAE1NXS:\n\tcase TLBI_RVALE1NXS:\n\tcase TLBI_RVAALE1NXS:\n\tcase TLBI_VMALLE1NXS:\n\tcase TLBI_VAE1NXS:\n\tcase TLBI_ASIDE1NXS:\n\tcase TLBI_VAAE1NXS:\n\tcase TLBI_VALE1NXS:\n\tcase TLBI_VAALE1NXS:\n\tcase TLBI_IPAS2E1IS:\n\tcase TLBI_RIPAS2E1IS:\n\tcase TLBI_IPAS2LE1IS:\n\tcase TLBI_RIPAS2LE1IS:\n\tcase TLBI_ALLE2OS:\n\tcase TLBI_VAE2OS:\n\tcase TLBI_ALLE1OS:\n\tcase TLBI_VALE2OS:\n\tcase TLBI_VMALLS12E1OS:\n\tcase TLBI_RVAE2IS:\n\tcase TLBI_VMALLWS2E1IS:\n\tcase TLBI_RVALE2IS:\n\tcase TLBI_ALLE2IS:\n\tcase TLBI_VAE2IS:\n\tcase TLBI_ALLE1IS:\n\tcase TLBI_VALE2IS:\n\tcase TLBI_VMALLS12E1IS:\n\tcase TLBI_IPAS2E1OS:\n\tcase TLBI_IPAS2E1:\n\tcase TLBI_RIPAS2E1:\n\tcase TLBI_RIPAS2E1OS:\n\tcase TLBI_IPAS2LE1OS:\n\tcase TLBI_IPAS2LE1:\n\tcase TLBI_RIPAS2LE1:\n\tcase TLBI_RIPAS2LE1OS:\n\tcase TLBI_RVAE2OS:\n\tcase TLBI_VMALLWS2E1OS:\n\tcase TLBI_RVALE2OS:\n\tcase TLBI_RVAE2:\n\tcase TLBI_VMALLWS2E1:\n\tcase TLBI_RVALE2:\n\tcase TLBI_ALLE2:\n\tcase TLBI_VAE2:\n\tcase TLBI_ALLE1:\n\tcase TLBI_VALE2:\n\tcase TLBI_VMALLS12E1:\n\tcase TLBI_IPAS2E1ISNXS:\n\tcase TLBI_RIPAS2E1ISNXS:\n\tcase TLBI_IPAS2LE1ISNXS:\n\tcase TLBI_RIPAS2LE1ISNXS:\n\tcase TLBI_ALLE2OSNXS:\n\tcase TLBI_VAE2OSNXS:\n\tcase TLBI_ALLE1OSNXS:\n\tcase TLBI_VALE2OSNXS:\n\tcase TLBI_VMALLS12E1OSNXS:\n\tcase TLBI_RVAE2ISNXS:\n\tcase TLBI_VMALLWS2E1ISNXS:\n\tcase TLBI_RVALE2ISNXS:\n\tcase TLBI_ALLE2ISNXS:\n\tcase TLBI_VAE2ISNXS:\n\tcase TLBI_ALLE1ISNXS:\n\tcase TLBI_VALE2ISNXS:\n\tcase TLBI_VMALLS12E1ISNXS:\n\tcase TLBI_IPAS2E1OSNXS:\n\tcase TLBI_IPAS2E1NXS:\n\tcase TLBI_RIPAS2E1NXS:\n\tcase TLBI_RIPAS2E1OSNXS:\n\tcase TLBI_IPAS2LE1OSNXS:\n\tcase TLBI_IPAS2LE1NXS:\n\tcase TLBI_RIPAS2LE1NXS:\n\tcase TLBI_RIPAS2LE1OSNXS:\n\tcase TLBI_RVAE2OSNXS:\n\tcase TLBI_VMALLWS2E1OSNXS:\n\tcase TLBI_RVALE2OSNXS:\n\tcase TLBI_RVAE2NXS:\n\tcase TLBI_VMALLWS2E1NXS:\n\tcase TLBI_RVALE2NXS:\n\tcase TLBI_ALLE2NXS:\n\tcase TLBI_VAE2NXS:\n\tcase TLBI_ALLE1NXS:\n\tcase TLBI_VALE2NXS:\n\tcase TLBI_VMALLS12E1NXS:\n\tcase TLBI_ALLE3OS:\n\tcase TLBI_VAE3OS:\n\tcase TLBI_PAALLOS:\n\tcase TLBI_VALE3OS:\n\tcase TLBI_RVAE3IS:\n\tcase TLBI_RVALE3IS:\n\tcase TLBI_ALLE3IS:\n\tcase TLBI_VAE3IS:\n\tcase TLBI_VALE3IS:\n\tcase TLBI_RPAOS:\n\tcase TLBI_RPALOS:\n\tcase TLBI_RVAE3OS:\n\tcase TLBI_RVALE3OS:\n\tcase TLBI_RVAE3:\n\tcase TLBI_RVALE3:\n\tcase TLBI_ALLE3:\n\tcase TLBI_VAE3:\n\tcase TLBI_PAALL:\n\tcase TLBI_VALE3:\n\tcase TLBI_ALLE3OSNXS:\n\tcase TLBI_VAE3OSNXS:\n\tcase TLBI_VALE3OSNXS:\n\tcase TLBI_RVAE3ISNXS:\n\tcase TLBI_RVALE3ISNXS:\n\tcase TLBI_ALLE3ISNXS:\n\tcase TLBI_VAE3ISNXS:\n\tcase TLBI_VALE3ISNXS:\n\tcase TLBI_RVAE3OSNXS:\n\tcase TLBI_RVALE3OSNXS:\n\tcase TLBI_RVAE3NXS:\n\tcase TLBI_RVALE3NXS:\n\tcase TLBI_ALLE3NXS:\n\tcase TLBI_VAE3NXS:\n\tcase TLBI_VALE3NXS:\n\t\treturn Sys_TLBI;  // IPAS2E1IS\n//\tcase 0b10010000000001:\n//\t\treturn Sys_TLBI;  // IPAS2E1IS\n//\tcase 0b10010000000101:\n//\t\treturn Sys_TLBI;  // IPAS2LE1IS\n//\tcase 0b00010000011000:\n//\t\treturn Sys_TLBI;  // VMALLE1IS\n//\tcase 0b10010000011000:\n//\t\treturn Sys_TLBI;  // ALLE2IS\n//\tcase 0b11010000011000:\n//\t\treturn Sys_TLBI;  // ALLE3IS\n//\tcase 0b00010000011001:\n//\t\treturn Sys_TLBI;  // VAE1IS\n//\tcase 0b10010000011001:\n//\t\treturn Sys_TLBI;  // VAE2IS\n//\tcase 0b11010000011001:\n//\t\treturn Sys_TLBI;  // VAE3IS\n//\tcase 0b00010000011010:\n//\t\treturn Sys_TLBI;  // ASIDE1IS\n//\tcase 0b00010000011011:\n//\t\treturn Sys_TLBI;  // VAAE1IS\n//\tcase 0b10010000011100:\n//\t\treturn Sys_TLBI;  // ALLE1IS\n//\tcase 0b00010000011101:\n//\t\treturn Sys_TLBI;  // VALE1IS\n//\tcase 0b10010000011101:\n//\t\treturn Sys_TLBI;  // VALE2IS\n//\tcase 0b11010000011101:\n//\t\treturn Sys_TLBI;  // VALE3IS\n//\tcase 0b10010000011110:\n//\t\treturn Sys_TLBI;  // VMALLS12E1IS\n//\tcase 0b00010000011111:\n//\t\treturn Sys_TLBI;  // VAALE1IS\n//\tcase 0b10010000100001:\n//\t\treturn Sys_TLBI;  // IPAS2E1\n//\tcase 0b10010000100101:\n//\t\treturn Sys_TLBI;  // IPAS2LE1\n//\tcase 0b00010000111000:\n//\t\treturn Sys_TLBI;  // VMALLE1\n//\tcase 0b10010000111000:\n//\t\treturn Sys_TLBI;  // ALLE2\n//\tcase 0b11010000111000:\n//\t\treturn Sys_TLBI;  // ALLE3\n//\tcase 0b00010000111001:\n//\t\treturn Sys_TLBI;  // VAE1\n//\tcase 0b10010000111001:\n//\t\treturn Sys_TLBI;  // VAE2\n//\tcase 0b11010000111001:\n//\t\treturn Sys_TLBI;  // VAE3\n//\tcase 0b00010000111010:\n//\t\treturn Sys_TLBI;  // ASIDE1\n//\tcase 0b00010000111011:\n//\t\treturn Sys_TLBI;  // VAAE1\n//\tcase 0b10010000111100:\n//\t\treturn Sys_TLBI;  // ALLE1\n//\tcase 0b00010000111101:\n//\t\treturn Sys_TLBI;  // VALE1\n//\tcase 0b10010000111101:\n//\t\treturn Sys_TLBI;  // VALE2\n//\tcase 0b11010000111101:\n//\t\treturn Sys_TLBI;  // VALE3\n//\tcase 0b10010000111110:\n//\t\treturn Sys_TLBI;  // VMALLS12E1\n//\tcase 0b00010000111111:\n//\t\treturn Sys_TLBI;  // VAALE1\n\tdefault:\n\t\treturn Sys_ERROR;\n\t}\n}\n\nuint32_t UInt(uint32_t foo)\n{\n\treturn foo;\n}\n\nuint32_t BitSlice(uint64_t foo, int hi, int lo)  // including the endpoints\n{\n\tint width = hi - lo + 1;\n\tuint64_t mask = (1 << width) - 1;\n\treturn (foo >> lo) & mask;\n}\n\nbool IsZero(uint64_t foo)\n{\n\treturn foo == 0;\n}\n\nbool IsOnes(uint64_t foo, int width)\n{\n\treturn foo == (1 << width) - 1;\n}\n\n/* Mozilla MPL\n  TODO: evaluate license, possibly rewrite\n  https://github.com/Siguza/iometa/blob/master/src/a64.c */\nuint64_t Replicate(uint64_t val, uint8_t times, uint64_t width)\n{\n\t// Fast path\n\tswitch (times)\n\t{\n\tcase 64:\n\t\tval |= val << width;\n\t\twidth <<= 1;\n\tcase 32:\n\t\tval |= val << width;\n\t\twidth <<= 1;\n\tcase 16:\n\t\tval |= val << width;\n\t\twidth <<= 1;\n\tcase 8:\n\t\tval |= val << width;\n\t\twidth <<= 1;\n\tcase 4:\n\t\tval |= val << width;\n\t\twidth <<= 1;\n\tcase 2:\n\t\tval |= val << width;\n\tcase 1:\n\t\treturn val;\n\tcase 0:\n\t\treturn 0;\n\tdefault:\n\t\tbreak;\n\t}\n\t// Slow path\n\tuint64_t orig = val;\n\tfor (size_t i = 0; i < times; ++i)\n\t{\n\t\tval <<= width;\n\t\tval |= orig;\n\t}\n\treturn val;\n}\n\n/* Mozilla MPL\n  TODO: evaluate license, possibly rewrite\n  https://github.com/Siguza/iometa/blob/master/src/a64.c */\nuint64_t AdvSIMDExpandImm(uint8_t op, uint8_t cmode, uint64_t imm8)\n{\n\tuint64_t imm64;\n\tswitch ((cmode >> 1) & 0b111)\n\t{\n\tcase 0b000:\n\t\timm64 = Replicate(imm8, 2, 32);\n\t\tbreak;\n\tcase 0b001:\n\t\timm64 = Replicate(imm8 << 8, 2, 32);\n\t\tbreak;\n\tcase 0b010:\n\t\timm64 = Replicate(imm8 << 16, 2, 32);\n\t\tbreak;\n\tcase 0b011:\n\t\timm64 = Replicate(imm8 << 24, 2, 32);\n\t\tbreak;\n\tcase 0b100:\n\t\timm64 = Replicate(imm8, 4, 16);\n\t\tbreak;\n\tcase 0b101:\n\t\timm64 = Replicate(imm8 << 8, 4, 16);\n\t\tbreak;\n\tcase 0b110:\n\t\timm64 = Replicate(imm8 << (8 << (cmode & 0b1)), 2, 32);\n\t\tbreak;\n\tcase 0b111:\n\t\tswitch (((cmode & 0b1) << 1) | op)\n\t\t{\n\t\tcase 0b00:\n\t\t\timm64 = Replicate(imm8, 8, 8);\n\t\t\tbreak;\n\t\tcase 0b01:\n#if 0\n\t\t\t\t\timm8a = Replicate((imm8 >> 7) & 0b1, 8, 1);\n\t\t\t\t\timm8b = Replicate((imm8 >> 6) & 0b1, 8, 1);\n\t\t\t\t\timm8c = Replicate((imm8 >> 5) & 0b1, 8, 1);\n\t\t\t\t\timm8d = Replicate((imm8 >> 4) & 0b1, 8, 1);\n\t\t\t\t\timm8e = Replicate((imm8 >> 3) & 0b1, 8, 1);\n\t\t\t\t\timm8f = Replicate((imm8 >> 2) & 0b1, 8, 1);\n\t\t\t\t\timm8g = Replicate((imm8 >> 1) & 0b1, 8, 1);\n\t\t\t\t\timm8h = Replicate((imm8\t ) & 0b1, 8, 1);\n\t\t\t\t\timm64 = (imm8a << 0x38) | (imm8b << 0x30) | (imm8c << 0x28) | (imm8d << 0x20) | (imm8e << 0x18) | (imm8f << 0x10) | (imm8g << 0x08) | imm8h;\n#else\n\t\t\timm64 = imm8 | (imm8 << (0x08 - 1)) | (imm8 << (0x10 - 2)) | (imm8 << (0x18 - 3)) |\n\t\t\t        (imm8 << (0x20 - 4)) | (imm8 << (0x28 - 5)) | (imm8 << (0x30 - 6)) |\n\t\t\t        (imm8 << (0x38 - 7));\n\t\t\timm64 &= 0x0101010101010101;\n\t\t\timm64 = Replicate(imm64, 8, 1);\n#endif\n\t\t\tbreak;\n\t\tcase 0b10:\n\t\t\timm64 = Replicate((((imm8 & 0xc0) ^ 0x80) << 24) |\n\t\t\t                      (Replicate((imm8 >> 6) & 0b1, 5, 1) << 25) | ((imm8 & 0x3f) << 19),\n\t\t\t    2, 32);\n\t\t\tbreak;\n\t\tcase 0b11:\n\t\t\timm64 = (((imm8 & 0xc0) ^ 0x80) << 56) | (Replicate((imm8 >> 6) & 0b1, 8, 1) << 54) |\n\t\t\t        ((imm8 & 0x3f) << 48);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\treturn imm64;\n}\n\nbool BTypeCompatible_BTI(uint8_t hintcode, uint8_t pstate_btype)\n{\n\tswitch (hintcode & 3)\n\t{\n\tcase 0b00:\n\t\treturn false;\n\tcase 0b01:\n\t\treturn pstate_btype != 0b11;\n\tcase 0b10:\n\t\treturn pstate_btype != 0b10;\n\tcase 0b11:\n\t\treturn true;\n\t}\n\n\treturn false; /* impossible, but appease compiler */\n}\n\nbool BTypeCompatible_PACIXSP()\n{\n\t// TODO: determine if filling this in is necessary\n\treturn true;\n}\n\nenum FPRounding FPDecodeRounding(uint8_t RMode)\n{\n\tswitch (RMode & 3)\n\t{\n\tcase 0b00:\n\t\treturn FPRounding_TIEEVEN;  // N\n\tcase 0b01:\n\t\treturn FPRounding_POSINF;  // P\n\tcase 0b10:\n\t\treturn FPRounding_NEGINF;  // M\n\tcase 0b11:\n\t\treturn FPRounding_ZERO;  // Z\n\t}\n\n\treturn FPRounding_ERROR;\n}\n\nenum FPRounding FPRoundingMode(uint64_t fpcr)\n{\n\treturn FPDecodeRounding(FPCR_GET_RMode(fpcr));\n}\n\nbool HaltingAllowed(void)\n{\n\t// TODO: determine if filling this in is necessary\n\treturn true;\n}\n\n// AArch64.SystemAccessTrap\nvoid SystemAccessTrap(uint32_t a, uint32_t b)\n{\n\t// TODO: determine if filling this in is necessary\n\twhile (0)\n\t\t;\n}\n\nvoid CheckSystemAccess(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g)\n{\n\t// TODO: determine if filling this in is necessary\n\twhile (0)\n\t\t;\n}\n\n// from LLVM\n// TODO: check license, determine if rewrite needed\nuint64_t VFPExpandImm(unsigned char byte, unsigned N)\n{\n\t// assert(N == 32 || N == 64);\n\n\tuint64_t Result;\n\tunsigned bit6 = SLICE(byte, 6, 6);\n\tif (N == 32)\n\t{\n\t\tResult = SLICE(byte, 7, 7) << 31 | SLICE(byte, 5, 0) << 19;\n\t\tif (bit6)\n\t\t\tResult |= 0x1f << 25;\n\t\telse\n\t\t\tResult |= 0x1 << 30;\n\t}\n\telse\n\t{\n\t\tResult = (uint64_t)SLICE(byte, 7, 7) << 63 | (uint64_t)SLICE(byte, 5, 0) << 48;\n\t\tif (bit6)\n\t\t\tResult |= 0xffULL << 54;\n\t\telse\n\t\t\tResult |= 0x1ULL << 62;\n\t}\n\n\t// return APInt(N, Result);\n\treturn Result;\n}\n\nbool EL2Enabled(void)\n{\n\t// TODO: determine if filling this in is necessary\n\treturn true;\n}\n\nbool ELUsingAArch32(uint8_t x)\n{\n\t// TODO: determine if filling this in is necessary\n\treturn true;\n}\n\nuint64_t FPOne(bool sign, int N)\n{\n\t// width should be 16, 32, 64\n\tint E, F, exp;\n\n\tswitch (N)\n\t{\n\tcase 16:\n\t\tE = 5;\n\tcase 32:\n\t\tE = 8;\n\tdefault:\n\t\tE = 11;\n\t}\n\n\tF = N - (E + 1);\n\texp = BITMASK(E - 1) << 1;\n\treturn (sign << (E - 1 + F)) | (exp << F);\n}\n\nuint64_t FPTwo(bool sign, int N)\n{\n\t// width should be 16, 32, 64\n\t//int F;\n\tint E, exp;\n\n\tswitch (N)\n\t{\n\tcase 16:\n\t\tE = 5;\n\tcase 32:\n\t\tE = 8;\n\tdefault:\n\t\tE = 11;\n\t}\n\n\t//F = N - (E + 1);\n\texp = 1 << (E - 1);\n\treturn (sign << E) | exp;\n}\n\nuint64_t FPPointFive(bool sign, int N)\n{\n\t// width should be 16, 32, 64\n\tint E, F, exp;\n\n\tswitch (N)\n\t{\n\tcase 16:\n\t\tE = 5;\n\tcase 32:\n\t\tE = 8;\n\tdefault:\n\t\tE = 11;\n\t}\n\n\tF = N - (E + 1);\n\texp = BITMASK(E - 2) << 1;\n\treturn (sign << (E - 2 + F)) | (exp << F);\n}\n\nuint64_t SignExtend(uint64_t x, int width)\n{\n\tuint64_t result = -1;\n\n\tif (x & ((uint64_t)1 << (width - 1)))\n\t{\n\t\tresult ^= (((uint64_t)1 << width) - 1);\n\t\tresult |= x;\n\t}\n\telse\n\t{\n\t\tresult = x;\n\t}\n\n\treturn result;\n}\n\nenum Constraint ConstrainUnpredictable(enum Unpredictable u)\n{\n\tswitch (u)\n\t{\n\tcase Unpredictable_VMSR:\n\t\treturn Constraint_UNDEF;\n\tcase Unpredictable_WBOVERLAPLD:\n\t\treturn Constraint_WBSUPPRESS;  // return loaded value\n\tcase Unpredictable_WBOVERLAPST:\n\t\treturn Constraint_NONE;  // store pre-writeback value\n\tcase Unpredictable_LDPOVERLAP:\n\t\treturn Constraint_UNDEF;  // instruction is UNDEFINED\n\tcase Unpredictable_BASEOVERLAP:\n\t\treturn Constraint_NONE;  // use original address\n\tcase Unpredictable_DATAOVERLAP:\n\t\treturn Constraint_NONE;  // store original value\n\tcase Unpredictable_DEVPAGE2:\n\t\treturn Constraint_FAULT;  // take an alignment fault\n\tcase Unpredictable_DEVICETAGSTORE:\n\t\treturn Constraint_NONE;  // Do not take a fault\n\tcase Unpredictable_INSTRDEVICE:\n\t\treturn Constraint_NONE;  // Do not take a fault\n\tcase Unpredictable_RESCPACR:\n\t\treturn Constraint_TRUE;  // Map to UNKNOWN value\n\tcase Unpredictable_RESMAIR:\n\t\treturn Constraint_UNKNOWN;  // Map to UNKNOWN value\n\tcase Unpredictable_RESTEXCB:\n\t\treturn Constraint_UNKNOWN;  // Map to UNKNOWN value\n\tcase Unpredictable_RESDACR:\n\t\treturn Constraint_UNKNOWN;  // Map to UNKNOWN value\n\tcase Unpredictable_RESPRRR:\n\t\treturn Constraint_UNKNOWN;  // Map to UNKNOWN value\n\tcase Unpredictable_RESVTCRS:\n\t\treturn Constraint_UNKNOWN;  // Map to UNKNOWN value\n\tcase Unpredictable_RESTnSZ:\n\t\treturn Constraint_FORCE;  // Map to the limit value\n\tcase Unpredictable_OORTnSZ:\n\t\treturn Constraint_FORCE;  // Map to the limit value\n\tcase Unpredictable_LARGEIPA:\n\t\treturn Constraint_FORCE;  // Restrict the inputsize to the PAMax value\n\tcase Unpredictable_ESRCONDPASS:\n\t\treturn Constraint_FALSE;  // Report as \"AL\"\n\tcase Unpredictable_ILZEROIT:\n\t\treturn Constraint_FALSE;  // Do not zero PSTATE.IT\n\tcase Unpredictable_ILZEROT:\n\t\treturn Constraint_FALSE;  // Do not zero PSTATE.T\n\tcase Unpredictable_BPVECTORCATCHPRI:\n\t\treturn Constraint_TRUE;  // Debug Vector Catch: match on 2nd halfword\n\tcase Unpredictable_VCMATCHHALF:\n\t\treturn Constraint_FALSE;  // No match\n\tcase Unpredictable_VCMATCHDAPA:\n\t\treturn Constraint_FALSE;  // No match on Data Abort or Prefetch abort\n\tcase Unpredictable_WPMASKANDBAS:\n\t\treturn Constraint_FALSE;  // Watchpoint disabled\n\tcase Unpredictable_WPBASCONTIGUOUS:\n\t\treturn Constraint_FALSE;  // Watchpoint disabled\n\tcase Unpredictable_RESWPMASK:\n\t\treturn Constraint_DISABLED;  // Watchpoint disabled\n\tcase Unpredictable_WPMASKEDBITS:\n\t\treturn Constraint_FALSE;  // Watchpoint disabled\n\tcase Unpredictable_RESBPWPCTRL:\n\t\treturn Constraint_DISABLED;  // Breakpoint/watchpoint disabled\n\tcase Unpredictable_BPNOTIMPL:\n\t\treturn Constraint_DISABLED;  // Breakpoint disabled\n\tcase Unpredictable_RESBPTYPE:\n\t\treturn Constraint_DISABLED;  // Breakpoint disabled\n\tcase Unpredictable_BPNOTCTXCMP:\n\t\treturn Constraint_DISABLED;  // Breakpoint disabled\n\tcase Unpredictable_BPMATCHHALF:\n\t\treturn Constraint_FALSE;  // No match\n\tcase Unpredictable_BPMISMATCHHALF:\n\t\treturn Constraint_FALSE;  // No match\n\tcase Unpredictable_RESTARTALIGNPC:\n\t\treturn Constraint_FALSE;  // Do not force alignment\n\tcase Unpredictable_RESTARTZEROUPPERPC:\n\t\treturn Constraint_TRUE;  // Force zero extension\n\tcase Unpredictable_ZEROUPPER:\n\t\treturn Constraint_TRUE;  // zero top halves of X registers\n\tcase Unpredictable_ERETZEROUPPERPC:\n\t\treturn Constraint_TRUE;  // zero top half of PC\n\tcase Unpredictable_A32FORCEALIGNPC:\n\t\treturn Constraint_FALSE;  // Do not force alignment\n\tcase Unpredictable_SMD:\n\t\treturn Constraint_UNDEF;  // disabled SMC is Unallocated\n\tcase Unpredictable_NONFAULT:\n\t\treturn Constraint_FALSE;  // Speculation enabled\n\tcase Unpredictable_SVEZEROUPPER:\n\t\treturn Constraint_TRUE;  // zero top bits of Z registers\n\tcase Unpredictable_SVELDNFDATA:\n\t\treturn Constraint_TRUE;  // Load mem data in NF loads\n\tcase Unpredictable_SVELDNFZERO:\n\t\treturn Constraint_TRUE;  // Write zeros in NF loads\n\tcase Unpredictable_CHECKSPNONEACTIVE:\n\t\treturn Constraint_TRUE;  // Check SP alignment\n\tcase Unpredictable_AFUPDATE:\n\t\treturn Constraint_TRUE;\n\tcase Unpredictable_IESBinDebug:\n\t\treturn Constraint_TRUE;\n\tcase Unpredictable_BADPMSFCR:\n\t\treturn Constraint_TRUE;\n\tcase Unpredictable_ZEROBTYPE:\n\t\treturn Constraint_TRUE;  // Save BTYPE in SPSR_ELx/DPSR_EL0 as '00'\n\tcase Unpredictable_CLEARERRITEZERO:\n\t\treturn Constraint_FALSE;\n\tcase Unpredictable_ALUEXCEPTIONRETURN:\n\t\treturn Constraint_UNDEF;\n\tcase Unpredictable_DBGxVR_RESS:\n\t\treturn Constraint_FALSE;\n\tcase Unpredictable_WFxTDEBUG:\n\t\treturn Constraint_FALSE;  // WFxT in Debug state does not execute as a NOP\n\tcase Unpredictable_LS64UNSUPPORTED:\n\t\treturn Constraint_LIMITED_ATOMICITY;  //\n\tdefault:\n\t\treturn Constraint_ERROR;\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/pcode.h",
    "content": "#include \"feature_flags.h\"\n\n#define INSWORD (ctx->insword)\n#define UNDEFINED \\\n\t{ \\\n\t\treturn DECODE_STATUS_UNDEFINED; \\\n\t}\n#define UNMATCHED \\\n\t{ \\\n\t\treturn DECODE_STATUS_UNMATCHED; \\\n\t}\n#define RESERVED(X) \\\n\t{ \\\n\t\treturn DECODE_STATUS_RESERVED; \\\n\t}\n#define UNALLOCATED(X) \\\n\t{ \\\n\t\tdec->encoding = (X); \\\n\t\treturn DECODE_STATUS_UNALLOCATED; \\\n\t}\n#define ENDOFINSTRUCTION \\\n\t{ \\\n\t\treturn DECODE_STATUS_END_OF_INSTRUCTION; \\\n\t}\n#define SEE \\\n\t{ \\\n\t\treturn DECODE_STATUS_LOST; \\\n\t}\n#define UNREACHABLE \\\n\t{ \\\n\t\treturn DECODE_STATUS_UNREACHABLE; \\\n\t}\n/* do NOT return immediately! post-decode pcode might still need to run */\n#define OK(X) \\\n\t{ \\\n\t\tinstr->encoding = (X); \\\n\t\tinstr->operation = enc_to_oper(X); \\\n\t\trc = DECODE_STATUS_OK; \\\n\t}\n#define assert(X) \\\n\tif (!(X)) \\\n\t{ \\\n\t\treturn DECODE_STATUS_ASSERT_FAILED; \\\n\t}\n\n#define BITMASK(N)            (((uint64_t)1 << (N)) - 1)\n#define SLICE(X, MSB, LSB)    (((X) >> (LSB)) & BITMASK((MSB) - (LSB) + 1)) /* get bits [MSB,LSB] */\n#define CONCAT(A, B, B_WIDTH) (((A) << (B_WIDTH)) | (B))\n#define NOT(X, X_WIDTH)       ((X) ^ BITMASK(X_WIDTH))\n\n#define DecodeBitMasksCheckUndefined(N, imms) \\\n\tif ((N == 0 && \\\n\t        (imms == 0x3D || imms == 0x3B || imms == 0x37 || imms == 0x2F || imms == 0x1F)) || \\\n\t    (N == 1 && imms == 0x3F)) \\\n\t{ \\\n\t\treturn DECODE_STATUS_UNDEFINED; \\\n\t}\n\n#define UINT(x)          (unsigned int)(x)\n#define SInt(X, X_WIDTH) SignExtend((X), (X_WIDTH))\n#define INT(x)           (signed int)(x)\n#define ZeroExtend(X, Y) (uint64_t)(X)\n#define LSL(X, Y)        ((X) << (Y))\n\n#define LOG2_TAG_GRANULE 4\n#define TAG_GRANULE      (1 << LOG2_TAG_GRANULE)\n\n/* pcode -> cpp booleans */\n#define TRUE  true\n#define FALSE false\n\n/* these calls just check generated per-iform boolean variables */\n#define EncodingLabeled32Bit() (encoding32)\n#define EncodingLabeled64Bit() (encoding64)\n\n// extras we find in spec tables, etc.\n#define HaveTLBIOS()    (1)\n#define HaveTLBIRANGE() (1)\n#define HaveDCCVADP()   (1)\n#define HaveDCPoP()     (1)\n\n#define SetBTypeCompatible(X) ctx->BTypeCompatible = (X)\n#define SetBTypeNext(X)       ctx->BTypeNext = (X)\n#define Halted()              ctx->halted\n\nenum SystemOp\n{\n\tSys_ERROR = -1,\n\tSys_AT = 0,\n\tSys_DC = 1,\n\tSys_IC = 2,\n\tSys_TLBI = 3,\n\tSys_SYS = 4,\n};\n\nenum ReduceOp\n{\n\tReduceOp_ERROR = 0,\n\tReduceOp_ADD,\n\tReduceOp_FADD,\n\tReduceOp_FMIN,\n\tReduceOp_FMAX,\n\tReduceOp_FMINNUM,\n\tReduceOp_FMAXNUM,\n};\n\nenum LogicalOp\n{\n\tLogicalOp_ERROR = 0,\n\tLogicalOp_AND,\n\tLogicalOp_EOR,\n\tLogicalOp_ORR\n};\n\nenum BranchType\n{\n\tBranchType_ERROR = 0,\n\tBranchType_DIRCALL,    // Direct Branch with link\n\tBranchType_INDCALL,    // Indirect Branch with link\n\tBranchType_ERET,       // Exception return (indirect)\n\tBranchType_DBGEXIT,    // Exit from Debug state\n\tBranchType_RET,        // Indirect branch with function return hint\n\tBranchType_DIR,        // Direct branch\n\tBranchType_INDIR,      // Indirect branch\n\tBranchType_EXCEPTION,  // Exception entry\n\tBranchType_RESET,      // Reset\n\tBranchType_UNKNOWN     // Other\n};\n\nenum VBitOp\n{\n\tVBitOp_ERROR = 0,\n\tVBitOp_VBIF,\n\tVBitOp_VBIT,\n\tVBitOp_VBSL,\n\tVBitOp_VEOR\n};\n\nenum SystemHintOp\n{\n\tSystemHintOp_ERROR = 0,\n\tSystemHintOp_NOP,\n\tSystemHintOp_YIELD,\n\tSystemHintOp_WFE,\n\tSystemHintOp_WFI,\n\tSystemHintOp_SEV,\n\tSystemHintOp_SEVL,\n\tSystemHintOp_DGH,\n\tSystemHintOp_ESB,\n\tSystemHintOp_PSB,\n\tSystemHintOp_TSB,\n\tSystemHintOp_BTI,\n\tSystemHintOp_CSDB,\n\tSystemHintOp_WFET,\n\tSystemHintOp_WFIT,\n};\n\nenum ImmediateOp\n{\n\tImmediateOp_ERROR = 0,\n\tImmediateOp_MOVI,\n\tImmediateOp_MVNI,\n\tImmediateOp_ORR,\n\tImmediateOp_BIC\n};\n\nenum AccType\n{\n\tAccType_ERROR = 0,\n\tAccType_ATOMICRW,\n\tAccType_ATOMIC,\n\tAccType_LIMITEDORDERED,\n\tAccType_ORDEREDATOMICRW,\n\tAccType_ORDEREDATOMIC,\n\tAccType_ORDERED\n};\n\nenum CompareOp\n{\n\tCompareOp_ERROR = 0,\n\tCompareOp_EQ,\n\tCompareOp_GE,\n\tCompareOp_GT,\n\tCompareOp_LE,\n\tCompareOp_LT\n};\n\nenum Constraint\n{\n\tConstraint_ERROR = 0,\n\tConstraint_DISABLED,\n\tConstraint_FALSE,\n\tConstraint_FAULT,\n\tConstraint_FORCE,\n\tConstraint_LIMITED_ATOMICITY,\n\tConstraint_NONE,\n\tConstraint_NOP,\n\tConstraint_TRUE,\n\tConstraint_UNDEF,\n\tConstraint_UNKNOWN,\n\tConstraint_WBSUPPRESS,\n};\n\nenum CountOp\n{\n\tCountOp_ERROR = 0,\n\tCountOp_CLS,\n\tCountOp_CLZ\n};\n\nenum DSBAlias\n{\n\tDSBAlias_DSB = 0,\n\tDSBAlias_SSBB,\n\tDSBAlias_PSSBB\n};\n\nenum MBReqDomain\n{\n\tMBReqDomain_ERROR = 0,\n\tMBReqDomain_Nonshareable,\n\tMBReqDomain_InnerShareable,\n\tMBReqDomain_OuterShareable,\n\tMBReqDomain_FullSystem\n};\n\nenum MBReqTypes\n{\n\tMBReqTypes_ERROR = 0,\n\tMBReqTypes_Reads,\n\tMBReqTypes_Writes,\n\tMBReqTypes_All\n};\n\nenum FPUnaryOp\n{\n\tFPUnaryOp_ERROR = 0,\n\tFPUnaryOp_ABS,\n\tFPUnaryOp_MOV,\n\tFPUnaryOp_NEG,\n\tFPUnaryOp_SQRT\n};\n\nenum FPConvOp\n{\n\tFPConvOp_ERROR = 0,\n\tFPConvOp_CVT_FtoI,\n\tFPConvOp_CVT_ItoF,\n\tFPConvOp_MOV_FtoI,\n\tFPConvOp_MOV_ItoF,\n\tFPConvOp_CVT_FtoI_JS\n};\n\nenum FPMaxMinOp\n{\n\tFPMaxMinOp_ERROR = 0,\n\tFPMaxMinOp_MAX,\n\tFPMaxMinOp_MIN,\n\tFPMaxMinOp_MAXNUM,\n\tFPMaxMinOp_MINNUM\n};\n\nenum FPRounding\n{\n\tFPRounding_ERROR = 0,\n\tFPRounding_TIEEVEN,\n\tFPRounding_POSINF,\n\tFPRounding_NEGINF,\n\tFPRounding_ZERO,\n\tFPRounding_TIEAWAY,\n\tFPRounding_ODD\n};\n\nenum MemAtomicOp\n{\n\tMemAtomicOp_ERROR = 0,\n\tMemAtomicOp_ADD,\n\tMemAtomicOp_BIC,\n\tMemAtomicOp_EOR,\n\tMemAtomicOp_ORR,\n\tMemAtomicOp_SMAX,\n\tMemAtomicOp_SMIN,\n\tMemAtomicOp_UMAX,\n\tMemAtomicOp_UMIN,\n\tMemAtomicOp_SWP\n};\n\nenum MemOp\n{\n\tMemOp_ERROR = 0,\n\tMemOp_LOAD,\n\tMemOp_STORE,\n\tMemOp_PREFETCH\n};\n\nenum MoveWideOp\n{\n\tMoveWideOp_ERROR = 0,\n\tMoveWideOp_N,\n\tMoveWideOp_Z,\n\tMoveWideOp_K\n};\n\nenum PSTATEField\n{\n\tPSTATEField_ERROR = 0,\n\tPSTATEField_DAIFSet,\n\tPSTATEField_DAIFClr,\n\tPSTATEField_PAN,  // Armv8.1\n\tPSTATEField_UAO,  // Armv8.2\n\tPSTATEField_DIT,  // Armv8.4\n\tPSTATEField_SSBS,\n\tPSTATEField_TCO,  // Armv8.5\n\tPSTATEField_SP,\n\tPSTATEField_SVCRZA,\n\tPSTATEField_SVCRSM,\n\tPSTATEField_SVCRSMZA\n};\n\nenum SVECmp\n{\n\tCmp_ERROR = -1,\n\tCmp_EQ,\n\tCmp_NE,\n\tCmp_GE,\n\tCmp_GT,\n\tCmp_LT,\n\tCmp_LE,\n\tCmp_UN\n};\n\nenum PrefetchHint\n{\n\tPrefetch_ERROR = -1,\n\tPrefetch_READ,\n\tPrefetch_WRITE,\n\tPrefetch_EXEC\n};\n\nenum Unpredictable\n{\n\tUnpredictable_ERROR = -1,\n\tUnpredictable_VMSR,\n\tUnpredictable_WBOVERLAPLD,\n\tUnpredictable_WBOVERLAPST,\n\tUnpredictable_LDPOVERLAP,\n\tUnpredictable_BASEOVERLAP,\n\tUnpredictable_DATAOVERLAP,\n\tUnpredictable_DEVPAGE2,\n\tUnpredictable_DEVICETAGSTORE,\n\tUnpredictable_INSTRDEVICE,\n\tUnpredictable_RESCPACR,\n\tUnpredictable_RESMAIR,\n\tUnpredictable_RESTEXCB,\n\tUnpredictable_RESDACR,\n\tUnpredictable_RESPRRR,\n\tUnpredictable_RESVTCRS,\n\tUnpredictable_RESTnSZ,\n\tUnpredictable_OORTnSZ,\n\tUnpredictable_LARGEIPA,\n\tUnpredictable_ESRCONDPASS,\n\tUnpredictable_ILZEROIT,\n\tUnpredictable_ILZEROT,\n\tUnpredictable_BPVECTORCATCHPRI,\n\tUnpredictable_VCMATCHHALF,\n\tUnpredictable_VCMATCHDAPA,\n\tUnpredictable_WPMASKANDBAS,\n\tUnpredictable_WPBASCONTIGUOUS,\n\tUnpredictable_RESWPMASK,\n\tUnpredictable_WPMASKEDBITS,\n\tUnpredictable_RESBPWPCTRL,\n\tUnpredictable_BPNOTIMPL,\n\tUnpredictable_RESBPTYPE,\n\tUnpredictable_BPNOTCTXCMP,\n\tUnpredictable_BPMATCHHALF,\n\tUnpredictable_BPMISMATCHHALF,\n\tUnpredictable_RESTARTALIGNPC,\n\tUnpredictable_RESTARTZEROUPPERPC,\n\tUnpredictable_ZEROUPPER,\n\tUnpredictable_ERETZEROUPPERPC,\n\tUnpredictable_A32FORCEALIGNPC,\n\tUnpredictable_SMD,\n\tUnpredictable_NONFAULT,\n\tUnpredictable_SVEZEROUPPER,\n\tUnpredictable_SVELDNFDATA,\n\tUnpredictable_SVELDNFZERO,\n\tUnpredictable_CHECKSPNONEACTIVE,\n\tUnpredictable_AFUPDATE,     // AF update for alignment or permission fault,\n\tUnpredictable_IESBinDebug,  // Use SCTLR[].IESB in Debug state,\n\tUnpredictable_BADPMSFCR,    // Bad settings for PMSFCR_EL1/PMSEVFR_EL1/PMSLATFR_EL1,\n\tUnpredictable_ZEROBTYPE,\n\tUnpredictable_CLEARERRITEZERO,  // Clearing sticky errors when instruction in flight,\n\tUnpredictable_ALUEXCEPTIONRETURN,\n\tUnpredictable_DBGxVR_RESS,\n\tUnpredictable_WFxTDEBUG,\n\tUnpredictable_LS64UNSUPPORTED,\n};\n\ntypedef struct DecodeBitMasks_ReturnType_\n{\n\tuint64_t wmask;\n\tuint64_t tmask;\n} DecodeBitMasks_ReturnType;\n\nint HighestSetBit(uint64_t x);\nint LowestSetBit(uint64_t x);\n\nbool BFXPreferred(uint32_t sf, uint32_t uns, uint32_t imms, uint32_t immr);\nint BitCount(uint32_t x);\nDecodeBitMasks_ReturnType DecodeBitMasks(\n    uint8_t /*bit*/ immN, uint8_t /*bit(6)*/ imms, uint8_t /*bit(6)*/ immr);\n\nenum Constraint ConstrainUnpredictable(enum Unpredictable);\nbool MoveWidePreferred(uint32_t sf, uint32_t immN, uint32_t imms, uint32_t immr);\nbool SVEMoveMaskPreferred(uint32_t imm13);\nenum ShiftType DecodeRegExtend(uint8_t op);\nenum ShiftType DecodeShift(uint8_t op);\nenum SystemOp SysOp(uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2);\nuint32_t UInt(uint32_t);\nuint32_t BitSlice(uint64_t, int hi, int lo);  // including the endpoints\nbool IsZero(uint64_t foo);\nbool IsOnes(uint64_t foo, int width);\nuint64_t Replicate(uint64_t val, uint8_t times, uint64_t width);\nuint64_t AdvSIMDExpandImm(uint8_t op, uint8_t cmode, uint64_t imm8);\n\nbool BTypeCompatible_BTI(uint8_t hintcode, uint8_t pstate_btype);\nbool BTypeCompatible_PACIXSP(void);\n\nenum FPRounding FPDecodeRounding(uint8_t RMode);\nenum FPRounding FPRoundingMode(uint64_t fpcr);\n\nbool HaltingAllowed(void);\nvoid SystemAccessTrap(uint32_t a, uint32_t b);\nvoid CheckSystemAccess(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);\n\nuint64_t VFPExpandImm(uint8_t imm8, unsigned width);\n\n#define EL0 0\n#define EL1 1\n#define EL2 2\n#define EL3 3\nbool EL2Enabled(void);\nbool ELUsingAArch32(uint8_t);\n\nuint64_t FPOne(bool sign, int width);\nuint64_t FPTwo(bool sign, int width);\nuint64_t FPPointFive(bool sign, int width);\n\nuint64_t SignExtend(uint64_t x, int width);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/regs.c",
    "content": "#include \"regs.h\"\n\n//-----------------------------------------------------------------------------\n// registers (and related) to string\n//-----------------------------------------------------------------------------\n\nstatic const char* RegisterString[] = {\"NONE\", \"w0\", \"w1\", \"w2\", \"w3\", \"w4\", \"w5\", \"w6\", \"w7\", \"w8\",\n    \"w9\", \"w10\", \"w11\", \"w12\", \"w13\", \"w14\", \"w15\", \"w16\", \"w17\", \"w18\", \"w19\", \"w20\", \"w21\", \"w22\",\n    \"w23\", \"w24\", \"w25\", \"w26\", \"w27\", \"w28\", \"w29\", \"w30\", \"wzr\", \"wsp\", \"x0\", \"x1\", \"x2\", \"x3\",\n    \"x4\", \"x5\", \"x6\", \"x7\", \"x8\", \"x9\", \"x10\", \"x11\", \"x12\", \"x13\", \"x14\", \"x15\", \"x16\", \"x17\",\n    \"x18\", \"x19\", \"x20\", \"x21\", \"x22\", \"x23\", \"x24\", \"x25\", \"x26\", \"x27\", \"x28\", \"x29\", \"x30\",\n    \"xzr\", \"sp\", \"v0\", \"v1\", \"v2\", \"v3\", \"v4\", \"v5\", \"v6\", \"v7\", \"v8\", \"v9\", \"v10\", \"v11\", \"v12\",\n    \"v13\", \"v14\", \"v15\", \"v16\", \"v17\", \"v18\", \"v19\", \"v20\", \"v21\", \"v22\", \"v23\", \"v24\", \"v25\",\n    \"v26\", \"v27\", \"v28\", \"v29\", \"v30\", \"v31\", \"b0\", \"b1\", \"b2\", \"b3\", \"b4\", \"b5\", \"b6\", \"b7\",\n    \"b8\", \"b9\", \"b10\", \"b11\", \"b12\", \"b13\", \"b14\", \"b15\", \"b16\", \"b17\", \"b18\", \"b19\", \"b20\", \"b21\",\n    \"b22\", \"b23\", \"b24\", \"b25\", \"b26\", \"b27\", \"b28\", \"b29\", \"b30\", \"b31\", \"h0\", \"h1\", \"h2\",\n    \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"h8\", \"h9\", \"h10\", \"h11\", \"h12\", \"h13\", \"h14\", \"h15\", \"h16\",\n    \"h17\", \"h18\", \"h19\", \"h20\", \"h21\", \"h22\", \"h23\", \"h24\", \"h25\", \"h26\", \"h27\", \"h28\", \"h29\",\n    \"h30\", \"h31\", \"s0\", \"s1\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\", \"s11\",\n    \"s12\", \"s13\", \"s14\", \"s15\", \"s16\", \"s17\", \"s18\", \"s19\", \"s20\", \"s21\", \"s22\", \"s23\", \"s24\",\n    \"s25\", \"s26\", \"s27\", \"s28\", \"s29\", \"s30\", \"s31\", \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\",\n    \"d6\", \"d7\", \"d8\", \"d9\", \"d10\", \"d11\", \"d12\", \"d13\", \"d14\", \"d15\", \"d16\", \"d17\", \"d18\", \"d19\",\n    \"d20\", \"d21\", \"d22\", \"d23\", \"d24\", \"d25\", \"d26\", \"d27\", \"d28\", \"d29\", \"d30\", \"d31\", \"q0\",\n    \"q1\", \"q2\", \"q3\", \"q4\", \"q5\", \"q6\", \"q7\", \"q8\", \"q9\", \"q10\", \"q11\", \"q12\", \"q13\", \"q14\", \"q15\",\n    \"q16\", \"q17\", \"q18\", \"q19\", \"q20\", \"q21\", \"q22\", \"q23\", \"q24\", \"q25\", \"q26\", \"q27\", \"q28\",\n    \"q29\", \"q30\", \"q31\",\n    // B vectors\n    \"v0.b[0]\", \"v0.b[1]\", \"v0.b[2]\", \"v0.b[3]\", \"v0.b[4]\", \"v0.b[5]\", \"v0.b[6]\", \"v0.b[7]\",\n    \"v0.b[8]\", \"v0.b[9]\", \"v0.b[10]\", \"v0.b[11]\", \"v0.b[12]\", \"v0.b[13]\", \"v0.b[14]\", \"v0.b[15]\",\n    \"v1.b[0]\", \"v1.b[1]\", \"v1.b[2]\", \"v1.b[3]\", \"v1.b[4]\", \"v1.b[5]\", \"v1.b[6]\", \"v1.b[7]\",\n    \"v1.b[8]\", \"v1.b[9]\", \"v1.b[10]\", \"v1.b[11]\", \"v1.b[12]\", \"v1.b[13]\", \"v1.b[14]\", \"v1.b[15]\",\n    \"v2.b[0]\", \"v2.b[1]\", \"v2.b[2]\", \"v2.b[3]\", \"v2.b[4]\", \"v2.b[5]\", \"v2.b[6]\", \"v2.b[7]\",\n    \"v2.b[8]\", \"v2.b[9]\", \"v2.b[10]\", \"v2.b[11]\", \"v2.b[12]\", \"v2.b[13]\", \"v2.b[14]\", \"v2.b[15]\",\n    \"v3.b[0]\", \"v3.b[1]\", \"v3.b[2]\", \"v3.b[3]\", \"v3.b[4]\", \"v3.b[5]\", \"v3.b[6]\", \"v3.b[7]\",\n    \"v3.b[8]\", \"v3.b[9]\", \"v3.b[10]\", \"v3.b[11]\", \"v3.b[12]\", \"v3.b[13]\", \"v3.b[14]\", \"v3.b[15]\",\n    \"v4.b[0]\", \"v4.b[1]\", \"v4.b[2]\", \"v4.b[3]\", \"v4.b[4]\", \"v4.b[5]\", \"v4.b[6]\", \"v4.b[7]\",\n    \"v4.b[8]\", \"v4.b[9]\", \"v4.b[10]\", \"v4.b[11]\", \"v4.b[12]\", \"v4.b[13]\", \"v4.b[14]\", \"v4.b[15]\",\n    \"v5.b[0]\", \"v5.b[1]\", \"v5.b[2]\", \"v5.b[3]\", \"v5.b[4]\", \"v5.b[5]\", \"v5.b[6]\", \"v5.b[7]\",\n    \"v5.b[8]\", \"v5.b[9]\", \"v5.b[10]\", \"v5.b[11]\", \"v5.b[12]\", \"v5.b[13]\", \"v5.b[14]\", \"v5.b[15]\",\n    \"v6.b[0]\", \"v6.b[1]\", \"v6.b[2]\", \"v6.b[3]\", \"v6.b[4]\", \"v6.b[5]\", \"v6.b[6]\", \"v6.b[7]\",\n    \"v6.b[8]\", \"v6.b[9]\", \"v6.b[10]\", \"v6.b[11]\", \"v6.b[12]\", \"v6.b[13]\", \"v6.b[14]\", \"v6.b[15]\",\n    \"v7.b[0]\", \"v7.b[1]\", \"v7.b[2]\", \"v7.b[3]\", \"v7.b[4]\", \"v7.b[5]\", \"v7.b[6]\", \"v7.b[7]\",\n    \"v7.b[8]\", \"v7.b[9]\", \"v7.b[10]\", \"v7.b[11]\", \"v7.b[12]\", \"v7.b[13]\", \"v7.b[14]\", \"v7.b[15]\",\n    \"v8.b[0]\", \"v8.b[1]\", \"v8.b[2]\", \"v8.b[3]\", \"v8.b[4]\", \"v8.b[5]\", \"v8.b[6]\", \"v8.b[7]\",\n    \"v8.b[8]\", \"v8.b[9]\", \"v8.b[10]\", \"v8.b[11]\", \"v8.b[12]\", \"v8.b[13]\", \"v8.b[14]\", \"v8.b[15]\",\n    \"v9.b[0]\", \"v9.b[1]\", \"v9.b[2]\", \"v9.b[3]\", \"v9.b[4]\", \"v9.b[5]\", \"v9.b[6]\", \"v9.b[7]\",\n    \"v9.b[8]\", \"v9.b[9]\", \"v9.b[10]\", \"v9.b[11]\", \"v9.b[12]\", \"v9.b[13]\", \"v9.b[14]\", \"v9.b[15]\",\n    \"v10.b[0]\", \"v10.b[1]\", \"v10.b[2]\", \"v10.b[3]\", \"v10.b[4]\", \"v10.b[5]\", \"v10.b[6]\", \"v10.b[7]\",\n    \"v10.b[8]\", \"v10.b[9]\", \"v10.b[10]\", \"v10.b[11]\", \"v10.b[12]\", \"v10.b[13]\", \"v10.b[14]\",\n    \"v10.b[15]\", \"v11.b[0]\", \"v11.b[1]\", \"v11.b[2]\", \"v11.b[3]\", \"v11.b[4]\", \"v11.b[5]\", \"v11.b[6]\",\n    \"v11.b[7]\", \"v11.b[8]\", \"v11.b[9]\", \"v11.b[10]\", \"v11.b[11]\", \"v11.b[12]\", \"v11.b[13]\",\n    \"v11.b[14]\", \"v11.b[15]\", \"v12.b[0]\", \"v12.b[1]\", \"v12.b[2]\", \"v12.b[3]\", \"v12.b[4]\",\n    \"v12.b[5]\", \"v12.b[6]\", \"v12.b[7]\", \"v12.b[8]\", \"v12.b[9]\", \"v12.b[10]\", \"v12.b[11]\",\n    \"v12.b[12]\", \"v12.b[13]\", \"v12.b[14]\", \"v12.b[15]\", \"v13.b[0]\", \"v13.b[1]\", \"v13.b[2]\",\n    \"v13.b[3]\", \"v13.b[4]\", \"v13.b[5]\", \"v13.b[6]\", \"v13.b[7]\", \"v13.b[8]\", \"v13.b[9]\", \"v13.b[10]\",\n    \"v13.b[11]\", \"v13.b[12]\", \"v13.b[13]\", \"v13.b[14]\", \"v13.b[15]\", \"v14.b[0]\", \"v14.b[1]\",\n    \"v14.b[2]\", \"v14.b[3]\", \"v14.b[4]\", \"v14.b[5]\", \"v14.b[6]\", \"v14.b[7]\", \"v14.b[8]\", \"v14.b[9]\",\n    \"v14.b[10]\", \"v14.b[11]\", \"v14.b[12]\", \"v14.b[13]\", \"v14.b[14]\", \"v14.b[15]\", \"v15.b[0]\",\n    \"v15.b[1]\", \"v15.b[2]\", \"v15.b[3]\", \"v15.b[4]\", \"v15.b[5]\", \"v15.b[6]\", \"v15.b[7]\", \"v15.b[8]\",\n    \"v15.b[9]\", \"v15.b[10]\", \"v15.b[11]\", \"v15.b[12]\", \"v15.b[13]\", \"v15.b[14]\", \"v15.b[15]\",\n    \"v16.b[0]\", \"v16.b[1]\", \"v16.b[2]\", \"v16.b[3]\", \"v16.b[4]\", \"v16.b[5]\", \"v16.b[6]\", \"v16.b[7]\",\n    \"v16.b[8]\", \"v16.b[9]\", \"v16.b[10]\", \"v16.b[11]\", \"v16.b[12]\", \"v16.b[13]\", \"v16.b[14]\",\n    \"v16.b[15]\", \"v17.b[0]\", \"v17.b[1]\", \"v17.b[2]\", \"v17.b[3]\", \"v17.b[4]\", \"v17.b[5]\", \"v17.b[6]\",\n    \"v17.b[7]\", \"v17.b[8]\", \"v17.b[9]\", \"v17.b[10]\", \"v17.b[11]\", \"v17.b[12]\", \"v17.b[13]\",\n    \"v17.b[14]\", \"v17.b[15]\", \"v18.b[0]\", \"v18.b[1]\", \"v18.b[2]\", \"v18.b[3]\", \"v18.b[4]\",\n    \"v18.b[5]\", \"v18.b[6]\", \"v18.b[7]\", \"v18.b[8]\", \"v18.b[9]\", \"v18.b[10]\", \"v18.b[11]\",\n    \"v18.b[12]\", \"v18.b[13]\", \"v18.b[14]\", \"v18.b[15]\", \"v19.b[0]\", \"v19.b[1]\", \"v19.b[2]\",\n    \"v19.b[3]\", \"v19.b[4]\", \"v19.b[5]\", \"v19.b[6]\", \"v19.b[7]\", \"v19.b[8]\", \"v19.b[9]\", \"v19.b[10]\",\n    \"v19.b[11]\", \"v19.b[12]\", \"v19.b[13]\", \"v19.b[14]\", \"v19.b[15]\", \"v20.b[0]\", \"v20.b[1]\",\n    \"v20.b[2]\", \"v20.b[3]\", \"v20.b[4]\", \"v20.b[5]\", \"v20.b[6]\", \"v20.b[7]\", \"v20.b[8]\", \"v20.b[9]\",\n    \"v20.b[10]\", \"v20.b[11]\", \"v20.b[12]\", \"v20.b[13]\", \"v20.b[14]\", \"v20.b[15]\", \"v21.b[0]\",\n    \"v21.b[1]\", \"v21.b[2]\", \"v21.b[3]\", \"v21.b[4]\", \"v21.b[5]\", \"v21.b[6]\", \"v21.b[7]\", \"v21.b[8]\",\n    \"v21.b[9]\", \"v21.b[10]\", \"v21.b[11]\", \"v21.b[12]\", \"v21.b[13]\", \"v21.b[14]\", \"v21.b[15]\",\n    \"v22.b[0]\", \"v22.b[1]\", \"v22.b[2]\", \"v22.b[3]\", \"v22.b[4]\", \"v22.b[5]\", \"v22.b[6]\", \"v22.b[7]\",\n    \"v22.b[8]\", \"v22.b[9]\", \"v22.b[10]\", \"v22.b[11]\", \"v22.b[12]\", \"v22.b[13]\", \"v22.b[14]\",\n    \"v22.b[15]\", \"v23.b[0]\", \"v23.b[1]\", \"v23.b[2]\", \"v23.b[3]\", \"v23.b[4]\", \"v23.b[5]\", \"v23.b[6]\",\n    \"v23.b[7]\", \"v23.b[8]\", \"v23.b[9]\", \"v23.b[10]\", \"v23.b[11]\", \"v23.b[12]\", \"v23.b[13]\",\n    \"v23.b[14]\", \"v23.b[15]\", \"v24.b[0]\", \"v24.b[1]\", \"v24.b[2]\", \"v24.b[3]\", \"v24.b[4]\",\n    \"v24.b[5]\", \"v24.b[6]\", \"v24.b[7]\", \"v24.b[8]\", \"v24.b[9]\", \"v24.b[10]\", \"v24.b[11]\",\n    \"v24.b[12]\", \"v24.b[13]\", \"v24.b[14]\", \"v24.b[15]\", \"v25.b[0]\", \"v25.b[1]\", \"v25.b[2]\",\n    \"v25.b[3]\", \"v25.b[4]\", \"v25.b[5]\", \"v25.b[6]\", \"v25.b[7]\", \"v25.b[8]\", \"v25.b[9]\", \"v25.b[10]\",\n    \"v25.b[11]\", \"v25.b[12]\", \"v25.b[13]\", \"v25.b[14]\", \"v25.b[15]\", \"v26.b[0]\", \"v26.b[1]\",\n    \"v26.b[2]\", \"v26.b[3]\", \"v26.b[4]\", \"v26.b[5]\", \"v26.b[6]\", \"v26.b[7]\", \"v26.b[8]\", \"v26.b[9]\",\n    \"v26.b[10]\", \"v26.b[11]\", \"v26.b[12]\", \"v26.b[13]\", \"v26.b[14]\", \"v26.b[15]\", \"v27.b[0]\",\n    \"v27.b[1]\", \"v27.b[2]\", \"v27.b[3]\", \"v27.b[4]\", \"v27.b[5]\", \"v27.b[6]\", \"v27.b[7]\", \"v27.b[8]\",\n    \"v27.b[9]\", \"v27.b[10]\", \"v27.b[11]\", \"v27.b[12]\", \"v27.b[13]\", \"v27.b[14]\", \"v27.b[15]\",\n    \"v28.b[0]\", \"v28.b[1]\", \"v28.b[2]\", \"v28.b[3]\", \"v28.b[4]\", \"v28.b[5]\", \"v28.b[6]\", \"v28.b[7]\",\n    \"v28.b[8]\", \"v28.b[9]\", \"v28.b[10]\", \"v28.b[11]\", \"v28.b[12]\", \"v28.b[13]\", \"v28.b[14]\",\n    \"v28.b[15]\", \"v29.b[0]\", \"v29.b[1]\", \"v29.b[2]\", \"v29.b[3]\", \"v29.b[4]\", \"v29.b[5]\", \"v29.b[6]\",\n    \"v29.b[7]\", \"v29.b[8]\", \"v29.b[9]\", \"v29.b[10]\", \"v29.b[11]\", \"v29.b[12]\", \"v29.b[13]\",\n    \"v29.b[14]\", \"v29.b[15]\", \"v30.b[0]\", \"v30.b[1]\", \"v30.b[2]\", \"v30.b[3]\", \"v30.b[4]\",\n    \"v30.b[5]\", \"v30.b[6]\", \"v30.b[7]\", \"v30.b[8]\", \"v30.b[9]\", \"v30.b[10]\", \"v30.b[11]\",\n    \"v30.b[12]\", \"v30.b[13]\", \"v30.b[14]\", \"v30.b[15]\", \"v31.b[0]\", \"v31.b[1]\", \"v31.b[2]\",\n    \"v31.b[3]\", \"v31.b[4]\", \"v31.b[5]\", \"v31.b[6]\", \"v31.b[7]\", \"v31.b[8]\", \"v31.b[9]\", \"v31.b[10]\",\n    \"v31.b[11]\", \"v31.b[12]\", \"v31.b[13]\", \"v31.b[14]\", \"v31.b[15]\",\n    // H vectors\n    \"v0.h[0]\", \"v0.h[1]\", \"v0.h[2]\", \"v0.h[3]\", \"v0.h[4]\", \"v0.h[5]\", \"v0.h[6]\", \"v0.h[7]\",\n    \"v1.h[0]\", \"v1.h[1]\", \"v1.h[2]\", \"v1.h[3]\", \"v1.h[4]\", \"v1.h[5]\", \"v1.h[6]\", \"v1.h[7]\",\n    \"v2.h[0]\", \"v2.h[1]\", \"v2.h[2]\", \"v2.h[3]\", \"v2.h[4]\", \"v2.h[5]\", \"v2.h[6]\", \"v2.h[7]\",\n    \"v3.h[0]\", \"v3.h[1]\", \"v3.h[2]\", \"v3.h[3]\", \"v3.h[4]\", \"v3.h[5]\", \"v3.h[6]\", \"v3.h[7]\",\n    \"v4.h[0]\", \"v4.h[1]\", \"v4.h[2]\", \"v4.h[3]\", \"v4.h[4]\", \"v4.h[5]\", \"v4.h[6]\", \"v4.h[7]\",\n    \"v5.h[0]\", \"v5.h[1]\", \"v5.h[2]\", \"v5.h[3]\", \"v5.h[4]\", \"v5.h[5]\", \"v5.h[6]\", \"v5.h[7]\",\n    \"v6.h[0]\", \"v6.h[1]\", \"v6.h[2]\", \"v6.h[3]\", \"v6.h[4]\", \"v6.h[5]\", \"v6.h[6]\", \"v6.h[7]\",\n    \"v7.h[0]\", \"v7.h[1]\", \"v7.h[2]\", \"v7.h[3]\", \"v7.h[4]\", \"v7.h[5]\", \"v7.h[6]\", \"v7.h[7]\",\n    \"v8.h[0]\", \"v8.h[1]\", \"v8.h[2]\", \"v8.h[3]\", \"v8.h[4]\", \"v8.h[5]\", \"v8.h[6]\", \"v8.h[7]\",\n    \"v9.h[0]\", \"v9.h[1]\", \"v9.h[2]\", \"v9.h[3]\", \"v9.h[4]\", \"v9.h[5]\", \"v9.h[6]\", \"v9.h[7]\",\n    \"v10.h[0]\", \"v10.h[1]\", \"v10.h[2]\", \"v10.h[3]\", \"v10.h[4]\", \"v10.h[5]\", \"v10.h[6]\", \"v10.h[7]\",\n    \"v11.h[0]\", \"v11.h[1]\", \"v11.h[2]\", \"v11.h[3]\", \"v11.h[4]\", \"v11.h[5]\", \"v11.h[6]\", \"v11.h[7]\",\n    \"v12.h[0]\", \"v12.h[1]\", \"v12.h[2]\", \"v12.h[3]\", \"v12.h[4]\", \"v12.h[5]\", \"v12.h[6]\", \"v12.h[7]\",\n    \"v13.h[0]\", \"v13.h[1]\", \"v13.h[2]\", \"v13.h[3]\", \"v13.h[4]\", \"v13.h[5]\", \"v13.h[6]\", \"v13.h[7]\",\n    \"v14.h[0]\", \"v14.h[1]\", \"v14.h[2]\", \"v14.h[3]\", \"v14.h[4]\", \"v14.h[5]\", \"v14.h[6]\", \"v14.h[7]\",\n    \"v15.h[0]\", \"v15.h[1]\", \"v15.h[2]\", \"v15.h[3]\", \"v15.h[4]\", \"v15.h[5]\", \"v15.h[6]\", \"v15.h[7]\",\n    \"v16.h[0]\", \"v16.h[1]\", \"v16.h[2]\", \"v16.h[3]\", \"v16.h[4]\", \"v16.h[5]\", \"v16.h[6]\", \"v16.h[7]\",\n    \"v17.h[0]\", \"v17.h[1]\", \"v17.h[2]\", \"v17.h[3]\", \"v17.h[4]\", \"v17.h[5]\", \"v17.h[6]\", \"v17.h[7]\",\n    \"v18.h[0]\", \"v18.h[1]\", \"v18.h[2]\", \"v18.h[3]\", \"v18.h[4]\", \"v18.h[5]\", \"v18.h[6]\", \"v18.h[7]\",\n    \"v19.h[0]\", \"v19.h[1]\", \"v19.h[2]\", \"v19.h[3]\", \"v19.h[4]\", \"v19.h[5]\", \"v19.h[6]\", \"v19.h[7]\",\n    \"v20.h[0]\", \"v20.h[1]\", \"v20.h[2]\", \"v20.h[3]\", \"v20.h[4]\", \"v20.h[5]\", \"v20.h[6]\", \"v20.h[7]\",\n    \"v21.h[0]\", \"v21.h[1]\", \"v21.h[2]\", \"v21.h[3]\", \"v21.h[4]\", \"v21.h[5]\", \"v21.h[6]\", \"v21.h[7]\",\n    \"v22.h[0]\", \"v22.h[1]\", \"v22.h[2]\", \"v22.h[3]\", \"v22.h[4]\", \"v22.h[5]\", \"v22.h[6]\", \"v22.h[7]\",\n    \"v23.h[0]\", \"v23.h[1]\", \"v23.h[2]\", \"v23.h[3]\", \"v23.h[4]\", \"v23.h[5]\", \"v23.h[6]\", \"v23.h[7]\",\n    \"v24.h[0]\", \"v24.h[1]\", \"v24.h[2]\", \"v24.h[3]\", \"v24.h[4]\", \"v24.h[5]\", \"v24.h[6]\", \"v24.h[7]\",\n    \"v25.h[0]\", \"v25.h[1]\", \"v25.h[2]\", \"v25.h[3]\", \"v25.h[4]\", \"v25.h[5]\", \"v25.h[6]\", \"v25.h[7]\",\n    \"v26.h[0]\", \"v26.h[1]\", \"v26.h[2]\", \"v26.h[3]\", \"v26.h[4]\", \"v26.h[5]\", \"v26.h[6]\", \"v26.h[7]\",\n    \"v27.h[0]\", \"v27.h[1]\", \"v27.h[2]\", \"v27.h[3]\", \"v27.h[4]\", \"v27.h[5]\", \"v27.h[6]\", \"v27.h[7]\",\n    \"v28.h[0]\", \"v28.h[1]\", \"v28.h[2]\", \"v28.h[3]\", \"v28.h[4]\", \"v28.h[5]\", \"v28.h[6]\", \"v28.h[7]\",\n    \"v29.h[0]\", \"v29.h[1]\", \"v29.h[2]\", \"v29.h[3]\", \"v29.h[4]\", \"v29.h[5]\", \"v29.h[6]\", \"v29.h[7]\",\n    \"v30.h[0]\", \"v30.h[1]\", \"v30.h[2]\", \"v30.h[3]\", \"v30.h[4]\", \"v30.h[5]\", \"v30.h[6]\", \"v30.h[7]\",\n    \"v31.h[0]\", \"v31.h[1]\", \"v31.h[2]\", \"v31.h[3]\", \"v31.h[4]\", \"v31.h[5]\", \"v31.h[6]\", \"v31.h[7]\",\n    // S vectors\n    \"v0.s[0]\", \"v0.s[1]\", \"v0.s[2]\", \"v0.s[3]\", \"v1.s[0]\", \"v1.s[1]\", \"v1.s[2]\", \"v1.s[3]\",\n    \"v2.s[0]\", \"v2.s[1]\", \"v2.s[2]\", \"v2.s[3]\", \"v3.s[0]\", \"v3.s[1]\", \"v3.s[2]\", \"v3.s[3]\",\n    \"v4.s[0]\", \"v4.s[1]\", \"v4.s[2]\", \"v4.s[3]\", \"v5.s[0]\", \"v5.s[1]\", \"v5.s[2]\", \"v5.s[3]\",\n    \"v6.s[0]\", \"v6.s[1]\", \"v6.s[2]\", \"v6.s[3]\", \"v7.s[0]\", \"v7.s[1]\", \"v7.s[2]\", \"v7.s[3]\",\n    \"v8.s[0]\", \"v8.s[1]\", \"v8.s[2]\", \"v8.s[3]\", \"v9.s[0]\", \"v9.s[1]\", \"v9.s[2]\", \"v9.s[3]\",\n    \"v10.s[0]\", \"v10.s[1]\", \"v10.s[2]\", \"v10.s[3]\", \"v11.s[0]\", \"v11.s[1]\", \"v11.s[2]\", \"v11.s[3]\",\n    \"v12.s[0]\", \"v12.s[1]\", \"v12.s[2]\", \"v12.s[3]\", \"v13.s[0]\", \"v13.s[1]\", \"v13.s[2]\", \"v13.s[3]\",\n    \"v14.s[0]\", \"v14.s[1]\", \"v14.s[2]\", \"v14.s[3]\", \"v15.s[0]\", \"v15.s[1]\", \"v15.s[2]\", \"v15.s[3]\",\n    \"v16.s[0]\", \"v16.s[1]\", \"v16.s[2]\", \"v16.s[3]\", \"v17.s[0]\", \"v17.s[1]\", \"v17.s[2]\", \"v17.s[3]\",\n    \"v18.s[0]\", \"v18.s[1]\", \"v18.s[2]\", \"v18.s[3]\", \"v19.s[0]\", \"v19.s[1]\", \"v19.s[2]\", \"v19.s[3]\",\n    \"v20.s[0]\", \"v20.s[1]\", \"v20.s[2]\", \"v20.s[3]\", \"v21.s[0]\", \"v21.s[1]\", \"v21.s[2]\", \"v21.s[3]\",\n    \"v22.s[0]\", \"v22.s[1]\", \"v22.s[2]\", \"v22.s[3]\", \"v23.s[0]\", \"v23.s[1]\", \"v23.s[2]\", \"v23.s[3]\",\n    \"v24.s[0]\", \"v24.s[1]\", \"v24.s[2]\", \"v24.s[3]\", \"v25.s[0]\", \"v25.s[1]\", \"v25.s[2]\", \"v25.s[3]\",\n    \"v26.s[0]\", \"v26.s[1]\", \"v26.s[2]\", \"v26.s[3]\", \"v27.s[0]\", \"v27.s[1]\", \"v27.s[2]\", \"v27.s[3]\",\n    \"v28.s[0]\", \"v28.s[1]\", \"v28.s[2]\", \"v28.s[3]\", \"v29.s[0]\", \"v29.s[1]\", \"v29.s[2]\", \"v29.s[3]\",\n    \"v30.s[0]\", \"v30.s[1]\", \"v30.s[2]\", \"v30.s[3]\", \"v31.s[0]\", \"v31.s[1]\", \"v31.s[2]\", \"v31.s[3]\",\n    // D vectors\n    \"v0.d[0]\", \"v0.d[1]\", \"v1.d[0]\", \"v1.d[1]\", \"v2.d[0]\", \"v2.d[1]\", \"v3.d[0]\", \"v3.d[1]\",\n    \"v4.d[0]\", \"v4.d[1]\", \"v5.d[0]\", \"v5.d[1]\", \"v6.d[0]\", \"v6.d[1]\", \"v7.d[0]\", \"v7.d[1]\",\n    \"v8.d[0]\", \"v8.d[1]\", \"v9.d[0]\", \"v9.d[1]\", \"v10.d[0]\", \"v10.d[1]\", \"v11.d[0]\", \"v11.d[1]\",\n    \"v12.d[0]\", \"v12.d[1]\", \"v13.d[0]\", \"v13.d[1]\", \"v14.d[0]\", \"v14.d[1]\", \"v15.d[0]\", \"v15.d[1]\",\n    \"v16.d[0]\", \"v16.d[1]\", \"v17.d[0]\", \"v17.d[1]\", \"v18.d[0]\", \"v18.d[1]\", \"v19.d[0]\", \"v19.d[1]\",\n    \"v20.d[0]\", \"v20.d[1]\", \"v21.d[0]\", \"v21.d[1]\", \"v22.d[0]\", \"v22.d[1]\", \"v23.d[0]\", \"v23.d[1]\",\n    \"v24.d[0]\", \"v24.d[1]\", \"v25.d[0]\", \"v25.d[1]\", \"v26.d[0]\", \"v26.d[1]\", \"v27.d[0]\", \"v27.d[1]\",\n    \"v28.d[0]\", \"v28.d[1]\", \"v29.d[0]\", \"v29.d[1]\", \"v30.d[0]\", \"v30.d[1]\", \"v31.d[0]\", \"v31.d[1]\",\n    // SVE\n    \"z0\", \"z1\", \"z2\", \"z3\", \"z4\", \"z5\", \"z6\", \"z7\", \"z8\", \"z9\", \"z10\", \"z11\", \"z12\", \"z13\", \"z14\",\n    \"z15\", \"z16\", \"z17\", \"z18\", \"z19\", \"z20\", \"z21\", \"z22\", \"z23\", \"z24\", \"z25\", \"z26\", \"z27\",\n    \"z28\", \"z29\", \"z30\", \"z31\",\n    /* scalable predicate registers */\n    \"p0\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"p6\", \"p7\", \"p8\", \"p9\", \"p10\", \"p11\", \"p12\", \"p13\", \"p14\",\n    \"p15\", \"p16\", \"p17\", \"p18\", \"p19\", \"p20\", \"p21\", \"p22\", \"p23\", \"p24\", \"p25\", \"p26\", \"p27\",\n    \"p28\", \"p29\", \"p30\", \"p31\",\n    /* prefetch operations (TODO: remove these as registers) */\n    \"pldl1keep\", \"pldl1strm\", \"pldl2keep\", \"pldl2strm\", \"pldl3keep\", \"pldl3strm\", \"#0x6\", \"#0x7\",\n    \"plil1keep\", \"plil1strm\", \"plil2keep\", \"plil2strm\", \"plil3keep\", \"plil3strm\", \"#0xe\", \"#0xf\",\n    \"pstl1keep\", \"pstl1strm\", \"pstl2keep\", \"pstl2strm\", \"pstl3keep\", \"pstl3strm\", \"#0x16\", \"#0x17\",\n    \"#0x18\", \"#0x19\", \"#0x1a\", \"#0x1b\", \"#0x1c\", \"#0x1d\", \"#0x1e\", \"#0x1f\", \"END\"};\n\nconst char* get_register_name(enum Register r)\n{\n\tif (r > REG_NONE && r < REG_END)\n\t\treturn RegisterString[r];\n\n\treturn \"\";\n}\n\nsize_t get_register_size(enum Register r)\n{\n\t// Comparison done in order of likelyhood to occur\n\tif ((r >= REG_X0 && r <= REG_SP) || (r >= REG_D0 && r <= REG_D31))\n\t\treturn 8;\n\telse if ((r >= REG_W0 && r <= REG_WSP) || (r >= REG_S0 && r <= REG_S31))\n\t\treturn 4;\n\telse if (r >= REG_B0 && r <= REG_B31)\n\t\treturn 1;\n\telse if (r >= REG_H0 && r <= REG_H31)\n\t\treturn 2;\n\telse if ((r >= REG_Q0 && r <= REG_Q31) || (r >= REG_V0 && r <= REG_V31))\n\t\treturn 16;\n\telse if (r >= REG_V0_B0 && r <= REG_V31_B15)\n\t\treturn 1;\n\telse if (r >= REG_V0_H0 && r <= REG_V31_H7)\n\t\treturn 2;\n\telse if (r >= REG_V0_S0 && r <= REG_V31_S3)\n\t\treturn 4;\n\telse if (r >= REG_V0_D0 && r <= REG_V31_D1)\n\t\treturn 8;\n\treturn 0;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/regs.h",
    "content": "#pragma once\n\n#include <stddef.h>\n\n#ifdef _MSC_VER\n\t#undef REG_NONE  // collides with winnt's define\n#endif\n\n//-----------------------------------------------------------------------------\n// registers (non-system)\n//-----------------------------------------------------------------------------\n\nenum Register\n{\n\tREG_NONE,\n\tREG_W0,\n\tREG_W1,\n\tREG_W2,\n\tREG_W3,\n\tREG_W4,\n\tREG_W5,\n\tREG_W6,\n\tREG_W7,\n\tREG_W8,\n\tREG_W9,\n\tREG_W10,\n\tREG_W11,\n\tREG_W12,\n\tREG_W13,\n\tREG_W14,\n\tREG_W15,\n\tREG_W16,\n\tREG_W17,\n\tREG_W18,\n\tREG_W19,\n\tREG_W20,\n\tREG_W21,\n\tREG_W22,\n\tREG_W23,\n\tREG_W24,\n\tREG_W25,\n\tREG_W26,\n\tREG_W27,\n\tREG_W28,\n\tREG_W29,\n\tREG_W30,\n\tREG_WZR,\n\tREG_WSP,\n\tREG_X0,\n\tREG_X1,\n\tREG_X2,\n\tREG_X3,\n\tREG_X4,\n\tREG_X5,\n\tREG_X6,\n\tREG_X7,\n\tREG_X8,\n\tREG_X9,\n\tREG_X10,\n\tREG_X11,\n\tREG_X12,\n\tREG_X13,\n\tREG_X14,\n\tREG_X15,\n\tREG_X16,\n\tREG_X17,\n\tREG_X18,\n\tREG_X19,\n\tREG_X20,\n\tREG_X21,\n\tREG_X22,\n\tREG_X23,\n\tREG_X24,\n\tREG_X25,\n\tREG_X26,\n\tREG_X27,\n\tREG_X28,\n\tREG_X29,\n\tREG_X30,\n\tREG_XZR,\n\tREG_SP,\n\tREG_V0,\n\tREG_V1,\n\tREG_V2,\n\tREG_V3,\n\tREG_V4,\n\tREG_V5,\n\tREG_V6,\n\tREG_V7,\n\tREG_V8,\n\tREG_V9,\n\tREG_V10,\n\tREG_V11,\n\tREG_V12,\n\tREG_V13,\n\tREG_V14,\n\tREG_V15,\n\tREG_V16,\n\tREG_V17,\n\tREG_V18,\n\tREG_V19,\n\tREG_V20,\n\tREG_V21,\n\tREG_V22,\n\tREG_V23,\n\tREG_V24,\n\tREG_V25,\n\tREG_V26,\n\tREG_V27,\n\tREG_V28,\n\tREG_V29,\n\tREG_V30,\n\tREG_V31,\n\tREG_B0,\n\tREG_B1,\n\tREG_B2,\n\tREG_B3,\n\tREG_B4,\n\tREG_B5,\n\tREG_B6,\n\tREG_B7,\n\tREG_B8,\n\tREG_B9,\n\tREG_B10,\n\tREG_B11,\n\tREG_B12,\n\tREG_B13,\n\tREG_B14,\n\tREG_B15,\n\tREG_B16,\n\tREG_B17,\n\tREG_B18,\n\tREG_B19,\n\tREG_B20,\n\tREG_B21,\n\tREG_B22,\n\tREG_B23,\n\tREG_B24,\n\tREG_B25,\n\tREG_B26,\n\tREG_B27,\n\tREG_B28,\n\tREG_B29,\n\tREG_B30,\n\tREG_B31,\n\tREG_H0,\n\tREG_H1,\n\tREG_H2,\n\tREG_H3,\n\tREG_H4,\n\tREG_H5,\n\tREG_H6,\n\tREG_H7,\n\tREG_H8,\n\tREG_H9,\n\tREG_H10,\n\tREG_H11,\n\tREG_H12,\n\tREG_H13,\n\tREG_H14,\n\tREG_H15,\n\tREG_H16,\n\tREG_H17,\n\tREG_H18,\n\tREG_H19,\n\tREG_H20,\n\tREG_H21,\n\tREG_H22,\n\tREG_H23,\n\tREG_H24,\n\tREG_H25,\n\tREG_H26,\n\tREG_H27,\n\tREG_H28,\n\tREG_H29,\n\tREG_H30,\n\tREG_H31,\n\tREG_S0,\n\tREG_S1,\n\tREG_S2,\n\tREG_S3,\n\tREG_S4,\n\tREG_S5,\n\tREG_S6,\n\tREG_S7,\n\tREG_S8,\n\tREG_S9,\n\tREG_S10,\n\tREG_S11,\n\tREG_S12,\n\tREG_S13,\n\tREG_S14,\n\tREG_S15,\n\tREG_S16,\n\tREG_S17,\n\tREG_S18,\n\tREG_S19,\n\tREG_S20,\n\tREG_S21,\n\tREG_S22,\n\tREG_S23,\n\tREG_S24,\n\tREG_S25,\n\tREG_S26,\n\tREG_S27,\n\tREG_S28,\n\tREG_S29,\n\tREG_S30,\n\tREG_S31,\n\tREG_D0,\n\tREG_D1,\n\tREG_D2,\n\tREG_D3,\n\tREG_D4,\n\tREG_D5,\n\tREG_D6,\n\tREG_D7,\n\tREG_D8,\n\tREG_D9,\n\tREG_D10,\n\tREG_D11,\n\tREG_D12,\n\tREG_D13,\n\tREG_D14,\n\tREG_D15,\n\tREG_D16,\n\tREG_D17,\n\tREG_D18,\n\tREG_D19,\n\tREG_D20,\n\tREG_D21,\n\tREG_D22,\n\tREG_D23,\n\tREG_D24,\n\tREG_D25,\n\tREG_D26,\n\tREG_D27,\n\tREG_D28,\n\tREG_D29,\n\tREG_D30,\n\tREG_D31,\n\tREG_Q0,\n\tREG_Q1,\n\tREG_Q2,\n\tREG_Q3,\n\tREG_Q4,\n\tREG_Q5,\n\tREG_Q6,\n\tREG_Q7,\n\tREG_Q8,\n\tREG_Q9,\n\tREG_Q10,\n\tREG_Q11,\n\tREG_Q12,\n\tREG_Q13,\n\tREG_Q14,\n\tREG_Q15,\n\tREG_Q16,\n\tREG_Q17,\n\tREG_Q18,\n\tREG_Q19,\n\tREG_Q20,\n\tREG_Q21,\n\tREG_Q22,\n\tREG_Q23,\n\tREG_Q24,\n\tREG_Q25,\n\tREG_Q26,\n\tREG_Q27,\n\tREG_Q28,\n\tREG_Q29,\n\tREG_Q30,\n\tREG_Q31,\n\t// B vector\n\tREG_V0_B0,\n\tREG_V0_B1,\n\tREG_V0_B2,\n\tREG_V0_B3,\n\tREG_V0_B4,\n\tREG_V0_B5,\n\tREG_V0_B6,\n\tREG_V0_B7,\n\tREG_V0_B8,\n\tREG_V0_B9,\n\tREG_V0_B10,\n\tREG_V0_B11,\n\tREG_V0_B12,\n\tREG_V0_B13,\n\tREG_V0_B14,\n\tREG_V0_B15,\n\tREG_V1_B0,\n\tREG_V1_B1,\n\tREG_V1_B2,\n\tREG_V1_B3,\n\tREG_V1_B4,\n\tREG_V1_B5,\n\tREG_V1_B6,\n\tREG_V1_B7,\n\tREG_V1_B8,\n\tREG_V1_B9,\n\tREG_V1_B10,\n\tREG_V1_B11,\n\tREG_V1_B12,\n\tREG_V1_B13,\n\tREG_V1_B14,\n\tREG_V1_B15,\n\tREG_V2_B0,\n\tREG_V2_B1,\n\tREG_V2_B2,\n\tREG_V2_B3,\n\tREG_V2_B4,\n\tREG_V2_B5,\n\tREG_V2_B6,\n\tREG_V2_B7,\n\tREG_V2_B8,\n\tREG_V2_B9,\n\tREG_V2_B10,\n\tREG_V2_B11,\n\tREG_V2_B12,\n\tREG_V2_B13,\n\tREG_V2_B14,\n\tREG_V2_B15,\n\tREG_V3_B0,\n\tREG_V3_B1,\n\tREG_V3_B2,\n\tREG_V3_B3,\n\tREG_V3_B4,\n\tREG_V3_B5,\n\tREG_V3_B6,\n\tREG_V3_B7,\n\tREG_V3_B8,\n\tREG_V3_B9,\n\tREG_V3_B10,\n\tREG_V3_B11,\n\tREG_V3_B12,\n\tREG_V3_B13,\n\tREG_V3_B14,\n\tREG_V3_B15,\n\tREG_V4_B0,\n\tREG_V4_B1,\n\tREG_V4_B2,\n\tREG_V4_B3,\n\tREG_V4_B4,\n\tREG_V4_B5,\n\tREG_V4_B6,\n\tREG_V4_B7,\n\tREG_V4_B8,\n\tREG_V4_B9,\n\tREG_V4_B10,\n\tREG_V4_B11,\n\tREG_V4_B12,\n\tREG_V4_B13,\n\tREG_V4_B14,\n\tREG_V4_B15,\n\tREG_V5_B0,\n\tREG_V5_B1,\n\tREG_V5_B2,\n\tREG_V5_B3,\n\tREG_V5_B4,\n\tREG_V5_B5,\n\tREG_V5_B6,\n\tREG_V5_B7,\n\tREG_V5_B8,\n\tREG_V5_B9,\n\tREG_V5_B10,\n\tREG_V5_B11,\n\tREG_V5_B12,\n\tREG_V5_B13,\n\tREG_V5_B14,\n\tREG_V5_B15,\n\tREG_V6_B0,\n\tREG_V6_B1,\n\tREG_V6_B2,\n\tREG_V6_B3,\n\tREG_V6_B4,\n\tREG_V6_B5,\n\tREG_V6_B6,\n\tREG_V6_B7,\n\tREG_V6_B8,\n\tREG_V6_B9,\n\tREG_V6_B10,\n\tREG_V6_B11,\n\tREG_V6_B12,\n\tREG_V6_B13,\n\tREG_V6_B14,\n\tREG_V6_B15,\n\tREG_V7_B0,\n\tREG_V7_B1,\n\tREG_V7_B2,\n\tREG_V7_B3,\n\tREG_V7_B4,\n\tREG_V7_B5,\n\tREG_V7_B6,\n\tREG_V7_B7,\n\tREG_V7_B8,\n\tREG_V7_B9,\n\tREG_V7_B10,\n\tREG_V7_B11,\n\tREG_V7_B12,\n\tREG_V7_B13,\n\tREG_V7_B14,\n\tREG_V7_B15,\n\tREG_V8_B0,\n\tREG_V8_B1,\n\tREG_V8_B2,\n\tREG_V8_B3,\n\tREG_V8_B4,\n\tREG_V8_B5,\n\tREG_V8_B6,\n\tREG_V8_B7,\n\tREG_V8_B8,\n\tREG_V8_B9,\n\tREG_V8_B10,\n\tREG_V8_B11,\n\tREG_V8_B12,\n\tREG_V8_B13,\n\tREG_V8_B14,\n\tREG_V8_B15,\n\tREG_V9_B0,\n\tREG_V9_B1,\n\tREG_V9_B2,\n\tREG_V9_B3,\n\tREG_V9_B4,\n\tREG_V9_B5,\n\tREG_V9_B6,\n\tREG_V9_B7,\n\tREG_V9_B8,\n\tREG_V9_B9,\n\tREG_V9_B10,\n\tREG_V9_B11,\n\tREG_V9_B12,\n\tREG_V9_B13,\n\tREG_V9_B14,\n\tREG_V9_B15,\n\tREG_V10_B0,\n\tREG_V10_B1,\n\tREG_V10_B2,\n\tREG_V10_B3,\n\tREG_V10_B4,\n\tREG_V10_B5,\n\tREG_V10_B6,\n\tREG_V10_B7,\n\tREG_V10_B8,\n\tREG_V10_B9,\n\tREG_V10_B10,\n\tREG_V10_B11,\n\tREG_V10_B12,\n\tREG_V10_B13,\n\tREG_V10_B14,\n\tREG_V10_B15,\n\tREG_V11_B0,\n\tREG_V11_B1,\n\tREG_V11_B2,\n\tREG_V11_B3,\n\tREG_V11_B4,\n\tREG_V11_B5,\n\tREG_V11_B6,\n\tREG_V11_B7,\n\tREG_V11_B8,\n\tREG_V11_B9,\n\tREG_V11_B10,\n\tREG_V11_B11,\n\tREG_V11_B12,\n\tREG_V11_B13,\n\tREG_V11_B14,\n\tREG_V11_B15,\n\tREG_V12_B0,\n\tREG_V12_B1,\n\tREG_V12_B2,\n\tREG_V12_B3,\n\tREG_V12_B4,\n\tREG_V12_B5,\n\tREG_V12_B6,\n\tREG_V12_B7,\n\tREG_V12_B8,\n\tREG_V12_B9,\n\tREG_V12_B10,\n\tREG_V12_B11,\n\tREG_V12_B12,\n\tREG_V12_B13,\n\tREG_V12_B14,\n\tREG_V12_B15,\n\tREG_V13_B0,\n\tREG_V13_B1,\n\tREG_V13_B2,\n\tREG_V13_B3,\n\tREG_V13_B4,\n\tREG_V13_B5,\n\tREG_V13_B6,\n\tREG_V13_B7,\n\tREG_V13_B8,\n\tREG_V13_B9,\n\tREG_V13_B10,\n\tREG_V13_B11,\n\tREG_V13_B12,\n\tREG_V13_B13,\n\tREG_V13_B14,\n\tREG_V13_B15,\n\tREG_V14_B0,\n\tREG_V14_B1,\n\tREG_V14_B2,\n\tREG_V14_B3,\n\tREG_V14_B4,\n\tREG_V14_B5,\n\tREG_V14_B6,\n\tREG_V14_B7,\n\tREG_V14_B8,\n\tREG_V14_B9,\n\tREG_V14_B10,\n\tREG_V14_B11,\n\tREG_V14_B12,\n\tREG_V14_B13,\n\tREG_V14_B14,\n\tREG_V14_B15,\n\tREG_V15_B0,\n\tREG_V15_B1,\n\tREG_V15_B2,\n\tREG_V15_B3,\n\tREG_V15_B4,\n\tREG_V15_B5,\n\tREG_V15_B6,\n\tREG_V15_B7,\n\tREG_V15_B8,\n\tREG_V15_B9,\n\tREG_V15_B10,\n\tREG_V15_B11,\n\tREG_V15_B12,\n\tREG_V15_B13,\n\tREG_V15_B14,\n\tREG_V15_B15,\n\tREG_V16_B0,\n\tREG_V16_B1,\n\tREG_V16_B2,\n\tREG_V16_B3,\n\tREG_V16_B4,\n\tREG_V16_B5,\n\tREG_V16_B6,\n\tREG_V16_B7,\n\tREG_V16_B8,\n\tREG_V16_B9,\n\tREG_V16_B10,\n\tREG_V16_B11,\n\tREG_V16_B12,\n\tREG_V16_B13,\n\tREG_V16_B14,\n\tREG_V16_B15,\n\tREG_V17_B0,\n\tREG_V17_B1,\n\tREG_V17_B2,\n\tREG_V17_B3,\n\tREG_V17_B4,\n\tREG_V17_B5,\n\tREG_V17_B6,\n\tREG_V17_B7,\n\tREG_V17_B8,\n\tREG_V17_B9,\n\tREG_V17_B10,\n\tREG_V17_B11,\n\tREG_V17_B12,\n\tREG_V17_B13,\n\tREG_V17_B14,\n\tREG_V17_B15,\n\tREG_V18_B0,\n\tREG_V18_B1,\n\tREG_V18_B2,\n\tREG_V18_B3,\n\tREG_V18_B4,\n\tREG_V18_B5,\n\tREG_V18_B6,\n\tREG_V18_B7,\n\tREG_V18_B8,\n\tREG_V18_B9,\n\tREG_V18_B10,\n\tREG_V18_B11,\n\tREG_V18_B12,\n\tREG_V18_B13,\n\tREG_V18_B14,\n\tREG_V18_B15,\n\tREG_V19_B0,\n\tREG_V19_B1,\n\tREG_V19_B2,\n\tREG_V19_B3,\n\tREG_V19_B4,\n\tREG_V19_B5,\n\tREG_V19_B6,\n\tREG_V19_B7,\n\tREG_V19_B8,\n\tREG_V19_B9,\n\tREG_V19_B10,\n\tREG_V19_B11,\n\tREG_V19_B12,\n\tREG_V19_B13,\n\tREG_V19_B14,\n\tREG_V19_B15,\n\tREG_V20_B0,\n\tREG_V20_B1,\n\tREG_V20_B2,\n\tREG_V20_B3,\n\tREG_V20_B4,\n\tREG_V20_B5,\n\tREG_V20_B6,\n\tREG_V20_B7,\n\tREG_V20_B8,\n\tREG_V20_B9,\n\tREG_V20_B10,\n\tREG_V20_B11,\n\tREG_V20_B12,\n\tREG_V20_B13,\n\tREG_V20_B14,\n\tREG_V20_B15,\n\tREG_V21_B0,\n\tREG_V21_B1,\n\tREG_V21_B2,\n\tREG_V21_B3,\n\tREG_V21_B4,\n\tREG_V21_B5,\n\tREG_V21_B6,\n\tREG_V21_B7,\n\tREG_V21_B8,\n\tREG_V21_B9,\n\tREG_V21_B10,\n\tREG_V21_B11,\n\tREG_V21_B12,\n\tREG_V21_B13,\n\tREG_V21_B14,\n\tREG_V21_B15,\n\tREG_V22_B0,\n\tREG_V22_B1,\n\tREG_V22_B2,\n\tREG_V22_B3,\n\tREG_V22_B4,\n\tREG_V22_B5,\n\tREG_V22_B6,\n\tREG_V22_B7,\n\tREG_V22_B8,\n\tREG_V22_B9,\n\tREG_V22_B10,\n\tREG_V22_B11,\n\tREG_V22_B12,\n\tREG_V22_B13,\n\tREG_V22_B14,\n\tREG_V22_B15,\n\tREG_V23_B0,\n\tREG_V23_B1,\n\tREG_V23_B2,\n\tREG_V23_B3,\n\tREG_V23_B4,\n\tREG_V23_B5,\n\tREG_V23_B6,\n\tREG_V23_B7,\n\tREG_V23_B8,\n\tREG_V23_B9,\n\tREG_V23_B10,\n\tREG_V23_B11,\n\tREG_V23_B12,\n\tREG_V23_B13,\n\tREG_V23_B14,\n\tREG_V23_B15,\n\tREG_V24_B0,\n\tREG_V24_B1,\n\tREG_V24_B2,\n\tREG_V24_B3,\n\tREG_V24_B4,\n\tREG_V24_B5,\n\tREG_V24_B6,\n\tREG_V24_B7,\n\tREG_V24_B8,\n\tREG_V24_B9,\n\tREG_V24_B10,\n\tREG_V24_B11,\n\tREG_V24_B12,\n\tREG_V24_B13,\n\tREG_V24_B14,\n\tREG_V24_B15,\n\tREG_V25_B0,\n\tREG_V25_B1,\n\tREG_V25_B2,\n\tREG_V25_B3,\n\tREG_V25_B4,\n\tREG_V25_B5,\n\tREG_V25_B6,\n\tREG_V25_B7,\n\tREG_V25_B8,\n\tREG_V25_B9,\n\tREG_V25_B10,\n\tREG_V25_B11,\n\tREG_V25_B12,\n\tREG_V25_B13,\n\tREG_V25_B14,\n\tREG_V25_B15,\n\tREG_V26_B0,\n\tREG_V26_B1,\n\tREG_V26_B2,\n\tREG_V26_B3,\n\tREG_V26_B4,\n\tREG_V26_B5,\n\tREG_V26_B6,\n\tREG_V26_B7,\n\tREG_V26_B8,\n\tREG_V26_B9,\n\tREG_V26_B10,\n\tREG_V26_B11,\n\tREG_V26_B12,\n\tREG_V26_B13,\n\tREG_V26_B14,\n\tREG_V26_B15,\n\tREG_V27_B0,\n\tREG_V27_B1,\n\tREG_V27_B2,\n\tREG_V27_B3,\n\tREG_V27_B4,\n\tREG_V27_B5,\n\tREG_V27_B6,\n\tREG_V27_B7,\n\tREG_V27_B8,\n\tREG_V27_B9,\n\tREG_V27_B10,\n\tREG_V27_B11,\n\tREG_V27_B12,\n\tREG_V27_B13,\n\tREG_V27_B14,\n\tREG_V27_B15,\n\tREG_V28_B0,\n\tREG_V28_B1,\n\tREG_V28_B2,\n\tREG_V28_B3,\n\tREG_V28_B4,\n\tREG_V28_B5,\n\tREG_V28_B6,\n\tREG_V28_B7,\n\tREG_V28_B8,\n\tREG_V28_B9,\n\tREG_V28_B10,\n\tREG_V28_B11,\n\tREG_V28_B12,\n\tREG_V28_B13,\n\tREG_V28_B14,\n\tREG_V28_B15,\n\tREG_V29_B0,\n\tREG_V29_B1,\n\tREG_V29_B2,\n\tREG_V29_B3,\n\tREG_V29_B4,\n\tREG_V29_B5,\n\tREG_V29_B6,\n\tREG_V29_B7,\n\tREG_V29_B8,\n\tREG_V29_B9,\n\tREG_V29_B10,\n\tREG_V29_B11,\n\tREG_V29_B12,\n\tREG_V29_B13,\n\tREG_V29_B14,\n\tREG_V29_B15,\n\tREG_V30_B0,\n\tREG_V30_B1,\n\tREG_V30_B2,\n\tREG_V30_B3,\n\tREG_V30_B4,\n\tREG_V30_B5,\n\tREG_V30_B6,\n\tREG_V30_B7,\n\tREG_V30_B8,\n\tREG_V30_B9,\n\tREG_V30_B10,\n\tREG_V30_B11,\n\tREG_V30_B12,\n\tREG_V30_B13,\n\tREG_V30_B14,\n\tREG_V30_B15,\n\tREG_V31_B0,\n\tREG_V31_B1,\n\tREG_V31_B2,\n\tREG_V31_B3,\n\tREG_V31_B4,\n\tREG_V31_B5,\n\tREG_V31_B6,\n\tREG_V31_B7,\n\tREG_V31_B8,\n\tREG_V31_B9,\n\tREG_V31_B10,\n\tREG_V31_B11,\n\tREG_V31_B12,\n\tREG_V31_B13,\n\tREG_V31_B14,\n\tREG_V31_B15,\n\t// H vector\n\tREG_V0_H0,\n\tREG_V0_H1,\n\tREG_V0_H2,\n\tREG_V0_H3,\n\tREG_V0_H4,\n\tREG_V0_H5,\n\tREG_V0_H6,\n\tREG_V0_H7,\n\tREG_V1_H0,\n\tREG_V1_H1,\n\tREG_V1_H2,\n\tREG_V1_H3,\n\tREG_V1_H4,\n\tREG_V1_H5,\n\tREG_V1_H6,\n\tREG_V1_H7,\n\tREG_V2_H0,\n\tREG_V2_H1,\n\tREG_V2_H2,\n\tREG_V2_H3,\n\tREG_V2_H4,\n\tREG_V2_H5,\n\tREG_V2_H6,\n\tREG_V2_H7,\n\tREG_V3_H0,\n\tREG_V3_H1,\n\tREG_V3_H2,\n\tREG_V3_H3,\n\tREG_V3_H4,\n\tREG_V3_H5,\n\tREG_V3_H6,\n\tREG_V3_H7,\n\tREG_V4_H0,\n\tREG_V4_H1,\n\tREG_V4_H2,\n\tREG_V4_H3,\n\tREG_V4_H4,\n\tREG_V4_H5,\n\tREG_V4_H6,\n\tREG_V4_H7,\n\tREG_V5_H0,\n\tREG_V5_H1,\n\tREG_V5_H2,\n\tREG_V5_H3,\n\tREG_V5_H4,\n\tREG_V5_H5,\n\tREG_V5_H6,\n\tREG_V5_H7,\n\tREG_V6_H0,\n\tREG_V6_H1,\n\tREG_V6_H2,\n\tREG_V6_H3,\n\tREG_V6_H4,\n\tREG_V6_H5,\n\tREG_V6_H6,\n\tREG_V6_H7,\n\tREG_V7_H0,\n\tREG_V7_H1,\n\tREG_V7_H2,\n\tREG_V7_H3,\n\tREG_V7_H4,\n\tREG_V7_H5,\n\tREG_V7_H6,\n\tREG_V7_H7,\n\tREG_V8_H0,\n\tREG_V8_H1,\n\tREG_V8_H2,\n\tREG_V8_H3,\n\tREG_V8_H4,\n\tREG_V8_H5,\n\tREG_V8_H6,\n\tREG_V8_H7,\n\tREG_V9_H0,\n\tREG_V9_H1,\n\tREG_V9_H2,\n\tREG_V9_H3,\n\tREG_V9_H4,\n\tREG_V9_H5,\n\tREG_V9_H6,\n\tREG_V9_H7,\n\tREG_V10_H0,\n\tREG_V10_H1,\n\tREG_V10_H2,\n\tREG_V10_H3,\n\tREG_V10_H4,\n\tREG_V10_H5,\n\tREG_V10_H6,\n\tREG_V10_H7,\n\tREG_V11_H0,\n\tREG_V11_H1,\n\tREG_V11_H2,\n\tREG_V11_H3,\n\tREG_V11_H4,\n\tREG_V11_H5,\n\tREG_V11_H6,\n\tREG_V11_H7,\n\tREG_V12_H0,\n\tREG_V12_H1,\n\tREG_V12_H2,\n\tREG_V12_H3,\n\tREG_V12_H4,\n\tREG_V12_H5,\n\tREG_V12_H6,\n\tREG_V12_H7,\n\tREG_V13_H0,\n\tREG_V13_H1,\n\tREG_V13_H2,\n\tREG_V13_H3,\n\tREG_V13_H4,\n\tREG_V13_H5,\n\tREG_V13_H6,\n\tREG_V13_H7,\n\tREG_V14_H0,\n\tREG_V14_H1,\n\tREG_V14_H2,\n\tREG_V14_H3,\n\tREG_V14_H4,\n\tREG_V14_H5,\n\tREG_V14_H6,\n\tREG_V14_H7,\n\tREG_V15_H0,\n\tREG_V15_H1,\n\tREG_V15_H2,\n\tREG_V15_H3,\n\tREG_V15_H4,\n\tREG_V15_H5,\n\tREG_V15_H6,\n\tREG_V15_H7,\n\tREG_V16_H0,\n\tREG_V16_H1,\n\tREG_V16_H2,\n\tREG_V16_H3,\n\tREG_V16_H4,\n\tREG_V16_H5,\n\tREG_V16_H6,\n\tREG_V16_H7,\n\tREG_V17_H0,\n\tREG_V17_H1,\n\tREG_V17_H2,\n\tREG_V17_H3,\n\tREG_V17_H4,\n\tREG_V17_H5,\n\tREG_V17_H6,\n\tREG_V17_H7,\n\tREG_V18_H0,\n\tREG_V18_H1,\n\tREG_V18_H2,\n\tREG_V18_H3,\n\tREG_V18_H4,\n\tREG_V18_H5,\n\tREG_V18_H6,\n\tREG_V18_H7,\n\tREG_V19_H0,\n\tREG_V19_H1,\n\tREG_V19_H2,\n\tREG_V19_H3,\n\tREG_V19_H4,\n\tREG_V19_H5,\n\tREG_V19_H6,\n\tREG_V19_H7,\n\tREG_V20_H0,\n\tREG_V20_H1,\n\tREG_V20_H2,\n\tREG_V20_H3,\n\tREG_V20_H4,\n\tREG_V20_H5,\n\tREG_V20_H6,\n\tREG_V20_H7,\n\tREG_V21_H0,\n\tREG_V21_H1,\n\tREG_V21_H2,\n\tREG_V21_H3,\n\tREG_V21_H4,\n\tREG_V21_H5,\n\tREG_V21_H6,\n\tREG_V21_H7,\n\tREG_V22_H0,\n\tREG_V22_H1,\n\tREG_V22_H2,\n\tREG_V22_H3,\n\tREG_V22_H4,\n\tREG_V22_H5,\n\tREG_V22_H6,\n\tREG_V22_H7,\n\tREG_V23_H0,\n\tREG_V23_H1,\n\tREG_V23_H2,\n\tREG_V23_H3,\n\tREG_V23_H4,\n\tREG_V23_H5,\n\tREG_V23_H6,\n\tREG_V23_H7,\n\tREG_V24_H0,\n\tREG_V24_H1,\n\tREG_V24_H2,\n\tREG_V24_H3,\n\tREG_V24_H4,\n\tREG_V24_H5,\n\tREG_V24_H6,\n\tREG_V24_H7,\n\tREG_V25_H0,\n\tREG_V25_H1,\n\tREG_V25_H2,\n\tREG_V25_H3,\n\tREG_V25_H4,\n\tREG_V25_H5,\n\tREG_V25_H6,\n\tREG_V25_H7,\n\tREG_V26_H0,\n\tREG_V26_H1,\n\tREG_V26_H2,\n\tREG_V26_H3,\n\tREG_V26_H4,\n\tREG_V26_H5,\n\tREG_V26_H6,\n\tREG_V26_H7,\n\tREG_V27_H0,\n\tREG_V27_H1,\n\tREG_V27_H2,\n\tREG_V27_H3,\n\tREG_V27_H4,\n\tREG_V27_H5,\n\tREG_V27_H6,\n\tREG_V27_H7,\n\tREG_V28_H0,\n\tREG_V28_H1,\n\tREG_V28_H2,\n\tREG_V28_H3,\n\tREG_V28_H4,\n\tREG_V28_H5,\n\tREG_V28_H6,\n\tREG_V28_H7,\n\tREG_V29_H0,\n\tREG_V29_H1,\n\tREG_V29_H2,\n\tREG_V29_H3,\n\tREG_V29_H4,\n\tREG_V29_H5,\n\tREG_V29_H6,\n\tREG_V29_H7,\n\tREG_V30_H0,\n\tREG_V30_H1,\n\tREG_V30_H2,\n\tREG_V30_H3,\n\tREG_V30_H4,\n\tREG_V30_H5,\n\tREG_V30_H6,\n\tREG_V30_H7,\n\tREG_V31_H0,\n\tREG_V31_H1,\n\tREG_V31_H2,\n\tREG_V31_H3,\n\tREG_V31_H4,\n\tREG_V31_H5,\n\tREG_V31_H6,\n\tREG_V31_H7,\n\t// S vector\n\tREG_V0_S0,\n\tREG_V0_S1,\n\tREG_V0_S2,\n\tREG_V0_S3,\n\tREG_V1_S0,\n\tREG_V1_S1,\n\tREG_V1_S2,\n\tREG_V1_S3,\n\tREG_V2_S0,\n\tREG_V2_S1,\n\tREG_V2_S2,\n\tREG_V2_S3,\n\tREG_V3_S0,\n\tREG_V3_S1,\n\tREG_V3_S2,\n\tREG_V3_S3,\n\tREG_V4_S0,\n\tREG_V4_S1,\n\tREG_V4_S2,\n\tREG_V4_S3,\n\tREG_V5_S0,\n\tREG_V5_S1,\n\tREG_V5_S2,\n\tREG_V5_S3,\n\tREG_V6_S0,\n\tREG_V6_S1,\n\tREG_V6_S2,\n\tREG_V6_S3,\n\tREG_V7_S0,\n\tREG_V7_S1,\n\tREG_V7_S2,\n\tREG_V7_S3,\n\tREG_V8_S0,\n\tREG_V8_S1,\n\tREG_V8_S2,\n\tREG_V8_S3,\n\tREG_V9_S0,\n\tREG_V9_S1,\n\tREG_V9_S2,\n\tREG_V9_S3,\n\tREG_V10_S0,\n\tREG_V10_S1,\n\tREG_V10_S2,\n\tREG_V10_S3,\n\tREG_V11_S0,\n\tREG_V11_S1,\n\tREG_V11_S2,\n\tREG_V11_S3,\n\tREG_V12_S0,\n\tREG_V12_S1,\n\tREG_V12_S2,\n\tREG_V12_S3,\n\tREG_V13_S0,\n\tREG_V13_S1,\n\tREG_V13_S2,\n\tREG_V13_S3,\n\tREG_V14_S0,\n\tREG_V14_S1,\n\tREG_V14_S2,\n\tREG_V14_S3,\n\tREG_V15_S0,\n\tREG_V15_S1,\n\tREG_V15_S2,\n\tREG_V15_S3,\n\tREG_V16_S0,\n\tREG_V16_S1,\n\tREG_V16_S2,\n\tREG_V16_S3,\n\tREG_V17_S0,\n\tREG_V17_S1,\n\tREG_V17_S2,\n\tREG_V17_S3,\n\tREG_V18_S0,\n\tREG_V18_S1,\n\tREG_V18_S2,\n\tREG_V18_S3,\n\tREG_V19_S0,\n\tREG_V19_S1,\n\tREG_V19_S2,\n\tREG_V19_S3,\n\tREG_V20_S0,\n\tREG_V20_S1,\n\tREG_V20_S2,\n\tREG_V20_S3,\n\tREG_V21_S0,\n\tREG_V21_S1,\n\tREG_V21_S2,\n\tREG_V21_S3,\n\tREG_V22_S0,\n\tREG_V22_S1,\n\tREG_V22_S2,\n\tREG_V22_S3,\n\tREG_V23_S0,\n\tREG_V23_S1,\n\tREG_V23_S2,\n\tREG_V23_S3,\n\tREG_V24_S0,\n\tREG_V24_S1,\n\tREG_V24_S2,\n\tREG_V24_S3,\n\tREG_V25_S0,\n\tREG_V25_S1,\n\tREG_V25_S2,\n\tREG_V25_S3,\n\tREG_V26_S0,\n\tREG_V26_S1,\n\tREG_V26_S2,\n\tREG_V26_S3,\n\tREG_V27_S0,\n\tREG_V27_S1,\n\tREG_V27_S2,\n\tREG_V27_S3,\n\tREG_V28_S0,\n\tREG_V28_S1,\n\tREG_V28_S2,\n\tREG_V28_S3,\n\tREG_V29_S0,\n\tREG_V29_S1,\n\tREG_V29_S2,\n\tREG_V29_S3,\n\tREG_V30_S0,\n\tREG_V30_S1,\n\tREG_V30_S2,\n\tREG_V30_S3,\n\tREG_V31_S0,\n\tREG_V31_S1,\n\tREG_V31_S2,\n\tREG_V31_S3,\n\t// D vector\n\tREG_V0_D0,\n\tREG_V0_D1,\n\tREG_V1_D0,\n\tREG_V1_D1,\n\tREG_V2_D0,\n\tREG_V2_D1,\n\tREG_V3_D0,\n\tREG_V3_D1,\n\tREG_V4_D0,\n\tREG_V4_D1,\n\tREG_V5_D0,\n\tREG_V5_D1,\n\tREG_V6_D0,\n\tREG_V6_D1,\n\tREG_V7_D0,\n\tREG_V7_D1,\n\tREG_V8_D0,\n\tREG_V8_D1,\n\tREG_V9_D0,\n\tREG_V9_D1,\n\tREG_V10_D0,\n\tREG_V10_D1,\n\tREG_V11_D0,\n\tREG_V11_D1,\n\tREG_V12_D0,\n\tREG_V12_D1,\n\tREG_V13_D0,\n\tREG_V13_D1,\n\tREG_V14_D0,\n\tREG_V14_D1,\n\tREG_V15_D0,\n\tREG_V15_D1,\n\tREG_V16_D0,\n\tREG_V16_D1,\n\tREG_V17_D0,\n\tREG_V17_D1,\n\tREG_V18_D0,\n\tREG_V18_D1,\n\tREG_V19_D0,\n\tREG_V19_D1,\n\tREG_V20_D0,\n\tREG_V20_D1,\n\tREG_V21_D0,\n\tREG_V21_D1,\n\tREG_V22_D0,\n\tREG_V22_D1,\n\tREG_V23_D0,\n\tREG_V23_D1,\n\tREG_V24_D0,\n\tREG_V24_D1,\n\tREG_V25_D0,\n\tREG_V25_D1,\n\tREG_V26_D0,\n\tREG_V26_D1,\n\tREG_V27_D0,\n\tREG_V27_D1,\n\tREG_V28_D0,\n\tREG_V28_D1,\n\tREG_V29_D0,\n\tREG_V29_D1,\n\tREG_V30_D0,\n\tREG_V30_D1,\n\tREG_V31_D0,\n\tREG_V31_D1,\n\t// Q vector is already defined REG_V0, REG_V1, ..., REG_V31\n\t// SVE\n\tREG_Z0,\n\tREG_Z1,\n\tREG_Z2,\n\tREG_Z3,\n\tREG_Z4,\n\tREG_Z5,\n\tREG_Z6,\n\tREG_Z7,\n\tREG_Z8,\n\tREG_Z9,\n\tREG_Z10,\n\tREG_Z11,\n\tREG_Z12,\n\tREG_Z13,\n\tREG_Z14,\n\tREG_Z15,\n\tREG_Z16,\n\tREG_Z17,\n\tREG_Z18,\n\tREG_Z19,\n\tREG_Z20,\n\tREG_Z21,\n\tREG_Z22,\n\tREG_Z23,\n\tREG_Z24,\n\tREG_Z25,\n\tREG_Z26,\n\tREG_Z27,\n\tREG_Z28,\n\tREG_Z29,\n\tREG_Z30,\n\tREG_Z31,\n\tREG_P0,\n\tREG_P1,\n\tREG_P2,\n\tREG_P3,\n\tREG_P4,\n\tREG_P5,\n\tREG_P6,\n\tREG_P7,\n\tREG_P8,\n\tREG_P9,\n\tREG_P10,\n\tREG_P11,\n\tREG_P12,\n\tREG_P13,\n\tREG_P14,\n\tREG_P15,\n\tREG_P16,\n\tREG_P17,\n\tREG_P18,\n\tREG_P19,\n\tREG_P20,\n\tREG_P21,\n\tREG_P22,\n\tREG_P23,\n\tREG_P24,\n\tREG_P25,\n\tREG_P26,\n\tREG_P27,\n\tREG_P28,\n\tREG_P29,\n\tREG_P30,\n\tREG_P31,\n\tREG_PF0,\n\tREG_PF1,\n\tREG_PF2,\n\tREG_PF3,\n\tREG_PF4,\n\tREG_PF5,\n\tREG_PF6,\n\tREG_PF7,\n\tREG_PF8,\n\tREG_PF9,\n\tREG_PF10,\n\tREG_PF11,\n\tREG_PF12,\n\tREG_PF13,\n\tREG_PF14,\n\tREG_PF15,\n\tREG_PF16,\n\tREG_PF17,\n\tREG_PF18,\n\tREG_PF19,\n\tREG_PF20,\n\tREG_PF21,\n\tREG_PF22,\n\tREG_PF23,\n\tREG_PF24,\n\tREG_PF25,\n\tREG_PF26,\n\tREG_PF27,\n\tREG_PF28,\n\tREG_PF29,\n\tREG_PF30,\n\tREG_PF31,\n\tREG_END\n};\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\tconst char* get_register_name(enum Register);\n\tsize_t get_register_size(enum Register);\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs.c",
    "content": "/* GENERATED FILE - DO NOT MODIFY - SUBMIT GITHUB ISSUE IF PROBLEM FOUND */\n\n#include <stddef.h>\n\n#include \"sysregs.h\"\n\nconst char *get_system_register_name(enum SystemReg sr)\n{\n\tswitch(sr) {\n\t\tcase 32770: return \"osdtrrx_el1\";\n\t\tcase 32772: return \"dbgbvr0_el1\";\n\t\tcase 32773: return \"dbgbcr0_el1\";\n\t\tcase 32774: return \"dbgwvr0_el1\";\n\t\tcase 32775: return \"dbgwcr0_el1\";\n\t\tcase 32780: return \"dbgbvr1_el1\";\n\t\tcase 32781: return \"dbgbcr1_el1\";\n\t\tcase 32782: return \"dbgwvr1_el1\";\n\t\tcase 32783: return \"dbgwcr1_el1\";\n\t\tcase 32784: return \"mdccint_el1\";\n\t\tcase 32786: return \"mdscr_el1\";\n\t\tcase 32788: return \"dbgbvr2_el1\";\n\t\tcase 32789: return \"dbgbcr2_el1\";\n\t\tcase 32790: return \"dbgwvr2_el1\";\n\t\tcase 32791: return \"dbgwcr2_el1\";\n\t\tcase 32794: return \"osdtrtx_el1\";\n\t\tcase 32796: return \"dbgbvr3_el1\";\n\t\tcase 32797: return \"dbgbcr3_el1\";\n\t\tcase 32798: return \"dbgwvr3_el1\";\n\t\tcase 32799: return \"dbgwcr3_el1\";\n\t\tcase 32804: return \"dbgbvr4_el1\";\n\t\tcase 32805: return \"dbgbcr4_el1\";\n\t\tcase 32806: return \"dbgwvr4_el1\";\n\t\tcase 32807: return \"dbgwcr4_el1\";\n\t\tcase 32812: return \"dbgbvr5_el1\";\n\t\tcase 32813: return \"dbgbcr5_el1\";\n\t\tcase 32814: return \"dbgwvr5_el1\";\n\t\tcase 32815: return \"dbgwcr5_el1\";\n\t\tcase 32818: return \"oseccr_el1\";\n\t\tcase 32820: return \"dbgbvr6_el1\";\n\t\tcase 32821: return \"dbgbcr6_el1\";\n\t\tcase 32822: return \"dbgwvr6_el1\";\n\t\tcase 32823: return \"dbgwcr6_el1\";\n\t\tcase 32828: return \"dbgbvr7_el1\";\n\t\tcase 32829: return \"dbgbcr7_el1\";\n\t\tcase 32830: return \"dbgwvr7_el1\";\n\t\tcase 32831: return \"dbgwcr7_el1\";\n\t\tcase 32836: return \"dbgbvr8_el1\";\n\t\tcase 32837: return \"dbgbcr8_el1\";\n\t\tcase 32838: return \"dbgwvr8_el1\";\n\t\tcase 32839: return \"dbgwcr8_el1\";\n\t\tcase 32844: return \"dbgbvr9_el1\";\n\t\tcase 32845: return \"dbgbcr9_el1\";\n\t\tcase 32846: return \"dbgwvr9_el1\";\n\t\tcase 32847: return \"dbgwcr9_el1\";\n\t\tcase 32852: return \"dbgbvr10_el1\";\n\t\tcase 32853: return \"dbgbcr10_el1\";\n\t\tcase 32854: return \"dbgwvr10_el1\";\n\t\tcase 32855: return \"dbgwcr10_el1\";\n\t\tcase 32860: return \"dbgbvr11_el1\";\n\t\tcase 32861: return \"dbgbcr11_el1\";\n\t\tcase 32862: return \"dbgwvr11_el1\";\n\t\tcase 32863: return \"dbgwcr11_el1\";\n\t\tcase 32868: return \"dbgbvr12_el1\";\n\t\tcase 32869: return \"dbgbcr12_el1\";\n\t\tcase 32870: return \"dbgwvr12_el1\";\n\t\tcase 32871: return \"dbgwcr12_el1\";\n\t\tcase 32876: return \"dbgbvr13_el1\";\n\t\tcase 32877: return \"dbgbcr13_el1\";\n\t\tcase 32878: return \"dbgwvr13_el1\";\n\t\tcase 32879: return \"dbgwcr13_el1\";\n\t\tcase 32884: return \"dbgbvr14_el1\";\n\t\tcase 32885: return \"dbgbcr14_el1\";\n\t\tcase 32886: return \"dbgwvr14_el1\";\n\t\tcase 32887: return \"dbgwcr14_el1\";\n\t\tcase 32892: return \"dbgbvr15_el1\";\n\t\tcase 32893: return \"dbgbcr15_el1\";\n\t\tcase 32894: return \"dbgwvr15_el1\";\n\t\tcase 32895: return \"dbgwcr15_el1\";\n\t\tcase 32900: return \"oslar_el1\";\n\t\tcase 32924: return \"osdlr_el1\";\n\t\tcase 32932: return \"dbgprcr_el1\";\n\t\tcase 33734: return \"dbgclaimset_el1\";\n\t\tcase 33742: return \"dbgclaimclr_el1\";\n\t\tcase 34817: return \"trctraceidr\";\n\t\tcase 34818: return \"trcvictlr\";\n\t\tcase 34820: return \"trcseqevr0\";\n\t\tcase 34821: return \"trccntrldvr0\";\n\t\tcase 34823: return \"trcimspec0\";\n\t\tcase 34824: return \"trcprgctlr\";\n\t\tcase 34825: return \"trcqctlr\";\n\t\tcase 34826: return \"trcviiectlr\";\n\t\tcase 34828: return \"trcseqevr1\";\n\t\tcase 34829: return \"trccntrldvr1\";\n\t\tcase 34831: return \"trcimspec1\";\n\t\tcase 34832: return \"trcprocselr\";\n\t\tcase 34834: return \"trcvissctlr\";\n\t\tcase 34836: return \"trcseqevr2\";\n\t\tcase 34837: return \"trccntrldvr2\";\n\t\tcase 34839: return \"trcimspec2\";\n\t\tcase 34842: return \"trcvipcssctlr\";\n\t\tcase 34845: return \"trccntrldvr3\";\n\t\tcase 34847: return \"trcimspec3\";\n\t\tcase 34848: return \"trcconfigr\";\n\t\tcase 34853: return \"trccntctlr0\";\n\t\tcase 34855: return \"trcimspec4\";\n\t\tcase 34861: return \"trccntctlr1\";\n\t\tcase 34863: return \"trcimspec5\";\n\t\tcase 34864: return \"trcauxctlr\";\n\t\tcase 34868: return \"trcseqrstevr\";\n\t\tcase 34869: return \"trccntctlr2\";\n\t\tcase 34871: return \"trcimspec6\";\n\t\tcase 34876: return \"trcseqstr\";\n\t\tcase 34877: return \"trccntctlr3\";\n\t\tcase 34879: return \"trcimspec7\";\n\t\tcase 34880: return \"trceventctl0r\";\n\t\tcase 34882: return \"trcvdctlr\";\n\t\tcase 34884: return \"trcextinselr\";\n\t\tcase 34885: return \"trccntvr0\";\n\t\tcase 34888: return \"trceventctl1r\";\n\t\tcase 34890: return \"trcvdsacctlr\";\n\t\tcase 34892: return \"trcextinselr1\";\n\t\tcase 34893: return \"trccntvr1\";\n\t\tcase 34896: return \"trcrsr\";\n\t\tcase 34898: return \"trcvdarcctlr\";\n\t\tcase 34900: return \"trcextinselr2\";\n\t\tcase 34901: return \"trccntvr2\";\n\t\tcase 34904: return \"trcstallctlr\";\n\t\tcase 34908: return \"trcextinselr3\";\n\t\tcase 34909: return \"trccntvr3\";\n\t\tcase 34912: return \"trctsctlr\";\n\t\tcase 34920: return \"trcsyncpr\";\n\t\tcase 34928: return \"trcccctlr\";\n\t\tcase 34936: return \"trcbbctlr\";\n\t\tcase 34945: return \"trcrsctlr16\";\n\t\tcase 34946: return \"trcssccr0\";\n\t\tcase 34947: return \"trcsspcicr0\";\n\t\tcase 34948: return \"trcoslar\";\n\t\tcase 34953: return \"trcrsctlr17\";\n\t\tcase 34954: return \"trcssccr1\";\n\t\tcase 34955: return \"trcsspcicr1\";\n\t\tcase 34960: return \"trcrsctlr2\";\n\t\tcase 34961: return \"trcrsctlr18\";\n\t\tcase 34962: return \"trcssccr2\";\n\t\tcase 34963: return \"trcsspcicr2\";\n\t\tcase 34968: return \"trcrsctlr3\";\n\t\tcase 34969: return \"trcrsctlr19\";\n\t\tcase 34970: return \"trcssccr3\";\n\t\tcase 34971: return \"trcsspcicr3\";\n\t\tcase 34976: return \"trcrsctlr4\";\n\t\tcase 34977: return \"trcrsctlr20\";\n\t\tcase 34978: return \"trcssccr4\";\n\t\tcase 34979: return \"trcsspcicr4\";\n\t\tcase 34980: return \"trcpdcr\";\n\t\tcase 34984: return \"trcrsctlr5\";\n\t\tcase 34985: return \"trcrsctlr21\";\n\t\tcase 34986: return \"trcssccr5\";\n\t\tcase 34987: return \"trcsspcicr5\";\n\t\tcase 34992: return \"trcrsctlr6\";\n\t\tcase 34993: return \"trcrsctlr22\";\n\t\tcase 34994: return \"trcssccr6\";\n\t\tcase 34995: return \"trcsspcicr6\";\n\t\tcase 35000: return \"trcrsctlr7\";\n\t\tcase 35001: return \"trcrsctlr23\";\n\t\tcase 35002: return \"trcssccr7\";\n\t\tcase 35003: return \"trcsspcicr7\";\n\t\tcase 35008: return \"trcrsctlr8\";\n\t\tcase 35009: return \"trcrsctlr24\";\n\t\tcase 35010: return \"trcsscsr0\";\n\t\tcase 35016: return \"trcrsctlr9\";\n\t\tcase 35017: return \"trcrsctlr25\";\n\t\tcase 35018: return \"trcsscsr1\";\n\t\tcase 35024: return \"trcrsctlr10\";\n\t\tcase 35025: return \"trcrsctlr26\";\n\t\tcase 35026: return \"trcsscsr2\";\n\t\tcase 35032: return \"trcrsctlr11\";\n\t\tcase 35033: return \"trcrsctlr27\";\n\t\tcase 35034: return \"trcsscsr3\";\n\t\tcase 35040: return \"trcrsctlr12\";\n\t\tcase 35041: return \"trcrsctlr28\";\n\t\tcase 35042: return \"trcsscsr4\";\n\t\tcase 35048: return \"trcrsctlr13\";\n\t\tcase 35049: return \"trcrsctlr29\";\n\t\tcase 35050: return \"trcsscsr5\";\n\t\tcase 35056: return \"trcrsctlr14\";\n\t\tcase 35057: return \"trcrsctlr30\";\n\t\tcase 35058: return \"trcsscsr6\";\n\t\tcase 35064: return \"trcrsctlr15\";\n\t\tcase 35065: return \"trcrsctlr31\";\n\t\tcase 35066: return \"trcsscsr7\";\n\t\tcase 35072: return \"trcacvr0\";\n\t\tcase 35073: return \"trcacvr8\";\n\t\tcase 35074: return \"trcacatr0\";\n\t\tcase 35075: return \"trcacatr8\";\n\t\tcase 35076: return \"trcdvcvr0\";\n\t\tcase 35077: return \"trcdvcvr4\";\n\t\tcase 35078: return \"trcdvcmr0\";\n\t\tcase 35079: return \"trcdvcmr4\";\n\t\tcase 35088: return \"trcacvr1\";\n\t\tcase 35089: return \"trcacvr9\";\n\t\tcase 35090: return \"trcacatr1\";\n\t\tcase 35091: return \"trcacatr9\";\n\t\tcase 35104: return \"trcacvr2\";\n\t\tcase 35105: return \"trcacvr10\";\n\t\tcase 35106: return \"trcacatr2\";\n\t\tcase 35107: return \"trcacatr10\";\n\t\tcase 35108: return \"trcdvcvr1\";\n\t\tcase 35109: return \"trcdvcvr5\";\n\t\tcase 35110: return \"trcdvcmr1\";\n\t\tcase 35111: return \"trcdvcmr5\";\n\t\tcase 35120: return \"trcacvr3\";\n\t\tcase 35121: return \"trcacvr11\";\n\t\tcase 35122: return \"trcacatr3\";\n\t\tcase 35123: return \"trcacatr11\";\n\t\tcase 35136: return \"trcacvr4\";\n\t\tcase 35137: return \"trcacvr12\";\n\t\tcase 35138: return \"trcacatr4\";\n\t\tcase 35139: return \"trcacatr12\";\n\t\tcase 35140: return \"trcdvcvr2\";\n\t\tcase 35141: return \"trcdvcvr6\";\n\t\tcase 35142: return \"trcdvcmr2\";\n\t\tcase 35143: return \"trcdvcmr6\";\n\t\tcase 35152: return \"trcacvr5\";\n\t\tcase 35153: return \"trcacvr13\";\n\t\tcase 35154: return \"trcacatr5\";\n\t\tcase 35155: return \"trcacatr13\";\n\t\tcase 35168: return \"trcacvr6\";\n\t\tcase 35169: return \"trcacvr14\";\n\t\tcase 35170: return \"trcacatr6\";\n\t\tcase 35171: return \"trcacatr14\";\n\t\tcase 35172: return \"trcdvcvr3\";\n\t\tcase 35173: return \"trcdvcvr7\";\n\t\tcase 35174: return \"trcdvcmr3\";\n\t\tcase 35175: return \"trcdvcmr7\";\n\t\tcase 35184: return \"trcacvr7\";\n\t\tcase 35185: return \"trcacvr15\";\n\t\tcase 35186: return \"trcacatr7\";\n\t\tcase 35187: return \"trcacatr15\";\n\t\tcase 35200: return \"trccidcvr0\";\n\t\tcase 35201: return \"trcvmidcvr0\";\n\t\tcase 35202: return \"trccidcctlr0\";\n\t\tcase 35210: return \"trccidcctlr1\";\n\t\tcase 35216: return \"trccidcvr1\";\n\t\tcase 35217: return \"trcvmidcvr1\";\n\t\tcase 35218: return \"trcvmidcctlr0\";\n\t\tcase 35226: return \"trcvmidcctlr1\";\n\t\tcase 35232: return \"trccidcvr2\";\n\t\tcase 35233: return \"trcvmidcvr2\";\n\t\tcase 35248: return \"trccidcvr3\";\n\t\tcase 35249: return \"trcvmidcvr3\";\n\t\tcase 35264: return \"trccidcvr4\";\n\t\tcase 35265: return \"trcvmidcvr4\";\n\t\tcase 35280: return \"trccidcvr5\";\n\t\tcase 35281: return \"trcvmidcvr5\";\n\t\tcase 35296: return \"trccidcvr6\";\n\t\tcase 35297: return \"trcvmidcvr6\";\n\t\tcase 35312: return \"trccidcvr7\";\n\t\tcase 35313: return \"trcvmidcvr7\";\n\t\tcase 35716: return \"trcitctrl\";\n\t\tcase 35782: return \"trcclaimset\";\n\t\tcase 35790: return \"trcclaimclr\";\n\t\tcase 35814: return \"trclar\";\n\t\tcase 36864: return \"teecr32_el1\";\n\t\tcase 36992: return \"teehbr32_el1\";\n\t\tcase 38944: return \"dbgdtr_el0\";\n\t\tcase 38952: return \"dbgdtrtx_el0\";\n\t\tcase 41016: return \"dbgvcr32_el2\";\n\t\tcase 49157: return \"mpidr_el1\";\n\t\tcase 49280: return \"sctlr_el1\";\n\t\tcase 49281: return \"actlr_el1\";\n\t\tcase 49282: return \"cpacr_el1\";\n\t\tcase 49285: return \"rgsr_el1\";\n\t\tcase 49286: return \"gcr_el1\";\n\t\tcase 49297: return \"trfcr_el1\";\n\t\tcase 49408: return \"ttbr0_el1\";\n\t\tcase 49409: return \"ttbr1_el1\";\n\t\tcase 49410: return \"tcr_el1\";\n\t\tcase 49416: return \"apiakeylo_el1\";\n\t\tcase 49417: return \"apiakeyhi_el1\";\n\t\tcase 49418: return \"apibkeylo_el1\";\n\t\tcase 49419: return \"apibkeyhi_el1\";\n\t\tcase 49424: return \"apdakeylo_el1\";\n\t\tcase 49425: return \"apdakeyhi_el1\";\n\t\tcase 49426: return \"apdbkeylo_el1\";\n\t\tcase 49427: return \"apdbkeyhi_el1\";\n\t\tcase 49432: return \"apgakeylo_el1\";\n\t\tcase 49433: return \"apgakeyhi_el1\";\n\t\tcase 49664: return \"spsr_el1\";\n\t\tcase 49665: return \"elr_el1\";\n\t\tcase 49672: return \"sp_el0\";\n\t\tcase 49680: return \"spsel\";\n\t\tcase 49682: return \"currentel\";\n\t\tcase 49683: return \"pan\";\n\t\tcase 49684: return \"uao\";\n\t\tcase 49712: return \"icc_pmr_el1\";\n\t\tcase 49800: return \"afsr0_el1\";\n\t\tcase 49801: return \"afsr1_el1\";\n\t\tcase 49808: return \"esr_el1\";\n\t\tcase 49817: return \"errselr_el1\";\n\t\tcase 49825: return \"erxctlr_el1\";\n\t\tcase 49826: return \"erxstatus_el1\";\n\t\tcase 49827: return \"erxaddr_el1\";\n\t\tcase 49829: return \"erxpfgctl_el1\";\n\t\tcase 49830: return \"erxpfgcdn_el1\";\n\t\tcase 49832: return \"erxmisc0_el1\";\n\t\tcase 49833: return \"erxmisc1_el1\";\n\t\tcase 49834: return \"erxmisc2_el1\";\n\t\tcase 49835: return \"erxmisc3_el1\";\n\t\tcase 49839: return \"erxts_el1\";\n\t\tcase 49840: return \"tfsr_el1\";\n\t\tcase 49841: return \"tfsre0_el1\";\n\t\tcase 49920: return \"far_el1\";\n\t\tcase 50080: return \"par_el1\";\n\t\tcase 50376: return \"pmscr_el1\";\n\t\tcase 50378: return \"pmsicr_el1\";\n\t\tcase 50379: return \"pmsirr_el1\";\n\t\tcase 50380: return \"pmsfcr_el1\";\n\t\tcase 50381: return \"pmsevfr_el1\";\n\t\tcase 50382: return \"pmslatfr_el1\";\n\t\tcase 50383: return \"pmsidr_el1\";\n\t\tcase 50384: return \"pmblimitr_el1\";\n\t\tcase 50385: return \"pmbptr_el1\";\n\t\tcase 50387: return \"pmbsr_el1\";\n\t\tcase 50391: return \"pmbidr_el1\";\n\t\tcase 50392: return \"trblimitr_el1\";\n\t\tcase 50393: return \"trbptr_el1\";\n\t\tcase 50394: return \"trbbaser_el1\";\n\t\tcase 50395: return \"trbsr_el1\";\n\t\tcase 50396: return \"trbmar_el1\";\n\t\tcase 50398: return \"trbtrg_el1\";\n\t\tcase 50417: return \"pmintenset_el1\";\n\t\tcase 50418: return \"pmintenclr_el1\";\n\t\tcase 50422: return \"pmmir_el1\";\n\t\tcase 50448: return \"mair_el1\";\n\t\tcase 50456: return \"amair_el1\";\n\t\tcase 50464: return \"lorsa_el1\";\n\t\tcase 50465: return \"lorea_el1\";\n\t\tcase 50466: return \"lorn_el1\";\n\t\tcase 50467: return \"lorc_el1\";\n\t\tcase 50472: return \"mpam1_el1\";\n\t\tcase 50473: return \"mpam0_el1\";\n\t\tcase 50688: return \"vbar_el1\";\n\t\tcase 50690: return \"rmr_el1\";\n\t\tcase 50697: return \"disr_el1\";\n\t\tcase 50753: return \"icc_eoir0_el1\";\n\t\tcase 50755: return \"icc_bpr0_el1\";\n\t\tcase 50756: return \"icc_ap0r0_el1\";\n\t\tcase 50757: return \"icc_ap0r1_el1\";\n\t\tcase 50758: return \"icc_ap0r2_el1\";\n\t\tcase 50759: return \"icc_ap0r3_el1\";\n\t\tcase 50760: return \"icc_ap1r0_el1\";\n\t\tcase 50761: return \"icc_ap1r1_el1\";\n\t\tcase 50762: return \"icc_ap1r2_el1\";\n\t\tcase 50763: return \"icc_ap1r3_el1\";\n\t\tcase 50777: return \"icc_dir_el1\";\n\t\tcase 50781: return \"icc_sgi1r_el1\";\n\t\tcase 50782: return \"icc_asgi1r_el1\";\n\t\tcase 50783: return \"icc_sgi0r_el1\";\n\t\tcase 50785: return \"icc_eoir1_el1\";\n\t\tcase 50787: return \"icc_bpr1_el1\";\n\t\tcase 50788: return \"icc_ctlr_el1\";\n\t\tcase 50789: return \"icc_sre_el1\";\n\t\tcase 50790: return \"icc_igrpen0_el1\";\n\t\tcase 50791: return \"icc_igrpen1_el1\";\n\t\tcase 50792: return \"icc_seien_el1\";\n\t\tcase 50817: return \"contextidr_el1\";\n\t\tcase 50820: return \"tpidr_el1\";\n\t\tcase 50823: return \"scxtnum_el1\";\n\t\tcase 50952: return \"cntkctl_el1\";\n\t\tcase 53248: return \"csselr_el1\";\n\t\tcase 55297: return \"ctr_el0\";\n\t\tcase 55303: return \"dczid_el0\";\n\t\tcase 55824: return \"nzcv\";\n\t\tcase 55825: return \"daifset\";\n\t\tcase 55829: return \"dit\";\n\t\tcase 55830: return \"ssbs\";\n\t\tcase 55831: return \"tco\";\n\t\tcase 55840: return \"fpcr\";\n\t\tcase 55841: return \"fpsr\";\n\t\tcase 55848: return \"dspsr_el0\";\n\t\tcase 55849: return \"dlr_el0\";\n\t\tcase 56544: return \"pmcr_el0\";\n\t\tcase 56545: return \"pmcntenset_el0\";\n\t\tcase 56546: return \"pmcntenclr_el0\";\n\t\tcase 56547: return \"pmovsclr_el0\";\n\t\tcase 56548: return \"pmswinc_el0\";\n\t\tcase 56549: return \"pmselr_el0\";\n\t\tcase 56552: return \"pmccntr_el0\";\n\t\tcase 56553: return \"pmxevtyper_el0\";\n\t\tcase 56554: return \"pmxevcntr_el0\";\n\t\tcase 56557: return \"daifclr\";\n\t\tcase 56560: return \"pmuserenr_el0\";\n\t\tcase 56563: return \"pmovsset_el0\";\n\t\tcase 56962: return \"tpidr_el0\";\n\t\tcase 56963: return \"tpidrro_el0\";\n\t\tcase 56967: return \"scxtnum_el0\";\n\t\tcase 56976: return \"amcr_el0\";\n\t\tcase 56979: return \"amuserenr_el0\";\n\t\tcase 56980: return \"amcntenclr0_el0\";\n\t\tcase 56981: return \"amcntenset0_el0\";\n\t\tcase 56984: return \"amcntenclr1_el0\";\n\t\tcase 56985: return \"amcntenset1_el0\";\n\t\tcase 56992: return \"amevcntr00_el0\";\n\t\tcase 56993: return \"amevcntr01_el0\";\n\t\tcase 56994: return \"amevcntr02_el0\";\n\t\tcase 56995: return \"amevcntr03_el0\";\n\t\tcase 57056: return \"amevcntr10_el0\";\n\t\tcase 57057: return \"amevcntr11_el0\";\n\t\tcase 57058: return \"amevcntr12_el0\";\n\t\tcase 57059: return \"amevcntr13_el0\";\n\t\tcase 57060: return \"amevcntr14_el0\";\n\t\tcase 57061: return \"amevcntr15_el0\";\n\t\tcase 57062: return \"amevcntr16_el0\";\n\t\tcase 57063: return \"amevcntr17_el0\";\n\t\tcase 57064: return \"amevcntr18_el0\";\n\t\tcase 57065: return \"amevcntr19_el0\";\n\t\tcase 57066: return \"amevcntr110_el0\";\n\t\tcase 57067: return \"amevcntr111_el0\";\n\t\tcase 57068: return \"amevcntr112_el0\";\n\t\tcase 57069: return \"amevcntr113_el0\";\n\t\tcase 57070: return \"amevcntr114_el0\";\n\t\tcase 57071: return \"amevcntr115_el0\";\n\t\tcase 57072: return \"amevtyper10_el0\";\n\t\tcase 57073: return \"amevtyper11_el0\";\n\t\tcase 57074: return \"amevtyper12_el0\";\n\t\tcase 57075: return \"amevtyper13_el0\";\n\t\tcase 57076: return \"amevtyper14_el0\";\n\t\tcase 57077: return \"amevtyper15_el0\";\n\t\tcase 57078: return \"amevtyper16_el0\";\n\t\tcase 57079: return \"amevtyper17_el0\";\n\t\tcase 57080: return \"amevtyper18_el0\";\n\t\tcase 57081: return \"amevtyper19_el0\";\n\t\tcase 57082: return \"amevtyper110_el0\";\n\t\tcase 57083: return \"amevtyper111_el0\";\n\t\tcase 57084: return \"amevtyper112_el0\";\n\t\tcase 57085: return \"amevtyper113_el0\";\n\t\tcase 57086: return \"amevtyper114_el0\";\n\t\tcase 57087: return \"amevtyper115_el0\";\n\t\tcase 57088: return \"cntfrq_el0\";\n\t\tcase 57089: return \"cntpct_el0\";\n\t\tcase 57104: return \"cntp_tval_el0\";\n\t\tcase 57105: return \"cntp_ctl_el0\";\n\t\tcase 57106: return \"cntp_cval_el0\";\n\t\tcase 57112: return \"cntv_tval_el0\";\n\t\tcase 57113: return \"cntv_ctl_el0\";\n\t\tcase 57114: return \"cntv_cval_el0\";\n\t\tcase 57152: return \"pmevcntr0_el0\";\n\t\tcase 57153: return \"pmevcntr1_el0\";\n\t\tcase 57154: return \"pmevcntr2_el0\";\n\t\tcase 57155: return \"pmevcntr3_el0\";\n\t\tcase 57156: return \"pmevcntr4_el0\";\n\t\tcase 57157: return \"pmevcntr5_el0\";\n\t\tcase 57158: return \"pmevcntr6_el0\";\n\t\tcase 57159: return \"pmevcntr7_el0\";\n\t\tcase 57160: return \"pmevcntr8_el0\";\n\t\tcase 57161: return \"pmevcntr9_el0\";\n\t\tcase 57162: return \"pmevcntr10_el0\";\n\t\tcase 57163: return \"pmevcntr11_el0\";\n\t\tcase 57164: return \"pmevcntr12_el0\";\n\t\tcase 57165: return \"pmevcntr13_el0\";\n\t\tcase 57166: return \"pmevcntr14_el0\";\n\t\tcase 57167: return \"pmevcntr15_el0\";\n\t\tcase 57168: return \"pmevcntr16_el0\";\n\t\tcase 57169: return \"pmevcntr17_el0\";\n\t\tcase 57170: return \"pmevcntr18_el0\";\n\t\tcase 57171: return \"pmevcntr19_el0\";\n\t\tcase 57172: return \"pmevcntr20_el0\";\n\t\tcase 57173: return \"pmevcntr21_el0\";\n\t\tcase 57174: return \"pmevcntr22_el0\";\n\t\tcase 57175: return \"pmevcntr23_el0\";\n\t\tcase 57176: return \"pmevcntr24_el0\";\n\t\tcase 57177: return \"pmevcntr25_el0\";\n\t\tcase 57178: return \"pmevcntr26_el0\";\n\t\tcase 57179: return \"pmevcntr27_el0\";\n\t\tcase 57180: return \"pmevcntr28_el0\";\n\t\tcase 57181: return \"pmevcntr29_el0\";\n\t\tcase 57182: return \"pmevcntr30_el0\";\n\t\tcase 57184: return \"pmevtyper0_el0\";\n\t\tcase 57185: return \"pmevtyper1_el0\";\n\t\tcase 57186: return \"pmevtyper2_el0\";\n\t\tcase 57187: return \"pmevtyper3_el0\";\n\t\tcase 57188: return \"pmevtyper4_el0\";\n\t\tcase 57189: return \"pmevtyper5_el0\";\n\t\tcase 57190: return \"pmevtyper6_el0\";\n\t\tcase 57191: return \"pmevtyper7_el0\";\n\t\tcase 57192: return \"pmevtyper8_el0\";\n\t\tcase 57193: return \"pmevtyper9_el0\";\n\t\tcase 57194: return \"pmevtyper10_el0\";\n\t\tcase 57195: return \"pmevtyper11_el0\";\n\t\tcase 57196: return \"pmevtyper12_el0\";\n\t\tcase 57197: return \"pmevtyper13_el0\";\n\t\tcase 57198: return \"pmevtyper14_el0\";\n\t\tcase 57199: return \"pmevtyper15_el0\";\n\t\tcase 57200: return \"pmevtyper16_el0\";\n\t\tcase 57201: return \"pmevtyper17_el0\";\n\t\tcase 57202: return \"pmevtyper18_el0\";\n\t\tcase 57203: return \"pmevtyper19_el0\";\n\t\tcase 57204: return \"pmevtyper20_el0\";\n\t\tcase 57205: return \"pmevtyper21_el0\";\n\t\tcase 57206: return \"pmevtyper22_el0\";\n\t\tcase 57207: return \"pmevtyper23_el0\";\n\t\tcase 57208: return \"pmevtyper24_el0\";\n\t\tcase 57209: return \"pmevtyper25_el0\";\n\t\tcase 57210: return \"pmevtyper26_el0\";\n\t\tcase 57211: return \"pmevtyper27_el0\";\n\t\tcase 57212: return \"pmevtyper28_el0\";\n\t\tcase 57213: return \"pmevtyper29_el0\";\n\t\tcase 57214: return \"pmevtyper30_el0\";\n\t\tcase 57215: return \"pmccfiltr_el0\";\n\t\tcase 57344: return \"vpidr_el2\";\n\t\tcase 57349: return \"vmpidr_el2\";\n\t\tcase 57472: return \"sctlr_el2\";\n\t\tcase 57473: return \"actlr_el2\";\n\t\tcase 57480: return \"hcr_el2\";\n\t\tcase 57481: return \"mdcr_el2\";\n\t\tcase 57482: return \"cptr_el2\";\n\t\tcase 57483: return \"hstr_el2\";\n\t\tcase 57487: return \"hacr_el2\";\n\t\tcase 57489: return \"trfcr_el2\";\n\t\tcase 57497: return \"sder32_el2\";\n\t\tcase 57600: return \"ttbr0_el2\";\n\t\tcase 57601: return \"ttbr1_el2\";\n\t\tcase 57602: return \"tcr_el2\";\n\t\tcase 57608: return \"vttbr_el2\";\n\t\tcase 57610: return \"vtcr_el2\";\n\t\tcase 57616: return \"vncr_el2\";\n\t\tcase 57648: return \"vsttbr_el2\";\n\t\tcase 57650: return \"vstcr_el2\";\n\t\tcase 57728: return \"dacr32_el2\";\n\t\tcase 57856: return \"spsr_el2\";\n\t\tcase 57857: return \"elr_el2\";\n\t\tcase 57864: return \"sp_el1\";\n\t\tcase 57880: return \"spsr_irq\";\n\t\tcase 57881: return \"spsr_abt\";\n\t\tcase 57882: return \"spsr_und\";\n\t\tcase 57883: return \"spsr_fiq\";\n\t\tcase 57985: return \"ifsr32_el2\";\n\t\tcase 57992: return \"afsr0_el2\";\n\t\tcase 57993: return \"afsr1_el2\";\n\t\tcase 58000: return \"esr_el2\";\n\t\tcase 58003: return \"vsesr_el2\";\n\t\tcase 58008: return \"fpexc32_el2\";\n\t\tcase 58032: return \"tfsr_el2\";\n\t\tcase 58112: return \"far_el2\";\n\t\tcase 58116: return \"hpfar_el2\";\n\t\tcase 58568: return \"pmscr_el2\";\n\t\tcase 58640: return \"mair_el2\";\n\t\tcase 58648: return \"amair_el2\";\n\t\tcase 58656: return \"mpamhcr_el2\";\n\t\tcase 58657: return \"mpamvpmv_el2\";\n\t\tcase 58664: return \"mpam2_el2\";\n\t\tcase 58672: return \"mpamvpm0_el2\";\n\t\tcase 58673: return \"mpamvpm1_el2\";\n\t\tcase 58674: return \"mpamvpm2_el2\";\n\t\tcase 58675: return \"mpamvpm3_el2\";\n\t\tcase 58676: return \"mpamvpm4_el2\";\n\t\tcase 58677: return \"mpamvpm5_el2\";\n\t\tcase 58678: return \"mpamvpm6_el2\";\n\t\tcase 58679: return \"mpamvpm7_el2\";\n\t\tcase 58880: return \"vbar_el2\";\n\t\tcase 58882: return \"rmr_el2\";\n\t\tcase 58889: return \"vdisr_el2\";\n\t\tcase 58944: return \"ich_ap0r0_el2\";\n\t\tcase 58945: return \"ich_ap0r1_el2\";\n\t\tcase 58946: return \"ich_ap0r2_el2\";\n\t\tcase 58947: return \"ich_ap0r3_el2\";\n\t\tcase 58952: return \"ich_ap1r0_el2\";\n\t\tcase 58953: return \"ich_ap1r1_el2\";\n\t\tcase 58954: return \"ich_ap1r2_el2\";\n\t\tcase 58955: return \"ich_ap1r3_el2\";\n\t\tcase 58956: return \"ich_vseir_el2\";\n\t\tcase 58957: return \"icc_sre_el2\";\n\t\tcase 58968: return \"ich_hcr_el2\";\n\t\tcase 58970: return \"ich_misr_el2\";\n\t\tcase 58975: return \"ich_vmcr_el2\";\n\t\tcase 58976: return \"ich_lr0_el2\";\n\t\tcase 58977: return \"ich_lr1_el2\";\n\t\tcase 58978: return \"ich_lr2_el2\";\n\t\tcase 58979: return \"ich_lr3_el2\";\n\t\tcase 58980: return \"ich_lr4_el2\";\n\t\tcase 58981: return \"ich_lr5_el2\";\n\t\tcase 58982: return \"ich_lr6_el2\";\n\t\tcase 58983: return \"ich_lr7_el2\";\n\t\tcase 58984: return \"ich_lr8_el2\";\n\t\tcase 58985: return \"ich_lr9_el2\";\n\t\tcase 58986: return \"ich_lr10_el2\";\n\t\tcase 58987: return \"ich_lr11_el2\";\n\t\tcase 58988: return \"ich_lr12_el2\";\n\t\tcase 58989: return \"ich_lr13_el2\";\n\t\tcase 58990: return \"ich_lr14_el2\";\n\t\tcase 58991: return \"ich_lr15_el2\";\n\t\tcase 59009: return \"contextidr_el2\";\n\t\tcase 59010: return \"tpidr_el2\";\n\t\tcase 59015: return \"scxtnum_el2\";\n\t\tcase 59139: return \"cntvoff_el2\";\n\t\tcase 59144: return \"cnthctl_el2\";\n\t\tcase 59152: return \"cnthp_tval_el2\";\n\t\tcase 59153: return \"cnthp_ctl_el2\";\n\t\tcase 59154: return \"cnthp_cval_el2\";\n\t\tcase 59160: return \"cnthv_tval_el2\";\n\t\tcase 59161: return \"cnthv_ctl_el2\";\n\t\tcase 59162: return \"cnthv_cval_el2\";\n\t\tcase 59168: return \"cnthvs_tval_el2\";\n\t\tcase 59169: return \"cnthvs_ctl_el2\";\n\t\tcase 59170: return \"cnthvs_cval_el2\";\n\t\tcase 59176: return \"cnthps_tval_el2\";\n\t\tcase 59177: return \"cnthps_ctl_el2\";\n\t\tcase 59178: return \"cnthps_cval_el2\";\n\t\tcase 59520: return \"sctlr_el12\";\n\t\tcase 59522: return \"cpacr_el12\";\n\t\tcase 59537: return \"trfcr_el12\";\n\t\tcase 59648: return \"ttbr0_el12\";\n\t\tcase 59649: return \"ttbr1_el12\";\n\t\tcase 59650: return \"tcr_el12\";\n\t\tcase 59904: return \"spsr_el12\";\n\t\tcase 59905: return \"elr_el12\";\n\t\tcase 60040: return \"afsr0_el12\";\n\t\tcase 60041: return \"afsr1_el12\";\n\t\tcase 60048: return \"esr_el12\";\n\t\tcase 60080: return \"tfsr_el12\";\n\t\tcase 60160: return \"far_el12\";\n\t\tcase 60616: return \"pmscr_el12\";\n\t\tcase 60688: return \"mair_el12\";\n\t\tcase 60696: return \"amair_el12\";\n\t\tcase 60712: return \"mpam1_el12\";\n\t\tcase 60928: return \"vbar_el12\";\n\t\tcase 61057: return \"contextidr_el12\";\n\t\tcase 61063: return \"scxtnum_el12\";\n\t\tcase 61192: return \"cntkctl_el12\";\n\t\tcase 61200: return \"cntp_tval_el02\";\n\t\tcase 61201: return \"cntp_ctl_el02\";\n\t\tcase 61202: return \"cntp_cval_el02\";\n\t\tcase 61208: return \"cntv_tval_el02\";\n\t\tcase 61209: return \"cntv_ctl_el02\";\n\t\tcase 61210: return \"cntv_cval_el02\";\n\t\tcase 61568: return \"sctlr_el3\";\n\t\tcase 61569: return \"actlr_el3\";\n\t\tcase 61576: return \"scr_el3\";\n\t\tcase 61577: return \"sder32_el3\";\n\t\tcase 61578: return \"cptr_el3\";\n\t\tcase 61593: return \"mdcr_el3\";\n\t\tcase 61696: return \"ttbr0_el3\";\n\t\tcase 61698: return \"tcr_el3\";\n\t\tcase 61952: return \"spsr_el3\";\n\t\tcase 61953: return \"elr_el3\";\n\t\tcase 61960: return \"sp_el2\";\n\t\tcase 62088: return \"afsr0_el3\";\n\t\tcase 62089: return \"afsr1_el3\";\n\t\tcase 62096: return \"esr_el3\";\n\t\tcase 62128: return \"tfsr_el3\";\n\t\tcase 62208: return \"far_el3\";\n\t\tcase 62736: return \"mair_el3\";\n\t\tcase 62744: return \"amair_el3\";\n\t\tcase 62760: return \"mpam3_el3\";\n\t\tcase 62976: return \"vbar_el3\";\n\t\tcase 62978: return \"rmr_el3\";\n\t\tcase 63076: return \"icc_ctlr_el3\";\n\t\tcase 63077: return \"icc_sre_el3\";\n\t\tcase 63079: return \"icc_igrpen1_el3\";\n\t\tcase 63106: return \"tpidr_el3\";\n\t\tcase 63111: return \"scxtnum_el3\";\n\t\tcase 65296: return \"cntps_tval_el1\";\n\t\tcase 65297: return \"cntps_ctl_el1\";\n\t\tcase 65298: return \"cntps_cval_el1\";\n\t\tcase 65299: return \"spsel\";\n\t\tdefault: return \"\";\n\t}\n}\n\nconst char *get_system_register_name_decomposed(int op0, int op1, int CRn, int CRm, int op2)\n{\n\tenum SystemReg sr = (enum SystemReg)((op0<<14)|(op1<<11)|(CRn<<7)|(CRm<<3)|op2);\n\treturn get_system_register_name(sr);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs.h",
    "content": "#pragma once\n\nenum SystemReg {\n\tSYSREG_NONE=32769,\n\tREG_OSDTRRX_EL1=32770,\n\tREG_DBGBVR0_EL1=32772,\n\tREG_DBGBCR0_EL1=32773,\n\tREG_DBGWVR0_EL1=32774,\n\tREG_DBGWCR0_EL1=32775,\n\tREG_DBGBVR1_EL1=32780,\n\tREG_DBGBCR1_EL1=32781,\n\tREG_DBGWVR1_EL1=32782,\n\tREG_DBGWCR1_EL1=32783,\n\tREG_MDCCINT_EL1=32784,\n\tREG_MDSCR_EL1=32786,\n\tREG_DBGBVR2_EL1=32788,\n\tREG_DBGBCR2_EL1=32789,\n\tREG_DBGWVR2_EL1=32790,\n\tREG_DBGWCR2_EL1=32791,\n\tREG_OSDTRTX_EL1=32794,\n\tREG_DBGBVR3_EL1=32796,\n\tREG_DBGBCR3_EL1=32797,\n\tREG_DBGWVR3_EL1=32798,\n\tREG_DBGWCR3_EL1=32799,\n\tREG_DBGBVR4_EL1=32804,\n\tREG_DBGBCR4_EL1=32805,\n\tREG_DBGWVR4_EL1=32806,\n\tREG_DBGWCR4_EL1=32807,\n\tREG_DBGBVR5_EL1=32812,\n\tREG_DBGBCR5_EL1=32813,\n\tREG_DBGWVR5_EL1=32814,\n\tREG_DBGWCR5_EL1=32815,\n\tREG_OSECCR_EL1=32818,\n\tREG_DBGBVR6_EL1=32820,\n\tREG_DBGBCR6_EL1=32821,\n\tREG_DBGWVR6_EL1=32822,\n\tREG_DBGWCR6_EL1=32823,\n\tREG_DBGBVR7_EL1=32828,\n\tREG_DBGBCR7_EL1=32829,\n\tREG_DBGWVR7_EL1=32830,\n\tREG_DBGWCR7_EL1=32831,\n\tREG_DBGBVR8_EL1=32836,\n\tREG_DBGBCR8_EL1=32837,\n\tREG_DBGWVR8_EL1=32838,\n\tREG_DBGWCR8_EL1=32839,\n\tREG_DBGBVR9_EL1=32844,\n\tREG_DBGBCR9_EL1=32845,\n\tREG_DBGWVR9_EL1=32846,\n\tREG_DBGWCR9_EL1=32847,\n\tREG_DBGBVR10_EL1=32852,\n\tREG_DBGBCR10_EL1=32853,\n\tREG_DBGWVR10_EL1=32854,\n\tREG_DBGWCR10_EL1=32855,\n\tREG_DBGBVR11_EL1=32860,\n\tREG_DBGBCR11_EL1=32861,\n\tREG_DBGWVR11_EL1=32862,\n\tREG_DBGWCR11_EL1=32863,\n\tREG_DBGBVR12_EL1=32868,\n\tREG_DBGBCR12_EL1=32869,\n\tREG_DBGWVR12_EL1=32870,\n\tREG_DBGWCR12_EL1=32871,\n\tREG_DBGBVR13_EL1=32876,\n\tREG_DBGBCR13_EL1=32877,\n\tREG_DBGWVR13_EL1=32878,\n\tREG_DBGWCR13_EL1=32879,\n\tREG_DBGBVR14_EL1=32884,\n\tREG_DBGBCR14_EL1=32885,\n\tREG_DBGWVR14_EL1=32886,\n\tREG_DBGWCR14_EL1=32887,\n\tREG_DBGBVR15_EL1=32892,\n\tREG_DBGBCR15_EL1=32893,\n\tREG_DBGWVR15_EL1=32894,\n\tREG_DBGWCR15_EL1=32895,\n\tREG_OSLAR_EL1=32900,\n\tREG_OSDLR_EL1=32924,\n\tREG_DBGPRCR_EL1=32932,\n\tREG_DBGCLAIMSET_EL1=33734,\n\tREG_DBGCLAIMCLR_EL1=33742,\n\tREG_TRCTRACEIDR=34817,\n\tREG_TRCVICTLR=34818,\n\tREG_TRCSEQEVR0=34820,\n\tREG_TRCCNTRLDVR0=34821,\n\tREG_TRCIMSPEC0=34823,\n\tREG_TRCPRGCTLR=34824,\n\tREG_TRCQCTLR=34825,\n\tREG_TRCVIIECTLR=34826,\n\tREG_TRCSEQEVR1=34828,\n\tREG_TRCCNTRLDVR1=34829,\n\tREG_TRCIMSPEC1=34831,\n\tREG_TRCPROCSELR=34832,\n\tREG_TRCVISSCTLR=34834,\n\tREG_TRCSEQEVR2=34836,\n\tREG_TRCCNTRLDVR2=34837,\n\tREG_TRCIMSPEC2=34839,\n\tREG_TRCVIPCSSCTLR=34842,\n\tREG_TRCCNTRLDVR3=34845,\n\tREG_TRCIMSPEC3=34847,\n\tREG_TRCCONFIGR=34848,\n\tREG_TRCCNTCTLR0=34853,\n\tREG_TRCIMSPEC4=34855,\n\tREG_TRCCNTCTLR1=34861,\n\tREG_TRCIMSPEC5=34863,\n\tREG_TRCAUXCTLR=34864,\n\tREG_TRCSEQRSTEVR=34868,\n\tREG_TRCCNTCTLR2=34869,\n\tREG_TRCIMSPEC6=34871,\n\tREG_TRCSEQSTR=34876,\n\tREG_TRCCNTCTLR3=34877,\n\tREG_TRCIMSPEC7=34879,\n\tREG_TRCEVENTCTL0R=34880,\n\tREG_TRCVDCTLR=34882,\n\tREG_TRCEXTINSELR=34884,\n\tREG_TRCCNTVR0=34885,\n\tREG_TRCEVENTCTL1R=34888,\n\tREG_TRCVDSACCTLR=34890,\n\tREG_TRCEXTINSELR1=34892,\n\tREG_TRCCNTVR1=34893,\n\tREG_TRCRSR=34896,\n\tREG_TRCVDARCCTLR=34898,\n\tREG_TRCEXTINSELR2=34900,\n\tREG_TRCCNTVR2=34901,\n\tREG_TRCSTALLCTLR=34904,\n\tREG_TRCEXTINSELR3=34908,\n\tREG_TRCCNTVR3=34909,\n\tREG_TRCTSCTLR=34912,\n\tREG_TRCSYNCPR=34920,\n\tREG_TRCCCCTLR=34928,\n\tREG_TRCBBCTLR=34936,\n\tREG_TRCRSCTLR16=34945,\n\tREG_TRCSSCCR0=34946,\n\tREG_TRCSSPCICR0=34947,\n\tREG_TRCOSLAR=34948,\n\tREG_TRCRSCTLR17=34953,\n\tREG_TRCSSCCR1=34954,\n\tREG_TRCSSPCICR1=34955,\n\tREG_TRCRSCTLR2=34960,\n\tREG_TRCRSCTLR18=34961,\n\tREG_TRCSSCCR2=34962,\n\tREG_TRCSSPCICR2=34963,\n\tREG_TRCRSCTLR3=34968,\n\tREG_TRCRSCTLR19=34969,\n\tREG_TRCSSCCR3=34970,\n\tREG_TRCSSPCICR3=34971,\n\tREG_TRCRSCTLR4=34976,\n\tREG_TRCRSCTLR20=34977,\n\tREG_TRCSSCCR4=34978,\n\tREG_TRCSSPCICR4=34979,\n\tREG_TRCPDCR=34980,\n\tREG_TRCRSCTLR5=34984,\n\tREG_TRCRSCTLR21=34985,\n\tREG_TRCSSCCR5=34986,\n\tREG_TRCSSPCICR5=34987,\n\tREG_TRCRSCTLR6=34992,\n\tREG_TRCRSCTLR22=34993,\n\tREG_TRCSSCCR6=34994,\n\tREG_TRCSSPCICR6=34995,\n\tREG_TRCRSCTLR7=35000,\n\tREG_TRCRSCTLR23=35001,\n\tREG_TRCSSCCR7=35002,\n\tREG_TRCSSPCICR7=35003,\n\tREG_TRCRSCTLR8=35008,\n\tREG_TRCRSCTLR24=35009,\n\tREG_TRCSSCSR0=35010,\n\tREG_TRCRSCTLR9=35016,\n\tREG_TRCRSCTLR25=35017,\n\tREG_TRCSSCSR1=35018,\n\tREG_TRCRSCTLR10=35024,\n\tREG_TRCRSCTLR26=35025,\n\tREG_TRCSSCSR2=35026,\n\tREG_TRCRSCTLR11=35032,\n\tREG_TRCRSCTLR27=35033,\n\tREG_TRCSSCSR3=35034,\n\tREG_TRCRSCTLR12=35040,\n\tREG_TRCRSCTLR28=35041,\n\tREG_TRCSSCSR4=35042,\n\tREG_TRCRSCTLR13=35048,\n\tREG_TRCRSCTLR29=35049,\n\tREG_TRCSSCSR5=35050,\n\tREG_TRCRSCTLR14=35056,\n\tREG_TRCRSCTLR30=35057,\n\tREG_TRCSSCSR6=35058,\n\tREG_TRCRSCTLR15=35064,\n\tREG_TRCRSCTLR31=35065,\n\tREG_TRCSSCSR7=35066,\n\tREG_TRCACVR0=35072,\n\tREG_TRCACVR8=35073,\n\tREG_TRCACATR0=35074,\n\tREG_TRCACATR8=35075,\n\tREG_TRCDVCVR0=35076,\n\tREG_TRCDVCVR4=35077,\n\tREG_TRCDVCMR0=35078,\n\tREG_TRCDVCMR4=35079,\n\tREG_TRCACVR1=35088,\n\tREG_TRCACVR9=35089,\n\tREG_TRCACATR1=35090,\n\tREG_TRCACATR9=35091,\n\tREG_TRCACVR2=35104,\n\tREG_TRCACVR10=35105,\n\tREG_TRCACATR2=35106,\n\tREG_TRCACATR10=35107,\n\tREG_TRCDVCVR1=35108,\n\tREG_TRCDVCVR5=35109,\n\tREG_TRCDVCMR1=35110,\n\tREG_TRCDVCMR5=35111,\n\tREG_TRCACVR3=35120,\n\tREG_TRCACVR11=35121,\n\tREG_TRCACATR3=35122,\n\tREG_TRCACATR11=35123,\n\tREG_TRCACVR4=35136,\n\tREG_TRCACVR12=35137,\n\tREG_TRCACATR4=35138,\n\tREG_TRCACATR12=35139,\n\tREG_TRCDVCVR2=35140,\n\tREG_TRCDVCVR6=35141,\n\tREG_TRCDVCMR2=35142,\n\tREG_TRCDVCMR6=35143,\n\tREG_TRCACVR5=35152,\n\tREG_TRCACVR13=35153,\n\tREG_TRCACATR5=35154,\n\tREG_TRCACATR13=35155,\n\tREG_TRCACVR6=35168,\n\tREG_TRCACVR14=35169,\n\tREG_TRCACATR6=35170,\n\tREG_TRCACATR14=35171,\n\tREG_TRCDVCVR3=35172,\n\tREG_TRCDVCVR7=35173,\n\tREG_TRCDVCMR3=35174,\n\tREG_TRCDVCMR7=35175,\n\tREG_TRCACVR7=35184,\n\tREG_TRCACVR15=35185,\n\tREG_TRCACATR7=35186,\n\tREG_TRCACATR15=35187,\n\tREG_TRCCIDCVR0=35200,\n\tREG_TRCVMIDCVR0=35201,\n\tREG_TRCCIDCCTLR0=35202,\n\tREG_TRCCIDCCTLR1=35210,\n\tREG_TRCCIDCVR1=35216,\n\tREG_TRCVMIDCVR1=35217,\n\tREG_TRCVMIDCCTLR0=35218,\n\tREG_TRCVMIDCCTLR1=35226,\n\tREG_TRCCIDCVR2=35232,\n\tREG_TRCVMIDCVR2=35233,\n\tREG_TRCCIDCVR3=35248,\n\tREG_TRCVMIDCVR3=35249,\n\tREG_TRCCIDCVR4=35264,\n\tREG_TRCVMIDCVR4=35265,\n\tREG_TRCCIDCVR5=35280,\n\tREG_TRCVMIDCVR5=35281,\n\tREG_TRCCIDCVR6=35296,\n\tREG_TRCVMIDCVR6=35297,\n\tREG_TRCCIDCVR7=35312,\n\tREG_TRCVMIDCVR7=35313,\n\tREG_TRCITCTRL=35716,\n\tREG_TRCCLAIMSET=35782,\n\tREG_TRCCLAIMCLR=35790,\n\tREG_TRCLAR=35814,\n\tREG_TEECR32_EL1=36864,\n\tREG_TEEHBR32_EL1=36992,\n\tREG_DBGDTR_EL0=38944,\n\tREG_DBGDTRTX_EL0=38952,\n\tREG_DBGVCR32_EL2=41016,\n\tREG_MPIDR_EL1=49157,\n\tREG_SCTLR_EL1=49280,\n\tREG_ACTLR_EL1=49281,\n\tREG_CPACR_EL1=49282,\n\tREG_RGSR_EL1=49285,\n\tREG_GCR_EL1=49286,\n\tREG_TRFCR_EL1=49297,\n\tREG_TTBR0_EL1=49408,\n\tREG_TTBR1_EL1=49409,\n\tREG_TCR_EL1=49410,\n\tREG_APIAKEYLO_EL1=49416,\n\tREG_APIAKEYHI_EL1=49417,\n\tREG_APIBKEYLO_EL1=49418,\n\tREG_APIBKEYHI_EL1=49419,\n\tREG_APDAKEYLO_EL1=49424,\n\tREG_APDAKEYHI_EL1=49425,\n\tREG_APDBKEYLO_EL1=49426,\n\tREG_APDBKEYHI_EL1=49427,\n\tREG_APGAKEYLO_EL1=49432,\n\tREG_APGAKEYHI_EL1=49433,\n\tREG_SPSR_EL1=49664,\n\tREG_ELR_EL1=49665,\n\tREG_SP_EL0=49672,\n\tREG_SPSEL=49680,\n\tREG_CURRENTEL=49682,\n\tREG_PAN=49683,\n\tREG_UAO=49684,\n\tREG_ICC_PMR_EL1=49712,\n\tREG_AFSR0_EL1=49800,\n\tREG_AFSR1_EL1=49801,\n\tREG_ESR_EL1=49808,\n\tREG_ERRSELR_EL1=49817,\n\tREG_ERXCTLR_EL1=49825,\n\tREG_ERXSTATUS_EL1=49826,\n\tREG_ERXADDR_EL1=49827,\n\tREG_ERXPFGCTL_EL1=49829,\n\tREG_ERXPFGCDN_EL1=49830,\n\tREG_ERXMISC0_EL1=49832,\n\tREG_ERXMISC1_EL1=49833,\n\tREG_ERXMISC2_EL1=49834,\n\tREG_ERXMISC3_EL1=49835,\n\tREG_ERXTS_EL1=49839,\n\tREG_TFSR_EL1=49840,\n\tREG_TFSRE0_EL1=49841,\n\tREG_FAR_EL1=49920,\n\tREG_PAR_EL1=50080,\n\tREG_PMSCR_EL1=50376,\n\tREG_PMSICR_EL1=50378,\n\tREG_PMSIRR_EL1=50379,\n\tREG_PMSFCR_EL1=50380,\n\tREG_PMSEVFR_EL1=50381,\n\tREG_PMSLATFR_EL1=50382,\n\tREG_PMSIDR_EL1=50383,\n\tREG_PMBLIMITR_EL1=50384,\n\tREG_PMBPTR_EL1=50385,\n\tREG_PMBSR_EL1=50387,\n\tREG_PMBIDR_EL1=50391,\n\tREG_TRBLIMITR_EL1=50392,\n\tREG_TRBPTR_EL1=50393,\n\tREG_TRBBASER_EL1=50394,\n\tREG_TRBSR_EL1=50395,\n\tREG_TRBMAR_EL1=50396,\n\tREG_TRBTRG_EL1=50398,\n\tREG_PMINTENSET_EL1=50417,\n\tREG_PMINTENCLR_EL1=50418,\n\tREG_PMMIR_EL1=50422,\n\tREG_MAIR_EL1=50448,\n\tREG_AMAIR_EL1=50456,\n\tREG_LORSA_EL1=50464,\n\tREG_LOREA_EL1=50465,\n\tREG_LORN_EL1=50466,\n\tREG_LORC_EL1=50467,\n\tREG_MPAM1_EL1=50472,\n\tREG_MPAM0_EL1=50473,\n\tREG_VBAR_EL1=50688,\n\tREG_RMR_EL1=50690,\n\tREG_DISR_EL1=50697,\n\tREG_ICC_EOIR0_EL1=50753,\n\tREG_ICC_BPR0_EL1=50755,\n\tREG_ICC_AP0R0_EL1=50756,\n\tREG_ICC_AP0R1_EL1=50757,\n\tREG_ICC_AP0R2_EL1=50758,\n\tREG_ICC_AP0R3_EL1=50759,\n\tREG_ICC_AP1R0_EL1=50760,\n\tREG_ICC_AP1R1_EL1=50761,\n\tREG_ICC_AP1R2_EL1=50762,\n\tREG_ICC_AP1R3_EL1=50763,\n\tREG_ICC_DIR_EL1=50777,\n\tREG_ICC_SGI1R_EL1=50781,\n\tREG_ICC_ASGI1R_EL1=50782,\n\tREG_ICC_SGI0R_EL1=50783,\n\tREG_ICC_EOIR1_EL1=50785,\n\tREG_ICC_BPR1_EL1=50787,\n\tREG_ICC_CTLR_EL1=50788,\n\tREG_ICC_SRE_EL1=50789,\n\tREG_ICC_IGRPEN0_EL1=50790,\n\tREG_ICC_IGRPEN1_EL1=50791,\n\tREG_ICC_SEIEN_EL1=50792,\n\tREG_CONTEXTIDR_EL1=50817,\n\tREG_TPIDR_EL1=50820,\n\tREG_SCXTNUM_EL1=50823,\n\tREG_CNTKCTL_EL1=50952,\n\tREG_CSSELR_EL1=53248,\n\tREG_CTR_EL0=55297,\n\tREG_DCZID_EL0=55303,\n\tREG_NZCV=55824,\n\tREG_DAIFSET=55825,\n\tREG_DIT=55829,\n\tREG_SSBS=55830,\n\tREG_TCO=55831,\n\tREG_FPCR=55840,\n\tREG_FPSR=55841,\n\tREG_DSPSR_EL0=55848,\n\tREG_DLR_EL0=55849,\n\tREG_PMCR_EL0=56544,\n\tREG_PMCNTENSET_EL0=56545,\n\tREG_PMCNTENCLR_EL0=56546,\n\tREG_PMOVSCLR_EL0=56547,\n\tREG_PMSWINC_EL0=56548,\n\tREG_PMSELR_EL0=56549,\n\tREG_PMCCNTR_EL0=56552,\n\tREG_PMXEVTYPER_EL0=56553,\n\tREG_PMXEVCNTR_EL0=56554,\n\tREG_DAIFCLR=56557,\n\tREG_PMUSERENR_EL0=56560,\n\tREG_PMOVSSET_EL0=56563,\n\tREG_TPIDR_EL0=56962,\n\tREG_TPIDRRO_EL0=56963,\n\tREG_SCXTNUM_EL0=56967,\n\tREG_AMCR_EL0=56976,\n\tREG_AMUSERENR_EL0=56979,\n\tREG_AMCNTENCLR0_EL0=56980,\n\tREG_AMCNTENSET0_EL0=56981,\n\tREG_AMCNTENCLR1_EL0=56984,\n\tREG_AMCNTENSET1_EL0=56985,\n\tREG_AMEVCNTR00_EL0=56992,\n\tREG_AMEVCNTR01_EL0=56993,\n\tREG_AMEVCNTR02_EL0=56994,\n\tREG_AMEVCNTR03_EL0=56995,\n\tREG_AMEVCNTR10_EL0=57056,\n\tREG_AMEVCNTR11_EL0=57057,\n\tREG_AMEVCNTR12_EL0=57058,\n\tREG_AMEVCNTR13_EL0=57059,\n\tREG_AMEVCNTR14_EL0=57060,\n\tREG_AMEVCNTR15_EL0=57061,\n\tREG_AMEVCNTR16_EL0=57062,\n\tREG_AMEVCNTR17_EL0=57063,\n\tREG_AMEVCNTR18_EL0=57064,\n\tREG_AMEVCNTR19_EL0=57065,\n\tREG_AMEVCNTR110_EL0=57066,\n\tREG_AMEVCNTR111_EL0=57067,\n\tREG_AMEVCNTR112_EL0=57068,\n\tREG_AMEVCNTR113_EL0=57069,\n\tREG_AMEVCNTR114_EL0=57070,\n\tREG_AMEVCNTR115_EL0=57071,\n\tREG_AMEVTYPER10_EL0=57072,\n\tREG_AMEVTYPER11_EL0=57073,\n\tREG_AMEVTYPER12_EL0=57074,\n\tREG_AMEVTYPER13_EL0=57075,\n\tREG_AMEVTYPER14_EL0=57076,\n\tREG_AMEVTYPER15_EL0=57077,\n\tREG_AMEVTYPER16_EL0=57078,\n\tREG_AMEVTYPER17_EL0=57079,\n\tREG_AMEVTYPER18_EL0=57080,\n\tREG_AMEVTYPER19_EL0=57081,\n\tREG_AMEVTYPER110_EL0=57082,\n\tREG_AMEVTYPER111_EL0=57083,\n\tREG_AMEVTYPER112_EL0=57084,\n\tREG_AMEVTYPER113_EL0=57085,\n\tREG_AMEVTYPER114_EL0=57086,\n\tREG_AMEVTYPER115_EL0=57087,\n\tREG_CNTFRQ_EL0=57088,\n\tREG_CNTPCT_EL0=57089,\n\tREG_CNTP_TVAL_EL0=57104,\n\tREG_CNTP_CTL_EL0=57105,\n\tREG_CNTP_CVAL_EL0=57106,\n\tREG_CNTV_TVAL_EL0=57112,\n\tREG_CNTV_CTL_EL0=57113,\n\tREG_CNTV_CVAL_EL0=57114,\n\tREG_PMEVCNTR0_EL0=57152,\n\tREG_PMEVCNTR1_EL0=57153,\n\tREG_PMEVCNTR2_EL0=57154,\n\tREG_PMEVCNTR3_EL0=57155,\n\tREG_PMEVCNTR4_EL0=57156,\n\tREG_PMEVCNTR5_EL0=57157,\n\tREG_PMEVCNTR6_EL0=57158,\n\tREG_PMEVCNTR7_EL0=57159,\n\tREG_PMEVCNTR8_EL0=57160,\n\tREG_PMEVCNTR9_EL0=57161,\n\tREG_PMEVCNTR10_EL0=57162,\n\tREG_PMEVCNTR11_EL0=57163,\n\tREG_PMEVCNTR12_EL0=57164,\n\tREG_PMEVCNTR13_EL0=57165,\n\tREG_PMEVCNTR14_EL0=57166,\n\tREG_PMEVCNTR15_EL0=57167,\n\tREG_PMEVCNTR16_EL0=57168,\n\tREG_PMEVCNTR17_EL0=57169,\n\tREG_PMEVCNTR18_EL0=57170,\n\tREG_PMEVCNTR19_EL0=57171,\n\tREG_PMEVCNTR20_EL0=57172,\n\tREG_PMEVCNTR21_EL0=57173,\n\tREG_PMEVCNTR22_EL0=57174,\n\tREG_PMEVCNTR23_EL0=57175,\n\tREG_PMEVCNTR24_EL0=57176,\n\tREG_PMEVCNTR25_EL0=57177,\n\tREG_PMEVCNTR26_EL0=57178,\n\tREG_PMEVCNTR27_EL0=57179,\n\tREG_PMEVCNTR28_EL0=57180,\n\tREG_PMEVCNTR29_EL0=57181,\n\tREG_PMEVCNTR30_EL0=57182,\n\tREG_PMEVTYPER0_EL0=57184,\n\tREG_PMEVTYPER1_EL0=57185,\n\tREG_PMEVTYPER2_EL0=57186,\n\tREG_PMEVTYPER3_EL0=57187,\n\tREG_PMEVTYPER4_EL0=57188,\n\tREG_PMEVTYPER5_EL0=57189,\n\tREG_PMEVTYPER6_EL0=57190,\n\tREG_PMEVTYPER7_EL0=57191,\n\tREG_PMEVTYPER8_EL0=57192,\n\tREG_PMEVTYPER9_EL0=57193,\n\tREG_PMEVTYPER10_EL0=57194,\n\tREG_PMEVTYPER11_EL0=57195,\n\tREG_PMEVTYPER12_EL0=57196,\n\tREG_PMEVTYPER13_EL0=57197,\n\tREG_PMEVTYPER14_EL0=57198,\n\tREG_PMEVTYPER15_EL0=57199,\n\tREG_PMEVTYPER16_EL0=57200,\n\tREG_PMEVTYPER17_EL0=57201,\n\tREG_PMEVTYPER18_EL0=57202,\n\tREG_PMEVTYPER19_EL0=57203,\n\tREG_PMEVTYPER20_EL0=57204,\n\tREG_PMEVTYPER21_EL0=57205,\n\tREG_PMEVTYPER22_EL0=57206,\n\tREG_PMEVTYPER23_EL0=57207,\n\tREG_PMEVTYPER24_EL0=57208,\n\tREG_PMEVTYPER25_EL0=57209,\n\tREG_PMEVTYPER26_EL0=57210,\n\tREG_PMEVTYPER27_EL0=57211,\n\tREG_PMEVTYPER28_EL0=57212,\n\tREG_PMEVTYPER29_EL0=57213,\n\tREG_PMEVTYPER30_EL0=57214,\n\tREG_PMCCFILTR_EL0=57215,\n\tREG_VPIDR_EL2=57344,\n\tREG_VMPIDR_EL2=57349,\n\tREG_SCTLR_EL2=57472,\n\tREG_ACTLR_EL2=57473,\n\tREG_HCR_EL2=57480,\n\tREG_MDCR_EL2=57481,\n\tREG_CPTR_EL2=57482,\n\tREG_HSTR_EL2=57483,\n\tREG_HACR_EL2=57487,\n\tREG_TRFCR_EL2=57489,\n\tREG_SDER32_EL2=57497,\n\tREG_TTBR0_EL2=57600,\n\tREG_TTBR1_EL2=57601,\n\tREG_TCR_EL2=57602,\n\tREG_VTTBR_EL2=57608,\n\tREG_VTCR_EL2=57610,\n\tREG_VNCR_EL2=57616,\n\tREG_VSTTBR_EL2=57648,\n\tREG_VSTCR_EL2=57650,\n\tREG_DACR32_EL2=57728,\n\tREG_SPSR_EL2=57856,\n\tREG_ELR_EL2=57857,\n\tREG_SP_EL1=57864,\n\tREG_SPSR_IRQ=57880,\n\tREG_SPSR_ABT=57881,\n\tREG_SPSR_UND=57882,\n\tREG_SPSR_FIQ=57883,\n\tREG_IFSR32_EL2=57985,\n\tREG_AFSR0_EL2=57992,\n\tREG_AFSR1_EL2=57993,\n\tREG_ESR_EL2=58000,\n\tREG_VSESR_EL2=58003,\n\tREG_FPEXC32_EL2=58008,\n\tREG_TFSR_EL2=58032,\n\tREG_FAR_EL2=58112,\n\tREG_HPFAR_EL2=58116,\n\tREG_PMSCR_EL2=58568,\n\tREG_MAIR_EL2=58640,\n\tREG_AMAIR_EL2=58648,\n\tREG_MPAMHCR_EL2=58656,\n\tREG_MPAMVPMV_EL2=58657,\n\tREG_MPAM2_EL2=58664,\n\tREG_MPAMVPM0_EL2=58672,\n\tREG_MPAMVPM1_EL2=58673,\n\tREG_MPAMVPM2_EL2=58674,\n\tREG_MPAMVPM3_EL2=58675,\n\tREG_MPAMVPM4_EL2=58676,\n\tREG_MPAMVPM5_EL2=58677,\n\tREG_MPAMVPM6_EL2=58678,\n\tREG_MPAMVPM7_EL2=58679,\n\tREG_VBAR_EL2=58880,\n\tREG_RMR_EL2=58882,\n\tREG_VDISR_EL2=58889,\n\tREG_ICH_AP0R0_EL2=58944,\n\tREG_ICH_AP0R1_EL2=58945,\n\tREG_ICH_AP0R2_EL2=58946,\n\tREG_ICH_AP0R3_EL2=58947,\n\tREG_ICH_AP1R0_EL2=58952,\n\tREG_ICH_AP1R1_EL2=58953,\n\tREG_ICH_AP1R2_EL2=58954,\n\tREG_ICH_AP1R3_EL2=58955,\n\tREG_ICH_VSEIR_EL2=58956,\n\tREG_ICC_SRE_EL2=58957,\n\tREG_ICH_HCR_EL2=58968,\n\tREG_ICH_MISR_EL2=58970,\n\tREG_ICH_VMCR_EL2=58975,\n\tREG_ICH_LR0_EL2=58976,\n\tREG_ICH_LR1_EL2=58977,\n\tREG_ICH_LR2_EL2=58978,\n\tREG_ICH_LR3_EL2=58979,\n\tREG_ICH_LR4_EL2=58980,\n\tREG_ICH_LR5_EL2=58981,\n\tREG_ICH_LR6_EL2=58982,\n\tREG_ICH_LR7_EL2=58983,\n\tREG_ICH_LR8_EL2=58984,\n\tREG_ICH_LR9_EL2=58985,\n\tREG_ICH_LR10_EL2=58986,\n\tREG_ICH_LR11_EL2=58987,\n\tREG_ICH_LR12_EL2=58988,\n\tREG_ICH_LR13_EL2=58989,\n\tREG_ICH_LR14_EL2=58990,\n\tREG_ICH_LR15_EL2=58991,\n\tREG_CONTEXTIDR_EL2=59009,\n\tREG_TPIDR_EL2=59010,\n\tREG_SCXTNUM_EL2=59015,\n\tREG_CNTVOFF_EL2=59139,\n\tREG_CNTHCTL_EL2=59144,\n\tREG_CNTHP_TVAL_EL2=59152,\n\tREG_CNTHP_CTL_EL2=59153,\n\tREG_CNTHP_CVAL_EL2=59154,\n\tREG_CNTHV_TVAL_EL2=59160,\n\tREG_CNTHV_CTL_EL2=59161,\n\tREG_CNTHV_CVAL_EL2=59162,\n\tREG_CNTHVS_TVAL_EL2=59168,\n\tREG_CNTHVS_CTL_EL2=59169,\n\tREG_CNTHVS_CVAL_EL2=59170,\n\tREG_CNTHPS_TVAL_EL2=59176,\n\tREG_CNTHPS_CTL_EL2=59177,\n\tREG_CNTHPS_CVAL_EL2=59178,\n\tREG_SCTLR_EL12=59520,\n\tREG_CPACR_EL12=59522,\n\tREG_TRFCR_EL12=59537,\n\tREG_TTBR0_EL12=59648,\n\tREG_TTBR1_EL12=59649,\n\tREG_TCR_EL12=59650,\n\tREG_SPSR_EL12=59904,\n\tREG_ELR_EL12=59905,\n\tREG_AFSR0_EL12=60040,\n\tREG_AFSR1_EL12=60041,\n\tREG_ESR_EL12=60048,\n\tREG_TFSR_EL12=60080,\n\tREG_FAR_EL12=60160,\n\tREG_PMSCR_EL12=60616,\n\tREG_MAIR_EL12=60688,\n\tREG_AMAIR_EL12=60696,\n\tREG_MPAM1_EL12=60712,\n\tREG_VBAR_EL12=60928,\n\tREG_CONTEXTIDR_EL12=61057,\n\tREG_SCXTNUM_EL12=61063,\n\tREG_CNTKCTL_EL12=61192,\n\tREG_CNTP_TVAL_EL02=61200,\n\tREG_CNTP_CTL_EL02=61201,\n\tREG_CNTP_CVAL_EL02=61202,\n\tREG_CNTV_TVAL_EL02=61208,\n\tREG_CNTV_CTL_EL02=61209,\n\tREG_CNTV_CVAL_EL02=61210,\n\tREG_SCTLR_EL3=61568,\n\tREG_ACTLR_EL3=61569,\n\tREG_SCR_EL3=61576,\n\tREG_SDER32_EL3=61577,\n\tREG_CPTR_EL3=61578,\n\tREG_MDCR_EL3=61593,\n\tREG_TTBR0_EL3=61696,\n\tREG_TCR_EL3=61698,\n\tREG_SPSR_EL3=61952,\n\tREG_ELR_EL3=61953,\n\tREG_SP_EL2=61960,\n\tREG_AFSR0_EL3=62088,\n\tREG_AFSR1_EL3=62089,\n\tREG_ESR_EL3=62096,\n\tREG_TFSR_EL3=62128,\n\tREG_FAR_EL3=62208,\n\tREG_MAIR_EL3=62736,\n\tREG_AMAIR_EL3=62744,\n\tREG_MPAM3_EL3=62760,\n\tREG_VBAR_EL3=62976,\n\tREG_RMR_EL3=62978,\n\tREG_ICC_CTLR_EL3=63076,\n\tREG_ICC_SRE_EL3=63077,\n\tREG_ICC_IGRPEN1_EL3=63079,\n\tREG_TPIDR_EL3=63106,\n\tREG_SCXTNUM_EL3=63111,\n\tREG_CNTPS_TVAL_EL1=65296,\n\tREG_CNTPS_CTL_EL1=65297,\n\tREG_CNTPS_CVAL_EL1=65298,\n\t/* exceptional system registers */\n\tREG_PSTATE_SPSEL=65299, // (op0,op1,crn,crm,op2)=(0,0,4,9,5) doesn't map to [SYSREG_NONE+1, SYSREG_END)\n\tSYSREG_END=65300,\n};\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nconst char *get_system_register_name(enum SystemReg);\nconst char *get_system_register_name_decomposed(int op0, int op1, int CRn, int CRm, int op2);\n#ifdef __cplusplus\n}\n#endif\n\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs_fmt_gen.c",
    "content": "/* GENERATED FILE - DO NOT MODIFY - SUBMIT GITHUB ISSUE IF PROBLEM FOUND */\n\n#include <stddef.h>\n\n#include \"sysregs_gen.h\"\n\nconst char *get_system_register_name(enum SystemReg sr)\n{\n\tswitch(sr) {\n\tcase REG_EDSCR: return \"edscr\";\n\tcase REG_EDPRCR: return \"edprcr\";\n\tcase REG_UAOIMM: return \"uaoimm\";\n\tcase REG_PANIMM: return \"panimm\";\n\tcase REG_SPSELIMM: return \"spselimm\";\n\tcase REG_DITIMM: return \"ditimm\";\n\tcase REG_SVCRIMM: return \"svcrimm\";\n\tcase REG_ICIALLUIS: return \"icialluis\";\n\tcase REG_ICIALLU: return \"iciallu\";\n\tcase REG_DCIVAC: return \"dcivac\";\n\tcase REG_DCISW: return \"dcisw\";\n\tcase REG_ATS1E1R: return \"ats1e1r\";\n\tcase REG_ATS1E1W: return \"ats1e1w\";\n\tcase REG_ATS1E0R: return \"ats1e0r\";\n\tcase REG_ATS1E0W: return \"ats1e0w\";\n\tcase REG_DCCSW: return \"dccsw\";\n\tcase REG_DCCISW: return \"dccisw\";\n\tcase REG_TLBIVMALLE1IS: return \"tlbivmalle1is\";\n\tcase REG_TLBIVAE1IS: return \"tlbivae1is\";\n\tcase REG_TLBIASIDE1IS: return \"tlbiaside1is\";\n\tcase REG_TLBIVAAE1IS: return \"tlbivaae1is\";\n\tcase REG_TLBIVALE1IS: return \"tlbivale1is\";\n\tcase REG_TLBIVAALE1IS: return \"tlbivaale1is\";\n\tcase REG_TLBIVMALLE1: return \"tlbivmalle1\";\n\tcase REG_TLBIVAE1: return \"tlbivae1\";\n\tcase REG_TLBIASIDE1: return \"tlbiaside1\";\n\tcase REG_TLBIVAAE1: return \"tlbivaae1\";\n\tcase REG_TLBIVALE1: return \"tlbivale1\";\n\tcase REG_TLBIVAALE1: return \"tlbivaale1\";\n\tcase REG_DCZVA: return \"dczva\";\n\tcase REG_ICIVAU: return \"icivau\";\n\tcase REG_DCCVAC: return \"dccvac\";\n\tcase REG_DCCVAU: return \"dccvau\";\n\tcase REG_DCCIVAC: return \"dccivac\";\n\tcase REG_ATS1E2R: return \"ats1e2r\";\n\tcase REG_ATS1E2W: return \"ats1e2w\";\n\tcase REG_ATS12E1R: return \"ats12e1r\";\n\tcase REG_ATS12E1W: return \"ats12e1w\";\n\tcase REG_ATS12E0R: return \"ats12e0r\";\n\tcase REG_ATS12E0W: return \"ats12e0w\";\n\tcase REG_TLBIIPAS2E1IS: return \"tlbiipas2e1is\";\n\tcase REG_TLBIIPAS2LE1IS: return \"tlbiipas2le1is\";\n\tcase REG_TLBIALLE2IS: return \"tlbialle2is\";\n\tcase REG_TLBIVAE2IS: return \"tlbivae2is\";\n\tcase REG_TLBIALLE1IS: return \"tlbialle1is\";\n\tcase REG_TLBIVALE2IS: return \"tlbivale2is\";\n\tcase REG_TLBIVMALLS12E1IS: return \"tlbivmalls12e1is\";\n\tcase REG_TLBIIPAS2E1: return \"tlbiipas2e1\";\n\tcase REG_TLBIIPAS2LE1: return \"tlbiipas2le1\";\n\tcase REG_TLBIALLE2: return \"tlbialle2\";\n\tcase REG_TLBIVAE2: return \"tlbivae2\";\n\tcase REG_TLBIALLE1: return \"tlbialle1\";\n\tcase REG_TLBIVALE2: return \"tlbivale2\";\n\tcase REG_TLBIVMALLS12E1: return \"tlbivmalls12e1\";\n\tcase REG_ATS1E3R: return \"ats1e3r\";\n\tcase REG_ATS1E3W: return \"ats1e3w\";\n\tcase REG_TLBIALLE3IS: return \"tlbialle3is\";\n\tcase REG_TLBIVAE3IS: return \"tlbivae3is\";\n\tcase REG_TLBIVALE3IS: return \"tlbivale3is\";\n\tcase REG_TLBIALLE3: return \"tlbialle3\";\n\tcase REG_TLBIVAE3: return \"tlbivae3\";\n\tcase REG_TLBIVALE3: return \"tlbivale3\";\n\tcase REG_OSDTRRX_EL1: return \"osdtrrx_el1\";\n\tcase REG_DBGBVR0_EL1: return \"dbgbvr0_el1\";\n\tcase REG_DBGBCR0_EL1: return \"dbgbcr0_el1\";\n\tcase REG_DBGWVR0_EL1: return \"dbgwvr0_el1\";\n\tcase REG_DBGWCR0_EL1: return \"dbgwcr0_el1\";\n\tcase REG_DBGBVR1_EL1: return \"dbgbvr1_el1\";\n\tcase REG_DBGBCR1_EL1: return \"dbgbcr1_el1\";\n\tcase REG_DBGWVR1_EL1: return \"dbgwvr1_el1\";\n\tcase REG_DBGWCR1_EL1: return \"dbgwcr1_el1\";\n\tcase REG_MDCCINT_EL1: return \"mdccint_el1\";\n\tcase REG_MDSCR_EL1: return \"mdscr_el1\";\n\tcase REG_DBGBVR2_EL1: return \"dbgbvr2_el1\";\n\tcase REG_DBGBCR2_EL1: return \"dbgbcr2_el1\";\n\tcase REG_DBGWVR2_EL1: return \"dbgwvr2_el1\";\n\tcase REG_DBGWCR2_EL1: return \"dbgwcr2_el1\";\n\tcase REG_OSDTRTX_EL1: return \"osdtrtx_el1\";\n\tcase REG_DBGBVR3_EL1: return \"dbgbvr3_el1\";\n\tcase REG_DBGBCR3_EL1: return \"dbgbcr3_el1\";\n\tcase REG_DBGWVR3_EL1: return \"dbgwvr3_el1\";\n\tcase REG_DBGWCR3_EL1: return \"dbgwcr3_el1\";\n\tcase REG_DBGBVR4_EL1: return \"dbgbvr4_el1\";\n\tcase REG_DBGBCR4_EL1: return \"dbgbcr4_el1\";\n\tcase REG_DBGWVR4_EL1: return \"dbgwvr4_el1\";\n\tcase REG_DBGWCR4_EL1: return \"dbgwcr4_el1\";\n\tcase REG_DBGBVR5_EL1: return \"dbgbvr5_el1\";\n\tcase REG_DBGBCR5_EL1: return \"dbgbcr5_el1\";\n\tcase REG_DBGWVR5_EL1: return \"dbgwvr5_el1\";\n\tcase REG_DBGWCR5_EL1: return \"dbgwcr5_el1\";\n\tcase REG_DBGWFAR: return \"dbgwfar\";\n\tcase REG_OSECCR_EL1: return \"oseccr_el1\";\n\tcase REG_DBGBVR6_EL1: return \"dbgbvr6_el1\";\n\tcase REG_DBGBCR6_EL1: return \"dbgbcr6_el1\";\n\tcase REG_DBGWVR6_EL1: return \"dbgwvr6_el1\";\n\tcase REG_DBGWCR6_EL1: return \"dbgwcr6_el1\";\n\tcase REG_DBGBVR7_EL1: return \"dbgbvr7_el1\";\n\tcase REG_DBGBCR7_EL1: return \"dbgbcr7_el1\";\n\tcase REG_DBGWVR7_EL1: return \"dbgwvr7_el1\";\n\tcase REG_DBGWCR7_EL1: return \"dbgwcr7_el1\";\n\tcase REG_DBGBVR8_EL1: return \"dbgbvr8_el1\";\n\tcase REG_DBGBCR8_EL1: return \"dbgbcr8_el1\";\n\tcase REG_DBGWVR8_EL1: return \"dbgwvr8_el1\";\n\tcase REG_DBGWCR8_EL1: return \"dbgwcr8_el1\";\n\tcase REG_DBGBVR9_EL1: return \"dbgbvr9_el1\";\n\tcase REG_DBGBCR9_EL1: return \"dbgbcr9_el1\";\n\tcase REG_DBGWVR9_EL1: return \"dbgwvr9_el1\";\n\tcase REG_DBGWCR9_EL1: return \"dbgwcr9_el1\";\n\tcase REG_DBGBVR10_EL1: return \"dbgbvr10_el1\";\n\tcase REG_DBGBCR10_EL1: return \"dbgbcr10_el1\";\n\tcase REG_DBGWVR10_EL1: return \"dbgwvr10_el1\";\n\tcase REG_DBGWCR10_EL1: return \"dbgwcr10_el1\";\n\tcase REG_DBGBVR11_EL1: return \"dbgbvr11_el1\";\n\tcase REG_DBGBCR11_EL1: return \"dbgbcr11_el1\";\n\tcase REG_DBGWVR11_EL1: return \"dbgwvr11_el1\";\n\tcase REG_DBGWCR11_EL1: return \"dbgwcr11_el1\";\n\tcase REG_DBGBVR12_EL1: return \"dbgbvr12_el1\";\n\tcase REG_DBGBCR12_EL1: return \"dbgbcr12_el1\";\n\tcase REG_DBGWVR12_EL1: return \"dbgwvr12_el1\";\n\tcase REG_DBGWCR12_EL1: return \"dbgwcr12_el1\";\n\tcase REG_DBGBVR13_EL1: return \"dbgbvr13_el1\";\n\tcase REG_DBGBCR13_EL1: return \"dbgbcr13_el1\";\n\tcase REG_DBGWVR13_EL1: return \"dbgwvr13_el1\";\n\tcase REG_DBGWCR13_EL1: return \"dbgwcr13_el1\";\n\tcase REG_DBGBVR14_EL1: return \"dbgbvr14_el1\";\n\tcase REG_DBGBCR14_EL1: return \"dbgbcr14_el1\";\n\tcase REG_DBGWVR14_EL1: return \"dbgwvr14_el1\";\n\tcase REG_DBGWCR14_EL1: return \"dbgwcr14_el1\";\n\tcase REG_DBGBVR15_EL1: return \"dbgbvr15_el1\";\n\tcase REG_DBGBCR15_EL1: return \"dbgbcr15_el1\";\n\tcase REG_DBGWVR15_EL1: return \"dbgwvr15_el1\";\n\tcase REG_DBGWCR15_EL1: return \"dbgwcr15_el1\";\n\tcase REG_MDRAR_EL1: return \"mdrar_el1\";\n\tcase REG_OSLAR_EL1: return \"oslar_el1\";\n\tcase REG_OSLSR_EL1: return \"oslsr_el1\";\n\tcase REG_OSDLR_EL1: return \"osdlr_el1\";\n\tcase REG_DBGPRCR_EL1: return \"dbgprcr_el1\";\n\tcase REG_DBGCLAIMSET_EL1: return \"dbgclaimset_el1\";\n\tcase REG_DBGCLAIMCLR_EL1: return \"dbgclaimclr_el1\";\n\tcase REG_DBGAUTHSTAT_EL1: return \"dbgauthstat_el1\";\n\tcase REG_TRCTRACEIDR: return \"trctraceidr\";\n\tcase REG_TRCVICTLR: return \"trcvictlr\";\n\tcase REG_TRCSEQEVR0: return \"trcseqevr0\";\n\tcase REG_TRCCNTRLDVR0: return \"trccntrldvr0\";\n\tcase REG_TRCIMSPEC0: return \"trcimspec0\";\n\tcase REG_TRCPRGCTLR: return \"trcprgctlr\";\n\tcase REG_TRCQCTLR: return \"trcqctlr\";\n\tcase REG_TRCVIIECTLR: return \"trcviiectlr\";\n\tcase REG_TRCSEQEVR1: return \"trcseqevr1\";\n\tcase REG_TRCCNTRLDVR1: return \"trccntrldvr1\";\n\tcase REG_TRCIMSPEC1: return \"trcimspec1\";\n\tcase REG_TRCPROCSELR: return \"trcprocselr\";\n\tcase REG_TRCVISSCTLR: return \"trcvissctlr\";\n\tcase REG_TRCSEQEVR2: return \"trcseqevr2\";\n\tcase REG_TRCCNTRLDVR2: return \"trccntrldvr2\";\n\tcase REG_TRCIMSPEC2: return \"trcimspec2\";\n\tcase REG_TRCVIPCSSCTLR: return \"trcvipcssctlr\";\n\tcase REG_TRCCNTRLDVR3: return \"trccntrldvr3\";\n\tcase REG_TRCIMSPEC3: return \"trcimspec3\";\n\tcase REG_TRCCONFIGR: return \"trcconfigr\";\n\tcase REG_TRCCNTCTLR0: return \"trccntctlr0\";\n\tcase REG_TRCIMSPEC4: return \"trcimspec4\";\n\tcase REG_TRCCNTCTLR1: return \"trccntctlr1\";\n\tcase REG_TRCIMSPEC5: return \"trcimspec5\";\n\tcase REG_TRCAUXCTLR: return \"trcauxctlr\";\n\tcase REG_TRCSEQRSTEVR: return \"trcseqrstevr\";\n\tcase REG_TRCCNTCTLR2: return \"trccntctlr2\";\n\tcase REG_TRCIMSPEC6: return \"trcimspec6\";\n\tcase REG_TRCSEQSTR: return \"trcseqstr\";\n\tcase REG_TRCCNTCTLR3: return \"trccntctlr3\";\n\tcase REG_TRCIMSPEC7: return \"trcimspec7\";\n\tcase REG_TRCEVENTCTL0R: return \"trceventctl0r\";\n\tcase REG_TRCVDCTLR: return \"trcvdctlr\";\n\tcase REG_TRCEXTINSELR: return \"trcextinselr\";\n\tcase REG_TRCCNTVR0: return \"trccntvr0\";\n\tcase REG_TRCEVENTCTL1R: return \"trceventctl1r\";\n\tcase REG_TRCVDSACCTLR: return \"trcvdsacctlr\";\n\tcase REG_TRCEXTINSELR1: return \"trcextinselr1\";\n\tcase REG_TRCCNTVR1: return \"trccntvr1\";\n\tcase REG_TRCRSR: return \"trcrsr\";\n\tcase REG_TRCVDARCCTLR: return \"trcvdarcctlr\";\n\tcase REG_TRCEXTINSELR2: return \"trcextinselr2\";\n\tcase REG_TRCCNTVR2: return \"trccntvr2\";\n\tcase REG_TRCSTALLCTLR: return \"trcstallctlr\";\n\tcase REG_TRCEXTINSELR3: return \"trcextinselr3\";\n\tcase REG_TRCCNTVR3: return \"trccntvr3\";\n\tcase REG_TRCTSCTLR: return \"trctsctlr\";\n\tcase REG_TRCSYNCPR: return \"trcsyncpr\";\n\tcase REG_TRCCCCTLR: return \"trcccctlr\";\n\tcase REG_TRCBBCTLR: return \"trcbbctlr\";\n\tcase REG_TRCRSCTLR16: return \"trcrsctlr16\";\n\tcase REG_TRCSSCCR0: return \"trcssccr0\";\n\tcase REG_TRCSSPCICR0: return \"trcsspcicr0\";\n\tcase REG_TRCOSLAR: return \"trcoslar\";\n\tcase REG_TRCRSCTLR17: return \"trcrsctlr17\";\n\tcase REG_TRCSSCCR1: return \"trcssccr1\";\n\tcase REG_TRCSSPCICR1: return \"trcsspcicr1\";\n\tcase REG_TRCRSCTLR2: return \"trcrsctlr2\";\n\tcase REG_TRCRSCTLR18: return \"trcrsctlr18\";\n\tcase REG_TRCSSCCR2: return \"trcssccr2\";\n\tcase REG_TRCSSPCICR2: return \"trcsspcicr2\";\n\tcase REG_TRCRSCTLR3: return \"trcrsctlr3\";\n\tcase REG_TRCRSCTLR19: return \"trcrsctlr19\";\n\tcase REG_TRCSSCCR3: return \"trcssccr3\";\n\tcase REG_TRCSSPCICR3: return \"trcsspcicr3\";\n\tcase REG_TRCRSCTLR4: return \"trcrsctlr4\";\n\tcase REG_TRCRSCTLR20: return \"trcrsctlr20\";\n\tcase REG_TRCSSCCR4: return \"trcssccr4\";\n\tcase REG_TRCSSPCICR4: return \"trcsspcicr4\";\n\tcase REG_TRCPDCR: return \"trcpdcr\";\n\tcase REG_TRCRSCTLR5: return \"trcrsctlr5\";\n\tcase REG_TRCRSCTLR21: return \"trcrsctlr21\";\n\tcase REG_TRCSSCCR5: return \"trcssccr5\";\n\tcase REG_TRCSSPCICR5: return \"trcsspcicr5\";\n\tcase REG_TRCRSCTLR6: return \"trcrsctlr6\";\n\tcase REG_TRCRSCTLR22: return \"trcrsctlr22\";\n\tcase REG_TRCSSCCR6: return \"trcssccr6\";\n\tcase REG_TRCSSPCICR6: return \"trcsspcicr6\";\n\tcase REG_TRCRSCTLR7: return \"trcrsctlr7\";\n\tcase REG_TRCRSCTLR23: return \"trcrsctlr23\";\n\tcase REG_TRCSSCCR7: return \"trcssccr7\";\n\tcase REG_TRCSSPCICR7: return \"trcsspcicr7\";\n\tcase REG_TRCRSCTLR8: return \"trcrsctlr8\";\n\tcase REG_TRCRSCTLR24: return \"trcrsctlr24\";\n\tcase REG_TRCSSCSR0: return \"trcsscsr0\";\n\tcase REG_TRCRSCTLR9: return \"trcrsctlr9\";\n\tcase REG_TRCRSCTLR25: return \"trcrsctlr25\";\n\tcase REG_TRCSSCSR1: return \"trcsscsr1\";\n\tcase REG_TRCRSCTLR10: return \"trcrsctlr10\";\n\tcase REG_TRCRSCTLR26: return \"trcrsctlr26\";\n\tcase REG_TRCSSCSR2: return \"trcsscsr2\";\n\tcase REG_TRCRSCTLR11: return \"trcrsctlr11\";\n\tcase REG_TRCRSCTLR27: return \"trcrsctlr27\";\n\tcase REG_TRCSSCSR3: return \"trcsscsr3\";\n\tcase REG_TRCRSCTLR12: return \"trcrsctlr12\";\n\tcase REG_TRCRSCTLR28: return \"trcrsctlr28\";\n\tcase REG_TRCSSCSR4: return \"trcsscsr4\";\n\tcase REG_TRCRSCTLR13: return \"trcrsctlr13\";\n\tcase REG_TRCRSCTLR29: return \"trcrsctlr29\";\n\tcase REG_TRCSSCSR5: return \"trcsscsr5\";\n\tcase REG_TRCRSCTLR14: return \"trcrsctlr14\";\n\tcase REG_TRCRSCTLR30: return \"trcrsctlr30\";\n\tcase REG_TRCSSCSR6: return \"trcsscsr6\";\n\tcase REG_TRCRSCTLR15: return \"trcrsctlr15\";\n\tcase REG_TRCRSCTLR31: return \"trcrsctlr31\";\n\tcase REG_TRCSSCSR7: return \"trcsscsr7\";\n\tcase REG_TRCACVR0: return \"trcacvr0\";\n\tcase REG_TRCACVR8: return \"trcacvr8\";\n\tcase REG_TRCACATR0: return \"trcacatr0\";\n\tcase REG_TRCACATR8: return \"trcacatr8\";\n\tcase REG_TRCDVCVR0: return \"trcdvcvr0\";\n\tcase REG_TRCDVCVR4: return \"trcdvcvr4\";\n\tcase REG_TRCDVCMR0: return \"trcdvcmr0\";\n\tcase REG_TRCDVCMR4: return \"trcdvcmr4\";\n\tcase REG_TRCACVR1: return \"trcacvr1\";\n\tcase REG_TRCACVR9: return \"trcacvr9\";\n\tcase REG_TRCACATR1: return \"trcacatr1\";\n\tcase REG_TRCACATR9: return \"trcacatr9\";\n\tcase REG_TRCACVR2: return \"trcacvr2\";\n\tcase REG_TRCACVR10: return \"trcacvr10\";\n\tcase REG_TRCACATR2: return \"trcacatr2\";\n\tcase REG_TRCACATR10: return \"trcacatr10\";\n\tcase REG_TRCDVCVR1: return \"trcdvcvr1\";\n\tcase REG_TRCDVCVR5: return \"trcdvcvr5\";\n\tcase REG_TRCDVCMR1: return \"trcdvcmr1\";\n\tcase REG_TRCDVCMR5: return \"trcdvcmr5\";\n\tcase REG_TRCACVR3: return \"trcacvr3\";\n\tcase REG_TRCACVR11: return \"trcacvr11\";\n\tcase REG_TRCACATR3: return \"trcacatr3\";\n\tcase REG_TRCACATR11: return \"trcacatr11\";\n\tcase REG_TRCACVR4: return \"trcacvr4\";\n\tcase REG_TRCACVR12: return \"trcacvr12\";\n\tcase REG_TRCACATR4: return \"trcacatr4\";\n\tcase REG_TRCACATR12: return \"trcacatr12\";\n\tcase REG_TRCDVCVR2: return \"trcdvcvr2\";\n\tcase REG_TRCDVCVR6: return \"trcdvcvr6\";\n\tcase REG_TRCDVCMR2: return \"trcdvcmr2\";\n\tcase REG_TRCDVCMR6: return \"trcdvcmr6\";\n\tcase REG_TRCACVR5: return \"trcacvr5\";\n\tcase REG_TRCACVR13: return \"trcacvr13\";\n\tcase REG_TRCACATR5: return \"trcacatr5\";\n\tcase REG_TRCACATR13: return \"trcacatr13\";\n\tcase REG_TRCACVR6: return \"trcacvr6\";\n\tcase REG_TRCACVR14: return \"trcacvr14\";\n\tcase REG_TRCACATR6: return \"trcacatr6\";\n\tcase REG_TRCACATR14: return \"trcacatr14\";\n\tcase REG_TRCDVCVR3: return \"trcdvcvr3\";\n\tcase REG_TRCDVCVR7: return \"trcdvcvr7\";\n\tcase REG_TRCDVCMR3: return \"trcdvcmr3\";\n\tcase REG_TRCDVCMR7: return \"trcdvcmr7\";\n\tcase REG_TRCACVR7: return \"trcacvr7\";\n\tcase REG_TRCACVR15: return \"trcacvr15\";\n\tcase REG_TRCACATR7: return \"trcacatr7\";\n\tcase REG_TRCACATR15: return \"trcacatr15\";\n\tcase REG_TRCCIDCVR0: return \"trccidcvr0\";\n\tcase REG_TRCVMIDCVR0: return \"trcvmidcvr0\";\n\tcase REG_TRCCIDCCTLR0: return \"trccidcctlr0\";\n\tcase REG_TRCCIDCCTLR1: return \"trccidcctlr1\";\n\tcase REG_TRCCIDCVR1: return \"trccidcvr1\";\n\tcase REG_TRCVMIDCVR1: return \"trcvmidcvr1\";\n\tcase REG_TRCVMIDCCTLR0: return \"trcvmidcctlr0\";\n\tcase REG_TRCVMIDCCTLR1: return \"trcvmidcctlr1\";\n\tcase REG_TRCCIDCVR2: return \"trccidcvr2\";\n\tcase REG_TRCVMIDCVR2: return \"trcvmidcvr2\";\n\tcase REG_TRCCIDCVR3: return \"trccidcvr3\";\n\tcase REG_TRCVMIDCVR3: return \"trcvmidcvr3\";\n\tcase REG_TRCCIDCVR4: return \"trccidcvr4\";\n\tcase REG_TRCVMIDCVR4: return \"trcvmidcvr4\";\n\tcase REG_TRCCIDCVR5: return \"trccidcvr5\";\n\tcase REG_TRCVMIDCVR5: return \"trcvmidcvr5\";\n\tcase REG_TRCCIDCVR6: return \"trccidcvr6\";\n\tcase REG_TRCVMIDCVR6: return \"trcvmidcvr6\";\n\tcase REG_TRCCIDCVR7: return \"trccidcvr7\";\n\tcase REG_TRCVMIDCVR7: return \"trcvmidcvr7\";\n\tcase REG_TRCITCTRL: return \"trcitctrl\";\n\tcase REG_TRCCLAIMSET: return \"trcclaimset\";\n\tcase REG_TRCCLAIMCLR: return \"trcclaimclr\";\n\tcase REG_TRCLAR: return \"trclar\";\n\tcase REG_TEECR32_EL1: return \"teecr32_el1\";\n\tcase REG_TEEHBR32_EL1: return \"teehbr32_el1\";\n\tcase REG_MDCCSR_EL0: return \"mdccsr_el0\";\n\tcase REG_DBGDTR_EL0: return \"dbgdtr_el0\";\n\tcase REG_DBGDTRRX_EL0: return \"dbgdtrrx_el0\";\n\tcase REG_DBGVCR32_EL2: return \"dbgvcr32_el2\";\n\tcase REG_MIDR_EL1: return \"midr_el1\";\n\tcase REG_MPIDR_EL1: return \"mpidr_el1\";\n\tcase REG_REVIDR_EL1: return \"revidr_el1\";\n\tcase REG_ID_PFR0_EL1: return \"id_pfr0_el1\";\n\tcase REG_ID_PFR1_EL1: return \"id_pfr1_el1\";\n\tcase REG_ID_DFR0_EL1: return \"id_dfr0_el1\";\n\tcase REG_ID_AFR0_EL1: return \"id_afr0_el1\";\n\tcase REG_ID_MMFR0_EL1: return \"id_mmfr0_el1\";\n\tcase REG_ID_MMFR1_EL1: return \"id_mmfr1_el1\";\n\tcase REG_ID_MMFR2_EL1: return \"id_mmfr2_el1\";\n\tcase REG_ID_MMFR3_EL1: return \"id_mmfr3_el1\";\n\tcase REG_ID_ISAR0_EL1: return \"id_isar0_el1\";\n\tcase REG_ID_ISAR1_EL1: return \"id_isar1_el1\";\n\tcase REG_ID_ISAR2_EL1: return \"id_isar2_el1\";\n\tcase REG_ID_ISAR3_EL1: return \"id_isar3_el1\";\n\tcase REG_ID_ISAR4_EL1: return \"id_isar4_el1\";\n\tcase REG_ID_ISAR5_EL1: return \"id_isar5_el1\";\n\tcase REG_ID_MMFR4_EL1: return \"id_mmfr4_el1\";\n\tcase REG_ID_ISAR6_EL1: return \"id_isar6_el1\";\n\tcase REG_MVFR0_EL1: return \"mvfr0_el1\";\n\tcase REG_MVFR1_EL1: return \"mvfr1_el1\";\n\tcase REG_MVFR2_EL1: return \"mvfr2_el1\";\n\tcase REG_ID_AA32RES3_EL1: return \"id_aa32res3_el1\";\n\tcase REG_ID_PFR2_EL1: return \"id_pfr2_el1\";\n\tcase REG_ID_AA32RES5_EL1: return \"id_aa32res5_el1\";\n\tcase REG_ID_AA32RES6_EL1: return \"id_aa32res6_el1\";\n\tcase REG_ID_AA32RES7_EL1: return \"id_aa32res7_el1\";\n\tcase REG_ID_AA64PFR0_EL1: return \"id_aa64pfr0_el1\";\n\tcase REG_ID_AA64PFR1_EL1: return \"id_aa64pfr1_el1\";\n\tcase REG_ID_AA64PFR2_EL1: return \"id_aa64pfr2_el1\";\n\tcase REG_ID_AA64PFR3_EL1: return \"id_aa64pfr3_el1\";\n\tcase REG_ID_AA64ZFR0_EL1: return \"id_aa64zfr0_el1\";\n\tcase REG_ID_AA64SMFR0_EL1: return \"id_aa64smfr0_el1\";\n\tcase REG_ID_AA64ZFR2_EL1: return \"id_aa64zfr2_el1\";\n\tcase REG_ID_AA64ZFR3_EL1: return \"id_aa64zfr3_el1\";\n\tcase REG_ID_AA64DFR0_EL1: return \"id_aa64dfr0_el1\";\n\tcase REG_ID_AA64DFR1_EL1: return \"id_aa64dfr1_el1\";\n\tcase REG_ID_AA64DFR2_EL1: return \"id_aa64dfr2_el1\";\n\tcase REG_ID_AA64DFR3_EL1: return \"id_aa64dfr3_el1\";\n\tcase REG_ID_AA64AFR0_EL1: return \"id_aa64afr0_el1\";\n\tcase REG_ID_AA64AFR1_EL1: return \"id_aa64afr1_el1\";\n\tcase REG_ID_AA64AFR2_EL1: return \"id_aa64afr2_el1\";\n\tcase REG_ID_AA64AFR3_EL1: return \"id_aa64afr3_el1\";\n\tcase REG_ID_AA64ISAR0_EL1: return \"id_aa64isar0_el1\";\n\tcase REG_ID_AA64ISAR1_EL1: return \"id_aa64isar1_el1\";\n\tcase REG_ID_AA64ISAR2_EL1: return \"id_aa64isar2_el1\";\n\tcase REG_ID_AA64ISAR3_EL1: return \"id_aa64isar3_el1\";\n\tcase REG_ID_AA64ISAR4_EL1: return \"id_aa64isar4_el1\";\n\tcase REG_ID_AA64ISAR5_EL1: return \"id_aa64isar5_el1\";\n\tcase REG_ID_AA64ISAR6_EL1: return \"id_aa64isar6_el1\";\n\tcase REG_ID_AA64ISAR7_EL1: return \"id_aa64isar7_el1\";\n\tcase REG_ID_AA64MMFR0_EL1: return \"id_aa64mmfr0_el1\";\n\tcase REG_ID_AA64MMFR1_EL1: return \"id_aa64mmfr1_el1\";\n\tcase REG_ID_AA64MMFR2_EL1: return \"id_aa64mmfr2_el1\";\n\tcase REG_ID_AA64MMFR3_EL1: return \"id_aa64mmfr3_el1\";\n\tcase REG_ID_AA64MMFR4_EL1: return \"id_aa64mmfr4_el1\";\n\tcase REG_ID_AA64MMFR5_EL1: return \"id_aa64mmfr5_el1\";\n\tcase REG_ID_AA64MMFR6_EL1: return \"id_aa64mmfr6_el1\";\n\tcase REG_ID_AA64MMFR7_EL1: return \"id_aa64mmfr7_el1\";\n\tcase REG_SCTLR_EL1: return \"sctlr_el1\";\n\tcase REG_ACTLR_EL1: return \"actlr_el1\";\n\tcase REG_CPACR_EL1: return \"cpacr_el1\";\n\tcase REG_RGSR_EL1: return \"rgsr_el1\";\n\tcase REG_GCR_EL1: return \"gcr_el1\";\n\tcase REG_TRFCR_EL1: return \"trfcr_el1\";\n\tcase REG_SMPRI_EL1: return \"smpri_el1\";\n\tcase REG_SMCR_EL1: return \"smcr_el1\";\n\tcase REG_TTBR0_EL1: return \"ttbr0_el1\";\n\tcase REG_TTBR1_EL1: return \"ttbr1_el1\";\n\tcase REG_TCR_EL1: return \"tcr_el1\";\n\tcase REG_APIAKEYLO_EL1: return \"apiakeylo_el1\";\n\tcase REG_APIAKEYHI_EL1: return \"apiakeyhi_el1\";\n\tcase REG_APIBKEYLO_EL1: return \"apibkeylo_el1\";\n\tcase REG_APIBKEYHI_EL1: return \"apibkeyhi_el1\";\n\tcase REG_APDAKEYLO_EL1: return \"apdakeylo_el1\";\n\tcase REG_APDAKEYHI_EL1: return \"apdakeyhi_el1\";\n\tcase REG_APDBKEYLO_EL1: return \"apdbkeylo_el1\";\n\tcase REG_APDBKEYHI_EL1: return \"apdbkeyhi_el1\";\n\tcase REG_APGAKEYLO_EL1: return \"apgakeylo_el1\";\n\tcase REG_APGAKEYHI_EL1: return \"apgakeyhi_el1\";\n\tcase REG_SPSR_EL1: return \"spsr_el1\";\n\tcase REG_ELR_EL1: return \"elr_el1\";\n\tcase REG_SP_EL0: return \"sp_el0\";\n\tcase REG_SPSEL: return \"spsel\";\n\tcase REG_CURRENTEL: return \"currentel\";\n\tcase REG_PAN: return \"pan\";\n\tcase REG_UAO: return \"uao\";\n\tcase REG_ICV_PMR_EL1: return \"icv_pmr_el1\";\n\tcase REG_AFSR0_EL1: return \"afsr0_el1\";\n\tcase REG_AFSR1_EL1: return \"afsr1_el1\";\n\tcase REG_ESR_EL1: return \"esr_el1\";\n\tcase REG_ERRIDR_EL1: return \"erridr_el1\";\n\tcase REG_ERRSELR_EL1: return \"errselr_el1\";\n\tcase REG_ERXCTLR_EL1: return \"erxctlr_el1\";\n\tcase REG_ERXSTATUS_EL1: return \"erxstatus_el1\";\n\tcase REG_ERXADDR_EL1: return \"erxaddr_el1\";\n\tcase REG_ERXPFGCTL_EL1: return \"erxpfgctl_el1\";\n\tcase REG_ERXPFGCDN_EL1: return \"erxpfgcdn_el1\";\n\tcase REG_ERXMISC0_EL1: return \"erxmisc0_el1\";\n\tcase REG_ERXMISC1_EL1: return \"erxmisc1_el1\";\n\tcase REG_ERXMISC2_EL1: return \"erxmisc2_el1\";\n\tcase REG_ERXMISC3_EL1: return \"erxmisc3_el1\";\n\tcase REG_ERXTS_EL1: return \"erxts_el1\";\n\tcase REG_TFSR_EL1: return \"tfsr_el1\";\n\tcase REG_TFSRE0_EL1: return \"tfsre0_el1\";\n\tcase REG_FAR_EL1: return \"far_el1\";\n\tcase REG_PAR_EL1: return \"par_el1\";\n\tcase REG_PMSCR_EL1: return \"pmscr_el1\";\n\tcase REG_PMSICR_EL1: return \"pmsicr_el1\";\n\tcase REG_PMSIRR_EL1: return \"pmsirr_el1\";\n\tcase REG_PMSFCR_EL1: return \"pmsfcr_el1\";\n\tcase REG_PMSEVFR_EL1: return \"pmsevfr_el1\";\n\tcase REG_PMSLATFR_EL1: return \"pmslatfr_el1\";\n\tcase REG_PMSIDR_EL1: return \"pmsidr_el1\";\n\tcase REG_PMBLIMITR_EL1: return \"pmblimitr_el1\";\n\tcase REG_PMBPTR_EL1: return \"pmbptr_el1\";\n\tcase REG_PMBSR_EL1: return \"pmbsr_el1\";\n\tcase REG_PMBIDR_EL1: return \"pmbidr_el1\";\n\tcase REG_TRBLIMITR_EL1: return \"trblimitr_el1\";\n\tcase REG_TRBPTR_EL1: return \"trbptr_el1\";\n\tcase REG_TRBBASER_EL1: return \"trbbaser_el1\";\n\tcase REG_TRBSR_EL1: return \"trbsr_el1\";\n\tcase REG_TRBMAR_EL1: return \"trbmar_el1\";\n\tcase REG_TRBTRG_EL1: return \"trbtrg_el1\";\n\tcase REG_PMINTENSET_EL1: return \"pmintenset_el1\";\n\tcase REG_PMINTENCLR_EL1: return \"pmintenclr_el1\";\n\tcase REG_PMMIR_EL1: return \"pmmir_el1\";\n\tcase REG_MAIR_EL1: return \"mair_el1\";\n\tcase REG_AMAIR_EL1: return \"amair_el1\";\n\tcase REG_LORSA_EL1: return \"lorsa_el1\";\n\tcase REG_LOREA_EL1: return \"lorea_el1\";\n\tcase REG_LORN_EL1: return \"lorn_el1\";\n\tcase REG_LORC_EL1: return \"lorc_el1\";\n\tcase REG_LORID_EL1: return \"lorid_el1\";\n\tcase REG_MPAM1_EL1: return \"mpam1_el1\";\n\tcase REG_MPAM0_EL1: return \"mpam0_el1\";\n\tcase REG_CTRR_C_LWR_EL1: return \"ctrr_c_lwr_el1\";\n\tcase REG_CTRR_C_UPR_EL1: return \"ctrr_c_upr_el1\";\n\tcase REG_CTRR_D_LWR_EL1: return \"ctrr_d_lwr_el1\";\n\tcase REG_CTRR_D_UPR_EL1: return \"ctrr_d_upr_el1\";\n\tcase REG_CTRR_C_LWR_EL12: return \"ctrr_c_lwr_el12\";\n\tcase REG_CTRR_C_UPR_EL12: return \"ctrr_c_upr_el12\";\n\tcase REG_CTRR_D_LWR_EL12: return \"ctrr_d_lwr_el12\";\n\tcase REG_CTRR_D_UPR_EL12: return \"ctrr_d_upr_el12\";\n\tcase REG_CTRR_C_LWR_EL2: return \"ctrr_c_lwr_el2\";\n\tcase REG_CTRR_C_UPR_EL2: return \"ctrr_c_upr_el2\";\n\tcase REG_CTRR_D_LWR_EL2: return \"ctrr_d_lwr_el2\";\n\tcase REG_CTRR_D_UPR_EL2: return \"ctrr_d_upr_el2\";\n\tcase REG_CTRR_C_CTL_EL1: return \"ctrr_c_ctl_el1\";\n\tcase REG_CTRR_D_CTL_EL1: return \"ctrr_d_ctl_el1\";\n\tcase REG_CTRR_C_CTL_EL12: return \"ctrr_c_ctl_el12\";\n\tcase REG_CTRR_D_CTL_EL12: return \"ctrr_d_ctl_el12\";\n\tcase REG_CTRR_C_CTL_EL2: return \"ctrr_c_ctl_el2\";\n\tcase REG_CTRR_D_CTL_EL2: return \"ctrr_d_ctl_el2\";\n\tcase REG_CTXR_A_LWR_EL1: return \"ctxr_a_lwr_el1\";\n\tcase REG_CTXR_A_UPR_EL1: return \"ctxr_a_upr_el1\";\n\tcase REG_CTXR_B_LWR_EL1: return \"ctxr_b_lwr_el1\";\n\tcase REG_CTXR_B_UPR_EL1: return \"ctxr_b_upr_el1\";\n\tcase REG_CTXR_C_LWR_EL1: return \"ctxr_c_lwr_el1\";\n\tcase REG_CTXR_C_UPR_EL1: return \"ctxr_c_upr_el1\";\n\tcase REG_CTXR_D_LWR_EL1: return \"ctxr_d_lwr_el1\";\n\tcase REG_CTXR_D_UPR_EL1: return \"ctxr_d_upr_el1\";\n\tcase REG_CTXR_A_LWR_EL12: return \"ctxr_a_lwr_el12\";\n\tcase REG_CTXR_A_UPR_EL12: return \"ctxr_a_upr_el12\";\n\tcase REG_CTXR_B_LWR_EL12: return \"ctxr_b_lwr_el12\";\n\tcase REG_CTXR_B_UPR_EL12: return \"ctxr_b_upr_el12\";\n\tcase REG_CTXR_C_LWR_EL12: return \"ctxr_c_lwr_el12\";\n\tcase REG_CTXR_C_UPR_EL12: return \"ctxr_c_upr_el12\";\n\tcase REG_CTXR_D_LWR_EL12: return \"ctxr_d_lwr_el12\";\n\tcase REG_CTXR_D_UPR_EL12: return \"ctxr_d_upr_el12\";\n\tcase REG_CTXR_A_LWR_EL2: return \"ctxr_a_lwr_el2\";\n\tcase REG_CTXR_A_UPR_EL2: return \"ctxr_a_upr_el2\";\n\tcase REG_CTXR_B_LWR_EL2: return \"ctxr_b_lwr_el2\";\n\tcase REG_CTXR_B_UPR_EL2: return \"ctxr_b_upr_el2\";\n\tcase REG_CTXR_C_LWR_EL2: return \"ctxr_c_lwr_el2\";\n\tcase REG_CTXR_C_UPR_EL2: return \"ctxr_c_upr_el2\";\n\tcase REG_CTXR_D_LWR_EL2: return \"ctxr_d_lwr_el2\";\n\tcase REG_CTXR_D_UPR_EL2: return \"ctxr_d_upr_el2\";\n\tcase REG_CTXR_A_CTL_EL1: return \"ctxr_a_ctl_el1\";\n\tcase REG_CTXR_B_CTL_EL1: return \"ctxr_b_ctl_el1\";\n\tcase REG_CTXR_C_CTL_EL1: return \"ctxr_c_ctl_el1\";\n\tcase REG_CTXR_D_CTL_EL1: return \"ctxr_d_ctl_el1\";\n\tcase REG_CTXR_A_CTL_EL12: return \"ctxr_a_ctl_el12\";\n\tcase REG_CTXR_B_CTL_EL12: return \"ctxr_b_ctl_el12\";\n\tcase REG_CTXR_C_CTL_EL12: return \"ctxr_c_ctl_el12\";\n\tcase REG_CTXR_D_CTL_EL12: return \"ctxr_d_ctl_el12\";\n\tcase REG_CTXR_A_CTL_EL2: return \"ctxr_a_ctl_el2\";\n\tcase REG_CTXR_B_CTL_EL2: return \"ctxr_b_ctl_el2\";\n\tcase REG_CTXR_C_CTL_EL2: return \"ctxr_c_ctl_el2\";\n\tcase REG_CTXR_D_CTL_EL2: return \"ctxr_d_ctl_el2\";\n\tcase REG_ACC_CTRR_C_LWR_EL2: return \"acc_ctrr_c_lwr_el2\";\n\tcase REG_ACC_CTRR_C_UPR_EL2: return \"acc_ctrr_c_upr_el2\";\n\tcase REG_ACC_CTRR_D_LWR_EL2: return \"acc_ctrr_d_lwr_el2\";\n\tcase REG_ACC_CTRR_D_UPR_EL2: return \"acc_ctrr_d_upr_el2\";\n\tcase REG_ACC_CTXR_A_LWR_EL2: return \"acc_ctxr_a_lwr_el2\";\n\tcase REG_ACC_CTXR_A_UPR_EL2: return \"acc_ctxr_a_upr_el2\";\n\tcase REG_ACC_CTXR_B_LWR_EL2: return \"acc_ctxr_b_lwr_el2\";\n\tcase REG_ACC_CTXR_B_UPR_EL2: return \"acc_ctxr_b_upr_el2\";\n\tcase REG_ACC_CTXR_C_LWR_EL2: return \"acc_ctxr_c_lwr_el2\";\n\tcase REG_ACC_CTXR_C_UPR_EL2: return \"acc_ctxr_c_upr_el2\";\n\tcase REG_ACC_CTXR_D_LWR_EL2: return \"acc_ctxr_d_lwr_el2\";\n\tcase REG_ACC_CTXR_D_UPR_EL2: return \"acc_ctxr_d_upr_el2\";\n\tcase REG_ACC_CTRR_C_CTL_EL2: return \"acc_ctrr_c_ctl_el2\";\n\tcase REG_ACC_CTRR_D_CTL_EL2: return \"acc_ctrr_d_ctl_el2\";\n\tcase REG_ACC_CTXR_A_CTL_EL2: return \"acc_ctxr_a_ctl_el2\";\n\tcase REG_ACC_CTXR_B_CTL_EL2: return \"acc_ctxr_b_ctl_el2\";\n\tcase REG_ACC_CTXR_C_CTL_EL2: return \"acc_ctxr_c_ctl_el2\";\n\tcase REG_ACC_CTXR_D_CTL_EL2: return \"acc_ctxr_d_ctl_el2\";\n\tcase REG_VBAR_EL1: return \"vbar_el1\";\n\tcase REG_RVBAR_EL1: return \"rvbar_el1\";\n\tcase REG_RMR_EL1: return \"rmr_el1\";\n\tcase REG_ISR_EL1: return \"isr_el1\";\n\tcase REG_DISR_EL1: return \"disr_el1\";\n\tcase REG_ICV_IAR0_EL1: return \"icv_iar0_el1\";\n\tcase REG_ICV_EOIR0_EL1: return \"icv_eoir0_el1\";\n\tcase REG_ICV_HPPIR0_EL1: return \"icv_hppir0_el1\";\n\tcase REG_ICV_BPR0_EL1: return \"icv_bpr0_el1\";\n\tcase REG_ICC_AP0R0_EL1: return \"icc_ap0r0_el1\";\n\tcase REG_ICC_AP0R1_EL1: return \"icc_ap0r1_el1\";\n\tcase REG_ICC_AP0R2_EL1: return \"icc_ap0r2_el1\";\n\tcase REG_ICC_AP0R3_EL1: return \"icc_ap0r3_el1\";\n\tcase REG_ICC_AP1R0_EL1: return \"icc_ap1r0_el1\";\n\tcase REG_ICC_AP1R1_EL1: return \"icc_ap1r1_el1\";\n\tcase REG_ICC_AP1R2_EL1: return \"icc_ap1r2_el1\";\n\tcase REG_ICC_AP1R3_EL1: return \"icc_ap1r3_el1\";\n\tcase REG_ICV_DIR_EL1: return \"icv_dir_el1\";\n\tcase REG_ICV_RPR_EL1: return \"icv_rpr_el1\";\n\tcase REG_ICC_SGI1R_EL1: return \"icc_sgi1r_el1\";\n\tcase REG_ICC_ASGI1R_EL1: return \"icc_asgi1r_el1\";\n\tcase REG_ICC_SGI0R_EL1: return \"icc_sgi0r_el1\";\n\tcase REG_ICV_IAR1_EL1: return \"icv_iar1_el1\";\n\tcase REG_ICV_EOIR1_EL1: return \"icv_eoir1_el1\";\n\tcase REG_ICV_HPPIR1_EL1: return \"icv_hppir1_el1\";\n\tcase REG_ICV_BPR1CBPR_EL1: return \"icv_bpr1cbpr_el1\";\n\tcase REG_ICV_CTLR_EL1: return \"icv_ctlr_el1\";\n\tcase REG_ICC_SRE_EL1: return \"icc_sre_el1\";\n\tcase REG_ICV_IGRPEN0_EL1: return \"icv_igrpen0_el1\";\n\tcase REG_ICV_IGRPEN1_EL1: return \"icv_igrpen1_el1\";\n\tcase REG_ICC_SEIEN_EL1: return \"icc_seien_el1\";\n\tcase REG_CONTEXTIDR_EL1: return \"contextidr_el1\";\n\tcase REG_TPIDR_EL1: return \"tpidr_el1\";\n\tcase REG_SCXTNUM_EL1: return \"scxtnum_el1\";\n\tcase REG_CNTHCTL_EL21: return \"cnthctl_el21\";\n\tcase REG_HID0: return \"hid0\";\n\tcase REG_HID25: return \"hid25\";\n\tcase REG_HID26: return \"hid26\";\n\tcase REG_HID27: return \"hid27\";\n\tcase REG_HID28: return \"hid28\";\n\tcase REG_HID29: return \"hid29\";\n\tcase REG_HID34: return \"hid34\";\n\tcase REG_HID1: return \"hid1\";\n\tcase REG_HID21: return \"hid21\";\n\tcase REG_BIUVCSCUPCMDCRD: return \"biuvcscupcmdcrd\";\n\tcase REG_BIUVCSCUPDATCRD: return \"biuvcscupdatcrd\";\n\tcase REG_HID2: return \"hid2\";\n\tcase REG_HID30: return \"hid30\";\n\tcase REG_HID31: return \"hid31\";\n\tcase REG_HID32: return \"hid32\";\n\tcase REG_HID33: return \"hid33\";\n\tcase REG_HID3: return \"hid3\";\n\tcase REG_BIUVCSCUPCMDCRDC2: return \"biuvcscupcmdcrdc2\";\n\tcase REG_BIUVCSCUPDATCRDC2: return \"biuvcscupdatcrdc2\";\n\tcase REG_HID4: return \"hid4\";\n\tcase REG_HID5: return \"hid5\";\n\tcase REG_HID6: return \"hid6\";\n\tcase REG_HID7: return \"hid7\";\n\tcase REG_HID8: return \"hid8\";\n\tcase REG_HID9: return \"hid9\";\n\tcase REG_HID10: return \"hid10\";\n\tcase REG_BLOCK_CMAINT_CFG: return \"block_cmaint_cfg\";\n\tcase REG_HID11: return \"hid11\";\n\tcase REG_HID18: return \"hid18\";\n\tcase REG_HID36: return \"hid36\";\n\tcase REG_HID37: return \"hid37\";\n\tcase REG_HID12: return \"hid12\";\n\tcase REG_HID15: return \"hid15\";\n\tcase REG_HID19: return \"hid19\";\n\tcase REG_BIU_TLIMIT: return \"biu_tlimit\";\n\tcase REG_HID13: return \"hid13\";\n\tcase REG_HID_RCTX_G0CTL: return \"hid_rctx_g0ctl\";\n\tcase REG_HID_RCTX_G1CTL: return \"hid_rctx_g1ctl\";\n\tcase REG_HID14: return \"hid14\";\n\tcase REG_HID16: return \"hid16\";\n\tcase REG_LLC_WRR2: return \"llc_wrr2\";\n\tcase REG_BIU_AFI_CFG: return \"biu_afi_cfg\";\n\tcase REG_HID17: return \"hid17\";\n\tcase REG_HID24: return \"hid24\";\n\tcase REG_HID35: return \"hid35\";\n\tcase REG_CCSIDR_EL1: return \"ccsidr_el1\";\n\tcase REG_CLIDR_EL1: return \"clidr_el1\";\n\tcase REG_SMIDR_EL1: return \"smidr_el1\";\n\tcase REG_AIDR_EL1: return \"aidr_el1\";\n\tcase REG_PMCR0_EL1: return \"pmcr0_el1\";\n\tcase REG_APPL_CONTEXTPTR: return \"appl_contextptr\";\n\tcase REG_LD_LATPROF_CTL_EL1: return \"ld_latprof_ctl_el1\";\n\tcase REG_AON_CPU_MSTALL_CTL01_EL1: return \"aon_cpu_mstall_ctl01_el1\";\n\tcase REG_PM_MEMFLT_CTL23_EL1: return \"pm_memflt_ctl23_el1\";\n\tcase REG_AGTCNTHV_CTL_EL21: return \"agtcnthv_ctl_el21\";\n\tcase REG_AGTCNTVCTSS_NOREDIR_EL0: return \"agtcntvctss_noredir_el0\";\n\tcase REG_PMCR1_EL1: return \"pmcr1_el1\";\n\tcase REG_LD_LATPROF_CTR_EL1: return \"ld_latprof_ctr_el1\";\n\tcase REG_AON_CPU_MSTALL_CTL23_EL1: return \"aon_cpu_mstall_ctl23_el1\";\n\tcase REG_PM_MEMFLT_CTL45_EL1: return \"pm_memflt_ctl45_el1\";\n\tcase REG_AGTCNTRDIR_EL1: return \"agtcntrdir_el1\";\n\tcase REG_AGTCNTHCTL_NOREDIR_EL21: return \"agtcnthctl_noredir_el21\";\n\tcase REG_PMCR2_EL1: return \"pmcr2_el1\";\n\tcase REG_LD_LATPROF_STS_EL1: return \"ld_latprof_sts_el1\";\n\tcase REG_AON_CPU_MSTALL_CTL45_EL1: return \"aon_cpu_mstall_ctl45_el1\";\n\tcase REG_AGTCNTHP_CVAL_EL2: return \"agtcnthp_cval_el2\";\n\tcase REG_CNTVCT_NOREDIR_EL0: return \"cntvct_noredir_el0\";\n\tcase REG_AGTCNTHP_CVAL_NOREDIR_EL21: return \"agtcnthp_cval_noredir_el21\";\n\tcase REG_PMCR3_EL1: return \"pmcr3_el1\";\n\tcase REG_LD_LATPROF_INF_EL1: return \"ld_latprof_inf_el1\";\n\tcase REG_AON_CPU_MSTALL_CTL67_EL1: return \"aon_cpu_mstall_ctl67_el1\";\n\tcase REG_AGTCNTHP_TVAL_EL2: return \"agtcnthp_tval_el2\";\n\tcase REG_CNTPCTSS_NOREDIR_EL0: return \"cntpctss_noredir_el0\";\n\tcase REG_AGTCNTHP_TVAL_NOREDIR_EL21: return \"agtcnthp_tval_noredir_el21\";\n\tcase REG_PMCR4_EL1: return \"pmcr4_el1\";\n\tcase REG_LD_LATPROF_CTL_EL2: return \"ld_latprof_ctl_el2\";\n\tcase REG_AON_CPU_MEMFLT_CTL01_EL1: return \"aon_cpu_memflt_ctl01_el1\";\n\tcase REG_AGTCNTHP_CTL_EL2: return \"agtcnthp_ctl_el2\";\n\tcase REG_CNTVCTSS_NOREDIR_EL0: return \"cntvctss_noredir_el0\";\n\tcase REG_AGTCNTHP_CTL_NOREDIR_EL21: return \"agtcnthp_ctl_noredir_el21\";\n\tcase REG_PMESR0_EL1: return \"pmesr0_el1\";\n\tcase REG_LD_LATPROF_CMD_EL1: return \"ld_latprof_cmd_el1\";\n\tcase REG_AON_CPU_MEMFLT_CTL23_EL1: return \"aon_cpu_memflt_ctl23_el1\";\n\tcase REG_AGTCNTHV_CVAL_EL2: return \"agtcnthv_cval_el2\";\n\tcase REG_AGTCNTHV_CVAL_NOREDIR_EL21: return \"agtcnthv_cval_noredir_el21\";\n\tcase REG_PMESR1_EL1: return \"pmesr1_el1\";\n\tcase REG_PMCR1_EL2: return \"pmcr1_el2\";\n\tcase REG_AON_CPU_MEMFLT_CTL45_EL1: return \"aon_cpu_memflt_ctl45_el1\";\n\tcase REG_AGTCNTHV_TVAL_EL2: return \"agtcnthv_tval_el2\";\n\tcase REG_CNTHCTL_NOREDIR_EL21: return \"cnthctl_noredir_el21\";\n\tcase REG_AGTCNTHV_TVAL_NOREDIR_EL21: return \"agtcnthv_tval_noredir_el21\";\n\tcase REG_OPMAT0_EL1: return \"opmat0_el1\";\n\tcase REG_PMCR1_EL12: return \"pmcr1_el12\";\n\tcase REG_AON_CPU_MEMFLT_CTL67_EL1: return \"aon_cpu_memflt_ctl67_el1\";\n\tcase REG_AGTCNTHV_CTL_EL2: return \"agtcnthv_ctl_el2\";\n\tcase REG_CNTHP_CVAL_NOREDIR_EL21: return \"cnthp_cval_noredir_el21\";\n\tcase REG_AGTCNTHV_CTL_NOREDIR_EL21: return \"agtcnthv_ctl_noredir_el21\";\n\tcase REG_OPMAT1_EL1: return \"opmat1_el1\";\n\tcase REG_PMCR1_GL12: return \"pmcr1_gl12\";\n\tcase REG_AON_CPU_MSTALL_CTR0_EL1: return \"aon_cpu_mstall_ctr0_el1\";\n\tcase REG_AGTCNTFRQ_EL0: return \"agtcntfrq_el0\";\n\tcase REG_CNTHP_TVAL_NOREDIR_EL21: return \"cnthp_tval_noredir_el21\";\n\tcase REG_CNTPCT_NOREDIR_EL0: return \"cntpct_noredir_el0\";\n\tcase REG_OPMSK0_EL1: return \"opmsk0_el1\";\n\tcase REG_LD_LATPROF_CTL_EL12: return \"ld_latprof_ctl_el12\";\n\tcase REG_AON_CPU_MSTALL_CTR1_EL1: return \"aon_cpu_mstall_ctr1_el1\";\n\tcase REG_AGTCNTVOFF_EL2: return \"agtcntvoff_el2\";\n\tcase REG_CNTHP_CTL_NOREDIR_EL21: return \"cnthp_ctl_noredir_el21\";\n\tcase REG_CNTHV_CTL_NOREDIR_EL21: return \"cnthv_ctl_noredir_el21\";\n\tcase REG_OPMSK1_EL1: return \"opmsk1_el1\";\n\tcase REG_LD_LATPROF_INF_EL2: return \"ld_latprof_inf_el2\";\n\tcase REG_AON_CPU_MSTALL_CTR2_EL1: return \"aon_cpu_mstall_ctr2_el1\";\n\tcase REG_AGTCNTHP_CVAL_EL21: return \"agtcnthp_cval_el21\";\n\tcase REG_CNTHV_CVAL_NOREDIR_EL21: return \"cnthv_cval_noredir_el21\";\n\tcase REG_AGTCNTPCT_NOREDIR_EL0: return \"agtcntpct_noredir_el0\";\n\tcase REG_AON_CPU_MSTALL_CTR3_EL1: return \"aon_cpu_mstall_ctr3_el1\";\n\tcase REG_AGTCNTHP_TVAL_EL21: return \"agtcnthp_tval_el21\";\n\tcase REG_CNTHV_TVAL_NOREDIR_EL21: return \"cnthv_tval_noredir_el21\";\n\tcase REG_VMSA_HV_LOCK_EL2: return \"vmsa_hv_lock_el2\";\n\tcase REG_PMSWCTRL_EL1: return \"pmswctrl_el1\";\n\tcase REG_PMCR5_EL0: return \"pmcr5_el0\";\n\tcase REG_AON_CPU_MSTALL_CTR4_EL1: return \"aon_cpu_mstall_ctr4_el1\";\n\tcase REG_PMCOMPARE0_EL1: return \"pmcompare0_el1\";\n\tcase REG_PMCOMPARE1_EL1: return \"pmcompare1_el1\";\n\tcase REG_VMSA_NV_LOCK_EL2: return \"vmsa_nv_lock_el2\";\n\tcase REG_PMSR_EL1: return \"pmsr_el1\";\n\tcase REG_AON_CPU_MSTALL_CTR5_EL1: return \"aon_cpu_mstall_ctr5_el1\";\n\tcase REG_AGTCNTHP_CTL_EL21: return \"agtcnthp_ctl_el21\";\n\tcase REG_PMCOMPARE5_EL1: return \"pmcompare5_el1\";\n\tcase REG_PMCOMPARE6_EL1: return \"pmcompare6_el1\";\n\tcase REG_PMCOMPARE7_EL1: return \"pmcompare7_el1\";\n\tcase REG_PMCR_BVRNG4_EL1: return \"pmcr_bvrng4_el1\";\n\tcase REG_PM_PMI_PC: return \"pm_pmi_pc\";\n\tcase REG_AON_CPU_MSTALL_CTR6_EL1: return \"aon_cpu_mstall_ctr6_el1\";\n\tcase REG_AGTCNTHV_CVAL_EL21: return \"agtcnthv_cval_el21\";\n\tcase REG_AGTCNTVCT_NOREDIR_EL0: return \"agtcntvct_noredir_el0\";\n\tcase REG_PMCR_BVRNG5_EL1: return \"pmcr_bvrng5_el1\";\n\tcase REG_AON_CPU_MSTALL_CTR7_EL1: return \"aon_cpu_mstall_ctr7_el1\";\n\tcase REG_AGTCNTHV_TVAL_EL21: return \"agtcnthv_tval_el21\";\n\tcase REG_AGTCNTPCTSS_NOREDIR_EL0: return \"agtcntpctss_noredir_el0\";\n\tcase REG_CSSELR_EL1: return \"csselr_el1\";\n\tcase REG_PMC0: return \"pmc0\";\n\tcase REG_UPMCFILTER0: return \"upmcfilter0\";\n\tcase REG_UPMCFILTER1: return \"upmcfilter1\";\n\tcase REG_UPMCFILTER2: return \"upmcfilter2\";\n\tcase REG_UPMCFILTER3: return \"upmcfilter3\";\n\tcase REG_UPMCFILTER4: return \"upmcfilter4\";\n\tcase REG_UPMCFILTER5: return \"upmcfilter5\";\n\tcase REG_UPMCFILTER6: return \"upmcfilter6\";\n\tcase REG_PMC1: return \"pmc1\";\n\tcase REG_UPMCFILTER7: return \"upmcfilter7\";\n\tcase REG_PMC2: return \"pmc2\";\n\tcase REG_PMC3: return \"pmc3\";\n\tcase REG_PMC4: return \"pmc4\";\n\tcase REG_PMC5: return \"pmc5\";\n\tcase REG_PMC6: return \"pmc6\";\n\tcase REG_PMC7: return \"pmc7\";\n\tcase REG_PMC8: return \"pmc8\";\n\tcase REG_PMC9: return \"pmc9\";\n\tcase REG_PMTRHLD6_EL1: return \"pmtrhld6_el1\";\n\tcase REG_PMTRHLD4_EL1: return \"pmtrhld4_el1\";\n\tcase REG_PMTRHLD2_EL1: return \"pmtrhld2_el1\";\n\tcase REG_PMMMAP_EL1: return \"pmmmap_el1\";\n\tcase REG_CTR_EL0: return \"ctr_el0\";\n\tcase REG_DCZID_EL0: return \"dczid_el0\";\n\tcase REG_NZCV: return \"nzcv\";\n\tcase REG_DAIF: return \"daif\";\n\tcase REG_SVCR: return \"svcr\";\n\tcase REG_DIT: return \"dit\";\n\tcase REG_SSBS: return \"ssbs\";\n\tcase REG_TCO: return \"tco\";\n\tcase REG_FPCR: return \"fpcr\";\n\tcase REG_FPSR: return \"fpsr\";\n\tcase REG_DSPSR: return \"dspsr\";\n\tcase REG_DLR: return \"dlr\";\n\tcase REG_PMCR_EL0: return \"pmcr_el0\";\n\tcase REG_PMCNTENSET_EL0: return \"pmcntenset_el0\";\n\tcase REG_PMCNTENCLR_EL0: return \"pmcntenclr_el0\";\n\tcase REG_PMOVSCLR_EL0: return \"pmovsclr_el0\";\n\tcase REG_PMSWINC_EL0: return \"pmswinc_el0\";\n\tcase REG_PMSELR_EL0: return \"pmselr_el0\";\n\tcase REG_PMCCNTR_EL0: return \"pmccntr_el0\";\n\tcase REG_PMXEVTYPER_EL0: return \"pmxevtyper_el0\";\n\tcase REG_PMXEVCNTR_EL0: return \"pmxevcntr_el0\";\n\tcase REG_DAIFCLR: return \"daifclr\";\n\tcase REG_PMUSERENR_EL0: return \"pmuserenr_el0\";\n\tcase REG_PMOVSSET_EL0: return \"pmovsset_el0\";\n\tcase REG_TPIDR_EL0: return \"tpidr_el0\";\n\tcase REG_TPIDRRO_EL0: return \"tpidrro_el0\";\n\tcase REG_TPIDR2_EL0: return \"tpidr2_el0\";\n\tcase REG_SCXTNUM_EL0: return \"scxtnum_el0\";\n\tcase REG_AMCR_EL0: return \"amcr_el0\";\n\tcase REG_AMUSERENR_EL0: return \"amuserenr_el0\";\n\tcase REG_AMCNTENCLR0_EL0: return \"amcntenclr0_el0\";\n\tcase REG_AMCNTENSET0_EL0: return \"amcntenset0_el0\";\n\tcase REG_AMCNTENCLR1_EL0: return \"amcntenclr1_el0\";\n\tcase REG_AMCNTENSET1_EL0: return \"amcntenset1_el0\";\n\tcase REG_AMEVCNTR00_EL0: return \"amevcntr00_el0\";\n\tcase REG_AMEVCNTR01_EL0: return \"amevcntr01_el0\";\n\tcase REG_AMEVCNTR02_EL0: return \"amevcntr02_el0\";\n\tcase REG_AMEVCNTR03_EL0: return \"amevcntr03_el0\";\n\tcase REG_AMEVCNTR10_EL0: return \"amevcntr10_el0\";\n\tcase REG_AMEVCNTR11_EL0: return \"amevcntr11_el0\";\n\tcase REG_AMEVCNTR12_EL0: return \"amevcntr12_el0\";\n\tcase REG_AMEVCNTR13_EL0: return \"amevcntr13_el0\";\n\tcase REG_AMEVCNTR14_EL0: return \"amevcntr14_el0\";\n\tcase REG_AMEVCNTR15_EL0: return \"amevcntr15_el0\";\n\tcase REG_AMEVCNTR16_EL0: return \"amevcntr16_el0\";\n\tcase REG_AMEVCNTR17_EL0: return \"amevcntr17_el0\";\n\tcase REG_AMEVCNTR18_EL0: return \"amevcntr18_el0\";\n\tcase REG_AMEVCNTR19_EL0: return \"amevcntr19_el0\";\n\tcase REG_AMEVCNTR110_EL0: return \"amevcntr110_el0\";\n\tcase REG_AMEVCNTR111_EL0: return \"amevcntr111_el0\";\n\tcase REG_AMEVCNTR112_EL0: return \"amevcntr112_el0\";\n\tcase REG_AMEVCNTR113_EL0: return \"amevcntr113_el0\";\n\tcase REG_AMEVCNTR114_EL0: return \"amevcntr114_el0\";\n\tcase REG_AMEVCNTR115_EL0: return \"amevcntr115_el0\";\n\tcase REG_AMEVTYPER10_EL0: return \"amevtyper10_el0\";\n\tcase REG_AMEVTYPER11_EL0: return \"amevtyper11_el0\";\n\tcase REG_AMEVTYPER12_EL0: return \"amevtyper12_el0\";\n\tcase REG_AMEVTYPER13_EL0: return \"amevtyper13_el0\";\n\tcase REG_AMEVTYPER14_EL0: return \"amevtyper14_el0\";\n\tcase REG_AMEVTYPER15_EL0: return \"amevtyper15_el0\";\n\tcase REG_AMEVTYPER16_EL0: return \"amevtyper16_el0\";\n\tcase REG_AMEVTYPER17_EL0: return \"amevtyper17_el0\";\n\tcase REG_AMEVTYPER18_EL0: return \"amevtyper18_el0\";\n\tcase REG_AMEVTYPER19_EL0: return \"amevtyper19_el0\";\n\tcase REG_AMEVTYPER110_EL0: return \"amevtyper110_el0\";\n\tcase REG_AMEVTYPER111_EL0: return \"amevtyper111_el0\";\n\tcase REG_AMEVTYPER112_EL0: return \"amevtyper112_el0\";\n\tcase REG_AMEVTYPER113_EL0: return \"amevtyper113_el0\";\n\tcase REG_AMEVTYPER114_EL0: return \"amevtyper114_el0\";\n\tcase REG_AMEVTYPER115_EL0: return \"amevtyper115_el0\";\n\tcase REG_CNTFRQ_EL0: return \"cntfrq_el0\";\n\tcase REG_CNTPCT_EL0: return \"cntpct_el0\";\n\tcase REG_CNTVCT_EL0: return \"cntvct_el0\";\n\tcase REG_CNTPCTSS_EL0: return \"cntpctss_el0\";\n\tcase REG_CNTVCTSS_EL0: return \"cntvctss_el0\";\n\tcase REG_CNTHP_TVAL_EL21: return \"cnthp_tval_el21\";\n\tcase REG_CNTHP_CTL_EL21: return \"cnthp_ctl_el21\";\n\tcase REG_CNTHP_CVAL_EL21: return \"cnthp_cval_el21\";\n\tcase REG_CNTHV_TVAL_EL21: return \"cnthv_tval_el21\";\n\tcase REG_CNTHV_CTL_EL21: return \"cnthv_ctl_el21\";\n\tcase REG_CNTHV_CVAL_EL21: return \"cnthv_cval_el21\";\n\tcase REG_PMEVCNTR0_EL0: return \"pmevcntr0_el0\";\n\tcase REG_PMEVCNTR1_EL0: return \"pmevcntr1_el0\";\n\tcase REG_PMEVCNTR2_EL0: return \"pmevcntr2_el0\";\n\tcase REG_PMEVCNTR3_EL0: return \"pmevcntr3_el0\";\n\tcase REG_PMEVCNTR4_EL0: return \"pmevcntr4_el0\";\n\tcase REG_PMEVCNTR5_EL0: return \"pmevcntr5_el0\";\n\tcase REG_PMEVCNTR6_EL0: return \"pmevcntr6_el0\";\n\tcase REG_PMEVCNTR7_EL0: return \"pmevcntr7_el0\";\n\tcase REG_PMEVCNTR8_EL0: return \"pmevcntr8_el0\";\n\tcase REG_PMEVCNTR9_EL0: return \"pmevcntr9_el0\";\n\tcase REG_PMEVCNTR10_EL0: return \"pmevcntr10_el0\";\n\tcase REG_PMEVCNTR11_EL0: return \"pmevcntr11_el0\";\n\tcase REG_PMEVCNTR12_EL0: return \"pmevcntr12_el0\";\n\tcase REG_PMEVCNTR13_EL0: return \"pmevcntr13_el0\";\n\tcase REG_PMEVCNTR14_EL0: return \"pmevcntr14_el0\";\n\tcase REG_PMEVCNTR15_EL0: return \"pmevcntr15_el0\";\n\tcase REG_PMEVCNTR16_EL0: return \"pmevcntr16_el0\";\n\tcase REG_PMEVCNTR17_EL0: return \"pmevcntr17_el0\";\n\tcase REG_PMEVCNTR18_EL0: return \"pmevcntr18_el0\";\n\tcase REG_PMEVCNTR19_EL0: return \"pmevcntr19_el0\";\n\tcase REG_PMEVCNTR20_EL0: return \"pmevcntr20_el0\";\n\tcase REG_PMEVCNTR21_EL0: return \"pmevcntr21_el0\";\n\tcase REG_PMEVCNTR22_EL0: return \"pmevcntr22_el0\";\n\tcase REG_PMEVCNTR23_EL0: return \"pmevcntr23_el0\";\n\tcase REG_PMEVCNTR24_EL0: return \"pmevcntr24_el0\";\n\tcase REG_PMEVCNTR25_EL0: return \"pmevcntr25_el0\";\n\tcase REG_PMEVCNTR26_EL0: return \"pmevcntr26_el0\";\n\tcase REG_PMEVCNTR27_EL0: return \"pmevcntr27_el0\";\n\tcase REG_PMEVCNTR28_EL0: return \"pmevcntr28_el0\";\n\tcase REG_PMEVCNTR29_EL0: return \"pmevcntr29_el0\";\n\tcase REG_PMEVCNTR30_EL0: return \"pmevcntr30_el0\";\n\tcase REG_PMEVTYPER0_EL0: return \"pmevtyper0_el0\";\n\tcase REG_PMEVTYPER1_EL0: return \"pmevtyper1_el0\";\n\tcase REG_PMEVTYPER2_EL0: return \"pmevtyper2_el0\";\n\tcase REG_PMEVTYPER3_EL0: return \"pmevtyper3_el0\";\n\tcase REG_PMEVTYPER4_EL0: return \"pmevtyper4_el0\";\n\tcase REG_PMEVTYPER5_EL0: return \"pmevtyper5_el0\";\n\tcase REG_PMEVTYPER6_EL0: return \"pmevtyper6_el0\";\n\tcase REG_PMEVTYPER7_EL0: return \"pmevtyper7_el0\";\n\tcase REG_PMEVTYPER8_EL0: return \"pmevtyper8_el0\";\n\tcase REG_PMEVTYPER9_EL0: return \"pmevtyper9_el0\";\n\tcase REG_PMEVTYPER10_EL0: return \"pmevtyper10_el0\";\n\tcase REG_PMEVTYPER11_EL0: return \"pmevtyper11_el0\";\n\tcase REG_PMEVTYPER12_EL0: return \"pmevtyper12_el0\";\n\tcase REG_PMEVTYPER13_EL0: return \"pmevtyper13_el0\";\n\tcase REG_PMEVTYPER14_EL0: return \"pmevtyper14_el0\";\n\tcase REG_PMEVTYPER15_EL0: return \"pmevtyper15_el0\";\n\tcase REG_PMEVTYPER16_EL0: return \"pmevtyper16_el0\";\n\tcase REG_PMEVTYPER17_EL0: return \"pmevtyper17_el0\";\n\tcase REG_PMEVTYPER18_EL0: return \"pmevtyper18_el0\";\n\tcase REG_PMEVTYPER19_EL0: return \"pmevtyper19_el0\";\n\tcase REG_PMEVTYPER20_EL0: return \"pmevtyper20_el0\";\n\tcase REG_PMEVTYPER21_EL0: return \"pmevtyper21_el0\";\n\tcase REG_PMEVTYPER22_EL0: return \"pmevtyper22_el0\";\n\tcase REG_PMEVTYPER23_EL0: return \"pmevtyper23_el0\";\n\tcase REG_PMEVTYPER24_EL0: return \"pmevtyper24_el0\";\n\tcase REG_PMEVTYPER25_EL0: return \"pmevtyper25_el0\";\n\tcase REG_PMEVTYPER26_EL0: return \"pmevtyper26_el0\";\n\tcase REG_PMEVTYPER27_EL0: return \"pmevtyper27_el0\";\n\tcase REG_PMEVTYPER28_EL0: return \"pmevtyper28_el0\";\n\tcase REG_PMEVTYPER29_EL0: return \"pmevtyper29_el0\";\n\tcase REG_PMEVTYPER30_EL0: return \"pmevtyper30_el0\";\n\tcase REG_PMCCFILTR_EL0: return \"pmccfiltr_el0\";\n\tcase REG_LSU_ERR_STS: return \"lsu_err_sts\";\n\tcase REG_AFLATCTL1_EL1: return \"aflatctl1_el1\";\n\tcase REG_AFLATVALBIN0_EL1: return \"aflatvalbin0_el1\";\n\tcase REG_AFLATINFLO_EL1: return \"aflatinflo_el1\";\n\tcase REG_LSU_ERR_CTL: return \"lsu_err_ctl\";\n\tcase REG_AFLATCTL2_EL1: return \"aflatctl2_el1\";\n\tcase REG_AFLATVALBIN1_EL1: return \"aflatvalbin1_el1\";\n\tcase REG_AFLATINFHI_EL1: return \"aflatinfhi_el1\";\n\tcase REG_AFLATCTL3_EL1: return \"aflatctl3_el1\";\n\tcase REG_AFLATVALBIN2_EL1: return \"aflatvalbin2_el1\";\n\tcase REG_AFLATCTL4_EL1: return \"aflatctl4_el1\";\n\tcase REG_AFLATVALBIN3_EL1: return \"aflatvalbin3_el1\";\n\tcase REG_LLC_FILL_CTL: return \"llc_fill_ctl\";\n\tcase REG_AFLATCTL5_LO_EL1: return \"aflatctl5_lo_el1\";\n\tcase REG_AFLATVALBIN4_EL1: return \"aflatvalbin4_el1\";\n\tcase REG_AFLATCTL5_HI_EL1: return \"aflatctl5_hi_el1\";\n\tcase REG_LLC_FILL_DAT: return \"llc_fill_dat\";\n\tcase REG_AFLATVALBIN5_EL1: return \"aflatvalbin5_el1\";\n\tcase REG_AFLATVALBIN6_EL1: return \"aflatvalbin6_el1\";\n\tcase REG_LLC_RAM_CONFIG: return \"llc_ram_config\";\n\tcase REG_AFLATVALBIN7_EL1: return \"aflatvalbin7_el1\";\n\tcase REG_LLC_ERR_STS: return \"llc_err_sts\";\n\tcase REG_CMAINT_BCAST_LIST_0: return \"cmaint_bcast_list_0\";\n\tcase REG_CMAINT_BCAST_LIST_1: return \"cmaint_bcast_list_1\";\n\tcase REG_CMAINT_BCAST_CTL: return \"cmaint_bcast_ctl\";\n\tcase REG_LLC_ERR_ADR: return \"llc_err_adr\";\n\tcase REG_LLC_ERR_CTL: return \"llc_err_ctl\";\n\tcase REG_LLC_ERR_INJ: return \"llc_err_inj\";\n\tcase REG_LLC_ERR_INF: return \"llc_err_inf\";\n\tcase REG_USERTAGSEL_EL1: return \"usertagsel_el1\";\n\tcase REG_UUSERTAG_EL0: return \"uusertag_el0\";\n\tcase REG_KUSERTAG_EL1: return \"kusertag_el1\";\n\tcase REG_HUSERTAG_EL2: return \"husertag_el2\";\n\tcase REG_LLC_TRACE_CTL0: return \"llc_trace_ctl0\";\n\tcase REG_LLC_TRACE_CTL1: return \"llc_trace_ctl1\";\n\tcase REG_LLC_UP_REQ_VC: return \"llc_up_req_vc\";\n\tcase REG_LLC_UP_REQ_VC_THRESH: return \"llc_up_req_vc_thresh\";\n\tcase REG_LLC_UP_REQ_VC_2: return \"llc_up_req_vc_2\";\n\tcase REG_LLC_UP_REQ_VC_THRESH_2: return \"llc_up_req_vc_thresh_2\";\n\tcase REG_LLC_DRAM_HASH0: return \"llc_dram_hash0\";\n\tcase REG_LLC_DRAM_HASH1: return \"llc_dram_hash1\";\n\tcase REG_LLC_DRAM_HASH2: return \"llc_dram_hash2\";\n\tcase REG_LLC_DRAM_HASH3: return \"llc_dram_hash3\";\n\tcase REG_LLC_TRACE_CTL2: return \"llc_trace_ctl2\";\n\tcase REG_LLC_DRAM_HASH4: return \"llc_dram_hash4\";\n\tcase REG_LLC_UP_REQ_VC_3: return \"llc_up_req_vc_3\";\n\tcase REG_LLC_UP_REQ_VC_THRESH_3: return \"llc_up_req_vc_thresh_3\";\n\tcase REG_LLC_UP_REQ_VC_4: return \"llc_up_req_vc_4\";\n\tcase REG_LLC_UP_REQ_VC_THRESH_4: return \"llc_up_req_vc_thresh_4\";\n\tcase REG_LLC_HASH0: return \"llc_hash0\";\n\tcase REG_LLC_HASH1: return \"llc_hash1\";\n\tcase REG_LLC_HASH2: return \"llc_hash2\";\n\tcase REG_LLC_HASH3: return \"llc_hash3\";\n\tcase REG_LLC_WRR: return \"llc_wrr\";\n\tcase REG_LLC_DRAM_HASH5: return \"llc_dram_hash5\";\n\tcase REG_LLC_DRAM_HASH6: return \"llc_dram_hash6\";\n\tcase REG_VPIDR_EL2: return \"vpidr_el2\";\n\tcase REG_VMPIDR_EL2: return \"vmpidr_el2\";\n\tcase REG_SCTLR_EL2: return \"sctlr_el2\";\n\tcase REG_ACTLR_EL2: return \"actlr_el2\";\n\tcase REG_HCR_EL2: return \"hcr_el2\";\n\tcase REG_MDCR_EL2: return \"mdcr_el2\";\n\tcase REG_CPTR_EL2: return \"cptr_el2\";\n\tcase REG_HSTR_EL2: return \"hstr_el2\";\n\tcase REG_HFGRTR_EL2: return \"hfgrtr_el2\";\n\tcase REG_HFGWTR_EL2: return \"hfgwtr_el2\";\n\tcase REG_HFGITR_EL2: return \"hfgitr_el2\";\n\tcase REG_HACR_EL2: return \"hacr_el2\";\n\tcase REG_TRFCR_EL2: return \"trfcr_el2\";\n\tcase REG_HCRX_EL2: return \"hcrx_el2\";\n\tcase REG_SMPRIMAP_EL2: return \"smprimap_el2\";\n\tcase REG_SMCR_EL2: return \"smcr_el2\";\n\tcase REG_SDER32_EL2: return \"sder32_el2\";\n\tcase REG_TTBR0_EL2: return \"ttbr0_el2\";\n\tcase REG_TTBR1_EL2: return \"ttbr1_el2\";\n\tcase REG_TCR_EL2: return \"tcr_el2\";\n\tcase REG_VTTBR_EL2: return \"vttbr_el2\";\n\tcase REG_VTCR_EL2: return \"vtcr_el2\";\n\tcase REG_VNCR_EL2: return \"vncr_el2\";\n\tcase REG_VSTTBR_EL2: return \"vsttbr_el2\";\n\tcase REG_VSTCR_EL2: return \"vstcr_el2\";\n\tcase REG_DACR32_EL2: return \"dacr32_el2\";\n\tcase REG_HDFGRTR_EL2: return \"hdfgrtr_el2\";\n\tcase REG_HDFGWTR_EL2: return \"hdfgwtr_el2\";\n\tcase REG_SPSR_EL2: return \"spsr_el2\";\n\tcase REG_ELR_EL2: return \"elr_el2\";\n\tcase REG_SP_EL1: return \"sp_el1\";\n\tcase REG_SPSR_IRQ: return \"spsr_irq\";\n\tcase REG_SPSR_ABT: return \"spsr_abt\";\n\tcase REG_SPSR_UND: return \"spsr_und\";\n\tcase REG_SPSR_FIQ: return \"spsr_fiq\";\n\tcase REG_IFSR32_EL2: return \"ifsr32_el2\";\n\tcase REG_AFSR0_EL2: return \"afsr0_el2\";\n\tcase REG_AFSR1_EL2: return \"afsr1_el2\";\n\tcase REG_ESR_EL2: return \"esr_el2\";\n\tcase REG_VSESR_EL2: return \"vsesr_el2\";\n\tcase REG_FPEXC32_EL2: return \"fpexc32_el2\";\n\tcase REG_TFSR_EL2: return \"tfsr_el2\";\n\tcase REG_FAR_EL2: return \"far_el2\";\n\tcase REG_HPFAR_EL2: return \"hpfar_el2\";\n\tcase REG_PMSCR_EL2: return \"pmscr_el2\";\n\tcase REG_MAIR_EL2: return \"mair_el2\";\n\tcase REG_AMAIR_EL2: return \"amair_el2\";\n\tcase REG_MPAMHCR_EL2: return \"mpamhcr_el2\";\n\tcase REG_MPAMVPMV_EL2: return \"mpamvpmv_el2\";\n\tcase REG_MPAM2_EL2: return \"mpam2_el2\";\n\tcase REG_MPAMVPM0_EL2: return \"mpamvpm0_el2\";\n\tcase REG_MPAMVPM1_EL2: return \"mpamvpm1_el2\";\n\tcase REG_MPAMVPM2_EL2: return \"mpamvpm2_el2\";\n\tcase REG_MPAMVPM3_EL2: return \"mpamvpm3_el2\";\n\tcase REG_MPAMVPM4_EL2: return \"mpamvpm4_el2\";\n\tcase REG_MPAMVPM5_EL2: return \"mpamvpm5_el2\";\n\tcase REG_MPAMVPM6_EL2: return \"mpamvpm6_el2\";\n\tcase REG_MPAMVPM7_EL2: return \"mpamvpm7_el2\";\n\tcase REG_VBAR_EL2: return \"vbar_el2\";\n\tcase REG_RVBAR_EL2: return \"rvbar_el2\";\n\tcase REG_RMR_EL2: return \"rmr_el2\";\n\tcase REG_VDISR_EL2: return \"vdisr_el2\";\n\tcase REG_ICH_AP0R0_EL2: return \"ich_ap0r0_el2\";\n\tcase REG_ICH_AP0R1_EL2: return \"ich_ap0r1_el2\";\n\tcase REG_ICH_AP0R2_EL2: return \"ich_ap0r2_el2\";\n\tcase REG_ICH_AP0R3_EL2: return \"ich_ap0r3_el2\";\n\tcase REG_ICH_AP1R0_EL2: return \"ich_ap1r0_el2\";\n\tcase REG_ICH_AP1R1_EL2: return \"ich_ap1r1_el2\";\n\tcase REG_ICH_AP1R2_EL2: return \"ich_ap1r2_el2\";\n\tcase REG_ICH_AP1R3_EL2: return \"ich_ap1r3_el2\";\n\tcase REG_ICH_VSEIR_EL2: return \"ich_vseir_el2\";\n\tcase REG_ICC_SRE_EL2: return \"icc_sre_el2\";\n\tcase REG_ICH_HCR_EL2: return \"ich_hcr_el2\";\n\tcase REG_ICH_VTR_EL2: return \"ich_vtr_el2\";\n\tcase REG_ICH_MISR_EL2: return \"ich_misr_el2\";\n\tcase REG_ICH_EISR_EL2: return \"ich_eisr_el2\";\n\tcase REG_ICH_ELRSR_EL2: return \"ich_elrsr_el2\";\n\tcase REG_ICH_VMCR_EL2: return \"ich_vmcr_el2\";\n\tcase REG_ICH_LR0_EL2: return \"ich_lr0_el2\";\n\tcase REG_ICH_LR1_EL2: return \"ich_lr1_el2\";\n\tcase REG_ICH_LR2_EL2: return \"ich_lr2_el2\";\n\tcase REG_ICH_LR3_EL2: return \"ich_lr3_el2\";\n\tcase REG_ICH_LR4_EL2: return \"ich_lr4_el2\";\n\tcase REG_ICH_LR5_EL2: return \"ich_lr5_el2\";\n\tcase REG_ICH_LR6_EL2: return \"ich_lr6_el2\";\n\tcase REG_ICH_LR7_EL2: return \"ich_lr7_el2\";\n\tcase REG_ICH_LR8_EL2: return \"ich_lr8_el2\";\n\tcase REG_ICH_LR9_EL2: return \"ich_lr9_el2\";\n\tcase REG_ICH_LR10_EL2: return \"ich_lr10_el2\";\n\tcase REG_ICH_LR11_EL2: return \"ich_lr11_el2\";\n\tcase REG_ICH_LR12_EL2: return \"ich_lr12_el2\";\n\tcase REG_ICH_LR13_EL2: return \"ich_lr13_el2\";\n\tcase REG_ICH_LR14_EL2: return \"ich_lr14_el2\";\n\tcase REG_ICH_LR15_EL2: return \"ich_lr15_el2\";\n\tcase REG_CONTEXTIDR_EL2: return \"contextidr_el2\";\n\tcase REG_TPIDR_EL2: return \"tpidr_el2\";\n\tcase REG_SCXTNUM_EL2: return \"scxtnum_el2\";\n\tcase REG_CNTVOFF_EL2: return \"cntvoff_el2\";\n\tcase REG_CNTHCTL_EL2: return \"cnthctl_el2\";\n\tcase REG_CNTHP_TVAL_EL2: return \"cnthp_tval_el2\";\n\tcase REG_CNTHP_CTL_EL2: return \"cnthp_ctl_el2\";\n\tcase REG_CNTHP_CVAL_EL2: return \"cnthp_cval_el2\";\n\tcase REG_CNTHV_TVAL_EL2: return \"cnthv_tval_el2\";\n\tcase REG_CNTHV_CTL_EL2: return \"cnthv_ctl_el2\";\n\tcase REG_CNTHV_CVAL_EL2: return \"cnthv_cval_el2\";\n\tcase REG_CNTHVS_TVAL_EL2: return \"cnthvs_tval_el2\";\n\tcase REG_CNTHVS_CTL_EL2: return \"cnthvs_ctl_el2\";\n\tcase REG_CNTHVS_CVAL_EL2: return \"cnthvs_cval_el2\";\n\tcase REG_CNTHPS_TVAL_EL2: return \"cnthps_tval_el2\";\n\tcase REG_CNTHPS_CTL_EL2: return \"cnthps_ctl_el2\";\n\tcase REG_CNTHPS_CVAL_EL2: return \"cnthps_cval_el2\";\n\tcase REG_FED_ERR_STS: return \"fed_err_sts\";\n\tcase REG_FED_ERR_CTL: return \"fed_err_ctl\";\n\tcase REG_APCTL_EL1: return \"apctl_el1\";\n\tcase REG_KERNKEYLO_EL1: return \"kernkeylo_el1\";\n\tcase REG_KERNKEYHI_EL1: return \"kernkeyhi_el1\";\n\tcase REG_VMSALOCK_EL21: return \"vmsalock_el21\";\n\tcase REG_AMX_STATE_T_EL1: return \"amx_state_t_el1\";\n\tcase REG_AMX_CONFIG_EL1: return \"amx_config_el1\";\n\tcase REG_VMSA_LOCK_EL2: return \"vmsa_lock_el2\";\n\tcase REG_CTRR_B_UPR_EL1: return \"ctrr_b_upr_el1\";\n\tcase REG_CTRR_B_LWR_EL1: return \"ctrr_b_lwr_el1\";\n\tcase REG_SP_SETUP_GL1: return \"sp_setup_gl1\";\n\tcase REG_SP_SETUP_GL2: return \"sp_setup_gl2\";\n\tcase REG_CTRR_B_CTL_EL1: return \"ctrr_b_ctl_el1\";\n\tcase REG_CTRR_A_LWR_EL1: return \"ctrr_a_lwr_el1\";\n\tcase REG_CTRR_A_UPR_EL1: return \"ctrr_a_upr_el1\";\n\tcase REG_CTRR_A_CTL_EL1: return \"ctrr_a_ctl_el1\";\n\tcase REG_VMSA_LOCK_EL12: return \"vmsa_lock_el12\";\n\tcase REG_AGTCNTV_CTL_EL02: return \"agtcntv_ctl_el02\";\n\tcase REG_AMX_STATE_EL1: return \"amx_state_el1\";\n\tcase REG_AMX_STATUS_EL1: return \"amx_status_el1\";\n\tcase REG_AGTCNTP_CVAL_EL02: return \"agtcntp_cval_el02\";\n\tcase REG_REDIR_ACNTP_TVAL_EL02: return \"redir_acntp_tval_el02\";\n\tcase REG_AGTCNTP_CTL_EL02: return \"agtcntp_ctl_el02\";\n\tcase REG_AGTCNTV_CVAL_EL02: return \"agtcntv_cval_el02\";\n\tcase REG_AGTCNTV_TVAL_EL02: return \"agtcntv_tval_el02\";\n\tcase REG_AMX_CONFIG_EL12: return \"amx_config_el12\";\n\tcase REG_AMX_CONFIG_EL2: return \"amx_config_el2\";\n\tcase REG_SPRR_HUPERM_EL0: return \"sprr_huperm_el0\";\n\tcase REG_SPRR_VUPERM_EL0: return \"sprr_vuperm_el0\";\n\tcase REG_CTRR_A_CTL_EL2: return \"ctrr_a_ctl_el2\";\n\tcase REG_CTRR_B_CTL_EL2: return \"ctrr_b_ctl_el2\";\n\tcase REG_CTRR_A_LWR_EL2: return \"ctrr_a_lwr_el2\";\n\tcase REG_CTRR_A_UPR_EL2: return \"ctrr_a_upr_el2\";\n\tcase REG_CTRR_B_LWR_EL2: return \"ctrr_b_lwr_el2\";\n\tcase REG_CTRR_B_UPR_EL2: return \"ctrr_b_upr_el2\";\n\tcase REG_SPRR_HUMPRR_EL2: return \"sprr_humprr_el2\";\n\tcase REG_SPRR_HUPERM_SH01_EL2: return \"sprr_huperm_sh01_el2\";\n\tcase REG_SPRR_HUPERM_SH02_EL2: return \"sprr_huperm_sh02_el2\";\n\tcase REG_SPRR_HUPERM_SH03_EL2: return \"sprr_huperm_sh03_el2\";\n\tcase REG_SPRR_HUPERM_SH04_EL2: return \"sprr_huperm_sh04_el2\";\n\tcase REG_SPRR_HUPERM_SH05_EL2: return \"sprr_huperm_sh05_el2\";\n\tcase REG_SPRR_HUPERM_SH06_EL2: return \"sprr_huperm_sh06_el2\";\n\tcase REG_SPRR_HUPERM_SH07_EL2: return \"sprr_huperm_sh07_el2\";\n\tcase REG_SPRR_VUMPRR_EL1: return \"sprr_vumprr_el1\";\n\tcase REG_SPRR_VUPERM_SH01_EL1: return \"sprr_vuperm_sh01_el1\";\n\tcase REG_SPRR_VUPERM_SH02_EL1: return \"sprr_vuperm_sh02_el1\";\n\tcase REG_SPRR_VUPERM_SH03_EL1: return \"sprr_vuperm_sh03_el1\";\n\tcase REG_SPRR_VUPERM_SH04_EL1: return \"sprr_vuperm_sh04_el1\";\n\tcase REG_SPRR_VUPERM_SH05_EL1: return \"sprr_vuperm_sh05_el1\";\n\tcase REG_SPRR_VUPERM_SH06_EL1: return \"sprr_vuperm_sh06_el1\";\n\tcase REG_SPRR_VUPERM_SH07_EL1: return \"sprr_vuperm_sh07_el1\";\n\tcase REG_CTRR_A_LWR_EL12: return \"ctrr_a_lwr_el12\";\n\tcase REG_CTRR_A_UPR_EL12: return \"ctrr_a_upr_el12\";\n\tcase REG_CTRR_B_LWR_EL12: return \"ctrr_b_lwr_el12\";\n\tcase REG_CTRR_B_UPR_EL12: return \"ctrr_b_upr_el12\";\n\tcase REG_CTRR_A_CTL_EL12: return \"ctrr_a_ctl_el12\";\n\tcase REG_CTRR_B_CTL_EL12: return \"ctrr_b_ctl_el12\";\n\tcase REG_AGTCNTHCTL_EL21: return \"agtcnthctl_el21\";\n\tcase REG_AGTCNTKCTL_EL12: return \"agtcntkctl_el12\";\n\tcase REG_PREDAKEYLO_EL1: return \"predakeylo_el1\";\n\tcase REG_PREDAKEYHI_EL1: return \"predakeyhi_el1\";\n\tcase REG_PREDBKEYLO_EL1: return \"predbkeylo_el1\";\n\tcase REG_PREDBKEYHI_EL1: return \"predbkeyhi_el1\";\n\tcase REG_SIQ_CFG_EL1: return \"siq_cfg_el1\";\n\tcase REG_AGTCNTPCTSS_EL0: return \"agtcntpctss_el0\";\n\tcase REG_AGTCNTVCTSS_EL0: return \"agtcntvctss_el0\";\n\tcase REG_AVNCR_EL2: return \"avncr_el2\";\n\tcase REG_ACC_CTRR_A_LWR_EL2: return \"acc_ctrr_a_lwr_el2\";\n\tcase REG_ACC_CTRR_A_UPR_EL2: return \"acc_ctrr_a_upr_el2\";\n\tcase REG_ACC_CTRR_B_LWR_EL2: return \"acc_ctrr_b_lwr_el2\";\n\tcase REG_ACC_CTRR_B_UPR_EL2: return \"acc_ctrr_b_upr_el2\";\n\tcase REG_ACC_CTRR_A_CTL_EL2: return \"acc_ctrr_a_ctl_el2\";\n\tcase REG_ACC_CTRR_B_CTL_EL2: return \"acc_ctrr_b_ctl_el2\";\n\tcase REG_AGTCNTPCT_EL0: return \"agtcntpct_el0\";\n\tcase REG_AGTCNTVCT_EL0: return \"agtcntvct_el0\";\n\tcase REG_ACFG_EL1: return \"acfg_el1\";\n\tcase REG_AHCR_EL2: return \"ahcr_el2\";\n\tcase REG_APL_INTSTATUS_EL1: return \"apl_intstatus_el1\";\n\tcase REG_APL_INTSTATUS_EL2: return \"apl_intstatus_el2\";\n\tcase REG_AGTCNTHCTL_EL2: return \"agtcnthctl_el2\";\n\tcase REG_JAPIAKEYLO_EL2: return \"japiakeylo_el2\";\n\tcase REG_JAPIAKEYHI_EL2: return \"japiakeyhi_el2\";\n\tcase REG_JAPIBKEYLO_EL2: return \"japibkeylo_el2\";\n\tcase REG_JAPIBKEYHI_EL2: return \"japibkeyhi_el2\";\n\tcase REG_JAPIAKEYLO_EL1: return \"japiakeylo_el1\";\n\tcase REG_JAPIAKEYHI_EL1: return \"japiakeyhi_el1\";\n\tcase REG_JAPIBKEYLO_EL1: return \"japibkeylo_el1\";\n\tcase REG_JAPIBKEYHI_EL1: return \"japibkeyhi_el1\";\n\tcase REG_JAPIAKEYLO_EL12: return \"japiakeylo_el12\";\n\tcase REG_JAPIAKEYHI_EL12: return \"japiakeyhi_el12\";\n\tcase REG_JAPIBKEYLO_EL12: return \"japibkeylo_el12\";\n\tcase REG_JAPIBKEYHI_EL12: return \"japibkeyhi_el12\";\n\tcase REG_AGTCNTRDIR_EL2: return \"agtcntrdir_el2\";\n\tcase REG_AGTCNTRDIR_EL12: return \"agtcntrdir_el12\";\n\tcase REG_JRANGE_EL2: return \"jrange_el2\";\n\tcase REG_JRANGE_EL1: return \"jrange_el1\";\n\tcase REG_JRANGE_EL12: return \"jrange_el12\";\n\tcase REG_JCTL_EL2: return \"jctl_el2\";\n\tcase REG_JCTL_EL1: return \"jctl_el1\";\n\tcase REG_JCTL_EL12: return \"jctl_el12\";\n\tcase REG_JCTL_EL0: return \"jctl_el0\";\n\tcase REG_AMDSCR_EL1: return \"amdscr_el1\";\n\tcase REG_SCTLR_EL12: return \"sctlr_el12\";\n\tcase REG_ACTLR_EL12: return \"actlr_el12\";\n\tcase REG_CPACR_EL12: return \"cpacr_el12\";\n\tcase REG_TRFCR_EL12: return \"trfcr_el12\";\n\tcase REG_SMCR_EL12: return \"smcr_el12\";\n\tcase REG_TTBR0_EL12: return \"ttbr0_el12\";\n\tcase REG_TTBR1_EL12: return \"ttbr1_el12\";\n\tcase REG_TCR_EL12: return \"tcr_el12\";\n\tcase REG_SPSR_EL12: return \"spsr_el12\";\n\tcase REG_ELR_EL12: return \"elr_el12\";\n\tcase REG_AFSR0_EL12: return \"afsr0_el12\";\n\tcase REG_AFSR1_EL12: return \"afsr1_el12\";\n\tcase REG_ESR_EL12: return \"esr_el12\";\n\tcase REG_TFSR_EL12: return \"tfsr_el12\";\n\tcase REG_FAR_EL12: return \"far_el12\";\n\tcase REG_PMSCR_EL12: return \"pmscr_el12\";\n\tcase REG_MAIR_EL12: return \"mair_el12\";\n\tcase REG_AMAIR_EL12: return \"amair_el12\";\n\tcase REG_MPAM1_EL12: return \"mpam1_el12\";\n\tcase REG_VBAR_EL12: return \"vbar_el12\";\n\tcase REG_CONTEXTIDR_EL12: return \"contextidr_el12\";\n\tcase REG_SCXTNUM_EL12: return \"scxtnum_el12\";\n\tcase REG_CNTKCTL_EL12: return \"cntkctl_el12\";\n\tcase REG_CNTP_TVAL_EL02: return \"cntp_tval_el02\";\n\tcase REG_CNTP_CTL_EL02: return \"cntp_ctl_el02\";\n\tcase REG_CNTP_CVAL_EL02: return \"cntp_cval_el02\";\n\tcase REG_CNTV_TVAL_EL02: return \"cntv_tval_el02\";\n\tcase REG_CNTV_CTL_EL02: return \"cntv_ctl_el02\";\n\tcase REG_CNTV_CVAL_EL02: return \"cntv_cval_el02\";\n\tcase REG_IPI_RR_LOCAL_EL1: return \"ipi_rr_local_el1\";\n\tcase REG_IPI_RR_GLOBAL_EL1: return \"ipi_rr_global_el1\";\n\tcase REG_AF_ERR_CFG0: return \"af_err_cfg0\";\n\tcase REG_AP_ERR_CFG0: return \"ap_err_cfg0\";\n\tcase REG_AF_ERR_SRC_IDS: return \"af_err_src_ids\";\n\tcase REG_DPC_ERR_STS: return \"dpc_err_sts\";\n\tcase REG_DPC_ERR_CTL: return \"dpc_err_ctl\";\n\tcase REG_PROD_TRC_CORE_CFG_EL1: return \"prod_trc_core_cfg_el1\";\n\tcase REG_TRACE_CORE_CFG: return \"trace_core_cfg\";\n\tcase REG_IPI_SR: return \"ipi_sr\";\n\tcase REG_APL_LRTMR_EL2: return \"apl_lrtmr_el2\";\n\tcase REG_APL_INTENABLE_EL2: return \"apl_intenable_el2\";\n\tcase REG_KTRACE_MESSAGE: return \"ktrace_message\";\n\tcase REG_TRACE_CORE_CFG_EXT: return \"trace_core_cfg_ext\";\n\tcase REG_PROD_TRC_CORE_CFG_EL2: return \"prod_trc_core_cfg_el2\";\n\tcase REG_HID_PROD_TRC_CORE_CFG_EL1: return \"hid_prod_trc_core_cfg_el1\";\n\tcase REG_DBG_WRAP_GLB: return \"dbg_wrap_glb\";\n\tcase REG_TRACE_STREAM_BASE: return \"trace_stream_base\";\n\tcase REG_TRACE_STREAM_FILL: return \"trace_stream_fill\";\n\tcase REG_TRACE_STREAM_BASE1: return \"trace_stream_base1\";\n\tcase REG_TRACE_STREAM_FILL1: return \"trace_stream_fill1\";\n\tcase REG_TRACE_STREAM_IRQ: return \"trace_stream_irq\";\n\tcase REG_WATCHDOGDIAG0: return \"watchdogdiag0\";\n\tcase REG_WATCHDOGDIAG1: return \"watchdogdiag1\";\n\tcase REG_TRACE_AUX_CTL: return \"trace_aux_ctl\";\n\tcase REG_IPI_CR: return \"ipi_cr\";\n\tcase REG_UTRIG_EVENT: return \"utrig_event\";\n\tcase REG_HID_PROD_TRC_MASK_EL1: return \"hid_prod_trc_mask_el1\";\n\tcase REG_TRACE_CTL: return \"trace_ctl\";\n\tcase REG_TRACE_DAT: return \"trace_dat\";\n\tcase REG_PROD_TRC_STRM_BASE0_GL2: return \"prod_trc_strm_base0_gl2\";\n\tcase REG_PROD_TRC_STRM_BASE1_GL2: return \"prod_trc_strm_base1_gl2\";\n\tcase REG_CPU_CFG: return \"cpu_cfg\";\n\tcase REG_PBLK_STS: return \"pblk_sts\";\n\tcase REG_PROD_TRC_CTL_EL1: return \"prod_trc_ctl_el1\";\n\tcase REG_PROD_TRC_STRM_BASE0_GL1: return \"prod_trc_strm_base0_gl1\";\n\tcase REG_PROD_TRC_STRM_BASE1_GL1: return \"prod_trc_strm_base1_gl1\";\n\tcase REG_PROD_TRC_STRM_FIQ_EL1: return \"prod_trc_strm_fiq_el1\";\n\tcase REG_CPU_OVRD: return \"cpu_ovrd\";\n\tcase REG_PBLK_EXE_ST: return \"pblk_exe_st\";\n\tcase REG_PROD_TRC_CORE_GL_CTL_GL1: return \"prod_trc_core_gl_ctl_gl1\";\n\tcase REG_PROD_TRC_CORE_GL_CTL_GL2: return \"prod_trc_core_gl_ctl_gl2\";\n\tcase REG_ACC_OVRD: return \"acc_ovrd\";\n\tcase REG_ACC_OVRD1: return \"acc_ovrd1\";\n\tcase REG_CPM_PWRDN_CTL: return \"cpm_pwrdn_ctl\";\n\tcase REG_PROD_TRC_BUF_RESTORE0_GL1: return \"prod_trc_buf_restore0_gl1\";\n\tcase REG_PROD_TRC_BUF_RESTORE1_GL1: return \"prod_trc_buf_restore1_gl1\";\n\tcase REG_PROD_TRC_EN_GL1: return \"prod_trc_en_gl1\";\n\tcase REG_PRE_LLCFLUSH_TMR: return \"pre_llcflush_tmr\";\n\tcase REG_BIUINTFCTL_CFG: return \"biuintfctl_cfg\";\n\tcase REG_BIUINTFWRR_CFG: return \"biuintfwrr_cfg\";\n\tcase REG_PRE_TD_TMR: return \"pre_td_tmr\";\n\tcase REG_ACC_SLP_WAKE_UP_TMR: return \"acc_slp_wake_up_tmr\";\n\tcase REG_PBLK_PSW_DLY: return \"pblk_psw_dly\";\n\tcase REG_CPU_STS: return \"cpu_sts\";\n\tcase REG_HIST_TRIG: return \"hist_trig\";\n\tcase REG_PROD_TRC_BUF_RESTORE0_GL2: return \"prod_trc_buf_restore0_gl2\";\n\tcase REG_PROD_TRC_BUF_RESTORE1_GL2: return \"prod_trc_buf_restore1_gl2\";\n\tcase REG_PROD_TRC_STRM_FILL0_EL1: return \"prod_trc_strm_fill0_el1\";\n\tcase REG_PROD_TRC_STRM_FILL1_EL1: return \"prod_trc_strm_fill1_el1\";\n\tcase REG_ARRAY_INDEX: return \"array_index\";\n\tcase REG_PROD_TRC_CTL_EL2: return \"prod_trc_ctl_el2\";\n\tcase REG_PROD_TRC_EN_GL2: return \"prod_trc_en_gl2\";\n\tcase REG_PROD_TRC_STRM_FIQ_EL2: return \"prod_trc_strm_fiq_el2\";\n\tcase REG_PROD_TRC_CPMU_DUMP_TRIG_EL1: return \"prod_trc_cpmu_dump_trig_el1\";\n\tcase REG_PROD_LOSS_COUNT_EL1: return \"prod_loss_count_el1\";\n\tcase REG_SW_TRACE_DATA_EL0: return \"sw_trace_data_el0\";\n\tcase REG_IL1_DATA0: return \"il1_data0\";\n\tcase REG_IL1_DATA1: return \"il1_data1\";\n\tcase REG_DL1_DATA0: return \"dl1_data0\";\n\tcase REG_DL1_DATA1: return \"dl1_data1\";\n\tcase REG_MMUDATA0: return \"mmudata0\";\n\tcase REG_MMUDATA1: return \"mmudata1\";\n\tcase REG_DL1_DATA2: return \"dl1_data2\";\n\tcase REG_IL1_DATA2: return \"il1_data2\";\n\tcase REG_LLC_DATA0: return \"llc_data0\";\n\tcase REG_LLC_DATA1: return \"llc_data1\";\n\tcase REG_SCTLR_EL3: return \"sctlr_el3\";\n\tcase REG_ACTLR_EL3: return \"actlr_el3\";\n\tcase REG_SCR_EL3: return \"scr_el3\";\n\tcase REG_SDER32_EL3: return \"sder32_el3\";\n\tcase REG_CPTR_EL3: return \"cptr_el3\";\n\tcase REG_MDCR_EL3: return \"mdcr_el3\";\n\tcase REG_TTBR0_EL3: return \"ttbr0_el3\";\n\tcase REG_TCR_EL3: return \"tcr_el3\";\n\tcase REG_SPSR_EL3: return \"spsr_el3\";\n\tcase REG_ELR_EL3: return \"elr_el3\";\n\tcase REG_SP_EL2: return \"sp_el2\";\n\tcase REG_AFSR0_EL3: return \"afsr0_el3\";\n\tcase REG_AFSR1_EL3: return \"afsr1_el3\";\n\tcase REG_ESR_EL3: return \"esr_el3\";\n\tcase REG_TFSR_EL3: return \"tfsr_el3\";\n\tcase REG_FAR_EL3: return \"far_el3\";\n\tcase REG_MAIR_EL3: return \"mair_el3\";\n\tcase REG_AMAIR_EL3: return \"amair_el3\";\n\tcase REG_MPAM3_EL3: return \"mpam3_el3\";\n\tcase REG_VBAR_EL3: return \"vbar_el3\";\n\tcase REG_RVBAR_EL3: return \"rvbar_el3\";\n\tcase REG_RMR_EL3: return \"rmr_el3\";\n\tcase REG_ICC_CTLR_EL3: return \"icc_ctlr_el3\";\n\tcase REG_ICC_SRE_EL3: return \"icc_sre_el3\";\n\tcase REG_ICC_IGRPEN1_EL3: return \"icc_igrpen1_el3\";\n\tcase REG_TPIDR_EL3: return \"tpidr_el3\";\n\tcase REG_SCXTNUM_EL3: return \"scxtnum_el3\";\n\tcase REG_MMU_ERR_STS: return \"mmu_err_sts\";\n\tcase REG_AFSR1_GL1: return \"afsr1_gl1\";\n\tcase REG_AFSR1_GL2: return \"afsr1_gl2\";\n\tcase REG_AFSR1_GL12: return \"afsr1_gl12\";\n\tcase REG_BP_OBJC_ADR_EL1: return \"bp_objc_adr_el1\";\n\tcase REG_BP_OBJC_CTL_EL1: return \"bp_objc_ctl_el1\";\n\tcase REG_SP_GL11: return \"sp_gl11\";\n\tcase REG_MMU_SESR_EL2: return \"mmu_sesr_el2\";\n\tcase REG_SPRR_CONFIG_EL1: return \"sprr_config_el1\";\n\tcase REG_HPFAR_GL2: return \"hpfar_gl2\";\n\tcase REG_GXF_CONFIG_EL1: return \"gxf_config_el1\";\n\tcase REG_AMRANGE_EL21: return \"amrange_el21\";\n\tcase REG_GXF_CONFIG_EL2: return \"gxf_config_el2\";\n\tcase REG_SPRR_UPERM_EL0: return \"sprr_uperm_el0\";\n\tcase REG_SPRR_PPERM_EL1: return \"sprr_pperm_el1\";\n\tcase REG_SPRR_PPERM_EL2: return \"sprr_pperm_el2\";\n\tcase REG_APGAKEYLO_EL12: return \"apgakeylo_el12\";\n\tcase REG_APGAKEYHI_EL12: return \"apgakeyhi_el12\";\n\tcase REG_KERNKEYLO_EL12: return \"kernkeylo_el12\";\n\tcase REG_KERNKEYHI_EL12: return \"kernkeyhi_el12\";\n\tcase REG_AFPCR_EL0: return \"afpcr_el0\";\n\tcase REG_SP_GL22: return \"sp_gl22\";\n\tcase REG_AMXIDR_EL1: return \"amxidr_el1\";\n\tcase REG_SPRR_HUMPRR_EL21: return \"sprr_humprr_el21\";\n\tcase REG_SPRR_PMPRR_EL1: return \"sprr_pmprr_el1\";\n\tcase REG_SPRR_PMPRR_EL2: return \"sprr_pmprr_el2\";\n\tcase REG_SPRR_HUPERM_SH01_EL21: return \"sprr_huperm_sh01_el21\";\n\tcase REG_SPRR_HUPERM_SH02_EL21: return \"sprr_huperm_sh02_el21\";\n\tcase REG_SPRR_HUPERM_SH03_EL21: return \"sprr_huperm_sh03_el21\";\n\tcase REG_SPRR_HUPERM_SH04_EL21: return \"sprr_huperm_sh04_el21\";\n\tcase REG_SPRR_HUPERM_SH05_EL21: return \"sprr_huperm_sh05_el21\";\n\tcase REG_SPRR_HUPERM_SH06_EL21: return \"sprr_huperm_sh06_el21\";\n\tcase REG_SPRR_HUPERM_SH07_EL21: return \"sprr_huperm_sh07_el21\";\n\tcase REG_SPRR_PPERM_SH01_EL1: return \"sprr_pperm_sh01_el1\";\n\tcase REG_SPRR_PPERM_SH02_EL1: return \"sprr_pperm_sh02_el1\";\n\tcase REG_SPRR_PPERM_SH03_EL1: return \"sprr_pperm_sh03_el1\";\n\tcase REG_SPRR_PPERM_SH04_EL1: return \"sprr_pperm_sh04_el1\";\n\tcase REG_SPRR_PPERM_SH05_EL1: return \"sprr_pperm_sh05_el1\";\n\tcase REG_SPRR_PPERM_SH06_EL1: return \"sprr_pperm_sh06_el1\";\n\tcase REG_SPRR_PPERM_SH07_EL1: return \"sprr_pperm_sh07_el1\";\n\tcase REG_SPRR_PPERM_SH01_EL2: return \"sprr_pperm_sh01_el2\";\n\tcase REG_SPRR_PPERM_SH02_EL2: return \"sprr_pperm_sh02_el2\";\n\tcase REG_SPRR_PPERM_SH03_EL2: return \"sprr_pperm_sh03_el2\";\n\tcase REG_SPRR_PPERM_SH04_EL2: return \"sprr_pperm_sh04_el2\";\n\tcase REG_SPRR_PPERM_SH05_EL2: return \"sprr_pperm_sh05_el2\";\n\tcase REG_SPRR_PPERM_SH06_EL2: return \"sprr_pperm_sh06_el2\";\n\tcase REG_SPRR_PPERM_SH07_EL2: return \"sprr_pperm_sh07_el2\";\n\tcase REG_SPRR_PMPRR_EL12: return \"sprr_pmprr_el12\";\n\tcase REG_SPRR_PPERM_SH01_EL12: return \"sprr_pperm_sh01_el12\";\n\tcase REG_SPRR_PPERM_SH02_EL12: return \"sprr_pperm_sh02_el12\";\n\tcase REG_SPRR_PPERM_SH03_EL12: return \"sprr_pperm_sh03_el12\";\n\tcase REG_SPRR_PPERM_SH04_EL12: return \"sprr_pperm_sh04_el12\";\n\tcase REG_SPRR_PPERM_SH05_EL12: return \"sprr_pperm_sh05_el12\";\n\tcase REG_SPRR_PPERM_SH06_EL12: return \"sprr_pperm_sh06_el12\";\n\tcase REG_SPRR_PPERM_SH07_EL12: return \"sprr_pperm_sh07_el12\";\n\tcase REG_APIAKEYLO_EL12: return \"apiakeylo_el12\";\n\tcase REG_APIAKEYHI_EL12: return \"apiakeyhi_el12\";\n\tcase REG_APIBKEYLO_EL12: return \"apibkeylo_el12\";\n\tcase REG_APIBKEYHI_EL12: return \"apibkeyhi_el12\";\n\tcase REG_APDAKEYLO_EL12: return \"apdakeylo_el12\";\n\tcase REG_APDAKEYHI_EL12: return \"apdakeyhi_el12\";\n\tcase REG_APDBKEYLO_EL12: return \"apdbkeylo_el12\";\n\tcase REG_APDBKEYHI_EL12: return \"apdbkeyhi_el12\";\n\tcase REG_CURRENTG: return \"currentg\";\n\tcase REG_GXF_ENTRY_EL1: return \"gxf_entry_el1\";\n\tcase REG_GXF_PABENTRY_EL1: return \"gxf_pabentry_el1\";\n\tcase REG_ASPSR_EL1: return \"aspsr_el1\";\n\tcase REG_ADSPSR_EL0: return \"adspsr_el0\";\n\tcase REG_PMCR1_GL2: return \"pmcr1_gl2\";\n\tcase REG_ASPSR_EL2: return \"aspsr_el2\";\n\tcase REG_PMCR1_GL1: return \"pmcr1_gl1\";\n\tcase REG_VBAR_GL12: return \"vbar_gl12\";\n\tcase REG_SPSR_GL12: return \"spsr_gl12\";\n\tcase REG_ASPSR_GL12: return \"aspsr_gl12\";\n\tcase REG_ESR_GL12: return \"esr_gl12\";\n\tcase REG_ELR_GL12: return \"elr_gl12\";\n\tcase REG_FAR_GL12: return \"far_gl12\";\n\tcase REG_SP_GL1: return \"sp_gl1\";\n\tcase REG_TPIDR_GL1: return \"tpidr_gl1\";\n\tcase REG_VBAR_GL1: return \"vbar_gl1\";\n\tcase REG_SPSR_GL1: return \"spsr_gl1\";\n\tcase REG_ASPSR_GL1: return \"aspsr_gl1\";\n\tcase REG_ESR_GL1: return \"esr_gl1\";\n\tcase REG_ELR_GL1: return \"elr_gl1\";\n\tcase REG_FAR_GL1: return \"far_gl1\";\n\tcase REG_SP_GL2: return \"sp_gl2\";\n\tcase REG_TPIDR_GL2: return \"tpidr_gl2\";\n\tcase REG_VBAR_GL2: return \"vbar_gl2\";\n\tcase REG_SPSR_GL2: return \"spsr_gl2\";\n\tcase REG_ASPSR_GL2: return \"aspsr_gl2\";\n\tcase REG_ESR_GL2: return \"esr_gl2\";\n\tcase REG_ELR_GL2: return \"elr_gl2\";\n\tcase REG_FAR_GL2: return \"far_gl2\";\n\tcase REG_GXF_ENTRY_EL2: return \"gxf_entry_el2\";\n\tcase REG_GXF_PABENTRY_EL2: return \"gxf_pabentry_el2\";\n\tcase REG_APCTL_EL2: return \"apctl_el2\";\n\tcase REG_APSTS_EL2: return \"apsts_el2\";\n\tcase REG_APSTS_EL1: return \"apsts_el1\";\n\tcase REG_KERNKEYLO_EL2: return \"kernkeylo_el2\";\n\tcase REG_KERNKEYHI_EL2: return \"kernkeyhi_el2\";\n\tcase REG_ASPSR_EL12: return \"aspsr_el12\";\n\tcase REG_APIAKEYLO_EL2: return \"apiakeylo_el2\";\n\tcase REG_APIAKEYHI_EL2: return \"apiakeyhi_el2\";\n\tcase REG_APIBKEYLO_EL2: return \"apibkeylo_el2\";\n\tcase REG_APIBKEYHI_EL2: return \"apibkeyhi_el2\";\n\tcase REG_APDAKEYLO_EL2: return \"apdakeylo_el2\";\n\tcase REG_APDAKEYHI_EL2: return \"apdakeyhi_el2\";\n\tcase REG_APDBKEYLO_EL2: return \"apdbkeylo_el2\";\n\tcase REG_APDBKEYHI_EL2: return \"apdbkeyhi_el2\";\n\tcase REG_APGAKEYLO_EL2: return \"apgakeylo_el2\";\n\tcase REG_APGAKEYHI_EL2: return \"apgakeyhi_el2\";\n\tcase REG_SPRR_CONFIG_EL2: return \"sprr_config_el2\";\n\tcase REG_SPRR_AMRANGE_EL2: return \"sprr_amrange_el2\";\n\tcase REG_VMKEYLO_EL2: return \"vmkeylo_el2\";\n\tcase REG_VMKEYHI_EL2: return \"vmkeyhi_el2\";\n\tcase REG_MMU_SFAR_EL2: return \"mmu_sfar_el2\";\n\tcase REG_APSTS_EL12: return \"apsts_el12\";\n\tcase REG_APCTL_EL12: return \"apctl_el12\";\n\tcase REG_GXF_CONFIG_EL12: return \"gxf_config_el12\";\n\tcase REG_GXF_ENTRY_EL12: return \"gxf_entry_el12\";\n\tcase REG_GXF_PABENTRY_EL12: return \"gxf_pabentry_el12\";\n\tcase REG_SPRR_CONFIG_EL12: return \"sprr_config_el12\";\n\tcase REG_SPRR_AMRANGE_EL12: return \"sprr_amrange_el12\";\n\tcase REG_MMU_SESR_CTL_EL2: return \"mmu_sesr_ctl_el2\";\n\tcase REG_SPRR_PPERM_EL12: return \"sprr_pperm_el12\";\n\tcase REG_CNTPS_TVAL_EL1: return \"cntps_tval_el1\";\n\tcase REG_CNTPS_CTL_EL1: return \"cntps_ctl_el1\";\n\tcase REG_CNTPS_CVAL_EL1: return \"cntps_cval_el1\";\n\tcase REG_PSTATE_SPSEL: return \"pstate_spsel\";\n\tcase REG_PWRDNSAVE0: return \"pwrdnsave0\";\n\tcase REG_NRG_ACC_CTL: return \"nrg_acc_ctl\";\n\tcase REG_AON_CNT0: return \"aon_cnt0\";\n\tcase REG_CPU_CNT0: return \"cpu_cnt0\";\n\tcase REG_UPMCR0_EL1: return \"upmcr0_el1\";\n\tcase REG_UPMC8: return \"upmc8\";\n\tcase REG_AON_CNT8: return \"aon_cnt8\";\n\tcase REG_PWRDNSAVE1: return \"pwrdnsave1\";\n\tcase REG_CORE_NRG_ACC_DAT: return \"core_nrg_acc_dat\";\n\tcase REG_AON_CNT_CTL0: return \"aon_cnt_ctl0\";\n\tcase REG_CPU_CNT_CTL0: return \"cpu_cnt_ctl0\";\n\tcase REG_UPMESR0_EL1: return \"upmesr0_el1\";\n\tcase REG_UPMC9: return \"upmc9\";\n\tcase REG_AON_CNT_CTL8: return \"aon_cnt_ctl8\";\n\tcase REG_ACC_PWR_DN_SAVE: return \"acc_pwr_dn_save\";\n\tcase REG_CPM_NRG_ACC_DAT: return \"cpm_nrg_acc_dat\";\n\tcase REG_AON_CNT1: return \"aon_cnt1\";\n\tcase REG_CPU_CNT1: return \"cpu_cnt1\";\n\tcase REG_UPMSWCTRL_EL1: return \"upmswctrl_el1\";\n\tcase REG_UPMC10: return \"upmc10\";\n\tcase REG_AON_CNT9: return \"aon_cnt9\";\n\tcase REG_CORE_SRM_NRG_ACC_DAT: return \"core_srm_nrg_acc_dat\";\n\tcase REG_AON_CNT_CTL1: return \"aon_cnt_ctl1\";\n\tcase REG_CPU_CNT_CTL1: return \"cpu_cnt_ctl1\";\n\tcase REG_UPMECM0_EL1: return \"upmecm0_el1\";\n\tcase REG_UPMC11: return \"upmc11\";\n\tcase REG_AON_CNT_CTL9: return \"aon_cnt_ctl9\";\n\tcase REG_AON_CNT_CTL: return \"aon_cnt_ctl\";\n\tcase REG_CPM_SRM_NRG_ACC_DAT: return \"cpm_srm_nrg_acc_dat\";\n\tcase REG_AON_CNT2: return \"aon_cnt2\";\n\tcase REG_CPU_CNT2: return \"cpu_cnt2\";\n\tcase REG_UPMECM1_EL1: return \"upmecm1_el1\";\n\tcase REG_UPMC12: return \"upmc12\";\n\tcase REG_AON_CNT10: return \"aon_cnt10\";\n\tcase REG_CPU_CNT_CTL: return \"cpu_cnt_ctl\";\n\tcase REG_AON_CNT_CTL2: return \"aon_cnt_ctl2\";\n\tcase REG_CPU_CNT_CTL2: return \"cpu_cnt_ctl2\";\n\tcase REG_UPMPCM_EL1: return \"upmpcm_el1\";\n\tcase REG_UPMC13: return \"upmc13\";\n\tcase REG_AON_CNT_CTL10: return \"aon_cnt_ctl10\";\n\tcase REG_AON_CNT3: return \"aon_cnt3\";\n\tcase REG_CPU_CNT3: return \"cpu_cnt3\";\n\tcase REG_UPMSR_EL1: return \"upmsr_el1\";\n\tcase REG_UPMC14: return \"upmc14\";\n\tcase REG_AON_CNT11: return \"aon_cnt11\";\n\tcase REG_AON_CNT_CTL3: return \"aon_cnt_ctl3\";\n\tcase REG_CPU_CNT_CTL3: return \"cpu_cnt_ctl3\";\n\tcase REG_UPMC0: return \"upmc0\";\n\tcase REG_UPMC15: return \"upmc15\";\n\tcase REG_AON_CNT_CTL11: return \"aon_cnt_ctl11\";\n\tcase REG_AON_CNT4: return \"aon_cnt4\";\n\tcase REG_CPU_CNT4: return \"cpu_cnt4\";\n\tcase REG_UPMC1: return \"upmc1\";\n\tcase REG_UPMECM2_EL1: return \"upmecm2_el1\";\n\tcase REG_AON_CNT_CTL4: return \"aon_cnt_ctl4\";\n\tcase REG_CPU_CNT_CTL4: return \"cpu_cnt_ctl4\";\n\tcase REG_UPMC2: return \"upmc2\";\n\tcase REG_UPMECM3_EL1: return \"upmecm3_el1\";\n\tcase REG_AON_CNT5: return \"aon_cnt5\";\n\tcase REG_CPU_CNT5: return \"cpu_cnt5\";\n\tcase REG_UPMC3: return \"upmc3\";\n\tcase REG_UPMCR1_EL1: return \"upmcr1_el1\";\n\tcase REG_AON_CNT_CTL5: return \"aon_cnt_ctl5\";\n\tcase REG_CPU_CNT_CTL5: return \"cpu_cnt_ctl5\";\n\tcase REG_UPMC4: return \"upmc4\";\n\tcase REG_UPMESR1_EL1: return \"upmesr1_el1\";\n\tcase REG_AON_CNT6: return \"aon_cnt6\";\n\tcase REG_CPU_CNT6: return \"cpu_cnt6\";\n\tcase REG_UPMC5: return \"upmc5\";\n\tcase REG_AON_CNT_CTL6: return \"aon_cnt_ctl6\";\n\tcase REG_CPU_CNT_CTL6: return \"cpu_cnt_ctl6\";\n\tcase REG_UPMC6: return \"upmc6\";\n\tcase REG_AON_CNT7: return \"aon_cnt7\";\n\tcase REG_CPU_CNT7: return \"cpu_cnt7\";\n\tcase REG_UPMC7: return \"upmc7\";\n\tcase REG_AON_CNT_CTL7: return \"aon_cnt_ctl7\";\n\tcase REG_CPU_CNT_CTL7: return \"cpu_cnt_ctl7\";\n\tdefault: return \"\";\n\t}\n}\n\nconst char *get_system_register_name_decomposed(int op0, int op1, int CRn, int CRm, int op2)\n{\n\tenum SystemReg sr = (enum SystemReg)((op0<<14)|(op1<<11)|(CRn<<7)|(CRm<<3)|op2);\n\treturn get_system_register_name(sr);\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs_fmt_gen.h",
    "content": "/* GENERATED FILE - DO NOT MODIFY - SUBMIT GITHUB ISSUE IF PROBLEM FOUND */\n#pragma once\n\n#include \"sysregs_gen.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nconst char *get_system_register_name(enum SystemReg);\nconst char *get_system_register_name_decomposed(int op0, int op1, int CRn, int CRm, int op2);\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs_gen.c",
    "content": "/* GENERATED FILE - DO NOT MODIFY - SUBMIT GITHUB ISSUE IF PROBLEM FOUND */\n\n#include <stddef.h>\n\n#include \"sysregs_gen.h\"\n\n/* must parallel has_system_register_name() from the decode side */\nbool has_system_register_name(enum SystemReg sr)\n{\n\tswitch(sr)\n\t{\n\tcase REG_EDSCR:\n\tcase REG_EDPRCR:\n\tcase REG_UAOIMM:\n\tcase REG_PANIMM:\n\tcase REG_SPSELIMM:\n\tcase REG_DITIMM:\n\tcase REG_SVCRIMM:\n\tcase REG_ICIALLUIS:\n\tcase REG_ICIALLU:\n\tcase REG_DCIVAC:\n\tcase REG_DCISW:\n\tcase REG_ATS1E1R:\n\tcase REG_ATS1E1W:\n\tcase REG_ATS1E0R:\n\tcase REG_ATS1E0W:\n\tcase REG_DCCSW:\n\tcase REG_DCCISW:\n\tcase REG_TLBIVMALLE1IS:\n\tcase REG_TLBIVAE1IS:\n\tcase REG_TLBIASIDE1IS:\n\tcase REG_TLBIVAAE1IS:\n\tcase REG_TLBIVALE1IS:\n\tcase REG_TLBIVAALE1IS:\n\tcase REG_TLBIVMALLE1:\n\tcase REG_TLBIVAE1:\n\tcase REG_TLBIASIDE1:\n\tcase REG_TLBIVAAE1:\n\tcase REG_TLBIVALE1:\n\tcase REG_TLBIVAALE1:\n\tcase REG_DCZVA:\n\tcase REG_ICIVAU:\n\tcase REG_DCCVAC:\n\tcase REG_DCCVAU:\n\tcase REG_DCCIVAC:\n\tcase REG_ATS1E2R:\n\tcase REG_ATS1E2W:\n\tcase REG_ATS12E1R:\n\tcase REG_ATS12E1W:\n\tcase REG_ATS12E0R:\n\tcase REG_ATS12E0W:\n\tcase REG_TLBIIPAS2E1IS:\n\tcase REG_TLBIIPAS2LE1IS:\n\tcase REG_TLBIALLE2IS:\n\tcase REG_TLBIVAE2IS:\n\tcase REG_TLBIALLE1IS:\n\tcase REG_TLBIVALE2IS:\n\tcase REG_TLBIVMALLS12E1IS:\n\tcase REG_TLBIIPAS2E1:\n\tcase REG_TLBIIPAS2LE1:\n\tcase REG_TLBIALLE2:\n\tcase REG_TLBIVAE2:\n\tcase REG_TLBIALLE1:\n\tcase REG_TLBIVALE2:\n\tcase REG_TLBIVMALLS12E1:\n\tcase REG_ATS1E3R:\n\tcase REG_ATS1E3W:\n\tcase REG_TLBIALLE3IS:\n\tcase REG_TLBIVAE3IS:\n\tcase REG_TLBIVALE3IS:\n\tcase REG_TLBIALLE3:\n\tcase REG_TLBIVAE3:\n\tcase REG_TLBIVALE3:\n\tcase REG_OSDTRRX_EL1:\n\tcase REG_DBGBVR0_EL1:\n\tcase REG_DBGBCR0_EL1:\n\tcase REG_DBGWVR0_EL1:\n\tcase REG_DBGWCR0_EL1:\n\tcase REG_DBGBVR1_EL1:\n\tcase REG_DBGBCR1_EL1:\n\tcase REG_DBGWVR1_EL1:\n\tcase REG_DBGWCR1_EL1:\n\tcase REG_MDCCINT_EL1:\n\tcase REG_MDSCR_EL1:\n\tcase REG_DBGBVR2_EL1:\n\tcase REG_DBGBCR2_EL1:\n\tcase REG_DBGWVR2_EL1:\n\tcase REG_DBGWCR2_EL1:\n\tcase REG_OSDTRTX_EL1:\n\tcase REG_DBGBVR3_EL1:\n\tcase REG_DBGBCR3_EL1:\n\tcase REG_DBGWVR3_EL1:\n\tcase REG_DBGWCR3_EL1:\n\tcase REG_DBGBVR4_EL1:\n\tcase REG_DBGBCR4_EL1:\n\tcase REG_DBGWVR4_EL1:\n\tcase REG_DBGWCR4_EL1:\n\tcase REG_DBGBVR5_EL1:\n\tcase REG_DBGBCR5_EL1:\n\tcase REG_DBGWVR5_EL1:\n\tcase REG_DBGWCR5_EL1:\n\tcase REG_DBGWFAR:\n\tcase REG_OSECCR_EL1:\n\tcase REG_DBGBVR6_EL1:\n\tcase REG_DBGBCR6_EL1:\n\tcase REG_DBGWVR6_EL1:\n\tcase REG_DBGWCR6_EL1:\n\tcase REG_DBGBVR7_EL1:\n\tcase REG_DBGBCR7_EL1:\n\tcase REG_DBGWVR7_EL1:\n\tcase REG_DBGWCR7_EL1:\n\tcase REG_DBGBVR8_EL1:\n\tcase REG_DBGBCR8_EL1:\n\tcase REG_DBGWVR8_EL1:\n\tcase REG_DBGWCR8_EL1:\n\tcase REG_DBGBVR9_EL1:\n\tcase REG_DBGBCR9_EL1:\n\tcase REG_DBGWVR9_EL1:\n\tcase REG_DBGWCR9_EL1:\n\tcase REG_DBGBVR10_EL1:\n\tcase REG_DBGBCR10_EL1:\n\tcase REG_DBGWVR10_EL1:\n\tcase REG_DBGWCR10_EL1:\n\tcase REG_DBGBVR11_EL1:\n\tcase REG_DBGBCR11_EL1:\n\tcase REG_DBGWVR11_EL1:\n\tcase REG_DBGWCR11_EL1:\n\tcase REG_DBGBVR12_EL1:\n\tcase REG_DBGBCR12_EL1:\n\tcase REG_DBGWVR12_EL1:\n\tcase REG_DBGWCR12_EL1:\n\tcase REG_DBGBVR13_EL1:\n\tcase REG_DBGBCR13_EL1:\n\tcase REG_DBGWVR13_EL1:\n\tcase REG_DBGWCR13_EL1:\n\tcase REG_DBGBVR14_EL1:\n\tcase REG_DBGBCR14_EL1:\n\tcase REG_DBGWVR14_EL1:\n\tcase REG_DBGWCR14_EL1:\n\tcase REG_DBGBVR15_EL1:\n\tcase REG_DBGBCR15_EL1:\n\tcase REG_DBGWVR15_EL1:\n\tcase REG_DBGWCR15_EL1:\n\tcase REG_MDRAR_EL1:\n\tcase REG_OSLAR_EL1:\n\tcase REG_OSLSR_EL1:\n\tcase REG_OSDLR_EL1:\n\tcase REG_DBGPRCR_EL1:\n\tcase REG_DBGCLAIMSET_EL1:\n\tcase REG_DBGCLAIMCLR_EL1:\n\tcase REG_DBGAUTHSTAT_EL1:\n\tcase REG_TRCTRACEIDR:\n\tcase REG_TRCVICTLR:\n\tcase REG_TRCSEQEVR0:\n\tcase REG_TRCCNTRLDVR0:\n\tcase REG_TRCIMSPEC0:\n\tcase REG_TRCPRGCTLR:\n\tcase REG_TRCQCTLR:\n\tcase REG_TRCVIIECTLR:\n\tcase REG_TRCSEQEVR1:\n\tcase REG_TRCCNTRLDVR1:\n\tcase REG_TRCIMSPEC1:\n\tcase REG_TRCPROCSELR:\n\tcase REG_TRCVISSCTLR:\n\tcase REG_TRCSEQEVR2:\n\tcase REG_TRCCNTRLDVR2:\n\tcase REG_TRCIMSPEC2:\n\tcase REG_TRCVIPCSSCTLR:\n\tcase REG_TRCCNTRLDVR3:\n\tcase REG_TRCIMSPEC3:\n\tcase REG_TRCCONFIGR:\n\tcase REG_TRCCNTCTLR0:\n\tcase REG_TRCIMSPEC4:\n\tcase REG_TRCCNTCTLR1:\n\tcase REG_TRCIMSPEC5:\n\tcase REG_TRCAUXCTLR:\n\tcase REG_TRCSEQRSTEVR:\n\tcase REG_TRCCNTCTLR2:\n\tcase REG_TRCIMSPEC6:\n\tcase REG_TRCSEQSTR:\n\tcase REG_TRCCNTCTLR3:\n\tcase REG_TRCIMSPEC7:\n\tcase REG_TRCEVENTCTL0R:\n\tcase REG_TRCVDCTLR:\n\tcase REG_TRCEXTINSELR:\n\tcase REG_TRCCNTVR0:\n\tcase REG_TRCEVENTCTL1R:\n\tcase REG_TRCVDSACCTLR:\n\tcase REG_TRCEXTINSELR1:\n\tcase REG_TRCCNTVR1:\n\tcase REG_TRCRSR:\n\tcase REG_TRCVDARCCTLR:\n\tcase REG_TRCEXTINSELR2:\n\tcase REG_TRCCNTVR2:\n\tcase REG_TRCSTALLCTLR:\n\tcase REG_TRCEXTINSELR3:\n\tcase REG_TRCCNTVR3:\n\tcase REG_TRCTSCTLR:\n\tcase REG_TRCSYNCPR:\n\tcase REG_TRCCCCTLR:\n\tcase REG_TRCBBCTLR:\n\tcase REG_TRCRSCTLR16:\n\tcase REG_TRCSSCCR0:\n\tcase REG_TRCSSPCICR0:\n\tcase REG_TRCOSLAR:\n\tcase REG_TRCRSCTLR17:\n\tcase REG_TRCSSCCR1:\n\tcase REG_TRCSSPCICR1:\n\tcase REG_TRCRSCTLR2:\n\tcase REG_TRCRSCTLR18:\n\tcase REG_TRCSSCCR2:\n\tcase REG_TRCSSPCICR2:\n\tcase REG_TRCRSCTLR3:\n\tcase REG_TRCRSCTLR19:\n\tcase REG_TRCSSCCR3:\n\tcase REG_TRCSSPCICR3:\n\tcase REG_TRCRSCTLR4:\n\tcase REG_TRCRSCTLR20:\n\tcase REG_TRCSSCCR4:\n\tcase REG_TRCSSPCICR4:\n\tcase REG_TRCPDCR:\n\tcase REG_TRCRSCTLR5:\n\tcase REG_TRCRSCTLR21:\n\tcase REG_TRCSSCCR5:\n\tcase REG_TRCSSPCICR5:\n\tcase REG_TRCRSCTLR6:\n\tcase REG_TRCRSCTLR22:\n\tcase REG_TRCSSCCR6:\n\tcase REG_TRCSSPCICR6:\n\tcase REG_TRCRSCTLR7:\n\tcase REG_TRCRSCTLR23:\n\tcase REG_TRCSSCCR7:\n\tcase REG_TRCSSPCICR7:\n\tcase REG_TRCRSCTLR8:\n\tcase REG_TRCRSCTLR24:\n\tcase REG_TRCSSCSR0:\n\tcase REG_TRCRSCTLR9:\n\tcase REG_TRCRSCTLR25:\n\tcase REG_TRCSSCSR1:\n\tcase REG_TRCRSCTLR10:\n\tcase REG_TRCRSCTLR26:\n\tcase REG_TRCSSCSR2:\n\tcase REG_TRCRSCTLR11:\n\tcase REG_TRCRSCTLR27:\n\tcase REG_TRCSSCSR3:\n\tcase REG_TRCRSCTLR12:\n\tcase REG_TRCRSCTLR28:\n\tcase REG_TRCSSCSR4:\n\tcase REG_TRCRSCTLR13:\n\tcase REG_TRCRSCTLR29:\n\tcase REG_TRCSSCSR5:\n\tcase REG_TRCRSCTLR14:\n\tcase REG_TRCRSCTLR30:\n\tcase REG_TRCSSCSR6:\n\tcase REG_TRCRSCTLR15:\n\tcase REG_TRCRSCTLR31:\n\tcase REG_TRCSSCSR7:\n\tcase REG_TRCACVR0:\n\tcase REG_TRCACVR8:\n\tcase REG_TRCACATR0:\n\tcase REG_TRCACATR8:\n\tcase REG_TRCDVCVR0:\n\tcase REG_TRCDVCVR4:\n\tcase REG_TRCDVCMR0:\n\tcase REG_TRCDVCMR4:\n\tcase REG_TRCACVR1:\n\tcase REG_TRCACVR9:\n\tcase REG_TRCACATR1:\n\tcase REG_TRCACATR9:\n\tcase REG_TRCACVR2:\n\tcase REG_TRCACVR10:\n\tcase REG_TRCACATR2:\n\tcase REG_TRCACATR10:\n\tcase REG_TRCDVCVR1:\n\tcase REG_TRCDVCVR5:\n\tcase REG_TRCDVCMR1:\n\tcase REG_TRCDVCMR5:\n\tcase REG_TRCACVR3:\n\tcase REG_TRCACVR11:\n\tcase REG_TRCACATR3:\n\tcase REG_TRCACATR11:\n\tcase REG_TRCACVR4:\n\tcase REG_TRCACVR12:\n\tcase REG_TRCACATR4:\n\tcase REG_TRCACATR12:\n\tcase REG_TRCDVCVR2:\n\tcase REG_TRCDVCVR6:\n\tcase REG_TRCDVCMR2:\n\tcase REG_TRCDVCMR6:\n\tcase REG_TRCACVR5:\n\tcase REG_TRCACVR13:\n\tcase REG_TRCACATR5:\n\tcase REG_TRCACATR13:\n\tcase REG_TRCACVR6:\n\tcase REG_TRCACVR14:\n\tcase REG_TRCACATR6:\n\tcase REG_TRCACATR14:\n\tcase REG_TRCDVCVR3:\n\tcase REG_TRCDVCVR7:\n\tcase REG_TRCDVCMR3:\n\tcase REG_TRCDVCMR7:\n\tcase REG_TRCACVR7:\n\tcase REG_TRCACVR15:\n\tcase REG_TRCACATR7:\n\tcase REG_TRCACATR15:\n\tcase REG_TRCCIDCVR0:\n\tcase REG_TRCVMIDCVR0:\n\tcase REG_TRCCIDCCTLR0:\n\tcase REG_TRCCIDCCTLR1:\n\tcase REG_TRCCIDCVR1:\n\tcase REG_TRCVMIDCVR1:\n\tcase REG_TRCVMIDCCTLR0:\n\tcase REG_TRCVMIDCCTLR1:\n\tcase REG_TRCCIDCVR2:\n\tcase REG_TRCVMIDCVR2:\n\tcase REG_TRCCIDCVR3:\n\tcase REG_TRCVMIDCVR3:\n\tcase REG_TRCCIDCVR4:\n\tcase REG_TRCVMIDCVR4:\n\tcase REG_TRCCIDCVR5:\n\tcase REG_TRCVMIDCVR5:\n\tcase REG_TRCCIDCVR6:\n\tcase REG_TRCVMIDCVR6:\n\tcase REG_TRCCIDCVR7:\n\tcase REG_TRCVMIDCVR7:\n\tcase REG_TRCITCTRL:\n\tcase REG_TRCCLAIMSET:\n\tcase REG_TRCCLAIMCLR:\n\tcase REG_TRCLAR:\n\tcase REG_TEECR32_EL1:\n\tcase REG_TEEHBR32_EL1:\n\tcase REG_MDCCSR_EL0:\n\tcase REG_DBGDTR_EL0:\n\tcase REG_DBGDTRRX_EL0:\n\tcase REG_DBGVCR32_EL2:\n\tcase REG_MIDR_EL1:\n\tcase REG_MPIDR_EL1:\n\tcase REG_REVIDR_EL1:\n\tcase REG_ID_PFR0_EL1:\n\tcase REG_ID_PFR1_EL1:\n\tcase REG_ID_DFR0_EL1:\n\tcase REG_ID_AFR0_EL1:\n\tcase REG_ID_MMFR0_EL1:\n\tcase REG_ID_MMFR1_EL1:\n\tcase REG_ID_MMFR2_EL1:\n\tcase REG_ID_MMFR3_EL1:\n\tcase REG_ID_ISAR0_EL1:\n\tcase REG_ID_ISAR1_EL1:\n\tcase REG_ID_ISAR2_EL1:\n\tcase REG_ID_ISAR3_EL1:\n\tcase REG_ID_ISAR4_EL1:\n\tcase REG_ID_ISAR5_EL1:\n\tcase REG_ID_MMFR4_EL1:\n\tcase REG_ID_ISAR6_EL1:\n\tcase REG_MVFR0_EL1:\n\tcase REG_MVFR1_EL1:\n\tcase REG_MVFR2_EL1:\n\tcase REG_ID_AA32RES3_EL1:\n\tcase REG_ID_PFR2_EL1:\n\tcase REG_ID_AA32RES5_EL1:\n\tcase REG_ID_AA32RES6_EL1:\n\tcase REG_ID_AA32RES7_EL1:\n\tcase REG_ID_AA64PFR0_EL1:\n\tcase REG_ID_AA64PFR1_EL1:\n\tcase REG_ID_AA64PFR2_EL1:\n\tcase REG_ID_AA64PFR3_EL1:\n\tcase REG_ID_AA64ZFR0_EL1:\n\tcase REG_ID_AA64SMFR0_EL1:\n\tcase REG_ID_AA64ZFR2_EL1:\n\tcase REG_ID_AA64ZFR3_EL1:\n\tcase REG_ID_AA64DFR0_EL1:\n\tcase REG_ID_AA64DFR1_EL1:\n\tcase REG_ID_AA64DFR2_EL1:\n\tcase REG_ID_AA64DFR3_EL1:\n\tcase REG_ID_AA64AFR0_EL1:\n\tcase REG_ID_AA64AFR1_EL1:\n\tcase REG_ID_AA64AFR2_EL1:\n\tcase REG_ID_AA64AFR3_EL1:\n\tcase REG_ID_AA64ISAR0_EL1:\n\tcase REG_ID_AA64ISAR1_EL1:\n\tcase REG_ID_AA64ISAR2_EL1:\n\tcase REG_ID_AA64ISAR3_EL1:\n\tcase REG_ID_AA64ISAR4_EL1:\n\tcase REG_ID_AA64ISAR5_EL1:\n\tcase REG_ID_AA64ISAR6_EL1:\n\tcase REG_ID_AA64ISAR7_EL1:\n\tcase REG_ID_AA64MMFR0_EL1:\n\tcase REG_ID_AA64MMFR1_EL1:\n\tcase REG_ID_AA64MMFR2_EL1:\n\tcase REG_ID_AA64MMFR3_EL1:\n\tcase REG_ID_AA64MMFR4_EL1:\n\tcase REG_ID_AA64MMFR5_EL1:\n\tcase REG_ID_AA64MMFR6_EL1:\n\tcase REG_ID_AA64MMFR7_EL1:\n\tcase REG_SCTLR_EL1:\n\tcase REG_ACTLR_EL1:\n\tcase REG_CPACR_EL1:\n\tcase REG_RGSR_EL1:\n\tcase REG_GCR_EL1:\n\tcase REG_TRFCR_EL1:\n\tcase REG_SMPRI_EL1:\n\tcase REG_SMCR_EL1:\n\tcase REG_TTBR0_EL1:\n\tcase REG_TTBR1_EL1:\n\tcase REG_TCR_EL1:\n\tcase REG_APIAKEYLO_EL1:\n\tcase REG_APIAKEYHI_EL1:\n\tcase REG_APIBKEYLO_EL1:\n\tcase REG_APIBKEYHI_EL1:\n\tcase REG_APDAKEYLO_EL1:\n\tcase REG_APDAKEYHI_EL1:\n\tcase REG_APDBKEYLO_EL1:\n\tcase REG_APDBKEYHI_EL1:\n\tcase REG_APGAKEYLO_EL1:\n\tcase REG_APGAKEYHI_EL1:\n\tcase REG_SPSR_EL1:\n\tcase REG_ELR_EL1:\n\tcase REG_SP_EL0:\n\tcase REG_SPSEL:\n\tcase REG_CURRENTEL:\n\tcase REG_PAN:\n\tcase REG_UAO:\n\tcase REG_ICV_PMR_EL1:\n\tcase REG_AFSR0_EL1:\n\tcase REG_AFSR1_EL1:\n\tcase REG_ESR_EL1:\n\tcase REG_ERRIDR_EL1:\n\tcase REG_ERRSELR_EL1:\n\tcase REG_ERXCTLR_EL1:\n\tcase REG_ERXSTATUS_EL1:\n\tcase REG_ERXADDR_EL1:\n\tcase REG_ERXPFGCTL_EL1:\n\tcase REG_ERXPFGCDN_EL1:\n\tcase REG_ERXMISC0_EL1:\n\tcase REG_ERXMISC1_EL1:\n\tcase REG_ERXMISC2_EL1:\n\tcase REG_ERXMISC3_EL1:\n\tcase REG_ERXTS_EL1:\n\tcase REG_TFSR_EL1:\n\tcase REG_TFSRE0_EL1:\n\tcase REG_FAR_EL1:\n\tcase REG_PAR_EL1:\n\tcase REG_PMSCR_EL1:\n\tcase REG_PMSICR_EL1:\n\tcase REG_PMSIRR_EL1:\n\tcase REG_PMSFCR_EL1:\n\tcase REG_PMSEVFR_EL1:\n\tcase REG_PMSLATFR_EL1:\n\tcase REG_PMSIDR_EL1:\n\tcase REG_PMBLIMITR_EL1:\n\tcase REG_PMBPTR_EL1:\n\tcase REG_PMBSR_EL1:\n\tcase REG_PMBIDR_EL1:\n\tcase REG_TRBLIMITR_EL1:\n\tcase REG_TRBPTR_EL1:\n\tcase REG_TRBBASER_EL1:\n\tcase REG_TRBSR_EL1:\n\tcase REG_TRBMAR_EL1:\n\tcase REG_TRBTRG_EL1:\n\tcase REG_PMINTENSET_EL1:\n\tcase REG_PMINTENCLR_EL1:\n\tcase REG_PMMIR_EL1:\n\tcase REG_MAIR_EL1:\n\tcase REG_AMAIR_EL1:\n\tcase REG_LORSA_EL1:\n\tcase REG_LOREA_EL1:\n\tcase REG_LORN_EL1:\n\tcase REG_LORC_EL1:\n\tcase REG_LORID_EL1:\n\tcase REG_MPAM1_EL1:\n\tcase REG_MPAM0_EL1:\n\tcase REG_CTRR_C_LWR_EL1:\n\tcase REG_CTRR_C_UPR_EL1:\n\tcase REG_CTRR_D_LWR_EL1:\n\tcase REG_CTRR_D_UPR_EL1:\n\tcase REG_CTRR_C_LWR_EL12:\n\tcase REG_CTRR_C_UPR_EL12:\n\tcase REG_CTRR_D_LWR_EL12:\n\tcase REG_CTRR_D_UPR_EL12:\n\tcase REG_CTRR_C_LWR_EL2:\n\tcase REG_CTRR_C_UPR_EL2:\n\tcase REG_CTRR_D_LWR_EL2:\n\tcase REG_CTRR_D_UPR_EL2:\n\tcase REG_CTRR_C_CTL_EL1:\n\tcase REG_CTRR_D_CTL_EL1:\n\tcase REG_CTRR_C_CTL_EL12:\n\tcase REG_CTRR_D_CTL_EL12:\n\tcase REG_CTRR_C_CTL_EL2:\n\tcase REG_CTRR_D_CTL_EL2:\n\tcase REG_CTXR_A_LWR_EL1:\n\tcase REG_CTXR_A_UPR_EL1:\n\tcase REG_CTXR_B_LWR_EL1:\n\tcase REG_CTXR_B_UPR_EL1:\n\tcase REG_CTXR_C_LWR_EL1:\n\tcase REG_CTXR_C_UPR_EL1:\n\tcase REG_CTXR_D_LWR_EL1:\n\tcase REG_CTXR_D_UPR_EL1:\n\tcase REG_CTXR_A_LWR_EL12:\n\tcase REG_CTXR_A_UPR_EL12:\n\tcase REG_CTXR_B_LWR_EL12:\n\tcase REG_CTXR_B_UPR_EL12:\n\tcase REG_CTXR_C_LWR_EL12:\n\tcase REG_CTXR_C_UPR_EL12:\n\tcase REG_CTXR_D_LWR_EL12:\n\tcase REG_CTXR_D_UPR_EL12:\n\tcase REG_CTXR_A_LWR_EL2:\n\tcase REG_CTXR_A_UPR_EL2:\n\tcase REG_CTXR_B_LWR_EL2:\n\tcase REG_CTXR_B_UPR_EL2:\n\tcase REG_CTXR_C_LWR_EL2:\n\tcase REG_CTXR_C_UPR_EL2:\n\tcase REG_CTXR_D_LWR_EL2:\n\tcase REG_CTXR_D_UPR_EL2:\n\tcase REG_CTXR_A_CTL_EL1:\n\tcase REG_CTXR_B_CTL_EL1:\n\tcase REG_CTXR_C_CTL_EL1:\n\tcase REG_CTXR_D_CTL_EL1:\n\tcase REG_CTXR_A_CTL_EL12:\n\tcase REG_CTXR_B_CTL_EL12:\n\tcase REG_CTXR_C_CTL_EL12:\n\tcase REG_CTXR_D_CTL_EL12:\n\tcase REG_CTXR_A_CTL_EL2:\n\tcase REG_CTXR_B_CTL_EL2:\n\tcase REG_CTXR_C_CTL_EL2:\n\tcase REG_CTXR_D_CTL_EL2:\n\tcase REG_ACC_CTRR_C_LWR_EL2:\n\tcase REG_ACC_CTRR_C_UPR_EL2:\n\tcase REG_ACC_CTRR_D_LWR_EL2:\n\tcase REG_ACC_CTRR_D_UPR_EL2:\n\tcase REG_ACC_CTXR_A_LWR_EL2:\n\tcase REG_ACC_CTXR_A_UPR_EL2:\n\tcase REG_ACC_CTXR_B_LWR_EL2:\n\tcase REG_ACC_CTXR_B_UPR_EL2:\n\tcase REG_ACC_CTXR_C_LWR_EL2:\n\tcase REG_ACC_CTXR_C_UPR_EL2:\n\tcase REG_ACC_CTXR_D_LWR_EL2:\n\tcase REG_ACC_CTXR_D_UPR_EL2:\n\tcase REG_ACC_CTRR_C_CTL_EL2:\n\tcase REG_ACC_CTRR_D_CTL_EL2:\n\tcase REG_ACC_CTXR_A_CTL_EL2:\n\tcase REG_ACC_CTXR_B_CTL_EL2:\n\tcase REG_ACC_CTXR_C_CTL_EL2:\n\tcase REG_ACC_CTXR_D_CTL_EL2:\n\tcase REG_VBAR_EL1:\n\tcase REG_RVBAR_EL1:\n\tcase REG_RMR_EL1:\n\tcase REG_ISR_EL1:\n\tcase REG_DISR_EL1:\n\tcase REG_ICV_IAR0_EL1:\n\tcase REG_ICV_EOIR0_EL1:\n\tcase REG_ICV_HPPIR0_EL1:\n\tcase REG_ICV_BPR0_EL1:\n\tcase REG_ICC_AP0R0_EL1:\n\tcase REG_ICC_AP0R1_EL1:\n\tcase REG_ICC_AP0R2_EL1:\n\tcase REG_ICC_AP0R3_EL1:\n\tcase REG_ICC_AP1R0_EL1:\n\tcase REG_ICC_AP1R1_EL1:\n\tcase REG_ICC_AP1R2_EL1:\n\tcase REG_ICC_AP1R3_EL1:\n\tcase REG_ICV_DIR_EL1:\n\tcase REG_ICV_RPR_EL1:\n\tcase REG_ICC_SGI1R_EL1:\n\tcase REG_ICC_ASGI1R_EL1:\n\tcase REG_ICC_SGI0R_EL1:\n\tcase REG_ICV_IAR1_EL1:\n\tcase REG_ICV_EOIR1_EL1:\n\tcase REG_ICV_HPPIR1_EL1:\n\tcase REG_ICV_BPR1CBPR_EL1:\n\tcase REG_ICV_CTLR_EL1:\n\tcase REG_ICC_SRE_EL1:\n\tcase REG_ICV_IGRPEN0_EL1:\n\tcase REG_ICV_IGRPEN1_EL1:\n\tcase REG_ICC_SEIEN_EL1:\n\tcase REG_CONTEXTIDR_EL1:\n\tcase REG_TPIDR_EL1:\n\tcase REG_SCXTNUM_EL1:\n\tcase REG_CNTHCTL_EL21:\n\tcase REG_HID0:\n\tcase REG_HID25:\n\tcase REG_HID26:\n\tcase REG_HID27:\n\tcase REG_HID28:\n\tcase REG_HID29:\n\tcase REG_HID34:\n\tcase REG_HID1:\n\tcase REG_HID21:\n\tcase REG_BIUVCSCUPCMDCRD:\n\tcase REG_BIUVCSCUPDATCRD:\n\tcase REG_HID2:\n\tcase REG_HID30:\n\tcase REG_HID31:\n\tcase REG_HID32:\n\tcase REG_HID33:\n\tcase REG_HID3:\n\tcase REG_BIUVCSCUPCMDCRDC2:\n\tcase REG_BIUVCSCUPDATCRDC2:\n\tcase REG_HID4:\n\tcase REG_HID5:\n\tcase REG_HID6:\n\tcase REG_HID7:\n\tcase REG_HID8:\n\tcase REG_HID9:\n\tcase REG_HID10:\n\tcase REG_BLOCK_CMAINT_CFG:\n\tcase REG_HID11:\n\tcase REG_HID18:\n\tcase REG_HID36:\n\tcase REG_HID37:\n\tcase REG_HID12:\n\tcase REG_HID15:\n\tcase REG_HID19:\n\tcase REG_BIU_TLIMIT:\n\tcase REG_HID13:\n\tcase REG_HID_RCTX_G0CTL:\n\tcase REG_HID_RCTX_G1CTL:\n\tcase REG_HID14:\n\tcase REG_HID16:\n\tcase REG_LLC_WRR2:\n\tcase REG_BIU_AFI_CFG:\n\tcase REG_HID17:\n\tcase REG_HID24:\n\tcase REG_HID35:\n\tcase REG_CCSIDR_EL1:\n\tcase REG_CLIDR_EL1:\n\tcase REG_SMIDR_EL1:\n\tcase REG_AIDR_EL1:\n\tcase REG_PMCR0_EL1:\n\tcase REG_APPL_CONTEXTPTR:\n\tcase REG_LD_LATPROF_CTL_EL1:\n\tcase REG_AON_CPU_MSTALL_CTL01_EL1:\n\tcase REG_PM_MEMFLT_CTL23_EL1:\n\tcase REG_AGTCNTHV_CTL_EL21:\n\tcase REG_AGTCNTVCTSS_NOREDIR_EL0:\n\tcase REG_PMCR1_EL1:\n\tcase REG_LD_LATPROF_CTR_EL1:\n\tcase REG_AON_CPU_MSTALL_CTL23_EL1:\n\tcase REG_PM_MEMFLT_CTL45_EL1:\n\tcase REG_AGTCNTRDIR_EL1:\n\tcase REG_AGTCNTHCTL_NOREDIR_EL21:\n\tcase REG_PMCR2_EL1:\n\tcase REG_LD_LATPROF_STS_EL1:\n\tcase REG_AON_CPU_MSTALL_CTL45_EL1:\n\tcase REG_AGTCNTHP_CVAL_EL2:\n\tcase REG_CNTVCT_NOREDIR_EL0:\n\tcase REG_AGTCNTHP_CVAL_NOREDIR_EL21:\n\tcase REG_PMCR3_EL1:\n\tcase REG_LD_LATPROF_INF_EL1:\n\tcase REG_AON_CPU_MSTALL_CTL67_EL1:\n\tcase REG_AGTCNTHP_TVAL_EL2:\n\tcase REG_CNTPCTSS_NOREDIR_EL0:\n\tcase REG_AGTCNTHP_TVAL_NOREDIR_EL21:\n\tcase REG_PMCR4_EL1:\n\tcase REG_LD_LATPROF_CTL_EL2:\n\tcase REG_AON_CPU_MEMFLT_CTL01_EL1:\n\tcase REG_AGTCNTHP_CTL_EL2:\n\tcase REG_CNTVCTSS_NOREDIR_EL0:\n\tcase REG_AGTCNTHP_CTL_NOREDIR_EL21:\n\tcase REG_PMESR0_EL1:\n\tcase REG_LD_LATPROF_CMD_EL1:\n\tcase REG_AON_CPU_MEMFLT_CTL23_EL1:\n\tcase REG_AGTCNTHV_CVAL_EL2:\n\tcase REG_AGTCNTHV_CVAL_NOREDIR_EL21:\n\tcase REG_PMESR1_EL1:\n\tcase REG_PMCR1_EL2:\n\tcase REG_AON_CPU_MEMFLT_CTL45_EL1:\n\tcase REG_AGTCNTHV_TVAL_EL2:\n\tcase REG_CNTHCTL_NOREDIR_EL21:\n\tcase REG_AGTCNTHV_TVAL_NOREDIR_EL21:\n\tcase REG_OPMAT0_EL1:\n\tcase REG_PMCR1_EL12:\n\tcase REG_AON_CPU_MEMFLT_CTL67_EL1:\n\tcase REG_AGTCNTHV_CTL_EL2:\n\tcase REG_CNTHP_CVAL_NOREDIR_EL21:\n\tcase REG_AGTCNTHV_CTL_NOREDIR_EL21:\n\tcase REG_OPMAT1_EL1:\n\tcase REG_PMCR1_GL12:\n\tcase REG_AON_CPU_MSTALL_CTR0_EL1:\n\tcase REG_AGTCNTFRQ_EL0:\n\tcase REG_CNTHP_TVAL_NOREDIR_EL21:\n\tcase REG_CNTPCT_NOREDIR_EL0:\n\tcase REG_OPMSK0_EL1:\n\tcase REG_LD_LATPROF_CTL_EL12:\n\tcase REG_AON_CPU_MSTALL_CTR1_EL1:\n\tcase REG_AGTCNTVOFF_EL2:\n\tcase REG_CNTHP_CTL_NOREDIR_EL21:\n\tcase REG_CNTHV_CTL_NOREDIR_EL21:\n\tcase REG_OPMSK1_EL1:\n\tcase REG_LD_LATPROF_INF_EL2:\n\tcase REG_AON_CPU_MSTALL_CTR2_EL1:\n\tcase REG_AGTCNTHP_CVAL_EL21:\n\tcase REG_CNTHV_CVAL_NOREDIR_EL21:\n\tcase REG_AGTCNTPCT_NOREDIR_EL0:\n\tcase REG_AON_CPU_MSTALL_CTR3_EL1:\n\tcase REG_AGTCNTHP_TVAL_EL21:\n\tcase REG_CNTHV_TVAL_NOREDIR_EL21:\n\tcase REG_VMSA_HV_LOCK_EL2:\n\tcase REG_PMSWCTRL_EL1:\n\tcase REG_PMCR5_EL0:\n\tcase REG_AON_CPU_MSTALL_CTR4_EL1:\n\tcase REG_PMCOMPARE0_EL1:\n\tcase REG_PMCOMPARE1_EL1:\n\tcase REG_VMSA_NV_LOCK_EL2:\n\tcase REG_PMSR_EL1:\n\tcase REG_AON_CPU_MSTALL_CTR5_EL1:\n\tcase REG_AGTCNTHP_CTL_EL21:\n\tcase REG_PMCOMPARE5_EL1:\n\tcase REG_PMCOMPARE6_EL1:\n\tcase REG_PMCOMPARE7_EL1:\n\tcase REG_PMCR_BVRNG4_EL1:\n\tcase REG_PM_PMI_PC:\n\tcase REG_AON_CPU_MSTALL_CTR6_EL1:\n\tcase REG_AGTCNTHV_CVAL_EL21:\n\tcase REG_AGTCNTVCT_NOREDIR_EL0:\n\tcase REG_PMCR_BVRNG5_EL1:\n\tcase REG_AON_CPU_MSTALL_CTR7_EL1:\n\tcase REG_AGTCNTHV_TVAL_EL21:\n\tcase REG_AGTCNTPCTSS_NOREDIR_EL0:\n\tcase REG_CSSELR_EL1:\n\tcase REG_PMC0:\n\tcase REG_UPMCFILTER0:\n\tcase REG_UPMCFILTER1:\n\tcase REG_UPMCFILTER2:\n\tcase REG_UPMCFILTER3:\n\tcase REG_UPMCFILTER4:\n\tcase REG_UPMCFILTER5:\n\tcase REG_UPMCFILTER6:\n\tcase REG_PMC1:\n\tcase REG_UPMCFILTER7:\n\tcase REG_PMC2:\n\tcase REG_PMC3:\n\tcase REG_PMC4:\n\tcase REG_PMC5:\n\tcase REG_PMC6:\n\tcase REG_PMC7:\n\tcase REG_PMC8:\n\tcase REG_PMC9:\n\tcase REG_PMTRHLD6_EL1:\n\tcase REG_PMTRHLD4_EL1:\n\tcase REG_PMTRHLD2_EL1:\n\tcase REG_PMMMAP_EL1:\n\tcase REG_CTR_EL0:\n\tcase REG_DCZID_EL0:\n\tcase REG_NZCV:\n\tcase REG_DAIF:\n\tcase REG_SVCR:\n\tcase REG_DIT:\n\tcase REG_SSBS:\n\tcase REG_TCO:\n\tcase REG_FPCR:\n\tcase REG_FPSR:\n\tcase REG_DSPSR:\n\tcase REG_DLR:\n\tcase REG_PMCR_EL0:\n\tcase REG_PMCNTENSET_EL0:\n\tcase REG_PMCNTENCLR_EL0:\n\tcase REG_PMOVSCLR_EL0:\n\tcase REG_PMSWINC_EL0:\n\tcase REG_PMSELR_EL0:\n\tcase REG_PMCCNTR_EL0:\n\tcase REG_PMXEVTYPER_EL0:\n\tcase REG_PMXEVCNTR_EL0:\n\tcase REG_DAIFCLR:\n\tcase REG_PMUSERENR_EL0:\n\tcase REG_PMOVSSET_EL0:\n\tcase REG_TPIDR_EL0:\n\tcase REG_TPIDRRO_EL0:\n\tcase REG_TPIDR2_EL0:\n\tcase REG_SCXTNUM_EL0:\n\tcase REG_AMCR_EL0:\n\tcase REG_AMUSERENR_EL0:\n\tcase REG_AMCNTENCLR0_EL0:\n\tcase REG_AMCNTENSET0_EL0:\n\tcase REG_AMCNTENCLR1_EL0:\n\tcase REG_AMCNTENSET1_EL0:\n\tcase REG_AMEVCNTR00_EL0:\n\tcase REG_AMEVCNTR01_EL0:\n\tcase REG_AMEVCNTR02_EL0:\n\tcase REG_AMEVCNTR03_EL0:\n\tcase REG_AMEVCNTR10_EL0:\n\tcase REG_AMEVCNTR11_EL0:\n\tcase REG_AMEVCNTR12_EL0:\n\tcase REG_AMEVCNTR13_EL0:\n\tcase REG_AMEVCNTR14_EL0:\n\tcase REG_AMEVCNTR15_EL0:\n\tcase REG_AMEVCNTR16_EL0:\n\tcase REG_AMEVCNTR17_EL0:\n\tcase REG_AMEVCNTR18_EL0:\n\tcase REG_AMEVCNTR19_EL0:\n\tcase REG_AMEVCNTR110_EL0:\n\tcase REG_AMEVCNTR111_EL0:\n\tcase REG_AMEVCNTR112_EL0:\n\tcase REG_AMEVCNTR113_EL0:\n\tcase REG_AMEVCNTR114_EL0:\n\tcase REG_AMEVCNTR115_EL0:\n\tcase REG_AMEVTYPER10_EL0:\n\tcase REG_AMEVTYPER11_EL0:\n\tcase REG_AMEVTYPER12_EL0:\n\tcase REG_AMEVTYPER13_EL0:\n\tcase REG_AMEVTYPER14_EL0:\n\tcase REG_AMEVTYPER15_EL0:\n\tcase REG_AMEVTYPER16_EL0:\n\tcase REG_AMEVTYPER17_EL0:\n\tcase REG_AMEVTYPER18_EL0:\n\tcase REG_AMEVTYPER19_EL0:\n\tcase REG_AMEVTYPER110_EL0:\n\tcase REG_AMEVTYPER111_EL0:\n\tcase REG_AMEVTYPER112_EL0:\n\tcase REG_AMEVTYPER113_EL0:\n\tcase REG_AMEVTYPER114_EL0:\n\tcase REG_AMEVTYPER115_EL0:\n\tcase REG_CNTFRQ_EL0:\n\tcase REG_CNTPCT_EL0:\n\tcase REG_CNTVCT_EL0:\n\tcase REG_CNTPCTSS_EL0:\n\tcase REG_CNTVCTSS_EL0:\n\tcase REG_CNTHP_TVAL_EL21:\n\tcase REG_CNTHP_CTL_EL21:\n\tcase REG_CNTHP_CVAL_EL21:\n\tcase REG_CNTHV_TVAL_EL21:\n\tcase REG_CNTHV_CTL_EL21:\n\tcase REG_CNTHV_CVAL_EL21:\n\tcase REG_PMEVCNTR0_EL0:\n\tcase REG_PMEVCNTR1_EL0:\n\tcase REG_PMEVCNTR2_EL0:\n\tcase REG_PMEVCNTR3_EL0:\n\tcase REG_PMEVCNTR4_EL0:\n\tcase REG_PMEVCNTR5_EL0:\n\tcase REG_PMEVCNTR6_EL0:\n\tcase REG_PMEVCNTR7_EL0:\n\tcase REG_PMEVCNTR8_EL0:\n\tcase REG_PMEVCNTR9_EL0:\n\tcase REG_PMEVCNTR10_EL0:\n\tcase REG_PMEVCNTR11_EL0:\n\tcase REG_PMEVCNTR12_EL0:\n\tcase REG_PMEVCNTR13_EL0:\n\tcase REG_PMEVCNTR14_EL0:\n\tcase REG_PMEVCNTR15_EL0:\n\tcase REG_PMEVCNTR16_EL0:\n\tcase REG_PMEVCNTR17_EL0:\n\tcase REG_PMEVCNTR18_EL0:\n\tcase REG_PMEVCNTR19_EL0:\n\tcase REG_PMEVCNTR20_EL0:\n\tcase REG_PMEVCNTR21_EL0:\n\tcase REG_PMEVCNTR22_EL0:\n\tcase REG_PMEVCNTR23_EL0:\n\tcase REG_PMEVCNTR24_EL0:\n\tcase REG_PMEVCNTR25_EL0:\n\tcase REG_PMEVCNTR26_EL0:\n\tcase REG_PMEVCNTR27_EL0:\n\tcase REG_PMEVCNTR28_EL0:\n\tcase REG_PMEVCNTR29_EL0:\n\tcase REG_PMEVCNTR30_EL0:\n\tcase REG_PMEVTYPER0_EL0:\n\tcase REG_PMEVTYPER1_EL0:\n\tcase REG_PMEVTYPER2_EL0:\n\tcase REG_PMEVTYPER3_EL0:\n\tcase REG_PMEVTYPER4_EL0:\n\tcase REG_PMEVTYPER5_EL0:\n\tcase REG_PMEVTYPER6_EL0:\n\tcase REG_PMEVTYPER7_EL0:\n\tcase REG_PMEVTYPER8_EL0:\n\tcase REG_PMEVTYPER9_EL0:\n\tcase REG_PMEVTYPER10_EL0:\n\tcase REG_PMEVTYPER11_EL0:\n\tcase REG_PMEVTYPER12_EL0:\n\tcase REG_PMEVTYPER13_EL0:\n\tcase REG_PMEVTYPER14_EL0:\n\tcase REG_PMEVTYPER15_EL0:\n\tcase REG_PMEVTYPER16_EL0:\n\tcase REG_PMEVTYPER17_EL0:\n\tcase REG_PMEVTYPER18_EL0:\n\tcase REG_PMEVTYPER19_EL0:\n\tcase REG_PMEVTYPER20_EL0:\n\tcase REG_PMEVTYPER21_EL0:\n\tcase REG_PMEVTYPER22_EL0:\n\tcase REG_PMEVTYPER23_EL0:\n\tcase REG_PMEVTYPER24_EL0:\n\tcase REG_PMEVTYPER25_EL0:\n\tcase REG_PMEVTYPER26_EL0:\n\tcase REG_PMEVTYPER27_EL0:\n\tcase REG_PMEVTYPER28_EL0:\n\tcase REG_PMEVTYPER29_EL0:\n\tcase REG_PMEVTYPER30_EL0:\n\tcase REG_PMCCFILTR_EL0:\n\tcase REG_LSU_ERR_STS:\n\tcase REG_AFLATCTL1_EL1:\n\tcase REG_AFLATVALBIN0_EL1:\n\tcase REG_AFLATINFLO_EL1:\n\tcase REG_LSU_ERR_CTL:\n\tcase REG_AFLATCTL2_EL1:\n\tcase REG_AFLATVALBIN1_EL1:\n\tcase REG_AFLATINFHI_EL1:\n\tcase REG_AFLATCTL3_EL1:\n\tcase REG_AFLATVALBIN2_EL1:\n\tcase REG_AFLATCTL4_EL1:\n\tcase REG_AFLATVALBIN3_EL1:\n\tcase REG_LLC_FILL_CTL:\n\tcase REG_AFLATCTL5_LO_EL1:\n\tcase REG_AFLATVALBIN4_EL1:\n\tcase REG_AFLATCTL5_HI_EL1:\n\tcase REG_LLC_FILL_DAT:\n\tcase REG_AFLATVALBIN5_EL1:\n\tcase REG_AFLATVALBIN6_EL1:\n\tcase REG_LLC_RAM_CONFIG:\n\tcase REG_AFLATVALBIN7_EL1:\n\tcase REG_LLC_ERR_STS:\n\tcase REG_CMAINT_BCAST_LIST_0:\n\tcase REG_CMAINT_BCAST_LIST_1:\n\tcase REG_CMAINT_BCAST_CTL:\n\tcase REG_LLC_ERR_ADR:\n\tcase REG_LLC_ERR_CTL:\n\tcase REG_LLC_ERR_INJ:\n\tcase REG_LLC_ERR_INF:\n\tcase REG_USERTAGSEL_EL1:\n\tcase REG_UUSERTAG_EL0:\n\tcase REG_KUSERTAG_EL1:\n\tcase REG_HUSERTAG_EL2:\n\tcase REG_LLC_TRACE_CTL0:\n\tcase REG_LLC_TRACE_CTL1:\n\tcase REG_LLC_UP_REQ_VC:\n\tcase REG_LLC_UP_REQ_VC_THRESH:\n\tcase REG_LLC_UP_REQ_VC_2:\n\tcase REG_LLC_UP_REQ_VC_THRESH_2:\n\tcase REG_LLC_DRAM_HASH0:\n\tcase REG_LLC_DRAM_HASH1:\n\tcase REG_LLC_DRAM_HASH2:\n\tcase REG_LLC_DRAM_HASH3:\n\tcase REG_LLC_TRACE_CTL2:\n\tcase REG_LLC_DRAM_HASH4:\n\tcase REG_LLC_UP_REQ_VC_3:\n\tcase REG_LLC_UP_REQ_VC_THRESH_3:\n\tcase REG_LLC_UP_REQ_VC_4:\n\tcase REG_LLC_UP_REQ_VC_THRESH_4:\n\tcase REG_LLC_HASH0:\n\tcase REG_LLC_HASH1:\n\tcase REG_LLC_HASH2:\n\tcase REG_LLC_HASH3:\n\tcase REG_LLC_WRR:\n\tcase REG_LLC_DRAM_HASH5:\n\tcase REG_LLC_DRAM_HASH6:\n\tcase REG_VPIDR_EL2:\n\tcase REG_VMPIDR_EL2:\n\tcase REG_SCTLR_EL2:\n\tcase REG_ACTLR_EL2:\n\tcase REG_HCR_EL2:\n\tcase REG_MDCR_EL2:\n\tcase REG_CPTR_EL2:\n\tcase REG_HSTR_EL2:\n\tcase REG_HFGRTR_EL2:\n\tcase REG_HFGWTR_EL2:\n\tcase REG_HFGITR_EL2:\n\tcase REG_HACR_EL2:\n\tcase REG_TRFCR_EL2:\n\tcase REG_HCRX_EL2:\n\tcase REG_SMPRIMAP_EL2:\n\tcase REG_SMCR_EL2:\n\tcase REG_SDER32_EL2:\n\tcase REG_TTBR0_EL2:\n\tcase REG_TTBR1_EL2:\n\tcase REG_TCR_EL2:\n\tcase REG_VTTBR_EL2:\n\tcase REG_VTCR_EL2:\n\tcase REG_VNCR_EL2:\n\tcase REG_VSTTBR_EL2:\n\tcase REG_VSTCR_EL2:\n\tcase REG_DACR32_EL2:\n\tcase REG_HDFGRTR_EL2:\n\tcase REG_HDFGWTR_EL2:\n\tcase REG_SPSR_EL2:\n\tcase REG_ELR_EL2:\n\tcase REG_SP_EL1:\n\tcase REG_SPSR_IRQ:\n\tcase REG_SPSR_ABT:\n\tcase REG_SPSR_UND:\n\tcase REG_SPSR_FIQ:\n\tcase REG_IFSR32_EL2:\n\tcase REG_AFSR0_EL2:\n\tcase REG_AFSR1_EL2:\n\tcase REG_ESR_EL2:\n\tcase REG_VSESR_EL2:\n\tcase REG_FPEXC32_EL2:\n\tcase REG_TFSR_EL2:\n\tcase REG_FAR_EL2:\n\tcase REG_HPFAR_EL2:\n\tcase REG_PMSCR_EL2:\n\tcase REG_MAIR_EL2:\n\tcase REG_AMAIR_EL2:\n\tcase REG_MPAMHCR_EL2:\n\tcase REG_MPAMVPMV_EL2:\n\tcase REG_MPAM2_EL2:\n\tcase REG_MPAMVPM0_EL2:\n\tcase REG_MPAMVPM1_EL2:\n\tcase REG_MPAMVPM2_EL2:\n\tcase REG_MPAMVPM3_EL2:\n\tcase REG_MPAMVPM4_EL2:\n\tcase REG_MPAMVPM5_EL2:\n\tcase REG_MPAMVPM6_EL2:\n\tcase REG_MPAMVPM7_EL2:\n\tcase REG_VBAR_EL2:\n\tcase REG_RVBAR_EL2:\n\tcase REG_RMR_EL2:\n\tcase REG_VDISR_EL2:\n\tcase REG_ICH_AP0R0_EL2:\n\tcase REG_ICH_AP0R1_EL2:\n\tcase REG_ICH_AP0R2_EL2:\n\tcase REG_ICH_AP0R3_EL2:\n\tcase REG_ICH_AP1R0_EL2:\n\tcase REG_ICH_AP1R1_EL2:\n\tcase REG_ICH_AP1R2_EL2:\n\tcase REG_ICH_AP1R3_EL2:\n\tcase REG_ICH_VSEIR_EL2:\n\tcase REG_ICC_SRE_EL2:\n\tcase REG_ICH_HCR_EL2:\n\tcase REG_ICH_VTR_EL2:\n\tcase REG_ICH_MISR_EL2:\n\tcase REG_ICH_EISR_EL2:\n\tcase REG_ICH_ELRSR_EL2:\n\tcase REG_ICH_VMCR_EL2:\n\tcase REG_ICH_LR0_EL2:\n\tcase REG_ICH_LR1_EL2:\n\tcase REG_ICH_LR2_EL2:\n\tcase REG_ICH_LR3_EL2:\n\tcase REG_ICH_LR4_EL2:\n\tcase REG_ICH_LR5_EL2:\n\tcase REG_ICH_LR6_EL2:\n\tcase REG_ICH_LR7_EL2:\n\tcase REG_ICH_LR8_EL2:\n\tcase REG_ICH_LR9_EL2:\n\tcase REG_ICH_LR10_EL2:\n\tcase REG_ICH_LR11_EL2:\n\tcase REG_ICH_LR12_EL2:\n\tcase REG_ICH_LR13_EL2:\n\tcase REG_ICH_LR14_EL2:\n\tcase REG_ICH_LR15_EL2:\n\tcase REG_CONTEXTIDR_EL2:\n\tcase REG_TPIDR_EL2:\n\tcase REG_SCXTNUM_EL2:\n\tcase REG_CNTVOFF_EL2:\n\tcase REG_CNTHCTL_EL2:\n\tcase REG_CNTHP_TVAL_EL2:\n\tcase REG_CNTHP_CTL_EL2:\n\tcase REG_CNTHP_CVAL_EL2:\n\tcase REG_CNTHV_TVAL_EL2:\n\tcase REG_CNTHV_CTL_EL2:\n\tcase REG_CNTHV_CVAL_EL2:\n\tcase REG_CNTHVS_TVAL_EL2:\n\tcase REG_CNTHVS_CTL_EL2:\n\tcase REG_CNTHVS_CVAL_EL2:\n\tcase REG_CNTHPS_TVAL_EL2:\n\tcase REG_CNTHPS_CTL_EL2:\n\tcase REG_CNTHPS_CVAL_EL2:\n\tcase REG_FED_ERR_STS:\n\tcase REG_FED_ERR_CTL:\n\tcase REG_APCTL_EL1:\n\tcase REG_KERNKEYLO_EL1:\n\tcase REG_KERNKEYHI_EL1:\n\tcase REG_VMSALOCK_EL21:\n\tcase REG_AMX_STATE_T_EL1:\n\tcase REG_AMX_CONFIG_EL1:\n\tcase REG_VMSA_LOCK_EL2:\n\tcase REG_CTRR_B_UPR_EL1:\n\tcase REG_CTRR_B_LWR_EL1:\n\tcase REG_SP_SETUP_GL1:\n\tcase REG_SP_SETUP_GL2:\n\tcase REG_CTRR_B_CTL_EL1:\n\tcase REG_CTRR_A_LWR_EL1:\n\tcase REG_CTRR_A_UPR_EL1:\n\tcase REG_CTRR_A_CTL_EL1:\n\tcase REG_VMSA_LOCK_EL12:\n\tcase REG_AGTCNTV_CTL_EL02:\n\tcase REG_AMX_STATE_EL1:\n\tcase REG_AMX_STATUS_EL1:\n\tcase REG_AGTCNTP_CVAL_EL02:\n\tcase REG_REDIR_ACNTP_TVAL_EL02:\n\tcase REG_AGTCNTP_CTL_EL02:\n\tcase REG_AGTCNTV_CVAL_EL02:\n\tcase REG_AGTCNTV_TVAL_EL02:\n\tcase REG_AMX_CONFIG_EL12:\n\tcase REG_AMX_CONFIG_EL2:\n\tcase REG_SPRR_HUPERM_EL0:\n\tcase REG_SPRR_VUPERM_EL0:\n\tcase REG_CTRR_A_CTL_EL2:\n\tcase REG_CTRR_B_CTL_EL2:\n\tcase REG_CTRR_A_LWR_EL2:\n\tcase REG_CTRR_A_UPR_EL2:\n\tcase REG_CTRR_B_LWR_EL2:\n\tcase REG_CTRR_B_UPR_EL2:\n\tcase REG_SPRR_HUMPRR_EL2:\n\tcase REG_SPRR_HUPERM_SH01_EL2:\n\tcase REG_SPRR_HUPERM_SH02_EL2:\n\tcase REG_SPRR_HUPERM_SH03_EL2:\n\tcase REG_SPRR_HUPERM_SH04_EL2:\n\tcase REG_SPRR_HUPERM_SH05_EL2:\n\tcase REG_SPRR_HUPERM_SH06_EL2:\n\tcase REG_SPRR_HUPERM_SH07_EL2:\n\tcase REG_SPRR_VUMPRR_EL1:\n\tcase REG_SPRR_VUPERM_SH01_EL1:\n\tcase REG_SPRR_VUPERM_SH02_EL1:\n\tcase REG_SPRR_VUPERM_SH03_EL1:\n\tcase REG_SPRR_VUPERM_SH04_EL1:\n\tcase REG_SPRR_VUPERM_SH05_EL1:\n\tcase REG_SPRR_VUPERM_SH06_EL1:\n\tcase REG_SPRR_VUPERM_SH07_EL1:\n\tcase REG_CTRR_A_LWR_EL12:\n\tcase REG_CTRR_A_UPR_EL12:\n\tcase REG_CTRR_B_LWR_EL12:\n\tcase REG_CTRR_B_UPR_EL12:\n\tcase REG_CTRR_A_CTL_EL12:\n\tcase REG_CTRR_B_CTL_EL12:\n\tcase REG_AGTCNTHCTL_EL21:\n\tcase REG_AGTCNTKCTL_EL12:\n\tcase REG_PREDAKEYLO_EL1:\n\tcase REG_PREDAKEYHI_EL1:\n\tcase REG_PREDBKEYLO_EL1:\n\tcase REG_PREDBKEYHI_EL1:\n\tcase REG_SIQ_CFG_EL1:\n\tcase REG_AGTCNTPCTSS_EL0:\n\tcase REG_AGTCNTVCTSS_EL0:\n\tcase REG_AVNCR_EL2:\n\tcase REG_ACC_CTRR_A_LWR_EL2:\n\tcase REG_ACC_CTRR_A_UPR_EL2:\n\tcase REG_ACC_CTRR_B_LWR_EL2:\n\tcase REG_ACC_CTRR_B_UPR_EL2:\n\tcase REG_ACC_CTRR_A_CTL_EL2:\n\tcase REG_ACC_CTRR_B_CTL_EL2:\n\tcase REG_AGTCNTPCT_EL0:\n\tcase REG_AGTCNTVCT_EL0:\n\tcase REG_ACFG_EL1:\n\tcase REG_AHCR_EL2:\n\tcase REG_APL_INTSTATUS_EL1:\n\tcase REG_APL_INTSTATUS_EL2:\n\tcase REG_AGTCNTHCTL_EL2:\n\tcase REG_JAPIAKEYLO_EL2:\n\tcase REG_JAPIAKEYHI_EL2:\n\tcase REG_JAPIBKEYLO_EL2:\n\tcase REG_JAPIBKEYHI_EL2:\n\tcase REG_JAPIAKEYLO_EL1:\n\tcase REG_JAPIAKEYHI_EL1:\n\tcase REG_JAPIBKEYLO_EL1:\n\tcase REG_JAPIBKEYHI_EL1:\n\tcase REG_JAPIAKEYLO_EL12:\n\tcase REG_JAPIAKEYHI_EL12:\n\tcase REG_JAPIBKEYLO_EL12:\n\tcase REG_JAPIBKEYHI_EL12:\n\tcase REG_AGTCNTRDIR_EL2:\n\tcase REG_AGTCNTRDIR_EL12:\n\tcase REG_JRANGE_EL2:\n\tcase REG_JRANGE_EL1:\n\tcase REG_JRANGE_EL12:\n\tcase REG_JCTL_EL2:\n\tcase REG_JCTL_EL1:\n\tcase REG_JCTL_EL12:\n\tcase REG_JCTL_EL0:\n\tcase REG_AMDSCR_EL1:\n\tcase REG_SCTLR_EL12:\n\tcase REG_ACTLR_EL12:\n\tcase REG_CPACR_EL12:\n\tcase REG_TRFCR_EL12:\n\tcase REG_SMCR_EL12:\n\tcase REG_TTBR0_EL12:\n\tcase REG_TTBR1_EL12:\n\tcase REG_TCR_EL12:\n\tcase REG_SPSR_EL12:\n\tcase REG_ELR_EL12:\n\tcase REG_AFSR0_EL12:\n\tcase REG_AFSR1_EL12:\n\tcase REG_ESR_EL12:\n\tcase REG_TFSR_EL12:\n\tcase REG_FAR_EL12:\n\tcase REG_PMSCR_EL12:\n\tcase REG_MAIR_EL12:\n\tcase REG_AMAIR_EL12:\n\tcase REG_MPAM1_EL12:\n\tcase REG_VBAR_EL12:\n\tcase REG_CONTEXTIDR_EL12:\n\tcase REG_SCXTNUM_EL12:\n\tcase REG_CNTKCTL_EL12:\n\tcase REG_CNTP_TVAL_EL02:\n\tcase REG_CNTP_CTL_EL02:\n\tcase REG_CNTP_CVAL_EL02:\n\tcase REG_CNTV_TVAL_EL02:\n\tcase REG_CNTV_CTL_EL02:\n\tcase REG_CNTV_CVAL_EL02:\n\tcase REG_IPI_RR_LOCAL_EL1:\n\tcase REG_IPI_RR_GLOBAL_EL1:\n\tcase REG_AF_ERR_CFG0:\n\tcase REG_AP_ERR_CFG0:\n\tcase REG_AF_ERR_SRC_IDS:\n\tcase REG_DPC_ERR_STS:\n\tcase REG_DPC_ERR_CTL:\n\tcase REG_PROD_TRC_CORE_CFG_EL1:\n\tcase REG_TRACE_CORE_CFG:\n\tcase REG_IPI_SR:\n\tcase REG_APL_LRTMR_EL2:\n\tcase REG_APL_INTENABLE_EL2:\n\tcase REG_KTRACE_MESSAGE:\n\tcase REG_TRACE_CORE_CFG_EXT:\n\tcase REG_PROD_TRC_CORE_CFG_EL2:\n\tcase REG_HID_PROD_TRC_CORE_CFG_EL1:\n\tcase REG_DBG_WRAP_GLB:\n\tcase REG_TRACE_STREAM_BASE:\n\tcase REG_TRACE_STREAM_FILL:\n\tcase REG_TRACE_STREAM_BASE1:\n\tcase REG_TRACE_STREAM_FILL1:\n\tcase REG_TRACE_STREAM_IRQ:\n\tcase REG_WATCHDOGDIAG0:\n\tcase REG_WATCHDOGDIAG1:\n\tcase REG_TRACE_AUX_CTL:\n\tcase REG_IPI_CR:\n\tcase REG_UTRIG_EVENT:\n\tcase REG_HID_PROD_TRC_MASK_EL1:\n\tcase REG_TRACE_CTL:\n\tcase REG_TRACE_DAT:\n\tcase REG_PROD_TRC_STRM_BASE0_GL2:\n\tcase REG_PROD_TRC_STRM_BASE1_GL2:\n\tcase REG_CPU_CFG:\n\tcase REG_PBLK_STS:\n\tcase REG_PROD_TRC_CTL_EL1:\n\tcase REG_PROD_TRC_STRM_BASE0_GL1:\n\tcase REG_PROD_TRC_STRM_BASE1_GL1:\n\tcase REG_PROD_TRC_STRM_FIQ_EL1:\n\tcase REG_CPU_OVRD:\n\tcase REG_PBLK_EXE_ST:\n\tcase REG_PROD_TRC_CORE_GL_CTL_GL1:\n\tcase REG_PROD_TRC_CORE_GL_CTL_GL2:\n\tcase REG_ACC_OVRD:\n\tcase REG_ACC_OVRD1:\n\tcase REG_CPM_PWRDN_CTL:\n\tcase REG_PROD_TRC_BUF_RESTORE0_GL1:\n\tcase REG_PROD_TRC_BUF_RESTORE1_GL1:\n\tcase REG_PROD_TRC_EN_GL1:\n\tcase REG_PRE_LLCFLUSH_TMR:\n\tcase REG_BIUINTFCTL_CFG:\n\tcase REG_BIUINTFWRR_CFG:\n\tcase REG_PRE_TD_TMR:\n\tcase REG_ACC_SLP_WAKE_UP_TMR:\n\tcase REG_PBLK_PSW_DLY:\n\tcase REG_CPU_STS:\n\tcase REG_HIST_TRIG:\n\tcase REG_PROD_TRC_BUF_RESTORE0_GL2:\n\tcase REG_PROD_TRC_BUF_RESTORE1_GL2:\n\tcase REG_PROD_TRC_STRM_FILL0_EL1:\n\tcase REG_PROD_TRC_STRM_FILL1_EL1:\n\tcase REG_ARRAY_INDEX:\n\tcase REG_PROD_TRC_CTL_EL2:\n\tcase REG_PROD_TRC_EN_GL2:\n\tcase REG_PROD_TRC_STRM_FIQ_EL2:\n\tcase REG_PROD_TRC_CPMU_DUMP_TRIG_EL1:\n\tcase REG_PROD_LOSS_COUNT_EL1:\n\tcase REG_SW_TRACE_DATA_EL0:\n\tcase REG_IL1_DATA0:\n\tcase REG_IL1_DATA1:\n\tcase REG_DL1_DATA0:\n\tcase REG_DL1_DATA1:\n\tcase REG_MMUDATA0:\n\tcase REG_MMUDATA1:\n\tcase REG_DL1_DATA2:\n\tcase REG_IL1_DATA2:\n\tcase REG_LLC_DATA0:\n\tcase REG_LLC_DATA1:\n\tcase REG_SCTLR_EL3:\n\tcase REG_ACTLR_EL3:\n\tcase REG_SCR_EL3:\n\tcase REG_SDER32_EL3:\n\tcase REG_CPTR_EL3:\n\tcase REG_MDCR_EL3:\n\tcase REG_TTBR0_EL3:\n\tcase REG_TCR_EL3:\n\tcase REG_SPSR_EL3:\n\tcase REG_ELR_EL3:\n\tcase REG_SP_EL2:\n\tcase REG_AFSR0_EL3:\n\tcase REG_AFSR1_EL3:\n\tcase REG_ESR_EL3:\n\tcase REG_TFSR_EL3:\n\tcase REG_FAR_EL3:\n\tcase REG_MAIR_EL3:\n\tcase REG_AMAIR_EL3:\n\tcase REG_MPAM3_EL3:\n\tcase REG_VBAR_EL3:\n\tcase REG_RVBAR_EL3:\n\tcase REG_RMR_EL3:\n\tcase REG_ICC_CTLR_EL3:\n\tcase REG_ICC_SRE_EL3:\n\tcase REG_ICC_IGRPEN1_EL3:\n\tcase REG_TPIDR_EL3:\n\tcase REG_SCXTNUM_EL3:\n\tcase REG_MMU_ERR_STS:\n\tcase REG_AFSR1_GL1:\n\tcase REG_AFSR1_GL2:\n\tcase REG_AFSR1_GL12:\n\tcase REG_BP_OBJC_ADR_EL1:\n\tcase REG_BP_OBJC_CTL_EL1:\n\tcase REG_SP_GL11:\n\tcase REG_MMU_SESR_EL2:\n\tcase REG_SPRR_CONFIG_EL1:\n\tcase REG_HPFAR_GL2:\n\tcase REG_GXF_CONFIG_EL1:\n\tcase REG_AMRANGE_EL21:\n\tcase REG_GXF_CONFIG_EL2:\n\tcase REG_SPRR_UPERM_EL0:\n\tcase REG_SPRR_PPERM_EL1:\n\tcase REG_SPRR_PPERM_EL2:\n\tcase REG_APGAKEYLO_EL12:\n\tcase REG_APGAKEYHI_EL12:\n\tcase REG_KERNKEYLO_EL12:\n\tcase REG_KERNKEYHI_EL12:\n\tcase REG_AFPCR_EL0:\n\tcase REG_SP_GL22:\n\tcase REG_AMXIDR_EL1:\n\tcase REG_SPRR_HUMPRR_EL21:\n\tcase REG_SPRR_PMPRR_EL1:\n\tcase REG_SPRR_PMPRR_EL2:\n\tcase REG_SPRR_HUPERM_SH01_EL21:\n\tcase REG_SPRR_HUPERM_SH02_EL21:\n\tcase REG_SPRR_HUPERM_SH03_EL21:\n\tcase REG_SPRR_HUPERM_SH04_EL21:\n\tcase REG_SPRR_HUPERM_SH05_EL21:\n\tcase REG_SPRR_HUPERM_SH06_EL21:\n\tcase REG_SPRR_HUPERM_SH07_EL21:\n\tcase REG_SPRR_PPERM_SH01_EL1:\n\tcase REG_SPRR_PPERM_SH02_EL1:\n\tcase REG_SPRR_PPERM_SH03_EL1:\n\tcase REG_SPRR_PPERM_SH04_EL1:\n\tcase REG_SPRR_PPERM_SH05_EL1:\n\tcase REG_SPRR_PPERM_SH06_EL1:\n\tcase REG_SPRR_PPERM_SH07_EL1:\n\tcase REG_SPRR_PPERM_SH01_EL2:\n\tcase REG_SPRR_PPERM_SH02_EL2:\n\tcase REG_SPRR_PPERM_SH03_EL2:\n\tcase REG_SPRR_PPERM_SH04_EL2:\n\tcase REG_SPRR_PPERM_SH05_EL2:\n\tcase REG_SPRR_PPERM_SH06_EL2:\n\tcase REG_SPRR_PPERM_SH07_EL2:\n\tcase REG_SPRR_PMPRR_EL12:\n\tcase REG_SPRR_PPERM_SH01_EL12:\n\tcase REG_SPRR_PPERM_SH02_EL12:\n\tcase REG_SPRR_PPERM_SH03_EL12:\n\tcase REG_SPRR_PPERM_SH04_EL12:\n\tcase REG_SPRR_PPERM_SH05_EL12:\n\tcase REG_SPRR_PPERM_SH06_EL12:\n\tcase REG_SPRR_PPERM_SH07_EL12:\n\tcase REG_APIAKEYLO_EL12:\n\tcase REG_APIAKEYHI_EL12:\n\tcase REG_APIBKEYLO_EL12:\n\tcase REG_APIBKEYHI_EL12:\n\tcase REG_APDAKEYLO_EL12:\n\tcase REG_APDAKEYHI_EL12:\n\tcase REG_APDBKEYLO_EL12:\n\tcase REG_APDBKEYHI_EL12:\n\tcase REG_CURRENTG:\n\tcase REG_GXF_ENTRY_EL1:\n\tcase REG_GXF_PABENTRY_EL1:\n\tcase REG_ASPSR_EL1:\n\tcase REG_ADSPSR_EL0:\n\tcase REG_PMCR1_GL2:\n\tcase REG_ASPSR_EL2:\n\tcase REG_PMCR1_GL1:\n\tcase REG_VBAR_GL12:\n\tcase REG_SPSR_GL12:\n\tcase REG_ASPSR_GL12:\n\tcase REG_ESR_GL12:\n\tcase REG_ELR_GL12:\n\tcase REG_FAR_GL12:\n\tcase REG_SP_GL1:\n\tcase REG_TPIDR_GL1:\n\tcase REG_VBAR_GL1:\n\tcase REG_SPSR_GL1:\n\tcase REG_ASPSR_GL1:\n\tcase REG_ESR_GL1:\n\tcase REG_ELR_GL1:\n\tcase REG_FAR_GL1:\n\tcase REG_SP_GL2:\n\tcase REG_TPIDR_GL2:\n\tcase REG_VBAR_GL2:\n\tcase REG_SPSR_GL2:\n\tcase REG_ASPSR_GL2:\n\tcase REG_ESR_GL2:\n\tcase REG_ELR_GL2:\n\tcase REG_FAR_GL2:\n\tcase REG_GXF_ENTRY_EL2:\n\tcase REG_GXF_PABENTRY_EL2:\n\tcase REG_APCTL_EL2:\n\tcase REG_APSTS_EL2:\n\tcase REG_APSTS_EL1:\n\tcase REG_KERNKEYLO_EL2:\n\tcase REG_KERNKEYHI_EL2:\n\tcase REG_ASPSR_EL12:\n\tcase REG_APIAKEYLO_EL2:\n\tcase REG_APIAKEYHI_EL2:\n\tcase REG_APIBKEYLO_EL2:\n\tcase REG_APIBKEYHI_EL2:\n\tcase REG_APDAKEYLO_EL2:\n\tcase REG_APDAKEYHI_EL2:\n\tcase REG_APDBKEYLO_EL2:\n\tcase REG_APDBKEYHI_EL2:\n\tcase REG_APGAKEYLO_EL2:\n\tcase REG_APGAKEYHI_EL2:\n\tcase REG_SPRR_CONFIG_EL2:\n\tcase REG_SPRR_AMRANGE_EL2:\n\tcase REG_VMKEYLO_EL2:\n\tcase REG_VMKEYHI_EL2:\n\tcase REG_MMU_SFAR_EL2:\n\tcase REG_APSTS_EL12:\n\tcase REG_APCTL_EL12:\n\tcase REG_GXF_CONFIG_EL12:\n\tcase REG_GXF_ENTRY_EL12:\n\tcase REG_GXF_PABENTRY_EL12:\n\tcase REG_SPRR_CONFIG_EL12:\n\tcase REG_SPRR_AMRANGE_EL12:\n\tcase REG_MMU_SESR_CTL_EL2:\n\tcase REG_SPRR_PPERM_EL12:\n\tcase REG_CNTPS_TVAL_EL1:\n\tcase REG_CNTPS_CTL_EL1:\n\tcase REG_CNTPS_CVAL_EL1:\n\tcase REG_PSTATE_SPSEL:\n\tcase REG_PWRDNSAVE0:\n\tcase REG_NRG_ACC_CTL:\n\tcase REG_AON_CNT0:\n\tcase REG_CPU_CNT0:\n\tcase REG_UPMCR0_EL1:\n\tcase REG_UPMC8:\n\tcase REG_AON_CNT8:\n\tcase REG_PWRDNSAVE1:\n\tcase REG_CORE_NRG_ACC_DAT:\n\tcase REG_AON_CNT_CTL0:\n\tcase REG_CPU_CNT_CTL0:\n\tcase REG_UPMESR0_EL1:\n\tcase REG_UPMC9:\n\tcase REG_AON_CNT_CTL8:\n\tcase REG_ACC_PWR_DN_SAVE:\n\tcase REG_CPM_NRG_ACC_DAT:\n\tcase REG_AON_CNT1:\n\tcase REG_CPU_CNT1:\n\tcase REG_UPMSWCTRL_EL1:\n\tcase REG_UPMC10:\n\tcase REG_AON_CNT9:\n\tcase REG_CORE_SRM_NRG_ACC_DAT:\n\tcase REG_AON_CNT_CTL1:\n\tcase REG_CPU_CNT_CTL1:\n\tcase REG_UPMECM0_EL1:\n\tcase REG_UPMC11:\n\tcase REG_AON_CNT_CTL9:\n\tcase REG_AON_CNT_CTL:\n\tcase REG_CPM_SRM_NRG_ACC_DAT:\n\tcase REG_AON_CNT2:\n\tcase REG_CPU_CNT2:\n\tcase REG_UPMECM1_EL1:\n\tcase REG_UPMC12:\n\tcase REG_AON_CNT10:\n\tcase REG_CPU_CNT_CTL:\n\tcase REG_AON_CNT_CTL2:\n\tcase REG_CPU_CNT_CTL2:\n\tcase REG_UPMPCM_EL1:\n\tcase REG_UPMC13:\n\tcase REG_AON_CNT_CTL10:\n\tcase REG_AON_CNT3:\n\tcase REG_CPU_CNT3:\n\tcase REG_UPMSR_EL1:\n\tcase REG_UPMC14:\n\tcase REG_AON_CNT11:\n\tcase REG_AON_CNT_CTL3:\n\tcase REG_CPU_CNT_CTL3:\n\tcase REG_UPMC0:\n\tcase REG_UPMC15:\n\tcase REG_AON_CNT_CTL11:\n\tcase REG_AON_CNT4:\n\tcase REG_CPU_CNT4:\n\tcase REG_UPMC1:\n\tcase REG_UPMECM2_EL1:\n\tcase REG_AON_CNT_CTL4:\n\tcase REG_CPU_CNT_CTL4:\n\tcase REG_UPMC2:\n\tcase REG_UPMECM3_EL1:\n\tcase REG_AON_CNT5:\n\tcase REG_CPU_CNT5:\n\tcase REG_UPMC3:\n\tcase REG_UPMCR1_EL1:\n\tcase REG_AON_CNT_CTL5:\n\tcase REG_CPU_CNT_CTL5:\n\tcase REG_UPMC4:\n\tcase REG_UPMESR1_EL1:\n\tcase REG_AON_CNT6:\n\tcase REG_CPU_CNT6:\n\tcase REG_UPMC5:\n\tcase REG_AON_CNT_CTL6:\n\tcase REG_CPU_CNT_CTL6:\n\tcase REG_UPMC6:\n\tcase REG_AON_CNT7:\n\tcase REG_CPU_CNT7:\n\tcase REG_UPMC7:\n\tcase REG_AON_CNT_CTL7:\n\tcase REG_CPU_CNT_CTL7:\n\t\treturn true;\n\tdefault:\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/binaryninja-arm64-disassembler/sysregs_gen.h",
    "content": "/* GENERATED FILE - DO NOT MODIFY - SUBMIT GITHUB ISSUE IF PROBLEM FOUND */\n#pragma once\n\n#include <stdbool.h>\n\nenum SystemReg \n{\n\tSYSREG_NONE=0,\n\tREG_EDSCR                      =4 /* 4 */,  // S0_0_c0_c0_4 at min EL0: EDSCR\n\tREG_EDPRCR                     =24 /* 24 */,  // S0_0_c0_c3_0 at min EL0: EDPRCR\n\tREG_UAOIMM                     =515 /* 515 */,  // S0_0_c4_c0_3 at min EL1: UAOIMM\n\tREG_PANIMM                     =516 /* 516 */,  // S0_0_c4_c0_4 at min EL1: PANIMM\n\tREG_SPSELIMM                   =517 /* 517 */,  // S0_0_c4_c0_5 at min EL1: SPSELIMM\n\tREG_DITIMM                     =6658 /* 6658 */,  // S0_3_c4_c0_2 at min EL1: DITIMM\n\tREG_SVCRIMM                    =6659 /* 6659 */,  // S0_3_c4_c0_3 at min EL1: SVCRIMM\n\tREG_ICIALLUIS                  =17288 /* 17288 */,  // S1_0_c7_c1_0 at min EL1: ICIALLUIS\n\tREG_ICIALLU                    =17320 /* 17320 */,  // S1_0_c7_c5_0 at min EL1: ICIALLU\n\tREG_DCIVAC                     =17329 /* 17329 */,  // S1_0_c7_c6_1 at min EL1: DCIVAC\n\tREG_DCISW                      =17330 /* 17330 */,  // S1_0_c7_c6_2 at min EL1: DCISW\n\tREG_ATS1E1R                    =17344 /* 17344 */,  // S1_0_c7_c8_0 at min EL1: ATS1E1R\n\tREG_ATS1E1W                    =17345 /* 17345 */,  // S1_0_c7_c8_1 at min EL1: ATS1E1W\n\tREG_ATS1E0R                    =17346 /* 17346 */,  // S1_0_c7_c8_2 at min EL1: ATS1E0R\n\tREG_ATS1E0W                    =17347 /* 17347 */,  // S1_0_c7_c8_3 at min EL1: ATS1E0W\n\tREG_DCCSW                      =17362 /* 17362 */,  // S1_0_c7_c10_2 at min EL1: DCCSW\n\tREG_DCCISW                     =17394 /* 17394 */,  // S1_0_c7_c14_2 at min EL1: DCCISW\n\tREG_TLBIVMALLE1IS              =17432 /* 17432 */,  // S1_0_c8_c3_0 at min EL1: TLBIVMALLE1IS\n\tREG_TLBIVAE1IS                 =17433 /* 17433 */,  // S1_0_c8_c3_1 at min EL1: TLBIVAE1IS\n\tREG_TLBIASIDE1IS               =17434 /* 17434 */,  // S1_0_c8_c3_2 at min EL1: TLBIASIDE1IS\n\tREG_TLBIVAAE1IS                =17435 /* 17435 */,  // S1_0_c8_c3_3 at min EL1: TLBIVAAE1IS\n\tREG_TLBIVALE1IS                =17437 /* 17437 */,  // S1_0_c8_c3_5 at min EL1: TLBIVALE1IS\n\tREG_TLBIVAALE1IS               =17439 /* 17439 */,  // S1_0_c8_c3_7 at min EL1: TLBIVAALE1IS\n\tREG_TLBIVMALLE1                =17464 /* 17464 */,  // S1_0_c8_c7_0 at min EL1: TLBIVMALLE1\n\tREG_TLBIVAE1                   =17465 /* 17465 */,  // S1_0_c8_c7_1 at min EL1: TLBIVAE1\n\tREG_TLBIASIDE1                 =17466 /* 17466 */,  // S1_0_c8_c7_2 at min EL1: TLBIASIDE1\n\tREG_TLBIVAAE1                  =17467 /* 17467 */,  // S1_0_c8_c7_3 at min EL1: TLBIVAAE1\n\tREG_TLBIVALE1                  =17469 /* 17469 */,  // S1_0_c8_c7_5 at min EL1: TLBIVALE1\n\tREG_TLBIVAALE1                 =17471 /* 17471 */,  // S1_0_c8_c7_7 at min EL1: TLBIVAALE1\n\tREG_DCZVA                      =23457 /* 23457 */,  // S1_3_c7_c4_1 at min EL1: DCZVA\n\tREG_ICIVAU                     =23465 /* 23465 */,  // S1_3_c7_c5_1 at min EL1: ICIVAU\n\tREG_DCCVAC                     =23505 /* 23505 */,  // S1_3_c7_c10_1 at min EL1: DCCVAC\n\tREG_DCCVAU                     =23513 /* 23513 */,  // S1_3_c7_c11_1 at min EL1: DCCVAU\n\tREG_DCCIVAC                    =23537 /* 23537 */,  // S1_3_c7_c14_1 at min EL1: DCCIVAC\n\tREG_ATS1E2R                    =25536 /* 25536 */,  // S1_4_c7_c8_0 at min EL1: ATS1E2R\n\tREG_ATS1E2W                    =25537 /* 25537 */,  // S1_4_c7_c8_1 at min EL1: ATS1E2W\n\tREG_ATS12E1R                   =25540 /* 25540 */,  // S1_4_c7_c8_4 at min EL1: ATS12E1R\n\tREG_ATS12E1W                   =25541 /* 25541 */,  // S1_4_c7_c8_5 at min EL1: ATS12E1W\n\tREG_ATS12E0R                   =25542 /* 25542 */,  // S1_4_c7_c8_6 at min EL1: ATS12E0R\n\tREG_ATS12E0W                   =25543 /* 25543 */,  // S1_4_c7_c8_7 at min EL1: ATS12E0W\n\tREG_TLBIIPAS2E1IS              =25601 /* 25601 */,  // S1_4_c8_c0_1 at min EL1: TLBIIPAS2E1IS\n\tREG_TLBIIPAS2LE1IS             =25605 /* 25605 */,  // S1_4_c8_c0_5 at min EL1: TLBIIPAS2LE1IS\n\tREG_TLBIALLE2IS                =25624 /* 25624 */,  // S1_4_c8_c3_0 at min EL1: TLBIALLE2IS\n\tREG_TLBIVAE2IS                 =25625 /* 25625 */,  // S1_4_c8_c3_1 at min EL1: TLBIVAE2IS\n\tREG_TLBIALLE1IS                =25628 /* 25628 */,  // S1_4_c8_c3_4 at min EL1: TLBIALLE1IS\n\tREG_TLBIVALE2IS                =25629 /* 25629 */,  // S1_4_c8_c3_5 at min EL1: TLBIVALE2IS\n\tREG_TLBIVMALLS12E1IS           =25630 /* 25630 */,  // S1_4_c8_c3_6 at min EL1: TLBIVMALLS12E1IS\n\tREG_TLBIIPAS2E1                =25633 /* 25633 */,  // S1_4_c8_c4_1 at min EL1: TLBIIPAS2E1\n\tREG_TLBIIPAS2LE1               =25637 /* 25637 */,  // S1_4_c8_c4_5 at min EL1: TLBIIPAS2LE1\n\tREG_TLBIALLE2                  =25656 /* 25656 */,  // S1_4_c8_c7_0 at min EL1: TLBIALLE2\n\tREG_TLBIVAE2                   =25657 /* 25657 */,  // S1_4_c8_c7_1 at min EL1: TLBIVAE2\n\tREG_TLBIALLE1                  =25660 /* 25660 */,  // S1_4_c8_c7_4 at min EL1: TLBIALLE1\n\tREG_TLBIVALE2                  =25661 /* 25661 */,  // S1_4_c8_c7_5 at min EL1: TLBIVALE2\n\tREG_TLBIVMALLS12E1             =25662 /* 25662 */,  // S1_4_c8_c7_6 at min EL1: TLBIVMALLS12E1\n\tREG_ATS1E3R                    =29632 /* 29632 */,  // S1_6_c7_c8_0 at min EL1: ATS1E3R\n\tREG_ATS1E3W                    =29633 /* 29633 */,  // S1_6_c7_c8_1 at min EL1: ATS1E3W\n\tREG_TLBIALLE3IS                =29720 /* 29720 */,  // S1_6_c8_c3_0 at min EL1: TLBIALLE3IS\n\tREG_TLBIVAE3IS                 =29721 /* 29721 */,  // S1_6_c8_c3_1 at min EL1: TLBIVAE3IS\n\tREG_TLBIVALE3IS                =29725 /* 29725 */,  // S1_6_c8_c3_5 at min EL1: TLBIVALE3IS\n\tREG_TLBIALLE3                  =29752 /* 29752 */,  // S1_6_c8_c7_0 at min EL1: TLBIALLE3\n\tREG_TLBIVAE3                   =29753 /* 29753 */,  // S1_6_c8_c7_1 at min EL1: TLBIVAE3\n\tREG_TLBIVALE3                  =29757 /* 29757 */,  // S1_6_c8_c7_5 at min EL1: TLBIVALE3\n\tREG_OSDTRRX_EL1                =32770 /* 32770 */,  // S2_0_c0_c0_2 at min EL1: OSDTRRX_EL1\n\tREG_DBGBVR0_EL1                =32772 /* 32772 */,  // S2_0_c0_c0_4 at min EL1: DBGBVR0_EL1\n\tREG_DBGBCR0_EL1                =32773 /* 32773 */,  // S2_0_c0_c0_5 at min EL1: DBGBCR0_EL1\n\tREG_DBGWVR0_EL1                =32774 /* 32774 */,  // S2_0_c0_c0_6 at min EL1: DBGWVR0_EL1\n\tREG_DBGWCR0_EL1                =32775 /* 32775 */,  // S2_0_c0_c0_7 at min EL1: DBGWCR0_EL1\n\tREG_DBGBVR1_EL1                =32780 /* 32780 */,  // S2_0_c0_c1_4 at min EL1: DBGBVR1_EL1\n\tREG_DBGBCR1_EL1                =32781 /* 32781 */,  // S2_0_c0_c1_5 at min EL1: DBGBCR1_EL1\n\tREG_DBGWVR1_EL1                =32782 /* 32782 */,  // S2_0_c0_c1_6 at min EL1: DBGWVR1_EL1\n\tREG_DBGWCR1_EL1                =32783 /* 32783 */,  // S2_0_c0_c1_7 at min EL1: DBGWCR1_EL1\n\tREG_MDCCINT_EL1                =32784 /* 32784 */,  // S2_0_c0_c2_0 at min EL1: MDCCINT_EL1\n\tREG_MDSCR_EL1                  =32786 /* 32786 */,  // S2_0_c0_c2_2 at min EL1: MDSCR_EL1\n\tREG_DBGBVR2_EL1                =32788 /* 32788 */,  // S2_0_c0_c2_4 at min EL1: DBGBVR2_EL1\n\tREG_DBGBCR2_EL1                =32789 /* 32789 */,  // S2_0_c0_c2_5 at min EL1: DBGBCR2_EL1\n\tREG_DBGWVR2_EL1                =32790 /* 32790 */,  // S2_0_c0_c2_6 at min EL1: DBGWVR2_EL1\n\tREG_DBGWCR2_EL1                =32791 /* 32791 */,  // S2_0_c0_c2_7 at min EL1: DBGWCR2_EL1\n\tREG_OSDTRTX_EL1                =32794 /* 32794 */,  // S2_0_c0_c3_2 at min EL1: OSDTRTX_EL1\n\tREG_DBGBVR3_EL1                =32796 /* 32796 */,  // S2_0_c0_c3_4 at min EL1: DBGBVR3_EL1\n\tREG_DBGBCR3_EL1                =32797 /* 32797 */,  // S2_0_c0_c3_5 at min EL1: DBGBCR3_EL1\n\tREG_DBGWVR3_EL1                =32798 /* 32798 */,  // S2_0_c0_c3_6 at min EL1: DBGWVR3_EL1\n\tREG_DBGWCR3_EL1                =32799 /* 32799 */,  // S2_0_c0_c3_7 at min EL1: DBGWCR3_EL1\n\tREG_DBGBVR4_EL1                =32804 /* 32804 */,  // S2_0_c0_c4_4 at min EL1: DBGBVR4_EL1\n\tREG_DBGBCR4_EL1                =32805 /* 32805 */,  // S2_0_c0_c4_5 at min EL1: DBGBCR4_EL1\n\tREG_DBGWVR4_EL1                =32806 /* 32806 */,  // S2_0_c0_c4_6 at min EL1: DBGWVR4_EL1\n\tREG_DBGWCR4_EL1                =32807 /* 32807 */,  // S2_0_c0_c4_7 at min EL1: DBGWCR4_EL1\n\tREG_DBGBVR5_EL1                =32812 /* 32812 */,  // S2_0_c0_c5_4 at min EL1: DBGBVR5_EL1\n\tREG_DBGBCR5_EL1                =32813 /* 32813 */,  // S2_0_c0_c5_5 at min EL1: DBGBCR5_EL1\n\tREG_DBGWVR5_EL1                =32814 /* 32814 */,  // S2_0_c0_c5_6 at min EL1: DBGWVR5_EL1\n\tREG_DBGWCR5_EL1                =32815 /* 32815 */,  // S2_0_c0_c5_7 at min EL1: DBGWCR5_EL1\n\tREG_DBGWFAR                    =32816 /* 32816 */,  // S2_0_c0_c6_0 at min EL1: DBGWFAR\n\tREG_OSECCR_EL1                 =32818 /* 32818 */,  // S2_0_c0_c6_2 at min EL1: OSECCR_EL1\n\tREG_DBGBVR6_EL1                =32820 /* 32820 */,  // S2_0_c0_c6_4 at min EL1: DBGBVR6_EL1\n\tREG_DBGBCR6_EL1                =32821 /* 32821 */,  // S2_0_c0_c6_5 at min EL1: DBGBCR6_EL1\n\tREG_DBGWVR6_EL1                =32822 /* 32822 */,  // S2_0_c0_c6_6 at min EL1: DBGWVR6_EL1\n\tREG_DBGWCR6_EL1                =32823 /* 32823 */,  // S2_0_c0_c6_7 at min EL1: DBGWCR6_EL1\n\tREG_DBGBVR7_EL1                =32828 /* 32828 */,  // S2_0_c0_c7_4 at min EL1: DBGBVR7_EL1\n\tREG_DBGBCR7_EL1                =32829 /* 32829 */,  // S2_0_c0_c7_5 at min EL1: DBGBCR7_EL1\n\tREG_DBGWVR7_EL1                =32830 /* 32830 */,  // S2_0_c0_c7_6 at min EL1: DBGWVR7_EL1\n\tREG_DBGWCR7_EL1                =32831 /* 32831 */,  // S2_0_c0_c7_7 at min EL1: DBGWCR7_EL1\n\tREG_DBGBVR8_EL1                =32836 /* 32836 */,  // S2_0_c0_c8_4 at min EL1: DBGBVR8_EL1\n\tREG_DBGBCR8_EL1                =32837 /* 32837 */,  // S2_0_c0_c8_5 at min EL1: DBGBCR8_EL1\n\tREG_DBGWVR8_EL1                =32838 /* 32838 */,  // S2_0_c0_c8_6 at min EL1: DBGWVR8_EL1\n\tREG_DBGWCR8_EL1                =32839 /* 32839 */,  // S2_0_c0_c8_7 at min EL1: DBGWCR8_EL1\n\tREG_DBGBVR9_EL1                =32844 /* 32844 */,  // S2_0_c0_c9_4 at min EL1: DBGBVR9_EL1\n\tREG_DBGBCR9_EL1                =32845 /* 32845 */,  // S2_0_c0_c9_5 at min EL1: DBGBCR9_EL1\n\tREG_DBGWVR9_EL1                =32846 /* 32846 */,  // S2_0_c0_c9_6 at min EL1: DBGWVR9_EL1\n\tREG_DBGWCR9_EL1                =32847 /* 32847 */,  // S2_0_c0_c9_7 at min EL1: DBGWCR9_EL1\n\tREG_DBGBVR10_EL1               =32852 /* 32852 */,  // S2_0_c0_c10_4 at min EL1: DBGBVR10_EL1\n\tREG_DBGBCR10_EL1               =32853 /* 32853 */,  // S2_0_c0_c10_5 at min EL1: DBGBCR10_EL1\n\tREG_DBGWVR10_EL1               =32854 /* 32854 */,  // S2_0_c0_c10_6 at min EL1: DBGWVR10_EL1\n\tREG_DBGWCR10_EL1               =32855 /* 32855 */,  // S2_0_c0_c10_7 at min EL1: DBGWCR10_EL1\n\tREG_DBGBVR11_EL1               =32860 /* 32860 */,  // S2_0_c0_c11_4 at min EL1: DBGBVR11_EL1\n\tREG_DBGBCR11_EL1               =32861 /* 32861 */,  // S2_0_c0_c11_5 at min EL1: DBGBCR11_EL1\n\tREG_DBGWVR11_EL1               =32862 /* 32862 */,  // S2_0_c0_c11_6 at min EL1: DBGWVR11_EL1\n\tREG_DBGWCR11_EL1               =32863 /* 32863 */,  // S2_0_c0_c11_7 at min EL1: DBGWCR11_EL1\n\tREG_DBGBVR12_EL1               =32868 /* 32868 */,  // S2_0_c0_c12_4 at min EL1: DBGBVR12_EL1\n\tREG_DBGBCR12_EL1               =32869 /* 32869 */,  // S2_0_c0_c12_5 at min EL1: DBGBCR12_EL1\n\tREG_DBGWVR12_EL1               =32870 /* 32870 */,  // S2_0_c0_c12_6 at min EL1: DBGWVR12_EL1\n\tREG_DBGWCR12_EL1               =32871 /* 32871 */,  // S2_0_c0_c12_7 at min EL1: DBGWCR12_EL1\n\tREG_DBGBVR13_EL1               =32876 /* 32876 */,  // S2_0_c0_c13_4 at min EL1: DBGBVR13_EL1\n\tREG_DBGBCR13_EL1               =32877 /* 32877 */,  // S2_0_c0_c13_5 at min EL1: DBGBCR13_EL1\n\tREG_DBGWVR13_EL1               =32878 /* 32878 */,  // S2_0_c0_c13_6 at min EL1: DBGWVR13_EL1\n\tREG_DBGWCR13_EL1               =32879 /* 32879 */,  // S2_0_c0_c13_7 at min EL1: DBGWCR13_EL1\n\tREG_DBGBVR14_EL1               =32884 /* 32884 */,  // S2_0_c0_c14_4 at min EL1: DBGBVR14_EL1\n\tREG_DBGBCR14_EL1               =32885 /* 32885 */,  // S2_0_c0_c14_5 at min EL1: DBGBCR14_EL1\n\tREG_DBGWVR14_EL1               =32886 /* 32886 */,  // S2_0_c0_c14_6 at min EL1: DBGWVR14_EL1\n\tREG_DBGWCR14_EL1               =32887 /* 32887 */,  // S2_0_c0_c14_7 at min EL1: DBGWCR14_EL1\n\tREG_DBGBVR15_EL1               =32892 /* 32892 */,  // S2_0_c0_c15_4 at min EL1: DBGBVR15_EL1\n\tREG_DBGBCR15_EL1               =32893 /* 32893 */,  // S2_0_c0_c15_5 at min EL1: DBGBCR15_EL1\n\tREG_DBGWVR15_EL1               =32894 /* 32894 */,  // S2_0_c0_c15_6 at min EL1: DBGWVR15_EL1\n\tREG_DBGWCR15_EL1               =32895 /* 32895 */,  // S2_0_c0_c15_7 at min EL1: DBGWCR15_EL1\n\tREG_MDRAR_EL1                  =32896 /* 32896 */,  // S2_0_c1_c0_0 at min EL1: MDRAR_EL1\n\tREG_OSLAR_EL1                  =32900 /* 32900 */,  // S2_0_c1_c0_4 at min EL1: OSLAR_EL1\n\tREG_OSLSR_EL1                  =32908 /* 32908 */,  // S2_0_c1_c1_4 at min EL1: OSLSR_EL1\n\tREG_OSDLR_EL1                  =32924 /* 32924 */,  // S2_0_c1_c3_4 at min EL1: OSDLR_EL1\n\tREG_DBGPRCR_EL1                =32932 /* 32932 */,  // S2_0_c1_c4_4 at min EL1: DBGPRCR_EL1\n\tREG_DBGCLAIMSET_EL1            =33734 /* 33734 */,  // S2_0_c7_c8_6 at min EL1: DBGCLAIMSET_EL1\n\tREG_DBGCLAIMCLR_EL1            =33742 /* 33742 */,  // S2_0_c7_c9_6 at min EL1: DBGCLAIMCLR_EL1\n\tREG_DBGAUTHSTAT_EL1            =33782 /* 33782 */,  // S2_0_c7_c14_6 at min EL1: DBGAUTHSTAT_EL1\n\tREG_TRCTRACEIDR                =34817 /* 34817 */,\n\tREG_TRCVICTLR                  =34818 /* 34818 */,\n\tREG_TRCSEQEVR0                 =34820 /* 34820 */,\n\tREG_TRCCNTRLDVR0               =34821 /* 34821 */,\n\tREG_TRCIMSPEC0                 =34823 /* 34823 */,\n\tREG_TRCPRGCTLR                 =34824 /* 34824 */,\n\tREG_TRCQCTLR                   =34825 /* 34825 */,\n\tREG_TRCVIIECTLR                =34826 /* 34826 */,\n\tREG_TRCSEQEVR1                 =34828 /* 34828 */,\n\tREG_TRCCNTRLDVR1               =34829 /* 34829 */,\n\tREG_TRCIMSPEC1                 =34831 /* 34831 */,\n\tREG_TRCPROCSELR                =34832 /* 34832 */,\n\tREG_TRCVISSCTLR                =34834 /* 34834 */,\n\tREG_TRCSEQEVR2                 =34836 /* 34836 */,\n\tREG_TRCCNTRLDVR2               =34837 /* 34837 */,\n\tREG_TRCIMSPEC2                 =34839 /* 34839 */,\n\tREG_TRCVIPCSSCTLR              =34842 /* 34842 */,\n\tREG_TRCCNTRLDVR3               =34845 /* 34845 */,\n\tREG_TRCIMSPEC3                 =34847 /* 34847 */,\n\tREG_TRCCONFIGR                 =34848 /* 34848 */,\n\tREG_TRCCNTCTLR0                =34853 /* 34853 */,\n\tREG_TRCIMSPEC4                 =34855 /* 34855 */,\n\tREG_TRCCNTCTLR1                =34861 /* 34861 */,\n\tREG_TRCIMSPEC5                 =34863 /* 34863 */,\n\tREG_TRCAUXCTLR                 =34864 /* 34864 */,\n\tREG_TRCSEQRSTEVR               =34868 /* 34868 */,\n\tREG_TRCCNTCTLR2                =34869 /* 34869 */,\n\tREG_TRCIMSPEC6                 =34871 /* 34871 */,\n\tREG_TRCSEQSTR                  =34876 /* 34876 */,\n\tREG_TRCCNTCTLR3                =34877 /* 34877 */,\n\tREG_TRCIMSPEC7                 =34879 /* 34879 */,\n\tREG_TRCEVENTCTL0R              =34880 /* 34880 */,\n\tREG_TRCVDCTLR                  =34882 /* 34882 */,\n\tREG_TRCEXTINSELR               =34884 /* 34884 */,\n\tREG_TRCCNTVR0                  =34885 /* 34885 */,\n\tREG_TRCEVENTCTL1R              =34888 /* 34888 */,\n\tREG_TRCVDSACCTLR               =34890 /* 34890 */,\n\tREG_TRCEXTINSELR1              =34892 /* 34892 */,\n\tREG_TRCCNTVR1                  =34893 /* 34893 */,\n\tREG_TRCRSR                     =34896 /* 34896 */,\n\tREG_TRCVDARCCTLR               =34898 /* 34898 */,\n\tREG_TRCEXTINSELR2              =34900 /* 34900 */,\n\tREG_TRCCNTVR2                  =34901 /* 34901 */,\n\tREG_TRCSTALLCTLR               =34904 /* 34904 */,\n\tREG_TRCEXTINSELR3              =34908 /* 34908 */,\n\tREG_TRCCNTVR3                  =34909 /* 34909 */,\n\tREG_TRCTSCTLR                  =34912 /* 34912 */,\n\tREG_TRCSYNCPR                  =34920 /* 34920 */,\n\tREG_TRCCCCTLR                  =34928 /* 34928 */,\n\tREG_TRCBBCTLR                  =34936 /* 34936 */,\n\tREG_TRCRSCTLR16                =34945 /* 34945 */,\n\tREG_TRCSSCCR0                  =34946 /* 34946 */,\n\tREG_TRCSSPCICR0                =34947 /* 34947 */,\n\tREG_TRCOSLAR                   =34948 /* 34948 */,\n\tREG_TRCRSCTLR17                =34953 /* 34953 */,\n\tREG_TRCSSCCR1                  =34954 /* 34954 */,\n\tREG_TRCSSPCICR1                =34955 /* 34955 */,\n\tREG_TRCRSCTLR2                 =34960 /* 34960 */,\n\tREG_TRCRSCTLR18                =34961 /* 34961 */,\n\tREG_TRCSSCCR2                  =34962 /* 34962 */,\n\tREG_TRCSSPCICR2                =34963 /* 34963 */,\n\tREG_TRCRSCTLR3                 =34968 /* 34968 */,\n\tREG_TRCRSCTLR19                =34969 /* 34969 */,\n\tREG_TRCSSCCR3                  =34970 /* 34970 */,\n\tREG_TRCSSPCICR3                =34971 /* 34971 */,\n\tREG_TRCRSCTLR4                 =34976 /* 34976 */,\n\tREG_TRCRSCTLR20                =34977 /* 34977 */,\n\tREG_TRCSSCCR4                  =34978 /* 34978 */,\n\tREG_TRCSSPCICR4                =34979 /* 34979 */,\n\tREG_TRCPDCR                    =34980 /* 34980 */,\n\tREG_TRCRSCTLR5                 =34984 /* 34984 */,\n\tREG_TRCRSCTLR21                =34985 /* 34985 */,\n\tREG_TRCSSCCR5                  =34986 /* 34986 */,\n\tREG_TRCSSPCICR5                =34987 /* 34987 */,\n\tREG_TRCRSCTLR6                 =34992 /* 34992 */,\n\tREG_TRCRSCTLR22                =34993 /* 34993 */,\n\tREG_TRCSSCCR6                  =34994 /* 34994 */,\n\tREG_TRCSSPCICR6                =34995 /* 34995 */,\n\tREG_TRCRSCTLR7                 =35000 /* 35000 */,\n\tREG_TRCRSCTLR23                =35001 /* 35001 */,\n\tREG_TRCSSCCR7                  =35002 /* 35002 */,\n\tREG_TRCSSPCICR7                =35003 /* 35003 */,\n\tREG_TRCRSCTLR8                 =35008 /* 35008 */,\n\tREG_TRCRSCTLR24                =35009 /* 35009 */,\n\tREG_TRCSSCSR0                  =35010 /* 35010 */,\n\tREG_TRCRSCTLR9                 =35016 /* 35016 */,\n\tREG_TRCRSCTLR25                =35017 /* 35017 */,\n\tREG_TRCSSCSR1                  =35018 /* 35018 */,\n\tREG_TRCRSCTLR10                =35024 /* 35024 */,\n\tREG_TRCRSCTLR26                =35025 /* 35025 */,\n\tREG_TRCSSCSR2                  =35026 /* 35026 */,\n\tREG_TRCRSCTLR11                =35032 /* 35032 */,\n\tREG_TRCRSCTLR27                =35033 /* 35033 */,\n\tREG_TRCSSCSR3                  =35034 /* 35034 */,\n\tREG_TRCRSCTLR12                =35040 /* 35040 */,\n\tREG_TRCRSCTLR28                =35041 /* 35041 */,\n\tREG_TRCSSCSR4                  =35042 /* 35042 */,\n\tREG_TRCRSCTLR13                =35048 /* 35048 */,\n\tREG_TRCRSCTLR29                =35049 /* 35049 */,\n\tREG_TRCSSCSR5                  =35050 /* 35050 */,\n\tREG_TRCRSCTLR14                =35056 /* 35056 */,\n\tREG_TRCRSCTLR30                =35057 /* 35057 */,\n\tREG_TRCSSCSR6                  =35058 /* 35058 */,\n\tREG_TRCRSCTLR15                =35064 /* 35064 */,\n\tREG_TRCRSCTLR31                =35065 /* 35065 */,\n\tREG_TRCSSCSR7                  =35066 /* 35066 */,\n\tREG_TRCACVR0                   =35072 /* 35072 */,\n\tREG_TRCACVR8                   =35073 /* 35073 */,\n\tREG_TRCACATR0                  =35074 /* 35074 */,\n\tREG_TRCACATR8                  =35075 /* 35075 */,\n\tREG_TRCDVCVR0                  =35076 /* 35076 */,\n\tREG_TRCDVCVR4                  =35077 /* 35077 */,\n\tREG_TRCDVCMR0                  =35078 /* 35078 */,\n\tREG_TRCDVCMR4                  =35079 /* 35079 */,\n\tREG_TRCACVR1                   =35088 /* 35088 */,\n\tREG_TRCACVR9                   =35089 /* 35089 */,\n\tREG_TRCACATR1                  =35090 /* 35090 */,\n\tREG_TRCACATR9                  =35091 /* 35091 */,\n\tREG_TRCACVR2                   =35104 /* 35104 */,\n\tREG_TRCACVR10                  =35105 /* 35105 */,\n\tREG_TRCACATR2                  =35106 /* 35106 */,\n\tREG_TRCACATR10                 =35107 /* 35107 */,\n\tREG_TRCDVCVR1                  =35108 /* 35108 */,\n\tREG_TRCDVCVR5                  =35109 /* 35109 */,\n\tREG_TRCDVCMR1                  =35110 /* 35110 */,\n\tREG_TRCDVCMR5                  =35111 /* 35111 */,\n\tREG_TRCACVR3                   =35120 /* 35120 */,\n\tREG_TRCACVR11                  =35121 /* 35121 */,\n\tREG_TRCACATR3                  =35122 /* 35122 */,\n\tREG_TRCACATR11                 =35123 /* 35123 */,\n\tREG_TRCACVR4                   =35136 /* 35136 */,\n\tREG_TRCACVR12                  =35137 /* 35137 */,\n\tREG_TRCACATR4                  =35138 /* 35138 */,\n\tREG_TRCACATR12                 =35139 /* 35139 */,\n\tREG_TRCDVCVR2                  =35140 /* 35140 */,\n\tREG_TRCDVCVR6                  =35141 /* 35141 */,\n\tREG_TRCDVCMR2                  =35142 /* 35142 */,\n\tREG_TRCDVCMR6                  =35143 /* 35143 */,\n\tREG_TRCACVR5                   =35152 /* 35152 */,\n\tREG_TRCACVR13                  =35153 /* 35153 */,\n\tREG_TRCACATR5                  =35154 /* 35154 */,\n\tREG_TRCACATR13                 =35155 /* 35155 */,\n\tREG_TRCACVR6                   =35168 /* 35168 */,\n\tREG_TRCACVR14                  =35169 /* 35169 */,\n\tREG_TRCACATR6                  =35170 /* 35170 */,\n\tREG_TRCACATR14                 =35171 /* 35171 */,\n\tREG_TRCDVCVR3                  =35172 /* 35172 */,\n\tREG_TRCDVCVR7                  =35173 /* 35173 */,\n\tREG_TRCDVCMR3                  =35174 /* 35174 */,\n\tREG_TRCDVCMR7                  =35175 /* 35175 */,\n\tREG_TRCACVR7                   =35184 /* 35184 */,\n\tREG_TRCACVR15                  =35185 /* 35185 */,\n\tREG_TRCACATR7                  =35186 /* 35186 */,\n\tREG_TRCACATR15                 =35187 /* 35187 */,\n\tREG_TRCCIDCVR0                 =35200 /* 35200 */,\n\tREG_TRCVMIDCVR0                =35201 /* 35201 */,\n\tREG_TRCCIDCCTLR0               =35202 /* 35202 */,\n\tREG_TRCCIDCCTLR1               =35210 /* 35210 */,\n\tREG_TRCCIDCVR1                 =35216 /* 35216 */,\n\tREG_TRCVMIDCVR1                =35217 /* 35217 */,\n\tREG_TRCVMIDCCTLR0              =35218 /* 35218 */,\n\tREG_TRCVMIDCCTLR1              =35226 /* 35226 */,\n\tREG_TRCCIDCVR2                 =35232 /* 35232 */,\n\tREG_TRCVMIDCVR2                =35233 /* 35233 */,\n\tREG_TRCCIDCVR3                 =35248 /* 35248 */,\n\tREG_TRCVMIDCVR3                =35249 /* 35249 */,\n\tREG_TRCCIDCVR4                 =35264 /* 35264 */,\n\tREG_TRCVMIDCVR4                =35265 /* 35265 */,\n\tREG_TRCCIDCVR5                 =35280 /* 35280 */,\n\tREG_TRCVMIDCVR5                =35281 /* 35281 */,\n\tREG_TRCCIDCVR6                 =35296 /* 35296 */,\n\tREG_TRCVMIDCVR6                =35297 /* 35297 */,\n\tREG_TRCCIDCVR7                 =35312 /* 35312 */,\n\tREG_TRCVMIDCVR7                =35313 /* 35313 */,\n\tREG_TRCITCTRL                  =35716 /* 35716 */,\n\tREG_TRCCLAIMSET                =35782 /* 35782 */,\n\tREG_TRCCLAIMCLR                =35790 /* 35790 */,\n\tREG_TRCLAR                     =35814 /* 35814 */,\n\tREG_TEECR32_EL1                =36864 /* 36864 */,  // S2_2_c0_c0_0 at min EL1: TEECR32_EL1\n\tREG_TEEHBR32_EL1               =36992 /* 36992 */,  // S2_2_c1_c0_0 at min EL1: TEEHBR32_EL1\n\tREG_MDCCSR_EL0                 =38920 /* 38920 */,  // S2_3_c0_c1_0 at min EL1: MDCCSR_EL0\n\tREG_DBGDTR_EL0                 =38944 /* 38944 */,  // S2_3_c0_c4_0 at min EL0: DBGDTR_EL0\n\tREG_DBGDTRRX_EL0               =38952 /* 38952 */,  // S2_3_c0_c5_0 at min EL0: DBGDTRRX_EL0\n\tREG_DBGDTRTX_EL0               =38952 /* 38952 */,\n\tREG_DBGVCR32_EL2               =41016 /* 41016 */,  // S2_4_c0_c7_0 at min EL2: DBGVCR32_EL2\n\tREG_MIDR_EL1                   =49152 /* 49152 */,  // S3_0_c0_c0_0 at min EL1: MIDR_EL1\n\tREG_MPIDR_EL1                  =49157 /* 49157 */,  // S3_0_c0_c0_5 at min EL1: MPIDR_EL1\n\tREG_REVIDR_EL1                 =49158 /* 49158 */,  // S3_0_c0_c0_6 at min EL1: REVIDR_EL1\n\tREG_ID_PFR0_EL1                =49160 /* 49160 */,  // S3_0_c0_c1_0 at min EL1: ID_PFR0_EL1\n\tREG_ID_PFR1_EL1                =49161 /* 49161 */,  // S3_0_c0_c1_1 at min EL1: ID_PFR1_EL1\n\tREG_ID_DFR0_EL1                =49162 /* 49162 */,  // S3_0_c0_c1_2 at min EL1: ID_DFR0_EL1\n\tREG_ID_AFR0_EL1                =49163 /* 49163 */,  // S3_0_c0_c1_3 at min EL1: ID_AFR0_EL1\n\tREG_ID_MMFR0_EL1               =49164 /* 49164 */,  // S3_0_c0_c1_4 at min EL1: ID_MMFR0_EL1\n\tREG_ID_MMFR1_EL1               =49165 /* 49165 */,  // S3_0_c0_c1_5 at min EL1: ID_MMFR1_EL1\n\tREG_ID_MMFR2_EL1               =49166 /* 49166 */,  // S3_0_c0_c1_6 at min EL1: ID_MMFR2_EL1\n\tREG_ID_MMFR3_EL1               =49167 /* 49167 */,  // S3_0_c0_c1_7 at min EL1: ID_MMFR3_EL1\n\tREG_ID_ISAR0_EL1               =49168 /* 49168 */,  // S3_0_c0_c2_0 at min EL1: ID_ISAR0_EL1\n\tREG_ID_ISAR1_EL1               =49169 /* 49169 */,  // S3_0_c0_c2_1 at min EL1: ID_ISAR1_EL1\n\tREG_ID_ISAR2_EL1               =49170 /* 49170 */,  // S3_0_c0_c2_2 at min EL1: ID_ISAR2_EL1\n\tREG_ID_ISAR3_EL1               =49171 /* 49171 */,  // S3_0_c0_c2_3 at min EL1: ID_ISAR3_EL1\n\tREG_ID_ISAR4_EL1               =49172 /* 49172 */,  // S3_0_c0_c2_4 at min EL1: ID_ISAR4_EL1\n\tREG_ID_ISAR5_EL1               =49173 /* 49173 */,  // S3_0_c0_c2_5 at min EL1: ID_ISAR5_EL1\n\tREG_ID_MMFR4_EL1               =49174 /* 49174 */,  // S3_0_c0_c2_6 at min EL1: ID_MMFR4_EL1\n\tREG_ID_ISAR6_EL1               =49175 /* 49175 */,  // S3_0_c0_c2_7 at min EL1: ID_ISAR6_EL1\n\tREG_MVFR0_EL1                  =49176 /* 49176 */,  // S3_0_c0_c3_0 at min EL1: MVFR0_EL1\n\tREG_MVFR1_EL1                  =49177 /* 49177 */,  // S3_0_c0_c3_1 at min EL1: MVFR1_EL1\n\tREG_MVFR2_EL1                  =49178 /* 49178 */,  // S3_0_c0_c3_2 at min EL1: MVFR2_EL1\n\tREG_ID_AA32RES3_EL1            =49179 /* 49179 */,  // S3_0_c0_c3_3 at min EL1: ID_AA32RES3_EL1\n\tREG_ID_PFR2_EL1                =49180 /* 49180 */,  // S3_0_c0_c3_4 at min EL1: ID_PFR2_EL1\n\tREG_ID_AA32RES5_EL1            =49181 /* 49181 */,  // S3_0_c0_c3_5 at min EL1: ID_AA32RES5_EL1\n\tREG_ID_AA32RES6_EL1            =49182 /* 49182 */,  // S3_0_c0_c3_6 at min EL1: ID_AA32RES6_EL1\n\tREG_ID_AA32RES7_EL1            =49183 /* 49183 */,  // S3_0_c0_c3_7 at min EL1: ID_AA32RES7_EL1\n\tREG_ID_AA64PFR0_EL1            =49184 /* 49184 */,  // S3_0_c0_c4_0 at min EL1: ID_AA64PFR0_EL1\n\tREG_ID_AA64PFR1_EL1            =49185 /* 49185 */,  // S3_0_c0_c4_1 at min EL1: ID_AA64PFR1_EL1\n\tREG_ID_AA64PFR2_EL1            =49186 /* 49186 */,  // S3_0_c0_c4_2 at min EL1: ID_AA64PFR2_EL1\n\tREG_ID_AA64PFR3_EL1            =49187 /* 49187 */,  // S3_0_c0_c4_3 at min EL1: ID_AA64PFR3_EL1\n\tREG_ID_AA64ZFR0_EL1            =49188 /* 49188 */,  // S3_0_c0_c4_4 at min EL1: ID_AA64ZFR0_EL1\n\tREG_ID_AA64SMFR0_EL1           =49189 /* 49189 */,  // S3_0_c0_c4_5 at min EL1: ID_AA64SMFR0_EL1\n\tREG_ID_AA64ZFR2_EL1            =49190 /* 49190 */,  // S3_0_c0_c4_6 at min EL1: ID_AA64ZFR2_EL1\n\tREG_ID_AA64ZFR3_EL1            =49191 /* 49191 */,  // S3_0_c0_c4_7 at min EL1: ID_AA64ZFR3_EL1\n\tREG_ID_AA64DFR0_EL1            =49192 /* 49192 */,  // S3_0_c0_c5_0 at min EL1: ID_AA64DFR0_EL1\n\tREG_ID_AA64DFR1_EL1            =49193 /* 49193 */,  // S3_0_c0_c5_1 at min EL1: ID_AA64DFR1_EL1\n\tREG_ID_AA64DFR2_EL1            =49194 /* 49194 */,  // S3_0_c0_c5_2 at min EL1: ID_AA64DFR2_EL1\n\tREG_ID_AA64DFR3_EL1            =49195 /* 49195 */,  // S3_0_c0_c5_3 at min EL1: ID_AA64DFR3_EL1\n\tREG_ID_AA64AFR0_EL1            =49196 /* 49196 */,  // S3_0_c0_c5_4 at min EL1: ID_AA64AFR0_EL1\n\tREG_ID_AA64AFR1_EL1            =49197 /* 49197 */,  // S3_0_c0_c5_5 at min EL1: ID_AA64AFR1_EL1\n\tREG_ID_AA64AFR2_EL1            =49198 /* 49198 */,  // S3_0_c0_c5_6 at min EL1: ID_AA64AFR2_EL1\n\tREG_ID_AA64AFR3_EL1            =49199 /* 49199 */,  // S3_0_c0_c5_7 at min EL1: ID_AA64AFR3_EL1\n\tREG_ID_AA64ISAR0_EL1           =49200 /* 49200 */,  // S3_0_c0_c6_0 at min EL1: ID_AA64ISAR0_EL1\n\tREG_ID_AA64ISAR1_EL1           =49201 /* 49201 */,  // S3_0_c0_c6_1 at min EL1: ID_AA64ISAR1_EL1\n\tREG_ID_AA64ISAR2_EL1           =49202 /* 49202 */,  // S3_0_c0_c6_2 at min EL1: ID_AA64ISAR2_EL1\n\tREG_ID_AA64ISAR3_EL1           =49203 /* 49203 */,  // S3_0_c0_c6_3 at min EL1: ID_AA64ISAR3_EL1\n\tREG_ID_AA64ISAR4_EL1           =49204 /* 49204 */,  // S3_0_c0_c6_4 at min EL1: ID_AA64ISAR4_EL1\n\tREG_ID_AA64ISAR5_EL1           =49205 /* 49205 */,  // S3_0_c0_c6_5 at min EL1: ID_AA64ISAR5_EL1\n\tREG_ID_AA64ISAR6_EL1           =49206 /* 49206 */,  // S3_0_c0_c6_6 at min EL1: ID_AA64ISAR6_EL1\n\tREG_ID_AA64ISAR7_EL1           =49207 /* 49207 */,  // S3_0_c0_c6_7 at min EL1: ID_AA64ISAR7_EL1\n\tREG_ID_AA64MMFR0_EL1           =49208 /* 49208 */,  // S3_0_c0_c7_0 at min EL1: ID_AA64MMFR0_EL1\n\tREG_ID_AA64MMFR1_EL1           =49209 /* 49209 */,  // S3_0_c0_c7_1 at min EL1: ID_AA64MMFR1_EL1\n\tREG_ID_AA64MMFR2_EL1           =49210 /* 49210 */,  // S3_0_c0_c7_2 at min EL1: ID_AA64MMFR2_EL1\n\tREG_ID_AA64MMFR3_EL1           =49211 /* 49211 */,  // S3_0_c0_c7_3 at min EL1: ID_AA64MMFR3_EL1\n\tREG_ID_AA64MMFR4_EL1           =49212 /* 49212 */,  // S3_0_c0_c7_4 at min EL1: ID_AA64MMFR4_EL1\n\tREG_ID_AA64MMFR5_EL1           =49213 /* 49213 */,  // S3_0_c0_c7_5 at min EL1: ID_AA64MMFR5_EL1\n\tREG_ID_AA64MMFR6_EL1           =49214 /* 49214 */,  // S3_0_c0_c7_6 at min EL1: ID_AA64MMFR6_EL1\n\tREG_ID_AA64MMFR7_EL1           =49215 /* 49215 */,  // S3_0_c0_c7_7 at min EL1: ID_AA64MMFR7_EL1\n\tREG_SCTLR_EL1                  =49280 /* 49280 */,  // S3_0_c1_c0_0 at min EL1: SCTLR_EL1\n\tREG_ACTLR_EL1                  =49281 /* 49281 */,  // S3_0_c1_c0_1 at min EL1: ACTLR_EL1\n\tREG_CPACR_EL1                  =49282 /* 49282 */,  // S3_0_c1_c0_2 at min EL1: CPACR_EL1\n\tREG_RGSR_EL1                   =49285 /* 49285 */,\n\tREG_GCR_EL1                    =49286 /* 49286 */,\n\tREG_TRFCR_EL1                  =49297 /* 49297 */,\n\tREG_SMPRI_EL1                  =49300 /* 49300 */,  // S3_0_c1_c2_4 at min EL1: SMPRI_EL1\n\tREG_SMCR_EL1                   =49302 /* 49302 */,  // S3_0_c1_c2_6 at min EL1: SMCR_EL1\n\tREG_TTBR0_EL1                  =49408 /* 49408 */,  // S3_0_c2_c0_0 at min EL1: TTBR0_EL1\n\tREG_TTBR1_EL1                  =49409 /* 49409 */,  // S3_0_c2_c0_1 at min EL1: TTBR1_EL1\n\tREG_TCR_EL1                    =49410 /* 49410 */,  // S3_0_c2_c0_2 at min EL1: TCR_EL1\n\tREG_APIAKEYLO_EL1              =49416 /* 49416 */,  // S3_0_c2_c1_0 at min EL1: APIAKeyLo_EL1\n\tREG_APIAKEYHI_EL1              =49417 /* 49417 */,  // S3_0_c2_c1_1 at min EL1: APIAKeyHi_EL1\n\tREG_APIBKEYLO_EL1              =49418 /* 49418 */,  // S3_0_c2_c1_2 at min EL1: APIBKeyLo_EL1\n\tREG_APIBKEYHI_EL1              =49419 /* 49419 */,  // S3_0_c2_c1_3 at min EL1: APIBKeyHi_EL1\n\tREG_APDAKEYLO_EL1              =49424 /* 49424 */,  // S3_0_c2_c2_0 at min EL1: APDAKeyLo_EL1\n\tREG_APDAKEYHI_EL1              =49425 /* 49425 */,  // S3_0_c2_c2_1 at min EL1: APDAKeyHi_EL1\n\tREG_APDBKEYLO_EL1              =49426 /* 49426 */,  // S3_0_c2_c2_2 at min EL1: APDBKeyLo_EL1\n\tREG_APDBKEYHI_EL1              =49427 /* 49427 */,  // S3_0_c2_c2_3 at min EL1: APDBKeyHi_EL1\n\tREG_APGAKEYLO_EL1              =49432 /* 49432 */,  // S3_0_c2_c3_0 at min EL1: APGAKeyLo_EL1\n\tREG_APGAKEYHI_EL1              =49433 /* 49433 */,  // S3_0_c2_c3_1 at min EL1: APGAKeyHi_EL1\n\tREG_SPSR_EL1                   =49664 /* 49664 */,  // S3_0_c4_c0_0 at min EL1: SPSR_EL1\n\tREG_ELR_EL1                    =49665 /* 49665 */,  // S3_0_c4_c0_1 at min EL1: ELR_EL1\n\tREG_SP_EL0                     =49672 /* 49672 */,  // S3_0_c4_c1_0 at min EL1: SP_EL0\n\tREG_SPSEL                      =49680 /* 49680 */,  // S3_0_c4_c2_0 at min EL1: SPSEL\n\tREG_CURRENTEL                  =49682 /* 49682 */,  // S3_0_c4_c2_2 at min EL1: CurrentEL\n\tREG_PAN                        =49683 /* 49683 */,  // S3_0_c4_c2_3 at min EL1: PAN\n\tREG_UAO                        =49684 /* 49684 */,  // S3_0_c4_c2_4 at min EL1: UAO\n\tREG_ICV_PMR_EL1                =49712 /* 49712 */,  // S3_0_c4_c6_0 at min EL1: ICV_PMR_EL1\n\tREG_ICC_PMR_EL1                =49712 /* 49712 */,\n\tREG_AFSR0_EL1                  =49800 /* 49800 */,  // S3_0_c5_c1_0 at min EL1: AFSR0_EL1\n\tREG_AFSR1_EL1                  =49801 /* 49801 */,  // S3_0_c5_c1_1 at min EL1: AFSR1_EL1\n\tREG_ESR_EL1                    =49808 /* 49808 */,  // S3_0_c5_c2_0 at min EL1: ESR_EL1\n\tREG_ERRIDR_EL1                 =49816 /* 49816 */,  // S3_0_c5_c3_0 at min EL1: ERRIDR_EL1\n\tREG_ERRSELR_EL1                =49817 /* 49817 */,\n\tREG_ERXCTLR_EL1                =49825 /* 49825 */,\n\tREG_ERXSTATUS_EL1              =49826 /* 49826 */,\n\tREG_ERXADDR_EL1                =49827 /* 49827 */,\n\tREG_ERXPFGCTL_EL1              =49829 /* 49829 */,\n\tREG_ERXPFGCDN_EL1              =49830 /* 49830 */,\n\tREG_ERXMISC0_EL1               =49832 /* 49832 */,\n\tREG_ERXMISC1_EL1               =49833 /* 49833 */,\n\tREG_ERXMISC2_EL1               =49834 /* 49834 */,\n\tREG_ERXMISC3_EL1               =49835 /* 49835 */,\n\tREG_ERXTS_EL1                  =49839 /* 49839 */,\n\tREG_TFSR_EL1                   =49840 /* 49840 */,\n\tREG_TFSRE0_EL1                 =49841 /* 49841 */,\n\tREG_FAR_EL1                    =49920 /* 49920 */,  // S3_0_c6_c0_0 at min EL1: FAR_EL1\n\tREG_PAR_EL1                    =50080 /* 50080 */,  // S3_0_c7_c4_0 at min EL1: PAR_EL1\n\tREG_PMSCR_EL1                  =50376 /* 50376 */,\n\tREG_PMSICR_EL1                 =50378 /* 50378 */,\n\tREG_PMSIRR_EL1                 =50379 /* 50379 */,\n\tREG_PMSFCR_EL1                 =50380 /* 50380 */,\n\tREG_PMSEVFR_EL1                =50381 /* 50381 */,\n\tREG_PMSLATFR_EL1               =50382 /* 50382 */,\n\tREG_PMSIDR_EL1                 =50383 /* 50383 */,\n\tREG_PMBLIMITR_EL1              =50384 /* 50384 */,\n\tREG_PMBPTR_EL1                 =50385 /* 50385 */,\n\tREG_PMBSR_EL1                  =50387 /* 50387 */,\n\tREG_PMBIDR_EL1                 =50391 /* 50391 */,\n\tREG_TRBLIMITR_EL1              =50392 /* 50392 */,\n\tREG_TRBPTR_EL1                 =50393 /* 50393 */,\n\tREG_TRBBASER_EL1               =50394 /* 50394 */,\n\tREG_TRBSR_EL1                  =50395 /* 50395 */,\n\tREG_TRBMAR_EL1                 =50396 /* 50396 */,\n\tREG_TRBTRG_EL1                 =50398 /* 50398 */,\n\tREG_PMINTENSET_EL1             =50417 /* 50417 */,\n\tREG_PMINTENCLR_EL1             =50418 /* 50418 */,\n\tREG_PMMIR_EL1                  =50422 /* 50422 */,\n\tREG_MAIR_EL1                   =50448 /* 50448 */,  // S3_0_c10_c2_0 at min EL1: MAIR_EL1\n\tREG_AMAIR_EL1                  =50456 /* 50456 */,  // S3_0_c10_c3_0 at min EL1: AMAIR_EL1\n\tREG_LORSA_EL1                  =50464 /* 50464 */,  // S3_0_c10_c4_0 at min EL1: LORSA_EL1\n\tREG_LOREA_EL1                  =50465 /* 50465 */,  // S3_0_c10_c4_1 at min EL1: LOREA_EL1\n\tREG_LORN_EL1                   =50466 /* 50466 */,  // S3_0_c10_c4_2 at min EL1: LORN_EL1\n\tREG_LORC_EL1                   =50467 /* 50467 */,  // S3_0_c10_c4_3 at min EL1: LORC_EL1\n\tREG_LORID_EL1                  =50471 /* 50471 */,  // S3_0_c10_c4_7 at min EL1: LORID_EL1\n\tREG_MPAM1_EL1                  =50472 /* 50472 */,\n\tREG_MPAM0_EL1                  =50473 /* 50473 */,\n\tREG_CTRR_C_LWR_EL1             =50560 /* 50560 */,  // S3_0_c11_c0_0 at min EL1: CTRR_C_LWR_EL1\n\tREG_CTRR_C_UPR_EL1             =50561 /* 50561 */,  // S3_0_c11_c0_1 at min EL1: CTRR_C_UPR_EL1\n\tREG_CTRR_D_LWR_EL1             =50562 /* 50562 */,  // S3_0_c11_c0_2 at min EL1: CTRR_D_LWR_EL1\n\tREG_CTRR_D_UPR_EL1             =50563 /* 50563 */,  // S3_0_c11_c0_3 at min EL1: CTRR_D_UPR_EL1\n\tREG_CTRR_C_LWR_EL12            =50564 /* 50564 */,  // S3_0_c11_c0_4 at min EL2: CTRR_C_LWR_EL12\n\tREG_CTRR_C_UPR_EL12            =50565 /* 50565 */,  // S3_0_c11_c0_5 at min EL2: CTRR_C_UPR_EL12\n\tREG_CTRR_D_LWR_EL12            =50566 /* 50566 */,  // S3_0_c11_c0_6 at min EL2: CTRR_D_LWR_EL12\n\tREG_CTRR_D_UPR_EL12            =50567 /* 50567 */,  // S3_0_c11_c0_7 at min EL2: CTRR_D_UPR_EL12\n\tREG_CTRR_C_LWR_EL2             =50568 /* 50568 */,  // S3_0_c11_c1_0 at min EL2: CTRR_C_LWR_EL2\n\tREG_CTRR_C_UPR_EL2             =50569 /* 50569 */,  // S3_0_c11_c1_1 at min EL2: CTRR_C_UPR_EL2\n\tREG_CTRR_D_LWR_EL2             =50570 /* 50570 */,  // S3_0_c11_c1_2 at min EL2: CTRR_D_LWR_EL2\n\tREG_CTRR_D_UPR_EL2             =50571 /* 50571 */,  // S3_0_c11_c1_3 at min EL2: CTRR_D_UPR_EL2\n\tREG_CTRR_C_CTL_EL1             =50572 /* 50572 */,  // S3_0_c11_c1_4 at min EL1: CTRR_C_CTL_EL1\n\tREG_CTRR_D_CTL_EL1             =50573 /* 50573 */,  // S3_0_c11_c1_5 at min EL1: CTRR_D_CTL_EL1\n\tREG_CTRR_C_CTL_EL12            =50574 /* 50574 */,  // S3_0_c11_c1_6 at min EL2: CTRR_C_CTL_EL12\n\tREG_CTRR_D_CTL_EL12            =50575 /* 50575 */,  // S3_0_c11_c1_7 at min EL2: CTRR_D_CTL_EL12\n\tREG_CTRR_C_CTL_EL2             =50576 /* 50576 */,  // S3_0_c11_c2_0 at min EL2: CTRR_C_CTL_EL2\n\tREG_CTRR_D_CTL_EL2             =50577 /* 50577 */,  // S3_0_c11_c2_1 at min EL2: CTRR_D_CTL_EL2\n\tREG_CTXR_A_LWR_EL1             =50578 /* 50578 */,  // S3_0_c11_c2_2 at min EL1: CTXR_A_LWR_EL1\n\tREG_CTXR_A_UPR_EL1             =50579 /* 50579 */,  // S3_0_c11_c2_3 at min EL1: CTXR_A_UPR_EL1\n\tREG_CTXR_B_LWR_EL1             =50580 /* 50580 */,  // S3_0_c11_c2_4 at min EL1: CTXR_B_LWR_EL1\n\tREG_CTXR_B_UPR_EL1             =50581 /* 50581 */,  // S3_0_c11_c2_5 at min EL1: CTXR_B_UPR_EL1\n\tREG_CTXR_C_LWR_EL1             =50582 /* 50582 */,  // S3_0_c11_c2_6 at min EL1: CTXR_C_LWR_EL1\n\tREG_CTXR_C_UPR_EL1             =50583 /* 50583 */,  // S3_0_c11_c2_7 at min EL1: CTXR_C_UPR_EL1\n\tREG_CTXR_D_LWR_EL1             =50584 /* 50584 */,  // S3_0_c11_c3_0 at min EL1: CTXR_D_LWR_EL1\n\tREG_CTXR_D_UPR_EL1             =50585 /* 50585 */,  // S3_0_c11_c3_1 at min EL1: CTXR_D_UPR_EL1\n\tREG_CTXR_A_LWR_EL12            =50586 /* 50586 */,  // S3_0_c11_c3_2 at min EL2: CTXR_A_LWR_EL12\n\tREG_CTXR_A_UPR_EL12            =50587 /* 50587 */,  // S3_0_c11_c3_3 at min EL2: CTXR_A_UPR_EL12\n\tREG_CTXR_B_LWR_EL12            =50588 /* 50588 */,  // S3_0_c11_c3_4 at min EL2: CTXR_B_LWR_EL12\n\tREG_CTXR_B_UPR_EL12            =50589 /* 50589 */,  // S3_0_c11_c3_5 at min EL2: CTXR_B_UPR_EL12\n\tREG_CTXR_C_LWR_EL12            =50590 /* 50590 */,  // S3_0_c11_c3_6 at min EL2: CTXR_C_LWR_EL12\n\tREG_CTXR_C_UPR_EL12            =50591 /* 50591 */,  // S3_0_c11_c3_7 at min EL2: CTXR_C_UPR_EL12\n\tREG_CTXR_D_LWR_EL12            =50592 /* 50592 */,  // S3_0_c11_c4_0 at min EL2: CTXR_D_LWR_EL12\n\tREG_CTXR_D_UPR_EL12            =50593 /* 50593 */,  // S3_0_c11_c4_1 at min EL2: CTXR_D_UPR_EL12\n\tREG_CTXR_A_LWR_EL2             =50594 /* 50594 */,  // S3_0_c11_c4_2 at min EL2: CTXR_A_LWR_EL2\n\tREG_CTXR_A_UPR_EL2             =50595 /* 50595 */,  // S3_0_c11_c4_3 at min EL2: CTXR_A_UPR_EL2\n\tREG_CTXR_B_LWR_EL2             =50596 /* 50596 */,  // S3_0_c11_c4_4 at min EL2: CTXR_B_LWR_EL2\n\tREG_CTXR_B_UPR_EL2             =50597 /* 50597 */,  // S3_0_c11_c4_5 at min EL2: CTXR_B_UPR_EL2\n\tREG_CTXR_C_LWR_EL2             =50598 /* 50598 */,  // S3_0_c11_c4_6 at min EL2: CTXR_C_LWR_EL2\n\tREG_CTXR_C_UPR_EL2             =50599 /* 50599 */,  // S3_0_c11_c4_7 at min EL2: CTXR_C_UPR_EL2\n\tREG_CTXR_D_LWR_EL2             =50600 /* 50600 */,  // S3_0_c11_c5_0 at min EL2: CTXR_D_LWR_EL2\n\tREG_CTXR_D_UPR_EL2             =50601 /* 50601 */,  // S3_0_c11_c5_1 at min EL2: CTXR_D_UPR_EL2\n\tREG_CTXR_A_CTL_EL1             =50602 /* 50602 */,  // S3_0_c11_c5_2 at min EL1: CTXR_A_CTL_EL1\n\tREG_CTXR_B_CTL_EL1             =50603 /* 50603 */,  // S3_0_c11_c5_3 at min EL1: CTXR_B_CTL_EL1\n\tREG_CTXR_C_CTL_EL1             =50604 /* 50604 */,  // S3_0_c11_c5_4 at min EL1: CTXR_C_CTL_EL1\n\tREG_CTXR_D_CTL_EL1             =50605 /* 50605 */,  // S3_0_c11_c5_5 at min EL1: CTXR_D_CTL_EL1\n\tREG_CTXR_A_CTL_EL12            =50606 /* 50606 */,  // S3_0_c11_c5_6 at min EL2: CTXR_A_CTL_EL12\n\tREG_CTXR_B_CTL_EL12            =50607 /* 50607 */,  // S3_0_c11_c5_7 at min EL2: CTXR_B_CTL_EL12\n\tREG_CTXR_C_CTL_EL12            =50608 /* 50608 */,  // S3_0_c11_c6_0 at min EL2: CTXR_C_CTL_EL12\n\tREG_CTXR_D_CTL_EL12            =50609 /* 50609 */,  // S3_0_c11_c6_1 at min EL2: CTXR_D_CTL_EL12\n\tREG_CTXR_A_CTL_EL2             =50610 /* 50610 */,  // S3_0_c11_c6_2 at min EL2: CTXR_A_CTL_EL2\n\tREG_CTXR_B_CTL_EL2             =50611 /* 50611 */,  // S3_0_c11_c6_3 at min EL2: CTXR_B_CTL_EL2\n\tREG_CTXR_C_CTL_EL2             =50612 /* 50612 */,  // S3_0_c11_c6_4 at min EL2: CTXR_C_CTL_EL2\n\tREG_CTXR_D_CTL_EL2             =50613 /* 50613 */,  // S3_0_c11_c6_5 at min EL2: CTXR_D_CTL_EL2\n\tREG_ACC_CTRR_C_LWR_EL2         =50614 /* 50614 */,  // S3_0_c11_c6_6 at min EL2: ACC_CTRR_C_LWR_EL2\n\tREG_ACC_CTRR_C_UPR_EL2         =50615 /* 50615 */,  // S3_0_c11_c6_7 at min EL2: ACC_CTRR_C_UPR_EL2\n\tREG_ACC_CTRR_D_LWR_EL2         =50616 /* 50616 */,  // S3_0_c11_c7_0 at min EL2: ACC_CTRR_D_LWR_EL2\n\tREG_ACC_CTRR_D_UPR_EL2         =50617 /* 50617 */,  // S3_0_c11_c7_1 at min EL2: ACC_CTRR_D_UPR_EL2\n\tREG_ACC_CTXR_A_LWR_EL2         =50618 /* 50618 */,  // S3_0_c11_c7_2 at min EL2: ACC_CTXR_A_LWR_EL2\n\tREG_ACC_CTXR_A_UPR_EL2         =50619 /* 50619 */,  // S3_0_c11_c7_3 at min EL2: ACC_CTXR_A_UPR_EL2\n\tREG_ACC_CTXR_B_LWR_EL2         =50620 /* 50620 */,  // S3_0_c11_c7_4 at min EL2: ACC_CTXR_B_LWR_EL2\n\tREG_ACC_CTXR_B_UPR_EL2         =50621 /* 50621 */,  // S3_0_c11_c7_5 at min EL2: ACC_CTXR_B_UPR_EL2\n\tREG_ACC_CTXR_C_LWR_EL2         =50622 /* 50622 */,  // S3_0_c11_c7_6 at min EL2: ACC_CTXR_C_LWR_EL2\n\tREG_ACC_CTXR_C_UPR_EL2         =50623 /* 50623 */,  // S3_0_c11_c7_7 at min EL2: ACC_CTXR_C_UPR_EL2\n\tREG_ACC_CTXR_D_LWR_EL2         =50624 /* 50624 */,  // S3_0_c11_c8_0 at min EL2: ACC_CTXR_D_LWR_EL2\n\tREG_ACC_CTXR_D_UPR_EL2         =50625 /* 50625 */,  // S3_0_c11_c8_1 at min EL2: ACC_CTXR_D_UPR_EL2\n\tREG_ACC_CTRR_C_CTL_EL2         =50626 /* 50626 */,  // S3_0_c11_c8_2 at min EL2: ACC_CTRR_C_CTL_EL2\n\tREG_ACC_CTRR_D_CTL_EL2         =50627 /* 50627 */,  // S3_0_c11_c8_3 at min EL2: ACC_CTRR_D_CTL_EL2\n\tREG_ACC_CTXR_A_CTL_EL2         =50628 /* 50628 */,  // S3_0_c11_c8_4 at min EL2: ACC_CTXR_A_CTL_EL2\n\tREG_ACC_CTXR_B_CTL_EL2         =50629 /* 50629 */,  // S3_0_c11_c8_5 at min EL2: ACC_CTXR_B_CTL_EL2\n\tREG_ACC_CTXR_C_CTL_EL2         =50630 /* 50630 */,  // S3_0_c11_c8_6 at min EL2: ACC_CTXR_C_CTL_EL2\n\tREG_ACC_CTXR_D_CTL_EL2         =50631 /* 50631 */,  // S3_0_c11_c8_7 at min EL2: ACC_CTXR_D_CTL_EL2\n\tREG_VBAR_EL1                   =50688 /* 50688 */,  // S3_0_c12_c0_0 at min EL1: VBAR_EL1\n\tREG_RVBAR_EL1                  =50689 /* 50689 */,  // S3_0_c12_c0_1 at min EL1: RVBAR_EL1\n\tREG_RMR_EL1                    =50690 /* 50690 */,  // S3_0_c12_c0_2 at min EL1: RMR_EL1\n\tREG_ISR_EL1                    =50696 /* 50696 */,  // S3_0_c12_c1_0 at min EL1: ISR_EL1\n\tREG_DISR_EL1                   =50697 /* 50697 */,  // S3_0_c12_c1_1 at min EL1: DISR_EL1\n\tREG_ICV_IAR0_EL1               =50752 /* 50752 */,  // S3_0_c12_c8_0 at min EL1: ICV_IAR0_EL1\n\tREG_ICV_EOIR0_EL1              =50753 /* 50753 */,  // S3_0_c12_c8_1 at min EL1: ICV_EOIR0_EL1\n\tREG_ICC_EOIR0_EL1              =50753 /* 50753 */,\n\tREG_ICV_HPPIR0_EL1             =50754 /* 50754 */,  // S3_0_c12_c8_2 at min EL1: ICV_HPPIR0_EL1\n\tREG_ICV_BPR0_EL1               =50755 /* 50755 */,  // S3_0_c12_c8_3 at min EL1: ICV_BPR0_EL1\n\tREG_ICC_BPR0_EL1               =50755 /* 50755 */,\n\tREG_ICC_AP0R0_EL1              =50756 /* 50756 */,  // S3_0_c12_c8_4 at min EL1: ICC_AP0R0_EL1\n\tREG_ICC_AP0R1_EL1              =50757 /* 50757 */,\n\tREG_ICC_AP0R2_EL1              =50758 /* 50758 */,\n\tREG_ICC_AP0R3_EL1              =50759 /* 50759 */,\n\tREG_ICC_AP1R0_EL1              =50760 /* 50760 */,  // S3_0_c12_c9_0 at min EL1: ICC_AP1R0_EL1\n\tREG_ICC_AP1R1_EL1              =50761 /* 50761 */,\n\tREG_ICC_AP1R2_EL1              =50762 /* 50762 */,\n\tREG_ICC_AP1R3_EL1              =50763 /* 50763 */,\n\tREG_ICV_DIR_EL1                =50777 /* 50777 */,  // S3_0_c12_c11_1 at min EL1: ICV_DIR_EL1\n\tREG_ICC_DIR_EL1                =50777 /* 50777 */,\n\tREG_ICV_RPR_EL1                =50779 /* 50779 */,  // S3_0_c12_c11_3 at min EL1: ICV_RPR_EL1\n\tREG_ICC_SGI1R_EL1              =50781 /* 50781 */,  // S3_0_c12_c11_5 at min EL1: ICC_SGI1R_EL1\n\tREG_ICC_ASGI1R_EL1             =50782 /* 50782 */,  // S3_0_c12_c11_6 at min EL1: ICC_ASGI1R_EL1\n\tREG_ICC_SGI0R_EL1              =50783 /* 50783 */,  // S3_0_c12_c11_7 at min EL1: ICC_SGI0R_EL1\n\tREG_ICV_IAR1_EL1               =50784 /* 50784 */,  // S3_0_c12_c12_0 at min EL1: ICV_IAR1_EL1\n\tREG_ICV_EOIR1_EL1              =50785 /* 50785 */,  // S3_0_c12_c12_1 at min EL1: ICV_EOIR1_EL1\n\tREG_ICC_EOIR1_EL1              =50785 /* 50785 */,\n\tREG_ICV_HPPIR1_EL1             =50786 /* 50786 */,  // S3_0_c12_c12_2 at min EL1: ICV_HPPIR1_EL1\n\tREG_ICV_BPR1CBPR_EL1           =50787 /* 50787 */,  // S3_0_c12_c12_3 at min EL1: ICV_BPR1CBPR_EL1\n\tREG_ICC_BPR1_EL1               =50787 /* 50787 */,\n\tREG_ICV_CTLR_EL1               =50788 /* 50788 */,  // S3_0_c12_c12_4 at min EL1: ICV_CTLR_EL1\n\tREG_ICC_CTLR_EL1               =50788 /* 50788 */,\n\tREG_ICC_SRE_EL1                =50789 /* 50789 */,  // S3_0_c12_c12_5 at min EL1: ICC_SRE_EL1\n\tREG_ICV_IGRPEN0_EL1            =50790 /* 50790 */,  // S3_0_c12_c12_6 at min EL1: ICV_IGRPEN0_EL1\n\tREG_ICC_IGRPEN0_EL1            =50790 /* 50790 */,\n\tREG_ICV_IGRPEN1_EL1            =50791 /* 50791 */,  // S3_0_c12_c12_7 at min EL1: ICV_IGRPEN1_EL1\n\tREG_ICC_IGRPEN1_EL1            =50791 /* 50791 */,\n\tREG_ICC_SEIEN_EL1              =50792 /* 50792 */,\n\tREG_CONTEXTIDR_EL1             =50817 /* 50817 */,  // S3_0_c13_c0_1 at min EL1: CONTEXTIDR_EL1\n\tREG_TPIDR_EL1                  =50820 /* 50820 */,  // S3_0_c13_c0_4 at min EL1: TPIDR_EL1\n\tREG_SCXTNUM_EL1                =50823 /* 50823 */,  // S3_0_c13_c0_7 at min EL1: SCXTNUM_EL1\n\tREG_CNTHCTL_EL21               =50952 /* 50952 */,  // S3_0_c14_c1_0 at min EL1: CNTHCTL_EL21\n\tREG_CNTKCTL_EL1                =50952 /* 50952 */,\n\tREG_HID0                       =51072 /* 51072 */,  // S3_0_c15_c0_0 at min EL1: HID0\n\tREG_HID25                      =51074 /* 51074 */,  // S3_0_c15_c0_2 at min EL1: HID25\n\tREG_HID26                      =51075 /* 51075 */,  // S3_0_c15_c0_3 at min EL1: HID26\n\tREG_HID27                      =51076 /* 51076 */,  // S3_0_c15_c0_4 at min EL1: HID27\n\tREG_HID28                      =51077 /* 51077 */,  // S3_0_c15_c0_5 at min EL1: HID28\n\tREG_HID29                      =51078 /* 51078 */,  // S3_0_c15_c0_6 at min EL1: HID29\n\tREG_HID34                      =51079 /* 51079 */,  // S3_0_c15_c0_7 at min EL1: HID34\n\tREG_HID1                       =51080 /* 51080 */,  // S3_0_c15_c1_0 at min EL1: HID1\n\tREG_HID21                      =51083 /* 51083 */,  // S3_0_c15_c1_3 at min EL1: HID21\n\tREG_BIUVCSCUPCMDCRD            =51084 /* 51084 */,  // S3_0_c15_c1_4 at min EL1: BiuVCSCUpCmdCrd\n\tREG_BIUVCSCUPDATCRD            =51085 /* 51085 */,  // S3_0_c15_c1_5 at min EL1: BiuVCSCUpDatCrd\n\tREG_HID2                       =51088 /* 51088 */,  // S3_0_c15_c2_0 at min EL1: HID2\n\tREG_HID30                      =51091 /* 51091 */,  // S3_0_c15_c2_3 at min EL1: HID30\n\tREG_HID31                      =51092 /* 51092 */,  // S3_0_c15_c2_4 at min EL1: HID31\n\tREG_HID32                      =51093 /* 51093 */,  // S3_0_c15_c2_5 at min EL1: HID32\n\tREG_HID33                      =51095 /* 51095 */,  // S3_0_c15_c2_7 at min EL1: HID33\n\tREG_HID3                       =51096 /* 51096 */,  // S3_0_c15_c3_0 at min EL1: HID3\n\tREG_BIUVCSCUPCMDCRDC2          =51098 /* 51098 */,  // S3_0_c15_c3_2 at min EL1: BiuVCSCUpCmdCrdC2\n\tREG_BIUVCSCUPDATCRDC2          =51099 /* 51099 */,  // S3_0_c15_c3_3 at min EL1: BiuVCSCUpDatCrdC2\n\tREG_HID4                       =51104 /* 51104 */,  // S3_0_c15_c4_0 at min EL1: HID4\n\tREG_HID5                       =51112 /* 51112 */,  // S3_0_c15_c5_0 at min EL1: HID5\n\tREG_HID6                       =51120 /* 51120 */,  // S3_0_c15_c6_0 at min EL1: HID6\n\tREG_HID7                       =51128 /* 51128 */,  // S3_0_c15_c7_0 at min EL1: HID7\n\tREG_HID8                       =51136 /* 51136 */,  // S3_0_c15_c8_0 at min EL1: HID8\n\tREG_HID9                       =51144 /* 51144 */,  // S3_0_c15_c9_0 at min EL1: HID9\n\tREG_HID10                      =51152 /* 51152 */,  // S3_0_c15_c10_0 at min EL1: HID10\n\tREG_BLOCK_CMAINT_CFG           =51154 /* 51154 */,  // S3_0_c15_c10_2 at min EL1: BLOCK_CMAINT_CFG\n\tREG_HID11                      =51160 /* 51160 */,  // S3_0_c15_c11_0 at min EL1: HID11\n\tREG_HID18                      =51162 /* 51162 */,  // S3_0_c15_c11_2 at min EL1: HID18\n\tREG_HID36                      =51164 /* 51164 */,  // S3_0_c15_c11_4 at min EL1: HID36\n\tREG_HID37                      =51165 /* 51165 */,  // S3_0_c15_c11_5 at min EL1: HID37\n\tREG_HID12                      =51168 /* 51168 */,  // S3_0_c15_c12_0 at min EL1: HID12\n\tREG_HID15                      =51169 /* 51169 */,  // S3_0_c15_c12_1 at min EL1: HID15\n\tREG_HID19                      =51170 /* 51170 */,  // S3_0_c15_c12_2 at min EL1: HID19\n\tREG_BIU_TLIMIT                 =51176 /* 51176 */,  // S3_0_c15_c13_0 at min EL1: BIU_TLIMIT\n\tREG_HID13                      =51184 /* 51184 */,  // S3_0_c15_c14_0 at min EL1: HID13\n\tREG_HID_RCTX_G0CTL             =51186 /* 51186 */,  // S3_0_c15_c14_2 at min EL1: HID_RCTX_G0CTL\n\tREG_HID_RCTX_G1CTL             =51187 /* 51187 */,  // S3_0_c15_c14_3 at min EL1: HID_RCTX_G1CTL\n\tREG_HID14                      =51192 /* 51192 */,  // S3_0_c15_c15_0 at min EL1: HID14\n\tREG_HID16                      =51194 /* 51194 */,  // S3_0_c15_c15_2 at min EL1: HID16\n\tREG_LLC_WRR2                   =51195 /* 51195 */,  // S3_0_c15_c15_3 at min EL1: LLC_WRR2\n\tREG_BIU_AFI_CFG                =51196 /* 51196 */,  // S3_0_c15_c15_4 at min EL1: BIU_AFI_CFG\n\tREG_HID17                      =51197 /* 51197 */,  // S3_0_c15_c15_5 at min EL1: HID17\n\tREG_HID24                      =51198 /* 51198 */,  // S3_0_c15_c15_6 at min EL1: HID24\n\tREG_HID35                      =51199 /* 51199 */,  // S3_0_c15_c15_7 at min EL1: HID35\n\tREG_CCSIDR_EL1                 =51200 /* 51200 */,  // S3_1_c0_c0_0 at min EL1: CCSIDR_EL1\n\tREG_CLIDR_EL1                  =51201 /* 51201 */,  // S3_1_c0_c0_1 at min EL1: CLIDR_EL1\n\tREG_SMIDR_EL1                  =51206 /* 51206 */,  // S3_1_c0_c0_6 at min EL1: SMIDR_EL1\n\tREG_AIDR_EL1                   =51207 /* 51207 */,  // S3_1_c0_c0_7 at min EL1: AIDR_EL1\n\tREG_PMCR0_EL1                  =53120 /* 53120 */,  // S3_1_c15_c0_0 at min EL1: PMCR0_EL1\n\tREG_APPL_CONTEXTPTR            =53121 /* 53121 */,  // S3_1_c15_c0_1 at min EL1: APPL_CONTEXTPTR\n\tREG_LD_LATPROF_CTL_EL1         =53122 /* 53122 */,  // S3_1_c15_c0_2 at min EL1: LD_LATPROF_CTL_EL1\n\tREG_AON_CPU_MSTALL_CTL01_EL1   =53123 /* 53123 */,  // S3_1_c15_c0_3 at min EL1: AON_CPU_MSTALL_CTL01_EL1\n\tREG_PM_MEMFLT_CTL23_EL1        =53124 /* 53124 */,  // S3_1_c15_c0_4 at min EL1: PM_MEMFLT_CTL23_EL1\n\tREG_AGTCNTHV_CTL_EL21          =53125 /* 53125 */,  // S3_1_c15_c0_5 at min EL1: AGTCNTHV_CTL_EL21\n\tREG_AGTCNTVCTSS_NOREDIR_EL0    =53126 /* 53126 */,  // S3_1_c15_c0_6 at min EL1: AGTCNTVCTSS_NOREDIR_EL0\n\tREG_PMCR1_EL1                  =53128 /* 53128 */,  // S3_1_c15_c1_0 at min EL1: PMCR1_EL1\n\tREG_LD_LATPROF_CTR_EL1         =53130 /* 53130 */,  // S3_1_c15_c1_2 at min EL1: LD_LATPROF_CTR_EL1\n\tREG_AON_CPU_MSTALL_CTL23_EL1   =53131 /* 53131 */,  // S3_1_c15_c1_3 at min EL1: AON_CPU_MSTALL_CTL23_EL1\n\tREG_PM_MEMFLT_CTL45_EL1        =53132 /* 53132 */,  // S3_1_c15_c1_4 at min EL1: PM_MEMFLT_CTL45_EL1\n\tREG_AGTCNTRDIR_EL1             =53133 /* 53133 */,  // S3_1_c15_c1_5 at min EL1: AGTCNTRDIR_EL1\n\tREG_AGTCNTHCTL_NOREDIR_EL21    =53134 /* 53134 */,  // S3_1_c15_c1_6 at min EL1: AGTCNTHCTL_NOREDIR_EL21\n\tREG_PMCR2_EL1                  =53136 /* 53136 */,  // S3_1_c15_c2_0 at min EL1: PMCR2_EL1\n\tREG_LD_LATPROF_STS_EL1         =53138 /* 53138 */,  // S3_1_c15_c2_2 at min EL1: LD_LATPROF_STS_EL1\n\tREG_AON_CPU_MSTALL_CTL45_EL1   =53139 /* 53139 */,  // S3_1_c15_c2_3 at min EL1: AON_CPU_MSTALL_CTL45_EL1\n\tREG_AGTCNTHP_CVAL_EL2          =53140 /* 53140 */,  // S3_1_c15_c2_4 at min EL2: AGTCNTHP_CVAL_EL2\n\tREG_CNTVCT_NOREDIR_EL0         =53141 /* 53141 */,  // S3_1_c15_c2_5 at min EL1: CNTVCT_NOREDIR_EL0\n\tREG_AGTCNTHP_CVAL_NOREDIR_EL21 =53142 /* 53142 */,  // S3_1_c15_c2_6 at min EL1: AGTCNTHP_CVAL_NOREDIR_EL21\n\tREG_PMCR3_EL1                  =53144 /* 53144 */,  // S3_1_c15_c3_0 at min EL1: PMCR3_EL1\n\tREG_LD_LATPROF_INF_EL1         =53146 /* 53146 */,  // S3_1_c15_c3_2 at min EL1: LD_LATPROF_INF_EL1\n\tREG_AON_CPU_MSTALL_CTL67_EL1   =53147 /* 53147 */,  // S3_1_c15_c3_3 at min EL1: AON_CPU_MSTALL_CTL67_EL1\n\tREG_AGTCNTHP_TVAL_EL2          =53148 /* 53148 */,  // S3_1_c15_c3_4 at min EL2: AGTCNTHP_TVAL_EL2\n\tREG_CNTPCTSS_NOREDIR_EL0       =53149 /* 53149 */,  // S3_1_c15_c3_5 at min EL1: CNTPCTSS_NOREDIR_EL0\n\tREG_AGTCNTHP_TVAL_NOREDIR_EL21 =53150 /* 53150 */,  // S3_1_c15_c3_6 at min EL1: AGTCNTHP_TVAL_NOREDIR_EL21\n\tREG_PMCR4_EL1                  =53152 /* 53152 */,  // S3_1_c15_c4_0 at min EL1: PMCR4_EL1\n\tREG_LD_LATPROF_CTL_EL2         =53154 /* 53154 */,  // S3_1_c15_c4_2 at min EL2: LD_LATPROF_CTL_EL2\n\tREG_AON_CPU_MEMFLT_CTL01_EL1   =53155 /* 53155 */,  // S3_1_c15_c4_3 at min EL1: AON_CPU_MEMFLT_CTL01_EL1\n\tREG_AGTCNTHP_CTL_EL2           =53156 /* 53156 */,  // S3_1_c15_c4_4 at min EL2: AGTCNTHP_CTL_EL2\n\tREG_CNTVCTSS_NOREDIR_EL0       =53157 /* 53157 */,  // S3_1_c15_c4_5 at min EL1: CNTVCTSS_NOREDIR_EL0\n\tREG_AGTCNTHP_CTL_NOREDIR_EL21  =53158 /* 53158 */,  // S3_1_c15_c4_6 at min EL1: AGTCNTHP_CTL_NOREDIR_EL21\n\tREG_PMESR0_EL1                 =53160 /* 53160 */,  // S3_1_c15_c5_0 at min EL1: PMESR0_EL1\n\tREG_LD_LATPROF_CMD_EL1         =53162 /* 53162 */,  // S3_1_c15_c5_2 at min EL1: LD_LATPROF_CMD_EL1\n\tREG_AON_CPU_MEMFLT_CTL23_EL1   =53163 /* 53163 */,  // S3_1_c15_c5_3 at min EL1: AON_CPU_MEMFLT_CTL23_EL1\n\tREG_AGTCNTHV_CVAL_EL2          =53164 /* 53164 */,  // S3_1_c15_c5_4 at min EL2: AGTCNTHV_CVAL_EL2\n\tREG_AGTCNTHV_CVAL_NOREDIR_EL21 =53166 /* 53166 */,  // S3_1_c15_c5_6 at min EL1: AGTCNTHV_CVAL_NOREDIR_EL21\n\tREG_PMESR1_EL1                 =53168 /* 53168 */,  // S3_1_c15_c6_0 at min EL1: PMESR1_EL1\n\tREG_PMCR1_EL2                  =53170 /* 53170 */,  // S3_1_c15_c6_2 at min EL2: PMCR1_EL2\n\tREG_AON_CPU_MEMFLT_CTL45_EL1   =53171 /* 53171 */,  // S3_1_c15_c6_3 at min EL1: AON_CPU_MEMFLT_CTL45_EL1\n\tREG_AGTCNTHV_TVAL_EL2          =53172 /* 53172 */,  // S3_1_c15_c6_4 at min EL2: AGTCNTHV_TVAL_EL2\n\tREG_CNTHCTL_NOREDIR_EL21       =53173 /* 53173 */,  // S3_1_c15_c6_5 at min EL1: CNTHCTL_NOREDIR_EL21\n\tREG_AGTCNTHV_TVAL_NOREDIR_EL21 =53174 /* 53174 */,  // S3_1_c15_c6_6 at min EL1: AGTCNTHV_TVAL_NOREDIR_EL21\n\tREG_OPMAT0_EL1                 =53176 /* 53176 */,  // S3_1_c15_c7_0 at min EL1: OPMAT0_EL1\n\tREG_PMCR1_EL12                 =53178 /* 53178 */,  // S3_1_c15_c7_2 at min EL2: PMCR1_EL12\n\tREG_AON_CPU_MEMFLT_CTL67_EL1   =53179 /* 53179 */,  // S3_1_c15_c7_3 at min EL1: AON_CPU_MEMFLT_CTL67_EL1\n\tREG_AGTCNTHV_CTL_EL2           =53180 /* 53180 */,  // S3_1_c15_c7_4 at min EL2: AGTCNTHV_CTL_EL2\n\tREG_CNTHP_CVAL_NOREDIR_EL21    =53181 /* 53181 */,  // S3_1_c15_c7_5 at min EL1: CNTHP_CVAL_NOREDIR_EL21\n\tREG_AGTCNTHV_CTL_NOREDIR_EL21  =53182 /* 53182 */,  // S3_1_c15_c7_6 at min EL1: AGTCNTHV_CTL_NOREDIR_EL21\n\tREG_OPMAT1_EL1                 =53184 /* 53184 */,  // S3_1_c15_c8_0 at min EL1: OPMAT1_EL1\n\tREG_PMCR1_GL12                 =53186 /* 53186 */,  // S3_1_c15_c8_2 at min EL2: PMCR1_GL12\n\tREG_AON_CPU_MSTALL_CTR0_EL1    =53187 /* 53187 */,  // S3_1_c15_c8_3 at min EL1: AON_CPU_MSTALL_CTR0_EL1\n\tREG_AGTCNTFRQ_EL0              =53188 /* 53188 */,  // S3_1_c15_c8_4 at min EL1: AGTCNTFRQ_EL0\n\tREG_CNTHP_TVAL_NOREDIR_EL21    =53189 /* 53189 */,  // S3_1_c15_c8_5 at min EL1: CNTHP_TVAL_NOREDIR_EL21\n\tREG_CNTPCT_NOREDIR_EL0         =53190 /* 53190 */,  // S3_1_c15_c8_6 at min EL1: CNTPCT_NOREDIR_EL0\n\tREG_OPMSK0_EL1                 =53192 /* 53192 */,  // S3_1_c15_c9_0 at min EL1: OPMSK0_EL1\n\tREG_LD_LATPROF_CTL_EL12        =53194 /* 53194 */,  // S3_1_c15_c9_2 at min EL2: LD_LATPROF_CTL_EL12\n\tREG_AON_CPU_MSTALL_CTR1_EL1    =53195 /* 53195 */,  // S3_1_c15_c9_3 at min EL1: AON_CPU_MSTALL_CTR1_EL1\n\tREG_AGTCNTVOFF_EL2             =53196 /* 53196 */,  // S3_1_c15_c9_4 at min EL2: AGTCNTVOFF_EL2\n\tREG_CNTHP_CTL_NOREDIR_EL21     =53197 /* 53197 */,  // S3_1_c15_c9_5 at min EL1: CNTHP_CTL_NOREDIR_EL21\n\tREG_CNTHV_CTL_NOREDIR_EL21     =53198 /* 53198 */,  // S3_1_c15_c9_6 at min EL1: CNTHV_CTL_NOREDIR_EL21\n\tREG_OPMSK1_EL1                 =53200 /* 53200 */,  // S3_1_c15_c10_0 at min EL1: OPMSK1_EL1\n\tREG_LD_LATPROF_INF_EL2         =53202 /* 53202 */,  // S3_1_c15_c10_2 at min EL2: LD_LATPROF_INF_EL2\n\tREG_AON_CPU_MSTALL_CTR2_EL1    =53203 /* 53203 */,  // S3_1_c15_c10_3 at min EL1: AON_CPU_MSTALL_CTR2_EL1\n\tREG_AGTCNTHP_CVAL_EL21         =53204 /* 53204 */,  // S3_1_c15_c10_4 at min EL1: AGTCNTHP_CVAL_EL21\n\tREG_CNTHV_CVAL_NOREDIR_EL21    =53205 /* 53205 */,  // S3_1_c15_c10_5 at min EL1: CNTHV_CVAL_NOREDIR_EL21\n\tREG_AGTCNTPCT_NOREDIR_EL0      =53206 /* 53206 */,  // S3_1_c15_c10_6 at min EL1: AGTCNTPCT_NOREDIR_EL0\n\tREG_AON_CPU_MSTALL_CTR3_EL1    =53211 /* 53211 */,  // S3_1_c15_c11_3 at min EL1: AON_CPU_MSTALL_CTR3_EL1\n\tREG_AGTCNTHP_TVAL_EL21         =53212 /* 53212 */,  // S3_1_c15_c11_4 at min EL1: AGTCNTHP_TVAL_EL21\n\tREG_CNTHV_TVAL_NOREDIR_EL21    =53213 /* 53213 */,  // S3_1_c15_c11_5 at min EL1: CNTHV_TVAL_NOREDIR_EL21\n\tREG_VMSA_HV_LOCK_EL2           =53214 /* 53214 */,  // S3_1_c15_c11_6 at min EL2: VMSA_HV_LOCK_EL2\n\tREG_PMSWCTRL_EL1               =53216 /* 53216 */,  // S3_1_c15_c12_0 at min EL1: PMSWCTRL_EL1\n\tREG_PMCR5_EL0                  =53217 /* 53217 */,  // S3_1_c15_c12_1 at min EL1: PMCR5_EL0\n\tREG_AON_CPU_MSTALL_CTR4_EL1    =53219 /* 53219 */,  // S3_1_c15_c12_3 at min EL1: AON_CPU_MSTALL_CTR4_EL1\n\tREG_PMCOMPARE0_EL1             =53220 /* 53220 */,  // S3_1_c15_c12_4 at min EL1: PMCompare0_EL1\n\tREG_PMCOMPARE1_EL1             =53221 /* 53221 */,  // S3_1_c15_c12_5 at min EL1: PMCompare1_EL1\n\tREG_VMSA_NV_LOCK_EL2           =53222 /* 53222 */,  // S3_1_c15_c12_6 at min EL2: VMSA_NV_LOCK_EL2\n\tREG_PMSR_EL1                   =53224 /* 53224 */,  // S3_1_c15_c13_0 at min EL1: PMSR_EL1\n\tREG_AON_CPU_MSTALL_CTR5_EL1    =53227 /* 53227 */,  // S3_1_c15_c13_3 at min EL1: AON_CPU_MSTALL_CTR5_EL1\n\tREG_AGTCNTHP_CTL_EL21          =53228 /* 53228 */,  // S3_1_c15_c13_4 at min EL1: AGTCNTHP_CTL_EL21\n\tREG_PMCOMPARE5_EL1             =53229 /* 53229 */,  // S3_1_c15_c13_5 at min EL1: PMCompare5_EL1\n\tREG_PMCOMPARE6_EL1             =53230 /* 53230 */,  // S3_1_c15_c13_6 at min EL1: PMCompare6_EL1\n\tREG_PMCOMPARE7_EL1             =53231 /* 53231 */,  // S3_1_c15_c13_7 at min EL1: PMCompare7_EL1\n\tREG_PMCR_BVRNG4_EL1            =53232 /* 53232 */,  // S3_1_c15_c14_0 at min EL1: PMCR_BVRNG4_EL1\n\tREG_PM_PMI_PC                  =53233 /* 53233 */,  // S3_1_c15_c14_1 at min EL1: PM_PMI_PC\n\tREG_AON_CPU_MSTALL_CTR6_EL1    =53235 /* 53235 */,  // S3_1_c15_c14_3 at min EL1: AON_CPU_MSTALL_CTR6_EL1\n\tREG_AGTCNTHV_CVAL_EL21         =53236 /* 53236 */,  // S3_1_c15_c14_4 at min EL1: AGTCNTHV_CVAL_EL21\n\tREG_AGTCNTVCT_NOREDIR_EL0      =53237 /* 53237 */,  // S3_1_c15_c14_5 at min EL1: AGTCNTVCT_NOREDIR_EL0\n\tREG_PMCR_BVRNG5_EL1            =53240 /* 53240 */,  // S3_1_c15_c15_0 at min EL1: PMCR_BVRNG5_EL1\n\tREG_AON_CPU_MSTALL_CTR7_EL1    =53243 /* 53243 */,  // S3_1_c15_c15_3 at min EL1: AON_CPU_MSTALL_CTR7_EL1\n\tREG_AGTCNTHV_TVAL_EL21         =53244 /* 53244 */,  // S3_1_c15_c15_4 at min EL1: AGTCNTHV_TVAL_EL21\n\tREG_AGTCNTPCTSS_NOREDIR_EL0    =53245 /* 53245 */,  // S3_1_c15_c15_5 at min EL1: AGTCNTPCTSS_NOREDIR_EL0\n\tREG_CSSELR_EL1                 =53248 /* 53248 */,  // S3_2_c0_c0_0 at min EL1: CSSELR_EL1\n\tREG_PMC0                       =55168 /* 55168 */,  // S3_2_c15_c0_0 at min EL1: PMC0\n\tREG_UPMCFILTER0                =55169 /* 55169 */,  // S3_2_c15_c0_1 at min EL1: UPMCFILTER0\n\tREG_UPMCFILTER1                =55170 /* 55170 */,  // S3_2_c15_c0_2 at min EL1: UPMCFILTER1\n\tREG_UPMCFILTER2                =55171 /* 55171 */,  // S3_2_c15_c0_3 at min EL1: UPMCFILTER2\n\tREG_UPMCFILTER3                =55172 /* 55172 */,  // S3_2_c15_c0_4 at min EL1: UPMCFILTER3\n\tREG_UPMCFILTER4                =55173 /* 55173 */,  // S3_2_c15_c0_5 at min EL1: UPMCFILTER4\n\tREG_UPMCFILTER5                =55174 /* 55174 */,  // S3_2_c15_c0_6 at min EL1: UPMCFILTER5\n\tREG_UPMCFILTER6                =55175 /* 55175 */,  // S3_2_c15_c0_7 at min EL1: UPMCFILTER6\n\tREG_PMC1                       =55176 /* 55176 */,  // S3_2_c15_c1_0 at min EL1: PMC1\n\tREG_UPMCFILTER7                =55177 /* 55177 */,  // S3_2_c15_c1_1 at min EL1: UPMCFILTER7\n\tREG_PMC2                       =55184 /* 55184 */,  // S3_2_c15_c2_0 at min EL1: PMC2\n\tREG_PMC3                       =55192 /* 55192 */,  // S3_2_c15_c3_0 at min EL1: PMC3\n\tREG_PMC4                       =55200 /* 55200 */,  // S3_2_c15_c4_0 at min EL1: PMC4\n\tREG_PMC5                       =55208 /* 55208 */,  // S3_2_c15_c5_0 at min EL1: PMC5\n\tREG_PMC6                       =55216 /* 55216 */,  // S3_2_c15_c6_0 at min EL1: PMC6\n\tREG_PMC7                       =55224 /* 55224 */,  // S3_2_c15_c7_0 at min EL1: PMC7\n\tREG_PMC8                       =55240 /* 55240 */,  // S3_2_c15_c9_0 at min EL1: PMC8\n\tREG_PMC9                       =55248 /* 55248 */,  // S3_2_c15_c10_0 at min EL1: PMC9\n\tREG_PMTRHLD6_EL1               =55264 /* 55264 */,  // S3_2_c15_c12_0 at min EL1: PMTRHLD6_EL1\n\tREG_PMTRHLD4_EL1               =55272 /* 55272 */,  // S3_2_c15_c13_0 at min EL1: PMTRHLD4_EL1\n\tREG_PMTRHLD2_EL1               =55280 /* 55280 */,  // S3_2_c15_c14_0 at min EL1: PMTRHLD2_EL1\n\tREG_PMMMAP_EL1                 =55288 /* 55288 */,  // S3_2_c15_c15_0 at min EL1: PMMMAP_EL1\n\tREG_CTR_EL0                    =55297 /* 55297 */,  // S3_3_c0_c0_1 at min EL1: CTR_EL0\n\tREG_DCZID_EL0                  =55303 /* 55303 */,  // S3_3_c0_c0_7 at min EL1: DCZID_EL0\n\tREG_NZCV                       =55824 /* 55824 */,  // S3_3_c4_c2_0 at min EL1: NZCV\n\tREG_DAIF                       =55825 /* 55825 */,  // S3_3_c4_c2_1 at min EL1: DAIF\n\tREG_DAIFSET                    =55825 /* 55825 */,\n\tREG_SVCR                       =55826 /* 55826 */,  // S3_3_c4_c2_2 at min EL1: SVCR\n\tREG_DIT                        =55829 /* 55829 */,  // S3_3_c4_c2_5 at min EL1: DIT\n\tREG_SSBS                       =55830 /* 55830 */,\n\tREG_TCO                        =55831 /* 55831 */,\n\tREG_FPCR                       =55840 /* 55840 */,  // S3_3_c4_c4_0 at min EL1: FPCR\n\tREG_FPSR                       =55841 /* 55841 */,  // S3_3_c4_c4_1 at min EL1: FPSR\n\tREG_DSPSR                      =55848 /* 55848 */,  // S3_3_c4_c5_0 at min EL0: DSPSR\n\tREG_DSPSR_EL0                  =55848 /* 55848 */,\n\tREG_DLR                        =55849 /* 55849 */,  // S3_3_c4_c5_1 at min EL0: DLR\n\tREG_DLR_EL0                    =55849 /* 55849 */,\n\tREG_PMCR_EL0                   =56544 /* 56544 */,\n\tREG_PMCNTENSET_EL0             =56545 /* 56545 */,\n\tREG_PMCNTENCLR_EL0             =56546 /* 56546 */,\n\tREG_PMOVSCLR_EL0               =56547 /* 56547 */,\n\tREG_PMSWINC_EL0                =56548 /* 56548 */,\n\tREG_PMSELR_EL0                 =56549 /* 56549 */,\n\tREG_PMCCNTR_EL0                =56552 /* 56552 */,\n\tREG_PMXEVTYPER_EL0             =56553 /* 56553 */,\n\tREG_PMXEVCNTR_EL0              =56554 /* 56554 */,\n\tREG_DAIFCLR                    =56557 /* 56557 */,\n\tREG_PMUSERENR_EL0              =56560 /* 56560 */,\n\tREG_PMOVSSET_EL0               =56563 /* 56563 */,\n\tREG_TPIDR_EL0                  =56962 /* 56962 */,  // S3_3_c13_c0_2 at min EL1: TPIDR_EL0\n\tREG_TPIDRRO_EL0                =56963 /* 56963 */,  // S3_3_c13_c0_3 at min EL1: TPIDRRO_EL0\n\tREG_TPIDR2_EL0                 =56965 /* 56965 */,  // S3_3_c13_c0_5 at min EL1: TPIDR2_EL0\n\tREG_SCXTNUM_EL0                =56967 /* 56967 */,  // S3_3_c13_c0_7 at min EL1: SCXTNUM_EL0\n\tREG_AMCR_EL0                   =56976 /* 56976 */,\n\tREG_AMUSERENR_EL0              =56979 /* 56979 */,\n\tREG_AMCNTENCLR0_EL0            =56980 /* 56980 */,\n\tREG_AMCNTENSET0_EL0            =56981 /* 56981 */,\n\tREG_AMCNTENCLR1_EL0            =56984 /* 56984 */,\n\tREG_AMCNTENSET1_EL0            =56985 /* 56985 */,\n\tREG_AMEVCNTR00_EL0             =56992 /* 56992 */,\n\tREG_AMEVCNTR01_EL0             =56993 /* 56993 */,\n\tREG_AMEVCNTR02_EL0             =56994 /* 56994 */,\n\tREG_AMEVCNTR03_EL0             =56995 /* 56995 */,\n\tREG_AMEVCNTR10_EL0             =57056 /* 57056 */,\n\tREG_AMEVCNTR11_EL0             =57057 /* 57057 */,\n\tREG_AMEVCNTR12_EL0             =57058 /* 57058 */,\n\tREG_AMEVCNTR13_EL0             =57059 /* 57059 */,\n\tREG_AMEVCNTR14_EL0             =57060 /* 57060 */,\n\tREG_AMEVCNTR15_EL0             =57061 /* 57061 */,\n\tREG_AMEVCNTR16_EL0             =57062 /* 57062 */,\n\tREG_AMEVCNTR17_EL0             =57063 /* 57063 */,\n\tREG_AMEVCNTR18_EL0             =57064 /* 57064 */,\n\tREG_AMEVCNTR19_EL0             =57065 /* 57065 */,\n\tREG_AMEVCNTR110_EL0            =57066 /* 57066 */,\n\tREG_AMEVCNTR111_EL0            =57067 /* 57067 */,\n\tREG_AMEVCNTR112_EL0            =57068 /* 57068 */,\n\tREG_AMEVCNTR113_EL0            =57069 /* 57069 */,\n\tREG_AMEVCNTR114_EL0            =57070 /* 57070 */,\n\tREG_AMEVCNTR115_EL0            =57071 /* 57071 */,\n\tREG_AMEVTYPER10_EL0            =57072 /* 57072 */,\n\tREG_AMEVTYPER11_EL0            =57073 /* 57073 */,\n\tREG_AMEVTYPER12_EL0            =57074 /* 57074 */,\n\tREG_AMEVTYPER13_EL0            =57075 /* 57075 */,\n\tREG_AMEVTYPER14_EL0            =57076 /* 57076 */,\n\tREG_AMEVTYPER15_EL0            =57077 /* 57077 */,\n\tREG_AMEVTYPER16_EL0            =57078 /* 57078 */,\n\tREG_AMEVTYPER17_EL0            =57079 /* 57079 */,\n\tREG_AMEVTYPER18_EL0            =57080 /* 57080 */,\n\tREG_AMEVTYPER19_EL0            =57081 /* 57081 */,\n\tREG_AMEVTYPER110_EL0           =57082 /* 57082 */,\n\tREG_AMEVTYPER111_EL0           =57083 /* 57083 */,\n\tREG_AMEVTYPER112_EL0           =57084 /* 57084 */,\n\tREG_AMEVTYPER113_EL0           =57085 /* 57085 */,\n\tREG_AMEVTYPER114_EL0           =57086 /* 57086 */,\n\tREG_AMEVTYPER115_EL0           =57087 /* 57087 */,\n\tREG_CNTFRQ_EL0                 =57088 /* 57088 */,  // S3_3_c14_c0_0 at min EL1: CNTFRQ_EL0\n\tREG_CNTPCT_EL0                 =57089 /* 57089 */,  // S3_3_c14_c0_1 at min EL1: CNTPCT_EL0\n\tREG_CNTVCT_EL0                 =57090 /* 57090 */,  // S3_3_c14_c0_2 at min EL1: CNTVCT_EL0\n\tREG_CNTPCTSS_EL0               =57093 /* 57093 */,  // S3_3_c14_c0_5 at min EL1: CNTPCTSS_EL0\n\tREG_CNTVCTSS_EL0               =57094 /* 57094 */,  // S3_3_c14_c0_6 at min EL1: CNTVCTSS_EL0\n\tREG_CNTHP_TVAL_EL21            =57104 /* 57104 */,  // S3_3_c14_c2_0 at min EL1: CNTHP_TVAL_EL21\n\tREG_CNTP_TVAL_EL0              =57104 /* 57104 */,\n\tREG_CNTHP_CTL_EL21             =57105 /* 57105 */,  // S3_3_c14_c2_1 at min EL1: CNTHP_CTL_EL21\n\tREG_CNTP_CTL_EL0               =57105 /* 57105 */,\n\tREG_CNTHP_CVAL_EL21            =57106 /* 57106 */,  // S3_3_c14_c2_2 at min EL1: CNTHP_CVAL_EL21\n\tREG_CNTP_CVAL_EL0              =57106 /* 57106 */,\n\tREG_CNTHV_TVAL_EL21            =57112 /* 57112 */,  // S3_3_c14_c3_0 at min EL1: CNTHV_TVAL_EL21\n\tREG_CNTV_TVAL_EL0              =57112 /* 57112 */,\n\tREG_CNTHV_CTL_EL21             =57113 /* 57113 */,  // S3_3_c14_c3_1 at min EL1: CNTHV_CTL_EL21\n\tREG_CNTV_CTL_EL0               =57113 /* 57113 */,\n\tREG_CNTHV_CVAL_EL21            =57114 /* 57114 */,  // S3_3_c14_c3_2 at min EL1: CNTHV_CVAL_EL21\n\tREG_CNTV_CVAL_EL0              =57114 /* 57114 */,\n\tREG_PMEVCNTR0_EL0              =57152 /* 57152 */,\n\tREG_PMEVCNTR1_EL0              =57153 /* 57153 */,\n\tREG_PMEVCNTR2_EL0              =57154 /* 57154 */,\n\tREG_PMEVCNTR3_EL0              =57155 /* 57155 */,\n\tREG_PMEVCNTR4_EL0              =57156 /* 57156 */,\n\tREG_PMEVCNTR5_EL0              =57157 /* 57157 */,\n\tREG_PMEVCNTR6_EL0              =57158 /* 57158 */,\n\tREG_PMEVCNTR7_EL0              =57159 /* 57159 */,\n\tREG_PMEVCNTR8_EL0              =57160 /* 57160 */,\n\tREG_PMEVCNTR9_EL0              =57161 /* 57161 */,\n\tREG_PMEVCNTR10_EL0             =57162 /* 57162 */,\n\tREG_PMEVCNTR11_EL0             =57163 /* 57163 */,\n\tREG_PMEVCNTR12_EL0             =57164 /* 57164 */,\n\tREG_PMEVCNTR13_EL0             =57165 /* 57165 */,\n\tREG_PMEVCNTR14_EL0             =57166 /* 57166 */,\n\tREG_PMEVCNTR15_EL0             =57167 /* 57167 */,\n\tREG_PMEVCNTR16_EL0             =57168 /* 57168 */,\n\tREG_PMEVCNTR17_EL0             =57169 /* 57169 */,\n\tREG_PMEVCNTR18_EL0             =57170 /* 57170 */,\n\tREG_PMEVCNTR19_EL0             =57171 /* 57171 */,\n\tREG_PMEVCNTR20_EL0             =57172 /* 57172 */,\n\tREG_PMEVCNTR21_EL0             =57173 /* 57173 */,\n\tREG_PMEVCNTR22_EL0             =57174 /* 57174 */,\n\tREG_PMEVCNTR23_EL0             =57175 /* 57175 */,\n\tREG_PMEVCNTR24_EL0             =57176 /* 57176 */,\n\tREG_PMEVCNTR25_EL0             =57177 /* 57177 */,\n\tREG_PMEVCNTR26_EL0             =57178 /* 57178 */,\n\tREG_PMEVCNTR27_EL0             =57179 /* 57179 */,\n\tREG_PMEVCNTR28_EL0             =57180 /* 57180 */,\n\tREG_PMEVCNTR29_EL0             =57181 /* 57181 */,\n\tREG_PMEVCNTR30_EL0             =57182 /* 57182 */,\n\tREG_PMEVTYPER0_EL0             =57184 /* 57184 */,\n\tREG_PMEVTYPER1_EL0             =57185 /* 57185 */,\n\tREG_PMEVTYPER2_EL0             =57186 /* 57186 */,\n\tREG_PMEVTYPER3_EL0             =57187 /* 57187 */,\n\tREG_PMEVTYPER4_EL0             =57188 /* 57188 */,\n\tREG_PMEVTYPER5_EL0             =57189 /* 57189 */,\n\tREG_PMEVTYPER6_EL0             =57190 /* 57190 */,\n\tREG_PMEVTYPER7_EL0             =57191 /* 57191 */,\n\tREG_PMEVTYPER8_EL0             =57192 /* 57192 */,\n\tREG_PMEVTYPER9_EL0             =57193 /* 57193 */,\n\tREG_PMEVTYPER10_EL0            =57194 /* 57194 */,\n\tREG_PMEVTYPER11_EL0            =57195 /* 57195 */,\n\tREG_PMEVTYPER12_EL0            =57196 /* 57196 */,\n\tREG_PMEVTYPER13_EL0            =57197 /* 57197 */,\n\tREG_PMEVTYPER14_EL0            =57198 /* 57198 */,\n\tREG_PMEVTYPER15_EL0            =57199 /* 57199 */,\n\tREG_PMEVTYPER16_EL0            =57200 /* 57200 */,\n\tREG_PMEVTYPER17_EL0            =57201 /* 57201 */,\n\tREG_PMEVTYPER18_EL0            =57202 /* 57202 */,\n\tREG_PMEVTYPER19_EL0            =57203 /* 57203 */,\n\tREG_PMEVTYPER20_EL0            =57204 /* 57204 */,\n\tREG_PMEVTYPER21_EL0            =57205 /* 57205 */,\n\tREG_PMEVTYPER22_EL0            =57206 /* 57206 */,\n\tREG_PMEVTYPER23_EL0            =57207 /* 57207 */,\n\tREG_PMEVTYPER24_EL0            =57208 /* 57208 */,\n\tREG_PMEVTYPER25_EL0            =57209 /* 57209 */,\n\tREG_PMEVTYPER26_EL0            =57210 /* 57210 */,\n\tREG_PMEVTYPER27_EL0            =57211 /* 57211 */,\n\tREG_PMEVTYPER28_EL0            =57212 /* 57212 */,\n\tREG_PMEVTYPER29_EL0            =57213 /* 57213 */,\n\tREG_PMEVTYPER30_EL0            =57214 /* 57214 */,\n\tREG_PMCCFILTR_EL0              =57215 /* 57215 */,\n\tREG_LSU_ERR_STS                =57216 /* 57216 */,  // S3_3_c15_c0_0 at min EL1: LSU_ERR_STS\n\tREG_AFLATCTL1_EL1              =57220 /* 57220 */,  // S3_3_c15_c0_4 at min EL1: AFLATCTL1_EL1\n\tREG_AFLATVALBIN0_EL1           =57221 /* 57221 */,  // S3_3_c15_c0_5 at min EL1: AFLATVALBIN0_EL1\n\tREG_AFLATINFLO_EL1             =57222 /* 57222 */,  // S3_3_c15_c0_6 at min EL1: AFLATINFLO_EL1\n\tREG_LSU_ERR_CTL                =57224 /* 57224 */,  // S3_3_c15_c1_0 at min EL1: LSU_ERR_CTL\n\tREG_AFLATCTL2_EL1              =57228 /* 57228 */,  // S3_3_c15_c1_4 at min EL1: AFLATCTL2_EL1\n\tREG_AFLATVALBIN1_EL1           =57229 /* 57229 */,  // S3_3_c15_c1_5 at min EL1: AFLATVALBIN1_EL1\n\tREG_AFLATINFHI_EL1             =57230 /* 57230 */,  // S3_3_c15_c1_6 at min EL1: AFLATINFHI_EL1\n\tREG_AFLATCTL3_EL1              =57236 /* 57236 */,  // S3_3_c15_c2_4 at min EL1: AFLATCTL3_EL1\n\tREG_AFLATVALBIN2_EL1           =57237 /* 57237 */,  // S3_3_c15_c2_5 at min EL1: AFLATVALBIN2_EL1\n\tREG_AFLATCTL4_EL1              =57244 /* 57244 */,  // S3_3_c15_c3_4 at min EL1: AFLATCTL4_EL1\n\tREG_AFLATVALBIN3_EL1           =57245 /* 57245 */,  // S3_3_c15_c3_5 at min EL1: AFLATVALBIN3_EL1\n\tREG_LLC_FILL_CTL               =57248 /* 57248 */,  // S3_3_c15_c4_0 at min EL1: LLC_FILL_CTL\n\tREG_AFLATCTL5_LO_EL1           =57252 /* 57252 */,  // S3_3_c15_c4_4 at min EL1: AFLATCTL5_LO_EL1\n\tREG_AFLATVALBIN4_EL1           =57253 /* 57253 */,  // S3_3_c15_c4_5 at min EL1: AFLATVALBIN4_EL1\n\tREG_AFLATCTL5_HI_EL1           =57254 /* 57254 */,  // S3_3_c15_c4_6 at min EL1: AFLATCTL5_HI_EL1\n\tREG_LLC_FILL_DAT               =57256 /* 57256 */,  // S3_3_c15_c5_0 at min EL1: LLC_FILL_DAT\n\tREG_AFLATVALBIN5_EL1           =57261 /* 57261 */,  // S3_3_c15_c5_5 at min EL1: AFLATVALBIN5_EL1\n\tREG_AFLATVALBIN6_EL1           =57269 /* 57269 */,  // S3_3_c15_c6_5 at min EL1: AFLATVALBIN6_EL1\n\tREG_LLC_RAM_CONFIG             =57272 /* 57272 */,  // S3_3_c15_c7_0 at min EL1: LLC_RAM_CONFIG\n\tREG_AFLATVALBIN7_EL1           =57277 /* 57277 */,  // S3_3_c15_c7_5 at min EL1: AFLATVALBIN7_EL1\n\tREG_LLC_ERR_STS                =57280 /* 57280 */,  // S3_3_c15_c8_0 at min EL1: LLC_ERR_STS\n\tREG_CMAINT_BCAST_LIST_0        =57281 /* 57281 */,  // S3_3_c15_c8_1 at min EL1: CMAINT_BCAST_LIST_0\n\tREG_CMAINT_BCAST_LIST_1        =57282 /* 57282 */,  // S3_3_c15_c8_2 at min EL1: CMAINT_BCAST_LIST_1\n\tREG_CMAINT_BCAST_CTL           =57283 /* 57283 */,  // S3_3_c15_c8_3 at min EL1: CMAINT_BCAST_CTL\n\tREG_LLC_ERR_ADR                =57288 /* 57288 */,  // S3_3_c15_c9_0 at min EL1: LLC_ERR_ADR\n\tREG_LLC_ERR_CTL                =57289 /* 57289 */,  // S3_3_c15_c9_1 at min EL1: LLC_ERR_CTL\n\tREG_LLC_ERR_INJ                =57290 /* 57290 */,  // S3_3_c15_c9_2 at min EL1: LLC_ERR_INJ\n\tREG_LLC_ERR_INF                =57296 /* 57296 */,  // S3_3_c15_c10_0 at min EL1: LLC_ERR_INF\n\tREG_USERTAGSEL_EL1             =57297 /* 57297 */,  // S3_3_c15_c10_1 at min EL1: USERTAGSEL_EL1\n\tREG_UUSERTAG_EL0               =57298 /* 57298 */,  // S3_3_c15_c10_2 at min EL1: UUSERTAG_EL0\n\tREG_KUSERTAG_EL1               =57299 /* 57299 */,  // S3_3_c15_c10_3 at min EL1: KUSERTAG_EL1\n\tREG_HUSERTAG_EL2               =57300 /* 57300 */,  // S3_3_c15_c10_4 at min EL2: HUSERTAG_EL2\n\tREG_LLC_TRACE_CTL0             =57304 /* 57304 */,  // S3_3_c15_c11_0 at min EL1: LLC_TRACE_CTL0\n\tREG_LLC_TRACE_CTL1             =57312 /* 57312 */,  // S3_3_c15_c12_0 at min EL1: LLC_TRACE_CTL1\n\tREG_LLC_UP_REQ_VC              =57320 /* 57320 */,  // S3_3_c15_c13_0 at min EL1: LLC_UP_REQ_VC\n\tREG_LLC_UP_REQ_VC_THRESH       =57321 /* 57321 */,  // S3_3_c15_c13_1 at min EL1: LLC_UP_REQ_VC_THRESH\n\tREG_LLC_UP_REQ_VC_2            =57322 /* 57322 */,  // S3_3_c15_c13_2 at min EL1: LLC_UP_REQ_VC_2\n\tREG_LLC_UP_REQ_VC_THRESH_2     =57323 /* 57323 */,  // S3_3_c15_c13_3 at min EL1: LLC_UP_REQ_VC_THRESH_2\n\tREG_LLC_DRAM_HASH0             =57324 /* 57324 */,  // S3_3_c15_c13_4 at min EL1: LLC_DRAM_HASH0\n\tREG_LLC_DRAM_HASH1             =57325 /* 57325 */,  // S3_3_c15_c13_5 at min EL1: LLC_DRAM_HASH1\n\tREG_LLC_DRAM_HASH2             =57326 /* 57326 */,  // S3_3_c15_c13_6 at min EL1: LLC_DRAM_HASH2\n\tREG_LLC_DRAM_HASH3             =57327 /* 57327 */,  // S3_3_c15_c13_7 at min EL1: LLC_DRAM_HASH3\n\tREG_LLC_TRACE_CTL2             =57328 /* 57328 */,  // S3_3_c15_c14_0 at min EL1: LLC_TRACE_CTL2\n\tREG_LLC_DRAM_HASH4             =57329 /* 57329 */,  // S3_3_c15_c14_1 at min EL1: LLC_DRAM_HASH4\n\tREG_LLC_UP_REQ_VC_3            =57330 /* 57330 */,  // S3_3_c15_c14_2 at min EL1: LLC_UP_REQ_VC_3\n\tREG_LLC_UP_REQ_VC_THRESH_3     =57331 /* 57331 */,  // S3_3_c15_c14_3 at min EL1: LLC_UP_REQ_VC_THRESH_3\n\tREG_LLC_UP_REQ_VC_4            =57332 /* 57332 */,  // S3_3_c15_c14_4 at min EL1: LLC_UP_REQ_VC_4\n\tREG_LLC_UP_REQ_VC_THRESH_4     =57333 /* 57333 */,  // S3_3_c15_c14_5 at min EL1: LLC_UP_REQ_VC_THRESH_4\n\tREG_LLC_HASH0                  =57336 /* 57336 */,  // S3_3_c15_c15_0 at min EL1: LLC_HASH0\n\tREG_LLC_HASH1                  =57337 /* 57337 */,  // S3_3_c15_c15_1 at min EL1: LLC_HASH1\n\tREG_LLC_HASH2                  =57338 /* 57338 */,  // S3_3_c15_c15_2 at min EL1: LLC_HASH2\n\tREG_LLC_HASH3                  =57339 /* 57339 */,  // S3_3_c15_c15_3 at min EL1: LLC_HASH3\n\tREG_LLC_WRR                    =57340 /* 57340 */,  // S3_3_c15_c15_4 at min EL1: LLC_WRR\n\tREG_LLC_DRAM_HASH5             =57341 /* 57341 */,  // S3_3_c15_c15_5 at min EL1: LLC_DRAM_HASH5\n\tREG_LLC_DRAM_HASH6             =57342 /* 57342 */,  // S3_3_c15_c15_6 at min EL1: LLC_DRAM_HASH6\n\tREG_VPIDR_EL2                  =57344 /* 57344 */,  // S3_4_c0_c0_0 at min EL2: VPIDR_EL2\n\tREG_VMPIDR_EL2                 =57349 /* 57349 */,  // S3_4_c0_c0_5 at min EL2: VMPIDR_EL2\n\tREG_SCTLR_EL2                  =57472 /* 57472 */,  // S3_4_c1_c0_0 at min EL2: SCTLR_EL2\n\tREG_ACTLR_EL2                  =57473 /* 57473 */,  // S3_4_c1_c0_1 at min EL2: ACTLR_EL2\n\tREG_HCR_EL2                    =57480 /* 57480 */,  // S3_4_c1_c1_0 at min EL2: HCR_EL2\n\tREG_MDCR_EL2                   =57481 /* 57481 */,  // S3_4_c1_c1_1 at min EL2: MDCR_EL2\n\tREG_CPTR_EL2                   =57482 /* 57482 */,  // S3_4_c1_c1_2 at min EL2: CPTR_EL2\n\tREG_HSTR_EL2                   =57483 /* 57483 */,  // S3_4_c1_c1_3 at min EL2: HSTR_EL2\n\tREG_HFGRTR_EL2                 =57484 /* 57484 */,  // S3_4_c1_c1_4 at min EL2: HFGRTR_EL2\n\tREG_HFGWTR_EL2                 =57485 /* 57485 */,  // S3_4_c1_c1_5 at min EL2: HFGWTR_EL2\n\tREG_HFGITR_EL2                 =57486 /* 57486 */,  // S3_4_c1_c1_6 at min EL2: HFGITR_EL2\n\tREG_HACR_EL2                   =57487 /* 57487 */,  // S3_4_c1_c1_7 at min EL2: HACR_EL2\n\tREG_TRFCR_EL2                  =57489 /* 57489 */,\n\tREG_HCRX_EL2                   =57490 /* 57490 */,  // S3_4_c1_c2_2 at min EL2: HCRX_EL2\n\tREG_SMPRIMAP_EL2               =57493 /* 57493 */,  // S3_4_c1_c2_5 at min EL2: SMPRIMAP_EL2\n\tREG_SMCR_EL2                   =57494 /* 57494 */,  // S3_4_c1_c2_6 at min EL2: SMCR_EL2\n\tREG_SDER32_EL2                 =57497 /* 57497 */,\n\tREG_TTBR0_EL2                  =57600 /* 57600 */,  // S3_4_c2_c0_0 at min EL2: TTBR0_EL2\n\tREG_TTBR1_EL2                  =57601 /* 57601 */,  // S3_4_c2_c0_1 at min EL2: TTBR1_EL2\n\tREG_TCR_EL2                    =57602 /* 57602 */,  // S3_4_c2_c0_2 at min EL2: TCR_EL2\n\tREG_VTTBR_EL2                  =57608 /* 57608 */,  // S3_4_c2_c1_0 at min EL2: VTTBR_EL2\n\tREG_VTCR_EL2                   =57610 /* 57610 */,  // S3_4_c2_c1_2 at min EL2: VTCR_EL2\n\tREG_VNCR_EL2                   =57616 /* 57616 */,  // S3_4_c2_c2_0 at min EL2: VNCR_EL2\n\tREG_VSTTBR_EL2                 =57648 /* 57648 */,\n\tREG_VSTCR_EL2                  =57650 /* 57650 */,\n\tREG_DACR32_EL2                 =57728 /* 57728 */,  // S3_4_c3_c0_0 at min EL2: DACR32_EL2\n\tREG_HDFGRTR_EL2                =57740 /* 57740 */,  // S3_4_c3_c1_4 at min EL2: HDFGRTR_EL2\n\tREG_HDFGWTR_EL2                =57741 /* 57741 */,  // S3_4_c3_c1_5 at min EL2: HDFGWTR_EL2\n\tREG_SPSR_EL2                   =57856 /* 57856 */,  // S3_4_c4_c0_0 at min EL2: SPSR_EL2\n\tREG_ELR_EL2                    =57857 /* 57857 */,  // S3_4_c4_c0_1 at min EL2: ELR_EL2\n\tREG_SP_EL1                     =57864 /* 57864 */,  // S3_4_c4_c1_0 at min EL1: SP_EL1\n\tREG_SPSR_IRQ                   =57880 /* 57880 */,  // S3_4_c4_c3_0 at min EL1: SPSR_irq\n\tREG_SPSR_ABT                   =57881 /* 57881 */,  // S3_4_c4_c3_1 at min EL1: SPSR_abt\n\tREG_SPSR_UND                   =57882 /* 57882 */,  // S3_4_c4_c3_2 at min EL1: SPSR_und\n\tREG_SPSR_FIQ                   =57883 /* 57883 */,  // S3_4_c4_c3_3 at min EL1: SPSR_fiq\n\tREG_IFSR32_EL2                 =57985 /* 57985 */,  // S3_4_c5_c0_1 at min EL2: IFSR32_EL2\n\tREG_AFSR0_EL2                  =57992 /* 57992 */,  // S3_4_c5_c1_0 at min EL2: AFSR0_EL2\n\tREG_AFSR1_EL2                  =57993 /* 57993 */,  // S3_4_c5_c1_1 at min EL2: AFSR1_EL2\n\tREG_ESR_EL2                    =58000 /* 58000 */,  // S3_4_c5_c2_0 at min EL2: ESR_EL2\n\tREG_VSESR_EL2                  =58003 /* 58003 */,  // S3_4_c5_c2_3 at min EL2: VSESR_EL2\n\tREG_FPEXC32_EL2                =58008 /* 58008 */,  // S3_4_c5_c3_0 at min EL2: FPEXC32_EL2\n\tREG_TFSR_EL2                   =58032 /* 58032 */,\n\tREG_FAR_EL2                    =58112 /* 58112 */,  // S3_4_c6_c0_0 at min EL2: FAR_EL2\n\tREG_HPFAR_EL2                  =58116 /* 58116 */,  // S3_4_c6_c0_4 at min EL2: HPFAR_EL2\n\tREG_PMSCR_EL2                  =58568 /* 58568 */,\n\tREG_MAIR_EL2                   =58640 /* 58640 */,  // S3_4_c10_c2_0 at min EL2: MAIR_EL2\n\tREG_AMAIR_EL2                  =58648 /* 58648 */,  // S3_4_c10_c3_0 at min EL2: AMAIR_EL2\n\tREG_MPAMHCR_EL2                =58656 /* 58656 */,\n\tREG_MPAMVPMV_EL2               =58657 /* 58657 */,\n\tREG_MPAM2_EL2                  =58664 /* 58664 */,\n\tREG_MPAMVPM0_EL2               =58672 /* 58672 */,\n\tREG_MPAMVPM1_EL2               =58673 /* 58673 */,\n\tREG_MPAMVPM2_EL2               =58674 /* 58674 */,\n\tREG_MPAMVPM3_EL2               =58675 /* 58675 */,\n\tREG_MPAMVPM4_EL2               =58676 /* 58676 */,\n\tREG_MPAMVPM5_EL2               =58677 /* 58677 */,\n\tREG_MPAMVPM6_EL2               =58678 /* 58678 */,\n\tREG_MPAMVPM7_EL2               =58679 /* 58679 */,\n\tREG_VBAR_EL2                   =58880 /* 58880 */,  // S3_4_c12_c0_0 at min EL2: VBAR_EL2\n\tREG_RVBAR_EL2                  =58881 /* 58881 */,  // S3_4_c12_c0_1 at min EL2: RVBAR_EL2\n\tREG_RMR_EL2                    =58882 /* 58882 */,  // S3_4_c12_c0_2 at min EL2: RMR_EL2\n\tREG_VDISR_EL2                  =58889 /* 58889 */,  // S3_4_c12_c1_1 at min EL2: VDISR_EL2\n\tREG_ICH_AP0R0_EL2              =58944 /* 58944 */,  // S3_4_c12_c8_0 at min EL2: ICH_AP0R0_EL2\n\tREG_ICH_AP0R1_EL2              =58945 /* 58945 */,\n\tREG_ICH_AP0R2_EL2              =58946 /* 58946 */,\n\tREG_ICH_AP0R3_EL2              =58947 /* 58947 */,\n\tREG_ICH_AP1R0_EL2              =58952 /* 58952 */,  // S3_4_c12_c9_0 at min EL2: ICH_AP1R0_EL2\n\tREG_ICH_AP1R1_EL2              =58953 /* 58953 */,\n\tREG_ICH_AP1R2_EL2              =58954 /* 58954 */,\n\tREG_ICH_AP1R3_EL2              =58955 /* 58955 */,\n\tREG_ICH_VSEIR_EL2              =58956 /* 58956 */,\n\tREG_ICC_SRE_EL2                =58957 /* 58957 */,  // S3_4_c12_c9_5 at min EL2: ICC_SRE_EL2\n\tREG_ICH_HCR_EL2                =58968 /* 58968 */,  // S3_4_c12_c11_0 at min EL2: ICH_HCR_EL2\n\tREG_ICH_VTR_EL2                =58969 /* 58969 */,  // S3_4_c12_c11_1 at min EL2: ICH_VTR_EL2\n\tREG_ICH_MISR_EL2               =58970 /* 58970 */,  // S3_4_c12_c11_2 at min EL2: ICH_MISR_EL2\n\tREG_ICH_EISR_EL2               =58971 /* 58971 */,  // S3_4_c12_c11_3 at min EL2: ICH_EISR_EL2\n\tREG_ICH_ELRSR_EL2              =58973 /* 58973 */,  // S3_4_c12_c11_5 at min EL2: ICH_ELRSR_EL2\n\tREG_ICH_VMCR_EL2               =58975 /* 58975 */,  // S3_4_c12_c11_7 at min EL2: ICH_VMCR_EL2\n\tREG_ICH_LR0_EL2                =58976 /* 58976 */,  // S3_4_c12_c12_0 at min EL2: ICH_LR0_EL2\n\tREG_ICH_LR1_EL2                =58977 /* 58977 */,  // S3_4_c12_c12_1 at min EL2: ICH_LR1_EL2\n\tREG_ICH_LR2_EL2                =58978 /* 58978 */,  // S3_4_c12_c12_2 at min EL2: ICH_LR2_EL2\n\tREG_ICH_LR3_EL2                =58979 /* 58979 */,  // S3_4_c12_c12_3 at min EL2: ICH_LR3_EL2\n\tREG_ICH_LR4_EL2                =58980 /* 58980 */,  // S3_4_c12_c12_4 at min EL2: ICH_LR4_EL2\n\tREG_ICH_LR5_EL2                =58981 /* 58981 */,  // S3_4_c12_c12_5 at min EL2: ICH_LR5_EL2\n\tREG_ICH_LR6_EL2                =58982 /* 58982 */,  // S3_4_c12_c12_6 at min EL2: ICH_LR6_EL2\n\tREG_ICH_LR7_EL2                =58983 /* 58983 */,  // S3_4_c12_c12_7 at min EL2: ICH_LR7_EL2\n\tREG_ICH_LR8_EL2                =58984 /* 58984 */,\n\tREG_ICH_LR9_EL2                =58985 /* 58985 */,\n\tREG_ICH_LR10_EL2               =58986 /* 58986 */,\n\tREG_ICH_LR11_EL2               =58987 /* 58987 */,\n\tREG_ICH_LR12_EL2               =58988 /* 58988 */,\n\tREG_ICH_LR13_EL2               =58989 /* 58989 */,\n\tREG_ICH_LR14_EL2               =58990 /* 58990 */,\n\tREG_ICH_LR15_EL2               =58991 /* 58991 */,\n\tREG_CONTEXTIDR_EL2             =59009 /* 59009 */,  // S3_4_c13_c0_1 at min EL2: CONTEXTIDR_EL2\n\tREG_TPIDR_EL2                  =59010 /* 59010 */,  // S3_4_c13_c0_2 at min EL2: TPIDR_EL2\n\tREG_SCXTNUM_EL2                =59015 /* 59015 */,  // S3_4_c13_c0_7 at min EL2: SCXTNUM_EL2\n\tREG_CNTVOFF_EL2                =59139 /* 59139 */,  // S3_4_c14_c0_3 at min EL2: CNTVOFF_EL2\n\tREG_CNTHCTL_EL2                =59144 /* 59144 */,  // S3_4_c14_c1_0 at min EL2: CNTHCTL_EL2\n\tREG_CNTHP_TVAL_EL2             =59152 /* 59152 */,  // S3_4_c14_c2_0 at min EL2: CNTHP_TVAL_EL2\n\tREG_CNTHP_CTL_EL2              =59153 /* 59153 */,  // S3_4_c14_c2_1 at min EL2: CNTHP_CTL_EL2\n\tREG_CNTHP_CVAL_EL2             =59154 /* 59154 */,  // S3_4_c14_c2_2 at min EL2: CNTHP_CVAL_EL2\n\tREG_CNTHV_TVAL_EL2             =59160 /* 59160 */,  // S3_4_c14_c3_0 at min EL2: CNTHV_TVAL_EL2\n\tREG_CNTHV_CTL_EL2              =59161 /* 59161 */,  // S3_4_c14_c3_1 at min EL2: CNTHV_CTL_EL2\n\tREG_CNTHV_CVAL_EL2             =59162 /* 59162 */,  // S3_4_c14_c3_2 at min EL2: CNTHV_CVAL_EL2\n\tREG_CNTHVS_TVAL_EL2            =59168 /* 59168 */,\n\tREG_CNTHVS_CTL_EL2             =59169 /* 59169 */,\n\tREG_CNTHVS_CVAL_EL2            =59170 /* 59170 */,\n\tREG_CNTHPS_TVAL_EL2            =59176 /* 59176 */,\n\tREG_CNTHPS_CTL_EL2             =59177 /* 59177 */,\n\tREG_CNTHPS_CVAL_EL2            =59178 /* 59178 */,\n\tREG_FED_ERR_STS                =59264 /* 59264 */,  // S3_4_c15_c0_0 at min EL1: FED_ERR_STS\n\tREG_FED_ERR_CTL                =59265 /* 59265 */,  // S3_4_c15_c0_1 at min EL1: FED_ERR_CTL\n\tREG_APCTL_EL1                  =59268 /* 59268 */,  // S3_4_c15_c0_4 at min EL1: APCTL_EL1\n\tREG_KERNKEYLO_EL1              =59272 /* 59272 */,  // S3_4_c15_c1_0 at min EL1: KERNKEYLo_EL1\n\tREG_KERNKEYHI_EL1              =59273 /* 59273 */,  // S3_4_c15_c1_1 at min EL1: KERNKEYHi_EL1\n\tREG_VMSALOCK_EL21              =59274 /* 59274 */,  // S3_4_c15_c1_2 at min EL1: VMSALock_EL21\n\tREG_AMX_STATE_T_EL1            =59275 /* 59275 */,  // S3_4_c15_c1_3 at min EL1: AMX_STATE_T_EL1\n\tREG_AMX_CONFIG_EL1             =59276 /* 59276 */,  // S3_4_c15_c1_4 at min EL1: AMX_CONFIG_EL1\n\tREG_VMSA_LOCK_EL2              =59277 /* 59277 */,  // S3_4_c15_c1_5 at min EL2: VMSA_LOCK_EL2\n\tREG_CTRR_B_UPR_EL1             =59278 /* 59278 */,  // S3_4_c15_c1_6 at min EL1: CTRR_B_UPR_EL1\n\tREG_CTRR_B_LWR_EL1             =59279 /* 59279 */,  // S3_4_c15_c1_7 at min EL1: CTRR_B_LWR_EL1\n\tREG_SP_SETUP_GL1               =59280 /* 59280 */,  // S3_4_c15_c2_0 at min EL1: SP_SETUP_GL1\n\tREG_SP_SETUP_GL2               =59281 /* 59281 */,  // S3_4_c15_c2_1 at min EL2: SP_SETUP_GL2\n\tREG_CTRR_B_CTL_EL1             =59282 /* 59282 */,  // S3_4_c15_c2_2 at min EL1: CTRR_B_CTL_EL1\n\tREG_CTRR_A_LWR_EL1             =59283 /* 59283 */,  // S3_4_c15_c2_3 at min EL1: CTRR_A_LWR_EL1\n\tREG_CTRR_A_UPR_EL1             =59284 /* 59284 */,  // S3_4_c15_c2_4 at min EL1: CTRR_A_UPR_EL1\n\tREG_CTRR_A_CTL_EL1             =59285 /* 59285 */,  // S3_4_c15_c2_5 at min EL1: CTRR_A_CTL_EL1\n\tREG_VMSA_LOCK_EL12             =59286 /* 59286 */,  // S3_4_c15_c2_6 at min EL2: VMSA_LOCK_EL12\n\tREG_AGTCNTV_CTL_EL02           =59287 /* 59287 */,  // S3_4_c15_c2_7 at min EL1: AGTCNTV_CTL_EL02\n\tREG_AMX_STATE_EL1              =59288 /* 59288 */,  // S3_4_c15_c3_0 at min EL1: AMX_STATE_EL1\n\tREG_AMX_STATUS_EL1             =59294 /* 59294 */,  // S3_4_c15_c3_6 at min EL1: AMX_STATUS_EL1\n\tREG_AGTCNTP_CVAL_EL02          =59297 /* 59297 */,  // S3_4_c15_c4_1 at min EL1: AGTCNTP_CVAL_EL02\n\tREG_REDIR_ACNTP_TVAL_EL02      =59298 /* 59298 */,  // S3_4_c15_c4_2 at min EL1: REDIR_ACNTP_TVAL_EL02\n\tREG_AGTCNTP_CTL_EL02           =59299 /* 59299 */,  // S3_4_c15_c4_3 at min EL1: AGTCNTP_CTL_EL02\n\tREG_AGTCNTV_CVAL_EL02          =59300 /* 59300 */,  // S3_4_c15_c4_4 at min EL1: AGTCNTV_CVAL_EL02\n\tREG_AGTCNTV_TVAL_EL02          =59301 /* 59301 */,  // S3_4_c15_c4_5 at min EL1: AGTCNTV_TVAL_EL02\n\tREG_AMX_CONFIG_EL12            =59302 /* 59302 */,  // S3_4_c15_c4_6 at min EL2: AMX_CONFIG_EL12\n\tREG_AMX_CONFIG_EL2             =59303 /* 59303 */,  // S3_4_c15_c4_7 at min EL2: AMX_CONFIG_EL2\n\tREG_SPRR_HUPERM_EL0            =59305 /* 59305 */,  // S3_4_c15_c5_1 at min EL1: SPRR_HUPERM_EL0\n\tREG_SPRR_VUPERM_EL0            =59306 /* 59306 */,  // S3_4_c15_c5_2 at min EL1: SPRR_VUPERM_EL0\n\tREG_CTRR_A_CTL_EL2             =59314 /* 59314 */,  // S3_4_c15_c6_2 at min EL2: CTRR_A_CTL_EL2\n\tREG_CTRR_B_CTL_EL2             =59315 /* 59315 */,  // S3_4_c15_c6_3 at min EL2: CTRR_B_CTL_EL2\n\tREG_CTRR_A_LWR_EL2             =59316 /* 59316 */,  // S3_4_c15_c6_4 at min EL2: CTRR_A_LWR_EL2\n\tREG_CTRR_A_UPR_EL2             =59317 /* 59317 */,  // S3_4_c15_c6_5 at min EL2: CTRR_A_UPR_EL2\n\tREG_CTRR_B_LWR_EL2             =59318 /* 59318 */,  // S3_4_c15_c6_6 at min EL2: CTRR_B_LWR_EL2\n\tREG_CTRR_B_UPR_EL2             =59319 /* 59319 */,  // S3_4_c15_c6_7 at min EL2: CTRR_B_UPR_EL2\n\tREG_SPRR_HUMPRR_EL2            =59320 /* 59320 */,  // S3_4_c15_c7_0 at min EL2: SPRR_HUMPRR_EL2\n\tREG_SPRR_HUPERM_SH01_EL2       =59321 /* 59321 */,  // S3_4_c15_c7_1 at min EL2: SPRR_HUPERM_SH01_EL2\n\tREG_SPRR_HUPERM_SH02_EL2       =59322 /* 59322 */,  // S3_4_c15_c7_2 at min EL2: SPRR_HUPERM_SH02_EL2\n\tREG_SPRR_HUPERM_SH03_EL2       =59323 /* 59323 */,  // S3_4_c15_c7_3 at min EL2: SPRR_HUPERM_SH03_EL2\n\tREG_SPRR_HUPERM_SH04_EL2       =59324 /* 59324 */,  // S3_4_c15_c7_4 at min EL2: SPRR_HUPERM_SH04_EL2\n\tREG_SPRR_HUPERM_SH05_EL2       =59325 /* 59325 */,  // S3_4_c15_c7_5 at min EL2: SPRR_HUPERM_SH05_EL2\n\tREG_SPRR_HUPERM_SH06_EL2       =59326 /* 59326 */,  // S3_4_c15_c7_6 at min EL2: SPRR_HUPERM_SH06_EL2\n\tREG_SPRR_HUPERM_SH07_EL2       =59327 /* 59327 */,  // S3_4_c15_c7_7 at min EL2: SPRR_HUPERM_SH07_EL2\n\tREG_SPRR_VUMPRR_EL1            =59328 /* 59328 */,  // S3_4_c15_c8_0 at min EL1: SPRR_VUMPRR_EL1\n\tREG_SPRR_VUPERM_SH01_EL1       =59329 /* 59329 */,  // S3_4_c15_c8_1 at min EL1: SPRR_VUPERM_SH01_EL1\n\tREG_SPRR_VUPERM_SH02_EL1       =59330 /* 59330 */,  // S3_4_c15_c8_2 at min EL1: SPRR_VUPERM_SH02_EL1\n\tREG_SPRR_VUPERM_SH03_EL1       =59331 /* 59331 */,  // S3_4_c15_c8_3 at min EL1: SPRR_VUPERM_SH03_EL1\n\tREG_SPRR_VUPERM_SH04_EL1       =59332 /* 59332 */,  // S3_4_c15_c8_4 at min EL1: SPRR_VUPERM_SH04_EL1\n\tREG_SPRR_VUPERM_SH05_EL1       =59333 /* 59333 */,  // S3_4_c15_c8_5 at min EL1: SPRR_VUPERM_SH05_EL1\n\tREG_SPRR_VUPERM_SH06_EL1       =59334 /* 59334 */,  // S3_4_c15_c8_6 at min EL1: SPRR_VUPERM_SH06_EL1\n\tREG_SPRR_VUPERM_SH07_EL1       =59335 /* 59335 */,  // S3_4_c15_c8_7 at min EL1: SPRR_VUPERM_SH07_EL1\n\tREG_CTRR_A_LWR_EL12            =59336 /* 59336 */,  // S3_4_c15_c9_0 at min EL2: CTRR_A_LWR_EL12\n\tREG_CTRR_A_UPR_EL12            =59337 /* 59337 */,  // S3_4_c15_c9_1 at min EL2: CTRR_A_UPR_EL12\n\tREG_CTRR_B_LWR_EL12            =59338 /* 59338 */,  // S3_4_c15_c9_2 at min EL2: CTRR_B_LWR_EL12\n\tREG_CTRR_B_UPR_EL12            =59339 /* 59339 */,  // S3_4_c15_c9_3 at min EL2: CTRR_B_UPR_EL12\n\tREG_CTRR_A_CTL_EL12            =59340 /* 59340 */,  // S3_4_c15_c9_4 at min EL2: CTRR_A_CTL_EL12\n\tREG_CTRR_B_CTL_EL12            =59341 /* 59341 */,  // S3_4_c15_c9_5 at min EL2: CTRR_B_CTL_EL12\n\tREG_AGTCNTHCTL_EL21            =59342 /* 59342 */,  // S3_4_c15_c9_6 at min EL1: AGTCNTHCTL_EL21\n\tREG_AGTCNTKCTL_EL12            =59343 /* 59343 */,  // S3_4_c15_c9_7 at min EL2: AGTCNTKCTL_EL12\n\tREG_PREDAKEYLO_EL1             =59344 /* 59344 */,  // S3_4_c15_c10_0 at min EL1: PREDAKEYLo_EL1\n\tREG_PREDAKEYHI_EL1             =59345 /* 59345 */,  // S3_4_c15_c10_1 at min EL1: PREDAKEYHi_EL1\n\tREG_PREDBKEYLO_EL1             =59346 /* 59346 */,  // S3_4_c15_c10_2 at min EL1: PREDBKEYLo_EL1\n\tREG_PREDBKEYHI_EL1             =59347 /* 59347 */,  // S3_4_c15_c10_3 at min EL1: PREDBKEYHi_EL1\n\tREG_SIQ_CFG_EL1                =59348 /* 59348 */,  // S3_4_c15_c10_4 at min EL1: SIQ_CFG_EL1\n\tREG_AGTCNTPCTSS_EL0            =59349 /* 59349 */,  // S3_4_c15_c10_5 at min EL1: AGTCNTPCTSS_EL0\n\tREG_AGTCNTVCTSS_EL0            =59350 /* 59350 */,  // S3_4_c15_c10_6 at min EL1: AGTCNTVCTSS_EL0\n\tREG_AVNCR_EL2                  =59351 /* 59351 */,  // S3_4_c15_c10_7 at min EL2: AVNCR_EL2\n\tREG_ACC_CTRR_A_LWR_EL2         =59352 /* 59352 */,  // S3_4_c15_c11_0 at min EL2: ACC_CTRR_A_LWR_EL2\n\tREG_ACC_CTRR_A_UPR_EL2         =59353 /* 59353 */,  // S3_4_c15_c11_1 at min EL2: ACC_CTRR_A_UPR_EL2\n\tREG_ACC_CTRR_B_LWR_EL2         =59354 /* 59354 */,  // S3_4_c15_c11_2 at min EL2: ACC_CTRR_B_LWR_EL2\n\tREG_ACC_CTRR_B_UPR_EL2         =59355 /* 59355 */,  // S3_4_c15_c11_3 at min EL2: ACC_CTRR_B_UPR_EL2\n\tREG_ACC_CTRR_A_CTL_EL2         =59356 /* 59356 */,  // S3_4_c15_c11_4 at min EL2: ACC_CTRR_A_CTL_EL2\n\tREG_ACC_CTRR_B_CTL_EL2         =59357 /* 59357 */,  // S3_4_c15_c11_5 at min EL2: ACC_CTRR_B_CTL_EL2\n\tREG_AGTCNTPCT_EL0              =59358 /* 59358 */,  // S3_4_c15_c11_6 at min EL1: AGTCNTPCT_EL0\n\tREG_AGTCNTVCT_EL0              =59359 /* 59359 */,  // S3_4_c15_c11_7 at min EL1: AGTCNTVCT_EL0\n\tREG_ACFG_EL1                   =59360 /* 59360 */,  // S3_4_c15_c12_0 at min EL1: ACFG_EL1\n\tREG_AHCR_EL2                   =59361 /* 59361 */,  // S3_4_c15_c12_1 at min EL2: AHCR_EL2\n\tREG_APL_INTSTATUS_EL1          =59362 /* 59362 */,  // S3_4_c15_c12_2 at min EL1: APL_INTSTATUS_EL1\n\tREG_APL_INTSTATUS_EL2          =59363 /* 59363 */,  // S3_4_c15_c12_3 at min EL2: APL_INTSTATUS_EL2\n\tREG_AGTCNTHCTL_EL2             =59366 /* 59366 */,  // S3_4_c15_c12_6 at min EL2: AGTCNTHCTL_EL2\n\tREG_JAPIAKEYLO_EL2             =59368 /* 59368 */,  // S3_4_c15_c13_0 at min EL2: JAPIAKeyLo_EL2\n\tREG_JAPIAKEYHI_EL2             =59369 /* 59369 */,  // S3_4_c15_c13_1 at min EL2: JAPIAKeyHi_EL2\n\tREG_JAPIBKEYLO_EL2             =59370 /* 59370 */,  // S3_4_c15_c13_2 at min EL2: JAPIBKeyLo_EL2\n\tREG_JAPIBKEYHI_EL2             =59371 /* 59371 */,  // S3_4_c15_c13_3 at min EL2: JAPIBKeyHi_EL2\n\tREG_JAPIAKEYLO_EL1             =59372 /* 59372 */,  // S3_4_c15_c13_4 at min EL1: JAPIAKeyLo_EL1\n\tREG_JAPIAKEYHI_EL1             =59373 /* 59373 */,  // S3_4_c15_c13_5 at min EL1: JAPIAKeyHi_EL1\n\tREG_JAPIBKEYLO_EL1             =59374 /* 59374 */,  // S3_4_c15_c13_6 at min EL1: JAPIBKeyLo_EL1\n\tREG_JAPIBKEYHI_EL1             =59375 /* 59375 */,  // S3_4_c15_c13_7 at min EL1: JAPIBKeyHi_EL1\n\tREG_JAPIAKEYLO_EL12            =59376 /* 59376 */,  // S3_4_c15_c14_0 at min EL2: JAPIAKeyLo_EL12\n\tREG_JAPIAKEYHI_EL12            =59377 /* 59377 */,  // S3_4_c15_c14_1 at min EL2: JAPIAKeyHi_EL12\n\tREG_JAPIBKEYLO_EL12            =59378 /* 59378 */,  // S3_4_c15_c14_2 at min EL2: JAPIBKeyLo_EL12\n\tREG_JAPIBKEYHI_EL12            =59379 /* 59379 */,  // S3_4_c15_c14_3 at min EL2: JAPIBKeyHi_EL12\n\tREG_AGTCNTRDIR_EL2             =59381 /* 59381 */,  // S3_4_c15_c14_5 at min EL2: AGTCNTRDIR_EL2\n\tREG_AGTCNTRDIR_EL12            =59382 /* 59382 */,  // S3_4_c15_c14_6 at min EL2: AGTCNTRDIR_EL12\n\tREG_JRANGE_EL2                 =59384 /* 59384 */,  // S3_4_c15_c15_0 at min EL2: JRANGE_EL2\n\tREG_JRANGE_EL1                 =59385 /* 59385 */,  // S3_4_c15_c15_1 at min EL1: JRANGE_EL1\n\tREG_JRANGE_EL12                =59386 /* 59386 */,  // S3_4_c15_c15_2 at min EL2: JRANGE_EL12\n\tREG_JCTL_EL2                   =59387 /* 59387 */,  // S3_4_c15_c15_3 at min EL2: JCTL_EL2\n\tREG_JCTL_EL1                   =59388 /* 59388 */,  // S3_4_c15_c15_4 at min EL1: JCTL_EL1\n\tREG_JCTL_EL12                  =59389 /* 59389 */,  // S3_4_c15_c15_5 at min EL2: JCTL_EL12\n\tREG_JCTL_EL0                   =59390 /* 59390 */,  // S3_4_c15_c15_6 at min EL1: JCTL_EL0\n\tREG_AMDSCR_EL1                 =59391 /* 59391 */,  // S3_4_c15_c15_7 at min EL1: AMDSCR_EL1\n\tREG_SCTLR_EL12                 =59520 /* 59520 */,  // S3_5_c1_c0_0 at min EL2: SCTLR_EL12\n\tREG_ACTLR_EL12                 =59521 /* 59521 */,  // S3_5_c1_c0_1 at min EL2: ACTLR_EL12\n\tREG_CPACR_EL12                 =59522 /* 59522 */,  // S3_5_c1_c0_2 at min EL2: CPACR_EL12\n\tREG_TRFCR_EL12                 =59537 /* 59537 */,\n\tREG_SMCR_EL12                  =59542 /* 59542 */,  // S3_5_c1_c2_6 at min EL2: SMCR_EL12\n\tREG_TTBR0_EL12                 =59648 /* 59648 */,  // S3_5_c2_c0_0 at min EL2: TTBR0_EL12\n\tREG_TTBR1_EL12                 =59649 /* 59649 */,  // S3_5_c2_c0_1 at min EL2: TTBR1_EL12\n\tREG_TCR_EL12                   =59650 /* 59650 */,  // S3_5_c2_c0_2 at min EL2: TCR_EL12\n\tREG_SPSR_EL12                  =59904 /* 59904 */,  // S3_5_c4_c0_0 at min EL2: SPSR_EL12\n\tREG_ELR_EL12                   =59905 /* 59905 */,  // S3_5_c4_c0_1 at min EL2: ELR_EL12\n\tREG_AFSR0_EL12                 =60040 /* 60040 */,  // S3_5_c5_c1_0 at min EL2: AFSR0_EL12\n\tREG_AFSR1_EL12                 =60041 /* 60041 */,  // S3_5_c5_c1_1 at min EL2: AFSR1_EL12\n\tREG_ESR_EL12                   =60048 /* 60048 */,  // S3_5_c5_c2_0 at min EL2: ESR_EL12\n\tREG_TFSR_EL12                  =60080 /* 60080 */,\n\tREG_FAR_EL12                   =60160 /* 60160 */,  // S3_5_c6_c0_0 at min EL2: FAR_EL12\n\tREG_PMSCR_EL12                 =60616 /* 60616 */,\n\tREG_MAIR_EL12                  =60688 /* 60688 */,  // S3_5_c10_c2_0 at min EL2: MAIR_EL12\n\tREG_AMAIR_EL12                 =60696 /* 60696 */,  // S3_5_c10_c3_0 at min EL2: AMAIR_EL12\n\tREG_MPAM1_EL12                 =60712 /* 60712 */,\n\tREG_VBAR_EL12                  =60928 /* 60928 */,  // S3_5_c12_c0_0 at min EL2: VBAR_EL12\n\tREG_CONTEXTIDR_EL12            =61057 /* 61057 */,  // S3_5_c13_c0_1 at min EL2: CONTEXTIDR_EL12\n\tREG_SCXTNUM_EL12               =61063 /* 61063 */,  // S3_5_c13_c0_7 at min EL2: SCXTNUM_EL12\n\tREG_CNTKCTL_EL12               =61192 /* 61192 */,  // S3_5_c14_c1_0 at min EL2: CNTKCTL_EL12\n\tREG_CNTP_TVAL_EL02             =61200 /* 61200 */,  // S3_5_c14_c2_0 at min EL1: CNTP_TVAL_EL02\n\tREG_CNTP_CTL_EL02              =61201 /* 61201 */,  // S3_5_c14_c2_1 at min EL1: CNTP_CTL_EL02\n\tREG_CNTP_CVAL_EL02             =61202 /* 61202 */,  // S3_5_c14_c2_2 at min EL1: CNTP_CVAL_EL02\n\tREG_CNTV_TVAL_EL02             =61208 /* 61208 */,  // S3_5_c14_c3_0 at min EL1: CNTV_TVAL_EL02\n\tREG_CNTV_CTL_EL02              =61209 /* 61209 */,  // S3_5_c14_c3_1 at min EL1: CNTV_CTL_EL02\n\tREG_CNTV_CVAL_EL02             =61210 /* 61210 */,  // S3_5_c14_c3_2 at min EL1: CNTV_CVAL_EL02\n\tREG_IPI_RR_LOCAL_EL1           =61312 /* 61312 */,  // S3_5_c15_c0_0 at min EL1: IPI_RR_LOCAL_EL1\n\tREG_IPI_RR_GLOBAL_EL1          =61313 /* 61313 */,  // S3_5_c15_c0_1 at min EL1: IPI_RR_GLOBAL_EL1\n\tREG_AF_ERR_CFG0                =61314 /* 61314 */,  // S3_5_c15_c0_2 at min EL1: AF_ERR_CFG0\n\tREG_AP_ERR_CFG0                =61315 /* 61315 */,  // S3_5_c15_c0_3 at min EL1: AP_ERR_CFG0\n\tREG_AF_ERR_SRC_IDS             =61316 /* 61316 */,  // S3_5_c15_c0_4 at min EL1: AF_ERR_SRC_IDS\n\tREG_DPC_ERR_STS                =61317 /* 61317 */,  // S3_5_c15_c0_5 at min EL1: DPC_ERR_STS\n\tREG_DPC_ERR_CTL                =61318 /* 61318 */,  // S3_5_c15_c0_6 at min EL1: DPC_ERR_CTL\n\tREG_PROD_TRC_CORE_CFG_EL1      =61319 /* 61319 */,  // S3_5_c15_c0_7 at min EL1: PROD_TRC_CORE_CFG_EL1\n\tREG_TRACE_CORE_CFG             =61320 /* 61320 */,  // S3_5_c15_c1_0 at min EL1: TRACE_CORE_CFG\n\tREG_IPI_SR                     =61321 /* 61321 */,  // S3_5_c15_c1_1 at min EL1: IPI_SR\n\tREG_APL_LRTMR_EL2              =61322 /* 61322 */,  // S3_5_c15_c1_2 at min EL2: APL_LRTMR_EL2\n\tREG_APL_INTENABLE_EL2          =61323 /* 61323 */,  // S3_5_c15_c1_3 at min EL2: APL_INTENABLE_EL2\n\tREG_KTRACE_MESSAGE             =61324 /* 61324 */,  // S3_5_c15_c1_4 at min EL1: KTRACE_MESSAGE\n\tREG_TRACE_CORE_CFG_EXT         =61325 /* 61325 */,  // S3_5_c15_c1_5 at min EL1: TRACE_CORE_CFG_EXT\n\tREG_PROD_TRC_CORE_CFG_EL2      =61326 /* 61326 */,  // S3_5_c15_c1_6 at min EL2: PROD_TRC_CORE_CFG_EL2\n\tREG_HID_PROD_TRC_CORE_CFG_EL1  =61327 /* 61327 */,  // S3_5_c15_c1_7 at min EL1: HID_PROD_TRC_CORE_CFG_EL1\n\tREG_DBG_WRAP_GLB               =61328 /* 61328 */,  // S3_5_c15_c2_0 at min EL1: DBG_WRAP_GLB\n\tREG_TRACE_STREAM_BASE          =61329 /* 61329 */,  // S3_5_c15_c2_1 at min EL1: TRACE_STREAM_BASE\n\tREG_TRACE_STREAM_FILL          =61330 /* 61330 */,  // S3_5_c15_c2_2 at min EL1: TRACE_STREAM_FILL\n\tREG_TRACE_STREAM_BASE1         =61331 /* 61331 */,  // S3_5_c15_c2_3 at min EL1: TRACE_STREAM_BASE1\n\tREG_TRACE_STREAM_FILL1         =61332 /* 61332 */,  // S3_5_c15_c2_4 at min EL1: TRACE_STREAM_FILL1\n\tREG_TRACE_STREAM_IRQ           =61333 /* 61333 */,  // S3_5_c15_c2_5 at min EL1: TRACE_STREAM_IRQ\n\tREG_WATCHDOGDIAG0              =61334 /* 61334 */,  // S3_5_c15_c2_6 at min EL1: WatchDogDiag0\n\tREG_WATCHDOGDIAG1              =61335 /* 61335 */,  // S3_5_c15_c2_7 at min EL1: WatchDogDiag1\n\tREG_TRACE_AUX_CTL              =61336 /* 61336 */,  // S3_5_c15_c3_0 at min EL1: TRACE_AUX_CTL\n\tREG_IPI_CR                     =61337 /* 61337 */,  // S3_5_c15_c3_1 at min EL1: IPI_CR\n\tREG_UTRIG_EVENT                =61338 /* 61338 */,  // S3_5_c15_c3_2 at min EL1: UTRIG_EVENT\n\tREG_HID_PROD_TRC_MASK_EL1      =61339 /* 61339 */,  // S3_5_c15_c3_3 at min EL1: HID_PROD_TRC_MASK_EL1\n\tREG_TRACE_CTL                  =61340 /* 61340 */,  // S3_5_c15_c3_4 at min EL1: TRACE_CTL\n\tREG_TRACE_DAT                  =61341 /* 61341 */,  // S3_5_c15_c3_5 at min EL1: TRACE_DAT\n\tREG_PROD_TRC_STRM_BASE0_GL2    =61342 /* 61342 */,  // S3_5_c15_c3_6 at min EL2: PROD_TRC_STRM_BASE0_GL2\n\tREG_PROD_TRC_STRM_BASE1_GL2    =61343 /* 61343 */,  // S3_5_c15_c3_7 at min EL2: PROD_TRC_STRM_BASE1_GL2\n\tREG_CPU_CFG                    =61344 /* 61344 */,  // S3_5_c15_c4_0 at min EL1: CPU_CFG\n\tREG_PBLK_STS                   =61345 /* 61345 */,  // S3_5_c15_c4_1 at min EL1: PBLK_STS\n\tREG_PROD_TRC_CTL_EL1           =61347 /* 61347 */,  // S3_5_c15_c4_3 at min EL1: PROD_TRC_CTL_EL1\n\tREG_PROD_TRC_STRM_BASE0_GL1    =61348 /* 61348 */,  // S3_5_c15_c4_4 at min EL1: PROD_TRC_STRM_BASE0_GL1\n\tREG_PROD_TRC_STRM_BASE1_GL1    =61349 /* 61349 */,  // S3_5_c15_c4_5 at min EL1: PROD_TRC_STRM_BASE1_GL1\n\tREG_PROD_TRC_STRM_FIQ_EL1      =61350 /* 61350 */,  // S3_5_c15_c4_6 at min EL1: PROD_TRC_STRM_FIQ_EL1\n\tREG_CPU_OVRD                   =61352 /* 61352 */,  // S3_5_c15_c5_0 at min EL1: CPU_OVRD\n\tREG_PBLK_EXE_ST                =61354 /* 61354 */,  // S3_5_c15_c5_2 at min EL1: PBLK_EXE_ST\n\tREG_PROD_TRC_CORE_GL_CTL_GL1   =61357 /* 61357 */,  // S3_5_c15_c5_5 at min EL1: PROD_TRC_CORE_GL_CTL_GL1\n\tREG_PROD_TRC_CORE_GL_CTL_GL2   =61358 /* 61358 */,  // S3_5_c15_c5_6 at min EL2: PROD_TRC_CORE_GL_CTL_GL2\n\tREG_ACC_OVRD                   =61360 /* 61360 */,  // S3_5_c15_c6_0 at min EL1: ACC_OVRD\n\tREG_ACC_OVRD1                  =61361 /* 61361 */,  // S3_5_c15_c6_1 at min EL1: ACC_OVRD1\n\tREG_CPM_PWRDN_CTL              =61362 /* 61362 */,  // S3_5_c15_c6_2 at min EL1: CPM_PWRDN_CTL\n\tREG_PROD_TRC_BUF_RESTORE0_GL1  =61364 /* 61364 */,  // S3_5_c15_c6_4 at min EL1: PROD_TRC_BUF_RESTORE0_GL1\n\tREG_PROD_TRC_BUF_RESTORE1_GL1  =61365 /* 61365 */,  // S3_5_c15_c6_5 at min EL1: PROD_TRC_BUF_RESTORE1_GL1\n\tREG_PROD_TRC_EN_GL1            =61366 /* 61366 */,  // S3_5_c15_c6_6 at min EL1: PROD_TRC_EN_GL1\n\tREG_PRE_LLCFLUSH_TMR           =61368 /* 61368 */,  // S3_5_c15_c7_0 at min EL1: PRE_LLCFLUSH_TMR\n\tREG_BIUINTFCTL_CFG             =61372 /* 61372 */,  // S3_5_c15_c7_4 at min EL1: BIUINTFCTL_CFG\n\tREG_BIUINTFWRR_CFG             =61373 /* 61373 */,  // S3_5_c15_c7_5 at min EL1: BIUINTFWRR_CFG\n\tREG_PRE_TD_TMR                 =61376 /* 61376 */,  // S3_5_c15_c8_0 at min EL1: PRE_TD_TMR\n\tREG_ACC_SLP_WAKE_UP_TMR        =61377 /* 61377 */,  // S3_5_c15_c8_1 at min EL1: ACC_SLP_WAKE_UP_TMR\n\tREG_PBLK_PSW_DLY               =61384 /* 61384 */,  // S3_5_c15_c9_0 at min EL1: PBLK_PSW_DLY\n\tREG_CPU_STS                    =61392 /* 61392 */,  // S3_5_c15_c10_0 at min EL1: CPU_STS\n\tREG_HIST_TRIG                  =61393 /* 61393 */,  // S3_5_c15_c10_1 at min EL1: HIST_TRIG\n\tREG_PROD_TRC_BUF_RESTORE0_GL2  =61396 /* 61396 */,  // S3_5_c15_c10_4 at min EL2: PROD_TRC_BUF_RESTORE0_GL2\n\tREG_PROD_TRC_BUF_RESTORE1_GL2  =61397 /* 61397 */,  // S3_5_c15_c10_5 at min EL2: PROD_TRC_BUF_RESTORE1_GL2\n\tREG_PROD_TRC_STRM_FILL0_EL1    =61398 /* 61398 */,  // S3_5_c15_c10_6 at min EL1: PROD_TRC_STRM_FILL0_EL1\n\tREG_PROD_TRC_STRM_FILL1_EL1    =61399 /* 61399 */,  // S3_5_c15_c10_7 at min EL1: PROD_TRC_STRM_FILL1_EL1\n\tREG_ARRAY_INDEX                =61400 /* 61400 */,  // S3_5_c15_c11_0 at min EL1: ARRAY_INDEX\n\tREG_PROD_TRC_CTL_EL2           =61401 /* 61401 */,  // S3_5_c15_c11_1 at min EL2: PROD_TRC_CTL_EL2\n\tREG_PROD_TRC_EN_GL2            =61402 /* 61402 */,  // S3_5_c15_c11_2 at min EL2: PROD_TRC_EN_GL2\n\tREG_PROD_TRC_STRM_FIQ_EL2      =61403 /* 61403 */,  // S3_5_c15_c11_3 at min EL2: PROD_TRC_STRM_FIQ_EL2\n\tREG_PROD_TRC_CPMU_DUMP_TRIG_EL1=61404 /* 61404 */,  // S3_5_c15_c11_4 at min EL1: PROD_TRC_CPMU_DUMP_TRIG_EL1\n\tREG_PROD_LOSS_COUNT_EL1        =61405 /* 61405 */,  // S3_5_c15_c11_5 at min EL1: PROD_LOSS_COUNT_EL1\n\tREG_SW_TRACE_DATA_EL0          =61406 /* 61406 */,  // S3_5_c15_c11_6 at min EL1: SW_TRACE_DATA_EL0\n\tREG_IL1_DATA0                  =61408 /* 61408 */,  // S3_5_c15_c12_0 at min EL1: IL1_DATA0\n\tREG_IL1_DATA1                  =61409 /* 61409 */,  // S3_5_c15_c12_1 at min EL1: IL1_DATA1\n\tREG_DL1_DATA0                  =61410 /* 61410 */,  // S3_5_c15_c12_2 at min EL1: DL1_DATA0\n\tREG_DL1_DATA1                  =61411 /* 61411 */,  // S3_5_c15_c12_3 at min EL1: DL1_DATA1\n\tREG_MMUDATA0                   =61412 /* 61412 */,  // S3_5_c15_c12_4 at min EL1: MMUDATA0\n\tREG_MMUDATA1                   =61413 /* 61413 */,  // S3_5_c15_c12_5 at min EL1: MMUDATA1\n\tREG_DL1_DATA2                  =61414 /* 61414 */,  // S3_5_c15_c12_6 at min EL1: DL1_DATA2\n\tREG_IL1_DATA2                  =61415 /* 61415 */,  // S3_5_c15_c12_7 at min EL1: IL1_DATA2\n\tREG_LLC_DATA0                  =61420 /* 61420 */,  // S3_5_c15_c13_4 at min EL1: LLC_DATA0\n\tREG_LLC_DATA1                  =61421 /* 61421 */,  // S3_5_c15_c13_5 at min EL1: LLC_DATA1\n\tREG_SCTLR_EL3                  =61568 /* 61568 */,  // S3_6_c1_c0_0 at min EL3: SCTLR_EL3\n\tREG_ACTLR_EL3                  =61569 /* 61569 */,  // S3_6_c1_c0_1 at min EL3: ACTLR_EL3\n\tREG_SCR_EL3                    =61576 /* 61576 */,  // S3_6_c1_c1_0 at min EL3: SCR_EL3\n\tREG_SDER32_EL3                 =61577 /* 61577 */,  // S3_6_c1_c1_1 at min EL3: SDER32_EL3\n\tREG_CPTR_EL3                   =61578 /* 61578 */,  // S3_6_c1_c1_2 at min EL3: CPTR_EL3\n\tREG_MDCR_EL3                   =61593 /* 61593 */,  // S3_6_c1_c3_1 at min EL3: MDCR_EL3\n\tREG_TTBR0_EL3                  =61696 /* 61696 */,  // S3_6_c2_c0_0 at min EL3: TTBR0_EL3\n\tREG_TCR_EL3                    =61698 /* 61698 */,  // S3_6_c2_c0_2 at min EL3: TCR_EL3\n\tREG_SPSR_EL3                   =61952 /* 61952 */,  // S3_6_c4_c0_0 at min EL3: SPSR_EL3\n\tREG_ELR_EL3                    =61953 /* 61953 */,  // S3_6_c4_c0_1 at min EL3: ELR_EL3\n\tREG_SP_EL2                     =61960 /* 61960 */,  // S3_6_c4_c1_0 at min EL2: SP_EL2\n\tREG_AFSR0_EL3                  =62088 /* 62088 */,  // S3_6_c5_c1_0 at min EL3: AFSR0_EL3\n\tREG_AFSR1_EL3                  =62089 /* 62089 */,  // S3_6_c5_c1_1 at min EL3: AFSR1_EL3\n\tREG_ESR_EL3                    =62096 /* 62096 */,  // S3_6_c5_c2_0 at min EL3: ESR_EL3\n\tREG_TFSR_EL3                   =62128 /* 62128 */,\n\tREG_FAR_EL3                    =62208 /* 62208 */,  // S3_6_c6_c0_0 at min EL3: FAR_EL3\n\tREG_MAIR_EL3                   =62736 /* 62736 */,  // S3_6_c10_c2_0 at min EL3: MAIR_EL3\n\tREG_AMAIR_EL3                  =62744 /* 62744 */,  // S3_6_c10_c3_0 at min EL3: AMAIR_EL3\n\tREG_MPAM3_EL3                  =62760 /* 62760 */,\n\tREG_VBAR_EL3                   =62976 /* 62976 */,  // S3_6_c12_c0_0 at min EL3: VBAR_EL3\n\tREG_RVBAR_EL3                  =62977 /* 62977 */,  // S3_6_c12_c0_1 at min EL3: RVBAR_EL3\n\tREG_RMR_EL3                    =62978 /* 62978 */,  // S3_6_c12_c0_2 at min EL3: RMR_EL3\n\tREG_ICC_CTLR_EL3               =63076 /* 63076 */,\n\tREG_ICC_SRE_EL3                =63077 /* 63077 */,\n\tREG_ICC_IGRPEN1_EL3            =63079 /* 63079 */,\n\tREG_TPIDR_EL3                  =63106 /* 63106 */,  // S3_6_c13_c0_2 at min EL3: TPIDR_EL3\n\tREG_SCXTNUM_EL3                =63111 /* 63111 */,\n\tREG_MMU_ERR_STS                =63360 /* 63360 */,  // S3_6_c15_c0_0 at min EL1: MMU_ERR_STS\n\tREG_AFSR1_GL1                  =63361 /* 63361 */,  // S3_6_c15_c0_1 at min EL1: AFSR1_GL1\n\tREG_AFSR1_GL2                  =63362 /* 63362 */,  // S3_6_c15_c0_2 at min EL2: AFSR1_GL2\n\tREG_AFSR1_GL12                 =63363 /* 63363 */,  // S3_6_c15_c0_3 at min EL2: AFSR1_GL12\n\tREG_BP_OBJC_ADR_EL1            =63364 /* 63364 */,  // S3_6_c15_c0_4 at min EL1: BP_OBJC_ADR_EL1\n\tREG_BP_OBJC_CTL_EL1            =63365 /* 63365 */,  // S3_6_c15_c0_5 at min EL1: BP_OBJC_CTL_EL1\n\tREG_SP_GL11                    =63366 /* 63366 */,  // S3_6_c15_c0_6 at min EL1: SP_GL11\n\tREG_MMU_SESR_EL2               =63367 /* 63367 */,  // S3_6_c15_c0_7 at min EL2: MMU_SESR_EL2\n\tREG_SPRR_CONFIG_EL1            =63368 /* 63368 */,  // S3_6_c15_c1_0 at min EL1: SPRR_CONFIG_EL1\n\tREG_HPFAR_GL2                  =63369 /* 63369 */,  // S3_6_c15_c1_1 at min EL2: HPFAR_GL2\n\tREG_GXF_CONFIG_EL1             =63370 /* 63370 */,  // S3_6_c15_c1_2 at min EL1: GXF_CONFIG_EL1\n\tREG_AMRANGE_EL21               =63371 /* 63371 */,  // S3_6_c15_c1_3 at min EL1: AMRANGE_EL21\n\tREG_GXF_CONFIG_EL2             =63372 /* 63372 */,  // S3_6_c15_c1_4 at min EL2: GXF_CONFIG_EL2\n\tREG_SPRR_UPERM_EL0             =63373 /* 63373 */,  // S3_6_c15_c1_5 at min EL1: SPRR_UPERM_EL0\n\tREG_SPRR_PPERM_EL1             =63374 /* 63374 */,  // S3_6_c15_c1_6 at min EL1: SPRR_PPERM_EL1\n\tREG_SPRR_PPERM_EL2             =63375 /* 63375 */,  // S3_6_c15_c1_7 at min EL2: SPRR_PPERM_EL2\n\tREG_APGAKEYLO_EL12             =63377 /* 63377 */,  // S3_6_c15_c2_1 at min EL2: APGAKeyLo_EL12\n\tREG_APGAKEYHI_EL12             =63378 /* 63378 */,  // S3_6_c15_c2_2 at min EL2: APGAKeyHi_EL12\n\tREG_KERNKEYLO_EL12             =63379 /* 63379 */,  // S3_6_c15_c2_3 at min EL2: KERNKEYLo_EL12\n\tREG_KERNKEYHI_EL12             =63380 /* 63380 */,  // S3_6_c15_c2_4 at min EL2: KERNKEYHi_EL12\n\tREG_AFPCR_EL0                  =63381 /* 63381 */,  // S3_6_c15_c2_5 at min EL1: AFPCR_EL0\n\tREG_SP_GL22                    =63382 /* 63382 */,  // S3_6_c15_c2_6 at min EL2: SP_GL22\n\tREG_AMXIDR_EL1                 =63383 /* 63383 */,  // S3_6_c15_c2_7 at min EL1: AMXIDR_EL1\n\tREG_SPRR_HUMPRR_EL21           =63384 /* 63384 */,  // S3_6_c15_c3_0 at min EL1: SPRR_HUMPRR_EL21\n\tREG_SPRR_PMPRR_EL1             =63385 /* 63385 */,  // S3_6_c15_c3_1 at min EL1: SPRR_PMPRR_EL1\n\tREG_SPRR_PMPRR_EL2             =63386 /* 63386 */,  // S3_6_c15_c3_2 at min EL2: SPRR_PMPRR_EL2\n\tREG_SPRR_HUPERM_SH01_EL21      =63387 /* 63387 */,  // S3_6_c15_c3_3 at min EL1: SPRR_HUPERM_SH01_EL21\n\tREG_SPRR_HUPERM_SH02_EL21      =63388 /* 63388 */,  // S3_6_c15_c3_4 at min EL1: SPRR_HUPERM_SH02_EL21\n\tREG_SPRR_HUPERM_SH03_EL21      =63389 /* 63389 */,  // S3_6_c15_c3_5 at min EL1: SPRR_HUPERM_SH03_EL21\n\tREG_SPRR_HUPERM_SH04_EL21      =63390 /* 63390 */,  // S3_6_c15_c3_6 at min EL1: SPRR_HUPERM_SH04_EL21\n\tREG_SPRR_HUPERM_SH05_EL21      =63391 /* 63391 */,  // S3_6_c15_c3_7 at min EL1: SPRR_HUPERM_SH05_EL21\n\tREG_SPRR_HUPERM_SH06_EL21      =63392 /* 63392 */,  // S3_6_c15_c4_0 at min EL1: SPRR_HUPERM_SH06_EL21\n\tREG_SPRR_HUPERM_SH07_EL21      =63393 /* 63393 */,  // S3_6_c15_c4_1 at min EL1: SPRR_HUPERM_SH07_EL21\n\tREG_SPRR_PPERM_SH01_EL1        =63394 /* 63394 */,  // S3_6_c15_c4_2 at min EL1: SPRR_PPERM_SH01_EL1\n\tREG_SPRR_PPERM_SH02_EL1        =63395 /* 63395 */,  // S3_6_c15_c4_3 at min EL1: SPRR_PPERM_SH02_EL1\n\tREG_SPRR_PPERM_SH03_EL1        =63396 /* 63396 */,  // S3_6_c15_c4_4 at min EL1: SPRR_PPERM_SH03_EL1\n\tREG_SPRR_PPERM_SH04_EL1        =63397 /* 63397 */,  // S3_6_c15_c4_5 at min EL1: SPRR_PPERM_SH04_EL1\n\tREG_SPRR_PPERM_SH05_EL1        =63398 /* 63398 */,  // S3_6_c15_c4_6 at min EL1: SPRR_PPERM_SH05_EL1\n\tREG_SPRR_PPERM_SH06_EL1        =63399 /* 63399 */,  // S3_6_c15_c4_7 at min EL1: SPRR_PPERM_SH06_EL1\n\tREG_SPRR_PPERM_SH07_EL1        =63400 /* 63400 */,  // S3_6_c15_c5_0 at min EL1: SPRR_PPERM_SH07_EL1\n\tREG_SPRR_PPERM_SH01_EL2        =63401 /* 63401 */,  // S3_6_c15_c5_1 at min EL2: SPRR_PPERM_SH01_EL2\n\tREG_SPRR_PPERM_SH02_EL2        =63402 /* 63402 */,  // S3_6_c15_c5_2 at min EL2: SPRR_PPERM_SH02_EL2\n\tREG_SPRR_PPERM_SH03_EL2        =63403 /* 63403 */,  // S3_6_c15_c5_3 at min EL2: SPRR_PPERM_SH03_EL2\n\tREG_SPRR_PPERM_SH04_EL2        =63404 /* 63404 */,  // S3_6_c15_c5_4 at min EL2: SPRR_PPERM_SH04_EL2\n\tREG_SPRR_PPERM_SH05_EL2        =63405 /* 63405 */,  // S3_6_c15_c5_5 at min EL2: SPRR_PPERM_SH05_EL2\n\tREG_SPRR_PPERM_SH06_EL2        =63406 /* 63406 */,  // S3_6_c15_c5_6 at min EL2: SPRR_PPERM_SH06_EL2\n\tREG_SPRR_PPERM_SH07_EL2        =63407 /* 63407 */,  // S3_6_c15_c5_7 at min EL2: SPRR_PPERM_SH07_EL2\n\tREG_SPRR_PMPRR_EL12            =63408 /* 63408 */,  // S3_6_c15_c6_0 at min EL2: SPRR_PMPRR_EL12\n\tREG_SPRR_PPERM_SH01_EL12       =63409 /* 63409 */,  // S3_6_c15_c6_1 at min EL2: SPRR_PPERM_SH01_EL12\n\tREG_SPRR_PPERM_SH02_EL12       =63410 /* 63410 */,  // S3_6_c15_c6_2 at min EL2: SPRR_PPERM_SH02_EL12\n\tREG_SPRR_PPERM_SH03_EL12       =63411 /* 63411 */,  // S3_6_c15_c6_3 at min EL2: SPRR_PPERM_SH03_EL12\n\tREG_SPRR_PPERM_SH04_EL12       =63412 /* 63412 */,  // S3_6_c15_c6_4 at min EL2: SPRR_PPERM_SH04_EL12\n\tREG_SPRR_PPERM_SH05_EL12       =63413 /* 63413 */,  // S3_6_c15_c6_5 at min EL2: SPRR_PPERM_SH05_EL12\n\tREG_SPRR_PPERM_SH06_EL12       =63414 /* 63414 */,  // S3_6_c15_c6_6 at min EL2: SPRR_PPERM_SH06_EL12\n\tREG_SPRR_PPERM_SH07_EL12       =63415 /* 63415 */,  // S3_6_c15_c6_7 at min EL2: SPRR_PPERM_SH07_EL12\n\tREG_APIAKEYLO_EL12             =63416 /* 63416 */,  // S3_6_c15_c7_0 at min EL2: APIAKeyLo_EL12\n\tREG_APIAKEYHI_EL12             =63417 /* 63417 */,  // S3_6_c15_c7_1 at min EL2: APIAKeyHi_EL12\n\tREG_APIBKEYLO_EL12             =63418 /* 63418 */,  // S3_6_c15_c7_2 at min EL2: APIBKeyLo_EL12\n\tREG_APIBKEYHI_EL12             =63419 /* 63419 */,  // S3_6_c15_c7_3 at min EL2: APIBKeyHi_EL12\n\tREG_APDAKEYLO_EL12             =63420 /* 63420 */,  // S3_6_c15_c7_4 at min EL2: APDAKeyLo_EL12\n\tREG_APDAKEYHI_EL12             =63421 /* 63421 */,  // S3_6_c15_c7_5 at min EL2: APDAKeyHi_EL12\n\tREG_APDBKEYLO_EL12             =63422 /* 63422 */,  // S3_6_c15_c7_6 at min EL2: APDBKeyLo_EL12\n\tREG_APDBKEYHI_EL12             =63423 /* 63423 */,  // S3_6_c15_c7_7 at min EL2: APDBKeyHi_EL12\n\tREG_CURRENTG                   =63424 /* 63424 */,  // S3_6_c15_c8_0 at min EL1: CurrentG\n\tREG_GXF_ENTRY_EL1              =63425 /* 63425 */,  // S3_6_c15_c8_1 at min EL1: GXF_ENTRY_EL1\n\tREG_GXF_PABENTRY_EL1           =63426 /* 63426 */,  // S3_6_c15_c8_2 at min EL1: GXF_PABENTRY_EL1\n\tREG_ASPSR_EL1                  =63427 /* 63427 */,  // S3_6_c15_c8_3 at min EL1: ASPSR_EL1\n\tREG_ADSPSR_EL0                 =63428 /* 63428 */,  // S3_6_c15_c8_4 at min EL1: ADSPSR_EL0\n\tREG_PMCR1_GL2                  =63429 /* 63429 */,  // S3_6_c15_c8_5 at min EL2: PMCR1_GL2\n\tREG_ASPSR_EL2                  =63430 /* 63430 */,  // S3_6_c15_c8_6 at min EL2: ASPSR_EL2\n\tREG_PMCR1_GL1                  =63431 /* 63431 */,  // S3_6_c15_c8_7 at min EL1: PMCR1_GL1\n\tREG_VBAR_GL12                  =63434 /* 63434 */,  // S3_6_c15_c9_2 at min EL2: VBAR_GL12\n\tREG_SPSR_GL12                  =63435 /* 63435 */,  // S3_6_c15_c9_3 at min EL2: SPSR_GL12\n\tREG_ASPSR_GL12                 =63436 /* 63436 */,  // S3_6_c15_c9_4 at min EL2: ASPSR_GL12\n\tREG_ESR_GL12                   =63437 /* 63437 */,  // S3_6_c15_c9_5 at min EL2: ESR_GL12\n\tREG_ELR_GL12                   =63438 /* 63438 */,  // S3_6_c15_c9_6 at min EL2: ELR_GL12\n\tREG_FAR_GL12                   =63439 /* 63439 */,  // S3_6_c15_c9_7 at min EL2: FAR_GL12\n\tREG_SP_GL1                     =63440 /* 63440 */,  // S3_6_c15_c10_0 at min EL1: SP_GL1\n\tREG_TPIDR_GL1                  =63441 /* 63441 */,  // S3_6_c15_c10_1 at min EL1: TPIDR_GL1\n\tREG_VBAR_GL1                   =63442 /* 63442 */,  // S3_6_c15_c10_2 at min EL1: VBAR_GL1\n\tREG_SPSR_GL1                   =63443 /* 63443 */,  // S3_6_c15_c10_3 at min EL1: SPSR_GL1\n\tREG_ASPSR_GL1                  =63444 /* 63444 */,  // S3_6_c15_c10_4 at min EL1: ASPSR_GL1\n\tREG_ESR_GL1                    =63445 /* 63445 */,  // S3_6_c15_c10_5 at min EL1: ESR_GL1\n\tREG_ELR_GL1                    =63446 /* 63446 */,  // S3_6_c15_c10_6 at min EL1: ELR_GL1\n\tREG_FAR_GL1                    =63447 /* 63447 */,  // S3_6_c15_c10_7 at min EL1: FAR_GL1\n\tREG_SP_GL2                     =63448 /* 63448 */,  // S3_6_c15_c11_0 at min EL2: SP_GL2\n\tREG_TPIDR_GL2                  =63449 /* 63449 */,  // S3_6_c15_c11_1 at min EL2: TPIDR_GL2\n\tREG_VBAR_GL2                   =63450 /* 63450 */,  // S3_6_c15_c11_2 at min EL2: VBAR_GL2\n\tREG_SPSR_GL2                   =63451 /* 63451 */,  // S3_6_c15_c11_3 at min EL2: SPSR_GL2\n\tREG_ASPSR_GL2                  =63452 /* 63452 */,  // S3_6_c15_c11_4 at min EL2: ASPSR_GL2\n\tREG_ESR_GL2                    =63453 /* 63453 */,  // S3_6_c15_c11_5 at min EL2: ESR_GL2\n\tREG_ELR_GL2                    =63454 /* 63454 */,  // S3_6_c15_c11_6 at min EL2: ELR_GL2\n\tREG_FAR_GL2                    =63455 /* 63455 */,  // S3_6_c15_c11_7 at min EL2: FAR_GL2\n\tREG_GXF_ENTRY_EL2              =63456 /* 63456 */,  // S3_6_c15_c12_0 at min EL2: GXF_ENTRY_EL2\n\tREG_GXF_PABENTRY_EL2           =63457 /* 63457 */,  // S3_6_c15_c12_1 at min EL2: GXF_PABENTRY_EL2\n\tREG_APCTL_EL2                  =63458 /* 63458 */,  // S3_6_c15_c12_2 at min EL2: APCTL_EL2\n\tREG_APSTS_EL2                  =63459 /* 63459 */,  // S3_6_c15_c12_3 at min EL2: APSTS_EL2\n\tREG_APSTS_EL1                  =63460 /* 63460 */,  // S3_6_c15_c12_4 at min EL1: APSTS_EL1\n\tREG_KERNKEYLO_EL2              =63461 /* 63461 */,  // S3_6_c15_c12_5 at min EL2: KERNKEYLo_EL2\n\tREG_KERNKEYHI_EL2              =63462 /* 63462 */,  // S3_6_c15_c12_6 at min EL2: KERNKEYHi_EL2\n\tREG_ASPSR_EL12                 =63463 /* 63463 */,  // S3_6_c15_c12_7 at min EL2: ASPSR_EL12\n\tREG_APIAKEYLO_EL2              =63464 /* 63464 */,  // S3_6_c15_c13_0 at min EL2: APIAKeyLo_EL2\n\tREG_APIAKEYHI_EL2              =63465 /* 63465 */,  // S3_6_c15_c13_1 at min EL2: APIAKeyHi_EL2\n\tREG_APIBKEYLO_EL2              =63466 /* 63466 */,  // S3_6_c15_c13_2 at min EL2: APIBKeyLo_EL2\n\tREG_APIBKEYHI_EL2              =63467 /* 63467 */,  // S3_6_c15_c13_3 at min EL2: APIBKeyHi_EL2\n\tREG_APDAKEYLO_EL2              =63468 /* 63468 */,  // S3_6_c15_c13_4 at min EL2: APDAKeyLo_EL2\n\tREG_APDAKEYHI_EL2              =63469 /* 63469 */,  // S3_6_c15_c13_5 at min EL2: APDAKeyHi_EL2\n\tREG_APDBKEYLO_EL2              =63470 /* 63470 */,  // S3_6_c15_c13_6 at min EL2: APDBKeyLo_EL2\n\tREG_APDBKEYHI_EL2              =63471 /* 63471 */,  // S3_6_c15_c13_7 at min EL2: APDBKeyHi_EL2\n\tREG_APGAKEYLO_EL2              =63472 /* 63472 */,  // S3_6_c15_c14_0 at min EL2: APGAKeyLo_EL2\n\tREG_APGAKEYHI_EL2              =63473 /* 63473 */,  // S3_6_c15_c14_1 at min EL2: APGAKeyHi_EL2\n\tREG_SPRR_CONFIG_EL2            =63474 /* 63474 */,  // S3_6_c15_c14_2 at min EL2: SPRR_CONFIG_EL2\n\tREG_SPRR_AMRANGE_EL2           =63475 /* 63475 */,  // S3_6_c15_c14_3 at min EL2: SPRR_AMRANGE_EL2\n\tREG_VMKEYLO_EL2                =63476 /* 63476 */,  // S3_6_c15_c14_4 at min EL2: VMKEYLo_EL2\n\tREG_VMKEYHI_EL2                =63477 /* 63477 */,  // S3_6_c15_c14_5 at min EL2: VMKEYHi_EL2\n\tREG_MMU_SFAR_EL2               =63478 /* 63478 */,  // S3_6_c15_c14_6 at min EL2: MMU_SFAR_EL2\n\tREG_APSTS_EL12                 =63479 /* 63479 */,  // S3_6_c15_c14_7 at min EL2: APSTS_EL12\n\tREG_APCTL_EL12                 =63480 /* 63480 */,  // S3_6_c15_c15_0 at min EL2: APCTL_EL12\n\tREG_GXF_CONFIG_EL12            =63481 /* 63481 */,  // S3_6_c15_c15_1 at min EL2: GXF_CONFIG_EL12\n\tREG_GXF_ENTRY_EL12             =63482 /* 63482 */,  // S3_6_c15_c15_2 at min EL2: GXF_ENTRY_EL12\n\tREG_GXF_PABENTRY_EL12          =63483 /* 63483 */,  // S3_6_c15_c15_3 at min EL2: GXF_PABENTRY_EL12\n\tREG_SPRR_CONFIG_EL12           =63484 /* 63484 */,  // S3_6_c15_c15_4 at min EL2: SPRR_CONFIG_EL12\n\tREG_SPRR_AMRANGE_EL12          =63485 /* 63485 */,  // S3_6_c15_c15_5 at min EL2: SPRR_AMRANGE_EL12\n\tREG_MMU_SESR_CTL_EL2           =63486 /* 63486 */,  // S3_6_c15_c15_6 at min EL2: MMU_SESR_CTL_EL2\n\tREG_SPRR_PPERM_EL12            =63487 /* 63487 */,  // S3_6_c15_c15_7 at min EL2: SPRR_PPERM_EL12\n\tREG_CNTPS_TVAL_EL1             =65296 /* 65296 */,  // S3_7_c14_c2_0 at min EL1: CNTPS_TVAL_EL1\n\tREG_CNTPS_CTL_EL1              =65297 /* 65297 */,  // S3_7_c14_c2_1 at min EL1: CNTPS_CTL_EL1\n\tREG_CNTPS_CVAL_EL1             =65298 /* 65298 */,  // S3_7_c14_c2_2 at min EL1: CNTPS_CVAL_EL1\n\tREG_PSTATE_SPSEL               =65299 /* 65299 */,  // (op0,op1,crn,crm,op2)=(0,0,4,9,5) doesn't map to [SYSREG_NONE+1, SYSREG_END)\n\tREG_PWRDNSAVE0                 =65408 /* 65408 */,  // S3_7_c15_c0_0 at min EL1: PWRDNSAVE0\n\tREG_NRG_ACC_CTL                =65409 /* 65409 */,  // S3_7_c15_c0_1 at min EL1: NRG_ACC_CTL\n\tREG_AON_CNT0                   =65410 /* 65410 */,  // S3_7_c15_c0_2 at min EL1: AON_CNT0\n\tREG_CPU_CNT0                   =65411 /* 65411 */,  // S3_7_c15_c0_3 at min EL1: CPU_CNT0\n\tREG_UPMCR0_EL1                 =65412 /* 65412 */,  // S3_7_c15_c0_4 at min EL1: UPMCR0_EL1\n\tREG_UPMC8                      =65413 /* 65413 */,  // S3_7_c15_c0_5 at min EL1: UPMC8\n\tREG_AON_CNT8                   =65414 /* 65414 */,  // S3_7_c15_c0_6 at min EL1: AON_CNT8\n\tREG_PWRDNSAVE1                 =65416 /* 65416 */,  // S3_7_c15_c1_0 at min EL1: PWRDNSAVE1\n\tREG_CORE_NRG_ACC_DAT           =65417 /* 65417 */,  // S3_7_c15_c1_1 at min EL1: CORE_NRG_ACC_DAT\n\tREG_AON_CNT_CTL0               =65418 /* 65418 */,  // S3_7_c15_c1_2 at min EL1: AON_CNT_CTL0\n\tREG_CPU_CNT_CTL0               =65419 /* 65419 */,  // S3_7_c15_c1_3 at min EL1: CPU_CNT_CTL0\n\tREG_UPMESR0_EL1                =65420 /* 65420 */,  // S3_7_c15_c1_4 at min EL1: UPMESR0_EL1\n\tREG_UPMC9                      =65421 /* 65421 */,  // S3_7_c15_c1_5 at min EL1: UPMC9\n\tREG_AON_CNT_CTL8               =65422 /* 65422 */,  // S3_7_c15_c1_6 at min EL1: AON_CNT_CTL8\n\tREG_ACC_PWR_DN_SAVE            =65424 /* 65424 */,  // S3_7_c15_c2_0 at min EL1: ACC_PWR_DN_SAVE\n\tREG_CPM_NRG_ACC_DAT            =65425 /* 65425 */,  // S3_7_c15_c2_1 at min EL1: CPM_NRG_ACC_DAT\n\tREG_AON_CNT1                   =65426 /* 65426 */,  // S3_7_c15_c2_2 at min EL1: AON_CNT1\n\tREG_CPU_CNT1                   =65427 /* 65427 */,  // S3_7_c15_c2_3 at min EL1: CPU_CNT1\n\tREG_UPMSWCTRL_EL1              =65428 /* 65428 */,  // S3_7_c15_c2_4 at min EL1: UPMSWCTRL_EL1\n\tREG_UPMC10                     =65429 /* 65429 */,  // S3_7_c15_c2_5 at min EL1: UPMC10\n\tREG_AON_CNT9                   =65430 /* 65430 */,  // S3_7_c15_c2_6 at min EL1: AON_CNT9\n\tREG_CORE_SRM_NRG_ACC_DAT       =65433 /* 65433 */,  // S3_7_c15_c3_1 at min EL1: CORE_SRM_NRG_ACC_DAT\n\tREG_AON_CNT_CTL1               =65434 /* 65434 */,  // S3_7_c15_c3_2 at min EL1: AON_CNT_CTL1\n\tREG_CPU_CNT_CTL1               =65435 /* 65435 */,  // S3_7_c15_c3_3 at min EL1: CPU_CNT_CTL1\n\tREG_UPMECM0_EL1                =65436 /* 65436 */,  // S3_7_c15_c3_4 at min EL1: UPMECM0_EL1\n\tREG_UPMC11                     =65437 /* 65437 */,  // S3_7_c15_c3_5 at min EL1: UPMC11\n\tREG_AON_CNT_CTL9               =65438 /* 65438 */,  // S3_7_c15_c3_6 at min EL1: AON_CNT_CTL9\n\tREG_AON_CNT_CTL                =65440 /* 65440 */,  // S3_7_c15_c4_0 at min EL1: AON_CNT_CTL\n\tREG_CPM_SRM_NRG_ACC_DAT        =65441 /* 65441 */,  // S3_7_c15_c4_1 at min EL1: CPM_SRM_NRG_ACC_DAT\n\tREG_AON_CNT2                   =65442 /* 65442 */,  // S3_7_c15_c4_2 at min EL1: AON_CNT2\n\tREG_CPU_CNT2                   =65443 /* 65443 */,  // S3_7_c15_c4_3 at min EL1: CPU_CNT2\n\tREG_UPMECM1_EL1                =65444 /* 65444 */,  // S3_7_c15_c4_4 at min EL1: UPMECM1_EL1\n\tREG_UPMC12                     =65445 /* 65445 */,  // S3_7_c15_c4_5 at min EL1: UPMC12\n\tREG_AON_CNT10                  =65446 /* 65446 */,  // S3_7_c15_c4_6 at min EL1: AON_CNT10\n\tREG_CPU_CNT_CTL                =65448 /* 65448 */,  // S3_7_c15_c5_0 at min EL1: CPU_CNT_CTL\n\tREG_AON_CNT_CTL2               =65450 /* 65450 */,  // S3_7_c15_c5_2 at min EL1: AON_CNT_CTL2\n\tREG_CPU_CNT_CTL2               =65451 /* 65451 */,  // S3_7_c15_c5_3 at min EL1: CPU_CNT_CTL2\n\tREG_UPMPCM_EL1                 =65452 /* 65452 */,  // S3_7_c15_c5_4 at min EL1: UPMPCM_EL1\n\tREG_UPMC13                     =65453 /* 65453 */,  // S3_7_c15_c5_5 at min EL1: UPMC13\n\tREG_AON_CNT_CTL10              =65454 /* 65454 */,  // S3_7_c15_c5_6 at min EL1: AON_CNT_CTL10\n\tREG_AON_CNT3                   =65458 /* 65458 */,  // S3_7_c15_c6_2 at min EL1: AON_CNT3\n\tREG_CPU_CNT3                   =65459 /* 65459 */,  // S3_7_c15_c6_3 at min EL1: CPU_CNT3\n\tREG_UPMSR_EL1                  =65460 /* 65460 */,  // S3_7_c15_c6_4 at min EL1: UPMSR_EL1\n\tREG_UPMC14                     =65461 /* 65461 */,  // S3_7_c15_c6_5 at min EL1: UPMC14\n\tREG_AON_CNT11                  =65462 /* 65462 */,  // S3_7_c15_c6_6 at min EL1: AON_CNT11\n\tREG_AON_CNT_CTL3               =65466 /* 65466 */,  // S3_7_c15_c7_2 at min EL1: AON_CNT_CTL3\n\tREG_CPU_CNT_CTL3               =65467 /* 65467 */,  // S3_7_c15_c7_3 at min EL1: CPU_CNT_CTL3\n\tREG_UPMC0                      =65468 /* 65468 */,  // S3_7_c15_c7_4 at min EL1: UPMC0\n\tREG_UPMC15                     =65469 /* 65469 */,  // S3_7_c15_c7_5 at min EL1: UPMC15\n\tREG_AON_CNT_CTL11              =65470 /* 65470 */,  // S3_7_c15_c7_6 at min EL1: AON_CNT_CTL11\n\tREG_AON_CNT4                   =65474 /* 65474 */,  // S3_7_c15_c8_2 at min EL1: AON_CNT4\n\tREG_CPU_CNT4                   =65475 /* 65475 */,  // S3_7_c15_c8_3 at min EL1: CPU_CNT4\n\tREG_UPMC1                      =65476 /* 65476 */,  // S3_7_c15_c8_4 at min EL1: UPMC1\n\tREG_UPMECM2_EL1                =65477 /* 65477 */,  // S3_7_c15_c8_5 at min EL1: UPMECM2_EL1\n\tREG_AON_CNT_CTL4               =65482 /* 65482 */,  // S3_7_c15_c9_2 at min EL1: AON_CNT_CTL4\n\tREG_CPU_CNT_CTL4               =65483 /* 65483 */,  // S3_7_c15_c9_3 at min EL1: CPU_CNT_CTL4\n\tREG_UPMC2                      =65484 /* 65484 */,  // S3_7_c15_c9_4 at min EL1: UPMC2\n\tREG_UPMECM3_EL1                =65485 /* 65485 */,  // S3_7_c15_c9_5 at min EL1: UPMECM3_EL1\n\tREG_AON_CNT5                   =65490 /* 65490 */,  // S3_7_c15_c10_2 at min EL1: AON_CNT5\n\tREG_CPU_CNT5                   =65491 /* 65491 */,  // S3_7_c15_c10_3 at min EL1: CPU_CNT5\n\tREG_UPMC3                      =65492 /* 65492 */,  // S3_7_c15_c10_4 at min EL1: UPMC3\n\tREG_UPMCR1_EL1                 =65493 /* 65493 */,  // S3_7_c15_c10_5 at min EL1: UPMCR1_EL1\n\tREG_AON_CNT_CTL5               =65498 /* 65498 */,  // S3_7_c15_c11_2 at min EL1: AON_CNT_CTL5\n\tREG_CPU_CNT_CTL5               =65499 /* 65499 */,  // S3_7_c15_c11_3 at min EL1: CPU_CNT_CTL5\n\tREG_UPMC4                      =65500 /* 65500 */,  // S3_7_c15_c11_4 at min EL1: UPMC4\n\tREG_UPMESR1_EL1                =65501 /* 65501 */,  // S3_7_c15_c11_5 at min EL1: UPMESR1_EL1\n\tREG_AON_CNT6                   =65506 /* 65506 */,  // S3_7_c15_c12_2 at min EL1: AON_CNT6\n\tREG_CPU_CNT6                   =65507 /* 65507 */,  // S3_7_c15_c12_3 at min EL1: CPU_CNT6\n\tREG_UPMC5                      =65508 /* 65508 */,  // S3_7_c15_c12_4 at min EL1: UPMC5\n\tREG_AON_CNT_CTL6               =65514 /* 65514 */,  // S3_7_c15_c13_2 at min EL1: AON_CNT_CTL6\n\tREG_CPU_CNT_CTL6               =65515 /* 65515 */,  // S3_7_c15_c13_3 at min EL1: CPU_CNT_CTL6\n\tREG_UPMC6                      =65516 /* 65516 */,  // S3_7_c15_c13_4 at min EL1: UPMC6\n\tREG_AON_CNT7                   =65522 /* 65522 */,  // S3_7_c15_c14_2 at min EL1: AON_CNT7\n\tREG_CPU_CNT7                   =65523 /* 65523 */,  // S3_7_c15_c14_3 at min EL1: CPU_CNT7\n\tREG_UPMC7                      =65524 /* 65524 */,  // S3_7_c15_c14_4 at min EL1: UPMC7\n\tREG_AON_CNT_CTL7               =65530 /* 65530 */,  // S3_7_c15_c15_2 at min EL1: AON_CNT_CTL7\n\tREG_CPU_CNT_CTL7               =65531 /* 65531 */,  // S3_7_c15_c15_3 at min EL1: CPU_CNT_CTL7\n\tSYSREG_END=65532\n};\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nbool has_system_register_name(enum SystemReg);\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/dia/cvconst.h",
    "content": "// cvconst.h - codeview constant definitions\n//-----------------------------------------------------------------\n//\n// Copyright Microsoft Corporation.  All Rights Reserved.\n//\n//---------------------------------------------------------------\n#ifndef _CVCONST_H_\n#define _CVCONST_H_\n\n\n\n//      Enumeration for function call type\n\n\ntypedef enum CV_call_e\n{\n    CV_CALL_NEAR_C      = 0x00, // near right to left push, caller pops stack\n    CV_CALL_FAR_C       = 0x01, // far right to left push, caller pops stack\n    CV_CALL_NEAR_PASCAL = 0x02, // near left to right push, callee pops stack\n    CV_CALL_FAR_PASCAL  = 0x03, // far left to right push, callee pops stack\n    CV_CALL_NEAR_FAST   = 0x04, // near left to right push with regs, callee pops stack\n    CV_CALL_FAR_FAST    = 0x05, // far left to right push with regs, callee pops stack\n    CV_CALL_SKIPPED     = 0x06, // skipped (unused) call index\n    CV_CALL_NEAR_STD    = 0x07, // near standard call\n    CV_CALL_FAR_STD     = 0x08, // far standard call\n    CV_CALL_NEAR_SYS    = 0x09, // near sys call\n    CV_CALL_FAR_SYS     = 0x0a, // far sys call\n    CV_CALL_THISCALL    = 0x0b, // this call (this passed in register)\n    CV_CALL_MIPSCALL    = 0x0c, // Mips call\n    CV_CALL_GENERIC     = 0x0d, // Generic call sequence\n    CV_CALL_ALPHACALL   = 0x0e, // Alpha call\n    CV_CALL_PPCCALL     = 0x0f, // PPC call\n    CV_CALL_SHCALL      = 0x10, // Hitachi SuperH call\n    CV_CALL_ARMCALL     = 0x11, // ARM call\n    CV_CALL_AM33CALL    = 0x12, // AM33 call\n    CV_CALL_TRICALL     = 0x13, // TriCore Call\n    CV_CALL_SH5CALL     = 0x14, // Hitachi SuperH-5 call\n    CV_CALL_M32RCALL    = 0x15, // M32R Call\n    CV_CALL_CLRCALL     = 0x16, // clr call\n    CV_CALL_INLINE      = 0x17, // Marker for routines always inlined and thus lacking a convention\n    CV_CALL_NEAR_VECTOR = 0x18, // near left to right push with regs, callee pops stack\n    CV_CALL_SWIFT       = 0x19, // Swift calling convention\n    CV_CALL_RESERVED    = 0x20  // first unused call enumeration\n\n    // Do NOT add any more machine specific conventions.  This is to be used for\n    // calling conventions in the source only (e.g. __cdecl, __stdcall).\n} CV_call_e;\n\n\n//      Values for the access protection of class attributes\n\n\ntypedef enum CV_access_e\n{\n    CV_private   = 1,\n    CV_protected = 2,\n    CV_public    = 3\n} CV_access_e;\n\n\ntypedef enum THUNK_ORDINAL\n{\n    THUNK_ORDINAL_NOTYPE,       // standard thunk\n    THUNK_ORDINAL_ADJUSTOR,     // \"this\" adjustor thunk\n    THUNK_ORDINAL_VCALL,        // virtual call thunk\n    THUNK_ORDINAL_PCODE,        // pcode thunk\n    THUNK_ORDINAL_LOAD,         // thunk which loads the address to jump to\n                                //  via unknown means...\n\n    // trampoline thunk ordinals   - only for use in Trampoline thunk symbols\n\n    THUNK_ORDINAL_TRAMP_INCREMENTAL,\n    THUNK_ORDINAL_TRAMP_BRANCHISLAND,\n    THUNK_ORDINAL_TRAMP_STRICTICF,\n    THUNK_ORDINAL_TRAMP_ARM64XSAMEADDRESS,\n    THUNK_ORDINAL_TRAMP_FUNCOVERRIDING,\n} THUNK_ORDINAL;\n\n\nenum CV_SourceChksum_t\n{\n    CHKSUM_TYPE_NONE = 0,        // indicates no checksum is available\n    CHKSUM_TYPE_MD5,\n    CHKSUM_TYPE_SHA1,\n    CHKSUM_TYPE_SHA_256,\n};\n\n//\n// DIA enums\n//\n\nenum SymTagEnum\n{\n    SymTagNull,\n    SymTagExe,\n    SymTagCompiland,\n    SymTagCompilandDetails,\n    SymTagCompilandEnv,\n    SymTagFunction,\n    SymTagBlock,\n    SymTagData,\n    SymTagAnnotation,\n    SymTagLabel,\n    SymTagPublicSymbol,\n    SymTagUDT,\n    SymTagEnum,\n    SymTagFunctionType,\n    SymTagPointerType,\n    SymTagArrayType,\n    SymTagBaseType,\n    SymTagTypedef,\n    SymTagBaseClass,\n    SymTagFriend,\n    SymTagFunctionArgType,\n    SymTagFuncDebugStart,\n    SymTagFuncDebugEnd,\n    SymTagUsingNamespace,\n    SymTagVTableShape,\n    SymTagVTable,\n    SymTagCustom,\n    SymTagThunk,\n    SymTagCustomType,\n    SymTagManagedType,\n    SymTagDimension,\n    SymTagCallSite,\n    SymTagInlineSite,\n    SymTagBaseInterface,\n    SymTagVectorType,\n    SymTagMatrixType,\n    SymTagHLSLType,\n    SymTagCaller,\n    SymTagCallee,\n    SymTagExport,\n    SymTagHeapAllocationSite,\n    SymTagCoffGroup,\n    SymTagInlinee,\n    SymTagTaggedUnionCase, // a case of a tagged union UDT type\n    SymTagMax\n};\n\nenum LocationType\n{\n    LocIsNull,\n    LocIsStatic,\n    LocIsTLS,\n    LocIsRegRel,\n    LocIsThisRel,\n    LocIsEnregistered,\n    LocIsBitField,\n    LocIsSlot,\n    LocIsIlRel,\n    LocInMetaData,\n    LocIsConstant,\n    LocIsRegRelAliasIndir,\n    LocTypeMax\n};\n\nenum DataKind\n{\n    DataIsUnknown,\n    DataIsLocal,\n    DataIsStaticLocal,\n    DataIsParam,\n    DataIsObjectPtr,\n    DataIsFileStatic,\n    DataIsGlobal,\n    DataIsMember,\n    DataIsStaticMember,\n    DataIsConstant\n};\n\nenum UdtKind\n{\n    UdtStruct,\n    UdtClass,\n    UdtUnion,\n    UdtInterface,\n    UdtTaggedUnion\n};\n\nenum BasicType\n{\n    btNoType = 0,\n    btVoid = 1,\n    btChar = 2,\n    btWChar = 3,\n    btInt = 6,\n    btUInt = 7,\n    btFloat = 8,\n    btBCD = 9,\n    btBool = 10,\n    btLong = 13,\n    btULong = 14,\n    btCurrency = 25,\n    btDate = 26,\n    btVariant = 27,\n    btComplex = 28,\n    btBit = 29,\n    btBSTR = 30,\n    btHresult = 31,\n    btChar16 = 32,  // char16_t\n    btChar32 = 33,  // char32_t\n    btChar8  = 34,  // char8_t\n};\n\n\n//      enumeration for type modifier values\n\ntypedef enum CV_modifier_e\n{\n    // 0x0000 - 0x01ff - Reserved.\n\n    CV_MOD_INVALID                      = 0x0000,\n\n    // Standard modifiers.\n\n    CV_MOD_CONST                        = 0x0001,\n    CV_MOD_VOLATILE                     = 0x0002,\n    CV_MOD_UNALIGNED                    = 0x0003,\n    \n    // 0x0200 - 0x03ff - HLSL modifiers.\n\n    CV_MOD_HLSL_UNIFORM                 = 0x0200,\n    CV_MOD_HLSL_LINE                    = 0x0201,\n    CV_MOD_HLSL_TRIANGLE                = 0x0202,\n    CV_MOD_HLSL_LINEADJ                 = 0x0203,\n    CV_MOD_HLSL_TRIANGLEADJ             = 0x0204,\n    CV_MOD_HLSL_LINEAR                  = 0x0205,\n    CV_MOD_HLSL_CENTROID                = 0x0206,\n    CV_MOD_HLSL_CONSTINTERP             = 0x0207,\n    CV_MOD_HLSL_NOPERSPECTIVE           = 0x0208,\n    CV_MOD_HLSL_SAMPLE                  = 0x0209,\n    CV_MOD_HLSL_CENTER                  = 0x020a,\n    CV_MOD_HLSL_SNORM                   = 0x020b,\n    CV_MOD_HLSL_UNORM                   = 0x020c,\n    CV_MOD_HLSL_PRECISE                 = 0x020d,\n    CV_MOD_HLSL_UAV_GLOBALLY_COHERENT   = 0x020e,\n\n    // 0x0400 - 0xffff - Unused.\n    \n} CV_modifier_e;\n\n\n//      built-in type kinds\n\n\ntypedef enum CV_builtin_e\n{\n    // 0x0000 - 0x01ff - Reserved.\n    CV_BI_INVALID                       = 0x0000,\n    \n    // 0x0200 - 0x03ff - HLSL types.\n\n    CV_BI_HLSL_INTERFACE_POINTER        = 0x0200,\n    CV_BI_HLSL_TEXTURE1D                = 0x0201,\n    CV_BI_HLSL_TEXTURE1D_ARRAY          = 0x0202,\n    CV_BI_HLSL_TEXTURE2D                = 0x0203,\n    CV_BI_HLSL_TEXTURE2D_ARRAY          = 0x0204,\n    CV_BI_HLSL_TEXTURE3D                = 0x0205,\n    CV_BI_HLSL_TEXTURECUBE              = 0x0206,\n    CV_BI_HLSL_TEXTURECUBE_ARRAY        = 0x0207,\n    CV_BI_HLSL_TEXTURE2DMS              = 0x0208,\n    CV_BI_HLSL_TEXTURE2DMS_ARRAY        = 0x0209,\n    CV_BI_HLSL_SAMPLER                  = 0x020a,\n    CV_BI_HLSL_SAMPLERCOMPARISON        = 0x020b,\n    CV_BI_HLSL_BUFFER                   = 0x020c,\n    CV_BI_HLSL_POINTSTREAM              = 0x020d,\n    CV_BI_HLSL_LINESTREAM               = 0x020e,\n    CV_BI_HLSL_TRIANGLESTREAM           = 0x020f,\n    CV_BI_HLSL_INPUTPATCH               = 0x0210,\n    CV_BI_HLSL_OUTPUTPATCH              = 0x0211,\n    CV_BI_HLSL_RWTEXTURE1D              = 0x0212,\n    CV_BI_HLSL_RWTEXTURE1D_ARRAY        = 0x0213,\n    CV_BI_HLSL_RWTEXTURE2D              = 0x0214,\n    CV_BI_HLSL_RWTEXTURE2D_ARRAY        = 0x0215,\n    CV_BI_HLSL_RWTEXTURE3D              = 0x0216,\n    CV_BI_HLSL_RWBUFFER                 = 0x0217,\n    CV_BI_HLSL_BYTEADDRESS_BUFFER       = 0x0218,\n    CV_BI_HLSL_RWBYTEADDRESS_BUFFER     = 0x0219,\n    CV_BI_HLSL_STRUCTURED_BUFFER        = 0x021a,\n    CV_BI_HLSL_RWSTRUCTURED_BUFFER      = 0x021b,\n    CV_BI_HLSL_APPEND_STRUCTURED_BUFFER = 0x021c,\n    CV_BI_HLSL_CONSUME_STRUCTURED_BUFFER= 0x021d,\n    CV_BI_HLSL_MIN8FLOAT                = 0x021e,\n    CV_BI_HLSL_MIN10FLOAT               = 0x021f,\n    CV_BI_HLSL_MIN16FLOAT               = 0x0220,\n    CV_BI_HLSL_MIN12INT                 = 0x0221,\n    CV_BI_HLSL_MIN16INT                 = 0x0222,\n    CV_BI_HLSL_MIN16UINT                = 0x0223,\n    CV_BI_HLSL_CONSTANT_BUFFER          = 0x0224,\n\n    // 0x0400 - 0xffff - Unused.\n    \n} CV_builtin_e;\n\n\n//  enum describing the compile flag source language\n\n\ntypedef enum CV_CFL_LANG\n{\n    CV_CFL_C        = 0x00,\n    CV_CFL_CXX      = 0x01,\n    CV_CFL_FORTRAN  = 0x02,\n    CV_CFL_MASM     = 0x03,\n    CV_CFL_PASCAL   = 0x04,\n    CV_CFL_BASIC    = 0x05,\n    CV_CFL_COBOL    = 0x06,\n    CV_CFL_LINK     = 0x07,\n    CV_CFL_CVTRES   = 0x08,\n    CV_CFL_CVTPGD   = 0x09,\n    CV_CFL_CSHARP   = 0x0A,  // C#\n    CV_CFL_VB       = 0x0B,  // Visual Basic\n    CV_CFL_ILASM    = 0x0C,  // IL (as in CLR) ASM\n    CV_CFL_JAVA     = 0x0D,\n    CV_CFL_JSCRIPT  = 0x0E,\n    CV_CFL_MSIL     = 0x0F,  // Unknown MSIL (LTCG of .NETMODULE)\n    CV_CFL_HLSL     = 0x10,  // High Level Shader Language\n    CV_CFL_OBJC     = 0x11,  // Objective-C\n    CV_CFL_OBJCXX   = 0x12,  // Objective-C++\n    CV_CFL_SWIFT    = 0x13,  // Swift\n    CV_CFL_ALIASOBJ = 0x14,\n    CV_CFL_RUST     = 0x15,  // Rust\n    CV_CFL_GO       = 0x16,  // Go\n} CV_CFL_LANG;\n\n\n//  enum describing target processor\n\n\ntypedef enum CV_CPU_TYPE_e\n{\n    CV_CFL_8080             = 0x00,\n    CV_CFL_8086             = 0x01,\n    CV_CFL_80286            = 0x02,\n    CV_CFL_80386            = 0x03,\n    CV_CFL_80486            = 0x04,\n    CV_CFL_PENTIUM          = 0x05,\n    CV_CFL_PENTIUMII        = 0x06,\n    CV_CFL_PENTIUMPRO       = CV_CFL_PENTIUMII,\n    CV_CFL_PENTIUMIII       = 0x07,\n    CV_CFL_MIPS             = 0x10,\n    CV_CFL_MIPSR4000        = CV_CFL_MIPS,  // don't break current code\n    CV_CFL_MIPS16           = 0x11,\n    CV_CFL_MIPS32           = 0x12,\n    CV_CFL_MIPS64           = 0x13,\n    CV_CFL_MIPSI            = 0x14,\n    CV_CFL_MIPSII           = 0x15,\n    CV_CFL_MIPSIII          = 0x16,\n    CV_CFL_MIPSIV           = 0x17,\n    CV_CFL_MIPSV            = 0x18,\n    CV_CFL_M68000           = 0x20,\n    CV_CFL_M68010           = 0x21,\n    CV_CFL_M68020           = 0x22,\n    CV_CFL_M68030           = 0x23,\n    CV_CFL_M68040           = 0x24,\n    CV_CFL_ALPHA            = 0x30,\n    CV_CFL_ALPHA_21064      = 0x30,\n    CV_CFL_ALPHA_21164      = 0x31,\n    CV_CFL_ALPHA_21164A     = 0x32,\n    CV_CFL_ALPHA_21264      = 0x33,\n    CV_CFL_ALPHA_21364      = 0x34,\n    CV_CFL_PPC601           = 0x40,\n    CV_CFL_PPC603           = 0x41,\n    CV_CFL_PPC604           = 0x42,\n    CV_CFL_PPC620           = 0x43,\n    CV_CFL_PPCFP            = 0x44,\n    CV_CFL_PPCBE            = 0x45,\n    CV_CFL_SH3              = 0x50,\n    CV_CFL_SH3E             = 0x51,\n    CV_CFL_SH3DSP           = 0x52,\n    CV_CFL_SH4              = 0x53,\n    CV_CFL_SHMEDIA          = 0x54,\n    CV_CFL_ARM3             = 0x60,\n    CV_CFL_ARM4             = 0x61,\n    CV_CFL_ARM4T            = 0x62,\n    CV_CFL_ARM5             = 0x63,\n    CV_CFL_ARM5T            = 0x64,\n    CV_CFL_ARM6             = 0x65,\n    CV_CFL_ARM_XMAC         = 0x66,\n    CV_CFL_ARM_WMMX         = 0x67,\n    CV_CFL_ARM7             = 0x68,\n    CV_CFL_OMNI             = 0x70,\n    CV_CFL_IA64             = 0x80,\n    CV_CFL_IA64_1           = 0x80,\n    CV_CFL_IA64_2           = 0x81,\n    CV_CFL_CEE              = 0x90,\n    CV_CFL_AM33             = 0xA0,\n    CV_CFL_M32R             = 0xB0,\n    CV_CFL_TRICORE          = 0xC0,\n    CV_CFL_X64              = 0xD0,\n    CV_CFL_AMD64            = CV_CFL_X64,\n    CV_CFL_EBC              = 0xE0,\n    CV_CFL_THUMB            = 0xF0,\n    CV_CFL_ARMNT            = 0xF4,\n    CV_CFL_ARM64            = 0xF6,\n    CV_CFL_HYBRID_X86_ARM64 = 0xF7,\n    CV_CFL_ARM64EC          = 0xF8,\n    CV_CFL_ARM64X           = 0xF9,\n    CV_CFL_UNKNOWN          = 0xFF,\n    CV_CFL_D3D11_SHADER     = 0x100,\n} CV_CPU_TYPE_e;\n\ntypedef enum CV_HREG_e\n{\n    // Register subset shared by all processor types,\n    // must not overlap with any of the ranges below, hence the high values\n\n    CV_ALLREG_ERR   =   30000,\n    CV_ALLREG_TEB   =   30001,\n    CV_ALLREG_TIMER =   30002,\n    CV_ALLREG_EFAD1 =   30003,\n    CV_ALLREG_EFAD2 =   30004,\n    CV_ALLREG_EFAD3 =   30005,\n    CV_ALLREG_VFRAME=   30006,\n    CV_ALLREG_HANDLE=   30007,\n    CV_ALLREG_PARAMS=   30008,\n    CV_ALLREG_LOCALS=   30009,\n    CV_ALLREG_TID   =   30010,\n    CV_ALLREG_ENV   =   30011,\n    CV_ALLREG_CMDLN =   30012,\n\n\n    //  Register set for the Intel 80x86 and ix86 processor series\n    //  (plus PCODE registers)\n\n    CV_REG_NONE     =   0,\n    CV_REG_AL       =   1,\n    CV_REG_CL       =   2,\n    CV_REG_DL       =   3,\n    CV_REG_BL       =   4,\n    CV_REG_AH       =   5,\n    CV_REG_CH       =   6,\n    CV_REG_DH       =   7,\n    CV_REG_BH       =   8,\n    CV_REG_AX       =   9,\n    CV_REG_CX       =  10,\n    CV_REG_DX       =  11,\n    CV_REG_BX       =  12,\n    CV_REG_SP       =  13,\n    CV_REG_BP       =  14,\n    CV_REG_SI       =  15,\n    CV_REG_DI       =  16,\n    CV_REG_EAX      =  17,\n    CV_REG_ECX      =  18,\n    CV_REG_EDX      =  19,\n    CV_REG_EBX      =  20,\n    CV_REG_ESP      =  21,\n    CV_REG_EBP      =  22,\n    CV_REG_ESI      =  23,\n    CV_REG_EDI      =  24,\n    CV_REG_ES       =  25,\n    CV_REG_CS       =  26,\n    CV_REG_SS       =  27,\n    CV_REG_DS       =  28,\n    CV_REG_FS       =  29,\n    CV_REG_GS       =  30,\n    CV_REG_IP       =  31,\n    CV_REG_FLAGS    =  32,\n    CV_REG_EIP      =  33,\n    CV_REG_EFLAGS   =  34,\n    CV_REG_TEMP     =  40,          // PCODE Temp\n    CV_REG_TEMPH    =  41,          // PCODE TempH\n    CV_REG_QUOTE    =  42,          // PCODE Quote\n    CV_REG_PCDR3    =  43,          // PCODE reserved\n    CV_REG_PCDR4    =  44,          // PCODE reserved\n    CV_REG_PCDR5    =  45,          // PCODE reserved\n    CV_REG_PCDR6    =  46,          // PCODE reserved\n    CV_REG_PCDR7    =  47,          // PCODE reserved\n    CV_REG_CR0      =  80,          // CR0 -- control registers\n    CV_REG_CR1      =  81,\n    CV_REG_CR2      =  82,\n    CV_REG_CR3      =  83,\n    CV_REG_CR4      =  84,          // Pentium\n    CV_REG_DR0      =  90,          // Debug register\n    CV_REG_DR1      =  91,\n    CV_REG_DR2      =  92,\n    CV_REG_DR3      =  93,\n    CV_REG_DR4      =  94,\n    CV_REG_DR5      =  95,\n    CV_REG_DR6      =  96,\n    CV_REG_DR7      =  97,\n    CV_REG_GDTR     =  110,\n    CV_REG_GDTL     =  111,\n    CV_REG_IDTR     =  112,\n    CV_REG_IDTL     =  113,\n    CV_REG_LDTR     =  114,\n    CV_REG_TR       =  115,\n\n    CV_REG_PSEUDO1  =  116,\n    CV_REG_PSEUDO2  =  117,\n    CV_REG_PSEUDO3  =  118,\n    CV_REG_PSEUDO4  =  119,\n    CV_REG_PSEUDO5  =  120,\n    CV_REG_PSEUDO6  =  121,\n    CV_REG_PSEUDO7  =  122,\n    CV_REG_PSEUDO8  =  123,\n    CV_REG_PSEUDO9  =  124,\n\n    CV_REG_ST0      =  128,\n    CV_REG_ST1      =  129,\n    CV_REG_ST2      =  130,\n    CV_REG_ST3      =  131,\n    CV_REG_ST4      =  132,\n    CV_REG_ST5      =  133,\n    CV_REG_ST6      =  134,\n    CV_REG_ST7      =  135,\n    CV_REG_CTRL     =  136,\n    CV_REG_STAT     =  137,\n    CV_REG_TAG      =  138,\n    CV_REG_FPIP     =  139,\n    CV_REG_FPCS     =  140,\n    CV_REG_FPDO     =  141,\n    CV_REG_FPDS     =  142,\n    CV_REG_ISEM     =  143,\n    CV_REG_FPEIP    =  144,\n    CV_REG_FPEDO    =  145,\n\n    CV_REG_MM0      =  146,\n    CV_REG_MM1      =  147,\n    CV_REG_MM2      =  148,\n    CV_REG_MM3      =  149,\n    CV_REG_MM4      =  150,\n    CV_REG_MM5      =  151,\n    CV_REG_MM6      =  152,\n    CV_REG_MM7      =  153,\n\n    CV_REG_XMM0     =  154, // KATMAI registers\n    CV_REG_XMM1     =  155,\n    CV_REG_XMM2     =  156,\n    CV_REG_XMM3     =  157,\n    CV_REG_XMM4     =  158,\n    CV_REG_XMM5     =  159,\n    CV_REG_XMM6     =  160,\n    CV_REG_XMM7     =  161,\n\n    CV_REG_XMM00    =  162, // KATMAI sub-registers\n    CV_REG_XMM01    =  163,\n    CV_REG_XMM02    =  164,\n    CV_REG_XMM03    =  165,\n    CV_REG_XMM10    =  166,\n    CV_REG_XMM11    =  167,\n    CV_REG_XMM12    =  168,\n    CV_REG_XMM13    =  169,\n    CV_REG_XMM20    =  170,\n    CV_REG_XMM21    =  171,\n    CV_REG_XMM22    =  172,\n    CV_REG_XMM23    =  173,\n    CV_REG_XMM30    =  174,\n    CV_REG_XMM31    =  175,\n    CV_REG_XMM32    =  176,\n    CV_REG_XMM33    =  177,\n    CV_REG_XMM40    =  178,\n    CV_REG_XMM41    =  179,\n    CV_REG_XMM42    =  180,\n    CV_REG_XMM43    =  181,\n    CV_REG_XMM50    =  182,\n    CV_REG_XMM51    =  183,\n    CV_REG_XMM52    =  184,\n    CV_REG_XMM53    =  185,\n    CV_REG_XMM60    =  186,\n    CV_REG_XMM61    =  187,\n    CV_REG_XMM62    =  188,\n    CV_REG_XMM63    =  189,\n    CV_REG_XMM70    =  190,\n    CV_REG_XMM71    =  191,\n    CV_REG_XMM72    =  192,\n    CV_REG_XMM73    =  193,\n\n    CV_REG_XMM0L    =  194,\n    CV_REG_XMM1L    =  195,\n    CV_REG_XMM2L    =  196,\n    CV_REG_XMM3L    =  197,\n    CV_REG_XMM4L    =  198,\n    CV_REG_XMM5L    =  199,\n    CV_REG_XMM6L    =  200,\n    CV_REG_XMM7L    =  201,\n\n    CV_REG_XMM0H    =  202,\n    CV_REG_XMM1H    =  203,\n    CV_REG_XMM2H    =  204,\n    CV_REG_XMM3H    =  205,\n    CV_REG_XMM4H    =  206,\n    CV_REG_XMM5H    =  207,\n    CV_REG_XMM6H    =  208,\n    CV_REG_XMM7H    =  209,\n\n    CV_REG_MXCSR    =  211, // XMM status register\n\n    CV_REG_EDXEAX   =  212, // EDX:EAX pair\n\n    CV_REG_EMM0L    =  220, // XMM sub-registers (WNI integer)\n    CV_REG_EMM1L    =  221,\n    CV_REG_EMM2L    =  222,\n    CV_REG_EMM3L    =  223,\n    CV_REG_EMM4L    =  224,\n    CV_REG_EMM5L    =  225,\n    CV_REG_EMM6L    =  226,\n    CV_REG_EMM7L    =  227,\n\n    CV_REG_EMM0H    =  228,\n    CV_REG_EMM1H    =  229,\n    CV_REG_EMM2H    =  230,\n    CV_REG_EMM3H    =  231,\n    CV_REG_EMM4H    =  232,\n    CV_REG_EMM5H    =  233,\n    CV_REG_EMM6H    =  234,\n    CV_REG_EMM7H    =  235,\n\n    // do not change the order of these regs, first one must be even too\n    CV_REG_MM00     =  236,\n    CV_REG_MM01     =  237,\n    CV_REG_MM10     =  238,\n    CV_REG_MM11     =  239,\n    CV_REG_MM20     =  240,\n    CV_REG_MM21     =  241,\n    CV_REG_MM30     =  242,\n    CV_REG_MM31     =  243,\n    CV_REG_MM40     =  244,\n    CV_REG_MM41     =  245,\n    CV_REG_MM50     =  246,\n    CV_REG_MM51     =  247,\n    CV_REG_MM60     =  248,\n    CV_REG_MM61     =  249,\n    CV_REG_MM70     =  250,\n    CV_REG_MM71     =  251,\n\n    CV_REG_YMM0     =  252, // AVX registers\n    CV_REG_YMM1     =  253,\n    CV_REG_YMM2     =  254,\n    CV_REG_YMM3     =  255,\n    CV_REG_YMM4     =  256,\n    CV_REG_YMM5     =  257,\n    CV_REG_YMM6     =  258,\n    CV_REG_YMM7     =  259,\n\n    CV_REG_YMM0H    =  260,\n    CV_REG_YMM1H    =  261,\n    CV_REG_YMM2H    =  262,\n    CV_REG_YMM3H    =  263,\n    CV_REG_YMM4H    =  264,\n    CV_REG_YMM5H    =  265,\n    CV_REG_YMM6H    =  266,\n    CV_REG_YMM7H    =  267,\n\n    CV_REG_YMM0I0     =    268,    // AVX integer registers\n    CV_REG_YMM0I1     =    269,\n    CV_REG_YMM0I2     =    270,\n    CV_REG_YMM0I3     =    271,\n    CV_REG_YMM1I0     =    272,\n    CV_REG_YMM1I1     =    273,\n    CV_REG_YMM1I2     =    274,\n    CV_REG_YMM1I3     =    275,\n    CV_REG_YMM2I0     =    276,\n    CV_REG_YMM2I1     =    277,\n    CV_REG_YMM2I2     =    278,\n    CV_REG_YMM2I3     =    279,\n    CV_REG_YMM3I0     =    280,\n    CV_REG_YMM3I1     =    281,\n    CV_REG_YMM3I2     =    282,\n    CV_REG_YMM3I3     =    283,\n    CV_REG_YMM4I0     =    284,\n    CV_REG_YMM4I1     =    285,\n    CV_REG_YMM4I2     =    286,\n    CV_REG_YMM4I3     =    287,\n    CV_REG_YMM5I0     =    288,\n    CV_REG_YMM5I1     =    289,\n    CV_REG_YMM5I2     =    290,\n    CV_REG_YMM5I3     =    291,\n    CV_REG_YMM6I0     =    292,\n    CV_REG_YMM6I1     =    293,\n    CV_REG_YMM6I2     =    294,\n    CV_REG_YMM6I3     =    295,\n    CV_REG_YMM7I0     =    296,\n    CV_REG_YMM7I1     =    297,\n    CV_REG_YMM7I2     =    298,\n    CV_REG_YMM7I3     =    299,\n        \n    CV_REG_YMM0F0    =  300,     // AVX floating-point single precise registers\n    CV_REG_YMM0F1    =  301,\n    CV_REG_YMM0F2    =  302,\n    CV_REG_YMM0F3    =  303,\n    CV_REG_YMM0F4    =  304,\n    CV_REG_YMM0F5    =  305,\n    CV_REG_YMM0F6    =  306,\n    CV_REG_YMM0F7    =  307,\n    CV_REG_YMM1F0    =  308,\n    CV_REG_YMM1F1    =  309,\n    CV_REG_YMM1F2    =  310,\n    CV_REG_YMM1F3    =  311,\n    CV_REG_YMM1F4    =  312,\n    CV_REG_YMM1F5    =  313,\n    CV_REG_YMM1F6    =  314,\n    CV_REG_YMM1F7    =  315,\n    CV_REG_YMM2F0    =  316,\n    CV_REG_YMM2F1    =  317,\n    CV_REG_YMM2F2    =  318,\n    CV_REG_YMM2F3    =  319,\n    CV_REG_YMM2F4    =  320,\n    CV_REG_YMM2F5    =  321,\n    CV_REG_YMM2F6    =  322,\n    CV_REG_YMM2F7    =  323,\n    CV_REG_YMM3F0    =  324,\n    CV_REG_YMM3F1    =  325,\n    CV_REG_YMM3F2    =  326,\n    CV_REG_YMM3F3    =  327,\n    CV_REG_YMM3F4    =  328,\n    CV_REG_YMM3F5    =  329,\n    CV_REG_YMM3F6    =  330,\n    CV_REG_YMM3F7    =  331,\n    CV_REG_YMM4F0    =  332,\n    CV_REG_YMM4F1    =  333,\n    CV_REG_YMM4F2    =  334,\n    CV_REG_YMM4F3    =  335,\n    CV_REG_YMM4F4    =  336,\n    CV_REG_YMM4F5    =  337,\n    CV_REG_YMM4F6    =  338,\n    CV_REG_YMM4F7    =  339,\n    CV_REG_YMM5F0    =  340,\n    CV_REG_YMM5F1    =  341,\n    CV_REG_YMM5F2    =  342,\n    CV_REG_YMM5F3    =  343,\n    CV_REG_YMM5F4    =  344,\n    CV_REG_YMM5F5    =  345,\n    CV_REG_YMM5F6    =  346,\n    CV_REG_YMM5F7    =  347,\n    CV_REG_YMM6F0    =  348,\n    CV_REG_YMM6F1    =  349,\n    CV_REG_YMM6F2    =  350,\n    CV_REG_YMM6F3    =  351,\n    CV_REG_YMM6F4    =  352,\n    CV_REG_YMM6F5    =  353,\n    CV_REG_YMM6F6    =  354,\n    CV_REG_YMM6F7    =  355,\n    CV_REG_YMM7F0    =  356,\n    CV_REG_YMM7F1    =  357,\n    CV_REG_YMM7F2    =  358,\n    CV_REG_YMM7F3    =  359,\n    CV_REG_YMM7F4    =  360,\n    CV_REG_YMM7F5    =  361,\n    CV_REG_YMM7F6    =  362,\n    CV_REG_YMM7F7    =  363,\n    \n    CV_REG_YMM0D0     =    364,    // AVX floating-point double precise registers\n    CV_REG_YMM0D1     =    365,\n    CV_REG_YMM0D2     =    366,\n    CV_REG_YMM0D3     =    367,\n    CV_REG_YMM1D0     =    368,\n    CV_REG_YMM1D1     =    369,\n    CV_REG_YMM1D2     =    370,\n    CV_REG_YMM1D3     =    371,\n    CV_REG_YMM2D0     =    372,\n    CV_REG_YMM2D1     =    373,\n    CV_REG_YMM2D2     =    374,\n    CV_REG_YMM2D3     =    375,\n    CV_REG_YMM3D0     =    376,\n    CV_REG_YMM3D1     =    377,\n    CV_REG_YMM3D2     =    378,\n    CV_REG_YMM3D3     =    379,\n    CV_REG_YMM4D0     =    380,\n    CV_REG_YMM4D1     =    381,\n    CV_REG_YMM4D2     =    382,\n    CV_REG_YMM4D3     =    383,\n    CV_REG_YMM5D0     =    384,\n    CV_REG_YMM5D1     =    385,\n    CV_REG_YMM5D2     =    386,\n    CV_REG_YMM5D3     =    387,\n    CV_REG_YMM6D0     =    388,\n    CV_REG_YMM6D1     =    389,\n    CV_REG_YMM6D2     =    390,\n    CV_REG_YMM6D3     =    391,\n    CV_REG_YMM7D0     =    392,\n    CV_REG_YMM7D1     =    393,\n    CV_REG_YMM7D2     =    394,\n    CV_REG_YMM7D3     =    395,\n\n    CV_REG_BND0       =    396,    // x86 MPX bounds registers\n    CV_REG_BND1       =    397,\n    CV_REG_BND2       =    398,\n    CV_REG_BND3       =    399,\n    CV_REG_BNDCFGU    =    400,\n    CV_REG_BNDSTATUS  =    401,\n\n    CV_REG_ZMM0       =    402,     // AVX-512 registers\n    CV_REG_ZMM1       =    403,\n    CV_REG_ZMM2       =    404,\n    CV_REG_ZMM3       =    405,\n    CV_REG_ZMM4       =    406,\n    CV_REG_ZMM5       =    407,\n    CV_REG_ZMM6       =    408,\n    CV_REG_ZMM7       =    409,\n\n    CV_REG_ZMM0H      =    410,\n    CV_REG_ZMM1H      =    411,\n    CV_REG_ZMM2H      =    412,\n    CV_REG_ZMM3H      =    413,\n    CV_REG_ZMM4H      =    414,\n    CV_REG_ZMM5H      =    415,\n    CV_REG_ZMM6H      =    416,\n    CV_REG_ZMM7H      =    417,\n\n    CV_REG_K0         =    418,\n    CV_REG_K1         =    419,\n    CV_REG_K2         =    420,\n    CV_REG_K3         =    421,\n    CV_REG_K4         =    422,\n    CV_REG_K5         =    423,\n    CV_REG_K6         =    424,\n    CV_REG_K7        =     425,\n\n    CV_REG_SSP       =     426,      // CET- Shadow Stack Pointer\n\n    // registers for the 68K processors\n\n    CV_R68_D0       =    0,\n    CV_R68_D1       =    1,\n    CV_R68_D2       =    2,\n    CV_R68_D3       =    3,\n    CV_R68_D4       =    4,\n    CV_R68_D5       =    5,\n    CV_R68_D6       =    6,\n    CV_R68_D7       =    7,\n    CV_R68_A0       =    8,\n    CV_R68_A1       =    9,\n    CV_R68_A2       =   10,\n    CV_R68_A3       =   11,\n    CV_R68_A4       =   12,\n    CV_R68_A5       =   13,\n    CV_R68_A6       =   14,\n    CV_R68_A7       =   15,\n    CV_R68_CCR      =   16,\n    CV_R68_SR       =   17,\n    CV_R68_USP      =   18,\n    CV_R68_MSP      =   19,\n    CV_R68_SFC      =   20,\n    CV_R68_DFC      =   21,\n    CV_R68_CACR     =   22,\n    CV_R68_VBR      =   23,\n    CV_R68_CAAR     =   24,\n    CV_R68_ISP      =   25,\n    CV_R68_PC       =   26,\n    //reserved  27\n    CV_R68_FPCR     =   28,\n    CV_R68_FPSR     =   29,\n    CV_R68_FPIAR    =   30,\n    //reserved  31\n    CV_R68_FP0      =   32,\n    CV_R68_FP1      =   33,\n    CV_R68_FP2      =   34,\n    CV_R68_FP3      =   35,\n    CV_R68_FP4      =   36,\n    CV_R68_FP5      =   37,\n    CV_R68_FP6      =   38,\n    CV_R68_FP7      =   39,\n    //reserved  40\n    CV_R68_MMUSR030 =   41,\n    CV_R68_MMUSR    =   42,\n    CV_R68_URP      =   43,\n    CV_R68_DTT0     =   44,\n    CV_R68_DTT1     =   45,\n    CV_R68_ITT0     =   46,\n    CV_R68_ITT1     =   47,\n    //reserved  50\n    CV_R68_PSR      =   51,\n    CV_R68_PCSR     =   52,\n    CV_R68_VAL      =   53,\n    CV_R68_CRP      =   54,\n    CV_R68_SRP      =   55,\n    CV_R68_DRP      =   56,\n    CV_R68_TC       =   57,\n    CV_R68_AC       =   58,\n    CV_R68_SCC      =   59,\n    CV_R68_CAL      =   60,\n    CV_R68_TT0      =   61,\n    CV_R68_TT1      =   62,\n    //reserved  63\n    CV_R68_BAD0     =   64,\n    CV_R68_BAD1     =   65,\n    CV_R68_BAD2     =   66,\n    CV_R68_BAD3     =   67,\n    CV_R68_BAD4     =   68,\n    CV_R68_BAD5     =   69,\n    CV_R68_BAD6     =   70,\n    CV_R68_BAD7     =   71,\n    CV_R68_BAC0     =   72,\n    CV_R68_BAC1     =   73,\n    CV_R68_BAC2     =   74,\n    CV_R68_BAC3     =   75,\n    CV_R68_BAC4     =   76,\n    CV_R68_BAC5     =   77,\n    CV_R68_BAC6     =   78,\n    CV_R68_BAC7     =   79,\n\n     // Register set for the MIPS 4000\n\n    CV_M4_NOREG     =   CV_REG_NONE,\n\n    CV_M4_IntZERO   =   10,      /* CPU REGISTER */\n    CV_M4_IntAT     =   11,\n    CV_M4_IntV0     =   12,\n    CV_M4_IntV1     =   13,\n    CV_M4_IntA0     =   14,\n    CV_M4_IntA1     =   15,\n    CV_M4_IntA2     =   16,\n    CV_M4_IntA3     =   17,\n    CV_M4_IntT0     =   18,\n    CV_M4_IntT1     =   19,\n    CV_M4_IntT2     =   20,\n    CV_M4_IntT3     =   21,\n    CV_M4_IntT4     =   22,\n    CV_M4_IntT5     =   23,\n    CV_M4_IntT6     =   24,\n    CV_M4_IntT7     =   25,\n    CV_M4_IntS0     =   26,\n    CV_M4_IntS1     =   27,\n    CV_M4_IntS2     =   28,\n    CV_M4_IntS3     =   29,\n    CV_M4_IntS4     =   30,\n    CV_M4_IntS5     =   31,\n    CV_M4_IntS6     =   32,\n    CV_M4_IntS7     =   33,\n    CV_M4_IntT8     =   34,\n    CV_M4_IntT9     =   35,\n    CV_M4_IntKT0    =   36,\n    CV_M4_IntKT1    =   37,\n    CV_M4_IntGP     =   38,\n    CV_M4_IntSP     =   39,\n    CV_M4_IntS8     =   40,\n    CV_M4_IntRA     =   41,\n    CV_M4_IntLO     =   42,\n    CV_M4_IntHI     =   43,\n\n    CV_M4_Fir       =   50,\n    CV_M4_Psr       =   51,\n\n    CV_M4_FltF0     =   60,      /* Floating point registers */\n    CV_M4_FltF1     =   61,\n    CV_M4_FltF2     =   62,\n    CV_M4_FltF3     =   63,\n    CV_M4_FltF4     =   64,\n    CV_M4_FltF5     =   65,\n    CV_M4_FltF6     =   66,\n    CV_M4_FltF7     =   67,\n    CV_M4_FltF8     =   68,\n    CV_M4_FltF9     =   69,\n    CV_M4_FltF10    =   70,\n    CV_M4_FltF11    =   71,\n    CV_M4_FltF12    =   72,\n    CV_M4_FltF13    =   73,\n    CV_M4_FltF14    =   74,\n    CV_M4_FltF15    =   75,\n    CV_M4_FltF16    =   76,\n    CV_M4_FltF17    =   77,\n    CV_M4_FltF18    =   78,\n    CV_M4_FltF19    =   79,\n    CV_M4_FltF20    =   80,\n    CV_M4_FltF21    =   81,\n    CV_M4_FltF22    =   82,\n    CV_M4_FltF23    =   83,\n    CV_M4_FltF24    =   84,\n    CV_M4_FltF25    =   85,\n    CV_M4_FltF26    =   86,\n    CV_M4_FltF27    =   87,\n    CV_M4_FltF28    =   88,\n    CV_M4_FltF29    =   89,\n    CV_M4_FltF30    =   90,\n    CV_M4_FltF31    =   91,\n    CV_M4_FltFsr    =   92,\n\n\n    // Register set for the ALPHA AXP\n\n    CV_ALPHA_NOREG  = CV_REG_NONE,\n\n    CV_ALPHA_FltF0  =   10,   // Floating point registers\n    CV_ALPHA_FltF1  =   11,\n    CV_ALPHA_FltF2  =   12,\n    CV_ALPHA_FltF3  =   13,\n    CV_ALPHA_FltF4  =   14,\n    CV_ALPHA_FltF5  =   15,\n    CV_ALPHA_FltF6  =   16,\n    CV_ALPHA_FltF7  =   17,\n    CV_ALPHA_FltF8  =   18,\n    CV_ALPHA_FltF9  =   19,\n    CV_ALPHA_FltF10 =   20,\n    CV_ALPHA_FltF11 =   21,\n    CV_ALPHA_FltF12 =   22,\n    CV_ALPHA_FltF13 =   23,\n    CV_ALPHA_FltF14 =   24,\n    CV_ALPHA_FltF15 =   25,\n    CV_ALPHA_FltF16 =   26,\n    CV_ALPHA_FltF17 =   27,\n    CV_ALPHA_FltF18 =   28,\n    CV_ALPHA_FltF19 =   29,\n    CV_ALPHA_FltF20 =   30,\n    CV_ALPHA_FltF21 =   31,\n    CV_ALPHA_FltF22 =   32,\n    CV_ALPHA_FltF23 =   33,\n    CV_ALPHA_FltF24 =   34,\n    CV_ALPHA_FltF25 =   35,\n    CV_ALPHA_FltF26 =   36,\n    CV_ALPHA_FltF27 =   37,\n    CV_ALPHA_FltF28 =   38,\n    CV_ALPHA_FltF29 =   39,\n    CV_ALPHA_FltF30 =   40,\n    CV_ALPHA_FltF31 =   41,\n\n    CV_ALPHA_IntV0  =   42,   // Integer registers\n    CV_ALPHA_IntT0  =   43,\n    CV_ALPHA_IntT1  =   44,\n    CV_ALPHA_IntT2  =   45,\n    CV_ALPHA_IntT3  =   46,\n    CV_ALPHA_IntT4  =   47,\n    CV_ALPHA_IntT5  =   48,\n    CV_ALPHA_IntT6  =   49,\n    CV_ALPHA_IntT7  =   50,\n    CV_ALPHA_IntS0  =   51,\n    CV_ALPHA_IntS1  =   52,\n    CV_ALPHA_IntS2  =   53,\n    CV_ALPHA_IntS3  =   54,\n    CV_ALPHA_IntS4  =   55,\n    CV_ALPHA_IntS5  =   56,\n    CV_ALPHA_IntFP  =   57,\n    CV_ALPHA_IntA0  =   58,\n    CV_ALPHA_IntA1  =   59,\n    CV_ALPHA_IntA2  =   60,\n    CV_ALPHA_IntA3  =   61,\n    CV_ALPHA_IntA4  =   62,\n    CV_ALPHA_IntA5  =   63,\n    CV_ALPHA_IntT8  =   64,\n    CV_ALPHA_IntT9  =   65,\n    CV_ALPHA_IntT10 =   66,\n    CV_ALPHA_IntT11 =   67,\n    CV_ALPHA_IntRA  =   68,\n    CV_ALPHA_IntT12 =   69,\n    CV_ALPHA_IntAT  =   70,\n    CV_ALPHA_IntGP  =   71,\n    CV_ALPHA_IntSP  =   72,\n    CV_ALPHA_IntZERO =  73,\n\n\n    CV_ALPHA_Fpcr   =   74,   // Control registers\n    CV_ALPHA_Fir    =   75,\n    CV_ALPHA_Psr    =   76,\n    CV_ALPHA_FltFsr =   77,\n    CV_ALPHA_SoftFpcr =   78,\n\n    // Register Set for Motorola/IBM PowerPC\n\n    /*\n    ** PowerPC General Registers ( User Level )\n    */\n    CV_PPC_GPR0     =  1,\n    CV_PPC_GPR1     =  2,\n    CV_PPC_GPR2     =  3,\n    CV_PPC_GPR3     =  4,\n    CV_PPC_GPR4     =  5,\n    CV_PPC_GPR5     =  6,\n    CV_PPC_GPR6     =  7,\n    CV_PPC_GPR7     =  8,\n    CV_PPC_GPR8     =  9,\n    CV_PPC_GPR9     = 10,\n    CV_PPC_GPR10    = 11,\n    CV_PPC_GPR11    = 12,\n    CV_PPC_GPR12    = 13,\n    CV_PPC_GPR13    = 14,\n    CV_PPC_GPR14    = 15,\n    CV_PPC_GPR15    = 16,\n    CV_PPC_GPR16    = 17,\n    CV_PPC_GPR17    = 18,\n    CV_PPC_GPR18    = 19,\n    CV_PPC_GPR19    = 20,\n    CV_PPC_GPR20    = 21,\n    CV_PPC_GPR21    = 22,\n    CV_PPC_GPR22    = 23,\n    CV_PPC_GPR23    = 24,\n    CV_PPC_GPR24    = 25,\n    CV_PPC_GPR25    = 26,\n    CV_PPC_GPR26    = 27,\n    CV_PPC_GPR27    = 28,\n    CV_PPC_GPR28    = 29,\n    CV_PPC_GPR29    = 30,\n    CV_PPC_GPR30    = 31,\n    CV_PPC_GPR31    = 32,\n\n    /*\n    ** PowerPC Condition Register ( User Level )\n    */\n    CV_PPC_CR       = 33,\n    CV_PPC_CR0      = 34,\n    CV_PPC_CR1      = 35,\n    CV_PPC_CR2      = 36,\n    CV_PPC_CR3      = 37,\n    CV_PPC_CR4      = 38,\n    CV_PPC_CR5      = 39,\n    CV_PPC_CR6      = 40,\n    CV_PPC_CR7      = 41,\n\n    /*\n    ** PowerPC Floating Point Registers ( User Level )\n    */\n    CV_PPC_FPR0     = 42,\n    CV_PPC_FPR1     = 43,\n    CV_PPC_FPR2     = 44,\n    CV_PPC_FPR3     = 45,\n    CV_PPC_FPR4     = 46,\n    CV_PPC_FPR5     = 47,\n    CV_PPC_FPR6     = 48,\n    CV_PPC_FPR7     = 49,\n    CV_PPC_FPR8     = 50,\n    CV_PPC_FPR9     = 51,\n    CV_PPC_FPR10    = 52,\n    CV_PPC_FPR11    = 53,\n    CV_PPC_FPR12    = 54,\n    CV_PPC_FPR13    = 55,\n    CV_PPC_FPR14    = 56,\n    CV_PPC_FPR15    = 57,\n    CV_PPC_FPR16    = 58,\n    CV_PPC_FPR17    = 59,\n    CV_PPC_FPR18    = 60,\n    CV_PPC_FPR19    = 61,\n    CV_PPC_FPR20    = 62,\n    CV_PPC_FPR21    = 63,\n    CV_PPC_FPR22    = 64,\n    CV_PPC_FPR23    = 65,\n    CV_PPC_FPR24    = 66,\n    CV_PPC_FPR25    = 67,\n    CV_PPC_FPR26    = 68,\n    CV_PPC_FPR27    = 69,\n    CV_PPC_FPR28    = 70,\n    CV_PPC_FPR29    = 71,\n    CV_PPC_FPR30    = 72,\n    CV_PPC_FPR31    = 73,\n\n    /*\n    ** PowerPC Floating Point Status and Control Register ( User Level )\n    */\n    CV_PPC_FPSCR    = 74,\n\n    /*\n    ** PowerPC Machine State Register ( Supervisor Level )\n    */\n    CV_PPC_MSR      = 75,\n\n    /*\n    ** PowerPC Segment Registers ( Supervisor Level )\n    */\n    CV_PPC_SR0      = 76,\n    CV_PPC_SR1      = 77,\n    CV_PPC_SR2      = 78,\n    CV_PPC_SR3      = 79,\n    CV_PPC_SR4      = 80,\n    CV_PPC_SR5      = 81,\n    CV_PPC_SR6      = 82,\n    CV_PPC_SR7      = 83,\n    CV_PPC_SR8      = 84,\n    CV_PPC_SR9      = 85,\n    CV_PPC_SR10     = 86,\n    CV_PPC_SR11     = 87,\n    CV_PPC_SR12     = 88,\n    CV_PPC_SR13     = 89,\n    CV_PPC_SR14     = 90,\n    CV_PPC_SR15     = 91,\n\n    /*\n    ** For all of the special purpose registers add 100 to the SPR# that the\n    ** Motorola/IBM documentation gives with the exception of any imaginary\n    ** registers.\n    */\n\n    /*\n    ** PowerPC Special Purpose Registers ( User Level )\n    */\n    CV_PPC_PC       = 99,     // PC (imaginary register)\n\n    CV_PPC_MQ       = 100,    // MPC601\n    CV_PPC_XER      = 101,\n    CV_PPC_RTCU     = 104,    // MPC601\n    CV_PPC_RTCL     = 105,    // MPC601\n    CV_PPC_LR       = 108,\n    CV_PPC_CTR      = 109,\n\n    CV_PPC_COMPARE  = 110,    // part of XER (internal to the debugger only)\n    CV_PPC_COUNT    = 111,    // part of XER (internal to the debugger only)\n\n    /*\n    ** PowerPC Special Purpose Registers ( Supervisor Level )\n    */\n    CV_PPC_DSISR    = 118,\n    CV_PPC_DAR      = 119,\n    CV_PPC_DEC      = 122,\n    CV_PPC_SDR1     = 125,\n    CV_PPC_SRR0     = 126,\n    CV_PPC_SRR1     = 127,\n    CV_PPC_SPRG0    = 372,\n    CV_PPC_SPRG1    = 373,\n    CV_PPC_SPRG2    = 374,\n    CV_PPC_SPRG3    = 375,\n    CV_PPC_ASR      = 280,    // 64-bit implementations only\n    CV_PPC_EAR      = 382,\n    CV_PPC_PVR      = 287,\n    CV_PPC_BAT0U    = 628,\n    CV_PPC_BAT0L    = 629,\n    CV_PPC_BAT1U    = 630,\n    CV_PPC_BAT1L    = 631,\n    CV_PPC_BAT2U    = 632,\n    CV_PPC_BAT2L    = 633,\n    CV_PPC_BAT3U    = 634,\n    CV_PPC_BAT3L    = 635,\n    CV_PPC_DBAT0U   = 636,\n    CV_PPC_DBAT0L   = 637,\n    CV_PPC_DBAT1U   = 638,\n    CV_PPC_DBAT1L   = 639,\n    CV_PPC_DBAT2U   = 640,\n    CV_PPC_DBAT2L   = 641,\n    CV_PPC_DBAT3U   = 642,\n    CV_PPC_DBAT3L   = 643,\n\n    /*\n    ** PowerPC Special Purpose Registers Implementation Dependent ( Supervisor Level )\n    */\n\n    /*\n    ** Doesn't appear that IBM/Motorola has finished defining these.\n    */\n\n    CV_PPC_PMR0     = 1044,   // MPC620,\n    CV_PPC_PMR1     = 1045,   // MPC620,\n    CV_PPC_PMR2     = 1046,   // MPC620,\n    CV_PPC_PMR3     = 1047,   // MPC620,\n    CV_PPC_PMR4     = 1048,   // MPC620,\n    CV_PPC_PMR5     = 1049,   // MPC620,\n    CV_PPC_PMR6     = 1050,   // MPC620,\n    CV_PPC_PMR7     = 1051,   // MPC620,\n    CV_PPC_PMR8     = 1052,   // MPC620,\n    CV_PPC_PMR9     = 1053,   // MPC620,\n    CV_PPC_PMR10    = 1054,   // MPC620,\n    CV_PPC_PMR11    = 1055,   // MPC620,\n    CV_PPC_PMR12    = 1056,   // MPC620,\n    CV_PPC_PMR13    = 1057,   // MPC620,\n    CV_PPC_PMR14    = 1058,   // MPC620,\n    CV_PPC_PMR15    = 1059,   // MPC620,\n\n    CV_PPC_DMISS    = 1076,   // MPC603\n    CV_PPC_DCMP     = 1077,   // MPC603\n    CV_PPC_HASH1    = 1078,   // MPC603\n    CV_PPC_HASH2    = 1079,   // MPC603\n    CV_PPC_IMISS    = 1080,   // MPC603\n    CV_PPC_ICMP     = 1081,   // MPC603\n    CV_PPC_RPA      = 1082,   // MPC603\n\n    CV_PPC_HID0     = 1108,   // MPC601, MPC603, MPC620\n    CV_PPC_HID1     = 1109,   // MPC601\n    CV_PPC_HID2     = 1110,   // MPC601, MPC603, MPC620 ( IABR )\n    CV_PPC_HID3     = 1111,   // Not Defined\n    CV_PPC_HID4     = 1112,   // Not Defined\n    CV_PPC_HID5     = 1113,   // MPC601, MPC604, MPC620 ( DABR )\n    CV_PPC_HID6     = 1114,   // Not Defined\n    CV_PPC_HID7     = 1115,   // Not Defined\n    CV_PPC_HID8     = 1116,   // MPC620 ( BUSCSR )\n    CV_PPC_HID9     = 1117,   // MPC620 ( L2CSR )\n    CV_PPC_HID10    = 1118,   // Not Defined\n    CV_PPC_HID11    = 1119,   // Not Defined\n    CV_PPC_HID12    = 1120,   // Not Defined\n    CV_PPC_HID13    = 1121,   // MPC604 ( HCR )\n    CV_PPC_HID14    = 1122,   // Not Defined\n    CV_PPC_HID15    = 1123,   // MPC601, MPC604, MPC620 ( PIR )\n\n    //\n    // JAVA VM registers\n    //\n\n    CV_JAVA_PC      = 1,\n\n    //\n    // Register set for the Hitachi SH3\n    //\n\n    CV_SH3_NOREG    =   CV_REG_NONE,\n\n    CV_SH3_IntR0    =   10,   // CPU REGISTER\n    CV_SH3_IntR1    =   11,\n    CV_SH3_IntR2    =   12,\n    CV_SH3_IntR3    =   13,\n    CV_SH3_IntR4    =   14,\n    CV_SH3_IntR5    =   15,\n    CV_SH3_IntR6    =   16,\n    CV_SH3_IntR7    =   17,\n    CV_SH3_IntR8    =   18,\n    CV_SH3_IntR9    =   19,\n    CV_SH3_IntR10   =   20,\n    CV_SH3_IntR11   =   21,\n    CV_SH3_IntR12   =   22,\n    CV_SH3_IntR13   =   23,\n    CV_SH3_IntFp    =   24,\n    CV_SH3_IntSp    =   25,\n    CV_SH3_Gbr      =   38,\n    CV_SH3_Pr       =   39,\n    CV_SH3_Mach     =   40,\n    CV_SH3_Macl     =   41,\n\n    CV_SH3_Pc       =   50,\n    CV_SH3_Sr       =   51,\n\n    CV_SH3_BarA     =   60,\n    CV_SH3_BasrA    =   61,\n    CV_SH3_BamrA    =   62,\n    CV_SH3_BbrA     =   63,\n    CV_SH3_BarB     =   64,\n    CV_SH3_BasrB    =   65,\n    CV_SH3_BamrB    =   66,\n    CV_SH3_BbrB     =   67,\n    CV_SH3_BdrB     =   68,\n    CV_SH3_BdmrB    =   69,\n    CV_SH3_Brcr     =   70,\n\n    //\n    // Additional registers for Hitachi SH processors\n    //\n\n    CV_SH_Fpscr    =   75,    // floating point status/control register\n    CV_SH_Fpul     =   76,    // floating point communication register\n\n    CV_SH_FpR0     =   80,    // Floating point registers\n    CV_SH_FpR1     =   81,\n    CV_SH_FpR2     =   82,\n    CV_SH_FpR3     =   83,\n    CV_SH_FpR4     =   84,\n    CV_SH_FpR5     =   85,\n    CV_SH_FpR6     =   86,\n    CV_SH_FpR7     =   87,\n    CV_SH_FpR8     =   88,\n    CV_SH_FpR9     =   89,\n    CV_SH_FpR10    =   90,\n    CV_SH_FpR11    =   91,\n    CV_SH_FpR12    =   92,\n    CV_SH_FpR13    =   93,\n    CV_SH_FpR14    =   94,\n    CV_SH_FpR15    =   95,\n\n    CV_SH_XFpR0    =   96,\n    CV_SH_XFpR1    =   97,\n    CV_SH_XFpR2    =   98,\n    CV_SH_XFpR3    =   99,\n    CV_SH_XFpR4    =  100,\n    CV_SH_XFpR5    =  101,\n    CV_SH_XFpR6    =  102,\n    CV_SH_XFpR7    =  103,\n    CV_SH_XFpR8    =  104,\n    CV_SH_XFpR9    =  105,\n    CV_SH_XFpR10   =  106,\n    CV_SH_XFpR11   =  107,\n    CV_SH_XFpR12   =  108,\n    CV_SH_XFpR13   =  109,\n    CV_SH_XFpR14   =  110,\n    CV_SH_XFpR15   =  111,\n\n    //\n    // Register set for the ARM processor.\n    //\n\n    CV_ARM_NOREG    =   CV_REG_NONE,\n\n    CV_ARM_R0       =   10,\n    CV_ARM_R1       =   11,\n    CV_ARM_R2       =   12,\n    CV_ARM_R3       =   13,\n    CV_ARM_R4       =   14,\n    CV_ARM_R5       =   15,\n    CV_ARM_R6       =   16,\n    CV_ARM_R7       =   17,\n    CV_ARM_R8       =   18,\n    CV_ARM_R9       =   19,\n    CV_ARM_R10      =   20,\n    CV_ARM_R11      =   21, // Frame pointer, if allocated\n    CV_ARM_R12      =   22,\n    CV_ARM_SP       =   23, // Stack pointer\n    CV_ARM_LR       =   24, // Link Register\n    CV_ARM_PC       =   25, // Program counter\n    CV_ARM_CPSR     =   26, // Current program status register\n\n    CV_ARM_ACC0     =   27, // DSP co-processor 0 40 bit accumulator\n\n    //\n    // Registers for ARM VFP10 support\n    //\n    \n    CV_ARM_FPSCR    =   40,\n    CV_ARM_FPEXC    =   41,\n    \n    CV_ARM_FS0      =   50,\n    CV_ARM_FS1      =   51,\n    CV_ARM_FS2      =   52,\n    CV_ARM_FS3      =   53,\n    CV_ARM_FS4      =   54,\n    CV_ARM_FS5      =   55,\n    CV_ARM_FS6      =   56,\n    CV_ARM_FS7      =   57,\n    CV_ARM_FS8      =   58,\n    CV_ARM_FS9      =   59,\n    CV_ARM_FS10     =   60,\n    CV_ARM_FS11     =   61,\n    CV_ARM_FS12     =   62,\n    CV_ARM_FS13     =   63,\n    CV_ARM_FS14     =   64,\n    CV_ARM_FS15     =   65,\n    CV_ARM_FS16     =   66,\n    CV_ARM_FS17     =   67,\n    CV_ARM_FS18     =   68,\n    CV_ARM_FS19     =   69,\n    CV_ARM_FS20     =   70,\n    CV_ARM_FS21     =   71,\n    CV_ARM_FS22     =   72,\n    CV_ARM_FS23     =   73,\n    CV_ARM_FS24     =   74,\n    CV_ARM_FS25     =   75,\n    CV_ARM_FS26     =   76,\n    CV_ARM_FS27     =   77,\n    CV_ARM_FS28     =   78,\n    CV_ARM_FS29     =   79,\n    CV_ARM_FS30     =   80,\n    CV_ARM_FS31     =   81,\n\n    //\n    // ARM VFP Floating Point Extra control registers\n    //\n    \n    CV_ARM_FPEXTRA0 =   90,\n    CV_ARM_FPEXTRA1 =   91,\n    CV_ARM_FPEXTRA2 =   92,\n    CV_ARM_FPEXTRA3 =   93,\n    CV_ARM_FPEXTRA4 =   94,\n    CV_ARM_FPEXTRA5 =   95,\n    CV_ARM_FPEXTRA6 =   96,\n    CV_ARM_FPEXTRA7 =   97,\n\n    // XSCALE Concan co-processor registers\n    CV_ARM_WR0      =   128, \n    CV_ARM_WR1      =   129, \n    CV_ARM_WR2      =   130, \n    CV_ARM_WR3      =   131, \n    CV_ARM_WR4      =   132, \n    CV_ARM_WR5      =   133, \n    CV_ARM_WR6      =   134, \n    CV_ARM_WR7      =   135, \n    CV_ARM_WR8      =   136, \n    CV_ARM_WR9      =   137, \n    CV_ARM_WR10     =   138, \n    CV_ARM_WR11     =   139, \n    CV_ARM_WR12     =   140, \n    CV_ARM_WR13     =   141, \n    CV_ARM_WR14     =   142, \n    CV_ARM_WR15     =   143, \n    \n    // XSCALE Concan co-processor control registers\n    CV_ARM_WCID     =   144,\n    CV_ARM_WCON     =   145,\n    CV_ARM_WCSSF    =   146,\n    CV_ARM_WCASF    =   147,\n    CV_ARM_WC4      =   148,\n    CV_ARM_WC5      =   149,\n    CV_ARM_WC6      =   150,\n    CV_ARM_WC7      =   151,\n    CV_ARM_WCGR0    =   152,\n    CV_ARM_WCGR1    =   153,\n    CV_ARM_WCGR2    =   154,\n    CV_ARM_WCGR3    =   155,\n    CV_ARM_WC12     =   156,\n    CV_ARM_WC13     =   157,\n    CV_ARM_WC14     =   158,\n    CV_ARM_WC15     =   159,\n\n    //\n    // ARM VFPv3/Neon extended floating Point\n    //\n    \n    CV_ARM_FS32     =   200,\n    CV_ARM_FS33     =   201,\n    CV_ARM_FS34     =   202,\n    CV_ARM_FS35     =   203,\n    CV_ARM_FS36     =   204,\n    CV_ARM_FS37     =   205,\n    CV_ARM_FS38     =   206,\n    CV_ARM_FS39     =   207,\n    CV_ARM_FS40     =   208,\n    CV_ARM_FS41     =   209,\n    CV_ARM_FS42     =   210,\n    CV_ARM_FS43     =   211,\n    CV_ARM_FS44     =   212,\n    CV_ARM_FS45     =   213,\n    CV_ARM_FS46     =   214,\n    CV_ARM_FS47     =   215,\n    CV_ARM_FS48     =   216,\n    CV_ARM_FS49     =   217,\n    CV_ARM_FS50     =   218,\n    CV_ARM_FS51     =   219,\n    CV_ARM_FS52     =   220,\n    CV_ARM_FS53     =   221,\n    CV_ARM_FS54     =   222,\n    CV_ARM_FS55     =   223,\n    CV_ARM_FS56     =   224,\n    CV_ARM_FS57     =   225,\n    CV_ARM_FS58     =   226,\n    CV_ARM_FS59     =   227,\n    CV_ARM_FS60     =   228,\n    CV_ARM_FS61     =   229,\n    CV_ARM_FS62     =   230,\n    CV_ARM_FS63     =   231,\n\n    // ARM double-precision floating point\n\n    CV_ARM_ND0 = 300, \n    CV_ARM_ND1 = 301, \n    CV_ARM_ND2 = 302, \n    CV_ARM_ND3 = 303, \n    CV_ARM_ND4 = 304, \n    CV_ARM_ND5 = 305,\n    CV_ARM_ND6 = 306, \n    CV_ARM_ND7 = 307, \n    CV_ARM_ND8 = 308, \n    CV_ARM_ND9 = 309, \n    CV_ARM_ND10 = 310, \n    CV_ARM_ND11 = 311,\n    CV_ARM_ND12 = 312, \n    CV_ARM_ND13 = 313, \n    CV_ARM_ND14 = 314, \n    CV_ARM_ND15 = 315, \n    CV_ARM_ND16 = 316,\n    CV_ARM_ND17 = 317, \n    CV_ARM_ND18 = 318, \n    CV_ARM_ND19 = 319, \n    CV_ARM_ND20 = 320, \n    CV_ARM_ND21 = 321,\n    CV_ARM_ND22 = 322, \n    CV_ARM_ND23 = 323, \n    CV_ARM_ND24 = 324, \n    CV_ARM_ND25 = 325, \n    CV_ARM_ND26 = 326,\n    CV_ARM_ND27 = 327, \n    CV_ARM_ND28 = 328, \n    CV_ARM_ND29 = 329, \n    CV_ARM_ND30 = 330, \n    CV_ARM_ND31 = 331,\n\n    // ARM extended precision floating point\n\n    CV_ARM_NQ0 = 400, \n    CV_ARM_NQ1 = 401, \n    CV_ARM_NQ2 = 402, \n    CV_ARM_NQ3 = 403, \n    CV_ARM_NQ4 = 404, \n    CV_ARM_NQ5 = 405,\n    CV_ARM_NQ6 = 406, \n    CV_ARM_NQ7 = 407, \n    CV_ARM_NQ8 = 408, \n    CV_ARM_NQ9 = 409, \n    CV_ARM_NQ10 = 410, \n    CV_ARM_NQ11 = 411,\n    CV_ARM_NQ12 = 412, \n    CV_ARM_NQ13 = 413, \n    CV_ARM_NQ14 = 414, \n    CV_ARM_NQ15 = 415, \n\n    //\n    // Register set for ARM64\n    //\n\n    CV_ARM64_NOREG  =  CV_REG_NONE,\n\n    // General purpose 32-bit integer registers\n\n    CV_ARM64_W0     =  10,\n    CV_ARM64_W1     =  11,\n    CV_ARM64_W2     =  12,\n    CV_ARM64_W3     =  13,\n    CV_ARM64_W4     =  14,\n    CV_ARM64_W5     =  15,\n    CV_ARM64_W6     =  16,\n    CV_ARM64_W7     =  17,\n    CV_ARM64_W8     =  18,\n    CV_ARM64_W9     =  19,\n    CV_ARM64_W10    =  20,\n    CV_ARM64_W11    =  21,\n    CV_ARM64_W12    =  22,\n    CV_ARM64_W13    =  23,\n    CV_ARM64_W14    =  24,\n    CV_ARM64_W15    =  25,\n    CV_ARM64_W16    =  26,\n    CV_ARM64_W17    =  27,\n    CV_ARM64_W18    =  28,\n    CV_ARM64_W19    =  29,\n    CV_ARM64_W20    =  30,\n    CV_ARM64_W21    =  31,\n    CV_ARM64_W22    =  32,\n    CV_ARM64_W23    =  33,\n    CV_ARM64_W24    =  34,\n    CV_ARM64_W25    =  35,\n    CV_ARM64_W26    =  36,\n    CV_ARM64_W27    =  37,\n    CV_ARM64_W28    =  38,\n    CV_ARM64_W29    =  39,\n    CV_ARM64_W30    =  40,\n    CV_ARM64_WZR    =  41,\n\n    // General purpose 64-bit integer registers\n\n    CV_ARM64_X0     =  50,\n    CV_ARM64_X1     =  51,\n    CV_ARM64_X2     =  52,\n    CV_ARM64_X3     =  53,\n    CV_ARM64_X4     =  54,\n    CV_ARM64_X5     =  55,\n    CV_ARM64_X6     =  56,\n    CV_ARM64_X7     =  57,\n    CV_ARM64_X8     =  58,\n    CV_ARM64_X9     =  59,\n    CV_ARM64_X10    =  60,\n    CV_ARM64_X11    =  61,\n    CV_ARM64_X12    =  62,\n    CV_ARM64_X13    =  63,\n    CV_ARM64_X14    =  64,\n    CV_ARM64_X15    =  65,\n    CV_ARM64_IP0    =  66,\n    CV_ARM64_IP1    =  67,\n    CV_ARM64_X18    =  68,\n    CV_ARM64_X19    =  69,\n    CV_ARM64_X20    =  70,\n    CV_ARM64_X21    =  71,\n    CV_ARM64_X22    =  72,\n    CV_ARM64_X23    =  73,\n    CV_ARM64_X24    =  74,\n    CV_ARM64_X25    =  75,\n    CV_ARM64_X26    =  76,\n    CV_ARM64_X27    =  77,\n    CV_ARM64_X28    =  78,\n    CV_ARM64_FP     =  79,\n    CV_ARM64_LR     =  80,\n    CV_ARM64_SP     =  81,\n    CV_ARM64_ZR     =  82,\n    CV_ARM64_PC     =  83,\n\n    // status registers\n\n    CV_ARM64_NZCV   =  90,\n    CV_ARM64_CPSR   =  91,\n\n    // 32-bit floating point registers\n\n    CV_ARM64_S0     =  100,\n    CV_ARM64_S1     =  101,\n    CV_ARM64_S2     =  102,\n    CV_ARM64_S3     =  103,\n    CV_ARM64_S4     =  104,\n    CV_ARM64_S5     =  105,\n    CV_ARM64_S6     =  106,\n    CV_ARM64_S7     =  107,\n    CV_ARM64_S8     =  108,\n    CV_ARM64_S9     =  109,\n    CV_ARM64_S10    =  110,\n    CV_ARM64_S11    =  111,\n    CV_ARM64_S12    =  112,\n    CV_ARM64_S13    =  113,\n    CV_ARM64_S14    =  114,\n    CV_ARM64_S15    =  115,\n    CV_ARM64_S16    =  116,\n    CV_ARM64_S17    =  117,\n    CV_ARM64_S18    =  118,\n    CV_ARM64_S19    =  119,\n    CV_ARM64_S20    =  120,\n    CV_ARM64_S21    =  121,\n    CV_ARM64_S22    =  122,\n    CV_ARM64_S23    =  123,\n    CV_ARM64_S24    =  124,\n    CV_ARM64_S25    =  125,\n    CV_ARM64_S26    =  126,\n    CV_ARM64_S27    =  127,\n    CV_ARM64_S28    =  128,\n    CV_ARM64_S29    =  129,\n    CV_ARM64_S30    =  130,\n    CV_ARM64_S31    =  131,\n\n    // 64-bit floating point registers\n\n    CV_ARM64_D0     =  140,\n    CV_ARM64_D1     =  141,\n    CV_ARM64_D2     =  142,\n    CV_ARM64_D3     =  143,\n    CV_ARM64_D4     =  144,\n    CV_ARM64_D5     =  145,\n    CV_ARM64_D6     =  146,\n    CV_ARM64_D7     =  147,\n    CV_ARM64_D8     =  148,\n    CV_ARM64_D9     =  149,\n    CV_ARM64_D10    =  150,\n    CV_ARM64_D11    =  151,\n    CV_ARM64_D12    =  152,\n    CV_ARM64_D13    =  153,\n    CV_ARM64_D14    =  154,\n    CV_ARM64_D15    =  155,\n    CV_ARM64_D16    =  156,\n    CV_ARM64_D17    =  157,\n    CV_ARM64_D18    =  158,\n    CV_ARM64_D19    =  159,\n    CV_ARM64_D20    =  160,\n    CV_ARM64_D21    =  161,\n    CV_ARM64_D22    =  162,\n    CV_ARM64_D23    =  163,\n    CV_ARM64_D24    =  164,\n    CV_ARM64_D25    =  165,\n    CV_ARM64_D26    =  166,\n    CV_ARM64_D27    =  167,\n    CV_ARM64_D28    =  168,\n    CV_ARM64_D29    =  169,\n    CV_ARM64_D30    =  170,\n    CV_ARM64_D31    =  171,\n\n    // 128-bit SIMD registers\n\n    CV_ARM64_Q0     =  180,\n    CV_ARM64_Q1     =  181,\n    CV_ARM64_Q2     =  182,\n    CV_ARM64_Q3     =  183,\n    CV_ARM64_Q4     =  184,\n    CV_ARM64_Q5     =  185,\n    CV_ARM64_Q6     =  186,\n    CV_ARM64_Q7     =  187,\n    CV_ARM64_Q8     =  188,\n    CV_ARM64_Q9     =  189,\n    CV_ARM64_Q10    =  190,\n    CV_ARM64_Q11    =  191,\n    CV_ARM64_Q12    =  192,\n    CV_ARM64_Q13    =  193,\n    CV_ARM64_Q14    =  194,\n    CV_ARM64_Q15    =  195,\n    CV_ARM64_Q16    =  196,\n    CV_ARM64_Q17    =  197,\n    CV_ARM64_Q18    =  198,\n    CV_ARM64_Q19    =  199,\n    CV_ARM64_Q20    =  200,\n    CV_ARM64_Q21    =  201,\n    CV_ARM64_Q22    =  202,\n    CV_ARM64_Q23    =  203,\n    CV_ARM64_Q24    =  204,\n    CV_ARM64_Q25    =  205,\n    CV_ARM64_Q26    =  206,\n    CV_ARM64_Q27    =  207,\n    CV_ARM64_Q28    =  208,\n    CV_ARM64_Q29    =  209,\n    CV_ARM64_Q30    =  210,\n    CV_ARM64_Q31    =  211,\n\n    // Floating point status register\n\n    CV_ARM64_FPSR   =  220,\n    CV_ARM64_FPCR   =  221,\n    \n    // 8-bit floating point registers\n\n    CV_ARM64_B0     =  230,\n    CV_ARM64_B1     =  231,\n    CV_ARM64_B2     =  232,\n    CV_ARM64_B3     =  233,\n    CV_ARM64_B4     =  234,\n    CV_ARM64_B5     =  235,\n    CV_ARM64_B6     =  236,\n    CV_ARM64_B7     =  237,\n    CV_ARM64_B8     =  238,\n    CV_ARM64_B9     =  239,\n    CV_ARM64_B10    =  240,\n    CV_ARM64_B11    =  241,\n    CV_ARM64_B12    =  242,\n    CV_ARM64_B13    =  243,\n    CV_ARM64_B14    =  244,\n    CV_ARM64_B15    =  245,\n    CV_ARM64_B16    =  246,\n    CV_ARM64_B17    =  247,\n    CV_ARM64_B18    =  248,\n    CV_ARM64_B19    =  249,\n    CV_ARM64_B20    =  250,\n    CV_ARM64_B21    =  251,\n    CV_ARM64_B22    =  252,\n    CV_ARM64_B23    =  253,\n    CV_ARM64_B24    =  254,\n    CV_ARM64_B25    =  255,\n    CV_ARM64_B26    =  256,\n    CV_ARM64_B27    =  257,\n    CV_ARM64_B28    =  258,\n    CV_ARM64_B29    =  259,\n    CV_ARM64_B30    =  260,\n    CV_ARM64_B31    =  261,\n\n    // 16-bit floating point registers\n\n    CV_ARM64_H0     =  270,\n    CV_ARM64_H1     =  271,\n    CV_ARM64_H2     =  272,\n    CV_ARM64_H3     =  273,\n    CV_ARM64_H4     =  274,\n    CV_ARM64_H5     =  275,\n    CV_ARM64_H6     =  276,\n    CV_ARM64_H7     =  277,\n    CV_ARM64_H8     =  278,\n    CV_ARM64_H9     =  279,\n    CV_ARM64_H10    =  280,\n    CV_ARM64_H11    =  281,\n    CV_ARM64_H12    =  282,\n    CV_ARM64_H13    =  283,\n    CV_ARM64_H14    =  284,\n    CV_ARM64_H15    =  285,\n    CV_ARM64_H16    =  286,\n    CV_ARM64_H17    =  287,\n    CV_ARM64_H18    =  288,\n    CV_ARM64_H19    =  289,\n    CV_ARM64_H20    =  290,\n    CV_ARM64_H21    =  291,\n    CV_ARM64_H22    =  292,\n    CV_ARM64_H23    =  293,\n    CV_ARM64_H24    =  294,\n    CV_ARM64_H25    =  295,\n    CV_ARM64_H26    =  296,\n    CV_ARM64_H27    =  297,\n    CV_ARM64_H28    =  298,\n    CV_ARM64_H29    =  299,\n    CV_ARM64_H30    =  300,\n    CV_ARM64_H31    =  301,\n\n    // 128-bit vector registers\n     \n    CV_ARM64_V0     =  310,\n    CV_ARM64_V1     =  311,\n    CV_ARM64_V2     =  312,\n    CV_ARM64_V3     =  313,\n    CV_ARM64_V4     =  314,\n    CV_ARM64_V5     =  315,\n    CV_ARM64_V6     =  316,\n    CV_ARM64_V7     =  317,\n    CV_ARM64_V8     =  318,\n    CV_ARM64_V9     =  319,\n    CV_ARM64_V10    =  320,\n    CV_ARM64_V11    =  321,\n    CV_ARM64_V12    =  322,\n    CV_ARM64_V13    =  323,\n    CV_ARM64_V14    =  324,\n    CV_ARM64_V15    =  325,\n    CV_ARM64_V16    =  326,\n    CV_ARM64_V17    =  327,\n    CV_ARM64_V18    =  328,\n    CV_ARM64_V19    =  329,\n    CV_ARM64_V20    =  330,\n    CV_ARM64_V21    =  331,\n    CV_ARM64_V22    =  332,\n    CV_ARM64_V23    =  333,\n    CV_ARM64_V24    =  334,\n    CV_ARM64_V25    =  335,\n    CV_ARM64_V26    =  336,\n    CV_ARM64_V27    =  337,\n    CV_ARM64_V28    =  338,\n    CV_ARM64_V29    =  339,\n    CV_ARM64_V30    =  340,\n    CV_ARM64_V31    =  341,\n\n    // 128-bit SIMD registers upper 64 bits\n\n    CV_ARM64_Q0H    =  350,\n    CV_ARM64_Q1H    =  351,\n    CV_ARM64_Q2H    =  352,\n    CV_ARM64_Q3H    =  353,\n    CV_ARM64_Q4H    =  354,\n    CV_ARM64_Q5H    =  355,\n    CV_ARM64_Q6H    =  356,\n    CV_ARM64_Q7H    =  357,\n    CV_ARM64_Q8H    =  358,\n    CV_ARM64_Q9H    =  359,\n    CV_ARM64_Q10H   =  360,\n    CV_ARM64_Q11H   =  361,\n    CV_ARM64_Q12H   =  362,\n    CV_ARM64_Q13H   =  363,\n    CV_ARM64_Q14H   =  364,\n    CV_ARM64_Q15H   =  365,\n    CV_ARM64_Q16H   =  366,\n    CV_ARM64_Q17H   =  367,\n    CV_ARM64_Q18H   =  368,\n    CV_ARM64_Q19H   =  369,\n    CV_ARM64_Q20H   =  370,\n    CV_ARM64_Q21H   =  371,\n    CV_ARM64_Q22H   =  372,\n    CV_ARM64_Q23H   =  373,\n    CV_ARM64_Q24H   =  374,\n    CV_ARM64_Q25H   =  375,\n    CV_ARM64_Q26H   =  376,\n    CV_ARM64_Q27H   =  377,\n    CV_ARM64_Q28H   =  378,\n    CV_ARM64_Q29H   =  379,\n    CV_ARM64_Q30H   =  380,\n    CV_ARM64_Q31H   =  381,\n\n    // Scalable Vector Extension (SVE)\n\n    CV_ARM64_Z0     =  382,\n    CV_ARM64_Z1     =  383,\n    CV_ARM64_Z2     =  384,\n    CV_ARM64_Z3     =  385,\n    CV_ARM64_Z4     =  386,\n    CV_ARM64_Z5     =  387,\n    CV_ARM64_Z6     =  388,\n    CV_ARM64_Z7     =  389,\n    CV_ARM64_Z8     =  390,\n    CV_ARM64_Z9     =  391,\n    CV_ARM64_Z10    =  392,\n    CV_ARM64_Z11    =  393,\n    CV_ARM64_Z12    =  394,\n    CV_ARM64_Z13    =  395,\n    CV_ARM64_Z14    =  396,\n    CV_ARM64_Z15    =  397,\n    CV_ARM64_Z16    =  398,\n    CV_ARM64_Z17    =  399,\n    CV_ARM64_Z18    =  400,\n    CV_ARM64_Z19    =  401,\n    CV_ARM64_Z20    =  402,\n    CV_ARM64_Z21    =  403,\n    CV_ARM64_Z22    =  404,\n    CV_ARM64_Z23    =  405,\n    CV_ARM64_Z24    =  406,\n    CV_ARM64_Z25    =  407,\n    CV_ARM64_Z26    =  408,\n    CV_ARM64_Z27    =  409,\n    CV_ARM64_Z28    =  410,\n    CV_ARM64_Z29    =  411,\n    CV_ARM64_Z30    =  412,\n    CV_ARM64_Z31    =  413,\n\n    CV_ARM64_P0     =  414,\n    CV_ARM64_P1     =  415,\n    CV_ARM64_P2     =  416,\n    CV_ARM64_P3     =  417,\n    CV_ARM64_P4     =  418,\n    CV_ARM64_P5     =  419,\n    CV_ARM64_P6     =  420,\n    CV_ARM64_P7     =  421,\n    CV_ARM64_P8     =  422,\n    CV_ARM64_P9     =  423,\n    CV_ARM64_P10    =  424,\n    CV_ARM64_P11    =  425,\n    CV_ARM64_P12    =  426,\n    CV_ARM64_P13    =  427,\n    CV_ARM64_P14    =  428,\n    CV_ARM64_P15    =  429,\n\n    // SVE first-fault status register\n    CV_ARM64_FFR    =  430,\n\n    //\n    // Register set for Intel IA64\n    //\n\n    CV_IA64_NOREG   =   CV_REG_NONE,\n\n    // Branch Registers\n\n    CV_IA64_Br0     =   512,\n    CV_IA64_Br1     =   513,\n    CV_IA64_Br2     =   514,\n    CV_IA64_Br3     =   515,\n    CV_IA64_Br4     =   516,\n    CV_IA64_Br5     =   517,\n    CV_IA64_Br6     =   518,\n    CV_IA64_Br7     =   519,\n\n    // Predicate Registers\n\n    CV_IA64_P0    =   704,\n    CV_IA64_P1    =   705,\n    CV_IA64_P2    =   706,\n    CV_IA64_P3    =   707,\n    CV_IA64_P4    =   708,\n    CV_IA64_P5    =   709,\n    CV_IA64_P6    =   710,\n    CV_IA64_P7    =   711,\n    CV_IA64_P8    =   712,\n    CV_IA64_P9    =   713,\n    CV_IA64_P10   =   714,\n    CV_IA64_P11   =   715,\n    CV_IA64_P12   =   716,\n    CV_IA64_P13   =   717,\n    CV_IA64_P14   =   718,\n    CV_IA64_P15   =   719,\n    CV_IA64_P16   =   720,\n    CV_IA64_P17   =   721,\n    CV_IA64_P18   =   722,\n    CV_IA64_P19   =   723,\n    CV_IA64_P20   =   724,\n    CV_IA64_P21   =   725,\n    CV_IA64_P22   =   726,\n    CV_IA64_P23   =   727,\n    CV_IA64_P24   =   728,\n    CV_IA64_P25   =   729,\n    CV_IA64_P26   =   730,\n    CV_IA64_P27   =   731,\n    CV_IA64_P28   =   732,\n    CV_IA64_P29   =   733,\n    CV_IA64_P30   =   734,\n    CV_IA64_P31   =   735,\n    CV_IA64_P32   =   736,\n    CV_IA64_P33   =   737,\n    CV_IA64_P34   =   738,\n    CV_IA64_P35   =   739,\n    CV_IA64_P36   =   740,\n    CV_IA64_P37   =   741,\n    CV_IA64_P38   =   742,\n    CV_IA64_P39   =   743,\n    CV_IA64_P40   =   744,\n    CV_IA64_P41   =   745,\n    CV_IA64_P42   =   746,\n    CV_IA64_P43   =   747,\n    CV_IA64_P44   =   748,\n    CV_IA64_P45   =   749,\n    CV_IA64_P46   =   750,\n    CV_IA64_P47   =   751,\n    CV_IA64_P48   =   752,\n    CV_IA64_P49   =   753,\n    CV_IA64_P50   =   754,\n    CV_IA64_P51   =   755,\n    CV_IA64_P52   =   756,\n    CV_IA64_P53   =   757,\n    CV_IA64_P54   =   758,\n    CV_IA64_P55   =   759,\n    CV_IA64_P56   =   760,\n    CV_IA64_P57   =   761,\n    CV_IA64_P58   =   762,\n    CV_IA64_P59   =   763,\n    CV_IA64_P60   =   764,\n    CV_IA64_P61   =   765,\n    CV_IA64_P62   =   766,\n    CV_IA64_P63   =   767,\n\n    CV_IA64_Preds   =   768,\n\n    // Banked General Registers\n\n    CV_IA64_IntH0   =   832,\n    CV_IA64_IntH1   =   833,\n    CV_IA64_IntH2   =   834,\n    CV_IA64_IntH3   =   835,\n    CV_IA64_IntH4   =   836,\n    CV_IA64_IntH5   =   837,\n    CV_IA64_IntH6   =   838,\n    CV_IA64_IntH7   =   839,\n    CV_IA64_IntH8   =   840,\n    CV_IA64_IntH9   =   841,\n    CV_IA64_IntH10  =   842,\n    CV_IA64_IntH11  =   843,\n    CV_IA64_IntH12  =   844,\n    CV_IA64_IntH13  =   845,\n    CV_IA64_IntH14  =   846,\n    CV_IA64_IntH15  =   847,\n\n    // Special Registers\n\n    CV_IA64_Ip      =   1016,\n    CV_IA64_Umask   =   1017,\n    CV_IA64_Cfm     =   1018,\n    CV_IA64_Psr     =   1019,\n\n    // Banked General Registers\n\n    CV_IA64_Nats    =   1020,\n    CV_IA64_Nats2   =   1021,\n    CV_IA64_Nats3   =   1022,\n\n    // General-Purpose Registers\n\n    // Integer registers\n    CV_IA64_IntR0   =   1024,\n    CV_IA64_IntR1   =   1025,\n    CV_IA64_IntR2   =   1026,\n    CV_IA64_IntR3   =   1027,\n    CV_IA64_IntR4   =   1028,\n    CV_IA64_IntR5   =   1029,\n    CV_IA64_IntR6   =   1030,\n    CV_IA64_IntR7   =   1031,\n    CV_IA64_IntR8   =   1032,\n    CV_IA64_IntR9   =   1033,\n    CV_IA64_IntR10  =   1034,\n    CV_IA64_IntR11  =   1035,\n    CV_IA64_IntR12  =   1036,\n    CV_IA64_IntR13  =   1037,\n    CV_IA64_IntR14  =   1038,\n    CV_IA64_IntR15  =   1039,\n    CV_IA64_IntR16  =   1040,\n    CV_IA64_IntR17  =   1041,\n    CV_IA64_IntR18  =   1042,\n    CV_IA64_IntR19  =   1043,\n    CV_IA64_IntR20  =   1044,\n    CV_IA64_IntR21  =   1045,\n    CV_IA64_IntR22  =   1046,\n    CV_IA64_IntR23  =   1047,\n    CV_IA64_IntR24  =   1048,\n    CV_IA64_IntR25  =   1049,\n    CV_IA64_IntR26  =   1050,\n    CV_IA64_IntR27  =   1051,\n    CV_IA64_IntR28  =   1052,\n    CV_IA64_IntR29  =   1053,\n    CV_IA64_IntR30  =   1054,\n    CV_IA64_IntR31  =   1055,\n\n    // Register Stack\n    CV_IA64_IntR32  =   1056,\n    CV_IA64_IntR33  =   1057,\n    CV_IA64_IntR34  =   1058,\n    CV_IA64_IntR35  =   1059,\n    CV_IA64_IntR36  =   1060,\n    CV_IA64_IntR37  =   1061,\n    CV_IA64_IntR38  =   1062,\n    CV_IA64_IntR39  =   1063,\n    CV_IA64_IntR40  =   1064,\n    CV_IA64_IntR41  =   1065,\n    CV_IA64_IntR42  =   1066,\n    CV_IA64_IntR43  =   1067,\n    CV_IA64_IntR44  =   1068,\n    CV_IA64_IntR45  =   1069,\n    CV_IA64_IntR46  =   1070,\n    CV_IA64_IntR47  =   1071,\n    CV_IA64_IntR48  =   1072,\n    CV_IA64_IntR49  =   1073,\n    CV_IA64_IntR50  =   1074,\n    CV_IA64_IntR51  =   1075,\n    CV_IA64_IntR52  =   1076,\n    CV_IA64_IntR53  =   1077,\n    CV_IA64_IntR54  =   1078,\n    CV_IA64_IntR55  =   1079,\n    CV_IA64_IntR56  =   1080,\n    CV_IA64_IntR57  =   1081,\n    CV_IA64_IntR58  =   1082,\n    CV_IA64_IntR59  =   1083,\n    CV_IA64_IntR60  =   1084,\n    CV_IA64_IntR61  =   1085,\n    CV_IA64_IntR62  =   1086,\n    CV_IA64_IntR63  =   1087,\n    CV_IA64_IntR64  =   1088,\n    CV_IA64_IntR65  =   1089,\n    CV_IA64_IntR66  =   1090,\n    CV_IA64_IntR67  =   1091,\n    CV_IA64_IntR68  =   1092,\n    CV_IA64_IntR69  =   1093,\n    CV_IA64_IntR70  =   1094,\n    CV_IA64_IntR71  =   1095,\n    CV_IA64_IntR72  =   1096,\n    CV_IA64_IntR73  =   1097,\n    CV_IA64_IntR74  =   1098,\n    CV_IA64_IntR75  =   1099,\n    CV_IA64_IntR76  =   1100,\n    CV_IA64_IntR77  =   1101,\n    CV_IA64_IntR78  =   1102,\n    CV_IA64_IntR79  =   1103,\n    CV_IA64_IntR80  =   1104,\n    CV_IA64_IntR81  =   1105,\n    CV_IA64_IntR82  =   1106,\n    CV_IA64_IntR83  =   1107,\n    CV_IA64_IntR84  =   1108,\n    CV_IA64_IntR85  =   1109,\n    CV_IA64_IntR86  =   1110,\n    CV_IA64_IntR87  =   1111,\n    CV_IA64_IntR88  =   1112,\n    CV_IA64_IntR89  =   1113,\n    CV_IA64_IntR90  =   1114,\n    CV_IA64_IntR91  =   1115,\n    CV_IA64_IntR92  =   1116,\n    CV_IA64_IntR93  =   1117,\n    CV_IA64_IntR94  =   1118,\n    CV_IA64_IntR95  =   1119,\n    CV_IA64_IntR96  =   1120,\n    CV_IA64_IntR97  =   1121,\n    CV_IA64_IntR98  =   1122,\n    CV_IA64_IntR99  =   1123,\n    CV_IA64_IntR100 =   1124,\n    CV_IA64_IntR101 =   1125,\n    CV_IA64_IntR102 =   1126,\n    CV_IA64_IntR103 =   1127,\n    CV_IA64_IntR104 =   1128,\n    CV_IA64_IntR105 =   1129,\n    CV_IA64_IntR106 =   1130,\n    CV_IA64_IntR107 =   1131,\n    CV_IA64_IntR108 =   1132,\n    CV_IA64_IntR109 =   1133,\n    CV_IA64_IntR110 =   1134,\n    CV_IA64_IntR111 =   1135,\n    CV_IA64_IntR112 =   1136,\n    CV_IA64_IntR113 =   1137,\n    CV_IA64_IntR114 =   1138,\n    CV_IA64_IntR115 =   1139,\n    CV_IA64_IntR116 =   1140,\n    CV_IA64_IntR117 =   1141,\n    CV_IA64_IntR118 =   1142,\n    CV_IA64_IntR119 =   1143,\n    CV_IA64_IntR120 =   1144,\n    CV_IA64_IntR121 =   1145,\n    CV_IA64_IntR122 =   1146,\n    CV_IA64_IntR123 =   1147,\n    CV_IA64_IntR124 =   1148,\n    CV_IA64_IntR125 =   1149,\n    CV_IA64_IntR126 =   1150,\n    CV_IA64_IntR127 =   1151,\n\n    // Floating-Point Registers\n\n    // Low Floating Point Registers\n    CV_IA64_FltF0   =   2048,\n    CV_IA64_FltF1   =   2049,\n    CV_IA64_FltF2   =   2050,\n    CV_IA64_FltF3   =   2051,\n    CV_IA64_FltF4   =   2052,\n    CV_IA64_FltF5   =   2053,\n    CV_IA64_FltF6   =   2054,\n    CV_IA64_FltF7   =   2055,\n    CV_IA64_FltF8   =   2056,\n    CV_IA64_FltF9   =   2057,\n    CV_IA64_FltF10  =   2058,\n    CV_IA64_FltF11  =   2059,\n    CV_IA64_FltF12  =   2060,\n    CV_IA64_FltF13  =   2061,\n    CV_IA64_FltF14  =   2062,\n    CV_IA64_FltF15  =   2063,\n    CV_IA64_FltF16  =   2064,\n    CV_IA64_FltF17  =   2065,\n    CV_IA64_FltF18  =   2066,\n    CV_IA64_FltF19  =   2067,\n    CV_IA64_FltF20  =   2068,\n    CV_IA64_FltF21  =   2069,\n    CV_IA64_FltF22  =   2070,\n    CV_IA64_FltF23  =   2071,\n    CV_IA64_FltF24  =   2072,\n    CV_IA64_FltF25  =   2073,\n    CV_IA64_FltF26  =   2074,\n    CV_IA64_FltF27  =   2075,\n    CV_IA64_FltF28  =   2076,\n    CV_IA64_FltF29  =   2077,\n    CV_IA64_FltF30  =   2078,\n    CV_IA64_FltF31  =   2079,\n\n    // High Floating Point Registers\n    CV_IA64_FltF32  =   2080,\n    CV_IA64_FltF33  =   2081,\n    CV_IA64_FltF34  =   2082,\n    CV_IA64_FltF35  =   2083,\n    CV_IA64_FltF36  =   2084,\n    CV_IA64_FltF37  =   2085,\n    CV_IA64_FltF38  =   2086,\n    CV_IA64_FltF39  =   2087,\n    CV_IA64_FltF40  =   2088,\n    CV_IA64_FltF41  =   2089,\n    CV_IA64_FltF42  =   2090,\n    CV_IA64_FltF43  =   2091,\n    CV_IA64_FltF44  =   2092,\n    CV_IA64_FltF45  =   2093,\n    CV_IA64_FltF46  =   2094,\n    CV_IA64_FltF47  =   2095,\n    CV_IA64_FltF48  =   2096,\n    CV_IA64_FltF49  =   2097,\n    CV_IA64_FltF50  =   2098,\n    CV_IA64_FltF51  =   2099,\n    CV_IA64_FltF52  =   2100,\n    CV_IA64_FltF53  =   2101,\n    CV_IA64_FltF54  =   2102,\n    CV_IA64_FltF55  =   2103,\n    CV_IA64_FltF56  =   2104,\n    CV_IA64_FltF57  =   2105,\n    CV_IA64_FltF58  =   2106,\n    CV_IA64_FltF59  =   2107,\n    CV_IA64_FltF60  =   2108,\n    CV_IA64_FltF61  =   2109,\n    CV_IA64_FltF62  =   2110,\n    CV_IA64_FltF63  =   2111,\n    CV_IA64_FltF64  =   2112,\n    CV_IA64_FltF65  =   2113,\n    CV_IA64_FltF66  =   2114,\n    CV_IA64_FltF67  =   2115,\n    CV_IA64_FltF68  =   2116,\n    CV_IA64_FltF69  =   2117,\n    CV_IA64_FltF70  =   2118,\n    CV_IA64_FltF71  =   2119,\n    CV_IA64_FltF72  =   2120,\n    CV_IA64_FltF73  =   2121,\n    CV_IA64_FltF74  =   2122,\n    CV_IA64_FltF75  =   2123,\n    CV_IA64_FltF76  =   2124,\n    CV_IA64_FltF77  =   2125,\n    CV_IA64_FltF78  =   2126,\n    CV_IA64_FltF79  =   2127,\n    CV_IA64_FltF80  =   2128,\n    CV_IA64_FltF81  =   2129,\n    CV_IA64_FltF82  =   2130,\n    CV_IA64_FltF83  =   2131,\n    CV_IA64_FltF84  =   2132,\n    CV_IA64_FltF85  =   2133,\n    CV_IA64_FltF86  =   2134,\n    CV_IA64_FltF87  =   2135,\n    CV_IA64_FltF88  =   2136,\n    CV_IA64_FltF89  =   2137,\n    CV_IA64_FltF90  =   2138,\n    CV_IA64_FltF91  =   2139,\n    CV_IA64_FltF92  =   2140,\n    CV_IA64_FltF93  =   2141,\n    CV_IA64_FltF94  =   2142,\n    CV_IA64_FltF95  =   2143,\n    CV_IA64_FltF96  =   2144,\n    CV_IA64_FltF97  =   2145,\n    CV_IA64_FltF98  =   2146,\n    CV_IA64_FltF99  =   2147,\n    CV_IA64_FltF100 =   2148,\n    CV_IA64_FltF101 =   2149,\n    CV_IA64_FltF102 =   2150,\n    CV_IA64_FltF103 =   2151,\n    CV_IA64_FltF104 =   2152,\n    CV_IA64_FltF105 =   2153,\n    CV_IA64_FltF106 =   2154,\n    CV_IA64_FltF107 =   2155,\n    CV_IA64_FltF108 =   2156,\n    CV_IA64_FltF109 =   2157,\n    CV_IA64_FltF110 =   2158,\n    CV_IA64_FltF111 =   2159,\n    CV_IA64_FltF112 =   2160,\n    CV_IA64_FltF113 =   2161,\n    CV_IA64_FltF114 =   2162,\n    CV_IA64_FltF115 =   2163,\n    CV_IA64_FltF116 =   2164,\n    CV_IA64_FltF117 =   2165,\n    CV_IA64_FltF118 =   2166,\n    CV_IA64_FltF119 =   2167,\n    CV_IA64_FltF120 =   2168,\n    CV_IA64_FltF121 =   2169,\n    CV_IA64_FltF122 =   2170,\n    CV_IA64_FltF123 =   2171,\n    CV_IA64_FltF124 =   2172,\n    CV_IA64_FltF125 =   2173,\n    CV_IA64_FltF126 =   2174,\n    CV_IA64_FltF127 =   2175,\n\n    // Application Registers\n\n    CV_IA64_ApKR0   =   3072,\n    CV_IA64_ApKR1   =   3073,\n    CV_IA64_ApKR2   =   3074,\n    CV_IA64_ApKR3   =   3075,\n    CV_IA64_ApKR4   =   3076,\n    CV_IA64_ApKR5   =   3077,\n    CV_IA64_ApKR6   =   3078,\n    CV_IA64_ApKR7   =   3079,\n    CV_IA64_AR8     =   3080,\n    CV_IA64_AR9     =   3081,\n    CV_IA64_AR10    =   3082,\n    CV_IA64_AR11    =   3083,\n    CV_IA64_AR12    =   3084,\n    CV_IA64_AR13    =   3085,\n    CV_IA64_AR14    =   3086,\n    CV_IA64_AR15    =   3087,\n    CV_IA64_RsRSC   =   3088,\n    CV_IA64_RsBSP   =   3089,\n    CV_IA64_RsBSPSTORE  =   3090,\n    CV_IA64_RsRNAT  =   3091,\n    CV_IA64_AR20    =   3092,\n    CV_IA64_StFCR   =   3093,\n    CV_IA64_AR22    =   3094,\n    CV_IA64_AR23    =   3095,\n    CV_IA64_EFLAG   =   3096,\n    CV_IA64_CSD     =   3097,\n    CV_IA64_SSD     =   3098,\n    CV_IA64_CFLG    =   3099,\n    CV_IA64_StFSR   =   3100,\n    CV_IA64_StFIR   =   3101,\n    CV_IA64_StFDR   =   3102,\n    CV_IA64_AR31    =   3103,\n    CV_IA64_ApCCV   =   3104,\n    CV_IA64_AR33    =   3105,\n    CV_IA64_AR34    =   3106,\n    CV_IA64_AR35    =   3107,\n    CV_IA64_ApUNAT  =   3108,\n    CV_IA64_AR37    =   3109,\n    CV_IA64_AR38    =   3110,\n    CV_IA64_AR39    =   3111,\n    CV_IA64_StFPSR  =   3112,\n    CV_IA64_AR41    =   3113,\n    CV_IA64_AR42    =   3114,\n    CV_IA64_AR43    =   3115,\n    CV_IA64_ApITC   =   3116,\n    CV_IA64_AR45    =   3117,\n    CV_IA64_AR46    =   3118,\n    CV_IA64_AR47    =   3119,\n    CV_IA64_AR48    =   3120,\n    CV_IA64_AR49    =   3121,\n    CV_IA64_AR50    =   3122,\n    CV_IA64_AR51    =   3123,\n    CV_IA64_AR52    =   3124,\n    CV_IA64_AR53    =   3125,\n    CV_IA64_AR54    =   3126,\n    CV_IA64_AR55    =   3127,\n    CV_IA64_AR56    =   3128,\n    CV_IA64_AR57    =   3129,\n    CV_IA64_AR58    =   3130,\n    CV_IA64_AR59    =   3131,\n    CV_IA64_AR60    =   3132,\n    CV_IA64_AR61    =   3133,\n    CV_IA64_AR62    =   3134,\n    CV_IA64_AR63    =   3135,\n    CV_IA64_RsPFS   =   3136,\n    CV_IA64_ApLC    =   3137,\n    CV_IA64_ApEC    =   3138,\n    CV_IA64_AR67    =   3139,\n    CV_IA64_AR68    =   3140,\n    CV_IA64_AR69    =   3141,\n    CV_IA64_AR70    =   3142,\n    CV_IA64_AR71    =   3143,\n    CV_IA64_AR72    =   3144,\n    CV_IA64_AR73    =   3145,\n    CV_IA64_AR74    =   3146,\n    CV_IA64_AR75    =   3147,\n    CV_IA64_AR76    =   3148,\n    CV_IA64_AR77    =   3149,\n    CV_IA64_AR78    =   3150,\n    CV_IA64_AR79    =   3151,\n    CV_IA64_AR80    =   3152,\n    CV_IA64_AR81    =   3153,\n    CV_IA64_AR82    =   3154,\n    CV_IA64_AR83    =   3155,\n    CV_IA64_AR84    =   3156,\n    CV_IA64_AR85    =   3157,\n    CV_IA64_AR86    =   3158,\n    CV_IA64_AR87    =   3159,\n    CV_IA64_AR88    =   3160,\n    CV_IA64_AR89    =   3161,\n    CV_IA64_AR90    =   3162,\n    CV_IA64_AR91    =   3163,\n    CV_IA64_AR92    =   3164,\n    CV_IA64_AR93    =   3165,\n    CV_IA64_AR94    =   3166,\n    CV_IA64_AR95    =   3167,\n    CV_IA64_AR96    =   3168,\n    CV_IA64_AR97    =   3169,\n    CV_IA64_AR98    =   3170,\n    CV_IA64_AR99    =   3171,\n    CV_IA64_AR100   =   3172,\n    CV_IA64_AR101   =   3173,\n    CV_IA64_AR102   =   3174,\n    CV_IA64_AR103   =   3175,\n    CV_IA64_AR104   =   3176,\n    CV_IA64_AR105   =   3177,\n    CV_IA64_AR106   =   3178,\n    CV_IA64_AR107   =   3179,\n    CV_IA64_AR108   =   3180,\n    CV_IA64_AR109   =   3181,\n    CV_IA64_AR110   =   3182,\n    CV_IA64_AR111   =   3183,\n    CV_IA64_AR112   =   3184,\n    CV_IA64_AR113   =   3185,\n    CV_IA64_AR114   =   3186,\n    CV_IA64_AR115   =   3187,\n    CV_IA64_AR116   =   3188,\n    CV_IA64_AR117   =   3189,\n    CV_IA64_AR118   =   3190,\n    CV_IA64_AR119   =   3191,\n    CV_IA64_AR120   =   3192,\n    CV_IA64_AR121   =   3193,\n    CV_IA64_AR122   =   3194,\n    CV_IA64_AR123   =   3195,\n    CV_IA64_AR124   =   3196,\n    CV_IA64_AR125   =   3197,\n    CV_IA64_AR126   =   3198,\n    CV_IA64_AR127   =   3199,\n\n    // CPUID Registers\n\n    CV_IA64_CPUID0  =   3328,\n    CV_IA64_CPUID1  =   3329,\n    CV_IA64_CPUID2  =   3330,\n    CV_IA64_CPUID3  =   3331,\n    CV_IA64_CPUID4  =   3332,\n\n    // Control Registers\n\n    CV_IA64_ApDCR   =   4096,\n    CV_IA64_ApITM   =   4097,\n    CV_IA64_ApIVA   =   4098,\n    CV_IA64_CR3     =   4099,\n    CV_IA64_CR4     =   4100,\n    CV_IA64_CR5     =   4101,\n    CV_IA64_CR6     =   4102,\n    CV_IA64_CR7     =   4103,\n    CV_IA64_ApPTA   =   4104,\n    CV_IA64_ApGPTA  =   4105,\n    CV_IA64_CR10    =   4106,\n    CV_IA64_CR11    =   4107,\n    CV_IA64_CR12    =   4108,\n    CV_IA64_CR13    =   4109,\n    CV_IA64_CR14    =   4110,\n    CV_IA64_CR15    =   4111,\n    CV_IA64_StIPSR  =   4112,\n    CV_IA64_StISR   =   4113,\n    CV_IA64_CR18    =   4114,\n    CV_IA64_StIIP   =   4115,\n    CV_IA64_StIFA   =   4116,\n    CV_IA64_StITIR  =   4117,\n    CV_IA64_StIIPA  =   4118,\n    CV_IA64_StIFS   =   4119,\n    CV_IA64_StIIM   =   4120,\n    CV_IA64_StIHA   =   4121,\n    CV_IA64_CR26    =   4122,\n    CV_IA64_CR27    =   4123,\n    CV_IA64_CR28    =   4124,\n    CV_IA64_CR29    =   4125,\n    CV_IA64_CR30    =   4126,\n    CV_IA64_CR31    =   4127,\n    CV_IA64_CR32    =   4128,\n    CV_IA64_CR33    =   4129,\n    CV_IA64_CR34    =   4130,\n    CV_IA64_CR35    =   4131,\n    CV_IA64_CR36    =   4132,\n    CV_IA64_CR37    =   4133,\n    CV_IA64_CR38    =   4134,\n    CV_IA64_CR39    =   4135,\n    CV_IA64_CR40    =   4136,\n    CV_IA64_CR41    =   4137,\n    CV_IA64_CR42    =   4138,\n    CV_IA64_CR43    =   4139,\n    CV_IA64_CR44    =   4140,\n    CV_IA64_CR45    =   4141,\n    CV_IA64_CR46    =   4142,\n    CV_IA64_CR47    =   4143,\n    CV_IA64_CR48    =   4144,\n    CV_IA64_CR49    =   4145,\n    CV_IA64_CR50    =   4146,\n    CV_IA64_CR51    =   4147,\n    CV_IA64_CR52    =   4148,\n    CV_IA64_CR53    =   4149,\n    CV_IA64_CR54    =   4150,\n    CV_IA64_CR55    =   4151,\n    CV_IA64_CR56    =   4152,\n    CV_IA64_CR57    =   4153,\n    CV_IA64_CR58    =   4154,\n    CV_IA64_CR59    =   4155,\n    CV_IA64_CR60    =   4156,\n    CV_IA64_CR61    =   4157,\n    CV_IA64_CR62    =   4158,\n    CV_IA64_CR63    =   4159,\n    CV_IA64_SaLID   =   4160,\n    CV_IA64_SaIVR   =   4161,\n    CV_IA64_SaTPR   =   4162,\n    CV_IA64_SaEOI   =   4163,\n    CV_IA64_SaIRR0  =   4164,\n    CV_IA64_SaIRR1  =   4165,\n    CV_IA64_SaIRR2  =   4166,\n    CV_IA64_SaIRR3  =   4167,\n    CV_IA64_SaITV   =   4168,\n    CV_IA64_SaPMV   =   4169,\n    CV_IA64_SaCMCV  =   4170,\n    CV_IA64_CR75    =   4171,\n    CV_IA64_CR76    =   4172,\n    CV_IA64_CR77    =   4173,\n    CV_IA64_CR78    =   4174,\n    CV_IA64_CR79    =   4175,\n    CV_IA64_SaLRR0  =   4176,\n    CV_IA64_SaLRR1  =   4177,\n    CV_IA64_CR82    =   4178,\n    CV_IA64_CR83    =   4179,\n    CV_IA64_CR84    =   4180,\n    CV_IA64_CR85    =   4181,\n    CV_IA64_CR86    =   4182,\n    CV_IA64_CR87    =   4183,\n    CV_IA64_CR88    =   4184,\n    CV_IA64_CR89    =   4185,\n    CV_IA64_CR90    =   4186,\n    CV_IA64_CR91    =   4187,\n    CV_IA64_CR92    =   4188,\n    CV_IA64_CR93    =   4189,\n    CV_IA64_CR94    =   4190,\n    CV_IA64_CR95    =   4191,\n    CV_IA64_CR96    =   4192,\n    CV_IA64_CR97    =   4193,\n    CV_IA64_CR98    =   4194,\n    CV_IA64_CR99    =   4195,\n    CV_IA64_CR100   =   4196,\n    CV_IA64_CR101   =   4197,\n    CV_IA64_CR102   =   4198,\n    CV_IA64_CR103   =   4199,\n    CV_IA64_CR104   =   4200,\n    CV_IA64_CR105   =   4201,\n    CV_IA64_CR106   =   4202,\n    CV_IA64_CR107   =   4203,\n    CV_IA64_CR108   =   4204,\n    CV_IA64_CR109   =   4205,\n    CV_IA64_CR110   =   4206,\n    CV_IA64_CR111   =   4207,\n    CV_IA64_CR112   =   4208,\n    CV_IA64_CR113   =   4209,\n    CV_IA64_CR114   =   4210,\n    CV_IA64_CR115   =   4211,\n    CV_IA64_CR116   =   4212,\n    CV_IA64_CR117   =   4213,\n    CV_IA64_CR118   =   4214,\n    CV_IA64_CR119   =   4215,\n    CV_IA64_CR120   =   4216,\n    CV_IA64_CR121   =   4217,\n    CV_IA64_CR122   =   4218,\n    CV_IA64_CR123   =   4219,\n    CV_IA64_CR124   =   4220,\n    CV_IA64_CR125   =   4221,\n    CV_IA64_CR126   =   4222,\n    CV_IA64_CR127   =   4223,\n\n    // Protection Key Registers\n\n    CV_IA64_Pkr0    =   5120,\n    CV_IA64_Pkr1    =   5121,\n    CV_IA64_Pkr2    =   5122,\n    CV_IA64_Pkr3    =   5123,\n    CV_IA64_Pkr4    =   5124,\n    CV_IA64_Pkr5    =   5125,\n    CV_IA64_Pkr6    =   5126,\n    CV_IA64_Pkr7    =   5127,\n    CV_IA64_Pkr8    =   5128,\n    CV_IA64_Pkr9    =   5129,\n    CV_IA64_Pkr10   =   5130,\n    CV_IA64_Pkr11   =   5131,\n    CV_IA64_Pkr12   =   5132,\n    CV_IA64_Pkr13   =   5133,\n    CV_IA64_Pkr14   =   5134,\n    CV_IA64_Pkr15   =   5135,\n\n    // Region Registers\n\n    CV_IA64_Rr0     =   6144,\n    CV_IA64_Rr1     =   6145,\n    CV_IA64_Rr2     =   6146,\n    CV_IA64_Rr3     =   6147,\n    CV_IA64_Rr4     =   6148,\n    CV_IA64_Rr5     =   6149,\n    CV_IA64_Rr6     =   6150,\n    CV_IA64_Rr7     =   6151,\n\n    // Performance Monitor Data Registers\n\n    CV_IA64_PFD0    =   7168,\n    CV_IA64_PFD1    =   7169,\n    CV_IA64_PFD2    =   7170,\n    CV_IA64_PFD3    =   7171,\n    CV_IA64_PFD4    =   7172,\n    CV_IA64_PFD5    =   7173,\n    CV_IA64_PFD6    =   7174,\n    CV_IA64_PFD7    =   7175,\n    CV_IA64_PFD8    =   7176,\n    CV_IA64_PFD9    =   7177,\n    CV_IA64_PFD10   =   7178,\n    CV_IA64_PFD11   =   7179,\n    CV_IA64_PFD12   =   7180,\n    CV_IA64_PFD13   =   7181,\n    CV_IA64_PFD14   =   7182,\n    CV_IA64_PFD15   =   7183,\n    CV_IA64_PFD16   =   7184,\n    CV_IA64_PFD17   =   7185,\n\n    // Performance Monitor Config Registers\n\n    CV_IA64_PFC0    =   7424,\n    CV_IA64_PFC1    =   7425,\n    CV_IA64_PFC2    =   7426,\n    CV_IA64_PFC3    =   7427,\n    CV_IA64_PFC4    =   7428,\n    CV_IA64_PFC5    =   7429,\n    CV_IA64_PFC6    =   7430,\n    CV_IA64_PFC7    =   7431,\n    CV_IA64_PFC8    =   7432,\n    CV_IA64_PFC9    =   7433,\n    CV_IA64_PFC10   =   7434,\n    CV_IA64_PFC11   =   7435,\n    CV_IA64_PFC12   =   7436,\n    CV_IA64_PFC13   =   7437,\n    CV_IA64_PFC14   =   7438,\n    CV_IA64_PFC15   =   7439,\n\n    // Instruction Translation Registers\n\n    CV_IA64_TrI0    =   8192,\n    CV_IA64_TrI1    =   8193,\n    CV_IA64_TrI2    =   8194,\n    CV_IA64_TrI3    =   8195,\n    CV_IA64_TrI4    =   8196,\n    CV_IA64_TrI5    =   8197,\n    CV_IA64_TrI6    =   8198,\n    CV_IA64_TrI7    =   8199,\n\n    // Data Translation Registers\n\n    CV_IA64_TrD0    =   8320,\n    CV_IA64_TrD1    =   8321,\n    CV_IA64_TrD2    =   8322,\n    CV_IA64_TrD3    =   8323,\n    CV_IA64_TrD4    =   8324,\n    CV_IA64_TrD5    =   8325,\n    CV_IA64_TrD6    =   8326,\n    CV_IA64_TrD7    =   8327,\n\n    // Instruction Breakpoint Registers\n\n    CV_IA64_DbI0    =   8448,\n    CV_IA64_DbI1    =   8449,\n    CV_IA64_DbI2    =   8450,\n    CV_IA64_DbI3    =   8451,\n    CV_IA64_DbI4    =   8452,\n    CV_IA64_DbI5    =   8453,\n    CV_IA64_DbI6    =   8454,\n    CV_IA64_DbI7    =   8455,\n\n    // Data Breakpoint Registers\n\n    CV_IA64_DbD0    =   8576,\n    CV_IA64_DbD1    =   8577,\n    CV_IA64_DbD2    =   8578,\n    CV_IA64_DbD3    =   8579,\n    CV_IA64_DbD4    =   8580,\n    CV_IA64_DbD5    =   8581,\n    CV_IA64_DbD6    =   8582,\n    CV_IA64_DbD7    =   8583,\n\n    //\n    // Register set for the TriCore processor.\n    //\n\n    CV_TRI_NOREG    =   CV_REG_NONE,\n\n    // General Purpose Data Registers\n\n    CV_TRI_D0   =   10,\n    CV_TRI_D1   =   11,\n    CV_TRI_D2   =   12,\n    CV_TRI_D3   =   13,\n    CV_TRI_D4   =   14,\n    CV_TRI_D5   =   15,\n    CV_TRI_D6   =   16,\n    CV_TRI_D7   =   17,\n    CV_TRI_D8   =   18,\n    CV_TRI_D9   =   19,\n    CV_TRI_D10  =   20,\n    CV_TRI_D11  =   21,\n    CV_TRI_D12  =   22,\n    CV_TRI_D13  =   23,\n    CV_TRI_D14  =   24,\n    CV_TRI_D15  =   25,\n\n    // General Purpose Address Registers\n\n    CV_TRI_A0   =   26,\n    CV_TRI_A1   =   27,\n    CV_TRI_A2   =   28,\n    CV_TRI_A3   =   29,\n    CV_TRI_A4   =   30,\n    CV_TRI_A5   =   31,\n    CV_TRI_A6   =   32,\n    CV_TRI_A7   =   33,\n    CV_TRI_A8   =   34,\n    CV_TRI_A9   =   35,\n    CV_TRI_A10  =   36,\n    CV_TRI_A11  =   37,\n    CV_TRI_A12  =   38,\n    CV_TRI_A13  =   39,\n    CV_TRI_A14  =   40,\n    CV_TRI_A15  =   41,\n\n    // Extended (64-bit) data registers\n\n    CV_TRI_E0   =   42,\n    CV_TRI_E2   =   43,\n    CV_TRI_E4   =   44,\n    CV_TRI_E6   =   45,\n    CV_TRI_E8   =   46,\n    CV_TRI_E10  =   47,\n    CV_TRI_E12  =   48,\n    CV_TRI_E14  =   49,\n\n    // Extended (64-bit) address registers\n\n    CV_TRI_EA0  =   50,\n    CV_TRI_EA2  =   51,\n    CV_TRI_EA4  =   52,\n    CV_TRI_EA6  =   53,\n    CV_TRI_EA8  =   54,\n    CV_TRI_EA10 =   55,\n    CV_TRI_EA12 =   56,\n    CV_TRI_EA14 =   57,\n\n    CV_TRI_PSW  =   58,\n    CV_TRI_PCXI =   59,\n    CV_TRI_PC   =   60,\n    CV_TRI_FCX  =   61,\n    CV_TRI_LCX  =   62,\n    CV_TRI_ISP  =   63,\n    CV_TRI_ICR  =   64,\n    CV_TRI_BIV  =   65,\n    CV_TRI_BTV  =   66,\n    CV_TRI_SYSCON   =   67,\n    CV_TRI_DPRx_0   =   68,\n    CV_TRI_DPRx_1   =   69,\n    CV_TRI_DPRx_2   =   70,\n    CV_TRI_DPRx_3   =   71,\n    CV_TRI_CPRx_0   =   68,\n    CV_TRI_CPRx_1   =   69,\n    CV_TRI_CPRx_2   =   70,\n    CV_TRI_CPRx_3   =   71,\n    CV_TRI_DPMx_0   =   68,\n    CV_TRI_DPMx_1   =   69,\n    CV_TRI_DPMx_2   =   70,\n    CV_TRI_DPMx_3   =   71,\n    CV_TRI_CPMx_0   =   68,\n    CV_TRI_CPMx_1   =   69,\n    CV_TRI_CPMx_2   =   70,\n    CV_TRI_CPMx_3   =   71,\n    CV_TRI_DBGSSR   =   72,\n    CV_TRI_EXEVT    =   73,\n    CV_TRI_SWEVT    =   74,\n    CV_TRI_CREVT    =   75,\n    CV_TRI_TRnEVT   =   76,\n    CV_TRI_MMUCON   =   77,\n    CV_TRI_ASI      =   78,\n    CV_TRI_TVA      =   79,\n    CV_TRI_TPA      =   80,\n    CV_TRI_TPX      =   81,\n    CV_TRI_TFA      =   82,\n\n    //\n    // Register set for the AM33 and related processors.\n    //\n\n    CV_AM33_NOREG   =   CV_REG_NONE,\n\n    // \"Extended\" (general purpose integer) registers\n    CV_AM33_E0      =   10,\n    CV_AM33_E1      =   11,\n    CV_AM33_E2      =   12,\n    CV_AM33_E3      =   13,\n    CV_AM33_E4      =   14,\n    CV_AM33_E5      =   15,\n    CV_AM33_E6      =   16,\n    CV_AM33_E7      =   17,\n\n    // Address registers\n    CV_AM33_A0      =   20,\n    CV_AM33_A1      =   21,\n    CV_AM33_A2      =   22,\n    CV_AM33_A3      =   23,\n\n    // Integer data registers\n    CV_AM33_D0      =   30,\n    CV_AM33_D1      =   31,\n    CV_AM33_D2      =   32,\n    CV_AM33_D3      =   33,\n\n    // (Single-precision) floating-point registers\n    CV_AM33_FS0     =   40,\n    CV_AM33_FS1     =   41,\n    CV_AM33_FS2     =   42,\n    CV_AM33_FS3     =   43,\n    CV_AM33_FS4     =   44,\n    CV_AM33_FS5     =   45,\n    CV_AM33_FS6     =   46,\n    CV_AM33_FS7     =   47,\n    CV_AM33_FS8     =   48,\n    CV_AM33_FS9     =   49,\n    CV_AM33_FS10    =   50,\n    CV_AM33_FS11    =   51,\n    CV_AM33_FS12    =   52,\n    CV_AM33_FS13    =   53,\n    CV_AM33_FS14    =   54,\n    CV_AM33_FS15    =   55,\n    CV_AM33_FS16    =   56,\n    CV_AM33_FS17    =   57,\n    CV_AM33_FS18    =   58,\n    CV_AM33_FS19    =   59,\n    CV_AM33_FS20    =   60,\n    CV_AM33_FS21    =   61,\n    CV_AM33_FS22    =   62,\n    CV_AM33_FS23    =   63,\n    CV_AM33_FS24    =   64,\n    CV_AM33_FS25    =   65,\n    CV_AM33_FS26    =   66,\n    CV_AM33_FS27    =   67,\n    CV_AM33_FS28    =   68,\n    CV_AM33_FS29    =   69,\n    CV_AM33_FS30    =   70,\n    CV_AM33_FS31    =   71,\n\n    // Special purpose registers\n\n    // Stack pointer\n    CV_AM33_SP      =   80,\n\n    // Program counter\n    CV_AM33_PC      =   81,\n\n    // Multiply-divide/accumulate registers\n    CV_AM33_MDR     =   82,\n    CV_AM33_MDRQ    =   83,\n    CV_AM33_MCRH    =   84,\n    CV_AM33_MCRL    =   85,\n    CV_AM33_MCVF    =   86,\n\n    // CPU status words\n    CV_AM33_EPSW    =   87,\n    CV_AM33_FPCR    =   88,\n\n    // Loop buffer registers\n    CV_AM33_LIR     =   89,\n    CV_AM33_LAR     =   90,\n\n    //\n    // Register set for the Mitsubishi M32R\n    //\n\n    CV_M32R_NOREG    =   CV_REG_NONE,\n\n    CV_M32R_R0    =   10,\n    CV_M32R_R1    =   11,\n    CV_M32R_R2    =   12,\n    CV_M32R_R3    =   13,\n    CV_M32R_R4    =   14,\n    CV_M32R_R5    =   15,\n    CV_M32R_R6    =   16,\n    CV_M32R_R7    =   17,\n    CV_M32R_R8    =   18,\n    CV_M32R_R9    =   19,\n    CV_M32R_R10   =   20,\n    CV_M32R_R11   =   21,\n    CV_M32R_R12   =   22,   // Gloabal Pointer, if used\n    CV_M32R_R13   =   23,   // Frame Pointer, if allocated\n    CV_M32R_R14   =   24,   // Link Register\n    CV_M32R_R15   =   25,   // Stack Pointer\n    CV_M32R_PSW   =   26,   // Preocessor Status Register\n    CV_M32R_CBR   =   27,   // Condition Bit Register\n    CV_M32R_SPI   =   28,   // Interrupt Stack Pointer\n    CV_M32R_SPU   =   29,   // User Stack Pointer\n    CV_M32R_SPO   =   30,   // OS Stack Pointer\n    CV_M32R_BPC   =   31,   // Backup Program Counter\n    CV_M32R_ACHI  =   32,   // Accumulator High\n    CV_M32R_ACLO  =   33,   // Accumulator Low\n    CV_M32R_PC    =   34,   // Program Counter\n\n    //\n    // Register set for the SuperH SHMedia processor including compact\n    // mode\n    //\n\n    // Integer - 64 bit general registers\n    CV_SHMEDIA_NOREG   =   CV_REG_NONE,\n    CV_SHMEDIA_R0      =   10,\n    CV_SHMEDIA_R1      =   11,\n    CV_SHMEDIA_R2      =   12,\n    CV_SHMEDIA_R3      =   13,\n    CV_SHMEDIA_R4      =   14,\n    CV_SHMEDIA_R5      =   15,\n    CV_SHMEDIA_R6      =   16,\n    CV_SHMEDIA_R7      =   17,\n    CV_SHMEDIA_R8      =   18,\n    CV_SHMEDIA_R9      =   19,\n    CV_SHMEDIA_R10     =   20,\n    CV_SHMEDIA_R11     =   21,\n    CV_SHMEDIA_R12     =   22,\n    CV_SHMEDIA_R13     =   23,\n    CV_SHMEDIA_R14     =   24,\n    CV_SHMEDIA_R15     =   25,\n    CV_SHMEDIA_R16     =   26,\n    CV_SHMEDIA_R17     =   27,\n    CV_SHMEDIA_R18     =   28,\n    CV_SHMEDIA_R19     =   29,\n    CV_SHMEDIA_R20     =   30,\n    CV_SHMEDIA_R21     =   31,\n    CV_SHMEDIA_R22     =   32,\n    CV_SHMEDIA_R23     =   33,\n    CV_SHMEDIA_R24     =   34,\n    CV_SHMEDIA_R25     =   35,\n    CV_SHMEDIA_R26     =   36,\n    CV_SHMEDIA_R27     =   37,\n    CV_SHMEDIA_R28     =   38,\n    CV_SHMEDIA_R29     =   39,\n    CV_SHMEDIA_R30     =   40,\n    CV_SHMEDIA_R31     =   41,\n    CV_SHMEDIA_R32     =   42,\n    CV_SHMEDIA_R33     =   43,\n    CV_SHMEDIA_R34     =   44,\n    CV_SHMEDIA_R35     =   45,\n    CV_SHMEDIA_R36     =   46,\n    CV_SHMEDIA_R37     =   47,\n    CV_SHMEDIA_R38     =   48,\n    CV_SHMEDIA_R39     =   49,\n    CV_SHMEDIA_R40     =   50,\n    CV_SHMEDIA_R41     =   51,\n    CV_SHMEDIA_R42     =   52,\n    CV_SHMEDIA_R43     =   53,\n    CV_SHMEDIA_R44     =   54,\n    CV_SHMEDIA_R45     =   55,\n    CV_SHMEDIA_R46     =   56,\n    CV_SHMEDIA_R47     =   57,\n    CV_SHMEDIA_R48     =   58,\n    CV_SHMEDIA_R49     =   59,\n    CV_SHMEDIA_R50     =   60,\n    CV_SHMEDIA_R51     =   61,\n    CV_SHMEDIA_R52     =   62,\n    CV_SHMEDIA_R53     =   63,\n    CV_SHMEDIA_R54     =   64,\n    CV_SHMEDIA_R55     =   65,\n    CV_SHMEDIA_R56     =   66,\n    CV_SHMEDIA_R57     =   67,\n    CV_SHMEDIA_R58     =   68,\n    CV_SHMEDIA_R59     =   69,\n    CV_SHMEDIA_R60     =   70,\n    CV_SHMEDIA_R61     =   71,\n    CV_SHMEDIA_R62     =   72,\n    CV_SHMEDIA_R63     =   73,\n    \n    // Target Registers - 32 bit\n    CV_SHMEDIA_TR0     =   74,\n    CV_SHMEDIA_TR1     =   75,\n    CV_SHMEDIA_TR2     =   76,\n    CV_SHMEDIA_TR3     =   77,\n    CV_SHMEDIA_TR4     =   78,\n    CV_SHMEDIA_TR5     =   79,\n    CV_SHMEDIA_TR6     =   80,\n    CV_SHMEDIA_TR7     =   81,\n    CV_SHMEDIA_TR8     =   82, // future-proof\n    CV_SHMEDIA_TR9     =   83, // future-proof\n    CV_SHMEDIA_TR10    =   84, // future-proof\n    CV_SHMEDIA_TR11    =   85, // future-proof\n    CV_SHMEDIA_TR12    =   86, // future-proof\n    CV_SHMEDIA_TR13    =   87, // future-proof\n    CV_SHMEDIA_TR14    =   88, // future-proof\n    CV_SHMEDIA_TR15    =   89, // future-proof\n\n    // Single - 32 bit fp registers\n    CV_SHMEDIA_FR0     =   128,\n    CV_SHMEDIA_FR1     =   129,\n    CV_SHMEDIA_FR2     =   130,\n    CV_SHMEDIA_FR3     =   131,\n    CV_SHMEDIA_FR4     =   132,\n    CV_SHMEDIA_FR5     =   133,\n    CV_SHMEDIA_FR6     =   134,\n    CV_SHMEDIA_FR7     =   135,\n    CV_SHMEDIA_FR8     =   136,\n    CV_SHMEDIA_FR9     =   137,\n    CV_SHMEDIA_FR10    =   138,\n    CV_SHMEDIA_FR11    =   139,\n    CV_SHMEDIA_FR12    =   140,\n    CV_SHMEDIA_FR13    =   141,\n    CV_SHMEDIA_FR14    =   142,\n    CV_SHMEDIA_FR15    =   143,\n    CV_SHMEDIA_FR16    =   144,\n    CV_SHMEDIA_FR17    =   145,\n    CV_SHMEDIA_FR18    =   146,\n    CV_SHMEDIA_FR19    =   147,\n    CV_SHMEDIA_FR20    =   148,\n    CV_SHMEDIA_FR21    =   149,\n    CV_SHMEDIA_FR22    =   150,\n    CV_SHMEDIA_FR23    =   151,\n    CV_SHMEDIA_FR24    =   152,\n    CV_SHMEDIA_FR25    =   153,\n    CV_SHMEDIA_FR26    =   154,\n    CV_SHMEDIA_FR27    =   155,\n    CV_SHMEDIA_FR28    =   156,\n    CV_SHMEDIA_FR29    =   157,\n    CV_SHMEDIA_FR30    =   158,\n    CV_SHMEDIA_FR31    =   159,\n    CV_SHMEDIA_FR32    =   160,\n    CV_SHMEDIA_FR33    =   161,\n    CV_SHMEDIA_FR34    =   162,\n    CV_SHMEDIA_FR35    =   163,\n    CV_SHMEDIA_FR36    =   164,\n    CV_SHMEDIA_FR37    =   165,\n    CV_SHMEDIA_FR38    =   166,\n    CV_SHMEDIA_FR39    =   167,\n    CV_SHMEDIA_FR40    =   168,\n    CV_SHMEDIA_FR41    =   169,\n    CV_SHMEDIA_FR42    =   170,\n    CV_SHMEDIA_FR43    =   171,\n    CV_SHMEDIA_FR44    =   172,\n    CV_SHMEDIA_FR45    =   173,\n    CV_SHMEDIA_FR46    =   174,\n    CV_SHMEDIA_FR47    =   175,\n    CV_SHMEDIA_FR48    =   176,\n    CV_SHMEDIA_FR49    =   177,\n    CV_SHMEDIA_FR50    =   178,\n    CV_SHMEDIA_FR51    =   179,\n    CV_SHMEDIA_FR52    =   180,\n    CV_SHMEDIA_FR53    =   181,\n    CV_SHMEDIA_FR54    =   182,\n    CV_SHMEDIA_FR55    =   183,\n    CV_SHMEDIA_FR56    =   184,\n    CV_SHMEDIA_FR57    =   185,\n    CV_SHMEDIA_FR58    =   186,\n    CV_SHMEDIA_FR59    =   187,\n    CV_SHMEDIA_FR60    =   188,\n    CV_SHMEDIA_FR61    =   189,\n    CV_SHMEDIA_FR62    =   190,\n    CV_SHMEDIA_FR63    =   191,\n\n    // Double - 64 bit synonyms for 32bit fp register pairs\n    //          subtract 128 to find first base single register\n    CV_SHMEDIA_DR0     =   256,\n    CV_SHMEDIA_DR2     =   258,\n    CV_SHMEDIA_DR4     =   260,\n    CV_SHMEDIA_DR6     =   262,\n    CV_SHMEDIA_DR8     =   264,\n    CV_SHMEDIA_DR10    =   266,\n    CV_SHMEDIA_DR12    =   268,\n    CV_SHMEDIA_DR14    =   270,\n    CV_SHMEDIA_DR16    =   272,\n    CV_SHMEDIA_DR18    =   274,\n    CV_SHMEDIA_DR20    =   276,\n    CV_SHMEDIA_DR22    =   278,\n    CV_SHMEDIA_DR24    =   280,\n    CV_SHMEDIA_DR26    =   282,\n    CV_SHMEDIA_DR28    =   284,\n    CV_SHMEDIA_DR30    =   286,\n    CV_SHMEDIA_DR32    =   288,\n    CV_SHMEDIA_DR34    =   290,\n    CV_SHMEDIA_DR36    =   292,\n    CV_SHMEDIA_DR38    =   294,\n    CV_SHMEDIA_DR40    =   296,\n    CV_SHMEDIA_DR42    =   298,\n    CV_SHMEDIA_DR44    =   300,\n    CV_SHMEDIA_DR46    =   302,\n    CV_SHMEDIA_DR48    =   304,\n    CV_SHMEDIA_DR50    =   306,\n    CV_SHMEDIA_DR52    =   308,\n    CV_SHMEDIA_DR54    =   310,\n    CV_SHMEDIA_DR56    =   312,\n    CV_SHMEDIA_DR58    =   314,\n    CV_SHMEDIA_DR60    =   316,\n    CV_SHMEDIA_DR62    =   318,\n\n    // Vector - 128 bit synonyms for 32bit fp register quads\n    //          subtract 384 to find first base single register\n    CV_SHMEDIA_FV0     =   512,\n    CV_SHMEDIA_FV4     =   516,\n    CV_SHMEDIA_FV8     =   520,\n    CV_SHMEDIA_FV12    =   524,\n    CV_SHMEDIA_FV16    =   528,\n    CV_SHMEDIA_FV20    =   532,\n    CV_SHMEDIA_FV24    =   536,\n    CV_SHMEDIA_FV28    =   540,\n    CV_SHMEDIA_FV32    =   544,\n    CV_SHMEDIA_FV36    =   548,\n    CV_SHMEDIA_FV40    =   552,\n    CV_SHMEDIA_FV44    =   556,\n    CV_SHMEDIA_FV48    =   560,\n    CV_SHMEDIA_FV52    =   564,\n    CV_SHMEDIA_FV56    =   568,\n    CV_SHMEDIA_FV60    =   572,\n\n    // Matrix - 512 bit synonyms for 16 adjacent 32bit fp registers\n    //          subtract 896 to find first base single register\n    CV_SHMEDIA_MTRX0   =   1024,\n    CV_SHMEDIA_MTRX16  =   1040,\n    CV_SHMEDIA_MTRX32  =   1056,\n    CV_SHMEDIA_MTRX48  =   1072,\n\n    // Control - Implementation defined 64bit control registers\n    CV_SHMEDIA_CR0     =   2000,\n    CV_SHMEDIA_CR1     =   2001,\n    CV_SHMEDIA_CR2     =   2002,\n    CV_SHMEDIA_CR3     =   2003,\n    CV_SHMEDIA_CR4     =   2004,\n    CV_SHMEDIA_CR5     =   2005,\n    CV_SHMEDIA_CR6     =   2006,\n    CV_SHMEDIA_CR7     =   2007,\n    CV_SHMEDIA_CR8     =   2008,\n    CV_SHMEDIA_CR9     =   2009,\n    CV_SHMEDIA_CR10    =   2010,\n    CV_SHMEDIA_CR11    =   2011,\n    CV_SHMEDIA_CR12    =   2012,\n    CV_SHMEDIA_CR13    =   2013,\n    CV_SHMEDIA_CR14    =   2014,\n    CV_SHMEDIA_CR15    =   2015,\n    CV_SHMEDIA_CR16    =   2016,\n    CV_SHMEDIA_CR17    =   2017,\n    CV_SHMEDIA_CR18    =   2018,\n    CV_SHMEDIA_CR19    =   2019,\n    CV_SHMEDIA_CR20    =   2020,\n    CV_SHMEDIA_CR21    =   2021,\n    CV_SHMEDIA_CR22    =   2022,\n    CV_SHMEDIA_CR23    =   2023,\n    CV_SHMEDIA_CR24    =   2024,\n    CV_SHMEDIA_CR25    =   2025,\n    CV_SHMEDIA_CR26    =   2026,\n    CV_SHMEDIA_CR27    =   2027,\n    CV_SHMEDIA_CR28    =   2028,\n    CV_SHMEDIA_CR29    =   2029,\n    CV_SHMEDIA_CR30    =   2030,\n    CV_SHMEDIA_CR31    =   2031,\n    CV_SHMEDIA_CR32    =   2032,\n    CV_SHMEDIA_CR33    =   2033,\n    CV_SHMEDIA_CR34    =   2034,\n    CV_SHMEDIA_CR35    =   2035,\n    CV_SHMEDIA_CR36    =   2036,\n    CV_SHMEDIA_CR37    =   2037,\n    CV_SHMEDIA_CR38    =   2038,\n    CV_SHMEDIA_CR39    =   2039,\n    CV_SHMEDIA_CR40    =   2040,\n    CV_SHMEDIA_CR41    =   2041,\n    CV_SHMEDIA_CR42    =   2042,\n    CV_SHMEDIA_CR43    =   2043,\n    CV_SHMEDIA_CR44    =   2044,\n    CV_SHMEDIA_CR45    =   2045,\n    CV_SHMEDIA_CR46    =   2046,\n    CV_SHMEDIA_CR47    =   2047,\n    CV_SHMEDIA_CR48    =   2048,\n    CV_SHMEDIA_CR49    =   2049,\n    CV_SHMEDIA_CR50    =   2050,\n    CV_SHMEDIA_CR51    =   2051,\n    CV_SHMEDIA_CR52    =   2052,\n    CV_SHMEDIA_CR53    =   2053,\n    CV_SHMEDIA_CR54    =   2054,\n    CV_SHMEDIA_CR55    =   2055,\n    CV_SHMEDIA_CR56    =   2056,\n    CV_SHMEDIA_CR57    =   2057,\n    CV_SHMEDIA_CR58    =   2058,\n    CV_SHMEDIA_CR59    =   2059,\n    CV_SHMEDIA_CR60    =   2060,\n    CV_SHMEDIA_CR61    =   2061,\n    CV_SHMEDIA_CR62    =   2062,\n    CV_SHMEDIA_CR63    =   2063,\n\n    CV_SHMEDIA_FPSCR   =   2064,\n\n    // Compact mode synonyms\n    CV_SHMEDIA_GBR     =   CV_SHMEDIA_R16,\n    CV_SHMEDIA_MACL    =   90, // synonym for lower 32bits of media R17\n    CV_SHMEDIA_MACH    =   91, // synonym for upper 32bits of media R17\n    CV_SHMEDIA_PR      =   CV_SHMEDIA_R18,\n    CV_SHMEDIA_T       =   92, // synonym for lowest bit of media R19\n    CV_SHMEDIA_FPUL    =   CV_SHMEDIA_FR32,\n    CV_SHMEDIA_PC      =   93,\n    CV_SHMEDIA_SR      =   CV_SHMEDIA_CR0,\n\n    //\n    // AMD64 registers\n    //\n\n    CV_AMD64_AL       =   1,\n    CV_AMD64_CL       =   2,\n    CV_AMD64_DL       =   3,\n    CV_AMD64_BL       =   4,\n    CV_AMD64_AH       =   5,\n    CV_AMD64_CH       =   6,\n    CV_AMD64_DH       =   7,\n    CV_AMD64_BH       =   8,\n    CV_AMD64_AX       =   9,\n    CV_AMD64_CX       =  10,\n    CV_AMD64_DX       =  11,\n    CV_AMD64_BX       =  12,\n    CV_AMD64_SP       =  13,\n    CV_AMD64_BP       =  14,\n    CV_AMD64_SI       =  15,\n    CV_AMD64_DI       =  16,\n    CV_AMD64_EAX      =  17,\n    CV_AMD64_ECX      =  18,\n    CV_AMD64_EDX      =  19,\n    CV_AMD64_EBX      =  20,\n    CV_AMD64_ESP      =  21,\n    CV_AMD64_EBP      =  22,\n    CV_AMD64_ESI      =  23,\n    CV_AMD64_EDI      =  24,\n    CV_AMD64_ES       =  25,\n    CV_AMD64_CS       =  26,\n    CV_AMD64_SS       =  27,\n    CV_AMD64_DS       =  28,\n    CV_AMD64_FS       =  29,\n    CV_AMD64_GS       =  30,\n    CV_AMD64_FLAGS    =  32,\n    CV_AMD64_RIP      =  33,\n    CV_AMD64_EFLAGS   =  34,\n\n    // Control registers\n    CV_AMD64_CR0      =  80,\n    CV_AMD64_CR1      =  81,\n    CV_AMD64_CR2      =  82,\n    CV_AMD64_CR3      =  83,\n    CV_AMD64_CR4      =  84,\n    CV_AMD64_CR8      =  88,\n\n    // Debug registers\n    CV_AMD64_DR0      =  90,\n    CV_AMD64_DR1      =  91,\n    CV_AMD64_DR2      =  92,\n    CV_AMD64_DR3      =  93,\n    CV_AMD64_DR4      =  94,\n    CV_AMD64_DR5      =  95,\n    CV_AMD64_DR6      =  96,\n    CV_AMD64_DR7      =  97,\n    CV_AMD64_DR8      =  98,\n    CV_AMD64_DR9      =  99,\n    CV_AMD64_DR10     =  100,\n    CV_AMD64_DR11     =  101,\n    CV_AMD64_DR12     =  102,\n    CV_AMD64_DR13     =  103,\n    CV_AMD64_DR14     =  104,\n    CV_AMD64_DR15     =  105,\n\n    CV_AMD64_GDTR     =  110,\n    CV_AMD64_GDTL     =  111,\n    CV_AMD64_IDTR     =  112,\n    CV_AMD64_IDTL     =  113,\n    CV_AMD64_LDTR     =  114,\n    CV_AMD64_TR       =  115,\n\n    CV_AMD64_ST0      =  128,\n    CV_AMD64_ST1      =  129,\n    CV_AMD64_ST2      =  130,\n    CV_AMD64_ST3      =  131,\n    CV_AMD64_ST4      =  132,\n    CV_AMD64_ST5      =  133,\n    CV_AMD64_ST6      =  134,\n    CV_AMD64_ST7      =  135,\n    CV_AMD64_CTRL     =  136,\n    CV_AMD64_STAT     =  137,\n    CV_AMD64_TAG      =  138,\n    CV_AMD64_FPIP     =  139,\n    CV_AMD64_FPCS     =  140,\n    CV_AMD64_FPDO     =  141,\n    CV_AMD64_FPDS     =  142,\n    CV_AMD64_ISEM     =  143,\n    CV_AMD64_FPEIP    =  144,\n    CV_AMD64_FPEDO    =  145,\n\n    CV_AMD64_MM0      =  146,\n    CV_AMD64_MM1      =  147,\n    CV_AMD64_MM2      =  148,\n    CV_AMD64_MM3      =  149,\n    CV_AMD64_MM4      =  150,\n    CV_AMD64_MM5      =  151,\n    CV_AMD64_MM6      =  152,\n    CV_AMD64_MM7      =  153,\n\n    CV_AMD64_XMM0     =  154,   // KATMAI registers\n    CV_AMD64_XMM1     =  155,\n    CV_AMD64_XMM2     =  156,\n    CV_AMD64_XMM3     =  157,\n    CV_AMD64_XMM4     =  158,\n    CV_AMD64_XMM5     =  159,\n    CV_AMD64_XMM6     =  160,\n    CV_AMD64_XMM7     =  161,\n\n    CV_AMD64_XMM0_0   =  162,   // KATMAI sub-registers\n    CV_AMD64_XMM0_1   =  163,\n    CV_AMD64_XMM0_2   =  164,\n    CV_AMD64_XMM0_3   =  165,\n    CV_AMD64_XMM1_0   =  166,\n    CV_AMD64_XMM1_1   =  167,\n    CV_AMD64_XMM1_2   =  168,\n    CV_AMD64_XMM1_3   =  169,\n    CV_AMD64_XMM2_0   =  170,\n    CV_AMD64_XMM2_1   =  171,\n    CV_AMD64_XMM2_2   =  172,\n    CV_AMD64_XMM2_3   =  173,\n    CV_AMD64_XMM3_0   =  174,\n    CV_AMD64_XMM3_1   =  175,\n    CV_AMD64_XMM3_2   =  176,\n    CV_AMD64_XMM3_3   =  177,\n    CV_AMD64_XMM4_0   =  178,\n    CV_AMD64_XMM4_1   =  179,\n    CV_AMD64_XMM4_2   =  180,\n    CV_AMD64_XMM4_3   =  181,\n    CV_AMD64_XMM5_0   =  182,\n    CV_AMD64_XMM5_1   =  183,\n    CV_AMD64_XMM5_2   =  184,\n    CV_AMD64_XMM5_3   =  185,\n    CV_AMD64_XMM6_0   =  186,\n    CV_AMD64_XMM6_1   =  187,\n    CV_AMD64_XMM6_2   =  188,\n    CV_AMD64_XMM6_3   =  189,\n    CV_AMD64_XMM7_0   =  190,\n    CV_AMD64_XMM7_1   =  191,\n    CV_AMD64_XMM7_2   =  192,\n    CV_AMD64_XMM7_3   =  193,\n\n    CV_AMD64_XMM0L    =  194,\n    CV_AMD64_XMM1L    =  195,\n    CV_AMD64_XMM2L    =  196,\n    CV_AMD64_XMM3L    =  197,\n    CV_AMD64_XMM4L    =  198,\n    CV_AMD64_XMM5L    =  199,\n    CV_AMD64_XMM6L    =  200,\n    CV_AMD64_XMM7L    =  201,\n\n    CV_AMD64_XMM0H    =  202,\n    CV_AMD64_XMM1H    =  203,\n    CV_AMD64_XMM2H    =  204,\n    CV_AMD64_XMM3H    =  205,\n    CV_AMD64_XMM4H    =  206,\n    CV_AMD64_XMM5H    =  207,\n    CV_AMD64_XMM6H    =  208,\n    CV_AMD64_XMM7H    =  209,\n\n    CV_AMD64_MXCSR    =  211,   // XMM status register\n\n    CV_AMD64_EMM0L    =  220,   // XMM sub-registers (WNI integer)\n    CV_AMD64_EMM1L    =  221,\n    CV_AMD64_EMM2L    =  222,\n    CV_AMD64_EMM3L    =  223,\n    CV_AMD64_EMM4L    =  224,\n    CV_AMD64_EMM5L    =  225,\n    CV_AMD64_EMM6L    =  226,\n    CV_AMD64_EMM7L    =  227,\n\n    CV_AMD64_EMM0H    =  228,\n    CV_AMD64_EMM1H    =  229,\n    CV_AMD64_EMM2H    =  230,\n    CV_AMD64_EMM3H    =  231,\n    CV_AMD64_EMM4H    =  232,\n    CV_AMD64_EMM5H    =  233,\n    CV_AMD64_EMM6H    =  234,\n    CV_AMD64_EMM7H    =  235,\n\n    // do not change the order of these regs, first one must be even too\n    CV_AMD64_MM00     =  236,\n    CV_AMD64_MM01     =  237,\n    CV_AMD64_MM10     =  238,\n    CV_AMD64_MM11     =  239,\n    CV_AMD64_MM20     =  240,\n    CV_AMD64_MM21     =  241,\n    CV_AMD64_MM30     =  242,\n    CV_AMD64_MM31     =  243,\n    CV_AMD64_MM40     =  244,\n    CV_AMD64_MM41     =  245,\n    CV_AMD64_MM50     =  246,\n    CV_AMD64_MM51     =  247,\n    CV_AMD64_MM60     =  248,\n    CV_AMD64_MM61     =  249,\n    CV_AMD64_MM70     =  250,\n    CV_AMD64_MM71     =  251,\n\n    // Extended KATMAI registers\n    CV_AMD64_XMM8     =  252,   // KATMAI registers\n    CV_AMD64_XMM9     =  253,\n    CV_AMD64_XMM10    =  254,\n    CV_AMD64_XMM11    =  255,\n    CV_AMD64_XMM12    =  256,\n    CV_AMD64_XMM13    =  257,\n    CV_AMD64_XMM14    =  258,\n    CV_AMD64_XMM15    =  259,\n\n    CV_AMD64_XMM8_0   =  260,   // KATMAI sub-registers\n    CV_AMD64_XMM8_1   =  261,\n    CV_AMD64_XMM8_2   =  262,\n    CV_AMD64_XMM8_3   =  263,\n    CV_AMD64_XMM9_0   =  264,\n    CV_AMD64_XMM9_1   =  265,\n    CV_AMD64_XMM9_2   =  266,\n    CV_AMD64_XMM9_3   =  267,\n    CV_AMD64_XMM10_0  =  268,\n    CV_AMD64_XMM10_1  =  269,\n    CV_AMD64_XMM10_2  =  270,\n    CV_AMD64_XMM10_3  =  271,\n    CV_AMD64_XMM11_0  =  272,\n    CV_AMD64_XMM11_1  =  273,\n    CV_AMD64_XMM11_2  =  274,\n    CV_AMD64_XMM11_3  =  275,\n    CV_AMD64_XMM12_0  =  276,\n    CV_AMD64_XMM12_1  =  277,\n    CV_AMD64_XMM12_2  =  278,\n    CV_AMD64_XMM12_3  =  279,\n    CV_AMD64_XMM13_0  =  280,\n    CV_AMD64_XMM13_1  =  281,\n    CV_AMD64_XMM13_2  =  282,\n    CV_AMD64_XMM13_3  =  283,\n    CV_AMD64_XMM14_0  =  284,\n    CV_AMD64_XMM14_1  =  285,\n    CV_AMD64_XMM14_2  =  286,\n    CV_AMD64_XMM14_3  =  287,\n    CV_AMD64_XMM15_0  =  288,\n    CV_AMD64_XMM15_1  =  289,\n    CV_AMD64_XMM15_2  =  290,\n    CV_AMD64_XMM15_3  =  291,\n\n    CV_AMD64_XMM8L    =  292,\n    CV_AMD64_XMM9L    =  293,\n    CV_AMD64_XMM10L   =  294,\n    CV_AMD64_XMM11L   =  295,\n    CV_AMD64_XMM12L   =  296,\n    CV_AMD64_XMM13L   =  297,\n    CV_AMD64_XMM14L   =  298,\n    CV_AMD64_XMM15L   =  299,\n\n    CV_AMD64_XMM8H    =  300,\n    CV_AMD64_XMM9H    =  301,\n    CV_AMD64_XMM10H   =  302,\n    CV_AMD64_XMM11H   =  303,\n    CV_AMD64_XMM12H   =  304,\n    CV_AMD64_XMM13H   =  305,\n    CV_AMD64_XMM14H   =  306,\n    CV_AMD64_XMM15H   =  307,\n\n    CV_AMD64_EMM8L    =  308,   // XMM sub-registers (WNI integer)\n    CV_AMD64_EMM9L    =  309,\n    CV_AMD64_EMM10L   =  310,\n    CV_AMD64_EMM11L   =  311,\n    CV_AMD64_EMM12L   =  312,\n    CV_AMD64_EMM13L   =  313,\n    CV_AMD64_EMM14L   =  314,\n    CV_AMD64_EMM15L   =  315,\n\n    CV_AMD64_EMM8H    =  316,\n    CV_AMD64_EMM9H    =  317,\n    CV_AMD64_EMM10H   =  318,\n    CV_AMD64_EMM11H   =  319,\n    CV_AMD64_EMM12H   =  320,\n    CV_AMD64_EMM13H   =  321,\n    CV_AMD64_EMM14H   =  322,\n    CV_AMD64_EMM15H   =  323,\n\n    // Low byte forms of some standard registers\n    CV_AMD64_SIL      =  324,\n    CV_AMD64_DIL      =  325,\n    CV_AMD64_BPL      =  326,\n    CV_AMD64_SPL      =  327,\n\n    // 64-bit regular registers\n    CV_AMD64_RAX      =  328,\n    CV_AMD64_RBX      =  329,\n    CV_AMD64_RCX      =  330,\n    CV_AMD64_RDX      =  331,\n    CV_AMD64_RSI      =  332,\n    CV_AMD64_RDI      =  333,\n    CV_AMD64_RBP      =  334,\n    CV_AMD64_RSP      =  335,\n\n    // 64-bit integer registers with 8-, 16-, and 32-bit forms (B, W, and D)\n    CV_AMD64_R8       =  336,\n    CV_AMD64_R9       =  337,\n    CV_AMD64_R10      =  338,\n    CV_AMD64_R11      =  339,\n    CV_AMD64_R12      =  340,\n    CV_AMD64_R13      =  341,\n    CV_AMD64_R14      =  342,\n    CV_AMD64_R15      =  343,\n\n    CV_AMD64_R8B      =  344,\n    CV_AMD64_R9B      =  345,\n    CV_AMD64_R10B     =  346,\n    CV_AMD64_R11B     =  347,\n    CV_AMD64_R12B     =  348,\n    CV_AMD64_R13B     =  349,\n    CV_AMD64_R14B     =  350,\n    CV_AMD64_R15B     =  351,\n\n    CV_AMD64_R8W      =  352,\n    CV_AMD64_R9W      =  353,\n    CV_AMD64_R10W     =  354,\n    CV_AMD64_R11W     =  355,\n    CV_AMD64_R12W     =  356,\n    CV_AMD64_R13W     =  357,\n    CV_AMD64_R14W     =  358,\n    CV_AMD64_R15W     =  359,\n\n    CV_AMD64_R8D      =  360,\n    CV_AMD64_R9D      =  361,\n    CV_AMD64_R10D     =  362,\n    CV_AMD64_R11D     =  363,\n    CV_AMD64_R12D     =  364,\n    CV_AMD64_R13D     =  365,\n    CV_AMD64_R14D     =  366,\n    CV_AMD64_R15D     =  367,\n\n    // AVX registers 256 bits\n    CV_AMD64_YMM0     =  368,\n    CV_AMD64_YMM1     =  369,\n    CV_AMD64_YMM2     =  370,\n    CV_AMD64_YMM3     =  371,\n    CV_AMD64_YMM4     =  372,\n    CV_AMD64_YMM5     =  373,\n    CV_AMD64_YMM6     =  374,\n    CV_AMD64_YMM7     =  375,\n    CV_AMD64_YMM8     =  376, \n    CV_AMD64_YMM9     =  377,\n    CV_AMD64_YMM10    =  378,\n    CV_AMD64_YMM11    =  379,\n    CV_AMD64_YMM12    =  380,\n    CV_AMD64_YMM13    =  381,\n    CV_AMD64_YMM14    =  382,\n    CV_AMD64_YMM15    =  383,\n\n    // AVX registers upper 128 bits\n    CV_AMD64_YMM0H    =  384,\n    CV_AMD64_YMM1H    =  385,\n    CV_AMD64_YMM2H    =  386,\n    CV_AMD64_YMM3H    =  387,\n    CV_AMD64_YMM4H    =  388,\n    CV_AMD64_YMM5H    =  389,\n    CV_AMD64_YMM6H    =  390,\n    CV_AMD64_YMM7H    =  391,\n    CV_AMD64_YMM8H    =  392, \n    CV_AMD64_YMM9H    =  393,\n    CV_AMD64_YMM10H   =  394,\n    CV_AMD64_YMM11H   =  395,\n    CV_AMD64_YMM12H   =  396,\n    CV_AMD64_YMM13H   =  397,\n    CV_AMD64_YMM14H   =  398,\n    CV_AMD64_YMM15H   =  399,\n\n    //Lower/upper 8 bytes of XMM registers.  Unlike CV_AMD64_XMM<regnum><H/L>, these\n    //values reprsesent the bit patterns of the registers as 64-bit integers, not\n    //the representation of these registers as a double.\n    CV_AMD64_XMM0IL    = 400,\n    CV_AMD64_XMM1IL    = 401,\n    CV_AMD64_XMM2IL    = 402,\n    CV_AMD64_XMM3IL    = 403,\n    CV_AMD64_XMM4IL    = 404,\n    CV_AMD64_XMM5IL    = 405,\n    CV_AMD64_XMM6IL    = 406,\n    CV_AMD64_XMM7IL    = 407,\n    CV_AMD64_XMM8IL    = 408,\n    CV_AMD64_XMM9IL    = 409,\n    CV_AMD64_XMM10IL    = 410,\n    CV_AMD64_XMM11IL    = 411,\n    CV_AMD64_XMM12IL    = 412,\n    CV_AMD64_XMM13IL    = 413,\n    CV_AMD64_XMM14IL    = 414,\n    CV_AMD64_XMM15IL    = 415,\n\n    CV_AMD64_XMM0IH    = 416,\n    CV_AMD64_XMM1IH    = 417,\n    CV_AMD64_XMM2IH    = 418,\n    CV_AMD64_XMM3IH    = 419,\n    CV_AMD64_XMM4IH    = 420,\n    CV_AMD64_XMM5IH    = 421,\n    CV_AMD64_XMM6IH    = 422,\n    CV_AMD64_XMM7IH    = 423,\n    CV_AMD64_XMM8IH    = 424,\n    CV_AMD64_XMM9IH    = 425,\n    CV_AMD64_XMM10IH    = 426,\n    CV_AMD64_XMM11IH    = 427,\n    CV_AMD64_XMM12IH    = 428,\n    CV_AMD64_XMM13IH    = 429,\n    CV_AMD64_XMM14IH    = 430,\n    CV_AMD64_XMM15IH    = 431,\n\n    CV_AMD64_YMM0I0    =  432,        // AVX integer registers\n    CV_AMD64_YMM0I1    =  433,\n    CV_AMD64_YMM0I2    =  434,\n    CV_AMD64_YMM0I3    =  435,\n    CV_AMD64_YMM1I0    =  436,\n    CV_AMD64_YMM1I1    =  437,\n    CV_AMD64_YMM1I2    =  438,\n    CV_AMD64_YMM1I3    =  439,\n    CV_AMD64_YMM2I0    =  440,\n    CV_AMD64_YMM2I1    =  441,\n    CV_AMD64_YMM2I2    =  442,\n    CV_AMD64_YMM2I3    =  443,\n    CV_AMD64_YMM3I0    =  444,\n    CV_AMD64_YMM3I1    =  445,\n    CV_AMD64_YMM3I2    =  446,\n    CV_AMD64_YMM3I3    =  447,\n    CV_AMD64_YMM4I0    =  448,\n    CV_AMD64_YMM4I1    =  449,\n    CV_AMD64_YMM4I2    =  450,\n    CV_AMD64_YMM4I3    =  451,\n    CV_AMD64_YMM5I0    =  452,\n    CV_AMD64_YMM5I1    =  453,\n    CV_AMD64_YMM5I2    =  454,\n    CV_AMD64_YMM5I3    =  455,\n    CV_AMD64_YMM6I0    =  456,\n    CV_AMD64_YMM6I1    =  457,\n    CV_AMD64_YMM6I2    =  458,\n    CV_AMD64_YMM6I3    =  459,\n    CV_AMD64_YMM7I0    =  460,\n    CV_AMD64_YMM7I1    =  461,\n    CV_AMD64_YMM7I2    =  462,\n    CV_AMD64_YMM7I3    =  463,\n    CV_AMD64_YMM8I0    =  464,\n    CV_AMD64_YMM8I1    =  465,\n    CV_AMD64_YMM8I2    =  466,\n    CV_AMD64_YMM8I3    =  467,\n    CV_AMD64_YMM9I0    =  468,\n    CV_AMD64_YMM9I1    =  469,\n    CV_AMD64_YMM9I2    =  470,\n    CV_AMD64_YMM9I3    =  471,\n    CV_AMD64_YMM10I0    =  472,\n    CV_AMD64_YMM10I1    =  473,\n    CV_AMD64_YMM10I2    =  474,\n    CV_AMD64_YMM10I3    =  475,\n    CV_AMD64_YMM11I0    =  476,\n    CV_AMD64_YMM11I1    =  477,\n    CV_AMD64_YMM11I2    =  478,\n    CV_AMD64_YMM11I3    =  479,\n    CV_AMD64_YMM12I0    =  480,\n    CV_AMD64_YMM12I1    =  481,\n    CV_AMD64_YMM12I2    =  482,\n    CV_AMD64_YMM12I3    =  483,\n    CV_AMD64_YMM13I0    =  484,\n    CV_AMD64_YMM13I1    =  485,\n    CV_AMD64_YMM13I2    =  486,\n    CV_AMD64_YMM13I3    =  487,\n    CV_AMD64_YMM14I0    =  488,\n    CV_AMD64_YMM14I1    =  489,\n    CV_AMD64_YMM14I2    =  490,\n    CV_AMD64_YMM14I3    =  491,\n    CV_AMD64_YMM15I0    =  492,\n    CV_AMD64_YMM15I1    =  493,\n    CV_AMD64_YMM15I2    =  494,\n    CV_AMD64_YMM15I3    =  495,\n\n    CV_AMD64_YMM0F0    =  496,        // AVX floating-point single precise registers\n    CV_AMD64_YMM0F1    =  497,\n    CV_AMD64_YMM0F2    =  498,\n    CV_AMD64_YMM0F3    =  499,\n    CV_AMD64_YMM0F4    =  500,\n    CV_AMD64_YMM0F5    =  501,\n    CV_AMD64_YMM0F6    =  502,\n    CV_AMD64_YMM0F7    =  503,\n    CV_AMD64_YMM1F0    =  504,\n    CV_AMD64_YMM1F1    =  505,\n    CV_AMD64_YMM1F2    =  506,\n    CV_AMD64_YMM1F3    =  507,\n    CV_AMD64_YMM1F4    =  508,\n    CV_AMD64_YMM1F5    =  509,\n    CV_AMD64_YMM1F6    =  510,\n    CV_AMD64_YMM1F7    =  511,\n    CV_AMD64_YMM2F0    =  512,\n    CV_AMD64_YMM2F1    =  513,\n    CV_AMD64_YMM2F2    =  514,\n    CV_AMD64_YMM2F3    =  515,\n    CV_AMD64_YMM2F4    =  516,\n    CV_AMD64_YMM2F5    =  517,\n    CV_AMD64_YMM2F6    =  518,\n    CV_AMD64_YMM2F7    =  519,\n    CV_AMD64_YMM3F0    =  520,\n    CV_AMD64_YMM3F1    =  521,\n    CV_AMD64_YMM3F2    =  522,\n    CV_AMD64_YMM3F3    =  523,\n    CV_AMD64_YMM3F4    =  524,\n    CV_AMD64_YMM3F5    =  525,\n    CV_AMD64_YMM3F6    =  526,\n    CV_AMD64_YMM3F7    =  527,\n    CV_AMD64_YMM4F0    =  528,\n    CV_AMD64_YMM4F1    =  529,\n    CV_AMD64_YMM4F2    =  530,\n    CV_AMD64_YMM4F3    =  531,\n    CV_AMD64_YMM4F4    =  532,\n    CV_AMD64_YMM4F5    =  533,\n    CV_AMD64_YMM4F6    =  534,\n    CV_AMD64_YMM4F7    =  535,\n    CV_AMD64_YMM5F0    =  536,\n    CV_AMD64_YMM5F1    =  537,\n    CV_AMD64_YMM5F2    =  538,\n    CV_AMD64_YMM5F3    =  539,\n    CV_AMD64_YMM5F4    =  540,\n    CV_AMD64_YMM5F5    =  541,\n    CV_AMD64_YMM5F6    =  542,\n    CV_AMD64_YMM5F7    =  543,\n    CV_AMD64_YMM6F0    =  544,\n    CV_AMD64_YMM6F1    =  545,\n    CV_AMD64_YMM6F2    =  546,\n    CV_AMD64_YMM6F3    =  547,\n    CV_AMD64_YMM6F4    =  548,\n    CV_AMD64_YMM6F5    =  549,\n    CV_AMD64_YMM6F6    =  550,\n    CV_AMD64_YMM6F7    =  551,\n    CV_AMD64_YMM7F0    =  552,\n    CV_AMD64_YMM7F1    =  553,\n    CV_AMD64_YMM7F2    =  554,\n    CV_AMD64_YMM7F3    =  555,\n    CV_AMD64_YMM7F4    =  556,\n    CV_AMD64_YMM7F5    =  557,\n    CV_AMD64_YMM7F6    =  558,\n    CV_AMD64_YMM7F7    =  559,\n    CV_AMD64_YMM8F0    =  560,\n    CV_AMD64_YMM8F1    =  561,\n    CV_AMD64_YMM8F2    =  562,\n    CV_AMD64_YMM8F3    =  563,\n    CV_AMD64_YMM8F4    =  564,\n    CV_AMD64_YMM8F5    =  565,\n    CV_AMD64_YMM8F6    =  566,\n    CV_AMD64_YMM8F7    =  567,\n    CV_AMD64_YMM9F0    =  568,\n    CV_AMD64_YMM9F1    =  569,\n    CV_AMD64_YMM9F2    =  570,\n    CV_AMD64_YMM9F3    =  571,\n    CV_AMD64_YMM9F4    =  572,\n    CV_AMD64_YMM9F5    =  573,\n    CV_AMD64_YMM9F6    =  574,\n    CV_AMD64_YMM9F7    =  575,\n    CV_AMD64_YMM10F0    =  576,\n    CV_AMD64_YMM10F1    =  577,\n    CV_AMD64_YMM10F2    =  578,\n    CV_AMD64_YMM10F3    =  579,\n    CV_AMD64_YMM10F4    =  580,\n    CV_AMD64_YMM10F5    =  581,\n    CV_AMD64_YMM10F6    =  582,\n    CV_AMD64_YMM10F7    =  583,\n    CV_AMD64_YMM11F0    =  584,\n    CV_AMD64_YMM11F1    =  585,\n    CV_AMD64_YMM11F2    =  586,\n    CV_AMD64_YMM11F3    =  587,\n    CV_AMD64_YMM11F4    =  588,\n    CV_AMD64_YMM11F5    =  589,\n    CV_AMD64_YMM11F6    =  590,\n    CV_AMD64_YMM11F7    =  591,\n    CV_AMD64_YMM12F0    =  592,\n    CV_AMD64_YMM12F1    =  593,\n    CV_AMD64_YMM12F2    =  594,\n    CV_AMD64_YMM12F3    =  595,\n    CV_AMD64_YMM12F4    =  596,\n    CV_AMD64_YMM12F5    =  597,\n    CV_AMD64_YMM12F6    =  598,\n    CV_AMD64_YMM12F7    =  599,\n    CV_AMD64_YMM13F0    =  600,\n    CV_AMD64_YMM13F1    =  601,\n    CV_AMD64_YMM13F2    =  602,\n    CV_AMD64_YMM13F3    =  603,\n    CV_AMD64_YMM13F4    =  604,\n    CV_AMD64_YMM13F5    =  605,\n    CV_AMD64_YMM13F6    =  606,\n    CV_AMD64_YMM13F7    =  607,\n    CV_AMD64_YMM14F0    =  608,\n    CV_AMD64_YMM14F1    =  609,\n    CV_AMD64_YMM14F2    =  610,\n    CV_AMD64_YMM14F3    =  611,\n    CV_AMD64_YMM14F4    =  612,\n    CV_AMD64_YMM14F5    =  613,\n    CV_AMD64_YMM14F6    =  614,\n    CV_AMD64_YMM14F7    =  615,\n    CV_AMD64_YMM15F0    =  616,\n    CV_AMD64_YMM15F1    =  617,\n    CV_AMD64_YMM15F2    =  618,\n    CV_AMD64_YMM15F3    =  619,\n    CV_AMD64_YMM15F4    =  620,\n    CV_AMD64_YMM15F5    =  621,\n    CV_AMD64_YMM15F6    =  622,\n    CV_AMD64_YMM15F7    =  623,\n    \n    CV_AMD64_YMM0D0    =  624,        // AVX floating-point double precise registers\n    CV_AMD64_YMM0D1    =  625,\n    CV_AMD64_YMM0D2    =  626,\n    CV_AMD64_YMM0D3    =  627,\n    CV_AMD64_YMM1D0    =  628,\n    CV_AMD64_YMM1D1    =  629,\n    CV_AMD64_YMM1D2    =  630,\n    CV_AMD64_YMM1D3    =  631,\n    CV_AMD64_YMM2D0    =  632,\n    CV_AMD64_YMM2D1    =  633,\n    CV_AMD64_YMM2D2    =  634,\n    CV_AMD64_YMM2D3    =  635,\n    CV_AMD64_YMM3D0    =  636,\n    CV_AMD64_YMM3D1    =  637,\n    CV_AMD64_YMM3D2    =  638,\n    CV_AMD64_YMM3D3    =  639,\n    CV_AMD64_YMM4D0    =  640,\n    CV_AMD64_YMM4D1    =  641,\n    CV_AMD64_YMM4D2    =  642,\n    CV_AMD64_YMM4D3    =  643,\n    CV_AMD64_YMM5D0    =  644,\n    CV_AMD64_YMM5D1    =  645,\n    CV_AMD64_YMM5D2    =  646,\n    CV_AMD64_YMM5D3    =  647,\n    CV_AMD64_YMM6D0    =  648,\n    CV_AMD64_YMM6D1    =  649,\n    CV_AMD64_YMM6D2    =  650,\n    CV_AMD64_YMM6D3    =  651,\n    CV_AMD64_YMM7D0    =  652,\n    CV_AMD64_YMM7D1    =  653,\n    CV_AMD64_YMM7D2    =  654,\n    CV_AMD64_YMM7D3    =  655,\n    CV_AMD64_YMM8D0    =  656,\n    CV_AMD64_YMM8D1    =  657,\n    CV_AMD64_YMM8D2    =  658,\n    CV_AMD64_YMM8D3    =  659,\n    CV_AMD64_YMM9D0    =  660,\n    CV_AMD64_YMM9D1    =  661,\n    CV_AMD64_YMM9D2    =  662,\n    CV_AMD64_YMM9D3    =  663,\n    CV_AMD64_YMM10D0    =  664,\n    CV_AMD64_YMM10D1    =  665,\n    CV_AMD64_YMM10D2    =  666,\n    CV_AMD64_YMM10D3    =  667,\n    CV_AMD64_YMM11D0    =  668,\n    CV_AMD64_YMM11D1    =  669,\n    CV_AMD64_YMM11D2    =  670,\n    CV_AMD64_YMM11D3    =  671,\n    CV_AMD64_YMM12D0    =  672,\n    CV_AMD64_YMM12D1    =  673,\n    CV_AMD64_YMM12D2    =  674,\n    CV_AMD64_YMM12D3    =  675,\n    CV_AMD64_YMM13D0    =  676,\n    CV_AMD64_YMM13D1    =  677,\n    CV_AMD64_YMM13D2    =  678,\n    CV_AMD64_YMM13D3    =  679,\n    CV_AMD64_YMM14D0    =  680,\n    CV_AMD64_YMM14D1    =  681,\n    CV_AMD64_YMM14D2    =  682,\n    CV_AMD64_YMM14D3    =  683,\n    CV_AMD64_YMM15D0    =  684,\n    CV_AMD64_YMM15D1    =  685,\n    CV_AMD64_YMM15D2    =  686,\n    CV_AMD64_YMM15D3    =  687,\n\n    CV_AMD64_BND0       =  688,        // AMD64 MPX bounds registers\n    CV_AMD64_BND1       =  689,\n    CV_AMD64_BND2       =  690,\n    CV_AMD64_BND3       =  691,\n    CV_AMD64_BNDCFGU    =  692,\n    CV_AMD64_BNDSTATUS  =  693,\n\n    CV_AMD64_XMM16      =  694,     // AVX-512 registers\n    CV_AMD64_XMM17      =  695,\n    CV_AMD64_XMM18      =  696,\n    CV_AMD64_XMM19      =  697,\n    CV_AMD64_XMM20      =  698,\n    CV_AMD64_XMM21      =  699,\n    CV_AMD64_XMM22      =  700,\n    CV_AMD64_XMM23      =  701,\n    CV_AMD64_XMM24      =  702,\n    CV_AMD64_XMM25      =  703,\n    CV_AMD64_XMM26      =  704,\n    CV_AMD64_XMM27      =  705,\n    CV_AMD64_XMM28      =  706,\n    CV_AMD64_XMM29      =  707,\n    CV_AMD64_XMM30      =  708,\n    CV_AMD64_XMM31      =  709,\n\n    CV_AMD64_YMM16      =  710,\n    CV_AMD64_YMM17      =  711,\n    CV_AMD64_YMM18      =  712,\n    CV_AMD64_YMM19      =  713,\n    CV_AMD64_YMM20      =  714,\n    CV_AMD64_YMM21      =  715,\n    CV_AMD64_YMM22      =  716,\n    CV_AMD64_YMM23      =  717,\n    CV_AMD64_YMM24      =  718,\n    CV_AMD64_YMM25      =  719,\n    CV_AMD64_YMM26      =  720,\n    CV_AMD64_YMM27      =  721,\n    CV_AMD64_YMM28      =  722,\n    CV_AMD64_YMM29      =  723,\n    CV_AMD64_YMM30      =  724,\n    CV_AMD64_YMM31      =  725,\n\n    CV_AMD64_ZMM0       =  726,\n    CV_AMD64_ZMM1       =  727,\n    CV_AMD64_ZMM2       =  728,\n    CV_AMD64_ZMM3       =  729,\n    CV_AMD64_ZMM4       =  730,\n    CV_AMD64_ZMM5       =  731,\n    CV_AMD64_ZMM6       =  732,\n    CV_AMD64_ZMM7       =  733,\n    CV_AMD64_ZMM8       =  734,\n    CV_AMD64_ZMM9       =  735,\n    CV_AMD64_ZMM10      =  736,\n    CV_AMD64_ZMM11      =  737,\n    CV_AMD64_ZMM12      =  738,\n    CV_AMD64_ZMM13      =  739,\n    CV_AMD64_ZMM14      =  740,\n    CV_AMD64_ZMM15      =  741,\n    CV_AMD64_ZMM16      =  742,\n    CV_AMD64_ZMM17      =  743,\n    CV_AMD64_ZMM18      =  744,\n    CV_AMD64_ZMM19      =  745,\n    CV_AMD64_ZMM20      =  746,\n    CV_AMD64_ZMM21      =  747,\n    CV_AMD64_ZMM22      =  748,\n    CV_AMD64_ZMM23      =  749,\n    CV_AMD64_ZMM24      =  750,\n    CV_AMD64_ZMM25      =  751,\n    CV_AMD64_ZMM26      =  752,\n    CV_AMD64_ZMM27      =  753,\n    CV_AMD64_ZMM28      =  754,\n    CV_AMD64_ZMM29      =  755,\n    CV_AMD64_ZMM30      =  756,\n    CV_AMD64_ZMM31      =  757,\n\n    CV_AMD64_K0         =  758,\n    CV_AMD64_K1         =  759,\n    CV_AMD64_K2         =  760,\n    CV_AMD64_K3         =  761,\n    CV_AMD64_K4         =  762,\n    CV_AMD64_K5         =  763,\n    CV_AMD64_K6         =  764,\n    CV_AMD64_K7         =  765,\n\n    CV_AMD64_ZMM0H      =  766,     // upper 256 bits of the first 16 AMD64 AVX-512 registers\n    CV_AMD64_ZMM1H      =  767,\n    CV_AMD64_ZMM2H      =  768,\n    CV_AMD64_ZMM3H      =  769,\n    CV_AMD64_ZMM4H      =  770,\n    CV_AMD64_ZMM5H      =  771,\n    CV_AMD64_ZMM6H      =  772,\n    CV_AMD64_ZMM7H      =  773,\n    CV_AMD64_ZMM8H      =  774,\n    CV_AMD64_ZMM9H      =  775,\n    CV_AMD64_ZMM10H     =  776,\n    CV_AMD64_ZMM11H     =  777,\n    CV_AMD64_ZMM12H     =  778,\n    CV_AMD64_ZMM13H     =  779,\n    CV_AMD64_ZMM14H     =  780,\n    CV_AMD64_ZMM15H     =  781,\n\n    CV_AMD64_XMM16L     =  782,     // extended KATMAI registers\n    CV_AMD64_XMM17L     =  783,\n    CV_AMD64_XMM18L     =  784,\n    CV_AMD64_XMM19L     =  785,\n    CV_AMD64_XMM20L     =  786,\n    CV_AMD64_XMM21L     =  787,\n    CV_AMD64_XMM22L     =  788,\n    CV_AMD64_XMM23L     =  789,\n    CV_AMD64_XMM24L     =  790,\n    CV_AMD64_XMM25L     =  791,\n    CV_AMD64_XMM26L     =  792,\n    CV_AMD64_XMM27L     =  793,\n    CV_AMD64_XMM28L     =  794,\n    CV_AMD64_XMM29L     =  795,\n    CV_AMD64_XMM30L     =  796,\n    CV_AMD64_XMM31L     =  797,\n\n    CV_AMD64_XMM16_0    =  798,\n    CV_AMD64_XMM17_0    =  799,\n    CV_AMD64_XMM18_0    =  800,\n    CV_AMD64_XMM19_0    =  801,\n    CV_AMD64_XMM20_0    =  802,\n    CV_AMD64_XMM21_0    =  803,\n    CV_AMD64_XMM22_0    =  804,\n    CV_AMD64_XMM23_0    =  805,\n    CV_AMD64_XMM24_0    =  806,\n    CV_AMD64_XMM25_0    =  807,\n    CV_AMD64_XMM26_0    =  808,\n    CV_AMD64_XMM27_0    =  809,\n    CV_AMD64_XMM28_0    =  810,\n    CV_AMD64_XMM29_0    =  811,\n    CV_AMD64_XMM30_0    =  812,\n    CV_AMD64_XMM31_0    =  813,\n\n    CV_AMD64_XMM16H     =  814,\n    CV_AMD64_XMM17H     =  815,\n    CV_AMD64_XMM18H     =  816,\n    CV_AMD64_XMM19H     =  817,\n    CV_AMD64_XMM20H     =  818,\n    CV_AMD64_XMM21H     =  819,\n    CV_AMD64_XMM22H     =  820,\n    CV_AMD64_XMM23H     =  821,\n    CV_AMD64_XMM24H     =  822,\n    CV_AMD64_XMM25H     =  823,\n    CV_AMD64_XMM26H     =  824,\n    CV_AMD64_XMM27H     =  825,\n    CV_AMD64_XMM28H     =  826,\n    CV_AMD64_XMM29H     =  827,\n    CV_AMD64_XMM30H     =  828,\n    CV_AMD64_XMM31H     =  829,\n\n    CV_AMD64_EMM16H     =  830,\n    CV_AMD64_EMM17H     =  831,\n    CV_AMD64_EMM18H     =  832,\n    CV_AMD64_EMM19H     =  833,\n    CV_AMD64_EMM20H     =  834,\n    CV_AMD64_EMM21H     =  835,\n    CV_AMD64_EMM22H     =  836,\n    CV_AMD64_EMM23H     =  837,\n    CV_AMD64_EMM24H     =  838,\n    CV_AMD64_EMM25H     =  839,\n    CV_AMD64_EMM26H     =  840,\n    CV_AMD64_EMM27H     =  841,\n    CV_AMD64_EMM28H     =  842,\n    CV_AMD64_EMM29H     =  843,\n    CV_AMD64_EMM30H     =  844,\n    CV_AMD64_EMM31H     =  845,\n\n    CV_AMD64_SSP        =  846,      // CET- Shadow Stack Pointer\n\n    CV_AMD64_TMM0       =  847,      // AMX tile registers\n    CV_AMD64_TMM1       =  848,\n    CV_AMD64_TMM2       =  849,\n    CV_AMD64_TMM3       =  850,\n    CV_AMD64_TMM4       =  851,\n    CV_AMD64_TMM5       =  852,\n    CV_AMD64_TMM6       =  853,\n    CV_AMD64_TMM7       =  854,\n    CV_AMD64_TILECFG    =  855,      // AMX tile cfg register\n\n    // Note:  Next set of platform registers need to go into a new enum...\n    // this one is above 44K now.\n\n} CV_HREG_e;\n\ntypedef enum CV_HLSLREG_e\n{\n    CV_HLSLREG_TEMP                                = 0,  \n    CV_HLSLREG_INPUT                               = 1,  \n    CV_HLSLREG_OUTPUT                              = 2,  \n    CV_HLSLREG_INDEXABLE_TEMP                      = 3,  \n    CV_HLSLREG_IMMEDIATE32                         = 4,  \n    CV_HLSLREG_IMMEDIATE64                         = 5,  \n    CV_HLSLREG_SAMPLER                             = 6,  \n    CV_HLSLREG_RESOURCE                            = 7,  \n    CV_HLSLREG_CONSTANT_BUFFER                     = 8,  \n    CV_HLSLREG_IMMEDIATE_CONSTANT_BUFFER           = 9,  \n    CV_HLSLREG_LABEL                               = 10, \n    CV_HLSLREG_INPUT_PRIMITIVEID                   = 11, \n    CV_HLSLREG_OUTPUT_DEPTH                        = 12, \n    CV_HLSLREG_NULL                                = 13, \n    CV_HLSLREG_RASTERIZER                          = 14, \n    CV_HLSLREG_OUTPUT_COVERAGE_MASK                = 15, \n    CV_HLSLREG_STREAM                              = 16, \n    CV_HLSLREG_FUNCTION_BODY                       = 17, \n    CV_HLSLREG_FUNCTION_TABLE                      = 18, \n    CV_HLSLREG_INTERFACE                           = 19, \n    CV_HLSLREG_FUNCTION_INPUT                      = 20, \n    CV_HLSLREG_FUNCTION_OUTPUT                     = 21, \n    CV_HLSLREG_OUTPUT_CONTROL_POINT_ID             = 22, \n    CV_HLSLREG_INPUT_FORK_INSTANCE_ID              = 23, \n    CV_HLSLREG_INPUT_JOIN_INSTANCE_ID              = 24, \n    CV_HLSLREG_INPUT_CONTROL_POINT                 = 25, \n    CV_HLSLREG_OUTPUT_CONTROL_POINT                = 26, \n    CV_HLSLREG_INPUT_PATCH_CONSTANT                = 27, \n    CV_HLSLREG_INPUT_DOMAIN_POINT                  = 28, \n    CV_HLSLREG_THIS_POINTER                        = 29, \n    CV_HLSLREG_UNORDERED_ACCESS_VIEW               = 30, \n    CV_HLSLREG_THREAD_GROUP_SHARED_MEMORY          = 31, \n    CV_HLSLREG_INPUT_THREAD_ID                     = 32, \n    CV_HLSLREG_INPUT_THREAD_GROUP_ID               = 33, \n    CV_HLSLREG_INPUT_THREAD_ID_IN_GROUP            = 34, \n    CV_HLSLREG_INPUT_COVERAGE_MASK                 = 35, \n    CV_HLSLREG_INPUT_THREAD_ID_IN_GROUP_FLATTENED  = 36,\n    CV_HLSLREG_INPUT_GS_INSTANCE_ID                = 37, \n    CV_HLSLREG_OUTPUT_DEPTH_GREATER_EQUAL          = 38, \n    CV_HLSLREG_OUTPUT_DEPTH_LESS_EQUAL             = 39, \n    CV_HLSLREG_CYCLE_COUNTER                       = 40, \n} CV_HLSLREG_e;\n\nenum StackFrameTypeEnum\n{\n    FrameTypeFPO,                   // Frame pointer omitted, FPO info available\n    FrameTypeTrap,                  // Kernel Trap frame\n    FrameTypeTSS,                   // Kernel Trap frame\n    FrameTypeStandard,              // Standard EBP stackframe\n    FrameTypeFrameData,             // Frame pointer omitted, FrameData info available\n\n    FrameTypeUnknown = -1,          // Frame which does not have any debug info\n};\n\nenum MemoryTypeEnum\n{\n    MemTypeCode,                    // Read only code memory\n    MemTypeData,                    // Read only data/stack memory\n    MemTypeStack,                   // Read only stack memory\n    MemTypeCodeOnHeap,              // Read only memory for code generated on heap by runtime\n\n    MemTypeAny = -1,\n};\n\ntypedef enum CV_HLSLMemorySpace_e\n{\n    // HLSL specific memory spaces\n\n    CV_HLSL_MEMSPACE_DATA         = 0x00,\n    CV_HLSL_MEMSPACE_SAMPLER      = 0x01,\n    CV_HLSL_MEMSPACE_RESOURCE     = 0x02,\n    CV_HLSL_MEMSPACE_RWRESOURCE   = 0x03,\n\n    CV_HLSL_MEMSPACE_MAX          = 0x0F,\n} CV_HLSLMemorySpace_e;\n\nenum\n{\n    NAMEHASH_BUILD_START,\n    NAMEHASH_BUILD_PAUSE,\n    NAMEHASH_BUILD_RESUME,\n    NAMEHASH_BUILD_COMPLETE,\n    NAMEHASH_BUILD_ERROR,\n    NAMEHASH_BUILD_OOM = NAMEHASH_BUILD_ERROR,\n    NAMEHASH_BUILD_FAIL_TO_OPEN_MOD,\n};\n\ntypedef enum CV_CoroutineKind_e\n{\n    CV_COROUTINEKIND_NONE,      // Not a coroutine\n    CV_COROUTINEKIND_PRIMARY,   // The original coroutine function\n    CV_COROUTINEKIND_INIT,      // Initialization function, sets up the coroutine frame\n    CV_COROUTINEKIND_RESUME,    // Resume function, contains the coroutine body code\n    CV_COROUTINEKIND_DESTROY    // Destroy function, tears down the coroutine frame\n} CV_CoroutineKind_e;\n\ntypedef enum CV_AssociationKind_e\n{\n    CV_ASSOCIATIONKIND_NONE,         // No associated symbol\n    CV_ASSOCIATIONKIND_COROUTINE     // Associated symbol is the primary coroutine function\n} CV_AssociationKind_e;\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/dia/dia2.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0628 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n#pragma warning( disable: 4049 )  /* more than 64k source lines */\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 475\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __dia2_h__\n#define __dia2_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __IDiaLoadCallback_FWD_DEFINED__\n#define __IDiaLoadCallback_FWD_DEFINED__\ntypedef interface IDiaLoadCallback IDiaLoadCallback;\n\n#endif \t/* __IDiaLoadCallback_FWD_DEFINED__ */\n\n\n#ifndef __IDiaLoadCallback2_FWD_DEFINED__\n#define __IDiaLoadCallback2_FWD_DEFINED__\ntypedef interface IDiaLoadCallback2 IDiaLoadCallback2;\n\n#endif \t/* __IDiaLoadCallback2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaReadExeAtOffsetCallback_FWD_DEFINED__\n#define __IDiaReadExeAtOffsetCallback_FWD_DEFINED__\ntypedef interface IDiaReadExeAtOffsetCallback IDiaReadExeAtOffsetCallback;\n\n#endif \t/* __IDiaReadExeAtOffsetCallback_FWD_DEFINED__ */\n\n\n#ifndef __IDiaReadExeAtRVACallback_FWD_DEFINED__\n#define __IDiaReadExeAtRVACallback_FWD_DEFINED__\ntypedef interface IDiaReadExeAtRVACallback IDiaReadExeAtRVACallback;\n\n#endif \t/* __IDiaReadExeAtRVACallback_FWD_DEFINED__ */\n\n\n#ifndef __IDiaDataSource_FWD_DEFINED__\n#define __IDiaDataSource_FWD_DEFINED__\ntypedef interface IDiaDataSource IDiaDataSource;\n\n#endif \t/* __IDiaDataSource_FWD_DEFINED__ */\n\n\n#ifndef __IDiaDataSourceEx_FWD_DEFINED__\n#define __IDiaDataSourceEx_FWD_DEFINED__\ntypedef interface IDiaDataSourceEx IDiaDataSourceEx;\n\n#endif \t/* __IDiaDataSourceEx_FWD_DEFINED__ */\n\n\n#ifndef __IDiaDataSourceEx2_FWD_DEFINED__\n#define __IDiaDataSourceEx2_FWD_DEFINED__\ntypedef interface IDiaDataSourceEx2 IDiaDataSourceEx2;\n\n#endif \t/* __IDiaDataSourceEx2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbols_FWD_DEFINED__\n#define __IDiaEnumSymbols_FWD_DEFINED__\ntypedef interface IDiaEnumSymbols IDiaEnumSymbols;\n\n#endif \t/* __IDiaEnumSymbols_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr_FWD_DEFINED__\n#define __IDiaEnumSymbolsByAddr_FWD_DEFINED__\ntypedef interface IDiaEnumSymbolsByAddr IDiaEnumSymbolsByAddr;\n\n#endif \t/* __IDiaEnumSymbolsByAddr_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr2_FWD_DEFINED__\n#define __IDiaEnumSymbolsByAddr2_FWD_DEFINED__\ntypedef interface IDiaEnumSymbolsByAddr2 IDiaEnumSymbolsByAddr2;\n\n#endif \t/* __IDiaEnumSymbolsByAddr2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceFiles_FWD_DEFINED__\n#define __IDiaEnumSourceFiles_FWD_DEFINED__\ntypedef interface IDiaEnumSourceFiles IDiaEnumSourceFiles;\n\n#endif \t/* __IDiaEnumSourceFiles_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumInputAssemblyFiles_FWD_DEFINED__\n#define __IDiaEnumInputAssemblyFiles_FWD_DEFINED__\ntypedef interface IDiaEnumInputAssemblyFiles IDiaEnumInputAssemblyFiles;\n\n#endif \t/* __IDiaEnumInputAssemblyFiles_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumLineNumbers_FWD_DEFINED__\n#define __IDiaEnumLineNumbers_FWD_DEFINED__\ntypedef interface IDiaEnumLineNumbers IDiaEnumLineNumbers;\n\n#endif \t/* __IDiaEnumLineNumbers_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumInjectedSources_FWD_DEFINED__\n#define __IDiaEnumInjectedSources_FWD_DEFINED__\ntypedef interface IDiaEnumInjectedSources IDiaEnumInjectedSources;\n\n#endif \t/* __IDiaEnumInjectedSources_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSegments_FWD_DEFINED__\n#define __IDiaEnumSegments_FWD_DEFINED__\ntypedef interface IDiaEnumSegments IDiaEnumSegments;\n\n#endif \t/* __IDiaEnumSegments_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSectionContribs_FWD_DEFINED__\n#define __IDiaEnumSectionContribs_FWD_DEFINED__\ntypedef interface IDiaEnumSectionContribs IDiaEnumSectionContribs;\n\n#endif \t/* __IDiaEnumSectionContribs_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumFrameData_FWD_DEFINED__\n#define __IDiaEnumFrameData_FWD_DEFINED__\ntypedef interface IDiaEnumFrameData IDiaEnumFrameData;\n\n#endif \t/* __IDiaEnumFrameData_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumDebugStreamData_FWD_DEFINED__\n#define __IDiaEnumDebugStreamData_FWD_DEFINED__\ntypedef interface IDiaEnumDebugStreamData IDiaEnumDebugStreamData;\n\n#endif \t/* __IDiaEnumDebugStreamData_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumDebugStreams_FWD_DEFINED__\n#define __IDiaEnumDebugStreams_FWD_DEFINED__\ntypedef interface IDiaEnumDebugStreams IDiaEnumDebugStreams;\n\n#endif \t/* __IDiaEnumDebugStreams_FWD_DEFINED__ */\n\n\n#ifndef __IDiaAddressMap_FWD_DEFINED__\n#define __IDiaAddressMap_FWD_DEFINED__\ntypedef interface IDiaAddressMap IDiaAddressMap;\n\n#endif \t/* __IDiaAddressMap_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSession_FWD_DEFINED__\n#define __IDiaSession_FWD_DEFINED__\ntypedef interface IDiaSession IDiaSession;\n\n#endif \t/* __IDiaSession_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSessionEx_FWD_DEFINED__\n#define __IDiaSessionEx_FWD_DEFINED__\ntypedef interface IDiaSessionEx IDiaSessionEx;\n\n#endif \t/* __IDiaSessionEx_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol_FWD_DEFINED__\n#define __IDiaSymbol_FWD_DEFINED__\ntypedef interface IDiaSymbol IDiaSymbol;\n\n#endif \t/* __IDiaSymbol_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol2_FWD_DEFINED__\n#define __IDiaSymbol2_FWD_DEFINED__\ntypedef interface IDiaSymbol2 IDiaSymbol2;\n\n#endif \t/* __IDiaSymbol2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol3_FWD_DEFINED__\n#define __IDiaSymbol3_FWD_DEFINED__\ntypedef interface IDiaSymbol3 IDiaSymbol3;\n\n#endif \t/* __IDiaSymbol3_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol4_FWD_DEFINED__\n#define __IDiaSymbol4_FWD_DEFINED__\ntypedef interface IDiaSymbol4 IDiaSymbol4;\n\n#endif \t/* __IDiaSymbol4_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol5_FWD_DEFINED__\n#define __IDiaSymbol5_FWD_DEFINED__\ntypedef interface IDiaSymbol5 IDiaSymbol5;\n\n#endif \t/* __IDiaSymbol5_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol6_FWD_DEFINED__\n#define __IDiaSymbol6_FWD_DEFINED__\ntypedef interface IDiaSymbol6 IDiaSymbol6;\n\n#endif \t/* __IDiaSymbol6_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol7_FWD_DEFINED__\n#define __IDiaSymbol7_FWD_DEFINED__\ntypedef interface IDiaSymbol7 IDiaSymbol7;\n\n#endif \t/* __IDiaSymbol7_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol8_FWD_DEFINED__\n#define __IDiaSymbol8_FWD_DEFINED__\ntypedef interface IDiaSymbol8 IDiaSymbol8;\n\n#endif \t/* __IDiaSymbol8_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol9_FWD_DEFINED__\n#define __IDiaSymbol9_FWD_DEFINED__\ntypedef interface IDiaSymbol9 IDiaSymbol9;\n\n#endif \t/* __IDiaSymbol9_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol10_FWD_DEFINED__\n#define __IDiaSymbol10_FWD_DEFINED__\ntypedef interface IDiaSymbol10 IDiaSymbol10;\n\n#endif \t/* __IDiaSymbol10_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol11_FWD_DEFINED__\n#define __IDiaSymbol11_FWD_DEFINED__\ntypedef interface IDiaSymbol11 IDiaSymbol11;\n\n#endif \t/* __IDiaSymbol11_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSourceFile_FWD_DEFINED__\n#define __IDiaSourceFile_FWD_DEFINED__\ntypedef interface IDiaSourceFile IDiaSourceFile;\n\n#endif \t/* __IDiaSourceFile_FWD_DEFINED__ */\n\n\n#ifndef __IDiaInputAssemblyFile_FWD_DEFINED__\n#define __IDiaInputAssemblyFile_FWD_DEFINED__\ntypedef interface IDiaInputAssemblyFile IDiaInputAssemblyFile;\n\n#endif \t/* __IDiaInputAssemblyFile_FWD_DEFINED__ */\n\n\n#ifndef __IDiaLineNumber_FWD_DEFINED__\n#define __IDiaLineNumber_FWD_DEFINED__\ntypedef interface IDiaLineNumber IDiaLineNumber;\n\n#endif \t/* __IDiaLineNumber_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSectionContrib_FWD_DEFINED__\n#define __IDiaSectionContrib_FWD_DEFINED__\ntypedef interface IDiaSectionContrib IDiaSectionContrib;\n\n#endif \t/* __IDiaSectionContrib_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSegment_FWD_DEFINED__\n#define __IDiaSegment_FWD_DEFINED__\ntypedef interface IDiaSegment IDiaSegment;\n\n#endif \t/* __IDiaSegment_FWD_DEFINED__ */\n\n\n#ifndef __IDiaInjectedSource_FWD_DEFINED__\n#define __IDiaInjectedSource_FWD_DEFINED__\ntypedef interface IDiaInjectedSource IDiaInjectedSource;\n\n#endif \t/* __IDiaInjectedSource_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackWalkFrame_FWD_DEFINED__\n#define __IDiaStackWalkFrame_FWD_DEFINED__\ntypedef interface IDiaStackWalkFrame IDiaStackWalkFrame;\n\n#endif \t/* __IDiaStackWalkFrame_FWD_DEFINED__ */\n\n\n#ifndef __IDiaFrameData_FWD_DEFINED__\n#define __IDiaFrameData_FWD_DEFINED__\ntypedef interface IDiaFrameData IDiaFrameData;\n\n#endif \t/* __IDiaFrameData_FWD_DEFINED__ */\n\n\n#ifndef __IDiaImageData_FWD_DEFINED__\n#define __IDiaImageData_FWD_DEFINED__\ntypedef interface IDiaImageData IDiaImageData;\n\n#endif \t/* __IDiaImageData_FWD_DEFINED__ */\n\n\n#ifndef __IDiaTable_FWD_DEFINED__\n#define __IDiaTable_FWD_DEFINED__\ntypedef interface IDiaTable IDiaTable;\n\n#endif \t/* __IDiaTable_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumTables_FWD_DEFINED__\n#define __IDiaEnumTables_FWD_DEFINED__\ntypedef interface IDiaEnumTables IDiaEnumTables;\n\n#endif \t/* __IDiaEnumTables_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceLink_FWD_DEFINED__\n#define __IDiaEnumSourceLink_FWD_DEFINED__\ntypedef interface IDiaEnumSourceLink IDiaEnumSourceLink;\n\n#endif \t/* __IDiaEnumSourceLink_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceLink2_FWD_DEFINED__\n#define __IDiaEnumSourceLink2_FWD_DEFINED__\ntypedef interface IDiaEnumSourceLink2 IDiaEnumSourceLink2;\n\n#endif \t/* __IDiaEnumSourceLink2_FWD_DEFINED__ */\n\n\n#ifndef __DiaSource_FWD_DEFINED__\n#define __DiaSource_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class DiaSource DiaSource;\n#else\ntypedef struct DiaSource DiaSource;\n#endif /* __cplusplus */\n\n#endif \t/* __DiaSource_FWD_DEFINED__ */\n\n\n#ifndef __DiaSourceAlt_FWD_DEFINED__\n#define __DiaSourceAlt_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class DiaSourceAlt DiaSourceAlt;\n#else\ntypedef struct DiaSourceAlt DiaSourceAlt;\n#endif /* __cplusplus */\n\n#endif \t/* __DiaSourceAlt_FWD_DEFINED__ */\n\n\n#ifndef __DiaStackWalker_FWD_DEFINED__\n#define __DiaStackWalker_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class DiaStackWalker DiaStackWalker;\n#else\ntypedef struct DiaStackWalker DiaStackWalker;\n#endif /* __cplusplus */\n\n#endif \t/* __DiaStackWalker_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSectionContrib_FWD_DEFINED__\n#define __IDiaSectionContrib_FWD_DEFINED__\ntypedef interface IDiaSectionContrib IDiaSectionContrib;\n\n#endif \t/* __IDiaSectionContrib_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSectionContribs_FWD_DEFINED__\n#define __IDiaEnumSectionContribs_FWD_DEFINED__\ntypedef interface IDiaEnumSectionContribs IDiaEnumSectionContribs;\n\n#endif \t/* __IDiaEnumSectionContribs_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol_FWD_DEFINED__\n#define __IDiaSymbol_FWD_DEFINED__\ntypedef interface IDiaSymbol IDiaSymbol;\n\n#endif \t/* __IDiaSymbol_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol2_FWD_DEFINED__\n#define __IDiaSymbol2_FWD_DEFINED__\ntypedef interface IDiaSymbol2 IDiaSymbol2;\n\n#endif \t/* __IDiaSymbol2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol3_FWD_DEFINED__\n#define __IDiaSymbol3_FWD_DEFINED__\ntypedef interface IDiaSymbol3 IDiaSymbol3;\n\n#endif \t/* __IDiaSymbol3_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol4_FWD_DEFINED__\n#define __IDiaSymbol4_FWD_DEFINED__\ntypedef interface IDiaSymbol4 IDiaSymbol4;\n\n#endif \t/* __IDiaSymbol4_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol5_FWD_DEFINED__\n#define __IDiaSymbol5_FWD_DEFINED__\ntypedef interface IDiaSymbol5 IDiaSymbol5;\n\n#endif \t/* __IDiaSymbol5_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol6_FWD_DEFINED__\n#define __IDiaSymbol6_FWD_DEFINED__\ntypedef interface IDiaSymbol6 IDiaSymbol6;\n\n#endif \t/* __IDiaSymbol6_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol7_FWD_DEFINED__\n#define __IDiaSymbol7_FWD_DEFINED__\ntypedef interface IDiaSymbol7 IDiaSymbol7;\n\n#endif \t/* __IDiaSymbol7_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol8_FWD_DEFINED__\n#define __IDiaSymbol8_FWD_DEFINED__\ntypedef interface IDiaSymbol8 IDiaSymbol8;\n\n#endif \t/* __IDiaSymbol8_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol9_FWD_DEFINED__\n#define __IDiaSymbol9_FWD_DEFINED__\ntypedef interface IDiaSymbol9 IDiaSymbol9;\n\n#endif \t/* __IDiaSymbol9_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol10_FWD_DEFINED__\n#define __IDiaSymbol10_FWD_DEFINED__\ntypedef interface IDiaSymbol10 IDiaSymbol10;\n\n#endif \t/* __IDiaSymbol10_FWD_DEFINED__ */\n\n\n#ifndef __IDiaSymbol11_FWD_DEFINED__\n#define __IDiaSymbol11_FWD_DEFINED__\ntypedef interface IDiaSymbol11 IDiaSymbol11;\n\n#endif \t/* __IDiaSymbol11_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr_FWD_DEFINED__\n#define __IDiaEnumSymbolsByAddr_FWD_DEFINED__\ntypedef interface IDiaEnumSymbolsByAddr IDiaEnumSymbolsByAddr;\n\n#endif \t/* __IDiaEnumSymbolsByAddr_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr2_FWD_DEFINED__\n#define __IDiaEnumSymbolsByAddr2_FWD_DEFINED__\ntypedef interface IDiaEnumSymbolsByAddr2 IDiaEnumSymbolsByAddr2;\n\n#endif \t/* __IDiaEnumSymbolsByAddr2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaPropertyStorage_FWD_DEFINED__\n#define __IDiaPropertyStorage_FWD_DEFINED__\ntypedef interface IDiaPropertyStorage IDiaPropertyStorage;\n\n#endif \t/* __IDiaPropertyStorage_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackFrame_FWD_DEFINED__\n#define __IDiaStackFrame_FWD_DEFINED__\ntypedef interface IDiaStackFrame IDiaStackFrame;\n\n#endif \t/* __IDiaStackFrame_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumStackFrames_FWD_DEFINED__\n#define __IDiaEnumStackFrames_FWD_DEFINED__\ntypedef interface IDiaEnumStackFrames IDiaEnumStackFrames;\n\n#endif \t/* __IDiaEnumStackFrames_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackWalkHelper_FWD_DEFINED__\n#define __IDiaStackWalkHelper_FWD_DEFINED__\ntypedef interface IDiaStackWalkHelper IDiaStackWalkHelper;\n\n#endif \t/* __IDiaStackWalkHelper_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackWalker_FWD_DEFINED__\n#define __IDiaStackWalker_FWD_DEFINED__\ntypedef interface IDiaStackWalker IDiaStackWalker;\n\n#endif \t/* __IDiaStackWalker_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackWalkHelper2_FWD_DEFINED__\n#define __IDiaStackWalkHelper2_FWD_DEFINED__\ntypedef interface IDiaStackWalkHelper2 IDiaStackWalkHelper2;\n\n#endif \t/* __IDiaStackWalkHelper2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaStackWalker2_FWD_DEFINED__\n#define __IDiaStackWalker2_FWD_DEFINED__\ntypedef interface IDiaStackWalker2 IDiaStackWalker2;\n\n#endif \t/* __IDiaStackWalker2_FWD_DEFINED__ */\n\n\n#ifndef __IDiaEnumNamedStreams_FWD_DEFINED__\n#define __IDiaEnumNamedStreams_FWD_DEFINED__\ntypedef interface IDiaEnumNamedStreams IDiaEnumNamedStreams;\n\n#endif \t/* __IDiaEnumNamedStreams_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"objidl.h\"\n#include \"oaidl.h\"\n#include \"propidl.h\"\n#include \"cvconst.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_dia2_0000_0000 */\n/* [local] */ \n\n\nenum NameSearchOptions\n    {\n        nsNone\t= 0,\n        nsfCaseSensitive\t= 0x1,\n        nsfCaseInsensitive\t= 0x2,\n        nsfFNameExt\t= 0x4,\n        nsfRegularExpression\t= 0x8,\n        nsfUndecoratedName\t= 0x10,\n        nsCaseSensitive\t= nsfCaseSensitive,\n        nsCaseInsensitive\t= nsfCaseInsensitive,\n        nsFNameExt\t= ( nsfCaseInsensitive | nsfFNameExt ) ,\n        nsRegularExpression\t= ( nsfRegularExpression | nsfCaseSensitive ) ,\n        nsCaseInRegularExpression\t= ( nsfRegularExpression | nsfCaseInsensitive ) \n    } ;\n\nenum __MIDL___MIDL_itf_dia2_0000_0000_0001\n    {\n        E_PDB_OK\t= ( HRESULT  )(( ( ( ( unsigned long  )1 << 31 )  | ( ( unsigned long  )( LONG  )0x6d << 16 )  )  | ( unsigned long  )1 ) ),\n        E_PDB_USAGE\t= ( E_PDB_OK + 1 ) ,\n        E_PDB_OUT_OF_MEMORY\t= ( E_PDB_USAGE + 1 ) ,\n        E_PDB_FILE_SYSTEM\t= ( E_PDB_OUT_OF_MEMORY + 1 ) ,\n        E_PDB_NOT_FOUND\t= ( E_PDB_FILE_SYSTEM + 1 ) ,\n        E_PDB_INVALID_SIG\t= ( E_PDB_NOT_FOUND + 1 ) ,\n        E_PDB_INVALID_AGE\t= ( E_PDB_INVALID_SIG + 1 ) ,\n        E_PDB_PRECOMP_REQUIRED\t= ( E_PDB_INVALID_AGE + 1 ) ,\n        E_PDB_OUT_OF_TI\t= ( E_PDB_PRECOMP_REQUIRED + 1 ) ,\n        E_PDB_NOT_IMPLEMENTED\t= ( E_PDB_OUT_OF_TI + 1 ) ,\n        E_PDB_V1_PDB\t= ( E_PDB_NOT_IMPLEMENTED + 1 ) ,\n        E_PDB_FORMAT\t= ( E_PDB_V1_PDB + 1 ) ,\n        E_PDB_LIMIT\t= ( E_PDB_FORMAT + 1 ) ,\n        E_PDB_CORRUPT\t= ( E_PDB_LIMIT + 1 ) ,\n        E_PDB_TI16\t= ( E_PDB_CORRUPT + 1 ) ,\n        E_PDB_ACCESS_DENIED\t= ( E_PDB_TI16 + 1 ) ,\n        E_PDB_ILLEGAL_TYPE_EDIT\t= ( E_PDB_ACCESS_DENIED + 1 ) ,\n        E_PDB_INVALID_EXECUTABLE\t= ( E_PDB_ILLEGAL_TYPE_EDIT + 1 ) ,\n        E_PDB_DBG_NOT_FOUND\t= ( E_PDB_INVALID_EXECUTABLE + 1 ) ,\n        E_PDB_NO_DEBUG_INFO\t= ( E_PDB_DBG_NOT_FOUND + 1 ) ,\n        E_PDB_INVALID_EXE_TIMESTAMP\t= ( E_PDB_NO_DEBUG_INFO + 1 ) ,\n        E_PDB_RESERVED\t= ( E_PDB_INVALID_EXE_TIMESTAMP + 1 ) ,\n        E_PDB_DEBUG_INFO_NOT_IN_PDB\t= ( E_PDB_RESERVED + 1 ) ,\n        E_PDB_SYMSRV_BAD_CACHE_PATH\t= ( E_PDB_DEBUG_INFO_NOT_IN_PDB + 1 ) ,\n        E_PDB_SYMSRV_CACHE_FULL\t= ( E_PDB_SYMSRV_BAD_CACHE_PATH + 1 ) ,\n        E_PDB_OBJECT_DISPOSED\t= ( E_PDB_SYMSRV_CACHE_FULL + 1 ) ,\n        E_PDB_MAX\t= ( E_PDB_OBJECT_DISPOSED + 1 ) ,\n        E_PDB_IFC_RECORD_MISSING_DESIGNATOR\t= ( E_PDB_MAX + 1 ) ,\n        E_PDB_IFC_RECORD_MISSING_REFERENCE\t= ( E_PDB_IFC_RECORD_MISSING_DESIGNATOR + 1 ) ,\n        E_PDB_IFC_FAILED_TO_LOAD\t= ( E_PDB_IFC_RECORD_MISSING_REFERENCE + 1 ) ,\n        E_PDB_IFC_FAILED_TO_LOAD_MISMATCH_HASH\t= ( E_PDB_IFC_FAILED_TO_LOAD + 1 ) ,\n        E_PDB_IFC_DEBUG_STREAM_FAILED_OPEN\t= ( E_PDB_IFC_FAILED_TO_LOAD_MISMATCH_HASH + 1 ) ,\n        E_PDB_IFC_DEBUG_STREAM_EMPTY\t= ( E_PDB_IFC_DEBUG_STREAM_FAILED_OPEN + 1 ) ,\n        E_PDB_IFC_DEBUG_STREAM_HASH_MISMATCH\t= ( E_PDB_IFC_DEBUG_STREAM_EMPTY + 1 ) ,\n        E_DIA_INPROLOG\t= ( HRESULT  )(( ( ( ( unsigned long  )1 << 31 )  | ( ( unsigned long  )( LONG  )0x6d << 16 )  )  | ( unsigned long  )100 ) ),\n        E_DIA_SYNTAX\t= ( E_DIA_INPROLOG + 1 ) ,\n        E_DIA_FRAME_ACCESS\t= ( E_DIA_SYNTAX + 1 ) ,\n        E_DIA_VALUE\t= ( E_DIA_FRAME_ACCESS + 1 ) ,\n        E_DIA_COFF_ACCESS\t= ( DWORD  )(( ( ( ( DWORD  )1 << 31 )  | ( ( DWORD  )( LONG  )0x6d << 16 )  )  | ( DWORD  )200 ) ),\n        E_DIA_COMP_PDB_ACCESS\t= ( E_DIA_COFF_ACCESS + 1 ) \n    } ;\ntypedef void ( __cdecl *PfnPDBDebugDirV )( \n    BOOL __MIDL____MIDL_itf_dia2_0000_00000000,\n    void *__MIDL____MIDL_itf_dia2_0000_00000001);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0000_v0_0_s_ifspec;\n\n#ifndef __IDiaLoadCallback_INTERFACE_DEFINED__\n#define __IDiaLoadCallback_INTERFACE_DEFINED__\n\n/* interface IDiaLoadCallback */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaLoadCallback;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"C32ADB82-73F4-421b-95D5-A4706EDF5DBE\")\n    IDiaLoadCallback : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE NotifyDebugDir( \n            /* [in] */ BOOL fExecutable,\n            /* [in] */ DWORD cbData,\n            /* [size_is][in] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE NotifyOpenDBG( \n            /* [in] */ LPCOLESTR dbgPath,\n            /* [in] */ HRESULT resultCode) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE NotifyOpenPDB( \n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ HRESULT resultCode) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RestrictRegistryAccess( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RestrictSymbolServerAccess( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaLoadCallbackVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaLoadCallback * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaLoadCallback * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaLoadCallback * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyDebugDir )( \n            IDiaLoadCallback * This,\n            /* [in] */ BOOL fExecutable,\n            /* [in] */ DWORD cbData,\n            /* [size_is][in] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyOpenDBG )( \n            IDiaLoadCallback * This,\n            /* [in] */ LPCOLESTR dbgPath,\n            /* [in] */ HRESULT resultCode);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyOpenPDB )( \n            IDiaLoadCallback * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ HRESULT resultCode);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictRegistryAccess )( \n            IDiaLoadCallback * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictSymbolServerAccess )( \n            IDiaLoadCallback * This);\n        \n        END_INTERFACE\n    } IDiaLoadCallbackVtbl;\n\n    interface IDiaLoadCallback\n    {\n        CONST_VTBL struct IDiaLoadCallbackVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaLoadCallback_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaLoadCallback_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaLoadCallback_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaLoadCallback_NotifyDebugDir(This,fExecutable,cbData,pbData)\t\\\n    ( (This)->lpVtbl -> NotifyDebugDir(This,fExecutable,cbData,pbData) ) \n\n#define IDiaLoadCallback_NotifyOpenDBG(This,dbgPath,resultCode)\t\\\n    ( (This)->lpVtbl -> NotifyOpenDBG(This,dbgPath,resultCode) ) \n\n#define IDiaLoadCallback_NotifyOpenPDB(This,pdbPath,resultCode)\t\\\n    ( (This)->lpVtbl -> NotifyOpenPDB(This,pdbPath,resultCode) ) \n\n#define IDiaLoadCallback_RestrictRegistryAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictRegistryAccess(This) ) \n\n#define IDiaLoadCallback_RestrictSymbolServerAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictSymbolServerAccess(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaLoadCallback_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaLoadCallback2_INTERFACE_DEFINED__\n#define __IDiaLoadCallback2_INTERFACE_DEFINED__\n\n/* interface IDiaLoadCallback2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaLoadCallback2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"4688a074-5a4d-4486-aea8-7b90711d9f7c\")\n    IDiaLoadCallback2 : public IDiaLoadCallback\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE RestrictOriginalPathAccess( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RestrictReferencePathAccess( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RestrictDBGAccess( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RestrictSystemRootAccess( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaLoadCallback2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaLoadCallback2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaLoadCallback2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyDebugDir )( \n            IDiaLoadCallback2 * This,\n            /* [in] */ BOOL fExecutable,\n            /* [in] */ DWORD cbData,\n            /* [size_is][in] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyOpenDBG )( \n            IDiaLoadCallback2 * This,\n            /* [in] */ LPCOLESTR dbgPath,\n            /* [in] */ HRESULT resultCode);\n        \n        HRESULT ( STDMETHODCALLTYPE *NotifyOpenPDB )( \n            IDiaLoadCallback2 * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ HRESULT resultCode);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictRegistryAccess )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictSymbolServerAccess )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictOriginalPathAccess )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictReferencePathAccess )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictDBGAccess )( \n            IDiaLoadCallback2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *RestrictSystemRootAccess )( \n            IDiaLoadCallback2 * This);\n        \n        END_INTERFACE\n    } IDiaLoadCallback2Vtbl;\n\n    interface IDiaLoadCallback2\n    {\n        CONST_VTBL struct IDiaLoadCallback2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaLoadCallback2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaLoadCallback2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaLoadCallback2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaLoadCallback2_NotifyDebugDir(This,fExecutable,cbData,pbData)\t\\\n    ( (This)->lpVtbl -> NotifyDebugDir(This,fExecutable,cbData,pbData) ) \n\n#define IDiaLoadCallback2_NotifyOpenDBG(This,dbgPath,resultCode)\t\\\n    ( (This)->lpVtbl -> NotifyOpenDBG(This,dbgPath,resultCode) ) \n\n#define IDiaLoadCallback2_NotifyOpenPDB(This,pdbPath,resultCode)\t\\\n    ( (This)->lpVtbl -> NotifyOpenPDB(This,pdbPath,resultCode) ) \n\n#define IDiaLoadCallback2_RestrictRegistryAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictRegistryAccess(This) ) \n\n#define IDiaLoadCallback2_RestrictSymbolServerAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictSymbolServerAccess(This) ) \n\n\n#define IDiaLoadCallback2_RestrictOriginalPathAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictOriginalPathAccess(This) ) \n\n#define IDiaLoadCallback2_RestrictReferencePathAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictReferencePathAccess(This) ) \n\n#define IDiaLoadCallback2_RestrictDBGAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictDBGAccess(This) ) \n\n#define IDiaLoadCallback2_RestrictSystemRootAccess(This)\t\\\n    ( (This)->lpVtbl -> RestrictSystemRootAccess(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaLoadCallback2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaReadExeAtOffsetCallback_INTERFACE_DEFINED__\n#define __IDiaReadExeAtOffsetCallback_INTERFACE_DEFINED__\n\n/* interface IDiaReadExeAtOffsetCallback */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaReadExeAtOffsetCallback;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"587A461C-B80B-4f54-9194-5032589A6319\")\n    IDiaReadExeAtOffsetCallback : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE ReadExecutableAt( \n            /* [in] */ DWORDLONG fileOffset,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaReadExeAtOffsetCallbackVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaReadExeAtOffsetCallback * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaReadExeAtOffsetCallback * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaReadExeAtOffsetCallback * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadExecutableAt )( \n            IDiaReadExeAtOffsetCallback * This,\n            /* [in] */ DWORDLONG fileOffset,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        END_INTERFACE\n    } IDiaReadExeAtOffsetCallbackVtbl;\n\n    interface IDiaReadExeAtOffsetCallback\n    {\n        CONST_VTBL struct IDiaReadExeAtOffsetCallbackVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaReadExeAtOffsetCallback_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaReadExeAtOffsetCallback_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaReadExeAtOffsetCallback_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaReadExeAtOffsetCallback_ReadExecutableAt(This,fileOffset,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> ReadExecutableAt(This,fileOffset,cbData,pcbData,pbData) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaReadExeAtOffsetCallback_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaReadExeAtRVACallback_INTERFACE_DEFINED__\n#define __IDiaReadExeAtRVACallback_INTERFACE_DEFINED__\n\n/* interface IDiaReadExeAtRVACallback */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaReadExeAtRVACallback;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"8E3F80CA-7517-432a-BA07-285134AAEA8E\")\n    IDiaReadExeAtRVACallback : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE ReadExecutableAtRVA( \n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaReadExeAtRVACallbackVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaReadExeAtRVACallback * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaReadExeAtRVACallback * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaReadExeAtRVACallback * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadExecutableAtRVA )( \n            IDiaReadExeAtRVACallback * This,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        END_INTERFACE\n    } IDiaReadExeAtRVACallbackVtbl;\n\n    interface IDiaReadExeAtRVACallback\n    {\n        CONST_VTBL struct IDiaReadExeAtRVACallbackVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaReadExeAtRVACallback_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaReadExeAtRVACallback_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaReadExeAtRVACallback_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaReadExeAtRVACallback_ReadExecutableAtRVA(This,relativeVirtualAddress,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> ReadExecutableAtRVA(This,relativeVirtualAddress,cbData,pcbData,pbData) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaReadExeAtRVACallback_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaDataSource_INTERFACE_DEFINED__\n#define __IDiaDataSource_INTERFACE_DEFINED__\n\n/* interface IDiaDataSource */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaDataSource;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"79F1BB5F-B66E-48e5-B6A9-1545C323CA3D\")\n    IDiaDataSource : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lastError( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataFromPdb( \n            /* [in] */ LPCOLESTR pdbPath) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadAndValidateDataFromPdb( \n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataForExe( \n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataFromIStream( \n            /* [in] */ IStream *pIStream) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE openSession( \n            /* [out] */ IDiaSession **ppSession) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataFromCodeViewInfo( \n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD cbCvInfo,\n            /* [size_is][in] */ BYTE *pbCvInfo,\n            /* [in] */ IUnknown *pCallback) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataFromMiscInfo( \n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD timeStampExe,\n            /* [in] */ DWORD timeStampDbg,\n            /* [in] */ DWORD sizeOfExe,\n            /* [in] */ DWORD cbMiscInfo,\n            /* [size_is][in] */ BYTE *pbMiscInfo,\n            /* [in] */ IUnknown *pCallback) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaDataSourceVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaDataSource * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaDataSource * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaDataSource * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lastError )( \n            IDiaDataSource * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromPdb )( \n            IDiaDataSource * This,\n            /* [in] */ LPCOLESTR pdbPath);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadAndValidateDataFromPdb )( \n            IDiaDataSource * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataForExe )( \n            IDiaDataSource * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromIStream )( \n            IDiaDataSource * This,\n            /* [in] */ IStream *pIStream);\n        \n        HRESULT ( STDMETHODCALLTYPE *openSession )( \n            IDiaDataSource * This,\n            /* [out] */ IDiaSession **ppSession);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromCodeViewInfo )( \n            IDiaDataSource * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD cbCvInfo,\n            /* [size_is][in] */ BYTE *pbCvInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromMiscInfo )( \n            IDiaDataSource * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD timeStampExe,\n            /* [in] */ DWORD timeStampDbg,\n            /* [in] */ DWORD sizeOfExe,\n            /* [in] */ DWORD cbMiscInfo,\n            /* [size_is][in] */ BYTE *pbMiscInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        END_INTERFACE\n    } IDiaDataSourceVtbl;\n\n    interface IDiaDataSource\n    {\n        CONST_VTBL struct IDiaDataSourceVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaDataSource_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaDataSource_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaDataSource_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaDataSource_get_lastError(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lastError(This,pRetVal) ) \n\n#define IDiaDataSource_loadDataFromPdb(This,pdbPath)\t\\\n    ( (This)->lpVtbl -> loadDataFromPdb(This,pdbPath) ) \n\n#define IDiaDataSource_loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age)\t\\\n    ( (This)->lpVtbl -> loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age) ) \n\n#define IDiaDataSource_loadDataForExe(This,executable,searchPath,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataForExe(This,executable,searchPath,pCallback) ) \n\n#define IDiaDataSource_loadDataFromIStream(This,pIStream)\t\\\n    ( (This)->lpVtbl -> loadDataFromIStream(This,pIStream) ) \n\n#define IDiaDataSource_openSession(This,ppSession)\t\\\n    ( (This)->lpVtbl -> openSession(This,ppSession) ) \n\n#define IDiaDataSource_loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback) ) \n\n#define IDiaDataSource_loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaDataSource_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_dia2_0000_0005 */\n/* [local] */ \n\ntypedef HRESULT ( __cdecl *PFNMINIPDBERRORCALLBACK2 )( \n    void *pvContext,\n    DWORD dwErrorCode,\n    const LPCOLESTR szObjOrPdb,\n    const LPCOLESTR szLib);\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0005_v0_0_s_ifspec;\n\n#ifndef __IDiaDataSourceEx_INTERFACE_DEFINED__\n#define __IDiaDataSourceEx_INTERFACE_DEFINED__\n\n/* interface IDiaDataSourceEx */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaDataSourceEx;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"1a21eb69-962a-4bc4-8bd3-681797d38b23\")\n    IDiaDataSourceEx : public IDiaDataSource\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE loadDataFromPdbEx( \n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ BOOL fPdbPrefetching) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadAndValidateDataFromPdbEx( \n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [in] */ BOOL fPdbPrefetching) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataForExeEx( \n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback,\n            /* [in] */ BOOL fPdbPrefetching) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE loadDataFromIStreamEx( \n            /* [in] */ IStream *pIStream,\n            /* [in] */ BOOL fPdbPrefetching) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getStreamSize( \n            /* [in] */ LPCOLESTR stream,\n            /* [out] */ ULONGLONG *pcb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getStreamRawData( \n            /* [in] */ LPCOLESTR stream,\n            /* [in] */ ULONGLONG cbOffset,\n            /* [in] */ ULONGLONG cbRead,\n            /* [out] */ ULONGLONG *pcbRead,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE setPfnMiniPDBErrorCallback2( \n            /* [in] */ void *pvContext,\n            /* [in] */ PFNMINIPDBERRORCALLBACK2 pfn) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ValidatePdb( \n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ const GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [out] */ BOOL *pfStripped) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaDataSourceExVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaDataSourceEx * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaDataSourceEx * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaDataSourceEx * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lastError )( \n            IDiaDataSourceEx * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromPdb )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR pdbPath);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadAndValidateDataFromPdb )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataForExe )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromIStream )( \n            IDiaDataSourceEx * This,\n            /* [in] */ IStream *pIStream);\n        \n        HRESULT ( STDMETHODCALLTYPE *openSession )( \n            IDiaDataSourceEx * This,\n            /* [out] */ IDiaSession **ppSession);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromCodeViewInfo )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD cbCvInfo,\n            /* [size_is][in] */ BYTE *pbCvInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromMiscInfo )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD timeStampExe,\n            /* [in] */ DWORD timeStampDbg,\n            /* [in] */ DWORD sizeOfExe,\n            /* [in] */ DWORD cbMiscInfo,\n            /* [size_is][in] */ BYTE *pbMiscInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromPdbEx )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadAndValidateDataFromPdbEx )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataForExeEx )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromIStreamEx )( \n            IDiaDataSourceEx * This,\n            /* [in] */ IStream *pIStream,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *getStreamSize )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR stream,\n            /* [out] */ ULONGLONG *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getStreamRawData )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR stream,\n            /* [in] */ ULONGLONG cbOffset,\n            /* [in] */ ULONGLONG cbRead,\n            /* [out] */ ULONGLONG *pcbRead,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *setPfnMiniPDBErrorCallback2 )( \n            IDiaDataSourceEx * This,\n            /* [in] */ void *pvContext,\n            /* [in] */ PFNMINIPDBERRORCALLBACK2 pfn);\n        \n        HRESULT ( STDMETHODCALLTYPE *ValidatePdb )( \n            IDiaDataSourceEx * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ const GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [out] */ BOOL *pfStripped);\n        \n        END_INTERFACE\n    } IDiaDataSourceExVtbl;\n\n    interface IDiaDataSourceEx\n    {\n        CONST_VTBL struct IDiaDataSourceExVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaDataSourceEx_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaDataSourceEx_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaDataSourceEx_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaDataSourceEx_get_lastError(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lastError(This,pRetVal) ) \n\n#define IDiaDataSourceEx_loadDataFromPdb(This,pdbPath)\t\\\n    ( (This)->lpVtbl -> loadDataFromPdb(This,pdbPath) ) \n\n#define IDiaDataSourceEx_loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age)\t\\\n    ( (This)->lpVtbl -> loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age) ) \n\n#define IDiaDataSourceEx_loadDataForExe(This,executable,searchPath,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataForExe(This,executable,searchPath,pCallback) ) \n\n#define IDiaDataSourceEx_loadDataFromIStream(This,pIStream)\t\\\n    ( (This)->lpVtbl -> loadDataFromIStream(This,pIStream) ) \n\n#define IDiaDataSourceEx_openSession(This,ppSession)\t\\\n    ( (This)->lpVtbl -> openSession(This,ppSession) ) \n\n#define IDiaDataSourceEx_loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback) ) \n\n#define IDiaDataSourceEx_loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback) ) \n\n\n#define IDiaDataSourceEx_loadDataFromPdbEx(This,pdbPath,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataFromPdbEx(This,pdbPath,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx_loadAndValidateDataFromPdbEx(This,pdbPath,pcsig70,sig,age,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadAndValidateDataFromPdbEx(This,pdbPath,pcsig70,sig,age,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx_loadDataForExeEx(This,executable,searchPath,pCallback,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataForExeEx(This,executable,searchPath,pCallback,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx_loadDataFromIStreamEx(This,pIStream,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataFromIStreamEx(This,pIStream,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx_getStreamSize(This,stream,pcb)\t\\\n    ( (This)->lpVtbl -> getStreamSize(This,stream,pcb) ) \n\n#define IDiaDataSourceEx_getStreamRawData(This,stream,cbOffset,cbRead,pcbRead,pbData)\t\\\n    ( (This)->lpVtbl -> getStreamRawData(This,stream,cbOffset,cbRead,pcbRead,pbData) ) \n\n#define IDiaDataSourceEx_setPfnMiniPDBErrorCallback2(This,pvContext,pfn)\t\\\n    ( (This)->lpVtbl -> setPfnMiniPDBErrorCallback2(This,pvContext,pfn) ) \n\n#define IDiaDataSourceEx_ValidatePdb(This,pdbPath,pcsig70,sig,age,pfStripped)\t\\\n    ( (This)->lpVtbl -> ValidatePdb(This,pdbPath,pcsig70,sig,age,pfStripped) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaDataSourceEx_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaDataSourceEx2_INTERFACE_DEFINED__\n#define __IDiaDataSourceEx2_INTERFACE_DEFINED__\n\n/* interface IDiaDataSourceEx2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaDataSourceEx2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"D240C8DD-1A0F-456E-80A6-4F1D06BF5DF4\")\n    IDiaDataSourceEx2 : public IDiaDataSourceEx\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE findNamedStreams( \n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumNamedStreams **ppResult) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaDataSourceEx2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaDataSourceEx2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaDataSourceEx2 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lastError )( \n            IDiaDataSourceEx2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromPdb )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR pdbPath);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadAndValidateDataFromPdb )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataForExe )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromIStream )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ IStream *pIStream);\n        \n        HRESULT ( STDMETHODCALLTYPE *openSession )( \n            IDiaDataSourceEx2 * This,\n            /* [out] */ IDiaSession **ppSession);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromCodeViewInfo )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD cbCvInfo,\n            /* [size_is][in] */ BYTE *pbCvInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromMiscInfo )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ DWORD timeStampExe,\n            /* [in] */ DWORD timeStampDbg,\n            /* [in] */ DWORD sizeOfExe,\n            /* [in] */ DWORD cbMiscInfo,\n            /* [size_is][in] */ BYTE *pbMiscInfo,\n            /* [in] */ IUnknown *pCallback);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromPdbEx )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadAndValidateDataFromPdbEx )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataForExeEx )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR executable,\n            /* [in] */ LPCOLESTR searchPath,\n            /* [in] */ IUnknown *pCallback,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *loadDataFromIStreamEx )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ IStream *pIStream,\n            /* [in] */ BOOL fPdbPrefetching);\n        \n        HRESULT ( STDMETHODCALLTYPE *getStreamSize )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR stream,\n            /* [out] */ ULONGLONG *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getStreamRawData )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR stream,\n            /* [in] */ ULONGLONG cbOffset,\n            /* [in] */ ULONGLONG cbRead,\n            /* [out] */ ULONGLONG *pcbRead,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *setPfnMiniPDBErrorCallback2 )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ void *pvContext,\n            /* [in] */ PFNMINIPDBERRORCALLBACK2 pfn);\n        \n        HRESULT ( STDMETHODCALLTYPE *ValidatePdb )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR pdbPath,\n            /* [in] */ const GUID *pcsig70,\n            /* [in] */ DWORD sig,\n            /* [in] */ DWORD age,\n            /* [out] */ BOOL *pfStripped);\n        \n        HRESULT ( STDMETHODCALLTYPE *findNamedStreams )( \n            IDiaDataSourceEx2 * This,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumNamedStreams **ppResult);\n        \n        END_INTERFACE\n    } IDiaDataSourceEx2Vtbl;\n\n    interface IDiaDataSourceEx2\n    {\n        CONST_VTBL struct IDiaDataSourceEx2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaDataSourceEx2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaDataSourceEx2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaDataSourceEx2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaDataSourceEx2_get_lastError(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lastError(This,pRetVal) ) \n\n#define IDiaDataSourceEx2_loadDataFromPdb(This,pdbPath)\t\\\n    ( (This)->lpVtbl -> loadDataFromPdb(This,pdbPath) ) \n\n#define IDiaDataSourceEx2_loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age)\t\\\n    ( (This)->lpVtbl -> loadAndValidateDataFromPdb(This,pdbPath,pcsig70,sig,age) ) \n\n#define IDiaDataSourceEx2_loadDataForExe(This,executable,searchPath,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataForExe(This,executable,searchPath,pCallback) ) \n\n#define IDiaDataSourceEx2_loadDataFromIStream(This,pIStream)\t\\\n    ( (This)->lpVtbl -> loadDataFromIStream(This,pIStream) ) \n\n#define IDiaDataSourceEx2_openSession(This,ppSession)\t\\\n    ( (This)->lpVtbl -> openSession(This,ppSession) ) \n\n#define IDiaDataSourceEx2_loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromCodeViewInfo(This,executable,searchPath,cbCvInfo,pbCvInfo,pCallback) ) \n\n#define IDiaDataSourceEx2_loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback)\t\\\n    ( (This)->lpVtbl -> loadDataFromMiscInfo(This,executable,searchPath,timeStampExe,timeStampDbg,sizeOfExe,cbMiscInfo,pbMiscInfo,pCallback) ) \n\n\n#define IDiaDataSourceEx2_loadDataFromPdbEx(This,pdbPath,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataFromPdbEx(This,pdbPath,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx2_loadAndValidateDataFromPdbEx(This,pdbPath,pcsig70,sig,age,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadAndValidateDataFromPdbEx(This,pdbPath,pcsig70,sig,age,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx2_loadDataForExeEx(This,executable,searchPath,pCallback,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataForExeEx(This,executable,searchPath,pCallback,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx2_loadDataFromIStreamEx(This,pIStream,fPdbPrefetching)\t\\\n    ( (This)->lpVtbl -> loadDataFromIStreamEx(This,pIStream,fPdbPrefetching) ) \n\n#define IDiaDataSourceEx2_getStreamSize(This,stream,pcb)\t\\\n    ( (This)->lpVtbl -> getStreamSize(This,stream,pcb) ) \n\n#define IDiaDataSourceEx2_getStreamRawData(This,stream,cbOffset,cbRead,pcbRead,pbData)\t\\\n    ( (This)->lpVtbl -> getStreamRawData(This,stream,cbOffset,cbRead,pcbRead,pbData) ) \n\n#define IDiaDataSourceEx2_setPfnMiniPDBErrorCallback2(This,pvContext,pfn)\t\\\n    ( (This)->lpVtbl -> setPfnMiniPDBErrorCallback2(This,pvContext,pfn) ) \n\n#define IDiaDataSourceEx2_ValidatePdb(This,pdbPath,pcsig70,sig,age,pfStripped)\t\\\n    ( (This)->lpVtbl -> ValidatePdb(This,pdbPath,pcsig70,sig,age,pfStripped) ) \n\n\n#define IDiaDataSourceEx2_findNamedStreams(This,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findNamedStreams(This,name,compareFlags,ppResult) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaDataSourceEx2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbols_INTERFACE_DEFINED__\n#define __IDiaEnumSymbols_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSymbols */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSymbols;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"CAB72C48-443B-48f5-9B0B-42F0820AB29A\")\n    IDiaEnumSymbols : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSymbol **symbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSymbols **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSymbolsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSymbols * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSymbols * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSymbols * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumSymbols * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumSymbols * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumSymbols * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSymbol **symbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSymbols * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSymbols * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSymbols * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSymbols * This,\n            /* [out] */ IDiaEnumSymbols **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSymbolsVtbl;\n\n    interface IDiaEnumSymbols\n    {\n        CONST_VTBL struct IDiaEnumSymbolsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSymbols_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSymbols_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSymbols_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSymbols_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumSymbols_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumSymbols_Item(This,index,symbol)\t\\\n    ( (This)->lpVtbl -> Item(This,index,symbol) ) \n\n#define IDiaEnumSymbols_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbols_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumSymbols_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSymbols_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSymbols_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr_INTERFACE_DEFINED__\n#define __IDiaEnumSymbolsByAddr_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSymbolsByAddr */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSymbolsByAddr;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"624B7D9C-24EA-4421-9D06-3B577471C1FA\")\n    IDiaEnumSymbolsByAddr : public IUnknown\n    {\n    public:\n        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE symbolByAddr( \n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE symbolByRVA( \n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE symbolByVA( \n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Prev( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSymbolsByAddr **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSymbolsByAddrVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSymbolsByAddr * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSymbolsByAddr * This);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByAddr )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByRVA )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByVA )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Prev )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSymbolsByAddr * This,\n            /* [out] */ IDiaEnumSymbolsByAddr **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSymbolsByAddrVtbl;\n\n    interface IDiaEnumSymbolsByAddr\n    {\n        CONST_VTBL struct IDiaEnumSymbolsByAddrVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSymbolsByAddr_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSymbolsByAddr_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSymbolsByAddr_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSymbolsByAddr_symbolByAddr(This,isect,offset,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByAddr(This,isect,offset,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr_symbolByRVA(This,relativeVirtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByRVA(This,relativeVirtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr_symbolByVA(This,virtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByVA(This,virtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbolsByAddr_Prev(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Prev(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbolsByAddr_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSymbolsByAddr_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSymbolsByAddr2_INTERFACE_DEFINED__\n#define __IDiaEnumSymbolsByAddr2_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSymbolsByAddr2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSymbolsByAddr2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"1E45BD02-BE45-4D71-BA32-0E576CFCD59F\")\n    IDiaEnumSymbolsByAddr2 : public IDiaEnumSymbolsByAddr\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE symbolByAddrEx( \n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE symbolByRVAEx( \n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE symbolByVAEx( \n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE NextEx( \n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE PrevEx( \n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSymbolsByAddr2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSymbolsByAddr2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSymbolsByAddr2 * This);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByAddr )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByRVA )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *symbolByVA )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Prev )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [out] */ IDiaEnumSymbolsByAddr **ppenum);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolByAddrEx )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolByRVAEx )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolByVAEx )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *NextEx )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *PrevEx )( \n            IDiaEnumSymbolsByAddr2 * This,\n            /* [in] */ BOOL fPromoteBlockSym,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSymbol **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        END_INTERFACE\n    } IDiaEnumSymbolsByAddr2Vtbl;\n\n    interface IDiaEnumSymbolsByAddr2\n    {\n        CONST_VTBL struct IDiaEnumSymbolsByAddr2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSymbolsByAddr2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSymbolsByAddr2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSymbolsByAddr2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSymbolsByAddr2_symbolByAddr(This,isect,offset,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByAddr(This,isect,offset,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_symbolByRVA(This,relativeVirtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByRVA(This,relativeVirtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_symbolByVA(This,virtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByVA(This,virtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbolsByAddr2_Prev(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Prev(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbolsByAddr2_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n\n#define IDiaEnumSymbolsByAddr2_symbolByAddrEx(This,fPromoteBlockSym,isect,offset,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByAddrEx(This,fPromoteBlockSym,isect,offset,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_symbolByRVAEx(This,fPromoteBlockSym,relativeVirtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByRVAEx(This,fPromoteBlockSym,relativeVirtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_symbolByVAEx(This,fPromoteBlockSym,virtualAddress,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolByVAEx(This,fPromoteBlockSym,virtualAddress,ppSymbol) ) \n\n#define IDiaEnumSymbolsByAddr2_NextEx(This,fPromoteBlockSym,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> NextEx(This,fPromoteBlockSym,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSymbolsByAddr2_PrevEx(This,fPromoteBlockSym,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> PrevEx(This,fPromoteBlockSym,celt,rgelt,pceltFetched) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSymbolsByAddr2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceFiles_INTERFACE_DEFINED__\n#define __IDiaEnumSourceFiles_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSourceFiles */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSourceFiles;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"10F3DBD9-664F-4469-B808-9471C7A50538\")\n    IDiaEnumSourceFiles : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSourceFile **sourceFile) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSourceFile **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSourceFiles **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSourceFilesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSourceFiles * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSourceFiles * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSourceFiles * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumSourceFiles * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumSourceFiles * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumSourceFiles * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSourceFile **sourceFile);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSourceFiles * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSourceFile **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSourceFiles * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSourceFiles * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSourceFiles * This,\n            /* [out] */ IDiaEnumSourceFiles **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSourceFilesVtbl;\n\n    interface IDiaEnumSourceFiles\n    {\n        CONST_VTBL struct IDiaEnumSourceFilesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSourceFiles_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSourceFiles_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSourceFiles_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSourceFiles_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumSourceFiles_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumSourceFiles_Item(This,index,sourceFile)\t\\\n    ( (This)->lpVtbl -> Item(This,index,sourceFile) ) \n\n#define IDiaEnumSourceFiles_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSourceFiles_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumSourceFiles_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSourceFiles_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSourceFiles_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumInputAssemblyFiles_INTERFACE_DEFINED__\n#define __IDiaEnumInputAssemblyFiles_INTERFACE_DEFINED__\n\n/* interface IDiaEnumInputAssemblyFiles */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumInputAssemblyFiles;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"1C7FF653-51F7-457E-8419-B20F57EF7E4D\")\n    IDiaEnumInputAssemblyFiles : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaInputAssemblyFile **file) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaInputAssemblyFile **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumInputAssemblyFiles **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumInputAssemblyFilesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumInputAssemblyFiles * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumInputAssemblyFiles * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaInputAssemblyFile **file);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaInputAssemblyFile **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumInputAssemblyFiles * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumInputAssemblyFiles * This,\n            /* [out] */ IDiaEnumInputAssemblyFiles **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumInputAssemblyFilesVtbl;\n\n    interface IDiaEnumInputAssemblyFiles\n    {\n        CONST_VTBL struct IDiaEnumInputAssemblyFilesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumInputAssemblyFiles_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumInputAssemblyFiles_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumInputAssemblyFiles_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumInputAssemblyFiles_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumInputAssemblyFiles_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumInputAssemblyFiles_Item(This,index,file)\t\\\n    ( (This)->lpVtbl -> Item(This,index,file) ) \n\n#define IDiaEnumInputAssemblyFiles_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumInputAssemblyFiles_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumInputAssemblyFiles_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumInputAssemblyFiles_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumInputAssemblyFiles_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumLineNumbers_INTERFACE_DEFINED__\n#define __IDiaEnumLineNumbers_INTERFACE_DEFINED__\n\n/* interface IDiaEnumLineNumbers */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumLineNumbers;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"FE30E878-54AC-44f1-81BA-39DE940F6052\")\n    IDiaEnumLineNumbers : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaLineNumber **lineNumber) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaLineNumber **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumLineNumbers **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumLineNumbersVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumLineNumbers * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumLineNumbers * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumLineNumbers * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumLineNumbers * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumLineNumbers * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumLineNumbers * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaLineNumber **lineNumber);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumLineNumbers * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaLineNumber **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumLineNumbers * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumLineNumbers * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumLineNumbers * This,\n            /* [out] */ IDiaEnumLineNumbers **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumLineNumbersVtbl;\n\n    interface IDiaEnumLineNumbers\n    {\n        CONST_VTBL struct IDiaEnumLineNumbersVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumLineNumbers_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumLineNumbers_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumLineNumbers_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumLineNumbers_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumLineNumbers_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumLineNumbers_Item(This,index,lineNumber)\t\\\n    ( (This)->lpVtbl -> Item(This,index,lineNumber) ) \n\n#define IDiaEnumLineNumbers_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumLineNumbers_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumLineNumbers_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumLineNumbers_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumLineNumbers_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumInjectedSources_INTERFACE_DEFINED__\n#define __IDiaEnumInjectedSources_INTERFACE_DEFINED__\n\n/* interface IDiaEnumInjectedSources */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumInjectedSources;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"D5612573-6925-4468-8883-98CDEC8C384A\")\n    IDiaEnumInjectedSources : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaInjectedSource **injectedSource) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaInjectedSource **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumInjectedSources **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumInjectedSourcesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumInjectedSources * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumInjectedSources * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumInjectedSources * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumInjectedSources * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumInjectedSources * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumInjectedSources * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaInjectedSource **injectedSource);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumInjectedSources * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaInjectedSource **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumInjectedSources * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumInjectedSources * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumInjectedSources * This,\n            /* [out] */ IDiaEnumInjectedSources **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumInjectedSourcesVtbl;\n\n    interface IDiaEnumInjectedSources\n    {\n        CONST_VTBL struct IDiaEnumInjectedSourcesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumInjectedSources_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumInjectedSources_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumInjectedSources_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumInjectedSources_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumInjectedSources_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumInjectedSources_Item(This,index,injectedSource)\t\\\n    ( (This)->lpVtbl -> Item(This,index,injectedSource) ) \n\n#define IDiaEnumInjectedSources_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumInjectedSources_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumInjectedSources_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumInjectedSources_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumInjectedSources_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSegments_INTERFACE_DEFINED__\n#define __IDiaEnumSegments_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSegments */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSegments;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"E8368CA9-01D1-419d-AC0C-E31235DBDA9F\")\n    IDiaEnumSegments : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSegment **segment) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSegment **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSegments **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSegmentsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSegments * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSegments * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSegments * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumSegments * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumSegments * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumSegments * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSegment **segment);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSegments * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSegment **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSegments * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSegments * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSegments * This,\n            /* [out] */ IDiaEnumSegments **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSegmentsVtbl;\n\n    interface IDiaEnumSegments\n    {\n        CONST_VTBL struct IDiaEnumSegmentsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSegments_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSegments_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSegments_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSegments_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumSegments_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumSegments_Item(This,index,segment)\t\\\n    ( (This)->lpVtbl -> Item(This,index,segment) ) \n\n#define IDiaEnumSegments_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSegments_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumSegments_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSegments_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSegments_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSectionContribs_INTERFACE_DEFINED__\n#define __IDiaEnumSectionContribs_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSectionContribs */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSectionContribs;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"1994DEB2-2C82-4b1d-A57F-AFF424D54A68\")\n    IDiaEnumSectionContribs : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSectionContrib **section) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSectionContrib **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSectionContribs **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSectionContribsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSectionContribs * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSectionContribs * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSectionContribs * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumSectionContribs * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumSectionContribs * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumSectionContribs * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaSectionContrib **section);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSectionContribs * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaSectionContrib **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSectionContribs * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSectionContribs * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSectionContribs * This,\n            /* [out] */ IDiaEnumSectionContribs **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSectionContribsVtbl;\n\n    interface IDiaEnumSectionContribs\n    {\n        CONST_VTBL struct IDiaEnumSectionContribsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSectionContribs_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSectionContribs_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSectionContribs_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSectionContribs_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumSectionContribs_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumSectionContribs_Item(This,index,section)\t\\\n    ( (This)->lpVtbl -> Item(This,index,section) ) \n\n#define IDiaEnumSectionContribs_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumSectionContribs_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumSectionContribs_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSectionContribs_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSectionContribs_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumFrameData_INTERFACE_DEFINED__\n#define __IDiaEnumFrameData_INTERFACE_DEFINED__\n\n/* interface IDiaEnumFrameData */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumFrameData;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"9FC77A4B-3C1C-44ed-A798-6C1DEEA53E1F\")\n    IDiaEnumFrameData : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaFrameData **frame) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaFrameData **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumFrameData **ppenum) = 0;\n        \n        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE frameByRVA( \n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaFrameData **frame) = 0;\n        \n        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE frameByVA( \n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaFrameData **frame) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumFrameDataVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumFrameData * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumFrameData * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumFrameData * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumFrameData * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumFrameData * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumFrameData * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IDiaFrameData **frame);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumFrameData * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaFrameData **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumFrameData * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumFrameData * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumFrameData * This,\n            /* [out] */ IDiaEnumFrameData **ppenum);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *frameByRVA )( \n            IDiaEnumFrameData * This,\n            /* [in] */ DWORD relativeVirtualAddress,\n            /* [retval][out] */ IDiaFrameData **frame);\n        \n        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *frameByVA )( \n            IDiaEnumFrameData * This,\n            /* [in] */ ULONGLONG virtualAddress,\n            /* [retval][out] */ IDiaFrameData **frame);\n        \n        END_INTERFACE\n    } IDiaEnumFrameDataVtbl;\n\n    interface IDiaEnumFrameData\n    {\n        CONST_VTBL struct IDiaEnumFrameDataVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumFrameData_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumFrameData_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumFrameData_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumFrameData_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumFrameData_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumFrameData_Item(This,index,frame)\t\\\n    ( (This)->lpVtbl -> Item(This,index,frame) ) \n\n#define IDiaEnumFrameData_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumFrameData_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumFrameData_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumFrameData_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#define IDiaEnumFrameData_frameByRVA(This,relativeVirtualAddress,frame)\t\\\n    ( (This)->lpVtbl -> frameByRVA(This,relativeVirtualAddress,frame) ) \n\n#define IDiaEnumFrameData_frameByVA(This,virtualAddress,frame)\t\\\n    ( (This)->lpVtbl -> frameByVA(This,virtualAddress,frame) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumFrameData_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumDebugStreamData_INTERFACE_DEFINED__\n#define __IDiaEnumDebugStreamData_INTERFACE_DEFINED__\n\n/* interface IDiaEnumDebugStreamData */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumDebugStreamData;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"486943E8-D187-4a6b-A3C4-291259FFF60D\")\n    IDiaEnumDebugStreamData : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_name( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumDebugStreamData **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumDebugStreamDataVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumDebugStreamData * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumDebugStreamData * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumDebugStreamData * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumDebugStreamData * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumDebugStreamData * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaEnumDebugStreamData * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumDebugStreamData * This,\n            /* [in] */ DWORD index,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumDebugStreamData * This,\n            /* [in] */ ULONG celt,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumDebugStreamData * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumDebugStreamData * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumDebugStreamData * This,\n            /* [out] */ IDiaEnumDebugStreamData **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumDebugStreamDataVtbl;\n\n    interface IDiaEnumDebugStreamData\n    {\n        CONST_VTBL struct IDiaEnumDebugStreamDataVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumDebugStreamData_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumDebugStreamData_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumDebugStreamData_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumDebugStreamData_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumDebugStreamData_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumDebugStreamData_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaEnumDebugStreamData_Item(This,index,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> Item(This,index,cbData,pcbData,pbData) ) \n\n#define IDiaEnumDebugStreamData_Next(This,celt,cbData,pcbData,pbData,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,cbData,pcbData,pbData,pceltFetched) ) \n\n#define IDiaEnumDebugStreamData_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumDebugStreamData_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumDebugStreamData_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumDebugStreamData_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumDebugStreams_INTERFACE_DEFINED__\n#define __IDiaEnumDebugStreams_INTERFACE_DEFINED__\n\n/* interface IDiaEnumDebugStreams */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumDebugStreams;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"08CBB41E-47A6-4f87-92F1-1C9C87CED044\")\n    IDiaEnumDebugStreams : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ VARIANT index,\n            /* [retval][out] */ IDiaEnumDebugStreamData **stream) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaEnumDebugStreamData **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumDebugStreams **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumDebugStreamsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumDebugStreams * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumDebugStreams * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumDebugStreams * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumDebugStreams * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumDebugStreams * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumDebugStreams * This,\n            /* [in] */ VARIANT index,\n            /* [retval][out] */ IDiaEnumDebugStreamData **stream);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumDebugStreams * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaEnumDebugStreamData **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumDebugStreams * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumDebugStreams * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumDebugStreams * This,\n            /* [out] */ IDiaEnumDebugStreams **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumDebugStreamsVtbl;\n\n    interface IDiaEnumDebugStreams\n    {\n        CONST_VTBL struct IDiaEnumDebugStreamsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumDebugStreams_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumDebugStreams_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumDebugStreams_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumDebugStreams_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumDebugStreams_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumDebugStreams_Item(This,index,stream)\t\\\n    ( (This)->lpVtbl -> Item(This,index,stream) ) \n\n#define IDiaEnumDebugStreams_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumDebugStreams_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumDebugStreams_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumDebugStreams_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumDebugStreams_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_dia2_0000_0019 */\n/* [local] */ \n\nstruct DiaAddressMapEntry\n    {\n    DWORD rva;\n    DWORD rvaTo;\n    } ;\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0019_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0019_v0_0_s_ifspec;\n\n#ifndef __IDiaAddressMap_INTERFACE_DEFINED__\n#define __IDiaAddressMap_INTERFACE_DEFINED__\n\n/* interface IDiaAddressMap */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaAddressMap;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"B62A2E7A-067A-4ea3-B598-04C09717502C\")\n    IDiaAddressMap : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressMapEnabled( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_addressMapEnabled( \n            /* [in] */ BOOL NewVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddressEnabled( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_relativeVirtualAddressEnabled( \n            /* [in] */ BOOL NewVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_imageAlign( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_imageAlign( \n            /* [in] */ DWORD NewVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE set_imageHeaders( \n            /* [in] */ DWORD cbData,\n            /* [size_is][in] */ BYTE *pbData,\n            /* [in] */ BOOL originalHeaders) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE set_addressMap( \n            /* [in] */ DWORD cData,\n            /* [size_is][in] */ struct DiaAddressMapEntry *pData,\n            /* [in] */ BOOL imageToSymbols) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaAddressMapVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaAddressMap * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaAddressMap * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaAddressMap * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressMapEnabled )( \n            IDiaAddressMap * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_addressMapEnabled )( \n            IDiaAddressMap * This,\n            /* [in] */ BOOL NewVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddressEnabled )( \n            IDiaAddressMap * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_relativeVirtualAddressEnabled )( \n            IDiaAddressMap * This,\n            /* [in] */ BOOL NewVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_imageAlign )( \n            IDiaAddressMap * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_imageAlign )( \n            IDiaAddressMap * This,\n            /* [in] */ DWORD NewVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *set_imageHeaders )( \n            IDiaAddressMap * This,\n            /* [in] */ DWORD cbData,\n            /* [size_is][in] */ BYTE *pbData,\n            /* [in] */ BOOL originalHeaders);\n        \n        HRESULT ( STDMETHODCALLTYPE *set_addressMap )( \n            IDiaAddressMap * This,\n            /* [in] */ DWORD cData,\n            /* [size_is][in] */ struct DiaAddressMapEntry *pData,\n            /* [in] */ BOOL imageToSymbols);\n        \n        END_INTERFACE\n    } IDiaAddressMapVtbl;\n\n    interface IDiaAddressMap\n    {\n        CONST_VTBL struct IDiaAddressMapVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaAddressMap_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaAddressMap_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaAddressMap_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaAddressMap_get_addressMapEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressMapEnabled(This,pRetVal) ) \n\n#define IDiaAddressMap_put_addressMapEnabled(This,NewVal)\t\\\n    ( (This)->lpVtbl -> put_addressMapEnabled(This,NewVal) ) \n\n#define IDiaAddressMap_get_relativeVirtualAddressEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddressEnabled(This,pRetVal) ) \n\n#define IDiaAddressMap_put_relativeVirtualAddressEnabled(This,NewVal)\t\\\n    ( (This)->lpVtbl -> put_relativeVirtualAddressEnabled(This,NewVal) ) \n\n#define IDiaAddressMap_get_imageAlign(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_imageAlign(This,pRetVal) ) \n\n#define IDiaAddressMap_put_imageAlign(This,NewVal)\t\\\n    ( (This)->lpVtbl -> put_imageAlign(This,NewVal) ) \n\n#define IDiaAddressMap_set_imageHeaders(This,cbData,pbData,originalHeaders)\t\\\n    ( (This)->lpVtbl -> set_imageHeaders(This,cbData,pbData,originalHeaders) ) \n\n#define IDiaAddressMap_set_addressMap(This,cData,pData,imageToSymbols)\t\\\n    ( (This)->lpVtbl -> set_addressMap(This,cData,pData,imageToSymbols) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaAddressMap_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSession_INTERFACE_DEFINED__\n#define __IDiaSession_INTERFACE_DEFINED__\n\n/* interface IDiaSession */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSession;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"2F609EE1-D1C8-4E24-8288-3326BADCD211\")\n    IDiaSession : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_loadAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_loadAddress( \n            /* [in] */ ULONGLONG NewVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_globalScope( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getEnumTables( \n            /* [out] */ IDiaEnumTables **ppEnumTables) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getSymbolsByAddr( \n            /* [out] */ IDiaEnumSymbolsByAddr **ppEnumbyAddr) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildren( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenEx( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByAddr( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByRVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByAddr( \n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByRVA( \n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByVA( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByToken( \n            /* [in] */ ULONG token,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE symsAreEquiv( \n            /* [in] */ IDiaSymbol *symbolA,\n            /* [in] */ IDiaSymbol *symbolB) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE symbolById( \n            /* [in] */ DWORD id,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByRVAEx( \n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolByVAEx( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findFile( \n            /* [in] */ IDiaSymbol *pCompiland,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSourceFiles **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findFileById( \n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaSourceFile **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findLines( \n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findLinesByAddr( \n            /* [in] */ DWORD seg,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findLinesByRVA( \n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findLinesByVA( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findLinesByLinenum( \n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInjectedSource( \n            /* [in] */ LPCOLESTR srcFile,\n            /* [out] */ IDiaEnumInjectedSources **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getEnumDebugStreams( \n            /* [out] */ IDiaEnumDebugStreams **ppEnumDebugStreams) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByAddr( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByRVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLines( \n            /* [in] */ IDiaSymbol *parent,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByAddr( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByRVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByVA( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByLinenum( \n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineesByName( \n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findAcceleratorInlineeLinesByLinenum( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolsForAcceleratorPointerTag( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolsByRVAForAcceleratorPointerTag( \n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findAcceleratorInlineesByName( \n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE addressForVA( \n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE addressForRVA( \n            /* [in] */ DWORD rva,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findILOffsetsByAddr( \n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findILOffsetsByRVA( \n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findILOffsetsByVA( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInputAssemblyFiles( \n            /* [out] */ IDiaEnumInputAssemblyFiles **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInputAssembly( \n            /* [in] */ DWORD index,\n            /* [out] */ IDiaInputAssemblyFile **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInputAssemblyById( \n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaInputAssemblyFile **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getFuncMDTokenMapSize( \n            /* [out] */ DWORD *pcb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getFuncMDTokenMap( \n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getTypeMDTokenMapSize( \n            /* [out] */ DWORD *pcb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getTypeMDTokenMap( \n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getNumberOfFunctionFragments_VA( \n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getNumberOfFunctionFragments_RVA( \n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getFunctionFragments_VA( \n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ ULONGLONG *pVaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getFunctionFragments_RVA( \n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ DWORD *pRvaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getExports( \n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getHeapAllocationSites( \n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInputAssemblyFile( \n            /* [in] */ IDiaSymbol *pSymbol,\n            /* [out] */ IDiaInputAssemblyFile **ppResult) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSessionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSession * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSession * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSession * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_loadAddress )( \n            IDiaSession * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_loadAddress )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG NewVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_globalScope )( \n            IDiaSession * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumTables )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumTables **ppEnumTables);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSymbolsByAddr )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumSymbolsByAddr **ppEnumbyAddr);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByAddr )( \n            IDiaSession * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByRVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByVA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByToken )( \n            IDiaSession * This,\n            /* [in] */ ULONG token,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *symsAreEquiv )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *symbolA,\n            /* [in] */ IDiaSymbol *symbolB);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolById )( \n            IDiaSession * This,\n            /* [in] */ DWORD id,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByRVAEx )( \n            IDiaSession * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByVAEx )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement);\n        \n        HRESULT ( STDMETHODCALLTYPE *findFile )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *pCompiland,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSourceFiles **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findFileById )( \n            IDiaSession * This,\n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaSourceFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLines )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByAddr )( \n            IDiaSession * This,\n            /* [in] */ DWORD seg,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByRVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByVA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByLinenum )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInjectedSource )( \n            IDiaSession * This,\n            /* [in] */ LPCOLESTR srcFile,\n            /* [out] */ IDiaEnumInjectedSources **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumDebugStreams )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumDebugStreams **ppEnumDebugStreams);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByLinenum )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineesByName )( \n            IDiaSession * This,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findAcceleratorInlineeLinesByLinenum )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findAcceleratorInlineesByName )( \n            IDiaSession * This,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForVA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForRVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByAddr )( \n            IDiaSession * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByRVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByVA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFiles )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumInputAssemblyFiles **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssembly )( \n            IDiaSession * This,\n            /* [in] */ DWORD index,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyById )( \n            IDiaSession * This,\n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFuncMDTokenMapSize )( \n            IDiaSession * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFuncMDTokenMap )( \n            IDiaSession * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getTypeMDTokenMapSize )( \n            IDiaSession * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getTypeMDTokenMap )( \n            IDiaSession * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getNumberOfFunctionFragments_VA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *getNumberOfFunctionFragments_RVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFunctionFragments_VA )( \n            IDiaSession * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ ULONGLONG *pVaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFunctionFragments_RVA )( \n            IDiaSession * This,\n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ DWORD *pRvaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment);\n        \n        HRESULT ( STDMETHODCALLTYPE *getExports )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getHeapAllocationSites )( \n            IDiaSession * This,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSession * This,\n            /* [in] */ IDiaSymbol *pSymbol,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        END_INTERFACE\n    } IDiaSessionVtbl;\n\n    interface IDiaSession\n    {\n        CONST_VTBL struct IDiaSessionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSession_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSession_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSession_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSession_get_loadAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_loadAddress(This,pRetVal) ) \n\n#define IDiaSession_put_loadAddress(This,NewVal)\t\\\n    ( (This)->lpVtbl -> put_loadAddress(This,NewVal) ) \n\n#define IDiaSession_get_globalScope(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_globalScope(This,pRetVal) ) \n\n#define IDiaSession_getEnumTables(This,ppEnumTables)\t\\\n    ( (This)->lpVtbl -> getEnumTables(This,ppEnumTables) ) \n\n#define IDiaSession_getSymbolsByAddr(This,ppEnumbyAddr)\t\\\n    ( (This)->lpVtbl -> getSymbolsByAddr(This,ppEnumbyAddr) ) \n\n#define IDiaSession_findChildren(This,parent,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,parent,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSession_findChildrenEx(This,parent,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,parent,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSession_findChildrenExByAddr(This,parent,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,parent,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSession_findChildrenExByVA(This,parent,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,parent,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSession_findChildrenExByRVA(This,parent,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,parent,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSession_findSymbolByAddr(This,isect,offset,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByAddr(This,isect,offset,symtag,ppSymbol) ) \n\n#define IDiaSession_findSymbolByRVA(This,rva,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByRVA(This,rva,symtag,ppSymbol) ) \n\n#define IDiaSession_findSymbolByVA(This,va,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByVA(This,va,symtag,ppSymbol) ) \n\n#define IDiaSession_findSymbolByToken(This,token,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByToken(This,token,symtag,ppSymbol) ) \n\n#define IDiaSession_symsAreEquiv(This,symbolA,symbolB)\t\\\n    ( (This)->lpVtbl -> symsAreEquiv(This,symbolA,symbolB) ) \n\n#define IDiaSession_symbolById(This,id,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolById(This,id,ppSymbol) ) \n\n#define IDiaSession_findSymbolByRVAEx(This,rva,symtag,ppSymbol,displacement)\t\\\n    ( (This)->lpVtbl -> findSymbolByRVAEx(This,rva,symtag,ppSymbol,displacement) ) \n\n#define IDiaSession_findSymbolByVAEx(This,va,symtag,ppSymbol,displacement)\t\\\n    ( (This)->lpVtbl -> findSymbolByVAEx(This,va,symtag,ppSymbol,displacement) ) \n\n#define IDiaSession_findFile(This,pCompiland,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findFile(This,pCompiland,name,compareFlags,ppResult) ) \n\n#define IDiaSession_findFileById(This,uniqueId,ppResult)\t\\\n    ( (This)->lpVtbl -> findFileById(This,uniqueId,ppResult) ) \n\n#define IDiaSession_findLines(This,compiland,file,ppResult)\t\\\n    ( (This)->lpVtbl -> findLines(This,compiland,file,ppResult) ) \n\n#define IDiaSession_findLinesByAddr(This,seg,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByAddr(This,seg,offset,length,ppResult) ) \n\n#define IDiaSession_findLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSession_findLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSession_findLinesByLinenum(This,compiland,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByLinenum(This,compiland,file,linenum,column,ppResult) ) \n\n#define IDiaSession_findInjectedSource(This,srcFile,ppResult)\t\\\n    ( (This)->lpVtbl -> findInjectedSource(This,srcFile,ppResult) ) \n\n#define IDiaSession_getEnumDebugStreams(This,ppEnumDebugStreams)\t\\\n    ( (This)->lpVtbl -> getEnumDebugStreams(This,ppEnumDebugStreams) ) \n\n#define IDiaSession_findInlineFramesByAddr(This,parent,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,parent,isect,offset,ppResult) ) \n\n#define IDiaSession_findInlineFramesByRVA(This,parent,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,parent,rva,ppResult) ) \n\n#define IDiaSession_findInlineFramesByVA(This,parent,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,parent,va,ppResult) ) \n\n#define IDiaSession_findInlineeLines(This,parent,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,parent,ppResult) ) \n\n#define IDiaSession_findInlineeLinesByAddr(This,parent,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,parent,isect,offset,length,ppResult) ) \n\n#define IDiaSession_findInlineeLinesByRVA(This,parent,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,parent,rva,length,ppResult) ) \n\n#define IDiaSession_findInlineeLinesByVA(This,parent,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,parent,va,length,ppResult) ) \n\n#define IDiaSession_findInlineeLinesByLinenum(This,compiland,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByLinenum(This,compiland,file,linenum,column,ppResult) ) \n\n#define IDiaSession_findInlineesByName(This,name,option,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineesByName(This,name,option,ppResult) ) \n\n#define IDiaSession_findAcceleratorInlineeLinesByLinenum(This,parent,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findAcceleratorInlineeLinesByLinenum(This,parent,file,linenum,column,ppResult) ) \n\n#define IDiaSession_findSymbolsForAcceleratorPointerTag(This,parent,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,parent,tagValue,ppResult) ) \n\n#define IDiaSession_findSymbolsByRVAForAcceleratorPointerTag(This,parent,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,parent,tagValue,rva,ppResult) ) \n\n#define IDiaSession_findAcceleratorInlineesByName(This,name,option,ppResult)\t\\\n    ( (This)->lpVtbl -> findAcceleratorInlineesByName(This,name,option,ppResult) ) \n\n#define IDiaSession_addressForVA(This,va,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForVA(This,va,pISect,pOffset) ) \n\n#define IDiaSession_addressForRVA(This,rva,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForRVA(This,rva,pISect,pOffset) ) \n\n#define IDiaSession_findILOffsetsByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSession_findILOffsetsByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSession_findILOffsetsByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByVA(This,va,length,ppResult) ) \n\n#define IDiaSession_findInputAssemblyFiles(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFiles(This,ppResult) ) \n\n#define IDiaSession_findInputAssembly(This,index,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssembly(This,index,ppResult) ) \n\n#define IDiaSession_findInputAssemblyById(This,uniqueId,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyById(This,uniqueId,ppResult) ) \n\n#define IDiaSession_getFuncMDTokenMapSize(This,pcb)\t\\\n    ( (This)->lpVtbl -> getFuncMDTokenMapSize(This,pcb) ) \n\n#define IDiaSession_getFuncMDTokenMap(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> getFuncMDTokenMap(This,cb,pcb,pb) ) \n\n#define IDiaSession_getTypeMDTokenMapSize(This,pcb)\t\\\n    ( (This)->lpVtbl -> getTypeMDTokenMapSize(This,pcb) ) \n\n#define IDiaSession_getTypeMDTokenMap(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> getTypeMDTokenMap(This,cb,pcb,pb) ) \n\n#define IDiaSession_getNumberOfFunctionFragments_VA(This,vaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> getNumberOfFunctionFragments_VA(This,vaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaSession_getNumberOfFunctionFragments_RVA(This,rvaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> getNumberOfFunctionFragments_RVA(This,rvaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaSession_getFunctionFragments_VA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> getFunctionFragments_VA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment) ) \n\n#define IDiaSession_getFunctionFragments_RVA(This,rvaFunc,cbFunc,cFragments,pRvaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> getFunctionFragments_RVA(This,rvaFunc,cbFunc,cFragments,pRvaFragment,pLenFragment) ) \n\n#define IDiaSession_getExports(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getExports(This,ppResult) ) \n\n#define IDiaSession_getHeapAllocationSites(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getHeapAllocationSites(This,ppResult) ) \n\n#define IDiaSession_findInputAssemblyFile(This,pSymbol,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,pSymbol,ppResult) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaSession_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSessionEx_INTERFACE_DEFINED__\n#define __IDiaSessionEx_INTERFACE_DEFINED__\n\n/* interface IDiaSessionEx */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSessionEx;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"cd24eed5-5fea-4742-a320-6254c920e78b\")\n    IDiaSessionEx : public IDiaSession\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE isFastLinkPDB( \n            /* [out] */ BOOL *pfFastLinkPDB) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE isPortablePDB( \n            /* [out] */ BOOL *pfPortablePDB) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getSourceLinkInfo( \n            /* [in] */ IDiaSymbol *parent,\n            /* [out] */ IDiaEnumSourceLink **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSessionExVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSessionEx * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSessionEx * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSessionEx * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_loadAddress )( \n            IDiaSessionEx * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_loadAddress )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG NewVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_globalScope )( \n            IDiaSessionEx * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumTables )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumTables **ppEnumTables);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSymbolsByAddr )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumSymbolsByAddr **ppEnumbyAddr);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByToken )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONG token,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *symsAreEquiv )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *symbolA,\n            /* [in] */ IDiaSymbol *symbolB);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolById )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD id,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByRVAEx )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolByVAEx )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [out] */ IDiaSymbol **ppSymbol,\n            /* [out] */ long *displacement);\n        \n        HRESULT ( STDMETHODCALLTYPE *findFile )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *pCompiland,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSourceFiles **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findFileById )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaSourceFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLines )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD seg,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findLinesByLinenum )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInjectedSource )( \n            IDiaSessionEx * This,\n            /* [in] */ LPCOLESTR srcFile,\n            /* [out] */ IDiaEnumInjectedSources **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumDebugStreams )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumDebugStreams **ppEnumDebugStreams);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByLinenum )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *compiland,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineesByName )( \n            IDiaSessionEx * This,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findAcceleratorInlineeLinesByLinenum )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ IDiaSourceFile *file,\n            /* [in] */ DWORD linenum,\n            /* [in] */ DWORD column,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findAcceleratorInlineesByName )( \n            IDiaSessionEx * This,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD option,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForVA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByAddr )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByRVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findILOffsetsByVA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFiles )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumInputAssemblyFiles **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssembly )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD index,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyById )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD uniqueId,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFuncMDTokenMapSize )( \n            IDiaSessionEx * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFuncMDTokenMap )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getTypeMDTokenMapSize )( \n            IDiaSessionEx * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getTypeMDTokenMap )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *getNumberOfFunctionFragments_VA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *getNumberOfFunctionFragments_RVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFunctionFragments_VA )( \n            IDiaSessionEx * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ ULONGLONG *pVaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment);\n        \n        HRESULT ( STDMETHODCALLTYPE *getFunctionFragments_RVA )( \n            IDiaSessionEx * This,\n            /* [in] */ DWORD rvaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [size_is][out] */ DWORD *pRvaFragment,\n            /* [size_is][out] */ DWORD *pLenFragment);\n        \n        HRESULT ( STDMETHODCALLTYPE *getExports )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *getHeapAllocationSites )( \n            IDiaSessionEx * This,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *pSymbol,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *isFastLinkPDB )( \n            IDiaSessionEx * This,\n            /* [out] */ BOOL *pfFastLinkPDB);\n        \n        HRESULT ( STDMETHODCALLTYPE *isPortablePDB )( \n            IDiaSessionEx * This,\n            /* [out] */ BOOL *pfPortablePDB);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSourceLinkInfo )( \n            IDiaSessionEx * This,\n            /* [in] */ IDiaSymbol *parent,\n            /* [out] */ IDiaEnumSourceLink **ppenum);\n        \n        END_INTERFACE\n    } IDiaSessionExVtbl;\n\n    interface IDiaSessionEx\n    {\n        CONST_VTBL struct IDiaSessionExVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSessionEx_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSessionEx_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSessionEx_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSessionEx_get_loadAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_loadAddress(This,pRetVal) ) \n\n#define IDiaSessionEx_put_loadAddress(This,NewVal)\t\\\n    ( (This)->lpVtbl -> put_loadAddress(This,NewVal) ) \n\n#define IDiaSessionEx_get_globalScope(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_globalScope(This,pRetVal) ) \n\n#define IDiaSessionEx_getEnumTables(This,ppEnumTables)\t\\\n    ( (This)->lpVtbl -> getEnumTables(This,ppEnumTables) ) \n\n#define IDiaSessionEx_getSymbolsByAddr(This,ppEnumbyAddr)\t\\\n    ( (This)->lpVtbl -> getSymbolsByAddr(This,ppEnumbyAddr) ) \n\n#define IDiaSessionEx_findChildren(This,parent,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,parent,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSessionEx_findChildrenEx(This,parent,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,parent,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSessionEx_findChildrenExByAddr(This,parent,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,parent,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSessionEx_findChildrenExByVA(This,parent,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,parent,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSessionEx_findChildrenExByRVA(This,parent,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,parent,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSessionEx_findSymbolByAddr(This,isect,offset,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByAddr(This,isect,offset,symtag,ppSymbol) ) \n\n#define IDiaSessionEx_findSymbolByRVA(This,rva,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByRVA(This,rva,symtag,ppSymbol) ) \n\n#define IDiaSessionEx_findSymbolByVA(This,va,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByVA(This,va,symtag,ppSymbol) ) \n\n#define IDiaSessionEx_findSymbolByToken(This,token,symtag,ppSymbol)\t\\\n    ( (This)->lpVtbl -> findSymbolByToken(This,token,symtag,ppSymbol) ) \n\n#define IDiaSessionEx_symsAreEquiv(This,symbolA,symbolB)\t\\\n    ( (This)->lpVtbl -> symsAreEquiv(This,symbolA,symbolB) ) \n\n#define IDiaSessionEx_symbolById(This,id,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolById(This,id,ppSymbol) ) \n\n#define IDiaSessionEx_findSymbolByRVAEx(This,rva,symtag,ppSymbol,displacement)\t\\\n    ( (This)->lpVtbl -> findSymbolByRVAEx(This,rva,symtag,ppSymbol,displacement) ) \n\n#define IDiaSessionEx_findSymbolByVAEx(This,va,symtag,ppSymbol,displacement)\t\\\n    ( (This)->lpVtbl -> findSymbolByVAEx(This,va,symtag,ppSymbol,displacement) ) \n\n#define IDiaSessionEx_findFile(This,pCompiland,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findFile(This,pCompiland,name,compareFlags,ppResult) ) \n\n#define IDiaSessionEx_findFileById(This,uniqueId,ppResult)\t\\\n    ( (This)->lpVtbl -> findFileById(This,uniqueId,ppResult) ) \n\n#define IDiaSessionEx_findLines(This,compiland,file,ppResult)\t\\\n    ( (This)->lpVtbl -> findLines(This,compiland,file,ppResult) ) \n\n#define IDiaSessionEx_findLinesByAddr(This,seg,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByAddr(This,seg,offset,length,ppResult) ) \n\n#define IDiaSessionEx_findLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSessionEx_findLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSessionEx_findLinesByLinenum(This,compiland,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findLinesByLinenum(This,compiland,file,linenum,column,ppResult) ) \n\n#define IDiaSessionEx_findInjectedSource(This,srcFile,ppResult)\t\\\n    ( (This)->lpVtbl -> findInjectedSource(This,srcFile,ppResult) ) \n\n#define IDiaSessionEx_getEnumDebugStreams(This,ppEnumDebugStreams)\t\\\n    ( (This)->lpVtbl -> getEnumDebugStreams(This,ppEnumDebugStreams) ) \n\n#define IDiaSessionEx_findInlineFramesByAddr(This,parent,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,parent,isect,offset,ppResult) ) \n\n#define IDiaSessionEx_findInlineFramesByRVA(This,parent,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,parent,rva,ppResult) ) \n\n#define IDiaSessionEx_findInlineFramesByVA(This,parent,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,parent,va,ppResult) ) \n\n#define IDiaSessionEx_findInlineeLines(This,parent,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,parent,ppResult) ) \n\n#define IDiaSessionEx_findInlineeLinesByAddr(This,parent,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,parent,isect,offset,length,ppResult) ) \n\n#define IDiaSessionEx_findInlineeLinesByRVA(This,parent,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,parent,rva,length,ppResult) ) \n\n#define IDiaSessionEx_findInlineeLinesByVA(This,parent,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,parent,va,length,ppResult) ) \n\n#define IDiaSessionEx_findInlineeLinesByLinenum(This,compiland,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByLinenum(This,compiland,file,linenum,column,ppResult) ) \n\n#define IDiaSessionEx_findInlineesByName(This,name,option,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineesByName(This,name,option,ppResult) ) \n\n#define IDiaSessionEx_findAcceleratorInlineeLinesByLinenum(This,parent,file,linenum,column,ppResult)\t\\\n    ( (This)->lpVtbl -> findAcceleratorInlineeLinesByLinenum(This,parent,file,linenum,column,ppResult) ) \n\n#define IDiaSessionEx_findSymbolsForAcceleratorPointerTag(This,parent,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,parent,tagValue,ppResult) ) \n\n#define IDiaSessionEx_findSymbolsByRVAForAcceleratorPointerTag(This,parent,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,parent,tagValue,rva,ppResult) ) \n\n#define IDiaSessionEx_findAcceleratorInlineesByName(This,name,option,ppResult)\t\\\n    ( (This)->lpVtbl -> findAcceleratorInlineesByName(This,name,option,ppResult) ) \n\n#define IDiaSessionEx_addressForVA(This,va,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForVA(This,va,pISect,pOffset) ) \n\n#define IDiaSessionEx_addressForRVA(This,rva,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForRVA(This,rva,pISect,pOffset) ) \n\n#define IDiaSessionEx_findILOffsetsByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSessionEx_findILOffsetsByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSessionEx_findILOffsetsByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findILOffsetsByVA(This,va,length,ppResult) ) \n\n#define IDiaSessionEx_findInputAssemblyFiles(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFiles(This,ppResult) ) \n\n#define IDiaSessionEx_findInputAssembly(This,index,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssembly(This,index,ppResult) ) \n\n#define IDiaSessionEx_findInputAssemblyById(This,uniqueId,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyById(This,uniqueId,ppResult) ) \n\n#define IDiaSessionEx_getFuncMDTokenMapSize(This,pcb)\t\\\n    ( (This)->lpVtbl -> getFuncMDTokenMapSize(This,pcb) ) \n\n#define IDiaSessionEx_getFuncMDTokenMap(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> getFuncMDTokenMap(This,cb,pcb,pb) ) \n\n#define IDiaSessionEx_getTypeMDTokenMapSize(This,pcb)\t\\\n    ( (This)->lpVtbl -> getTypeMDTokenMapSize(This,pcb) ) \n\n#define IDiaSessionEx_getTypeMDTokenMap(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> getTypeMDTokenMap(This,cb,pcb,pb) ) \n\n#define IDiaSessionEx_getNumberOfFunctionFragments_VA(This,vaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> getNumberOfFunctionFragments_VA(This,vaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaSessionEx_getNumberOfFunctionFragments_RVA(This,rvaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> getNumberOfFunctionFragments_RVA(This,rvaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaSessionEx_getFunctionFragments_VA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> getFunctionFragments_VA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment) ) \n\n#define IDiaSessionEx_getFunctionFragments_RVA(This,rvaFunc,cbFunc,cFragments,pRvaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> getFunctionFragments_RVA(This,rvaFunc,cbFunc,cFragments,pRvaFragment,pLenFragment) ) \n\n#define IDiaSessionEx_getExports(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getExports(This,ppResult) ) \n\n#define IDiaSessionEx_getHeapAllocationSites(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getHeapAllocationSites(This,ppResult) ) \n\n#define IDiaSessionEx_findInputAssemblyFile(This,pSymbol,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,pSymbol,ppResult) ) \n\n\n#define IDiaSessionEx_isFastLinkPDB(This,pfFastLinkPDB)\t\\\n    ( (This)->lpVtbl -> isFastLinkPDB(This,pfFastLinkPDB) ) \n\n#define IDiaSessionEx_isPortablePDB(This,pfPortablePDB)\t\\\n    ( (This)->lpVtbl -> isPortablePDB(This,pfPortablePDB) ) \n\n#define IDiaSessionEx_getSourceLinkInfo(This,parent,ppenum)\t\\\n    ( (This)->lpVtbl -> getSourceLinkInfo(This,parent,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaSessionEx_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol_INTERFACE_DEFINED__\n#define __IDiaSymbol_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"cb787b2f-bd6c-4635-ba52-933126bd2dcd\")\n    IDiaSymbol : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_symIndexId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_symTag( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_name( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lexicalParent( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_classParent( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_type( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_dataKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_locationType( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_registerId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_offset( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_length( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_slot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_volatileType( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_constType( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_unalignedType( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_access( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_libraryName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_platform( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_language( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_editAndContinueEnabled( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frontEndMajor( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frontEndMinor( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frontEndBuild( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_backEndMajor( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_backEndMinor( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_backEndBuild( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sourceFileName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_unused( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_thunkOrdinal( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_thisAdjust( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualBaseOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtual( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_intro( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_pure( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_callingConvention( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_value( \n            /* [retval][out] */ VARIANT *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_baseType( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_token( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_timeStamp( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_guid( \n            /* [retval][out] */ GUID *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_symbolsFileName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_reference( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_count( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_bitPosition( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_arrayIndexType( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_packed( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_constructor( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_overloadedOperator( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_nested( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasNestedTypes( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasAssignmentOperator( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasCastOperator( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_scoped( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualBaseClass( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_indirectVirtualBaseClass( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualBasePointerOffset( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualTableShape( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lexicalParentId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_classParentId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_typeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_arrayIndexTypeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualTableShapeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_code( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_function( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_managed( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_msil( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualBaseDispIndex( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_undecoratedName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_age( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_signature( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compilerGenerated( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressTaken( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_rank( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lowerBound( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_upperBound( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lowerBoundId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_upperBoundId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_dataBytes( \n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildren( \n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenEx( \n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByAddr( \n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByVA( \n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findChildrenExByRVA( \n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_targetSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_targetOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_targetRelativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_targetVirtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_machineType( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_oemId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_oemSymbolId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_types( \n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_typeIds( \n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_objectPointerType( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_udtKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_undecoratedNameEx( \n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_noReturn( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_customCallingConvention( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_noInline( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_optimizedCodeDebugInfo( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_notReached( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_interruptReturn( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_farReturn( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isStatic( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasDebugInfo( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isLTCG( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isDataAligned( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasSecurityChecks( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compilerName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasAlloca( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasSetJump( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasLongJump( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasInlAsm( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasEH( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasSEH( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasEHa( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isNaked( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isAggregated( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isSplitted( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_container( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_inlSpec( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_noStackOrdering( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualBaseTableType( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasManagedCode( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isHotpatchable( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isCVTCIL( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isMSILNetmodule( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isCTypes( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isStripped( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frontEndQFE( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_backEndQFE( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_wasInlined( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_strictGSCheck( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isCxxReturnUdt( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isConstructorVirtualBase( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_RValueReference( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_unmodifiedType( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_framePointerPresent( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isSafeBuffers( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_intrinsic( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sealed( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hfaFloat( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hfaDouble( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_liveRangeStartAddressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_liveRangeStartAddressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_liveRangeStartRelativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_countLiveRanges( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_liveRangeLength( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_offsetInUdt( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_paramBasePointerRegisterId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_localBasePointerRegisterId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isLocationControlFlowDependent( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_stride( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_numberOfRows( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_numberOfColumns( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isMatrixRowMajor( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_numericProperties( \n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_modifierValues( \n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isReturnValue( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isOptimizedAway( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_builtInKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_registerType( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_baseDataSlot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_baseDataOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_textureSlot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_samplerSlot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_uavSlot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sizeInUdt( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_memorySpaceKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_unmodifiedTypeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_subTypeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_subType( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_numberOfModifiers( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_numberOfRegisterIndices( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isHLSLData( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isPointerToDataMember( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isPointerToMemberFunction( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isSingleInheritance( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isMultipleInheritance( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isVirtualInheritance( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_restrictedType( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isPointerBasedOnSymbolValue( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_baseSymbol( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_baseSymbolId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_objectFileName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isAcceleratorGroupSharedLocal( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isAcceleratorPointerTagLiveRange( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isAcceleratorStubFunction( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_numberOfAcceleratorPointerTags( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isSdl( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isWinRTPointer( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isRefUdt( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isValueUdt( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isInterfaceUdt( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByAddr( \n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByRVA( \n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineFramesByVA( \n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLines( \n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByAddr( \n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByRVA( \n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInlineeLinesByVA( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolsForAcceleratorPointerTag( \n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findSymbolsByRVAForAcceleratorPointerTag( \n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_acceleratorPointerTags( \n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getSrcLineOnTypeDefn( \n            /* [out] */ IDiaLineNumber **ppResult) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isPGO( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasValidPGOCounts( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isOptimizedForSpeed( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PGOEntryCount( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PGOEdgeCount( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PGODynamicInstructionCount( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_staticSize( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_finalLiveStaticSize( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_phaseName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasControlFlowCheck( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_constantExport( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_dataExport( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_privateExport( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_noNameExport( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exportHasExplicitlyAssignedOrdinal( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exportIsForwarder( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ordinal( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frameSize( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exceptionHandlerAddressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exceptionHandlerAddressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exceptionHandlerRelativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_exceptionHandlerVirtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE findInputAssemblyFile( \n            /* [out] */ IDiaInputAssemblyFile **ppResult) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_characteristics( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_coffGroup( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_bindID( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_bindSpace( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_bindSlot( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbolVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbolVtbl;\n\n    interface IDiaSymbol\n    {\n        CONST_VTBL struct IDiaSymbolVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_virtualBaseTableType_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_virtualBaseTableType_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_hasManagedCode_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_hasManagedCode_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isHotpatchable_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isHotpatchable_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isCVTCIL_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isCVTCIL_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isMSILNetmodule_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isMSILNetmodule_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isCTypes_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isCTypes_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isStripped_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isStripped_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_frontEndQFE_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_frontEndQFE_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_backEndQFE_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_backEndQFE_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_wasInlined_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_wasInlined_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_strictGSCheck_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_strictGSCheck_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isCxxReturnUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isCxxReturnUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isConstructorVirtualBase_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isConstructorVirtualBase_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_RValueReference_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_RValueReference_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_unmodifiedType_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_unmodifiedType_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_framePointerPresent_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_framePointerPresent_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isSafeBuffers_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isSafeBuffers_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_intrinsic_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_intrinsic_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_sealed_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_sealed_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_hfaFloat_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_hfaFloat_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_hfaDouble_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_hfaDouble_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_liveRangeStartAddressSection_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_liveRangeStartAddressSection_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_liveRangeStartAddressOffset_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_liveRangeStartAddressOffset_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_liveRangeStartRelativeVirtualAddress_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_liveRangeStartRelativeVirtualAddress_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_countLiveRanges_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_countLiveRanges_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_liveRangeLength_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ ULONGLONG *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_liveRangeLength_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_offsetInUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_offsetInUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_paramBasePointerRegisterId_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_paramBasePointerRegisterId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_localBasePointerRegisterId_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_localBasePointerRegisterId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isLocationControlFlowDependent_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isLocationControlFlowDependent_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_stride_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_stride_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_numberOfRows_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numberOfRows_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_numberOfColumns_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numberOfColumns_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isMatrixRowMajor_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isMatrixRowMajor_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_get_numericProperties_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD cnt,\n    /* [out] */ DWORD *pcnt,\n    /* [size_is][out] */ DWORD *pProperties);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numericProperties_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_get_modifierValues_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD cnt,\n    /* [out] */ DWORD *pcnt,\n    /* [size_is][out] */ WORD *pModifiers);\n\n\nvoid __RPC_STUB IDiaSymbol_get_modifierValues_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isReturnValue_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isReturnValue_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isOptimizedAway_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isOptimizedAway_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_builtInKind_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_builtInKind_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_registerType_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_registerType_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_baseDataSlot_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_baseDataSlot_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_baseDataOffset_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_baseDataOffset_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_textureSlot_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_textureSlot_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_samplerSlot_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_samplerSlot_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_uavSlot_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_uavSlot_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_sizeInUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_sizeInUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_memorySpaceKind_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_memorySpaceKind_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_unmodifiedTypeId_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_unmodifiedTypeId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_subTypeId_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_subTypeId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_subType_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_subType_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_numberOfModifiers_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numberOfModifiers_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_numberOfRegisterIndices_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numberOfRegisterIndices_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isHLSLData_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isHLSLData_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isPointerToDataMember_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isPointerToDataMember_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isPointerToMemberFunction_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isPointerToMemberFunction_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isSingleInheritance_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isSingleInheritance_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isMultipleInheritance_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isMultipleInheritance_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isVirtualInheritance_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isVirtualInheritance_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_restrictedType_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_restrictedType_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isPointerBasedOnSymbolValue_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isPointerBasedOnSymbolValue_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_baseSymbol_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_baseSymbol_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_baseSymbolId_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_baseSymbolId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_objectFileName_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BSTR *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_objectFileName_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isAcceleratorGroupSharedLocal_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isAcceleratorGroupSharedLocal_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isAcceleratorPointerTagLiveRange_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isAcceleratorPointerTagLiveRange_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isAcceleratorStubFunction_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isAcceleratorStubFunction_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_numberOfAcceleratorPointerTags_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_numberOfAcceleratorPointerTags_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isSdl_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isSdl_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isWinRTPointer_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isWinRTPointer_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isRefUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isRefUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isValueUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isValueUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isInterfaceUdt_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isInterfaceUdt_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineFramesByAddr_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD isect,\n    /* [in] */ DWORD offset,\n    /* [out] */ IDiaEnumSymbols **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineFramesByAddr_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineFramesByRVA_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD rva,\n    /* [out] */ IDiaEnumSymbols **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineFramesByRVA_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineFramesByVA_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ ULONGLONG va,\n    /* [out] */ IDiaEnumSymbols **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineFramesByVA_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineeLines_Proxy( \n    IDiaSymbol * This,\n    /* [out] */ IDiaEnumLineNumbers **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineeLines_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineeLinesByAddr_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD isect,\n    /* [in] */ DWORD offset,\n    /* [in] */ DWORD length,\n    /* [out] */ IDiaEnumLineNumbers **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineeLinesByAddr_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineeLinesByRVA_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD rva,\n    /* [in] */ DWORD length,\n    /* [out] */ IDiaEnumLineNumbers **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineeLinesByRVA_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInlineeLinesByVA_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ ULONGLONG va,\n    /* [in] */ DWORD length,\n    /* [out] */ IDiaEnumLineNumbers **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInlineeLinesByVA_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findSymbolsForAcceleratorPointerTag_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD tagValue,\n    /* [out] */ IDiaEnumSymbols **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findSymbolsForAcceleratorPointerTag_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findSymbolsByRVAForAcceleratorPointerTag_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD tagValue,\n    /* [in] */ DWORD rva,\n    /* [out] */ IDiaEnumSymbols **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findSymbolsByRVAForAcceleratorPointerTag_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_get_acceleratorPointerTags_Proxy( \n    IDiaSymbol * This,\n    /* [in] */ DWORD cnt,\n    /* [out] */ DWORD *pcnt,\n    /* [size_is][out] */ DWORD *pPointerTags);\n\n\nvoid __RPC_STUB IDiaSymbol_get_acceleratorPointerTags_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_getSrcLineOnTypeDefn_Proxy( \n    IDiaSymbol * This,\n    /* [out] */ IDiaLineNumber **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_getSrcLineOnTypeDefn_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isPGO_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isPGO_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_hasValidPGOCounts_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_hasValidPGOCounts_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_isOptimizedForSpeed_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_isOptimizedForSpeed_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_PGOEntryCount_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_PGOEntryCount_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_PGOEdgeCount_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_PGOEdgeCount_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_PGODynamicInstructionCount_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ ULONGLONG *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_PGODynamicInstructionCount_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_staticSize_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_staticSize_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_finalLiveStaticSize_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_finalLiveStaticSize_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_phaseName_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BSTR *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_phaseName_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_hasControlFlowCheck_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_hasControlFlowCheck_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_constantExport_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_constantExport_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_dataExport_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_dataExport_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_privateExport_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_privateExport_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_noNameExport_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_noNameExport_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exportHasExplicitlyAssignedOrdinal_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exportHasExplicitlyAssignedOrdinal_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exportIsForwarder_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exportIsForwarder_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_ordinal_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_ordinal_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_frameSize_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_frameSize_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exceptionHandlerAddressSection_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exceptionHandlerAddressSection_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exceptionHandlerAddressOffset_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exceptionHandlerAddressOffset_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exceptionHandlerRelativeVirtualAddress_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exceptionHandlerRelativeVirtualAddress_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_exceptionHandlerVirtualAddress_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ ULONGLONG *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_exceptionHandlerVirtualAddress_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol_findInputAssemblyFile_Proxy( \n    IDiaSymbol * This,\n    /* [out] */ IDiaInputAssemblyFile **ppResult);\n\n\nvoid __RPC_STUB IDiaSymbol_findInputAssemblyFile_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_characteristics_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_characteristics_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_coffGroup_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_coffGroup_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_bindID_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_bindID_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_bindSpace_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_bindSpace_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol_get_bindSlot_Proxy( \n    IDiaSymbol * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol_get_bindSlot_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol2_INTERFACE_DEFINED__\n#define __IDiaSymbol2_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"611e86cd-b7d1-4546-8a15-070e2b07a427\")\n    IDiaSymbol2 : public IDiaSymbol\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isObjCClass( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isObjCCategory( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isObjCProtocol( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol2 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol2 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol2 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol2 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol2 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol2 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol2 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol2 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol2 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol2Vtbl;\n\n    interface IDiaSymbol2\n    {\n        CONST_VTBL struct IDiaSymbol2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol2_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol2_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol2_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol2_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol2_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol2_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol2_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol2_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol2_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol2_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol2_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol2_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol2_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol2_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol2_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol2_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol2_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol2_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol2_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol2_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol2_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol2_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol2_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol2_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol2_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol2_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol2_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol2_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol2_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol2_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol2_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol2_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol2_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol2_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol2_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol2_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol2_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol2_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol2_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol2_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol2_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol2_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol2_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol2_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol2_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol2_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol2_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol2_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol2_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol2_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol2_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol2_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol2_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol2_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol2_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol2_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol2_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol2_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol2_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol2_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol2_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol2_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol2_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol2_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol2_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol2_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol2_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol2_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol2_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol2_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol2_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol2_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol2_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol2_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol2_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol2_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol2_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol2_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol2_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol2_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol2_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol2_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol2_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol2_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol2_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol2_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol2_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol2_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol2_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol2_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol2_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol2_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol2_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol2_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol2_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol2_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol2_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol2_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol2_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol2_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol2_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol2_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol2_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol2_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol2_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol2_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol2_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol2_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol2_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol2_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol2_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol2_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol2_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol2_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol2_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol2_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol2_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol2_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol2_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol2_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol2_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol2_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol2_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol2_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol2_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol2_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol2_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol2_get_isObjCClass_Proxy( \n    IDiaSymbol2 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol2_get_isObjCClass_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol2_get_isObjCCategory_Proxy( \n    IDiaSymbol2 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol2_get_isObjCCategory_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol2_get_isObjCProtocol_Proxy( \n    IDiaSymbol2 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol2_get_isObjCProtocol_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol3_INTERFACE_DEFINED__\n#define __IDiaSymbol3_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol3 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol3;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"99b665f7-c1b2-49d3-89b2-a384361acab5\")\n    IDiaSymbol3 : public IDiaSymbol2\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_inlinee( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_inlineeId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol3Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol3 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol3 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol3 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol3 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol3 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol3 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol3 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol3 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol3 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol3 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol3 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol3 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol3Vtbl;\n\n    interface IDiaSymbol3\n    {\n        CONST_VTBL struct IDiaSymbol3Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol3_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol3_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol3_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol3_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol3_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol3_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol3_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol3_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol3_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol3_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol3_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol3_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol3_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol3_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol3_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol3_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol3_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol3_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol3_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol3_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol3_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol3_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol3_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol3_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol3_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol3_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol3_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol3_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol3_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol3_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol3_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol3_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol3_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol3_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol3_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol3_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol3_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol3_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol3_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol3_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol3_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol3_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol3_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol3_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol3_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol3_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol3_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol3_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol3_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol3_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol3_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol3_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol3_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol3_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol3_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol3_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol3_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol3_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol3_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol3_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol3_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol3_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol3_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol3_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol3_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol3_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol3_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol3_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol3_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol3_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol3_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol3_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol3_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol3_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol3_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol3_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol3_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol3_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol3_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol3_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol3_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol3_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol3_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol3_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol3_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol3_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol3_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol3_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol3_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol3_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol3_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol3_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol3_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol3_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol3_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol3_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol3_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol3_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol3_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol3_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol3_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol3_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol3_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol3_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol3_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol3_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol3_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol3_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol3_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol3_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol3_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol3_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol3_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol3_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol3_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol3_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol3_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol3_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol3_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol3_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol3_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol3_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol3_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol3_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol3_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol3_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol3_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol3_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol3_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol3_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol3_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol3_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol3_get_inlinee_Proxy( \n    IDiaSymbol3 * This,\n    /* [retval][out] */ IDiaSymbol **pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol3_get_inlinee_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol3_get_inlineeId_Proxy( \n    IDiaSymbol3 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol3_get_inlineeId_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol3_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol4_INTERFACE_DEFINED__\n#define __IDiaSymbol4_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol4 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol4;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"bf6c88a7-e9d6-4346-99a1-d053de5a7808\")\n    IDiaSymbol4 : public IDiaSymbol3\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_noexcept( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol4Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol4 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol4 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol4 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol4 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol4 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol4 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol4 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol4 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol4 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol4 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol4 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol4 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol4Vtbl;\n\n    interface IDiaSymbol4\n    {\n        CONST_VTBL struct IDiaSymbol4Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol4_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol4_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol4_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol4_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol4_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol4_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol4_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol4_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol4_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol4_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol4_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol4_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol4_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol4_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol4_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol4_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol4_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol4_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol4_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol4_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol4_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol4_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol4_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol4_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol4_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol4_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol4_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol4_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol4_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol4_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol4_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol4_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol4_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol4_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol4_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol4_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol4_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol4_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol4_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol4_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol4_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol4_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol4_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol4_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol4_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol4_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol4_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol4_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol4_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol4_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol4_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol4_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol4_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol4_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol4_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol4_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol4_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol4_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol4_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol4_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol4_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol4_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol4_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol4_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol4_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol4_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol4_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol4_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol4_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol4_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol4_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol4_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol4_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol4_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol4_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol4_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol4_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol4_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol4_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol4_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol4_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol4_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol4_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol4_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol4_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol4_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol4_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol4_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol4_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol4_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol4_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol4_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol4_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol4_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol4_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol4_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol4_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol4_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol4_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol4_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol4_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol4_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol4_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol4_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol4_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol4_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol4_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol4_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol4_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol4_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol4_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol4_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol4_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol4_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol4_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol4_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol4_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol4_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol4_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol4_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol4_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol4_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol4_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol4_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol4_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol4_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol4_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol4_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol4_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol4_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol4_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol4_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol4_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol4_get_noexcept_Proxy( \n    IDiaSymbol4 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol4_get_noexcept_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol4_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol5_INTERFACE_DEFINED__\n#define __IDiaSymbol5_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol5 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol5;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"abe2de00-dc2d-4793-af9a-ef1d90832644\")\n    IDiaSymbol5 : public IDiaSymbol4\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_hasAbsoluteAddress( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol5Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol5 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol5 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol5 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol5 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol5 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol5 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol5 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol5 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol5 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol5 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol5 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol5 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol5Vtbl;\n\n    interface IDiaSymbol5\n    {\n        CONST_VTBL struct IDiaSymbol5Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol5_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol5_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol5_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol5_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol5_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol5_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol5_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol5_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol5_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol5_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol5_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol5_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol5_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol5_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol5_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol5_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol5_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol5_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol5_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol5_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol5_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol5_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol5_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol5_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol5_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol5_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol5_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol5_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol5_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol5_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol5_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol5_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol5_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol5_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol5_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol5_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol5_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol5_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol5_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol5_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol5_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol5_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol5_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol5_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol5_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol5_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol5_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol5_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol5_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol5_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol5_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol5_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol5_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol5_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol5_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol5_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol5_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol5_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol5_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol5_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol5_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol5_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol5_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol5_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol5_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol5_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol5_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol5_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol5_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol5_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol5_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol5_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol5_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol5_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol5_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol5_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol5_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol5_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol5_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol5_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol5_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol5_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol5_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol5_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol5_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol5_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol5_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol5_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol5_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol5_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol5_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol5_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol5_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol5_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol5_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol5_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol5_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol5_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol5_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol5_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol5_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol5_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol5_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol5_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol5_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol5_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol5_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol5_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol5_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol5_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol5_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol5_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol5_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol5_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol5_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol5_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol5_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol5_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol5_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol5_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol5_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol5_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol5_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol5_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol5_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol5_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol5_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol5_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol5_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol5_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol5_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol5_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol5_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol5_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol5_get_hasAbsoluteAddress_Proxy( \n    IDiaSymbol5 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol5_get_hasAbsoluteAddress_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol5_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol6_INTERFACE_DEFINED__\n#define __IDiaSymbol6_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol6 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol6;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"8133dad3-75fe-4234-ac7e-f8e7a1d3cbb3\")\n    IDiaSymbol6 : public IDiaSymbol5\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isStaticMemberFunc( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol6Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol6 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol6 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol6 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol6 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol6 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol6 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol6 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol6 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol6 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol6 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol6 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol6 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol6Vtbl;\n\n    interface IDiaSymbol6\n    {\n        CONST_VTBL struct IDiaSymbol6Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol6_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol6_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol6_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol6_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol6_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol6_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol6_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol6_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol6_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol6_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol6_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol6_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol6_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol6_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol6_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol6_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol6_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol6_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol6_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol6_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol6_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol6_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol6_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol6_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol6_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol6_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol6_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol6_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol6_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol6_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol6_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol6_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol6_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol6_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol6_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol6_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol6_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol6_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol6_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol6_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol6_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol6_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol6_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol6_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol6_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol6_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol6_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol6_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol6_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol6_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol6_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol6_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol6_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol6_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol6_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol6_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol6_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol6_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol6_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol6_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol6_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol6_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol6_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol6_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol6_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol6_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol6_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol6_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol6_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol6_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol6_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol6_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol6_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol6_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol6_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol6_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol6_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol6_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol6_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol6_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol6_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol6_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol6_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol6_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol6_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol6_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol6_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol6_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol6_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol6_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol6_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol6_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol6_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol6_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol6_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol6_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol6_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol6_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol6_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol6_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol6_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol6_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol6_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol6_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol6_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol6_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol6_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol6_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol6_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol6_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol6_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol6_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol6_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol6_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol6_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol6_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol6_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol6_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol6_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol6_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol6_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol6_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol6_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol6_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol6_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol6_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol6_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol6_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol6_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol6_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol6_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol6_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol6_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol6_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol6_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol6_get_isStaticMemberFunc_Proxy( \n    IDiaSymbol6 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol6_get_isStaticMemberFunc_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol6_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol7_INTERFACE_DEFINED__\n#define __IDiaSymbol7_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol7 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol7;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"64ce6cd5-7315-4328-86d6-10e303e010b4\")\n    IDiaSymbol7 : public IDiaSymbol6\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isSignRet( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol7Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol7 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol7 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol7 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol7 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol7 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol7 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol7 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol7 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol7 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol7 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol7 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSignRet )( \n            IDiaSymbol7 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol7Vtbl;\n\n    interface IDiaSymbol7\n    {\n        CONST_VTBL struct IDiaSymbol7Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol7_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol7_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol7_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol7_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol7_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol7_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol7_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol7_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol7_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol7_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol7_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol7_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol7_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol7_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol7_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol7_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol7_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol7_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol7_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol7_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol7_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol7_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol7_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol7_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol7_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol7_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol7_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol7_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol7_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol7_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol7_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol7_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol7_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol7_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol7_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol7_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol7_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol7_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol7_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol7_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol7_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol7_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol7_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol7_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol7_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol7_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol7_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol7_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol7_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol7_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol7_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol7_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol7_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol7_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol7_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol7_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol7_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol7_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol7_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol7_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol7_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol7_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol7_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol7_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol7_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol7_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol7_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol7_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol7_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol7_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol7_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol7_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol7_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol7_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol7_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol7_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol7_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol7_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol7_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol7_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol7_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol7_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol7_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol7_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol7_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol7_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol7_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol7_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol7_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol7_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol7_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol7_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol7_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol7_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol7_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol7_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol7_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol7_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol7_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol7_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol7_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol7_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol7_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol7_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol7_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol7_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol7_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol7_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol7_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol7_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol7_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol7_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol7_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol7_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol7_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol7_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol7_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol7_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol7_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol7_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol7_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol7_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol7_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol7_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol7_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol7_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol7_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol7_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol7_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol7_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n\n#define IDiaSymbol7_get_isSignRet(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSignRet(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol7_get_isSignRet_Proxy( \n    IDiaSymbol7 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol7_get_isSignRet_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol7_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol8_INTERFACE_DEFINED__\n#define __IDiaSymbol8_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol8 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol8;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"7f2e041f-1294-41bd-b83a-e715972d2ce3\")\n    IDiaSymbol8 : public IDiaSymbol7\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_coroutineKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_associatedSymbolKind( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_associatedSymbolSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_associatedSymbolOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_associatedSymbolRva( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_associatedSymbolAddr( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol8Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol8 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol8 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol8 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol8 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol8 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol8 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol8 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol8 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol8 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol8 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol8 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSignRet )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coroutineKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolKind )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolSection )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolOffset )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolRva )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolAddr )( \n            IDiaSymbol8 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol8Vtbl;\n\n    interface IDiaSymbol8\n    {\n        CONST_VTBL struct IDiaSymbol8Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol8_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol8_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol8_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol8_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol8_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol8_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol8_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol8_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol8_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol8_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol8_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol8_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol8_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol8_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol8_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol8_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol8_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol8_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol8_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol8_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol8_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol8_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol8_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol8_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol8_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol8_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol8_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol8_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol8_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol8_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol8_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol8_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol8_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol8_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol8_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol8_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol8_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol8_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol8_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol8_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol8_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol8_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol8_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol8_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol8_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol8_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol8_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol8_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol8_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol8_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol8_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol8_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol8_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol8_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol8_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol8_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol8_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol8_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol8_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol8_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol8_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol8_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol8_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol8_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol8_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol8_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol8_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol8_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol8_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol8_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol8_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol8_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol8_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol8_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol8_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol8_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol8_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol8_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol8_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol8_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol8_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol8_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol8_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol8_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol8_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol8_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol8_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol8_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol8_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol8_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol8_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol8_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol8_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol8_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol8_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol8_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol8_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol8_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol8_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol8_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol8_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol8_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol8_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol8_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol8_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol8_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol8_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol8_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol8_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol8_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol8_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol8_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol8_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol8_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol8_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol8_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol8_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol8_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol8_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol8_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol8_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol8_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol8_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol8_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol8_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol8_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_isSignRet(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSignRet(This,pRetVal) ) \n\n\n#define IDiaSymbol8_get_coroutineKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coroutineKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_associatedSymbolKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolKind(This,pRetVal) ) \n\n#define IDiaSymbol8_get_associatedSymbolSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolSection(This,pRetVal) ) \n\n#define IDiaSymbol8_get_associatedSymbolOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolOffset(This,pRetVal) ) \n\n#define IDiaSymbol8_get_associatedSymbolRva(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolRva(This,pRetVal) ) \n\n#define IDiaSymbol8_get_associatedSymbolAddr(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolAddr(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_coroutineKind_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_coroutineKind_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_associatedSymbolKind_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_associatedSymbolKind_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_associatedSymbolSection_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_associatedSymbolSection_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_associatedSymbolOffset_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_associatedSymbolOffset_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_associatedSymbolRva_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_associatedSymbolRva_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol8_get_associatedSymbolAddr_Proxy( \n    IDiaSymbol8 * This,\n    /* [retval][out] */ ULONGLONG *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol8_get_associatedSymbolAddr_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol8_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol9_INTERFACE_DEFINED__\n#define __IDiaSymbol9_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol9 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol9;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"a89e5969-92a1-4f8a-b704-00121c37abbb\")\n    IDiaSymbol9 : public IDiaSymbol8\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_framePadSize( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_framePadOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_isRTCs( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol9Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol9 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol9 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol9 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol9 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol9 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol9 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol9 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol9 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol9 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol9 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol9 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSignRet )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coroutineKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolKind )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolSection )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolRva )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolAddr )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadSize )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadOffset )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRTCs )( \n            IDiaSymbol9 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSymbol9Vtbl;\n\n    interface IDiaSymbol9\n    {\n        CONST_VTBL struct IDiaSymbol9Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol9_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol9_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol9_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol9_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol9_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol9_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol9_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol9_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol9_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol9_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol9_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol9_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol9_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol9_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol9_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol9_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol9_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol9_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol9_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol9_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol9_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol9_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol9_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol9_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol9_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol9_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol9_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol9_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol9_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol9_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol9_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol9_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol9_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol9_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol9_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol9_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol9_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol9_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol9_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol9_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol9_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol9_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol9_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol9_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol9_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol9_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol9_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol9_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol9_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol9_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol9_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol9_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol9_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol9_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol9_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol9_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol9_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol9_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol9_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol9_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol9_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol9_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol9_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol9_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol9_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol9_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol9_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol9_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol9_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol9_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol9_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol9_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol9_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol9_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol9_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol9_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol9_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol9_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol9_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol9_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol9_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol9_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol9_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol9_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol9_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol9_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol9_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol9_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol9_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol9_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol9_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol9_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol9_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol9_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol9_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol9_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol9_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol9_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol9_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol9_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol9_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol9_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol9_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol9_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol9_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol9_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol9_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol9_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol9_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol9_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol9_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol9_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol9_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol9_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol9_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol9_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol9_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol9_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol9_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol9_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol9_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol9_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol9_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol9_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol9_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_isSignRet(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSignRet(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_coroutineKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coroutineKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_associatedSymbolKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolKind(This,pRetVal) ) \n\n#define IDiaSymbol9_get_associatedSymbolSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolSection(This,pRetVal) ) \n\n#define IDiaSymbol9_get_associatedSymbolOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_associatedSymbolRva(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolRva(This,pRetVal) ) \n\n#define IDiaSymbol9_get_associatedSymbolAddr(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolAddr(This,pRetVal) ) \n\n\n#define IDiaSymbol9_get_framePadSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadSize(This,pRetVal) ) \n\n#define IDiaSymbol9_get_framePadOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadOffset(This,pRetVal) ) \n\n#define IDiaSymbol9_get_isRTCs(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRTCs(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol9_get_framePadSize_Proxy( \n    IDiaSymbol9 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol9_get_framePadSize_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol9_get_framePadOffset_Proxy( \n    IDiaSymbol9 * This,\n    /* [retval][out] */ DWORD *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol9_get_framePadOffset_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IDiaSymbol9_get_isRTCs_Proxy( \n    IDiaSymbol9 * This,\n    /* [retval][out] */ BOOL *pRetVal);\n\n\nvoid __RPC_STUB IDiaSymbol9_get_isRTCs_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol9_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSymbol10_INTERFACE_DEFINED__\n#define __IDiaSymbol10_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol10 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol10;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"9034a70b-b0b7-4605-8a97-33772f3a7b8c\")\n    IDiaSymbol10 : public IDiaSymbol9\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE get_sourceLink( \n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol10Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol10 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol10 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol10 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol10 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol10 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol10 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol10 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol10 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol10 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol10 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSignRet )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coroutineKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolKind )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolSection )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolRva )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolAddr )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadSize )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadOffset )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRTCs )( \n            IDiaSymbol10 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_sourceLink )( \n            IDiaSymbol10 * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        END_INTERFACE\n    } IDiaSymbol10Vtbl;\n\n    interface IDiaSymbol10\n    {\n        CONST_VTBL struct IDiaSymbol10Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol10_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol10_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol10_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol10_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol10_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol10_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol10_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol10_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol10_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol10_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol10_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol10_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol10_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol10_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol10_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol10_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol10_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol10_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol10_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol10_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol10_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol10_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol10_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol10_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol10_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol10_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol10_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol10_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol10_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol10_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol10_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol10_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol10_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol10_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol10_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol10_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol10_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol10_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol10_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol10_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol10_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol10_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol10_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol10_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol10_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol10_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol10_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol10_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol10_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol10_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol10_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol10_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol10_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol10_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol10_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol10_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol10_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol10_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol10_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol10_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol10_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol10_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol10_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol10_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol10_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol10_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol10_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol10_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol10_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol10_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol10_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol10_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol10_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol10_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol10_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol10_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol10_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol10_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol10_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol10_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol10_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol10_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol10_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol10_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol10_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol10_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol10_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol10_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol10_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol10_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol10_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol10_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol10_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol10_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol10_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol10_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol10_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol10_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol10_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol10_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol10_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol10_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol10_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol10_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol10_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol10_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol10_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol10_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol10_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol10_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol10_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol10_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol10_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol10_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol10_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol10_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol10_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol10_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol10_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol10_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol10_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol10_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol10_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol10_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol10_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_isSignRet(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSignRet(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_coroutineKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coroutineKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_associatedSymbolKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolKind(This,pRetVal) ) \n\n#define IDiaSymbol10_get_associatedSymbolSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolSection(This,pRetVal) ) \n\n#define IDiaSymbol10_get_associatedSymbolOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_associatedSymbolRva(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolRva(This,pRetVal) ) \n\n#define IDiaSymbol10_get_associatedSymbolAddr(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolAddr(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_framePadSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadSize(This,pRetVal) ) \n\n#define IDiaSymbol10_get_framePadOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadOffset(This,pRetVal) ) \n\n#define IDiaSymbol10_get_isRTCs(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRTCs(This,pRetVal) ) \n\n\n#define IDiaSymbol10_get_sourceLink(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> get_sourceLink(This,cb,pcb,pb) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol10_get_sourceLink_Proxy( \n    IDiaSymbol10 * This,\n    /* [in] */ DWORD cb,\n    /* [out] */ DWORD *pcb,\n    /* [size_is][out] */ BYTE *pb);\n\n\nvoid __RPC_STUB IDiaSymbol10_get_sourceLink_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol10_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_dia2_0000_0032 */\n/* [local] */ \n\nstruct DiaTagValue\n    {\n    BYTE value[ 16 ];\n    BYTE valueSizeBytes;\n    } ;\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0032_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0032_v0_0_s_ifspec;\n\n#ifndef __IDiaSymbol11_INTERFACE_DEFINED__\n#define __IDiaSymbol11_INTERFACE_DEFINED__\n\n/* interface IDiaSymbol11 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSymbol11;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"b6f54fcd-05e3-433d-b305-b0c1437d2d16\")\n    IDiaSymbol11 : public IDiaSymbol10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE get_discriminatedUnionTag( \n            /* [out] */ IDiaSymbol **ppTagType,\n            /* [out] */ DWORD *pTagOffset,\n            /* [out] */ struct DiaTagValue *pTagMask) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_tagRanges( \n            /* [in] */ DWORD count,\n            /* [out] */ DWORD *pcRangeValues,\n            /* [size_is][out] */ struct DiaTagValue *rangeValues) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSymbol11Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSymbol11 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSymbol11 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSymbol11 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symIndexId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symTag )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParent )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParent )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_locationType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_slot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_volatileType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unalignedType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_access )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_libraryName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_platform )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_language )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_editAndContinueEnabled )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMajor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndMinor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndBuild )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMajor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndMinor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndBuild )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unused )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thunkOrdinal )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_thisAdjust )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtual )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intro )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pure )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_callingConvention )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_value )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ VARIANT *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_token )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timeStamp )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_guid )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ GUID *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_symbolsFileName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_reference )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_count )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bitPosition )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_packed )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constructor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_overloadedOperator )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_nested )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasNestedTypes )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAssignmentOperator )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasCastOperator )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_scoped )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseClass )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_indirectVirtualBaseClass )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBasePointerOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShape )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lexicalParentId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_classParentId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_typeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_arrayIndexTypeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualTableShapeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_function )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_managed )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_msil )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseDispIndex )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_undecoratedName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_age )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_signature )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerGenerated )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressTaken )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_rank )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBound )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBound )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lowerBoundId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_upperBoundId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_dataBytes )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildren )( \n            IDiaSymbol11 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenEx )( \n            IDiaSymbol11 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByAddr )( \n            IDiaSymbol11 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findChildrenExByRVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ enum SymTagEnum symtag,\n            /* [in] */ LPCOLESTR name,\n            /* [in] */ DWORD compareFlags,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetSection )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetRelativeVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_targetVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_machineType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_oemSymbolId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_types )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cTypes,\n            /* [out] */ DWORD *pcTypes,\n            /* [size_is][size_is][out] */ IDiaSymbol **pTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_typeIds )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cTypeIds,\n            /* [out] */ DWORD *pcTypeIds,\n            /* [size_is][out] */ DWORD *pdwTypeIds);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectPointerType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_udtKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_undecoratedNameEx )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD undecorateOptions,\n            /* [out] */ BSTR *name);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noReturn )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_customCallingConvention )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noInline )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_optimizedCodeDebugInfo )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notReached )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_interruptReturn )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_farReturn )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStatic )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasDebugInfo )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLTCG )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isDataAligned )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSecurityChecks )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilerName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAlloca )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSetJump )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasLongJump )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasInlAsm )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEH )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasSEH )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasEHa )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isNaked )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAggregated )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSplitted )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_container )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlSpec )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noStackOrdering )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualBaseTableType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasManagedCode )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHotpatchable )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCVTCIL )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMSILNetmodule )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCTypes )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStripped )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frontEndQFE )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_backEndQFE )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_wasInlined )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_strictGSCheck )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isCxxReturnUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isConstructorVirtualBase )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RValueReference )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePointerPresent )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSafeBuffers )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_intrinsic )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sealed )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaFloat )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hfaDouble )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressSection )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartAddressOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeStartRelativeVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_countLiveRanges )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_liveRangeLength )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offsetInUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_paramBasePointerRegisterId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localBasePointerRegisterId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isLocationControlFlowDependent )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_stride )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRows )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfColumns )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMatrixRowMajor )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_numericProperties )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pProperties);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_modifierValues )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ WORD *pModifiers);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isReturnValue )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedAway )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_builtInKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataSlot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseDataOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_textureSlot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_samplerSlot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uavSlot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sizeInUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_memorySpaceKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_unmodifiedTypeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subTypeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_subType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfModifiers )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfRegisterIndices )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isHLSLData )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToDataMember )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerToMemberFunction )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSingleInheritance )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isMultipleInheritance )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isVirtualInheritance )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_restrictedType )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPointerBasedOnSymbolValue )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbol )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_baseSymbolId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFileName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorGroupSharedLocal )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorPointerTagLiveRange )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isAcceleratorStubFunction )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_numberOfAcceleratorPointerTags )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSdl )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isWinRTPointer )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRefUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isValueUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isInterfaceUdt )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByAddr )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByRVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineFramesByVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLines )( \n            IDiaSymbol11 * This,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByAddr )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD isect,\n            /* [in] */ DWORD offset,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByRVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD rva,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInlineeLinesByVA )( \n            IDiaSymbol11 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD length,\n            /* [out] */ IDiaEnumLineNumbers **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsForAcceleratorPointerTag )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD tagValue,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *findSymbolsByRVAForAcceleratorPointerTag )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD tagValue,\n            /* [in] */ DWORD rva,\n            /* [out] */ IDiaEnumSymbols **ppResult);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_acceleratorPointerTags )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cnt,\n            /* [out] */ DWORD *pcnt,\n            /* [size_is][out] */ DWORD *pPointerTags);\n        \n        HRESULT ( STDMETHODCALLTYPE *getSrcLineOnTypeDefn )( \n            IDiaSymbol11 * This,\n            /* [out] */ IDiaLineNumber **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isPGO )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasValidPGOCounts )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isOptimizedForSpeed )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEntryCount )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGOEdgeCount )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PGODynamicInstructionCount )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_staticSize )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_finalLiveStaticSize )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_phaseName )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasControlFlowCheck )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_constantExport )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataExport )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_privateExport )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noNameExport )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportHasExplicitlyAssignedOrdinal )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exportIsForwarder )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ordinal )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frameSize )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressSection )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerAddressOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerRelativeVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_exceptionHandlerVirtualAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *findInputAssemblyFile )( \n            IDiaSymbol11 * This,\n            /* [out] */ IDiaInputAssemblyFile **ppResult);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_characteristics )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coffGroup )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindID )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSpace )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_bindSlot )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCClass )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCCategory )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isObjCProtocol )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlinee )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_inlineeId )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_noexcept )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_hasAbsoluteAddress )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isStaticMemberFunc )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isSignRet )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_coroutineKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolKind )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolSection )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolRva )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_associatedSymbolAddr )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadSize )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_framePadOffset )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_isRTCs )( \n            IDiaSymbol11 * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_sourceLink )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_discriminatedUnionTag )( \n            IDiaSymbol11 * This,\n            /* [out] */ IDiaSymbol **ppTagType,\n            /* [out] */ DWORD *pTagOffset,\n            /* [out] */ struct DiaTagValue *pTagMask);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_tagRanges )( \n            IDiaSymbol11 * This,\n            /* [in] */ DWORD count,\n            /* [out] */ DWORD *pcRangeValues,\n            /* [size_is][out] */ struct DiaTagValue *rangeValues);\n        \n        END_INTERFACE\n    } IDiaSymbol11Vtbl;\n\n    interface IDiaSymbol11\n    {\n        CONST_VTBL struct IDiaSymbol11Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSymbol11_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSymbol11_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSymbol11_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSymbol11_get_symIndexId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symIndexId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_symTag(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symTag(This,pRetVal) ) \n\n#define IDiaSymbol11_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaSymbol11_get_lexicalParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParent(This,pRetVal) ) \n\n#define IDiaSymbol11_get_classParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParent(This,pRetVal) ) \n\n#define IDiaSymbol11_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaSymbol11_get_dataKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_locationType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_locationType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSymbol11_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_registerId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSymbol11_get_slot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_slot(This,pRetVal) ) \n\n#define IDiaSymbol11_get_volatileType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_volatileType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_constType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_unalignedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unalignedType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_access(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_access(This,pRetVal) ) \n\n#define IDiaSymbol11_get_libraryName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_libraryName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_platform(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_platform(This,pRetVal) ) \n\n#define IDiaSymbol11_get_language(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_language(This,pRetVal) ) \n\n#define IDiaSymbol11_get_editAndContinueEnabled(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_editAndContinueEnabled(This,pRetVal) ) \n\n#define IDiaSymbol11_get_frontEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_frontEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_frontEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol11_get_backEndMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMajor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_backEndMinor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndMinor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_backEndBuild(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndBuild(This,pRetVal) ) \n\n#define IDiaSymbol11_get_sourceFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_unused(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unused(This,pRetVal) ) \n\n#define IDiaSymbol11_get_thunkOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thunkOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol11_get_thisAdjust(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_thisAdjust(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualBaseOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtual(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtual(This,pRetVal) ) \n\n#define IDiaSymbol11_get_intro(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intro(This,pRetVal) ) \n\n#define IDiaSymbol11_get_pure(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pure(This,pRetVal) ) \n\n#define IDiaSymbol11_get_callingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_callingConvention(This,pRetVal) ) \n\n#define IDiaSymbol11_get_value(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_value(This,pRetVal) ) \n\n#define IDiaSymbol11_get_baseType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_token(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_token(This,pRetVal) ) \n\n#define IDiaSymbol11_get_timeStamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timeStamp(This,pRetVal) ) \n\n#define IDiaSymbol11_get_guid(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_guid(This,pRetVal) ) \n\n#define IDiaSymbol11_get_symbolsFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_symbolsFileName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_reference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_reference(This,pRetVal) ) \n\n#define IDiaSymbol11_get_count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_count(This,pRetVal) ) \n\n#define IDiaSymbol11_get_bitPosition(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bitPosition(This,pRetVal) ) \n\n#define IDiaSymbol11_get_arrayIndexType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_packed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_packed(This,pRetVal) ) \n\n#define IDiaSymbol11_get_constructor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constructor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_overloadedOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_overloadedOperator(This,pRetVal) ) \n\n#define IDiaSymbol11_get_nested(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_nested(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasNestedTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasNestedTypes(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasAssignmentOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAssignmentOperator(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasCastOperator(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasCastOperator(This,pRetVal) ) \n\n#define IDiaSymbol11_get_scoped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_scoped(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol11_get_indirectVirtualBaseClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_indirectVirtualBaseClass(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualBasePointerOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBasePointerOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualTableShape(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShape(This,pRetVal) ) \n\n#define IDiaSymbol11_get_lexicalParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lexicalParentId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_classParentId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_classParentId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_typeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_typeId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_arrayIndexTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_arrayIndexTypeId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualTableShapeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualTableShapeId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSymbol11_get_function(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_function(This,pRetVal) ) \n\n#define IDiaSymbol11_get_managed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_managed(This,pRetVal) ) \n\n#define IDiaSymbol11_get_msil(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_msil(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualBaseDispIndex(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseDispIndex(This,pRetVal) ) \n\n#define IDiaSymbol11_get_undecoratedName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_undecoratedName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_age(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_age(This,pRetVal) ) \n\n#define IDiaSymbol11_get_signature(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_signature(This,pRetVal) ) \n\n#define IDiaSymbol11_get_compilerGenerated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerGenerated(This,pRetVal) ) \n\n#define IDiaSymbol11_get_addressTaken(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressTaken(This,pRetVal) ) \n\n#define IDiaSymbol11_get_rank(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_rank(This,pRetVal) ) \n\n#define IDiaSymbol11_get_lowerBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBound(This,pRetVal) ) \n\n#define IDiaSymbol11_get_upperBound(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBound(This,pRetVal) ) \n\n#define IDiaSymbol11_get_lowerBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lowerBoundId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_upperBoundId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_upperBoundId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_dataBytes(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_dataBytes(This,cbData,pcbData,pbData) ) \n\n#define IDiaSymbol11_findChildren(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildren(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol11_findChildrenEx(This,symtag,name,compareFlags,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenEx(This,symtag,name,compareFlags,ppResult) ) \n\n#define IDiaSymbol11_findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByAddr(This,symtag,name,compareFlags,isect,offset,ppResult) ) \n\n#define IDiaSymbol11_findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByVA(This,symtag,name,compareFlags,va,ppResult) ) \n\n#define IDiaSymbol11_findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findChildrenExByRVA(This,symtag,name,compareFlags,rva,ppResult) ) \n\n#define IDiaSymbol11_get_targetSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetSection(This,pRetVal) ) \n\n#define IDiaSymbol11_get_targetOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_targetRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_targetVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_targetVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_machineType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_machineType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_oemId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_oemSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_oemSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_types(This,cTypes,pcTypes,pTypes)\t\\\n    ( (This)->lpVtbl -> get_types(This,cTypes,pcTypes,pTypes) ) \n\n#define IDiaSymbol11_get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds)\t\\\n    ( (This)->lpVtbl -> get_typeIds(This,cTypeIds,pcTypeIds,pdwTypeIds) ) \n\n#define IDiaSymbol11_get_objectPointerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectPointerType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_udtKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_udtKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_undecoratedNameEx(This,undecorateOptions,name)\t\\\n    ( (This)->lpVtbl -> get_undecoratedNameEx(This,undecorateOptions,name) ) \n\n#define IDiaSymbol11_get_noReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noReturn(This,pRetVal) ) \n\n#define IDiaSymbol11_get_customCallingConvention(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_customCallingConvention(This,pRetVal) ) \n\n#define IDiaSymbol11_get_noInline(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noInline(This,pRetVal) ) \n\n#define IDiaSymbol11_get_optimizedCodeDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_optimizedCodeDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol11_get_notReached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notReached(This,pRetVal) ) \n\n#define IDiaSymbol11_get_interruptReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_interruptReturn(This,pRetVal) ) \n\n#define IDiaSymbol11_get_farReturn(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_farReturn(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isStatic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStatic(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasDebugInfo(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasDebugInfo(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isLTCG(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLTCG(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isDataAligned(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isDataAligned(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasSecurityChecks(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSecurityChecks(This,pRetVal) ) \n\n#define IDiaSymbol11_get_compilerName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilerName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasAlloca(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAlloca(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasSetJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSetJump(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasLongJump(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasLongJump(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasInlAsm(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasInlAsm(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEH(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasSEH(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasSEH(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasEHa(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasEHa(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isNaked(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isNaked(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isAggregated(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAggregated(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isSplitted(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSplitted(This,pRetVal) ) \n\n#define IDiaSymbol11_get_container(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_container(This,pRetVal) ) \n\n#define IDiaSymbol11_get_inlSpec(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlSpec(This,pRetVal) ) \n\n#define IDiaSymbol11_get_noStackOrdering(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noStackOrdering(This,pRetVal) ) \n\n#define IDiaSymbol11_get_virtualBaseTableType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualBaseTableType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasManagedCode(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasManagedCode(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isHotpatchable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHotpatchable(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isCVTCIL(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCVTCIL(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isMSILNetmodule(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMSILNetmodule(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isCTypes(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCTypes(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isStripped(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStripped(This,pRetVal) ) \n\n#define IDiaSymbol11_get_frontEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frontEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol11_get_backEndQFE(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_backEndQFE(This,pRetVal) ) \n\n#define IDiaSymbol11_get_wasInlined(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_wasInlined(This,pRetVal) ) \n\n#define IDiaSymbol11_get_strictGSCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_strictGSCheck(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isCxxReturnUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isCxxReturnUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isConstructorVirtualBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isConstructorVirtualBase(This,pRetVal) ) \n\n#define IDiaSymbol11_get_RValueReference(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_RValueReference(This,pRetVal) ) \n\n#define IDiaSymbol11_get_unmodifiedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_framePointerPresent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePointerPresent(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isSafeBuffers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSafeBuffers(This,pRetVal) ) \n\n#define IDiaSymbol11_get_intrinsic(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_intrinsic(This,pRetVal) ) \n\n#define IDiaSymbol11_get_sealed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sealed(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hfaFloat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaFloat(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hfaDouble(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hfaDouble(This,pRetVal) ) \n\n#define IDiaSymbol11_get_liveRangeStartAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol11_get_liveRangeStartAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_liveRangeStartRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeStartRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_countLiveRanges(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_countLiveRanges(This,pRetVal) ) \n\n#define IDiaSymbol11_get_liveRangeLength(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_liveRangeLength(This,pRetVal) ) \n\n#define IDiaSymbol11_get_offsetInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offsetInUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_get_paramBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_paramBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_localBasePointerRegisterId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localBasePointerRegisterId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isLocationControlFlowDependent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isLocationControlFlowDependent(This,pRetVal) ) \n\n#define IDiaSymbol11_get_stride(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_stride(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numberOfRows(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRows(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numberOfColumns(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfColumns(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isMatrixRowMajor(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMatrixRowMajor(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numericProperties(This,cnt,pcnt,pProperties)\t\\\n    ( (This)->lpVtbl -> get_numericProperties(This,cnt,pcnt,pProperties) ) \n\n#define IDiaSymbol11_get_modifierValues(This,cnt,pcnt,pModifiers)\t\\\n    ( (This)->lpVtbl -> get_modifierValues(This,cnt,pcnt,pModifiers) ) \n\n#define IDiaSymbol11_get_isReturnValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isReturnValue(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isOptimizedAway(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedAway(This,pRetVal) ) \n\n#define IDiaSymbol11_get_builtInKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_builtInKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_registerType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_baseDataSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataSlot(This,pRetVal) ) \n\n#define IDiaSymbol11_get_baseDataOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseDataOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_textureSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_textureSlot(This,pRetVal) ) \n\n#define IDiaSymbol11_get_samplerSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_samplerSlot(This,pRetVal) ) \n\n#define IDiaSymbol11_get_uavSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uavSlot(This,pRetVal) ) \n\n#define IDiaSymbol11_get_sizeInUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sizeInUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_get_memorySpaceKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_memorySpaceKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_unmodifiedTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_unmodifiedTypeId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_subTypeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subTypeId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_subType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_subType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numberOfModifiers(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfModifiers(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numberOfRegisterIndices(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfRegisterIndices(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isHLSLData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isHLSLData(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isPointerToDataMember(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToDataMember(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isPointerToMemberFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerToMemberFunction(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isSingleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSingleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isMultipleInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isMultipleInheritance(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isVirtualInheritance(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isVirtualInheritance(This,pRetVal) ) \n\n#define IDiaSymbol11_get_restrictedType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_restrictedType(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isPointerBasedOnSymbolValue(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPointerBasedOnSymbolValue(This,pRetVal) ) \n\n#define IDiaSymbol11_get_baseSymbol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbol(This,pRetVal) ) \n\n#define IDiaSymbol11_get_baseSymbolId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_baseSymbolId(This,pRetVal) ) \n\n#define IDiaSymbol11_get_objectFileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFileName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isAcceleratorGroupSharedLocal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorGroupSharedLocal(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isAcceleratorPointerTagLiveRange(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorPointerTagLiveRange(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isAcceleratorStubFunction(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isAcceleratorStubFunction(This,pRetVal) ) \n\n#define IDiaSymbol11_get_numberOfAcceleratorPointerTags(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_numberOfAcceleratorPointerTags(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isSdl(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSdl(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isWinRTPointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isWinRTPointer(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isRefUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRefUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isValueUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isValueUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isInterfaceUdt(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isInterfaceUdt(This,pRetVal) ) \n\n#define IDiaSymbol11_findInlineFramesByAddr(This,isect,offset,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByAddr(This,isect,offset,ppResult) ) \n\n#define IDiaSymbol11_findInlineFramesByRVA(This,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByRVA(This,rva,ppResult) ) \n\n#define IDiaSymbol11_findInlineFramesByVA(This,va,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineFramesByVA(This,va,ppResult) ) \n\n#define IDiaSymbol11_findInlineeLines(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLines(This,ppResult) ) \n\n#define IDiaSymbol11_findInlineeLinesByAddr(This,isect,offset,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByAddr(This,isect,offset,length,ppResult) ) \n\n#define IDiaSymbol11_findInlineeLinesByRVA(This,rva,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByRVA(This,rva,length,ppResult) ) \n\n#define IDiaSymbol11_findInlineeLinesByVA(This,va,length,ppResult)\t\\\n    ( (This)->lpVtbl -> findInlineeLinesByVA(This,va,length,ppResult) ) \n\n#define IDiaSymbol11_findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsForAcceleratorPointerTag(This,tagValue,ppResult) ) \n\n#define IDiaSymbol11_findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult)\t\\\n    ( (This)->lpVtbl -> findSymbolsByRVAForAcceleratorPointerTag(This,tagValue,rva,ppResult) ) \n\n#define IDiaSymbol11_get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags)\t\\\n    ( (This)->lpVtbl -> get_acceleratorPointerTags(This,cnt,pcnt,pPointerTags) ) \n\n#define IDiaSymbol11_getSrcLineOnTypeDefn(This,ppResult)\t\\\n    ( (This)->lpVtbl -> getSrcLineOnTypeDefn(This,ppResult) ) \n\n#define IDiaSymbol11_get_isPGO(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isPGO(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasValidPGOCounts(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasValidPGOCounts(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isOptimizedForSpeed(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isOptimizedForSpeed(This,pRetVal) ) \n\n#define IDiaSymbol11_get_PGOEntryCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEntryCount(This,pRetVal) ) \n\n#define IDiaSymbol11_get_PGOEdgeCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGOEdgeCount(This,pRetVal) ) \n\n#define IDiaSymbol11_get_PGODynamicInstructionCount(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_PGODynamicInstructionCount(This,pRetVal) ) \n\n#define IDiaSymbol11_get_staticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_staticSize(This,pRetVal) ) \n\n#define IDiaSymbol11_get_finalLiveStaticSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_finalLiveStaticSize(This,pRetVal) ) \n\n#define IDiaSymbol11_get_phaseName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_phaseName(This,pRetVal) ) \n\n#define IDiaSymbol11_get_hasControlFlowCheck(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasControlFlowCheck(This,pRetVal) ) \n\n#define IDiaSymbol11_get_constantExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_constantExport(This,pRetVal) ) \n\n#define IDiaSymbol11_get_dataExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataExport(This,pRetVal) ) \n\n#define IDiaSymbol11_get_privateExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_privateExport(This,pRetVal) ) \n\n#define IDiaSymbol11_get_noNameExport(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noNameExport(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exportHasExplicitlyAssignedOrdinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportHasExplicitlyAssignedOrdinal(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exportIsForwarder(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exportIsForwarder(This,pRetVal) ) \n\n#define IDiaSymbol11_get_ordinal(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_ordinal(This,pRetVal) ) \n\n#define IDiaSymbol11_get_frameSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frameSize(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exceptionHandlerAddressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressSection(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exceptionHandlerAddressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerAddressOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exceptionHandlerRelativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerRelativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_get_exceptionHandlerVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_exceptionHandlerVirtualAddress(This,pRetVal) ) \n\n#define IDiaSymbol11_findInputAssemblyFile(This,ppResult)\t\\\n    ( (This)->lpVtbl -> findInputAssemblyFile(This,ppResult) ) \n\n#define IDiaSymbol11_get_characteristics(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_characteristics(This,pRetVal) ) \n\n#define IDiaSymbol11_get_coffGroup(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coffGroup(This,pRetVal) ) \n\n#define IDiaSymbol11_get_bindID(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindID(This,pRetVal) ) \n\n#define IDiaSymbol11_get_bindSpace(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSpace(This,pRetVal) ) \n\n#define IDiaSymbol11_get_bindSlot(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_bindSlot(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_isObjCClass(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCClass(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isObjCCategory(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCCategory(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isObjCProtocol(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isObjCProtocol(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_inlinee(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlinee(This,pRetVal) ) \n\n#define IDiaSymbol11_get_inlineeId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_inlineeId(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_noexcept(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_noexcept(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_hasAbsoluteAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_hasAbsoluteAddress(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_isStaticMemberFunc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isStaticMemberFunc(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_isSignRet(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isSignRet(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_coroutineKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_coroutineKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_associatedSymbolKind(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolKind(This,pRetVal) ) \n\n#define IDiaSymbol11_get_associatedSymbolSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolSection(This,pRetVal) ) \n\n#define IDiaSymbol11_get_associatedSymbolOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_associatedSymbolRva(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolRva(This,pRetVal) ) \n\n#define IDiaSymbol11_get_associatedSymbolAddr(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_associatedSymbolAddr(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_framePadSize(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadSize(This,pRetVal) ) \n\n#define IDiaSymbol11_get_framePadOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_framePadOffset(This,pRetVal) ) \n\n#define IDiaSymbol11_get_isRTCs(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_isRTCs(This,pRetVal) ) \n\n\n#define IDiaSymbol11_get_sourceLink(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> get_sourceLink(This,cb,pcb,pb) ) \n\n\n#define IDiaSymbol11_get_discriminatedUnionTag(This,ppTagType,pTagOffset,pTagMask)\t\\\n    ( (This)->lpVtbl -> get_discriminatedUnionTag(This,ppTagType,pTagOffset,pTagMask) ) \n\n#define IDiaSymbol11_get_tagRanges(This,count,pcRangeValues,rangeValues)\t\\\n    ( (This)->lpVtbl -> get_tagRanges(This,count,pcRangeValues,rangeValues) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol11_get_discriminatedUnionTag_Proxy( \n    IDiaSymbol11 * This,\n    /* [out] */ IDiaSymbol **ppTagType,\n    /* [out] */ DWORD *pTagOffset,\n    /* [out] */ struct DiaTagValue *pTagMask);\n\n\nvoid __RPC_STUB IDiaSymbol11_get_discriminatedUnionTag_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\nHRESULT STDMETHODCALLTYPE IDiaSymbol11_get_tagRanges_Proxy( \n    IDiaSymbol11 * This,\n    /* [in] */ DWORD count,\n    /* [out] */ DWORD *pcRangeValues,\n    /* [size_is][out] */ struct DiaTagValue *rangeValues);\n\n\nvoid __RPC_STUB IDiaSymbol11_get_tagRanges_Stub(\n    IRpcStubBuffer *This,\n    IRpcChannelBuffer *_pRpcChannelBuffer,\n    PRPC_MESSAGE _pRpcMessage,\n    DWORD *_pdwStubPhase);\n\n\n\n#endif \t/* __IDiaSymbol11_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSourceFile_INTERFACE_DEFINED__\n#define __IDiaSourceFile_INTERFACE_DEFINED__\n\n/* interface IDiaSourceFile */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSourceFile;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"A2EF5353-F5A8-4eb3-90D2-CB526ACB3CDD\")\n    IDiaSourceFile : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_uniqueId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_fileName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_checksumType( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compilands( \n            /* [retval][out] */ IDiaEnumSymbols **pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_checksum( \n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSourceFileVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSourceFile * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSourceFile * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSourceFile * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uniqueId )( \n            IDiaSourceFile * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_fileName )( \n            IDiaSourceFile * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_checksumType )( \n            IDiaSourceFile * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilands )( \n            IDiaSourceFile * This,\n            /* [retval][out] */ IDiaEnumSymbols **pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_checksum )( \n            IDiaSourceFile * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        END_INTERFACE\n    } IDiaSourceFileVtbl;\n\n    interface IDiaSourceFile\n    {\n        CONST_VTBL struct IDiaSourceFileVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSourceFile_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSourceFile_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSourceFile_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSourceFile_get_uniqueId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uniqueId(This,pRetVal) ) \n\n#define IDiaSourceFile_get_fileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_fileName(This,pRetVal) ) \n\n#define IDiaSourceFile_get_checksumType(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_checksumType(This,pRetVal) ) \n\n#define IDiaSourceFile_get_compilands(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilands(This,pRetVal) ) \n\n#define IDiaSourceFile_get_checksum(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_checksum(This,cbData,pcbData,pbData) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaSourceFile_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaInputAssemblyFile_INTERFACE_DEFINED__\n#define __IDiaInputAssemblyFile_INTERFACE_DEFINED__\n\n/* interface IDiaInputAssemblyFile */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaInputAssemblyFile;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"3BFE56B0-390C-4863-9430-1F3D083B7684\")\n    IDiaInputAssemblyFile : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_uniqueId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_index( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_timestamp( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_pdbAvailableAtILMerge( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_fileName( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_version( \n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaInputAssemblyFileVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaInputAssemblyFile * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaInputAssemblyFile * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaInputAssemblyFile * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uniqueId )( \n            IDiaInputAssemblyFile * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_index )( \n            IDiaInputAssemblyFile * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_timestamp )( \n            IDiaInputAssemblyFile * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_pdbAvailableAtILMerge )( \n            IDiaInputAssemblyFile * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_fileName )( \n            IDiaInputAssemblyFile * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_version )( \n            IDiaInputAssemblyFile * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        END_INTERFACE\n    } IDiaInputAssemblyFileVtbl;\n\n    interface IDiaInputAssemblyFile\n    {\n        CONST_VTBL struct IDiaInputAssemblyFileVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaInputAssemblyFile_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaInputAssemblyFile_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaInputAssemblyFile_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaInputAssemblyFile_get_uniqueId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uniqueId(This,pRetVal) ) \n\n#define IDiaInputAssemblyFile_get_index(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_index(This,pRetVal) ) \n\n#define IDiaInputAssemblyFile_get_timestamp(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_timestamp(This,pRetVal) ) \n\n#define IDiaInputAssemblyFile_get_pdbAvailableAtILMerge(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_pdbAvailableAtILMerge(This,pRetVal) ) \n\n#define IDiaInputAssemblyFile_get_fileName(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_fileName(This,pRetVal) ) \n\n#define IDiaInputAssemblyFile_get_version(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_version(This,cbData,pcbData,pbData) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaInputAssemblyFile_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaLineNumber_INTERFACE_DEFINED__\n#define __IDiaLineNumber_INTERFACE_DEFINED__\n\n/* interface IDiaLineNumber */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaLineNumber;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"B388EB14-BE4D-421d-A8A1-6CF7AB057086\")\n    IDiaLineNumber : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compiland( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sourceFile( \n            /* [retval][out] */ IDiaSourceFile **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lineNumber( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lineNumberEnd( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_columnNumber( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_columnNumberEnd( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_length( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sourceFileId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_statement( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compilandId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaLineNumberVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaLineNumber * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaLineNumber * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaLineNumber * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compiland )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFile )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ IDiaSourceFile **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lineNumber )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lineNumberEnd )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_columnNumber )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_columnNumberEnd )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceFileId )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_statement )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilandId )( \n            IDiaLineNumber * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        END_INTERFACE\n    } IDiaLineNumberVtbl;\n\n    interface IDiaLineNumber\n    {\n        CONST_VTBL struct IDiaLineNumberVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaLineNumber_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaLineNumber_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaLineNumber_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaLineNumber_get_compiland(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compiland(This,pRetVal) ) \n\n#define IDiaLineNumber_get_sourceFile(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFile(This,pRetVal) ) \n\n#define IDiaLineNumber_get_lineNumber(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lineNumber(This,pRetVal) ) \n\n#define IDiaLineNumber_get_lineNumberEnd(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lineNumberEnd(This,pRetVal) ) \n\n#define IDiaLineNumber_get_columnNumber(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_columnNumber(This,pRetVal) ) \n\n#define IDiaLineNumber_get_columnNumberEnd(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_columnNumberEnd(This,pRetVal) ) \n\n#define IDiaLineNumber_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaLineNumber_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaLineNumber_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaLineNumber_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaLineNumber_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaLineNumber_get_sourceFileId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceFileId(This,pRetVal) ) \n\n#define IDiaLineNumber_get_statement(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_statement(This,pRetVal) ) \n\n#define IDiaLineNumber_get_compilandId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilandId(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaLineNumber_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSectionContrib_INTERFACE_DEFINED__\n#define __IDiaSectionContrib_INTERFACE_DEFINED__\n\n/* interface IDiaSectionContrib */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSectionContrib;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"0CF4B60E-35B1-4c6c-BDD8-854B9C8E3857\")\n    IDiaSectionContrib : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compiland( \n            /* [retval][out] */ IDiaSymbol **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_length( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_notPaged( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_code( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_initializedData( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_uninitializedData( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_remove( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_comdat( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_discardable( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_notCached( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_share( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_execute( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_read( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_write( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_dataCrc( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relocationsCrc( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_compilandId( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_code16bit( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSectionContribVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSectionContrib * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSectionContrib * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSectionContrib * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compiland )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ IDiaSymbol **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notPaged )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_initializedData )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_uninitializedData )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_remove )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_comdat )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_discardable )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_notCached )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_share )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_execute )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_read )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_write )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_dataCrc )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relocationsCrc )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_compilandId )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_code16bit )( \n            IDiaSectionContrib * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSectionContribVtbl;\n\n    interface IDiaSectionContrib\n    {\n        CONST_VTBL struct IDiaSectionContribVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSectionContrib_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSectionContrib_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSectionContrib_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSectionContrib_get_compiland(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compiland(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_notPaged(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notPaged(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_code(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_initializedData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_initializedData(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_uninitializedData(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_uninitializedData(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_remove(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_remove(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_comdat(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_comdat(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_discardable(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_discardable(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_notCached(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_notCached(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_share(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_share(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_execute(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_execute(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_read(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_read(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_write(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_write(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_dataCrc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_dataCrc(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_relocationsCrc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relocationsCrc(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_compilandId(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_compilandId(This,pRetVal) ) \n\n#define IDiaSectionContrib_get_code16bit(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_code16bit(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaSectionContrib_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaSegment_INTERFACE_DEFINED__\n#define __IDiaSegment_INTERFACE_DEFINED__\n\n/* interface IDiaSegment */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaSegment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"0775B784-C75B-4449-848B-B7BD3159545B\")\n    IDiaSegment : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_frame( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_offset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_length( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_read( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_write( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_execute( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaSegmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaSegment * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaSegment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaSegment * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_frame )( \n            IDiaSegment * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_offset )( \n            IDiaSegment * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaSegment * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_read )( \n            IDiaSegment * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_write )( \n            IDiaSegment * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_execute )( \n            IDiaSegment * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaSegment * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaSegment * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaSegment * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        END_INTERFACE\n    } IDiaSegmentVtbl;\n\n    interface IDiaSegment\n    {\n        CONST_VTBL struct IDiaSegmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaSegment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaSegment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaSegment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaSegment_get_frame(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_frame(This,pRetVal) ) \n\n#define IDiaSegment_get_offset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_offset(This,pRetVal) ) \n\n#define IDiaSegment_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaSegment_get_read(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_read(This,pRetVal) ) \n\n#define IDiaSegment_get_write(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_write(This,pRetVal) ) \n\n#define IDiaSegment_get_execute(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_execute(This,pRetVal) ) \n\n#define IDiaSegment_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaSegment_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaSegment_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaSegment_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaInjectedSource_INTERFACE_DEFINED__\n#define __IDiaInjectedSource_INTERFACE_DEFINED__\n\n/* interface IDiaInjectedSource */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaInjectedSource;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"AE605CDC-8105-4a23-B710-3259F1E26112\")\n    IDiaInjectedSource : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_crc( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_length( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_filename( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_objectFilename( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualFilename( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_sourceCompression( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE get_source( \n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaInjectedSourceVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaInjectedSource * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaInjectedSource * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaInjectedSource * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_crc )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_length )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_filename )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_objectFilename )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualFilename )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_sourceCompression )( \n            IDiaInjectedSource * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *get_source )( \n            IDiaInjectedSource * This,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        END_INTERFACE\n    } IDiaInjectedSourceVtbl;\n\n    interface IDiaInjectedSource\n    {\n        CONST_VTBL struct IDiaInjectedSourceVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaInjectedSource_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaInjectedSource_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaInjectedSource_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaInjectedSource_get_crc(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_crc(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_length(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_length(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_filename(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_filename(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_objectFilename(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_objectFilename(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_virtualFilename(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualFilename(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_sourceCompression(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_sourceCompression(This,pRetVal) ) \n\n#define IDiaInjectedSource_get_source(This,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> get_source(This,cbData,pcbData,pbData) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaInjectedSource_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaStackWalkFrame_INTERFACE_DEFINED__\n#define __IDiaStackWalkFrame_INTERFACE_DEFINED__\n\n/* interface IDiaStackWalkFrame */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackWalkFrame;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"07C590C1-438D-4F47-BDCD-4397BC81AD75\")\n    IDiaStackWalkFrame : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_registerValue( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_registerValue( \n            /* [in] */ DWORD index,\n            /* [in] */ ULONGLONG NewVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE readMemory( \n            /* [in] */ enum MemoryTypeEnum type,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE searchForReturnAddress( \n            /* [in] */ IDiaFrameData *frame,\n            /* [out] */ ULONGLONG *returnAddress) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE searchForReturnAddressStart( \n            /* [in] */ IDiaFrameData *frame,\n            /* [in] */ ULONGLONG startAddress,\n            /* [out] */ ULONGLONG *returnAddress) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackWalkFrameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackWalkFrame * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackWalkFrame * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerValue )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_registerValue )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ DWORD index,\n            /* [in] */ ULONGLONG NewVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *readMemory )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ enum MemoryTypeEnum type,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddress )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddressStart )( \n            IDiaStackWalkFrame * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [in] */ ULONGLONG startAddress,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        END_INTERFACE\n    } IDiaStackWalkFrameVtbl;\n\n    interface IDiaStackWalkFrame\n    {\n        CONST_VTBL struct IDiaStackWalkFrameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackWalkFrame_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackWalkFrame_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackWalkFrame_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackWalkFrame_get_registerValue(This,index,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerValue(This,index,pRetVal) ) \n\n#define IDiaStackWalkFrame_put_registerValue(This,index,NewVal)\t\\\n    ( (This)->lpVtbl -> put_registerValue(This,index,NewVal) ) \n\n#define IDiaStackWalkFrame_readMemory(This,type,va,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> readMemory(This,type,va,cbData,pcbData,pbData) ) \n\n#define IDiaStackWalkFrame_searchForReturnAddress(This,frame,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddress(This,frame,returnAddress) ) \n\n#define IDiaStackWalkFrame_searchForReturnAddressStart(This,frame,startAddress,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddressStart(This,frame,startAddress,returnAddress) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackWalkFrame_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaFrameData_INTERFACE_DEFINED__\n#define __IDiaFrameData_INTERFACE_DEFINED__\n\n/* interface IDiaFrameData */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaFrameData;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"A39184B7-6A36-42de-8EEC-7DF9F3F59F33\")\n    IDiaFrameData : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressSection( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_addressOffset( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthBlock( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthLocals( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthParams( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_maxStack( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthProlog( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthSavedRegisters( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_program( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_systemExceptionHandling( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_cplusplusExceptionHandling( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_functionStart( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_allocatesBasePointer( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_type( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_functionParent( \n            /* [retval][out] */ IDiaFrameData **pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE execute( \n            IDiaStackWalkFrame *frame) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaFrameDataVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaFrameData * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaFrameData * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaFrameData * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressSection )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_addressOffset )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaFrameData * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthBlock )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthLocals )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthParams )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_maxStack )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthProlog )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthSavedRegisters )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_program )( \n            IDiaFrameData * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_systemExceptionHandling )( \n            IDiaFrameData * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_cplusplusExceptionHandling )( \n            IDiaFrameData * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_functionStart )( \n            IDiaFrameData * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_allocatesBasePointer )( \n            IDiaFrameData * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaFrameData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_functionParent )( \n            IDiaFrameData * This,\n            /* [retval][out] */ IDiaFrameData **pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *execute )( \n            IDiaFrameData * This,\n            IDiaStackWalkFrame *frame);\n        \n        END_INTERFACE\n    } IDiaFrameDataVtbl;\n\n    interface IDiaFrameData\n    {\n        CONST_VTBL struct IDiaFrameDataVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaFrameData_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaFrameData_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaFrameData_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaFrameData_get_addressSection(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressSection(This,pRetVal) ) \n\n#define IDiaFrameData_get_addressOffset(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_addressOffset(This,pRetVal) ) \n\n#define IDiaFrameData_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaFrameData_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaFrameData_get_lengthBlock(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthBlock(This,pRetVal) ) \n\n#define IDiaFrameData_get_lengthLocals(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthLocals(This,pRetVal) ) \n\n#define IDiaFrameData_get_lengthParams(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthParams(This,pRetVal) ) \n\n#define IDiaFrameData_get_maxStack(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_maxStack(This,pRetVal) ) \n\n#define IDiaFrameData_get_lengthProlog(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthProlog(This,pRetVal) ) \n\n#define IDiaFrameData_get_lengthSavedRegisters(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthSavedRegisters(This,pRetVal) ) \n\n#define IDiaFrameData_get_program(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_program(This,pRetVal) ) \n\n#define IDiaFrameData_get_systemExceptionHandling(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_systemExceptionHandling(This,pRetVal) ) \n\n#define IDiaFrameData_get_cplusplusExceptionHandling(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_cplusplusExceptionHandling(This,pRetVal) ) \n\n#define IDiaFrameData_get_functionStart(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_functionStart(This,pRetVal) ) \n\n#define IDiaFrameData_get_allocatesBasePointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_allocatesBasePointer(This,pRetVal) ) \n\n#define IDiaFrameData_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaFrameData_get_functionParent(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_functionParent(This,pRetVal) ) \n\n#define IDiaFrameData_execute(This,frame)\t\\\n    ( (This)->lpVtbl -> execute(This,frame) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaFrameData_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaImageData_INTERFACE_DEFINED__\n#define __IDiaImageData_INTERFACE_DEFINED__\n\n/* interface IDiaImageData */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaImageData;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"C8E40ED2-A1D9-4221-8692-3CE661184B44\")\n    IDiaImageData : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_relativeVirtualAddress( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_virtualAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_imageBase( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaImageDataVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaImageData * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaImageData * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaImageData * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_relativeVirtualAddress )( \n            IDiaImageData * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_virtualAddress )( \n            IDiaImageData * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_imageBase )( \n            IDiaImageData * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        END_INTERFACE\n    } IDiaImageDataVtbl;\n\n    interface IDiaImageData\n    {\n        CONST_VTBL struct IDiaImageDataVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaImageData_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaImageData_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaImageData_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaImageData_get_relativeVirtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_relativeVirtualAddress(This,pRetVal) ) \n\n#define IDiaImageData_get_virtualAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_virtualAddress(This,pRetVal) ) \n\n#define IDiaImageData_get_imageBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_imageBase(This,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaImageData_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaTable_INTERFACE_DEFINED__\n#define __IDiaTable_INTERFACE_DEFINED__\n\n/* interface IDiaTable */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaTable;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"4A59FB77-ABAC-469b-A30B-9ECC85BFEF14\")\n    IDiaTable : public IEnumUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_name( \n            /* [retval][out] */ BSTR *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ IUnknown **element) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaTableVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaTable * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaTable * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaTable * This);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaTable * This,\n            /* [annotation][in] */ \n            _In_  ULONG celt,\n            /* [annotation][out] */ \n            _Out_writes_to_(celt,*pceltFetched)  IUnknown **rgelt,\n            /* [annotation][out] */ \n            _Out_opt_  ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaTable * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaTable * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaTable * This,\n            /* [out] */ IEnumUnknown **ppenum);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaTable * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_name )( \n            IDiaTable * This,\n            /* [retval][out] */ BSTR *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaTable * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaTable * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ IUnknown **element);\n        \n        END_INTERFACE\n    } IDiaTableVtbl;\n\n    interface IDiaTable\n    {\n        CONST_VTBL struct IDiaTableVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaTable_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaTable_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaTable_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaTable_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaTable_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaTable_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaTable_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n\n#define IDiaTable_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaTable_get_name(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_name(This,pRetVal) ) \n\n#define IDiaTable_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaTable_Item(This,index,element)\t\\\n    ( (This)->lpVtbl -> Item(This,index,element) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaTable_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumTables_INTERFACE_DEFINED__\n#define __IDiaEnumTables_INTERFACE_DEFINED__\n\n/* interface IDiaEnumTables */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumTables;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"C65C2B0A-1150-4d7a-AFCC-E05BF3DEE81E\")\n    IDiaEnumTables : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( \n            /* [in] */ VARIANT index,\n            /* [retval][out] */ IDiaTable **table) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            ULONG celt,\n            IDiaTable **rgelt,\n            ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumTables **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumTablesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumTables * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumTables * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumTables * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumTables * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumTables * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( \n            IDiaEnumTables * This,\n            /* [in] */ VARIANT index,\n            /* [retval][out] */ IDiaTable **table);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumTables * This,\n            ULONG celt,\n            IDiaTable **rgelt,\n            ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumTables * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumTables * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumTables * This,\n            /* [out] */ IDiaEnumTables **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumTablesVtbl;\n\n    interface IDiaEnumTables\n    {\n        CONST_VTBL struct IDiaEnumTablesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumTables_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumTables_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumTables_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumTables_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumTables_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumTables_Item(This,index,table)\t\\\n    ( (This)->lpVtbl -> Item(This,index,table) ) \n\n#define IDiaEnumTables_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumTables_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumTables_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumTables_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumTables_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceLink_INTERFACE_DEFINED__\n#define __IDiaEnumSourceLink_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSourceLink */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSourceLink;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"45cd1eb3-5c6c-43e3-b20a-a4d8035de4e2\")\n    IDiaEnumSourceLink : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Count( \n            /* [out] */ DWORD *pCnt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SizeOfNext( \n            /* [out] */ DWORD *pcb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ DWORD cnt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumSourceLink **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSourceLinkVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSourceLink * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSourceLink * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSourceLink * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Count )( \n            IDiaEnumSourceLink * This,\n            /* [out] */ DWORD *pCnt);\n        \n        HRESULT ( STDMETHODCALLTYPE *SizeOfNext )( \n            IDiaEnumSourceLink * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSourceLink * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSourceLink * This,\n            /* [in] */ DWORD cnt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSourceLink * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSourceLink * This,\n            /* [out] */ IDiaEnumSourceLink **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumSourceLinkVtbl;\n\n    interface IDiaEnumSourceLink\n    {\n        CONST_VTBL struct IDiaEnumSourceLinkVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSourceLink_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSourceLink_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSourceLink_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSourceLink_Count(This,pCnt)\t\\\n    ( (This)->lpVtbl -> Count(This,pCnt) ) \n\n#define IDiaEnumSourceLink_SizeOfNext(This,pcb)\t\\\n    ( (This)->lpVtbl -> SizeOfNext(This,pcb) ) \n\n#define IDiaEnumSourceLink_Next(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> Next(This,cb,pcb,pb) ) \n\n#define IDiaEnumSourceLink_Skip(This,cnt)\t\\\n    ( (This)->lpVtbl -> Skip(This,cnt) ) \n\n#define IDiaEnumSourceLink_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSourceLink_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSourceLink_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumSourceLink2_INTERFACE_DEFINED__\n#define __IDiaEnumSourceLink2_INTERFACE_DEFINED__\n\n/* interface IDiaEnumSourceLink2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumSourceLink2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"136d8151-ade7-4704-af13-324080762e8f\")\n    IDiaEnumSourceLink2 : public IDiaEnumSourceLink\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE SizeOfNext2( \n            /* [out] */ ULONGLONG *pcb) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next2( \n            /* [in] */ ULONGLONG cb,\n            /* [out] */ ULONGLONG *pcb,\n            /* [size_is][out] */ BYTE *pb) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumSourceLink2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumSourceLink2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumSourceLink2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumSourceLink2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Count )( \n            IDiaEnumSourceLink2 * This,\n            /* [out] */ DWORD *pCnt);\n        \n        HRESULT ( STDMETHODCALLTYPE *SizeOfNext )( \n            IDiaEnumSourceLink2 * This,\n            /* [out] */ DWORD *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumSourceLink2 * This,\n            /* [in] */ DWORD cb,\n            /* [out] */ DWORD *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumSourceLink2 * This,\n            /* [in] */ DWORD cnt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumSourceLink2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumSourceLink2 * This,\n            /* [out] */ IDiaEnumSourceLink **ppenum);\n        \n        HRESULT ( STDMETHODCALLTYPE *SizeOfNext2 )( \n            IDiaEnumSourceLink2 * This,\n            /* [out] */ ULONGLONG *pcb);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next2 )( \n            IDiaEnumSourceLink2 * This,\n            /* [in] */ ULONGLONG cb,\n            /* [out] */ ULONGLONG *pcb,\n            /* [size_is][out] */ BYTE *pb);\n        \n        END_INTERFACE\n    } IDiaEnumSourceLink2Vtbl;\n\n    interface IDiaEnumSourceLink2\n    {\n        CONST_VTBL struct IDiaEnumSourceLink2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumSourceLink2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumSourceLink2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumSourceLink2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumSourceLink2_Count(This,pCnt)\t\\\n    ( (This)->lpVtbl -> Count(This,pCnt) ) \n\n#define IDiaEnumSourceLink2_SizeOfNext(This,pcb)\t\\\n    ( (This)->lpVtbl -> SizeOfNext(This,pcb) ) \n\n#define IDiaEnumSourceLink2_Next(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> Next(This,cb,pcb,pb) ) \n\n#define IDiaEnumSourceLink2_Skip(This,cnt)\t\\\n    ( (This)->lpVtbl -> Skip(This,cnt) ) \n\n#define IDiaEnumSourceLink2_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumSourceLink2_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n\n#define IDiaEnumSourceLink2_SizeOfNext2(This,pcb)\t\\\n    ( (This)->lpVtbl -> SizeOfNext2(This,pcb) ) \n\n#define IDiaEnumSourceLink2_Next2(This,cb,pcb,pb)\t\\\n    ( (This)->lpVtbl -> Next2(This,cb,pcb,pb) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumSourceLink2_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __Dia2Lib_LIBRARY_DEFINED__\n#define __Dia2Lib_LIBRARY_DEFINED__\n\n/* library Dia2Lib */\n/* [helpstring][version][uuid] */ \n\n\n\n\n\n\nEXTERN_C const IID LIBID_Dia2Lib;\n\nEXTERN_C const CLSID CLSID_DiaSource;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"e6756135-1e65-4d17-8576-610761398c3c\")\nDiaSource;\n#endif\n\nEXTERN_C const CLSID CLSID_DiaSourceAlt;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91904831-49ca-4766-b95c-25397e2dd6dc\")\nDiaSourceAlt;\n#endif\n\nEXTERN_C const CLSID CLSID_DiaStackWalker;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"ce4a85db-5768-475b-a4e1-c0bca2112a6b\")\nDiaStackWalker;\n#endif\n#endif /* __Dia2Lib_LIBRARY_DEFINED__ */\n\n/* interface __MIDL_itf_dia2_0000_0047 */\n/* [local] */ \n\n#define\tDiaTable_Symbols\t( L\"Symbols\" )\n\n#define\tDiaTable_Sections\t( L\"Sections\" )\n\n#define\tDiaTable_SrcFiles\t( L\"SourceFiles\" )\n\n#define\tDiaTable_LineNums\t( L\"LineNumbers\" )\n\n#define\tDiaTable_SegMap\t( L\"SegmentMap\" )\n\n#define\tDiaTable_Dbg\t( L\"Dbg\" )\n\n#define\tDiaTable_InjSrc\t( L\"InjectedSource\" )\n\n#define\tDiaTable_FrameData\t( L\"FrameData\" )\n\n#define\tDiaTable_InputAssemblyFiles\t( L\"InputAssemblyFiles\" )\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0047_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0047_v0_0_s_ifspec;\n\n#ifndef __IDiaPropertyStorage_INTERFACE_DEFINED__\n#define __IDiaPropertyStorage_INTERFACE_DEFINED__\n\n/* interface IDiaPropertyStorage */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaPropertyStorage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"9d416f9c-e184-45b2-a4f0-ce517f719e9b\")\n    IDiaPropertyStorage : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE ReadMultiple( \n            /* [in] */ ULONG cpspec,\n            /* [size_is][in] */ const PROPSPEC *rgpspec,\n            /* [size_is][out] */ PROPVARIANT *rgvar) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadPropertyNames( \n            /* [in] */ ULONG cpropid,\n            /* [size_is][in] */ const PROPID *rgpropid,\n            /* [size_is][out][in] */ BSTR *rglpwstrName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enum( \n            /* [out] */ IEnumSTATPROPSTG **ppenum) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadDWORD( \n            /* [in] */ PROPID id,\n            /* [out] */ DWORD *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadLONG( \n            /* [in] */ PROPID id,\n            /* [out] */ LONG *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadBOOL( \n            /* [in] */ PROPID id,\n            /* [out] */ BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadULONGLONG( \n            /* [in] */ PROPID id,\n            /* [out] */ ULONGLONG *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ReadBSTR( \n            /* [in] */ PROPID id,\n            /* [out] */ BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaPropertyStorageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaPropertyStorage * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaPropertyStorage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaPropertyStorage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadMultiple )( \n            IDiaPropertyStorage * This,\n            /* [in] */ ULONG cpspec,\n            /* [size_is][in] */ const PROPSPEC *rgpspec,\n            /* [size_is][out] */ PROPVARIANT *rgvar);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadPropertyNames )( \n            IDiaPropertyStorage * This,\n            /* [in] */ ULONG cpropid,\n            /* [size_is][in] */ const PROPID *rgpropid,\n            /* [size_is][out][in] */ BSTR *rglpwstrName);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enum )( \n            IDiaPropertyStorage * This,\n            /* [out] */ IEnumSTATPROPSTG **ppenum);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadDWORD )( \n            IDiaPropertyStorage * This,\n            /* [in] */ PROPID id,\n            /* [out] */ DWORD *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadLONG )( \n            IDiaPropertyStorage * This,\n            /* [in] */ PROPID id,\n            /* [out] */ LONG *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadBOOL )( \n            IDiaPropertyStorage * This,\n            /* [in] */ PROPID id,\n            /* [out] */ BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadULONGLONG )( \n            IDiaPropertyStorage * This,\n            /* [in] */ PROPID id,\n            /* [out] */ ULONGLONG *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ReadBSTR )( \n            IDiaPropertyStorage * This,\n            /* [in] */ PROPID id,\n            /* [out] */ BSTR *pValue);\n        \n        END_INTERFACE\n    } IDiaPropertyStorageVtbl;\n\n    interface IDiaPropertyStorage\n    {\n        CONST_VTBL struct IDiaPropertyStorageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaPropertyStorage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaPropertyStorage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaPropertyStorage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaPropertyStorage_ReadMultiple(This,cpspec,rgpspec,rgvar)\t\\\n    ( (This)->lpVtbl -> ReadMultiple(This,cpspec,rgpspec,rgvar) ) \n\n#define IDiaPropertyStorage_ReadPropertyNames(This,cpropid,rgpropid,rglpwstrName)\t\\\n    ( (This)->lpVtbl -> ReadPropertyNames(This,cpropid,rgpropid,rglpwstrName) ) \n\n#define IDiaPropertyStorage_Enum(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Enum(This,ppenum) ) \n\n#define IDiaPropertyStorage_ReadDWORD(This,id,pValue)\t\\\n    ( (This)->lpVtbl -> ReadDWORD(This,id,pValue) ) \n\n#define IDiaPropertyStorage_ReadLONG(This,id,pValue)\t\\\n    ( (This)->lpVtbl -> ReadLONG(This,id,pValue) ) \n\n#define IDiaPropertyStorage_ReadBOOL(This,id,pValue)\t\\\n    ( (This)->lpVtbl -> ReadBOOL(This,id,pValue) ) \n\n#define IDiaPropertyStorage_ReadULONGLONG(This,id,pValue)\t\\\n    ( (This)->lpVtbl -> ReadULONGLONG(This,id,pValue) ) \n\n#define IDiaPropertyStorage_ReadBSTR(This,id,pValue)\t\\\n    ( (This)->lpVtbl -> ReadBSTR(This,id,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaPropertyStorage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaStackFrame_INTERFACE_DEFINED__\n#define __IDiaStackFrame_INTERFACE_DEFINED__\n\n/* interface IDiaStackFrame */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackFrame;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"5edbc96d-cdd6-4792-afbe-cc89007d9610\")\n    IDiaStackFrame : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_type( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_base( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_size( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_returnAddress( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_localsBase( \n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthLocals( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthParams( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthProlog( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_lengthSavedRegisters( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_systemExceptionHandling( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_cplusplusExceptionHandling( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_functionStart( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_allocatesBasePointer( \n            /* [retval][out] */ BOOL *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_maxStack( \n            /* [retval][out] */ DWORD *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_registerValue( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackFrameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackFrame * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackFrame * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackFrame * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_type )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_base )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_size )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_returnAddress )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_localsBase )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthLocals )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthParams )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthProlog )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_lengthSavedRegisters )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_systemExceptionHandling )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_cplusplusExceptionHandling )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_functionStart )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_allocatesBasePointer )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ BOOL *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_maxStack )( \n            IDiaStackFrame * This,\n            /* [retval][out] */ DWORD *pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerValue )( \n            IDiaStackFrame * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        END_INTERFACE\n    } IDiaStackFrameVtbl;\n\n    interface IDiaStackFrame\n    {\n        CONST_VTBL struct IDiaStackFrameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackFrame_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackFrame_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackFrame_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackFrame_get_type(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_type(This,pRetVal) ) \n\n#define IDiaStackFrame_get_base(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_base(This,pRetVal) ) \n\n#define IDiaStackFrame_get_size(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_size(This,pRetVal) ) \n\n#define IDiaStackFrame_get_returnAddress(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_returnAddress(This,pRetVal) ) \n\n#define IDiaStackFrame_get_localsBase(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_localsBase(This,pRetVal) ) \n\n#define IDiaStackFrame_get_lengthLocals(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthLocals(This,pRetVal) ) \n\n#define IDiaStackFrame_get_lengthParams(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthParams(This,pRetVal) ) \n\n#define IDiaStackFrame_get_lengthProlog(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthProlog(This,pRetVal) ) \n\n#define IDiaStackFrame_get_lengthSavedRegisters(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_lengthSavedRegisters(This,pRetVal) ) \n\n#define IDiaStackFrame_get_systemExceptionHandling(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_systemExceptionHandling(This,pRetVal) ) \n\n#define IDiaStackFrame_get_cplusplusExceptionHandling(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_cplusplusExceptionHandling(This,pRetVal) ) \n\n#define IDiaStackFrame_get_functionStart(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_functionStart(This,pRetVal) ) \n\n#define IDiaStackFrame_get_allocatesBasePointer(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_allocatesBasePointer(This,pRetVal) ) \n\n#define IDiaStackFrame_get_maxStack(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_maxStack(This,pRetVal) ) \n\n#define IDiaStackFrame_get_registerValue(This,index,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerValue(This,index,pRetVal) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackFrame_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumStackFrames_INTERFACE_DEFINED__\n#define __IDiaEnumStackFrames_INTERFACE_DEFINED__\n\n/* interface IDiaEnumStackFrames */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumStackFrames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"ec9d461d-ce74-4711-a020-7d8f9a1dd255\")\n    IDiaEnumStackFrames : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaStackFrame **rgelt,\n            /* [out] */ ULONG *pceltFetched) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumStackFramesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumStackFrames * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumStackFrames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumStackFrames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumStackFrames * This,\n            /* [in] */ ULONG celt,\n            /* [out] */ IDiaStackFrame **rgelt,\n            /* [out] */ ULONG *pceltFetched);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumStackFrames * This);\n        \n        END_INTERFACE\n    } IDiaEnumStackFramesVtbl;\n\n    interface IDiaEnumStackFrames\n    {\n        CONST_VTBL struct IDiaEnumStackFramesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumStackFrames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumStackFrames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumStackFrames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumStackFrames_Next(This,celt,rgelt,pceltFetched)\t\\\n    ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) \n\n#define IDiaEnumStackFrames_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumStackFrames_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_dia2_0000_0050 */\n/* [local] */ \n\ntypedef /* [public] */ struct __MIDL___MIDL_itf_dia2_0000_0050_0001\n    {\n    DWORD ulOffStart;\n    DWORD cbProcSize;\n    DWORD cdwLocals;\n    WORD cdwParams;\n    WORD cdwFlags;\n    } \tFPODATA;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0050_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_dia2_0000_0050_v0_0_s_ifspec;\n\n#ifndef __IDiaStackWalkHelper_INTERFACE_DEFINED__\n#define __IDiaStackWalkHelper_INTERFACE_DEFINED__\n\n/* interface IDiaStackWalkHelper */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackWalkHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"21F81B1B-C5BB-42A3-BC4F-CCBAA75B9F19\")\n    IDiaStackWalkHelper : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_registerValue( \n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_registerValue( \n            /* [in] */ DWORD index,\n            /* [in] */ ULONGLONG NewVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE readMemory( \n            /* [in] */ enum MemoryTypeEnum type,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE searchForReturnAddress( \n            /* [in] */ IDiaFrameData *frame,\n            /* [out] */ ULONGLONG *returnAddress) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE searchForReturnAddressStart( \n            /* [in] */ IDiaFrameData *frame,\n            /* [in] */ ULONGLONG startAddress,\n            /* [out] */ ULONGLONG *returnAddress) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE frameForVA( \n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaFrameData **ppFrame) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE symbolForVA( \n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaSymbol **ppSymbol) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE pdataForVA( \n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE imageForVA( \n            /* [in] */ ULONGLONG vaContext,\n            /* [out] */ ULONGLONG *pvaImageStart) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE addressForVA( \n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE numberOfFunctionFragmentsForVA( \n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE functionFragmentsForVA( \n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [out] */ ULONGLONG *pVaFragment,\n            /* [out] */ DWORD *pLenFragment) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackWalkHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackWalkHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackWalkHelper * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerValue )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_registerValue )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ DWORD index,\n            /* [in] */ ULONGLONG NewVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *readMemory )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ enum MemoryTypeEnum type,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddress )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddressStart )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [in] */ ULONGLONG startAddress,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        HRESULT ( STDMETHODCALLTYPE *frameForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaFrameData **ppFrame);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *pdataForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *imageForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG vaContext,\n            /* [out] */ ULONGLONG *pvaImageStart);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *numberOfFunctionFragmentsForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *functionFragmentsForVA )( \n            IDiaStackWalkHelper * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [out] */ ULONGLONG *pVaFragment,\n            /* [out] */ DWORD *pLenFragment);\n        \n        END_INTERFACE\n    } IDiaStackWalkHelperVtbl;\n\n    interface IDiaStackWalkHelper\n    {\n        CONST_VTBL struct IDiaStackWalkHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackWalkHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackWalkHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackWalkHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackWalkHelper_get_registerValue(This,index,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerValue(This,index,pRetVal) ) \n\n#define IDiaStackWalkHelper_put_registerValue(This,index,NewVal)\t\\\n    ( (This)->lpVtbl -> put_registerValue(This,index,NewVal) ) \n\n#define IDiaStackWalkHelper_readMemory(This,type,va,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> readMemory(This,type,va,cbData,pcbData,pbData) ) \n\n#define IDiaStackWalkHelper_searchForReturnAddress(This,frame,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddress(This,frame,returnAddress) ) \n\n#define IDiaStackWalkHelper_searchForReturnAddressStart(This,frame,startAddress,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddressStart(This,frame,startAddress,returnAddress) ) \n\n#define IDiaStackWalkHelper_frameForVA(This,va,ppFrame)\t\\\n    ( (This)->lpVtbl -> frameForVA(This,va,ppFrame) ) \n\n#define IDiaStackWalkHelper_symbolForVA(This,va,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolForVA(This,va,ppSymbol) ) \n\n#define IDiaStackWalkHelper_pdataForVA(This,va,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> pdataForVA(This,va,cbData,pcbData,pbData) ) \n\n#define IDiaStackWalkHelper_imageForVA(This,vaContext,pvaImageStart)\t\\\n    ( (This)->lpVtbl -> imageForVA(This,vaContext,pvaImageStart) ) \n\n#define IDiaStackWalkHelper_addressForVA(This,va,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForVA(This,va,pISect,pOffset) ) \n\n#define IDiaStackWalkHelper_numberOfFunctionFragmentsForVA(This,vaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> numberOfFunctionFragmentsForVA(This,vaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaStackWalkHelper_functionFragmentsForVA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> functionFragmentsForVA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackWalkHelper_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaStackWalker_INTERFACE_DEFINED__\n#define __IDiaStackWalker_INTERFACE_DEFINED__\n\n/* interface IDiaStackWalker */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackWalker;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"5485216b-a54c-469f-9670-52b24d5229bb\")\n    IDiaStackWalker : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE getEnumFrames( \n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE getEnumFrames2( \n            /* [in] */ enum CV_CPU_TYPE_e cpuid,\n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackWalkerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackWalker * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackWalker * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackWalker * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumFrames )( \n            IDiaStackWalker * This,\n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumFrames2 )( \n            IDiaStackWalker * This,\n            /* [in] */ enum CV_CPU_TYPE_e cpuid,\n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum);\n        \n        END_INTERFACE\n    } IDiaStackWalkerVtbl;\n\n    interface IDiaStackWalker\n    {\n        CONST_VTBL struct IDiaStackWalkerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackWalker_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackWalker_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackWalker_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackWalker_getEnumFrames(This,pHelper,ppEnum)\t\\\n    ( (This)->lpVtbl -> getEnumFrames(This,pHelper,ppEnum) ) \n\n#define IDiaStackWalker_getEnumFrames2(This,cpuid,pHelper,ppEnum)\t\\\n    ( (This)->lpVtbl -> getEnumFrames2(This,cpuid,pHelper,ppEnum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackWalker_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaStackWalkHelper2_INTERFACE_DEFINED__\n#define __IDiaStackWalkHelper2_INTERFACE_DEFINED__\n\n/* interface IDiaStackWalkHelper2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackWalkHelper2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"8222c490-507b-4bef-b3bd-41dca7b5934c\")\n    IDiaStackWalkHelper2 : public IDiaStackWalkHelper\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetPointerAuthenticationMask( \n            /* [in] */ ULONG64 PtrVal,\n            /* [out] */ ULONG64 *AuthMask) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackWalkHelper2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackWalkHelper2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackWalkHelper2 * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_registerValue )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ DWORD index,\n            /* [retval][out] */ ULONGLONG *pRetVal);\n        \n        /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_registerValue )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ DWORD index,\n            /* [in] */ ULONGLONG NewVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *readMemory )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ enum MemoryTypeEnum type,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddress )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        HRESULT ( STDMETHODCALLTYPE *searchForReturnAddressStart )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ IDiaFrameData *frame,\n            /* [in] */ ULONGLONG startAddress,\n            /* [out] */ ULONGLONG *returnAddress);\n        \n        HRESULT ( STDMETHODCALLTYPE *frameForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaFrameData **ppFrame);\n        \n        HRESULT ( STDMETHODCALLTYPE *symbolForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ IDiaSymbol **ppSymbol);\n        \n        HRESULT ( STDMETHODCALLTYPE *pdataForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [in] */ DWORD cbData,\n            /* [out] */ DWORD *pcbData,\n            /* [size_is][out] */ BYTE *pbData);\n        \n        HRESULT ( STDMETHODCALLTYPE *imageForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG vaContext,\n            /* [out] */ ULONGLONG *pvaImageStart);\n        \n        HRESULT ( STDMETHODCALLTYPE *addressForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG va,\n            /* [out] */ DWORD *pISect,\n            /* [out] */ DWORD *pOffset);\n        \n        HRESULT ( STDMETHODCALLTYPE *numberOfFunctionFragmentsForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [out] */ DWORD *pNumFragments);\n        \n        HRESULT ( STDMETHODCALLTYPE *functionFragmentsForVA )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONGLONG vaFunc,\n            /* [in] */ DWORD cbFunc,\n            /* [in] */ DWORD cFragments,\n            /* [out] */ ULONGLONG *pVaFragment,\n            /* [out] */ DWORD *pLenFragment);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPointerAuthenticationMask )( \n            IDiaStackWalkHelper2 * This,\n            /* [in] */ ULONG64 PtrVal,\n            /* [out] */ ULONG64 *AuthMask);\n        \n        END_INTERFACE\n    } IDiaStackWalkHelper2Vtbl;\n\n    interface IDiaStackWalkHelper2\n    {\n        CONST_VTBL struct IDiaStackWalkHelper2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackWalkHelper2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackWalkHelper2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackWalkHelper2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackWalkHelper2_get_registerValue(This,index,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_registerValue(This,index,pRetVal) ) \n\n#define IDiaStackWalkHelper2_put_registerValue(This,index,NewVal)\t\\\n    ( (This)->lpVtbl -> put_registerValue(This,index,NewVal) ) \n\n#define IDiaStackWalkHelper2_readMemory(This,type,va,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> readMemory(This,type,va,cbData,pcbData,pbData) ) \n\n#define IDiaStackWalkHelper2_searchForReturnAddress(This,frame,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddress(This,frame,returnAddress) ) \n\n#define IDiaStackWalkHelper2_searchForReturnAddressStart(This,frame,startAddress,returnAddress)\t\\\n    ( (This)->lpVtbl -> searchForReturnAddressStart(This,frame,startAddress,returnAddress) ) \n\n#define IDiaStackWalkHelper2_frameForVA(This,va,ppFrame)\t\\\n    ( (This)->lpVtbl -> frameForVA(This,va,ppFrame) ) \n\n#define IDiaStackWalkHelper2_symbolForVA(This,va,ppSymbol)\t\\\n    ( (This)->lpVtbl -> symbolForVA(This,va,ppSymbol) ) \n\n#define IDiaStackWalkHelper2_pdataForVA(This,va,cbData,pcbData,pbData)\t\\\n    ( (This)->lpVtbl -> pdataForVA(This,va,cbData,pcbData,pbData) ) \n\n#define IDiaStackWalkHelper2_imageForVA(This,vaContext,pvaImageStart)\t\\\n    ( (This)->lpVtbl -> imageForVA(This,vaContext,pvaImageStart) ) \n\n#define IDiaStackWalkHelper2_addressForVA(This,va,pISect,pOffset)\t\\\n    ( (This)->lpVtbl -> addressForVA(This,va,pISect,pOffset) ) \n\n#define IDiaStackWalkHelper2_numberOfFunctionFragmentsForVA(This,vaFunc,cbFunc,pNumFragments)\t\\\n    ( (This)->lpVtbl -> numberOfFunctionFragmentsForVA(This,vaFunc,cbFunc,pNumFragments) ) \n\n#define IDiaStackWalkHelper2_functionFragmentsForVA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment)\t\\\n    ( (This)->lpVtbl -> functionFragmentsForVA(This,vaFunc,cbFunc,cFragments,pVaFragment,pLenFragment) ) \n\n\n#define IDiaStackWalkHelper2_GetPointerAuthenticationMask(This,PtrVal,AuthMask)\t\\\n    ( (This)->lpVtbl -> GetPointerAuthenticationMask(This,PtrVal,AuthMask) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackWalkHelper2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaStackWalker2_INTERFACE_DEFINED__\n#define __IDiaStackWalker2_INTERFACE_DEFINED__\n\n/* interface IDiaStackWalker2 */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaStackWalker2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"7c185885-a015-4cac-9411-0f4fb39b1f3a\")\n    IDiaStackWalker2 : public IDiaStackWalker\n    {\n    public:\n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaStackWalker2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaStackWalker2 * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaStackWalker2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaStackWalker2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumFrames )( \n            IDiaStackWalker2 * This,\n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum);\n        \n        HRESULT ( STDMETHODCALLTYPE *getEnumFrames2 )( \n            IDiaStackWalker2 * This,\n            /* [in] */ enum CV_CPU_TYPE_e cpuid,\n            /* [in] */ IDiaStackWalkHelper *pHelper,\n            /* [out] */ IDiaEnumStackFrames **ppEnum);\n        \n        END_INTERFACE\n    } IDiaStackWalker2Vtbl;\n\n    interface IDiaStackWalker2\n    {\n        CONST_VTBL struct IDiaStackWalker2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaStackWalker2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaStackWalker2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaStackWalker2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaStackWalker2_getEnumFrames(This,pHelper,ppEnum)\t\\\n    ( (This)->lpVtbl -> getEnumFrames(This,pHelper,ppEnum) ) \n\n#define IDiaStackWalker2_getEnumFrames2(This,cpuid,pHelper,ppEnum)\t\\\n    ( (This)->lpVtbl -> getEnumFrames2(This,cpuid,pHelper,ppEnum) ) \n\n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaStackWalker2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IDiaEnumNamedStreams_INTERFACE_DEFINED__\n#define __IDiaEnumNamedStreams_INTERFACE_DEFINED__\n\n/* interface IDiaEnumNamedStreams */\n/* [unique][helpstring][local][uuid][object] */ \n\n\nEXTERN_C const IID IID_IDiaEnumNamedStreams;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"2B01F5E0-98DB-4824-A9A0-5192833BEF47\")\n    IDiaEnumNamedStreams : public IUnknown\n    {\n    public:\n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ IUnknown **pRetVal) = 0;\n        \n        virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ LONG *pRetVal) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [out] */ BSTR *pName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Skip( \n            /* [in] */ ULONG celt) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Clone( \n            /* [out] */ IDiaEnumNamedStreams **ppenum) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IDiaEnumNamedStreamsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IDiaEnumNamedStreams * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IDiaEnumNamedStreams * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IDiaEnumNamedStreams * This);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            IDiaEnumNamedStreams * This,\n            /* [retval][out] */ IUnknown **pRetVal);\n        \n        /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            IDiaEnumNamedStreams * This,\n            /* [retval][out] */ LONG *pRetVal);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            IDiaEnumNamedStreams * This,\n            /* [out] */ BSTR *pName);\n        \n        HRESULT ( STDMETHODCALLTYPE *Skip )( \n            IDiaEnumNamedStreams * This,\n            /* [in] */ ULONG celt);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            IDiaEnumNamedStreams * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Clone )( \n            IDiaEnumNamedStreams * This,\n            /* [out] */ IDiaEnumNamedStreams **ppenum);\n        \n        END_INTERFACE\n    } IDiaEnumNamedStreamsVtbl;\n\n    interface IDiaEnumNamedStreams\n    {\n        CONST_VTBL struct IDiaEnumNamedStreamsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IDiaEnumNamedStreams_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IDiaEnumNamedStreams_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IDiaEnumNamedStreams_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IDiaEnumNamedStreams_get__NewEnum(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pRetVal) ) \n\n#define IDiaEnumNamedStreams_get_Count(This,pRetVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pRetVal) ) \n\n#define IDiaEnumNamedStreams_Next(This,pName)\t\\\n    ( (This)->lpVtbl -> Next(This,pName) ) \n\n#define IDiaEnumNamedStreams_Skip(This,celt)\t\\\n    ( (This)->lpVtbl -> Skip(This,celt) ) \n\n#define IDiaEnumNamedStreams_Reset(This)\t\\\n    ( (This)->lpVtbl -> Reset(This) ) \n\n#define IDiaEnumNamedStreams_Clone(This,ppenum)\t\\\n    ( (This)->lpVtbl -> Clone(This,ppenum) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IDiaEnumNamedStreams_INTERFACE_DEFINED__ */\n\n\n/* Additional Prototypes for ALL interfaces */\n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "src/windhawk/engine/libraries/dia/diacreate.h",
    "content": "// diacreate.h - creation helper functions for DIA initialization\n//-----------------------------------------------------------------\n// \n// Copyright Microsoft Corporation.  All Rights Reserved.\n//\n//---------------------------------------------------------------\n#ifndef _DIACREATE_H_\n#define _DIACREATE_H_\n\n//\n// Create a dia data source object from the dia dll (by dll name - does not access the registry).\n//\n\nHRESULT STDMETHODCALLTYPE NoRegCoCreate(  const __wchar_t *dllName,\n                        REFCLSID   rclsid,\n                        REFIID     riid,\n                        void     **ppv);\n\n#ifndef _NATIVE_WCHAR_T_DEFINED\n#ifdef __cplusplus\n\n// When compiling with /Zc:wchar_t- this becomes unsigned short overload that maps back to real __wchar_t function\n\ninline HRESULT STDMETHODCALLTYPE NoRegCoCreate(  const wchar_t *dllName,\n                        REFCLSID   rclsid,\n                        REFIID     riid,\n                        void     **ppv) \n{\n    return NoRegCoCreate( (const __wchar_t *)dllName, rclsid, riid, ppv );\n}\n\n#endif\n#endif\n\n\n//\n// Create a dia data source object from the dia dll (looks up the class id in the registry).\n//\nHRESULT STDMETHODCALLTYPE NoOleCoCreate(  REFCLSID   rclsid,\n                        REFIID     riid,\n                        void     **ppv);\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\nproject(phnt)\n\nadd_library(phnt INTERFACE)\ntarget_include_directories(phnt INTERFACE \"${CMAKE_CURRENT_LIST_DIR}\")\ntarget_link_libraries(phnt INTERFACE \"ntdll.lib\")\n\nadd_library(phnt::phnt ALIAS phnt)"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Winsider Seminars & Solutions, Inc.\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": "src/windhawk/engine/libraries/phnt/README.md",
    "content": "This collection of Native API header files has been maintained since 2009 for the System Informer project, and is the most up-to-date set of Native API definitions that we know of. We have gathered these definitions from official Microsoft header files and symbol files, as well as a lot of reverse engineering and guessing. See `phnt.h` for more information.\n\n## Usage\n\nFirst make sure that your program is using the latest Windows SDK.\n\nThese header files are designed to be used by user-mode programs. Instead of `#include <windows.h>`, place\n\n```\n#include <phnt_windows.h>\n#include <phnt.h>\n```\n\nat the top of your program. The first line provides access to the Win32 API as well as the `NTSTATUS` values. The second line provides access to the entire Native API. By default, only definitions present in Windows XP are included into your program. To change this, use one of the following:\n\n```\n#define PHNT_VERSION PHNT_WINXP // Windows XP\n#define PHNT_VERSION PHNT_WS03 // Windows Server 2003\n#define PHNT_VERSION PHNT_VISTA // Windows Vista\n#define PHNT_VERSION PHNT_WIN7 // Windows 7\n#define PHNT_VERSION PHNT_WIN8 // Windows 8\n#define PHNT_VERSION PHNT_WINBLUE // Windows 8.1\n#define PHNT_VERSION PHNT_THRESHOLD // Windows 10\n#define PHNT_VERSION PHNT_WIN11 // Windows 11\n```\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntafd.h",
    "content": "/*\n * Ancillary Function Driver definitions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTAFD_H\n#define _NTAFD_H\n\n#include <WinSock2.h>\n#include <MSWSock.h>\n#include <tdi.h>\n\n// private\n#define AFD_DEVICE_NAME L\"\\\\Device\\\\Afd\"\n\n// private // Extended Attributes\n#define AfdOpenPacket      \"AfdOpenPacketXX\"    // AFD_OPEN_PACKET\n#define AfdSwOpenPacket    \"AfdSwOpenPacket\"    // AFD_SWITCH_OPEN_PACKET // rev\n#define AfdRioRDOpenPacket \"AfdRioRDOpenPacket\" // void // rev\n\n// private\ntypedef struct _AFD_ENDPOINT_FLAGS\n{\n    union\n    {\n        struct\n        {\n            UCHAR ConnectionLess : 1;\n            UCHAR : 3;\n            UCHAR MessageMode : 1;\n            UCHAR Raw : 1;\n            UCHAR : 3;\n            UCHAR Multipoint : 1;\n            UCHAR C_Root : 1;\n            UCHAR : 3;\n            UCHAR D_Root : 1;\n            UCHAR IgnoreTDI : 1;\n            UCHAR : 3;\n            UCHAR RioSocket : 1;\n        };\n        ULONG EndpointFlags;\n    };\n} AFD_ENDPOINT_FLAGS, *PAFD_ENDPOINT_FLAGS;\n\n// private // Transport device names\n#define DD_TCP_DEVICE_NAME      L\"\\\\Device\\\\Tcp\"\n#define DD_TCPV6_DEVICE_NAME    L\"\\\\Device\\\\Tcp6\"\n#define DD_UDP_DEVICE_NAME      L\"\\\\Device\\\\Udp\"\n#define DD_UDPV6_DEVICE_NAME    L\"\\\\Device\\\\Udp6\"\n#define DD_RAW_IP_DEVICE_NAME   L\"\\\\Device\\\\RawIp\"\n#define DD_RAW_IPV6_DEVICE_NAME L\"\\\\Device\\\\RawIp6\"\n\n// private\ntypedef struct _AFD_OPEN_PACKET\n{\n    _In_ AFD_ENDPOINT_FLAGS __f;\n    _In_opt_ GROUP GroupID;\n    _In_ LONG AddressFamily; // AF_*\n    _In_ LONG SocketType; // SOCK_*\n    _In_ LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.\n    _In_opt_ ULONG TransportDeviceNameLength; // Note: specifying a device changes the transport mode\n    _Field_size_bytes_opt_(TransportDeviceNameLength) WCHAR TransportDeviceName[ANYSIZE_ARRAY];\n} AFD_OPEN_PACKET, *PAFD_OPEN_PACKET;\n\n// rev (FILE_FULL_EA_INFORMATION + AfdOpenPacket + AFD_OPEN_PACKET)\ntypedef struct _AFD_OPEN_PACKET_FULL_EA\n{\n    ULONG NextEntryOffset;\n    UCHAR Flags;\n    UCHAR EaNameLength; // sizeof(AfdOpenPacket) - sizeof(ANSI_NULL);\n    USHORT EaValueLength; // sizeof(AFD_OPEN_PACKET)\n    CHAR EaName[sizeof(AfdOpenPacket)];\n    AFD_OPEN_PACKET OpenPacket;\n} AFD_OPEN_PACKET_FULL_EA, *PAFD_OPEN_PACKET_FULL_EA;\n\n// private\ntypedef struct _AFD_SWITCH_OPEN_PACKET\n{\n    HANDLE CompletionPort;\n    HANDLE CompletionEvent;\n} AFD_SWITCH_OPEN_PACKET, *PAFD_SWITCH_OPEN_PACKET;\n\n//\n// Since Vista, sockets can use different modes of transport: TLI, TDI, and hybrid. The mode is selected\n// based on whether the caller specifies the transport device at socket creation and whether this device\n// is suitable for hybrid operation. No device means TLI, which is the most common choice.\n//\n// The transport mode affects which structures AFD uses for IOCTLs on the socket:\n//  - TLI sockets use *_TL structures (where applicable) and SOCKADDR for addresses.\n//  - TDI and hybrid sockets use non-TL structures and TDI_ADDRESS_INFO for addresses.\n//\n\n// private // IOCTL function numbers\n#define AFD_BIND                        0 // in: AFD_BIND_INFO_TL; out: SOCKADDR /or/ in: AFD_BIND_INFO; out: TDI_ADDRESS_INFO (depending on transport mode)\n#define AFD_CONNECT                     1 // in: AFD_CONNECT_JOIN_INFO_TL or AFD_CONNECT_JOIN_INFO (depending on transport mode); out (opt): IO_STATUS_BLOCK\n#define AFD_START_LISTEN                2 // in: AFD_LISTEN_INFO\n#define AFD_WAIT_FOR_LISTEN             3 // out: AFD_LISTEN_RESPONSE_INFO_TL or AFD_LISTEN_RESPONSE_INFO (depending on transport mode)\n#define AFD_ACCEPT                      4 // in: AFD_ACCEPT_INFO\n#define AFD_RECEIVE                     5 // in: AFD_RECV_INFO\n#define AFD_RECEIVE_DATAGRAM            6 // in: AFD_DATAGRAM_INFO\n#define AFD_SEND                        7 // in: AFD_SEND_INFO\n#define AFD_SEND_DATAGRAM               8 // in: AFD_SEND_DATAGRAM_INFO\n#define AFD_POLL                        9 // in, out: AFD_POLL_INFO\n#define AFD_PARTIAL_DISCONNECT          10 // in: AFD_PARTIAL_DISCONNECT_INFO\n#define AFD_GET_ADDRESS                 11 // out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode)\n#define AFD_QUERY_RECEIVE_INFO          12 // out: AFD_RECEIVE_INFORMATION\n#define AFD_QUERY_HANDLES               13 // in: ULONG (AFD_QUERY_*); out: AFD_HANDLE_INFO\n#define AFD_SET_INFORMATION             14 // in: AFD_INFORMATION\n#define AFD_GET_REMOTE_ADDRESS          15 // out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode)\n#define AFD_GET_CONTEXT                 16 // out: SOCK_SHARED_INFO (on Win32 level) or custom data\n#define AFD_SET_CONTEXT                 17 // in: SOCK_SHARED_INFO (on Win32 level) or custom data; out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode; output buffer must be inside the input buffer)\n#define AFD_SET_CONNECT_DATA            18 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SET_CONNECT_OPTIONS         19 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SET_DISCONNECT_DATA         20 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SET_DISCONNECT_OPTIONS      21 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_GET_CONNECT_DATA            22 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_GET_CONNECT_OPTIONS         23 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_GET_DISCONNECT_DATA         24 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_GET_DISCONNECT_OPTIONS      25 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SIZE_CONNECT_DATA           26 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SIZE_CONNECT_OPTIONS        27 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SIZE_DISCONNECT_DATA        28 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_SIZE_DISCONNECT_OPTIONS     29 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload\n#define AFD_GET_INFORMATION             30 // in, out: AFD_INFORMATION\n#define AFD_TRANSMIT_FILE               31 // in: AFD_TRANSMIT_FILE_INFO; out (opt): BOOLEAN\n#define AFD_SUPER_ACCEPT                32 // in: AFD_SUPER_ACCEPT_INFO; out: received data + local address + remote address (at offsets according to the input)\n#define AFD_EVENT_SELECT                33 // in: AFD_EVENT_SELECT_INFO\n#define AFD_ENUM_NETWORK_EVENTS         34 // in (opt): HANDLE; out: AFD_ENUM_NETWORK_EVENTS_INFO\n#define AFD_DEFER_ACCEPT                35 // in: AFD_DEFER_ACCEPT_INFO\n#define AFD_WAIT_FOR_LISTEN_LIFO        36 // out: AFD_LISTEN_RESPONSE_INFO_TL or AFD_LISTEN_RESPONSE_INFO (depending on transport mode)\n#define AFD_SET_QOS                     37 // in: AFD_QOS_INFO\n#define AFD_GET_QOS                     38 // out: AFD_QOS_INFO\n#define AFD_NO_OPERATION                39 // in (opt): IO_STATUS_BLOCK\n#define AFD_VALIDATE_GROUP              40 // in: AFD_VALIDATE_GROUP_INFO\n#define AFD_GET_UNACCEPTED_CONNECT_DATA 41 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: AFD_UNACCEPTED_CONNECT_DATA_INFO (when LengthOnly is set) or received data\n#define AFD_ROUTING_INTERFACE_QUERY     42 // in: TRANSPORT_ADDRESS; out: SOCKADDR\n#define AFD_ROUTING_INTERFACE_CHANGE    43 // in: AFD_TRANSPORT_IOCTL_INFO\n#define AFD_ADDRESS_LIST_QUERY          44 // in: USHORT (TDI_ADDRESS_TYPE_*/AF_*); out: TRANSPORT_ADDRESS\n#define AFD_ADDRESS_LIST_CHANGE         45 // in: AFD_TRANSPORT_IOCTL_INFO\n#define AFD_JOIN_LEAF                   46 // in: AFD_CONNECT_JOIN_INFO_TL or AFD_CONNECT_JOIN_INFO (depending on transport mode); out (opt): IO_STATUS_BLOCK\n#define AFD_TRANSPORT_IOCTL             47 // in: AFD_TL_IO_CONTROL_INFO; out: variable\n#define AFD_TRANSMIT_PACKETS            48 // in: AFD_TPACKETS_INFO; out (opt): BOOLEAN\n#define AFD_SUPER_CONNECT               49 // in: AFD_SUPER_CONNECT_INFO_TL or AFD_SUPER_CONNECT_INFO (depending on transport mode); out: payload\n#define AFD_SUPER_DISCONNECT            50 // in: AFD_SUPER_DISCONNECT_INFO\n#define AFD_RECEIVE_MESSAGE             51 // in: AFD_MESSAGE_INFO\n#define AFD_SEND_MESSAGE                52 // in: AFD_MESSAGE_INFO // rev // since VISTA // breaks layout; values below are different on XP\n#define AFD_SWITCH_CEMENT_SAN           53 // in: AFD_SWITCH_CONTEXT_INFO\n#define AFD_SWITCH_SET_EVENTS           54 // in: AFD_SWITCH_EVENT_INFO\n#define AFD_SWITCH_RESET_EVENTS         55 // in: AFD_SWITCH_EVENT_INFO\n#define AFD_SWITCH_CONNECT_IND          56 // in: AFD_SWITCH_CONNECT_INFO; out: AFD_SWITCH_ACCEPT_INFO\n#define AFD_SWITCH_CMPL_ACCEPT          57 // in: AFD_SWITCH_CONTEXT_INFO; out: payload\n#define AFD_SWITCH_CMPL_REQUEST         58 // in: AFD_SWITCH_REQUEST_INFO; out: payload\n#define AFD_SWITCH_CMPL_IO              59 // in: IO_STATUS_BLOCK\n#define AFD_SWITCH_REFRESH_ENDP         60 // in: AFD_SWITCH_CONTEXT_INFO\n#define AFD_SWITCH_GET_PHYSICAL_ADDR    61 // deprecated\n#define AFD_SWITCH_ACQUIRE_CTX          62 // in: AFD_SWITCH_ACQUIRE_CTX_INFO; out: payload\n#define AFD_SWITCH_TRANSFER_CTX         63 // in: AFD_SWITCH_TRANSFER_CTX_INFO\n#define AFD_SWITCH_GET_SERVICE_PID      64 // in/out: void; returns PID in IO_STATUS_BLOCK.Information\n#define AFD_SWITCH_SET_SERVICE_PROCESS  65 // in/out: void\n#define AFD_SWITCH_PROVIDER_CHANGE      66 // in/out: void\n#define AFD_SWITCH_ADDRLIST_CHANGE      67 // in: AFD_TRANSPORT_IOCTL_INFO\n#define AFD_UNBIND                      68 // in: AFD_UNBIND_INFO // rev // since VISTA\n#define AFD_SQM                         69 // in: AFD_SQM_INFO // rev // since WIN7\n#define AFD_RIO                         70 // in/out: AFD_RIO_COMMAND_HEADER // rev // since WIN8\n#define AFD_TRANSFER_BEGIN              71 // in/out: void // rev // since TH1\n#define AFD_TRANSFER_END                72 // in/out: void // rev // since TH1\n#define AFD_NOTIFY                      73 // rev // since 22H2\n\n// private // Note: different bit layout from CTL_CODE\n#define FSCTL_AFD_BASE  FILE_DEVICE_NETWORK\n#define _AFD_CONTROL_CODE(Request, Method) (FSCTL_AFD_BASE << 12 | (Request) << 2 | (Method))\n\n// private // IOCTLs\n#define IOCTL_AFD_BIND                        _AFD_CONTROL_CODE(AFD_BIND, METHOD_NEITHER) // 0x12003\n#define IOCTL_AFD_CONNECT                     _AFD_CONTROL_CODE(AFD_CONNECT, METHOD_NEITHER) // 0x12007\n#define IOCTL_AFD_START_LISTEN                _AFD_CONTROL_CODE(AFD_START_LISTEN, METHOD_NEITHER) // 0x1200B\n#define IOCTL_AFD_WAIT_FOR_LISTEN             _AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN, METHOD_BUFFERED) // 0x1200C\n#define IOCTL_AFD_ACCEPT                      _AFD_CONTROL_CODE(AFD_ACCEPT, METHOD_BUFFERED) // 0x12010\n#define IOCTL_AFD_RECEIVE                     _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER) // 0x12017\n#define IOCTL_AFD_RECEIVE_DATAGRAM            _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER) // 0x1201B\n#define IOCTL_AFD_SEND                        _AFD_CONTROL_CODE(AFD_SEND, METHOD_NEITHER) // 0x1201F\n#define IOCTL_AFD_SEND_DATAGRAM               _AFD_CONTROL_CODE(AFD_SEND_DATAGRAM, METHOD_NEITHER) // 0x12023\n#define IOCTL_AFD_POLL                        _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED) // 0x12024\n#define IOCTL_AFD_PARTIAL_DISCONNECT          _AFD_CONTROL_CODE(AFD_PARTIAL_DISCONNECT, METHOD_NEITHER) // 0x1202B\n#define IOCTL_AFD_GET_ADDRESS                 _AFD_CONTROL_CODE(AFD_GET_ADDRESS, METHOD_NEITHER) // 0x1202F\n#define IOCTL_AFD_QUERY_RECEIVE_INFO          _AFD_CONTROL_CODE(AFD_QUERY_RECEIVE_INFO, METHOD_NEITHER) // 0x12033\n#define IOCTL_AFD_QUERY_HANDLES               _AFD_CONTROL_CODE(AFD_QUERY_HANDLES, METHOD_NEITHER) // 0x12037\n#define IOCTL_AFD_SET_INFORMATION             _AFD_CONTROL_CODE(AFD_SET_INFORMATION, METHOD_NEITHER) // 0x1203B\n#define IOCTL_AFD_GET_REMOTE_ADDRESS          _AFD_CONTROL_CODE(AFD_GET_REMOTE_ADDRESS, METHOD_NEITHER) // 0x1203F\n#define IOCTL_AFD_GET_CONTEXT                 _AFD_CONTROL_CODE(AFD_GET_CONTEXT, METHOD_NEITHER) // 0x12043\n#define IOCTL_AFD_SET_CONTEXT                 _AFD_CONTROL_CODE(AFD_SET_CONTEXT, METHOD_NEITHER) // 0x12047\n#define IOCTL_AFD_SET_CONNECT_DATA            _AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA, METHOD_NEITHER) // 0x1204B\n#define IOCTL_AFD_SET_CONNECT_OPTIONS         _AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1204F\n#define IOCTL_AFD_SET_DISCONNECT_DATA         _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA, METHOD_NEITHER) // 0x12053\n#define IOCTL_AFD_SET_DISCONNECT_OPTIONS      _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12057\n#define IOCTL_AFD_GET_CONNECT_DATA            _AFD_CONTROL_CODE(AFD_GET_CONNECT_DATA, METHOD_NEITHER) // 0x1205B\n#define IOCTL_AFD_GET_CONNECT_OPTIONS         _AFD_CONTROL_CODE(AFD_GET_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1205F\n#define IOCTL_AFD_GET_DISCONNECT_DATA         _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_DATA, METHOD_NEITHER) // 0x12063\n#define IOCTL_AFD_GET_DISCONNECT_OPTIONS      _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12067\n#define IOCTL_AFD_SIZE_CONNECT_DATA           _AFD_CONTROL_CODE(AFD_SIZE_CONNECT_DATA, METHOD_NEITHER) // 0x1206B\n#define IOCTL_AFD_SIZE_CONNECT_OPTIONS        _AFD_CONTROL_CODE(AFD_SIZE_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1206F\n#define IOCTL_AFD_SIZE_DISCONNECT_DATA        _AFD_CONTROL_CODE(AFD_SIZE_DISCONNECT_DATA, METHOD_NEITHER) // 0x12073\n#define IOCTL_AFD_SIZE_DISCONNECT_OPTIONS     _AFD_CONTROL_CODE(AFD_SIZE_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12077\n#define IOCTL_AFD_GET_INFORMATION             _AFD_CONTROL_CODE(AFD_GET_INFORMATION, METHOD_NEITHER) // 0x1207B\n#define IOCTL_AFD_TRANSMIT_FILE               _AFD_CONTROL_CODE(AFD_TRANSMIT_FILE, METHOD_NEITHER) // 0x1207F\n#define IOCTL_AFD_SUPER_ACCEPT                _AFD_CONTROL_CODE(AFD_SUPER_ACCEPT, METHOD_NEITHER) // 0x12083\n#define IOCTL_AFD_EVENT_SELECT                _AFD_CONTROL_CODE(AFD_EVENT_SELECT, METHOD_NEITHER) // 0x12087\n#define IOCTL_AFD_ENUM_NETWORK_EVENTS         _AFD_CONTROL_CODE(AFD_ENUM_NETWORK_EVENTS, METHOD_NEITHER) // 0x1208B\n#define IOCTL_AFD_DEFER_ACCEPT                _AFD_CONTROL_CODE(AFD_DEFER_ACCEPT, METHOD_BUFFERED) // 0x1208C\n#define IOCTL_AFD_WAIT_FOR_LISTEN_LIFO        _AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN_LIFO, METHOD_BUFFERED) // 0x12090\n#define IOCTL_AFD_SET_QOS                     _AFD_CONTROL_CODE(AFD_SET_QOS, METHOD_BUFFERED) // 0x12094\n#define IOCTL_AFD_GET_QOS                     _AFD_CONTROL_CODE(AFD_GET_QOS, METHOD_BUFFERED) // 0x12098\n#define IOCTL_AFD_NO_OPERATION                _AFD_CONTROL_CODE(AFD_NO_OPERATION, METHOD_NEITHER) // 0x1209F\n#define IOCTL_AFD_VALIDATE_GROUP              _AFD_CONTROL_CODE(AFD_VALIDATE_GROUP, METHOD_BUFFERED) // 0x120A0\n#define IOCTL_AFD_GET_UNACCEPTED_CONNECT_DATA _AFD_CONTROL_CODE(AFD_GET_UNACCEPTED_CONNECT_DATA, METHOD_NEITHER) // 0x120A7\n#define IOCTL_AFD_ROUTING_INTERFACE_QUERY     _AFD_CONTROL_CODE(AFD_ROUTING_INTERFACE_QUERY, METHOD_NEITHER) // 0x120AB\n#define IOCTL_AFD_ROUTING_INTERFACE_CHANGE    _AFD_CONTROL_CODE(AFD_ROUTING_INTERFACE_CHANGE, METHOD_BUFFERED) // 0x120AC\n#define IOCTL_AFD_ADDRESS_LIST_QUERY          _AFD_CONTROL_CODE(AFD_ADDRESS_LIST_QUERY, METHOD_NEITHER) // 0x120B3\n#define IOCTL_AFD_ADDRESS_LIST_CHANGE         _AFD_CONTROL_CODE(AFD_ADDRESS_LIST_CHANGE, METHOD_BUFFERED) // 0x120B4\n#define IOCTL_AFD_JOIN_LEAF                   _AFD_CONTROL_CODE(AFD_JOIN_LEAF, METHOD_NEITHER) // 0x120BB\n#define IOCTL_AFD_TRANSPORT_IOCTL             _AFD_CONTROL_CODE(AFD_TRANSPORT_IOCTL, METHOD_NEITHER) // 0x120BF\n#define IOCTL_AFD_TRANSMIT_PACKETS            _AFD_CONTROL_CODE(AFD_TRANSMIT_PACKETS, METHOD_NEITHER) // 0x120C3\n#define IOCTL_AFD_SUPER_CONNECT               _AFD_CONTROL_CODE(AFD_SUPER_CONNECT, METHOD_NEITHER) // 0x120C7\n#define IOCTL_AFD_SUPER_DISCONNECT            _AFD_CONTROL_CODE(AFD_SUPER_DISCONNECT, METHOD_NEITHER) // 0x120CB\n#define IOCTL_AFD_RECEIVE_MESSAGE             _AFD_CONTROL_CODE(AFD_RECEIVE_MESSAGE, METHOD_NEITHER) // 0x120CF\n#define IOCTL_AFD_SEND_MESSAGE                _AFD_CONTROL_CODE(AFD_SEND_MESSAGE, METHOD_NEITHER) // 0x120D3 // rev // since VISTA\n#define IOCTL_AFD_SWITCH_CEMENT_SAN           _AFD_CONTROL_CODE(AFD_SWITCH_CEMENT_SAN, METHOD_NEITHER) // 0x120D7\n#define IOCTL_AFD_SWITCH_SET_EVENTS           _AFD_CONTROL_CODE(AFD_SWITCH_SET_EVENTS, METHOD_NEITHER) // 0x120DB\n#define IOCTL_AFD_SWITCH_RESET_EVENTS         _AFD_CONTROL_CODE(AFD_SWITCH_RESET_EVENTS, METHOD_NEITHER) // 0x120DF\n#define IOCTL_AFD_SWITCH_CONNECT_IND          _AFD_CONTROL_CODE(AFD_SWITCH_CONNECT_IND, METHOD_OUT_DIRECT) // 0x120E2\n#define IOCTL_AFD_SWITCH_CMPL_ACCEPT          _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_ACCEPT, METHOD_NEITHER) // 0x120E7\n#define IOCTL_AFD_SWITCH_CMPL_REQUEST         _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_REQUEST, METHOD_NEITHER) // 0x120EB\n#define IOCTL_AFD_SWITCH_CMPL_IO              _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_IO, METHOD_NEITHER) // 0x120EF\n#define IOCTL_AFD_SWITCH_REFRESH_ENDP         _AFD_CONTROL_CODE(AFD_SWITCH_REFRESH_ENDP, METHOD_NEITHER) // 0x120F3\n#define IOCTL_AFD_SWITCH_GET_PHYSICAL_ADDR    _AFD_CONTROL_CODE(AFD_SWITCH_GET_PHYSICAL_ADDR, METHOD_NEITHER) // 0x120F7\n#define IOCTL_AFD_SWITCH_ACQUIRE_CTX          _AFD_CONTROL_CODE(AFD_SWITCH_ACQUIRE_CTX, METHOD_NEITHER) // 0x120FB\n#define IOCTL_AFD_SWITCH_TRANSFER_CTX         _AFD_CONTROL_CODE(AFD_SWITCH_TRANSFER_CTX, METHOD_NEITHER) // 0x120FF\n#define IOCTL_AFD_SWITCH_GET_SERVICE_PID      _AFD_CONTROL_CODE(AFD_SWITCH_GET_SERVICE_PID, METHOD_NEITHER) // 0x12103\n#define IOCTL_AFD_SWITCH_SET_SERVICE_PROCESS  _AFD_CONTROL_CODE(AFD_SWITCH_SET_SERVICE_PROCESS, METHOD_NEITHER) // 0x12107\n#define IOCTL_AFD_SWITCH_PROVIDER_CHANGE      _AFD_CONTROL_CODE(AFD_SWITCH_PROVIDER_CHANGE, METHOD_NEITHER) // 0x1210B\n#define IOCTL_AFD_SWITCH_ADDRLIST_CHANGE      _AFD_CONTROL_CODE(AFD_SWITCH_ADDRLIST_CHANGE, METHOD_BUFFERED) // 0x1210C\n#define IOCTL_AFD_UNBIND                      _AFD_CONTROL_CODE(AFD_UNBIND, METHOD_NEITHER) // 0x12113 // rev\n#define IOCTL_AFD_SQM                         _AFD_CONTROL_CODE(AFD_SQM, METHOD_NEITHER) // 0x12117 // rev // since WIN7\n#define IOCTL_AFD_RIO                         _AFD_CONTROL_CODE(AFD_RIO, METHOD_NEITHER) // 0x1211B // rev // since WIN8\n#define IOCTL_AFD_TRANSFER_BEGIN              _AFD_CONTROL_CODE(AFD_TRANSFER_BEGIN, METHOD_NEITHER) // 0x1211F // rev // since TH1\n#define IOCTL_AFD_TRANSFER_END                _AFD_CONTROL_CODE(AFD_TRANSFER_END, METHOD_NEITHER) // 0x12123 // rev\n#define IOCTL_AFD_NOTIFY                      _AFD_CONTROL_CODE(AFD_NOTIFY, METHOD_NEITHER) // 0x12127 // rev // since 22H2\n\n#include <pshpack1.h>\n\n// rev - a union for TLI/TDI socket addresses\ntypedef union _AFD_ADDRESS\n{\n    SOCKADDR_STORAGE TliAddress;\n    TDI_ADDRESS_INFO TdiAddress;\n\n    struct\n    {\n        //\n        // TDI_ADDRESS_INFO includes an embedded socket address that starts at AddressType (which corresponds to sa_family).\n        //\n        // ---------------- | ------------------------- |\n        //                  | ULONG ActivityCount       |\n        //                  | ------------------------- | --------------------- |\n        //                  |                           | ULONG TAAddressCount  |\n        //                  |                           | --------------------- | ---------------------------- |\n        //                  |                           |                       | USHORT AddressLength         |\n        // TDI_ADDRESS_INFO | TRANSPORT_ADDRESS Address |                       | ---------------------------- | ---------- | ---------------- |\n        //                  |                           | TA_ADDRESS Address[1] | USHORT AddressType           |            | USHORT sa_family |\n        //                  |                           |                       | ---------------------------- |  SOCKADDR  | ---------------- |\n        //                  |                           |                       | UCHAR Address[AddressLength] | (embedded) |       ...        |\n        //                  |                           |                       |             ...              |            |                  |\n        // ---------------- | ------------------------- | --------------------- | ---------------------------- | ---------- | ---------------- |\n        //\n\n        UCHAR Padding[10]; // RTL_SIZEOF_THROUGH_FIELD(TDI_ADDRESS_INFO, Address.Address[0].AddressLength)\n        SOCKADDR_STORAGE EmbeddedAddress;\n    } TdiAddressUnpacked;\n} AFD_ADDRESS, *PAFD_ADDRESS;\n\n#include <poppack.h>\n\n// private // Bind share access\n#define AFD_NORMALADDRUSE    0\n#define AFD_REUSEADDRESS     1\n#define AFD_WILDCARDADDRESS  2\n#define AFD_EXCLUSIVEADDRUSE 3\n\n// private\ntypedef struct _AFD_BIND_INFO\n{\n    ULONG ShareAccess;\n    TRANSPORT_ADDRESS Address;\n} AFD_BIND_INFO, *PAFD_BIND_INFO;\n\n// private\ntypedef struct _AFD_BIND_INFO_TL\n{\n    ULONG ShareAccess;\n    SOCKADDR Address;\n} AFD_BIND_INFO_TL, *PAFD_BIND_INFO_TL;\n\n// private\ntypedef struct _AFD_CONNECT_JOIN_INFO\n{\n    BOOLEAN SanActive;\n    HANDLE RootEndpoint;\n    HANDLE ConnectEndpoint;\n    TRANSPORT_ADDRESS RemoteAddress;\n} AFD_CONNECT_JOIN_INFO, *PAFD_CONNECT_JOIN_INFO;\n\n// private\ntypedef struct _AFD_CONNECT_JOIN_INFO_TL\n{\n    BOOLEAN SanActive;\n    HANDLE RootEndpoint;\n    HANDLE ConnectEndpoint;\n    SOCKADDR RemoteAddress;\n} AFD_CONNECT_JOIN_INFO_TL, *PAFD_CONNECT_JOIN_INFO_TL;\n\n// private\ntypedef struct _AFD_LISTEN_INFO\n{\n    BOOLEAN SanActive;\n    ULONG MaximumConnectionQueue;\n    BOOLEAN UseDelayedAcceptance;\n} AFD_LISTEN_INFO, *PAFD_LISTEN_INFO;\n\n// private\ntypedef struct _AFD_LISTEN_RESPONSE_INFO\n{\n    LONG Sequence;\n    TRANSPORT_ADDRESS RemoteAddress;\n} AFD_LISTEN_RESPONSE_INFO, *PAFD_LISTEN_RESPONSE_INFO;\n\n// private\ntypedef struct _AFD_LISTEN_RESPONSE_INFO_TL\n{\n    LONG Sequence;\n    SOCKADDR RemoteAddress;\n} AFD_LISTEN_RESPONSE_INFO_TL, *PAFD_LISTEN_RESPONSE_INFO_TL;\n\n// private\ntypedef struct _AFD_ACCEPT_INFO\n{\n    BOOLEAN SanActive;\n    LONG Sequence;\n    HANDLE AcceptHandle;\n} AFD_ACCEPT_INFO, *PAFD_ACCEPT_INFO;\n\n// private // AfdFlags\n#define AFD_NO_FAST_IO 0x0001\n#define AFD_OVERLAPPED 0x0002\n\n// private\ntypedef struct _AFD_RECV_INFO\n{\n    _Field_size_(BufferCount) LPWSABUF BufferArray;\n    ULONG BufferCount;\n    ULONG AfdFlags;\n    ULONG TdiFlags; // TDI_RECEIVE_*\n} AFD_RECV_INFO, *PAFD_RECV_INFO;\n\n// private\ntypedef struct _AFD_DATAGRAM_INFO\n{\n    _Field_size_(BufferCount) LPWSABUF BufferArray;\n    ULONG BufferCount;\n    ULONG AfdFlags;\n    ULONG TdiFlags; // TDI_RECEIVE_*\n    PVOID Address;\n    PULONG AddressLength;\n} AFD_DATAGRAM_INFO, *PAFD_DATAGRAM_INFO;\n\n// private\ntypedef struct _AFD_SEND_INFO\n{\n    _Field_size_(BufferCount) LPWSABUF BufferArray;\n    ULONG BufferCount;\n    ULONG AfdFlags;\n    ULONG TdiFlags; // TDI_RECEIVE_*\n} AFD_SEND_INFO, *PAFD_SEND_INFO;\n\n// private\ntypedef struct _AFD_SEND_DATAGRAM_INFO\n{\n    _Field_size_(BufferCount) LPWSABUF BufferArray;\n    ULONG BufferCount;\n    ULONG AfdFlags;\n    TDI_REQUEST_SEND_DATAGRAM TdiRequest;\n    TDI_CONNECTION_INFORMATION TdiConnInfo;\n} AFD_SEND_DATAGRAM_INFO, *PAFD_SEND_DATAGRAM_INFO;\n\n// private // Poll event bit numbers\n#define AFD_POLL_RECEIVE_BIT             0\n#define AFD_POLL_RECEIVE_EXPEDITED_BIT   1\n#define AFD_POLL_SEND_BIT                2\n#define AFD_POLL_DISCONNECT_BIT          3\n#define AFD_POLL_ABORT_BIT               4\n#define AFD_POLL_LOCAL_CLOSE_BIT         5\n#define AFD_POLL_CONNECT_BIT             6\n#define AFD_POLL_ACCEPT_BIT              7\n#define AFD_POLL_CONNECT_FAIL_BIT        8\n#define AFD_POLL_QOS_BIT                 9\n#define AFD_POLL_GROUP_QOS_BIT           10\n#define AFD_POLL_ROUTING_IF_CHANGE_BIT   11\n#define AFD_POLL_ADDRESS_LIST_CHANGE_BIT 12\n#define AFD_NUM_POLL_EVENTS              13\n\n// private // Poll event flags\n#define AFD_POLL_RECEIVE             (1 << AFD_POLL_RECEIVE_BIT) // 0x0001\n#define AFD_POLL_RECEIVE_EXPEDITED   (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) // 0x0002\n#define AFD_POLL_SEND                (1 << AFD_POLL_SEND_BIT) // 0x0004\n#define AFD_POLL_DISCONNECT          (1 << AFD_POLL_DISCONNECT_BIT) // 0x0008\n#define AFD_POLL_ABORT               (1 << AFD_POLL_ABORT_BIT) // 0x0010\n#define AFD_POLL_LOCAL_CLOSE         (1 << AFD_POLL_LOCAL_CLOSE_BIT) // 0x0020\n#define AFD_POLL_CONNECT             (1 << AFD_POLL_CONNECT_BIT) // 0x0040\n#define AFD_POLL_ACCEPT              (1 << AFD_POLL_ACCEPT_BIT) // 0x0080\n#define AFD_POLL_CONNECT_FAIL        (1 << AFD_POLL_CONNECT_FAIL_BIT) // 0x0100\n#define AFD_POLL_QOS                 (1 << AFD_POLL_QOS_BIT) // 0x0200\n#define AFD_POLL_GROUP_QOS           (1 << AFD_POLL_GROUP_QOS_BIT) // 0x0400\n#define AFD_POLL_ROUTING_IF_CHANGE   (1 << AFD_POLL_ROUTING_IF_CHANGE_BIT) // 0x0800\n#define AFD_POLL_ADDRESS_LIST_CHANGE (1 << AFD_POLL_ADDRESS_LIST_CHANGE_BIT) // 0x1000\n#define AFD_POLL_ALL                 ((1 << AFD_NUM_POLL_EVENTS) - 1) // 0x1FFF\n#define AFD_POLL_SANCOUNTS_UPDATED   0x80000000\n\n// private\ntypedef struct _AFD_POLL_HANDLE_INFO\n{\n    HANDLE Handle;\n    ULONG PollEvents; // AFD_POLL_*\n    NTSTATUS Status;\n} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;\n\n// private\ntypedef struct _AFD_POLL_INFO\n{\n    LARGE_INTEGER Timeout;\n    ULONG NumberOfHandles;\n    BOOLEAN Unique;\n    _Field_size_(NumberOfHandles) AFD_POLL_HANDLE_INFO Handles[ANYSIZE_ARRAY];\n} AFD_POLL_INFO, *PAFD_POLL_INFO;\n\n// private // Disconnect flags\n#define AFD_PARTIAL_DISCONNECT_SEND    0x01\n#define AFD_PARTIAL_DISCONNECT_RECEIVE 0x02\n#define AFD_ABORTIVE_DISCONNECT        0x04\n#define AFD_UNCONNECT_DATAGRAM         0x08\n\n// private\ntypedef struct _AFD_PARTIAL_DISCONNECT_INFO\n{\n    ULONG DisconnectMode;\n    LARGE_INTEGER Timeout;\n} AFD_PARTIAL_DISCONNECT_INFO, *PAFD_PARTIAL_DISCONNECT_INFO;\n\n// private\ntypedef struct _AFD_RECEIVE_INFORMATION\n{\n    ULONG BytesAvailable;\n    ULONG ExpeditedBytesAvailable;\n} AFD_RECEIVE_INFORMATION, *PAFD_RECEIVE_INFORMATION;\n\n// private // Handle query flags\n#define AFD_QUERY_ADDRESS_HANDLE    0x01\n#define AFD_QUERY_CONNECTION_HANDLE 0x02\n\n// private\ntypedef struct _AFD_HANDLE_INFO\n{\n    HANDLE TdiAddressHandle;\n    HANDLE TdiConnectionHandle;\n} AFD_HANDLE_INFO, *PAFD_HANDLE_INFO;\n\n// private // InformationType\n#define AFD_INLINE_MODE                1 // s: BOOLEAN\n#define AFD_NONBLOCKING_MODE           2 // s: BOOLEAN\n#define AFD_MAX_SEND_SIZE              3 // q: ULONG\n#define AFD_SENDS_PENDING              4 // q: ULONG\n#define AFD_MAX_PATH_SEND_SIZE         5 // q: ULONG\n#define AFD_RECEIVE_WINDOW_SIZE        6 // q; s: ULONG\n#define AFD_SEND_WINDOW_SIZE           7 // q; s: ULONG\n#define AFD_CONNECT_TIME               8 // q: ULONG (in seconds)\n#define AFD_CIRCULAR_QUEUEING          9 // s: BOOLEAN\n#define AFD_GROUP_ID_AND_TYPE          10 // q: AFD_GROUP_INFO\n#define AFD_REPORT_PORT_UNREACHABLE    11 // s: BOOLEAN\n#define AFD_REPORT_NETWORK_UNREACHABLE 12 // s: BOOLEAN // rev\n#define AFD_DELIVERY_STATUS            14 // q: SIO_DELIVERY_STATUS // rev\n#define AFD_CANCEL_TL                  15 // s: void // rev\n\n// private\ntypedef enum _AFD_GROUP_TYPE\n{\n    GroupTypeNeither = 0,\n    GroupTypeUnconstrained = SG_UNCONSTRAINED_GROUP,\n    GroupTypeConstrained = SG_CONSTRAINED_GROUP,\n} AFD_GROUP_TYPE, *PAFD_GROUP_TYPE;\n\n// private\ntypedef struct _AFD_GROUP_INFO\n{\n    GROUP GroupID;\n    AFD_GROUP_TYPE GroupType;\n} AFD_GROUP_INFO, *PAFD_GROUP_INFO;\n\n// private\ntypedef struct _SIO_DELIVERY_STATUS\n{\n    BOOLEAN DeliveryAvailable;\n    ULONG PendedReceiveRequests;\n} SIO_DELIVERY_STATUS, *PSIO_DELIVERY_STATUS;\n\n// private\ntypedef struct _AFD_INFORMATION\n{\n    ULONG InformationType;\n    union\n    {\n        BOOLEAN Boolean;\n        ULONG Ulong;\n        LARGE_INTEGER LargeInteger;\n        AFD_GROUP_INFO GroupInfo; // rev\n        SIO_DELIVERY_STATUS DeliveryStatus; // rev\n    } Information;\n} AFD_INFORMATION, *PAFD_INFORMATION;\n\n// private\ntypedef enum _SOCKET_STATE\n{\n  SocketStateInitializing = -1,\n  SocketStateOpen = 0,\n  SocketStateBound = 1,\n  SocketStateBoundSpecific = 2,\n  SocketStateConnected = 3,\n  SocketStateClosing = 4,\n} SOCKET_STATE, *PSOCKET_STATE;\n\n// private\ntypedef struct _SOCK_SHARED_INFO\n{\n    SOCKET_STATE State;\n    LONG AddressFamily; // AF_*\n    LONG SocketType; // SOCK_*\n    LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.\n    LONG LocalAddressLength;\n    LONG RemoteAddressLength;\n    LINGER LingerInfo;\n    ULONG SendTimeout; // in milliseconds\n    ULONG ReceiveTimeout; // in milliseconds\n    ULONG ReceiveBufferSize;\n    ULONG SendBufferSize;\n    union\n    {\n        struct\n        {\n            UCHAR Listening : 1;\n            UCHAR Broadcast : 1;\n            UCHAR Debug : 1;\n            UCHAR OobInline : 1;\n            UCHAR ReuseAddresses : 1;\n            UCHAR ExclusiveAddressUse : 1;\n            UCHAR NonBlocking : 1;\n            UCHAR DontUseWildcard : 1;\n            UCHAR ReceiveShutdown : 1;\n            UCHAR SendShutdown : 1;\n            UCHAR ConditionalAccept : 1;\n            UCHAR IsSANSocket : 1;\n            UCHAR fIsTLI : 1;\n            UCHAR Rio : 1;\n            UCHAR ReceiveBufferSizeSet : 1;\n            UCHAR SendBufferSizeSet : 1;\n        };\n        WORD Flags;\n    };\n    ULONG CreationFlags; // WSA_FLAG_*\n    ULONG CatalogEntryId;\n    ULONG ServiceFlags1; // XP1_*\n    ULONG ProviderFlags; // PFL_*\n    GROUP GroupID;\n    AFD_GROUP_TYPE GroupType;\n    LONG GroupPriority;\n    LONG LastError;\n    union\n    {\n        HWND AsyncSelecthWnd;\n        ULONGLONG AsyncSelectWnd64;\n    };\n    ULONG AsyncSelectSerialNumber;\n    ULONG AsyncSelectwMsg;\n    LONG AsyncSelectlEvent;\n    LONG DisabledAsyncSelectEvents;\n    GUID ProviderId;\n} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;\n\n// private\ntypedef struct _AFD_UNACCEPTED_CONNECT_DATA_INFO\n{\n    LONG Sequence;\n    ULONG ConnectDataLength;\n    BOOLEAN LengthOnly;\n} AFD_UNACCEPTED_CONNECT_DATA_INFO, *PAFD_UNACCEPTED_CONNECT_DATA_INFO;\n\n// private // Transmit flags\n#define AFD_TF_DISCONNECT         0x01\n#define AFD_TF_REUSE_SOCKET       0x02\n#define AFD_TF_WRITE_BEHIND       0x04\n#define AFD_TF_USE_DEFAULT_WORKER 0x00\n#define AFD_TF_USE_SYSTEM_THREAD  0x10\n#define AFD_TF_USE_KERNEL_APC     0x20\n#define AFD_TF_WORKER_KIND_MASK   0x30\n\n// private\ntypedef struct _AFD_TRANSMIT_FILE_INFO\n{\n    LARGE_INTEGER Offset;\n    LARGE_INTEGER WriteLength;\n    ULONG SendPacketLength;\n    HANDLE FileHandle;\n    PVOID Head;\n    ULONG HeadLength;\n    PVOID Tail;\n    ULONG TailLength;\n    ULONG Flags; // AFD_TF_*\n} AFD_TRANSMIT_FILE_INFO, *PAFD_TRANSMIT_FILE_INFO;\n\n// private\ntypedef struct _AFD_SUPER_ACCEPT_INFO\n{\n    BOOLEAN SanActive;\n    BOOLEAN FixAddressAlignment;\n    HANDLE AcceptHandle;\n    ULONG ReceiveDataLength;\n    ULONG LocalAddressLength;\n    ULONG RemoteAddressLength;\n} AFD_SUPER_ACCEPT_INFO, *PAFD_SUPER_ACCEPT_INFO;\n\n// private\ntypedef struct _AFD_EVENT_SELECT_INFO\n{\n    HANDLE Event;\n    ULONG PollEvents; // AFD_POLL_*\n} AFD_EVENT_SELECT_INFO, *PAFD_EVENT_SELECT_INFO;\n\n// private\ntypedef struct _AFD_ENUM_NETWORK_EVENTS_INFO\n{\n    ULONG PollEvents; // AFD_POLL_*\n    NTSTATUS EventStatus[AFD_NUM_POLL_EVENTS];\n} AFD_ENUM_NETWORK_EVENTS_INFO, *PAFD_ENUM_NETWORK_EVENTS_INFO;\n\n// private\ntypedef struct _AFD_DEFER_ACCEPT_INFO\n{\n    LONG Sequence;\n    BOOLEAN Reject;\n} AFD_DEFER_ACCEPT_INFO, *PAFD_DEFER_ACCEPT_INFO;\n\n// private\ntypedef struct _AFD_QOS_INFO\n{\n    QOS Qos;\n    BOOLEAN GroupQos;\n} AFD_QOS_INFO, *PAFD_QOS_INFO;\n\n// private\ntypedef struct _AFD_VALIDATE_GROUP_INFO\n{\n    GROUP GroupID;\n    TRANSPORT_ADDRESS RemoteAddress;\n} AFD_VALIDATE_GROUP_INFO, *PAFD_VALIDATE_GROUP_INFO;\n\n// private\ntypedef struct _AFD_TRANSPORT_IOCTL_INFO\n{\n    HANDLE Handle;\n    _Field_size_bytes_(InputBufferLength) PVOID InputBuffer;\n    ULONG InputBufferLength;\n    ULONG IoControlCode;\n    ULONG AfdFlags;\n    ULONG PollEvent;\n} AFD_TRANSPORT_IOCTL_INFO, *PAFD_TRANSPORT_IOCTL_INFO;\n\n// rev - HV_PROTOCOL_RAW-level option in addition to ones in hvsocket.h\n#define HVSOCKET_CONTAINER_PASSTHRU     0x02 // q: ULONG\n\n// private\ntypedef enum TL_IO_CONTROL_TYPE\n{\n    TlEndpointIoControlType = 0,   // not supported\n    TlSetSockOptIoControlType = 1, // setsockopt\n    TlGetSockOptIoControlType = 2, // getsockopt\n    TlSocketIoControlType = 3,     // ioctlsocket // Level must be 0\n} TL_IO_CONTROL_TYPE, *PTL_IO_CONTROL_TYPE;\n\n// private\ntypedef struct _AFD_TL_IO_CONTROL_INFO\n{\n    TL_IO_CONTROL_TYPE Type;\n    ULONG Level; // SOL_* or IPPROTO_* or HV_PROTOCOL_RAW\n    ULONG IoControlCode; // SIO_*, SO_*, IP_*, IPV6_*, TCP_*, UDP_*, HVSOCKET_*, etc. (depending on type and level)\n    BOOLEAN EndpointIoctl; // must be TRUE\n    _Field_size_bytes_(InputBufferLength) PVOID InputBuffer;\n    SIZE_T InputBufferLength;\n} AFD_TL_IO_CONTROL_INFO, *PAFD_TL_IO_CONTROL_INFO;\n\n// private\ntypedef struct _AFD_TPACKETS_INFO\n{\n    _Field_size_(ElementCount) PTRANSMIT_PACKETS_ELEMENT ElementArray;\n    ULONG ElementCount;\n    ULONG SendSize;\n    ULONG Flags;\n} AFD_TPACKETS_INFO, *PAFD_TPACKETS_INFO;\n\n// private\ntypedef struct _AFD_SUPER_CONNECT_INFO\n{\n    BOOLEAN SanActive;\n    TRANSPORT_ADDRESS RemoteAddress;\n} AFD_SUPER_CONNECT_INFO, *PAFD_SUPER_CONNECT_INFO;\n\n// rev\ntypedef struct _AFD_SUPER_CONNECT_INFO_TL\n{\n    BOOLEAN SanActive;\n    SOCKADDR RemoteAddress;\n} AFD_SUPER_CONNECT_INFO_TL, *PAFD_SUPER_CONNECT_INFO_TL;\n\n// private\ntypedef struct _AFD_SUPER_DISCONNECT_INFO\n{\n    ULONG Flags; // same as partial disconnect\n} AFD_SUPER_DISCONNECT_INFO, *PAFD_SUPER_DISCONNECT_INFO;\n\n// private\ntypedef struct _AFD_MESSAGE_INFO\n{\n    AFD_DATAGRAM_INFO dgi;\n    _Field_size_bytes_(ControlLength) PVOID ControlBuffer;\n    PULONG ControlLength;\n    PULONG MsgFlags;\n} AFD_MESSAGE_INFO, *PAFD_MESSAGE_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_CONTEXT\n{\n    LONG EventsActive;\n    LONG RcvCount;\n    LONG ExpCount;\n    LONG SndCount;\n    BOOLEAN SelectFlag;\n} AFD_SWITCH_CONTEXT, *PAFD_SWITCH_CONTEXT;\n\n// private\ntypedef struct _AFD_SWITCH_CONTEXT_INFO\n{\n    HANDLE SocketHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n} AFD_SWITCH_CONTEXT_INFO, *PAFD_SWITCH_CONTEXT_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_EVENT_INFO\n{\n    HANDLE SocketHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n    ULONG EventBit; // AFD_POLL_*_BIT\n    NTSTATUS Status;\n} AFD_SWITCH_EVENT_INFO, *PAFD_SWITCH_EVENT_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_CONNECT_INFO\n{\n    HANDLE ListenHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n    TRANSPORT_ADDRESS RemoteAddress;\n} AFD_SWITCH_CONNECT_INFO, *PAFD_SWITCH_CONNECT_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_ACCEPT_INFO\n{\n    HANDLE AcceptHandle;\n    ULONG ReceiveLength;\n} AFD_SWITCH_ACCEPT_INFO, *PAFD_SWITCH_ACCEPT_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_REQUEST_INFO\n{\n    HANDLE SocketHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n    PVOID RequestContext;\n    NTSTATUS RequestStatus;\n    ULONG DataOffset;\n} AFD_SWITCH_REQUEST_INFO, *PAFD_SWITCH_REQUEST_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_ACQUIRE_CTX_INFO\n{\n    HANDLE SocketHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n    PVOID SocketCtxBuf;\n    ULONG SocketCtxBufSize;\n} AFD_SWITCH_ACQUIRE_CTX_INFO, *PAFD_SWITCH_ACQUIRE_CTX_INFO;\n\n// private\ntypedef struct _AFD_SWITCH_TRANSFER_CTX_INFO\n{\n    HANDLE SocketHandle;\n    PAFD_SWITCH_CONTEXT SwitchContext;\n    PVOID RequestContext;\n    PVOID SocketCtxBuf;\n    ULONG SocketCtxBufSize;\n    _Field_size_(RcvBufferCount) LPWSABUF RcvBufferArray;\n    ULONG RcvBufferCount;\n    NTSTATUS Status;\n} AFD_SWITCH_TRANSFER_CTX_INFO, *PAFD_SWITCH_TRANSFER_CTX_INFO;\n\n// private\ntypedef struct _AFD_UNBIND_INFO\n{\n    LONG AddressFamily; // AF_*\n    LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.\n} AFD_UNBIND_INFO, *PAFD_UNBIND_INFO;\n\n// rev // SQM Control Codes\n#define AFD_SQM_CONTROL_CODE_STORE 1\n#define AFD_SQM_CONTROL_CODE_SWEEP -1\n\n// private\ntypedef struct _AFD_SQM_CONTROL\n{\n    ULONG Code; // AFD_SQM_CONTROL_CODE_*\n} AFD_SQM_CONTROL, *PAFD_SQM_CONTROL;\n\n// private\ntypedef struct _WINSOCK_SQM_SOCKTYPE_DESC\n{\n    ULONG StreamTCP : 1;\n    ULONG StreamOther : 1;\n    ULONG DatagramUDP : 1;\n    ULONG DatagramUDPMulticast : 1;\n    ULONG DatagramOther : 1;\n    ULONG RawTCP : 1;\n    ULONG RawUDP : 1;\n    ULONG RawOther : 1;\n    ULONG OtherSocketTypes : 1;\n    ULONG IPv6Socket : 1;\n    ULONG ProviderLoadedWSD : 1;\n    ULONG ProviderLoadedLSP : 1;\n    ULONG ProviderLoadedMultiLSP : 1;\n    ULONG NonMswsockBSP : 1;\n} WINSOCK_SQM_SOCKTYPE_DESC, *PWINSOCK_SQM_SOCKTYPE_DESC;\n\n// private\ntypedef struct _WINSOCK_SQM_SOCKTYPE_COUNTS\n{\n    ULONG MaxStreamSocketsConn;\n    ULONG MaxStreamSocketsListen;\n    ULONG MaxDatagramSockets;\n    ULONG MaxRawSockets;\n    ULONG MaxOtherSockets;\n} WINSOCK_SQM_SOCKTYPE_COUNTS, *PWINSOCK_SQM_SOCKTYPE_COUNTS;\n\n// private\ntypedef struct _WINSOCK_SQM_NONCORE_FUNC\n{\n    ULONG Select : 1;\n    ULONG WSAPoll : 1;\n    ULONG StreamWSAEventSelect : 1;\n    ULONG StreamWSAAsyncSelect : 1;\n    ULONG TransmitFile : 1;\n    ULONG StreamTransmitPackets : 1;\n    ULONG DisconnectEx : 1;\n    ULONG SocketReuse : 1;\n    ULONG StreamDuplicateSocket : 1;\n    ULONG ReadWriteFile : 1;\n    ULONG OOBSendRecv : 1;\n    ULONG StreamSoSndTimeO : 1;\n    ULONG StreamSoRcvTimeO : 1;\n    ULONG MsgWaitAll : 1;\n    ULONG StreamNonCoreSOLOptions : 1;\n    ULONG StreamNonCoreTCPOptions : 1;\n    ULONG StreamNonCoreIPOptions : 1;\n    ULONG StreamNonCoreOtherOptions : 1;\n    ULONG StreamNonCoreIOCTLs : 1;\n    ULONG StreamNonCoreWSASocket : 1;\n    ULONG NonCoreRecv : 1;\n    ULONG NonCoreSend : 1;\n    ULONG StreamNonCoreWSAIoctl : 1;\n    ULONG NonCoreWSAAccept : 1;\n    ULONG StreamNonCoreWSAConnect : 1;\n    ULONG StreamWSAJoinLeaf : 1;\n    ULONG StreamWSAGetQoSByName : 1;\n    ULONG WSASendDisconnect : 1;\n    ULONG WSARecvDisconnect : 1;\n} WINSOCK_SQM_NONCORE_FUNC, *PWINSOCK_SQM_NONCORE_FUNC;\n\n// private\ntypedef struct _WINSOCK_SQM_DEPRECATION_LIST\n{\n    ULONG bEnumProtocols : 1;\n    ULONG bGetNameByType : 1;\n    ULONG bGetService : 1;\n    ULONG bGetTypeByName : 1;\n    ULONG bSetService : 1;\n    ULONG bWSACancelBlockingCall : 1;\n    ULONG bWSAIsBlocking : 1;\n    ULONG bWSASetBlockingHook : 1;\n    ULONG bWSAUnhookBlockingHook : 1;\n    ULONG bGetAddressByName : 1;\n    ULONG bGetHostByAddr : 1;\n    ULONG bGetHostByName : 1;\n    ULONG bGetHostName : 1;\n    ULONG bGetProtoByName : 1;\n    ULONG bGetProtoByNumber : 1;\n    ULONG bGetServByName : 1;\n    ULONG bGetServByPort : 1;\n    ULONG bInetAddr : 1;\n    ULONG bInetNtoa : 1;\n    ULONG bWSAAsyncGetHostByAddr : 1;\n    ULONG bWSAAsyncGetHostByName : 1;\n    ULONG bWSAAsyncGetProtoByName : 1;\n    ULONG bWSAAsyncGetProtoByNumber : 1;\n    ULONG bWSAAsyncGetServByName : 1;\n    ULONG bWSAAsyncGetServByPort : 1;\n    ULONG bWSACancelAsyncRequest : 1;\n    ULONG bWSARecvEx : 1;\n} WINSOCK_SQM_DEPRECATION_LIST, *PWINSOCK_SQM_DEPRECATION_LIST;\n\n// private\ntypedef struct _WINSOCK_SQM_SOCK_OPTIONS\n{\n    ULONG SoSndBuf : 1;\n    ULONG SoRcvBuf : 1;\n    ULONG SoSndBuf0 : 1;\n    ULONG SoRcvBuf0 : 1;\n    ULONG SoKeepAliveOn : 1;\n    ULONG SoReuseAddrOn : 1;\n    ULONG SoExclusiveAddrUseOn : 1;\n    ULONG SoLingerOn : 1;\n    ULONG SoLingerOn0 : 1;\n    ULONG SoRandomizePortOn : 1;\n    ULONG SoPortScaleOn : 1;\n    ULONG SoCondAcceptOn : 1;\n    ULONG SoOobInlineOn : 1;\n    ULONG SoOther : 1;\n    ULONG TCPNoDelayOn : 1;\n    ULONG TCPOther : 1;\n    ULONG IPV6V6OnlyOff : 1;\n    ULONG IPV6ProtectLevel : 1;\n    ULONG IPOther : 1;\n    ULONG LevelOther : 1;\n    ULONG ISBQuery : 1;\n    ULONG ISBNotify : 1;\n    ULONG AddressQuery : 1;\n    ULONG AddressNotify : 1;\n    ULONG RouteQuery : 1;\n    ULONG RouteNotify : 1;\n    ULONG FionbioOn : 1;\n    ULONG Fionread : 1;\n    ULONG Siocatmark : 1;\n    ULONG Siokeepalivevals : 1;\n    ULONG Siosetcompatmode : 1;\n    ULONG Sioportreserve : 1;\n} WINSOCK_SQM_SOCK_OPTIONS, *PWINSOCK_SQM_SOCK_OPTIONS;\n\n// private\ntypedef struct _WINSOCK_SQM_MISC_BEHAVIOR\n{\n    ULONG SendEverPended : 1;\n    ULONG RecvEverPended : 1;\n    ULONG ShutdownSend : 1;\n    ULONG ShutdownRecv : 1;\n    ULONG WSASocketProtocol : 1;\n} WINSOCK_SQM_MISC_BEHAVIOR, *PWINSOCK_SQM_MISC_BEHAVIOR;\n\n// private\ntypedef struct _AFD_SQM_INFO\n{\n    AFD_SQM_CONTROL Control;\n    WCHAR AppName[16];\n    WCHAR LSPName[16];\n    ULONG AppVersion;\n    WINSOCK_SQM_SOCKTYPE_DESC SocketTypeDescriptor;\n    WINSOCK_SQM_SOCKTYPE_COUNTS SocketTypeCounts;\n    WINSOCK_SQM_NONCORE_FUNC NonCoreFunctions;\n    WINSOCK_SQM_DEPRECATION_LIST DeprecationList;\n    WINSOCK_SQM_SOCK_OPTIONS SocketOptions;\n    WINSOCK_SQM_MISC_BEHAVIOR MiscBehavior;\n} AFD_SQM_INFO, *PAFD_SQM_INFO;\n\n// private\ntypedef enum _AFD_RIO_COMMAND\n{\n    AfdRioCommandIdCreateCq = 0,         // in: AFD_RIO_COMMAND_CREATE_CQ; out: AFD_RIO_COMMAND_CREATE_CQ_RESULT\n    AfdRioCommandIdDestroyCq = 1,        // in: AFD_RIO_COMMAND_DESTROY_CQ\n    AfdRioCommandIdNotifyCq = 2,         // in: AFD_RIO_COMMAND_NOTIFY_CQ\n    AfdRioCommandIdCreateRqPair = 3,     // in: AFD_RIO_COMMAND_CREATE_RQ_PAIR\n    AfdRioCommandIdRegisterBuffer = 4,   // in: AFD_RIO_COMMAND_REGISTER_BUFFER; out: AFD_RIO_COMMAND_REGISTER_BUFFER_RESULT\n    AfdRioCommandIdDeregisterBuffer = 5, // in: AFD_RIO_COMMAND_DEREGISTER_BUFFER\n    AfdRioCommandIdPokeSend = 6,         // in: AFD_RIO_COMMAND_POKE_SEND\n    AfdRioCommandIdPokeReceive = 7,      // in: AFD_RIO_COMMAND_POKE_RECEIVE\n    AfdRioCommandIdResizeCq = 8,         // in: AFD_RIO_COMMAND_RESIZE_CQ\n    AfdRioCommandIdResizeRqPair = 9,     // in: AFD_RIO_COMMAND_RESIZE_RQ_PAIR\n    AfdRioCommandIdMaximum = 10,\n} AFD_RIO_COMMAND, *PAFD_RIO_COMMAND;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_HEADER\n{\n    AFD_RIO_COMMAND Command;\n} AFD_RIO_COMMAND_HEADER, *PAFD_RIO_COMMAND_HEADER;\n\n// private\ntypedef enum _AFD_RIO_NOTIFICATION_COMPLETION_TYPE\n{\n    AfdRioNoCompletion = 0,\n    AfdRioEventCompletion = 1,\n    AfdRioIocpCompletion = 2,\n} AFD_RIO_NOTIFICATION_COMPLETION_TYPE, *PAFD_RIO_NOTIFICATION_COMPLETION_TYPE;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_CREATE_CQ\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG QSize;\n    AFD_RIO_NOTIFICATION_COMPLETION_TYPE NotificationType;\n    ULONGLONG NotificationHandle;\n    ULONGLONG NotificationContext;\n    ULONGLONG NotificationContext2;\n    ULONG BufferSize;\n    ULONGLONG Buffer;\n} AFD_RIO_COMMAND_CREATE_CQ, *PAFD_RIO_COMMAND_CREATE_CQ;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_CREATE_CQ_RESULT\n{\n    ULONG CqId;\n} AFD_RIO_COMMAND_CREATE_CQ_RESULT, *PAFD_RIO_COMMAND_CREATE_CQ_RESULT;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_DESTROY_CQ\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG CqId;\n} AFD_RIO_COMMAND_DESTROY_CQ, *PAFD_RIO_COMMAND_DESTROY_CQ;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_NOTIFY_CQ\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG Index;\n} AFD_RIO_COMMAND_NOTIFY_CQ, *PAFD_RIO_COMMAND_NOTIFY_CQ;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_CREATE_RQ_PAIR\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG SendCompletionQueue;\n    ULONG ReceiveCompletionQueue;\n    ULONG SendQueueEntryCount;\n    ULONG SendQueueBufferSize;\n    ULONGLONG SendQueueBuffer;\n    ULONG ReceiveQueueEntryCount;\n    ULONG ReceiveQueueBufferSize;\n    ULONGLONG ReceiveQueueBuffer;\n    ULONGLONG EndpointHandle;\n    ULONGLONG SocketContext;\n} AFD_RIO_COMMAND_CREATE_RQ_PAIR, *PAFD_RIO_COMMAND_CREATE_RQ_PAIR;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_REGISTER_BUFFER\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONGLONG Buffer;\n    ULONG BufferLength;\n} AFD_RIO_COMMAND_REGISTER_BUFFER, *PAFD_RIO_COMMAND_REGISTER_BUFFER;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_REGISTER_BUFFER_RESULT\n{\n    ULONG BufferId;\n} AFD_RIO_COMMAND_REGISTER_BUFFER_RESULT, *PAFD_RIO_COMMAND_REGISTER_BUFFER_RESULT;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_DEREGISTER_BUFFER\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG BufferId;\n} AFD_RIO_COMMAND_DEREGISTER_BUFFER, *PAFD_RIO_COMMAND_DEREGISTER_BUFFER;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_POKE_SEND\n{\n    AFD_RIO_COMMAND_HEADER Header;\n} AFD_RIO_COMMAND_POKE_SEND, *PAFD_RIO_COMMAND_POKE_SEND;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_POKE_RECEIVE\n{\n    AFD_RIO_COMMAND_HEADER Header;\n} AFD_RIO_COMMAND_POKE_RECEIVE, *PAFD_RIO_COMMAND_POKE_RECEIVE;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_RESIZE_CQ\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG CqId;\n    ULONG QSize;\n    ULONG BufferSize;\n    ULONGLONG Buffer;\n} AFD_RIO_COMMAND_RESIZE_CQ, *PAFD_RIO_COMMAND_RESIZE_CQ;\n\n// private\ntypedef struct _AFD_RIO_COMMAND_RESIZE_RQ_PAIR\n{\n    AFD_RIO_COMMAND_HEADER Header;\n    ULONG SendQueueEntryCount;\n    ULONG SendQueueBufferSize;\n    ULONGLONG SendQueueBuffer;\n    ULONG ReceiveQueueEntryCount;\n    ULONG ReceiveQueueBufferSize;\n    ULONGLONG ReceiveQueueBuffer;\n} AFD_RIO_COMMAND_RESIZE_RQ_PAIR, *PAFD_RIO_COMMAND_RESIZE_RQ_PAIR;\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntbcd.h",
    "content": "/*\n * Boot Configuration Data (BCD) support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTBCD_H\n#define _NTBCD_H\n\n//\n// BCD.dll Exported Types\n//\n\n#ifndef PHNT_INLINE_BCD_GUIDS\n// 5189B25C-5558-4BF2-BCA4-289B11BD29E2 // {badmemory}\nDEFINE_GUID(GUID_BAD_MEMORY_GROUP, 0x5189B25C, 0x5558, 0x4BF2, 0xBC, 0xA4, 0x28, 0x9B, 0x11, 0xBD, 0x29, 0xE2);\n// 6EFB52BF-1766-41DB-A6B3-0EE5EFF72BD7 // {bootloadersettings}\nDEFINE_GUID(GUID_BOOT_LOADER_SETTINGS_GROUP, 0x6EFB52BF, 0x1766, 0x41DB, 0xA6, 0xB3, 0x0E, 0xE5, 0xEF, 0xF7, 0x2B, 0xD7);\n// FA926493-6F1C-4193-A414-58F0B2456D1E // {current}\nDEFINE_GUID(GUID_CURRENT_BOOT_ENTRY, 0xFA926493, 0x6F1C, 0x4193, 0xA4, 0x14, 0x58, 0xF0, 0xB2, 0x45, 0x6D, 0x1E);\n// 4636856E-540F-4170-A130-A84776F4C654 // {eventsettings} {dbgsettings}\nDEFINE_GUID(GUID_DEBUGGER_SETTINGS_GROUP, 0x4636856E, 0x540F, 0x4170, 0xA1, 0x30, 0xA8, 0x47, 0x76, 0xF4, 0xC6, 0x54);\n// 1CAE1EB7-A0DF-4D4D-9851-4860E34EF535 // {default}\nDEFINE_GUID(GUID_DEFAULT_BOOT_ENTRY, 0x1CAE1EB7, 0xA0DF, 0x4D4D, 0x98, 0x51, 0x48, 0x60, 0xE3, 0x4E, 0xF5, 0x35);\n// 0CE4991B-E6B3-4B16-B23C-5E0D9250E5D9 // {emssettings}\nDEFINE_GUID(GUID_EMS_SETTINGS_GROUP, 0x0CE4991B, 0xE6B3, 0x4B16, 0xB2, 0x3C, 0x5E, 0x0D, 0x92, 0x50, 0xE5, 0xD9);\n// A5A30FA2-3D06-4E9F-B5F4-A01DF9D1FCBA // {fwbootmgr}\nDEFINE_GUID(GUID_FIRMWARE_BOOTMGR, 0xA5A30FA2, 0x3D06, 0x4E9F, 0xB5, 0xF4, 0xA0, 0x1D, 0xF9, 0xD1, 0xFC, 0xBA);\n// 7EA2E1AC-2E61-4728-AAA3-896D9D0A9F0E // {globalsettings}\nDEFINE_GUID(GUID_GLOBAL_SETTINGS_GROUP, 0x7EA2E1AC, 0x2E61, 0x4728, 0xAA, 0xA3, 0x89, 0x6D, 0x9D, 0x0A, 0x9F, 0x0E);\n// 7FF607E0-4395-11DB-B0DE-0800200C9A66 // {hypervisorsettings}\nDEFINE_GUID(GUID_HYPERVISOR_SETTINGS_GROUP, 0x7FF607E0, 0x4395, 0x11DB, 0xB0, 0xDE, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66);\n// 313E8EED-7098-4586-A9BF-309C61F8D449 // {kerneldbgsettings}\nDEFINE_GUID(GUID_KERNEL_DEBUGGER_SETTINGS_GROUP, 0x313E8EED, 0x7098, 0x4586, 0xA9, 0xBF, 0x30, 0x9C, 0x61, 0xF8, 0xD4, 0x49);\n// 1AFA9C49-16AB-4A5C-4A90-212802DA9460 // {resumeloadersettings}\nDEFINE_GUID(GUID_RESUME_LOADER_SETTINGS_GROUP, 0x1AFA9C49, 0x16AB, 0x4A5C, 0x4A, 0x90, 0x21, 0x28, 0x02, 0xDA, 0x94, 0x60);\n// 9DEA862C-5CDD-4E70-ACC1-F32B344D4795 // {bootmgr}\nDEFINE_GUID(GUID_WINDOWS_BOOTMGR, 0x9DEA862C, 0x5CDD, 0x4E70, 0xAC, 0xC1, 0xF3, 0x2B, 0x34, 0x4D, 0x47, 0x95);\n// 466F5A88-0AF2-4F76-9038-095B170DC21C // {ntldr} {legacy}\nDEFINE_GUID(GUID_WINDOWS_LEGACY_NTLDR, 0x466F5A88, 0x0AF2, 0x4F76, 0x90, 0x38, 0x09, 0x5B, 0x17, 0x0D, 0xC2, 0x1C);\n// B2721D73-1DB4-4C62-BF78-C548A880142D // {memdiag}\nDEFINE_GUID(GUID_WINDOWS_MEMORY_TESTER, 0xB2721D73, 0x1DB4, 0x4C62, 0xBF, 0x78, 0xC5, 0x48, 0xA8, 0x80, 0x14, 0x2D);\n// B012B84D-C47C-4ED5-B722-C0C42163E569\nDEFINE_GUID(GUID_WINDOWS_OS_TARGET_TEMPLATE_EFI, 0xB012B84D, 0xC47C, 0x4ED5, 0xB7, 0x22, 0xC0, 0xC4, 0x21, 0x63, 0xE5, 0x69);\n// A1943BBC-EA85-487C-97C7-C9EDE908A38A\nDEFINE_GUID(GUID_WINDOWS_OS_TARGET_TEMPLATE_PCAT, 0xA1943BBC, 0xEA85, 0x487C, 0x97, 0xC7, 0xC9, 0xED, 0xE9, 0x08, 0xA3, 0x8A);\n// {0C334284-9A41-4DE1-99B3-A7E87E8FF07E}\nDEFINE_GUID(GUID_WINDOWS_RESUME_TARGET_TEMPLATE_EFI, 0x0C334284, 0x9A41, 0x4DE1, 0x99, 0xB3, 0xA7, 0xE8, 0x7E, 0x8F, 0xF0, 0x7E);\n// {98B02A23-0674-4CE7-BDAD-E0A15A8FF97B}\nDEFINE_GUID(GUID_WINDOWS_RESUME_TARGET_TEMPLATE_PCAT, 0x98B02A23, 0x0674, 0x4CE7, 0xBD, 0xAD, 0xE0, 0xA1, 0x5A, 0x8F, 0xF9, 0x7B);\n// 7254a080-1510-4e85-ac0f-e7fb3d444736\nDEFINE_GUID(GUID_WINDOWS_SETUP_EFI, 0x7254A080, 0x1510, 0x4E85, 0xAC, 0x0F, 0xE7, 0xFB, 0x3D, 0x44, 0x47, 0x36);\n// CBD971BF-B7B8-4885-951A-FA03044F5D71\nDEFINE_GUID(GUID_WINDOWS_SETUP_PCAT, 0xCBD971BF, 0xB7B8, 0x4885, 0x95, 0x1A, 0xFA, 0x03, 0x04, 0x4F, 0x5D, 0x71);\n// AE5534E0-A924-466C-B836-758539A3EE3A // {ramdiskoptions}\nDEFINE_GUID(GUID_WINDOWS_SETUP_RAMDISK_OPTIONS, 0xAE5534E0, 0xA924, 0x466C, 0xB8, 0x36, 0x75, 0x85, 0x39, 0xA3, 0xEE, 0x3A);\n// {7619dcc9-fafe-11d9-b411-000476eba25f}\nDEFINE_GUID(GUID_WINDOWS_SETUP_BOOT_ENTRY, 0x7619dcc9, 0xfafe, 0x11d9, 0xb4, 0x11, 0x00, 0x04, 0x76, 0xeb, 0xa2, 0x5f);\n// {a62c8016-ca4e-4687-8032-d666c51a280c}\nDEFINE_GUID(GUID_VHD_BOOT_OPTIONS, 0xa62c8016, 0xca4e, 0x4687, 0x80, 0x32, 0xd6, 0x66, 0xc5, 0x1a, 0x28, 0x0c);\n// c63c9bdf-5fa5-4208-b03f-6b458b365592\nDEFINE_GUID(GUID_VMBFS_BOOT_INSTANCE, 0xc63c9bdf, 0x5fa5, 0x4208, 0xb0, 0x3f, 0x6b, 0x45, 0x8b, 0x36, 0x55, 0x92);\n// ebd0a0a2-b9e5-4433-87c0-68b6b72699c7\nDEFINE_GUID(PARTITION_BASIC_DATA_GUID, 0xebd0a0a2, 0xb9e5, 0x4433, 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7);\n// db97dba9-0840-4bae-97f0-ffb9a327c7e1\nDEFINE_GUID(PARTITION_CLUSTER_GUID, 0xdb97dba9, 0x0840, 0x4bae, 0x97, 0xf0, 0xff, 0xb9, 0xa3, 0x27, 0xc7, 0xe1);\n// 00000000-0000-0000-0000-000000000000\nDEFINE_GUID(PARTITION_ENTRY_UNUSED_GUID, 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n// af9b60a0-1431-4f62-bc68-3311714a69ad\nDEFINE_GUID(PARTITION_LDM_DATA_GUID, 0xaf9b60a0, 0x1431, 0x4f62, 0xbc, 0x68, 0x33, 0x11, 0x71, 0x4a, 0x69, 0xad);\n// 5808c8aa-7e8f-42e0-85d2-e1e90434cfb3\nDEFINE_GUID(PARTITION_LDM_METADATA_GUID, 0x5808c8aa, 0x7e8f, 0x42e0, 0x85, 0xd2, 0xe1, 0xe9, 0x04, 0x34, 0xcf, 0xb3);\n// de94bba4-06d1-4d40-a16a-bfd50179d6ac\nDEFINE_GUID(PARTITION_MSFT_RECOVERY_GUID, 0xde94bba4, 0x06d1, 0x4d40, 0xa1, 0x6a, 0xbf, 0xd5, 0x01, 0x79, 0xd6, 0xac);\n// e3c9e316-0b5c-4db8-817d-f92df00215ae\nDEFINE_GUID(PARTITION_MSFT_RESERVED_GUID, 0xe3c9e316, 0x0b5c, 0x4db8, 0x81, 0x7d, 0xf9, 0x2d, 0xf0, 0x02, 0x15, 0xae);\n// caddebf1-4400-4de8-b103-12117dcf3cc\nDEFINE_GUID(PARTITION_MSFT_SNAPSHOT_GUID, 0xcaddebf1, 0x4400, 0x4de8, 0xb1, 0x03, 0x12, 0x11, 0x7d, 0xcf, 0x3c, 0xcf);\n// e75caf8f-f680-4cee-afa3-b001e56efc2d\nDEFINE_GUID(PARTITION_SPACES_GUID, 0xe75caf8f, 0xf680, 0x4cee, 0xaf, 0xa3, 0xb0, 0x01, 0xe5, 0x6e, 0xfc, 0x2d);\n// c12a7328-f81f-11d2-ba4b-00a0c93ec93b\nDEFINE_GUID(PARTITION_SYSTEM_GUID, 0xc12a7328, 0xf81f, 0x11d2, 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b);\n#else\nNTSYSAPI GUID GUID_BAD_MEMORY_GROUP; // {badmemory}\nNTSYSAPI GUID GUID_BOOT_LOADER_SETTINGS_GROUP; // {bootloadersettings}\nNTSYSAPI GUID GUID_CURRENT_BOOT_ENTRY; // {current}\nNTSYSAPI GUID GUID_DEBUGGER_SETTINGS_GROUP; // {eventsettings} {dbgsettings}\nNTSYSAPI GUID GUID_DEFAULT_BOOT_ENTRY; // {default}\nNTSYSAPI GUID GUID_EMS_SETTINGS_GROUP; // {emssettings}\nNTSYSAPI GUID GUID_FIRMWARE_BOOTMGR; // {fwbootmgr}\nNTSYSAPI GUID GUID_GLOBAL_SETTINGS_GROUP; // {globalsettings}\nNTSYSAPI GUID GUID_HYPERVISOR_SETTINGS_GROUP; // {hypervisorsettings}\nNTSYSAPI GUID GUID_KERNEL_DEBUGGER_SETTINGS_GROUP; // {kerneldbgsettings}\nNTSYSAPI GUID GUID_RESUME_LOADER_SETTINGS_GROUP; // {resumeloadersettings}\nNTSYSAPI GUID GUID_WINDOWS_BOOTMGR; // {bootmgr}\nNTSYSAPI GUID GUID_WINDOWS_LEGACY_NTLDR; // {ntldr} {legacy}\nNTSYSAPI GUID GUID_WINDOWS_MEMORY_TESTER; // {memdiag}\nNTSYSAPI GUID GUID_WINDOWS_OS_TARGET_TEMPLATE_EFI;\nNTSYSAPI GUID GUID_WINDOWS_OS_TARGET_TEMPLATE_PCAT;\nNTSYSAPI GUID GUID_WINDOWS_RESUME_TARGET_TEMPLATE_EFI;\nNTSYSAPI GUID GUID_WINDOWS_RESUME_TARGET_TEMPLATE_PCAT;\nNTSYSAPI GUID GUID_WINDOWS_SETUP_EFI;\nNTSYSAPI GUID GUID_WINDOWS_SETUP_PCAT;\nNTSYSAPI GUID GUID_WINDOWS_SETUP_RAMDISK_OPTIONS; // {ramdiskoptions}\nNTSYSAPI GUID GUID_VHD_BOOT_OPTIONS;\nNTSYSAPI GUID PARTITION_BASIC_DATA_GUID;\nNTSYSAPI GUID PARTITION_CLUSTER_GUID;\nNTSYSAPI GUID PARTITION_ENTRY_UNUSED_GUID;\nNTSYSAPI GUID PARTITION_LDM_DATA_GUID;\nNTSYSAPI GUID PARTITION_LDM_METADATA_GUID;\nNTSYSAPI GUID PARTITION_MSFT_RECOVERY_GUID;\nNTSYSAPI GUID PARTITION_MSFT_RESERVED_GUID;\nNTSYSAPI GUID PARTITION_MSFT_SNAPSHOT_GUID;\nNTSYSAPI GUID PARTITION_SPACES_GUID;\nNTSYSAPI GUID PARTITION_SYSTEM_GUID;\n#endif // PHNT_INLINE_BCD_GUIDS\n\ntypedef enum _BCD_MESSAGE_TYPE\n{\n    BCD_MESSAGE_TYPE_NONE,\n    BCD_MESSAGE_TYPE_TRACE,\n    BCD_MESSAGE_TYPE_INFORMATION,\n    BCD_MESSAGE_TYPE_WARNING,\n    BCD_MESSAGE_TYPE_ERROR,\n    BCD_MESSAGE_TYPE_MAXIMUM\n} BCD_MESSAGE_TYPE;\n\ntypedef VOID (NTAPI* BCD_MESSAGE_CALLBACK)(\n    _In_ BCD_MESSAGE_TYPE type,\n    _In_ PCWSTR Message\n    );\n\n/**\n * Sets the logging level and callback routine for BCD messages.\n *\n * @param BcdLoggingLevel The logging level to set.\n * @param BcdMessageCallbackRoutine The callback routine for BCD messages.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdSetLogging(\n    _In_ BCD_MESSAGE_TYPE BcdLoggingLevel,\n    _In_ BCD_MESSAGE_CALLBACK BcdMessageCallbackRoutine\n    );\n\n/**\n * Initializes the BCD synchronization mutant.\n */\nNTSYSAPI\nVOID\nNTAPI\nBcdInitializeBcdSyncMutant(\n    VOID\n    );\n\n/**\n * Retrieves the file name for the BCD.\n *\n * @param BcdSystemStorePath The pointer to receive the system store path.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdGetSystemStorePath(\n    _Out_ PWSTR* BcdSystemStorePath // RtlFreeHeap(RtlProcessHeap(), 0, BcdSystemStorePath);\n    );\n\n/**\n * Sets the device for the system BCD store.\n *\n * @param SystemPartition The system partition to set.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdSetSystemStoreDevice(\n    _In_ PCUNICODE_STRING SystemPartition\n    );\n\n/**\n * Opens the BCD system store.\n *\n * @param BcdStoreHandle The handle to receive the system store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdOpenSystemStore(\n    _Out_ PHANDLE BcdStoreHandle\n    );\n\n/**\n * Opens a BCD store from a file.\n *\n * @param BcdFilePath The file path of the BCD store.\n * @param BcdStoreHandle The handle to receive the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdOpenStoreFromFile(\n    _In_ PCUNICODE_STRING BcdFilePath,\n    _Out_ PHANDLE BcdStoreHandle\n    );\n\n/**\n * Creates a BCD store.\n *\n * @param BcdFilePath The file path to create the BCD store.\n * @param BcdStoreHandle The handle to receive the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCreateStore(\n    _In_ PCUNICODE_STRING BcdFilePath,\n    _Out_ PHANDLE BcdStoreHandle\n    );\n\n/**\n * Exports the BCD store to a file.\n *\n * @param BcdFilePath The file path to export the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdExportStore(\n    _In_ PCUNICODE_STRING BcdFilePath\n    );\n\n#if (PHNT_VERSION > PHNT_WINDOWS_11)\n/**\n * Exports the BCD store to a file with additional flags.\n *\n * @param BcdStoreHandle The handle to the BCD store.\n * @param Flags The flags for exporting the store.\n * @param BcdFilePath The file path to export the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdExportStoreEx(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ ULONG Flags,\n    _In_ PCUNICODE_STRING BcdFilePath\n    );\n#endif // PHNT_VERSION > PHNT_WINDOWS_11\n\n/**\n * Imports a BCD store from a file.\n *\n * @param BcdFilePath The file path to import the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdImportStore(\n    _In_ PCUNICODE_STRING BcdFilePath\n    );\n\ntypedef enum _BCD_IMPORT_FLAGS\n{\n    BCD_IMPORT_NONE,\n    BCD_IMPORT_DELETE_FIRMWARE_OBJECTS\n} BCD_IMPORT_FLAGS;\n\n/**\n * Imports a BCD store from a file with additional flags.\n *\n * @param BcdFilePath The file path to import the BCD store.\n * @param BcdImportFlags The flags for importing the store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdImportStoreWithFlags(\n    _In_ PCUNICODE_STRING BcdFilePath,\n    _In_ BCD_IMPORT_FLAGS BcdImportFlags\n    );\n\n/**\n * Deletes object references in the BCD store.\n *\n * @param BcdStoreHandle The handle to the BCD store.\n * @param Identifier The identifier of the object to delete references for.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdDeleteObjectReferences(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ PGUID Identifier\n    );\n\n/**\n * Deletes the system store for BCD.\n *\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdDeleteSystemStore(\n    VOID\n    );\n\ntypedef enum _BCD_OPEN_FLAGS\n{\n    BCD_OPEN_NONE,\n    BCD_OPEN_OPEN_STORE_OFFLINE,\n    BCD_OPEN_SYNC_FIRMWARE_ENTRIES\n} BCD_OPEN_FLAGS;\n\n/**\n * Opens a BCD store with additional flags.\n *\n * @param BcdFilePath The file path of the BCD store.\n * @param BcdOpenFlags The flags for opening the store.\n * @param BcdStoreHandle The handle to receive the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdOpenStore(\n    _In_ PCUNICODE_STRING BcdFilePath,\n    _In_ BCD_OPEN_FLAGS BcdOpenFlags,\n    _Out_ PHANDLE BcdStoreHandle\n    );\n\n/**\n * Closes a BCD store.\n *\n * @param BcdStoreHandle The handle to the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCloseStore(\n    _In_ HANDLE BcdStoreHandle\n    );\n\n/**\n * Flushes a BCD store.\n *\n * @param BcdStoreHandle The handle to the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdFlushStore(\n    _In_ HANDLE BcdStoreHandle\n    );\n\n/**\n * Forcibly unloads a BCD store.\n *\n * @param BcdStoreHandle The handle to the BCD store.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdForciblyUnloadStore(\n    _In_ HANDLE BcdStoreHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdMarkAsSystemStore(\n    _In_ HANDLE BcdStoreHandle\n    );\n\ntypedef enum _BCD_OBJECT_TYPE\n{\n    BCD_OBJECT_TYPE_NONE,\n    BCD_OBJECT_TYPE_APPLICATION, // 0x10000000\n    BCD_OBJECT_TYPE_INHERITED, // 0x20000000\n    BCD_OBJECT_TYPE_DEVICE, // 0x30000000\n} BCD_OBJECT_TYPE;\n\ntypedef enum _BCD_APPLICATION_OBJECT_TYPE\n{\n    BCD_APPLICATION_OBJECT_NONE = 0,\n    BCD_APPLICATION_OBJECT_FIRMWARE_BOOT_MANAGER = 1, // 0x00000001\n    BCD_APPLICATION_OBJECT_WINDOWS_BOOT_MANAGER = 2, // 0x00000002\n    BCD_APPLICATION_OBJECT_WINDOWS_BOOT_LOADER = 3, // 0x00000003\n    BCD_APPLICATION_OBJECT_WINDOWS_RESUME_APPLICATION = 4, // 0x00000004\n    BCD_APPLICATION_OBJECT_MEMORY_TESTER = 5, // 0x00000005\n    BCD_APPLICATION_OBJECT_LEGACY_NTLDR = 6, // 0x00000006\n    BCD_APPLICATION_OBJECT_LEGACY_SETUPLDR = 7, // 0x00000007\n    BCD_APPLICATION_OBJECT_BOOT_SECTOR = 8, // 0x00000008\n    BCD_APPLICATION_OBJECT_STARTUP_MODULE = 9, // 0x00000009\n    BCD_APPLICATION_OBJECT_GENERIC_APPLICATION = 10, // 0x0000000a\n    BCD_APPLICATION_OBJECT_RESERVED = 0xFFFFF // 0x000fffff\n} BCD_APPLICATION_OBJECT_TYPE;\n\ntypedef enum _BCD_APPLICATION_IMAGE_TYPE\n{\n    BCD_APPLICATION_IMAGE_NONE,\n    BCD_APPLICATION_IMAGE_FIRMWARE_APPLICATION, // 0x00100000\n    BCD_APPLICATION_IMAGE_BOOT_APPLICATION, // 0x00200000\n    BCD_APPLICATION_IMAGE_LEGACY_LOADER, // 0x00300000\n    BCD_APPLICATION_IMAGE_REALMODE_CODE, // 0x00400000\n} BCD_APPLICATION_IMAGE_TYPE;\n\ntypedef enum _BCD_INHERITED_CLASS_TYPE\n{\n    BCD_INHERITED_CLASS_NONE,\n    BCD_INHERITED_CLASS_LIBRARY,\n    BCD_INHERITED_CLASS_APPLICATION,\n    BCD_INHERITED_CLASS_DEVICE\n} BCD_INHERITED_CLASS_TYPE;\n\n#define MAKE_BCD_OBJECT(ObjectType, ImageType, ApplicationType) \\\n    (((ULONG)(ObjectType) << 28) | \\\n    (((ULONG)(ImageType) & 0xF) << 20) | \\\n    ((ULONG)(ApplicationType) & 0xFFFFF))\n\n#define MAKE_BCD_APPLICATION_OBJECT(ImageType, ApplicationType) \\\n    MAKE_BCD_OBJECT(BCD_OBJECT_TYPE_APPLICATION, (ULONG)(ImageType), (ULONG)(ApplicationType))\n\n#define GET_BCD_OBJECT_TYPE(DataType) \\\n    ((BCD_OBJECT_TYPE)(((((ULONG)DataType)) >> 28) & 0xF))\n#define GET_BCD_APPLICATION_IMAGE(DataType) \\\n    ((BCD_APPLICATION_IMAGE_TYPE)(((((ULONG)DataType)) >> 20) & 0xF))\n#define GET_BCD_APPLICATION_OBJECT(DataType) \\\n    ((BCD_APPLICATION_OBJECT_TYPE)((((ULONG)DataType)) & 0xFFFFF))\n\n#define BCD_OBJECT_OSLOADER_TYPE \\\n    MAKE_BCD_APPLICATION_OBJECT(BCD_APPLICATION_IMAGE_BOOT_APPLICATION, BCD_APPLICATION_OBJECT_WINDOWS_BOOT_LOADER)\n\ntypedef union _BCD_OBJECT_DATATYPE\n{\n    ULONG PackedValue;\n    union\n    {\n        struct\n        {\n            ULONG Reserved : 28;\n            BCD_OBJECT_TYPE ObjectType : 4;\n        };\n        struct\n        {\n            BCD_APPLICATION_OBJECT_TYPE ApplicationType : 20;\n            BCD_APPLICATION_IMAGE_TYPE ImageType : 4;\n            ULONG Reserved : 4;\n            BCD_OBJECT_TYPE ObjectType : 4;\n        } Application;\n        struct\n        {\n            ULONG Value : 20;\n            BCD_INHERITED_CLASS_TYPE Class : 4;\n            ULONG Reserved : 4;\n            BCD_OBJECT_TYPE ObjectType : 4;\n        } Inherit;\n        struct\n        {\n            ULONG Reserved : 28;\n            BCD_OBJECT_TYPE ObjectType : 4;\n        } Device;\n    };\n} BCD_OBJECT_DATATYPE, *PBCD_OBJECT_DATATYPE;\n\nstatic_assert(sizeof(BCD_OBJECT_DATATYPE) == sizeof(ULONG), \"sizeof(BCD_OBJECT_DATATYPE) is invalid.\");\n\n#define BCD_OBJECT_DESCRIPTION_VERSION 0x1\n\ntypedef struct _BCD_OBJECT_DESCRIPTION\n{\n    ULONG Version; // BCD_OBJECT_DESCRIPTION_VERSION\n    ULONG Type; // BCD_OBJECT_DATATYPE\n} BCD_OBJECT_DESCRIPTION, *PBCD_OBJECT_DESCRIPTION;\n\ntypedef struct _BCD_OBJECT\n{\n    GUID Identifer;\n    PBCD_OBJECT_DESCRIPTION Description;\n} BCD_OBJECT, *PBCD_OBJECT;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdEnumerateObjects(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ PBCD_OBJECT_DESCRIPTION BcdEnumDescriptor,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer, // BCD_OBJECT[]\n    _Inout_ PULONG BufferSize,\n    _Out_ PULONG ObjectCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdOpenObject(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ const GUID* Identifier,\n    _Out_ PHANDLE BcdObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCreateObject(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ PGUID Identifier,\n    _In_ PBCD_OBJECT_DESCRIPTION Description,\n    _Out_ PHANDLE BcdObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdDeleteObject(\n    _In_ HANDLE BcdObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCloseObject(\n    _In_ HANDLE BcdObjectHandle\n    );\n\ntypedef enum _BCD_COPY_FLAGS\n{\n    BCD_COPY_NONE = 0x0,\n    BCD_COPY_COPY_CREATE_NEW_OBJECT_IDENTIFIER = 0x1,\n    BCD_COPY_COPY_DELETE_EXISTING_OBJECT = 0x2,\n    BCD_COPY_COPY_UNKNOWN_FIRMWARE_APPLICATION = 0x4,\n    BCD_COPY_IGNORE_SETUP_TEMPLATE_ELEMENTS = 0x8,\n    BCD_COPY_RETAIN_ELEMENT_DATA = 0x10,\n    BCD_COPY_MIGRATE_ELEMENT_DATA = 0x20\n} BCD_COPY_FLAGS;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCopyObject(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ HANDLE BcdObjectHandle,\n    _In_ BCD_COPY_FLAGS BcdCopyFlags,\n    _In_ HANDLE TargetStoreHandle,\n    _Out_ PHANDLE TargetObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCopyObjectEx(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ HANDLE BcdObjectHandle,\n    _In_ BCD_COPY_FLAGS BcdCopyFlags,\n    _In_ HANDLE TargetStoreHandle,\n    _In_ PGUID TargetObjectId,\n    _Out_ PHANDLE TargetObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdCopyObjects(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ PBCD_OBJECT_DESCRIPTION Characteristics,\n    _In_ BCD_COPY_FLAGS BcdCopyFlags,\n    _In_ HANDLE TargetStoreHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdMigrateObjectElementValues(\n    _In_ HANDLE TemplateObjectHandle,\n    _In_ HANDLE SourceObjectHandle,\n    _In_ HANDLE TargetObjectHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdQueryObject(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdVersion, // BCD_OBJECT_DESCRIPTION_VERSION\n    _Out_ BCD_OBJECT_DESCRIPTION Description,\n    _Out_ PGUID Identifier\n    );\n\ntypedef enum _BCD_ELEMENT_DATATYPE_FORMAT\n{\n    BCD_ELEMENT_DATATYPE_FORMAT_UNKNOWN,\n    BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, // 0x01000000\n    BCD_ELEMENT_DATATYPE_FORMAT_STRING, // 0x02000000\n    BCD_ELEMENT_DATATYPE_FORMAT_OBJECT, // 0x03000000\n    BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, // 0x04000000\n    BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, // 0x05000000\n    BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, // 0x06000000\n    BCD_ELEMENT_DATATYPE_FORMAT_INTEGERLIST, // 0x07000000\n    BCD_ELEMENT_DATATYPE_FORMAT_BINARY // 0x08000000\n} BCD_ELEMENT_DATATYPE_FORMAT;\n\ntypedef enum _BCD_ELEMENT_DATATYPE_CLASS\n{\n    BCD_ELEMENT_DATATYPE_CLASS_NONE,\n    BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, // 0x10000000\n    BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, // 0x20000000\n    BCD_ELEMENT_DATATYPE_CLASS_DEVICE, // 0x30000000\n    BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, // 0x40000000\n    BCD_ELEMENT_DATATYPE_CLASS_OEM // 0x50000000\n} BCD_ELEMENT_DATATYPE_CLASS;\n\ntypedef enum _BCD_ELEMENT_DEVICE_TYPE\n{\n    BCD_ELEMENT_DEVICE_TYPE_NONE,\n    BCD_ELEMENT_DEVICE_TYPE_BOOT_DEVICE,\n    BCD_ELEMENT_DEVICE_TYPE_PARTITION,\n    BCD_ELEMENT_DEVICE_TYPE_FILE,\n    BCD_ELEMENT_DEVICE_TYPE_RAMDISK,\n    BCD_ELEMENT_DEVICE_TYPE_UNKNOWN,\n    BCD_ELEMENT_DEVICE_TYPE_QUALIFIED_PARTITION,\n    BCD_ELEMENT_DEVICE_TYPE_VMBUS,\n    BCD_ELEMENT_DEVICE_TYPE_LOCATE_DEVICE,\n    BCD_ELEMENT_DEVICE_TYPE_URI,\n    BCD_ELEMENT_DEVICE_TYPE_COMPOSITE\n} BCD_ELEMENT_DEVICE_TYPE;\n\n#define MAKE_BCDE_DATA_TYPE(Class, Format, Subtype) \\\n    (((((ULONG)Class) & 0xF) << 28) | ((((ULONG)Format) & 0xF) << 24) | (((ULONG)Subtype) & 0x00FFFFFF))\n\n#define GET_BCDE_DATA_CLASS(DataType) \\\n    ((BCD_ELEMENT_DATATYPE_CLASS)(((((ULONG)DataType)) >> 28) & 0xF))\n#define GET_BCDE_DATA_FORMAT(DataType) \\\n    ((BCD_ELEMENT_DATATYPE_FORMAT)(((((ULONG)DataType)) >> 24) & 0xF))\n#define GET_BCDE_DATA_SUBTYPE(DataType) \\\n    ((ULONG)((((ULONG)DataType)) & 0x00FFFFFF))\n\ntypedef union _BCD_ELEMENT_DATATYPE\n{\n    ULONG PackedValue;\n    struct\n    {\n        ULONG SubType : 24;\n        BCD_ELEMENT_DATATYPE_FORMAT Format : 4;\n        BCD_ELEMENT_DATATYPE_CLASS Class : 4;\n    };\n} BCD_ELEMENT_DATATYPE, *PBCD_ELEMENT_DATATYPE;\n\nstatic_assert(sizeof(BCD_ELEMENT_DATATYPE) == sizeof(ULONG), \"sizeof(BCD_ELEMENT_DATATYPE) is invalid.\");\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdEnumerateElementTypes(\n    _In_ HANDLE BcdObjectHandle,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer, // BCD_ELEMENT_DATATYPE[]\n    _Inout_ PULONG BufferSize,\n    _Out_ PULONG ElementCount\n    );\n\ntypedef struct _BCD_ELEMENT_DEVICE_QUALIFIED_PARTITION\n{\n    ULONG PartitionStyle;\n    ULONG Reserved;\n    struct\n    {\n        union\n        {\n            ULONG DiskSignature;\n            ULONG64 PartitionOffset;\n        } Mbr;\n        union\n        {\n            GUID DiskSignature;\n            GUID PartitionSignature;\n        } Gpt;\n    };\n} BCD_ELEMENT_DEVICE_QUALIFIED_PARTITION, *PBCD_ELEMENT_DEVICE_QUALIFIED_PARTITION;\n\ntypedef struct _BCD_ELEMENT_DEVICE\n{\n    ULONG DeviceType;\n    GUID AdditionalOptions;\n    struct\n    {\n        union\n        {\n            ULONG ParentOffset;\n            WCHAR Path[ANYSIZE_ARRAY];\n        } File;\n        union\n        {\n            WCHAR Path[ANYSIZE_ARRAY];\n        } Partition;\n        union\n        {\n            ULONG Type;\n            ULONG ParentOffset;\n            ULONG ElementType;\n            WCHAR Path[ANYSIZE_ARRAY];\n        } Locate;\n        union\n        {\n            GUID InterfaceInstance;\n        } Vmbus;\n        union\n        {\n            ULONG Data[ANYSIZE_ARRAY];\n        } Unknown;\n        BCD_ELEMENT_DEVICE_QUALIFIED_PARTITION QualifiedPartition;\n    };\n} BCD_ELEMENT_DEVICE, *PBCD_ELEMENT_DEVICE;\n\ntypedef struct _BCD_ELEMENT_STRING\n{\n    WCHAR Value[ANYSIZE_ARRAY];\n} BCD_ELEMENT_STRING, *PBCD_ELEMENT_STRING;\n\ntypedef struct _BCD_ELEMENT_OBJECT\n{\n    GUID Object;\n} BCD_ELEMENT_OBJECT, *PBCD_ELEMENT_OBJECT;\n\ntypedef struct _BCD_ELEMENT_OBJECT_LIST\n{\n    GUID ObjectList[ANYSIZE_ARRAY];\n} BCD_ELEMENT_OBJECT_LIST, *PBCD_ELEMENT_OBJECT_LIST;\n\ntypedef struct _BCD_ELEMENT_INTEGER\n{\n    ULONG64 Value;\n} BCD_ELEMENT_INTEGER, *PBCD_ELEMENT_INTEGER;\n\ntypedef struct _BCD_ELEMENT_INTEGER_LIST\n{\n    ULONG64 Value[ANYSIZE_ARRAY];\n} BCD_ELEMENT_INTEGER_LIST, *PBCD_ELEMENT_INTEGER_LIST;\n\ntypedef struct _BCD_ELEMENT_BOOLEAN\n{\n    BOOLEAN Value;\n    //BOOLEAN Pad; // sym\n} BCD_ELEMENT_BOOLEAN, *PBCD_ELEMENT_BOOLEAN;\n\n#define BCD_ELEMENT_DESCRIPTION_VERSION 0x1\n\ntypedef struct BCD_ELEMENT_DESCRIPTION\n{\n    ULONG Version; // BCD_ELEMENT_DESCRIPTION_VERSION\n    ULONG Type;\n    ULONG DataSize;\n} BCD_ELEMENT_DESCRIPTION, *PBCD_ELEMENT_DESCRIPTION;\n\ntypedef struct _BCD_ELEMENT\n{\n    PBCD_ELEMENT_DESCRIPTION Description;\n    PVOID Data;\n} BCD_ELEMENT, *PBCD_ELEMENT;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdEnumerateElements(\n    _In_ HANDLE BcdObjectHandle,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer, // BCD_ELEMENT[]\n    _Inout_ PULONG BufferSize,\n    _Out_ PULONG ElementCount\n    );\n\ntypedef enum _BCD_FLAGS\n{\n    BCD_FLAG_NONE = 0x0,\n    BCD_FLAG_QUALIFIED_PARTITION = 0x1,\n    BCD_FLAG_NO_DEVICE_TRANSLATION = 0x2,\n    BCD_FLAG_ENUMERATE_INHERITED_OBJECTS = 0x4,\n    BCD_FLAG_ENUMERATE_DEVICE_OPTIONS = 0x8,\n    BCD_FLAG_OBSERVE_PRECEDENCE = 0x10,\n    BCD_FLAG_DISABLE_VHD_NT_TRANSLATION = 0x20,\n    BCD_FLAG_DISABLE_VHD_DEVICE_DETECTION = 0x40,\n    BCD_FLAG_DISABLE_POLICY_CHECKS = 0x80\n} BCD_FLAGS;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdEnumerateElementsWithFlags(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ BCD_FLAGS BcdFlags,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer, // BCD_ELEMENT[]\n    _Inout_ PULONG BufferSize,\n    _Out_ PULONG ElementCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdEnumerateAndUnpackElements(\n    _In_ HANDLE BcdStoreHandle,\n    _In_ HANDLE BcdObjectHandle,\n    _In_ BCD_FLAGS BcdFlags,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer, // BCD_ELEMENT[]\n    _Inout_ PULONG BufferSize,\n    _Out_ PULONG ElementCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdGetElementData(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdElement, // BCD_ELEMENT_DATATYPE\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer,\n    _Inout_ PULONG BufferSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdGetElementDataWithFlags(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdElement, // BCD_ELEMENT_DATATYPE\n    _In_ BCD_FLAGS BcdFlags,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer,\n    _Inout_ PULONG BufferSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdSetElementData(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdElement, // BCD_ELEMENT_DATATYPE\n    _In_reads_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdSetElementDataWithFlags(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdElement, // BCD_ELEMENT_DATATYPE\n    _In_ BCD_FLAGS BcdFlags,\n    _In_reads_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nBcdDeleteElement(\n    _In_ HANDLE BcdObjectHandle,\n    _In_ ULONG BcdElement // BCD_ELEMENT_DATATYPE\n    );\n\n//\n// Element types\n//\n\n/**\n * BCD configuration elements for the Boot Manager types.\n */\ntypedef enum _BcdBootMgrElementTypes\n{\n    /**\n     * The order in which BCD objects should be displayed. [0x24000001]\n     * Objects are displayed using the string specified by the BcdLibraryString_Description element.\n     */\n    BcdBootMgrObjectList_DisplayOrder = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 1),\n    /**\n     * List of boot environment applications the boot manager should execute. [0x24000002]\n     * The applications are executed in the order they appear in this list.\n     * If the firmware boot manager does not support loading multiple applications, this list cannot contain more than one entry.\n     */\n    BcdBootMgrObjectList_BootSequence = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 2),\n    /**\n     * The default boot environment application to load if the user does not select one. [0x23000003]\n     */\n    BcdBootMgrObject_DefaultObject = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECT, 3),\n    /**\n     * The maximum number of seconds a boot selection menu is to be displayed to the user. [0x25000004]\n     * The menu is displayed until the user selects an option or the time-out expires.\n     * If this value is not specified, the boot manager waits for the user to make a selection.\n     */\n    BcdBootMgrInteger_Timeout = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 4),\n    /**\n     * Indicates that a resume operation should be attempted during a system restart. [0x26000005]\n     */\n    BcdBootMgrBoolean_AttemptResume = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 5),\n    /**\n     * The resume application object. [0x23000006]\n     */\n    BcdBootMgrObject_ResumeObject = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECT, 6),\n    /**\n     * The startup sequence. [0x24000007]\n     */\n    BcdBootMgrObjectList_StartupSequence = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 7),\n    /**\n     * The boot manager tools display order list. [0x24000010]\n     */\n    BcdBootMgrObjectList_ToolsDisplayOrder = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 16),\n    /**\n     * Forces the display of the legacy boot menu, regardless of the number of OS entries in the BCD store and their BcdOSLoaderInteger_BootMenuPolicy. [0x26000020]\n     */\n    BcdBootMgrBoolean_DisplayBootMenu = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 32),\n    /**\n     * Indicates whether the display of errors should be suppressed. If this setting is enabled, the boot manager exits to the multi-OS menu on OS launch error. [0x26000021]\n     */\n    BcdBootMgrBoolean_NoErrorDisplay = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 33),\n    /**\n     * The device on which the boot application resides. [0x21000022]\n     */\n    BcdBootMgrDevice_BcdDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 34),\n    /**\n     * The boot application. [0x22000023] (BCDE_BOOTMGR_TYPE_BCD_FILEPATH)\n     */\n    BcdBootMgrString_BcdFilePath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 35),\n    /**\n     * Indicates whether HORM (Hibernate Once/Resume Many) is enabled. [0x26000024]\n     */\n    BcdBootMgrBoolean_HormEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 36),\n    /**\n     * Indicates whether the system is in hibernation root mode. [0x26000025]\n     */\n    BcdBootMgrBoolean_HiberRoot = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 37),\n    /**\n     * The password override string. [0x22000026]\n     */\n    BcdBootMgrString_PasswordOverride = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 38),\n    /**\n     * The PIN/passphrase override string. [0x22000027]\n     */\n    BcdBootMgrString_PinpassPhraseOverride = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 39),\n    /**\n     * Controls whether custom actions are processed before a boot sequence. Note This value is supported starting in Windows 8 and Windows Server 2012. [0x26000028]\n     */\n    BcdBootMgrBoolean_ProcessCustomActionsFirst = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 40),\n    /**\n     * Custom Bootstrap Actions. [0x27000030] (BCDE_BOOTMGR_TYPE_CUSTOM_ACTIONS_LIST)\n     */\n    BcdBootMgrIntegerList_CustomActionsList = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGERLIST, 48),\n    /**\n     * Controls whether a boot sequence persists across multiple boots. Note This value is supported starting in Windows 8 and Windows Server 2012. [0x26000031]\n     */\n    BcdBootMgrBoolean_PersistBootSequence = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 49),\n    /**\n     * Indicates whether to skip the startup sequence. [0x26000032]\n     */\n    BcdBootMgrBoolean_SkipStartupSequence = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 50),\n} BcdBootMgrElementTypes;\n\n/**\n * Specifies the policy for using the first megabyte of memory.\n */\ntypedef enum _BcdLibrary_FirstMegabytePolicy\n{\n    /* Use none of the first megabyte of memory. */\n    FirstMegabytePolicyUseNone,\n    /* Use all of the first megabyte of memory. */\n    FirstMegabytePolicyUseAll,\n    /* Reserved for future use. */\n    FirstMegabytePolicyUsePrivate\n} BcdLibrary_FirstMegabytePolicy;\n\n/**\n * Specifies the type of debugger.\n */\ntypedef enum _BcdLibrary_DebuggerType\n{\n    /* Serial debugger. */\n    DebuggerSerial = 0,\n    /* 1394 debugger. */\n    Debugger1394 = 1,\n    /* USB debugger. */\n    DebuggerUsb = 2,\n    /* Network debugger. */\n    DebuggerNet = 3,\n    /* Local debugger. */\n    DebuggerLocal = 4\n} BcdLibrary_DebuggerType;\n\n/**\n * Specifies the start policy for the debugger.\n */\ntypedef enum _BcdLibrary_DebuggerStartPolicy\n{\n    /* The debugger will start active. */\n    DebuggerStartActive,\n    /**\n     * The debugger will start in the auto-enabled state.\n     * If a debugger is attached it will be used; otherwise the debugger port will be available for other applications.\n     */\n    DebuggerStartAutoEnable,\n    /* The debugger will not start. */\n    DebuggerStartDisable\n} BcdLibrary_DebuggerStartPolicy;\n\n/**\n * Specifies the access policy for PCI configuration space.\n */\ntypedef enum _BcdLibrary_ConfigAccessPolicy\n{\n    /**\n     * Access to PCI configuration space through the memory-mapped region is allowed.\n     */\n    ConfigAccessPolicyDefault,\n    /**\n     * Access to PCI configuration space through the memory-mapped region is not allowed.\n     * This setting is used for platforms that implement memory-mapped configuration space incorrectly.\n     * The CFC/CF8 access mechanism can be used to access configuration space on these platforms.\n     */\n    ConfigAccessPolicyDisallowMmConfig\n} BcdLibrary_ConfigAccessPolicy;\n\n/**\n * Enumeration for UX Display Message Types in the Boot Configuration Data (BCD) library.\n * This enumeration defines the different UX display message types that can be specified in the BCD library.\n */\ntypedef enum _BcdLibrary_UxDisplayMessageType\n{\n    DisplayMessageTypeDefault = 0, /**< Default display message type. */\n    DisplayMessageTypeResume = 1, /**< Display message type for resume. */\n    DisplayMessageTypeHyperV = 2, /**< Display message type for Hyper-V. */\n    DisplayMessageTypeRecovery = 3, /**< Display message type for recovery. */\n    DisplayMessageTypeStartupRepair = 4, /**< Display message type for startup repair. */\n    DisplayMessageTypeSystemImageRecovery = 5, /**< Display message type for system image recovery. */\n    DisplayMessageTypeCommandPrompt = 6, /**< Display message type for command prompt. */\n    DisplayMessageTypeSystemRestore = 7, /**< Display message type for system restore. */\n    DisplayMessageTypePushButtonReset = 8 /**< Display message type for push button reset. */\n} BcdLibrary_UxDisplayMessageType;\n\n/**\n * Enumeration for Safe Boot options in the Boot Configuration Data (BCD) library.\n * This enumeration defines the different safe boot modes that can be specified in the BCD library.\n */\ntypedef enum BcdLibrary_SafeBoot\n{\n    /**\n     * Load the drivers and services specified by name or group under the following registry key:\n     * HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Minimal.\n     */\n    SafemodeMinimal = 0,\n    /**\n     * Load the drivers and services specified by name or group under the following registry key:\n     * HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Network.\n     */\n    SafemodeNetwork = 1,\n    /**\n     * Boot the system into a repair mode that restores the Active Directory service from backup medium.\n     */\n    SafemodeDsRepair = 2\n} BcdLibrary_SafeBoot;\n\ntypedef enum _BcdLibrary_BootUxPolicy\n{\n    BootUxPolicyDisabled = 0,\n    BootUxPolicyBasic = 1,\n    BootUxPolicyStandard = 2,\n} BcdLibrary_BootUxPolicy;\n\n// BcdLibraryElementTypes based on geoffchappell: https://www.geoffchappell.com/notes/windows/boot/bcd/elements.htm (dmex)\ntypedef enum _BcdLibraryElementTypes\n{\n    /// <summary>\n    /// Device on which a boot environment application resides.\n    /// </summary>\n    /// <remarks>0x11000001</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_APPLICATION_DEVICE\n    BcdLibraryDevice_ApplicationDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 1),\n    /// <summary>\n    /// Path to a boot environment application.\n    /// </summary>\n    /// <remarks>0x12000002</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_APPLICATION_PATH\n    BcdLibraryString_ApplicationPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 2),\n    /// <summary>\n    /// Display name of the boot environment application.\n    /// </summary>\n    /// <remarks>0x12000004</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_APPLICATION_DESCRIPTION\n    BcdLibraryString_Description = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 4),\n    /// <summary>\n    /// Preferred locale, in RFC 3066 format.\n    /// </summary>\n    /// <remarks>0x12000005</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_APPLICATION_PREFERRED_LOCALE\n    BcdLibraryString_PreferredLocale = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 5),\n    /// <summary>\n    /// List of BCD objects from which the current object should inherit elements.\n    /// </summary>\n    /// <remarks>0x14000006</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_APPLICATION_INHERITED_OBJECTS\n    BcdLibraryObjectList_InheritedObjects = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 6),\n    /// <summary>\n    /// Maximum physical address a boot environment application should recognize. All memory above this address is ignored.\n    /// </summary>\n    /// <remarks>0x15000007</remarks>\n    BcdLibraryInteger_TruncatePhysicalMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 7),\n    /// <summary>\n    /// List of boot environment applications to be executed if the associated application fails. The applications are executed in the order they appear in this list.\n    /// </summary>\n    /// <remarks>0x14000008</remarks>\n    BcdLibraryObjectList_RecoverySequence = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_OBJECTLIST, 8),\n    /// <summary>\n    /// Indicates whether the recovery sequence executes automatically if the boot application fails. Otherwise, the recovery sequence only runs on demand.\n    /// </summary>\n    /// <remarks>0x16000009</remarks>\n    BcdLibraryBoolean_AutoRecoveryEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 9),\n    /// <summary>\n    /// List of page frame numbers describing faulty memory in the system.\n    /// </summary>\n    /// <remarks>0x1700000A</remarks>\n    BcdLibraryIntegerList_BadMemoryList = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGERLIST, 10),\n    /// <summary>\n    /// If TRUE, indicates that a boot application can use memory listed in the BcdLibraryIntegerList_BadMemoryList.\n    /// </summary>\n    /// <remarks>0x1600000B</remarks>\n    BcdLibraryBoolean_AllowBadMemoryAccess = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 11),\n    /// <summary>\n    /// Indicates how the first megabyte of memory is to be used. The Integer property is one of the values from the BcdLibrary_FirstMegabytePolicy enumeration. (BCDE_POLICY_LIBRARY_TYPE_FIRST_MEGABYTE_POLICY)\n    /// </summary>\n    /// <remarks>0x1500000C</remarks>\n    BcdLibraryInteger_FirstMegabytePolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 12),\n    /// <summary>\n    /// Relocates physical memory on certain AMD processors.\n    /// This value is not used in Windows 8 or Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x1500000D</remarks>\n    BcdLibraryInteger_RelocatePhysicalMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 13),\n    /// <summary>\n    /// Specifies a minimum physical address to use in the boot environment.\n    /// </summary>\n    /// <remarks>0x1500000E</remarks>\n    BcdLibraryInteger_AvoidLowPhysicalMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 14),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600000F</remarks>\n    // alternate name: BCDE_LIBRARY_TYPE_TRADITIONAL_KSEG_MAPPINGS\n    BcdLibraryBoolean_TraditionalKsegMappings = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 15),\n    /// <summary>\n    /// Indicates whether the boot debugger should be enabled.\n    /// </summary>\n    /// <remarks>0x16000010</remarks>\n    BcdLibraryBoolean_DebuggerEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 16),\n    /// <summary>\n    /// Debugger type. The Integer property is one of the values from the BcdLibrary_DebuggerType enumeration.\n    /// </summary>\n    /// <remarks>0x15000011</remarks>\n    BcdLibraryInteger_DebuggerType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 17),\n    /// <summary>\n    /// I/O port address for the serial debugger.\n    /// </summary>\n    /// <remarks>0x15000012</remarks>\n    BcdLibraryInteger_SerialDebuggerPortAddress = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 18),\n    /// <summary>\n    /// Serial port number for serial debugging.\n    /// If this value is not specified, the default is specified by the DBGP ACPI table settings.\n    /// </summary>\n    /// <remarks>0x15000013</remarks>\n    BcdLibraryInteger_SerialDebuggerPort = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 19),\n    /// <summary>\n    /// Baud rate for serial debugging.\n    /// </summary>\n    /// <remarks>0x15000014</remarks>\n    BcdLibraryInteger_SerialDebuggerBaudRate = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 20),\n    /// <summary>\n    /// Channel number for 1394 debugging.\n    /// </summary>\n    /// <remarks>0x15000015</remarks>\n    BcdLibraryInteger_1394DebuggerChannel = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 21),\n    /// <summary>\n    /// The target name for the USB debugger. The target name is arbitrary but must match between the debugger and the debug target.\n    /// </summary>\n    /// <remarks>0x12000016</remarks>\n    BcdLibraryString_UsbDebuggerTargetName = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 22),\n    /// <summary>\n    /// If TRUE, the debugger will ignore user mode exceptions and only stop for kernel mode exceptions.\n    /// </summary>\n    /// <remarks>0x16000017</remarks>\n    BcdLibraryBoolean_DebuggerIgnoreUsermodeExceptions = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 23),\n    /// <summary>\n    /// Indicates the debugger start policy. The Integer property is one of the values from the BcdLibrary_DebuggerStartPolicy enumeration.\n    /// </summary>\n    /// <remarks>0x15000018</remarks>\n    BcdLibraryInteger_DebuggerStartPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 24),\n    /// <summary>\n    /// Defines the PCI bus, device, and function numbers of the debugging device. For example, 1.5.0 describes the debugging device on bus 1, device 5, function 0.\n    /// </summary>\n    /// <remarks>0x12000019</remarks>\n    BcdLibraryString_DebuggerBusParameters = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 25),\n    /// <summary>\n    /// Defines the host IP address for the network debugger.\n    /// </summary>\n    /// <remarks>0x1500001A</remarks>\n    BcdLibraryInteger_DebuggerNetHostIP = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 26),\n    /// <summary>\n    /// Defines the network port for the network debugger.\n    /// </summary>\n    /// <remarks>0x1500001B</remarks>\n    BcdLibraryInteger_DebuggerNetPort = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 27),\n    /// <summary>\n    /// Controls the use of DHCP by the network debugger. Setting this to false causes the OS to only use link-local addresses.\n    /// This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x1600001C</remarks>\n    BcdLibraryBoolean_DebuggerNetDhcp = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 28),\n    /// <summary>\n    /// Holds the key used to encrypt the network debug connection.\n    /// This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x1200001D</remarks>\n    BcdLibraryString_DebuggerNetKey = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 29),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600001E</remarks>\n    BcdLibraryBoolean_DebuggerNetVM = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 30),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1200001F</remarks>\n    BcdLibraryString_DebuggerNetHostIpv6 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 31),\n    /// <summary>\n    /// Indicates whether EMS redirection should be enabled.\n    /// </summary>\n    /// <remarks>0x16000020</remarks>\n    BcdLibraryBoolean_EmsEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 32),\n    /// <summary>\n    /// COM port number for EMS redirection.\n    /// </summary>\n    /// <remarks>0x15000022</remarks>\n    BcdLibraryInteger_EmsPort = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 34),\n    /// <summary>\n    /// Baud rate for EMS redirection.\n    /// </summary>\n    /// <remarks>0x15000023</remarks>\n    BcdLibraryInteger_EmsBaudRate = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 35),\n    /// <summary>\n    /// String that is appended to the load options string passed to the kernel to be consumed by kernel-mode components.\n    /// This is useful for communicating with kernel-mode components that are not BCD-aware.\n    /// </summary>\n    /// <remarks>0x12000030</remarks>\n    BcdLibraryString_LoadOptionsString = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 48),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000031</remarks>\n    BcdLibraryBoolean_AttemptNonBcdStart = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 49),\n    /// <summary>\n    /// Indicates whether the advanced options boot menu (F8) is displayed.\n    /// </summary>\n    /// <remarks>0x16000040</remarks>\n    BcdLibraryBoolean_DisplayAdvancedOptions = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 64),\n    /// <summary>\n    /// Indicates whether the boot options editor is enabled.\n    /// </summary>\n    /// <remarks>0x16000041</remarks>\n    BcdLibraryBoolean_DisplayOptionsEdit = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 65),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000042</remarks>\n    // BCDE_LIBRARY_TYPE_FVE_KEYRING_ADDRESS\n    BcdLibraryInteger_FVEKeyRingAddress = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 66),\n    /// <summary>\n    /// Allows a device override for the bootstat.dat log in the boot manager and winload.exe.\n    /// </summary>\n    /// <remarks>0x11000043</remarks>\n    BcdLibraryDevice_BsdLogDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 67),\n    /// <summary>\n    /// Allows a path override for the bootstat.dat log file in the boot manager and winload.exe.\n    /// </summary>\n    /// <remarks>0x12000044</remarks>\n    BcdLibraryString_BsdLogPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 68),\n    /// <summary>\n    /// Indicates whether graphics mode is disabled and boot applications must use text mode display.\n    /// </summary>\n    /// <remarks>0x16000045</remarks>\n    BcdLibraryBoolean_BsdPreserveLog = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 69),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000046</remarks>\n    // BCDE_LIBRARY_TYPE_GRAPHICS_MODE_DISABLED\n    BcdLibraryBoolean_GraphicsModeDisabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 70),\n    /// <summary>\n    /// Indicates the access policy for PCI configuration space.\n    /// </summary>\n    /// <remarks>0x15000047</remarks>\n    BcdLibraryInteger_ConfigAccessPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 71),\n    /// <summary>\n    /// Disables integrity checks.\n    /// Cannot be set when secure boot is enabled.\n    /// This value is ignored by Windows 7 and Windows 8.\n    /// </summary>\n    /// <remarks>0x16000048</remarks>\n    BcdLibraryBoolean_DisableIntegrityChecks = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 72),\n    /// <summary>\n    /// Indicates whether the test code signing certificate is supported.\n    /// </summary>\n    /// <remarks>0x16000049</remarks>\n    BcdLibraryBoolean_AllowPrereleaseSignatures = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 73),\n    /// <summary>\n    /// Overrides the default location of the boot fonts.\n    /// </summary>\n    /// <remarks>0x1200004A</remarks>\n    // BCDE_LIBRARY_TYPE_FONT_PATH\n    BcdLibraryString_FontPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 74),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1500004B</remarks>\n    BcdLibraryInteger_SiPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 75),\n    /// <summary>\n    /// This value (if present) should not be modified.\n    /// </summary>\n    /// <remarks>0x1500004C</remarks>\n    BcdLibraryInteger_FveBandId = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 76),\n    /// <summary>\n    /// Specifies that legacy BIOS systems should use INT 16h Function 10h for console input instead of INT 16h Function 0h.\n    /// </summary>\n    /// <remarks>0x16000050</remarks>\n    BcdLibraryBoolean_ConsoleExtendedInput = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 80),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000051</remarks>\n    BcdLibraryInteger_InitialConsoleInput = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 81),\n    /// <summary>\n    /// Forces a specific graphics resolution at boot.\n    /// Possible values include GraphicsResolution1024x768 (0), GraphicsResolution800x600 (1), and GraphicsResolution1024x600 (2).\n    /// </summary>\n    /// <remarks>0x15000052</remarks>\n    BcdLibraryInteger_GraphicsResolution = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 82),\n    /// <summary>\n    /// If enabled, specifies that boot error screens are not shown when OS launch errors occur, and the system is reset rather than exiting directly back to the firmware.\n    /// </summary>\n    /// <remarks>0x16000053</remarks>\n    BcdLibraryBoolean_RestartOnFailure = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 83),\n    /// <summary>\n    /// Forces highest available graphics resolution at boot.\n    /// This value can only be used on UEFI systems.\n    /// This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x16000054</remarks>\n    BcdLibraryBoolean_GraphicsForceHighestMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 84),\n    /// <summary>\n    /// This setting is used to differentiate between the Windows 7 and Windows 8 implementations of UEFI.\n    /// Do not modify this setting.\n    /// If this setting is removed from a Windows 8 installation, it will not boot.\n    /// If this setting is added to a Windows 7 installation, it will not boot.\n    /// </summary>\n    /// <remarks>0x16000060</remarks>\n    BcdLibraryBoolean_IsolatedExecutionContext = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 96),\n    /// <summary>\n    /// This setting disables the progress bar and default Windows logo. If a custom text string has been defined, it is also disabled by this setting.\n    /// The Integer property is one of the values from the BcdLibrary_UxDisplayMessageType enumeration.\n    /// </summary>\n    /// <remarks>0x15000065</remarks>\n    BcdLibraryInteger_BootUxDisplayMessage = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 101),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000066</remarks>\n    BcdLibraryInteger_BootUxDisplayMessageOverride = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 102),\n    /// <summary>\n    /// This setting disables the boot logo.\n    /// </summary>\n    /// <remarks>0x16000067</remarks>\n    BcdLibraryBoolean_BootUxLogoDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 103),\n    /// <summary>\n    /// This setting disables the boot status text.\n    /// </summary>\n    /// <remarks>0x16000068</remarks>\n    BcdLibraryBoolean_BootUxTextDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 104),\n    /// <summary>\n    /// This setting disables the boot progress bar.\n    /// </summary>\n    /// <remarks>0x16000069</remarks>\n    BcdLibraryBoolean_BootUxProgressDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 105),\n    /// <summary>\n    /// This setting disables the boot transition fading.\n    /// </summary>\n    /// <remarks>0x1600006A</remarks>\n    BcdLibraryBoolean_BootUxFadeDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 106),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600006B</remarks>\n    BcdLibraryBoolean_BootUxReservePoolDebug = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 107),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600006C</remarks>\n    BcdLibraryBoolean_BootUxDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 108),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1500006D</remarks>\n    BcdLibraryInteger_BootUxFadeFrames = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 109),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600006E</remarks>\n    BcdLibraryBoolean_BootUxDumpStats = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 110),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600006F</remarks>\n    BcdLibraryBoolean_BootUxShowStats = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 111),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000071</remarks>\n    BcdLibraryBoolean_MultiBootSystem = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 113),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000072</remarks>\n    BcdLibraryBoolean_ForceNoKeyboard = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 114),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000073</remarks>\n    BcdLibraryInteger_AliasWindowsKey = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 115),\n    /// <summary>\n    /// Disables the 1-minute timer that triggers shutdown on boot error screens, and the F8 menu, on UEFI systems.\n    /// </summary>\n    /// <remarks>0x16000074</remarks>\n    BcdLibraryBoolean_BootShutdownDisabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 116),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000075</remarks>\n    BcdLibraryInteger_PerformanceFrequency = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 117),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000076</remarks>\n    BcdLibraryInteger_SecurebootRawPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 118),\n    /// <summary>\n    /// Indicates whether or not an in-memory BCD setting passed between boot apps will trigger BitLocker recovery.\n    /// This value should not be modified as it could trigger a BitLocker recovery action.\n    /// </summary>\n    /// <remarks>0x17000077</remarks>\n    BcdLibraryIntegerList_AllowedInMemorySettings = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 119),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000079</remarks>\n    BcdLibraryInteger_BootUxBitmapTransitionTime = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 121),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600007A</remarks>\n    BcdLibraryBoolean_TwoBootImages = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 122),\n    /// <summary>\n    /// Force the use of FIPS cryptography checks on boot applications.\n    /// BcdLibraryBoolean_ForceFipsCrypto is documented with wrong value 0x16000079\n    /// </summary>\n    /// <remarks>0x1600007B</remarks>\n    BcdLibraryBoolean_ForceFipsCrypto = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 123),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1500007D</remarks>\n    BcdLibraryInteger_BootErrorUx = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 125),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1600007E</remarks>\n    BcdLibraryBoolean_AllowFlightSignatures = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 126),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x1500007F</remarks>\n    BcdLibraryInteger_BootMeasurementLogFormat = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 127),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000080</remarks>\n    BcdLibraryInteger_DisplayRotation = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 128),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x15000081</remarks>\n    BcdLibraryInteger_LogControl = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 129),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000082</remarks>\n    BcdLibraryBoolean_NoFirmwareSync = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 130),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x11000084</remarks>\n    BcdLibraryDevice_WindowsSystemDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 132),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x16000087</remarks>\n    BcdLibraryBoolean_NumLockOn = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 135),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x12000088</remarks>\n    BcdLibraryString_AdditionalCiPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 136),\n    /// <summary>\n    /// Enabling the 5-Level Paging feature. 0 = Disabled, 1 = Optout, 2 = Optin\n    /// </summary>\n    /// <remarks>0x15000088</remarks>\n    BcdLibraryInteger_LinearAddress57 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_LIBRARY, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 136),\n} BcdLibraryElementTypes;\n\ntypedef enum _BcdTemplateElementTypes\n{\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x45000001</remarks>\n    BcdSetupInteger_DeviceType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 1),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x42000002</remarks>\n    BcdSetupString_ApplicationRelativePath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 2),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x42000003</remarks>\n    BcdSetupString_RamdiskDeviceRelativePath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 3),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x46000004</remarks>\n    BcdSetupBoolean_OmitOsLoaderElements = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 4),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x47000006</remarks>\n    BcdSetupIntegerList_ElementsToMigrateList = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_INTEGERLIST, 6),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x46000010</remarks>\n    BcdSetupBoolean_RecoveryOs = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_SETUPTEMPLATE, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 16),\n} BcdTemplateElementTypes;\n\n/**\n * @brief Specifies the no-execute page protection policies.\n */\ntypedef enum _BcdOSLoader_NxPolicy\n{\n    /**\n     * @brief The no-execute page protection is off by default.\n     */\n    NxPolicyOptIn = 0,\n    /**\n     * @brief The no-execute page protection is on by default.\n     */\n    NxPolicyOptOut = 1,\n    /**\n     * @brief The no-execute page protection is always off.\n     */\n    NxPolicyAlwaysOff = 2,\n    /**\n     * @brief The no-execute page protection is always on.\n     */\n    NxPolicyAlwaysOn = 3\n} BcdOSLoader_NxPolicy;\n\n/**\n * @brief Specifies the Physical Address Extension (PAE) policies.\n */\ntypedef enum _BcdOSLoader_PAEPolicy\n{\n    /**\n     * @brief Enable PAE if hot-pluggable memory is defined above 4GB.\n     */\n    PaePolicyDefault = 0,\n    /**\n     * @brief PAE is enabled.\n     */\n    PaePolicyForceEnable = 1,\n    /**\n     * @brief PAE is disabled.\n     */\n    PaePolicyForceDisable = 2\n} BcdOSLoader_PAEPolicy;\n\n/**\n * @brief Specifies the boot status policies.\n */\ntypedef enum _BcdOSLoader_BootStatusPolicy\n{\n    /**\n     * @brief Display all boot failures.\n     */\n    BootStatusPolicyDisplayAllFailures = 0,\n    /**\n     * @brief Ignore all boot failures.\n     */\n    BootStatusPolicyIgnoreAllFailures = 1,\n    /**\n     * @brief Ignore all shutdown failures.\n     */\n    BootStatusPolicyIgnoreShutdownFailures = 2,\n    /**\n     * @brief Ignore all boot failures.\n     */\n    BootStatusPolicyIgnoreBootFailures = 3,\n    /**\n     * @brief Ignore checkpoint failures.\n     */\n    BootStatusPolicyIgnoreCheckpointFailures = 4,\n    /**\n     * @brief Display shutdown failures.\n     */\n    BootStatusPolicyDisplayShutdownFailures = 5,\n    /**\n     * @brief Display boot failures.\n     */\n    BootStatusPolicyDisplayBootFailures = 6,\n    /**\n     * @brief Display checkpoint failures.\n     */\n    BootStatusPolicyDisplayCheckpointFailures = 7,\n    /**\n     * @brief Always display startup failures.\n     */\n    BootStatusPolicyAlwaysDisplayStartupFailures = 8\n} BcdOSLoaderBootStatusPolicy;\n\n// BcdOSLoaderElementTypes based on geoffchappell: https://www.geoffchappell.com/notes/windows/boot/bcd/elements.htm (dmex)\ntypedef enum _BcdOSLoaderElementTypes\n{\n    /// <summary>\n    /// The device on which the operating system resides.\n    /// </summary>\n    /// <remarks>0x21000001</remarks>\n    BcdOSLoaderDevice_OSDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 1),\n    /// <summary>\n    /// The file path to the operating system (%SystemRoot% minus the volume).\n    /// </summary>\n    /// <remarks>0x22000002</remarks>\n    BcdOSLoaderString_SystemRoot = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 2),\n    /// <summary>\n    /// The resume application associated with the operating system.\n    /// </summary>\n    /// <remarks>0x23000003</remarks>\n    BcdOSLoaderObject_AssociatedResumeObject = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_OBJECT, 3),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000004</remarks>\n    BcdOSLoaderBoolean_StampDisks = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 4),\n    /// <summary>\n    /// Indicates whether the operating system loader should determine the kernel and HAL to load based on the platform features.\n    /// </summary>\n    /// <remarks>0x26000010</remarks>\n    BcdOSLoaderBoolean_DetectKernelAndHal = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 16),\n    /// <summary>\n    /// The kernel to be loaded by the operating system loader. This value overrides the default kernel.\n    /// </summary>\n    /// <remarks>0x22000011</remarks>\n    BcdOSLoaderString_KernelPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 17),\n    /// <summary>\n    /// The HAL to be loaded by the operating system loader. This value overrides the default HAL.\n    /// </summary>\n    /// <remarks>0x22000012</remarks>\n    BcdOSLoaderString_HalPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 18),\n    /// <summary>\n    /// The transport DLL to be loaded by the operating system loader. This value overrides the default Kdcom.dll.\n    /// </summary>\n    /// <remarks>0x22000013</remarks>\n    BcdOSLoaderString_DbgTransportPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 19),\n    /// <summary>\n    /// The no-execute page protection policy. The Integer property is one of the values from the BcdOSLoader_NxPolicy enumeration.\n    /// </summary>\n    /// <remarks>0x25000020</remarks>\n    BcdOSLoaderInteger_NxPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 32),\n    /// <summary>\n    /// The Physical Address Extension (PAE) policy. The Integer property is one of the values from the BcdOSLoader_PAEPolicy enumeration.\n    /// </summary>\n    /// <remarks>0x25000021</remarks>\n    BcdOSLoaderInteger_PAEPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 33),\n    /// <summary>\n    /// Indicates that the system should be started in Windows Preinstallation Environment (Windows PE) mode.\n    /// </summary>\n    /// <remarks>0x26000022</remarks>\n    BcdOSLoaderBoolean_WinPEMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 34),\n    /// <summary>\n    /// Indicates that the system should not automatically reboot when it crashes.\n    /// </summary>\n    /// <remarks>0x26000024</remarks>\n    BcdOSLoaderBoolean_DisableCrashAutoReboot = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 36),\n    /// <summary>\n    /// Indicates that the system should use the last-known good settings.\n    /// </summary>\n    /// <remarks>0x26000025</remarks>\n    BcdOSLoaderBoolean_UseLastGoodSettings = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 37),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000026</remarks>\n    BcdOSLoaderBoolean_DisableCodeIntegrityChecks = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 38),\n    /// <summary>\n    /// Indicates whether the test code signing certificate is supported.\n    /// </summary>\n    /// <remarks>0x26000027</remarks>\n    BcdOSLoaderBoolean_AllowPrereleaseSignatures = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 39),\n    /// <summary>\n    /// Indicates whether the system should utilize the first 4GB of physical memory.\n    /// This option requires 5GB of physical memory, and on x86 systems it requires PAE to be enabled.\n    /// </summary>\n    /// <remarks>0x26000030</remarks>\n    BcdOSLoaderBoolean_NoLowMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 48),\n    /// <summary>\n    /// The amount of memory the system should ignore.\n    /// </summary>\n    /// <remarks>0x25000031</remarks>\n    BcdOSLoaderInteger_RemoveMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 49),\n    /// <summary>\n    /// The amount of memory that should be utilized by the process address space, in bytes.\n    /// This value should be between 2GB and 3GB.\n    /// Increasing this value from the default 2GB decreases the amount of virtual address space available to the system and device drivers.\n    /// </summary>\n    /// <remarks>0x25000032</remarks>\n    BcdOSLoaderInteger_IncreaseUserVa = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 50),\n    /// <summary>\n    /// BCDE_OSLOADER_TYPE_PERFORMANCE_DATA_MEMORY\n    /// </summary>\n    /// <remarks>0x25000033</remarks>\n    BcdOSLoaderInteger_PerformaceDataMemory = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 51),\n    /// <summary>\n    /// Indicates whether the system should use the standard VGA display driver instead of a high-performance display driver.\n    /// </summary>\n    /// <remarks>0x26000040</remarks>\n    BcdOSLoaderBoolean_UseVgaDriver = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 64),\n    /// <summary>\n    /// Indicates whether the system should initialize the VGA driver responsible for displaying simple graphics during the boot process.\n    /// If not, there is no display is presented during the boot process.\n    /// </summary>\n    /// <remarks>0x26000041</remarks>\n    BcdOSLoaderBoolean_DisableBootDisplay = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 65),\n    /// <summary>\n    /// Indicates whether the VGA driver should avoid VESA BIOS calls.\n    /// Note This value is ignored by Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x26000042</remarks>\n    BcdOSLoaderBoolean_DisableVesaBios = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 66),\n    /// <summary>\n    /// Disables the use of VGA modes in the OS.\n    /// </summary>\n    /// <remarks>0x26000043</remarks>\n    BcdOSLoaderBoolean_DisableVgaMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 67),\n    /// <summary>\n    /// Indicates that cluster-mode APIC addressing should be utilized, and the value is the maximum number of processors per cluster.\n    /// </summary>\n    /// <remarks>0x25000050</remarks>\n    BcdOSLoaderInteger_ClusterModeAddressing = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 80),\n    /// <summary>\n    /// Indicates whether to enable physical-destination mode for all APIC messages.\n    /// </summary>\n    /// <remarks>0x26000051</remarks>\n    BcdOSLoaderBoolean_UsePhysicalDestination = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 81),\n    /// <summary>\n    /// The maximum number of APIC clusters that should be used by cluster-mode addressing.\n    /// </summary>\n    /// <remarks>0x25000052</remarks>\n    BcdOSLoaderInteger_RestrictApicCluster = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 82),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000053</remarks>\n    BcdOSLoaderString_OSLoaderTypeEVStore = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 83),\n    /// <summary>\n    /// Used to force legacy APIC mode, even if the processors and chipset support extended APIC mode.\n    /// </summary>\n    /// <remarks>0x26000054</remarks>\n    BcdOSLoaderBoolean_UseLegacyApicMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 84),\n    /// <summary>\n    /// Enables the use of extended APIC mode, if supported.\n    /// Zero (0) indicates default behavior, one (1) indicates that extended APIC mode is disabled, and two (2) indicates that extended APIC mode is enabled.\n    /// The system defaults to using extended APIC mode if available.\n    /// </summary>\n    /// <remarks>0x25000055</remarks>\n    BcdOSLoaderInteger_X2ApicPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 85),\n    /// <summary>\n    /// Indicates whether the operating system should initialize or start non-boot processors.\n    /// </summary>\n    /// <remarks>0x26000060</remarks>\n    BcdOSLoaderBoolean_UseBootProcessorOnly = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 96),\n    /// <summary>\n    /// The maximum number of processors that can be utilized by the system; all other processors are ignored.\n    /// </summary>\n    /// <remarks>0x25000061</remarks>\n    BcdOSLoaderInteger_NumberOfProcessors = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 97),\n    /// <summary>\n    /// Indicates whether the system should use the maximum number of processors.\n    /// </summary>\n    /// <remarks>0x26000062</remarks>\n    BcdOSLoaderBoolean_ForceMaximumProcessors = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 98),\n    /// <summary>\n    /// Indicates whether processor specific configuration flags are to be used.\n    /// </summary>\n    /// <remarks>0x25000063</remarks>\n    BcdOSLoaderBoolean_ProcessorConfigurationFlags = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 99),\n    /// <summary>\n    /// Maximizes the number of groups created when assigning nodes to processor groups.\n    /// </summary>\n    /// <remarks>0x26000064</remarks>\n    BcdOSLoaderBoolean_MaximizeGroupsCreated = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 100),\n    /// <summary>\n    /// This setting makes drivers group aware and can be used to determine improper group usage.\n    /// </summary>\n    /// <remarks>0x26000065</remarks>\n    BcdOSLoaderBoolean_ForceGroupAwareness = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 101),\n    /// <summary>\n    /// Specifies the size of all processor groups. Must be set to a power of 2.\n    /// </summary>\n    /// <remarks>0x25000066</remarks>\n    BcdOSLoaderInteger_GroupSize = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 102),\n    /// <summary>\n    /// Indicates whether the system should use I/O and IRQ resources created by the system firmware instead of using dynamically configured resources.\n    /// </summary>\n    /// <remarks>0x26000070</remarks>\n    BcdOSLoaderInteger_UseFirmwarePciSettings = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 112),\n    /// <summary>\n    /// The PCI Message Signaled Interrupt (MSI) policy. Zero (0) indicates default, and one (1) indicates that MSI interrupts are forcefully disabled.\n    /// </summary>\n    /// <remarks>0x25000071</remarks>\n    BcdOSLoaderInteger_MsiPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 113),\n    /// <summary>\n    /// Zero (0) indicates default, and one (1) indicates that PCI Express is forcefully disabled.\n    /// </summary>\n    /// <remarks>0x25000072</remarks>\n    BcdOSLoaderInteger_PciExpressPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 114),\n    /// <summary>\n    /// The Integer property is one of the values from the BcdLibrary_SafeBoot enumeration.\n    /// </summary>\n    /// <remarks>0x25000080</remarks>\n    BcdOSLoaderInteger_SafeBoot = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 128),\n    /// <summary>\n    /// Indicates whether the system should use the shell specified under the following registry key instead of the default shell:\n    /// HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\AlternateShell.\n    /// </summary>\n    /// <remarks>0x26000081</remarks>\n    BcdOSLoaderBoolean_SafeBootAlternateShell = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 129),\n    /// <summary>\n    /// Indicates whether the system should write logging information to %SystemRoot%\\Ntbtlog.txt during initialization.\n    /// </summary>\n    /// <remarks>0x26000090</remarks>\n    BcdOSLoaderBoolean_BootLogInitialization = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 144),\n    /// <summary>\n    /// Indicates whether the system should display verbose information.\n    /// </summary>\n    /// <remarks>0x26000091</remarks>\n    BcdOSLoaderBoolean_VerboseObjectLoadMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 145),\n    /// <summary>\n    /// Indicates whether the kernel debugger should be enabled using the settings in the inherited debugger object.\n    /// </summary>\n    /// <remarks>0x260000A0</remarks>\n    BcdOSLoaderBoolean_KernelDebuggerEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 160),\n    /// <summary>\n    /// Indicates whether the HAL should call DbgBreakPoint at the start of HalInitSystem for phase 0 initialization of the kernel.\n    /// </summary>\n    /// <remarks>0x260000A1</remarks>\n    BcdOSLoaderBoolean_DebuggerHalBreakpoint = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 161),\n    /// <summary>\n    /// Forces the use of the platform clock as the system's performance counter.\n    /// </summary>\n    /// <remarks>0x260000A2</remarks>\n    BcdOSLoaderBoolean_UsePlatformClock = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 162),\n    /// <summary>\n    /// Forces the OS to assume the presence of legacy PC devices like CMOS and keyboard controllers.\n    /// This value should only be used for debugging.\n    /// </summary>\n    /// <remarks>0x260000A3</remarks>\n    BcdOSLoaderBoolean_ForceLegacyPlatform = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 163),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x260000A4</remarks>\n    BcdOSLoaderBoolean_UsePlatformTick = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 164),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x260000A5</remarks>\n    BcdOSLoaderBoolean_DisableDynamicTick = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 165),\n    /// <summary>\n    /// Controls the TSC synchronization policy. Possible values include default (0), legacy (1), or enhanced (2).\n    /// This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x250000A6</remarks>\n    BcdOSLoaderInteger_TscSyncPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 166),\n    /// <summary>\n    /// Indicates whether EMS should be enabled in the kernel.\n    /// </summary>\n    /// <remarks>0x260000B0</remarks>\n    BcdOSLoaderBoolean_EmsEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 176),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000C0</remarks>\n    BcdOSLoaderInteger_ForceFailure = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 192),\n    /// <summary>\n    /// Indicates the driver load failure policy. Zero (0) indicates that a failed driver load is fatal and the boot will not continue,\n    /// one (1) indicates that the standard error control is used.\n    /// </summary>\n    /// <remarks>0x250000C1</remarks>\n    BcdOSLoaderInteger_DriverLoadFailurePolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 193),\n    /// <summary>\n    /// Defines the type of boot menus the system will use. Possible values include menupolicylegacy (0) or menupolicystandard (1).\n    /// The default value is menupolicylegacy (0).\n    /// </summary>\n    /// <remarks>0x250000C2</remarks>\n    BcdOSLoaderInteger_BootMenuPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 194),\n    /// <summary>\n    /// Controls whether the system boots to the legacy menu (F8 menu) on the next boot.\n    /// Note This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x260000C3</remarks>\n    BcdOSLoaderBoolean_AdvancedOptionsOneTime = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 195),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x260000C4</remarks>\n    BcdOSLoaderBoolean_OptionsEditOneTime = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 196),\n    /// <summary>\n    /// The boot status policy. The Integer property is one of the values from the BcdOSLoaderBootStatusPolicy enumeration\n    /// </summary>\n    /// <remarks>0x250000E0</remarks>\n    BcdOSLoaderInteger_BootStatusPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 224),\n    /// <summary>\n    /// The OS loader removes this entry for security reasons. This option can only be triggered by using the F8 menu; a user must be physically present to trigger this option.\n    /// This value is supported starting in Windows 8 and Windows Server 2012.\n    /// </summary>\n    /// <remarks>0x260000E1</remarks>\n    BcdOSLoaderBoolean_DisableElamDrivers = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 225),\n    /// <summary>\n    /// Controls the hypervisor launch type. Options are HyperVisorLaunchOff (0) and HypervisorLaunchAuto (1).\n    /// </summary>\n    /// <remarks>0x250000F0</remarks>\n    BcdOSLoaderInteger_HypervisorLaunchType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 240),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000F1</remarks>\n    BcdOSLoaderString_HypervisorPath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 241),\n    /// <summary>\n    /// Controls whether the hypervisor debugger is enabled.\n    /// </summary>\n    /// <remarks>0x260000F2</remarks>\n    BcdOSLoaderBoolean_HypervisorDebuggerEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 242),\n    /// <summary>\n    /// Controls the hypervisor debugger type. Can be set to SERIAL (0), 1394 (1), or NET (2).\n    /// </summary>\n    /// <remarks>0x250000F3</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 243),\n    /// <summary>\n    /// Specifies the serial port number for serial debugging.\n    /// </summary>\n    /// <remarks>0x250000F4</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerPortNumber = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 244),\n    /// <summary>\n    /// Specifies the baud rate for serial debugging.\n    /// </summary>\n    /// <remarks>0x250000F5</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerBaudrate = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 245),\n    /// <summary>\n    /// Specifies the channel number for 1394 debugging.\n    /// </summary>\n    /// <remarks>0x250000F6</remarks>\n    BcdOSLoaderInteger_HypervisorDebugger1394Channel = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 246),\n    /// <summary>\n    /// Values are Disabled (0), Basic (1), and Standard (2).\n    /// </summary>\n    /// <remarks>0x250000F7</remarks>\n    BcdOSLoaderInteger_BootUxPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 247),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x220000F8</remarks>\n    BcdOSLoaderInteger_HypervisorSlatDisabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 248),\n    /// <summary>\n    /// Defines the PCI bus, device, and function numbers of the debugging device used with the hypervisor.\n    /// For example, 1.5.0 describes the debugging device on bus 1, device 5, function 0.\n    /// </summary>\n    /// <remarks>0x220000F9</remarks>\n    BcdOSLoaderString_HypervisorDebuggerBusParams = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 249),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000FA</remarks>\n    BcdOSLoaderInteger_HypervisorNumProc = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 250),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000FB</remarks>\n    BcdOSLoaderInteger_HypervisorRootProcPerNode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 251),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x260000FC</remarks>\n    BcdOSLoaderBoolean_HypervisorUseLargeVTlb = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 252),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000FD</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerNetHostIp = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 253),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000FE</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerNetHostPort = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 254),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x250000FF</remarks>\n    BcdOSLoaderInteger_HypervisorDebuggerPages = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 255),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000100</remarks>\n    BcdOSLoaderInteger_TpmBootEntropyPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 256),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000110</remarks>\n    BcdOSLoaderString_HypervisorDebuggerNetKey = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 272),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000112</remarks>\n    BcdOSLoaderString_HypervisorProductSkuType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 274),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000113</remarks>\n    BcdOSLoaderInteger_HypervisorRootProc = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 275),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000114</remarks>\n    BcdOSLoaderBoolean_HypervisorDebuggerNetDhcp = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 276),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000115</remarks>\n    BcdOSLoaderInteger_HypervisorIommuPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 277),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000116</remarks>\n    BcdOSLoaderBoolean_HypervisorUseVApic = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 278),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000117</remarks>\n    BcdOSLoaderString_HypervisorLoadOptions = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 279),\n    /// <summary>\n    /// BCDE_POLICY_OSLOADER_TYPE_HYPERVISOR_MSR_FILTER_POLICY\n    /// </summary>\n    /// <remarks>0x25000118</remarks>\n    BcdOSLoaderInteger_HypervisorMsrFilterPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 280),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000119</remarks>\n    BcdOSLoaderInteger_HypervisorMmioNxPolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 281),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500011A</remarks>\n    BcdOSLoaderInteger_HypervisorSchedulerType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 282),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2200011B</remarks>\n    BcdOSLoaderString_HypervisorRootProcNumaNodes = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 283),\n    /// <summary>\n    /// BCDE_POLICY_OSLOADER_TYPE_HYPERVISOR_PERFMON\n    /// </summary>\n    /// <remarks>0x2500011C</remarks>\n    BcdOSLoaderInteger_HypervisorPerfmon = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 284),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500011D</remarks>\n    BcdOSLoaderInteger_HypervisorRootProcPerCore = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 285),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2200011E</remarks>\n    BcdOSLoaderString_HypervisorRootProcNumaNodeLps = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 286),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000120</remarks>\n    BcdOSLoaderInteger_XSavePolicy = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 288),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000121</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature0 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 289),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000122</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature1 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 290),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000123</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature2 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 291),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000124</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature3 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 292),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000125</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature4 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 293),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000126</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature5 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 294),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000127</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature6 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 295),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000128</remarks>\n    BcdOSLoaderInteger_XSaveAddFeature7 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 296),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000129</remarks>\n    BcdOSLoaderInteger_XSaveRemoveFeature = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 297),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500012A</remarks>\n    BcdOSLoaderInteger_XSaveProcessorsMask = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 298),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500012B</remarks>\n    BcdOSLoaderInteger_XSaveDisable = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 299),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500012C</remarks>\n    BcdOSLoaderInteger_KernelDebuggerType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 300),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2200012D</remarks>\n    BcdOSLoaderString_KernelDebuggerBusParameters = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 301),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500012E</remarks>\n    BcdOSLoaderInteger_KernelDebuggerPortAddress = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 302),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x2500012F</remarks>\n    BcdOSLoaderInteger_KernelDebuggerPortNumber = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 303),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000130</remarks>\n    BcdOSLoaderInteger_ClaimedTpmCounter = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 304),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000131</remarks>\n    BcdOSLoaderInteger_KernelDebugger1394Channel = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 305),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000132</remarks>\n    BcdOSLoaderString_KernelDebuggerUsbTargetname = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 306),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000133</remarks>\n    BcdOSLoaderInteger_KernelDebuggerNetHostIp = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 307),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000134</remarks>\n    BcdOSLoaderInteger_KernelDebuggerNetHostPort = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 308),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000135</remarks>\n    BcdOSLoaderBoolean_KernelDebuggerNetDhcp = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 309),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000136</remarks>\n    BcdOSLoaderString_KernelDebuggerNetKey = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 310),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000137</remarks>\n    BcdOSLoaderString_IMCHiveName = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 311),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000138</remarks>\n    BcdOSLoaderDevice_IMCDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 312),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000139</remarks>\n    BcdOSLoaderInteger_KernelDebuggerBaudrate = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 313),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000140</remarks>\n    BcdOSLoaderString_ManufacturingMode = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 320),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000141</remarks>\n    BcdOSLoaderBoolean_EventLoggingEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 321),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x25000142</remarks>\n    BcdOSLoaderInteger_VsmLaunchType = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 322),\n    /// <summary>\n    /// Zero (0) indicates Disabled, one (1) indicates that Enabled and two (2) indicates strict mode.\n    /// </summary>\n    /// <remarks>0x25000144</remarks>\n    BcdOSLoaderInteger_HypervisorEnforcedCodeIntegrity = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_INTEGER, 324),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x26000145</remarks>\n    BcdOSLoaderBoolean_DtraceEnabled = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_BOOLEAN, 325),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000150</remarks>\n    BcdOSLoaderDevice_SystemDataDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 336),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000151</remarks>\n    BcdOSLoaderDevice_OsArcDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 337),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000153</remarks>\n    BcdOSLoaderDevice_OsDataDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 339),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000154</remarks>\n    BcdOSLoaderDevice_BspDevice = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 340),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x21000155</remarks>\n    BcdOSLoaderDevice_BspFilepath = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_DEVICE, 341),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000156</remarks>\n    BcdOSLoaderString_KernelDebuggerNetHostIpv6 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 342),\n    /// <summary>\n    ///\n    /// </summary>\n    /// <remarks>0x22000161</remarks>\n    BcdOSLoaderString_HypervisorDebuggerNetHostIpv6 = MAKE_BCDE_DATA_TYPE(BCD_ELEMENT_DATATYPE_CLASS_APPLICATION, BCD_ELEMENT_DATATYPE_FORMAT_STRING, 353),\n} BcdOSLoaderElementTypes;\n\n#endif // _NTBCD_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntdbg.h",
    "content": "/*\n * Debugger support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTDBG_H\n#define _NTDBG_H\n\n//\n// Debugging\n//\n\nNTSYSAPI\nVOID\nNTAPI\nDbgUserBreakPoint(\n    VOID\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nDbgBreakPoint(\n    VOID\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nDbgBreakPointWithStatus(\n    _In_ ULONG Status\n    );\n\n#define DBG_STATUS_CONTROL_C 1\n#define DBG_STATUS_SYSRQ 2\n#define DBG_STATUS_BUGCHECK_FIRST 3\n#define DBG_STATUS_BUGCHECK_SECOND 4\n#define DBG_STATUS_FATAL 5\n#define DBG_STATUS_DEBUG_CONTROL 6\n#define DBG_STATUS_WORKER 7\n\nNTSYSAPI\nULONG\nSTDAPIVCALLTYPE\nDbgPrint(\n    _In_z_ _Printf_format_string_ PCCH Format,\n    ...\n    );\n\nNTSYSAPI\nULONG\nSTDAPIVCALLTYPE\nDbgPrintEx(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_z_ _Printf_format_string_ PCCH Format,\n    ...\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nvDbgPrintEx(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_z_ PCCH Format,\n    _In_ va_list arglist\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nvDbgPrintExWithPrefix(\n    _In_z_ PCCH Prefix,\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_z_ PCCH Format,\n    _In_ va_list arglist\n    );\n\nNTSYSAPI\nULONG\nSTDAPIVCALLTYPE\nDbgPrintReturnControlC(\n    _In_z_ _Printf_format_string_ PCCH Format,\n    ...\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgQueryDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgSetDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_ BOOLEAN State\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nDbgPrompt(\n    _In_ PCCH Prompt,\n    _Out_writes_bytes_(Length) PCH Response,\n    _In_ ULONG Length\n    );\n\n//\n// Definitions\n//\n\ntypedef struct _DBGKM_EXCEPTION\n{\n    EXCEPTION_RECORD ExceptionRecord;\n    ULONG FirstChance;\n} DBGKM_EXCEPTION, *PDBGKM_EXCEPTION;\n\ntypedef struct _DBGKM_CREATE_THREAD\n{\n    ULONG SubSystemKey;\n    PVOID StartAddress;\n} DBGKM_CREATE_THREAD, *PDBGKM_CREATE_THREAD;\n\ntypedef struct _DBGKM_CREATE_PROCESS\n{\n    ULONG SubSystemKey;\n    HANDLE FileHandle;\n    PVOID BaseOfImage;\n    ULONG DebugInfoFileOffset;\n    ULONG DebugInfoSize;\n    DBGKM_CREATE_THREAD InitialThread;\n} DBGKM_CREATE_PROCESS, *PDBGKM_CREATE_PROCESS;\n\ntypedef struct _DBGKM_EXIT_THREAD\n{\n    NTSTATUS ExitStatus;\n} DBGKM_EXIT_THREAD, *PDBGKM_EXIT_THREAD;\n\ntypedef struct _DBGKM_EXIT_PROCESS\n{\n    NTSTATUS ExitStatus;\n} DBGKM_EXIT_PROCESS, *PDBGKM_EXIT_PROCESS;\n\ntypedef struct _DBGKM_LOAD_DLL\n{\n    HANDLE FileHandle;\n    PVOID BaseOfDll;\n    ULONG DebugInfoFileOffset;\n    ULONG DebugInfoSize;\n    PVOID NamePointer;\n} DBGKM_LOAD_DLL, *PDBGKM_LOAD_DLL;\n\ntypedef struct _DBGKM_UNLOAD_DLL\n{\n    PVOID BaseAddress;\n} DBGKM_UNLOAD_DLL, *PDBGKM_UNLOAD_DLL;\n\ntypedef enum _DBG_STATE\n{\n    DbgIdle,\n    DbgReplyPending,\n    DbgCreateThreadStateChange,\n    DbgCreateProcessStateChange,\n    DbgExitThreadStateChange,\n    DbgExitProcessStateChange,\n    DbgExceptionStateChange,\n    DbgBreakpointStateChange,\n    DbgSingleStepStateChange,\n    DbgLoadDllStateChange,\n    DbgUnloadDllStateChange\n} DBG_STATE, *PDBG_STATE;\n\ntypedef struct _DBGUI_CREATE_THREAD\n{\n    HANDLE HandleToThread;\n    DBGKM_CREATE_THREAD NewThread;\n} DBGUI_CREATE_THREAD, *PDBGUI_CREATE_THREAD;\n\ntypedef struct _DBGUI_CREATE_PROCESS\n{\n    HANDLE HandleToProcess;\n    HANDLE HandleToThread;\n    DBGKM_CREATE_PROCESS NewProcess;\n} DBGUI_CREATE_PROCESS, *PDBGUI_CREATE_PROCESS;\n\ntypedef struct _DBGUI_WAIT_STATE_CHANGE\n{\n    DBG_STATE NewState;\n    CLIENT_ID AppClientId;\n    union\n    {\n        DBGKM_EXCEPTION Exception;\n        DBGUI_CREATE_THREAD CreateThread;\n        DBGUI_CREATE_PROCESS CreateProcessInfo;\n        DBGKM_EXIT_THREAD ExitThread;\n        DBGKM_EXIT_PROCESS ExitProcess;\n        DBGKM_LOAD_DLL LoadDll;\n        DBGKM_UNLOAD_DLL UnloadDll;\n    } StateInfo;\n} DBGUI_WAIT_STATE_CHANGE, *PDBGUI_WAIT_STATE_CHANGE;\n\n#define DEBUG_READ_EVENT 0x0001\n#define DEBUG_PROCESS_ASSIGN 0x0002\n#define DEBUG_SET_INFORMATION 0x0004\n#define DEBUG_QUERY_INFORMATION 0x0008\n#define DEBUG_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \\\n    DEBUG_READ_EVENT | DEBUG_PROCESS_ASSIGN | DEBUG_SET_INFORMATION | \\\n    DEBUG_QUERY_INFORMATION)\n\n#define DEBUG_KILL_ON_CLOSE 0x1\n\ntypedef enum _DEBUGOBJECTINFOCLASS\n{\n    DebugObjectUnusedInformation,\n    DebugObjectKillProcessOnExitInformation, // s: ULONG\n    MaxDebugObjectInfoClass\n} DEBUGOBJECTINFOCLASS, *PDEBUGOBJECTINFOCLASS;\n\n//\n// System calls\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateDebugObject(\n    _Out_ PHANDLE DebugObjectHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDebugActiveProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE DebugObjectHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDebugContinue(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ PCLIENT_ID ClientId,\n    _In_ NTSTATUS ContinueStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRemoveProcessDebug(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE DebugObjectHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationDebugObject(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ DEBUGOBJECTINFOCLASS DebugObjectInformationClass,\n    _In_reads_bytes_(DebugInformationLength) PVOID DebugInformation,\n    _In_ ULONG DebugInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForDebugEvent(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _Out_ PDBGUI_WAIT_STATE_CHANGE WaitStateChange\n    );\n\n//\n// Debugging UI\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiConnectToDbg(\n    VOID\n    );\n\nNTSYSAPI\nHANDLE\nNTAPI\nDbgUiGetThreadDebugObject(\n    VOID\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nDbgUiSetThreadDebugObject(\n    _In_ HANDLE DebugObject\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiWaitStateChange(\n    _Out_ PDBGUI_WAIT_STATE_CHANGE StateChange,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiContinue(\n    _In_ PCLIENT_ID AppClientId,\n    _In_ NTSTATUS ContinueStatus\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiStopDebugging(\n    _In_ HANDLE Process\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiDebugActiveProcess(\n    _In_ HANDLE Process\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nDbgUiRemoteBreakin(\n    _In_ PVOID Context\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiIssueRemoteBreakin(\n    _In_ HANDLE Process\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiConvertStateChangeStructure(\n    _In_ PDBGUI_WAIT_STATE_CHANGE StateChange,\n    _Out_ LPDEBUG_EVENT DebugEvent\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nDbgUiConvertStateChangeStructureEx(\n    _In_ PDBGUI_WAIT_STATE_CHANGE StateChange,\n    _Out_ LPDEBUG_EVENT DebugEvent\n    );\n\ntypedef struct _EVENT_FILTER_DESCRIPTOR *PEVENT_FILTER_DESCRIPTOR;\n\ntypedef VOID (NTAPI *PENABLECALLBACK)(\n    _In_ LPCGUID SourceId,\n    _In_ ULONG IsEnabled,\n    _In_ UCHAR Level,\n    _In_ ULONGLONG MatchAnyKeyword,\n    _In_ ULONGLONG MatchAllKeyword,\n    _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData,\n    _Inout_opt_ PVOID CallbackContext\n    );\n\ntypedef ULONGLONG REGHANDLE, *PREGHANDLE;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nEtwEventRegister(\n    _In_ LPCGUID ProviderId,\n    _In_opt_ PENABLECALLBACK EnableCallback,\n    _In_opt_ PVOID CallbackContext,\n    _Out_ PREGHANDLE RegHandle\n    );\n\n#endif // _NTDBG_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntexapi.h",
    "content": "/*\n * Executive support library functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTEXAPI_H\n#define _NTEXAPI_H\n\n#include \"ntkeapi.h\"\n\ntypedef struct _TEB* PTEB;\ntypedef struct _COUNTED_REASON_CONTEXT* PCOUNTED_REASON_CONTEXT;\ntypedef struct _FILE_IO_COMPLETION_INFORMATION* PFILE_IO_COMPLETION_INFORMATION;\ntypedef struct _PORT_MESSAGE* PPORT_MESSAGE;\ntypedef struct _IMAGE_EXPORT_DIRECTORY* PIMAGE_EXPORT_DIRECTORY;\ntypedef struct _FILE_OBJECT* PFILE_OBJECT;\ntypedef struct _DEVICE_OBJECT* PDEVICE_OBJECT;\ntypedef struct _IRP* PIRP;\ntypedef struct _RTL_BITMAP* PRTL_BITMAP;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Thread execution\n//\n\n/**\n * The NtDelayExecution routine suspends the current thread until the specified condition is met.\n *\n * @param Alertable The function returns when either the time-out period has elapsed or when the APC function is called.\n * @param DelayInterval The time interval for which execution is to be suspended, in milliseconds.\n * - A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run.\n * - If there are no other threads ready to run, the function returns immediately, and the thread continues execution.\n * - A value of INFINITE indicates that the suspension should not time out.\n * @return NTSTATUS Successful or errant status. The return value is STATUS_USER_APC when Alertable is TRUE, and the function returned due to one or more I/O completion callback functions.\n * @remarks Note that a ready thread is not guaranteed to run immediately. Consequently, the thread will not run until some arbitrary time after the sleep interval elapses,\n * based upon the system \"tick\" frequency and the load factor from other processes.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleepex\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDelayExecution(\n    _In_ BOOLEAN Alertable,\n    _In_ PLARGE_INTEGER DelayInterval\n    );\n\n//\n// Firmware environment values\n//\n\n/**\n * Retrieves the value of the specified firmware environment variable.\n * The user account that the app is running under must have the SE_SYSTEM_ENVIRONMENT_NAME privilege.\n *\n * @param VariableName The name of the firmware environment variable. The pointer must not be NULL.\n * @param VariableValue A pointer to a buffer that receives the value of the specified firmware environment variable.\n * @param ValueLength The size of the \\c VariableValue buffer, in bytes.\n * @param ReturnLength If the function succeeds, the return length is the number of bytes stored in the \\c VariableValue buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySystemEnvironmentValue(\n    _In_ PCUNICODE_STRING VariableName,\n    _Out_writes_bytes_(ValueLength) PWSTR VariableValue,\n    _In_ USHORT ValueLength,\n    _Out_opt_ PUSHORT ReturnLength\n    );\n\n// The firmware environment variable is stored in non-volatile memory (e.g. NVRAM).\n#define EFI_VARIABLE_NON_VOLATILE 0x00000001\n// The firmware environment variable can be accessed during boot service.\n#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002\n// The firmware environment variable can be accessed at runtime.\n#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004\n// Indicates hardware related errors encountered at runtime.\n#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008\n// Indicates an authentication requirement that must be met before writing to this firmware environment variable.\n#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010\n// Indicates authentication and time stamp requirements that must be met before writing to this firmware environment variable.\n// When this attribute is set, the buffer, represented by Buffer, will begin with an instance of a complete (and serialized) EFI_VARIABLE_AUTHENTICATION_2 descriptor.\n#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020\n// Append an existing environment variable with the value of Buffer. If the firmware does not support the operation, the function returns ERROR_INVALID_FUNCTION.\n#define EFI_VARIABLE_APPEND_WRITE 0x00000040\n// The firmware environment variable will return metadata in addition to variable data.\n#define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS 0x00000080\n\n/**\n * Retrieves the value of the specified firmware environment variable and its attributes.\n * The user account that the app is running under must have the SE_SYSTEM_ENVIRONMENT_NAME privilege.\n *\n * @param VariableName The name of the firmware environment variable. The pointer must not be NULL.\n * @param VendorGuid The GUID that represents the namespace of the firmware environment variable.\n * @param Buffer A pointer to a buffer that receives the value of the specified firmware environment variable.\n * @param BufferLength The size of the \\c Buffer, in bytes.\n * @param Attributes Bitmask identifying UEFI variable attributes associated with the variable.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySystemEnvironmentValueEx(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCGUID VendorGuid,\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength,\n    _Out_opt_ PULONG Attributes // EFI_VARIABLE_*\n    );\n\n/**\n * Sets the value of the specified firmware environment variable.\n * The user account that the app is running under must have the SE_SYSTEM_ENVIRONMENT_NAME privilege.\n *\n * @param VariableName The name of the firmware environment variable. The pointer must not be NULL.\n * @param VariableValue A pointer to the new value for the firmware environment variable.\n * If this parameter is zero, the firmware environment variable is deleted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSystemEnvironmentValue(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCUNICODE_STRING VariableValue\n    );\n\n/**\n * Sets the value of the specified firmware environment variable and the attributes that indicate how this variable is stored and maintained.\n * The user account that the app is running under must have the SE_SYSTEM_ENVIRONMENT_NAME privilege.\n *\n * @param VariableName The name of the firmware environment variable. The pointer must not be NULL.\n * @param VendorGuid The GUID that represents the namespace of the firmware environment variable.\n * @param Buffer A pointer to the new value for the firmware environment variable.\n * @param BufferLength The size of the pValue buffer, in bytes.\n * Unless the VARIABLE_ATTRIBUTE_APPEND_WRITE, VARIABLE_ATTRIBUTE_AUTHENTICATED_WRITE_ACCESS,\n * or VARIABLE_ATTRIBUTE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS variable attribute is set via dwAttributes,\n * setting this value to zero will result in the deletion of this variable.\n * @param Attributes Bitmask to set UEFI variable attributes associated with the variable.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSystemEnvironmentValueEx(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCGUID VendorGuid,\n    _In_reads_bytes_opt_(BufferLength) PVOID Buffer,\n    _In_ ULONG BufferLength, // 0 = delete variable\n    _In_ ULONG Attributes // EFI_VARIABLE_*\n    );\n\ntypedef enum _SYSTEM_ENVIRONMENT_INFORMATION_CLASS\n{\n    SystemEnvironmentNameInformation = 1, // q: VARIABLE_NAME\n    SystemEnvironmentValueInformation = 2, // q: VARIABLE_NAME_AND_VALUE\n    MaxSystemEnvironmentInfoClass\n} SYSTEM_ENVIRONMENT_INFORMATION_CLASS;\n\ntypedef struct _VARIABLE_NAME\n{\n    ULONG NextEntryOffset;\n    GUID VendorGuid;\n    WCHAR Name[ANYSIZE_ARRAY];\n} VARIABLE_NAME, *PVARIABLE_NAME;\n\ntypedef struct _VARIABLE_NAME_AND_VALUE\n{\n    ULONG NextEntryOffset;\n    ULONG ValueOffset;\n    ULONG ValueLength;\n    ULONG Attributes;\n    GUID VendorGuid;\n    WCHAR Name[ANYSIZE_ARRAY];\n    //BYTE Value[ANYSIZE_ARRAY];\n} VARIABLE_NAME_AND_VALUE, *PVARIABLE_NAME_AND_VALUE;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateSystemEnvironmentValuesEx(\n    _In_ ULONG InformationClass, // SYSTEM_ENVIRONMENT_INFORMATION_CLASS\n    _Out_ PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\n// EFI\n\n// private\ntypedef struct _BOOT_ENTRY\n{\n    ULONG Version;\n    ULONG Length;\n    ULONG Id;\n    ULONG Attributes;\n    ULONG FriendlyNameOffset;\n    ULONG BootFilePathOffset;\n    ULONG OsOptionsLength;\n    _Field_size_bytes_(OsOptionsLength) UCHAR OsOptions[1];\n} BOOT_ENTRY, *PBOOT_ENTRY;\n\n// private\ntypedef struct _BOOT_ENTRY_LIST\n{\n    ULONG NextEntryOffset;\n    BOOT_ENTRY BootEntry;\n} BOOT_ENTRY_LIST, *PBOOT_ENTRY_LIST;\n\n// private\ntypedef struct _BOOT_OPTIONS\n{\n    ULONG Version;\n    ULONG Length;\n    ULONG Timeout;\n    ULONG CurrentBootEntryId;\n    ULONG NextBootEntryId;\n    WCHAR HeadlessRedirection[1];\n} BOOT_OPTIONS, *PBOOT_OPTIONS;\n\n// private\ntypedef struct _FILE_PATH\n{\n    ULONG Version;\n    ULONG Length;\n    ULONG Type;\n    _Field_size_bytes_(Length) UCHAR FilePath[1];\n} FILE_PATH, *PFILE_PATH;\n\n// private\ntypedef struct _EFI_DRIVER_ENTRY\n{\n    ULONG Version;\n    ULONG Length;\n    ULONG Id;\n    ULONG FriendlyNameOffset;\n    ULONG DriverFilePathOffset;\n} EFI_DRIVER_ENTRY, *PEFI_DRIVER_ENTRY;\n\n// private\ntypedef struct _EFI_DRIVER_ENTRY_LIST\n{\n    ULONG NextEntryOffset;\n    EFI_DRIVER_ENTRY DriverEntry;\n} EFI_DRIVER_ENTRY_LIST, *PEFI_DRIVER_ENTRY_LIST;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_XP)\n/**\n * The NtAddBootEntry routine adds a new boot entry to the system boot configuration.\n *\n * @param BootEntry A pointer to a BOOT_ENTRY structure that specifies the boot entry to be added.\n * @param Id A pointer to a variable that receives the identifier of the new boot entry.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAddBootEntry(\n    _In_ PBOOT_ENTRY BootEntry,\n    _Out_opt_ PULONG Id\n    );\n\n/**\n * The NtDeleteBootEntry routine deletes an existing boot entry from the system boot configuration.\n *\n * @param Id The identifier of the boot entry to be deleted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteBootEntry(\n    _In_ ULONG Id\n    );\n\n/**\n * The NtModifyBootEntry routine modifies an existing boot entry in the system boot configuration.\n *\n * @param BootEntry A pointer to a BOOT_ENTRY structure that specifies the new boot entry information.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtModifyBootEntry(\n    _In_ PBOOT_ENTRY BootEntry\n    );\n\n/**\n * The NtEnumerateBootEntries routine retrieves information about all boot entries in the system boot configuration.\n *\n * @param Buffer A pointer to a buffer that receives the boot entries information.\n * @param BufferLength A pointer to a variable that specifies the size of the buffer. On return, it contains the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateBootEntries(\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\n/**\n * The NtQueryBootEntryOrder routine retrieves the current boot entry order.\n *\n * @param Ids A pointer to a buffer that receives the identifiers of the boot entries in the current boot order.\n * @param Count A pointer to a variable that specifies the number of entries in the buffer. On return, it contains the number of entries returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryBootEntryOrder(\n    _Out_writes_opt_(*Count) PULONG Ids,\n    _Inout_ PULONG Count\n    );\n\n/**\n * The NtSetBootEntryOrder routine sets the boot entry order.\n *\n * @param Ids A pointer to a buffer that specifies the identifiers of the boot entries in the desired boot order.\n * @param Count The number of entries in the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetBootEntryOrder(\n    _In_reads_(Count) PULONG Ids,\n    _In_ ULONG Count\n    );\n\n/**\n * The NtQueryBootOptions routine retrieves the current boot options.\n *\n * @param BootOptions A pointer to a buffer that receives the boot options.\n * @param BootOptionsLength A pointer to a variable that specifies the size of the buffer. On return, it contains the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryBootOptions(\n    _Out_writes_bytes_opt_(*BootOptionsLength) PBOOT_OPTIONS BootOptions,\n    _Inout_ PULONG BootOptionsLength\n    );\n\n/**\n * The NtSetBootOptions routine sets the boot options.\n *\n * @param BootOptions A pointer to a BOOT_OPTIONS structure that specifies the new boot options.\n * @param FieldsToChange A bitmask that specifies which fields in the BOOT_OPTIONS structure are to be changed.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetBootOptions(\n    _In_ PBOOT_OPTIONS BootOptions,\n    _In_ ULONG FieldsToChange\n    );\n\n/**\n * The NtTranslateFilePath routine translates a file path from one format to another.\n *\n * @param InputFilePath A pointer to a FILE_PATH structure that specifies the input file path.\n * @param OutputType The type of the output file path.\n * @param OutputFilePath A pointer to a buffer that receives the translated file path.\n * @param OutputFilePathLength A pointer to a variable that specifies the size of the buffer. On return, it contains the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTranslateFilePath(\n    _In_ PFILE_PATH InputFilePath,\n    _In_ ULONG OutputType,\n    _Out_writes_bytes_opt_(*OutputFilePathLength) PFILE_PATH OutputFilePath,\n    _Inout_opt_ PULONG OutputFilePathLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_XP)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n/**\n * The NtAddDriverEntry routine adds a new driver entry to the system boot configuration.\n *\n * @param DriverEntry A pointer to an EFI_DRIVER_ENTRY structure that specifies the driver entry to be added.\n * @param Id A pointer to a variable that receives the identifier of the new driver entry.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAddDriverEntry(\n    _In_ PEFI_DRIVER_ENTRY DriverEntry,\n    _Out_opt_ PULONG Id\n    );\n\n/**\n * The NtDeleteDriverEntry routine deletes an existing driver entry from the system boot configuration.\n *\n * @param Id The identifier of the driver entry to be deleted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteDriverEntry(\n    _In_ ULONG Id\n    );\n\n/**\n * The NtModifyDriverEntry routine modifies an existing driver entry in the system boot configuration.\n *\n * @param DriverEntry A pointer to an EFI_DRIVER_ENTRY structure that specifies the new driver entry information.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtModifyDriverEntry(\n    _In_ PEFI_DRIVER_ENTRY DriverEntry\n    );\n\n/**\n * The NtEnumerateDriverEntries routine retrieves information about all driver entries in the system boot configuration.\n *\n * @param Buffer A pointer to a buffer that receives the driver entries information.\n * @param BufferLength A pointer to a variable that specifies the size of the buffer. On return, it contains the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateDriverEntries(\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\n/**\n * The NtQueryDriverEntryOrder routine retrieves the current driver entry order.\n *\n * @param Ids A pointer to a buffer that receives the identifiers of the driver entries in the current driver order.\n * @param Count A pointer to a variable that specifies the number of entries in the buffer. On return, it contains the number of entries returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDriverEntryOrder(\n    _Out_writes_opt_(*Count) PULONG Ids,\n    _Inout_ PULONG Count\n    );\n\n/**\n * The NtSetDriverEntryOrder routine sets the driver entry order.\n *\n * @param Ids A pointer to a buffer that specifies the identifiers of the driver entries in the desired driver order.\n * @param Count The number of entries in the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetDriverEntryOrder(\n    _In_reads_(Count) PULONG Ids,\n    _In_ ULONG Count\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n\ntypedef enum _FILTER_BOOT_OPTION_OPERATION\n{\n    FilterBootOptionOperationOpenSystemStore,\n    FilterBootOptionOperationSetElement,\n    FilterBootOptionOperationDeleteElement,\n    FilterBootOptionOperationMax\n} FILTER_BOOT_OPTION_OPERATION;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n/**\n * The NtFilterBootOption routine filters boot options based on the specified operation, object type, and element type.\n *\n * @param FilterOperation The operation to be performed on the boot option. This can be one of the values from the FILTER_BOOT_OPTION_OPERATION enumeration.\n * @param ObjectType The type of the object to be filtered.\n * @param ElementType The type of the element within the object to be filtered.\n * @param Data A pointer to a buffer that contains the data to be used in the filter operation. This parameter is optional and can be NULL.\n * @param DataSize The size, in bytes, of the data buffer pointed to by the Data parameter.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFilterBootOption(\n    _In_ FILTER_BOOT_OPTION_OPERATION FilterOperation,\n    _In_ ULONG ObjectType,\n    _In_ ULONG ElementType,\n    _In_reads_bytes_opt_(DataSize) PVOID Data,\n    _In_ ULONG DataSize\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n//\n// Event\n//\n\n#ifndef EVENT_QUERY_STATE\n#define EVENT_QUERY_STATE 0x0001\n#endif\n\n#ifndef EVENT_MODIFY_STATE\n#define EVENT_MODIFY_STATE 0x0002\n#endif\n\n#ifndef EVENT_ALL_ACCESS\n#define EVENT_ALL_ACCESS (EVENT_QUERY_STATE|EVENT_MODIFY_STATE|STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE)\n#endif\n\ntypedef enum _EVENT_INFORMATION_CLASS\n{\n    EventBasicInformation\n} EVENT_INFORMATION_CLASS;\n\ntypedef struct _EVENT_BASIC_INFORMATION\n{\n    EVENT_TYPE EventType;\n    LONG EventState;\n} EVENT_BASIC_INFORMATION, *PEVENT_BASIC_INFORMATION;\n\n/**\n * The NtCreateEvent routine creates an event object, sets the initial state of the event to the specified value,\n * and opens a handle to the object with the specified desired access.\n *\n * @param EventHandle A pointer to a variable that receives the event object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the event object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param EventType The type of the event, which can be SynchronizationEvent or a NotificationEvent.\n * @param InitialState The initial state of the event object.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwcreateevent\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateEvent(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ EVENT_TYPE EventType,\n    _In_ BOOLEAN InitialState\n    );\n\n/**\n * The NtOpenEvent routine opens a handle to an existing event object.\n *\n * @param EventHandle A pointer to a variable that receives the event object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the event object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenEvent(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The NtSetEvent routine sets an event object to the signaled state.\n *\n * @param EventHandle A handle to the event object.\n * @param PreviousState A pointer to a variable that receives the previous state of the event object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * The NtSetEventEx routine sets an event object to the signaled state and optionally acquires a lock.\n *\n * @param ThreadId A handle to the thread.\n * @param Lock A pointer to an RTL_SRWLOCK structure that specifies the lock to acquire.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetEventEx(\n    _In_ HANDLE ThreadId,\n    _In_opt_ PRTL_SRWLOCK Lock\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_11)\n\n/**\n * The NtSetEventBoostPriority routine sets an event object to the signaled state and boosts the priority of threads waiting on the event.\n *\n * @param EventHandle A handle to the event object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetEventBoostPriority(\n    _In_ HANDLE EventHandle\n    );\n\n/**\n * The NtClearEvent routine sets an event object to the not-signaled state.\n *\n * @param EventHandle A handle to the event object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtClearEvent(\n    _In_ HANDLE EventHandle\n    );\n\n/**\n * The NtResetEvent routine sets an event object to the not-signaled state and optionally returns the previous state.\n *\n * @param EventHandle A handle to the event object.\n * @param PreviousState A pointer to a variable that receives the previous state of the event object.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-resetevent\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtResetEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\n/**\n * The NtPulseEvent routine sets an event object to the signaled state and then resets it to the not-signaled state after releasing the appropriate number of waiting threads.\n *\n * @param EventHandle A handle to the event object.\n * @param PreviousState A pointer to a variable that receives the previous state of the event object.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-pulseevent\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPulseEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\n/**\n * The NtQueryEvent routine retrieves information about an event object.\n *\n * @param EventHandle A handle to the event object.\n * @param EventInformationClass The type of information to be retrieved.\n * @param EventInformation A pointer to a buffer that receives the requested information.\n * @param EventInformationLength The size of the buffer pointed to by EventInformation.\n * @param ReturnLength A pointer to a variable that receives the size of the data returned in the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryEvent(\n    _In_ HANDLE EventHandle,\n    _In_ EVENT_INFORMATION_CLASS EventInformationClass,\n    _Out_writes_bytes_(EventInformationLength) PVOID EventInformation,\n    _In_ ULONG EventInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n//\n// Event Pair\n//\n\n#define EVENT_PAIR_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE)\n\n/**\n * The NtCreateEventPair routine creates an event pair object and opens a handle to the object with the specified desired access.\n *\n * @param EventPairHandle A pointer to a variable that receives the event pair object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the event pair object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateEventPair(\n    _Out_ PHANDLE EventPairHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The NtOpenEventPair routine opens a handle to an existing event pair object.\n *\n * @param EventPairHandle A pointer to a variable that receives the event pair object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the event pair object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenEventPair(\n    _Out_ PHANDLE EventPairHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The NtSetLowEventPair routine sets the low event in an event pair to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n/**\n * The NtSetHighEventPair routine sets the high event in an event pair to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n/**\n * The NtWaitLowEventPair routine waits for the low event in an event pair to be set to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n/**\n * The NtWaitHighEventPair routine waits for the high event in an event pair to be set to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n/**\n * The NtSetLowWaitHighEventPair routine sets the low event in an event pair to the signaled state and waits for the high event to be set to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetLowWaitHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n/**\n * The NtSetHighWaitLowEventPair routine sets the high event in an event pair to the signaled state and waits for the low event to be set to the signaled state.\n *\n * @param EventPairHandle A handle to the event pair object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetHighWaitLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\n//\n// Mutant\n//\n\n#ifndef MUTANT_QUERY_STATE\n#define MUTANT_QUERY_STATE 0x0001\n#endif\n\n#ifndef MUTANT_ALL_ACCESS\n#define MUTANT_ALL_ACCESS (MUTANT_QUERY_STATE|STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE)\n#endif\n\ntypedef enum _MUTANT_INFORMATION_CLASS\n{\n    MutantBasicInformation, // MUTANT_BASIC_INFORMATION\n    MutantOwnerInformation // MUTANT_OWNER_INFORMATION\n} MUTANT_INFORMATION_CLASS;\n\n/**\n * The MUTANT_BASIC_INFORMATION structure contains basic information about a mutant object.\n */\ntypedef struct _MUTANT_BASIC_INFORMATION\n{\n    LONG CurrentCount;\n    BOOLEAN OwnedByCaller;\n    BOOLEAN AbandonedState;\n} MUTANT_BASIC_INFORMATION, *PMUTANT_BASIC_INFORMATION;\n\n/**\n * The MUTANT_OWNER_INFORMATION structure contains information about the owner of a mutant object.\n */\ntypedef struct _MUTANT_OWNER_INFORMATION\n{\n    CLIENT_ID ClientId;\n} MUTANT_OWNER_INFORMATION, *PMUTANT_OWNER_INFORMATION;\n\n/**\n * The NtCreateMutant routine creates a mutant object, sets the initial state of the mutant to the specified value,\n * and opens a handle to the object with the specified desired access.\n *\n * @param MutantHandle A pointer to a variable that receives the mutant object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the mutant object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param InitialOwner If TRUE, the calling thread is the initial owner of the mutant object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateMutant(\n    _Out_ PHANDLE MutantHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ BOOLEAN InitialOwner\n    );\n\n/**\n * The NtOpenMutant routine opens a handle to an existing mutant object.\n *\n * @param MutantHandle A pointer to a variable that receives the mutant object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the mutant object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenMutant(\n    _Out_ PHANDLE MutantHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The NtReleaseMutant routine releases ownership of a mutant object.\n *\n * @param MutantHandle A handle to the mutant object.\n * @param PreviousCount A pointer to a variable that receives the previous count of the mutant object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReleaseMutant(\n    _In_ HANDLE MutantHandle,\n    _Out_opt_ PLONG PreviousCount\n    );\n\n/**\n * The NtQueryMutant routine retrieves information about a mutant object.\n *\n * @param MutantHandle A handle to the mutant object.\n * @param MutantInformationClass The type of information to be retrieved.\n * @param MutantInformation A pointer to a buffer that receives the requested information.\n * @param MutantInformationLength The size of the buffer pointed to by MutantInformation.\n * @param ReturnLength A pointer to a variable that receives the size of the data returned in the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryMutant(\n    _In_ HANDLE MutantHandle,\n    _In_ MUTANT_INFORMATION_CLASS MutantInformationClass,\n    _Out_writes_bytes_(MutantInformationLength) PVOID MutantInformation,\n    _In_ ULONG MutantInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n//\n// Semaphore\n//\n\n#ifndef SEMAPHORE_QUERY_STATE\n#define SEMAPHORE_QUERY_STATE 0x0001\n#endif\n\n#ifndef SEMAPHORE_MODIFY_STATE\n#define SEMAPHORE_MODIFY_STATE 0x0002\n#endif\n\n#ifndef SEMAPHORE_ALL_ACCESS\n#define SEMAPHORE_ALL_ACCESS (SEMAPHORE_QUERY_STATE|SEMAPHORE_MODIFY_STATE|STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE)\n#endif\n\ntypedef enum _SEMAPHORE_INFORMATION_CLASS\n{\n    SemaphoreBasicInformation\n} SEMAPHORE_INFORMATION_CLASS;\n\n/**\n * The SEMAPHORE_BASIC_INFORMATION structure contains basic information about a semaphore object.\n */\ntypedef struct _SEMAPHORE_BASIC_INFORMATION\n{\n    LONG CurrentCount;\n    LONG MaximumCount;\n} SEMAPHORE_BASIC_INFORMATION, *PSEMAPHORE_BASIC_INFORMATION;\n\n/**\n * The NtCreateSemaphore routine creates a semaphore object, sets the initial count of the semaphore to the specified value,\n * and opens a handle to the object with the specified desired access.\n *\n * @param SemaphoreHandle A pointer to a variable that receives the semaphore object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the semaphore object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param InitialCount The initial count of the semaphore object.\n * @param MaximumCount The maximum count of the semaphore object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateSemaphore(\n    _Out_ PHANDLE SemaphoreHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ LONG InitialCount,\n    _In_ LONG MaximumCount\n    );\n\n/**\n * The NtOpenSemaphore routine opens a handle to an existing semaphore object.\n *\n * @param SemaphoreHandle A pointer to a variable that receives the semaphore object handle.\n * @param DesiredAccess The access mask that specifies the requested access to the semaphore object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenSemaphore(\n    _Out_ PHANDLE SemaphoreHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The NtReleaseSemaphore routine increases the count of the specified semaphore object by a specified amount.\n *\n * @param SemaphoreHandle A handle to the semaphore object.\n * @param ReleaseCount The amount by which the semaphore object's count is to be increased.\n * @param PreviousCount A pointer to a variable that receives the previous count of the semaphore object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReleaseSemaphore(\n    _In_ HANDLE SemaphoreHandle,\n    _In_ LONG ReleaseCount,\n    _Out_opt_ PLONG PreviousCount\n    );\n\n/**\n * The NtQuerySemaphore routine retrieves information about a semaphore object.\n *\n * @param SemaphoreHandle A handle to the semaphore object.\n * @param SemaphoreInformationClass The type of information to be retrieved.\n * @param SemaphoreInformation A pointer to a buffer that receives the requested information.\n * @param SemaphoreInformationLength The size of the buffer pointed to by SemaphoreInformation.\n * @param ReturnLength A pointer to a variable that receives the size of the data returned in the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySemaphore(\n    _In_ HANDLE SemaphoreHandle,\n    _In_ SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass,\n    _Out_writes_bytes_(SemaphoreInformationLength) PVOID SemaphoreInformation,\n    _In_ ULONG SemaphoreInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n//\n// Timer\n//\n\n#ifndef TIMER_QUERY_STATE\n#define TIMER_QUERY_STATE 0x0001\n#endif\n\n#ifndef TIMER_MODIFY_STATE\n#define TIMER_MODIFY_STATE 0x0002\n#endif\n\n#ifndef TIMER_ALL_ACCESS\n#define TIMER_ALL_ACCESS (TIMER_QUERY_STATE|TIMER_MODIFY_STATE|STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE)\n#endif\n\ntypedef enum _TIMER_INFORMATION_CLASS\n{\n    TimerBasicInformation // TIMER_BASIC_INFORMATION\n} TIMER_INFORMATION_CLASS;\n\ntypedef struct _TIMER_BASIC_INFORMATION\n{\n    LARGE_INTEGER RemainingTime;\n    BOOLEAN TimerState;\n} TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION;\n\ntypedef _Function_class_(TIMER_APC_ROUTINE)\nVOID NTAPI TIMER_APC_ROUTINE(\n    _In_ PVOID TimerContext,\n    _In_ ULONG TimerLowValue,\n    _In_ LONG TimerHighValue\n    );\ntypedef TIMER_APC_ROUTINE* PTIMER_APC_ROUTINE;\n\ntypedef enum _TIMER_SET_INFORMATION_CLASS\n{\n    TimerSetCoalescableTimer, // TIMER_SET_COALESCABLE_TIMER_INFO\n    MaxTimerInfoClass\n} TIMER_SET_INFORMATION_CLASS;\n\ntypedef struct _TIMER_SET_COALESCABLE_TIMER_INFO\n{\n    _In_ LARGE_INTEGER DueTime;\n    _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine;\n    _In_opt_ PVOID TimerContext;\n    _In_opt_ PCOUNTED_REASON_CONTEXT WakeContext;\n    _In_opt_ ULONG Period;\n    _In_ ULONG TolerableDelay;\n    _Out_opt_ PBOOLEAN PreviousState;\n} TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TIMER_TYPE TimerType\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetTimer(\n    _In_ HANDLE TimerHandle,\n    _In_ PLARGE_INTEGER DueTime,\n    _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine,\n    _In_opt_ PVOID TimerContext,\n    _In_ BOOLEAN ResumeTimer,\n    _In_opt_ LONG Period,\n    _Out_opt_ PBOOLEAN PreviousState\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetTimerEx(\n    _In_ HANDLE TimerHandle,\n    _In_ TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,\n    _Inout_updates_bytes_opt_(TimerSetInformationLength) PVOID TimerSetInformation,\n    _In_ ULONG TimerSetInformationLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelTimer(\n    _In_ HANDLE TimerHandle,\n    _Out_opt_ PBOOLEAN CurrentState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryTimer(\n    _In_ HANDLE TimerHandle,\n    _In_ TIMER_INFORMATION_CLASS TimerInformationClass,\n    _Out_writes_bytes_(TimerInformationLength) PVOID TimerInformation,\n    _In_ ULONG TimerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateIRTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ PVOID Reserved,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetIRTimer(\n    _In_ HANDLE TimerHandle,\n    _In_opt_ PLARGE_INTEGER DueTime\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateTimer2(\n    _Out_ PHANDLE TimerHandle,\n    _In_opt_ PVOID Reserved1,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG Attributes, // TIMER_TYPE\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\ntypedef struct _T2_SET_PARAMETERS_V0\n{\n    ULONG Version;\n    ULONG Reserved;\n    LONGLONG NoWakeTolerance;\n} T2_SET_PARAMETERS, *PT2_SET_PARAMETERS;\n\ntypedef PVOID PT2_CANCEL_PARAMETERS;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetTimer2(\n    _In_ HANDLE TimerHandle,\n    _In_ PLARGE_INTEGER DueTime,\n    _In_opt_ PLARGE_INTEGER Period,\n    _In_ PT2_SET_PARAMETERS Parameters\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelTimer2(\n    _In_ HANDLE TimerHandle,\n    _In_ PT2_CANCEL_PARAMETERS Parameters\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n//\n// Profile\n//\n\n#define PROFILE_CONTROL 0x0001\n#define PROFILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | PROFILE_CONTROL)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateProfile(\n    _Out_ PHANDLE ProfileHandle,\n    _In_opt_ HANDLE Process,\n    _In_ PVOID ProfileBase,\n    _In_ SIZE_T ProfileSize,\n    _In_ ULONG BucketSize,\n    _In_reads_bytes_(BufferSize) PULONG Buffer,\n    _In_ ULONG BufferSize,\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _In_ KAFFINITY Affinity\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateProfileEx(\n    _Out_ PHANDLE ProfileHandle,\n    _In_opt_ HANDLE Process,\n    _In_ PVOID ProfileBase,\n    _In_ SIZE_T ProfileSize,\n    _In_ ULONG BucketSize,\n    _In_reads_bytes_(BufferSize) PULONG Buffer,\n    _In_ ULONG BufferSize,\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _In_ USHORT GroupCount,\n    _In_reads_(GroupCount) PGROUP_AFFINITY GroupAffinity\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtStartProfile(\n    _In_ HANDLE ProfileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtStopProfile(\n    _In_ HANDLE ProfileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryIntervalProfile(\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _Out_ PULONG Interval\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetIntervalProfile(\n    _In_ ULONG Interval,\n    _In_ KPROFILE_SOURCE Source\n    );\n\n// Keyed Event\n\n#define KEYEDEVENT_WAIT 0x0001\n#define KEYEDEVENT_WAKE 0x0002\n#define KEYEDEVENT_ALL_ACCESS \\\n    (STANDARD_RIGHTS_REQUIRED | KEYEDEVENT_WAIT | KEYEDEVENT_WAKE)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateKeyedEvent(\n    _Out_ PHANDLE KeyedEventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenKeyedEvent(\n    _Out_ PHANDLE KeyedEventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReleaseKeyedEvent(\n    _In_opt_ HANDLE KeyedEventHandle,\n    _In_ PVOID KeyValue,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForKeyedEvent(\n    _In_opt_ HANDLE KeyedEventHandle,\n    _In_ PVOID KeyValue,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n//\n// UMS\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUmsThreadYield(\n    _In_ PVOID SchedulerParam\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n//\n// WNF\n//\n\n// begin_private\n\ntypedef struct _WNF_STATE_NAME\n{\n    ULONG Data[2];\n} WNF_STATE_NAME, *PWNF_STATE_NAME;\n\ntypedef const WNF_STATE_NAME *PCWNF_STATE_NAME;\n\ntypedef enum _WNF_STATE_NAME_LIFETIME\n{\n    WnfWellKnownStateName,\n    WnfPermanentStateName,\n    WnfPersistentStateName,\n    WnfTemporaryStateName\n} WNF_STATE_NAME_LIFETIME;\n\ntypedef enum _WNF_STATE_NAME_INFORMATION\n{\n    WnfInfoStateNameExist,\n    WnfInfoSubscribersPresent,\n    WnfInfoIsQuiescent\n} WNF_STATE_NAME_INFORMATION;\n\ntypedef enum _WNF_DATA_SCOPE\n{\n    WnfDataScopeSystem,\n    WnfDataScopeSession,\n    WnfDataScopeUser,\n    WnfDataScopeProcess,\n    WnfDataScopeMachine, // REDSTONE3\n    WnfDataScopePhysicalMachine, // WIN11\n} WNF_DATA_SCOPE;\n\ntypedef struct _WNF_TYPE_ID\n{\n    GUID TypeId;\n} WNF_TYPE_ID, *PWNF_TYPE_ID;\n\ntypedef const WNF_TYPE_ID *PCWNF_TYPE_ID;\n\n// rev\ntypedef ULONG WNF_CHANGE_STAMP, *PWNF_CHANGE_STAMP;\n\ntypedef struct _WNF_DELIVERY_DESCRIPTOR\n{\n    ULONGLONG SubscriptionId;\n    WNF_STATE_NAME StateName;\n    WNF_CHANGE_STAMP ChangeStamp;\n    ULONG StateDataSize;\n    ULONG EventMask;\n    WNF_TYPE_ID TypeId;\n    ULONG StateDataOffset;\n} WNF_DELIVERY_DESCRIPTOR, *PWNF_DELIVERY_DESCRIPTOR;\n\n// end_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateWnfStateName(\n    _Out_ PWNF_STATE_NAME StateName,\n    _In_ WNF_STATE_NAME_LIFETIME NameLifetime,\n    _In_ WNF_DATA_SCOPE DataScope,\n    _In_ BOOLEAN PersistData,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_ ULONG MaximumStateSize,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteWnfStateName(\n    _In_ PCWNF_STATE_NAME StateName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUpdateWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_reads_bytes_opt_(Length) const VOID* Buffer,\n    _In_opt_ ULONG Length,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_opt_ const VOID* ExplicitScope,\n    _In_ WNF_CHANGE_STAMP MatchingChangeStamp,\n    _In_ LOGICAL CheckStamp\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ const VOID* ExplicitScope\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_opt_ const VOID* ExplicitScope,\n    _Out_ PWNF_CHANGE_STAMP ChangeStamp,\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryWnfStateNameInformation(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_ WNF_STATE_NAME_INFORMATION NameInfoClass,\n    _In_opt_ const VOID* ExplicitScope,\n    _Out_writes_bytes_(BufferLength) PVOID Buffer,\n    _In_ ULONG BufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSubscribeWnfStateChange(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ WNF_CHANGE_STAMP ChangeStamp,\n    _In_ ULONG EventMask,\n    _Out_opt_ PULONG64 SubscriptionId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnsubscribeWnfStateChange(\n    _In_ PCWNF_STATE_NAME StateName\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetCompleteWnfStateSubscription(\n    _In_opt_ PWNF_STATE_NAME OldDescriptorStateName,\n    _In_opt_ ULONG64 *OldSubscriptionId,\n    _In_opt_ ULONG OldDescriptorEventMask,\n    _In_opt_ ULONG OldDescriptorStatus,\n    _Out_writes_bytes_(DescriptorSize) PWNF_DELIVERY_DESCRIPTOR NewDeliveryDescriptor,\n    _In_ ULONG DescriptorSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetWnfProcessNotificationEvent(\n    _In_ HANDLE NotificationEvent\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n//\n// Worker factory\n//\n\n// begin_rev\n\n#define WORKER_FACTORY_RELEASE_WORKER 0x0001\n#define WORKER_FACTORY_WAIT 0x0002\n#define WORKER_FACTORY_SET_INFORMATION 0x0004\n#define WORKER_FACTORY_QUERY_INFORMATION 0x0008\n#define WORKER_FACTORY_READY_WORKER 0x0010\n#define WORKER_FACTORY_SHUTDOWN 0x0020\n\n#define WORKER_FACTORY_ALL_ACCESS ( \\\n    STANDARD_RIGHTS_REQUIRED | \\\n    WORKER_FACTORY_RELEASE_WORKER | \\\n    WORKER_FACTORY_WAIT | \\\n    WORKER_FACTORY_SET_INFORMATION | \\\n    WORKER_FACTORY_QUERY_INFORMATION | \\\n    WORKER_FACTORY_READY_WORKER | \\\n    WORKER_FACTORY_SHUTDOWN \\\n    )\n\n// end_rev\n\n// begin_private\n\ntypedef enum _WORKERFACTORYINFOCLASS\n{\n    WorkerFactoryTimeout, // LARGE_INTEGER\n    WorkerFactoryRetryTimeout, // LARGE_INTEGER\n    WorkerFactoryIdleTimeout, // s: LARGE_INTEGER\n    WorkerFactoryBindingCount, // s: ULONG\n    WorkerFactoryThreadMinimum, // s: ULONG\n    WorkerFactoryThreadMaximum, // s: ULONG\n    WorkerFactoryPaused, // ULONG or BOOLEAN\n    WorkerFactoryBasicInformation, // q: WORKER_FACTORY_BASIC_INFORMATION\n    WorkerFactoryAdjustThreadGoal,\n    WorkerFactoryCallbackType,\n    WorkerFactoryStackInformation, // 10\n    WorkerFactoryThreadBasePriority, // s: ULONG\n    WorkerFactoryTimeoutWaiters, // s: ULONG, since THRESHOLD\n    WorkerFactoryFlags, // s: ULONG\n    WorkerFactoryThreadSoftMaximum, // s: ULONG\n    WorkerFactoryThreadCpuSets, // since REDSTONE5\n    MaxWorkerFactoryInfoClass\n} WORKERFACTORYINFOCLASS, *PWORKERFACTORYINFOCLASS;\n\ntypedef struct _WORKER_FACTORY_BASIC_INFORMATION\n{\n    LARGE_INTEGER Timeout;\n    LARGE_INTEGER RetryTimeout;\n    LARGE_INTEGER IdleTimeout;\n    BOOLEAN Paused;\n    BOOLEAN TimerSet;\n    BOOLEAN QueuedToExWorker;\n    BOOLEAN MayCreate;\n    BOOLEAN CreateInProgress;\n    BOOLEAN InsertedIntoQueue;\n    BOOLEAN Shutdown;\n    ULONG BindingCount;\n    ULONG ThreadMinimum;\n    ULONG ThreadMaximum;\n    ULONG PendingWorkerCount;\n    ULONG WaitingWorkerCount;\n    ULONG TotalWorkerCount;\n    ULONG ReleaseCount;\n    LONGLONG InfiniteWaitGoal;\n    PVOID StartRoutine;\n    PVOID StartParameter;\n    HANDLE ProcessId;\n    SIZE_T StackReserve;\n    SIZE_T StackCommit;\n    NTSTATUS LastThreadCreationStatus;\n} WORKER_FACTORY_BASIC_INFORMATION, *PWORKER_FACTORY_BASIC_INFORMATION;\n\n// end_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateWorkerFactory(\n    _Out_ PHANDLE WorkerFactoryHandleReturn,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE CompletionPortHandle,\n    _In_ HANDLE WorkerProcessHandle,\n    _In_ PVOID StartRoutine,\n    _In_opt_ PVOID StartParameter,\n    _In_opt_ ULONG MaxThreadCount,\n    _In_opt_ SIZE_T StackReserve,\n    _In_opt_ SIZE_T StackCommit\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _In_ WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    _Out_writes_bytes_(WorkerFactoryInformationLength) PVOID WorkerFactoryInformation,\n    _In_ ULONG WorkerFactoryInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _In_ WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    _In_reads_bytes_(WorkerFactoryInformationLength) PVOID WorkerFactoryInformation,\n    _In_ ULONG WorkerFactoryInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtShutdownWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _Inout_ volatile LONG *PendingWorkerCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReleaseWorkerFactoryWorker(\n    _In_ HANDLE WorkerFactoryHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWorkerFactoryWorkerReady(\n    _In_ HANDLE WorkerFactoryHandle\n    );\n\ntypedef struct _WORKER_FACTORY_DEFERRED_WORK\n{\n    PPORT_MESSAGE AlpcSendMessage;\n    PVOID AlpcSendMessagePort;\n    ULONG AlpcSendMessageFlags;\n    ULONG Flags;\n} WORKER_FACTORY_DEFERRED_WORK, *PWORKER_FACTORY_DEFERRED_WORK;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForWorkViaWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _Out_writes_to_(Count, *PacketsReturned) PFILE_IO_COMPLETION_INFORMATION MiniPackets,\n    _In_ ULONG Count,\n    _Out_ PULONG PacketsReturned,\n    _In_ PWORKER_FACTORY_DEFERRED_WORK DeferredWork\n    );\n\n#else\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForWorkViaWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _Out_ PFILE_IO_COMPLETION_INFORMATION MiniPacket\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n//\n// Time\n//\n\n/**\n * The NtQuerySystemTime routine obtains the current system time.\n *\n * @param SystemTime A pointer to a LARGE_INTEGER structure that receives the system time. This is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntquerysystemtime\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySystemTime(\n    _Out_ PLARGE_INTEGER SystemTime\n    );\n\n/**\n * The NtSetSystemTime routine sets the current system time and date. The system time is expressed in Coordinated Universal Time (UTC).\n *\n * @param SystemTime A pointer to a LARGE_INTEGER structure that that contains the new system date and time.\n * @param PreviousTime A pointer to a LARGE_INTEGER structure that that contains the previous system time.\n * @return NTSTATUS Successful or errant status.\n * @remarks The calling process must have the SE_SYSTEMTIME_NAME privilege.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-setsystemtime\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSystemTime(\n    _In_opt_ PLARGE_INTEGER SystemTime,\n    _Out_opt_ PLARGE_INTEGER PreviousTime\n    );\n\n/**\n * The NtQueryTimerResolution routine retrieves the range and current value of the system interrupt timer.\n *\n * @param MaximumTime The maximum timer resolution, in 100-nanosecond units.\n * @param MinimumTime The minimum timer resolution, in 100-nanosecond units.\n * @param CurrentTime The current timer resolution, in 100-nanosecond units.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryTimerResolution(\n    _Out_ PULONG MaximumTime,\n    _Out_ PULONG MinimumTime,\n    _Out_ PULONG CurrentTime\n    );\n\n/**\n * The NtSetTimerResolution routine sets the system interrupt timer resolution to the specified value.\n *\n * @param DesiredTime The desired timer resolution, in 100-nanosecond units.\n * @param SetResolution If TRUE, the timer resolution is set to the value specified by DesiredTime. If FALSE, the timer resolution is reset to the default value.\n * @param ActualTime The actual timer resolution, in 100-nanosecond units.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetTimerResolution(\n    _In_ ULONG DesiredTime,\n    _In_ BOOLEAN SetResolution,\n    _Out_ PULONG ActualTime\n    );\n\n//\n// Performance Counters\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryPerformanceCounter(\n    _Out_ PLARGE_INTEGER PerformanceCounter,\n    _Out_opt_ PLARGE_INTEGER PerformanceFrequency\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n// rev\n/**\n * The NtQueryAuxiliaryCounterFrequency routine queries the auxiliary counter frequency. (The auxiliary counter is generally the HPET hardware timer).\n *\n * @param AuxiliaryCounterFrequency A pointer to an output buffer that contains the specified auxiliary counter frequency. If the auxiliary counter is not supported, the value in the output buffer will be undefined.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/realtimeapiset/nf-realtimeapiset-queryauxiliarycounterfrequency\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryAuxiliaryCounterFrequency(\n    _Out_ PULONG64 AuxiliaryCounterFrequency\n    );\n\n// rev\n/**\n * The NtConvertBetweenAuxiliaryCounterAndPerformanceCounter routine converts the specified performance counter value to the corresponding auxiliary counter value;\n * optionally provides the estimated conversion error in nanoseconds due to latencies and maximum possible drift.\n *\n * @param ConvertAuxiliaryToPerformanceCounter  If TRUE, the value will be converted from AUX to QPC. If FALSE, the value will be converted from QPC to AUX.\n * @param PerformanceOrAuxiliaryCounterValue The performance counter value to convert.\n * @param ConvertedValue On success, contains the converted auxiliary counter value. Will be undefined if the function fails.\n * @param ConversionError On success, contains the estimated conversion error, in nanoseconds. Will be undefined if the function fails.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/realtimeapiset/nf-realtimeapiset-convertperformancecountertoauxiliarycounter\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtConvertBetweenAuxiliaryCounterAndPerformanceCounter(\n    _In_ BOOLEAN ConvertAuxiliaryToPerformanceCounter,\n    _In_ PULONG64 PerformanceOrAuxiliaryCounterValue,\n    _Out_ PULONG64 ConvertedValue,\n    _Out_opt_ PULONG64 ConversionError\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n\n//\n// LUIDs\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateLocallyUniqueId(\n    _Out_ PLUID Luid\n    );\n\n//\n// UUIDs\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetUuidSeed(\n    _In_ PCHAR Seed\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateUuids(\n    _Out_ PULARGE_INTEGER Time,\n    _Out_ PULONG Range,\n    _Out_ PULONG Sequence,\n    _Out_ PCHAR Seed\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// System Information\n//\n\n// rev\n// private\ntypedef enum _SYSTEM_INFORMATION_CLASS\n{\n    SystemBasicInformation, // q: SYSTEM_BASIC_INFORMATION\n    SystemProcessorInformation, // q: SYSTEM_PROCESSOR_INFORMATION\n    SystemPerformanceInformation, // q: SYSTEM_PERFORMANCE_INFORMATION\n    SystemTimeOfDayInformation, // q: SYSTEM_TIMEOFDAY_INFORMATION\n    SystemPathInformation, // not implemented\n    SystemProcessInformation, // q: SYSTEM_PROCESS_INFORMATION\n    SystemCallCountInformation, // q: SYSTEM_CALL_COUNT_INFORMATION\n    SystemDeviceInformation, // q: SYSTEM_DEVICE_INFORMATION\n    SystemProcessorPerformanceInformation, // q: SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION (EX in: USHORT ProcessorGroup)\n    SystemFlagsInformation, // q: SYSTEM_FLAGS_INFORMATION\n    SystemCallTimeInformation, // not implemented // SYSTEM_CALL_TIME_INFORMATION // 10\n    SystemModuleInformation, // q: RTL_PROCESS_MODULES\n    SystemLocksInformation, // q: RTL_PROCESS_LOCKS\n    SystemStackTraceInformation, // q: RTL_PROCESS_BACKTRACES\n    SystemPagedPoolInformation, // not implemented\n    SystemNonPagedPoolInformation, // not implemented\n    SystemHandleInformation, // q: SYSTEM_HANDLE_INFORMATION\n    SystemObjectInformation, // q: SYSTEM_OBJECTTYPE_INFORMATION mixed with SYSTEM_OBJECT_INFORMATION\n    SystemPageFileInformation, // q: SYSTEM_PAGEFILE_INFORMATION\n    SystemVdmInstemulInformation, // q: SYSTEM_VDM_INSTEMUL_INFO\n    SystemVdmBopInformation, // not implemented // 20\n    SystemFileCacheInformation, // q: SYSTEM_FILECACHE_INFORMATION; s (requires SeIncreaseQuotaPrivilege) (info for WorkingSetTypeSystemCache)\n    SystemPoolTagInformation, // q: SYSTEM_POOLTAG_INFORMATION\n    SystemInterruptInformation, // q: SYSTEM_INTERRUPT_INFORMATION (EX in: USHORT ProcessorGroup)\n    SystemDpcBehaviorInformation, // q: SYSTEM_DPC_BEHAVIOR_INFORMATION; s: SYSTEM_DPC_BEHAVIOR_INFORMATION (requires SeLoadDriverPrivilege)\n    SystemFullMemoryInformation, // not implemented // SYSTEM_MEMORY_USAGE_INFORMATION\n    SystemLoadGdiDriverInformation, // s (kernel-mode only)\n    SystemUnloadGdiDriverInformation, // s (kernel-mode only)\n    SystemTimeAdjustmentInformation, // q: SYSTEM_QUERY_TIME_ADJUST_INFORMATION; s: SYSTEM_SET_TIME_ADJUST_INFORMATION (requires SeSystemtimePrivilege)\n    SystemSummaryMemoryInformation, // not implemented // SYSTEM_MEMORY_USAGE_INFORMATION\n    SystemMirrorMemoryInformation, // s (requires license value \"Kernel-MemoryMirroringSupported\") (requires SeShutdownPrivilege) // 30\n    SystemPerformanceTraceInformation, // q; s: (type depends on EVENT_TRACE_INFORMATION_CLASS)\n    SystemObsolete0, // not implemented\n    SystemExceptionInformation, // q: SYSTEM_EXCEPTION_INFORMATION\n    SystemCrashDumpStateInformation, // s: SYSTEM_CRASH_DUMP_STATE_INFORMATION (requires SeDebugPrivilege)\n    SystemKernelDebuggerInformation, // q: SYSTEM_KERNEL_DEBUGGER_INFORMATION\n    SystemContextSwitchInformation, // q: SYSTEM_CONTEXT_SWITCH_INFORMATION\n    SystemRegistryQuotaInformation, // q: SYSTEM_REGISTRY_QUOTA_INFORMATION; s (requires SeIncreaseQuotaPrivilege)\n    SystemExtendServiceTableInformation, // s (requires SeLoadDriverPrivilege) // loads win32k only\n    SystemPrioritySeparation, // s (requires SeTcbPrivilege)\n    SystemVerifierAddDriverInformation, // s: UNICODE_STRING (requires SeDebugPrivilege) // 40\n    SystemVerifierRemoveDriverInformation, // s: UNICODE_STRING (requires SeDebugPrivilege)\n    SystemProcessorIdleInformation, // q: SYSTEM_PROCESSOR_IDLE_INFORMATION (EX in: USHORT ProcessorGroup)\n    SystemLegacyDriverInformation, // q: SYSTEM_LEGACY_DRIVER_INFORMATION\n    SystemCurrentTimeZoneInformation, // q; s: RTL_TIME_ZONE_INFORMATION\n    SystemLookasideInformation, // q: SYSTEM_LOOKASIDE_INFORMATION\n    SystemTimeSlipNotification, // s: HANDLE (NtCreateEvent) (requires SeSystemtimePrivilege)\n    SystemSessionCreate, // not implemented\n    SystemSessionDetach, // not implemented\n    SystemSessionInformation, // not implemented (SYSTEM_SESSION_INFORMATION)\n    SystemRangeStartInformation, // q: SYSTEM_RANGE_START_INFORMATION // 50\n    SystemVerifierInformation, // q: SYSTEM_VERIFIER_INFORMATION; s (requires SeDebugPrivilege)\n    SystemVerifierThunkExtend, // s (kernel-mode only)\n    SystemSessionProcessInformation, // q: SYSTEM_SESSION_PROCESS_INFORMATION\n    SystemLoadGdiDriverInSystemSpace, // s: SYSTEM_GDI_DRIVER_INFORMATION (kernel-mode only) (same as SystemLoadGdiDriverInformation)\n    SystemNumaProcessorMap, // q: SYSTEM_NUMA_INFORMATION\n    SystemPrefetcherInformation, // q; s: PREFETCHER_INFORMATION // PfSnQueryPrefetcherInformation\n    SystemExtendedProcessInformation, // q: SYSTEM_EXTENDED_PROCESS_INFORMATION\n    SystemRecommendedSharedDataAlignment, // q: ULONG // KeGetRecommendedSharedDataAlignment\n    SystemComPlusPackage, // q; s: ULONG\n    SystemNumaAvailableMemory, // q: SYSTEM_NUMA_INFORMATION // 60\n    SystemProcessorPowerInformation, // q: SYSTEM_PROCESSOR_POWER_INFORMATION (EX in: USHORT ProcessorGroup)\n    SystemEmulationBasicInformation, // q: SYSTEM_BASIC_INFORMATION\n    SystemEmulationProcessorInformation, // q: SYSTEM_PROCESSOR_INFORMATION\n    SystemExtendedHandleInformation, // q: SYSTEM_HANDLE_INFORMATION_EX\n    SystemLostDelayedWriteInformation, // q: ULONG\n    SystemBigPoolInformation, // q: SYSTEM_BIGPOOL_INFORMATION\n    SystemSessionPoolTagInformation, // q: SYSTEM_SESSION_POOLTAG_INFORMATION\n    SystemSessionMappedViewInformation, // q: SYSTEM_SESSION_MAPPED_VIEW_INFORMATION\n    SystemHotpatchInformation, // q; s: SYSTEM_HOTPATCH_CODE_INFORMATION\n    SystemObjectSecurityMode, // q: ULONG // 70\n    SystemWatchdogTimerHandler, // s: SYSTEM_WATCHDOG_HANDLER_INFORMATION // (kernel-mode only)\n    SystemWatchdogTimerInformation, // q: SYSTEM_WATCHDOG_TIMER_INFORMATION // NtQuerySystemInformationEx // (kernel-mode only)\n    SystemLogicalProcessorInformation, // q: SYSTEM_LOGICAL_PROCESSOR_INFORMATION (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx\n    SystemWow64SharedInformationObsolete, // not implemented\n    SystemRegisterFirmwareTableInformationHandler, // s: SYSTEM_FIRMWARE_TABLE_HANDLER // (kernel-mode only)\n    SystemFirmwareTableInformation, // SYSTEM_FIRMWARE_TABLE_INFORMATION\n    SystemModuleInformationEx, // q: RTL_PROCESS_MODULE_INFORMATION_EX // since VISTA\n    SystemVerifierTriageInformation, // not implemented\n    SystemSuperfetchInformation, // q; s: SUPERFETCH_INFORMATION // PfQuerySuperfetchInformation\n    SystemMemoryListInformation, // q: SYSTEM_MEMORY_LIST_INFORMATION; s: SYSTEM_MEMORY_LIST_COMMAND (requires SeProfileSingleProcessPrivilege) // 80\n    SystemFileCacheInformationEx, // q: SYSTEM_FILECACHE_INFORMATION; s (requires SeIncreaseQuotaPrivilege) (same as SystemFileCacheInformation)\n    SystemThreadPriorityClientIdInformation, // s: SYSTEM_THREAD_CID_PRIORITY_INFORMATION (requires SeIncreaseBasePriorityPrivilege) // NtQuerySystemInformationEx\n    SystemProcessorIdleCycleTimeInformation, // q: SYSTEM_PROCESSOR_IDLE_CYCLE_TIME_INFORMATION[] (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx\n    SystemVerifierCancellationInformation, // SYSTEM_VERIFIER_CANCELLATION_INFORMATION // name:wow64:whNT32QuerySystemVerifierCancellationInformation\n    SystemProcessorPowerInformationEx, // not implemented\n    SystemRefTraceInformation, // q; s: SYSTEM_REF_TRACE_INFORMATION // ObQueryRefTraceInformation\n    SystemSpecialPoolInformation, // q; s: SYSTEM_SPECIAL_POOL_INFORMATION (requires SeDebugPrivilege) // MmSpecialPoolTag, then MmSpecialPoolCatchOverruns != 0\n    SystemProcessIdInformation, // q: SYSTEM_PROCESS_ID_INFORMATION\n    SystemErrorPortInformation, // s (requires SeTcbPrivilege)\n    SystemBootEnvironmentInformation, // q: SYSTEM_BOOT_ENVIRONMENT_INFORMATION // 90\n    SystemHypervisorInformation, // q: SYSTEM_HYPERVISOR_QUERY_INFORMATION\n    SystemVerifierInformationEx, // q; s: SYSTEM_VERIFIER_INFORMATION_EX\n    SystemTimeZoneInformation, // q; s: RTL_TIME_ZONE_INFORMATION (requires SeTimeZonePrivilege)\n    SystemImageFileExecutionOptionsInformation, // s: SYSTEM_IMAGE_FILE_EXECUTION_OPTIONS_INFORMATION (requires SeTcbPrivilege)\n    SystemCoverageInformation, // q: COVERAGE_MODULES s: COVERAGE_MODULE_REQUEST // ExpCovQueryInformation (requires SeDebugPrivilege)\n    SystemPrefetchPatchInformation, // SYSTEM_PREFETCH_PATCH_INFORMATION\n    SystemVerifierFaultsInformation, // s: SYSTEM_VERIFIER_FAULTS_INFORMATION (requires SeDebugPrivilege)\n    SystemSystemPartitionInformation, // q: SYSTEM_SYSTEM_PARTITION_INFORMATION\n    SystemSystemDiskInformation, // q: SYSTEM_SYSTEM_DISK_INFORMATION\n    SystemProcessorPerformanceDistribution, // q: SYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx // 100\n    SystemNumaProximityNodeInformation, // q; s: SYSTEM_NUMA_PROXIMITY_MAP\n    SystemDynamicTimeZoneInformation, // q; s: RTL_DYNAMIC_TIME_ZONE_INFORMATION (requires SeTimeZonePrivilege)\n    SystemCodeIntegrityInformation, // q: SYSTEM_CODEINTEGRITY_INFORMATION // SeCodeIntegrityQueryInformation\n    SystemProcessorMicrocodeUpdateInformation, // s: SYSTEM_PROCESSOR_MICROCODE_UPDATE_INFORMATION\n    SystemProcessorBrandString, // q: CHAR[] // HaliQuerySystemInformation -> HalpGetProcessorBrandString, info class 23\n    SystemVirtualAddressInformation, // q: SYSTEM_VA_LIST_INFORMATION[]; s: SYSTEM_VA_LIST_INFORMATION[] (requires SeIncreaseQuotaPrivilege) // MmQuerySystemVaInformation\n    SystemLogicalProcessorAndGroupInformation, // q: SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX (EX in: LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType) // since WIN7 // NtQuerySystemInformationEx // KeQueryLogicalProcessorRelationship\n    SystemProcessorCycleTimeInformation, // q: SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION[] (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx\n    SystemStoreInformation, // q; s: SYSTEM_STORE_INFORMATION (requires SeProfileSingleProcessPrivilege) // SmQueryStoreInformation\n    SystemRegistryAppendString, // s: SYSTEM_REGISTRY_APPEND_STRING_PARAMETERS // 110\n    SystemAitSamplingValue, // s: ULONG (requires SeProfileSingleProcessPrivilege)\n    SystemVhdBootInformation, // q: SYSTEM_VHD_BOOT_INFORMATION\n    SystemCpuQuotaInformation, // q; s: PS_CPU_QUOTA_QUERY_INFORMATION\n    SystemNativeBasicInformation, // q: SYSTEM_BASIC_INFORMATION\n    SystemErrorPortTimeouts, // SYSTEM_ERROR_PORT_TIMEOUTS\n    SystemLowPriorityIoInformation, // q: SYSTEM_LOW_PRIORITY_IO_INFORMATION\n    SystemTpmBootEntropyInformation, // q: BOOT_ENTROPY_NT_RESULT // ExQueryBootEntropyInformation\n    SystemVerifierCountersInformation, // q: SYSTEM_VERIFIER_COUNTERS_INFORMATION\n    SystemPagedPoolInformationEx, // q: SYSTEM_FILECACHE_INFORMATION; s (requires SeIncreaseQuotaPrivilege) (info for WorkingSetTypePagedPool)\n    SystemSystemPtesInformationEx, // q: SYSTEM_FILECACHE_INFORMATION; s (requires SeIncreaseQuotaPrivilege) (info for WorkingSetTypeSystemPtes) // 120\n    SystemNodeDistanceInformation, // q: USHORT[4*NumaNodes] // (EX in: USHORT NodeNumber) // NtQuerySystemInformationEx\n    SystemAcpiAuditInformation, // q: SYSTEM_ACPI_AUDIT_INFORMATION // HaliQuerySystemInformation -> HalpAuditQueryResults, info class 26\n    SystemBasicPerformanceInformation, // q: SYSTEM_BASIC_PERFORMANCE_INFORMATION // name:wow64:whNtQuerySystemInformation_SystemBasicPerformanceInformation\n    SystemQueryPerformanceCounterInformation, // q: SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION // since WIN7 SP1\n    SystemSessionBigPoolInformation, // q: SYSTEM_SESSION_POOLTAG_INFORMATION // since WIN8\n    SystemBootGraphicsInformation, // q; s: SYSTEM_BOOT_GRAPHICS_INFORMATION (kernel-mode only)\n    SystemScrubPhysicalMemoryInformation, // q; s: MEMORY_SCRUB_INFORMATION\n    SystemBadPageInformation, // SYSTEM_BAD_PAGE_INFORMATION\n    SystemProcessorProfileControlArea, // q; s: SYSTEM_PROCESSOR_PROFILE_CONTROL_AREA\n    SystemCombinePhysicalMemoryInformation, // s: MEMORY_COMBINE_INFORMATION, MEMORY_COMBINE_INFORMATION_EX, MEMORY_COMBINE_INFORMATION_EX2 // 130\n    SystemEntropyInterruptTimingInformation, // q; s: SYSTEM_ENTROPY_TIMING_INFORMATION\n    SystemConsoleInformation, // q; s: SYSTEM_CONSOLE_INFORMATION\n    SystemPlatformBinaryInformation, // q: SYSTEM_PLATFORM_BINARY_INFORMATION (requires SeTcbPrivilege)\n    SystemPolicyInformation, // q: SYSTEM_POLICY_INFORMATION (Warbird/Encrypt/Decrypt/Execute)\n    SystemHypervisorProcessorCountInformation, // q: SYSTEM_HYPERVISOR_PROCESSOR_COUNT_INFORMATION\n    SystemDeviceDataInformation, // q: SYSTEM_DEVICE_DATA_INFORMATION\n    SystemDeviceDataEnumerationInformation, // q: SYSTEM_DEVICE_DATA_INFORMATION\n    SystemMemoryTopologyInformation, // q: SYSTEM_MEMORY_TOPOLOGY_INFORMATION\n    SystemMemoryChannelInformation, // q: SYSTEM_MEMORY_CHANNEL_INFORMATION\n    SystemBootLogoInformation, // q: SYSTEM_BOOT_LOGO_INFORMATION // 140\n    SystemProcessorPerformanceInformationEx, // q: SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_EX // (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx // since WINBLUE\n    SystemCriticalProcessErrorLogInformation, // CRITICAL_PROCESS_EXCEPTION_DATA\n    SystemSecureBootPolicyInformation, // q: SYSTEM_SECUREBOOT_POLICY_INFORMATION\n    SystemPageFileInformationEx, // q: SYSTEM_PAGEFILE_INFORMATION_EX\n    SystemSecureBootInformation, // q: SYSTEM_SECUREBOOT_INFORMATION\n    SystemEntropyInterruptTimingRawInformation, // q; s: SYSTEM_ENTROPY_TIMING_INFORMATION\n    SystemPortableWorkspaceEfiLauncherInformation, // q: SYSTEM_PORTABLE_WORKSPACE_EFI_LAUNCHER_INFORMATION\n    SystemFullProcessInformation, // q: SYSTEM_EXTENDED_PROCESS_INFORMATION with SYSTEM_PROCESS_INFORMATION_EXTENSION (requires admin)\n    SystemKernelDebuggerInformationEx, // q: SYSTEM_KERNEL_DEBUGGER_INFORMATION_EX\n    SystemBootMetadataInformation, // 150 // (requires SeTcbPrivilege)\n    SystemSoftRebootInformation, // q: ULONG\n    SystemElamCertificateInformation, // s: SYSTEM_ELAM_CERTIFICATE_INFORMATION\n    SystemOfflineDumpConfigInformation, // q: OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V2\n    SystemProcessorFeaturesInformation, // q: SYSTEM_PROCESSOR_FEATURES_INFORMATION\n    SystemRegistryReconciliationInformation, // s: NULL (requires admin) (flushes registry hives)\n    SystemEdidInformation, // q: SYSTEM_EDID_INFORMATION\n    SystemManufacturingInformation, // q: SYSTEM_MANUFACTURING_INFORMATION // since THRESHOLD\n    SystemEnergyEstimationConfigInformation, // q: SYSTEM_ENERGY_ESTIMATION_CONFIG_INFORMATION\n    SystemHypervisorDetailInformation, // q: SYSTEM_HYPERVISOR_DETAIL_INFORMATION\n    SystemProcessorCycleStatsInformation, // q: SYSTEM_PROCESSOR_CYCLE_STATS_INFORMATION (EX in: USHORT ProcessorGroup) // NtQuerySystemInformationEx // 160\n    SystemVmGenerationCountInformation,\n    SystemTrustedPlatformModuleInformation, // q: SYSTEM_TPM_INFORMATION\n    SystemKernelDebuggerFlags, // SYSTEM_KERNEL_DEBUGGER_FLAGS\n    SystemCodeIntegrityPolicyInformation, // q; s: SYSTEM_CODEINTEGRITYPOLICY_INFORMATION\n    SystemIsolatedUserModeInformation, // q: SYSTEM_ISOLATED_USER_MODE_INFORMATION\n    SystemHardwareSecurityTestInterfaceResultsInformation,\n    SystemSingleModuleInformation, // q: SYSTEM_SINGLE_MODULE_INFORMATION\n    SystemAllowedCpuSetsInformation, // s: SYSTEM_WORKLOAD_ALLOWED_CPU_SET_INFORMATION\n    SystemVsmProtectionInformation, // q: SYSTEM_VSM_PROTECTION_INFORMATION (previously SystemDmaProtectionInformation)\n    SystemInterruptCpuSetsInformation, // q: SYSTEM_INTERRUPT_CPU_SET_INFORMATION // 170\n    SystemSecureBootPolicyFullInformation, // q: SYSTEM_SECUREBOOT_POLICY_FULL_INFORMATION\n    SystemCodeIntegrityPolicyFullInformation,\n    SystemAffinitizedInterruptProcessorInformation, // q: KAFFINITY_EX // (requires SeIncreaseBasePriorityPrivilege)\n    SystemRootSiloInformation, // q: SYSTEM_ROOT_SILO_INFORMATION\n    SystemCpuSetInformation, // q: SYSTEM_CPU_SET_INFORMATION // since THRESHOLD2\n    SystemCpuSetTagInformation, // q: SYSTEM_CPU_SET_TAG_INFORMATION\n    SystemWin32WerStartCallout,\n    SystemSecureKernelProfileInformation, // q: SYSTEM_SECURE_KERNEL_HYPERGUARD_PROFILE_INFORMATION\n    SystemCodeIntegrityPlatformManifestInformation, // q: SYSTEM_SECUREBOOT_PLATFORM_MANIFEST_INFORMATION // NtQuerySystemInformationEx // since REDSTONE\n    SystemInterruptSteeringInformation, // q: in: SYSTEM_INTERRUPT_STEERING_INFORMATION_INPUT, out: SYSTEM_INTERRUPT_STEERING_INFORMATION_OUTPUT // NtQuerySystemInformationEx // 180\n    SystemSupportedProcessorArchitectures, // p: in opt: HANDLE, out: SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION[] // NtQuerySystemInformationEx\n    SystemMemoryUsageInformation, // q: SYSTEM_MEMORY_USAGE_INFORMATION\n    SystemCodeIntegrityCertificateInformation, // q: SYSTEM_CODEINTEGRITY_CERTIFICATE_INFORMATION\n    SystemPhysicalMemoryInformation, // q: SYSTEM_PHYSICAL_MEMORY_INFORMATION // since REDSTONE2\n    SystemControlFlowTransition, // (Warbird/Encrypt/Decrypt/Execute)\n    SystemKernelDebuggingAllowed, // s: ULONG\n    SystemActivityModerationExeState, // SYSTEM_ACTIVITY_MODERATION_EXE_STATE\n    SystemActivityModerationUserSettings, // SYSTEM_ACTIVITY_MODERATION_USER_SETTINGS\n    SystemCodeIntegrityPoliciesFullInformation, // NtQuerySystemInformationEx\n    SystemCodeIntegrityUnlockInformation, // SYSTEM_CODEINTEGRITY_UNLOCK_INFORMATION // 190\n    SystemIntegrityQuotaInformation,\n    SystemFlushInformation, // q: SYSTEM_FLUSH_INFORMATION\n    SystemProcessorIdleMaskInformation, // q: ULONG_PTR[ActiveGroupCount] // since REDSTONE3\n    SystemSecureDumpEncryptionInformation, // NtQuerySystemInformationEx\n    SystemWriteConstraintInformation, // SYSTEM_WRITE_CONSTRAINT_INFORMATION\n    SystemKernelVaShadowInformation, // SYSTEM_KERNEL_VA_SHADOW_INFORMATION\n    SystemHypervisorSharedPageInformation, // SYSTEM_HYPERVISOR_SHARED_PAGE_INFORMATION // since REDSTONE4\n    SystemFirmwareBootPerformanceInformation,\n    SystemCodeIntegrityVerificationInformation, // SYSTEM_CODEINTEGRITYVERIFICATION_INFORMATION\n    SystemFirmwarePartitionInformation, // SYSTEM_FIRMWARE_PARTITION_INFORMATION // 200\n    SystemSpeculationControlInformation, // SYSTEM_SPECULATION_CONTROL_INFORMATION // (CVE-2017-5715) REDSTONE3 and above.\n    SystemDmaGuardPolicyInformation, // SYSTEM_DMA_GUARD_POLICY_INFORMATION\n    SystemEnclaveLaunchControlInformation, // SYSTEM_ENCLAVE_LAUNCH_CONTROL_INFORMATION\n    SystemWorkloadAllowedCpuSetsInformation, // SYSTEM_WORKLOAD_ALLOWED_CPU_SET_INFORMATION // since REDSTONE5\n    SystemCodeIntegrityUnlockModeInformation, // SYSTEM_CODEINTEGRITY_UNLOCK_INFORMATION\n    SystemLeapSecondInformation, // SYSTEM_LEAP_SECOND_INFORMATION\n    SystemFlags2Information, // q: SYSTEM_FLAGS_INFORMATION\n    SystemSecurityModelInformation, // SYSTEM_SECURITY_MODEL_INFORMATION // since 19H1\n    SystemCodeIntegritySyntheticCacheInformation, // NtQuerySystemInformationEx\n    SystemFeatureConfigurationInformation, // q: in: SYSTEM_FEATURE_CONFIGURATION_QUERY, out: SYSTEM_FEATURE_CONFIGURATION_INFORMATION; s: SYSTEM_FEATURE_CONFIGURATION_UPDATE // NtQuerySystemInformationEx // since 20H1 // 210\n    SystemFeatureConfigurationSectionInformation, // q: in: SYSTEM_FEATURE_CONFIGURATION_SECTIONS_REQUEST, out: SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION // NtQuerySystemInformationEx\n    SystemFeatureUsageSubscriptionInformation, // q: SYSTEM_FEATURE_USAGE_SUBSCRIPTION_DETAILS; s: SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE\n    SystemSecureSpeculationControlInformation, // SECURE_SPECULATION_CONTROL_INFORMATION\n    SystemSpacesBootInformation, // since 20H2\n    SystemFwRamdiskInformation, // SYSTEM_FIRMWARE_RAMDISK_INFORMATION\n    SystemWheaIpmiHardwareInformation,\n    SystemDifSetRuleClassInformation, // SYSTEM_DIF_VOLATILE_INFORMATION\n    SystemDifClearRuleClassInformation,\n    SystemDifApplyPluginVerificationOnDriver, // SYSTEM_DIF_PLUGIN_DRIVER_INFORMATION\n    SystemDifRemovePluginVerificationOnDriver, // SYSTEM_DIF_PLUGIN_DRIVER_INFORMATION // 220\n    SystemShadowStackInformation, // SYSTEM_SHADOW_STACK_INFORMATION\n    SystemBuildVersionInformation, // q: in: ULONG (LayerNumber), out: SYSTEM_BUILD_VERSION_INFORMATION // NtQuerySystemInformationEx // 222\n    SystemPoolLimitInformation, // SYSTEM_POOL_LIMIT_INFORMATION (requires SeIncreaseQuotaPrivilege) // NtQuerySystemInformationEx\n    SystemCodeIntegrityAddDynamicStore,\n    SystemCodeIntegrityClearDynamicStores,\n    SystemDifPoolTrackingInformation,\n    SystemPoolZeroingInformation, // q: SYSTEM_POOL_ZEROING_INFORMATION\n    SystemDpcWatchdogInformation, // q; s: SYSTEM_DPC_WATCHDOG_CONFIGURATION_INFORMATION\n    SystemDpcWatchdogInformation2, // q; s: SYSTEM_DPC_WATCHDOG_CONFIGURATION_INFORMATION_V2\n    SystemSupportedProcessorArchitectures2, // q: in opt: HANDLE, out: SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION[] // NtQuerySystemInformationEx // 230\n    SystemSingleProcessorRelationshipInformation, // q: SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX // (EX in: PROCESSOR_NUMBER Processor) // NtQuerySystemInformationEx\n    SystemXfgCheckFailureInformation, // q: SYSTEM_XFG_FAILURE_INFORMATION\n    SystemIommuStateInformation, // SYSTEM_IOMMU_STATE_INFORMATION // since 22H1\n    SystemHypervisorMinrootInformation, // SYSTEM_HYPERVISOR_MINROOT_INFORMATION\n    SystemHypervisorBootPagesInformation, // SYSTEM_HYPERVISOR_BOOT_PAGES_INFORMATION\n    SystemPointerAuthInformation, // SYSTEM_POINTER_AUTH_INFORMATION\n    SystemSecureKernelDebuggerInformation, // NtQuerySystemInformationEx\n    SystemOriginalImageFeatureInformation, // q: in: SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_INPUT, out: SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_OUTPUT // NtQuerySystemInformationEx\n    SystemMemoryNumaInformation, // SYSTEM_MEMORY_NUMA_INFORMATION_INPUT, SYSTEM_MEMORY_NUMA_INFORMATION_OUTPUT // NtQuerySystemInformationEx\n    SystemMemoryNumaPerformanceInformation, // SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_INPUTSYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_INPUT, SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_OUTPUT // since 24H2 // 240\n    SystemCodeIntegritySignedPoliciesFullInformation,\n    SystemSecureCoreInformation, // SystemSecureSecretsInformation\n    SystemTrustedAppsRuntimeInformation, // SYSTEM_TRUSTEDAPPS_RUNTIME_INFORMATION\n    SystemBadPageInformationEx, // SYSTEM_BAD_PAGE_INFORMATION\n    SystemResourceDeadlockTimeout, // ULONG\n    SystemBreakOnContextUnwindFailureInformation, // ULONG (requires SeDebugPrivilege)\n    SystemOslRamdiskInformation, // SYSTEM_OSL_RAMDISK_INFORMATION\n    SystemCodeIntegrityPolicyManagementInformation, // since 25H2\n    SystemMemoryNumaCacheInformation,\n    SystemProcessorFeaturesBitMapInformation,\n    MaxSystemInfoClass\n} SYSTEM_INFORMATION_CLASS;\n\ntypedef struct _SYSTEM_BASIC_INFORMATION\n{\n    ULONG Reserved;\n    ULONG TimerResolution;\n    ULONG PageSize;\n    ULONG NumberOfPhysicalPages;\n    ULONG LowestPhysicalPageNumber;\n    ULONG HighestPhysicalPageNumber;\n    ULONG AllocationGranularity;\n    ULONG_PTR MinimumUserModeAddress;\n    ULONG_PTR MaximumUserModeAddress;\n    KAFFINITY ActiveProcessorsAffinityMask;\n    CCHAR NumberOfProcessors;\n} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;\n\n// SYSTEM_PROCESSOR_INFORMATION // ProcessorFeatureBits (see also SYSTEM_PROCESSOR_FEATURES_INFORMATION)\n#define KF_V86_VIS 0x00000001\n#define KF_RDTSC 0x00000002 // Indicates support for the RDTSC instruction.\n#define KF_CR4 0x00000004 // Indicates support for the CR4 register.\n#define KF_CMOV 0x00000008\n#define KF_GLOBAL_PAGE 0x00000010 // Indicates support for global pages.\n#define KF_LARGE_PAGE 0x00000020 // Indicates support for large pages.\n#define KF_MTRR 0x00000040\n#define KF_CMPXCHG8B 0x00000080 // Indicates support for the CMPXCHG8B instruction.\n#define KF_MMX 0x00000100\n#define KF_WORKING_PTE 0x00000200\n#define KF_PAT 0x00000400\n#define KF_FXSR 0x00000800\n#define KF_FAST_SYSCALL 0x00001000 // Indicates support for fast system calls.\n#define KF_XMMI 0x00002000\n#define KF_3DNOW 0x00004000\n#define KF_AMDK6MTRR 0x00008000\n#define KF_XMMI64 0x00010000\n#define KF_DTS 0x00020000\n#define KF_NOEXECUTE 0x20000000\n#define KF_GLOBAL_32BIT_EXECUTE 0x40000000\n#define KF_GLOBAL_32BIT_NOEXECUTE 0x80000000\n\ntypedef struct _SYSTEM_PROCESSOR_INFORMATION\n{\n    USHORT ProcessorArchitecture;\n    USHORT ProcessorLevel;\n    USHORT ProcessorRevision;\n    USHORT MaximumProcessors;\n    ULONG ProcessorFeatureBits;\n} SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION;\n\ntypedef struct _SYSTEM_PERFORMANCE_INFORMATION\n{\n    LARGE_INTEGER IdleProcessTime;\n    LARGE_INTEGER IoReadTransferCount;\n    LARGE_INTEGER IoWriteTransferCount;\n    LARGE_INTEGER IoOtherTransferCount;\n    ULONG IoReadOperationCount;\n    ULONG IoWriteOperationCount;\n    ULONG IoOtherOperationCount;\n    ULONG AvailablePages;\n    ULONG CommittedPages;\n    ULONG CommitLimit;\n    ULONG PeakCommitment;\n    ULONG PageFaultCount;\n    ULONG CopyOnWriteCount;\n    ULONG TransitionCount;\n    ULONG CacheTransitionCount;\n    ULONG DemandZeroCount;\n    ULONG PageReadCount;\n    ULONG PageReadIoCount;\n    ULONG CacheReadCount;\n    ULONG CacheIoCount;\n    ULONG DirtyPagesWriteCount;\n    ULONG DirtyWriteIoCount;\n    ULONG MappedPagesWriteCount;\n    ULONG MappedWriteIoCount;\n    ULONG PagedPoolPages;\n    ULONG NonPagedPoolPages;\n    ULONG PagedPoolAllocs;\n    ULONG PagedPoolFrees;\n    ULONG NonPagedPoolAllocs;\n    ULONG NonPagedPoolFrees;\n    ULONG FreeSystemPtes;\n    ULONG ResidentSystemCodePage;\n    ULONG TotalSystemDriverPages;\n    ULONG TotalSystemCodePages;\n    ULONG NonPagedPoolLookasideHits;\n    ULONG PagedPoolLookasideHits;\n    ULONG AvailablePagedPoolPages;\n    ULONG ResidentSystemCachePage;\n    ULONG ResidentPagedPoolPage;\n    ULONG ResidentSystemDriverPage;\n    ULONG CcFastReadNoWait;\n    ULONG CcFastReadWait;\n    ULONG CcFastReadResourceMiss;\n    ULONG CcFastReadNotPossible;\n    ULONG CcFastMdlReadNoWait;\n    ULONG CcFastMdlReadWait;\n    ULONG CcFastMdlReadResourceMiss;\n    ULONG CcFastMdlReadNotPossible;\n    ULONG CcMapDataNoWait;\n    ULONG CcMapDataWait;\n    ULONG CcMapDataNoWaitMiss;\n    ULONG CcMapDataWaitMiss;\n    ULONG CcPinMappedDataCount;\n    ULONG CcPinReadNoWait;\n    ULONG CcPinReadWait;\n    ULONG CcPinReadNoWaitMiss;\n    ULONG CcPinReadWaitMiss;\n    ULONG CcCopyReadNoWait;\n    ULONG CcCopyReadWait;\n    ULONG CcCopyReadNoWaitMiss;\n    ULONG CcCopyReadWaitMiss;\n    ULONG CcMdlReadNoWait;\n    ULONG CcMdlReadWait;\n    ULONG CcMdlReadNoWaitMiss;\n    ULONG CcMdlReadWaitMiss;\n    ULONG CcReadAheadIos;\n    ULONG CcLazyWriteIos;\n    ULONG CcLazyWritePages;\n    ULONG CcDataFlushes;\n    ULONG CcDataPages;\n    ULONG ContextSwitches;\n    ULONG FirstLevelTbFills;\n    ULONG SecondLevelTbFills;\n    ULONG SystemCalls;\n    ULONGLONG CcTotalDirtyPages; // since THRESHOLD\n    ULONGLONG CcDirtyPageThreshold;\n    LONGLONG ResidentAvailablePages;\n    ULONGLONG SharedCommittedPages;\n    ULONGLONG MdlPagesAllocated; // since 24H2\n    ULONGLONG PfnDatabaseCommittedPages;\n    ULONGLONG SystemPageTableCommittedPages;\n    ULONGLONG ContiguousPagesAllocated;\n} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;\n\ntypedef struct _SYSTEM_TIMEOFDAY_INFORMATION\n{\n    LARGE_INTEGER BootTime;\n    LARGE_INTEGER CurrentTime;\n    LARGE_INTEGER TimeZoneBias;\n    ULONG TimeZoneId;\n    ULONG Reserved;\n    ULONGLONG BootTimeBias;\n    ULONGLONG SleepTimeBias;\n} SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;\n\n/**\n * The SYSTEM_THREAD_INFORMATION structure contains information about a thread running on a system.\n * https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-tsts/e82d73e4-cedb-4077-9099-d58f3459722f\n */\ntypedef struct _SYSTEM_THREAD_INFORMATION\n{\n    LARGE_INTEGER KernelTime;       // Number of 100-nanosecond intervals spent executing kernel code.\n    LARGE_INTEGER UserTime;         // Number of 100-nanosecond intervals spent executing user code.\n    LARGE_INTEGER CreateTime;       // System time when the thread was created.\n    ULONG WaitTime;                 // Time spent in ready queue or waiting (depending on the thread state).\n    PVOID StartAddress;             // Start address of the thread.\n    CLIENT_ID ClientId;             // ID of the thread and the process owning the thread.\n    KPRIORITY Priority;             // Dynamic thread priority.\n    KPRIORITY BasePriority;         // Base thread priority.\n    ULONG ContextSwitches;          // Total context switches.\n    KTHREAD_STATE ThreadState;      // Current thread state.\n    KWAIT_REASON WaitReason;        // The reason the thread is waiting.\n} SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;\n\ntypedef struct _SYSTEM_PROCESS_INFORMATION\n{\n    ULONG NextEntryOffset;                  // The address of the previous item plus the value in the NextEntryOffset member. For the last item in the array, NextEntryOffset is 0.\n    ULONG NumberOfThreads;                  // The NumberOfThreads member contains the number of threads in the process.\n    ULONGLONG WorkingSetPrivateSize;        // since VISTA\n    ULONG HardFaultCount;                   // since WIN7\n    ULONG NumberOfThreadsHighWatermark;     // The peak number of threads that were running at any given point in time, indicative of potential performance bottlenecks related to thread management.\n    ULONGLONG CycleTime;                    // The sum of the cycle time of all threads in the process.\n    LARGE_INTEGER CreateTime;               // Number of 100-nanosecond intervals since the creation time of the process. Not updated during system timezone changes.\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER KernelTime;\n    UNICODE_STRING ImageName;               // The file name of the executable image.\n    KPRIORITY BasePriority;\n    HANDLE UniqueProcessId;\n    HANDLE InheritedFromUniqueProcessId;\n    ULONG HandleCount;\n    ULONG SessionId;\n    ULONG_PTR UniqueProcessKey;             // since VISTA (requires SystemExtendedProcessInformation)\n    SIZE_T PeakVirtualSize;                 // The peak size, in bytes, of the virtual memory used by the process.\n    SIZE_T VirtualSize;                     // The current size, in bytes, of virtual memory used by the process.\n    ULONG PageFaultCount;                   // The member of page faults for data that is not currently in memory. \n    SIZE_T PeakWorkingSetSize;              // The peak size, in kilobytes, of the working set of the process.\n    SIZE_T WorkingSetSize;                  // The number of pages visible to the process in physical memory. These pages are resident and available for use without triggering a page fault.\n    SIZE_T QuotaPeakPagedPoolUsage;         // The peak quota charged to the process for pool usage, in bytes.\n    SIZE_T QuotaPagedPoolUsage;             // The quota charged to the process for paged pool usage, in bytes.\n    SIZE_T QuotaPeakNonPagedPoolUsage;      // The peak quota charged to the process for nonpaged pool usage, in bytes.\n    SIZE_T QuotaNonPagedPoolUsage;          // The current quota charged to the process for nonpaged pool usage.\n    SIZE_T PagefileUsage;                   // The PagefileUsage member contains the number of bytes of page file storage in use by the process.\n    SIZE_T PeakPagefileUsage;               // The maximum number of bytes of page-file storage used by the process.\n    SIZE_T PrivatePageCount;                // The number of memory pages allocated for the use by the process.\n    LARGE_INTEGER ReadOperationCount;       // The total number of read operations performed.\n    LARGE_INTEGER WriteOperationCount;      // The total number of write operations performed.\n    LARGE_INTEGER OtherOperationCount;      // The total number of I/O operations performed other than read and write operations.\n    LARGE_INTEGER ReadTransferCount;        // The total number of bytes read during a read operation.\n    LARGE_INTEGER WriteTransferCount;       // The total number of bytes written during a write operation.\n    LARGE_INTEGER OtherTransferCount;       // The total number of bytes transferred during operations other than read and write operations.\n    SYSTEM_THREAD_INFORMATION Threads[1];   // This type is not defined in the structure but was added for convenience.\n} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_EXTENDED_THREAD_INFORMATION\n{\n    union\n    {\n        SYSTEM_THREAD_INFORMATION ThreadInfo;\n        struct\n        {\n            ULONGLONG KernelTime;\n            ULONGLONG UserTime;\n            ULONGLONG CreateTime;\n            ULONG WaitTime;\n            PVOID StartAddress;\n            CLIENT_ID ClientId;\n            KPRIORITY Priority;\n            KPRIORITY BasePriority;\n            ULONG ContextSwitches;\n            KTHREAD_STATE ThreadState;\n            KWAIT_REASON WaitReason;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    ULONG_PTR StackBase;\n    ULONG_PTR StackLimit;\n    PVOID Win32StartAddress;\n    PVOID TebBase; // since VISTA\n    ULONG_PTR Reserved2;\n    ULONG_PTR Reserved3;\n    ULONG_PTR Reserved4;\n} SYSTEM_EXTENDED_THREAD_INFORMATION, *PSYSTEM_EXTENDED_THREAD_INFORMATION;\n\ntypedef struct _SYSTEM_EXTENDED_PROCESS_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG NumberOfThreads;\n    ULONGLONG WorkingSetPrivateSize; // since VISTA\n    ULONG HardFaultCount; // since WIN7\n    ULONG NumberOfThreadsHighWatermark;\n    ULONGLONG CycleTime;\n    ULONGLONG CreateTime;\n    ULONGLONG UserTime;\n    ULONGLONG KernelTime;\n    UNICODE_STRING ImageName;\n    KPRIORITY BasePriority;\n    HANDLE UniqueProcessId;\n    HANDLE InheritedFromUniqueProcessId;\n    ULONG HandleCount;\n    ULONG SessionId;\n    HANDLE UniqueProcessKey; // since VISTA\n    SIZE_T PeakVirtualSize;\n    SIZE_T VirtualSize;\n    ULONG PageFaultCount;\n    SIZE_T PeakWorkingSetSize;\n    SIZE_T WorkingSetSize;\n    SIZE_T QuotaPeakPagedPoolUsage;\n    SIZE_T QuotaPagedPoolUsage;\n    SIZE_T QuotaPeakNonPagedPoolUsage;\n    SIZE_T QuotaNonPagedPoolUsage;\n    SIZE_T PagefileUsage;\n    SIZE_T PeakPagefileUsage;\n    SIZE_T PrivatePageCount;\n    ULONGLONG ReadOperationCount;\n    ULONGLONG WriteOperationCount;\n    ULONGLONG OtherOperationCount;\n    ULONGLONG ReadTransferCount;\n    ULONGLONG WriteTransferCount;\n    ULONGLONG OtherTransferCount;\n    SYSTEM_EXTENDED_THREAD_INFORMATION Threads[1];\n    // SYSTEM_PROCESS_INFORMATION_EXTENSION // SystemFullProcessInformation\n} SYSTEM_EXTENDED_PROCESS_INFORMATION, *PSYSTEM_EXTENDED_PROCESS_INFORMATION;\n\ntypedef struct _SYSTEM_CALL_COUNT_INFORMATION\n{\n    ULONG Length;\n    ULONG NumberOfTables;\n} SYSTEM_CALL_COUNT_INFORMATION, *PSYSTEM_CALL_COUNT_INFORMATION;\n\ntypedef struct _SYSTEM_DEVICE_INFORMATION\n{\n    ULONG NumberOfDisks;\n    ULONG NumberOfFloppies;\n    ULONG NumberOfCdRoms;\n    ULONG NumberOfTapes;\n    ULONG NumberOfSerialPorts;\n    ULONG NumberOfParallelPorts;\n} SYSTEM_DEVICE_INFORMATION, *PSYSTEM_DEVICE_INFORMATION;\n\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION\n{\n    LARGE_INTEGER IdleTime;\n    LARGE_INTEGER KernelTime;\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER DpcTime;\n    LARGE_INTEGER InterruptTime;\n    ULONG InterruptCount;\n} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;\n\ntypedef struct _SYSTEM_FLAGS_INFORMATION\n{\n    union\n    {\n        ULONG Flags; // NtGlobalFlag\n        struct\n        {\n            ULONG StopOnException : 1;          // FLG_STOP_ON_EXCEPTION\n            ULONG ShowLoaderSnaps : 1;          // FLG_SHOW_LDR_SNAPS\n            ULONG DebugInitialCommand : 1;      // FLG_DEBUG_INITIAL_COMMAND\n            ULONG StopOnHungGUI : 1;            // FLG_STOP_ON_HUNG_GUI\n            ULONG HeapEnableTailCheck : 1;      // FLG_HEAP_ENABLE_TAIL_CHECK\n            ULONG HeapEnableFreeCheck : 1;      // FLG_HEAP_ENABLE_FREE_CHECK\n            ULONG HeapValidateParameters : 1;   // FLG_HEAP_VALIDATE_PARAMETERS\n            ULONG HeapValidateAll : 1;          // FLG_HEAP_VALIDATE_ALL\n            ULONG ApplicationVerifier : 1;      // FLG_APPLICATION_VERIFIER\n            ULONG MonitorSilentProcessExit : 1; // FLG_MONITOR_SILENT_PROCESS_EXIT\n            ULONG PoolEnableTagging : 1;        // FLG_POOL_ENABLE_TAGGING\n            ULONG HeapEnableTagging : 1;        // FLG_HEAP_ENABLE_TAGGING\n            ULONG UserStackTraceDb : 1;         // FLG_USER_STACK_TRACE_DB\n            ULONG KernelStackTraceDb : 1;       // FLG_KERNEL_STACK_TRACE_DB\n            ULONG MaintainObjectTypeList : 1;   // FLG_MAINTAIN_OBJECT_TYPELIST\n            ULONG HeapEnableTagByDll : 1;       // FLG_HEAP_ENABLE_TAG_BY_DLL\n            ULONG DisableStackExtension : 1;    // FLG_DISABLE_STACK_EXTENSION\n            ULONG EnableCsrDebug : 1;           // FLG_ENABLE_CSRDEBUG\n            ULONG EnableKDebugSymbolLoad : 1;   // FLG_ENABLE_KDEBUG_SYMBOL_LOAD\n            ULONG DisablePageKernelStacks : 1;  // FLG_DISABLE_PAGE_KERNEL_STACKS\n            ULONG EnableSystemCritBreaks : 1;   // FLG_ENABLE_SYSTEM_CRIT_BREAKS\n            ULONG HeapDisableCoalescing : 1;    // FLG_HEAP_DISABLE_COALESCING\n            ULONG EnableCloseExceptions : 1;    // FLG_ENABLE_CLOSE_EXCEPTIONS\n            ULONG EnableExceptionLogging : 1;   // FLG_ENABLE_EXCEPTION_LOGGING\n            ULONG EnableHandleTypeTagging : 1;  // FLG_ENABLE_HANDLE_TYPE_TAGGING\n            ULONG HeapPageAllocs : 1;           // FLG_HEAP_PAGE_ALLOCS\n            ULONG DebugInitialCommandEx : 1;    // FLG_DEBUG_INITIAL_COMMAND_EX\n            ULONG DisableDbgPrint : 1;          // FLG_DISABLE_DBGPRINT\n            ULONG CritSecEventCreation : 1;     // FLG_CRITSEC_EVENT_CREATION\n            ULONG LdrTopDown : 1;               // FLG_LDR_TOP_DOWN\n            ULONG EnableHandleExceptions : 1;   // FLG_ENABLE_HANDLE_EXCEPTIONS\n            ULONG DisableProtDlls : 1;          // FLG_DISABLE_PROTDLLS\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} SYSTEM_FLAGS_INFORMATION, *PSYSTEM_FLAGS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_CALL_TIME_INFORMATION\n{\n    ULONG Length;\n    ULONG TotalCalls;\n    LARGE_INTEGER TimeOfCalls[1];\n} SYSTEM_CALL_TIME_INFORMATION, *PSYSTEM_CALL_TIME_INFORMATION;\n\n// private\ntypedef struct _RTL_PROCESS_LOCK_INFORMATION\n{\n    PVOID Address;\n    USHORT Type;\n    USHORT CreatorBackTraceIndex;\n    HANDLE OwningThread;\n    LONG LockCount;\n    ULONG ContentionCount;\n    ULONG EntryCount;\n    LONG RecursionCount;\n    ULONG NumberOfWaitingShared;\n    ULONG NumberOfWaitingExclusive;\n} RTL_PROCESS_LOCK_INFORMATION, *PRTL_PROCESS_LOCK_INFORMATION;\n\n// private\ntypedef struct _RTL_PROCESS_LOCKS\n{\n    ULONG NumberOfLocks;\n    _Field_size_(NumberOfLocks) RTL_PROCESS_LOCK_INFORMATION Locks[1];\n} RTL_PROCESS_LOCKS, *PRTL_PROCESS_LOCKS;\n\n// private\ntypedef struct _RTL_PROCESS_BACKTRACE_INFORMATION\n{\n    PCHAR SymbolicBackTrace;\n    ULONG TraceCount;\n    USHORT Index;\n    USHORT Depth;\n    PVOID BackTrace[32];\n} RTL_PROCESS_BACKTRACE_INFORMATION, *PRTL_PROCESS_BACKTRACE_INFORMATION;\n\n// private\ntypedef struct _RTL_PROCESS_BACKTRACES\n{\n    ULONG CommittedMemory;\n    ULONG ReservedMemory;\n    ULONG NumberOfBackTraceLookups;\n    ULONG NumberOfBackTraces;\n    _Field_size_(NumberOfBackTraces) RTL_PROCESS_BACKTRACE_INFORMATION BackTraces[1];\n} RTL_PROCESS_BACKTRACES, *PRTL_PROCESS_BACKTRACES;\n\ntypedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO\n{\n    USHORT UniqueProcessId;\n    USHORT CreatorBackTraceIndex;\n    UCHAR ObjectTypeIndex;\n    UCHAR HandleAttributes;\n    USHORT HandleValue;\n    PVOID Object;\n    ACCESS_MASK GrantedAccess;\n} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION\n{\n    ULONG NumberOfHandles;\n    _Field_size_(NumberOfHandles) SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];\n} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;\n\ntypedef struct _SYSTEM_OBJECTTYPE_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG NumberOfObjects;\n    ULONG NumberOfHandles;\n    ULONG TypeIndex;\n    ULONG InvalidAttributes;\n    GENERIC_MAPPING GenericMapping;\n    ACCESS_MASK ValidAccessMask;\n    ULONG PoolType;\n    BOOLEAN SecurityRequired;\n    BOOLEAN WaitableObject;\n    UNICODE_STRING TypeName;\n} SYSTEM_OBJECTTYPE_INFORMATION, *PSYSTEM_OBJECTTYPE_INFORMATION;\n\ntypedef struct _SYSTEM_OBJECT_INFORMATION\n{\n    ULONG NextEntryOffset;\n    PVOID Object;\n    HANDLE CreatorUniqueProcess;\n    USHORT CreatorBackTraceIndex;\n    USHORT Flags;\n    LONG PointerCount;\n    LONG HandleCount;\n    ULONG PagedPoolCharge;\n    ULONG NonPagedPoolCharge;\n    HANDLE ExclusiveProcessId;\n    PVOID SecurityDescriptor;\n    UNICODE_STRING NameInfo;\n} SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION;\n\ntypedef struct _SYSTEM_PAGEFILE_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG TotalSize;\n    ULONG TotalInUse;\n    ULONG PeakUsage;\n    UNICODE_STRING PageFileName;\n} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;\n\ntypedef struct _SYSTEM_VDM_INSTEMUL_INFO\n{\n    ULONG SegmentNotPresent;\n    ULONG VdmOpcode0F;\n    ULONG OpcodeESPrefix;\n    ULONG OpcodeCSPrefix;\n    ULONG OpcodeSSPrefix;\n    ULONG OpcodeDSPrefix;\n    ULONG OpcodeFSPrefix;\n    ULONG OpcodeGSPrefix;\n    ULONG OpcodeOPER32Prefix;\n    ULONG OpcodeADDR32Prefix;\n    ULONG OpcodeINSB;\n    ULONG OpcodeINSW;\n    ULONG OpcodeOUTSB;\n    ULONG OpcodeOUTSW;\n    ULONG OpcodePUSHF;\n    ULONG OpcodePOPF;\n    ULONG OpcodeINTnn;\n    ULONG OpcodeINTO;\n    ULONG OpcodeIRET;\n    ULONG OpcodeINBimm;\n    ULONG OpcodeINWimm;\n    ULONG OpcodeOUTBimm;\n    ULONG OpcodeOUTWimm;\n    ULONG OpcodeINB;\n    ULONG OpcodeINW;\n    ULONG OpcodeOUTB;\n    ULONG OpcodeOUTW;\n    ULONG OpcodeLOCKPrefix;\n    ULONG OpcodeREPNEPrefix;\n    ULONG OpcodeREPPrefix;\n    ULONG OpcodeHLT;\n    ULONG OpcodeCLI;\n    ULONG OpcodeSTI;\n    ULONG BopCount;\n} SYSTEM_VDM_INSTEMUL_INFO, *PSYSTEM_VDM_INSTEMUL_INFO;\n\n#define MM_WORKING_SET_MAX_HARD_ENABLE 0x1\n#define MM_WORKING_SET_MAX_HARD_DISABLE 0x2\n#define MM_WORKING_SET_MIN_HARD_ENABLE 0x4\n#define MM_WORKING_SET_MIN_HARD_DISABLE 0x8\n\ntypedef struct _SYSTEM_FILECACHE_INFORMATION\n{\n    SIZE_T CurrentSize;\n    SIZE_T PeakSize;\n    ULONG PageFaultCount;\n    SIZE_T MinimumWorkingSet;\n    SIZE_T MaximumWorkingSet;\n    SIZE_T CurrentSizeIncludingTransitionInPages;\n    SIZE_T PeakSizeIncludingTransitionInPages;\n    ULONG TransitionRePurposeCount;\n    ULONG Flags;\n} SYSTEM_FILECACHE_INFORMATION, *PSYSTEM_FILECACHE_INFORMATION;\n\n// Can be used instead of SYSTEM_FILECACHE_INFORMATION\ntypedef struct _SYSTEM_BASIC_WORKING_SET_INFORMATION\n{\n    SIZE_T CurrentSize;\n    SIZE_T PeakSize;\n    ULONG PageFaultCount;\n} SYSTEM_BASIC_WORKING_SET_INFORMATION, *PSYSTEM_BASIC_WORKING_SET_INFORMATION;\n\ntypedef struct _SYSTEM_POOLTAG\n{\n    union\n    {\n        UCHAR Tag[4];\n        ULONG TagUlong;\n    } DUMMYUNIONNAME;\n    ULONG PagedAllocs;\n    ULONG PagedFrees;\n    SIZE_T PagedUsed;\n    ULONG NonPagedAllocs;\n    ULONG NonPagedFrees;\n    SIZE_T NonPagedUsed;\n} SYSTEM_POOLTAG, *PSYSTEM_POOLTAG;\n\ntypedef struct _SYSTEM_POOLTAG_INFORMATION\n{\n    ULONG Count;\n    _Field_size_(Count) SYSTEM_POOLTAG TagInfo[1];\n} SYSTEM_POOLTAG_INFORMATION, *PSYSTEM_POOLTAG_INFORMATION;\n\ntypedef struct _SYSTEM_INTERRUPT_INFORMATION\n{\n    ULONG ContextSwitches;\n    ULONG DpcCount;\n    ULONG DpcRate;\n    ULONG TimeIncrement;\n    ULONG DpcBypassCount;\n    ULONG ApcBypassCount;\n} SYSTEM_INTERRUPT_INFORMATION, *PSYSTEM_INTERRUPT_INFORMATION;\n\ntypedef struct _SYSTEM_DPC_BEHAVIOR_INFORMATION\n{\n    ULONG Spare;\n    ULONG DpcQueueDepth;\n    ULONG MinimumDpcRate;\n    ULONG AdjustDpcThreshold;\n    ULONG IdealDpcRate;\n} SYSTEM_DPC_BEHAVIOR_INFORMATION, *PSYSTEM_DPC_BEHAVIOR_INFORMATION;\n\ntypedef struct _SYSTEM_QUERY_TIME_ADJUST_INFORMATION\n{\n    ULONG TimeAdjustment;\n    ULONG TimeIncrement;\n    BOOLEAN Enable;\n} SYSTEM_QUERY_TIME_ADJUST_INFORMATION, *PSYSTEM_QUERY_TIME_ADJUST_INFORMATION;\n\ntypedef struct _SYSTEM_QUERY_TIME_ADJUST_INFORMATION_PRECISE\n{\n    ULONGLONG TimeAdjustment;\n    ULONGLONG TimeIncrement;\n    BOOLEAN Enable;\n} SYSTEM_QUERY_TIME_ADJUST_INFORMATION_PRECISE, *PSYSTEM_QUERY_TIME_ADJUST_INFORMATION_PRECISE;\n\ntypedef struct _SYSTEM_SET_TIME_ADJUST_INFORMATION\n{\n    ULONG TimeAdjustment;\n    BOOLEAN Enable;\n} SYSTEM_SET_TIME_ADJUST_INFORMATION, *PSYSTEM_SET_TIME_ADJUST_INFORMATION;\n\ntypedef struct _SYSTEM_SET_TIME_ADJUST_INFORMATION_PRECISE\n{\n    ULONGLONG TimeAdjustment;\n    BOOLEAN Enable;\n} SYSTEM_SET_TIME_ADJUST_INFORMATION_PRECISE, *PSYSTEM_SET_TIME_ADJUST_INFORMATION_PRECISE;\n\ntypedef enum _EVENT_TRACE_INFORMATION_CLASS\n{\n    EventTraceKernelVersionInformation, // EVENT_TRACE_VERSION_INFORMATION\n    EventTraceGroupMaskInformation, // EVENT_TRACE_GROUPMASK_INFORMATION\n    EventTracePerformanceInformation, // EVENT_TRACE_PERFORMANCE_INFORMATION\n    EventTraceTimeProfileInformation, // EVENT_TRACE_TIME_PROFILE_INFORMATION\n    EventTraceSessionSecurityInformation, // EVENT_TRACE_SESSION_SECURITY_INFORMATION\n    EventTraceSpinlockInformation, // EVENT_TRACE_SPINLOCK_INFORMATION\n    EventTraceStackTracingInformation, // EVENT_TRACE_STACK_TRACING_INFORMATION\n    EventTraceExecutiveResourceInformation, // EVENT_TRACE_EXECUTIVE_RESOURCE_INFORMATION\n    EventTraceHeapTracingInformation, // EVENT_TRACE_HEAP_TRACING_INFORMATION\n    EventTraceHeapSummaryTracingInformation, // EVENT_TRACE_HEAP_TRACING_INFORMATION\n    EventTracePoolTagFilterInformation, // EVENT_TRACE_POOLTAG_FILTER_INFORMATION\n    EventTracePebsTracingInformation, // EVENT_TRACE_PEBS_TRACING_INFORMATION\n    EventTraceProfileConfigInformation, // EVENT_TRACE_PROFILE_CONFIG_INFORMATION\n    EventTraceProfileSourceListInformation, // EVENT_TRACE_PROFILE_LIST_INFORMATION\n    EventTraceProfileEventListInformation, // EVENT_TRACE_PROFILE_EVENT_INFORMATION\n    EventTraceProfileCounterListInformation, // EVENT_TRACE_PROFILE_COUNTER_INFORMATION\n    EventTraceStackCachingInformation, // EVENT_TRACE_STACK_CACHING_INFORMATION\n    EventTraceObjectTypeFilterInformation, // EVENT_TRACE_OBJECT_TYPE_FILTER_INFORMATION\n    EventTraceSoftRestartInformation, // EVENT_TRACE_SOFT_RESTART_INFORMATION\n    EventTraceLastBranchConfigurationInformation, // REDSTONE3\n    EventTraceLastBranchEventListInformation, // EVENT_TRACE_PROFILE_EVENT_INFORMATION\n    EventTraceProfileSourceAddInformation, // EVENT_TRACE_PROFILE_ADD_INFORMATION // REDSTONE4\n    EventTraceProfileSourceRemoveInformation, // EVENT_TRACE_PROFILE_REMOVE_INFORMATION\n    EventTraceProcessorTraceConfigurationInformation,\n    EventTraceProcessorTraceEventListInformation, // EVENT_TRACE_PROFILE_EVENT_INFORMATION\n    EventTraceCoverageSamplerInformation, // EVENT_TRACE_COVERAGE_SAMPLER_INFORMATION\n    EventTraceUnifiedStackCachingInformation, // since 21H1\n    EventTraceContextRegisterTraceInformation, // TRACE_CONTEXT_REGISTER_INFO // 24H2\n    MaxEventTraceInfoClass\n} EVENT_TRACE_INFORMATION_CLASS;\n\ntypedef struct _EVENT_TRACE_VERSION_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG EventTraceKernelVersion;\n} EVENT_TRACE_VERSION_INFORMATION, *PEVENT_TRACE_VERSION_INFORMATION;\n\ntypedef struct _EVENT_TRACE_GROUPMASK_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    ULONG EventTraceGroupMasks[8]; // PERFINFO_GROUPMASK\n} EVENT_TRACE_GROUPMASK_INFORMATION, *PEVENT_TRACE_GROUPMASK_INFORMATION;\n\ntypedef struct _EVENT_TRACE_PERFORMANCE_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    LARGE_INTEGER LogfileBytesWritten;\n} EVENT_TRACE_PERFORMANCE_INFORMATION, *PEVENT_TRACE_PERFORMANCE_INFORMATION;\n\ntypedef struct _EVENT_TRACE_TIME_PROFILE_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG ProfileInterval;\n} EVENT_TRACE_TIME_PROFILE_INFORMATION, *PEVENT_TRACE_TIME_PROFILE_INFORMATION;\n\ntypedef struct _EVENT_TRACE_SESSION_SECURITY_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG SecurityInformation;\n    TRACEHANDLE TraceHandle;\n    UCHAR SecurityDescriptor[1];\n} EVENT_TRACE_SESSION_SECURITY_INFORMATION, *PEVENT_TRACE_SESSION_SECURITY_INFORMATION;\n\ntypedef struct _EVENT_TRACE_SPINLOCK_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG SpinLockSpinThreshold;\n    ULONG SpinLockAcquireSampleRate;\n    ULONG SpinLockContentionSampleRate;\n    ULONG SpinLockHoldThreshold;\n} EVENT_TRACE_SPINLOCK_INFORMATION, *PEVENT_TRACE_SPINLOCK_INFORMATION;\n\ntypedef struct _EVENT_TRACE_SYSTEM_EVENT_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    ULONG HookId[1];\n} EVENT_TRACE_SYSTEM_EVENT_INFORMATION, *PEVENT_TRACE_SYSTEM_EVENT_INFORMATION;\n\ntypedef EVENT_TRACE_SYSTEM_EVENT_INFORMATION EVENT_TRACE_STACK_TRACING_INFORMATION, *PEVENT_TRACE_STACK_TRACING_INFORMATION;\ntypedef EVENT_TRACE_SYSTEM_EVENT_INFORMATION EVENT_TRACE_PEBS_TRACING_INFORMATION, *PEVENT_TRACE_PEBS_TRACING_INFORMATION;\ntypedef EVENT_TRACE_SYSTEM_EVENT_INFORMATION EVENT_TRACE_PROFILE_EVENT_INFORMATION, *PEVENT_TRACE_PROFILE_EVENT_INFORMATION;\n\ntypedef struct _EVENT_TRACE_EXECUTIVE_RESOURCE_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG ReleaseSamplingRate;\n    ULONG ContentionSamplingRate;\n    ULONG NumberOfExcessiveTimeouts;\n} EVENT_TRACE_EXECUTIVE_RESOURCE_INFORMATION, *PEVENT_TRACE_EXECUTIVE_RESOURCE_INFORMATION;\n\ntypedef struct _EVENT_TRACE_HEAP_TRACING_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG ProcessId[1];\n} EVENT_TRACE_HEAP_TRACING_INFORMATION, *PEVENT_TRACE_HEAP_TRACING_INFORMATION;\n\ntypedef struct _EVENT_TRACE_TAG_FILTER_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    ULONG Filter[1];\n} EVENT_TRACE_TAG_FILTER_INFORMATION, *PEVENT_TRACE_TAG_FILTER_INFORMATION;\n\ntypedef EVENT_TRACE_TAG_FILTER_INFORMATION EVENT_TRACE_POOLTAG_FILTER_INFORMATION, *PEVENT_TRACE_POOLTAG_FILTER_INFORMATION;\ntypedef EVENT_TRACE_TAG_FILTER_INFORMATION EVENT_TRACE_OBJECT_TYPE_FILTER_INFORMATION, *PEVENT_TRACE_OBJECT_TYPE_FILTER_INFORMATION;\n\n// ProfileSource\n#define ETW_MAX_PROFILING_SOURCES 4\n#define ETW_MAX_PMC_EVENTS        4\n#define ETW_MAX_PMC_COUNTERS      4\n\ntypedef struct _EVENT_TRACE_PROFILE_COUNTER_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    ULONG ProfileSource[1];\n} EVENT_TRACE_PROFILE_COUNTER_INFORMATION, *PEVENT_TRACE_PROFILE_COUNTER_INFORMATION;\n\ntypedef EVENT_TRACE_PROFILE_COUNTER_INFORMATION EVENT_TRACE_PROFILE_CONFIG_INFORMATION, *PEVENT_TRACE_PROFILE_CONFIG_INFORMATION;\n\n//typedef struct _PROFILE_SOURCE_INFO\n//{\n//    ULONG NextEntryOffset;\n//    ULONG Source;\n//    ULONG MinInterval;\n//    ULONG MaxInterval;\n//    PVOID Reserved;\n//    WCHAR Description[1];\n//} PROFILE_SOURCE_INFO, *PPROFILE_SOURCE_INFO;\n\ntypedef struct _PROFILE_SOURCE_INFO *PPROFILE_SOURCE_INFO;\n\ntypedef struct _EVENT_TRACE_PROFILE_LIST_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    ULONG Spare;\n    PPROFILE_SOURCE_INFO Profile[1];\n} EVENT_TRACE_PROFILE_LIST_INFORMATION, *PEVENT_TRACE_PROFILE_LIST_INFORMATION;\n\ntypedef struct _EVENT_TRACE_STACK_CACHING_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    BOOLEAN Enabled;\n    UCHAR Reserved[3];\n    ULONG CacheSize;\n    ULONG BucketCount;\n} EVENT_TRACE_STACK_CACHING_INFORMATION, *PEVENT_TRACE_STACK_CACHING_INFORMATION;\n\ntypedef struct _EVENT_TRACE_SOFT_RESTART_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    TRACEHANDLE TraceHandle;\n    BOOLEAN PersistTraceBuffers;\n    WCHAR FileName[1];\n} EVENT_TRACE_SOFT_RESTART_INFORMATION, *PEVENT_TRACE_SOFT_RESTART_INFORMATION;\n\ntypedef enum _EVENT_TRACE_PROFILE_ADD_INFORMATION_VERSIONS\n{\n    EventTraceProfileAddInformationMinVersion = 0x2,\n    EventTraceProfileAddInformationV2 = 0x2,\n    EventTraceProfileAddInformationV3 = 0x3,\n    EventTraceProfileAddInformationMaxVersion = 0x3,\n} EVENT_TRACE_PROFILE_ADD_INFORMATION_VERSIONS;\n\ntypedef union _EVENT_TRACE_PROFILE_ADD_INFORMATION_V2\n{\n    struct\n    {\n        UCHAR PerfEvtEventSelect;\n        UCHAR PerfEvtUnitSelect;\n        UCHAR PerfEvtCMask;\n        UCHAR PerfEvtCInv;\n        UCHAR PerfEvtAnyThread;\n        UCHAR PerfEvtEdgeDetect;\n    } Intel;\n    struct\n    {\n        UCHAR PerfEvtEventSelect;\n        UCHAR PerfEvtUnitSelect;\n    } Amd;\n    struct\n    {\n        ULONG PerfEvtType;\n        UCHAR AllowsHalt;\n    } Arm;\n} EVENT_TRACE_PROFILE_ADD_INFORMATION_V2;\n\ntypedef union _EVENT_TRACE_PROFILE_ADD_INFORMATION_V3\n{\n    struct\n    {\n        UCHAR PerfEvtEventSelect;\n        UCHAR PerfEvtUnitSelect;\n        UCHAR PerfEvtCMask;\n        UCHAR PerfEvtCInv;\n        UCHAR PerfEvtAnyThread;\n        UCHAR PerfEvtEdgeDetect;\n    } Intel;\n    struct\n    {\n        USHORT PerfEvtEventSelect;\n        UCHAR PerfEvtUnitSelect;\n        UCHAR PerfEvtCMask;\n        UCHAR PerfEvtCInv;\n        UCHAR PerfEvtEdgeDetect;\n        UCHAR PerfEvtHostGuest;\n        UCHAR PerfPmuType;\n    } Amd;\n    struct\n    {\n        ULONG PerfEvtType;\n        UCHAR AllowsHalt;\n    } Arm;\n} EVENT_TRACE_PROFILE_ADD_INFORMATION_V3;\n\ntypedef struct _EVENT_TRACE_PROFILE_ADD_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    UCHAR Version;\n    union\n    {\n        EVENT_TRACE_PROFILE_ADD_INFORMATION_V2 V2;\n        EVENT_TRACE_PROFILE_ADD_INFORMATION_V3 V3;\n    };\n    ULONG CpuInfoHierarchy[0x3];\n    ULONG InitialInterval;\n    BOOLEAN Persist;\n    WCHAR ProfileSourceDescription[0x1];\n} EVENT_TRACE_PROFILE_ADD_INFORMATION, *PEVENT_TRACE_PROFILE_ADD_INFORMATION;\n\ntypedef struct _EVENT_TRACE_PROFILE_REMOVE_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    KPROFILE_SOURCE ProfileSource;\n    ULONG CpuInfoHierarchy[0x3];\n} EVENT_TRACE_PROFILE_REMOVE_INFORMATION, *PEVENT_TRACE_PROFILE_REMOVE_INFORMATION;\n\ntypedef struct _EVENT_TRACE_COVERAGE_SAMPLER_INFORMATION\n{\n    EVENT_TRACE_INFORMATION_CLASS EventTraceInformationClass;\n    UCHAR CoverageSamplerInformationClass;\n    UCHAR MajorVersion;\n    UCHAR MinorVersion;\n    UCHAR Reserved;\n    HANDLE SamplerHandle;\n} EVENT_TRACE_COVERAGE_SAMPLER_INFORMATION, *PEVENT_TRACE_COVERAGE_SAMPLER_INFORMATION;\n\n//typedef struct _TRACE_CONTEXT_REGISTER_INFO\n//{\n//    ETW_CONTEXT_REGISTER_TYPES RegisterTypes;\n//    ULONG Reserved;\n//} TRACE_CONTEXT_REGISTER_INFO, *PTRACE_CONTEXT_REGISTER_INFO;\n\ntypedef struct _SYSTEM_EXCEPTION_INFORMATION\n{\n    ULONG AlignmentFixupCount;\n    ULONG ExceptionDispatchCount;\n    ULONG FloatingEmulationCount;\n    ULONG ByteWordEmulationCount;\n} SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION;\n\ntypedef enum _SYSTEM_CRASH_DUMP_CONFIGURATION_CLASS\n{\n    SystemCrashDumpDisable,\n    SystemCrashDumpReconfigure,\n    SystemCrashDumpInitializationComplete\n} SYSTEM_CRASH_DUMP_CONFIGURATION_CLASS, *PSYSTEM_CRASH_DUMP_CONFIGURATION_CLASS;\n\ntypedef struct _SYSTEM_CRASH_DUMP_STATE_INFORMATION\n{\n    SYSTEM_CRASH_DUMP_CONFIGURATION_CLASS CrashDumpConfigurationClass;\n} SYSTEM_CRASH_DUMP_STATE_INFORMATION, *PSYSTEM_CRASH_DUMP_STATE_INFORMATION;\n\ntypedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION\n{\n    BOOLEAN KernelDebuggerEnabled;\n    BOOLEAN KernelDebuggerNotPresent;\n} SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION;\n\ntypedef struct _SYSTEM_CONTEXT_SWITCH_INFORMATION\n{\n    ULONG ContextSwitches;\n    ULONG FindAny;\n    ULONG FindLast;\n    ULONG FindIdeal;\n    ULONG IdleAny;\n    ULONG IdleCurrent;\n    ULONG IdleLast;\n    ULONG IdleIdeal;\n    ULONG PreemptAny;\n    ULONG PreemptCurrent;\n    ULONG PreemptLast;\n    ULONG SwitchToIdle;\n} SYSTEM_CONTEXT_SWITCH_INFORMATION, *PSYSTEM_CONTEXT_SWITCH_INFORMATION;\n\ntypedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION\n{\n    ULONG RegistryQuotaAllowed;\n    ULONG RegistryQuotaUsed;\n    SIZE_T PagedPoolSize;\n} SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION;\n\ntypedef struct _SYSTEM_PROCESSOR_IDLE_INFORMATION\n{\n    ULONGLONG IdleTime;\n    ULONGLONG C1Time;\n    ULONGLONG C2Time;\n    ULONGLONG C3Time;\n    ULONG C1Transitions;\n    ULONG C2Transitions;\n    ULONG C3Transitions;\n    ULONG Padding;\n} SYSTEM_PROCESSOR_IDLE_INFORMATION, *PSYSTEM_PROCESSOR_IDLE_INFORMATION;\n\ntypedef struct _SYSTEM_LEGACY_DRIVER_INFORMATION\n{\n    ULONG VetoType;\n    UNICODE_STRING VetoList;\n} SYSTEM_LEGACY_DRIVER_INFORMATION, *PSYSTEM_LEGACY_DRIVER_INFORMATION;\n\ntypedef struct _SYSTEM_LOOKASIDE_INFORMATION\n{\n    USHORT CurrentDepth;\n    USHORT MaximumDepth;\n    ULONG TotalAllocates;\n    ULONG AllocateMisses;\n    ULONG TotalFrees;\n    ULONG FreeMisses;\n    ULONG Type;\n    ULONG Tag;\n    ULONG Size;\n} SYSTEM_LOOKASIDE_INFORMATION, *PSYSTEM_LOOKASIDE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_RANGE_START_INFORMATION\n{\n    ULONG_PTR SystemRangeStart;\n} SYSTEM_RANGE_START_INFORMATION, *PSYSTEM_RANGE_START_INFORMATION;\n\ntypedef struct _SYSTEM_VERIFIER_INFORMATION_LEGACY // pre-19H1\n{\n    ULONG NextEntryOffset;\n    ULONG Level;\n    UNICODE_STRING DriverName;\n\n    ULONG RaiseIrqls;\n    ULONG AcquireSpinLocks;\n    ULONG SynchronizeExecutions;\n    ULONG AllocationsAttempted;\n\n    ULONG AllocationsSucceeded;\n    ULONG AllocationsSucceededSpecialPool;\n    ULONG AllocationsWithNoTag;\n    ULONG TrimRequests;\n\n    ULONG Trims;\n    ULONG AllocationsFailed;\n    ULONG AllocationsFailedDeliberately;\n    ULONG Loads;\n\n    ULONG Unloads;\n    ULONG UnTrackedPool;\n    ULONG CurrentPagedPoolAllocations;\n    ULONG CurrentNonPagedPoolAllocations;\n\n    ULONG PeakPagedPoolAllocations;\n    ULONG PeakNonPagedPoolAllocations;\n\n    SIZE_T PagedPoolUsageInBytes;\n    SIZE_T NonPagedPoolUsageInBytes;\n    SIZE_T PeakPagedPoolUsageInBytes;\n    SIZE_T PeakNonPagedPoolUsageInBytes;\n} SYSTEM_VERIFIER_INFORMATION_LEGACY, *PSYSTEM_VERIFIER_INFORMATION_LEGACY;\n\ntypedef struct _SYSTEM_VERIFIER_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG Level;\n    ULONG RuleClasses[2];\n    ULONG TriageContext;\n    ULONG AreAllDriversBeingVerified;\n\n    UNICODE_STRING DriverName;\n\n    ULONG RaiseIrqls;\n    ULONG AcquireSpinLocks;\n    ULONG SynchronizeExecutions;\n    ULONG AllocationsAttempted;\n\n    ULONG AllocationsSucceeded;\n    ULONG AllocationsSucceededSpecialPool;\n    ULONG AllocationsWithNoTag;\n    ULONG TrimRequests;\n\n    ULONG Trims;\n    ULONG AllocationsFailed;\n    ULONG AllocationsFailedDeliberately;\n    ULONG Loads;\n\n    ULONG Unloads;\n    ULONG UnTrackedPool;\n    ULONG CurrentPagedPoolAllocations;\n    ULONG CurrentNonPagedPoolAllocations;\n\n    ULONG PeakPagedPoolAllocations;\n    ULONG PeakNonPagedPoolAllocations;\n\n    SIZE_T PagedPoolUsageInBytes;\n    SIZE_T NonPagedPoolUsageInBytes;\n    SIZE_T PeakPagedPoolUsageInBytes;\n    SIZE_T PeakNonPagedPoolUsageInBytes;\n} SYSTEM_VERIFIER_INFORMATION, *PSYSTEM_VERIFIER_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SESSION_PROCESS_INFORMATION\n{\n    ULONG SessionId;\n    ULONG SizeOfBuf;\n    PVOID Buffer;\n} SYSTEM_SESSION_PROCESS_INFORMATION, *PSYSTEM_SESSION_PROCESS_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// private\ntypedef struct _SYSTEM_GDI_DRIVER_INFORMATION\n{\n    UNICODE_STRING DriverName;\n    PVOID ImageAddress;\n    PVOID SectionPointer;\n    PVOID EntryPoint;\n    PIMAGE_EXPORT_DIRECTORY ExportSectionPointer;\n    ULONG ImageLength;\n} SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// geoffchappell\n#ifdef _WIN64\n#define MAXIMUM_NODE_COUNT 0x40\n#else\n#define MAXIMUM_NODE_COUNT 0x10\n#endif\n\n// private\ntypedef struct _SYSTEM_NUMA_INFORMATION\n{\n    ULONG HighestNodeNumber;\n    ULONG Reserved;\n    union\n    {\n        GROUP_AFFINITY ActiveProcessorsGroupAffinity[MAXIMUM_NODE_COUNT];\n        ULONGLONG AvailableMemory[MAXIMUM_NODE_COUNT];\n        ULONGLONG Pad[MAXIMUM_NODE_COUNT * 2];\n    } DUMMYUNIONNAME;\n} SYSTEM_NUMA_INFORMATION, *PSYSTEM_NUMA_INFORMATION;\n\ntypedef struct _SYSTEM_PROCESSOR_POWER_INFORMATION\n{\n    UCHAR CurrentFrequency;\n    UCHAR ThermalLimitFrequency;\n    UCHAR ConstantThrottleFrequency;\n    UCHAR DegradedThrottleFrequency;\n    UCHAR LastBusyFrequency;\n    UCHAR LastC3Frequency;\n    UCHAR LastAdjustedBusyFrequency;\n    UCHAR ProcessorMinThrottle;\n    UCHAR ProcessorMaxThrottle;\n    ULONG NumberOfFrequencies;\n    ULONG PromotionCount;\n    ULONG DemotionCount;\n    ULONG ErrorCount;\n    ULONG RetryCount;\n    ULONGLONG CurrentFrequencyTime;\n    ULONGLONG CurrentProcessorTime;\n    ULONGLONG CurrentProcessorIdleTime;\n    ULONGLONG LastProcessorTime;\n    ULONGLONG LastProcessorIdleTime;\n    ULONGLONG Energy;\n} SYSTEM_PROCESSOR_POWER_INFORMATION, *PSYSTEM_PROCESSOR_POWER_INFORMATION;\n\ntypedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX\n{\n    PVOID Object;\n    HANDLE UniqueProcessId;\n    HANDLE HandleValue;\n    ACCESS_MASK GrantedAccess;\n    USHORT CreatorBackTraceIndex;\n    USHORT ObjectTypeIndex;\n    ULONG HandleAttributes;\n    ULONG Reserved;\n} SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION_EX\n{\n    ULONG_PTR NumberOfHandles;\n    ULONG_PTR Reserved;\n    _Field_size_(NumberOfHandles) SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1];\n} SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;\n\ntypedef struct _SYSTEM_BIGPOOL_ENTRY\n{\n    union\n    {\n        PVOID VirtualAddress;\n        ULONG_PTR NonPaged : 1;\n    };\n    SIZE_T SizeInBytes;\n    union\n    {\n        UCHAR Tag[4];\n        ULONG TagUlong;\n    };\n} SYSTEM_BIGPOOL_ENTRY, *PSYSTEM_BIGPOOL_ENTRY;\n\ntypedef struct _SYSTEM_BIGPOOL_INFORMATION\n{\n    ULONG Count;\n    _Field_size_(Count) SYSTEM_BIGPOOL_ENTRY AllocatedInfo[1];\n} SYSTEM_BIGPOOL_INFORMATION, *PSYSTEM_BIGPOOL_INFORMATION;\n\ntypedef struct _SYSTEM_POOL_ENTRY\n{\n    BOOLEAN Allocated;\n    BOOLEAN Spare0;\n    USHORT AllocatorBackTraceIndex;\n    ULONG Size;\n    union\n    {\n        UCHAR Tag[4];\n        ULONG TagUlong;\n        PVOID ProcessChargedQuota;\n    };\n} SYSTEM_POOL_ENTRY, *PSYSTEM_POOL_ENTRY;\n\ntypedef struct _SYSTEM_POOL_INFORMATION\n{\n    SIZE_T TotalSize;\n    PVOID FirstEntry;\n    USHORT EntryOverhead;\n    BOOLEAN PoolTagPresent;\n    BOOLEAN Spare0;\n    ULONG NumberOfEntries;\n    _Field_size_(NumberOfEntries) SYSTEM_POOL_ENTRY Entries[1];\n} SYSTEM_POOL_INFORMATION, *PSYSTEM_POOL_INFORMATION;\n\ntypedef struct _SYSTEM_SESSION_POOLTAG_INFORMATION\n{\n    SIZE_T NextEntryOffset;\n    ULONG SessionId;\n    ULONG Count;\n    _Field_size_(Count) SYSTEM_POOLTAG TagInfo[1];\n} SYSTEM_SESSION_POOLTAG_INFORMATION, *PSYSTEM_SESSION_POOLTAG_INFORMATION;\n\ntypedef struct _SYSTEM_SESSION_MAPPED_VIEW_INFORMATION\n{\n    SIZE_T NextEntryOffset;\n    ULONG SessionId;\n    ULONG ViewFailures;\n    SIZE_T NumberOfBytesAvailable;\n    SIZE_T NumberOfBytesAvailableContiguous;\n} SYSTEM_SESSION_MAPPED_VIEW_INFORMATION, *PSYSTEM_SESSION_MAPPED_VIEW_INFORMATION;\n\ntypedef enum _WATCHDOG_HANDLER_ACTION\n{\n    WdActionSetTimeoutValue,\n    WdActionQueryTimeoutValue,\n    WdActionResetTimer,\n    WdActionStopTimer,\n    WdActionStartTimer,\n    WdActionSetTriggerAction,\n    WdActionQueryTriggerAction,\n    WdActionQueryState\n} WATCHDOG_HANDLER_ACTION;\n\ntypedef _Function_class_(SYSTEM_WATCHDOG_HANDLER)\nNTSTATUS NTAPI SYSTEM_WATCHDOG_HANDLER(\n    _In_ WATCHDOG_HANDLER_ACTION Action,\n    _In_ PVOID Context,\n    _Inout_ PULONG DataValue,\n    _In_ BOOLEAN NoLocks\n    );\ntypedef SYSTEM_WATCHDOG_HANDLER* PSYSTEM_WATCHDOG_HANDLER;\n\n// private\ntypedef struct _SYSTEM_WATCHDOG_HANDLER_INFORMATION\n{\n    PSYSTEM_WATCHDOG_HANDLER WdHandler;\n    PVOID Context;\n} SYSTEM_WATCHDOG_HANDLER_INFORMATION, *PSYSTEM_WATCHDOG_HANDLER_INFORMATION;\n\ntypedef enum _WATCHDOG_INFORMATION_CLASS\n{\n    WdInfoTimeoutValue = 0,\n    WdInfoResetTimer = 1,\n    WdInfoStopTimer = 2,\n    WdInfoStartTimer = 3,\n    WdInfoTriggerAction = 4,\n    WdInfoState = 5,\n    WdInfoTriggerReset = 6,\n    WdInfoNop = 7,\n    WdInfoGeneratedLastReset = 8,\n    WdInfoInvalid = 9,\n} WATCHDOG_INFORMATION_CLASS;\n\n// private\ntypedef struct _SYSTEM_WATCHDOG_TIMER_INFORMATION\n{\n    WATCHDOG_INFORMATION_CLASS WdInfoClass;\n    ULONG DataValue;\n} SYSTEM_WATCHDOG_TIMER_INFORMATION, *PSYSTEM_WATCHDOG_TIMER_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// private\ntypedef enum _SYSTEM_FIRMWARE_TABLE_ACTION\n{\n    SystemFirmwareTableEnumerate,\n    SystemFirmwareTableGet,\n    SystemFirmwareTableMax\n} SYSTEM_FIRMWARE_TABLE_ACTION;\n\n// private\ntypedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION\n{\n    ULONG ProviderSignature; // (same as the GetSystemFirmwareTable function)\n    SYSTEM_FIRMWARE_TABLE_ACTION Action;\n    ULONG TableID;\n    ULONG TableBufferLength;\n    _Field_size_bytes_(TableBufferLength) UCHAR TableBuffer[1];\n} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// private\ntypedef NTSTATUS (__cdecl* PFNFTH)(\n    _Inout_ PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo\n    );\n\n// private\ntypedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER\n{\n    ULONG ProviderSignature;\n    BOOLEAN Register;\n    PFNFTH FirmwareTableHandler;\n    PVOID DriverObject;\n} SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// private\ntypedef struct _SYSTEM_MEMORY_LIST_INFORMATION\n{\n    SIZE_T ZeroPageCount;\n    SIZE_T FreePageCount;\n    SIZE_T ModifiedPageCount;\n    SIZE_T ModifiedNoWritePageCount;\n    SIZE_T BadPageCount;\n    SIZE_T PageCountByPriority[8];\n    SIZE_T RepurposedPagesByPriority[8];\n    SIZE_T ModifiedPageCountPageFile;\n} SYSTEM_MEMORY_LIST_INFORMATION, *PSYSTEM_MEMORY_LIST_INFORMATION;\n\n// private\ntypedef enum _SYSTEM_MEMORY_LIST_COMMAND\n{\n    MemoryCaptureAccessedBits,\n    MemoryCaptureAndResetAccessedBits,\n    MemoryEmptyWorkingSets,\n    MemoryFlushModifiedList,\n    MemoryPurgeStandbyList,\n    MemoryPurgeLowPriorityStandbyList,\n    MemoryCommandMax\n} SYSTEM_MEMORY_LIST_COMMAND;\n\n// private\ntypedef struct _SYSTEM_THREAD_CID_PRIORITY_INFORMATION\n{\n    CLIENT_ID ClientId;\n    KPRIORITY Priority;\n} SYSTEM_THREAD_CID_PRIORITY_INFORMATION, *PSYSTEM_THREAD_CID_PRIORITY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_IDLE_CYCLE_TIME_INFORMATION\n{\n    ULONGLONG CycleTime;\n} SYSTEM_PROCESSOR_IDLE_CYCLE_TIME_INFORMATION, *PSYSTEM_PROCESSOR_IDLE_CYCLE_TIME_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_VERIFIER_ISSUE\n{\n    ULONGLONG IssueType;\n    PVOID Address;\n    ULONGLONG Parameters[2];\n} SYSTEM_VERIFIER_ISSUE, *PSYSTEM_VERIFIER_ISSUE;\n\n// private\ntypedef struct _SYSTEM_VERIFIER_CANCELLATION_INFORMATION\n{\n    ULONG CancelProbability;\n    ULONG CancelThreshold;\n    ULONG CompletionThreshold;\n    ULONG CancellationVerifierDisabled;\n    ULONG AvailableIssues;\n    SYSTEM_VERIFIER_ISSUE Issues[128];\n} SYSTEM_VERIFIER_CANCELLATION_INFORMATION, *PSYSTEM_VERIFIER_CANCELLATION_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_REF_TRACE_INFORMATION\n{\n    BOOLEAN TraceEnable;\n    BOOLEAN TracePermanent;\n    UNICODE_STRING TraceProcessName;\n    UNICODE_STRING TracePoolTags;\n} SYSTEM_REF_TRACE_INFORMATION, *PSYSTEM_REF_TRACE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SPECIAL_POOL_INFORMATION\n{\n    ULONG PoolTag;\n    ULONG Flags;\n} SYSTEM_SPECIAL_POOL_INFORMATION, *PSYSTEM_SPECIAL_POOL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PROCESS_ID_INFORMATION\n{\n    HANDLE ProcessId;\n    UNICODE_STRING ImageName;\n} SYSTEM_PROCESS_ID_INFORMATION, *PSYSTEM_PROCESS_ID_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_QUERY_INFORMATION\n{\n    BOOLEAN HypervisorConnected;\n    BOOLEAN HypervisorDebuggingEnabled;\n    BOOLEAN HypervisorPresent;\n    BOOLEAN Spare0[5];\n    ULONGLONG EnabledEnlightenments;\n} SYSTEM_HYPERVISOR_QUERY_INFORMATION, *PSYSTEM_HYPERVISOR_QUERY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_BOOT_ENVIRONMENT_INFORMATION\n{\n    GUID BootIdentifier;\n    FIRMWARE_TYPE FirmwareType;\n    union\n    {\n        ULONGLONG BootFlags;\n        struct\n        {\n            ULONGLONG DbgMenuOsSelection : 1; // REDSTONE4\n            ULONGLONG DbgHiberBoot : 1;\n            ULONGLONG DbgSoftBoot : 1;\n            ULONGLONG DbgMeasuredLaunch : 1;\n            ULONGLONG DbgMeasuredLaunchCapable : 1; // 19H1\n            ULONGLONG DbgSystemHiveReplace : 1;\n            ULONGLONG DbgMeasuredLaunchSmmProtections : 1;\n            ULONGLONG DbgMeasuredLaunchSmmLevel : 7; // 20H1\n            ULONGLONG DbgBugCheckRecovery : 1; // 24H2\n            ULONGLONG DbgFASR : 1;\n            ULONGLONG DbgUseCachedBcd : 1;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} SYSTEM_BOOT_ENVIRONMENT_INFORMATION, *PSYSTEM_BOOT_ENVIRONMENT_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_IMAGE_FILE_EXECUTION_OPTIONS_INFORMATION\n{\n    ULONG FlagsToEnable;\n    ULONG FlagsToDisable;\n} SYSTEM_IMAGE_FILE_EXECUTION_OPTIONS_INFORMATION, *PSYSTEM_IMAGE_FILE_EXECUTION_OPTIONS_INFORMATION;\n\n// private\ntypedef enum _COVERAGE_REQUEST_CODES\n{\n    CoverageAllModules = 0,\n    CoverageSearchByHash = 1,\n    CoverageSearchByName = 2\n} COVERAGE_REQUEST_CODES;\n\n// private\ntypedef struct _COVERAGE_MODULE_REQUEST\n{\n    COVERAGE_REQUEST_CODES RequestType;\n    union\n    {\n        UCHAR MD5Hash[16];\n        UNICODE_STRING ModuleName;\n    } SearchInfo;\n} COVERAGE_MODULE_REQUEST, *PCOVERAGE_MODULE_REQUEST;\n\n// private\ntypedef struct _COVERAGE_MODULE_INFO\n{\n    ULONG ModuleInfoSize;\n    ULONG IsBinaryLoaded;\n    UNICODE_STRING ModulePathName;\n    ULONG CoverageSectionSize;\n    UCHAR CoverageSection[1];\n} COVERAGE_MODULE_INFO, *PCOVERAGE_MODULE_INFO;\n\n// private\ntypedef struct _COVERAGE_MODULES\n{\n    ULONG ListAndReset;\n    ULONG NumberOfModules;\n    COVERAGE_MODULE_REQUEST ModuleRequestInfo;\n    COVERAGE_MODULE_INFO Modules[1];\n} COVERAGE_MODULES, *PCOVERAGE_MODULES;\n\n// private\ntypedef struct _SYSTEM_PREFETCH_PATCH_INFORMATION\n{\n    ULONG PrefetchPatchCount;\n} SYSTEM_PREFETCH_PATCH_INFORMATION, *PSYSTEM_PREFETCH_PATCH_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_VERIFIER_FAULTS_INFORMATION\n{\n    ULONG Probability;\n    ULONG MaxProbability;\n    UNICODE_STRING PoolTags;\n    UNICODE_STRING Applications;\n} SYSTEM_VERIFIER_FAULTS_INFORMATION, *PSYSTEM_VERIFIER_FAULTS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_VERIFIER_INFORMATION_EX\n{\n    ULONG VerifyMode;\n    ULONG OptionChanges;\n    UNICODE_STRING PreviousBucketName;\n    ULONG IrpCancelTimeoutMsec;\n    ULONG VerifierExtensionEnabled;\n#ifdef _WIN64\n    ULONG Reserved[1];\n#else\n    ULONG Reserved[3];\n#endif\n} SYSTEM_VERIFIER_INFORMATION_EX, *PSYSTEM_VERIFIER_INFORMATION_EX;\n\n// private\ntypedef struct _SYSTEM_SYSTEM_PARTITION_INFORMATION\n{\n    UNICODE_STRING SystemPartition;\n} SYSTEM_SYSTEM_PARTITION_INFORMATION, *PSYSTEM_SYSTEM_PARTITION_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SYSTEM_DISK_INFORMATION\n{\n    UNICODE_STRING SystemDisk;\n} SYSTEM_SYSTEM_DISK_INFORMATION, *PSYSTEM_SYSTEM_DISK_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_NUMA_PROXIMITY_MAP\n{\n    ULONG NodeProximityId;\n    USHORT NodeNumber;\n} SYSTEM_NUMA_PROXIMITY_MAP, *PSYSTEM_NUMA_PROXIMITY_MAP;\n\n// private (Windows 8.1 and above)\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT\n{\n    ULONGLONG Hits;\n    UCHAR PercentFrequency;\n} SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT, *PSYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT;\n\n// private (Windows 8.1 and above)\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION\n{\n    ULONG ProcessorNumber;\n    ULONG StateCount;\n    _Field_size_(StateCount) SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT States[1];\n} SYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION, *PSYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION;\n\n// private (Windows 7 and Windows 8)\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT_WIN8\n{\n    ULONG Hits;\n    UCHAR PercentFrequency;\n} SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT_WIN8, *PSYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT_WIN8;\n\n// private (Windows 7 and Windows 8)\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION_WIN8\n{\n    ULONG ProcessorNumber;\n    ULONG StateCount;\n    _Field_size_(StateCount) SYSTEM_PROCESSOR_PERFORMANCE_HITCOUNT_WIN8 States[1];\n} SYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION_WIN8, *PSYSTEM_PROCESSOR_PERFORMANCE_STATE_DISTRIBUTION_WIN8;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION\n{\n    ULONG ProcessorCount;\n    ULONG Offsets[1];\n} SYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION, *PSYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION;\n\n#define CODEINTEGRITY_OPTION_ENABLED 0x01\n#define CODEINTEGRITY_OPTION_TESTSIGN 0x02\n#define CODEINTEGRITY_OPTION_UMCI_ENABLED 0x04\n#define CODEINTEGRITY_OPTION_UMCI_AUDITMODE_ENABLED 0x08\n#define CODEINTEGRITY_OPTION_UMCI_EXCLUSIONPATHS_ENABLED 0x10\n#define CODEINTEGRITY_OPTION_TEST_BUILD 0x20\n#define CODEINTEGRITY_OPTION_PREPRODUCTION_BUILD 0x40\n#define CODEINTEGRITY_OPTION_DEBUGMODE_ENABLED 0x80\n#define CODEINTEGRITY_OPTION_FLIGHT_BUILD 0x100\n#define CODEINTEGRITY_OPTION_FLIGHTING_ENABLED 0x200\n#define CODEINTEGRITY_OPTION_HVCI_KMCI_ENABLED 0x400\n#define CODEINTEGRITY_OPTION_HVCI_KMCI_AUDITMODE_ENABLED 0x800\n#define CODEINTEGRITY_OPTION_HVCI_KMCI_STRICTMODE_ENABLED 0x1000\n#define CODEINTEGRITY_OPTION_HVCI_IUM_ENABLED 0x2000\n#define CODEINTEGRITY_OPTION_WHQL_ENFORCEMENT_ENABLED 0x4000\n#define CODEINTEGRITY_OPTION_WHQL_AUDITMODE_ENABLED 0x8000\n\n// private\ntypedef struct _SYSTEM_CODEINTEGRITY_INFORMATION\n{\n    ULONG Length;\n    union\n    {\n        ULONG CodeIntegrityOptions;\n        struct\n        {\n            ULONG Enabled : 1;\n            ULONG TestSign : 1;\n            ULONG UmciEnabled : 1;\n            ULONG UmciAuditModeEnabled : 1;\n            ULONG UmciExclusionPathsEnabled : 1;\n            ULONG TestBuild : 1;\n            ULONG PreproductionBuild : 1;\n            ULONG DebugModeEnabled : 1;\n            ULONG FlightBuild : 1;\n            ULONG FlightingEnabled : 1;\n            ULONG HvciKmciEnabled : 1;\n            ULONG HvciKmciAuditModeEnabled : 1;\n            ULONG HvciKmciStrictModeEnabled : 1;\n            ULONG HvciIumEnabled : 1;\n            ULONG WhqlEnforcementEnabled : 1;\n            ULONG WhqlAuditModeEnabled : 1;\n            ULONG Spare : 16;\n        };\n    };\n} SYSTEM_CODEINTEGRITY_INFORMATION, *PSYSTEM_CODEINTEGRITY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_MICROCODE_UPDATE_INFORMATION\n{\n    ULONG Operation;\n} SYSTEM_PROCESSOR_MICROCODE_UPDATE_INFORMATION, *PSYSTEM_PROCESSOR_MICROCODE_UPDATE_INFORMATION;\n\n// private\ntypedef enum _SYSTEM_VA_TYPE\n{\n    SystemVaTypeAll,\n    SystemVaTypeNonPagedPool,\n    SystemVaTypePagedPool,\n    SystemVaTypeSystemCache,\n    SystemVaTypeSystemPtes,\n    SystemVaTypeSessionSpace,\n    SystemVaTypeMax\n} SYSTEM_VA_TYPE, *PSYSTEM_VA_TYPE;\n\n// private\ntypedef struct _SYSTEM_VA_LIST_INFORMATION\n{\n    SIZE_T VirtualSize;\n    SIZE_T VirtualPeak;\n    SIZE_T VirtualLimit;\n    SIZE_T AllocationFailures;\n} SYSTEM_VA_LIST_INFORMATION, *PSYSTEM_VA_LIST_INFORMATION;\n\n// rev\ntypedef enum _STORE_INFORMATION_CLASS\n{\n    StorePageRequest = 1,\n    StoreStatsRequest = 2, // q: SM_STATS_REQUEST // SmProcessStatsRequest\n    StoreCreateRequest = 3, // s: SM_CREATE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    StoreDeleteRequest = 4, // s: SM_DELETE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    StoreListRequest = 5, // q: SM_STORE_LIST_REQUEST / SM_STORE_LIST_REQUEST_EX // SmProcessListRequest\n    Available1 = 6,\n    StoreEmptyRequest = 7,\n    CacheListRequest = 8, // q: SMC_CACHE_LIST_REQUEST // SmcProcessListRequest\n    CacheCreateRequest = 9, // s: SMC_CACHE_CREATE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    CacheDeleteRequest = 10, // s: SMC_CACHE_DELETE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    CacheStoreCreateRequest = 11, // s: SMC_STORE_CREATE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    CacheStoreDeleteRequest = 12, // s: SMC_STORE_DELETE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    CacheStatsRequest = 13, // q: SMC_CACHE_STATS_REQUEST // SmcProcessStatsRequest\n    Available2 = 14,\n    RegistrationRequest = 15, // q: SM_REGISTRATION_REQUEST (requires SeProfileSingleProcessPrivilege) // SmProcessRegistrationRequest\n    GlobalCacheStatsRequest = 16,\n    StoreResizeRequest = 17, // s: SM_STORE_RESIZE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    CacheStoreResizeRequest = 18, // s: SM_STORE_CACHE_RESIZE_REQUEST (requires SeProfileSingleProcessPrivilege)\n    SmConfigRequest = 19, // s: SM_CONFIG_REQUEST (requires SeProfileSingleProcessPrivilege)\n    StoreHighMemoryPriorityRequest = 20, // s: SM_STORE_HIGH_MEMORY_PRIORITY_REQUEST (requires SeProfileSingleProcessPrivilege)\n    SystemStoreTrimRequest = 21, // s: SM_SYSTEM_STORE_TRIM_REQUEST (requires SeProfileSingleProcessPrivilege) // SmProcessSystemStoreTrimRequest\n    MemCompressionInfoRequest = 22,  // q: SM_STORE_COMPRESSION_INFORMATION_REQUEST // SmProcessCompressionInfoRequest\n    ProcessStoreInfoRequest = 23, // SmProcessProcessStoreInfoRequest\n    StoreInformationMax\n} STORE_INFORMATION_CLASS;\n\n// rev\n#define SYSTEM_STORE_INFORMATION_VERSION 1\n\n// rev\ntypedef struct _SYSTEM_STORE_INFORMATION\n{\n    _In_ ULONG Version;\n    _In_ STORE_INFORMATION_CLASS StoreInformationClass;\n    _Inout_ PVOID Data;\n    _Inout_ ULONG Length;\n} SYSTEM_STORE_INFORMATION, *PSYSTEM_STORE_INFORMATION;\n\n#define SYSTEM_STORE_STATS_INFORMATION_VERSION 2\n\ntypedef enum _ST_STATS_LEVEL\n{\n    StStatsLevelBasic = 0,\n    StStatsLevelIoStats = 1,\n    StStatsLevelRegionSpace = 2, // requires SeProfileSingleProcessPrivilege\n    StStatsLevelSpaceBitmap = 3, // requires SeProfileSingleProcessPrivilege\n    StStatsLevelMax = 4\n} ST_STATS_LEVEL;\n\ntypedef struct _SM_STATS_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_STATS_INFORMATION_VERSION\n    ULONG DetailLevel : 8; // ST_STATS_LEVEL\n    ULONG StoreId : 16;\n    ULONG BufferSize;\n    PVOID Buffer; // PST_STATS\n} SM_STATS_REQUEST, *PSM_STATS_REQUEST;\n\ntypedef struct _ST_DATA_MGR_STATS\n{\n    ULONG RegionCount;\n    ULONG PagesStored;\n    ULONG UniquePagesStored;\n    ULONG LazyCleanupRegionCount;\n    struct {\n        ULONG RegionsInUse;\n        ULONG SpaceUsed;\n    } Space[8];\n} ST_DATA_MGR_STATS, *PST_DATA_MGR_STATS;\n\ntypedef struct _ST_IO_STATS_PERIOD\n{\n    ULONG PageCounts[5];\n} ST_IO_STATS_PERIOD, *PST_IO_STATS_PERIOD;\n\ntypedef struct _ST_IO_STATS\n{\n    ULONG PeriodCount;\n    ST_IO_STATS_PERIOD Periods[64];\n} ST_IO_STATS, *PST_IO_STATS;\n\ntypedef struct _ST_READ_LATENCY_BUCKET\n{\n    ULONG LatencyUs;\n    ULONG Count;\n} ST_READ_LATENCY_BUCKET, *PST_READ_LATENCY_BUCKET;\n\ntypedef struct _ST_READ_LATENCY_STATS\n{\n    ST_READ_LATENCY_BUCKET Buckets[8];\n} ST_READ_LATENCY_STATS, *PST_READ_LATENCY_STATS;\n\n// rev\ntypedef struct _ST_STATS_REGION_INFO\n{\n    USHORT SpaceUsed;\n    UCHAR Priority;\n    UCHAR Spare;\n} ST_STATS_REGION_INFO, *PST_STATS_REGION_INFO;\n\n// rev\ntypedef struct _ST_STATS_SPACE_BITMAP\n{\n    SIZE_T CompressedBytes;\n    ULONG BytesPerBit;\n    UCHAR StoreBitmap[1];\n} ST_STATS_SPACE_BITMAP, *PST_STATS_SPACE_BITMAP;\n\n// rev\ntypedef struct _ST_STATS\n{\n    ULONG Version : 8;\n    ULONG Level : 4;\n    ULONG StoreType : 4;\n    ULONG NoDuplication : 1;\n    ULONG NoCompression : 1;\n    ULONG EncryptionStrength : 12;\n    ULONG VirtualRegions : 1;\n    ULONG Spare0 : 1;\n    ULONG Size;\n    USHORT CompressionFormat;\n    USHORT Spare;\n\n    struct\n    {\n        ULONG RegionSize;\n        ULONG RegionCount;\n        ULONG RegionCountMax;\n        ULONG Granularity;\n        ST_DATA_MGR_STATS UserData;\n        ST_DATA_MGR_STATS Metadata;\n    } Basic;\n\n    struct\n    {\n        ST_IO_STATS IoStats;\n        ST_READ_LATENCY_STATS ReadLatencyStats;\n    } Io;\n\n    // ST_STATS_REGION_INFO[RegionCountMax]\n    // ST_STATS_SPACE_BITMAP\n} ST_STATS, *PST_STATS;\n\n#define SYSTEM_STORE_CREATE_INFORMATION_VERSION 6\n\ntypedef enum _SM_STORE_TYPE\n{\n    StoreTypeInMemory=0,\n    StoreTypeFile=1,\n    StoreTypeMax=2\n} SM_STORE_TYPE;\n\ntypedef struct _SM_STORE_BASIC_PARAMS\n{\n    union\n    {\n        struct\n        {\n            ULONG StoreType : 8; // SM_STORE_TYPE\n            ULONG NoDuplication : 1;\n            ULONG FailNoCompression : 1;\n            ULONG NoCompression : 1 ;\n            ULONG NoEncryption : 1;\n            ULONG NoEvictOnAdd : 1;\n            ULONG PerformsFileIo : 1;\n            ULONG VdlNotSet : 1 ;\n            ULONG UseIntermediateAddBuffer : 1;\n            ULONG CompressNoHuff : 1;\n            ULONG LockActiveRegions : 1;\n            ULONG VirtualRegions : 1;\n            ULONG Spare : 13;\n        } DUMMYSTRUCTNAME;\n        ULONG StoreFlags;\n    } DUMMYUNIONNAME;\n    ULONG Granularity;\n    ULONG RegionSize;\n    ULONG RegionCountMax;\n} SM_STORE_BASIC_PARAMS, *PSM_STORE_BASIC_PARAMS;\n\ntypedef struct _SMKM_REGION_EXTENT\n{\n    ULONG RegionCount;\n    SIZE_T ByteOffset;\n} SMKM_REGION_EXTENT, *PSMKM_REGION_EXTENT;\n\ntypedef struct _SMKM_FILE_INFO\n{\n    HANDLE FileHandle;\n    PFILE_OBJECT FileObject;\n    PFILE_OBJECT VolumeFileObject;\n    PDEVICE_OBJECT VolumeDeviceObject;\n    HANDLE VolumePnpHandle;\n    PIRP UsageNotificationIrp;\n    PSMKM_REGION_EXTENT Extents;\n    ULONG ExtentCount;\n} SMKM_FILE_INFO, *PSMKM_FILE_INFO;\n\ntypedef struct _SM_STORE_CACHE_BACKED_PARAMS\n{\n    ULONG SectorSize;\n    PCHAR EncryptionKey;\n    ULONG EncryptionKeySize;\n    PSMKM_FILE_INFO FileInfo;\n    PVOID EtaContext;\n    PRTL_BITMAP StoreRegionBitmap;\n} SM_STORE_CACHE_BACKED_PARAMS, *PSM_STORE_CACHE_BACKED_PARAMS;\n\ntypedef struct _SM_STORE_PARAMETERS\n{\n    SM_STORE_BASIC_PARAMS Store;\n    ULONG Priority;\n    ULONG Flags;\n    SM_STORE_CACHE_BACKED_PARAMS CacheBacked;\n} SM_STORE_PARAMETERS, *PSM_STORE_PARAMETERS;\n\ntypedef struct _SM_CREATE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_CREATE_INFORMATION_VERSION\n    ULONG AcquireReference : 1;\n    ULONG KeyedStore : 1;\n    ULONG Spare : 22;\n    SM_STORE_PARAMETERS Params;\n    ULONG StoreId;\n} SM_CREATE_REQUEST, *PSM_CREATE_REQUEST;\n\n#define SYSTEM_STORE_DELETE_INFORMATION_VERSION 1\n\ntypedef struct _SM_DELETE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_DELETE_INFORMATION_VERSION\n    ULONG Spare : 24;\n    ULONG StoreId;\n} SM_DELETE_REQUEST, *PSM_DELETE_REQUEST;\n\n#define SYSTEM_STORE_LIST_INFORMATION_VERSION 2\n\ntypedef struct _SM_STORE_LIST_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_LIST_INFORMATION_VERSION\n    ULONG StoreCount : 8; // = 0\n    ULONG ExtendedRequest : 1; // SM_STORE_LIST_REQUEST_EX if set\n    ULONG Spare : 15;\n    ULONG StoreId[32];\n} SM_STORE_LIST_REQUEST, *PSM_STORE_LIST_REQUEST;\n\ntypedef struct _SM_STORE_LIST_REQUEST_EX\n{\n    SM_STORE_LIST_REQUEST Request;\n    WCHAR NameBuffer[32][64];\n} SM_STORE_LIST_REQUEST_EX, *PSM_STORE_LIST_REQUEST_EX;\n\n#define SYSTEM_CACHE_LIST_INFORMATION_VERSION 2\n\ntypedef struct _SMC_CACHE_LIST_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_LIST_INFORMATION_VERSION\n    ULONG CacheCount : 8; // = 0\n    ULONG Spare : 16;\n    ULONG CacheId[16];\n} SMC_CACHE_LIST_REQUEST, *PSMC_CACHE_LIST_REQUEST;\n\n#define SYSTEM_CACHE_CREATE_INFORMATION_VERSION 3\n\ntypedef struct _SMC_CACHE_PARAMETERS\n{\n    SIZE_T CacheFileSize;\n    ULONG StoreAlignment;\n    ULONG PerformsFileIo : 1;\n    ULONG VdlNotSet : 1;\n    ULONG Spare : 30;\n    ULONG CacheFlags;\n    ULONG Priority;\n} SMC_CACHE_PARAMETERS, *PSMC_CACHE_PARAMETERS;\n\ntypedef struct _SMC_CACHE_CREATE_PARAMETERS\n{\n    SMC_CACHE_PARAMETERS CacheParameters;\n    WCHAR TemplateFilePath[512];\n} SMC_CACHE_CREATE_PARAMETERS, *PSMC_CACHE_CREATE_PARAMETERS;\n\ntypedef struct _SMC_CACHE_CREATE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_CREATE_INFORMATION_VERSION\n    ULONG Spare : 24;\n    ULONG CacheId;\n    SMC_CACHE_CREATE_PARAMETERS CacheCreateParams;\n} SMC_CACHE_CREATE_REQUEST, *PSMC_CACHE_CREATE_REQUEST;\n\n#define SYSTEM_CACHE_DELETE_INFORMATION_VERSION 1\n\ntypedef struct _SMC_CACHE_DELETE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_DELETE_INFORMATION_VERSION\n    ULONG Spare : 24;\n    ULONG CacheId;\n} SMC_CACHE_DELETE_REQUEST, *PSMC_CACHE_DELETE_REQUEST;\n\n#define SYSTEM_CACHE_STORE_CREATE_INFORMATION_VERSION 2\n\ntypedef enum _SM_STORE_MANAGER_TYPE\n{\n    SmStoreManagerTypePhysical=0,\n    SmStoreManagerTypeVirtual=1,\n    SmStoreManagerTypeMax=2\n} SM_STORE_MANAGER_TYPE;\n\ntypedef struct _SMC_STORE_CREATE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_STORE_CREATE_INFORMATION_VERSION\n    ULONG Spare : 24;\n    SM_STORE_BASIC_PARAMS StoreParams;\n    ULONG CacheId;\n    SM_STORE_MANAGER_TYPE StoreManagerType;\n    ULONG StoreId;\n} SMC_STORE_CREATE_REQUEST, *PSMC_STORE_CREATE_REQUEST;\n\n#define SYSTEM_CACHE_STORE_DELETE_INFORMATION_VERSION 1\n\ntypedef struct _SMC_STORE_DELETE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_STORE_DELETE_INFORMATION_VERSION\n    ULONG Spare : 24;\n    ULONG CacheId;\n    SM_STORE_MANAGER_TYPE StoreManagerType;\n    ULONG StoreId;\n} SMC_STORE_DELETE_REQUEST, *PSMC_STORE_DELETE_REQUEST;\n\n#define SYSTEM_CACHE_STATS_INFORMATION_VERSION 3\n\ntypedef struct _SMC_CACHE_STATS\n{\n    SIZE_T TotalFileSize;\n    ULONG StoreCount;\n    ULONG RegionCount;\n    ULONG RegionSizeBytes;\n    ULONG FileCount : 6;\n    ULONG PerformsFileIo : 1;\n    ULONG Spare : 25;\n    ULONG StoreIds[16];\n    ULONG PhysicalStoreBitmap;\n    ULONG Priority;\n    WCHAR TemplateFilePath[512];\n} SMC_CACHE_STATS, *PSMC_CACHE_STATS;\n\ntypedef struct _SMC_CACHE_STATS_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_STATS_INFORMATION_VERSION\n    ULONG NoFilePath : 1;\n    ULONG Spare : 23;\n    ULONG CacheId;\n    SMC_CACHE_STATS CacheStats;\n} SMC_CACHE_STATS_REQUEST, *PSMC_CACHE_STATS_REQUEST;\n\n#define SYSTEM_STORE_REGISTRATION_INFORMATION_VERSION 2\n\ntypedef struct _SM_REGISTRATION_INFO\n{\n    HANDLE CachesUpdatedEvent;\n} SM_REGISTRATION_INFO, *PSM_REGISTRATION_INFO;\n\ntypedef struct _SM_REGISTRATION_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_REGISTRATION_INFORMATION_VERSION\n    ULONG Spare : 24;\n    SM_REGISTRATION_INFO RegInfo;\n} SM_REGISTRATION_REQUEST, *PSM_REGISTRATION_REQUEST;\n\n#define SYSTEM_STORE_RESIZE_INFORMATION_VERSION 6\n\ntypedef struct _SM_STORE_RESIZE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_RESIZE_INFORMATION_VERSION\n    ULONG AddRegions : 1;\n    ULONG Spare : 23;\n    ULONG StoreId;\n    ULONG NumberOfRegions;\n    PRTL_BITMAP RegionBitmap;\n} SM_STORE_RESIZE_REQUEST, *PSM_STORE_RESIZE_REQUEST;\n\n#define SYSTEM_CACHE_STORE_RESIZE_INFORMATION_VERSION 1\n\ntypedef struct _SM_STORE_CACHE_RESIZE_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_CACHE_STORE_RESIZE_INFORMATION_VERSION\n    ULONG AddRegions : 1;\n    ULONG Spare : 23;\n    ULONG CacheId;\n    ULONG StoreId;\n    SM_STORE_MANAGER_TYPE StoreManagerType;\n    ULONG RegionCount;\n} SM_STORE_CACHE_RESIZE_REQUEST, *PSM_STORE_CACHE_RESIZE_REQUEST;\n\n#define SYSTEM_STORE_CONFIG_INFORMATION_VERSION 4\n\ntypedef enum _SM_CONFIG_TYPE\n{\n    SmConfigDirtyPageCompression = 0,\n    SmConfigAsyncInswap = 1,\n    SmConfigPrefetchSeekThreshold = 2,\n    SmConfigTypeMax = 3\n} SM_CONFIG_TYPE;\n\ntypedef struct _SM_CONFIG_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_CONFIG_INFORMATION_VERSION\n    ULONG Spare : 16;\n    ULONG ConfigType : 8; // SM_CONFIG_TYPE\n    ULONG ConfigValue;\n} SM_CONFIG_REQUEST, *PSM_CONFIG_REQUEST;\n\n#define SYSTEM_STORE_HIGH_MEM_PRIORITY_INFORMATION_VERSION 1\n\n// rev\ntypedef struct _SM_STORE_HIGH_MEMORY_PRIORITY_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_HIGH_MEMORY_PRIORITY_INFORMATION_VERSION\n    ULONG SetHighMemoryPriority : 1;\n    ULONG Spare : 23;\n    HANDLE ProcessHandle;\n} SM_STORE_HIGH_MEMORY_PRIORITY_REQUEST, *PSM_STORE_HIGH_MEMORY_PRIORITY_REQUEST;\n\n// rev\ntypedef struct _SM_SYSTEM_STORE_TRIM_REQUEST\n{\n    ULONG Version : 8;  // SYSTEM_STORE_TRIM_INFORMATION_VERSION\n    ULONG Spare : 24;\n    SIZE_T PagesToTrim;\n    HANDLE PartitionHandle; // since 24H2\n} SM_SYSTEM_STORE_TRIM_REQUEST, *PSM_SYSTEM_STORE_TRIM_REQUEST;\n\n// rev\n#define SYSTEM_STORE_TRIM_INFORMATION_VERSION_V1 1 // WIN10\n#define SYSTEM_STORE_TRIM_INFORMATION_VERSION_V2 2 // 24H2\n#define SYSTEM_STORE_TRIM_INFORMATION_VERSION SYSTEM_STORE_TRIM_INFORMATION_VERSION_V1\n\n// rev\n#define SYSTEM_STORE_TRIM_INFORMATION_SIZE_V1 RTL_SIZEOF_THROUGH_FIELD(SM_SYSTEM_STORE_TRIM_REQUEST, PagesToTrim) // WIN10\n#define SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2 RTL_SIZEOF_THROUGH_FIELD(SM_SYSTEM_STORE_TRIM_REQUEST, PartitionHandle) // 24H2\n#define SYSTEM_STORE_TRIM_INFORMATION_SIZE SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2\n\n#ifdef _WIN64\nstatic_assert(SYSTEM_STORE_TRIM_INFORMATION_SIZE_V1 == 16, \"SYSTEM_STORE_TRIM_INFORMATION_SIZE_V1 must equal 16\");\nstatic_assert(SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2 == 24, \"SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2 must equal 24\");\n#else\nstatic_assert(SYSTEM_STORE_TRIM_INFORMATION_SIZE_V1 == 8, \"SYSTEM_STORE_TRIM_INFORMATION_SIZE_V1 must equal 8\");\nstatic_assert(SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2 == 12, \"SYSTEM_STORE_TRIM_INFORMATION_SIZE_V2 must equal 12\");\n#endif\n\n// rev\ntypedef struct _SM_STORE_COMPRESSION_INFORMATION_REQUEST\n{\n    ULONG Version : 8; // SYSTEM_STORE_COMPRESSION_INFORMATION_VERSION\n    ULONG Spare : 24;\n    ULONG CompressionPid;\n    ULONG WorkingSetSize;\n    SIZE_T TotalDataCompressed;\n    SIZE_T TotalCompressedSize;\n    SIZE_T TotalUniqueDataCompressed;\n    HANDLE PartitionHandle; // since 24H2\n} SM_STORE_COMPRESSION_INFORMATION_REQUEST, *PSM_STORE_COMPRESSION_INFORMATION_REQUEST;\n\n// rev\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_VERSION_V1 3 // WIN10\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_VERSION_V2 4 // 24H2\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_VERSION SYSTEM_STORE_COMPRESSION_INFORMATION_VERSION_V2\n\n// rev\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V1 RTL_SIZEOF_THROUGH_FIELD(SM_STORE_COMPRESSION_INFORMATION_REQUEST, TotalUniqueDataCompressed) // WIN10\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V2 RTL_SIZEOF_THROUGH_FIELD(SM_STORE_COMPRESSION_INFORMATION_REQUEST, PartitionHandle) // 24H2\n#define SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V2\n\n#ifdef _WIN64\nstatic_assert(SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V1 == 40, \"SM_STORE_COMPRESSION_INFORMATION_REQUEST_V1 must equal 40\");\nstatic_assert(SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V2 == 48, \"SM_STORE_COMPRESSION_INFORMATION_REQUEST_V2 must equal 48\");\n#else\nstatic_assert(SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V1 == 24, \"SM_STORE_COMPRESSION_INFORMATION_REQUEST_V1 must equal 24\");\nstatic_assert(SYSTEM_STORE_COMPRESSION_INFORMATION_SIZE_V2 == 28, \"SM_STORE_COMPRESSION_INFORMATION_REQUEST_V2 must equal 28\");\n#endif\n\n// private\ntypedef struct _SYSTEM_REGISTRY_APPEND_STRING_PARAMETERS\n{\n    HANDLE KeyHandle;\n    PUNICODE_STRING ValueNamePointer;\n    PULONG RequiredLengthPointer;\n    PUCHAR Buffer;\n    ULONG BufferLength;\n    ULONG Type;\n    PUCHAR AppendBuffer;\n    ULONG AppendBufferLength;\n    BOOLEAN CreateIfDoesntExist;\n    BOOLEAN TruncateExistingValue;\n} SYSTEM_REGISTRY_APPEND_STRING_PARAMETERS, *PSYSTEM_REGISTRY_APPEND_STRING_PARAMETERS;\n\n// msdn\ntypedef struct _SYSTEM_VHD_BOOT_INFORMATION\n{\n    BOOLEAN OsDiskIsVhd;\n    ULONG OsVhdFilePathOffset;\n    WCHAR OsVhdParentVolume[1];\n} SYSTEM_VHD_BOOT_INFORMATION, *PSYSTEM_VHD_BOOT_INFORMATION;\n\n// private\ntypedef struct _PS_CPU_QUOTA_QUERY_ENTRY\n{\n    ULONG SessionId;\n    ULONG Weight;\n} PS_CPU_QUOTA_QUERY_ENTRY, *PPS_CPU_QUOTA_QUERY_ENTRY;\n\n// private\ntypedef struct _PS_CPU_QUOTA_QUERY_INFORMATION\n{\n    ULONG SessionCount;\n    PS_CPU_QUOTA_QUERY_ENTRY SessionInformation[1];\n} PS_CPU_QUOTA_QUERY_INFORMATION, *PPS_CPU_QUOTA_QUERY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ERROR_PORT_TIMEOUTS\n{\n    ULONG StartTimeout;\n    ULONG CommTimeout;\n} SYSTEM_ERROR_PORT_TIMEOUTS, *PSYSTEM_ERROR_PORT_TIMEOUTS;\n\n// private\ntypedef struct _SYSTEM_LOW_PRIORITY_IO_INFORMATION\n{\n    ULONG LowPriReadOperations;\n    ULONG LowPriWriteOperations;\n    ULONG KernelBumpedToNormalOperations;\n    ULONG LowPriPagingReadOperations;\n    ULONG KernelPagingReadsBumpedToNormal;\n    ULONG LowPriPagingWriteOperations;\n    ULONG KernelPagingWritesBumpedToNormal;\n    ULONG BoostedIrpCount;\n    ULONG BoostedPagingIrpCount;\n    ULONG BlanketBoostCount;\n} SYSTEM_LOW_PRIORITY_IO_INFORMATION, *PSYSTEM_LOW_PRIORITY_IO_INFORMATION;\n\n// symbols\ntypedef enum _BOOT_ENTROPY_SOURCE_RESULT_CODE\n{\n    BootEntropySourceStructureUninitialized,\n    BootEntropySourceDisabledByPolicy,\n    BootEntropySourceNotPresent,\n    BootEntropySourceError,\n    BootEntropySourceSuccess\n} BOOT_ENTROPY_SOURCE_RESULT_CODE;\n\ntypedef enum _BOOT_ENTROPY_SOURCE_ID\n{\n    BootEntropySourceNone = 0,\n    BootEntropySourceSeedfile = 1,\n    BootEntropySourceExternal = 2,\n    BootEntropySourceTpm = 3,\n    BootEntropySourceRdrand = 4,\n    BootEntropySourceTime = 5,\n    BootEntropySourceAcpiOem0 = 6,\n    BootEntropySourceUefi = 7,\n    BootEntropySourceCng = 8,\n    BootEntropySourceTcbTpm = 9,\n    BootEntropySourceTcbRdrand = 10,\n    BootMaxEntropySources = 10\n} BOOT_ENTROPY_SOURCE_ID, *PBOOT_ENTROPY_SOURCE_ID;\n\n// Contents of KeLoaderBlock->Extension->TpmBootEntropyResult (TPM_BOOT_ENTROPY_LDR_RESULT).\n// EntropyData is truncated to 40 bytes.\n\n// private\ntypedef struct _TPM_BOOT_ENTROPY_NT_RESULT\n{\n    ULONGLONG Policy;\n    BOOT_ENTROPY_SOURCE_RESULT_CODE ResultCode;\n    NTSTATUS ResultStatus;\n    ULONGLONG Time;\n    ULONG EntropyLength;\n    UCHAR EntropyData[40];\n} TPM_BOOT_ENTROPY_NT_RESULT, *PTPM_BOOT_ENTROPY_NT_RESULT;\n\n// private\ntypedef struct _BOOT_ENTROPY_SOURCE_NT_RESULT\n{\n    BOOT_ENTROPY_SOURCE_ID SourceId;\n    ULONG64 Policy;\n    BOOT_ENTROPY_SOURCE_RESULT_CODE ResultCode;\n    NTSTATUS ResultStatus;\n    ULONGLONG Time;\n    ULONG EntropyLength;\n    UCHAR EntropyData[64];\n} BOOT_ENTROPY_SOURCE_NT_RESULT, *PBOOT_ENTROPY_SOURCE_NT_RESULT;\n\n// private\ntypedef struct _BOOT_ENTROPY_NT_RESULT\n{\n    ULONG maxEntropySources;\n    BOOT_ENTROPY_SOURCE_NT_RESULT EntropySourceResult[10];\n    UCHAR SeedBytesForCng[48];\n} BOOT_ENTROPY_NT_RESULT, *PBOOT_ENTROPY_NT_RESULT;\n\n// private\ntypedef struct _SYSTEM_VERIFIER_COUNTERS_INFORMATION\n{\n    SYSTEM_VERIFIER_INFORMATION Legacy;\n    ULONG RaiseIrqls;\n    ULONG AcquireSpinLocks;\n    ULONG SynchronizeExecutions;\n    ULONG AllocationsWithNoTag;\n    ULONG AllocationsFailed;\n    ULONG AllocationsFailedDeliberately;\n    SIZE_T LockedBytes;\n    SIZE_T PeakLockedBytes;\n    SIZE_T MappedLockedBytes;\n    SIZE_T PeakMappedLockedBytes;\n    SIZE_T MappedIoSpaceBytes;\n    SIZE_T PeakMappedIoSpaceBytes;\n    SIZE_T PagesForMdlBytes;\n    SIZE_T PeakPagesForMdlBytes;\n    SIZE_T ContiguousMemoryBytes;\n    SIZE_T PeakContiguousMemoryBytes;\n    ULONG ExecutePoolTypes; // REDSTONE2\n    ULONG ExecutePageProtections;\n    ULONG ExecutePageMappings;\n    ULONG ExecuteWriteSections;\n    ULONG SectionAlignmentFailures;\n    ULONG UnsupportedRelocs;\n    ULONG IATInExecutableSection;\n} SYSTEM_VERIFIER_COUNTERS_INFORMATION, *PSYSTEM_VERIFIER_COUNTERS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ACPI_AUDIT_INFORMATION\n{\n    ULONG RsdpCount;\n    ULONG SameRsdt : 1;\n    ULONG SlicPresent : 1;\n    ULONG SlicDifferent : 1;\n} SYSTEM_ACPI_AUDIT_INFORMATION, *PSYSTEM_ACPI_AUDIT_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_BASIC_PERFORMANCE_INFORMATION\n{\n    SIZE_T AvailablePages;\n    SIZE_T CommittedPages;\n    SIZE_T CommitLimit;\n    SIZE_T PeakCommitment;\n} SYSTEM_BASIC_PERFORMANCE_INFORMATION, *PSYSTEM_BASIC_PERFORMANCE_INFORMATION;\n\n// begin_msdn\n\ntypedef struct _QUERY_PERFORMANCE_COUNTER_FLAGS\n{\n    union\n    {\n        struct\n        {\n            ULONG KernelTransition : 1;\n            ULONG Reserved : 31;\n        };\n        ULONG ul;\n    };\n} QUERY_PERFORMANCE_COUNTER_FLAGS;\n\ntypedef struct _SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION\n{\n    ULONG Version;\n    QUERY_PERFORMANCE_COUNTER_FLAGS Flags;\n    QUERY_PERFORMANCE_COUNTER_FLAGS ValidFlags;\n} SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION, *PSYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION;\n\n// end_msdn\n\n// private\ntypedef enum _SYSTEM_PIXEL_FORMAT\n{\n    SystemPixelFormatUnknown,\n    SystemPixelFormatR8G8B8,\n    SystemPixelFormatR8G8B8X8,\n    SystemPixelFormatB8G8R8,\n    SystemPixelFormatB8G8R8X8\n} SYSTEM_PIXEL_FORMAT;\n\n// private\ntypedef struct _SYSTEM_BOOT_GRAPHICS_INFORMATION\n{\n    LARGE_INTEGER FrameBuffer;\n    ULONG Width;\n    ULONG Height;\n    ULONG PixelStride;\n    ULONG Flags;\n    SYSTEM_PIXEL_FORMAT Format;\n    ULONG DisplayRotation;\n} SYSTEM_BOOT_GRAPHICS_INFORMATION, *PSYSTEM_BOOT_GRAPHICS_INFORMATION;\n\n// private\ntypedef struct _MEMORY_SCRUB_INFORMATION\n{\n    HANDLE Handle;\n    SIZE_T PagesScrubbed;\n} MEMORY_SCRUB_INFORMATION, *PMEMORY_SCRUB_INFORMATION;\n\n// private\ntypedef union _SYSTEM_BAD_PAGE_INFORMATION\n{\n#ifdef _WIN64\n    ULONG_PTR PhysicalPageNumber : 52;\n#else\n    ULONG PhysicalPageNumber : 20;\n#endif\n    ULONG_PTR Reserved : 10;\n    ULONG_PTR Pending : 1;\n    ULONG_PTR Poisoned : 1;\n} SYSTEM_BAD_PAGE_INFORMATION, *PSYSTEM_BAD_PAGE_INFORMATION;\n\n// private\ntypedef struct _PEBS_DS_SAVE_AREA32\n{\n    ULONG BtsBufferBase;\n    ULONG BtsIndex;\n    ULONG BtsAbsoluteMaximum;\n    ULONG BtsInterruptThreshold;\n    ULONG PebsBufferBase;\n    ULONG PebsIndex;\n    ULONG PebsAbsoluteMaximum;\n    ULONG PebsInterruptThreshold;\n    ULONG PebsGpCounterReset[8];\n    ULONG PebsFixedCounterReset[4];\n} PEBS_DS_SAVE_AREA32, *PPEBS_DS_SAVE_AREA32;\n\n// private\ntypedef struct _PEBS_DS_SAVE_AREA64\n{\n    ULONGLONG BtsBufferBase;\n    ULONGLONG BtsIndex;\n    ULONGLONG BtsAbsoluteMaximum;\n    ULONGLONG BtsInterruptThreshold;\n    ULONGLONG PebsBufferBase;\n    ULONGLONG PebsIndex;\n    ULONGLONG PebsAbsoluteMaximum;\n    ULONGLONG PebsInterruptThreshold;\n    ULONGLONG PebsGpCounterReset[8];\n    ULONGLONG PebsFixedCounterReset[4];\n} PEBS_DS_SAVE_AREA64, *PPEBS_DS_SAVE_AREA64;\n\n// private\ntypedef union _PEBS_DS_SAVE_AREA\n{\n    PEBS_DS_SAVE_AREA32 As32Bit;\n    PEBS_DS_SAVE_AREA64 As64Bit;\n} PEBS_DS_SAVE_AREA, *PPEBS_DS_SAVE_AREA;\n\n// private\ntypedef struct _PROCESSOR_PROFILE_CONTROL_AREA\n{\n    PEBS_DS_SAVE_AREA PebsDsSaveArea;\n} PROCESSOR_PROFILE_CONTROL_AREA, *PPROCESSOR_PROFILE_CONTROL_AREA;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_PROFILE_CONTROL_AREA\n{\n    PROCESSOR_PROFILE_CONTROL_AREA ProcessorProfileControlArea;\n    BOOLEAN Allocate;\n} SYSTEM_PROCESSOR_PROFILE_CONTROL_AREA, *PSYSTEM_PROCESSOR_PROFILE_CONTROL_AREA;\n\n// private\ntypedef struct _MEMORY_COMBINE_INFORMATION\n{\n    HANDLE Handle;\n    SIZE_T PagesCombined;\n} MEMORY_COMBINE_INFORMATION, *PMEMORY_COMBINE_INFORMATION;\n\n// rev\n#define MEMORY_COMBINE_FLAGS_COMMON_PAGES_ONLY 0x4\n\n// private\ntypedef struct _MEMORY_COMBINE_INFORMATION_EX\n{\n    HANDLE Handle;\n    SIZE_T PagesCombined;\n    ULONG Flags;\n} MEMORY_COMBINE_INFORMATION_EX, *PMEMORY_COMBINE_INFORMATION_EX;\n\n// private\ntypedef struct _MEMORY_COMBINE_INFORMATION_EX2\n{\n    HANDLE Handle;\n    SIZE_T PagesCombined;\n    ULONG Flags;\n    HANDLE ProcessHandle;\n} MEMORY_COMBINE_INFORMATION_EX2, *PMEMORY_COMBINE_INFORMATION_EX2;\n\n// private\ntypedef struct _SYSTEM_ENTROPY_TIMING_INFORMATION\n{\n    VOID (NTAPI *EntropyRoutine)(PVOID, ULONG);\n    VOID (NTAPI *InitializationRoutine)(PVOID, ULONG, PVOID);\n    PVOID InitializationContext;\n} SYSTEM_ENTROPY_TIMING_INFORMATION, *PSYSTEM_ENTROPY_TIMING_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_CONSOLE_INFORMATION\n{\n    ULONG DriverLoaded : 1;\n    ULONG Spare : 31;\n} SYSTEM_CONSOLE_INFORMATION, *PSYSTEM_CONSOLE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PLATFORM_BINARY_INFORMATION\n{\n    ULONG64 PhysicalAddress;\n    PVOID HandoffBuffer;\n    PVOID CommandLineBuffer;\n    ULONG HandoffBufferSize;\n    ULONG CommandLineBufferSize;\n} SYSTEM_PLATFORM_BINARY_INFORMATION, *PSYSTEM_PLATFORM_BINARY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_POLICY_INFORMATION\n{\n    PVOID InputData;\n    PVOID OutputData;\n    ULONG InputDataSize;\n    ULONG OutputDataSize;\n    ULONG Version;\n} SYSTEM_POLICY_INFORMATION, *PSYSTEM_POLICY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_PROCESSOR_COUNT_INFORMATION\n{\n    ULONG NumberOfLogicalProcessors;\n    ULONG NumberOfCores;\n} SYSTEM_HYPERVISOR_PROCESSOR_COUNT_INFORMATION, *PSYSTEM_HYPERVISOR_PROCESSOR_COUNT_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_DEVICE_DATA_INFORMATION\n{\n    UNICODE_STRING DeviceId;\n    UNICODE_STRING DataName;\n    ULONG DataType;\n    ULONG DataBufferLength;\n    PVOID DataBuffer;\n} SYSTEM_DEVICE_DATA_INFORMATION, *PSYSTEM_DEVICE_DATA_INFORMATION;\n\n// private\ntypedef struct _PHYSICAL_CHANNEL_RUN\n{\n    ULONG NodeNumber;\n    ULONG ChannelNumber;\n    ULONGLONG BasePage;\n    ULONGLONG PageCount;\n    ULONG Flags;\n} PHYSICAL_CHANNEL_RUN, *PPHYSICAL_CHANNEL_RUN;\n\n// private\ntypedef struct _SYSTEM_MEMORY_TOPOLOGY_INFORMATION\n{\n    ULONGLONG NumberOfRuns;\n    ULONG NumberOfNodes;\n    ULONG NumberOfChannels;\n    PHYSICAL_CHANNEL_RUN Run[1];\n} SYSTEM_MEMORY_TOPOLOGY_INFORMATION, *PSYSTEM_MEMORY_TOPOLOGY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_MEMORY_CHANNEL_INFORMATION\n{\n    ULONG ChannelNumber;\n    ULONG ChannelHeatIndex;\n    ULONGLONG TotalPageCount;\n    ULONGLONG ZeroPageCount;\n    ULONGLONG FreePageCount;\n    ULONGLONG StandbyPageCount;\n} SYSTEM_MEMORY_CHANNEL_INFORMATION, *PSYSTEM_MEMORY_CHANNEL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_BOOT_LOGO_INFORMATION\n{\n    ULONG Flags;\n    ULONG BitmapOffset;\n} SYSTEM_BOOT_LOGO_INFORMATION, *PSYSTEM_BOOT_LOGO_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_EX\n{\n    LARGE_INTEGER IdleTime;\n    LARGE_INTEGER KernelTime;\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER DpcTime;\n    LARGE_INTEGER InterruptTime;\n    ULONG InterruptCount;\n    ULONG Spare0;\n    LARGE_INTEGER AvailableTime;\n    LARGE_INTEGER Spare1;\n    LARGE_INTEGER Spare2;\n} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_EX, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_EX;\n\n// private\ntypedef struct _CRITICAL_PROCESS_EXCEPTION_DATA\n{\n    GUID ReportId;\n    UNICODE_STRING ModuleName;\n    ULONG ModuleTimestamp;\n    ULONG ModuleSize;\n    ULONG_PTR Offset;\n} CRITICAL_PROCESS_EXCEPTION_DATA, *PCRITICAL_PROCESS_EXCEPTION_DATA;\n\n// private\ntypedef struct _SYSTEM_SECUREBOOT_POLICY_INFORMATION\n{\n    GUID PolicyPublisher;\n    ULONG PolicyVersion;\n    ULONG PolicyOptions;\n} SYSTEM_SECUREBOOT_POLICY_INFORMATION, *PSYSTEM_SECUREBOOT_POLICY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PAGEFILE_INFORMATION_EX\n{\n    union // HACK union declaration for convenience (dmex)\n    {\n        SYSTEM_PAGEFILE_INFORMATION Info;\n        struct\n        {\n            ULONG NextEntryOffset;\n            ULONG TotalSize;\n            ULONG TotalInUse;\n            ULONG PeakUsage;\n            UNICODE_STRING PageFileName;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n\n    ULONG MinimumSize;\n    ULONG MaximumSize;\n} SYSTEM_PAGEFILE_INFORMATION_EX, *PSYSTEM_PAGEFILE_INFORMATION_EX;\n\n// private\ntypedef struct _SYSTEM_SECUREBOOT_INFORMATION\n{\n    BOOLEAN SecureBootEnabled;\n    BOOLEAN SecureBootCapable;\n} SYSTEM_SECUREBOOT_INFORMATION, *PSYSTEM_SECUREBOOT_INFORMATION;\n\n// private\ntypedef struct _PROCESS_DISK_COUNTERS\n{\n    ULONGLONG BytesRead;\n    ULONGLONG BytesWritten;\n    ULONGLONG ReadOperationCount;\n    ULONGLONG WriteOperationCount;\n    ULONGLONG FlushOperationCount;\n} PROCESS_DISK_COUNTERS, *PPROCESS_DISK_COUNTERS;\n\n// private\ntypedef union _ENERGY_STATE_DURATION\n{\n    ULONGLONG Value;\n    struct\n    {\n        ULONG LastChangeTime;\n        ULONG Duration : 31;\n        ULONG IsInState : 1;\n    } DUMMYSTRUCTNAME;\n} ENERGY_STATE_DURATION, *PENERGY_STATE_DURATION;\n\ntypedef struct _PROCESS_ENERGY_VALUES\n{\n    ULONGLONG Cycles[4][2];\n    ULONGLONG DiskEnergy;\n    ULONGLONG NetworkTailEnergy;\n    ULONGLONG MBBTailEnergy;\n    ULONGLONG NetworkTxRxBytes;\n    ULONGLONG MBBTxRxBytes;\n    union\n    {\n        ENERGY_STATE_DURATION Durations[3];\n        struct\n        {\n            ENERGY_STATE_DURATION ForegroundDuration;\n            ENERGY_STATE_DURATION DesktopVisibleDuration;\n            ENERGY_STATE_DURATION PSMForegroundDuration;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    ULONG CompositionRendered;\n    ULONG CompositionDirtyGenerated;\n    ULONG CompositionDirtyPropagated;\n    ULONG Reserved1;\n    ULONGLONG AttributedCycles[4][2];\n    ULONGLONG WorkOnBehalfCycles[4][2];\n} PROCESS_ENERGY_VALUES, *PPROCESS_ENERGY_VALUES;\n\ntypedef union _TIMELINE_BITMAP\n{\n    ULONGLONG Value;\n    struct\n    {\n        ULONG EndTime;\n        ULONG Bitmap;\n    };\n} TIMELINE_BITMAP, *PTIMELINE_BITMAP;\n\ntypedef struct _PROCESS_ENERGY_VALUES_EXTENSION\n{\n    union\n    {\n        TIMELINE_BITMAP Timelines[14]; // 9 for REDSTONE2, 14 for REDSTONE3/4/5\n        struct\n        {\n            TIMELINE_BITMAP CpuTimeline;\n            TIMELINE_BITMAP DiskTimeline;\n            TIMELINE_BITMAP NetworkTimeline;\n            TIMELINE_BITMAP MBBTimeline;\n            TIMELINE_BITMAP ForegroundTimeline;\n            TIMELINE_BITMAP DesktopVisibleTimeline;\n            TIMELINE_BITMAP CompositionRenderedTimeline;\n            TIMELINE_BITMAP CompositionDirtyGeneratedTimeline;\n            TIMELINE_BITMAP CompositionDirtyPropagatedTimeline;\n            TIMELINE_BITMAP InputTimeline; // REDSTONE3\n            TIMELINE_BITMAP AudioInTimeline;\n            TIMELINE_BITMAP AudioOutTimeline;\n            TIMELINE_BITMAP DisplayRequiredTimeline;\n            TIMELINE_BITMAP KeyboardInputTimeline;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n\n    union // REDSTONE3\n    {\n        ENERGY_STATE_DURATION Durations[5];\n        struct\n        {\n            ENERGY_STATE_DURATION InputDuration;\n            ENERGY_STATE_DURATION AudioInDuration;\n            ENERGY_STATE_DURATION AudioOutDuration;\n            ENERGY_STATE_DURATION DisplayRequiredDuration;\n            ENERGY_STATE_DURATION PSMBackgroundDuration;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n\n    ULONG KeyboardInput;\n    ULONG MouseInput;\n} PROCESS_ENERGY_VALUES_EXTENSION, *PPROCESS_ENERGY_VALUES_EXTENSION;\n\ntypedef struct _PROCESS_EXTENDED_ENERGY_VALUES\n{\n    PROCESS_ENERGY_VALUES Base;\n    PROCESS_ENERGY_VALUES_EXTENSION Extension;\n} PROCESS_EXTENDED_ENERGY_VALUES, *PPROCESS_EXTENDED_ENERGY_VALUES;\n\n// private\ntypedef enum _SYSTEM_PROCESS_CLASSIFICATION\n{\n    SystemProcessClassificationNormal,\n    SystemProcessClassificationSystem,\n    SystemProcessClassificationSecureSystem,\n    SystemProcessClassificationMemCompression,\n    SystemProcessClassificationRegistry, // REDSTONE4\n    SystemProcessClassificationMaximum\n} SYSTEM_PROCESS_CLASSIFICATION;\n\n// private\ntypedef struct _SYSTEM_PROCESS_INFORMATION_EXTENSION\n{\n    PROCESS_DISK_COUNTERS DiskCounters;\n    ULONGLONG ContextSwitches;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG HasStrongId : 1;\n            ULONG Classification : 4; // SYSTEM_PROCESS_CLASSIFICATION\n            ULONG BackgroundActivityModerated : 1;\n            ULONG Spare : 26;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    ULONG UserSidOffset;\n    ULONG PackageFullNameOffset; // since THRESHOLD\n    PROCESS_ENERGY_VALUES EnergyValues; // since THRESHOLD\n    ULONG AppIdOffset; // since THRESHOLD\n    SIZE_T SharedCommitCharge; // since THRESHOLD2\n    ULONG JobObjectId; // since REDSTONE\n    ULONG SpareUlong; // since REDSTONE\n    ULONGLONG ProcessSequenceNumber;\n} SYSTEM_PROCESS_INFORMATION_EXTENSION, *PSYSTEM_PROCESS_INFORMATION_EXTENSION;\n\n// private\ntypedef struct _SYSTEM_PORTABLE_WORKSPACE_EFI_LAUNCHER_INFORMATION\n{\n    BOOLEAN EfiLauncherEnabled;\n} SYSTEM_PORTABLE_WORKSPACE_EFI_LAUNCHER_INFORMATION, *PSYSTEM_PORTABLE_WORKSPACE_EFI_LAUNCHER_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION_EX\n{\n    BOOLEAN DebuggerAllowed;\n    BOOLEAN DebuggerEnabled;\n    BOOLEAN DebuggerPresent;\n} SYSTEM_KERNEL_DEBUGGER_INFORMATION_EX, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION_EX;\n\n// private\ntypedef struct _SYSTEM_ELAM_CERTIFICATE_INFORMATION\n{\n    HANDLE ElamDriverFile;\n} SYSTEM_ELAM_CERTIFICATE_INFORMATION, *PSYSTEM_ELAM_CERTIFICATE_INFORMATION;\n\n// private\ntypedef struct _OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V2\n{\n    ULONG Version;\n    ULONG AbnormalResetOccurred;\n    ULONG OfflineMemoryDumpCapable;\n    PVOID ResetDataAddress;\n    ULONG ResetDataSize;\n} OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V2, *POFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V2;\n\n// private\ntypedef struct _OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V1\n{\n    ULONG Version;\n    ULONG AbnormalResetOccurred;\n    ULONG OfflineMemoryDumpCapable;\n} OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V1, *POFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V1;\n\n// SYSTEM_PROCESSOR_FEATURES_INFORMATION // ProcessorFeatureBits\n#define KF_BRANCH 0x0000000000020000\n#define KF_XSTATE 0x0000000000800000\n#define KF_RDTSCP 0x0000000400000000\n#define KF_CET_SS 0x0000400000000000\n#define KF_XFD 0x0080000000000000\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_FEATURES_INFORMATION\n{\n    ULONGLONG ProcessorFeatureBits;\n    ULONGLONG Reserved[3];\n} SYSTEM_PROCESSOR_FEATURES_INFORMATION, *PSYSTEM_PROCESSOR_FEATURES_INFORMATION;\n\n// EDID v1.4 standard data format\ntypedef struct _SYSTEM_EDID_INFORMATION\n{\n    UCHAR Edid[128];\n} SYSTEM_EDID_INFORMATION, *PSYSTEM_EDID_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_MANUFACTURING_INFORMATION\n{\n    ULONG Options;\n    UNICODE_STRING ProfileName;\n} SYSTEM_MANUFACTURING_INFORMATION, *PSYSTEM_MANUFACTURING_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ENERGY_ESTIMATION_CONFIG_INFORMATION\n{\n    BOOLEAN Enabled;\n} SYSTEM_ENERGY_ESTIMATION_CONFIG_INFORMATION, *PSYSTEM_ENERGY_ESTIMATION_CONFIG_INFORMATION;\n\n// private\ntypedef struct _HV_DETAILS\n{\n    ULONG Data[4];\n} HV_DETAILS, *PHV_DETAILS;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_DETAIL_INFORMATION\n{\n    HV_DETAILS HvVendorAndMaxFunction;\n    HV_DETAILS HypervisorInterface;\n    HV_DETAILS HypervisorVersion;\n    HV_DETAILS HvFeatures;\n    HV_DETAILS HwFeatures;\n    HV_DETAILS EnlightenmentInfo;\n    HV_DETAILS ImplementationLimits;\n} SYSTEM_HYPERVISOR_DETAIL_INFORMATION, *PSYSTEM_HYPERVISOR_DETAIL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PROCESSOR_CYCLE_STATS_INFORMATION\n{\n    //\n    // First index is bucket (see: PoGetFrequencyBucket) selected based on latest frequency percent\n    // using _KPRCB.PowerState.FrequencyBucketThresholds.\n    //\n    // Second index is _KPRCB.PowerState.ArchitecturalEfficiencyClass, accounting for architecture\n    // dependent KeHeteroSystem and using _KPRCB.PowerState.EarlyBootArchitecturalEfficiencyClass\n    // instead, when appropriate.\n    //\n    ULONGLONG Cycles[4][2];\n} SYSTEM_PROCESSOR_CYCLE_STATS_INFORMATION, *PSYSTEM_PROCESSOR_CYCLE_STATS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_TPM_INFORMATION\n{\n    ULONG Flags;\n} SYSTEM_TPM_INFORMATION, *PSYSTEM_TPM_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_VSM_PROTECTION_INFORMATION\n{\n    BOOLEAN DmaProtectionsAvailable;\n    BOOLEAN DmaProtectionsInUse;\n    BOOLEAN HardwareMbecAvailable; // REDSTONE4 (CVE-2018-3639)\n    BOOLEAN ApicVirtualizationAvailable; // 20H1\n} SYSTEM_VSM_PROTECTION_INFORMATION, *PSYSTEM_VSM_PROTECTION_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_KERNEL_DEBUGGER_FLAGS\n{\n    BOOLEAN KernelDebuggerIgnoreUmExceptions;\n} SYSTEM_KERNEL_DEBUGGER_FLAGS, *PSYSTEM_KERNEL_DEBUGGER_FLAGS;\n\n// SYSTEM_CODEINTEGRITYPOLICY_INFORMATION Options\n#define CODEINTEGRITYPOLICY_OPTION_ENABLED 0x01\n#define CODEINTEGRITYPOLICY_OPTION_AUDIT 0x02\n#define CODEINTEGRITYPOLICY_OPTION_REQUIRE_WHQL 0x04\n#define CODEINTEGRITYPOLICY_OPTION_DISABLED_FLIGHTSIGNING 0x08\n#define CODEINTEGRITYPOLICY_OPTION_ENABLED_UMCI 0x10\n#define CODEINTEGRITYPOLICY_OPTION_ENABLED_UPDATE_POLICY_NOREBOOT 0x20\n#define CODEINTEGRITYPOLICY_OPTION_ENABLED_SECURE_SETTING_POLICY 0x40\n#define CODEINTEGRITYPOLICY_OPTION_ENABLED_UNSIGNED_SYSTEMINTEGRITY_POLICY 0x80\n#define CODEINTEGRITYPOLICY_OPTION_DYNAMIC_CODE_POLICY_ENABLED 0x100\n#define CODEINTEGRITYPOLICY_OPTION_RELOAD_POLICY_NO_REBOOT 0x10000000 // NtSetSystemInformation reloads SiPolicy.p7b\n#define CODEINTEGRITYPOLICY_OPTION_CONDITIONAL_LOCKDOWN 0x20000000\n#define CODEINTEGRITYPOLICY_OPTION_NOLOCKDOWN 0x40000000\n#define CODEINTEGRITYPOLICY_OPTION_LOCKDOWN 0x80000000\n\n// SYSTEM_CODEINTEGRITYPOLICY_INFORMATION HVCIOptions\n#define CODEINTEGRITYPOLICY_HVCIOPTION_ENABLED 0x01\n#define CODEINTEGRITYPOLICY_HVCIOPTION_STRICT 0x02\n#define CODEINTEGRITYPOLICY_HVCIOPTION_DEBUG 0x04\n\n// private\ntypedef struct _SYSTEM_CODEINTEGRITYPOLICY_INFORMATION\n{\n    union\n    {\n        ULONG Options;\n        struct\n        {\n            ULONG Enabled : 1;\n            ULONG Audit : 1;\n            ULONG RequireWHQL : 1;\n            ULONG DisabledFlightSigning : 1;\n            ULONG EnabledUMCI : 1;\n            ULONG EnabledUpdatePolicyNoReboot : 1;\n            ULONG EnabledSecureSettingPolicy : 1;\n            ULONG EnabledUnsignedSystemIntegrityPolicy : 1;\n            ULONG DynamicCodePolicyEnabled : 1;\n            ULONG Spare : 19;\n            ULONG ReloadPolicyNoReboot : 1;\n            ULONG ConditionalLockdown : 1;\n            ULONG NoLockdown : 1;\n            ULONG Lockdown : 1;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        ULONG HVCIOptions;\n        struct\n        {\n            ULONG HVCIEnabled : 1;\n            ULONG HVCIStrict : 1;\n            ULONG HVCIDebug : 1;\n            ULONG HVCISpare : 29;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    ULONGLONG Version;\n    GUID PolicyGuid;\n} SYSTEM_CODEINTEGRITYPOLICY_INFORMATION, *PSYSTEM_CODEINTEGRITYPOLICY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ISOLATED_USER_MODE_INFORMATION\n{\n    BOOLEAN SecureKernelRunning : 1;\n    BOOLEAN HvciEnabled : 1;\n    BOOLEAN HvciStrictMode : 1;\n    BOOLEAN DebugEnabled : 1;\n    BOOLEAN FirmwarePageProtection : 1;\n    BOOLEAN EncryptionKeyAvailable : 1;\n    BOOLEAN SpareFlags : 2;\n    BOOLEAN TrustletRunning : 1;\n    BOOLEAN HvciDisableAllowed : 1;\n    BOOLEAN HardwareEnforcedVbs : 1;\n    BOOLEAN NoSecrets : 1;\n    BOOLEAN EncryptionKeyPersistent : 1;\n    BOOLEAN HardwareEnforcedHvpt : 1;\n    BOOLEAN HardwareHvptAvailable : 1;\n    BOOLEAN SpareFlags2 : 1;\n    BOOLEAN Spare0[6];\n    ULONGLONG Spare1;\n} SYSTEM_ISOLATED_USER_MODE_INFORMATION, *PSYSTEM_ISOLATED_USER_MODE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SINGLE_MODULE_INFORMATION\n{\n    PVOID TargetModuleAddress;\n    RTL_PROCESS_MODULE_INFORMATION_EX ExInfo;\n} SYSTEM_SINGLE_MODULE_INFORMATION, *PSYSTEM_SINGLE_MODULE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_INTERRUPT_CPU_SET_INFORMATION\n{\n    ULONG Gsiv;\n    USHORT Group;\n    ULONGLONG CpuSets;\n} SYSTEM_INTERRUPT_CPU_SET_INFORMATION, *PSYSTEM_INTERRUPT_CPU_SET_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SECUREBOOT_POLICY_FULL_INFORMATION\n{\n    SYSTEM_SECUREBOOT_POLICY_INFORMATION PolicyInformation;\n    ULONG PolicySize;\n    UCHAR Policy[1];\n} SYSTEM_SECUREBOOT_POLICY_FULL_INFORMATION, *PSYSTEM_SECUREBOOT_POLICY_FULL_INFORMATION;\n\n// private\ntypedef struct _KAFFINITY_EX\n{\n    USHORT Count;\n    USHORT Size;\n    ULONG Reserved;\n    union\n    {\n        ULONG_PTR Bitmap[1];\n        ULONG_PTR StaticBitmap[32];\n    } DUMMYUNIONNAME;\n} KAFFINITY_EX, *PKAFFINITY_EX;\n\n// private\ntypedef struct _SYSTEM_ROOT_SILO_INFORMATION\n{\n    ULONG NumberOfSilos;\n    ULONG SiloIdList[1];\n} SYSTEM_ROOT_SILO_INFORMATION, *PSYSTEM_ROOT_SILO_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_CPU_SET_TAG_INFORMATION\n{\n    ULONGLONG Tag;\n    ULONGLONG CpuSets[1];\n} SYSTEM_CPU_SET_TAG_INFORMATION, *PSYSTEM_CPU_SET_TAG_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SECURE_KERNEL_HYPERGUARD_PROFILE_INFORMATION\n{\n    ULONG ExtentCount;\n    ULONG ValidStructureSize;\n    ULONG NextExtentIndex;\n    ULONG ExtentRestart;\n    ULONG CycleCount;\n    ULONG TimeoutCount;\n    ULONGLONG CycleTime;\n    ULONGLONG CycleTimeMax;\n    ULONGLONG ExtentTime;\n    ULONG ExtentTimeIndex;\n    ULONG ExtentTimeMaxIndex;\n    ULONGLONG ExtentTimeMax;\n    ULONGLONG HyperFlushTimeMax;\n    ULONGLONG TranslateVaTimeMax;\n    ULONGLONG DebugExemptionCount;\n    ULONGLONG TbHitCount;\n    ULONGLONG TbMissCount;\n    ULONGLONG VinaPendingYield;\n    ULONGLONG HashCycles;\n    ULONG HistogramOffset;\n    ULONG HistogramBuckets;\n    ULONG HistogramShift;\n    ULONG Reserved1;\n    ULONGLONG PageNotPresentCount;\n} SYSTEM_SECURE_KERNEL_HYPERGUARD_PROFILE_INFORMATION, *PSYSTEM_SECURE_KERNEL_HYPERGUARD_PROFILE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SECUREBOOT_PLATFORM_MANIFEST_INFORMATION\n{\n    ULONG PlatformManifestSize;\n    UCHAR PlatformManifest[1];\n} SYSTEM_SECUREBOOT_PLATFORM_MANIFEST_INFORMATION, *PSYSTEM_SECUREBOOT_PLATFORM_MANIFEST_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_INTERRUPT_STEERING_INFORMATION_INPUT\n{\n    ULONG Gsiv;\n    UCHAR ControllerInterrupt;\n    UCHAR EdgeInterrupt;\n    UCHAR IsPrimaryInterrupt;\n    GROUP_AFFINITY TargetAffinity;\n} SYSTEM_INTERRUPT_STEERING_INFORMATION_INPUT, *PSYSTEM_INTERRUPT_STEERING_INFORMATION_INPUT;\n\n// private\ntypedef union _SYSTEM_INTERRUPT_STEERING_INFORMATION_OUTPUT\n{\n    ULONG AsULONG;\n    struct\n    {\n        ULONG Enabled : 1;\n        ULONG Reserved : 31;\n    };\n} SYSTEM_INTERRUPT_STEERING_INFORMATION_OUTPUT, *PSYSTEM_INTERRUPT_STEERING_INFORMATION_OUTPUT;\n\n#if !defined(NTDDI_WIN10_FE) || (NTDDI_VERSION < NTDDI_WIN10_FE)\n// private\ntypedef struct _SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION\n{\n    ULONG Machine : 16;\n    ULONG KernelMode : 1;\n    ULONG UserMode : 1;\n    ULONG Native : 1;\n    ULONG Process : 1;\n    ULONG WoW64Container : 1;\n    ULONG ReservedZero0 : 11;\n} SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION, *PSYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION;\n#endif // NTDDI_WIN10_FE\n\n// private\n/**\n * The SYSTEM_MEMORY_USAGE_INFORMATION structure contains information about the memory usage of the system.\n */\ntypedef struct _SYSTEM_MEMORY_USAGE_INFORMATION\n{\n    ULONGLONG TotalPhysicalBytes;\n    ULONGLONG AvailableBytes;\n    LONGLONG ResidentAvailableBytes;\n    ULONGLONG CommittedBytes;\n    ULONGLONG SharedCommittedBytes;\n    ULONGLONG CommitLimitBytes;\n    ULONGLONG PeakCommitmentBytes;\n} SYSTEM_MEMORY_USAGE_INFORMATION, *PSYSTEM_MEMORY_USAGE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_CODEINTEGRITY_CERTIFICATE_INFORMATION\n{\n    HANDLE ImageFile;\n    ULONG Type; // REDSTONE4\n} SYSTEM_CODEINTEGRITY_CERTIFICATE_INFORMATION, *PSYSTEM_CODEINTEGRITY_CERTIFICATE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_PHYSICAL_MEMORY_INFORMATION\n{\n    ULONGLONG TotalPhysicalBytes;\n    ULONGLONG LowestPhysicalAddress;\n    ULONGLONG HighestPhysicalAddress;\n} SYSTEM_PHYSICAL_MEMORY_INFORMATION, *PSYSTEM_PHYSICAL_MEMORY_INFORMATION;\n\n// private\ntypedef enum _SYSTEM_ACTIVITY_MODERATION_STATE\n{\n    SystemActivityModerationStateSystemManaged,\n    SystemActivityModerationStateUserManagedAllowThrottling,\n    SystemActivityModerationStateUserManagedDisableThrottling,\n    MaxSystemActivityModerationState\n} SYSTEM_ACTIVITY_MODERATION_STATE;\n\n// private - REDSTONE2\ntypedef struct _SYSTEM_ACTIVITY_MODERATION_EXE_STATE // REDSTONE3: Renamed SYSTEM_ACTIVITY_MODERATION_INFO\n{\n    UNICODE_STRING ExePathNt;\n    SYSTEM_ACTIVITY_MODERATION_STATE ModerationState;\n} SYSTEM_ACTIVITY_MODERATION_EXE_STATE, *PSYSTEM_ACTIVITY_MODERATION_EXE_STATE;\n\ntypedef enum _SYSTEM_ACTIVITY_MODERATION_APP_TYPE\n{\n    SystemActivityModerationAppTypeClassic,\n    SystemActivityModerationAppTypePackaged,\n    MaxSystemActivityModerationAppType\n} SYSTEM_ACTIVITY_MODERATION_APP_TYPE;\n\n// private - REDSTONE3\ntypedef struct _SYSTEM_ACTIVITY_MODERATION_INFO\n{\n    UNICODE_STRING Identifier;\n    SYSTEM_ACTIVITY_MODERATION_STATE ModerationState;\n    SYSTEM_ACTIVITY_MODERATION_APP_TYPE AppType;\n} SYSTEM_ACTIVITY_MODERATION_INFO, *PSYSTEM_ACTIVITY_MODERATION_INFO;\n\n// rev\n#include <pshpack1.h>\ntypedef struct _SYSTEM_ACTIVITY_MODERATION_APP_SETTINGS\n{\n    LARGE_INTEGER LastUpdatedTime; // QuerySystemTime\n    SYSTEM_ACTIVITY_MODERATION_STATE ModerationState;\n    UCHAR Reserved[4];\n    SYSTEM_ACTIVITY_MODERATION_APP_TYPE AppType;\n    UCHAR Flags[4];\n} SYSTEM_ACTIVITY_MODERATION_APP_SETTINGS, *PSYSTEM_ACTIVITY_MODERATION_APP_SETTINGS;\n#include <poppack.h>\n\n// private\ntypedef struct _SYSTEM_ACTIVITY_MODERATION_USER_SETTINGS\n{\n    HANDLE UserKeyHandle;\n} SYSTEM_ACTIVITY_MODERATION_USER_SETTINGS, *PSYSTEM_ACTIVITY_MODERATION_USER_SETTINGS;\n\n// private\ntypedef struct _SYSTEM_CODEINTEGRITY_UNLOCK_INFORMATION\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG Locked : 1;\n            ULONG UnlockApplied : 1; // Unlockable field removed 19H1\n            ULONG UnlockIdValid : 1;\n            ULONG Reserved : 29;\n        };\n    };\n    UCHAR UnlockId[32]; // REDSTONE4\n} SYSTEM_CODEINTEGRITY_UNLOCK_INFORMATION, *PSYSTEM_CODEINTEGRITY_UNLOCK_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_FLUSH_INFORMATION\n{\n    ULONG SupportedFlushMethods;\n    ULONG ProcessorCacheFlushSize;\n    ULONGLONG SystemFlushCapabilities;\n    ULONGLONG Reserved[2];\n} SYSTEM_FLUSH_INFORMATION, *PSYSTEM_FLUSH_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_WRITE_CONSTRAINT_INFORMATION\n{\n    ULONG WriteConstraintPolicy;\n    ULONG Reserved;\n} SYSTEM_WRITE_CONSTRAINT_INFORMATION, *PSYSTEM_WRITE_CONSTRAINT_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_KERNEL_VA_SHADOW_INFORMATION\n{\n    union\n    {\n        ULONG KvaShadowFlags;\n        struct\n        {\n            ULONG KvaShadowEnabled : 1;\n            ULONG KvaShadowUserGlobal : 1;\n            ULONG KvaShadowPcid : 1;\n            ULONG KvaShadowInvpcid : 1;\n            ULONG KvaShadowRequired : 1; // REDSTONE4\n            ULONG KvaShadowRequiredAvailable : 1;\n            ULONG InvalidPteBit : 6;\n            ULONG L1DataCacheFlushSupported : 1;\n            ULONG L1TerminalFaultMitigationPresent : 1;\n            ULONG Reserved : 18;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} SYSTEM_KERNEL_VA_SHADOW_INFORMATION, *PSYSTEM_KERNEL_VA_SHADOW_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_CODEINTEGRITYVERIFICATION_INFORMATION\n{\n    HANDLE FileHandle;\n    ULONG ImageSize;\n    PVOID Image;\n} SYSTEM_CODEINTEGRITYVERIFICATION_INFORMATION, *PSYSTEM_CODEINTEGRITYVERIFICATION_INFORMATION;\n\n// rev\ntypedef struct _SYSTEM_HYPERVISOR_USER_SHARED_DATA\n{\n    ULONGLONG TimeUpdateLock; // QpcSystemTimeIncrement?\n    volatile ULONGLONG QpcMultiplier;\n    volatile ULONGLONG QpcBias; // HvlGetQpcBias\n} SYSTEM_HYPERVISOR_USER_SHARED_DATA, *PSYSTEM_HYPERVISOR_USER_SHARED_DATA;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_SHARED_PAGE_INFORMATION\n{\n    PSYSTEM_HYPERVISOR_USER_SHARED_DATA HypervisorSharedUserVa;\n} SYSTEM_HYPERVISOR_SHARED_PAGE_INFORMATION, *PSYSTEM_HYPERVISOR_SHARED_PAGE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_FIRMWARE_PARTITION_INFORMATION\n{\n    UNICODE_STRING FirmwarePartition;\n} SYSTEM_FIRMWARE_PARTITION_INFORMATION, *PSYSTEM_FIRMWARE_PARTITION_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SPECULATION_CONTROL_INFORMATION\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG BpbEnabled : 1;\n            ULONG BpbDisabledSystemPolicy : 1;\n            ULONG BpbDisabledNoHardwareSupport : 1;\n            ULONG SpecCtrlEnumerated : 1;\n            ULONG SpecCmdEnumerated : 1;\n            ULONG IbrsPresent : 1;\n            ULONG StibpPresent : 1;\n            ULONG SmepPresent : 1;\n            ULONG SpeculativeStoreBypassDisableAvailable : 1; // REDSTONE4 (CVE-2018-3639)\n            ULONG SpeculativeStoreBypassDisableSupported : 1;\n            ULONG SpeculativeStoreBypassDisabledSystemWide : 1;\n            ULONG SpeculativeStoreBypassDisabledKernel : 1;\n            ULONG SpeculativeStoreBypassDisableRequired : 1;\n            ULONG BpbDisabledKernelToUser : 1;\n            ULONG SpecCtrlRetpolineEnabled : 1;\n            ULONG SpecCtrlImportOptimizationEnabled : 1;\n            ULONG EnhancedIbrs : 1; // since 19H1\n            ULONG HvL1tfStatusAvailable : 1;\n            ULONG HvL1tfProcessorNotAffected : 1;\n            ULONG HvL1tfMigitationEnabled : 1;\n            ULONG HvL1tfMigitationNotEnabled_Hardware : 1;\n            ULONG HvL1tfMigitationNotEnabled_LoadOption : 1;\n            ULONG HvL1tfMigitationNotEnabled_CoreScheduler : 1;\n            ULONG EnhancedIbrsReported : 1;\n            ULONG MdsHardwareProtected : 1; // since 19H2\n            ULONG MbClearEnabled : 1;\n            ULONG MbClearReported : 1;\n            ULONG ReservedTaa : 4;\n            ULONG Reserved : 1;\n        };\n    } SpeculationControlFlags;\n    union\n    {\n        ULONG Flags; // since 23H2\n        struct\n        {\n            ULONG SbdrSsdpHardwareProtected : 1;\n            ULONG FbsdpHardwareProtected : 1;\n            ULONG PsdpHardwareProtected : 1;\n            ULONG FbClearEnabled : 1;\n            ULONG FbClearReported : 1;\n            ULONG BhbEnabled : 1;\n            ULONG BhbDisabledSystemPolicy : 1;\n            ULONG BhbDisabledNoHardwareSupport : 1;\n            ULONG BranchConfusionStatus : 2;\n            ULONG BranchConfusionReported : 1;\n            ULONG RdclHardwareProtectedReported : 1;\n            ULONG RdclHardwareProtected : 1;\n            ULONG Reserved3 : 4;\n            ULONG Reserved4 : 3;\n            ULONG DivideByZeroReported : 1;\n            ULONG DivideByZeroStatus : 1;\n            ULONG Reserved5 : 3;\n            ULONG Reserved : 7;\n        };\n    } SpeculationControlFlags2;\n} SYSTEM_SPECULATION_CONTROL_INFORMATION, *PSYSTEM_SPECULATION_CONTROL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_DMA_GUARD_POLICY_INFORMATION\n{\n    BOOLEAN DmaGuardPolicyEnabled;\n} SYSTEM_DMA_GUARD_POLICY_INFORMATION, *PSYSTEM_DMA_GUARD_POLICY_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ENCLAVE_LAUNCH_CONTROL_INFORMATION\n{\n    UCHAR EnclaveLaunchSigner[32];\n} SYSTEM_ENCLAVE_LAUNCH_CONTROL_INFORMATION, *PSYSTEM_ENCLAVE_LAUNCH_CONTROL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_WORKLOAD_ALLOWED_CPU_SET_INFORMATION\n{\n    ULONGLONG WorkloadClass;\n    ULONGLONG CpuSets[1];\n} SYSTEM_WORKLOAD_ALLOWED_CPU_SET_INFORMATION, *PSYSTEM_WORKLOAD_ALLOWED_CPU_SET_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SECURITY_MODEL_INFORMATION\n{\n    union\n    {\n        ULONG SecurityModelFlags;\n        struct\n        {\n            ULONG ReservedFlag : 1; // SModeAdminlessEnabled\n            ULONG AllowDeviceOwnerProtectionDowngrade : 1;\n            ULONG Reserved : 30;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} SYSTEM_SECURITY_MODEL_INFORMATION, *PSYSTEM_SECURITY_MODEL_INFORMATION;\n\n// private\ntypedef union _SECURE_SPECULATION_CONTROL_INFORMATION\n{\n    ULONG KvaShadowSupported : 1;\n    ULONG KvaShadowEnabled : 1;\n    ULONG KvaShadowUserGlobal : 1;\n    ULONG KvaShadowPcid : 1;\n    ULONG MbClearEnabled : 1;\n    ULONG L1TFMitigated : 1; // since 20H2\n    ULONG BpbEnabled : 1;\n    ULONG IbrsPresent : 1;\n    ULONG EnhancedIbrs : 1;\n    ULONG StibpPresent : 1;\n    ULONG SsbdSupported : 1;\n    ULONG SsbdRequired : 1;\n    ULONG BpbKernelToUser : 1;\n    ULONG BpbUserToKernel : 1;\n    ULONG ReturnSpeculate : 1;\n    ULONG BranchConfusionSafe : 1;\n    ULONG SsbsEnabledAlways : 1; // 24H2\n    ULONG SsbsEnabledKernel : 1;\n    ULONG Reserved : 14;\n} SECURE_SPECULATION_CONTROL_INFORMATION, *PSECURE_SPECULATION_CONTROL_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_FIRMWARE_RAMDISK_INFORMATION\n{\n    ULONG Version;\n    ULONG BlockSize;\n    ULONG_PTR BaseAddress;\n    SIZE_T Size;\n} SYSTEM_FIRMWARE_RAMDISK_INFORMATION, *PSYSTEM_FIRMWARE_RAMDISK_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_SHADOW_STACK_INFORMATION\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG CetCapable : 1;\n            ULONG UserCetAllowed : 1;\n            ULONG ReservedForUserCet : 6;\n            ULONG KernelCetEnabled : 1;\n            ULONG KernelCetAuditModeEnabled : 1;\n            ULONG ReservedForKernelCet : 6; // since Windows 10 build 21387\n            ULONG Reserved : 16;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} SYSTEM_SHADOW_STACK_INFORMATION, *PSYSTEM_SHADOW_STACK_INFORMATION;\n\n// private\ntypedef union _SYSTEM_BUILD_VERSION_INFORMATION_FLAGS\n{\n    ULONG Value32;\n    struct\n    {\n        ULONG IsTopLevel : 1;\n        ULONG IsChecked : 1;\n    };\n} SYSTEM_BUILD_VERSION_INFORMATION_FLAGS, *PSYSTEM_BUILD_VERSION_INFORMATION_FLAGS;\n\n// private\ntypedef struct _SYSTEM_BUILD_VERSION_INFORMATION\n{\n    USHORT LayerNumber;\n    USHORT LayerCount;\n    ULONG OsMajorVersion;\n    ULONG OsMinorVersion;\n    ULONG NtBuildNumber;\n    ULONG NtBuildQfe;\n    UCHAR LayerName[128];\n    UCHAR NtBuildBranch[128];\n    UCHAR NtBuildLab[128];\n    UCHAR NtBuildLabEx[128];\n    UCHAR NtBuildStamp[26];\n    UCHAR NtBuildArch[16];\n    SYSTEM_BUILD_VERSION_INFORMATION_FLAGS Flags;\n} SYSTEM_BUILD_VERSION_INFORMATION, *PSYSTEM_BUILD_VERSION_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_POOL_LIMIT_MEM_INFO\n{\n    ULONGLONG MemoryLimit;\n    ULONGLONG NotificationLimit;\n} SYSTEM_POOL_LIMIT_MEM_INFO, *PSYSTEM_POOL_LIMIT_MEM_INFO;\n\n// private\ntypedef struct _SYSTEM_POOL_LIMIT_INFO\n{\n    ULONG PoolTag;\n    SYSTEM_POOL_LIMIT_MEM_INFO MemLimits[2];\n    WNF_STATE_NAME NotificationHandle;\n} SYSTEM_POOL_LIMIT_INFO, *PSYSTEM_POOL_LIMIT_INFO;\n\n// private\ntypedef struct _SYSTEM_POOL_LIMIT_INFORMATION\n{\n    ULONG Version;\n    ULONG EntryCount;\n    _Field_size_(EntryCount) SYSTEM_POOL_LIMIT_INFO LimitEntries[1];\n} SYSTEM_POOL_LIMIT_INFORMATION, *PSYSTEM_POOL_LIMIT_INFORMATION;\n\n// private\n//typedef struct _SYSTEM_POOL_ZEROING_INFORMATION\n//{\n//    BOOLEAN PoolZeroingSupportPresent;\n//} SYSTEM_POOL_ZEROING_INFORMATION, *PSYSTEM_POOL_ZEROING_INFORMATION;\n\n// private\ntypedef struct _HV_MINROOT_NUMA_LPS\n{\n    ULONG NodeIndex;\n    ULONG_PTR Mask[16];\n} HV_MINROOT_NUMA_LPS, *PHV_MINROOT_NUMA_LPS;\n\n// private\ntypedef struct _SYSTEM_XFG_FAILURE_INFORMATION\n{\n    PVOID ReturnAddress;\n    PVOID TargetAddress;\n    ULONG DispatchMode;\n    ULONGLONG XfgValue;\n} SYSTEM_XFG_FAILURE_INFORMATION, *PSYSTEM_XFG_FAILURE_INFORMATION;\n\n// private\ntypedef enum _SYSTEM_IOMMU_STATE\n{\n    IommuStateBlock,\n    IommuStateUnblock\n} SYSTEM_IOMMU_STATE;\n\n// private\ntypedef struct _SYSTEM_IOMMU_STATE_INFORMATION\n{\n    SYSTEM_IOMMU_STATE State;\n    PVOID Pdo;\n} SYSTEM_IOMMU_STATE_INFORMATION, *PSYSTEM_IOMMU_STATE_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_MINROOT_INFORMATION\n{\n    ULONG NumProc;\n    ULONG RootProc;\n    ULONG RootProcNumaNodesSpecified;\n    USHORT RootProcNumaNodes[64];\n    ULONG RootProcPerCore;\n    ULONG RootProcPerNode;\n    ULONG RootProcNumaNodesLpsSpecified;\n    HV_MINROOT_NUMA_LPS RootProcNumaNodeLps[64];\n} SYSTEM_HYPERVISOR_MINROOT_INFORMATION, *PSYSTEM_HYPERVISOR_MINROOT_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_HYPERVISOR_BOOT_PAGES_INFORMATION\n{\n    ULONG RangeCount;\n    ULONG_PTR RangeArray[1];\n} SYSTEM_HYPERVISOR_BOOT_PAGES_INFORMATION, *PSYSTEM_HYPERVISOR_BOOT_PAGES_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_POINTER_AUTH_INFORMATION\n{\n    union\n    {\n        USHORT SupportedFlags;\n        struct\n        {\n            USHORT AddressAuthSupported : 1;\n            USHORT AddressAuthQarma : 1;\n            USHORT GenericAuthSupported : 1;\n            USHORT GenericAuthQarma : 1;\n            USHORT AddressAuthFaulting : 1;\n            USHORT SupportedReserved : 11;\n        };\n    };\n    union\n    {\n        USHORT EnabledFlags;\n        struct\n        {\n            USHORT UserPerProcessIpAuthEnabled : 1;\n            USHORT UserGlobalIpAuthEnabled : 1;\n            USHORT UserEnabledReserved : 6;\n            USHORT KernelIpAuthEnabled : 1;\n            USHORT KernelEnabledReserved : 7;\n        };\n    };\n} SYSTEM_POINTER_AUTH_INFORMATION, *PSYSTEM_POINTER_AUTH_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_INPUT\n{\n    ULONG Version;\n    PWSTR FeatureName;\n    ULONG BornOnVersion;\n} SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_INPUT, *PSYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_INPUT;\n\n// private\ntypedef struct _SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_OUTPUT\n{\n    ULONG Version;\n    BOOLEAN FeatureIsEnabled;\n} SYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_OUTPUT, *PSYSTEM_ORIGINAL_IMAGE_FEATURE_INFORMATION_OUTPUT;\n\n// private\ntypedef struct _SYSTEM_MEMORY_NUMA_INFORMATION_INPUT\n{\n    ULONG Version;\n    ULONG TargetNodeNumber;\n    ULONG Flags;\n} SYSTEM_MEMORY_NUMA_INFORMATION_INPUT, *PSYSTEM_MEMORY_NUMA_INFORMATION_INPUT;\n\n// private\ntypedef struct _SYSTEM_MEMORY_NUMA_INFORMATION_OUTPUT\n{\n    ULONG Version;\n    ULONG Size;\n    ULONG InitiatorNode;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG IsAttached : 1;\n            ULONG Reserved : 31;\n        };\n    };\n} SYSTEM_MEMORY_NUMA_INFORMATION_OUTPUT, *PSYSTEM_MEMORY_NUMA_INFORMATION_OUTPUT;\n\n// private\ntypedef enum _SYSTEM_MEMORY_NUMA_PERFORMANCE_QUERY_DATA_TYPES\n{\n    SystemMemoryNumaPerformanceQuery_ReadLatency,\n    SystemMemoryNumaPerformanceQuery_ReadBandwidth,\n    SystemMemoryNumaPerformanceQuery_WriteLatency,\n    SystemMemoryNumaPerformanceQuery_WriteBandwidth,\n    SystemMemoryNumaPerformanceQuery_Latency,\n    SystemMemoryNumaPerformanceQuery_Bandwidth,\n    SystemMemoryNumaPerformanceQuery_AllDataTypes,\n    SystemMemoryNumaPerformanceQuery_MaxDataType\n} SYSTEM_MEMORY_NUMA_PERFORMANCE_QUERY_DATA_TYPES;\n\n// private\ntypedef struct _SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_INPUT\n{\n    ULONG Version;\n    ULONG TargetNodeNumber;\n    SYSTEM_MEMORY_NUMA_PERFORMANCE_QUERY_DATA_TYPES QueryDataType;\n    ULONG Flags;\n} SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_INPUT, *PSYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_INPUT;\n\n// private\ntypedef struct _SYSTEM_MEMORY_NUMA_PERFORMANCE_ENTRY\n{\n    ULONG InitiatorNodeNumber;\n    ULONG TargetNodeNumber;\n    SYSTEM_MEMORY_NUMA_PERFORMANCE_QUERY_DATA_TYPES DataType;\n    union\n    {\n        BOOLEAN Flags;\n        struct\n        {\n            BOOLEAN MinTransferSizeToAchieveValues : 1;\n            BOOLEAN NonSequentialTransfers : 1;\n            BOOLEAN Reserved : 6;\n        };\n    };\n    SIZE_T MinTransferSizeInBytes;\n    ULONG_PTR EntryValue;\n} SYSTEM_MEMORY_NUMA_PERFORMANCE_ENTRY, *PSYSTEM_MEMORY_NUMA_PERFORMANCE_ENTRY;\n\n// private\ntypedef struct _SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_OUTPUT\n{\n    ULONG Version;\n    ULONG Size;\n    ULONG EntryCount;\n    SYSTEM_MEMORY_NUMA_PERFORMANCE_ENTRY PerformanceEntries[1];\n} SYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_OUTPUT, *PSYSTEM_MEMORY_NUMA_PERFORMANCE_INFORMATION_OUTPUT;\n\n// private\ntypedef struct _SYSTEM_OSL_RAMDISK_ENTRY\n{\n    ULONG BlockSize;\n    ULONG_PTR BaseAddress;\n    SIZE_T Size;\n} SYSTEM_OSL_RAMDISK_ENTRY, *PSYSTEM_OSL_RAMDISK_ENTRY;\n\n// private\ntypedef struct _SYSTEM_TRUSTEDAPPS_RUNTIME_INFORMATION\n{\n    union\n    {\n        ULONGLONG Flags;\n        struct\n        {\n            ULONGLONG Supported : 1;\n            ULONGLONG Spare : 63;\n        };\n    };\n    PVOID RemoteBreakingRoutine;\n} SYSTEM_TRUSTEDAPPS_RUNTIME_INFORMATION, *PSYSTEM_TRUSTEDAPPS_RUNTIME_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_OSL_RAMDISK_INFORMATION\n{\n    ULONG Version;\n    ULONG Count;\n    SYSTEM_OSL_RAMDISK_ENTRY Entries[1];\n} SYSTEM_OSL_RAMDISK_INFORMATION, *PSYSTEM_OSL_RAMDISK_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _Out_writes_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySystemInformationEx(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_reads_bytes_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_reads_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength\n    );\n\n// SysDbg APIs\n\n// private\ntypedef enum _SYSDBG_COMMAND\n{\n    SysDbgQueryModuleInformation,\n    SysDbgQueryTraceInformation,\n    SysDbgSetTracepoint,\n    SysDbgSetSpecialCall, // PVOID\n    SysDbgClearSpecialCalls, // void\n    SysDbgQuerySpecialCalls,\n    SysDbgBreakPoint,\n    SysDbgQueryVersion, // DBGKD_GET_VERSION64\n    SysDbgReadVirtual, // SYSDBG_VIRTUAL\n    SysDbgWriteVirtual, // SYSDBG_VIRTUAL\n    SysDbgReadPhysical, // SYSDBG_PHYSICAL // 10\n    SysDbgWritePhysical, // SYSDBG_PHYSICAL\n    SysDbgReadControlSpace, // SYSDBG_CONTROL_SPACE\n    SysDbgWriteControlSpace, // SYSDBG_CONTROL_SPACE\n    SysDbgReadIoSpace, // SYSDBG_IO_SPACE\n    SysDbgWriteIoSpace, // SYSDBG_IO_SPACE\n    SysDbgReadMsr, // SYSDBG_MSR\n    SysDbgWriteMsr, // SYSDBG_MSR\n    SysDbgReadBusData, // SYSDBG_BUS_DATA\n    SysDbgWriteBusData, // SYSDBG_BUS_DATA\n    SysDbgCheckLowMemory, // 20\n    SysDbgEnableKernelDebugger,\n    SysDbgDisableKernelDebugger,\n    SysDbgGetAutoKdEnable,\n    SysDbgSetAutoKdEnable,\n    SysDbgGetPrintBufferSize,\n    SysDbgSetPrintBufferSize,\n    SysDbgGetKdUmExceptionEnable,\n    SysDbgSetKdUmExceptionEnable,\n    SysDbgGetTriageDump, // SYSDBG_TRIAGE_DUMP\n    SysDbgGetKdBlockEnable, // 30\n    SysDbgSetKdBlockEnable,\n    SysDbgRegisterForUmBreakInfo,\n    SysDbgGetUmBreakPid,\n    SysDbgClearUmBreakPid,\n    SysDbgGetUmAttachPid,\n    SysDbgClearUmAttachPid,\n    SysDbgGetLiveKernelDump, // SYSDBG_LIVEDUMP_CONTROL\n    SysDbgKdPullRemoteFile, // SYSDBG_KD_PULL_REMOTE_FILE\n    SysDbgMaxInfoClass\n} SYSDBG_COMMAND, *PSYSDBG_COMMAND;\n\ntypedef struct _SYSDBG_VIRTUAL\n{\n    PVOID Address;\n    PVOID Buffer;\n    ULONG Request;\n} SYSDBG_VIRTUAL, *PSYSDBG_VIRTUAL;\n\ntypedef struct _SYSDBG_PHYSICAL\n{\n    PHYSICAL_ADDRESS Address;\n    PVOID Buffer;\n    ULONG Request;\n} SYSDBG_PHYSICAL, *PSYSDBG_PHYSICAL;\n\ntypedef struct _SYSDBG_CONTROL_SPACE\n{\n    ULONG64 Address;\n    PVOID Buffer;\n    ULONG Request;\n    ULONG Processor;\n} SYSDBG_CONTROL_SPACE, *PSYSDBG_CONTROL_SPACE;\n\nenum _INTERFACE_TYPE;\n\ntypedef struct _SYSDBG_IO_SPACE\n{\n    ULONG64 Address;\n    PVOID Buffer;\n    ULONG Request;\n    enum _INTERFACE_TYPE InterfaceType;\n    ULONG BusNumber;\n    ULONG AddressSpace;\n} SYSDBG_IO_SPACE, *PSYSDBG_IO_SPACE;\n\ntypedef struct _SYSDBG_MSR\n{\n    ULONG Msr;\n    ULONG64 Data;\n} SYSDBG_MSR, *PSYSDBG_MSR;\n\nenum _BUS_DATA_TYPE;\n\ntypedef struct _SYSDBG_BUS_DATA\n{\n    ULONG Address;\n    PVOID Buffer;\n    ULONG Request;\n    enum _BUS_DATA_TYPE BusDataType;\n    ULONG BusNumber;\n    ULONG SlotNumber;\n} SYSDBG_BUS_DATA, *PSYSDBG_BUS_DATA;\n\n// private\ntypedef struct _SYSDBG_TRIAGE_DUMP\n{\n    ULONG Flags;\n    ULONG BugCheckCode;\n    ULONG_PTR BugCheckParam1;\n    ULONG_PTR BugCheckParam2;\n    ULONG_PTR BugCheckParam3;\n    ULONG_PTR BugCheckParam4;\n    ULONG ProcessHandles;\n    ULONG ThreadHandles;\n    PHANDLE Handles;\n} SYSDBG_TRIAGE_DUMP, *PSYSDBG_TRIAGE_DUMP;\n\n// private\ntypedef union _SYSDBG_LIVEDUMP_CONTROL_FLAGS\n{\n    struct\n    {\n        ULONG UseDumpStorageStack : 1;\n        ULONG CompressMemoryPagesData : 1;\n        ULONG IncludeUserSpaceMemoryPages : 1;\n        ULONG AbortIfMemoryPressure : 1; // REDSTONE4\n        ULONG SelectiveDump : 1; // WIN11\n        ULONG Reserved : 27;\n    };\n    ULONG AsUlong;\n} SYSDBG_LIVEDUMP_CONTROL_FLAGS, *PSYSDBG_LIVEDUMP_CONTROL_FLAGS;\n\n// private\ntypedef union _SYSDBG_LIVEDUMP_CONTROL_ADDPAGES\n{\n    struct\n    {\n        ULONG HypervisorPages : 1;\n        ULONG NonEssentialHypervisorPages : 1; // since WIN11\n        ULONG Reserved : 30;\n    };\n    ULONG AsUlong;\n} SYSDBG_LIVEDUMP_CONTROL_ADDPAGES, *PSYSDBG_LIVEDUMP_CONTROL_ADDPAGES;\n\n#define SYSDBG_LIVEDUMP_SELECTIVE_CONTROL_VERSION 1\n\n// rev\ntypedef struct _SYSDBG_LIVEDUMP_SELECTIVE_CONTROL\n{\n    ULONG Version;\n    ULONG Size;\n    union\n    {\n        ULONGLONG Flags;\n        struct\n        {\n            ULONGLONG ThreadKernelStacks : 1;\n            ULONGLONG ReservedFlags : 63;\n        };\n    };\n    ULONGLONG Reserved[4];\n} SYSDBG_LIVEDUMP_SELECTIVE_CONTROL, *PSYSDBG_LIVEDUMP_SELECTIVE_CONTROL;\n\n#define SYSDBG_LIVEDUMP_CONTROL_VERSION_1 1\n#define SYSDBG_LIVEDUMP_CONTROL_VERSION_2 2\n#define SYSDBG_LIVEDUMP_CONTROL_VERSION SYSDBG_LIVEDUMP_CONTROL_VERSION_2\n\n// private\ntypedef struct _SYSDBG_LIVEDUMP_CONTROL_V1\n{\n    ULONG Version;\n    ULONG BugCheckCode;\n    ULONG_PTR BugCheckParam1;\n    ULONG_PTR BugCheckParam2;\n    ULONG_PTR BugCheckParam3;\n    ULONG_PTR BugCheckParam4;\n    HANDLE DumpFileHandle;\n    HANDLE CancelEventHandle;\n    SYSDBG_LIVEDUMP_CONTROL_FLAGS Flags;\n    SYSDBG_LIVEDUMP_CONTROL_ADDPAGES AddPagesControl;\n} SYSDBG_LIVEDUMP_CONTROL_V1, *PSYSDBG_LIVEDUMP_CONTROL_V1;\n\n// private\ntypedef struct _SYSDBG_LIVEDUMP_CONTROL\n{\n    ULONG Version;\n    ULONG BugCheckCode;\n    ULONG_PTR BugCheckParam1;\n    ULONG_PTR BugCheckParam2;\n    ULONG_PTR BugCheckParam3;\n    ULONG_PTR BugCheckParam4;\n    HANDLE DumpFileHandle;\n    HANDLE CancelEventHandle;\n    SYSDBG_LIVEDUMP_CONTROL_FLAGS Flags;\n    SYSDBG_LIVEDUMP_CONTROL_ADDPAGES AddPagesControl;\n    PSYSDBG_LIVEDUMP_SELECTIVE_CONTROL SelectiveControl; // since WIN11\n} SYSDBG_LIVEDUMP_CONTROL, *PSYSDBG_LIVEDUMP_CONTROL;\n\n// private\ntypedef struct _SYSDBG_KD_PULL_REMOTE_FILE\n{\n    UNICODE_STRING ImageFileName;\n} SYSDBG_KD_PULL_REMOTE_FILE, *PSYSDBG_KD_PULL_REMOTE_FILE;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSystemDebugControl(\n    _In_ SYSDBG_COMMAND Command,\n    _Inout_updates_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n// Hard errors\n\ntypedef enum _HARDERROR_RESPONSE_OPTION\n{\n    OptionAbortRetryIgnore,\n    OptionOk,\n    OptionOkCancel,\n    OptionRetryCancel,\n    OptionYesNo,\n    OptionYesNoCancel,\n    OptionShutdownSystem,\n    OptionOkNoWait,\n    OptionCancelTryContinue\n} HARDERROR_RESPONSE_OPTION;\n\ntypedef enum _HARDERROR_RESPONSE\n{\n    ResponseReturnToCaller,\n    ResponseNotHandled,\n    ResponseAbort,\n    ResponseCancel,\n    ResponseIgnore,\n    ResponseNo,\n    ResponseOk,\n    ResponseRetry,\n    ResponseYes,\n    ResponseTryAgain,\n    ResponseContinue\n} HARDERROR_RESPONSE;\n\n#define HARDERROR_OVERRIDE_ERRORMODE 0x10000000\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRaiseHardError(\n    _In_ NTSTATUS ErrorStatus,\n    _In_ ULONG NumberOfParameters,\n    _In_ ULONG UnicodeStringParameterMask,\n    _In_reads_(NumberOfParameters) PULONG_PTR Parameters,\n    _In_ ULONG ValidResponseOptions,\n    _Out_ PULONG Response\n    );\n\n//\n// Kernel-user shared data\n//\n\ntypedef enum _ALTERNATIVE_ARCHITECTURE_TYPE\n{\n    StandardDesign,\n    NEC98x86,\n    EndAlternatives\n} ALTERNATIVE_ARCHITECTURE_TYPE;\n\n#define PROCESSOR_FEATURE_MAX 64\n\n#define MAX_WOW64_SHARED_ENTRIES 16\n\n//\n// Define NX support policy values.\n//\n\n#define NX_SUPPORT_POLICY_ALWAYSOFF     0\n#define NX_SUPPORT_POLICY_ALWAYSON      1\n#define NX_SUPPORT_POLICY_OPTIN         2\n#define NX_SUPPORT_POLICY_OPTOUT        3\n\n//\n// SEH chain validation policies.\n//\n\n#define SEH_VALIDATION_POLICY_ON        0\n#define SEH_VALIDATION_POLICY_OFF       1\n#define SEH_VALIDATION_POLICY_TELEMETRY 2\n#define SEH_VALIDATION_POLICY_DEFER     3\n\n//\n// Global shared data flags and manipulation macros.\n//\n\n#define SHARED_GLOBAL_FLAGS_ERROR_PORT_V                0x0\n#define SHARED_GLOBAL_FLAGS_ERROR_PORT                  \\\n    (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)\n\n#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V         0x1\n#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED           \\\n    (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V              0x2\n#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED                \\\n    (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V  0x3\n#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED    \\\n    (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_LKG_ENABLED_V               0x4\n#define SHARED_GLOBAL_FLAGS_LKG_ENABLED                 \\\n    (1UL << SHARED_GLOBAL_FLAGS_LKG_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V      0x5\n#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED        \\\n    (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_CONSOLE_BROKER_ENABLED_V    0x6\n#define SHARED_GLOBAL_FLAGS_CONSOLE_BROKER_ENABLED      \\\n    (1UL << SHARED_GLOBAL_FLAGS_CONSOLE_BROKER_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_SECURE_BOOT_ENABLED_V       0x7\n#define SHARED_GLOBAL_FLAGS_SECURE_BOOT_ENABLED         \\\n    (1UL << SHARED_GLOBAL_FLAGS_SECURE_BOOT_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_MULTI_SESSION_SKU_V         0x8\n#define SHARED_GLOBAL_FLAGS_MULTI_SESSION_SKU           \\\n    (1UL << SHARED_GLOBAL_FLAGS_MULTI_SESSION_SKU_V)\n\n#define SHARED_GLOBAL_FLAGS_MULTIUSERS_IN_SESSION_SKU_V 0x9\n#define SHARED_GLOBAL_FLAGS_MULTIUSERS_IN_SESSION_SKU   \\\n    (1UL << SHARED_GLOBAL_FLAGS_MULTIUSERS_IN_SESSION_SKU_V)\n\n#define SHARED_GLOBAL_FLAGS_STATE_SEPARATION_ENABLED_V 0xA\n#define SHARED_GLOBAL_FLAGS_STATE_SEPARATION_ENABLED   \\\n    (1UL << SHARED_GLOBAL_FLAGS_STATE_SEPARATION_ENABLED_V)\n\n#define SHARED_GLOBAL_FLAGS_SET_GLOBAL_DATA_FLAG        0x40000000\n#define SHARED_GLOBAL_FLAGS_CLEAR_GLOBAL_DATA_FLAG      0x80000000\n\n//\n// Define legal values for the SystemCall member.\n//\n\n#define SYSTEM_CALL_SYSCALL 0\n#define SYSTEM_CALL_INT_2E  1\n\n//\n// Define flags for QPC bypass information. None of these flags may be set\n// unless bypass is enabled. This is for compat with existing code which\n// compares this value to zero to detect bypass enablement.\n//\n\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_ENABLED (0x01)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_HV_PAGE (0x02)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_DISABLE_32BIT (0x04)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_MFENCE (0x10)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_LFENCE (0x20)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_A73_ERRATA (0x40)\n#define SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_RDTSCP (0x80)\n\n\ntypedef struct _KUSER_SHARED_DATA\n{\n    //\n    // Current low 32-bit of tick count and tick count multiplier.\n    //\n    // N.B. The tick count is updated each time the clock ticks.\n    //\n\n    ULONG TickCountLowDeprecated;\n    ULONG TickCountMultiplier;\n\n    //\n    // Current 64-bit interrupt time in 100ns units.\n    //\n\n    volatile KSYSTEM_TIME InterruptTime;\n\n    //\n    // Current 64-bit system time in 100ns units.\n    //\n\n    volatile KSYSTEM_TIME SystemTime;\n\n    //\n    // Current 64-bit time zone bias.\n    //\n\n    volatile KSYSTEM_TIME TimeZoneBias;\n\n    //\n    // Support image magic number range for the host system.\n    //\n    // N.B. This is an inclusive range.\n    //\n\n    USHORT ImageNumberLow;\n    USHORT ImageNumberHigh;\n\n    //\n    // Copy of system root in unicode.\n    //\n    // N.B. This field must be accessed via the RtlGetNtSystemRoot API for\n    //      an accurate result.\n    //\n\n    WCHAR NtSystemRoot[260];\n\n    //\n    // Maximum stack trace depth if tracing enabled.\n    //\n\n    ULONG MaxStackTraceDepth;\n\n    //\n    // Crypto exponent value.\n    //\n\n    ULONG CryptoExponent;\n\n    //\n    // Time zone ID.\n    //\n\n    ULONG TimeZoneId;\n\n    ULONG LargePageMinimum;\n\n    //\n    // This value controls the AIT Sampling rate.\n    //\n\n    ULONG AitSamplingValue;\n\n    //\n    // This value controls switchback processing.\n    //\n\n    ULONG AppCompatFlag;\n\n    //\n    // Current Kernel Root RNG state seed version\n    //\n\n    ULONGLONG RNGSeedVersion;\n\n    //\n    // This value controls assertion failure handling.\n    //\n\n    ULONG GlobalValidationRunlevel;\n\n    volatile LONG TimeZoneBiasStamp;\n\n    //\n    // The shared collective build number undecorated with C or F.\n    // GetVersionEx hides the real number\n    //\n\n    ULONG NtBuildNumber;\n\n    //\n    // Product type.\n    //\n    // N.B. This field must be accessed via the RtlGetNtProductType API for\n    //      an accurate result.\n    //\n\n    NT_PRODUCT_TYPE NtProductType;\n    BOOLEAN ProductTypeIsValid;\n    BOOLEAN Reserved0[1];\n    USHORT NativeProcessorArchitecture;\n\n    //\n    // The NT Version.\n    //\n    // N. B. Note that each process sees a version from its PEB, but if the\n    //       process is running with an altered view of the system version,\n    //       the following two fields are used to correctly identify the\n    //       version\n    //\n\n    ULONG NtMajorVersion;\n    ULONG NtMinorVersion;\n\n    //\n    // Processor features.\n    //\n\n    BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];\n\n    //\n    // Reserved fields - do not use.\n    //\n\n    ULONG Reserved1;\n    ULONG Reserved3;\n\n    //\n    // Time slippage while in debugger.\n    //\n\n    volatile ULONG TimeSlip;\n\n    //\n    // Alternative system architecture, e.g., NEC PC98xx on x86.\n    //\n\n    ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;\n\n    //\n    // Boot sequence, incremented for each boot attempt by the OS loader.\n    //\n\n    ULONG BootId;\n\n    //\n    // If the system is an evaluation unit, the following field contains the\n    // date and time that the evaluation unit expires. A value of 0 indicates\n    // that there is no expiration. A non-zero value is the UTC absolute time\n    // that the system expires.\n    //\n\n    LARGE_INTEGER SystemExpirationDate;\n\n    //\n    // Suite support.\n    //\n    // N.B. This field must be accessed via the RtlGetSuiteMask API for\n    //      an accurate result.\n    //\n\n    ULONG SuiteMask;\n\n    //\n    // TRUE if a kernel debugger is connected/enabled.\n    //\n\n    BOOLEAN KdDebuggerEnabled;\n\n    //\n    // Mitigation policies.\n    //\n\n    union\n    {\n        UCHAR MitigationPolicies;\n        struct\n        {\n            UCHAR NXSupportPolicy : 2;\n            UCHAR SEHValidationPolicy : 2;\n            UCHAR CurDirDevicesSkippedForDlls : 2;\n            UCHAR Reserved : 2;\n        };\n    };\n\n    //\n    // Measured duration of a single processor yield, in cycles. This is used by\n    // lock packages to determine how many times to spin waiting for a state\n    // change before blocking.\n    //\n\n    USHORT CyclesPerYield;\n\n    //\n    // Current console session Id. Always zero on non-TS systems.\n    //\n    // N.B. This field must be accessed via the RtlGetActiveConsoleId API for an\n    //      accurate result.\n    //\n\n    volatile ULONG ActiveConsoleId;\n\n    //\n    // Force-dismounts cause handles to become invalid. Rather than always\n    // probe handles, a serial number of dismounts is maintained that clients\n    // can use to see if they need to probe handles.\n    //\n\n    volatile ULONG DismountCount;\n\n    //\n    // This field indicates the status of the 64-bit COM+ package on the\n    // system. It indicates whether the Intermediate Language (IL) COM+\n    // images need to use the 64-bit COM+ runtime or the 32-bit COM+ runtime.\n    //\n\n    ULONG ComPlusPackage;\n\n    //\n    // Time in tick count for system-wide last user input across all terminal\n    // sessions. For MP performance, it is not updated all the time (e.g. once\n    // a minute per session). It is used for idle detection.\n    //\n\n    ULONG LastSystemRITEventTickCount;\n\n    //\n    // Number of physical pages in the system. This can dynamically change as\n    // physical memory can be added or removed from a running system.  This\n    // cell is too small to hold the non-truncated value on very large memory\n    // machines so code that needs the full value should access\n    // FullNumberOfPhysicalPages instead.\n    //\n\n    ULONG NumberOfPhysicalPages;\n\n    //\n    // True if the system was booted in safe boot mode.\n    //\n\n    BOOLEAN SafeBootMode;\n\n    //\n    // Virtualization flags.\n    //\n\n    union\n    {\n        UCHAR VirtualizationFlags;\n\n#if defined(_ARM64_)\n\n        //\n        // N.B. Keep this bitfield in sync with the one in arc.w.\n        //\n\n        struct\n        {\n            UCHAR ArchStartedInEl2 : 1;\n            UCHAR QcSlIsSupported : 1;\n            UCHAR : 6;\n        };\n\n#endif\n\n    };\n\n    //\n    // Reserved (available for reuse).\n    //\n\n    UCHAR Reserved12[2];\n\n    //\n    // This is a packed bitfield that contains various flags concerning\n    // the system state. They must be manipulated using interlocked\n    // operations.\n    //\n    // N.B. DbgMultiSessionSku must be accessed via the RtlIsMultiSessionSku\n    //      API for an accurate result\n    //\n\n    union\n    {\n        ULONG SharedDataFlags;\n        struct\n        {\n            //\n            // The following bit fields are for the debugger only. Do not use.\n            // Use the bit definitions instead.\n            //\n\n            ULONG DbgErrorPortPresent       : 1;\n            ULONG DbgElevationEnabled       : 1;\n            ULONG DbgVirtEnabled            : 1;\n            ULONG DbgInstallerDetectEnabled : 1;\n            ULONG DbgLkgEnabled             : 1;\n            ULONG DbgDynProcessorEnabled    : 1;\n            ULONG DbgConsoleBrokerEnabled   : 1;\n            ULONG DbgSecureBootEnabled      : 1;\n            ULONG DbgMultiSessionSku        : 1;\n            ULONG DbgMultiUsersInSessionSku : 1;\n            ULONG DbgStateSeparationEnabled : 1;\n            ULONG DbgSplitTokenEnabled      : 1;\n            ULONG DbgShadowAdminEnabled     : 1;\n            ULONG SpareBits                 : 19;\n        } DUMMYSTRUCTNAME2;\n    } DUMMYUNIONNAME2;\n\n    ULONG DataFlagsPad[1];\n\n    //\n    // Depending on the processor, the code for fast system call will differ,\n    // Stub code is provided pointers below to access the appropriate code.\n    //\n    // N.B. The following field is only used on 32-bit systems.\n    //\n\n    ULONGLONG TestRetInstruction;\n\n    LONGLONG QpcFrequency;\n\n    //\n    // On AMD64, this value is initialized to a nonzero value if the system\n    // operates with an altered view of the system service call mechanism.\n    //\n\n    ULONG SystemCall;\n\n    //\n    // Reserved field - do not use. Used to be UserCetAvailableEnvironments.\n    //\n\n    ULONG Reserved2;\n\n    //\n    // Full 64 bit version of the number of physical pages in the system.\n    // This can dynamically change as physical memory can be added or removed\n    // from a running system.\n    //\n\n    ULONGLONG FullNumberOfPhysicalPages;\n\n    //\n    // Reserved, available for reuse.\n    //\n\n    ULONGLONG SystemCallPad[1];\n\n    //\n    // The 64-bit tick count.\n    //\n\n    union\n    {\n        volatile KSYSTEM_TIME TickCount;\n        volatile ULONG64 TickCountQuad;\n        struct\n        {\n            ULONG ReservedTickCountOverlay[3];\n            ULONG TickCountPad[1];\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME3;\n\n    //\n    // Cookie for encoding pointers system wide.\n    //\n\n    ULONG Cookie;\n    ULONG CookiePad[1];\n\n    //\n    // Client id of the process having the focus in the current\n    // active console session id.\n    //\n    // N.B. This field must be accessed via the\n    //      RtlGetConsoleSessionForegroundProcessId API for an accurate result.\n    //\n\n    LONGLONG ConsoleSessionForegroundProcessId;\n\n    //\n    // N.B. The following data is used to implement the precise time\n    //      services. It is aligned on a 64-byte cache-line boundary and\n    //      arranged in the order of typical accesses.\n    //\n    // Placeholder for the (internal) time update lock.\n    //\n\n    ULONGLONG TimeUpdateLock;\n\n    //\n    // The performance counter value used to establish the current system time.\n    //\n\n    ULONGLONG BaselineSystemTimeQpc;\n\n    //\n    // The performance counter value used to compute the last interrupt time.\n    //\n\n    ULONGLONG BaselineInterruptTimeQpc;\n\n    //\n    // The scaled number of system time seconds represented by a single\n    // performance count (this value may vary to achieve time synchronization).\n    //\n\n    ULONGLONG QpcSystemTimeIncrement;\n\n    //\n    // The scaled number of interrupt time seconds represented by a single\n    // performance count (this value is constant after the system is booted).\n    //\n\n    ULONGLONG QpcInterruptTimeIncrement;\n\n    //\n    // The scaling shift count applied to the performance counter system time\n    // increment.\n    //\n\n    UCHAR QpcSystemTimeIncrementShift;\n\n    //\n    // The scaling shift count applied to the performance counter interrupt time\n    // increment.\n    //\n\n    UCHAR QpcInterruptTimeIncrementShift;\n\n    //\n    // The count of unparked processors.\n    //\n\n    USHORT UnparkedProcessorCount;\n\n    //\n    // A bitmask of enclave features supported on this system.\n    //\n    // N.B. This field must be accessed via the RtlIsEnclaveFeaturePresent API for an\n    //      accurate result.\n    //\n\n    ULONG EnclaveFeatureMask[4];\n\n    //\n    // Current coverage round for telemetry based coverage.\n    //\n\n    ULONG TelemetryCoverageRound;\n\n    //\n    // The following field is used for ETW user mode global logging\n    // (UMGL).\n    //\n\n    USHORT UserModeGlobalLogger[16];\n\n    //\n    // Settings that can enable the use of Image File Execution Options\n    // from HKCU in addition to the original HKLM.\n    //\n\n    ULONG ImageFileExecutionOptions;\n\n    //\n    // Generation of the kernel structure holding system language information\n    //\n\n    ULONG LangGenerationCount;\n\n    //\n    // Reserved (available for reuse).\n    //\n\n    ULONGLONG Reserved4;\n\n    //\n    // Current 64-bit interrupt time bias in 100ns units.\n    //\n\n    volatile ULONGLONG InterruptTimeBias;\n\n    //\n    // Current 64-bit performance counter bias, in performance counter units\n    // before the shift is applied.\n    //\n\n    volatile ULONGLONG QpcBias;\n\n    //\n    // Number of active processors and groups.\n    //\n\n    ULONG ActiveProcessorCount;\n    volatile UCHAR ActiveGroupCount;\n\n    //\n    // Reserved (available for re-use).\n    //\n\n    UCHAR Reserved9;\n\n    union\n    {\n        USHORT QpcData;\n        struct\n        {\n            //\n            // A bitfield indicating whether performance counter queries can\n            // read the counter directly (bypassing the system call) and flags.\n            //\n\n            volatile UCHAR QpcBypassEnabled;\n\n            //\n            // Reserved, leave as zero for backward compatibility. Was shift\n            // applied to the raw counter value to derive QPC count.\n            //\n\n            UCHAR QpcReserved;\n        };\n    };\n\n    LARGE_INTEGER TimeZoneBiasEffectiveStart;\n    LARGE_INTEGER TimeZoneBiasEffectiveEnd;\n\n    //\n    // Extended processor state configuration (AMD64 and x86).\n    //\n\n    XSTATE_CONFIGURATION XState;\n\n    KSYSTEM_TIME FeatureConfigurationChangeStamp;\n    ULONG Spare;\n\n    ULONG64 UserPointerAuthMask;\n\n    //\n    // Extended processor state configuration (ARM64). The reserved space for\n    // other architectures is not available for reuse.\n    //\n\n#if defined(_ARM64_)\n    XSTATE_CONFIGURATION XStateArm64;\n#else\n    ULONG Reserved10[210];\n#endif\n} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;\n\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TickCountLowDeprecated) == 0x0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TickCountMultiplier) == 0x4);\nC_ASSERT(__alignof(KSYSTEM_TIME) == 4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, InterruptTime) == 0x08);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemTime) == 0x014);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeZoneBias) == 0x020);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ImageNumberLow) == 0x02c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ImageNumberHigh) == 0x02e);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NtSystemRoot) == 0x030);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, MaxStackTraceDepth) == 0x238);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, CryptoExponent) == 0x23c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeZoneId) == 0x240);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, LargePageMinimum) == 0x244);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, AitSamplingValue) == 0x248);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, AppCompatFlag) == 0x24c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, RNGSeedVersion) == 0x250);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, GlobalValidationRunlevel) == 0x258);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeZoneBiasStamp) == 0x25c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NtBuildNumber) == 0x260);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NtProductType) == 0x264);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ProductTypeIsValid) == 0x268);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NativeProcessorArchitecture) == 0x26a);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NtMajorVersion) == 0x26c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NtMinorVersion) == 0x270);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ProcessorFeatures) == 0x274);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved1) == 0x2b4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved3) == 0x2b8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeSlip) == 0x2bc);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, AlternativeArchitecture) == 0x2c0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemExpirationDate) == 0x2c8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SuiteMask) == 0x2d0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, KdDebuggerEnabled) == 0x2d4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, MitigationPolicies) == 0x2d5);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, CyclesPerYield) == 0x2d6);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ActiveConsoleId) == 0x2d8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, DismountCount) == 0x2dc);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ComPlusPackage) == 0x2e0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, LastSystemRITEventTickCount) == 0x2e4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, NumberOfPhysicalPages) == 0x2e8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SafeBootMode) == 0x2ec);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, VirtualizationFlags) == 0x2ed);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved12) == 0x2ee);\n#if defined(_MSC_EXTENSIONS)\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SharedDataFlags) == 0x2f0);\n#endif\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TestRetInstruction) == 0x2f8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcFrequency) == 0x300);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemCall) == 0x308);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved2) == 0x30c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemCallPad) == 0x318); // previously 0x310\n#if defined(_MSC_EXTENSIONS)\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TickCount) == 0x320);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TickCountQuad) == 0x320);\n#endif\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Cookie) == 0x330);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ConsoleSessionForegroundProcessId) == 0x338);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeUpdateLock) == 0x340);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, BaselineSystemTimeQpc) == 0x348);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, BaselineInterruptTimeQpc) == 0x350);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcSystemTimeIncrement) == 0x358);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcInterruptTimeIncrement) == 0x360);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcSystemTimeIncrementShift) == 0x368);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcInterruptTimeIncrementShift) == 0x369);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, UnparkedProcessorCount) == 0x36a);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, EnclaveFeatureMask) == 0x36c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TelemetryCoverageRound) == 0x37c);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, UserModeGlobalLogger) == 0x380);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ImageFileExecutionOptions) == 0x3a0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, LangGenerationCount) == 0x3a4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved4) == 0x3a8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, InterruptTimeBias) == 0x3b0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcBias) == 0x3b8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ActiveProcessorCount) == 0x3c0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, ActiveGroupCount) == 0x3c4);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved9) == 0x3c5);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcData) == 0x3c6);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcBypassEnabled) == 0x3c6);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, QpcReserved) == 0x3c7);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeZoneBiasEffectiveStart) == 0x3c8);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, TimeZoneBiasEffectiveEnd) == 0x3d0);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, XState) == 0x3d8);\n#if !defined(NTDDI_WIN10_FE) || (NTDDI_VERSION < NTDDI_WIN10_FE)\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, FeatureConfigurationChangeStamp) == 0x710);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, UserPointerAuthMask) == 0x720);\n#if defined(_ARM64_)\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, XStateArm64) == 0x728);\n#else\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved10) == 0x728);\n#endif\n#if !defined(WINDOWS_IGNORE_PACKING_MISMATCH)\nC_ASSERT(sizeof(KUSER_SHARED_DATA) == 0xa70);\n#endif\n#else\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, FeatureConfigurationChangeStamp) == 0x720);\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, UserPointerAuthMask) == 0x730);\n#if defined(_ARM64_)\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, XStateArm64) == 0x738);\n#else\nC_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, Reserved10) == 0x738);\n#endif\n#if !defined(WINDOWS_IGNORE_PACKING_MISMATCH)\nC_ASSERT(sizeof(KUSER_SHARED_DATA) == 0xa80);\n#endif\n#endif\n\n#define USER_SHARED_DATA ((KUSER_SHARED_DATA * const)0x7ffe0000)\n\nFORCEINLINE\nULONGLONG\nNtGetTickCount64(\n    VOID\n    )\n{\n    ULARGE_INTEGER tickCount;\n\n#ifdef _WIN64\n\n    tickCount.QuadPart = USER_SHARED_DATA->TickCountQuad;\n\n#else\n\n    while (TRUE)\n    {\n        tickCount.HighPart = (ULONG)USER_SHARED_DATA->TickCount.High1Time;\n        tickCount.LowPart = USER_SHARED_DATA->TickCount.LowPart;\n\n        if (tickCount.HighPart == (ULONG)USER_SHARED_DATA->TickCount.High2Time)\n            break;\n\n        YieldProcessor();\n    }\n\n#endif\n\n    return (UInt32x32To64(tickCount.LowPart, USER_SHARED_DATA->TickCountMultiplier) >> 24) +\n        (UInt32x32To64(tickCount.HighPart, USER_SHARED_DATA->TickCountMultiplier) << 8);\n}\n\nFORCEINLINE\nULONG\nNtGetTickCount(\n    VOID\n    )\n{\n#ifdef _WIN64\n\n    return (ULONG)((USER_SHARED_DATA->TickCountQuad * USER_SHARED_DATA->TickCountMultiplier) >> 24);\n\n#else\n\n    ULARGE_INTEGER tickCount;\n\n    while (TRUE)\n    {\n        tickCount.HighPart = (ULONG)USER_SHARED_DATA->TickCount.High1Time;\n        tickCount.LowPart = USER_SHARED_DATA->TickCount.LowPart;\n\n        if (tickCount.HighPart == (ULONG)USER_SHARED_DATA->TickCount.High2Time)\n            break;\n\n        YieldProcessor();\n    }\n\n    return (ULONG)((UInt32x32To64(tickCount.LowPart, USER_SHARED_DATA->TickCountMultiplier) >> 24) +\n        UInt32x32To64((tickCount.HighPart << 8) & 0xffffffff, USER_SHARED_DATA->TickCountMultiplier));\n\n#endif\n}\n\n//\n// Locale\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDefaultLocale(\n    _In_ BOOLEAN UserProfile,\n    _Out_ PLCID DefaultLocaleId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetDefaultLocale(\n    _In_ BOOLEAN UserProfile,\n    _In_ LCID DefaultLocaleId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInstallUILanguage(\n    _Out_ LANGID *InstallUILanguageId\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushInstallUILanguage(\n    _In_ LANGID InstallUILanguage,\n    _In_ ULONG SetComittedFlag\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDefaultUILanguage(\n    _Out_ LANGID *DefaultUILanguageId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetDefaultUILanguage(\n    _In_ LANGID DefaultUILanguageId\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtIsUILanguageComitted(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// NLS\n\n// begin_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtInitializeNlsFiles(\n    _Out_ PVOID *BaseAddress,\n    _Out_ PLCID DefaultLocaleId,\n    _Out_ PLARGE_INTEGER DefaultCasingTableSize,\n    _Out_opt_ PULONG CurrentNLSVersion\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetNlsSectionPtr(\n    _In_ ULONG SectionType,\n    _In_ ULONG SectionData,\n    _In_ PVOID ContextData,\n    _Out_ PVOID *SectionPointer,\n    _Out_ PULONG SectionSize\n    );\n\n#if (PHNT_VERSION < PHNT_WINDOWS_7)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAcquireCMFViewOwnership(\n    _Out_ PULONGLONG TimeStamp,\n    _Out_ PBOOLEAN tokenTaken,\n    _In_ BOOLEAN replaceExisting\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReleaseCMFViewOwnership(\n    VOID\n    );\n\n#endif // PHNT_VERSION < PHNT_WINDOWS_7\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMapCMFModule(\n    _In_ ULONG What,\n    _In_ ULONG Index,\n    _Out_opt_ PULONG CacheIndexOut,\n    _Out_opt_ PULONG CacheFlagsOut,\n    _Out_opt_ PULONG ViewSizeOut,\n    _Out_opt_ PVOID *BaseAddress\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetMUIRegistryInfo(\n    _In_ ULONG Flags,\n    _Inout_ PULONG DataSize,\n    _Out_ PVOID Data\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// end_private\n\n//\n// Global atoms\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAddAtom(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#define ATOM_FLAG_GLOBAL 0x2\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAddAtomEx(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom,\n    _In_ ULONG Flags\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFindAtom(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteAtom(\n    _In_ RTL_ATOM Atom\n    );\n\ntypedef enum _ATOM_INFORMATION_CLASS\n{\n    AtomBasicInformation,\n    AtomTableInformation\n} ATOM_INFORMATION_CLASS;\n\ntypedef struct _ATOM_BASIC_INFORMATION\n{\n    USHORT UsageCount;\n    USHORT Flags;\n    USHORT NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} ATOM_BASIC_INFORMATION, *PATOM_BASIC_INFORMATION;\n\ntypedef struct _ATOM_TABLE_INFORMATION\n{\n    ULONG NumberOfAtoms;\n    _Field_size_(NumberOfAtoms) RTL_ATOM Atoms[1];\n} ATOM_TABLE_INFORMATION, *PATOM_TABLE_INFORMATION;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationAtom(\n    _In_ RTL_ATOM Atom,\n    _In_ ATOM_INFORMATION_CLASS AtomInformationClass,\n    _Out_writes_bytes_(AtomInformationLength) PVOID AtomInformation,\n    _In_ ULONG AtomInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n//\n// Global flags\n//\n\n#define FLG_STOP_ON_EXCEPTION 0x00000001 // uk\n#define FLG_SHOW_LDR_SNAPS 0x00000002 // uk\n#define FLG_DEBUG_INITIAL_COMMAND 0x00000004 // k\n#define FLG_STOP_ON_HUNG_GUI 0x00000008 // k\n\n#define FLG_HEAP_ENABLE_TAIL_CHECK 0x00000010 // u\n#define FLG_HEAP_ENABLE_FREE_CHECK 0x00000020 // u\n#define FLG_HEAP_VALIDATE_PARAMETERS 0x00000040 // u\n#define FLG_HEAP_VALIDATE_ALL 0x00000080 // u\n\n#define FLG_APPLICATION_VERIFIER 0x00000100 // u\n#define FLG_MONITOR_SILENT_PROCESS_EXIT 0x00000200 // uk\n#define FLG_POOL_ENABLE_TAGGING 0x00000400 // k\n#define FLG_HEAP_ENABLE_TAGGING 0x00000800 // u\n\n#define FLG_USER_STACK_TRACE_DB 0x00001000 // u,32\n#define FLG_KERNEL_STACK_TRACE_DB 0x00002000 // k,32\n#define FLG_MAINTAIN_OBJECT_TYPELIST 0x00004000 // k\n#define FLG_HEAP_ENABLE_TAG_BY_DLL 0x00008000 // u\n\n#define FLG_DISABLE_STACK_EXTENSION 0x00010000 // u\n#define FLG_ENABLE_CSRDEBUG 0x00020000 // k\n#define FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000 // k\n#define FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000 // k\n\n#define FLG_ENABLE_SYSTEM_CRIT_BREAKS 0x00100000 // u\n#define FLG_HEAP_DISABLE_COALESCING 0x00200000 // u\n#define FLG_ENABLE_CLOSE_EXCEPTIONS 0x00400000 // k\n#define FLG_ENABLE_EXCEPTION_LOGGING 0x00800000 // k\n\n#define FLG_ENABLE_HANDLE_TYPE_TAGGING 0x01000000 // k\n#define FLG_HEAP_PAGE_ALLOCS 0x02000000 // u\n#define FLG_DEBUG_INITIAL_COMMAND_EX 0x04000000 // k\n#define FLG_DISABLE_DBGPRINT 0x08000000 // k\n\n#define FLG_CRITSEC_EVENT_CREATION 0x10000000 // u\n#define FLG_LDR_TOP_DOWN 0x20000000 // u,64\n#define FLG_ENABLE_HANDLE_EXCEPTIONS 0x40000000 // k\n#define FLG_DISABLE_PROTDLLS 0x80000000 // u\n\n#define FLG_VALID_BITS 0xfffffdff\n\n#define FLG_USERMODE_VALID_BITS (FLG_STOP_ON_EXCEPTION | \\\n    FLG_SHOW_LDR_SNAPS | \\\n    FLG_HEAP_ENABLE_TAIL_CHECK | \\\n    FLG_HEAP_ENABLE_FREE_CHECK | \\\n    FLG_HEAP_VALIDATE_PARAMETERS | \\\n    FLG_HEAP_VALIDATE_ALL | \\\n    FLG_APPLICATION_VERIFIER | \\\n    FLG_HEAP_ENABLE_TAGGING | \\\n    FLG_USER_STACK_TRACE_DB | \\\n    FLG_HEAP_ENABLE_TAG_BY_DLL | \\\n    FLG_DISABLE_STACK_EXTENSION | \\\n    FLG_ENABLE_SYSTEM_CRIT_BREAKS | \\\n    FLG_HEAP_DISABLE_COALESCING | \\\n    FLG_DISABLE_PROTDLLS | \\\n    FLG_HEAP_PAGE_ALLOCS | \\\n    FLG_CRITSEC_EVENT_CREATION | \\\n    FLG_LDR_TOP_DOWN)\n\n#define FLG_BOOTONLY_VALID_BITS (FLG_KERNEL_STACK_TRACE_DB | \\\n    FLG_MAINTAIN_OBJECT_TYPELIST | \\\n    FLG_ENABLE_CSRDEBUG | \\\n    FLG_DEBUG_INITIAL_COMMAND | \\\n    FLG_DEBUG_INITIAL_COMMAND_EX | \\\n    FLG_DISABLE_PAGE_KERNEL_STACKS)\n\n#define FLG_KERNELMODE_VALID_BITS (FLG_STOP_ON_EXCEPTION | \\\n    FLG_SHOW_LDR_SNAPS | \\\n    FLG_STOP_ON_HUNG_GUI | \\\n    FLG_POOL_ENABLE_TAGGING | \\\n    FLG_ENABLE_KDEBUG_SYMBOL_LOAD | \\\n    FLG_ENABLE_CLOSE_EXCEPTIONS | \\\n    FLG_ENABLE_EXCEPTION_LOGGING | \\\n    FLG_ENABLE_HANDLE_TYPE_TAGGING | \\\n    FLG_DISABLE_DBGPRINT | \\\n    FLG_ENABLE_HANDLE_EXCEPTIONS)\n\n// Licensing\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryLicenseValue(\n    _In_ PCUNICODE_STRING ValueName,\n    _Out_opt_ PULONG Type,\n    _Out_writes_bytes_to_opt_(DataSize, *ResultDataSize) PVOID Data,\n    _In_ ULONG DataSize,\n    _Out_ PULONG ResultDataSize\n    );\n#endif\n\n//\n// Misc.\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetDefaultHardErrorPort(\n    _In_ HANDLE DefaultHardErrorPort\n    );\n\ntypedef enum _SHUTDOWN_ACTION\n{\n    ShutdownNoReboot,\n    ShutdownReboot,\n    ShutdownPowerOff,\n    ShutdownRebootForRecovery // since WIN11\n} SHUTDOWN_ACTION;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtShutdownSystem(\n    _In_ SHUTDOWN_ACTION Action\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDisplayString(\n    _In_ PCUNICODE_STRING String\n    );\n\n// Boot graphics\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDrawText(\n    _In_ PCUNICODE_STRING Text\n    );\n#endif\n\n//\n// Hot patching\n//\n\ntypedef enum _HOT_PATCH_INFORMATION_CLASS\n{\n    ManageHotPatchLoadPatch = 0, // MANAGE_HOT_PATCH_LOAD_PATCH\n    ManageHotPatchUnloadPatch = 1, // MANAGE_HOT_PATCH_UNLOAD_PATCH\n    ManageHotPatchQueryPatches = 2, // MANAGE_HOT_PATCH_QUERY_PATCHES\n    ManageHotPatchLoadPatchForUser = 3, // MANAGE_HOT_PATCH_LOAD_PATCH\n    ManageHotPatchUnloadPatchForUser = 4, // MANAGE_HOT_PATCH_UNLOAD_PATCH\n    ManageHotPatchQueryPatchesForUser = 5, // MANAGE_HOT_PATCH_QUERY_PATCHES\n    ManageHotPatchQueryActivePatches = 6, // MANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES\n    ManageHotPatchApplyImagePatch = 7, // MANAGE_HOT_PATCH_APPLY_IMAGE_PATCH\n    ManageHotPatchQuerySinglePatch = 8, // MANAGE_HOT_PATCH_QUERY_SINGLE_PATCH\n    ManageHotPatchCheckEnabled = 9, // MANAGE_HOT_PATCH_CHECK_ENABLED\n    ManageHotPatchCreatePatchSection = 10, // MANAGE_HOT_PATCH_CREATE_PATCH_SECTION\n    ManageHotPatchMax\n} HOT_PATCH_INFORMATION_CLASS;\n\ntypedef struct _HOT_PATCH_IMAGE_INFO\n{\n    ULONG CheckSum;\n    ULONG TimeDateStamp;\n} HOT_PATCH_IMAGE_INFO, *PHOT_PATCH_IMAGE_INFO;\n\ntypedef struct _MANAGE_HOT_PATCH_LOAD_PATCH\n{\n    ULONG Version;\n    UNICODE_STRING PatchPath;\n    union\n    {\n        SID Sid;\n        UCHAR Buffer[SECURITY_MAX_SID_SIZE];\n    } UserSid;\n    HOT_PATCH_IMAGE_INFO BaseInfo;\n} MANAGE_HOT_PATCH_LOAD_PATCH, *PMANAGE_HOT_PATCH_LOAD_PATCH;\n\ntypedef struct _MANAGE_HOT_PATCH_UNLOAD_PATCH\n{\n    ULONG Version;\n    HOT_PATCH_IMAGE_INFO BaseInfo;\n    union\n    {\n        SID Sid;\n        UCHAR Buffer[SECURITY_MAX_SID_SIZE];\n    } UserSid;\n} MANAGE_HOT_PATCH_UNLOAD_PATCH, *PMANAGE_HOT_PATCH_UNLOAD_PATCH;\n\ntypedef struct _MANAGE_HOT_PATCH_QUERY_PATCHES\n{\n    ULONG Version;\n    union\n    {\n        SID Sid;\n        UCHAR Buffer[SECURITY_MAX_SID_SIZE];\n    } UserSid;\n    ULONG PatchCount;\n    PUNICODE_STRING PatchPathStrings;\n    PHOT_PATCH_IMAGE_INFO BaseInfos;\n} MANAGE_HOT_PATCH_QUERY_PATCHES, *PMANAGE_HOT_PATCH_QUERY_PATCHES;\n\ntypedef struct _MANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES\n{\n    ULONG Version;\n    HANDLE ProcessHandle;\n    ULONG PatchCount;\n    PUNICODE_STRING PatchPathStrings;\n    PHOT_PATCH_IMAGE_INFO BaseInfos;\n    PULONG PatchSequenceNumbers;\n} MANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES, *PMANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES;\n\ntypedef struct _MANAGE_HOT_PATCH_APPLY_IMAGE_PATCH\n{\n    ULONG Version;\n    union\n    {\n        struct\n        {\n            ULONG ApplyReversePatches : 1;\n            ULONG ApplyForwardPatches : 1;\n            ULONG Spare : 29;\n        };\n        ULONG AllFlags;\n    };\n    HANDLE ProcessHandle;\n    PVOID BaseImageAddress;\n    PVOID PatchImageAddress;\n} MANAGE_HOT_PATCH_APPLY_IMAGE_PATCH, *PMANAGE_HOT_PATCH_APPLY_IMAGE_PATCH;\n\ntypedef struct _MANAGE_HOT_PATCH_QUERY_SINGLE_PATCH\n{\n    ULONG Version;\n    HANDLE ProcessHandle;\n    PVOID BaseAddress;\n    ULONG Flags;\n    UNICODE_STRING PatchPathString;\n} MANAGE_HOT_PATCH_QUERY_SINGLE_PATCH, *PMANAGE_HOT_PATCH_QUERY_SINGLE_PATCH;\n\ntypedef struct _MANAGE_HOT_PATCH_CHECK_ENABLED\n{\n    ULONG Version;\n    ULONG Flags;\n} MANAGE_HOT_PATCH_CHECK_ENABLED, *PMANAGE_HOT_PATCH_CHECK_ENABLED;\n\ntypedef struct _MANAGE_HOT_PATCH_CREATE_PATCH_SECTION\n{\n    ULONG Version;\n    ULONG Flags;\n    ACCESS_MASK DesiredAccess;\n    ULONG PageProtection;\n    ULONG AllocationAttributes;\n    PVOID BaseImageAddress;\n    HANDLE SectionHandle;\n} MANAGE_HOT_PATCH_CREATE_PATCH_SECTION, *PMANAGE_HOT_PATCH_CREATE_PATCH_SECTION;\n\n#ifdef WIN64\nstatic_assert(sizeof(MANAGE_HOT_PATCH_LOAD_PATCH) == 0x68, \"Size of MANAGE_HOT_PATCH_LOAD_PATCH is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_UNLOAD_PATCH) == 0x50, \"Size of MANAGE_HOT_PATCH_UNLOAD_PATCH is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_QUERY_PATCHES) == 0x60, \"Size of MANAGE_HOT_PATCH_QUERY_PATCHES is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES) == 0x30, \"Size of MANAGE_HOT_PATCH_QUERY_ACTIVE_PATCHES is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_APPLY_IMAGE_PATCH) == 0x20, \"Size of MANAGE_HOT_PATCH_APPLY_IMAGE_PATCH is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_QUERY_SINGLE_PATCH) == 0x30, \"Size of MANAGE_HOT_PATCH_QUERY_SINGLE_PATCH is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_CHECK_ENABLED) == 0x8, \"Size of MANAGE_HOT_PATCH_CHECK_ENABLED is incorrect\");\nstatic_assert(sizeof(MANAGE_HOT_PATCH_CREATE_PATCH_SECTION) == 0x28, \"Size of MANAGE_HOT_PATCH_CREATE_PATCH_SECTION is incorrect\");\n#endif // WIN64\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtManageHotPatch(\n    _In_ HOT_PATCH_INFORMATION_CLASS HotPatchInformationClass,\n    _Out_writes_bytes_opt_(HotPatchInformationLength) PVOID HotPatchInformation,\n    _In_ ULONG HotPatchInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif // _NTEXAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntgdi.h",
    "content": "/*\n * Graphics device interface support\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTGDI_H\n#define _NTGDI_H\n\n#define GDI_MAX_HANDLE_COUNT 0xFFFF // 0x4000\n\n#define GDI_HANDLE_INDEX_SHIFT 0\n#define GDI_HANDLE_INDEX_BITS 16\n#define GDI_HANDLE_INDEX_MASK 0xffff\n\n#define GDI_HANDLE_TYPE_SHIFT 16\n#define GDI_HANDLE_TYPE_BITS 5\n#define GDI_HANDLE_TYPE_MASK 0x1f\n\n#define GDI_HANDLE_ALTTYPE_SHIFT 21\n#define GDI_HANDLE_ALTTYPE_BITS 2\n#define GDI_HANDLE_ALTTYPE_MASK 0x3\n\n#define GDI_HANDLE_STOCK_SHIFT 23\n#define GDI_HANDLE_STOCK_BITS 1\n#define GDI_HANDLE_STOCK_MASK 0x1\n\n#define GDI_HANDLE_UNIQUE_SHIFT 24\n#define GDI_HANDLE_UNIQUE_BITS 8\n#define GDI_HANDLE_UNIQUE_MASK 0xff\n\n#define GDI_HANDLE_INDEX(Handle) ((ULONG)(Handle) & GDI_HANDLE_INDEX_MASK)\n#define GDI_HANDLE_TYPE(Handle) (((ULONG)(Handle) >> GDI_HANDLE_TYPE_SHIFT) & GDI_HANDLE_TYPE_MASK)\n#define GDI_HANDLE_ALTTYPE(Handle) (((ULONG)(Handle) >> GDI_HANDLE_ALTTYPE_SHIFT) & GDI_HANDLE_ALTTYPE_MASK)\n#define GDI_HANDLE_STOCK(Handle) (((ULONG)(Handle) >> GDI_HANDLE_STOCK_SHIFT)) & GDI_HANDLE_STOCK_MASK)\n\n#define GDI_MAKE_HANDLE(Index, Unique) ((ULONG)(((ULONG)(Unique) << GDI_HANDLE_INDEX_BITS) | (ULONG)(Index)))\n\n// GDI server-side types\n\n#define GDI_DEF_TYPE 0 // invalid handle\n#define GDI_DC_TYPE 1\n#define GDI_DD_DIRECTDRAW_TYPE 2\n#define GDI_DD_SURFACE_TYPE 3\n#define GDI_RGN_TYPE 4\n#define GDI_SURF_TYPE 5\n#define GDI_CLIENTOBJ_TYPE 6\n#define GDI_PATH_TYPE 7\n#define GDI_PAL_TYPE 8\n#define GDI_ICMLCS_TYPE 9\n#define GDI_LFONT_TYPE 10\n#define GDI_RFONT_TYPE 11\n#define GDI_PFE_TYPE 12\n#define GDI_PFT_TYPE 13\n#define GDI_ICMCXF_TYPE 14\n#define GDI_ICMDLL_TYPE 15\n#define GDI_BRUSH_TYPE 16\n#define GDI_PFF_TYPE 17 // unused\n#define GDI_CACHE_TYPE 18 // unused\n#define GDI_SPACE_TYPE 19\n#define GDI_DBRUSH_TYPE 20 // unused\n#define GDI_META_TYPE 21\n#define GDI_EFSTATE_TYPE 22\n#define GDI_BMFD_TYPE 23 // unused\n#define GDI_VTFD_TYPE 24 // unused\n#define GDI_TTFD_TYPE 25 // unused\n#define GDI_RC_TYPE 26 // unused\n#define GDI_TEMP_TYPE 27 // unused\n#define GDI_DRVOBJ_TYPE 28\n#define GDI_DCIOBJ_TYPE 29 // unused\n#define GDI_SPOOL_TYPE 30\n\n// GDI client-side types\n\n#define GDI_CLIENT_TYPE_FROM_HANDLE(Handle) ((ULONG)(Handle) & ((GDI_HANDLE_ALTTYPE_MASK << GDI_HANDLE_ALTTYPE_SHIFT) | \\\n    (GDI_HANDLE_TYPE_MASK << GDI_HANDLE_TYPE_SHIFT)))\n#define GDI_CLIENT_TYPE_FROM_UNIQUE(Unique) GDI_CLIENT_TYPE_FROM_HANDLE((ULONG)(Unique) << 16)\n\n#define GDI_ALTTYPE_1 (1 << GDI_HANDLE_ALTTYPE_SHIFT)\n#define GDI_ALTTYPE_2 (2 << GDI_HANDLE_ALTTYPE_SHIFT)\n#define GDI_ALTTYPE_3 (3 << GDI_HANDLE_ALTTYPE_SHIFT)\n\n#define GDI_CLIENT_BITMAP_TYPE (GDI_SURF_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_BRUSH_TYPE (GDI_BRUSH_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_CLIENTOBJ_TYPE (GDI_CLIENTOBJ_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_DC_TYPE (GDI_DC_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_FONT_TYPE (GDI_LFONT_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_PALETTE_TYPE (GDI_PAL_TYPE << GDI_HANDLE_TYPE_SHIFT)\n#define GDI_CLIENT_REGION_TYPE (GDI_RGN_TYPE << GDI_HANDLE_TYPE_SHIFT)\n\n#define GDI_CLIENT_ALTDC_TYPE (GDI_CLIENT_DC_TYPE | GDI_ALTTYPE_1)\n#define GDI_CLIENT_DIBSECTION_TYPE (GDI_CLIENT_BITMAP_TYPE | GDI_ALTTYPE_1)\n#define GDI_CLIENT_EXTPEN_TYPE (GDI_CLIENT_BRUSH_TYPE | GDI_ALTTYPE_2)\n#define GDI_CLIENT_METADC16_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_3)\n#define GDI_CLIENT_METAFILE_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_2)\n#define GDI_CLIENT_METAFILE16_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_1)\n#define GDI_CLIENT_PEN_TYPE (GDI_CLIENT_BRUSH_TYPE | GDI_ALTTYPE_1)\n\ntypedef struct _GDI_HANDLE_ENTRY\n{\n    union\n    {\n        PVOID Object;\n        PVOID NextFree;\n    };\n    union\n    {\n        struct\n        {\n            USHORT ProcessId;\n            USHORT Lock : 1;\n            USHORT Count : 15;\n        };\n        ULONG Value;\n    } Owner;\n    USHORT Unique;\n    UCHAR Type;\n    UCHAR Flags;\n    PVOID UserPointer;\n} GDI_HANDLE_ENTRY, *PGDI_HANDLE_ENTRY;\n\ntypedef struct _GDI_SHARED_MEMORY\n{\n    GDI_HANDLE_ENTRY Handles[GDI_MAX_HANDLE_COUNT];\n} GDI_SHARED_MEMORY, *PGDI_SHARED_MEMORY;\n\n#endif // _NTGDI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntimage.h",
    "content": "/*\n * PE format support\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTIMAGE_H\n#define _NTIMAGE_H\n\n#include <pshpack4.h>\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#define IMAGE_FILE_MACHINE_CHPE_X86          0x3A64\n#define IMAGE_FILE_MACHINE_ARM64EC           0xA641\n#define IMAGE_FILE_MACHINE_ARM64X            0xA64E\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\ntypedef struct _IMAGE_DEBUG_POGO_ENTRY\n{\n    ULONG Rva;\n    ULONG Size;\n    CHAR Name[1];\n} IMAGE_DEBUG_POGO_ENTRY, *PIMAGE_DEBUG_POGO_ENTRY;\n\ntypedef struct _IMAGE_DEBUG_POGO_SIGNATURE\n{\n    ULONG Signature;\n} IMAGE_DEBUG_POGO_SIGNATURE, *PIMAGE_DEBUG_POGO_SIGNATURE;\n\n#define IMAGE_DEBUG_POGO_SIGNATURE_LTCG 'LTCG' // coffgrp LTCG (0x4C544347)\n#define IMAGE_DEBUG_POGO_SIGNATURE_PGU 'PGU\\0' // coffgrp PGU (0x50475500)\n\ntypedef struct _IMAGE_RELOCATION_RECORD\n{\n    USHORT Offset : 12;\n    USHORT Type : 4;\n} IMAGE_RELOCATION_RECORD, *PIMAGE_RELOCATION_RECORD;\n\ntypedef struct _IMAGE_CHPE_METADATA_X86\n{\n    ULONG Version;\n    ULONG CHPECodeAddressRangeOffset;\n    ULONG CHPECodeAddressRangeCount;\n    ULONG WowA64ExceptionHandlerFunctionPointer;\n    ULONG WowA64DispatchCallFunctionPointer;\n    ULONG WowA64DispatchIndirectCallFunctionPointer;\n    ULONG WowA64DispatchIndirectCallCfgFunctionPointer;\n    ULONG WowA64DispatchRetFunctionPointer;\n    ULONG WowA64DispatchRetLeafFunctionPointer;\n    ULONG WowA64DispatchJumpFunctionPointer;\n    ULONG CompilerIATPointer;         // Present if Version >= 2\n    ULONG WowA64RdtscFunctionPointer; // Present if Version >= 3\n} IMAGE_CHPE_METADATA_X86, *PIMAGE_CHPE_METADATA_X86;\n\ntypedef struct _IMAGE_CHPE_RANGE_ENTRY\n{\n    union\n    {\n        ULONG StartOffset;\n        struct\n        {\n            ULONG NativeCode : 1;\n            ULONG AddressBits : 31;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n\n    ULONG Length;\n} IMAGE_CHPE_RANGE_ENTRY, *PIMAGE_CHPE_RANGE_ENTRY;\n\ntypedef struct _IMAGE_ARM64EC_METADATA\n{\n    ULONG Version;\n    ULONG CodeMap;\n    ULONG CodeMapCount;\n    ULONG CodeRangesToEntryPoints;\n    ULONG RedirectionMetadata;\n    ULONG tbd__os_arm64x_dispatch_call_no_redirect;\n    ULONG tbd__os_arm64x_dispatch_ret;\n    ULONG tbd__os_arm64x_dispatch_call;\n    ULONG tbd__os_arm64x_dispatch_icall;\n    ULONG tbd__os_arm64x_dispatch_icall_cfg;\n    ULONG AlternateEntryPoint;\n    ULONG AuxiliaryIAT;\n    ULONG CodeRangesToEntryPointsCount;\n    ULONG RedirectionMetadataCount;\n    ULONG GetX64InformationFunctionPointer;\n    ULONG SetX64InformationFunctionPointer;\n    ULONG ExtraRFETable;\n    ULONG ExtraRFETableSize;\n    ULONG __os_arm64x_dispatch_fptr;\n    ULONG AuxiliaryIATCopy;\n} IMAGE_ARM64EC_METADATA, *PIMAGE_ARM64EC_METADATA;\n\n// rev\n#define IMAGE_ARM64EC_CODE_MAP_TYPE_ARM64   0\n#define IMAGE_ARM64EC_CODE_MAP_TYPE_ARM64EC 1\n#define IMAGE_ARM64EC_CODE_MAP_TYPE_AMD64   2\n\n// rev\ntypedef struct _IMAGE_ARM64EC_CODE_MAP_ENTRY\n{\n    union\n    {\n        ULONG StartOffset;\n        struct\n        {\n            ULONG Type : 2;\n            ULONG AddressBits : 30;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n\n    ULONG Length;\n} IMAGE_ARM64EC_CODE_MAP_ENTRY, *PIMAGE_ARM64EC_CODE_MAP_ENTRY;\n\ntypedef struct _IMAGE_ARM64EC_REDIRECTION_ENTRY\n{\n    ULONG Source;\n    ULONG Destination;\n} IMAGE_ARM64EC_REDIRECTION_ENTRY, *PIMAGE_ARM64EC_REDIRECTION_ENTRY;\n\ntypedef struct _IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT\n{\n    ULONG StartRva;\n    ULONG EndRva;\n    ULONG EntryPoint;\n} IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT, *PIMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT;\n\n#define IMAGE_DVRT_ARM64X_FIXUP_TYPE_ZEROFILL   0\n#define IMAGE_DVRT_ARM64X_FIXUP_TYPE_VALUE      1\n#define IMAGE_DVRT_ARM64X_FIXUP_TYPE_DELTA      2\n\n#define IMAGE_DVRT_ARM64X_FIXUP_SIZE_2BYTES     1\n#define IMAGE_DVRT_ARM64X_FIXUP_SIZE_4BYTES     2\n#define IMAGE_DVRT_ARM64X_FIXUP_SIZE_8BYTES     3\n\ntypedef struct _IMAGE_DVRT_ARM64X_FIXUP_RECORD\n{\n    USHORT Offset : 12;\n    USHORT Type   :  2;\n    USHORT Size   :  2;\n    // Value of variable Size when IMAGE_DVRT_ARM64X_FIXUP_TYPE_VALUE\n} IMAGE_DVRT_ARM64X_FIXUP_RECORD, *PIMAGE_DVRT_ARM64X_FIXUP_RECORD;\n\ntypedef struct _IMAGE_DVRT_ARM64X_DELTA_FIXUP_RECORD\n{\n    USHORT Offset : 12;\n    USHORT Type   :  2; // IMAGE_DVRT_ARM64X_FIXUP_TYPE_DELTA\n    USHORT Sign   :  1; // 1 = -, 0 = +\n    USHORT Scale  :  1; // 1 = 8, 0 = 4\n    // USHORT Value; // Delta = Value * Scale * Sign\n} IMAGE_DVRT_ARM64X_DELTA_FIXUP_RECORD, *PIMAGE_DVRT_ARM64X_DELTA_FIXUP_RECORD;\n\n#include <poppack.h>\n\n#define IMAGE_DYNAMIC_RELOCATION_ARM64X                         0x00000006\n#define IMAGE_DYNAMIC_RELOCATION_MM_SHARED_USER_DATA_VA         0x7FFE0000\n#define IMAGE_DYNAMIC_RELOCATION_KI_USER_SHARED_DATA64          0xFFFFF78000000000UI64\n\n// Note: The Windows SDK defines UNALIGNED for PIMAGE_IMPORT_DESCRIPTOR but\n// doesn't include UNALIGNED for PIMAGE_THUNK_DATA (See GH#1694) (dmex)\ntypedef struct _IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA32;\ntypedef struct _IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA64;\ntypedef IMAGE_THUNK_DATA32 UNALIGNED* UNALIGNED_PIMAGE_THUNK_DATA32;\ntypedef IMAGE_THUNK_DATA64 UNALIGNED* UNALIGNED_PIMAGE_THUNK_DATA64;\n\n// Note: Required for legacy SDK support (dmex)\n#if !defined(NTDDI_WIN10_NI) || (NTDDI_VERSION < NTDDI_WIN10_NI)\n#define IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE   0x00000001\n#define IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE   0x00000002\n#define IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER  0x00000003\n#define IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER   0x00000004\n#define IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH       0x00000005\n#define IMAGE_DYNAMIC_RELOCATION_FUNCTION_OVERRIDE              0x00000007\n\ntypedef struct _IMAGE_FUNCTION_OVERRIDE_HEADER {\n    ULONG FuncOverrideSize;\n    // IMAGE_FUNCTION_OVERRIDE_DYNAMIC_RELOCATION  FuncOverrideInfo[ANYSIZE_ARRAY]; // FuncOverrideSize bytes in size\n    // IMAGE_BDD_INFO BDDInfo; // BDD region, size in bytes: DVRTEntrySize - sizeof(IMAGE_FUNCTION_OVERRIDE_HEADER) - FuncOverrideSize\n} IMAGE_FUNCTION_OVERRIDE_HEADER;\ntypedef IMAGE_FUNCTION_OVERRIDE_HEADER UNALIGNED *PIMAGE_FUNCTION_OVERRIDE_HEADER;\n\ntypedef struct _IMAGE_BDD_INFO {\n    ULONG Version; // decides the semantics of serialized BDD\n    ULONG BDDSize;\n    // IMAGE_BDD_DYNAMIC_RELOCATION BDDNodes[ANYSIZE_ARRAY]; // BDDSize size in bytes.\n} IMAGE_BDD_INFO, *PIMAGE_BDD_INFO;\n\ntypedef struct _IMAGE_FUNCTION_OVERRIDE_DYNAMIC_RELOCATION {\n    ULONG OriginalRva;          // RVA of original function\n    ULONG BDDOffset;            // Offset into the BDD region\n    ULONG RvaSize;              // Size in bytes taken by RVAs. Must be multiple of sizeof(DWORD).\n    ULONG BaseRelocSize;        // Size in bytes taken by BaseRelocs\n    // DWORD RVAs[RvaSize / sizeof(DWORD)];     // Array containing overriding func RVAs.\n    // IMAGE_BASE_RELOCATION  BaseRelocs[ANYSIZE_ARRAY];\n    // ^Base relocations (RVA + Size + TO)\n    // ^Padded with extra TOs for 4B alignment\n    // ^BaseRelocSize size in bytes\n} IMAGE_FUNCTION_OVERRIDE_DYNAMIC_RELOCATION, *PIMAGE_FUNCTION_OVERRIDE_DYNAMIC_RELOCATION;\n\ntypedef struct _IMAGE_BDD_DYNAMIC_RELOCATION {\n    USHORT Left;  // Index of FALSE edge in BDD array\n    USHORT Right; // Index of TRUE edge in BDD array\n    ULONG  Value; // Either FeatureNumber or Index into RVAs array\n} IMAGE_BDD_DYNAMIC_RELOCATION, *PIMAGE_BDD_DYNAMIC_RELOCATION;\n\n// Function override relocation types in DVRT records.\n#define IMAGE_FUNCTION_OVERRIDE_INVALID         0\n#define IMAGE_FUNCTION_OVERRIDE_X64_REL32       1  // 32-bit relative address from byte following reloc\n#define IMAGE_FUNCTION_OVERRIDE_ARM64_BRANCH26  2  // 26 bit offset << 2 & sign ext. for B & BL\n#define IMAGE_FUNCTION_OVERRIDE_ARM64_THUNK     3\n#endif // !defined(NTDDI_WIN10_NI) || (NTDDI_VERSION < NTDDI_WIN10_NI)\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\n#define IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT                          0x40\n#define IMAGE_DLLCHARACTERISTICS_EX_HOTPATCH_COMPATIBLE                         0x80\n#endif // !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\n\n#endif // _NTIMAGE_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntintsafe.h",
    "content": "/******************************************************************\n*                                                                 *\n*  ntintsafe.h -- This module defines helper functions to prevent *\n*                 integer overflow bugs for drivers. A similar    *\n*                 file, intsafe.h, is available for applications. *\n*                                                                 *\n*  Copyright (c) Microsoft Corp.  All rights reserved.            *\n*                                                                 *\n******************************************************************/\n#ifndef _NTINTSAFE_H_INCLUDED_\n#define _NTINTSAFE_H_INCLUDED_\n\n#include <winapifamily.h>\n\n\n#if (_MSC_VER > 1000)\n#pragma once\n#endif\n\n#pragma region Application Family or Games Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\n#include <specstrings.h>    // for _In_, etc.\n\n#if _MSC_VER >= 1200\n#pragma warning(push)\n#pragma warning(disable:4668) // #if not_defined treated as #if 0\n#endif\n\n#if !defined(_W64)\n#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86) || defined(_ARM_) || defined(_M_ARM)) && (_MSC_VER >= 1300)\n#define _W64 __w64\n#else\n#define _W64\n#endif\n#endif\n\n//\n// typedefs\n//\ntypedef char                CHAR;\ntypedef signed char         INT8;\ntypedef unsigned char       UCHAR;\ntypedef unsigned char       UINT8;\ntypedef unsigned char       BYTE;\ntypedef short               SHORT;\ntypedef signed short        INT16;\ntypedef unsigned short      USHORT;\ntypedef unsigned short      UINT16;\ntypedef unsigned short      WORD;\ntypedef int                 INT;\ntypedef signed int          INT32;\ntypedef unsigned int        UINT;\ntypedef unsigned int        UINT32;\ntypedef long                LONG;\ntypedef unsigned long       ULONG;\ntypedef unsigned long       DWORD;\ntypedef __int64             LONGLONG;\ntypedef __int64             LONG64;\ntypedef signed __int64      RtlINT64;\ntypedef unsigned __int64    ULONGLONG;\ntypedef unsigned __int64    DWORDLONG;\ntypedef unsigned __int64    ULONG64;\ntypedef unsigned __int64    DWORD64;\ntypedef unsigned __int64    UINT64;\n\n#if (__midl > 501)\ntypedef [public]          __int3264 INT_PTR;\ntypedef [public] unsigned __int3264 UINT_PTR;\ntypedef [public]          __int3264 LONG_PTR;\ntypedef [public] unsigned __int3264 ULONG_PTR;\n#else\n#ifdef _WIN64\ntypedef __int64             INT_PTR;\ntypedef unsigned __int64    UINT_PTR;\ntypedef __int64             LONG_PTR;\ntypedef unsigned __int64    ULONG_PTR;\n#else\ntypedef _W64 int            INT_PTR;\ntypedef _W64 unsigned int   UINT_PTR;\ntypedef _W64 long           LONG_PTR;\ntypedef _W64 unsigned long  ULONG_PTR;\n#endif // WIN64\n#endif // (__midl > 501)\n\n#ifdef _WIN64\ntypedef __int64             ptrdiff_t;\ntypedef unsigned __int64    size_t;\n#else\ntypedef _W64 int            ptrdiff_t;\ntypedef _W64 unsigned int   size_t;\n#endif\n\ntypedef ULONG_PTR   DWORD_PTR;\ntypedef LONG_PTR    SSIZE_T;\ntypedef ULONG_PTR   SIZE_T;\n\n#undef _USE_INTRINSIC_MULTIPLY128\n\n#if !defined(_M_CEE) && ((defined(_AMD64_) && !defined(_ARM64EC_)) || (defined(_IA64_) && (_MSC_VER >= 1400)))\n#define _USE_INTRINSIC_MULTIPLY128\n#endif\n\n#if defined(_USE_INTRINSIC_MULTIPLY128)\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(_ARM64EC_)\n\n#define UnsignedMultiply128 _umul128\n\n#else\n\n#define _umul128 Multiply128\n\n#endif // defined(_ARM64EC_)\n\nULONG64\nUnsignedMultiply128(\n    _In_ ULONGLONG ullMultiplicand,\n    _In_ ULONGLONG ullMultiplier,\n    _Out_ _Deref_out_range_(==, ullMultiplicand * ullMultiplier) ULONGLONG* pullResultHigh);\n\n#if !defined(_ARM64EC_)\n#pragma intrinsic(_umul128)\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif // _USE_INTRINSIC_MULTIPLY128\n\n\n\ntypedef _Return_type_success_(return >= 0) long NTSTATUS;\n\n#define NT_SUCCESS(Status)  (((NTSTATUS)(Status)) >= 0)\n\n#define STATUS_SUCCESS  ((NTSTATUS)0x00000000L)\n#ifndef SORTPP_PASS\n// compiletime asserts (failure results in error C2118: negative subscript)\n#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]\n#else\n#define C_ASSERT(e)\n#endif\n\n//\n// UInt32x32To64 macro\n//\n#ifndef UInt32x32To64\n#if defined(MIDL_PASS) || defined(RC_INVOKED) || defined(_M_CEE_PURE) \\\n    || defined(_68K_) || defined(_MPPC_) \\\n    || defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_ARM64) \\\n    || defined(_M_HYBRID_X86_ARM64)\n#define UInt32x32To64(a, b) (((unsigned __int64)((unsigned int)(a))) * ((unsigned __int64)((unsigned int)(b))))\n#elif defined(_M_IX86)\n#define UInt32x32To64(a, b) ((unsigned __int64)(((unsigned __int64)((unsigned int)(a))) * ((unsigned int)(b))))\n#else\n#error Must define a target architecture.\n#endif\n#endif\n\n//\n// Min/Max type values\n//\n#define INT8_MIN        (-127i8 - 1)\n#define SHORT_MIN       (-32768)\n#define INT16_MIN       (-32767i16 - 1)\n#ifndef INT_MIN\n#define INT_MIN         (-2147483647 - 1)\n#endif\n#define INT32_MIN       (-2147483647i32 - 1)\n#ifndef LONG_MIN\n#define LONG_MIN        (-2147483647L - 1)\n#endif\n#define LONGLONG_MIN    (-9223372036854775807i64 - 1)\n#define LONG64_MIN      (-9223372036854775807i64 - 1)\n#define INT64_MIN       (-9223372036854775807i64 - 1)\n#define INT128_MIN      (-170141183460469231731687303715884105727i128 - 1)\n\n#ifdef _WIN64\n#define INT_PTR_MIN     (-9223372036854775807i64 - 1)\n#define LONG_PTR_MIN    (-9223372036854775807i64 - 1)\n#define PTRDIFF_T_MIN   (-9223372036854775807i64 - 1)\n#define SSIZE_T_MIN     (-9223372036854775807i64 - 1)\n#else\n#define INT_PTR_MIN     (-2147483647 - 1)\n#define LONG_PTR_MIN    (-2147483647L - 1)\n#define PTRDIFF_T_MIN   (-2147483647 - 1)\n#define SSIZE_T_MIN     (-2147483647L - 1)\n#endif\n\n#define INT8_MAX        127i8\n#define UINT8_MAX       0xffui8\n#define BYTE_MAX        0xff\n#define SHORT_MAX       32767\n#define INT16_MAX       32767i16\n#define USHORT_MAX      0xffff\n#define UINT16_MAX      0xffffui16\n#define WORD_MAX        0xffff\n#ifndef INT_MAX\n#define INT_MAX         2147483647\n#endif\n#define INT32_MAX       2147483647i32\n#ifndef UINT_MAX\n#define UINT_MAX        0xffffffff\n#endif\n#define UINT32_MAX      0xffffffffui32\n#ifndef LONG_MAX\n#define LONG_MAX        2147483647L\n#endif\n#ifndef ULONG_MAX\n#define ULONG_MAX       0xffffffffUL\n#endif\n#define DWORD_MAX       0xffffffffUL\n#define LONGLONG_MAX    9223372036854775807i64\n#define LONG64_MAX      9223372036854775807i64\n#define INT64_MAX       9223372036854775807i64\n#define ULONGLONG_MAX   0xffffffffffffffffui64\n#define DWORDLONG_MAX   0xffffffffffffffffui64\n#define ULONG64_MAX     0xffffffffffffffffui64\n#define DWORD64_MAX     0xffffffffffffffffui64\n#define UINT64_MAX      0xffffffffffffffffui64\n#define INT128_MAX      170141183460469231731687303715884105727i128\n#define UINT128_MAX     0xffffffffffffffffffffffffffffffffui128\n\n#undef SIZE_T_MAX\n\n#ifdef _WIN64\n#define INT_PTR_MAX     9223372036854775807i64\n#define UINT_PTR_MAX    0xffffffffffffffffui64\n#define LONG_PTR_MAX    9223372036854775807i64\n#define ULONG_PTR_MAX   0xffffffffffffffffui64\n#define DWORD_PTR_MAX   0xffffffffffffffffui64\n#define PTRDIFF_T_MAX   9223372036854775807i64\n#define SIZE_T_MAX      0xffffffffffffffffui64\n#define SSIZE_T_MAX     9223372036854775807i64\n#define _SIZE_T_MAX     0xffffffffffffffffui64\n#else\n#define INT_PTR_MAX     2147483647\n#define UINT_PTR_MAX    0xffffffff\n#define LONG_PTR_MAX    2147483647L\n#define ULONG_PTR_MAX   0xffffffffUL\n#define DWORD_PTR_MAX   0xffffffffUL\n#define PTRDIFF_T_MAX   2147483647\n#define SIZE_T_MAX      0xffffffff\n#define SSIZE_T_MAX     2147483647L\n#define _SIZE_T_MAX     0xffffffffUL\n#endif\n\n\n//\n// It is common for -1 to be used as an error value\n//\n#define INT8_ERROR      (-1i8)\n#define UINT8_ERROR     0xffui8\n#define BYTE_ERROR      0xff\n#define SHORT_ERROR     (-1)\n#define INT16_ERROR     (-1i16)\n#define USHORT_ERROR    0xffff\n#define UINT16_ERROR    0xffffui16\n#define WORD_ERROR      0xffff\n#define INT_ERROR       (-1)\n#define INT32_ERROR     (-1i32)\n#define UINT_ERROR      0xffffffff\n#define UINT32_ERROR    0xffffffffui32\n#define LONG_ERROR      (-1L)\n#define ULONG_ERROR     0xffffffffUL\n#define DWORD_ERROR     0xffffffffUL\n#define LONGLONG_ERROR  (-1i64)\n#define LONG64_ERROR    (-1i64)\n#define INT64_ERROR     (-1i64)\n#define ULONGLONG_ERROR 0xffffffffffffffffui64\n#define DWORDLONG_ERROR 0xffffffffffffffffui64\n#define ULONG64_ERROR   0xffffffffffffffffui64\n#define UINT64_ERROR    0xffffffffffffffffui64\n\n#ifdef _WIN64\n#define INT_PTR_ERROR   (-1i64)\n#define UINT_PTR_ERROR  0xffffffffffffffffui64\n#define LONG_PTR_ERROR  (-1i64)\n#define ULONG_PTR_ERROR 0xffffffffffffffffui64\n#define DWORD_PTR_ERROR 0xffffffffffffffffui64\n#define PTRDIFF_T_ERROR (-1i64)\n#define SIZE_T_ERROR    0xffffffffffffffffui64\n#define SSIZE_T_ERROR   (-1i64)\n#define _SIZE_T_ERROR   0xffffffffffffffffui64\n#else\n#define INT_PTR_ERROR   (-1)\n#define UINT_PTR_ERROR  0xffffffff\n#define LONG_PTR_ERROR  (-1L)\n#define ULONG_PTR_ERROR 0xffffffffUL\n#define DWORD_PTR_ERROR 0xffffffffUL\n#define PTRDIFF_T_ERROR (-1)\n#define SIZE_T_ERROR    0xffffffff\n#define SSIZE_T_ERROR   (-1L)\n#define _SIZE_T_ERROR   0xffffffffUL\n#endif\n\n\n//\n// We make some assumptions about the sizes of various types. Let's be\n// explicit about those assumptions and check them.\n//\nC_ASSERT(sizeof(USHORT) == 2);\nC_ASSERT(sizeof(INT) == 4);\nC_ASSERT(sizeof(UINT) == 4);\nC_ASSERT(sizeof(LONG) == 4);\nC_ASSERT(sizeof(ULONG) == 4);\nC_ASSERT(sizeof(UINT_PTR) == sizeof(ULONG_PTR));\n\n\n//=============================================================================\n// Conversion functions\n//\n// There are three reasons for having conversion functions:\n//\n// 1. We are converting from a signed type to an unsigned type of the same\n//    size, or vice-versa.\n//\n//    Since we default to only having unsigned math functions,\n//    (see ENABLE_INTSAFE_SIGNED_FUNCTIONS below) we prefer people to convert\n//    to unsigned, do the math, and then convert back to signed.\n//\n// 2. We are converting to a smaller type, and we could therefore possibly\n//    overflow.\n//\n// 3. We are converting to a bigger type, and we are signed and the type we are\n//    converting to is unsigned.\n//\n//=============================================================================\n\n\n//\n// INT8 -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToUChar(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pch = (UCHAR)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToUInt8(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pu8Result = (UINT8)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> BYTE conversion\n//\n#define RtlInt8ToByte  RtlInt8ToUInt8\n\n//\n// INT8 -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToUShort(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pusResult = (USHORT)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> UINT16 conversion\n//\n#define RtlInt8ToUInt16    RtlInt8ToUShort\n\n//\n// INT8 -> WORD conversion\n//\n#define RtlInt8ToWord  RtlInt8ToUShort\n\n//\n// INT8 -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToUInt(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *puResult = (UINT)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> UINT32 conversion\n//\n#define RtlInt8ToUInt32    RtlInt8ToUInt\n\n//\n// INT8 -> UINT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToUIntPtr(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *puResult = (UINT_PTR)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToULong(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pulResult = (ULONG)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> ULONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToULongPtr(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pulResult = (ULONG_PTR)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> DWORD conversion\n//\n#define RtlInt8ToDWord RtlInt8ToULong\n\n//\n// INT8 -> DWORD_PTR conversion\n//\n#define RtlInt8ToDWordPtr  RtlInt8ToULongPtr\n\n//\n// INT8 -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8ToULongLong(\n    _In_ INT8 i8Operand,\n    _Out_ _Deref_out_range_(==, i8Operand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (i8Operand >= 0)\n    {\n        *pullResult = (ULONGLONG)i8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT8 -> DWORDLONG conversion\n//\n#define RtlInt8ToDWordLong RtlInt8ToULongLong\n\n//\n// INT8 -> ULONG64 conversion\n//\n#define RtlInt8ToULong64   RtlInt8ToULongLong\n\n//\n// INT8 -> DWORD64 conversion\n//\n#define RtlInt8ToDWord64   RtlInt8ToULongLong\n\n//\n// INT8 -> UINT64 conversion\n//\n#define RtlInt8ToUInt64    RtlInt8ToULongLong\n\n//\n// INT8 -> size_t conversion\n//\n#define RtlInt8ToSizeT RtlInt8ToUIntPtr\n\n//\n// INT8 -> SIZE_T conversion\n//\n#define RtlInt8ToSIZET RtlInt8ToULongPtr\n\n//\n// UINT8 -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUInt8ToInt8(\n    _In_ UINT8 u8Operand,\n    _Out_ _Deref_out_range_(==, u8Operand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (u8Operand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)u8Operand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT8 -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlUInt8ToChar(\n    _In_ UINT8 u8Operand,\n    _Out_ _Deref_out_range_(==, u8Operand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    *pch = (CHAR)u8Operand;\n    return STATUS_SUCCESS;\n#else\n    return RtlUInt8ToInt8(u8Operand, (INT8*)pch);\n#endif\n}\n\n//\n// BYTE -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlByteToInt8(\n    _In_ BYTE bOperand,\n    _Out_ _Deref_out_range_(==, bOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (bOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)bOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// BYTE -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlByteToChar(\n    _In_ BYTE bOperand,\n    _Out_ _Deref_out_range_(==, bOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    *pch = (CHAR)bOperand;\n    return STATUS_SUCCESS;\n#else\n    return RtlByteToInt8(bOperand, (INT8*)pch);\n#endif\n}\n\n//\n// SHORT -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToInt8(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((sOperand >= INT8_MIN) && (sOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToUChar(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((sOperand >= 0) && (sOperand <= 255))\n    {\n        *pch = (UCHAR)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlShortToChar(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlShortToUChar(sOperand, (UCHAR*)pch);\n#else\n    return RtlShortToInt8(sOperand, (INT8*)pch);\n#endif // _CHAR_UNSIGNED\n}\n\n//\n// SHORT -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToUInt8(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if ((sOperand >= 0) && (sOperand <= UINT8_MAX))\n    {\n        *pui8Result = (UINT8)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> BYTE conversion\n//\n#define RtlShortToByte  RtlShortToUInt8\n\n//\n// SHORT -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToUShort(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *pusResult = (USHORT)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> UINT16 conversion\n//\n#define RtlShortToUInt16   RtlShortToUShort\n\n//\n// SHORT -> WORD conversion\n//\n#define RtlShortToWord RtlShortToUShort\n\n//\n// SHORT -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToUInt(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *puResult = (UINT)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> UINT32 conversion\n//\n#define RtlShortToUInt32   RtlShortToUInt\n\n//\n// SHORT -> UINT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToUIntPtr(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *puResult = (UINT_PTR)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToULong(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *pulResult = (ULONG)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> ULONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToULongPtr(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *pulResult = (ULONG_PTR)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> DWORD conversion\n//\n#define RtlShortToDWord    RtlShortToULong\n\n//\n// SHORT -> DWORD_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToDWordPtr(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) DWORD_PTR* pdwResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *pdwResult = (DWORD_PTR)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pdwResult = DWORD_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortToULongLong(\n    _In_ SHORT sOperand,\n    _Out_ _Deref_out_range_(==, sOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (sOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)sOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SHORT -> DWORDLONG conversion\n//\n#define RtlShortToDWordLong    RtlShortToULongLong\n\n//\n// SHORT -> ULONG64 conversion\n//\n#define RtlShortToULong64  RtlShortToULongLong\n\n//\n// SHORT -> DWORD64 conversion\n//\n#define RtlShortToDWord64  RtlShortToULongLong\n\n//\n// SHORT -> UINT64 conversion\n//\n#define RtlShortToUInt64   RtlShortToULongLong\n\n//\n// SHORT -> size_t conversion\n//\n#define RtlShortToSizeT    RtlShortToUIntPtr\n\n//\n// SHORT -> SIZE_T conversion\n//\n#define RtlShortToSIZET    RtlShortToULongPtr\n\n//\n// INT16 -> CHAR conversion\n//\n#define RtlInt16ToChar RtlShortToChar\n\n//\n// INT16 -> INT8 conversion\n//\n#define RtlInt16ToInt8 RtlShortToInt8\n\n//\n// INT16 -> UCHAR conversion\n//\n#define RtlInt16ToUChar    RtlShortToUChar\n\n//\n// INT16 -> UINT8 conversion\n//\n#define RtlInt16ToUInt8    RtlShortToUInt8\n\n//\n// INT16 -> BYTE conversion\n//\n#define RtlInt16ToByte RtlShortToUInt8\n\n//\n// INT16 -> USHORT conversion\n//\n#define RtlInt16ToUShort   RtlShortToUShort\n\n//\n// INT16 -> UINT16 conversion\n//\n#define RtlInt16ToUInt16   RtlShortToUShort\n\n//\n// INT16 -> WORD conversion\n//\n#define RtlInt16ToWord RtlShortToUShort\n\n//\n// INT16 -> UINT conversion\n//\n#define RtlInt16ToUInt RtlShortToUInt\n\n//\n// INT16 -> UINT32 conversion\n//\n#define RtlInt16ToUInt32   RtlShortToUInt\n\n//\n// INT16 -> UINT_PTR conversion\n//\n#define RtlInt16ToUIntPtr  RtlShortToUIntPtr\n\n//\n// INT16 -> ULONG conversion\n//\n#define RtlInt16ToULong    RtlShortToULong\n\n//\n// INT16 -> ULONG_PTR conversion\n//\n#define RtlInt16ToULongPtr RtlShortToULongPtr\n\n//\n// INT16 -> DWORD conversion\n//\n#define RtlInt16ToDWord    RtlShortToULong\n\n//\n// INT16 -> DWORD_PTR conversion\n//\n#define RtlInt16ToDWordPtr RtlShortToULongPtr\n\n//\n// INT16 -> ULONGLONG conversion\n//\n#define RtlInt16ToULongLong    RtlShortToULongLong\n\n//\n// INT16 -> DWORDLONG conversion\n//\n#define RtlInt16ToDWordLong    RtlShortToULongLong\n\n//\n// INT16 -> ULONG64 conversion\n//\n#define RtlInt16ToULong64  RtlShortToULongLong\n\n//\n// INT16 -> DWORD64 conversion\n//\n#define RtlInt16ToDWord64  RtlShortToULongLong\n\n//\n// INT16 -> UINT64 conversion\n//\n#define RtlInt16ToUInt64   RtlShortToULongLong\n\n//\n// INT16 -> size_t conversion\n//\n#define RtlInt16ToSizeT    RtlShortToUIntPtr\n\n//\n// INT16 -> SIZE_T conversion\n//\n#define RtlInt16ToSIZET    RtlShortToULongPtr\n\n//\n// USHORT -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortToInt8(\n    _In_ USHORT usOperand,\n    _Out_ _Deref_out_range_(==, usOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (usOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)usOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortToUChar(\n    _In_ USHORT usOperand,\n    _Out_ _Deref_out_range_(==, usOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (usOperand <= 255)\n    {\n        *pch = (UCHAR)usOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlUShortToChar(\n    _In_ USHORT usOperand,\n    _Out_ _Deref_out_range_(==, usOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlUShortToUChar(usOperand, (UCHAR*)pch);\n#else\n    return RtlUShortToInt8(usOperand, (INT8*)pch);\n#endif // _CHAR_UNSIGNED\n}\n\n//\n// USHORT -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortToUInt8(\n    _In_ USHORT usOperand,\n    _Out_ _Deref_out_range_(==, usOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if (usOperand <= UINT8_MAX)\n    {\n        *pui8Result = (UINT8)usOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT -> BYTE conversion\n//\n#define RtlUShortToByte    RtlUShortToUInt8\n\n//\n// USHORT -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortToShort(\n    _In_ USHORT usOperand,\n    _Out_ _Deref_out_range_(==, usOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (usOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)usOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT -> INT16 conversion\n//\n#define RtlUShortToInt16   RtlUShortToShort\n\n//\n// UINT16 -> CHAR conversion\n//\n#define RtlUInt16ToChar    RtlUShortToChar\n\n//\n// UINT16 -> INT8 conversion\n//\n#define RtlUInt16ToInt8    RtlUShortToInt8\n\n//\n// UINT16 -> UCHAR conversion\n//\n#define RtlUInt16ToUChar   RtlUShortToUChar\n\n//\n// UINT16 -> UINT8 conversion\n//\n#define RtlUInt16ToUInt8   RtlUShortToUInt8\n\n//\n// UINT16 -> BYTE conversion\n//\n#define RtlUInt16ToByte    RtlUShortToUInt8\n\n//\n// UINT16 -> SHORT conversion\n//\n#define RtlUInt16ToShort   RtlUShortToShort\n\n//\n// UINT16 -> INT16 conversion\n//\n#define RtlUInt16ToInt16   RtlUShortToShort\n\n//\n// WORD -> INT8 conversion\n//\n#define RtlWordToInt8  RtlUShortToInt8\n\n//\n// WORD -> CHAR conversion\n//\n#define RtlWordToChar  RtlUShortToChar\n\n//\n// WORD -> UCHAR conversion\n//\n#define RtlWordToUChar RtlUShortToUChar\n\n//\n// WORD -> UINT8 conversion\n//\n#define RtlWordToUInt8 RtlUShortToUInt8\n\n//\n// WORD -> BYTE conversion\n//\n#define RtlWordToByte  RtlUShortToUInt8\n\n//\n// WORD -> SHORT conversion\n//\n#define RtlWordToShort RtlUShortToShort\n\n//\n// WORD -> INT16 conversion\n//\n#define RtlWordToInt16 RtlUShortToShort\n\n//\n// INT -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToInt8(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= INT8_MIN) && (iOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToUChar(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= 255))\n    {\n        *pch = (UCHAR)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlIntToChar(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlIntToUChar(iOperand, (UCHAR*)pch);\n#else\n    return RtlIntToInt8(iOperand, (INT8*)pch);\n#endif // _CHAR_UNSIGNED\n}\n\n//\n// INT -> BYTE conversion\n//\n#define RtlIntToByte   RtlIntToUInt8\n\n//\n// INT -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToUInt8(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= UINT8_MAX))\n    {\n        *pui8Result = (UINT8)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToShort(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= SHORT_MIN) && (iOperand <= SHORT_MAX))\n    {\n        *psResult = (SHORT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> INT16 conversion\n//\n#define RtlIntToInt16  RtlIntToShort\n\n//\n// INT -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToUShort(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= USHORT_MAX))\n    {\n        *pusResult = (USHORT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> UINT16 conversion\n//\n#define RtlIntToUInt16  RtlIntToUShort\n\n//\n// INT -> WORD conversion\n//\n#define RtlIntToWord   RtlIntToUShort\n\n//\n// INT -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToUInt(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *puResult = (UINT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> UINT_PTR conversion\n//\n#ifdef _WIN64\n#define RtlIntToUIntPtr    RtlIntToULongLong\n#else\n#define RtlIntToUIntPtr    RtlIntToUInt\n#endif\n\n//\n// INT -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToULong(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *pulResult = (ULONG)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> ULONG_PTR conversion\n//\n#ifdef _WIN64\n#define RtlIntToULongPtr   RtlIntToULongLong\n#else\n#define RtlIntToULongPtr   RtlIntToULong\n#endif\n\n//\n// INT -> DWORD conversion\n//\n#define RtlIntToDWord  RtlIntToULong\n\n//\n// INT -> DWORD_PTR conversion\n//\n#define RtlIntToDWordPtr   RtlIntToULongPtr\n\n//\n// INT -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntToULongLong(\n    _In_ INT iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT -> DWORDLONG conversion\n//\n#define RtlIntToDWordLong  RtlIntToULongLong\n\n//\n// INT -> ULONG64 conversion\n//\n#define RtlIntToULong64    RtlIntToULongLong\n\n//\n// INT -> DWORD64 conversion\n//\n#define RtlIntToDWord64    RtlIntToULongLong\n\n//\n// INT -> UINT64 conversion\n//\n#define RtlIntToUInt64 RtlIntToULongLong\n\n//\n// INT -> size_t conversion\n//\n#define RtlIntToSizeT  RtlIntToUIntPtr\n\n//\n// INT -> SIZE_T conversion\n//\n#define RtlIntToSIZET  RtlIntToULongPtr\n\n//\n// INT32 -> CHAR conversion\n//\n#define RtlInt32ToChar RtlIntToChar\n\n//\n// INT32 -> INT328 conversion\n//\n#define RtlInt32ToInt8 RtlIntToInt8\n\n//\n// INT32 -> UCHAR conversion\n//\n#define RtlInt32ToUChar    RtlIntToUChar\n\n//\n// INT32 -> BYTE conversion\n//\n#define RtlInt32ToByte RtlIntToUInt8\n\n//\n// INT32 -> UINT8 conversion\n//\n#define RtlInt32ToUInt8    RtlIntToUInt8\n\n//\n// INT32 -> SHORT conversion\n//\n#define RtlInt32ToShort    RtlIntToShort\n\n//\n// INT32 -> INT16 conversion\n//\n#define RtlInt32ToInt16    RtlIntToShort\n\n//\n// INT32 -> USHORT conversion\n//\n#define RtlInt32ToUShort   RtlIntToUShort\n\n//\n// INT32 -> UINT16 conversion\n//\n#define RtlInt32ToUInt16   RtlIntToUShort\n\n//\n// INT32 -> WORD conversion\n//\n#define RtlInt32ToWord RtlIntToUShort\n\n//\n// INT32 -> UINT conversion\n//\n#define RtlInt32ToUInt RtlIntToUInt\n\n//\n// INT32 -> UINT32 conversion\n//\n#define RtlInt32ToUInt32   RtlIntToUInt\n\n//\n// INT32 -> UINT_PTR conversion\n//\n#define RtlInt32ToUIntPtr  RtlIntToUIntPtr\n\n//\n// INT32 -> ULONG conversion\n//\n#define RtlInt32ToULong    RtlIntToULong\n\n//\n// INT32 -> ULONG_PTR conversion\n//\n#define RtlInt32ToULongPtr RtlIntToULongPtr\n\n//\n// INT32 -> DWORD conversion\n//\n#define RtlInt32ToDWord    RtlIntToULong\n\n//\n// INT32 -> DWORD_PTR conversion\n//\n#define RtlInt32ToDWordPtr RtlIntToULongPtr\n\n//\n// INT32 -> ULONGLONG conversion\n//\n#define RtlInt32ToULongLong    RtlIntToULongLong\n\n//\n// INT32 -> DWORDLONG conversion\n//\n#define RtlInt32ToDWordLong    RtlIntToULongLong\n\n//\n// INT32 -> ULONG64 conversion\n//\n#define RtlInt32ToULong64  RtlIntToULongLong\n\n//\n// INT32 -> DWORD64 conversion\n//\n#define RtlInt32ToDWord64  RtlIntToULongLong\n\n//\n// INT32 -> UINT64 conversion\n//\n#define RtlInt32ToUInt64   RtlIntToULongLong\n\n//\n// INT32 -> size_t conversion\n//\n#define RtlInt32ToSizeT    RtlIntToUIntPtr\n\n//\n// INT32 -> SIZE_T conversion\n//\n#define RtlInt32ToSIZET    RtlIntToULongPtr\n\n//\n// INT_PTR -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToInt8(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= INT8_MIN) && (iOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT_PTR -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToUChar(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= 255))\n    {\n        *pch = (UCHAR)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT_PTR -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlIntPtrToChar(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlIntPtrToUChar(iOperand, (UCHAR*)pch);\n#else\n    return RtlIntPtrToInt8(iOperand, (INT8*)pch);\n#endif // _CHAR_UNSIGNED\n}\n\n//\n// INT_PTR -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToUInt8(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= UINT8_MAX))\n    {\n        *pui8Result = (UINT8)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT_PTR -> BYTE conversion\n//\n#define RtlIntPtrToByte    RtlIntPtrToUInt8\n\n//\n// INT_PTR -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToShort(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= SHORT_MIN) && (iOperand <= SHORT_MAX))\n    {\n        *psResult = (SHORT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT_PTR -> INT16 conversion\n//\n#define RtlIntPtrToInt16   RtlIntPtrToShort\n\n//\n// INT_PTR -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToUShort(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if ((iOperand >= 0) && (iOperand <= USHORT_MAX))\n    {\n        *pusResult = (USHORT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// INT_PTR -> UINT16 conversion\n//\n#define RtlIntPtrToUInt16  RtlIntPtrToUShort\n\n//\n// INT_PTR -> WORD conversion\n//\n#define RtlIntPtrToWord    RtlIntPtrToUShort\n\n//\n// INT_PTR -> INT conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToInt RtlLongLongToInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToInt(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) INT* piResult)\n{\n    *piResult = (INT)iOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// INT_PTR -> INT32 conversion\n//\n#define RtlIntPtrToInt32   RtlIntPtrToInt\n\n//\n// INT_PTR -> UINT conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToUInt    RtlLongLongToUInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToUInt(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *puResult = (UINT)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// INT_PTR -> UINT32 conversion\n//\n#define RtlIntPtrToUInt32  RtlIntPtrToUInt\n\n//\n// INT_PTR -> UINT_PTR conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToUIntPtr RtlLongLongToULongLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToUIntPtr(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *puResult = (UINT_PTR)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// INT_PTR -> LONG conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToLong    RtlLongLongToLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToLong(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) LONG* plResult)\n{\n    *plResult = (LONG)iOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// INT_PTR -> LONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToLongPtr(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) LONG_PTR* plResult)\n{\n    *plResult = (LONG_PTR)iOperand;\n    return STATUS_SUCCESS;\n}\n\n//\n// INT_PTR -> ULONG conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToULong   RtlLongLongToULong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToULong(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *pulResult = (ULONG)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// INT_PTR -> ULONG_PTR conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToULongPtr    RtlLongLongToULongLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToULongPtr(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *pulResult = (ULONG_PTR)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// INT_PTR -> DWORD conversion\n//\n#define RtlIntPtrToDWord   RtlIntPtrToULong\n\n//\n// INT_PTR -> DWORD_PTR conversion\n//\n#define RtlIntPtrToDWordPtr    RtlIntPtrToULongPtr\n\n//\n// INT_PTR -> ULONGLONG conversion\n//\n#ifdef _WIN64\n#define RtlIntPtrToULongLong   RtlLongLongToULongLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrToULongLong(\n    _In_ INT_PTR iOperand,\n    _Out_ _Deref_out_range_(==, iOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (iOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)iOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// INT_PTR -> DWORDLONG conversion\n//\n#define RtlIntPtrToDWordLong   RtlIntPtrToULongLong\n\n//\n// INT_PTR -> ULONG64 conversion\n//\n#define RtlIntPtrToULong64 RtlIntPtrToULongLong\n\n//\n// INT_PTR -> DWORD64 conversion\n//\n#define RtlIntPtrToDWord64 RtlIntPtrToULongLong\n\n//\n// INT_PTR -> UINT64 conversion\n//\n#define RtlIntPtrToUInt64  RtlIntPtrToULongLong\n\n//\n// INT_PTR -> size_t conversion\n//\n#define RtlIntPtrToSizeT   RtlIntPtrToUIntPtr\n\n//\n// INT_PTR -> SIZE_T conversion\n//\n#define RtlIntPtrToSIZET   RtlIntPtrToULongPtr\n\n//\n// UINT -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToInt8(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToUChar(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (uOperand <= 255)\n    {\n        *pch = (UCHAR)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlUIntToChar(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlUIntToUChar(uOperand, (UCHAR*)pch);\n#else\n    return RtlUIntToInt8(uOperand, (INT8*)pch);\n#endif\n}\n\n//\n// UINT -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToUInt8(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= UINT8_MAX)\n    {\n        *pui8Result = (UINT8)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> BYTE conversion\n//\n#define RtlUIntToByte   RtlUIntToUInt8\n\n//\n// UINT -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToShort(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> INT16 conversion\n//\n#define RtlUIntToInt16 RtlUIntToShort\n\n//\n// UINT -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToUShort(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= USHORT_MAX)\n    {\n        *pusResult = (USHORT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> UINT16 conversion\n//\n#define RtlUIntToUInt16    RtlUIntToUShort\n\n//\n// UINT -> WORD conversion\n//\n#define RtlUIntToWord  RtlUIntToUShort\n\n//\n// UINT -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToInt(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT_MAX)\n    {\n        *piResult = (INT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> INT32 conversion\n//\n#define RtlUIntToInt32 RtlUIntToInt\n\n//\n// UINT -> INT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToIntPtr(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT_PTR* piResult)\n{\n    *piResult = uOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlUIntToIntPtr    RtlUIntToInt\n#endif\n\n//\n// UINT -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToLong(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= LONG_MAX)\n    {\n        *plResult = (LONG)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT -> LONG_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntToLongPtr(\n    _In_ UINT uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) LONG_PTR* plResult)\n{\n    *plResult = uOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlUIntToLongPtr   RtlUIntToLong\n#endif\n\n//\n// UINT -> ptrdiff_t conversion\n//\n#define RtlUIntToPtrdiffT  RtlUIntToIntPtr\n\n//\n// UINT -> SSIZE_T conversion\n//\n#define RtlUIntToSSIZET    RtlUIntToLongPtr\n\n//\n// UINT32 -> CHAR conversion\n//\n#define RtlUInt32ToChar    RtlUIntToChar\n\n//\n// UINT32 -> INT8 conversion\n//\n#define RtlUInt32ToInt8    RtlUIntToInt8\n\n//\n// UINT32 -> UCHAR conversion\n//\n#define RtlUInt32ToUChar   RtlUIntToUChar\n\n//\n// UINT32 -> UINT8 conversion\n//\n#define RtlUInt32ToUInt8   RtlUIntToUInt8\n\n//\n// UINT32 -> BYTE conversion\n//\n#define RtlUInt32ToByte    RtlUInt32ToUInt8\n\n//\n// UINT32 -> SHORT conversion\n//\n#define RtlUInt32ToShort   RtlUIntToShort\n\n//\n// UINT32 -> INT16 conversion\n//\n#define RtlUInt32ToInt16   RtlUIntToShort\n\n//\n// UINT32 -> USHORT conversion\n//\n#define RtlUInt32ToUShort  RtlUIntToUShort\n\n//\n// UINT32 -> UINT16 conversion\n//\n#define RtlUInt32ToUInt16  RtlUIntToUShort\n\n//\n// UINT32 -> WORD conversion\n//\n#define RtlUInt32ToWord    RtlUIntToUShort\n\n//\n// UINT32 -> INT conversion\n//\n#define RtlUInt32ToInt RtlUIntToInt\n\n//\n// UINT32 -> INT_PTR conversion\n//\n#define RtlUInt32ToIntPtr  RtlUIntToIntPtr\n\n//\n// UINT32 -> INT32 conversion\n//\n#define RtlUInt32ToInt32   RtlUIntToInt\n\n//\n// UINT32 -> LONG conversion\n//\n#define RtlUInt32ToLong    RtlUIntToLong\n\n//\n// UINT32 -> LONG_PTR conversion\n//\n#define RtlUInt32ToLongPtr RtlUIntToLongPtr\n\n//\n// UINT32 -> ptrdiff_t conversion\n//\n#define RtlUInt32ToPtrdiffT    RtlUIntToPtrdiffT\n\n//\n// UINT32 -> SSIZE_T conversion\n//\n#define RtlUInt32ToSSIZET  RtlUIntToSSIZET\n\n//\n// UINT_PTR -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToInt8(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToUChar(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (uOperand <= 255)\n    {\n        *pch = (UCHAR)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlUIntPtrToChar(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlUIntPtrToUChar(uOperand, (UCHAR*)pch);\n#else\n    return RtlUIntPtrToInt8(uOperand, (INT8*)pch);\n#endif\n}\n\n//\n// UINT_PTR -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToUInt8(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==,uOperand) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= UINT8_MAX)\n    {\n        *pu8Result = (UINT8)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> BYTE conversion\n//\n#define RtlUIntPtrToByte   RtlUIntPtrToUInt8\n\n//\n// UINT_PTR -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToShort(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> INT16 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToInt16(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT16* pi16Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT16_MAX)\n    {\n        *pi16Result = (INT16)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi16Result = INT16_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToUShort(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= USHORT_MAX)\n    {\n        *pusResult = (USHORT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> UINT16 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToUInt16(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) UINT16* pu16Result)\n{\n    NTSTATUS status;\n\n    if (uOperand <= UINT16_MAX)\n    {\n        *pu16Result = (UINT16)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu16Result = UINT16_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> WORD conversion\n//\n#define RtlUIntPtrToWord   RtlUIntPtrToUShort\n\n//\n// UINT_PTR -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToInt(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT_MAX)\n    {\n        *piResult = (INT)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> INT32 conversion\n//\n#define RtlUIntPtrToInt32  RtlUIntPtrToInt\n\n//\n// UINT_PTR -> INT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToIntPtr(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) INT_PTR* piResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= INT_PTR_MAX)\n    {\n        *piResult = (INT_PTR)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> UINT conversion\n//\n#ifdef _WIN64\n#define RtlUIntPtrToUInt   RtlULongLongToUInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToUInt(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) UINT* puResult)\n{\n    *puResult = (UINT)uOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// UINT_PTR -> UINT32 conversion\n//\n#define RtlUIntPtrToUInt32 RtlUIntPtrToUInt\n\n//\n// UINT_PTR -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToLong(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= LONG_MAX)\n    {\n        *plResult = (LONG)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> LONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToLongPtr(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) LONG_PTR* plResult)\n{\n    NTSTATUS status;\n\n    if (uOperand <= LONG_PTR_MAX)\n    {\n        *plResult = (LONG_PTR)uOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT_PTR -> ULONG conversion\n//\n#ifdef _WIN64\n#define RtlUIntPtrToULong  RtlULongLongToULong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToULong(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) ULONG* pulResult)\n{\n    *pulResult = (ULONG)uOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// UINT_PTR -> DWORD conversion\n//\n#define RtlUIntPtrToDWord  RtlUIntPtrToULong\n\n//\n// UINT_PTR -> LONGLONG conversion\n//\n#ifdef _WIN64\n#define RtlUIntPtrToLongLong   RtlULongLongToLongLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrToLongLong(\n    _In_ UINT_PTR uOperand,\n    _Out_ _Deref_out_range_(==, uOperand) LONGLONG* pllResult)\n{\n    *pllResult = (LONGLONG)uOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// UINT_PTR -> LONG64 conversion\n//\n#define RtlUIntPtrToLong64 RtlUIntPtrToLongLong\n\n//\n// UINT_PTR -> RtlINT64 conversion\n//\n#define RtlUIntPtrToInt64  RtlUIntPtrToLongLong\n\n//\n// UINT_PTR -> ptrdiff_t conversion\n//\n#define RtlUIntPtrToPtrdiffT   RtlUIntPtrToIntPtr\n\n//\n// UINT_PTR -> SSIZE_T conversion\n//\n#define RtlUIntPtrToSSIZET RtlUIntPtrToLongPtr\n\n//\n// LONG -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToInt8(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= INT8_MIN) && (lOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToUChar(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= 255))\n    {\n        *pch = (UCHAR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlLongToChar(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlLongToUChar(lOperand, (UCHAR*)pch);\n#else\n    return RtlLongToInt8(lOperand, (INT8*)pch);\n#endif\n}\n\n//\n// LONG -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToUInt8(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= UINT8_MAX))\n    {\n        *pui8Result = (UINT8)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> BYTE conversion\n//\n#define RtlLongToByte  RtlLongToUInt8\n\n//\n// LONG -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToShort(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= SHORT_MIN) && (lOperand <= SHORT_MAX))\n    {\n       *psResult = (SHORT)lOperand;\n       status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> INT16 conversion\n//\n#define RtlLongToInt16 RtlLongToShort\n\n//\n// LONG -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToUShort(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= USHORT_MAX))\n    {\n        *pusResult = (USHORT)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> UINT16 conversion\n//\n#define RtlLongToUInt16    RtlLongToUShort\n\n//\n// LONG -> WORD conversion\n//\n#define RtlLongToWord  RtlLongToUShort\n\n//\n// LONG -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToInt(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT* piResult)\n{\n    C_ASSERT(sizeof(INT) == sizeof(LONG));\n    *piResult = (INT)lOperand;\n    return STATUS_SUCCESS;\n}\n\n//\n// LONG -> INT32 conversion\n//\n#define RtlLongToInt32 RtlLongToInt\n\n//\n// LONG -> INT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToIntPtr(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT_PTR* piResult)\n{\n    *piResult = lOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlLongToIntPtr    RtlLongToInt\n#endif\n\n//\n// LONG -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToUInt(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *puResult = (UINT)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> UINT32 conversion\n//\n#define RtlLongToUInt32    RtlLongToUInt\n\n//\n// LONG -> UINT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToUIntPtr(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *puResult = (UINT_PTR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#else\n#define RtlLongToUIntPtr   RtlLongToUInt\n#endif\n\n//\n// LONG -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToULong(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pulResult = (ULONG)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> ULONG_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToULongPtr(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pulResult = (ULONG_PTR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#else\n#define RtlLongToULongPtr  RtlLongToULong\n#endif\n\n//\n// LONG -> DWORD conversion\n//\n#define RtlLongToDWord RtlLongToULong\n\n//\n// LONG -> DWORD_PTR conversion\n//\n#define RtlLongToDWordPtr  RtlLongToULongPtr\n\n//\n// LONG -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongToULongLong(\n    _In_ LONG lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG -> DWORDLONG conversion\n//\n#define RtlLongToDWordLong RtlLongToULongLong\n\n//\n// LONG -> ULONG64 conversion\n//\n#define RtlLongToULong64   RtlLongToULongLong\n\n//\n// LONG -> DWORD64 conversion\n//\n#define RtlLongToDWord64   RtlLongToULongLong\n\n//\n// LONG -> UINT64 conversion\n//\n#define RtlLongToUInt64    RtlLongToULongLong\n\n//\n// LONG -> ptrdiff_t conversion\n//\n#define RtlLongToPtrdiffT  RtlLongToIntPtr\n\n//\n// LONG -> size_t conversion\n//\n#define RtlLongToSizeT RtlLongToUIntPtr\n\n//\n// LONG -> SIZE_T conversion\n//\n#define RtlLongToSIZET RtlLongToULongPtr\n\n//\n// LONG_PTR -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToInt8(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= INT8_MIN) && (lOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToUChar(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= 255))\n    {\n        *pch = (UCHAR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlLongPtrToChar(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlLongPtrToUChar(lOperand, (UCHAR*)pch);\n#else\n    return RtlLongPtrToInt8(lOperand, (INT8*)pch);\n#endif\n}\n\n//\n// LONG_PTR -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToUInt8(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= UINT8_MAX))\n    {\n        *pui8Result = (UINT8)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> BYTE conversion\n//\n#define RtlLongPtrToByte   RtlLongPtrToUInt8\n\n//\n// LONG_PTR -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToShort(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= SHORT_MIN) && (lOperand <= SHORT_MAX))\n    {\n        *psResult = (SHORT)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> INT16 conversion\n//\n#define RtlLongPtrToInt16  RtlLongPtrToShort\n\n//\n// LONG_PTR -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToUShort(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if ((lOperand >= 0) && (lOperand <= USHORT_MAX))\n    {\n        *pusResult = (USHORT)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> UINT16 conversion\n//\n#define RtlLongPtrToUInt16 RtlLongPtrToUShort\n\n//\n// LONG_PTR -> WORD conversion\n//\n#define RtlLongPtrToWord   RtlLongPtrToUShort\n\n//\n// LONG_PTR -> INT conversion\n//\n#ifdef _WIN64\n#define RtlLongPtrToInt    RtlLongLongToInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToInt(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT* piResult)\n{\n    C_ASSERT(sizeof(INT) == sizeof(LONG_PTR));\n    *piResult = (INT)lOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// LONG_PTR -> INT32 conversion\n//\n#define RtlLongPtrToInt32  RtlLongPtrToInt\n\n//\n// LONG_PTR -> INT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToIntPtr(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) INT_PTR* piResult)\n{\n    C_ASSERT(sizeof(LONG_PTR) == sizeof(INT_PTR));\n    *piResult = (INT_PTR)lOperand;\n    return STATUS_SUCCESS;\n}\n\n//\n// LONG_PTR -> UINT conversion\n//\n#ifdef _WIN64\n#define RtlLongPtrToUInt   RtlLongLongToUInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToUInt(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *puResult = (UINT)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// LONG_PTR -> UINT32 conversion\n//\n#define RtlLongPtrToUInt32 RtlLongPtrToUInt\n\n//\n// LONG_PTR -> UINT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToUIntPtr(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *puResult = (UINT_PTR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> LONG conversion\n//\n#ifdef _WIN64\n#define RtlLongPtrToLong   RtlLongLongToLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToLong(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) LONG* plResult)\n{\n    *plResult = (LONG)lOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// LONG_PTR -> ULONG conversion\n//\n#ifdef _WIN64\n#define RtlLongPtrToULong  RtlLongLongToULong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToULong(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pulResult = (ULONG)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif\n\n//\n// LONG_PTR -> ULONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToULongPtr(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pulResult = (ULONG_PTR)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> DWORD conversion\n//\n#define RtlLongPtrToDWord  RtlLongPtrToULong\n\n//\n// LONG_PTR -> DWORD_PTR conversion\n//\n#define RtlLongPtrToDWordPtr   RtlLongPtrToULongPtr\n\n//\n// LONG_PTR -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrToULongLong(\n    _In_ LONG_PTR lOperand,\n    _Out_ _Deref_out_range_(==, lOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (lOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)lOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONG_PTR -> DWORDLONG conversion\n//\n#define RtlLongPtrToDWordLong  RtlLongPtrToULongLong\n\n//\n// LONG_PTR -> ULONG64 conversion\n//\n#define RtlLongPtrToULong64    RtlLongPtrToULongLong\n\n//\n// LONG_PTR -> DWORD64 conversion\n//\n#define RtlLongPtrToDWord64    RtlLongPtrToULongLong\n\n//\n// LONG_PTR -> UINT64 conversion\n//\n#define RtlLongPtrToUInt64 RtlLongPtrToULongLong\n\n//\n// LONG_PTR -> size_t conversion\n//\n#define RtlLongPtrToSizeT  RtlLongPtrToUIntPtr\n\n//\n// LONG_PTR -> SIZE_T conversion\n//\n#define RtlLongPtrToSIZET  RtlLongPtrToULongPtr\n\n//\n// ULONG -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToInt8(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToUChar(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= 255)\n    {\n        *pch = (UCHAR)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlULongToChar(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlULongToUChar(ulOperand, (UCHAR*)pch);\n#else\n    return RtlULongToInt8(ulOperand, (INT8*)pch);\n#endif\n}\n\n//\n// ULONG -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToUInt8(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= UINT8_MAX)\n    {\n        *pui8Result = (UINT8)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> BYTE conversion\n//\n#define RtlULongToByte RtlULongToUInt8\n\n//\n// ULONG -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToShort(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> INT16 conversion\n//\n#define RtlULongToInt16    RtlULongToShort\n\n//\n// ULONG -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToUShort(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= USHORT_MAX)\n    {\n        *pusResult = (USHORT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> UINT16 conversion\n//\n#define RtlULongToUInt16   RtlULongToUShort\n\n//\n// ULONG -> WORD conversion\n//\n#define RtlULongToWord RtlULongToUShort\n\n//\n// ULONG -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToInt(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= INT_MAX)\n    {\n        *piResult = (INT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> INT32 conversion\n//\n#define RtlULongToInt32    RtlULongToInt\n\n//\n// ULONG -> INT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToIntPtr(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT_PTR* piResult)\n{\n    *piResult = (INT_PTR)ulOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlULongToIntPtr   RtlULongToInt\n#endif\n\n//\n// ULONG -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToUInt(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT* puResult)\n{\n    C_ASSERT(sizeof(ULONG) == sizeof(UINT));\n    *puResult = (UINT)ulOperand;\n    return STATUS_SUCCESS;\n}\n\n//\n// ULONG -> UINT32 conversion\n//\n#define RtlULongToUInt32   RtlULongToUInt\n\n//\n// ULONG -> UINT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToUIntPtr(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT_PTR* puiResult)\n{\n    C_ASSERT(sizeof(UINT_PTR) > sizeof(ULONG));\n    *puiResult = (UINT_PTR)ulOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlULongToUIntPtr  RtlULongToUInt\n#endif\n\n//\n// ULONG -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToLong(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= LONG_MAX)\n    {\n        *plResult = (LONG)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG -> LONG_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongToLongPtr(\n    _In_ ULONG ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) LONG_PTR* plResult)\n{\n    C_ASSERT(sizeof(LONG_PTR) > sizeof(ULONG));\n    *plResult = (LONG_PTR)ulOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlULongToLongPtr  RtlULongToLong\n#endif\n\n//\n// ULONG -> ptrdiff_t conversion\n//\n#define RtlULongToPtrdiffT RtlULongToIntPtr\n\n//\n// ULONG -> SSIZE_T conversion\n//\n#define RtlULongToSSIZET   RtlULongToLongPtr\n\n//\n// ULONG_PTR -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToInt8(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToUChar(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= 255)\n    {\n        *pch = (UCHAR)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlULongPtrToChar(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlULongPtrToUChar(ulOperand, (UCHAR*)pch);\n#else\n    return RtlULongPtrToInt8(ulOperand, (INT8*)pch);\n#endif\n}\n\n//\n// ULONG_PTR -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToUInt8(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT8* pui8Result)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= UINT8_MAX)\n    {\n        *pui8Result = (UINT8)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pui8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> BYTE conversion\n//\n#define RtlULongPtrToByte  RtlULongPtrToUInt8\n\n//\n// ULONG_PTR -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToShort(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> INT16 conversion\n//\n#define RtlULongPtrToInt16 RtlULongPtrToShort\n\n//\n// ULONG_PTR -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToUShort(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= USHORT_MAX)\n    {\n        *pusResult = (USHORT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> UINT16 conversion\n//\n#define RtlULongPtrToUInt16    RtlULongPtrToUShort\n\n//\n// ULONG_PTR -> WORD conversion\n//\n#define RtlULongPtrToWord  RtlULongPtrToUShort\n\n//\n// ULONG_PTR -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToInt(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= INT_MAX)\n    {\n        *piResult = (INT)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> INT32 conversion\n//\n#define RtlULongPtrToInt32 RtlULongPtrToInt\n\n//\n// ULONG_PTR -> INT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToIntPtr(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) INT_PTR* piResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= INT_PTR_MAX)\n    {\n        *piResult = (INT_PTR)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> UINT conversion\n//\n#ifdef _WIN64\n#define RtlULongPtrToUInt  RtlULongLongToUInt\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToUInt(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT* puResult)\n{\n    C_ASSERT(sizeof(ULONG_PTR) == sizeof(UINT));\n    *puResult = (UINT)ulOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// ULONG_PTR -> UINT32 conversion\n//\n#define RtlULongPtrToUInt32    RtlULongPtrToUInt\n\n//\n// ULONG_PTR -> UINT_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToUIntPtr(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) UINT_PTR* puResult)\n{\n    *puResult = (UINT_PTR)ulOperand;\n    return STATUS_SUCCESS;\n}\n\n//\n// ULONG_PTR -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToLong(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= LONG_MAX)\n    {\n        *plResult = (LONG)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> LONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToLongPtr(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) LONG_PTR* plResult)\n{\n    NTSTATUS status;\n\n    if (ulOperand <= LONG_PTR_MAX)\n    {\n        *plResult = (LONG_PTR)ulOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR -> ULONG conversion\n//\n#ifdef _WIN64\n#define RtlULongPtrToULong RtlULongLongToULong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToULong(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) ULONG* pulResult)\n{\n    *pulResult = (ULONG)ulOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// ULONG_PTR -> DWORD conversion\n//\n#define RtlULongPtrToDWord RtlULongPtrToULong\n\n//\n// ULONG_PTR -> LONGLONG conversion\n//\n#ifdef _WIN64\n#define RtlULongPtrToLongLong  RtlULongLongToLongLong\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrToLongLong(\n    _In_ ULONG_PTR ulOperand,\n    _Out_ _Deref_out_range_(==, ulOperand) LONGLONG* pllResult)\n{\n    *pllResult = (LONGLONG)ulOperand;\n    return STATUS_SUCCESS;\n}\n#endif\n\n//\n// ULONG_PTR -> LONG64 conversion\n//\n#define RtlULongPtrToLong64    RtlULongPtrToLongLong\n\n//\n// ULONG_PTR -> RtlINT64\n//\n#define RtlULongPtrToInt64 RtlULongPtrToLongLong\n\n//\n// ULONG_PTR -> ptrdiff_t conversion\n//\n#define RtlULongPtrToPtrdiffT  RtlULongPtrToIntPtr\n\n//\n// ULONG_PTR -> SSIZE_T conversion\n//\n#define RtlULongPtrToSSIZET    RtlULongPtrToLongPtr\n\n//\n// DWORD -> INT8 conversion\n//\n#define RtlDWordToInt8 RtlULongToInt8\n\n//\n// DWORD -> CHAR conversion\n//\n#define RtlDWordToChar RtlULongToChar\n\n//\n// DWORD -> UCHAR conversion\n//\n#define RtlDWordToUChar    RtlULongToUChar\n\n//\n// DWORD -> UINT8 conversion\n//\n#define RtlDWordToUInt8    RtlULongToUInt8\n\n//\n// DWORD -> BYTE conversion\n//\n#define RtlDWordToByte RtlULongToUInt8\n\n//\n// DWORD -> SHORT conversion\n//\n#define RtlDWordToShort    RtlULongToShort\n\n//\n// DWORD -> INT16 conversion\n//\n#define RtlDWordToInt16    RtlULongToShort\n\n//\n// DWORD -> USHORT conversion\n//\n#define RtlDWordToUShort   RtlULongToUShort\n\n//\n// DWORD -> UINT16 conversion\n//\n#define RtlDWordToUInt16   RtlULongToUShort\n\n//\n// DWORD -> WORD conversion\n//\n#define RtlDWordToWord RtlULongToUShort\n\n//\n// DWORD -> INT conversion\n//\n#define RtlDWordToInt  RtlULongToInt\n\n//\n// DWORD -> INT32 conversion\n//\n#define RtlDWordToInt32    RtlULongToInt\n\n//\n// DWORD -> INT_PTR conversion\n//\n#define RtlDWordToIntPtr   RtlULongToIntPtr\n\n//\n// DWORD -> UINT conversion\n//\n#define RtlDWordToUInt RtlULongToUInt\n\n//\n// DWORD -> UINT32 conversion\n//\n#define RtlDWordToUInt32   RtlULongToUInt\n\n//\n// DWORD -> UINT_PTR conversion\n//\n#define RtlDWordToUIntPtr  RtlULongToUIntPtr\n\n//\n// DWORD -> LONG conversion\n//\n#define RtlDWordToLong RtlULongToLong\n\n//\n// DWORD -> LONG_PTR conversion\n//\n#define RtlDWordToLongPtr  RtlULongToLongPtr\n\n//\n// DWORD -> ptrdiff_t conversion\n//\n#define RtlDWordToPtrdiffT RtlULongToIntPtr\n\n//\n// DWORD -> SSIZE_T conversion\n//\n#define RtlDWordToSSIZET   RtlULongToLongPtr\n\n//\n// DWORD_PTR -> INT8 conversion\n//\n#define RtlDWordPtrToInt8  RtlULongPtrToInt8\n\n//\n// DWORD_PTR -> UCHAR conversion\n//\n#define RtlDWordPtrToUChar RtlULongPtrToUChar\n\n//\n// DWORD_PTR -> CHAR conversion\n//\n#define RtlDWordPtrToChar  RtlULongPtrToChar\n\n//\n// DWORD_PTR -> UINT8 conversion\n//\n#define RtlDWordPtrToUInt8 RtlULongPtrToUInt8\n\n//\n// DWORD_PTR -> BYTE conversion\n//\n#define RtlDWordPtrToByte  RtlULongPtrToUInt8\n\n//\n// DWORD_PTR -> SHORT conversion\n//\n#define RtlDWordPtrToShort RtlULongPtrToShort\n\n//\n// DWORD_PTR -> INT16 conversion\n//\n#define RtlDWordPtrToInt16 RtlULongPtrToShort\n\n//\n// DWORD_PTR -> USHORT conversion\n//\n#define RtlDWordPtrToUShort    RtlULongPtrToUShort\n\n//\n// DWORD_PTR -> UINT16 conversion\n//\n#define RtlDWordPtrToUInt16    RtlULongPtrToUShort\n\n//\n// DWORD_PTR -> WORD conversion\n//\n#define RtlDWordPtrToWord  RtlULongPtrToUShort\n\n//\n// DWORD_PTR -> INT conversion\n//\n#define RtlDWordPtrToInt   RtlULongPtrToInt\n\n//\n// DWORD_PTR -> INT32 conversion\n//\n#define RtlDWordPtrToInt32 RtlULongPtrToInt\n\n//\n// DWORD_PTR -> INT_PTR conversion\n//\n#define RtlDWordPtrToIntPtr    RtlULongPtrToIntPtr\n\n//\n// DWORD_PTR -> UINT conversion\n//\n#define RtlDWordPtrToUInt  RtlULongPtrToUInt\n\n//\n// DWORD_PTR -> UINT32 conversion\n//\n#define RtlDWordPtrToUInt32    RtlULongPtrToUInt\n\n//\n// DWODR_PTR -> UINT_PTR conversion\n//\n#define RtlDWordPtrToUIntPtr   RtlULongPtrToUIntPtr\n\n//\n// DWORD_PTR -> LONG conversion\n//\n#define RtlDWordPtrToLong  RtlULongPtrToLong\n\n//\n// DWORD_PTR -> LONG_PTR conversion\n//\n#define RtlDWordPtrToLongPtr   RtlULongPtrToLongPtr\n\n//\n// DWORD_PTR -> ULONG conversion\n//\n#define RtlDWordPtrToULong RtlULongPtrToULong\n\n//\n// DWORD_PTR -> DWORD conversion\n//\n#define RtlDWordPtrToDWord RtlULongPtrToULong\n\n//\n// DWORD_PTR -> LONGLONG conversion\n//\n#define RtlDWordPtrToLongLong  RtlULongPtrToLongLong\n\n//\n// DWORD_PTR -> LONG64 conversion\n//\n#define RtlDWordPtrToLong64    RtlULongPtrToLongLong\n\n//\n// DWORD_PTR -> RtlINT64 conversion\n//\n#define RtlDWordPtrToInt64 RtlULongPtrToLongLong\n\n//\n// DWORD_PTR -> ptrdiff_t conversion\n//\n#define RtlDWordPtrToPtrdiffT  RtlULongPtrToIntPtr\n\n//\n// DWORD_PTR -> SSIZE_T conversion\n//\n#define RtlDWordPtrToSSIZET    RtlULongPtrToLongPtr\n\n//\n// LONGLONG -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToInt8(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= INT8_MIN) && (llOperand <= INT8_MAX))\n    {\n        *pi8Result = (INT8)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToUChar(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= 0) && (llOperand <= 255))\n    {\n        *pch = (UCHAR)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlLongLongToChar(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlLongLongToUChar(llOperand, (UCHAR*)pch);\n#else\n    return RtlLongLongToInt8(llOperand, (INT8*)pch);\n#endif\n}\n\n//\n// LONGLONG -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToUInt8(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= 0) && (llOperand <= UINT8_MAX))\n    {\n        *pu8Result = (UINT8)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> BYTE conversion\n//\n#define RtlLongLongToByte  RtlLongLongToUInt8\n\n//\n// LONGLONG -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToShort(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= SHORT_MIN) && (llOperand <= SHORT_MAX))\n    {\n        *psResult = (SHORT)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> INT16 conversion\n//\n#define RtlLongLongToInt16 RtlLongLongToShort\n\n//\n// LONGLONG -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToUShort(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= 0) && (llOperand <= USHORT_MAX))\n    {\n        *pusResult = (USHORT)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> UINT16 conversion\n//\n#define RtlLongLongToUInt16    RtlLongLongToUShort\n\n//\n// LONGLONG -> WORD conversion\n//\n#define RtlLongLongToWord  RtlLongLongToUShort\n\n//\n// LONGLONG -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToInt(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= INT_MIN) && (llOperand <= INT_MAX))\n    {\n        *piResult = (INT)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> INT32 conversion\n//\n#define RtlLongLongToInt32 RtlLongLongToInt\n\n//\n// LONGLONG -> INT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToIntPtr(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) INT_PTR* piResult)\n{\n    *piResult = llOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlLongLongToIntPtr   RtlLongLongToInt\n#endif\n\n//\n// LONGLONG -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToUInt(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= 0) && (llOperand <= UINT_MAX))\n    {\n        *puResult = (UINT)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> UINT32 conversion\n//\n#define RtlLongLongToUInt32    RtlLongLongToUInt\n\n//\n// LONGLONG -> UINT_PTR conversion\n//\n#ifdef _WIN64\n#define RtlLongLongToUIntPtr  RtlLongLongToULongLong\n#else\n#define RtlLongLongToUIntPtr  RtlLongLongToUInt\n#endif\n\n//\n// LONGLONG -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToLong(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= LONG_MIN) && (llOperand <= LONG_MAX))\n    {\n        *plResult = (LONG)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> LONG_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToLongPtr(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) LONG_PTR* plResult)\n{\n    *plResult = (LONG_PTR)llOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlLongLongToLongPtr  RtlLongLongToLong\n#endif\n\n//\n// LONGLONG -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToULong(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if ((llOperand >= 0) && (llOperand <= ULONG_MAX))\n    {\n        *pulResult = (ULONG)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> ULONG_PTR conversion\n//\n#ifdef _WIN64\n#define RtlLongLongToULongPtr RtlLongLongToULongLong\n#else\n#define RtlLongLongToULongPtr RtlLongLongToULong\n#endif\n\n//\n// LONGLONG -> DWORD conversion\n//\n#define RtlLongLongToDWord    RtlLongLongToULong\n\n//\n// LONGLONG -> DWORD_PTR conversion\n//\n#define RtlLongLongToDWordPtr RtlLongLongToULongPtr\n\n//\n// LONGLONG -> ULONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongToULongLong(\n    _In_ LONGLONG llOperand,\n    _Out_ _Deref_out_range_(==, llOperand) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (llOperand >= 0)\n    {\n        *pullResult = (ULONGLONG)llOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// LONGLONG -> DWORDLONG conversion\n//\n#define RtlLongLongToDWordLong RtlLongLongToULongLong\n\n//\n// LONGLONG -> ULONG64 conversion\n//\n#define RtlLongLongToULong64   RtlLongLongToULongLong\n\n//\n// LONGLONG -> DWORD64 conversion\n//\n#define RtlLongLongToDWord64   RtlLongLongToULongLong\n\n//\n// LONGLONG -> UINT64 conversion\n//\n#define RtlLongLongToUInt64    RtlLongLongToULongLong\n\n//\n// LONGLONG -> ptrdiff_t conversion\n//\n#define RtlLongLongToPtrdiffT RtlLongLongToIntPtr\n\n//\n// LONGLONG -> size_t conversion\n//\n#define RtlLongLongToSizeT    RtlLongLongToUIntPtr\n\n//\n// LONGLONG -> SSIZE_T conversion\n//\n#define RtlLongLongToSSIZET   RtlLongLongToLongPtr\n\n//\n// LONGLONG -> SIZE_T conversion\n//\n#define RtlLongLongToSIZET    RtlLongLongToULongPtr\n\n//\n// LONG64 -> CHAR conversion\n//\n#define RtlLong64ToChar    RtlLongLongToChar\n\n//\n// LONG64 -> INT8 conversion\n//\n#define RtlLong64ToInt8    RtlLongLongToInt8\n\n//\n// LONG64 -> UCHAR conversion\n//\n#define RtlLong64ToUChar   RtlLongLongToUChar\n\n//\n// LONG64 -> UINT8 conversion\n//\n#define RtlLong64ToUInt8   RtlLongLongToUInt8\n\n//\n// LONG64 -> BYTE conversion\n//\n#define RtlLong64ToByte    RtlLongLongToUInt8\n\n//\n// LONG64 -> SHORT conversion\n//\n#define RtlLong64ToShort   RtlLongLongToShort\n\n//\n// LONG64 -> INT16 conversion\n//\n#define RtlLong64ToInt16   RtlLongLongToShort\n\n//\n// LONG64 -> USHORT conversion\n//\n#define RtlLong64ToUShort  RtlLongLongToUShort\n\n//\n// LONG64 -> UINT16 conversion\n//\n#define RtlLong64ToUInt16  RtlLongLongToUShort\n\n//\n// LONG64 -> WORD conversion\n//\n#define RtlLong64ToWord    RtlLongLongToUShort\n\n//\n// LONG64 -> INT conversion\n//\n#define RtlLong64ToInt RtlLongLongToInt\n\n//\n// LONG64 -> INT32 conversion\n//\n#define RtlLong64ToInt32   RtlLongLongToInt\n\n//\n// LONG64 -> INT_PTR conversion\n//\n#define RtlLong64ToIntPtr  RtlLongLongToIntPtr\n\n//\n// LONG64 -> UINT conversion\n//\n#define RtlLong64ToUInt    RtlLongLongToUInt\n\n//\n// LONG64 -> UINT32 conversion\n//\n#define RtlLong64ToUInt32  RtlLongLongToUInt\n\n//\n// LONG64 -> UINT_PTR conversion\n//\n#define RtlLong64ToUIntPtr RtlLongLongToUIntPtr\n\n//\n// LONG64 -> LONG conversion\n//\n#define RtlLong64ToLong    RtlLongLongToLong\n\n//\n// LONG64 -> LONG_PTR conversion\n//\n#define RtlLong64ToLongPtr RtlLongLongToLongPtr\n\n//\n// LONG64 -> ULONG conversion\n//\n#define RtlLong64ToULong   RtlLongLongToULong\n\n//\n// LONG64 -> ULONG_PTR conversion\n//\n#define RtlLong64ToULongPtr    RtlLongLongToULongPtr\n\n//\n// LONG64 -> DWORD conversion\n//\n#define RtlLong64ToDWord   RtlLongLongToULong\n\n//\n// LONG64 -> DWORD_PTR conversion\n//\n#define RtlLong64ToDWordPtr    RtlLongLongToULongPtr\n\n//\n// LONG64 -> ULONGLONG conversion\n//\n#define RtlLong64ToULongLong   RtlLongLongToULongLong\n\n//\n// LONG64 -> ptrdiff_t conversion\n//\n#define RtlLong64ToPtrdiffT    RtlLongLongToIntPtr\n\n//\n// LONG64 -> size_t conversion\n//\n#define RtlLong64ToSizeT   RtlLongLongToUIntPtr\n\n//\n// LONG64 -> SSIZE_T conversion\n//\n#define RtlLong64ToSSIZET  RtlLongLongToLongPtr\n\n//\n// LONG64 -> SIZE_T conversion\n//\n#define RtlLong64ToSIZET   RtlLongLongToULongPtr\n\n//\n// RtlINT64 -> CHAR conversion\n//\n#define RtlInt64ToChar RtlLongLongToChar\n\n//\n// RtlINT64 -> INT8 conversion\n//\n#define RtlInt64ToInt8 RtlLongLongToInt8\n\n//\n// RtlINT64 -> UCHAR conversion\n//\n#define RtlInt64ToUChar    RtlLongLongToUChar\n\n//\n// RtlINT64 -> UINT8 conversion\n//\n#define RtlInt64ToUInt8    RtlLongLongToUInt8\n\n//\n// RtlINT64 -> BYTE conversion\n//\n#define RtlInt64ToByte RtlLongLongToUInt8\n\n//\n// RtlINT64 -> SHORT conversion\n//\n#define RtlInt64ToShort    RtlLongLongToShort\n\n//\n// RtlINT64 -> INT16 conversion\n//\n#define RtlInt64ToInt16    RtlLongLongToShort\n\n//\n// RtlINT64 -> USHORT conversion\n//\n#define RtlInt64ToUShort   RtlLongLongToUShort\n\n//\n// RtlINT64 -> UINT16 conversion\n//\n#define RtlInt64ToUInt16   RtlLongLongToUShort\n\n//\n// RtlINT64 -> WORD conversion\n//\n#define RtlInt64ToWord RtlLongLongToUShort\n\n//\n// RtlINT64 -> INT conversion\n//\n#define RtlInt64ToInt  RtlLongLongToInt\n\n//\n// RtlINT64 -> INT32 conversion\n//\n#define RtlInt64ToInt32    RtlLongLongToInt\n\n//\n// RtlINT64 -> INT_PTR conversion\n//\n#define RtlInt64ToIntPtr   RtlLongLongToIntPtr\n\n//\n// RtlINT64 -> UINT conversion\n//\n#define RtlInt64ToUInt RtlLongLongToUInt\n\n//\n// RtlINT64 -> UINT32 conversion\n//\n#define RtlInt64ToUInt32   RtlLongLongToUInt\n\n//\n// RtlINT64 -> UINT_PTR conversion\n//\n#define RtlInt64ToUIntPtr  RtlLongLongToUIntPtr\n\n//\n// RtlINT64 -> LONG conversion\n//\n#define RtlInt64ToLong RtlLongLongToLong\n\n//\n// RtlINT64 -> LONG_PTR conversion\n//\n#define RtlInt64ToLongPtr  RtlLongLongToLongPtr\n\n//\n// RtlINT64 -> ULONG conversion\n//\n#define RtlInt64ToULong    RtlLongLongToULong\n\n//\n// RtlINT64 -> ULONG_PTR conversion\n//\n#define RtlInt64ToULongPtr RtlLongLongToULongPtr\n\n//\n// RtlINT64 -> DWORD conversion\n//\n#define RtlInt64ToDWord    RtlLongLongToULong\n\n//\n// RtlINT64 -> DWORD_PTR conversion\n//\n#define RtlInt64ToDWordPtr RtlLongLongToULongPtr\n\n//\n// RtlINT64 -> ULONGLONG conversion\n//\n#define RtlInt64ToULongLong    RtlLongLongToULongLong\n\n//\n// RtlINT64 -> DWORDLONG conversion\n//\n#define RtlInt64ToDWordLong    RtlLongLongToULongLong\n\n//\n// RtlINT64 -> ULONG64 conversion\n//\n#define RtlInt64ToULong64  RtlLongLongToULongLong\n\n//\n// RtlINT64 -> DWORD64 conversion\n//\n#define RtlInt64ToDWord64  RtlLongLongToULongLong\n\n//\n// RtlINT64 -> UINT64 conversion\n//\n#define RtlInt64ToUInt64   RtlLongLongToULongLong\n\n//\n// RtlINT64 -> ptrdiff_t conversion\n//\n#define RtlInt64ToPtrdiffT RtlLongLongToIntPtr\n\n//\n// RtlINT64 -> size_t conversion\n//\n#define RtlInt64ToSizeT    RtlLongLongToUIntPtr\n\n//\n// RtlINT64 -> SSIZE_T conversion\n//\n#define RtlInt64ToSSIZET   RtlLongLongToLongPtr\n\n//\n// RtlINT64 -> SIZE_T conversion\n//\n#define RtlInt64ToSIZET    RtlLongLongToULongPtr\n\n//\n// ULONGLONG -> INT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToInt8(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) INT8* pi8Result)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= INT8_MAX)\n    {\n        *pi8Result = (INT8)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pi8Result = INT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> UCHAR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToUChar(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) UCHAR* pch)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= 255)\n    {\n        *pch = (UCHAR)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pch = '\\0';\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> CHAR conversion\n//\n__forceinline\nNTSTATUS\nRtlULongLongToChar(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) CHAR* pch)\n{\n#ifdef _CHAR_UNSIGNED\n    return RtlULongLongToUChar(ullOperand, (UCHAR*)pch);\n#else\n    return RtlULongLongToInt8(ullOperand, (INT8*)pch);\n#endif\n}\n\n//\n// ULONGLONG -> UINT8 conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToUInt8(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= UINT8_MAX)\n    {\n        *pu8Result = (UINT8)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> BYTE conversion\n//\n#define RtlULongLongToByte RtlULongLongToUInt8\n\n//\n// ULONGLONG -> SHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToShort(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) SHORT* psResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= SHORT_MAX)\n    {\n        *psResult = (SHORT)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *psResult = SHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> INT16 conversion\n//\n#define RtlULongLongToInt16    RtlULongLongToShort\n\n//\n// ULONGLONG -> USHORT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToUShort(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= USHORT_MAX)\n    {\n        *pusResult = (USHORT)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> UINT16 conversion\n//\n#define RtlULongLongToUInt16   RtlULongLongToUShort\n\n//\n// ULONGLONG -> WORD conversion\n//\n#define RtlULongLongToWord RtlULongLongToUShort\n\n//\n// ULONGLONG -> INT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToInt(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) INT* piResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= INT_MAX)\n    {\n        *piResult = (INT)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *piResult = INT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> INT32 conversion\n//\n#define RtlULongLongToInt32    RtlULongLongToInt\n\n//\n// ULONGLONG -> INT_PTR conversion\n//\n#ifdef _WIN64\n#define RtlULongLongToIntPtr   RtlULongLongToLongLong\n#else\n#define RtlULongLongToIntPtr   RtlULongLongToInt\n#endif\n\n//\n// ULONGLONG -> UINT conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToUInt(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= UINT_MAX)\n    {\n        *puResult = (UINT)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> UINT32 conversion\n//\n#define RtlULongLongToUInt32   RtlULongLongToUInt\n\n//\n// ULONGLONG -> UINT_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToUIntPtr(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) UINT_PTR* puResult)\n{\n    *puResult = ullOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlULongLongToUIntPtr  RtlULongLongToUInt\n#endif\n\n//\n// ULONGLONG -> LONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToLong(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) LONG* plResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= LONG_MAX)\n    {\n        *plResult = (LONG)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> LONG_PTR conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToLongPtr(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) LONG_PTR* plResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= LONG_PTR_MAX)\n    {\n        *plResult = (LONG_PTR)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *plResult = LONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> ULONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToULong(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= ULONG_MAX)\n    {\n        *pulResult = (ULONG)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> ULONG_PTR conversion\n//\n#ifdef _WIN64\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToULongPtr(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) ULONG_PTR* pulResult)\n{\n    *pulResult = ullOperand;\n    return STATUS_SUCCESS;\n}\n#else\n#define RtlULongLongToULongPtr RtlULongLongToULong\n#endif\n\n//\n// ULONGLONG -> DWORD conversion\n//\n#define RtlULongLongToDWord    RtlULongLongToULong\n\n//\n// ULONGLONG -> DWORD_PTR conversion\n//\n#define RtlULongLongToDWordPtr RtlULongLongToULongPtr\n\n//\n// ULONGLONG -> LONGLONG conversion\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongToLongLong(\n    _In_ ULONGLONG ullOperand,\n    _Out_ _Deref_out_range_(==, ullOperand) LONGLONG* pllResult)\n{\n    NTSTATUS status;\n\n    if (ullOperand <= LONGLONG_MAX)\n    {\n        *pllResult = (LONGLONG)ullOperand;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pllResult = LONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONGLONG -> RtlINT64 conversion\n//\n#define RtlULongLongToInt64    RtlULongLongToLongLong\n\n//\n// ULONGLONG -> LONG64 conversion\n//\n#define RtlULongLongToLong64   RtlULongLongToLongLong\n\n//\n// ULONGLONG -> ptrdiff_t conversion\n//\n#define RtlULongLongToPtrdiffT RtlULongLongToIntPtr\n\n//\n// ULONGLONG -> size_t conversion\n//\n#define RtlULongLongToSizeT    RtlULongLongToUIntPtr\n\n//\n// ULONGLONG -> SSIZE_T conversion\n//\n#define RtlULongLongToSSIZET   RtlULongLongToLongPtr\n\n//\n// ULONGLONG -> SIZE_T conversion\n//\n#define RtlULongLongToSIZET    RtlULongLongToULongPtr\n\n//\n// DWORDLONG -> CHAR conversion\n//\n#define RtlDWordLongToChar RtlULongLongToChar\n\n//\n// DWORDLONG -> INT8 conversion\n//\n#define RtlDWordLongToInt8 RtlULongLongToInt8\n\n//\n// DWORDLONG -> UCHAR conversion\n//\n#define RtlDWordLongToUChar    RtlULongLongToUChar\n\n//\n// DWORDLONG -> UINT8 conversion\n//\n#define RtlDWordLongToUInt8    RtlULongLongToUInt8\n\n//\n// DWORDLONG -> BYTE conversion\n//\n#define RtlDWordLongToByte RtlULongLongToUInt8\n\n//\n// DWORDLONG -> SHORT conversion\n//\n#define RtlDWordLongToShort    RtlULongLongToShort\n\n//\n// DWORDLONG -> INT16 conversion\n//\n#define RtlDWordLongToInt16    RtlULongLongToShort\n\n//\n// DWORDLONG -> USHORT conversion\n//\n#define RtlDWordLongToUShort   RtlULongLongToUShort\n\n//\n// DWORDLONG -> UINT16 conversion\n//\n#define RtlDWordLongToUInt16   RtlULongLongToUShort\n\n//\n// DWORDLONG -> WORD conversion\n//\n#define RtlDWordLongToWord RtlULongLongToUShort\n\n//\n// DWORDLONG -> INT conversion\n//\n#define RtlDWordLongToInt  RtlULongLongToInt\n\n//\n// DWORDLONG -> INT32 conversion\n//\n#define RtlDWordLongToInt32    RtlULongLongToInt\n\n//\n// DWORDLONG -> INT_PTR conversion\n//\n#define RtlDWordLongToIntPtr   RtlULongLongToIntPtr\n\n//\n// DWORDLONG -> UINT conversion\n//\n#define RtlDWordLongToUInt RtlULongLongToUInt\n\n//\n// DWORDLONG -> UINT32 conversion\n//\n#define RtlDWordLongToUInt32   RtlULongLongToUInt\n\n//\n// DWORDLONG -> UINT_PTR conversion\n//\n#define RtlDWordLongToUIntPtr  RtlULongLongToUIntPtr\n\n//\n// DWORDLONG -> LONG conversion\n//\n#define RtlDWordLongToLong RtlULongLongToLong\n\n//\n// DWORDLONG -> LONG_PTR conversion\n//\n#define RtlDWordLongToLongPtr  RtlULongLongToLongPtr\n\n//\n// DWORDLONG -> ULONG conversion\n//\n#define RtlDWordLongToULong    RtlULongLongToULong\n\n//\n// DWORDLONG -> ULONG_PTR conversion\n//\n#define RtlDWordLongToULongPtr RtlULongLongToULongPtr\n\n//\n// DWORDLONG -> DWORD conversion\n//\n#define RtlDWordLongToDWord    RtlULongLongToULong\n\n//\n// DWORDLONG -> DWORD_PTR conversion\n//\n#define RtlDWordLongToDWordPtr RtlULongLongToULongPtr\n\n//\n// DWORDLONG -> LONGLONG conversion\n//\n#define RtlDWordLongToLongLong RtlULongLongToLongLong\n\n//\n// DWORDLONG -> LONG64 conversion\n//\n#define RtlDWordLongToLong64   RtlULongLongToLongLong\n\n//\n// DWORDLONG -> RtlINT64 conversion\n//\n#define RtlDWordLongToInt64    RtlULongLongToLongLong\n\n//\n// DWORDLONG -> ptrdiff_t conversion\n//\n#define RtlDWordLongToPtrdiffT RtlULongLongToIntPtr\n\n//\n// DWORDLONG -> size_t conversion\n//\n#define RtlDWordLongToSizeT    RtlULongLongToUIntPtr\n\n//\n// DWORDLONG -> SSIZE_T conversion\n//\n#define RtlDWordLongToSSIZET   RtlULongLongToLongPtr\n\n//\n// DWORDLONG -> SIZE_T conversion\n//\n#define RtlDWordLongToSIZET    RtlULongLongToULongPtr\n\n//\n// ULONG64 -> CHAR conversion\n//\n#define RtlULong64ToChar   RtlULongLongToChar\n\n//\n// ULONG64 -> INT8 conversion\n//\n#define RtlULong64ToInt8   RtlULongLongToInt8\n\n//\n// ULONG64 -> UCHAR conversion\n//\n#define RtlULong64ToUChar  RtlULongLongToUChar\n\n//\n// ULONG64 -> UINT8 conversion\n//\n#define RtlULong64ToUInt8  RtlULongLongToUInt8\n\n//\n// ULONG64 -> BYTE conversion\n//\n#define RtlULong64ToByte   RtlULongLongToUInt8\n\n//\n// ULONG64 -> SHORT conversion\n//\n#define RtlULong64ToShort  RtlULongLongToShort\n\n//\n// ULONG64 -> INT16 conversion\n//\n#define RtlULong64ToInt16  RtlULongLongToShort\n\n//\n// ULONG64 -> USHORT conversion\n//\n#define RtlULong64ToUShort RtlULongLongToUShort\n\n//\n// ULONG64 -> UINT16 conversion\n//\n#define RtlULong64ToUInt16 RtlULongLongToUShort\n\n//\n// ULONG64 -> WORD conversion\n//\n#define RtlULong64ToWord   RtlULongLongToUShort\n\n//\n// ULONG64 -> INT conversion\n//\n#define RtlULong64ToInt    RtlULongLongToInt\n\n//\n// ULONG64 -> INT32 conversion\n//\n#define RtlULong64ToInt32  RtlULongLongToInt\n\n//\n// ULONG64 -> INT_PTR conversion\n//\n#define RtlULong64ToIntPtr RtlULongLongToIntPtr\n\n//\n// ULONG64 -> UINT conversion\n//\n#define RtlULong64ToUInt   RtlULongLongToUInt\n\n//\n// ULONG64 -> UINT32 conversion\n//\n#define RtlULong64ToUInt32 RtlULongLongToUInt\n\n//\n// ULONG64 -> UINT_PTR conversion\n//\n#define RtlULong64ToUIntPtr    RtlULongLongToUIntPtr\n\n//\n// ULONG64 -> LONG conversion\n//\n#define RtlULong64ToLong   RtlULongLongToLong\n\n//\n// ULONG64 -> LONG_PTR conversion\n//\n#define RtlULong64ToLongPtr    RtlULongLongToLongPtr\n\n//\n// ULONG64 -> ULONG conversion\n//\n#define RtlULong64ToULong  RtlULongLongToULong\n\n//\n// ULONG64 -> ULONG_PTR conversion\n//\n#define RtlULong64ToULongPtr   RtlULongLongToULongPtr\n\n//\n// ULONG64 -> DWORD conversion\n//\n#define RtlULong64ToDWord  RtlULongLongToULong\n\n//\n// ULONG64 -> DWORD_PTR conversion\n//\n#define RtlULong64ToDWordPtr   RtlULongLongToULongPtr\n\n//\n// ULONG64 -> LONGLONG conversion\n//\n#define RtlULong64ToLongLong   RtlULongLongToLongLong\n\n//\n// ULONG64 -> LONG64 conversion\n//\n#define RtlULong64ToLong64 RtlULongLongToLongLong\n\n//\n// ULONG64 -> RtlINT64 conversion\n//\n#define RtlULong64ToInt64  RtlULongLongToLongLong\n\n//\n// ULONG64 -> ptrdiff_t conversion\n//\n#define RtlULong64ToPtrdiffT   RtlULongLongToIntPtr\n\n//\n// ULONG64 -> size_t conversion\n//\n#define RtlULong64ToSizeT  RtlULongLongToUIntPtr\n\n//\n// ULONG64 -> SSIZE_T conversion\n//\n#define RtlULong64ToSSIZET RtlULongLongToLongPtr\n\n//\n// ULONG64 -> SIZE_T conversion\n//\n#define RtlULong64ToSIZET  RtlULongLongToULongPtr\n\n//\n// DWORD64 -> CHAR conversion\n//\n#define RtlDWord64ToChar   RtlULongLongToChar\n\n//\n// DWORD64 -> INT8 conversion\n//\n#define RtlDWord64ToInt8   RtlULongLongToInt8\n\n//\n// DWORD64 -> UCHAR conversion\n//\n#define RtlDWord64ToUChar  RtlULongLongToUChar\n\n//\n// DWORD64 -> UINT8 conversion\n//\n#define RtlDWord64ToUInt8  RtlULongLongToUInt8\n\n//\n// DWORD64 -> BYTE conversion\n//\n#define RtlDWord64ToByte   RtlULongLongToUInt8\n\n//\n// DWORD64 -> SHORT conversion\n//\n#define RtlDWord64ToShort  RtlULongLongToShort\n\n//\n// DWORD64 -> INT16 conversion\n//\n#define RtlDWord64ToInt16  RtlULongLongToShort\n\n//\n// DWORD64 -> USHORT conversion\n//\n#define RtlDWord64ToUShort RtlULongLongToUShort\n\n//\n// DWORD64 -> UINT16 conversion\n//\n#define RtlDWord64ToUInt16 RtlULongLongToUShort\n\n//\n// DWORD64 -> WORD conversion\n//\n#define RtlDWord64ToWord   RtlULongLongToUShort\n\n//\n// DWORD64 -> INT conversion\n//\n#define RtlDWord64ToInt    RtlULongLongToInt\n\n//\n// DWORD64 -> INT32 conversion\n//\n#define RtlDWord64ToInt32  RtlULongLongToInt\n\n//\n// DWORD64 -> INT_PTR conversion\n//\n#define RtlDWord64ToIntPtr RtlULongLongToIntPtr\n\n//\n// DWORD64 -> UINT conversion\n//\n#define RtlDWord64ToUInt   RtlULongLongToUInt\n\n//\n// DWORD64 -> UINT32 conversion\n//\n#define RtlDWord64ToUInt32 RtlULongLongToUInt\n\n//\n// DWORD64 -> UINT_PTR conversion\n//\n#define RtlDWord64ToUIntPtr    RtlULongLongToUIntPtr\n\n//\n// DWORD64 -> LONG conversion\n//\n#define RtlDWord64ToLong   RtlULongLongToLong\n\n//\n// DWORD64 -> LONG_PTR conversion\n//\n#define RtlDWord64ToLongPtr    RtlULongLongToLongPtr\n\n//\n// DWORD64 -> ULONG conversion\n//\n#define RtlDWord64ToULong  RtlULongLongToULong\n\n//\n// DWORD64 -> ULONG_PTR conversion\n//\n#define RtlDWord64ToULongPtr   RtlULongLongToULongPtr\n\n//\n// DWORD64 -> DWORD conversion\n//\n#define RtlDWord64ToDWord  RtlULongLongToULong\n\n//\n// DWORD64 -> DWORD_PTR conversion\n//\n#define RtlDWord64ToDWordPtr   RtlULongLongToULongPtr\n\n//\n// DWORD64 -> LONGLONG conversion\n//\n#define RtlDWord64ToLongLong   RtlULongLongToLongLong\n\n//\n// DWORD64 -> LONG64 conversion\n//\n#define RtlDWord64ToLong64 RtlULongLongToLongLong\n\n//\n// DWORD64 -> RtlINT64 conversion\n//\n#define RtlDWord64ToInt64  RtlULongLongToLongLong\n\n//\n// DWORD64 -> ptrdiff_t conversion\n//\n#define RtlDWord64ToPtrdiffT   RtlULongLongToIntPtr\n\n//\n// DWORD64 -> size_t conversion\n//\n#define RtlDWord64ToSizeT  RtlULongLongToUIntPtr\n\n//\n// DWORD64 -> SSIZE_T conversion\n//\n#define RtlDWord64ToSSIZET RtlULongLongToLongPtr\n\n//\n// DWORD64 -> SIZE_T conversion\n//\n#define RtlDWord64ToSIZET  RtlULongLongToULongPtr\n\n//\n// UINT64 -> CHAR conversion\n//\n#define RtlUInt64ToChar    RtlULongLongToChar\n\n//\n// UINT64 -> INT8 conversion\n//\n#define RtlUInt64ToInt8    RtlULongLongToInt8\n\n//\n// UINT64 -> UCHAR conversion\n//\n#define RtlUInt64ToUChar   RtlULongLongToUChar\n\n//\n// UINT64 -> UINT8 conversion\n//\n#define RtlUInt64ToUInt8   RtlULongLongToUInt8\n\n//\n// UINT64 -> BYTE conversion\n//\n#define RtlUInt64ToByte    RtlULongLongToUInt8\n\n//\n// UINT64 -> SHORT conversion\n//\n#define RtlUInt64ToShort   RtlULongLongToShort\n\n//\n// UINT64 -> INT16 conversion\n//\n//\n#define RtlUInt64ToInt16   RtlULongLongToShort\n\n//\n// UINT64 -> USHORT conversion\n//\n#define RtlUInt64ToUShort  RtlULongLongToUShort\n\n//\n// UINT64 -> UINT16 conversion\n//\n#define RtlUInt64ToUInt16  RtlULongLongToUShort\n\n//\n// UINT64 -> WORD conversion\n//\n#define RtlUInt64ToWord    RtlULongLongToUShort\n\n//\n// UINT64 -> INT conversion\n//\n#define RtlUInt64ToInt RtlULongLongToInt\n\n//\n// UINT64 -> INT32 conversion\n//\n#define RtlUInt64ToInt32   RtlULongLongToInt\n\n//\n// UINT64 -> INT_PTR conversion\n//\n#define RtlUInt64ToIntPtr  RtlULongLongToIntPtr\n\n//\n// UINT64 -> UINT conversion\n//\n#define RtlUInt64ToUInt    RtlULongLongToUInt\n\n//\n// UINT64 -> UINT32 conversion\n//\n#define RtlUInt64ToUInt32  RtlULongLongToUInt\n\n//\n// UINT64 -> UINT_PTR conversion\n//\n#define RtlUInt64ToUIntPtr RtlULongLongToUIntPtr\n\n//\n// UINT64 -> LONG conversion\n//\n#define RtlUInt64ToLong    RtlULongLongToLong\n\n//\n// UINT64 -> LONG_PTR conversion\n//\n#define RtlUInt64ToLongPtr RtlULongLongToLongPtr\n\n//\n// UINT64 -> ULONG conversion\n//\n#define RtlUInt64ToULong   RtlULongLongToULong\n\n//\n// UINT64 -> ULONG_PTR conversion\n//\n#define RtlUInt64ToULongPtr    RtlULongLongToULongPtr\n\n//\n// UINT64 -> DWORD conversion\n//\n#define RtlUInt64ToDWord   RtlULongLongToULong\n\n//\n// UINT64 -> DWORD_PTR conversion\n//\n#define RtlUInt64ToDWordPtr    RtlULongLongToULongPtr\n\n//\n// UINT64 -> LONGLONG conversion\n//\n#define RtlUInt64ToLongLong    RtlULongLongToLongLong\n\n//\n// UINT64 -> LONG64 conversion\n//\n#define RtlUInt64ToLong64  RtlULongLongToLongLong\n\n//\n// UINT64 -> RtlINT64 conversion\n//\n#define RtlUInt64ToInt64   RtlULongLongToLongLong\n\n//\n// UINT64 -> ptrdiff_t conversion\n//\n#define RtlUInt64ToPtrdiffT    RtlULongLongToIntPtr\n\n//\n// UINT64 -> size_t conversion\n//\n#define RtlUInt64ToSizeT   RtlULongLongToUIntPtr\n\n//\n// UINT64 -> SSIZE_T conversion\n//\n#define RtlUInt64ToSSIZET  RtlULongLongToLongPtr\n\n//\n// UINT64 -> SIZE_T conversion\n//\n#define RtlUInt64ToSIZET  RtlULongLongToULongPtr\n\n//\n// ptrdiff_t -> CHAR conversion\n//\n#define RtlPtrdiffTToChar  RtlIntPtrToChar\n\n//\n// ptrdiff_t -> INT8 conversion\n//\n#define RtlPtrdiffTToInt8  RtlIntPtrToInt8\n\n//\n// ptrdiff_t -> UCHAR conversion\n//\n#define RtlPtrdiffTToUChar RtlIntPtrToUChar\n\n//\n// ptrdiff_t -> UINT8 conversion\n//\n#define RtlPtrdiffTToUInt8 RtlIntPtrToUInt8\n\n//\n// ptrdiff_t -> BYTE conversion\n//\n#define RtlPtrdiffTToByte  RtlIntPtrToUInt8\n\n//\n// ptrdiff_t -> SHORT conversion\n//\n#define RtlPtrdiffTToShort RtlIntPtrToShort\n\n//\n// ptrdiff_t -> INT16 conversion\n//\n#define RtlPtrdiffTToInt16 RtlIntPtrToShort\n\n//\n// ptrdiff_t -> USHORT conversion\n//\n#define RtlPtrdiffTToUShort    RtlIntPtrToUShort\n\n//\n// ptrdiff_t -> UINT16 conversion\n//\n#define RtlPtrdiffTToUInt16    RtlIntPtrToUShort\n\n//\n// ptrdiff_t -> WORD conversion\n//\n#define RtlPtrdiffTToWord  RtlIntPtrToUShort\n\n//\n// ptrdiff_t -> INT conversion\n//\n#define RtlPtrdiffTToInt   RtlIntPtrToInt\n\n//\n// ptrdiff_t -> INT32 conversion\n//\n#define RtlPtrdiffTToInt32 RtlIntPtrToInt\n\n//\n// ptrdiff_t -> UINT conversion\n//\n#define RtlPtrdiffTToUInt  RtlIntPtrToUInt\n\n//\n// ptrdiff_t -> UINT32 conversion\n//\n#define RtlPtrdiffTToUInt32    RtlIntPtrToUInt\n\n//\n// ptrdiff_t -> UINT_PTR conversion\n//\n#define RtlPtrdiffTToUIntPtr   RtlIntPtrToUIntPtr\n\n//\n// ptrdiff_t -> LONG conversion\n//\n#define RtlPtrdiffTToLong  RtlIntPtrToLong\n\n//\n// ptrdiff_t -> LONG_PTR conversion\n//\n#define RtlPtrdiffTToLongPtr   RtlIntPtrToLongPtr\n\n//\n// ptrdiff_t -> ULONG conversion\n//\n#define RtlPtrdiffTToULong RtlIntPtrToULong\n\n//\n// ptrdiff_t -> ULONG_PTR conversion\n//\n#define RtlPtrdiffTToULongPtr  RtlIntPtrToULongPtr\n\n//\n// ptrdiff_t -> DWORD conversion\n//\n#define RtlPtrdiffTToDWord RtlIntPtrToULong\n\n//\n// ptrdiff_t -> DWORD_PTR conversion\n//\n#define RtlPtrdiffTToDWordPtr  RtlIntPtrToULongPtr\n\n//\n// ptrdiff_t -> ULONGLONG conversion\n//\n#define RtlPtrdiffTToULongLong RtlIntPtrToULongLong\n\n//\n// ptrdiff_t -> DWORDLONG conversion\n//\n#define RtlPtrdiffTToDWordLong RtlIntPtrToULongLong\n\n//\n// ptrdiff_t -> ULONG64 conversion\n//\n#define RtlPtrdiffTToULong64   RtlIntPtrToULongLong\n\n//\n// ptrdiff_t -> DWORD64 conversion\n//\n#define RtlPtrdiffTToDWord64   RtlIntPtrToULongLong\n\n//\n// ptrdiff_t -> UINT64 conversion\n//\n#define RtlPtrdiffTToUInt64    RtlIntPtrToULongLong\n\n//\n// ptrdiff_t -> size_t conversion\n//\n#define RtlPtrdiffTToSizeT RtlIntPtrToUIntPtr\n\n//\n// ptrdiff_t -> SIZE_T conversion\n//\n#define RtlPtrdiffTToSIZET RtlIntPtrToULongPtr\n\n//\n// size_t -> INT8 conversion\n//\n#define RtlSizeTToInt8 RtlUIntPtrToInt8\n\n//\n// size_t -> UCHAR conversion\n//\n#define RtlSizeTToUChar    RtlUIntPtrToUChar\n\n//\n// size_t -> CHAR conversion\n//\n#define RtlSizeTToChar RtlUIntPtrToChar\n\n//\n// size_t -> UINT8 conversion\n//\n#define RtlSizeTToUInt8    RtlUIntPtrToUInt8\n\n//\n// size_t -> BYTE conversion\n//\n#define RtlSizeTToByte RtlUIntPtrToUInt8\n\n//\n// size_t -> SHORT conversion\n//\n#define RtlSizeTToShort    RtlUIntPtrToShort\n\n//\n// size_t -> INT16 conversion\n//\n#define RtlSizeTToInt16    RtlUIntPtrToShort\n\n//\n// size_t -> USHORT conversion\n//\n#define RtlSizeTToUShort   RtlUIntPtrToUShort\n\n//\n// size_t -> UINT16 conversion\n//\n#define RtlSizeTToUInt16   RtlUIntPtrToUShort\n\n//\n// size_t -> WORD\n//\n#define RtlSizeTToWord RtlUIntPtrToUShort\n\n//\n// size_t -> INT conversion\n//\n#define RtlSizeTToInt  RtlUIntPtrToInt\n\n//\n// size_t -> INT32 conversion\n//\n#define RtlSizeTToInt32    RtlUIntPtrToInt\n\n//\n// size_t -> INT_PTR conversion\n//\n#define RtlSizeTToIntPtr   RtlUIntPtrToIntPtr\n\n//\n// size_t -> UINT conversion\n//\n#define RtlSizeTToUInt RtlUIntPtrToUInt\n\n//\n// size_t -> UINT32 conversion\n//\n#define RtlSizeTToUInt32   RtlUIntPtrToUInt\n\n//\n// size_t -> LONG conversion\n//\n#define RtlSizeTToLong RtlUIntPtrToLong\n\n//\n// size_t -> LONG_PTR conversion\n//\n#define RtlSizeTToLongPtr  RtlUIntPtrToLongPtr\n\n//\n// size_t -> ULONG conversion\n//\n#define RtlSizeTToULong    RtlUIntPtrToULong\n\n//\n// size_t -> DWORD conversion\n//\n#define RtlSizeTToDWord    RtlUIntPtrToULong\n\n//\n// size_t -> LONGLONG conversion\n//\n#define RtlSizeTToLongLong RtlUIntPtrToLongLong\n\n//\n// size_t -> LONG64 conversion\n//\n#define RtlSizeTToLong64   RtlUIntPtrToLongLong\n\n//\n// size_t -> RtlINT64\n//\n#define RtlSizeTToInt64    RtlUIntPtrToLongLong\n\n//\n// size_t -> ptrdiff_t conversion\n//\n#define RtlSizeTToPtrdiffT RtlUIntPtrToIntPtr\n\n//\n// size_t -> SSIZE_T conversion\n//\n#define RtlSizeTToSSIZET   RtlUIntPtrToLongPtr\n\n//\n// SSIZE_T -> INT8 conversion\n//\n#define RtlSSIZETToInt8    RtlLongPtrToInt8\n\n//\n// SSIZE_T -> UCHAR conversion\n//\n#define RtlSSIZETToUChar   RtlLongPtrToUChar\n\n//\n// SSIZE_T -> CHAR conversion\n//\n#define RtlSSIZETToChar    RtlLongPtrToChar\n\n//\n// SSIZE_T -> UINT8 conversion\n//\n#define RtlSSIZETToUInt8   RtlLongPtrToUInt8\n\n//\n// SSIZE_T -> BYTE conversion\n//\n#define RtlSSIZETToByte    RtlLongPtrToUInt8\n\n//\n// SSIZE_T -> SHORT conversion\n//\n#define RtlSSIZETToShort   RtlLongPtrToShort\n\n//\n// SSIZE_T -> INT16 conversion\n//\n#define RtlSSIZETToInt16   RtlLongPtrToShort\n\n//\n// SSIZE_T -> USHORT conversion\n//\n#define RtlSSIZETToUShort  RtlLongPtrToUShort\n\n//\n// SSIZE_T -> UINT16 conversion\n//\n#define RtlSSIZETToUInt16  RtlLongPtrToUShort\n\n//\n// SSIZE_T -> WORD conversion\n//\n#define RtlSSIZETToWord    RtlLongPtrToUShort\n\n//\n// SSIZE_T -> INT conversion\n//\n#define RtlSSIZETToInt RtlLongPtrToInt\n\n//\n// SSIZE_T -> INT32 conversion\n//\n#define RtlSSIZETToInt32   RtlLongPtrToInt\n\n//\n// SSIZE_T -> INT_PTR conversion\n//\n#define RtlSSIZETToIntPtr  RtlLongPtrToIntPtr\n\n//\n// SSIZE_T -> UINT conversion\n//\n#define RtlSSIZETToUInt    RtlLongPtrToUInt\n\n//\n// SSIZE_T -> UINT32 conversion\n//\n#define RtlSSIZETToUInt32  RtlLongPtrToUInt\n\n//\n// SSIZE_T -> UINT_PTR conversion\n//\n#define RtlSSIZETToUIntPtr RtlLongPtrToUIntPtr\n\n//\n// SSIZE_T -> LONG conversion\n//\n#define RtlSSIZETToLong    RtlLongPtrToLong\n\n//\n// SSIZE_T -> ULONG conversion\n//\n#define RtlSSIZETToULong   RtlLongPtrToULong\n\n//\n// SSIZE_T -> ULONG_PTR conversion\n//\n#define RtlSSIZETToULongPtr    RtlLongPtrToULongPtr\n\n//\n// SSIZE_T -> DWORD conversion\n//\n#define RtlSSIZETToDWord   RtlLongPtrToULong\n\n//\n// SSIZE_T -> DWORD_PTR conversion\n//\n#define RtlSSIZETToDWordPtr    RtlLongPtrToULongPtr\n\n//\n// SSIZE_T -> ULONGLONG conversion\n//\n#define RtlSSIZETToULongLong   RtlLongPtrToULongLong\n\n//\n// SSIZE_T -> DWORDLONG conversion\n//\n#define RtlSSIZETToDWordLong   RtlLongPtrToULongLong\n\n//\n// SSIZE_T -> ULONG64 conversion\n//\n#define RtlSSIZETToULong64 RtlLongPtrToULongLong\n\n//\n// SSIZE_T -> DWORD64 conversion\n//\n#define RtlSSIZETToDWord64 RtlLongPtrToULongLong\n\n//\n// SSIZE_T -> UINT64 conversion\n//\n#define RtlSSIZETToUInt64  RtlLongPtrToULongLong\n\n//\n// SSIZE_T -> size_t conversion\n//\n#define RtlSSIZETToSizeT   RtlLongPtrToUIntPtr\n\n//\n// SSIZE_T -> SIZE_T conversion\n//\n#define RtlSSIZETToSIZET   RtlLongPtrToULongPtr\n\n//\n// SIZE_T -> INT8 conversion\n//\n#define RtlSIZETToInt8 RtlULongPtrToInt8\n\n//\n// SIZE_T -> UCHAR conversion\n//\n#define RtlSIZETToUChar    RtlULongPtrToUChar\n\n//\n// SIZE_T -> CHAR conversion\n//\n#define RtlSIZETToChar RtlULongPtrToChar\n\n//\n// SIZE_T -> UINT8 conversion\n//\n#define RtlSIZETToUInt8    RtlULongPtrToUInt8\n\n//\n// SIZE_T -> BYTE conversion\n//\n#define RtlSIZETToByte RtlULongPtrToUInt8\n\n//\n// SIZE_T -> SHORT conversion\n//\n#define RtlSIZETToShort    RtlULongPtrToShort\n\n//\n// SIZE_T -> INT16 conversion\n//\n#define RtlSIZETToInt16    RtlULongPtrToShort\n\n//\n// SIZE_T -> USHORT conversion\n//\n#define RtlSIZETToUShort   RtlULongPtrToUShort\n\n//\n// SIZE_T -> UINT16 conversion\n//\n#define RtlSIZETToUInt16   RtlULongPtrToUShort\n\n//\n// SIZE_T -> WORD\n//\n#define RtlSIZETToWord RtlULongPtrToUShort\n\n//\n// SIZE_T -> INT conversion\n//\n#define RtlSIZETToInt  RtlULongPtrToInt\n\n//\n// SIZE_T -> INT32 conversion\n//\n#define RtlSIZETToInt32    RtlULongPtrToInt\n\n//\n// SIZE_T -> INT_PTR conversion\n//\n#define RtlSIZETToIntPtr   RtlULongPtrToIntPtr\n\n//\n// SIZE_T -> UINT conversion\n//\n#define RtlSIZETToUInt RtlULongPtrToUInt\n\n//\n// SIZE_T -> UINT32 conversion\n//\n#define RtlSIZETToUInt32   RtlULongPtrToUInt\n\n//\n// SIZE_T -> UINT_PTR conversion\n//\n#define RtlSIZETToUIntPtr  RtlULongPtrToUIntPtr\n\n//\n// SIZE_T -> LONG conversion\n//\n#define RtlSIZETToLong RtlULongPtrToLong\n\n//\n// SIZE_T -> LONG_PTR conversion\n//\n#define RtlSIZETToLongPtr  RtlULongPtrToLongPtr\n\n//\n// SIZE_T -> ULONG conversion\n//\n#define RtlSIZETToULong    RtlULongPtrToULong\n\n//\n// SIZE_T -> DWORD conversion\n//\n#define RtlSIZETToDWord    RtlULongPtrToULong\n\n//\n// SIZE_T -> LONGLONG conversion\n//\n#define RtlSIZETToLongLong RtlULongPtrToLongLong\n\n//\n// SIZE_T -> LONG64 conversion\n//\n#define RtlSIZETToLong64   RtlULongPtrToLongLong\n\n//\n// SIZE_T -> RtlINT64\n//\n#define RtlSIZETToInt64    RtlULongPtrToLongLong\n\n//\n// SIZE_T -> ptrdiff_t conversion\n//\n#define RtlSIZETToPtrdiffT RtlULongPtrToIntPtr\n\n//\n// SIZE_T -> SSIZE_T conversion\n//\n#define RtlSIZETToSSIZET   RtlULongPtrToLongPtr\n\n\n//=============================================================================\n// Addition functions\n//=============================================================================\n\n//\n// UINT8 addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUInt8Add(\n    _In_ UINT8 u8Augend,\n    _In_ UINT8 u8Addend,\n    _Out_ _Deref_out_range_(==, u8Augend + u8Addend) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if (((UINT8)(u8Augend + u8Addend)) >= u8Augend)\n    {\n        *pu8Result = (UINT8)(u8Augend + u8Addend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortAdd(\n    _In_ USHORT usAugend,\n    _In_ USHORT usAddend,\n    _Out_ _Deref_out_range_(==, usAugend + usAddend) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (((USHORT)(usAugend + usAddend)) >= usAugend)\n    {\n        *pusResult = (USHORT)(usAugend + usAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT16 addition\n//\n#define RtlUInt16Add   RtlUShortAdd\n\n//\n// WORD addtition\n//\n#define RtlWordAdd     RtlUShortAdd\n\n//\n// UINT addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntAdd(\n    _In_ UINT uAugend,\n    _In_ UINT uAddend,\n    _Out_ _Deref_out_range_(==, uAugend + uAddend) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if ((uAugend + uAddend) >= uAugend)\n    {\n        *puResult = (uAugend + uAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT32 addition\n//\n#define RtlUInt32Add   RtlUIntAdd\n\n//\n// UINT_PTR addition\n//\n#ifdef _WIN64\n#define RtlUIntPtrAdd      RtlULongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrAdd(\n    _In_ UINT_PTR uAugend,\n    _In_ UINT_PTR uAddend,\n    _Out_ _Deref_out_range_(==, uAugend + uAddend) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if ((uAugend + uAddend) >= uAugend)\n    {\n        *puResult = (uAugend + uAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// ULONG addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongAdd(\n    _In_ ULONG ulAugend,\n    _In_ ULONG ulAddend,\n    _Out_ _Deref_out_range_(==, ulAugend + ulAddend) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if ((ulAugend + ulAddend) >= ulAugend)\n    {\n        *pulResult = (ulAugend + ulAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR addition\n//\n#ifdef _WIN64\n#define RtlULongPtrAdd     RtlULongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrAdd(\n    _In_ ULONG_PTR ulAugend,\n    _In_ ULONG_PTR ulAddend,\n    _Out_ _Deref_out_range_(==, ulAugend + ulAddend) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if ((ulAugend + ulAddend) >= ulAugend)\n    {\n        *pulResult = (ulAugend + ulAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// DWORD addition\n//\n#define RtlDWordAdd        RtlULongAdd\n\n//\n// DWORD_PTR addition\n//\n#ifdef _WIN64\n#define RtlDWordPtrAdd     RtlULongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlDWordPtrAdd(\n    _In_ DWORD_PTR dwAugend,\n    _In_ DWORD_PTR dwAddend,\n    _Out_ _Deref_out_range_(==, dwAugend + dwAddend) DWORD_PTR* pdwResult)\n{\n    NTSTATUS status;\n\n    if ((dwAugend + dwAddend) >= dwAugend)\n    {\n        *pdwResult = (dwAugend + dwAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pdwResult = DWORD_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// size_t addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSizeTAdd(\n    _In_ size_t Augend,\n    _In_ size_t Addend,\n    _Out_ _Deref_out_range_(==, Augend + Addend) size_t* pResult)\n{\n    NTSTATUS status;\n\n    if ((Augend + Addend) >= Augend)\n    {\n        *pResult = (Augend + Addend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pResult = SIZE_T_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SIZE_T addition\n//\n#ifdef _WIN64\n#define RtlSIZETAdd      RtlULongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSIZETAdd(\n    _In_ SIZE_T Augend,\n    _In_ SIZE_T Addend,\n    _Out_ _Deref_out_range_(==, Augend + Addend) SIZE_T* pResult)\n{\n    NTSTATUS status;\n\n    if ((Augend + Addend) >= Augend)\n    {\n        *pResult = (Augend + Addend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pResult = _SIZE_T_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// ULONGLONG addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongAdd(\n    _In_ ULONGLONG ullAugend,\n    _In_ ULONGLONG ullAddend,\n    _Out_ _Deref_out_range_(==, ullAugend + ullAddend) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if ((ullAugend + ullAddend) >= ullAugend)\n    {\n        *pullResult = (ullAugend + ullAddend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// DWORDLONG addition\n//\n#define RtlDWordLongAdd    RtlULongLongAdd\n\n//\n// ULONG64 addition\n//\n#define RtlULong64Add  RtlULongLongAdd\n\n//\n// DWORD64 addition\n//\n#define RtlDWord64Add  RtlULongLongAdd\n\n//\n// UINT64 addition\n//\n#define RtlUInt64Add   RtlULongLongAdd\n\n\n//=============================================================================\n// Subtraction functions\n//=============================================================================\n\n//\n// UINT8 subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUInt8Sub(\n    _In_ UINT8 u8Minuend,\n    _In_ UINT8 u8Subtrahend,\n    _Out_ _Deref_out_range_(==, u8Minuend - u8Subtrahend) UINT8* pu8Result)\n{\n    NTSTATUS status;\n\n    if (u8Minuend >= u8Subtrahend)\n    {\n        *pu8Result = (UINT8)(u8Minuend - u8Subtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pu8Result = UINT8_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// USHORT subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortSub(\n    _In_ USHORT usMinuend,\n    _In_ USHORT usSubtrahend,\n    _Out_ _Deref_out_range_(==, usMinuend - usSubtrahend) USHORT* pusResult)\n{\n    NTSTATUS status;\n\n    if (usMinuend >= usSubtrahend)\n    {\n        *pusResult = (USHORT)(usMinuend - usSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pusResult = USHORT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT16 subtraction\n//\n#define RtlUInt16Sub  RtlUShortSub\n\n//\n// WORD subtraction\n//\n#define RtlWordSub    RtlUShortSub\n\n\n//\n// UINT subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntSub(\n    _In_ UINT uMinuend,\n    _In_ UINT uSubtrahend,\n    _Out_ _Deref_out_range_(==, uMinuend - uSubtrahend) UINT* puResult)\n{\n    NTSTATUS status;\n\n    if (uMinuend >= uSubtrahend)\n    {\n        *puResult = (uMinuend - uSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// UINT32 subtraction\n//\n#define RtlUInt32Sub  RtlUIntSub\n\n//\n// UINT_PTR subtraction\n//\n#ifdef _WIN64\n#define RtlUIntPtrSub RtlULongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrSub(\n    _In_ UINT_PTR uMinuend,\n    _In_ UINT_PTR uSubtrahend,\n    _Out_ _Deref_out_range_(==, uMinuend - uSubtrahend) UINT_PTR* puResult)\n{\n    NTSTATUS status;\n\n    if (uMinuend >= uSubtrahend)\n    {\n        *puResult = (uMinuend - uSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *puResult = UINT_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// ULONG subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongSub(\n    _In_ ULONG ulMinuend,\n    _In_ ULONG ulSubtrahend,\n    _Out_ _Deref_out_range_(==, ulMinuend - ulSubtrahend) ULONG* pulResult)\n{\n    NTSTATUS status;\n\n    if (ulMinuend >= ulSubtrahend)\n    {\n        *pulResult = (ulMinuend - ulSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// ULONG_PTR subtraction\n//\n#ifdef _WIN64\n#define RtlULongPtrSub RtlULongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrSub(\n    _In_ ULONG_PTR ulMinuend,\n    _In_ ULONG_PTR ulSubtrahend,\n    _Out_ _Deref_out_range_(==, ulMinuend - ulSubtrahend) ULONG_PTR* pulResult)\n{\n    NTSTATUS status;\n\n    if (ulMinuend >= ulSubtrahend)\n    {\n        *pulResult = (ulMinuend - ulSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pulResult = ULONG_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n\n//\n// DWORD subtraction\n//\n#define RtlDWordSub       RtlULongSub\n\n//\n// DWORD_PTR subtraction\n//\n#ifdef _WIN64\n#define RtlDWordPtrSub    RtlULongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlDWordPtrSub(\n    _In_ DWORD_PTR dwMinuend,\n    _In_ DWORD_PTR dwSubtrahend,\n    _Out_ _Deref_out_range_(==, dwMinuend - dwSubtrahend) DWORD_PTR* pdwResult)\n{\n    NTSTATUS status;\n\n    if (dwMinuend >= dwSubtrahend)\n    {\n        *pdwResult = (dwMinuend - dwSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pdwResult = DWORD_PTR_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// size_t subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSizeTSub(\n    _In_ size_t Minuend,\n    _In_ size_t Subtrahend,\n    _Out_ _Deref_out_range_(==, Minuend - Subtrahend) size_t* pResult)\n{\n    NTSTATUS status;\n\n    if (Minuend >= Subtrahend)\n    {\n        *pResult = (Minuend - Subtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pResult = SIZE_T_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// SIZE_T subtraction\n//\n#ifdef _WIN64\n#define RtlSIZETSub   RtlULongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSIZETSub(\n    _In_ SIZE_T Minuend,\n    _In_ SIZE_T Subtrahend,\n    _Out_ _Deref_out_range_(==, Minuend - Subtrahend) SIZE_T* pResult)\n{\n    NTSTATUS status;\n\n    if (Minuend >= Subtrahend)\n    {\n        *pResult = (Minuend - Subtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pResult = _SIZE_T_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n#endif // _WIN64\n\n//\n// ULONGLONG subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongSub(\n    _In_ ULONGLONG ullMinuend,\n    _In_ ULONGLONG ullSubtrahend,\n    _Out_ _Deref_out_range_(==, ullMinuend - ullSubtrahend) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n\n    if (ullMinuend >= ullSubtrahend)\n    {\n        *pullResult = (ullMinuend - ullSubtrahend);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n\n    return status;\n}\n\n//\n// DWORDLONG subtraction\n//\n#define RtlDWordLongSub   RtlULongLongSub\n\n//\n// ULONG64 subtraction\n//\n#define RtlULong64Sub RtlULongLongSub\n\n//\n// DWORD64 subtraction\n//\n#define RtlDWord64Sub RtlULongLongSub\n\n//\n// UINT64 subtraction\n//\n#define RtlUInt64Sub  RtlULongLongSub\n\n\n//=============================================================================\n// Multiplication functions\n//=============================================================================\n\n//\n// UINT8 multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUInt8Mult(\n    _In_ UINT8 u8Multiplicand,\n    _In_ UINT8 u8Multiplier,\n    _Out_ _Deref_out_range_(==, u8Multiplicand * u8Multiplier) UINT8* pu8Result)\n{\n    UINT uResult = ((UINT)u8Multiplicand) * ((UINT)u8Multiplier);\n\n    return RtlUIntToUInt8(uResult, pu8Result);\n}\n\n//\n// USHORT multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUShortMult(\n    _In_ USHORT usMultiplicand,\n    _In_ USHORT usMultiplier,\n    _Out_ _Deref_out_range_(==, usMultiplicand * usMultiplier) USHORT* pusResult)\n{\n    ULONG ulResult = ((ULONG)usMultiplicand) * ((ULONG)usMultiplier);\n\n    return RtlULongToUShort(ulResult, pusResult);\n}\n\n//\n// UINT16 multiplication\n//\n#define RtlUInt16Mult  RtlUShortMult\n\n//\n// WORD multiplication\n//\n#define RtlWordMult    RtlUShortMult\n\n//\n// UINT multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntMult(\n    _In_ UINT uMultiplicand,\n    _In_ UINT uMultiplier,\n    _Out_ _Deref_out_range_(==, uMultiplicand * uMultiplier) UINT* puResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(uMultiplicand, uMultiplier);\n\n    return RtlULongLongToUInt(ull64Result, puResult);\n}\n\n//\n// UINT32 multiplication\n//\n#define RtlUInt32Mult  RtlUIntMult\n\n//\n// UINT_PTR multiplication\n//\n#ifdef _WIN64\n#define RtlUIntPtrMult     RtlULongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlUIntPtrMult(\n    _In_ UINT_PTR uMultiplicand,\n    _In_ UINT_PTR uMultiplier,\n    _Out_ _Deref_out_range_(==, uMultiplicand * uMultiplier) UINT_PTR* puResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(uMultiplicand, uMultiplier);\n\n    return RtlULongLongToUIntPtr(ull64Result, puResult);\n}\n#endif // _WIN64\n\n//\n// ULONG multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongMult(\n    _In_ ULONG ulMultiplicand,\n    _In_ ULONG ulMultiplier,\n    _Out_ _Deref_out_range_(==, ulMultiplicand * ulMultiplier) ULONG* pulResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(ulMultiplicand, ulMultiplier);\n\n    return RtlULongLongToULong(ull64Result, pulResult);\n}\n\n//\n// ULONG_PTR multiplication\n//\n#ifdef _WIN64\n#define RtlULongPtrMult    RtlULongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongPtrMult(\n    _In_ ULONG_PTR ulMultiplicand,\n    _In_ ULONG_PTR ulMultiplier,\n    _Out_ _Deref_out_range_(==, ulMultiplicand * ulMultiplier) ULONG_PTR* pulResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(ulMultiplicand, ulMultiplier);\n\n    return RtlULongLongToULongPtr(ull64Result, pulResult);\n}\n#endif // _WIN64\n\n//\n// DWORD multiplication\n//\n#define RtlDWordMult       RtlULongMult\n\n//\n// DWORD_PTR multiplication\n//\n#ifdef _WIN64\n#define RtlDWordPtrMult    RtlULongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlDWordPtrMult(\n    _In_ DWORD_PTR dwMultiplicand,\n    _In_ DWORD_PTR dwMultiplier,\n    _Out_ _Deref_out_range_(==, dwMultiplicand * dwMultiplier) DWORD_PTR* pdwResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(dwMultiplicand, dwMultiplier);\n\n    return RtlULongLongToDWordPtr(ull64Result, pdwResult);\n}\n#endif // _WIN64\n\n//\n// size_t multiplication\n//\n\n#ifdef _WIN64\n#define RtlSizeTMult       RtlULongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSizeTMult(\n    _In_ size_t Multiplicand,\n    _In_ size_t Multiplier,\n    _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) size_t* pResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(Multiplicand, Multiplier);\n\n    return RtlULongLongToSizeT(ull64Result, pResult);\n}\n#endif // _WIN64\n\n//\n// SIZE_T multiplication\n//\n#ifdef _WIN64\n#define RtlSIZETMult       RtlULongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSIZETMult(\n    _In_ SIZE_T Multiplicand,\n    _In_ SIZE_T Multiplier,\n    _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) SIZE_T* pResult)\n{\n    ULONGLONG ull64Result = UInt32x32To64(Multiplicand, Multiplier);\n\n    return RtlULongLongToSIZET(ull64Result, pResult);\n}\n#endif // _WIN64\n\n//\n// ULONGLONG multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlULongLongMult(\n    _In_ ULONGLONG ullMultiplicand,\n    _In_ ULONGLONG ullMultiplier,\n    _Out_ _Deref_out_range_(==, ullMultiplicand * ullMultiplier) ULONGLONG* pullResult)\n{\n    NTSTATUS status;\n#if defined(_USE_INTRINSIC_MULTIPLY128)\n    ULONGLONG ullResultHigh;\n    ULONGLONG ullResultLow;\n\n    ullResultLow = UnsignedMultiply128(ullMultiplicand, ullMultiplier, &ullResultHigh);\n    if (ullResultHigh == 0)\n    {\n        _Analysis_assume_(ullMultiplicand * ullMultiplier == ullResultLow);\n        *pullResult = ullResultLow;\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        *pullResult = ULONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n#else\n    // 64x64 into 128 is like 32.32 x 32.32.\n    //\n    // a.b * c.d = a*(c.d) + .b*(c.d) = a*c + a*.d + .b*c + .b*.d\n    // back in non-decimal notation where A=a*2^32 and C=c*2^32:\n    // A*C + A*d + b*C + b*d\n    // So there are four components to add together.\n    //   result = (a*c*2^64) + (a*d*2^32) + (b*c*2^32) + (b*d)\n    //\n    // a * c must be 0 or there would be bits in the high 64-bits\n    // a * d must be less than 2^32 or there would be bits in the high 64-bits\n    // b * c must be less than 2^32 or there would be bits in the high 64-bits\n    // then there must be no overflow of the resulting values summed up.\n\n    ULONG dw_a;\n    ULONG dw_b;\n    ULONG dw_c;\n    ULONG dw_d;\n    ULONGLONG ad = 0;\n    ULONGLONG bc = 0;\n    ULONGLONG bd = 0;\n    ULONGLONG ullResult = 0;\n\n    status = STATUS_INTEGER_OVERFLOW;\n\n    dw_a = (ULONG)(ullMultiplicand >> 32);\n    dw_c = (ULONG)(ullMultiplier >> 32);\n\n    // common case -- if high dwords are both zero, no chance for overflow\n    if ((dw_a == 0) && (dw_c == 0))\n    {\n        dw_b = (DWORD)ullMultiplicand;\n        dw_d = (DWORD)ullMultiplier;\n\n        *pullResult = (((ULONGLONG)dw_b) * (ULONGLONG)dw_d);\n        status = STATUS_SUCCESS;\n    }\n    else\n    {\n        // a * c must be 0 or there would be bits set in the high 64-bits\n        if ((dw_a == 0) ||\n            (dw_c == 0))\n        {\n            dw_d = (DWORD)ullMultiplier;\n\n            // a * d must be less than 2^32 or there would be bits set in the high 64-bits\n            ad = (((ULONGLONG)dw_a) * (ULONGLONG)dw_d);\n            if ((ad & 0xffffffff00000000) == 0)\n            {\n                dw_b = (DWORD)ullMultiplicand;\n\n                // b * c must be less than 2^32 or there would be bits set in the high 64-bits\n                bc = (((ULONGLONG)dw_b) * (ULONGLONG)dw_c);\n                if ((bc & 0xffffffff00000000) == 0)\n                {\n                    // now sum them all up checking for overflow.\n                    // shifting is safe because we already checked for overflow above\n                    if (NT_SUCCESS(RtlULongLongAdd(bc << 32, ad << 32, &ullResult)))\n                    {\n                        // b * d\n                        bd = (((ULONGLONG)dw_b) * (ULONGLONG)dw_d);\n\n                        if (NT_SUCCESS(RtlULongLongAdd(ullResult, bd, &ullResult)))\n                        {\n                            *pullResult = ullResult;\n                            status = STATUS_SUCCESS;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    if (!NT_SUCCESS(status))\n    {\n        *pullResult = ULONGLONG_ERROR;\n    }\n#pragma warning(suppress:26071)\n#endif // _USE_INTRINSIC_MULTIPLY128\n    return status;\n}\n\n//\n// DWORDLONG multiplication\n//\n#define RtlDWordLongMult   RtlULongLongMult\n\n//\n// ULONG64 multiplication\n//\n#define RtlULong64Mult RtlULongLongMult\n\n//\n// DWORD64 multiplication\n//\n#define RtlDWord64Mult RtlULongLongMult\n\n//\n// UINT64 multiplication\n//\n#define RtlUInt64Mult  RtlULongLongMult\n\n\n/////////////////////////////////////////////////////////////////////////\n//\n// signed operations\n//\n// Strongly consider using unsigned numbers.\n//\n// Signed numbers are often used where unsigned numbers should be used.\n// For example file sizes and array indices should always be unsigned.\n// (File sizes should be 64bit integers; array indices should be size_t.)\n// Subtracting a larger positive signed number from a smaller positive\n// signed number with RtlIntSub will succeed, producing a negative number,\n// that then must not be used as an array index (but can occasionally be\n// used as a pointer index.) Similarly for adding a larger magnitude\n// negative number to a smaller magnitude positive number.\n//\n// intsafe.h does not protect you from such errors. It tells you if your\n// integer operations overflowed, not if you are doing the right thing\n// with your non-overflowed integers.\n//\n// Likewise you can overflow a buffer with a non-overflowed unsigned index.\n//\n#if defined(ENABLE_INTSAFE_SIGNED_FUNCTIONS)\n\n#if defined(_USE_INTRINSIC_MULTIPLY128)\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(_ARM64EC_)\n\n#define Multiply128 _mul128\n\n#else\n\n#define _mul128 Multiply128\n\n#endif // defined(_ARM64EC_)\n\nLONG64\nMultiply128(\n    _In_ LONG64 Multiplier,\n    _In_ LONG64  Multiplicand,\n    _Out_ LONG64 *HighProduct\n    );\n\n#if !defined(_ARM64EC_)\n\n#pragma intrinsic(_mul128)\n\n#endif // !defined(_ARM64EC_)\n\n#ifdef __cplusplus\n}\n#endif\n#endif // _USE_INTRINSIC_MULTIPLY128\n\n\n//=============================================================================\n// Signed addition functions\n//=============================================================================\n\n//\n// INT8 Addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8Add(\n    _In_ INT8 i8Augend,\n    _In_ INT8 i8Addend,\n    _Out_ _Deref_out_range_(==, i8Augend + i8Addend) INT8* pi8Result\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(INT8));\n    return RtlLongToInt8(((LONG)i8Augend) + ((LONG)i8Addend), pi8Result);\n}\n\n//\n// SHORT Addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortAdd(\n    _In_ SHORT sAugend,\n    _In_ SHORT sAddend,\n    _Out_ _Deref_out_range_(==, sAugend + sAddend) SHORT* psResult\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(SHORT));\n    return RtlLongToShort(((LONG)sAugend) + ((LONG)sAddend), psResult);\n}\n\n//\n// INT16 Addition\n//\n#define RtlInt16Add    RtlShortAdd\n\n//\n// INT Addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntAdd(\n    _In_ INT iAugend,\n    _In_ INT iAddend,\n    _Out_ _Deref_out_range_(==, iAugend + iAddend) INT* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT));\n    return RtlLongLongToInt(((LONGLONG)iAugend) + ((LONGLONG)iAddend), piResult);\n}\n\n//\n// INT32 Addition\n//\n#define RtlInt32Add    RtlIntAdd\n\n//\n// INT_PTR addition\n//\n#ifdef _WIN64\n#define RtlIntPtrAdd   RtlLongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrAdd(\n    _In_ INT_PTR iAugend,\n    _In_ INT_PTR iAddend,\n    _Out_ _Deref_out_range_(==, iAugend + iAddend) INT_PTR* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT_PTR));\n    return RtlLongLongToIntPtr(((LONGLONG)iAugend) + ((LONGLONG)iAddend), piResult);\n}\n#endif\n\n//\n// LONG Addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongAdd(\n    _In_ LONG lAugend,\n    _In_ LONG lAddend,\n    _Out_ _Deref_out_range_(==, lAugend + lAddend) LONG* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG));\n    return RtlLongLongToLong(((LONGLONG)lAugend) + ((LONGLONG)lAddend), plResult);\n}\n\n//\n// LONG32 Addition\n//\n#define RtlLong32Add   RtlIntAdd\n\n//\n// LONG_PTR Addition\n//\n#ifdef _WIN64\n#define RtlLongPtrAdd   RtlLongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrAdd(\n    _In_ LONG_PTR lAugend,\n    _In_ LONG_PTR lAddend,\n    _Out_ _Deref_out_range_(==, lAugend + lAddend) LONG_PTR* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG_PTR));\n    return RtlLongLongToLongPtr(((LONGLONG)lAugend) + ((LONGLONG)lAddend), plResult);\n}\n#endif\n\n//\n// LONGLONG Addition\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongAdd(\n    _In_ LONGLONG llAugend,\n    _In_ LONGLONG llAddend,\n    _Out_ _Deref_out_range_(==, llAugend + llAddend) LONGLONG* pllResult\n    )\n{\n    NTSTATUS status;\n    LONGLONG llResult = llAugend + llAddend;\n\n    //\n    // Adding positive to negative never overflows.\n    // If you add two positive numbers, you expect a positive result.\n    // If you add two negative numbers, you expect a negative result.\n    // Overflow if inputs are the same sign and output is not that sign.\n    //\n    if (((llAugend < 0) == (llAddend < 0))  &&\n        ((llAugend < 0) != (llResult < 0)))\n    {\n        *pllResult = LONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n    else\n    {\n        *pllResult = llResult;\n        status = STATUS_SUCCESS;\n    }\n\n    return status;\n}\n\n//\n// LONG64 Addition\n//\n#define RtlLong64Add   RtlLongLongAdd\n\n//\n// RtlINT64 Addition\n//\n#define RtlInt64Add    RtlLongLongAdd\n\n//\n// ptrdiff_t Addition\n//\n#ifdef _WIN64\n#define RtlPtrdiffTAdd RtlLongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlPtrdiffTAdd(\n    _In_ ptrdiff_t Augend,\n    _In_ ptrdiff_t Addend,\n    _Out_ _Deref_out_range_(==, Augend + Addend) ptrdiff_t* pResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(ptrdiff_t));\n    return RtlLongLongToPtrdiffT(((LONGLONG)Augend) + ((LONGLONG)Addend), pResult);\n}\n#endif\n\n//\n// SSIZE_T Addition\n//\n#ifdef _WIN64\n#define RtlSSIZETAdd   RtlLongLongAdd\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSSIZETAdd(\n    _In_ SSIZE_T Augend,\n    _In_ SSIZE_T Addend,\n    _Out_ _Deref_out_range_(==, Augend + Addend) SSIZE_T* pResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(SSIZE_T));\n    return RtlLongLongToSSIZET(((LONGLONG)Augend) + ((LONGLONG)Addend), pResult);\n}\n#endif\n\n\n//=============================================================================\n// Signed subtraction functions\n//=============================================================================\n\n//\n// INT8 Subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8Sub(\n    _In_ INT8 i8Minuend,\n    _In_ INT8 i8Subtrahend,\n    _Out_ _Deref_out_range_(==, i8Minuend - i8Subtrahend) INT8* pi8Result\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(INT8));\n    return RtlLongToInt8(((LONG)i8Minuend) - ((LONG)i8Subtrahend), pi8Result);\n}\n\n//\n// SHORT Subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortSub(\n    _In_ SHORT sMinuend,\n    _In_ SHORT sSubtrahend,\n    _Out_ _Deref_out_range_(==, sMinuend - sSubtrahend) SHORT* psResult\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(SHORT));\n    return RtlLongToShort(((LONG)sMinuend) - ((LONG)sSubtrahend), psResult);\n}\n\n//\n// INT16 Subtraction\n//\n#define RtlInt16Sub   RtlShortSub\n\n//\n// INT Subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntSub(\n    _In_ INT iMinuend,\n    _In_ INT iSubtrahend,\n    _Out_ _Deref_out_range_(==, iMinuend - iSubtrahend) INT* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT));\n    return RtlLongLongToInt(((LONGLONG)iMinuend) - ((LONGLONG)iSubtrahend), piResult);\n}\n\n//\n// INT32 Subtraction\n//\n#define RtlInt32Sub   RtlIntSub\n\n//\n// INT_PTR Subtraction\n//\n#ifdef _WIN64\n#define RtlIntPtrSub  RtlLongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrSub(\n    _In_ INT_PTR iMinuend,\n    _In_ INT_PTR iSubtrahend,\n    _Out_ _Deref_out_range_(==, iMinuend - iSubtrahend) INT_PTR* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT_PTR));\n    return RtlLongLongToIntPtr(((LONGLONG)iMinuend) - ((LONGLONG)iSubtrahend), piResult);\n}\n#endif\n\n//\n// LONG Subtraction\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongSub(\n    _In_ LONG lMinuend,\n    _In_ LONG lSubtrahend,\n    _Out_ _Deref_out_range_(==, lMinuend - lSubtrahend) LONG* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG));\n    return RtlLongLongToLong(((LONGLONG)lMinuend) - ((LONGLONG)lSubtrahend), plResult);\n}\n\n//\n// LONG32 Subtraction\n//\n#define RtlLong32Sub  RtlIntSub\n\n//\n// LONG_PTR Subtraction\n//\n#ifdef _WIN64\n#define RtlLongPtrSub  RtlLongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrSub(\n    _In_ LONG_PTR lMinuend,\n    _In_ LONG_PTR lSubtrahend,\n    _Out_ _Deref_out_range_(==, lMinuend - lSubtrahend) LONG_PTR* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG_PTR));\n    return RtlLongLongToLongPtr(((LONGLONG)lMinuend) - ((LONGLONG)lSubtrahend), plResult);\n}\n#endif\n\n//\n// RtlLongLongSub\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongSub(\n    _In_ LONGLONG llMinuend,\n    _In_ LONGLONG llSubtrahend,\n    _Out_ _Deref_out_range_(==, llMinuend - llSubtrahend) LONGLONG* pllResult\n    )\n{\n    NTSTATUS status;\n    LONGLONG llResult = llMinuend - llSubtrahend;\n\n    //\n    // Subtracting a positive number from a positive number never overflows.\n    // Subtracting a negative number from a negative number never overflows.\n    // If you subtract a negative number from a positive number, you expect a positive result.\n    // If you subtract a positive number from a negative number, you expect a negative result.\n    // Overflow if inputs vary in sign and the output does not have the same sign as the first input.\n    //\n    if (((llMinuend < 0) != (llSubtrahend < 0)) &&\n        ((llMinuend < 0) != (llResult < 0)))\n    {\n        *pllResult = LONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n    else\n    {\n        *pllResult = llResult;\n        status = STATUS_SUCCESS;\n    }\n\n    return status;\n}\n\n//\n// LONG64 Subtraction\n//\n#define RtlLong64Sub  RtlLongLongSub\n\n//\n// RtlINT64 Subtraction\n//\n#define RtlInt64Sub   RtlLongLongSub\n\n//\n// ptrdiff_t Subtraction\n//\n#ifdef _WIN64\n#define RtlPtrdiffTSub RtlLongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlPtrdiffTSub(\n    _In_ ptrdiff_t Minuend,\n    _In_ ptrdiff_t Subtrahend,\n    _Out_ _Deref_out_range_(==, Minuend - Subtrahend) ptrdiff_t* pResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(ptrdiff_t));\n    return RtlLongLongToPtrdiffT(((LONGLONG)Minuend) - ((LONGLONG)Subtrahend), pResult);\n}\n#endif\n\n//\n// SSIZE_T Subtraction\n//\n#ifdef _WIN64\n#define RtlSSIZETSub  RtlLongLongSub\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSSIZETSub(\n    _In_ SSIZE_T Minuend,\n    _In_ SSIZE_T Subtrahend,\n    _Out_ _Deref_out_range_(==, Minuend - Subtrahend) SSIZE_T* pResult)\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(SSIZE_T));\n    return RtlLongLongToSSIZET(((LONGLONG)Minuend) - ((LONGLONG)Subtrahend), pResult);\n}\n#endif\n\n\n//=============================================================================\n// Signed multiplication functions\n//=============================================================================\n\n//\n// INT8 multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlInt8Mult(\n    _In_ INT8 i8Multiplicand,\n    _In_ INT8 i8Multiplier,\n    _Out_ _Deref_out_range_(==, i8Multiplicand * i8Multiplier) INT8* pi8Result\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(INT8));\n    return RtlLongToInt8(((LONG)i8Multiplier) * ((LONG)i8Multiplicand), pi8Result);\n}\n\n//\n// SHORT multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlShortMult(\n    _In_ SHORT sMultiplicand,\n    _In_ SHORT sMultiplier,\n    _Out_ _Deref_out_range_(==, sMultiplicand * sMultiplier) SHORT* psResult\n    )\n{\n    C_ASSERT(sizeof(LONG) > sizeof(SHORT));\n    return RtlLongToShort(((LONG)sMultiplicand) * ((LONG)sMultiplier), psResult);\n}\n\n//\n// INT16 multiplication\n//\n#define RtlInt16Mult   RtlShortMult\n\n//\n// INT multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntMult(\n    _In_ INT iMultiplicand,\n    _In_ INT iMultiplier,\n    _Out_ _Deref_out_range_(==, iMultiplicand * iMultiplier) INT* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT));\n    return RtlLongLongToInt(((LONGLONG)iMultiplicand) * ((LONGLONG)iMultiplier), piResult);\n}\n\n//\n// INT32 multiplication\n//\n#define RtlInt32Mult   RtlIntMult\n\n//\n// INT_PTR multiplication\n//\n#ifdef _WIN64\n#define RtlIntPtrMult   RtlLongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlIntPtrMult(\n    _In_ INT_PTR iMultiplicand,\n    _In_ INT_PTR iMultiplier,\n    _Out_ _Deref_out_range_(==, iMultiplicand * iMultiplier) INT_PTR* piResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(INT_PTR));\n    return RtlLongLongToIntPtr(((LONGLONG)iMultiplicand) * ((LONGLONG)iMultiplier), piResult);\n}\n#endif\n\n//\n// LONG multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongMult(\n    _In_ LONG lMultiplicand,\n    _In_ LONG lMultiplier,\n    _Out_ _Deref_out_range_(==, lMultiplicand * lMultiplier) LONG* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG));\n    return RtlLongLongToLong(((LONGLONG)lMultiplicand) * ((LONGLONG)lMultiplier), plResult);\n}\n\n//\n// LONG32 multiplication\n//\n#define RtlLong32Mult  RtlIntMult\n\n//\n// LONG_PTR multiplication\n//\n#ifdef _WIN64\n#define RtlLongPtrMult RtlLongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongPtrMult(\n    _In_ LONG_PTR lMultiplicand,\n    _In_ LONG_PTR lMultiplier,\n    _Out_ _Deref_out_range_(==, lMultiplicand * lMultiplier) LONG_PTR* plResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(LONG_PTR));\n    return RtlLongLongToLongPtr(((LONGLONG)lMultiplicand) * ((LONGLONG)lMultiplier), plResult);\n}\n#endif\n\n//\n// LONGLONG multiplication\n//\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlLongLongMult(\n    _In_ LONGLONG llMultiplicand,\n    _In_ LONGLONG llMultiplier,\n    _Out_ _Deref_out_range_(==, llMultiplicand * llMultiplier) LONGLONG* pllResult\n    )\n{\n    NTSTATUS status;\n\n#if defined(_USE_INTRINSIC_MULTIPLY128)\n    LONGLONG llResultHigh;\n    LONGLONG llResultLow;\n\n    llResultLow = Multiply128(llMultiplicand, llMultiplier, &llResultHigh);\n\n    if (((llResultLow < 0) && (llResultHigh != -1))    ||\n        ((llResultLow >= 0) && (llResultHigh != 0)))\n    {\n        *pllResult = LONGLONG_ERROR;\n        status = STATUS_INTEGER_OVERFLOW;\n    }\n    else\n    {\n        *pllResult = llResultLow;\n        status = STATUS_SUCCESS;\n    }\n#else // _USE_INTRINSIC_MULTIPLY128\n    //\n    // Split into sign and magnitude, do unsigned operation, apply sign.\n    //\n\n    ULONGLONG ullMultiplicand;\n    ULONGLONG ullMultiplier;\n    ULONGLONG ullResult;\n    const ULONGLONG LONGLONG_MIN_MAGNITUDE = ((((ULONGLONG) - (LONGLONG_MIN + 1))) + 1);\n\n    if (llMultiplicand < 0)\n    {\n        //\n        // Avoid negating the most negative number.\n        //\n        ullMultiplicand = ((ULONGLONG)(- (llMultiplicand + 1))) + 1;\n    }\n    else\n    {\n        ullMultiplicand = (ULONGLONG)llMultiplicand;\n    }\n\n    if (llMultiplier < 0)\n    {\n        //\n        // Avoid negating the most negative number.\n        //\n        ullMultiplier = ((ULONGLONG)(- (llMultiplier + 1))) + 1;\n    }\n    else\n    {\n        ullMultiplier = (ULONGLONG)llMultiplier;\n    }\n\n    status = RtlULongLongMult(ullMultiplicand, ullMultiplier, &ullResult);\n    if (NT_SUCCESS(status))\n    {\n        if ((llMultiplicand < 0) != (llMultiplier < 0))\n        {\n            if (ullResult > LONGLONG_MIN_MAGNITUDE)\n            {\n                *pllResult = LONGLONG_ERROR;\n                status = STATUS_INTEGER_OVERFLOW;\n            }\n            else\n            {\n                *pllResult = - ((LONGLONG)ullResult);\n            }\n        }\n        else\n        {\n            if (ullResult > LONGLONG_MAX)\n            {\n                *pllResult = LONGLONG_ERROR;\n                status = STATUS_INTEGER_OVERFLOW;\n            }\n            else\n            {\n                *pllResult = (LONGLONG)ullResult;\n            }\n        }\n    }\n    else\n    {\n        *pllResult = LONGLONG_ERROR;\n    }\n#endif // _USE_INTRINSIC_MULTIPLY128\n\n    return status;\n}\n\n//\n// LONG64 multiplication\n//\n#define RtlLong64Mult  RtlLongLongMult\n\n//\n// RtlINT64 multiplication\n//\n#define RtlInt64Mult   RtlLongLongMult\n\n//\n// ptrdiff_t multiplication\n//\n#ifdef _WIN64\n#define RtlPtrdiffTMult    RtlLongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlPtrdiffTMult(\n    _In_ ptrdiff_t Multiplicand,\n    _In_ ptrdiff_t Multiplier,\n    _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) ptrdiff_t* pResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(ptrdiff_t));\n    return RtlLongLongToPtrdiffT(((LONGLONG)Multiplicand) * ((LONGLONG)Multiplier), pResult);\n}\n#endif\n\n//\n// SSIZE_T multiplication\n//\n#ifdef _WIN64\n#define RtlSSIZETMult  RtlLongLongMult\n#else\n_Must_inspect_result_\n__inline\nNTSTATUS\nRtlSSIZETMult(\n    _In_ SSIZE_T Multiplicand,\n    _In_ SSIZE_T Multiplier,\n    _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) SSIZE_T* pResult\n    )\n{\n    C_ASSERT(sizeof(LONGLONG) > sizeof(SSIZE_T));\n    return RtlLongLongToSSIZET(((LONGLONG)Multiplicand) * ((LONGLONG)Multiplier), pResult);\n}\n#endif\n\n#endif // ENABLE_INTSAFE_SIGNED_FUNCTIONS\n\n//\n// Macros that are no longer used in this header but which clients may\n// depend on being defined here.\n//\n#ifndef LOWORD\n#define LOWORD(l)     ((WORD)(((DWORD_PTR)(l)) & 0xffff))\n#endif\n#ifndef HIWORD\n#define HIWORD(l)     ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))\n#endif\n#ifndef LODWORD\n#define LODWORD(_qw)    ((DWORD)(_qw))\n#endif\n#ifndef HIDWORD\n#define HIDWORD(_qw)    ((DWORD)(((_qw) >> 32) & 0xffffffff))\n#endif\n\n#if _MSC_VER >= 1200\n#pragma warning(pop)\n#endif\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#endif // _NTINTSAFE_H_INCLUDED_\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntioapi.h",
    "content": "/*\n * File management support\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTIOAPI_H\n#define _NTIOAPI_H\n\n//\n// Sharing mode\n//\n\n#define FILE_SHARE_NONE                 0x00000000\n#define FILE_SHARE_READ                 0x00000001\n#define FILE_SHARE_WRITE                0x00000002\n#define FILE_SHARE_DELETE               0x00000004\n\n//\n// Create disposition\n//\n\n#define FILE_SUPERSEDE                      0x00000000\n#define FILE_OPEN                           0x00000001\n#define FILE_CREATE                         0x00000002\n#define FILE_OPEN_IF                        0x00000003\n#define FILE_OVERWRITE                      0x00000004\n#define FILE_OVERWRITE_IF                   0x00000005\n#define FILE_MAXIMUM_DISPOSITION            0x00000005\n\n//\n// Create/open flags\n//\n\n#define FILE_DIRECTORY_FILE                 0x00000001\n#define FILE_WRITE_THROUGH                  0x00000002\n#define FILE_SEQUENTIAL_ONLY                0x00000004\n#define FILE_NO_INTERMEDIATE_BUFFERING      0x00000008\n\n#define FILE_SYNCHRONOUS_IO_ALERT           0x00000010\n#define FILE_SYNCHRONOUS_IO_NONALERT        0x00000020\n#define FILE_NON_DIRECTORY_FILE             0x00000040\n#define FILE_CREATE_TREE_CONNECTION         0x00000080\n\n#define FILE_COMPLETE_IF_OPLOCKED           0x00000100\n#define FILE_NO_EA_KNOWLEDGE                0x00000200\n#define FILE_OPEN_REMOTE_INSTANCE           0x00000400\n#define FILE_RANDOM_ACCESS                  0x00000800\n\n#define FILE_DELETE_ON_CLOSE                0x00001000\n#define FILE_OPEN_BY_FILE_ID                0x00002000\n#define FILE_OPEN_FOR_BACKUP_INTENT         0x00004000\n#define FILE_NO_COMPRESSION                 0x00008000\n\n#define FILE_OPEN_REQUIRING_OPLOCK          0x00010000\n#define FILE_DISALLOW_EXCLUSIVE             0x00020000\n#define FILE_SESSION_AWARE                  0x00040000\n\n#define FILE_RESERVE_OPFILTER               0x00100000\n#define FILE_OPEN_REPARSE_POINT             0x00200000\n#define FILE_OPEN_NO_RECALL                 0x00400000\n#define FILE_OPEN_FOR_FREE_SPACE_QUERY      0x00800000\n\n#define TREE_CONNECT_WRITE_THROUGH          0x00000002\n#define TREE_CONNECT_NO_CLIENT_BUFFERING    0x00000008\n\n//\n// Extended create/open flags\n//\n\n#define FILE_CONTAINS_EXTENDED_CREATE_INFORMATION   0x10000000\n#define FILE_VALID_EXTENDED_OPTION_FLAGS            0x10000000\n\ntypedef struct _EXTENDED_CREATE_DUAL_OPLOCK_KEYS \n{\n    //\n    //  Parent oplock key.\n    //  All-zero if not set.\n    //\n    GUID ParentOplockKey;\n    //\n    //  Target oplock key.\n    //  All-zero if not set.\n    //\n    GUID TargetOplockKey;\n} EXTENDED_CREATE_DUAL_OPLOCK_KEYS, *PEXTENDED_CREATE_DUAL_OPLOCK_KEYS;\n\ntypedef struct _EXTENDED_CREATE_INFORMATION\n{\n    LONGLONG ExtendedCreateFlags;\n    PVOID EaBuffer;\n    ULONG EaLength;\n    //PEXTENDED_CREATE_DUAL_OPLOCK_KEYS DualOplockKeys; // since 24H2\n} EXTENDED_CREATE_INFORMATION, *PEXTENDED_CREATE_INFORMATION;\n\ntypedef struct _EXTENDED_CREATE_INFORMATION_32\n{\n    LONGLONG ExtendedCreateFlags;\n    void* POINTER_32 EaBuffer;\n    ULONG EaLength;\n    //PEXTENDED_CREATE_DUAL_OPLOCK_KEYS POINTER_32 DualOplockKeys; // since 24H2\n} EXTENDED_CREATE_INFORMATION_32, *PEXTENDED_CREATE_INFORMATION_32;\n\n#define EX_CREATE_FLAG_FILE_SOURCE_OPEN_FOR_COPY 0x00000001\n#define EX_CREATE_FLAG_FILE_DEST_OPEN_FOR_COPY   0x00000002\n\n#define FILE_VALID_OPTION_FLAGS             0x00ffffff\n#define FILE_VALID_PIPE_OPTION_FLAGS        0x00000032\n#define FILE_VALID_MAILSLOT_OPTION_FLAGS    0x00000032\n#define FILE_VALID_SET_FLAGS                0x00000036\n\n#define FILE_COPY_STRUCTURED_STORAGE        0x00000041\n#define FILE_STRUCTURED_STORAGE             0x00000441\n\n// I/O status information values for NtCreateFile/NtOpenFile\n\n#define FILE_SUPERSEDED                 0x00000000\n#define FILE_OPENED                     0x00000001\n#define FILE_CREATED                    0x00000002\n#define FILE_OVERWRITTEN                0x00000003\n#define FILE_EXISTS                     0x00000004\n#define FILE_DOES_NOT_EXIST             0x00000005\n\n// Special ByteOffset parameters\n\n#define FILE_WRITE_TO_END_OF_FILE       0xffffffff\n#define FILE_USE_FILE_POINTER_POSITION  0xfffffffe\n\n// Alignment requirement values\n\n#define FILE_BYTE_ALIGNMENT             0x00000000\n#define FILE_WORD_ALIGNMENT             0x00000001\n#define FILE_LONG_ALIGNMENT             0x00000003\n#define FILE_QUAD_ALIGNMENT             0x00000007\n#define FILE_OCTA_ALIGNMENT             0x0000000f\n#define FILE_32_BYTE_ALIGNMENT          0x0000001f\n#define FILE_64_BYTE_ALIGNMENT          0x0000003f\n#define FILE_128_BYTE_ALIGNMENT         0x0000007f\n#define FILE_256_BYTE_ALIGNMENT         0x000000ff\n#define FILE_512_BYTE_ALIGNMENT         0x000001ff\n\n// Maximum length of a filename string\n\n#define DOS_MAX_COMPONENT_LENGTH 255\n#define DOS_MAX_PATH_LENGTH (DOS_MAX_COMPONENT_LENGTH + 5)\n\n#define MAXIMUM_FILENAME_LENGTH 256\n\n//\n// Extended attributes\n//\n\n#define FILE_NEED_EA                    0x00000080\n\n#define FILE_EA_TYPE_BINARY             0xfffe\n#define FILE_EA_TYPE_ASCII              0xfffd\n#define FILE_EA_TYPE_BITMAP             0xfffb\n#define FILE_EA_TYPE_METAFILE           0xfffa\n#define FILE_EA_TYPE_ICON               0xfff9\n#define FILE_EA_TYPE_EA                 0xffee\n#define FILE_EA_TYPE_MVMT               0xffdf\n#define FILE_EA_TYPE_MVST               0xffde\n#define FILE_EA_TYPE_ASN1               0xffdd\n#define FILE_EA_TYPE_FAMILY_IDS         0xff01\n\n//\n// Device characteristics\n//\n\n#define FILE_REMOVABLE_MEDIA                        0x00000001\n#define FILE_READ_ONLY_DEVICE                       0x00000002\n#define FILE_FLOPPY_DISKETTE                        0x00000004\n#define FILE_WRITE_ONCE_MEDIA                       0x00000008\n#define FILE_REMOTE_DEVICE                          0x00000010\n#define FILE_DEVICE_IS_MOUNTED                      0x00000020\n#define FILE_VIRTUAL_VOLUME                         0x00000040\n#define FILE_AUTOGENERATED_DEVICE_NAME              0x00000080\n#define FILE_DEVICE_SECURE_OPEN                     0x00000100\n#define FILE_CHARACTERISTIC_PNP_DEVICE              0x00000800\n#define FILE_CHARACTERISTIC_TS_DEVICE               0x00001000\n#define FILE_CHARACTERISTIC_WEBDAV_DEVICE           0x00002000\n#define FILE_CHARACTERISTIC_CSV                     0x00010000\n#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL    0x00020000\n#define FILE_PORTABLE_DEVICE                        0x00040000\n#define FILE_REMOTE_DEVICE_VSMB                     0x00080000\n#define FILE_DEVICE_REQUIRE_SECURITY_CHECK          0x00100000\n\n//\n// Named pipe values\n//\n\n// NamedPipeType for NtCreateNamedPipeFile\n#define FILE_PIPE_BYTE_STREAM_TYPE      0x00000000\n#define FILE_PIPE_MESSAGE_TYPE          0x00000001\n#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000\n#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002\n#define FILE_PIPE_TYPE_VALID_MASK       0x00000003\n\n// CompletionMode for NtCreateNamedPipeFile\n#define FILE_PIPE_QUEUE_OPERATION       0x00000000\n#define FILE_PIPE_COMPLETE_OPERATION    0x00000001\n\n// ReadMode for NtCreateNamedPipeFile\n#define FILE_PIPE_BYTE_STREAM_MODE      0x00000000\n#define FILE_PIPE_MESSAGE_MODE          0x00000001\n\n// NamedPipeConfiguration for NtQueryInformationFile\n#define FILE_PIPE_INBOUND               0x00000000\n#define FILE_PIPE_OUTBOUND              0x00000001\n#define FILE_PIPE_FULL_DUPLEX           0x00000002\n\n// NamedPipeState for NtQueryInformationFile\n#define FILE_PIPE_DISCONNECTED_STATE    0x00000001\n#define FILE_PIPE_LISTENING_STATE       0x00000002\n#define FILE_PIPE_CONNECTED_STATE       0x00000003\n#define FILE_PIPE_CLOSING_STATE         0x00000004\n\n// NamedPipeEnd for NtQueryInformationFile\n#define FILE_PIPE_CLIENT_END            0x00000000\n#define FILE_PIPE_SERVER_END            0x00000001\n\n// Win32 pipe instance limit (0xff)\n#define FILE_PIPE_UNLIMITED_INSTANCES   0xffffffff\n\n//\n// Mailslot values\n//\n\n#define MAILSLOT_SIZE_AUTO 0\n\ntypedef struct _IO_STATUS_BLOCK\n{\n    union\n    {\n        NTSTATUS Status;\n        PVOID Pointer;\n    };\n    ULONG_PTR Information;\n} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;\n\ntypedef _Function_class_(IO_APC_ROUTINE)\nVOID NTAPI IO_APC_ROUTINE(\n    _In_ PVOID ApcContext,\n    _In_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG Reserved\n    );\ntypedef IO_APC_ROUTINE* PIO_APC_ROUTINE;\n\n//\n// NtQueryInformationFile/NtSetInformationFile types\n//\n\ntypedef enum _FILE_INFORMATION_CLASS\n{\n    FileDirectoryInformation = 1, // q: FILE_DIRECTORY_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileFullDirectoryInformation, // q: FILE_FULL_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileBothDirectoryInformation, // q: FILE_BOTH_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileBasicInformation, // qs: FILE_BASIC_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES)\n    FileStandardInformation, // q: FILE_STANDARD_INFORMATION, FILE_STANDARD_INFORMATION_EX\n    FileInternalInformation, // q: FILE_INTERNAL_INFORMATION\n    FileEaInformation, // q: FILE_EA_INFORMATION\n    FileAccessInformation, // q: FILE_ACCESS_INFORMATION\n    FileNameInformation, // q: FILE_NAME_INFORMATION\n    FileRenameInformation, // s: FILE_RENAME_INFORMATION (requires DELETE) // 10\n    FileLinkInformation, // s: FILE_LINK_INFORMATION\n    FileNamesInformation, // q: FILE_NAMES_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileDispositionInformation, // s: FILE_DISPOSITION_INFORMATION (requires DELETE)\n    FilePositionInformation, // qs: FILE_POSITION_INFORMATION\n    FileFullEaInformation, // FILE_FULL_EA_INFORMATION\n    FileModeInformation, // qs: FILE_MODE_INFORMATION\n    FileAlignmentInformation, // q: FILE_ALIGNMENT_INFORMATION\n    FileAllInformation, // q: FILE_ALL_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileAllocationInformation, // s: FILE_ALLOCATION_INFORMATION (requires FILE_WRITE_DATA)\n    FileEndOfFileInformation, // s: FILE_END_OF_FILE_INFORMATION (requires FILE_WRITE_DATA) // 20\n    FileAlternateNameInformation, // q: FILE_NAME_INFORMATION\n    FileStreamInformation, // q: FILE_STREAM_INFORMATION\n    FilePipeInformation, // qs: FILE_PIPE_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES)\n    FilePipeLocalInformation, // q: FILE_PIPE_LOCAL_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FilePipeRemoteInformation, // qs: FILE_PIPE_REMOTE_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES)\n    FileMailslotQueryInformation, // q: FILE_MAILSLOT_QUERY_INFORMATION\n    FileMailslotSetInformation, // s: FILE_MAILSLOT_SET_INFORMATION\n    FileCompressionInformation, // q: FILE_COMPRESSION_INFORMATION\n    FileObjectIdInformation, // q: FILE_OBJECTID_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileCompletionInformation, // s: FILE_COMPLETION_INFORMATION // 30\n    FileMoveClusterInformation, // s: FILE_MOVE_CLUSTER_INFORMATION (requires FILE_WRITE_DATA)\n    FileQuotaInformation, // q: FILE_QUOTA_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileReparsePointInformation, // q: FILE_REPARSE_POINT_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileNetworkOpenInformation, // q: FILE_NETWORK_OPEN_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileAttributeTagInformation, // q: FILE_ATTRIBUTE_TAG_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileTrackingInformation, // s: FILE_TRACKING_INFORMATION (requires FILE_WRITE_DATA)\n    FileIdBothDirectoryInformation, // q: FILE_ID_BOTH_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileIdFullDirectoryInformation, // q: FILE_ID_FULL_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex])\n    FileValidDataLengthInformation, // s: FILE_VALID_DATA_LENGTH_INFORMATION (requires FILE_WRITE_DATA and/or SeManageVolumePrivilege)\n    FileShortNameInformation, // s: FILE_NAME_INFORMATION (requires DELETE) // 40\n    FileIoCompletionNotificationInformation, // qs: FILE_IO_COMPLETION_NOTIFICATION_INFORMATION (q: requires FILE_READ_ATTRIBUTES) // since VISTA\n    FileIoStatusBlockRangeInformation, // s: FILE_IOSTATUSBLOCK_RANGE_INFORMATION (requires SeLockMemoryPrivilege)\n    FileIoPriorityHintInformation, // qs: FILE_IO_PRIORITY_HINT_INFORMATION, FILE_IO_PRIORITY_HINT_INFORMATION_EX (q: requires FILE_READ_DATA)\n    FileSfioReserveInformation, // qs: FILE_SFIO_RESERVE_INFORMATION (q: requires FILE_READ_DATA)\n    FileSfioVolumeInformation, // q: FILE_SFIO_VOLUME_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileHardLinkInformation, // q: FILE_LINKS_INFORMATION\n    FileProcessIdsUsingFileInformation, // q: FILE_PROCESS_IDS_USING_FILE_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileNormalizedNameInformation, // q: FILE_NAME_INFORMATION\n    FileNetworkPhysicalNameInformation, // q: FILE_NETWORK_PHYSICAL_NAME_INFORMATION\n    FileIdGlobalTxDirectoryInformation, // q: FILE_ID_GLOBAL_TX_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex]) // since WIN7 // 50\n    FileIsRemoteDeviceInformation, // q: FILE_IS_REMOTE_DEVICE_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileUnusedInformation,\n    FileNumaNodeInformation, // q: FILE_NUMA_NODE_INFORMATION\n    FileStandardLinkInformation, // q: FILE_STANDARD_LINK_INFORMATION\n    FileRemoteProtocolInformation, // q: FILE_REMOTE_PROTOCOL_INFORMATION\n    FileRenameInformationBypassAccessCheck, // s: FILE_RENAME_INFORMATION // (kernel-mode only) // since WIN8\n    FileLinkInformationBypassAccessCheck, // s: FILE_LINK_INFORMATION // (kernel-mode only)\n    FileVolumeNameInformation, // q: FILE_VOLUME_NAME_INFORMATION\n    FileIdInformation, // q: FILE_ID_INFORMATION\n    FileIdExtdDirectoryInformation, // q: FILE_ID_EXTD_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex]) // 60\n    FileReplaceCompletionInformation, // s: FILE_COMPLETION_INFORMATION // since WINBLUE\n    FileHardLinkFullIdInformation, // q: FILE_LINK_ENTRY_FULL_ID_INFORMATION // FILE_LINKS_FULL_ID_INFORMATION\n    FileIdExtdBothDirectoryInformation, // q: FILE_ID_EXTD_BOTH_DIR_INFORMATION (requires FILE_LIST_DIRECTORY) (NtQueryDirectoryFile[Ex]) // since THRESHOLD\n    FileDispositionInformationEx, // s: FILE_DISPOSITION_INFO_EX (requires DELETE) // since REDSTONE\n    FileRenameInformationEx, // s: FILE_RENAME_INFORMATION_EX\n    FileRenameInformationExBypassAccessCheck, // s: FILE_RENAME_INFORMATION_EX // (kernel-mode only)\n    FileDesiredStorageClassInformation, // qs: FILE_DESIRED_STORAGE_CLASS_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES) // since REDSTONE2\n    FileStatInformation, // q: FILE_STAT_INFORMATION (requires FILE_READ_ATTRIBUTES)\n    FileMemoryPartitionInformation, // s: FILE_MEMORY_PARTITION_INFORMATION // since REDSTONE3\n    FileStatLxInformation, // q: FILE_STAT_LX_INFORMATION (requires FILE_READ_ATTRIBUTES and FILE_READ_EA) // since REDSTONE4 // 70\n    FileCaseSensitiveInformation, // qs: FILE_CASE_SENSITIVE_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES)\n    FileLinkInformationEx, // s: FILE_LINK_INFORMATION_EX // since REDSTONE5\n    FileLinkInformationExBypassAccessCheck, // s: FILE_LINK_INFORMATION_EX // (kernel-mode only)\n    FileStorageReserveIdInformation, // qs: FILE_STORAGE_RESERVE_ID_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES)\n    FileCaseSensitiveInformationForceAccessCheck, // qs: FILE_CASE_SENSITIVE_INFORMATION\n    FileKnownFolderInformation, // qs: FILE_KNOWN_FOLDER_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES) // since WIN11\n    FileStatBasicInformation, // qs: FILE_STAT_BASIC_INFORMATION // since 23H2\n    FileId64ExtdDirectoryInformation, // FILE_ID_64_EXTD_DIR_INFORMATION\n    FileId64ExtdBothDirectoryInformation, // FILE_ID_64_EXTD_BOTH_DIR_INFORMATION\n    FileIdAllExtdDirectoryInformation, // FILE_ID_ALL_EXTD_DIR_INFORMATION\n    FileIdAllExtdBothDirectoryInformation, // FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION\n    FileStreamReservationInformation, // FILE_STREAM_RESERVATION_INFORMATION // since 24H2\n    FileMupProviderInfo, // MUP_PROVIDER_INFORMATION\n    FileMaximumInformation\n} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;\n\n/**\n * The FILE_BASIC_INFORMATION structure contains timestamps and basic attributes of a file.\n * @li If you specify a value of zero for any of the XxxTime members, the file system keeps a file's current value for that time.\n * @li If you specify a value of -1 for any of the XxxTime members, time stamp updates are disabled for I/O operations preformed on the file handle.\n * @li If you specify a value of -2 for any of the XxxTime members, time stamp updates are enabled for I/O operations preformed on the file handle.\n * @remarks To set the members of this structure, the caller must have FILE_WRITE_ATTRIBUTES access to the file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_basic_information\n */\ntypedef struct _FILE_BASIC_INFORMATION\n{\n    LARGE_INTEGER CreationTime;         // Specifies the time that the file was created.\n    LARGE_INTEGER LastAccessTime;       // Specifies the time that the file was last accessed.\n    LARGE_INTEGER LastWriteTime;        // Specifies the time that the file was last written to.\n    LARGE_INTEGER ChangeTime;           // Specifies the last time the file was changed.\n    ULONG FileAttributes;               // Specifies one or more FILE_ATTRIBUTE_XXX flags.\n} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;\n\n/**\n * The FILE_STANDARD_INFORMATION structure contains standard information of a file.\n * @remarks EndOfFile specifies the byte offset to the end of the file.\n * Because this value is zero-based, it actually refers to the first free byte in the file; that is, it is the offset to the byte immediately following the last valid byte in the file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_standard_information\n */\ntypedef struct _FILE_STANDARD_INFORMATION\n{\n    LARGE_INTEGER AllocationSize;       // The file allocation size in bytes. Usually, this value is a multiple of the sector or cluster size of the underlying physical device.\n    LARGE_INTEGER EndOfFile;            // The end of file location as a byte offset.\n    ULONG NumberOfLinks;                // The number of hard links to the file.\n    BOOLEAN DeletePending;              // The delete pending status. TRUE indicates that a file deletion has been requested.\n    BOOLEAN Directory;                  // The file directory status. TRUE indicates the file object represents a directory.\n} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;\n\n/**\n * The FILE_STANDARD_INFORMATION_EX structure is used as an argument to routines that query or set file information\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_standard_information_ex\n */\ntypedef struct _FILE_STANDARD_INFORMATION_EX\n{\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    ULONG NumberOfLinks;\n    BOOLEAN DeletePending;\n    BOOLEAN Directory;\n    BOOLEAN AlternateStream;\n    BOOLEAN MetadataAttribute;\n} FILE_STANDARD_INFORMATION_EX, *PFILE_STANDARD_INFORMATION_EX;\n\n/**\n * The FILE_INTERNAL_INFORMATION structure is used to query for the file system's 8-byte file reference number for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_internal_information\n */\ntypedef struct _FILE_INTERNAL_INFORMATION\n{\n    union\n    {\n        ULARGE_INTEGER IndexNumber;\n        struct\n        {\n            ULONGLONG MftRecordIndex : 48; // rev\n            ULONGLONG SequenceNumber : 16; // rev\n        };\n    };\n} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;\n\n/**\n * The FILE_EA_INFORMATION structure is used to query for the size of the extended attributes (EA) for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_ea_information\n */\ntypedef struct _FILE_EA_INFORMATION\n{\n    ULONG EaSize;\n} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;\n\n/**\n * The FILE_ACCESS_INFORMATION structure is used to query for or set the access rights of a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_access_information\n */\ntypedef struct _FILE_ACCESS_INFORMATION\n{\n    ACCESS_MASK AccessFlags;\n} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;\n\n/**\n * The FILE_POSITION_INFORMATION structure is used as an argument to routines that query or set file information.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_position_information\n */\ntypedef struct _FILE_POSITION_INFORMATION\n{\n    LARGE_INTEGER CurrentByteOffset;\n} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;\n\n/**\n * The FILE_MODE_INFORMATION structure is used to query or set the access mode of a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_mode_information\n */\ntypedef struct _FILE_MODE_INFORMATION\n{\n    ULONG Mode;\n} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;\n\n/**\n * The FILE_ALIGNMENT_INFORMATION structure is used to query or set the buffer alignment required by the underlying device.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_alignment_information\n */\ntypedef struct _FILE_ALIGNMENT_INFORMATION\n{\n    ULONG AlignmentRequirement;\n} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;\n\n/**\n * The FILE_NAME_INFORMATION structure is used to query or set the file name and/or new short name for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_name_information\n */\ntypedef struct _FILE_NAME_INFORMATION\n{\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;\n\n/**\n * The FILE_ALL_INFORMATION structure is used as a container for several FILE_XXX_INFORMATION structures.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_all_information\n */\ntypedef struct _FILE_ALL_INFORMATION\n{\n    FILE_BASIC_INFORMATION BasicInformation;\n    FILE_STANDARD_INFORMATION StandardInformation;\n    FILE_INTERNAL_INFORMATION InternalInformation;\n    FILE_EA_INFORMATION EaInformation;\n    FILE_ACCESS_INFORMATION AccessInformation;\n    FILE_POSITION_INFORMATION PositionInformation;\n    FILE_MODE_INFORMATION ModeInformation;\n    FILE_ALIGNMENT_INFORMATION AlignmentInformation;\n    FILE_NAME_INFORMATION NameInformation;\n} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;\n\n/**\n * The FILE_NETWORK_OPEN_INFORMATION structure is used to query for information that is commonly needed when a file is opened across a network.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_network_open_information\n */\ntypedef struct _FILE_NETWORK_OPEN_INFORMATION\n{\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    ULONG FileAttributes;\n} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;\n\n/**\n * The FILE_ATTRIBUTE_TAG_INFORMATION structure is used to query for attribute and reparse tag information for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_attribute_tag_information\n */\ntypedef struct _FILE_ATTRIBUTE_TAG_INFORMATION\n{\n    ULONG FileAttributes;\n    ULONG ReparseTag;\n} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;\n\n/**\n * The FILE_ALLOCATION_INFORMATION structure is used to set the allocation size for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_allocation_information\n */\ntypedef struct _FILE_ALLOCATION_INFORMATION\n{\n    LARGE_INTEGER AllocationSize;\n} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;\n\n/**\n * The FILE_COMPRESSION_INFORMATION structure describes the state of a compressed data buffer.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_compression_information\n */\ntypedef struct _FILE_COMPRESSION_INFORMATION\n{\n    LARGE_INTEGER CompressedFileSize;\n    USHORT CompressionFormat;\n    UCHAR CompressionUnitShift;\n    UCHAR ChunkShift;\n    UCHAR ClusterShift;\n    UCHAR Reserved[3];\n} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;\n\n/**\n * The FILE_DISPOSITION_INFORMATION structure is used to mark a file for deletion.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_disposition_information\n */\ntypedef struct _FILE_DISPOSITION_INFORMATION\n{\n    BOOLEAN DeleteFile;\n} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;\n\n/**\n * The FILE_END_OF_FILE_INFORMATION structure is used to set end-of-file information for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_end_of_file_information\n */\ntypedef struct _FILE_END_OF_FILE_INFORMATION\n{\n    LARGE_INTEGER EndOfFile;\n} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;\n\n#define FLAGS_END_OF_FILE_INFO_EX_EXTEND_PAGING             0x00000001\n#define FLAGS_END_OF_FILE_INFO_EX_NO_EXTRA_PAGING_EXTEND    0x00000002\n#define FLAGS_END_OF_FILE_INFO_EX_TIME_CONSTRAINED          0x00000004\n#define FLAGS_DELAY_REASONS_LOG_FILE_FULL                   0x00000001\n#define FLAGS_DELAY_REASONS_BITMAP_SCANNED                  0x00000002\n\ntypedef struct _FILE_END_OF_FILE_INFORMATION_EX\n{\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER PagingFileSizeInMM;\n    LARGE_INTEGER PagingFileMaxSize;\n    ULONG Flags;\n} FILE_END_OF_FILE_INFORMATION_EX, *PFILE_END_OF_FILE_INFORMATION_EX;\n\n/**\n * The FILE_VALID_DATA_LENGTH_INFORMATION structure is used to set the valid data length information for a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_valid_data_length_information\n */\ntypedef struct _FILE_VALID_DATA_LENGTH_INFORMATION\n{\n    LARGE_INTEGER ValidDataLength;\n} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;\n\n#define FILE_LINK_REPLACE_IF_EXISTS 0x00000001 // since RS5\n#define FILE_LINK_POSIX_SEMANTICS   0x00000002\n\n#define FILE_LINK_SUPPRESS_STORAGE_RESERVE_INHERITANCE  0x00000008\n#define FILE_LINK_NO_INCREASE_AVAILABLE_SPACE           0x00000010\n#define FILE_LINK_NO_DECREASE_AVAILABLE_SPACE           0x00000020\n#define FILE_LINK_PRESERVE_AVAILABLE_SPACE              0x00000030\n#define FILE_LINK_IGNORE_READONLY_ATTRIBUTE             0x00000040\n#define FILE_LINK_FORCE_RESIZE_TARGET_SR                0x00000080 // since 19H1\n#define FILE_LINK_FORCE_RESIZE_SOURCE_SR                0x00000100\n#define FILE_LINK_FORCE_RESIZE_SR                       0x00000180\n\n/**\n * The FILE_LINK_INFORMATION structure is used to create an NTFS hard link to an existing file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_link_information\n */\ntypedef struct _FILE_LINK_INFORMATION\n{\n    BOOLEAN ReplaceIfExists;\n    HANDLE RootDirectory;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;\n\ntypedef struct _FILE_LINK_INFORMATION_EX\n{\n    ULONG Flags;\n    HANDLE RootDirectory;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_LINK_INFORMATION_EX, *PFILE_LINK_INFORMATION_EX;\n\ntypedef struct _FILE_MOVE_CLUSTER_INFORMATION\n{\n    ULONG ClusterCount;\n    HANDLE RootDirectory;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;\n\n/**\n * The FILE_RENAME_INFORMATION structure is used to rename a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information\n */\ntypedef struct _FILE_RENAME_INFORMATION\n{\n    BOOLEAN ReplaceIfExists;\n    HANDLE RootDirectory;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;\n\n#define FILE_RENAME_REPLACE_IF_EXISTS                       0x00000001 // since REDSTONE\n#define FILE_RENAME_POSIX_SEMANTICS                         0x00000002\n#define FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE          0x00000004 // since REDSTONE3\n#define FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE    0x00000008 // since REDSTONE5\n#define FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE             0x00000010\n#define FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE             0x00000020\n#define FILE_RENAME_PRESERVE_AVAILABLE_SPACE                0x00000030\n#define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE               0x00000040\n#define FILE_RENAME_FORCE_RESIZE_TARGET_SR                  0x00000080 // since 19H1\n#define FILE_RENAME_FORCE_RESIZE_SOURCE_SR                  0x00000100\n#define FILE_RENAME_FORCE_RESIZE_SR                         0x00000180\n\n/**\n * The FILE_RENAME_INFORMATION_EX structure is used to rename a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information\n */\ntypedef struct _FILE_RENAME_INFORMATION_EX\n{\n    ULONG Flags;\n    HANDLE RootDirectory;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_RENAME_INFORMATION_EX, *PFILE_RENAME_INFORMATION_EX;\n\n/**\n * The FILE_STREAM_INFORMATION structure contains information about a file stream.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_stream_information\n */\ntypedef struct _FILE_STREAM_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG StreamNameLength;\n    LARGE_INTEGER StreamSize;\n    LARGE_INTEGER StreamAllocationSize;\n    _Field_size_bytes_(StreamNameLength) WCHAR StreamName[1];\n} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;\n\n/**\n * The FILE_TRACKING_INFORMATION structure contains information used for tracking file operations.\n */\ntypedef struct _FILE_TRACKING_INFORMATION\n{\n    HANDLE DestinationFile;\n    ULONG ObjectInformationLength;\n    _Field_size_bytes_(ObjectInformationLength) CHAR ObjectInformation[1];\n} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;\n\n/**\n * The FILE_COMPLETION_INFORMATION structure contains the port handle and key for an I/O completion port created for a file handle.\n *\n * @remarks he FILE_COMPLETION_INFORMATION structure is used to replace the completion information for a port handle set in Port.\n * Completion information is replaced with the ZwSetInformationFile routine with the FileInformationClass parameter set to FileReplaceCompletionInformation.\n * The Port and Key members of FILE_COMPLETION_INFORMATION are set to their new values. To remove an existing completion port for a file handle, Port is set to NULL.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_completion_information\n */\ntypedef struct _FILE_COMPLETION_INFORMATION\n{\n    HANDLE Port;\n    PVOID Key;\n} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;\n\n/**\n * The FILE_PIPE_INFORMATION structure contains information about a named pipe that is not specific to the local or the remote end of the pipe.\n *\n * @remarks If ReadMode is set to FILE_PIPE_BYTE_STREAM_MODE, any attempt to change it must fail with a STATUS_INVALID_PARAMETER error code.\n * When CompletionMode is set to FILE_PIPE_QUEUE_OPERATION, if the pipe is connected to, read to, or written from,\n * the operation is not completed until there is data to read, all data is written, or a client is connected.\n * When CompletionMode is set to FILE_PIPE_COMPLETE_OPERATION, if the pipe is being connected to, read to, or written from, the operation is completed immediately.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_pipe_information\n */\ntypedef struct _FILE_PIPE_INFORMATION\n{\n     ULONG ReadMode;\n     ULONG CompletionMode;\n} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;\n\n/**\n * The FILE_PIPE_LOCAL_INFORMATION structure contains information about the local end of a named pipe.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_pipe_local_information\n */\ntypedef struct _FILE_PIPE_LOCAL_INFORMATION\n{\n     ULONG NamedPipeType;\n     ULONG NamedPipeConfiguration;\n     ULONG MaximumInstances;\n     ULONG CurrentInstances;\n     ULONG InboundQuota;\n     ULONG ReadDataAvailable;\n     ULONG OutboundQuota;\n     ULONG WriteQuotaAvailable;\n     ULONG NamedPipeState;\n     ULONG NamedPipeEnd;\n} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;\n\n/**\n * The FILE_PIPE_REMOTE_INFORMATION structure contains information about the remote end of a named pipe.\n *\n * @remarks Remote information is not available for local pipes or for the server end of a remote pipe.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_pipe_remote_information\n */\ntypedef struct _FILE_PIPE_REMOTE_INFORMATION\n{\n    LARGE_INTEGER CollectDataTime;  // The maximum amount of time, in 100-nanosecond intervals, that elapses before transmission of data from the client machine to the server.\n    ULONG MaximumCollectionCount;   // The maximum size, in bytes, of data that will be collected on the client machine before transmission to the server.\n} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;\n\n/**\n * The FILE_MAILSLOT_QUERY_INFORMATION structure contains information about a mailslot.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_mailslot_query_information\n */\ntypedef struct _FILE_MAILSLOT_QUERY_INFORMATION\n{\n    ULONG MaximumMessageSize;       // The maximum size, in bytes, of a single message that can be written to the mailslot, or 0 for a message of any size.\n    ULONG MailslotQuota;            // The size, in bytes, of the in-memory pool that is reserved for writes to this mailslot.\n    ULONG NextMessageSize;          // The next message size, in bytes.\n    ULONG MessagesAvailable;        // The total number of messages waiting to be read from the mailslot.\n    LARGE_INTEGER ReadTimeout;      // The time, in milliseconds, that a read operation can wait for a message to be written to the mailslot before a time-out occurs.\n} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;\n\n/**\n * The FILE_MAILSLOT_SET_INFORMATION structure is used to set a value on a mailslot.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_mailslot_set_information\n */\ntypedef struct _FILE_MAILSLOT_SET_INFORMATION\n{\n    PLARGE_INTEGER ReadTimeout;     // The time, in milliseconds, that a read operation can wait for a message to be written to the mailslot before a time-out occurs.\n} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;\n\n/**\n * The FILE_REPARSE_POINT_INFORMATION structure contains information about a reparse point.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_reparse_point_information\n */\ntypedef struct _FILE_REPARSE_POINT_INFORMATION\n{\n    LONGLONG FileReference;\n    ULONG Tag;\n} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;\n\n/**\n * The FILE_LINK_ENTRY_INFORMATION structure contains information about a file link entry.\n */\ntypedef struct _FILE_LINK_ENTRY_INFORMATION\n{\n    ULONG NextEntryOffset;\n    LONGLONG ParentFileId; // LARGE_INTEGER\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;\n\n/**\n * The FILE_LINKS_INFORMATION structure contains information about file links.\n */\ntypedef struct _FILE_LINKS_INFORMATION\n{\n    ULONG BytesNeeded;\n    ULONG EntriesReturned;\n    FILE_LINK_ENTRY_INFORMATION Entry;\n} FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;\n\n/**\n * The FILE_NETWORK_PHYSICAL_NAME_INFORMATION structure contains information about the network physical name of a file.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_network_physical_name_information\n */\ntypedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION\n{\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;\n\n/**\n * The FILE_STANDARD_LINK_INFORMATION structure contains standard information about a file link.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-file_standard_link_information\n */\ntypedef struct _FILE_STANDARD_LINK_INFORMATION\n{\n    ULONG NumberOfAccessibleLinks;\n    ULONG TotalNumberOfLinks;\n    BOOLEAN DeletePending;\n    BOOLEAN Directory;\n} FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;\n\ntypedef struct _FILE_SFIO_RESERVE_INFORMATION\n{\n    ULONG RequestsPerPeriod;\n    ULONG Period;\n    BOOLEAN RetryFailures;\n    BOOLEAN Discardable;\n    ULONG RequestSize;\n    ULONG NumOutstandingRequests;\n} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;\n\ntypedef struct _FILE_SFIO_VOLUME_INFORMATION\n{\n    ULONG MaximumRequestsPerPeriod;\n    ULONG MinimumPeriod;\n    ULONG MinimumTransferSize;\n} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;\n\ntypedef enum _IO_PRIORITY_HINT\n{\n    IoPriorityVeryLow = 0, // Defragging, content indexing and other background I/Os.\n    IoPriorityLow, // Prefetching for applications.\n    IoPriorityNormal, // Normal I/Os.\n    IoPriorityHigh, // Used by filesystems for checkpoint I/O.\n    IoPriorityCritical, // Used by memory manager. Not available for applications.\n    MaxIoPriorityTypes\n} IO_PRIORITY_HINT;\n\n/**\n * The FILE_IO_PRIORITY_HINT_INFORMATION structure is used to query and set the default IRP priority hint for requests on the specified file handle.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_io_priority_hint_information\n */\ntypedef struct DECLSPEC_ALIGN(8) _FILE_IO_PRIORITY_HINT_INFORMATION\n{\n    IO_PRIORITY_HINT PriorityHint;\n} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;\n\n/**\n * The FILE_IO_PRIORITY_HINT_INFORMATION_EX structure is used to query and set the default IRP priority hint for requests on the specified file handle.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_io_priority_hint_information\n */\ntypedef struct _FILE_IO_PRIORITY_HINT_INFORMATION_EX\n{\n    IO_PRIORITY_HINT PriorityHint;\n    BOOLEAN BoostOutstanding;\n} FILE_IO_PRIORITY_HINT_INFORMATION_EX, *PFILE_IO_PRIORITY_HINT_INFORMATION_EX;\n\n#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1\n#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2\n#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4\n\ntypedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION\n{\n    ULONG Flags;\n} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;\n\ntypedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION\n{\n    ULONG NumberOfProcessIdsInList;\n    _Field_size_(NumberOfProcessIdsInList) ULONG_PTR ProcessIdList[1];\n} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;\n\n/**\n * The FILE_IS_REMOTE_DEVICE_INFORMATION structure indicates whether the file system that contains the file is a remote file system.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_is_remote_device_information\n */\ntypedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION\n{\n    BOOLEAN IsRemote; // A value that indicates whether the file system that contains the file is a remote file system.\n} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;\n\ntypedef struct _FILE_NUMA_NODE_INFORMATION\n{\n    USHORT NodeNumber;\n} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;\n\ntypedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION\n{\n    PUCHAR IoStatusBlockRange;\n    ULONG Length;\n} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;\n\n// Win32 FILE_REMOTE_PROTOCOL_INFO\ntypedef struct _FILE_REMOTE_PROTOCOL_INFORMATION\n{\n    // Structure Version\n    USHORT StructureVersion;     // 1 for Win7, 2 for Win8 SMB3, 3 for Blue SMB3, 4 for RS5\n    USHORT StructureSize;        // sizeof(FILE_REMOTE_PROTOCOL_INFORMATION)\n\n    ULONG Protocol;             // Protocol (WNNC_NET_*) defined in winnetwk.h or ntifs.h.\n\n    // Protocol Version & Type\n    USHORT ProtocolMajorVersion;\n    USHORT ProtocolMinorVersion;\n    USHORT ProtocolRevision;\n\n    USHORT Reserved;\n\n    // Protocol-Generic Information\n    ULONG Flags;\n\n    struct\n    {\n        ULONG Reserved[8];\n    } GenericReserved;\n\n    // Protocol specific information\n\n    union\n    {\n        struct\n        {\n            struct\n            {\n                ULONG Capabilities;\n            } Server;\n            struct\n            {\n                ULONG Capabilities;\n                ULONG ShareFlags; // previoulsly CachingFlags before 21H1\n                UCHAR ShareType; // RS5\n                UCHAR Reserved0[3];\n                ULONG Reserved1;\n            } Share;\n        } Smb2;\n        ULONG Reserved[16];\n    } ProtocolSpecific;\n} FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;\n\n#define CHECKSUM_ENFORCEMENT_OFF 0x00000001\n\ntypedef struct _FILE_INTEGRITY_STREAM_INFORMATION\n{\n    USHORT ChecksumAlgorithm;\n    UCHAR ChecksumChunkShift;\n    UCHAR ClusterShift;\n    ULONG Flags;\n} FILE_INTEGRITY_STREAM_INFORMATION, *PFILE_INTEGRITY_STREAM_INFORMATION;\n\ntypedef struct _FILE_VOLUME_NAME_INFORMATION\n{\n    ULONG DeviceNameLength;\n    _Field_size_bytes_(DeviceNameLength) WCHAR DeviceName[1];\n} FILE_VOLUME_NAME_INFORMATION, *PFILE_VOLUME_NAME_INFORMATION;\n\n#ifndef FILE_INVALID_FILE_ID\n#define FILE_INVALID_FILE_ID ((LONGLONG)-1LL)\n#endif // FILE_INVALID_FILE_ID\n\n#define FILE_ID_IS_INVALID(FID) ((FID).QuadPart == FILE_INVALID_FILE_ID)\n\n#define FILE_ID_128_IS_INVALID(FID128) \\\n    (((FID128).Identifier[0] == (UCHAR)-1) && \\\n    ((FID128).Identifier[1] == (UCHAR)-1) && \\\n    ((FID128).Identifier[2] == (UCHAR)-1) && \\\n    ((FID128).Identifier[3] == (UCHAR)-1) && \\\n    ((FID128).Identifier[4] == (UCHAR)-1) && \\\n    ((FID128).Identifier[5] == (UCHAR)-1) && \\\n    ((FID128).Identifier[6] == (UCHAR)-1) && \\\n    ((FID128).Identifier[7] == (UCHAR)-1) && \\\n    ((FID128).Identifier[8] == (UCHAR)-1) && \\\n    ((FID128).Identifier[9] == (UCHAR)-1) && \\\n    ((FID128).Identifier[10] == (UCHAR)-1) && \\\n    ((FID128).Identifier[11] == (UCHAR)-1) && \\\n    ((FID128).Identifier[12] == (UCHAR)-1) && \\\n    ((FID128).Identifier[13] == (UCHAR)-1) && \\\n    ((FID128).Identifier[14] == (UCHAR)-1) && \\\n    ((FID128).Identifier[15] == (UCHAR)-1))\n\n#define MAKE_INVALID_FILE_ID_128(FID128) { \\\n    ((FID128).Identifier[0] = (UCHAR)-1); \\\n    ((FID128).Identifier[1] = (UCHAR)-1); \\\n    ((FID128).Identifier[2] = (UCHAR)-1); \\\n    ((FID128).Identifier[3] = (UCHAR)-1); \\\n    ((FID128).Identifier[4] = (UCHAR)-1); \\\n    ((FID128).Identifier[5] = (UCHAR)-1); \\\n    ((FID128).Identifier[6] = (UCHAR)-1); \\\n    ((FID128).Identifier[7] = (UCHAR)-1); \\\n    ((FID128).Identifier[8] = (UCHAR)-1); \\\n    ((FID128).Identifier[9] = (UCHAR)-1); \\\n    ((FID128).Identifier[10] = (UCHAR)-1); \\\n    ((FID128).Identifier[11] = (UCHAR)-1); \\\n    ((FID128).Identifier[12] = (UCHAR)-1); \\\n    ((FID128).Identifier[13] = (UCHAR)-1); \\\n    ((FID128).Identifier[14] = (UCHAR)-1); \\\n    ((FID128).Identifier[15] = (UCHAR)-1); \\\n}\n\n/**\n * The FILE_ID_INFORMATION structure is used to query file identification information.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-file_id_information\n */\ntypedef struct _FILE_ID_INFORMATION\n{\n    ULONGLONG VolumeSerialNumber;\n    union\n    {\n        FILE_ID_128 FileId;\n        struct\n        {\n            LONGLONG FileIdLowPart : 64; // rev\n            LONGLONG FileIdHighPart : 64; // rev\n        };\n    };\n} FILE_ID_INFORMATION, *PFILE_ID_INFORMATION;\n\n/**\n * The FILE_ID_EXTD_DIR_INFORMATION structure is used to query 128-bit file reference number information for the files in a directory.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-file_id_extd_dir_information\n */\ntypedef struct _FILE_ID_EXTD_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    FILE_ID_128 FileId;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_EXTD_DIR_INFORMATION, *PFILE_ID_EXTD_DIR_INFORMATION;\n\n#define FileIdExtdDirectoryInformationDefinition {                  \\\n    FileIdExtdDirectoryInformation,                                 \\\n    FIELD_OFFSET(FILE_ID_EXTD_DIR_INFORMATION, NextEntryOffset),    \\\n    FIELD_OFFSET(FILE_ID_EXTD_DIR_INFORMATION, FileName),           \\\n    FIELD_OFFSET(FILE_ID_EXTD_DIR_INFORMATION, FileNameLength)      \\\n}\n\ntypedef struct _FILE_LINK_ENTRY_FULL_ID_INFORMATION\n{\n    ULONG NextEntryOffset;\n    FILE_ID_128 ParentFileId;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_LINK_ENTRY_FULL_ID_INFORMATION, *PFILE_LINK_ENTRY_FULL_ID_INFORMATION;\n\ntypedef struct _FILE_LINKS_FULL_ID_INFORMATION\n{\n    ULONG BytesNeeded;\n    ULONG EntriesReturned;\n    FILE_LINK_ENTRY_FULL_ID_INFORMATION Entry;\n} FILE_LINKS_FULL_ID_INFORMATION, *PFILE_LINKS_FULL_ID_INFORMATION;\n\ntypedef struct _FILE_ID_EXTD_BOTH_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    FILE_ID_128 FileId;\n    CCHAR ShortNameLength;\n    WCHAR ShortName[12];\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_EXTD_BOTH_DIR_INFORMATION, *PFILE_ID_EXTD_BOTH_DIR_INFORMATION;\n\n#define FileIdExtdBothDirectoryInformationDefinition {                  \\\n    FileIdExtdBothDirectoryInformation,                                 \\\n    FIELD_OFFSET(FILE_ID_EXTD_BOTH_DIR_INFORMATION, NextEntryOffset),   \\\n    FIELD_OFFSET(FILE_ID_EXTD_BOTH_DIR_INFORMATION, FileName),          \\\n    FIELD_OFFSET(FILE_ID_EXTD_BOTH_DIR_INFORMATION, FileNameLength)     \\\n}\n\ntypedef struct _FILE_ID_64_EXTD_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    LARGE_INTEGER FileId;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_64_EXTD_DIR_INFORMATION, *PFILE_ID_64_EXTD_DIR_INFORMATION;\n\n#define FileId64ExtdDirectoryInformationDefinition {                    \\\n    FileId64ExtdDirectoryInformation,                                   \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_DIR_INFORMATION, NextEntryOffset),     \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_DIR_INFORMATION, FileName),            \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_DIR_INFORMATION, FileNameLength)       \\\n}\n\ntypedef struct _FILE_ID_64_EXTD_BOTH_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    LARGE_INTEGER FileId;\n    CCHAR ShortNameLength;\n    WCHAR ShortName[12];\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_64_EXTD_BOTH_DIR_INFORMATION, *PFILE_ID_64_EXTD_BOTH_DIR_INFORMATION;\n\n#define FileId64ExtdBothDirectoryInformationDefinition {                    \\\n    FileId64ExtdBothDirectoryInformation,                                   \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_BOTH_DIR_INFORMATION, NextEntryOffset),    \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_BOTH_DIR_INFORMATION, FileName),           \\\n    FIELD_OFFSET(FILE_ID_64_EXTD_BOTH_DIR_INFORMATION, FileNameLength)      \\\n}\n\ntypedef struct _FILE_ID_ALL_EXTD_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    LARGE_INTEGER FileId;\n    FILE_ID_128 FileId128;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_ALL_EXTD_DIR_INFORMATION, *PFILE_ID_ALL_EXTD_DIR_INFORMATION;\n\n#define FileIdAllExtdDirectoryInformationDefinition {                    \\\n    FileIdAllExtdDirectoryInformation,                                   \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_DIR_INFORMATION, NextEntryOffset),     \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_DIR_INFORMATION, FileName),            \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_DIR_INFORMATION, FileNameLength)       \\\n}\n\ntypedef struct _FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    ULONG ReparsePointTag;\n    LARGE_INTEGER FileId;\n    FILE_ID_128 FileId128;\n    CCHAR ShortNameLength;\n    WCHAR ShortName[12];\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION, *PFILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION;\n\n#define FileIdAllExtdBothDirectoryInformationDefinition {                    \\\n    FileIdAllExtdBothDirectoryInformation,                                   \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION, NextEntryOffset),    \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION, FileName),           \\\n    FIELD_OFFSET(FILE_ID_ALL_EXTD_BOTH_DIR_INFORMATION, FileNameLength)      \\\n}\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\ntypedef struct _FILE_STAT_INFORMATION\n{\n    LARGE_INTEGER FileId;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    ULONG FileAttributes;\n    ULONG ReparseTag;\n    ULONG NumberOfLinks;\n    ACCESS_MASK EffectiveAccess;\n} FILE_STAT_INFORMATION, *PFILE_STAT_INFORMATION;\n\ntypedef struct _FILE_STAT_BASIC_INFORMATION\n{\n    LARGE_INTEGER FileId;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    ULONG FileAttributes;\n    ULONG ReparseTag;\n    ULONG NumberOfLinks;\n    ULONG DeviceType;\n    ULONG DeviceCharacteristics;\n    ULONG Reserved;\n    LARGE_INTEGER VolumeSerialNumber;\n    FILE_ID_128 FileId128;\n} FILE_STAT_BASIC_INFORMATION, *PFILE_STAT_BASIC_INFORMATION;\n#endif // NTDDI_WIN11_GE\n\n/**\n * The FILE_MEMORY_PARTITION_INFORMATION structure is used to query information about a memory partition.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_memory_partition_information\n */\ntypedef struct _FILE_MEMORY_PARTITION_INFORMATION\n{\n    HANDLE OwnerPartitionHandle;\n    union\n    {\n        struct\n        {\n            UCHAR NoCrossPartitionAccess;\n            UCHAR Spare[3];\n        };\n        ULONG AllFlags;\n    } Flags;\n} FILE_MEMORY_PARTITION_INFORMATION, *PFILE_MEMORY_PARTITION_INFORMATION;\n\n// LxFlags\n#define LX_FILE_METADATA_HAS_UID 0x1\n#define LX_FILE_METADATA_HAS_GID 0x2\n#define LX_FILE_METADATA_HAS_MODE 0x4\n#define LX_FILE_METADATA_HAS_DEVICE_ID 0x8\n#define LX_FILE_CASE_SENSITIVE_DIR 0x10\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\ntypedef struct _FILE_STAT_LX_INFORMATION\n{\n    LARGE_INTEGER FileId;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    ULONG FileAttributes;\n    ULONG ReparseTag;\n    ULONG NumberOfLinks;\n    ACCESS_MASK EffectiveAccess;\n    ULONG LxFlags;\n    ULONG LxUid;\n    ULONG LxGid;\n    ULONG LxMode;\n    ULONG LxDeviceIdMajor;\n    ULONG LxDeviceIdMinor;\n} FILE_STAT_LX_INFORMATION, *PFILE_STAT_LX_INFORMATION;\n#endif // NTDDI_WIN11_GE\n\ntypedef struct _FILE_STORAGE_RESERVE_ID_INFORMATION\n{\n    STORAGE_RESERVE_ID StorageReserveId;\n} FILE_STORAGE_RESERVE_ID_INFORMATION, *PFILE_STORAGE_RESERVE_ID_INFORMATION;\n\n#define FILE_CS_FLAG_CASE_SENSITIVE_DIR     0x00000001\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\ntypedef struct _FILE_CASE_SENSITIVE_INFORMATION\n{\n    ULONG Flags;\n} FILE_CASE_SENSITIVE_INFORMATION, *PFILE_CASE_SENSITIVE_INFORMATION;\n#endif // NTDDI_WIN11_GE\n\ntypedef enum _FILE_KNOWN_FOLDER_TYPE\n{\n    KnownFolderNone = 0,\n    KnownFolderDesktop,\n    KnownFolderDocuments,\n    KnownFolderDownloads,\n    KnownFolderMusic,\n    KnownFolderPictures,\n    KnownFolderVideos,\n    KnownFolderOther,\n    KnownFolderMax\n} FILE_KNOWN_FOLDER_TYPE;\n\ntypedef struct _FILE_KNOWN_FOLDER_INFORMATION\n{\n    FILE_KNOWN_FOLDER_TYPE Type;\n} FILE_KNOWN_FOLDER_INFORMATION, *PFILE_KNOWN_FOLDER_INFORMATION;\n\n// private\ntypedef struct _FILE_STREAM_RESERVATION_INFORMATION\n{\n    ULONG_PTR TrackedReservation;\n    ULONG_PTR EnforcedReservation;\n} FILE_STREAM_RESERVATION_INFORMATION, *PFILE_STREAM_RESERVATION_INFORMATION;\n\n// private\ntypedef struct _MUP_PROVIDER_INFORMATION\n{\n    ULONG Level;\n    PVOID Buffer;\n    PULONG BufferSize;\n} MUP_PROVIDER_INFORMATION, *PMUP_PROVIDER_INFORMATION;\n\n//\n// NtQueryDirectoryFile types\n//\n\ntypedef struct _FILE_INFORMATION_DEFINITION\n{\n    FILE_INFORMATION_CLASS Class;\n    ULONG NextEntryOffset;\n    ULONG FileNameOffset;\n    ULONG FileNameLengthOffset;\n} FILE_INFORMATION_DEFINITION, *PFILE_INFORMATION_DEFINITION;\n\ntypedef struct _FILE_DIRECTORY_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;\n\n#define FileDirectoryInformationDefinition {                    \\\n    FileDirectoryInformation,                                   \\\n    FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, NextEntryOffset),  \\\n    FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, FileName),         \\\n    FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, FileNameLength)    \\\n}\n\ntypedef struct _FILE_FULL_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;\n\n#define FileFullDirectoryInformationDefinition {                \\\n    FileFullDirectoryInformation,                               \\\n    FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, NextEntryOffset),   \\\n    FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, FileName),          \\\n    FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, FileNameLength)     \\\n}\n\ntypedef struct _FILE_ID_FULL_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    LARGE_INTEGER FileId;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;\n\n#define FileIdFullDirectoryInformationDefinition {              \\\n    FileIdFullDirectoryInformation,                             \\\n    FIELD_OFFSET(FILE_ID_FULL_DIR_INFORMATION, NextEntryOffset),\\\n    FIELD_OFFSET(FILE_ID_FULL_DIR_INFORMATION, FileName),       \\\n    FIELD_OFFSET(FILE_ID_FULL_DIR_INFORMATION, FileNameLength)  \\\n}\n\ntypedef struct _FILE_BOTH_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    CCHAR ShortNameLength;\n    WCHAR ShortName[12];\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;\n\n#define FileBothDirectoryInformationDefinition {                \\\n    FileBothDirectoryInformation,                               \\\n    FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, NextEntryOffset),   \\\n    FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, FileName),          \\\n    FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, FileNameLength)     \\\n}\n\ntypedef struct _FILE_ID_BOTH_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    ULONG EaSize;\n    CCHAR ShortNameLength;\n    WCHAR ShortName[12];\n    LARGE_INTEGER FileId;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;\n\n#define FileIdBothDirectoryInformationDefinition {              \\\n    FileIdBothDirectoryInformation,                             \\\n    FIELD_OFFSET(FILE_ID_BOTH_DIR_INFORMATION, NextEntryOffset),\\\n    FIELD_OFFSET(FILE_ID_BOTH_DIR_INFORMATION, FileName),       \\\n    FIELD_OFFSET(FILE_ID_BOTH_DIR_INFORMATION, FileNameLength)  \\\n}\n\ntypedef struct _FILE_NAMES_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    ULONG FileNameLength;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;\n\n#define FileNamesInformationDefinition {                    \\\n    FileNamesInformation,                                   \\\n    FIELD_OFFSET(FILE_NAMES_INFORMATION, NextEntryOffset),  \\\n    FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName),         \\\n    FIELD_OFFSET(FILE_NAMES_INFORMATION, FileNameLength)    \\\n}\n\ntypedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG FileIndex;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER LastWriteTime;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER EndOfFile;\n    LARGE_INTEGER AllocationSize;\n    ULONG FileAttributes;\n    ULONG FileNameLength;\n    LARGE_INTEGER FileId;\n    GUID LockingTransactionId;\n    ULONG TxInfoFlags;\n    _Field_size_bytes_(FileNameLength) WCHAR FileName[1];\n} FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;\n\n#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001\n#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002\n#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004\n\n#define FileIdGlobalTxDirectoryInformationDefinition {                  \\\n    FileIdGlobalTxDirectoryInformation,                                 \\\n    FIELD_OFFSET(FILE_ID_GLOBAL_TX_DIR_INFORMATION, NextEntryOffset),   \\\n    FIELD_OFFSET(FILE_ID_GLOBAL_TX_DIR_INFORMATION, FileName),          \\\n    FIELD_OFFSET(FILE_ID_GLOBAL_TX_DIR_INFORMATION, FileNameLength)     \\\n}\n\ntypedef struct _FILE_OBJECTID_INFORMATION\n{\n    ULONGLONG FileReference;\n    UCHAR ObjectId[16]; // GUID\n    union\n    {\n        struct\n        {\n            UCHAR BirthVolumeId[16];\n            UCHAR BirthObjectId[16];\n            UCHAR DomainId[16];\n        };\n        UCHAR ExtendedInfo[48];\n    };\n} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;\n\ntypedef struct _FILE_DIRECTORY_NEXT_INFORMATION\n{\n    ULONG NextEntryOffset;\n} FILE_DIRECTORY_NEXT_INFORMATION, *PFILE_DIRECTORY_NEXT_INFORMATION;\n\n//\n// NtQueryEaFile/NtSetEaFile types\n//\n\ntypedef struct _FILE_FULL_EA_INFORMATION\n{\n    ULONG NextEntryOffset;\n    UCHAR Flags;\n    UCHAR EaNameLength;\n    USHORT EaValueLength;\n    _Field_size_bytes_(EaNameLength) CHAR EaName[1];\n    // ...\n    // UCHAR EaValue[1]\n} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;\n\ntypedef struct _FILE_GET_EA_INFORMATION\n{\n    ULONG NextEntryOffset;\n    UCHAR EaNameLength;\n    _Field_size_bytes_(EaNameLength) CHAR EaName[1];\n} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;\n\n//\n// NtQueryQuotaInformationFile/NtSetQuotaInformationFile types\n//\n\ntypedef struct _FILE_GET_QUOTA_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG SidLength;\n    _Field_size_bytes_(SidLength) SID Sid;\n} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;\n\ntypedef struct _FILE_QUOTA_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG SidLength;\n    LARGE_INTEGER ChangeTime;\n    LARGE_INTEGER QuotaUsed;\n    LARGE_INTEGER QuotaThreshold;\n    LARGE_INTEGER QuotaLimit;\n    _Field_size_bytes_(SidLength) SID Sid;\n} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;\n\ntypedef enum _FSINFOCLASS\n{\n    FileFsVolumeInformation = 1, // q: FILE_FS_VOLUME_INFORMATION\n    FileFsLabelInformation, // s: FILE_FS_LABEL_INFORMATION (requires FILE_WRITE_DATA to volume)\n    FileFsSizeInformation, // q: FILE_FS_SIZE_INFORMATION\n    FileFsDeviceInformation, // q: FILE_FS_DEVICE_INFORMATION\n    FileFsAttributeInformation, // q: FILE_FS_ATTRIBUTE_INFORMATION\n    FileFsControlInformation, // q, s: FILE_FS_CONTROL_INFORMATION  (q: requires FILE_READ_DATA; s: requires FILE_WRITE_DATA to volume)\n    FileFsFullSizeInformation, // q: FILE_FS_FULL_SIZE_INFORMATION\n    FileFsObjectIdInformation, // q; s: FILE_FS_OBJECTID_INFORMATION (s: requires FILE_WRITE_DATA to volume)\n    FileFsDriverPathInformation, // q: FILE_FS_DRIVER_PATH_INFORMATION\n    FileFsVolumeFlagsInformation, // q; s: FILE_FS_VOLUME_FLAGS_INFORMATION (q: requires FILE_READ_ATTRIBUTES; s: requires FILE_WRITE_ATTRIBUTES to volume) // 10\n    FileFsSectorSizeInformation, // q: FILE_FS_SECTOR_SIZE_INFORMATION // since WIN8\n    FileFsDataCopyInformation, // q: FILE_FS_DATA_COPY_INFORMATION\n    FileFsMetadataSizeInformation, // q: FILE_FS_METADATA_SIZE_INFORMATION // since THRESHOLD\n    FileFsFullSizeInformationEx, // q: FILE_FS_FULL_SIZE_INFORMATION_EX // since REDSTONE5\n    FileFsGuidInformation, // q: FILE_FS_GUID_INFORMATION // since 23H2\n    FileFsMaximumInformation\n} FSINFOCLASS, *PFSINFOCLASS;\ntypedef enum _FSINFOCLASS FS_INFORMATION_CLASS;\n\n//\n// NtQueryVolumeInformation/NtSetVolumeInformation types\n//\n\ntypedef struct _FILE_FS_VOLUME_INFORMATION\n{\n    LARGE_INTEGER VolumeCreationTime;\n    ULONG VolumeSerialNumber;\n    ULONG VolumeLabelLength;\n    BOOLEAN SupportsObjects;\n    _Field_size_bytes_(VolumeLabelLength) WCHAR VolumeLabel[1];\n} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;\n\ntypedef struct _FILE_FS_LABEL_INFORMATION\n{\n    ULONG VolumeLabelLength;\n    _Field_size_bytes_(VolumeLabelLength) WCHAR VolumeLabel[1];\n} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;\n\ntypedef struct _FILE_FS_SIZE_INFORMATION\n{\n    LARGE_INTEGER TotalAllocationUnits;\n    LARGE_INTEGER AvailableAllocationUnits;\n    ULONG SectorsPerAllocationUnit;\n    ULONG BytesPerSector;\n} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;\n\n// FileSystemControlFlags\n#define FILE_VC_QUOTA_NONE 0x00000000\n#define FILE_VC_QUOTA_TRACK 0x00000001\n#define FILE_VC_QUOTA_ENFORCE 0x00000002\n#define FILE_VC_QUOTA_MASK 0x00000003\n#define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008\n#define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010\n#define FILE_VC_LOG_QUOTA_LIMIT 0x00000020\n#define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040\n#define FILE_VC_LOG_VOLUME_LIMIT 0x00000080\n#define FILE_VC_QUOTAS_INCOMPLETE 0x00000100\n#define FILE_VC_QUOTAS_REBUILDING 0x00000200\n#define FILE_VC_VALID_MASK 0x000003ff\n\ntypedef struct _FILE_FS_CONTROL_INFORMATION\n{\n    LARGE_INTEGER FreeSpaceStartFiltering;\n    LARGE_INTEGER FreeSpaceThreshold;\n    LARGE_INTEGER FreeSpaceStopFiltering;\n    LARGE_INTEGER DefaultQuotaThreshold;\n    LARGE_INTEGER DefaultQuotaLimit;\n    ULONG FileSystemControlFlags; // FILE_VC_*\n} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;\n\ntypedef struct _FILE_FS_FULL_SIZE_INFORMATION\n{\n    LARGE_INTEGER TotalAllocationUnits;\n    LARGE_INTEGER CallerAvailableAllocationUnits;\n    LARGE_INTEGER ActualAvailableAllocationUnits;\n    ULONG SectorsPerAllocationUnit;\n    ULONG BytesPerSector;\n} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;\n\ntypedef struct _FILE_FS_OBJECTID_INFORMATION\n{\n    UCHAR ObjectId[16];\n    union\n    {\n        struct\n        {\n            UCHAR BirthVolumeId[16];\n            UCHAR BirthObjectId[16];\n            UCHAR DomainId[16];\n        };\n        UCHAR ExtendedInfo[48];\n    };\n} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;\n\ntypedef struct _FILE_FS_DEVICE_INFORMATION\n{\n    DEVICE_TYPE DeviceType;\n    ULONG Characteristics;\n} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;\n\ntypedef struct _FILE_FS_ATTRIBUTE_INFORMATION\n{\n    ULONG FileSystemAttributes;\n    LONG MaximumComponentNameLength;\n    ULONG FileSystemNameLength;\n    _Field_size_bytes_(FileSystemNameLength) WCHAR FileSystemName[1];\n} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;\n\ntypedef struct _FILE_FS_DRIVER_PATH_INFORMATION\n{\n    BOOLEAN DriverInPath;\n    ULONG DriverNameLength;\n    _Field_size_bytes_(DriverNameLength) WCHAR DriverName[1];\n} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;\n\ntypedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION\n{\n    ULONG Flags;\n} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;\n\n#define SSINFO_FLAGS_ALIGNED_DEVICE 0x00000001\n#define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE 0x00000002\n#define SSINFO_FLAGS_NO_SEEK_PENALTY 0x00000004\n#define SSINFO_FLAGS_TRIM_ENABLED 0x00000008\n#define SSINFO_FLAGS_BYTE_ADDRESSABLE 0x00000010 // since REDSTONE\n\n// If set for Sector and Partition fields, alignment is not known.\n#define SSINFO_OFFSET_UNKNOWN 0xffffffff\n\ntypedef struct _FILE_FS_SECTOR_SIZE_INFORMATION\n{\n    ULONG LogicalBytesPerSector;\n    ULONG PhysicalBytesPerSectorForAtomicity;\n    ULONG PhysicalBytesPerSectorForPerformance;\n    ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity;\n    ULONG Flags; // SSINFO_FLAGS_*\n    ULONG ByteOffsetForSectorAlignment;\n    ULONG ByteOffsetForPartitionAlignment;\n} FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION;\n\ntypedef struct _FILE_FS_DATA_COPY_INFORMATION\n{\n    ULONG NumberOfCopies;\n} FILE_FS_DATA_COPY_INFORMATION, *PFILE_FS_DATA_COPY_INFORMATION;\n\ntypedef struct _FILE_FS_METADATA_SIZE_INFORMATION\n{\n    LARGE_INTEGER TotalMetadataAllocationUnits;\n    ULONG SectorsPerAllocationUnit;\n    ULONG BytesPerSector;\n} FILE_FS_METADATA_SIZE_INFORMATION, *PFILE_FS_METADATA_SIZE_INFORMATION;\n\ntypedef struct _FILE_FS_FULL_SIZE_INFORMATION_EX\n{\n    ULONGLONG ActualTotalAllocationUnits;\n    ULONGLONG ActualAvailableAllocationUnits;\n    ULONGLONG ActualPoolUnavailableAllocationUnits;\n    ULONGLONG CallerTotalAllocationUnits;\n    ULONGLONG CallerAvailableAllocationUnits;\n    ULONGLONG CallerPoolUnavailableAllocationUnits;\n    ULONGLONG UsedAllocationUnits;\n    ULONGLONG TotalReservedAllocationUnits;\n    ULONGLONG VolumeStorageReserveAllocationUnits;\n    ULONGLONG AvailableCommittedAllocationUnits;\n    ULONGLONG PoolAvailableAllocationUnits;\n    ULONG SectorsPerAllocationUnit;\n    ULONG BytesPerSector;\n} FILE_FS_FULL_SIZE_INFORMATION_EX, *PFILE_FS_FULL_SIZE_INFORMATION_EX;\n\ntypedef struct _FILE_FS_GUID_INFORMATION\n{\n    GUID FsGuid;\n} FILE_FS_GUID_INFORMATION, *PFILE_FS_GUID_INFORMATION;\n\n//\n// System calls\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_opt_ PLARGE_INTEGER AllocationSize,\n    _In_ ULONG FileAttributes,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG CreateDisposition,\n    _In_ ULONG CreateOptions,\n    _In_reads_bytes_opt_(EaLength) PVOID EaBuffer,\n    _In_ ULONG EaLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateNamedPipeFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG CreateDisposition,\n    _In_ ULONG CreateOptions,\n    _In_ ULONG NamedPipeType,\n    _In_ ULONG ReadMode,\n    _In_ ULONG CompletionMode,\n    _In_ ULONG MaximumInstances,\n    _In_ ULONG InboundQuota,\n    _In_ ULONG OutboundQuota,\n    _In_ PLARGE_INTEGER DefaultTimeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateMailslotFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CreateOptions,\n    _In_ ULONG MailslotQuota,\n    _In_ ULONG MaximumMessageSize,\n    _In_ PLARGE_INTEGER ReadTimeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG OpenOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteFile(\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushBuffersFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\n//  Flag definitions for NtFlushBuffersFileEx\n//\n//  If none of the below flags are specified the following will occur for a\n//  given file handle:\n//      - Write any modified data for the given file from the Windows in-memory\n//        cache.\n//      - Commit all pending metadata changes for the given file from the\n//        Windows in-memory cache.\n//      - Send a SYNC command to the underlying storage device to commit all\n//        written data in the devices cache to persistent storage.\n//\n//  If a volume handle is specified:\n//      - Write all modified data for all files on the volume from the Windows\n//        in-memory cache.\n//      - Commit all pending metadata changes for all files on the volume from\n//        the Windows in-memory cache.\n//      - Send a SYNC command to the underlying storage device to commit all\n//        written data in the devices cache to persistent storage.\n//\n//  This is equivalent to how NtFlushBuffersFile has always worked.\n//\n\n//  If set, this operation will write the data for the given file from the\n//  Windows in-memory cache.  This will NOT commit any associated metadata\n//  changes.  This will NOT send a SYNC to the storage device to flush its\n//  cache.  Not supported on volume handles.\n//\n#define FLUSH_FLAGS_FILE_DATA_ONLY 0x00000001\n//\n//  If set, this operation will commit both the data and metadata changes for\n//  the given file from the Windows in-memory cache.  This will NOT send a SYNC\n//  to the storage device to flush its cache.  Not supported on volume handles.\n//\n#define FLUSH_FLAGS_NO_SYNC 0x00000002\n//\n//  If set, this operation will write the data for the given file from the\n//  Windows in-memory cache.  It will also try to skip updating the timestamp\n//  as much as possible.  This will send a SYNC to the storage device to flush its\n//  cache.  Not supported on volume or directory handles.\n//\n#define FLUSH_FLAGS_FILE_DATA_SYNC_ONLY 0x00000004 // REDSTONE1\n//\n//  If set, this operation will write the data for the given file from the\n//  Windows in-memory cache.  It will also try to skip updating the timestamp\n//  as much as possible.  This will send a SYNC to the storage device to flush its\n//  cache.  Not supported on volume or directory handles.\n//\n#define FLUSH_FLAGS_FLUSH_AND_PURGE 0x00000008 // 24H2\n\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushBuffersFileEx(\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Flags,\n    _In_reads_bytes_(ParametersSize) PVOID Parameters,\n    _In_ ULONG ParametersSize,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationByName(\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS2\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDirectoryFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_opt_ PCUNICODE_STRING FileName,\n    _In_ BOOLEAN RestartScan\n    );\n\n// QueryFlags values for NtQueryDirectoryFileEx\n#define FILE_QUERY_RESTART_SCAN 0x00000001\n#define FILE_QUERY_RETURN_SINGLE_ENTRY 0x00000002\n#define FILE_QUERY_INDEX_SPECIFIED 0x00000004\n#define FILE_QUERY_RETURN_ON_DISK_ENTRIES_ONLY 0x00000008\n#define FILE_QUERY_NO_CURSOR_UPDATE 0x00000010 // RS5\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDirectoryFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass,\n    _In_ ULONG QueryFlags,\n    _In_opt_ PCUNICODE_STRING FileName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryEaFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_reads_bytes_opt_(EaListLength) PVOID EaList,\n    _In_ ULONG EaListLength,\n    _In_opt_ PULONG EaIndex,\n    _In_ BOOLEAN RestartScan\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetEaFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryQuotaInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_reads_bytes_opt_(SidListLength) PVOID SidList,\n    _In_ ULONG SidListLength,\n    _In_opt_ PSID StartSid,\n    _In_ BOOLEAN RestartScan\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetQuotaInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryVolumeInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FsInformation,\n    _In_ ULONG Length,\n    _In_ FSINFOCLASS FsInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetVolumeInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID FsInformation,\n    _In_ ULONG Length,\n    _In_ FSINFOCLASS FsInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelIoFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelIoFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ PIO_STATUS_BLOCK IoRequestToCancel,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelSynchronousIoFile(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ PIO_STATUS_BLOCK IoRequestToCancel,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n/**\n * The NtDeviceIoControlFile function sends a control code directly to a specified device driver, causing the corresponding driver to perform the specified operation.\n *\n * @param FileHandle A handle to the file object representing the file or directory on which the specified action is to be performed.\n * @param Event A handle for a caller-created event. This parameter is optional and can be NULL. It must be NULL if the caller will wait for the FileHandle to be set to the Signaled state.\n * @param ApcRoutine Address of a caller-supplied APC routine to be called when the requested operation completes. This parameter is optional and can be NULL.\n * @param ApcContext Pointer to a caller-determined context area. This parameter value is used as the APC context if the caller supplies an APC, or is used as the completion context if an I/O completion object has been associated with the file object.\n * @param IoStatusBlock Pointer to an IO_STATUS_BLOCK structure that receives the final completion status and information about the operation.\n * @param IoControlCode IOCTL_XXX code that indicates which device I/O control operation is to be carried out on, usually by the underlying device driver.\n * @param InputBuffer Pointer to a caller-allocated input buffer that contains device-specific information to be given to the target driver.\n * @param InputBufferLength Size, in bytes, of the buffer at InputBuffer. This value is ignored if InputBuffer is NULL.\n * @param OutputBuffer Pointer to a caller-allocated output buffer in which information is returned from the target driver.\n * @param OutputBufferLength Size, in bytes, of the buffer at OutputBuffer. This value is ignored if OutputBuffer is NULL.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwdeviceiocontrolfile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeviceIoControlFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG IoControlCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n\n/**\n * The NtFsControlFile function sends a control code directly to a file system or filter driver, causing the corresponding driver to perform the specified action.\n *\n * @param FileHandle A handle to the file object representing the file or directory on which the specified action is to be performed.\n * @param Event A handle for a caller-created event. This parameter is optional and can be NULL. It must be NULL if the caller will wait for the FileHandle to be set to the Signaled state.\n * @param ApcRoutine Address of a caller-supplied APC routine to be called when the requested operation completes. This parameter is optional and can be NULL.\n * @param ApcContext Pointer to a caller-determined context area. This parameter value is used as the APC context if the caller supplies an APC, or is used as the completion context if an I/O completion object has been associated with the file object. \n * @param IoStatusBlock Pointer to an IO_STATUS_BLOCK structure that receives the final completion status and information about the operation.\n * @param FsControlCode FSCTL_XXX code that indicates which file system control operation is to be carried out.\n * @param InputBuffer Pointer to a caller-allocated input buffer that contains device-specific information to be given to the target driver.\n * @param InputBufferLength Size, in bytes, of the buffer at InputBuffer. This value is ignored if InputBuffer is NULL.\n * @param OutputBuffer Pointer to a caller-allocated output buffer in which information is returned from the target driver.\n * @param OutputBufferLength Size, in bytes, of the buffer at OutputBuffer. This value is ignored if OutputBuffer is NULL.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwfscontrolfile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFsControlFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG FsControlCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n\n/**\n * The NtReadFile function reads data from an open file.\n *\n * @param FileHandle A handle to the file object representing the file or directory on which the specified action is to be performed.\n * @param Event A handle for a caller-created event. This parameter is optional and can be NULL. It must be NULL if the caller will wait for the FileHandle to be set to the Signaled state.\n * @param ApcRoutine Address of a caller-supplied APC routine to be called when the requested operation completes. This parameter is optional and can be NULL.\n * @param ApcContext Pointer to a caller-determined context area. This parameter value is used as the APC context if the caller supplies an APC, or is used as the completion context if an I/O completion object has been associated with the file object.\n * @param IoStatusBlock Pointer to an IO_STATUS_BLOCK structure that receives the final completion status and information about the operation.\n * @param Buffer Pointer to a caller-allocated buffer that receives the data read from the file.\n * @param Length The size, in bytes, of the buffer pointed to by Buffer.\n * @param ByteOffset Pointer to a variable that specifies the starting byte offset in the file where the read operation will begin.\n * @param Key Device and intermediate drivers should set this pointer to NULL.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwreadfile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\n/**\n * The NtWriteFile function writes data to an open file.\n *\n * @param FileHandle A handle to the file object representing the file or directory on which the specified action is to be performed.\n * @param Event A handle for a caller-created event. This parameter is optional and can be NULL. It must be NULL if the caller will wait for the FileHandle to be set to the Signaled state.\n * @param ApcRoutine Address of a caller-supplied APC routine to be called when the requested operation completes. This parameter is optional and can be NULL.\n * @param ApcContext Pointer to a caller-determined context area. This parameter value is used as the APC context if the caller supplies an APC, or is used as the completion context if an I/O completion object has been associated with the file object.\n * @param IoStatusBlock Pointer to an IO_STATUS_BLOCK structure that receives the final completion status and information about the operation.\n * @param Buffer Pointer to a caller-allocated buffer that contains the data to write to the file.\n * @param Length The size, in bytes, of the buffer pointed to by Buffer.\n * @param ByteOffset Pointer to a variable that specifies the starting byte offset in the file for beginning the write operation.\n * @param Key Device and intermediate drivers should set this pointer to NULL.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwwritefile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWriteFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadFileScatter(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PFILE_SEGMENT_ELEMENT SegmentArray,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWriteFileGather(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PFILE_SEGMENT_ELEMENT SegmentArray,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLockFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PLARGE_INTEGER ByteOffset,\n    _In_ PLARGE_INTEGER Length,\n    _In_ ULONG Key,\n    _In_ BOOLEAN FailImmediately,\n    _In_ BOOLEAN ExclusiveLock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnlockFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PLARGE_INTEGER ByteOffset,\n    _In_ PLARGE_INTEGER Length,\n    _In_ ULONG Key\n    );\n\n/**\n * The NtQueryAttributesFile function retrieves basic attributes for the specified file.\n *\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that supplies the attributes to be used for the file object.\n * @param FileInformation A pointer to a FILE_BASIC_INFORMATION structure to receive the returned file attribute information.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/devnotes/ntqueryattributesfile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryAttributesFile(\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PFILE_BASIC_INFORMATION FileInformation\n    );\n\n/**\n * The NtQueryFullAttributesFile function retrieves network open information for the specified file.\n *\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that supplies the attributes to be used for the file object.\n * @param FileInformation A pointer to a FILE_NETWORK_OPEN_INFORMATION structure that receives the returned file attributes information.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwqueryfullattributesfile\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryFullAttributesFile(\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation\n    );\n\n// NtNotifyChangeDirectoryFile information\n\n#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001   // winnt\n#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002   // winnt\n#define FILE_NOTIFY_CHANGE_NAME         0x00000003\n#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004   // winnt\n#define FILE_NOTIFY_CHANGE_SIZE         0x00000008   // winnt\n#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010   // winnt\n#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020   // winnt\n#define FILE_NOTIFY_CHANGE_CREATION     0x00000040   // winnt\n#define FILE_NOTIFY_CHANGE_EA           0x00000080\n#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100   // winnt\n#define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200\n#define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400\n#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800\n#define FILE_NOTIFY_VALID_MASK          0x00000fff\n\n#define FILE_ACTION_ADDED                   0x00000001   // winnt\n#define FILE_ACTION_REMOVED                 0x00000002   // winnt\n#define FILE_ACTION_MODIFIED                0x00000003   // winnt\n#define FILE_ACTION_RENAMED_OLD_NAME        0x00000004   // winnt\n#define FILE_ACTION_RENAMED_NEW_NAME        0x00000005   // winnt\n#define FILE_ACTION_ADDED_STREAM            0x00000006\n#define FILE_ACTION_REMOVED_STREAM          0x00000007\n#define FILE_ACTION_MODIFIED_STREAM         0x00000008\n#define FILE_ACTION_REMOVED_BY_DELETE       0x00000009\n#define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A\n#define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtNotifyChangeDirectoryFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer, // FILE_NOTIFY_INFORMATION\n    _In_ ULONG Length,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree\n    );\n\n// private\ntypedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS\n{\n    DirectoryNotifyInformation = 1, // FILE_NOTIFY_INFORMATION\n    DirectoryNotifyExtendedInformation, // FILE_NOTIFY_EXTENDED_INFORMATION\n    DirectoryNotifyFullInformation, // FILE_NOTIFY_FULL_INFORMATION // since 22H2\n    DirectoryNotifyMaximumInformation\n} DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;\n\n#if !defined(NTDDI_WIN10_RS5) || (NTDDI_VERSION < NTDDI_WIN10_RS5)\ntypedef struct _FILE_NOTIFY_INFORMATION\n{\n   ULONG NextEntryOffset;\n   ULONG Action;\n   ULONG FileNameLength;\n   WCHAR FileName[1];\n} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;\n\ntypedef struct _FILE_NOTIFY_EXTENDED_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG Action;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastModificationTime;\n    LARGE_INTEGER LastChangeTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER AllocatedLength;\n    LARGE_INTEGER FileSize;\n    ULONG FileAttributes;\n    union\n    {\n        ULONG ReparsePointTag;\n        ULONG EaSize;\n    };\n    LARGE_INTEGER FileId;\n    LARGE_INTEGER ParentFileId;\n    ULONG FileNameLength;\n    WCHAR FileName[1];\n} FILE_NOTIFY_EXTENDED_INFORMATION, *PFILE_NOTIFY_EXTENDED_INFORMATION;\n#endif // NTDDI_WIN10_RS5\n\n#define FILE_NAME_FLAG_HARDLINK      0    // not part of a name pair\n#define FILE_NAME_FLAG_NTFS          0x01 // NTFS name in a name pair\n#define FILE_NAME_FLAG_DOS           0x02 // DOS name in a name pair\n#define FILE_NAME_FLAG_BOTH          0x03 // NTFS+DOS combined name\n#define FILE_NAME_FLAGS_UNSPECIFIED  0x80 // not specified by file system (do not combine with other flags)\n\n#if !defined(NTDDI_WIN10_NI) || (NTDDI_VERSION < NTDDI_WIN10_NI)\ntypedef struct _FILE_NOTIFY_FULL_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG Action;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER LastModificationTime;\n    LARGE_INTEGER LastChangeTime;\n    LARGE_INTEGER LastAccessTime;\n    LARGE_INTEGER AllocatedLength;\n    LARGE_INTEGER FileSize;\n    ULONG FileAttributes;\n    union\n    {\n        ULONG ReparsePointTag;\n        ULONG EaSize;\n    };\n    LARGE_INTEGER FileId;\n    LARGE_INTEGER ParentFileId;\n    USHORT FileNameLength;\n    BYTE FileNameFlags;\n    BYTE Reserved;\n    WCHAR FileName[1];\n} FILE_NOTIFY_FULL_INFORMATION, *PFILE_NOTIFY_FULL_INFORMATION;\n#endif // NTDDI_WIN10_NI\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtNotifyChangeDirectoryFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _In_opt_ DIRECTORY_NOTIFY_INFORMATION_CLASS DirectoryNotifyInformationClass\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n/**\n * The NtLoadDriver function loads a driver specified by the DriverServiceName parameter.\n * \n * @param DriverServiceName A pointer to a UNICODE_STRING structure that specifies the name of the driver service to load.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadDriver(\n    _In_ PCUNICODE_STRING DriverServiceName\n    );\n\n/**\n * The NtUnloadDriver function unloads a driver specified by the DriverServiceName parameter.\n * \n * @param DriverServiceName A pointer to a UNICODE_STRING structure that specifies the name of the driver service to unload.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnloadDriver(\n    _In_ PCUNICODE_STRING DriverServiceName\n    );\n\n//\n// I/O completion port\n//\n\n#ifndef IO_COMPLETION_QUERY_STATE\n#define IO_COMPLETION_QUERY_STATE 0x0001\n#endif\n\n#ifndef IO_COMPLETION_MODIFY_STATE\n#define IO_COMPLETION_MODIFY_STATE 0x0002\n#endif\n\n#ifndef IO_COMPLETION_ALL_ACCESS\n#define IO_COMPLETION_ALL_ACCESS (IO_COMPLETION_QUERY_STATE|IO_COMPLETION_MODIFY_STATE|STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE)\n#endif\n\ntypedef enum _IO_COMPLETION_INFORMATION_CLASS\n{\n    IoCompletionBasicInformation\n} IO_COMPLETION_INFORMATION_CLASS;\n\ntypedef struct _IO_COMPLETION_BASIC_INFORMATION\n{\n    LONG Depth;\n} IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateIoCompletion(\n    _Out_ PHANDLE IoCompletionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG NumberOfConcurrentThreads\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenIoCompletion(\n    _Out_ PHANDLE IoCompletionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _In_ IO_COMPLETION_INFORMATION_CLASS IoCompletionInformationClass,\n    _Out_writes_bytes_(IoCompletionInformationLength) PVOID IoCompletionInformation,\n    _In_ ULONG IoCompletionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetIoCompletionEx(\n    _In_ HANDLE IoCompletionHandle,\n    _In_ HANDLE IoCompletionPacketHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation\n    );\n#endif\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRemoveIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _Out_ PVOID *KeyContext,\n    _Out_ PVOID *ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\ntypedef struct _FILE_IO_COMPLETION_INFORMATION\n{\n    PVOID KeyContext;\n    PVOID ApcContext;\n    IO_STATUS_BLOCK IoStatusBlock;\n} FILE_IO_COMPLETION_INFORMATION, *PFILE_IO_COMPLETION_INFORMATION;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRemoveIoCompletionEx(\n    _In_ HANDLE IoCompletionHandle,\n    _Out_writes_to_(Count, *NumEntriesRemoved) PFILE_IO_COMPLETION_INFORMATION IoCompletionInformation,\n    _In_ ULONG Count,\n    _Out_ PULONG NumEntriesRemoved,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_ BOOLEAN Alertable\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n//\n// Wait completion packet\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateWaitCompletionPacket(\n    _Out_ PHANDLE WaitCompletionPacketHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAssociateWaitCompletionPacket(\n    _In_ HANDLE WaitCompletionPacketHandle,\n    _In_ HANDLE IoCompletionHandle,\n    _In_ HANDLE TargetObjectHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation,\n    _Out_opt_ PBOOLEAN AlreadySignaled\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCancelWaitCompletionPacket(\n    _In_ HANDLE WaitCompletionPacketHandle,\n    _In_ BOOLEAN RemoveSignaledPacket\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCopyFileChunk(\n    _In_ HANDLE SourceHandle,\n    _In_ HANDLE DestinationHandle,\n    _In_opt_ HANDLE EventHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG Length,\n    _In_ PLARGE_INTEGER SourceOffset,\n    _In_ PLARGE_INTEGER DestOffset,\n    _In_opt_ PULONG SourceKey,\n    _In_opt_ PULONG DestKey,\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_11)\n\n//\n// I/O Ring\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateIoRing(\n    _Out_ PHANDLE IoRingHandle,\n    _In_ ULONG CreateParametersLength,\n    _In_ PVOID CreateParameters,\n    _In_ ULONG OutputParametersLength,\n    _Out_ PVOID OutputParameters\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSubmitIoRing(\n    _In_ HANDLE IoRingHandle,\n    _In_ ULONG Flags,\n    _In_opt_ ULONG WaitOperations,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryIoRingCapabilities(\n    _In_ SIZE_T IoRingCapabilitiesLength,\n    _Out_ PVOID IoRingCapabilities\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationIoRing(\n    _In_ HANDLE IoRingHandle,\n    _In_ ULONG IoRingInformationClass,\n    _In_ ULONG IoRingInformationLength,\n    _In_ PVOID IoRingInformation\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_11)\n\n//\n// Other types\n//\n\ntypedef enum _INTERFACE_TYPE\n{\n    InterfaceTypeUndefined = -1,\n    Internal = 0,\n    Isa = 1,\n    Eisa = 2,\n    MicroChannel = 3,\n    TurboChannel = 4,\n    PCIBus = 5,\n    VMEBus = 6,\n    NuBus = 7,\n    PCMCIABus = 8,\n    CBus = 9,\n    MPIBus = 10,\n    MPSABus = 11,\n    ProcessorInternal = 12,\n    InternalPowerBus = 13,\n    PNPISABus = 14,\n    PNPBus = 15,\n    Vmcs = 16,\n    ACPIBus = 17,\n    MaximumInterfaceType\n} INTERFACE_TYPE, *PINTERFACE_TYPE;\n\ntypedef enum _DMA_WIDTH\n{\n    Width8Bits,\n    Width16Bits,\n    Width32Bits,\n    Width64Bits,\n    WidthNoWrap,\n    MaximumDmaWidth\n} DMA_WIDTH, *PDMA_WIDTH;\n\ntypedef enum _DMA_SPEED\n{\n    Compatible,\n    TypeA,\n    TypeB,\n    TypeC,\n    TypeF,\n    MaximumDmaSpeed\n} DMA_SPEED, *PDMA_SPEED;\n\ntypedef enum _BUS_DATA_TYPE\n{\n    ConfigurationSpaceUndefined = -1,\n    Cmos,\n    EisaConfiguration,\n    Pos,\n    CbusConfiguration,\n    PCIConfiguration,\n    VMEConfiguration,\n    NuBusConfiguration,\n    PCMCIAConfiguration,\n    MPIConfiguration,\n    MPSAConfiguration,\n    PNPISAConfiguration,\n    SgiInternalConfiguration,\n    MaximumBusDataType\n} BUS_DATA_TYPE, *PBUS_DATA_TYPE;\n\n// Control structures\n\n// Reparse structure for FSCTL_SET_REPARSE_POINT, FSCTL_GET_REPARSE_POINT, FSCTL_DELETE_REPARSE_POINT\n\n#define SYMLINK_FLAG_RELATIVE 0x00000001\n#define SYMLINK_DIRECTORY 0x80000000 // If set then this is a directory symlink\n#define SYMLINK_FILE 0x40000000 // If set then this is a file symlink\n\ntypedef struct _REPARSE_DATA_BUFFER\n{\n    ULONG ReparseTag;\n    USHORT ReparseDataLength;\n    USHORT Reserved;\n\n    _Field_size_bytes_(ReparseDataLength)\n    union\n    {\n        struct\n        {\n            USHORT SubstituteNameOffset;\n            USHORT SubstituteNameLength;\n            USHORT PrintNameOffset;\n            USHORT PrintNameLength;\n            ULONG Flags;\n            WCHAR PathBuffer[1];\n        } SymbolicLinkReparseBuffer;\n        struct\n        {\n            USHORT SubstituteNameOffset;\n            USHORT SubstituteNameLength;\n            USHORT PrintNameOffset;\n            USHORT PrintNameLength;\n            WCHAR PathBuffer[1];\n        } MountPointReparseBuffer;\n        struct\n        {\n            ULONG StringCount;\n            WCHAR StringList[1];\n        } AppExecLinkReparseBuffer;\n        struct\n        {\n            UCHAR DataBuffer[1];\n        } GenericReparseBuffer;\n    };\n} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;\n\n#define REPARSE_DATA_BUFFER_HEADER_SIZE UFIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)\n\n// Reparse structure for FSCTL_SET_REPARSE_POINT_EX\n\ntypedef struct _REPARSE_DATA_BUFFER_EX\n{\n    ULONG Flags;\n\n    //\n    //  This is the existing reparse tag on the file if any,  if the\n    //  caller wants to replace the reparse tag too.\n    //\n    //    - To set the reparse data  along with the reparse tag that\n    //      could be different,  pass the current reparse tag of the\n    //      file.\n    //\n    //    - To update the reparse data while having the same reparse\n    //      tag,  the caller should give the existing reparse tag in\n    //      this ExistingReparseTag field.\n    //\n    //    - To set the reparse tag along with reparse data on a file\n    //      that doesn't have a reparse tag yet, set this to zero.\n    //\n    //  If the ExistingReparseTag  does not match the reparse tag on\n    //  the file,  the FSCTL_SET_REPARSE_POINT_EX  would  fail  with\n    //  STATUS_IO_REPARSE_TAG_MISMATCH. NOTE: If a file doesn't have\n    //  a reparse tag, ExistingReparseTag should be 0.\n    //\n\n    ULONG ExistingReparseTag;\n\n    //  For non-Microsoft reparse tags, this is the existing reparse\n    //  guid on the file if any,  if the caller wants to replace the\n    //  reparse tag and / or guid along with the data.\n    //\n    //  If ExistingReparseTag is 0, the file is not expected to have\n    //  any reparse tags, so ExistingReparseGuid is ignored. And for\n    //  non-Microsoft tags ExistingReparseGuid should match the guid\n    //  in the file if ExistingReparseTag is non zero.\n\n    GUID ExistingReparseGuid;\n\n    //\n    //  Reserved\n    //\n    ULONGLONG Reserved;\n\n    //\n    //  Reparse data to set\n    //\n    union\n    {\n        REPARSE_DATA_BUFFER ReparseDataBuffer;\n        REPARSE_GUID_DATA_BUFFER ReparseGuidDataBuffer;\n    };\n} REPARSE_DATA_BUFFER_EX, *PREPARSE_DATA_BUFFER_EX;\n\n//  REPARSE_DATA_BUFFER_EX Flags\n//\n//  REPARSE_DATA_EX_FLAG_GIVEN_TAG_OR_NONE - Forces the FSCTL to set the\n//  reparse tag if the file has no tag or the tag on the file is same as\n//  the one in  ExistingReparseTag.   NOTE: If the ExistingReparseTag is\n//  not a Microsoft tag then the ExistingReparseGuid should match if the\n//  file has the ExistingReparseTag.\n//\n#define REPARSE_DATA_EX_FLAG_GIVEN_TAG_OR_NONE              (0x00000001)\n\n#define REPARSE_GUID_DATA_BUFFER_EX_HEADER_SIZE \\\n    UFIELD_OFFSET(REPARSE_DATA_BUFFER_EX, ReparseGuidDataBuffer.GenericReparseBuffer)\n\n#define REPARSE_DATA_BUFFER_EX_HEADER_SIZE \\\n    UFIELD_OFFSET(REPARSE_DATA_BUFFER_EX, ReparseDataBuffer.GenericReparseBuffer)\n//\n// Named pipe FS control definitions\n//\n\n#define DEVICE_NAMED_PIPE L\"\\\\Device\\\\NamedPipe\\\\\"\n\n#define FSCTL_PIPE_ASSIGN_EVENT             CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_DISCONNECT               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_LISTEN                   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_PEEK                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)\n#define FSCTL_PIPE_QUERY_EVENT              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_TRANSCEIVE               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)\n#define FSCTL_PIPE_WAIT                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_IMPERSONATE              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_SET_CLIENT_PROCESS       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_QUERY_CLIENT_PROCESS     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define FSCTL_PIPE_FLUSH                    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)\n#define FSCTL_PIPE_DISABLE_IMPERSONATE      CTL_CODE(FILE_DEVICE_NAMED_PIPE, 17, METHOD_BUFFERED, FILE_ANY_ACCESS) // since REDSTONE\n#define FSCTL_PIPE_SILO_ARRIVAL             CTL_CODE(FILE_DEVICE_NAMED_PIPE, 18, METHOD_BUFFERED, FILE_WRITE_DATA) // since REDSTONE3\n#define FSCTL_PIPE_CREATE_SYMLINK           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 19, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // requires SeTcbPrivilege\n#define FSCTL_PIPE_DELETE_SYMLINK           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 20, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)\n#define FSCTL_PIPE_QUERY_CLIENT_PROCESS_V2  CTL_CODE(FILE_DEVICE_NAMED_PIPE, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) // since 19H1\n\n#define FSCTL_PIPE_INTERNAL_READ            CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)\n#define FSCTL_PIPE_INTERNAL_WRITE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)\n#define FSCTL_PIPE_INTERNAL_TRANSCEIVE      CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)\n#define FSCTL_PIPE_INTERNAL_READ_OVFLOW     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)\n\n// Flags for query event\n\n#define FILE_PIPE_READ_DATA 0x00000000\n#define FILE_PIPE_WRITE_SPACE 0x00000001\n\n// Input for FSCTL_PIPE_ASSIGN_EVENT\ntypedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER\n{\n    HANDLE EventHandle;\n    ULONG KeyValue;\n} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;\n\n// Output for FILE_PIPE_PEEK_BUFFER\ntypedef struct _FILE_PIPE_PEEK_BUFFER\n{\n    ULONG NamedPipeState;\n    ULONG ReadDataAvailable;\n    ULONG NumberOfMessages;\n    ULONG MessageLength;\n    _Field_size_bytes_(MessageLength) CHAR Data[1];\n} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;\n\n// Output for FSCTL_PIPE_QUERY_EVENT\ntypedef struct _FILE_PIPE_EVENT_BUFFER\n{\n    ULONG NamedPipeState;\n    ULONG EntryType;\n    ULONG ByteCount;\n    ULONG KeyValue;\n    ULONG NumberRequests;\n} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;\n\n// Input for FSCTL_PIPE_WAIT\ntypedef struct _FILE_PIPE_WAIT_FOR_BUFFER\n{\n    LARGE_INTEGER Timeout;\n    ULONG NameLength;\n    BOOLEAN TimeoutSpecified;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;\n\n// Input for FSCTL_PIPE_SET_CLIENT_PROCESS, Output for FSCTL_PIPE_QUERY_CLIENT_PROCESS\ntypedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER\n{\n#if !defined(BUILD_WOW6432)\n    PVOID ClientSession;\n    PVOID ClientProcess;\n#else\n    ULONGLONG ClientSession;\n    ULONGLONG ClientProcess;\n#endif\n} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;\n\n// Control structure for FSCTL_PIPE_QUERY_CLIENT_PROCESS_V2\n\ntypedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_V2\n{\n     ULONGLONG ClientSession;\n#if !defined(BUILD_WOW6432)\n     PVOID ClientProcess;\n#else\n     ULONGLONG ClientProcess;\n#endif\n} FILE_PIPE_CLIENT_PROCESS_BUFFER_V2, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_V2;\n\n#define FILE_PIPE_COMPUTER_NAME_LENGTH 15\n\n// Input for FSCTL_PIPE_SET_CLIENT_PROCESS, Output for FSCTL_PIPE_QUERY_CLIENT_PROCESS\ntypedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX\n{\n#if !defined(BUILD_WOW6432)\n    PVOID ClientSession;\n    PVOID ClientProcess;\n#else\n    ULONGLONG ClientSession;\n    ULONGLONG ClientProcess;\n#endif\n    USHORT ClientComputerNameLength; // in bytes\n    WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH + 1]; // null-terminated\n} FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;\n\n// Control structure for FSCTL_PIPE_SILO_ARRIVAL\n\ntypedef struct _FILE_PIPE_SILO_ARRIVAL_INPUT\n{\n    HANDLE JobHandle;\n} FILE_PIPE_SILO_ARRIVAL_INPUT, *PFILE_PIPE_SILO_ARRIVAL_INPUT;\n\n//\n// Flags for create symlink\n//\n\n//\n// A global symlink will cause resolution of the symlink's target to occur in\n// the host silo (i.e. not in any current silo).  For example, if there is a\n// symlink at \\Device\\Silos\\37\\Device\\NamedPipe\\symlink then the target will be\n// resolved as \\Device\\NamedPipe\\target instead of \\Device\\Silos\\37\\Device\\NamedPipe\\target\n//\n#define FILE_PIPE_SYMLINK_FLAG_GLOBAL   0x1\n\n//\n// A relative symlink will cause resolution of the symlink's target to occur relative\n// to the root of the named pipe file system.  For example, if there is a symlink at\n// \\Device\\NamedPipe\\symlink that has a target called \"target\", then the target will\n// be resolved as \\Device\\NamedPipe\\target\n//\n#define FILE_PIPE_SYMLINK_FLAG_RELATIVE 0x2\n\n#define FILE_PIPE_SYMLINK_VALID_FLAGS \\\n    (FILE_PIPE_SYMLINK_FLAG_GLOBAL | FILE_PIPE_SYMLINK_FLAG_RELATIVE)\n\n// Control structure for FSCTL_PIPE_CREATE_SYMLINK\n\ntypedef struct _FILE_PIPE_CREATE_SYMLINK_INPUT\n{\n    USHORT NameOffset;\n    USHORT NameLength;\n    USHORT SubstituteNameOffset;\n    USHORT SubstituteNameLength;\n    ULONG Flags;\n} FILE_PIPE_CREATE_SYMLINK_INPUT, *PFILE_PIPE_CREATE_SYMLINK_INPUT;\n\n// Control structure for FSCTL_PIPE_DELETE_SYMLINK\n\ntypedef struct _FILE_PIPE_DELETE_SYMLINK_INPUT\n{\n    USHORT NameOffset;\n    USHORT NameLength;\n} FILE_PIPE_DELETE_SYMLINK_INPUT, *PFILE_PIPE_DELETE_SYMLINK_INPUT;\n\n// Mailslot FS control definitions\n\n#define MAILSLOT_CLASS_FIRSTCLASS 1\n#define MAILSLOT_CLASS_SECONDCLASS 2\n\n#define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)\n\n// Output for FSCTL_MAILSLOT_PEEK\ntypedef struct _FILE_MAILSLOT_PEEK_BUFFER\n{\n    ULONG ReadDataAvailable;\n    ULONG NumberOfMessages;\n    ULONG MessageLength;\n} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;\n\n//\n// Mount manager FS control definitions\n//\n\n#define MOUNTMGR_DEVICE_NAME L\"\\\\Device\\\\MountPointManager\"\n#define MOUNTMGRCONTROLTYPE 0x0000006D // 'm'\n#define MOUNTDEVCONTROLTYPE 0x0000004D // 'M'\n\n#define IOCTL_MOUNTMGR_CREATE_POINT                 CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_DELETE_POINTS                CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_QUERY_POINTS                 CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY         CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER            CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS          CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED   CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED   CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_CHANGE_NOTIFY                CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)\n#define IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE      CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES    CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS)\n#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION  CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)\n#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH        CTL_CODE(MOUNTMGRCONTROLTYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS       CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define IOCTL_MOUNTMGR_SCRUB_REGISTRY               CTL_CODE(MOUNTMGRCONTROLTYPE, 14, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_QUERY_AUTO_MOUNT             CTL_CODE(MOUNTMGRCONTROLTYPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define IOCTL_MOUNTMGR_SET_AUTO_MOUNT               CTL_CODE(MOUNTMGRCONTROLTYPE, 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_BOOT_DL_ASSIGNMENT           CTL_CODE(MOUNTMGRCONTROLTYPE, 17, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // since WIN7\n#define IOCTL_MOUNTMGR_TRACELOG_CACHE               CTL_CODE(MOUNTMGRCONTROLTYPE, 18, METHOD_BUFFERED, FILE_READ_ACCESS)\n#define IOCTL_MOUNTMGR_PREPARE_VOLUME_DELETE        CTL_CODE(MOUNTMGRCONTROLTYPE, 19, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)\n#define IOCTL_MOUNTMGR_CANCEL_VOLUME_DELETE         CTL_CODE(MOUNTMGRCONTROLTYPE, 20, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // since WIN8\n#define IOCTL_MOUNTMGR_SILO_ARRIVAL                 CTL_CODE(MOUNTMGRCONTROLTYPE, 21, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // since RS1\n\n#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME            CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n// Input structure for IOCTL_MOUNTMGR_CREATE_POINT.\ntypedef struct _MOUNTMGR_CREATE_POINT_INPUT\n{\n    USHORT SymbolicLinkNameOffset;\n    USHORT SymbolicLinkNameLength;\n    USHORT DeviceNameOffset;\n    USHORT DeviceNameLength;\n} MOUNTMGR_CREATE_POINT_INPUT, *PMOUNTMGR_CREATE_POINT_INPUT;\n\n// Input structure for IOCTL_MOUNTMGR_DELETE_POINTS, IOCTL_MOUNTMGR_QUERY_POINTS, and IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY.\ntypedef struct _MOUNTMGR_MOUNT_POINT\n{\n    ULONG SymbolicLinkNameOffset;\n    USHORT SymbolicLinkNameLength;\n    USHORT Reserved1;\n    ULONG UniqueIdOffset;\n    USHORT UniqueIdLength;\n    USHORT Reserved2;\n    ULONG DeviceNameOffset;\n    USHORT DeviceNameLength;\n    USHORT Reserved3;\n} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT;\n\n// Output structure for IOCTL_MOUNTMGR_DELETE_POINTS, IOCTL_MOUNTMGR_QUERY_POINTS, and IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY.\ntypedef struct _MOUNTMGR_MOUNT_POINTS\n{\n    ULONG Size;\n    ULONG NumberOfMountPoints;\n    _Field_size_(NumberOfMountPoints) MOUNTMGR_MOUNT_POINT MountPoints[1];\n} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS;\n\n// Input structure for IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER.\ntypedef struct _MOUNTMGR_DRIVE_LETTER_TARGET\n{\n    USHORT DeviceNameLength;\n    _Field_size_bytes_(DeviceNameLength) WCHAR DeviceName[1];\n} MOUNTMGR_DRIVE_LETTER_TARGET, *PMOUNTMGR_DRIVE_LETTER_TARGET;\n\n// Output structure for IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER.\ntypedef struct _MOUNTMGR_DRIVE_LETTER_INFORMATION\n{\n    BOOLEAN DriveLetterWasAssigned;\n    UCHAR CurrentDriveLetter;\n} MOUNTMGR_DRIVE_LETTER_INFORMATION, *PMOUNTMGR_DRIVE_LETTER_INFORMATION;\n\n// Input structure for IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED and\n// IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED.\ntypedef struct _MOUNTMGR_VOLUME_MOUNT_POINT\n{\n    USHORT SourceVolumeNameOffset;\n    USHORT SourceVolumeNameLength;\n    USHORT TargetVolumeNameOffset;\n    USHORT TargetVolumeNameLength;\n} MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT;\n\n// Input structure for IOCTL_MOUNTMGR_CHANGE_NOTIFY.\n// Output structure for IOCTL_MOUNTMGR_CHANGE_NOTIFY.\ntypedef struct _MOUNTMGR_CHANGE_NOTIFY_INFO\n{\n    ULONG EpicNumber;\n} MOUNTMGR_CHANGE_NOTIFY_INFO, *PMOUNTMGR_CHANGE_NOTIFY_INFO;\n\n// Input structure for IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE,\n// IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION,\n// IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, and\n// IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS.\n// IOCTL_MOUNTMGR_PREPARE_VOLUME_DELETE\n// IOCTL_MOUNTMGR_CANCEL_VOLUME_DELETE\ntypedef struct _MOUNTMGR_TARGET_NAME\n{\n    USHORT DeviceNameLength;\n    _Field_size_bytes_(DeviceNameLength) WCHAR DeviceName[1];\n} MOUNTMGR_TARGET_NAME, *PMOUNTMGR_TARGET_NAME;\n\n// Input / Output structure for querying / setting the auto-mount setting\ntypedef enum _MOUNTMGR_AUTO_MOUNT_STATE\n{\n    Disabled = 0,\n    Enabled\n} MOUNTMGR_AUTO_MOUNT_STATE;\n\n// IOCTL_MOUNTMGR_QUERY_AUTO_MOUNT\ntypedef struct _MOUNTMGR_QUERY_AUTO_MOUNT\n{\n    MOUNTMGR_AUTO_MOUNT_STATE CurrentState;\n} MOUNTMGR_QUERY_AUTO_MOUNT, *PMOUNTMGR_QUERY_AUTO_MOUNT;\n\n// IOCTL_MOUNTMGR_SET_AUTO_MOUNT\ntypedef struct _MOUNTMGR_SET_AUTO_MOUNT\n{\n    MOUNTMGR_AUTO_MOUNT_STATE NewState;\n} MOUNTMGR_SET_AUTO_MOUNT, *PMOUNTMGR_SET_AUTO_MOUNT;\n\n// Input structure for IOCTL_MOUNTMGR_SILO_ARRIVAL.\ntypedef struct _MOUNTMGR_SILO_ARRIVAL_INPUT\n{\n    HANDLE JobHandle;\n} MOUNTMGR_SILO_ARRIVAL_INPUT, *PMOUNTMGR_SILO_ARRIVAL_INPUT;\n\n// Macro that defines what a \"drive letter\" mount point is.  This macro can\n// be used to scan the result from QUERY_POINTS to discover which mount points\n// are find \"drive letter\" mount points.\n#define MOUNTMGR_IS_DRIVE_LETTER(s) ( \\\n    (s)->Length == 28 && \\\n    (s)->Buffer[0] == '\\\\' && \\\n    (s)->Buffer[1] == 'D' && \\\n    (s)->Buffer[2] == 'o' && \\\n    (s)->Buffer[3] == 's' && \\\n    (s)->Buffer[4] == 'D' && \\\n    (s)->Buffer[5] == 'e' && \\\n    (s)->Buffer[6] == 'v' && \\\n    (s)->Buffer[7] == 'i' && \\\n    (s)->Buffer[8] == 'c' && \\\n    (s)->Buffer[9] == 'e' && \\\n    (s)->Buffer[10] == 's' && \\\n    (s)->Buffer[11] == '\\\\' && \\\n    (s)->Buffer[12] >= 'A' && \\\n    (s)->Buffer[12] <= 'Z' && \\\n    (s)->Buffer[13] == ':')\n\n// Macro that defines what a \"volume name\" mount point is.  This macro can\n// be used to scan the result from QUERY_POINTS to discover which mount points\n// are \"volume name\" mount points.\n#define MOUNTMGR_IS_VOLUME_NAME(s) ( \\\n     ((s)->Length == 96 || ((s)->Length == 98 && (s)->Buffer[48] == '\\\\')) && \\\n     (s)->Buffer[0] == '\\\\' && \\\n     ((s)->Buffer[1] == '?' || (s)->Buffer[1] == '\\\\') && \\\n     (s)->Buffer[2] == '?' && \\\n     (s)->Buffer[3] == '\\\\' && \\\n     (s)->Buffer[4] == 'V' && \\\n     (s)->Buffer[5] == 'o' && \\\n     (s)->Buffer[6] == 'l' && \\\n     (s)->Buffer[7] == 'u' && \\\n     (s)->Buffer[8] == 'm' && \\\n     (s)->Buffer[9] == 'e' && \\\n     (s)->Buffer[10] == '{' && \\\n     (s)->Buffer[19] == '-' && \\\n     (s)->Buffer[24] == '-' && \\\n     (s)->Buffer[29] == '-' && \\\n     (s)->Buffer[34] == '-' && \\\n     (s)->Buffer[47] == '}')\n\n// Output structure for IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.\ntypedef struct _MOUNTDEV_NAME\n{\n    USHORT NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} MOUNTDEV_NAME, *PMOUNTDEV_NAME;\n\n// Output structure for IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH and IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS.\ntypedef struct _MOUNTMGR_VOLUME_PATHS\n{\n    ULONG MultiSzLength;\n    _Field_size_bytes_(MultiSzLength) WCHAR MultiSz[1];\n} MOUNTMGR_VOLUME_PATHS, *PMOUNTMGR_VOLUME_PATHS;\n\n#define MOUNTMGR_IS_DOS_VOLUME_NAME(s) ( \\\n     MOUNTMGR_IS_VOLUME_NAME(s) && \\\n     (s)->Length == 96 && \\\n     (s)->Buffer[1] == '\\\\')\n\n#define MOUNTMGR_IS_DOS_VOLUME_NAME_WB(s) ( \\\n     MOUNTMGR_IS_VOLUME_NAME(s) && \\\n     (s)->Length == 98 && \\\n     (s)->Buffer[1] == '\\\\')\n\n#define MOUNTMGR_IS_NT_VOLUME_NAME(s) ( \\\n     MOUNTMGR_IS_VOLUME_NAME(s) && \\\n     (s)->Length == 96 && \\\n     (s)->Buffer[1] == '?')\n\n#define MOUNTMGR_IS_NT_VOLUME_NAME_WB(s) ( \\\n     MOUNTMGR_IS_VOLUME_NAME(s) && \\\n     (s)->Length == 98 && \\\n     (s)->Buffer[1] == '?')\n\n//\n// Filter manager\n//\n\n#define FLT_PORT_CONNECT 0x0001\n#define FLT_PORT_ALL_ACCESS (FLT_PORT_CONNECT | STANDARD_RIGHTS_ALL)\n\n// rev\n#define FLT_SYMLINK_NAME     L\"\\\\Global??\\\\FltMgr\"\n#define FLT_MSG_SYMLINK_NAME L\"\\\\Global??\\\\FltMgrMsg\"\n#define FLT_DEVICE_NAME      L\"\\\\FileSystem\\\\Filters\\\\FltMgr\"\n#define FLT_MSG_DEVICE_NAME  L\"\\\\FileSystem\\\\Filters\\\\FltMgrMsg\"\n\n// private\ntypedef struct _FLT_CONNECT_CONTEXT\n{\n    PUNICODE_STRING PortName;\n    PUNICODE_STRING64 PortName64;\n    USHORT SizeOfContext;\n    UCHAR Padding[6]; // unused\n    _Field_size_bytes_(SizeOfContext) UCHAR Context[ANYSIZE_ARRAY];\n} FLT_CONNECT_CONTEXT, *PFLT_CONNECT_CONTEXT;\n\n// rev\n#define FLT_PORT_EA_NAME \"FLTPORT\"\n#define FLT_PORT_CONTEXT_MAX 0xFFE8\n\n// combined FILE_FULL_EA_INFORMATION and FLT_CONNECT_CONTEXT\ntypedef struct _FLT_PORT_FULL_EA\n{\n    ULONG NextEntryOffset; // 0\n    UCHAR Flags;           // 0\n    UCHAR EaNameLength;    // sizeof(FLT_PORT_EA_NAME) - sizeof(ANSI_NULL)\n    USHORT EaValueLength;  // RTL_SIZEOF_THROUGH_FIELD(FLT_CONNECT_CONTEXT, Padding) + SizeOfContext\n    CHAR EaName[8];        // FLTPORT\\0\n    FLT_CONNECT_CONTEXT EaValue;\n} FLT_PORT_FULL_EA, *PFLT_PORT_FULL_EA;\n\n#define FLT_PORT_FULL_EA_SIZE \\\n    (sizeof(FILE_FULL_EA_INFORMATION) + (sizeof(FLT_PORT_EA_NAME) - sizeof(ANSI_NULL)))\n#define FLT_PORT_FULL_EA_VALUE_SIZE \\\n    RTL_SIZEOF_THROUGH_FIELD(FLT_CONNECT_CONTEXT, Padding)\n\n// begin_rev\n\n// IOCTLs for unlinked FltMgr handles\n#define FLT_CTL_LOAD                CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS) // in: FLT_LOAD_PARAMETERS // requires SeLoadDriverPrivilege\n#define FLT_CTL_UNLOAD              CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_WRITE_ACCESS) // in: FLT_LOAD_PARAMETERS // requires SeLoadDriverPrivilege\n#define FLT_CTL_LINK_HANDLE         CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_READ_ACCESS)  // in: FLT_LINK // specializes the handle\n#define FLT_CTL_ATTACH              CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_WRITE_ACCESS) // in: FLT_ATTACH\n#define FLT_CTL_DETACH              CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_WRITE_ACCESS) // in: FLT_INSTANCE_PARAMETERS\n\n// IOCTLs for port-specific FltMgrMsg handles (opened using the extended attribute)\n#define FLT_CTL_SEND_MESSAGE        CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 6, METHOD_NEITHER, FILE_WRITE_ACCESS)  // in, out: filter-specific\n#define FLT_CTL_GET_MESSAGE         CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 7, METHOD_NEITHER, FILE_READ_ACCESS)   // out: filter-specific\n#define FLT_CTL_REPLY_MESSAGE       CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 8, METHOD_NEITHER, FILE_WRITE_ACCESS)  // in: filter-specific\n\n// IOCTLs for linked FltMgr handles; depend on previously used FLT_LINK_TYPE\n//\n// Find first/next:\n//   FILTER                - enumerates nested instances; in: INSTANCE_INFORMATION_CLASS\n//   FILTER_VOLUME         - enumerates nested instances; in: INSTANCE_INFORMATION_CLASS\n//   FILTER_MANAGER        - enumerates all filters;      in: FILTER_INFORMATION_CLASS\n//   FILTER_MANAGER_VOLUME - enumerates all volumes;      in: FILTER_VOLUME_INFORMATION_CLASS\n//\n// Get information:\n//   FILTER                - queries filter;              in: FILTER_INFORMATION_CLASS\n//   FILTER_INSTANCE       - queries instance;            in: INSTANCE_INFORMATION_CLASS\n//\n#define FLT_CTL_FIND_FIRST          CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 9, METHOD_BUFFERED, FILE_READ_ACCESS)  // in: *_INFORMATION_CLASS, out: *_INFORMATION (from fltUserStructures.h)\n#define FLT_CTL_FIND_NEXT           CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_READ_ACCESS) // in: *_INFORMATION_CLASS, out: *_INFORMATION (from fltUserStructures.h)\n#define FLT_CTL_GET_INFORMATION     CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_READ_ACCESS) // in: *_INFORMATION_CLASS, out: *_INFORMATION (from fltUserStructures.h)\n\n// end_rev\n\n// private\ntypedef struct _FLT_LOAD_PARAMETERS\n{\n    USHORT FilterNameSize;\n    _Field_size_bytes_(FilterNameSize) WCHAR FilterName[ANYSIZE_ARRAY];\n} FLT_LOAD_PARAMETERS, *PFLT_LOAD_PARAMETERS;\n\n// private\ntypedef enum _FLT_LINK_TYPE\n{\n    FILTER = 0,                // FLT_FILTER_PARAMETERS\n    FILTER_INSTANCE = 1,       // FLT_INSTANCE_PARAMETERS\n    FILTER_VOLUME = 2,         // FLT_VOLUME_PARAMETERS\n    FILTER_MANAGER = 3,        // nothing\n    FILTER_MANAGER_VOLUME = 4, // nothing\n} FLT_LINK_TYPE, *PFLT_LINK_TYPE;\n\n// private\ntypedef struct _FLT_LINK\n{\n    FLT_LINK_TYPE Type;\n    ULONG ParametersOffset; // from this struct\n} FLT_LINK, *PFLT_LINK;\n\n// rev\ntypedef struct _FLT_FILTER_PARAMETERS\n{\n    USHORT FilterNameSize;\n    USHORT FilterNameOffset; // to WCHAR[] from this struct\n} FLT_FILTER_PARAMETERS, *PFLT_FILTER_PARAMETERS;\n\n// private\ntypedef struct _FLT_INSTANCE_PARAMETERS\n{\n    USHORT FilterNameSize;\n    USHORT FilterNameOffset; // to WCHAR[] from this struct\n    USHORT VolumeNameSize;\n    USHORT VolumeNameOffset; // to WCHAR[] from this struct\n    USHORT InstanceNameSize;\n    USHORT InstanceNameOffset; // to WCHAR[] from this struct\n} FLT_INSTANCE_PARAMETERS, *PFLT_INSTANCE_PARAMETERS;\n\n// rev\ntypedef struct _FLT_VOLUME_PARAMETERS\n{\n    USHORT VolumeNameSize;\n    USHORT VolumeNameOffset; // to WCHAR[] from this struct\n} FLT_VOLUME_PARAMETERS, *PFLT_VOLUME_PARAMETERS;\n\n// private\ntypedef enum _ATTACH_TYPE\n{\n    AltitudeBased = 0,\n    InstanceNameBased = 1,\n} ATTACH_TYPE, *PATTACH_TYPE;\n\n// private\ntypedef struct _FLT_ATTACH\n{\n    USHORT FilterNameSize;\n    USHORT FilterNameOffset; // to WCHAR[] from this struct\n    USHORT VolumeNameSize;\n    USHORT VolumeNameOffset; // to WCHAR[] from this struct\n    ATTACH_TYPE Type;\n    USHORT InstanceNameSize;\n    USHORT InstanceNameOffset; // to WCHAR[] from this struct\n    USHORT AltitudeSize;\n    USHORT AltitudeOffset; // to WCHAR[] from this struct\n} FLT_ATTACH, *PFLT_ATTACH;\n\n//\n// Multiple UNC Provider\n//\n\n// rev // FSCTLs for \\Device\\Mup\n#define FSCTL_MUP_GET_UNC_CACHE_INFO                CTL_CODE(FILE_DEVICE_MULTI_UNC_PROVIDER, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) // out: MUP_FSCTL_UNC_CACHE_INFORMATION\n#define FSCTL_MUP_GET_UNC_PROVIDER_LIST             CTL_CODE(FILE_DEVICE_MULTI_UNC_PROVIDER, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) // out: MUP_FSCTL_UNC_PROVIDER_INFORMATION\n#define FSCTL_MUP_GET_SURROGATE_PROVIDER_LIST       CTL_CODE(FILE_DEVICE_MULTI_UNC_PROVIDER, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) // out: MUP_FSCTL_SURROGATE_PROVIDER_INFORMATION\n#define FSCTL_MUP_GET_UNC_HARDENING_CONFIGURATION   CTL_CODE(FILE_DEVICE_MULTI_UNC_PROVIDER, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) // out: MUP_FSCTL_UNC_HARDENING_PREFIX_TABLE_ENTRY[]\n#define FSCTL_MUP_GET_UNC_HARDENING_CONFIGURATION_FOR_PATH  CTL_CODE(FILE_DEVICE_MULTI_UNC_PROVIDER, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_IN; out: MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_OUT\n\n// private\ntypedef struct _MUP_FSCTL_UNC_CACHE_ENTRY\n{\n    ULONG TotalLength;\n    ULONG UncNameOffset; // to WCHAR[] from this struct\n    USHORT UncNameLength; // in bytes\n    ULONG ProviderNameOffset; // to WCHAR[] from this struct\n    USHORT ProviderNameLength; // in bytes\n    ULONG SurrogateNameOffset; // to WCHAR[] from this struct\n    USHORT SurrogateNameLength; // in bytes\n    ULONG ProviderPriority;\n    ULONG EntryTtl;\n    WCHAR Strings[ANYSIZE_ARRAY];\n} MUP_FSCTL_UNC_CACHE_ENTRY, *PMUP_FSCTL_UNC_CACHE_ENTRY;\n\n// private\ntypedef struct _MUP_FSCTL_UNC_CACHE_INFORMATION\n{\n    ULONG MaxCacheSize;\n    ULONG CurrentCacheSize;\n    ULONG EntryTimeout;\n    ULONG TotalEntries;\n    MUP_FSCTL_UNC_CACHE_ENTRY CacheEntry[ANYSIZE_ARRAY];\n} MUP_FSCTL_UNC_CACHE_INFORMATION, *PMUP_FSCTL_UNC_CACHE_INFORMATION;\n\n// private\ntypedef struct _MUP_FSCTL_UNC_PROVIDER_ENTRY\n{\n    ULONG TotalLength;\n    LONG ReferenceCount;\n    ULONG ProviderPriority;\n    ULONG ProviderState;\n    ULONG ProviderId;\n    USHORT ProviderNameLength; // in bytes\n    WCHAR ProviderName[ANYSIZE_ARRAY];\n} MUP_FSCTL_UNC_PROVIDER_ENTRY, *PMUP_FSCTL_UNC_PROVIDER_ENTRY;\n\n// private\ntypedef struct _MUP_FSCTL_UNC_PROVIDER_INFORMATION\n{\n    ULONG TotalEntries;\n    MUP_FSCTL_UNC_PROVIDER_ENTRY ProviderEntry[ANYSIZE_ARRAY];\n} MUP_FSCTL_UNC_PROVIDER_INFORMATION, *PMUP_FSCTL_UNC_PROVIDER_INFORMATION;\n\n// private\ntypedef struct _MUP_FSCTL_SURROGATE_PROVIDER_ENTRY\n{\n    ULONG TotalLength;\n    LONG ReferenceCount;\n    ULONG SurrogateType;\n    ULONG SurrogateState;\n    ULONG SurrogatePriority;\n    USHORT SurrogateNameLength; // in bytes\n    WCHAR SurrogateName[ANYSIZE_ARRAY];\n} MUP_FSCTL_SURROGATE_PROVIDER_ENTRY, *PMUP_FSCTL_SURROGATE_PROVIDER_ENTRY;\n\n// private\ntypedef struct _MUP_FSCTL_SURROGATE_PROVIDER_INFORMATION\n{\n    ULONG TotalEntries;\n    MUP_FSCTL_SURROGATE_PROVIDER_ENTRY SurrogateEntry[ANYSIZE_ARRAY];\n} MUP_FSCTL_SURROGATE_PROVIDER_INFORMATION, *PMUP_FSCTL_SURROGATE_PROVIDER_INFORMATION;\n\n// private\ntypedef struct _MUP_FSCTL_UNC_HARDENING_PREFIX_TABLE_ENTRY\n{\n    ULONG NextOffset; // from this struct\n    ULONG PrefixNameOffset; // to WCHAR[] from this struct\n    USHORT PrefixNameCbLength; // in bytes\n    union\n    {\n        ULONG RequiredHardeningCapabilities;\n        struct\n        {\n            ULONG RequiresMutualAuth : 1;\n            ULONG RequiresIntegrity : 1;\n            ULONG RequiresPrivacy : 1;\n        };\n    };\n    ULONGLONG OpenCount;\n} MUP_FSCTL_UNC_HARDENING_PREFIX_TABLE_ENTRY, *PMUP_FSCTL_UNC_HARDENING_PREFIX_TABLE_ENTRY;\n\n// private\ntypedef struct _MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_IN\n{\n    ULONG Size;\n    ULONG UncPathOffset; // to WCHAR[] from this struct\n    USHORT UncPathCbLength; // in bytes\n} MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_IN, *PMUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_IN;\n\n// private\ntypedef struct _MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_OUT\n{\n    ULONG Size;\n    union\n    {\n        ULONG RequiredHardeningCapabilities;\n        struct\n        {\n            ULONG RequiresMutualAuth : 1;\n            ULONG RequiresIntegrity : 1;\n            ULONG RequiresPrivacy : 1;\n        };\n    };\n} MUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_OUT, *PMUP_FSCTL_QUERY_UNC_HARDENING_CONFIGURATION_OUT;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Major Function Codes\n//\n#define IRP_MJ_CREATE                                0x00\n#define IRP_MJ_CREATE_NAMED_PIPE                     0x01\n#define IRP_MJ_CLOSE                                 0x02\n#define IRP_MJ_READ                                  0x03\n#define IRP_MJ_WRITE                                 0x04\n#define IRP_MJ_QUERY_INFORMATION                     0x05\n#define IRP_MJ_SET_INFORMATION                       0x06\n#define IRP_MJ_QUERY_EA                              0x07\n#define IRP_MJ_SET_EA                                0x08\n#define IRP_MJ_FLUSH_BUFFERS                         0x09\n#define IRP_MJ_QUERY_VOLUME_INFORMATION              0x0a\n#define IRP_MJ_SET_VOLUME_INFORMATION                0x0b\n#define IRP_MJ_DIRECTORY_CONTROL                     0x0c\n#define IRP_MJ_FILE_SYSTEM_CONTROL                   0x0d\n#define IRP_MJ_DEVICE_CONTROL                        0x0e\n#define IRP_MJ_INTERNAL_DEVICE_CONTROL               0x0f\n#define IRP_MJ_SHUTDOWN                              0x10\n#define IRP_MJ_LOCK_CONTROL                          0x11\n#define IRP_MJ_CLEANUP                               0x12\n#define IRP_MJ_CREATE_MAILSLOT                       0x13\n#define IRP_MJ_QUERY_SECURITY                        0x14\n#define IRP_MJ_SET_SECURITY                          0x15\n#define IRP_MJ_POWER                                 0x16\n#define IRP_MJ_SYSTEM_CONTROL                        0x17\n#define IRP_MJ_DEVICE_CHANGE                         0x18\n#define IRP_MJ_QUERY_QUOTA                           0x19\n#define IRP_MJ_SET_QUOTA                             0x1a\n#define IRP_MJ_PNP                                   0x1b\n#define IRP_MJ_PNP_POWER                             IRP_MJ_PNP      // Obsolete....\n#define IRP_MJ_MAXIMUM_FUNCTION                      0x1b\n#define IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION   ((UCHAR)-1)\n#define IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION   ((UCHAR)-2)\n#define IRP_MJ_ACQUIRE_FOR_MOD_WRITE                 ((UCHAR)-3)\n#define IRP_MJ_RELEASE_FOR_MOD_WRITE                 ((UCHAR)-4)\n#define IRP_MJ_ACQUIRE_FOR_CC_FLUSH                  ((UCHAR)-5)\n#define IRP_MJ_RELEASE_FOR_CC_FLUSH                  ((UCHAR)-6)\n#define IRP_MJ_QUERY_OPEN                            ((UCHAR)-7)\n#define IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE             ((UCHAR)-13)\n#define IRP_MJ_NETWORK_QUERY_OPEN                    ((UCHAR)-14)\n#define IRP_MJ_MDL_READ                              ((UCHAR)-15)\n#define IRP_MJ_MDL_READ_COMPLETE                     ((UCHAR)-16)\n#define IRP_MJ_PREPARE_MDL_WRITE                     ((UCHAR)-17)\n#define IRP_MJ_MDL_WRITE_COMPLETE                    ((UCHAR)-18)\n#define IRP_MJ_VOLUME_MOUNT                          ((UCHAR)-19)\n#define IRP_MJ_VOLUME_DISMOUNT                       ((UCHAR)-20)\n#define FLT_INTERNAL_OPERATION_COUNT                 22\n\n//\n// Minor Function Codes\n//\n#define IRP_MN_SCSI_CLASS                   0x01\n// PNP minor function codes\n#define IRP_MN_START_DEVICE                 0x00\n#define IRP_MN_QUERY_REMOVE_DEVICE          0x01\n#define IRP_MN_REMOVE_DEVICE                0x02\n#define IRP_MN_CANCEL_REMOVE_DEVICE         0x03\n#define IRP_MN_STOP_DEVICE                  0x04\n#define IRP_MN_QUERY_STOP_DEVICE            0x05\n#define IRP_MN_CANCEL_STOP_DEVICE           0x06\n#define IRP_MN_QUERY_DEVICE_RELATIONS       0x07\n#define IRP_MN_QUERY_INTERFACE              0x08\n#define IRP_MN_QUERY_CAPABILITIES           0x09\n#define IRP_MN_QUERY_RESOURCES              0x0A\n#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B\n#define IRP_MN_QUERY_DEVICE_TEXT            0x0C\n#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D\n#define IRP_MN_READ_CONFIG                  0x0F\n#define IRP_MN_WRITE_CONFIG                 0x10\n#define IRP_MN_EJECT                        0x11\n#define IRP_MN_SET_LOCK                     0x12\n#define IRP_MN_QUERY_ID                     0x13\n#define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14\n#define IRP_MN_QUERY_BUS_INFORMATION        0x15\n#define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16\n#define IRP_MN_SURPRISE_REMOVAL             0x17\n#define IRP_MN_DEVICE_ENUMERATED            0x19\n\n// POWER minor function codes\n#define IRP_MN_WAIT_WAKE                    0x00\n#define IRP_MN_POWER_SEQUENCE               0x01\n#define IRP_MN_SET_POWER                    0x02\n#define IRP_MN_QUERY_POWER                  0x03\n// WMI minor function codes under IRP_MJ_SYSTEM_CONTROL\n#define IRP_MN_QUERY_ALL_DATA               0x00\n#define IRP_MN_QUERY_SINGLE_INSTANCE        0x01\n#define IRP_MN_CHANGE_SINGLE_INSTANCE       0x02\n#define IRP_MN_CHANGE_SINGLE_ITEM           0x03\n#define IRP_MN_ENABLE_EVENTS                0x04\n#define IRP_MN_DISABLE_EVENTS               0x05\n#define IRP_MN_ENABLE_COLLECTION            0x06\n#define IRP_MN_DISABLE_COLLECTION           0x07\n#define IRP_MN_REGINFO                      0x08\n#define IRP_MN_EXECUTE_METHOD               0x09\n// Minor code 0x0a is reserved\n#define IRP_MN_REGINFO_EX                   0x0b\n// Minor code 0x0c is reserved\n// Minor code 0x0d is reserved\n\n//\n// Filter Manager Callback Data Flags\n//\n#define FLTFL_CALLBACK_DATA_REISSUE_MASK        0x0000FFFF\n#define FLTFL_CALLBACK_DATA_IRP_OPERATION       0x00000001 // Set for Irp operations\n#define FLTFL_CALLBACK_DATA_FAST_IO_OPERATION   0x00000002 // Set for Fast Io operations\n#define FLTFL_CALLBACK_DATA_FS_FILTER_OPERATION 0x00000004 // Set for Fs Filter operations\n#define FLTFL_CALLBACK_DATA_SYSTEM_BUFFER       0x00000008 // Set if the buffer passed in for the i/o was a system buffer\n#define FLTFL_CALLBACK_DATA_GENERATED_IO        0x00010000 // Set if this is I/O generated by a mini-filter\n#define FLTFL_CALLBACK_DATA_REISSUED_IO         0x00020000 // Set if this I/O was reissued\n#define FLTFL_CALLBACK_DATA_DRAINING_IO         0x00040000 // set if this operation is being drained. If set,\n#define FLTFL_CALLBACK_DATA_POST_OPERATION      0x00080000 // Set if this is a POST operation\n#define FLTFL_CALLBACK_DATA_NEW_SYSTEM_BUFFER   0x00100000\n#define FLTFL_CALLBACK_DATA_DIRTY               0x80000000 // Set by caller if parameters were changed\n\n//\n// IRP Flags\n//\n#define IRP_NOCACHE                     0x00000001\n#define IRP_PAGING_IO                   0x00000002\n#define IRP_MOUNT_COMPLETION            0x00000002\n#define IRP_SYNCHRONOUS_API             0x00000004\n#define IRP_ASSOCIATED_IRP              0x00000008\n#define IRP_BUFFERED_IO                 0x00000010\n#define IRP_DEALLOCATE_BUFFER           0x00000020\n#define IRP_INPUT_OPERATION             0x00000040\n#define IRP_SYNCHRONOUS_PAGING_IO       0x00000040\n#define IRP_CREATE_OPERATION            0x00000080\n#define IRP_READ_OPERATION              0x00000100\n#define IRP_WRITE_OPERATION             0x00000200\n#define IRP_CLOSE_OPERATION             0x00000400\n#define IRP_DEFER_IO_COMPLETION         0x00000800\n#define IRP_OB_QUERY_NAME               0x00001000\n#define IRP_HOLD_DEVICE_QUEUE           0x00002000\n#define IRP_UM_DRIVER_INITIATED_IO      0x00400000\n\n//\n// File Object Flags\n//\n#define FO_FILE_OPEN                    0x00000001\n#define FO_SYNCHRONOUS_IO               0x00000002\n#define FO_ALERTABLE_IO                 0x00000004\n#define FO_NO_INTERMEDIATE_BUFFERING    0x00000008\n#define FO_WRITE_THROUGH                0x00000010\n#define FO_SEQUENTIAL_ONLY              0x00000020\n#define FO_CACHE_SUPPORTED              0x00000040\n#define FO_NAMED_PIPE                   0x00000080\n#define FO_STREAM_FILE                  0x00000100\n#define FO_MAILSLOT                     0x00000200\n#define FO_GENERATE_AUDIT_ON_CLOSE      0x00000400\n#define FO_QUEUE_IRP_TO_THREAD          FO_GENERATE_AUDIT_ON_CLOSE\n#define FO_DIRECT_DEVICE_OPEN           0x00000800\n#define FO_FILE_MODIFIED                0x00001000\n#define FO_FILE_SIZE_CHANGED            0x00002000\n#define FO_CLEANUP_COMPLETE             0x00004000\n#define FO_TEMPORARY_FILE               0x00008000\n#define FO_DELETE_ON_CLOSE              0x00010000\n#define FO_OPENED_CASE_SENSITIVE        0x00020000\n#define FO_HANDLE_CREATED               0x00040000\n#define FO_FILE_FAST_IO_READ            0x00080000\n#define FO_RANDOM_ACCESS                0x00100000\n#define FO_FILE_OPEN_CANCELLED          0x00200000\n#define FO_VOLUME_OPEN                  0x00400000\n#define FO_BYPASS_IO_ENABLED            0x00800000  //when set BYPASS IO is enabled on this handle\n#define FO_REMOTE_ORIGIN                0x01000000\n#define FO_DISALLOW_EXCLUSIVE           0x02000000\n#define FO_SKIP_COMPLETION_PORT         FO_DISALLOW_EXCLUSIVE\n#define FO_SKIP_SET_EVENT               0x04000000\n#define FO_SKIP_SET_FAST_IO             0x08000000\n#define FO_INDIRECT_WAIT_OBJECT         0x10000000\n#define FO_SECTION_MINSTORE_TREATMENT   0x20000000\n\n//\n// Define stack location (IO_STACK_LOCATION) flags\n//\n#define SL_PENDING_RETURNED                0x01\n#define SL_ERROR_RETURNED                  0x02\n#define SL_INVOKE_ON_CANCEL                0x20\n#define SL_INVOKE_ON_SUCCESS               0x40\n#define SL_INVOKE_ON_ERROR                 0x80\n// Create / Create Named Pipe (IRP_MJ_CREATE/IRP_MJ_CREATE_NAMED_PIPE)\n#define SL_FORCE_ACCESS_CHECK              0x01\n#define SL_OPEN_PAGING_FILE                0x02\n#define SL_OPEN_TARGET_DIRECTORY           0x04\n#define SL_STOP_ON_SYMLINK                 0x08\n#define SL_IGNORE_READONLY_ATTRIBUTE       0x40\n#define SL_CASE_SENSITIVE                  0x80\n// Read / Write (IRP_MJ_READ/IRP_MJ_WRITE)\n#define SL_KEY_SPECIFIED                   0x01\n#define SL_OVERRIDE_VERIFY_VOLUME          0x02\n#define SL_WRITE_THROUGH                   0x04\n#define SL_FT_SEQUENTIAL_WRITE             0x08\n#define SL_FORCE_DIRECT_WRITE              0x10\n#define SL_REALTIME_STREAM                 0x20    // valid only with optical media\n#define SL_PERSISTENT_MEMORY_FIXED_MAPPING 0x20    // valid only with persistent memory device and IRP_MJ_WRITE\n#define SL_BYPASS_IO                       0x40\n//  IRP_MJ_FLUSH_BUFFERS\n#define SL_FORCE_ASYNCHRONOUS              0x01\n// Device I/O Control\n#define SL_READ_ACCESS_GRANTED             0x01\n#define SL_WRITE_ACCESS_GRANTED            0x04    // Gap for SL_OVERRIDE_VERIFY_VOLUME\n// Lock (IRP_MJ_LOCK_CONTROL)\n#define SL_FAIL_IMMEDIATELY                0x01\n#define SL_EXCLUSIVE_LOCK                  0x02\n// QueryDirectory / QueryEa / QueryQuota (IRP_MJ_DIRECTORY_CONTROL/IRP_MJ_QUERY_EA/IRP_MJ_QUERY_QUOTA))\n#define SL_RESTART_SCAN                    0x01\n#define SL_RETURN_SINGLE_ENTRY             0x02\n#define SL_INDEX_SPECIFIED                 0x04\n#define SL_RETURN_ON_DISK_ENTRIES_ONLY     0x08\n#define SL_NO_CURSOR_UPDATE                0x10\n#define SL_QUERY_DIRECTORY_MASK            0x1b\n// NotifyDirectory (IRP_MJ_DIRECTORY_CONTROL)\n#define SL_WATCH_TREE                      0x01\n// FileSystemControl (IRP_MJ_FILE_SYSTEM_CONTROL)\n#define SL_ALLOW_RAW_MOUNT                 0x01\n//  SetInformationFile (IRP_MJ_SET_INFORMATION) / QueryInformationFile\n#define SL_BYPASS_ACCESS_CHECK             0x01\n#define SL_INFO_FORCE_ACCESS_CHECK         0x01\n#define SL_INFO_IGNORE_READONLY_ATTRIBUTE  0x40  // same value as IO_IGNORE_READONLY_ATTRIBUTE\n\n//\n// Device Object (DO) flags\n//\n#define DO_VERIFY_VOLUME                0x00000002\n#define DO_BUFFERED_IO                  0x00000004\n#define DO_EXCLUSIVE                    0x00000008\n#define DO_DIRECT_IO                    0x00000010\n#define DO_MAP_IO_BUFFER                0x00000020\n#define DO_DEVICE_INITIALIZING          0x00000080\n#define DO_SHUTDOWN_REGISTERED          0x00000800\n#define DO_BUS_ENUMERATED_DEVICE        0x00001000\n#define DO_POWER_PAGABLE                0x00002000\n#define DO_POWER_INRUSH                 0x00004000\n#define DO_DEVICE_TO_BE_RESET           0x04000000\n#define DO_DAX_VOLUME                   0x10000000\n\n//\n// KSecDD FS control definitions\n//\n#define KSEC_DEVICE_NAME L\"\\\\Device\\\\KSecDD\"\n#define IOCTL_KSEC_CONNECT_LSA                      CTL_CODE(FILE_DEVICE_KSEC,  0, METHOD_BUFFERED,     FILE_WRITE_ACCESS )\n#define IOCTL_KSEC_RNG                              CTL_CODE(FILE_DEVICE_KSEC,  1, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_RNG_REKEY                        CTL_CODE(FILE_DEVICE_KSEC,  2, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_ENCRYPT_MEMORY                   CTL_CODE(FILE_DEVICE_KSEC,  3, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_DECRYPT_MEMORY                   CTL_CODE(FILE_DEVICE_KSEC,  4, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_ENCRYPT_MEMORY_CROSS_PROC        CTL_CODE(FILE_DEVICE_KSEC,  5, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_DECRYPT_MEMORY_CROSS_PROC        CTL_CODE(FILE_DEVICE_KSEC,  6, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_ENCRYPT_MEMORY_SAME_LOGON        CTL_CODE(FILE_DEVICE_KSEC,  7, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_DECRYPT_MEMORY_SAME_LOGON        CTL_CODE(FILE_DEVICE_KSEC,  8, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS )\n#define IOCTL_KSEC_FIPS_GET_FUNCTION_TABLE          CTL_CODE(FILE_DEVICE_KSEC,  9, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_ALLOC_POOL                       CTL_CODE(FILE_DEVICE_KSEC, 10, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_FREE_POOL                        CTL_CODE(FILE_DEVICE_KSEC, 11, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_COPY_POOL                        CTL_CODE(FILE_DEVICE_KSEC, 12, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_DUPLICATE_HANDLE                 CTL_CODE(FILE_DEVICE_KSEC, 13, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_REGISTER_EXTENSION               CTL_CODE(FILE_DEVICE_KSEC, 14, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_CLIENT_CALLBACK                  CTL_CODE(FILE_DEVICE_KSEC, 15, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_GET_BCRYPT_EXTENSION             CTL_CODE(FILE_DEVICE_KSEC, 16, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_GET_SSL_EXTENSION                CTL_CODE(FILE_DEVICE_KSEC, 17, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_GET_DEVICECONTROL_EXTENSION      CTL_CODE(FILE_DEVICE_KSEC, 18, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_ALLOC_VM                         CTL_CODE(FILE_DEVICE_KSEC, 19, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_FREE_VM                          CTL_CODE(FILE_DEVICE_KSEC, 20, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_COPY_VM                          CTL_CODE(FILE_DEVICE_KSEC, 21, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_CLIENT_FREE_VM                   CTL_CODE(FILE_DEVICE_KSEC, 22, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_INSERT_PROTECTED_PROCESS_ADDRESS CTL_CODE(FILE_DEVICE_KSEC, 23, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_REMOVE_PROTECTED_PROCESS_ADDRESS CTL_CODE(FILE_DEVICE_KSEC, 24, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_GET_BCRYPT_EXTENSION2            CTL_CODE(FILE_DEVICE_KSEC, 25, METHOD_BUFFERED,     FILE_ANY_ACCESS )\n#define IOCTL_KSEC_IPC_GET_QUEUED_FUNCTION_CALLS    CTL_CODE(FILE_DEVICE_KSEC, 26, METHOD_OUT_DIRECT,   FILE_ANY_ACCESS)\n#define IOCTL_KSEC_IPC_SET_FUNCTION_RETURN          CTL_CODE(FILE_DEVICE_KSEC, 27, METHOD_NEITHER,      FILE_ANY_ACCESS)\n\n// pub\ntypedef enum _FS_FILTER_SECTION_SYNC_TYPE\n{\n    SyncTypeOther = 0,\n    SyncTypeCreateSection\n} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;\n\n//pub\ntypedef enum _CREATE_FILE_TYPE\n{\n    CreateFileTypeNone,\n    CreateFileTypeNamedPipe,\n    CreateFileTypeMailslot\n} CREATE_FILE_TYPE;\n\n// pub\ntypedef struct _NAMED_PIPE_CREATE_PARAMETERS\n{\n    ULONG NamedPipeType;\n    ULONG ReadMode;\n    ULONG CompletionMode;\n    ULONG MaximumInstances;\n    ULONG InboundQuota;\n    ULONG OutboundQuota;\n    LARGE_INTEGER DefaultTimeout;\n    BOOLEAN TimeoutSpecified;\n} NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;\n\n// pub\ntypedef struct _MAILSLOT_CREATE_PARAMETERS\n{\n    ULONG MailslotQuota;\n    ULONG MaximumMessageSize;\n    LARGE_INTEGER ReadTimeout;\n    BOOLEAN TimeoutSpecified;\n} MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS;\n\n// pub\ntypedef struct _OPLOCK_KEY_ECP_CONTEXT\n{\n    GUID OplockKey;\n    ULONG Reserved;\n} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT;\n\n// pub\ntypedef struct _OPLOCK_KEY_CONTEXT\n{\n    USHORT Version;        //  OPLOCK_KEY_VERSION_*\n    USHORT Flags;          //  OPLOCK_KEY_FLAG_*\n    GUID ParentOplockKey;\n    GUID TargetOplockKey;\n    ULONG Reserved;\n} OPLOCK_KEY_CONTEXT, *POPLOCK_KEY_CONTEXT;\n\n#define OPLOCK_KEY_VERSION_WIN7    0x0001\n#define OPLOCK_KEY_VERSION_WIN8    0x0002\n\n#define OPLOCK_KEY_FLAG_PARENT_KEY 0x0001\n#define OPLOCK_KEY_FLAG_TARGET_KEY 0x0002\n\n// pub\n#define SUPPORTED_FS_FEATURES_OFFLOAD_READ    0x00000001\n#define SUPPORTED_FS_FEATURES_OFFLOAD_WRITE   0x00000002\n#define SUPPORTED_FS_FEATURES_QUERY_OPEN      0x00000004\n#define SUPPORTED_FS_FEATURES_BYPASS_IO       0x00000008\n\n// WIN11\n#define SUPPORTED_FS_FEATURES_VALID_MASK_V3 (SUPPORTED_FS_FEATURES_OFFLOAD_READ | \\\n                                               SUPPORTED_FS_FEATURES_OFFLOAD_WRITE | \\\n                                               SUPPORTED_FS_FEATURES_QUERY_OPEN | \\\n                                               SUPPORTED_FS_FEATURES_BYPASS_IO)\n// WIN10-RS2\n#define SUPPORTED_FS_FEATURES_VALID_MASK_V2 (SUPPORTED_FS_FEATURES_OFFLOAD_READ | \\\n                                               SUPPORTED_FS_FEATURES_OFFLOAD_WRITE | \\\n                                               SUPPORTED_FS_FEATURES_QUERY_OPEN)\n// WIN8\n#define SUPPORTED_FS_FEATURES_VALID_MASK_V1 (SUPPORTED_FS_FEATURES_OFFLOAD_READ | \\\n                                               SUPPORTED_FS_FEATURES_OFFLOAD_WRITE)\n\n#define SUPPORTED_FS_FEATURES_VALID_MASK SUPPORTED_FS_FEATURES_VALID_MASK_V3\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntkeapi.h",
    "content": "/*\n * Kernel executive support library\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTKEAPI_H\n#define _NTKEAPI_H\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#define LOW_PRIORITY 0 // Lowest thread priority level\n#define LOW_REALTIME_PRIORITY 16 // Lowest realtime priority level\n#define HIGH_PRIORITY 31 // Highest thread priority level\n#define MAXIMUM_PRIORITY 32 // Number of thread priority levels\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\ntypedef enum _KTHREAD_STATE\n{\n    Initialized,\n    Ready,\n    Running,\n    Standby,\n    Terminated,\n    Waiting,\n    Transition,\n    DeferredReady,\n    GateWaitObsolete,\n    WaitingForProcessInSwap,\n    MaximumThreadState\n} KTHREAD_STATE, *PKTHREAD_STATE;\n\n// private\ntypedef enum _KHETERO_CPU_POLICY\n{\n    KHeteroCpuPolicyAll = 0,\n    KHeteroCpuPolicyLarge = 1,\n    KHeteroCpuPolicyLargeOrIdle = 2,\n    KHeteroCpuPolicySmall = 3,\n    KHeteroCpuPolicySmallOrIdle = 4,\n    KHeteroCpuPolicyDynamic = 5,\n    KHeteroCpuPolicyStaticMax = 5, // valid\n    KHeteroCpuPolicyBiasedSmall = 6,\n    KHeteroCpuPolicyBiasedLarge = 7,\n    KHeteroCpuPolicyDefault = 8,\n    KHeteroCpuPolicyMax = 9\n} KHETERO_CPU_POLICY, *PKHETERO_CPU_POLICY;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * KWAIT_REASON identifies the reasons for context switches or the current waiting state.\n */\ntypedef enum _KWAIT_REASON\n{\n    Executive,               // Waiting for an executive event.\n    FreePage,                // Waiting for a free page.\n    PageIn,                  // Waiting for a page to be read in.\n    PoolAllocation,          // Waiting for a pool allocation.\n    DelayExecution,          // Waiting due to a delay execution.           // NtDelayExecution\n    Suspended,               // Waiting because the thread is suspended.    // NtSuspendThread\n    UserRequest,             // Waiting due to a user request.              // NtWaitForSingleObject\n    WrExecutive,             // Waiting for an executive event.\n    WrFreePage,              // Waiting for a free page.\n    WrPageIn,                // Waiting for a page to be read in.\n    WrPoolAllocation,        // Waiting for a pool allocation.\n    WrDelayExecution,        // Waiting due to a delay execution.\n    WrSuspended,             // Waiting because the thread is suspended.\n    WrUserRequest,           // Waiting due to a user request.\n    WrEventPair,             // Waiting for an event pair.                  // NtCreateEventPair\n    WrQueue,                 // Waiting for a queue.                        // NtRemoveIoCompletion\n    WrLpcReceive,            // Waiting for an LPC receive.\n    WrLpcReply,              // Waiting for an LPC reply.\n    WrVirtualMemory,         // Waiting for virtual memory.\n    WrPageOut,               // Waiting for a page to be written out.\n    WrRendezvous,            // Waiting for a rendezvous.\n    WrKeyedEvent,            // Waiting for a keyed event.                  // NtCreateKeyedEvent\n    WrTerminated,            // Waiting for thread termination.\n    WrProcessInSwap,         // Waiting for a process to be swapped in.\n    WrCpuRateControl,        // Waiting for CPU rate control.\n    WrCalloutStack,          // Waiting for a callout stack.\n    WrKernel,                // Waiting for a kernel event.\n    WrResource,              // Waiting for a resource.\n    WrPushLock,              // Waiting for a push lock.\n    WrMutex,                 // Waiting for a mutex.\n    WrQuantumEnd,            // Waiting for the end of a quantum.\n    WrDispatchInt,           // Waiting for a dispatch interrupt.\n    WrPreempted,             // Waiting because the thread was preempted.\n    WrYieldExecution,        // Waiting to yield execution.\n    WrFastMutex,             // Waiting for a fast mutex.\n    WrGuardedMutex,          // Waiting for a guarded mutex.\n    WrRundown,               // Waiting for a rundown.\n    WrAlertByThreadId,       // Waiting for an alert by thread ID.\n    WrDeferredPreempt,       // Waiting for a deferred preemption.\n    WrPhysicalFault,         // Waiting for a physical fault.\n    WrIoRing,                // Waiting for an I/O ring.\n    WrMdlCache,              // Waiting for an MDL cache.\n    WrRcu,                   // Waiting for read-copy-update (RCU) synchronization.\n    MaximumWaitReason\n} KWAIT_REASON, *PKWAIT_REASON;\n\ntypedef enum _KPROFILE_SOURCE\n{\n    ProfileTime,\n    ProfileAlignmentFixup,\n    ProfileTotalIssues,\n    ProfilePipelineDry,\n    ProfileLoadInstructions,\n    ProfilePipelineFrozen,\n    ProfileBranchInstructions,\n    ProfileTotalNonissues,\n    ProfileDcacheMisses,\n    ProfileIcacheMisses,\n    ProfileCacheMisses,\n    ProfileBranchMispredictions,\n    ProfileStoreInstructions,\n    ProfileFpInstructions,\n    ProfileIntegerInstructions,\n    Profile2Issue,\n    Profile3Issue,\n    Profile4Issue,\n    ProfileSpecialInstructions,\n    ProfileTotalCycles,\n    ProfileIcacheIssues,\n    ProfileDcacheAccesses,\n    ProfileMemoryBarrierCycles,\n    ProfileLoadLinkedIssues,\n    ProfileMaximum\n} KPROFILE_SOURCE;\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCallbackReturn(\n    _In_reads_bytes_opt_(OutputLength) PVOID OutputBuffer,\n    _In_ ULONG OutputLength,\n    _In_ NTSTATUS Status\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_ BOOLEAN State\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtYieldExecution(\n    VOID\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntldr.h",
    "content": "/*\n * Loader support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTLDR_H\n#define _NTLDR_H\n\ntypedef struct _ACTIVATION_CONTEXT *PACTIVATION_CONTEXT;\ntypedef struct _LDRP_LOAD_CONTEXT *PLDRP_LOAD_CONTEXT;\n\n//\n// DLLs\n//\n\ntypedef _Function_class_(LDR_INIT_ROUTINE)\nBOOLEAN NTAPI LDR_INIT_ROUTINE(\n    _In_ PVOID DllHandle,\n    _In_ ULONG Reason,\n    _In_opt_ PVOID Context\n    );\ntypedef LDR_INIT_ROUTINE* PLDR_INIT_ROUTINE;\n\ntypedef struct _LDR_SERVICE_TAG_RECORD\n{\n    struct _LDR_SERVICE_TAG_RECORD *Next;\n    ULONG ServiceTag;\n} LDR_SERVICE_TAG_RECORD, *PLDR_SERVICE_TAG_RECORD;\n\ntypedef struct _LDRP_CSLIST\n{\n    PSINGLE_LIST_ENTRY Tail;\n} LDRP_CSLIST, *PLDRP_CSLIST;\n\ntypedef enum _LDR_DDAG_STATE\n{\n    LdrModulesMerged = -5,\n    LdrModulesInitError = -4,\n    LdrModulesSnapError = -3,\n    LdrModulesUnloaded = -2,\n    LdrModulesUnloading = -1,\n    LdrModulesPlaceHolder = 0,\n    LdrModulesMapping = 1,\n    LdrModulesMapped = 2,\n    LdrModulesWaitingForDependencies = 3,\n    LdrModulesSnapping = 4,\n    LdrModulesSnapped = 5,\n    LdrModulesCondensed = 6,\n    LdrModulesReadyToInit = 7,\n    LdrModulesInitializing = 8,\n    LdrModulesReadyToRun = 9\n} LDR_DDAG_STATE;\n\ntypedef struct _LDR_DDAG_NODE\n{\n    LIST_ENTRY Modules;\n    PLDR_SERVICE_TAG_RECORD ServiceTagList;\n    ULONG LoadCount;\n    ULONG LoadWhileUnloadingCount;\n    ULONG LowestLink;\n    union\n    {\n        LDRP_CSLIST Dependencies;\n        SINGLE_LIST_ENTRY RemovalLink;\n    };\n    LDRP_CSLIST IncomingDependencies;\n    LDR_DDAG_STATE State;\n    SINGLE_LIST_ENTRY CondenseLink;\n    ULONG PreorderNumber;\n} LDR_DDAG_NODE, *PLDR_DDAG_NODE;\n\n// rev\ntypedef struct _LDR_DEPENDENCY_RECORD\n{\n    SINGLE_LIST_ENTRY DependencyLink;\n    PLDR_DDAG_NODE DependencyNode;\n    SINGLE_LIST_ENTRY IncomingDependencyLink;\n    PLDR_DDAG_NODE IncomingDependencyNode;\n} LDR_DEPENDENCY_RECORD, *PLDR_DEPENDENCY_RECORD;\n\ntypedef enum _LDR_DLL_LOAD_REASON\n{\n    LoadReasonStaticDependency,\n    LoadReasonStaticForwarderDependency,\n    LoadReasonDynamicForwarderDependency,\n    LoadReasonDelayloadDependency,\n    LoadReasonDynamicLoad,\n    LoadReasonAsImageLoad,\n    LoadReasonAsDataLoad,\n    LoadReasonEnclavePrimary, // since REDSTONE3\n    LoadReasonEnclaveDependency,\n    LoadReasonPatchImage, // since WIN11\n    LoadReasonUnknown = -1\n} LDR_DLL_LOAD_REASON, *PLDR_DLL_LOAD_REASON;\n\ntypedef enum _LDR_HOT_PATCH_STATE\n{\n    LdrHotPatchBaseImage,\n    LdrHotPatchNotApplied,\n    LdrHotPatchAppliedReverse,\n    LdrHotPatchAppliedForward,\n    LdrHotPatchFailedToPatch,\n    LdrHotPatchStateMax,\n} LDR_HOT_PATCH_STATE, *PLDR_HOT_PATCH_STATE;\n\n// LDR_DATA_TABLE_ENTRY->Flags\n#define LDRP_PACKAGED_BINARY 0x00000001\n#define LDRP_MARKED_FOR_REMOVAL 0x00000002\n#define LDRP_IMAGE_DLL 0x00000004\n#define LDRP_LOAD_NOTIFICATIONS_SENT 0x00000008\n#define LDRP_TELEMETRY_ENTRY_PROCESSED 0x00000010\n#define LDRP_PROCESS_STATIC_IMPORT 0x00000020\n#define LDRP_IN_LEGACY_LISTS 0x00000040\n#define LDRP_IN_INDEXES 0x00000080\n#define LDRP_SHIM_DLL 0x00000100\n#define LDRP_IN_EXCEPTION_TABLE 0x00000200\n#define LDRP_LOAD_IN_PROGRESS 0x00001000\n#define LDRP_LOAD_CONFIG_PROCESSED 0x00002000\n#define LDRP_ENTRY_PROCESSED 0x00004000\n#define LDRP_PROTECT_DELAY_LOAD 0x00008000\n#define LDRP_DONT_CALL_FOR_THREADS 0x00040000\n#define LDRP_PROCESS_ATTACH_CALLED 0x00080000\n#define LDRP_PROCESS_ATTACH_FAILED 0x00100000\n#define LDRP_COR_DEFERRED_VALIDATE 0x00200000\n#define LDRP_COR_IMAGE 0x00400000\n#define LDRP_DONT_RELOCATE 0x00800000\n#define LDRP_COR_IL_ONLY 0x01000000\n#define LDRP_CHPE_IMAGE 0x02000000\n#define LDRP_CHPE_EMULATOR_IMAGE 0x04000000\n#define LDRP_REDIRECTED 0x10000000\n#define LDRP_COMPAT_DATABASE_PROCESSED 0x80000000\n\n#define LDR_DATA_TABLE_ENTRY_SIZE_WINXP FIELD_OFFSET(LDR_DATA_TABLE_ENTRY, DdagNode)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN7 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY, BaseNameHashValue)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN8 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY, ImplicitPathOptions)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN10 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY, SigningLevel)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN11 sizeof(LDR_DATA_TABLE_ENTRY)\n\n// symbols\ntypedef struct _LDR_DATA_TABLE_ENTRY\n{\n    LIST_ENTRY InLoadOrderLinks;\n    LIST_ENTRY InMemoryOrderLinks;\n    LIST_ENTRY InInitializationOrderLinks;\n    PVOID DllBase;\n    PLDR_INIT_ROUTINE EntryPoint;\n    ULONG SizeOfImage;\n    UNICODE_STRING FullDllName;\n    UNICODE_STRING BaseDllName;\n    union\n    {\n        UCHAR FlagGroup[4];\n        ULONG Flags;\n        struct\n        {\n            ULONG PackagedBinary : 1;\n            ULONG MarkedForRemoval : 1;\n            ULONG ImageDll : 1;\n            ULONG LoadNotificationsSent : 1;\n            ULONG TelemetryEntryProcessed : 1;\n            ULONG ProcessStaticImport : 1;\n            ULONG InLegacyLists : 1;\n            ULONG InIndexes : 1;\n            ULONG ShimDll : 1;\n            ULONG InExceptionTable : 1;\n            ULONG ReservedFlags1 : 2;\n            ULONG LoadInProgress : 1;\n            ULONG LoadConfigProcessed : 1;\n            ULONG EntryProcessed : 1;\n            ULONG ProtectDelayLoad : 1;\n            ULONG ReservedFlags3 : 2;\n            ULONG DontCallForThreads : 1;\n            ULONG ProcessAttachCalled : 1;\n            ULONG ProcessAttachFailed : 1;\n            ULONG CorDeferredValidate : 1;\n            ULONG CorImage : 1;\n            ULONG DontRelocate : 1;\n            ULONG CorILOnly : 1;\n            ULONG ChpeImage : 1;\n            ULONG ChpeEmulatorImage : 1;\n            ULONG ReservedFlags5 : 1;\n            ULONG Redirected : 1;\n            ULONG ReservedFlags6 : 2;\n            ULONG CompatDatabaseProcessed : 1;\n        };\n    };\n    USHORT ObsoleteLoadCount;\n    USHORT TlsIndex;\n    LIST_ENTRY HashLinks;\n    ULONG TimeDateStamp;\n    PACTIVATION_CONTEXT EntryPointActivationContext;\n    PVOID Lock; // RtlAcquireSRWLockExclusive\n    PLDR_DDAG_NODE DdagNode;\n    LIST_ENTRY NodeModuleLink;\n    PLDRP_LOAD_CONTEXT LoadContext;\n    PVOID ParentDllBase;\n    PVOID SwitchBackContext;\n    RTL_BALANCED_NODE BaseAddressIndexNode;\n    RTL_BALANCED_NODE MappingInfoIndexNode;\n    PVOID OriginalBase;\n    LARGE_INTEGER LoadTime;\n    ULONG BaseNameHashValue;\n    LDR_DLL_LOAD_REASON LoadReason; // since WIN8\n    ULONG ImplicitPathOptions;\n    ULONG ReferenceCount; // since WIN10\n    ULONG DependentLoadFlags;\n    UCHAR SigningLevel; // since REDSTONE2\n    ULONG CheckSum; // since 22H1\n    PVOID ActivePatchImageBase;\n    LDR_HOT_PATCH_STATE HotPatchState;\n} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;\n\n#define LDR_IS_DATAFILE(DllHandle) (((ULONG_PTR)(DllHandle)) & (ULONG_PTR)1)\n#define LDR_IS_IMAGEMAPPING(DllHandle) (((ULONG_PTR)(DllHandle)) & (ULONG_PTR)2)\n#define LDR_IS_RESOURCE(DllHandle) (LDR_IS_IMAGEMAPPING(DllHandle) || LDR_IS_DATAFILE(DllHandle))\n#define LDR_MAPPEDVIEW_TO_DATAFILE(BaseAddress) ((PVOID)(((ULONG_PTR)(BaseAddress)) | (ULONG_PTR)1))\n#define LDR_MAPPEDVIEW_TO_IMAGEMAPPING(BaseAddress) ((PVOID)(((ULONG_PTR)(BaseAddress)) | (ULONG_PTR)2))\n#define LDR_DATAFILE_TO_MAPPEDVIEW(DllHandle) ((PVOID)(((ULONG_PTR)(DllHandle)) & ~(ULONG_PTR)1))\n#define LDR_IMAGEMAPPING_TO_MAPPEDVIEW(DllHandle) ((PVOID)(((ULONG_PTR)(DllHandle)) & ~(ULONG_PTR)2))\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrLoadDll(\n    _In_opt_ PCWSTR DllPath,\n    _In_opt_ PULONG DllCharacteristics,\n    _In_ PCUNICODE_STRING DllName,\n    _Out_ PVOID *DllHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrUnloadDll(\n    _In_ PVOID DllHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllHandle(\n    _In_opt_ PCWSTR DllPath,\n    _In_opt_ PULONG DllCharacteristics,\n    _In_ PCUNICODE_STRING DllName,\n    _Out_ PVOID *DllHandle\n    );\n\n#define LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT 0x00000001\n#define LDR_GET_DLL_HANDLE_EX_PIN 0x00000002\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllHandleEx(\n    _In_ ULONG Flags,\n    _In_opt_ PCWSTR DllPath,\n    _In_opt_ PULONG DllCharacteristics,\n    _In_ PCUNICODE_STRING DllName,\n    _Out_ PVOID *DllHandle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllHandleByMapping(\n    _In_ PVOID BaseAddress,\n    _Out_ PVOID *DllHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllHandleByName(\n    _In_opt_ PCUNICODE_STRING BaseDllName,\n    _In_opt_ PCUNICODE_STRING FullDllName,\n    _Out_ PVOID *DllHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllFullName(\n    _In_ PVOID DllHandle,\n    _Out_ PUNICODE_STRING FullDllName\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllPath(\n    _In_  PCWSTR DllName,\n    _In_  ULONG  Flags, // LOAD_LIBRARY_SEARCH_*\n    _Out_ PWSTR* DllPath,\n    _Out_ PWSTR* SearchPaths\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetDllDirectory(\n    _Out_ PUNICODE_STRING DllDirectory\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrSetDllDirectory(\n    _In_ PCUNICODE_STRING DllDirectory\n    );\n#endif\n\n#define LDR_ADDREF_DLL_PIN 0x00000001\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrAddRefDll(\n    _In_ ULONG Flags,\n    _In_ PVOID DllHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetProcedureAddress(\n    _In_ PVOID DllHandle,\n    _In_opt_ PCANSI_STRING ProcedureName,\n    _In_opt_ ULONG ProcedureNumber,\n    _Out_ PVOID *ProcedureAddress\n    );\n\n// rev\n#define LDR_GET_PROCEDURE_ADDRESS_DONT_RECORD_FORWARDER 0x00000001\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetProcedureAddressEx(\n    _In_ PVOID DllHandle,\n    _In_opt_ PCANSI_STRING ProcedureName,\n    _In_opt_ ULONG ProcedureNumber,\n    _Out_ PVOID *ProcedureAddress,\n    _In_ ULONG Flags\n    );\n#endif\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetKnownDllSectionHandle(\n    _In_ PCWSTR DllName,\n    _In_ BOOLEAN KnownDlls32,\n    _Out_ PHANDLE Section\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetProcedureAddressForCaller(\n    _In_ PVOID DllHandle,\n    _In_opt_ PCANSI_STRING ProcedureName,\n    _In_opt_ ULONG ProcedureNumber,\n    _Out_ PVOID *ProcedureAddress,\n    _In_ ULONG Flags,\n    _In_ PVOID *Callback\n    );\n#endif\n\n#define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001\n#define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY 0x00000002\n\n#define LDR_LOCK_LOADER_LOCK_DISPOSITION_INVALID 0\n#define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED 1\n#define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED 2\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrLockLoaderLock(\n    _In_ ULONG Flags,\n    _Out_opt_ ULONG *Disposition,\n    _Out_opt_ PVOID *Cookie\n    );\n\n#define LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrUnlockLoaderLock(\n    _In_ ULONG Flags,\n    _In_opt_ PVOID Cookie\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrRelocateImage(\n    _In_ PVOID NewBase,\n    _In_opt_ PSTR LoaderName,\n    _In_ NTSTATUS Success,\n    _In_ NTSTATUS Conflict,\n    _In_ NTSTATUS Invalid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrRelocateImageWithBias(\n    _In_ PVOID NewBase,\n    _In_opt_ LONGLONG Bias,\n    _In_opt_ PSTR LoaderName,\n    _In_ NTSTATUS Success,\n    _In_ NTSTATUS Conflict,\n    _In_ NTSTATUS Invalid\n    );\n\nNTSYSAPI\nPIMAGE_BASE_RELOCATION\nNTAPI\nLdrProcessRelocationBlock(\n    _In_ ULONG_PTR VA,\n    _In_ ULONG SizeOfBlock,\n    _In_ PUSHORT NextOffset,\n    _In_ LONG_PTR Diff\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nPIMAGE_BASE_RELOCATION\nNTAPI\nLdrProcessRelocationBlockEx(\n    _In_ ULONG Machine, // IMAGE_FILE_MACHINE_AMD64|IMAGE_FILE_MACHINE_ARM|IMAGE_FILE_MACHINE_THUMB|IMAGE_FILE_MACHINE_ARMNT\n    _In_ ULONG_PTR VA,\n    _In_ ULONG SizeOfBlock,\n    _In_ PUSHORT NextOffset,\n    _In_ LONG_PTR Diff\n    );\n#endif\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrVerifyMappedImageMatchesChecksum(\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T NumberOfBytes,\n    _In_ ULONG FileLength\n    );\n\ntypedef _Function_class_(LDR_IMPORT_MODULE_CALLBACK)\nVOID NTAPI LDR_IMPORT_MODULE_CALLBACK(\n    _In_ PVOID Parameter,\n    _In_ PSTR ModuleName\n    );\ntypedef LDR_IMPORT_MODULE_CALLBACK* PLDR_IMPORT_MODULE_CALLBACK;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrVerifyImageMatchesChecksum(\n    _In_ HANDLE ImageFileHandle,\n    _In_opt_ PLDR_IMPORT_MODULE_CALLBACK ImportCallbackRoutine,\n    _In_ PVOID ImportCallbackParameter,\n    _Out_opt_ PUSHORT ImageCharacteristics\n    );\n\n// private\ntypedef struct _LDR_IMPORT_CALLBACK_INFO\n{\n    PLDR_IMPORT_MODULE_CALLBACK ImportCallbackRoutine;\n    PVOID ImportCallbackParameter;\n} LDR_IMPORT_CALLBACK_INFO, *PLDR_IMPORT_CALLBACK_INFO;\n\n// private\ntypedef struct _LDR_SECTION_INFO\n{\n    HANDLE SectionHandle;\n    ACCESS_MASK DesiredAccess;\n    POBJECT_ATTRIBUTES ObjA;\n    ULONG SectionPageProtection;\n    ULONG AllocationAttributes;\n} LDR_SECTION_INFO, *PLDR_SECTION_INFO;\n\n// private\ntypedef struct _LDR_VERIFY_IMAGE_INFO\n{\n    ULONG Size;\n    ULONG Flags;\n    LDR_IMPORT_CALLBACK_INFO CallbackInfo;\n    LDR_SECTION_INFO SectionInfo;\n    USHORT ImageCharacteristics;\n} LDR_VERIFY_IMAGE_INFO, *PLDR_VERIFY_IMAGE_INFO;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrVerifyImageMatchesChecksumEx(\n    _In_ HANDLE ImageFileHandle,\n    _Inout_ PLDR_VERIFY_IMAGE_INFO VerifyInfo\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryModuleServiceTags(\n    _In_ PVOID DllHandle,\n    _Out_writes_(*BufferSize) PULONG ServiceTagBuffer,\n    _Inout_ PULONG BufferSize\n    );\n#endif\n\n// begin_msdn:\"DLL Load Notification\"\n\n#define LDR_DLL_NOTIFICATION_REASON_LOADED 1\n#define LDR_DLL_NOTIFICATION_REASON_UNLOADED 2\n\ntypedef struct _LDR_DLL_LOADED_NOTIFICATION_DATA\n{\n    ULONG Flags;\n    PUNICODE_STRING FullDllName;\n    PUNICODE_STRING BaseDllName;\n    PVOID DllBase;\n    ULONG SizeOfImage;\n} LDR_DLL_LOADED_NOTIFICATION_DATA, *PLDR_DLL_LOADED_NOTIFICATION_DATA;\n\ntypedef struct _LDR_DLL_UNLOADED_NOTIFICATION_DATA\n{\n    ULONG Flags;\n    PCUNICODE_STRING FullDllName;\n    PCUNICODE_STRING BaseDllName;\n    PVOID DllBase;\n    ULONG SizeOfImage;\n} LDR_DLL_UNLOADED_NOTIFICATION_DATA, *PLDR_DLL_UNLOADED_NOTIFICATION_DATA;\n\ntypedef union _LDR_DLL_NOTIFICATION_DATA\n{\n    LDR_DLL_LOADED_NOTIFICATION_DATA Loaded;\n    LDR_DLL_UNLOADED_NOTIFICATION_DATA Unloaded;\n} LDR_DLL_NOTIFICATION_DATA, *PLDR_DLL_NOTIFICATION_DATA;\n\ntypedef const LDR_DLL_NOTIFICATION_DATA *PCLDR_DLL_NOTIFICATION_DATA;\n\ntypedef _Function_class_(LDR_DLL_NOTIFICATION_FUNCTION)\nVOID NTAPI LDR_DLL_NOTIFICATION_FUNCTION(\n    _In_ ULONG NotificationReason,\n    _In_ PCLDR_DLL_NOTIFICATION_DATA NotificationData,\n    _In_opt_ PVOID Context\n    );\ntypedef LDR_DLL_NOTIFICATION_FUNCTION* PLDR_DLL_NOTIFICATION_FUNCTION;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Registers for notification when a DLL is first loaded. This notification occurs before dynamic linking takes place.\n *\n * @param Flags This parameter must be zero.\n * @param NotificationFunction A pointer to an LdrDllNotification notification callback function to call when the DLL is loaded.\n * @param Context A pointer to context data for the callback function.\n * @param Cookie A pointer to a variable to receive an identifier for the callback function. This identifier is used to unregister the notification callback function.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/devnotes/ldrregisterdllnotification\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrRegisterDllNotification(\n    _In_ ULONG Flags,\n    _In_ PLDR_DLL_NOTIFICATION_FUNCTION NotificationFunction,\n    _In_opt_ PVOID Context,\n    _Out_ PVOID *Cookie\n    );\n\n/**\n * Cancels DLL load notification previously registered by calling the LdrRegisterDllNotification function.\n *\n * @param Cookie A pointer to the callback identifier received from the LdrRegisterDllNotification call that registered for notification.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/devnotes/ldrunregisterdllnotification\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrUnregisterDllNotification(\n    _In_ PVOID Cookie\n    );\n#endif\n\n// end_msdn\n\n// rev\nNTSYSAPI\nPUNICODE_STRING\nNTAPI\nLdrStandardizeSystemPath(\n    _In_ PCUNICODE_STRING SystemPath\n    );\n\ntypedef struct _LDR_FAILURE_DATA\n{\n    NTSTATUS Status;\n    WCHAR DllName[0x20];\n    WCHAR AdditionalInfo[0x20];\n} LDR_FAILURE_DATA, *PLDR_FAILURE_DATA;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\nNTSYSAPI\nPLDR_FAILURE_DATA\nNTAPI\nLdrGetFailureData(\n    VOID\n    );\n#endif\n\n// private\ntypedef struct _PS_MITIGATION_OPTIONS_MAP\n{\n    ULONG_PTR Map[3]; // 2 < 20H1\n} PS_MITIGATION_OPTIONS_MAP, *PPS_MITIGATION_OPTIONS_MAP;\n\n// private\ntypedef struct _PS_MITIGATION_AUDIT_OPTIONS_MAP\n{\n    ULONG_PTR Map[3]; // 2 < 20H1\n} PS_MITIGATION_AUDIT_OPTIONS_MAP, *PPS_MITIGATION_AUDIT_OPTIONS_MAP;\n\n// private\ntypedef struct _PS_SYSTEM_DLL_INIT_BLOCK\n{\n    ULONG Size;\n    ULONG_PTR SystemDllWowRelocation;\n    ULONG_PTR SystemDllNativeRelocation;\n    ULONG_PTR Wow64SharedInformation[16]; // use WOW64_SHARED_INFORMATION as index\n    ULONG RngData;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG CfgOverride : 1;\n            ULONG Reserved : 31;\n        };\n    };\n    PS_MITIGATION_OPTIONS_MAP MitigationOptionsMap;\n    ULONG_PTR CfgBitMap;\n    ULONG_PTR CfgBitMapSize;\n    ULONG_PTR Wow64CfgBitMap;\n    ULONG_PTR Wow64CfgBitMapSize;\n    PS_MITIGATION_AUDIT_OPTIONS_MAP MitigationAuditOptionsMap; // REDSTONE3\n    ULONG_PTR ScpCfgCheckFunction; // since 24H2\n    ULONG_PTR ScpCfgCheckESFunction;\n    ULONG_PTR ScpCfgDispatchFunction;\n    ULONG_PTR ScpCfgDispatchESFunction;\n    ULONG_PTR ScpArm64EcCallCheck;\n    ULONG_PTR ScpArm64EcCfgCheckFunction;\n    ULONG_PTR ScpArm64EcCfgCheckESFunction;\n} PS_SYSTEM_DLL_INIT_BLOCK, *PPS_SYSTEM_DLL_INIT_BLOCK;\n\n// rev\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI PS_SYSTEM_DLL_INIT_BLOCK LdrSystemDllInitBlock;\n#endif\n\n#define PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V1 \\\n    RTL_SIZEOF_THROUGH_FIELD(PS_SYSTEM_DLL_INIT_BLOCK, MitigationAuditOptionsMap)\n#define PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V2 \\\n    RTL_SIZEOF_THROUGH_FIELD(PS_SYSTEM_DLL_INIT_BLOCK, ScpArm64EcCfgCheckESFunction)\n\n//static_assert(PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V1 == 240, \"PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V1 must equal 240\");\n//static_assert(PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V2 == 296, \"PS_SYSTEM_DLL_INIT_BLOCK_SIZE_V2 must equal 296\");\n\n// rev see also MEMORY_IMAGE_EXTENSION_INFORMATION\ntypedef struct _RTL_SCPCFG_NTDLL_EXPORTS\n{\n    PVOID ScpCfgHeader_Nop;\n    PVOID ScpCfgEnd_Nop;\n    PVOID ScpCfgHeader;\n    PVOID ScpCfgEnd;\n    PVOID ScpCfgHeader_ES;\n    PVOID ScpCfgEnd_ES;\n    PVOID ScpCfgHeader_Fptr;\n    PVOID ScpCfgEnd_Fptr;\n    PVOID LdrpGuardDispatchIcallNoESFptr;\n    PVOID __guard_dispatch_icall_fptr;\n    PVOID LdrpGuardCheckIcallNoESFptr;\n    PVOID __guard_check_icall_fptr;\n    PVOID LdrpHandleInvalidUserCallTarget;\n    struct\n    {\n        PVOID NtOpenFile;\n        PVOID NtCreateSection;\n        PVOID NtQueryAttributesFile;\n        PVOID NtOpenSection;\n        PVOID NtMapViewOfSection;\n    } LdrpCriticalLoaderFunctions;\n} RTL_SCPCFG_NTDLL_EXPORTS, *PRTL_SCPCFG_NTDLL_EXPORTS;\n\n// rev\n#if (PHNT_VERSION >= PHNT_WINDOWS_11_24H2)\nNTSYSAPI RTL_SCPCFG_NTDLL_EXPORTS RtlpScpCfgNtdllExports;\n#endif\n\n//\n// Load as data table\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrAddLoadAsDataTable(\n    _In_ PVOID Module,\n    _In_ PCWSTR FilePath,\n    _In_ SIZE_T Size,\n    _In_ HANDLE Handle,\n    _In_opt_ PACTIVATION_CONTEXT ActCtx\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrRemoveLoadAsDataTable(\n    _In_ PVOID InitModule,\n    _Out_opt_ PVOID *BaseModule,\n    _Out_opt_ PSIZE_T Size,\n    _In_ ULONG Flags\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrGetFileNameFromLoadAsDataTable(\n    _In_ PVOID Module,\n    _Out_ PVOID *pFileNamePrt\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrDisableThreadCalloutsForDll(\n    _In_ PVOID DllImageBase\n    );\n\n//\n// Resources\n//\n\n/**\n * The LdrAccessResource function returns a pointer to the first byte of the specified resource in memory.\n *\n * @param DllHandle A handle to the DLL.\n * @param ResourceDataEntry The resource information block.\n * @param ResourceBuffer The pointer to the specified resource in memory.\n * @param ResourceLength The size, in bytes, of the specified resource.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadresource\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrAccessResource(\n    _In_ PVOID DllHandle,\n    _In_ PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry,\n    _Out_opt_ PVOID *ResourceBuffer,\n    _Out_opt_ ULONG *ResourceLength\n    );\n\ntypedef struct _LDR_RESOURCE_INFO\n{\n    ULONG_PTR Type;\n    ULONG_PTR Name;\n    ULONG_PTR Language;\n} LDR_RESOURCE_INFO, *PLDR_RESOURCE_INFO;\n\n#define RESOURCE_TYPE_LEVEL 0\n#define RESOURCE_NAME_LEVEL 1\n#define RESOURCE_LANGUAGE_LEVEL 2\n#define RESOURCE_DATA_LEVEL 3\n\n/**\n * The LdrFindResource_U function determines the location of a resource in a DLL.\n *\n * @param DllHandle A handle to the DLL.\n * @param ResourceInfo The type and name of the resource.\n * @param Level The level of resource information.\n * @param ResourceDataEntry The resource information block.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-findresourceexw\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrFindResource_U(\n    _In_ PVOID DllHandle,\n    _In_ PLDR_RESOURCE_INFO ResourceInfo,\n    _In_ ULONG Level,\n    _Out_ PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrFindResourceEx_U(\n    _In_ ULONG Flags,\n    _In_ PVOID DllHandle,\n    _In_ PLDR_RESOURCE_INFO ResourceInfo,\n    _In_ ULONG Level,\n    _Out_ PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrFindResourceDirectory_U(\n    _In_ PVOID DllHandle,\n    _In_ PLDR_RESOURCE_INFO ResourceInfo,\n    _In_ ULONG Level,\n    _Out_ PIMAGE_RESOURCE_DIRECTORY *ResourceDirectory\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n/**\n * The LdrResFindResource function finds a resource in a DLL.\n *\n * @param DllHandle A handle to the DLL.\n * @param Type The type of the resource.\n * @param Name The name of the resource.\n * @param Language The language of the resource.\n * @param ResourceBuffer An optional pointer to receive the resource buffer.\n * @param ResourceLength An optional pointer to receive the resource length.\n * @param CultureName An optional buffer to receive the culture name.\n * @param CultureNameLength An optional pointer to receive the length of the culture name.\n * @param Flags Flags for the resource search.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResFindResource(\n    _In_ PVOID DllHandle,\n    _In_ ULONG_PTR Type,\n    _In_ ULONG_PTR Name,\n    _In_ ULONG_PTR Language,\n    _Out_opt_ PVOID* ResourceBuffer,\n    _Out_opt_ PULONG ResourceLength,\n    _Out_writes_bytes_opt_(CultureNameLength) PVOID CultureName, // WCHAR buffer[6]\n    _Out_opt_ PULONG CultureNameLength,\n    _In_ ULONG Flags\n    );\n\n/**\n * The LdrResFindResourceDirectory function finds a resource directory in a DLL.\n *\n * @param DllHandle A handle to the DLL.\n * @param Type The type of the resource.\n * @param Name The name of the resource.\n * @param ResourceDirectory An optional pointer to receive the resource directory.\n * @param CultureName An optional buffer to receive the culture name.\n * @param CultureNameLength An optional pointer to receive the length of the culture name.\n * @param Flags Flags for the resource search.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResFindResourceDirectory(\n    _In_ PVOID DllHandle,\n    _In_ ULONG_PTR Type,\n    _In_ ULONG_PTR Name,\n    _Out_opt_ PIMAGE_RESOURCE_DIRECTORY* ResourceDirectory,\n    _Out_writes_bytes_opt_(CultureNameLength) PVOID CultureName, // WCHAR buffer[6]\n    _Out_opt_ PULONG CultureNameLength,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrpResGetResourceDirectory(\n    _In_ PVOID DllHandle,\n    _In_ SIZE_T Size,\n    _In_ ULONG Flags,\n    _Out_opt_ PIMAGE_RESOURCE_DIRECTORY* ResourceDirectory,\n    _Out_ PIMAGE_NT_HEADERS* OutHeaders\n    );\n\n/**\n* The LdrResSearchResource function searches for a resource in a DLL.\n*\n* @param DllHandle A handle to the DLL.\n* @param ResourceInfo A pointer to the resource information.\n* @param Level The level of the resource.\n* @param Flags Flags for the resource search.\n* @param ResourceBuffer An optional pointer to receive the resource buffer.\n* @param ResourceLength An optional pointer to receive the resource length.\n* @param CultureName An optional buffer to receive the culture name.\n* @param CultureNameLength An optional pointer to receive the length of the culture name.\n* @return NTSTATUS Successful or errant status.\n*/\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResSearchResource(\n    _In_ PVOID DllHandle,\n    _In_ PLDR_RESOURCE_INFO ResourceInfo,\n    _In_ ULONG Level,\n    _In_ ULONG Flags,\n    _Out_opt_ PVOID* ResourceBuffer,\n    _Out_opt_ PSIZE_T ResourceLength,\n    _Out_writes_bytes_opt_(CultureNameLength) PVOID CultureName, // WCHAR buffer[6]\n    _Out_opt_ PULONG CultureNameLength\n    );\n\n/**\n * The LdrResGetRCConfig function retrieves the RC configuration for a DLL.\n *\n * @param DllHandle A handle to the DLL.\n * @param Length The length of the configuration buffer.\n * @param Config A buffer to receive the configuration.\n * @param Flags Flags for the operation.\n * @param AlternateResource Indicates if an alternate resource should be loaded.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResGetRCConfig(\n    _In_ PVOID DllHandle,\n    _In_opt_ SIZE_T Length,\n    _Out_writes_bytes_opt_(Length) PVOID Config,\n    _In_ ULONG Flags,\n    _In_ BOOLEAN AlternateResource // LdrLoadAlternateResourceModule\n    );\n\n/**\n * The LdrResRelease function releases a resource in a DLL.\n *\n * @param DllHandle A handle to the DLL.\n * @param CultureNameOrId An optional culture name or ID.\n * @param Flags Flags for the operation.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResRelease(\n    _In_ PVOID DllHandle,\n    _In_opt_ ULONG_PTR CultureNameOrId, // MAKEINTRESOURCE\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n// private\ntypedef struct _LDR_ENUM_RESOURCE_ENTRY\n{\n    union\n    {\n        ULONG_PTR NameOrId;\n        PIMAGE_RESOURCE_DIRECTORY_STRING Name;\n        struct\n        {\n            USHORT Id;\n            USHORT NameIsPresent;\n        };\n    } Path[3];\n    PVOID Data;\n    ULONG Size;\n    ULONG Reserved;\n} LDR_ENUM_RESOURCE_ENTRY, *PLDR_ENUM_RESOURCE_ENTRY;\n\n#define NAME_FROM_RESOURCE_ENTRY(RootDirectory, Entry) \\\n    ((Entry)->NameIsString ? (ULONG_PTR)((ULONG_PTR)(RootDirectory) + (ULONG_PTR)((Entry)->NameOffset)) : (Entry)->Id)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrEnumResources(\n    _In_ PVOID DllHandle,\n    _In_ PLDR_RESOURCE_INFO ResourceInfo,\n    _In_ ULONG Level,\n    _Inout_ ULONG *ResourceCount,\n    _Out_writes_to_opt_(*ResourceCount, *ResourceCount) PLDR_ENUM_RESOURCE_ENTRY Resources\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrFindEntryForAddress(\n    _In_ PVOID DllHandle,\n    _Out_ PLDR_DATA_TABLE_ENTRY *Entry\n    );\n\n// rev\n/**\n * Returns a handle to the language-specific dynamic-link library (DLL) resource module associated with a DLL that is already loaded for the calling process.\n *\n * \\param DllHandle A handle to the DLL module to search for a MUI resource. If the language-specific DLL for the MUI is available, loads the specified module into the address space of the calling process and returns a handle to the module.\n * \\param BaseAddress The base address of the mapped view.\n * \\param Size The size of the mapped view.\n * \\param Flags Reserved\n * \\return Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrLoadAlternateResourceModule(\n    _In_ PVOID DllHandle,\n    _Out_ PVOID *BaseAddress,\n    _Out_opt_ SIZE_T *Size,\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrLoadAlternateResourceModuleEx(\n    _In_ PVOID DllHandle,\n    _In_ LANGID LanguageId,\n    _Out_ PVOID *BaseAddress,\n    _Out_opt_ SIZE_T *Size,\n    _In_ ULONG Flags\n    );\n\n// rev\n/**\n * Frees the language-specific dynamic-link library (DLL) resource module previously loaded by LdrLoadAlternateResourceModule function.\n *\n * @param DllHandle The base address of the mapped view.\n * @return Successful or errant status.\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrUnloadAlternateResourceModule(\n    _In_ PVOID DllHandle\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrUnloadAlternateResourceModuleEx(\n    _In_ PVOID DllHandle,\n    _In_ ULONG Flags\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Module information\n//\n\ntypedef struct _RTL_PROCESS_MODULE_INFORMATION\n{\n    PVOID Section;\n    PVOID MappedBase;\n    PVOID ImageBase;\n    ULONG ImageSize;\n    ULONG Flags;\n    USHORT LoadOrderIndex;\n    USHORT InitOrderIndex;\n    USHORT LoadCount;\n    USHORT OffsetToFileName;\n    UCHAR FullPathName[256];\n} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;\n\ntypedef struct _RTL_PROCESS_MODULES\n{\n    ULONG NumberOfModules;\n    _Field_size_(NumberOfModules) RTL_PROCESS_MODULE_INFORMATION Modules[1];\n} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;\n\n// private\ntypedef struct _RTL_PROCESS_MODULE_INFORMATION_EX\n{\n    USHORT NextOffset;\n    union\n    {\n        RTL_PROCESS_MODULE_INFORMATION BaseInfo;\n        struct\n        {\n            PVOID Section;\n            PVOID MappedBase;\n            PVOID ImageBase;\n            ULONG ImageSize;\n            ULONG Flags;\n            USHORT LoadOrderIndex;\n            USHORT InitOrderIndex;\n            USHORT LoadCount;\n            USHORT OffsetToFileName;\n            UCHAR FullPathName[256];\n        };\n    };\n    ULONG ImageChecksum;\n    ULONG TimeDateStamp;\n    PVOID DefaultBase;\n} RTL_PROCESS_MODULE_INFORMATION_EX, *PRTL_PROCESS_MODULE_INFORMATION_EX;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryProcessModuleInformation(\n    _In_opt_ PRTL_PROCESS_MODULES ModuleInformation,\n    _In_opt_ ULONG Size,\n    _Out_ PULONG ReturnedSize\n    );\n\ntypedef _Function_class_(LDR_ENUM_CALLBACK)\nVOID NTAPI LDR_ENUM_CALLBACK(\n    _In_ PLDR_DATA_TABLE_ENTRY ModuleInformation,\n    _In_ PVOID Parameter,\n    _Out_ BOOLEAN* Stop\n    );\ntypedef LDR_ENUM_CALLBACK* PLDR_ENUM_CALLBACK;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrEnumerateLoadedModules(\n    _In_ BOOLEAN ReservedFlag,\n    _In_ PLDR_ENUM_CALLBACK EnumProc,\n    _In_ PVOID Context\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrOpenImageFileOptionsKey(\n    _In_ PCUNICODE_STRING SubKey,\n    _In_ BOOLEAN Wow64,\n    _Out_ PHANDLE NewKeyHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryImageFileKeyOption(\n    _In_ HANDLE KeyHandle,\n    _In_ PCWSTR ValueName,\n    _In_ ULONG Type,\n    _Out_ PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _Out_opt_ PULONG ReturnedLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryImageFileExecutionOptions(\n    _In_ PCUNICODE_STRING SubKey,\n    _In_ PCWSTR ValueName,\n    _In_ ULONG ValueSize,\n    _Out_ PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _Out_opt_ PULONG ReturnedLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryImageFileExecutionOptionsEx(\n    _In_ PCUNICODE_STRING SubKey,\n    _In_ PCWSTR ValueName,\n    _In_ ULONG Type,\n    _Out_ PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _Out_opt_ PULONG ReturnedLength,\n    _In_ BOOLEAN Wow64\n    );\n\n// private\ntypedef struct _DELAYLOAD_PROC_DESCRIPTOR\n{\n    ULONG ImportDescribedByName;\n    union\n    {\n        PCSTR Name;\n        ULONG Ordinal;\n    } Description;\n} DELAYLOAD_PROC_DESCRIPTOR, *PDELAYLOAD_PROC_DESCRIPTOR;\n\n// private\ntypedef struct _DELAYLOAD_INFO\n{\n    ULONG Size;\n    PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor;\n    PIMAGE_THUNK_DATA ThunkAddress;\n    PCSTR TargetDllName;\n    DELAYLOAD_PROC_DESCRIPTOR TargetApiDescriptor;\n    PVOID TargetModuleBase;\n    PVOID Unused;\n    ULONG LastError;\n} DELAYLOAD_INFO, *PDELAYLOAD_INFO;\n\n// private\ntypedef _Function_class_(DELAYLOAD_FAILURE_DLL_CALLBACK)\nPVOID NTAPI DELAYLOAD_FAILURE_DLL_CALLBACK(\n    _In_ ULONG NotificationReason,\n    _In_ PDELAYLOAD_INFO DelayloadInfo\n    );\ntypedef DELAYLOAD_FAILURE_DLL_CALLBACK* PDELAYLOAD_FAILURE_DLL_CALLBACK;\n\n// rev\ntypedef _Function_class_(DELAYLOAD_FAILURE_SYSTEM_ROUTINE)\nPVOID NTAPI DELAYLOAD_FAILURE_SYSTEM_ROUTINE(\n    _In_ PCSTR DllName,\n    _In_ PCSTR ProcedureName\n    );\ntypedef DELAYLOAD_FAILURE_SYSTEM_ROUTINE* PDELAYLOAD_FAILURE_SYSTEM_ROUTINE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev from QueryOptionalDelayLoadedAPI\n/**\n * Determines whether the specified function in a delay-loaded DLL is available on the system.\n *\n * @param ParentModuleBase A handle to the calling module. (NtCurrentImageBase)\n * @param DllName The file name of the delay-loaded DLL that exports the specified function. This parameter is case-insensitive.\n * @param ProcedureName The address of a delay-load failure callback function for the specified DLL and process.\n * @param Flags Reserved; must be 0.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi2/nf-libloaderapi2-queryoptionaldelayloadedapi\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrQueryOptionalDelayLoadedAPI(\n    _In_ PVOID ParentModuleBase,\n    _In_ PCSTR DllName,\n    _In_ PCSTR ProcedureName,\n    _Reserved_ ULONG Flags\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev from ResolveDelayLoadedAPI\n/**\n * Locates the target function of the specified import and replaces the function pointer in the import thunk with the target of the function implementation.\n *\n * @param ParentModuleBase The address of the base of the module importing a delay-loaded function. (NtCurrentImageBase)\n * @param DelayloadDescriptor The address of the image delay import directory for the module to be loaded.\n * @param FailureDllHook The address of a delay-load failure callback function for the specified DLL and process.\n * @param FailureSystemHook The address of a delay-load failure callback function for the specified DLL and process.\n * @param ThunkAddress The thunk data for the target function. Used to find the specific name table entry of the function.\n * @param Flags Reserved; must be 0.\n * @return The address of the import, or the failure stub for it.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/devnotes/resolvedelayloadedapi\n */\nNTSYSAPI\nPVOID\nNTAPI\nLdrResolveDelayLoadedAPI(\n    _In_ PVOID ParentModuleBase,\n    _In_ PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor,\n    _In_opt_ PDELAYLOAD_FAILURE_DLL_CALLBACK FailureDllHook,\n    _In_opt_ PDELAYLOAD_FAILURE_SYSTEM_ROUTINE FailureSystemHook, // kernel32.DelayLoadFailureHook\n    _Out_ PIMAGE_THUNK_DATA ThunkAddress,\n    _Reserved_ ULONG Flags\n    );\n\n// rev from ResolveDelayLoadsFromDll\n/**\n * Forwards the work in resolving delay-loaded imports from the parent binary to a target binary.\n *\n * @param [in] ParentModuleBase The base address of the module that delay loads another binary.\n * @param [in] TargetDllName The name of the target DLL.\n * @param [in] Flags Reserved; must be 0.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/devnotes/resolvedelayloadsfromdll\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrResolveDelayLoadsFromDll(\n    _In_ PVOID ParentModuleBase,\n    _In_ PCSTR TargetDllName,\n    _Reserved_ ULONG Flags\n    );\n\n// rev from SetDefaultDllDirectories\n/**\n * Specifies a default set of directories to search when the calling process loads a DLL.\n *\n * @param [in] DirectoryFlags The directories to search.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-setdefaultdlldirectories\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrSetDefaultDllDirectories(\n    _In_ ULONG DirectoryFlags\n    );\n\n// rev from AddDllDirectory\n/**\n * Adds a directory to the process DLL search path.\n *\n * @param [in] NewDirectory An absolute path to the directory to add to the search path. For example, to add the directory Dir2 to the process DLL search path, specify \\Dir2.\n * @param [out] Cookie An opaque pointer that can be passed to RemoveDllDirectory to remove the DLL from the process DLL search path.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-adddlldirectory\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrAddDllDirectory(\n    _In_ PCUNICODE_STRING NewDirectory,\n    _Out_ PDLL_DIRECTORY_COOKIE Cookie\n    );\n\n// rev from RemoveDllDirectory\n/**\n * Removes a directory that was added to the process DLL search path by using LdrAddDllDirectory.\n *\n * @param [in] Cookie The cookie returned by LdrAddDllDirectory when the directory was added to the search path.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-removedlldirectory\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrRemoveDllDirectory(\n    _In_ DLL_DIRECTORY_COOKIE Cookie\n    );\n#endif\n\n// rev\n_Analysis_noreturn_\nDECLSPEC_NORETURN\nNTSYSAPI\nVOID\nNTAPI\nLdrShutdownProcess(\n    VOID\n    );\n\n// rev\n_Analysis_noreturn_\nDECLSPEC_NORETURN\nNTSYSAPI\nVOID\nNTAPI\nLdrShutdownThread(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrSetImplicitPathOptions(\n    _In_ ULONG ImplicitPathOptions\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n#ifdef PHNT_INLINE_TYPEDEFS\n/**\n * The LdrControlFlowGuardEnforced function checks if Control Flow Guard is enforced.\n *\n * @return BOOLEAN TRUE if Control Flow Guard is enforced, FALSE otherwise.\n */\nFORCEINLINE\nBOOLEAN\nNTAPI\nLdrControlFlowGuardEnforced(\n    VOID\n    )\n{\n    return LdrSystemDllInitBlock.CfgBitMap && (LdrSystemDllInitBlock.Flags & 1) == 0;\n}\n#else\n// rev\n/**\n * The LdrControlFlowGuardEnforced function checks if Control Flow Guard is enforced.\n *\n * @return BOOLEAN TRUE if Control Flow Guard is enforced, FALSE otherwise.\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrControlFlowGuardEnforced(\n    VOID\n    );\n#endif\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n/**\n * The LdrControlFlowGuardEnforcedWithExportSuppression function checks if Control Flow Guard is\n * enforced with export suppression.\n *\n * @return BOOLEAN TRUE if Control Flow Guard is enforced, FALSE otherwise.\n */\nFORCEINLINE\nBOOLEAN\nNTAPI\nLdrControlFlowGuardEnforcedWithExportSuppression(\n    VOID\n    )\n{\n    return LdrSystemDllInitBlock.CfgBitMap\n        && (LdrSystemDllInitBlock.Flags & 1) == 0\n        && (LdrSystemDllInitBlock.MitigationOptionsMap.Map[0] & 3) == 3; // PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_EXPORT_SUPPRESSION\n}\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_19H1)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrIsModuleSxsRedirected(\n    _In_ PVOID DllHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrUpdatePackageSearchPath(\n    _In_ PCWSTR SearchPath\n    );\n#endif\n\n// rev\n#define ENCLAVE_STATE_CREATED         0x00000000ul // LdrpCreateSoftwareEnclave initial state\n#define ENCLAVE_STATE_INITIALIZED     0x00000001ul // ZwInitializeEnclave successful (LdrInitializeEnclave)\n#define ENCLAVE_STATE_INITIALIZED_VBS 0x00000002ul // only for ENCLAVE_TYPE_VBS (LdrInitializeEnclave)\n\n// rev\ntypedef struct _LDR_SOFTWARE_ENCLAVE\n{\n    LIST_ENTRY Links; // ntdll!LdrpEnclaveList\n    RTL_CRITICAL_SECTION CriticalSection;\n    ULONG EnclaveType; // ENCLAVE_TYPE_*\n    LONG ReferenceCount;\n    ULONG EnclaveState; // ENCLAVE_STATE_*\n    PVOID BaseAddress;\n    SIZE_T Size;\n    PVOID PreviousBaseAddress;\n    LIST_ENTRY Modules; // LDR_DATA_TABLE_ENTRY.InLoadOrderLinks\n    PLDR_DATA_TABLE_ENTRY PrimaryModule;\n    PLDR_DATA_TABLE_ENTRY BCryptModule;\n    PLDR_DATA_TABLE_ENTRY BCryptPrimitivesModule;\n} LDR_SOFTWARE_ENCLAVE, *PLDR_SOFTWARE_ENCLAVE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// rev from CreateEnclave\n/**\n * Creates a new uninitialized enclave. An enclave is an isolated region of code and data within the address space for an application. Only code that runs within the enclave can access data within the same enclave.\n *\n * @param ProcessHandle A handle to the process for which you want to create an enclave.\n * @param BaseAddress The preferred base address of the enclave. Specify NULL to have the operating system assign the base address.\n * @param Reserved Reserved.\n * @param Size The size of the enclave that you want to create, including the size of the code that you will load into the enclave, in bytes.\n * @param InitialCommitment The amount of memory to commit for the enclave, in bytes. This parameter is not used for virtualization-based security (VBS) enclaves.\n * @param EnclaveType The architecture type of the enclave that you want to create. To verify that an enclave type is supported, call IsEnclaveTypeSupported.\n * @param EnclaveInformation A pointer to the architecture-specific information to use to create the enclave.\n * @param EnclaveInformationLength The length of the structure that the EnclaveInformation parameter points to, in bytes.\n * For the ENCLAVE_TYPE_SGX and ENCLAVE_TYPE_SGX2 enclave types, this value must be 4096. For the ENCLAVE_TYPE_VBS enclave type, this value must be sizeof(ENCLAVE_CREATE_INFO_VBS), which is 36 bytes.\n * @param EnclaveError An optional pointer to a variable that receives an enclave error code that is architecture-specific.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-createenclave\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrCreateEnclave(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID* BaseAddress,\n    _In_ ULONG Reserved,\n    _In_ SIZE_T Size,\n    _In_ SIZE_T InitialCommitment,\n    _In_ ULONG EnclaveType,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_ PULONG EnclaveError\n    );\n\n// rev from InitializeEnclave\n/**\n * Initializes an enclave that you created and loaded with data.\n *\n * @param ProcessHandle A handle to the process for which the enclave was created.\n * @param BaseAddress Any address within the enclave.\n * @param EnclaveInformation A pointer to the architecture-specific information to use to initialize the enclave.\n * @param EnclaveInformationLength The length of the structure that the EnclaveInformation parameter points to, in bytes.\n * For the ENCLAVE_TYPE_SGX and ENCLAVE_TYPE_SGX2 enclave types, this value must be 4096. For the ENCLAVE_TYPE_VBS enclave type, this value must be sizeof(ENCLAVE_CREATE_INFO_VBS), which is 36 bytes.\n * @param EnclaveError An optional pointer to a variable that receives an enclave error code that is architecture-specific.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-initializeenclave\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrInitializeEnclave(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_ PULONG EnclaveError\n    );\n\n// rev from DeleteEnclave\n/**\n * Deletes the specified enclave.\n *\n * @param BaseAddress The base address of the enclave that you want to delete.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-deleteenclave\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrDeleteEnclave(\n    _In_ PVOID BaseAddress\n    );\n\n// rev from CallEnclave\n/**\n * Calls a function within an enclave. LdrCallEnclave can also be called within an enclave to call a function outside of the enclave.\n *\n * @param Routine The address of the function that you want to call.\n * @param Flags The flags to modify the call function.\n * @param RoutineParamReturn The parameter than you want to pass to the function.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-callenclave\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrCallEnclave(\n    _In_ PENCLAVE_ROUTINE Routine,\n    _In_ ULONG Flags, // ENCLAVE_CALL_FLAG_*\n    _Inout_ PVOID* RoutineParamReturn\n    );\n\n// rev from LoadEnclaveImage\n/**\n * Loads an image and all of its imports into an enclave.\n *\n * @param BaseAddress The base address of the image into which to load the image.\n * @param DllPath A NULL-terminated string that contains the path of the image to load.\n * @param DllName A NULL-terminated string that contains the name of the image to load.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-loadenclaveimagew\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrLoadEnclaveModule(\n    _In_ PVOID BaseAddress,\n    _In_opt_ PCWSTR DllPath,\n    _In_ PCUNICODE_STRING DllName\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n/**\n * This function forcefully terminates the calling program if it is invoked inside a loader callout. Otherwise, it has no effect.\n *\n * @remarks This routine does not catch all potential deadlock cases; it is possible for a thread inside a loader callout\n * to acquire a lock while some thread outside a loader callout holds the same lock and makes a call into the loader.\n * In other words, there can be a lock order inversion between the loader lock and a client lock.\n * https://learn.microsoft.com/en-us/windows/win32/devnotes/ldrfastfailinloadercallout\n */\nNTSYSAPI\nVOID\nNTAPI\nLdrFastFailInLoaderCallout(\n    VOID\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nLdrFlushAlternateResourceModules(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nLdrDllRedirectionCallback(\n    _In_ ULONG Flags,\n    _In_ PCWSTR DllName,\n    _In_opt_ PCWSTR DllPath,\n    _Inout_opt_ PULONG DllCharacteristics,\n    _In_ PVOID CallbackData,\n    _Out_ PCWSTR *EffectiveDllPath\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nLdrSetDllManifestProber(\n    _In_ PVOID Routine\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI BOOLEAN LdrpChildNtdll; // DATA export\n#endif\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nLdrpResGetMappingSize(\n    _In_ PVOID BaseAddress,\n    _Out_ PSIZE_T Size,\n    _In_ ULONG Flags,\n    _In_ BOOLEAN GetFileSizeFromLoadAsDataTable\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntlpcapi.h",
    "content": "/*\n * Local Inter-process Communication support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTLPCAPI_H\n#define _NTLPCAPI_H\n\n#define PORT_CONNECT 0x0001\n#define PORT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1)\n\ntypedef struct _PORT_MESSAGE\n{\n    union\n    {\n        struct\n        {\n            CSHORT DataLength;\n            CSHORT TotalLength;\n        } s1;\n        ULONG Length;\n    } u1;\n    union\n    {\n        struct\n        {\n            CSHORT Type;\n            CSHORT DataInfoOffset;\n        } s2;\n        ULONG ZeroInit;\n    } u2;\n    union\n    {\n        CLIENT_ID ClientId;\n        double DoNotUseThisField;\n    };\n    ULONG MessageId;\n    union\n    {\n        SIZE_T ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages\n        ULONG CallbackId; // only valid for LPC_REQUEST messages\n    };\n} PORT_MESSAGE, *PPORT_MESSAGE;\n\ntypedef struct _PORT_DATA_ENTRY\n{\n    PVOID Base;\n    ULONG Size;\n} PORT_DATA_ENTRY, *PPORT_DATA_ENTRY;\n\ntypedef struct _PORT_DATA_INFORMATION\n{\n    ULONG CountDataEntries;\n    _Field_size_(CountDataEntries) PORT_DATA_ENTRY DataEntries[1];\n} PORT_DATA_INFORMATION, *PPORT_DATA_INFORMATION;\n\n#define LPC_REQUEST 1\n#define LPC_REPLY 2\n#define LPC_DATAGRAM 3\n#define LPC_LOST_REPLY 4\n#define LPC_PORT_CLOSED 5\n#define LPC_CLIENT_DIED 6\n#define LPC_EXCEPTION 7\n#define LPC_DEBUG_EVENT 8\n#define LPC_ERROR_EVENT 9\n#define LPC_CONNECTION_REQUEST 10\n\n#define LPC_CONTINUATION_REQUIRED       0x2000\n#define LPC_NO_IMPERSONATE              0x4000\n#define LPC_KERNELMODE_MESSAGE          0x8000\n\n#define PORT_VALID_OBJECT_ATTRIBUTES OBJ_CASE_INSENSITIVE\n\n#ifdef _WIN64\n#define PORT_MAXIMUM_MESSAGE_LENGTH 512\n#else\n#define PORT_MAXIMUM_MESSAGE_LENGTH 256\n#endif\n\n#define LPC_MAX_CONNECTION_INFO_SIZE (16 * sizeof(ULONG_PTR))\n\n#define PORT_TOTAL_MAXIMUM_MESSAGE_LENGTH \\\n    ((PORT_MAXIMUM_MESSAGE_LENGTH + sizeof(PORT_MESSAGE) + LPC_MAX_CONNECTION_INFO_SIZE + 0xf) & ~0xf)\n\ntypedef struct _LPC_CLIENT_DIED_MSG\n{\n    PORT_MESSAGE PortMsg;\n    LARGE_INTEGER CreateTime;\n} LPC_CLIENT_DIED_MSG, *PLPC_CLIENT_DIED_MSG;\n\ntypedef struct _PORT_VIEW\n{\n    ULONG Length;\n    HANDLE SectionHandle;\n    ULONG SectionOffset;\n    SIZE_T ViewSize;\n    PVOID ViewBase;\n    PVOID ViewRemoteBase;\n} PORT_VIEW, *PPORT_VIEW;\n\ntypedef struct _REMOTE_PORT_VIEW\n{\n    ULONG Length;\n    SIZE_T ViewSize;\n    PVOID ViewBase;\n} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;\n\n// WOW64 definitions\n\n// Except in a small number of special cases, WOW64 programs using the LPC APIs must use the 64-bit versions of the\n// PORT_MESSAGE, PORT_VIEW and REMOTE_PORT_VIEW data structures. Note that we take a different approach than the\n// official NT headers, which produce 64-bit versions in a 32-bit environment when USE_LPC6432 is defined.\n\ntypedef struct _PORT_MESSAGE64\n{\n    union\n    {\n        struct\n        {\n            CSHORT DataLength;\n            CSHORT TotalLength;\n        } s1;\n        ULONG Length;\n    } u1;\n    union\n    {\n        struct\n        {\n            CSHORT Type;\n            CSHORT DataInfoOffset;\n        } s2;\n        ULONG ZeroInit;\n    } u2;\n    union\n    {\n        CLIENT_ID64 ClientId;\n        double DoNotUseThisField;\n    };\n    ULONG MessageId;\n    union\n    {\n        ULONGLONG ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages\n        ULONG CallbackId; // only valid for LPC_REQUEST messages\n    };\n} PORT_MESSAGE64, *PPORT_MESSAGE64;\n\ntypedef struct _LPC_CLIENT_DIED_MSG64\n{\n    PORT_MESSAGE64 PortMsg;\n    LARGE_INTEGER CreateTime;\n} LPC_CLIENT_DIED_MSG64, *PLPC_CLIENT_DIED_MSG64;\n\ntypedef struct _PORT_VIEW64\n{\n    ULONG Length;\n    ULONGLONG SectionHandle;\n    ULONG SectionOffset;\n    ULONGLONG ViewSize;\n    ULONGLONG ViewBase;\n    ULONGLONG ViewRemoteBase;\n} PORT_VIEW64, *PPORT_VIEW64;\n\ntypedef struct _REMOTE_PORT_VIEW64\n{\n    ULONG Length;\n    ULONGLONG ViewSize;\n    ULONGLONG ViewBase;\n} REMOTE_PORT_VIEW64, *PREMOTE_PORT_VIEW64;\n\n//\n// Port creation\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreatePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG MaxConnectionInfoLength,\n    _In_ ULONG MaxMessageLength,\n    _In_opt_ ULONG MaxPoolUsage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateWaitablePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG MaxConnectionInfoLength,\n    _In_ ULONG MaxMessageLength,\n    _In_opt_ ULONG MaxPoolUsage\n    );\n\n//\n// Port connection (client)\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,\n    _Inout_opt_ PPORT_VIEW ClientView,\n    _Inout_opt_ PREMOTE_PORT_VIEW ServerView,\n    _Out_opt_ PULONG MaxMessageLength,\n    _Inout_updates_bytes_to_opt_(*ConnectionInformationLength, *ConnectionInformationLength) PVOID ConnectionInformation,\n    _Inout_opt_ PULONG ConnectionInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSecureConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,\n    _Inout_opt_ PPORT_VIEW ClientView,\n    _In_opt_ PSID RequiredServerSid,\n    _Inout_opt_ PREMOTE_PORT_VIEW ServerView,\n    _Out_opt_ PULONG MaxMessageLength,\n    _Inout_updates_bytes_to_opt_(*ConnectionInformationLength, *ConnectionInformationLength) PVOID ConnectionInformation,\n    _Inout_opt_ PULONG ConnectionInformationLength\n    );\n\n//\n// Port connection (server)\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtListenPort(\n    _In_ HANDLE PortHandle,\n    _Out_ PPORT_MESSAGE ConnectionRequest\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAcceptConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ PVOID PortContext,\n    _In_ PPORT_MESSAGE ConnectionRequest,\n    _In_ BOOLEAN AcceptConnection,\n    _Inout_opt_ PPORT_VIEW ServerView,\n    _Out_opt_ PREMOTE_PORT_VIEW ClientView\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompleteConnectPort(\n    _In_ HANDLE PortHandle\n    );\n\n//\n// General\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRequestPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(RequestMessage->u1.s1.TotalLength) PPORT_MESSAGE RequestMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRequestWaitReplyPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(RequestMessage->u1.s1.TotalLength) PPORT_MESSAGE RequestMessage,\n    _Out_ PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplyPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplyWaitReplyPort(\n    _In_ HANDLE PortHandle,\n    _Inout_ PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplyWaitReceivePort(\n    _In_ HANDLE PortHandle,\n    _Out_opt_ PVOID *PortContext,\n    _In_reads_bytes_opt_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage,\n    _Out_ PPORT_MESSAGE ReceiveMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplyWaitReceivePortEx(\n    _In_ HANDLE PortHandle,\n    _Out_opt_ PVOID *PortContext,\n    _In_reads_bytes_opt_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage,\n    _Out_ PPORT_MESSAGE ReceiveMessage,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtImpersonateClientOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadRequestData(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ ULONG DataEntryIndex,\n    _Out_writes_bytes_to_(BufferSize, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _Out_opt_ PSIZE_T NumberOfBytesRead\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWriteRequestData(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ ULONG DataEntryIndex,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten\n    );\n\ntypedef enum _PORT_INFORMATION_CLASS\n{\n    PortBasicInformation,\n    PortDumpInformation\n} PORT_INFORMATION_CLASS;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationPort(\n    _In_ HANDLE PortHandle,\n    _In_ PORT_INFORMATION_CLASS PortInformationClass,\n    _Out_writes_bytes_to_(Length, *ReturnLength) PVOID PortInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n// Asynchronous Local Inter-process Communication\n\n// rev\ntypedef HANDLE ALPC_HANDLE, *PALPC_HANDLE;\n\n#define ALPC_PORFLG_LPC_MODE 0x1000 // kernel only\n#define ALPC_PORFLG_ALLOW_IMPERSONATION 0x10000\n#define ALPC_PORFLG_ALLOW_LPC_REQUESTS 0x20000 // rev\n#define ALPC_PORFLG_WAITABLE_PORT 0x40000 // dbg\n#define ALPC_PORFLG_ALLOW_DUP_OBJECT 0x80000\n#define ALPC_PORFLG_SYSTEM_PROCESS 0x100000 // dbg\n#define ALPC_PORFLG_WAKE_POLICY1 0x200000\n#define ALPC_PORFLG_WAKE_POLICY2 0x400000\n#define ALPC_PORFLG_WAKE_POLICY3 0x800000\n#define ALPC_PORFLG_DIRECT_MESSAGE 0x1000000\n#define ALPC_PORFLG_ALLOW_MULTIHANDLE_ATTRIBUTE 0x2000000\n\n#define ALPC_PORFLG_OBJECT_TYPE_FILE 0x0001\n#define ALPC_PORFLG_OBJECT_TYPE_INVALID 0x0002\n#define ALPC_PORFLG_OBJECT_TYPE_THREAD 0x0004\n#define ALPC_PORFLG_OBJECT_TYPE_SEMAPHORE 0x0008\n#define ALPC_PORFLG_OBJECT_TYPE_EVENT 0x0010\n#define ALPC_PORFLG_OBJECT_TYPE_PROCESS 0X0020\n#define ALPC_PORFLG_OBJECT_TYPE_MUTEX 0x0040\n#define ALPC_PORFLG_OBJECT_TYPE_SECTION 0x0080\n#define ALPC_PORFLG_OBJECT_TYPE_REGKEY 0x0100\n#define ALPC_PORFLG_OBJECT_TYPE_TOKEN 0x0200\n#define ALPC_PORFLG_OBJECT_TYPE_COMPOSITION 0x0400\n#define ALPC_PORFLG_OBJECT_TYPE_JOB 0x0800\n#define ALPC_PORFLG_OBJECT_TYPE_ALL \\\n    (ALPC_PORFLG_OBJECT_TYPE_FILE | ALPC_PORFLG_OBJECT_TYPE_THREAD | \\\n     ALPC_PORFLG_OBJECT_TYPE_SEMAPHORE | ALPC_PORFLG_OBJECT_TYPE_EVENT | \\\n     ALPC_PORFLG_OBJECT_TYPE_PROCESS | ALPC_PORFLG_OBJECT_TYPE_MUTEX | \\\n     ALPC_PORFLG_OBJECT_TYPE_SECTION | ALPC_PORFLG_OBJECT_TYPE_REGKEY | \\\n     ALPC_PORFLG_OBJECT_TYPE_TOKEN | ALPC_PORFLG_OBJECT_TYPE_COMPOSITION | \\\n     ALPC_PORFLG_OBJECT_TYPE_JOB)\n\n// symbols\ntypedef struct _ALPC_PORT_ATTRIBUTES\n{\n    ULONG Flags;\n    SECURITY_QUALITY_OF_SERVICE SecurityQos;\n    SIZE_T MaxMessageLength;\n    SIZE_T MemoryBandwidth;\n    SIZE_T MaxPoolUsage;\n    SIZE_T MaxSectionSize;\n    SIZE_T MaxViewSize;\n    SIZE_T MaxTotalSectionSize;\n    ULONG DupObjectTypes;\n#ifdef _WIN64\n    ULONG Reserved;\n#endif\n} ALPC_PORT_ATTRIBUTES, *PALPC_PORT_ATTRIBUTES;\n\n// begin_rev\n#define ALPC_MESSAGE_HANDLE_ATTRIBUTE 0x10000000\n#define ALPC_MESSAGE_CONTEXT_ATTRIBUTE 0x20000000\n#define ALPC_MESSAGE_VIEW_ATTRIBUTE 0x40000000\n#define ALPC_MESSAGE_SECURITY_ATTRIBUTE 0x80000000\n// end_rev\n\n// symbols\ntypedef struct _ALPC_MESSAGE_ATTRIBUTES\n{\n    ULONG AllocatedAttributes;\n    ULONG ValidAttributes;\n} ALPC_MESSAGE_ATTRIBUTES, *PALPC_MESSAGE_ATTRIBUTES;\n\n// symbols\ntypedef struct _ALPC_COMPLETION_LIST_STATE\n{\n    union\n    {\n        struct\n        {\n            ULONG64 Head : 24;\n            ULONG64 Tail : 24;\n            ULONG64 ActiveThreadCount : 16;\n        } s1;\n        ULONG64 Value;\n    } u1;\n} ALPC_COMPLETION_LIST_STATE, *PALPC_COMPLETION_LIST_STATE;\n\n#define ALPC_COMPLETION_LIST_BUFFER_GRANULARITY_MASK 0x3f // dbg\n\n// symbols\ntypedef struct DECLSPEC_ALIGN(128) _ALPC_COMPLETION_LIST_HEADER\n{\n    ULONG64 StartMagic;\n\n    ULONG TotalSize;\n    ULONG ListOffset;\n    ULONG ListSize;\n    ULONG BitmapOffset;\n    ULONG BitmapSize;\n    ULONG DataOffset;\n    ULONG DataSize;\n    ULONG AttributeFlags;\n    ULONG AttributeSize;\n\n    DECLSPEC_ALIGN(128) ALPC_COMPLETION_LIST_STATE State;\n    ULONG LastMessageId;\n    ULONG LastCallbackId;\n    DECLSPEC_ALIGN(128) ULONG PostCount;\n    DECLSPEC_ALIGN(128) ULONG ReturnCount;\n    DECLSPEC_ALIGN(128) ULONG LogSequenceNumber;\n    DECLSPEC_ALIGN(128) RTL_SRWLOCK UserLock;\n\n    ULONG64 EndMagic;\n} ALPC_COMPLETION_LIST_HEADER, *PALPC_COMPLETION_LIST_HEADER;\n\n// private\ntypedef struct _ALPC_CONTEXT_ATTR\n{\n    PVOID PortContext;\n    PVOID MessageContext;\n    ULONG Sequence;\n    ULONG MessageId;\n    ULONG CallbackId;\n} ALPC_CONTEXT_ATTR, *PALPC_CONTEXT_ATTR;\n\n// begin_rev\n#define ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS 0x10000\n#define ALPC_HANDLEFLG_DUPLICATE_SAME_ATTRIBUTES 0x20000\n#define ALPC_HANDLEFLG_DUPLICATE_INHERIT 0x80000\n// end_rev\n\n// private\ntypedef struct _ALPC_HANDLE_ATTR32\n{\n    ULONG Flags;\n    ULONG Reserved0;\n    ULONG SameAccess;\n    ULONG SameAttributes;\n    ULONG Indirect;\n    ULONG Inherit;\n    ULONG Reserved1;\n    ULONG Handle;\n    ULONG ObjectType; // ObjectTypeCode, not ObjectTypeIndex\n    ACCESS_MASK DesiredAccess;\n    ACCESS_MASK GrantedAccess;\n} ALPC_HANDLE_ATTR32, *PALPC_HANDLE_ATTR32;\n\n// private\ntypedef struct _ALPC_HANDLE_ATTR\n{\n    ULONG Flags;\n    ULONG Reserved0;\n    ULONG SameAccess;\n    ULONG SameAttributes;\n    ULONG Indirect;\n    ULONG Inherit;\n    ULONG Reserved1;\n    HANDLE Handle;\n    PALPC_HANDLE_ATTR32 HandleAttrArray;\n    ULONG ObjectType; // ObjectTypeCode, not ObjectTypeIndex\n    ULONG HandleCount;\n    ACCESS_MASK DesiredAccess;\n    ACCESS_MASK GrantedAccess;\n} ALPC_HANDLE_ATTR, *PALPC_HANDLE_ATTR;\n\n#define ALPC_SECFLG_CREATE_HANDLE 0x20000 // dbg\n#define ALPC_SECFLG_NOSECTIONHANDLE 0x40000\n\n// private\ntypedef struct _ALPC_SECURITY_ATTR\n{\n    ULONG Flags;\n    PSECURITY_QUALITY_OF_SERVICE QoS;\n    ALPC_HANDLE ContextHandle; // dbg\n} ALPC_SECURITY_ATTR, *PALPC_SECURITY_ATTR;\n\n// begin_rev\n#define ALPC_VIEWFLG_UNMAP_EXISTING     0x10000\n#define ALPC_VIEWFLG_AUTO_RELEASE       0x20000\n#define ALPC_VIEWFLG_NOT_SECURE         0x40000\n// end_rev\n\n// private\ntypedef struct _ALPC_DATA_VIEW_ATTR\n{\n    ULONG Flags;\n    ALPC_HANDLE SectionHandle;\n    PVOID ViewBase; // must be zero on input\n    SIZE_T ViewSize;\n} ALPC_DATA_VIEW_ATTR, *PALPC_DATA_VIEW_ATTR;\n\n// private\ntypedef enum _ALPC_PORT_INFORMATION_CLASS\n{\n    AlpcBasicInformation, // q: out ALPC_BASIC_INFORMATION\n    AlpcPortInformation, // s: in ALPC_PORT_ATTRIBUTES\n    AlpcAssociateCompletionPortInformation, // s: in ALPC_PORT_ASSOCIATE_COMPLETION_PORT\n    AlpcConnectedSIDInformation, // q: in SID\n    AlpcServerInformation, // q: inout ALPC_SERVER_INFORMATION\n    AlpcMessageZoneInformation, // s: in ALPC_PORT_MESSAGE_ZONE_INFORMATION\n    AlpcRegisterCompletionListInformation, // s: in ALPC_PORT_COMPLETION_LIST_INFORMATION\n    AlpcUnregisterCompletionListInformation, // s: VOID\n    AlpcAdjustCompletionListConcurrencyCountInformation, // s: in ULONG\n    AlpcRegisterCallbackInformation, // s: ALPC_REGISTER_CALLBACK // kernel-mode only\n    AlpcCompletionListRundownInformation, // s: VOID // 10\n    AlpcWaitForPortReferences,\n    AlpcServerSessionInformation // q: ALPC_SERVER_SESSION_INFORMATION // since 19H2\n} ALPC_PORT_INFORMATION_CLASS;\n\n// private\ntypedef struct _ALPC_BASIC_INFORMATION\n{\n    ULONG Flags;\n    ULONG SequenceNo;\n    PVOID PortContext;\n} ALPC_BASIC_INFORMATION, *PALPC_BASIC_INFORMATION;\n\n// private\ntypedef struct _ALPC_PORT_ASSOCIATE_COMPLETION_PORT\n{\n    PVOID CompletionKey;\n    HANDLE CompletionPort;\n} ALPC_PORT_ASSOCIATE_COMPLETION_PORT, *PALPC_PORT_ASSOCIATE_COMPLETION_PORT;\n\n// private\ntypedef struct _ALPC_SERVER_INFORMATION\n{\n    union\n    {\n        struct\n        {\n            HANDLE ThreadHandle;\n        } In;\n        struct\n        {\n            BOOLEAN ThreadBlocked;\n            HANDLE ConnectedProcessId;\n            UNICODE_STRING ConnectionPortName;\n        } Out;\n    };\n} ALPC_SERVER_INFORMATION, *PALPC_SERVER_INFORMATION;\n\n// private\ntypedef struct _ALPC_PORT_MESSAGE_ZONE_INFORMATION\n{\n    PVOID Buffer;\n    ULONG Size;\n} ALPC_PORT_MESSAGE_ZONE_INFORMATION, *PALPC_PORT_MESSAGE_ZONE_INFORMATION;\n\n// private\ntypedef struct _ALPC_PORT_COMPLETION_LIST_INFORMATION\n{\n    PVOID Buffer; // PALPC_COMPLETION_LIST_HEADER\n    ULONG Size;\n    ULONG ConcurrencyCount;\n    ULONG AttributeFlags;\n} ALPC_PORT_COMPLETION_LIST_INFORMATION, *PALPC_PORT_COMPLETION_LIST_INFORMATION;\n\n// private\ntypedef struct _ALPC_REGISTER_CALLBACK\n{\n    PVOID CallbackObject; // PCALLBACK_OBJECT\n    PVOID CallbackContext;\n} ALPC_REGISTER_CALLBACK, *PALPC_REGISTER_CALLBACK;\n\n// private\ntypedef struct _ALPC_SERVER_SESSION_INFORMATION\n{\n    ULONG SessionId;\n    ULONG ProcessId;\n} ALPC_SERVER_SESSION_INFORMATION, *PALPC_SERVER_SESSION_INFORMATION;\n\n// private\ntypedef enum _ALPC_MESSAGE_INFORMATION_CLASS\n{\n    AlpcMessageSidInformation, // q: out SID\n    AlpcMessageTokenModifiedIdInformation,  // q: out LUID\n    AlpcMessageDirectStatusInformation,\n    AlpcMessageHandleInformation, // ALPC_MESSAGE_HANDLE_INFORMATION\n    MaxAlpcMessageInfoClass\n} ALPC_MESSAGE_INFORMATION_CLASS, *PALPC_MESSAGE_INFORMATION_CLASS;\n\ntypedef struct _ALPC_MESSAGE_HANDLE_INFORMATION\n{\n    ULONG Index;\n    ULONG Flags;\n    ULONG Handle;\n    ULONG ObjectType;\n    ACCESS_MASK GrantedAccess;\n} ALPC_MESSAGE_HANDLE_INFORMATION, *PALPC_MESSAGE_HANDLE_INFORMATION;\n\n// begin_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n//\n// System calls\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCreatePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcDisconnectPort(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcQueryInformation(\n    _In_opt_ HANDLE PortHandle,\n    _In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,\n    _Inout_updates_bytes_to_(Length, *ReturnLength) PVOID PortInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcSetInformation(\n    _In_ HANDLE PortHandle,\n    _In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,\n    _In_reads_bytes_opt_(Length) PVOID PortInformation,\n    _In_ ULONG Length\n    );\n\n#define ALPC_CREATEPORTSECTIONFLG_SECURE 0x40000 // rev\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCreatePortSection(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_opt_ HANDLE SectionHandle,\n    _In_ SIZE_T SectionSize,\n    _Out_ PALPC_HANDLE AlpcSectionHandle,\n    _Out_ PSIZE_T ActualSectionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcDeletePortSection(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE SectionHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCreateResourceReserve(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ SIZE_T MessageSize,\n    _Out_ PALPC_HANDLE ResourceId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcDeleteResourceReserve(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ResourceId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCreateSectionView(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _Inout_ PALPC_DATA_VIEW_ATTR ViewAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcDeleteSectionView(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ PVOID ViewBase\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCreateSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _Inout_ PALPC_SECURITY_ATTR SecurityAttribute\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcDeleteSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ContextHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcRevokeSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ContextHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcQueryInformationMessage(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _In_ ALPC_MESSAGE_INFORMATION_CLASS MessageInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ReturnLength) PVOID MessageInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#define ALPC_MSGFLG_REPLY_MESSAGE 0x1\n#define ALPC_MSGFLG_LPC_MODE 0x2\n#define ALPC_MSGFLG_RELEASE_MESSAGE 0x10000 // dbg\n#define ALPC_MSGFLG_SYNC_REQUEST 0x20000 // dbg\n#define ALPC_MSGFLG_TRACK_PORT_REFERENCES 0x40000\n#define ALPC_MSGFLG_WAIT_USER_MODE 0x100000\n#define ALPC_MSGFLG_WAIT_ALERTABLE 0x200000\n#define ALPC_MSGFLG_WOW64_CALL 0x80000000 // dbg\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_ ULONG Flags,\n    _In_opt_ PSID RequiredServerSid,\n    _Inout_updates_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ConnectionMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcConnectPortEx(\n    _Out_ PHANDLE PortHandle,\n    _In_ POBJECT_ATTRIBUTES ConnectionPortObjectAttributes,\n    _In_opt_ POBJECT_ATTRIBUTES ClientPortObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_ ULONG Flags,\n    _In_opt_ PSECURITY_DESCRIPTOR ServerSecurityRequirements,\n    _Inout_updates_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ConnectionMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n#endif\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcAcceptConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ HANDLE ConnectionPortHandle,\n    _In_ ULONG Flags,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_opt_ PVOID PortContext,\n    _In_reads_bytes_(ConnectionRequest->u1.s1.TotalLength) PPORT_MESSAGE ConnectionRequest,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,\n    _In_ BOOLEAN AcceptConnection\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcSendWaitReceivePort(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_reads_bytes_opt_(SendMessage->u1.s1.TotalLength) PPORT_MESSAGE SendMessage,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,\n    _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ReceiveMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n#define ALPC_CANCELFLG_TRY_CANCEL 0x1 // dbg\n#define ALPC_CANCELFLG_NO_CONTEXT_CHECK 0x8\n#define ALPC_CANCELFLGP_FLUSH 0x10000 // dbg\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcCancelMessage(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_ PALPC_CONTEXT_ATTR MessageContext\n    );\n\n#define ALPC_IMPERSONATEFLG_ANONYMOUS 0x1\n#define ALPC_IMPERSONATEFLG_REQUIRE_IMPERSONATE 0x2\n//ALPC_IMPERSONATEFLG 0x3-0x10 (SECURITY_IMPERSONATION_LEVEL)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcImpersonateClientOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ PVOID Flags\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcImpersonateClientContainerOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _Reserved_ ULONG Flags\n    );\n#endif\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcOpenSenderProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _Reserved_ ULONG Flags,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlpcOpenSenderThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _Reserved_ ULONG Flags,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n//\n// Support functions\n//\n\nNTSYSAPI\nULONG\nNTAPI\nAlpcMaxAllowedMessageLength(\n    VOID\n    );\n\n#define ALPC_ATTRFLG_ALLOCATEDATTR 0x20000000\n#define ALPC_ATTRFLG_VALIDATTR 0x40000000\n#define ALPC_ATTRFLG_KEEPRUNNINGATTR 0x60000000\n\nNTSYSAPI\nULONG\nNTAPI\nAlpcGetHeaderSize(\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nAlpcInitializeMessageAttribute(\n    _In_ ULONG AttributeFlags,\n    _Out_opt_ PALPC_MESSAGE_ATTRIBUTES Buffer,\n    _In_ SIZE_T BufferSize,\n    _Out_ PSIZE_T RequiredBufferSize\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nAlpcGetMessageAttribute(\n    _In_ PALPC_MESSAGE_ATTRIBUTES Buffer,\n    _In_ ULONG AttributeFlag\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nAlpcRegisterCompletionList(\n    _In_ HANDLE PortHandle,\n    _Out_ PALPC_COMPLETION_LIST_HEADER Buffer,\n    _In_ ULONG Size,\n    _In_ ULONG ConcurrencyCount,\n    _In_ ULONG AttributeFlags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nAlpcUnregisterCompletionList(\n    _In_ HANDLE PortHandle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nAlpcRundownCompletionList(\n    _In_ HANDLE PortHandle\n    );\n#endif\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nAlpcAdjustCompletionListConcurrencyCount(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG ConcurrencyCount\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nAlpcRegisterCompletionListWorkerThread(\n    _Inout_ PVOID CompletionList\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nAlpcUnregisterCompletionListWorkerThread(\n    _Inout_ PVOID CompletionList\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nAlpcGetCompletionListLastMessageInformation(\n    _In_ PVOID CompletionList,\n    _Out_ PULONG LastMessageId,\n    _Out_ PULONG LastCallbackId\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nAlpcGetOutstandingCompletionListMessageCount(\n    _In_ PVOID CompletionList\n    );\n\nNTSYSAPI\nPPORT_MESSAGE\nNTAPI\nAlpcGetMessageFromCompletionList(\n    _In_ PVOID CompletionList,\n    _Out_opt_ PALPC_MESSAGE_ATTRIBUTES *MessageAttributes\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nAlpcFreeCompletionListMessage(\n    _Inout_ PVOID CompletionList,\n    _In_ PPORT_MESSAGE Message\n    );\n\nNTSYSAPI\nPALPC_MESSAGE_ATTRIBUTES\nNTAPI\nAlpcGetCompletionListMessageAttributes(\n    _In_ PVOID CompletionList,\n    _In_ PPORT_MESSAGE Message\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// end_private\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntmisc.h",
    "content": "/*\n * Trace Control support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTMISC_H\n#define _NTMISC_H\n\n//\n// Apphelp\n//\n\ntypedef enum _AHC_INFO_CLASS \n{\n    AhcInfoClassSdbQueryResult          = 0x00000001,\n    AhcInfoClassSdbSxsOverrideManifest  = 0x00000002,\n    AhcInfoClassSdbRunlevelFlags        = 0x00000004,\n    AhcInfoClassSdbFusionFlags          = 0x00000008,\n    AhcInfoClassSdbInstallerFlags       = 0x00000010,\n    AhcInfoClassFusionFlags             = 0x00000020,\n    AhcInfoClassTelemetryFlags          = 0x00000040,\n    AhcInfoClassInstallDetect           = 0x00000080,\n    AhcInfoClassRacEventSent            = 0x00000100,\n    AhcInfoClassIsSystemFile            = 0x00000200,\n    AhcInfoClassMonitoringFlags         = 0x00000400,\n    AhcInfoClassExeType                 = 0x00000800,\n} AHC_INFO_CLASS, *PAHC_INFO_CLASS;\n\n#define AHC_INFO_CLASS_FILTER_ON_FILETIME_CHANGE            \\\n    (AHC_INFO_CLASS)(AhcInfoClassSdbQueryResult |           \\\n                     AhcInfoClassSdbSxsOverrideManifest |   \\\n                     AhcInfoClassSdbRunlevelFlags |         \\\n                     AhcInfoClassSdbFusionFlags |           \\\n                     AhcInfoClassSdbInstallerFlags |        \\\n                     AhcInfoClassFusionFlags |              \\\n                     AhcInfoClassRacEventSent)\n\n#define AHC_INFO_CLASS_FILTER_ON_SDB_CHANGE                 \\\n    (AHC_INFO_CLASS)(AhcInfoClassSdbQueryResult |           \\\n                     AhcInfoClassSdbSxsOverrideManifest |   \\\n                     AhcInfoClassSdbRunlevelFlags |         \\\n                     AhcInfoClassSdbFusionFlags |           \\\n                     AhcInfoClassSdbInstallerFlags |        \\\n                     AhcInfoClassInstallDetect)\n\n#define AHC_INFO_CLASS_ALL                                  \\\n    (AHC_INFO_CLASS)(AhcInfoClassSdbQueryResult |           \\\n                     AhcInfoClassSdbSxsOverrideManifest |   \\\n                     AhcInfoClassSdbRunlevelFlags |         \\\n                     AhcInfoClassSdbFusionFlags |           \\\n                     AhcInfoClassSdbInstallerFlags |        \\\n                     AhcInfoClassFusionFlags |              \\\n                     AhcInfoClassTelemetryFlags |           \\\n                     AhcInfoClassInstallDetect |            \\\n                     AhcInfoClassRacEventSent |             \\\n                     AhcInfoClassIsSystemFile |             \\\n                     AhcInfoClassMonitoringFlags |          \\\n                     AhcInfoClassExeType)\n\n#define AHC_INFO_CLASS_INTERNALLY_COMPUTED                  \\\n    (AHC_INFO_CLASS)(AhcInfoClassSdbQueryResult |           \\\n                     AhcInfoClassSdbSxsOverrideManifest |   \\\n                     AhcInfoClassSdbRunlevelFlags |         \\\n                     AhcInfoClassSdbFusionFlags |           \\\n                     AhcInfoClassSdbInstallerFlags |        \\\n                     AhcInfoClassTelemetryFlags |           \\\n                     AhcInfoClassIsSystemFile |             \\\n                     AhcInfoClassMonitoringFlags |          \\\n                     AhcInfoClassExeType)\n\n#define AHC_INFO_CLASS_SAFE_FOR_UNPRIVILEGED_UPDATE         \\\n    (AHC_INFO_CLASS)(AhcInfoClassInstallDetect |            \\\n                     AhcInfoClassRacEventSent |             \\\n                     AhcInfoClassTelemetryFlags |           \\\n                     AhcInfoClassMonitoringFlags)\n\n//\n// Cache structures and APIs.\n//\n\ntypedef enum _AHC_SERVICE_CLASS \n{\n    ApphelpCacheServiceLookup = 0,\n    ApphelpCacheServiceRemove = 1,\n    ApphelpCacheServiceUpdate = 2,\n    ApphelpCacheServiceClear = 3,\n    ApphelpCacheServiceSnapStatistics = 4,\n    ApphelpCacheServiceSnapCache = 5,\n    ApphelpCacheServiceLookupCdb = 6,\n    ApphelpCacheServiceRefreshCdb = 7,\n    ApphelpCacheServiceMapQuirks = 8,\n    ApphelpCacheServiceHwIdQuery = 9,\n    ApphelpCacheServiceInitProcessData = 10,\n    ApphelpCacheServiceLookupAndWriteToProcess = 11,\n    ApphelpCacheServiceMax\n} AHC_SERVICE_CLASS;\n\ntypedef struct _AHC_SERVICE_LOOKUP \n{\n    AHC_INFO_CLASS InfoClass;                   // Information to lookup.\n    UINT HintFlags;                             // Hint flags about cache query.\n    UNICODE_STRING PackageAlias;                // Aliased package moniker in a packed string.\n    HANDLE FileHandle;                          // User space handle to file.\n    HANDLE ProcessHandle;                       // User space process handle.\n    USHORT ExeType;                             // Executable bitness.\n    USHORT Padding;                             // Padding to even USHORTs.\n    UNICODE_STRING ExeSignature;                // Executable file signature.\n    PCZZWSTR Environment;                       // Environment block.\n    UINT EnvironmentSize;                       // Size of environment block in bytes.\n} AHC_SERVICE_LOOKUP, *PAHC_SERVICE_LOOKUP;\n\ntypedef struct _AHC_SERVICE_REMOVE \n{\n    AHC_INFO_CLASS InfoClass;\n    UNICODE_STRING PackageAlias;\n    HANDLE FileHandle;\n    UNICODE_STRING ExeSignature;\n} AHC_SERVICE_REMOVE, *PAHC_SERVICE_REMOVE;\n\ntypedef struct _AHC_SERVICE_UPDATE \n{\n    AHC_INFO_CLASS InfoClass;\n    UNICODE_STRING PackageAlias;\n    HANDLE FileHandle;\n    UNICODE_STRING ExeSignature;\n    PVOID Data;\n    ULONG DataSize;\n} AHC_SERVICE_UPDATE, *PAHC_SERVICE_UPDATE;\n\ntypedef struct _AHC_SERVICE_CLEAR \n{\n    AHC_INFO_CLASS InfoClass;\n} AHC_SERVICE_CLEAR, *PAHC_SERVICE_CLEAR;\n\ntypedef struct _AHC_SERVICE_LOOKUP_CDB \n{\n    UNICODE_STRING Name;\n} AHC_SERVICE_LOOKUP_CDB, *PAHC_SERVICE_LOOKUP_CDB;\n\n//\n// AHC_HINT_* flags are used in the HintFlags variable.\n//\n\n#define AHC_HINT_FORCE_BYPASS                           0x00000001\n#define AHC_HINT_REMOVABLE_MEDIA                        0x00000002\n#define AHC_HINT_TEMPORARY_DIRECTORY                    0x00000004\n#define AHC_HINT_USER_PERM_LAYER                        0x00000008\n#define AHC_HINT_CREATE_PROCESS                         0x00000010\n#define AHC_HINT_NATIVE_EXE                             0x00000020\n\n#define SHIM_CACHE_MAIN_DATABASE_PATH32                 L\"\\\\AppPatch\\\\sysmain.sdb\"\n#define SHIM_CACHE_MAIN_DATABASE_PATH64                 L\"\\\\AppPatch\\\\AppPatch64\\\\sysmain.sdb\"\n\n//\n// Flag definitions for various flag-type information in cache.\n//\n\n#define AHC_CACHE_FLAG_MONITORING_IS_CANDIDATE          0x00000001 // Candidate for monitoring.\n#define AHC_CACHE_FLAG_MONITORING_IS_COMPLETE           0x00000002 // Monitoring has completed.\n#define AHC_CACHE_FLAG_MONITORING_VALID_MASK            (AHC_CACHE_FLAG_MONITORING_IS_CANDIDATE | \\\n                                                         AHC_CACHE_FLAG_MONITORING_IS_COMPLETE)\n\n#define AHC_CACHE_FLAG_TELEMETRY_IS_CANDIDATE           0x00000001 // Candidate for telemetry.\n#define AHC_CACHE_FLAG_TELEMETRY_HAS_SAMPLED            0x00000002 // Telemetry has run.\n#define AHC_CACHE_FLAG_TELEMETRY_VALID_MASK             (AHC_CACHE_FLAG_TELEMETRY_IS_CANDIDATE | \\\n                                                         AHC_CACHE_FLAG_TELEMETRY_HAS_SAMPLED)\n\n#define AHC_CACHE_FLAG_FUSION_HASDOTLOCAL               0x00000001 // Dot local file exists.\n#define AHC_CACHE_FLAG_FUSION_HASMANIFESTFILE           0x00000002 // Fusion manifest exists.\n#define AHC_CACHE_FLAG_FUSION_HASMANIFESTRESOURCE       0x00000004 // Fusion manifest resource exists.\n#define AHC_CACHE_FLAG_FUSION_VALID_MASK                (AHC_CACHE_FLAG_FUSION_HASDOTLOCAL | \\\n                                                         AHC_CACHE_FLAG_FUSION_HASMANIFESTFILE | \\\n                                                         AHC_CACHE_FLAG_FUSION_HASMANIFESTRESOURCE)\n\n#define AHC_CACHE_FLAG_RAC_EVENTSENT                    0x00000001 // Rac event has been sent.\n#define AHC_CACHE_FLAG_RAC_VALID_MASK                   (AHC_CACHE_FLAG_RAC_EVENTSENT)\n\n#define AHC_CACHE_FLAG_INSTALLDETECT_CLAIMED            0x00000001 // InstallDetect claimed.\n#define AHC_CACHE_FLAG_INSTALLDETECT_VALID_MASK         (AHC_CACHE_FLAG_RAC_EVENTSENT)\n\n//\n// Statistics.\n//\n\ntypedef struct _AHC_MAIN_STATISTICS\n{\n    ULONG Lookup;                               // Count of lookup calls.\n    ULONG Remove;                               // Count of remove calls.\n    ULONG Update;                               // Count of update calls.\n    ULONG Clear;                                // Count of clear calls.\n    ULONG SnapStatistics;                       // Count of snap statistics calls.\n    ULONG SnapCache;                            // Count of snap store calls.\n} AHC_MAIN_STATISTICS, *PAHC_MAIN_STATISTICS;\n\ntypedef struct _AHC_STORE_STATISTICS \n{\n    ULONG LookupHits;                           // Count of lookup hits.\n    ULONG LookupMisses;                         // Count of lookup misses.\n    ULONG Inserted;                             // Count of inserted.\n    ULONG Replaced;                             // Count of replaced.\n    ULONG Updated;                              // Count of updates.\n} AHC_STORE_STATISTICS, *PAHC_STORE_STATISTICS;\n\ntypedef struct _AHC_STATISTICS \n{\n    ULONG Size;                                 // Size of the structure.\n    AHC_MAIN_STATISTICS Main;                   // Main statistics.\n    AHC_STORE_STATISTICS Store;                 // Store statistics.\n} AHC_STATISTICS, *PAHC_STATISTICS;\n\ntypedef struct _AHC_SERVICE_DATAQUERY \n{\n    AHC_STATISTICS Stats;                       // Statistics.\n    ULONG DataSize;                             // Size of data.\n    PBYTE Data;                                 // Data.\n} AHC_SERVICE_DATAQUERY, *PAHC_SERVICE_DATAQUERY;\n\ntypedef struct _AHC_SERVICE_DATACACHE \n{\n    HANDLE FileHandle;                          // User space handle to file.\n    USHORT ExeType;                             // Executable bitness.\n    USHORT Padding;                             // Padding to even USHORTs.\n    UINT HintFlags;                             // Metadata flags about cache query.\n    HANDLE ProcessHandle;                       // User space process handle.\n    UNICODE_STRING FileName;                    // Executable file name.\n    UNICODE_STRING Environment;                 // Environment block.\n    UNICODE_STRING PackageAlias;                // Aliased package moniker in a packed string.\n    ULONG CustomDataSize;                       // Size of the custom data to cache.\n    PBYTE CustomData;                           // Pointer to the custom data.\n} AHC_SERVICE_DATACACHE, *PAHC_SERVICE_DATACACHE;\n\ntypedef struct _AHC_SERVICE_HWID_QUERY \n{\n    BOOLEAN QueryResult;                        // Query result\n    UNICODE_STRING HwId;                        // Query HwId; can contain wildcards\n} AHC_SERVICE_HWID_QUERY, *PAHC_SERVICE_HWID_QUERY;\n\ntypedef struct _AHC_SERVICE_DATA \n{\n    AHC_SERVICE_LOOKUP Lookup;                  // Lookup EXE/Package.\n    AHC_SERVICE_UPDATE Update;                  // Updating flags for a given exe/package.\n    AHC_SERVICE_DATACACHE Cache;                // For cache operations.\n    AHC_SERVICE_LOOKUP_CDB LookupCdb;           // Lookup cdb.\n    AHC_SERVICE_CLEAR Clear;                    // Clear flags for all exes/packages.\n    AHC_SERVICE_REMOVE Remove;                  // Remove EXE/Package.\n    AHC_SERVICE_HWID_QUERY HwIdQuery;           // For HWID cache queries.\n    NTSTATUS DriverStatus;                      // Receive the status from the cache driver. Set error code in IoStatus block causes driver verifier violation.\n    PVOID ParamsOut;                            // Parameters out data.\n    ULONG ParamsOutSize;                        // Parameters out size.\n} AHC_SERVICE_DATA, *PAHC_SERVICE_DATA;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtApphelpCacheControl(\n    _In_ AHC_SERVICE_CLASS ServiceClass,\n    _Inout_opt_ PVOID ServiceContext // AHC_SERVICE_DATA\n    );\n\n//\n// VDM\n//\n\ntypedef enum _VDMSERVICECLASS\n{\n    VdmStartExecution,\n    VdmQueueInterrupt,\n    VdmDelayInterrupt,\n    VdmInitialize,\n    VdmFeatures,\n    VdmSetInt21Handler,\n    VdmQueryDir,\n    VdmPrinterDirectIoOpen,\n    VdmPrinterDirectIoClose,\n    VdmPrinterInitialize,\n    VdmSetLdtEntries,\n    VdmSetProcessLdtInfo,\n    VdmAdlibEmulation,\n    VdmPMCliControl,\n    VdmQueryVdmProcess,\n    VdmPreInitialize\n} VDMSERVICECLASS, *PVDMSERVICECLASS;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtVdmControl(\n    _In_ VDMSERVICECLASS Service,\n    _Inout_ PVOID ServiceData\n    );\n\n//\n// Sessions\n//\n\ntypedef enum _IO_SESSION_EVENT\n{\n    IoSessionEventIgnore,\n    IoSessionEventCreated,\n    IoSessionEventTerminated,\n    IoSessionEventConnected,\n    IoSessionEventDisconnected,\n    IoSessionEventLogon,\n    IoSessionEventLogoff,\n    IoSessionEventMax\n} IO_SESSION_EVENT;\n\ntypedef enum _IO_SESSION_STATE\n{\n    IoSessionStateCreated = 1,\n    IoSessionStateInitialized = 2,\n    IoSessionStateConnected = 3,\n    IoSessionStateDisconnected = 4,\n    IoSessionStateDisconnectedLoggedOn = 5,\n    IoSessionStateLoggedOn = 6,\n    IoSessionStateLoggedOff = 7,\n    IoSessionStateTerminated = 8,\n    IoSessionStateMax\n} IO_SESSION_STATE;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenSession(\n    _Out_ PHANDLE SessionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtNotifyChangeSession(\n    _In_ HANDLE SessionHandle,\n    _In_ ULONG ChangeSequenceNumber,\n    _In_ PLARGE_INTEGER ChangeTimeStamp,\n    _In_ IO_SESSION_EVENT Event,\n    _In_ IO_SESSION_STATE NewState,\n    _In_ IO_SESSION_STATE PreviousState,\n    _In_reads_bytes_opt_(PayloadSize) PVOID Payload,\n    _In_ ULONG PayloadSize\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// ApiSet\n//\n\nNTSYSAPI\nBOOL\nNTAPI\nApiSetQueryApiSetPresence(\n    _In_ PCUNICODE_STRING Namespace,\n    _Out_ PBOOLEAN Present\n    );\n\nNTSYSAPI\nBOOL\nNTAPI\nApiSetQueryApiSetPresenceEx(\n    _In_ PCUNICODE_STRING Namespace,\n    _Out_ PBOOLEAN IsInSchema,\n    _Out_ PBOOLEAN Present\n    );\n\ntypedef enum _SECURE_SETTING_VALUE_TYPE\n{\n    SecureSettingValueTypeBoolean = 0,\n    SecureSettingValueTypeUlong = 1,\n    SecureSettingValueTypeBinary = 2,\n    SecureSettingValueTypeString = 3,\n    SecureSettingValueTypeUnknown = 4\n} SECURE_SETTING_VALUE_TYPE, *PSECURE_SETTING_VALUE_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySecurityPolicy(\n    _In_ PCUNICODE_STRING Policy,\n    _In_ PCUNICODE_STRING KeyName,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_ SECURE_SETTING_VALUE_TYPE ValueType,\n    _Out_writes_bytes_opt_(*ValueSize) PVOID Value,\n    _Inout_ PULONG ValueSize\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateCrossVmEvent(\n    _Out_ PHANDLE CrossVmEvent,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG CrossVmEventFlags,\n    _In_ LPCGUID VMID,\n    _In_ LPCGUID ServiceID\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateCrossVmMutant(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG CrossVmEventFlags,\n    _In_ LPCGUID VMID,\n    _In_ LPCGUID ServiceID\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAcquireCrossVmMutant(\n    _In_ HANDLE CrossVmMutant,\n    _In_ PLARGE_INTEGER Timeout\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDirectGraphicsCall(\n    _In_ ULONG InputBufferLength,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _Out_ PULONG ReturnLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11_22H2)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenCpuPartition(\n    _Out_ PHANDLE CpuPartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateCpuPartition(\n    _Out_ PHANDLE CpuPartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationCpuPartition(\n    _In_ HANDLE CpuPartitionHandle,\n    _In_ ULONG CpuPartitionInformationClass,\n    _In_reads_bytes_(CpuPartitionInformationLength) PVOID CpuPartitionInformation,\n    _In_ ULONG CpuPartitionInformationLength,\n    _Reserved_ PVOID,\n    _Reserved_ ULONG,\n    _Reserved_ ULONG\n    );\n    \n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationCpuPartition(\n    _In_ HANDLE CpuPartitionHandle,\n    _In_ ULONG CpuPartitionInformationClass,\n    _Out_writes_bytes_opt_(CpuPartitionInformationLength) PVOID CpuPartitionInformation,\n    _In_ ULONG CpuPartitionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_11_22H2)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n//\n// Process KeepAlive (also WakeCounter)\n//\n\ntypedef enum _PROCESS_ACTIVITY_TYPE\n{\n    ProcessActivityTypeAudio = 0,\n    ProcessActivityTypeMax = 1\n} PROCESS_ACTIVITY_TYPE;\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAcquireProcessActivityReference(\n    _Out_ PHANDLE ActivityReferenceHandle,\n    _In_ HANDLE ParentProcessHandle,\n    _Reserved_ PROCESS_ACTIVITY_TYPE Reserved\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n\n//\n// Appx/Msix Packages\n//\n\n// private\ntypedef struct _PACKAGE_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *PACKAGE_CONTEXT_REFERENCE;\n\n// private\ntypedef enum PackageProperty\n{\n    PackageProperty_Name = 1,                  // q: WCHAR[]\n    PackageProperty_Version = 2,               // q: WCHAR[]\n    PackageProperty_Architecture = 3,          // q: ULONG (PROCESSOR_ARCHITECTURE_*)\n    PackageProperty_ResourceId = 4,            // q: WCHAR[]\n    PackageProperty_Publisher = 5,             // q: WCHAR[]\n    PackageProperty_PublisherId = 6,           // q: WCHAR[]\n    PackageProperty_FamilyName = 7,            // q: WCHAR[]\n    PackageProperty_FullName = 8,              // q: WCHAR[]\n    PackageProperty_Flags = 9,                 // q: ULONG\n    PackageProperty_InstalledLocation = 10,    // q: WCHAR[]\n    PackageProperty_DisplayName = 11,          // q: WCHAR[]\n    PackageProperty_PublisherDisplayName = 12, // q: WCHAR[]\n    PackageProperty_Description = 13,          // q: WCHAR[]\n    PackageProperty_Logo = 14,                 // q: WCHAR[]\n    PackageProperty_PackageOrigin = 15         // q: PackageOrigin\n} PackageProperty;\n\n// private\ntypedef struct _PACKAGE_APPLICATION_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *PACKAGE_APPLICATION_CONTEXT_REFERENCE;\n\n// private\ntypedef enum PackageApplicationProperty\n{\n    PackageApplicationProperty_Aumid = 1,                        // q: WCHAR[]\n    PackageApplicationProperty_Praid = 2,                        // q: WCHAR[]\n    PackageApplicationProperty_DisplayName = 3,                  // q: WCHAR[]\n    PackageApplicationProperty_Description = 4,                  // q: WCHAR[]\n    PackageApplicationProperty_Logo = 5,                         // q: WCHAR[]\n    PackageApplicationProperty_SmallLogo = 6,                    // q: WCHAR[]\n    PackageApplicationProperty_ForegroundText = 7,               // q: ULONG\n    PackageApplicationProperty_ForegroundTextString = 8,         // q: WCHAR[]\n    PackageApplicationProperty_BackgroundColor = 9,              // q: ULONG\n    PackageApplicationProperty_StartPage = 10,                   // q: WCHAR[]\n    PackageApplicationProperty_ContentURIRulesCount = 11,        // q: ULONG\n    PackageApplicationProperty_ContentURIRules = 12,             // q: WCHAR[] (multi-sz)\n    PackageApplicationProperty_StaticContentURIRulesCount = 13,  // q: ULONG\n    PackageApplicationProperty_StaticContentURIRules = 14,       // q: WCHAR[] (multi-sz)\n    PackageApplicationProperty_DynamicContentURIRulesCount = 15, // q: ULONG\n    PackageApplicationProperty_DynamicContentURIRules = 16       // q: WCHAR[] (multi-sz)\n} PackageApplicationProperty;\n\n// private\ntypedef struct _PACKAGE_RESOURCES_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *PACKAGE_RESOURCES_CONTEXT_REFERENCE;\n\n// private\ntypedef enum PackageResourcesProperty\n{\n    PackageResourcesProperty_DisplayName = 1,\n    PackageResourcesProperty_PublisherDisplayName = 2,\n    PackageResourcesProperty_Description = 3,\n    PackageResourcesProperty_Logo = 4,\n    PackageResourcesProperty_SmallLogo = 5,\n    PackageResourcesProperty_StartPage = 6\n} PackageResourcesProperty;\n\n// private\ntypedef struct _PACKAGE_SECURITY_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *PACKAGE_SECURITY_CONTEXT_REFERENCE;\n\n// private\ntypedef enum PackageSecurityProperty\n{\n    PackageSecurityProperty_SecurityFlags = 1,     // q: ULONG\n    PackageSecurityProperty_AppContainerSID = 2,   // q: Sid\n    PackageSecurityProperty_CapabilitiesCount = 3, // q: ULONG\n    PackageSecurityProperty_Capabilities = 4       // q: Sid[]\n} PackageSecurityProperty;\n\n// private\ntypedef struct _TARGET_PLATFORM_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *TARGET_PLATFORM_CONTEXT_REFERENCE;\n\n// private\ntypedef enum TargetPlatformProperty\n{\n    TargetPlatformProperty_Platform = 1,   // q: ULONG\n    TargetPlatformProperty_MinVersion = 2, // q: PACKAGE_VERSION\n    TargetPlatformProperty_MaxVersion = 3  // q: PACKAGE_VERSION\n} TargetPlatformProperty;\n\n// private\ntypedef struct _PACKAGE_GLOBALIZATION_CONTEXT_REFERENCE\n{\n    PVOID reserved;\n} *PACKAGE_GLOBALIZATION_CONTEXT_REFERENCE;\n\n// private\ntypedef enum PackageGlobalizationProperty\n{\n    PackageGlobalizationProperty_ForceUtf8 = 1,                // q: ULONG\n    PackageGlobalizationProperty_UseWindowsDisplayLanguage = 2 // q: ULONG\n} PackageGlobalizationProperty;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetCurrentPackageContext(\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_CONTEXT_REFERENCE *PackageContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_CONTEXT_REFERENCE *PackageContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageProperty(\n    _In_ PACKAGE_CONTEXT_REFERENCE PackageContext,\n    _In_ PackageProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackagePropertyString(\n    _In_ PACKAGE_CONTEXT_REFERENCE PackageContext,\n    _In_ PackageProperty PropertyId,\n    _Inout_ PULONG BufferLength,\n    _Out_writes_(BufferLength) PWSTR Buffer\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageOSMaxVersionTested(\n    _In_ PACKAGE_CONTEXT_REFERENCE PackageContext,\n    _Out_ ULONGLONG *OSMaxVersionTested // PACKAGE_VERSION\n    );\n\n//\n// Package Application Properties\n//\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetCurrentPackageApplicationContext(\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_APPLICATION_CONTEXT_REFERENCE *PackageApplicationContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageApplicationContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_APPLICATION_CONTEXT_REFERENCE *PackageApplicationContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageApplicationProperty(\n    _In_ PACKAGE_APPLICATION_CONTEXT_REFERENCE PackageApplicationContext,\n    _In_ PackageApplicationProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageApplicationPropertyString(\n    _In_ PACKAGE_APPLICATION_CONTEXT_REFERENCE PackageApplicationContext,\n    _In_ PackageApplicationProperty PropertyId,\n    _Inout_ PULONG BufferLength,\n    _Out_writes_(BufferLength) PWSTR Buffer\n    );\n\n//\n// Package Resource Properties\n//\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetCurrentPackageResourcesContext(\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_RESOURCES_CONTEXT_REFERENCE *PackageResourcesContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetPackageResourcesContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_RESOURCES_CONTEXT_REFERENCE *PackageResourcesContext\n    );\n\n// rev\nWINBASEAPI\nULONG\nWINAPI\nGetCurrentPackageApplicationResourcesContext(\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_APPLICATION_CONTEXT_REFERENCE *PackageResourcesContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageApplicationResourcesContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_APPLICATION_CONTEXT_REFERENCE *PackageResourcesContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageResourcesProperty(\n    _In_ PACKAGE_APPLICATION_CONTEXT_REFERENCE PackageResourcesContext,\n    _In_ PackageResourcesProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n//\n// Package Security Properties\n//\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetCurrentPackageSecurityContext(\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_SECURITY_CONTEXT_REFERENCE *PackageSecurityContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageSecurityContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_SECURITY_CONTEXT_REFERENCE *PackageSecurityContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageSecurityProperty(\n    _In_ PACKAGE_SECURITY_CONTEXT_REFERENCE PackageSecurityContext,\n    _In_ PackageSecurityProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n//\n// Target Platform Properties\n//\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetCurrentTargetPlatformContext(\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ TARGET_PLATFORM_CONTEXT_REFERENCE *TargetPlatformContext\n    );\n\nWINBASEAPI\nLONG\nWINAPI\nGetTargetPlatformContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ TARGET_PLATFORM_CONTEXT_REFERENCE *TargetPlatformContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageTargetPlatformProperty(\n    _In_ TARGET_PLATFORM_CONTEXT_REFERENCE TargetPlatformContext,\n    _In_ TargetPlatformProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n\n// rev\nWINBASEAPI\nHRESULT\nWINAPI\nGetCurrentPackageInfo3(\n    _In_ ULONG flags,\n    _In_ ULONG packagePathType, // PackagePathType\n    _Inout_ PULONG bufferLength,\n    _Out_writes_bytes_opt_(*bufferLength) PVOID buffer,\n    _Out_opt_ PULONG count\n    );\n\n//\n// Package Globalization Properties\n//\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetCurrentPackageGlobalizationContext(\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_GLOBALIZATION_CONTEXT_REFERENCE *PackageGlobalizationContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageGlobalizationContext(\n    _In_ PVOID PackageInfoReference, // PACKAGE_INFO_REFERENCE\n    _In_ ULONG Index,\n    _Reserved_ ULONG_PTR Unused,\n    _Out_ PACKAGE_GLOBALIZATION_CONTEXT_REFERENCE *PackageGlobalizationContext\n    );\n\n// rev\nWINBASEAPI\nLONG\nWINAPI\nGetPackageGlobalizationProperty(\n    _In_ PACKAGE_GLOBALIZATION_CONTEXT_REFERENCE PackageGlobalizationContext,\n    _In_ PackageGlobalizationProperty PropertyId,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_(BufferSize) PVOID Buffer\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\n#endif // _NTMISC_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntmmapi.h",
    "content": "/*\n * Memory Manager Support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTMMAPI_H\n#define _NTMMAPI_H\n\n//\n// Memory Protection Constants\n//\n\n#define PAGE_NOACCESS 0x01              // Disables all access to the committed region of pages. An attempt to read from, write to, or execute the committed region results in an access violation.\n#define PAGE_READONLY 0x02              // Enables read-only access to the committed region of pages. An attempt to write or execute the committed region results in an access violation.\n#define PAGE_READWRITE 0x04             // Enables read-only or read/write access to the committed region of pages.\n#define PAGE_WRITECOPY 0x08             // Enables read-only or copy-on-write access to a mapped view of a file mapping object.\n#define PAGE_EXECUTE 0x10               // Enables execute access to the committed region of pages. An attempt to write to the committed region results in an access violation.\n#define PAGE_EXECUTE_READ 0x20          // Enables execute or read-only access to the committed region of pages. An attempt to write to the committed region results in an access violation.\n#define PAGE_EXECUTE_READWRITE 0x40     // Enables execute, read-only, or read/write access to the committed region of pages.\n#define PAGE_EXECUTE_WRITECOPY 0x80     // Enables execute, read-only, or copy-on-write access to a mapped view of a file mapping object.\n#define PAGE_GUARD 0x100                // Pages in the region become guard pages. Any attempt to access a guard page causes the system to raise a STATUS_GUARD_PAGE_VIOLATION exception.\n#define PAGE_NOCACHE 0x200              // Sets all pages to be non-cachable. Applications should not use this attribute. Using interlocked functions with memory that is mapped with SEC_NOCACHE can result in an EXCEPTION_ILLEGAL_INSTRUCTION exception.\n#define PAGE_WRITECOMBINE 0x400         // Sets all pages to be write-combined. Applications should not use this attribute. Using interlocked functions with memory that is mapped with SEC_NOCACHE can result in an EXCEPTION_ILLEGAL_INSTRUCTION exception.\n\n#define PAGE_REVERT_TO_FILE_MAP     0x80000000 // Pages in the region can revert modified copy-on-write pages to the original unmodified page when using the mapped view of a file mapping object.\n#define PAGE_ENCLAVE_THREAD_CONTROL 0x80000000 // Pages in the region contain a thread control structure (TCS) from the Intel Software Guard Extensions programming model.\n#define PAGE_TARGETS_NO_UPDATE      0x40000000 // Pages in the region will not update the CFG bitmap when the protection changes. The default behavior for VirtualProtect is to mark all locations as valid call targets for CFG.\n#define PAGE_TARGETS_INVALID        0x40000000 // Pages in the region are excluded from the CFG bitmap as valid targets. Any indirect call to locations in those pages will terminate the process using the __fastfail intrinsic.\n#define PAGE_ENCLAVE_UNVALIDATED    0x20000000 // Pages in the region are excluded from measurement with the EEXTEND instruction of the Intel Software Guard Extensions programming model.\n#define PAGE_ENCLAVE_NO_CHANGE      0x20000000\n#define PAGE_ENCLAVE_MASK           0x10000000\n#define PAGE_ENCLAVE_DECOMMIT       (PAGE_ENCLAVE_MASK | 0)\n#define PAGE_ENCLAVE_SS_FIRST       (PAGE_ENCLAVE_MASK | 1)\n#define PAGE_ENCLAVE_SS_REST        (PAGE_ENCLAVE_MASK | 2)\n\n//\n// Memory Region and Section Constants\n//\n\n#define MEM_COMMIT 0x00001000\n#define MEM_RESERVE 0x00002000\n#define MEM_DECOMMIT 0x00004000\n#define MEM_RELEASE 0x00008000\n#define MEM_FREE 0x00010000\n#define MEM_PRIVATE 0x00020000\n#define MEM_MAPPED 0x00040000\n#define MEM_RESET 0x00080000\n#define MEM_TOP_DOWN 0x00100000\n#define MEM_WRITE_WATCH 0x00200000\n#define MEM_PHYSICAL 0x00400000\n#define MEM_ROTATE 0x00800000\n#define MEM_DIFFERENT_IMAGE_BASE_OK 0x00800000\n#define MEM_RESET_UNDO 0x01000000\n#define MEM_LARGE_PAGES 0x20000000\n#define MEM_DOS_LIM 0x40000000\n#define MEM_4MB_PAGES 0x80000000\n#define MEM_64K_PAGES (MEM_LARGE_PAGES | MEM_PHYSICAL)\n\n#define MEM_UNMAP_WITH_TRANSIENT_BOOST 0x00000001\n#define MEM_COALESCE_PLACEHOLDERS 0x00000001\n#define MEM_PRESERVE_PLACEHOLDER 0x00000002\n#define MEM_REPLACE_PLACEHOLDER 0x00004000\n#define MEM_RESERVE_PLACEHOLDER 0x00040000\n\n#define SEC_HUGE_PAGES 0x00020000\n#define SEC_PARTITION_OWNER_HANDLE 0x00040000\n#define SEC_64K_PAGES 0x00080000\n#define SEC_DRIVER_IMAGE 0x00100000 // rev\n#define SEC_BASED 0x00200000\n#define SEC_NO_CHANGE 0x00400000\n#define SEC_FILE 0x00800000\n#define SEC_IMAGE 0x01000000\n#define SEC_PROTECTED_IMAGE 0x02000000\n#define SEC_RESERVE 0x04000000\n#define SEC_COMMIT 0x08000000\n#define SEC_NOCACHE 0x10000000\n#define SEC_GLOBAL 0x20000000\n#define SEC_WRITECOMBINE 0x40000000\n#define SEC_LARGE_PAGES 0x80000000\n#define SEC_IMAGE_NO_EXECUTE (SEC_IMAGE | SEC_NOCACHE)\n#if (PHNT_MODE == PHNT_MODE_KERNEL)\n#define MEM_IMAGE SEC_IMAGE\n#endif\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _MEMORY_INFORMATION_CLASS\n{\n    MemoryBasicInformation, // q: MEMORY_BASIC_INFORMATION\n    MemoryWorkingSetInformation, // q: MEMORY_WORKING_SET_INFORMATION\n    MemoryMappedFilenameInformation, // q: UNICODE_STRING\n    MemoryRegionInformation, // q: MEMORY_REGION_INFORMATION\n    MemoryWorkingSetExInformation, // q: MEMORY_WORKING_SET_EX_INFORMATION // since VISTA\n    MemorySharedCommitInformation, // q: MEMORY_SHARED_COMMIT_INFORMATION // since WIN8\n    MemoryImageInformation, // q: MEMORY_IMAGE_INFORMATION\n    MemoryRegionInformationEx, // MEMORY_REGION_INFORMATION\n    MemoryPrivilegedBasicInformation, // MEMORY_BASIC_INFORMATION\n    MemoryEnclaveImageInformation, // MEMORY_ENCLAVE_IMAGE_INFORMATION // since REDSTONE3\n    MemoryBasicInformationCapped, // 10\n    MemoryPhysicalContiguityInformation, // MEMORY_PHYSICAL_CONTIGUITY_INFORMATION // since 20H1\n    MemoryBadInformation, // since WIN11\n    MemoryBadInformationAllProcesses, // since 22H1\n    MemoryImageExtensionInformation, // MEMORY_IMAGE_EXTENSION_INFORMATION // since 24H2\n    MaxMemoryInfoClass\n} MEMORY_INFORMATION_CLASS;\n#else\n#define MemoryBasicInformation 0x0\n#define MemoryWorkingSetInformation 0x1\n#define MemoryMappedFilenameInformation 0x2\n#define MemoryRegionInformation 0x3\n#define MemoryWorkingSetExInformation 0x4\n#define MemorySharedCommitInformation 0x5\n#define MemoryImageInformation 0x6\n#define MemoryRegionInformationEx 0x7\n#define MemoryPrivilegedBasicInformation 0x8\n#define MemoryEnclaveImageInformation 0x9\n#define MemoryBasicInformationCapped 0xA\n#define MemoryPhysicalContiguityInformation 0xB\n#define MemoryBadInformation 0xC\n#define MemoryBadInformationAllProcesses 0xD\n#define MemoryImageExtensionInformation 0xE\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// MEMORY_WORKING_SET_BLOCK->Protection\n#define MEMORY_BLOCK_NOT_ACCESSED 0\n#define MEMORY_BLOCK_READONLY 1\n#define MEMORY_BLOCK_EXECUTABLE 2\n#define MEMORY_BLOCK_EXECUTABLE_READONLY 3\n#define MEMORY_BLOCK_READWRITE 4\n#define MEMORY_BLOCK_COPYONWRITE 5\n#define MEMORY_BLOCK_EXECUTABLE_READWRITE 6\n#define MEMORY_BLOCK_EXECUTABLE_COPYONWRITE 7\n#define MEMORY_BLOCK_NOT_ACCESSED_2 8\n#define MEMORY_BLOCK_NON_CACHEABLE_READONLY 9\n#define MEMORY_BLOCK_NON_CACHEABLE_EXECUTABLE 10\n#define MEMORY_BLOCK_NON_CACHEABLE_EXECUTABLE_READONLY 11\n#define MEMORY_BLOCK_NON_CACHEABLE_READWRITE 12\n#define MEMORY_BLOCK_NON_CACHEABLE_COPYONWRITE 13\n#define MEMORY_BLOCK_NON_CACHEABLE_EXECUTABLE_READWRITE 14\n#define MEMORY_BLOCK_NON_CACHEABLE_EXECUTABLE_COPYONWRITE 15\n#define MEMORY_BLOCK_NOT_ACCESSED_3 16\n#define MEMORY_BLOCK_GUARD_READONLY 17\n#define MEMORY_BLOCK_GUARD_EXECUTABLE 18\n#define MEMORY_BLOCK_GUARD_EXECUTABLE_READONLY 19\n#define MEMORY_BLOCK_GUARD_READWRITE 20\n#define MEMORY_BLOCK_GUARD_COPYONWRITE 21\n#define MEMORY_BLOCK_GUARD_EXECUTABLE_READWRITE 22\n#define MEMORY_BLOCK_GUARD_EXECUTABLE_COPYONWRITE 23\n#define MEMORY_BLOCK_NOT_ACCESSED_4 24\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_READONLY 25\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_EXECUTABLE 26\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_EXECUTABLE_READONLY 27\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_READWRITE 28\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_COPYONWRITE 29\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_EXECUTABLE_READWRITE 30\n#define MEMORY_BLOCK_NON_CACHEABLE_GUARD_EXECUTABLE_COPYONWRITE 31\n\n/**\n * The MEMORY_WORKING_SET_BLOCK structure contains working set information for a page.\n *\n * @ref https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_working_set_block\n */\ntypedef struct _MEMORY_WORKING_SET_BLOCK\n{\n    ULONG_PTR Protection : 5;       // The protection attributes of the page. This member can be one of above MEMORY_BLOCK_* values.\n    ULONG_PTR ShareCount : 3;       // The number of processes that share this page. The maximum value of this member is 7.\n    ULONG_PTR Shared : 1;           // If this bit is 1, the page is sharable; otherwise, the page is not sharable.\n    ULONG_PTR Node : 3;             // The NUMA node where the physical memory should reside.\n#ifdef _WIN64\n    ULONG_PTR VirtualPage : 52;     // The address of the page in the virtual address space.\n#else\n    ULONG VirtualPage : 20;         // The address of the page in the virtual address space.\n#endif\n} MEMORY_WORKING_SET_BLOCK, *PMEMORY_WORKING_SET_BLOCK;\n\n/**\n * The MEMORY_WORKING_SET_INFORMATION structure contains working set information for a process.\n *\n * @ref https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_working_set_information\n */\ntypedef struct _MEMORY_WORKING_SET_INFORMATION\n{\n    ULONG_PTR NumberOfEntries;\n    _Field_size_(NumberOfEntries) MEMORY_WORKING_SET_BLOCK WorkingSetInfo[ANYSIZE_ARRAY];\n} MEMORY_WORKING_SET_INFORMATION, *PMEMORY_WORKING_SET_INFORMATION;\n\n// private\ntypedef struct _MEMORY_REGION_INFORMATION\n{\n    PVOID AllocationBase;\n    ULONG AllocationProtect;\n    union\n    {\n        ULONG RegionType;\n        struct\n        {\n            ULONG Private : 1;\n            ULONG MappedDataFile : 1;\n            ULONG MappedImage : 1;\n            ULONG MappedPageFile : 1;\n            ULONG MappedPhysical : 1;\n            ULONG DirectMapped : 1;\n            ULONG SoftwareEnclave : 1; // REDSTONE3\n            ULONG PageSize64K : 1;\n            ULONG PlaceholderReservation : 1; // REDSTONE4\n            ULONG MappedAwe : 1; // 21H1\n            ULONG MappedWriteWatch : 1;\n            ULONG PageSizeLarge : 1;\n            ULONG PageSizeHuge : 1;\n            ULONG Reserved : 19;\n        };\n    };\n    SIZE_T RegionSize;\n    SIZE_T CommitSize;\n    ULONG_PTR PartitionId; // 19H1\n    ULONG_PTR NodePreference; // 20H1\n} MEMORY_REGION_INFORMATION, *PMEMORY_REGION_INFORMATION;\n\n// private\ntypedef enum _MEMORY_WORKING_SET_EX_LOCATION\n{\n    MemoryLocationInvalid,\n    MemoryLocationResident,\n    MemoryLocationPagefile,\n    MemoryLocationReserved\n} MEMORY_WORKING_SET_EX_LOCATION;\n\n/**\n * The MEMORY_WORKING_SET_EX_BLOCK structure contains extended working set information for a page.\n *\n * @ref https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_working_set_ex_block\n */\ntypedef union _MEMORY_WORKING_SET_EX_BLOCK\n{\n    ULONG_PTR Flags;\n    union\n    {\n        struct\n        {\n            ULONG_PTR Valid : 1;                    // If this bit is 1, the subsequent members are valid; otherwise they should be ignored.\n            ULONG_PTR ShareCount : 3;               // The number of processes that share this page. The maximum value of this member is 7.\n            ULONG_PTR Win32Protection : 11;         // The memory protection attributes of the page.\n            ULONG_PTR Shared : 1;                   // If this bit is 1, the page can be shared.\n            ULONG_PTR Node : 6;                     // The NUMA node. The maximum value of this member is 63.\n            ULONG_PTR Locked : 1;                   // If this bit is 1, the virtual page is locked in physical memory.\n            ULONG_PTR LargePage : 1;                // If this bit is 1, the page is a large page.\n            ULONG_PTR Priority : 3;                 // The memory priority attributes of the page.\n            ULONG_PTR Reserved : 3;\n            ULONG_PTR SharedOriginal : 1;           // If this bit is 1, the page was not modified.\n            ULONG_PTR Bad : 1;                      // If this bit is 1, the page is has been reported as bad.\n#ifdef _WIN64\n            ULONG_PTR Win32GraphicsProtection : 4;  // The memory protection attributes of the page. // since 19H1\n            ULONG_PTR ReservedUlong : 28;\n#endif\n        };\n        struct\n        {\n            ULONG_PTR Valid : 1;                    // If this bit is 0, the subsequent members are valid; otherwise they should be ignored.\n            ULONG_PTR Reserved0 : 14;\n            ULONG_PTR Shared : 1;                   // If this bit is 1, the page can be shared.\n            ULONG_PTR Reserved1 : 5;\n            ULONG_PTR PageTable : 1;\n            ULONG_PTR Location : 2;                 // The memory location of the page.  MEMORY_WORKING_SET_EX_LOCATION\n            ULONG_PTR Priority : 3;                 // The memory priority of the page.\n            ULONG_PTR ModifiedList : 1;\n            ULONG_PTR Reserved2 : 2;\n            ULONG_PTR SharedOriginal : 1;           // If this bit is 1, the page was not modified.\n            ULONG_PTR Bad : 1;                      // If this bit is 1, the page is has been reported as bad.\n#ifdef _WIN64\n            ULONG_PTR ReservedUlong : 32;\n#endif\n        } Invalid;\n    };\n} MEMORY_WORKING_SET_EX_BLOCK, *PMEMORY_WORKING_SET_EX_BLOCK;\n\n/**\n * The MEMORY_WORKING_SET_EX_INFORMATION structure contains extended working set information for a process.\n *\n * @ref https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_working_set_ex_information\n */\ntypedef struct _MEMORY_WORKING_SET_EX_INFORMATION\n{\n    PVOID VirtualAddress;                             // The virtual address.\n    MEMORY_WORKING_SET_EX_BLOCK VirtualAttributes;    // The attributes of the page at VirtualAddress.\n} MEMORY_WORKING_SET_EX_INFORMATION, *PMEMORY_WORKING_SET_EX_INFORMATION;\n\n// private\ntypedef struct _MEMORY_SHARED_COMMIT_INFORMATION\n{\n    SIZE_T CommitSize;\n} MEMORY_SHARED_COMMIT_INFORMATION, *PMEMORY_SHARED_COMMIT_INFORMATION;\n\n// private\ntypedef struct _MEMORY_IMAGE_INFORMATION\n{\n    PVOID ImageBase;\n    SIZE_T SizeOfImage;\n    union\n    {\n        ULONG ImageFlags;\n        struct\n        {\n            ULONG ImagePartialMap : 1;\n            ULONG ImageNotExecutable : 1;\n            ULONG ImageSigningLevel : 4; // REDSTONE3\n            ULONG ImageExtensionPresent : 1; // since 24H2\n            ULONG Reserved : 25;\n        };\n    };\n} MEMORY_IMAGE_INFORMATION, *PMEMORY_IMAGE_INFORMATION;\n\n// private\ntypedef struct _MEMORY_ENCLAVE_IMAGE_INFORMATION\n{\n    MEMORY_IMAGE_INFORMATION ImageInfo;\n    UCHAR UniqueID[32];\n    UCHAR AuthorID[32];\n} MEMORY_ENCLAVE_IMAGE_INFORMATION, *PMEMORY_ENCLAVE_IMAGE_INFORMATION;\n\n// private\ntypedef enum _MEMORY_PHYSICAL_CONTIGUITY_UNIT_STATE\n{\n    MemoryNotContiguous,\n    MemoryAlignedAndContiguous,\n    MemoryNotResident,\n    MemoryNotEligibleToMakeContiguous,\n    MemoryContiguityStateMax,\n} MEMORY_PHYSICAL_CONTIGUITY_UNIT_STATE;\n\n// private\ntypedef struct _MEMORY_PHYSICAL_CONTIGUITY_UNIT_INFORMATION\n{\n    union\n    {\n        struct\n        {\n            ULONG State : 2;\n            ULONG Reserved : 30;\n        };\n        ULONG AllInformation;\n    };\n} MEMORY_PHYSICAL_CONTIGUITY_UNIT_INFORMATION, *PMEMORY_PHYSICAL_CONTIGUITY_UNIT_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PHYSICAL_CONTIGUITY_INFORMATION\n{\n    PVOID VirtualAddress;\n    ULONG_PTR Size;\n    ULONG_PTR ContiguityUnitSize;\n    ULONG Flags;\n    PMEMORY_PHYSICAL_CONTIGUITY_UNIT_INFORMATION ContiguityUnitInformation;\n} MEMORY_PHYSICAL_CONTIGUITY_INFORMATION, *PMEMORY_PHYSICAL_CONTIGUITY_INFORMATION;\n\n// private\ntypedef struct _RTL_SCP_CFG_ARM64_HEADER\n{\n    ULONG EcInvalidCallHandlerRva;\n    ULONG EcCfgCheckRva;\n    ULONG EcCfgCheckESRva;\n    ULONG EcCallCheckRva;\n    ULONG CpuInitializationCompleteLoadRva;\n    ULONG LdrpValidateEcCallTargetInitRva;\n    ULONG SyscallFfsSizeRva;\n    ULONG SyscallFfsBaseRva;\n} RTL_SCP_CFG_ARM64_HEADER, *PRTL_SCP_CFG_ARM64_HEADER;\n\n// private\ntypedef enum _RTL_SCP_CFG_PAGE_TYPE\n{\n    RtlScpCfgPageTypeNop,\n    RtlScpCfgPageTypeDefault,\n    RtlScpCfgPageTypeExportSuppression,\n    RtlScpCfgPageTypeFptr,\n    RtlScpCfgPageTypeMax,\n    RtlScpCfgPageTypeNone\n} RTL_SCP_CFG_PAGE_TYPE;\n\n// private\ntypedef struct _RTL_SCP_CFG_COMMON_HEADER\n{\n    ULONG CfgDispatchRva;\n    ULONG CfgDispatchESRva;\n    ULONG CfgCheckRva;\n    ULONG CfgCheckESRva;\n    ULONG InvalidCallHandlerRva;\n    ULONG FnTableRva;\n} RTL_SCP_CFG_COMMON_HEADER, *PRTL_SCP_CFG_COMMON_HEADER;\n\n// private\ntypedef struct _RTL_SCP_CFG_HEADER\n{\n    RTL_SCP_CFG_COMMON_HEADER Common;\n} RTL_SCP_CFG_HEADER, *PRTL_SCP_CFG_HEADER;\n\n// private\ntypedef struct _RTL_SCP_CFG_REGION_BOUNDS\n{\n    PVOID StartAddress;\n    PVOID EndAddress;\n} RTL_SCP_CFG_REGION_BOUNDS, *PRTL_SCP_CFG_REGION_BOUNDS;\n\n// private\ntypedef struct _RTL_SCP_CFG_NTDLL_EXPORTS\n{\n    RTL_SCP_CFG_REGION_BOUNDS ScpRegions[4];\n    PVOID CfgDispatchFptr;\n    PVOID CfgDispatchESFptr;\n    PVOID CfgCheckFptr;\n    PVOID CfgCheckESFptr;\n    PVOID IllegalCallHandler;\n} RTL_SCP_CFG_NTDLL_EXPORTS, *PRTL_SCP_CFG_NTDLL_EXPORTS;\n\n// private\ntypedef struct _RTL_SCP_CFG_NTDLL_EXPORTS_ARM64EC\n{\n    PVOID EcInvalidCallHandler;\n    PVOID EcCfgCheckFptr;\n    PVOID EcCfgCheckESFptr;\n    PVOID EcCallCheckFptr;\n    PVOID CpuInitializationComplete;\n    PVOID LdrpValidateEcCallTargetInit;\n    struct\n    {\n        PVOID SyscallFfsSize;\n        union\n        {\n            PVOID Ptr;\n            ULONG Value;\n        };\n    };\n    PVOID SyscallFfsBase;\n} RTL_SCP_CFG_NTDLL_EXPORTS_ARM64EC, *PRTL_SCP_CFG_NTDLL_EXPORTS_ARM64EC;\n\n// private\ntypedef struct _RTL_RETPOLINE_ROUTINES\n{\n    ULONG SwitchtableJump[16];\n    ULONG CfgIndirectRax;\n    ULONG NonCfgIndirectRax;\n    ULONG ImportR10;\n    ULONG JumpHpat;\n} RTL_RETPOLINE_ROUTINES, *PRTL_RETPOLINE_ROUTINES;\n\n// private\ntypedef struct _RTL_KSCP_ROUTINES\n{\n    ULONG UnwindDataOffset;\n    RTL_RETPOLINE_ROUTINES RetpolineRoutines;\n    ULONG CfgDispatchSmep;\n    ULONG CfgDispatchNoSmep;\n} RTL_KSCP_ROUTINES, *PRTL_KSCP_ROUTINES;\n\n// private\ntypedef enum _MEMORY_IMAGE_EXTENSION_TYPE\n{\n    MemoryImageExtensionCfgScp,\n    MemoryImageExtensionCfgEmulatedScp,\n    MemoryImageExtensionTypeMax,\n} MEMORY_IMAGE_EXTENSION_TYPE;\n\n// private\ntypedef struct _MEMORY_IMAGE_EXTENSION_INFORMATION\n{\n    MEMORY_IMAGE_EXTENSION_TYPE ExtensionType;\n    ULONG Flags;\n    PVOID ExtensionImageBaseRva;\n    SIZE_T ExtensionSize;\n} MEMORY_IMAGE_EXTENSION_INFORMATION, *PMEMORY_IMAGE_EXTENSION_INFORMATION;\n\n#define MMPFNLIST_ZERO 0\n#define MMPFNLIST_FREE 1\n#define MMPFNLIST_STANDBY 2\n#define MMPFNLIST_MODIFIED 3\n#define MMPFNLIST_MODIFIEDNOWRITE 4\n#define MMPFNLIST_BAD 5\n#define MMPFNLIST_ACTIVE 6\n#define MMPFNLIST_TRANSITION 7\n\n//typedef enum _MMLISTS\n//{\n//    ZeroedPageList = 0,\n//    FreePageList = 1,\n//    StandbyPageList = 2,\n//    ModifiedPageList = 3,\n//    ModifiedNoWritePageList = 4,\n//    BadPageList = 5,\n//    ActiveAndValid = 6,\n//    TransitionPage = 7\n//} MMLISTS;\n\n#define MMPFNUSE_PROCESSPRIVATE 0\n#define MMPFNUSE_FILE 1\n#define MMPFNUSE_PAGEFILEMAPPED 2\n#define MMPFNUSE_PAGETABLE 3\n#define MMPFNUSE_PAGEDPOOL 4\n#define MMPFNUSE_NONPAGEDPOOL 5\n#define MMPFNUSE_SYSTEMPTE 6\n#define MMPFNUSE_SESSIONPRIVATE 7\n#define MMPFNUSE_METAFILE 8\n#define MMPFNUSE_AWEPAGE 9\n#define MMPFNUSE_DRIVERLOCKPAGE 10\n#define MMPFNUSE_KERNELSTACK 11\n\n//typedef enum _MMPFNUSE\n//{\n//    ProcessPrivatePage,\n//    MemoryMappedFilePage,\n//    PageFileMappedPage,\n//    PageTablePage,\n//    PagedPoolPage,\n//    NonPagedPoolPage,\n//    SystemPTEPage,\n//    SessionPrivatePage,\n//    MetafilePage,\n//    AWEPage,\n//    DriverLockedPage,\n//    KernelStackPage\n//} MMPFNUSE;\n\n// private\ntypedef struct _MEMORY_FRAME_INFORMATION\n{\n    ULONGLONG UseDescription : 4; // MMPFNUSE_*\n    ULONGLONG ListDescription : 3; // MMPFNLIST_*\n    ULONGLONG Cold : 1; // 19H1\n    ULONGLONG Pinned : 1; // 1 - pinned, 0 - not pinned\n    ULONGLONG DontUse : 48; // *_INFORMATION overlay\n    ULONGLONG Priority : 3;\n    ULONGLONG NonTradeable : 1;\n    ULONGLONG Reserved : 3;\n} MEMORY_FRAME_INFORMATION, *PMEMORY_FRAME_INFORMATION;\n\n// private\ntypedef struct _FILEOFFSET_INFORMATION\n{\n    ULONGLONG DontUse : 9; // MEMORY_FRAME_INFORMATION overlay\n    ULONGLONG Offset : 48; // mapped files\n    ULONGLONG Reserved : 7;\n} FILEOFFSET_INFORMATION, *PFILEOFFSET_INFORMATION;\n\n// private\ntypedef struct _PAGEDIR_INFORMATION\n{\n    ULONGLONG DontUse : 9; // MEMORY_FRAME_INFORMATION overlay\n    ULONGLONG PageDirectoryBase : 48; // private pages\n    ULONGLONG Reserved : 7;\n} PAGEDIR_INFORMATION, *PPAGEDIR_INFORMATION;\n\n// private\ntypedef struct _UNIQUE_PROCESS_INFORMATION\n{\n    ULONGLONG DontUse : 9; // MEMORY_FRAME_INFORMATION overlay\n    ULONGLONG UniqueProcessKey : 48; // ProcessId\n    ULONGLONG Reserved  : 7;\n} UNIQUE_PROCESS_INFORMATION, *PUNIQUE_PROCESS_INFORMATION;\n\n// private\ntypedef struct _MMPFN_IDENTITY\n{\n    union\n    {\n        MEMORY_FRAME_INFORMATION e1; // all\n        FILEOFFSET_INFORMATION e2; // mapped files\n        PAGEDIR_INFORMATION e3; // private pages\n        UNIQUE_PROCESS_INFORMATION e4; // owning process\n    } u1;\n    ULONG_PTR PageFrameIndex; // all\n    union\n    {\n        struct\n        {\n            ULONG_PTR Image : 1;\n            ULONG_PTR Mismatch : 1;\n        } e1;\n        struct\n        {\n            ULONG_PTR CombinedPage;\n        } e2;\n        ULONG_PTR FileObject; // mapped files\n        ULONG_PTR UniqueFileObjectKey;\n        ULONG_PTR ProtoPteAddress;\n        ULONG_PTR VirtualAddress;  // everything else\n    } u2;\n} MMPFN_IDENTITY, *PMMPFN_IDENTITY;\n\ntypedef struct _MMPFN_MEMSNAP_INFORMATION\n{\n    ULONG_PTR InitialPageFrameIndex;\n    ULONG_PTR Count;\n} MMPFN_MEMSNAP_INFORMATION, *PMMPFN_MEMSNAP_INFORMATION;\n\ntypedef enum _SECTION_INFORMATION_CLASS\n{\n    SectionBasicInformation, // q; SECTION_BASIC_INFORMATION\n    SectionImageInformation, // q; SECTION_IMAGE_INFORMATION\n    SectionRelocationInformation, // q; ULONG_PTR RelocationDelta // name:wow64:whNtQuerySection_SectionRelocationInformation // since WIN7\n    SectionOriginalBaseInformation, // q; PVOID BaseAddress // since REDSTONE\n    SectionInternalImageInformation, // SECTION_INTERNAL_IMAGE_INFORMATION // since REDSTONE2\n    MaxSectionInfoClass\n} SECTION_INFORMATION_CLASS;\n\n/**\n * The SECTION_BASIC_INFORMATION structure contains information of an opened section object.\n *\n * @sa https://learn.microsoft.com/en-us/windows/win32/devnotes/ntquerysection\n */\ntypedef struct _SECTION_BASIC_INFORMATION\n{\n    PVOID BaseAddress;              // The base virtual address of the section if the section is based.\n    ULONG AllocationAttributes;     // The allocation attributes flags.\n    LARGE_INTEGER MaximumSize;      // The maximum size of the section in bytes.\n} SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;\n\n// symbols\ntypedef struct _SECTION_IMAGE_INFORMATION\n{\n    PVOID TransferAddress;\n    ULONG ZeroBits;\n    SIZE_T MaximumStackSize;\n    SIZE_T CommittedStackSize;\n    ULONG SubSystemType;\n    union\n    {\n        struct\n        {\n            USHORT SubSystemMinorVersion;\n            USHORT SubSystemMajorVersion;\n        };\n        ULONG SubSystemVersion;\n    };\n    union\n    {\n        struct\n        {\n            USHORT MajorOperatingSystemVersion;\n            USHORT MinorOperatingSystemVersion;\n        };\n        ULONG OperatingSystemVersion;\n    };\n    USHORT ImageCharacteristics;\n    USHORT DllCharacteristics;\n    USHORT Machine;\n    BOOLEAN ImageContainsCode;\n    union\n    {\n        UCHAR ImageFlags;\n        struct\n        {\n            UCHAR ComPlusNativeReady : 1;\n            UCHAR ComPlusILOnly : 1;\n            UCHAR ImageDynamicallyRelocated : 1;\n            UCHAR ImageMappedFlat : 1;\n            UCHAR BaseBelow4gb : 1;\n            UCHAR ComPlusPrefer32bit : 1;\n            UCHAR Reserved : 2;\n        };\n    };\n    ULONG LoaderFlags;\n    ULONG ImageFileSize;\n    ULONG CheckSum;\n} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;\n\n// symbols\ntypedef struct _SECTION_INTERNAL_IMAGE_INFORMATION\n{\n    SECTION_IMAGE_INFORMATION SectionInformation;\n    union\n    {\n        ULONG ExtendedFlags;\n        struct\n        {\n            ULONG ImageExportSuppressionEnabled : 1;\n            ULONG ImageCetShadowStacksReady : 1; // 20H1\n            ULONG ImageXfgEnabled : 1; // 20H2\n            ULONG ImageCetShadowStacksStrictMode : 1;\n            ULONG ImageCetSetContextIpValidationRelaxedMode : 1;\n            ULONG ImageCetDynamicApisAllowInProc : 1;\n            ULONG ImageCetDowngradeReserved1 : 1;\n            ULONG ImageCetDowngradeReserved2 : 1;\n            ULONG ImageExportSuppressionInfoPresent : 1;\n            ULONG ImageCfgEnabled : 1;\n            ULONG Reserved : 22;\n        };\n    };\n} SECTION_INTERNAL_IMAGE_INFORMATION, *PSECTION_INTERNAL_IMAGE_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _SECTION_INHERIT\n{\n    ViewShare = 1,\n    ViewUnmap = 2\n} SECTION_INHERIT;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#define MEM_EXECUTE_OPTION_ENABLE 0x1\n#define MEM_EXECUTE_OPTION_DISABLE 0x2\n#define MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION 0x4\n#define MEM_EXECUTE_OPTION_PERMANENT 0x8\n#define MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE 0x10\n#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20\n#define MEM_EXECUTE_OPTION_DISABLE_EXCEPTION_CHAIN_VALIDATION 0x40\n#define MEM_EXECUTE_OPTION_VALID_FLAGS 0x7f\n\n//\n// Virtual memory\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The NtAllocateVirtualMemory routine reserves, commits, or both, a region of pages within the user-mode virtual address space of a specified process.\n *\n * @param ProcessHandle A handle for the process for which the mapping should be done.\n * @param BaseAddress A pointer to a variable that will receive the base address of the allocated region of pages. If the initial value is not zero, the region is allocated at the specified virtual address.\n * @param ZeroBits The number of high-order address bits that must be zero in the base address of the section view. This value must be less than 21 and the initial value of BaseAddress must be zero.\n * @param RegionSize A pointer to a variable that will receive the actual size, in bytes, of the allocated region of pages.\n * @param AllocationType A bitmask containing flags that specify the type of allocation to be performed.\n * @param PageProtection A bitmask containing page protection flags that specify the protection desired for the committed region of pages.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwallocatevirtualmemory\n */\n_Must_inspect_result_\n_When_(return == 0, __drv_allocatesMem(mem))\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*RegionSize) _Writable_bytes_(*RegionSize) _Post_readable_byte_size_(*RegionSize)) PVOID *BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n/**\n * The NtAllocateVirtualMemoryEx routine reserves, commits, or both, a region of pages within the user-mode virtual address space of a specified process.\n *\n * @param ProcessHandle A handle for the process for which the mapping should be done.\n * @param BaseAddress A pointer to a variable that will receive the base address of the allocated region of pages. If the initial value is not zero, the region is allocated at the specified virtual address.\n * @param ZeroBits The number of high-order address bits that must be zero in the base address of the section view. This value must be less than 21 and the initial value of BaseAddress must be zero.\n * @param RegionSize A pointer to a variable that will receive the actual size, in bytes, of the allocated region of pages.\n * @param AllocationType A bitmask containing flags that specify the type of allocation to be performed.\n * @param PageProtection A bitmask containing page protection flags that specify the protection desired for the committed region of pages.\n * @param ExtendedParameters An optional pointer to one or more extended parameters of type MEM_EXTENDED_PARAMETER.\n * @param ExtendedParameterCount Specifies the number of elements in the ExtendedParameters array.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwallocatevirtualmemory\n */\n_Must_inspect_result_\n_When_(return == 0, __drv_allocatesMem(mem))\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateVirtualMemoryEx(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*RegionSize) _Writable_bytes_(*RegionSize) _Post_readable_byte_size_(*RegionSize)) PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n\n/**\n * Frees virtual memory allocated for a process.\n *\n * @param ProcessHandle A handle to the process whose virtual memory is to be freed.\n * @param BaseAddress A pointer to the base address of the region of pages to be freed.\n * @param RegionSize A pointer to a variable that specifies the size of the region of memory to be freed.\n * @param FreeType The type of free operation. This parameter can be MEM_DECOMMIT or MEM_RELEASE.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFreeVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG FreeType\n    );\n\n/**\n * Reads virtual memory from a process.\n *\n * @param ProcessHandle A handle to the process whose memory is to be read.\n * @param BaseAddress A pointer to the base address in the specified process from which to read.\n * @param Buffer A pointer to a buffer that receives the contents from the address space of the specified process.\n * @param NumberOfBytesToRead The number of bytes to be read from the specified process.\n * @param NumberOfBytesRead A pointer to a variable that receives the number of bytes transferred into the specified buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToRead,\n    _Out_opt_ PSIZE_T NumberOfBytesRead\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWow64ReadVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ ULONGLONG NumberOfBytesToRead,\n    _Out_opt_ PULONGLONG NumberOfBytesRead\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * Reads virtual memory from a process with extended options.\n *\n * @param ProcessHandle A handle to the process whose memory is to be read.\n * @param BaseAddress A pointer to the base address in the specified process from which to read.\n * @param Buffer A pointer to a buffer that receives the contents from the address space of the specified process.\n * @param NumberOfBytesToRead The number of bytes to be read from the specified process.\n * @param NumberOfBytesRead A pointer to a variable that receives the number of bytes transferred into the specified buffer.\n * @param Flags Additional flags for the read operation.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadVirtualMemoryEx(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToRead,\n    _Out_opt_ PSIZE_T NumberOfBytesRead,\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_11)\n\n/**\n * Writes virtual memory to a process.\n *\n * @param ProcessHandle A handle to the process whose memory is to be written.\n * @param BaseAddress A pointer to the base address in the specified process to which to write.\n * @param Buffer A pointer to the buffer that contains the data to be written to the address space of the specified process.\n * @param NumberOfBytesToWrite The number of bytes to be written to the specified process.\n * @param NumberOfBytesWritten A pointer to a variable that receives the number of bytes transferred into the specified buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWriteVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_reads_bytes_(NumberOfBytesToWrite) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToWrite,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten\n    );\n\n// rev\n/**\n * Writes virtual memory to a 64-bit process from a 32-bit process.\n *\n * @param ProcessHandle A handle to the process whose memory is to be written.\n * @param BaseAddress A pointer to the base address in the specified process to which to write.\n * @param Buffer A pointer to the buffer that contains the data to be written to the address space of the specified process.\n * @param NumberOfBytesToWrite The number of bytes to be written to the specified process.\n * @param NumberOfBytesWritten A pointer to a variable that receives the number of bytes transferred into the specified buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWow64WriteVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _In_reads_bytes_(NumberOfBytesToWrite) PVOID Buffer,\n    _In_ ULONGLONG NumberOfBytesToWrite,\n    _Out_opt_ PULONGLONG NumberOfBytesWritten\n    );\n\n/**\n * Changes the protection on a region of virtual memory.\n *\n * @param ProcessHandle A handle to the process whose memory protection is to be changed.\n * @param BaseAddress A pointer to the base address of the region of pages whose access protection attributes are to be changed.\n * @param RegionSize A pointer to a variable that specifies the size of the region whose access protection attributes are to be changed.\n * @param NewProtection The memory protection option. This parameter can be one of the memory protection constants.\n * @param OldProtection A pointer to a variable that receives the previous access protection of the first page in the specified region of pages.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtProtectVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG NewProtection,\n    _Out_ PULONG OldProtection\n    );\n\n/**\n * Queries information about a region of virtual memory in a process.\n *\n * @param ProcessHandle A handle to the process whose memory information is to be queried.\n * @param BaseAddress A pointer to the base address of the region of pages to be queried.\n * @param MemoryInformationClass The type of information to be queried.\n * @param MemoryInformation A pointer to a buffer that receives the memory information.\n * @param MemoryInformationLength The size of the buffer pointed to by the MemoryInformation parameter.\n * @param ReturnLength A pointer to a variable that receives the number of bytes returned in the MemoryInformation buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    _Out_writes_bytes_(MemoryInformationLength) PVOID MemoryInformation,\n    _In_ SIZE_T MemoryInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\n// rev\n/**\n * Queries information about a region of virtual memory in a 64-bit process from a 32-bit process.\n *\n * @param ProcessHandle A handle to the process whose memory information is to be queried.\n * @param BaseAddress A pointer to the base address of the region of pages to be queried.\n * @param MemoryInformationClass The type of information to be queried.\n * @param MemoryInformation A pointer to a buffer that receives the memory information.\n * @param MemoryInformationLength The size of the buffer pointed to by the MemoryInformation parameter.\n * @param ReturnLength A pointer to a variable that receives the number of bytes returned in the MemoryInformation buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWow64QueryVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _In_ MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    _Out_writes_bytes_(MemoryInformationLength) PVOID MemoryInformation,\n    _In_ ULONGLONG MemoryInformationLength,\n    _Out_opt_ PULONGLONG ReturnLength\n    );\n\ntypedef struct _IO_STATUS_BLOCK* PIO_STATUS_BLOCK;\n\n/**\n * Flushes the instruction cache for a specified process.\n *\n * @param ProcessHandle A handle to the process whose instruction cache is to be flushed.\n * @param BaseAddress A pointer to the base address of the region of memory to be flushed.\n * @param RegionSize A pointer to a variable that specifies the size of the region to be flushed.\n * @param IoStatus A pointer to an IO_STATUS_BLOCK structure that receives the status of the flush operation.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _Out_ PIO_STATUS_BLOCK IoStatus\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// begin_private\ntypedef enum _VIRTUAL_MEMORY_INFORMATION_CLASS\n{\n    VmPrefetchInformation, // MEMORY_PREFETCH_INFORMATION\n    VmPagePriorityInformation, // MEMORY_PAGE_PRIORITY_INFORMATION\n    VmCfgCallTargetInformation, // CFG_CALL_TARGET_LIST_INFORMATION // REDSTONE2\n    VmPageDirtyStateInformation, // MEMORY_PAGE_DIRTY_STATE_INFORMATION // REDSTONE3\n    VmImageHotPatchInformation, // 19H1\n    VmPhysicalContiguityInformation, // 20H1 // (requires SeLockMemoryPrivilege)\n    VmVirtualMachinePrepopulateInformation,\n    VmRemoveFromWorkingSetInformation, // MEMORY_REMOVE_WORKING_SET_INFORMATION\n    MaxVmInfoClass\n} VIRTUAL_MEMORY_INFORMATION_CLASS;\n// end_private\n#else\n#define VmPrefetchInformation 0x0\n#define VmPagePriorityInformation 0x1\n#define VmCfgCallTargetInformation 0x2\n#define VmPageDirtyStateInformation 0x3\n#define VmImageHotPatchInformation 0x4\n#define VmPhysicalContiguityInformation 0x5\n#define VmVirtualMachinePrepopulateInformation 0x6\n#define VmRemoveFromWorkingSetInformation 0x7\n#define MaxVmInfoClass 0x8\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#define VM_PREFETCH_TO_WORKING_SET 0x1 // since 24H4\n\n// rev\ntypedef struct _MEMORY_PREFETCH_INFORMATION\n{\n    ULONG Flags;\n} MEMORY_PREFETCH_INFORMATION, *PMEMORY_PREFETCH_INFORMATION;\n\n//\n// Page/memory priorities.\n//\n\n#define MEMORY_PRIORITY_LOWEST           0\n#define MEMORY_PRIORITY_VERY_LOW         1\n#define MEMORY_PRIORITY_LOW              2\n#define MEMORY_PRIORITY_MEDIUM           3\n#define MEMORY_PRIORITY_BELOW_NORMAL     4\n#define MEMORY_PRIORITY_NORMAL           5\n#define MEMORY_PRIORITY_ABOVE_NORMAL     6 // rev\n#define MEMORY_PRIORITY_HIGH             7 // rev\n\n// VmPagePriorityInformation\ntypedef struct _MEMORY_PAGE_PRIORITY_INFORMATION\n{\n    ULONG PagePriority;\n} MEMORY_PAGE_PRIORITY_INFORMATION, *PMEMORY_PAGE_PRIORITY_INFORMATION;\n\n// VmCfgCallTargetInformation\ntypedef struct _CFG_CALL_TARGET_LIST_INFORMATION\n{\n    ULONG NumberOfEntries;\n    ULONG Reserved;\n    PULONG NumberOfEntriesProcessed;\n    PCFG_CALL_TARGET_INFO CallTargetInfo;\n    PVOID Section; // since REDSTONE5\n    ULONGLONG FileOffset;\n} CFG_CALL_TARGET_LIST_INFORMATION, *PCFG_CALL_TARGET_LIST_INFORMATION;\n\n// rev\ntypedef struct _MEMORY_PAGE_DIRTY_STATE_INFORMATION\n{\n    ULONG Flags;\n} MEMORY_PAGE_DIRTY_STATE_INFORMATION, *PMEMORY_PAGE_DIRTY_STATE_INFORMATION;\n\n// rev\ntypedef struct _MEMORY_REMOVE_WORKING_SET_INFORMATION\n{\n    ULONG Flags;\n} MEMORY_REMOVE_WORKING_SET_INFORMATION, *PMEMORY_REMOVE_WORKING_SET_INFORMATION;\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\ntypedef struct _MEMORY_RANGE_ENTRY\n{\n    PVOID VirtualAddress;\n    SIZE_T NumberOfBytes;\n} MEMORY_RANGE_ENTRY, *PMEMORY_RANGE_ENTRY;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_ VIRTUAL_MEMORY_INFORMATION_CLASS VmInformationClass,\n    _In_ SIZE_T NumberOfEntries,\n    _In_reads_(NumberOfEntries) PMEMORY_RANGE_ENTRY VirtualAddresses,\n    _In_reads_bytes_(VmInformationLength) PVOID VmInformation,\n    _In_ ULONG VmInformationLength\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#define MAP_PROCESS 1 // Process WorkingSet\n#define MAP_SYSTEM 2 // Physical Memory // (requires SeLockMemoryPrivilege)\n\n/**\n * Locks the specified region of the process's virtual address space into physical memory, ensuring that subsequent access to the region will not incur a page fault.\n *\n * @param ProcessHandle A handle to the process whose virtual address space is to be locked.\n * @param BaseAddress A pointer to the base address of the region of pages to be locked.\n * @param RegionSize The size of the region to be locked, in bytes. The size is rounded up to the nearest multiple of PAGE_SIZE.\n * @param MapType A bitmask containing one or more flags that specify the type of operations to be performed.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtuallock\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLockVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG MapType\n    );\n\n/**\n * Unlocks a specified range of pages in the virtual address space of a process, enabling the system to swap the pages out to the paging file if necessary.\n *\n * @param ProcessHandle A handle to the process whose virtual address space is to be unlocked.\n * @param BaseAddress A pointer to the base address of the region of pages to be unlocked.\n * @param RegionSize The size of the region to be unlocked, in bytes. The size is rounded up to the nearest multiple of PAGE_SIZE.\n * @param MapType A bitmask containing one or more flags that specify the type of operations to be performed.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualunlock\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnlockVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG MapType\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Sections\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * The NtCreateSection routine creates a section object.\n *\n * @param SectionHandle Pointer to a variable that receives a handle to the section object.\n * @param DesiredAccess The access mask that specifies the requested access to the section object.\n * @param ObjectAttributes Pointer to the base virtual address of the view to unmap. This value can be any virtual address within the view.\n * @param MaximumSize The maximum size, in bytes, of the section. The actual size when backed by the paging file, or the maximum the file can be extended or mapped when backed by an ordinary file.\n * @param SectionPageProtection Specifies the protection to place on each page in the section.\n * @param AllocationAttributes A bitmask of SEC_XXX flags that determines the allocation attributes of the section.\n * @param FileHandle Optionally specifies a handle for an open file object. If the value of FileHandle is NULL, the section is backed by the paging file. Otherwise, the section is backed by the specified file.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwcreatesection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateSection(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG SectionPageProtection,\n    _In_ ULONG AllocationAttributes,\n    _In_opt_ HANDLE FileHandle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n/**\n * The NtCreateSectionEx routine creates a section object.\n *\n * @param SectionHandle Pointer to a variable that receives a handle to the section object.\n * @param DesiredAccess The access mask that specifies the requested access to the section object.\n * @param ObjectAttributes Pointer to the base virtual address of the view to unmap. This value can be any virtual address within the view.\n * @param MaximumSize The maximum size, in bytes, of the section. The actual size when backed by the paging file, or the maximum the file can be extended or mapped when backed by an ordinary file.\n * @param SectionPageProtection Specifies the protection to place on each page in the section.\n * @param AllocationAttributes A bitmask of SEC_XXX flags that determines the allocation attributes of the section.\n * @param FileHandle Optionally specifies a handle for an open file object. If the value of FileHandle is NULL, the section is backed by the paging file. Otherwise, the section is backed by the specified file.\n * @param ExtendedParameters An optional pointer to one or more extended parameters of type MEM_EXTENDED_PARAMETER.\n * @param ExtendedParameterCount Specifies the number of elements in the ExtendedParameters array.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwcreatesection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateSectionEx(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG SectionPageProtection,\n    _In_ ULONG AllocationAttributes,\n    _In_opt_ HANDLE FileHandle,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n\n/**\n * The NtOpenSection routine opens a handle for an existing section object.\n *\n * @param SectionHandle Handle to a process object that was previously passed to NtMapViewOfSection.\n * @param DesiredAccess The access mask that specifies the requested access to the section object.\n * @param ObjectAttributes Pointer to an OBJECT_ATTRIBUTES structure that specifies the object name and other attributes.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwopensection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenSection(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * Maps a view of a section into the virtual address space of a subject process.\n *\n * @param SectionHandle A handle to an existing section object.\n * @param ProcessHandle A handle to the object that represents the process that the view should be mapped into. The handle must have been opened with PROCESS_VM_OPERATION access.\n * @param BaseAddress A pointer to a variable that receives the base address of the view. If the value is not NULL, the view is allocated starting at the specified virtual address rounded down to the next 64-kilobyte address boundary.\n * @param ZeroBits The number of high-order address bits that must be zero in the base address of the section view. The value of this parameter must be less than 21 and is used only if BaseAddress is NULL.\n * @param CommitSize Specifies the size, in bytes, of the initially committed region of the view. CommitSize is meaningful only for page-file backed sections and is rounded up to the nearest multiple of PAGE_SIZE.\n * @param SectionOffset A pointer to a variable that receives the offset, in bytes, from the beginning of the section to the view. \n * @param ViewSize A pointer to a variable that specifies the size of the view in bytes. If the initial value is zero, NtMapViewOfSection maps a view of the section that starts at SectionOffset and continues to the end of the section. \n * @param InheritDisposition A value that specifies how the view is to be shared with child processes. \n * @param AllocationType Specifies the type of allocation to be performed for the specified region of pages. The valid flags are MEM_RESERVE, MEM_TOP_DOWN, MEM_LARGE_PAGES, MEM_DIFFERENT_IMAGE_BASE_OK and MEM_REPLACE_PLACEHOLDER. Although MEM_COMMIT is not allowed, it is implied unless MEM_RESERVE is specified. \n * @param PageProtection Specifies the page protection to be applied to the mapped view. Not used with SEC_IMAGE, must be set to PAGE_READONLY for SEC_IMAGE_NO_EXECUTE. For non-image sections, the value must be compatible with the section's page protection from NtCreateSection.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwmapviewofsection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMapViewOfSection(\n    _In_ HANDLE SectionHandle,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*ViewSize) _Writable_bytes_(*ViewSize) _Post_readable_byte_size_(*ViewSize)) PVOID *BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _In_ SIZE_T CommitSize,\n    _Inout_opt_ PLARGE_INTEGER SectionOffset,\n    _Inout_ PSIZE_T ViewSize,\n    _In_ SECTION_INHERIT InheritDisposition,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n/**\n * Maps a view of a section into the virtual address space of a subject process.\n *\n * @param SectionHandle A handle to an existing section object.\n * @param ProcessHandle A handle to the object that represents the process that the view should be mapped into. The handle must have been opened with PROCESS_VM_OPERATION access.\n * @param BaseAddress A pointer to a variable that receives the base address of the view. If the value is not NULL, the view is allocated starting at the specified virtual address rounded down to the next 64-kilobyte address boundary.\n * @param ZeroBits The number of high-order address bits that must be zero in the base address of the section view. The value of this parameter must be less than 21 and is used only if BaseAddress is NULL.\n * @param CommitSize Specifies the size, in bytes, of the initially committed region of the view. CommitSize is meaningful only for page-file backed sections and is rounded up to the nearest multiple of PAGE_SIZE.\n * @param SectionOffset A pointer to a variable that receives the offset, in bytes, from the beginning of the section to the view.\n * @param ViewSize A pointer to a variable that specifies the size of the view in bytes. If the initial value is zero, NtMapViewOfSection maps a view of the section that starts at SectionOffset and continues to the end of the section.\n * @param InheritDisposition A value that specifies how the view is to be shared with child processes.\n * @param AllocationType Specifies the type of allocation to be performed for the specified region of pages. The valid flags are MEM_RESERVE, MEM_TOP_DOWN, MEM_LARGE_PAGES, MEM_DIFFERENT_IMAGE_BASE_OK and MEM_REPLACE_PLACEHOLDER. Although MEM_COMMIT is not allowed, it is implied unless MEM_RESERVE is specified.\n * @param PageProtection Specifies the page protection to be applied to the mapped view. Not used with SEC_IMAGE, must be set to PAGE_READONLY for SEC_IMAGE_NO_EXECUTE. For non-image sections, the value must be compatible with the section's page protection from NtCreateSection.\n * @param ExtendedParameters An optional pointer to one or more extended parameters of type MEM_EXTENDED_PARAMETER.\n * @param ExtendedParameterCount Specifies the number of elements in the ExtendedParameters array.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwmapviewofsectionex\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMapViewOfSectionEx(\n    _In_ HANDLE SectionHandle,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*ViewSize) _Writable_bytes_(*ViewSize) _Post_readable_byte_size_(*ViewSize)) PVOID *BaseAddress,\n    _Inout_opt_ PLARGE_INTEGER SectionOffset,\n    _Inout_ PSIZE_T ViewSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS5)\n\n/**\n * The NtUnmapViewOfSection routine unmaps a view of a section from the virtual address space of a subject process.\n *\n * @param ProcessHandle Handle to a process object that was previously passed to NtMapViewOfSection.\n * @param BaseAddress Pointer to the base virtual address of the view to unmap. This value can be any virtual address within the view.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwunmapviewofsection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnmapViewOfSection(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n/**\n * The NtUnmapViewOfSectionEx routine unmaps a view of a section from the virtual address space of a subject process.\n *\n * @param ProcessHandle Handle to a process object that was previously passed to NtMapViewOfSection.\n * @param BaseAddress Pointer to the base virtual address of the view to unmap. This value can be any virtual address within the view.\n * @param Flags Additional flags for the unmap operation.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwunmapviewofsection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnmapViewOfSectionEx(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtExtendSection(\n    _In_ HANDLE SectionHandle,\n    _Inout_ PLARGE_INTEGER NewSectionSize\n    );\n\n/**\n * Provides the capability to determine the base address, size, granted access, and allocation of an opened section object.\n *\n * @param SectionHandle An open handle to a section object.\n * @param SectionInformationClass The section information class about which to retrieve information.\n * @param SectionInformation A pointer to a buffer that receives the specified information. The format and content of the buffer depend on the specified section class.\n * @param SectionInformationLength Specifies the length in bytes of the section information buffer.\n * @param ReturnLength An optional pointer which, if specified, receives the number of bytes placed in the section information buffer.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/devnotes/ntquerysection\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySection(\n    _In_ HANDLE SectionHandle,\n    _In_ SECTION_INFORMATION_CLASS SectionInformationClass,\n    _Out_writes_bytes_(SectionInformationLength) PVOID SectionInformation,\n    _In_ SIZE_T SectionInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAreMappedFilesTheSame(\n    _In_ PVOID File1MappedAsAnImage,\n    _In_ PVOID File2MappedAsFile\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Memory Partitions\n//\n\n#ifndef MEMORY_CURRENT_PARTITION_HANDLE\n#define MEMORY_CURRENT_PARTITION_HANDLE         ((HANDLE)(LONG_PTR)-1)\n#endif // MEMORY_CURRENT_PARTITION_HANDLE\n\n#ifndef MEMORY_SYSTEM_PARTITION_HANDLE\n#define MEMORY_SYSTEM_PARTITION_HANDLE          ((HANDLE)(LONG_PTR)-2)\n#endif // MEMORY_SYSTEM_PARTITION_HANDLE\n\n#ifndef MEMORY_EXISTING_VAD_PARTITION_HANDLE\n#define MEMORY_EXISTING_VAD_PARTITION_HANDLE    ((HANDLE)(LONG_PTR)-3)\n#endif // MEMORY_EXISTING_VAD_PARTITION_HANDLE\n\n#ifndef MEMORY_PARTITION_QUERY_ACCESS\n#define MEMORY_PARTITION_QUERY_ACCESS 0x0001\n#define MEMORY_PARTITION_MODIFY_ACCESS 0x0002\n#define MEMORY_PARTITION_ALL_ACCESS \\\n    (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MEMORY_PARTITION_QUERY_ACCESS | MEMORY_PARTITION_MODIFY_ACCESS)\n#endif // MEMORY_PARTITION_QUERY_ACCESS\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// private\ntypedef enum _PARTITION_INFORMATION_CLASS\n{\n    SystemMemoryPartitionInformation, // q: MEMORY_PARTITION_CONFIGURATION_INFORMATION\n    SystemMemoryPartitionMoveMemory, // s: MEMORY_PARTITION_TRANSFER_INFORMATION\n    SystemMemoryPartitionAddPagefile, // s: MEMORY_PARTITION_PAGEFILE_INFORMATION\n    SystemMemoryPartitionCombineMemory, // q; s: MEMORY_PARTITION_PAGE_COMBINE_INFORMATION\n    SystemMemoryPartitionInitialAddMemory, // q; s: MEMORY_PARTITION_INITIAL_ADD_INFORMATION\n    SystemMemoryPartitionGetMemoryEvents, // MEMORY_PARTITION_MEMORY_EVENTS_INFORMATION // since REDSTONE2\n    SystemMemoryPartitionSetAttributes,\n    SystemMemoryPartitionNodeInformation,\n    SystemMemoryPartitionCreateLargePages,\n    SystemMemoryPartitionDedicatedMemoryInformation,\n    SystemMemoryPartitionOpenDedicatedMemory, // 10\n    SystemMemoryPartitionMemoryChargeAttributes,\n    SystemMemoryPartitionClearAttributes,\n    SystemMemoryPartitionSetMemoryThresholds, // since WIN11\n    SystemMemoryPartitionMemoryListCommand, // since 24H2\n    SystemMemoryPartitionMax\n} PARTITION_INFORMATION_CLASS, *PPARTITION_INFORMATION_CLASS;\n#else\n#define SystemMemoryPartitionInformation 0x0\n#define SystemMemoryPartitionMoveMemory 0x1\n#define SystemMemoryPartitionAddPagefile 0x2\n#define SystemMemoryPartitionCombineMemory 0x3\n#define SystemMemoryPartitionInitialAddMemory 0x4\n#define SystemMemoryPartitionGetMemoryEvents 0x5\n#define SystemMemoryPartitionSetAttributes 0x6\n#define SystemMemoryPartitionNodeInformation 0x7\n#define SystemMemoryPartitionCreateLargePages 0x8\n#define SystemMemoryPartitionDedicatedMemoryInformation 0x9\n#define SystemMemoryPartitionOpenDedicatedMemory 0xA\n#define SystemMemoryPartitionMemoryChargeAttributes 0xB\n#define SystemMemoryPartitionClearAttributes 0xC\n#define SystemMemoryPartitionSetMemoryThresholds 0xD\n#define SystemMemoryPartitionMemoryListCommand 0xE\n#define SystemMemoryPartitionMax 0xF\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// private\ntypedef struct _MEMORY_PARTITION_CONFIGURATION_INFORMATION\n{\n    ULONG Flags;\n    ULONG NumaNode;\n    ULONG Channel;\n    ULONG NumberOfNumaNodes;\n    SIZE_T ResidentAvailablePages;\n    SIZE_T CommittedPages;\n    SIZE_T CommitLimit;\n    SIZE_T PeakCommitment;\n    SIZE_T TotalNumberOfPages;\n    SIZE_T AvailablePages;\n    SIZE_T ZeroPages;\n    SIZE_T FreePages;\n    SIZE_T StandbyPages;\n    SIZE_T StandbyPageCountByPriority[8]; // since REDSTONE2\n    SIZE_T RepurposedPagesByPriority[8];\n    SIZE_T MaximumCommitLimit;\n    SIZE_T Reserved; // DonatedPagesToPartitions\n    ULONG PartitionId; // since REDSTONE3\n} MEMORY_PARTITION_CONFIGURATION_INFORMATION, *PMEMORY_PARTITION_CONFIGURATION_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PARTITION_TRANSFER_INFORMATION\n{\n    SIZE_T NumberOfPages;\n    ULONG NumaNode;\n    ULONG Flags;\n} MEMORY_PARTITION_TRANSFER_INFORMATION, *PMEMORY_PARTITION_TRANSFER_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PARTITION_PAGEFILE_INFORMATION\n{\n    UNICODE_STRING PageFileName;\n    LARGE_INTEGER MinimumSize;\n    LARGE_INTEGER MaximumSize;\n    ULONG Flags;\n} MEMORY_PARTITION_PAGEFILE_INFORMATION, *PMEMORY_PARTITION_PAGEFILE_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PARTITION_PAGE_COMBINE_INFORMATION\n{\n    HANDLE StopHandle;\n    ULONG Flags;\n    SIZE_T TotalNumberOfPages;\n} MEMORY_PARTITION_PAGE_COMBINE_INFORMATION, *PMEMORY_PARTITION_PAGE_COMBINE_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PARTITION_PAGE_RANGE\n{\n    ULONG_PTR StartPage;\n    ULONG_PTR NumberOfPages;\n} MEMORY_PARTITION_PAGE_RANGE, *PMEMORY_PARTITION_PAGE_RANGE;\n\n// private\ntypedef struct _MEMORY_PARTITION_INITIAL_ADD_INFORMATION\n{\n    ULONG Flags;\n    ULONG NumberOfRanges;\n    SIZE_T NumberOfPagesAdded;\n    MEMORY_PARTITION_PAGE_RANGE PartitionRanges[1];\n} MEMORY_PARTITION_INITIAL_ADD_INFORMATION, *PMEMORY_PARTITION_INITIAL_ADD_INFORMATION;\n\n// private\ntypedef struct _MEMORY_PARTITION_MEMORY_EVENTS_INFORMATION\n{\n    union\n    {\n        struct\n        {\n            ULONG CommitEvents : 1;\n            ULONG Spare : 31;\n        };\n        ULONG AllFlags;\n    } Flags;\n\n    ULONG HandleAttributes;\n    ACCESS_MASK DesiredAccess;\n    HANDLE LowCommitCondition; // \\KernelObjects\\LowCommitCondition\n    HANDLE HighCommitCondition; // \\KernelObjects\\HighCommitCondition\n    HANDLE MaximumCommitCondition; // \\KernelObjects\\MaximumCommitCondition\n} MEMORY_PARTITION_MEMORY_EVENTS_INFORMATION, *PMEMORY_PARTITION_MEMORY_EVENTS_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreatePartition(\n    _In_opt_ HANDLE ParentPartitionHandle,\n    _Out_ PHANDLE PartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG PreferredNode\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenPartition(\n    _Out_ PHANDLE PartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtManagePartition(\n    _In_ HANDLE TargetHandle,\n    _In_opt_ HANDLE SourceHandle,\n    _In_ PARTITION_INFORMATION_CLASS PartitionInformationClass,\n    _Inout_updates_bytes_(PartitionInformationLength) PVOID PartitionInformation,\n    _In_ ULONG PartitionInformationLength\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// User physical pages\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * Maps previously allocated physical memory pages at a specified address in an Address Windowing Extensions (AWE) region.\n *\n * @param VirtualAddress A pointer to the starting address of the region of memory to remap. The value of VirtualAddress must be within the address range that the VirtualAlloc function returns when the Address Windowing Extensions (AWE) region is allocated.\n * @param NumberOfPages The size of the physical memory and virtual address space for which to establish translations, in pages.\n * @param UserPfnArray A pointer to an array of physical page frame numbers.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapuserphysicalpages\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMapUserPhysicalPages(\n    _In_ PVOID VirtualAddress,\n    _In_ SIZE_T NumberOfPages,\n    _In_reads_opt_(NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\n/**\n * Maps previously allocated physical memory pages at a specified address in an Address Windowing Extensions (AWE) region.\n *\n * @param VirtualAddresses A pointer to an array of starting addresses of the regions of memory to remap. The value of VirtualAddress must be within the address range that the VirtualAlloc function returns when the Address Windowing Extensions (AWE) region is allocated.\n * @param NumberOfPages The size of the physical memory and virtual address space for which to establish translations, in pages.\n * @param UserPfnArray A pointer to an array of values that indicates how each corresponding page in VirtualAddresses should be treated. A 0 (zero) indicates the entry should be unmapped, and any nonzero value should be mapped.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-mapuserphysicalpagesscatter\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMapUserPhysicalPagesScatter(\n    _In_reads_(NumberOfPages) PVOID *VirtualAddresses,\n    _In_ SIZE_T NumberOfPages,\n    _In_reads_opt_(NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\n/**\n * Allocates physical memory pages to be mapped and unmapped within any Address Windowing Extensions (AWE) region of a specified process.\n *\n * @param ProcessHandle A handle to the process whose physical memory pages are to be allocated within the virtual address space of this process.\n * @param NumberOfPages The size of the physical memory to allocate, in pages.\n * @param UserPfnArray A pointer to an array to store the page frame numbers of the allocated memory. Do not attempt to modify this buffer. It contains operating system data, and corruption could be catastrophic. The information in the buffer is not useful to an application.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-allocateuserphysicalpages\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateUserPhysicalPages(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PSIZE_T NumberOfPages,\n    _Out_writes_(*NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n/**\n * Allocates physical memory pages to be mapped and unmapped within any Address Windowing Extensions (AWE) region of a specified process, with extended parameters.\n *\n * @param ProcessHandle A handle to the process whose physical memory pages are to be allocated within the virtual address space of this process.\n * @param NumberOfPages The size of the physical memory to allocate, in pages.\n * @param UserPfnArray A pointer to an array to store the page frame numbers of the allocated memory. Do not attempt to modify this buffer. It contains operating system data, and corruption could be catastrophic. The information in the buffer is not useful to an application.\n * @param ExtendedParameters Pointer to an array of MEM_EXTENDED_PARAMETER structures.\n * @param ExtendedParameterCount The number of MEM_EXTENDED_PARAMETER in the ExtendedParameters array.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-allocateuserphysicalpages\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateUserPhysicalPagesEx(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PULONG_PTR NumberOfPages,\n    _Out_writes_(*NumberOfPages) PULONG_PTR UserPfnArray,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n/**\n * Frees physical memory pages that are allocated previously by using NtAllocateUserPhysicalPages.\n *\n * @param ProcessHandle A handle to the process. The function frees memory within the virtual address space of this process.\n * @param NumberOfPages The size of the physical memory to free, in pages. On return, if the function fails, this parameter indicates the number of pages that are freed.\n * @param UserPfnArray A pointer to an array of page frame numbers of the allocated memory to be freed.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-freeuserphysicalpages\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFreeUserPhysicalPages(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PULONG_PTR NumberOfPages,\n    _In_reads_(*NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Misc.\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * Retrieves the addresses of the pages that are written to in a region of virtual memory.\n *\n * @param ProcessHandle A handle to the process whose watch information is to be queried.\n * @param Flags Additional flags for the operation. To reset the write-tracking state, set this parameter to WRITE_WATCH_FLAG_RESET. Otherwise, set this parameter to zero.\n * @param BaseAddress The base address of the memory region for which to retrieve write-tracking information. This address must a region that is allocated using MEM_WRITE_WATCH.\n * @param RegionSize The size of the memory region for which to retrieve write-tracking information, in bytes.\n * @param UserAddressArray A pointer to a buffer that receives an array of page addresses that have been written to since the region has been allocated or the write-tracking state has been reset.\n * @param EntriesInUserAddressArray On input, this variable indicates the size of the UserAddressArray array. On output, the variable receives the number of page addresses that are returned in the array.\n * @param Granularity A pointer to a variable that receives the page size, in bytes.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-getwritewatch\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetWriteWatch(\n    _In_ HANDLE ProcessHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize,\n    _Out_writes_(*EntriesInUserAddressArray) PVOID *UserAddressArray,\n    _Inout_ PULONG_PTR EntriesInUserAddressArray,\n    _Out_ PULONG Granularity\n    );\n\n/**\n * Resets the write-tracking state for a region of virtual memory.\n *\n * @param ProcessHandle A handle to the process whose watch information is to be reset.\n * @param BaseAddress A pointer to the base address of the memory region for which to reset the write-tracking state.\n * @param RegionSize The size of the memory region for which to reset the write-tracking information, in bytes.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-resetwritewatch\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtResetWriteWatch(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreatePagingFile(\n    _In_ PCUNICODE_STRING PageFileName,\n    _In_ PLARGE_INTEGER MinimumSize,\n    _In_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG Priority\n    );\n\n/**\n * Flushes the instruction cache for the specified process.\n *\n * @param ProcessHandle A handle to the process whose instruction cache is to be flushed.\n * @param BaseAddress A pointer to the base address of the memory region to be flushed. This parameter can be NULL.\n * @param RegionSize The size of the memory region to be flushed, in bytes.\n * @return NTSTATUS Successful or errant status.\n * @remarks Applications should call NtFlushInstructionCache if they generate or modify code in memory. The CPU cannot detect the change, and may execute the old code it cached.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-flushinstructioncache\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushInstructionCache(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize\n    );\n\n/**\n * The NtFlushWriteBuffer routine flushes the write queue of the current processor that is running a thread of the current process.\n *\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushWriteBuffer(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * The NtFlushProcessWriteBuffers routine flushes the write queue of each processor that is running a thread of the current process.\n *\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-flushprocesswritebuffers\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushProcessWriteBuffers(\n    VOID\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Enclave support\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateEnclave(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID* BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _In_ SIZE_T Size,\n    _In_ SIZE_T InitialCommitment,\n    _In_ ULONG EnclaveType,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_opt_ PULONG EnclaveError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadEnclaveData(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _In_ ULONG Protect,\n    _In_reads_bytes_(PageInformationLength) PVOID PageInformation,\n    _In_ ULONG PageInformationLength,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten,\n    _Out_opt_ PULONG EnclaveError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtInitializeEnclave(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_opt_ PULONG EnclaveError\n    );\n\n// rev\n#define TERMINATE_ENCLAVE_VALID_FLAGS     0x00000005ul\n#define TERMINATE_ENCLAVE_FLAG_NO_WAIT    0x00000001ul\n#define TERMINATE_ENCLAVE_FLAG_WAIT_ERROR 0x00000004ul // STATUS_PENDING -> STATUS_ENCLAVE_NOT_TERMINATED\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTerminateEnclave(\n    _In_ PVOID BaseAddress,\n    _In_ ULONG Flags // TERMINATE_ENCLAVE_FLAG_*\n    );\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// rev\n#define ENCLAVE_CALL_VALID_FLAGS  0x00000001ul\n#define ENCLAVE_CALL_FLAG_NO_WAIT 0x00000001ul\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCallEnclave(\n    _In_ PENCLAVE_ROUTINE Routine,\n    _In_ PVOID Reserved,              // reserved for dispatch (RtlEnclaveCallDispatch)\n    _In_ ULONG Flags,                 // ENCLAVE_CALL_FLAG_*\n    _Inout_ PVOID* RoutineParamReturn // input routine parameter, output routine return value\n    );\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntnls.h",
    "content": "/*\n * National Language Support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTNLS_H\n#define _NTNLS_H\n\n#define MAXIMUM_LEADBYTES 12\n\ntypedef struct _CPTABLEINFO\n{\n    USHORT CodePage;\n    USHORT MaximumCharacterSize;\n    USHORT DefaultChar;\n    USHORT UniDefaultChar;\n    USHORT TransDefaultChar;\n    USHORT TransUniDefaultChar;\n    USHORT DBCSCodePage;\n    UCHAR LeadByte[MAXIMUM_LEADBYTES];\n    PUSHORT MultiByteTable;\n    PVOID WideCharTable;\n    PUSHORT DBCSRanges;\n    PUSHORT DBCSOffsets;\n} CPTABLEINFO, *PCPTABLEINFO;\n\ntypedef struct _NLSTABLEINFO\n{\n    CPTABLEINFO OemTableInfo;\n    CPTABLEINFO AnsiTableInfo;\n    PUSHORT UpperCaseTable;\n    PUSHORT LowerCaseTable;\n} NLSTABLEINFO, *PNLSTABLEINFO;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\nNTSYSAPI USHORT NlsAnsiCodePage;\nNTSYSAPI BOOLEAN NlsMbCodePageTag;\nNTSYSAPI BOOLEAN NlsMbOemCodePageTag;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntobapi.h",
    "content": "/*\n * Object Manager support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTOBAPI_H\n#define _NTOBAPI_H\n\n//\n// Object Specific Access Rights\n//\n\n#ifndef OBJECT_TYPE_CREATE\n#define OBJECT_TYPE_CREATE 0x0001\n#endif\n\n#ifndef OBJECT_TYPE_ALL_ACCESS\n#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | OBJECT_TYPE_CREATE)\n#endif\n\n//\n// Directory Object Specific Access Rights\n//\n\n#ifndef DIRECTORY_QUERY\n#define DIRECTORY_QUERY 0x0001\n#endif\n\n#ifndef DIRECTORY_TRAVERSE\n#define DIRECTORY_TRAVERSE 0x0002\n#endif\n\n#ifndef DIRECTORY_CREATE_OBJECT\n#define DIRECTORY_CREATE_OBJECT 0x0004\n#endif\n\n#ifndef DIRECTORY_CREATE_SUBDIRECTORY\n#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008\n#endif\n\n#ifndef DIRECTORY_ALL_ACCESS\n#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | DIRECTORY_QUERY | DIRECTORY_TRAVERSE | DIRECTORY_CREATE_OBJECT | DIRECTORY_CREATE_SUBDIRECTORY)\n#endif\n\n//\n// Symbolic Link Specific Access Rights\n//\n\n#ifndef SYMBOLIC_LINK_QUERY\n#define SYMBOLIC_LINK_QUERY 0x0001\n#endif\n\n#ifndef SYMBOLIC_LINK_SET\n#define SYMBOLIC_LINK_SET 0x0002\n#endif\n\n#ifndef SYMBOLIC_LINK_ALL_ACCESS\n#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYMBOLIC_LINK_QUERY)\n#endif\n\n#ifndef SYMBOLIC_LINK_ALL_ACCESS_EX\n#define SYMBOLIC_LINK_ALL_ACCESS_EX (STANDARD_RIGHTS_REQUIRED | SPECIFIC_RIGHTS_ALL)\n#endif\n\n//\n// Object Attribute Flags\n//\n\n#ifndef OBJ_PROTECT_CLOSE\n#define OBJ_PROTECT_CLOSE 0x00000001\n#endif\n\n#ifndef OBJ_INHERIT\n#define OBJ_INHERIT 0x00000002\n#endif\n\n#ifndef OBJ_AUDIT_OBJECT_CLOSE\n#define OBJ_AUDIT_OBJECT_CLOSE 0x00000004\n#endif\n\n//\n// Object Information\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _OBJECT_INFORMATION_CLASS\n{\n    ObjectBasicInformation, // q: OBJECT_BASIC_INFORMATION\n    ObjectNameInformation, // q: OBJECT_NAME_INFORMATION\n    ObjectTypeInformation, // q: OBJECT_TYPE_INFORMATION\n    ObjectTypesInformation, // q: OBJECT_TYPES_INFORMATION\n    ObjectHandleFlagInformation, // qs: OBJECT_HANDLE_FLAG_INFORMATION\n    ObjectSessionInformation, // s: void // change object session // (requires SeTcbPrivilege)\n    ObjectSessionObjectInformation, // s: void // change object session // (requires SeTcbPrivilege)\n    MaxObjectInfoClass\n} OBJECT_INFORMATION_CLASS;\n#else\n#define ObjectBasicInformation 0\n#define ObjectNameInformation 1\n#define ObjectTypeInformation 2\n#define ObjectTypesInformation 3\n#define ObjectHandleFlagInformation 4\n#define ObjectSessionInformation 5\n#define ObjectSessionObjectInformation 6\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The OBJECT_BASIC_INFORMATION structure contains basic information about an object.\n */\ntypedef struct _OBJECT_BASIC_INFORMATION\n{\n    ULONG Attributes;               // The attributes of the object include whether the object is permanent, can be inherited, and other characteristics.\n    ACCESS_MASK GrantedAccess;      // Specifies a mask that represents the granted access when the object was created.\n    ULONG HandleCount;              // The number of handles that are currently open for the object.\n    ULONG PointerCount;             // The number of references to the object from both handles and other references, such as those from the system.\n    ULONG PagedPoolCharge;          // The amount of paged pool memory that the object is using.\n    ULONG NonPagedPoolCharge;       // The amount of non-paged pool memory that the object is using.\n    ULONG Reserved[3];              // Reserved for future use.\n    ULONG NameInfoSize;             // The size of the name information for the object.\n    ULONG TypeInfoSize;             // The size of the type information for the object.\n    ULONG SecurityDescriptorSize;   // The size of the security descriptor for the object.\n    LARGE_INTEGER CreationTime;     // The time when a symbolic link was created. Not supported for other types of objects.\n} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * The OBJECT_NAME_INFORMATION structure contains the name, if there is one, of a given object.\n */\ntypedef struct _OBJECT_NAME_INFORMATION\n{\n    UNICODE_STRING Name; // The object name (when present) includes a NULL-terminator and all path separators \"\\\" in the name.\n} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The OBJECT_NAME_INFORMATION structure contains various statistics and properties about an object type.\n */\ntypedef struct _OBJECT_TYPE_INFORMATION\n{\n    UNICODE_STRING TypeName;\n    ULONG TotalNumberOfObjects;\n    ULONG TotalNumberOfHandles;\n    ULONG TotalPagedPoolUsage;\n    ULONG TotalNonPagedPoolUsage;\n    ULONG TotalNamePoolUsage;\n    ULONG TotalHandleTableUsage;\n    ULONG HighWaterNumberOfObjects;\n    ULONG HighWaterNumberOfHandles;\n    ULONG HighWaterPagedPoolUsage;\n    ULONG HighWaterNonPagedPoolUsage;\n    ULONG HighWaterNamePoolUsage;\n    ULONG HighWaterHandleTableUsage;\n    ULONG InvalidAttributes;\n    GENERIC_MAPPING GenericMapping;\n    ULONG ValidAccessMask;\n    BOOLEAN SecurityRequired;\n    BOOLEAN MaintainHandleCount;\n    UCHAR TypeIndex; // since WINBLUE\n    CHAR ReservedByte;\n    ULONG PoolType;\n    ULONG DefaultPagedPoolCharge;\n    ULONG DefaultNonPagedPoolCharge;\n} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;\n\ntypedef struct _OBJECT_TYPES_INFORMATION\n{\n    ULONG NumberOfTypes;\n} OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION;\n\ntypedef struct _OBJECT_HANDLE_FLAG_INFORMATION\n{\n    BOOLEAN Inherit;\n    BOOLEAN ProtectFromClose;\n} OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION;\n\n//\n// Objects, handles\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The NtQueryObject routine retrieves various kinds of object information.\n *\n * @param Handle The handle of the object for which information is being queried.\n * @param ObjectInformationClass The information class indicating the kind of object information to be retrieved.\n * @param ObjectInformation An optional pointer to a buffer where the requested information is to be returned.\n * @param ObjectInformationLength The size of the buffer pointed to by the ObjectInformation parameter, in bytes.\n * @param ReturnLength An optional pointer to a location where the function writes the actual size of the information requested.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryObject(\n    _In_opt_ HANDLE Handle,\n    _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation,\n    _In_ ULONG ObjectInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n/**\n * The NtSetInformationObject routine changes various kinds of information about a object.\n *\n * @param Handle The handle of the object for which information is being changed.\n * @param ObjectInformationClass The type of information, supplied in the buffer pointed to by ObjectInformation, to set for the object.\n * @param ObjectInformation Pointer to a buffer that contains the information to set for the object.\n * @param ObjectInformationLength The size of the buffer pointed to by the ObjectInformation parameter, in bytes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationObject(\n    _In_ HANDLE Handle,\n    _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    _In_reads_bytes_(ObjectInformationLength) PVOID ObjectInformation,\n    _In_ ULONG ObjectInformationLength\n    );\n\n#define DUPLICATE_CLOSE_SOURCE 0x00000001       // Close the source handle.\n#define DUPLICATE_SAME_ACCESS 0x00000002        // Instead of using the DesiredAccess parameter, copy the access rights from the source handle to the target handle.\n#define DUPLICATE_SAME_ATTRIBUTES 0x00000004    // Instead of using the HandleAttributes parameter, copy the attributes from the source handle to the target handle.\n\n/**\n * The NtDuplicateObject routine creates a handle that is a duplicate of the specified source handle.\n *\n * @param SourceProcessHandle A handle to the source process for the handle being duplicated.\n * @param SourceHandle The handle to duplicate.\n * @param TargetProcessHandle A handle to the target process that is to receive the new handle. This parameter is optional and can be specified as NULL if the DUPLICATE_CLOSE_SOURCE flag is set in Options.\n * @param TargetHandle A pointer to a HANDLE variable into which the routine writes the new duplicated handle. The duplicated handle is valid in the specified target process. This parameter is optional and can be specified as NULL if no duplicate handle is to be created.\n * @param DesiredAccess An ACCESS_MASK value that specifies the desired access for the new handle.\n * @param HandleAttributes A ULONG that specifies the desired attributes for the new handle.\n * @param Options A set of flags to control the behavior of the duplication operation.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwduplicateobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDuplicateObject(\n    _In_ HANDLE SourceProcessHandle,\n    _In_ HANDLE SourceHandle,\n    _In_opt_ HANDLE TargetProcessHandle,\n    _Out_opt_ PHANDLE TargetHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Options\n    );\n\n/**\n * The NtMakeTemporaryObject routine changes the attributes of an object to make it temporary.\n *\n * @param Handle Handle to an object of any type.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwmaketemporaryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMakeTemporaryObject(\n    _In_ HANDLE Handle\n    );\n\n/**\n * The NtMakePermanentObject routine changes the attributes of an object to make it permanent.\n *\n * @param Handle Handle to an object of any type.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwmaketemporaryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtMakePermanentObject(\n    _In_ HANDLE Handle\n    );\n\n/**\n * The NtSignalAndWaitForSingleObject routine signals one object and waits on another object as a single operation.\n *\n * @param SignalHandle A handle to the object to be signaled.\n * @param WaitHandle A handle to the object to wait on. The SYNCHRONIZE access right is required.\n * @param Alertable If this parameter is TRUE, the function returns when the system queues an I/O completion routine or APC function, and the thread calls the function.\n * @param Timeout The time-out interval. The function returns if the interval elapses, even if the object's state is nonsignaled and no completion or APC objects are queued.\n * If zero, the function tests the object's state, checks for queued completion routines or APCs, and returns immediately. \n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-signalobjectandwait\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSignalAndWaitForSingleObject(\n    _In_ HANDLE SignalHandle,\n    _In_ HANDLE WaitHandle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n/**\n * The NtWaitForSingleObject routine waits until the specified object is in the signaled state or the time-out interval elapses.\n *\n * @param Handle The handle to the wait object.\n * @param Alertable The function returns when either the time-out period has elapsed or when the APC function is called.\n * @param Timeout A pointer to an absolute or relative time over which the wait is to occur. Can be null. If a timeout is specified,\n * and the object has not attained a state of signaled when the timeout expires, then the wait is automatically satisfied.\n * If an explicit timeout value of zero is specified, then no wait occurs if the wait cannot be satisfied immediately.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntwaitforsingleobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForSingleObject(\n    _In_ HANDLE Handle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n/**\n * The NtWaitForMultipleObjects routine waits until one or all of the specified objects are in the signaled state, an I/O completion routine or asynchronous procedure call (APC) is queued to the thread, or the time-out interval elapses.\n *\n * @param Count The number of object handles to wait for in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS. This parameter cannot be zero.\n * @param Handles An array of object handles. The array can contain handles of objects of different types. It may not contain multiple copies of the same handle.\n * @param WaitType If this parameter is WaitAll, the function returns when the state of all objects in the Handles array is set to signaled.\n * @param Alertable f this parameter is TRUE and the thread is in the waiting state, the function returns when the system queues an I/O completion routine or APC, and the thread runs the routine or function.\n * @param Timeout A pointer to an absolute or relative time over which the wait is to occur. Can be null. If a timeout is specified,\n * and the object has not attained a state of signaled when the timeout expires, then the wait is automatically satisfied.\n * If an explicit timeout value of zero is specified, then no wait occurs if the wait cannot be satisfied immediately.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitformultipleobjectsex\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForMultipleObjects(\n    _In_ ULONG Count,\n    _In_reads_(Count) HANDLE Handles[],\n    _In_ WAIT_TYPE WaitType,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForMultipleObjects32(\n    _In_ ULONG Count,\n    _In_reads_(Count) LONG Handles[],\n    _In_ WAIT_TYPE WaitType,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n\n/**\n * The NtSetSecurityObject routine sets an object's security state.\n *\n * @param Handle Handle for the object whose security state is to be set.\n * @param SecurityInformation A SECURITY_INFORMATION value specifying the information to be set.\n * @param SecurityDescriptor Pointer to the security descriptor to be set for the object.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwsetsecurityobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSecurityObject(\n    _In_ HANDLE Handle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\n/**\n * The NtQuerySecurityObject routine retrieves a copy of an object's security descriptor.\n *\n * @param Handle Handle for the object whose security descriptor is to be queried. \n * @param SecurityInformation A SECURITY_INFORMATION value specifying the information to be queried.\n * @param SecurityDescriptor Caller-allocated buffer that NtQuerySecurityObject fills with a copy of the specified security descriptor.\n * @param Length Size, in bytes, of the buffer pointed to by SecurityDescriptor.\n * @param LengthNeeded Pointer to a caller-allocated variable that receives the number of bytes required to store the copied security descriptor.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntquerysecurityobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySecurityObject(\n    _In_ HANDLE Handle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _Out_writes_bytes_to_opt_(Length, *LengthNeeded) PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ ULONG Length,\n    _Out_ PULONG LengthNeeded\n    );\n\n/**\n * The NtClose routine closes the specified handle.\n *\n * @param Handle The handle being closed.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwclose\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtClose(\n    _In_ _Post_ptr_invalid_ HANDLE Handle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n/**\n * Compares two object handles to determine if they refer to the same underlying kernel object.\n *\n * @param FirstObjectHandle The first object handle to compare.\n * @param SecondObjectHandle The second object handle to compare.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-compareobjecthandles\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompareObjects(\n    _In_ HANDLE FirstObjectHandle,\n    _In_ HANDLE SecondObjectHandle\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Directory objects\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The NtCreateDirectoryObject routine creates or opens an object-directory object.\n *\n * @param DirectoryHandle Pointer to a HANDLE variable that receives a handle to the object directory.\n * @param DesiredAccess An ACCESS_MASK that specifies the requested access to the directory object.\n * @param ObjectAttributes The attributes for the directory object.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwcreatedirectoryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateDirectoryObject(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateDirectoryObjectEx(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ShadowDirectoryHandle,\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n/**\n * Opens an existing directory object.\n * \n * @param DirectoryHandle A handle to the newly opened directory object.\n * @param DesiredAccess An ACCESS_MASK that specifies the requested access to the directory object.\n * @param ObjectAttributes The attributes for the directory object.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/devnotes/ntopendirectoryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenDirectoryObject(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * The OBJECT_DIRECTORY_INFORMATION structure contains information about the directory object.\n */\ntypedef struct _OBJECT_DIRECTORY_INFORMATION\n{\n    UNICODE_STRING Name;\n    UNICODE_STRING TypeName;\n} OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;\n\n/**\n * Retrieves information about the specified directory object.\n * \n * @param DirectoryHandle A handle to the directory object. This handle must have been opened with the appropriate access rights.\n * @param Buffer A pointer to a buffer that receives the directory information.\n * @param Length The size, in bytes, of the buffer pointed to by the Buffer parameter.\n * @param ReturnSingleEntry A BOOLEAN value that specifies whether to return a single entry or multiple entries.\n * @param RestartScan A BOOLEAN value that specifies whether to restart the scan from the beginning of the directory.\n * @param Context A pointer to a variable that maintains the context of the directory enumeration.\n * @param ReturnLength An optional pointer to a variable that receives the number of bytes returned in the buffer.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/devnotes/ntquerydirectoryobject\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryDirectoryObject(\n    _In_ HANDLE DirectoryHandle,\n    _Out_writes_bytes_opt_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_ BOOLEAN RestartScan,\n    _Inout_ PULONG Context,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Private namespaces\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// private\ntypedef enum _BOUNDARY_ENTRY_TYPE\n{\n    OBNS_Invalid,\n    OBNS_Name,\n    OBNS_SID,\n    OBNS_IL\n} BOUNDARY_ENTRY_TYPE;\n\n// private\ntypedef struct _OBJECT_BOUNDARY_ENTRY\n{\n    BOUNDARY_ENTRY_TYPE EntryType;\n    ULONG EntrySize;\n    //union\n    //{\n    //    WCHAR Name[1];\n    //    PSID Sid;\n    //    PSID IntegrityLabel;\n    //};\n} OBJECT_BOUNDARY_ENTRY, *POBJECT_BOUNDARY_ENTRY;\n\n// rev\n#define OBJECT_BOUNDARY_DESCRIPTOR_VERSION 1\n\n// private\ntypedef struct _OBJECT_BOUNDARY_DESCRIPTOR\n{\n    ULONG Version;\n    ULONG Items;\n    ULONG TotalSize;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG AddAppContainerSid : 1;\n            ULONG Reserved : 31;\n        };\n    };\n    //OBJECT_BOUNDARY_ENTRY Entries[1];\n} OBJECT_BOUNDARY_DESCRIPTOR, *POBJECT_BOUNDARY_DESCRIPTOR;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n/**\n * Creates a private namespace.\n *\n * @param NamespaceHandle A handle to the newly created private namespace.\n * @param DesiredAccess An ACCESS_MASK that specifies the requested access to the private namespace.\n * @param ObjectAttributes The attributes for the private namespace.\n * @param BoundaryDescriptor A descriptor that defines how the namespace is to be isolated. The RtlCreateBoundaryDescriptor function creates a boundary descriptor.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprivatenamespacea\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreatePrivateNamespace(\n    _Out_ PHANDLE NamespaceHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    );\n\n/**\n * Opens a private namespace.\n *\n * @param NamespaceHandle A handle to the newly opened private namespace.\n * @param DesiredAccess An ACCESS_MASK that specifies the requested access to the private namespace.\n * @param ObjectAttributes The attributes for the private namespace.\n * @param BoundaryDescriptor A descriptor that defines how the namespace is to be isolated. The RtlCreateBoundaryDescriptor function creates a boundary descriptor.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-openprivatenamespacea\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenPrivateNamespace(\n    _Out_ PHANDLE NamespaceHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    );\n\n/**\n * Deletes an open namespace handle.\n *\n * @param NamespaceHandle A handle to the private namespace.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/namespaceapi/nf-namespaceapi-closeprivatenamespace\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeletePrivateNamespace(\n    _In_ HANDLE NamespaceHandle\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Symbolic links\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateSymbolicLinkObject(\n    _Out_ PHANDLE LinkHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ PCUNICODE_STRING LinkTarget\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenSymbolicLinkObject(\n    _Out_ PHANDLE LinkHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySymbolicLinkObject(\n    _In_ HANDLE LinkHandle,\n    _Inout_ PUNICODE_STRING LinkTarget,\n    _Out_opt_ PULONG ReturnedLength\n    );\n\ntypedef enum _SYMBOLIC_LINK_INFO_CLASS\n{\n    SymbolicLinkGlobalInformation = 1, // s: ULONG\n    SymbolicLinkAccessMask, // s: ACCESS_MASK\n    MaxnSymbolicLinkInfoClass\n} SYMBOLIC_LINK_INFO_CLASS;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationSymbolicLink(\n    _In_ HANDLE LinkHandle,\n    _In_ SYMBOLIC_LINK_INFO_CLASS SymbolicLinkInformationClass,\n    _In_reads_bytes_(SymbolicLinkInformationLength) PVOID SymbolicLinkInformation,\n    _In_ ULONG SymbolicLinkInformationLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif // _NTOBAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntpebteb.h",
    "content": "/*\n * Process and Thread Environment Block support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTPEBTEB_H\n#define _NTPEBTEB_H\n\n#include \"ntsxs.h\"\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS *PRTL_USER_PROCESS_PARAMETERS;\ntypedef struct _RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION;\ntypedef struct _SILO_USER_SHARED_DATA *PSILO_USER_SHARED_DATA;\ntypedef struct _LEAP_SECOND_DATA *PLEAP_SECOND_DATA;\ntypedef struct _PEB_LDR_DATA PEB_LDR_DATA, *PPEB_LDR_DATA;\n\n// PEB->AppCompatFlags\n#define KACF_OLDGETSHORTPATHNAME 0x00000001\n#define KACF_VERSIONLIE_NOT_USED 0x00000002\n#define KACF_GETTEMPPATH_NOT_USED 0x00000004\n#define KACF_GETDISKFREESPACE 0x00000008\n#define KACF_FTMFROMCURRENTAPT 0x00000020\n#define KACF_DISALLOWORBINDINGCHANGES 0x00000040\n#define KACF_OLE32VALIDATEPTRS 0x00000080\n#define KACF_DISABLECICERO 0x00000100\n#define KACF_OLE32ENABLEASYNCDOCFILE 0x00000200\n#define KACF_OLE32ENABLELEGACYEXCEPTIONHANDLING 0x00000400\n#define KACF_RPCDISABLENDRCLIENTHARDENING 0x00000800\n#define KACF_RPCDISABLENDRMAYBENULL_SIZEIS 0x00001000\n#define KACF_DISABLEALLDDEHACK_NOT_USED 0x00002000\n#define KACF_RPCDISABLENDR61_RANGE 0x00004000\n#define KACF_RPC32ENABLELEGACYEXCEPTIONHANDLING 0x00008000\n#define KACF_OLE32DOCFILEUSELEGACYNTFSFLAGS 0x00010000\n#define KACF_RPCDISABLENDRCONSTIIDCHECK 0x00020000\n#define KACF_USERDISABLEFORWARDERPATCH 0x00040000\n#define KACF_OLE32DISABLENEW_WMPAINT_DISPATCH 0x00100000\n#define KACF_ADDRESTRICTEDSIDINCOINITIALIZESECURITY 0x00200000\n#define KACF_ALLOCDEBUGINFOFORCRITSECTIONS 0x00400000\n#define KACF_OLEAUT32ENABLEUNSAFELOADTYPELIBRELATIVE 0x00800000\n#define KACF_ALLOWMAXIMIZEDWINDOWGAMMA 0x01000000\n#define KACF_DONOTADDTOCACHE 0x80000000\n\n// PEB->ApiSetMap\ntypedef struct _API_SET_NAMESPACE\n{\n    ULONG Version;\n    ULONG Size;\n    ULONG Flags;\n    ULONG Count;\n    ULONG EntryOffset;\n    ULONG HashOffset;\n    ULONG HashFactor;\n} API_SET_NAMESPACE, *PAPI_SET_NAMESPACE;\n\n// private\ntypedef struct _API_SET_HASH_ENTRY\n{\n    ULONG Hash;\n    ULONG Index;\n} API_SET_HASH_ENTRY, *PAPI_SET_HASH_ENTRY;\n\n// private\ntypedef struct _API_SET_NAMESPACE_ENTRY\n{\n    ULONG Flags;\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG HashedLength;\n    ULONG ValueOffset;\n    ULONG ValueCount;\n} API_SET_NAMESPACE_ENTRY, *PAPI_SET_NAMESPACE_ENTRY;\n\n// private\ntypedef struct _API_SET_VALUE_ENTRY\n{\n    ULONG Flags;\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG ValueOffset;\n    ULONG ValueLength;\n} API_SET_VALUE_ENTRY, *PAPI_SET_VALUE_ENTRY;\n\n// PEB->TelemetryCoverageHeader\ntypedef struct _TELEMETRY_COVERAGE_HEADER\n{\n    UCHAR MajorVersion;\n    UCHAR MinorVersion;\n    struct\n    {\n        USHORT TracingEnabled : 1;\n        USHORT Reserved1 : 15;\n    };\n    ULONG HashTableEntries;\n    ULONG HashIndexMask;\n    ULONG TableUpdateVersion;\n    ULONG TableSizeInBytes;\n    ULONG LastResetTick;\n    ULONG ResetRound;\n    ULONG Reserved2;\n    ULONG RecordedCount;\n    ULONG Reserved3[4];\n    ULONG HashTable[ANYSIZE_ARRAY];\n} TELEMETRY_COVERAGE_HEADER, *PTELEMETRY_COVERAGE_HEADER;\n\ntypedef struct _WER_RECOVERY_INFO\n{\n    ULONG Length;\n    PVOID Callback;\n    PVOID Parameter;\n    HANDLE Started;\n    HANDLE Finished;\n    HANDLE InProgress;\n    LONG LastError;\n    BOOL Successful;\n    ULONG PingInterval;\n    ULONG Flags;\n} WER_RECOVERY_INFO, *PWER_RECOVERY_INFO;\n\ntypedef struct _WER_FILE\n{\n    USHORT Flags;\n    WCHAR Path[MAX_PATH];\n} WER_FILE, *PWER_FILE;\n\ntypedef struct _WER_MEMORY\n{\n    PVOID Address;\n    ULONG Size;\n} WER_MEMORY, *PWER_MEMORY;\n\ntypedef struct _WER_GATHER\n{\n    PVOID Next;\n    USHORT Flags;\n    union\n    {\n      WER_FILE File;\n      WER_MEMORY Memory;\n    } v;\n} WER_GATHER, *PWER_GATHER;\n\ntypedef struct _WER_METADATA\n{\n    PVOID Next;\n    WCHAR Key[64];\n    WCHAR Value[128];\n} WER_METADATA, *PWER_METADATA;\n\ntypedef struct _WER_RUNTIME_DLL\n{\n    PVOID Next;\n    ULONG Length;\n    PVOID Context;\n    WCHAR CallbackDllPath[MAX_PATH];\n} WER_RUNTIME_DLL, *PWER_RUNTIME_DLL;\n\ntypedef struct _WER_DUMP_COLLECTION\n{\n    PVOID Next;\n    ULONG ProcessId;\n    ULONG ThreadId;\n} WER_DUMP_COLLECTION, *PWER_DUMP_COLLECTION;\n\ntypedef struct _WER_HEAP_MAIN_HEADER\n{\n    WCHAR Signature[16];\n    LIST_ENTRY Links;\n    HANDLE Mutex;\n    PVOID FreeHeap;\n    ULONG FreeCount;\n} WER_HEAP_MAIN_HEADER, *PWER_HEAP_MAIN_HEADER;\n\n#ifndef RESTART_MAX_CMD_LINE\n#define RESTART_MAX_CMD_LINE 1024\n#endif\n\ntypedef struct _WER_PEB_HEADER_BLOCK\n{\n    LONG Length;\n    WCHAR Signature[16];\n    WCHAR AppDataRelativePath[64];\n    WCHAR RestartCommandLine[RESTART_MAX_CMD_LINE];\n    WER_RECOVERY_INFO RecoveryInfo;\n    PWER_GATHER Gather;\n    PWER_METADATA MetaData;\n    PWER_RUNTIME_DLL RuntimeDll;\n    PWER_DUMP_COLLECTION DumpCollection;\n    LONG GatherCount;\n    LONG MetaDataCount;\n    LONG DumpCount;\n    LONG Flags;\n    WER_HEAP_MAIN_HEADER MainHeader;\n    PVOID Reserved;\n} WER_PEB_HEADER_BLOCK, *PWER_PEB_HEADER_BLOCK;\n\n#define GDI_HANDLE_BUFFER_SIZE32 34\n#define GDI_HANDLE_BUFFER_SIZE64 60\n\n#ifndef _WIN64\n#define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE32\n#else\n#define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE64\n#endif\n\ntypedef ULONG GDI_HANDLE_BUFFER[GDI_HANDLE_BUFFER_SIZE];\n\ntypedef ULONG GDI_HANDLE_BUFFER32[GDI_HANDLE_BUFFER_SIZE32];\ntypedef ULONG GDI_HANDLE_BUFFER64[GDI_HANDLE_BUFFER_SIZE64];\n\ntypedef VOID (NTAPI* PPS_POST_PROCESS_INIT_ROUTINE)(\n    VOID\n    );\n\n#ifndef FLS_MAXIMUM_AVAILABLE\n#define FLS_MAXIMUM_AVAILABLE 128\n#endif\n#ifndef TLS_MINIMUM_AVAILABLE\n#define TLS_MINIMUM_AVAILABLE 64\n#endif\n#ifndef TLS_EXPANSION_SLOTS\n#define TLS_EXPANSION_SLOTS 1024\n#endif\n\n/**\n * Process Environment Block (PEB) structure.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb\n */\ntypedef struct _PEB\n{\n    //\n    // The process was cloned with an inherited address space.\n    //\n    BOOLEAN InheritedAddressSpace;\n\n    //\n    // The process has image file execution options (IFEO).\n    //\n    BOOLEAN ReadImageFileExecOptions;\n\n    //\n    // The process has a debugger attached.\n    //\n    BOOLEAN BeingDebugged;\n\n    union\n    {\n        BOOLEAN BitField;\n        struct\n        {\n            BOOLEAN ImageUsesLargePages : 1;            // The process uses large image regions (4 MB).\n            BOOLEAN IsProtectedProcess : 1;             // The process is a protected process.\n            BOOLEAN IsImageDynamicallyRelocated : 1;    // The process image base address was relocated.\n            BOOLEAN SkipPatchingUser32Forwarders : 1;   // The process skipped forwarders for User32.dll functions. 1 for 64-bit, 0 for 32-bit.\n            BOOLEAN IsPackagedProcess : 1;              // The process is a packaged store process (APPX/MSIX).\n            BOOLEAN IsAppContainer : 1;                 // The process has an AppContainer token.\n            BOOLEAN IsProtectedProcessLight : 1;        // The process is a protected process (light).\n            BOOLEAN IsLongPathAwareProcess : 1;         // The process is long path aware.\n        };\n    };\n\n    //\n    // Handle to a mutex for synchronization.\n    //\n    HANDLE Mutant;\n\n    //\n    // Pointer to the base address of the process image.\n    //\n    PVOID ImageBaseAddress;\n\n    //\n    // Pointer to the process loader data.\n    //\n    PPEB_LDR_DATA Ldr;\n\n    //\n    // Pointer to the process parameters.\n    //\n    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;\n\n    //\n    // Reserved.\n    //\n    PVOID SubSystemData;\n\n    //\n    // Pointer to the process default heap.\n    //\n    PVOID ProcessHeap;\n\n    //\n    // Pointer to a critical section used to synchronize access to the PEB.\n    //\n    PRTL_CRITICAL_SECTION FastPebLock;\n\n    //\n    // Pointer to a singly linked list used by ATL.\n    //\n    PSLIST_HEADER AtlThunkSListPtr;\n\n    //\n    // Pointer to the Image File Execution Options key.\n    //\n    PVOID IFEOKey;\n\n    //\n    // Cross process flags.\n    //\n    union\n    {\n        ULONG CrossProcessFlags;\n        struct\n        {\n            ULONG ProcessInJob : 1;                 // The process is part of a job.\n            ULONG ProcessInitializing : 1;          // The process is initializing.\n            ULONG ProcessUsingVEH : 1;              // The process is using VEH.\n            ULONG ProcessUsingVCH : 1;              // The process is using VCH.\n            ULONG ProcessUsingFTH : 1;              // The process is using FTH.\n            ULONG ProcessPreviouslyThrottled : 1;   // The process was previously throttled.\n            ULONG ProcessCurrentlyThrottled : 1;    // The process is currently throttled.\n            ULONG ProcessImagesHotPatched : 1;      // The process images are hot patched. // RS5\n            ULONG ReservedBits0 : 24;\n        };\n    };\n\n    //\n    // User32 KERNEL_CALLBACK_TABLE (ntuser.h)\n    //\n    union\n    {\n        PVOID KernelCallbackTable;\n        PVOID UserSharedInfoPtr;\n    };\n\n    //\n    // Reserved.\n    //\n    ULONG SystemReserved;\n\n    //\n    // Pointer to the Active Template Library (ATL) singly linked list (32-bit)\n    //\n    ULONG AtlThunkSListPtr32;\n\n    //\n    // Pointer to the API Set Schema.\n    //\n    PAPI_SET_NAMESPACE ApiSetMap;\n\n    //\n    // Counter for TLS expansion.\n    //\n    ULONG TlsExpansionCounter;\n\n    //\n    // Pointer to the TLS bitmap.\n    //\n    PRTL_BITMAP TlsBitmap;\n\n    //\n    // Bits for the TLS bitmap.\n    //\n    ULONG TlsBitmapBits[2];\n\n    //\n    // Reserved for CSRSS.\n    //\n    PVOID ReadOnlySharedMemoryBase;\n\n    //\n    // Pointer to the USER_SHARED_DATA for the current SILO.\n    //\n    PSILO_USER_SHARED_DATA SharedData;\n\n    //\n    // Reserved for CSRSS.\n    //\n    PVOID* ReadOnlyStaticServerData;\n\n    //\n    // Pointer to the ANSI code page data. (PCPTABLEINFO)\n    //\n    PVOID AnsiCodePageData;\n\n    //\n    // Pointer to the OEM code page data. (PCPTABLEINFO)\n    //\n    PVOID OemCodePageData;\n\n    //\n    // Pointer to the Unicode case table data. (PNLSTABLEINFO)\n    //\n    PVOID UnicodeCaseTableData;\n\n    //\n    // The total number of system processors.\n    //\n    ULONG NumberOfProcessors;\n\n    //\n    // Global flags for the system.\n    //\n    union\n    {\n        ULONG NtGlobalFlag;\n        struct\n        {\n            ULONG StopOnException : 1;          // FLG_STOP_ON_EXCEPTION\n            ULONG ShowLoaderSnaps : 1;          // FLG_SHOW_LDR_SNAPS\n            ULONG DebugInitialCommand : 1;      // FLG_DEBUG_INITIAL_COMMAND\n            ULONG StopOnHungGUI : 1;            // FLG_STOP_ON_HUNG_GUI\n            ULONG HeapEnableTailCheck : 1;      // FLG_HEAP_ENABLE_TAIL_CHECK\n            ULONG HeapEnableFreeCheck : 1;      // FLG_HEAP_ENABLE_FREE_CHECK\n            ULONG HeapValidateParameters : 1;   // FLG_HEAP_VALIDATE_PARAMETERS\n            ULONG HeapValidateAll : 1;          // FLG_HEAP_VALIDATE_ALL\n            ULONG ApplicationVerifier : 1;      // FLG_APPLICATION_VERIFIER\n            ULONG MonitorSilentProcessExit : 1; // FLG_MONITOR_SILENT_PROCESS_EXIT\n            ULONG PoolEnableTagging : 1;        // FLG_POOL_ENABLE_TAGGING\n            ULONG HeapEnableTagging : 1;        // FLG_HEAP_ENABLE_TAGGING\n            ULONG UserStackTraceDb : 1;         // FLG_USER_STACK_TRACE_DB\n            ULONG KernelStackTraceDb : 1;       // FLG_KERNEL_STACK_TRACE_DB\n            ULONG MaintainObjectTypeList : 1;   // FLG_MAINTAIN_OBJECT_TYPELIST\n            ULONG HeapEnableTagByDll : 1;       // FLG_HEAP_ENABLE_TAG_BY_DLL\n            ULONG DisableStackExtension : 1;    // FLG_DISABLE_STACK_EXTENSION\n            ULONG EnableCsrDebug : 1;           // FLG_ENABLE_CSRDEBUG\n            ULONG EnableKDebugSymbolLoad : 1;   // FLG_ENABLE_KDEBUG_SYMBOL_LOAD\n            ULONG DisablePageKernelStacks : 1;  // FLG_DISABLE_PAGE_KERNEL_STACKS\n            ULONG EnableSystemCritBreaks : 1;   // FLG_ENABLE_SYSTEM_CRIT_BREAKS\n            ULONG HeapDisableCoalescing : 1;    // FLG_HEAP_DISABLE_COALESCING\n            ULONG EnableCloseExceptions : 1;    // FLG_ENABLE_CLOSE_EXCEPTIONS\n            ULONG EnableExceptionLogging : 1;   // FLG_ENABLE_EXCEPTION_LOGGING\n            ULONG EnableHandleTypeTagging : 1;  // FLG_ENABLE_HANDLE_TYPE_TAGGING\n            ULONG HeapPageAllocs : 1;           // FLG_HEAP_PAGE_ALLOCS\n            ULONG DebugInitialCommandEx : 1;    // FLG_DEBUG_INITIAL_COMMAND_EX\n            ULONG DisableDbgPrint : 1;          // FLG_DISABLE_DBGPRINT\n            ULONG CritSecEventCreation : 1;     // FLG_CRITSEC_EVENT_CREATION\n            ULONG LdrTopDown : 1;               // FLG_LDR_TOP_DOWN\n            ULONG EnableHandleExceptions : 1;   // FLG_ENABLE_HANDLE_EXCEPTIONS\n            ULONG DisableProtDlls : 1;          // FLG_DISABLE_PROTDLLS\n        } NtGlobalFlags;\n    };\n\n    //\n    // Timeout for critical sections.\n    //\n    LARGE_INTEGER CriticalSectionTimeout;\n\n    //\n    // Reserved size for heap segments.\n    //\n    SIZE_T HeapSegmentReserve;\n\n    //\n    // Committed size for heap segments.\n    //\n    SIZE_T HeapSegmentCommit;\n\n    //\n    // Threshold for decommitting total free heap.\n    //\n    SIZE_T HeapDeCommitTotalFreeThreshold;\n\n    //\n    // Threshold for decommitting free heap blocks.\n    //\n    SIZE_T HeapDeCommitFreeBlockThreshold;\n\n    //\n    // Number of process heaps.\n    //\n    ULONG NumberOfHeaps;\n\n    //\n    // Maximum number of process heaps.\n    //\n    ULONG MaximumNumberOfHeaps;\n\n    //\n    // Pointer to an array of process heaps. ProcessHeaps is initialized\n    // to point to the first free byte after the PEB and MaximumNumberOfHeaps\n    // is computed from the page size used to hold the PEB, less the fixed\n    // size of this data structure.\n    //\n    PVOID* ProcessHeaps;\n\n    //\n    // Pointer to the system GDI shared handle table.\n    //\n    PVOID GdiSharedHandleTable;\n\n    //\n    // Pointer to the process starter helper.\n    //\n    PVOID ProcessStarterHelper;\n\n    //\n    // The maximum number of GDI function calls during batch operations (GdiSetBatchLimit)\n    //\n    ULONG GdiDCAttributeList;\n\n    //\n    // Pointer to the loader lock critical section.\n    //\n    PRTL_CRITICAL_SECTION LoaderLock;\n\n    //\n    // Major version of the operating system.\n    //\n    ULONG OSMajorVersion;\n\n    //\n    // Minor version of the operating system.\n    //\n    ULONG OSMinorVersion;\n\n    //\n    // Build number of the operating system.\n    //\n    USHORT OSBuildNumber;\n\n    //\n    // CSD version of the operating system.\n    //\n    USHORT OSCSDVersion;\n\n    //\n    // Platform ID of the operating system.\n    //\n    ULONG OSPlatformId;\n\n    //\n    // Subsystem version of the current process image (PE Headers).\n    //\n    ULONG ImageSubsystem;\n\n    //\n    // Major version of the current process image subsystem (PE Headers).\n    //\n    ULONG ImageSubsystemMajorVersion;\n\n    //\n    // Minor version of the current process image subsystem (PE Headers).\n    //\n    ULONG ImageSubsystemMinorVersion;\n\n    //\n    // Affinity mask for the current process.\n    //\n    KAFFINITY ActiveProcessAffinityMask;\n\n    //\n    // Temporary buffer for GDI handles accumulated in the current batch.\n    //\n    GDI_HANDLE_BUFFER GdiHandleBuffer;\n\n    //\n    // Pointer to the post-process initialization routine available for use by the application.\n    //\n    PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;\n\n    //\n    // Pointer to the TLS expansion bitmap.\n    //\n    PRTL_BITMAP TlsExpansionBitmap;\n\n    //\n    // Bits for the TLS expansion bitmap. TLS_EXPANSION_SLOTS\n    //\n    ULONG TlsExpansionBitmapBits[32];\n\n    //\n    // Session ID of the current process.\n    //\n    ULONG SessionId;\n\n    //\n    // Application compatibility flags. KACF_*\n    //\n    ULARGE_INTEGER AppCompatFlags;\n\n    //\n    // Application compatibility flags. KACF_*\n    //\n    ULARGE_INTEGER AppCompatFlagsUser;\n\n    //\n    // Pointer to the Application SwitchBack Compatibility Engine.\n    //\n    PVOID pShimData;\n\n    //\n    // Pointer to the Application Compatibility Engine. // APPCOMPAT_EXE_DATA\n    //\n    PVOID AppCompatInfo;\n\n    //\n    // CSD version string of the operating system.\n    //\n    UNICODE_STRING CSDVersion;\n\n    //\n    // Pointer to the process activation context.\n    //\n    PACTIVATION_CONTEXT_DATA ActivationContextData;\n\n    //\n    // Pointer to the process assembly storage map.\n    //\n    PASSEMBLY_STORAGE_MAP ProcessAssemblyStorageMap;\n\n    //\n    // Pointer to the system default activation context.\n    //\n    PACTIVATION_CONTEXT_DATA SystemDefaultActivationContextData;\n\n    //\n    // Pointer to the system assembly storage map.\n    //\n    PASSEMBLY_STORAGE_MAP SystemAssemblyStorageMap;\n\n    //\n    // Minimum stack commit size.\n    //\n    SIZE_T MinimumStackCommit;\n\n    //\n    // since 19H1 (previously FlsCallback to FlsHighIndex)\n    //\n    PVOID SparePointers[2];\n\n    //\n    // Pointer to the patch loader data.\n    //\n    PVOID PatchLoaderData;\n\n    //\n    // Pointer to the CHPE V2 process information. CHPEV2_PROCESS_INFO\n    //\n    PVOID ChpeV2ProcessInfo;\n\n    //\n    // Packaged process feature state.\n    //\n    union\n    {\n        ULONG AppModelFeatureState;\n        struct\n        {\n            ULONG ForegroundBoostProcesses : 1;\n            ULONG AppModelFeatureStateReserved : 31;\n        };\n    };\n\n    //\n    // SpareUlongs\n    //\n    ULONG SpareUlongs[2];\n\n    //\n    // Active code page.\n    //\n    USHORT ActiveCodePage;\n\n    //\n    // OEM code page.\n    //\n    USHORT OemCodePage;\n\n    //\n    // Code page case mapping.\n    //\n    USHORT UseCaseMapping;\n\n    //\n    // Unused NLS field.\n    //\n    USHORT UnusedNlsField;\n\n    //\n    // Pointer to the application WER registration data.\n    //\n    PWER_PEB_HEADER_BLOCK WerRegistrationData;\n\n    //\n    // Pointer to the application WER assert pointer.\n    //\n    PVOID WerShipAssertPtr;\n\n    //\n    // Pointer to the EC bitmap on ARM64. (Windows 11 and above)\n    //\n    union\n    {\n        PVOID pContextData; // Pointer to the switchback compatibility engine (Windows 7 and below)\n        PVOID EcCodeBitMap; // Pointer to the EC bitmap on ARM64 (Windows 11 and above) // since WIN11\n    };\n\n    //\n    // Reserved.\n    //\n    PVOID pImageHeaderHash;\n\n    //\n    // ETW tracing flags.\n    //\n    union\n    {\n        ULONG TracingFlags;\n        struct\n        {\n            ULONG HeapTracingEnabled : 1;       // ETW heap tracing enabled.\n            ULONG CritSecTracingEnabled : 1;    // ETW lock tracing enabled.\n            ULONG LibLoaderTracingEnabled : 1;  // ETW loader tracing enabled.\n            ULONG SpareTracingBits : 29;\n        };\n    };\n\n    //\n    // Reserved for CSRSS.\n    //\n    ULONGLONG CsrServerReadOnlySharedMemoryBase;\n\n    //\n    // Pointer to the thread pool worker list lock.\n    //\n    PRTL_CRITICAL_SECTION TppWorkerpListLock;\n\n    //\n    // Pointer to the thread pool worker list.\n    //\n    LIST_ENTRY TppWorkerpList;\n\n    //\n    // Wait on address hash table. (RtlWaitOnAddress)\n    //\n    PVOID WaitOnAddressHashTable[128];\n\n    //\n    // Pointer to the telemetry coverage header. // since RS3\n    //\n    PTELEMETRY_COVERAGE_HEADER TelemetryCoverageHeader;\n\n    //\n    // Cloud file flags. (ProjFs and Cloud Files) // since RS4\n    //\n    ULONG CloudFileFlags;\n\n    //\n    // Cloud file diagnostic flags.\n    //\n    ULONG CloudFileDiagFlags;\n\n    //\n    // Placeholder compatibility mode. (ProjFs and Cloud Files)\n    //\n    CHAR PlaceholderCompatibilityMode;\n\n    //\n    // Reserved for placeholder compatibility mode.\n    //\n    CHAR PlaceholderCompatibilityModeReserved[7];\n\n    //\n    // Pointer to leap second data. // since RS5\n    //\n    PLEAP_SECOND_DATA LeapSecondData;\n\n    //\n    // Leap second flags.\n    //\n    union\n    {\n        ULONG LeapSecondFlags;\n        struct\n        {\n            ULONG SixtySecondEnabled : 1; // Leap seconds enabled.\n            ULONG Reserved : 31;\n        };\n    };\n\n    //\n    // Global flags for the process.\n    //\n    ULONG NtGlobalFlag2;\n\n    //\n    // Extended feature disable mask (AVX). // since WIN11\n    //\n    ULONGLONG ExtendedFeatureDisableMask;\n} PEB, * PPEB;\n\n#ifdef _WIN64\nstatic_assert(FIELD_OFFSET(PEB, SessionId) == 0x2C0, \"FIELD_OFFSET(PEB, SessionId) is incorrect\");\n//static_assert(sizeof(PEB) == 0x7B0, \"Size of PEB is incorrect\"); // REDSTONE3\n//static_assert(sizeof(PEB) == 0x7B8, \"Size of PEB is incorrect\"); // REDSTONE4\n//static_assert(sizeof(PEB) == 0x7C8, \"Size of PEB is incorrect\"); // REDSTONE5 // 19H1\nstatic_assert(sizeof(PEB) == 0x7d0, \"Size of PEB is incorrect\"); // WIN11\n#else\nstatic_assert(FIELD_OFFSET(PEB, SessionId) == 0x1D4, \"FIELD_OFFSET(PEB, SessionId) is incorrect\");\n//static_assert(sizeof(PEB) == 0x468, \"Size of PEB is incorrect\"); // REDSTONE3\n//static_assert(sizeof(PEB) == 0x470, \"Size of PEB is incorrect\"); // REDSTONE4\n//static_assert(sizeof(PEB) == 0x480, \"Size of PEB is incorrect\"); // REDSTONE5 // 19H1\nstatic_assert(sizeof(PEB) == 0x488, \"Size of PEB is incorrect\"); // WIN11\n#endif\n\n#define GDI_BATCH_BUFFER_SIZE 310\n\n/**\n * The GDI_TEB_BATCH structure is used to store information about GDI batch operations.\n */\ntypedef struct _GDI_TEB_BATCH\n{\n    ULONG Offset;\n    ULONG_PTR HDC;\n    ULONG Buffer[GDI_BATCH_BUFFER_SIZE];\n} GDI_TEB_BATCH, *PGDI_TEB_BATCH;\n\n#define TEB_ACTIVE_FRAME_CONTEXT_FLAG_EXTENDED (0x00000001)\n\n/**\n * The TEB_ACTIVE_FRAME_CONTEXT structure is used to store information about an active frame context.\n */\ntypedef struct _TEB_ACTIVE_FRAME_CONTEXT\n{\n    ULONG Flags;\n    PCSTR FrameName;\n} TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;\n\n/**\n * The TEB_ACTIVE_FRAME_CONTEXT_EX structure extends TEB_ACTIVE_FRAME_CONTEXT with additional information.\n */\ntypedef struct _TEB_ACTIVE_FRAME_CONTEXT_EX\n{\n    TEB_ACTIVE_FRAME_CONTEXT BasicContext;\n    PCSTR SourceLocation;\n} TEB_ACTIVE_FRAME_CONTEXT_EX, *PTEB_ACTIVE_FRAME_CONTEXT_EX;\n\n#define TEB_ACTIVE_FRAME_FLAG_EXTENDED (0x00000001)\n\n/**\n * The TEB_ACTIVE_FRAME structure is used to store information about an active frame.\n */\ntypedef struct _TEB_ACTIVE_FRAME\n{\n    ULONG Flags;\n    struct _TEB_ACTIVE_FRAME *Previous;\n    PTEB_ACTIVE_FRAME_CONTEXT Context;\n} TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;\n\n/**\n * The TEB_ACTIVE_FRAME_EX structure extends TEB_ACTIVE_FRAME with additional information.\n */\ntypedef struct _TEB_ACTIVE_FRAME_EX\n{\n    TEB_ACTIVE_FRAME BasicFrame;\n    PVOID ExtensionIdentifier;\n} TEB_ACTIVE_FRAME_EX, *PTEB_ACTIVE_FRAME_EX;\n\n#define STATIC_UNICODE_BUFFER_LENGTH 261\n#define WIN32_CLIENT_INFO_LENGTH 62\n\n/**\n * Thread Environment Block (TEB) structure.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-teb\n */\ntypedef struct _TEB\n{\n    //\n    // Thread Information Block (TIB) contains the thread's stack, base and limit addresses, the current stack pointer, and the exception list.\n    //\n    NT_TIB NtTib;\n\n    //\n    // Reserved.\n    //\n    PVOID EnvironmentPointer;\n\n    //\n    // Client ID for this thread.\n    //\n    CLIENT_ID ClientId;\n\n    //\n    // A handle to an active Remote Procedure Call (RPC) if the thread is currently involved in an RPC operation.\n    //\n    PVOID ActiveRpcHandle;\n\n    //\n    // A pointer to the __declspec(thread) local storage array.\n    //\n    PVOID ThreadLocalStoragePointer;\n\n    //\n    // A pointer to the Process Environment Block (PEB), which contains information about the process.\n    //\n    PPEB ProcessEnvironmentBlock;\n\n    //\n    // The previous Win32 error value for this thread.\n    //\n    ULONG LastErrorValue;\n\n    //\n    // The number of critical sections currently owned by this thread.\n    //\n    ULONG CountOfOwnedCriticalSections;\n\n    //\n    // Reserved.\n    //\n    PVOID CsrClientThread;\n\n    //\n    // Reserved.\n    //\n    PVOID Win32ThreadInfo;\n\n    //\n    // Reserved.\n    //\n    ULONG User32Reserved[26];\n\n    //\n    // Reserved.\n    //\n    ULONG UserReserved[5];\n\n    //\n    // Reserved.\n    //\n    PVOID WOW32Reserved;\n\n    //\n    // The LCID of the current thread. (Kernel32!GetThreadLocale)\n    //\n    LCID CurrentLocale;\n\n    //\n    // Reserved.\n    //\n    ULONG FpSoftwareStatusRegister;\n\n    //\n    // Reserved.\n    //\n    PVOID ReservedForDebuggerInstrumentation[16];\n\n#ifdef _WIN64\n    //\n    // Reserved.\n    //\n    PVOID SystemReserved1[25];\n\n    //\n    // Per-thread fiber local storage. (Teb->HasFiberData)\n    //\n    PVOID HeapFlsData;\n\n    //\n    // Reserved.\n    //\n    ULONG_PTR RngState[4];\n#else\n    //\n    // Reserved.\n    //\n    PVOID SystemReserved1[26];\n#endif\n\n    //\n    // Placeholder compatibility mode. (ProjFs and Cloud Files)\n    //\n    CHAR PlaceholderCompatibilityMode;\n\n    //\n    // Indicates whether placeholder hydration is always explicit.\n    //\n    BOOLEAN PlaceholderHydrationAlwaysExplicit;\n\n    //\n    // Reserved.\n    //\n    CHAR PlaceholderReserved[10];\n\n    //\n    // The process ID (PID) that the current COM server thread is acting on behalf of.\n    //\n    ULONG ProxiedProcessId;\n\n    //\n    // Pointer to the activation context stack for the current thread.\n    //\n    ACTIVATION_CONTEXT_STACK ActivationStack;\n\n    //\n    // Opaque operation on behalf of another user or process.\n    //\n    UCHAR WorkingOnBehalfTicket[8];\n\n    //\n    // The last exception status for the current thread.\n    //\n    NTSTATUS ExceptionCode;\n\n    //\n    // Pointer to the activation context stack for the current thread.\n    //\n    PACTIVATION_CONTEXT_STACK ActivationContextStackPointer;\n\n    //\n    // The stack pointer (SP) of the current system call or exception during instrumentation.\n    //\n    ULONG_PTR InstrumentationCallbackSp;\n\n    //\n    // The program counter (PC) of the previous system call or exception during instrumentation.\n    //\n    ULONG_PTR InstrumentationCallbackPreviousPc;\n\n    //\n    // The stack pointer (SP) of the previous system call or exception during instrumentation.\n    //\n    ULONG_PTR InstrumentationCallbackPreviousSp;\n\n#ifdef _WIN64\n    //\n    // The miniversion ID of the current transacted file operation.\n    //\n    ULONG TxFsContext;\n#endif\n\n    //\n    // Indicates the state of the system call or exception instrumentation callback.\n    //\n    BOOLEAN InstrumentationCallbackDisabled;\n\n#ifdef _WIN64\n    //\n    // Indicates the state of alignment exceptions for unaligned load/store operations.\n    //\n    BOOLEAN UnalignedLoadStoreExceptions;\n#endif\n\n#ifndef _WIN64\n    //\n    // SpareBytes.\n    //\n    UCHAR SpareBytes[23];\n\n    //\n    // The miniversion ID of the current transacted file operation.\n    //\n    ULONG TxFsContext;\n#endif\n\n    //\n    // Reserved for GDI.\n    //\n    GDI_TEB_BATCH GdiTebBatch;\n    CLIENT_ID RealClientId;\n    HANDLE GdiCachedProcessHandle;\n    ULONG GdiClientPID;\n    ULONG GdiClientTID;\n    PVOID GdiThreadLocalInfo;\n\n    //\n    // Reserved for User32.\n    //\n    ULONG_PTR Win32ClientInfo[WIN32_CLIENT_INFO_LENGTH];\n\n    //\n    // Reserved for opengl32.dll\n    //\n    PVOID glDispatchTable[233];\n    ULONG_PTR glReserved1[29];\n    PVOID glReserved2;\n    PVOID glSectionInfo;\n    PVOID glSection;\n    PVOID glTable;\n    PVOID glCurrentRC;\n    PVOID glContext;\n\n    //\n    // The previous status value for this thread.\n    //\n    NTSTATUS LastStatusValue;\n\n    //\n    // A static string for use by the application.\n    //\n    UNICODE_STRING StaticUnicodeString;\n\n    //\n    // A static buffer for use by the application.\n    //\n    WCHAR StaticUnicodeBuffer[STATIC_UNICODE_BUFFER_LENGTH];\n\n    //\n    // The maximum stack size and indicates the base of the stack.\n    //\n    PVOID DeallocationStack;\n\n    //\n    // Data for Thread Local Storage. (TlsGetValue)\n    //\n    PVOID TlsSlots[TLS_MINIMUM_AVAILABLE];\n\n    //\n    // Reserved.\n    //\n    LIST_ENTRY TlsLinks;\n\n    //\n    // Reserved for NTVDM.\n    //\n    PVOID Vdm;\n\n    //\n    // Reserved.\n    //\n    PVOID ReservedForNtRpc;\n\n    //\n    // Reserved.\n    //\n    PVOID DbgSsReserved[2];\n\n    //\n    // The error mode for the current thread. (GetThreadErrorMode)\n    //\n    ULONG HardErrorMode;\n\n    //\n    // Reserved.\n    //\n#ifdef _WIN64\n    PVOID Instrumentation[11];\n#else\n    PVOID Instrumentation[9];\n#endif\n\n    //\n    // Reserved.\n    //\n    GUID ActivityId;\n\n    //\n    // The service creating the thread (svchost).\n    //\n    PVOID SubProcessTag;\n\n    //\n    // Reserved.\n    //\n    PVOID PerflibData;\n\n    //\n    // Reserved.\n    //\n    PVOID EtwTraceData;\n\n    //\n    // The address of a socket handle during a blocking socket operation. (WSAStartup)\n    //\n    HANDLE WinSockData;\n\n    //\n    // The number of function calls accumulated in the current GDI batch. (GdiSetBatchLimit)\n    //\n    ULONG GdiBatchCount;\n\n    //\n    // The preferred processor for the current thread. (SetThreadIdealProcessor/SetThreadIdealProcessorEx)\n    //\n    union\n    {\n        PROCESSOR_NUMBER CurrentIdealProcessor;\n        ULONG IdealProcessorValue;\n        struct\n        {\n            UCHAR ReservedPad0;\n            UCHAR ReservedPad1;\n            UCHAR ReservedPad2;\n            UCHAR IdealProcessor;\n        };\n    };\n\n    //\n    // The minimum size of the stack available during any stack overflow exceptions. (SetThreadStackGuarantee)\n    //\n    ULONG GuaranteedStackBytes;\n\n    //\n    // Reserved.\n    //\n    PVOID ReservedForPerf;\n\n    //\n    // tagSOleTlsData.\n    //\n    PVOID ReservedForOle;\n\n    ULONG WaitingOnLoaderLock;\n    PVOID SavedPriorityState;\n    ULONG_PTR ReservedForCodeCoverage;\n    PVOID ThreadPoolData;\n    PVOID *TlsExpansionSlots;\n#ifdef _WIN64\n    PVOID ChpeV2CpuAreaInfo; // CHPEV2_CPUAREA_INFO // previously DeallocationBStore\n    PVOID Unused; // previously BStoreLimit\n#endif\n    ULONG MuiGeneration;\n    ULONG IsImpersonating;\n    PVOID NlsCache;\n    PVOID pShimData;\n    ULONG HeapData;\n    HANDLE CurrentTransactionHandle;\n    PTEB_ACTIVE_FRAME ActiveFrame;\n\n    //\n    // Reserved for FLS (RtlProcessFlsData).\n    //\n    PVOID FlsData;\n\n    PVOID PreferredLanguages;\n    PVOID UserPrefLanguages;\n    PVOID MergedPrefLanguages;\n    ULONG MuiImpersonation;\n\n    union\n    {\n        USHORT CrossTebFlags;\n        USHORT SpareCrossTebBits : 16;\n    };\n    union\n    {\n        USHORT SameTebFlags;\n        struct\n        {\n            USHORT SafeThunkCall : 1;\n            USHORT InDebugPrint : 1;\n            USHORT HasFiberData : 1;\n            USHORT SkipThreadAttach : 1;\n            USHORT WerInShipAssertCode : 1;\n            USHORT RanProcessInit : 1;\n            USHORT ClonedThread : 1;\n            USHORT SuppressDebugMsg : 1;\n            USHORT DisableUserStackWalk : 1;\n            USHORT RtlExceptionAttached : 1;\n            USHORT InitialThread : 1;\n            USHORT SessionAware : 1;\n            USHORT LoadOwner : 1;\n            USHORT LoaderWorker : 1;\n            USHORT SkipLoaderInit : 1;\n            USHORT SkipFileAPIBrokering : 1;\n        };\n    };\n\n    PVOID TxnScopeEnterCallback;\n    PVOID TxnScopeExitCallback;\n    PVOID TxnScopeContext;\n    ULONG LockCount;\n    LONG WowTebOffset;\n    PVOID ResourceRetValue;\n    PVOID ReservedForWdf;\n    ULONGLONG ReservedForCrt;\n    GUID EffectiveContainerId;\n    ULONGLONG LastSleepCounter; // Win11\n    ULONG SpinCallCount;\n    ULONGLONG ExtendedFeatureDisableMask;\n    PVOID SchedulerSharedDataSlot; // 24H2\n    PVOID HeapWalkContext;\n    GROUP_AFFINITY PrimaryGroupAffinity;\n    ULONG Rcu[2];\n} TEB, *PTEB;\n\n#ifdef _WIN64\n//static_assert(sizeof(TEB) == 0x1850, \"Size of TEB is incorrect\"); // WIN11\nstatic_assert(sizeof(TEB) == 0x1878, \"Size of TEB is incorrect\"); // 24H2\n#else\n//static_assert(sizeof(TEB) == 0x1018, \"Size of TEB is incorrect\"); // WIN11\nstatic_assert(sizeof(TEB) == 0x1038, \"Size of TEB is incorrect\"); // 24H2\n#endif\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntpfapi.h",
    "content": "/*\n * Prefetcher (Superfetch) support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTPFAPI_H\n#define _NTPFAPI_H\n\n// begin_private\n\n//\n// Prefetch\n//\n\ntypedef enum _PF_BOOT_PHASE_ID\n{\n    PfKernelInitPhase = 0,\n    PfBootDriverInitPhase = 90,\n    PfSystemDriverInitPhase = 120,\n    PfSessionManagerInitPhase = 150,\n    PfSMRegistryInitPhase = 180,\n    PfVideoInitPhase = 210,\n    PfPostVideoInitPhase = 240,\n    PfBootAcceptedRegistryInitPhase = 270,\n    PfUserShellReadyPhase = 300,\n    PfMaxBootPhaseId = 900\n} PF_BOOT_PHASE_ID;\n\ntypedef enum _PF_ENABLE_STATUS\n{\n    PfSvNotSpecified,\n    PfSvEnabled,\n    PfSvDisabled,\n    PfSvMaxEnableStatus\n} PF_ENABLE_STATUS;\n\ntypedef struct _PF_TRACE_LIMITS\n{\n    ULONG MaxNumPages;\n    ULONG MaxNumSections;\n    LONGLONG TimerPeriod;\n} PF_TRACE_LIMITS, *PPF_TRACE_LIMITS;\n\ntypedef struct _PF_SYSTEM_PREFETCH_PARAMETERS\n{\n    PF_ENABLE_STATUS EnableStatus[2];\n    PF_TRACE_LIMITS TraceLimits[2];\n    ULONG MaxNumActiveTraces;\n    ULONG MaxNumSavedTraces;\n    WCHAR RootDirPath[32];\n    WCHAR HostingApplicationList[128];\n} PF_SYSTEM_PREFETCH_PARAMETERS, *PPF_SYSTEM_PREFETCH_PARAMETERS;\n\n#define PF_BOOT_CONTROL_VERSION 1\n\ntypedef struct _PF_BOOT_CONTROL\n{\n    ULONG Version;\n    ULONG DisableBootPrefetching;\n} PF_BOOT_CONTROL, *PPF_BOOT_CONTROL;\n\ntypedef enum _PREFETCHER_INFORMATION_CLASS\n{\n    PrefetcherRetrieveTrace = 1, // q: CHAR[]\n    PrefetcherSystemParameters, // q: PF_SYSTEM_PREFETCH_PARAMETERS\n    PrefetcherBootPhase, // s: PF_BOOT_PHASE_ID\n    PrefetcherSpare1, // PrefetcherRetrieveBootLoaderTrace // q: CHAR[]\n    PrefetcherBootControl, // s: PF_BOOT_CONTROL\n    PrefetcherScenarioPolicyControl,\n    PrefetcherSpare2,\n    PrefetcherAppLaunchScenarioControl,\n    PrefetcherInformationMax\n} PREFETCHER_INFORMATION_CLASS;\n\n#define PREFETCHER_INFORMATION_VERSION 23 // rev\n#define PREFETCHER_INFORMATION_MAGIC ('kuhC') // rev\n\ntypedef struct _PREFETCHER_INFORMATION\n{\n    _In_ ULONG Version;\n    _In_ ULONG Magic;\n    _In_ PREFETCHER_INFORMATION_CLASS PrefetcherInformationClass;\n    _Inout_ PVOID PrefetcherInformation;\n    _Inout_ ULONG PrefetcherInformationLength;\n} PREFETCHER_INFORMATION, *PPREFETCHER_INFORMATION;\n\n//\n// Superfetch\n//\n\ntypedef struct _PF_SYSTEM_SUPERFETCH_PARAMETERS\n{\n    ULONG EnabledComponents;\n    ULONG BootID;\n    ULONG SavedSectInfoTracesMax;\n    ULONG SavedPageAccessTracesMax;\n    ULONG ScenarioPrefetchTimeoutStandby;\n    ULONG ScenarioPrefetchTimeoutHibernate;\n    ULONG ScenarioPrefetchTimeoutHiberBoot;\n} PF_SYSTEM_SUPERFETCH_PARAMETERS, *PPF_SYSTEM_SUPERFETCH_PARAMETERS;\n\n// rev\ntypedef enum _PF_EVENT_TYPE\n{\n    PfEventTypeImageLoad = 0,\n    PfEventTypeAppLaunch = 1,\n    PfEventTypeStartTrace = 2,\n    PfEventTypeEndTrace = 3,\n    PfEventTypeTimestamp = 4,\n    PfEventTypeOperation = 5,\n    PfEventTypeRepurpose = 6,\n    PfEventTypeForegroundProcess = 7,\n    PfEventTypeTimeRange = 8,\n    PfEventTypeUserInput = 9,\n    PfEventTypeFileAccess = 10,\n    PfEventTypeUnmap = 11,\n    PfEventTypeUtilization = 11,\n    PfEventTypeMemInfo = 12,\n    PfEventTypeFileDelete = 13,\n    PfEventTypeAppExit = 14,\n    PfEventTypeSystemTime = 15,\n    PfEventTypePower = 16,\n    PfEventTypeSessionChange = 17,\n    PfEventTypeHardFaultTimeStamp = 18,\n    PfEventTypeVirtualFree = 19,\n    PfEventTypePerfInfo = 20,\n    PfEventTypeProcessSnapshot = 21,\n    PfEventTypeUserSnapshot = 22,\n    PfEventTypeStreamSequenceNumber = 23,\n    PfEventTypeFileTruncate = 24,\n    PfEventTypeFileRename = 25,\n    PfEventTypeFileCreate = 26,\n    PfEventTypeAgCxContext = 27,\n    PfEventTypePowerAction = 28,\n    PfEventTypeHardFaultTS = 29,\n    PfEventTypeRobustInfo = 30,\n    PfEventTypeFileDefrag = 31,\n    PfEventTypeMax = 32\n} PF_EVENT_TYPE;\n\n// rev\ntypedef struct _PF_LOG_EVENT_DATA\n{\n    ULONG EventType : 5; // PF_EVENT_TYPE\n    ULONG Flags : 2;\n    ULONG DataSize : 25;\n    PVOID EventData;\n} PF_LOG_EVENT_DATA, *PPF_LOG_EVENT_DATA;\n\n#define PF_PFN_PRIO_REQUEST_VERSION 1\n#define PF_PFN_PRIO_REQUEST_QUERY_MEMORY_LIST 0x1\n#define PF_PFN_PRIO_REQUEST_VALID_FLAGS 0x1\n\ntypedef struct _PF_PFN_PRIO_REQUEST\n{\n    ULONG Version;\n    ULONG RequestFlags;\n    ULONG_PTR PfnCount;\n    SYSTEM_MEMORY_LIST_INFORMATION MemInfo;\n    MMPFN_IDENTITY PageData[256];\n} PF_PFN_PRIO_REQUEST, *PPF_PFN_PRIO_REQUEST;\n\ntypedef enum _PFS_PRIVATE_PAGE_SOURCE_TYPE\n{\n    PfsPrivateSourceKernel,\n    PfsPrivateSourceSession,\n    PfsPrivateSourceProcess,\n    PfsPrivateSourceMax\n} PFS_PRIVATE_PAGE_SOURCE_TYPE;\n\ntypedef struct _PFS_PRIVATE_PAGE_SOURCE\n{\n    PFS_PRIVATE_PAGE_SOURCE_TYPE Type;\n    union\n    {\n        ULONG SessionId;\n        ULONG ProcessId;\n    };\n    ULONG ImagePathHash;\n    ULONG_PTR UniqueProcessHash;\n} PFS_PRIVATE_PAGE_SOURCE, *PPFS_PRIVATE_PAGE_SOURCE;\n\ntypedef struct _PF_PRIVSOURCE_INFO\n{\n    PFS_PRIVATE_PAGE_SOURCE DbInfo;\n    PVOID EProcess;\n    SIZE_T WsPrivatePages;\n    SIZE_T TotalPrivatePages;\n    ULONG SessionID;\n    CHAR ImageName[16];\n    union {\n        ULONG_PTR WsSwapPages;                 // process only PF_PRIVSOURCE_QUERY_WS_SWAP_PAGES.\n        ULONG_PTR SessionPagedPoolPages;       // session only.\n        ULONG_PTR StoreSizePages;              // process only PF_PRIVSOURCE_QUERY_STORE_INFO.\n    };\n    ULONG_PTR WsTotalPages;         // process/session only.\n    ULONG DeepFreezeTimeMs;         // process only.\n    ULONG ModernApp : 1;            // process only.\n    ULONG DeepFrozen : 1;           // process only. If set, DeepFreezeTimeMs contains the time at which the freeze occurred\n    ULONG Foreground : 1;           // process only.\n    ULONG PerProcessStore : 1;      // process only.\n    ULONG Spare : 28;\n} PF_PRIVSOURCE_INFO, *PPF_PRIVSOURCE_INFO;\n\n// rev\n#define PF_PRIVSOURCE_QUERY_REQUEST_VERSION 8\n#define PF_PRIVSOURCE_QUERY_REQUEST_FLAGS_QUERYWSPAGES 0x1\n#define PF_PRIVSOURCE_QUERY_REQUEST_FLAGS_QUERYCOMPRESSEDPAGES 0x2\n#define PF_PRIVSOURCE_QUERY_REQUEST_FLAGS_QUERYSKIPPAGES 0x4 // ??\n\n// rev\ntypedef struct _PF_PRIVSOURCE_QUERY_REQUEST\n{\n    ULONG Version;\n    ULONG Flags;\n    ULONG InfoCount;\n    PF_PRIVSOURCE_INFO InfoArray[1];\n} PF_PRIVSOURCE_QUERY_REQUEST, *PPF_PRIVSOURCE_QUERY_REQUEST;\n\n// rev\ntypedef enum _PF_PHASED_SCENARIO_TYPE\n{\n    PfScenarioTypeNone,\n    PfScenarioTypeStandby,\n    PfScenarioTypeHibernate,\n    PfScenarioTypeFUS,\n    PfScenarioTypeMax\n} PF_PHASED_SCENARIO_TYPE;\n\n// rev\n#define PF_SCENARIO_PHASE_INFO_VERSION 4\n\n// rev\ntypedef struct _PF_SCENARIO_PHASE_INFO\n{\n    ULONG Version;\n    PF_PHASED_SCENARIO_TYPE ScenType;\n    ULONG PhaseId;\n    ULONG SequenceNumber;\n    ULONG Flags;\n    ULONG FUSUserId;\n} PF_SCENARIO_PHASE_INFO, *PPF_SCENARIO_PHASE_INFO;\n\n// rev\ntypedef struct _PF_MEMORY_LIST_NODE\n{\n    ULONGLONG Node : 8;\n    ULONGLONG Spare : 56;\n    ULONGLONG StandbyLowPageCount;\n    ULONGLONG StandbyMediumPageCount;\n    ULONGLONG StandbyHighPageCount;\n    ULONGLONG FreePageCount;\n    ULONGLONG ModifiedPageCount;\n} PF_MEMORY_LIST_NODE, *PPF_MEMORY_LIST_NODE;\n\n// rev\ntypedef struct _PF_ROBUST_PROCESS_ENTRY\n{\n    ULONG ImagePathHash;\n    ULONG Pid;\n    ULONG Alignment;\n} PF_ROBUST_PROCESS_ENTRY, *PPF_ROBUST_PROCESS_ENTRY;\n\n// rev\ntypedef struct _PF_ROBUST_FILE_ENTRY\n{\n    ULONG FilePathHash;\n} PF_ROBUST_FILE_ENTRY, *PPF_ROBUST_FILE_ENTRY;\n\n// rev\ntypedef enum _PF_ROBUSTNESS_CONTROL_COMMAND\n{\n    PfRpControlUpdate = 0,\n    PfRpControlReset = 1,\n    PfRpControlRobustAllStart = 2,\n    PfRpControlRobustAllStop = 3,\n    PfRpControlCommandMax = 4\n} PF_ROBUSTNESS_CONTROL_COMMAND;\n\n// rev\n#define PF_ROBUSTNESS_CONTROL_VERSION 1\n\n// rev\ntypedef struct _PF_ROBUSTNESS_CONTROL\n{\n    ULONG Version;\n    PF_ROBUSTNESS_CONTROL_COMMAND Command;\n    ULONG DeprioProcessCount;\n    ULONG ExemptProcessCount;\n    ULONG DeprioFileCount;\n    ULONG ExemptFileCount;\n    PF_ROBUST_PROCESS_ENTRY ProcessEntries[1];\n    PF_ROBUST_FILE_ENTRY FileEntries[1];\n} PF_ROBUSTNESS_CONTROL, *PPF_ROBUSTNESS_CONTROL;\n\n// rev\ntypedef struct _PF_SCENARIO_PREFETCH_INFO\n{\n    USHORT Version;\n    USHORT PrefetchEnd : 1;\n    PF_PHASED_SCENARIO_TYPE ScenType;\n} PF_SCENARIO_PREFETCH_INFO, *PPF_SCENARIO_PREFETCH_INFO;\n\n// rev\ntypedef struct _PF_TIME_CONTROL\n{\n    LONG TimeAdjustment;\n} PF_TIME_CONTROL, *PPF_TIME_CONTROL;\n\n#define PF_MEMORY_LIST_INFO_VERSION 1\n\ntypedef struct _PF_MEMORY_LIST_INFO\n{\n    ULONG Version;\n    ULONG Size;\n    ULONG NodeCount;\n    PF_MEMORY_LIST_NODE Nodes[1];\n} PF_MEMORY_LIST_INFO, *PPF_MEMORY_LIST_INFO;\n\ntypedef struct _PF_PHYSICAL_MEMORY_RANGE\n{\n    ULONG_PTR BasePfn;\n    ULONG_PTR PageCount;\n} PF_PHYSICAL_MEMORY_RANGE, *PPF_PHYSICAL_MEMORY_RANGE;\n\n#define PF_PHYSICAL_MEMORY_RANGE_INFO_V1_VERSION 1\n\ntypedef struct _PF_PHYSICAL_MEMORY_RANGE_INFO_V1\n{\n    ULONG Version;\n    ULONG RangeCount;\n    PF_PHYSICAL_MEMORY_RANGE Ranges[1];\n} PF_PHYSICAL_MEMORY_RANGE_INFO_V1, *PPF_PHYSICAL_MEMORY_RANGE_INFO_V1;\n\n#define PF_PHYSICAL_MEMORY_RANGE_INFO_V2_VERSION 2\n\ntypedef struct _PF_PHYSICAL_MEMORY_RANGE_INFO_V2\n{\n    ULONG Version;\n    ULONG Flags;\n    ULONG RangeCount;\n    PF_PHYSICAL_MEMORY_RANGE Ranges[ANYSIZE_ARRAY];\n} PF_PHYSICAL_MEMORY_RANGE_INFO_V2, *PPF_PHYSICAL_MEMORY_RANGE_INFO_V2;\n\n// rev\n#define PF_ACCESS_TRACING_CONTROL_VERSION 1\n\n// rev\ntypedef struct _PF_ACCESS_TRACING_CONTROL\n{\n    ULONG Version;\n    ULONG Command;\n    ULONG ComponentMask;\n} PF_ACCESS_TRACING_CONTROL, *PPF_ACCESS_TRACING_CONTROL;\n\ntypedef enum _PF_TRIM_WHILE_AGING_STATE\n{\n\tPfTrimWhileAgingOff = 0,\n\tPfTrimWhileAgingLowPriority = 1,\n\tPfTrimWhileAgingPassive = 2,\n\tPfTrimWhileAgingNormal = 3,\n\tPfTrimWhileAgingAggressive = 4,\n\tPfTrimWhileAgingMax = 5,\n} PF_TRIM_WHILE_AGING_STATE, *PPF_TRIM_WHILE_AGING_STATE;\n\n// rev\n#define PF_TRIM_WHILE_AGING_CONTROL_VERSION 1\n\n// rev\ntypedef struct _PF_TRIM_WHILE_AGING_CONTROL\n{\n    ULONG Version;\n    PF_TRIM_WHILE_AGING_STATE TrimWhileAgingState;\n    BOOLEAN PrivatePageTrimAge;\n    BOOLEAN SharedPageTrimAge;\n    USHORT Spare;\n} PF_TRIM_WHILE_AGING_CONTROL, *PPF_TRIM_WHILE_AGING_CONTROL;\n\n// rev\n#define PF_REPURPOSED_BY_PREFETCH_INFO_VERSION 1\n\n// rev\ntypedef struct _PF_REPURPOSED_BY_PREFETCH_INFO\n{\n    ULONG Version;\n    SIZE_T RepurposedByPrefetch;\n} PF_REPURPOSED_BY_PREFETCH_INFO, *PPF_REPURPOSED_BY_PREFETCH_INFO;\n\n// rev\n#define PF_VIRTUAL_QUERY_VERSION 1\n\n// rev\ntypedef struct _PF_VIRTUAL_QUERY\n{\n    ULONG Version;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG FaultInPageTables : 1;\n            ULONG ReportPageTables : 1;\n            ULONG Spare : 30;\n        };\n    };\n    PVOID QueryBuffer; // MEMORY_WORKING_SET_EX_INFORMATION[NumberOfPages] (input: VirtualAddress[], output: VirtualAttributes[])\n    SIZE_T QueryBufferSize; // NumberOfPages * sizeof(MEMORY_WORKING_SET_EX_INFORMATION)\n    HANDLE ProcessHandle;\n} PF_VIRTUAL_QUERY, *PPF_VIRTUAL_QUERY;\n\n// rev\n#define PF_PAGECOMBINE_AGGREGATE_STAT_VERSION 1\n\n// rev\ntypedef struct _PF_PAGECOMBINE_AGGREGATE_STAT\n{\n    ULONG Version;\n    ULONG CombineScanCount;\n    ULONG CombinedBlocksInUse;\n    ULONG SumCombinedBlocksReferenceCount;\n} PF_PAGECOMBINE_AGGREGATE_STAT, *PPF_PAGECOMBINE_AGGREGATE_STAT;\n\n// rev\n#define PF_MIN_WS_AGE_RATE_CONTROL_VERSION 1\n\n// rev\ntypedef struct _PF_MIN_WS_AGE_RATE_CONTROL\n{\n    ULONG Version;\n    ULONG SecondsToOldestAge;\n} PF_MIN_WS_AGE_RATE_CONTROL, *PPF_MIN_WS_AGE_RATE_CONTROL;\n\n// rev\n#define PF_DEPRIORITIZE_OLD_PAGES_VERSION 3\n\n// rev\ntypedef struct _PF_DEPRIORITIZE_OLD_PAGES\n{\n    ULONG Version;\n    HANDLE ProcessHandle;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG TargetPriority : 4;\n            ULONG TrimPages : 2;\n            ULONG Spare : 26;\n        };\n    };\n} PF_DEPRIORITIZE_OLD_PAGES, *PPF_DEPRIORITIZE_OLD_PAGES;\n\n// rev\n#define PF_FILE_EXTENTS_INFO_VERSION 1\n\n// rev\ntypedef struct _PF_FILE_EXTENTS_INFO\n{\n    ULONG Version;\n    PWSTR FilePath;\n    ULONG FilePathSize;\n    ULONG VolumePathSize;\n    LARGE_INTEGER FileIndexNumber;\n    ULONG VolumeSerialNumber;\n    RETRIEVAL_POINTERS_BUFFER ExtentsBuffer;\n    ULONGLONG ExtentsBufferSize;\n} PF_FILE_EXTENTS_INFO, *PPF_FILE_EXTENTS_INFO;\n\n// rev\n#define PF_GPU_UTILIZATION_INFO_VERSION 1\n\n// rev\ntypedef struct _PF_GPU_UTILIZATION_INFO\n{\n    ULONG Version;\n    ULONG SessionId;\n    ULONGLONG GpuTime;\n} PF_GPU_UTILIZATION_INFO, *PPF_GPU_UTILIZATION_INFO;\n\n// rev\ntypedef enum _SUPERFETCH_INFORMATION_CLASS\n{\n    SuperfetchRetrieveTrace = 1, // q: CHAR[]\n    SuperfetchSystemParameters, // q: PF_SYSTEM_SUPERFETCH_PARAMETERS\n    SuperfetchLogEvent, // s: PF_LOG_EVENT_DATA\n    SuperfetchGenerateTrace, // s: NULL\n    SuperfetchPrefetch,\n    SuperfetchPfnQuery, // q: PF_PFN_PRIO_REQUEST\n    SuperfetchPfnSetPriority,\n    SuperfetchPrivSourceQuery, // q: PF_PRIVSOURCE_QUERY_REQUEST\n    SuperfetchSequenceNumberQuery, // q: ULONG\n    SuperfetchScenarioPhase,  // q: PF_SCENARIO_PHASE_INFO // 10\n    SuperfetchWorkerPriority, // s: KPRIORITY\n    SuperfetchScenarioQuery,\n    SuperfetchScenarioPrefetch, // PF_SCENARIO_PREFETCH_INFO\n    SuperfetchRobustnessControl, // s: PF_ROBUSTNESS_CONTROL\n    SuperfetchTimeControl, // s: PF_TIME_CONTROL\n    SuperfetchMemoryListQuery, // q: PF_MEMORY_LIST_INFO\n    SuperfetchMemoryRangesQuery, // q: PF_PHYSICAL_MEMORY_RANGE_INFO\n    SuperfetchTracingControl, // PF_ACCESS_TRACING_CONTROL\n    SuperfetchTrimWhileAgingControl, // PF_TRIM_WHILE_AGING_CONTROL\n    SuperfetchRepurposedByPrefetch, // q: PF_REPURPOSED_BY_PREFETCH_INFO // 20\n    SuperfetchChannelPowerRequest,\n    SuperfetchMovePages,\n    SuperfetchVirtualQuery, // q: PF_VIRTUAL_QUERY\n    SuperfetchCombineStatsQuery, // PF_PAGECOMBINE_AGGREGATE_STAT\n    SuperfetchSetMinWsAgeRate, // s: PF_MIN_WS_AGE_RATE_CONTROL\n    SuperfetchDeprioritizeOldPagesInWs, // s: PF_DEPRIORITIZE_OLD_PAGES\n    SuperfetchFileExtentsQuery, // q: PF_FILE_EXTENTS_INFO\n    SuperfetchGpuUtilizationQuery, // q: PF_GPU_UTILIZATION_INFO\n    SuperfetchPfnSet, // s: PF_PFN_PRIO_REQUEST // since WIN11\n    SuperfetchInformationMax\n} SUPERFETCH_INFORMATION_CLASS;\n\n#define SUPERFETCH_INFORMATION_VERSION 45 // rev\n#define SUPERFETCH_INFORMATION_MAGIC ('kuhC') // rev\n\ntypedef struct _SUPERFETCH_INFORMATION\n{\n    _In_ ULONG Version;\n    _In_ ULONG Magic;\n    _In_ SUPERFETCH_INFORMATION_CLASS SuperfetchInformationClass;\n    _Inout_ PVOID SuperfetchInformation;\n    _Inout_ ULONG SuperfetchInformationLength;\n} SUPERFETCH_INFORMATION, *PSUPERFETCH_INFORMATION;\n\n// end_private\n\n#endif // _NTPFAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntpnpapi.h",
    "content": "/*\n * Plug and Play support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTPNPAPI_H\n#define _NTPNPAPI_H\n\n#include <cfg.h>\n\ntypedef enum _PLUGPLAY_EVENT_CATEGORY\n{\n    HardwareProfileChangeEvent,\n    TargetDeviceChangeEvent,\n    DeviceClassChangeEvent,\n    CustomDeviceEvent,\n    DeviceInstallEvent,\n    DeviceArrivalEvent,\n    PowerEvent,\n    VetoEvent,\n    BlockedDriverEvent,\n    InvalidIDEvent,\n    MaxPlugEventCategory\n} PLUGPLAY_EVENT_CATEGORY, *PPLUGPLAY_EVENT_CATEGORY;\n\ntypedef struct _PLUGPLAY_EVENT_BLOCK\n{\n    GUID EventGuid;\n    PLUGPLAY_EVENT_CATEGORY EventCategory;\n    PULONG Result;\n    ULONG Flags;\n    ULONG TotalSize;\n    PVOID DeviceObject;\n\n    union\n    {\n        struct\n        {\n            GUID ClassGuid;\n            WCHAR SymbolicLinkName[1];\n        } DeviceClass;\n        struct\n        {\n            WCHAR DeviceIds[1];\n        } TargetDevice;\n        struct\n        {\n            WCHAR DeviceId[1];\n        } InstallDevice;\n        struct\n        {\n            PVOID NotificationStructure;\n            WCHAR DeviceIds[1];\n        } CustomNotification;\n        struct\n        {\n            PVOID Notification;\n        } ProfileNotification;\n        struct\n        {\n            ULONG NotificationCode;\n            ULONG NotificationData;\n        } PowerNotification;\n        struct\n        {\n            PNP_VETO_TYPE VetoType;\n            WCHAR DeviceIdVetoNameBuffer[1]; // DeviceId<null>VetoName<null><null>\n        } VetoNotification;\n        struct\n        {\n            GUID BlockedDriverGuid;\n        } BlockedDriverNotification;\n        struct\n        {\n            WCHAR ParentId[1];\n        } InvalidIDNotification;\n    } u;\n} PLUGPLAY_EVENT_BLOCK, *PPLUGPLAY_EVENT_BLOCK;\n\ntypedef enum _PLUGPLAY_CONTROL_CLASS\n{\n    PlugPlayControlEnumerateDevice, // PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA\n    PlugPlayControlRegisterNewDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlDeregisterDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlInitializeDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlStartDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlUnlockDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlQueryAndRemoveDevice, // PLUGPLAY_CONTROL_QUERY_AND_REMOVE_DATA\n    PlugPlayControlUserResponse, // PLUGPLAY_CONTROL_USER_RESPONSE_DATA\n    PlugPlayControlGenerateLegacyDevice, // PLUGPLAY_CONTROL_LEGACY_DEVGEN_DATA\n    PlugPlayControlGetInterfaceDeviceList, // PLUGPLAY_CONTROL_INTERFACE_LIST_DATA\n    PlugPlayControlProperty, // PLUGPLAY_CONTROL_PROPERTY_DATA\n    PlugPlayControlDeviceClassAssociation, // PLUGPLAY_CONTROL_CLASS_ASSOCIATION_DATA\n    PlugPlayControlGetRelatedDevice, // PLUGPLAY_CONTROL_RELATED_DEVICE_DATA\n    PlugPlayControlGetInterfaceDeviceAlias, // PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA\n    PlugPlayControlDeviceStatus, // PLUGPLAY_CONTROL_STATUS_DATA\n    PlugPlayControlGetDeviceDepth, // PLUGPLAY_CONTROL_DEPTH_DATA\n    PlugPlayControlQueryDeviceRelations, // PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA\n    PlugPlayControlTargetDeviceRelation, // PLUGPLAY_CONTROL_TARGET_RELATION_DATA\n    PlugPlayControlQueryConflictList, // PLUGPLAY_CONTROL_CONFLICT_LIST\n    PlugPlayControlRetrieveDock, // PLUGPLAY_CONTROL_RETRIEVE_DOCK_DATA\n    PlugPlayControlResetDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlHaltDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA\n    PlugPlayControlGetBlockedDriverList, // PLUGPLAY_CONTROL_BLOCKED_DRIVER_DATA\n    PlugPlayControlGetDeviceInterfaceEnabled, // PLUGPLAY_CONTROL_DEVICE_INTERFACE_ENABLED\n    MaxPlugPlayControl\n} PLUGPLAY_CONTROL_CLASS, *PPLUGPLAY_CONTROL_CLASS;\n\n// private\ntypedef enum _DEVICE_RELATION_TYPE\n{\n    BusRelations,\n    EjectionRelations,\n    PowerRelations,\n    RemovalRelations,\n    TargetDeviceRelation,\n    SingleBusRelations,\n    TransportRelations\n} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;\n\n// private\ntypedef enum _BUS_QUERY_ID_TYPE\n{\n    BusQueryDeviceID = 0,           // <Enumerator>\\<Enumerator-specific device id>\n    BusQueryHardwareIDs = 1,        // Hardware ids\n    BusQueryCompatibleIDs = 2,      // compatible device ids\n    BusQueryInstanceID = 3,         // persistent id for this instance of the device\n    BusQueryDeviceSerialNumber = 4, // serial number for this device\n    BusQueryContainerID = 5         // unique id of the device's physical container\n} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;\n\n// private\ntypedef enum _DEVICE_TEXT_TYPE\n{\n    DeviceTextDescription = 0,        // DeviceDesc property\n    DeviceTextLocationInformation = 1 // DeviceLocation property\n} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;\n\n// private\ntypedef enum _DEVICE_USAGE_NOTIFICATION_TYPE\n{\n    DeviceUsageTypeUndefined,\n    DeviceUsageTypePaging,\n    DeviceUsageTypeHibernation,\n    DeviceUsageTypeDumpFile,\n    DeviceUsageTypeBoot,\n    DeviceUsageTypePostDisplay,\n    DeviceUsageTypeGuestAssigned\n} DEVICE_USAGE_NOTIFICATION_TYPE, *PDEVICE_USAGE_NOTIFICATION_TYPE;\n\n#if (PHNT_VERSION < PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetPlugPlayEvent(\n    _In_ HANDLE EventHandle,\n    _In_opt_ PVOID Context,\n    _Out_writes_bytes_(EventBufferSize) PPLUGPLAY_EVENT_BLOCK EventBlock,\n    _In_ ULONG EventBufferSize\n    );\n#endif // (PHNT_VERSION < PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPlugPlayControl(\n    _In_ PLUGPLAY_CONTROL_CLASS PnPControlClass,\n    _Inout_updates_bytes_(PnPControlDataLength) PVOID PnPControlData,\n    _In_ ULONG PnPControlDataLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSerializeBoot(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnableLastKnownGood(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDisableLastKnownGood(\n    VOID\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplacePartitionUnit(\n    _In_ PCUNICODE_STRING TargetInstancePath,\n    _In_ PCUNICODE_STRING SpareInstancePath,\n    _In_ ULONG Flags\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#endif // _NTPNPAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntpoapi.h",
    "content": "/*\n * Power Management support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTPOAPI_H\n#define _NTPOAPI_H\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n// POWER_INFORMATION_LEVEL\n// Note: We don't use an enum for these values to minimize conflicts with the Windows SDK. (dmex)\n#define SystemPowerPolicyAc 0 // SYSTEM_POWER_POLICY // GET: InputBuffer NULL. SET: InputBuffer not NULL.\n#define SystemPowerPolicyDc 1 // SYSTEM_POWER_POLICY\n#define VerifySystemPolicyAc 2 // SYSTEM_POWER_POLICY\n#define VerifySystemPolicyDc 3 // SYSTEM_POWER_POLICY\n#define SystemPowerCapabilities 4 // SYSTEM_POWER_CAPABILITIES\n#define SystemBatteryState 5 // SYSTEM_BATTERY_STATE\n#define SystemPowerStateHandler 6 // POWER_STATE_HANDLER // (kernel-mode only)\n#define ProcessorStateHandler 7 // PROCESSOR_STATE_HANDLER // (kernel-mode only)\n#define SystemPowerPolicyCurrent 8 // SYSTEM_POWER_POLICY\n#define AdministratorPowerPolicy 9 // ADMINISTRATOR_POWER_POLICY\n#define SystemReserveHiberFile 10 // BOOLEAN // (requires SeCreatePagefilePrivilege) // TRUE: hibernation file created. FALSE: hibernation file deleted.\n#define ProcessorInformation 11 // PROCESSOR_POWER_INFORMATION\n#define SystemPowerInformation 12 // SYSTEM_POWER_INFORMATION\n#define ProcessorStateHandler2 13 // PROCESSOR_STATE_HANDLER2 // not implemented\n#define LastWakeTime 14 // ULONGLONG // InterruptTime\n#define LastSleepTime 15 // ULONGLONG // InterruptTime\n#define SystemExecutionState 16 // EXECUTION_STATE // NtSetThreadExecutionState\n#define SystemPowerStateNotifyHandler 17 // POWER_STATE_NOTIFY_HANDLER // (kernel-mode only)\n#define ProcessorPowerPolicyAc 18 // PROCESSOR_POWER_POLICY // not implemented\n#define ProcessorPowerPolicyDc 19 // PROCESSOR_POWER_POLICY // not implemented\n#define VerifyProcessorPowerPolicyAc 20 // PROCESSOR_POWER_POLICY // not implemented\n#define VerifyProcessorPowerPolicyDc 21 // PROCESSOR_POWER_POLICY // not implemented\n#define ProcessorPowerPolicyCurrent 22 // PROCESSOR_POWER_POLICY // not implemented\n#define SystemPowerStateLogging 23 // SYSTEM_POWER_STATE_DISABLE_REASON[]\n#define SystemPowerLoggingEntry 24 // SYSTEM_POWER_LOGGING_ENTRY[] // (kernel-mode only)\n#define SetPowerSettingValue 25 // (kernel-mode only)\n#define NotifyUserPowerSetting 26 // not implemented\n#define PowerInformationLevelUnused0 27 // not implemented\n#define SystemMonitorHiberBootPowerOff 28 // NULL (PowerMonitorOff)\n#define SystemVideoState 29 // MONITOR_DISPLAY_STATE\n#define TraceApplicationPowerMessage 30 // (kernel-mode only)\n#define TraceApplicationPowerMessageEnd 31 // (kernel-mode only)\n#define ProcessorPerfStates 32 // (kernel-mode only)\n#define ProcessorIdleStates 33 // PROCESSOR_IDLE_STATES // (kernel-mode only)\n#define ProcessorCap 34 // PROCESSOR_CAP // (kernel-mode only)\n#define SystemWakeSource 35 // out: POWER_WAKE_SOURCE_INFO\n#define SystemHiberFileInformation 36 // out: SYSTEM_HIBERFILE_INFORMATION\n#define TraceServicePowerMessage 37\n#define ProcessorLoad 38 // in: PROCESSOR_LOAD (sets), in: PPROCESSOR_NUMBER (clears)\n#define PowerShutdownNotification 39 // (kernel-mode only)\n#define MonitorCapabilities 40 // (kernel-mode only)\n#define SessionPowerInit 41 // (kernel-mode only)\n#define SessionDisplayState 42 // (kernel-mode only)\n#define PowerRequestCreate 43 // in: COUNTED_REASON_CONTEXT, out: HANDLE\n#define PowerRequestAction 44 // in: POWER_REQUEST_ACTION\n#define GetPowerRequestList 45 // out: POWER_REQUEST_LIST\n#define ProcessorInformationEx 46 // in: USHORT ProcessorGroup, out: PROCESSOR_POWER_INFORMATION\n#define NotifyUserModeLegacyPowerEvent 47 // (kernel-mode only)\n#define GroupPark 48 // (debug-mode boot only)\n#define ProcessorIdleDomains 49 // (kernel-mode only)\n#define WakeTimerList 50 // out: WAKE_TIMER_INFO[]\n#define SystemHiberFileSize 51 // ULONG\n#define ProcessorIdleStatesHv 52 // (kernel-mode only)\n#define ProcessorPerfStatesHv 53 // (kernel-mode only)\n#define ProcessorPerfCapHv 54 // PROCESSOR_PERF_CAP_HV // (kernel-mode only)\n#define ProcessorSetIdle 55 // (debug-mode boot only)\n#define LogicalProcessorIdling 56 // (kernel-mode only)\n#define UserPresence 57 // POWER_USER_PRESENCE // not implemented\n#define PowerSettingNotificationName 58 // in: ? (optional) // out: PWNF_STATE_NAME (RtlSubscribeWnfStateChangeNotification)\n#define GetPowerSettingValue 59 // GUID\n#define IdleResiliency 60 // POWER_IDLE_RESILIENCY\n#define SessionRITState 61 // POWER_SESSION_RIT_STATE\n#define SessionConnectNotification 62 // POWER_SESSION_WINLOGON\n#define SessionPowerCleanup 63\n#define SessionLockState 64 // POWER_SESSION_WINLOGON\n#define SystemHiberbootState 65 // BOOLEAN // fast startup supported\n#define PlatformInformation 66 // BOOLEAN // connected standby supported\n#define PdcInvocation 67 // (kernel-mode only)\n#define MonitorInvocation 68 // (kernel-mode only)\n#define FirmwareTableInformationRegistered 69 // (kernel-mode only)\n#define SetShutdownSelectedTime 70 // in: NULL\n#define SuspendResumeInvocation 71 // (kernel-mode only) // not implemented\n#define PlmPowerRequestCreate 72 // in: COUNTED_REASON_CONTEXT, out: HANDLE\n#define ScreenOff 73 // in: NULL (PowerMonitorOff)\n#define CsDeviceNotification 74 // (kernel-mode only)\n#define PlatformRole 75 // POWER_PLATFORM_ROLE\n#define LastResumePerformance 76 // RESUME_PERFORMANCE\n#define DisplayBurst 77 // in: NULL (PowerMonitorOn)\n#define ExitLatencySamplingPercentage 78 // in: NULL (ClearExitLatencySamplingPercentage), in: ULONG (SetExitLatencySamplingPercentage) (max 100)\n#define RegisterSpmPowerSettings 79 // (kernel-mode only)\n#define PlatformIdleStates 80 // (kernel-mode only)\n#define ProcessorIdleVeto 81 // (kernel-mode only) // deprecated\n#define PlatformIdleVeto 82 // (kernel-mode only) // deprecated\n#define SystemBatteryStatePrecise 83 // SYSTEM_BATTERY_STATE\n#define ThermalEvent 84  // THERMAL_EVENT // PowerReportThermalEvent\n#define PowerRequestActionInternal 85 // POWER_REQUEST_ACTION_INTERNAL\n#define BatteryDeviceState 86\n#define PowerInformationInternal 87 // POWER_INFORMATION_LEVEL_INTERNAL // PopPowerInformationInternal\n#define ThermalStandby 88 // NULL // shutdown with thermal standby as reason.\n#define SystemHiberFileType 89 // ULONG // zero ? reduced : full // powercfg.exe /h /type\n#define PhysicalPowerButtonPress 90 // BOOLEAN\n#define QueryPotentialDripsConstraint 91 // (kernel-mode only)\n#define EnergyTrackerCreate 92\n#define EnergyTrackerQuery 93\n#define UpdateBlackBoxRecorder 94\n#define SessionAllowExternalDmaDevices 95 // POWER_SESSION_ALLOW_EXTERNAL_DMA_DEVICES\n#define SendSuspendResumeNotification 96 // since WIN11\n#define BlackBoxRecorderDirectAccessBuffer 97\n#define SystemPowerSourceState 98 // since 25H2\n#define PowerInformationLevelMaximum 99\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\ntypedef struct _PROCESSOR_POWER_INFORMATION\n{\n    ULONG Number;\n    ULONG MaxMhz;\n    ULONG CurrentMhz;\n    ULONG MhzLimit;\n    ULONG MaxIdleState;\n    ULONG CurrentIdleState;\n} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;\n\ntypedef struct _SYSTEM_POWER_INFORMATION\n{\n    ULONG MaxIdlenessAllowed;\n    ULONG Idleness;\n    ULONG TimeRemaining;\n    UCHAR CoolingMode;\n} SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION;\n\ntypedef struct _SYSTEM_HIBERFILE_INFORMATION\n{\n    ULONG NumberOfMcbPairs;\n    LARGE_INTEGER Mcb[1];\n} SYSTEM_HIBERFILE_INFORMATION, *PSYSTEM_HIBERFILE_INFORMATION;\n\n//typedef enum POWER_USER_PRESENCE_TYPE\n//{\n//    UserNotPresent = 0,\n//    UserPresent = 1,\n//    UserUnknown = 0xff\n//} POWER_USER_PRESENCE_TYPE, *PPOWER_USER_PRESENCE_TYPE;\n\n//typedef struct _POWER_USER_PRESENCE\n//{\n//    POWER_USER_PRESENCE_TYPE PowerUserPresence;\n//} POWER_USER_PRESENCE, *PPOWER_USER_PRESENCE;\n\n//typedef struct _POWER_SESSION_CONNECT\n//{\n//    BOOLEAN Connected;  // TRUE - connected, FALSE - disconnected\n//    BOOLEAN Console;    // TRUE - console, FALSE - TS (not used for Connected = FALSE)\n//} POWER_SESSION_CONNECT, *PPOWER_SESSION_CONNECT;\n\n//typedef struct _POWER_SESSION_TIMEOUTS\n//{\n//    ULONG InputTimeout;\n//    ULONG DisplayTimeout;\n//} POWER_SESSION_TIMEOUTS, *PPOWER_SESSION_TIMEOUTS;\n\n//typedef struct _POWER_SESSION_RIT_STATE\n//{\n//    BOOLEAN Active;  // TRUE - RIT input received, FALSE - RIT timeout\n//    ULONG64 LastInputTime; // last input time held for this session\n//} POWER_SESSION_RIT_STATE, *PPOWER_SESSION_RIT_STATE;\n\n//typedef struct _POWER_SESSION_WINLOGON\n//{\n//    ULONG SessionId; // the Win32k session identifier\n//    BOOLEAN Console; // TRUE - for console session, FALSE - for remote session\n//    BOOLEAN Locked; // TRUE - lock, FALSE - unlock\n//} POWER_SESSION_WINLOGON, *PPOWER_SESSION_WINLOGON;\n\n//typedef struct _POWER_SESSION_ALLOW_EXTERNAL_DMA_DEVICES\n//{\n//    BOOLEAN IsAllowed;\n//} POWER_SESSION_ALLOW_EXTERNAL_DMA_DEVICES, *PPOWER_SESSION_ALLOW_EXTERNAL_DMA_DEVICES;\n//\n//typedef struct _POWER_IDLE_RESILIENCY\n//{\n//    ULONG CoalescingTimeout;\n//    ULONG IdleResiliencyPeriod;\n//} POWER_IDLE_RESILIENCY, *PPOWER_IDLE_RESILIENCY;\n\n//typedef struct _RESUME_PERFORMANCE\n//{\n//    ULONG PostTimeMs;\n//    ULONGLONG TotalResumeTimeMs;\n//    ULONGLONG ResumeCompleteTimestamp;\n//} RESUME_PERFORMANCE, *PRESUME_PERFORMANCE;\n\n//typedef struct _NOTIFY_USER_POWER_SETTING\n//{\n//    GUID Guid;\n//} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;\n\n#define POWER_PERF_SCALE    100\n#define PERF_LEVEL_TO_PERCENT(_x_) ((_x_ * 1000) / (POWER_PERF_SCALE * 10))\n#define PERCENT_TO_PERF_LEVEL(_x_) ((_x_ * POWER_PERF_SCALE * 10) / 1000)\n#define PO_REASON_STATE_STANDBY (PO_REASON_STATE_S1 | \\\n                                 PO_REASON_STATE_S2 | \\\n                                 PO_REASON_STATE_S3)\n\n#define PO_REASON_STATE_ALL     (PO_REASON_STATE_STANDBY | \\\n                                 PO_REASON_STATE_S4 | \\\n                                 PO_REASON_STATE_S4FIRM)\n\ntypedef struct _SYSTEM_POWER_LOGGING_ENTRY\n{\n    ULONG Reason;\n    ULONG States;\n} SYSTEM_POWER_LOGGING_ENTRY, *PSYSTEM_POWER_LOGGING_ENTRY;\n\ntypedef enum _POWER_STATE_DISABLED_TYPE\n{\n    PoDisabledStateSleeping1 = 0,\n    PoDisabledStateSleeping2 = 1,\n    PoDisabledStateSleeping3 = 2,\n    PoDisabledStateSleeping4 = 3,\n    PoDisabledStateSleeping0Idle = 4,\n    PoDisabledStateReserved5 = 5,\n    PoDisabledStateSleeping4Firmware = 6,\n    PoDisabledStateMaximum = 7\n} POWER_STATE_DISABLED_TYPE, *PPOWER_STATE_DISABLED_TYPE;\n\n#define POWER_STATE_DISABLED_TYPE_MAX  8\n\n_Struct_size_bytes_(sizeof(SYSTEM_POWER_STATE_DISABLE_REASON) + PowerReasonLength)\ntypedef struct _SYSTEM_POWER_STATE_DISABLE_REASON\n{\n    BOOLEAN AffectedState[POWER_STATE_DISABLED_TYPE_MAX];\n    ULONG PowerReasonCode;\n    ULONG PowerReasonLength;\n    //UCHAR PowerReasonInfo[ANYSIZE_ARRAY];\n} SYSTEM_POWER_STATE_DISABLE_REASON, *PSYSTEM_POWER_STATE_DISABLE_REASON;\n\n// Reason Context\n#define POWER_REQUEST_CONTEXT_NOT_SPECIFIED DIAGNOSTIC_REASON_NOT_SPECIFIED\n\n// wdm\ntypedef struct _COUNTED_REASON_CONTEXT\n{\n    ULONG Version;\n    ULONG Flags;\n    union\n    {\n        struct\n        {\n            UNICODE_STRING ResourceFileName;\n            USHORT ResourceReasonId;\n            ULONG StringCount;\n            _Field_size_(StringCount) PUNICODE_STRING ReasonStrings;\n        };\n        UNICODE_STRING SimpleString;\n    };\n} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;\n\ntypedef enum _POWER_REQUEST_TYPE_INTERNAL // POWER_REQUEST_TYPE\n{\n    PowerRequestDisplayRequiredInternal,\n    PowerRequestSystemRequiredInternal,\n    PowerRequestAwayModeRequiredInternal,\n    PowerRequestExecutionRequiredInternal, // Windows 8+\n    PowerRequestPerfBoostRequiredInternal, // Windows 8+\n    PowerRequestActiveLockScreenInternal, // Windows 10 RS1+ (reserved on Windows 8)\n    // Values 6 and 7 are reserved for Windows 8 only\n    PowerRequestInternalInvalid,\n    PowerRequestInternalUnknown,\n    PowerRequestFullScreenVideoRequired  // Windows 8 only\n} POWER_REQUEST_TYPE_INTERNAL;\n\ntypedef struct _POWER_REQUEST_ACTION\n{\n    HANDLE PowerRequestHandle;\n    POWER_REQUEST_TYPE_INTERNAL RequestType;\n    BOOLEAN SetAction;\n    HANDLE ProcessHandle; // Windows 8+ and only for requests created via PlmPowerRequestCreate\n} POWER_REQUEST_ACTION, *PPOWER_REQUEST_ACTION;\n\ntypedef union _POWER_STATE\n{\n    SYSTEM_POWER_STATE SystemState;\n    DEVICE_POWER_STATE DeviceState;\n} POWER_STATE, *PPOWER_STATE;\n\ntypedef enum _POWER_STATE_TYPE\n{\n    SystemPowerState = 0,\n    DevicePowerState\n} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;\n\n// wdm\ntypedef struct _SYSTEM_POWER_STATE_CONTEXT\n{\n    union\n    {\n        struct\n        {\n            ULONG Reserved1 : 8;\n            ULONG TargetSystemState : 4;\n            ULONG EffectiveSystemState : 4;\n            ULONG CurrentSystemState : 4;\n            ULONG IgnoreHibernationPath : 1;\n            ULONG PseudoTransition : 1;\n            ULONG KernelSoftReboot : 1;\n            ULONG DirectedDripsTransition : 1;\n            ULONG Reserved2 : 8;\n        };\n        ULONG ContextAsUlong;\n    };\n} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;\n\ntypedef enum _REQUESTER_TYPE\n{\n    KernelRequester = 0,\n    UserProcessRequester = 1,\n    UserSharedServiceRequester = 2\n} REQUESTER_TYPE;\n\ntypedef struct _COUNTED_REASON_CONTEXT_RELATIVE\n{\n    ULONG Flags;\n    union\n    {\n        struct\n        {\n            SIZE_T ResourceFileNameOffset;\n            USHORT ResourceReasonId;\n            ULONG StringCount;\n            SIZE_T SubstitutionStringsOffset;\n        } DUMMYSTRUCTNAME;\n        SIZE_T SimpleStringOffset;\n    } DUMMYUNIONNAME;\n} COUNTED_REASON_CONTEXT_RELATIVE, *PCOUNTED_REASON_CONTEXT_RELATIVE;\n\ntypedef struct _DIAGNOSTIC_BUFFER\n{\n    SIZE_T Size;\n    REQUESTER_TYPE CallerType;\n    union\n    {\n        struct\n        {\n            SIZE_T ProcessImageNameOffset; // PWSTR\n            ULONG ProcessId;\n            ULONG ServiceTag;\n        } DUMMYSTRUCTNAME;\n        struct\n        {\n            SIZE_T DeviceDescriptionOffset; // PWSTR\n            SIZE_T DevicePathOffset; // PWSTR\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    SIZE_T ReasonOffset; // PCOUNTED_REASON_CONTEXT_RELATIVE\n} DIAGNOSTIC_BUFFER, *PDIAGNOSTIC_BUFFER;\n\ntypedef struct _WAKE_TIMER_INFO\n{\n    SIZE_T OffsetToNext;\n    LARGE_INTEGER DueTime;\n    ULONG Period;\n    DIAGNOSTIC_BUFFER ReasonContext;\n} WAKE_TIMER_INFO, *PWAKE_TIMER_INFO;\n\n// rev\ntypedef struct _PROCESSOR_PERF_CAP_HV\n{\n    ULONG Version;\n    ULONG InitialApicId;\n    ULONG Ppc;\n    ULONG Tpc;\n    ULONG ThermalCap;\n} PROCESSOR_PERF_CAP_HV, *PPROCESSOR_PERF_CAP_HV;\n\ntypedef struct PROCESSOR_IDLE_TIMES\n{\n    ULONG64 StartTime;\n    ULONG64 EndTime;\n    ULONG Reserved[4];\n} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES;\n\n_Function_class_(PROCESSOR_IDLE_HANDLER)\ntypedef NTSTATUS (FASTCALL PROCESSOR_IDLE_HANDLER)(\n    _In_ ULONG_PTR Context,\n    _Inout_ PPROCESSOR_IDLE_TIMES IdleTimes\n    );\n\ntypedef PROCESSOR_IDLE_HANDLER *PPROCESSOR_IDLE_HANDLER;\n\n#define PROCESSOR_STATE_TYPE_PERFORMANCE    0x1\n#define PROCESSOR_STATE_TYPE_THROTTLE       0x2\n\n#define IDLE_STATE_FLAGS_C1_HLT     0x01        // describes C1 only\n#define IDLE_STATE_FLAGS_C1_IO_HLT  0x02        // describes C1 only\n#define IDLE_STATE_FLAGS_IO         0x04        // describes C2 and C3 only\n#define IDLE_STATE_FLAGS_MWAIT      0x08        // describes C1, C2, C3, C4, ...\n\ntypedef struct _PROCESSOR_IDLE_STATE\n{\n    UCHAR StateType;\n    ULONG StateFlags;\n    ULONG HardwareLatency;\n    ULONG Power;\n    ULONG_PTR Context;\n    PPROCESSOR_IDLE_HANDLER Handler;\n} PROCESSOR_IDLE_STATE, *PPROCESSOR_IDLE_STATE;\n\ntypedef struct _PROCESSOR_IDLE_STATES\n{\n    ULONG Size;\n    ULONG Revision;\n    ULONG Count;\n    ULONG Type;\n    KAFFINITY TargetProcessors;\n    PROCESSOR_IDLE_STATE State[ANYSIZE_ARRAY];\n} PROCESSOR_IDLE_STATES, *PPROCESSOR_IDLE_STATES;\n//\n//#define PROCESSOR_IDLESTATE_POLICY_COUNT 0x3\n//\n//typedef struct\n//{\n//    ULONG TimeCheck;\n//    UCHAR DemotePercent;\n//    UCHAR PromotePercent;\n//    UCHAR Spare[2];\n//} PROCESSOR_IDLESTATE_INFO, *PPROCESSOR_IDLESTATE_INFO;\n//\n//typedef struct\n//{\n//    USHORT Revision;\n//    union\n//    {\n//        USHORT AsUSHORT;\n//        struct\n//        {\n//            USHORT AllowScaling : 1;\n//            USHORT Disabled : 1;\n//            USHORT Reserved : 14;\n//        } DUMMYSTRUCTNAME;\n//    } Flags;\n//\n//    ULONG PolicyCount;\n//    PROCESSOR_IDLESTATE_INFO Policy[PROCESSOR_IDLESTATE_POLICY_COUNT];\n//} PROCESSOR_IDLESTATE_POLICY, *PPROCESSOR_IDLESTATE_POLICY;\n\n// rev\ntypedef struct _PROCESSOR_LOAD\n{\n    PROCESSOR_NUMBER ProcessorNumber;\n    UCHAR BusyPercentage;\n    UCHAR FrequencyPercentage;\n    USHORT Padding;\n} PROCESSOR_LOAD, *PPROCESSOR_LOAD;\n\n// rev\ntypedef struct _PROCESSOR_CAP\n{\n    ULONG Version;\n    PROCESSOR_NUMBER ProcessorNumber;\n    ULONG PlatformCap;\n    ULONG ThermalCap;\n    ULONG LimitReasons;\n} PROCESSOR_CAP, *PPROCESSOR_CAP;\n\ntypedef struct _PO_WAKE_SOURCE_INFO\n{\n    ULONG Count;\n    ULONG Offsets[ANYSIZE_ARRAY]; // POWER_WAKE_SOURCE_HEADER, POWER_WAKE_SOURCE_INTERNAL, POWER_WAKE_SOURCE_TIMER, POWER_WAKE_SOURCE_FIXED\n} PO_WAKE_SOURCE_INFO, *PPO_WAKE_SOURCE_INFO;\n\ntypedef struct _PO_WAKE_SOURCE_HISTORY\n{\n    ULONG Count;\n    ULONG Offsets[ANYSIZE_ARRAY]; // POWER_WAKE_SOURCE_HEADER, POWER_WAKE_SOURCE_INTERNAL, POWER_WAKE_SOURCE_TIMER, POWER_WAKE_SOURCE_FIXED\n} PO_WAKE_SOURCE_HISTORY, *PPO_WAKE_SOURCE_HISTORY;\n\ntypedef enum _PO_WAKE_SOURCE_TYPE\n{\n    DeviceWakeSourceType = 0,\n    FixedWakeSourceType = 1,\n    TimerWakeSourceType = 2,\n    TimerPresumedWakeSourceType = 3,\n    InternalWakeSourceType = 4\n} PO_WAKE_SOURCE_TYPE, *PPO_WAKE_SOURCE_TYPE;\n\ntypedef enum _PO_INTERNAL_WAKE_SOURCE_TYPE\n{\n    InternalWakeSourceDozeToHibernate = 0,\n    InternalWakeSourcePredictedUserPresence = 1\n} PO_INTERNAL_WAKE_SOURCE_TYPE;\n\ntypedef enum _PO_FIXED_WAKE_SOURCE_TYPE\n{\n    FixedWakeSourcePowerButton = 0,\n    FixedWakeSourceSleepButton = 1,\n    FixedWakeSourceRtc = 2,\n    FixedWakeSourceDozeToHibernate = 3\n} PO_FIXED_WAKE_SOURCE_TYPE, *PPO_FIXED_WAKE_SOURCE_TYPE;\n\ntypedef struct _PO_WAKE_SOURCE_HEADER\n{\n    PO_WAKE_SOURCE_TYPE Type;\n    ULONG Size;\n} PO_WAKE_SOURCE_HEADER, *PPO_WAKE_SOURCE_HEADER;\n\ntypedef struct _PO_WAKE_SOURCE_DEVICE\n{\n    PO_WAKE_SOURCE_HEADER Header;\n    WCHAR InstancePath[ANYSIZE_ARRAY];\n} PO_WAKE_SOURCE_DEVICE, *PPO_WAKE_SOURCE_DEVICE;\n\ntypedef struct _PO_WAKE_SOURCE_FIXED\n{\n    PO_WAKE_SOURCE_HEADER Header;\n    PO_FIXED_WAKE_SOURCE_TYPE FixedWakeSourceType;\n} PO_WAKE_SOURCE_FIXED, *PPO_WAKE_SOURCE_FIXED;\n\ntypedef struct _PO_WAKE_SOURCE_INTERNAL\n{\n    PO_WAKE_SOURCE_HEADER Header;\n    PO_INTERNAL_WAKE_SOURCE_TYPE InternalWakeSourceType;\n} PO_WAKE_SOURCE_INTERNAL, *PPO_WAKE_SOURCE_INTERNAL;\n\ntypedef struct _PO_WAKE_SOURCE_TIMER\n{\n    PO_WAKE_SOURCE_HEADER Header;\n    DIAGNOSTIC_BUFFER Reason;\n} PO_WAKE_SOURCE_TIMER, *PPO_WAKE_SOURCE_TIMER;\n\n// The number of supported request types per version\n#define POWER_REQUEST_SUPPORTED_TYPES_V1 3 // Windows 7\n#define POWER_REQUEST_SUPPORTED_TYPES_V2 9 // Windows 8\n#define POWER_REQUEST_SUPPORTED_TYPES_V3 5 // Windows 8.1 and Windows 10 TH1-TH2\n#define POWER_REQUEST_SUPPORTED_TYPES_V4 6 // Windows 10 RS1+\n\ntypedef struct _POWER_REQUEST\n{\n    union\n    {\n        struct\n        {\n            ULONG SupportedRequestMask;\n            ULONG PowerRequestCount[POWER_REQUEST_SUPPORTED_TYPES_V1];\n            DIAGNOSTIC_BUFFER DiagnosticBuffer;\n        } V1;\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n        struct\n        {\n            ULONG SupportedRequestMask;\n            ULONG PowerRequestCount[POWER_REQUEST_SUPPORTED_TYPES_V2];\n            DIAGNOSTIC_BUFFER DiagnosticBuffer;\n        } V2;\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n        struct\n        {\n            ULONG SupportedRequestMask;\n            ULONG PowerRequestCount[POWER_REQUEST_SUPPORTED_TYPES_V3];\n            DIAGNOSTIC_BUFFER DiagnosticBuffer;\n        } V3;\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n        struct\n        {\n            ULONG SupportedRequestMask;\n            ULONG PowerRequestCount[POWER_REQUEST_SUPPORTED_TYPES_V4];\n            DIAGNOSTIC_BUFFER DiagnosticBuffer;\n        } V4;\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n    };\n} POWER_REQUEST, *PPOWER_REQUEST;\n\ntypedef struct _POWER_REQUEST_LIST\n{\n    ULONG_PTR Count;\n    ULONG_PTR PowerRequestOffsets[ANYSIZE_ARRAY]; // PPOWER_REQUEST\n} POWER_REQUEST_LIST, *PPOWER_REQUEST_LIST;\n\ntypedef enum _POWER_STATE_HANDLER_TYPE\n{\n    PowerStateSleeping1 = 0,\n    PowerStateSleeping2 = 1,\n    PowerStateSleeping3 = 2,\n    PowerStateSleeping4 = 3,\n    PowerStateShutdownOff = 4,\n    PowerStateShutdownReset = 5,\n    PowerStateSleeping4Firmware = 6,\n    PowerStateMaximum = 7\n} POWER_STATE_HANDLER_TYPE, *PPOWER_STATE_HANDLER_TYPE;\n\ntypedef NTSTATUS (NTAPI *PENTER_STATE_SYSTEM_HANDLER)(\n    _In_ PVOID SystemContext\n    );\n\ntypedef NTSTATUS (NTAPI *PENTER_STATE_HANDLER)(\n    _In_ PVOID Context,\n    _In_opt_ PENTER_STATE_SYSTEM_HANDLER SystemHandler,\n    _In_ PVOID SystemContext,\n    _In_ LONG NumberProcessors,\n    _In_ LONG volatile *Number\n    );\n\ntypedef struct _POWER_STATE_HANDLER\n{\n    POWER_STATE_HANDLER_TYPE Type;\n    BOOLEAN RtcWake;\n    UCHAR Spare[3];\n    PENTER_STATE_HANDLER Handler;\n    PVOID Context;\n} POWER_STATE_HANDLER, *PPOWER_STATE_HANDLER;\n\ntypedef NTSTATUS (NTAPI *PENTER_STATE_NOTIFY_HANDLER)(\n    _In_ POWER_STATE_HANDLER_TYPE State,\n    _In_ PVOID Context,\n    _In_ BOOLEAN Entering\n    );\n\ntypedef struct _POWER_STATE_NOTIFY_HANDLER\n{\n    PENTER_STATE_NOTIFY_HANDLER Handler;\n    PVOID Context;\n} POWER_STATE_NOTIFY_HANDLER, *PPOWER_STATE_NOTIFY_HANDLER;\n\ntypedef struct _POWER_REQUEST_ACTION_INTERNAL\n{\n    PVOID PowerRequestPointer;\n    POWER_REQUEST_TYPE_INTERNAL RequestType;\n    BOOLEAN SetAction;\n} POWER_REQUEST_ACTION_INTERNAL, *PPOWER_REQUEST_ACTION_INTERNAL;\n\ntypedef enum _POWER_INFORMATION_LEVEL_INTERNAL\n{\n    PowerInternalAcpiInterfaceRegister,\n    PowerInternalS0LowPowerIdleInfo, // POWER_S0_LOW_POWER_IDLE_INFO\n    PowerInternalReapplyBrightnessSettings,\n    PowerInternalUserAbsencePrediction, // POWER_USER_ABSENCE_PREDICTION\n    PowerInternalUserAbsencePredictionCapability, // POWER_USER_ABSENCE_PREDICTION_CAPABILITY\n    PowerInternalPoProcessorLatencyHint, // POWER_PROCESSOR_LATENCY_HINT\n    PowerInternalStandbyNetworkRequest, // POWER_STANDBY_NETWORK_REQUEST (requires PopNetBIServiceSid)\n    PowerInternalDirtyTransitionInformation, // out: BOOLEAN\n    PowerInternalSetBackgroundTaskState, // POWER_SET_BACKGROUND_TASK_STATE\n    PowerInternalTtmOpenTerminal, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmCreateTerminal, // (requires SeShutdownPrivilege and terminalPowerManagement capability) // 10\n    PowerInternalTtmEvacuateDevices, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmCreateTerminalEventQueue, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmGetTerminalEvent, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmSetDefaultDeviceAssignment, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmAssignDevice, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmSetDisplayState, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalTtmSetDisplayTimeouts, // (requires SeShutdownPrivilege and terminalPowerManagement capability)\n    PowerInternalBootSessionStandbyActivationInformation, // out: POWER_BOOT_SESSION_STANDBY_ACTIVATION_INFO\n    PowerInternalSessionPowerState, // in: POWER_SESSION_POWER_STATE\n    PowerInternalSessionTerminalInput, // 20\n    PowerInternalSetWatchdog,\n    PowerInternalPhysicalPowerButtonPressInfoAtBoot,\n    PowerInternalExternalMonitorConnected,\n    PowerInternalHighPrecisionBrightnessSettings,\n    PowerInternalWinrtScreenToggle,\n    PowerInternalPpmQosDisable,\n    PowerInternalTransitionCheckpoint,\n    PowerInternalInputControllerState,\n    PowerInternalFirmwareResetReason,\n    PowerInternalPpmSchedulerQosSupport, // out: POWER_INTERNAL_PROCESSOR_QOS_SUPPORT // 30\n    PowerInternalBootStatGet,\n    PowerInternalBootStatSet,\n    PowerInternalCallHasNotReturnedWatchdog,\n    PowerInternalBootStatCheckIntegrity,\n    PowerInternalBootStatRestoreDefaults, // in: void\n    PowerInternalHostEsStateUpdate, // in: POWER_INTERNAL_HOST_ENERGY_SAVER_STATE\n    PowerInternalGetPowerActionState, // out: ULONG\n    PowerInternalBootStatUnlock,\n    PowerInternalWakeOnVoiceState,\n    PowerInternalDeepSleepBlock, // 40\n    PowerInternalIsPoFxDevice,\n    PowerInternalPowerTransitionExtensionAtBoot,\n    PowerInternalProcessorBrandedFrequency, // in: POWER_INTERNAL_PROCESSOR_BRANDED_FREQENCY_INPUT, out: POWER_INTERNAL_PROCESSOR_BRANDED_FREQENCY_OUTPUT\n    PowerInternalTimeBrokerExpirationReason,\n    PowerInternalNotifyUserShutdownStatus,\n    PowerInternalPowerRequestTerminalCoreWindow,\n    PowerInternalProcessorIdleVeto, // PROCESSOR_IDLE_VETO\n    PowerInternalPlatformIdleVeto, // PLATFORM_IDLE_VETO\n    PowerInternalIsLongPowerButtonBugcheckEnabled,\n    PowerInternalAutoChkCausedReboot, // 50\n    PowerInternalSetWakeAlarmOverride,\n\n    PowerInternalDirectedFxAddTestDevice = 53,\n    PowerInternalDirectedFxRemoveTestDevice,\n\n    PowerInternalDirectedFxSetMode = 56,\n    PowerInternalRegisterPowerPlane,\n    PowerInternalSetDirectedDripsFlags,\n    PowerInternalClearDirectedDripsFlags,\n    PowerInternalRetrieveHiberFileResumeContext, // 60\n    PowerInternalReadHiberFilePage,\n    PowerInternalLastBootSucceeded, // out: BOOLEAN\n    PowerInternalQuerySleepStudyHelperRoutineBlock,\n    PowerInternalDirectedDripsQueryCapabilities,\n    PowerInternalClearConstraints,\n    PowerInternalSoftParkVelocityEnabled,\n    PowerInternalQueryIntelPepCapabilities,\n    PowerInternalGetSystemIdleLoopEnablement, // since WIN11\n    PowerInternalGetVmPerfControlSupport,\n    PowerInternalGetVmPerfControlConfig, // 70\n    PowerInternalSleepDetailedDiagUpdate,\n    PowerInternalProcessorClassFrequencyBandsStats,\n    PowerInternalHostGlobalUserPresenceStateUpdate,\n    PowerInternalCpuNodeIdleIntervalStats,\n    PowerInternalClassIdleIntervalStats,\n    PowerInternalCpuNodeConcurrencyStats,\n    PowerInternalClassConcurrencyStats,\n    PowerInternalQueryProcMeasurementCapabilities, // PPROCESSOR_QUERY_MEASUREMENT_CAPABILITIES\n    PowerInternalQueryProcMeasurementValues, // PROCESSOR_QUERY_MEASUREMENT_VALUES\n    PowerInternalPrepareForSystemInitiatedReboot, // 80\n    PowerInternalGetAdaptiveSessionState,\n    PowerInternalSetConsoleLockedState,\n    PowerInternalOverrideSystemInitiatedRebootState,\n    PowerInternalFanImpactStats,\n    PowerInternalFanRpmBuckets,\n    PowerInternalPowerBootAppDiagInfo, // out: POWER_INTERNAL_BOOTAPP_DIAGNOSTIC\n    PowerInternalUnregisterShutdownNotification, // since 22H1\n    PowerInternalManageTransitionStateRecord,\n    PowerInternalGetAcpiTimeAndAlarmCapabilities, // since 22H2\n    PowerInternalSuspendResumeRequest,\n    PowerInternalEnergyEstimationInfo, // since 23H2\n    PowerInternalProvSocIdentifierOperation, // since 24H2\n    PowerInternalGetVmPerfPrioritySupport,\n    PowerInternalGetVmPerfPriorityConfig,\n    PowerInternalNotifyWin32kPowerRequestQueued,\n    PowerInternalNotifyWin32kPowerRequestCompleted,\n    PowerInformationInternalMaximum\n} POWER_INFORMATION_LEVEL_INTERNAL;\n\ntypedef enum _POWER_S0_DISCONNECTED_REASON\n{\n    PoS0DisconnectedReasonNone,\n    PoS0DisconnectedReasonNonCompliantNic,\n    PoS0DisconnectedReasonSettingPolicy,\n    PoS0DisconnectedReasonEnforceDsPolicy,\n    PoS0DisconnectedReasonCsChecksFailed,\n    PoS0DisconnectedReasonSmartStandby,\n    PoS0DisconnectedReasonMaximum\n} POWER_S0_DISCONNECTED_REASON;\n\ntypedef struct _POWER_S0_LOW_POWER_IDLE_INFO\n{\n    POWER_S0_DISCONNECTED_REASON DisconnectedReason;\n    union\n    {\n        BOOLEAN Storage : 1;\n        BOOLEAN WiFi : 1;\n        BOOLEAN Mbn : 1;\n        BOOLEAN Ethernet : 1;\n        BOOLEAN Reserved : 4;\n        UCHAR AsUCHAR;\n    } CsDeviceCompliance;\n    union\n    {\n        BOOLEAN DisconnectInStandby : 1;\n        BOOLEAN EnforceDs : 1;\n        BOOLEAN Reserved : 6;\n        UCHAR AsUCHAR;\n    } Policy;\n} POWER_S0_LOW_POWER_IDLE_INFO, *PPOWER_S0_LOW_POWER_IDLE_INFO;\n\ntypedef struct _POWER_INFORMATION_INTERNAL_HEADER\n{\n    POWER_INFORMATION_LEVEL_INTERNAL InternalType;\n    ULONG Version;\n} POWER_INFORMATION_INTERNAL_HEADER, *PPOWER_INFORMATION_INTERNAL_HEADER;\n\ntypedef struct _POWER_USER_ABSENCE_PREDICTION\n{\n    POWER_INFORMATION_INTERNAL_HEADER Header;\n    LARGE_INTEGER ReturnTime;\n} POWER_USER_ABSENCE_PREDICTION, *PPOWER_USER_ABSENCE_PREDICTION;\n\ntypedef struct _POWER_USER_ABSENCE_PREDICTION_CAPABILITY\n{\n    BOOLEAN AbsencePredictionCapability;\n} POWER_USER_ABSENCE_PREDICTION_CAPABILITY, *PPOWER_USER_ABSENCE_PREDICTION_CAPABILITY;\n\n// rev\ntypedef struct _POWER_PROCESSOR_LATENCY_HINT\n{\n    POWER_INFORMATION_INTERNAL_HEADER PowerInformationInternalHeader;\n    ULONG Type;\n} POWER_PROCESSOR_LATENCY_HINT, *PPOWER_PROCESSOR_LATENCY_HINT;\n\n// rev\ntypedef struct _POWER_STANDBY_NETWORK_REQUEST\n{\n    POWER_INFORMATION_INTERNAL_HEADER PowerInformationInternalHeader;\n    BOOLEAN Active;\n} POWER_STANDBY_NETWORK_REQUEST, *PPOWER_STANDBY_NETWORK_REQUEST;\n\n// rev\ntypedef struct _POWER_SET_BACKGROUND_TASK_STATE\n{\n    POWER_INFORMATION_INTERNAL_HEADER PowerInformationInternalHeader;\n    BOOLEAN Engaged;\n} POWER_SET_BACKGROUND_TASK_STATE, *PPOWER_SET_BACKGROUND_TASK_STATE;\n\n// rev\ntypedef struct _POWER_BOOT_SESSION_STANDBY_ACTIVATION_INFO\n{\n    ULONG StandbyTotalTime;\n    ULONG DripsTotalTime;\n    ULONG ActivatorClientTotalActiveTime;\n    ULONG PerActivatorClientTotalActiveTime[98];\n} POWER_BOOT_SESSION_STANDBY_ACTIVATION_INFO, *PPOWER_BOOT_SESSION_STANDBY_ACTIVATION_INFO;\n\n// rev\ntypedef struct _POWER_SESSION_POWER_STATE\n{\n    POWER_INFORMATION_INTERNAL_HEADER Header;\n    ULONG SessionId;\n    BOOLEAN On;\n    BOOLEAN IsConsole;\n    POWER_MONITOR_REQUEST_REASON RequestReason;\n} POWER_SESSION_POWER_STATE, *PPOWER_SESSION_POWER_STATE;\n\n// rev\ntypedef struct _POWER_INTERNAL_PROCESSOR_QOS_SUPPORT\n{\n    BOOLEAN QosSupportedAndConfigured;\n    BOOLEAN SchedulerDirectedPerfStatesSupported;\n    BOOLEAN QosGroupPolicyDisable;\n} POWER_INTERNAL_PROCESSOR_QOS_SUPPORT, *PPOWER_INTERNAL_PROCESSOR_QOS_SUPPORT;\n\n// rev\ntypedef struct _POWER_INTERNAL_HOST_ENERGY_SAVER_STATE\n{\n    POWER_INFORMATION_INTERNAL_HEADER Header;\n    BOOLEAN EsEnabledOnHost;\n} POWER_INTERNAL_HOST_ENERGY_SAVER_STATE, *PPOWER_INTERNAL_HOST_ENERGY_SAVER_STATE;\n\n// rev\ntypedef struct _POWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_INPUT\n{\n    POWER_INFORMATION_LEVEL_INTERNAL InternalType;\n    PROCESSOR_NUMBER ProcessorNumber; // ULONG_MAX\n} POWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_INPUT, *PPOWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_INPUT;\n\n#define POWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_VERSION 1\n\n// rev\ntypedef struct _POWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_OUTPUT\n{\n    ULONG Version;\n    ULONG NominalFrequency; // if (Domain) Prcb->PowerState.CheckContext.Domain.NominalFrequency else Prcb->MHz\n} POWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_OUTPUT, *PPOWER_INTERNAL_PROCESSOR_BRANDED_FREQUENCY_OUTPUT;\n\n// rev\ntypedef struct _PROCESSOR_IDLE_VETO\n{\n    ULONG Version;\n    PROCESSOR_NUMBER ProcessorNumber;\n    ULONG StateIndex;\n    ULONG VetoReason;\n    UCHAR Increment;\n} PROCESSOR_IDLE_VETO, *PPROCESSOR_IDLE_VETO;\n\n// rev\ntypedef struct _PLATFORM_IDLE_VETO\n{\n    ULONG Version;\n    ULONG StateIndex;\n    ULONG VetoReason;\n    UCHAR Increment;\n} PLATFORM_IDLE_VETO, *PPLATFORM_IDLE_VETO;\n\n// rev\ntypedef struct _POWER_INTERNAL_BOOTAPP_DIAGNOSTIC\n{\n    ULONG BootAppErrorDiagCode; // bcdedit last status\n    ULONG BootAppFailureStatus; // bcdedit last status\n} POWER_INTERNAL_BOOTAPP_DIAGNOSTIC, *PPOWER_INTERNAL_BOOTAPP_DIAGNOSTIC;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * The NtPowerInformation routine sets or retrieves system power information.\n *\n * @param InformationLevel Specifies the requested information level, which indicates the specific power information to be set or retrieved.\n * @param InputBuffer Optional pointer to a caller-allocated input buffer.\n * @param InputBufferLength Size, in bytes, of the buffer at InputBuffer.\n * @param OutputBuffer Optional pointer to an output buffer. The type depends on the InformationLevel requested.\n * @param OutputBufferLength Size, in bytes, of the output buffer.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPowerInformation(\n    _In_ POWER_INFORMATION_LEVEL InformationLevel,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * Enables an application to inform the system that it is in use,\n * thereby preventing the system from entering sleep or turning off the display while the application is running.\n *\n * @param NewFlags New execution state flags.\n * @param PreviousFlags Pointer to receive the previous execution state flags.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetThreadExecutionState(\n    _In_ EXECUTION_STATE NewFlags, // ES_* flags\n    _Out_ EXECUTION_STATE *PreviousFlags\n    );\n\n#if (PHNT_VERSION < PHNT_WINDOWS_7)\n/**\n * Requests the system resume latency.\n *\n * @param latency The desired latency time.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRequestWakeupLatency(\n    _In_ LATENCY_TIME latency\n    );\n#endif // (PHNT_VERSION < PHNT_WINDOWS_7)\n\n/**\n * Initiates a power action of the current system.\n *\n * @param SystemAction The system power action.\n * @param LightestSystemState The lightest system power state.\n * @param Flags Flags for the power action.\n * @param Asynchronous Whether the action is asynchronous.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtInitiatePowerAction(\n    _In_ POWER_ACTION SystemAction,\n    _In_ SYSTEM_POWER_STATE LightestSystemState,\n    _In_ ULONG Flags, // POWER_ACTION_* flags\n    _In_ BOOLEAN Asynchronous\n    );\n\n/**\n * Initiates a power action of the current system. Depending on the Flags parameter, the function either\n * suspends operation immediately or requests permission from all applications and device drivers before doing so.\n *\n * @param SystemAction The system power action.\n * @param LightestSystemState The lightest system power state.\n * @param Flags Flags for the power action.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetSystemPowerState(\n    _In_ POWER_ACTION SystemAction,\n    _In_ SYSTEM_POWER_STATE LightestSystemState,\n    _In_ ULONG Flags // POWER_ACTION_* flags\n    );\n\n/**\n * Retrieves the current power state of the specified device. This function cannot be used to query the power state of a display device.\n *\n * @param Device A handle to an object on the device, such as a file or socket, or a handle to the device itself.\n * @param State A pointer to the variable that receives the power state.\n * @return Successful or errant status.\n * @remarks An application can use NtGetDevicePowerState to determine whether a device is in the working state or a low-power state.\n * If the device is in a low-power state, accessing the device may cause it to either queue or fail any I/O requests, or transition the device into the working state.\n * The exact behavior depends on the implementation of the device.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetDevicePowerState(\n    _In_ HANDLE Device,\n    _Out_ PDEVICE_POWER_STATE State\n    );\n\n/**\n * Checks if the system resume is automatic.\n *\n * @return BOOLEAN TRUE if the system resume is automatic, FALSE otherwise.\n */\nNTSYSCALLAPI\nBOOLEAN\nNTAPI\nNtIsSystemResumeAutomatic(\n    VOID\n    );\n\n#endif // _NTPOAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntpsapi.h",
    "content": "/*\n * Process support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTPSAPI_H\n#define _NTPSAPI_H\n\n#include \"ntpebteb.h\"\n\n//\n// Process Object Specific Access Rights\n//\n\n#ifndef PROCESS_TERMINATE\n#define PROCESS_TERMINATE 0x0001\n#endif\n#ifndef PROCESS_CREATE_THREAD\n#define PROCESS_CREATE_THREAD 0x0002\n#endif\n#ifndef PROCESS_SET_SESSIONID\n#define PROCESS_SET_SESSIONID 0x0004\n#endif\n#ifndef PROCESS_VM_OPERATION\n#define PROCESS_VM_OPERATION 0x0008\n#endif\n#ifndef PROCESS_VM_READ\n#define PROCESS_VM_READ 0x0010\n#endif\n#ifndef PROCESS_VM_WRITE\n#define PROCESS_VM_WRITE 0x0020\n#endif\n#ifndef PROCESS_DUP_HANDLE\n#define PROCESS_DUP_HANDLE 0x0040\n#endif\n#ifndef PROCESS_CREATE_PROCESS\n#define PROCESS_CREATE_PROCESS 0x0080\n#endif\n#ifndef PROCESS_SET_QUOTA\n#define PROCESS_SET_QUOTA 0x0100\n#endif\n#ifndef PROCESS_SET_INFORMATION\n#define PROCESS_SET_INFORMATION 0x0200\n#endif\n#ifndef PROCESS_QUERY_INFORMATION\n#define PROCESS_QUERY_INFORMATION 0x0400\n#endif\n#ifndef PROCESS_SET_PORT\n#define PROCESS_SET_PORT 0x0800\n#endif\n#ifndef PROCESS_SUSPEND_RESUME\n#define PROCESS_SUSPEND_RESUME 0x0800\n#endif\n#ifndef PROCESS_QUERY_LIMITED_INFORMATION\n#define PROCESS_QUERY_LIMITED_INFORMATION 0x1000\n#endif\n#ifndef PROCESS_SET_LIMITED_INFORMATION\n#define PROCESS_SET_LIMITED_INFORMATION 0x2000\n#endif\n#ifndef PROCESS_ALL_ACCESS\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | SPECIFIC_RIGHTS_ALL)\n#else\n#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)\n#endif\n#endif\n\n//\n// Thread Object Specific Access Rights\n//\n\n#ifndef THREAD_TERMINATE\n#define THREAD_TERMINATE 0x0001\n#endif\n#ifndef THREAD_SUSPEND_RESUME\n#define THREAD_SUSPEND_RESUME 0x0002\n#endif\n#ifndef THREAD_ALERT\n#define THREAD_ALERT 0x0004\n#endif\n#ifndef THREAD_GET_CONTEXT\n#define THREAD_GET_CONTEXT 0x0008\n#endif\n#ifndef THREAD_SET_CONTEXT\n#define THREAD_SET_CONTEXT 0x0010\n#endif\n#ifndef THREAD_SET_INFORMATION\n#define THREAD_SET_INFORMATION 0x0020\n#endif\n#ifndef THREAD_QUERY_INFORMATION\n#define THREAD_QUERY_INFORMATION 0x0040\n#endif\n#ifndef THREAD_SET_THREAD_TOKEN\n#define THREAD_SET_THREAD_TOKEN 0x0080\n#endif\n#ifndef THREAD_IMPERSONATE\n#define THREAD_IMPERSONATE 0x0100\n#endif\n#ifndef THREAD_DIRECT_IMPERSONATION\n#define THREAD_DIRECT_IMPERSONATION 0x0200\n#endif\n#ifndef THREAD_SET_LIMITED_INFORMATION\n#define THREAD_SET_LIMITED_INFORMATION 0x0400\n#endif\n#ifndef THREAD_QUERY_LIMITED_INFORMATION\n#define THREAD_QUERY_LIMITED_INFORMATION 0x0800\n#endif\n#ifndef THREAD_RESUME\n#define THREAD_RESUME 0x1000\n#endif\n#ifndef THREAD_ALL_ACCESS\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | SPECIFIC_RIGHTS_ALL)\n#else\n#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)\n#endif\n#endif\n\n//\n// Job Object Specific Access Rights\n//\n\n#ifndef JOB_OBJECT_ASSIGN_PROCESS\n#define JOB_OBJECT_ASSIGN_PROCESS 0x0001\n#endif\n#ifndef JOB_OBJECT_SET_ATTRIBUTES\n#define JOB_OBJECT_SET_ATTRIBUTES 0x0002\n#endif\n#ifndef JOB_OBJECT_QUERY\n#define JOB_OBJECT_QUERY 0x0004\n#endif\n#ifndef JOB_OBJECT_TERMINATE\n#define JOB_OBJECT_TERMINATE 0x0008\n#endif\n#ifndef JOB_OBJECT_SET_SECURITY_ATTRIBUTES\n#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x0010\n#endif\n#ifndef JOB_OBJECT_ALL_ACCESS\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3F)\n#else\n#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1f) // pre-Vista full access\n#endif\n#endif\n\n//\n// Process information structures\n//\n\n/**\n * The PEB_LDR_DATA structure contains information about the loaded modules for the process.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb_ldr_data\n */\ntypedef struct _PEB_LDR_DATA\n{\n    ULONG Length;\n    BOOLEAN Initialized;\n    HANDLE SsHandle;\n    LIST_ENTRY InLoadOrderModuleList;\n    LIST_ENTRY InMemoryOrderModuleList;\n    LIST_ENTRY InInitializationOrderModuleList;\n    PVOID EntryInProgress;\n    BOOLEAN ShutdownInProgress;\n    HANDLE ShutdownThreadId;\n} PEB_LDR_DATA, *PPEB_LDR_DATA;\n\ntypedef struct _INITIAL_TEB\n{\n    struct\n    {\n        PVOID OldStackBase;\n        PVOID OldStackLimit;\n    } OldInitialTeb;\n    PVOID StackBase;\n    PVOID StackLimit;\n    PVOID StackAllocationBase;\n} INITIAL_TEB, *PINITIAL_TEB;\n\n//\n// NtQueryInformationProcess/NtSetInformationProcess types\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _PROCESSINFOCLASS\n{\n    ProcessBasicInformation, // q: PROCESS_BASIC_INFORMATION, PROCESS_EXTENDED_BASIC_INFORMATION\n    ProcessQuotaLimits, // qs: QUOTA_LIMITS, QUOTA_LIMITS_EX\n    ProcessIoCounters, // q: IO_COUNTERS\n    ProcessVmCounters, // q: VM_COUNTERS, VM_COUNTERS_EX, VM_COUNTERS_EX2\n    ProcessTimes, // q: KERNEL_USER_TIMES\n    ProcessBasePriority, // s: KPRIORITY\n    ProcessRaisePriority, // s: ULONG\n    ProcessDebugPort, // q: HANDLE\n    ProcessExceptionPort, // s: PROCESS_EXCEPTION_PORT (requires SeTcbPrivilege)\n    ProcessAccessToken, // s: PROCESS_ACCESS_TOKEN\n    ProcessLdtInformation, // qs: PROCESS_LDT_INFORMATION // 10\n    ProcessLdtSize, // s: PROCESS_LDT_SIZE\n    ProcessDefaultHardErrorMode, // qs: ULONG\n    ProcessIoPortHandlers, // s: PROCESS_IO_PORT_HANDLER_INFORMATION // (kernel-mode only)\n    ProcessPooledUsageAndLimits, // q: POOLED_USAGE_AND_LIMITS\n    ProcessWorkingSetWatch, // q: PROCESS_WS_WATCH_INFORMATION[]; s: void\n    ProcessUserModeIOPL, // qs: ULONG (requires SeTcbPrivilege)\n    ProcessEnableAlignmentFaultFixup, // s: BOOLEAN\n    ProcessPriorityClass, // qs: PROCESS_PRIORITY_CLASS\n    ProcessWx86Information, // qs: ULONG (requires SeTcbPrivilege) (VdmAllowed)\n    ProcessHandleCount, // q: ULONG, PROCESS_HANDLE_INFORMATION // 20\n    ProcessAffinityMask, // (q >WIN7)s: KAFFINITY, qs: GROUP_AFFINITY\n    ProcessPriorityBoost, // qs: ULONG\n    ProcessDeviceMap, // qs: PROCESS_DEVICEMAP_INFORMATION, PROCESS_DEVICEMAP_INFORMATION_EX\n    ProcessSessionInformation, // q: PROCESS_SESSION_INFORMATION\n    ProcessForegroundInformation, // s: PROCESS_FOREGROUND_BACKGROUND\n    ProcessWow64Information, // q: ULONG_PTR\n    ProcessImageFileName, // q: UNICODE_STRING\n    ProcessLUIDDeviceMapsEnabled, // q: ULONG\n    ProcessBreakOnTermination, // qs: ULONG\n    ProcessDebugObjectHandle, // q: HANDLE // 30\n    ProcessDebugFlags, // qs: ULONG\n    ProcessHandleTracing, // q: PROCESS_HANDLE_TRACING_QUERY; s: PROCESS_HANDLE_TRACING_ENABLE[_EX] or void to disable\n    ProcessIoPriority, // qs: IO_PRIORITY_HINT\n    ProcessExecuteFlags, // qs: ULONG (MEM_EXECUTE_OPTION_*)\n    ProcessTlsInformation, // PROCESS_TLS_INFORMATION // ProcessResourceManagement\n    ProcessCookie, // q: ULONG\n    ProcessImageInformation, // q: SECTION_IMAGE_INFORMATION\n    ProcessCycleTime, // q: PROCESS_CYCLE_TIME_INFORMATION // since VISTA\n    ProcessPagePriority, // qs: PAGE_PRIORITY_INFORMATION\n    ProcessInstrumentationCallback, // s: PVOID or PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION // 40\n    ProcessThreadStackAllocation, // s: PROCESS_STACK_ALLOCATION_INFORMATION, PROCESS_STACK_ALLOCATION_INFORMATION_EX\n    ProcessWorkingSetWatchEx, // q: PROCESS_WS_WATCH_INFORMATION_EX[]; s: void\n    ProcessImageFileNameWin32, // q: UNICODE_STRING\n    ProcessImageFileMapping, // q: HANDLE (input)\n    ProcessAffinityUpdateMode, // qs: PROCESS_AFFINITY_UPDATE_MODE\n    ProcessMemoryAllocationMode, // qs: PROCESS_MEMORY_ALLOCATION_MODE\n    ProcessGroupInformation, // q: USHORT[]\n    ProcessTokenVirtualizationEnabled, // s: ULONG\n    ProcessConsoleHostProcess, // qs: ULONG_PTR // ProcessOwnerInformation\n    ProcessWindowInformation, // q: PROCESS_WINDOW_INFORMATION // 50\n    ProcessHandleInformation, // q: PROCESS_HANDLE_SNAPSHOT_INFORMATION // since WIN8\n    ProcessMitigationPolicy, // s: PROCESS_MITIGATION_POLICY_INFORMATION\n    ProcessDynamicFunctionTableInformation, // s: PROCESS_DYNAMIC_FUNCTION_TABLE_INFORMATION\n    ProcessHandleCheckingMode, // qs: ULONG; s: 0 disables, otherwise enables\n    ProcessKeepAliveCount, // q: PROCESS_KEEPALIVE_COUNT_INFORMATION\n    ProcessRevokeFileHandles, // s: PROCESS_REVOKE_FILE_HANDLES_INFORMATION\n    ProcessWorkingSetControl, // s: PROCESS_WORKING_SET_CONTROL\n    ProcessHandleTable, // q: ULONG[] // since WINBLUE\n    ProcessCheckStackExtentsMode, // qs: ULONG // KPROCESS->CheckStackExtents (CFG)\n    ProcessCommandLineInformation, // q: UNICODE_STRING // 60\n    ProcessProtectionInformation, // q: PS_PROTECTION\n    ProcessMemoryExhaustion, // s: PROCESS_MEMORY_EXHAUSTION_INFO // since THRESHOLD\n    ProcessFaultInformation, // s: PROCESS_FAULT_INFORMATION\n    ProcessTelemetryIdInformation, // q: PROCESS_TELEMETRY_ID_INFORMATION\n    ProcessCommitReleaseInformation, // qs: PROCESS_COMMIT_RELEASE_INFORMATION\n    ProcessDefaultCpuSetsInformation, // qs: SYSTEM_CPU_SET_INFORMATION[5]\n    ProcessAllowedCpuSetsInformation, // qs: SYSTEM_CPU_SET_INFORMATION[5]\n    ProcessSubsystemProcess,\n    ProcessJobMemoryInformation, // q: PROCESS_JOB_MEMORY_INFO\n    ProcessInPrivate, // q: BOOLEAN; s: void // ETW // since THRESHOLD2 // 70\n    ProcessRaiseUMExceptionOnInvalidHandleClose, // qs: ULONG; s: 0 disables, otherwise enables\n    ProcessIumChallengeResponse,\n    ProcessChildProcessInformation, // q: PROCESS_CHILD_PROCESS_INFORMATION\n    ProcessHighGraphicsPriorityInformation, // qs: BOOLEAN (requires SeTcbPrivilege)\n    ProcessSubsystemInformation, // q: SUBSYSTEM_INFORMATION_TYPE // since REDSTONE2\n    ProcessEnergyValues, // q: PROCESS_ENERGY_VALUES, PROCESS_EXTENDED_ENERGY_VALUES\n    ProcessPowerThrottlingState, // qs: POWER_THROTTLING_PROCESS_STATE\n    ProcessReserved3Information, // ProcessActivityThrottlePolicy // PROCESS_ACTIVITY_THROTTLE_POLICY\n    ProcessWin32kSyscallFilterInformation, // q: WIN32K_SYSCALL_FILTER\n    ProcessDisableSystemAllowedCpuSets, // s: BOOLEAN // 80\n    ProcessWakeInformation, // q: PROCESS_WAKE_INFORMATION\n    ProcessEnergyTrackingState, // qs: PROCESS_ENERGY_TRACKING_STATE\n    ProcessManageWritesToExecutableMemory, // MANAGE_WRITES_TO_EXECUTABLE_MEMORY // since REDSTONE3\n    ProcessCaptureTrustletLiveDump,\n    ProcessTelemetryCoverage, // q: TELEMETRY_COVERAGE_HEADER; s: TELEMETRY_COVERAGE_POINT\n    ProcessEnclaveInformation,\n    ProcessEnableReadWriteVmLogging, // qs: PROCESS_READWRITEVM_LOGGING_INFORMATION\n    ProcessUptimeInformation, // q: PROCESS_UPTIME_INFORMATION\n    ProcessImageSection, // q: HANDLE\n    ProcessDebugAuthInformation, // since REDSTONE4 // 90\n    ProcessSystemResourceManagement, // s: PROCESS_SYSTEM_RESOURCE_MANAGEMENT\n    ProcessSequenceNumber, // q: ULONGLONG\n    ProcessLoaderDetour, // since REDSTONE5\n    ProcessSecurityDomainInformation, // q: PROCESS_SECURITY_DOMAIN_INFORMATION\n    ProcessCombineSecurityDomainsInformation, // s: PROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION\n    ProcessEnableLogging, // qs: PROCESS_LOGGING_INFORMATION\n    ProcessLeapSecondInformation, // qs: PROCESS_LEAP_SECOND_INFORMATION\n    ProcessFiberShadowStackAllocation, // s: PROCESS_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION // since 19H1\n    ProcessFreeFiberShadowStackAllocation, // s: PROCESS_FREE_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION\n    ProcessAltSystemCallInformation, // s: PROCESS_SYSCALL_PROVIDER_INFORMATION // since 20H1 // 100\n    ProcessDynamicEHContinuationTargets, // s: PROCESS_DYNAMIC_EH_CONTINUATION_TARGETS_INFORMATION\n    ProcessDynamicEnforcedCetCompatibleRanges, // s: PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE_INFORMATION // since 20H2\n    ProcessCreateStateChange, // since WIN11\n    ProcessApplyStateChange,\n    ProcessEnableOptionalXStateFeatures, // s: ULONG64 // optional XState feature bitmask\n    ProcessAltPrefetchParam, // qs: OVERRIDE_PREFETCH_PARAMETER // App Launch Prefetch (ALPF) // since 22H1\n    ProcessAssignCpuPartitions, // HANDLE\n    ProcessPriorityClassEx, // s: PROCESS_PRIORITY_CLASS_EX\n    ProcessMembershipInformation, // q: PROCESS_MEMBERSHIP_INFORMATION\n    ProcessEffectiveIoPriority, // q: IO_PRIORITY_HINT // 110\n    ProcessEffectivePagePriority, // q: ULONG\n    ProcessSchedulerSharedData, // SCHEDULER_SHARED_DATA_SLOT_INFORMATION // since 24H2\n    ProcessSlistRollbackInformation,\n    ProcessNetworkIoCounters, // q: PROCESS_NETWORK_COUNTERS\n    ProcessFindFirstThreadByTebValue, // PROCESS_TEB_VALUE_INFORMATION\n    ProcessEnclaveAddressSpaceRestriction, // since 25H2\n    ProcessAvailableCpus,\n    MaxProcessInfoClass\n} PROCESSINFOCLASS;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// NtQueryInformationThread/NtSetInformationThread types\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _THREADINFOCLASS\n{\n    ThreadBasicInformation, // q: THREAD_BASIC_INFORMATION\n    ThreadTimes, // q: KERNEL_USER_TIMES\n    ThreadPriority, // s: KPRIORITY (requires SeIncreaseBasePriorityPrivilege)\n    ThreadBasePriority, // s: KPRIORITY\n    ThreadAffinityMask, // s: KAFFINITY\n    ThreadImpersonationToken, // s: HANDLE\n    ThreadDescriptorTableEntry, // q: DESCRIPTOR_TABLE_ENTRY (or WOW64_DESCRIPTOR_TABLE_ENTRY)\n    ThreadEnableAlignmentFaultFixup, // s: BOOLEAN\n    ThreadEventPair, // Obsolete\n    ThreadQuerySetWin32StartAddress, // q: ULONG_PTR\n    ThreadZeroTlsCell, // s: ULONG // TlsIndex // 10\n    ThreadPerformanceCount, // q: LARGE_INTEGER\n    ThreadAmILastThread, // q: ULONG\n    ThreadIdealProcessor, // s: ULONG\n    ThreadPriorityBoost, // qs: ULONG\n    ThreadSetTlsArrayAddress, // s: ULONG_PTR // Obsolete\n    ThreadIsIoPending, // q: ULONG\n    ThreadHideFromDebugger, // q: BOOLEAN; s: void\n    ThreadBreakOnTermination, // qs: ULONG\n    ThreadSwitchLegacyState, // s: void // NtCurrentThread // NPX/FPU\n    ThreadIsTerminated, // q: ULONG // 20\n    ThreadLastSystemCall, // q: THREAD_LAST_SYSCALL_INFORMATION\n    ThreadIoPriority, // qs: IO_PRIORITY_HINT (requires SeIncreaseBasePriorityPrivilege)\n    ThreadCycleTime, // q: THREAD_CYCLE_TIME_INFORMATION (requires THREAD_QUERY_LIMITED_INFORMATION)\n    ThreadPagePriority, // qs: PAGE_PRIORITY_INFORMATION\n    ThreadActualBasePriority, // s: LONG (requires SeIncreaseBasePriorityPrivilege)\n    ThreadTebInformation, // q: THREAD_TEB_INFORMATION (requires THREAD_GET_CONTEXT + THREAD_SET_CONTEXT)\n    ThreadCSwitchMon, // Obsolete\n    ThreadCSwitchPmu, // Obsolete\n    ThreadWow64Context, // qs: WOW64_CONTEXT, ARM_NT_CONTEXT since 20H1\n    ThreadGroupInformation, // qs: GROUP_AFFINITY // 30\n    ThreadUmsInformation, // q: THREAD_UMS_INFORMATION // Obsolete\n    ThreadCounterProfiling, // q: BOOLEAN; s: THREAD_PROFILING_INFORMATION?\n    ThreadIdealProcessorEx, // qs: PROCESSOR_NUMBER; s: previous PROCESSOR_NUMBER on return\n    ThreadCpuAccountingInformation, // q: BOOLEAN; s: HANDLE (NtOpenSession) // NtCurrentThread // since WIN8\n    ThreadSuspendCount, // q: ULONG // since WINBLUE\n    ThreadHeterogeneousCpuPolicy, // q: KHETERO_CPU_POLICY // since THRESHOLD\n    ThreadContainerId, // q: GUID\n    ThreadNameInformation, // qs: THREAD_NAME_INFORMATION (requires THREAD_SET_LIMITED_INFORMATION)\n    ThreadSelectedCpuSets, // q: ULONG[]\n    ThreadSystemThreadInformation, // q: SYSTEM_THREAD_INFORMATION // 40\n    ThreadActualGroupAffinity, // q: GROUP_AFFINITY // since THRESHOLD2\n    ThreadDynamicCodePolicyInfo, // q: ULONG; s: ULONG (NtCurrentThread)\n    ThreadExplicitCaseSensitivity, // qs: ULONG; s: 0 disables, otherwise enables // (requires SeDebugPrivilege and PsProtectedSignerAntimalware)\n    ThreadWorkOnBehalfTicket, // RTL_WORK_ON_BEHALF_TICKET_EX\n    ThreadSubsystemInformation, // q: SUBSYSTEM_INFORMATION_TYPE // since REDSTONE2\n    ThreadDbgkWerReportActive, // s: ULONG; s: 0 disables, otherwise enables\n    ThreadAttachContainer, // s: HANDLE (job object) // NtCurrentThread\n    ThreadManageWritesToExecutableMemory, // MANAGE_WRITES_TO_EXECUTABLE_MEMORY // since REDSTONE3\n    ThreadPowerThrottlingState, // qs: POWER_THROTTLING_THREAD_STATE // since REDSTONE3 (set), WIN11 22H2 (query)\n    ThreadWorkloadClass, // THREAD_WORKLOAD_CLASS // since REDSTONE5 // 50\n    ThreadCreateStateChange, // since WIN11\n    ThreadApplyStateChange,\n    ThreadStrongerBadHandleChecks, // s: ULONG // NtCurrentThread // since 22H1\n    ThreadEffectiveIoPriority, // q: IO_PRIORITY_HINT\n    ThreadEffectivePagePriority, // q: ULONG\n    ThreadUpdateLockOwnership, // THREAD_LOCK_OWNERSHIP // since 24H2\n    ThreadSchedulerSharedDataSlot, // SCHEDULER_SHARED_DATA_SLOT_INFORMATION\n    ThreadTebInformationAtomic, // q: THREAD_TEB_INFORMATION (requires THREAD_GET_CONTEXT + THREAD_QUERY_INFORMATION)\n    ThreadIndexInformation, // THREAD_INDEX_INFORMATION\n    MaxThreadInfoClass\n} THREADINFOCLASS;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// Use with both ProcessPagePriority and ThreadPagePriority\ntypedef struct _PAGE_PRIORITY_INFORMATION\n{\n    ULONG PagePriority;\n} PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION;\n\n//\n// Process information structures\n//\n\n/**\n * The PROCESS_BASIC_INFORMATION structure contains basic information about a process.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryinformationprocess#process_basic_information\n */\ntypedef struct _PROCESS_BASIC_INFORMATION\n{\n    NTSTATUS ExitStatus;                    // The exit status of the process. (GetExitCodeProcess)\n    PPEB PebBaseAddress;                    // A pointer to the process environment block (PEB) of the process.\n    KAFFINITY AffinityMask;                 // The affinity mask of the process. (GetProcessAffinityMask) (deprecated)\n    KPRIORITY BasePriority;                 // The base priority of the process. (GetPriorityClass)\n    HANDLE UniqueProcessId;                 // The unique identifier of the process. (GetProcessId)\n    HANDLE InheritedFromUniqueProcessId;    // The unique identifier of the parent process.\n} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;\n\n/**\n * The PROCESS_EXTENDED_BASIC_INFORMATION structure contains extended basic information about a process.\n */\ntypedef struct _PROCESS_EXTENDED_BASIC_INFORMATION\n{\n    _In_ SIZE_T Size; // The size of the structure, in bytes. This member must be set to sizeof(PROCESS_EXTENDED_BASIC_INFORMATION).\n    union\n    {\n        PROCESS_BASIC_INFORMATION BasicInfo;\n        struct\n        {\n            NTSTATUS ExitStatus;    // The exit status of the process. (GetExitCodeProcess)\n            PPEB PebBaseAddress;    // A pointer to the process environment block (PEB) of the process.\n            KAFFINITY AffinityMask; // The affinity mask of the process. (GetProcessAffinityMask) (deprecated)\n            KPRIORITY BasePriority; // The base priority of the process. (GetPriorityClass)\n            HANDLE UniqueProcessId; // The unique identifier of the process. (GetProcessId)\n            HANDLE InheritedFromUniqueProcessId; // The unique identifier of the parent process.\n        };\n    };\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG IsProtectedProcess : 1;\n            ULONG IsWow64Process : 1;\n            ULONG IsProcessDeleting : 1;\n            ULONG IsCrossSessionCreate : 1;\n            ULONG IsFrozen : 1;\n            ULONG IsBackground : 1; // WIN://BGKD\n            ULONG IsStronglyNamed : 1; // WIN://SYSAPPID\n            ULONG IsSecureProcess : 1;\n            ULONG IsSubsystemProcess : 1;\n            ULONG IsTrustedApp : 1; // since 24H2\n            ULONG SpareBits : 22;\n        };\n    };\n} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;\n\n/**\n * The VM_COUNTERS structure contains various memory usage statistics for a process.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-process_memory_counters\n */\ntypedef struct _VM_COUNTERS\n{\n    SIZE_T PeakVirtualSize;             // The peak virtual address space size of this process, in bytes.\n    SIZE_T VirtualSize;                 // The virtual address space size of this process, in bytes.\n    ULONG PageFaultCount;               // The number of page faults.\n    SIZE_T PeakWorkingSetSize;          // The peak working set size, in bytes.\n    SIZE_T WorkingSetSize;              // The current working set size, in bytes\n    SIZE_T QuotaPeakPagedPoolUsage;     // The peak paged pool usage, in bytes.\n    SIZE_T QuotaPagedPoolUsage;         // The current paged pool usage, in bytes.\n    SIZE_T QuotaPeakNonPagedPoolUsage;  // The peak non-paged pool usage, in bytes.\n    SIZE_T QuotaNonPagedPoolUsage;      // The current non-paged pool usage, in bytes.\n    SIZE_T PagefileUsage;               // The Commit Charge value in bytes for this process. Commit Charge is the total amount of private memory that the memory manager has committed for a running process.\n    SIZE_T PeakPagefileUsage;           // The peak value in bytes of the Commit Charge during the lifetime of this process.\n} VM_COUNTERS, *PVM_COUNTERS;\n\n/**\n * The VM_COUNTERS_EX structure extends VM_COUNTERS to include private memory usage.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-process_memory_counters_ex2\n */\ntypedef struct _VM_COUNTERS_EX\n{\n    SIZE_T PeakVirtualSize;             // The peak virtual address space size of this process, in bytes.\n    SIZE_T VirtualSize;                 // The virtual address space size of this process, in bytes.\n    ULONG PageFaultCount;               // The number of page faults.\n    SIZE_T PeakWorkingSetSize;          // The peak working set size, in bytes.\n    SIZE_T WorkingSetSize;              // The current working set size, in bytes\n    SIZE_T QuotaPeakPagedPoolUsage;     // The peak paged pool usage, in bytes.\n    SIZE_T QuotaPagedPoolUsage;         // The current paged pool usage, in bytes.\n    SIZE_T QuotaPeakNonPagedPoolUsage;  // The peak non-paged pool usage, in bytes.\n    SIZE_T QuotaNonPagedPoolUsage;      // The current non-paged pool usage, in bytes.\n    SIZE_T PagefileUsage;               // The Commit Charge value in bytes for this process. Commit Charge is the total amount of private memory that the memory manager has committed for a running process.\n    SIZE_T PeakPagefileUsage;           // The peak value in bytes of the Commit Charge during the lifetime of this process.\n    SIZE_T PrivateUsage;                // Same as PagefileUsage. The Commit Charge value in bytes for this process. Commit Charge is the total amount of private memory that the memory manager has committed for a running process.\n} VM_COUNTERS_EX, *PVM_COUNTERS_EX;\n\n/**\n * The VM_COUNTERS_EX2 structure extends VM_COUNTERS_EX to include private working set size and shared commit usage.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-process_memory_counters_ex2\n */\ntypedef struct _VM_COUNTERS_EX2\n{\n    union\n    {\n        VM_COUNTERS_EX CountersEx;\n        struct\n        {\n            SIZE_T PeakVirtualSize;             // The peak virtual address space size of this process, in bytes.\n            SIZE_T VirtualSize;                 // The virtual address space size of this process, in bytes.\n            ULONG PageFaultCount;               // The number of page faults.\n            SIZE_T PeakWorkingSetSize;          // The peak working set size, in bytes.\n            SIZE_T WorkingSetSize;              // The current working set size, in bytes\n            SIZE_T QuotaPeakPagedPoolUsage;     // The peak paged pool usage, in bytes.\n            SIZE_T QuotaPagedPoolUsage;         // The current paged pool usage, in bytes.\n            SIZE_T QuotaPeakNonPagedPoolUsage;  // The peak non-paged pool usage, in bytes.\n            SIZE_T QuotaNonPagedPoolUsage;      // The current non-paged pool usage, in bytes.\n            SIZE_T PagefileUsage;               // The Commit Charge value in bytes for this process. Commit Charge is the total amount of private memory that the memory manager has committed for a running process.\n            SIZE_T PeakPagefileUsage;           // The peak value in bytes of the Commit Charge during the lifetime of this process.\n            SIZE_T PrivateUsage;                // Same as PagefileUsage. The Commit Charge value in bytes for this process. Commit Charge is the total amount of private memory that the memory manager has committed for a running process.\n        };\n    };\n    SIZE_T PrivateWorkingSetSize;               // The current private working set size, in bytes.\n    SIZE_T SharedCommitUsage;                   // The current shared commit usage, in bytes.\n} VM_COUNTERS_EX2, *PVM_COUNTERS_EX2;\n\n/**\n * The KERNEL_USER_TIMES structure contains timing information for a process or thread.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getthreadtimes\n */\ntypedef struct _KERNEL_USER_TIMES\n{\n    LARGE_INTEGER CreateTime;        // The creation time of the process or thread.\n    LARGE_INTEGER ExitTime;          // The exit time of the process or thread.\n    LARGE_INTEGER KernelTime;        // The amount of time the process has executed in kernel mode.\n    LARGE_INTEGER UserTime;          // The amount of time the process has executed in user mode.\n} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;\n\n/**\n * The POOLED_USAGE_AND_LIMITS structure contains information about the usage and limits of paged and non-paged pool memory.\n */\ntypedef struct _POOLED_USAGE_AND_LIMITS\n{\n    SIZE_T PeakPagedPoolUsage;       // The peak paged pool usage.\n    SIZE_T PagedPoolUsage;           // The current paged pool usage.\n    SIZE_T PagedPoolLimit;           // The limit on paged pool usage.\n    SIZE_T PeakNonPagedPoolUsage;    // The peak non-paged pool usage.\n    SIZE_T NonPagedPoolUsage;        // The current non-paged pool usage.\n    SIZE_T NonPagedPoolLimit;        // The limit on non-paged pool usage.\n    SIZE_T PeakPagefileUsage;        // The peak pagefile usage.\n    SIZE_T PagefileUsage;            // The current pagefile usage.\n    SIZE_T PagefileLimit;            // The limit on pagefile usage.\n} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;\n\n#define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003\n#define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))\n\n/**\n * The PROCESS_EXCEPTION_PORT structure is used to manage exception ports for a process.\n */\ntypedef struct _PROCESS_EXCEPTION_PORT\n{\n    //\n    // Handle to the exception port. No particular access required.\n    //\n    _In_ HANDLE ExceptionPortHandle;\n\n    //\n    // Miscellaneous state flags to be cached along with the exception\n    // port in the kernel.\n    //\n    _Inout_ ULONG StateFlags;\n\n} PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;\n\n/**\n * The PROCESS_ACCESS_TOKEN structure is used to manage the security context of a process or thread.\n *\n * A process's access token can only be changed if the process has no threads or a single thread that has not yet begun execution.\n */\ntypedef struct _PROCESS_ACCESS_TOKEN\n{\n    //\n    // Handle to Primary token to assign to the process.\n    // TOKEN_ASSIGN_PRIMARY access to this token is needed.\n    //\n    HANDLE Token;\n\n    //\n    // Handle to the initial thread of the process.\n    // THREAD_QUERY_INFORMATION access to this thread is needed.\n    //\n    // N.B. This field is unused.\n    //\n    HANDLE Thread;\n\n} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;\n\n#ifndef _LDT_ENTRY_DEFINED\n#define _LDT_ENTRY_DEFINED\ntypedef struct _LDT_ENTRY\n{\n    USHORT LimitLow;\n    USHORT BaseLow;\n    union\n    {\n        struct\n        {\n            UCHAR BaseMid;\n            UCHAR Flags1;\n            UCHAR Flags2;\n            UCHAR BaseHi;\n        } Bytes;\n        struct\n        {\n            ULONG BaseMid : 8;\n            ULONG Type : 5;\n            ULONG Dpl : 2;\n            ULONG Pres : 1;\n            ULONG LimitHi : 4;\n            ULONG Sys : 1;\n            ULONG Reserved_0 : 1;\n            ULONG Default_Big : 1;\n            ULONG Granularity : 1;\n            ULONG BaseHi : 8;\n        } Bits;\n    } HighWord;\n} LDT_ENTRY, *PLDT_ENTRY;\n#endif // _LDT_ENTRY_DEFINED\n\n/**\n * The PROCESS_LDT_INFORMATION structure is used to manage Local Descriptor Table (LDT) entries for a process.\n */\ntypedef struct _PROCESS_LDT_INFORMATION\n{\n    ULONG Start;\n    ULONG Length;\n    LDT_ENTRY LdtEntries[1];\n} PROCESS_LDT_INFORMATION, *PPROCESS_LDT_INFORMATION;\n\n/**\n * The PROCESS_LDT_SIZE structure is used to specify the size of the Local Descriptor Table (LDT) for a process.\n */\ntypedef struct _PROCESS_LDT_SIZE\n{\n    ULONG Length;\n} PROCESS_LDT_SIZE, *PPROCESS_LDT_SIZE;\n\n/**\n * The PROCESS_WS_WATCH_INFORMATION structure is used to store information about working set watch events for a process.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_ws_watch_information\n */\ntypedef struct _PROCESS_WS_WATCH_INFORMATION\n{\n    PVOID FaultingPc; // A pointer to the instruction that caused the page fault.\n    PVOID FaultingVa; // A pointer to the page that was added to the working set.\n} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The PROCESS_WS_WATCH_INFORMATION_EX structure contains extended information about a page added to a process working set.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-psapi_ws_watch_information_ex\n */\ntypedef struct _PROCESS_WS_WATCH_INFORMATION_EX\n{\n    union\n    {\n        PROCESS_WS_WATCH_INFORMATION BasicInfo;\n        struct\n        {\n            PVOID FaultingPc;   // The address of the instruction that caused the page fault.\n            PVOID FaultingVa;   // The virtual address that caused the page fault.\n        };\n    };\n    HANDLE FaultingThreadId;    // The identifier of the thread that caused the page fault.\n    ULONG_PTR Flags;            // This member is reserved for future use.\n} PROCESS_WS_WATCH_INFORMATION_EX, *PPROCESS_WS_WATCH_INFORMATION_EX;\n\n#define PROCESS_PRIORITY_CLASS_UNKNOWN 0\n#define PROCESS_PRIORITY_CLASS_IDLE 1\n#define PROCESS_PRIORITY_CLASS_NORMAL 2\n#define PROCESS_PRIORITY_CLASS_HIGH 3\n#define PROCESS_PRIORITY_CLASS_REALTIME 4\n#define PROCESS_PRIORITY_CLASS_BELOW_NORMAL 5\n#define PROCESS_PRIORITY_CLASS_ABOVE_NORMAL 6\n\n/**\n * The PROCESS_PRIORITY_CLASS structure is used to manage the priority class of a process.\n */\ntypedef struct _PROCESS_PRIORITY_CLASS\n{\n    BOOLEAN Foreground;\n    UCHAR PriorityClass;\n} PROCESS_PRIORITY_CLASS, *PPROCESS_PRIORITY_CLASS;\n\n/**\n * The PROCESS_PRIORITY_CLASS_EX structure extends PROCESS_PRIORITY_CLASS to include validity flags.\n */\ntypedef struct _PROCESS_PRIORITY_CLASS_EX\n{\n    union\n    {\n        struct\n        {\n            USHORT ForegroundValid : 1;\n            USHORT PriorityClassValid : 1;\n        };\n        USHORT AllFlags;\n    };\n    UCHAR PriorityClass;\n    BOOLEAN Foreground;\n} PROCESS_PRIORITY_CLASS_EX, *PPROCESS_PRIORITY_CLASS_EX;\n\n/**\n * The PROCESS_FOREGROUND_BACKGROUND structure is used to manage the the priority class of a process, specifically whether it runs in the foreground or background.\n */\ntypedef struct _PROCESS_FOREGROUND_BACKGROUND\n{\n    BOOLEAN Foreground;\n} PROCESS_FOREGROUND_BACKGROUND, *PPROCESS_FOREGROUND_BACKGROUND;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// DriveType\n#define DRIVE_UNKNOWN     0\n#define DRIVE_NO_ROOT_DIR 1\n#define DRIVE_REMOVABLE   2\n#define DRIVE_FIXED       3\n#define DRIVE_REMOTE      4\n#define DRIVE_CDROM       5\n#define DRIVE_RAMDISK     6\n\n/**\n * The PROCESS_DEVICEMAP_INFORMATION structure contains information about a process's device map.\n */\ntypedef struct _PROCESS_DEVICEMAP_INFORMATION\n{\n    union\n    {\n        struct\n        {\n            HANDLE DirectoryHandle; // A handle to a directory object that can be set as the new device map for the process. This handle must have DIRECTORY_TRAVERSE access.\n        } Set;\n        struct\n        {\n            ULONG DriveMap;         // A bitmask that indicates which drive letters are currently in use in the process's device map.\n            UCHAR DriveType[32];    // A value that indicates the type of each drive (e.g., local disk, network drive, etc.). // DRIVE_* WinBase.h\n        } Query;\n    };\n} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;\n\n#define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001\n\n/**\n * The _PROCESS_DEVICEMAP_INFORMATION_EX structure contains information about a process's device map.\n */\ntypedef struct _PROCESS_DEVICEMAP_INFORMATION_EX\n{\n    union\n    {\n        struct\n        {\n            HANDLE DirectoryHandle; // A handle to a directory object that can be set as the new device map for the process. This handle must have DIRECTORY_TRAVERSE access.\n        } Set;\n        struct\n        {\n            ULONG DriveMap;         // A bitmask that indicates which drive letters are currently in use in the process's device map.\n            UCHAR DriveType[32];    // A value that indicates the type of each drive (e.g., local disk, network drive, etc.). // DRIVE_* WinBase.h\n        } Query;\n    };\n    ULONG Flags; // PROCESS_LUID_DOSDEVICES_ONLY\n} PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;\n\n/**\n * The PROCESS_SESSION_INFORMATION structure is used to store information about the session ID of a process.\n */\ntypedef struct _PROCESS_SESSION_INFORMATION\n{\n    ULONG SessionId;\n} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;\n\n#define PROCESS_HANDLE_EXCEPTIONS_ENABLED 0x00000001\n#define PROCESS_HANDLE_RAISE_EXCEPTION_ON_INVALID_HANDLE_CLOSE_DISABLED 0x00000000\n#define PROCESS_HANDLE_RAISE_EXCEPTION_ON_INVALID_HANDLE_CLOSE_ENABLED 0x00000001\n\n/**\n * The PROCESS_HANDLE_TRACING_ENABLE structure is used to enable handle tracing for a process.\n */\ntypedef struct _PROCESS_HANDLE_TRACING_ENABLE\n{\n    ULONG Flags; // Flags that control handle tracing.\n} PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;\n\n#define PROCESS_HANDLE_TRACING_MAX_SLOTS 0x20000\n\n/**\n * The PROCESS_HANDLE_TRACING_ENABLE_EX structure extends PROCESS_HANDLE_TRACING_ENABLE to include the total number of slots.\n */\ntypedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX\n{\n    ULONG Flags;        // Flags that control handle tracing.\n    ULONG TotalSlots;   // Total number of handle tracing slots.\n} PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;\n\n#define PROCESS_HANDLE_TRACING_MAX_STACKS 16\n\n#define PROCESS_HANDLE_TRACE_TYPE_OPEN 1\n#define PROCESS_HANDLE_TRACE_TYPE_CLOSE 2\n#define PROCESS_HANDLE_TRACE_TYPE_BADREF 3\n\ntypedef struct _PROCESS_HANDLE_TRACING_ENTRY\n{\n    HANDLE Handle;\n    CLIENT_ID ClientId;\n    ULONG Type;\n    PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];\n} PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;\n\ntypedef struct _PROCESS_HANDLE_TRACING_QUERY\n{\n    _In_opt_ HANDLE Handle;\n    _Out_ ULONG TotalTraces;\n    _Out_ _Field_size_(TotalTraces) PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];\n} PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * The THREAD_TLS_INFORMATION structure contains information about the Thread Local Storage (TLS) data for a thread.\n */\ntypedef struct _THREAD_TLS_INFORMATION\n{\n    ULONG Flags;         // Flags that provide additional information about the TLS data.\n    PVOID NewTlsData;    // Pointer to the new TLS data.\n    PVOID OldTlsData;    // Pointer to the old TLS data.\n    HANDLE ThreadId;     // Handle to the thread associated with the TLS data.\n} THREAD_TLS_INFORMATION, *PTHREAD_TLS_INFORMATION;\n\n/**\n * The PROCESS_TLS_INFORMATION_TYPE enumeration defines the types of TLS operations that can be performed on a process.\n */\ntypedef enum _PROCESS_TLS_INFORMATION_TYPE\n{\n    ProcessTlsReplaceIndex,     // Replace the TLS index.\n    ProcessTlsReplaceVector,    // Replace the TLS vector.\n    MaxProcessTlsOperation      // Maximum value for the enumeration.\n} PROCESS_TLS_INFORMATION_TYPE, *PPROCESS_TLS_INFORMATION_TYPE;\n\n/**\n * The PROCESS_TLS_INFORMATION structure contains information about the TLS operations for a process.\n */\ntypedef struct _PROCESS_TLS_INFORMATION\n{\n    ULONG Flags;                // Flags that provide additional information about the TLS operation.\n    ULONG OperationType;        // The type of TLS operation to be performed.\n    ULONG ThreadDataCount;      // The number of THREAD_TLS_INFORMATION structures in the ThreadData array.\n    ULONG TlsIndex;             // The TLS index to be replaced.\n    ULONG PreviousCount;        // The previous count of TLS data.\n    _Field_size_(ThreadDataCount) THREAD_TLS_INFORMATION ThreadData[1]; // Array of THREAD_TLS_INFORMATION structures.\n} PROCESS_TLS_INFORMATION, *PPROCESS_TLS_INFORMATION;\n\n/**\n * The PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION structure contains information about the instrumentation callback for a process.\n */\ntypedef struct _PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION\n{\n    ULONG Version;  // The version of the instrumentation callback information.\n    ULONG Reserved; // Reserved for future use.\n    PVOID Callback; // Pointer to the callback function.\n} PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION, *PPROCESS_INSTRUMENTATION_CALLBACK_INFORMATION;\n\n/**\n * The PROCESS_STACK_ALLOCATION_INFORMATION structure contains information about the stack allocation for a process.\n */\ntypedef struct _PROCESS_STACK_ALLOCATION_INFORMATION\n{\n    SIZE_T ReserveSize; // The size of the stack to be reserved.\n    SIZE_T ZeroBits;    // The number of zero bits in the stack base address.\n    PVOID StackBase;    // Pointer to the base of the stack.\n} PROCESS_STACK_ALLOCATION_INFORMATION, *PPROCESS_STACK_ALLOCATION_INFORMATION;\n\n/**\n * The PROCESS_STACK_ALLOCATION_INFORMATION_EX structure extends PROCESS_STACK_ALLOCATION_INFORMATION to include additional fields.\n */\ntypedef struct _PROCESS_STACK_ALLOCATION_INFORMATION_EX\n{\n    ULONG PreferredNode; // The preferred NUMA node for the stack allocation.\n    ULONG Reserved0;     // Reserved for future use.\n    ULONG Reserved1;     // Reserved for future use.\n    ULONG Reserved2;     // Reserved for future use.\n    PROCESS_STACK_ALLOCATION_INFORMATION AllocInfo; // The stack allocation information.\n} PROCESS_STACK_ALLOCATION_INFORMATION_EX, *PPROCESS_STACK_ALLOCATION_INFORMATION_EX;\n/**\n * The PROCESS_AFFINITY_UPDATE_MODE union is used to specify the affinity update mode for a process.\n */\ntypedef union _PROCESS_AFFINITY_UPDATE_MODE\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG EnableAutoUpdate : 1; // Indicates whether auto-update of affinity is enabled.\n        ULONG Permanent : 1;        // Indicates whether the affinity update is permanent.\n        ULONG Reserved : 30;        // Reserved for future use.\n    };\n} PROCESS_AFFINITY_UPDATE_MODE, *PPROCESS_AFFINITY_UPDATE_MODE;\n\n/**\n * The PROCESS_MEMORY_ALLOCATION_MODE union is used to specify the memory allocation mode for a process.\n */\ntypedef union _PROCESS_MEMORY_ALLOCATION_MODE\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG TopDown : 1;      // Indicates whether memory allocation should be top-down.\n        ULONG Reserved : 31;    // Reserved for future use.\n    };\n} PROCESS_MEMORY_ALLOCATION_MODE, *PPROCESS_MEMORY_ALLOCATION_MODE;\n\n/**\n * The PROCESS_HANDLE_INFORMATION structure contains information about the handles of a process.\n */\ntypedef struct _PROCESS_HANDLE_INFORMATION\n{\n    ULONG HandleCount;              // The number of handles in the process.\n    ULONG HandleCountHighWatermark; // The highest number of handles that the process has had.\n} PROCESS_HANDLE_INFORMATION, *PPROCESS_HANDLE_INFORMATION;\n\n/**\n * The PROCESS_CYCLE_TIME_INFORMATION structure contains information about the cycle time of a process.\n */\ntypedef struct _PROCESS_CYCLE_TIME_INFORMATION\n{\n    ULONGLONG AccumulatedCycles; // The total number of cycles accumulated by the process.\n    ULONGLONG CurrentCycleCount; // The current cycle count of the process.\n} PROCESS_CYCLE_TIME_INFORMATION, *PPROCESS_CYCLE_TIME_INFORMATION;\n\n/**\n * The PROCESS_WINDOW_INFORMATION structure contains information about the windows of a process.\n */\ntypedef struct _PROCESS_WINDOW_INFORMATION\n{\n    ULONG WindowFlags;          // Flags that provide information about the window.\n    USHORT WindowTitleLength;   // The length of the window title.\n    _Field_size_bytes_(WindowTitleLength) WCHAR WindowTitle[1]; // The title of the window.\n} PROCESS_WINDOW_INFORMATION, *PPROCESS_WINDOW_INFORMATION;\n\n/**\n * The PROCESS_HANDLE_TABLE_ENTRY_INFO structure contains information about a handle table entry of a process.\n */\ntypedef struct _PROCESS_HANDLE_TABLE_ENTRY_INFO\n{\n    HANDLE HandleValue;         // The value of the handle.\n    SIZE_T HandleCount;         // The number of references to the handle.\n    SIZE_T PointerCount;        // The number of pointers to the handle.\n    ACCESS_MASK GrantedAccess;  // The access rights granted to the handle.\n    ULONG ObjectTypeIndex;      // The index of the object type.\n    ULONG HandleAttributes;     // The attributes of the handle.\n    ULONG Reserved;             // Reserved for future use.\n} PROCESS_HANDLE_TABLE_ENTRY_INFO, *PPROCESS_HANDLE_TABLE_ENTRY_INFO;\n\n/**\n * The PROCESS_HANDLE_SNAPSHOT_INFORMATION structure contains information about the handle snapshot of a process.\n */\ntypedef struct _PROCESS_HANDLE_SNAPSHOT_INFORMATION\n{\n    ULONG_PTR NumberOfHandles;\n    ULONG_PTR Reserved;\n    _Field_size_(NumberOfHandles) PROCESS_HANDLE_TABLE_ENTRY_INFO Handles[1];\n} PROCESS_HANDLE_SNAPSHOT_INFORMATION, *PPROCESS_HANDLE_SNAPSHOT_INFORMATION;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#if !defined(NTDDI_WIN10_FE) || (NTDDI_VERSION < NTDDI_WIN10_FE)\ntypedef struct _PROCESS_MITIGATION_REDIRECTION_TRUST_POLICY\n{\n    union {\n        ULONG Flags;\n        struct {\n            ULONG EnforceRedirectionTrust : 1;\n            ULONG AuditRedirectionTrust : 1;\n            ULONG ReservedFlags : 30;\n        };\n    };\n} PROCESS_MITIGATION_REDIRECTION_TRUST_POLICY, *PPROCESS_MITIGATION_REDIRECTION_TRUST_POLICY;\n#endif // NTDDI_WIN10_FE\n\n#if !defined(NTDDI_WIN10_NI) || (NTDDI_VERSION < NTDDI_WIN10_NI)\ntypedef struct _PROCESS_MITIGATION_USER_POINTER_AUTH_POLICY {\n    union {\n        ULONG Flags;\n        struct {\n            ULONG EnablePointerAuthUserIp : 1;\n            ULONG ReservedFlags : 31;\n        };\n    };\n} PROCESS_MITIGATION_USER_POINTER_AUTH_POLICY, *PPROCESS_MITIGATION_USER_POINTER_AUTH_POLICY;\n\ntypedef struct _PROCESS_MITIGATION_SEHOP_POLICY {\n    union {\n        ULONG Flags;\n        struct {\n            ULONG EnableSehop : 1;\n            ULONG ReservedFlags : 31;\n        };\n    };\n} PROCESS_MITIGATION_SEHOP_POLICY, *PPROCESS_MITIGATION_SEHOP_POLICY;\n#endif // NTDDI_WIN10_NI\n\ntypedef struct _PROCESS_MITIGATION_ACTIVATION_CONTEXT_TRUST_POLICY2\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG AssemblyManifestRedirectionTrust : 1;\n            ULONG ReservedFlags : 31;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} PROCESS_MITIGATION_ACTIVATION_CONTEXT_TRUST_POLICY2, *PPROCESS_MITIGATION_ACTIVATION_CONTEXT_TRUST_POLICY2;\n\n#if defined(_PHLIB_)\n// enum PROCESS_MITIGATION_POLICY\n#define PROCESS_MITIGATION_POLICY ULONG\n#define ProcessDEPPolicy 0\n#define ProcessASLRPolicy 1\n#define ProcessDynamicCodePolicy 2\n#define ProcessStrictHandleCheckPolicy 3\n#define ProcessSystemCallDisablePolicy 4\n#define ProcessMitigationOptionsMask 5\n#define ProcessExtensionPointDisablePolicy 6\n#define ProcessControlFlowGuardPolicy 7\n#define ProcessSignaturePolicy 8\n#define ProcessFontDisablePolicy 9\n#define ProcessImageLoadPolicy 10\n#define ProcessSystemCallFilterPolicy 11\n#define ProcessPayloadRestrictionPolicy 12\n#define ProcessChildProcessPolicy 13\n#define ProcessSideChannelIsolationPolicy 14\n#define ProcessUserShadowStackPolicy 15\n#define ProcessRedirectionTrustPolicy 16\n#define ProcessUserPointerAuthPolicy 17\n#define ProcessSEHOPPolicy 18\n#define ProcessActivationContextTrustPolicy 19\n#define MaxProcessMitigationPolicy 20\n#endif // _PHLIB_\n\ntypedef struct _PROCESS_MITIGATION_POLICY_INFORMATION\n{\n    PROCESS_MITIGATION_POLICY Policy;\n    union\n    {\n        PROCESS_MITIGATION_ASLR_POLICY ASLRPolicy;\n        PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY StrictHandleCheckPolicy;\n        PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY SystemCallDisablePolicy;\n        PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY ExtensionPointDisablePolicy;\n        PROCESS_MITIGATION_DYNAMIC_CODE_POLICY DynamicCodePolicy;\n        PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY ControlFlowGuardPolicy;\n        PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY SignaturePolicy;\n        PROCESS_MITIGATION_FONT_DISABLE_POLICY FontDisablePolicy;\n        PROCESS_MITIGATION_IMAGE_LOAD_POLICY ImageLoadPolicy;\n        PROCESS_MITIGATION_SYSTEM_CALL_FILTER_POLICY SystemCallFilterPolicy;\n        PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY PayloadRestrictionPolicy;\n        PROCESS_MITIGATION_CHILD_PROCESS_POLICY ChildProcessPolicy;\n        PROCESS_MITIGATION_SIDE_CHANNEL_ISOLATION_POLICY SideChannelIsolationPolicy;\n        PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY UserShadowStackPolicy;\n        PROCESS_MITIGATION_REDIRECTION_TRUST_POLICY RedirectionTrustPolicy;\n        PROCESS_MITIGATION_USER_POINTER_AUTH_POLICY UserPointerAuthPolicy;\n        PROCESS_MITIGATION_SEHOP_POLICY SEHOPPolicy;\n    };\n} PROCESS_MITIGATION_POLICY_INFORMATION, *PPROCESS_MITIGATION_POLICY_INFORMATION;\n\n// private\ntypedef struct _PROCESS_DYNAMIC_FUNCTION_TABLE_INFORMATION\n{\n    struct _DYNAMIC_FUNCTION_TABLE* DynamicFunctionTable;\n    BOOLEAN Remove;\n} PROCESS_DYNAMIC_FUNCTION_TABLE_INFORMATION, *PPROCESS_DYNAMIC_FUNCTION_TABLE_INFORMATION;\n\ntypedef struct _PROCESS_KEEPALIVE_COUNT_INFORMATION\n{\n    ULONG WakeCount;\n    ULONG NoWakeCount;\n} PROCESS_KEEPALIVE_COUNT_INFORMATION, *PPROCESS_KEEPALIVE_COUNT_INFORMATION;\n\ntypedef struct _PROCESS_REVOKE_FILE_HANDLES_INFORMATION\n{\n    UNICODE_STRING TargetDevicePath;\n} PROCESS_REVOKE_FILE_HANDLES_INFORMATION, *PPROCESS_REVOKE_FILE_HANDLES_INFORMATION;\n\n// rev\n#define PROCESS_WORKING_SET_CONTROL_VERSION 3\n\n/**\n * The PROCESS_WORKING_SET_OPERATION enumeration defines the operation to perform on a process's working set.\n */\ntypedef enum _PROCESS_WORKING_SET_OPERATION\n{\n    ProcessWorkingSetSwap,              // Swap the working set of a process to disk. // (requires SeDebugPrivilege)\n    ProcessWorkingSetEmpty,             // Remove all pages from the working set of a process.\n    ProcessWorkingSetEmptyPrivatePages, // Remove private pages from the working set of a process.\n    ProcessWorkingSetOperationMax\n} PROCESS_WORKING_SET_OPERATION;\n\n/**\n * The PROCESS_WORKING_SET_FLAG_EMPTY_PRIVATE_PAGES flag indicates that the operation should target private pages in the working set.\n * Private pages are those that are not shared with other processes.\n */\n#define PROCESS_WORKING_SET_FLAG_EMPTY_PRIVATE_PAGES 0x01\n/**\n * The PROCESS_WORKING_SET_FLAG_EMPTY_SHARED_PAGES flag indicates that the operation should target shared pages in the working set.\n * Shared pages are those that are shared between multiple processes.\n */\n#define PROCESS_WORKING_SET_FLAG_EMPTY_SHARED_PAGES  0x02\n/**\n * The PROCESS_WORKING_SET_FLAG_COMPRESS flag indicates that the operation should compress the pages before they are removed from the working set.\n * Compression is typically used in conjunction with other flags to specify that the pages should be compressed as part of the operation.\n */\n#define PROCESS_WORKING_SET_FLAG_COMPRESS            0x08\n/**\n * The PROCESS_WORKING_SET_FLAG_STORE flag indicates that the operation should store the compressed pages.\n * This is useful when the compressed data might be needed later, allowing for efficient retrieval and decompression when required.\n * This flag is typically used in conjunction with the PROCESS_WORKING_SET_FLAG_COMPRESS flag to specify that the compressed pages should be stored.\n */\n#define PROCESS_WORKING_SET_FLAG_STORE               0x10\n\n/**\n * The PROCESS_WORKING_SET_CONTROL structure is used to control the working set of a process.\n */\ntypedef struct _PROCESS_WORKING_SET_CONTROL\n{\n    ULONG Version;\n    PROCESS_WORKING_SET_OPERATION Operation;\n    ULONG Flags;\n} PROCESS_WORKING_SET_CONTROL, *PPROCESS_WORKING_SET_CONTROL;\n\n/**\n * The PS_PROTECTED_TYPE enumeration defines the types of protection that can be applied to a process.\n */\ntypedef enum _PS_PROTECTED_TYPE\n{\n    PsProtectedTypeNone,            // No protection.\n    PsProtectedTypeProtectedLight,  // Light protection.\n    PsProtectedTypeProtected,       // Full protection.\n    PsProtectedTypeMax\n} PS_PROTECTED_TYPE;\n\n/**\n * The PS_PROTECTED_SIGNER enumeration defines the types of signers that can be associated with a protected process.\n */\ntypedef enum _PS_PROTECTED_SIGNER\n{\n    PsProtectedSignerNone,          // No signer.\n    PsProtectedSignerAuthenticode,  // Authenticode signer.\n    PsProtectedSignerCodeGen,       // Code generation signer.\n    PsProtectedSignerAntimalware,   // Antimalware signer.\n    PsProtectedSignerLsa,           // Local Security Authority signer.\n    PsProtectedSignerWindows,       // Windows signer.\n    PsProtectedSignerWinTcb,        // Windows Trusted Computing Base signer.\n    PsProtectedSignerWinSystem,     // Windows system signer.\n    PsProtectedSignerApp,           // Application signer.\n    PsProtectedSignerMax\n} PS_PROTECTED_SIGNER;\n\n#define PS_PROTECTED_SIGNER_MASK 0xFF\n#define PS_PROTECTED_AUDIT_MASK 0x08\n#define PS_PROTECTED_TYPE_MASK 0x07\n\n// ProtectionLevel.Level = PsProtectedValue(PsProtectedSignerCodeGen, FALSE, PsProtectedTypeProtectedLight)\n#define PsProtectedValue(PsSigner, PsAudit, PsType) ( \\\n    (((PsSigner) & PS_PROTECTED_SIGNER_MASK) << 4) | \\\n    (((PsAudit) & PS_PROTECTED_AUDIT_MASK) << 3) | \\\n    (((PsType) & PS_PROTECTED_TYPE_MASK)) \\\n    )\n\n// InitializePsProtection(&ProtectionLevel, PsProtectedSignerCodeGen, FALSE, PsProtectedTypeProtectedLight)\n#define InitializePsProtection(PsProtectionLevel, PsSigner, PsAudit, PsType) { \\\n    (PsProtectionLevel)->Signer = (PsSigner); \\\n    (PsProtectionLevel)->Audit = (PsAudit); \\\n    (PsProtectionLevel)->Type = (PsType); \\\n    }\n\n/**\n * The PS_PROTECTION structure is used to define the protection level of a process.\n */\ntypedef struct _PS_PROTECTION\n{\n    union\n    {\n        UCHAR Level;\n        struct\n        {\n            UCHAR Type : 3;\n            UCHAR Audit : 1;\n            UCHAR Signer : 4;\n        };\n    };\n} PS_PROTECTION, *PPS_PROTECTION;\n\n/**\n * The PROCESS_FAULT_INFORMATION structure contains information about process faults.\n */\ntypedef struct _PROCESS_FAULT_INFORMATION\n{\n    ULONG FaultFlags;       // Flags that provide additional information about the fault.\n    ULONG AdditionalInfo;   // Additional information about the fault.\n} PROCESS_FAULT_INFORMATION, *PPROCESS_FAULT_INFORMATION;\n\n/**\n * The PROCESS_TELEMETRY_ID_INFORMATION structure contains telemetry information about a process.\n */\ntypedef struct _PROCESS_TELEMETRY_ID_INFORMATION\n{\n    ULONG HeaderSize;                       // The size of the structure, in bytes.\n    ULONG ProcessId;                        // The ID of the process.\n    ULONGLONG ProcessStartKey;              // The start key of the process.\n    ULONGLONG CreateTime;                   // The creation time of the process.\n    ULONGLONG CreateInterruptTime;          // The interrupt time at creation.\n    ULONGLONG CreateUnbiasedInterruptTime;  // The unbiased interrupt time at creation.\n    ULONGLONG ProcessSequenceNumber;        // The monotonic sequence number of the process.\n    ULONGLONG SessionCreateTime;            // The session creation time.\n    ULONG SessionId;                        // The ID of the session.\n    ULONG BootId;                           // The boot ID.\n    ULONG ImageChecksum;                    // The checksum of the process image.\n    ULONG ImageTimeDateStamp;               // The timestamp of the process image.\n    ULONG UserSidOffset;                    // The offset to the user SID.\n    ULONG ImagePathOffset;                  // The offset to the image path.\n    ULONG PackageNameOffset;                // The offset to the package name.\n    ULONG RelativeAppNameOffset;            // The offset to the relative application name.\n    ULONG CommandLineOffset;                // The offset to the command line.\n} PROCESS_TELEMETRY_ID_INFORMATION, *PPROCESS_TELEMETRY_ID_INFORMATION;\n\n/**\n * The PROCESS_COMMIT_RELEASE_INFORMATION structure contains information about the commit and release of memory for a process.\n */\ntypedef struct _PROCESS_COMMIT_RELEASE_INFORMATION\n{\n    ULONG Version;\n    struct\n    {\n        ULONG Eligible : 1;\n        ULONG ReleaseRepurposedMemResetCommit : 1;\n        ULONG ForceReleaseMemResetCommit : 1;\n        ULONG Spare : 29;\n    };\n    SIZE_T CommitDebt;\n    SIZE_T CommittedMemResetSize;\n    SIZE_T RepurposedMemResetSize;\n} PROCESS_COMMIT_RELEASE_INFORMATION, *PPROCESS_COMMIT_RELEASE_INFORMATION;\n\n/**\n * The PROCESS_JOB_MEMORY_INFO structure contains Represents app memory usage at a single point in time.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-app_memory_information\n */\ntypedef struct _PROCESS_JOB_MEMORY_INFO\n{\n    ULONGLONG SharedCommitUsage;        // The current shared commit usage, in bytes.\n    ULONGLONG PrivateCommitUsage;       // The current private commit usage, in bytes.\n    ULONGLONG PeakPrivateCommitUsage;   // The peak private commit usage, in bytes.\n    ULONGLONG PrivateCommitLimit;       // The private commit limit, in bytes.\n    ULONGLONG TotalCommitLimit;         // The total commit limit, in bytes.\n} PROCESS_JOB_MEMORY_INFO, *PPROCESS_JOB_MEMORY_INFO;\n\n/**\n * The PROCESS_CHILD_PROCESS_INFORMATION structure contains information about child process policies.\n */\ntypedef struct _PROCESS_CHILD_PROCESS_INFORMATION\n{\n    BOOLEAN ProhibitChildProcesses;         // Child processes are prohibited.\n    BOOLEAN AlwaysAllowSecureChildProcess;  // Secure child processes are always allowed.\n    BOOLEAN AuditProhibitChildProcesses;    // Child processes are audited.\n} PROCESS_CHILD_PROCESS_INFORMATION, *PPROCESS_CHILD_PROCESS_INFORMATION;\n\n#define POWER_THROTTLING_PROCESS_CURRENT_VERSION 1\n\n#define POWER_THROTTLING_PROCESS_EXECUTION_SPEED 0x1\n#define POWER_THROTTLING_PROCESS_DELAYTIMERS 0x2\n#define POWER_THROTTLING_PROCESS_IGNORE_TIMER_RESOLUTION 0x4 // since WIN11\n\n#define POWER_THROTTLING_PROCESS_VALID_FLAGS \\\n    ((POWER_THROTTLING_PROCESS_EXECUTION_SPEED | POWER_THROTTLING_PROCESS_DELAYTIMERS | POWER_THROTTLING_PROCESS_IGNORE_TIMER_RESOLUTION))\n\n/**\n * The POWER_THROTTLING_PROCESS_STATE structure is used to manage the power throttling state of a process.\n */\ntypedef struct _POWER_THROTTLING_PROCESS_STATE\n{\n    ULONG Version;       // The version of the structure.\n    ULONG ControlMask;   // A mask that specifies the control settings for power throttling.\n    ULONG StateMask;     // A mask that specifies the current state of power throttling.\n} POWER_THROTTLING_PROCESS_STATE, *PPOWER_THROTTLING_PROCESS_STATE;\n\n// rev (tyranid)\n#define WIN32K_SYSCALL_FILTER_STATE_ENABLE 0x1\n#define WIN32K_SYSCALL_FILTER_STATE_AUDIT 0x2\n\ntypedef struct _WIN32K_SYSCALL_FILTER\n{\n    ULONG FilterState;\n    ULONG FilterSet;\n} WIN32K_SYSCALL_FILTER, *PWIN32K_SYSCALL_FILTER;\n\ntypedef struct _JOBOBJECT_WAKE_FILTER *PJOBOBJECT_WAKE_FILTER; // from ntpsapi.h\n\ntypedef struct _PROCESS_WAKE_INFORMATION\n{\n    ULONGLONG NotificationChannel;\n    ULONG WakeCounters[7];\n    PJOBOBJECT_WAKE_FILTER WakeFilter;\n} PROCESS_WAKE_INFORMATION, *PPROCESS_WAKE_INFORMATION;\n\ntypedef struct _PROCESS_ENERGY_TRACKING_STATE\n{\n    ULONG StateUpdateMask;\n    ULONG StateDesiredValue;\n    ULONG StateSequence;\n    ULONG UpdateTag : 1;\n    WCHAR Tag[64];\n} PROCESS_ENERGY_TRACKING_STATE, *PPROCESS_ENERGY_TRACKING_STATE;\n\ntypedef struct _MANAGE_WRITES_TO_EXECUTABLE_MEMORY\n{\n    ULONG Version : 8;\n    ULONG ProcessEnableWriteExceptions : 1;\n    ULONG ThreadAllowWrites : 1;\n    ULONG Spare : 22;\n    PVOID KernelWriteToExecutableSignal; // 19H1\n} MANAGE_WRITES_TO_EXECUTABLE_MEMORY, *PMANAGE_WRITES_TO_EXECUTABLE_MEMORY;\n\n#define POWER_THROTTLING_THREAD_CURRENT_VERSION 1\n#define POWER_THROTTLING_THREAD_EXECUTION_SPEED 0x1\n#define POWER_THROTTLING_THREAD_VALID_FLAGS (POWER_THROTTLING_THREAD_EXECUTION_SPEED)\n\ntypedef struct _POWER_THROTTLING_THREAD_STATE\n{\n    ULONG Version;\n    ULONG ControlMask;\n    ULONG StateMask;\n} POWER_THROTTLING_THREAD_STATE, *PPOWER_THROTTLING_THREAD_STATE;\n\n#define PROCESS_READWRITEVM_LOGGING_ENABLE_READVM 1\n#define PROCESS_READWRITEVM_LOGGING_ENABLE_WRITEVM 2\n#define PROCESS_READWRITEVM_LOGGING_ENABLE_READVM_V 1UL\n#define PROCESS_READWRITEVM_LOGGING_ENABLE_WRITEVM_V 2UL\n\ntypedef union _PROCESS_READWRITEVM_LOGGING_INFORMATION\n{\n    UCHAR Flags;\n    struct\n    {\n        UCHAR EnableReadVmLogging : 1;\n        UCHAR EnableWriteVmLogging : 1;\n        UCHAR Unused : 6;\n    };\n} PROCESS_READWRITEVM_LOGGING_INFORMATION, *PPROCESS_READWRITEVM_LOGGING_INFORMATION;\n\ntypedef struct _PROCESS_UPTIME_INFORMATION\n{\n    ULONGLONG QueryInterruptTime;\n    ULONGLONG QueryUnbiasedTime;\n    ULONGLONG EndInterruptTime;\n    ULONGLONG TimeSinceCreation;\n    ULONGLONG Uptime;\n    ULONGLONG SuspendedTime;\n    struct\n    {\n        ULONG HangCount : 4;\n        ULONG GhostCount : 4;\n        ULONG Crashed : 1;\n        ULONG Terminated : 1;\n    };\n} PROCESS_UPTIME_INFORMATION, *PPROCESS_UPTIME_INFORMATION;\n\ntypedef union _PROCESS_SYSTEM_RESOURCE_MANAGEMENT\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG Foreground : 1;\n        ULONG Reserved : 31;\n    };\n} PROCESS_SYSTEM_RESOURCE_MANAGEMENT, *PPROCESS_SYSTEM_RESOURCE_MANAGEMENT;\n\ntypedef struct _PROCESS_SECURITY_DOMAIN_INFORMATION\n{\n    ULONGLONG SecurityDomain;\n} PROCESS_SECURITY_DOMAIN_INFORMATION, *PPROCESS_SECURITY_DOMAIN_INFORMATION;\n\ntypedef struct _PROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION\n{\n    HANDLE ProcessHandle;\n} PROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION, *PPROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION;\n\ntypedef union _PROCESS_LOGGING_INFORMATION\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG EnableReadVmLogging : 1;\n        ULONG EnableWriteVmLogging : 1;\n        ULONG EnableProcessSuspendResumeLogging : 1;\n        ULONG EnableThreadSuspendResumeLogging : 1;\n        ULONG EnableLocalExecProtectVmLogging : 1;\n        ULONG EnableRemoteExecProtectVmLogging : 1;\n        ULONG EnableImpersonationLogging : 1;\n        ULONG Reserved : 25;\n    };\n} PROCESS_LOGGING_INFORMATION, *PPROCESS_LOGGING_INFORMATION;\n\ntypedef struct _PROCESS_LEAP_SECOND_INFORMATION\n{\n    ULONG Flags;\n    ULONG Reserved;\n} PROCESS_LEAP_SECOND_INFORMATION, *PPROCESS_LEAP_SECOND_INFORMATION;\n\ntypedef struct _PROCESS_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION\n{\n    ULONGLONG ReserveSize;\n    ULONGLONG CommitSize;\n    ULONG PreferredNode;\n    ULONG Reserved;\n    PVOID Ssp;\n} PROCESS_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION, *PPROCESS_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION;\n\ntypedef struct _PROCESS_FREE_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION\n{\n    PVOID Ssp;\n} PROCESS_FREE_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION, *PPROCESS_FREE_FIBER_SHADOW_STACK_ALLOCATION_INFORMATION;\n\ntypedef struct _PROCESS_SYSCALL_PROVIDER_INFORMATION\n{\n    GUID ProviderId;\n    UCHAR Level;\n} PROCESS_SYSCALL_PROVIDER_INFORMATION, *PPROCESS_SYSCALL_PROVIDER_INFORMATION;\n\n//typedef struct _PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE\n//{\n//    ULONG_PTR BaseAddress;\n//    SIZE_T Size;\n//    ULONG Flags;\n//} PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE, *PPROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE;\n//\n//typedef struct _PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGES_INFORMATION\n//{\n//    USHORT NumberOfRanges;\n//    USHORT Reserved;\n//    ULONG Reserved2;\n//    PPROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE Ranges;\n//} PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGES_INFORMATION, *PPROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGES_INFORMATION;\n\ntypedef struct _PROCESS_MEMBERSHIP_INFORMATION\n{\n    ULONG ServerSiloId;\n} PROCESS_MEMBERSHIP_INFORMATION, *PPROCESS_MEMBERSHIP_INFORMATION;\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\ntypedef struct _PROCESS_NETWORK_COUNTERS\n{\n    ULONG64 BytesIn;\n    ULONG64 BytesOut;\n} PROCESS_NETWORK_COUNTERS, *PPROCESS_NETWORK_COUNTERS;\n#endif\n\ntypedef struct _PROCESS_TEB_VALUE_INFORMATION\n{\n    ULONG ThreadId;\n    ULONG TebOffset;\n    ULONG_PTR Value;\n} PROCESS_TEB_VALUE_INFORMATION, *PPROCESS_TEB_VALUE_INFORMATION;\n\n/**\n * The NtQueryPortInformationProcess function retrieves the status of the current process exception port.\n *\n * @return LOGICAL If TRUE, the process exception port is valid.\n */\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtQueryPortInformationProcess(\n    VOID\n    );\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Thread information structures\n//\n\ntypedef struct _THREAD_BASIC_INFORMATION\n{\n    NTSTATUS ExitStatus;\n    PTEB TebBaseAddress;\n    CLIENT_ID ClientId;\n    KAFFINITY AffinityMask;\n    KPRIORITY Priority;\n    KPRIORITY BasePriority;\n} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;\n\ntypedef struct _THREAD_LAST_SYSCALL_INFORMATION\n{\n    PVOID FirstArgument;\n    USHORT SystemCallNumber;\n#ifdef WIN64\n    USHORT Pad[0x3]; // since REDSTONE2\n#else\n    USHORT Pad[0x1]; // since REDSTONE2\n#endif\n    ULONG64 WaitTime;\n} THREAD_LAST_SYSCALL_INFORMATION, *PTHREAD_LAST_SYSCALL_INFORMATION;\n\n/**\n * The THREAD_CYCLE_TIME_INFORMATION structure contains information about the cycle time of a thread.\n */\ntypedef struct _THREAD_CYCLE_TIME_INFORMATION\n{\n    ULONGLONG AccumulatedCycles;        // The total number of cycles accumulated by the thread.\n    ULONGLONG CurrentCycleCount;        // The current cycle count of the thread.\n} THREAD_CYCLE_TIME_INFORMATION, *PTHREAD_CYCLE_TIME_INFORMATION;\n\n// RtlAbPostRelease / ReleaseAllUserModeAutoBoostLockHandles\ntypedef struct _THREAD_LOCK_OWNERSHIP\n{\n    ULONG SrwLock[1];\n} THREAD_LOCK_OWNERSHIP, *PTHREAD_LOCK_OWNERSHIP;\n\ntypedef enum _SCHEDULER_SHARED_DATA_SLOT_ACTION\n{\n    SchedulerSharedSlotAssign,\n    SchedulerSharedSlotFree,\n    SchedulerSharedSlotQuery\n} SCHEDULER_SHARED_DATA_SLOT_ACTION;\n\ntypedef struct _SCHEDULER_SHARED_DATA_SLOT_INFORMATION\n{\n    SCHEDULER_SHARED_DATA_SLOT_ACTION Action;\n    PVOID SchedulerSharedDataHandle;\n    PVOID Slot;\n} SCHEDULER_SHARED_DATA_SLOT_INFORMATION, *PSCHEDULER_SHARED_DATA_SLOT_INFORMATION;\n\ntypedef struct _THREAD_TEB_INFORMATION\n{\n    _Inout_bytecount_(BytesToRead) PVOID TebInformation; // Buffer to write data into.\n    _In_ ULONG TebOffset;                                // Offset in TEB to begin reading from.\n    _In_ ULONG BytesToRead;                              // Number of bytes to read.\n} THREAD_TEB_INFORMATION, *PTHREAD_TEB_INFORMATION;\n\n/**\n * The COUNTER_READING structure is used to store individual counter data from a hardware counter.\n *\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-hardware_counter_data\n */\ntypedef struct _COUNTER_READING\n{\n    HARDWARE_COUNTER_TYPE Type;     // Specifies the type of hardware counter data collected.\n    ULONG Index;                    // An identifier for the specific counter.\n    ULONG64 Start;                  // The initial value of the counter when measurement started.\n    ULONG64 Total;                  // The accumulated value of the counter over the measurement period.\n} COUNTER_READING, *PCOUNTER_READING;\n\n#ifndef THREAD_PERFORMANCE_DATA_VERSION\n#define THREAD_PERFORMANCE_DATA_VERSION 1\n#endif\n\n/**\n * The THREAD_PERFORMANCE_DATA structure aggregates various performance metrics for a thread.\n *\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-performance_data\n */\ntypedef struct _THREAD_PERFORMANCE_DATA\n{\n    USHORT Size;                                    // The size of the structure.\n    USHORT Version;                                 // The version of the structure. Must be set to \\ref THREAD_PERFORMANCE_DATA_VERSION.\n    PROCESSOR_NUMBER ProcessorNumber;               // The processor number that identifies where the thread is running.\n    ULONG ContextSwitches;                          // The number of context switches that occurred from the time profiling was enabled.\n    ULONG HwCountersCount;                          // The number of array elements in the HwCounters array that contain hardware counter data.\n    ULONG64 UpdateCount;                            // The number of times that the read operation read the data to ensure a consistent snapshot of the data.\n    ULONG64 WaitReasonBitMap;                       // A bitmask of \\ref KWAIT_REASON that identifies the reasons for the context switches that occurred since the last time the data was read.\n    ULONG64 HardwareCounters;                       // A bitmask of hardware counters used to collect counter data.\n    COUNTER_READING CycleTime;                      // The cycle time of the thread (excludes the time spent interrupted) from the time profiling was enabled.\n    COUNTER_READING HwCounters[MAX_HW_COUNTERS];    // The \\ref COUNTER_READING structure that contains hardware counter data.\n} THREAD_PERFORMANCE_DATA, *PTHREAD_PERFORMANCE_DATA;\n\n#ifndef THREAD_PROFILING_FLAG_DISPATCH\n#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001\n#endif\n\n#ifndef THREAD_PROFILING_FLAG_HARDWARE_COUNTERS\n#define THREAD_PROFILING_FLAG_HARDWARE_COUNTERS 0x00000002\n#endif\n\n/**\n * The THREAD_PROFILING_INFORMATION structure contains profiling information and references to performance data.\n *\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readthreadprofilingdata\n */\ntypedef struct _THREAD_PROFILING_INFORMATION\n{\n    // To receive hardware performance counter data, set this parameter to a bitmask that identifies the hardware counters to collect.\n    // You can specify up to 16 performance counters. Each bit relates directly to the zero-based hardware counter index for the hardware\n    // performance counters that you configured. Set to zero if you are not collecting hardware counter data.\n    // If you set a bit for a hardware counter that has not been configured, the counter value that is read for that counter is zero.\n    ULONG64 HardwareCounters;\n    // To receive thread profiling data such as context switch count, set this parameter to \\ref THREAD_PROFILING_FLAG_DISPATCH.\n    ULONG Flags;\n    // Enable or disable thread profiling on the specified thread.\n    ULONG Enable;\n    // The PERFORMANCE_DATA structure that contains thread profiling and hardware counter data.\n    PTHREAD_PERFORMANCE_DATA PerformanceData;\n} THREAD_PROFILING_INFORMATION, *PTHREAD_PROFILING_INFORMATION;\n\ntypedef struct _RTL_UMS_CONTEXT\n{\n    SINGLE_LIST_ENTRY Link;\n    CONTEXT Context;\n    PVOID Teb;\n    PVOID UserContext;\n    volatile ULONG ScheduledThread : 1;\n    volatile ULONG Suspended : 1;\n    volatile ULONG VolatileContext : 1;\n    volatile ULONG Terminated : 1;\n    volatile ULONG DebugActive : 1;\n    volatile ULONG RunningOnSelfThread : 1;\n    volatile ULONG DenyRunningOnSelfThread : 1;\n    volatile LONG Flags;\n    volatile ULONG64 KernelUpdateLock : 2;\n    volatile ULONG64 PrimaryClientID : 62;\n    volatile ULONG64 ContextLock;\n    struct _RTL_UMS_CONTEXT* PrimaryUmsContext;\n    ULONG SwitchCount;\n    ULONG KernelYieldCount;\n    ULONG MixedYieldCount;\n    ULONG YieldCount;\n} RTL_UMS_CONTEXT, *PRTL_UMS_CONTEXT;\n\ntypedef enum _THREAD_UMS_INFORMATION_COMMAND\n{\n    UmsInformationCommandInvalid,\n    UmsInformationCommandAttach,\n    UmsInformationCommandDetach,\n    UmsInformationCommandQuery\n} THREAD_UMS_INFORMATION_COMMAND;\n\ntypedef struct _RTL_UMS_COMPLETION_LIST\n{\n    PSINGLE_LIST_ENTRY ThreadListHead;\n    PVOID CompletionEvent;\n    ULONG CompletionFlags;\n    SINGLE_LIST_ENTRY InternalListHead;\n} RTL_UMS_COMPLETION_LIST, *PRTL_UMS_COMPLETION_LIST;\n\ntypedef struct _THREAD_UMS_INFORMATION\n{\n    THREAD_UMS_INFORMATION_COMMAND Command;\n    PRTL_UMS_COMPLETION_LIST CompletionList;\n    PRTL_UMS_CONTEXT UmsContext;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG IsUmsSchedulerThread : 1;\n            ULONG IsUmsWorkerThread : 1;\n            ULONG SpareBits : 30;\n        };\n    };\n} THREAD_UMS_INFORMATION, *PTHREAD_UMS_INFORMATION;\n\n/**\n * The THREAD_NAME_INFORMATION structure assigns a description to a thread.\n *\n * @remarks The handle must have THREAD_SET_LIMITED_INFORMATION access.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreaddescription\n */\ntypedef struct _THREAD_NAME_INFORMATION\n{\n    UNICODE_STRING ThreadName;\n} THREAD_NAME_INFORMATION, *PTHREAD_NAME_INFORMATION;\n\ntypedef struct _ALPC_WORK_ON_BEHALF_TICKET\n{\n    ULONG ThreadId;\n    ULONG ThreadCreationTimeLow;\n} ALPC_WORK_ON_BEHALF_TICKET, *PALPC_WORK_ON_BEHALF_TICKET;\n\ntypedef struct _RTL_WORK_ON_BEHALF_TICKET_EX\n{\n    ALPC_WORK_ON_BEHALF_TICKET Ticket;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG CurrentThread : 1;\n            ULONG Reserved1 : 31;\n        };\n    };\n    ULONG Reserved2;\n} RTL_WORK_ON_BEHALF_TICKET_EX, *PRTL_WORK_ON_BEHALF_TICKET_EX;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\ntypedef enum _SUBSYSTEM_INFORMATION_TYPE\n{\n    SubsystemInformationTypeWin32,\n    SubsystemInformationTypeWSL,\n    MaxSubsystemInformationType\n} SUBSYSTEM_INFORMATION_TYPE;\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\ntypedef enum _THREAD_WORKLOAD_CLASS\n{\n    ThreadWorkloadClassDefault,\n    ThreadWorkloadClassGraphics,\n    MaxThreadWorkloadClass\n} THREAD_WORKLOAD_CLASS;\n\n#if defined(_ARM64_)\n\n#define CONTEXT_ARM   0x00200000L\n\n#define CONTEXT_ARM_CONTROL (CONTEXT_ARM | 0x1L)\n#define CONTEXT_ARM_INTEGER (CONTEXT_ARM | 0x2L)\n#define CONTEXT_ARM_FLOATING_POINT  (CONTEXT_ARM | 0x4L)\n#define CONTEXT_ARM_DEBUG_REGISTERS (CONTEXT_ARM | 0x8L)\n\n#define CONTEXT_ARM_FULL (CONTEXT_ARM_CONTROL | CONTEXT_ARM_INTEGER | CONTEXT_ARM_FLOATING_POINT)\n\n#define CONTEXT_ARM_ALL (CONTEXT_ARM_CONTROL | CONTEXT_ARM_INTEGER | CONTEXT_ARM_FLOATING_POINT | CONTEXT_ARM_DEBUG_REGISTERS)\n\n#define ARM_MAX_BREAKPOINTS     8\n#define ARM_MAX_WATCHPOINTS     1\n\ntypedef struct _ARM_NT_NEON128 {\n    ULONGLONG Low;\n    LONGLONG High;\n} ARM_NT_NEON128, *PARM_NT_NEON128;\n\ntypedef struct DECLSPEC_ALIGN(8) DECLSPEC_NOINITALL _ARM_NT_CONTEXT {\n\n    //\n    // Control flags.\n    //\n\n    DWORD ContextFlags;\n\n    //\n    // Integer registers\n    //\n\n    DWORD R0;\n    DWORD R1;\n    DWORD R2;\n    DWORD R3;\n    DWORD R4;\n    DWORD R5;\n    DWORD R6;\n    DWORD R7;\n    DWORD R8;\n    DWORD R9;\n    DWORD R10;\n    DWORD R11;\n    DWORD R12;\n\n    //\n    // Control Registers\n    //\n\n    DWORD Sp;\n    DWORD Lr;\n    DWORD Pc;\n    DWORD Cpsr;\n\n    //\n    // Floating Point/NEON Registers\n    //\n\n    DWORD Fpscr;\n    DWORD Padding;\n    union {\n        ARM_NT_NEON128 Q[16];\n        ULONGLONG D[32];\n        DWORD S[32];\n    } DUMMYUNIONNAME;\n\n    //\n    // Debug registers\n    //\n\n    DWORD Bvr[ARM_MAX_BREAKPOINTS];\n    DWORD Bcr[ARM_MAX_BREAKPOINTS];\n    DWORD Wvr[ARM_MAX_WATCHPOINTS];\n    DWORD Wcr[ARM_MAX_WATCHPOINTS];\n\n    DWORD Padding2[2];\n\n} ARM_NT_CONTEXT, *PARM_NT_CONTEXT;\n\n#endif // _ARM64_\n\n// private\ntypedef struct _THREAD_INDEX_INFORMATION\n{\n    ULONG Index;\n    ULONG Sequence;\n} THREAD_INDEX_INFORMATION, *PTHREAD_INDEX_INFORMATION;\n\n//\n// Processes\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n/**\n * Creates a new process.\n *\n * @param ProcessHandle A pointer to a handle that receives the process object handle.\n * @param DesiredAccess The access rights desired for the process object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new process.\n * @param ParentProcess A handle to the parent process.\n * @param InheritObjectTable If TRUE, the new process inherits the object table of the parent process.\n * @param SectionHandle Optional. A handle to a section object to be used for the new process.\n * @param DebugPort Optional. A handle to a debug port to be used for the new process.\n * @param TokenHandle Optional. A handle to an access token to be used for the new process.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ParentProcess,\n    _In_ BOOLEAN InheritObjectTable,\n    _In_opt_ HANDLE SectionHandle,\n    _In_opt_ HANDLE DebugPort,\n    _In_opt_ HANDLE TokenHandle\n    );\n\n// begin_rev\n#define PROCESS_CREATE_FLAGS_NONE 0x00000000\n#define PROCESS_CREATE_FLAGS_BREAKAWAY 0x00000001 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT 0x00000002 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_INHERIT_HANDLES 0x00000004 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_OVERRIDE_ADDRESS_SPACE 0x00000008 // NtCreateProcessEx only\n#define PROCESS_CREATE_FLAGS_LARGE_PAGES 0x00000010 // NtCreateProcessEx only (requires SeLockMemoryPrivilege)\n#define PROCESS_CREATE_FLAGS_LARGE_PAGE_SYSTEM_DLL 0x00000020 // NtCreateProcessEx only (requires SeLockMemoryPrivilege)\n#define PROCESS_CREATE_FLAGS_PROTECTED_PROCESS 0x00000040 // NtCreateUserProcess only\n#define PROCESS_CREATE_FLAGS_CREATE_SESSION 0x00000080 // NtCreateProcessEx & NtCreateUserProcess (requires SeLoadDriverPrivilege)\n#define PROCESS_CREATE_FLAGS_INHERIT_FROM_PARENT 0x00000100 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_CREATE_SUSPENDED 0x00000200 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_FORCE_BREAKAWAY 0x00000400 // NtCreateProcessEx & NtCreateUserProcess (requires SeTcbPrivilege)\n#define PROCESS_CREATE_FLAGS_MINIMAL_PROCESS 0x00000800 // NtCreateProcessEx only\n#define PROCESS_CREATE_FLAGS_RELEASE_SECTION 0x00001000 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_CLONE_MINIMAL 0x00002000 // NtCreateProcessEx only\n#define PROCESS_CREATE_FLAGS_CLONE_MINIMAL_REDUCED_COMMIT 0x00004000\n#define PROCESS_CREATE_FLAGS_AUXILIARY_PROCESS 0x00008000 // NtCreateProcessEx & NtCreateUserProcess (requires SeTcbPrivilege)\n#define PROCESS_CREATE_FLAGS_CREATE_STORE 0x00020000 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_USE_PROTECTED_ENVIRONMENT 0x00040000 // NtCreateProcessEx & NtCreateUserProcess\n#define PROCESS_CREATE_FLAGS_IMAGE_EXPANSION_MITIGATION_DISABLE 0x00080000\n#define PROCESS_CREATE_FLAGS_PARTITION_CREATE_SLAB_IDENTITY 0x00400000 // NtCreateProcessEx & NtCreateUserProcess (requires SeLockMemoryPrivilege)\n// end_rev\n\n/**\n * Creates a new process with extended options.\n *\n * @param ProcessHandle A pointer to a handle that receives the process object handle.\n * @param DesiredAccess The access rights desired for the process object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new process.\n * @param ParentProcess A handle to the parent process.\n * @param Flags Flags that control the creation of the process. These flags are defined as PROCESS_CREATE_FLAGS_*.\n * @param SectionHandle Optional. A handle to a section object to be used for the new process.\n * @param DebugPort Optional. A handle to a debug port to be used for the new process.\n * @param TokenHandle Optional. A handle to an access token to be used for the new process.\n * @param Reserved Reserved for future use. Must be zero.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateProcessEx(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ParentProcess,\n    _In_ ULONG Flags, // PROCESS_CREATE_FLAGS_*\n    _In_opt_ HANDLE SectionHandle,\n    _In_opt_ HANDLE DebugPort,\n    _In_opt_ HANDLE TokenHandle,\n    _Reserved_ ULONG Reserved // JobMemberLevel\n    );\n\n/**\n * Opens an existing process object.\n *\n * @param ProcessHandle A pointer to a handle that receives the process object handle.\n * @param DesiredAccess The access rights desired for the process object.\n * @param ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new process.\n * @param ClientId Optional. A pointer to a CLIENT_ID structure that specifies the client ID of the process to be opened.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCLIENT_ID ClientId\n    );\n\n/**\n * Terminates the specified process.\n *\n * @param ProcessHandle Optional. A handle to the process to be terminated. If this parameter is NULL, the calling process is terminated.\n * @param ExitStatus The exit status to be used by the process and the process's termination status.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTerminateProcess(\n    _In_opt_ HANDLE ProcessHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\n/**\n * Suspends the specified process.\n *\n * @param ProcessHandle A handle to the process to be suspended.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSuspendProcess(\n    _In_ HANDLE ProcessHandle\n    );\n\n/**\n * Resumes the specified process.\n *\n * @param ProcessHandle A handle to the process to be resumed.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtResumeProcess(\n    _In_ HANDLE ProcessHandle\n    );\n\n//\n// Macros\n//\n\n#define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1)\n#define ZwCurrentProcess() NtCurrentProcess()\n#define NtCurrentThread() ((HANDLE)(LONG_PTR)-2)\n#define ZwCurrentThread() NtCurrentThread()\n#define NtCurrentSession() ((HANDLE)(LONG_PTR)-3)\n#define ZwCurrentSession() NtCurrentSession()\n\n#define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)\n\n#define NtCurrentProcessId() (NtCurrentTeb()->ClientId.UniqueProcess)\n#define NtCurrentThreadId() (NtCurrentTeb()->ClientId.UniqueThread)\n\n// Windows 8 and above\n#define NtCurrentProcessToken() ((HANDLE)(LONG_PTR)-4) // NtOpenProcessToken(NtCurrentProcess())\n#define NtCurrentThreadToken() ((HANDLE)(LONG_PTR)-5) // NtOpenThreadToken(NtCurrentThread())\n#define NtCurrentThreadEffectiveToken() ((HANDLE)(LONG_PTR)-6) // NtOpenThreadToken(NtCurrentThread()) + NtOpenProcessToken(NtCurrentProcess())\n#define NtCurrentSilo() ((HANDLE)(LONG_PTR)-1)\n\nEXTERN_C CONST IMAGE_DOS_HEADER __ImageBase;\n#define NtCurrentImageBase() ((PIMAGE_DOS_HEADER)&__ImageBase)\n\n#define NtCurrentSessionId() (RtlGetActiveConsoleId()) // USER_SHARED_DATA->ActiveConsoleId\n#define NtCurrentLogonId() (NtCurrentPeb()->LogonId)\n\n/**\n * Retrieves information about the specified process.\n *\n * @param ProcessHandle A handle to the process.\n * @param ProcessInformationClass The type of process information to be retrieved.\n * @param ProcessInformation A pointer to a buffer that receives the process information.\n * @param ProcessInformationLength The size of the buffer pointed to by the ProcessInformation parameter.\n * @param ReturnLength An optional pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWow64QueryInformationProcess64(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n/**\n * Sets information for the specified process.\n *\n * @param ProcessHandle A handle to the process.\n * @param ProcessInformationClass The type of process information to be set.\n * @param ProcessInformation A pointer to a buffer that contains the process information.\n * @param ProcessInformationLength The size of the buffer pointed to by the ProcessInformation parameter.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _In_reads_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength\n    );\n\n#define PROCESS_GET_NEXT_FLAGS_PREVIOUS_PROCESS 0x00000001\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n/**\n * Retrieves a handle to the next process in the system.\n *\n * @param ProcessHandle An optional handle to a process. If this parameter is NULL, the function retrieves the first process in the system.\n * @param DesiredAccess The access rights desired for the new process handle.\n * @param HandleAttributes The attributes for the new process handle.\n * @param Flags Flags that modify the behavior of the function. This can be a combination of the following flags:\n * - \\ref PROCESS_GET_NEXT_FLAGS_PREVIOUS_PROCESS (0x00000001): Retrieve the previous process in the system.\n * @param NewProcessHandle A pointer to a variable that receives the handle to the next process.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetNextProcess(\n    _In_opt_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE NewProcessHandle\n    );\n\n/**\n * Retrieves a handle to the next thread in the system.\n *\n * @param ProcessHandle A handle to the process for enumerateration of threads.\n * @param ThreadHandle An optional handle to a thread. If this parameter is NULL, the function retrieves the first thread in the process.\n * @param DesiredAccess The access rights desired for the new thread handle.\n * @param HandleAttributes The attributes for the new thread handle.\n * @param Flags Flags that modify the behavior of the function. This can be a combination of the following flags:\n * - \\ref THREAD_GET_NEXT_FLAGS_PREVIOUS_THREAD (0x00000001): Retrieve the previous thread in the process.\n * @param NewThreadHandle A pointer to a variable that receives the handle to the next thread.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetNextThread(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE NewThreadHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\n#endif // PHNT_MODE != PHNT_MODE_KERNEL\n\n#define STATECHANGE_SET_ATTRIBUTES 0x0001\n\ntypedef enum _PROCESS_STATE_CHANGE_TYPE\n{\n    ProcessStateChangeSuspend,\n    ProcessStateChangeResume,\n    ProcessStateChangeMax,\n} PROCESS_STATE_CHANGE_TYPE, *PPROCESS_STATE_CHANGE_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * Creates a state change handle for changing the suspension state of a process.\n *\n * @param ProcessStateChangeHandle A pointer to a variable that receives the handle.\n * @param DesiredAccess The access rights desired for the handle.\n * @param ObjectAttributes Optional attributes for the handle.\n * @param ProcessHandle A handle to the process.\n * @param Reserved Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateProcessStateChange(\n    _Out_ PHANDLE ProcessStateChangeHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ _Reserved_ ULONG64 Reserved\n    );\n\n/**\n * Changes the suspension state of a process.\n *\n * @param ProcessStateChangeHandle A handle to the process state change object.\n * @param ProcessHandle A handle to the process.\n * @param StateChangeType The type of state change.\n * @param ExtendedInformation Optional extended information.\n * @param ExtendedInformationLength The length of the extended information.\n * @param Reserved Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtChangeProcessState(\n    _In_ HANDLE ProcessStateChangeHandle,\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESS_STATE_CHANGE_TYPE StateChangeType,\n    _In_opt_ _Reserved_ PVOID ExtendedInformation,\n    _In_opt_ _Reserved_ SIZE_T ExtendedInformationLength,\n    _In_opt_ _Reserved_ ULONG64 Reserved\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\ntypedef enum _THREAD_STATE_CHANGE_TYPE\n{\n    ThreadStateChangeSuspend,\n    ThreadStateChangeResume,\n    ThreadStateChangeMax,\n} THREAD_STATE_CHANGE_TYPE, *PTHREAD_STATE_CHANGE_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * Creates a state change handle for changing the suspension state of a thread.\n *\n * @param ThreadStateChangeHandle A pointer to a variable that receives the handle.\n * @param DesiredAccess The access rights desired for the handle.\n * @param ObjectAttributes Optional attributes for the handle.\n * @param ThreadHandle A handle to the thread.\n * @param Reserved Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateThreadStateChange(\n    _Out_ PHANDLE ThreadStateChangeHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ ULONG64 Reserved\n    );\n\n/**\n * Changes the suspension state of a thread.\n *\n * @param ThreadStateChangeHandle A handle to the thread state change object.\n * @param ThreadHandle A handle to the thread.\n * @param StateChangeType The type of state change.\n * @param ExtendedInformation Optional extended information.\n * @param ExtendedInformationLength The length of the extended information.\n * @param Reserved Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtChangeThreadState(\n    _In_ HANDLE ThreadStateChangeHandle,\n    _In_ HANDLE ThreadHandle,\n    _In_ THREAD_STATE_CHANGE_TYPE StateChangeType,\n    _In_opt_ PVOID ExtendedInformation,\n    _In_opt_ SIZE_T ExtendedInformationLength,\n    _In_opt_ ULONG64 Reserved\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n//\n// Threads\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n/**\n * Creates a new thread in the specified process.\n *\n * @param ThreadHandle A pointer to a handle that receives the thread object handle.\n * @param DesiredAccess The access rights desired for the thread object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @param ProcessHandle A handle to the process in which the thread is to be created.\n * @param ClientId A pointer to a CLIENT_ID structure that receives the client ID of the new thread.\n * @param ThreadContext A pointer to a CONTEXT structure that specifies the initial context of the new thread.\n * @param InitialTeb A pointer to an INITIAL_TEB structure that specifies the initial stack limits of the new thread.\n * @param CreateSuspended If TRUE, the thread is created in a suspended state.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _Out_ PCLIENT_ID ClientId,\n    _In_ PCONTEXT ThreadContext,\n    _In_ PINITIAL_TEB InitialTeb,\n    _In_ BOOLEAN CreateSuspended\n    );\n\n/**\n * Opens an existing thread object.\n *\n * @param ThreadHandle A pointer to a handle that receives the thread object handle.\n * @param DesiredAccess The access rights desired for the thread object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @param ClientId Optional. A pointer to a CLIENT_ID structure that specifies the client ID of the thread to be opened.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCLIENT_ID ClientId\n    );\n\n/**\n * Terminates the specified thread.\n *\n * @param ThreadHandle Optional. A handle to the thread to be terminated. If this parameter is NULL, the calling thread is terminated.\n * @param ExitStatus The exit status to be used by the thread and the thread's termination status.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTerminateThread(\n    _In_opt_ HANDLE ThreadHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\n/**\n * Suspends the specified thread.\n *\n * @param ThreadHandle A handle to the thread to be suspended.\n * @param PreviousSuspendCount Optional. A pointer to a variable that receives the thread's previous suspend count.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSuspendThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\n/**\n * Resumes the specified thread.\n *\n * @param ThreadHandle A handle to the thread to be resumed.\n * @param PreviousSuspendCount Optional. A pointer to a variable that receives the thread's previous suspend count.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtResumeThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n/**\n * Retrieves the number of the current processor.\n *\n * @return ULONG The number of the current processor.\n */\nNTSYSCALLAPI\nULONG\nNTAPI\nNtGetCurrentProcessorNumber(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n/**\n * Retrieves the number of the current processor.\n *\n * @param ProcessorNumber An optional pointer to a PROCESSOR_NUMBER structure that receives the processor number.\n * @return ULONG The number of the current processor.\n */\nNTSYSCALLAPI\nULONG\nNTAPI\nNtGetCurrentProcessorNumberEx(\n    _Out_opt_ PPROCESSOR_NUMBER ProcessorNumber\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n/**\n * Retrieves the context of the specified thread.\n *\n * @param ThreadHandle A handle to the thread.\n * @param ThreadContext A pointer to a CONTEXT structure that receives the thread context.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetContextThread(\n    _In_ HANDLE ThreadHandle,\n    _Inout_ PCONTEXT ThreadContext\n    );\n\n/**\n * Sets the context of the specified thread.\n *\n * @param ThreadHandle A handle to the thread.\n * @param ThreadContext A pointer to a CONTEXT structure that specifies the thread context.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetContextThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ PCONTEXT ThreadContext\n    );\n/**\n * Retrieves information about the specified thread.\n *\n * @param ThreadHandle A handle to the thread.\n * @param ThreadInformationClass The type of thread information to be retrieved.\n * @param ThreadInformation A pointer to a buffer that receives the thread information.\n * @param ThreadInformationLength The size of the buffer pointed to by the ThreadInformation parameter.\n * @param ReturnLength An optional pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ THREADINFOCLASS ThreadInformationClass,\n    _Out_writes_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n/**\n * Sets information for the specified thread.\n *\n * @param ThreadHandle A handle to the thread.\n * @param ThreadInformationClass The type of thread information to be set.\n * @param ThreadInformation A pointer to a buffer that contains the thread information.\n * @param ThreadInformationLength The size of the buffer pointed to by the ThreadInformation parameter.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ THREADINFOCLASS ThreadInformationClass,\n    _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength\n    );\n\n/**\n * Sends an alert to the specified thread.\n *\n * @param ThreadHandle A handle to the thread to be alerted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlertThread(\n    _In_ HANDLE ThreadHandle\n    );\n\n/**\n * Resumes a thread that was previously suspended and sends an alert to it.\n *\n * @param ThreadHandle A handle to the thread to be resumed and alerted.\n * @param PreviousSuspendCount An optional pointer to a variable that receives the thread's previous suspend count.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlertResumeThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\n/**\n * Tests whether the current thread has an alert pending.\n *\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTestAlert(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\n/**\n * Sends an alert to the specified thread.\n *\n * @param ThreadId The thread ID of the thread to be alerted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlertThreadByThreadId(\n    _In_ HANDLE ThreadId\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * Sends an alert to the specified thread by its thread ID, with an optional lock.\n *\n * @param ThreadId The thread ID of the thread to be alerted.\n * @param Lock An optional pointer to an SRW lock to be used during the alert.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlertThreadByThreadIdEx(\n    _In_ HANDLE ThreadId,\n    _In_opt_ PRTL_SRWLOCK Lock\n    );\n\n/**\n * Sends an alert to multiple threads by their thread IDs.\n *\n * @param MultipleThreadId A pointer to an array of thread IDs to be alerted.\n * @param Count The number of thread IDs in the array.\n * @param Boost A pointer to a boost value to be applied to the threads.\n * @param BoostCount The number of boost values in the array.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAlertMultipleThreadByThreadId(\n    _In_ PHANDLE MultipleThreadId,\n    _In_ ULONG Count,\n    _In_ PVOID Boost,\n    _In_ ULONG BoostCount\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\n/**\n * Waits for an alert to be delivered to the specified thread.\n *\n * @param Address The address to wait for an alert on.\n * @param Timeout The timeout value for waiting, or NULL for no timeout.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtWaitForAlertByThreadId(\n    _In_opt_ PVOID Address,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n/**\n * Impersonates a client thread.\n *\n * @param ServerThreadHandle A handle to the server thread.\n * @param ClientThreadHandle A handle to the client thread.\n * @param SecurityQos A pointer to a SECURITY_QUALITY_OF_SERVICE structure that specifies the impersonation level and context tracking mode.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtImpersonateThread(\n    _In_ HANDLE ServerThreadHandle,\n    _In_ HANDLE ClientThreadHandle,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos\n    );\n\n/**\n * Registers a thread termination port.\n *\n * @param PortHandle A handle to the port to be registered.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRegisterThreadTerminatePort(\n    _In_ HANDLE PortHandle\n    );\n\n/**\n * Sets LDT (Local Descriptor Table) entries.\n *\n * @param Selector0 The first selector.\n * @param Entry0Low The low part of the first entry.\n * @param Entry0Hi The high part of the first entry.\n * @param Selector1 The second selector.\n * @param Entry1Low The low part of the second entry.\n * @param Entry1Hi The high part of the second entry.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetLdtEntries(\n    _In_ ULONG Selector0,\n    _In_ ULONG Entry0Low,\n    _In_ ULONG Entry0Hi,\n    _In_ ULONG Selector1,\n    _In_ ULONG Entry1Low,\n    _In_ ULONG Entry1Hi\n    );\n\n/**\n * Dispatches the Asynchronous Procedure Call (APC) from the NtQueueApc* functions to the specified routine.\n *\n * @param ApcRoutine A pointer to the APC routine to be executed.\n * @param Parameter Optional. A pointer to a parameter to be passed to the APC routine.\n * @param ActxContext Optional. A handle to an activation context.\n */\nNTSYSAPI\nVOID\nNTAPI\nRtlDispatchAPC(\n    _In_ PAPCFUNC ApcRoutine,\n    _In_opt_ PVOID Parameter,\n    _In_opt_ HANDLE ActxContext\n    );\n\n/**\n * A pointer to a function that serves as an APC routine.\n *\n * @param ApcArgument1 Optional. A pointer to the first argument to be passed to the APC routine.\n * @param ApcArgument2 Optional. A pointer to the second argument to be passed to the APC routine.\n * @param ApcArgument3 Optional. A pointer to the third argument to be passed to the APC routine.\n */\ntypedef VOID (NTAPI* PPS_APC_ROUTINE)(\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\n/**\n * Encodes an APC routine pointer for use in a WOW64 environment.\n *\n * @param ApcRoutine The APC routine pointer to be encoded.\n * @return PVOID The encoded APC routine pointer.\n */\n#define Wow64EncodeApcRoutine(ApcRoutine) \\\n    ((PVOID)((0 - ((LONG_PTR)(ApcRoutine))) << 2))\n\n/**\n * Decodes an APC routine pointer that was encoded for use in a WOW64 environment.\n *\n * @param ApcRoutine The encoded APC routine pointer to be decoded.\n * @return PVOID The decoded APC routine pointer.\n */\n#define Wow64DecodeApcRoutine(ApcRoutine) \\\n    ((PVOID)(0 - (((LONG_PTR)(ApcRoutine)) >> 2)))\n\n/**\n * Queues an APC (Asynchronous Procedure Call) to a thread.\n *\n * @param ThreadHandle Handle to the thread to which the APC is to be queued.\n * @param ApcRoutine A pointer to the RtlDispatchAPC function or custom APC routine to be executed.\n * @param ApcArgument1 Optional first argument to be passed to the APC routine.\n * @param ApcArgument2 Optional second argument to be passed to the APC routine.\n * @param ApcArgument3 Optional third argument to be passed to the APC routine.\n * @return NTSTATUS Successful or errant status.\n * @remarks The APC will be executed in the context of the specified thread when the thread enters an alertable wait state or when any\n * process calls the NtTestAlert, NtAlertThread, NtAlertResumeThread or NtAlertThreadByThreadId functions.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueueApcThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\n/**\n * A special handle value used to queue a user APC (Asynchronous Procedure Call).\n */\n#define QUEUE_USER_APC_SPECIAL_USER_APC ((HANDLE)0x1)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n/**\n * Queues an APC (Asynchronous Procedure Call) to a thread.\n *\n * @param ThreadHandle Handle to the thread to which the APC is to be queued.\n * @param ReserveHandle Optional handle to a reserve object. This can be QUEUE_USER_APC_SPECIAL_USER_APC or a handle returned by NtAllocateReserveObject.\n * @param ApcRoutine A pointer to the RtlDispatchAPC function or custom APC routine to be executed.\n * @param ApcArgument1 Optional first argument to be passed to the APC routine.\n * @param ApcArgument2 Optional second argument to be passed to the APC routine.\n * @param ApcArgument3 Optional third argument to be passed to the APC routine.\n * @return NTSTATUS Successful or errant status.\n * @remarks The APC will be executed in the context of the specified thread after the thread enters an alertable wait state or immediately\n * when QUEUE_USER_APC_SPECIAL_USER_APC is used or NtTestAlert, NtAlertThread, NtAlertResumeThread or NtAlertThreadByThreadId are called.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueueApcThreadEx(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ HANDLE ReserveHandle, // NtAllocateReserveObject // QUEUE_USER_APC_SPECIAL_USER_APC\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n/**\n * The APC_CALLBACK_DATA_CONTEXT structure is used to pass information to the APC callback routine.\n */\ntypedef struct _APC_CALLBACK_DATA_CONTEXT\n{\n    ULONG_PTR Parameter;\n    PCONTEXT ContextRecord;\n    ULONG_PTR Reserved0;\n    ULONG_PTR Reserved1;\n} APC_CALLBACK_DATA_CONTEXT, *PAPC_CALLBACK_DATA_CONTEXT;\n\n#define QUEUE_USER_APC_FLAGS_NONE 0x00000000\n#define QUEUE_USER_APC_FLAGS_SPECIAL_USER_APC 0x00000001\n#define QUEUE_USER_APC_FLAGS_CALLBACK_DATA_CONTEXT 0x00010000 // APC_CALLBACK_DATA_CONTEXT\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n/**\n * Queues an Asynchronous Procedure Call (APC) to a specified thread.\n *\n * @param ThreadHandle A handle to the thread to which the APC is to be queued.\n * @param ReserveHandle An optional handle to a reserve object. This can be obtained using NtAllocateReserveObject.\n * @param ApcFlags Flags that control the behavior of the APC. These flags are defined in QUEUE_USER_APC_FLAGS.\n * @param ApcRoutine A pointer to the RtlDispatchAPC function or custom APC routine to be executed.\n * @param ApcArgument1 An optional argument to be passed to the APC routine.\n * @param ApcArgument2 An optional argument to be passed to the APC routine.\n * @param ApcArgument3 An optional argument to be passed to the APC routine.\n * @return NTSTATUS Successful or errant status.\n * @remarks The APC will be executed in the context of the specified thread when the thread enters an alertable wait state or immediately\n * when QUEUE_USER_APC_SPECIAL_USER_APC is used or any process calls the NtTestAlert, NtAlertThread,\n * NtAlertResumeThread or NtAlertThreadByThreadId functions.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueueApcThreadEx2(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ HANDLE ReserveHandle, // NtAllocateReserveObject\n    _In_ ULONG ApcFlags, // QUEUE_USER_APC_FLAGS\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#endif // PHNT_MODE != PHNT_MODE_KERNEL\n\n//\n// User processes and threads\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// Attributes (Win32 CreateProcess)\n\n// PROC_THREAD_ATTRIBUTE_NUM (dmex)\n#define ProcThreadAttributeParentProcess 0 // in HANDLE\n#define ProcThreadAttributeExtendedFlags 1 // in ULONG (EXTENDED_PROCESS_CREATION_FLAG_*)\n#define ProcThreadAttributeHandleList 2 // in HANDLE[]\n#define ProcThreadAttributeGroupAffinity 3 // in GROUP_AFFINITY // since WIN7\n#define ProcThreadAttributePreferredNode 4 // in USHORT\n#define ProcThreadAttributeIdealProcessor 5 // in PROCESSOR_NUMBER\n#define ProcThreadAttributeUmsThread 6 // in UMS_CREATE_THREAD_ATTRIBUTES\n#define ProcThreadAttributeMitigationPolicy 7 // in ULONG, ULONG64, or ULONG64[2]\n#define ProcThreadAttributePackageFullName 8 // in WCHAR[] // since WIN8\n#define ProcThreadAttributeSecurityCapabilities 9 // in SECURITY_CAPABILITIES\n#define ProcThreadAttributeConsoleReference 10 // BaseGetConsoleReference (kernelbase.dll)\n#define ProcThreadAttributeProtectionLevel 11 // in ULONG (PROTECTION_LEVEL_*) // since WINBLUE\n#define ProcThreadAttributeOsMaxVersionTested 12 // in MAXVERSIONTESTED_INFO // since THRESHOLD // (from exe.manifest)\n#define ProcThreadAttributeJobList 13 // in HANDLE[]\n#define ProcThreadAttributeChildProcessPolicy 14 // in ULONG (PROCESS_CREATION_CHILD_PROCESS_*) // since THRESHOLD2\n#define ProcThreadAttributeAllApplicationPackagesPolicy 15 // in ULONG (PROCESS_CREATION_ALL_APPLICATION_PACKAGES_*) // since REDSTONE\n#define ProcThreadAttributeWin32kFilter 16 // in WIN32K_SYSCALL_FILTER\n#define ProcThreadAttributeSafeOpenPromptOriginClaim 17 // in SE_SAFE_OPEN_PROMPT_RESULTS\n#define ProcThreadAttributeDesktopAppPolicy 18 // in ULONG (PROCESS_CREATION_DESKTOP_APP_*) // since RS2\n#define ProcThreadAttributeBnoIsolation 19 // in PROC_THREAD_BNOISOLATION_ATTRIBUTE\n#define ProcThreadAttributePseudoConsole 22 // in HANDLE (HPCON) // since RS5\n#define ProcThreadAttributeIsolationManifest 23 // in ISOLATION_MANIFEST_PROPERTIES // rev (diversenok) // since 19H2+\n#define ProcThreadAttributeMitigationAuditPolicy 24 // in ULONG, ULONG64, or ULONG64[2] // since 21H1\n#define ProcThreadAttributeMachineType 25 // in USHORT // since 21H2\n#define ProcThreadAttributeComponentFilter 26 // in ULONG\n#define ProcThreadAttributeEnableOptionalXStateFeatures 27 // in ULONG64 // since WIN11\n#define ProcThreadAttributeCreateStore 28 // ULONG // rev (diversenok)\n#define ProcThreadAttributeTrustedApp 29\n#define ProcThreadAttributeSveVectorLength 30\n\n#ifndef PROC_THREAD_ATTRIBUTE_EXTENDED_FLAGS\n#define PROC_THREAD_ATTRIBUTE_EXTENDED_FLAGS \\\n    ProcThreadAttributeValue(ProcThreadAttributeExtendedFlags, FALSE, TRUE, TRUE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_PACKAGE_FULL_NAME\n#define PROC_THREAD_ATTRIBUTE_PACKAGE_FULL_NAME \\\n    ProcThreadAttributeValue(ProcThreadAttributePackageFullName, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_CONSOLE_REFERENCE\n#define PROC_THREAD_ATTRIBUTE_CONSOLE_REFERENCE \\\n    ProcThreadAttributeValue(ProcThreadAttributeConsoleReference, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_OSMAXVERSIONTESTED\n#define PROC_THREAD_ATTRIBUTE_OSMAXVERSIONTESTED \\\n    ProcThreadAttributeValue(ProcThreadAttributeOsMaxVersionTested, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_SAFE_OPEN_PROMPT_ORIGIN_CLAIM\n#define PROC_THREAD_ATTRIBUTE_SAFE_OPEN_PROMPT_ORIGIN_CLAIM \\\n    ProcThreadAttributeValue(ProcThreadAttributeSafeOpenPromptOriginClaim, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_BNO_ISOLATION\n#define PROC_THREAD_ATTRIBUTE_BNO_ISOLATION \\\n    ProcThreadAttributeValue(ProcThreadAttributeBnoIsolation, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_ISOLATION_MANIFEST\n#define PROC_THREAD_ATTRIBUTE_ISOLATION_MANIFEST \\\n    ProcThreadAttributeValue(ProcThreadAttributeIsolationManifest, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_CREATE_STORE\n#define PROC_THREAD_ATTRIBUTE_CREATE_STORE \\\n    ProcThreadAttributeValue(ProcThreadAttributeCreateStore, FALSE, TRUE, FALSE)\n#endif\n#ifndef PROC_THREAD_ATTRIBUTE_TRUSTED_APP\n#define PROC_THREAD_ATTRIBUTE_TRUSTED_APP \\\n    ProcThreadAttributeValue(ProcThreadAttributeTrustedApp, FALSE, TRUE, FALSE)\n#endif\n\n// private\ntypedef struct _PROC_THREAD_ATTRIBUTE\n{\n    ULONG_PTR Attribute;\n    SIZE_T Size;\n    ULONG_PTR Value;\n} PROC_THREAD_ATTRIBUTE, *PPROC_THREAD_ATTRIBUTE;\n\n/**\n * The PROC_THREAD_ATTRIBUTE_LIST structure contains the list of attributes for process and thread creation.\n */\ntypedef struct _PROC_THREAD_ATTRIBUTE_LIST\n{\n    ULONG PresentFlags;             // A bitmask of flags that indicate the attributes for process and thread creation.\n    ULONG AttributeCount;           // The number of attributes in the list.\n    ULONG LastAttribute;            // The index of the last attribute in the list.\n    ULONG SpareUlong0;              // Reserved for future use.\n    PPROC_THREAD_ATTRIBUTE ExtendedFlagsAttribute; // A pointer to the extended flags attribute.\n    _Field_size_(AttributeCount) PROC_THREAD_ATTRIBUTE Attributes[1]; // An array of attributes.\n} PROC_THREAD_ATTRIBUTE_LIST, *PPROC_THREAD_ATTRIBUTE_LIST;\n\n// private\n#define EXTENDED_PROCESS_CREATION_FLAG_ELEVATION_HANDLED 0x00000001\n#define EXTENDED_PROCESS_CREATION_FLAG_FORCELUA 0x00000002\n#define EXTENDED_PROCESS_CREATION_FLAG_FORCE_BREAKAWAY 0x00000004 // requires SeTcbPrivilege // since WINBLUE\n\n#define PROTECTION_LEVEL_WINTCB_LIGHT       0x00000000\n#define PROTECTION_LEVEL_WINDOWS            0x00000001\n#define PROTECTION_LEVEL_WINDOWS_LIGHT      0x00000002\n#define PROTECTION_LEVEL_ANTIMALWARE_LIGHT  0x00000003\n#define PROTECTION_LEVEL_LSA_LIGHT          0x00000004\n#define PROTECTION_LEVEL_WINTCB             0x00000005\n#define PROTECTION_LEVEL_CODEGEN_LIGHT      0x00000006\n#define PROTECTION_LEVEL_AUTHENTICODE       0x00000007\n#define PROTECTION_LEVEL_PPL_APP            0x00000008\n\n#define PROTECTION_LEVEL_SAME               0xFFFFFFFF\n#define PROTECTION_LEVEL_NONE               0xFFFFFFFE\n\n// private\ntypedef enum _SE_SAFE_OPEN_PROMPT_EXPERIENCE_RESULTS\n{\n    SeSafeOpenExperienceNone = 0x00,\n    SeSafeOpenExperienceCalled = 0x01,\n    SeSafeOpenExperienceAppRepCalled = 0x02,\n    SeSafeOpenExperiencePromptDisplayed = 0x04,\n    SeSafeOpenExperienceUAC = 0x08,\n    SeSafeOpenExperienceUninstaller = 0x10,\n    SeSafeOpenExperienceIgnoreUnknownOrBad = 0x20,\n    SeSafeOpenExperienceDefenderTrustedInstaller = 0x40,\n    SeSafeOpenExperienceMOTWPresent = 0x80,\n    SeSafeOpenExperienceElevatedNoPropagation = 0x100\n} SE_SAFE_OPEN_PROMPT_EXPERIENCE_RESULTS;\n\n// private\ntypedef struct _SE_SAFE_OPEN_PROMPT_RESULTS\n{\n    SE_SAFE_OPEN_PROMPT_EXPERIENCE_RESULTS Results;\n    WCHAR Path[MAX_PATH];\n} SE_SAFE_OPEN_PROMPT_RESULTS, *PSE_SAFE_OPEN_PROMPT_RESULTS;\n\ntypedef struct _PROC_THREAD_BNOISOLATION_ATTRIBUTE\n{\n    BOOL IsolationEnabled;\n    WCHAR IsolationPrefix[0x88];\n} PROC_THREAD_BNOISOLATION_ATTRIBUTE, *PPROC_THREAD_BNOISOLATION_ATTRIBUTE;\n\n// private\ntypedef struct _ISOLATION_MANIFEST_PROPERTIES\n{\n    UNICODE_STRING InstancePath;\n    UNICODE_STRING FriendlyName;\n    UNICODE_STRING Description;\n    ULONG_PTR Level;\n} ISOLATION_MANIFEST_PROPERTIES, *PISOLATION_MANIFEST_PROPERTIES;\n\n// Attributes (Native)\n\n// private\ntypedef enum _PS_ATTRIBUTE_NUM\n{\n    PsAttributeParentProcess, // in HANDLE\n    PsAttributeDebugObject, // in HANDLE\n    PsAttributeToken, // in HANDLE\n    PsAttributeClientId, // out PCLIENT_ID\n    PsAttributeTebAddress, // out PTEB *\n    PsAttributeImageName, // in PWSTR\n    PsAttributeImageInfo, // out PSECTION_IMAGE_INFORMATION\n    PsAttributeMemoryReserve, // in PPS_MEMORY_RESERVE\n    PsAttributePriorityClass, // in UCHAR\n    PsAttributeErrorMode, // in ULONG\n    PsAttributeStdHandleInfo, // 10, in PPS_STD_HANDLE_INFO\n    PsAttributeHandleList, // in HANDLE[]\n    PsAttributeGroupAffinity, // in PGROUP_AFFINITY\n    PsAttributePreferredNode, // in PUSHORT\n    PsAttributeIdealProcessor, // in PPROCESSOR_NUMBER\n    PsAttributeUmsThread, // ? in PUMS_CREATE_THREAD_ATTRIBUTES\n    PsAttributeMitigationOptions, // in PPS_MITIGATION_OPTIONS_MAP (PROCESS_CREATION_MITIGATION_POLICY_*) // since WIN8\n    PsAttributeProtectionLevel, // in PS_PROTECTION // since WINBLUE\n    PsAttributeSecureProcess, // in PPS_TRUSTLET_CREATE_ATTRIBUTES, since THRESHOLD\n    PsAttributeJobList, // in HANDLE[]\n    PsAttributeChildProcessPolicy, // 20, in PULONG (PROCESS_CREATION_CHILD_PROCESS_*) // since THRESHOLD2\n    PsAttributeAllApplicationPackagesPolicy, // in PULONG (PROCESS_CREATION_ALL_APPLICATION_PACKAGES_*) // since REDSTONE\n    PsAttributeWin32kFilter, // in PWIN32K_SYSCALL_FILTER\n    PsAttributeSafeOpenPromptOriginClaim, // in SE_SAFE_OPEN_PROMPT_RESULTS\n    PsAttributeBnoIsolation, // in PPS_BNO_ISOLATION_PARAMETERS // since REDSTONE2\n    PsAttributeDesktopAppPolicy, // in PULONG (PROCESS_CREATION_DESKTOP_APP_*)\n    PsAttributeChpe, // in BOOLEAN // since REDSTONE3\n    PsAttributeMitigationAuditOptions, // in PPS_MITIGATION_AUDIT_OPTIONS_MAP (PROCESS_CREATION_MITIGATION_AUDIT_POLICY_*) // since 21H1\n    PsAttributeMachineType, // in USHORT // since 21H2\n    PsAttributeComponentFilter,\n    PsAttributeEnableOptionalXStateFeatures, // since WIN11\n    PsAttributeSupportedMachines, // since 24H2\n    PsAttributeSveVectorLength, // PPS_PROCESS_CREATION_SVE_VECTOR_LENGTH\n    PsAttributeMax\n} PS_ATTRIBUTE_NUM;\n\n// private\n#define PS_ATTRIBUTE_NUMBER_MASK 0x0000ffff\n#define PS_ATTRIBUTE_THREAD 0x00010000 // may be used with thread creation\n#define PS_ATTRIBUTE_INPUT 0x00020000 // input only\n#define PS_ATTRIBUTE_ADDITIVE 0x00040000 // \"accumulated\" e.g. bitmasks, counters, etc.\n\n// begin_rev\n\n#define PsAttributeValue(Number, Thread, Input, Additive) \\\n    (((Number) & PS_ATTRIBUTE_NUMBER_MASK) | \\\n    ((Thread) ? PS_ATTRIBUTE_THREAD : 0) | \\\n    ((Input) ? PS_ATTRIBUTE_INPUT : 0) | \\\n    ((Additive) ? PS_ATTRIBUTE_ADDITIVE : 0))\n\n#define PS_ATTRIBUTE_PARENT_PROCESS \\\n    PsAttributeValue(PsAttributeParentProcess, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_DEBUG_OBJECT \\\n    PsAttributeValue(PsAttributeDebugObject, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_TOKEN \\\n    PsAttributeValue(PsAttributeToken, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_CLIENT_ID \\\n    PsAttributeValue(PsAttributeClientId, TRUE, FALSE, FALSE)\n#define PS_ATTRIBUTE_TEB_ADDRESS \\\n    PsAttributeValue(PsAttributeTebAddress, TRUE, FALSE, FALSE)\n#define PS_ATTRIBUTE_IMAGE_NAME \\\n    PsAttributeValue(PsAttributeImageName, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_IMAGE_INFO \\\n    PsAttributeValue(PsAttributeImageInfo, FALSE, FALSE, FALSE)\n#define PS_ATTRIBUTE_MEMORY_RESERVE \\\n    PsAttributeValue(PsAttributeMemoryReserve, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_PRIORITY_CLASS \\\n    PsAttributeValue(PsAttributePriorityClass, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_ERROR_MODE \\\n    PsAttributeValue(PsAttributeErrorMode, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_STD_HANDLE_INFO \\\n    PsAttributeValue(PsAttributeStdHandleInfo, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_HANDLE_LIST \\\n    PsAttributeValue(PsAttributeHandleList, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_GROUP_AFFINITY \\\n    PsAttributeValue(PsAttributeGroupAffinity, TRUE, TRUE, FALSE)\n#define PS_ATTRIBUTE_PREFERRED_NODE \\\n    PsAttributeValue(PsAttributePreferredNode, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_IDEAL_PROCESSOR \\\n    PsAttributeValue(PsAttributeIdealProcessor, TRUE, TRUE, FALSE)\n#define PS_ATTRIBUTE_UMS_THREAD \\\n    PsAttributeValue(PsAttributeUmsThread, TRUE, TRUE, FALSE)\n#define PS_ATTRIBUTE_MITIGATION_OPTIONS \\\n    PsAttributeValue(PsAttributeMitigationOptions, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_PROTECTION_LEVEL \\\n    PsAttributeValue(PsAttributeProtectionLevel, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_SECURE_PROCESS \\\n    PsAttributeValue(PsAttributeSecureProcess, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_JOB_LIST \\\n    PsAttributeValue(PsAttributeJobList, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_CHILD_PROCESS_POLICY \\\n    PsAttributeValue(PsAttributeChildProcessPolicy, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_ALL_APPLICATION_PACKAGES_POLICY \\\n    PsAttributeValue(PsAttributeAllApplicationPackagesPolicy, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_WIN32K_FILTER \\\n    PsAttributeValue(PsAttributeWin32kFilter, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_SAFE_OPEN_PROMPT_ORIGIN_CLAIM \\\n    PsAttributeValue(PsAttributeSafeOpenPromptOriginClaim, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_BNO_ISOLATION \\\n    PsAttributeValue(PsAttributeBnoIsolation, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_DESKTOP_APP_POLICY \\\n    PsAttributeValue(PsAttributeDesktopAppPolicy, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_CHPE \\\n    PsAttributeValue(PsAttributeChpe, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_MITIGATION_AUDIT_OPTIONS \\\n    PsAttributeValue(PsAttributeMitigationAuditOptions, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_MACHINE_TYPE \\\n    PsAttributeValue(PsAttributeMachineType, FALSE, TRUE, TRUE)\n#define PS_ATTRIBUTE_COMPONENT_FILTER \\\n    PsAttributeValue(PsAttributeComponentFilter, FALSE, TRUE, FALSE)\n#define PS_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES \\\n    PsAttributeValue(PsAttributeEnableOptionalXStateFeatures, TRUE, TRUE, FALSE)\n\n// end_rev\n\n// begin_private\n\ntypedef struct _PS_ATTRIBUTE\n{\n    ULONG_PTR Attribute;\n    SIZE_T Size;\n    union\n    {\n        ULONG_PTR Value;\n        PVOID ValuePtr;\n    };\n    PSIZE_T ReturnLength;\n} PS_ATTRIBUTE, *PPS_ATTRIBUTE;\n\ntypedef struct _PS_ATTRIBUTE_LIST\n{\n    SIZE_T TotalLength;\n    PS_ATTRIBUTE Attributes[1];\n} PS_ATTRIBUTE_LIST, *PPS_ATTRIBUTE_LIST;\n\ntypedef struct _PS_MEMORY_RESERVE\n{\n    PVOID ReserveAddress;\n    SIZE_T ReserveSize;\n} PS_MEMORY_RESERVE, *PPS_MEMORY_RESERVE;\n\ntypedef enum _PS_STD_HANDLE_STATE\n{\n    PsNeverDuplicate,\n    PsRequestDuplicate, // duplicate standard handles specified by PseudoHandleMask, and only if StdHandleSubsystemType matches the image subsystem\n    PsAlwaysDuplicate, // always duplicate standard handles\n    PsMaxStdHandleStates\n} PS_STD_HANDLE_STATE;\n\n// begin_rev\n#define PS_STD_INPUT_HANDLE 0x1\n#define PS_STD_OUTPUT_HANDLE 0x2\n#define PS_STD_ERROR_HANDLE 0x4\n// end_rev\n\ntypedef struct _PS_STD_HANDLE_INFO\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG StdHandleState : 2; // PS_STD_HANDLE_STATE\n            ULONG PseudoHandleMask : 3; // PS_STD_*\n        };\n    };\n    ULONG StdHandleSubsystemType;\n} PS_STD_HANDLE_INFO, *PPS_STD_HANDLE_INFO;\n\ntypedef union _PS_TRUSTLET_ATTRIBUTE_ACCESSRIGHTS\n{\n    UCHAR Trustlet : 1;\n    UCHAR Ntos : 1;\n    UCHAR WriteHandle : 1;\n    UCHAR ReadHandle : 1;\n    UCHAR Reserved : 4;\n    UCHAR AccessRights;\n} PS_TRUSTLET_ATTRIBUTE_ACCESSRIGHTS, *PPS_TRUSTLET_ATTRIBUTE_ACCESSRIGHTS;\n\ntypedef struct _PS_TRUSTLET_ATTRIBUTE_TYPE\n{\n    union\n    {\n        struct\n        {\n            UCHAR Version;\n            UCHAR DataCount;\n            UCHAR SemanticType;\n            PS_TRUSTLET_ATTRIBUTE_ACCESSRIGHTS AccessRights;\n        };\n        ULONG AttributeType;\n    };\n} PS_TRUSTLET_ATTRIBUTE_TYPE, *PPS_TRUSTLET_ATTRIBUTE_TYPE;\n\ntypedef struct _PS_TRUSTLET_ATTRIBUTE_HEADER\n{\n    PS_TRUSTLET_ATTRIBUTE_TYPE AttributeType;\n    ULONG InstanceNumber : 8;\n    ULONG Reserved : 24;\n} PS_TRUSTLET_ATTRIBUTE_HEADER, *PPS_TRUSTLET_ATTRIBUTE_HEADER;\n\ntypedef struct _PS_TRUSTLET_ATTRIBUTE_DATA\n{\n    PS_TRUSTLET_ATTRIBUTE_HEADER Header;\n    ULONGLONG Data[1];\n} PS_TRUSTLET_ATTRIBUTE_DATA, *PPS_TRUSTLET_ATTRIBUTE_DATA;\n\ntypedef struct _PS_TRUSTLET_CREATE_ATTRIBUTES\n{\n    ULONGLONG TrustletIdentity;\n    PS_TRUSTLET_ATTRIBUTE_DATA Attributes[1];\n} PS_TRUSTLET_CREATE_ATTRIBUTES, *PPS_TRUSTLET_CREATE_ATTRIBUTES;\n\n// private\ntypedef struct _PS_BNO_ISOLATION_PARAMETERS\n{\n    UNICODE_STRING IsolationPrefix;\n    ULONG HandleCount;\n    PVOID *Handles;\n    BOOLEAN IsolationEnabled;\n} PS_BNO_ISOLATION_PARAMETERS, *PPS_BNO_ISOLATION_PARAMETERS;\n\n// private\ntypedef union _PS_PROCESS_CREATION_SVE_VECTOR_LENGTH\n{\n    ULONG VectorLength : 24;\n    ULONG FlagsReserved : 8;\n} PS_PROCESS_CREATION_SVE_VECTOR_LENGTH, *PPS_PROCESS_CREATION_SVE_VECTOR_LENGTH;\n\n// private\ntypedef enum _PS_MITIGATION_OPTION\n{\n    PS_MITIGATION_OPTION_NX,\n    PS_MITIGATION_OPTION_SEHOP,\n    PS_MITIGATION_OPTION_FORCE_RELOCATE_IMAGES,\n    PS_MITIGATION_OPTION_HEAP_TERMINATE,\n    PS_MITIGATION_OPTION_BOTTOM_UP_ASLR,\n    PS_MITIGATION_OPTION_HIGH_ENTROPY_ASLR,\n    PS_MITIGATION_OPTION_STRICT_HANDLE_CHECKS,\n    PS_MITIGATION_OPTION_WIN32K_SYSTEM_CALL_DISABLE,\n    PS_MITIGATION_OPTION_EXTENSION_POINT_DISABLE,\n    PS_MITIGATION_OPTION_PROHIBIT_DYNAMIC_CODE,\n    PS_MITIGATION_OPTION_CONTROL_FLOW_GUARD,\n    PS_MITIGATION_OPTION_BLOCK_NON_MICROSOFT_BINARIES,\n    PS_MITIGATION_OPTION_FONT_DISABLE,\n    PS_MITIGATION_OPTION_IMAGE_LOAD_NO_REMOTE,\n    PS_MITIGATION_OPTION_IMAGE_LOAD_NO_LOW_LABEL,\n    PS_MITIGATION_OPTION_IMAGE_LOAD_PREFER_SYSTEM32,\n    PS_MITIGATION_OPTION_RETURN_FLOW_GUARD,\n    PS_MITIGATION_OPTION_LOADER_INTEGRITY_CONTINUITY,\n    PS_MITIGATION_OPTION_STRICT_CONTROL_FLOW_GUARD,\n    PS_MITIGATION_OPTION_RESTRICT_SET_THREAD_CONTEXT,\n    PS_MITIGATION_OPTION_ROP_STACKPIVOT, // since REDSTONE3\n    PS_MITIGATION_OPTION_ROP_CALLER_CHECK,\n    PS_MITIGATION_OPTION_ROP_SIMEXEC,\n    PS_MITIGATION_OPTION_EXPORT_ADDRESS_FILTER,\n    PS_MITIGATION_OPTION_EXPORT_ADDRESS_FILTER_PLUS,\n    PS_MITIGATION_OPTION_RESTRICT_CHILD_PROCESS_CREATION,\n    PS_MITIGATION_OPTION_IMPORT_ADDRESS_FILTER,\n    PS_MITIGATION_OPTION_MODULE_TAMPERING_PROTECTION,\n    PS_MITIGATION_OPTION_RESTRICT_INDIRECT_BRANCH_PREDICTION,\n    PS_MITIGATION_OPTION_SPECULATIVE_STORE_BYPASS_DISABLE, // since REDSTONE5\n    PS_MITIGATION_OPTION_ALLOW_DOWNGRADE_DYNAMIC_CODE_POLICY,\n    PS_MITIGATION_OPTION_CET_USER_SHADOW_STACKS,\n    PS_MITIGATION_OPTION_USER_CET_SET_CONTEXT_IP_VALIDATION, // since 21H1\n    PS_MITIGATION_OPTION_BLOCK_NON_CET_BINARIES,\n    PS_MITIGATION_OPTION_CET_DYNAMIC_APIS_OUT_OF_PROC_ONLY,\n    PS_MITIGATION_OPTION_REDIRECTION_TRUST, // since 22H1\n    PS_MITIGATION_OPTION_RESTRICT_CORE_SHARING,\n    PS_MITIGATION_OPTION_FSCTL_SYSTEM_CALL_DISABLE, // since 24H2\n} PS_MITIGATION_OPTION;\n\n// windows-internals-book:\"Chapter 5\"\ntypedef enum _PS_CREATE_STATE\n{\n    PsCreateInitialState,\n    PsCreateFailOnFileOpen,\n    PsCreateFailOnSectionCreate,\n    PsCreateFailExeFormat,\n    PsCreateFailMachineMismatch,\n    PsCreateFailExeName, // Debugger specified\n    PsCreateSuccess,\n    PsCreateMaximumStates\n} PS_CREATE_STATE;\n\ntypedef struct _PS_CREATE_INFO\n{\n    SIZE_T Size;\n    PS_CREATE_STATE State;\n    union\n    {\n        // PsCreateInitialState\n        struct\n        {\n            union\n            {\n                ULONG InitFlags;\n                struct\n                {\n                    UCHAR WriteOutputOnExit : 1;\n                    UCHAR DetectManifest : 1;\n                    UCHAR IFEOSkipDebugger : 1;\n                    UCHAR IFEODoNotPropagateKeyState : 1;\n                    UCHAR SpareBits1 : 4;\n                    UCHAR SpareBits2 : 8;\n                    USHORT ProhibitedImageCharacteristics : 16;\n                };\n            };\n            ACCESS_MASK AdditionalFileAccess;\n        } InitState;\n\n        // PsCreateFailOnSectionCreate\n        struct\n        {\n            HANDLE FileHandle;\n        } FailSection;\n\n        // PsCreateFailExeFormat\n        struct\n        {\n            USHORT DllCharacteristics;\n        } ExeFormat;\n\n        // PsCreateFailExeName\n        struct\n        {\n            HANDLE IFEOKey;\n        } ExeName;\n\n        // PsCreateSuccess\n        struct\n        {\n            union\n            {\n                ULONG OutputFlags;\n                struct\n                {\n                    UCHAR ProtectedProcess : 1;\n                    UCHAR AddressSpaceOverride : 1;\n                    UCHAR DevOverrideEnabled : 1; // from Image File Execution Options\n                    UCHAR ManifestDetected : 1;\n                    UCHAR ProtectedProcessLight : 1;\n                    UCHAR SpareBits1 : 3;\n                    UCHAR SpareBits2 : 8;\n                    USHORT SpareBits3 : 16;\n                };\n            };\n            HANDLE FileHandle;\n            HANDLE SectionHandle;\n            ULONGLONG UserProcessParametersNative;\n            ULONG UserProcessParametersWow64;\n            ULONG CurrentParameterFlags;\n            ULONGLONG PebAddressNative;\n            ULONG PebAddressWow64;\n            ULONGLONG ManifestAddress;\n            ULONG ManifestSize;\n        } SuccessState;\n    };\n} PS_CREATE_INFO, *PPS_CREATE_INFO;\n\n// end_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Creates a new process and primary thread.\n *\n * @param ProcessHandle A pointer to a handle that receives the process object handle.\n * @param ThreadHandle A pointer to a handle that receives the thread object handle.\n * @param ProcessDesiredAccess The access rights desired for the process object.\n * @param ThreadDesiredAccess The access rights desired for the thread object.\n * @param ProcessObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new process.\n * @param ThreadObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @param ProcessFlags Flags that control the creation of the process. These flags are defined as PROCESS_CREATE_FLAGS_*.\n * @param ThreadFlags Flags that control the creation of the thread. These flags are defined as THREAD_CREATE_FLAGS_*.\n * @param ProcessParameters Optional. A pointer to a RTL_USER_PROCESS_PARAMETERS structure that specifies the parameters for the new process.\n * @param CreateInfo A pointer to a PS_CREATE_INFO structure that specifies additional information for the process creation.\n * @param AttributeList Optional. A pointer to a list of attributes for the process and thread.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateUserProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK ProcessDesiredAccess,\n    _In_ ACCESS_MASK ThreadDesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ProcessObjectAttributes,\n    _In_opt_ PCOBJECT_ATTRIBUTES ThreadObjectAttributes,\n    _In_ ULONG ProcessFlags, // PROCESS_CREATE_FLAGS_*\n    _In_ ULONG ThreadFlags, // THREAD_CREATE_FLAGS_*\n    _In_opt_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,\n    _Inout_ PPS_CREATE_INFO CreateInfo,\n    _In_opt_ PPS_ATTRIBUTE_LIST AttributeList\n    );\n\n// begin_rev\n#define THREAD_CREATE_FLAGS_NONE 0x00000000\n#define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001 // NtCreateUserProcess & NtCreateThreadEx\n#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002 // NtCreateThreadEx only\n#define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004 // NtCreateThreadEx only\n#define THREAD_CREATE_FLAGS_LOADER_WORKER 0x00000010 // NtCreateThreadEx only // since THRESHOLD\n#define THREAD_CREATE_FLAGS_SKIP_LOADER_INIT 0x00000020 // NtCreateThreadEx only // since REDSTONE2\n#define THREAD_CREATE_FLAGS_BYPASS_PROCESS_FREEZE 0x00000040 // NtCreateThreadEx only // since 19H1\n// end_rev\n\n/**\n * A pointer to a user-defined function that serves as the starting routine for a new thread.\n *\n * @param ThreadParameter A pointer to a variable to be passed to the thread.\n * @return NTSTATUS Successful or errant status.\n */\ntypedef NTSTATUS (NTAPI *PUSER_THREAD_START_ROUTINE)(\n    _In_ PVOID ThreadParameter\n    );\n\n/**\n * Creates a new thread in the specified process.\n *\n * @param ThreadHandle A pointer to a handle that receives the thread object handle.\n * @param DesiredAccess The access rights desired for the thread object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @param ProcessHandle A handle to the process in which the thread is to be created.\n * @param StartRoutine A pointer to the application-defined function to be executed by the thread.\n * @param Argument Optional. A pointer to a variable to be passed to the thread.\n * @param CreateFlags Flags that control the creation of the thread. These flags are defined as THREAD_CREATE_FLAGS_*.\n * @param ZeroBits The number of zero bits in the starting address of the thread's stack.\n * @param StackSize The initial size of the thread's stack, in bytes.\n * @param MaximumStackSize The maximum size of the thread's stack, in bytes.\n * @param AttributeList Optional. A pointer to a list of attributes for the thread.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateThreadEx(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _In_ PUSER_THREAD_START_ROUTINE StartRoutine,\n    _In_opt_ PVOID Argument,\n    _In_ ULONG CreateFlags, // THREAD_CREATE_FLAGS_*\n    _In_ SIZE_T ZeroBits,\n    _In_ SIZE_T StackSize,\n    _In_ SIZE_T MaximumStackSize,\n    _In_opt_ PPS_ATTRIBUTE_LIST AttributeList\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#endif // PHNT_MODE != PHNT_MODE_KERNEL\n\n//\n// Job objects\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// JOBOBJECTINFOCLASS\n// Note: We don't use an enum since it conflicts with the Windows SDK.\n#define JobObjectBasicAccountingInformation 1 // q: JOBOBJECT_BASIC_ACCOUNTING_INFORMATION\n#define JobObjectBasicLimitInformation 2 // q; s: JOBOBJECT_BASIC_LIMIT_INFORMATION\n#define JobObjectBasicProcessIdList 3 // q: JOBOBJECT_BASIC_PROCESS_ID_LIST\n#define JobObjectBasicUIRestrictions 4 // q; s: JOBOBJECT_BASIC_UI_RESTRICTIONS\n#define JobObjectSecurityLimitInformation 5 // JOBOBJECT_SECURITY_LIMIT_INFORMATION\n#define JobObjectEndOfJobTimeInformation 6 // q; s: JOBOBJECT_END_OF_JOB_TIME_INFORMATION\n#define JobObjectAssociateCompletionPortInformation 7 // s: JOBOBJECT_ASSOCIATE_COMPLETION_PORT\n#define JobObjectBasicAndIoAccountingInformation 8 // q: JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION\n#define JobObjectExtendedLimitInformation 9 // q; s: JOBOBJECT_EXTENDED_LIMIT_INFORMATION[V2]\n#define JobObjectJobSetInformation 10 // JOBOBJECT_JOBSET_INFORMATION\n#define JobObjectGroupInformation 11 // USHORT\n#define JobObjectNotificationLimitInformation 12 // JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION\n#define JobObjectLimitViolationInformation 13 // JOBOBJECT_LIMIT_VIOLATION_INFORMATION\n#define JobObjectGroupInformationEx 14 // GROUP_AFFINITY (ARRAY)\n#define JobObjectCpuRateControlInformation 15 // JOBOBJECT_CPU_RATE_CONTROL_INFORMATION\n#define JobObjectCompletionFilter 16 // q; s: ULONG\n#define JobObjectCompletionCounter 17 // q; s: ULONG\n#define JobObjectFreezeInformation 18 // JOBOBJECT_FREEZE_INFORMATION\n#define JobObjectExtendedAccountingInformation 19 // JOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION\n#define JobObjectWakeInformation 20 // JOBOBJECT_WAKE_INFORMATION\n#define JobObjectBackgroundInformation 21\n#define JobObjectSchedulingRankBiasInformation 22\n#define JobObjectTimerVirtualizationInformation 23\n#define JobObjectCycleTimeNotification 24\n#define JobObjectClearEvent 25\n#define JobObjectInterferenceInformation 26 // JOBOBJECT_INTERFERENCE_INFORMATION\n#define JobObjectClearPeakJobMemoryUsed 27\n#define JobObjectMemoryUsageInformation 28 // JOBOBJECT_MEMORY_USAGE_INFORMATION // JOBOBJECT_MEMORY_USAGE_INFORMATION_V2\n#define JobObjectSharedCommit 29\n#define JobObjectContainerId 30 // JOBOBJECT_CONTAINER_IDENTIFIER_V2\n#define JobObjectIoRateControlInformation 31 // JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE, JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2, JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V3\n#define JobObjectNetRateControlInformation 32 // JOBOBJECT_NET_RATE_CONTROL_INFORMATION\n#define JobObjectNotificationLimitInformation2 33 // JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION_2\n#define JobObjectLimitViolationInformation2 34 // JOBOBJECT_LIMIT_VIOLATION_INFORMATION_2\n#define JobObjectCreateSilo 35 // s: NULL\n#define JobObjectSiloBasicInformation 36 // SILOOBJECT_BASIC_INFORMATION\n#define JobObjectSiloRootDirectory 37 // SILOOBJECT_ROOT_DIRECTORY\n#define JobObjectServerSiloBasicInformation 38 // SERVERSILO_BASIC_INFORMATION\n#define JobObjectServerSiloUserSharedData 39 // SILO_USER_SHARED_DATA // NtQueryInformationJobObject(NULL, 39, Buffer, sizeof(SILO_USER_SHARED_DATA), 0);\n#define JobObjectServerSiloInitialize 40 // SERVERSILO_INIT_INFORMATION\n#define JobObjectServerSiloRunningState 41\n#define JobObjectIoAttribution 42 // JOBOBJECT_IO_ATTRIBUTION_INFORMATION\n#define JobObjectMemoryPartitionInformation 43\n#define JobObjectContainerTelemetryId 44 // s: GUID // NtSetInformationJobObject(_In_ PGUID, 44, _In_ PGUID, sizeof(GUID)); // daxexec\n#define JobObjectSiloSystemRoot 45 // s: UNICODE_STRING\n#define JobObjectEnergyTrackingState 46 // JOBOBJECT_ENERGY_TRACKING_STATE\n#define JobObjectThreadImpersonationInformation 47 // q; s: BOOLEAN\n#define JobObjectIoPriorityLimit 48 // JOBOBJECT_IO_PRIORITY_LIMIT\n#define JobObjectPagePriorityLimit 49 // JOBOBJECT_PAGE_PRIORITY_LIMIT\n#define JobObjectServerSiloDiagnosticInformation 50 // SERVERSILO_DIAGNOSTIC_INFORMATION // since 24H2\n#define JobObjectNetworkAccountingInformation 51 // JOBOBJECT_NETWORK_ACCOUNTING_INFORMATION\n#define MaxJobObjectInfoClass 52\n\n// rev // extended limit v2\n#define JOB_OBJECT_LIMIT_SILO_READY 0x00400000\n\n// private\ntypedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION_V2\n{\n    JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;\n    IO_COUNTERS IoInfo;\n    SIZE_T ProcessMemoryLimit;\n    SIZE_T JobMemoryLimit;\n    SIZE_T PeakProcessMemoryUsed;\n    SIZE_T PeakJobMemoryUsed;\n    SIZE_T JobTotalMemoryLimit;\n} JOBOBJECT_EXTENDED_LIMIT_INFORMATION_V2, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION_V2;\n\n// private\ntypedef struct _JOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION\n{\n    JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;\n    IO_COUNTERS IoInfo;\n    PROCESS_DISK_COUNTERS DiskIoInfo;\n    ULONG64 ContextSwitches;\n    LARGE_INTEGER TotalCycleTime;\n    ULONG64 ReadyTime;\n    PROCESS_ENERGY_VALUES EnergyValues;\n} JOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION, *PJOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_WAKE_INFORMATION\n{\n    HANDLE NotificationChannel;\n    ULONG64 WakeCounters[7];\n} JOBOBJECT_WAKE_INFORMATION, *PJOBOBJECT_WAKE_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_WAKE_INFORMATION_V1\n{\n    HANDLE NotificationChannel;\n    ULONG64 WakeCounters[4];\n} JOBOBJECT_WAKE_INFORMATION_V1, *PJOBOBJECT_WAKE_INFORMATION_V1;\n\n// private\ntypedef struct _JOBOBJECT_INTERFERENCE_INFORMATION\n{\n    ULONG64 Count;\n} JOBOBJECT_INTERFERENCE_INFORMATION, *PJOBOBJECT_INTERFERENCE_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_WAKE_FILTER\n{\n    ULONG HighEdgeFilter;\n    ULONG LowEdgeFilter;\n} JOBOBJECT_WAKE_FILTER, *PJOBOBJECT_WAKE_FILTER;\n\n// private\ntypedef struct _JOBOBJECT_FREEZE_INFORMATION\n{\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG FreezeOperation : 1;\n            ULONG FilterOperation : 1;\n            ULONG SwapOperation : 1;\n            ULONG Reserved : 29;\n        };\n    };\n    BOOLEAN Freeze;\n    BOOLEAN Swap;\n    UCHAR Reserved0[2];\n    JOBOBJECT_WAKE_FILTER WakeFilter;\n} JOBOBJECT_FREEZE_INFORMATION, *PJOBOBJECT_FREEZE_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_CONTAINER_IDENTIFIER_V2\n{\n    GUID ContainerId;\n    GUID ContainerTelemetryId;\n    ULONG JobId;\n} JOBOBJECT_CONTAINER_IDENTIFIER_V2, *PJOBOBJECT_CONTAINER_IDENTIFIER_V2;\n\n// private\ntypedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION\n{\n    ULONG64 JobMemory;\n    ULONG64 PeakJobMemoryUsed;\n} JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION_V2\n{\n    JOBOBJECT_MEMORY_USAGE_INFORMATION BasicInfo;\n    ULONG64 JobSharedMemory;\n    ULONG64 Reserved[2];\n} JOBOBJECT_MEMORY_USAGE_INFORMATION_V2, *PJOBOBJECT_MEMORY_USAGE_INFORMATION_V2;\n\n// private\ntypedef struct _SILO_USER_SHARED_DATA\n{\n    ULONG ServiceSessionId;\n    ULONG ActiveConsoleId;\n    LONGLONG ConsoleSessionForegroundProcessId;\n    NT_PRODUCT_TYPE NtProductType;\n    ULONG SuiteMask;\n    ULONG SharedUserSessionId; // since RS2\n    BOOLEAN IsMultiSessionSku;\n    BOOLEAN IsStateSeparationEnabled;\n    WCHAR NtSystemRoot[260];\n    USHORT UserModeGlobalLogger[16];\n    ULONG TimeZoneId; // since 21H2\n    LONG TimeZoneBiasStamp;\n    KSYSTEM_TIME TimeZoneBias;\n    LARGE_INTEGER TimeZoneBiasEffectiveStart;\n    LARGE_INTEGER TimeZoneBiasEffectiveEnd;\n} SILO_USER_SHARED_DATA, *PSILO_USER_SHARED_DATA;\n\n// rev\n#define SILO_OBJECT_ROOT_DIRECTORY_SHADOW_ROOT 0x00000001\n#define SILO_OBJECT_ROOT_DIRECTORY_INITIALIZE 0x00000002\n#define SILO_OBJECT_ROOT_DIRECTORY_SHADOW_DOS_DEVICES 0x00000004\n\n// private\ntypedef struct _SILOOBJECT_ROOT_DIRECTORY\n{\n    union\n    {\n        ULONG ControlFlags; // SILO_OBJECT_ROOT_DIRECTORY_*\n        UNICODE_STRING Path;\n    };\n} SILOOBJECT_ROOT_DIRECTORY, *PSILOOBJECT_ROOT_DIRECTORY;\n\n// private\ntypedef struct _SERVERSILO_INIT_INFORMATION\n{\n    HANDLE DeleteEvent;\n    BOOLEAN IsDownlevelContainer;\n} SERVERSILO_INIT_INFORMATION, *PSERVERSILO_INIT_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_ENERGY_TRACKING_STATE\n{\n    ULONG64 Value;\n    ULONG UpdateMask;\n    ULONG DesiredState;\n} JOBOBJECT_ENERGY_TRACKING_STATE, *PJOBOBJECT_ENERGY_TRACKING_STATE;\n\n// private\ntypedef enum _JOBOBJECT_IO_PRIORITY_LIMIT_FLAGS\n{\n    JOBOBJECT_IO_PRIORITY_LIMIT_ENABLE = 0x1,\n    JOBOBJECT_IO_PRIORITY_LIMIT_VALID_FLAGS = 0x1,\n} JOBOBJECT_IO_PRIORITY_LIMIT_FLAGS;\n\n// private\ntypedef struct _JOBOBJECT_IO_PRIORITY_LIMIT\n{\n    JOBOBJECT_IO_PRIORITY_LIMIT_FLAGS Flags;\n    ULONG Priority;\n} JOBOBJECT_IO_PRIORITY_LIMIT, *PJOBOBJECT_IO_PRIORITY_LIMIT;\n\n// private\ntypedef enum _JOBOBJECT_PAGE_PRIORITY_LIMIT_FLAGS\n{\n    JOBOBJECT_PAGE_PRIORITY_LIMIT_ENABLE = 0x1,\n    JOBOBJECT_PAGE_PRIORITY_LIMIT_VALID_FLAGS = 0x1,\n} JOBOBJECT_PAGE_PRIORITY_LIMIT_FLAGS;\n\n// private\ntypedef struct _JOBOBJECT_PAGE_PRIORITY_LIMIT\n{\n    JOBOBJECT_PAGE_PRIORITY_LIMIT_FLAGS Flags;\n    ULONG Priority;\n} JOBOBJECT_PAGE_PRIORITY_LIMIT, *PJOBOBJECT_PAGE_PRIORITY_LIMIT;\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\n// private\ntypedef struct _SERVERSILO_DIAGNOSTIC_INFORMATION\n{\n    NTSTATUS ExitStatus;\n    WCHAR CriticalProcessName[15];\n} SERVERSILO_DIAGNOSTIC_INFORMATION, *PSERVERSILO_DIAGNOSTIC_INFORMATION;\n\n// private\ntypedef struct _JOBOBJECT_NETWORK_ACCOUNTING_INFORMATION\n{\n    ULONG64 DataBytesIn;\n    ULONG64 DataBytesOut;\n} JOBOBJECT_NETWORK_ACCOUNTING_INFORMATION, *PJOBOBJECT_NETWORK_ACCOUNTING_INFORMATION;\n#endif // !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\n\n/**\n * Creates or opens a job object.\n *\n * @param JobHandle A handle to the job object.\n * @param DesiredAccess The access rights desired for the thread object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateJobObject(\n    _Out_ PHANDLE JobHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * Opens an existing job object.\n *\n * @param JobHandle A handle to the job object.\n * @param DesiredAccess The access rights desired for the thread object.\n * @param ObjectAttributes Optional. A pointer to an OBJECT_ATTRIBUTES structure that specifies the attributes of the new thread.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenJobObject(\n    _Out_ PHANDLE JobHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n/**\n * Assigns a process to an existing job object.\n *\n * @param JobHandle A handle to the job object to which the process will be associated. The handle must have the JOB_OBJECT_ASSIGN_PROCESS access right.\n * @param ProcessHandle A handle to the process to associate with the job object. The handle must have the PROCESS_SET_QUOTA and PROCESS_TERMINATE access rights.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAssignProcessToJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ HANDLE ProcessHandle\n    );\n\n/**\n * Terminates all processes associated with the job object. If the job is nested, all processes currently associated with the job and all child jobs in the hierarchy are terminated.\n *\n * @param JobHandle A handle to the job whose processes will be terminated. The handle must have the JOB_OBJECT_TERMINATE access right.\n * @param ExitStatus The exit status to be used by all processes and threads in the job object.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTerminateJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\n/**\n * Checks if a process is associated with a job object.\n *\n * @param ProcessHandle A handle to the process to be checked.\n * @param JobHandle An optional handle to the job object. If this parameter is NULL, the function checks if the process is associated with any job object.\n * @return NTSTATUS Successful or errant status.\n * @remarks This function can be used to determine if a process is running within a job object, which can be useful for managing process resources and constraints.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtIsProcessInJob(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ HANDLE JobHandle\n    );\n\n/**\n * Retrieves information about a job object.\n *\n * @param JobHandle An optional handle to the job object. If this parameter is NULL, the function retrieves information about the job object associated with the calling process.\n * @param JobObjectInformationClass The type of job object information to be retrieved.\n * @param JobObjectInformation A pointer to a buffer that receives the job object information.\n * @param JobObjectInformationLength The size of the buffer pointed to by the JobObjectInformation parameter.\n * @param ReturnLength An optional pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n * @remarks This function can be used to query various types of information about a job object, such as accounting information, limit information, and process ID list.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationJobObject(\n    _In_opt_ HANDLE JobHandle,\n    _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,\n    _Out_writes_bytes_(JobObjectInformationLength) PVOID JobObjectInformation,\n    _In_ ULONG JobObjectInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n/**\n * Sets information for a job object.\n *\n * @param JobHandle A handle to the job object.\n * @param JobObjectInformationClass The type of job object information to be set.\n * @param JobObjectInformation A pointer to a buffer that contains the job object information.\n * @param JobObjectInformationLength The size of the buffer pointed to by the JobObjectInformation parameter.\n * @return NTSTATUS Successful or errant status.\n * @remarks This function can be used to set various types of information for a job object, such as limit information, UI restrictions, and security limit information.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,\n    _In_reads_bytes_(JobObjectInformationLength) PVOID JobObjectInformation,\n    _In_ ULONG JobObjectInformationLength\n    );\n\n/**\n * Creates a set of job objects.\n *\n * @param NumJob The number of job objects in the set.\n * @param UserJobSet A pointer to an array of JOB_SET_ARRAY structures that specify the job objects in the set.\n * @param Flags Reserved for future use. Must be zero.\n * @return NTSTATUS Successful or errant status.\n * @remarks This function can be used to create a set of job objects, which can be useful for managing groups of related processes.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateJobSet(\n    _In_ ULONG NumJob,\n    _In_reads_(NumJob) PJOB_SET_ARRAY UserJobSet,\n    _In_ ULONG Flags\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRevertContainerImpersonation(\n    VOID\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n//\n// Reserve objects\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n// private\ntypedef enum _MEMORY_RESERVE_TYPE\n{\n    MemoryReserveUserApc,\n    MemoryReserveIoCompletion,\n    MemoryReserveTypeMax\n} MEMORY_RESERVE_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n/**\n * Allocates a memory reserve object.\n *\n * @param MemoryReserveHandle Pointer to a variable that receives the memory reserve object handle.\n * @param ObjectAttributes Pointer to an object attributes structure.\n * @param Type The type of memory reserve.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAllocateReserveObject(\n    _Out_ PHANDLE MemoryReserveHandle,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ MEMORY_RESERVE_TYPE Type\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n//\n// Process snapshotting\n//\n\n// Capture/creation flags.\ntypedef enum _PSSNT_CAPTURE_FLAGS\n{\n    PSSNT_CAPTURE_NONE                                = 0x00000000,\n    PSSNT_CAPTURE_VA_CLONE                            = 0x00000001,\n    PSSNT_CAPTURE_RESERVED_00000002                   = 0x00000002,\n    PSSNT_CAPTURE_HANDLES                             = 0x00000004,\n    PSSNT_CAPTURE_HANDLE_NAME_INFORMATION             = 0x00000008,\n    PSSNT_CAPTURE_HANDLE_BASIC_INFORMATION            = 0x00000010,\n    PSSNT_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION    = 0x00000020,\n    PSSNT_CAPTURE_HANDLE_TRACE                        = 0x00000040,\n    PSSNT_CAPTURE_THREADS                             = 0x00000080,\n    PSSNT_CAPTURE_THREAD_CONTEXT                      = 0x00000100,\n    PSSNT_CAPTURE_THREAD_CONTEXT_EXTENDED             = 0x00000200,\n    PSSNT_CAPTURE_RESERVED_00000400                   = 0x00000400,\n    PSSNT_CAPTURE_VA_SPACE                            = 0x00000800,\n    PSSNT_CAPTURE_VA_SPACE_SECTION_INFORMATION        = 0x00001000,\n    PSSNT_CAPTURE_IPT_TRACE                           = 0x00002000,\n    PSSNT_CAPTURE_RESERVED_00004000                   = 0x00004000,\n\n    PSSNT_CREATE_BREAKAWAY_OPTIONAL                   = 0x04000000,\n    PSSNT_CREATE_BREAKAWAY                            = 0x08000000,\n    PSSNT_CREATE_FORCE_BREAKAWAY                      = 0x10000000,\n    PSSNT_CREATE_USE_VM_ALLOCATIONS                   = 0x20000000,\n    PSSNT_CREATE_MEASURE_PERFORMANCE                  = 0x40000000,\n    PSSNT_CREATE_RELEASE_SECTION                      = 0x80000000\n} PSSNT_CAPTURE_FLAGS;\nDEFINE_ENUM_FLAG_OPERATORS(PSSNT_CAPTURE_FLAGS);\n\ntypedef enum _PSSNT_DUPLICATE_FLAGS\n{\n    PSSNT_DUPLICATE_NONE         = 0x00,\n    PSSNT_DUPLICATE_CLOSE_SOURCE = 0x01\n} PSSNT_DUPLICATE_FLAGS;\nDEFINE_ENUM_FLAG_OPERATORS(PSSNT_DUPLICATE_FLAGS);\n\ntypedef enum _PSSNT_QUERY_INFORMATION_CLASS\n{\n    PSSNT_QUERY_PROCESS_INFORMATION = 0, // PSS_PROCESS_INFORMATION\n    PSSNT_QUERY_VA_CLONE_INFORMATION = 1, // PSS_VA_CLONE_INFORMATION\n    PSSNT_QUERY_AUXILIARY_PAGES_INFORMATION = 2, // PSS_AUXILIARY_PAGES_INFORMATION\n    PSSNT_QUERY_VA_SPACE_INFORMATION = 3, // PSS_VA_SPACE_INFORMATION\n    PSSNT_QUERY_HANDLE_INFORMATION = 4, // PSS_HANDLE_INFORMATION\n    PSSNT_QUERY_THREAD_INFORMATION = 5, // PSS_THREAD_INFORMATION\n    PSSNT_QUERY_HANDLE_TRACE_INFORMATION = 6, // PSS_HANDLE_TRACE_INFORMATION\n    PSSNT_QUERY_PERFORMANCE_COUNTERS = 7 // PSS_PERFORMANCE_COUNTERS\n} PSSNT_QUERY_INFORMATION_CLASS;\n\n#define PSSNT_SIGNATURE_PSSD 'PSSD' // 0x50535344\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\n/**\n * Captures a snapshot of the specified process.\n *\n * @param SnapshotHandle Pointer to a variable that receives the snapshot handle.\n * @param ProcessHandle Handle to the process.\n * @param CaptureFlags Flags indicating what to capture.\n * @param ThreadContextFlags Optional flags for capturing thread context.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nPssNtCaptureSnapshot(\n    _Out_ PHANDLE SnapshotHandle,\n    _In_ HANDLE ProcessHandle,\n    _In_ PSSNT_CAPTURE_FLAGS CaptureFlags,\n    _In_opt_ ULONG ThreadContextFlags\n    );\n\n// rev\n/**\n * Duplicates a process snapshot from one process to another.\n *\n * @param SourceProcessHandle Handle to the source process.\n * @param SnapshotHandle Handle to the snapshot to duplicate.\n * @param TargetProcessHandle Handle to the target process.\n * @param TargetSnapshotHandle Pointer to a variable that receives the duplicated snapshot handle.\n * @param Flags Optional flags for duplication.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nPssNtDuplicateSnapshot(\n    _In_ HANDLE SourceProcessHandle,\n    _In_ HANDLE SnapshotHandle,\n    _In_ HANDLE TargetProcessHandle,\n    _Out_ PHANDLE TargetSnapshotHandle,\n    _In_opt_ PSSNT_DUPLICATE_FLAGS Flags\n    );\n\n// rev\n/**\n * Frees a remote process snapshot.\n *\n * @param ProcessHandle A handle to the process that contains the snapshot. The handle must have PROCESS_VM_READ, PROCESS_VM_OPERATION, and PROCESS_DUP_HANDLE rights.\n * @param SnapshotHandle Handle to the snapshot to free.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nPssNtFreeSnapshot(\n    _In_ HANDLE SnapshotHandle\n    );\n\n// rev\n/**\n * Frees a snapshot.\n *\n * @param SnapshotHandle Handle to the snapshot to free.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nPssNtFreeRemoteSnapshot(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE SnapshotHandle\n    );\n\n// rev\n/**\n * Queries information from a the specified snapshot.\n *\n * @param SnapshotHandle Handle to the snapshot.\n * @param InformationClass The information class to query.\n * @param Buffer Pointer to a buffer that receives the queried information.\n * @param BufferLength Length of the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nPssNtQuerySnapshot(\n    _In_ HANDLE SnapshotHandle,\n    _In_ PSSNT_QUERY_INFORMATION_CLASS InformationClass,\n    _Out_writes_bytes_(BufferLength) PVOID Buffer,\n    _In_ ULONG BufferLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n\n// rev\n/**\n * Flag indicating the type of bulk information to query.\n */\n#define MEMORY_BULK_INFORMATION_FLAG_BASIC 0x00000001\n\n// rev\n/**\n * The NTPSS_MEMORY_BULK_INFORMATION structure is used to query basic memory information in bulk for a process.\n */\ntypedef struct _NTPSS_MEMORY_BULK_INFORMATION\n{\n    ULONG QueryFlags;\n    ULONG NumberOfEntries;\n    PVOID NextValidAddress;\n} NTPSS_MEMORY_BULK_INFORMATION, *PNTPSS_MEMORY_BULK_INFORMATION;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n// rev\n/**\n * Captures virtual address space bulk information for a process.\n *\n * @param ProcessHandle Handle to the process.\n * @param BaseAddress Optional base address to start the capture.\n * @param BulkInformation Pointer to the memory bulk information structure.\n * @param BulkInformationLength Length of the memory bulk information structure.\n * @param ReturnLength Optional pointer to a variable that receives the length of the captured information.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPssCaptureVaSpaceBulk(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ PNTPSS_MEMORY_BULK_INFORMATION BulkInformation,\n    _In_ SIZE_T BulkInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif // _NTPSAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntregapi.h",
    "content": "/*\n * Registry support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTREGAPI_H\n#define _NTREGAPI_H\n\n// Boot condition flags (NtInitializeRegistry)\n\n#define REG_INIT_BOOT_SM 0x0000\n#define REG_INIT_BOOT_SETUP 0x0001\n#define REG_INIT_BOOT_ACCEPTED_BASE 0x0002\n#define REG_INIT_BOOT_ACCEPTED_MAX REG_INIT_BOOT_ACCEPTED_BASE + 999\n\n#define REG_MAX_KEY_VALUE_NAME_LENGTH 32767\n#define REG_MAX_KEY_NAME_LENGTH 512\n\ntypedef enum _KEY_INFORMATION_CLASS\n{\n    KeyBasicInformation, // KEY_BASIC_INFORMATION\n    KeyNodeInformation, // KEY_NODE_INFORMATION\n    KeyFullInformation, // KEY_FULL_INFORMATION\n    KeyNameInformation, // KEY_NAME_INFORMATION\n    KeyCachedInformation, // KEY_CACHED_INFORMATION\n    KeyFlagsInformation, // KEY_FLAGS_INFORMATION\n    KeyVirtualizationInformation, // KEY_VIRTUALIZATION_INFORMATION\n    KeyHandleTagsInformation, // KEY_HANDLE_TAGS_INFORMATION\n    KeyTrustInformation, // KEY_TRUST_INFORMATION\n    KeyLayerInformation, // KEY_LAYER_INFORMATION\n    MaxKeyInfoClass\n} KEY_INFORMATION_CLASS;\n\ntypedef struct _KEY_BASIC_INFORMATION\n{\n    LARGE_INTEGER LastWriteTime;\n    ULONG TitleIndex;\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;\n\ntypedef struct _KEY_NODE_INFORMATION\n{\n    LARGE_INTEGER LastWriteTime;\n    ULONG TitleIndex;\n    ULONG ClassOffset;\n    ULONG ClassLength;\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n    // ...\n    // WCHAR Class[1];\n} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;\n\ntypedef struct _KEY_FULL_INFORMATION\n{\n    LARGE_INTEGER LastWriteTime;\n    ULONG TitleIndex;\n    ULONG ClassOffset;\n    ULONG ClassLength;\n    ULONG SubKeys;\n    ULONG MaxNameLength;\n    ULONG MaxClassLength;\n    ULONG Values;\n    ULONG MaxValueNameLength;\n    ULONG MaxValueDataLength;\n    WCHAR Class[1];\n} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;\n\ntypedef struct _KEY_NAME_INFORMATION\n{\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;\n\ntypedef struct _KEY_CACHED_INFORMATION\n{\n    LARGE_INTEGER LastWriteTime;\n    ULONG TitleIndex;\n    ULONG SubKeys;\n    ULONG MaxNameLength;\n    ULONG Values;\n    ULONG MaxValueNameLength;\n    ULONG MaxValueDataLength;\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION;\n\n// rev\n#define REG_FLAG_VOLATILE 0x0001\n#define REG_FLAG_LINK 0x0002\n\n// msdn\n#define REG_KEY_DONT_VIRTUALIZE 0x0002\n#define REG_KEY_DONT_SILENT_FAIL 0x0004\n#define REG_KEY_RECURSE_FLAG 0x0008\n\n// private\ntypedef struct _KEY_FLAGS_INFORMATION\n{\n    ULONG Wow64Flags;\n    ULONG KeyFlags; // REG_FLAG_*\n    ULONG ControlFlags; // REG_KEY_*\n} KEY_FLAGS_INFORMATION, *PKEY_FLAGS_INFORMATION;\n\n/**\n * The KEY_VIRTUALIZATION_INFORMATION structure contains information about the virtualization state of a key.\n *\n * The flags include:\n * - VirtualizationCandidate: The key is part of the virtualization namespace scope (only HKLM\\Software for now).\n * - VirtualizationEnabled: Virtualization is enabled on this key. Can be 1 only if VirtualizationCandidate is 1.\n * - VirtualTarget: The key is a virtual key. Can be 1 only if VirtualizationCandidate and VirtualizationEnabled are 0. Valid only on the virtual store key handles.\n * - VirtualStore: The key is a part of the virtual store path. Valid only on the virtual store key handles.\n * - VirtualSource: The key has ever been virtualized, can be 1 only if VirtualizationCandidate is 1.\n * - Reserved: Reserved bits.\n */\ntypedef struct _KEY_VIRTUALIZATION_INFORMATION\n{\n    ULONG VirtualizationCandidate : 1;\n    ULONG VirtualizationEnabled : 1;\n    ULONG VirtualTarget : 1;\n    ULONG VirtualStore : 1;\n    ULONG VirtualSource : 1;\n    ULONG Reserved : 27;\n} KEY_VIRTUALIZATION_INFORMATION, *PKEY_VIRTUALIZATION_INFORMATION;\n\n// private\n/**\n * The KEY_TRUST_INFORMATION structure contains information about the trust status of a key.\n *\n * The flags include:\n * - TrustedKey: Indicates whether the key is trusted. When set, this flag signifies that the key is considered\n *   to be secure and reliable.\n * - Reserved: Reserved bits.\n */\ntypedef struct _KEY_TRUST_INFORMATION\n{\n    ULONG TrustedKey : 1;\n    ULONG Reserved : 31;\n} KEY_TRUST_INFORMATION, *PKEY_TRUST_INFORMATION;\n\n// private\n/**\n * The KEY_LAYER_INFORMATION structure contains information about a key layer.\n *\n * The flags include:\n * - IsTombstone: Indicates whether the key layer is a tombstone. A tombstone is a marker that indicates\n *   that the key has been deleted but not yet purged from the registry. It is used to maintain the\n *   integrity of the registry and ensure that deleted keys are not immediately reused.\n * - IsSupersedeLocal: Indicates whether the key layer supersedes the local key. When set, this flag\n *   indicates that the key layer should replace the local key's information, effectively overriding\n *   any local changes or settings.\n * - IsSupersedeTree: Indicates whether the key layer supersedes the entire key tree. When set, this flag\n *   indicates that the key layer should replace the entire subtree of keys, overriding any changes or\n *   settings in the subtree.\n * - ClassIsInherited: Indicates whether the key layer's class is inherited. When set, this flag indicates\n *   that the class information of the key layer is inherited from its parent key, rather than being\n *   explicitly defined.\n * - Reserved: Reserved bits.\n */\ntypedef struct _KEY_LAYER_INFORMATION\n{\n    ULONG IsTombstone : 1;\n    ULONG IsSupersedeLocal : 1;\n    ULONG IsSupersedeTree : 1;\n    ULONG ClassIsInherited : 1;\n    ULONG Reserved : 28;\n} KEY_LAYER_INFORMATION, *PKEY_LAYER_INFORMATION;\n\ntypedef enum _KEY_SET_INFORMATION_CLASS\n{\n    KeyWriteTimeInformation, // KEY_WRITE_TIME_INFORMATION\n    KeyWow64FlagsInformation, // KEY_WOW64_FLAGS_INFORMATION\n    KeyControlFlagsInformation, // KEY_CONTROL_FLAGS_INFORMATION\n    KeySetVirtualizationInformation, // KEY_SET_VIRTUALIZATION_INFORMATION\n    KeySetDebugInformation,\n    KeySetHandleTagsInformation, // KEY_HANDLE_TAGS_INFORMATION\n    KeySetLayerInformation, // KEY_SET_LAYER_INFORMATION\n    MaxKeySetInfoClass\n} KEY_SET_INFORMATION_CLASS;\n\n/**\n * Structure representing the last write time of a registry key.\n *\n * The values include:\n * - LastWriteTime: Contains the timestamp of the last write operation performed on a registry key.\n */\ntypedef struct _KEY_WRITE_TIME_INFORMATION\n{\n    LARGE_INTEGER LastWriteTime;\n} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;\n\n/**\n * The KEY_WOW64_FLAGS_INFORMATION structure contains information about the WOW64 flags for a key.\n *\n * The fields include:\n * - UserFlags: A set of user-defined flags associated with the key. These flags are used to store\n *   additional information about the key in the context of WOW64 (Windows 32-bit on Windows 64-bit).\n */\ntypedef struct _KEY_WOW64_FLAGS_INFORMATION\n{\n    ULONG UserFlags;\n} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;\n\n/**\n * The KEY_HANDLE_TAGS_INFORMATION structure contains information about the handle tags for a key.\n *\n * The fields include:\n * - HandleTags: A set of tags associated with the key handle. These tags are used to store additional\n *   metadata or state information about the key handle.\n */\ntypedef struct _KEY_HANDLE_TAGS_INFORMATION\n{\n    ULONG HandleTags;\n} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;\n\n/**\n * The KEY_SET_LAYER_INFORMATION structure contains information about a key layer.\n *\n * The flags include:\n * - IsTombstone: Indicates whether the key layer is a tombstone. A tombstone is a marker that indicates\n *   that the key has been deleted but not yet purged from the registry. It is used to maintain the\n *   integrity of the registry and ensure that deleted keys are not immediately reused.\n * - IsSupersedeLocal: Indicates whether the key layer supersedes the local key. When set, this flag\n *   indicates that the key layer should replace the local key's information, effectively overriding\n *   any local changes or settings.\n * - IsSupersedeTree: Indicates whether the key layer supersedes the entire key tree. When set, this flag\n *   indicates that the key layer should replace the entire subtree of keys, overriding any changes or\n *   settings in the subtree.\n * - ClassIsInherited: Indicates whether the key layer's class is inherited. When set, this flag indicates\n *   that the class information of the key layer is inherited from its parent key, rather than being\n *   explicitly defined.\n * - Reserved: Reserved bits.\n */\ntypedef struct _KEY_SET_LAYER_INFORMATION\n{\n    ULONG IsTombstone : 1;\n    ULONG IsSupersedeLocal : 1;\n    ULONG IsSupersedeTree : 1;\n    ULONG ClassIsInherited : 1;\n    ULONG Reserved : 28;\n} KEY_SET_LAYER_INFORMATION, *PKEY_SET_LAYER_INFORMATION;\n\n/**\n * The KEY_CONTROL_FLAGS_INFORMATION structure contains control flags for a key.\n *\n * The fields include:\n * - ControlFlags: A set of control flags associated with the key. These flags are used to store\n *   additional control information about the key, which can affect its behavior or state.\n */\ntypedef struct _KEY_CONTROL_FLAGS_INFORMATION\n{\n    ULONG ControlFlags;\n} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;\n\ntypedef struct _KEY_SET_VIRTUALIZATION_INFORMATION\n{\n    ULONG VirtualTarget : 1;\n    ULONG VirtualStore : 1;\n    ULONG VirtualSource : 1; // true if key has been virtualized at least once\n    ULONG Reserved : 29;\n} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;\n\ntypedef enum _KEY_VALUE_INFORMATION_CLASS\n{\n    KeyValueBasicInformation, // KEY_VALUE_BASIC_INFORMATION\n    KeyValueFullInformation, // KEY_VALUE_FULL_INFORMATION\n    KeyValuePartialInformation, // KEY_VALUE_PARTIAL_INFORMATION\n    KeyValueFullInformationAlign64,\n    KeyValuePartialInformationAlign64,  // KEY_VALUE_PARTIAL_INFORMATION_ALIGN64\n    KeyValueLayerInformation, // KEY_VALUE_LAYER_INFORMATION\n    MaxKeyValueInfoClass\n} KEY_VALUE_INFORMATION_CLASS;\n\ntypedef struct _KEY_VALUE_BASIC_INFORMATION\n{\n    ULONG TitleIndex;\n    ULONG Type;\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;\n\ntypedef struct _KEY_VALUE_FULL_INFORMATION\n{\n    ULONG TitleIndex;\n    ULONG Type;\n    ULONG DataOffset;\n    ULONG DataLength;\n    ULONG NameLength;\n    _Field_size_bytes_(NameLength) WCHAR Name[1];\n    // ...\n    // UCHAR Data[1];\n} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;\n\ntypedef struct _KEY_VALUE_PARTIAL_INFORMATION\n{\n    ULONG TitleIndex;\n    ULONG Type;\n    ULONG DataLength;\n    _Field_size_bytes_(DataLength) UCHAR Data[1];\n} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;\n\ntypedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64\n{\n    ULONG Type;\n    ULONG DataLength;\n    _Field_size_bytes_(DataLength) UCHAR Data[1];\n} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;\n\n// private\ntypedef struct _KEY_VALUE_LAYER_INFORMATION\n{\n    ULONG IsTombstone : 1;\n    ULONG Reserved : 31;\n} KEY_VALUE_LAYER_INFORMATION, *PKEY_VALUE_LAYER_INFORMATION;\n\n// private\ntypedef enum _CM_EXTENDED_PARAMETER_TYPE\n{\n  CmExtendedParameterInvalidType,\n  CmExtendedParameterTrustClassKey,\n  CmExtendedParameterEvent,\n  CmExtendedParameterFileAccessToken,\n  CmExtendedParameterMax,\n} CM_EXTENDED_PARAMETER_TYPE;\n\n#define CM_EXTENDED_PARAMETER_TYPE_BITS 8\n\n// private\ntypedef struct DECLSPEC_ALIGN(8) _CM_EXTENDED_PARAMETER\n{\n    struct\n    {\n        ULONG64 Type : CM_EXTENDED_PARAMETER_TYPE_BITS;\n        ULONG64 Reserved : 64 - CM_EXTENDED_PARAMETER_TYPE_BITS;\n    };\n\n    union\n    {\n        ULONG64 ULong64;\n        PVOID Pointer;\n        SIZE_T Size;\n        HANDLE Handle;\n        ULONG ULong;\n        ACCESS_MASK AccessMask;\n    };\n} CM_EXTENDED_PARAMETER, *PCM_EXTENDED_PARAMETER;\n\ntypedef struct _KEY_VALUE_ENTRY\n{\n    PUNICODE_STRING ValueName;\n    ULONG DataLength;\n    ULONG DataOffset;\n    ULONG Type;\n} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;\n\ntypedef enum _REG_ACTION\n{\n    KeyAdded,\n    KeyRemoved,\n    KeyModified\n} REG_ACTION;\n\ntypedef struct _REG_NOTIFY_INFORMATION\n{\n    ULONG NextEntryOffset;\n    REG_ACTION Action;\n    ULONG KeyLength;\n    _Field_size_bytes_(KeyLength) WCHAR Key[1];\n} REG_NOTIFY_INFORMATION, *PREG_NOTIFY_INFORMATION;\n\ntypedef struct _KEY_PID_ARRAY\n{\n    HANDLE ProcessId;\n    UNICODE_STRING KeyName;\n} KEY_PID_ARRAY, *PKEY_PID_ARRAY;\n\ntypedef struct _KEY_OPEN_SUBKEYS_INFORMATION\n{\n    ULONG Count;\n    KEY_PID_ARRAY KeyArray[1];\n} KEY_OPEN_SUBKEYS_INFORMATION, *PKEY_OPEN_SUBKEYS_INFORMATION;\n\n//\n// Virtualization // since REDSTONE\n//\n\n// rev\n#define VR_DEVICE_NAME L\"\\\\Device\\\\VRegDriver\"\n\n// rev\n#define IOCTL_VR_INITIALIZE_JOB_FOR_VREG            CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_INITIALIZE_JOB_FOR_VREG\n#define IOCTL_VR_LOAD_DIFFERENCING_HIVE             CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_LOAD_DIFFERENCING_HIVE\n#define IOCTL_VR_CREATE_NAMESPACE_NODE              CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_CREATE_NAMESPACE_NODE\n#define IOCTL_VR_MODIFY_FLAGS                       CTL_CODE(FILE_DEVICE_UNKNOWN, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_MODIFY_FLAGS\n#define IOCTL_VR_CREATE_MULTIPLE_NAMESPACE_NODES    CTL_CODE(FILE_DEVICE_UNKNOWN, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_CREATE_MULTIPLE_NAMESPACE_NODES\n#define IOCTL_VR_UNLOAD_DYNAMICALLY_LOADED_HIVES    CTL_CODE(FILE_DEVICE_UNKNOWN, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_UNLOAD_DYNAMICALLY_LOADED_HIVES\n#define IOCTL_VR_GET_VIRTUAL_ROOT_KEY               CTL_CODE(FILE_DEVICE_UNKNOWN, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_GET_VIRTUAL_ROOT; out: VR_GET_VIRTUAL_ROOT_RESULT\n#define IOCTL_VR_LOAD_DIFFERENCING_HIVE_FOR_HOST    CTL_CODE(FILE_DEVICE_UNKNOWN, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_LOAD_DIFFERENCING_HIVE_FOR_HOST\n#define IOCTL_VR_UNLOAD_DIFFERENCING_HIVE_FOR_HOST  CTL_CODE(FILE_DEVICE_UNKNOWN, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) // in: VR_UNLOAD_DIFFERENCING_HIVE_FOR_HOST\n\n// private\ntypedef struct _VR_INITIALIZE_JOB_FOR_VREG\n{\n    HANDLE Job;\n} VR_INITIALIZE_JOB_FOR_VREG, *PVR_INITIALIZE_JOB_FOR_VREG;\n\n// rev\n#define VR_FLAG_INHERIT_TRUST_CLASS 0x00000001\n#define VR_FLAG_WRITE_THROUGH_HIVE 0x00000002 // since REDSTONE2\n#define VR_FLAG_LOCAL_MACHINE_TRUST_CLASS 0x00000004 // since 21H1\n\n// rev + private\ntypedef struct _VR_LOAD_DIFFERENCING_HIVE\n{\n    HANDLE Job;\n    ULONG NextLayerIsHost;\n    ULONG Flags; // VR_FLAG_*\n    ULONG LoadFlags; // NtLoadKeyEx flags\n    USHORT KeyPathLength;\n    USHORT HivePathLength;\n    USHORT NextLayerKeyPathLength;\n    HANDLE FileAccessToken; // since 20H1\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // ...\n    // WCHAR KeyPath[1];\n    // WCHAR HivePath[1];\n    // WCHAR NextLayerKeyPath[1];\n} VR_LOAD_DIFFERENCING_HIVE, *PVR_LOAD_DIFFERENCING_HIVE;\n\n// rev + private\ntypedef struct _VR_CREATE_NAMESPACE_NODE\n{\n    HANDLE Job;\n    USHORT ContainerPathLength;\n    USHORT HostPathLength;\n    ULONG Flags;\n    ACCESS_MASK AccessMask; // since 20H1\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // ...\n    // WCHAR ContainerPath[1];\n    // WCHAR HostPath[1];\n} VR_CREATE_NAMESPACE_NODE, *PVR_CREATE_NAMESPACE_NODE;\n\n// private\ntypedef struct _VR_MODIFY_FLAGS\n{\n    HANDLE Job;\n    ULONG AddFlags;\n    ULONG RemoveFlags;\n} VR_MODIFY_FLAGS, *PVR_MODIFY_FLAGS;\n\n// private\ntypedef struct _NAMESPACE_NODE_DATA\n{\n    ACCESS_MASK AccessMask;\n    USHORT ContainerPathLength;\n    USHORT HostPathLength;\n    ULONG Flags;\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // ...\n    // WCHAR ContainerPath[1];\n    // WCHAR HostPath[1];\n} NAMESPACE_NODE_DATA, *PNAMESPACE_NODE_DATA;\n\n// private\ntypedef struct _VR_CREATE_MULTIPLE_NAMESPACE_NODES\n{\n    HANDLE Job;\n    ULONG NumNewKeys;\n    NAMESPACE_NODE_DATA Keys[1];\n} VR_CREATE_MULTIPLE_NAMESPACE_NODES, *PVR_CREATE_MULTIPLE_NAMESPACE_NODES;\n\n// private\ntypedef struct _VR_UNLOAD_DYNAMICALLY_LOADED_HIVES\n{\n    HANDLE Job;\n} VR_UNLOAD_DYNAMICALLY_LOADED_HIVES, *PVR_UNLOAD_DYNAMICALLY_LOADED_HIVES;\n\n// rev\n#define VR_KEY_COMROOT 0          // \\Registry\\ComRoot\\Classes\n#define VR_KEY_MACHINE_SOFTWARE 1 // \\Registry\\Machine\\Software // since REDSTONE2\n#define VR_KEY_CONTROL_SET 2      // \\Registry\\Machine\\System\\ControlSet001 // since REDSTONE2\n\n// rev\ntypedef struct _VR_GET_VIRTUAL_ROOT\n{\n    HANDLE Job;\n    ULONG Index; // VR_KEY_* // since REDSTONE2\n} VR_GET_VIRTUAL_ROOT, *PVR_GET_VIRTUAL_ROOT;\n\n// rev\ntypedef struct _VR_GET_VIRTUAL_ROOT_RESULT\n{\n    HANDLE Key;\n} VR_GET_VIRTUAL_ROOT_RESULT, *PVR_GET_VIRTUAL_ROOT_RESULT;\n\n// rev\ntypedef struct _VR_LOAD_DIFFERENCING_HIVE_FOR_HOST\n{\n    ULONG LoadFlags; // NtLoadKeyEx flags\n    ULONG Flags; // VR_FLAG_* // since REDSTONE2\n    USHORT KeyPathLength;\n    USHORT HivePathLength;\n    USHORT NextLayerKeyPathLength;\n    HANDLE FileAccessToken; // since 20H1\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // ...\n    // WCHAR KeyPath[1];\n    // WCHAR HivePath[1];\n    // WCHAR NextLayerKeyPath[1];\n} VR_LOAD_DIFFERENCING_HIVE_FOR_HOST, *PVR_LOAD_DIFFERENCING_HIVE_FOR_HOST;\n\n// rev\ntypedef struct _VR_UNLOAD_DIFFERENCING_HIVE_FOR_HOST\n{\n    ULONG Reserved;\n    USHORT TargetKeyPathLength;\n    WCHAR TargetKeyPath[ANYSIZE_ARRAY];\n} VR_UNLOAD_DIFFERENCING_HIVE_FOR_HOST, *PVR_UNLOAD_DIFFERENCING_HIVE_FOR_HOST;\n\n//\n// Key Open/Create Options\n//\n#define REG_OPTION_RESERVED             (0x00000000L)   // Parameter is reserved.\n#define REG_OPTION_NON_VOLATILE         (0x00000000L)   // Key is preserved when system is rebooted.\n#define REG_OPTION_VOLATILE             (0x00000001L)   // Key is not preserved when system is rebooted\n#define REG_OPTION_CREATE_LINK          (0x00000002L)   // Created key is a symbolic link\n#define REG_OPTION_BACKUP_RESTORE       (0x00000004L)   // open for backup or restore special access rules privilege required\n#define REG_OPTION_OPEN_LINK            (0x00000008L)   // Open symbolic link\n#define REG_OPTION_DONT_VIRTUALIZE      (0x00000010L)   // Disable Open/Read/Write virtualization for this open and the resulting handle.\n\n#ifndef REG_LEGAL_OPTION\n#define REG_LEGAL_OPTION \\\n    (REG_OPTION_RESERVED | REG_OPTION_NON_VOLATILE |\\\n     REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK |\\\n     REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK |\\\n     REG_OPTION_DONT_VIRTUALIZE)\n#endif\n\n#ifndef REG_OPEN_LEGAL_OPTION\n#define REG_OPEN_LEGAL_OPTION \\\n    (REG_OPTION_RESERVED | REG_OPTION_BACKUP_RESTORE | \\\n     REG_OPTION_OPEN_LINK | REG_OPTION_DONT_VIRTUALIZE)\n#endif\n\n//\n// Key creation/open disposition\n//\n#define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created\n#define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened\n\n//\n// hive format to be used by Reg(Nt)SaveKeyEx\n//\n#define REG_STANDARD_FORMAT     1\n#define REG_LATEST_FORMAT       2\n#define REG_NO_COMPRESSION      4\n\n//\n// Key restore & hive load flags\n//\n#define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)   // Restore whole hive volatile\n#define REG_REFRESH_HIVE                (0x00000002L)   // Unwind changes to last flush\n#define REG_NO_LAZY_FLUSH               (0x00000004L)   // Never lazy flush this hive\n#define REG_FORCE_RESTORE               (0x00000008L)   // Force the restore process even when we have open handles on subkeys\n#define REG_APP_HIVE                    (0x00000010L)   // Loads the hive visible to the calling process\n#define REG_PROCESS_PRIVATE             (0x00000020L)   // Hive cannot be mounted by any other process while in use\n#define REG_START_JOURNAL               (0x00000040L)   // Starts Hive Journal\n#define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)   // Grow hive file in exact 4k increments\n#define REG_HIVE_NO_RM                  (0x00000100L)   // No RM is started for this hive (no transactions)\n#define REG_HIVE_SINGLE_LOG             (0x00000200L)   // Legacy single logging is used for this hive\n#define REG_BOOT_HIVE                   (0x00000400L)   // This hive might be used by the OS loader\n#define REG_LOAD_HIVE_OPEN_HANDLE       (0x00000800L)   // Load the hive and return a handle to its root kcb\n#define REG_FLUSH_HIVE_FILE_GROWTH      (0x00001000L)   // Flush changes to primary hive file size as part of all flushes\n#define REG_OPEN_READ_ONLY              (0x00002000L)   // Open a hive's files in read-only mode\n#define REG_IMMUTABLE                   (0x00004000L)   // Load the hive, but don't allow any modification of it\n#define REG_NO_IMPERSONATION_FALLBACK   (0x00008000L)   // Do not fall back to impersonating the caller if hive file access fails\n#define REG_APP_HIVE_OPEN_READ_ONLY     (REG_OPEN_READ_ONLY)   // Open an app hive's files in read-only mode (if the hive was not previously loaded)\n\n//\n// Unload Flags\n//\n#define REG_FORCE_UNLOAD            1\n#define REG_UNLOAD_LEGAL_FLAGS      (REG_FORCE_UNLOAD)\n\n/**\n * Creates a new registry key routine or opens an existing one.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param[in] TitleIndex Reserved.\n * @param[in, optional] Class A pointer to a UNICODE_STRING structure that specifies the class of the key.\n * @param[in] CreateOptions The options to use when creating the key.\n * @param[out, optional] Disposition A pointer to a variable that receives the disposition value.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateKey(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG TitleIndex,\n    _In_opt_ PCUNICODE_STRING Class,\n    _In_ ULONG CreateOptions,\n    _Out_opt_ PULONG Disposition\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Creates a new registry key or opens an existing one, and it associates the key with a transaction.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param[in] TitleIndex Reserved.\n * @param[in, optional] Class A pointer to a UNICODE_STRING structure that specifies the class of the key.\n * @param[in] CreateOptions The options to use when creating the key.\n * @param[in] TransactionHandle A handle to the transaction.\n * @param[out, optional] Disposition A pointer to a variable that receives the disposition value.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateKeyTransacted(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG TitleIndex,\n    _In_opt_ PCUNICODE_STRING Class,\n    _In_ ULONG CreateOptions,\n    _In_ HANDLE TransactionHandle,\n    _Out_opt_ PULONG Disposition\n    );\n#endif\n\n/**\n * Opens an existing registry key.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @return NTSTATUS Successful or errant status.\n * @remarks NtOpenKey ignores the security information in the ObjectAttributes structure.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenKey(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Opens an existing registry key and associates the key with a transaction.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param[in] TransactionHandle A handle to the transaction.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenKeyTransacted(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE TransactionHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n/**\n * Opens an existing registry key with extended options.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param[in] OpenOptions The options to use when opening the key.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenKeyEx(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG OpenOptions\n    );\n\n/**\n * Opens an existing registry key in a transaction with extended options.\n *\n * @param[out] KeyHandle A pointer to a handle that receives the key handle.\n * @param[in] DesiredAccess The access mask that specifies the desired access rights.\n * @param[in] ObjectAttributes A pointer to an OBJECT_ATTRIBUTES structure that specifies the object attributes.\n * @param[in] OpenOptions The options to use when opening the key.\n * @param[in] TransactionHandle A handle to the transaction.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenKeyTransactedEx(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG OpenOptions,\n    _In_ HANDLE TransactionHandle\n    );\n#endif\n\n/**\n * Deletes a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be deleted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteKey(\n    _In_ HANDLE KeyHandle\n    );\n\n/**\n * Renames a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be renamed.\n * @param[in] NewName A pointer to a UNICODE_STRING structure that specifies the new name of the key.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRenameKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING NewName\n    );\n\n/**\n * Deletes a value from a registry key.\n *\n * @param[in] KeyHandle A handle to the key that contains the value to be deleted.\n * @param[in] ValueName A pointer to a UNICODE_STRING structure that specifies the name of the value to be deleted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName\n    );\n\n/**\n * Queries information about a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be queried.\n * @param[in] KeyInformationClass The type of information to be queried.\n * @param[out] KeyInformation A pointer to a buffer that receives the key information.\n * @param[in] Length The size of the buffer.\n * @param[out] ResultLength A pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryKey(\n    _In_ HANDLE KeyHandle,\n    _In_ KEY_INFORMATION_CLASS KeyInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\n/**\n * Sets information for a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be modified.\n * @param[in] KeySetInformationClass The type of information to be set.\n * @param[in] KeySetInformation A pointer to a buffer that contains the key information.\n * @param[in] KeySetInformationLength The size of the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationKey(\n    _In_ HANDLE KeyHandle,\n    _In_ KEY_SET_INFORMATION_CLASS KeySetInformationClass,\n    _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation,\n    _In_ ULONG KeySetInformationLength\n    );\n\n/**\n * Queries the value of a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be queried.\n * @param[in] ValueName A pointer to a UNICODE_STRING structure that specifies the name of the value to be queried.\n * @param[in] KeyValueInformationClass The type of information to be queried.\n * @param[out] KeyValueInformation A pointer to a buffer that receives the value information.\n * @param[in] Length The size of the buffer.\n * @param[out] ResultLength A pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyValueInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\n/**\n * Sets the value of a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be modified.\n * @param[in] ValueName A pointer to a UNICODE_STRING structure that specifies the name of the value to be set.\n * @param[in, optional] TitleIndex Reserved.\n * @param[in] Type The type of the value.\n * @param[in] Data A pointer to a buffer that contains the value data.\n * @param[in] DataSize The size of the buffer.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_opt_ ULONG TitleIndex,\n    _In_ ULONG Type,\n    _In_reads_bytes_opt_(DataSize) PVOID Data,\n    _In_ ULONG DataSize\n    );\n\n/**\n * Queries multiple values of a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be queried.\n * @param[in, out] ValueEntries A pointer to an array of KEY_VALUE_ENTRY structures that specify the values to be queried.\n * @param[in] EntryCount The number of entries in the array.\n * @param[out] ValueBuffer A pointer to a buffer that receives the value data.\n * @param[in, out] BufferLength A pointer to a variable that specifies the size of the buffer and receives the size of the data returned.\n * @param[out, optional] RequiredBufferLength A pointer to a variable that receives the size of the buffer required to hold the data.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryMultipleValueKey(\n    _In_ HANDLE KeyHandle,\n    _Inout_updates_(EntryCount) PKEY_VALUE_ENTRY ValueEntries,\n    _In_ ULONG EntryCount,\n    _Out_writes_bytes_(*BufferLength) PVOID ValueBuffer,\n    _Inout_ PULONG BufferLength,\n    _Out_opt_ PULONG RequiredBufferLength\n    );\n\n/**\n * Enumerates the subkeys of a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be enumerated.\n * @param[in] Index The index of the subkey to be enumerated.\n * @param[in] KeyInformationClass The type of information to be queried.\n * @param[out] KeyInformation A pointer to a buffer that receives the key information.\n * @param[in] Length The size of the buffer.\n * @param[out] ResultLength A pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateKey(\n    _In_ HANDLE KeyHandle,\n    _In_ ULONG Index,\n    _In_ KEY_INFORMATION_CLASS KeyInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\n/**\n * Enumerates the values of a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be enumerated.\n * @param[in] Index The index of the value to be enumerated.\n * @param[in] KeyValueInformationClass The type of information to be queried.\n * @param[out] KeyValueInformation A pointer to a buffer that receives the value information.\n * @param[in] Length The size of the buffer.\n * @param[out] ResultLength A pointer to a variable that receives the size of the data returned.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ ULONG Index,\n    _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyValueInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\n/**\n * Flushes the changes to a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be flushed.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFlushKey(\n    _In_ HANDLE KeyHandle\n    );\n\n/**\n * Compacts the specified registry keys.\n *\n * @param[in] Count The number of keys to be compacted.\n * @param[in] KeyArray An array of handles to the keys to be compacted.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompactKeys(\n    _In_ ULONG Count,\n    _In_reads_(Count) HANDLE KeyArray[]\n    );\n\n/**\n * Compresses a registry key.\n *\n * @param[in] KeyHandle A handle to the key to be compressed.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompressKey(\n    _In_ HANDLE KeyHandle\n    );\n\n/**\n * Loads a registry key from a file.\n *\n * @param[in] TargetKey A pointer to an OBJECT_ATTRIBUTES structure that specifies the target key.\n * @param[in] SourceFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the source file.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadKey(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile\n    );\n\n/**\n * Loads a registry key from a file with additional options.\n *\n * @param[in] TargetKey A pointer to an OBJECT_ATTRIBUTES structure that specifies the target key.\n * @param[in] SourceFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the source file.\n * @param[in] Flags The options to use when loading the key.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadKey2(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n/**\n * Loads a registry key from a file with extended options.\n *\n * @param[in] TargetKey A pointer to an OBJECT_ATTRIBUTES structure that specifies the target key.\n * @param[in] SourceFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the source file.\n * @param[in] Flags The options to use when loading the key.\n * @param[in, optional] TrustClassKey A handle to the trust class key.\n * @param[in, optional] Event A handle to an event.\n * @param[in, optional] DesiredAccess The access mask that specifies the desired access rights.\n * @param[out, optional] RootHandle A pointer to a handle that receives the root handle.\n * @param[in, reserved] Reserved Reserved.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadKeyEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags,\n    _In_opt_ HANDLE TrustClassKey,\n    _In_opt_ HANDLE Event,\n    _In_opt_ ACCESS_MASK DesiredAccess,\n    _Out_opt_ PHANDLE RootHandle,\n    _Reserved_ PVOID Reserved // previously PIO_STATUS_BLOCK\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n// rev by tyranid\n/**\n * Loads a registry key from a file with extended parameters.\n *\n * @param[in] TargetKey A pointer to an OBJECT_ATTRIBUTES structure that specifies the target key.\n * @param[in] SourceFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the source file.\n * @param[in] Flags The options to use when loading the key.\n * @param[in] ExtendedParameters A pointer to an array of extended parameters.\n * @param[in] ExtendedParameterCount The number of extended parameters.\n * @param[in, optional] DesiredAccess The access mask that specifies the desired access rights.\n * @param[out, optional] RootHandle A pointer to a handle that receives the root handle.\n * @param[in, reserved] Reserved Reserved.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLoadKey3(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags,\n    _In_reads_(ExtendedParameterCount) PCM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount,\n    _In_opt_ ACCESS_MASK DesiredAccess,\n    _Out_opt_ PHANDLE RootHandle,\n    _Reserved_ PVOID Reserved\n    );\n#endif\n\n/**\n * Replaces a registry key.\n *\n * @param[in] NewFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the new file.\n * @param[in] TargetHandle A handle to the target key.\n * @param[in] OldFile A pointer to an OBJECT_ATTRIBUTES structure that specifies the old file.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReplaceKey(\n    _In_ POBJECT_ATTRIBUTES NewFile,\n    _In_ HANDLE TargetHandle,\n    _In_ POBJECT_ATTRIBUTES OldFile\n    );\n\n/**\n * Saves the specified registry key to a file.\n *\n * @param KeyHandle Handle to the registry key.\n * @param FileHandle Handle to the file where the key will be saved.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSaveKey(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle\n    );\n\n/**\n * Saves the specified registry key to a file with a specified format.\n *\n * @param KeyHandle Handle to the registry key.\n * @param FileHandle Handle to the file where the key will be saved.\n * @param Format Format in which the key will be saved.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSaveKeyEx(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Format\n    );\n\n/**\n * Merges two registry keys and saves the result to a file.\n *\n * @param HighPrecedenceKeyHandle Handle to the high precedence registry key.\n * @param LowPrecedenceKeyHandle Handle to the low precedence registry key.\n * @param FileHandle Handle to the file where the merged key will be saved.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSaveMergedKeys(\n    _In_ HANDLE HighPrecedenceKeyHandle,\n    _In_ HANDLE LowPrecedenceKeyHandle,\n    _In_ HANDLE FileHandle\n    );\n\n/**\n * Restores a registry key from a file.\n *\n * @param KeyHandle Handle to the registry key.\n * @param FileHandle Handle to the file from which the key will be restored.\n * @param Flags Flags for the restore operation.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRestoreKey(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Flags\n    );\n\n/**\n * Unloads a registry key.\n *\n * @param TargetKey Pointer to the object attributes of the target key.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnloadKey(\n    _In_ POBJECT_ATTRIBUTES TargetKey\n    );\n\n#if PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n/**\n * Unloads a registry key with additional flags.\n *\n * @param TargetKey Pointer to the object attributes of the target key.\n * @param Flags Flags for the unload operation.\n * @return NTSTATUS Successful or errant status.\n * @remarks Valid flags are REG_FORCE_UNLOAD and REG_UNLOAD_LEGAL_FLAGS.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnloadKey2(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ ULONG Flags\n    );\n#endif\n\n/**\n * Unloads a registry key and optionally signals an event.\n *\n * @param TargetKey Pointer to the object attributes of the target key.\n * @param Event Optional handle to an event to be signaled.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUnloadKeyEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_opt_ HANDLE Event\n    );\n\n/**\n * Notifies of changes to a registry key.\n *\n * @param KeyHandle Handle to the registry key.\n * @param Event Optional handle to an event to be signaled.\n * @param ApcRoutine Optional APC routine to be called.\n * @param ApcContext Optional context for the APC routine.\n * @param IoStatusBlock Pointer to an IO status block.\n * @param CompletionFilter Filter for the types of changes to notify.\n * @param WatchTree Whether to watch the entire tree.\n * @param Buffer Optional buffer for change data.\n * @param BufferSize Size of the buffer.\n * @param Asynchronous Whether the operation is asynchronous.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtNotifyChangeKey(\n    _In_ HANDLE KeyHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _Out_writes_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _In_ BOOLEAN Asynchronous\n    );\n\n/**\n * Requests notification when a registry key or any of its subkeys changes.\n *\n * @param MasterKeyHandle A handle to an open key. The handle must be opened with the KEY_NOTIFY access right.\n * @param Count The number of subkeys under the key specified by the MasterKeyHandle parameter.\n * @param SubordinateObjects Pointer to an array of OBJECT_ATTRIBUTES structures, one for each subkey. This array can contain one OBJECT_ATTRIBUTES structure.\n * @param Event A handle to an event created by the caller. If Event is not NULL, the caller waits until the operation succeeds, at which time the event is signaled.\n * @param ApcRoutine A pointer to an asynchronous procedure call (APC) function supplied by the caller. If ApcRoutine is not NULL, the specified APC function executes after the operation completes.\n * @param ApcContext A pointer to a context supplied by the caller for its APC function. This value is passed to the APC function when it is executed. The Asynchronous parameter must be TRUE. If ApcContext is specified, the Event parameter must be NULL.\n * @param IoStatusBlock A pointer to an IO_STATUS_BLOCK structure that contains the final status and information about the operation. For successful calls that return data, the number of bytes written to the Buffer parameter is supplied in the Information member of the IO_STATUS_BLOCK structure.\n * @param CompletionFilter A bitmap of operations that trigger notification. This parameter can be one or more of the following flags. REG_NOTIFY_CHANGE_NAME, REG_NOTIFY_CHANGE_ATTRIBUTES, REG_NOTIFY_CHANGE_LAST_SET, REG_NOTIFY_CHANGE_SECURITY.\n * @param WatchTree If this parameter is TRUE, the caller is notified about changes to all subkeys of the specified key. If this parameter is FALSE, the caller is notified only about changes to the specified key.\n * @param Buffer Reserved for system use. This parameter must be NULL.\n * @param BufferSize Reserved for system use. This parameter must be zero.\n * @param Asynchronous Whether the operation is asynchronous.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtNotifyChangeMultipleKeys(\n    _In_ HANDLE MasterKeyHandle,\n    _In_opt_ ULONG Count,\n    _In_reads_opt_(Count) OBJECT_ATTRIBUTES SubordinateObjects[],\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _Out_writes_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _In_ BOOLEAN Asynchronous\n    );\n\n/**\n * Queries the number of open subkeys of a registry key.\n *\n * @param TargetKey Pointer to the object attributes of the target key.\n * @param HandleCount Pointer to a variable to receive the handle count.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryOpenSubKeys(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _Out_ PULONG HandleCount\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\n/**\n * Queries the open subkeys of a registry key with additional information.\n *\n * @param TargetKey Pointer to the object attributes of the target key.\n * @param BufferLength Length of the buffer.\n * @param Buffer Optional buffer to receive the subkey information.\n * @param RequiredSize Pointer to a variable to receive the required size.\n * @return NTSTATUS Successful or errant status.\n * @remarks Returns an array of KEY_OPEN_SUBKEYS_INFORMATION structures.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryOpenSubKeysEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_opt_(BufferLength) PVOID Buffer,\n    _Out_ PULONG RequiredSize\n    );\n#endif\n\n/**\n * Initializes the registry.\n *\n * @param BootCondition Condition for the boot.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtInitializeRegistry(\n    _In_ USHORT BootCondition\n    );\n\n/**\n * Locks the registry key and prevents changes from being written to disk.\n *\n * @param KeyHandle Handle to the registry key.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLockRegistryKey(\n    _In_ HANDLE KeyHandle\n    );\n\n/**\n * Locks the product activation keys.\n *\n * @param pPrivateVer Optional pointer to a private version variable.\n * @param pSafeMode Optional pointer to a safe mode variable.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtLockProductActivationKeys(\n    _Inout_opt_ ULONG *pPrivateVer,\n    _Out_opt_ ULONG *pSafeMode\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Freezes the registry and prevents changes from being flushed to disk.\n *\n * @param TimeOutInSeconds Timeout in seconds.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFreezeRegistry(\n    _In_ ULONG TimeOutInSeconds\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n/**\n * Thaws the registry and enables flushing changes to disk.\n *\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtThawRegistry(\n    VOID\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n/**\n * Creates a registry transaction.\n *\n * @param RegistryTransactionHandle Pointer to a variable to receive the handle.\n * @param DesiredAccess Desired access mask.\n * @param ObjAttributes Optional pointer to object attributes.\n * @param CreateOptions Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateRegistryTransaction(\n    _Out_ HANDLE *RegistryTransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjAttributes,\n    _Reserved_ ULONG CreateOptions\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n/**\n * Opens a registry transaction.\n *\n * @param RegistryTransactionHandle Pointer to a variable to receive the handle.\n * @param DesiredAccess Desired access mask.\n * @param ObjAttributes Pointer to object attributes.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenRegistryTransaction(\n    _Out_ HANDLE *RegistryTransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjAttributes\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n/**\n * Commits a registry transaction.\n *\n * @param RegistryTransactionHandle Handle to the registry transaction.\n * @param Flags Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCommitRegistryTransaction(\n    _In_ HANDLE RegistryTransactionHandle,\n    _Reserved_ ULONG Flags\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n/**\n * Rolls back a registry transaction.\n *\n * @param RegistryTransactionHandle Handle to the registry transaction.\n * @param Flags Reserved for future use.\n * @return NTSTATUS Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRollbackRegistryTransaction(\n    _In_ HANDLE RegistryTransactionHandle,\n    _Reserved_ ULONG Flags\n    );\n#endif\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntrtl.h",
    "content": "/*\n * RTL support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTRTL_H\n#define _NTRTL_H\n\n#define RtlOffsetToPointer(Base, Offset) ((PCHAR)(((PCHAR)(Base)) + ((ULONG_PTR)(Offset))))\n#define RtlPointerToOffset(Base, Pointer) ((ULONG)(((PCHAR)(Pointer)) - ((PCHAR)(Base))))\n\n#define RTL_PTR_ADD(Pointer, Value) ((PVOID)((ULONG_PTR)(Pointer) + (ULONG_PTR)(Value)))\n#define RTL_PTR_SUBTRACT(Pointer, Value) ((PVOID)((ULONG_PTR)(Pointer) - (ULONG_PTR)(Value)))\n\n#define RTL_NANOSEC_PER_SEC              1000000000ull\n#define RTL_NANOSEC_PER_MILLISEC            1000000ull\n#define RTL_100NANOSEC_PER_SEC             10000000ull\n#define RTL_100NANOSEC_PER_MILLISEC           10000ull\n#define RTL_MILLISEC_PER_SEC                   1000ull\n\n#define RTL_MILLISEC_TO_100NANOSEC(m) ((m) * RTL_100NANOSEC_PER_MILLISEC)\n#define RTL_SEC_TO_100NANOSEC(s) ((s) * RTL_100NANOSEC_PER_SEC)\n#define RTL_SEC_TO_MILLISEC(s) ((s) * RTL_MILLISEC_PER_SEC)\n\n#define RTL_MEG (1024UL * 1024UL)\n#define RTL_IMAGE_MAX_DOS_HEADER (256UL * RTL_MEG)\n\n#define RTL_NANOSEC_PER_TICK        100\n#define RTL_TICKS_PER_MICROSEC      10\n#define RTL_TICKS_PER_MILLISEC      (RTL_TICKS_PER_MICROSEC * 1000)  // 10,000\n#define RTL_TICKS_PER_SEC           (RTL_TICKS_PER_MILLISEC * 1000)  // 10,000,000\n#define RTL_TICKS_PER_MIN           (RTL_TICKS_PER_SEC * 60)         // 600,000,000\n#define RTL_TICKS_PER_HOUR          (RTL_TICKS_PER_MIN * 60)         // 36,000,000,000\n#define RTL_TICKS_PER_DAY           (RTL_TICKS_PER_HOUR * 24)        // 864,000,000,000\n\n//\n// Linked lists\n//\n\ntypedef struct _LIST_ENTRY LIST_ENTRY, *PLIST_ENTRY;\n\n#define RTL_STATIC_LIST_HEAD(x) \\\n    LIST_ENTRY (x) = { &(x), &(x) }\n\n#define RTL_LIST_FOREACH(Entry, ListHead) \\\n    for ((Entry) = &(ListHead); (Entry) != &(ListHead); (Entry) = (Entry)->Flink)\n\nFORCEINLINE\nVOID\nInitializeListHead(\n    _Out_ PLIST_ENTRY ListHead\n    )\n{\n    ListHead->Flink = ListHead->Blink = ListHead;\n}\n\nFORCEINLINE\nVOID\nInitializeListHead32(\n    _Out_ PLIST_ENTRY32 ListHead\n    )\n{\n    ListHead->Flink = ListHead->Blink = ((ULONG)(ULONG_PTR)ListHead);\n}\n\n_Must_inspect_result_\nFORCEINLINE\nBOOLEAN\nIsListEmpty(\n    _In_ PLIST_ENTRY ListHead\n    )\n{\n    return ListHead->Flink == ListHead;\n}\n\nFORCEINLINE BOOLEAN RemoveEntryList(\n    _In_ PLIST_ENTRY Entry\n    )\n{\n    PLIST_ENTRY Blink;\n    PLIST_ENTRY Flink;\n\n    Flink = Entry->Flink;\n    Blink = Entry->Blink;\n    Blink->Flink = Flink;\n    Flink->Blink = Blink;\n\n    return Flink == Blink;\n}\n\nFORCEINLINE PLIST_ENTRY RemoveHeadList(\n    _Inout_ PLIST_ENTRY ListHead\n    )\n{\n    PLIST_ENTRY Flink;\n    PLIST_ENTRY Entry;\n\n    Entry = ListHead->Flink;\n    Flink = Entry->Flink;\n    ListHead->Flink = Flink;\n    Flink->Blink = ListHead;\n\n    return Entry;\n}\n\nFORCEINLINE PLIST_ENTRY RemoveTailList(\n    _Inout_ PLIST_ENTRY ListHead\n    )\n{\n    PLIST_ENTRY Blink;\n    PLIST_ENTRY Entry;\n\n    Entry = ListHead->Blink;\n    Blink = Entry->Blink;\n    ListHead->Blink = Blink;\n    Blink->Flink = ListHead;\n\n    return Entry;\n}\n\nFORCEINLINE VOID InsertTailList(\n    _Inout_ PLIST_ENTRY ListHead,\n    _Inout_ PLIST_ENTRY Entry\n    )\n{\n    PLIST_ENTRY Blink;\n\n    Blink = ListHead->Blink;\n    Entry->Flink = ListHead;\n    Entry->Blink = Blink;\n    Blink->Flink = Entry;\n    ListHead->Blink = Entry;\n}\n\nFORCEINLINE VOID InsertHeadList(\n    _Inout_ PLIST_ENTRY ListHead,\n    _Inout_ PLIST_ENTRY Entry\n    )\n{\n    PLIST_ENTRY Flink;\n\n    Flink = ListHead->Flink;\n    Entry->Flink = Flink;\n    Entry->Blink = ListHead;\n    Flink->Blink = Entry;\n    ListHead->Flink = Entry;\n}\n\nFORCEINLINE VOID AppendTailList(\n    _Inout_ PLIST_ENTRY ListHead,\n    _Inout_ PLIST_ENTRY ListToAppend\n    )\n{\n    PLIST_ENTRY ListEnd = ListHead->Blink;\n\n    ListHead->Blink->Flink = ListToAppend;\n    ListHead->Blink = ListToAppend->Blink;\n    ListToAppend->Blink->Flink = ListHead;\n    ListToAppend->Blink = ListEnd;\n}\n\nFORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(\n    _Inout_ PSINGLE_LIST_ENTRY ListHead\n    )\n{\n    PSINGLE_LIST_ENTRY FirstEntry;\n\n    FirstEntry = ListHead->Next;\n\n    if (FirstEntry)\n        ListHead->Next = FirstEntry->Next;\n\n    return FirstEntry;\n}\n\nFORCEINLINE VOID PushEntryList(\n    _Inout_ PSINGLE_LIST_ENTRY ListHead,\n    _Inout_ PSINGLE_LIST_ENTRY Entry\n    )\n{\n    Entry->Next = ListHead->Next;\n    ListHead->Next = Entry;\n}\n\n//\n// AVL and splay trees\n//\n\ntypedef enum _TABLE_SEARCH_RESULT\n{\n    TableEmptyTree,\n    TableFoundNode,\n    TableInsertAsLeft,\n    TableInsertAsRight\n} TABLE_SEARCH_RESULT;\n\ntypedef enum _RTL_GENERIC_COMPARE_RESULTS\n{\n    GenericLessThan,\n    GenericGreaterThan,\n    GenericEqual\n} RTL_GENERIC_COMPARE_RESULTS;\n\ntypedef RTL_GENERIC_COMPARE_RESULTS (NTAPI *PRTL_AVL_COMPARE_ROUTINE)(\n    _In_ struct _RTL_AVL_TABLE *Table,\n    _In_ PVOID FirstStruct,\n    _In_ PVOID SecondStruct\n    );\n\ntypedef PVOID (NTAPI *PRTL_AVL_ALLOCATE_ROUTINE)(\n    _In_ struct _RTL_AVL_TABLE *Table,\n    _In_ CLONG ByteSize\n    );\n\ntypedef VOID (NTAPI *PRTL_AVL_FREE_ROUTINE)(\n    _In_ struct _RTL_AVL_TABLE *Table,\n    _In_ _Post_invalid_ PVOID Buffer\n    );\n\ntypedef NTSTATUS (NTAPI *PRTL_AVL_MATCH_FUNCTION)(\n    _In_ struct _RTL_AVL_TABLE *Table,\n    _In_ PVOID UserData,\n    _In_ PVOID MatchData\n    );\n\ntypedef struct _RTL_BALANCED_LINKS\n{\n    struct _RTL_BALANCED_LINKS *Parent;\n    struct _RTL_BALANCED_LINKS *LeftChild;\n    struct _RTL_BALANCED_LINKS *RightChild;\n    CHAR Balance;\n    UCHAR Reserved[3];\n} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;\n\ntypedef struct _RTL_AVL_TABLE\n{\n    RTL_BALANCED_LINKS BalancedRoot;\n    PVOID OrderedPointer;\n    ULONG WhichOrderedElement;\n    ULONG NumberGenericTableElements;\n    ULONG DepthOfTree;\n    PRTL_BALANCED_LINKS RestartKey;\n    ULONG DeleteCount;\n    PRTL_AVL_COMPARE_ROUTINE CompareRoutine;\n    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;\n    PRTL_AVL_FREE_ROUTINE FreeRoutine;\n    PVOID TableContext;\n} RTL_AVL_TABLE, *PRTL_AVL_TABLE;\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeGenericTableAvl(\n    _Out_ PRTL_AVL_TABLE Table,\n    _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine,\n    _In_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,\n    _In_ PRTL_AVL_FREE_ROUTINE FreeRoutine,\n    _In_opt_ PVOID TableContext\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlInsertElementGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ CLONG BufferSize,\n    _Out_opt_ PBOOLEAN NewElement\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlInsertElementGenericTableFullAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ CLONG BufferSize,\n    _Out_opt_ PBOOLEAN NewElement,\n    _In_ PVOID NodeOrParent,\n    _In_ TABLE_SEARCH_RESULT SearchResult\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDeleteElementGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ PVOID Buffer\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlLookupElementGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlLookupElementGenericTableFullAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ PVOID Buffer,\n    _Out_ PVOID *NodeOrParent,\n    _Out_ TABLE_SEARCH_RESULT *SearchResult\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlEnumerateGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ BOOLEAN Restart\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlEnumerateGenericTableWithoutSplayingAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _Inout_ PVOID *RestartKey\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlLookupFirstMatchingElementGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ PVOID Buffer,\n    _Out_ PVOID *RestartKey\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlEnumerateGenericTableLikeADirectory(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction,\n    _In_opt_ PVOID MatchData,\n    _In_ ULONG NextFlag,\n    _Inout_ PVOID *RestartKey,\n    _Inout_ PULONG DeleteCount,\n    _In_ PVOID Buffer\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlGetElementGenericTableAvl(\n    _In_ PRTL_AVL_TABLE Table,\n    _In_ ULONG I\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberGenericTableElementsAvl(\n    _In_ PRTL_AVL_TABLE Table\n    );\n\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsGenericTableEmptyAvl(\n    _In_ PRTL_AVL_TABLE Table\n    );\n\ntypedef struct _RTL_SPLAY_LINKS\n{\n    struct _RTL_SPLAY_LINKS *Parent;\n    struct _RTL_SPLAY_LINKS *LeftChild;\n    struct _RTL_SPLAY_LINKS *RightChild;\n} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;\n\n#define RtlInitializeSplayLinks(Links) \\\n{ \\\n    PRTL_SPLAY_LINKS _SplayLinks; \\\n    _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \\\n    _SplayLinks->Parent = _SplayLinks; \\\n    _SplayLinks->LeftChild = NULL; \\\n    _SplayLinks->RightChild = NULL; \\\n}\n\n#define RtlParent(Links) ((PRTL_SPLAY_LINKS)(Links)->Parent)\n#define RtlLeftChild(Links) ((PRTL_SPLAY_LINKS)(Links)->LeftChild)\n#define RtlRightChild(Links) ((PRTL_SPLAY_LINKS)(Links)->RightChild)\n#define RtlIsRoot(Links) ((RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)))\n#define RtlIsLeftChild(Links) ((RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)))\n#define RtlIsRightChild(Links) ((RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)))\n\n#define RtlInsertAsLeftChild(ParentLinks, ChildLinks) \\\n{ \\\n    PRTL_SPLAY_LINKS _SplayParent; \\\n    PRTL_SPLAY_LINKS _SplayChild; \\\n    _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \\\n    _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \\\n    _SplayParent->LeftChild = _SplayChild; \\\n    _SplayChild->Parent = _SplayParent; \\\n}\n\n#define RtlInsertAsRightChild(ParentLinks, ChildLinks) \\\n{ \\\n    PRTL_SPLAY_LINKS _SplayParent; \\\n    PRTL_SPLAY_LINKS _SplayChild; \\\n    _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \\\n    _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \\\n    _SplayParent->RightChild = _SplayChild; \\\n    _SplayChild->Parent = _SplayParent; \\\n}\n\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlSplay(\n    _Inout_ PRTL_SPLAY_LINKS Links\n    );\n\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlDelete(\n    _In_ PRTL_SPLAY_LINKS Links\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlDeleteNoSplay(\n    _In_ PRTL_SPLAY_LINKS Links,\n    _Inout_ PRTL_SPLAY_LINKS *Root\n    );\n\n_Check_return_\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlSubtreeSuccessor(\n    _In_ PRTL_SPLAY_LINKS Links\n    );\n\n_Check_return_\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlSubtreePredecessor(\n    _In_ PRTL_SPLAY_LINKS Links\n    );\n\n_Check_return_\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlRealSuccessor(\n    _In_ PRTL_SPLAY_LINKS Links\n    );\n\n_Check_return_\nNTSYSAPI\nPRTL_SPLAY_LINKS\nNTAPI\nRtlRealPredecessor(\n    _In_ PRTL_SPLAY_LINKS Links\n    );\n\nstruct _RTL_GENERIC_TABLE;\n\ntypedef RTL_GENERIC_COMPARE_RESULTS (NTAPI *PRTL_GENERIC_COMPARE_ROUTINE)(\n    _In_ struct _RTL_GENERIC_TABLE *Table,\n    _In_ PVOID FirstStruct,\n    _In_ PVOID SecondStruct\n    );\n\ntypedef PVOID (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE)(\n    _In_ struct _RTL_GENERIC_TABLE *Table,\n    _In_ CLONG ByteSize\n    );\n\ntypedef VOID (NTAPI *PRTL_GENERIC_FREE_ROUTINE)(\n    _In_ struct _RTL_GENERIC_TABLE *Table,\n    _In_ _Post_invalid_ PVOID Buffer\n    );\n\ntypedef struct _RTL_GENERIC_TABLE\n{\n    PRTL_SPLAY_LINKS TableRoot;\n    LIST_ENTRY InsertOrderList;\n    PLIST_ENTRY OrderedPointer;\n    ULONG WhichOrderedElement;\n    ULONG NumberGenericTableElements;\n    PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;\n    PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;\n    PRTL_GENERIC_FREE_ROUTINE FreeRoutine;\n    PVOID TableContext;\n} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeGenericTable(\n    _Out_ PRTL_GENERIC_TABLE Table,\n    _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,\n    _In_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,\n    _In_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine,\n    _In_opt_ PVOID TableContext\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlInsertElementGenericTable(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ CLONG BufferSize,\n    _Out_opt_ PBOOLEAN NewElement\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlInsertElementGenericTableFull(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ CLONG BufferSize,\n    _Out_opt_ PBOOLEAN NewElement,\n    _In_ PVOID NodeOrParent,\n    _In_ TABLE_SEARCH_RESULT SearchResult\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDeleteElementGenericTable(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_ PVOID Buffer\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlLookupElementGenericTable(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlLookupElementGenericTableFull(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_ PVOID Buffer,\n    _Out_ PVOID *NodeOrParent,\n    _Out_ TABLE_SEARCH_RESULT *SearchResult\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlEnumerateGenericTable(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_ BOOLEAN Restart\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlEnumerateGenericTableWithoutSplaying(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _Inout_ PVOID *RestartKey\n    );\n\n_Check_return_\nNTSYSAPI\nPVOID\nNTAPI\nRtlGetElementGenericTable(\n    _In_ PRTL_GENERIC_TABLE Table,\n    _In_ ULONG I\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberGenericTableElements(\n    _In_ PRTL_GENERIC_TABLE Table\n    );\n\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsGenericTableEmpty(\n    _In_ PRTL_GENERIC_TABLE Table\n    );\n\n//\n// RB trees\n//\n\ntypedef struct _RTL_RB_TREE\n{\n    PRTL_BALANCED_NODE Root;\n    PRTL_BALANCED_NODE Min;\n} RTL_RB_TREE, *PRTL_RB_TREE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlRbInsertNodeEx(\n    _In_ PRTL_RB_TREE Tree,\n    _In_opt_ PRTL_BALANCED_NODE Parent,\n    _In_ BOOLEAN Right,\n    _Out_ PRTL_BALANCED_NODE Node\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlRbRemoveNode(\n    _In_ PRTL_RB_TREE Tree,\n    _In_ PRTL_BALANCED_NODE Node\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCompareExchangePointerMapping(\n    _In_ PRTL_BALANCED_NODE Node1,\n    _In_ PRTL_BALANCED_NODE Node2,\n    _Out_ PRTL_BALANCED_NODE *Node3,\n    _Out_ PRTL_BALANCED_NODE *Node4\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryPointerMapping(\n    _In_ PRTL_RB_TREE Tree,\n    _Inout_ PRTL_BALANCED_NODE Children\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRemovePointerMapping(\n    _In_ PRTL_RB_TREE Tree,\n    _Inout_ PRTL_BALANCED_NODE Children\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n//\n// Hash tables\n//\n\n// begin_ntddk\n\n#define RTL_HASH_ALLOCATED_HEADER 0x00000001\n#define RTL_HASH_RESERVED_SIGNATURE 0\n\ntypedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY\n{\n    LIST_ENTRY Linkage;\n    ULONG_PTR Signature;\n} RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY;\n\n#define HASH_ENTRY_KEY(x) ((x)->Signature)\n\ntypedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT\n{\n    PLIST_ENTRY ChainHead;\n    PLIST_ENTRY PrevLinkage;\n    ULONG_PTR Signature;\n} RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT;\n\ntypedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR\n{\n    RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry;\n    PLIST_ENTRY ChainHead;\n    ULONG BucketIndex;\n} RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR;\n\ntypedef struct _RTL_DYNAMIC_HASH_TABLE\n{\n    // Entries initialized at creation.\n    ULONG Flags;\n    ULONG Shift;\n\n    // Entries used in bucket computation.\n    ULONG TableSize;\n    ULONG Pivot;\n    ULONG DivisorMask;\n\n    // Counters.\n    ULONG NumEntries;\n    ULONG NonEmptyBuckets;\n    ULONG NumEnumerators;\n\n    // The directory. This field is for internal use only.\n    PVOID Directory;\n} RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\nFORCEINLINE\nVOID\nRtlInitHashTableContext(\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    )\n{\n    Context->ChainHead = NULL;\n    Context->PrevLinkage = NULL;\n}\n\nFORCEINLINE\nVOID\nRtlInitHashTableContextFromEnumerator(\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,\n    _In_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    )\n{\n    Context->ChainHead = Enumerator->ChainHead;\n    Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink;\n}\n\nFORCEINLINE\nVOID\nRtlReleaseHashTableContext(\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    )\n{\n    UNREFERENCED_PARAMETER(Context);\n    return;\n}\n\nFORCEINLINE\nULONG\nRtlTotalBucketsHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    )\n{\n    return HashTable->TableSize;\n}\n\nFORCEINLINE\nULONG\nRtlNonEmptyBucketsHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    )\n{\n    return HashTable->NonEmptyBuckets;\n}\n\nFORCEINLINE\nULONG\nRtlEmptyBucketsHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    )\n{\n    return HashTable->TableSize - HashTable->NonEmptyBuckets;\n}\n\nFORCEINLINE\nULONG\nRtlTotalEntriesHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    )\n{\n    return HashTable->NumEntries;\n}\n\nFORCEINLINE\nULONG\nRtlActiveEnumeratorsHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    )\n{\n    return HashTable->NumEnumerators;\n}\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCreateHashTable(\n    _Inout_ _When_(*HashTable == NULL, __drv_allocatesMem(Mem)) PRTL_DYNAMIC_HASH_TABLE *HashTable,\n    _In_ ULONG Shift,\n    _In_ _Reserved_ ULONG Flags\n    );\n\n_Must_inspect_result_\n_Success_(return != 0)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCreateHashTableEx(\n    _Inout_ _When_(NULL == *HashTable, _At_(*HashTable, __drv_allocatesMem(Mem))) PRTL_DYNAMIC_HASH_TABLE *HashTable,\n    _In_ ULONG InitialSize,\n    _In_ ULONG Shift,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlDeleteHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlInsertEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _In_ PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,\n    _In_ ULONG_PTR Signature,\n    _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlRemoveEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _In_ PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,\n    _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPRTL_DYNAMIC_HASH_TABLE_ENTRY\nNTAPI\nRtlLookupEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _In_ ULONG_PTR Signature,\n    _Out_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPRTL_DYNAMIC_HASH_TABLE_ENTRY\nNTAPI\nRtlGetNextEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _In_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlInitEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPRTL_DYNAMIC_HASH_TABLE_ENTRY\nNTAPI\nRtlEnumerateEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlEndEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlInitWeakEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPRTL_DYNAMIC_HASH_TABLE_ENTRY\nNTAPI\nRtlWeaklyEnumerateEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlEndWeakEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlExpandHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlContractHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlInitStrongEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPRTL_DYNAMIC_HASH_TABLE_ENTRY\nNTAPI\nRtlStronglyEnumerateEntryHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlEndStrongEnumerationHashTable(\n    _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,\n    _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n// end_ntddk\n\n//\n// Critical sections\n//\n\n// These flags define the upper byte of the critical section SpinCount field\n#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO         0x01000000\n#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN          0x02000000\n#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT           0x04000000\n#define RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE         0x08000000\n#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO      0x10000000\n#define RTL_CRITICAL_SECTION_ALL_FLAG_BITS              0xFF000000\n#define RTL_CRITICAL_SECTION_FLAG_RESERVED              (RTL_CRITICAL_SECTION_ALL_FLAG_BITS & (~(RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO | RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN | RTL_CRITICAL_SECTION_FLAG_STATIC_INIT | RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE | RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO)))\n// These flags define possible values stored in the Flags field of a critsec debuginfo.\n#define RTL_CRITICAL_SECTION_DEBUG_FLAG_STATIC_INIT 0x00000001\n\n// typedef struct _RTL_CRITICAL_SECTION_DEBUG\n// {\n//     USHORT Type;\n//     USHORT CreatorBackTraceIndex;\n//     struct _RTL_CRITICAL_SECTION *CriticalSection;\n//     LIST_ENTRY ProcessLocksList;\n//     ULONG EntryCount;\n//     ULONG ContentionCount;\n//     ULONG Flags;\n//     USHORT CreatorBackTraceIndexHigh;\n//     USHORT Identifier;\n// } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;\n//\n// #pragma pack(push, 8)\n// typedef struct _RTL_CRITICAL_SECTION\n// {\n//     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;\n//     LONG LockCount;\n//     LONG RecursionCount;\n//     HANDLE OwningThread;\n//     HANDLE LockSemaphore;\n//     SIZE_T SpinCount;\n// } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;\n// #pragma pack(pop)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeCriticalSection(\n    _Out_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeCriticalSectionAndSpinCount(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection,\n    _In_ ULONG SpinCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeCriticalSectionEx(\n    _Out_ PRTL_CRITICAL_SECTION CriticalSection,\n    _In_ ULONG SpinCount,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteCriticalSection(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\n_Acquires_exclusive_lock_(*CriticalSection)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlEnterCriticalSection(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\n_Releases_exclusive_lock_(*CriticalSection)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLeaveCriticalSection(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\n_When_(return != 0, _Acquires_exclusive_lock_(*CriticalSection))\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlTryEnterCriticalSection(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlIsCriticalSectionLocked(\n    _In_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlIsCriticalSectionLockedByThread(\n    _In_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetCriticalSectionRecursionCount(\n    _In_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlSetCriticalSectionSpinCount(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection,\n    _In_ ULONG SpinCount\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nHANDLE\nNTAPI\nRtlQueryCriticalSectionOwner(\n    _In_ HANDLE EventHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nVOID\nNTAPI\nRtlCheckForOrphanedCriticalSections(\n    _In_ HANDLE ThreadHandle\n    );\n\n/**\n * Enables the creation of early critical section events.\n *\n * This function allows the system to create critical section events early in the process\n * initialization. It is typically used to ensure that critical sections are properly\n * initialized and can be used safely during the early stages of process startup.\n * @remarks This function sets the FLG_CRITSEC_EVENT_CREATION flag in the PEB flags field.\n * @return A pointer to the Process Environment Block (PEB).\n */\nNTSYSAPI\nPPEB\nNTAPI\nRtlEnableEarlyCriticalSectionEventCreation(\n    VOID\n    );\n\n//\n// Resources\n//\n\ntypedef struct _RTL_RESOURCE\n{\n    RTL_CRITICAL_SECTION CriticalSection;\n\n    HANDLE SharedSemaphore;\n    volatile ULONG NumberOfWaitingShared;\n    HANDLE ExclusiveSemaphore;\n    volatile ULONG NumberOfWaitingExclusive;\n\n    volatile LONG NumberOfActive; // negative: exclusive acquire; zero: not acquired; positive: shared acquire(s)\n    HANDLE ExclusiveOwnerThread;\n\n    ULONG Flags; // RTL_RESOURCE_FLAG_*\n\n    PRTL_RESOURCE_DEBUG DebugInfo;\n} RTL_RESOURCE, *PRTL_RESOURCE;\n\n#define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG)0x00000001)\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeResource(\n    _Out_ PRTL_RESOURCE Resource\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlDeleteResource(\n    _Inout_ PRTL_RESOURCE Resource\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAcquireResourceShared(\n    _Inout_ PRTL_RESOURCE Resource,\n    _In_ BOOLEAN Wait\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAcquireResourceExclusive(\n    _Inout_ PRTL_RESOURCE Resource,\n    _In_ BOOLEAN Wait\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlReleaseResource(\n    _Inout_ PRTL_RESOURCE Resource\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlConvertSharedToExclusive(\n    _Inout_ PRTL_RESOURCE Resource\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlConvertExclusiveToShared(\n    _Inout_ PRTL_RESOURCE Resource\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlDumpResource(\n    _Inout_ PRTL_RESOURCE Resource\n    );\n\n//\n// Slim reader-writer locks, condition variables, and barriers\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// winbase:InitializeSRWLock\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeSRWLock(\n    _Out_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:AcquireSRWLockExclusive\n_Acquires_exclusive_lock_(*SRWLock)\nNTSYSAPI\nVOID\nNTAPI\nRtlAcquireSRWLockExclusive(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:AcquireSRWLockShared\n_Acquires_shared_lock_(*SRWLock)\nNTSYSAPI\nVOID\nNTAPI\nRtlAcquireSRWLockShared(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:ReleaseSRWLockExclusive\n_Releases_exclusive_lock_(*SRWLock)\nNTSYSAPI\nVOID\nNTAPI\nRtlReleaseSRWLockExclusive(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:ReleaseSRWLockShared\n_Releases_shared_lock_(*SRWLock)\nNTSYSAPI\nVOID\nNTAPI\nRtlReleaseSRWLockShared(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:TryAcquireSRWLockExclusive\n_When_(return != 0, _Acquires_exclusive_lock_(*SRWLock))\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTryAcquireSRWLockExclusive(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n// winbase:TryAcquireSRWLockShared\n_When_(return != 0, _Acquires_shared_lock_(*SRWLock))\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTryAcquireSRWLockShared(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlAcquireReleaseSRWLockExclusive(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlConvertSRWLockExclusiveToShared(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n//\n// Read-Copy Update.\n//\n// RCU synchronization allows concurrent access to shared data structures,\n// such as linked lists, trees, or hash tables, without using traditional locking methods\n// in scenarios where read operations are frequent and need to be fast.\n// @remarks RCU synchronization is not for general-purpose synchronization.\n// Teb->Rcu is used to store the RCU state.\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlRcuAllocate(\n    _In_ SIZE_T Size\n    );\n\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlRcuFree(\n    _In_ PULONG Rcu\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRcuReadLock(\n    _Inout_ PRTL_SRWLOCK SRWLock,\n    _Out_ PULONG Rcu\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRcuReadUnlock(\n    _Inout_ PRTL_SRWLOCK SRWLock,\n    _Inout_ PULONG* Rcu\n    );\n\nNTSYSAPI\nLONG\nNTAPI\nRtlRcuSynchronize(\n    _Inout_ PRTL_SRWLOCK SRWLock\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#define RTL_CONDITION_VARIABLE_INIT {0}\n#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1\n\n// winbase:InitializeConditionVariable\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeConditionVariable(\n    _Out_ PRTL_CONDITION_VARIABLE ConditionVariable\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSleepConditionVariableCS(\n    _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable,\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSleepConditionVariableSRW(\n    _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable,\n    _Inout_ PRTL_SRWLOCK SRWLock,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_ ULONG Flags\n    );\n\n// winbase:WakeConditionVariable\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeConditionVariable(\n    _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable\n    );\n\n// winbase:WakeAllConditionVariable\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeAllConditionVariable(\n    _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// begin_rev\n#define RTL_BARRIER_FLAGS_SPIN_ONLY 0x00000001 // never block on event - always spin\n#define RTL_BARRIER_FLAGS_BLOCK_ONLY 0x00000002 // always block on event - never spin\n#define RTL_BARRIER_FLAGS_NO_DELETE 0x00000004 // use if barrier will never be deleted\n// end_rev\n\n// begin_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitBarrier(\n    _Out_ PRTL_BARRIER Barrier,\n    _In_ ULONG TotalThreads,\n    _In_ ULONG SpinCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteBarrier(\n    _In_ PRTL_BARRIER Barrier\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlBarrier(\n    _Inout_ PRTL_BARRIER Barrier,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlBarrierForDelete(\n    _Inout_ PRTL_BARRIER Barrier,\n    _In_ ULONG Flags\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// end_private\n\n//\n// Wait on address\n//\n\n// begin_rev\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWaitOnAddress(\n    _In_reads_bytes_(AddressSize) volatile VOID *Address,\n    _In_reads_bytes_(AddressSize) PVOID CompareAddress,\n    _In_ SIZE_T AddressSize,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeAddressAll(\n    _In_ PVOID Address\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeAddressAllNoFence(\n    _In_ PVOID Address\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeAddressSingle(\n    _In_ PVOID Address\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlWakeAddressSingleNoFence(\n    _In_ PVOID Address\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n// end_rev\n\n//\n// Strings\n//\n\nFORCEINLINE\nVOID\nNTAPI\nRtlInitEmptyAnsiString(\n    _Out_ PANSI_STRING AnsiString,\n    _Pre_maybenull_ _Pre_readable_size_(MaximumLength) PCHAR Buffer,\n    _In_ USHORT MaximumLength\n    )\n{\n    memset(AnsiString, 0, sizeof(ANSI_STRING));\n    AnsiString->MaximumLength = MaximumLength;\n    AnsiString->Buffer = Buffer;\n}\n\n#ifndef PHNT_NO_INLINE_INIT_STRING\nFORCEINLINE VOID RtlInitString(\n    _Out_ PSTRING DestinationString,\n    _In_opt_z_ PCSTR SourceString\n    )\n{\n    if (SourceString)\n        DestinationString->MaximumLength = (DestinationString->Length = (USHORT)strlen(SourceString)) + sizeof(ANSI_NULL);\n    else\n        DestinationString->MaximumLength = DestinationString->Length = 0;\n\n    DestinationString->Buffer = (PCHAR)SourceString;\n}\n#else\nNTSYSAPI\nVOID\nNTAPI\nRtlInitString(\n    _Out_ PSTRING DestinationString,\n    _In_opt_z_ PCSTR SourceString\n    );\n#endif // PHNT_NO_INLINE_INIT_STRING\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitStringEx(\n    _Out_ PSTRING DestinationString,\n    _In_opt_z_ PCSZ SourceString\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#ifndef PHNT_NO_INLINE_INIT_STRING\nFORCEINLINE VOID RtlInitAnsiString(\n    _Out_ PANSI_STRING DestinationString,\n    _In_opt_z_ PCSTR SourceString\n    )\n{\n    if (SourceString)\n        DestinationString->MaximumLength = (DestinationString->Length = (USHORT)strlen(SourceString)) + sizeof(ANSI_NULL);\n    else\n        DestinationString->MaximumLength = DestinationString->Length = 0;\n\n    DestinationString->Buffer = (PCHAR)SourceString;\n}\n#else\nNTSYSAPI\nVOID\nNTAPI\nRtlInitAnsiString(\n    _Out_ PANSI_STRING DestinationString,\n    _In_opt_z_ PCSTR SourceString\n    );\n#endif // PHNT_NO_INLINE_INIT_STRING\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitAnsiStringEx(\n    _Out_ PANSI_STRING DestinationString,\n    _In_opt_z_ PCSZ SourceString\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\nNTSYSAPI\nVOID\nNTAPI\nRtlFreeAnsiString(\n    _Inout_ _At_(AnsiString->Buffer, _Frees_ptr_opt_) PANSI_STRING AnsiString\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\nNTSYSAPI\nVOID\nNTAPI\nRtlInitUTF8String(\n    _Out_ PUTF8_STRING DestinationString,\n    _In_opt_z_ PCSZ SourceString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitUTF8StringEx(\n    _Out_ PUTF8_STRING DestinationString,\n    _In_opt_z_ PCSZ SourceString\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlFreeUTF8String(\n    _Inout_ _At_(Utf8String->Buffer, _Frees_ptr_opt_) PUTF8_STRING Utf8String\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\nNTSYSAPI\nVOID\nNTAPI\nRtlFreeOemString(\n    _Inout_ POEM_STRING OemString\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlCopyString(\n    _In_ PSTRING DestinationString,\n    _In_opt_ PSTRING SourceString\n    );\n\nNTSYSAPI\nCHAR\nNTAPI\nRtlUpperChar(\n    _In_ CHAR Character\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nLONG\nNTAPI\nRtlCompareString(\n    _In_ PSTRING String1,\n    _In_ PSTRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualString(\n    _In_ PSTRING String1,\n    _In_ PSTRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlPrefixString(\n    _In_ PSTRING String1,\n    _In_ PSTRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAppendStringToString(\n    _Inout_ PSTRING Destination,\n    _In_ PSTRING Source\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAppendAsciizToString(\n    _Inout_ PSTRING Destination,\n    _In_opt_z_ PCSTR Source\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlUpperString(\n    _Inout_ PSTRING DestinationString,\n    _In_ const STRING* SourceString\n    );\n\nFORCEINLINE\nBOOLEAN\nRtlIsNullOrEmptyUnicodeString(\n    _In_opt_ PCUNICODE_STRING String\n    )\n{\n    return !String || String->Length == 0;\n}\n\nFORCEINLINE\nVOID\nNTAPI\nRtlInitEmptyUnicodeString(\n    _Out_ PUNICODE_STRING DestinationString,\n    _Writable_bytes_(MaximumLength) _When_(MaximumLength != 0, _Notnull_) PWCHAR Buffer,\n    _In_ USHORT MaximumLength\n    )\n{\n    memset(DestinationString, 0, sizeof(UNICODE_STRING));\n    DestinationString->MaximumLength = MaximumLength;\n    DestinationString->Buffer = Buffer;\n}\n\n#ifndef PHNT_NO_INLINE_INIT_STRING\nFORCEINLINE VOID RtlInitUnicodeString(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_opt_z_ PCWSTR SourceString\n    )\n{\n    if (SourceString)\n        DestinationString->MaximumLength = (DestinationString->Length = (USHORT)(wcslen(SourceString) * sizeof(WCHAR))) + sizeof(UNICODE_NULL);\n    else\n        DestinationString->MaximumLength = DestinationString->Length = 0;\n\n    DestinationString->Buffer = (PWCH)SourceString;\n}\n#else\nNTSYSAPI\nVOID\nNTAPI\nRtlInitUnicodeString(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_opt_z_ PCWSTR SourceString\n    );\n#endif // PHNT_NO_INLINE_INIT_STRING\n\n#ifndef PHNT_NO_INLINE_INIT_STRING\nFORCEINLINE NTSTATUS RtlInitUnicodeStringEx(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_opt_z_ PCWSTR SourceString\n    )\n{\n    size_t stringLength;\n\n    DestinationString->Length = 0;\n    DestinationString->Buffer = (PWCH)SourceString;\n\n    if (!SourceString)\n        return STATUS_SUCCESS;\n\n    stringLength = wcslen(SourceString);\n\n    if (stringLength <= UNICODE_STRING_MAX_CHARS - 1)\n    {\n        DestinationString->Length = (USHORT)stringLength * sizeof(WCHAR);\n        DestinationString->MaximumLength = DestinationString->Length + sizeof(UNICODE_NULL);\n        return STATUS_SUCCESS;\n    }\n\n    return STATUS_NAME_TOO_LONG;\n}\n#else\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitUnicodeStringEx(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_opt_z_ PCWSTR SourceString\n    );\n#endif // PHNT_NO_INLINE_INIT_STRING\n\n_Success_(return != 0)\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCreateUnicodeString(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_z_ PCWSTR SourceString\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCreateUnicodeStringFromAsciiz(\n    _Out_ PUNICODE_STRING DestinationString,\n    _In_z_ PCSTR SourceString\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlFreeUnicodeString(\n    _Inout_ _At_(UnicodeString->Buffer, _Frees_ptr_opt_) PUNICODE_STRING UnicodeString\n    );\n\n#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE (0x00000001)\n#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING (0x00000002)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDuplicateUnicodeString(\n    _In_ ULONG Flags,\n    _In_ PCUNICODE_STRING StringIn,\n    _Out_ PUNICODE_STRING StringOut\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlCopyUnicodeString(\n    _In_ PCUNICODE_STRING DestinationString,\n    _In_opt_ PCUNICODE_STRING SourceString\n    );\n\nNTSYSAPI\nWCHAR\nNTAPI\nRtlUpcaseUnicodeChar(\n    _In_ WCHAR SourceCharacter\n    );\n\nNTSYSAPI\nWCHAR\nNTAPI\nRtlDowncaseUnicodeChar(\n    _In_ WCHAR SourceCharacter\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nLONG\nNTAPI\nRtlCompareUnicodeString(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n_Must_inspect_result_\nNTSYSAPI\nLONG\nNTAPI\nRtlCompareUnicodeStrings(\n    _In_reads_(String1Length) PCWCH String1,\n    _In_ SIZE_T String1Length,\n    _In_reads_(String2Length) PCWCH String2,\n    _In_ SIZE_T String2Length,\n    _In_ BOOLEAN CaseInSensitive\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualUnicodeString(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\n#define HASH_STRING_ALGORITHM_DEFAULT 0\n#define HASH_STRING_ALGORITHM_X65599 1\n#define HASH_STRING_ALGORITHM_INVALID 0xffffffff\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlHashUnicodeString(\n    _In_ PCUNICODE_STRING String,\n    _In_ BOOLEAN CaseInSensitive,\n    _In_ ULONG HashAlgorithm,\n    _Out_ PULONG HashValue\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlValidateUnicodeString(\n    _In_ ULONG Flags,\n    _In_ PCUNICODE_STRING String\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlPrefixUnicodeString(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n\n#if (PHNT_MODE == PHNT_MODE_KERNEL && PHNT_VERSION >= PHNT_WINDOWS_10)\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlSuffixUnicodeString(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2,\n    _In_ BOOLEAN CaseInSensitive\n    );\n#endif // PHNT_MODE == PHNT_MODE_KERNEL && PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n_Must_inspect_result_\nNTSYSAPI\nPWCHAR\nNTAPI\nRtlFindUnicodeSubstring(\n    _In_ PCUNICODE_STRING FullString,\n    _In_ PCUNICODE_STRING SearchString,\n    _In_ BOOLEAN CaseInSensitive\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#define RTL_FIND_CHAR_IN_UNICODE_STRING_START_AT_END 0x00000001\n#define RTL_FIND_CHAR_IN_UNICODE_STRING_COMPLEMENT_CHAR_SET 0x00000002\n#define RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE 0x00000004\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFindCharInUnicodeString(\n    _In_ ULONG Flags,\n    _In_ PCUNICODE_STRING StringToSearch,\n    _In_ PCUNICODE_STRING CharSet,\n    _Out_ PUSHORT NonInclusivePrefixLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAppendUnicodeStringToString(\n    _Inout_ PUNICODE_STRING Destination,\n    _In_ PCUNICODE_STRING Source\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAppendUnicodeToString(\n    _Inout_ PUNICODE_STRING Destination,\n    _In_opt_z_ PCWSTR Source\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDowncaseUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlEraseUnicodeString(\n    _Inout_ PUNICODE_STRING String\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAnsiStringToUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ PCANSI_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlxAnsiStringToUnicodeSize(\n    _In_ PCANSI_STRING AnsiString\n    );\n\n// NTSYSAPI\n// ULONG\n// NTAPI\n// RtlAnsiStringToUnicodeSize(\n//     _In_ PCANSI_STRING AnsiString\n//     );\n\n#define RtlAnsiStringToUnicodeSize(STRING) \\\n    RtlxAnsiStringToUnicodeSize(STRING)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeStringToAnsiString(\n    _Inout_ PANSI_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\n// rev\nNTSYSAPI\nULONG\nNTAPI\nRtlUnicodeStringToAnsiSize(\n    _In_ PCUNICODE_STRING SourceString\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeStringToUTF8String(\n    _Inout_ PUTF8_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUTF8StringToUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ PCUTF8_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\nNTSYSAPI\nWCHAR\nNTAPI\nRtlAnsiCharToUnicodeChar(\n    _Inout_ PUCHAR *SourceCharacter\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeStringToAnsiString(\n    _Inout_ PANSI_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlOemStringToUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ POEM_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeStringToOemString(\n    _Inout_ POEM_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeStringToOemString(\n    _Inout_ POEM_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlOemStringToCountedUnicodeString(\n    _Inout_ PUNICODE_STRING DestinationString,\n    _In_ PCOEM_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeStringToCountedOemString(\n    _Inout_ POEM_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeStringToCountedOemString(\n    _Inout_ POEM_STRING DestinationString,\n    _In_ PCUNICODE_STRING SourceString,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlMultiByteToUnicodeN(\n    _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,\n    _In_ ULONG MaxBytesInUnicodeString,\n    _Out_opt_ PULONG BytesInUnicodeString,\n    _In_reads_bytes_(BytesInMultiByteString) PCSTR MultiByteString,\n    _In_ ULONG BytesInMultiByteString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlMultiByteToUnicodeSize(\n    _Out_ PULONG BytesInUnicodeString,\n    _In_reads_bytes_(BytesInMultiByteString) PCSTR MultiByteString,\n    _In_ ULONG BytesInMultiByteString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeToMultiByteN(\n    _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString,\n    _In_ ULONG MaxBytesInMultiByteString,\n    _Out_opt_ PULONG BytesInMultiByteString,\n    _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeToMultiByteSize(\n    _Out_ PULONG BytesInMultiByteString,\n    _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeToMultiByteN(\n    _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString,\n    _In_ ULONG MaxBytesInMultiByteString,\n    _Out_opt_ PULONG BytesInMultiByteString,\n    _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlOemToUnicodeN(\n    _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWSTR UnicodeString,\n    _In_ ULONG MaxBytesInUnicodeString,\n    _Out_opt_ PULONG BytesInUnicodeString,\n    _In_reads_bytes_(BytesInOemString) PCCH OemString,\n    _In_ ULONG BytesInOemString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeToOemN(\n    _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString,\n    _In_ ULONG MaxBytesInOemString,\n    _Out_opt_ PULONG BytesInOemString,\n    _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeToOemN(\n    _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString,\n    _In_ ULONG MaxBytesInOemString,\n    _Out_opt_ PULONG BytesInOemString,\n    _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlConsoleMultiByteToUnicodeN(\n    _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,\n    _In_ ULONG MaxBytesInUnicodeString,\n    _Out_opt_ PULONG BytesInUnicodeString,\n    _In_reads_bytes_(BytesInMultiByteString) PCCH MultiByteString,\n    _In_ ULONG BytesInMultiByteString,\n    _Out_ PULONG pdwSpecialChar\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUTF8ToUnicodeN(\n    _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount) PWSTR UnicodeStringDestination,\n    _In_ ULONG UnicodeStringMaxByteCount,\n    _Out_opt_ PULONG UnicodeStringActualByteCount,\n    _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource,\n    _In_ ULONG UTF8StringByteCount\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeToUTF8N(\n    _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount) PCHAR UTF8StringDestination,\n    _In_ ULONG UTF8StringMaxByteCount,\n    _Out_opt_ PULONG UTF8StringActualByteCount,\n    _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource,\n    _In_ ULONG UnicodeStringByteCount\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCustomCPToUnicodeN(\n    _In_ PCPTABLEINFO CustomCP,\n    _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,\n    _In_ ULONG MaxBytesInUnicodeString,\n    _Out_opt_ PULONG BytesInUnicodeString,\n    _In_reads_bytes_(BytesInCustomCPString) PCH CustomCPString,\n    _In_ ULONG BytesInCustomCPString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeToCustomCPN(\n    _In_ PCPTABLEINFO CustomCP,\n    _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString,\n    _In_ ULONG MaxBytesInCustomCPString,\n    _Out_opt_ PULONG BytesInCustomCPString,\n    _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpcaseUnicodeToCustomCPN(\n    _In_ PCPTABLEINFO CustomCP,\n    _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString,\n    _In_ ULONG MaxBytesInCustomCPString,\n    _Out_opt_ PULONG BytesInCustomCPString,\n    _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString,\n    _In_ ULONG BytesInUnicodeString\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitCodePageTable(\n    _In_reads_z_(2) PUSHORT TableBase,\n    _Inout_ PCPTABLEINFO CodePageTable\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitNlsTables(\n    _In_ PUSHORT AnsiNlsBase,\n    _In_ PUSHORT OemNlsBase,\n    _In_ PUSHORT LanguageNlsBase,\n    _Out_ PNLSTABLEINFO TableInfo // PCPTABLEINFO?\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlResetRtlTranslations(\n    _In_ PNLSTABLEINFO TableInfo\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsTextUnicode(\n    _In_ PVOID Buffer,\n    _In_ ULONG Size,\n    _Inout_opt_ PULONG Result\n    );\n\ntypedef enum _RTL_NORM_FORM\n{\n    NormOther = 0x0,\n    NormC = 0x1,\n    NormD = 0x2,\n    NormKC = 0x5,\n    NormKD = 0x6,\n    NormIdna = 0xd,\n    DisallowUnassigned = 0x100,\n    NormCDisallowUnassigned = 0x101,\n    NormDDisallowUnassigned = 0x102,\n    NormKCDisallowUnassigned = 0x105,\n    NormKDDisallowUnassigned = 0x106,\n    NormIdnaDisallowUnassigned = 0x10d\n} RTL_NORM_FORM;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNormalizeString(\n    _In_ ULONG NormForm, // RTL_NORM_FORM\n    _In_ PCWSTR SourceString,\n    _In_ LONG SourceStringLength,\n    _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString,\n    _Inout_ PLONG DestinationStringLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIsNormalizedString(\n    _In_ ULONG NormForm, // RTL_NORM_FORM\n    _In_ PCWSTR SourceString,\n    _In_ LONG SourceStringLength,\n    _Out_ PBOOLEAN Normalized\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// ntifs:FsRtlIsNameInExpression\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsNameInExpression(\n    _In_ PCUNICODE_STRING Expression,\n    _In_ PCUNICODE_STRING Name,\n    _In_ BOOLEAN IgnoreCase,\n    _In_opt_ PWCH UpcaseTable\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsNameInUnUpcasedExpression(\n    _In_ PCUNICODE_STRING Expression,\n    _In_ PCUNICODE_STRING Name,\n    _In_ BOOLEAN IgnoreCase,\n    _In_opt_ PWCH UpcaseTable\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_19H1)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDoesNameContainWildCards(\n    _In_ PCUNICODE_STRING Expression\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_19H1\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualDomainName(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualComputerName(\n    _In_ PCUNICODE_STRING String1,\n    _In_ PCUNICODE_STRING String2\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDnsHostNameToComputerName(\n    _Out_ PUNICODE_STRING ComputerNameString,\n    _In_ PCUNICODE_STRING DnsHostNameString,\n    _In_ BOOLEAN AllocateComputerNameString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlStringFromGUID(\n    _In_ PGUID Guid,\n    _Out_ PUNICODE_STRING GuidString\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n\n#define RTL_GUID_STRING_SIZE 38\n#define MAX_UNICODE_GUID_STRING_LENGTH (36 + sizeof(UNICODE_NULL))\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlStringFromGUIDEx(\n    _In_ PGUID Guid,\n    _Inout_ PUNICODE_STRING GuidString,\n    _In_ BOOLEAN AllocateGuidString\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGUIDFromString(\n    _In_ PCUNICODE_STRING GuidString,\n    _Out_ PGUID Guid\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nLONG\nNTAPI\nRtlCompareAltitudes(\n    _In_ PCUNICODE_STRING Altitude1,\n    _In_ PCUNICODE_STRING Altitude2\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIdnToAscii(\n    _In_ ULONG Flags,\n    _In_ PCWSTR SourceString,\n    _In_ LONG SourceStringLength,\n    _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString,\n    _Inout_ PLONG DestinationStringLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIdnToUnicode(\n    _In_ ULONG Flags,\n    _In_ PCWSTR SourceString,\n    _In_ LONG SourceStringLength,\n    _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString,\n    _Inout_ PLONG DestinationStringLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIdnToNameprepUnicode(\n    _In_ ULONG Flags,\n    _In_ PCWSTR SourceString,\n    _In_ LONG SourceStringLength,\n    _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString,\n    _Inout_ PLONG DestinationStringLength\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// Prefix\n//\n\ntypedef struct _PREFIX_TABLE_ENTRY\n{\n    CSHORT NodeTypeCode;\n    CSHORT NameLength;\n    struct _PREFIX_TABLE_ENTRY *NextPrefixTree;\n    RTL_SPLAY_LINKS Links;\n    PSTRING Prefix;\n} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;\n\ntypedef struct _PREFIX_TABLE\n{\n    CSHORT NodeTypeCode;\n    CSHORT NameLength;\n    PPREFIX_TABLE_ENTRY NextPrefixTree;\n} PREFIX_TABLE, *PPREFIX_TABLE;\n\nNTSYSAPI\nVOID\nNTAPI\nPfxInitialize(\n    _Out_ PPREFIX_TABLE PrefixTable\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nPfxInsertPrefix(\n    _In_ PPREFIX_TABLE PrefixTable,\n    _In_ PSTRING Prefix,\n    _Out_ PPREFIX_TABLE_ENTRY PrefixTableEntry\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nPfxRemovePrefix(\n    _In_ PPREFIX_TABLE PrefixTable,\n    _In_ PPREFIX_TABLE_ENTRY PrefixTableEntry\n    );\n\nNTSYSAPI\nPPREFIX_TABLE_ENTRY\nNTAPI\nPfxFindPrefix(\n    _In_ PPREFIX_TABLE PrefixTable,\n    _In_ PSTRING FullName\n    );\n\ntypedef struct _UNICODE_PREFIX_TABLE_ENTRY\n{\n    CSHORT NodeTypeCode;\n    CSHORT NameLength;\n    struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;\n    struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;\n    RTL_SPLAY_LINKS Links;\n    PUNICODE_STRING Prefix;\n} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;\n\ntypedef struct _UNICODE_PREFIX_TABLE\n{\n    CSHORT NodeTypeCode;\n    CSHORT NameLength;\n    PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;\n    PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;\n} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeUnicodePrefix(\n    _Out_ PUNICODE_PREFIX_TABLE PrefixTable\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlInsertUnicodePrefix(\n    _In_ PUNICODE_PREFIX_TABLE PrefixTable,\n    _In_ PCUNICODE_STRING Prefix,\n    _Out_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRemoveUnicodePrefix(\n    _In_ PUNICODE_PREFIX_TABLE PrefixTable,\n    _In_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry\n    );\n\nNTSYSAPI\nPUNICODE_PREFIX_TABLE_ENTRY\nNTAPI\nRtlFindUnicodePrefix(\n    _In_ PUNICODE_PREFIX_TABLE PrefixTable,\n    _In_ PCUNICODE_STRING FullName,\n    _In_ ULONG CaseInsensitiveIndex\n    );\n\nNTSYSAPI\nPUNICODE_PREFIX_TABLE_ENTRY\nNTAPI\nRtlNextUnicodePrefix(\n    _In_ PUNICODE_PREFIX_TABLE PrefixTable,\n    _In_ BOOLEAN Restart\n    );\n\n//\n// Compression\n//\n\n#define COMPRESSION_FORMAT_NONE          (0x0000)\n#define COMPRESSION_FORMAT_DEFAULT       (0x0001)\n#define COMPRESSION_FORMAT_LZNT1         (0x0002)\n#define COMPRESSION_FORMAT_XPRESS        (0x0003)\n#define COMPRESSION_FORMAT_XPRESS_HUFF   (0x0004)\n#define COMPRESSION_FORMAT_XP10          (0x0005)\n#define COMPRESSION_FORMAT_LZ4           (0x0006)\n#define COMPRESSION_FORMAT_DEFLATE       (0x0007)\n#define COMPRESSION_FORMAT_ZLIB          (0x0008)\n#define COMPRESSION_FORMAT_MAX           (0x0008)\n\n#define COMPRESSION_ENGINE_STANDARD      (0x0000)\n#define COMPRESSION_ENGINE_MAXIMUM       (0x0100)\n#define COMPRESSION_ENGINE_HIBER         (0x0200)\n#define COMPRESSION_ENGINE_MAX           (0x0200)\n\n#define COMPRESSION_FORMAT_MASK          (0x00FF)\n#define COMPRESSION_ENGINE_MASK          (0xFF00)\n#define COMPRESSION_FORMAT_ENGINE_MASK   (COMPRESSION_FORMAT_MASK | COMPRESSION_ENGINE_MASK)\n\ntypedef struct _COMPRESSED_DATA_INFO\n{\n    //\n    //  Code for the compression format (and engine) as\n    //  defined in ntrtl.h.  Note that COMPRESSION_FORMAT_NONE\n    //  and COMPRESSION_FORMAT_DEFAULT are invalid if\n    //  any of the described chunks are compressed.\n    //\n\n    USHORT CompressionFormatAndEngine;\n\n    //\n    //  Since chunks and compression units are expected to be\n    //  powers of 2 in size, we express then log2.  So, for\n    //  example (1 << ChunkShift) == ChunkSizeInBytes.  The\n    //  ClusterShift indicates how much space must be saved\n    //  to successfully compress a compression unit - each\n    //  successfully compressed compression unit must occupy\n    //  at least one cluster less in bytes than an uncompressed\n    //  compression unit.\n    //\n\n    UCHAR CompressionUnitShift;\n    UCHAR ChunkShift;\n    UCHAR ClusterShift;\n    UCHAR Reserved;\n\n    //\n    //  This is the number of entries in the CompressedChunkSizes\n    //  array.\n    //\n\n    USHORT NumberOfChunks;\n\n    //\n    //  This is an array of the sizes of all chunks resident\n    //  in the compressed data buffer.  There must be one entry\n    //  in this array for each chunk possible in the uncompressed\n    //  buffer size.  A size of FSRTL_CHUNK_SIZE indicates the\n    //  corresponding chunk is uncompressed and occupies exactly\n    //  that size.  A size of 0 indicates that the corresponding\n    //  chunk contains nothing but binary 0's, and occupies no\n    //  space in the compressed data.  All other sizes must be\n    //  less than FSRTL_CHUNK_SIZE, and indicate the exact size\n    //  of the compressed data in bytes.\n    //\n\n    ULONG CompressedChunkSizes[ANYSIZE_ARRAY];\n} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetCompressionWorkSpaceSize(\n    _In_ USHORT CompressionFormatAndEngine,\n    _Out_ PULONG CompressBufferWorkSpaceSize,\n    _Out_ PULONG CompressFragmentWorkSpaceSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCompressBuffer(\n    _In_ USHORT CompressionFormatAndEngine,\n    _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _In_ ULONG UncompressedChunkSize,\n    _Out_ PULONG FinalCompressedSize,\n    _In_ PVOID WorkSpace\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressBuffer(\n    _In_ USHORT CompressionFormat,\n    _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _Out_ PULONG FinalUncompressedSize\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressBufferEx(\n    _In_ USHORT CompressionFormat,\n    _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _Out_ PULONG FinalUncompressedSize,\n    _In_opt_ PVOID WorkSpace\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressBufferEx2(\n    _In_ USHORT CompressionFormat,\n    _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _In_ ULONG UncompressedChunkSize,\n    _Out_ PULONG FinalUncompressedSize,\n    _In_opt_ PVOID WorkSpace\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressFragment(\n    _In_ USHORT CompressionFormat,\n    _Out_writes_bytes_to_(UncompressedFragmentSize, *FinalUncompressedSize) PUCHAR UncompressedFragment,\n    _In_ ULONG UncompressedFragmentSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _In_range_(<, CompressedBufferSize) ULONG FragmentOffset,\n    _Out_ PULONG FinalUncompressedSize,\n    _In_ PVOID WorkSpace\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressFragmentEx(\n    _In_ USHORT CompressionFormat,\n    _Out_writes_bytes_to_(UncompressedFragmentSize, *FinalUncompressedSize) PUCHAR UncompressedFragment,\n    _In_ ULONG UncompressedFragmentSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _In_range_(<, CompressedBufferSize) ULONG FragmentOffset,\n    _In_ ULONG UncompressedChunkSize,\n    _Out_ PULONG FinalUncompressedSize,\n    _In_ PVOID WorkSpace\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDescribeChunk(\n    _In_ USHORT CompressionFormat,\n    _Inout_ PUCHAR *CompressedBuffer,\n    _In_ PUCHAR EndOfCompressedBufferPlus1,\n    _Out_ PUCHAR *ChunkBuffer,\n    _Out_ PULONG ChunkSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReserveChunk(\n    _In_ USHORT CompressionFormat,\n    _Inout_ PUCHAR *CompressedBuffer,\n    _In_ PUCHAR EndOfCompressedBufferPlus1,\n    _Out_ PUCHAR *ChunkBuffer,\n    _In_ ULONG ChunkSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecompressChunks(\n    _Out_writes_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_ ULONG CompressedBufferSize,\n    _In_reads_bytes_(CompressedTailSize) PUCHAR CompressedTail,\n    _In_ ULONG CompressedTailSize,\n    _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCompressChunks(\n    _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,\n    _In_ ULONG UncompressedBufferSize,\n    _Out_writes_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,\n    _In_range_(>=, (UncompressedBufferSize - (UncompressedBufferSize / 16))) ULONG CompressedBufferSize,\n    _Inout_updates_bytes_(CompressedDataInfoLength) PCOMPRESSED_DATA_INFO CompressedDataInfo,\n    _In_range_(>, sizeof(COMPRESSED_DATA_INFO)) ULONG CompressedDataInfoLength,\n    _In_ PVOID WorkSpace\n    );\n\n// Locale\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlConvertLCIDToString(\n    _In_ LCID LcidValue,\n    _In_ ULONG Base,\n    _In_ ULONG Padding, // string is padded to this width\n    _Out_writes_(Size) PWSTR pResultBuf,\n    _In_ ULONG Size\n    );\n\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsValidLocaleName(\n    _In_ PCWSTR LocaleName,\n    _In_ ULONG Flags\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetParentLocaleName(\n    _In_ PCWSTR LocaleName,\n    _Inout_ PUNICODE_STRING ParentLocaleName,\n    _In_ ULONG Flags,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLcidToLocaleName(\n    _In_ LCID lcid, // sic\n    _Inout_ PUNICODE_STRING LocaleName,\n    _In_ ULONG Flags,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLocaleNameToLcid(\n    _In_ PCWSTR LocaleName,\n    _Out_ PLCID lcid,\n    _In_ ULONG Flags\n    );\n\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlLCIDToCultureName(\n    _In_ LCID Lcid,\n    _Inout_ PUNICODE_STRING String\n    );\n\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCultureNameToLCID(\n    _In_ PCUNICODE_STRING String,\n    _Out_ PLCID Lcid\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlCleanUpTEBLangLists(\n    VOID\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n// rev from GetThreadPreferredUILanguages\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetThreadPreferredUILanguages(\n    _In_ ULONG Flags, // MUI_LANGUAGE_NAME\n    _Out_ PULONG NumberOfLanguages,\n    _Out_writes_opt_(*ReturnLength) PZZWSTR Languages,\n    _Inout_ PULONG ReturnLength\n    );\n\n// rev from GetProcessPreferredUILanguages\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetProcessPreferredUILanguages(\n    _In_ ULONG Flags, // MUI_LANGUAGE_NAME\n    _Out_ PULONG NumberOfLanguages,\n    _Out_writes_opt_(*ReturnLength) PZZWSTR Languages,\n    _Inout_ PULONG ReturnLength\n    );\n\n// rev from GetSystemPreferredUILanguages\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSystemPreferredUILanguages(\n    _In_ ULONG Flags, // MUI_LANGUAGE_NAME\n    _In_opt_ PCWSTR LocaleName,\n    _Out_ PULONG NumberOfLanguages,\n    _Out_writes_opt_(*ReturnLength) PZZWSTR Languages,\n    _Inout_ PULONG ReturnLength\n    );\n\n// rev from GetSystemDefaultUILanguage\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlpGetSystemDefaultUILanguage(\n    _Out_ LANGID DefaultUILanguageId,\n    _Inout_ PLCID Lcid\n    );\n\n// rev from GetUserPreferredUILanguages\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetUserPreferredUILanguages(\n    _In_ ULONG Flags, // MUI_LANGUAGE_NAME\n    _In_opt_ PCWSTR LocaleName,\n    _Out_ PULONG NumberOfLanguages,\n    _Out_writes_opt_(*ReturnLength) PZZWSTR Languages,\n    _Inout_ PULONG ReturnLength\n    );\n\n// rev from GetUILanguageInfo\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetUILanguageInfo(\n    _In_ ULONG Flags,\n    _In_ PCZZWSTR Languages,\n    _Out_writes_opt_(*NumberOfFallbackLanguages) PZZWSTR FallbackLanguages,\n    _Inout_opt_ PULONG NumberOfFallbackLanguages,\n    _Out_ PULONG Attributes\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetLocaleFileMappingAddress(\n    _Out_ PVOID *BaseAddress,\n    _Out_ PLCID DefaultLocaleId,\n    _Out_ PLARGE_INTEGER DefaultCasingTableSize,\n    _Out_opt_ PULONG CurrentNLSVersion\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n//\n// PEB\n//\n\nNTSYSAPI\nPPEB\nNTAPI\nRtlGetCurrentPeb(\n    VOID\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAcquirePebLock(\n    VOID\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReleasePebLock(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlTryAcquirePebLock(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION < PHNT_WINDOWS_VISTA)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAllocateFromPeb(\n    _In_ ULONG Size,\n    _Out_ PVOID *Block\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFreeToPeb(\n    _In_ PVOID Block,\n    _In_ ULONG Size\n    );\n#endif // PHNT_VERSION < PHNT_WINDOWS_VISTA\n\n//\n// Processes\n//\n\n// CURDIR Handle | Flags\n#define RTL_USER_PROC_CURDIR_CLOSE 0x00000002\n#define RTL_USER_PROC_CURDIR_INHERIT 0x00000003\n\ntypedef struct _CURDIR\n{\n    UNICODE_STRING DosPath;\n    HANDLE Handle;\n} CURDIR, *PCURDIR;\n\n// RTL_DRIVE_LETTER_CURDIR Flags\n#define RTL_MAX_DRIVE_LETTERS 32\n#define RTL_DRIVE_LETTER_VALID (USHORT)0x0001\n\ntypedef struct _RTL_DRIVE_LETTER_CURDIR\n{\n    USHORT Flags;\n    USHORT Length;\n    ULONG TimeStamp;\n    STRING DosPath;\n} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;\n\n#define RTL_USER_PROC_DETACHED_PROCESS ((HANDLE)(LONG_PTR)-1)\n#define RTL_USER_PROC_CREATE_NEW_CONSOLE ((HANDLE)(LONG_PTR)-2)\n#define RTL_USER_PROC_CREATE_NO_WINDOW ((HANDLE)(LONG_PTR)-3)\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS\n{\n    ULONG MaximumLength;\n    ULONG Length;\n\n    ULONG Flags;\n    ULONG DebugFlags;\n\n    HANDLE ConsoleHandle;\n    ULONG ConsoleFlags;\n    HANDLE StandardInput;\n    HANDLE StandardOutput;\n    HANDLE StandardError;\n\n    CURDIR CurrentDirectory;\n    UNICODE_STRING DllPath;\n    UNICODE_STRING ImagePathName;\n    UNICODE_STRING CommandLine;\n    PVOID Environment;\n\n    ULONG StartingX;\n    ULONG StartingY;\n    ULONG CountX;\n    ULONG CountY;\n    ULONG CountCharsX;\n    ULONG CountCharsY;\n    ULONG FillAttribute;\n\n    ULONG WindowFlags;\n    ULONG ShowWindowFlags;\n    UNICODE_STRING WindowTitle;\n    UNICODE_STRING DesktopInfo;\n    UNICODE_STRING ShellInfo;\n    UNICODE_STRING RuntimeData;\n    RTL_DRIVE_LETTER_CURDIR CurrentDirectories[RTL_MAX_DRIVE_LETTERS];\n\n    ULONG_PTR EnvironmentSize;\n    ULONG_PTR EnvironmentVersion;\n\n    PVOID PackageDependencyData;\n    ULONG ProcessGroupId;\n    ULONG LoaderThreads;\n    UNICODE_STRING RedirectionDllName; // REDSTONE4\n    UNICODE_STRING HeapPartitionName; // 19H1\n    PULONGLONG DefaultThreadpoolCpuSetMasks;\n    ULONG DefaultThreadpoolCpuSetMaskCount;\n    ULONG DefaultThreadpoolThreadMaximum;\n    ULONG HeapMemoryTypeMask; // WIN11\n} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;\n\n// RTL_USER_PROCESS_PARAMETERS Flags\n#define RTL_USER_PROC_PARAMS_NORMALIZED                 0x00000001\n#define RTL_USER_PROC_PROFILE_USER                      0x00000002\n#define RTL_USER_PROC_PROFILE_KERNEL                    0x00000004\n#define RTL_USER_PROC_PROFILE_SERVER                    0x00000008\n#define RTL_USER_PROC_RESERVE_1MB                       0x00000020\n#define RTL_USER_PROC_RESERVE_16MB                      0x00000040\n#define RTL_USER_PROC_CASE_SENSITIVE                    0x00000080\n#define RTL_USER_PROC_DISABLE_HEAP_DECOMMIT             0x00000100\n#define RTL_USER_PROC_DLL_REDIRECTION_LOCAL             0x00001000\n#define RTL_USER_PROC_APP_MANIFEST_PRESENT              0x00002000\n#define RTL_USER_PROC_IMAGE_KEY_MISSING                 0x00004000\n#define RTL_USER_PROC_DEV_OVERRIDE_ENABLED              0x00008000\n#define RTL_USER_PROC_OPTIN_PROCESS                     0x00020000\n#define RTL_USER_PROC_OPTIN_PROCESS                     0x00020000\n#define RTL_USER_PROC_SESSION_OWNER                     0x00040000\n#define RTL_USER_PROC_HANDLE_USER_CALLBACK_EXCEPTIONS   0x00080000\n#define RTL_USER_PROC_PROTECTED_PROCESS                 0x00400000\n#define RTL_USER_PROC_SECURE_PROCESS                    0x80000000\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateProcessParameters(\n    _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,\n    _In_ PCUNICODE_STRING ImagePathName,\n    _In_opt_ PCUNICODE_STRING DllPath,\n    _In_opt_ PCUNICODE_STRING CurrentDirectory,\n    _In_opt_ PCUNICODE_STRING CommandLine,\n    _In_opt_ PVOID Environment,\n    _In_opt_ PCUNICODE_STRING WindowTitle,\n    _In_opt_ PCUNICODE_STRING DesktopInfo,\n    _In_opt_ PCUNICODE_STRING ShellInfo,\n    _In_opt_ PCUNICODE_STRING RuntimeData\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateProcessParametersEx(\n    _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,\n    _In_ PCUNICODE_STRING ImagePathName,\n    _In_opt_ PCUNICODE_STRING DllPath,\n    _In_opt_ PCUNICODE_STRING CurrentDirectory,\n    _In_opt_ PCUNICODE_STRING CommandLine,\n    _In_opt_ PVOID Environment,\n    _In_opt_ PCUNICODE_STRING WindowTitle,\n    _In_opt_ PCUNICODE_STRING DesktopInfo,\n    _In_opt_ PCUNICODE_STRING ShellInfo,\n    _In_opt_ PCUNICODE_STRING RuntimeData,\n    _In_ ULONG Flags // pass RTL_USER_PROC_PARAMS_NORMALIZED to keep parameters normalized\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateProcessParametersWithTemplate(\n    _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,\n    _In_ PCUNICODE_STRING ImagePathName,\n    _In_opt_ PCUNICODE_STRING DllPath,\n    _In_opt_ PCUNICODE_STRING CurrentDirectory,\n    _In_opt_ PCUNICODE_STRING CommandLine,\n    _In_opt_ PVOID Environment,\n    _In_opt_ PCUNICODE_STRING WindowTitle,\n    _In_opt_ PCUNICODE_STRING DesktopInfo,\n    _In_opt_ PCUNICODE_STRING ShellInfo,\n    _In_opt_ PCUNICODE_STRING RuntimeData,\n    _In_opt_ PCUNICODE_STRING RedirectionDllName,\n    _In_ ULONG Flags // pass RTL_USER_PROC_PARAMS_NORMALIZED to keep parameters normalized\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyProcessParameters(\n    _In_ _Post_invalid_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters\n    );\n\nNTSYSAPI\nPRTL_USER_PROCESS_PARAMETERS\nNTAPI\nRtlNormalizeProcessParams(\n    _Inout_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters\n    );\n\nNTSYSAPI\nPRTL_USER_PROCESS_PARAMETERS\nNTAPI\nRtlDeNormalizeProcessParams(\n    _Inout_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters\n    );\n\ntypedef struct _RTL_USER_PROCESS_INFORMATION\n{\n    ULONG Length;\n    HANDLE ProcessHandle;\n    HANDLE ThreadHandle;\n    CLIENT_ID ClientId;\n    SECTION_IMAGE_INFORMATION ImageInformation;\n} RTL_USER_PROCESS_INFORMATION, *PRTL_USER_PROCESS_INFORMATION;\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateUserProcess(\n    _In_ PCUNICODE_STRING NtImagePathName,\n    _In_ ULONG ExtendedParameters, // HIWORD(NumaNodeNumber), LOWORD(Reserved)\n    _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,\n    _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,\n    _In_opt_ HANDLE ParentProcess,\n    _In_ BOOLEAN InheritHandles,\n    _In_opt_ HANDLE DebugPort,\n    _In_opt_ HANDLE TokenHandle, // used to be ExceptionPort\n    _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation\n    );\n\n#define RTL_USER_PROCESS_EXTENDED_PARAMETERS_VERSION 1\n\n// private\ntypedef struct _RTL_USER_PROCESS_EXTENDED_PARAMETERS\n{\n    USHORT Version;\n    USHORT NodeNumber;\n    PSECURITY_DESCRIPTOR ProcessSecurityDescriptor;\n    PSECURITY_DESCRIPTOR ThreadSecurityDescriptor;\n    HANDLE ParentProcess;\n    HANDLE DebugPort;\n    HANDLE TokenHandle;\n    HANDLE JobHandle;\n} RTL_USER_PROCESS_EXTENDED_PARAMETERS, *PRTL_USER_PROCESS_EXTENDED_PARAMETERS;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateUserProcessEx(\n    _In_ PCUNICODE_STRING NtImagePathName,\n    _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,\n    _In_ BOOLEAN InheritHandles,\n    _In_opt_ PRTL_USER_PROCESS_EXTENDED_PARAMETERS ProcessExtendedParameters,\n    _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS2\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n_Analysis_noreturn_\nDECLSPEC_NORETURN\nNTSYSAPI\nVOID\nNTAPI\nRtlExitUserProcess(\n    _In_ NTSTATUS ExitStatus\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// begin_rev\n#define RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED 0x00000001\n#define RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES 0x00000002\n#define RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE 0x00000004 // don't update synchronization objects\n// end_rev\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCloneUserProcess(\n    _In_ ULONG ProcessFlags,\n    _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,\n    _In_opt_ HANDLE DebugPort,\n    _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlPrepareForProcessCloning(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCompleteProcessCloning(\n    _In_ LOGICAL Completed\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlUpdateClonedCriticalSection(\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlUpdateClonedSRWLock(\n    _Inout_ PRTL_SRWLOCK SRWLock,\n    _In_ LOGICAL Shared // TRUE to set to shared acquire\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// rev\n#define RTL_PROCESS_REFLECTION_FLAGS_INHERIT_HANDLES 0x2\n#define RTL_PROCESS_REFLECTION_FLAGS_NO_SUSPEND 0x4\n#define RTL_PROCESS_REFLECTION_FLAGS_NO_SYNCHRONIZE 0x8\n#define RTL_PROCESS_REFLECTION_FLAGS_NO_CLOSE_EVENT 0x10\n\n// private\ntypedef struct _RTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION\n{\n    HANDLE ReflectionProcessHandle;\n    HANDLE ReflectionThreadHandle;\n    CLIENT_ID ReflectionClientId;\n} RTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION, *PRTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION;\n\ntypedef RTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION PROCESS_REFLECTION_INFORMATION, *PPROCESS_REFLECTION_INFORMATION;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateProcessReflection(\n    _In_ HANDLE ProcessHandle,\n    _In_ ULONG Flags, // RTL_PROCESS_REFLECTION_FLAGS_*\n    _In_opt_ PVOID StartRoutine,\n    _In_opt_ PVOID StartContext,\n    _In_opt_ HANDLE EventHandle,\n    _Out_opt_ PRTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION ReflectionInformation\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\nNTSYSAPI\nNTSTATUS\nSTDAPIVCALLTYPE\nRtlSetProcessIsCritical(\n    _In_ BOOLEAN NewValue,\n    _Out_opt_ PBOOLEAN OldValue,\n    _In_ BOOLEAN CheckFlag\n    );\n\nNTSYSAPI\nNTSTATUS\nSTDAPIVCALLTYPE\nRtlSetThreadIsCritical(\n    _In_ BOOLEAN NewValue,\n    _Out_opt_ PBOOLEAN OldValue,\n    _In_ BOOLEAN CheckFlag\n    );\n\n// rev\nNTSYSAPI\nPVOID\nNTAPI\nRtlSetThreadSubProcessTag(\n    _In_ PVOID SubProcessTag\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidProcessProtection(\n    _In_ PS_PROTECTION ProcessProtection\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTestProtectedAccess(\n    _In_ PS_PROTECTION Source,\n    _In_ PS_PROTECTION Target\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsCurrentProcess( // NtCompareObjects(NtCurrentProcess(), ProcessHandle)\n    _In_ HANDLE ProcessHandle\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsCurrentThread( // NtCompareObjects(NtCurrentThread(), ThreadHandle)\n    _In_ HANDLE ThreadHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n// Threads\n\ntypedef NTSTATUS (NTAPI *PUSER_THREAD_START_ROUTINE)(\n    _In_ PVOID ThreadParameter\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateUserThread(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,\n    _In_ BOOLEAN CreateSuspended,\n    _In_opt_ ULONG ZeroBits,\n    _In_opt_ SIZE_T MaximumStackSize,\n    _In_opt_ SIZE_T CommittedStackSize,\n    _In_ PUSER_THREAD_START_ROUTINE StartAddress,\n    _In_opt_ PVOID Parameter,\n    _Out_opt_ PHANDLE ThreadHandle,\n    _Out_opt_ PCLIENT_ID ClientId\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_XP)\n_Analysis_noreturn_\nDECLSPEC_NORETURN\nNTSYSAPI\nVOID\nNTAPI\nRtlExitUserThread(\n    _In_ NTSTATUS ExitStatus\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_XP\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsCurrentThreadAttachExempt(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateUserStack(\n    _In_opt_ SIZE_T CommittedStackSize,\n    _In_opt_ SIZE_T MaximumStackSize,\n    _In_opt_ ULONG_PTR ZeroBits,\n    _In_ SIZE_T PageSize,\n    _In_ ULONG_PTR ReserveAlignment,\n    _Out_ PINITIAL_TEB InitialTeb\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFreeUserStack(\n    _In_ PVOID AllocationBase\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// Extended thread context\n//\n\ntypedef struct _CONTEXT_CHUNK\n{\n    LONG Offset; // Offset may be negative.\n    ULONG Length;\n} CONTEXT_CHUNK, *PCONTEXT_CHUNK;\n\ntypedef struct _CONTEXT_EX\n{\n    CONTEXT_CHUNK All;\n    CONTEXT_CHUNK Legacy;\n    CONTEXT_CHUNK XState;\n    CONTEXT_CHUNK KernelCet;\n} CONTEXT_EX, *PCONTEXT_EX;\n\n#if defined(_AMD64_) || defined(_ARM64_) || defined(_ARM64EC_)\n#define CONTEXT_ALIGN 0x10\n#else\n#define CONTEXT_ALIGN 0x8\n#endif // _AMD64_ || _ARM64_ || _ARM64EC_\n\n#if defined(_AMD64_)\n#define CONTEXT_FRAME_LENGTH 0x4D0\n#define CONTEXT_EX_PADDING   0x10\n#elif defined(_ARM64_) || defined(_ARM64EC_)\n#define CONTEXT_FRAME_LENGTH 0x390\n#define CONTEXT_EX_PADDING   0x10\n#elif defined(_M_ARM)\n#define CONTEXT_FRAME_LENGTH 0x1a0\n#define CONTEXT_EX_PADDING   0x8\n#else\n#define CONTEXT_FRAME_LENGTH 0x2CC\n#define CONTEXT_EX_PADDING   0x4\n#endif // _AMD64_\n\n#define CONTEXT_ALIGNMENT(Size, Align) \\\n    (((ULONG_PTR)(Size) + (Align) - 1) & ~((Align) - 1))\n\n#define CONTEXT_EX_LENGTH \\\n    CONTEXT_ALIGNMENT(sizeof(CONTEXT_EX), CONTEXT_ALIGN)\n\nC_ASSERT(CONTEXT_FRAME_LENGTH == sizeof(CONTEXT));\nC_ASSERT(CONTEXT_EX_LENGTH == 0x20);\n\n#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)\n#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)\n#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))\n#define RTL_CONTEXT_OFFSET(Context, Chunk) RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)\n#define RTL_CONTEXT_LENGTH(Context, Chunk) RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)\n#define RTL_CONTEXT_CHUNK(Context, Chunk) RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), (PCONTEXT_EX)(Context + 1), Chunk)\n\n#if defined(_M_AMD64)\n// returns constant 0xf0e0d0c0a0908070 (dmex)\nNTSYSAPI\nULONG64\nNTAPI\nRtlInitializeContext(\n    _Reserved_ HANDLE Reserved,\n    _Out_ PCONTEXT Context,\n    _In_opt_ PVOID Parameter,\n    _In_opt_ PVOID InitialPc,\n    _In_opt_ PVOID InitialSp\n    );\n#else\n// returns status of NtWriteVirtualMemory (dmex)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeContext(\n    _In_ HANDLE ProcessHandle,\n    _Out_ PCONTEXT Context,\n    _In_opt_ PVOID Parameter,\n    _In_opt_ PVOID InitialPc,\n    _In_opt_ PVOID InitialSp\n    );\n#endif // _M_AMD64\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeExtendedContext(\n    _Out_ PCONTEXT Context,\n    _In_ ULONG ContextFlags,\n    _Out_ PCONTEXT_EX* ContextEx\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeExtendedContext2(\n    _Out_ PCONTEXT Context,\n    _In_ ULONG ContextFlags,\n    _Out_ PCONTEXT_EX* ContextEx,\n    _In_ ULONG64 EnabledExtendedFeatures // RtlGetEnabledExtendedFeatures(-1)\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCopyContext(\n    _Inout_ PCONTEXT Context,\n    _In_ ULONG ContextFlags,\n    _Out_ PCONTEXT Source\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCopyExtendedContext(\n    _Out_ PCONTEXT_EX Destination,\n    _In_ ULONG ContextFlags,\n    _In_ PCONTEXT_EX Source\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetExtendedContextLength(\n    _In_ ULONG ContextFlags,\n    _Out_ PULONG ContextLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetExtendedContextLength2(\n    _In_ ULONG ContextFlags,\n    _Out_ PULONG ContextLength,\n    _In_ ULONG64 EnabledExtendedFeatures // RtlGetEnabledExtendedFeatures(-1)\n    );\n\nNTSYSAPI\nULONG64\nNTAPI\nRtlGetExtendedFeaturesMask(\n    _In_ PCONTEXT_EX ContextEx\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlLocateExtendedFeature(\n    _In_ PCONTEXT_EX ContextEx,\n    _In_ ULONG FeatureId,\n    _Out_opt_ PULONG Length\n    );\n\nNTSYSAPI\nPCONTEXT\nNTAPI\nRtlLocateLegacyContext(\n    _In_ PCONTEXT_EX ContextEx,\n    _Out_opt_ PULONG Length\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetExtendedFeaturesMask(\n    _In_ PCONTEXT_EX ContextEx,\n    _In_ ULONG64 FeatureMask\n    );\n\n#ifdef _WIN64\n#ifdef PHNT_INLINE_TYPEDEFS\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlWow64GetThreadContext(\n    _In_ HANDLE ThreadHandle,\n    _Inout_ PWOW64_CONTEXT ThreadContext\n    )\n{\n    return NtQueryInformationThread(\n        ThreadHandle,\n        ThreadWow64Context,\n        ThreadContext,\n        sizeof(WOW64_CONTEXT),\n        NULL\n        );\n}\n#else\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64GetThreadContext(\n    _In_ HANDLE ThreadHandle,\n    _Inout_ PWOW64_CONTEXT ThreadContext\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n#endif // _WIN64\n\n#ifdef _WIN64\n#ifdef PHNT_INLINE_TYPEDEFS\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlWow64SetThreadContext(\n    _In_ HANDLE ThreadHandle,\n    _In_ PWOW64_CONTEXT ThreadContext\n    )\n{\n    return NtSetInformationThread(\n        ThreadHandle,\n        ThreadWow64Context,\n        ThreadContext,\n        sizeof(WOW64_CONTEXT)\n        );\n}\n#else\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64SetThreadContext(\n    _In_ HANDLE ThreadHandle,\n    _In_ PWOW64_CONTEXT ThreadContext\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n#endif // _WIN64\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRemoteCall(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE ThreadHandle,\n    _In_ PVOID CallSite,\n    _In_ ULONG ArgumentCount,\n    _In_opt_ PULONG_PTR Arguments,\n    _In_ BOOLEAN PassContext,\n    _In_ BOOLEAN AlreadySuspended\n    );\n\n//\n// Vectored Exception Handlers\n//\n\n/**\n * Registers a vectored exception handler.\n *\n * @param First If this parameter is TRUE, the handler is the first handler in the list.\n * @param Handler A pointer to the vectored exception handler to be called.\n * @return A handle to the vectored exception handler.\n * @see https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-addvectoredexceptionhandler\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlAddVectoredExceptionHandler(\n    _In_ ULONG First,\n    _In_ PVECTORED_EXCEPTION_HANDLER Handler\n    );\n\n/**\n * Removes a vectored exception handler.\n *\n * @param Handle A handle to the vectored exception handler to remove.\n * @return The function returns 0 if the handler is removed, or -1 if the handler is not found.\n * @see https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-removevectoredexceptionhandler\n */\nNTSYSAPI\nULONG\nNTAPI\nRtlRemoveVectoredExceptionHandler(\n    _In_ PVOID Handle\n    );\n\n/**\n * Registers a vectored continue handler.\n *\n * @param First If this parameter is TRUE, the handler is the first handler in the list.\n * @param Handler A pointer to the vectored exception handler to be called.\n * @return A handle to the vectored continue handler.\n * @see https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-addvectoredcontinuehandler\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlAddVectoredContinueHandler(\n    _In_ ULONG First,\n    _In_ PVECTORED_EXCEPTION_HANDLER Handler\n    );\n\n/**\n * Removes a vectored continue handler.\n *\n * @param Handle A handle to the vectored continue handler to remove.\n * @return The function returns 0 if the handler is removed, or -1 if the handler is not found.\n * @see https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-removevectoredcontinuehandler\n */\nNTSYSAPI\nULONG\nNTAPI\nRtlRemoveVectoredContinueHandler(\n    _In_ PVOID Handle\n    );\n\n//\n// Runtime exception handling\n//\n\ntypedef ULONG (NTAPI *PRTLP_UNHANDLED_EXCEPTION_FILTER)(\n    _In_ PEXCEPTION_POINTERS ExceptionInfo\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetUnhandledExceptionFilter(\n    _In_ PRTLP_UNHANDLED_EXCEPTION_FILTER UnhandledExceptionFilter\n    );\n\n// rev\nNTSYSAPI\nLONG\nNTAPI\nRtlUnhandledExceptionFilter(\n    _In_ PEXCEPTION_POINTERS ExceptionPointers\n    );\n\n// rev\nNTSYSAPI\nLONG\nNTAPI\nRtlUnhandledExceptionFilter2(\n    _In_ PEXCEPTION_POINTERS ExceptionPointers,\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nLONG\nNTAPI\nRtlKnownExceptionFilter(\n    _In_ PEXCEPTION_POINTERS ExceptionPointers\n    );\n\n#ifdef _WIN64\n\n// private\ntypedef enum _FUNCTION_TABLE_TYPE\n{\n    RF_SORTED,\n    RF_UNSORTED,\n    RF_CALLBACK,\n    RF_KERNEL_DYNAMIC\n} FUNCTION_TABLE_TYPE;\n\n// private\ntypedef struct _DYNAMIC_FUNCTION_TABLE\n{\n    LIST_ENTRY ListEntry;\n    PRUNTIME_FUNCTION FunctionTable;\n    LARGE_INTEGER TimeStamp;\n    ULONG64 MinimumAddress;\n    ULONG64 MaximumAddress;\n    ULONG64 BaseAddress;\n    PGET_RUNTIME_FUNCTION_CALLBACK Callback;\n    PVOID Context;\n    PWSTR OutOfProcessCallbackDll;\n    FUNCTION_TABLE_TYPE Type;\n    ULONG EntryCount;\n    RTL_BALANCED_NODE TreeNodeMin;\n    RTL_BALANCED_NODE TreeNodeMax;\n} DYNAMIC_FUNCTION_TABLE, *PDYNAMIC_FUNCTION_TABLE;\n\n// rev\nNTSYSAPI\nPLIST_ENTRY\nNTAPI\nRtlGetFunctionTableListHead(\n    VOID\n    );\n\n#endif // _WIN64\n\n//\n// Linked lists\n//\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeSListHead(\n    _Out_ PSLIST_HEADER ListHead\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nPSLIST_ENTRY\nNTAPI\nRtlFirstEntrySList(\n    _In_ const SLIST_HEADER *ListHead\n    );\n\nNTSYSAPI\nPSLIST_ENTRY\nNTAPI\nRtlInterlockedPopEntrySList(\n    _Inout_ PSLIST_HEADER ListHead\n    );\n\nNTSYSAPI\nPSLIST_ENTRY\nNTAPI\nRtlInterlockedPushEntrySList(\n    _Inout_ PSLIST_HEADER ListHead,\n    _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry\n    );\n\nNTSYSAPI\nPSLIST_ENTRY\nNTAPI\nRtlInterlockedPushListSListEx(\n    _Inout_ PSLIST_HEADER ListHead,\n    _Inout_ __drv_aliasesMem PSLIST_ENTRY List,\n    _Inout_ PSLIST_ENTRY ListEnd,\n    _In_ DWORD Count\n    );\n\nNTSYSAPI\nPSLIST_ENTRY\nNTAPI\nRtlInterlockedFlushSList(\n    _Inout_ PSLIST_HEADER ListHead\n    );\n\nNTSYSAPI\nWORD\nNTAPI\nRtlQueryDepthSList(\n    _In_ PSLIST_HEADER ListHead\n    );\n\n//\n// Activation Contexts\n//\n\n#define INVALID_ACTIVATION_CONTEXT ((HANDLE)(LONG_PTR)-1)\n#define ACTCTX_PROCESS_DEFAULT ((HANDLE)(LONG_PTR)0)\n#define ACTCTX_EMPTY ((HANDLE)(LONG_PTR)-3)\n#define ACTCTX_SYSTEM_DEFAULT ((HANDLE)(LONG_PTR)-4)\n#define IS_SPECIAL_ACTCTX(x) (((((LONG_PTR)(x)) - 1) | 7) == -1)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetActiveActivationContext(\n    _Out_ PACTIVATION_CONTEXT ActivationContext\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlAddRefActivationContext(\n    _In_ PACTIVATION_CONTEXT ActivationContext\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlReleaseActivationContext(\n    _In_ PACTIVATION_CONTEXT ActivationContext\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlZombifyActivationContext(\n    _In_ PACTIVATION_CONTEXT ActivationContext\n    );\n\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsActivationContextActive(\n    _In_ PACTIVATION_CONTEXT ActivationContext\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlActivateActivationContext(\n    _Reserved_ ULONG Flags,\n    _In_ PACTIVATION_CONTEXT ActivationContext,\n    _Out_ PULONG_PTR Cookie\n    );\n\n#define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION 0x00000001\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlActivateActivationContextEx(\n    _In_ ULONG Flags,\n    _In_ PTEB Teb,\n    _In_ PACTIVATION_CONTEXT ActivationContext,\n    _Out_ PULONG_PTR Cookie\n    );\n\n#define RTL_DEACTIVATE_ACTIVATION_CONTEXT_FLAG_FORCE_EARLY_DEACTIVATION 0x00000001\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlDeactivateActivationContext(\n    _In_ ULONG Flags,\n    _In_ ULONG_PTR Cookie\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateActivationContext(\n    _Reserved_ ULONG Flags,\n    _In_ PACTIVATION_CONTEXT_DATA ActivationContextData,\n    _In_opt_ ULONG ExtraBytes,\n    _In_opt_ PACTIVATION_CONTEXT_NOTIFY_ROUTINE NotificationRoutine,\n    _In_opt_ PVOID NotificationContext,\n    _Out_ PACTIVATION_CONTEXT *ActivationContext\n    );\n\n#define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_ACTIVATION_CONTEXT 0x00000001\n#define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_FLAGS 0x00000002\n#define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_ASSEMBLY_METADATA 0x00000004\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFindActivationContextSectionString(\n    _In_ ULONG Flags,\n    _In_opt_ PGUID ExtensionGuid,\n    _In_ ULONG SectionId, // ACTIVATION_CONTEXT_SECTION_*\n    _In_ PCUNICODE_STRING StringToFind,\n    _Inout_ PACTCTX_SECTION_KEYED_DATA ReturnedData\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFindActivationContextSectionGuid(\n    _In_ ULONG Flags,\n    _In_opt_ PGUID ExtensionGuid,\n    _In_ ULONG SectionId, // ACTIVATION_CONTEXT_SECTION_*\n    _In_ PGUID GuidToFind,\n    _Inout_ PACTCTX_SECTION_KEYED_DATA ReturnedData\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryActivationContextApplicationSettings(\n    _Reserved_ ULONG Flags,\n    _In_ PACTIVATION_CONTEXT ActivationContext,\n    _In_ PCWSTR SettingsNameSpace,\n    _In_ PCWSTR SettingName,\n    _Out_writes_bytes_(BufferLength) PWSTR Buffer,\n    _In_ SIZE_T BufferLength,\n    _Out_opt_ PSIZE_T RequiredLength\n    );\n\n// ACTIVATION_CONTEXT_INFO_CLASS\n//   ActivationContextBasicInformation                      // q: ACTIVATION_CONTEXT_BASIC_INFORMATION\n//   ActivationContextDetailedInformation                   // q: ACTIVATION_CONTEXT_DETAILED_INFORMATION\n//   AssemblyDetailedInformationInActivationContext         // q: ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION\n//   FileInformationInAssemblyOfAssemblyInActivationContext // q: ASSEMBLY_FILE_DETAILED_INFORMATION\n//   RunlevelInformationInActivationContext                 // q: ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION\n//   CompatibilityInformationInActivationContext            // q: ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION[_LEGACY]\n//   ActivationContextManifestResourceName                  // q: ULONG\n\n#define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT 0x00000001\n#define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_ACTIVATION_CONTEXT_IS_MODULE 0x00000002\n#define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_ACTIVATION_CONTEXT_IS_ADDRESS 0x00000004\n#define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_NO_ADDREF 0x80000000\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryInformationActivationContext(\n    _In_ ULONG Flags,\n    _In_opt_ PACTIVATION_CONTEXT ActivationContext,\n    _In_opt_ PACTIVATION_CONTEXT_QUERY_INDEX SubInstanceIndex,\n    _In_ ACTIVATION_CONTEXT_INFO_CLASS ActivationContextInformationClass,\n    _Out_writes_bytes_(ActivationContextInformationLength) PVOID ActivationContextInformation,\n    _In_ SIZE_T ActivationContextInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\n#ifdef PHNT_INLINE_TYPEDEFS\n// private\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlQueryInformationActiveActivationContext(\n    _In_ ACTIVATION_CONTEXT_INFO_CLASS ActivationContextInformationClass,\n    _Out_writes_bytes_(ActivationContextInformationLength) PVOID ActivationContextInformation,\n    _In_ SIZE_T ActivationContextInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    )\n{\n    return RtlQueryInformationActivationContext(\n        RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT,\n        NULL,\n        0,\n        ActivationContextInformationClass,\n        ActivationContextInformation,\n        ActivationContextInformationLength,\n        ReturnLength\n        );\n}\n#else\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryInformationActiveActivationContext(\n    _In_ ACTIVATION_CONTEXT_INFO_CLASS ActivationContextInformationClass,\n    _Out_writes_bytes_(ActivationContextInformationLength) PVOID ActivationContextInformation,\n    _In_ SIZE_T ActivationContextInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n\n//\n// Images\n//\n\nNTSYSAPI\nPIMAGE_NT_HEADERS\nNTAPI\nRtlImageNtHeader(\n    _In_ PVOID BaseOfImage\n    );\n\n#define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK 0x00000001\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlImageNtHeaderEx(\n    _In_ ULONG Flags,\n    _In_ PVOID BaseOfImage,\n    _In_ ULONG64 Size,\n    _Out_ PIMAGE_NT_HEADERS *OutHeaders\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlAddressInSectionTable(\n    _In_ PIMAGE_NT_HEADERS NtHeaders,\n    _In_ PVOID BaseOfImage,\n    _In_ ULONG VirtualAddress\n    );\n\nNTSYSAPI\nPIMAGE_SECTION_HEADER\nNTAPI\nRtlSectionTableFromVirtualAddress(\n    _In_ PIMAGE_NT_HEADERS NtHeaders,\n    _In_ PVOID BaseOfImage,\n    _In_ ULONG VirtualAddress\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlImageDirectoryEntryToData(\n    _In_ PVOID BaseOfImage,\n    _In_ BOOLEAN MappedAsImage,\n    _In_ USHORT DirectoryEntry,\n    _Out_ PULONG Size\n    );\n\nNTSYSAPI\nPIMAGE_SECTION_HEADER\nNTAPI\nRtlImageRvaToSection(\n    _In_ PIMAGE_NT_HEADERS NtHeaders,\n    _In_ PVOID BaseOfImage,\n    _In_ ULONG Rva\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlImageRvaToVa(\n    _In_ PIMAGE_NT_HEADERS NtHeaders,\n    _In_ PVOID BaseOfImage,\n    _In_ ULONG Rva,\n    _Out_opt_ PIMAGE_SECTION_HEADER *LastRvaSection\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n\n// rev\nNTSYSAPI\nPVOID\nNTAPI\nRtlFindExportedRoutineByName(\n    _In_ PVOID BaseOfImage,\n    _In_z_ PCSTR RoutineName\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGuardCheckLongJumpTarget(\n    _In_ PVOID PcValue,\n    _In_ BOOL IsFastFail,\n    _Out_ PBOOL IsLongJumpTarget\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11_22H2)\nNTSYSAPI\nVOID\nNTAPI\nRtlValidateUserCallTarget(\n    _In_ PVOID Address,\n    _Out_ PULONG Flags\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11_22H2\n\n//\n// Memory\n//\n\n_Check_return_\nNTSYSAPI\nSIZE_T\nNTAPI\nRtlCompareMemory(\n    _In_ const VOID* Source1,\n    _In_ const VOID* Source2,\n    _In_ SIZE_T Length\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nSIZE_T\nNTAPI\nRtlCompareMemoryUlong(\n    _In_reads_bytes_(Length) PVOID Source,\n    _In_ SIZE_T Length,\n    _In_ ULONG Pattern\n    );\n\n#if defined(_M_AMD64)\nFORCEINLINE\nVOID\nRtlFillMemoryUlong(\n    _Out_writes_bytes_all_(Length) PVOID Destination,\n    _In_ SIZE_T Length,\n    _In_ ULONG Pattern\n    )\n{\n    PULONG Address = (PULONG)Destination;\n\n    //\n    // If the number of DWORDs is not zero, then fill the specified buffer\n    // with the specified pattern.\n    //\n\n    if ((Length /= 4) != 0) {\n\n        //\n        // If the destination is not quadword aligned (ignoring low bits),\n        // then align the destination by storing one DWORD.\n        //\n\n        if (((ULONG64)Address & 4) != 0) {\n            *Address = Pattern;\n            if ((Length -= 1) == 0) {\n                return;\n            }\n\n            Address += 1;\n        }\n\n        //\n        // If the number of QWORDs is not zero, then fill the destination\n        // buffer a QWORD at a time.\n        //\n\n         __stosq((PULONG64)(Address),\n                 Pattern | ((ULONG64)Pattern << 32),\n                 Length / 2);\n\n        if ((Length & 1) != 0) {\n            Address[Length - 1] = Pattern;\n        }\n    }\n\n    return;\n}\n#else\nNTSYSAPI\nVOID\nNTAPI\nRtlFillMemoryUlong(\n    _Out_writes_bytes_all_(Length) PVOID Destination,\n    _In_ SIZE_T Length,\n    _In_ ULONG Pattern\n    );\n#endif // _M_AMD64\n\n#if defined(_M_AMD64)\n\n#define RtlFillMemoryUlonglong(Destination, Length, Pattern) \\\n    __stosq((PULONG64)(Destination), Pattern, (Length) / 8)\n\n#else\nNTSYSAPI\nVOID\nNTAPI\nRtlFillMemoryUlonglong(\n    _Out_writes_bytes_all_(Length) PVOID Destination,\n    _In_ SIZE_T Length,\n    _In_ ULONGLONG Pattern\n    );\n#endif // _M_AMD64\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_19H2)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsZeroMemory(\n    _In_ PVOID Buffer,\n    _In_ SIZE_T Length\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_19H2\n\nNTSYSAPI\nULONG\nNTAPI\nRtlCrc32(\n    _In_reads_bytes_(Size) const void *Buffer,\n    _In_ size_t Size,\n    _In_ ULONG InitialCrc\n    );\n\nNTSYSAPI\nULONGLONG\nNTAPI\nRtlCrc64(\n    _In_reads_bytes_(Size) const void *Buffer,\n    _In_ size_t Size,\n    _In_ ULONGLONG InitialCrc\n    );\n\n// RTL_SYSTEM_GLOBAL_DATA_ID\n#define GlobalDataIdUnknown 0\n#define GlobalDataIdRngSeedVersion 1\n#define GlobalDataIdInterruptTime 2\n#define GlobalDataIdTimeZoneBias 3\n#define GlobalDataIdImageNumberLow 4\n#define GlobalDataIdImageNumberHigh 5\n#define GlobalDataIdTimeZoneId 6\n#define GlobalDataIdNtMajorVersion 7\n#define GlobalDataIdNtMinorVersion 8\n#define GlobalDataIdSystemExpirationDate 9\n#define GlobalDataIdKdDebuggerEnabled 10\n#define GlobalDataIdCyclesPerYield 11\n#define GlobalDataIdSafeBootMode 12\n#define GlobalDataIdLastSystemRITEventTickCount 13\n#define GlobalDataIdConsoleSharedDataFlags 14\n#define GlobalDataIdNtSystemRootDrive 15\n#define GlobalDataIdQpcBypassEnabled 16\n#define GlobalDataIdQpcData 17\n#define GlobalDataIdQpcBias 18\n\n#if !defined(NTDDI_WIN10_FE) || (NTDDI_VERSION < NTDDI_WIN10_FE)\ntypedef ULONG RTL_SYSTEM_GLOBAL_DATA_ID;\n#endif // !defined(NTDDI_WIN10_FE) || (NTDDI_VERSION < NTDDI_WIN10_FE)\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetSystemGlobalData(\n    _In_ RTL_SYSTEM_GLOBAL_DATA_ID DataId,\n    _Inout_ PVOID Buffer,\n    _In_ ULONG Size\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlSetSystemGlobalData(\n    _In_ RTL_SYSTEM_GLOBAL_DATA_ID DataId,\n    _In_ PVOID Buffer,\n    _In_ ULONG Size\n    );\n\n//\n// Environment\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateEnvironment(\n    _In_ BOOLEAN CloneCurrentEnvironment,\n    _Out_ PVOID *Environment\n    );\n\n// begin_rev\n#define RTL_CREATE_ENVIRONMENT_TRANSLATE 0x1 // translate from multi-byte to Unicode\n#define RTL_CREATE_ENVIRONMENT_TRANSLATE_FROM_OEM 0x2 // translate from OEM to Unicode (Translate flag must also be set)\n#define RTL_CREATE_ENVIRONMENT_EMPTY 0x4 // create empty environment block\n// end_rev\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateEnvironmentEx(\n    _In_opt_ PVOID SourceEnvironment,\n    _Out_ PVOID *Environment,\n    _In_ ULONG Flags\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyEnvironment(\n    _In_ _Post_invalid_ PVOID Environment\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetCurrentEnvironment(\n    _In_ PVOID Environment,\n    _Out_opt_ PVOID *PreviousEnvironment\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetEnvironmentVar(\n    _Inout_opt_ PVOID *Environment,\n    _In_reads_(NameLength) PCWSTR Name,\n    _In_ SIZE_T NameLength,\n    _In_reads_(ValueLength) PCWSTR Value,\n    _In_opt_ SIZE_T ValueLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetEnvironmentVariable(\n    _Inout_opt_ PVOID *Environment,\n    _In_ PCUNICODE_STRING Name,\n    _In_opt_ PCUNICODE_STRING Value\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryEnvironmentVariable(\n    _In_opt_ PVOID Environment,\n    _In_reads_(NameLength) PCWSTR Name,\n    _In_ SIZE_T NameLength,\n    _Out_writes_opt_(ValueLength) PWSTR Value,\n    _In_opt_ SIZE_T ValueLength,\n    _Out_ PSIZE_T ReturnLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryEnvironmentVariable_U(\n    _In_opt_ PVOID Environment,\n    _In_ PCUNICODE_STRING Name,\n    _Inout_ PUNICODE_STRING Value\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlExpandEnvironmentStrings(\n    _In_opt_ PVOID Environment,\n    _In_reads_(SourceLength) PCWSTR Source,\n    _In_ SIZE_T SourceLength,\n    _Out_writes_(DestinationLength) PWSTR Destination,\n    _In_ SIZE_T DestinationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlExpandEnvironmentStrings_U(\n    _In_opt_ PVOID Environment,\n    _In_ PCUNICODE_STRING Source,\n    _Inout_ PUNICODE_STRING Destination,\n    _Out_opt_ PULONG ReturnedLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetEnvironmentStrings(\n    _In_ PCWSTR NewEnvironment,\n    _In_ SIZE_T NewEnvironmentSize\n    );\n\n//\n// Directory and path support\n//\n\ntypedef struct _RTLP_CURDIR_REF\n{\n    LONG ReferenceCount;\n    HANDLE DirectoryHandle;\n} RTLP_CURDIR_REF, *PRTLP_CURDIR_REF;\n\ntypedef struct _RTL_RELATIVE_NAME_U\n{\n    UNICODE_STRING RelativeName;\n    HANDLE ContainingDirectory;\n    PRTLP_CURDIR_REF CurDirRef;\n} RTL_RELATIVE_NAME_U, *PRTL_RELATIVE_NAME_U;\n\ntypedef enum _RTL_PATH_TYPE\n{\n    RtlPathTypeUnknown,\n    RtlPathTypeUncAbsolute,     // \"\\\\\\\\server\\\\share\\\\folder\\\\file.txt\n    RtlPathTypeDriveAbsolute,   // \"C:\\\\folder\\\\file.txt\"\n    RtlPathTypeDriveRelative,   // \"C:folder\\\\file.txt\"\n    RtlPathTypeRooted,          // \"\\\\folder\\\\file.txt\"\n    RtlPathTypeRelative,        // \"folder\\\\file.txt\"\n    RtlPathTypeLocalDevice,     // \"\\\\\\\\.\\\\PhysicalDrive0\"\n    RtlPathTypeRootLocalDevice  // \"\\\\\\\\?\\\\C:\\\\folder\\\\file.txt\"\n} RTL_PATH_TYPE;\n\n#ifndef PHNT_INLINE_SEPERATOR_STRINGS\n\n#define RtlNtdllName L\"ntdll.dll\"\n#define RtlDosPathSeperatorsString ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\/\"))\n#define RtlAlternateDosPathSeperatorString ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"/\"))\n#define RtlNtPathSeperatorString ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\"))\n\n#define RtlDosDevicesPrefix ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\??\\\\\"))\n#define RtlDosDevicesUncPrefix ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\??\\\\UNC\\\\\"))\n#define RtlSlashSlashDot ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\\\\.\\\\\"))\n#define RtlNullString ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\"))\n#define RtlWin32NtRootSlash ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\\\\?\\\\\"))\n#define RtlWin32NtRoot ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\\\\?\"))\n#define RtlWin32NtUncRoot ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\\\\?\\\\UNC\"))\n#define RtlWin32NtUncRootSlash ((UNICODE_STRING)RTL_CONSTANT_STRING(L\"\\\\\\\\?\\\\UNC\\\\\"))\n#define RtlDefaultExtension ((UNICODE_STRING)RTL_CONSTANT_STRING(L\".DLL\"))\n\n#else\n\n// Data exports (ntdll.lib/ntdllp.lib)\n\nNTSYSAPI PCWSTR RtlNtdllName;\nNTSYSAPI UNICODE_STRING RtlDosPathSeperatorsString;\nNTSYSAPI UNICODE_STRING RtlAlternateDosPathSeperatorString;\nNTSYSAPI UNICODE_STRING RtlNtPathSeperatorString;\n\n#endif // PHNT_INLINE_SEPERATOR_STRINGS\n\n//\n// Path functions\n//\n\nNTSYSAPI\nRTL_PATH_TYPE\nNTAPI\nRtlDetermineDosPathNameType_U(\n    _In_ PCWSTR DosFileName\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlIsDosDeviceName_U(\n    _In_ PCWSTR DosFileName\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetFullPathName_U(\n    _In_ PCWSTR FileName,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_(BufferLength) PWSTR Buffer,\n    _Out_opt_ PWSTR *FilePart\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetFullPathName_UEx(\n    _In_ PCWSTR FileName,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_(BufferLength) PWSTR Buffer,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ ULONG *BytesRequired\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetFullPathName_UstrEx(\n    _In_ PCUNICODE_STRING FileName,\n    _Inout_ PUNICODE_STRING StaticString,\n    _Out_opt_ PUNICODE_STRING DynamicString,\n    _Out_opt_ PUNICODE_STRING *StringUsed,\n    _Out_opt_ SIZE_T *FilePartPrefixCch,\n    _Out_opt_ PBOOLEAN NameInvalid,\n    _Out_ RTL_PATH_TYPE *InputPathType,\n    _Out_opt_ SIZE_T *BytesRequired\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetCurrentDirectory_U(\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_(BufferLength) PWSTR Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetCurrentDirectory_U(\n    _In_ PCUNICODE_STRING PathName\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetLongestNtPathLength(\n    VOID\n    );\n\n// rev\ntypedef struct _RTL_BUFFER\n{\n    PUCHAR Buffer;\n    PUCHAR StaticBuffer;\n    SIZE_T Size;\n    SIZE_T StaticSize;\n} RTL_BUFFER, *PRTL_BUFFER;\n\n//FORCEINLINE\n//VOID\n//RtlInitBuffer(\n//    _Inout_ PRTL_BUFFER Buffer,\n//    _In_ PUCHAR Data,\n//    _In_ ULONG DataSize\n//    )\n//{\n//    Buffer->Buffer = Buffer->StaticBuffer = Data;\n//    Buffer->Size = Buffer->StaticSize = DataSize;\n//}\n//\n//FORCEINLINE\n//VOID\n//RtlFreeBuffer(\n//    _Inout_ PRTL_BUFFER Buffer\n//    )\n//{\n//    if (Buffer->Buffer != Buffer->StaticBuffer && Buffer->Buffer)\n//        RtlFreeHeap(RtlProcessHeap(), 0, Buffer->Buffer);\n//    Buffer->Buffer = Buffer->StaticBuffer;\n//    Buffer->Size = Buffer->StaticSize;\n//}\n\n// rev\ntypedef struct _RTL_UNICODE_STRING_BUFFER\n{\n    UNICODE_STRING String;\n    RTL_BUFFER ByteBuffer;\n    UCHAR MinimumStaticBufferForTerminalNul[2];\n} RTL_UNICODE_STRING_BUFFER, *PRTL_UNICODE_STRING_BUFFER;\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNtPathNameToDosPathName(\n    _Reserved_ ULONG Flags,\n    _Inout_ PRTL_UNICODE_STRING_BUFFER Path,\n    _Out_opt_ PULONG Disposition, // RtlDetermineDosPathNameType_U\n    _Out_opt_ PWSTR* FilePart\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDosPathNameToNtPathName_U(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosPathNameToNtPathName_U_WithStatus(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosLongPathNameToNtPathName_U_WithStatus(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDosPathNameToRelativeNtPathName_U(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosPathNameToRelativeNtPathName_U_WithStatus(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosLongPathNameToRelativeNtPathName_U_WithStatus(\n    _In_ PCWSTR DosFileName,\n    _Out_ PUNICODE_STRING NtFileName,\n    _Out_opt_ PWSTR *FilePart,\n    _Out_opt_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003)\nNTSYSAPI\nVOID\nNTAPI\nRtlReleaseRelativeName(\n    _Inout_ PRTL_RELATIVE_NAME_U RelativeName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_SERVER_2003\n\nNTSYSAPI\nULONG\nNTAPI\nRtlDosSearchPath_U(\n    _In_ PCWSTR Path,\n    _In_ PCWSTR FileName,\n    _In_opt_ PCWSTR Extension,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_(BufferLength) PWSTR Buffer,\n    _Out_opt_ PWSTR *FilePart\n    );\n\n#define RTL_DOS_SEARCH_PATH_FLAG_APPLY_ISOLATION_REDIRECTION 0x00000001\n#define RTL_DOS_SEARCH_PATH_FLAG_DISALLOW_DOT_RELATIVE_PATH_SEARCH 0x00000002\n#define RTL_DOS_SEARCH_PATH_FLAG_APPLY_DEFAULT_EXTENSION_WHEN_NOT_RELATIVE_PATH_EVEN_IF_FILE_HAS_EXTENSION 0x00000004\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosSearchPath_Ustr(\n    _In_ ULONG Flags,\n    _In_ PCUNICODE_STRING Path,\n    _In_ PCUNICODE_STRING FileName,\n    _In_opt_ PCUNICODE_STRING DefaultExtension,\n    _Out_opt_ PUNICODE_STRING StaticString,\n    _Out_opt_ PUNICODE_STRING DynamicString,\n    _Out_opt_ PCUNICODE_STRING *FullFileNameOut,\n    _Out_opt_ SIZE_T *FilePartPrefixCch,\n    _Out_opt_ SIZE_T *BytesRequired\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDoesFileExists_U(\n    _In_ PCWSTR FileName\n    );\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDosApplyFileIsolationRedirection_Ustr(\n    _In_ ULONG                  Flags,\n    _In_ PCUNICODE_STRING        OriginalName,\n    _In_ PCUNICODE_STRING        Extension,\n    _In_opt_ PCUNICODE_STRING    StaticString,\n    _In_opt_ PCUNICODE_STRING    DynamicString,\n    _In_opt_ PCUNICODE_STRING*   NewName,\n    _In_ PULONG                 NewFlags,\n    _In_ PSIZE_T                FileNameSize,\n    _In_ PSIZE_T                RequiredLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetLengthWithoutLastFullDosOrNtPathElement(\n    _Reserved_ ULONG Flags,\n    _In_ PCUNICODE_STRING PathString,\n    _Out_ PULONG Length\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetLengthWithoutTrailingPathSeperators(\n    _Reserved_ ULONG Flags,\n    _In_ PCUNICODE_STRING PathString,\n    _Out_ PULONG Length\n    );\n\ntypedef struct _GENERATE_NAME_CONTEXT\n{\n    USHORT Checksum;\n    BOOLEAN CheckSumInserted;\n    UCHAR NameLength;\n    WCHAR NameBuffer[8];\n    ULONG ExtensionLength;\n    WCHAR ExtensionBuffer[4];\n    ULONG LastIndexValue;\n} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGenerate8dot3Name(\n    _In_ PCUNICODE_STRING Name,\n    _In_ BOOLEAN AllowExtendedCharacters,\n    _Inout_ PGENERATE_NAME_CONTEXT Context,\n    _Inout_ PUNICODE_STRING Name8dot3\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlComputePrivatizedDllName_U(\n    _In_ PCUNICODE_STRING DllName,\n    _Out_ PUNICODE_STRING RealName,\n    _Out_ PUNICODE_STRING LocalName\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSearchPath(\n    _Out_ PWSTR *SearchPath\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetSearchPathMode(\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetExePath(\n    _In_ PCWSTR DosPathName,\n    _Out_ PWSTR* SearchPath\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlReleasePath(\n    _In_ PCWSTR Path\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSAPI\nULONG\nNTAPI\nRtlReplaceSystemDirectoryInPath(\n    _Inout_ PUNICODE_STRING Destination,\n    _In_ USHORT Machine, // IMAGE_FILE_MACHINE_I386\n    _In_ USHORT TargetMachine, // IMAGE_FILE_MACHINE_TARGET_HOST\n    _In_ BOOLEAN IncludePathSeperator\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev from Wow64DetermineEnvironment\nNTSYSAPI\nUSHORT\nNTAPI\nRtlWow64GetCurrentMachine(\n    VOID\n    );\n\n// rev from Wow64DetermineEnvironment\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64IsWowGuestMachineSupported(\n    _In_ USHORT NativeMachine,\n    _Out_ PBOOLEAN IsWowGuestMachineSupported\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_21H2)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64GetProcessMachines(\n    _In_ HANDLE ProcessHandle,\n    _Out_ PUSHORT ProcessMachine,\n    _Out_opt_ PUSHORT NativeMachine\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_21H2\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\n#define IMAGE_FILE_NATIVE_MACHINE_I386  0x1\n#define IMAGE_FILE_NATIVE_MACHINE_AMD64 0x2\n#define IMAGE_FILE_NATIVE_MACHINE_ARMNT 0x4\n#define IMAGE_FILE_NATIVE_MACHINE_ARM64 0x8\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetImageFileMachines(\n    _In_ PCWSTR FileName,\n    _Out_ PUSHORT FileMachines\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n\n#ifdef PHNT_INLINE_TYPEDEFS\n// rev\nFORCEINLINE\nPWSTR\nNTAPI\nRtlGetNtSystemRoot(\n    VOID\n    )\n{\n    if (NtCurrentPeb()->SharedData && NtCurrentPeb()->SharedData->ServiceSessionId) // RtlGetCurrentServiceSessionId\n        return NtCurrentPeb()->SharedData->NtSystemRoot;\n    else\n        return USER_SHARED_DATA->NtSystemRoot;\n}\n#else\n// private\nNTSYSAPI\nPWSTR\nNTAPI\nRtlGetNtSystemRoot(\n    VOID\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n\n#ifdef PHNT_INLINE_TYPEDEFS\n// rev\nFORCEINLINE\nBOOLEAN\nNTAPI\nRtlAreLongPathsEnabled(\n    VOID\n    )\n{\n    return NtCurrentPeb()->IsLongPathAwareProcess;\n}\n#else\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAreLongPathsEnabled(\n    VOID\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS2\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsThreadWithinLoaderCallout(\n    VOID\n    );\n\n/**\n * Gets a value indicating whether the process is currently in the shutdown phase.\n *\n * @return TRUE if a shutdown of the current dll process is in progress; otherwise, FALSE.\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDllShutdownInProgress(\n    VOID\n    );\n\n// Heaps\n\ntypedef struct _RTL_HEAP_ENTRY\n{\n    SIZE_T Size;\n    USHORT Flags;\n    USHORT AllocatorBackTraceIndex;\n    union\n    {\n        struct\n        {\n            SIZE_T Settable;\n            ULONG Tag;\n        } s1;\n        struct\n        {\n            SIZE_T CommittedSize;\n            PVOID FirstBlock;\n        } s2;\n    } u;\n} RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY;\n\n#define RTL_HEAP_BUSY (USHORT)0x0001\n#define RTL_HEAP_SEGMENT (USHORT)0x0002\n#define RTL_HEAP_SETTABLE_VALUE (USHORT)0x0010\n#define RTL_HEAP_SETTABLE_FLAG1 (USHORT)0x0020\n#define RTL_HEAP_SETTABLE_FLAG2 (USHORT)0x0040\n#define RTL_HEAP_SETTABLE_FLAG3 (USHORT)0x0080\n#define RTL_HEAP_SETTABLE_FLAGS (USHORT)0x00e0\n#define RTL_HEAP_UNCOMMITTED_RANGE (USHORT)0x1000\n#define RTL_HEAP_PROTECTED_ENTRY (USHORT)0x2000\n#define RTL_HEAP_LARGE_ALLOC (USHORT)0x4000\n#define RTL_HEAP_LFH_ALLOC (USHORT)0x8000\n\ntypedef struct _RTL_HEAP_TAG\n{\n    ULONG NumberOfAllocations;\n    ULONG NumberOfFrees;\n    SIZE_T BytesAllocated;\n    USHORT TagIndex;\n    USHORT CreatorBackTraceIndex;\n    WCHAR TagName[24];\n} RTL_HEAP_TAG, *PRTL_HEAP_TAG;\n\n// Windows 7/8/10\ntypedef struct _RTL_HEAP_INFORMATION_V1\n{\n    PVOID BaseAddress;\n    ULONG Flags;\n    USHORT EntryOverhead;\n    USHORT CreatorBackTraceIndex;\n    SIZE_T BytesAllocated;\n    SIZE_T BytesCommitted;\n    ULONG NumberOfTags;\n    ULONG NumberOfEntries;\n    ULONG NumberOfPseudoTags;\n    ULONG PseudoTagGranularity;\n    ULONG Reserved[5];\n    PRTL_HEAP_TAG Tags;\n    PRTL_HEAP_ENTRY Entries;\n} RTL_HEAP_INFORMATION_V1, *PRTL_HEAP_INFORMATION_V1;\n\n// Windows 11 > 22000\ntypedef struct _RTL_HEAP_INFORMATION_V2\n{\n    PVOID BaseAddress;\n    ULONG Flags;\n    USHORT EntryOverhead;\n    USHORT CreatorBackTraceIndex;\n    SIZE_T BytesAllocated;\n    SIZE_T BytesCommitted;\n    ULONG NumberOfTags;\n    ULONG NumberOfEntries;\n    ULONG NumberOfPseudoTags;\n    ULONG PseudoTagGranularity;\n    ULONG Reserved[5];\n    PRTL_HEAP_TAG Tags;\n    PRTL_HEAP_ENTRY Entries;\n    ULONG64 HeapTag;\n} RTL_HEAP_INFORMATION_V2, *PRTL_HEAP_INFORMATION_V2;\n\n#define RTL_HEAP_SIGNATURE 0xFFEEFFEEUL\n#define RTL_HEAP_SEGMENT_SIGNATURE 0xDDEEDDEEUL\n\ntypedef struct _RTL_PROCESS_HEAPS_V1\n{\n    ULONG NumberOfHeaps;\n    _Field_size_(NumberOfHeaps) RTL_HEAP_INFORMATION_V1 Heaps[1];\n} RTL_PROCESS_HEAPS_V1, *PRTL_PROCESS_HEAPS_V1;\n\ntypedef struct _RTL_PROCESS_HEAPS_V2\n{\n    ULONG NumberOfHeaps;\n    _Field_size_(NumberOfHeaps) RTL_HEAP_INFORMATION_V2 Heaps[1];\n} RTL_PROCESS_HEAPS_V2, *PRTL_PROCESS_HEAPS_V2;\n\n// Segment heap parameters.\n\ntypedef enum _RTL_MEMORY_TYPE\n{\n    MemoryTypePaged,\n    MemoryTypeNonPaged,\n    MemoryType64KPage,\n    MemoryTypeLargePage,\n    MemoryTypeHugePage,\n    MemoryTypeCustom,\n    MemoryTypeMax\n} RTL_MEMORY_TYPE, *PRTL_MEMORY_TYPE;\n\ntypedef enum _HEAP_MEMORY_INFO_CLASS\n{\n    HeapMemoryBasicInformation\n} HEAP_MEMORY_INFO_CLASS;\n\ntypedef NTSTATUS ALLOCATE_VIRTUAL_MEMORY_EX_CALLBACK(\n    _Inout_ HANDLE CallbackContext,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_ (*BaseAddress, _Readable_bytes_ (*RegionSize) _Writable_bytes_ (*RegionSize) _Post_readable_byte_size_ (*RegionSize)) PVOID* BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n\ntypedef ALLOCATE_VIRTUAL_MEMORY_EX_CALLBACK *PALLOCATE_VIRTUAL_MEMORY_EX_CALLBACK;\n\ntypedef NTSTATUS FREE_VIRTUAL_MEMORY_EX_CALLBACK(\n    _Inout_ HANDLE CallbackContext,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ __drv_freesMem(Mem) PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG FreeType\n    );\n\ntypedef FREE_VIRTUAL_MEMORY_EX_CALLBACK *PFREE_VIRTUAL_MEMORY_EX_CALLBACK;\n\ntypedef NTSTATUS QUERY_VIRTUAL_MEMORY_CALLBACK(\n    _Inout_ HANDLE CallbackContext,\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ HEAP_MEMORY_INFO_CLASS MemoryInformationClass,\n    _Out_writes_bytes_(MemoryInformationLength) PVOID MemoryInformation,\n    _In_ SIZE_T MemoryInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\ntypedef QUERY_VIRTUAL_MEMORY_CALLBACK *PQUERY_VIRTUAL_MEMORY_CALLBACK;\n\ntypedef struct _RTL_SEGMENT_HEAP_VA_CALLBACKS\n{\n    HANDLE CallbackContext;\n    PALLOCATE_VIRTUAL_MEMORY_EX_CALLBACK AllocateVirtualMemory;\n    PFREE_VIRTUAL_MEMORY_EX_CALLBACK FreeVirtualMemory;\n    PQUERY_VIRTUAL_MEMORY_CALLBACK QueryVirtualMemory;\n} RTL_SEGMENT_HEAP_VA_CALLBACKS, *PRTL_SEGMENT_HEAP_VA_CALLBACKS;\n\n#define RTL_SEGHEAP_MEM_SOURCE_ANY_NODE ((ULONG)-1)\n\ntypedef struct _RTL_SEGMENT_HEAP_MEMORY_SOURCE\n{\n    ULONG Flags;\n    ULONG MemoryTypeMask; // Mask of RTL_MEMORY_TYPE members.\n    ULONG NumaNode;\n    union\n    {\n        HANDLE PartitionHandle;\n        RTL_SEGMENT_HEAP_VA_CALLBACKS *Callbacks;\n    };\n    SIZE_T Reserved[2];\n} RTL_SEGMENT_HEAP_MEMORY_SOURCE, *PRTL_SEGMENT_HEAP_MEMORY_SOURCE;\n\n#define SEGMENT_HEAP_PARAMETERS_VERSION         3\n#define SEGMENT_HEAP_FLG_USE_PAGE_HEAP          0x1\n#define SEGMENT_HEAP_FLG_NO_LFH                 0x2\n#define SEGMENT_HEAP_PARAMS_VALID_FLAGS         0x3\n\ntypedef struct _RTL_SEGMENT_HEAP_PARAMETERS\n{\n    USHORT Version;\n    USHORT Size;\n    ULONG Flags;\n    RTL_SEGMENT_HEAP_MEMORY_SOURCE MemorySource;\n    SIZE_T Reserved[4];\n} RTL_SEGMENT_HEAP_PARAMETERS, *PRTL_SEGMENT_HEAP_PARAMETERS;\n\n// Heap parameters.\n\ntypedef\n_Function_class_(RTL_HEAP_COMMIT_ROUTINE)\nNTSTATUS\nNTAPI\nRTL_HEAP_COMMIT_ROUTINE(\n    _In_ PVOID Base,\n    _Inout_ PVOID* CommitAddress,\n    _Inout_ PSIZE_T CommitSize\n    );\n\ntypedef RTL_HEAP_COMMIT_ROUTINE* PRTL_HEAP_COMMIT_ROUTINE;\n\ntypedef struct _RTL_HEAP_PARAMETERS\n{\n    ULONG Length;\n    SIZE_T SegmentReserve;\n    SIZE_T SegmentCommit;\n    SIZE_T DeCommitFreeBlockThreshold;\n    SIZE_T DeCommitTotalFreeThreshold;\n    SIZE_T MaximumAllocationSize;\n    SIZE_T VirtualMemoryThreshold;\n    SIZE_T InitialCommit;\n    SIZE_T InitialReserve;\n    PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;\n    SIZE_T Reserved[2];\n} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;\n\n#define HEAP_SETTABLE_USER_VALUE 0x00000100\n#define HEAP_SETTABLE_USER_FLAG1 0x00000200\n#define HEAP_SETTABLE_USER_FLAG2 0x00000400\n#define HEAP_SETTABLE_USER_FLAG3 0x00000800\n#define HEAP_SETTABLE_USER_FLAGS 0x00000e00\n\n#define HEAP_CLASS_0 0x00000000 // Process heap\n#define HEAP_CLASS_1 0x00001000 // Private heap\n#define HEAP_CLASS_2 0x00002000 // Kernel heap\n#define HEAP_CLASS_3 0x00003000 // GDI heap\n#define HEAP_CLASS_4 0x00004000 // User heap\n#define HEAP_CLASS_5 0x00005000 // Console heap\n#define HEAP_CLASS_6 0x00006000 // User desktop heap\n#define HEAP_CLASS_7 0x00007000 // CSR shared heap\n#define HEAP_CLASS_8 0x00008000 // CSR port heap\n#define HEAP_CLASS_MASK 0x0000f000\n\n#define HEAP_MAXIMUM_TAG 0x0FFF\n#define HEAP_GLOBAL_TAG 0x0800\n#define HEAP_PSEUDO_TAG_FLAG 0x8000\n#define HEAP_TAG_SHIFT 18\n#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)\n\n#define HEAP_CREATE_SEGMENT_HEAP 0x00000100\n//\n// Only applies to segment heap. Applies pointer obfuscation which is\n// generally excessive and unnecessary but is necessary for certain insecure\n// heaps in win32k.\n//\n// Specifying HEAP_CREATE_HARDENED prevents the heap from using locks as\n// pointers would potentially be exposed in heap metadata lock variables.\n// Callers are therefore responsible for synchronizing access to hardened heaps.\n//\n#define HEAP_CREATE_HARDENED 0x00000200\n\n/**\n * The RtlCreateHeap routine creates a heap object that can be used by the calling process. This routine reserves\n * space in the virtual address space of the process and allocates physical storage for a specified initial portion of this block.\n *\n * @param Flags Flags specifying optional attributes of the heap.\n * @param HeapBase If HeapBase is a non-NULL value, it specifies the base address for a block of caller-allocated memory to use for the heap.\n * @param ReserveSize If ReserveSize is a nonzero value, it specifies the initial amount of memory, in bytes, to reserve for the heap.\n * @param CommitSize If CommitSize is a nonzero value, it specifies the initial amount of memory, in bytes, to commit for the heap.\n * @param Lock Pointer to an opaque structure to be used as the heap lock.\n * @param Parameters Pointer to a RTL_HEAP_PARAMETERS structure that contains parameters to be applied when creating the heap.\n * @return RtlCreateHeap returns a handle to be used in accessing the created heap.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlcreateheap\n */\n_Success_(return != 0)\n_Must_inspect_result_\n_Ret_maybenull_\nNTSYSAPI\nPVOID\nNTAPI\nRtlCreateHeap(\n    _In_ ULONG Flags,\n    _In_opt_ PVOID HeapBase,\n    _In_opt_ SIZE_T ReserveSize,\n    _In_opt_ SIZE_T CommitSize,\n    _In_opt_ PVOID Lock,\n    _When_((Flags & HEAP_CREATE_SEGMENT_HEAP) != 0, _In_reads_bytes_opt_(sizeof(RTL_SEGMENT_HEAP_PARAMETERS)))\n    _When_((Flags & HEAP_CREATE_SEGMENT_HEAP) == 0, _In_reads_bytes_opt_(sizeof(RTL_HEAP_PARAMETERS)))\n    _In_opt_ PVOID Parameters\n    );\n\n/**\n * The RtlDestroyHeap routine destroys the specified heap object. RtlDestroyHeap decommits and releases all the pages of a private heap object,\n * and it invalidates the handle to the heap.\n *\n * @param HeapHandle Handle for the heap to be destroyed. This parameter is a heap handle returned by RtlCreateHeap.\n * @return If the call to RtlDestroyHeap succeeds, the return value is a NULL pointer. If the call to RtlDestroyHeap fails, the return value is a handle for the heap.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtldestroyheap\n */\n_Success_(return == 0)\nNTSYSAPI\nPVOID\nNTAPI\nRtlDestroyHeap(\n    _In_ _Post_invalid_ PVOID HeapHandle\n    );\n\n/**\n * The RtlAllocateHeap routine allocates a block of memory from a heap.\n *\n * @param HeapHandle Handle for a private heap from which the memory will be allocated.\n * @param Flags Controllable aspects of heap allocation. Specifying any flags will override the corresponding value specified when the heap was created with RtlCreateHeap.\n * @param Size Number of bytes to be allocated. If the heap, specified by the HeapHandle parameter, is a nongrowable heap, Size must be less than or equal to the heap's virtual memory threshold.\n * @return If the call to RtlAllocateHeap succeeds, the return value is a pointer to the newly-allocated block. The return value is NULL if the allocation failed.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlallocateheap\n */\nNTSYSAPI\n_Success_(return != 0)\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\n__drv_allocatesMem(Mem)\nDECLSPEC_ALLOCATOR\nDECLSPEC_NOALIAS\nDECLSPEC_RESTRICT\nPVOID\nNTAPI\nRtlAllocateHeap(\n    _In_ PVOID HeapHandle,\n    _In_opt_ ULONG Flags,\n    _In_ SIZE_T Size\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n_Success_(return != 0)\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlFreeHeap(\n    _In_ PVOID HeapHandle,\n    _In_opt_ ULONG Flags,\n    _Frees_ptr_opt_ _Post_invalid_ PVOID BaseAddress\n    );\n#else\n_Success_(return)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlFreeHeap(\n    _In_ PVOID HeapHandle,\n    _In_opt_ ULONG Flags,\n    _Frees_ptr_opt_ PVOID BaseAddress\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\nNTSYSAPI\nSIZE_T\nNTAPI\nRtlSizeHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlZeroHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlProtectHeap(\n    _In_ PVOID HeapHandle,\n    _In_ BOOLEAN MakeReadOnly\n    );\n\n#define RtlProcessHeap() (NtCurrentPeb()->ProcessHeap)\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlLockHeap(\n    _In_ PVOID HeapHandle\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlUnlockHeap(\n    _In_ PVOID HeapHandle\n    );\n\nNTSYSAPI\n_Success_(return != 0)\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\n_When_(Size > 0, __drv_allocatesMem(Mem))\nDECLSPEC_ALLOCATOR\nDECLSPEC_NOALIAS\nDECLSPEC_RESTRICT\nPVOID\nNTAPI\nRtlReAllocateHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _Frees_ptr_opt_ PVOID BaseAddress,\n    _In_ SIZE_T Size\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlGetUserInfoHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress,\n    _Out_opt_ PVOID *UserValue,\n    _Out_opt_ PULONG UserFlags\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlSetUserValueHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress,\n    _In_ PVOID UserValue\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlSetUserFlagsHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress,\n    _In_ ULONG UserFlagsReset,\n    _In_ ULONG UserFlagsSet\n    );\n\ntypedef struct _RTL_HEAP_TAG_INFO\n{\n    ULONG NumberOfAllocations;\n    ULONG NumberOfFrees;\n    SIZE_T BytesAllocated;\n} RTL_HEAP_TAG_INFO, *PRTL_HEAP_TAG_INFO;\n\n#define RTL_HEAP_MAKE_TAG HEAP_MAKE_TAG_FLAGS\n\nNTSYSAPI\nULONG\nNTAPI\nRtlCreateTagHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PCWSTR TagPrefix,\n    _In_ PCWSTR TagNames\n    );\n\nNTSYSAPI\nPWSTR\nNTAPI\nRtlQueryTagHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ USHORT TagIndex,\n    _In_ BOOLEAN ResetCounters,\n    _Out_opt_ PRTL_HEAP_TAG_INFO TagInfo\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlExtendHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID Base,\n    _In_ SIZE_T Size\n    );\n\nNTSYSAPI\nSIZE_T\nNTAPI\nRtlCompactHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidateHeap(\n    _In_opt_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PVOID BaseAddress\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidateProcessHeaps(\n    VOID\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetProcessHeaps(\n    _In_ ULONG NumberOfHeaps,\n    _Out_ PVOID *ProcessHeaps\n    );\n\n_Function_class_(RTL_ENUM_HEAPS_ROUTINE)\ntypedef NTSTATUS (NTAPI RTL_ENUM_HEAPS_ROUTINE)(\n    _In_ PVOID HeapHandle,\n    _In_ PVOID Parameter\n    );\ntypedef RTL_ENUM_HEAPS_ROUTINE *PRTL_ENUM_HEAPS_ROUTINE;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlEnumProcessHeaps(\n    _In_ PRTL_ENUM_HEAPS_ROUTINE EnumRoutine,\n    _In_ PVOID Parameter\n    );\n\ntypedef struct _RTL_HEAP_USAGE_ENTRY\n{\n    struct _RTL_HEAP_USAGE_ENTRY *Next;\n    PVOID Address;\n    SIZE_T Size;\n    USHORT AllocatorBackTraceIndex;\n    USHORT TagIndex;\n} RTL_HEAP_USAGE_ENTRY, *PRTL_HEAP_USAGE_ENTRY;\n\ntypedef struct _RTL_HEAP_USAGE\n{\n    ULONG Length;\n    SIZE_T BytesAllocated;\n    SIZE_T BytesCommitted;\n    SIZE_T BytesReserved;\n    SIZE_T BytesReservedMaximum;\n    PRTL_HEAP_USAGE_ENTRY Entries;\n    PRTL_HEAP_USAGE_ENTRY AddedEntries;\n    PRTL_HEAP_USAGE_ENTRY RemovedEntries;\n    ULONG_PTR Reserved[8];\n} RTL_HEAP_USAGE, *PRTL_HEAP_USAGE;\n\n#define HEAP_USAGE_ALLOCATED_BLOCKS HEAP_REALLOC_IN_PLACE_ONLY\n#define HEAP_USAGE_FREE_BUFFER HEAP_ZERO_MEMORY\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUsageHeap(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Flags,\n    _Inout_ PRTL_HEAP_USAGE Usage\n    );\n\ntypedef struct _RTL_HEAP_WALK_ENTRY\n{\n    PVOID DataAddress;\n    SIZE_T DataSize;\n    UCHAR OverheadBytes;\n    UCHAR SegmentIndex;\n    USHORT Flags;\n    union\n    {\n        struct\n        {\n            SIZE_T Settable;\n            USHORT TagIndex;\n            USHORT AllocatorBackTraceIndex;\n            ULONG Reserved[2];\n        } Block;\n        struct\n        {\n            ULONG CommittedSize;\n            ULONG UnCommittedSize;\n            PVOID FirstEntry;\n            PVOID LastEntry;\n        } Segment;\n    };\n} RTL_HEAP_WALK_ENTRY, *PRTL_HEAP_WALK_ENTRY;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWalkHeap(\n    _In_ PVOID HeapHandle,\n    _Inout_ PRTL_HEAP_WALK_ENTRY Entry\n    );\n\n// HEAP_INFORMATION_CLASS\n#define HeapCompatibilityInformation 0x0 // q; s: ULONG\n#define HeapEnableTerminationOnCorruption 0x1 // q; s: NULL\n#define HeapExtendedInformation 0x2 // q; s: HEAP_EXTENDED_INFORMATION\n#define HeapOptimizeResources 0x3 // q; s: HEAP_OPTIMIZE_RESOURCES_INFORMATION\n#define HeapTaggingInformation 0x4\n#define HeapStackDatabase 0x5 // q: RTL_HEAP_STACK_QUERY; s: RTL_HEAP_STACK_CONTROL\n#define HeapMemoryLimit 0x6 // since 19H2\n#define HeapTag 0x7 // since 20H1\n#define HeapDetailedFailureInformation 0x80000001\n#define HeapSetDebuggingInformation 0x80000002 // q; s: HEAP_DEBUGGING_INFORMATION\n\ntypedef enum _HEAP_COMPATIBILITY_MODE\n{\n    HEAP_COMPATIBILITY_STANDARD = 0UL,\n    HEAP_COMPATIBILITY_LAL = 1UL,\n    HEAP_COMPATIBILITY_LFH = 2UL,\n} HEAP_COMPATIBILITY_MODE;\n\ntypedef struct _RTLP_TAG_INFO\n{\n    GUID Id;\n    ULONG_PTR CurrentAllocatedBytes;\n} RTLP_TAG_INFO, *PRTLP_TAG_INFO;\n\ntypedef struct _RTLP_HEAP_TAGGING_INFO\n{\n    USHORT Version;\n    USHORT Flags;\n    PVOID ProcessHandle;\n    ULONG_PTR EntriesCount;\n    RTLP_TAG_INFO Entries[1];\n} RTLP_HEAP_TAGGING_INFO, *PRTLP_HEAP_TAGGING_INFO;\n\ntypedef struct _PROCESS_HEAP_INFORMATION\n{\n    SIZE_T ReserveSize;\n    SIZE_T CommitSize;\n    ULONG NumberOfHeaps;\n    ULONG_PTR FirstHeapInformationOffset;\n} PROCESS_HEAP_INFORMATION, *PPROCESS_HEAP_INFORMATION;\n\ntypedef struct _HEAP_REGION_INFORMATION\n{\n    PVOID Address;\n    SIZE_T ReserveSize;\n    SIZE_T CommitSize;\n    ULONG_PTR FirstRangeInformationOffset;\n    ULONG_PTR NextRegionInformationOffset;\n} HEAP_REGION_INFORMATION, *PHEAP_REGION_INFORMATION;\n\ntypedef struct _HEAP_RANGE_INFORMATION\n{\n    PVOID Address;\n    SIZE_T Size;\n    ULONG Type;\n    ULONG Protection;\n    ULONG_PTR FirstBlockInformationOffset;\n    ULONG_PTR NextRangeInformationOffset;\n} HEAP_RANGE_INFORMATION, *PHEAP_RANGE_INFORMATION;\n\ntypedef struct _HEAP_BLOCK_INFORMATION\n{\n    PVOID Address;\n    ULONG Flags;\n    SIZE_T DataSize;\n    ULONG_PTR OverheadSize;\n    ULONG_PTR NextBlockInformationOffset;\n} HEAP_BLOCK_INFORMATION, *PHEAP_BLOCK_INFORMATION;\n\ntypedef struct _HEAP_INFORMATION\n{\n    PVOID Address;\n    ULONG Mode;\n    SIZE_T ReserveSize;\n    SIZE_T CommitSize;\n    ULONG_PTR FirstRegionInformationOffset;\n    ULONG_PTR NextHeapInformationOffset;\n} HEAP_INFORMATION, *PHEAP_INFORMATION;\n\ntypedef struct _SEGMENT_HEAP_PERFORMANCE_COUNTER_INFORMATION\n{\n    SIZE_T SegmentReserveSize;\n    SIZE_T SegmentCommitSize;\n    ULONG_PTR SegmentCount;\n    SIZE_T AllocatedSize;\n    SIZE_T LargeAllocReserveSize;\n    SIZE_T LargeAllocCommitSize;\n} SEGMENT_HEAP_PERFORMANCE_COUNTER_INFORMATION, *PSEGMENT_HEAP_PERFORMANCE_COUNTER_INFORMATION;\n\n#define HeapPerformanceCountersInformationStandardHeapVersion 0x1\n#define HeapPerformanceCountersInformationSegmentHeapVersion 0x2\n\ntypedef struct _HEAP_PERFORMANCE_COUNTERS_INFORMATION\n{\n    ULONG Size;\n    ULONG Version;\n    ULONG HeapIndex;\n    ULONG LastHeapIndex;\n    PVOID BaseAddress;\n    SIZE_T ReserveSize;\n    SIZE_T CommitSize;\n    ULONG SegmentCount;\n    SIZE_T LargeUCRMemory;\n    ULONG UCRLength;\n    SIZE_T AllocatedSpace;\n    SIZE_T FreeSpace;\n    ULONG FreeListLength;\n    ULONG Contention;\n    ULONG VirtualBlocks;\n    ULONG CommitRate;\n    ULONG DecommitRate;\n    SEGMENT_HEAP_PERFORMANCE_COUNTER_INFORMATION SegmentHeapPerfInformation; // since WIN8\n} HEAP_PERFORMANCE_COUNTERS_INFORMATION, *PHEAP_PERFORMANCE_COUNTERS_INFORMATION;\n\ntypedef struct _HEAP_INFORMATION_ITEM\n{\n    ULONG Level;\n    SIZE_T Size;\n    union\n    {\n        PROCESS_HEAP_INFORMATION ProcessHeapInformation;\n        HEAP_INFORMATION HeapInformation;\n        HEAP_REGION_INFORMATION HeapRegionInformation;\n        HEAP_RANGE_INFORMATION HeapRangeInformation;\n        HEAP_BLOCK_INFORMATION HeapBlockInformation;\n        HEAP_PERFORMANCE_COUNTERS_INFORMATION HeapPerfInformation;\n        ULONG_PTR DynamicStart;\n    };\n} HEAP_INFORMATION_ITEM, *PHEAP_INFORMATION_ITEM;\n\ntypedef NTSTATUS (NTAPI *PRTL_HEAP_EXTENDED_ENUMERATION_ROUTINE)(\n    _In_ PHEAP_INFORMATION_ITEM Information,\n    _In_opt_ PVOID Context\n    );\n\n// HEAP_EXTENDED_INFORMATION Level\n#define HeapExtendedProcessHeapInformationLevel 0x1\n#define HeapExtendedHeapInformationLevel 0x2\n#define HeapExtendedHeapRegionInformationLevel 0x3\n#define HeapExtendedHeapRangeInformationLevel 0x4\n#define HeapExtendedHeapBlockInformationLevel 0x5\n#define HeapExtendedHeapHeapPerfInformationLevel 0x80000000\n\ntypedef struct _HEAP_EXTENDED_INFORMATION\n{\n    HANDLE ProcessHandle;\n    PVOID HeapHandle;\n    ULONG Level;\n    PRTL_HEAP_EXTENDED_ENUMERATION_ROUTINE CallbackRoutine;\n    PVOID CallbackContext;\n    union\n    {\n        PROCESS_HEAP_INFORMATION ProcessHeapInformation;\n        HEAP_INFORMATION HeapInformation;\n    };\n} HEAP_EXTENDED_INFORMATION, *PHEAP_EXTENDED_INFORMATION;\n\n// rev\ntypedef NTSTATUS (NTAPI *RTL_HEAP_STACK_WRITE_ROUTINE)(\n    _In_ PVOID Information, // TODO: 3 missing structures (dmex)\n    _In_ ULONG Size,\n    _In_opt_ PVOID Context\n    );\n\n// rev\ntypedef struct _RTLP_HEAP_STACK_TRACE_SERIALIZATION_INIT\n{\n    ULONG Count;\n    ULONG Total;\n    ULONG Flags;\n} RTLP_HEAP_STACK_TRACE_SERIALIZATION_INIT, *PRTLP_HEAP_STACK_TRACE_SERIALIZATION_INIT;\n\n// rev\ntypedef struct _RTLP_HEAP_STACK_TRACE_SERIALIZATION_HEADER\n{\n    USHORT Version;\n    USHORT PointerSize;\n    PVOID Heap;\n    SIZE_T TotalCommit;\n    SIZE_T TotalReserve;\n} RTLP_HEAP_STACK_TRACE_SERIALIZATION_HEADER, *PRTLP_HEAP_STACK_TRACE_SERIALIZATION_HEADER;\n\n// rev\ntypedef struct _RTLP_HEAP_STACK_TRACE_SERIALIZATION_ALLOCATION\n{\n    PVOID Address;\n    ULONG Flags;\n    SIZE_T DataSize;\n} RTLP_HEAP_STACK_TRACE_SERIALIZATION_ALLOCATION, *PRTLP_HEAP_STACK_TRACE_SERIALIZATION_ALLOCATION;\n\n// rev\ntypedef struct _RTLP_HEAP_STACK_TRACE_SERIALIZATION_STACKFRAME\n{\n    PVOID StackFrame[8];\n} RTLP_HEAP_STACK_TRACE_SERIALIZATION_STACKFRAME, *PRTLP_HEAP_STACK_TRACE_SERIALIZATION_STACKFRAME;\n\n#define HEAP_STACK_QUERY_VERSION 0x2\n\ntypedef struct _RTL_HEAP_STACK_QUERY\n{\n    ULONG Version;\n    HANDLE ProcessHandle;\n    RTL_HEAP_STACK_WRITE_ROUTINE WriteRoutine;\n    PVOID SerializationContext;\n    UCHAR QueryLevel;\n    UCHAR Flags;\n} RTL_HEAP_STACK_QUERY, *PRTL_HEAP_STACK_QUERY;\n\n#define HEAP_STACK_CONTROL_VERSION 0x1\n#define HEAP_STACK_CONTROL_FLAGS_STACKTRACE_ENABLE 0x1\n#define HEAP_STACK_CONTROL_FLAGS_STACKTRACE_DISABLE 0x2\n\ntypedef struct _RTL_HEAP_STACK_CONTROL\n{\n    USHORT Version;\n    USHORT Flags;\n    HANDLE ProcessHandle;\n} RTL_HEAP_STACK_CONTROL, *PRTL_HEAP_STACK_CONTROL;\n\n// rev\ntypedef NTSTATUS (NTAPI *PRTL_HEAP_DEBUGGING_INTERCEPTOR_ROUTINE)(\n    _In_ PVOID HeapHandle,\n    _In_ ULONG Action,\n    _In_ ULONG StackFramesToCapture,\n    _In_ PVOID *StackTrace\n    );\n\n// rev\ntypedef NTSTATUS (NTAPI *PRTL_HEAP_LEAK_ENUMERATION_ROUTINE)(\n    _In_ LONG Reserved,\n    _In_ PVOID HeapHandle,\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T BlockSize,\n    _In_ ULONG StackTraceDepth,\n    _In_ PVOID *StackTrace\n    );\n\n// symbols\ntypedef struct _HEAP_DEBUGGING_INFORMATION\n{\n    PRTL_HEAP_DEBUGGING_INTERCEPTOR_ROUTINE InterceptorFunction;\n    USHORT InterceptorValue;\n    ULONG ExtendedOptions;\n    ULONG StackTraceDepth;\n    SIZE_T MinTotalBlockSize;\n    SIZE_T MaxTotalBlockSize;\n    PRTL_HEAP_LEAK_ENUMERATION_ROUTINE HeapLeakEnumerationRoutine;\n} HEAP_DEBUGGING_INFORMATION, *PHEAP_DEBUGGING_INFORMATION;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryHeapInformation(\n    _In_opt_ PVOID HeapHandle,\n    _In_ HEAP_INFORMATION_CLASS HeapInformationClass,\n    _Out_opt_ PVOID HeapInformation,\n    _In_opt_ SIZE_T HeapInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetHeapInformation(\n    _In_opt_ PCVOID HeapHandle,\n    _In_ HEAP_INFORMATION_CLASS HeapInformationClass,\n    _In_opt_ PCVOID HeapInformation,\n    _In_opt_ SIZE_T HeapInformationLength\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlMultipleAllocateHeap(\n    _In_ PCVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ SIZE_T Size,\n    _In_ ULONG Count,\n    _Out_ PVOID *Array\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlMultipleFreeHeap(\n    _In_ PCVOID HeapHandle,\n    _In_ ULONG Flags,\n    _In_ ULONG Count,\n    _In_ PVOID *Array\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSAPI\nVOID\nNTAPI\nRtlDetectHeapLeaks(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\nNTSYSAPI\nVOID\nNTAPI\nRtlFlushHeaps(\n    VOID\n    );\n\n// Memory zones\n\n// begin_private\n\ntypedef struct _RTL_MEMORY_ZONE_SEGMENT\n{\n    struct _RTL_MEMORY_ZONE_SEGMENT *NextSegment;\n    SIZE_T Size;\n    PVOID Next;\n    PVOID Limit;\n} RTL_MEMORY_ZONE_SEGMENT, *PRTL_MEMORY_ZONE_SEGMENT;\n\ntypedef struct _RTL_MEMORY_ZONE\n{\n    RTL_MEMORY_ZONE_SEGMENT Segment;\n    RTL_SRWLOCK Lock;\n    ULONG LockCount;\n    PRTL_MEMORY_ZONE_SEGMENT FirstSegment;\n} RTL_MEMORY_ZONE, *PRTL_MEMORY_ZONE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateMemoryZone(\n    _Out_ PVOID *MemoryZone,\n    _In_ SIZE_T InitialSize,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyMemoryZone(\n    _In_ _Post_invalid_ PVOID MemoryZone\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAllocateMemoryZone(\n    _In_ PVOID MemoryZone,\n    _In_ SIZE_T BlockSize,\n    _Out_ PVOID *Block\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlResetMemoryZone(\n    _In_ PVOID MemoryZone\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLockMemoryZone(\n    _In_ PVOID MemoryZone\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnlockMemoryZone(\n    _In_ PVOID MemoryZone\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// Memory block lookaside lists\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateMemoryBlockLookaside(\n    _Out_ PVOID *MemoryBlockLookaside,\n    _Reserved_ ULONG Flags,\n    _In_ ULONG InitialSize,\n    _In_ ULONG MinimumBlockSize,\n    _In_ ULONG MaximumBlockSize\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAllocateMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside,\n    _In_ ULONG BlockSize,\n    _Out_ PVOID *Block\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFreeMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside,\n    _In_ PVOID Block\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlExtendMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside,\n    _In_ ULONG Increment\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlResetMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLockMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnlockMemoryBlockLookaside(\n    _In_ PVOID MemoryBlockLookaside\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// end_private\n\n//\n// Transactions\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nHANDLE\nNTAPI\nRtlGetCurrentTransaction(\n    _In_opt_ PCWSTR ExistingFileName,\n    _In_opt_ PCWSTR NewFileName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlSetCurrentTransaction(\n    _In_opt_ HANDLE TransactionHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// LUIDs\n//\n\nFORCEINLINE BOOLEAN RtlIsEqualLuid( // RtlEqualLuid\n    _In_ PLUID L1,\n    _In_ PLUID L2\n    )\n{\n    return L1->LowPart == L2->LowPart &&\n        L1->HighPart == L2->HighPart;\n}\n\nFORCEINLINE BOOLEAN RtlIsZeroLuid(\n    _In_ PLUID L1\n    )\n{\n    return (L1->LowPart | L1->HighPart) == 0;\n}\n\nFORCEINLINE\nLUID\nNTAPI_INLINE\nRtlConvertLongToLuid(\n    _In_ LONG Long\n    )\n{\n    LUID tempLuid;\n\n    tempLuid.LowPart = Long;\n    tempLuid.HighPart = 0;\n\n    return tempLuid;\n}\n\nFORCEINLINE\nLUID\nNTAPI_INLINE\nRtlConvertUlongToLuid(\n    _In_ ULONG Ulong\n    )\n{\n    LUID tempLuid;\n\n    tempLuid.LowPart = Ulong;\n    tempLuid.HighPart = 0;\n\n    return tempLuid;\n}\n\nFORCEINLINE\nLONGLONG\nNTAPI_INLINE\nRtlConvertLuidToLonglong(\n    _In_ LUID Luid\n    )\n{\n    LARGE_INTEGER tempLi;\n\n    tempLi.LowPart = Luid.LowPart;\n    tempLi.HighPart = Luid.HighPart;\n\n    return tempLi.QuadPart;\n}\n\nFORCEINLINE\nULONGLONG\nNTAPI_INLINE\nRtlConvertLuidToUlonglong(\n    _In_ LUID Luid\n    )\n{\n    ULARGE_INTEGER tempLi;\n\n    tempLi.LowPart = Luid.LowPart;\n    tempLi.HighPart = Luid.HighPart;\n\n    return tempLi.QuadPart;\n}\n\nNTSYSAPI\nVOID\nNTAPI\nRtlCopyLuid(\n    _Out_ PLUID DestinationLuid,\n    _In_ PLUID SourceLuid\n    );\n\n// ros\nNTSYSAPI\nVOID\nNTAPI\nRtlCopyLuidAndAttributesArray(\n    _In_ ULONG Count,\n    _In_ PLUID_AND_ATTRIBUTES Src,\n    _In_ PLUID_AND_ATTRIBUTES Dest\n    );\n\n// Byte swap routines.\n\n#ifndef PHNT_RTL_BYTESWAP\n#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\n#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\n#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\n#else\nNTSYSAPI\nUSHORT\nFASTCALL\nRtlUshortByteSwap(\n    _In_ USHORT Source\n    );\n\nNTSYSAPI\nULONG\nFASTCALL\nRtlUlongByteSwap(\n    _In_ ULONG Source\n    );\n\nNTSYSAPI\nULONGLONG\nFASTCALL\nRtlUlonglongByteSwap(\n    _In_ ULONGLONG Source\n    );\n#endif // PHNT_RTL_BYTESWAP\n\nDECLSPEC_DEPRECATED\nNTSYSAPI\nLARGE_INTEGER\nNTAPI\nRtlConvertUlongToLargeInteger(\n    _In_ ULONG UnsignedInteger\n    );\n\nDECLSPEC_DEPRECATED\nNTSYSAPI\nLARGE_INTEGER\nNTAPI\nRtlConvertLongToLargeInteger(\n    _In_ LONG SignedInteger\n    );\n\nDECLSPEC_DEPRECATED\nNTSYSAPI\nLARGE_INTEGER\nNTAPI\nRtlEnlargedIntegerMultiply(\n    _In_ LONG Multiplicand,\n    _In_ LONG Multiplier\n    );\n\nDECLSPEC_DEPRECATED\nNTSYSAPI\nLARGE_INTEGER\nNTAPI_INLINE\nRtlEnlargedUnsignedMultiply(\n    _In_ ULONG Multiplicand,\n    _In_ ULONG Multiplier\n    );\n\n// Debugging\n\n// private\ntypedef struct _RTL_PROCESS_MODULES *PRTL_PROCESS_MODULES;\ntypedef struct _RTL_PROCESS_MODULE_INFORMATION_EX *PRTL_PROCESS_MODULE_INFORMATION_EX;\ntypedef struct _RTL_PROCESS_BACKTRACES *PRTL_PROCESS_BACKTRACES;\ntypedef struct _RTL_PROCESS_LOCKS *PRTL_PROCESS_LOCKS;\n\ntypedef struct _RTL_PROCESS_VERIFIER_OPTIONS\n{\n    ULONG SizeStruct;\n    ULONG Option;\n    UCHAR OptionData[1];\n} RTL_PROCESS_VERIFIER_OPTIONS, *PRTL_PROCESS_VERIFIER_OPTIONS;\n\n// private\ntypedef struct _RTL_DEBUG_INFORMATION\n{\n    HANDLE SectionHandleClient;\n    PVOID ViewBaseClient;\n    PVOID ViewBaseTarget;\n    ULONG_PTR ViewBaseDelta;\n    HANDLE EventPairClient;\n    HANDLE EventPairTarget;\n    HANDLE TargetProcessId;\n    HANDLE TargetThreadHandle;\n    ULONG Flags;\n    SIZE_T OffsetFree;\n    SIZE_T CommitSize;\n    SIZE_T ViewSize;\n    union\n    {\n        PRTL_PROCESS_MODULES Modules;\n        PRTL_PROCESS_MODULE_INFORMATION_EX ModulesEx;\n    };\n    PRTL_PROCESS_BACKTRACES BackTraces;\n    PVOID Heaps;\n    PRTL_PROCESS_LOCKS Locks;\n    PVOID SpecificHeap;\n    HANDLE TargetProcessHandle;\n    PRTL_PROCESS_VERIFIER_OPTIONS VerifierOptions;\n    PVOID ProcessHeap;\n    HANDLE CriticalSectionHandle;\n    HANDLE CriticalSectionOwnerThread;\n    PVOID Reserved[4];\n} RTL_DEBUG_INFORMATION, *PRTL_DEBUG_INFORMATION;\n\nNTSYSAPI\nPRTL_DEBUG_INFORMATION\nNTAPI\nRtlCreateQueryDebugBuffer(\n    _In_opt_ ULONG MaximumCommit,\n    _In_ BOOLEAN UseEventPair\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyQueryDebugBuffer(\n    _In_ PRTL_DEBUG_INFORMATION Buffer\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nPVOID\nNTAPI\nRtlCommitDebugInfo(\n    _Inout_ PRTL_DEBUG_INFORMATION Buffer,\n    _In_ SIZE_T Size\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nRtlDeCommitDebugInfo(\n    _Inout_ PRTL_DEBUG_INFORMATION Buffer,\n    _In_ PVOID p,\n    _In_ SIZE_T Size\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#define RTL_QUERY_PROCESS_MODULES 0x00000001\n#define RTL_QUERY_PROCESS_BACKTRACES 0x00000002\n#define RTL_QUERY_PROCESS_HEAP_SUMMARY 0x00000004\n#define RTL_QUERY_PROCESS_HEAP_TAGS 0x00000008\n#define RTL_QUERY_PROCESS_HEAP_ENTRIES 0x00000010\n#define RTL_QUERY_PROCESS_LOCKS 0x00000020\n#define RTL_QUERY_PROCESS_MODULES32 0x00000040\n#define RTL_QUERY_PROCESS_VERIFIER_OPTIONS 0x00000080 // rev\n#define RTL_QUERY_PROCESS_MODULESEX 0x00000100 // rev\n#define RTL_QUERY_PROCESS_HEAP_SEGMENTS 0x00000200\n#define RTL_QUERY_PROCESS_CS_OWNER 0x00000400 // rev\n#define RTL_QUERY_PROCESS_NONINVASIVE 0x80000000\n#define RTL_QUERY_PROCESS_NONINVASIVE_CS_OWNER 0x80000800 // WIN11\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryProcessDebugInformation(\n    _In_ HANDLE UniqueProcessId,\n    _In_ ULONG Flags,\n    _Inout_ PRTL_DEBUG_INFORMATION Buffer\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetProcessDebugInformation(\n    _In_ HANDLE UniqueProcessId,\n    _In_ ULONG Flags,\n    _Inout_ PRTL_DEBUG_INFORMATION Buffer\n    );\n\n// rev\nFORCEINLINE\nBOOLEAN\nNTAPI\nRtlIsAnyDebuggerPresent(\n    VOID\n    )\n{\n    BOOLEAN result;\n\n    result = NtCurrentPeb()->BeingDebugged;\n\n    if (!result)\n        return USER_SHARED_DATA->KdDebuggerEnabled;\n\n    return result;\n}\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDebugPrintTimes(\n    VOID\n    );\n\n//\n// Messages\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFindMessage(\n    _In_ PVOID DllHandle,\n    _In_ ULONG MessageTableId,\n    _In_ ULONG MessageLanguageId,\n    _In_ ULONG MessageId,\n    _Out_ PMESSAGE_RESOURCE_ENTRY *MessageEntry\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFormatMessage(\n    _In_ PCWSTR MessageFormat,\n    _In_ ULONG MaximumWidth,\n    _In_ BOOLEAN IgnoreInserts,\n    _In_ BOOLEAN ArgumentsAreAnsi,\n    _In_ BOOLEAN ArgumentsAreAnArray,\n    _In_ va_list *Arguments,\n    _Out_writes_bytes_to_(Length, *ReturnLength) PWSTR Buffer,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\ntypedef struct _PARSE_MESSAGE_CONTEXT\n{\n    ULONG fFlags;\n    ULONG cwSavColumn;\n    SIZE_T iwSrc;\n    SIZE_T iwDst;\n    SIZE_T iwDstSpace;\n    va_list lpvArgStart;\n} PARSE_MESSAGE_CONTEXT, *PPARSE_MESSAGE_CONTEXT;\n\n#define INIT_PARSE_MESSAGE_CONTEXT(ctx) { (ctx)->fFlags = 0; }\n#define TEST_PARSE_MESSAGE_CONTEXT_FLAG(ctx, flag) ((ctx)->fFlags & (flag))\n#define SET_PARSE_MESSAGE_CONTEXT_FLAG(ctx, flag) ((ctx)->fFlags |= (flag))\n#define CLEAR_PARSE_MESSAGE_CONTEXT_FLAG(ctx, flag) ((ctx)->fFlags &= ~(flag))\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFormatMessageEx(\n    _In_ PCWSTR MessageFormat,\n    _In_ ULONG MaximumWidth,\n    _In_ BOOLEAN IgnoreInserts,\n    _In_ BOOLEAN ArgumentsAreAnsi,\n    _In_ BOOLEAN ArgumentsAreAnArray,\n    _In_ va_list *Arguments,\n    _Out_writes_bytes_to_(Length, *ReturnLength) PWSTR Buffer,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength,\n    _Out_opt_ PPARSE_MESSAGE_CONTEXT ParseContext\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetFileMUIPath(\n    _In_ ULONG Flags,\n    _In_ PCWSTR FilePath,\n    _Inout_opt_ PCWSTR Language,\n    _Inout_ PULONG LanguageLength,\n    _Out_opt_ PWSTR FileMUIPath,\n    _Inout_ PULONG FileMUIPathLength,\n    _Inout_ PULONGLONG Enumerator\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLoadString(\n    _In_ PVOID DllHandle,\n    _In_ ULONG StringId,\n    _In_opt_ PCWSTR StringLanguage,\n    _In_ ULONG Flags,\n    _Out_ PCWSTR *ReturnString,\n    _Out_opt_ PUSHORT ReturnStringLen,\n    _Out_writes_(ReturnLanguageLen) PWSTR ReturnLanguageName,\n    _Inout_opt_ PULONG ReturnLanguageLen\n    );\n\n// Errors\n\n_When_(Status < 0, _Out_range_(>, 0))\n_When_(Status >= 0, _Out_range_(==, 0))\nNTSYSAPI\nULONG\nNTAPI\nRtlNtStatusToDosError(\n    _In_ NTSTATUS Status\n    );\n\n_When_(Status < 0, _Out_range_(>, 0))\n_When_(Status >= 0, _Out_range_(==, 0))\nNTSYSAPI\nULONG\nNTAPI\nRtlNtStatusToDosErrorNoTeb(\n    _In_ NTSTATUS Status\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetLastNtStatus(\n    VOID\n    );\n\nNTSYSAPI\nLONG\nNTAPI\nRtlGetLastWin32Error(\n    VOID\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetLastWin32ErrorAndNtStatusFromNtStatus(\n    _In_ NTSTATUS Status\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetLastWin32Error(\n    _In_ LONG Win32Error\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRestoreLastWin32Error(\n    _In_ LONG Win32Error\n    );\n\n#define RTL_ERRORMODE_FAILCRITICALERRORS 0x0010\n#define RTL_ERRORMODE_NOGPFAULTERRORBOX 0x0020\n#define RTL_ERRORMODE_NOOPENFILEERRORBOX 0x0040\n\nNTSYSAPI\nULONG\nNTAPI\nRtlGetThreadErrorMode(\n    VOID\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetThreadErrorMode(\n    _In_ ULONG NewMode,\n    _Out_opt_ PULONG OldMode\n    );\n\n// Windows Error Reporting\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReportException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord,\n    _In_ ULONG Flags\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReportExceptionEx(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord,\n    _In_ ULONG Flags,\n    _In_ PLARGE_INTEGER Timeout\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWerpReportException(\n    _In_ ULONG ProcessId,\n    _In_ HANDLE CrashReportSharedMem,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE CrashVerticalProcessHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReportSilentProcessExit(\n    _In_ HANDLE ProcessHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n//\n// Random\n//\n\nNTSYSAPI\nULONG\nNTAPI\nRtlUniform(\n    _Inout_ PULONG Seed\n    );\n\n_Ret_range_(<=, MAXLONG)\nNTSYSAPI\nULONG\nNTAPI\nRtlRandom(\n    _Inout_ PULONG Seed\n    );\n\n_Ret_range_(<=, MAXLONG)\nNTSYSAPI\nULONG\nNTAPI\nRtlRandomEx(\n    _Inout_ PULONG Seed\n    );\n\n#define RTL_IMPORT_TABLE_HASH_REVISION 1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlComputeImportTableHash(\n    _In_ HANDLE FileHandle,\n    _Out_writes_bytes_(16) PCHAR Hash,\n    _In_ ULONG ImportTableHashRevision // must be 1\n    );\n\n//\n// Integer conversion\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIntegerToChar(\n    _In_ ULONG Value,\n    _In_opt_ ULONG Base,\n    _In_ LONG OutputLength, // negative to pad to width\n    _Out_ PSTR String\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCharToInteger(\n    _In_z_ PCSTR String,\n    _In_opt_ ULONG Base,\n    _Out_ PULONG Value\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLargeIntegerToChar(\n    _In_ PLARGE_INTEGER Value,\n    _In_opt_ ULONG Base,\n    _In_ LONG OutputLength,\n    _Out_ PSTR String\n    );\n\n#define RtlLargeIntegerGreaterThan(X,Y) ((((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || ((X).HighPart > (Y).HighPart))\n#define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ((((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || ((X).HighPart > (Y).HighPart)))\n#define RtlLargeIntegerEqualTo(X,Y) (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))\n#define RtlLargeIntegerNotEqualTo(X,Y) ((((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))\n#define RtlLargeIntegerLessThan(X,Y) ((((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || ((X).HighPart < (Y).HighPart))\n#define RtlLargeIntegerLessThanOrEqualTo(X,Y) ((((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || ((X).HighPart < (Y).HighPart))\n#define RtlLargeIntegerGreaterThanZero(X) ((((X).HighPart == 0) && ((X).LowPart > 0)) || ((X).HighPart > 0 ))\n#define RtlLargeIntegerGreaterOrEqualToZero(X) ((X).HighPart >= 0)\n#define RtlLargeIntegerEqualToZero(X) (!((X).LowPart | (X).HighPart))\n#define RtlLargeIntegerNotEqualToZero(X) (((X).LowPart | (X).HighPart))\n#define RtlLargeIntegerLessThanZero(X) (((X).HighPart < 0))\n#define RtlLargeIntegerLessOrEqualToZero(X) (((X).HighPart < 0) || !((X).LowPart | (X).HighPart))\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIntegerToUnicodeString(\n    _In_ ULONG Value,\n    _In_opt_ ULONG Base,\n    _Inout_ PUNICODE_STRING String\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInt64ToUnicodeString(\n    _In_ ULONGLONG Value,\n    _In_opt_ ULONG Base,\n    _Inout_ PUNICODE_STRING String\n    );\n\n#ifdef _WIN64\n#define RtlIntPtrToUnicodeString(Value, Base, String) RtlInt64ToUnicodeString(Value, Base, String)\n#else\n#define RtlIntPtrToUnicodeString(Value, Base, String) RtlIntegerToUnicodeString(Value, Base, String)\n#endif // _WIN64\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnicodeStringToInteger(\n    _In_ PCUNICODE_STRING String,\n    _In_opt_ ULONG Base,\n    _Out_ PULONG Value\n    );\n\n//\n// IPv4/6 conversion\n//\n\n#ifndef s_addr\n//\n// IPv4 Internet address\n// This is an 'on-wire' format structure.\n//\ntypedef struct in_addr\n{\n    union\n    {\n        struct { UCHAR s_b1, s_b2, s_b3, s_b4; } S_un_b;\n        struct { USHORT s_w1, s_w2; } S_un_w;\n        ULONG S_addr;\n    } S_un;\n#define s_addr  S_un.S_addr /* can be used for most tcp & ip code */\n#define s_host  S_un.S_un_b.s_b2    // host on imp\n#define s_net   S_un.S_un_b.s_b1    // network\n#define s_imp   S_un.S_un_w.s_w2    // imp\n#define s_impno S_un.S_un_b.s_b4    // imp #\n#define s_lh    S_un.S_un_b.s_b3    // logical host\n} IN_ADDR, * PIN_ADDR, FAR* LPIN_ADDR;\n#endif // s_addr\n\n#ifndef s6_addr\n//\n// IPv6 Internet address (RFC 2553)\n// This is an 'on-wire' format structure.\n//\ntypedef struct in6_addr\n{\n    union\n    {\n        UCHAR Byte[16];\n        USHORT Word[8];\n    } u;\n#define in_addr6 in6_addr\n#define _S6_un   u\n#define _S6_u8   Byte\n#define s6_addr  _S6_un._S6_u8\n#define s6_bytes u.Byte\n#define s6_words u.Word\n} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;\n#endif // s6_addr\n\ntypedef struct in_addr IN_ADDR, *PIN_ADDR;\ntypedef struct in6_addr IN6_ADDR, *PIN6_ADDR;\ntypedef IN_ADDR const *PCIN_ADDR;\ntypedef IN6_ADDR const *PCIN6_ADDR;\n\nNTSYSAPI\nPWSTR\nNTAPI\nRtlIpv4AddressToStringW(\n    _In_ PCIN_ADDR Address,\n    _Out_writes_(16) PWSTR AddressString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv4AddressToStringExW(\n    _In_ PCIN_ADDR Address,\n    _In_ USHORT Port,\n    _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWSTR AddressString,\n    _Inout_ PULONG AddressStringLength\n    );\n\nNTSYSAPI\nPWSTR\nNTAPI\nRtlIpv6AddressToStringW(\n    _In_ PCIN6_ADDR Address,\n    _Out_writes_(46) PWSTR AddressString\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv6AddressToStringExW(\n    _In_ PCIN6_ADDR Address,\n    _In_ ULONG ScopeId,\n    _In_ USHORT Port,\n    _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWSTR AddressString,\n    _Inout_ PULONG AddressStringLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv4StringToAddressW(\n    _In_ PCWSTR AddressString,\n    _In_ BOOLEAN Strict,\n    _Out_ LPCWSTR *Terminator,\n    _Out_ PIN_ADDR Address\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv4StringToAddressExW(\n    _In_ PCWSTR AddressString,\n    _In_ BOOLEAN Strict,\n    _Out_ PIN_ADDR Address,\n    _Out_ PUSHORT Port\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv6StringToAddressW(\n    _In_ PCWSTR AddressString,\n    _Out_ PCWSTR *Terminator,\n    _Out_ PIN6_ADDR Address\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIpv6StringToAddressExW(\n    _In_ PCWSTR AddressString,\n    _Out_ PIN6_ADDR Address,\n    _Out_ PULONG ScopeId,\n    _Out_ PUSHORT Port\n    );\n\n#define RtlIpv4AddressToString RtlIpv4AddressToStringW\n#define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW\n#define RtlIpv6AddressToString RtlIpv6AddressToStringW\n#define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW\n#define RtlIpv4StringToAddress RtlIpv4StringToAddressW\n#define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW\n#define RtlIpv6StringToAddress RtlIpv6StringToAddressW\n#define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW\n\n//\n// Time\n//\n\ntypedef struct _TIME_FIELDS\n{\n    CSHORT Year; // 1601...\n    CSHORT Month; // 1..12\n    CSHORT Day; // 1..31\n    CSHORT Hour; // 0..23\n    CSHORT Minute; // 0..59\n    CSHORT Second; // 0..59\n    CSHORT Milliseconds; // 0..999\n    CSHORT Weekday; // 0..6 = Sunday..Saturday\n} TIME_FIELDS, *PTIME_FIELDS;\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlCutoverTimeToSystemTime(\n    _In_ PTIME_FIELDS CutoverTime,\n    _Out_ PLARGE_INTEGER SystemTime,\n    _In_ PLARGE_INTEGER CurrentSystemTime,\n    _In_ BOOLEAN ThisYear\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSystemTimeToLocalTime(\n    _In_ PLARGE_INTEGER SystemTime,\n    _Out_ PLARGE_INTEGER LocalTime\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLocalTimeToSystemTime(\n    _In_ PLARGE_INTEGER LocalTime,\n    _Out_ PLARGE_INTEGER SystemTime\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlTimeToElapsedTimeFields(\n    _In_ PLARGE_INTEGER Time,\n    _Out_ PTIME_FIELDS TimeFields\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlTimeToTimeFields(\n    _In_ PLARGE_INTEGER Time,\n    _Out_ PTIME_FIELDS TimeFields\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTimeFieldsToTime(\n    _In_ PTIME_FIELDS TimeFields, // Weekday is ignored\n    _Out_ PLARGE_INTEGER Time\n    );\n\n#define SecondsToStartOf1980 11960006400\n#define SecondsToStartOf1970 11644473600\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTimeToSecondsSince1980(\n    _In_ PLARGE_INTEGER Time,\n    _Out_ PULONG ElapsedSeconds\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSecondsSince1980ToTime(\n    _In_ ULONG ElapsedSeconds,\n    _Out_ PLARGE_INTEGER Time\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTimeToSecondsSince1970(\n    _In_ PLARGE_INTEGER Time,\n    _Out_ PULONG ElapsedSeconds\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSecondsSince1970ToTime(\n    _In_ ULONG ElapsedSeconds,\n    _Out_ PLARGE_INTEGER Time\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nULONGLONG\nNTAPI\nRtlGetSystemTimePrecise(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_21H2)\nNTSYSAPI\nKSYSTEM_TIME\nNTAPI\nRtlGetSystemTimeAndBias(\n    _Out_ KSYSTEM_TIME TimeZoneBias,\n    _Out_opt_ PLARGE_INTEGER TimeZoneBiasEffectiveStart,\n    _Out_opt_ PLARGE_INTEGER TimeZoneBiasEffectiveEnd\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_21H2\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI\nULONGLONG\nNTAPI\nRtlGetInterruptTimePrecise(\n    _Out_ PLARGE_INTEGER PerformanceCounter\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlQueryUnbiasedInterruptTime(\n    _Out_ PLARGE_INTEGER InterruptTime\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\nFORCEINLINE\nULONGLONG\nNTAPI\nRtlBeginReadTickLock(\n    _In_ PULONGLONG TimeUpdateLock // USER_SHARED_DATA->TimeUpdateLock\n    )\n{\n    ULONGLONG result;\n\n    for (result = *TimeUpdateLock; (*TimeUpdateLock & 1) != 0; result = *TimeUpdateLock)\n    {\n        YieldProcessor();\n    }\n\n    return result;\n}\n\n//\n// Time zones\n//\n\ntypedef struct _RTL_TIME_ZONE_INFORMATION\n{\n    LONG Bias;\n    WCHAR StandardName[32];\n    TIME_FIELDS StandardStart;\n    LONG StandardBias;\n    WCHAR DaylightName[32];\n    TIME_FIELDS DaylightStart;\n    LONG DaylightBias;\n} RTL_TIME_ZONE_INFORMATION, *PRTL_TIME_ZONE_INFORMATION;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryTimeZoneInformation(\n    _Out_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetTimeZoneInformation(\n    _In_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation\n    );\n\n//\n// Interlocked bit manipulation interfaces\n//\n\n#define RtlInterlockedSetBits(Flags, Flag) \\\n    InterlockedOr((PLONG)(Flags), Flag)\n\n#define RtlInterlockedAndBits(Flags, Flag) \\\n    InterlockedAnd((PLONG)(Flags), Flag)\n\n#define RtlInterlockedClearBits(Flags, Flag) \\\n    RtlInterlockedAndBits(Flags, ~(Flag))\n\n#define RtlInterlockedXorBits(Flags, Flag) \\\n    InterlockedXor(Flags, Flag)\n\n#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \\\n    (VOID) RtlInterlockedSetBits(Flags, Flag)\n\n#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \\\n    (VOID) RtlInterlockedAndBits(Flags, Flag)\n\n#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \\\n    RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))\n\n#define RtlInterlockedTestBits(Flags, Flag) \\\n    ((InterlockedOr((PLONG)(Flags), 0) & (Flag)) == (Flag)) // dmex\n\n//\n// Bitmaps\n//\n\ntypedef struct _RTL_BITMAP\n{\n    ULONG SizeOfBitMap;\n    PULONG Buffer;\n} RTL_BITMAP, *PRTL_BITMAP;\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeBitMap(\n    _Out_ PRTL_BITMAP BitMapHeader,\n    _In_ PULONG BitMapBuffer,\n    _In_ ULONG SizeOfBitMap\n    );\n\n#if (PHNT_MODE == PHNT_MODE_KERNEL || PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nVOID\nNTAPI\nRtlClearBit(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber\n    );\n#endif // PHNT_MODE == PHNT_MODE_KERNEL || PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_MODE == PHNT_MODE_KERNEL || PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nVOID\nNTAPI\nRtlSetBit(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber\n    );\n#endif // PHNT_MODE == PHNT_MODE_KERNEL || PHNT_VERSION >= PHNT_WINDOWS_8\n\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTestBit(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlClearAllBits(\n    _In_ PRTL_BITMAP BitMapHeader\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetAllBits(\n    _In_ PRTL_BITMAP BitMapHeader\n    );\n\n_Success_(return != -1)\n_Check_return_\nNTSYSAPI\nULONG\nNTAPI\nRtlFindClearBits(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG NumberToFind,\n    _In_ ULONG HintIndex\n    );\n\n_Success_(return != -1)\n_Check_return_\nNTSYSAPI\nULONG\nNTAPI\nRtlFindSetBits(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG NumberToFind,\n    _In_ ULONG HintIndex\n    );\n\n_Success_(return != -1)\nNTSYSAPI\nULONG\nNTAPI\nRtlFindClearBitsAndSet(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG NumberToFind,\n    _In_ ULONG HintIndex\n    );\n\n_Success_(return != -1)\nNTSYSAPI\nULONG\nNTAPI\nRtlFindSetBitsAndClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG NumberToFind,\n    _In_ ULONG HintIndex\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlClearBits(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetBits(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet\n    );\n\nNTSYSAPI\nCCHAR\nNTAPI\nRtlFindMostSignificantBit(\n    _In_ ULONGLONG Set\n    );\n\nNTSYSAPI\nCCHAR\nNTAPI\nRtlFindLeastSignificantBit(\n    _In_ ULONGLONG Set\n    );\n\ntypedef struct _RTL_BITMAP_RUN\n{\n    ULONG StartingIndex;\n    ULONG NumberOfBits;\n} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;\n\nNTSYSAPI\nULONG\nNTAPI\nRtlFindClearRuns(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,\n    _In_range_(>, 0) ULONG SizeOfRunArray,\n    _In_ BOOLEAN LocateLongestRuns\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlFindLongestRunClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _Out_ PULONG StartingIndex\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlFindFirstRunClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _Out_ PULONG StartingIndex\n    );\n\n_Check_return_\nFORCEINLINE\nBOOLEAN\nRtlCheckBit(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition\n    )\n{\n#ifdef _WIN64\n    return BitTest64((LONG64 const *)BitMapHeader->Buffer, (LONG64)BitPosition);\n#else\n    return (((PLONG)BitMapHeader->Buffer)[BitPosition / 32] >> (BitPosition % 32)) & 0x1;\n#endif // _WIN64\n}\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberOfClearBits(\n    _In_ PRTL_BITMAP BitMapHeader\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberOfSetBits(\n    _In_ PRTL_BITMAP BitMapHeader\n    );\n\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAreBitsClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG StartingIndex,\n    _In_ ULONG Length\n    );\n\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAreBitsSet(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG StartingIndex,\n    _In_ ULONG Length\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlFindNextForwardRunClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG FromIndex,\n    _Out_ PULONG StartingRunIndex\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlFindLastBackwardRunClear(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG FromIndex,\n    _Out_ PULONG StartingRunIndex\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberOfSetBitsUlongPtr(\n    _In_ ULONG_PTR Target\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlInterlockedClearBitRun(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlInterlockedSetBitRun(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,\n    _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSAPI\nVOID\nNTAPI\nRtlCopyBitMap(\n    _In_ PRTL_BITMAP Source,\n    _In_ PRTL_BITMAP Destination,\n    _In_range_(0, Destination->SizeOfBitMap - 1) ULONG TargetBit\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlExtractBitMap(\n    _In_ PRTL_BITMAP Source,\n    _In_ PRTL_BITMAP Destination,\n    _In_range_(0, Source->SizeOfBitMap - 1) ULONG TargetBit,\n    _In_range_(0, Source->SizeOfBitMap) ULONG NumberOfBits\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberOfClearBitsInRange(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG StartingIndex,\n    _In_ ULONG Length\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlNumberOfSetBitsInRange(\n    _In_ PRTL_BITMAP BitMapHeader,\n    _In_ ULONG StartingIndex,\n    _In_ ULONG Length\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// private\ntypedef struct _RTL_BITMAP_EX\n{\n    ULONG64 SizeOfBitMap;\n    PULONG64 Buffer;\n} RTL_BITMAP_EX, *PRTL_BITMAP_EX;\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeBitMapEx(\n    _Out_ PRTL_BITMAP_EX BitMapHeader,\n    _In_ PULONG64 BitMapBuffer,\n    _In_ ULONG64 SizeOfBitMap\n    );\n\n// rev\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlTestBitEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG64 BitNumber\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlClearAllBitsEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlClearBitEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG64 BitNumber\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlSetBitEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader,\n    _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG64 BitNumber\n    );\n\n// rev\nNTSYSAPI\nULONG64\nNTAPI\nRtlFindSetBitsEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader,\n    _In_ ULONG64 NumberToFind,\n    _In_ ULONG64 HintIndex\n    );\n\nNTSYSAPI\nULONG64\nNTAPI\nRtlFindSetBitsAndClearEx(\n    _In_ PRTL_BITMAP_EX BitMapHeader,\n    _In_ ULONG64 NumberToFind,\n    _In_ ULONG64 HintIndex\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n//\n// Handle tables\n//\n\ntypedef struct _RTL_HANDLE_TABLE_ENTRY\n{\n    union\n    {\n        ULONG Flags; // allocated entries have the low bit set\n        struct _RTL_HANDLE_TABLE_ENTRY *NextFree;\n    };\n} RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;\n\n#define RTL_HANDLE_ALLOCATED (USHORT)0x0001\n\ntypedef struct _RTL_HANDLE_TABLE\n{\n    ULONG MaximumNumberOfHandles;\n    ULONG SizeOfHandleTableEntry;\n    ULONG Reserved[2];\n    PRTL_HANDLE_TABLE_ENTRY FreeHandles;\n    PRTL_HANDLE_TABLE_ENTRY CommittedHandles;\n    PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles;\n    PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles;\n} RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;\n\nNTSYSAPI\nVOID\nNTAPI\nRtlInitializeHandleTable(\n    _In_ ULONG MaximumNumberOfHandles,\n    _In_ ULONG SizeOfHandleTableEntry,\n    _Out_ PRTL_HANDLE_TABLE HandleTable\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyHandleTable(\n    _Inout_ PRTL_HANDLE_TABLE HandleTable\n    );\n\nNTSYSAPI\nPRTL_HANDLE_TABLE_ENTRY\nNTAPI\nRtlAllocateHandle(\n    _In_ PRTL_HANDLE_TABLE HandleTable,\n    _Out_opt_ PULONG HandleIndex\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlFreeHandle(\n    _In_ PRTL_HANDLE_TABLE HandleTable,\n    _In_ PRTL_HANDLE_TABLE_ENTRY Handle\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsValidHandle(\n    _In_ PRTL_HANDLE_TABLE HandleTable,\n    _In_ PRTL_HANDLE_TABLE_ENTRY Handle\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsValidIndexHandle(\n    _In_ PRTL_HANDLE_TABLE HandleTable,\n    _In_ ULONG HandleIndex,\n    _Out_ PRTL_HANDLE_TABLE_ENTRY *Handle\n    );\n\n//\n// Atom tables\n//\n\n#define RTL_ATOM_MAXIMUM_INTEGER_ATOM (RTL_ATOM)0xc000\n#define RTL_ATOM_INVALID_ATOM (RTL_ATOM)0x0000\n#define RTL_ATOM_TABLE_DEFAULT_NUMBER_OF_BUCKETS 37\n#define RTL_ATOM_MAXIMUM_NAME_LENGTH 255\n#define RTL_ATOM_PINNED 0x01\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateAtomTable(\n    _In_ ULONG NumberOfBuckets,\n    _Out_ PVOID *AtomTableHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDestroyAtomTable(\n    _In_ _Post_invalid_ PVOID AtomTableHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlEmptyAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ BOOLEAN IncludePinnedAtoms\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAtomToAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ PCWSTR AtomName,\n    _Inout_opt_ PRTL_ATOM Atom\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLookupAtomInAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ PCWSTR AtomName,\n    _Out_opt_ PRTL_ATOM Atom\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteAtomFromAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ RTL_ATOM Atom\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlPinAtomInAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ RTL_ATOM Atom\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryAtomInAtomTable(\n    _In_ PVOID AtomTableHandle,\n    _In_ RTL_ATOM Atom,\n    _Out_opt_ PULONG AtomUsage,\n    _Out_opt_ PULONG AtomFlags,\n    _Inout_updates_bytes_to_opt_(*AtomNameLength, *AtomNameLength) PWSTR AtomName,\n    _Inout_opt_ PULONG AtomNameLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlGetIntegerAtom(\n    _In_ PCWSTR AtomName,\n    _Out_opt_ PUSHORT IntegerAtom\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// SIDs\n//\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidSid(\n    _In_ PSID Sid\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualSid(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualPrefixSid(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlLengthRequiredSid(\n    _In_ ULONG SubAuthorityCount\n    );\n\nNTSYSAPI\nPVOID\nNTAPI\nRtlFreeSid(\n    _In_ _Post_invalid_ PSID Sid\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAllocateAndInitializeSid(\n    _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,\n    _In_ UCHAR SubAuthorityCount,\n    _In_ ULONG SubAuthority0,\n    _In_ ULONG SubAuthority1,\n    _In_ ULONG SubAuthority2,\n    _In_ ULONG SubAuthority3,\n    _In_ ULONG SubAuthority4,\n    _In_ ULONG SubAuthority5,\n    _In_ ULONG SubAuthority6,\n    _In_ ULONG SubAuthority7,\n    _Outptr_ PSID *Sid\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n_Must_inspect_result_\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAllocateAndInitializeSidEx(\n    _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,\n    _In_ UCHAR SubAuthorityCount,\n    _In_reads_(SubAuthorityCount) PULONG SubAuthorities,\n    _Outptr_ PSID *Sid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeSid(\n    _Out_ PSID Sid,\n    _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,\n    _In_ UCHAR SubAuthorityCount\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlInitializeSidEx(\n    _Out_writes_bytes_(SECURITY_SID_SIZE(SubAuthorityCount)) PSID Sid,\n    _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,\n    _In_ UCHAR SubAuthorityCount,\n    ...\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\nNTSYSAPI\nPSID_IDENTIFIER_AUTHORITY\nNTAPI\nRtlIdentifierAuthoritySid(\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nPULONG\nNTAPI\nRtlSubAuthoritySid(\n    _In_ PSID Sid,\n    _In_ ULONG SubAuthority\n    );\n\nNTSYSAPI\nPUCHAR\nNTAPI\nRtlSubAuthorityCountSid(\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlLengthSid(\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCopySid(\n    _In_ ULONG DestinationSidLength,\n    _Out_writes_bytes_(DestinationSidLength) PSID DestinationSid,\n    _In_ PSID SourceSid\n    );\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCopySidAndAttributesArray(\n    _In_ ULONG Count,\n    _In_ PSID_AND_ATTRIBUTES Src,\n    _In_ ULONG SidAreaSize,\n    _In_ PSID_AND_ATTRIBUTES Dest,\n    _In_ PSID SidArea,\n    _Out_ PSID *RemainingSidArea,\n    _Out_ PULONG RemainingSidAreaSize\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateServiceSid(\n    _In_ PCUNICODE_STRING ServiceName,\n    _Out_writes_bytes_opt_(*ServiceSidLength) PSID ServiceSid,\n    _Inout_ PULONG ServiceSidLength\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSidDominates(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2,\n    _Out_ PBOOLEAN Dominates\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSidDominatesForTrust(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2,\n    _Out_ PBOOLEAN DominatesTrust // TokenProcessTrustLevel\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSidEqualLevel(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2,\n    _Out_ PBOOLEAN EqualLevel\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSidIsHigherLevel(\n    _In_ PSID Sid1,\n    _In_ PSID Sid2,\n    _Out_ PBOOLEAN HigherLevel\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateVirtualAccountSid(\n    _In_ PCUNICODE_STRING Name,\n    _In_ ULONG BaseSubAuthority,\n    _Out_writes_bytes_(*SidLength) PSID Sid,\n    _Inout_ PULONG SidLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReplaceSidInSd(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ PSID OldSid,\n    _In_ PSID NewSid,\n    _Out_ ULONG *NumChanges\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#define MAX_UNICODE_STACK_BUFFER_LENGTH 256\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLengthSidAsUnicodeString(\n    _In_ PSID Sid,\n    _Out_ PULONG StringLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlConvertSidToUnicodeString(\n    _Inout_ PUNICODE_STRING UnicodeString,\n    _In_ PSID Sid,\n    _In_ BOOLEAN AllocateDestinationString\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSidHashInitialize(\n    _In_reads_(SidCount) PSID_AND_ATTRIBUTES SidAttr,\n    _In_ ULONG SidCount,\n    _Out_ PSID_AND_ATTRIBUTES_HASH SidAttrHash\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nPSID_AND_ATTRIBUTES\nNTAPI\nRtlSidHashLookup(\n    _In_ PSID_AND_ATTRIBUTES_HASH SidAttrHash,\n    _In_ PSID Sid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsElevatedRid(\n    _In_ PSID_AND_ATTRIBUTES SidAttr\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeriveCapabilitySidsFromName(\n    _Inout_ PUNICODE_STRING UnicodeString,\n    _Out_ PSID CapabilityGroupSid,\n    _Out_ PSID CapabilitySid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n//\n// Security Descriptors\n//\n\n/**\n * The RtlCreateSecurityDescriptor routine initializes a new absolute-format security descriptor.\n * On return, the security descriptor is initialized with no system ACL, no discretionary ACL, no owner, no primary group, and all control flags set to zero.\n *\n * @param SecurityDescriptor Pointer to the buffer for the \\ref SECURITY_DESCRIPTOR to be initialized.\n * @param Revision Specifies the revision level to assign to the security descriptor. Set this parameter to SECURITY_DESCRIPTOR_REVISION.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtlcreatesecuritydescriptor\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateSecurityDescriptor(\n    _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ ULONG Revision\n    );\n\n/**\n * The RtlValidSecurityDescriptor routine checks a given security descriptor's validity.\n *\n * @param SecurityDescriptor Pointer to the \\ref SECURITY_DESCRIPTOR to be checked.\n * @return Returns TRUE if the security descriptor is valid, or FALSE otherwise.\n * @remarks The routine checks the validity of an absolute-format security descriptor. To check the validity of a self-relative security descriptor, use the \\ref RtlValidRelativeSecurityDescriptor routine instead.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtlvalidsecuritydescriptor\n */\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\n/**\n * The RtlLengthSecurityDescriptor routine returns the size of a given security descriptor.\n *\n * @param SecurityDescriptor A pointer to a \\ref SECURITY_DESCRIPTOR structure whose length the function retrieves.\n * @return Returns the length, in bytes, of the SECURITY_DESCRIPTOR structure.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtllengthsecuritydescriptor\n */\nNTSYSAPI\nULONG\nNTAPI\nRtlLengthSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\n/**\n * The RtlValidRelativeSecurityDescriptor routine checks the validity of a self-relative security descriptor.\n *\n * @param SecurityDescriptorInput A pointer to the buffer that contains the security descriptor in self-relative format.\n * The buffer must begin with a SECURITY_DESCRIPTOR structure, which is followed by the rest of the security descriptor data.\n * @param SecurityDescriptorLength The size of the SecurityDescriptorInput structure.\n * @param RequiredInformation A SECURITY_INFORMATION value that specifies the information that is required to be contained in the security descriptor.\n * @return RtlValidRelativeSecurityDescriptor returns TRUE if the security descriptor is valid and includes the information that the RequiredInformation parameter specifies. Otherwise, this routine returns FALSE.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtlvalidrelativesecuritydescriptor\n */\n_Check_return_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidRelativeSecurityDescriptor(\n    _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,\n    _In_ ULONG SecurityDescriptorLength,\n    _In_ SECURITY_INFORMATION RequiredInformation\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetControlSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR_CONTROL Control,\n    _Out_ PULONG Revision\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetControlSecurityDescriptor(\n     _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n     _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,\n     _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet\n     );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetAttributesSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ SECURITY_DESCRIPTOR_CONTROL Control,\n    _Out_ PULONG Revision\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlGetSecurityDescriptorRMControl(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Out_ PUCHAR RMControl\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlSetSecurityDescriptorRMControl(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PUCHAR RMControl\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetDaclSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ BOOLEAN DaclPresent,\n    _In_opt_ PACL Dacl,\n    _In_ BOOLEAN DaclDefaulted\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetDaclSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Out_ PBOOLEAN DaclPresent,\n    _Outptr_result_maybenull_ PACL *Dacl,\n    _Out_ PBOOLEAN DaclDefaulted\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetSaclSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ BOOLEAN SaclPresent,\n    _In_opt_ PACL Sacl,\n    _In_ BOOLEAN SaclDefaulted\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSaclSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Out_ PBOOLEAN SaclPresent,\n    _Out_ PACL *Sacl,\n    _Out_ PBOOLEAN SaclDefaulted\n    );\n\n/**\n * The RtlSetOwnerSecurityDescriptor routine sets the owner information of an absolute-format security descriptor. It replaces any owner information that is already present in the security descriptor.\n *\n * @param SecurityDescriptor Pointer to the SECURITY_DESCRIPTOR structure whose owner is to be set. RtlSetOwnerSecurityDescriptor replaces any existing owner with the new owner.\n * @param Owner Pointer to a security identifier (SID) structure for the security descriptor's new primary owner.\n * @li \\c This pointer, not the SID structure itself, is copied into the security descriptor.\n * @li \\c If this parameter is NULL, RtlSetOwnerSecurityDescriptor clears the security descriptor's owner information. This marks the security descriptor as having no owner.\n * @param OwnerDefaulted Set to TRUE if the owner information is derived from a default mechanism.\n * @li \\c If this value is TRUE, it is default information. RtlSetOwnerSecurityDescriptor sets the SE_OWNER_DEFAULTED flag in the security descriptor's SECURITY_DESCRIPTOR_CONTROL field.\n * @li \\c If this parameter is FALSE, the SE_OWNER_DEFAULTED flag is cleared.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlsetownersecuritydescriptor\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetOwnerSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID Owner,\n    _In_ BOOLEAN OwnerDefaulted\n    );\n\n/**\n * The RtlGetOwnerSecurityDescriptor routine returns the owner information for a given security descriptor.\n *\n * @param SecurityDescriptor Pointer to the SECURITY_DESCRIPTOR structure.\n * @param Owner Pointer to an address to receive a pointer to the owner security identifier (SID). If the security descriptor does not currently contain an owner SID, Owner receives NULL.\n * @param OwnerDefaulted Pointer to a Boolean variable that receives TRUE if the owner information is derived from a default mechanism, FALSE otherwise. Valid only if Owner receives a non-NULL value.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlgetownersecuritydescriptor\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetOwnerSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Outptr_result_maybenull_ PSID *Owner,\n    _Out_ PBOOLEAN OwnerDefaulted\n    );\n\n/**\n * The RtlSetGroupSecurityDescriptor routine sets the primary group information of an absolute-format security descriptor. It replaces any primary group information that is already present in the security descriptor.\n *\n * @param SecurityDescriptor Pointer to the SECURITY_DESCRIPTOR structure whose primary group is to be set. RtlSetGroupSecurityDescriptor replaces any existing primary group with the new primary group.\n * @param Group Pointer to a security identifier (SID) structure for the security descriptor's new primary owner.\n * @li \\c This pointer, not the SID structure itself, is copied into the security descriptor.\n * @li \\c If Group is NULL, RtlSetGroupSecurityDescriptor clears the security descriptor's primary group information. This marks the security descriptor as having no primary group.\n * @param GroupDefaulted Set this Boolean variable to TRUE if the primary group information is derived from a default mechanism.\n * @li \\c If this parameter is TRUE, RtlSetGroupSecurityDescriptor sets the SE_GROUP_DEFAULTED flag in the security descriptor's SECURITY_DESCRIPTOR_CONTROL field.\n * @li \\c If this parameter is FALSE, RtlSetGroupSecurityDescriptor clears the SE_GROUP_DEFAULTED flag.\n * @return NTSTATUS Successful or errant status.\n * @see https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlsetgroupsecuritydescriptor\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetGroupSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID Group,\n    _In_ BOOLEAN GroupDefaulted\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetGroupSecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _Outptr_result_maybenull_ PSID *Group,\n    _Out_ PBOOLEAN GroupDefaulted\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlMakeSelfRelativeSD(\n    _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,\n    _Out_writes_bytes_(*BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAbsoluteToSelfRelativeSD(\n    _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,\n    _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSelfRelativeToAbsoluteSD(\n    _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,\n    _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,\n    _Inout_ PULONG AbsoluteSecurityDescriptorSize,\n    _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl,\n    _Inout_ PULONG DaclSize,\n    _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl,\n    _Inout_ PULONG SaclSize,\n    _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner,\n    _Inout_ PULONG OwnerSize,\n    _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup,\n    _Inout_ PULONG PrimaryGroupSize\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSelfRelativeToAbsoluteSD2(\n    _Inout_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,\n    _Inout_ PULONG BufferSize\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_19H2)\n__drv_maxIRQL(APC_LEVEL)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlNormalizeSecurityDescriptor(\n    _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor,\n    _In_ ULONG SecurityDescriptorLength,\n    _Out_opt_ PSECURITY_DESCRIPTOR *NewSecurityDescriptor,\n    _Out_opt_ PULONG NewSecurityDescriptorLength,\n    _In_ BOOLEAN CheckOnly\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_19H2\n\n//\n// Access masks\n//\n\n#ifndef PHNT_NO_INLINE_ACCESSES_GRANTED\n/**\n * Checks if all desired accesses are granted.\n *\n * This function determines whether all the accesses specified in the DesiredAccess\n * mask are granted by the GrantedAccess mask.\n *\n * @param GrantedAccess The access mask that specifies the granted accesses.\n * @param DesiredAccess The access mask that specifies the desired accesses.\n * @return Returns TRUE if all desired accesses are granted, otherwise FALSE.\n */\nFORCEINLINE\nBOOLEAN\nNTAPI\nRtlAreAllAccessesGranted(\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_ ACCESS_MASK DesiredAccess\n    )\n{\n    return (~GrantedAccess & DesiredAccess) == 0;\n}\n\n/**\n * Checks if any of the desired accesses are granted.\n *\n * This function determines if any of the access rights specified in the DesiredAccess\n * mask are present in the GrantedAccess mask.\n *\n * @param GrantedAccess The access mask that specifies the granted access rights.\n * @param DesiredAccess The access mask that specifies the desired access rights.\n * @return Returns TRUE if any of the desired access rights are granted, otherwise FALSE.\n */\nFORCEINLINE\nBOOLEAN\nNTAPI\nRtlAreAnyAccessesGranted(\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_ ACCESS_MASK DesiredAccess\n    )\n{\n    return (GrantedAccess & DesiredAccess) != 0;\n}\n#else\n/**\n * Checks if all desired accesses are granted.\n *\n * This function determines whether all the accesses specified in the DesiredAccess\n * mask are granted by the GrantedAccess mask.\n *\n * @param GrantedAccess The access mask that specifies the granted accesses.\n * @param DesiredAccess The access mask that specifies the desired accesses.\n * @return Returns TRUE if all desired accesses are granted, otherwise FALSE.\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAreAllAccessesGranted(\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\n/**\n * Checks if any of the desired accesses are granted.\n *\n * This function determines if any of the access rights specified in the DesiredAccess\n * mask are present in the GrantedAccess mask.\n *\n * @param GrantedAccess The access mask that specifies the granted access rights.\n * @param DesiredAccess The access mask that specifies the desired access rights.\n * @return Returns TRUE if any of the desired access rights are granted, otherwise FALSE.\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlAreAnyAccessesGranted(\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n#endif // PHNT_NO_INLINE_ACCESSES_GRANTED\n\nNTSYSAPI\nVOID\nNTAPI\nRtlMapGenericMask(\n    _Inout_ PACCESS_MASK AccessMask,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\n//\n// ACLs\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateAcl(\n    _Out_writes_bytes_(AclLength) PACL Acl,\n    _In_ ULONG AclLength,\n    _In_ ULONG AclRevision\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlValidAcl(\n    _In_ PACL Acl\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryInformationAcl(\n    _In_ PACL Acl,\n    _Out_writes_bytes_(AclInformationLength) PVOID AclInformation,\n    _In_ ULONG AclInformationLength,\n    _In_ ACL_INFORMATION_CLASS AclInformationClass\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetInformationAcl(\n    _Inout_ PACL Acl,\n    _In_reads_bytes_(AclInformationLength) PVOID AclInformation,\n    _In_ ULONG AclInformationLength,\n    _In_ ACL_INFORMATION_CLASS AclInformationClass\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG StartingAceIndex,\n    _In_reads_bytes_(AceListLength) PVOID AceList,\n    _In_ ULONG AceListLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceIndex\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetAce(\n    _In_ PACL Acl,\n    _In_ ULONG AceIndex,\n    _Outptr_ PVOID *Ace\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11_24H2)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetAcesBufferSize(\n    _In_ PACL Acl,\n    _Out_ PULONG AcesBufferSize\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11_24H2\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlFirstFreeAce(\n    _In_ PACL Acl,\n    _Out_ PVOID *FirstFree\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nPVOID\nNTAPI\nRtlFindAceByType(\n    _In_ PACL Acl,\n    _In_ UCHAR AceType,\n    _Out_opt_ PULONG Index\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlOwnerAcesPresent(\n    _In_ PACL pAcl\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessAllowedAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessAllowedAceEx(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessDeniedAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessDeniedAceEx(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAuditAccessAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid,\n    _In_ BOOLEAN AuditSuccess,\n    _In_ BOOLEAN AuditFailure\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAuditAccessAceEx(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID Sid,\n    _In_ BOOLEAN AuditSuccess,\n    _In_ BOOLEAN AuditFailure\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessAllowedObjectAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_opt_ PGUID ObjectTypeGuid,\n    _In_opt_ PGUID InheritedObjectTypeGuid,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAccessDeniedObjectAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_opt_ PGUID ObjectTypeGuid,\n    _In_opt_ PGUID InheritedObjectTypeGuid,\n    _In_ PSID Sid\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddAuditAccessObjectAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ACCESS_MASK AccessMask,\n    _In_opt_ PGUID ObjectTypeGuid,\n    _In_opt_ PGUID InheritedObjectTypeGuid,\n    _In_ PSID Sid,\n    _In_ BOOLEAN AuditSuccess,\n    _In_ BOOLEAN AuditFailure\n    );\n\n// private\n#define COMPOUND_ACE_IMPERSONATION 1\n\n// private\ntypedef struct _COMPOUND_ACCESS_ALLOWED_ACE\n{\n    ACE_HEADER Header;\n    ACCESS_MASK Mask;\n    USHORT CompoundAceType; // COMPOUND_ACE_*\n    USHORT Reserved;\n    ULONG SidStart; // Server SID\n    // Client SID follows\n} COMPOUND_ACCESS_ALLOWED_ACE, *PCOMPOUND_ACCESS_ALLOWED_ACE;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddCompoundAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ UCHAR AceType, // COMPOUND_ACE_*\n    _In_ ACCESS_MASK AccessMask,\n    _In_ PSID ServerSid,\n    _In_ PSID ClientSid\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddMandatoryAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ PSID Sid,\n    _In_ UCHAR AceType,\n    _In_ ACCESS_MASK AccessMask\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddResourceAttributeAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ULONG AccessMask,\n    _In_ PSID Sid,\n    _In_ PCLAIM_SECURITY_ATTRIBUTES_INFORMATION AttributeInfo,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddScopedPolicyIDAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ ULONG AccessMask,\n    _In_ PSID Sid\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddProcessTrustLabelAce(\n    _Inout_ PACL Acl,\n    _In_ ULONG AceRevision,\n    _In_ ULONG AceFlags,\n    _In_ PSID ProcessTrustLabelSid,\n    _In_ UCHAR AceType, // SYSTEM_PROCESS_TRUST_LABEL_ACE_TYPE\n    _In_ ACCESS_MASK AccessMask\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n//\n// Named pipes\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDefaultNpAcl(\n    _Out_ PACL *Acl\n    );\n\n//\n// Security objects\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNewSecurityObject(\n    _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR CreatorDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_opt_ HANDLE Token,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNewSecurityObjectEx(\n    _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR CreatorDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,\n    _In_opt_ GUID *ObjectType,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_ ULONG AutoInheritFlags, // SEF_*\n    _In_opt_ HANDLE Token,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNewSecurityObjectWithMultipleInheritance(\n    _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR CreatorDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,\n    _In_opt_ GUID **ObjectType,\n    _In_ ULONG GuidCount,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_ ULONG AutoInheritFlags, // SEF_*\n    _In_opt_ HANDLE Token,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteSecurityObject(\n    _Inout_ PSECURITY_DESCRIPTOR *ObjectDescriptor\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQuerySecurityObject(\n     _In_ PSECURITY_DESCRIPTOR ObjectDescriptor,\n     _In_ SECURITY_INFORMATION SecurityInformation,\n     _Out_opt_ PSECURITY_DESCRIPTOR ResultantDescriptor,\n     _In_ ULONG DescriptorLength,\n     _Out_ PULONG ReturnLength\n     );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetSecurityObject(\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,\n    _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_opt_ HANDLE TokenHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetSecurityObjectEx(\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,\n    _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,\n    _In_ ULONG AutoInheritFlags, // SEF_*\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_opt_ HANDLE TokenHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlConvertToAutoInheritSecurityObject(\n    _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,\n    _In_ PSECURITY_DESCRIPTOR CurrentSecurityDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *NewSecurityDescriptor,\n    _In_opt_ GUID *ObjectType,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNewInstanceSecurityObject(\n    _In_ BOOLEAN ParentDescriptorChanged,\n    _In_ BOOLEAN CreatorDescriptorChanged,\n    _In_ PLUID OldClientTokenModifiedId,\n    _Out_ PLUID NewClientTokenModifiedId,\n    _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,\n    _In_opt_ PSECURITY_DESCRIPTOR CreatorDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_ HANDLE TokenHandle,\n    _In_ PGENERIC_MAPPING GenericMapping\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCopySecurityDescriptor(\n    _In_ PSECURITY_DESCRIPTOR InputSecurityDescriptor,\n    _Out_ PSECURITY_DESCRIPTOR *OutputSecurityDescriptor\n    );\n\n// private\ntypedef struct _RTL_ACE_DATA\n{\n    UCHAR AceType;\n    UCHAR InheritFlags;\n    UCHAR AceFlags;\n    ACCESS_MASK AccessMask;\n    PSID* Sid;\n} RTL_ACE_DATA, *PRTL_ACE_DATA;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateUserSecurityObject(\n    _In_ PRTL_ACE_DATA AceData,\n    _In_ ULONG AceCount,\n    _In_ PSID OwnerSid,\n    _In_ PSID GroupSid,\n    _In_ BOOLEAN IsDirectoryObject,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_ PSECURITY_DESCRIPTOR* NewSecurityDescriptor\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateAndSetSD(\n    _In_ PRTL_ACE_DATA AceData,\n    _In_ ULONG AceCount,\n    _In_opt_ PSID OwnerSid,\n    _In_opt_ PSID GroupSid,\n    _Out_ PSECURITY_DESCRIPTOR* NewSecurityDescriptor\n    );\n\n// Misc. security\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRunEncodeUnicodeString(\n    _Inout_ PUCHAR Seed,\n    _Inout_ PUNICODE_STRING String\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRunDecodeUnicodeString(\n    _In_ UCHAR Seed,\n    _Inout_ PUNICODE_STRING String\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlImpersonateSelf(\n    _In_ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlImpersonateSelfEx(\n    _In_ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,\n    _In_opt_ ACCESS_MASK AdditionalAccess,\n    _Out_opt_ PHANDLE ThreadToken\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAdjustPrivilege(\n    _In_ ULONG Privilege,\n    _In_ BOOLEAN Enable,\n    _In_ BOOLEAN Client,\n    _Out_ PBOOLEAN WasEnabled\n    );\n\n#define RTL_ACQUIRE_PRIVILEGE_REVERT 0x00000001\n#define RTL_ACQUIRE_PRIVILEGE_PROCESS 0x00000002\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAcquirePrivilege(\n    _In_ PULONG Privilege,\n    _In_ ULONG NumPriv,\n    _In_ ULONG Flags,\n    _Out_ PVOID *ReturnedState\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlReleasePrivilege(\n    _In_ PVOID StatePointer\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRemovePrivileges(\n    _In_ HANDLE TokenHandle,\n    _In_ PULONG PrivilegesToKeep,\n    _In_ ULONG PrivilegeCount\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIsUntrustedObject(\n    _In_opt_ HANDLE Handle,\n    _In_opt_ PVOID Object,\n    _Out_ PBOOLEAN IsUntrustedObject\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nRtlQueryValidationRunlevel(\n    _In_opt_ PCUNICODE_STRING ComponentName\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n//\n// Private namespaces\n//\n\n// begin_private\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// rev\n#define BOUNDARY_DESCRIPTOR_ADD_APPCONTAINER_SID 0x0001\n\n_Ret_maybenull_\n_Success_(return != NULL)\nNTSYSAPI\nPOBJECT_BOUNDARY_DESCRIPTOR\nNTAPI\nRtlCreateBoundaryDescriptor(\n    _In_ PCUNICODE_STRING Name,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlDeleteBoundaryDescriptor(\n    _In_ _Post_invalid_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddSIDToBoundaryDescriptor(\n    _Inout_ POBJECT_BOUNDARY_DESCRIPTOR *BoundaryDescriptor,\n    _In_ PSID RequiredSid\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAddIntegrityLabelToBoundaryDescriptor(\n    _Inout_ POBJECT_BOUNDARY_DESCRIPTOR *BoundaryDescriptor,\n    _In_ PSID IntegrityLabel\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n// end_private\n\n//\n// Version\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetVersion(\n    _Out_ PRTL_OSVERSIONINFOEXW VersionInformation // PRTL_OSVERSIONINFOW\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlVerifyVersionInfo(\n    _In_ PRTL_OSVERSIONINFOEXW VersionInformation, // PRTL_OSVERSIONINFOW\n    _In_ ULONG TypeMask,\n    _In_ ULONGLONG ConditionMask\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlGetNtVersionNumbers(\n    _Out_opt_ PULONG NtMajorVersion,\n    _Out_opt_ PULONG NtMinorVersion,\n    _Out_opt_ PULONG NtBuildNumber\n    );\n\n//\n// System information\n//\n\n// rev\nNTSYSAPI\nULONG\nNTAPI\nRtlGetNtGlobalFlags(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlGetNtProductType(\n    _Out_ PNT_PRODUCT_TYPE NtProductType\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// private\nNTSYSAPI\nULONG\nNTAPI\nRtlGetSuiteMask(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n//\n// Thread pool (old)\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRegisterWait(\n    _Out_ PHANDLE WaitHandle,\n    _In_ HANDLE Handle,\n    _In_ WAITORTIMERCALLBACKFUNC Function,\n    _In_opt_ PVOID Context,\n    _In_ ULONG Milliseconds,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeregisterWait(\n    _In_ HANDLE WaitHandle\n    );\n\n#define RTL_WAITER_DEREGISTER_WAIT_FOR_COMPLETION ((HANDLE)(LONG_PTR)-1)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeregisterWaitEx(\n    _In_ HANDLE WaitHandle,\n    _In_opt_ HANDLE CompletionEvent // optional: RTL_WAITER_DEREGISTER_WAIT_FOR_COMPLETION\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueueWorkItem(\n    _In_ WORKERCALLBACKFUNC Function,\n    _In_opt_ PVOID Context,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetIoCompletionCallback(\n    _In_ HANDLE FileHandle,\n    _In_ APC_CALLBACK_FUNCTION CompletionProc,\n    _In_ ULONG Flags\n    );\n\n_Function_class_(RTL_START_POOL_THREAD)\ntypedef NTSTATUS (NTAPI RTL_START_POOL_THREAD)(\n    _In_ PTHREAD_START_ROUTINE Function,\n    _In_ PVOID Parameter,\n    _Out_ PHANDLE ThreadHandle\n    );\ntypedef RTL_START_POOL_THREAD *PRTL_START_POOL_THREAD;\n\n_Function_class_(RTL_EXIT_POOL_THREAD)\ntypedef NTSTATUS (NTAPI RTL_EXIT_POOL_THREAD)(\n    _In_ NTSTATUS ExitStatus\n    );\ntypedef RTL_EXIT_POOL_THREAD *PRTL_EXIT_POOL_THREAD;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetThreadPoolStartFunc(\n    _In_ PRTL_START_POOL_THREAD StartPoolThread,\n    _In_ PRTL_EXIT_POOL_THREAD ExitPoolThread\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlUserThreadStart(\n    _In_ PTHREAD_START_ROUTINE Function,\n    _In_ PVOID Parameter\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nLdrInitializeThunk(\n    _In_ PCONTEXT ContextRecord,\n    _In_ PVOID Parameter\n    );\n\n//\n// Thread execution\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDelayExecution(\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER DelayInterval\n    );\n\n//\n// Timer support\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateTimerQueue(\n    _Out_ PHANDLE TimerQueueHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateTimer(\n    _In_ HANDLE TimerQueueHandle,\n    _Out_ PHANDLE Handle,\n    _In_ WAITORTIMERCALLBACKFUNC Function,\n    _In_opt_ PVOID Context,\n    _In_ ULONG DueTime,\n    _In_ ULONG Period,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetTimer(\n    _In_ HANDLE TimerQueueHandle,\n    _Out_ PHANDLE Handle,\n    _In_ WAITORTIMERCALLBACKFUNC Function,\n    _In_opt_ PVOID Context,\n    _In_ ULONG DueTime,\n    _In_ ULONG Period,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUpdateTimer(\n    _In_ HANDLE TimerQueueHandle,\n    _In_ HANDLE TimerHandle,\n    _In_ ULONG DueTime,\n    _In_ ULONG Period\n    );\n\n#define RTL_TIMER_DELETE_WAIT_FOR_COMPLETION ((HANDLE)(LONG_PTR)-1)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteTimer(\n    _In_ HANDLE TimerQueueHandle,\n    _In_ HANDLE TimerToCancel,\n    _In_opt_ HANDLE Event // optional: RTL_TIMER_DELETE_WAIT_FOR_COMPLETION\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteTimerQueue(\n    _In_ HANDLE TimerQueueHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteTimerQueueEx(\n    _In_ HANDLE TimerQueueHandle,\n    _In_opt_ HANDLE Event\n    );\n\n//\n// Registry access\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFormatCurrentUserKeyPath(\n    _Out_ PUNICODE_STRING CurrentUserKeyPath\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlOpenCurrentUser(\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PHANDLE CurrentUserKey\n    );\n\n#define RTL_REGISTRY_ABSOLUTE 0\n#define RTL_REGISTRY_SERVICES 1 // \\Registry\\Machine\\System\\CurrentControlSet\\Services\n#define RTL_REGISTRY_CONTROL 2 // \\Registry\\Machine\\System\\CurrentControlSet\\Control\n#define RTL_REGISTRY_WINDOWS_NT 3 // \\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\n#define RTL_REGISTRY_DEVICEMAP 4 // \\Registry\\Machine\\Hardware\\DeviceMap\n#define RTL_REGISTRY_USER 5 // \\Registry\\User\\CurrentUser\n#define RTL_REGISTRY_MAXIMUM 6\n#define RTL_REGISTRY_HANDLE 0x40000000\n#define RTL_REGISTRY_OPTIONAL 0x80000000\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateRegistryKey(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckRegistryKey(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path\n    );\n\n_Function_class_(RTL_QUERY_REGISTRY_ROUTINE)\ntypedef NTSTATUS (NTAPI RTL_QUERY_REGISTRY_ROUTINE)(\n    _In_ PCWSTR ValueName,\n    _In_ ULONG ValueType,\n    _In_ PVOID ValueData,\n    _In_ ULONG ValueLength,\n    _In_opt_ PVOID Context,\n    _In_opt_ PVOID EntryContext\n    );\ntypedef RTL_QUERY_REGISTRY_ROUTINE *PRTL_QUERY_REGISTRY_ROUTINE;\n\ntypedef struct _RTL_QUERY_REGISTRY_TABLE\n{\n    PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;\n    ULONG Flags;\n    PWSTR Name;\n    PVOID EntryContext;\n    ULONG DefaultType;\n    PVOID DefaultData;\n    ULONG DefaultLength;\n} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;\n\n#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001\n#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002\n#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004\n#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008\n#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010\n#define RTL_QUERY_REGISTRY_DIRECT 0x00000020\n#define RTL_QUERY_REGISTRY_DELETE 0x00000040\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryRegistryValues(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path,\n    _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_) PRTL_QUERY_REGISTRY_TABLE QueryTable,\n    _In_opt_ PVOID Context,\n    _In_opt_ PVOID Environment\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryRegistryValuesEx(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path,\n    _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_) PRTL_QUERY_REGISTRY_TABLE QueryTable,\n    _In_opt_ PVOID Context,\n    _In_opt_ PVOID Environment\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryRegistryValueWithFallback(\n    _In_opt_ HANDLE PrimaryHandle,\n    _In_opt_ HANDLE FallbackHandle,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_ ULONG ValueLength,\n    _Out_opt_ PULONG ValueType,\n    _Out_writes_bytes_to_(ValueLength, *ResultLength) PVOID ValueData,\n    _Out_range_(<= , ValueLength) PULONG ResultLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWriteRegistryValue(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path,\n    _In_ PCWSTR ValueName,\n    _In_ ULONG ValueType,\n    _In_ PVOID ValueData,\n    _In_ ULONG ValueLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeleteRegistryValue(\n    _In_ ULONG RelativeTo,\n    _In_ PCWSTR Path,\n    _In_ PCWSTR ValueName\n    );\n\n//\n// Thread profiling\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n// rev\n/**\n * Enables thread profiling on the specified thread.\n *\n * @param ThreadHandle The handle to the thread on which you want to enable profiling. This must be the current thread.\n * @param Flags To receive thread profiling data such as context switch count, set this parameter to THREAD_PROFILING_FLAG_DISPATCH; otherwise, set to 0.\n * @param HardwareCounters To receive hardware performance counter data, set this parameter to a bitmask that identifies the hardware counters to collect.\n * @param PerformanceDataHandle An opaque handle that you use when calling the RtlReadThreadProfilingData and RtlDisableThreadProfiling functions.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-enablethreadprofiling\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlEnableThreadProfiling(\n    _In_ HANDLE ThreadHandle,\n    _In_ ULONG Flags,\n    _In_ ULONG64 HardwareCounters,\n    _Out_ PVOID *PerformanceDataHandle\n    );\n\n// rev\n/**\n * Disables thread profiling.\n *\n * @param PerformanceDataHandle The handle that the RtlEnableThreadProfiling function returned.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-querythreadprofiling\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDisableThreadProfiling(\n    _In_ PVOID PerformanceDataHandle\n    );\n\n// rev\n/**\n * Determines whether thread profiling is enabled for the specified thread.\n *\n * @param ThreadHandle The handle to the thread on which you want to enable profiling. This must be the current thread.\n * @param Enabled Is TRUE if thread profiling is enabled for the specified thread; otherwise, FALSE.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-querythreadprofiling\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryThreadProfiling(\n    _In_ HANDLE ThreadHandle,\n    _Out_ PBOOLEAN Enabled\n    );\n\n// rev\n/**\n * Reads the specified profiling data associated with the thread.\n *\n * @param PerformanceDataHandle The handle that the RtlEnableThreadProfiling function returned.\n * @param Flags One or more flags set when you called the RtlEnableThreadProfiling function that specify the counter data to read.\n * @param PerformanceData A PERFORMANCE_DATA structure that contains the thread profiling and hardware counter data.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readthreadprofilingdata\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlReadThreadProfilingData(\n    _In_ HANDLE PerformanceDataHandle,\n    _In_ ULONG Flags,\n    _Out_ PPERFORMANCE_DATA PerformanceData\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n//\n// WOW64\n//\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetNativeSystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_ PVOID NativeSystemInformation,\n    _In_ ULONG InformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nNtWow64GetNativeSystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_ PVOID NativeSystemInformation,\n    _In_ ULONG InformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueueApcWow64Thread(\n    _In_ HANDLE ThreadHandle,\n    _In_ PPS_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\n/**\n * Enables or disables file system redirection for the calling thread.\n *\n * @param Wow64FsEnableRedirection If TRUE, requests redirection be enabled; if FALSE, requests redirection be disabled.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/wow64apiset/nf-wow64apiset-wow64enablewow64fsredirection\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64EnableFsRedirection(\n    _In_ BOOLEAN Wow64FsEnableRedirection\n    );\n\n/**\n * Enables or disables file system redirection for the calling thread.\n *\n * @param Wow64FsEnableRedirection If TRUE, requests redirection be enabled; if FALSE, requests redirection be disabled.\n * @param OldFsRedirectionLevel The WOW64 file system redirection value. The system uses this parameter to store information necessary to revert (re-enable) file system redirection.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/wow64apiset/nf-wow64apiset-wow64disablewow64fsredirection\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64EnableFsRedirectionEx(\n    _In_ PVOID Wow64FsEnableRedirection,\n    _Out_ PVOID *OldFsRedirectionLevel\n    );\n\n//\n// Misc.\n//\n\nNTSYSAPI\nULONG32\nNTAPI\nRtlComputeCrc32(\n    _In_ ULONG32 PartialCrc,\n    _In_ PVOID Buffer,\n    _In_ ULONG Length\n    );\n\n/**\n * Encodes the specified pointer. Encoded pointers can be used to provide another layer of protection for pointer values.\n *\n * @param Ptr The system pointer to be encoded.\n * @return The function returns the encoded pointer.\n * @sa https://learn.microsoft.com/en-us/previous-versions/bb432254(v=vs.85)\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlEncodePointer(\n    _In_ PVOID Ptr\n    );\n\n/**\n * Decodes a pointer that was previously encoded with RtlEncodePointer.\n *\n * @param Ptr The system pointer to be decoded.\n * @return The function returns the decoded pointer.\n * @sa https://learn.microsoft.com/en-us/previous-versions/bb432242(v=vs.85)\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlDecodePointer(\n    _In_ PVOID Ptr\n    );\n\n/**\n * Encodes the specified pointer with a system-specific value. Encoded pointers can be used to provide another layer of protection for pointer values.\n *\n * @param Ptr The system pointer to be encoded.\n * @return The function returns the encoded pointer.\n * @sa https://learn.microsoft.com/en-us/previous-versions/bb432255(v=vs.85)\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlEncodeSystemPointer(\n    _In_ PVOID Ptr\n    );\n\n/**\n * Decodes a pointer that was previously encoded with RtlEncodeSystemPointer.\n *\n * @param Ptr The pointer to be decoded.\n * @return The function returns the decoded pointer.\n * @sa https://learn.microsoft.com/en-us/previous-versions/bb432243(v=vs.85)\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlDecodeSystemPointer(\n    _In_ PVOID Ptr\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\n/**\n * Encodes the specified pointer of the specified process. Encoded pointers can be used to provide another layer of protection for pointer values.\n *\n * @param ProcessHandle Handle to the remote process that owns the pointer.\n * @param Pointer The pointer to be encoded.\n * @param EncodedPointer The encoded pointer.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/previous-versions/dn877135(v=vs.85)\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlEncodeRemotePointer(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID Pointer,\n    _Out_ PVOID *EncodedPointer\n    );\n\n// rev\n/**\n * Decodes a pointer in a specified process that was previously encoded with RtlEncodePointer or RtlEncodeRemotePointer.\n *\n * @param ProcessHandle Handle to the remote process that owns the pointer.\n * @param Pointer The pointer to be decoded.\n * @param EncodedPointer The decoded pointer.\n * @return NTSTATUS Successful or errant status.\n * @sa https://learn.microsoft.com/en-us/previous-versions/dn877133(v=vs.85)\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDecodeRemotePointer(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID Pointer,\n    _Out_ PVOID *DecodedPointer\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\n/**\n * Determines whether the specified processor feature is supported by the current computer.\n *\n * @param ProcessorFeature The processor feature to be tested.\n * @return If the feature is supported, the return value is a nonzero value.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent\n */\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsProcessorFeaturePresent(\n    _In_ ULONG ProcessorFeature\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n// rev\n/**\n * Retrieves the number of the processor the current thread was running on during the call to this function.\n *\n * @return The function returns the current processor number.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocessornumber\n */\nNTSYSAPI\nULONG\nNTAPI\nRtlGetCurrentProcessorNumber(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\n/**\n * Retrieves the processor group and number of the logical processor in which the calling thread is running.\n *\n * @param ProcessorNumber A pointer to a PROCESSOR_NUMBER structure that receives the processor group and number of the logical processor the calling thread is running.\n * @return This function does not return a value.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocessornumberex\n */\nNTSYSAPI\nVOID\nNTAPI\nRtlGetCurrentProcessorNumberEx(\n    _Out_ PPROCESSOR_NUMBER ProcessorNumber\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n//\n// Stack support\n//\n\nNTSYSAPI\nVOID\nNTAPI\nRtlPushFrame(\n    _In_ PTEB_ACTIVE_FRAME Frame\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlPopFrame(\n    _In_ PTEB_ACTIVE_FRAME Frame\n    );\n\nNTSYSAPI\nPTEB_ACTIVE_FRAME\nNTAPI\nRtlGetFrame(\n    VOID\n    );\n\n#define RTL_WALK_USER_MODE_STACK 0x00000001\n#define RTL_WALK_VALID_FLAGS 0x00000001\n#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 0x00000008\n\n// private\nNTSYSAPI\nULONG\nNTAPI\nRtlWalkFrameChain(\n    _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) PVOID *Callers,\n    _In_ ULONG Count,\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlGetCallersAddress( // Use the intrinsic _ReturnAddress instead.\n    _Out_ PVOID *CallersAddress,\n    _Out_ PVOID *CallersCaller\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n/**\n * The RtlGetEnabledExtendedFeatures routine returns a mask of extended processor features that are enabled by the system.\n *\n * @param FeatureMask A 64-bit feature mask. This parameter indicates a set of extended processor features for which the caller requests information about whether the features are enabled.\n * @return A 64-bitmask of enabled extended processor features. The routine calculates this mask as the intersection (bitwise AND) between all enabled features and the value of the FeatureMask parameter.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/nf-ntddk-rtlgetenabledextendedfeatures\n */\nNTSYSAPI\nULONG64\nNTAPI\nRtlGetEnabledExtendedFeatures(\n    _In_ ULONG64 FeatureMask\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\n\n// msdn\nNTSYSAPI\nULONG64\nNTAPI\nRtlGetEnabledExtendedAndSupervisorFeatures(\n    _In_ ULONG64 FeatureMask\n    );\n\n// msdn\n_Ret_maybenull_\n_Success_(return != NULL)\nNTSYSAPI\nPVOID\nNTAPI\nRtlLocateSupervisorFeature(\n    _In_ PXSAVE_AREA_HEADER XStateHeader,\n    _In_range_(XSTATE_AVX, MAXIMUM_XSTATE_FEATURES - 1) ULONG FeatureId,\n    _Out_opt_ PULONG Length\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\n#define ELEVATION_FLAG_TOKEN_CHECKS 0x00000001\n#define ELEVATION_FLAG_VIRTUALIZATION 0x00000002\n#define ELEVATION_FLAG_SHORTCUT_REDIR 0x00000004\n#define ELEVATION_FLAG_NO_SIGNATURE_CHECK 0x00000008\n\n// private\ntypedef union _RTL_ELEVATION_FLAGS\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG ElevationEnabled : 1;\n        ULONG VirtualizationEnabled : 1;\n        ULONG InstallerDetectEnabled : 1;\n        ULONG AdminApprovalModeType : 2;\n        ULONG ReservedBits : 27;\n    };\n} RTL_ELEVATION_FLAGS, *PRTL_ELEVATION_FLAGS;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryElevationFlags(\n    _Out_ PRTL_ELEVATION_FLAGS Flags\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRegisterThreadWithCsrss(\n    VOID\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLockCurrentThread(\n    VOID\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnlockCurrentThread(\n    VOID\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLockModuleSection(\n    _In_ PVOID Address\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnlockModuleSection(\n    _In_ PVOID Address\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n// begin_msdn:\"Winternl\"\n\n#define RTL_UNLOAD_EVENT_TRACE_NUMBER 64\n\n// private\ntypedef struct _RTL_UNLOAD_EVENT_TRACE\n{\n    PVOID BaseAddress;\n    SIZE_T SizeOfImage;\n    ULONG Sequence;\n    ULONG TimeDateStamp;\n    ULONG CheckSum;\n    WCHAR ImageName[32];\n    ULONG Version[2];\n} RTL_UNLOAD_EVENT_TRACE, *PRTL_UNLOAD_EVENT_TRACE;\n\ntypedef struct _RTL_UNLOAD_EVENT_TRACE32\n{\n    ULONG BaseAddress;\n    ULONG SizeOfImage;\n    ULONG Sequence;\n    ULONG TimeDateStamp;\n    ULONG CheckSum;\n    WCHAR ImageName[32];\n    ULONG Version[2];\n} RTL_UNLOAD_EVENT_TRACE32, *PRTL_UNLOAD_EVENT_TRACE32;\n\nNTSYSAPI\nPRTL_UNLOAD_EVENT_TRACE\nNTAPI\nRtlGetUnloadEventTrace(\n    VOID\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSAPI\nPRTL_UNLOAD_EVENT_TRACE\nNTAPI\nRtlGetUnloadEventTraceEx(\n    _Out_ PULONG *ElementSize,\n    _Out_ PULONG *ElementCount,\n    _Out_ PVOID *EventTrace // works across all processes\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n/**\n * The RtlCaptureStackBackTrace routine captures a stack trace by walking the stack and recording the information for each frame.\n *\n * @param FramesToSkip Number of frames to skip from the start (current call point) of the back trace.\n * @param FramesToCapture Number of frames to be captured.\n * @param BackTrace Caller-allocated array in which pointers to the return addresses captured from the current stack trace are returned.\n * @param BackTraceHash Optional value that can be used to organize hash tables. This hash value is calculated based on the values of the pointers returned in the BackTrace array. Two identical stack traces will generate identical hash values.\n * @return The number of captured frames.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlcapturestackbacktrace\n */\n_Success_(return != 0)\nNTSYSAPI\nUSHORT\nNTAPI\nRtlCaptureStackBackTrace(\n    _In_ ULONG FramesToSkip,\n    _In_ ULONG FramesToCapture,\n    _Out_writes_to_(FramesToCapture,return) PVOID* BackTrace,\n    _Out_opt_ PULONG BackTraceHash\n    );\n\n/**\n * The RtlCaptureContext function retrieves a context record in the context of the caller.\n *\n * @param ContextRecord A pointer to a CONTEXT structure.\n * @return This function does not return a value.\n * @sa https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlcapturecontext\n */\nNTSYSAPI\nVOID\nNTAPI\nRtlCaptureContext(\n    _Out_ PCONTEXT ContextRecord\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\nNTSYSAPI\nVOID\nNTAPI\nRtlCaptureContext2(\n    _Inout_ PCONTEXT ContextRecord\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\nNTSYSAPI\nVOID\n__cdecl\nRtlRestoreContext(\n    _In_ PCONTEXT ContextRecord,\n    _In_opt_ struct _EXCEPTION_RECORD* ExceptionRecord\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n\nNTSYSAPI\nVOID\nNTAPI\nRtlUnwind(\n    _In_opt_ PVOID TargetFrame,\n    _In_opt_ PVOID TargetIp,\n    _In_opt_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PVOID ReturnValue\n    );\n\n#if defined(_M_AMD64) && defined(_M_ARM64EC)\nNTSYSAPI\nBOOLEAN\n__cdecl\nRtlAddFunctionTable(\n    _In_reads_(EntryCount) PRUNTIME_FUNCTION FunctionTable,\n    _In_ DWORD EntryCount,\n    _In_ DWORD64 BaseAddress\n    );\n\nNTSYSAPI\nBOOLEAN\n__cdecl\nRtlDeleteFunctionTable(\n    _In_ PRUNTIME_FUNCTION FunctionTable\n    );\n\nNTSYSAPI\nBOOLEAN\n__cdecl\nRtlInstallFunctionTableCallback(\n    _In_ DWORD64 TableIdentifier,\n    _In_ DWORD64 BaseAddress,\n    _In_ DWORD Length,\n    _In_ PGET_RUNTIME_FUNCTION_CALLBACK Callback,\n    _In_opt_ PVOID Context,\n    _In_opt_ PCWSTR OutOfProcessCallbackDll\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nDWORD\nNTAPI\nRtlAddGrowableFunctionTable(\n    _Out_ PVOID* DynamicTable,\n    _In_reads_(MaximumEntryCount) PRUNTIME_FUNCTION FunctionTable,\n    _In_ DWORD EntryCount,\n    _In_ DWORD MaximumEntryCount,\n    _In_ ULONG_PTR RangeBase,\n    _In_ ULONG_PTR RangeEnd\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlGrowFunctionTable(\n    _Inout_ PVOID DynamicTable,\n    _In_ DWORD NewEntryCount\n    );\n\nNTSYSAPI\nVOID\nNTAPI\nRtlDeleteGrowableFunctionTable(\n    _In_ PVOID DynamicTable\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n#endif // _M_AMD64 && _M_ARM64EC\n\n#if defined(_M_ARM64EC)\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsEcCode(\n    _In_ ULONG64 CodePointer\n    );\n#endif // _M_ARM64EC\n\n/**\n * Retrieves the base address of the image that contains the specified PC value.\n *\n * @param PcValue The PC value. The function searches all modules mapped into the address space of the calling process for a module that contains this value.\n * @param BaseOfImage The base address of the image containing the PC value. This value must be added to any relative addresses in the headers to locate the image.\n * @return If the PC value is found, returns the base address of the image that contains the PC value. If no image contains the PC value, the function returns NULL.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-rtlpctofileheader\n */\nNTSYSAPI\nPVOID\nNTAPI\nRtlPcToFileHeader(\n    _In_ PVOID PcValue,\n    _Out_ PVOID* BaseOfImage\n    );\n\n// end_msdn\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n// rev\n/**\n * Retrieves the current value of the performance counter, which is a high resolution (<1us) time stamp that can be used for time-interval measurements.\n *\n * @param PerformanceCounter A pointer to a variable that receives the current performance-counter value, in counts.\n * @return Returns TRUE if the function succeeds, otherwise FALSE. On systems that run Windows XP or later, the function will always succeed and will thus never return zero.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter\n */\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlQueryPerformanceCounter(\n    _Out_ PLARGE_INTEGER PerformanceCounter\n    );\n\n// rev\n/**\n * Retrieves the frequency of the performance counter. The frequency of the performance counter is fixed at system boot and is consistent across all processors.\n * Therefore, the frequency need only be queried upon application initialization, and the result can be cached.\n *\n * @param PerformanceFrequency A pointer to a variable that receives the current performance-counter frequency, in counts per second. \n * @return Returns TRUE if the function succeeds, otherwise FALSE. On systems that run Windows XP or later, the function will always succeed and will thus never return zero.\n * @sa https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency\n */\nNTSYSAPI\nLOGICAL\nNTAPI\nRtlQueryPerformanceFrequency(\n    _Out_ PLARGE_INTEGER PerformanceFrequency\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_7\n\n//\n// Image Mitigation\n//\n\n// rev\ntypedef enum _IMAGE_MITIGATION_POLICY\n{\n    ImageDepPolicy, // RTL_IMAGE_MITIGATION_DEP_POLICY\n    ImageAslrPolicy, // RTL_IMAGE_MITIGATION_ASLR_POLICY\n    ImageDynamicCodePolicy, // RTL_IMAGE_MITIGATION_DYNAMIC_CODE_POLICY\n    ImageStrictHandleCheckPolicy, // RTL_IMAGE_MITIGATION_STRICT_HANDLE_CHECK_POLICY\n    ImageSystemCallDisablePolicy, // RTL_IMAGE_MITIGATION_SYSTEM_CALL_DISABLE_POLICY\n    ImageMitigationOptionsMask,\n    ImageExtensionPointDisablePolicy, // RTL_IMAGE_MITIGATION_EXTENSION_POINT_DISABLE_POLICY\n    ImageControlFlowGuardPolicy, // RTL_IMAGE_MITIGATION_CONTROL_FLOW_GUARD_POLICY\n    ImageSignaturePolicy, // RTL_IMAGE_MITIGATION_BINARY_SIGNATURE_POLICY\n    ImageFontDisablePolicy, // RTL_IMAGE_MITIGATION_FONT_DISABLE_POLICY\n    ImageImageLoadPolicy, // RTL_IMAGE_MITIGATION_IMAGE_LOAD_POLICY\n    ImagePayloadRestrictionPolicy, // RTL_IMAGE_MITIGATION_PAYLOAD_RESTRICTION_POLICY\n    ImageChildProcessPolicy, // RTL_IMAGE_MITIGATION_CHILD_PROCESS_POLICY\n    ImageSehopPolicy, // RTL_IMAGE_MITIGATION_SEHOP_POLICY\n    ImageHeapPolicy, // RTL_IMAGE_MITIGATION_HEAP_POLICY\n    ImageUserShadowStackPolicy, // RTL_IMAGE_MITIGATION_USER_SHADOW_STACK_POLICY\n    ImageRedirectionTrustPolicy, // RTL_IMAGE_MITIGATION_REDIRECTION_TRUST_POLICY\n    ImageUserPointerAuthPolicy, // RTL_IMAGE_MITIGATION_USER_POINTER_AUTH_POLICY\n    MaxImageMitigationPolicy\n} IMAGE_MITIGATION_POLICY;\n\n// rev\ntypedef union _RTL_IMAGE_MITIGATION_POLICY\n{\n    struct\n    {\n        ULONG64 AuditState : 2;\n        ULONG64 AuditFlag : 1;\n        ULONG64 EnableAdditionalAuditingOption : 1;\n        ULONG64 Reserved : 60;\n    };\n    struct\n    {\n        ULONG64 PolicyState : 2;\n        ULONG64 AlwaysInherit : 1;\n        ULONG64 EnableAdditionalPolicyOption : 1;\n        ULONG64 AuditReserved : 60;\n    };\n} RTL_IMAGE_MITIGATION_POLICY, *PRTL_IMAGE_MITIGATION_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_DEP_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY Dep;\n} RTL_IMAGE_MITIGATION_DEP_POLICY, *PRTL_IMAGE_MITIGATION_DEP_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_ASLR_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY ForceRelocateImages;\n    RTL_IMAGE_MITIGATION_POLICY BottomUpRandomization;\n    RTL_IMAGE_MITIGATION_POLICY HighEntropyRandomization;\n} RTL_IMAGE_MITIGATION_ASLR_POLICY, *PRTL_IMAGE_MITIGATION_ASLR_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_DYNAMIC_CODE_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY BlockDynamicCode;\n} RTL_IMAGE_MITIGATION_DYNAMIC_CODE_POLICY, *PRTL_IMAGE_MITIGATION_DYNAMIC_CODE_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_STRICT_HANDLE_CHECK_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY StrictHandleChecks;\n} RTL_IMAGE_MITIGATION_STRICT_HANDLE_CHECK_POLICY, *PRTL_IMAGE_MITIGATION_STRICT_HANDLE_CHECK_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_SYSTEM_CALL_DISABLE_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY BlockWin32kSystemCalls;\n} RTL_IMAGE_MITIGATION_SYSTEM_CALL_DISABLE_POLICY, *PRTL_IMAGE_MITIGATION_SYSTEM_CALL_DISABLE_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_EXTENSION_POINT_DISABLE_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY DisableExtensionPoints;\n} RTL_IMAGE_MITIGATION_EXTENSION_POINT_DISABLE_POLICY, *PRTL_IMAGE_MITIGATION_EXTENSION_POINT_DISABLE_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_CONTROL_FLOW_GUARD_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY ControlFlowGuard;\n    RTL_IMAGE_MITIGATION_POLICY StrictControlFlowGuard;\n} RTL_IMAGE_MITIGATION_CONTROL_FLOW_GUARD_POLICY, *PRTL_IMAGE_MITIGATION_CONTROL_FLOW_GUARD_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_BINARY_SIGNATURE_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY BlockNonMicrosoftSignedBinaries;\n    RTL_IMAGE_MITIGATION_POLICY EnforceSigningOnModuleDependencies;\n} RTL_IMAGE_MITIGATION_BINARY_SIGNATURE_POLICY, *PRTL_IMAGE_MITIGATION_BINARY_SIGNATURE_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_FONT_DISABLE_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY DisableNonSystemFonts;\n} RTL_IMAGE_MITIGATION_FONT_DISABLE_POLICY, *PRTL_IMAGE_MITIGATION_FONT_DISABLE_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_IMAGE_LOAD_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY BlockRemoteImageLoads;\n    RTL_IMAGE_MITIGATION_POLICY BlockLowLabelImageLoads;\n    RTL_IMAGE_MITIGATION_POLICY PreferSystem32;\n} RTL_IMAGE_MITIGATION_IMAGE_LOAD_POLICY, *PRTL_IMAGE_MITIGATION_IMAGE_LOAD_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_PAYLOAD_RESTRICTION_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY EnableExportAddressFilter;\n    RTL_IMAGE_MITIGATION_POLICY EnableExportAddressFilterPlus;\n    RTL_IMAGE_MITIGATION_POLICY EnableImportAddressFilter;\n    RTL_IMAGE_MITIGATION_POLICY EnableRopStackPivot;\n    RTL_IMAGE_MITIGATION_POLICY EnableRopCallerCheck;\n    RTL_IMAGE_MITIGATION_POLICY EnableRopSimExec;\n    WCHAR EafPlusModuleList[512]; // 19H1\n} RTL_IMAGE_MITIGATION_PAYLOAD_RESTRICTION_POLICY, *PRTL_IMAGE_MITIGATION_PAYLOAD_RESTRICTION_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_CHILD_PROCESS_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY DisallowChildProcessCreation;\n} RTL_IMAGE_MITIGATION_CHILD_PROCESS_POLICY, *PRTL_IMAGE_MITIGATION_CHILD_PROCESS_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_SEHOP_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY Sehop;\n} RTL_IMAGE_MITIGATION_SEHOP_POLICY, *PRTL_IMAGE_MITIGATION_SEHOP_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_HEAP_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY TerminateOnHeapErrors;\n} RTL_IMAGE_MITIGATION_HEAP_POLICY, *PRTL_IMAGE_MITIGATION_HEAP_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_USER_SHADOW_STACK_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY UserShadowStack;\n    RTL_IMAGE_MITIGATION_POLICY SetContextIpValidation;\n    RTL_IMAGE_MITIGATION_POLICY BlockNonCetBinaries;\n} RTL_IMAGE_MITIGATION_USER_SHADOW_STACK_POLICY, *PRTL_IMAGE_MITIGATION_USER_SHADOW_STACK_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_REDIRECTION_TRUST_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY BlockUntrustedRedirections;\n} RTL_IMAGE_MITIGATION_REDIRECTION_TRUST_POLICY, *PRTL_IMAGE_MITIGATION_REDIRECTION_TRUST_POLICY;\n\n// rev\ntypedef struct _RTL_IMAGE_MITIGATION_USER_POINTER_AUTH_POLICY\n{\n    RTL_IMAGE_MITIGATION_POLICY PointerAuthUserIp;\n} RTL_IMAGE_MITIGATION_USER_POINTER_AUTH_POLICY, *PRTL_IMAGE_MITIGATION_USER_POINTER_AUTH_POLICY;\n\n// rev\ntypedef enum _RTL_IMAGE_MITIGATION_OPTION_STATE\n{\n    RtlMitigationOptionStateNotConfigured,\n    RtlMitigationOptionStateOn,\n    RtlMitigationOptionStateOff,\n    RtlMitigationOptionStateForce,\n    RtlMitigationOptionStateOption\n} RTL_IMAGE_MITIGATION_OPTION_STATE;\n\n#define RTL_IMAGE_MITIGATION_OPTION_STATEMASK 3UL\n#define RTL_IMAGE_MITIGATION_OPTION_FORCEMASK 4UL\n#define RTL_IMAGE_MITIGATION_OPTION_OPTIONMASK 8UL\n\n// rev from PROCESS_MITIGATION_FLAGS\n#define RTL_IMAGE_MITIGATION_FLAG_RESET 0x1\n#define RTL_IMAGE_MITIGATION_FLAG_REMOVE 0x2\n#define RTL_IMAGE_MITIGATION_FLAG_OSDEFAULT 0x4\n#define RTL_IMAGE_MITIGATION_FLAG_AUDIT 0x8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryImageMitigationPolicy(\n    _In_opt_ PCWSTR ImagePath, // NULL for system-wide defaults\n    _In_ IMAGE_MITIGATION_POLICY Policy,\n    _In_ ULONG Flags,\n    _Inout_ PVOID Buffer,\n    _In_ ULONG BufferSize\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetImageMitigationPolicy(\n    _In_opt_ PCWSTR ImagePath, // NULL for system-wide defaults\n    _In_ IMAGE_MITIGATION_POLICY Policy,\n    _In_ ULONG Flags,\n    _Inout_ PVOID Buffer,\n    _In_ ULONG BufferSize\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n//\n// session\n//\n\n#ifdef PHNT_INLINE_TYPEDEFS\n// rev\nFORCEINLINE\nULONG\nNTAPI\nRtlGetCurrentServiceSessionId(\n    VOID\n    )\n{\n    if (NtCurrentPeb()->SharedData && NtCurrentPeb()->SharedData->ServiceSessionId)\n        return NtCurrentPeb()->SharedData->ServiceSessionId;\n    else\n        return 0;\n}\n#else\n// rev\nNTSYSAPI\nULONG\nNTAPI\nRtlGetCurrentServiceSessionId(\n    VOID\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n\n#ifdef PHNT_INLINE_TYPEDEFS\n// rev\nFORCEINLINE\nULONG\nNTAPI\nRtlGetActiveConsoleId(\n    VOID\n    )\n{\n    if (NtCurrentPeb()->SharedData && NtCurrentPeb()->SharedData->ServiceSessionId)\n        return NtCurrentPeb()->SharedData->ActiveConsoleId;\n    else\n        return USER_SHARED_DATA->ActiveConsoleId;\n}\n#else\n// private\nNTSYSAPI\nULONG\nNTAPI\nRtlGetActiveConsoleId(\n    VOID\n    );\n#endif // PHNT_INLINE_TYPEDEFS\n\n#ifdef PHNT_INLINE_TYPEDEFS\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// private\nFORCEINLINE\nLONGLONG\nNTAPI\nRtlGetConsoleSessionForegroundProcessId(\n    VOID\n    )\n{\n    if (NtCurrentPeb()->SharedData && NtCurrentPeb()->SharedData->ServiceSessionId)\n        return NtCurrentPeb()->SharedData->ConsoleSessionForegroundProcessId;\n    else\n        return USER_SHARED_DATA->ConsoleSessionForegroundProcessId;\n}\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n#else\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// private\nNTSYSAPI\nLONGLONG\nNTAPI\nRtlGetConsoleSessionForegroundProcessId(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n#endif // PHNT_INLINE_TYPEDEFS\n\n//\n// Appcontainer\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetTokenNamedObjectPath(\n    _In_ HANDLE TokenHandle,\n    _In_opt_ PSID Sid,\n    _Out_ PUNICODE_STRING ObjectPath // RtlFreeUnicodeString\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS2\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetAppContainerNamedObjectPath(\n    _In_opt_ HANDLE TokenHandle,\n    _In_opt_ PSID AppContainerSid,\n    _In_ BOOLEAN RelativePath,\n    _Out_ PUNICODE_STRING ObjectPath // RtlFreeUnicodeString\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetAppContainerParent(\n    _In_ PSID AppContainerSid,\n    _Out_ PSID* AppContainerSidParent // RtlFreeSid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckSandboxedToken(\n    _In_opt_ HANDLE TokenHandle,\n    _Out_ PBOOLEAN IsSandboxed\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckTokenCapability(\n    _In_opt_ HANDLE TokenHandle,\n    _In_ PSID CapabilitySidToCheck,\n    _Out_ PBOOLEAN HasCapability\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCapabilityCheck(\n    _In_opt_ HANDLE TokenHandle,\n    _In_ PCUNICODE_STRING CapabilityName,\n    _Out_ PBOOLEAN HasCapability\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckTokenMembership(\n    _In_opt_ HANDLE TokenHandle,\n    _In_ PSID SidToCheck,\n    _Out_ PBOOLEAN IsMember\n    );\n\n// RtlCheckTokenMembershipEx Flags\n#define CTMF_INCLUDE_APPCONTAINER 0x00000001UL\n#define CTMF_INCLUDE_LPAC 0x00000002UL\n#define CTMF_VALID_FLAGS (CTMF_INCLUDE_APPCONTAINER | CTMF_INCLUDE_LPAC)\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckTokenMembershipEx(\n    _In_opt_ HANDLE TokenHandle,\n    _In_ PSID SidToCheck,\n    _In_ ULONG Flags, // CTMF_VALID_FLAGS\n    _Out_ PBOOLEAN IsMember\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryTokenHostIdAsUlong64(\n    _In_ HANDLE TokenHandle,\n    _Out_ PULONG64 HostId // (WIN://PKGHOSTID)\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsParentOfChildAppContainer(\n    _In_ PSID ParentAppContainerSid,\n    _In_ PSID ChildAppContainerSid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIsApiSetImplemented(\n    _In_z_ PCSTR ApiSetName\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsCapabilitySid(\n    _In_ PSID Sid\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsPackageSid(\n    _In_ PSID Sid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsValidProcessTrustLabelSid(\n    _In_ PSID Sid\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\ntypedef enum _APPCONTAINER_SID_TYPE\n{\n    NotAppContainerSidType,\n    ChildAppContainerSidType,\n    ParentAppContainerSidType,\n    InvalidAppContainerSidType,\n    MaxAppContainerSidType\n} APPCONTAINER_SID_TYPE, *PAPPCONTAINER_SID_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetAppContainerSidType(\n    _In_ PSID AppContainerSid,\n    _Out_ PAPPCONTAINER_SID_TYPE AppContainerSidType\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFlsAlloc(\n    _In_ PFLS_CALLBACK_FUNCTION Callback,\n    _Out_ PULONG FlsIndex\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFlsAllocEx(\n    _In_ PFLS_CALLBACK_FUNCTION Callback,\n    _Out_ PULONG,\n    _Out_ PULONG FlsIndex\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFlsFree(\n    _In_ ULONG FlsIndex\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFlsGetValue(\n    _In_ ULONG FlsIndex,\n    _Out_ PVOID* FlsData\n    );\n\nNTSYSAPI\nPVOID\nWINAPI\nRtlFlsGetValue2(\n    _In_ ULONG FlsIndex\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFlsSetValue(\n    _In_ ULONG FlsIndex,\n    _In_ PVOID FlsData\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlProcessFlsData(\n    _In_ HANDLE ProcessHandle,\n    _Out_ PVOID* FlsData\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlTlsAlloc(\n    _Out_ PULONG TlsIndex\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlTlsFree(\n    _In_ ULONG TlsIndex\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlTlsSetValue(\n    _In_ ULONG TlsIndex,\n    _In_ PVOID TlsData\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n//\n// State isolation\n//\n\ntypedef enum _STATE_LOCATION_TYPE\n{\n    LocationTypeRegistry,\n    LocationTypeFileSystem,\n    LocationTypeMaximum\n} STATE_LOCATION_TYPE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsStateSeparationEnabled(\n    VOID\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetPersistedStateLocation(\n    _In_ PCWSTR SourceID,\n    _In_opt_ PCWSTR CustomValue,\n    _In_opt_ PCWSTR DefaultPath,\n    _In_ STATE_LOCATION_TYPE StateLocationType,\n    _Out_writes_bytes_to_opt_(BufferLengthIn, *BufferLengthOut) PWCHAR TargetPath,\n    _In_ ULONG BufferLengthIn,\n    _Out_opt_ PULONG BufferLengthOut\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n//\n// Cloud Filters\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// msdn\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsCloudFilesPlaceholder(\n    _In_ ULONG FileAttributes,\n    _In_ ULONG ReparseTag\n    );\n\n// msdn\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsPartialPlaceholder(\n    _In_ ULONG FileAttributes,\n    _In_ ULONG ReparseTag\n    );\n\n// msdn\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIsPartialPlaceholderFileHandle(\n    _In_ HANDLE FileHandle,\n    _Out_ PBOOLEAN IsPartialPlaceholder\n    );\n\n// msdn\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlIsPartialPlaceholderFileInfo(\n    _In_ PVOID InfoBuffer,\n    _In_ FILE_INFORMATION_CLASS InfoClass,\n    _Out_ PBOOLEAN IsPartialPlaceholder\n    );\n\n#undef PHCM_MAX\n#define PHCM_APPLICATION_DEFAULT ((CHAR)0)\n#define PHCM_DISGUISE_PLACEHOLDERS ((CHAR)1)\n#define PHCM_EXPOSE_PLACEHOLDERS ((CHAR)2)\n#define PHCM_MAX ((CHAR)2)\n\n#define PHCM_ERROR_INVALID_PARAMETER ((CHAR)-1)\n#define PHCM_ERROR_NO_TEB ((CHAR)-2)\n\nNTSYSAPI\nCHAR\nNTAPI\nRtlQueryThreadPlaceholderCompatibilityMode(\n    VOID\n    );\n\nNTSYSAPI\nCHAR\nNTAPI\nRtlSetThreadPlaceholderCompatibilityMode(\n    _In_ CHAR Mode\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n#undef PHCM_MAX\n#define PHCM_DISGUISE_FULL_PLACEHOLDERS ((CHAR)3)\n#define PHCM_MAX ((CHAR)3)\n#define PHCM_ERROR_NO_PEB ((CHAR)-3)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS4)\n\nNTSYSAPI\nCHAR\nNTAPI\nRtlQueryProcessPlaceholderCompatibilityMode(\n    VOID\n    );\n\nNTSYSAPI\nCHAR\nNTAPI\nRtlSetProcessPlaceholderCompatibilityMode(\n    _In_ CHAR Mode\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS4\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsNonEmptyDirectoryReparsePointAllowed(\n    _In_ ULONG ReparseTag\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS2\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlAppxIsFileOwnedByTrustedInstaller(\n    _In_ HANDLE FileHandle,\n    _Out_ PBOOLEAN IsFileOwnedByTrustedInstaller\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n// Windows Internals book\n#define PSM_ACTIVATION_TOKEN_PACKAGED_APPLICATION       0x00000001UL // AppX package format\n#define PSM_ACTIVATION_TOKEN_SHARED_ENTITY              0x00000002UL // Shared token, multiple binaries in the same package\n#define PSM_ACTIVATION_TOKEN_FULL_TRUST                 0x00000004UL // Trusted (Centennial), converted Win32 application\n#define PSM_ACTIVATION_TOKEN_NATIVE_SERVICE             0x00000008UL // Packaged service created by SCM\n//#define PSM_ACTIVATION_TOKEN_DEVELOPMENT_APP          0x00000010UL\n#define PSM_ACTIVATION_TOKEN_MULTIPLE_INSTANCES_ALLOWED 0x00000010UL\n#define PSM_ACTIVATION_TOKEN_BREAKAWAY_INHIBITED        0x00000020UL // Cannot create non-packaged child processes\n#define PSM_ACTIVATION_TOKEN_RUNTIME_BROKER             0x00000040UL // rev\n#define PSM_ACTIVATION_TOKEN_UNIVERSAL_CONSOLE          0x00000200UL // rev\n#define PSM_ACTIVATION_TOKEN_WIN32ALACARTE_PROCESS      0x00010000UL // rev\n\n// PackageOrigin appmodel.h\n//#define PackageOrigin_Unknown           0\n//#define PackageOrigin_Unsigned          1\n//#define PackageOrigin_Inbox             2\n//#define PackageOrigin_Store             3\n//#define PackageOrigin_DeveloperUnsigned 4\n//#define PackageOrigin_DeveloperSigned   5\n//#define PackageOrigin_LineOfBusiness    6\n\n#define PSMP_MINIMUM_SYSAPP_CLAIM_VALUES 2\n#define PSMP_MAXIMUM_SYSAPP_CLAIM_VALUES 4\n\n// private\ntypedef struct _PS_PKG_CLAIM\n{\n    ULONG Flags;  // PSM_ACTIVATION_TOKEN_*\n    ULONG Origin; // PackageOrigin\n} PS_PKG_CLAIM, *PPS_PKG_CLAIM;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryPackageClaims(\n    _In_ HANDLE TokenHandle,\n    _Out_writes_bytes_to_opt_(*PackageSize, *PackageSize) PWSTR PackageFullName,\n    _Inout_opt_ PSIZE_T PackageSize,\n    _Out_writes_bytes_to_opt_(*AppIdSize, *AppIdSize) PWSTR AppId,\n    _Inout_opt_ PSIZE_T AppIdSize,\n    _Out_opt_ PGUID DynamicId,\n    _Out_opt_ PPS_PKG_CLAIM PkgClaim,\n    _Out_opt_ PULONG64 AttributesPresent\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryPackageIdentity(\n    _In_ HANDLE TokenHandle,\n    _Out_writes_bytes_to_(*PackageSize, *PackageSize) PWSTR PackageFullName,\n    _Inout_ PSIZE_T PackageSize,\n    _Out_writes_bytes_to_opt_(*AppIdSize, *AppIdSize) PWSTR AppId,\n    _Inout_opt_ PSIZE_T AppIdSize,\n    _Out_opt_ PBOOLEAN Packaged\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryPackageIdentityEx(\n    _In_ HANDLE TokenHandle,\n    _Out_writes_bytes_to_(*PackageSize, *PackageSize) PWSTR PackageFullName,\n    _Inout_ PSIZE_T PackageSize,\n    _Out_writes_bytes_to_opt_(*AppIdSize, *AppIdSize) PWSTR AppId,\n    _Inout_opt_ PSIZE_T AppIdSize,\n    _Out_opt_ PGUID DynamicId,\n    _Out_opt_ PULONG64 Flags\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n//\n// Protected policies\n//\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8_1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryProtectedPolicy(\n    _In_ PGUID PolicyGuid,\n    _Out_ PULONG_PTR PolicyValue\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetProtectedPolicy(\n    _In_ PGUID PolicyGuid,\n    _In_ ULONG_PTR PolicyValue,\n    _Out_ PULONG_PTR OldPolicyValue\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8_1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsEnclaveFeaturePresent(\n    _In_ ULONG FeatureMask\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsMultiSessionSku(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// private\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlIsMultiUsersInSessionSku(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSessionProperties(\n    _In_ ULONG SessionId,\n    _Out_ PULONG SharedUserSessionId\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n// private\ntypedef enum _RTL_BSD_ITEM_TYPE\n{\n    RtlBsdItemVersionNumber, // q; s: ULONG\n    RtlBsdItemProductType, // q; s: NT_PRODUCT_TYPE (ULONG)\n    RtlBsdItemAabEnabled, // q: s: BOOLEAN // AutoAdvancedBoot\n    RtlBsdItemAabTimeout, // q: s: UCHAR // AdvancedBootMenuTimeout\n    RtlBsdItemBootGood, // q: s: BOOLEAN // LastBootSucceeded\n    RtlBsdItemBootShutdown, // q: s: BOOLEAN // LastBootShutdown\n    RtlBsdSleepInProgress, // q: s: BOOLEAN // SleepInProgress\n    RtlBsdPowerTransition, // q: s: RTL_BSD_DATA_POWER_TRANSITION\n    RtlBsdItemBootAttemptCount, // q: s: UCHAR // BootAttemptCount\n    RtlBsdItemBootCheckpoint, // q: s: UCHAR // LastBootCheckpoint\n    RtlBsdItemBootId, // q; s: ULONG (USER_SHARED_DATA->BootId)\n    RtlBsdItemShutdownBootId, // q; s: ULONG\n    RtlBsdItemReportedAbnormalShutdownBootId, // q; s: ULONG\n    RtlBsdItemErrorInfo, // RTL_BSD_DATA_ERROR_INFO\n    RtlBsdItemPowerButtonPressInfo, // RTL_BSD_POWER_BUTTON_PRESS_INFO\n    RtlBsdItemChecksum, // q: s: UCHAR\n    RtlBsdPowerTransitionExtension,\n    RtlBsdItemFeatureConfigurationState, // q; s: ULONG\n    RtlBsdItemRevocationListInfo, // 24H2\n    RtlBsdItemMax\n} RTL_BSD_ITEM_TYPE;\n\n// ros\ntypedef struct _RTL_BSD_DATA_POWER_TRANSITION\n{\n    LARGE_INTEGER PowerButtonTimestamp;\n    struct\n    {\n        BOOLEAN SystemRunning : 1;\n        BOOLEAN ConnectedStandbyInProgress : 1;\n        BOOLEAN UserShutdownInProgress : 1;\n        BOOLEAN SystemShutdownInProgress : 1;\n        BOOLEAN SleepInProgress : 4;\n    } Flags;\n    UCHAR ConnectedStandbyScenarioInstanceId;\n    UCHAR ConnectedStandbyEntryReason;\n    UCHAR ConnectedStandbyExitReason;\n    USHORT SystemSleepTransitionCount;\n    LARGE_INTEGER LastReferenceTime;\n    ULONG LastReferenceTimeChecksum;\n    ULONG LastUpdateBootId;\n} RTL_BSD_DATA_POWER_TRANSITION, *PRTL_BSD_DATA_POWER_TRANSITION;\n\n// ros\ntypedef struct _RTL_BSD_DATA_ERROR_INFO\n{\n    ULONG BootId;\n    ULONG RepeatCount;\n    ULONG OtherErrorCount;\n    ULONG Code;\n    ULONG OtherErrorCount2;\n} RTL_BSD_DATA_ERROR_INFO, *PRTL_BSD_DATA_ERROR_INFO;\n\n// ros\ntypedef struct _RTL_BSD_POWER_BUTTON_PRESS_INFO\n{\n    LARGE_INTEGER LastPressTime;\n    ULONG CumulativePressCount;\n    USHORT LastPressBootId;\n    UCHAR LastPowerWatchdogStage;\n    struct\n    {\n        UCHAR WatchdogArmed : 1;\n        UCHAR ShutdownInProgress : 1;\n    } Flags;\n    LARGE_INTEGER LastReleaseTime;\n    ULONG CumulativeReleaseCount;\n    USHORT LastReleaseBootId;\n    USHORT ErrorCount;\n    UCHAR CurrentConnectedStandbyPhase;\n    ULONG TransitionLatestCheckpointId;\n    ULONG TransitionLatestCheckpointType;\n    ULONG TransitionLatestCheckpointSequenceNumber;\n} RTL_BSD_POWER_BUTTON_PRESS_INFO, *PRTL_BSD_POWER_BUTTON_PRESS_INFO;\n\n// private\ntypedef struct _RTL_BSD_ITEM\n{\n    RTL_BSD_ITEM_TYPE Type;\n    PVOID DataBuffer;\n    ULONG DataLength;\n} RTL_BSD_ITEM, *PRTL_BSD_ITEM;\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCreateBootStatusDataFile(\n    VOID\n    );\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlLockBootStatusData(\n    _Out_ PHANDLE FileHandle\n    );\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnlockBootStatusData(\n    _In_ HANDLE FileHandle\n    );\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSetBootStatusData(\n    _In_ HANDLE FileHandle,\n    _In_ BOOLEAN Read,\n    _In_ RTL_BSD_ITEM_TYPE DataClass,\n    _In_ PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckBootStatusIntegrity(\n    _In_ HANDLE FileHandle,\n    _Out_ PBOOLEAN Verified\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRestoreBootStatusDefaults(\n    _In_ HANDLE FileHandle\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRestoreSystemBootStatusDefaults(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlGetSystemBootStatus(\n    _In_ RTL_BSD_ITEM_TYPE BootStatusInformationClass,\n    _Out_ PVOID DataBuffer,\n    _In_ ULONG DataLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetSystemBootStatus(\n    _In_ RTL_BSD_ITEM_TYPE BootStatusInformationClass,\n    _In_ PVOID DataBuffer,\n    _In_ ULONG DataLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS3\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCheckPortableOperatingSystem(\n    _Out_ PBOOLEAN IsPortable // VOID\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetPortableOperatingSystem(\n    _In_ BOOLEAN IsPortable\n    );\n\n// rev\nNTSYSAPI\nULONG\nNTAPI\nRtlSetProxiedProcessId(\n    _In_ ULONG ProxiedProcessId\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_8\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlFindClosestEncodableLength(\n    _In_ ULONGLONG SourceLength,\n    _Out_ PULONGLONG TargetLength\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n//\n// Memory cache\n//\n\n_Function_class_(RTL_SECURE_MEMORY_CACHE_CALLBACK)\ntypedef NTSTATUS (NTAPI RTL_SECURE_MEMORY_CACHE_CALLBACK)(\n    _In_ PVOID Address,\n    _In_ SIZE_T Length\n    );\ntypedef RTL_SECURE_MEMORY_CACHE_CALLBACK *PRTL_SECURE_MEMORY_CACHE_CALLBACK;\n\n// ros\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRegisterSecureMemoryCacheCallback(\n    _In_ PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlDeregisterSecureMemoryCacheCallback(\n    _In_ PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback\n    );\n\n// ros\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlFlushSecureMemoryCache(\n    _In_ PVOID MemoryCache,\n    _In_opt_ SIZE_T MemoryLength\n    );\n\n// Feature configuration\n\n// private\ntypedef ULONG RTL_FEATURE_ID;\ntypedef ULONGLONG RTL_FEATURE_CHANGE_STAMP, *PRTL_FEATURE_CHANGE_STAMP;\ntypedef UCHAR RTL_FEATURE_VARIANT;\ntypedef ULONG RTL_FEATURE_VARIANT_PAYLOAD;\ntypedef PVOID RTL_FEATURE_CONFIGURATION_CHANGE_REGISTRATION, *PRTL_FEATURE_CONFIGURATION_CHANGE_REGISTRATION;\n\n// private\ntypedef struct _RTL_FEATURE_USAGE_REPORT\n{\n    ULONG FeatureId;\n    USHORT ReportingKind;\n    USHORT ReportingOptions;\n} RTL_FEATURE_USAGE_REPORT, *PRTL_FEATURE_USAGE_REPORT;\n\n// private\ntypedef enum _RTL_FEATURE_CONFIGURATION_TYPE\n{\n    RtlFeatureConfigurationBoot,\n    RtlFeatureConfigurationRuntime,\n    RtlFeatureConfigurationCount\n} RTL_FEATURE_CONFIGURATION_TYPE;\n\n// private\ntypedef struct _RTL_FEATURE_CONFIGURATION\n{\n    RTL_FEATURE_ID FeatureId;\n    union\n    {\n        ULONG Flags;\n        struct\n        {\n            ULONG Priority : 4;\n            ULONG EnabledState : 2;\n            ULONG IsWexpConfiguration : 1;\n            ULONG HasSubscriptions : 1;\n            ULONG Variant : 6;\n            ULONG VariantPayloadKind : 2;\n            ULONG Reserved : 16;\n        };\n    };\n    RTL_FEATURE_VARIANT_PAYLOAD VariantPayload;\n} RTL_FEATURE_CONFIGURATION, *PRTL_FEATURE_CONFIGURATION;\n\n// private\ntypedef struct _RTL_FEATURE_CONFIGURATION_TABLE\n{\n    ULONG FeatureCount;\n    _Field_size_(FeatureCount) RTL_FEATURE_CONFIGURATION Features[ANYSIZE_ARRAY];\n} RTL_FEATURE_CONFIGURATION_TABLE, *PRTL_FEATURE_CONFIGURATION_TABLE;\n\n// private\ntypedef enum _RTL_FEATURE_CONFIGURATION_PRIORITY\n{\n    FeatureConfigurationPriorityImageDefault   = 0,\n    FeatureConfigurationPriorityEKB            = 1,\n    FeatureConfigurationPrioritySafeguard      = 2,\n    FeatureConfigurationPriorityPersistent     = FeatureConfigurationPrioritySafeguard,\n    FeatureConfigurationPriorityReserved3      = 3,\n    FeatureConfigurationPriorityService        = 4,\n    FeatureConfigurationPriorityReserved5      = 5,\n    FeatureConfigurationPriorityDynamic        = 6,\n    FeatureConfigurationPriorityReserved7      = 7,\n    FeatureConfigurationPriorityUser           = 8,\n    FeatureConfigurationPrioritySecurity       = 9,\n    FeatureConfigurationPriorityUserPolicy     = 10,\n    FeatureConfigurationPriorityReserved11     = 11,\n    FeatureConfigurationPriorityTest           = 12,\n    FeatureConfigurationPriorityReserved13     = 13,\n    FeatureConfigurationPriorityReserved14     = 14,\n    FeatureConfigurationPriorityImageOverride  = 15,\n    FeatureConfigurationPriorityMax            = FeatureConfigurationPriorityImageOverride\n} RTL_FEATURE_CONFIGURATION_PRIORITY, *PRTL_FEATURE_CONFIGURATION_PRIORITY;\n\n// private\ntypedef enum _RTL_FEATURE_ENABLED_STATE\n{\n    FeatureEnabledStateDefault,\n    FeatureEnabledStateDisabled,\n    FeatureEnabledStateEnabled\n} RTL_FEATURE_ENABLED_STATE;\n\n// private\ntypedef enum _RTL_FEATURE_ENABLED_STATE_OPTIONS\n{\n    FeatureEnabledStateOptionsNone,\n    FeatureEnabledStateOptionsWexpConfig\n} RTL_FEATURE_ENABLED_STATE_OPTIONS, *PRTL_FEATURE_ENABLED_STATE_OPTIONS;\n\n// private\ntypedef enum _RTL_FEATURE_VARIANT_PAYLOAD_KIND\n{\n    FeatureVariantPayloadKindNone,\n    FeatureVariantPayloadKindResident,\n    FeatureVariantPayloadKindExternal\n} RTL_FEATURE_VARIANT_PAYLOAD_KIND, *PRTL_FEATURE_VARIANT_PAYLOAD_KIND;\n\n// private\ntypedef enum _RTL_FEATURE_CONFIGURATION_OPERATION\n{\n    FeatureConfigurationOperationNone         = 0,\n    FeatureConfigurationOperationFeatureState = 1,\n    FeatureConfigurationOperationVariantState = 2,\n    FeatureConfigurationOperationResetState   = 4\n} RTL_FEATURE_CONFIGURATION_OPERATION, *PRTL_FEATURE_CONFIGURATION_OPERATION;\n\n// private\ntypedef struct _RTL_FEATURE_CONFIGURATION_UPDATE\n{\n    RTL_FEATURE_ID FeatureId;\n    RTL_FEATURE_CONFIGURATION_PRIORITY Priority;\n    RTL_FEATURE_ENABLED_STATE EnabledState;\n    RTL_FEATURE_ENABLED_STATE_OPTIONS EnabledStateOptions;\n    RTL_FEATURE_VARIANT Variant;\n    UCHAR Reserved[3];\n    RTL_FEATURE_VARIANT_PAYLOAD_KIND VariantPayloadKind;\n    RTL_FEATURE_VARIANT_PAYLOAD VariantPayload;\n    RTL_FEATURE_CONFIGURATION_OPERATION Operation;\n} RTL_FEATURE_CONFIGURATION_UPDATE, *PRTL_FEATURE_CONFIGURATION_UPDATE;\n\n// private\ntypedef struct _RTL_FEATURE_USAGE_SUBSCRIPTION_TARGET\n{\n    ULONG Data[2];\n} RTL_FEATURE_USAGE_SUBSCRIPTION_TARGET, *PRTL_FEATURE_USAGE_SUBSCRIPTION_TARGET;\n\n// private\ntypedef struct _RTL_FEATURE_USAGE_DATA\n{\n    RTL_FEATURE_ID FeatureId;\n    USHORT ReportingKind;\n    USHORT Reserved;\n} RTL_FEATURE_USAGE_DATA, *PRTL_FEATURE_USAGE_DATA;\n\n// private\ntypedef struct _RTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS\n{\n    RTL_FEATURE_ID FeatureId;\n    USHORT ReportingKind;\n    USHORT ReportingOptions;\n    RTL_FEATURE_USAGE_SUBSCRIPTION_TARGET ReportingTarget;\n} RTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS, *PRTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS;\n\n// private\ntypedef struct _RTL_FEATURE_USAGE_SUBSCRIPTION_TABLE\n{\n    ULONG SubscriptionCount;\n    _Field_size_(SubscriptionCount) RTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS Subscriptions[ANYSIZE_ARRAY];\n} RTL_FEATURE_USAGE_SUBSCRIPTION_TABLE, *PRTL_FEATURE_USAGE_SUBSCRIPTION_TABLE;\n\n// private\n_Function_class_(RTL_FEATURE_CONFIGURATION_CHANGE_CALLBACK)\ntypedef VOID (NTAPI RTL_FEATURE_CONFIGURATION_CHANGE_CALLBACK)(\n    _In_opt_ PVOID Context\n    );\ntypedef RTL_FEATURE_CONFIGURATION_CHANGE_CALLBACK *PRTL_FEATURE_CONFIGURATION_CHANGE_CALLBACK;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_QUERY\n{\n    RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType;\n    RTL_FEATURE_ID FeatureId;\n} SYSTEM_FEATURE_CONFIGURATION_QUERY, *PSYSTEM_FEATURE_CONFIGURATION_QUERY;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_INFORMATION\n{\n    RTL_FEATURE_CHANGE_STAMP ChangeStamp;\n    RTL_FEATURE_CONFIGURATION Configuration;\n} SYSTEM_FEATURE_CONFIGURATION_INFORMATION, *PSYSTEM_FEATURE_CONFIGURATION_INFORMATION;\n\n// private\ntypedef enum _SYSTEM_FEATURE_CONFIGURATION_UPDATE_TYPE\n{\n  SystemFeatureConfigurationUpdateTypeUpdate = 0,\n  SystemFeatureConfigurationUpdateTypeOverwrite = 1,\n  SystemFeatureConfigurationUpdateTypeCount = 2,\n} SYSTEM_FEATURE_CONFIGURATION_UPDATE_TYPE, *PSYSTEM_FEATURE_CONFIGURATION_UPDATE_TYPE;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_UPDATE\n{\n    SYSTEM_FEATURE_CONFIGURATION_UPDATE_TYPE UpdateType;\n    union\n    {\n        struct\n        {\n            RTL_FEATURE_CHANGE_STAMP PreviousChangeStamp;\n            RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType;\n            ULONG UpdateCount;\n            _Field_size_(UpdateCount) RTL_FEATURE_CONFIGURATION_UPDATE Updates[ANYSIZE_ARRAY];\n        } Update;\n\n        struct\n        {\n            RTL_FEATURE_CHANGE_STAMP PreviousChangeStamp;\n            RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType;\n            SIZE_T BufferSize;\n            PVOID Buffer;\n        } Overwrite;\n    };\n} SYSTEM_FEATURE_CONFIGURATION_UPDATE, *PSYSTEM_FEATURE_CONFIGURATION_UPDATE;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION_ENTRY\n{\n    RTL_FEATURE_CHANGE_STAMP ChangeStamp;\n    PVOID Section;\n    SIZE_T Size;\n} SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION_ENTRY, *PSYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION_ENTRY;\n\n// private\ntypedef enum _SYSTEM_FEATURE_CONFIGURATION_SECTION_TYPE\n{\n  SystemFeatureConfigurationSectionTypeBoot = 0,\n  SystemFeatureConfigurationSectionTypeRuntime = 1,\n  SystemFeatureConfigurationSectionTypeUsageTriggers = 2,\n  SystemFeatureConfigurationSectionTypeCount = 3,\n} SYSTEM_FEATURE_CONFIGURATION_SECTION_TYPE;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_SECTIONS_REQUEST\n{\n    RTL_FEATURE_CHANGE_STAMP PreviousChangeStamps[SystemFeatureConfigurationSectionTypeCount];\n} SYSTEM_FEATURE_CONFIGURATION_SECTIONS_REQUEST, *PSYSTEM_FEATURE_CONFIGURATION_SECTIONS_REQUEST;\n\n// private\ntypedef struct _SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION\n{\n    RTL_FEATURE_CHANGE_STAMP OverallChangeStamp;\n    SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION_ENTRY Descriptors[SystemFeatureConfigurationSectionTypeCount];\n} SYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION, *PSYSTEM_FEATURE_CONFIGURATION_SECTIONS_INFORMATION;\n\n// private\ntypedef struct _SYSTEM_FEATURE_USAGE_SUBSCRIPTION_DETAILS\n{\n    RTL_FEATURE_ID FeatureId;\n    USHORT ReportingKind;\n    USHORT ReportingOptions;\n    RTL_FEATURE_USAGE_SUBSCRIPTION_TARGET ReportingTarget;\n} SYSTEM_FEATURE_USAGE_SUBSCRIPTION_DETAILS, *PSYSTEM_FEATURE_USAGE_SUBSCRIPTION_DETAILS;\n\ntypedef struct _SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE_ENTRY\n{\n    ULONG Remove;\n    RTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS Details;\n} SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE_ENTRY, *PSYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE_ENTRY;\n\ntypedef struct _SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE\n{\n    ULONG UpdateCount;\n    _Field_size_(UpdateCount) SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE_ENTRY Updates[ANYSIZE_ARRAY];\n} SYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE, *PSYSTEM_FEATURE_USAGE_SUBSCRIPTION_UPDATE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNotifyFeatureUsage(\n    _In_ PRTL_FEATURE_USAGE_REPORT FeatureUsageReport\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryFeatureConfiguration(\n    _In_ RTL_FEATURE_ID FeatureId,\n    _In_ RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType,\n    _Out_ PRTL_FEATURE_CHANGE_STAMP ChangeStamp,\n    _Out_ PRTL_FEATURE_CONFIGURATION FeatureConfiguration\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSetFeatureConfigurations(\n    _In_opt_ PRTL_FEATURE_CHANGE_STAMP PreviousChangeStamp,\n    _In_ RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType,\n    _In_reads_(ConfigurationUpdateCount) PRTL_FEATURE_CONFIGURATION_UPDATE ConfigurationUpdates,\n    _In_ SIZE_T ConfigurationUpdateCount\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryAllFeatureConfigurations(\n    _In_ RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType,\n    _Out_opt_ PRTL_FEATURE_CHANGE_STAMP ChangeStamp,\n    _Out_writes_(*ConfigurationCount) PRTL_FEATURE_CONFIGURATION Configurations,\n    _Inout_ PSIZE_T ConfigurationCount\n    );\n\n// private\nNTSYSAPI\nRTL_FEATURE_CHANGE_STAMP\nNTAPI\nRtlQueryFeatureConfigurationChangeStamp(\n    VOID\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryFeatureUsageNotificationSubscriptions(\n    _Out_writes_(*SubscriptionCount) PRTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS Subscriptions,\n    _Inout_ PSIZE_T SubscriptionCount\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRegisterFeatureConfigurationChangeNotification(\n    _In_ PRTL_FEATURE_CONFIGURATION_CHANGE_CALLBACK Callback,\n    _In_opt_ PVOID Context,\n    _In_opt_ PRTL_FEATURE_CHANGE_STAMP ObservedChangeStamp,\n    _Out_ PRTL_FEATURE_CONFIGURATION_CHANGE_REGISTRATION RegistrationHandle\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnregisterFeatureConfigurationChangeNotification(\n    _In_ RTL_FEATURE_CONFIGURATION_CHANGE_REGISTRATION RegistrationHandle\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSubscribeForFeatureUsageNotification(\n    _In_reads_(SubscriptionCount) PRTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS SubscriptionDetails,\n    _In_ SIZE_T SubscriptionCount\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnsubscribeFromFeatureUsageNotifications(\n    _In_reads_(SubscriptionCount) PRTL_FEATURE_USAGE_SUBSCRIPTION_DETAILS SubscriptionDetails,\n    _In_ SIZE_T SubscriptionCount\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\n// private\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlOverwriteFeatureConfigurationBuffer(\n    _In_opt_ PRTL_FEATURE_CHANGE_STAMP PreviousChangeStamp,\n    _In_ RTL_FEATURE_CONFIGURATION_TYPE ConfigurationType,\n    _In_reads_bytes_opt_(ConfigurationBufferSize) PVOID ConfigurationBuffer,\n    _In_ ULONG ConfigurationBufferSize\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlNotifyFeatureToggleUsage(\n    _In_ PRTL_FEATURE_USAGE_REPORT FeatureUsageReport,\n    _In_ RTL_FEATURE_ID FeatureId,\n    _In_ ULONG Flags\n    );\n\n#ifndef _RTL_RUN_ONCE_DEF\n#define _RTL_RUN_ONCE_DEF\n//\n// Run once initializer\n//\n#define RTL_RUN_ONCE_INIT {0}\n//\n// Run once flags\n//\n#define RTL_RUN_ONCE_CHECK_ONLY     0x00000001UL\n#define RTL_RUN_ONCE_ASYNC          0x00000002UL\n#define RTL_RUN_ONCE_INIT_FAILED    0x00000004UL\n//\n// The context stored in the run once structure must\n// leave the following number of low order bits unused.\n//\n#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2\n\ntypedef union _RTL_RUN_ONCE\n{\n    PVOID Ptr;\n} RTL_RUN_ONCE, *PRTL_RUN_ONCE;\n#endif // _RTL_RUN_ONCE_DEF\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\nNTSYSAPI\nVOID\nNTAPI\nRtlRunOnceInitialize(\n    _Out_ PRTL_RUN_ONCE RunOnce\n    );\n\ntypedef _Function_class_(RTL_RUN_ONCE_INIT_FN)\nLOGICAL\nNTAPI\nRTL_RUN_ONCE_INIT_FN(\n    _Inout_ PRTL_RUN_ONCE RunOnce,\n    _Inout_opt_ PVOID Parameter,\n    _Inout_opt_ PVOID *Context\n    );\ntypedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN;\n\n_Maybe_raises_SEH_exception_\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRunOnceExecuteOnce(\n    _Inout_ PRTL_RUN_ONCE RunOnce,\n    _In_ __callback PRTL_RUN_ONCE_INIT_FN InitFn,\n    _Inout_opt_ PVOID Parameter,\n    _Outptr_opt_result_maybenull_ PVOID *Context\n    );\n\n_Must_inspect_result_\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRunOnceBeginInitialize(\n    _Inout_ PRTL_RUN_ONCE RunOnce,\n    _In_ ULONG Flags,\n    _Outptr_opt_result_maybenull_ PVOID *Context\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRunOnceComplete(\n    _Inout_ PRTL_RUN_ONCE RunOnce,\n    _In_ ULONG Flags,\n    _In_opt_ PVOID Context\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_VISTA\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n#define WNF_STATE_KEY 0x41C64E6DA3BC0074\n\n_Must_inspect_result_\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlEqualWnfChangeStamps(\n    _In_ WNF_CHANGE_STAMP ChangeStamp1,\n    _In_ WNF_CHANGE_STAMP ChangeStamp2\n    );\n\n_Always_(_Post_satisfies_(return == STATUS_NO_MEMORY || return == STATUS_RETRY || return == STATUS_SUCCESS))\ntypedef _Function_class_(WNF_USER_CALLBACK)\nNTSTATUS\nNTAPI\nWNF_USER_CALLBACK(\n    _In_ WNF_STATE_NAME StateName,\n    _In_ WNF_CHANGE_STAMP ChangeStamp,\n    _In_opt_ PWNF_TYPE_ID TypeId,\n    _In_opt_ PVOID CallbackContext,\n    _In_reads_bytes_opt_(Length) const VOID* Buffer,\n    _In_ ULONG Length\n    );\ntypedef WNF_USER_CALLBACK *PWNF_USER_CALLBACK;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryWnfStateData(\n    _Out_ PWNF_CHANGE_STAMP ChangeStamp,\n    _In_ WNF_STATE_NAME StateName,\n    _In_ PWNF_USER_CALLBACK Callback,\n    _In_opt_ PVOID CallbackContext,\n    _In_opt_ PWNF_TYPE_ID TypeId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlPublishWnfStateData(\n    _In_ WNF_STATE_NAME StateName,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_reads_bytes_opt_(Length) const VOID* Buffer,\n    _In_opt_ ULONG Length,\n    _In_opt_ const VOID* ExplicitScope\n    );\n\ntypedef struct WNF_USER_SUBSCRIPTION *PWNF_USER_SUBSCRIPTION;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSubscribeWnfStateChangeNotification(\n    _Out_ PWNF_USER_SUBSCRIPTION* SubscriptionHandle,\n    _In_ WNF_STATE_NAME StateName,\n    _In_ WNF_CHANGE_STAMP ChangeStamp,\n    _In_ PWNF_USER_CALLBACK Callback,\n    _In_opt_ PVOID CallbackContext,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_opt_ ULONG SerializationGroup,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlUnsubscribeWnfStateChangeNotification(\n    _In_ PWNF_USER_CALLBACK Callback\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWnfDllUnloadCallback(\n    _In_ PVOID DllBase\n    );\n\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\n#define COPY_FILE_CHUNK_DUPLICATE_EXTENTS 0x00000001L // 24H2\n#define VALID_COPY_FILE_CHUNK_FLAGS (COPY_FILE_CHUNK_DUPLICATE_EXTENTS)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlQueryPropertyStore(\n    _In_ ULONG_PTR Key,\n    _Out_ PULONG_PTR Context\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlRemovePropertyStore(\n    _In_ ULONG_PTR Key,\n    _Out_ PULONG_PTR Context\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlCompareExchangePropertyStore(\n    _In_ ULONG_PTR Key,\n    _In_ PULONG_PTR Comperand,\n    _In_opt_ PULONG_PTR Exchange,\n    _Out_ PULONG_PTR Context\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\ntypedef enum _THREAD_STATE_CHANGE_TYPE THREAD_STATE_CHANGE_TYPE, *PTHREAD_STATE_CHANGE_TYPE;\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlWow64ChangeThreadState(\n    _In_ HANDLE ThreadStateChangeHandle,\n    _In_ HANDLE ThreadHandle,\n    _In_ THREAD_STATE_CHANGE_TYPE StateChangeType,\n    _In_opt_ PVOID ExtendedInformation,\n    _In_opt_ SIZE_T ExtendedInformationLength,\n    _In_opt_ ULONG64 Reserved\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n\n#ifdef PHNT_INLINE_TYPEDEFS\n#if (PHNT_VERSION >= PHNT_WINDOWS_11)\n// rev\nFORCEINLINE\nUSHORT\nNTAPI\nRtlGetCurrentThreadPrimaryGroup(\n    VOID\n    )\n{\n    return NtCurrentTeb()->PrimaryGroupAffinity.Group;\n}\n#endif // PHNT_VERSION >= PHNT_WINDOWS_11\n#else\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n// rev\nNTSYSAPI\nUSHORT\nNTAPI\nRtlGetCurrentThreadPrimaryGroup(\n    VOID\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_RS1\n#endif // PHNT_INLINE_TYPEDEFS\n\n#endif // _NTRTL_H\n\n/*\n * RTL forward symbol typedefs\n *\n * This file is part of System Informer.\n */\n#ifndef _NTRTL_FWD_H\n#define _NTRTL_FWD_H\n\n// Note: ntdll symbols and exports define these forwarders:\n\n// begin_forwarders\n#ifndef PHNT_INLINE_NAME_FORWARDERS\n#define RtlGetNativeSystemInformation NtQuerySystemInformation\n#define RtlGetTickCount NtGetTickCount\n#define RtlGuardRestoreContext RtlRestoreContext\n#define RtlRandom RtlRandomEx\n#define RtlOpenImageFileOptionsKey LdrOpenImageFileOptionsKey\n#define RtlQueryImageFileExecutionOptions LdrQueryImageFileExecutionOptionsEx\n#define RtlQueryImageFileKeyOption LdrQueryImageFileKeyOption\n#define RtlSetTimer RtlCreateTimer\n#define RtlRestoreLastWin32Error RtlSetLastWin32Error\n#endif // PHNT_INLINE_NAME_FORWARDERS\n\n#ifndef PHNT_INLINE_PEB_FORWARDERS\nFORCEINLINE\nPPEB\nNTAPI\nRtlGetCurrentPeb(\n    VOID\n    )\n{\n    return NtCurrentPeb();\n}\n\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlAcquirePebLock(\n    VOID\n    )\n{\n    return RtlEnterCriticalSection(NtCurrentPeb()->FastPebLock);\n}\n\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlReleasePebLock(\n    VOID\n    )\n{\n    return RtlLeaveCriticalSection(NtCurrentPeb()->FastPebLock);\n}\n#endif // PHNT_INLINE_PEB_FORWARDERS\n\n#ifndef PHNT_INLINE_FREE_FORWARDERS\n//#define RtlFreeUnicodeString(UnicodeString) {if ((UnicodeString)->Buffer) RtlFreeHeap(RtlProcessHeap(), 0, (UnicodeString)->Buffer); memset(UnicodeString, 0, sizeof(UNICODE_STRING));}\nFORCEINLINE\nVOID\nNTAPI\nRtlFreeUnicodeString(\n    _Inout_ _At_(UnicodeString->Buffer, _Frees_ptr_opt_) PUNICODE_STRING UnicodeString\n    )\n{\n    if (UnicodeString->Buffer)\n    {\n        RtlFreeHeap(RtlProcessHeap(), 0, UnicodeString->Buffer);\n        memset(UnicodeString, 0, sizeof(UNICODE_STRING));\n    }\n}\n\n//#define RtlFreeAnsiString(UnicodeString) {if ((AnsiString)->Buffer) RtlFreeHeap(RtlProcessHeap(), 0, (AnsiString)->Buffer); memset(AnsiString, 0, sizeof(ANSI_STRING));}\nFORCEINLINE\nVOID\nNTAPI\nRtlFreeAnsiString(\n    _Inout_ _At_(AnsiString->Buffer, _Frees_ptr_opt_) PANSI_STRING AnsiString\n    )\n{\n    if (AnsiString->Buffer)\n    {\n        RtlFreeHeap(RtlProcessHeap(), 0, AnsiString->Buffer);\n        memset(AnsiString, 0, sizeof(ANSI_STRING));\n    }\n}\n\n//#define RtlFreeUTF8String(Utf8String) {if ((Utf8String)->Buffer) RtlFreeHeap(RtlProcessHeap(), 0, (Utf8String)->Buffer); memset(Utf8String, 0, sizeof(UTF8_STRING));}\nFORCEINLINE\nVOID\nNTAPI\nRtlFreeUTF8String(\n    _Inout_ _At_(Utf8String->Buffer, _Frees_ptr_opt_) PUTF8_STRING Utf8String\n    )\n{\n    if (Utf8String->Buffer)\n    {\n        RtlFreeHeap(RtlProcessHeap(), 0, Utf8String->Buffer);\n        memset(Utf8String, 0, sizeof(UTF8_STRING));\n    }\n}\n\n//#define RtlFreeSid(Sid) RtlFreeHeap(RtlProcessHeap(), 0, (Sid))\nFORCEINLINE\nPVOID\nNTAPI\nRtlFreeSid(\n    _In_ _Post_invalid_ PSID Sid\n    )\n{\n    RtlFreeHeap(RtlProcessHeap(), 0, Sid);\n    return NULL;\n}\n\n//#define RtlDeleteBoundaryDescriptor(BoundaryDescriptor) RtlFreeHeap(RtlProcessHeap(), 0, (BoundaryDescriptor))\nFORCEINLINE\nVOID\nNTAPI\nRtlDeleteBoundaryDescriptor(\n    _In_ _Post_invalid_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    )\n{\n    RtlFreeHeap(RtlProcessHeap(), 0, BoundaryDescriptor);\n}\n\n//#define RtlDeleteSecurityObject(ObjectDescriptor) RtlFreeHeap(RtlProcessHeap(), 0, *(ObjectDescriptor))\n//FORCEINLINE\n//NTSTATUS\n//RtlDeleteSecurityObject(\n//    _Inout_ PSECURITY_DESCRIPTOR *ObjectDescriptor\n//    )\n//{\n//    RtlFreeHeap(RtlProcessHeap(), 0, *ObjectDescriptor);\n//    return STATUS_SUCCESS;\n//}\n\n//#define RtlDestroyEnvironment(Environment) RtlFreeHeap(RtlProcessHeap(), 0, (Environment))\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlDestroyEnvironment(\n    _In_ _Post_invalid_ PVOID Environment\n    )\n{\n    RtlFreeHeap(RtlProcessHeap(), 0, Environment);\n    return STATUS_SUCCESS;\n}\n\n//#define RtlDestroyProcessParameters(ProcessParameters) RtlFreeHeap(RtlProcessHeap(), 0, (ProcessParameters))\nFORCEINLINE\nNTSTATUS\nNTAPI\nRtlDestroyProcessParameters(\n    _In_ _Post_invalid_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters\n    )\n{\n    RtlFreeHeap(RtlProcessHeap(), 0, ProcessParameters);\n    return STATUS_SUCCESS;\n}\n#endif // PHNT_INLINE_FREE_FORWARDERS\n// end_forwarders\n\n#endif // _NTRTL_FWD_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntsam.h",
    "content": "/*\n * Security Account Manager support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTSAM_H\n#define _NTSAM_H\n\n#define SAM_MAXIMUM_LOOKUP_COUNT (1000)\n#define SAM_MAXIMUM_LOOKUP_LENGTH (32000)\n#define SAM_MAX_PASSWORD_LENGTH (256)\n#define SAM_PASSWORD_ENCRYPTION_SALT_LEN (16)\n\ntypedef PVOID SAM_HANDLE, *PSAM_HANDLE;\ntypedef ULONG SAM_ENUMERATE_HANDLE, *PSAM_ENUMERATE_HANDLE;\n\ntypedef struct _SAM_RID_ENUMERATION\n{\n    ULONG RelativeId;\n    UNICODE_STRING Name;\n} SAM_RID_ENUMERATION, *PSAM_RID_ENUMERATION;\n\ntypedef struct _SAM_SID_ENUMERATION\n{\n    PSID Sid;\n    UNICODE_STRING Name;\n} SAM_SID_ENUMERATION, *PSAM_SID_ENUMERATION;\n\ntypedef struct _SAM_BYTE_ARRAY\n{\n    ULONG Size;\n    _Field_size_bytes_(Size) PUCHAR Data;\n} SAM_BYTE_ARRAY, *PSAM_BYTE_ARRAY;\n\ntypedef struct _SAM_BYTE_ARRAY_32K\n{\n    ULONG Size;\n    _Field_size_bytes_(Size) PUCHAR Data;\n} SAM_BYTE_ARRAY_32K, *PSAM_BYTE_ARRAY_32K;\n\ntypedef SAM_BYTE_ARRAY_32K SAM_SHELL_OBJECT_PROPERTIES, *PSAM_SHELL_OBJECT_PROPERTIES;\n\n// Basic\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamFreeMemory(\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamCloseHandle(\n    _In_ SAM_HANDLE SamHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetSecurityObject(\n    _In_ SAM_HANDLE ObjectHandle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQuerySecurityObject(\n    _In_ SAM_HANDLE ObjectHandle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _Outptr_ PSECURITY_DESCRIPTOR *SecurityDescriptor\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRidToSid(\n    _In_ SAM_HANDLE ObjectHandle,\n    _In_ ULONG Rid,\n    _Outptr_ PSID *Sid\n    );\n\n// Server\n\n#define SAM_SERVER_CONNECT 0x0001\n#define SAM_SERVER_SHUTDOWN 0x0002\n#define SAM_SERVER_INITIALIZE 0x0004\n#define SAM_SERVER_CREATE_DOMAIN 0x0008\n#define SAM_SERVER_ENUMERATE_DOMAINS 0x0010\n#define SAM_SERVER_LOOKUP_DOMAIN 0x0020\n\n#define SAM_SERVER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED     | \\\n    SAM_SERVER_CONNECT | \\\n    SAM_SERVER_INITIALIZE | \\\n    SAM_SERVER_CREATE_DOMAIN | \\\n    SAM_SERVER_SHUTDOWN | \\\n    SAM_SERVER_ENUMERATE_DOMAINS | \\\n    SAM_SERVER_LOOKUP_DOMAIN)\n\n#define SAM_SERVER_READ (STANDARD_RIGHTS_READ | \\\n    SAM_SERVER_ENUMERATE_DOMAINS)\n\n#define SAM_SERVER_WRITE (STANDARD_RIGHTS_WRITE | \\\n    SAM_SERVER_INITIALIZE | \\\n    SAM_SERVER_CREATE_DOMAIN | \\\n    SAM_SERVER_SHUTDOWN)\n\n#define SAM_SERVER_EXECUTE (STANDARD_RIGHTS_EXECUTE | \\\n    SAM_SERVER_CONNECT | \\\n    SAM_SERVER_LOOKUP_DOMAIN)\n\ntypedef struct _RPC_AUTH_IDENTITY_HANDLE *PRPC_AUTH_IDENTITY_HANDLE;\n\n// Functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamConnect(\n    _In_opt_ PCUNICODE_STRING ServerName,\n    _Out_ PSAM_HANDLE ServerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamConnectWithCreds(\n    _In_ PCUNICODE_STRING ServerName,\n    _Out_ PSAM_HANDLE ServerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ PRPC_AUTH_IDENTITY_HANDLE Creds,\n    _In_ PWCHAR Spn,\n    _Out_ BOOL* pfDstIsW2K\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamShutdownSamServer(\n    _In_ SAM_HANDLE ServerHandle\n    );\n\n// Domain\n\n#define DOMAIN_READ_PASSWORD_PARAMETERS 0x0001\n#define DOMAIN_WRITE_PASSWORD_PARAMS 0x0002\n#define DOMAIN_READ_OTHER_PARAMETERS 0x0004\n#define DOMAIN_WRITE_OTHER_PARAMETERS 0x0008\n#define DOMAIN_CREATE_USER 0x0010\n#define DOMAIN_CREATE_GROUP 0x0020\n#define DOMAIN_CREATE_ALIAS 0x0040\n#define DOMAIN_GET_ALIAS_MEMBERSHIP 0x0080\n#define DOMAIN_LIST_ACCOUNTS 0x0100\n#define DOMAIN_LOOKUP 0x0200\n#define DOMAIN_ADMINISTER_SERVER 0x0400\n\n#define DOMAIN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \\\n    DOMAIN_READ_OTHER_PARAMETERS | \\\n    DOMAIN_WRITE_OTHER_PARAMETERS | \\\n    DOMAIN_WRITE_PASSWORD_PARAMS | \\\n    DOMAIN_CREATE_USER | \\\n    DOMAIN_CREATE_GROUP | \\\n    DOMAIN_CREATE_ALIAS | \\\n    DOMAIN_GET_ALIAS_MEMBERSHIP | \\\n    DOMAIN_LIST_ACCOUNTS | \\\n    DOMAIN_READ_PASSWORD_PARAMETERS | \\\n    DOMAIN_LOOKUP | \\\n    DOMAIN_ADMINISTER_SERVER)\n\n#define DOMAIN_READ (STANDARD_RIGHTS_READ | \\\n    DOMAIN_GET_ALIAS_MEMBERSHIP | \\\n    DOMAIN_READ_OTHER_PARAMETERS)\n\n#define DOMAIN_WRITE (STANDARD_RIGHTS_WRITE | \\\n    DOMAIN_WRITE_OTHER_PARAMETERS | \\\n    DOMAIN_WRITE_PASSWORD_PARAMS | \\\n    DOMAIN_CREATE_USER | \\\n    DOMAIN_CREATE_GROUP | \\\n    DOMAIN_CREATE_ALIAS | \\\n    DOMAIN_ADMINISTER_SERVER)\n\n#define DOMAIN_EXECUTE (STANDARD_RIGHTS_EXECUTE | \\\n    DOMAIN_READ_PASSWORD_PARAMETERS | \\\n    DOMAIN_LIST_ACCOUNTS | \\\n    DOMAIN_LOOKUP)\n\n#define DOMAIN_PROMOTION_INCREMENT { 0x0, 0x10 }\n#define DOMAIN_PROMOTION_MASK { 0x0, 0xfffffff0 }\n\n// SamQueryInformationDomain/SamSetInformationDomain types\n\ntypedef enum _DOMAIN_INFORMATION_CLASS\n{\n    DomainPasswordInformation = 1, // q; s: DOMAIN_PASSWORD_INFORMATION\n    DomainGeneralInformation, // q: DOMAIN_GENERAL_INFORMATION\n    DomainLogoffInformation, // q; s: DOMAIN_LOGOFF_INFORMATION\n    DomainOemInformation, // q; s: DOMAIN_OEM_INFORMATION\n    DomainNameInformation, // q: DOMAIN_NAME_INFORMATION\n    DomainReplicationInformation, // q; s: DOMAIN_REPLICATION_INFORMATION\n    DomainServerRoleInformation, // q; s: DOMAIN_SERVER_ROLE_INFORMATION\n    DomainModifiedInformation, // q: DOMAIN_MODIFIED_INFORMATION\n    DomainStateInformation, // q; s: DOMAIN_STATE_INFORMATION\n    DomainUasInformation, // q; s: DOMAIN_UAS_INFORMATION\n    DomainGeneralInformation2, // q: DOMAIN_GENERAL_INFORMATION2\n    DomainLockoutInformation, // q; s: DOMAIN_LOCKOUT_INFORMATION\n    DomainModifiedInformation2 // q: DOMAIN_MODIFIED_INFORMATION2\n} DOMAIN_INFORMATION_CLASS;\n\ntypedef enum _DOMAIN_SERVER_ENABLE_STATE\n{\n    DomainServerEnabled = 1,\n    DomainServerDisabled\n} DOMAIN_SERVER_ENABLE_STATE, *PDOMAIN_SERVER_ENABLE_STATE;\n\ntypedef enum _DOMAIN_SERVER_ROLE\n{\n    DomainServerRoleBackup = 2,\n    DomainServerRolePrimary\n} DOMAIN_SERVER_ROLE, *PDOMAIN_SERVER_ROLE;\n\n#include <pshpack4.h>\ntypedef struct _DOMAIN_GENERAL_INFORMATION\n{\n    LARGE_INTEGER ForceLogoff;\n    UNICODE_STRING OemInformation;\n    UNICODE_STRING DomainName;\n    UNICODE_STRING ReplicaSourceNodeName;\n    LARGE_INTEGER DomainModifiedCount;\n    DOMAIN_SERVER_ENABLE_STATE DomainServerState;\n    DOMAIN_SERVER_ROLE DomainServerRole;\n    BOOLEAN UasCompatibilityRequired;\n    ULONG UserCount;\n    ULONG GroupCount;\n    ULONG AliasCount;\n} DOMAIN_GENERAL_INFORMATION, *PDOMAIN_GENERAL_INFORMATION;\n#include <poppack.h>\n\n#include <pshpack4.h>\ntypedef struct _DOMAIN_GENERAL_INFORMATION2\n{\n    DOMAIN_GENERAL_INFORMATION I1;\n    LARGE_INTEGER LockoutDuration; // delta time\n    LARGE_INTEGER LockoutObservationWindow; // delta time\n    USHORT LockoutThreshold;\n} DOMAIN_GENERAL_INFORMATION2, *PDOMAIN_GENERAL_INFORMATION2;\n#include <poppack.h>\n\ntypedef struct _DOMAIN_UAS_INFORMATION\n{\n    BOOLEAN UasCompatibilityRequired;\n} DOMAIN_UAS_INFORMATION;\n\n#ifndef _DOMAIN_PASSWORD_INFORMATION_DEFINED // defined in ntsecapi.h\n#define _DOMAIN_PASSWORD_INFORMATION_DEFINED\n\ntypedef struct _DOMAIN_PASSWORD_INFORMATION\n{\n    USHORT MinPasswordLength;\n    USHORT PasswordHistoryLength;\n    ULONG PasswordProperties;\n    LARGE_INTEGER MaxPasswordAge;\n    LARGE_INTEGER MinPasswordAge;\n} DOMAIN_PASSWORD_INFORMATION, *PDOMAIN_PASSWORD_INFORMATION;\n\n// PasswordProperties flags\n\n#define DOMAIN_PASSWORD_COMPLEX 0x00000001L\n#define DOMAIN_PASSWORD_NO_ANON_CHANGE 0x00000002L\n#define DOMAIN_PASSWORD_NO_CLEAR_CHANGE 0x00000004L\n#define DOMAIN_LOCKOUT_ADMINS 0x00000008L\n#define DOMAIN_PASSWORD_STORE_CLEARTEXT 0x00000010L\n#define DOMAIN_REFUSE_PASSWORD_CHANGE 0x00000020L\n#define DOMAIN_NO_LM_OWF_CHANGE 0x00000040L\n\n#endif // _DOMAIN_PASSWORD_INFORMATION_DEFINED\n\ntypedef enum _DOMAIN_PASSWORD_CONSTRUCTION\n{\n    DomainPasswordSimple = 1,\n    DomainPasswordComplex\n} DOMAIN_PASSWORD_CONSTRUCTION;\n\ntypedef struct _DOMAIN_LOGOFF_INFORMATION\n{\n    LARGE_INTEGER ForceLogoff;\n} DOMAIN_LOGOFF_INFORMATION, *PDOMAIN_LOGOFF_INFORMATION;\n\ntypedef struct _DOMAIN_OEM_INFORMATION\n{\n    UNICODE_STRING OemInformation;\n} DOMAIN_OEM_INFORMATION, *PDOMAIN_OEM_INFORMATION;\n\ntypedef struct _DOMAIN_NAME_INFORMATION\n{\n    UNICODE_STRING DomainName;\n} DOMAIN_NAME_INFORMATION, *PDOMAIN_NAME_INFORMATION;\n\ntypedef struct _DOMAIN_SERVER_ROLE_INFORMATION\n{\n    DOMAIN_SERVER_ROLE DomainServerRole;\n} DOMAIN_SERVER_ROLE_INFORMATION, *PDOMAIN_SERVER_ROLE_INFORMATION;\n\ntypedef struct _DOMAIN_REPLICATION_INFORMATION\n{\n    UNICODE_STRING ReplicaSourceNodeName;\n} DOMAIN_REPLICATION_INFORMATION, *PDOMAIN_REPLICATION_INFORMATION;\n\ntypedef struct _DOMAIN_MODIFIED_INFORMATION\n{\n    LARGE_INTEGER DomainModifiedCount;\n    LARGE_INTEGER CreationTime;\n} DOMAIN_MODIFIED_INFORMATION, *PDOMAIN_MODIFIED_INFORMATION;\n\ntypedef struct _DOMAIN_MODIFIED_INFORMATION2\n{\n    LARGE_INTEGER DomainModifiedCount;\n    LARGE_INTEGER CreationTime;\n    LARGE_INTEGER ModifiedCountAtLastPromotion;\n} DOMAIN_MODIFIED_INFORMATION2, *PDOMAIN_MODIFIED_INFORMATION2;\n\ntypedef struct _DOMAIN_STATE_INFORMATION\n{\n    DOMAIN_SERVER_ENABLE_STATE DomainServerState;\n} DOMAIN_STATE_INFORMATION, *PDOMAIN_STATE_INFORMATION;\n\ntypedef struct _DOMAIN_LOCKOUT_INFORMATION\n{\n    LARGE_INTEGER LockoutDuration; // delta time\n    LARGE_INTEGER LockoutObservationWindow; // delta time\n    USHORT LockoutThreshold; // zero means no lockout\n} DOMAIN_LOCKOUT_INFORMATION, *PDOMAIN_LOCKOUT_INFORMATION;\n\n// SamQueryDisplayInformation types\n\ntypedef enum _DOMAIN_DISPLAY_INFORMATION\n{\n    DomainDisplayUser = 1, // DOMAIN_DISPLAY_USER\n    DomainDisplayMachine, // DOMAIN_DISPLAY_MACHINE\n    DomainDisplayGroup, // DOMAIN_DISPLAY_GROUP\n    DomainDisplayOemUser, // DOMAIN_DISPLAY_OEM_USER\n    DomainDisplayOemGroup, // DOMAIN_DISPLAY_OEM_GROUP\n    DomainDisplayServer\n} DOMAIN_DISPLAY_INFORMATION, *PDOMAIN_DISPLAY_INFORMATION;\n\ntypedef struct _DOMAIN_DISPLAY_USER\n{\n    ULONG Index;\n    ULONG Rid;\n    ULONG AccountControl;\n    UNICODE_STRING LogonName;\n    UNICODE_STRING AdminComment;\n    UNICODE_STRING FullName;\n} DOMAIN_DISPLAY_USER, *PDOMAIN_DISPLAY_USER;\n\ntypedef struct _DOMAIN_DISPLAY_MACHINE\n{\n    ULONG Index;\n    ULONG Rid;\n    ULONG AccountControl;\n    UNICODE_STRING Machine;\n    UNICODE_STRING Comment;\n} DOMAIN_DISPLAY_MACHINE, *PDOMAIN_DISPLAY_MACHINE;\n\ntypedef struct _DOMAIN_DISPLAY_GROUP\n{\n    ULONG Index;\n    ULONG Rid;\n    ULONG Attributes;\n    UNICODE_STRING Group;\n    UNICODE_STRING Comment;\n} DOMAIN_DISPLAY_GROUP, *PDOMAIN_DISPLAY_GROUP;\n\ntypedef struct _DOMAIN_DISPLAY_OEM_USER\n{\n    ULONG Index;\n    OEM_STRING User;\n} DOMAIN_DISPLAY_OEM_USER, *PDOMAIN_DISPLAY_OEM_USER;\n\ntypedef struct _DOMAIN_DISPLAY_OEM_GROUP\n{\n    ULONG Index;\n    OEM_STRING Group;\n} DOMAIN_DISPLAY_OEM_GROUP, *PDOMAIN_DISPLAY_OEM_GROUP;\n\n// SamQueryLocalizableAccountsInDomain types\n\ntypedef enum _DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION\n{\n    DomainLocalizableAccountsBasic = 1,\n} DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION, *PDOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION;\n\ntypedef struct _DOMAIN_LOCALIZABLE_ACCOUNTS_ENTRY\n{\n    ULONG Rid;\n    SID_NAME_USE Use;\n    UNICODE_STRING Name;\n    UNICODE_STRING AdminComment;\n} DOMAIN_LOCALIZABLE_ACCOUNT_ENTRY, *PDOMAIN_LOCALIZABLE_ACCOUNT_ENTRY;\n\ntypedef struct _DOMAIN_LOCALIZABLE_ACCOUNTS\n{\n    ULONG Count;\n    _Field_size_(Count) DOMAIN_LOCALIZABLE_ACCOUNT_ENTRY *Entries;\n} DOMAIN_LOCALIZABLE_ACCOUNTS_BASIC, *PDOMAIN_LOCALIZABLE_ACCOUNTS_BASIC;\n\ntypedef union _DOMAIN_LOCALIZABLE_INFO_BUFFER\n{\n    DOMAIN_LOCALIZABLE_ACCOUNTS_BASIC Basic;\n} DOMAIN_LOCALIZABLE_ACCOUNTS_INFO_BUFFER, *PDOMAIN_LOCALIZABLE_ACCOUNTS_INFO_BUFFER;\n\n// Functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamLookupDomainInSamServer(\n    _In_ SAM_HANDLE ServerHandle,\n    _In_ PCUNICODE_STRING Name,\n    _Outptr_ PSID *DomainId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamEnumerateDomainsInSamServer(\n    _In_ SAM_HANDLE ServerHandle,\n    _Inout_ PSAM_ENUMERATE_HANDLE EnumerationContext,\n    _Outptr_ PVOID *Buffer, // PSAM_SID_ENUMERATION *Buffer\n    _In_ ULONG PreferedMaximumLength,\n    _Out_ PULONG CountReturned\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamOpenDomain(\n    _In_ SAM_HANDLE ServerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PSID DomainId,\n    _Out_ PSAM_HANDLE DomainHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryInformationDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ DOMAIN_INFORMATION_CLASS DomainInformationClass,\n    _Outptr_ PVOID *Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetInformationDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ DOMAIN_INFORMATION_CLASS DomainInformationClass,\n    _In_ PVOID DomainInformation\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamLookupNamesInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ULONG Count,\n    _In_reads_(Count) PCUNICODE_STRING Names,\n    _Out_ _Deref_post_count_(Count) PULONG *RelativeIds,\n    _Out_ _Deref_post_count_(Count) PSID_NAME_USE *Use\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamLookupNamesInDomain2(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ULONG Count,\n    _In_reads_(Count) PCUNICODE_STRING Names,\n    _Out_ _Deref_post_count_(Count) PSID* Sids,\n    _Out_ _Deref_post_count_(Count) PSID_NAME_USE* Use\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamLookupIdsInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ULONG Count,\n    _In_reads_(Count) PULONG RelativeIds,\n    _Out_ _Deref_post_count_(Count) PUNICODE_STRING *Names,\n    _Out_ _Deref_post_opt_count_(Count) PSID_NAME_USE *Use\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRemoveMemberFromForeignDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ PSID MemberId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryLocalizableAccountsInDomain(\n    _In_ SAM_HANDLE Domain,\n    _In_ ULONG Flags,\n    _In_ ULONG LanguageId,\n    _In_ DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION Class,\n    _Outptr_ PVOID *Buffer\n    );\n\n// Group\n\n#define GROUP_READ_INFORMATION 0x0001\n#define GROUP_WRITE_ACCOUNT 0x0002\n#define GROUP_ADD_MEMBER 0x0004\n#define GROUP_REMOVE_MEMBER 0x0008\n#define GROUP_LIST_MEMBERS 0x0010\n\n#define GROUP_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \\\n    GROUP_LIST_MEMBERS | \\\n    GROUP_WRITE_ACCOUNT | \\\n    GROUP_ADD_MEMBER | \\\n    GROUP_REMOVE_MEMBER | \\\n    GROUP_READ_INFORMATION)\n\n#define GROUP_READ (STANDARD_RIGHTS_READ | \\\n    GROUP_LIST_MEMBERS)\n\n#define GROUP_WRITE (STANDARD_RIGHTS_WRITE | \\\n    GROUP_WRITE_ACCOUNT | \\\n    GROUP_ADD_MEMBER | \\\n    GROUP_REMOVE_MEMBER)\n\n#define GROUP_EXECUTE (STANDARD_RIGHTS_EXECUTE | \\\n    GROUP_READ_INFORMATION)\n\ntypedef struct _GROUP_MEMBERSHIP\n{\n    ULONG RelativeId;\n    ULONG Attributes;\n} GROUP_MEMBERSHIP, *PGROUP_MEMBERSHIP;\n\n// SamQueryInformationGroup/SamSetInformationGroup types\n\ntypedef enum _GROUP_INFORMATION_CLASS\n{\n    GroupGeneralInformation = 1, // q: GROUP_GENERAL_INFORMATION\n    GroupNameInformation, // q; s: GROUP_NAME_INFORMATION\n    GroupAttributeInformation, // q; s: GROUP_ATTRIBUTE_INFORMATION\n    GroupAdminCommentInformation, // q; s: GROUP_ADM_COMMENT_INFORMATION\n    GroupReplicationInformation\n} GROUP_INFORMATION_CLASS;\n\ntypedef struct _GROUP_GENERAL_INFORMATION\n{\n    UNICODE_STRING Name;\n    ULONG Attributes;\n    ULONG MemberCount;\n    UNICODE_STRING AdminComment;\n} GROUP_GENERAL_INFORMATION, *PGROUP_GENERAL_INFORMATION;\n\ntypedef struct _GROUP_NAME_INFORMATION\n{\n    UNICODE_STRING Name;\n} GROUP_NAME_INFORMATION, *PGROUP_NAME_INFORMATION;\n\ntypedef struct _GROUP_ATTRIBUTE_INFORMATION\n{\n    ULONG Attributes;\n} GROUP_ATTRIBUTE_INFORMATION, *PGROUP_ATTRIBUTE_INFORMATION;\n\ntypedef struct _GROUP_ADM_COMMENT_INFORMATION\n{\n    UNICODE_STRING AdminComment;\n} GROUP_ADM_COMMENT_INFORMATION, *PGROUP_ADM_COMMENT_INFORMATION;\n\n// Functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamEnumerateGroupsInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _Inout_ PSAM_ENUMERATE_HANDLE EnumerationContext,\n    _Outptr_ PVOID *Buffer, // PSAM_RID_ENUMERATION *\n    _In_ ULONG PreferedMaximumLength,\n    _Out_ PULONG CountReturned\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamCreateGroupInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ PCUNICODE_STRING AccountName,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PSAM_HANDLE GroupHandle,\n    _Out_ PULONG RelativeId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamOpenGroup(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG GroupId,\n    _Out_ PSAM_HANDLE GroupHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamDeleteGroup(\n    _In_ SAM_HANDLE GroupHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryInformationGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _In_ GROUP_INFORMATION_CLASS GroupInformationClass,\n    _Outptr_ PVOID *Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetInformationGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _In_ GROUP_INFORMATION_CLASS GroupInformationClass,\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamAddMemberToGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _In_ ULONG MemberId,\n    _In_ ULONG Attributes\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRemoveMemberFromGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _In_ ULONG MemberId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetMembersInGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _Out_ _Deref_post_count_(*MemberCount) PULONG *MemberIds,\n    _Out_ _Deref_post_count_(*MemberCount) PULONG *Attributes,\n    _Out_ PULONG MemberCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetMemberAttributesOfGroup(\n    _In_ SAM_HANDLE GroupHandle,\n    _In_ ULONG MemberId,\n    _In_ ULONG Attributes\n    );\n\n// Alias\n\n#define ALIAS_ADD_MEMBER 0x0001\n#define ALIAS_REMOVE_MEMBER 0x0002\n#define ALIAS_LIST_MEMBERS 0x0004\n#define ALIAS_READ_INFORMATION 0x0008\n#define ALIAS_WRITE_ACCOUNT 0x0010\n\n#define ALIAS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \\\n    ALIAS_READ_INFORMATION | \\\n    ALIAS_WRITE_ACCOUNT | \\\n    ALIAS_LIST_MEMBERS | \\\n    ALIAS_ADD_MEMBER | \\\n    ALIAS_REMOVE_MEMBER)\n\n#define ALIAS_READ (STANDARD_RIGHTS_READ | \\\n    ALIAS_LIST_MEMBERS)\n\n#define ALIAS_WRITE (STANDARD_RIGHTS_WRITE | \\\n    ALIAS_WRITE_ACCOUNT | \\\n    ALIAS_ADD_MEMBER | \\\n    ALIAS_REMOVE_MEMBER)\n\n#define ALIAS_EXECUTE (STANDARD_RIGHTS_EXECUTE | \\\n    ALIAS_READ_INFORMATION)\n\n// SamQueryInformationAlias/SamSetInformationAlias types\n\ntypedef enum _ALIAS_INFORMATION_CLASS\n{\n    AliasGeneralInformation = 1, // q: ALIAS_GENERAL_INFORMATION\n    AliasNameInformation, // q; s: ALIAS_NAME_INFORMATION\n    AliasAdminCommentInformation, // q; s: ALIAS_ADM_COMMENT_INFORMATION\n    AliasReplicationInformation,\n    AliasExtendedInformation,\n} ALIAS_INFORMATION_CLASS;\n\ntypedef struct _ALIAS_GENERAL_INFORMATION\n{\n    UNICODE_STRING Name;\n    ULONG MemberCount;\n    UNICODE_STRING AdminComment;\n} ALIAS_GENERAL_INFORMATION, *PALIAS_GENERAL_INFORMATION;\n\ntypedef struct _ALIAS_NAME_INFORMATION\n{\n    UNICODE_STRING Name;\n} ALIAS_NAME_INFORMATION, *PALIAS_NAME_INFORMATION;\n\ntypedef struct _ALIAS_ADM_COMMENT_INFORMATION\n{\n    UNICODE_STRING AdminComment;\n} ALIAS_ADM_COMMENT_INFORMATION, *PALIAS_ADM_COMMENT_INFORMATION;\n\n#define ALIAS_ALL_NAME (0x00000001L)\n#define ALIAS_ALL_MEMBER_COUNT (0x00000002L)\n#define ALIAS_ALL_ADMIN_COMMENT (0x00000004L)\n#define ALIAS_ALL_SHELL_ADMIN_OBJECT_PROPERTIES (0x00000008L)\n\ntypedef struct _ALIAS_EXTENDED_INFORMATION\n{\n    ULONG WhichFields;\n    SAM_SHELL_OBJECT_PROPERTIES ShellAdminObjectProperties;\n} ALIAS_EXTENDED_INFORMATION, *PALIAS_EXTENDED_INFORMATION;\n\n// Functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamEnumerateAliasesInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _Inout_ PSAM_ENUMERATE_HANDLE EnumerationContext,\n    _Outptr_ PVOID *Buffer, // PSAM_RID_ENUMERATION *Buffer\n    _In_ ULONG PreferedMaximumLength,\n    _Out_ PULONG CountReturned\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamCreateAliasInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ PCUNICODE_STRING AccountName,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PSAM_HANDLE AliasHandle,\n    _Out_ PULONG RelativeId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamOpenAlias(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG AliasId,\n    _Out_ PSAM_HANDLE AliasHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamDeleteAlias(\n    _In_ SAM_HANDLE AliasHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryInformationAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_ ALIAS_INFORMATION_CLASS AliasInformationClass,\n    _Outptr_ PVOID *Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetInformationAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_ ALIAS_INFORMATION_CLASS AliasInformationClass,\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamAddMemberToAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_ PSID MemberId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamAddMultipleMembersToAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_reads_(MemberCount) PSID *MemberIds,\n    _In_ ULONG MemberCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRemoveMemberFromAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_ PSID MemberId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRemoveMultipleMembersFromAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _In_reads_(MemberCount) PSID *MemberIds,\n    _In_ ULONG MemberCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetMembersInAlias(\n    _In_ SAM_HANDLE AliasHandle,\n    _Out_ _Deref_post_count_(*MemberCount) PSID **MemberIds,\n    _Out_ PULONG MemberCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetAliasMembership(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ULONG PassedCount,\n    _In_reads_(PassedCount) PSID *Sids,\n    _Out_ PULONG MembershipCount,\n    _Out_ _Deref_post_count_(*MembershipCount) PULONG *Aliases\n    );\n\n// Group types\n\n#define GROUP_TYPE_BUILTIN_LOCAL_GROUP 0x00000001\n#define GROUP_TYPE_ACCOUNT_GROUP 0x00000002\n#define GROUP_TYPE_RESOURCE_GROUP 0x00000004\n#define GROUP_TYPE_UNIVERSAL_GROUP 0x00000008\n#define GROUP_TYPE_APP_BASIC_GROUP 0x00000010\n#define GROUP_TYPE_APP_QUERY_GROUP 0x00000020\n#define GROUP_TYPE_SECURITY_ENABLED 0x80000000\n\n#define GROUP_TYPE_RESOURCE_BEHAVOIR (GROUP_TYPE_RESOURCE_GROUP | \\\n    GROUP_TYPE_APP_BASIC_GROUP | \\\n    GROUP_TYPE_APP_QUERY_GROUP)\n\n// User\n\n#define USER_READ_GENERAL 0x0001\n#define USER_READ_PREFERENCES 0x0002\n#define USER_WRITE_PREFERENCES 0x0004\n#define USER_READ_LOGON 0x0008\n#define USER_READ_ACCOUNT 0x0010\n#define USER_WRITE_ACCOUNT 0x0020\n#define USER_CHANGE_PASSWORD 0x0040\n#define USER_FORCE_PASSWORD_CHANGE 0x0080\n#define USER_LIST_GROUPS 0x0100\n#define USER_READ_GROUP_INFORMATION 0x0200\n#define USER_WRITE_GROUP_INFORMATION 0x0400\n\n#define USER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \\\n    USER_READ_PREFERENCES | \\\n    USER_READ_LOGON | \\\n    USER_LIST_GROUPS | \\\n    USER_READ_GROUP_INFORMATION | \\\n    USER_WRITE_PREFERENCES | \\\n    USER_CHANGE_PASSWORD | \\\n    USER_FORCE_PASSWORD_CHANGE | \\\n    USER_READ_GENERAL | \\\n    USER_READ_ACCOUNT | \\\n    USER_WRITE_ACCOUNT | \\\n    USER_WRITE_GROUP_INFORMATION)\n\n#define USER_READ (STANDARD_RIGHTS_READ | \\\n    USER_READ_PREFERENCES | \\\n    USER_READ_LOGON | \\\n    USER_READ_ACCOUNT | \\\n    USER_LIST_GROUPS | \\\n    USER_READ_GROUP_INFORMATION)\n\n#define USER_WRITE (STANDARD_RIGHTS_WRITE | \\\n    USER_WRITE_PREFERENCES | \\\n    USER_CHANGE_PASSWORD)\n\n#define USER_EXECUTE (STANDARD_RIGHTS_EXECUTE | \\\n    USER_READ_GENERAL | \\\n    USER_CHANGE_PASSWORD)\n\n// User account control flags\n\n#define USER_ACCOUNT_DISABLED (0x00000001)\n#define USER_HOME_DIRECTORY_REQUIRED (0x00000002)\n#define USER_PASSWORD_NOT_REQUIRED (0x00000004)\n#define USER_TEMP_DUPLICATE_ACCOUNT (0x00000008)\n#define USER_NORMAL_ACCOUNT (0x00000010)\n#define USER_MNS_LOGON_ACCOUNT (0x00000020)\n#define USER_INTERDOMAIN_TRUST_ACCOUNT (0x00000040)\n#define USER_WORKSTATION_TRUST_ACCOUNT (0x00000080)\n#define USER_SERVER_TRUST_ACCOUNT (0x00000100)\n#define USER_DONT_EXPIRE_PASSWORD (0x00000200)\n#define USER_ACCOUNT_AUTO_LOCKED (0x00000400)\n#define USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED (0x00000800)\n#define USER_SMARTCARD_REQUIRED (0x00001000)\n#define USER_TRUSTED_FOR_DELEGATION (0x00002000)\n#define USER_NOT_DELEGATED (0x00004000)\n#define USER_USE_DES_KEY_ONLY (0x00008000)\n#define USER_DONT_REQUIRE_PREAUTH (0x00010000)\n#define USER_PASSWORD_EXPIRED (0x00020000)\n#define USER_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION (0x00040000)\n#define USER_NO_AUTH_DATA_REQUIRED (0x00080000)\n#define USER_PARTIAL_SECRETS_ACCOUNT (0x00100000)\n#define USER_USE_AES_KEYS (0x00200000)\n\n#define NEXT_FREE_ACCOUNT_CONTROL_BIT (USER_USE_AES_KEYS << 1)\n\n#define USER_MACHINE_ACCOUNT_MASK ( \\\n    USER_INTERDOMAIN_TRUST_ACCOUNT | \\\n    USER_WORKSTATION_TRUST_ACCOUNT | \\\n    USER_SERVER_TRUST_ACCOUNT \\\n    )\n\n#define USER_ACCOUNT_TYPE_MASK ( \\\n    USER_TEMP_DUPLICATE_ACCOUNT | \\\n    USER_NORMAL_ACCOUNT | \\\n    USER_MACHINE_ACCOUNT_MASK \\\n    )\n\n#define USER_COMPUTED_ACCOUNT_CONTROL_BITS ( \\\n    USER_ACCOUNT_AUTO_LOCKED | \\\n    USER_PASSWORD_EXPIRED \\\n    )\n\n// Logon times may be expressed in day, hour, or minute granularity.\n\n#define SAM_DAYS_PER_WEEK (7)\n#define SAM_HOURS_PER_WEEK (24 * SAM_DAYS_PER_WEEK)\n#define SAM_MINUTES_PER_WEEK (60 * SAM_HOURS_PER_WEEK)\n\ntypedef struct _LOGON_HOURS\n{\n    USHORT UnitsPerWeek;\n\n    // UnitsPerWeek is the number of equal length time units the week is\n    // divided into. This value is used to compute the length of the bit\n    // string in logon_hours. Must be less than or equal to\n    // SAM_UNITS_PER_WEEK (10080) for this release.\n    //\n    // LogonHours is a bit map of valid logon times. Each bit represents\n    // a unique division in a week. The largest bit map supported is 1260\n    // bytes (10080 bits), which represents minutes per week. In this case\n    // the first bit (bit 0, byte 0) is Sunday, 00:00:00 - 00-00:59; bit 1,\n    // byte 0 is Sunday, 00:01:00 - 00:01:59, etc. A NULL pointer means\n    // DONT_CHANGE for SamSetInformationUser() calls.\n\n    PUCHAR LogonHours;\n} LOGON_HOURS, *PLOGON_HOURS;\n\ntypedef struct _SR_SECURITY_DESCRIPTOR\n{\n    ULONG Length;\n    PUCHAR SecurityDescriptor;\n} SR_SECURITY_DESCRIPTOR, *PSR_SECURITY_DESCRIPTOR;\n\n// SamQueryInformationUser/SamSetInformationUser types\n\ntypedef enum _USER_INFORMATION_CLASS\n{\n    UserGeneralInformation = 1, // q: USER_GENERAL_INFORMATION\n    UserPreferencesInformation, // q; s: USER_PREFERENCES_INFORMATION\n    UserLogonInformation, // q: USER_LOGON_INFORMATION\n    UserLogonHoursInformation, // q; s: USER_LOGON_HOURS_INFORMATION\n    UserAccountInformation, // q: USER_ACCOUNT_INFORMATION\n    UserNameInformation, // q; s: USER_NAME_INFORMATION\n    UserAccountNameInformation, // q; s: USER_ACCOUNT_NAME_INFORMATION\n    UserFullNameInformation, // q; s: USER_FULL_NAME_INFORMATION\n    UserPrimaryGroupInformation, // q; s: USER_PRIMARY_GROUP_INFORMATION\n    UserHomeInformation, // q; s: USER_HOME_INFORMATION // 10\n    UserScriptInformation, // q; s: USER_SCRIPT_INFORMATION\n    UserProfileInformation, // q; s: USER_PROFILE_INFORMATION\n    UserAdminCommentInformation, // q; s: USER_ADMIN_COMMENT_INFORMATION\n    UserWorkStationsInformation, // q; s: USER_WORKSTATIONS_INFORMATION\n    UserSetPasswordInformation, // s: USER_SET_PASSWORD_INFORMATION\n    UserControlInformation, // q; s: USER_CONTROL_INFORMATION\n    UserExpiresInformation, // q; s: USER_EXPIRES_INFORMATION\n    UserInternal1Information, // USER_INTERNAL1_INFORMATION\n    UserInternal2Information, // USER_INTERNAL2_INFORMATION\n    UserParametersInformation, // q; s: USER_PARAMETERS_INFORMATION // 20\n    UserAllInformation, // USER_ALL_INFORMATION\n    UserInternal3Information, // USER_INTERNAL3_INFORMATION\n    UserInternal4Information, // USER_INTERNAL4_INFORMATION\n    UserInternal5Information, // USER_INTERNAL5_INFORMATION\n    UserInternal4InformationNew, // USER_INTERNAL4_INFORMATION_NEW\n    UserInternal5InformationNew, // USER_INTERNAL5_INFORMATION_NEW\n    UserInternal6Information, // USER_INTERNAL6_INFORMATION\n    UserExtendedInformation, // USER_EXTENDED_INFORMATION\n    UserLogonUIInformation, // USER_LOGON_UI_INFORMATION\n    UserUnknownTodoInformation,\n    UserInternal7Information, // USER_INTERNAL7_INFORMATION\n    UserInternal8Information, // USER_INTERNAL8_INFORMATION\n} USER_INFORMATION_CLASS, *PUSER_INFORMATION_CLASS;\n\ntypedef struct _USER_GENERAL_INFORMATION\n{\n    UNICODE_STRING UserName;\n    UNICODE_STRING FullName;\n    ULONG PrimaryGroupId;\n    UNICODE_STRING AdminComment;\n    UNICODE_STRING UserComment;\n} USER_GENERAL_INFORMATION, *PUSER_GENERAL_INFORMATION;\n\ntypedef struct _USER_PREFERENCES_INFORMATION\n{\n    UNICODE_STRING UserComment;\n    UNICODE_STRING Reserved1;\n    USHORT CountryCode;\n    USHORT CodePage;\n} USER_PREFERENCES_INFORMATION, *PUSER_PREFERENCES_INFORMATION;\n\n#include <pshpack4.h>\ntypedef struct _USER_LOGON_INFORMATION\n{\n    UNICODE_STRING UserName;\n    UNICODE_STRING FullName;\n    ULONG UserId;\n    ULONG PrimaryGroupId;\n    UNICODE_STRING HomeDirectory;\n    UNICODE_STRING HomeDirectoryDrive;\n    UNICODE_STRING ScriptPath;\n    UNICODE_STRING ProfilePath;\n    UNICODE_STRING WorkStations;\n    LARGE_INTEGER LastLogon;\n    LARGE_INTEGER LastLogoff;\n    LARGE_INTEGER PasswordLastSet;\n    LARGE_INTEGER PasswordCanChange;\n    LARGE_INTEGER PasswordMustChange;\n    LOGON_HOURS LogonHours;\n    USHORT BadPasswordCount;\n    USHORT LogonCount;\n    ULONG UserAccountControl;\n} USER_LOGON_INFORMATION, *PUSER_LOGON_INFORMATION;\n#include <poppack.h>\n\ntypedef struct _USER_LOGON_HOURS_INFORMATION\n{\n    LOGON_HOURS LogonHours;\n} USER_LOGON_HOURS_INFORMATION, *PUSER_LOGON_HOURS_INFORMATION;\n\n#include <pshpack4.h>\ntypedef struct _USER_ACCOUNT_INFORMATION\n{\n    UNICODE_STRING UserName;\n    UNICODE_STRING FullName;\n    ULONG UserId;\n    ULONG PrimaryGroupId;\n    UNICODE_STRING HomeDirectory;\n    UNICODE_STRING HomeDirectoryDrive;\n    UNICODE_STRING ScriptPath;\n    UNICODE_STRING ProfilePath;\n    UNICODE_STRING AdminComment;\n    UNICODE_STRING WorkStations;\n    LARGE_INTEGER LastLogon;\n    LARGE_INTEGER LastLogoff;\n    LOGON_HOURS LogonHours;\n    USHORT BadPasswordCount;\n    USHORT LogonCount;\n    LARGE_INTEGER PasswordLastSet;\n    LARGE_INTEGER AccountExpires;\n    ULONG UserAccountControl;\n} USER_ACCOUNT_INFORMATION, *PUSER_ACCOUNT_INFORMATION;\n#include <poppack.h>\n\ntypedef struct _USER_NAME_INFORMATION\n{\n    UNICODE_STRING UserName;\n    UNICODE_STRING FullName;\n} USER_NAME_INFORMATION, *PUSER_NAME_INFORMATION;\n\ntypedef struct _USER_ACCOUNT_NAME_INFORMATION\n{\n    UNICODE_STRING UserName;\n} USER_ACCOUNT_NAME_INFORMATION, *PUSER_ACCOUNT_NAME_INFORMATION;\n\ntypedef struct _USER_FULL_NAME_INFORMATION\n{\n    UNICODE_STRING FullName;\n} USER_FULL_NAME_INFORMATION, *PUSER_FULL_NAME_INFORMATION;\n\ntypedef struct _USER_PRIMARY_GROUP_INFORMATION\n{\n    ULONG PrimaryGroupId;\n} USER_PRIMARY_GROUP_INFORMATION, *PUSER_PRIMARY_GROUP_INFORMATION;\n\ntypedef struct _USER_HOME_INFORMATION\n{\n    UNICODE_STRING HomeDirectory;\n    UNICODE_STRING HomeDirectoryDrive;\n} USER_HOME_INFORMATION, *PUSER_HOME_INFORMATION;\n\ntypedef struct _USER_SCRIPT_INFORMATION\n{\n    UNICODE_STRING ScriptPath;\n} USER_SCRIPT_INFORMATION, *PUSER_SCRIPT_INFORMATION;\n\ntypedef struct _USER_PROFILE_INFORMATION\n{\n    UNICODE_STRING ProfilePath;\n} USER_PROFILE_INFORMATION, *PUSER_PROFILE_INFORMATION;\n\ntypedef struct _USER_ADMIN_COMMENT_INFORMATION\n{\n    UNICODE_STRING AdminComment;\n} USER_ADMIN_COMMENT_INFORMATION, *PUSER_ADMIN_COMMENT_INFORMATION;\n\ntypedef struct _USER_WORKSTATIONS_INFORMATION\n{\n    UNICODE_STRING WorkStations;\n} USER_WORKSTATIONS_INFORMATION, *PUSER_WORKSTATIONS_INFORMATION;\n\ntypedef struct _USER_SET_PASSWORD_INFORMATION\n{\n    UNICODE_STRING Password;\n    BOOLEAN PasswordExpired;\n} USER_SET_PASSWORD_INFORMATION, *PUSER_SET_PASSWORD_INFORMATION;\n\ntypedef struct _USER_CONTROL_INFORMATION\n{\n    ULONG UserAccountControl;\n} USER_CONTROL_INFORMATION, *PUSER_CONTROL_INFORMATION;\n\ntypedef struct _USER_EXPIRES_INFORMATION\n{\n    LARGE_INTEGER AccountExpires;\n} USER_EXPIRES_INFORMATION, *PUSER_EXPIRES_INFORMATION;\n\n#define CYPHER_BLOCK_LENGTH 8\n\ntypedef struct _CYPHER_BLOCK\n{\n    CHAR data[CYPHER_BLOCK_LENGTH];\n} CYPHER_BLOCK, *PCYPHER_BLOCK;\n\ntypedef struct _ENCRYPTED_NT_OWF_PASSWORD\n{\n    CYPHER_BLOCK data[2];\n} ENCRYPTED_NT_OWF_PASSWORD, *PENCRYPTED_NT_OWF_PASSWORD;\n\ntypedef struct _ENCRYPTED_LM_OWF_PASSWORD\n{\n    CYPHER_BLOCK data[2];\n} ENCRYPTED_LM_OWF_PASSWORD, *PENCRYPTED_LM_OWF_PASSWORD;\n\ntypedef struct _USER_INTERNAL1_INFORMATION\n{\n    ENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword;\n    ENCRYPTED_LM_OWF_PASSWORD EncryptedLmOwfPassword;\n    BOOLEAN NtPasswordPresent;\n    BOOLEAN LmPasswordPresent;\n    BOOLEAN PasswordExpired;\n} USER_INTERNAL1_INFORMATION, *PUSER_INTERNAL1_INFORMATION;\n\ntypedef struct _USER_INTERNAL2_INFORMATION\n{\n    ULONG StatisticsToApply;\n    LARGE_INTEGER LastLogon;\n    LARGE_INTEGER LastLogoff;\n    USHORT BadPasswordCount;\n    USHORT LogonCount;\n} USER_INTERNAL2_INFORMATION, *PUSER_INTERNAL2_INFORMATION;\n\ntypedef struct _USER_PARAMETERS_INFORMATION\n{\n    UNICODE_STRING Parameters;\n} USER_PARAMETERS_INFORMATION, *PUSER_PARAMETERS_INFORMATION;\n\n// Flags for WhichFields in USER_ALL_INFORMATION\n\n#define USER_ALL_USERNAME 0x00000001\n#define USER_ALL_FULLNAME 0x00000002\n#define USER_ALL_USERID 0x00000004\n#define USER_ALL_PRIMARYGROUPID 0x00000008\n#define USER_ALL_ADMINCOMMENT 0x00000010\n#define USER_ALL_USERCOMMENT 0x00000020\n#define USER_ALL_HOMEDIRECTORY 0x00000040\n#define USER_ALL_HOMEDIRECTORYDRIVE 0x00000080\n#define USER_ALL_SCRIPTPATH 0x00000100\n#define USER_ALL_PROFILEPATH 0x00000200\n#define USER_ALL_WORKSTATIONS 0x00000400\n#define USER_ALL_LASTLOGON 0x00000800\n#define USER_ALL_LASTLOGOFF 0x00001000\n#define USER_ALL_LOGONHOURS 0x00002000\n#define USER_ALL_BADPASSWORDCOUNT 0x00004000\n#define USER_ALL_LOGONCOUNT 0x00008000\n#define USER_ALL_PASSWORDCANCHANGE 0x00010000\n#define USER_ALL_PASSWORDMUSTCHANGE 0x00020000\n#define USER_ALL_PASSWORDLASTSET 0x00040000\n#define USER_ALL_ACCOUNTEXPIRES 0x00080000\n#define USER_ALL_USERACCOUNTCONTROL 0x00100000\n#define USER_ALL_PARAMETERS 0x00200000\n#define USER_ALL_COUNTRYCODE 0x00400000\n#define USER_ALL_CODEPAGE 0x00800000\n#define USER_ALL_NTPASSWORDPRESENT 0x01000000 // field AND boolean\n#define USER_ALL_LMPASSWORDPRESENT 0x02000000 // field AND boolean\n#define USER_ALL_PRIVATEDATA 0x04000000 // field AND boolean\n#define USER_ALL_PASSWORDEXPIRED 0x08000000\n#define USER_ALL_SECURITYDESCRIPTOR 0x10000000\n#define USER_ALL_OWFPASSWORD 0x20000000 // boolean\n\n#define USER_ALL_UNDEFINED_MASK 0xc0000000\n\n// Fields that require USER_READ_GENERAL access to read.\n\n#define USER_ALL_READ_GENERAL_MASK \\\n    (USER_ALL_USERNAME | \\\n    USER_ALL_FULLNAME | \\\n    USER_ALL_USERID | \\\n    USER_ALL_PRIMARYGROUPID | \\\n    USER_ALL_ADMINCOMMENT | \\\n    USER_ALL_USERCOMMENT)\n\n// Fields that require USER_READ_LOGON access to read.\n\n#define USER_ALL_READ_LOGON_MASK \\\n   (USER_ALL_HOMEDIRECTORY | \\\n    USER_ALL_HOMEDIRECTORYDRIVE | \\\n    USER_ALL_SCRIPTPATH | \\\n    USER_ALL_PROFILEPATH | \\\n    USER_ALL_WORKSTATIONS | \\\n    USER_ALL_LASTLOGON | \\\n    USER_ALL_LASTLOGOFF | \\\n    USER_ALL_LOGONHOURS | \\\n    USER_ALL_BADPASSWORDCOUNT | \\\n    USER_ALL_LOGONCOUNT | \\\n    USER_ALL_PASSWORDCANCHANGE | \\\n    USER_ALL_PASSWORDMUSTCHANGE)\n\n// Fields that require USER_READ_ACCOUNT access to read.\n\n#define USER_ALL_READ_ACCOUNT_MASK \\\n    (USER_ALL_PASSWORDLASTSET | \\\n    USER_ALL_ACCOUNTEXPIRES | \\\n    USER_ALL_USERACCOUNTCONTROL | \\\n    USER_ALL_PARAMETERS)\n\n// Fields that require USER_READ_PREFERENCES access to read.\n\n#define USER_ALL_READ_PREFERENCES_MASK \\\n    (USER_ALL_COUNTRYCODE | USER_ALL_CODEPAGE)\n\n// Fields that can only be read by trusted clients.\n\n#define USER_ALL_READ_TRUSTED_MASK \\\n    (USER_ALL_NTPASSWORDPRESENT | \\\n    USER_ALL_LMPASSWORDPRESENT | \\\n    USER_ALL_PASSWORDEXPIRED | \\\n    USER_ALL_SECURITYDESCRIPTOR | \\\n    USER_ALL_PRIVATEDATA)\n\n// Fields that can't be read.\n\n#define USER_ALL_READ_CANT_MASK USER_ALL_UNDEFINED_MASK\n\n// Fields that require USER_WRITE_ACCOUNT access to write.\n\n#define USER_ALL_WRITE_ACCOUNT_MASK \\\n    (USER_ALL_USERNAME | \\\n    USER_ALL_FULLNAME | \\\n    USER_ALL_PRIMARYGROUPID | \\\n    USER_ALL_HOMEDIRECTORY | \\\n    USER_ALL_HOMEDIRECTORYDRIVE | \\\n    USER_ALL_SCRIPTPATH | \\\n    USER_ALL_PROFILEPATH | \\\n    USER_ALL_ADMINCOMMENT | \\\n    USER_ALL_WORKSTATIONS | \\\n    USER_ALL_LOGONHOURS | \\\n    USER_ALL_ACCOUNTEXPIRES | \\\n    USER_ALL_USERACCOUNTCONTROL | \\\n    USER_ALL_PARAMETERS)\n\n// Fields that require USER_WRITE_PREFERENCES access to write.\n\n#define USER_ALL_WRITE_PREFERENCES_MASK \\\n    (USER_ALL_USERCOMMENT | USER_ALL_COUNTRYCODE | USER_ALL_CODEPAGE)\n\n// Fields that require USER_FORCE_PASSWORD_CHANGE access to write.\n//\n// Note that non-trusted clients only set the NT password as a\n// UNICODE string. The wrapper will convert it to an LM password,\n// OWF and encrypt both versions. Trusted clients can pass in OWF\n// versions of either or both.\n\n#define USER_ALL_WRITE_FORCE_PASSWORD_CHANGE_MASK \\\n    (USER_ALL_NTPASSWORDPRESENT | \\\n    USER_ALL_LMPASSWORDPRESENT | \\\n    USER_ALL_PASSWORDEXPIRED)\n\n// Fields that can only be written by trusted clients.\n\n#define USER_ALL_WRITE_TRUSTED_MASK \\\n    (USER_ALL_LASTLOGON | \\\n    USER_ALL_LASTLOGOFF | \\\n    USER_ALL_BADPASSWORDCOUNT | \\\n    USER_ALL_LOGONCOUNT | \\\n    USER_ALL_PASSWORDLASTSET | \\\n    USER_ALL_SECURITYDESCRIPTOR | \\\n    USER_ALL_PRIVATEDATA)\n\n// Fields that can't be written.\n\n#define USER_ALL_WRITE_CANT_MASK \\\n    (USER_ALL_USERID | \\\n    USER_ALL_PASSWORDCANCHANGE | \\\n    USER_ALL_PASSWORDMUSTCHANGE | \\\n    USER_ALL_UNDEFINED_MASK)\n\n#include <pshpack4.h>\ntypedef struct _USER_ALL_INFORMATION\n{\n    LARGE_INTEGER LastLogon;\n    LARGE_INTEGER LastLogoff;\n    LARGE_INTEGER PasswordLastSet;\n    LARGE_INTEGER AccountExpires;\n    LARGE_INTEGER PasswordCanChange;\n    LARGE_INTEGER PasswordMustChange;\n    UNICODE_STRING UserName;\n    UNICODE_STRING FullName;\n    UNICODE_STRING HomeDirectory;\n    UNICODE_STRING HomeDirectoryDrive;\n    UNICODE_STRING ScriptPath;\n    UNICODE_STRING ProfilePath;\n    UNICODE_STRING AdminComment;\n    UNICODE_STRING WorkStations;\n    UNICODE_STRING UserComment;\n    UNICODE_STRING Parameters;\n    UNICODE_STRING LmPassword;\n    UNICODE_STRING NtPassword;\n    UNICODE_STRING PrivateData;\n    SR_SECURITY_DESCRIPTOR SecurityDescriptor;\n    ULONG UserId;\n    ULONG PrimaryGroupId;\n    ULONG UserAccountControl;\n    ULONG WhichFields;\n    LOGON_HOURS LogonHours;\n    USHORT BadPasswordCount;\n    USHORT LogonCount;\n    USHORT CountryCode;\n    USHORT CodePage;\n    BOOLEAN LmPasswordPresent;\n    BOOLEAN NtPasswordPresent;\n    BOOLEAN PasswordExpired;\n    BOOLEAN PrivateDataSensitive;\n} USER_ALL_INFORMATION, *PUSER_ALL_INFORMATION;\n#include <poppack.h>\n\n#include <pshpack4.h>\ntypedef struct _USER_INTERNAL3_INFORMATION\n{\n    USER_ALL_INFORMATION I1;\n    LARGE_INTEGER LastBadPasswordTime;\n} USER_INTERNAL3_INFORMATION, *PUSER_INTERNAL3_INFORMATION;\n#include <poppack.h>\n\ntypedef struct _ENCRYPTED_USER_PASSWORD\n{\n    UCHAR Buffer[(SAM_MAX_PASSWORD_LENGTH * 2) + 4];\n} ENCRYPTED_USER_PASSWORD, *PENCRYPTED_USER_PASSWORD;\n\ntypedef struct _USER_INTERNAL4_INFORMATION\n{\n    USER_ALL_INFORMATION I1;\n    ENCRYPTED_USER_PASSWORD UserPassword;\n} USER_INTERNAL4_INFORMATION, *PUSER_INTERNAL4_INFORMATION;\n\ntypedef struct _USER_INTERNAL5_INFORMATION\n{\n    ENCRYPTED_USER_PASSWORD UserPassword;\n    BOOLEAN PasswordExpired;\n} USER_INTERNAL5_INFORMATION, *PUSER_INTERNAL5_INFORMATION;\n\ntypedef struct _ENCRYPTED_USER_PASSWORD_NEW\n{\n    UCHAR Buffer[(SAM_MAX_PASSWORD_LENGTH * 2) + 4 + SAM_PASSWORD_ENCRYPTION_SALT_LEN];\n} ENCRYPTED_USER_PASSWORD_NEW, *PENCRYPTED_USER_PASSWORD_NEW;\n\ntypedef struct _USER_INTERNAL4_INFORMATION_NEW\n{\n    USER_ALL_INFORMATION I1;\n    ENCRYPTED_USER_PASSWORD_NEW UserPassword;\n} USER_INTERNAL4_INFORMATION_NEW, *PUSER_INTERNAL4_INFORMATION_NEW;\n\ntypedef struct _USER_INTERNAL5_INFORMATION_NEW\n{\n    ENCRYPTED_USER_PASSWORD_NEW UserPassword;\n    BOOLEAN PasswordExpired;\n} USER_INTERNAL5_INFORMATION_NEW, *PUSER_INTERNAL5_INFORMATION_NEW;\n\ntypedef struct _USER_ALLOWED_TO_DELEGATE_TO_LIST\n{\n    ULONG Size;\n    ULONG NumSPNs;\n    UNICODE_STRING SPNList[ANYSIZE_ARRAY];\n} USER_ALLOWED_TO_DELEGATE_TO_LIST, *PUSER_ALLOWED_TO_DELEGATE_TO_LIST;\n\n#define USER_EXTENDED_FIELD_UPN 0x00000001L\n#define USER_EXTENDED_FIELD_A2D2 0x00000002L\n\ntypedef struct _USER_INTERNAL6_INFORMATION\n{\n    USER_ALL_INFORMATION I1;\n    LARGE_INTEGER LastBadPasswordTime;\n    ULONG ExtendedFields;\n    BOOLEAN UPNDefaulted;\n    UNICODE_STRING UPN;\n    PUSER_ALLOWED_TO_DELEGATE_TO_LIST A2D2List;\n} USER_INTERNAL6_INFORMATION, *PUSER_INTERNAL6_INFORMATION;\n\ntypedef SAM_BYTE_ARRAY_32K SAM_USER_TILE, *PSAM_USER_TILE;\n\n// 0xff000fff is reserved for internal callers and implementation.\n\n#define USER_EXTENDED_FIELD_USER_TILE (0x00001000L)\n#define USER_EXTENDED_FIELD_PASSWORD_HINT (0x00002000L)\n#define USER_EXTENDED_FIELD_DONT_SHOW_IN_LOGON_UI (0x00004000L)\n#define USER_EXTENDED_FIELD_SHELL_ADMIN_OBJECT_PROPERTIES (0x00008000L)\n\ntypedef struct _USER_EXTENDED_INFORMATION\n{\n    ULONG ExtendedWhichFields;\n    SAM_USER_TILE UserTile;\n    UNICODE_STRING PasswordHint;\n    BOOLEAN DontShowInLogonUI;\n    SAM_SHELL_OBJECT_PROPERTIES ShellAdminObjectProperties;\n} USER_EXTENDED_INFORMATION, *PUSER_EXTENDED_INFORMATION;\n\n// For local callers only.\ntypedef struct _USER_LOGON_UI_INFORMATION\n{\n    BOOLEAN PasswordIsBlank;\n    BOOLEAN AccountIsDisabled;\n} USER_LOGON_UI_INFORMATION, *PUSER_LOGON_UI_INFORMATION;\n\ntypedef struct _ENCRYPTED_PASSWORD_AES\n{\n    UCHAR AuthData[64];\n    UCHAR Salt[SAM_PASSWORD_ENCRYPTION_SALT_LEN];\n    ULONG cbCipher;\n    PUCHAR Cipher;\n    ULONGLONG PBKDF2Iterations;\n} ENCRYPTED_PASSWORD_AES, *PENCRYPTED_PASSWORD_AES;\n\ntypedef struct _USER_INTERNAL7_INFORMATION\n{\n    ENCRYPTED_PASSWORD_AES UserPassword;\n    BOOLEAN PasswordExpired;\n} USER_INTERNAL7_INFORMATION, *PUSER_INTERNAL7_INFORMATION;\n\ntypedef struct _USER_INTERNAL8_INFORMATION\n{\n    USER_ALL_INFORMATION I1;\n    ENCRYPTED_PASSWORD_AES UserPassword;\n} USER_INTERNAL8_INFORMATION, *PUSER_INTERNAL8_INFORMATION;\n\n// SamChangePasswordUser3 types\n\n// Error values:\n// * SAM_PWD_CHANGE_NO_ERROR\n// * SAM_PWD_CHANGE_PASSWORD_TOO_SHORT\n// * SAM_PWD_CHANGE_PWD_IN_HISTORY\n// * SAM_PWD_CHANGE_USERNAME_IN_PASSWORD\n// * SAM_PWD_CHANGE_FULLNAME_IN_PASSWORD\n// * SAM_PWD_CHANGE_MACHINE_PASSWORD_NOT_DEFAULT\n// * SAM_PWD_CHANGE_FAILED_BY_FILTER\n\ntypedef struct _USER_PWD_CHANGE_FAILURE_INFORMATION\n{\n    ULONG ExtendedFailureReason;\n    UNICODE_STRING FilterModuleName;\n} USER_PWD_CHANGE_FAILURE_INFORMATION, *PUSER_PWD_CHANGE_FAILURE_INFORMATION;\n\n// ExtendedFailureReason values\n\n#define SAM_PWD_CHANGE_NO_ERROR 0\n#define SAM_PWD_CHANGE_PASSWORD_TOO_SHORT 1\n#define SAM_PWD_CHANGE_PWD_IN_HISTORY 2\n#define SAM_PWD_CHANGE_USERNAME_IN_PASSWORD 3\n#define SAM_PWD_CHANGE_FULLNAME_IN_PASSWORD 4\n#define SAM_PWD_CHANGE_NOT_COMPLEX 5\n#define SAM_PWD_CHANGE_MACHINE_PASSWORD_NOT_DEFAULT 6\n#define SAM_PWD_CHANGE_FAILED_BY_FILTER 7\n#define SAM_PWD_CHANGE_PASSWORD_TOO_LONG 8\n#define SAM_PWD_CHANGE_FAILURE_REASON_MAX 8\n\n// Functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamEnumerateUsersInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _Inout_ PSAM_ENUMERATE_HANDLE EnumerationContext,\n    _In_ ULONG UserAccountControl,\n    _Outptr_ PVOID *Buffer, // PSAM_RID_ENUMERATION *\n    _In_ ULONG PreferedMaximumLength,\n    _Out_ PULONG CountReturned\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamCreateUserInDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ PCUNICODE_STRING AccountName,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PSAM_HANDLE UserHandle,\n    _Out_ PULONG RelativeId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamCreateUser2InDomain(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ PCUNICODE_STRING AccountName,\n    _In_ ULONG AccountType,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PSAM_HANDLE UserHandle,\n    _Out_ PULONG GrantedAccess,\n    _Out_ PULONG RelativeId\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamOpenUser(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG UserId,\n    _Out_ PSAM_HANDLE UserHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamDeleteUser(\n    _In_ SAM_HANDLE UserHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryInformationUser(\n    _In_ SAM_HANDLE UserHandle,\n    _In_ USER_INFORMATION_CLASS UserInformationClass,\n    _Outptr_ PVOID *Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamSetInformationUser(\n    _In_ SAM_HANDLE UserHandle,\n    _In_ USER_INFORMATION_CLASS UserInformationClass,\n    _In_ PVOID Buffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetGroupsForUser(\n    _In_ SAM_HANDLE UserHandle,\n    _Out_ _Deref_post_count_(*MembershipCount) PGROUP_MEMBERSHIP *Groups,\n    _Out_ PULONG MembershipCount\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamChangePasswordUser(\n    _In_ SAM_HANDLE UserHandle,\n    _In_ PCUNICODE_STRING OldPassword,\n    _In_ PCUNICODE_STRING NewPassword\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamChangePasswordUser2(\n    _In_ PCUNICODE_STRING ServerName,\n    _In_ PCUNICODE_STRING UserName,\n    _In_ PCUNICODE_STRING OldPassword,\n    _In_ PCUNICODE_STRING NewPassword\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamChangePasswordUser3(\n    _In_ PCUNICODE_STRING ServerName,\n    _In_ PCUNICODE_STRING UserName,\n    _In_ PCUNICODE_STRING OldPassword,\n    _In_ PCUNICODE_STRING NewPassword,\n    _Outptr_ PDOMAIN_PASSWORD_INFORMATION *EffectivePasswordPolicy,\n    _Outptr_ PUSER_PWD_CHANGE_FAILURE_INFORMATION *PasswordChangeFailureInfo\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamQueryDisplayInformation(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ DOMAIN_DISPLAY_INFORMATION DisplayInformation,\n    _In_ ULONG Index,\n    _In_ ULONG EntryCount,\n    _In_ ULONG PreferredMaximumLength,\n    _Out_ PULONG TotalAvailable,\n    _Out_ PULONG TotalReturned,\n    _Out_ PULONG ReturnedEntryCount,\n    _Outptr_ PVOID *SortedBuffer\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetDisplayEnumerationIndex(\n    _In_ SAM_HANDLE DomainHandle,\n    _In_ DOMAIN_DISPLAY_INFORMATION DisplayInformation,\n    _In_ PCUNICODE_STRING Prefix,\n    _Out_ PULONG Index\n    );\n\n// Database replication\n\ntypedef enum _SECURITY_DB_DELTA_TYPE\n{\n    SecurityDbNew = 1,\n    SecurityDbRename,\n    SecurityDbDelete,\n    SecurityDbChangeMemberAdd,\n    SecurityDbChangeMemberSet,\n    SecurityDbChangeMemberDel,\n    SecurityDbChange,\n    SecurityDbChangePassword\n} SECURITY_DB_DELTA_TYPE, *PSECURITY_DB_DELTA_TYPE;\n\ntypedef enum _SECURITY_DB_OBJECT_TYPE\n{\n    SecurityDbObjectSamDomain = 1,\n    SecurityDbObjectSamUser,\n    SecurityDbObjectSamGroup,\n    SecurityDbObjectSamAlias,\n    SecurityDbObjectLsaPolicy,\n    SecurityDbObjectLsaTDomain,\n    SecurityDbObjectLsaAccount,\n    SecurityDbObjectLsaSecret\n} SECURITY_DB_OBJECT_TYPE, *PSECURITY_DB_OBJECT_TYPE;\n\ntypedef enum _SAM_ACCOUNT_TYPE\n{\n    SamObjectUser = 1,\n    SamObjectGroup,\n    SamObjectAlias\n} SAM_ACCOUNT_TYPE, *PSAM_ACCOUNT_TYPE;\n\n#define SAM_USER_ACCOUNT (0x00000001)\n#define SAM_GLOBAL_GROUP_ACCOUNT (0x00000002)\n#define SAM_LOCAL_GROUP_ACCOUNT (0x00000004)\n\ntypedef struct _SAM_GROUP_MEMBER_ID\n{\n    ULONG MemberRid;\n} SAM_GROUP_MEMBER_ID, *PSAM_GROUP_MEMBER_ID;\n\ntypedef struct _SAM_ALIAS_MEMBER_ID\n{\n    PSID MemberSid;\n} SAM_ALIAS_MEMBER_ID, *PSAM_ALIAS_MEMBER_ID;\n\ntypedef union _SAM_DELTA_DATA\n{\n    SAM_GROUP_MEMBER_ID GroupMemberId;\n    SAM_ALIAS_MEMBER_ID AliasMemberId;\n    ULONG AccountControl;\n} SAM_DELTA_DATA, *PSAM_DELTA_DATA;\n\ntypedef NTSTATUS (NTAPI *PSAM_DELTA_NOTIFICATION_ROUTINE)(\n    _In_ PSID DomainSid,\n    _In_ SECURITY_DB_DELTA_TYPE DeltaType,\n    _In_ SECURITY_DB_OBJECT_TYPE ObjectType,\n    _In_ ULONG ObjectRid,\n    _In_opt_ PCUNICODE_STRING ObjectName,\n    _In_ PLARGE_INTEGER ModifiedCount,\n    _In_opt_ PSAM_DELTA_DATA DeltaData\n    );\n\n#define SAM_DELTA_NOTIFY_ROUTINE \"DeltaNotify\"\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamRegisterObjectChangeNotification(\n    _In_ SECURITY_DB_OBJECT_TYPE ObjectType,\n    _In_ HANDLE NotificationEventHandle\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamUnregisterObjectChangeNotification(\n    _In_ SECURITY_DB_OBJECT_TYPE ObjectType,\n    _In_ HANDLE NotificationEventHandle\n    );\n\n// Compatibility mode\n\n#define SAM_SID_COMPATIBILITY_ALL 0\n#define SAM_SID_COMPATIBILITY_LAX 1\n#define SAM_SID_COMPATIBILITY_STRICT 2\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamGetCompatibilityMode(\n    _In_ SAM_HANDLE ObjectHandle,\n    _Out_ ULONG *Mode\n    );\n\n// Password validation\n\ntypedef enum _PASSWORD_POLICY_VALIDATION_TYPE\n{\n    SamValidateAuthentication = 1,\n    SamValidatePasswordChange,\n    SamValidatePasswordReset\n} PASSWORD_POLICY_VALIDATION_TYPE;\n\ntypedef struct _SAM_VALIDATE_PASSWORD_HASH\n{\n    ULONG Length;\n    _Field_size_bytes_(Length) PUCHAR Hash;\n} SAM_VALIDATE_PASSWORD_HASH, *PSAM_VALIDATE_PASSWORD_HASH;\n\n// Flags for PresentFields in SAM_VALIDATE_PERSISTED_FIELDS\n\n#define SAM_VALIDATE_PASSWORD_LAST_SET 0x00000001\n#define SAM_VALIDATE_BAD_PASSWORD_TIME 0x00000002\n#define SAM_VALIDATE_LOCKOUT_TIME 0x00000004\n#define SAM_VALIDATE_BAD_PASSWORD_COUNT 0x00000008\n#define SAM_VALIDATE_PASSWORD_HISTORY_LENGTH 0x00000010\n#define SAM_VALIDATE_PASSWORD_HISTORY 0x00000020\n\ntypedef struct _SAM_VALIDATE_PERSISTED_FIELDS\n{\n    ULONG PresentFields;\n    LARGE_INTEGER PasswordLastSet;\n    LARGE_INTEGER BadPasswordTime;\n    LARGE_INTEGER LockoutTime;\n    ULONG BadPasswordCount;\n    ULONG PasswordHistoryLength;\n    _Field_size_bytes_(PasswordHistoryLength) PSAM_VALIDATE_PASSWORD_HASH PasswordHistory;\n} SAM_VALIDATE_PERSISTED_FIELDS, *PSAM_VALIDATE_PERSISTED_FIELDS;\n\ntypedef enum _SAM_VALIDATE_VALIDATION_STATUS\n{\n    SamValidateSuccess = 0,\n    SamValidatePasswordMustChange,\n    SamValidateAccountLockedOut,\n    SamValidatePasswordExpired,\n    SamValidatePasswordIncorrect,\n    SamValidatePasswordIsInHistory,\n    SamValidatePasswordTooShort,\n    SamValidatePasswordTooLong,\n    SamValidatePasswordNotComplexEnough,\n    SamValidatePasswordTooRecent,\n    SamValidatePasswordFilterError\n} SAM_VALIDATE_VALIDATION_STATUS, *PSAM_VALIDATE_VALIDATION_STATUS;\n\ntypedef struct _SAM_VALIDATE_STANDARD_OUTPUT_ARG\n{\n    SAM_VALIDATE_PERSISTED_FIELDS ChangedPersistedFields;\n    SAM_VALIDATE_VALIDATION_STATUS ValidationStatus;\n} SAM_VALIDATE_STANDARD_OUTPUT_ARG, *PSAM_VALIDATE_STANDARD_OUTPUT_ARG;\n\ntypedef struct _SAM_VALIDATE_AUTHENTICATION_INPUT_ARG\n{\n    SAM_VALIDATE_PERSISTED_FIELDS InputPersistedFields;\n    BOOLEAN PasswordMatched;\n} SAM_VALIDATE_AUTHENTICATION_INPUT_ARG, *PSAM_VALIDATE_AUTHENTICATION_INPUT_ARG;\n\ntypedef struct _SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG\n{\n    SAM_VALIDATE_PERSISTED_FIELDS InputPersistedFields;\n    UNICODE_STRING ClearPassword;\n    UNICODE_STRING UserAccountName;\n    SAM_VALIDATE_PASSWORD_HASH HashedPassword;\n    BOOLEAN PasswordMatch; // denotes if the old password supplied by user matched or not\n} SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG, *PSAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;\n\ntypedef struct _SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG\n{\n    SAM_VALIDATE_PERSISTED_FIELDS InputPersistedFields;\n    UNICODE_STRING ClearPassword;\n    UNICODE_STRING UserAccountName;\n    SAM_VALIDATE_PASSWORD_HASH HashedPassword;\n    BOOLEAN PasswordMustChangeAtNextLogon; // looked at only for password reset\n    BOOLEAN ClearLockout; // can be used clear user account lockout\n} SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG, *PSAM_VALIDATE_PASSWORD_RESET_INPUT_ARG;\n\ntypedef union _SAM_VALIDATE_INPUT_ARG\n{\n    SAM_VALIDATE_AUTHENTICATION_INPUT_ARG ValidateAuthenticationInput;\n    SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG ValidatePasswordChangeInput;\n    SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG ValidatePasswordResetInput;\n} SAM_VALIDATE_INPUT_ARG, *PSAM_VALIDATE_INPUT_ARG;\n\ntypedef union _SAM_VALIDATE_OUTPUT_ARG\n{\n    SAM_VALIDATE_STANDARD_OUTPUT_ARG ValidateAuthenticationOutput;\n    SAM_VALIDATE_STANDARD_OUTPUT_ARG ValidatePasswordChangeOutput;\n    SAM_VALIDATE_STANDARD_OUTPUT_ARG ValidatePasswordResetOutput;\n} SAM_VALIDATE_OUTPUT_ARG, *PSAM_VALIDATE_OUTPUT_ARG;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamValidatePassword(\n    _In_opt_ PCUNICODE_STRING ServerName,\n    _In_ PASSWORD_POLICY_VALIDATION_TYPE ValidationType,\n    _In_ PSAM_VALIDATE_INPUT_ARG InputArg,\n    _Out_ PSAM_VALIDATE_OUTPUT_ARG *OutputArg\n    );\n\n// Generic operation\n\ntypedef enum _SAM_GENERIC_OPERATION_TYPE\n{\n    SamObjectChangeNotificationOperation\n} SAM_GENERIC_OPERATION_TYPE, *PSAM_GENERIC_OPERATION_TYPE;\n\ntypedef struct _SAM_OPERATION_OBJCHG_INPUT\n{\n    BOOLEAN Register;\n    ULONG64 EventHandle;\n    SECURITY_DB_OBJECT_TYPE ObjectType;\n    ULONG ProcessID;\n} SAM_OPERATION_OBJCHG_INPUT, *PSAM_OPERATION_OBJCHG_INPUT;\n\ntypedef struct _SAM_OPERATION_OBJCHG_OUTPUT\n{\n    ULONG Reserved;\n} SAM_OPERATION_OBJCHG_OUTPUT, *PSAM_OPERATION_OBJCHG_OUTPUT;\n\ntypedef union _SAM_GENERIC_OPERATION_INPUT\n{\n    SAM_OPERATION_OBJCHG_INPUT ObjChangeIn;\n} SAM_GENERIC_OPERATION_INPUT, *PSAM_GENERIC_OPERATION_INPUT;\n\ntypedef union _SAM_GENERIC_OPERATION_OUTPUT\n{\n    SAM_OPERATION_OBJCHG_OUTPUT ObjChangeOut;\n} SAM_GENERIC_OPERATION_OUTPUT, *PSAM_GENERIC_OPERATION_OUTPUT;\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nSamPerformGenericOperation(\n    _In_opt_ PWSTR ServerName,\n    _In_ SAM_GENERIC_OPERATION_TYPE OperationType,\n    _In_ PSAM_GENERIC_OPERATION_INPUT OperationIn,\n    _Out_ PSAM_GENERIC_OPERATION_OUTPUT *OperationOut\n    );\n\n#endif // _NTSAM_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntseapi.h",
    "content": "/*\n * Authorization functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTSEAPI_H\n#define _NTSEAPI_H\n\n//\n// Privileges\n//\n\n#define SE_MIN_WELL_KNOWN_PRIVILEGE (2L)\n#define SE_CREATE_TOKEN_PRIVILEGE (2L)              // Required to create a primary token.\n#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE (3L)        // Required to assign the primary token of a process.\n#define SE_LOCK_MEMORY_PRIVILEGE (4L)               // Required to lock physical pages in memory.\n#define SE_INCREASE_QUOTA_PRIVILEGE (5L)            // Required to increase the quota assigned to a process.\n#define SE_MACHINE_ACCOUNT_PRIVILEGE (6L)           // Required to create a computer account.\n#define SE_TCB_PRIVILEGE (7L)                       // Required to act as part of the Trusted Computer Base.\n#define SE_SECURITY_PRIVILEGE (8L)                  // Required to perform a number of security-related functions, such as controlling and viewing audit messages. // Security operator.\n#define SE_TAKE_OWNERSHIP_PRIVILEGE (9L)            // Required to take ownership of an object without being granted discretionary access. \n#define SE_LOAD_DRIVER_PRIVILEGE (10L)              // Required to load or unload a device driver.\n#define SE_SYSTEM_PROFILE_PRIVILEGE (11L)           // Required to gather profiling information for the entire system.\n#define SE_SYSTEMTIME_PRIVILEGE (12L)               // Required to modify the system time.\n#define SE_PROF_SINGLE_PROCESS_PRIVILEGE (13L)      // Required to gather profiling information for a single process.\n#define SE_INC_BASE_PRIORITY_PRIVILEGE (14L)        // Required to increase the base priority of a process.\n#define SE_CREATE_PAGEFILE_PRIVILEGE (15L)          // Required to create a paging file.\n#define SE_CREATE_PERMANENT_PRIVILEGE (16L)         // Required to create a permanent object.\n#define SE_BACKUP_PRIVILEGE (17L)                   // Required to perform backup operations. This privilege causes the system to grant all read access control to any file.\n#define SE_RESTORE_PRIVILEGE (18L)                  // Required to perform restore operations. This privilege causes the system to grant all write access control to any file.\n#define SE_SHUTDOWN_PRIVILEGE (19L)                 // Required to shut down a local system.\n#define SE_DEBUG_PRIVILEGE (20L)                    // Required to debug and adjust memory of any process, ignoring the DACL for the process.\n#define SE_AUDIT_PRIVILEGE (21L)                    // Required to generate audit-log entries.\n#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE (22L)       // Required to modify UEFI variables of systems that use this type of memory to store configuration information.\n#define SE_CHANGE_NOTIFY_PRIVILEGE (23L)            // Required to receive notifications of changes to files or directories and skip all traversal access checks. It is enabled by default for all users.\n#define SE_REMOTE_SHUTDOWN_PRIVILEGE (24L)          // Required to shut down a system using a network request.\n#define SE_UNDOCK_PRIVILEGE (25L)                   // Required to undock a laptop.\n#define SE_SYNC_AGENT_PRIVILEGE (26L)               // Required for a domain controller to use the Lightweight Directory Access Protocol (LDAP) directory synchronization services. \n#define SE_ENABLE_DELEGATION_PRIVILEGE (27L)        // Required to mark user and computer accounts as trusted for delegation.\n#define SE_MANAGE_VOLUME_PRIVILEGE (28L)            // Required to enable volume management privileges.\n#define SE_IMPERSONATE_PRIVILEGE (29L)              // Required to impersonate a client after authentication.\n#define SE_CREATE_GLOBAL_PRIVILEGE (30L)            // Required to create named file mapping objects in the global namespace during Terminal Services sessions. It is enabled by default for all administrators.\n#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE (31L)   // Required to access Credential Manager as a trusted caller.\n#define SE_RELABEL_PRIVILEGE (32L)                  // Required to modify the mandatory integrity level of an object.\n#define SE_INC_WORKING_SET_PRIVILEGE (33L)          // Required to allocate more memory for applications that run in the context of users.\n#define SE_TIME_ZONE_PRIVILEGE (34L)                // Required to adjust the time zone associated with the computer's internal clock.\n#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE (35L)     // Required to create a symbolic link.\n#define SE_DELEGATE_SESSION_USER_IMPERSONATE_PRIVILEGE (36L) // Required to obtain an impersonation token for another user in the same session.\n#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_DELEGATE_SESSION_USER_IMPERSONATE_PRIVILEGE\n\n//\n// Authz\n//\n\n// begin_rev\n\n#if (PHNT_MODE == PHNT_MODE_KERNEL)\ntypedef enum _TOKEN_INFORMATION_CLASS\n{\n    TokenUser = 1, // q: TOKEN_USER, SE_TOKEN_USER\n    TokenGroups, // q: TOKEN_GROUPS\n    TokenPrivileges, // q: TOKEN_PRIVILEGES\n    TokenOwner, // q; s: TOKEN_OWNER\n    TokenPrimaryGroup, // q; s: TOKEN_PRIMARY_GROUP\n    TokenDefaultDacl, // q; s: TOKEN_DEFAULT_DACL\n    TokenSource, // q: TOKEN_SOURCE\n    TokenType, // q: TOKEN_TYPE\n    TokenImpersonationLevel, // q: SECURITY_IMPERSONATION_LEVEL\n    TokenStatistics, // q: TOKEN_STATISTICS // 10\n    TokenRestrictedSids, // q: TOKEN_GROUPS\n    TokenSessionId, // q; s: ULONG (requires SeTcbPrivilege)\n    TokenGroupsAndPrivileges, // q: TOKEN_GROUPS_AND_PRIVILEGES\n    TokenSessionReference, // s: ULONG (requires SeTcbPrivilege)\n    TokenSandBoxInert, // q: ULONG\n    TokenAuditPolicy, // q; s: TOKEN_AUDIT_POLICY (requires SeSecurityPrivilege/SeTcbPrivilege)\n    TokenOrigin, // q; s: TOKEN_ORIGIN (requires SeTcbPrivilege)\n    TokenElevationType, // q: TOKEN_ELEVATION_TYPE\n    TokenLinkedToken, // q; s: TOKEN_LINKED_TOKEN (requires SeCreateTokenPrivilege)\n    TokenElevation, // q: TOKEN_ELEVATION // 20\n    TokenHasRestrictions, // q: ULONG\n    TokenAccessInformation, // q: TOKEN_ACCESS_INFORMATION\n    TokenVirtualizationAllowed, // q; s: ULONG (requires SeCreateTokenPrivilege)\n    TokenVirtualizationEnabled, // q; s: ULONG\n    TokenIntegrityLevel, // q; s: TOKEN_MANDATORY_LABEL\n    TokenUIAccess, // q; s: ULONG (requires SeTcbPrivilege)\n    TokenMandatoryPolicy, // q; s: TOKEN_MANDATORY_POLICY (requires SeTcbPrivilege)\n    TokenLogonSid, // q: TOKEN_GROUPS\n    TokenIsAppContainer, // q: ULONG // since WIN8\n    TokenCapabilities, // q: TOKEN_GROUPS // 30\n    TokenAppContainerSid, // q: TOKEN_APPCONTAINER_INFORMATION\n    TokenAppContainerNumber, // q: ULONG\n    TokenUserClaimAttributes, // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n    TokenDeviceClaimAttributes, // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n    TokenRestrictedUserClaimAttributes, // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n    TokenRestrictedDeviceClaimAttributes, // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n    TokenDeviceGroups, // q: TOKEN_GROUPS\n    TokenRestrictedDeviceGroups, // q: TOKEN_GROUPS\n    TokenSecurityAttributes, // q; s: TOKEN_SECURITY_ATTRIBUTES_[AND_OPERATION_]INFORMATION (requires SeTcbPrivilege)\n    TokenIsRestricted, // q: ULONG // 40\n    TokenProcessTrustLevel, // q: TOKEN_PROCESS_TRUST_LEVEL // since WINBLUE\n    TokenPrivateNameSpace, // q; s: ULONG (requires SeTcbPrivilege) // since THRESHOLD\n    TokenSingletonAttributes, // q: TOKEN_SECURITY_ATTRIBUTES_INFORMATION // since REDSTONE\n    TokenBnoIsolation, // q: TOKEN_BNO_ISOLATION_INFORMATION // since REDSTONE2\n    TokenChildProcessFlags, // s: ULONG  (requires SeTcbPrivilege) // since REDSTONE3\n    TokenIsLessPrivilegedAppContainer, // q: ULONG // since REDSTONE5\n    TokenIsSandboxed, // q: ULONG // since 19H1\n    TokenIsAppSilo, // q: ULONG // since WIN11 22H2 // previously TokenOriginatingProcessTrustLevel // q: TOKEN_PROCESS_TRUST_LEVEL\n    TokenLoggingInformation, // TOKEN_LOGGING_INFORMATION // since 24H2\n    MaxTokenInfoClass\n} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;\n#else\n#define TOKEN_INFORMATION_CLASS ULONG\n//#define TokenUser 1 // q: TOKEN_USER, SE_TOKEN_USER\n//#define TokenGroups 2 // q: TOKEN_GROUPS\n//#define TokenPrivileges 3 // q: TOKEN_PRIVILEGES\n//#define TokenOwner 4 // q; s: TOKEN_OWNER\n#define TokenPrimaryGroup 5 // q; s: TOKEN_PRIMARY_GROUP\n#define TokenDefaultDacl 6 // q; s: TOKEN_DEFAULT_DACL\n#define TokenSource 7 // q: TOKEN_SOURCE\n//#define TokenType 8 // q: TOKEN_TYPE\n#define TokenImpersonationLevel 9 // q: SECURITY_IMPERSONATION_LEVEL\n#define TokenStatistics 10 // q: TOKEN_STATISTICS // 10\n#define TokenRestrictedSids 11 // q: TOKEN_GROUPS\n#define TokenSessionId 12 // q; s: ULONG (requires SeTcbPrivilege)\n#define TokenGroupsAndPrivileges 13 // q: TOKEN_GROUPS_AND_PRIVILEGES\n#define TokenSessionReference 14 // s: ULONG (requires SeTcbPrivilege)\n#define TokenSandBoxInert 15 // q: ULONG\n#define TokenAuditPolicy 16 // q; s: TOKEN_AUDIT_POLICY (requires SeSecurityPrivilege/SeTcbPrivilege)\n#define TokenOrigin 17 // q; s: TOKEN_ORIGIN (requires SeTcbPrivilege)\n//#define TokenElevationType 18 // q: TOKEN_ELEVATION_TYPE\n#define TokenLinkedToken 19 // q; s: TOKEN_LINKED_TOKEN (requires SeCreateTokenPrivilege)\n//#define TokenElevation 20 // q: TOKEN_ELEVATION // 20\n#define TokenHasRestrictions 21 // q: ULONG\n#define TokenAccessInformation 22 // q: TOKEN_ACCESS_INFORMATION\n#define TokenVirtualizationAllowed 23 // q; s: ULONG (requires SeCreateTokenPrivilege)\n#define TokenVirtualizationEnabled 24 // q; s: ULONG\n#define TokenIntegrityLevel 25 // q; s: TOKEN_MANDATORY_LABEL\n#define TokenUIAccess 26 // q; s: ULONG (requires SeTcbPrivilege)\n#define TokenMandatoryPolicy 27 // q; s: TOKEN_MANDATORY_POLICY (requires SeTcbPrivilege)\n#define TokenLogonSid 28 // q: TOKEN_GROUPS\n#define TokenIsAppContainer 29 // q: ULONG // since WIN8\n#define TokenCapabilities 30 // q: TOKEN_GROUPS // 30\n//#define TokenAppContainerSid 31 // q: TOKEN_APPCONTAINER_INFORMATION\n#define TokenAppContainerNumber 32 // q: ULONG\n#define TokenUserClaimAttributes 33 // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n#define TokenDeviceClaimAttributes 34 // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n#define TokenRestrictedUserClaimAttributes 35 // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n#define TokenRestrictedDeviceClaimAttributes 36 // q: CLAIM_SECURITY_ATTRIBUTES_INFORMATION\n#define TokenDeviceGroups 37 // q: TOKEN_GROUPS\n#define TokenRestrictedDeviceGroups 38 // q: TOKEN_GROUPS\n#define TokenSecurityAttributes 39 // q; s: TOKEN_SECURITY_ATTRIBUTES_[AND_OPERATION_]INFORMATION (requires SeTcbPrivilege)\n#define TokenIsRestricted 40 // q: ULONG // 40\n#define TokenProcessTrustLevel 41 // q: TOKEN_PROCESS_TRUST_LEVEL // since WINBLUE\n#define TokenPrivateNameSpace 42// q; s: ULONG (requires SeTcbPrivilege) // since THRESHOLD\n#define TokenSingletonAttributes 43 // q: TOKEN_SECURITY_ATTRIBUTES_INFORMATION // since REDSTONE\n#define TokenBnoIsolation 44 // q: TOKEN_BNO_ISOLATION_INFORMATION // since REDSTONE2\n#define TokenChildProcessFlags 45 // s: ULONG  (requires SeTcbPrivilege) // since REDSTONE3\n#define TokenIsLessPrivilegedAppContainer 46 // q: ULONG // since REDSTONE5\n#define TokenIsSandboxed 47 // q: ULONG // since 19H1\n#define TokenIsAppSilo 48 // q: ULONG // since 22H2 // previously TokenOriginatingProcessTrustLevel // q: TOKEN_PROCESS_TRUST_LEVEL\n#define TokenLoggingInformation 49 // TOKEN_LOGGING_INFORMATION // since 24H2\n#define MaxTokenInfoClass 50\n#endif // (PHNT_MODE == PHNT_MODE_KERNEL)\n\n//\n// Types\n//\n\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_INVALID 0x00\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_INT64 0x01\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_UINT64 0x02\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING 0x03 // Case insensitive attribute value string by default. Unless the flag TOKEN_SECURITY_ATTRIBUTE_VALUE_CASE_SENSITIVE is set.\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_FQBN 0x04 // Fully-qualified binary name.\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_SID 0x05\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_BOOLEAN 0x06\n#define TOKEN_SECURITY_ATTRIBUTE_TYPE_OCTET_STRING 0x10\n\n//\n// Flags\n//\n\n// Attribute must not be inherited across process spawns.\n#define TOKEN_SECURITY_ATTRIBUTE_NON_INHERITABLE 0x0001\n// Attribute value is compared in a case sensitive way. It is valid with string value\n// or composite type containing string value. For other types of value, this flag\n// will be ignored. Currently, it is valid with the two types:\n// TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING and TOKEN_SECURITY_ATTRIBUTE_TYPE_FQBN.\n#define TOKEN_SECURITY_ATTRIBUTE_VALUE_CASE_SENSITIVE 0x0002\n#define TOKEN_SECURITY_ATTRIBUTE_USE_FOR_DENY_ONLY 0x0004 // Attribute is considered only for Deny Aces.\n#define TOKEN_SECURITY_ATTRIBUTE_DISABLED_BY_DEFAULT 0x0008 // Attribute is disabled by default.\n#define TOKEN_SECURITY_ATTRIBUTE_DISABLED 0x0010 // Attribute is disabled.\n#define TOKEN_SECURITY_ATTRIBUTE_MANDATORY 0x0020 // Attribute is mandatory.\n#define TOKEN_SECURITY_ATTRIBUTE_COMPARE_IGNORE 0x0040 // Attribute is ignored.\n\n#define TOKEN_SECURITY_ATTRIBUTE_VALID_FLAGS ( \\\n    TOKEN_SECURITY_ATTRIBUTE_NON_INHERITABLE | \\\n    TOKEN_SECURITY_ATTRIBUTE_VALUE_CASE_SENSITIVE | \\\n    TOKEN_SECURITY_ATTRIBUTE_USE_FOR_DENY_ONLY | \\\n    TOKEN_SECURITY_ATTRIBUTE_DISABLED_BY_DEFAULT | \\\n    TOKEN_SECURITY_ATTRIBUTE_DISABLED | \\\n    TOKEN_SECURITY_ATTRIBUTE_MANDATORY)\n\n// Reserve upper 16 bits for custom flags. These should be preserved but not\n// validated as they do not affect security in any way.\n#define TOKEN_SECURITY_ATTRIBUTE_CUSTOM_FLAGS 0xffff0000\n\n// end_rev\n\n// private // CLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE\ntypedef struct _TOKEN_SECURITY_ATTRIBUTE_FQBN_VALUE\n{\n    ULONG64 Version;\n    UNICODE_STRING Name;\n} TOKEN_SECURITY_ATTRIBUTE_FQBN_VALUE, *PTOKEN_SECURITY_ATTRIBUTE_FQBN_VALUE;\n\n// private // CLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE\ntypedef struct _TOKEN_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE\n{\n    PVOID Value; // Pointer is BYTE aligned.\n    ULONG ValueLength; // In bytes\n} TOKEN_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE, *PTOKEN_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE;\n\n// private\ntypedef struct _TOKEN_SECURITY_ATTRIBUTE_V1\n{\n    UNICODE_STRING Name;\n    USHORT ValueType;\n    USHORT Reserved;\n    ULONG Flags;\n    ULONG ValueCount;\n    union\n    {\n        PLONG64 Int64;\n        PULONG64 Uint64;\n        PUNICODE_STRING String;\n        PTOKEN_SECURITY_ATTRIBUTE_FQBN_VALUE Fqbn;\n        PTOKEN_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE OctetString;\n    } Values;\n} TOKEN_SECURITY_ATTRIBUTE_V1, *PTOKEN_SECURITY_ATTRIBUTE_V1;\n\n// private\ntypedef struct _TOKEN_SECURITY_ATTRIBUTE_RELATIVE_V1\n{\n    UNICODE_STRING Name;\n    USHORT ValueType;\n    USHORT Reserved;\n    ULONG Flags;\n    ULONG ValueCount;\n    union\n    {\n        ULONG Int64[ANYSIZE_ARRAY];\n        ULONG Uint64[ANYSIZE_ARRAY];\n        ULONG String[ANYSIZE_ARRAY];\n        ULONG Fqbn[ANYSIZE_ARRAY];\n        ULONG OctetString[ANYSIZE_ARRAY];\n    } Values;\n} TOKEN_SECURITY_ATTRIBUTE_RELATIVE_V1, *PTOKEN_SECURITY_ATTRIBUTE_RELATIVE_V1;\n\n// rev\n#define TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1 1\n// rev\n#define TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1\n\n// private\ntypedef struct _TOKEN_SECURITY_ATTRIBUTES_INFORMATION\n{\n    USHORT Version;\n    USHORT Reserved;\n    ULONG AttributeCount;\n    union\n    {\n        PTOKEN_SECURITY_ATTRIBUTE_V1 AttributeV1;\n    };\n} TOKEN_SECURITY_ATTRIBUTES_INFORMATION, *PTOKEN_SECURITY_ATTRIBUTES_INFORMATION;\n\n// private\ntypedef enum _TOKEN_SECURITY_ATTRIBUTE_OPERATION\n{\n    TOKEN_SECURITY_ATTRIBUTE_OPERATION_NONE,\n    TOKEN_SECURITY_ATTRIBUTE_OPERATION_REPLACE_ALL,\n    TOKEN_SECURITY_ATTRIBUTE_OPERATION_ADD,\n    TOKEN_SECURITY_ATTRIBUTE_OPERATION_DELETE,\n    TOKEN_SECURITY_ATTRIBUTE_OPERATION_REPLACE\n} TOKEN_SECURITY_ATTRIBUTE_OPERATION, *PTOKEN_SECURITY_ATTRIBUTE_OPERATION;\n\n// private\ntypedef struct _TOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION\n{\n    PTOKEN_SECURITY_ATTRIBUTES_INFORMATION Attributes;\n    PTOKEN_SECURITY_ATTRIBUTE_OPERATION Operations;\n} TOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION, *PTOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION;\n\n// rev\ntypedef struct _TOKEN_PROCESS_TRUST_LEVEL\n{\n    PSID TrustLevelSid;\n} TOKEN_PROCESS_TRUST_LEVEL, *PTOKEN_PROCESS_TRUST_LEVEL;\n\n#if !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\ntypedef struct _TOKEN_LOGGING_INFORMATION\n{\n    TOKEN_TYPE TokenType;\n    TOKEN_ELEVATION TokenElevation;\n    TOKEN_ELEVATION_TYPE TokenElevationType;\n    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;\n    DWORD IntegrityLevel;\n    SID_AND_ATTRIBUTES User;\n    PSID TrustLevelSid;\n    DWORD SessionId;\n    DWORD AppContainerNumber;\n    LUID AuthenticationId;\n    DWORD GroupCount;\n    DWORD GroupsLength;\n    PSID_AND_ATTRIBUTES Groups;\n} TOKEN_LOGGING_INFORMATION, *PTOKEN_LOGGING_INFORMATION;\n#endif // !defined(NTDDI_WIN11_GE) || (NTDDI_VERSION < NTDDI_WIN11_GE)\n\n//\n// Tokens\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateToken(\n    _Out_ PHANDLE TokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TOKEN_TYPE Type,\n    _In_ PLUID AuthenticationId,\n    _In_ PLARGE_INTEGER ExpirationTime,\n    _In_ PTOKEN_USER User,\n    _In_ PTOKEN_GROUPS Groups,\n    _In_ PTOKEN_PRIVILEGES Privileges,\n    _In_opt_ PTOKEN_OWNER Owner,\n    _In_ PTOKEN_PRIMARY_GROUP PrimaryGroup,\n    _In_opt_ PTOKEN_DEFAULT_DACL DefaultDacl,\n    _In_ PTOKEN_SOURCE Source\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateLowBoxToken(\n    _Out_ PHANDLE TokenHandle,\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ PSID PackageSid,\n    _In_ ULONG CapabilityCount,\n    _In_reads_opt_(CapabilityCount) PSID_AND_ATTRIBUTES Capabilities,\n    _In_ ULONG HandleCount,\n    _In_reads_opt_(HandleCount) HANDLE *Handles\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateTokenEx(\n    _Out_ PHANDLE TokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TOKEN_TYPE Type,\n    _In_ PLUID AuthenticationId,\n    _In_ PLARGE_INTEGER ExpirationTime,\n    _In_ PTOKEN_USER User,\n    _In_ PTOKEN_GROUPS Groups,\n    _In_ PTOKEN_PRIVILEGES Privileges,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION UserAttributes,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION DeviceAttributes,\n    _In_opt_ PTOKEN_GROUPS DeviceGroups,\n    _In_opt_ PTOKEN_MANDATORY_POLICY MandatoryPolicy,\n    _In_opt_ PTOKEN_OWNER Owner,\n    _In_ PTOKEN_PRIMARY_GROUP PrimaryGroup,\n    _In_opt_ PTOKEN_DEFAULT_DACL DefaultDacl,\n    _In_ PTOKEN_SOURCE Source\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n/**\n * The NtOpenProcessToken routine opens the access token associated with a process, and returns a handle that can be used to access that token.\n *\n * @param ProcessHandle Handle to the process whose access token is to be opened. The handle must have PROCESS_QUERY_INFORMATION access.\n * @param DesiredAccess ACCESS_MASK structure specifying the requested types of access to the access token.\n * @param TokenHandle Pointer to a caller-allocated variable that receives a handle to the newly opened access token.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenprocesstoken\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenProcessToken(\n    _In_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PHANDLE TokenHandle\n    );\n\n/**\n * The NtOpenProcessTokenEx routine opens the access token associated with a process, and returns a handle that can be used to access that token.\n *\n * @param ProcessHandle Handle to the process whose access token is to be opened. The handle must have PROCESS_QUERY_INFORMATION access.\n * @param DesiredAccess ACCESS_MASK structure specifying the requested types of access to the access token.\n * @param HandleAttributes Attributes for the created handle. Only OBJ_KERNEL_HANDLE is currently supported.\n * @param TokenHandle Pointer to a caller-allocated variable that receives a handle to the newly opened access token.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenprocesstokenex\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenProcessTokenEx(\n    _In_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _Out_ PHANDLE TokenHandle\n    );\n\n/**\n * The NtOpenThreadToken routine opens the access token associated with a thread, and returns a handle that can be used to access that token.\n *\n * @param ThreadHandle Handle to the thread whose access token is to be opened. The handle must have THREAD_QUERY_INFORMATION access.\n * @param DesiredAccess ACCESS_MASK structure specifying the requested types of access to the access token.\n * @param OpenAsSelf Boolean value specifying whether the access check is to be made against the security context of the thread calling NtOpenThreadToken or against the security context of the process for the calling thread.\n * @param TokenHandle Pointer to a caller-allocated variable that receives a handle to the newly opened access token.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenthreadtoken\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenThreadToken(\n    _In_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ BOOLEAN OpenAsSelf,\n    _Out_ PHANDLE TokenHandle\n    );\n\n/**\n * The NtOpenThreadTokenEx routine opens the access token associated with a thread, and returns a handle that can be used to access that token.\n *\n * @param ThreadHandle Handle to the thread whose access token is to be opened. The handle must have THREAD_QUERY_INFORMATION access.\n * @param DesiredAccess ACCESS_MASK structure specifying the requested types of access to the access token.\n * @param OpenAsSelf Boolean value specifying whether the access check is to be made against the security context of the thread calling NtOpenThreadToken or against the security context of the process for the calling thread.\n * @param HandleAttributes Attributes for the created handle. Only OBJ_KERNEL_HANDLE is currently supported.\n * @param TokenHandle Pointer to a caller-allocated variable that receives a handle to the newly opened access token.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenthreadtokenex\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenThreadTokenEx(\n    _In_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ BOOLEAN OpenAsSelf,\n    _In_ ULONG HandleAttributes,\n    _Out_ PHANDLE TokenHandle\n    );\n\n/**\n * The NtDuplicateToken function creates a handle to a new access token that duplicates an existing token.\n *\n * @param ExistingTokenHandle A handle to an existing access token that was opened with the TOKEN_DUPLICATE access right.\n * @param DesiredAccess ACCESS_MASK structure specifying the requested types of access to the access token.\n * @param ObjectAttributes Pointer to an OBJECT_ATTRIBUTES structure that describes the requested properties for the new token.\n * @param EffectiveOnly A Boolean value that indicates whether the entire existing token should be duplicated into the new token or just the effective (currently enabled) part of the token.\n * @param Type Specifies the type of token to create either a primary token or an impersonation token.\n * @param NewTokenHandle Pointer to a caller-allocated variable that receives a handle to the newly duplicated token.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntduplicatetoken\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDuplicateToken(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ BOOLEAN EffectiveOnly,\n    _In_ TOKEN_TYPE Type,\n    _Out_ PHANDLE NewTokenHandle\n    );\n\n/**\n * The NtQueryInformationToken routine retrieves a specified type of information about an access token. The calling process must have appropriate access rights to obtain the information.\n *\n * @param TokenHandle A handle to an existing access token from which information is to be retrieved. If TokenInformationClass is set to TokenSource, the handle must have TOKEN_QUERY_SOURCE access.\n * For all other TokenInformationClass values, the handle must have TOKEN_QUERY access. \n * @param TokenInformationClass A value from the TOKEN_INFORMATION_CLASS enumerated type identifying the type of information to be retrieved.\n * @param TokenInformation Pointer to a caller-allocated buffer that receives the requested information about the token.\n * @param TokenInformationLength Length, in bytes, of the caller-allocated TokenInformation buffer.\n * @param ReturnLength Pointer to a caller-allocated variable that receives the actual length, in bytes, of the information returned in the TokenInformation buffer.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntqueryinformationtoken\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationToken(\n    _In_ HANDLE TokenHandle,\n    _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,\n    _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation,\n    _In_ ULONG TokenInformationLength,\n    _Out_ PULONG ReturnLength\n    );\n\n/**\n * The NtSetInformationToken routine modifies information in a specified token. The calling process must have appropriate access rights to set the information.\n *\n * @param TokenHandle A handle to an existing access token which information is to be modified.\n * @param TokenInformationClass A value from the TOKEN_INFORMATION_CLASS enumerated type identifying the type of information to be modified.\n * @param TokenInformation Pointer to a caller-allocated buffer containing the information to be modified in the token.\n * @param TokenInformationLength Length, in bytes, of the caller-allocated TokenInformation buffer.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntsetinformationtoken\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationToken(\n    _In_ HANDLE TokenHandle,\n    _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,\n    _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation,\n    _In_ ULONG TokenInformationLength\n    );\n\n/**\n * The NtAdjustPrivilegesToken routine enables or disables privileges in the specified access token.\n *\n * @param TokenHandle Handle to the token that contains the privileges to be modified. The handle must have TOKEN_ADJUST_PRIVILEGES access.\n * @param DisableAllPrivileges Specifies whether the function disables all of the token's privileges. If this value is TRUE, the function disables all privileges and ignores the NewState parameter.\n * If it is FALSE, the function modifies privileges based on the information pointed to by the NewState parameter.\n * @param NewState A pointer to a TOKEN_PRIVILEGES structure that specifies an array of privileges and their attributes. If DisableAllPrivileges is TRUE, the function ignores this parameter.\n * @param BufferLength Specifies the size, in bytes, of the buffer pointed to by the PreviousState parameter. This parameter can be zero if the PreviousState parameter is NULL.\n * @param PreviousState A pointer to a buffer that the function fills with a TOKEN_PRIVILEGES structure that contains the previous state of any privileges that the function modifies.\n * @param ReturnLength A pointer to a variable that receives the required size, in bytes, of the buffer pointed to by the PreviousState parameter. This parameter can be NULL if PreviousState is NULL.\n * @return NTSTATUS Successful or errant status.\n * @remarks https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivileges\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAdjustPrivilegesToken(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN DisableAllPrivileges,\n    _In_opt_ PTOKEN_PRIVILEGES NewState,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_PRIVILEGES PreviousState,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAdjustGroupsToken(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN ResetToDefault,\n    _In_opt_ PTOKEN_GROUPS NewState,\n    _In_opt_ ULONG BufferLength,\n    _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_GROUPS PreviousState,\n    _Out_opt_ PULONG ReturnLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAdjustTokenClaimsAndDeviceGroups(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN UserResetToDefault,\n    _In_ BOOLEAN DeviceResetToDefault,\n    _In_ BOOLEAN DeviceGroupsResetToDefault,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION NewUserState,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION NewDeviceState,\n    _In_opt_ PTOKEN_GROUPS NewDeviceGroupsState,\n    _In_ ULONG UserBufferLength,\n    _Out_writes_bytes_to_opt_(UserBufferLength, *UserReturnLength) PTOKEN_SECURITY_ATTRIBUTES_INFORMATION PreviousUserState,\n    _In_ ULONG DeviceBufferLength,\n    _Out_writes_bytes_to_opt_(DeviceBufferLength, *DeviceReturnLength) PTOKEN_SECURITY_ATTRIBUTES_INFORMATION PreviousDeviceState,\n    _In_ ULONG DeviceGroupsBufferLength,\n    _Out_writes_bytes_to_opt_(DeviceGroupsBufferLength, *DeviceGroupsReturnBufferLength) PTOKEN_GROUPS PreviousDeviceGroups,\n    _Out_opt_ PULONG UserReturnLength,\n    _Out_opt_ PULONG DeviceReturnLength,\n    _Out_opt_ PULONG DeviceGroupsReturnBufferLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFilterToken(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PTOKEN_GROUPS SidsToDisable,\n    _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete,\n    _In_opt_ PTOKEN_GROUPS RestrictedSids,\n    _Out_ PHANDLE NewTokenHandle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFilterTokenEx(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PTOKEN_GROUPS SidsToDisable,\n    _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete,\n    _In_opt_ PTOKEN_GROUPS RestrictedSids,\n    _In_ ULONG DisableUserClaimsCount,\n    _In_opt_ PCUNICODE_STRING UserClaimsToDisable,\n    _In_ ULONG DisableDeviceClaimsCount,\n    _In_opt_ PCUNICODE_STRING DeviceClaimsToDisable,\n    _In_opt_ PTOKEN_GROUPS DeviceGroupsToDisable,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION RestrictedUserAttributes,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION RestrictedDeviceAttributes,\n    _In_opt_ PTOKEN_GROUPS RestrictedDeviceGroups,\n    _Out_ PHANDLE NewTokenHandle\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompareTokens(\n    _In_ HANDLE FirstTokenHandle,\n    _In_ HANDLE SecondTokenHandle,\n    _Out_ PBOOLEAN Equal\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrivilegeCheck(\n    _In_ HANDLE ClientToken,\n    _Inout_ PPRIVILEGE_SET RequiredPrivileges,\n    _Out_ PBOOLEAN Result\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtImpersonateAnonymousToken(\n    _In_ HANDLE ThreadHandle\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQuerySecurityAttributesToken(\n    _In_ HANDLE TokenHandle,\n    _In_reads_opt_(NumberOfAttributes) PCUNICODE_STRING Attributes,\n    _In_ ULONG NumberOfAttributes,\n    _Out_writes_bytes_(Length) PVOID Buffer, // PTOKEN_SECURITY_ATTRIBUTES_INFORMATION\n    _In_ ULONG Length,\n    _Out_ PULONG ReturnLength\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n//\n// Access checking\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheck(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckByType(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_reads_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckByTypeResultList(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_reads_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus\n    );\n\n// Signing\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetCachedSigningLevel(\n    _In_ ULONG Flags,\n    _In_ SE_SIGNING_LEVEL InputSigningLevel,\n    _In_reads_(SourceFileCount) PHANDLE SourceFiles,\n    _In_ ULONG SourceFileCount,\n    _In_opt_ HANDLE TargetFile\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetCachedSigningLevel(\n    _In_ HANDLE File,\n    _Out_ PULONG Flags,\n    _Out_ PSE_SIGNING_LEVEL SigningLevel,\n    _Out_writes_bytes_to_opt_(*ThumbprintSize, *ThumbprintSize) PUCHAR Thumbprint,\n    _Inout_opt_ PULONG ThumbprintSize,\n    _Out_opt_ PULONG ThumbprintAlgorithm\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_8)\n\n// rev\ntypedef struct _SE_FILE_CACHE_CLAIM_INFORMATION\n{\n    ULONG Size;\n    PVOID Claim;\n} SE_FILE_CACHE_CLAIM_INFORMATION, *PSE_FILE_CACHE_CLAIM_INFORMATION;\n\n// rev\ntypedef struct _SE_SET_FILE_CACHE_INFORMATION\n{\n    ULONG Size;\n    UNICODE_STRING CatalogDirectoryPath;\n    SE_FILE_CACHE_CLAIM_INFORMATION OriginClaimInfo;\n} SE_SET_FILE_CACHE_INFORMATION, *PSE_SET_FILE_CACHE_INFORMATION;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetCachedSigningLevel2(\n    _In_ ULONG Flags,\n    _In_ SE_SIGNING_LEVEL InputSigningLevel,\n    _In_reads_(SourceFileCount) PHANDLE SourceFiles,\n    _In_ ULONG SourceFileCount,\n    _In_opt_ HANDLE TargetFile,\n    _In_opt_ SE_SET_FILE_CACHE_INFORMATION* CacheInformation\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n\n// rev\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCompareSigningLevels(\n    _In_ SE_SIGNING_LEVEL FirstSigningLevel,\n    _In_ SE_SIGNING_LEVEL SecondSigningLevel\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_10_RS2)\n\n//\n// Audit alarm\n//\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckByTypeAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckByTypeResultListAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtAccessCheckByTypeResultListAndAuditAlarmByHandle(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ HANDLE ClientToken,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_opt_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN ObjectCreation,\n    _In_ BOOLEAN AccessGranted,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrivilegeObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN AccessGranted\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCloseObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ BOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtDeleteObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ BOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrivilegedServiceAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_ PCUNICODE_STRING ServiceName,\n    _In_ HANDLE ClientToken,\n    _In_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN AccessGranted\n    );\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntsmss.h",
    "content": "/*\n * Windows Session Manager support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTSMSS_H\n#define _NTSMSS_H\n\n// SmApiPort\n\n// private\ntypedef enum _SMAPINUMBER\n{\n    SmNotImplementedApi = 0,\n    SmSessionCompleteApi = 1,\n    SmNotImplemented2Api = 2,\n    SmExecPgmApi = 3,\n    SmLoadDeferedSubsystemApi = 4,\n    SmStartCsrApi = 5,\n    SmStopCsrApi = 6,\n    SmStartServerSiloApi = 7,\n    SmMaxApiNumber = 8,\n} SMAPINUMBER, *PSMAPINUMBER;\n\n// private\ntypedef struct _SMSESSIONCOMPLETE\n{\n    _In_ ULONG SessionId;\n    _In_ NTSTATUS CompletionStatus;\n} SMSESSIONCOMPLETE, *PSMSESSIONCOMPLETE;\n\n// private\ntypedef struct _SMEXECPGM\n{\n    _In_ RTL_USER_PROCESS_INFORMATION ProcessInformation;\n    _In_ BOOLEAN DebugFlag;\n} SMEXECPGM, *PSMEXECPGM;\n\n// private\ntypedef struct _SMLOADDEFERED\n{\n    _In_ ULONG SubsystemNameLength;\n    _In_ _Field_size_bytes_(SubsystemNameLength) WCHAR SubsystemName[32];\n} SMLOADDEFERED, *PSMLOADDEFERED;\n\n// private\ntypedef struct _SMSTARTCSR\n{\n    _Inout_ ULONG MuSessionId;\n    _In_ ULONG InitialCommandLength;\n    _In_ _Field_size_bytes_(InitialCommandLength) WCHAR InitialCommand[128];\n    _Out_ HANDLE InitialCommandProcessId;\n    _Out_ HANDLE WindowsSubSysProcessId;\n} SMSTARTCSR, *PSMSTARTCSR;\n\n// private\ntypedef struct _SMSTOPCSR\n{\n    _In_ ULONG MuSessionId;\n} SMSTOPCSR, *PSMSTOPCSR;\n\n// private\ntypedef struct _SMSTARTSERVERSILO\n{\n    _In_ HANDLE JobHandle;\n    _In_ BOOLEAN CreateSuspended;\n} SMSTARTSERVERSILO, *PSMSTARTSERVERSILO;\n\n// private\ntypedef struct _SMAPIMSG\n{\n    PORT_MESSAGE h;\n    SMAPINUMBER ApiNumber;\n    NTSTATUS ReturnedStatus;\n    union\n    {\n        union\n        {\n            SMSESSIONCOMPLETE SessionComplete;\n            SMEXECPGM ExecPgm;\n            SMLOADDEFERED LoadDefered;\n            SMSTARTCSR StartCsr;\n            SMSTOPCSR StopCsr;\n            SMSTARTSERVERSILO StartServerSilo;\n        };\n    } u;\n} SMAPIMSG, *PSMAPIMSG;\n\n// SbApiPort\n\n// private\ntypedef enum _SBAPINUMBER\n{\n    SbCreateSessionApi = 0,\n    SbTerminateSessionApi = 1,\n    SbForeignSessionCompleteApi = 2,\n    SbCreateProcessApi = 3,\n    SbMaxApiNumber = 4,\n} SBAPINUMBER, *PSBAPINUMBER;\n\n// private\ntypedef struct _SBCONNECTINFO\n{\n    _In_ ULONG SubsystemImageType;\n    _In_ WCHAR EmulationSubSystemPortName[120];\n} SBCONNECTINFO, *PSBCONNECTINFO;\n\n// private\ntypedef struct _SBCREATESESSION\n{\n    _In_ ULONG SessionId;\n    _In_ RTL_USER_PROCESS_INFORMATION ProcessInformation;\n    _In_opt_ PVOID UserProfile;\n    _In_ ULONG DebugSession;\n    _In_ CLIENT_ID DebugUiClientId;\n} SBCREATESESSION, *PSBCREATESESSION;\n\n// private\ntypedef struct _SBTERMINATESESSION\n{\n    _In_ ULONG SessionId;\n    _In_ NTSTATUS TerminationStatus;\n} SBTERMINATESESSION, *PSBTERMINATESESSION;\n\n// private\ntypedef struct _SBFOREIGNSESSIONCOMPLETE\n{\n    _In_ ULONG SessionId;\n    _In_ NTSTATUS TerminationStatus;\n} SBFOREIGNSESSIONCOMPLETE, *PSBFOREIGNSESSIONCOMPLETE;\n\n// dbg/rev\n#define SMP_DEBUG_FLAG 0x00000001\n#define SMP_ASYNC_FLAG 0x00000002\n#define SMP_DONT_START 0x00000004\n\n// private\ntypedef struct _SBCREATEPROCESSIN\n{\n    _In_ PCUNICODE_STRING ImageFileName;\n    _In_ PCUNICODE_STRING CurrentDirectory;\n    _In_ PCUNICODE_STRING CommandLine;\n    _In_opt_ PCUNICODE_STRING DefaultLibPath;\n    _In_ ULONG Flags; // SMP_*\n    _In_ ULONG DefaultDebugFlags;\n} SBCREATEPROCESSIN, *PSBCREATEPROCESSIN;\n\n// private\ntypedef struct _SBCREATEPROCESSOUT\n{\n    _Out_ HANDLE Process;\n    _Out_ HANDLE Thread;\n    _Out_ ULONG SubSystemType;\n    _Out_ CLIENT_ID ClientId;\n} SBCREATEPROCESSOUT, *PSBCREATEPROCESSOUT;\n\n// private\ntypedef struct _SBCREATEPROCESS\n{\n    union\n    {\n        SBCREATEPROCESSIN i;\n        SBCREATEPROCESSOUT o;\n    };\n} SBCREATEPROCESS, *PSBCREATEPROCESS;\n\n// private\ntypedef struct _SBAPIMSG\n{\n    PORT_MESSAGE h;\n    union\n    {\n        SBCONNECTINFO ConnectionRequest;\n        struct\n        {\n            SBAPINUMBER ApiNumber;\n            NTSTATUS ReturnedStatus;\n            union\n            {\n                SBCREATESESSION CreateSession;\n                SBTERMINATESESSION TerminateSession;\n                SBFOREIGNSESSIONCOMPLETE ForeignSessionComplete;\n                SBCREATEPROCESS CreateProcessA;\n            };\n        };\n    } u;\n} SBAPIMSG, *PSBAPIMSG;\n\n// functions\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlConnectToSm(\n    _In_opt_ PCUNICODE_STRING ApiPortName,\n    _In_opt_ HANDLE ApiPortHandle,\n    _In_ ULONG ProcessImageType,\n    _Out_ PHANDLE SmssConnection\n    );\n\nNTSYSAPI\nNTSTATUS\nNTAPI\nRtlSendMsgToSm(\n    _In_ HANDLE ApiPortHandle,\n    _Inout_updates_(MessageData->u1.s1.TotalLength) PPORT_MESSAGE MessageData\n    );\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntstrsafe.h",
    "content": "/******************************************************************\n*                                                                 *\n*  ntstrsafe.h -- This module defines safer C library string      *\n*                 routine replacements for drivers. These are     *\n*                 meant to make C a bit more safe in reference    *\n*                 to security and robustness. A similar file,     *\n*                 strsafe.h, is available for applications.       *\n*                                                                 *\n*  Copyright (c) Microsoft Corp.  All rights reserved.            *\n*                                                                 *\n******************************************************************/\n#ifndef _NTSTRSAFE_H_INCLUDED_\n#define _NTSTRSAFE_H_INCLUDED_\n#if (_MSC_VER > 1000)\n#pragma once\n#endif\n\n\n#include <stdio.h>          // for _vsnprintf, _vsnwprintf, getc, getwc\n#include <string.h>         // for memset\n#include <stdarg.h>         // for va_start, etc.\n#include <specstrings.h>    // for _In_, etc.\n#include <winapifamily.h>   // for WINAPI_FAMILY_PARTITION()\n\n#ifndef NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n#include <ntdef.h>          // for UNICODE_STRING, etc.\n#endif\n\n#if !defined(_W64)\n#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86) || defined(_ARM_) || defined(_M_ARM)) && (_MSC_VER >= 1300)\n#define _W64 __w64\n#else\n#define _W64\n#endif\n#endif\n\n#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_ARM64)\n#define ALIGNMENT_MACHINE\n#define UNALIGNED __unaligned\n#if defined(_WIN64)\n#define UNALIGNED64 __unaligned\n#else\n#define UNALIGNED64\n#endif\n#else\n#undef ALIGNMENT_MACHINE\n#define UNALIGNED\n#define UNALIGNED64\n#endif\n\n// typedefs\n#ifdef  _WIN64\ntypedef unsigned __int64    size_t;\n#else\ntypedef _W64 unsigned int   size_t;\n#endif\n\n#ifndef _NTSTATUS_DEFINED\n#define _NTSTATUS_DEFINED\ntypedef _Return_type_success_(return >= 0) long NTSTATUS;\n#endif\n\ntypedef unsigned long DWORD;\n\n\n#ifndef SORTPP_PASS\n// compiletime asserts (failure results in error C2118: negative subscript)\n#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]\n#else\n#define C_ASSERT(e)\n#endif\n\n#ifdef __cplusplus\n#define EXTERN_C    extern \"C\"\n#else\n#define EXTERN_C    extern\n#endif\n\n// use the new secure crt functions if available\n#ifndef NTSTRSAFE_USE_SECURE_CRT\n#if defined(__GOT_SECURE_LIB__) && (__GOT_SECURE_LIB__ >= 200402L)\n#define NTSTRSAFE_USE_SECURE_CRT 0\n#else\n#define NTSTRSAFE_USE_SECURE_CRT 0\n#endif\n#endif  // !NTSTRSAFE_USE_SECURE_CRT\n\n#ifdef _M_CEE_PURE\n#define NTSTRSAFEDDI      __inline NTSTATUS __clrcall\n#else\n#define NTSTRSAFEDDI      __inline NTSTATUS __stdcall\n#endif\n\n#if defined(NTSTRSAFE_LIB_IMPL) || defined(NTSTRSAFE_LIB)\n#define NTSTRSAFEWORKERDDI    EXTERN_C NTSTATUS __stdcall\n#else\n#define NTSTRSAFEWORKERDDI    static NTSTRSAFEDDI\n#endif\n\n// The following steps are *REQUIRED* if ntstrsafe.h is used for drivers on:\n//     Windows 2000\n//     Windows Millennium Edition\n//     Windows 98 Second Edition\n//     Windows 98\n//\n// 1. #define NTSTRSAFE_LIB before including the ntstrsafe.h header file.\n// 2. Add ntstrsafe.lib to the TARGET_LIBS line in SOURCES\n//\n// Drivers running on XP and later can skip these steps to create a smaller\n// driver by running the functions inline.\n#if defined(NTSTRSAFE_LIB)\n#pragma comment(lib, \"ntstrsafe.lib\")\n#endif\n\n#pragma warning(push)\n#pragma warning(disable: 28210) // Because not all PREFast versions like _Always_ equally.\n\n// The user can request no \"Cb\" or no \"Cch\" functions, but not both\n#if defined(NTSTRSAFE_NO_CB_FUNCTIONS) && defined(NTSTRSAFE_NO_CCH_FUNCTIONS)\n#error cannot specify both NTSTRSAFE_NO_CB_FUNCTIONS and NTSTRSAFE_NO_CCH_FUNCTIONS !!\n#endif\n\n// The user may override NTSTRSAFE_MAX_CCH, but it must always be less than INT_MAX\n#ifndef NTSTRSAFE_MAX_CCH\n#define NTSTRSAFE_MAX_CCH     2147483647  // max buffer size, in characters, that we support (same as INT_MAX)\n#endif\nC_ASSERT(NTSTRSAFE_MAX_CCH <= 2147483647);\nC_ASSERT(NTSTRSAFE_MAX_CCH > 1);\n\n#define NTSTRSAFE_MAX_LENGTH  (NTSTRSAFE_MAX_CCH - 1)   // max buffer length, in characters, that we support\n\n// The user may override NTSTRSAFE_UNICODE_STRING_MAX_CCH, but it must always be less than (USHORT_MAX / sizeof(wchar_t))\n#ifndef NTSTRSAFE_UNICODE_STRING_MAX_CCH\n#define NTSTRSAFE_UNICODE_STRING_MAX_CCH    (0xffff / sizeof(wchar_t))  // max buffer size, in characters, for a UNICODE_STRING\n#endif\nC_ASSERT(NTSTRSAFE_UNICODE_STRING_MAX_CCH <= (0xffff / sizeof(wchar_t)));\nC_ASSERT(NTSTRSAFE_UNICODE_STRING_MAX_CCH > 1);\n\n\n// Flags for controlling the Ex functions\n//\n//      STRSAFE_FILL_BYTE(0xFF)                         0x000000FF  // bottom byte specifies fill pattern\n#define STRSAFE_IGNORE_NULLS                            0x00000100  // treat null string pointers as TEXT(\"\") -- don't fault on NULL buffers\n#define STRSAFE_FILL_BEHIND_NULL                        0x00000200  // on success, fill in extra space behind the null terminator with fill pattern\n#define STRSAFE_FILL_ON_FAILURE                         0x00000400  // on failure, overwrite pszDest with fill pattern and null terminate it\n#define STRSAFE_NULL_ON_FAILURE                         0x00000800  // on failure, set *pszDest = TEXT('\\0')\n#define STRSAFE_NO_TRUNCATION                           0x00001000  // instead of returning a truncated result, copy/append nothing to pszDest and null terminate it\n\n// Flags for controlling UNICODE_STRING Ex functions\n//\n//      STRSAFE_FILL_BYTE(0xFF)                         0x000000FF  // bottom byte specifies fill pattern\n//      STRSAFE_IGNORE_NULLS                            0x00000100  // don't fault on NULL UNICODE_STRING pointers, and treat null pszSrc as L\"\"\n#define STRSAFE_FILL_BEHIND                             0x00000200  // on success, fill in extra space at the end of the UNICODE_STRING Buffer with fill pattern\n//      STRSAFE_FILL_ON_FAILURE                         0x00000400  // on failure, fill the UNICODE_STRING Buffer with fill pattern and set the Length to 0\n#define STRSAFE_ZERO_LENGTH_ON_FAILURE                  0x00000800  // on failure, set the UNICODE_STRING Length to 0\n//      STRSAFE_NO_TRUNCATION                           0x00001000  // instead of returning a truncated result, copy/append nothing to UNICODE_STRING Buffer\n\n\n#define STRSAFE_VALID_FLAGS                     (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)\n#define STRSAFE_UNICODE_STRING_VALID_FLAGS      (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE | STRSAFE_NO_TRUNCATION)\n\n// helper macro to set the fill character and specify buffer filling\n#define STRSAFE_FILL_BYTE(x)                    ((DWORD)((x & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))\n#define STRSAFE_FAILURE_BYTE(x)                 ((DWORD)((x & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))\n\n#define STRSAFE_GET_FILL_PATTERN(dwFlags)       ((int)(dwFlags & 0x000000FF))\n\n\n// Deprecated, use the non STRSAFE_ prefixed types instead (e.g. LPSTR or PSTR) as they are the same as these.\ntypedef _Null_terminated_ char* NTSTRSAFE_PSTR;\ntypedef _Null_terminated_ const char* NTSTRSAFE_PCSTR;\ntypedef _Null_terminated_ wchar_t* NTSTRSAFE_PWSTR;\ntypedef _Null_terminated_ const wchar_t* NTSTRSAFE_PCWSTR;\ntypedef _Null_terminated_ const wchar_t UNALIGNED* NTSTRSAFE_PCUWSTR;\n\n// Deprecated, use the base types instead.\n// RtlStrings where the string is NOT guaranteed to be null terminated (does not have _Null_terminated_).\ntypedef  const char* STRSAFE_PCNZCH;\ntypedef  const wchar_t* STRSAFE_PCNZWCH;\ntypedef  const wchar_t UNALIGNED* STRSAFE_PCUNZWCH;\n\n\n\n// prototypes for the worker functions\n\nNTSTRSAFEWORKERDDI\nRtlStringLengthWorkerA(\n    _In_reads_or_z_(cchMax) STRSAFE_PCNZCH psz,\n    _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n    _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringLengthWorkerW(\n    _In_reads_or_z_(cchMax) STRSAFE_PCNZWCH psz,\n    _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n    _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength);\n\n#ifdef ALIGNMENT_MACHINE\nNTSTRSAFEWORKERDDI\nRtlUnalignedStringLengthWorkerW(\n    _In_reads_or_z_(cchMax) STRSAFE_PCUNZWCH psz,\n    _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n    _Out_opt_ _Deref_out_range_(<, cchMax) size_t* pcchLength);\n#endif  // ALIGNMENT_MACHINE\n\n\n\n_When_(_Old_(*ppszSrc) != NULL, _Unchanged_(*ppszSrc))\n_When_(_Old_(*ppszSrc) == NULL, _At_(*ppszSrc, _Post_z_))\nNTSTRSAFEWORKERDDI\nRtlStringExValidateSrcA(\n    _Inout_ _Deref_post_notnull_ STRSAFE_PCNZCH* ppszSrc,\n    _Inout_opt_\n        _Deref_out_range_(<, cchMax)\n        _Deref_out_range_(<=, _Old_(*pcchToRead)) size_t* pcchToRead,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\n\n\n_When_(_Old_(*ppszSrc) != NULL, _Unchanged_(*ppszSrc))\n_When_(_Old_(*ppszSrc) == NULL, _At_(*ppszSrc, _Post_z_))\nNTSTRSAFEWORKERDDI\nRtlStringExValidateSrcW(\n    _Inout_ _Deref_post_notnull_ STRSAFE_PCNZWCH* ppszSrc,\n    _Inout_opt_\n        _Deref_out_range_(<, cchMax)\n        _Deref_out_range_(<=, _Old_(*pcchToRead)) size_t* pcchToRead,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\n\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\nNTSTRSAFEWORKERDDI\nRtlStringValidateDestA(\n    _In_reads_opt_(cchDest) STRSAFE_PCNZCH pszDest,\n    _In_ size_t cchDest,\n    _In_ const size_t cchMax);\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\nNTSTRSAFEWORKERDDI\nRtlStringValidateDestAndLengthA(\n    _In_reads_opt_(cchDest) NTSTRSAFE_PCSTR pszDest,\n    _In_ size_t cchDest,\n    _Out_ _Deref_out_range_(0, cchDest - 1) size_t* pcchDestLength,\n    _In_ const size_t cchMax);\n\n\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\nNTSTRSAFEWORKERDDI\nRtlStringValidateDestW(\n    _In_reads_opt_(cchDest) STRSAFE_PCNZWCH pszDest,\n    _In_ size_t cchDest,\n    _In_ const size_t cchMax);\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\nNTSTRSAFEWORKERDDI\nRtlStringValidateDestAndLengthW(\n    _In_reads_opt_(cchDest) NTSTRSAFE_PCWSTR pszDest,\n    _In_ size_t cchDest,\n    _Out_ _Deref_out_range_(0, cchDest - 1) size_t* pcchDestLength,\n    _In_ const size_t cchMax);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringExValidateDestA(\n    _In_reads_opt_(cchDest) STRSAFE_PCNZCH pszDest,\n    _In_ size_t cchDest,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\nNTSTRSAFEWORKERDDI\nRtlStringExValidateDestAndLengthA(\n    _In_reads_opt_(cchDest) NTSTRSAFE_PCSTR pszDest,\n    _In_ size_t cchDest,\n    _Out_ _Deref_out_range_(0, (cchDest>0?cchDest-1:0)) size_t* pcchDestLength,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringExValidateDestW(\n    _In_reads_opt_(cchDest) STRSAFE_PCNZWCH pszDest,\n    _In_ size_t cchDest,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\nNTSTRSAFEWORKERDDI\nRtlStringExValidateDestAndLengthW(\n    _In_reads_opt_(cchDest) NTSTRSAFE_PCWSTR pszDest,\n    _In_ size_t cchDest,\n    _Out_ _Deref_out_range_(0, (cchDest>0?cchDest-1:0)) size_t* pcchDestLength,\n    _In_ const size_t cchMax,\n    _In_ DWORD dwFlags);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringCopyWorkerA(\n    _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n    _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n    _Always_(_Out_opt_ _Deref_out_range_(<=, (cchToCopy < cchDest) ? cchToCopy : (cchDest - 1))) size_t* pcchNewDestLength,\n    _In_reads_or_z_(cchToCopy) STRSAFE_PCNZCH pszSrc,\n    _In_ _In_range_(<, NTSTRSAFE_MAX_CCH) size_t cchToCopy);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringCopyWorkerW(\n    _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n    _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n    _Always_(_Out_opt_ _Deref_out_range_(<=, (cchToCopy < cchDest) ? cchToCopy : (cchDest - 1))) size_t* pcchNewDestLength,\n    _In_reads_or_z_(cchToCopy) STRSAFE_PCNZWCH pszSrc,\n    _In_ _In_range_(<, NTSTRSAFE_MAX_CCH) size_t cchToCopy);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringVPrintfWorkerA(\n    _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n    _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n    _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength,\n    _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n    _In_ va_list argList);\n\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringVPrintfWorkerW(\n        _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n        _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n        _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        _In_ va_list argList);\n\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringExHandleFillBehindNullA(\n        _Inout_updates_bytes_(cbRemaining) NTSTRSAFE_PSTR pszDestEnd,\n        _In_ size_t cbRemaining,\n        _In_ DWORD dwFlags);\n\n\n\nNTSTRSAFEWORKERDDI\nRtlStringExHandleFillBehindNullW(\n        _Inout_updates_bytes_(cbRemaining) NTSTRSAFE_PWSTR pszDestEnd,\n        _In_ size_t cbRemaining,\n        _In_ DWORD dwFlags);\n\n\n\n_Success_(1)  // always succeeds, no exit tests needed\n    NTSTRSAFEWORKERDDI\n    RtlStringExHandleOtherFlagsA(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbDest,\n            _In_ _In_range_(0, cbDest>sizeof(char)?(cbDest / sizeof(char)) - 1:0) size_t cchOriginalDestLength,\n            _Outptr_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_ _Deref_out_range_(0, cbDest / sizeof(char)) size_t* pcchRemaining,\n            _In_ DWORD dwFlags);\n\n\n\n_Success_(1)  // always succeeds, no exit tests needed\n    NTSTRSAFEWORKERDDI\n    RtlStringExHandleOtherFlagsW(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbDest,\n            _In_ _In_range_(0, cbDest>sizeof(wchar_t)?(cbDest / sizeof(wchar_t)) - 1:0) size_t cchOriginalDestLength,\n            _Outptr_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_ _Deref_out_range_(0, cbDest / sizeof(wchar_t)) size_t* pcchRemaining,\n            _In_ DWORD dwFlags);\n\n\n\n\n#ifndef NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n_At_(DestinationString->Buffer, _Post_equal_to_(pszSrc))\n_At_(DestinationString->Length, _Post_equal_to_(_String_length_(pszSrc) * sizeof(WCHAR)))\n_At_(DestinationString->MaximumLength, _Post_equal_to_((_String_length_(pszSrc)+1) * sizeof(WCHAR)))\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringInitWorker(\n        _Out_ PUNICODE_STRING DestinationString,\n        _In_opt_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ const size_t cchMax,\n        _In_ DWORD dwFlags);\n\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringValidateWorker(\n        _In_opt_ PCUNICODE_STRING SourceString,\n        _In_ const size_t cchMax,\n        _In_ DWORD dwFlags);\n\n_Post_satisfies_(*pcchSrcLength*sizeof(wchar_t) == SourceString->MaximumLength)\n    NTSTRSAFEWORKERDDI\n    RtlUnicodeStringValidateSrcWorker(\n            _In_ PCUNICODE_STRING SourceString,\n            _Outptr_result_buffer_(*pcchSrcLength) wchar_t** ppszSrc,\n            _Out_ size_t* pcchSrcLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags);\n\n_Post_satisfies_(*pcchDest*sizeof(wchar_t) == DestinationString->MaximumLength)\n    NTSTRSAFEWORKERDDI\n    RtlUnicodeStringValidateDestWorker(\n            _In_ PCUNICODE_STRING DestinationString,\n            _Outptr_result_buffer_(*pcchDest) wchar_t** ppszDest,\n            _Out_ size_t* pcchDest,\n            _Out_opt_ size_t* pcchDestLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags);\n\nNTSTRSAFEWORKERDDI\nRtlStringCopyWideCharArrayWorker(\n        _Out_writes_(cchDest) NTSTRSAFE_PWSTR pszDest,\n        _In_ size_t cchDest,\n        _Out_opt_ size_t* pcchNewDestLength,\n        _In_reads_(cchSrcLength) const wchar_t* pszSrc,\n        _In_ size_t cchSrcLength);\n\nNTSTRSAFEWORKERDDI\nRtlWideCharArrayCopyStringWorker(\n        _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n        _In_ size_t cchDest,\n        _Out_ size_t* pcchNewDestLength,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cchToCopy);\n\nNTSTRSAFEWORKERDDI\nRtlWideCharArrayCopyWorker(\n        _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n        _In_ size_t cchDest,\n        _Out_ size_t* pcchNewDestLength,\n        _In_reads_(cchSrcLength) const wchar_t* pszSrc,\n        _In_ size_t cchSrcLength);\n\nNTSTRSAFEWORKERDDI\nRtlWideCharArrayVPrintfWorker(\n        _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n        _In_ size_t cchDest,\n        _Out_ size_t* pcchNewDestLength,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        _In_ va_list argList);\n\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringExHandleFill(\n        _Out_writes_(cchRemaining) wchar_t* pszDestEnd,\n        _In_ size_t cchRemaining,\n        _In_ DWORD dwFlags);\n\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringExHandleOtherFlags(\n        _Inout_updates_(cchDest) wchar_t* pszDest,\n        _In_ size_t cchDest,\n        _In_ size_t cchOriginalDestLength,\n        _Out_ size_t* pcchNewDestLength,\n        _Outptr_result_buffer_(*pcchRemaining) wchar_t** ppszDestEnd,\n        _Out_ size_t* pcchRemaining,\n        _In_ DWORD dwFlags);\n\n#endif  // !NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n\n\n// To allow this to stand alone.\n#define __WARNING_CYCLOMATIC_COMPLEXITY 28734\n#define __WARNING_USING_UNINIT_VAR 6001\n#define __WARNING_RETURN_UNINIT_VAR 6101\n#define __WARNING_DEREF_NULL_PTR 6011\n#define __WARNING_MISSING_ZERO_TERMINATION2 6054\n#define __WARNING_INVALID_PARAM_VALUE_1 6387\n#define __WARNING_INCORRECT_ANNOTATION 26007\n#define __WARNING_POTENTIAL_BUFFER_OVERFLOW_HIGH_PRIORITY 26015\n#define __WARNING_PRECONDITION_NULLTERMINATION_VIOLATION 26035\n#define __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION 26036\n#define __WARNING_HIGH_PRIORITY_OVERFLOW_POSTCONDITION 26045\n#define __WARNING_RANGE_POSTCONDITION_VIOLATION 26061\n#define __WARNING_POTENTIAL_RANGE_POSTCONDITION_VIOLATION 26071\n#define __WARNING_INVALID_PARAM_VALUE_3 28183\n#define __WARNING_RETURNING_BAD_RESULT 28196\n#define __WARNING_BANNED_API_USAGE 28719\n#define __WARNING_POST_EXPECTED 28210\n\n#pragma warning(push)\n#if _MSC_VER <= 1400\n#pragma warning(disable: 4616)  // turn off warning out of range so prefast pragmas won't show\n// show up in build.wrn/build.err\n#endif\n#pragma warning(disable : 4996) // 'function': was declared deprecated\n#pragma warning(disable : 4995) // name was marked as #pragma deprecated\n#pragma warning(disable : 4793) // vararg causes native code generation\n#pragma warning(disable : __WARNING_CYCLOMATIC_COMPLEXITY)\n\n\n#ifndef NTSTRSAFE_LIB_IMPL\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCopy(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_  size_t  cchDest,\n  _In_  LPCTSTR pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy'.\n  The size of the destination buffer (in characters) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This routine is not a replacement for strncpy.  That function will pad the\n  destination string with extra null termination characters if the count is\n  greater than the length of the source string, and it will fail to null\n  terminate the destination string if the source string length is greater\n  than or equal to the count. You can not blindly use this instead of strncpy:\n  it is common for code to use it to \"patch\" strings and you would introduce\n  errors if the code started null terminating in the middle of the string.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was copied without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases as much of\n  pszSrc will be copied to pszDest as possible, and pszDest will be null\n  terminated.\n\nArguments:\n\npszDest        -   destination string\n\ncchDest        -   size of destination buffer in characters.\nlength must be = (_tcslen(src) + 1) to hold all of the\nsource including the null terminator\n\npszSrc         -   source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL. See RtlStringCchCopyEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCopy(\n  _Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR pszDest,\n  _In_  size_t cbDest,\n  _In_  LPCTSTR pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy'.\n  The size of the destination buffer (in bytes) is a parameter and this\n  function will not write past the end of this buffer and it will ALWAYS\n  null terminate the destination buffer (unless it is zero length).\n\n  This routine is not a replacement for strncpy.  That function will pad the\n  destination string with extra null termination characters if the count is\n  greater than the length of the source string, and it will fail to null\n  terminate the destination string if the source string length is greater\n  than or equal to the count. You can not blindly use this instead of strncpy:\n  it is common for code to use it to \"patch\" strings and you would introduce\n  errors if the code started null terminating in the middle of the string.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was copied without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases as much of pszSrc\n  will be copied to pszDest as possible, and pszDest will be null terminated.\n\nArguments:\n\npszDest        -   destination string\n\ncbDest         -   size of destination buffer in bytes.\nlength must be = ((_tcslen(src) + 1) * sizeof(TCHAR)) to\nhold all of the source including the null terminator\n\npszSrc         -   source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL.  See RtlStringCbCopyEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCopyA(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCbCopyW(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCopyEx(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_  size_t  cchDest,\n  _In_  LPCTSTR pszSrc          OPTIONAL,\n  _Outptr_opt_result_buffer_(*pcchRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcchRemaining   OPTIONAL,\n  _In_  DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchCopy, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be = (_tcslen(pszSrc) + 1) to hold all of\nthe source including the null terminator\n\npszSrc          -   source string which must be null terminated\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return the\nnumber of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyExA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (*pszSrc != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyExW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCopyEx(\n  _Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_  size_t  cbDest,\n  _In_  LPCTSTR pszSrc          OPTIONAL,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcbRemaining    OPTIONAL,\n  _In_  DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbCopy, this routine also returns a pointer to the end of the\n  destination string and the number of bytes left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncbDest          -   size of destination buffer in bytes.\nlength must be ((_tcslen(pszSrc) + 1) * sizeof(TCHAR)) to\nhold all of the source including the null terminator\n\npszSrc          -   source string which must be null terminated\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcbRemaining    -   pcbRemaining is non-null,the function will return the\nnumber of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCopyExA(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (*pszSrc != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCbCopyExW(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCopyN(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_  size_t  cchDest,\n  _In_reads_or_z_(cchToCopy)  LPCTSTR pszSrc,\n  _In_  size_t  cchToCopy\n  );\n\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy'.\n  The size of the destination buffer (in characters) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This routine is meant as a replacement for strncpy, but it does behave\n  differently. This function will not pad the destination buffer with extra\n  null termination characters if cchToCopy is greater than the length of pszSrc.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cchToCopy characters were copied\n  without truncation and the resultant destination string was null terminated,\n  otherwise it will return a failure code. In failure cases as much of pszSrc\n  will be copied to pszDest as possible, and pszDest will be null terminated.\n\nArguments:\n\npszDest        -   destination string\n\ncchDest        -   size of destination buffer in characters.\nlength must be = (_tcslen(src) + 1) to hold all of the\nsource including the null terminator\n\npszSrc         -   source string\n\ncchToCopy      -   maximum number of characters to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL. See RtlStringCchCopyNEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyNA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cchToCopy)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        if (cchToCopy > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n\n            *pszDest = '\\0';\n        }\n        else\n        {\n            status = RtlStringCopyWorkerA(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchToCopy);\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyNW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cchToCopy)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        if (cchToCopy > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n\n            *pszDest = L'\\0';\n        }\n        else\n        {\n            status = RtlStringCopyWorkerW(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchToCopy);\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCopyN(\n  _Out_writes_bytes_(cbDest) LPTSTR  pszDest,\n  _In_  size_t  cbDest,\n  _In_  LPCTSTR pszSrc,\n  _In_  size_t  cbToCopy\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy'.\n  The size of the destination buffer (in bytes) is a parameter and this\n  function will not write past the end of this buffer and it will ALWAYS\n  null terminate the destination buffer (unless it is zero length).\n\n  This routine is meant as a replacement for strncpy, but it does behave\n  differently. This function will not pad the destination buffer with extra\n  null termination characters if cbToCopy is greater than the size of pszSrc.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cbToCopy characters were\n  copied without truncation and the resultant destination string was null\n  terminated, otherwise it will return a failure code. In failure cases as\n  much of pszSrc will be copied to pszDest as possible, and pszDest will be\n  null terminated.\n\nArguments:\n\npszDest        -   destination string\n\ncbDest         -   size of destination buffer in bytes.\nlength must be = ((_tcslen(src) + 1) * sizeof(TCHAR)) to\nhold all of the source including the null terminator\n\npszSrc         -   source string\n\ncbToCopy       -   maximum number of bytes to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL.  See RtlStringCbCopyEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCopyNA(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToCopy) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cbToCopy)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchToCopy = cbToCopy / sizeof(char);\n\n        if (cchToCopy > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n\n            *pszDest = '\\0';\n        }\n        else\n        {\n            status = RtlStringCopyWorkerA(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchToCopy);\n        }\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POTENTIAL_BUFFER_OVERFLOW_HIGH_PRIORITY)\n\nNTSTRSAFEDDI\n    RtlStringCbCopyNW(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToCopy) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cbToCopy)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n        if (cchToCopy > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n\n            *pszDest = L'\\0';\n        }\n        else\n        {\n            status = RtlStringCopyWorkerW(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchToCopy);\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCopyNEx(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_  size_t  cchDest,\n  _In_  LPCTSTR pszSrc          OPTIONAL,\n  _In_  size_t  cchToCopy,\n  _Outptr_opt_result_buffer_(*pcchRemaining) LPTSTR* ppszDestEnd OPTIONAL,\n  _Out_opt_ size_t* pcchRemaining OPTIONAL,\n  _In_  DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchCopyN, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination\n  string including the null terminator. The flags parameter allows\n  additional controls.\n\n  This routine is meant as a replacement for strncpy, but it does behave\n  differently. This function will not pad the destination buffer with extra\n  null termination characters if cchToCopy is greater than the length of pszSrc.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be = (_tcslen(pszSrc) + 1) to hold all of\nthe source including the null terminator\n\npszSrc          -   source string\n\ncchToCopy       -   maximum number of characters to copy from the source\nstring\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return the\nnumber of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL. An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyNExA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cchToCopy,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszSrc, &cchToCopy, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != '\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCopyNExW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cchToCopy,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToCopy, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCopyNEx(\n  _Out_writes_bytes_(cbDest) LPTSTR  pszDest         OPTIONAL,\n  _In_  size_t  cbDest,\n  _In_  LPCTSTR pszSrc          OPTIONAL,\n  _In_  size_t  cbToCopy,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcbRemaining    OPTIONAL,\n  _In_  DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbCopyN, this routine also returns a pointer to the end of the\n  destination string and the number of bytes left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\n  This routine is meant as a replacement for strncpy, but it does behave\n  differently. This function will not pad the destination buffer with extra\n  null termination characters if cbToCopy is greater than the size of pszSrc.\n\nArguments:\n\npszDest         -   destination string\n\ncbDest          -   size of destination buffer in bytes.\nlength must be ((_tcslen(pszSrc) + 1) * sizeof(TCHAR)) to\nhold all of the source including the null terminator\n\npszSrc          -   source string\n\ncbToCopy        -   maximum number of bytes to copy from source string\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcbRemaining    -   pcbRemaining is non-null,the function will return the\nnumber of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCopyNExA(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToCopy) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cbToCopy,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchToCopy = cbToCopy / sizeof(char);\n\n        status = RtlStringExValidateSrcA(&pszSrc, &cchToCopy, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != '\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POTENTIAL_BUFFER_OVERFLOW_HIGH_PRIORITY)\n\nNTSTRSAFEDDI\n    RtlStringCbCopyNExW(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToCopy) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cbToCopy,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToCopy, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCat(\n  _Inout_updates_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_     size_t  cchDest,\n  _In_     LPCTSTR pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat'.\n  The size of the destination buffer (in characters) is a parameter and this\n  function will not write past the end of this buffer and it will ALWAYS\n  null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was concatenated without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases as much of pszSrc\n  will be appended to pszDest as possible, and pszDest will be null\n  terminated.\n\nArguments:\n\npszDest     -  destination string which must be null terminated\n\ncchDest     -  size of destination buffer in characters.\nlength must be = (_tcslen(pszDest) + _tcslen(pszSrc) + 1)\nto hold all of the combine string plus the null\nterminator\n\npszSrc      -  source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL.  See RtlStringCchCatEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error occurs,\nthe destination buffer is modified to contain a truncated\nversion of the ideal result and is null terminated. This\nis useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatA(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerA(pszDest + cchDestLength,\n                cchDest - cchDestLength,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatW(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerW(pszDest + cchDestLength,\n                cchDest - cchDestLength,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCat(\n  _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_     size_t  cbDest,\n  _In_     LPCTSTR pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat'.\n  The size of the destination buffer (in bytes) is a parameter and this\n  function will not write past the end of this buffer and it will ALWAYS\n  null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was concatenated without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases as much of pszSrc\n  will be appended to pszDest as possible, and pszDest will be null\n  terminated.\n\nArguments:\n\npszDest     -  destination string which must be null terminated\n\ncbDest      -  size of destination buffer in bytes.\nlength must be = ((_tcslen(pszDest) + _tcslen(pszSrc) + 1) * sizeof(TCHAR)\nto hold all of the combine string plus the null\nterminator\n\npszSrc      -  source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL.  See RtlStringCbCatEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error occurs,\nthe destination buffer is modified to contain a truncated\nversion of the ideal result and is null terminated. This\nis useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatA(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerA(pszDest + cchDestLength,\n                cchDest - cchDestLength,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatW(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringCopyWorkerW(pszDest + cchDestLength,\n                cchDest - cchDestLength,\n                NULL,\n                pszSrc,\n                NTSTRSAFE_MAX_LENGTH);\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCatEx(\n  _Inout_updates_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_     size_t  cchDest,\n  _In_     LPCTSTR pszSrc          OPTIONAL,\n  _Outptr_opt_result_buffer_(*pcchRemaining)    LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_    size_t* pcchRemaining   OPTIONAL,\n  _In_     DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchCat, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncchDest         -   size of destination buffer in characters\nlength must be (_tcslen(pszDest) + _tcslen(pszSrc) + 1)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string which must be null terminated\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction appended any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return the\nnumber of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcat\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any pre-existing\nor truncated string\n\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any pre-existing or\ntruncated string\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatExA(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcA(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if (*pszSrc != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatExW(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCatEx(\n  _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_     size_t  cbDest,\n  _In_     LPCTSTR pszSrc          OPTIONAL,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining)    LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_    size_t* pcbRemaining    OPTIONAL,\n  _In_     DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbCat, this routine also returns a pointer to the end of the\n  destination string and the number of bytes left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncbDest          -   size of destination buffer in bytes.\nlength must be ((_tcslen(pszDest) + _tcslen(pszSrc) + 1) * sizeof(TCHAR)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string which must be null terminated\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction appended any data, the result will point to the\nnull termination character\n\npcbRemaining    -   if pcbRemaining is non-null, the function will return\nthe number of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcat\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any pre-existing\nor truncated string\n\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any pre-existing or\ntruncated string\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated\nand the resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatExA(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCSTR pszSrc,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcA(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if (*pszSrc != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatExW(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ NTSTRSAFE_PCWSTR pszSrc,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_MAX_LENGTH);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCatN(\n  _Inout_updates_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_     size_t  cchDest,\n  _In_     LPCTSTR pszSrc,\n  _In_     size_t  cchToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat'.\n  The size of the destination buffer (in characters) is a parameter as well as\n  the maximum number of characters to append, excluding the null terminator.\n  This function will not write past the end of the destination buffer and it will\n  ALWAYS null terminate pszDest (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if all of pszSrc or the first cchToAppend characters were appended\n  to the destination string and it was null terminated, otherwise it will\n  return a failure code. In failure cases as much of pszSrc will be appended\n  to pszDest as possible, and pszDest will be null terminated.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncchDest         -   size of destination buffer in characters.\nlength must be (_tcslen(pszDest) + min(cchToAppend, _tcslen(pszSrc)) + 1)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string\n\ncchToAppend     -   maximum number of characters to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL. See RtlStringCchCatNEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cchToAppend characters\nwere concatenated to pszDest and the resultant dest\nstring was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatNA(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToAppend) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cchToAppend)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        if (cchToAppend > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlStringCopyWorkerA(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    NULL,\n                    pszSrc,\n                    cchToAppend);\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatNW(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToAppend) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cchToAppend)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        if (cchToAppend > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlStringCopyWorkerW(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    NULL,\n                    pszSrc,\n                    cchToAppend);\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCatN(\n  _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_     size_t  cbDest,\n  _In_     LPCTSTR pszSrc,\n  _In_     size_t  cbToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat'.\n  The size of the destination buffer (in bytes) is a parameter as well as\n  the maximum number of bytes to append, excluding the null terminator.\n  This function will not write past the end of the destination buffer and it will\n  ALWAYS null terminate pszDest (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if all of pszSrc or the first cbToAppend bytes were appended\n  to the destination string and it was null terminated, otherwise it will\n  return a failure code. In failure cases as much of pszSrc will be appended\n  to pszDest as possible, and pszDest will be null terminated.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncbDest          -   size of destination buffer in bytes.\nlength must be ((_tcslen(pszDest) + min(cbToAppend / sizeof(TCHAR), _tcslen(pszSrc)) + 1) * sizeof(TCHAR)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string\n\ncbToAppend      -   maximum number of bytes to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL. See RtlStringCbCatNEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cbToAppend bytes were\nconcatenated to pszDest and the resultant dest string\nwas null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatNA(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToAppend) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cbToAppend)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchToAppend = cbToAppend / sizeof(char);\n\n        if (cchToAppend > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlStringCopyWorkerA(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    NULL,\n                    pszSrc,\n                    cchToAppend);\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatNW(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToAppend) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cbToAppend)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n    size_t cchDestLength;\n\n    status = RtlStringValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n        if (cchToAppend > NTSTRSAFE_MAX_LENGTH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlStringCopyWorkerW(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    NULL,\n                    pszSrc,\n                    cchToAppend);\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchCatNEx(\n  _Inout_updates_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_     size_t  cchDest,\n  _In_     LPCTSTR pszSrc          OPTIONAL,\n  _In_     size_t  cchToAppend,\n  _Outptr_opt_result_buffer_(*pcchRemaining)    LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_    size_t* pcchRemaining   OPTIONAL,\n  _In_     DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchCatN, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncchDest         -   size of destination buffer in characters.\nlength must be (_tcslen(pszDest) + min(cchToAppend, _tcslen(pszSrc)) + 1)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string\n\ncchToAppend     -   maximum number of characters to append\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction appended any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return the\nnumber of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any pre-existing\nor truncated string\n\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any pre-existing or\ntruncated string\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cchToAppend characters\nwere concatenated to pszDest and the resultant dest\nstring was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatNExA(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToAppend) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cchToAppend,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcA(&pszSrc, &cchToAppend, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != '\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchCatNExW(\n            _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_reads_or_z_(cchToAppend) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cchToAppend,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToAppend, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbCatNEx(\n  _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_     size_t  cbDest,\n  _In_     LPCTSTR pszSrc          OPTIONAL,\n  _In_     size_t  cbToAppend,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining)    LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_    size_t* pcchRemaining   OPTIONAL,\n  _In_     DWORD   dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbCatN, this routine also returns a pointer to the end of the\n  destination string and the number of bytes left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string which must be null terminated\n\ncbDest          -   size of destination buffer in bytes.\nlength must be ((_tcslen(pszDest) + min(cbToAppend / sizeof(TCHAR), _tcslen(pszSrc)) + 1) * sizeof(TCHAR)\nto hold all of the combine string plus the null\nterminator.\n\npszSrc          -   source string\n\ncbToAppend      -   maximum number of bytes to append\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction appended any data, the result will point to the\nnull termination character\n\npcbRemaining    -   if pcbRemaining is non-null, the function will return the\nnumber of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any pre-existing\nor truncated string\n\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any pre-existing or\ntruncated string\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cbToAppend bytes were\nconcatenated to pszDest and the resultant dest string\nwas null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the operation\nfailed due to insufficient space. When this error\noccurs, the destination buffer is modified to contain\na truncated version of the ideal result and is null\nterminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbCatNExA(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToAppend) STRSAFE_PCNZCH pszSrc,\n            _In_ size_t cbToAppend,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthA(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchToAppend = cbToAppend / sizeof(char);\n\n        status = RtlStringExValidateSrcA(&pszSrc, &cchToAppend, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != '\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerA(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POTENTIAL_BUFFER_OVERFLOW_HIGH_PRIORITY)\n\nNTSTRSAFEDDI\n    RtlStringCbCatNExW(\n            _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_reads_bytes_(cbToAppend) STRSAFE_PCNZWCH pszSrc,\n            _In_ size_t cbToAppend,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n    size_t cchDestLength;\n\n    status = RtlStringExValidateDestAndLengthW(pszDest,\n            cchDest,\n            &cchDestLength,\n            NTSTRSAFE_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToAppend, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining <= 1)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWorkerW(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    cchDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchVPrintf(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_  size_t  cchDest,\n  _In_ _Printf_format_string_  LPCTSTR pszFormat,\n  _In_  va_list argList\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf'.\n  The size of the destination buffer (in characters) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was printed without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases it will return\n  a truncated version of the ideal result.\n\nArguments:\n\npszDest     -  destination string\n\ncchDest     -  size of destination buffer in characters\nlength must be sufficient to hold the resulting formatted\nstring, including the null terminator.\n\npszFormat   -  format string which must be null terminated\n\nargList     -  va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL.  See RtlStringCchVPrintfEx if you\nrequire the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string and it was null terminated.\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCchVPrintfA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringVPrintfWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCchVPrintfW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringVPrintfWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbVPrintf(\n  _Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_ size_t  cbDest,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat,\n  _In_ va_list argList\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf'.\n  The size of the destination buffer (in bytes) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was printed without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases it will return\n  a truncated version of the ideal result.\n\nArguments:\n\npszDest     -  destination string\n\ncbDest      -  size of destination buffer in bytes\nlength must be sufficient to hold the resulting formatted\nstring, including the null terminator.\n\npszFormat   -  format string which must be null terminated\n\nargList     -  va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL.  See RtlStringCbVPrintfEx if you\nrequire the handling of NULL values.\n\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string and it was null terminated.\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbVPrintfA(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringVPrintfWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCbVPrintfW(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringVPrintfWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef _M_CEE_PURE\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchPrintf(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_ size_t  cchDest,\n  _In_ _Printf_format_string_  LPCTSTR pszFormat,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf'.\n  The size of the destination buffer (in characters) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was printed without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases it will return\n  a truncated version of the ideal result.\n\nArguments:\n\npszDest     -  destination string\n\ncchDest     -  size of destination buffer in characters\nlength must be sufficient to hold the resulting formatted\nstring, including the null terminator.\n\npszFormat   -  format string which must be null terminated\n\n...         -  additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL.  See RtlStringCchPrintfEx if you\nrequire the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string and it was null terminated.\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCchPrintfA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        va_list argList;\n\n        va_start(argList, pszFormat);\n\n        status = RtlStringVPrintfWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n\n        va_end(argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEDDI\n    RtlStringCchPrintfW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        va_list argList;\n\n        va_start(argList, pszFormat);\n\n        status = RtlStringVPrintfWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n\n        va_end(argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbPrintf(\n  _Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest,\n  _In_ size_t  cbDest,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf'.\n  The size of the destination buffer (in bytes) is a parameter and\n  this function will not write past the end of this buffer and it will\n  ALWAYS null terminate the destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was printed without truncation and null terminated,\n  otherwise it will return a failure code. In failure cases it will return\n  a truncated version of the ideal result.\n\nArguments:\n\npszDest     -  destination string\n\ncbDest      -  size of destination buffer in bytes\nlength must be sufficient to hold the resulting formatted\nstring, including the null terminator.\n\npszFormat   -  format string which must be null terminated\n\n...         -  additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL.  See RtlStringCbPrintfEx if you\nrequire the handling of NULL values.\n\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string and it was null terminated.\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\nNTSTRSAFEDDI\n    RtlStringCbPrintfA(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        va_list argList;\n\n        va_start(argList, pszFormat);\n\n        status = RtlStringVPrintfWorkerA(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n\n        va_end(argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCbPrintfW(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH);\n\n    if (NT_SUCCESS(status))\n    {\n        va_list argList;\n\n        va_start(argList, pszFormat);\n\n        status = RtlStringVPrintfWorkerW(pszDest,\n                cchDest,\n                NULL,\n                pszFormat,\n                argList);\n\n        va_end(argList);\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchPrintfEx(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_  size_t  cchDest,\n  _Outptr_opt_result_buffer_(*pcchRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcchRemaining   OPTIONAL,\n  _In_ DWORD   dwFlags,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat       OPTIONAL,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchPrintf, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be sufficient to contain the resulting\nformatted string plus the null terminator.\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction printed any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return\nthe number of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat       -   format string which must be null terminated\n\n...             -   additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string and it was null terminated.\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCchPrintfExA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n                va_list argList;\n\n                va_start(argList, pszFormat);\n\n                status = RtlStringVPrintfWorkerA(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                va_end(argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCchPrintfExW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n                va_list argList;\n\n                va_start(argList, pszFormat);\n\n                status = RtlStringVPrintfWorkerW(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                va_end(argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbPrintfEx(\n  _Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_ size_t  cbDest,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcbRemaining    OPTIONAL,\n  _In_ DWORD   dwFlags,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat       OPTIONAL,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbPrintf, this routine also returns a pointer to the end of the\n  destination string and the number of bytes left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncbDest          -   size of destination buffer in bytes.\nlength must be sufficient to contain the resulting\nformatted string plus the null terminator.\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction printed any data, the result will point to the\nnull termination character\n\npcbRemaining    -   if pcbRemaining is non-null, the function will return\nthe number of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat       -   format string which must be null terminated\n\n...             -   additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCbPrintfExA(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n                va_list argList;\n\n                va_start(argList, pszFormat);\n\n                status = RtlStringVPrintfWorkerA(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                va_end(argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\n    RtlStringCbPrintfExW(\n            _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            ...)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n                va_list argList;\n\n                va_start(argList, pszFormat);\n\n                status = RtlStringVPrintfWorkerW(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                va_end(argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n#endif  // !_M_CEE_PURE\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchVPrintfEx(\n  _Out_writes_(cchDest) _Always_(_Post_z_) LPTSTR  pszDest         OPTIONAL,\n  _In_ size_t  cchDest,\n  _Outptr_opt_result_buffer_(*pcchRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcchRemaining   OPTIONAL,\n  _In_ DWORD   dwFlags,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat       OPTIONAL,\n  _In_ va_list argList\n  );\n\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCchVPrintf, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be sufficient to contain the resulting\nformatted string plus the null terminator.\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction printed any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return\nthe number of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat       -   format string which must be null terminated\n\nargList         -   va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCchVPrintfExA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cchDest,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n\n                status = RtlStringVPrintfWorkerA(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = cchRemaining * sizeof(char);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(char) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            cbDest = cchDest * sizeof(char);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = '\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCchVPrintfExW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n\n                status = RtlStringVPrintfWorkerW(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n    else if (cchDest > 0)\n    {\n        *pszDest = L'\\0';\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbVPrintfEx(\n  _Out_writes_bytes_(cbDest) LPTSTR  pszDest         OPTIONAL,\n  _In_ size_t  cbDest,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining) LPTSTR* ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t* pcbRemaining    OPTIONAL,\n  _In_ DWORD   dwFlags,\n  _In_ _Printf_format_string_ LPCTSTR pszFormat       OPTIONAL,\n  _In_ va_list argList\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf' with\n  some additional parameters.  In addition to functionality provided by\n  RtlStringCbVPrintf, this routine also returns a pointer to the end of the\n  destination string and the number of characters left in the destination string\n  including the null terminator. The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncbDest          -   size of destination buffer in bytes.\nlength must be sufficient to contain the resulting\nformatted string plus the null terminator.\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return\na pointer to the end of the destination string.  If the\nfunction printed any data, the result will point to the\nnull termination character\n\npcbRemaining    -   if pcbRemaining is non-null, the function will return\nthe number of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\"))\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat       -   format string which must be null terminated\n\nargList         -   va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\npszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated and\nthe resultant dest string was null terminated\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nSTATUS_BUFFER_OVERFLOW /\nNTSTATUS_CODE(status) == ERROR_INSUFFICIENT_BUFFER\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCbVPrintfExA(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,\n            _In_ size_t cbDest,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(char);\n\n    status = RtlStringExValidateDestA(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcA(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = '\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != '\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n\n                status = RtlStringVPrintfWorkerA(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                    cbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullA(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = '\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsA(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(char) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n                *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));\n            }\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n\nNTSTRSAFEDDI\n    RtlStringCbVPrintfExW(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringExValidateDestW(pszDest, cchDest, NTSTRSAFE_MAX_CCH, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        NTSTRSAFE_PWSTR pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n                else\n                {\n                    // for consistency with other use in this case...\n                    __analysis_assume_nullterminated(pszDest);\n                }\n            }\n            else\n            {\n                size_t cchNewDestLength = 0;\n\n                status = RtlStringVPrintfWorkerW(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCchLength(\n  _In_reads_or_z_(cchMax) LPCTSTR psz,\n  _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t  cchMax,\n  _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength  OPTIONAL\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strlen'.\n  It is used to make sure a string is not larger than a given length, and\n  it optionally returns the current length in characters not including\n  the null terminator.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string is non-null and the length including the null\n  terminator is less than or equal to cchMax characters.\n\nArguments:\n\npsz         -   string to check the length of\n\ncchMax      -   maximum number of characters including the null terminator\nthat psz is allowed to contain\n\npcch        -   if the function succeeds and pcch is non-null, the current length\nin characters of psz excluding the null terminator will be returned.\nThis out parameter is equivalent to the return value of strlen(psz)\n\nNotes:\npsz can be null but the function will fail\n\ncchMax should be greater than zero or the function will fail\n\nReturn Value:\n\nSTATUS_SUCCESS -   psz is non-null and the length including the null\nterminator is less than or equal to cchMax characters\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\n#pragma warning(push)\n#pragma warning(disable:__WARNING_POTENTIAL_RANGE_POSTCONDITION_VIOLATION)\n\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlStringCchLengthA(\n            _In_reads_or_z_(cchMax) STRSAFE_PCNZCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n{\n    NTSTATUS status;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlStringLengthWorkerA(psz, cchMax, pcchLength);\n    }\n\n    if (!NT_SUCCESS(status) && pcchLength)\n    {\n        *pcchLength = 0;\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable:__WARNING_POTENTIAL_RANGE_POSTCONDITION_VIOLATION)\n\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlStringCchLengthW(\n            _In_reads_or_z_(cchMax) STRSAFE_PCNZWCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n{\n    NTSTATUS status;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlStringLengthWorkerW(psz, cchMax, pcchLength);\n    }\n\n    if (!NT_SUCCESS(status) && pcchLength)\n    {\n        *pcchLength = 0;\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlStringCbLength(\n  _In_reads_or_z_(cbMax) LPCTSTR psz,\n  _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(TCHAR)) size_t  cbMax,\n  _Out_opt_ _Deref_out_range_(<, cbMax) size_t* pcbLength   OPTIONAL\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strlen'.\n  It is used to make sure a string is not larger than a given length, and\n  it optionally returns the current length in bytes not including\n  the null terminator.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string is non-null and the length including the null\n  terminator is less than or equal to cbMax bytes.\n\nArguments:\n\npsz         -   string to check the length of\n\ncbMax       -   maximum number of bytes including the null terminator\nthat psz is allowed to contain\n\npcb         -   if the function succeeds and pcb is non-null, the current length\nin bytes of psz excluding the null terminator will be returned.\nThis out parameter is equivalent to the return value of strlen(psz) * sizeof(TCHAR)\n\nNotes:\npsz can be null but the function will fail\n\ncbMax should be greater than or equal to sizeof(TCHAR) or the function will fail\n\nReturn Value:\n\nSTATUS_SUCCESS -   psz is non-null and the length including the null\nterminator is less than or equal to cbMax bytes\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlStringCbLengthA(\n            _In_reads_or_z_(cbMax) STRSAFE_PCNZCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax,\n            _Out_opt_ _Deref_out_range_(<, cbMax) size_t* pcbLength)\n{\n    NTSTATUS status;\n    size_t cchMax = cbMax / sizeof(char);\n    size_t cchLength = 0;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlStringLengthWorkerA(psz, cchMax, &cchLength);\n    }\n\n    if (pcbLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            // safe to multiply cchLength * sizeof(char) since cchLength < NTSTRSAFE_MAX_CCH and sizeof(char) is 1\n            *pcbLength = cchLength * sizeof(char);\n        }\n        else\n        {\n            *pcbLength = 0;\n        }\n    }\n\n    return status;\n}\n\n\n\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlStringCbLengthW(\n            _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_PCNZWCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax,\n            _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t* pcbLength)\n{\n    NTSTATUS status;\n    size_t cchMax = cbMax / sizeof(wchar_t);\n    size_t cchLength = 0;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlStringLengthWorkerW(psz, cchMax, &cchLength);\n    }\n\n    if (pcbLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            // safe to multiply cchLength * sizeof(wchar_t) since cchLength < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            *pcbLength = cchLength * sizeof(wchar_t);\n        }\n        else\n        {\n            *pcbLength = 0;\n        }\n    }\n\n    return status;\n}\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnalignedStringCchLength(\n  _In_ LPCUTSTR    psz,\n  _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t  cchMax,\n  _Out_opt_ _Deref_out_range_(<, cchMax) size_t*     pcchLength  OPTIONAL\n  );\n\n  Routine Description:\n\n  This routine is a version of RtlStringCchLength that accepts an unaligned string pointer.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string is non-null and the length including the null\n  terminator is less than or equal to cchMax characters.\n\nArguments:\n\npsz         -   string to check the length of\n\ncchMax      -   maximum number of characters including the null terminator\nthat psz is allowed to contain\n\npcch        -   if the function succeeds and pcch is non-null, the current length\nin characters of psz excluding the null terminator will be returned.\nThis out parameter is equivalent to the return value of strlen(psz)\n\nNotes:\npsz can be null but the function will fail\n\ncchMax should be greater than zero or the function will fail\n\nReturn Value:\n\nSTATUS_SUCCESS -   psz is non-null and the length including the null\nterminator is less than or equal to cchMax characters\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\n#ifdef ALIGNMENT_MACHINE\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlUnalignedStringCchLengthW(\n            _In_reads_or_z_(cchMax) STRSAFE_PCUNZWCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) size_t* pcchLength)\n{\n    NTSTATUS status;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlUnalignedStringLengthWorkerW(psz, cchMax, pcchLength);\n    }\n\n    if (!NT_SUCCESS(status) && pcchLength)\n    {\n        *pcchLength = 0;\n    }\n\n    return status;\n}\n\n#else\n#define RtlUnalignedStringCchLengthW   RtlStringCchLengthW\n#endif  // !ALIGNMENT_MACHINE\n\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnalignedStringCbLength(\n  _In_reads_or_z_(cbMax) LPCUTSTR    psz,\n  _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(TCHAR)) size_t  cbMax,\n  _Out_opt_ _Deref_out_range_(<, cbMax) size_t*   pcbLength   OPTIONAL\n  );\n\n  Routine Description:\n\n  This routine is a version of RtlStringCbLength that accepts an unaligned string pointer.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string is non-null and the length including the null\n  terminator is less than or equal to cbMax bytes.\n\nArguments:\n\npsz         -   string to check the length of\n\ncbMax       -   maximum number of bytes including the null terminator\nthat psz is allowed to contain\n\npcb         -   if the function succeeds and pcb is non-null, the current length\nin bytes of psz excluding the null terminator will be returned.\nThis out parameter is equivalent to the return value of strlen(psz) * sizeof(TCHAR)\n\nNotes:\npsz can be null but the function will fail\n\ncbMax should be greater than or equal to sizeof(TCHAR) or the function will fail\n\nReturn Value:\n\nSTATUS_SUCCESS -   psz is non-null and the length including the null\nterminator is less than or equal to cbMax bytes\n\nfailure        -   you can use the macro NTSTATUS_CODE() to get a win32\nerror code for all hresult failure cases\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\n#ifdef ALIGNMENT_MACHINE\n_Must_inspect_result_\nNTSTRSAFEDDI\n    RtlUnalignedStringCbLengthW(\n            _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_PCUNZWCH psz,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax,\n            _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t* pcbLength)\n{\n    NTSTATUS status;\n    size_t cchMax = cbMax / sizeof(wchar_t);\n    size_t cchLength = 0;\n\n    if ((psz == NULL) || (cchMax > NTSTRSAFE_MAX_CCH))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlUnalignedStringLengthWorkerW(psz, cchMax, &cchLength);\n    }\n\n    if (pcbLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            // safe to multiply cchLength * sizeof(wchar_t) since cchLength < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            *pcbLength = cchLength * sizeof(wchar_t);\n        }\n        else\n        {\n            *pcbLength = 0;\n        }\n    }\n\n    return status;\n}\n#else\n#define RtlUnalignedStringCbLengthW    RtlStringCbLengthW\n\n#endif  // !ALIGNMENT_MACHINE\n\n\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n\n#ifndef NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n#pragma warning(disable : __WARNING_HIGH_PRIORITY_OVERFLOW_POSTCONDITION)\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringInit(\n  _Out_ PUNICODE_STRING DestinationString,\n  _In_opt_ NTSTRSAFE_PCWSTR pszSrc              OPTIONAL\n  );\n\n  Routine Description:\n\n  The RtlUnicodeStringInit function initializes a counted unicode string from\n  pszSrc.\n\n  This function returns an NTSTATUS value.  It returns STATUS_SUCCESS if the\n  counted unicode string was successfully initialized from pszSrc. In failure\n  cases the unicode string buffer will be set to NULL, and the Length and\n  MaximumLength members will be set to zero.\n\nArguments:\n\nDestinationString - pointer to the counted unicode string to be initialized\n\npszSrc            - source string which must be null or null terminated\n\nNotes:\nDestinationString should not be NULL. See RtlUnicodeStringInitEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -\n\nfailure        -   the operation did not succeed\n\nSTATUS_INVALID_PARAMETER\n-   this return value is an indication that the source string\nwas too large and DestinationString could not be initialized\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n_At_(DestinationString->Buffer, _Post_equal_to_(pszSrc))\n_At_(DestinationString->Length, _Post_equal_to_(_String_length_(pszSrc) * sizeof(WCHAR)))\n_At_(DestinationString->MaximumLength, _Post_equal_to_((_String_length_(pszSrc)+1) * sizeof(WCHAR)))\nNTSTRSAFEDDI\nRtlUnicodeStringInit(\n        _Out_ PUNICODE_STRING DestinationString,\n        _In_opt_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    return RtlUnicodeStringInitWorker(DestinationString,\n            pszSrc,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringInitEx(\n  _Out_ PUNICODE_STRING DestinationString,\n  _In_opt_  NTSTRSAFE_PCWSTR pszSrc              OPTIONAL,\n  _In_ DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  In addition to functionality provided by RtlUnicodeStringInit, this routine\n  includes the flags parameter allows additional controls.\n\n  This function returns an NTSTATUS value.  It returns STATUS_SUCCESS if the\n  counted unicode string was successfully initialized from pszSrc. In failure\n  cases the unicode string buffer will be set to NULL, and the Length and\n  MaximumLength members will be set to zero.\n\nArguments:\n\nDestinationString - pointer to the counted unicode string to be initialized\n\npszSrc            - source string which must be null terminated\n\ndwFlags           - controls some details of the initialization:\n\nSTRSAFE_IGNORE_NULLS\ndo not fault on a NULL DestinationString pointer\n\nReturn Value:\n\nSTATUS_SUCCESS -\n\nfailure        -   the operation did not succeed\n\nSTATUS_INVALID_PARAMETER\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n_At_(DestinationString->Buffer, _Post_equal_to_(pszSrc))\n_At_(DestinationString->Length, _Post_equal_to_(_String_length_(pszSrc) * sizeof(WCHAR)))\n_At_(DestinationString->MaximumLength, _Post_equal_to_((_String_length_(pszSrc)+1) * sizeof(WCHAR)))\nNTSTRSAFEDDI\nRtlUnicodeStringInitEx(\n        _Out_ PUNICODE_STRING DestinationString,\n        _In_opt_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlUnicodeStringInitWorker(DestinationString,\n                pszSrc,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n    }\n\n    if (!NT_SUCCESS(status) && DestinationString)\n    {\n        DestinationString->Length = 0;\n        DestinationString->MaximumLength = 0;\n        DestinationString->Buffer = NULL;\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringValidate(\n  _In_ PCUNICODE_STRING    SourceString\n  );\n\n  Routine Description:\n\n  The RtlUnicodeStringValidate function checks the counted unicode string to make\n  sure that is is valid.\n\n  This function returns an NTSTATUS value.  It returns STATUS_SUCCESS if the\n  counted unicode string is valid.\n\nArguments:\n\nSourceString   - pointer to the counted unicode string to be checked\n\nNotes:\nSourceString should not be NULL. See RtlUnicodeStringValidateEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   SourceString is a valid counted unicode string\n\nfailure        -   the operation did not succeed\n\nSTATUS_INVALID_PARAMETER\n-   this return value is an indication that SourceString is not a valid\ncounted unicode string\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringValidate(\n        _In_ PCUNICODE_STRING SourceString)\n{\n    return RtlUnicodeStringValidateWorker(SourceString, NTSTRSAFE_UNICODE_STRING_MAX_CCH, 0);\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringValidateEx(\n  _In_ PCUNICODE_STRING    SourceString     OPTIONAL,\n  _In_ DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  In addition to functionality provided by RtlUnicodeStringValidate, this routine\n  includes the flags parameter allows additional controls.\n\n  This function returns an NTSTATUS value.  It returns STATUS_SUCCESS if the\n  counted unicode string is valid.\n\nArguments:\n\nSourceString   - pointer to the counted unicode string to be checked\n\ndwFlags        - controls some details of the validation:\n\nSTRSAFE_IGNORE_NULLS\nallows SourceString to be NULL (will return STATUS_SUCCESS for this case).\n\nReturn Value:\n\nSTATUS_SUCCESS -   SourceString is a valid counted unicode string\n\nfailure        -   the operation did not succeed\n\nSTATUS_INVALID_PARAMETER\n-   this return value is an indication that the source string\nis not a valid counted unicode string given the flags passed.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringValidateEx(\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else\n    {\n        status = RtlUnicodeStringValidateWorker(SourceString, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlStringCchCopyUnicodeString(\n  _Out_writes_(cchDest) PWSTR               pszDest,\n  _In_ size_t              cchDest,\n  _In_ PCUNICODE_STRING    SourceString,\n  );\n\n  Routine Description:\n\n  This routine copies a PUNICODE_STRING to a PWSTR. This function will not\n  write past the end of this buffer and it will ALWAYS null terminate the\n  destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if the string was copied without truncation, otherwise it\n  will return a failure code. In failure cases as much of SourceString will be\n  copied to pszDest as possible.\n\nArguments:\n\npszDest        -   destination string\n\ncchDest        -   size of destination buffer in characters.\nlength must be = ((DestinationString->Length / sizeof(wchar_t)) + 1)\nto hold all of the source and null terminate the string.\n\nSourceString   -   pointer to the counted unicode source string\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nSourceString and pszDest should not be NULL.  See RtlStringCchCopyUnicodeStringEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\n    RtlStringCchCopyUnicodeString(\n            _Out_writes_(cchDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ PCUNICODE_STRING SourceString)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest,\n            cchDest,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            status = RtlStringCopyWideCharArrayWorker(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchSrcLength);\n        }\n        else\n        {\n            *pszDest = L'\\0';\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlStringCbCopyUnicodeString(\n  _Out_writes_bytes_(cbDest) PWSTR               pszDest,\n  _In_ size_t              cbDest,\n  _In_ PCUNICODE_STRING    SourceString,\n  );\n\n  Routine Description:\n\n  This routine copies a PUNICODE_STRING to a PWSTR. This function will not\n  write past the end of this buffer and it will ALWAYS null terminate the\n  destination buffer (unless it is zero length).\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if the string was copied without truncation, otherwise it\n  will return a failure code. In failure cases as much of SourceString will be\n  copied to pszDest as possible.\n\nArguments:\n\npszDest        -   destination string\n\ncbDest         -   size of destination buffer in bytes.\nlength must be = (DestinationString->Length + sizeof(wchar_t))\nto hold all of the source and null terminate the string.\n\nSourceString   -   pointer to the counted unicode source string\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nSourceString and pszDest should not be NULL.  See RtlStringCbCopyUnicodeStringEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result and is\nnull terminated. This is useful for situations where\ntruncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_POTENTIAL_BUFFER_OVERFLOW_HIGH_PRIORITY)\n\nNTSTRSAFEDDI\n    RtlStringCbCopyUnicodeString(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ PCUNICODE_STRING SourceString)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringValidateDestW(pszDest,\n            cchDest,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            status = RtlStringCopyWideCharArrayWorker(pszDest,\n                    cchDest,\n                    NULL,\n                    pszSrc,\n                    cchSrcLength);\n        }\n        else\n        {\n            *pszDest = L'\\0';\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n/*++\n\n  NTSTATUS\n  RtlStringCchCopyUnicodeStringEx(\n  _Out_writes_(cchDest) PWSTR               pszDest         OPTIONAL,\n  _In_ size_t              cchDest,\n  _In_ PCUNICODE_STRING    SourceString    OPTIONAL,\n  _Outptr_opt_result_buffer_(*pcchRemaining) PWSTR*              ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t*             pcchRemaining   OPTIONAL,\n  _In_ DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine copies a PUNICODE_STRING to a PWSTR. In addition to\n  functionality provided by RtlStringCchCopyUnicodeString, this routine also\n  returns a pointer to the end of the destination string and the number of\n  characters left in the destination string including the null terminator.\n  The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be = ((DestinationString->Length / sizeof(wchar_t)) + 1)\nto hold all of the source and null terminate the string.\n\nSourceString    -   pointer to the counted unicode source string\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcchRemaining   -   if pcchRemaining is non-null, the function will return the\nnumber of characters left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\n    RtlStringCchCopyUnicodeStringEx(\n            _Out_writes_(cchDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _In_ PCUNICODE_STRING SourceString,\n            _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    status = RtlStringExValidateDestW(pszDest,\n            cchDest,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (cchSrcLength != 0)\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWideCharArrayWorker(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchSrcLength);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status)                           &&\n                        (dwFlags & STRSAFE_FILL_BEHIND_NULL)    &&\n                        (cchRemaining > 1))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cchDest != 0))\n        {\n            size_t cbDest;\n\n            // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n            cbDest = cchDest * sizeof(wchar_t);\n\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcchRemaining)\n            {\n                *pcchRemaining = cchRemaining;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlStringCbCopyUnicodeStringEx(\n  _Out_writes_bytes_(cbDest) PWSTR               pszDest         OPTIONAL,\n  _In_ size_t              cbDest,\n  _In_ PCUNICODE_STRING    SourceString    OPTIONAL,\n  _Outptr_opt_result_bytebuffer_(*pcbRemaining) PWSTR*              ppszDestEnd     OPTIONAL,\n  _Out_opt_ size_t*             pcbRemaining    OPTIONAL,\n  _In_ DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine copies a PUNICODE_STRING to a PWSTR. In addition to\n  functionality provided by RtlStringCbCopyUnicodeString, this routine also\n  returns a pointer to the end of the destination string and the number of\n  characters left in the destination string including the null terminator.\n  The flags parameter allows additional controls.\n\nArguments:\n\npszDest         -   destination string\n\ncchDest         -   size of destination buffer in characters.\nlength must be = ((DestinationString->Length / sizeof(wchar_t)) + 1)\nto hold all of the source and null terminate the string.\n\nSourceString    -   pointer to the counted unicode source string\n\nppszDestEnd     -   if ppszDestEnd is non-null, the function will return a\npointer to the end of the destination string.  If the\nfunction copied any data, the result will point to the\nnull termination character\n\npcbRemaining    -   pcbRemaining is non-null,the function will return the\nnumber of bytes left in the destination string,\nincluding the null terminator\n\ndwFlags         -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND_NULL\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\nbehind the null terminator\n\nSTRSAFE_IGNORE_NULLS\ntreat NULL string pointers like empty strings (TEXT(\"\")).\nthis flag is useful for emulating functions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer, and it will\nbe null terminated. This will overwrite any truncated\nstring returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_NULL_ON_FAILURE\nif the function fails, the destination buffer will be set\nto the empty string. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied and the\nresultant dest string was null terminated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\n    RtlStringCbCopyUnicodeStringEx(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cbDest,\n            _In_ PCUNICODE_STRING SourceString,\n            _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_opt_ size_t* pcbRemaining,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    status = RtlStringExValidateDestW(pszDest,\n            cchDest,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n\n                if (cchDest != 0)\n                {\n                    *pszDest = L'\\0';\n                }\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (cchSrcLength != 0)\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlStringCopyWideCharArrayWorker(pszDest,\n                        cchDest,\n                        &cchCopied,\n                        pszSrc,\n                        cchSrcLength);\n\n                pszDestEnd = pszDest + cchCopied;\n                cchRemaining = cchDest - cchCopied;\n\n                if (NT_SUCCESS(status) && (dwFlags & STRSAFE_FILL_BEHIND_NULL))\n                {\n                    size_t cbRemaining;\n\n                    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                    cbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n\n                    // handle the STRSAFE_FILL_BEHIND_NULL flag\n                    RtlStringExHandleFillBehindNullW(pszDestEnd, cbRemaining, dwFlags);\n                }\n            }\n        }\n        else\n        {\n            if (cchDest != 0)\n            {\n                *pszDest = L'\\0';\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                              &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)) &&\n                (cbDest != 0))\n        {\n            // handle the STRSAFE_FILL_ON_FAILURE, STRSAFE_NULL_ON_FAILURE, and STRSAFE_NO_TRUNCATION flags\n            RtlStringExHandleOtherFlagsW(pszDest,\n                    cbDest,\n                    0,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (ppszDestEnd)\n            {\n                *ppszDestEnd = pszDestEnd;\n            }\n\n            if (pcbRemaining)\n            {\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_MAX_CCH and sizeof(wchar_t) is 2\n                *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCopyString(\n  _Inout_ PUNICODE_STRING DestinationString,\n  _In_  LPCTSTR         pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' for\n  UNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was copied without truncation, otherwise it\n  will return a failure code. In failure cases as much of pszSrc will be\n  copied to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL.  See RtlUnicodeStringCopyStringEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCopyString(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchNewDestLength = 0;\n\n        status = RtlWideCharArrayCopyStringWorker(pszDest,\n                cchDest,\n                &cchNewDestLength,\n                pszSrc,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCopy(\n  _Inout_ PUNICODE_STRING    DestinationString,\n  _In_ PCUNICODE_STRING    SourceString\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' for\n  UNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was copied without truncation, otherwise it\n  will return a failure code. In failure cases as much of SourceString\n  will be copied to Dest as possible.\n\nArguments:\n\nDestinationString   - pointer to the counted unicode destination string\n\nSourceString        -  pointer to the counted unicode source string\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL.  See RtlUnicodeStringCopyEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCopy(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            status = RtlWideCharArrayCopyWorker(pszDest,\n                    cchDest,\n                    &cchNewDestLength,\n                    pszSrc,\n                    cchSrcLength);\n        }\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCopyStringEx(\n  _Inout_ PUNICODE_STRING DestinationString   OPTIONAL,\n  _In_ LPCTSTR         pszSrc              OPTIONAL,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_ DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' for\n  UNICODE_STRINGs with some additional parameters. In addition to the\n  functionality provided by RtlUnicodeStringCopyString, this routine also\n  returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string which must be null terminated\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored.\n\nBehavior is undefined if DestinationString and RemainingString are the same pointer.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCopyStringEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                status = RtlWideCharArrayCopyStringWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCopyEx(\n  _Inout_ PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_  PCUNICODE_STRING    SourceString        OPTIONAL,\n  _Out_opt_ PUNICODE_STRING     RemainingString     OPTIONAL,\n  _In_  DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcpy' for\n  UNICODE_STRINGs with some additional parameters. In addition to the\n  functionality provided by RtlUnicodeStringCopy, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored.\n\nBehavior is undefined if DestinationString and RemainingString are the same pointer.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCopyEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if (cchSrcLength != 0)\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                status = RtlWideCharArrayCopyWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        cchSrcLength);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCopyStringN(\n  _Inout_ PUNICODE_STRING DestinationString,\n  _In_ LPCTSTR         pszSrc,\n  _In_ size_t          cchToCopy\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cchToCopy characters were\n  copied without truncation, otherwise it will return a failure code. In\n  failure cases as much of pszSrc will be copied to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncchToCopy           -   maximum number of characters to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL. See RtlUnicodeStringCchCopyStringNEx if\nyou require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCopyStringN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cchToCopy)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchNewDestLength = 0;\n\n        if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlWideCharArrayCopyStringWorker(pszDest,\n                    cchDest,\n                    &cchNewDestLength,\n                    pszSrc,\n                    cchToCopy);\n        }\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCopyStringN(\n  _Inout_ PUNICODE_STRING DestinationString,\n  _In_ LPCTSTR         pszSrc,\n  _In_ size_t          cbToCopy\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cbToCopy bytes were\n  copied without truncation, otherwise it will return a failure code. In\n  failure cases as much of pszSrc will be copied to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncbToCopy            -   maximum number of bytes to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL.  See RtlUnicodeStringCopyCbStringEx if you require\nthe handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCopyStringN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cbToCopy)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchNewDestLength = 0;\n        size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n        if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            status = RtlWideCharArrayCopyStringWorker(pszDest,\n                    cchDest,\n                    &cchNewDestLength,\n                    pszSrc,\n                    cchToCopy);\n        }\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCopyN(\n  _Inout_ PUNICODE_STRING     DestinationString,\n  _In_  PCUNICODE_STRING    SourceString,\n  _In_  size_t              cchToCopy\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cchToCopy characters were\n  copied without truncation, otherwise it will return a failure code. In\n  failure cases as much of SourceString will be copied to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncchToCopy           -   maximum number of characters to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL. See RtlUnicodeStringCchCopyNEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCopyN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cchToCopy)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToCopy)\n                {\n                    cchToCopy = cchSrcLength;\n                }\n\n                status = RtlWideCharArrayCopyWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        cchToCopy);\n            }\n        }\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCopyN(\n  _Inout_ PUNICODE_STRING     DestinationString,\n  _In_  PCUNICODE_STRING    SourceString,\n  _In_  size_t              cbToCopy\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the entire string or the first cbToCopy bytes were\n  copied without truncation, otherwise it will return a failure code. In\n  failure cases as much of SourceString will be copied to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncbToCopy            -   maximum number of bytes to copy from source string,\nnot including the null terminator.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL.  See RtlUnicodeStringCbCopyNEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCopyN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cbToCopy)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n            if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToCopy)\n                {\n                    cchToCopy = cchSrcLength;\n                }\n\n                status = RtlWideCharArrayCopyWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        cchToCopy);\n            }\n        }\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCopyStringNEx(\n  _Inout_ PUNICODE_STRING DestinationString   OPTIONAL,\n  _In_ LPCTSTR         pszSrc              OPTIONAL,\n  _In_ size_t          cchToCopy,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_ DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCchCopyStringN, this routine also\n  returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncchToCopy           -   maximum number of characters to copy from source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\npszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCopyStringNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cchToCopy,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToCopy, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                status = RtlWideCharArrayCopyStringWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCopyStringNEx(\n  _Inout_ PUNICODE_STRING DestinationString   OPTIONAL,\n  _In_ LPCTSTR         pszSrc              OPTIONAL,\n  _In_ size_t          cbToCopy,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_ DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCbCopyStringN, this routine also\n  returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncbToCopy            -   maximum number of bytes to copy from source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCopyStringNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cbToCopy,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n        size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToCopy, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually src data to copy\n                if ((cchToCopy != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                status = RtlWideCharArrayCopyStringWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszSrc,\n                        cchToCopy);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCopyNEx(\n  _Inout_ PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_  PCUNICODE_STRING    SourceString        OPTIONAL,\n  _In_  size_t              cchToCopy,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_  DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCchCopyN, this\n  routine also returns a PUNICODE_STRING which points to the end of the\n  destination string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncchToCopy           -   maximum number of characters to copy from source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL SourceString like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCopyNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cchToCopy,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToCopy)\n                {\n                    cchToCopy = cchSrcLength;\n                }\n\n                if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n                {\n                    status = STATUS_INVALID_PARAMETER;\n                }\n                else if (cchDest == 0)\n                {\n                    // only fail if there was actually src data to copy\n                    if (cchToCopy != 0)\n                    {\n                        if (pszDest == NULL)\n                        {\n                            status = STATUS_INVALID_PARAMETER;\n                        }\n                        else\n                        {\n                            status = STATUS_BUFFER_OVERFLOW;\n                        }\n                    }\n                }\n                else\n                {\n                    status = RtlWideCharArrayCopyWorker(pszDest,\n                            cchDest,\n                            &cchNewDestLength,\n                            pszSrc,\n                            cchToCopy);\n\n                    pszDestEnd = pszDest + cchNewDestLength;\n                    cchRemaining = cchDest - cchNewDestLength;\n\n                    if (NT_SUCCESS(status)              &&\n                            (dwFlags & STRSAFE_FILL_BEHIND) &&\n                            (cchRemaining != 0))\n                    {\n                        // handle the STRSAFE_FILL_BEHIND flag\n                        RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                    }\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCopyNEx(\n  _Inout_ PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_  PCUNICODE_STRING    SourceString        OPTIONAL,\n  _In_  size_t              cbToCopy,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_  DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncpy' with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCbCopyN, this\n  routine also returns a PUNICODE_STRING which points to the end of the\n  destination string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncbToCopy            -   maximum number of bytes to copy from source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL SourceString like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all copied\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the copy\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCopyNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cbToCopy,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            size_t cchToCopy = cbToCopy / sizeof(wchar_t);\n\n            if (cchToCopy > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToCopy)\n                {\n                    cchToCopy = cchSrcLength;\n                }\n\n                if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n                {\n                    status = STATUS_INVALID_PARAMETER;\n                }\n                else if (cchDest == 0)\n                {\n                    // only fail if there was actually src data to copy\n                    if (cchToCopy != 0)\n                    {\n                        if (pszDest == NULL)\n                        {\n                            status = STATUS_INVALID_PARAMETER;\n                        }\n                        else\n                        {\n                            status = STATUS_BUFFER_OVERFLOW;\n                        }\n                    }\n                }\n                else\n                {\n                    status = RtlWideCharArrayCopyWorker(pszDest,\n                            cchDest,\n                            &cchNewDestLength,\n                            pszSrc,\n                            cchToCopy);\n\n                    pszDestEnd = pszDest + cchNewDestLength;\n                    cchRemaining = cchDest - cchNewDestLength;\n\n                    if (NT_SUCCESS(status)              &&\n                            (dwFlags & STRSAFE_FILL_BEHIND) &&\n                            (cchRemaining != 0))\n                    {\n                        // handle the STRSAFE_FILL_BEHIND flag\n                        RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                    }\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCatString(\n  _Inout_  PUNICODE_STRING DestinationString,\n  _In_     LPCTSTR         pszSrc\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' for\n  UNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was concatenated without truncation, otherwise\n  it will return a failure code. In failure cases as much of pszSrc will be\n  appended to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string which must be null terminated\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL.  See RtlUnicodeStringCatStringEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCatString(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchCopied = 0;\n\n        status = RtlWideCharArrayCopyStringWorker(pszDest + cchDestLength,\n                cchDest - cchDestLength,\n                &cchCopied,\n                pszSrc,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n\n        // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCat(\n  _Inout_  PUNICODE_STRING     DestinationString,\n  _In_     PCUNICODE_STRING    SourceString\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' for\n  UNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer.  It returns\n  STATUS_SUCCESS if the string was concatenated without truncation, otherwise\n  it will return a failure code. In failure cases as much of SourceString will be\n  appended to DestinationString as possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL.  See RtlUnicodeStringCatEx\nif you require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function.\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCat(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            size_t cchCopied = 0;\n\n            status = RtlWideCharArrayCopyWorker(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    &cchCopied,\n                    pszSrc,\n                    cchSrcLength);\n\n            // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCatStringEx(\n  _Inout_ PUNICODE_STRING DestinationString   OPTTONAL,\n  _In_      LPCTSTR         pszSrc              OPTIONAL,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_      DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' for\n  PUNICODE_STRINGs with some additional parameters.  In addition to the\n  functionality provided by RtlUnicodeStringCatString, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string which must be null terminated\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap or if\nDestinationString and RemainingString are the same pointer.\n\nDestinationString and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCatStringEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n\n        status = RtlStringExValidateSrcW(&pszSrc, NULL, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining == 0)\n            {\n                // only fail if there was actually src data to append\n                if (*pszSrc != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlWideCharArrayCopyStringWorker(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        NTSTRSAFE_UNICODE_STRING_MAX_CCH);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                cchNewDestLength = cchDestLength + cchCopied;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCatEx(\n  _Inout_   PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_      PCUNICODE_STRING    SourceString        OPTIONAL,\n  _Out_opt_ PUNICODE_STRING     RemainingString     OPTIONAL,\n  _In_      DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strcat' for\n  PUNICODE_STRINGs with some additional parameters. In addition to the\n  functionality provided by RtlUnicodeStringCat, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap or if\nDestinationString and RemainingString are the same pointer.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was source data and it was all concatenated\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCatEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining == 0)\n            {\n                // only fail if there was actually src data to append\n                if (cchSrcLength != 0)\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlWideCharArrayCopyWorker(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchSrcLength);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                cchNewDestLength = cchDestLength + cchCopied;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCatStringN(\n  _Inout_  PUNICODE_STRING DestinationString,\n  _In_     LPCTSTR         pszSrc,\n  _In_     size_t          cchToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if all of pszSrc or the first cchToAppend characters were\n  appended to the destination string, otherwise it will return a failure\n  code. In failure cases as much of pszSrc will be appended to DestinationString as\n  possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncchToAppend         -   maximum number of characters to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL. See RtlUnicodeStringCchCatStringNEx if\nyou require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cchToAppend characters were\nconcatenated to DestinationString\n\nfailure        -   the operation did not succeed\n\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCatStringN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cchToAppend)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            size_t cchCopied = 0;\n\n            status = RtlWideCharArrayCopyStringWorker(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    &cchCopied,\n                    pszSrc,\n                    cchToAppend);\n\n            // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCatStringN(\n  _Inout_   PUNICODE_STRING DestinationString,\n  _In_      LPCTSTR         pszSrc,\n  _In_      size_t          cbToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if all of pszSrc or the first cbToAppend bytes were\n  appended to the destination string, otherwise it will return a failure\n  code. In failure cases as much of pszSrc will be appended to DestinationString as\n  possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncbToAppend          -   maximum number of bytes to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL. See RtlUnicodeStringCbCatStringNEx if\nyou require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cbToAppend bytes were\nconcatenated to pszDest\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCatStringN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cbToAppend)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n        if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else\n        {\n            size_t cchCopied = 0;\n\n            status = RtlWideCharArrayCopyStringWorker(pszDest + cchDestLength,\n                    cchDest - cchDestLength,\n                    &cchCopied,\n                    pszSrc,\n                    cchToAppend);\n\n            // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCatN(\n  _Inout_  PUNICODE_STRING     DestinationString,\n  _In_     PCUNICODE_STRING    SourceString,\n  _In_     size_t              cchToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if all of SourceString or the first cchToAppend characters were\n  appended to the destination string, otherwise it will return a failure\n  code. In failure cases as much of SourceString will be appended to DestinationString as\n  possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncchToAppend         -   maximum number of characters to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL. See RtlUnicodeStringCchCatNEx if\nyou require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of SourceString or the first cchToAppend characters were\nconcatenated to DestinationString\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCatN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cchToAppend)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                if (cchSrcLength < cchToAppend)\n                {\n                    cchToAppend = cchSrcLength;\n                }\n\n                status = RtlWideCharArrayCopyWorker(pszDest + cchDestLength,\n                        cchDest - cchDestLength,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n#endif // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCatN(\n  _Inout_ PUNICODE_STRING     DestinationString,\n  _In_    PCUNICODE_STRING    SourceString,\n  _In_    size_t              cbToAppend\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if all of SourceString or the first cbToAppend bytes were\n  appended to the destination string, otherwise it will return a failure\n  code. In failure cases as much of SourceString will be appended to DestinationString as\n  possible.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncbToAppend          -   maximum number of bytes to append\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL. See RtlUnicodeStringCbCatNEx if\nyou require the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of SourceString or the first cbToAppend bytes were\nconcatenated to pszDest\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCatN(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cbToAppend)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                0);\n\n        if (NT_SUCCESS(status))\n        {\n            size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n            if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                if (cchSrcLength < cchToAppend)\n                {\n                    cchToAppend = cchSrcLength;\n                }\n\n                status = RtlWideCharArrayCopyWorker(pszDest + cchDestLength,\n                        cchDest - cchDestLength,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                // safe to multiply (cchDestLength + cchCopied) * sizeof(wchar_t) since (cchDestLength + cchCopied) < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                DestinationString->Length = (USHORT)((cchDestLength + cchCopied) * sizeof(wchar_t));\n            }\n        }\n    }\n\n    return status;\n}\n#endif // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCatStringNEx(\n  _Inout_ PUNICODE_STRING DestinationString   OPTIONAL,\n  _In_    LPCTSTR         pszSrc              OPTIONAL,\n  _In_    size_t          cchToAppend,\n  _Out_opt_ PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_    DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCchCatStringN, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncchToAppend         -   maximum number of characters to append\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cchToAppend characters were\nconcatenated to DestinationString\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCatStringNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cchToAppend,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToAppend, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining == 0)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlWideCharArrayCopyStringWorker(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                cchNewDestLength = cchDestLength + cchCopied;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCatStringNEx(\n  _Inout_                PUNICODE_STRING DestinationString   OPTIONAL,\n  _In_   LPCTSTR         pszSrc              OPTIONAL,\n  _In_                   size_t          cbToAppend,\n  _Out_opt_              PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_                   DWORD           dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCbCatStringN, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\npszSrc              -   source string\n\ncbToAppend          -   maximum number of bytes to append\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszSrc like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and pszSrc\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of pszSrc or the first cbToAppend bytes were\nconcatenated to pszDest\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCatStringNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ NTSTRSAFE_PCWSTR pszSrc,\n        _In_ size_t cbToAppend,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n        size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n        status = RtlStringExValidateSrcW(&pszSrc, &cchToAppend, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchRemaining == 0)\n            {\n                // only fail if there was actually src data to append\n                if ((cchToAppend != 0) && (*pszSrc != L'\\0'))\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                size_t cchCopied = 0;\n\n                status = RtlWideCharArrayCopyStringWorker(pszDestEnd,\n                        cchRemaining,\n                        &cchCopied,\n                        pszSrc,\n                        cchToAppend);\n\n                pszDestEnd = pszDestEnd + cchCopied;\n                cchRemaining = cchRemaining - cchCopied;\n\n                cchNewDestLength = cchDestLength + cchCopied;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CCH_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCchCatNEx(\n  _Inout_   PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_      PCUNICODE_STRING    SourceString        OPTIONAL,\n  _In_      size_t              cchToAppend,\n  _Out_opt_ PUNICODE_STRING     RemainingString     OPTIONAL,\n  _In_      DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCchCatN, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncchToAppend         -   maximum number of characters to append\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL SourceString like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of SourceString or the first cchToAppend characters were\nconcatenated to DestinationString\n\nfailure        -   the operation did not succeed\n\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_PRECONDITION_NULLTERMINATION_VIOLATION)\n\nNTSTRSAFEDDI\nRtlUnicodeStringCchCatNEx(\n        _Inout_   PUNICODE_STRING  DestinationString,\n        _In_      PCUNICODE_STRING SourceString,\n        _In_      size_t           cchToAppend,\n        _Out_opt_ PUNICODE_STRING  RemainingString,\n        _In_      DWORD            dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToAppend)\n                {\n                    cchToAppend = cchSrcLength;\n                }\n\n                if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n                {\n                    status = STATUS_INVALID_PARAMETER;\n                }\n                else if (cchRemaining == 0)\n                {\n                    // only fail if there was actually src data to append\n                    if (cchToAppend != 0)\n                    {\n                        if (pszDest == NULL)\n                        {\n                            status = STATUS_INVALID_PARAMETER;\n                        }\n                        else\n                        {\n                            status = STATUS_BUFFER_OVERFLOW;\n                        }\n                    }\n                }\n                else\n                {\n                    size_t cchCopied = 0;\n\n                    status = RtlWideCharArrayCopyStringWorker(pszDestEnd,\n                            cchRemaining,\n                            &cchCopied,\n                            pszSrc,\n                            cchToAppend);\n\n                    pszDestEnd = pszDestEnd + cchCopied;\n                    cchRemaining = cchRemaining - cchCopied;\n\n                    cchNewDestLength = cchDestLength + cchCopied;\n\n                    if (NT_SUCCESS(status)              &&\n                            (dwFlags & STRSAFE_FILL_BEHIND) &&\n                            (cchRemaining != 0))\n                    {\n                        // handle the STRSAFE_FILL_BEHIND flag\n                        RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                    }\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\n#endif  // !NTSTRSAFE_NO_CCH_FUNCTIONS\n\n\n#ifndef NTSTRSAFE_NO_CB_FUNCTIONS\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringCbCatNEx(\n  _Inout_   PUNICODE_STRING     DestinationString   OPTIONAL,\n  _In_      PCUNICODE_STRING    SourceString        OPTIONAL,\n  _In_      size_t              cbToAppend,\n  _Out_opt_ PUNICODE_STRING     RemainingString     OPTIONAL,\n  _In_      DWORD               dwFlags\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'strncat', with\n  some additional parameters and for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringCbCatN, this routine\n  also returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nSourceString        -   pointer to the counted unicode source string\n\ncbToAppend          -   maximum number of bytes to append\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL SourceString like\nempty strings (L\"\"). This flag is useful for emulating\nfunctions like lstrcpy\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\nSTRSAFE_NO_TRUNCATION\nif the function returns STATUS_BUFFER_OVERFLOW, pszDest\nwill not contain a truncated string, it will remain unchanged.\n\nNotes:\nBehavior is undefined if source and destination strings overlap.\n\nDestinationString and SourceString should not be NULL unless the STRSAFE_IGNORE_NULLS flag\nis specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and SourceString\nmay be NULL.  An error may still be returned even though NULLS are ignored\ndue to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if all of SourceString or the first cbToAppend bytes were\nconcatenated to DestinationString\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result.\nThis is useful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringCbCatNEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ PCUNICODE_STRING SourceString,\n        _In_ size_t cbToAppend,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n    size_t cchDestLength;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            &cchDestLength,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszSrc;\n        size_t cchSrcLength;\n        wchar_t* pszDestEnd = pszDest + cchDestLength;\n        size_t cchRemaining = cchDest - cchDestLength;\n        size_t cchNewDestLength = cchDestLength;\n\n        status = RtlUnicodeStringValidateSrcWorker(SourceString,\n                &pszSrc,\n                &cchSrcLength,\n                NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n                dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            size_t cchToAppend = cbToAppend / sizeof(wchar_t);\n\n            if (cchToAppend > NTSTRSAFE_UNICODE_STRING_MAX_CCH)\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else\n            {\n                if (cchSrcLength < cchToAppend)\n                {\n                    cchToAppend = cchSrcLength;\n                }\n\n                if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n                {\n                    status = STATUS_INVALID_PARAMETER;\n                }\n                else if (cchRemaining == 0)\n                {\n                    // only fail if there was actually src data to append\n                    if (cchToAppend != 0)\n                    {\n                        if (pszDest == NULL)\n                        {\n                            status = STATUS_INVALID_PARAMETER;\n                        }\n                        else\n                        {\n                            status = STATUS_BUFFER_OVERFLOW;\n                        }\n                    }\n                }\n                else\n                {\n                    size_t cchCopied = 0;\n\n                    status = RtlWideCharArrayCopyWorker(pszDestEnd,\n                            cchRemaining,\n                            &cchCopied,\n                            pszSrc,\n                            cchToAppend);\n\n                    pszDestEnd = pszDestEnd + cchCopied;\n                    cchRemaining = cchRemaining - cchCopied;\n\n                    cchNewDestLength = cchDestLength + cchCopied;\n\n                    if (NT_SUCCESS(status)              &&\n                            (dwFlags & STRSAFE_FILL_BEHIND) &&\n                            (cchRemaining != 0))\n                    {\n                        // handle the STRSAFE_FILL_BEHIND flag\n                        RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                    }\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    cchDestLength,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n#endif  // !NTSTRSAFE_NO_CB_FUNCTIONS\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringVPrintf(\n  _Inout_                      PUNICODE_STRING DestinationString,\n  _In_ _Printf_format_string_  PCWSTR          pszFormat,\n  _In_                         va_list         argList\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if the string was printed without truncation, otherwise it\n  will return a failure code. In failure cases it will return a truncated\n  version of the ideal result.\n\nArguments:\n\nDestinationString   -  pointer to the counted unicode destination string\n\npszFormat           -  format string which must be null terminated\n\nargList             -  va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\nDestinationString and pszFormat should not be NULL. See RtlUnicodeStringVPrintfEx if you\nrequire the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringVPrintf(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        _In_ va_list argList)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        size_t cchNewDestLength = 0;\n\n        status = RtlWideCharArrayVPrintfWorker(pszDest,\n                cchDest,\n                &cchNewDestLength,\n                pszFormat,\n                argList);\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringVPrintfEx(\n  _Inout_              PUNICODE_STRING DestinationString   OPTIONAL,\n  _Out_opt_            PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_                 DWORD   dwFlags,\n  _In_ _Printf_format_string_ PCWSTR  pszFormat                   OPTIONAL,\n  _In_                 va_list argList\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'vsprintf' with\n  some additional parameters for PUNICODE_STRING. In addition to the\n  functionality provided by RtlUnicodeStringVPrintf, this routine also\n  returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszFormat like\nempty strings (L\"\").\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat           -   format string which must be null terminated\n\nargList             -   va_list from the variable arguments according to the\nstdarg.h convention\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\nDestinationString and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringVPrintfEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        _In_ va_list argList)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                status = RtlWideCharArrayVPrintfWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n\n#ifndef _M_CEE_PURE\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringPrintf(\n  _Inout_                     PUNICODE_STRING DestinationString,\n  _In_ _Printf_format_string_ PCWSTR          pszFormat,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf' for\n  PUNICODE_STRINGs.\n\n  This function returns an NTSTATUS value, and not a pointer. It returns\n  STATUS_SUCCESS if the string was printed without truncation, otherwise it\n  will return a failure code. In failure cases it will return a truncated\n  version of the ideal result.\n\nArguments:\n\nDestinationString   -  pointer to the counted unicode destination string\n\npszFormat           -  format string which must be null terminated\n\n...                 -  additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\nDestinationString and pszFormat should not be NULL.  See RtlUnicodeStringPrintfEx if you\nrequire the handling of NULL values.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string\n\nfailure        -   the operation did not succeed\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringPrintf(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        ...)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            0);\n\n    if (NT_SUCCESS(status))\n    {\n        va_list argList;\n        size_t cchNewDestLength = 0;\n\n        va_start(argList, pszFormat);\n\n        status = RtlWideCharArrayVPrintfWorker(pszDest,\n                cchDest,\n                &cchNewDestLength,\n                pszFormat,\n                argList);\n\n        va_end(argList);\n\n        // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n    }\n\n    return status;\n}\n\n\n/*++\n\n  NTSTATUS\n  RtlUnicodeStringPrintfEx(\n  _Inout_              PUNICODE_STRING DestinationString   OPTIONAL,\n  _Out_opt_            PUNICODE_STRING RemainingString     OPTIONAL,\n  _In_                 DWORD           dwFlags,\n  _In_ _Printf_format_string_ PCWSTR          pszFormat           OPTIONAL,\n  ...\n  );\n\n  Routine Description:\n\n  This routine is a safer version of the C built-in function 'sprintf' with\n  some additional parameters for PUNICODE_STRINGs. In addition to the\n  functionality provided by RtlUnicodeStringPrintf, this routine also\n  returns a PUNICODE_STRING which points to the end of the destination\n  string. The flags parameter allows additional controls.\n\nArguments:\n\nDestinationString   -   pointer to the counted unicode destination string\n\nRemainingString     -   if RemainingString is non-null, the function will format\nthe pointer with the remaining buffer and number of\nbytes left in the destination string\n\ndwFlags             -   controls some details of the string copy:\n\nSTRSAFE_FILL_BEHIND\nif the function succeeds, the low byte of dwFlags will be\nused to fill the uninitialize part of destination buffer\n\nSTRSAFE_IGNORE_NULLS\ndo not fault if DestinationString is null and treat NULL pszFormat like\nempty strings (L\"\").\n\nSTRSAFE_FILL_ON_FAILURE\nif the function fails, the low byte of dwFlags will be\nused to fill all of the destination buffer. This will\noverwrite any truncated string returned when the failure is\nSTATUS_BUFFER_OVERFLOW\n\nSTRSAFE_NO_TRUNCATION /\nSTRSAFE_ZERO_LENGTH_ON_FAILURE\nif the function fails, the destination Length will be set\nto zero. This will overwrite any truncated string\nreturned when the failure is STATUS_BUFFER_OVERFLOW.\n\npszFormat           -   format string which must be null terminated\n\n...                 -   additional parameters to be formatted according to\nthe format string\n\nNotes:\nBehavior is undefined if destination, format strings or any arguments\nstrings overlap.\n\nDestinationString and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS\nflag is specified.  If STRSAFE_IGNORE_NULLS is passed, both DestinationString and\npszFormat may be NULL.  An error may still be returned even though NULLS\nare ignored due to insufficient space.\n\nReturn Value:\n\nSTATUS_SUCCESS -   if there was sufficient space in the dest buffer for\nthe resultant string\n\nfailure        -   the operation did not succeed\n\n\nSTATUS_BUFFER_OVERFLOW\nNote: This status has the severity class Warning - IRPs completed with this\nstatus do have their data copied back to user mode\n-   this return value is an indication that the print\noperation failed due to insufficient space. When this\nerror occurs, the destination buffer is modified to\ncontain a truncated version of the ideal result. This is\nuseful for situations where truncation is ok.\n\nIt is strongly recommended to use the NT_SUCCESS() macro to test the\nreturn value of this function\n\n--*/\n\nNTSTRSAFEDDI\nRtlUnicodeStringPrintfEx(\n        _Inout_ PUNICODE_STRING DestinationString,\n        _Out_opt_ PUNICODE_STRING RemainingString,\n        _In_ DWORD dwFlags,\n        _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n        ...)\n{\n    NTSTATUS status;\n    wchar_t* pszDest;\n    size_t cchDest;\n\n    status = RtlUnicodeStringValidateDestWorker(DestinationString,\n            &pszDest,\n            &cchDest,\n            NULL,\n            NTSTRSAFE_UNICODE_STRING_MAX_CCH,\n            dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        wchar_t* pszDestEnd = pszDest;\n        size_t cchRemaining = cchDest;\n        size_t cchNewDestLength = 0;\n\n        status = RtlStringExValidateSrcW(&pszFormat, NULL, NTSTRSAFE_UNICODE_STRING_MAX_CCH, dwFlags);\n\n        if (NT_SUCCESS(status))\n        {\n            if (dwFlags & (~STRSAFE_UNICODE_STRING_VALID_FLAGS))\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n            else if (cchDest == 0)\n            {\n                // only fail if there was actually a non-empty format string\n                if (*pszFormat != L'\\0')\n                {\n                    if (pszDest == NULL)\n                    {\n                        status = STATUS_INVALID_PARAMETER;\n                    }\n                    else\n                    {\n                        status = STATUS_BUFFER_OVERFLOW;\n                    }\n                }\n            }\n            else\n            {\n                va_list argList;\n\n                va_start(argList, pszFormat);\n\n                status = RtlWideCharArrayVPrintfWorker(pszDest,\n                        cchDest,\n                        &cchNewDestLength,\n                        pszFormat,\n                        argList);\n\n                va_end(argList);\n\n                pszDestEnd = pszDest + cchNewDestLength;\n                cchRemaining = cchDest - cchNewDestLength;\n\n                if (NT_SUCCESS(status)              &&\n                        (dwFlags & STRSAFE_FILL_BEHIND) &&\n                        (cchRemaining != 0))\n                {\n                    // handle the STRSAFE_FILL_BEHIND flag\n                    RtlUnicodeStringExHandleFill(pszDestEnd, cchRemaining, dwFlags);\n                }\n            }\n        }\n\n        if (!NT_SUCCESS(status)                                                                                      &&\n                (dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_ZERO_LENGTH_ON_FAILURE))  &&\n                (cchDest != 0))\n        {\n            // handle the STRSAFE_NO_TRUNCATION, STRSAFE_FILL_ON_FAILURE, and STRSAFE_ZERO_LENGTH_ON_FAILURE flags\n            RtlUnicodeStringExHandleOtherFlags(pszDest,\n                    cchDest,\n                    0,\n                    &cchNewDestLength,\n                    &pszDestEnd,\n                    &cchRemaining,\n                    dwFlags);\n        }\n\n        if (DestinationString)\n        {\n            // safe to multiply cchNewDestLength * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n            DestinationString->Length = (USHORT)(cchNewDestLength * sizeof(wchar_t));\n        }\n\n        if (NT_SUCCESS(status) || (status == STATUS_BUFFER_OVERFLOW))\n        {\n            if (RemainingString)\n            {\n                RemainingString->Length = 0;\n                // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                RemainingString->MaximumLength = (USHORT)(cchRemaining * sizeof(wchar_t));\n                RemainingString->Buffer = pszDestEnd;\n            }\n        }\n    }\n\n    return status;\n}\n\n#endif  // !_M_CEE_PURE\n\n#pragma warning(pop)\n\n#endif  // !NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n\n\n#endif  // !NTSTRSAFE_LIB_IMPL\n\n// Below here are the worker functions that actually do the work\n\n#if defined(NTSTRSAFE_LIB_IMPL) || !defined(NTSTRSAFE_LIB)\n\n#pragma warning(push)\n#pragma warning(disable:__WARNING_RETURNING_BAD_RESULT)\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringLengthWorkerA(\n            _In_reads_or_z_(cchMax) STRSAFE_PCNZCH psz,\n            _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchOriginalMax = cchMax;\n\n    while (cchMax && (*psz != '\\0'))\n    {\n        psz++;\n        cchMax--;\n    }\n\n    if (cchMax == 0)\n    {\n        // the string is longer than cchMax\n        status = STATUS_INVALID_PARAMETER;\n    }\n\n    if (pcchLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            *pcchLength = cchOriginalMax - cchMax;\n        }\n        else\n        {\n            *pcchLength = 0;\n        }\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringLengthWorkerW(\n            _In_reads_or_z_(cchMax) STRSAFE_PCNZWCH psz,\n            _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchOriginalMax = cchMax;\n\n    while (cchMax && (*psz != L'\\0'))\n    {\n        psz++;\n        cchMax--;\n    }\n\n    if (cchMax == 0)\n    {\n        // the string is longer than cchMax\n        status = STATUS_INVALID_PARAMETER;\n    }\n\n    if (pcchLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            *pcchLength = cchOriginalMax - cchMax;\n        }\n        else\n        {\n            *pcchLength = 0;\n        }\n    }\n\n    return status;\n}\n\n#ifdef ALIGNMENT_MACHINE\nNTSTRSAFEWORKERDDI\n    RtlUnalignedStringLengthWorkerW(\n            _In_reads_or_z_(cchMax) STRSAFE_PCUNZWCH psz,\n            _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,\n            _Out_opt_ _Deref_out_range_(<, cchMax) size_t* pcchLength)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchOriginalMax = cchMax;\n\n    while (cchMax && (*psz != L'\\0'))\n    {\n        psz++;\n        cchMax--;\n    }\n\n    if (cchMax == 0)\n    {\n        // the string is longer than cchMax\n        status = STATUS_INVALID_PARAMETER;\n    }\n\n    if (pcchLength)\n    {\n        if (NT_SUCCESS(status))\n        {\n            *pcchLength = cchOriginalMax - cchMax;\n        }\n        else\n        {\n            *pcchLength = 0;\n        }\n    }\n\n    return status;\n}\n#endif  // ALIGNMENT_MACHINE\n\n\n#pragma warning(pop)\n\n// Intentionally allow null deref when STRSAFE_IGNORE_NULLS is not present.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_3)\n#pragma warning(disable : __WARNING_RETURNING_BAD_RESULT)\n#pragma warning(disable : __WARNING_MISSING_ZERO_TERMINATION2)\n\n\n_When_(_Old_(*ppszSrc) != NULL, _Unchanged_(*ppszSrc))\n_When_(_Old_(*ppszSrc) == NULL, _At_(*ppszSrc, _Post_z_))\n    NTSTRSAFEWORKERDDI\n    RtlStringExValidateSrcA(\n            _Inout_ _Deref_post_notnull_ STRSAFE_PCNZCH* ppszSrc,\n            _Inout_opt_\n            _Deref_out_range_(<, cchMax)\n            _Deref_out_range_(<=, _Old_(*pcchToRead)) size_t* pcchToRead,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (pcchToRead && (*pcchToRead >= cchMax))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else if ((dwFlags & STRSAFE_IGNORE_NULLS) && (*ppszSrc == NULL))\n    {\n        *ppszSrc = \"\";\n\n        if (pcchToRead)\n        {\n            *pcchToRead = 0;\n        }\n    }\n\n    return status;\n}\n\n\n\n_When_(_Old_(*ppszSrc) != NULL, _Unchanged_(*ppszSrc))\n_When_(_Old_(*ppszSrc) == NULL, _At_(*ppszSrc, _Post_z_))\n    NTSTRSAFEWORKERDDI\n    RtlStringExValidateSrcW(\n            _Inout_ _Deref_post_notnull_ STRSAFE_PCNZWCH* ppszSrc,\n            _Inout_opt_\n            _Deref_out_range_(<, cchMax)\n            _Deref_out_range_(<=, _Old_(*pcchToRead)) size_t* pcchToRead,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (pcchToRead && (*pcchToRead >= cchMax))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n    else if ((dwFlags & STRSAFE_IGNORE_NULLS) && (*ppszSrc == NULL))\n    {\n        *ppszSrc = L\"\";\n\n        if (pcchToRead)\n        {\n            *pcchToRead = 0;\n        }\n    }\n\n    return status;\n}\n\n\n#pragma warning(pop)    // allow null deref\n\n\n#pragma warning(push)\n#pragma warning(disable : 4100) // Unused parameter (pszDest)\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\n    NTSTRSAFEWORKERDDI\n    RtlStringValidateDestA(\n            _In_reads_opt_(cchDest) STRSAFE_PCNZCH pszDest,\n            _In_ size_t cchDest,\n            _In_ const size_t cchMax)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if ((cchDest == 0) || (cchDest > cchMax))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n\n    return status;\n}\n#pragma warning(pop)\n\n// Intentionally allow null deref when STRSAFE_IGNORE_NULLS is not present.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\n#pragma warning(disable : __WARNING_RANGE_POSTCONDITION_VIOLATION)\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\n    NTSTRSAFEWORKERDDI\n    RtlStringValidateDestAndLengthA(\n            _In_reads_opt_(cchDest) NTSTRSAFE_PCSTR pszDest,\n            _In_ size_t cchDest,\n            _Out_ _Deref_out_range_(0, cchDest - 1) size_t* pcchDestLength,\n            _In_ const size_t cchMax)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestA(pszDest, cchDest, cchMax);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringLengthWorkerA(pszDest, cchDest, pcchDestLength);\n    }\n    else\n    {\n        *pcchDestLength = 0;\n    }\n\n    return status;\n}\n// End intentionally allow null deref.\n#pragma warning(pop)\n\n\n\n#pragma warning(push)\n#pragma warning(disable : 4100) // Unused parameter (pszDest)\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\n    NTSTRSAFEWORKERDDI\n    RtlStringValidateDestW(\n            _In_reads_opt_(cchDest) STRSAFE_PCNZWCH pszDest,\n            _In_ size_t cchDest,\n            _In_ const size_t cchMax)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if ((cchDest == 0) || (cchDest > cchMax))\n    {\n        status = STATUS_INVALID_PARAMETER;\n    }\n\n    return status;\n}\n#pragma warning(pop)\n\n// Intentionally allow null deref when STRSAFE_IGNORE_NULLS is not present.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\n#pragma warning(disable : __WARNING_RANGE_POSTCONDITION_VIOLATION)\n\n_Post_satisfies_(cchDest > 0 && cchDest <= cchMax)\n    NTSTRSAFEWORKERDDI\n    RtlStringValidateDestAndLengthW(\n            _In_reads_opt_(cchDest) NTSTRSAFE_PCWSTR pszDest,\n            _In_ size_t cchDest,\n            _Out_ _Deref_out_range_(0, cchDest - 1) size_t* pcchDestLength,\n            _In_ const size_t cchMax)\n{\n    NTSTATUS status;\n\n    status = RtlStringValidateDestW(pszDest, cchDest, cchMax);\n\n    if (NT_SUCCESS(status))\n    {\n        status = RtlStringLengthWorkerW(pszDest, cchDest, pcchDestLength);\n    }\n    else\n    {\n        *pcchDestLength = 0;\n    }\n\n    return status;\n}\n// End intentionally allow null deref.\n#pragma warning(pop)\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringExValidateDestA(\n            _In_reads_opt_(cchDest) STRSAFE_PCNZCH pszDest,\n            _In_ size_t cchDest,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (dwFlags & STRSAFE_IGNORE_NULLS)\n    {\n        if (((pszDest == NULL) && (cchDest != 0))   ||\n                (cchDest > cchMax))\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n    }\n    else\n    {\n        status = RtlStringValidateDestA(pszDest, cchDest, cchMax);\n    }\n\n    return status;\n}\n\n// Intentionally allow null deref when STRSAFE_IGNORE_NULLS is not present.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\nNTSTRSAFEWORKERDDI\n    RtlStringExValidateDestAndLengthA(\n            _In_reads_opt_(cchDest) NTSTRSAFE_PCSTR pszDest,\n            _In_ size_t cchDest,\n            _Out_ _Deref_out_range_(0, (cchDest>0?cchDest-1:0)) size_t* pcchDestLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    if (dwFlags & STRSAFE_IGNORE_NULLS)\n    {\n        status = RtlStringExValidateDestA(pszDest, cchDest, cchMax, dwFlags);\n\n        if (!NT_SUCCESS(status) || (cchDest == 0))\n        {\n            *pcchDestLength = 0;\n        }\n        else\n        {\n            status = RtlStringLengthWorkerA(pszDest, cchDest, pcchDestLength);\n        }\n    }\n    else\n    {\n        status = RtlStringValidateDestAndLengthA(pszDest,\n                cchDest,\n                pcchDestLength,\n                cchMax);\n    }\n\n    return status;\n}\n// End intentionally allow null deref.\n#pragma warning(pop)\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringExValidateDestW(\n            _In_reads_opt_(cchDest) STRSAFE_PCNZWCH pszDest,\n            _In_ size_t cchDest,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (dwFlags & STRSAFE_IGNORE_NULLS)\n    {\n        if (((pszDest == NULL) && (cchDest != 0))   ||\n                (cchDest > cchMax))\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n    }\n    else\n    {\n        status = RtlStringValidateDestW(pszDest, cchDest, cchMax);\n    }\n\n    return status;\n}\n\n// Intentionally allow null deref when STRSAFE_IGNORE_NULLS is not present.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\nNTSTRSAFEWORKERDDI\n    RtlStringExValidateDestAndLengthW(\n            _In_reads_opt_(cchDest) NTSTRSAFE_PCWSTR pszDest,\n            _In_ size_t cchDest,\n            _Out_ _Deref_out_range_(0, (cchDest>0?cchDest-1:0)) size_t* pcchDestLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    if (dwFlags & STRSAFE_IGNORE_NULLS)\n    {\n        status = RtlStringExValidateDestW(pszDest, cchDest, cchMax, dwFlags);\n\n        if (!NT_SUCCESS(status) || (cchDest == 0))\n        {\n            *pcchDestLength = 0;\n        }\n        else\n        {\n            status = RtlStringLengthWorkerW(pszDest, cchDest, pcchDestLength);\n        }\n    }\n    else\n    {\n        status = RtlStringValidateDestAndLengthW(pszDest,\n                cchDest,\n                pcchDestLength,\n                cchMax);\n    }\n\n    return status;\n}\n// End intentionally allow null deref.\n#pragma warning(pop)\n\n\n#pragma warning(push)\n#pragma warning(disable:__WARNING_RETURNING_BAD_RESULT)\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringCopyWorkerA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n            _Always_(_Out_opt_ _Deref_out_range_(<=, (cchToCopy < cchDest) ? cchToCopy : (cchDest - 1))) size_t* pcchNewDestLength,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZCH pszSrc,\n            _In_ _In_range_(<, NTSTRSAFE_MAX_CCH) size_t cchToCopy)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchNewDestLength = 0;\n\n    // ASSERT(cchDest != 0);\n\n    while (cchDest && cchToCopy && (*pszSrc != '\\0'))\n    {\n        *pszDest++ = *pszSrc++;\n        cchDest--;\n        cchToCopy--;\n\n        cchNewDestLength++;\n    }\n\n    if (cchDest == 0)\n    {\n        // we are going to truncate pszDest\n        pszDest--;\n        cchNewDestLength--;\n\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n\n    *pszDest = '\\0';\n\n    if (pcchNewDestLength)\n    {\n        *pcchNewDestLength = cchNewDestLength;\n    }\n\n    return status;\n}\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringCopyWorkerW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n            _Always_(_Out_opt_ _Deref_out_range_(<=, (cchToCopy < cchDest) ? cchToCopy : (cchDest - 1))) size_t* pcchNewDestLength,\n            _In_reads_or_z_(cchToCopy) STRSAFE_PCNZWCH pszSrc,\n            _In_ _In_range_(<, NTSTRSAFE_MAX_CCH) size_t cchToCopy)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchNewDestLength = 0;\n\n    // ASSERT(cchDest != 0);\n\n    while (cchDest && cchToCopy && (*pszSrc != L'\\0'))\n    {\n        *pszDest++ = *pszSrc++;\n        cchDest--;\n        cchToCopy--;\n\n        cchNewDestLength++;\n    }\n\n    if (cchDest == 0)\n    {\n        // we are going to truncate pszDest\n        pszDest--;\n        cchNewDestLength--;\n\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n\n    *pszDest = L'\\0';\n\n    if (pcchNewDestLength)\n    {\n        *pcchNewDestLength = cchNewDestLength;\n    }\n\n    return status;\n}\n\n\n#pragma warning(pop)\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringVPrintfWorkerA(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n            _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    int iRet;\n    size_t cchMax;\n    size_t cchNewDestLength = 0;\n\n    // leave the last space for the null terminator\n    cchMax = cchDest - 1;\n\n#if (NTSTRSAFE_USE_SECURE_CRT == 1) && !defined(NTSTRSAFE_LIB_IMPL)\n    iRet = _vsnprintf_s(pszDest, cchDest, cchMax, pszFormat, argList);\n#else\n#pragma warning(push)\n#pragma warning(disable: __WARNING_BANNED_API_USAGE)// \"STRSAFE not included\"\n    iRet = _vsnprintf(pszDest, cchMax, pszFormat, argList);\n#pragma warning(pop)\n#endif\n    // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));\n\n    if ((iRet < 0) || (((size_t)iRet) > cchMax))\n    {\n        // need to null terminate the string\n        pszDest += cchMax;\n        *pszDest = '\\0';\n\n        cchNewDestLength = cchMax;\n\n        // we have truncated pszDest\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n    else if (((size_t)iRet) == cchMax)\n    {\n        // need to null terminate the string\n        pszDest += cchMax;\n        *pszDest = '\\0';\n\n        cchNewDestLength = cchMax;\n    }\n    else\n    {\n        cchNewDestLength = (size_t)iRet;\n    }\n\n    if (pcchNewDestLength)\n    {\n        *pcchNewDestLength = cchNewDestLength;\n    }\n\n    return status;\n}\n\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringVPrintfWorkerW(\n            _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchDest,\n            _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    int iRet;\n    size_t cchMax;\n    size_t cchNewDestLength = 0;\n\n    // leave the last space for the null terminator\n    cchMax = cchDest - 1;\n\n#if (NTSTRSAFE_USE_SECURE_CRT == 1) && !defined(NTSTRSAFE_LIB_IMPL)\n    iRet = _vsnwprintf_s(pszDest, cchDest, cchMax, pszFormat, argList);\n#else\n#pragma warning(push)\n#pragma warning(disable: __WARNING_BANNED_API_USAGE)// \"STRSAFE not included\"\n    iRet = _vsnwprintf(pszDest, cchMax, pszFormat, argList);\n#pragma warning(pop)\n#endif\n    // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));\n\n    if ((iRet < 0) || (((size_t)iRet) > cchMax))\n    {\n        // need to null terminate the string\n        pszDest += cchMax;\n        *pszDest = L'\\0';\n\n        cchNewDestLength = cchMax;\n\n        // we have truncated pszDest\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n    else if (((size_t)iRet) == cchMax)\n    {\n        // need to null terminate the string\n        pszDest += cchMax;\n        *pszDest = L'\\0';\n\n        cchNewDestLength = cchMax;\n    }\n    else\n    {\n        cchNewDestLength = (size_t)iRet;\n    }\n\n    if (pcchNewDestLength)\n    {\n        *pcchNewDestLength = cchNewDestLength;\n    }\n\n    return status;\n}\n\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringExHandleFillBehindNullA(\n            _Inout_updates_bytes_(cbRemaining) NTSTRSAFE_PSTR pszDestEnd,\n            _In_ size_t cbRemaining,\n            _In_ DWORD dwFlags)\n{\n    if (cbRemaining > sizeof(char))\n    {\n        memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), cbRemaining - sizeof(char));\n    }\n\n    return STATUS_SUCCESS;\n}\n\n\n\nNTSTRSAFEWORKERDDI\n    RtlStringExHandleFillBehindNullW(\n            _Inout_updates_bytes_(cbRemaining) NTSTRSAFE_PWSTR pszDestEnd,\n            _In_ size_t cbRemaining,\n            _In_ DWORD dwFlags)\n{\n    if (cbRemaining > sizeof(wchar_t))\n    {\n        memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), cbRemaining - sizeof(wchar_t));\n    }\n\n    return STATUS_SUCCESS;\n}\n\n\n// ignore false positives due to complexity of bitflag usage\n#pragma warning(push)\n#pragma warning(disable : __WARNING_USING_UNINIT_VAR)\n#pragma warning(disable : __WARNING_RETURN_UNINIT_VAR)\n#pragma warning(disable : __WARNING_MISSING_ZERO_TERMINATION2)\n#pragma warning(disable : __WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION)\n#pragma warning(disable:__WARNING_POTENTIAL_RANGE_POSTCONDITION_VIOLATION)\n\n\n_Success_(1)  // always succeeds, no exit tests needed\n    NTSTRSAFEWORKERDDI\n    RtlStringExHandleOtherFlagsA(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbDest,\n            _In_ _In_range_(0, cbDest>sizeof(char)?(cbDest / sizeof(char)) - 1:0) size_t cchOriginalDestLength,\n            _Outptr_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR* ppszDestEnd,\n            _Out_ _Deref_out_range_(0, cbDest / sizeof(char)) size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    size_t cchDest = cbDest / sizeof(char);\n\n    _Analysis_assume_(dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE));\n\n    if ((cchDest > 0) && (dwFlags & STRSAFE_NO_TRUNCATION))\n    {\n        char* pszOriginalDestEnd;\n\n        pszOriginalDestEnd = pszDest + cchOriginalDestLength;\n\n        *ppszDestEnd = pszOriginalDestEnd;\n        *pcchRemaining = cchDest - cchOriginalDestLength;\n\n        // null terminate the end of the original string\n        *pszOriginalDestEnd = '\\0';\n    }\n\n    if (dwFlags & STRSAFE_FILL_ON_FAILURE)\n    {\n        memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);\n\n        if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)\n        {\n            *ppszDestEnd = pszDest;\n            *pcchRemaining = cchDest;\n            _Analysis_assume_(*pszDest == '\\0');\n        }\n        else if (cchDest > 0)\n        {\n            char* pszDestEnd;\n\n            pszDestEnd = pszDest + cchDest - 1;\n\n            *ppszDestEnd = pszDestEnd;\n            *pcchRemaining = 1;\n\n            // null terminate the end of the string\n            *pszDestEnd = L'\\0';\n        }\n    }\n\n    if ((cchDest > 0) && (dwFlags & STRSAFE_NULL_ON_FAILURE))\n    {\n        *ppszDestEnd = pszDest;\n        *pcchRemaining = cchDest;\n\n        // null terminate the beginning of the string\n        *pszDest = '\\0';\n    }\n\n    return STATUS_SUCCESS;\n}\n\n\n\n_Success_(1)  // always succeeds, no exit tests needed\n    NTSTRSAFEWORKERDDI\n    RtlStringExHandleOtherFlagsW(\n            _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbDest,\n            _In_ _In_range_(0, cbDest>sizeof(wchar_t)?(cbDest / sizeof(wchar_t)) - 1:0) size_t cchOriginalDestLength,\n            _Outptr_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR* ppszDestEnd,\n            _Out_ _Deref_out_range_(0, cbDest / sizeof(wchar_t)) size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    size_t cchDest = cbDest / sizeof(wchar_t);\n\n    _Analysis_assume_(dwFlags & (STRSAFE_NO_TRUNCATION | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE));\n\n    if ((cchDest > 0) && (dwFlags & STRSAFE_NO_TRUNCATION))\n    {\n        wchar_t* pszOriginalDestEnd;\n\n        pszOriginalDestEnd = pszDest + cchOriginalDestLength;\n\n        *ppszDestEnd = pszOriginalDestEnd;\n        *pcchRemaining = cchDest - cchOriginalDestLength;\n\n        // null terminate the end of the original string\n        *pszOriginalDestEnd = L'\\0';\n    }\n\n    if (dwFlags & STRSAFE_FILL_ON_FAILURE)\n    {\n        memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);\n\n        if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)\n        {\n            *ppszDestEnd = pszDest;\n            *pcchRemaining = cchDest;\n            _Analysis_assume_(cchDest == 0 || *pszDest == L'\\0');\n        }\n        else if (cchDest > 0)\n        {\n            wchar_t* pszDestEnd;\n\n            pszDestEnd = pszDest + cchDest - 1;\n\n            *ppszDestEnd = pszDestEnd;\n            *pcchRemaining = 1;\n\n            // null terminate the end of the string\n            *pszDestEnd = L'\\0';\n        }\n    }\n\n    if ((cchDest > 0) && (dwFlags & STRSAFE_NULL_ON_FAILURE))\n    {\n        *ppszDestEnd = pszDest;\n        *pcchRemaining = cchDest;\n\n        // null terminate the beginning of the string\n        *pszDest = L'\\0';\n    }\n\n    return STATUS_SUCCESS;\n}\n\n\n#pragma warning(pop)   // ignore false positives due to complexity of bitflag usage\n\n\n#ifndef NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_INCORRECT_ANNOTATION)\n#pragma warning(disable : __WARNING_HIGH_PRIORITY_OVERFLOW_POSTCONDITION)\n\n_Use_decl_annotations_\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringInitWorker(\n        PUNICODE_STRING DestinationString,\n        NTSTRSAFE_PCWSTR pszSrc,\n        const size_t cchMax,\n        DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (DestinationString || !(dwFlags & STRSAFE_IGNORE_NULLS))\n    {\n        memset(DestinationString, 0, sizeof(*DestinationString));\n    }\n\n    if (pszSrc)\n    {\n        size_t cchSrcLength;\n\n        status = RtlStringLengthWorkerW(pszSrc, cchMax, &cchSrcLength);\n\n        if (NT_SUCCESS(status))\n        {\n            if (DestinationString)\n            {\n                size_t cbLength;\n\n                // safe to multiply cchSrcLength * sizeof(wchar_t) since cchSrcLength < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n                cbLength = cchSrcLength * sizeof(wchar_t);\n\n                DestinationString->Length = (USHORT)cbLength;\n                // safe to add cbLength + sizeof(wchar_t) since cchSrcLength < NTSTRSAFE_UNICODE_STRING_MAX_CCH\n                DestinationString->MaximumLength = (USHORT)(cbLength + sizeof(wchar_t));\n                DestinationString->Buffer = (PWSTR)pszSrc;\n            }\n            else\n            {\n                status = STATUS_INVALID_PARAMETER;\n            }\n        }\n    }\n\n    return status;\n}\n\n// Intentionally allow null deref in error cases.\n#pragma warning(push)\n#pragma warning(disable : __WARNING_DEREF_NULL_PTR)\n#pragma warning(disable : __WARNING_INVALID_PARAM_VALUE_1)\n#pragma warning(disable : __WARNING_RETURNING_BAD_RESULT)\n\nNTSTRSAFEWORKERDDI\nRtlUnicodeStringValidateWorker(\n        _In_opt_ PCUNICODE_STRING SourceString,\n        _In_ const size_t cchMax,\n        _In_ DWORD dwFlags)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    if (SourceString || !(dwFlags & STRSAFE_IGNORE_NULLS))\n    {\n        if (((SourceString->Length % sizeof(wchar_t)) != 0)         ||\n                ((SourceString->MaximumLength % sizeof(wchar_t)) != 0)  ||\n                (SourceString->Length > SourceString->MaximumLength)    ||\n                (SourceString->MaximumLength > (cchMax * sizeof(wchar_t))))\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n        else if ((SourceString->Buffer == NULL) &&\n                ((SourceString->Length != 0) || (SourceString->MaximumLength != 0)))\n        {\n            status = STATUS_INVALID_PARAMETER;\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_RANGE_POSTCONDITION_VIOLATION)\n\n_Post_satisfies_(*pcchSrcLength*sizeof(wchar_t) == SourceString->MaximumLength)\n    NTSTRSAFEWORKERDDI\n    RtlUnicodeStringValidateSrcWorker(\n            _In_ PCUNICODE_STRING SourceString,\n            _Outptr_result_buffer_(*pcchSrcLength) wchar_t** ppszSrc,\n            _Out_ size_t* pcchSrcLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    *ppszSrc = NULL;\n    *pcchSrcLength = 0;\n\n    status = RtlUnicodeStringValidateWorker(SourceString, cchMax, dwFlags);\n\n    if (NT_SUCCESS(status))\n    {\n        if (SourceString)\n        {\n            *ppszSrc = SourceString->Buffer;\n            *pcchSrcLength = SourceString->Length / sizeof(wchar_t);\n        }\n\n        if ((*ppszSrc == NULL) && (dwFlags & STRSAFE_IGNORE_NULLS))\n        {\n            *ppszSrc = (wchar_t*)L\"\";\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n// End intentionally allow null deref.\n#pragma warning(pop)\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_RANGE_POSTCONDITION_VIOLATION)\n\n_Post_satisfies_(*pcchDest*sizeof(wchar_t) == DestinationString->MaximumLength)\n    NTSTRSAFEWORKERDDI\n    RtlUnicodeStringValidateDestWorker(\n            _In_ PCUNICODE_STRING DestinationString,\n            _Outptr_result_buffer_(*pcchDest) wchar_t** ppszDest,\n            _Out_ size_t* pcchDest,\n            _Out_opt_ size_t* pcchDestLength,\n            _In_ const size_t cchMax,\n            _In_ DWORD dwFlags)\n{\n    NTSTATUS status;\n\n    *ppszDest = NULL;\n    *pcchDest = 0;\n\n    if (pcchDestLength)\n    {\n        *pcchDestLength = 0;\n    }\n\n    status = RtlUnicodeStringValidateWorker(DestinationString, cchMax, dwFlags);\n\n    if (NT_SUCCESS(status) && DestinationString)\n    {\n        *ppszDest = DestinationString->Buffer;\n        *pcchDest = DestinationString->MaximumLength / sizeof(wchar_t);\n\n        if (pcchDestLength)\n        {\n            *pcchDestLength = DestinationString->Length / sizeof(wchar_t);\n        }\n    }\n\n    return status;\n}\n\n#pragma warning(pop)\n\nNTSTRSAFEWORKERDDI\n    RtlStringCopyWideCharArrayWorker(\n            _Out_writes_(cchDest) NTSTRSAFE_PWSTR pszDest,\n            _In_ size_t cchDest,\n            _Out_opt_ size_t* pcchNewDestLength,\n            _In_reads_(cchSrcLength) const wchar_t* pszSrc,\n            _In_ size_t cchSrcLength)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchNewDestLength = 0;\n\n    // ASSERT(cchDest != 0);\n\n    while (cchDest && cchSrcLength)\n    {\n        *pszDest++ = *pszSrc++;\n        cchDest--;\n        cchSrcLength--;\n\n        cchNewDestLength++;\n    }\n\n    if (cchDest == 0)\n    {\n        // we are going to truncate pszDest\n        pszDest--;\n        cchNewDestLength--;\n\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n\n    *pszDest = L'\\0';\n\n    if (pcchNewDestLength)\n    {\n        *pcchNewDestLength = cchNewDestLength;\n    }\n\n    return status;\n}\n\nNTSTRSAFEWORKERDDI\n    RtlWideCharArrayCopyStringWorker(\n            _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n            _In_ size_t cchDest,\n            _Out_ size_t* pcchNewDestLength,\n            _In_ NTSTRSAFE_PCWSTR pszSrc,\n            _In_ size_t cchToCopy)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchNewDestLength = 0;\n\n    while (cchDest && cchToCopy && (*pszSrc != L'\\0'))\n    {\n        *pszDest++ = *pszSrc++;\n        cchDest--;\n        cchToCopy--;\n\n        cchNewDestLength++;\n    }\n\n    if ((cchDest == 0) && (cchToCopy != 0) && (*pszSrc != L'\\0'))\n    {\n        // we are going to truncate pszDest\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n\n    *pcchNewDestLength = cchNewDestLength;\n\n    return status;\n}\n\nNTSTRSAFEWORKERDDI\n    RtlWideCharArrayCopyWorker(\n            _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n            _In_ size_t cchDest,\n            _Out_ size_t* pcchNewDestLength,\n            _In_reads_(cchSrcLength) const wchar_t* pszSrc,\n            _In_ size_t cchSrcLength)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    size_t cchNewDestLength = 0;\n\n    while (cchDest && cchSrcLength)\n    {\n        *pszDest++ = *pszSrc++;\n        cchDest--;\n        cchSrcLength--;\n\n        cchNewDestLength++;\n    }\n\n    if ((cchDest == 0) && (cchSrcLength != 0))\n    {\n        // we are going to truncate pszDest\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n\n    *pcchNewDestLength = cchNewDestLength;\n\n    return status;\n}\n\nNTSTRSAFEWORKERDDI\n    RtlWideCharArrayVPrintfWorker(\n            _Out_writes_to_(cchDest, *pcchNewDestLength) wchar_t* pszDest,\n            _In_ size_t cchDest,\n            _Out_ size_t* pcchNewDestLength,\n            _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,\n            _In_ va_list argList)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n    int iRet;\n\n#pragma warning(push)\n#pragma warning(disable: __WARNING_BANNED_API_USAGE)// \"STRSAFE not included\"\n    iRet = _vsnwprintf(pszDest, cchDest, pszFormat, argList);\n#pragma warning(pop)\n    // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));\n\n    if ((iRet < 0) || (((size_t)iRet) > cchDest))\n    {\n        *pcchNewDestLength = cchDest;\n\n        // we have truncated pszDest\n        status = STATUS_BUFFER_OVERFLOW;\n    }\n    else\n    {\n        *pcchNewDestLength = (size_t)iRet;\n    }\n\n    return status;\n}\n\nNTSTRSAFEWORKERDDI\n    RtlUnicodeStringExHandleFill(\n            _Out_writes_(cchRemaining) wchar_t* pszDestEnd,\n            _In_ size_t cchRemaining,\n            _In_ DWORD dwFlags)\n{\n    size_t cbRemaining;\n\n    // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n    cbRemaining = cchRemaining * sizeof(wchar_t);\n\n    memset(pszDestEnd, STRSAFE_GET_FILL_PATTERN(dwFlags), cbRemaining);\n\n    return STATUS_SUCCESS;\n}\n\n// ignore false positives due to complexity of bitflag usage\n#pragma warning(push)\n#pragma warning(disable : __WARNING_USING_UNINIT_VAR)\n#pragma warning(disable : __WARNING_RETURN_UNINIT_VAR)\n\nNTSTRSAFEWORKERDDI\n    RtlUnicodeStringExHandleOtherFlags(\n            _Inout_updates_(cchDest) wchar_t* pszDest,\n            _In_ size_t cchDest,\n            _In_ size_t cchOriginalDestLength,\n            _Out_ size_t* pcchNewDestLength,\n            _Outptr_result_buffer_(*pcchRemaining) wchar_t** ppszDestEnd,\n            _Out_ size_t* pcchRemaining,\n            _In_ DWORD dwFlags)\n{\n    if (dwFlags & STRSAFE_NO_TRUNCATION)\n    {\n        *ppszDestEnd = pszDest + cchOriginalDestLength;\n        *pcchRemaining = cchDest - cchOriginalDestLength;\n\n        *pcchNewDestLength = cchOriginalDestLength;\n    }\n\n    if (dwFlags & STRSAFE_FILL_ON_FAILURE)\n    {\n        size_t cbDest;\n\n        // safe to multiply cchDest * sizeof(wchar_t) since cchDest < NTSTRSAFE_UNICODE_STRING_MAX_CCH and sizeof(wchar_t) is 2\n        cbDest = cchDest * sizeof(wchar_t);\n\n        memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);\n\n        *ppszDestEnd = pszDest;\n        *pcchRemaining = cchDest;\n\n        *pcchNewDestLength = 0;\n    }\n\n    if (dwFlags & STRSAFE_ZERO_LENGTH_ON_FAILURE)\n    {\n        *ppszDestEnd = pszDest;\n        *pcchRemaining = cchDest;\n\n        *pcchNewDestLength = 0;\n    }\n\n    return STATUS_SUCCESS;\n}\n\n#pragma warning(pop)\n\n#pragma warning(pop)\n\n#endif  // !NTSTRSAFE_NO_UNICODE_STRING_FUNCTIONS\n\n\n#endif  // defined(NTSTRSAFE_LIB_IMPL) || !defined(NTSTRSAFE_LIB)\n\n\n// Do not call these functions, they are worker functions for internal use within this file\n#ifdef DEPRECATE_SUPPORTED\n#pragma deprecated(RtlStringLengthWorkerA)\n#pragma deprecated(RtlStringLengthWorkerW)\n#pragma deprecated(RtlUnalignedStringLengthWorkerW)\n#pragma deprecated(RtlStringExValidateSrcA)\n#pragma deprecated(RtlStringExValidateSrcW)\n#pragma deprecated(RtlStringValidateDestA)\n#pragma deprecated(RtlStringValidateDestAndLengthA)\n#pragma deprecated(RtlStringValidateDestW)\n#pragma deprecated(RtlStringValidateDestAndLengthW)\n#pragma deprecated(RtlStringExValidateDestA)\n#pragma deprecated(RtlStringExValidateDestAndLengthA)\n#pragma deprecated(RtlStringExValidateDestW)\n#pragma deprecated(RtlStringExValidateDestAndLengthW)\n#pragma deprecated(RtlStringCopyWorkerA)\n#pragma deprecated(RtlStringCopyWorkerW)\n#pragma deprecated(RtlStringVPrintfWorkerA)\n#pragma deprecated(RtlStringVPrintfWorkerW)\n#pragma deprecated(RtlStringExHandleFillBehindNullA)\n#pragma deprecated(RtlStringExHandleFillBehindNullW)\n#pragma deprecated(RtlStringExHandleOtherFlagsA)\n#pragma deprecated(RtlStringExHandleOtherFlagsW)\n#pragma deprecated(RtlUnicodeStringInitWorker)\n#pragma deprecated(RtlUnicodeStringValidateWorker)\n#pragma deprecated(RtlUnicodeStringValidateSrcWorker)\n#pragma deprecated(RtlUnicodeStringValidateDestWorker)\n#pragma deprecated(RtlStringCopyWideCharArrayWorker)\n#pragma deprecated(RtlWideCharArrayCopyStringWorker)\n#pragma deprecated(RtlWideCharArrayCopyWorker)\n#pragma deprecated(RtlWideCharArrayVPrintfWorker)\n#pragma deprecated(RtlUnicodeStringExHandleFill)\n#pragma deprecated(RtlUnicodeStringExHandleOtherFlags)\n#else\n#define RtlStringLengthWorkerA             RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA\n#define RtlStringLengthWorkerW             RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW\n#define RtlUnalignedStringLengthWorkerW    RtlUnalignedStringLengthWorkerW_instead_use_UnalignedStringCchLengthW\n#define RtlStringExValidateSrcA            RtlStringExValidateSrcA_do_not_call_this_function\n#define RtlStringExValidateSrcW            RtlStringExValidateSrcW_do_not_call_this_function\n#define RtlStringValidateDestA             RtlStringValidateDestA_do_not_call_this_function\n#define RtlStringValidateDestAndLengthA    RtlStringValidateDestAndLengthA_do_not_call_this_function\n#define RtlStringValidateDestW             RtlStringValidateDestW_do_not_call_this_function\n#define RtlStringValidateDestAndLengthW    RtlStringValidateDestAndLengthW_do_not_call_this_function\n#define RtlStringExValidateDestA           RtlStringExValidateDestA_do_not_call_this_function\n#define RtlStringExValidateDestAndLengthA  RtlStringExValidateDestAndLengthA_do_not_call_this_function\n#define RtlStringExValidateDestW           RtlStringExValidateDestW_do_not_call_this_function\n#define RtlStringExValidateDestAndLengthW  RtlStringExValidateDestAndLengthW_do_not_call_this_function\n#define RtlStringCopyWorkerA               RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCbCopyA\n#define RtlStringCopyWorkerW               RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCbCopyW\n#define RtlStringVPrintfWorkerA            RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCbVPrintfA\n#define RtlStringVPrintfWorkerW            RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCbVPrintfW\n#define RtlStringExHandleFillBehindNullA   RtlStringExHandleFillBehindNullA_do_not_call_this_function\n#define RtlStringExHandleFillBehindNullW   RtlStringExHandleFillBehindNullW_do_not_call_this_function\n#define RtlStringExHandleOtherFlagsA       RtlStringExHandleOtherFlagsA_do_not_call_this_function\n#define RtlStringExHandleOtherFlagsW       RtlStringExHandleOtherFlagsW_do_not_call_this_function\n#define RtlUnicodeStringInitWorker          RtlUnicodeStringInitWorker_instead_use_RtlUnicodeStringInit_or_RtlUnicodeStringInitEx\n#define RtlUnicodeStringValidateWorker      RtlUnicodeStringValidateWorker_instead_use_RtlUnicodeStringValidate_or_RtlUnicodeStringValidateEx\n#define RtlUnicodeStringValidateSrcWorker   RtlUnicodeStringValidateSrcWorker_do_not_call_this_function\n#define RtlUnicodeStringValidateDestWorker  RtlUnicodeStringValidateDestWorker_do_not_call_this_function\n#define RtlStringCopyWideCharArrayWorker    RtlStringCopyWideCharArrayWorker_instead_use_RtlStringCchCopyUnicodeString_or_RtlStringCbCopyUnicodeString\n#define RtlWideCharArrayCopyStringWorker    RtlWideCharArrayCopyStringWorker_instead_use_RtlUnicodeStringCopyString_or_RtlUnicodeStringCopyStringEx\n#define RtlWideCharArrayCopyWorker          RtlWideCharArrayCopyWorker_instead_use_RtlUnicodeStringCopy_or_RtlUnicodeStringCopyEx\n#define RtlWideCharArrayVPrintfWorker       RtlWideCharArrayVPrintfWorker_instead_use_RtlUnicodeStringVPrintf_or_RtlUnicodeStringPrintf\n#define RtlUnicodeStringExHandleFill        RtlUnicodeStringExHandleFill_do_not_call_this_function\n#define RtlUnicodeStringExHandleOtherFlags  RtlUnicodeStringExHandleOtherFlags_do_not_call_this_function\n#endif // !DEPRECATE_SUPPORTED\n\n\n#pragma warning(pop)\n#pragma warning(pop)\n\n#endif  // _NTSTRSAFE_H_INCLUDED_\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntsxs.h",
    "content": "/*\n * Side-by-side assembly support definitions.\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTSXS_H\n#define _NTSXS_H\n\n#define ACTIVATION_CONTEXT_DATA_MAGIC ('xtcA')\n#define ACTIVATION_CONTEXT_DATA_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_FLAG_NO_INHERIT 0x00000001\n\n#if (PHNT_MODE == PHNT_MODE_KERNEL)\ntypedef enum _ACTCTX_REQUESTED_RUN_LEVEL\n{\n    ACTCTX_RUN_LEVEL_UNSPECIFIED = 0,\n    ACTCTX_RUN_LEVEL_AS_INVOKER,\n    ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE,\n    ACTCTX_RUN_LEVEL_REQUIRE_ADMIN,\n    ACTCTX_RUN_LEVEL_NUMBERS\n} ACTCTX_REQUESTED_RUN_LEVEL;\n\ntypedef enum _ACTCTX_COMPATIBILITY_ELEMENT_TYPE\n{\n    ACTCTX_COMPATIBILITY_ELEMENT_TYPE_UNKNOWN = 0,\n    ACTCTX_COMPATIBILITY_ELEMENT_TYPE_OS,\n    ACTCTX_COMPATIBILITY_ELEMENT_TYPE_MITIGATION,\n    ACTCTX_COMPATIBILITY_ELEMENT_TYPE_MAXVERSIONTESTED\n} ACTCTX_COMPATIBILITY_ELEMENT_TYPE;\n#endif // (PHNT_MODE == PHNT_MODE_KERNEL)\n\n#include <pshpack4.h>\n\ntypedef struct _ACTIVATION_CONTEXT_DATA\n{\n    ULONG Magic;\n    ULONG HeaderSize;\n    ULONG FormatVersion;\n    ULONG TotalSize;\n    ULONG DefaultTocOffset; // to ACTIVATION_CONTEXT_DATA_TOC_HEADER\n    ULONG ExtendedTocOffset; // to ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_HEADER\n    ULONG AssemblyRosterOffset; // to ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER\n    ULONG Flags; // ACTIVATION_CONTEXT_FLAG_*\n} ACTIVATION_CONTEXT_DATA, *PACTIVATION_CONTEXT_DATA;\n\n#define ACTIVATION_CONTEXT_DATA_TOC_HEADER_DENSE 0x00000001\n#define ACTIVATION_CONTEXT_DATA_TOC_HEADER_INORDER 0x00000002\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_TOC_HEADER\n{\n    ULONG HeaderSize;\n    ULONG EntryCount;\n    ULONG FirstEntryOffset; // to ACTIVATION_CONTEXT_DATA_TOC_ENTRY[], from ACTIVATION_CONTEXT_DATA base\n    ULONG Flags; // ACTIVATION_CONTEXT_DATA_TOC_HEADER_*\n} ACTIVATION_CONTEXT_DATA_TOC_HEADER, *PACTIVATION_CONTEXT_DATA_TOC_HEADER;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_TOC_ENTRY\n{\n    ULONG Id; // ACTIVATION_CONTEXT_SECTION_*\n    ULONG Offset; // to ACTIVATION_CONTEXT_*_SECTION_HEADER, from ACTIVATION_CONTEXT_DATA base\n    ULONG Length;\n    ULONG Format; // ACTIVATION_CONTEXT_SECTION_FORMAT_*\n} ACTIVATION_CONTEXT_DATA_TOC_ENTRY, *PACTIVATION_CONTEXT_DATA_TOC_ENTRY;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_HEADER\n{\n    ULONG HeaderSize;\n    ULONG EntryCount;\n    ULONG FirstEntryOffset; // to ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_ENTRY[], from ACTIVATION_CONTEXT_DATA base\n    ULONG Flags;\n} ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_HEADER, *PACTIVATION_CONTEXT_DATA_EXTENDED_TOC_HEADER;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_ENTRY\n{\n    GUID ExtensionGuid;\n    ULONG TocOffset; // to ACTIVATION_CONTEXT_DATA_TOC_HEADER, from ACTIVATION_CONTEXT_DATA base\n    ULONG Length;\n} ACTIVATION_CONTEXT_DATA_EXTENDED_TOC_ENTRY, *PACTIVATION_CONTEXT_DATA_EXTENDED_TOC_ENTRY;\n\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY_INVALID 0x00000001\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY_ROOT 0x00000002\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER\n{\n    ULONG HeaderSize;\n    ULONG HashAlgorithm; // HASH_STRING_ALGORITHM_*\n    ULONG EntryCount;\n    ULONG FirstEntryOffset; // to ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY[], from ACTIVATION_CONTEXT_DATA base\n    ULONG AssemblyInformationSectionOffset; // to resolve section-relative offsets\n} ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER, *PACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY\n{\n    ULONG Flags;\n    ULONG PseudoKey;\n    ULONG AssemblyNameOffset; // to WCHAR[], from ACTIVATION_CONTEXT_DATA base\n    ULONG AssemblyNameLength;\n    ULONG AssemblyInformationOffset; // to ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION, from ACTIVATION_CONTEXT_DATA base\n    ULONG AssemblyInformationLength;\n} ACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY, *PACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_ENTRY;\n\n#define ACTIVATION_CONTEXT_SECTION_FORMAT_UNKNOWN 0\n#define ACTIVATION_CONTEXT_SECTION_FORMAT_STRING_TABLE 1 // ACTIVATION_CONTEXT_STRING_SECTION_HEADER\n#define ACTIVATION_CONTEXT_SECTION_FORMAT_GUID_TABLE 2 // ACTIVATION_CONTEXT_GUID_SECTION_HEADER\n\n#define ACTIVATION_CONTEXT_STRING_SECTION_MAGIC ('dHsS')\n#define ACTIVATION_CONTEXT_STRING_SECTION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_STRING_SECTION_CASE_INSENSITIVE 0x00000001\n#define ACTIVATION_CONTEXT_STRING_SECTION_ENTRIES_IN_PSEUDOKEY_ORDER 0x00000002\n\ntypedef struct _ACTIVATION_CONTEXT_STRING_SECTION_HEADER\n{\n    ULONG Magic;\n    ULONG HeaderSize;\n    ULONG FormatVersion;\n    ULONG DataFormatVersion;\n    ULONG Flags; // ACTIVATION_CONTEXT_STRING_SECTION_*\n    ULONG ElementCount;\n    ULONG ElementListOffset; // to ACTIVATION_CONTEXT_STRING_SECTION_ENTRY[], from this struct base\n    ULONG HashAlgorithm; // HASH_STRING_ALGORITHM_*\n    ULONG SearchStructureOffset; // to ACTIVATION_CONTEXT_STRING_SECTION_HASH_TABLE, from this struct base\n    ULONG UserDataOffset; // to data depending on section Id, from this struct base\n    ULONG UserDataSize;\n} ACTIVATION_CONTEXT_STRING_SECTION_HEADER, *PACTIVATION_CONTEXT_STRING_SECTION_HEADER;\n\ntypedef struct _ACTIVATION_CONTEXT_STRING_SECTION_ENTRY\n{\n    ULONG PseudoKey;\n    ULONG KeyOffset; // to WCHAR[], from section header\n    ULONG KeyLength;\n    ULONG Offset; // to data depending on section Id, from section header\n    ULONG Length;\n    ULONG AssemblyRosterIndex;\n} ACTIVATION_CONTEXT_STRING_SECTION_ENTRY, *PACTIVATION_CONTEXT_STRING_SECTION_ENTRY;\n\ntypedef struct _ACTIVATION_CONTEXT_STRING_SECTION_HASH_TABLE\n{\n    ULONG BucketTableEntryCount;\n    ULONG BucketTableOffset; // to ACTIVATION_CONTEXT_STRING_SECTION_HASH_BUCKET[], from section header\n} ACTIVATION_CONTEXT_STRING_SECTION_HASH_TABLE, *PACTIVATION_CONTEXT_STRING_SECTION_HASH_TABLE;\n\ntypedef struct _ACTIVATION_CONTEXT_STRING_SECTION_HASH_BUCKET\n{\n    ULONG ChainCount;\n    ULONG ChainOffset; // to LONG[], from section header\n} ACTIVATION_CONTEXT_STRING_SECTION_HASH_BUCKET, *PACTIVATION_CONTEXT_STRING_SECTION_HASH_BUCKET;\n\n#define ACTIVATION_CONTEXT_GUID_SECTION_MAGIC ('dHsG')\n#define ACTIVATION_CONTEXT_GUID_SECTION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_GUID_SECTION_ENTRIES_IN_ORDER 0x00000001\n\ntypedef struct _ACTIVATION_CONTEXT_GUID_SECTION_HEADER\n{\n    ULONG Magic;\n    ULONG HeaderSize;\n    ULONG FormatVersion;\n    ULONG DataFormatVersion;\n    ULONG Flags; // ACTIVATION_CONTEXT_GUID_SECTION_*\n    ULONG ElementCount;\n    ULONG ElementListOffset; // to ACTIVATION_CONTEXT_GUID_SECTION_ENTRY[], from this struct base\n    ULONG SearchStructureOffset; // to ACTIVATION_CONTEXT_GUID_SECTION_HASH_TABLE, from this struct base\n    ULONG UserDataOffset; // to data depending on section Id, from this struct base\n    ULONG UserDataSize;\n} ACTIVATION_CONTEXT_GUID_SECTION_HEADER, *PACTIVATION_CONTEXT_GUID_SECTION_HEADER;\n\ntypedef struct _ACTIVATION_CONTEXT_GUID_SECTION_ENTRY\n{\n    GUID Guid;\n    ULONG Offset; // to data depending on section Id, from section header\n    ULONG Length;\n    ULONG AssemblyRosterIndex;\n} ACTIVATION_CONTEXT_GUID_SECTION_ENTRY, *PACTIVATION_CONTEXT_GUID_SECTION_ENTRY;\n\ntypedef struct _ACTIVATION_CONTEXT_GUID_SECTION_HASH_TABLE\n{\n    ULONG BucketTableEntryCount;\n    ULONG BucketTableOffset; // to ACTIVATION_CONTEXT_GUID_SECTION_HASH_BUCKET, from section header\n} ACTIVATION_CONTEXT_GUID_SECTION_HASH_TABLE, *PACTIVATION_CONTEXT_GUID_SECTION_HASH_TABLE;\n\ntypedef struct _ACTIVATION_CONTEXT_GUID_SECTION_HASH_BUCKET\n{\n    ULONG ChainCount;\n    ULONG ChainOffset; // to LONG[], from section header\n} ACTIVATION_CONTEXT_GUID_SECTION_HASH_BUCKET, *PACTIVATION_CONTEXT_GUID_SECTION_HASH_BUCKET;\n\n// winnt.h - known section IDs\n// #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION         (1) // ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION + ACTIVATION_CONTEXT_DATA_ASSEMBLY_GLOBAL_INFORMATION\n// #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION              (2) // ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION     (3) // ACTIVATION_CONTEXT_DATA_WINDOW_CLASS_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION       (4) // ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION    (5) // ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6) // ACTIVATION_CONTEXT_DATA_COM_TYPE_LIBRARY_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION       (7) // ACTIVATION_CONTEXT_DATA_COM_PROGID_REDIRECTION\n// #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE   (8)\n// #define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES               (9) // ACTIVATION_CONTEXT_DATA_CLR_SURROGATE\n// #define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS         (10) // ACTIVATION_CONTEXT_DATA_APPLICATION_SETTINGS\n// #define ACTIVATION_CONTEXT_SECTION_COMPATIBILITY_INFO           (11) // ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION[_LEGACY]\n// #define ACTIVATION_CONTEXT_SECTION_WINRT_ACTIVATABLE_CLASSES    (12) // since 19H1\n\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_ROOT_ASSEMBLY 0x00000001\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_POLICY_APPLIED 0x00000002\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_ASSEMBLY_POLICY_APPLIED 0x00000004\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_ROOT_POLICY_APPLIED 0x00000008\n#define ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_PRIVATE_ASSEMBLY 0x00000010\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION\n{\n    ULONG Size;\n    ULONG Flags; // ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION_*\n    ULONG EncodedAssemblyIdentityLength;\n    ULONG EncodedAssemblyIdentityOffset; // to WCHAR[], from section header\n    ULONG ManifestPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*\n    ULONG ManifestPathLength;\n    ULONG ManifestPathOffset; // to WCHAR[], from section header\n    LARGE_INTEGER ManifestLastWriteTime;\n    ULONG PolicyPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*\n    ULONG PolicyPathLength;\n    ULONG PolicyPathOffset; // to WCHAR[], from section header\n    LARGE_INTEGER PolicyLastWriteTime;\n    ULONG MetadataSatelliteRosterIndex;\n    ULONG Unused2;\n    ULONG ManifestVersionMajor;\n    ULONG ManifestVersionMinor;\n    ULONG PolicyVersionMajor;\n    ULONG PolicyVersionMinor;\n    ULONG AssemblyDirectoryNameLength;\n    ULONG AssemblyDirectoryNameOffset; // to WCHAR[], from section header\n    ULONG NumOfFilesInAssembly;\n    ULONG LanguageLength;\n    ULONG LanguageOffset; // to WCHAR[], from section header\n    ACTCTX_REQUESTED_RUN_LEVEL RunLevel;\n    ULONG UiAccess;\n} ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION, *PACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION;\n\n// via UserData\ntypedef struct _ACTIVATION_CONTEXT_DATA_ASSEMBLY_GLOBAL_INFORMATION\n{\n    ULONG Size;\n    ULONG Flags;\n    GUID PolicyCoherencyGuid;\n    GUID PolicyOverrideGuid;\n    ULONG ApplicationDirectoryPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*\n    ULONG ApplicationDirectoryLength;\n    ULONG ApplicationDirectoryOffset; // to WCHAR[], from this struct base\n    ULONG ResourceName;\n} ACTIVATION_CONTEXT_DATA_ASSEMBLY_GLOBAL_INFORMATION, *PACTIVATION_CONTEXT_DATA_ASSEMBLY_GLOBAL_INFORMATION;\n\n#define ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_INCLUDES_BASE_NAME 0x00000001\n#define ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_OMITS_ASSEMBLY_ROOT 0x00000002\n#define ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_EXPAND 0x00000004\n#define ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SYSTEM_DEFAULT_REDIRECTED_SYSTEM32_DLL 0x00000008\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION\n{\n    ULONG Size;\n    ULONG Flags; // ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_*\n    ULONG TotalPathLength;\n    ULONG PathSegmentCount;\n    ULONG PathSegmentOffset; // to ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT[], from section header\n} ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION, *PACTIVATION_CONTEXT_DATA_DLL_REDIRECTION;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT\n{\n    ULONG Length;\n    ULONG Offset; // to WCHAR[], from section header\n} ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT, *PACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT;\n\n#define ACTIVATION_CONTEXT_DATA_WINDOW_CLASS_REDIRECTION_FORMAT_WHISTLER 1\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_WINDOW_CLASS_REDIRECTION\n{\n    ULONG Size;\n    ULONG Flags;\n    ULONG VersionSpecificClassNameLength;\n    ULONG VersionSpecificClassNameOffset; // to WHCAR[], from this struct base\n    ULONG DllNameLength;\n    ULONG DllNameOffset; // to WCHAR[], from section header\n} ACTIVATION_CONTEXT_DATA_WINDOW_CLASS_REDIRECTION, *PACTIVATION_CONTEXT_DATA_WINDOW_CLASS_REDIRECTION;\n\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_INVALID 0\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_APARTMENT 1\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_FREE 2\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_SINGLE 3\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_BOTH 4\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_NEUTRAL 5\n\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET 8\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_HAS_DEFAULT (0x01 << ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET)\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_HAS_ICON (0x02 << ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET)\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_HAS_CONTENT (0x04 << ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET)\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_HAS_THUMBNAIL (0x08 << ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET)\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_HAS_DOCPRINT (0x10 << ACTIVATION_CONTEXT_DATA_COM_SERVER_MISCSTATUS_FLAG_OFFSET)\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION\n{\n    ULONG Size;\n    ULONG Flags;\n    ULONG ThreadingModel; // ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_THREADING_MODEL_*\n    GUID ReferenceClsid;\n    GUID ConfiguredClsid;\n    GUID ImplementedClsid;\n    GUID TypeLibraryId;\n    ULONG ModuleLength;\n    ULONG ModuleOffset; // to WCHAR[], from section header\n    ULONG ProgIdLength;\n    ULONG ProgIdOffset; // to WCHAR[], from this struct base\n    ULONG ShimDataLength;\n    ULONG ShimDataOffset; // to ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM, from this struct base\n    ULONG MiscStatusDefault;\n    ULONG MiscStatusContent;\n    ULONG MiscStatusThumbnail;\n    ULONG MiscStatusIcon;\n    ULONG MiscStatusDocPrint;\n} ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION, *PACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION;\n\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM_TYPE_OTHER 1\n#define ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM_TYPE_CLR_CLASS 2\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM\n{\n    ULONG Size;\n    ULONG Flags;\n    ULONG Type; // ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM_TYPE_*\n    ULONG ModuleLength;\n    ULONG ModuleOffset; // to WCHAR[], from section header\n    ULONG TypeLength;\n    ULONG TypeOffset; // to WCHAR[], from this struct base\n    ULONG ShimVersionLength;\n    ULONG ShimVersionOffset; // to WCHAR[], from this struct base\n    ULONG DataLength;\n    ULONG DataOffset; // from this struct base\n} ACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM, *PACTIVATION_CONTEXT_DATA_COM_SERVER_REDIRECTION_SHIM;\n\n#define ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION_FORMAT_WHISTLER 1\n\n#define ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION_FLAG_NUM_METHODS_VALID 0x00000001\n#define ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION_FLAG_BASE_INTERFACE_VALID 0x00000002\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION\n{\n    ULONG Size;\n    ULONG Flags; // ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION_FLAG_*\n    GUID ProxyStubClsid32;\n    ULONG NumMethods;\n    GUID TypeLibraryId;\n    GUID BaseInterface;\n    ULONG NameLength;\n    ULONG NameOffset; // to WCHAR[], from this struct base\n} ACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION, *PACTIVATION_CONTEXT_DATA_COM_INTERFACE_REDIRECTION;\n\n#define ACTIVATION_CONTEXT_DATA_COM_TYPE_LIBRARY_REDIRECTION_FORMAT_WHISTLER 1\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_TYPE_LIBRARY_VERSION\n{\n    USHORT Major;\n    USHORT Minor;\n} ACTIVATION_CONTEXT_DATA_TYPE_LIBRARY_VERSION, *PACTIVATION_CONTEXT_DATA_TYPE_LIBRARY_VERSION;\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_COM_TYPE_LIBRARY_REDIRECTION\n{\n    ULONG   Size;\n    ULONG   Flags;\n    ULONG   NameLength;\n    ULONG   NameOffset; // to WCHAR[], from section header\n    USHORT  ResourceId;\n    USHORT  LibraryFlags; // LIBFLAG_* oaidl.h\n    ULONG   HelpDirLength;\n    ULONG   HelpDirOffset; // to WCHAR[], from this struct base\n    ACTIVATION_CONTEXT_DATA_TYPE_LIBRARY_VERSION Version;\n} ACTIVATION_CONTEXT_DATA_COM_TYPE_LIBRARY_REDIRECTION, *PACTIVATION_CONTEXT_DATA_COM_TYPE_LIBRARY_REDIRECTION;\n\n#define ACTIVATION_CONTEXT_DATA_COM_PROGID_REDIRECTION_FORMAT_WHISTLER 1\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_COM_PROGID_REDIRECTION\n{\n    ULONG Size;\n    ULONG Flags;\n    ULONG ConfiguredClsidOffset; // to CLSID, from section header\n} ACTIVATION_CONTEXT_DATA_COM_PROGID_REDIRECTION, *PACTIVATION_CONTEXT_DATA_COM_PROGID_REDIRECTION;\n\n#define ACTIVATION_CONTEXT_DATA_CLR_SURROGATE_FORMAT_WHISTLER 1\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_CLR_SURROGATE\n{\n    ULONG   Size;\n    ULONG   Flags;\n    GUID    SurrogateIdent;\n    ULONG   VersionOffset;\n    ULONG   VersionLength;\n    ULONG   TypeNameOffset;\n    ULONG   TypeNameLength; // to WCHAR[], from this struct base\n} ACTIVATION_CONTEXT_DATA_CLR_SURROGATE, *PACTIVATION_CONTEXT_DATA_CLR_SURROGATE;\n\n#define ACTIVATION_CONTEXT_DATA_APPLICATION_SETTINGS_FORMAT_LONGHORN 1\n\n#define SXS_WINDOWS_SETTINGS_NAMESPACE L\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2011_NAMESPACE L\"http://schemas.microsoft.com/SMI/2011/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2013_NAMESPACE L\"http://schemas.microsoft.com/SMI/2013/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2014_NAMESPACE L\"http://schemas.microsoft.com/SMI/2014/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2016_NAMESPACE L\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2017_NAMESPACE L\"http://schemas.microsoft.com/SMI/2017/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2019_NAMESPACE L\"http://schemas.microsoft.com/SMI/2019/WindowsSettings\"\n#define SXS_WINDOWS_SETTINGS_2020_NAMESPACE L\"http://schemas.microsoft.com/SMI/2020/WindowsSettings\"\n\ntypedef struct _ACTIVATION_CONTEXT_DATA_APPLICATION_SETTINGS\n{\n    ULONG Size;\n    ULONG Flags;\n    ULONG SettingNamespaceLength;\n    ULONG SettingNamespaceOffset; // to WCHAR[], from this struct base\n    ULONG SettingNameLength;\n    ULONG SettingNameOffset; // to WCHAR[], from this struct base\n    ULONG SettingValueLength;\n    ULONG SettingValueOffset; // to WCHAR[], from this struct base\n} ACTIVATION_CONTEXT_DATA_APPLICATION_SETTINGS, *PACTIVATION_CONTEXT_DATA_APPLICATION_SETTINGS;\n\n// COMPATIBILITY_CONTEXT_ELEMENT from winnt.h before 19H1\ntypedef struct _COMPATIBILITY_CONTEXT_ELEMENT_LEGACY\n{\n    GUID Id;\n    ACTCTX_COMPATIBILITY_ELEMENT_TYPE Type;\n} COMPATIBILITY_CONTEXT_ELEMENT_LEGACY, *PCOMPATIBILITY_CONTEXT_ELEMENT_LEGACY;\n\n// ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION from winnt.h before 19H1\ntypedef struct _ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION_LEGACY\n{\n    ULONG ElementCount;\n    COMPATIBILITY_CONTEXT_ELEMENT_LEGACY Elements[ANYSIZE_ARRAY];\n} ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION_LEGACY, *PACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION_LEGACY;\n\n#include <poppack.h>\n\n// begin_private\n\ntypedef struct _ASSEMBLY_STORAGE_MAP_ENTRY\n{\n    ULONG Flags;\n    UNICODE_STRING DosPath;\n    HANDLE Handle;\n} ASSEMBLY_STORAGE_MAP_ENTRY, *PASSEMBLY_STORAGE_MAP_ENTRY;\n\n#define ASSEMBLY_STORAGE_MAP_ASSEMBLY_ARRAY_IS_HEAP_ALLOCATED 0x00000001\n\ntypedef struct _ASSEMBLY_STORAGE_MAP\n{\n    ULONG Flags;\n    ULONG AssemblyCount;\n    PASSEMBLY_STORAGE_MAP_ENTRY *AssemblyArray;\n} ASSEMBLY_STORAGE_MAP, *PASSEMBLY_STORAGE_MAP;\n\ntypedef struct _ACTIVATION_CONTEXT *PACTIVATION_CONTEXT;\n\n#define ACTIVATION_CONTEXT_NOTIFICATION_DESTROY 1\n#define ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY 2\n#define ACTIVATION_CONTEXT_NOTIFICATION_USED 3\n\ntypedef VOID (NTAPI *PACTIVATION_CONTEXT_NOTIFY_ROUTINE)(\n    _In_ ULONG NotificationType, // ACTIVATION_CONTEXT_NOTIFICATION_*\n    _In_ PACTIVATION_CONTEXT ActivationContext,\n    _In_ PACTIVATION_CONTEXT_DATA ActivationContextData,\n    _In_opt_ PVOID NotificationContext,\n    _In_opt_ PVOID NotificationData,\n    _Inout_ PBOOLEAN DisableThisNotification\n    );\n\ntypedef struct _ACTIVATION_CONTEXT\n{\n    LONG RefCount;\n    ULONG Flags;\n    PACTIVATION_CONTEXT_DATA ActivationContextData;\n    PACTIVATION_CONTEXT_NOTIFY_ROUTINE NotificationRoutine;\n    PVOID NotificationContext;\n    ULONG SentNotifications[8];\n    ULONG DisabledNotifications[8];\n    ASSEMBLY_STORAGE_MAP StorageMap;\n    PASSEMBLY_STORAGE_MAP_ENTRY InlineStorageMapEntries[32];\n} ACTIVATION_CONTEXT, *PACTIVATION_CONTEXT;\n\n#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_RELEASE_ON_DEACTIVATION 0x00000001\n#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NO_DEACTIVATE 0x00000002\n#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_ON_FREE_LIST 0x00000004\n#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_HEAP_ALLOCATED 0x00000008\n#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NOT_REALLY_ACTIVATED 0x00000010\n\ntypedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME\n{\n    struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME *Previous;\n    PACTIVATION_CONTEXT ActivationContext;\n    ULONG Flags; // RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_*\n} RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME;\n\n#define ACTIVATION_CONTEXT_STACK_FLAG_QUERIES_DISABLED 0x00000001\n\ntypedef struct _ACTIVATION_CONTEXT_STACK\n{\n    PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame;\n    LIST_ENTRY FrameListCache;\n    ULONG Flags; // ACTIVATION_CONTEXT_STACK_FLAG_*\n    ULONG NextCookieSequenceNumber;\n    ULONG StackId;\n} ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK;\n\n// end_private\n\n#endif // _NTSXS_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/nttmapi.h",
    "content": "/*\n * Transaction Manager support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTTMAPI_H\n#define _NTTMAPI_H\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateTransactionManager(\n    _Out_ PHANDLE TmHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCUNICODE_STRING LogFileName,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ ULONG CommitStrength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenTransactionManager(\n    _Out_ PHANDLE TmHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCUNICODE_STRING LogFileName,\n    _In_opt_ LPGUID TmIdentity,\n    _In_opt_ ULONG OpenOptions\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRenameTransactionManager(\n    _In_ PCUNICODE_STRING LogFileName,\n    _In_ LPGUID ExistingTransactionManagerGuid\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRollforwardTransactionManager(\n    _In_ HANDLE TransactionManagerHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRecoverTransactionManager(\n    _In_ HANDLE TransactionManagerHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationTransactionManager(\n    _In_ HANDLE TransactionManagerHandle,\n    _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,\n    _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,\n    _In_ ULONG TransactionManagerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationTransactionManager(\n    _In_opt_ HANDLE TmHandle,\n    _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,\n    _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,\n    _In_ ULONG TransactionManagerInformationLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtEnumerateTransactionObject(\n    _In_opt_ HANDLE RootObjectHandle,\n    _In_ KTMOBJECT_TYPE QueryType,\n    _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,\n    _In_ ULONG ObjectCursorLength,\n    _Out_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateTransaction(\n    _Out_ PHANDLE TransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ LPGUID Uow,\n    _In_opt_ HANDLE TmHandle,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ ULONG IsolationLevel,\n    _In_opt_ ULONG IsolationFlags,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_opt_ PCUNICODE_STRING Description\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenTransaction(\n    _Out_ PHANDLE TransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ LPGUID Uow,\n    _In_opt_ HANDLE TmHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,\n    _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,\n    _In_ ULONG TransactionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,\n    _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation,\n    _In_ ULONG TransactionInformationLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCommitTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ BOOLEAN Wait\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRollbackTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ BOOLEAN Wait\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateEnlistment(\n    _Out_ PHANDLE EnlistmentHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ HANDLE TransactionHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG CreateOptions,\n    _In_ NOTIFICATION_MASK NotificationMask,\n    _In_opt_ PVOID EnlistmentKey\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenEnlistment(\n    _Out_ PHANDLE EnlistmentHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ LPGUID EnlistmentGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,\n    _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,\n    _In_ ULONG EnlistmentInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationEnlistment(\n    _In_opt_ HANDLE EnlistmentHandle,\n    _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,\n    _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,\n    _In_ ULONG EnlistmentInformationLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRecoverEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PVOID EnlistmentKey\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrePrepareEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrepareEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCommitEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRollbackEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrePrepareComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPrepareComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCommitComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtReadOnlyEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRollbackComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSinglePhaseReject(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtCreateResourceManager(\n    _Out_ PHANDLE ResourceManagerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE TmHandle,\n    _In_ LPGUID RmGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ PCUNICODE_STRING Description\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtOpenResourceManager(\n    _Out_ PHANDLE ResourceManagerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE TmHandle,\n    _In_opt_ LPGUID ResourceManagerGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRecoverResourceManager(\n    _In_ HANDLE ResourceManagerHandle\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtGetNotificationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,\n    _In_ ULONG NotificationLength,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _Out_opt_ PULONG ReturnLength,\n    _In_ ULONG Asynchronous,\n    _In_opt_ ULONG_PTR AsynchronousContext\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtQueryInformationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,\n    _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,\n    _In_ ULONG ResourceManagerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtSetInformationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,\n    _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,\n    _In_ ULONG ResourceManagerInformationLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRegisterProtocolAddressInformation(\n    _In_ HANDLE ResourceManager,\n    _In_ PCRM_PROTOCOL_ID ProtocolId,\n    _In_ ULONG ProtocolInformationSize,\n    _In_ PVOID ProtocolInformation,\n    _In_opt_ ULONG CreateOptions\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPropagationComplete(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ ULONG RequestCookie,\n    _In_ ULONG BufferLength,\n    _In_ PVOID Buffer\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtPropagationFailed(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ ULONG RequestCookie,\n    _In_ NTSTATUS PropStatus\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtFreezeTransactions(\n    _In_ PLARGE_INTEGER FreezeTimeout,\n    _In_ PLARGE_INTEGER ThawTimeout\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n// private\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtThawTransactions(\n    VOID\n    );\n#endif\n\n#endif // _NTTMAPI_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/nttp.h",
    "content": "/*\n * Thread Pool support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTTP_H\n#define _NTTP_H\n\n// Some types are already defined in winnt.h.\n\ntypedef struct _TP_ALPC TP_ALPC, *PTP_ALPC;\n\n// private\ntypedef _Function_class_(TP_ALPC_CALLBACK)\nVOID NTAPI TP_ALPC_CALLBACK(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _Inout_opt_ PVOID Context,\n    _In_ PTP_ALPC Alpc\n    );\ntypedef TP_ALPC_CALLBACK *PTP_ALPC_CALLBACK;\n\n// rev\ntypedef _Function_class_(TP_ALPC_CALLBACK_EX)\nVOID NTAPI TP_ALPC_CALLBACK_EX(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _Inout_opt_ PVOID Context,\n    _In_ PTP_ALPC Alpc,\n    _In_ PVOID ApcContext\n    );\ntypedef TP_ALPC_CALLBACK_EX *PTP_ALPC_CALLBACK_EX;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// winbase:CreateThreadpool\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocPool(\n    _Out_ PTP_POOL *PoolReturn,\n    _Reserved_ PVOID Reserved\n    );\n\n// winbase:CloseThreadpool\nNTSYSAPI\nVOID\nNTAPI\nTpReleasePool(\n    _Inout_ PTP_POOL Pool\n    );\n\n// winbase:SetThreadpoolThreadMaximum\nNTSYSAPI\nVOID\nNTAPI\nTpSetPoolMaxThreads(\n    _Inout_ PTP_POOL Pool,\n    _In_ ULONG MaxThreads\n    );\n\n// winbase:SetThreadpoolThreadMinimum\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSetPoolMinThreads(\n    _Inout_ PTP_POOL Pool,\n    _In_ ULONG MinThreads\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// winbase:QueryThreadpoolStackInformation\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpQueryPoolStackInformation(\n    _In_ PTP_POOL Pool,\n    _Out_ PTP_POOL_STACK_INFORMATION PoolStackInformation\n    );\n\n// winbase:SetThreadpoolStackInformation\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSetPoolStackInformation(\n    _Inout_ PTP_POOL Pool,\n    _In_ PTP_POOL_STACK_INFORMATION PoolStackInformation\n    );\n\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSetPoolThreadBasePriority(\n    _Inout_ PTP_POOL Pool,\n    _In_ ULONG BasePriority\n    );\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_7)\n\n// winbase:CreateThreadpoolCleanupGroup\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocCleanupGroup(\n    _Out_ PTP_CLEANUP_GROUP *CleanupGroupReturn\n    );\n\n// winbase:CloseThreadpoolCleanupGroup\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseCleanupGroup(\n    _Inout_ PTP_CLEANUP_GROUP CleanupGroup\n    );\n\n// winbase:CloseThreadpoolCleanupGroupMembers\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseCleanupGroupMembers(\n    _Inout_ PTP_CLEANUP_GROUP CleanupGroup,\n    _In_ LOGICAL CancelPendingCallbacks,\n    _Inout_opt_ PVOID CleanupParameter\n    );\n\n// winbase:SetEventWhenCallbackReturns\nNTSYSAPI\nVOID\nNTAPI\nTpCallbackSetEventOnCompletion(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _In_ HANDLE Event\n    );\n\n// winbase:ReleaseSemaphoreWhenCallbackReturns\nNTSYSAPI\nVOID\nNTAPI\nTpCallbackReleaseSemaphoreOnCompletion(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _In_ HANDLE Semaphore,\n    _In_ ULONG ReleaseCount\n    );\n\n// winbase:ReleaseMutexWhenCallbackReturns\nNTSYSAPI\nVOID\nNTAPI\nTpCallbackReleaseMutexOnCompletion(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _In_ HANDLE Mutex\n    );\n\n// winbase:LeaveCriticalSectionWhenCallbackReturns\nNTSYSAPI\nVOID\nNTAPI\nTpCallbackLeaveCriticalSectionOnCompletion(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _Inout_ PRTL_CRITICAL_SECTION CriticalSection\n    );\n\n// winbase:FreeLibraryWhenCallbackReturns\nNTSYSAPI\nVOID\nNTAPI\nTpCallbackUnloadDllOnCompletion(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _In_ PVOID DllHandle\n    );\n\n// winbase:CallbackMayRunLong\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpCallbackMayRunLong(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance\n    );\n\n// winbase:DisassociateCurrentThreadFromCallback\nNTSYSAPI\nVOID\nNTAPI\nTpDisassociateCallback(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance\n    );\n\n// winbase:TrySubmitThreadpoolCallback\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSimpleTryPost(\n    _In_ PTP_SIMPLE_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n// winbase:CreateThreadpoolWork\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocWork(\n    _Out_ PTP_WORK *WorkReturn,\n    _In_ PTP_WORK_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n// winbase:CloseThreadpoolWork\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseWork(\n    _Inout_ PTP_WORK Work\n    );\n\n// winbase:SubmitThreadpoolWork\nNTSYSAPI\nVOID\nNTAPI\nTpPostWork(\n    _Inout_ PTP_WORK Work\n    );\n\n// winbase:WaitForThreadpoolWorkCallbacks\nNTSYSAPI\nVOID\nNTAPI\nTpWaitForWork(\n    _Inout_ PTP_WORK Work,\n    _In_ LOGICAL CancelPendingCallbacks\n    );\n\n// winbase:CreateThreadpoolTimer\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocTimer(\n    _Out_ PTP_TIMER *Timer,\n    _In_ PTP_TIMER_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n// winbase:CloseThreadpoolTimer\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseTimer(\n    _Inout_ PTP_TIMER Timer\n    );\n\n// winbase:SetThreadpoolTimer\nNTSYSAPI\nVOID\nNTAPI\nTpSetTimer(\n    _Inout_ PTP_TIMER Timer,\n    _In_opt_ PLARGE_INTEGER DueTime,\n    _In_ ULONG Period,\n    _In_opt_ ULONG WindowLength\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// winbase:SetThreadpoolTimerEx\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSetTimerEx(\n    _Inout_ PTP_TIMER Timer,\n    _In_opt_ PLARGE_INTEGER DueTime,\n    _In_ ULONG Period,\n    _In_opt_ ULONG WindowLength\n    );\n#endif\n\n// winbase:IsThreadpoolTimerSet\nNTSYSAPI\nLOGICAL\nNTAPI\nTpIsTimerSet(\n    _In_ PTP_TIMER Timer\n    );\n\n// winbase:WaitForThreadpoolTimerCallbacks\nNTSYSAPI\nVOID\nNTAPI\nTpWaitForTimer(\n    _Inout_ PTP_TIMER Timer,\n    _In_ LOGICAL CancelPendingCallbacks\n    );\n\n// winbase:CreateThreadpoolWait\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocWait(\n    _Out_ PTP_WAIT *WaitReturn,\n    _In_ PTP_WAIT_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n// winbase:CloseThreadpoolWait\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseWait(\n    _Inout_ PTP_WAIT Wait\n    );\n\n// winbase:SetThreadpoolWait\nNTSYSAPI\nVOID\nNTAPI\nTpSetWait(\n    _Inout_ PTP_WAIT Wait,\n    _In_opt_ HANDLE Handle,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_8)\n// winbase:SetThreadpoolWaitEx\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpSetWaitEx(\n    _Inout_ PTP_WAIT Wait,\n    _In_opt_ HANDLE Handle,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_opt_ PVOID Reserved\n    );\n#endif\n\n// winbase:WaitForThreadpoolWaitCallbacks\nNTSYSAPI\nVOID\nNTAPI\nTpWaitForWait(\n    _Inout_ PTP_WAIT Wait,\n    _In_ LOGICAL CancelPendingCallbacks\n    );\n\n// private\ntypedef _Function_class_(TP_IO_CALLBACK)\nVOID NTAPI TP_IO_CALLBACK(\n    _Inout_ PTP_CALLBACK_INSTANCE Instance,\n    _Inout_opt_ PVOID Context,\n    _In_ PVOID ApcContext,\n    _In_ PIO_STATUS_BLOCK IoSB,\n    _In_ PTP_IO Io\n    );\ntypedef TP_IO_CALLBACK *PTP_IO_CALLBACK;\n\n// winbase:CreateThreadpoolIo\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocIoCompletion(\n    _Out_ PTP_IO *IoReturn,\n    _In_ HANDLE File,\n    _In_ PTP_IO_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n// winbase:CloseThreadpoolIo\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseIoCompletion(\n    _Inout_ PTP_IO Io\n    );\n\n// winbase:StartThreadpoolIo\nNTSYSAPI\nVOID\nNTAPI\nTpStartAsyncIoOperation(\n    _Inout_ PTP_IO Io\n    );\n\n// winbase:CancelThreadpoolIo\nNTSYSAPI\nVOID\nNTAPI\nTpCancelAsyncIoOperation(\n    _Inout_ PTP_IO Io\n    );\n\n// winbase:WaitForThreadpoolIoCallbacks\nNTSYSAPI\nVOID\nNTAPI\nTpWaitForIoCompletion(\n    _Inout_ PTP_IO Io,\n    _In_ LOGICAL CancelPendingCallbacks\n    );\n\n// private\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocAlpcCompletion(\n    _Out_ PTP_ALPC *AlpcReturn,\n    _In_ HANDLE AlpcPort,\n    _In_ PTP_ALPC_CALLBACK Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_7)\n// rev\nNTSYSAPI\nNTSTATUS\nNTAPI\nTpAllocAlpcCompletionEx(\n    _Out_ PTP_ALPC *AlpcReturn,\n    _In_ HANDLE AlpcPort,\n    _In_ PTP_ALPC_CALLBACK_EX Callback,\n    _Inout_opt_ PVOID Context,\n    _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n#endif\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nTpReleaseAlpcCompletion(\n    _Inout_ PTP_ALPC Alpc\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nTpWaitForAlpcCompletion(\n    _Inout_ PTP_ALPC Alpc\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nTpAlpcRegisterCompletionList(\n    _Inout_ PTP_ALPC Alpc\n    );\n\n// rev\nNTSYSAPI\nVOID\nNTAPI\nTpAlpcUnregisterCompletionList(\n    _Inout_ PTP_ALPC Alpc\n    );\n\n// private\ntypedef enum _TP_TRACE_TYPE\n{\n    TpTraceThreadPriority = 1,\n    TpTraceThreadAffinity,\n    MaxTpTraceType\n} TP_TRACE_TYPE;\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nTpCaptureCaller(\n    _In_ TP_TRACE_TYPE Type\n    );\n\n// private\nNTSYSAPI\nVOID\nNTAPI\nTpCheckTerminateWorker(\n    _In_ HANDLE Thread\n    );\n\n#endif // (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n#endif // _NTTP_H\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntuser.h",
    "content": "/*\n * Win32k NT User definitions.\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTUSER_H\n#define _NTUSER_H\n\ntypedef enum _USERTHREADINFOCLASS USERTHREADINFOCLASS;\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserAttachThreadInput(\n    _In_ ULONG IdAttach,\n    _In_ ULONG IdAttachTo,\n    _In_ BOOL Attach\n    );\n\nNTSYSCALLAPI\nHDC\nNTAPI\nNtUserBeginPaint(\n    _In_ HWND WindowHandle,\n    _Inout_ LPPAINTSTRUCT lpPaint\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserBlockInput(\n    _In_ BOOL BlockInput\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserBuildHwndList(\n    _In_opt_ HANDLE DesktopHandle,\n    _In_opt_ HWND StartWindowHandle,\n    _In_opt_ LOGICAL IncludeChildren,\n    _In_opt_ LOGICAL ExcludeImmersive,\n    _In_opt_ ULONG ThreadId,\n    _In_ ULONG HwndListInformationLength,\n    _Out_writes_bytes_(HwndListInformationLength) PVOID HwndListInformation,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserBuildNameList(\n    _In_ HWINSTA WindowStationHandle, // GetProcessWindowStation\n    _In_ ULONG NameListInformationLength,\n    _Out_writes_bytes_(NameListInformationLength) PVOID NameListInformation,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserBuildPropList(\n    _In_ HWINSTA WindowStationHandle,\n    _In_ ULONG PropListInformationLength,\n    _Out_writes_bytes_(PropListInformationLength) PVOID PropListInformation,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserCanCurrentThreadChangeForeground(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserCalculatePopupWindowPosition(\n    _In_ const POINT* anchorPoint,\n    _In_ const SIZE* windowSize,\n    _In_ ULONG flags,\n    _Inout_ RECT* excludeRect,\n    _Inout_ RECT* popupWindowPosition\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserCheckAccessForIntegrityLevel(\n    _In_ ULONG ProcessIdFirst,\n    _In_ ULONG ProcessIdSecond,\n    _Out_ PBOOLEAN GrantedAccess\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserCheckProcessForClipboardAccess(\n    _In_ ULONG ProcessId,\n    _Out_ PULONG GrantedAccess\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserCloseWindowStation(\n    _In_ HWINSTA WindowStationHandle\n    );\n\ntypedef enum _CONSOLECONTROL\n{\n    ConsoleSetVDMCursorBounds = 0, // RECT\n    ConsoleNotifyConsoleApplication = 1, // CONSOLE_PROCESS_INFO\n    ConsoleFullscreenSwitch = 2,\n    ConsoleSetCaretInfo = 3, // CONSOLE_CARET_INFO\n    ConsoleSetReserveKeys = 4,\n    ConsoleSetForeground = 5, // CONSOLESETFOREGROUND\n    ConsoleSetWindowOwner = 6, // CONSOLEWINDOWOWNER\n    ConsoleEndTask = 7, // CONSOLEENDTASK\n} CONSOLECONTROL;\n\n#define CPI_NEWPROCESSWINDOW 0x0001\n\ntypedef struct _CONSOLE_PROCESS_INFO\n{\n    ULONG ProcessID;\n    ULONG Flags;\n} CONSOLE_PROCESS_INFO, *PCONSOLE_PROCESS_INFO;\n\ntypedef struct _CONSOLE_CARET_INFO\n{\n    HWND WindowHandle;\n    RECT Rect;\n} CONSOLE_CARET_INFO, *PCONSOLE_CARET_INFO;\n\ntypedef struct _CONSOLESETFOREGROUND\n{\n    HANDLE ProcessHandle;\n    BOOL Foreground;\n} CONSOLESETFOREGROUND, *PCONSOLESETFOREGROUND;\n\ntypedef struct _CONSOLEWINDOWOWNER\n{\n    HWND WindowHandle;\n    ULONG ProcessId;\n    ULONG ThreadId;\n} CONSOLEWINDOWOWNER, *PCONSOLEWINDOWOWNER;\n\ntypedef struct _CONSOLEENDTASK\n{\n    HANDLE ProcessId;\n    HWND WindowHandle;\n    ULONG ConsoleEventCode;\n    ULONG ConsoleFlags;\n} CONSOLEENDTASK, *PCONSOLEENDTASK;\n\n/**\n * Performs special kernel operations for console host applications. (win32u.dll)\n *\n * This includes reparenting the console window, allowing the console to pass foreground rights\n * on to launched console subsystem applications and terminating attached processes.\n *\n * @param Command One of the CONSOLECONTROL values indicating which console control function should be executed.\n * @param ConsoleInformation A pointer to one of the  structures specifying additional data for the requested console control function.\n * @param ConsoleInformationLength The size of the structure pointed to by the ConsoleInformation parameter.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserConsoleControl(\n    _In_ CONSOLECONTROL Command,\n    _In_reads_bytes_(ConsoleInformationLength) PVOID ConsoleInformation,\n    _In_ ULONG ConsoleInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserCreateWindowStation(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ HANDLE KeyboardLayoutHandle,\n    _In_opt_ PVOID KeyboardLayoutOffset,\n    _In_opt_ PVOID NlsTableOffset,\n    _In_opt_ PVOID KeyboardDescriptor,\n    _In_opt_ PCUNICODE_STRING LanguageIdString,\n    _In_opt_ ULONG KeyboardLocale\n    );\n\n/**\n * Performs special kernel operations for console host applications. (user32.dll)\n *\n * This includes reparenting the console window, allowing the console to pass foreground rights\n * on to launched console subsystem applications and terminating attached processes.\n *\n * @param Command One of the CONSOLECONTROL values indicating which console control function should be executed.\n * @param ConsoleInformation A pointer to one of the  structures specifying additional data for the requested console control function.\n * @param ConsoleInformationLength The size of the structure pointed to by the ConsoleInformation parameter.\n * @return Successful or errant status.\n */\nNTSYSAPI\nNTSTATUS\nNTAPI\nConsoleControl(\n    _In_ CONSOLECONTROL Command,\n    _In_reads_bytes_(ConsoleInformationLength) PVOID ConsoleInformation,\n    _In_ ULONG ConsoleInformationLength\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserGetClassName(\n    _In_ HWND WindowHandle,\n    _In_ BOOL Real,\n    _Out_ PUNICODE_STRING ClassName\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserGetForegroundWindow(\n    VOID\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserGetIconInfo(\n    _In_ HICON IconOrCursorHandle,\n    _Out_ PICONINFO Iconinfo,\n    _Inout_opt_ PUNICODE_STRING Name,\n    _Inout_opt_ PUNICODE_STRING ResourceId,\n    _Out_opt_ PULONG ColorBits,\n    _In_ LOGICAL IsCursorHandle\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserGetIconSize(\n    _In_ HGDIOBJ IconOrCursorHandle,\n    _In_ LOGICAL IsCursorHandle,\n    _Out_ PULONG XX,\n    _Out_ PULONG YY\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserGetProcessWindowStation(\n    VOID\n    );\n\nNTSYSCALLAPI\nULONG_PTR\nNTAPI\nNtUserGetThreadState(\n    _In_ ULONG UserThreadState\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserGhostWindowFromHungWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSAPI\nHWND\nNTAPI\nGhostWindowFromHungWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserHungWindowFromGhostWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSAPI\nHWND\nNTAPI\nHungWindowFromGhostWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserInternalGetWindowText(\n    _In_ HWND WindowHandle,\n    _Out_writes_to_(cchMaxCount, return + 1) LPWSTR pString,\n    _In_ ULONG cchMaxCount\n    );\n\nNTSYSCALLAPI\nHICON\nNTAPI\nNtUserInternalGetWindowIcon(\n    _In_ HWND WindowHandle,\n    _In_ ULONG IconType\n    );\n\nNTSYSCALLAPI\nHANDLE\nNTAPI\nNtUserOpenDesktop(\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG Flags,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\n/**\n * Opens the specified window station.\n *\n * @param ObjectAttributes The name of the window station to be opened. Window station names are case-insensitive. This window station must belong to the current session.\n * @param DesiredAccess The access to the window station.\n * @return Successful or errant status.\n */\nNTSYSCALLAPI\nHWINSTA\nNTAPI\nNtUserOpenWindowStation(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\ntypedef enum _WINDOWINFOCLASS\n{\n    WindowProcess = 0, // q: ULONG (Process ID)\n    WindowRealProcess = 1, // q: ULONG (Process ID)\n    WindowThread = 2, // q: ULONG (Thread ID)\n    WindowActiveWindow = 3, // q: HWND\n    WindowFocusWindow = 4, // q: HWND\n    WindowIsHung = 5, // q: BOOLEAN\n    WindowClientBase = 6, // q: PVOID\n    WindowIsForegroundThread = 7, // q: BOOLEAN\n    WindowDefaultImeWindow = 8, // q: HWND\n    WindowDefaultInputContext = 9, // q: HIMC\n} WINDOWINFOCLASS, *PWINDOWINFOCLASS;\n\nNTSYSCALLAPI\nULONG_PTR\nNTAPI\nNtUserQueryWindow(\n    _In_ HWND WindowHandle,\n    _In_ WINDOWINFOCLASS WindowInfo\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserSetActiveWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserSetChildWindowNoActivate(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserSetFocus(\n    _In_ HWND WindowHandle\n    );\n\n// User32 ordinal 2005\nNTSYSAPI\nLOGICAL\nNTAPI\nSetChildWindowNoActivate(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserSetInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ USERTHREADINFOCLASS ThreadInformationClass,\n    _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserSetProcessWindowStation(\n    _In_ HWINSTA WindowStationHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserSetWindowPlacement(\n    _In_  HWND WindowHandle,\n    _Inout_ const WINDOWPLACEMENT* lpwndpl\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserSetWindowStationUser(\n    _In_ HWINSTA WindowStationHandle,\n    _In_ PLUID UserLogonId,\n    _In_ PSID UserSid,\n    _In_ ULONG UserSidLength\n    );\n\nNTSYSAPI\nLOGICAL\nNTAPI\nSetWindowStationUser(\n    _In_ HWINSTA WindowStationHandle,\n    _In_ PLUID UserLogonId,\n    _In_ PSID UserSid,\n    _In_ ULONG UserSidLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserTestForInteractiveUser(\n    _In_ PLUID AuthenticationId\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserSwitchDesktop(\n    _In_ HDESK DesktopHandle,\n    _In_opt_ ULONG Flags,\n    _In_opt_ ULONG FadeTime\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nNtUserSetThreadDesktop(\n    _In_ HDESK DesktopHandle\n    );\n\nNTSYSAPI\nHWND\nNTAPI\nChildWindowFromPoint(\n    _In_ HWND WindowHandle,\n    _In_ POINT pt\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserChildWindowFromPointEx(\n    _In_ HWND WindowHandle,\n    _In_ POINT pt,\n    _In_ ULONG flags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserClipCursor(\n    _In_ const RECT* lpRect\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserCloseDesktop(\n    _In_ HDESK DesktopHandle\n    );\n\nNTSYSCALLAPI\nLONG\nNTAPI\nNtUserCopyAcceleratorTable(\n    _In_ HACCEL hAccelSrc,\n    _In_ LPACCEL lpAccelDst,\n    _In_ LONG cAccelEntries\n    );\n\nNTSYSCALLAPI\nHACCEL\nNTAPI\nNtUserCreateAcceleratorTable(\n    _In_ LPACCEL paccel,\n    _In_ LONG cAccel\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserDeleteMenu(\n    _In_ HMENU MenuHandle,\n    _In_ ULONG Position,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserDestroyMenu(\n    _In_ HMENU MenuHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserDestroyWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserDragDetect(\n    _In_ HWND WindowHandle,\n    _In_ POINT pt\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserDragObject(\n    _In_ HWND WindowHandleParent,\n    _In_ HWND WindowHandleFrom,\n    _In_ ULONG fmt,\n    _In_ ULONG_PTR data,\n    _In_ HCURSOR hcur\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserDrawAnimatedRects(\n    _In_ HWND WindowHandle,\n    _In_ int idAni,\n    _In_ const RECT* lprcFrom,\n    _In_ const RECT* lprcTo\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserEndMenu(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserEndPaint(\n    _In_ HWND WindowHandle,\n    _Inout_ const PAINTSTRUCT* lpPaint\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserEnumDisplayMonitors(\n    _In_ HDC hdc,\n    _In_ LPCRECT lprcClip,\n    _In_ MONITORENUMPROC lpfnEnum,\n    _In_ LPARAM dwData\n    );\n\nNTSYSCALLAPI\nHRGN\nNTAPI\nNtUserExcludeUpdateRgn(\n    _In_ HDC hDC,\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserFlashWindowEx(\n    _In_ PFLASHWINFO pfwi\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserGetAncestor(\n    _In_ HWND WindowHandle,\n    _In_ ULONG gaFlags\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetCaretBlinkTime(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetCaretPos(\n    _In_ LPPOINT lpPoint\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetClipCursor(\n    _In_ LPRECT lpRect\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetComboBoxInfo(\n    _In_ HWND WindowHandleCombo,\n    _Inout_ PCOMBOBOXINFO pcbi\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetCurrentInputMessageSource(\n    _Inout_ INPUT_MESSAGE_SOURCE* InputMessageSource\n    );\n\nNTSYSCALLAPI\nHCURSOR\nNTAPI\nNtUserGetCursor(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetCursorInfo(\n    _In_ PCURSORINFO pci\n    );\n\nNTSYSCALLAPI\nHDC\nNTAPI\nNtUserGetDCEx(\n    _In_ HWND WindowHandle,\n    _In_ HRGN hrgnClip,\n    _In_ ULONG flags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetDisplayAutoRotationPreferences(\n    _In_ ORIENTATION_PREFERENCE* pOrientation\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetDoubleClickTime(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetGUIThreadInfo(\n    _In_ ULONG idThread,\n    _In_ PGUITHREADINFO pgui\n    );\n\n#ifndef GR_GDIOBJECTS\n#define GR_GDIOBJECTS 0\n#endif\n#ifndef GR_USEROBJECTS\n#define GR_USEROBJECTS 1\n#endif\n#ifndef GR_GDIOBJECTS_PEAK\n#define GR_GDIOBJECTS_PEAK 2\n#endif\n#ifndef GR_USEROBJECTS_PEAK\n#define GR_USEROBJECTS_PEAK 4\n#endif\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetGuiResources(\n    _In_ HANDLE ProcessHandle,\n    _In_ ULONG uiFlags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetLayeredWindowAttributes(\n    _In_ HWND WindowHandle,\n    _In_ COLORREF* pcrKey,\n    _In_ BYTE* pbAlpha,\n    _In_ ULONG pdwFlags\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetListBoxInfo(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetMenuBarInfo(\n    _In_ HWND WindowHandle,\n    _In_ LONG idObject,\n    _In_ LONG idItem,\n    _In_ PMENUBARINFO pmbi\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetMenuItemRect(\n    _In_ HWND WindowHandle,\n    _In_ HMENU MenuHandle,\n    _In_ ULONG MenuIndex,\n    _In_ PRECT MenuRect\n    );\n\nNTSYSCALLAPI\nLONG\nNTAPI\nNtUserGetMouseMovePointsEx(\n    _In_ ULONG MouseMovePointsSize,\n    _In_ LPMOUSEMOVEPOINT InputBuffer,\n    _Out_ LPMOUSEMOVEPOINT OutputBuffer,\n    _In_ LONG OutputBufferCount,\n    _In_ ULONG Resolution\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetRawInputData(\n    _In_ HRAWINPUT RawInputData,\n    _In_ ULONG RawInputCommand,\n    _Out_opt_ PVOID RawInputBuffer,\n    _Inout_ PULONG RawInputBufferSize,\n    _In_ ULONG RawInputHeaderSize\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetRawInputDeviceList(\n    _In_ PRAWINPUTDEVICELIST RawInputDeviceList,\n    _Inout_ PULONG RawInputDeviceCount,\n    _In_ ULONG RawInputDeviceSize\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserGetRegisteredRawInputDevices(\n    _Out_opt_ PRAWINPUTDEVICE RawInputDevices,\n    _Inout_ PULONG RawInputDeviceCount,\n    _In_ ULONG RawInputDeviceSize\n    );\n\nNTSYSCALLAPI\nHMENU\nNTAPI\nNtUserGetSendMessageReceiver(\n    _In_ HANDLE ThreadId\n    );\n\nNTSYSAPI\nHWND\nNTAPI\nGetSendMessageReceiver(\n    _In_ HANDLE ThreadId\n    );\n\nNTSYSCALLAPI\nHMENU\nNTAPI\nNtUserGetSystemMenu(\n    _In_ HWND WindowHandle,\n    _In_ BOOL Revert\n    );\n\nNTSYSCALLAPI\nHDESK\nNTAPI\nNtUserGetThreadDesktop(\n    _In_ ULONG ThreadId\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetTitleBarInfo(\n    _In_ HWND WindowHandle,\n    _In_ PTITLEBARINFO pti\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetObjectInformation(\n    _In_ HANDLE ObjectHandle,\n    _In_ LONG Index,\n    _In_ PVOID vInfo,\n    _In_ ULONG Length,\n    _In_ PULONG LengthNeeded\n    );\n\nNTSYSCALLAPI\nHDC\nNTAPI\nNtUserGetWindowDC(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserGetWindowPlacement(\n    _In_ HWND WindowHandle,\n    _Inout_ PWINDOWPLACEMENT WindowPlacement\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserHiliteMenuItem(\n    _In_ HWND WindowHandle,\n    _In_ HMENU MenuHandle,\n    _In_ ULONG IDHiliteItem,\n    _In_ ULONG Hilite\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserInvalidateRect(\n    _In_ HWND WindowHandle,\n    _In_ const RECT* Rect,\n    _In_ BOOL Erase\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserInvalidateRgn(\n    _In_ HWND WindowHandle,\n    _In_ HRGN hRgn,\n    _In_ BOOL Erase\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserIsTouchWindow(\n    _In_ HWND WindowHandle,\n    _In_ PULONG Flags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserKillTimer(\n    _In_ HWND WindowHandle,\n    _In_ ULONG_PTR IDEvent\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserLockWorkStation(\n    VOID\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserLogicalToPhysicalPoint(\n    _In_ HWND WindowHandle,\n    _In_ LPPOINT lpPoint\n    );\n\nNTSYSCALLAPI\nLONG\nNTAPI\nNtUserMenuItemFromPoint(\n    _In_ HWND WindowHandle,\n    _In_ HMENU MenuHandle,\n    _In_ POINT ptScreen\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserMoveWindow(\n    _In_ HWND WindowHandle,\n    _In_ LONG X,\n    _In_ LONG Y,\n    _In_ LONG Width,\n    _In_ LONG Height,\n    _In_ BOOL Repaint\n    );\n\nNTSYSCALLAPI\nHDESK\nNTAPI\nNtUserOpenInputDesktop(\n    _In_ ULONG Flags,\n    _In_ BOOL Inherit,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserPhysicalToLogicalPoint(\n    _In_ HWND WindowHandle,\n    _In_ LPPOINT lpPoint\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserPrintWindow(\n    _In_ HWND WindowHandle,\n    _In_ HDC hdcBlt,\n    _In_ ULONG nFlags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserQueryInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ USERTHREADINFOCLASS ThreadInformationClass,\n    _Out_writes_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _Out_opt_ PULONG ThreadInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserSetInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ USERTHREADINFOCLASS ThreadInformationClass,\n    _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength\n    );\n\nNTSYSAPI\nBOOL\nNTAPI\nQuerySendMessage(\n    _Inout_ MSG* pMsg\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserRaiseLowerShellWindow(\n    _In_ HWND WindowHandle,\n    _In_ BOOLEAN SetWithOptions\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserRedrawWindow(\n    _In_ HWND WindowHandle,\n    _In_ const PRECT lprcUpdate,\n    _In_ HRGN hrgnUpdate,\n    _In_ ULONG flags\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserRealChildWindowFromPoint(\n    _In_ HWND WindowHandleParent,\n    _In_ POINT ptParentClientCoords\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserRegisterHotKey(\n    _In_ HWND WindowHandle,\n    _In_ LONG id,\n    _In_ ULONG fsModifiers,\n    _In_ ULONG vk\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserRemoveMenu(\n    _In_ HMENU MenuHandle,\n    _In_ ULONG uPosition,\n    _In_ ULONG uFlags\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserSendInput(\n    _In_ ULONG cInputs,\n    _In_ LPINPUT pInputs,\n    _In_ LONG cbSize\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserSetActiveWindow(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserSetCapture(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nULONG_PTR\nNTAPI\nNtUserSetTimer(\n    _In_ HWND WindowHandle,\n    _In_ ULONG_PTR nIDEvent,\n    _In_ ULONG uElapse,\n    _In_ TIMERPROC lpTimerFunc,\n    _In_ ULONG uToleranceDelay\n    );\n\nNTSYSCALLAPI\nWORD\nNTAPI\nNtUserSetClassWord(\n    _In_ HWND WindowHandle,\n    _In_ LONG nIndex,\n    _In_ WORD wNewWord\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserSetCursorPos(\n    _In_ LONG X,\n    _In_ LONG Y\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserSetFocus(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserSetLayeredWindowAttributes(\n    _In_ HWND WindowHandle,\n    _In_ COLORREF crKey,\n    _In_ BYTE bAlpha,\n    _In_ DWORD dwFlags\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserSetProcessRestrictionExemption(\n    _In_ BOOL EnableExemption\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserSetWindowPos(\n    _In_ HWND WindowHandle,\n    _In_ HWND WindowHandleInsertAfter,\n    _In_ LONG X,\n    _In_ LONG Y,\n    _In_ LONG cx,\n    _In_ LONG cy,\n    _In_ ULONG uFlags\n    );\n\nNTSYSCALLAPI\nWORD\nNTAPI\nNtUserSetWindowWord(\n    _In_ HWND WindowHandle,\n    _In_ LONG nIndex,\n    _In_ WORD wNewWord\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtUserSetForegroundWindowForApplication(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserShellForegroundBoostProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserSetAdditionalForegroundBoostProcesses(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nNtUserSetAdditionalPowerThrottlingProcess(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nLONG\nNTAPI\nNtUserShowCursor(\n    _In_ BOOL bShow\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserShowWindow(\n    _In_ HWND WindowHandle,\n    _In_ LONG nCmdShow\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserShowWindowAsync(\n    _In_ HWND WindowHandle,\n    _In_ LONG nCmdShow\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserShutdownBlockReasonQuery(\n    _In_ HWND WindowHandle,\n    _Out_ LPWSTR pwszBuff,\n    _Inout_ PULONG pcchBuff\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserShutdownReasonDestroy(\n    _In_ HWND WindowHandle\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserTrackMouseEvent(\n    _In_ LPTRACKMOUSEEVENT lpEventTrack\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserTrackPopupMenuEx(\n    _In_ HMENU MenuHandle,\n    _In_ ULONG uFlags,\n    _In_ LONG x,\n    _In_ LONG y,\n    _In_ HWND WindowHandle,\n    _In_ LPTPMPARAMS lptpm\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserUnhookWinEvent(\n    _In_ HWINEVENTHOOK hWinEventHook\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserUnregisterHotKey(\n    _In_ HWND WindowHandle,\n    _In_ LONG id\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserUserHandleGrantAccess(\n    _In_ HANDLE UserHandle,\n    _In_ HANDLE Job,\n    _In_ BOOL Grant\n    );\n\nNTSYSCALLAPI\nBOOL\nNTAPI\nNtUserValidateRect(\n    _In_ HWND WindowHandle,\n    _In_ const RECT* Rect\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserWindowFromDC(\n    _In_ HDC hDC\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserWindowFromPhysicalPoint(\n    _In_ POINT Point\n    );\n\nNTSYSCALLAPI\nHWND\nNTAPI\nNtUserWindowFromPoint(\n    _In_ POINT Point\n    );\n\n// Peb!KernelCallbackTable = user32.dll!apfnDispatch\ntypedef struct _KERNEL_CALLBACK_TABLE\n{\n    PVOID __fnCOPYDATA;\n    PVOID __fnCOPYGLOBALDATA;\n    PVOID __fnEMPTY1;\n    PVOID __fnNCDESTROY;\n    PVOID __fnDWORDOPTINLPMSG;\n    PVOID __fnINOUTDRAG;\n    PVOID __fnGETTEXTLENGTHS1;\n    PVOID __fnINCNTOUTSTRING;\n    PVOID __fnINCNTOUTSTRINGNULL;\n    PVOID __fnINLPCOMPAREITEMSTRUCT;\n    PVOID __fnINLPCREATESTRUCT;\n    PVOID __fnINLPDELETEITEMSTRUCT;\n    PVOID __fnINLPDRAWITEMSTRUCT;\n    PVOID __fnPOPTINLPUINT1;\n    PVOID __fnPOPTINLPUINT2;\n    PVOID __fnINLPMDICREATESTRUCT;\n    PVOID __fnINOUTLPMEASUREITEMSTRUCT;\n    PVOID __fnINLPWINDOWPOS;\n    PVOID __fnINOUTLPPOINT51;\n    PVOID __fnINOUTLPSCROLLINFO;\n    PVOID __fnINOUTLPRECT;\n    PVOID __fnINOUTNCCALCSIZE;\n    PVOID __fnINOUTLPPOINT52;\n    PVOID __fnINPAINTCLIPBRD;\n    PVOID __fnINSIZECLIPBRD;\n    PVOID __fnINDESTROYCLIPBRD;\n    PVOID __fnINSTRINGNULL1;\n    PVOID __fnINSTRINGNULL2;\n    PVOID __fnINDEVICECHANGE;\n    PVOID __fnPOWERBROADCAST;\n    PVOID __fnINLPUAHDRAWMENU1;\n    PVOID __fnOPTOUTLPDWORDOPTOUTLPDWORD1;\n    PVOID __fnOPTOUTLPDWORDOPTOUTLPDWORD2;\n    PVOID __fnOUTDWORDINDWORD;\n    PVOID __fnOUTLPRECT;\n    PVOID __fnOUTSTRING;\n    PVOID __fnPOPTINLPUINT3;\n    PVOID __fnPOUTLPINT;\n    PVOID __fnSENTDDEMSG;\n    PVOID __fnINOUTSTYLECHANGE1;\n    PVOID __fnHkINDWORD;\n    PVOID __fnHkINLPCBTACTIVATESTRUCT;\n    PVOID __fnHkINLPCBTCREATESTRUCT;\n    PVOID __fnHkINLPDEBUGHOOKSTRUCT;\n    PVOID __fnHkINLPMOUSEHOOKSTRUCTEX1;\n    PVOID __fnHkINLPKBDLLHOOKSTRUCT;\n    PVOID __fnHkINLPMSLLHOOKSTRUCT;\n    PVOID __fnHkINLPMSG;\n    PVOID __fnHkINLPRECT;\n    PVOID __fnHkOPTINLPEVENTMSG;\n    PVOID __xxxClientCallDelegateThread;\n    PVOID __ClientCallDummyCallback1;\n    PVOID __ClientCallDummyCallback2;\n    PVOID __fnSHELLWINDOWMANAGEMENTCALLOUT;\n    PVOID __fnSHELLWINDOWMANAGEMENTNOTIFY;\n    PVOID __ClientCallDummyCallback3;\n    PVOID __xxxClientCallDitThread;\n    PVOID __xxxClientEnableMMCSS;\n    PVOID __xxxClientUpdateDpi;\n    PVOID __xxxClientExpandStringW;\n    PVOID __ClientCopyDDEIn1;\n    PVOID __ClientCopyDDEIn2;\n    PVOID __ClientCopyDDEOut1;\n    PVOID __ClientCopyDDEOut2;\n    PVOID __ClientCopyImage;\n    PVOID __ClientEventCallback;\n    PVOID __ClientFindMnemChar;\n    PVOID __ClientFreeDDEHandle;\n    PVOID __ClientFreeLibrary;\n    PVOID __ClientGetCharsetInfo;\n    PVOID __ClientGetDDEFlags;\n    PVOID __ClientGetDDEHookData;\n    PVOID __ClientGetListboxString;\n    PVOID __ClientGetMessageMPH;\n    PVOID __ClientLoadImage;\n    PVOID __ClientLoadLibrary;\n    PVOID __ClientLoadMenu;\n    PVOID __ClientLoadLocalT1Fonts;\n    PVOID __ClientPSMTextOut;\n    PVOID __ClientLpkDrawTextEx;\n    PVOID __ClientExtTextOutW;\n    PVOID __ClientGetTextExtentPointW;\n    PVOID __ClientCharToWchar;\n    PVOID __ClientAddFontResourceW;\n    PVOID __ClientThreadSetup;\n    PVOID __ClientDeliverUserApc;\n    PVOID __ClientNoMemoryPopup;\n    PVOID __ClientMonitorEnumProc;\n    PVOID __ClientCallWinEventProc;\n    PVOID __ClientWaitMessageExMPH;\n    PVOID __ClientCallDummyCallback4;\n    PVOID __ClientCallDummyCallback5;\n    PVOID __ClientImmLoadLayout;\n    PVOID __ClientImmProcessKey;\n    PVOID __fnIMECONTROL;\n    PVOID __fnINWPARAMDBCSCHAR;\n    PVOID __fnGETTEXTLENGTHS2;\n    PVOID __ClientCallDummyCallback6;\n    PVOID __ClientLoadStringW;\n    PVOID __ClientLoadOLE;\n    PVOID __ClientRegisterDragDrop;\n    PVOID __ClientRevokeDragDrop;\n    PVOID __fnINOUTMENUGETOBJECT;\n    PVOID __ClientPrinterThunk;\n    PVOID __fnOUTLPCOMBOBOXINFO;\n    PVOID __fnOUTLPSCROLLBARINFO;\n    PVOID __fnINLPUAHDRAWMENU2;\n    PVOID __fnINLPUAHDRAWMENUITEM;\n    PVOID __fnINLPUAHDRAWMENU3;\n    PVOID __fnINOUTLPUAHMEASUREMENUITEM;\n    PVOID __fnINLPUAHDRAWMENU4;\n    PVOID __fnOUTLPTITLEBARINFOEX;\n    PVOID __fnTOUCH;\n    PVOID __fnGESTURE;\n    PVOID __fnPOPTINLPUINT4;\n    PVOID __fnPOPTINLPUINT5;\n    PVOID __xxxClientCallDefaultInputHandler;\n    PVOID __fnEMPTY2;\n    PVOID __ClientRimDevCallback;\n    PVOID __xxxClientCallMinTouchHitTestingCallback;\n    PVOID __ClientCallLocalMouseHooks;\n    PVOID __xxxClientBroadcastThemeChange;\n    PVOID __xxxClientCallDevCallbackSimple;\n    PVOID __xxxClientAllocWindowClassExtraBytes;\n    PVOID __xxxClientFreeWindowClassExtraBytes;\n    PVOID __fnGETWINDOWDATA;\n    PVOID __fnINOUTSTYLECHANGE2;\n    PVOID __fnHkINLPMOUSEHOOKSTRUCTEX2;\n    PVOID __xxxClientCallDefWindowProc;\n    PVOID __fnSHELLSYNCDISPLAYCHANGED;\n    PVOID __fnHkINLPCHARHOOKSTRUCT;\n    PVOID __fnINTERCEPTEDWINDOWACTION;\n    PVOID __xxxTooltipCallback;\n    PVOID __xxxClientInitPSBInfo;\n    PVOID __xxxClientDoScrollMenu;\n    PVOID __xxxClientEndScroll;\n    PVOID __xxxClientDrawSize;\n    PVOID __xxxClientDrawScrollBar;\n    PVOID __xxxClientHitTestScrollBar;\n    PVOID __xxxClientTrackInit;\n} KERNEL_CALLBACK_TABLE, *PKERNEL_CALLBACK_TABLE;\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntwmi.h",
    "content": "/*\n * Trace Control support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTWMI_H\n#define _NTWMI_H\n\n#ifndef _TRACEHANDLE_DEFINED\n#define _TRACEHANDLE_DEFINED\n// Obsolete - prefer PROCESSTRACE_HANDLE or CONTROLTRACE_ID.\ntypedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;\n#endif\n\n// Used to read the events from a trace file or real-time trace session (via\n// ProcessTrace). The handle is invalid if it contains the value\n// INVALID_PROCESSTRACE_HANDLE. Obtain the handle by calling an OpenTrace\n// function (e.g.  OpenTrace, OpenTraceFromFile, OpenTraceFromRealTimeLogger).\n// Close the handle by calling CloseTrace.\ntypedef ULONG64 PROCESSTRACE_HANDLE;\n\n// Used to identify a trace collection session. The id is invalid if it\n// contains the value (CONTROLTRACE_ID)0. Obtain the id from StartTrace or from\n// the Wnode.HistoricalContext field of the EVENT_TRACE_PROPERTIES returned by\n// ControlTrace(0, sessionName, ...). The id is valid until the trace stops and\n// does not need to be closed by the user.\ntypedef ULONG64 CONTROLTRACE_ID;\n\n//\n// Maximum supported buffer size in KB - Win8 (16MB)\n//\n// N.B. Prior to Win8 the value was 1MB (1024KB).\n#define MIN_ETW_BUFFER_SIZE      1             // in KBytes\n#define MAX_ETW_BUFFER_SIZE      (16 * 1024)   // in KBytes\n#define MAX_ETW_BUFFER_SIZE_WIN7 (1 * 1024)    // in KBytes\n#define MAX_ETW_EVENT_SIZE       0xFFFF        // MAX_USHORT\n\n// SystemTraceControlGuid\n#define ETW_KERNEL_RUNDOWN_START 0x00000001\n#define ETW_KERNEL_RUNDOWN_STOP  0x00000002\n#define ETW_CKCL_RUNDOWN_START   0x00000004\n#define ETW_CKCL_RUNDOWN_STOP    0x00000008\n#define ETW_FILENAME_RUNDOWN     0x00000010\n\n//\n// Alignment macros\n//\n#define DEFAULT_TRACE_ALIGNMENT 8              // 8 byte alignment\n#define ALIGN_TO_POWER2( x, n ) (((ULONG)(x) + ((n)-1)) & ~((ULONG)(n)-1))\n\n//\n// The predefined event groups or families for NT subsystems\n//\n#define EVENT_TRACE_GROUP_HEADER               0x0000\n#define EVENT_TRACE_GROUP_IO                   0x0100\n#define EVENT_TRACE_GROUP_MEMORY               0x0200\n#define EVENT_TRACE_GROUP_PROCESS              0x0300\n#define EVENT_TRACE_GROUP_FILE                 0x0400\n#define EVENT_TRACE_GROUP_THREAD               0x0500\n#define EVENT_TRACE_GROUP_TCPIP                0x0600\n#define EVENT_TRACE_GROUP_JOB                  0x0700\n#define EVENT_TRACE_GROUP_UDPIP                0x0800\n#define EVENT_TRACE_GROUP_REGISTRY             0x0900\n#define EVENT_TRACE_GROUP_DBGPRINT             0x0A00\n#define EVENT_TRACE_GROUP_CONFIG               0x0B00\n#define EVENT_TRACE_GROUP_SPARE1               0x0C00   // Spare1\n#define EVENT_TRACE_GROUP_WNF                  0x0D00\n#define EVENT_TRACE_GROUP_POOL                 0x0E00\n#define EVENT_TRACE_GROUP_PERFINFO             0x0F00\n#define EVENT_TRACE_GROUP_HEAP                 0x1000\n#define EVENT_TRACE_GROUP_OBJECT               0x1100\n#define EVENT_TRACE_GROUP_POWER                0x1200\n#define EVENT_TRACE_GROUP_MODBOUND             0x1300\n#define EVENT_TRACE_GROUP_IMAGE                0x1400\n#define EVENT_TRACE_GROUP_DPC                  0x1500\n#define EVENT_TRACE_GROUP_CC                   0x1600\n#define EVENT_TRACE_GROUP_CRITSEC              0x1700\n#define EVENT_TRACE_GROUP_STACKWALK            0x1800\n#define EVENT_TRACE_GROUP_UMS                  0x1900\n#define EVENT_TRACE_GROUP_ALPC                 0x1A00\n#define EVENT_TRACE_GROUP_SPLITIO              0x1B00\n#define EVENT_TRACE_GROUP_THREAD_POOL          0x1C00\n#define EVENT_TRACE_GROUP_HYPERVISOR           0x1D00\n#define EVENT_TRACE_GROUP_HYPERVISORX          0x1E00\n\n//\n// If you add any new groups, you must bump up MAX_KERNEL_TRACE_EVENTS\n// and make sure post processing is fixed up.\n//\n#define MAX_KERNEL_TRACE_EVENTS         0x1F\n\n//\n// The highest order bit of a data block is set if trace, WNODE otherwise\n//\n#define TRACE_HEADER_FLAG                   0x80000000\n\n// Header type for tracing messages\n// | Marker(8) | Reserved(8)  | Size(16) | MessageNumber(16) | Flags(16)\n#define TRACE_MESSAGE                       0x10000000\n\n// | MARKER(16) | SIZE (16)   | ULONG 32       | TIME_STAMP ...\n#define TRACE_HEADER_ULONG32_TIME           0xB0000000\n\n//\n// The second bit is set if the trace is used by PM & CP (fixed headers)\n// If not, the data block is used by for finer data for performance analysis\n//\n#define TRACE_HEADER_EVENT_TRACE            0x40000000\n//\n// If set, the data block is SYSTEM_TRACE_HEADER\n//\n#define TRACE_HEADER_ENUM_MASK              0x00FF0000\n\n//\n// The following are various header type\n//\n#define TRACE_HEADER_TYPE_SYSTEM32          1\n#define TRACE_HEADER_TYPE_SYSTEM64          2\n#define TRACE_HEADER_TYPE_COMPACT32         3\n#define TRACE_HEADER_TYPE_COMPACT64         4\n#define TRACE_HEADER_TYPE_FULL_HEADER32     10\n#define TRACE_HEADER_TYPE_INSTANCE32        11\n#define TRACE_HEADER_TYPE_TIMED             12  // Not used\n#define TRACE_HEADER_TYPE_ERROR             13  // Error while logging event\n#define TRACE_HEADER_TYPE_WNODE_HEADER      14  // Not used\n#define TRACE_HEADER_TYPE_MESSAGE           15\n#define TRACE_HEADER_TYPE_PERFINFO32        16\n#define TRACE_HEADER_TYPE_PERFINFO64        17\n#define TRACE_HEADER_TYPE_EVENT_HEADER32    18\n#define TRACE_HEADER_TYPE_EVENT_HEADER64    19\n#define TRACE_HEADER_TYPE_FULL_HEADER64     20\n#define TRACE_HEADER_TYPE_INSTANCE64        21\n\n#define EVENT_HEADER_SIZE_MASK              0x0000FFFF\n\n#define SYSTEM_TRACE_VERSION                 2\n\n//\n// The following two are used for defining LogFile layout version.\n//\n//  1.2 -- Add per-processor event streams.\n//  1.3 -- Remove rundown and context/switch streams.\n//  1.4 -- Add header stream.\n//  1.5 -- Include QPC and Platform clock source in the header.\n//\n//  2.0 -- Larger Buffers (over 1MB) / 256+ Processors / Compression (Win8).\n//\n\n#define TRACE_VERSION_MAJOR_WIN7        1\n#define TRACE_VERSION_MINOR_WIN7        5\n\n#define TRACE_VERSION_MAJOR             2\n#define TRACE_VERSION_MINOR             0\n\n#define SYSTEM_TRACE_MARKER32 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_SYSTEM32 << 16))\n#define SYSTEM_TRACE_MARKER64 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_SYSTEM64 << 16))\n\n#define COMPACT_TRACE_MARKER32 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_COMPACT32 << 16))\n#define COMPACT_TRACE_MARKER64 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_COMPACT64 << 16))\n\n#define PERFINFO_TRACE_MARKER32 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_PERFINFO32 << 16))\n#define PERFINFO_TRACE_MARKER64 (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_PERFINFO64 << 16))\n\n#define TRACE_HEADER_PEBS_INDEX_FLAG    0x00008000\n#define TRACE_HEADER_SPARE_FLAG1        0x00004000\n#define TRACE_HEADER_SPARE_FLAG2        0x00002000\n#define TRACE_HEADER_SPARE_FLAG3        0x00001000\n#define TRACE_HEADER_SPARE_FLAG4        0x00000800\n#define TRACE_HEADER_PMC_COUNTERS_MASK  0x00000700\n#define TRACE_HEADER_PMC_COUNTERS_SHIFT 8\n\n#define TRACE_HEADER_EXT_ITEMS_MASK (TRACE_HEADER_PEBS_INDEX_FLAG | TRACE_HEADER_PMC_COUNTERS_MASK)\n\n#ifdef _WIN64\n#define SYSTEM_TRACE_MARKER       SYSTEM_TRACE_MARKER64\n#define COMPACT_TRACE_MARKER      COMPACT_TRACE_MARKER64\n#define PERFINFO_TRACE_MARKER     PERFINFO_TRACE_MARKER64\n#else\n#define SYSTEM_TRACE_MARKER       SYSTEM_TRACE_MARKER32\n#define COMPACT_TRACE_MARKER      COMPACT_TRACE_MARKER32\n#define PERFINFO_TRACE_MARKER     PERFINFO_TRACE_MARKER32\n#endif\n\n//\n// Support a maximum of 64 logger instances.\n//\n#define MAXLOGGERS 64\n\n//\n// Set of Internal Flags passed to the Logger via ClientContext during StartTrace\n//\n#define EVENT_TRACE_CLOCK_RAW           0  // Use Raw timestamp\n#define EVENT_TRACE_CLOCK_PERFCOUNTER   1  // Use HighPerfClock (Default)\n#define EVENT_TRACE_CLOCK_SYSTEMTIME    2  // Use SystemTime\n#define EVENT_TRACE_CLOCK_CPUCYCLE      3  // Use CPU cycle counter\n#define EVENT_TRACE_CLOCK_MAX           4  // Max number of clock types\n\n//\n// NOTE: The following should not overlap with other bits in the LogFileMode\n// or LoggerMode defined in evntrace.h. Placed here since it is for internal\n// use only.\n//\n#define EVENT_TRACE_KD_FILTER_MODE          0x00080000  // KD_FILTER\n#define EVENT_TRACE_BUFFER_INTERFACE_MODE   0x00040000\n\n//\n// LoggerMode flags on Win7 and above.\n//\n#define EVENT_TRACE_USE_MS_FLUSH_TIMER      0x00000010  // FlushTimer value in milliseconds\n#define EVENT_TRACE_BLOCKING_MODE           0x20000000  // Private loggers wait for buffers\n\n//\n// LoggerMode flags on Win8 and above.\n//\n#define EVENT_TRACE_REALTIME_RELOG_MODE     0x00100000  // Private logger, relogging real-time events\n                                                        // This is same as EVENT_TRACE_MODE_RESERVED\n\n#define EVENT_TRACE_LOST_EVENTS_DEBUG_MODE  0x00200000  // Break on lost events\n#define EVENT_TRACE_COMPRESSED_MODE         0x04000000  // Compress relogged file\n\n//\n// see evntrace.h for pre-defined generic event types (0-10)\n//\ntypedef struct _WMI_TRACE_PACKET\n{\n    USHORT Size;\n    union\n    {\n        USHORT HookId;\n        struct\n        {\n            UCHAR Type;\n            UCHAR Group;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n} WMI_TRACE_PACKET, *PWMI_TRACE_PACKET;\n\nstatic_assert(sizeof(WMI_TRACE_PACKET) == sizeof(ULONG), \"WMI_TRACE_PACKET must equal sizeof(ULONG)\");\n\n// New struct that replaces EVENT_INSTANCE_GUID_HEADER. It is basically\n// EVENT_TRACE_HEADER + 2 Guids.\n// For XP, we will not publish this struct and hide it from users.\n// TRACE_VERSION in LOG_FILE_HEADER will tell the consumer APIs to use\n// this struct instead of EVENT_TRACE_HEADER.\n\ntypedef struct _EVENT_INSTANCE_GUID_HEADER\n{\n    USHORT          Size;                   // Size of entire record\n    union\n    {\n        USHORT      FieldTypeFlags;         // Indicates valid fields\n        struct\n        {\n            UCHAR   HeaderType;             // Header type - internal use only\n            UCHAR   MarkerFlags;            // Marker - internal use only\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        ULONG       Version;\n        struct\n        {\n            UCHAR   Type;                   // event type\n            UCHAR   Level;                  // trace instrumentation level\n            USHORT  Version;                // version of trace record\n        } Class;\n    } DUMMYUNIONNAME2;\n    ULONG           ThreadId;               // Thread Id\n    ULONG           ProcessId;              // Process Id\n    LARGE_INTEGER   TimeStamp;              // time when event happens\n    union\n    {\n        GUID        Guid;                   // Guid that identifies event\n        ULONGLONG   GuidPtr;                // use with WNODE_FLAG_USE_GUID_PTR\n    } DUMMYUNIONNAME3;\n    union\n    {\n        struct\n        {\n            ULONG   ClientContext;          // Reserved\n            ULONG   Flags;                  // Flags for header\n        } DUMMYSTRUCTNAME;\n        struct\n        {\n            ULONG   KernelTime;             // Kernel Mode CPU ticks\n            ULONG   UserTime;               // User mode CPU ticks\n        } DUMMYSTRUCTNAME2;\n        ULONG64     ProcessorTime;          // Processor Clock\n    } DUMMYUNIONNAME4;\n    ULONG           InstanceId;\n    ULONG           ParentInstanceId;\n    GUID            ParentGuid;             // Guid that identifies event\n} EVENT_INSTANCE_GUID_HEADER, *PEVENT_INSTANCE_GUID_HEADER;\n\ntypedef ULONGLONG  PERFINFO_TIMESTAMP;\ntypedef struct _PERFINFO_TRACE_HEADER PERFINFO_TRACE_ENTRY, *PPERFINFO_TRACE_ENTRY;\n\n//\n// 64-bit Trace header for NTPERF events\n//\n// Note.  The field \"Version\" will temporary be used to log CPU Id when log to PerfMem.\n// This will be removed after we change the buffer management to be the same as WMI.\n// i.e., Each CPU will allocate a block of memory for logging and CPU id is in the header\n// of each block.\n//\ntypedef struct _PERFINFO_TRACE_HEADER\n{\n    union\n    {\n        ULONG Marker;\n        struct\n        {\n            USHORT Version;\n            UCHAR HeaderType;\n            UCHAR Flags;  //WMI uses this flag to identify event types\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        ULONG            Header;    // both sizes must be the same!\n        WMI_TRACE_PACKET Packet;\n    } DUMMYUNIONNAME2;\n    union\n    {\n        PERFINFO_TIMESTAMP TS;\n        LARGE_INTEGER SystemTime;\n    } DUMMYUNIONNAME3;\n    UCHAR Data[1];\n} PERFINFO_TRACE_HEADER, *PPERFINFO_TRACE_HEADER;\n\n//\n// 64-bit Trace header for kernel events\n//\ntypedef struct _SYSTEM_TRACE_HEADER\n{\n    union\n    {\n        ULONG Marker;\n        struct\n        {\n            USHORT Version;\n            UCHAR HeaderType;\n            UCHAR Flags;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        ULONG Header;    // both sizes must be the same!\n        WMI_TRACE_PACKET Packet;\n    } DUMMYUNIONNAME2;\n    ULONG ThreadId;\n    ULONG ProcessId;\n    LARGE_INTEGER SystemTime;\n    ULONG KernelTime;\n    ULONG UserTime;\n} SYSTEM_TRACE_HEADER, *PSYSTEM_TRACE_HEADER;\n\n//\n// System header with no User/Kernel time.\n//\n#define COMPACT_HEADER_SIZE (RTL_SIZEOF_THROUGH_FIELD(SYSTEM_TRACE_HEADER, SystemTime))\n\n//\n// 64-bit Trace Header for Tracing Messages\n//\ntypedef struct _WMI_TRACE_MESSAGE_PACKET\n{\n    USHORT  MessageNumber;                  // The message Number, index of messages by GUID\n                                            // Or ComponentID\n    USHORT  OptionFlags ;                   // Flags associated with the message\n} WMI_TRACE_MESSAGE_PACKET, *PWMI_TRACE_MESSAGE_PACKET;\n\nstatic_assert(sizeof(WMI_TRACE_MESSAGE_PACKET) == sizeof(ULONG), \"WMI_TRACE_MESSAGE_PACKET must equal sizeof(ULONG)\");\n\ntypedef struct _MESSAGE_TRACE_HEADER\n{\n    union\n    {\n        ULONG Marker;\n        struct\n        {\n            USHORT Size;                           // Total Size of the message including header\n            UCHAR Reserved;               // Unused and reserved\n            UCHAR Version;                // The message structure type (TRACE_MESSAGE_FLAG)\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        ULONG Header;            // both sizes must be the same!\n        WMI_TRACE_MESSAGE_PACKET Packet;\n    } DUMMYUNIONNAME2;\n} MESSAGE_TRACE_HEADER, *PMESSAGE_TRACE_HEADER;\n\ntypedef struct _MESSAGE_TRACE\n{\n    MESSAGE_TRACE_HEADER MessageHeader;\n    UCHAR Data;\n} MESSAGE_TRACE, *PMESSAGE_TRACE;\n\n#define TRACE_MESSAGE_USERMODE 0x40   // flag indicating message came from user mode\n#define TRACE_MESSAGE_WOW 0x80\n//\n// Structure used to pass user log messages to the kernel\n//\ntypedef struct DECLSPEC_ALIGN(8) _MESSAGE_TRACE_USER\n{\n    MESSAGE_TRACE_HEADER MessageHeader;\n    GUID MessageGuid;\n    ULONG MessageFlags;\n    ULONG DataSize;\n    ULONG64 Data;\n} MESSAGE_TRACE_USER, *PMESSAGE_TRACE_USER;\n\n//\n// N.B. ETW_REF_CLOCK needs to be available for WOW64, thus the trick with defines for ETW_WOW64.\n//\ntypedef struct _ETW_REF_CLOCK\n{\n    LARGE_INTEGER StartTime;\n    LARGE_INTEGER StartPerfClock;\n} ETW_REF_CLOCK, *PETW_REF_CLOCK;\n\n#ifndef ETW_WOW6432\n\ntypedef enum _ETW_BUFFER_STATE\n{\n   EtwBufferStateFree,\n   EtwBufferStateGeneralLogging,\n   EtwBufferStateCSwitch,\n   EtwBufferStateFlush,\n   EtwBufferStateMaximum //MaxState should always be the last enum\n} ETW_BUFFER_STATE, *PETW_BUFFER_STATE;\n\n#define ETW_BUFFER_TYPE_GENERIC             0\n#define ETW_BUFFER_TYPE_RUNDOWN             1\n#define ETW_BUFFER_TYPE_CTX_SWAP            2\n#define ETW_BUFFER_TYPE_REFTIME             3\n#define ETW_BUFFER_TYPE_HEADER              4\n#define ETW_BUFFER_TYPE_BATCHED             5\n#define ETW_BUFFER_TYPE_EMPTY_MARKER        6\n#define ETW_BUFFER_TYPE_DBG_INFO            7\n#define ETW_BUFFER_TYPE_MAXIMUM             8\n\n#define ETW_BUFFER_FLAG_NORMAL              0x0000\n#define ETW_BUFFER_FLAG_FLUSH_MARKER        0x0001\n#define ETW_BUFFER_FLAG_EVENTS_LOST         0x0002\n#define ETW_BUFFER_FLAG_BUFFER_LOST         0x0004\n#define ETW_BUFFER_FLAG_RTBACKUP_CORRUPT    0x0008\n#define ETW_BUFFER_FLAG_RTBACKUP            0x0010\n#define ETW_BUFFER_FLAG_PROC_INDEX          0x0020\n#define ETW_BUFFER_FLAG_COMPRESSED          0x0040\n\n#define ETW_PROCESSOR_INDEX_MASK            0x07FF\n\n//\n// The following constants for real time event loss reasons should be\n// in sync with the messages in admin\\wmi\\events\\service\\eventlog.man.\n//\n#define ETW_RT_LOSS_EVENT                   0x20\n#define ETW_RT_LOSS_BUFFER                  0x21\n#define ETW_RT_LOSS_BACKUP                  0x22\n\ntypedef enum _ETW_RT_EVENT_LOSS\n{\n   EtwRtEventNoLoss,\n   EtwRtEventLost,\n   EtwRtBufferLost,\n   EtwRtBackupLost,\n   EtwRtEventLossMax\n} ETW_RT_EVENT_LOSS, *PETW_RT_EVENT_LOSS;\n\ntypedef struct _WMI_BUFFER_HEADER *PWMI_BUFFER_HEADER;\n\ntypedef struct _WMI_BUFFER_HEADER\n{\n    ULONG                              BufferSize;         // BufferSize\n    ULONG                              SavedOffset;        // Temp saved offset\n    volatile ULONG                     CurrentOffset;      // Current offset\n    volatile LONG                      ReferenceCount;     // Reference count\n    LARGE_INTEGER                      TimeStamp;          // Flush time stamp\n    LONGLONG                           SequenceNumber;     // Buffer sequence number\n\n    union\n    {\n        struct\n        {                                           // DBG_INFO buffers send to debugger\n            ULONGLONG                  ClockType : 3;\n            ULONGLONG                  Frequency : 61;\n        }  DUMMYSTRUCTNAME;\n        SINGLE_LIST_ENTRY              SlistEntry;         // Local list when flushing\n        PWMI_BUFFER_HEADER             NextBuffer;         // FlushList\n    } DUMMYUNIONNAME;\n\n    ETW_BUFFER_CONTEXT                 ClientContext;      // LoggerId/ProcessorIndex\n    ETW_BUFFER_STATE                   State;              // (Free/GeneralLogging/Flush)\n\n    ULONG                              Offset;             // Offset when flushing (can overlap SavedOffset)\n    USHORT                             BufferFlag;         // (flush marker, events lost)\n    USHORT                             BufferType;         // (generic/rundown/cswitch/reftime)\n    union\n    {\n        ULONG                          Padding1[4];\n        ETW_REF_CLOCK                  ReferenceTime;      // persistent real-time\n        LIST_ENTRY                     GlobalEntry;        // Global list entry\n        struct\n        {\n            PVOID                      Pointer0;\n            PVOID                      Pointer1;\n        } DUMMYSTRUCTNAME2;\n    } DUMMYUNIONNAME2;\n} WMI_BUFFER_HEADER, *PWMI_BUFFER_HEADER;\n\nstatic_assert(sizeof(WMI_BUFFER_HEADER) == 0x48, \"WMI_BUFFER_HEADER must equal 0x48\");\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, BufferSize) == 0x0);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, SavedOffset) == 0x4);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, CurrentOffset) == 0x8);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, TimeStamp) == 0x10);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, SlistEntry) == 0x20);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, ClientContext) == 0x28);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, State) == 0x2c); // Compression\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, Offset) == 0x30);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, BufferFlag) == 0x34);\nC_ASSERT(FIELD_OFFSET(WMI_BUFFER_HEADER, BufferType) == 0x36);\n\ntypedef struct _TRACE_ENABLE_FLAG_EXTENSION\n{\n    USHORT      Offset;     // Offset to the flag array in structure\n    UCHAR       Length;     // Length of flag array in ULONGs\n    UCHAR       Flag;       // Must be set to EVENT_TRACE_FLAG_EXTENSION\n} TRACE_ENABLE_FLAG_EXTENSION, *PTRACE_ENABLE_FLAG_EXTENSION;\n\ntypedef struct _TRACE_ENABLE_FLAG_EXT_HEADER\n{\n    USHORT      Length;     // Length in ULONGs\n    USHORT      Items;      // # of items\n} TRACE_ENABLE_FLAG_EXT_HEADER, *PTRACE_ENABLE_FLAG_EXT_HEADER;\n\ntypedef struct _TRACE_ENABLE_FLAG_EXT_ITEM\n{\n    USHORT      Offset;     // Offset to the next block\n    USHORT      Type;       // Extension type\n} TRACE_ENABLE_FLAG_EXT_ITEM, *PTRACE_ENABLE_FLAG_EXT_ITEM;\n\n#define EVENT_TRACE_FLAG_EXT_ITEMS 0x80FF0000    // New extension structure\n#define EVENT_TRACE_FLAG_EXT_LEN_NEW_STRUCT 0xFF // Pseudo length to denote new struct format\n\n#define ETW_MINIMUM_CACHED_STACK_LENGTH 4\n#define ETW_SW_ARRAY_SIZE          256     // Frame Count allocated in lookaside list\n#define ETW_STACK_SW_ARRAY_SIZE    192     // Frame Count allocated in stack\n#define ETW_MAX_STACKWALK_FILTER   256 // Max number of HookId's\n#define ETW_MAX_TAG_FILTER         4\n#define ETW_MAX_POOLTAG_FILTER     ETW_MAX_TAG_FILTER\n\n#define ETW_EXT_ENABLE_FLAGS       0x0001\n#define ETW_EXT_PIDS               0x0002\n#define ETW_EXT_STACKWALK_FILTER   0x0003\n#define ETW_EXT_POOLTAG_FILTER     0x0004\n#define ETW_EXT_STACK_CACHING      0x0005\n\n//\n// Extended item for configuring stack caching.\n//\ntypedef struct _ETW_STACK_CACHING_CONFIG\n{\n    ULONG CacheSize;\n    ULONG BucketCount;\n} ETW_STACK_CACHING_CONFIG, *PETW_STACK_CACHING_CONFIG;\n\n#endif // ifndef ETW_WOW6432\n\n#define PERFINFO_APPLY_OFFSET_GIVING_TYPE(_Base, _Offset, _Type) ((_Type) (((PPERF_BYTE) (_Base)) + (_Offset)))\n#define PERFINFO_ROUND_UP(Size, Amount) (((ULONG)(Size) + ((Amount) - 1)) & ~((Amount) - 1))\n\n//\n// Enable flags, hook id's, etc...\n//\n#define PERF_MASK_INDEX         (0xe0000000)\n#define PERF_MASK_GROUP         (~PERF_MASK_INDEX)\n#define PERF_NUM_MASKS          8\n\ntypedef ULONG PERFINFO_MASK;\n\n//\n// This structure holds a group mask for all the PERF_NUM_MASKS sets (see PERF_MASK_INDEX above).\n//\ntypedef struct _PERFINFO_GROUPMASK\n{\n    ULONG Masks[PERF_NUM_MASKS];\n} PERFINFO_GROUPMASK, *PPERFINFO_GROUPMASK;\n\n#define PERF_GET_MASK_INDEX(GM) (((GM) & PERF_MASK_INDEX) >> 29)\n#define PERF_GET_MASK_GROUP(GM) ((GM) & PERF_MASK_GROUP)\n\n#define PERFINFO_CLEAR_GROUPMASK(GroupMask) RtlZeroMemory((GroupMask), sizeof(PERFINFO_GROUPMASK))\n#define PERFINFO_OR_GROUP_WITH_GROUPMASK(Group, GroupMask) (GroupMask)->Masks[PERF_GET_MASK_INDEX(Group)] |= PERF_GET_MASK_GROUP(Group)\n#define PERFINFO_CLEAR_GROUP_IN_GROUPMASK(Group, GroupMask) (GroupMask)->Masks[PERF_GET_MASK_INDEX(Group)] &= (~PERF_GET_MASK_GROUP(Group))\n\n/*++\n\nRoutine Description:\n\n    Determines whether any group is on in a group mask\n\nArguments:\n\n    Group - Group index to check.\n\n    GroupMask - pointer to group mask to check.\n\nReturn Value:\n\n    Boolean indicating whether it is set or not.\n\nEnvironment:\n\n    User mode.\n\n--*/\nFORCEINLINE\nBOOLEAN\nPerfIsGroupOnInGroupMask(\n    _In_ ULONG Group,\n    _In_ PPERFINFO_GROUPMASK GroupMask\n    )\n{\n    PPERFINFO_GROUPMASK TestMask = GroupMask;\n\n    return (BOOLEAN)(((TestMask) != NULL) && (((TestMask)->Masks[PERF_GET_MASK_INDEX((Group))] & PERF_GET_MASK_GROUP((Group))) != 0));\n}\n\n// Group Masks (enabling flags) are used to determine the type of\n// events to be logged.  Each hook type is controlled by one bit in the\n// Group masks.\n//\n// Currently we have 8 sets of global masks available.  Each set is a ULONG with\n// the highest 3 bits reserved for PERF_MASK_INDEX, which is used to index to\n// the particular set of masks.  For example,\n//\n// #define PERF_GROUP1 0x0XXXXXXX in the 0th set (0x10000000 is the last bit in this set)\n// #define PERF_GROUP2 0x2XXXXXXX in the 1st set (0x30000000 is the last bit in this set)\n// #define PERF_GROUP3 0x4XXXXXXX in the 2nd set (0x50000000 is the last bit in this set)\n// ...\n// #define PERF_GROUP7 0xeXXXXXXX in the 7th set (0xf0000000 is the last bit in this set)\n//\n// See ntperf.h for the manipulations of flags.\n//\n// Externally published group masks (only in the 0th set) are defined in envtrace.h.\n// This section contains extended group masks which are private.\n//\n// The highest set of GROUP_MASK (0xeXXXXXXX) is currently reserved for\n// modifying system behaviors (e.g., turn off page fault clustering, limit\n// process working set when BigFoot is turned on, etc.) when trace is\n// turned on.\n//\n//\n//\n// NOTE: In LongHorn we decided to expose some of the flags outside of group 0.\n//       We did that by adding the following flags which are treated as aliases:\n//\n//          EVENT_TRACE_FLAG_CSWITCH\n//          EVENT_TRACE_FLAG_DPC\n//          EVENT_TRACE_FLAG_INTERRUPT\n//          EVENT_TRACE_FLAG_SYSTEMCALL\n//          EVENT_TRACE_FLAG_DRIVER\n//          EVENT_TRACE_FLAG_PROFILE\n//\n//\n// GlobalMask 0 (Masks[0])\n//\n#define PERF_REGISTRY             EVENT_TRACE_FLAG_REGISTRY\n#define PERF_HARD_FAULTS          EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS\n#define PERF_JOB                  EVENT_TRACE_FLAG_JOB\n#define PERF_PROC_THREAD          EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_THREAD\n#define PERF_PROCESS              EVENT_TRACE_FLAG_PROCESS\n#define PERF_THREAD               EVENT_TRACE_FLAG_THREAD\n#define PERF_DISK_IO              EVENT_TRACE_FLAG_DISK_FILE_IO | EVENT_TRACE_FLAG_DISK_IO\n#define PERF_DISK_IO_INIT         EVENT_TRACE_FLAG_DISK_IO_INIT\n#define PERF_LOADER               EVENT_TRACE_FLAG_IMAGE_LOAD\n#define PERF_ALL_FAULTS           EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS\n#define PERF_FILENAME             EVENT_TRACE_FLAG_DISK_FILE_IO\n#define PERF_NETWORK              EVENT_TRACE_FLAG_NETWORK_TCPIP\n#define PERF_ALPC                 EVENT_TRACE_FLAG_ALPC\n#define PERF_SPLIT_IO             EVENT_TRACE_FLAG_SPLIT_IO\n#define PERF_PERF_COUNTER         EVENT_TRACE_FLAG_PROCESS_COUNTERS\n#define PERF_FILE_IO              EVENT_TRACE_FLAG_FILE_IO\n#define PERF_FILE_IO_INIT         EVENT_TRACE_FLAG_FILE_IO_INIT\n#define PERF_DBGPRINT             EVENT_TRACE_FLAG_DBGPRINT\n#define PERF_NO_SYSCONFIG         EVENT_TRACE_FLAG_NO_SYSCONFIG\n#define PERF_VAMAP                EVENT_TRACE_FLAG_VAMAP\n#define PERF_DEBUG_EVENTS         EVENT_TRACE_FLAG_DEBUG_EVENTS\n\n//\n// GlobalMask 1 (Masks[1])\n//\n#define PERF_MEMORY          0x20000001   // High level WS manager activities, PFN changes\n#define PERF_PROFILE         0x20000002   // Sysprof // equivalent to EVENT_TRACE_FLAG_PROFILE\n#define PERF_CONTEXT_SWITCH  0x20000004   // Context Switch // equivalent to EVENT_TRACE_FLAG_CSWITCH\n#define PERF_FOOTPRINT       0x20000008   // Flush WS on every mark_with_flush\n#define PERF_DRIVERS         0x20000010   // equivalent to EVENT_TRACE_FLAG_DRIVER\n#define PERF_REFSET          0x20000020   // PERF_FOOTPRINT + log AutoMark on trace start/stop.\n#define PERF_POOL            0x20000040\n#define PERF_POOLTRACE       0x20000041\n#define PERF_DPC             0x20000080   // equivalent to EVENT_TRACE_FLAG_DPC\n#define PERF_COMPACT_CSWITCH 0x20000100\n#define PERF_DISPATCHER      0x20000200   // equivalent to EVENT_TRACE_FLAG_DISPATCHER\n#define PERF_PMC_PROFILE     0x20000400\n#define PERF_PROFILING       0x20000402\n#define PERF_PROCESS_INSWAP  0x20000800\n#define PERF_AFFINITY        0x20001000\n#define PERF_PRIORITY        0x20002000\n#define PERF_INTERRUPT       0x20004000   // equivalent to EVENT_TRACE_FLAG_INTERRUPT\n#define PERF_VIRTUAL_ALLOC   0x20008000   // equivalent to EVENT_TRACE_FLAG_VIRTUAL_ALLOC\n#define PERF_SPINLOCK        0x20010000\n#define PERF_SYNC_OBJECTS    0x20020000\n#define PERF_DPC_QUEUE       0x20040000\n#define PERF_MEMINFO         0x20080000\n#define PERF_CONTMEM_GEN     0x20100000\n#define PERF_SPINLOCK_CNTRS  0x20200000\n#define PERF_SPININSTR       0x20210000\n#define PERF_SESSION         0x20400000\n#define PERF_PFSECTION       PERF_SESSION // Bits in this group are scarce and so use SESSION for PFSECTION events.\n#define PERF_MEMINFO_WS      0x20800000   // Logs Workingset/Commit information on MemInfo DPC\n#define PERF_KERNEL_QUEUE    0x21000000\n#define PERF_INTERRUPT_STEER 0x22000000\n#define PERF_SHOULD_YIELD    0x24000000\n#define PERF_WS              0x28000000\n//#define PERF_POOLTRACE       (PERF_MEMORY | PERF_POOL)\n//#define PERF_PROFILING       (PERF_PROFILE | PERF_PMC_PROFILE)\n//#define PERF_SPININSTR       (PERF_SPINLOCK | PERF_SPINLOCK_CNTRS)\n\n//\n// GlobalMask 2 (Masks[2])\n//\n#define PERF_ANTI_STARVATION  0x40000001\n#define PERF_PROCESS_FREEZE   0x40000002\n#define PERF_PFN_LIST         0x40000004\n#define PERF_WS_DETAIL        0x40000008\n#define PERF_WS_ENTRY         0x40000010\n#define PERF_HEAP             0x40000020\n#define PERF_SYSCALL          0x40000040\n#define PERF_UMS              0x40000080\n#define PERF_BACKTRACE        0x40000100\n#define PERF_VULCAN           0x40000200\n#define PERF_OBJECTS          0x40000400\n#define PERF_EVENTS           0x40000800\n#define PERF_FULLTRACE        0x40001000\n#define PERF_DFSS             0x40002000  // spare\n#define PERF_PREFETCH         0x40004000\n#define PERF_PROCESSOR_IDLE   0x40008000\n#define PERF_CPU_CONFIG       0x40010000\n#define PERF_TIMER            0x40020000\n#define PERF_CLOCK_INTERRUPT  0x40040000\n#define PERF_LOAD_BALANCER    0x40080000  // spare\n#define PERF_CLOCK_TIMER      0x40100000\n#define PERF_IDLE_SELECTION   0x40200000\n#define PERF_IPI              0x40400000\n#define PERF_IO_TIMER         0x40800000\n#define PERF_REG_HIVE         0x41000000\n#define PERF_REG_NOTIF        0x42000000\n#define PERF_PPM_EXIT_LATENCY 0x44000000\n#define PERF_WORKER_THREAD    0x48000000\n\n//\n// GlobalMask 3 (Masks[3])\n//\n\n// Reserved                  0x60000001\n// Reserved                  0x60000002\n// Reserved                  0x60000004\n// Reserved                  0x60000008\n// ...\n\n//\n// GlobalMask 4 (Masks[4])\n//\n\n#define PERF_OPTICAL_IO      0x80000001\n#define PERF_OPTICAL_IO_INIT 0x80000002\n// Reserved                  0x80000004\n#define PERF_DLL_INFO        0x80000008\n#define PERF_DLL_FLUSH_WS    0x80000010\n// Reserved                  0x80000020\n#define PERF_OB_HANDLE       0x80000040\n#define PERF_OB_OBJECT       0x80000080\n// Reserved                  0x80000100\n#define PERF_WAKE_DROP       0x80000200\n#define PERF_WAKE_EVENT      0x80000400\n#define PERF_DEBUGGER        0x80000800\n#define PERF_PROC_ATTACH     0x80001000\n#define PERF_WAKE_COUNTER    0x80002000\n// Reserved                  0x80004000\n#define PERF_POWER           0x80008000\n#define PERF_SOFT_TRIM       0x80010000\n#define PERF_CC              0x80020000\n// Reserved                  0x80040000\n#define PERF_FLT_IO_INIT     0x80080000\n#define PERF_FLT_IO          0x80100000\n#define PERF_FLT_FASTIO      0x80200000\n#define PERF_FLT_IO_FAILURE  0x80400000\n#define PERF_HV_PROFILE      0x80800000\n#define PERF_WDF_DPC         0x81000000\n#define PERF_WDF_INTERRUPT   0x82000000\n#define PERF_CACHE_FLUSH     0x84000000\n\n//\n// GlobalMask 5:\n//\n\n#define PERF_HIBER_RUNDOWN  0xA0000001\n\n// Reserved                  0xA0000002\n// Reserved                  0xA0000004\n// Reserved                  0xA0000008\n// ...\n\n//\n// GlobalMask 6:\n//\n\n#define PERF_SYSCFG_SYSTEM   0xC0000001\n#define PERF_SYSCFG_GRAPHICS 0xC0000002\n#define PERF_SYSCFG_STORAGE  0xC0000004\n#define PERF_SYSCFG_NETWORK  0xC0000008\n#define PERF_SYSCFG_SERVICES 0xC0000010\n#define PERF_SYSCFG_PNP      0xC0000020\n#define PERF_SYSCFG_OPTICAL  0xC0000040\n// Reserved                  0xC0000080\n// Reserved                  0xC0000100\n#define PERF_SYSCFG_ALL      0xDFFFFFFF\n\n//\n// GlobalMask 7: The mark is a control mask.  All flags that changes system\n// behaviors go here.\n//\n\n#define PERF_CLUSTER_OFF     0xe0000001\n#define PERF_MEMORY_CONTROL  0xe0000002\n\n//\n// Converting old PERF hooks into WMI format.  More clean up to be done.\n//\n// WHEN YOU ADD NEW TYPES UPDATE THE NAME TABLE in perfgroups.c:\n// PerfLogTypeNames ALSO UPDATE VERIFICATION TABLE IN PERFPOSTTBLS.C\n//\n\n//\n// Event for header\n//\n#define WMI_LOG_TYPE_HEADER                       (EVENT_TRACE_GROUP_HEADER | EVENT_TRACE_TYPE_INFO)\n#define WMI_LOG_TYPE_HEADER_EXTENSION             (EVENT_TRACE_GROUP_HEADER | EVENT_TRACE_TYPE_EXTENSION)\n#define WMI_LOG_TYPE_RUNDOWN_COMPLETE             (EVENT_TRACE_GROUP_HEADER | EVENT_TRACE_TYPE_CHECKPOINT)\n#define WMI_LOG_TYPE_GROUP_MASKS_END              (EVENT_TRACE_GROUP_HEADER | 0x20)\n#define WMI_LOG_TYPE_RUNDOWN_BEGIN                (EVENT_TRACE_GROUP_HEADER | 0x30)\n#define WMI_LOG_TYPE_RUNDOWN_END                  (EVENT_TRACE_GROUP_HEADER | 0x31)\n#define WMI_LOG_TYPE_DBGID_RSDS                   (EVENT_TRACE_GROUP_HEADER | EVENT_TRACE_TYPE_DBGID_RSDS)\n#define WMI_LOG_TYPE_DBGID_NB10                   (EVENT_TRACE_GROUP_HEADER | 0x41)\n#define WMI_LOG_TYPE_BUILD_LAB                    (EVENT_TRACE_GROUP_HEADER | 0x42)\n#define WMI_LOG_TYPE_BINARY_PATH                  (EVENT_TRACE_GROUP_HEADER | 0x43)\n\n//\n// Event for system config\n//\n\n#define WMI_LOG_TYPE_CONFIG_CPU                   (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_CPU)\n#define WMI_LOG_TYPE_CONFIG_PHYSICALDISK          (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK)\n#define WMI_LOG_TYPE_CONFIG_LOGICALDISK           (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_LOGICALDISK)\n#define WMI_LOG_TYPE_CONFIG_OPTICALMEDIA          (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_OPTICALMEDIA)\n#define WMI_LOG_TYPE_CONFIG_NIC                   (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_NIC)\n#define WMI_LOG_TYPE_CONFIG_VIDEO                 (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_VIDEO)\n#define WMI_LOG_TYPE_CONFIG_SERVICES              (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_SERVICES)\n#define WMI_LOG_TYPE_CONFIG_POWER                 (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_POWER)\n//#define WMI_LOG_TYPE_CONFIG_OSVERSION             (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_OSVERSION)\n//#define WMI_LOG_TYPE_CONFIG_VISUALTHEME           (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_VISUALTHEME)\n//#define WMI_LOG_TYPE_CONFIG_SYSTEMRANGE           (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_SYSTEMRANGE)\n//#define WMI_LOG_TYPE_CONFIG_SYSDLLINFO            (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_SYSDLLINFO)\n#define WMI_LOG_TYPE_CONFIG_IRQ                   (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_IRQ)\n#define WMI_LOG_TYPE_CONFIG_PNP                   (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_PNP)\n#define WMI_LOG_TYPE_CONFIG_IDECHANNEL            (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_IDECHANNEL)\n#define WMI_LOG_TYPE_CONFIG_NUMANODE              (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_NUMANODE)\n#define WMI_LOG_TYPE_CONFIG_PLATFORM              (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_PLATFORM)\n#define WMI_LOG_TYPE_CONFIG_PROCESSORGROUP        (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_PROCESSORGROUP)\n#define WMI_LOG_TYPE_CONFIG_PROCESSORNUMBER       (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_PROCESSORNUMBER)\n#define WMI_LOG_TYPE_CONFIG_DPI                   (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_DPI)\n#define WMI_LOG_TYPE_CONFIG_CODEINTEGRITY         (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_CI_INFO)\n#define WMI_LOG_TYPE_CONFIG_MACHINEID             (EVENT_TRACE_GROUP_CONFIG | EVENT_TRACE_TYPE_CONFIG_MACHINEID)\n\n//\n// Event for Image and File Name\n//\n#define PERFINFO_LOG_TYPE_FILENAME                  (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_INFO)\n#define PERFINFO_LOG_TYPE_FILENAME_CREATE           (EVENT_TRACE_GROUP_FILE | 0x20)\n#define PERFINFO_LOG_TYPE_FILENAME_SAME             (EVENT_TRACE_GROUP_FILE | 0x21)\n#define PERFINFO_LOG_TYPE_FILENAME_NULL             (EVENT_TRACE_GROUP_FILE | 0x22)\n#define PERFINFO_LOG_TYPE_FILENAME_DELETE           (EVENT_TRACE_GROUP_FILE | 0x23)\n#define PERFINFO_LOG_TYPE_FILENAME_RUNDOWN          (EVENT_TRACE_GROUP_FILE | 0x24)\n\n#define PERFINFO_LOG_TYPE_MAPFILE                   (EVENT_TRACE_GROUP_FILE | 0x25)\n#define PERFINFO_LOG_TYPE_UNMAPFILE                 (EVENT_TRACE_GROUP_FILE | 0x26)\n#define PERFINFO_LOG_TYPE_MAPFILE_DC_START          (EVENT_TRACE_GROUP_FILE | 0x27)\n#define PERFINFO_LOG_TYPE_MAPFILE_DC_END            (EVENT_TRACE_GROUP_FILE | 0x28)\n\n#define PERFINFO_LOG_TYPE_FILE_IO_CREATE            (EVENT_TRACE_GROUP_FILE | 0x40)\n#define PERFINFO_LOG_TYPE_FILE_IO_CLEANUP           (EVENT_TRACE_GROUP_FILE | 0x41)\n#define PERFINFO_LOG_TYPE_FILE_IO_CLOSE             (EVENT_TRACE_GROUP_FILE | 0x42)\n#define PERFINFO_LOG_TYPE_FILE_IO_READ              (EVENT_TRACE_GROUP_FILE | 0x43)\n#define PERFINFO_LOG_TYPE_FILE_IO_WRITE             (EVENT_TRACE_GROUP_FILE | 0x44)\n#define PERFINFO_LOG_TYPE_FILE_IO_SET_INFORMATION   (EVENT_TRACE_GROUP_FILE | 0x45)\n#define PERFINFO_LOG_TYPE_FILE_IO_DELETE            (EVENT_TRACE_GROUP_FILE | 0x46)\n#define PERFINFO_LOG_TYPE_FILE_IO_RENAME            (EVENT_TRACE_GROUP_FILE | 0x47)\n#define PERFINFO_LOG_TYPE_FILE_IO_DIRENUM           (EVENT_TRACE_GROUP_FILE | 0x48)\n#define PERFINFO_LOG_TYPE_FILE_IO_FLUSH             (EVENT_TRACE_GROUP_FILE | 0x49)\n#define PERFINFO_LOG_TYPE_FILE_IO_QUERY_INFORMATION (EVENT_TRACE_GROUP_FILE | 0x4A)\n#define PERFINFO_LOG_TYPE_FILE_IO_FS_CONTROL        (EVENT_TRACE_GROUP_FILE | 0x4B)\n#define PERFINFO_LOG_TYPE_FILE_IO_OPERATION_END     (EVENT_TRACE_GROUP_FILE | 0x4C)\n#define PERFINFO_LOG_TYPE_FILE_IO_DIRNOTIFY         (EVENT_TRACE_GROUP_FILE | 0x4D)\n#define PERFINFO_LOG_TYPE_FILE_IO_CREATE_NEW        (EVENT_TRACE_GROUP_FILE | 0x4E)\n#define PERFINFO_LOG_TYPE_FILE_IO_DELETE_PATH       (EVENT_TRACE_GROUP_FILE | 0x4F)\n#define PERFINFO_LOG_TYPE_FILE_IO_RENAME_PATH       (EVENT_TRACE_GROUP_FILE | 0x50)\n#define PERFINFO_LOG_TYPE_FILE_IO_SETLINK_PATH      (EVENT_TRACE_GROUP_FILE | 0x51)\n#define PERFINFO_LOG_TYPE_FILE_IO_SETLINK           (EVENT_TRACE_GROUP_FILE | 0x52)\n\n//\n//  Event types for minifilter callbacks\n//\n\n#define PERFINFO_LOG_TYPE_FLT_PREOP_INIT        (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_PREOP_INIT)\n#define PERFINFO_LOG_TYPE_FLT_POSTOP_INIT       (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_POSTOP_INIT)\n#define PERFINFO_LOG_TYPE_FLT_PREOP_COMPLETION  (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_PREOP_COMPLETION)\n#define PERFINFO_LOG_TYPE_FLT_POSTOP_COMPLETION (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_POSTOP_COMPLETION)\n#define PERFINFO_LOG_TYPE_FLT_PREOP_FAILURE     (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_PREOP_FAILURE)\n#define PERFINFO_LOG_TYPE_FLT_POSTOP_FAILURE    (EVENT_TRACE_GROUP_FILE | EVENT_TRACE_TYPE_FLT_POSTOP_FAILURE)\n\n//\n// Event types for Job\n//\n\n#define WMI_LOG_TYPE_JOB_CREATE                     (EVENT_TRACE_GROUP_JOB | 0x20)\n#define WMI_LOG_TYPE_JOB_TERMINATE                  (EVENT_TRACE_GROUP_JOB | 0x21)\n#define WMI_LOG_TYPE_JOB_OPEN                       (EVENT_TRACE_GROUP_JOB | 0x22)\n#define WMI_LOG_TYPE_JOB_ASSIGN_PROCESS             (EVENT_TRACE_GROUP_JOB | 0x23)\n#define WMI_LOG_TYPE_JOB_REMOVE_PROCESS             (EVENT_TRACE_GROUP_JOB | 0x24)\n#define WMI_LOG_TYPE_JOB_SET                        (EVENT_TRACE_GROUP_JOB | 0x25)\n#define WMI_LOG_TYPE_JOB_QUERY                      (EVENT_TRACE_GROUP_JOB | 0x26)\n#define WMI_LOG_TYPE_JOB_SET_FAILED                 (EVENT_TRACE_GROUP_JOB | 0x27)\n#define WMI_LOG_TYPE_JOB_QUERY_FAILED               (EVENT_TRACE_GROUP_JOB | 0x28)\n#define WMI_LOG_TYPE_JOB_SET_NOTIFICATION           (EVENT_TRACE_GROUP_JOB | 0x29)\n#define WMI_LOG_TYPE_JOB_SEND_NOTIFICATION          (EVENT_TRACE_GROUP_JOB | 0x2A)\n#define WMI_LOG_TYPE_JOB_QUERY_VIOLATION            (EVENT_TRACE_GROUP_JOB | 0x2B)\n#define WMI_LOG_TYPE_JOB_SET_CPU_RATE               (EVENT_TRACE_GROUP_JOB | 0x2C)\n#define WMI_LOG_TYPE_JOB_SET_NET_RATE               (EVENT_TRACE_GROUP_JOB | 0x2D)\n\n//\n// Event types for Process\n//\n\n#define WMI_LOG_TYPE_PROCESS_CREATE                 (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_START)\n#define WMI_LOG_TYPE_PROCESS_DELETE                 (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_END)\n#define WMI_LOG_TYPE_PROCESS_DC_START               (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_DC_START)\n#define WMI_LOG_TYPE_PROCESS_DC_END                 (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_DC_END)\n#define WMI_LOG_TYPE_PROCESS_LOAD_IMAGE             (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_LOAD)\n#define WMI_LOG_TYPE_PROCESS_TERMINATE              (EVENT_TRACE_GROUP_PROCESS | EVENT_TRACE_TYPE_TERMINATE)\n\n#define PERFINFO_LOG_TYPE_PROCESS_PERFCTR_END       (EVENT_TRACE_GROUP_PROCESS | 0x20)\n#define PERFINFO_LOG_TYPE_PROCESS_PERFCTR_RD        (EVENT_TRACE_GROUP_PROCESS | 0x21)\n// Reserved                                         (EVENT_TRACE_GROUP_PROCESS | 0x22)\n#define PERFINFO_LOG_TYPE_INSWAPPROCESS             (EVENT_TRACE_GROUP_PROCESS | 0x23)\n#define PERFINFO_LOG_TYPE_PROCESS_FREEZE            (EVENT_TRACE_GROUP_PROCESS | 0x24)\n#define PERFINFO_LOG_TYPE_PROCESS_THAW              (EVENT_TRACE_GROUP_PROCESS | 0x25)\n#define PERFINFO_LOG_TYPE_BOOT_PHASE_START          (EVENT_TRACE_GROUP_PROCESS | 0x26)\n#define PERFINFO_LOG_TYPE_ZOMBIE_PROCESS            (EVENT_TRACE_GROUP_PROCESS | 0x27)\n#define PERFINFO_LOG_TYPE_PROCESS_SET_AFFINITY      (EVENT_TRACE_GROUP_PROCESS | 0x28)\n\n#define PERFINFO_LOG_TYPE_CHARGE_WAKE_COUNTER_USER             (EVENT_TRACE_GROUP_PROCESS | 0x30)\n#define PERFINFO_LOG_TYPE_CHARGE_WAKE_COUNTER_EXECUTION        (EVENT_TRACE_GROUP_PROCESS | 0x31)\n#define PERFINFO_LOG_TYPE_CHARGE_WAKE_COUNTER_KERNEL           (EVENT_TRACE_GROUP_PROCESS | 0x32)\n#define PERFINFO_LOG_TYPE_CHARGE_WAKE_COUNTER_INSTRUMENTATION  (EVENT_TRACE_GROUP_PROCESS | 0x33)\n#define PERFINFO_LOG_TYPE_CHARGE_WAKE_COUNTER_PRESERVE_PROCESS (EVENT_TRACE_GROUP_PROCESS | 0x34)\n\n#define PERFINFO_LOG_TYPE_RELEASE_WAKE_COUNTER_USER            (EVENT_TRACE_GROUP_PROCESS | 0x40)\n#define PERFINFO_LOG_TYPE_RELEASE_WAKE_COUNTER_EXECUTION       (EVENT_TRACE_GROUP_PROCESS | 0x41)\n#define PERFINFO_LOG_TYPE_RELEASE_WAKE_COUNTER_KERNEL          (EVENT_TRACE_GROUP_PROCESS | 0x42)\n#define PERFINFO_LOG_TYPE_RELEASE_WAKE_COUNTER_INSTRUMENTATION (EVENT_TRACE_GROUP_PROCESS | 0x43)\n#define PERFINFO_LOG_TYPE_RELEASE_WAKE_COUNTER_PRESERVE_PROCESS (EVENT_TRACE_GROUP_PROCESS | 0x44)\n\n#define PERFINFO_LOG_TYPE_WAKE_DROP_USER                       (EVENT_TRACE_GROUP_PROCESS | 0x50)\n#define PERFINFO_LOG_TYPE_WAKE_DROP_EXECUTION                  (EVENT_TRACE_GROUP_PROCESS | 0x51)\n#define PERFINFO_LOG_TYPE_WAKE_DROP_KERNEL                     (EVENT_TRACE_GROUP_PROCESS | 0x52)\n#define PERFINFO_LOG_TYPE_WAKE_DROP_INSTRUMENTATION            (EVENT_TRACE_GROUP_PROCESS | 0x53)\n#define PERFINFO_LOG_TYPE_WAKE_DROP_PRESERVE_PROCESS           (EVENT_TRACE_GROUP_PROCESS | 0x54)\n\n#define PERFINFO_LOG_TYPE_WAKE_EVENT_USER                      (EVENT_TRACE_GROUP_PROCESS | 0x60)\n#define PERFINFO_LOG_TYPE_WAKE_EVENT_EXECUTION                 (EVENT_TRACE_GROUP_PROCESS | 0x61)\n#define PERFINFO_LOG_TYPE_WAKE_EVENT_KERNEL                    (EVENT_TRACE_GROUP_PROCESS | 0x62)\n#define PERFINFO_LOG_TYPE_WAKE_EVENT_INSTRUMENTATION           (EVENT_TRACE_GROUP_PROCESS | 0x63)\n#define PERFINFO_LOG_TYPE_WAKE_EVENT_PRESERVE_PROCESS          (EVENT_TRACE_GROUP_PROCESS | 0x64)\n\n#define PERFINFO_LOG_TYPE_DEBUG_EVENT                          (EVENT_TRACE_GROUP_PROCESS | 0x70)\n\n//\n// Event types for Image and Library Loader\n//\n\n#define WMI_LOG_TYPE_IMAGE_LOAD                     (EVENT_TRACE_GROUP_IMAGE | EVENT_TRACE_TYPE_START) // reserved for future\n#define WMI_LOG_TYPE_IMAGE_UNLOAD                   (EVENT_TRACE_GROUP_IMAGE | EVENT_TRACE_TYPE_END)\n#define WMI_LOG_TYPE_IMAGE_DC_START                 (EVENT_TRACE_GROUP_IMAGE | EVENT_TRACE_TYPE_DC_START)\n#define WMI_LOG_TYPE_IMAGE_DC_END                   (EVENT_TRACE_GROUP_IMAGE | EVENT_TRACE_TYPE_DC_END)\n#define WMI_LOG_TYPE_IMAGE_RELOCATION               (EVENT_TRACE_GROUP_IMAGE | 0x20)\n#define WMI_LOG_TYPE_IMAGE_KERNEL_BASE              (EVENT_TRACE_GROUP_IMAGE | 0x21)\n#define WMI_LOG_TYPE_IMAGE_HYPERCALL_PAGE           (EVENT_TRACE_GROUP_IMAGE | 0x22)\n\n#define PERFINFO_LOG_TYPE_LDR_LOCK_ACQUIRE_ATTEMPT          (EVENT_TRACE_GROUP_IMAGE | 0x80) // 128\n#define PERFINFO_LOG_TYPE_LDR_LOCK_ACQUIRE_SUCCESS          (EVENT_TRACE_GROUP_IMAGE | 0x81)\n#define PERFINFO_LOG_TYPE_LDR_LOCK_ACQUIRE_FAIL             (EVENT_TRACE_GROUP_IMAGE | 0x82)\n#define PERFINFO_LOG_TYPE_LDR_LOCK_ACQUIRE_WAIT             (EVENT_TRACE_GROUP_IMAGE | 0x83)\n#define PERFINFO_LOG_TYPE_LDR_PROC_INIT_DONE                (EVENT_TRACE_GROUP_IMAGE | 0x84) // 132\n#define PERFINFO_LOG_TYPE_LDR_CREATE_SECTION                (EVENT_TRACE_GROUP_IMAGE | 0x85)\n#define PERFINFO_LOG_TYPE_LDR_SECTION_CREATED               (EVENT_TRACE_GROUP_IMAGE | 0x86)\n#define PERFINFO_LOG_TYPE_LDR_MAP_VIEW                      (EVENT_TRACE_GROUP_IMAGE | 0x87)\n\n#define PERFINFO_LOG_TYPE_LDR_RELOCATE_IMAGE                (EVENT_TRACE_GROUP_IMAGE | 0x90) // 144\n#define PERFINFO_LOG_TYPE_LDR_IMAGE_RELOCATED               (EVENT_TRACE_GROUP_IMAGE | 0x91)\n#define PERFINFO_LOG_TYPE_LDR_HANDLE_OLD_DESCRIPTORS        (EVENT_TRACE_GROUP_IMAGE | 0x92)\n#define PERFINFO_LOG_TYPE_LDR_OLD_DESCRIPTORS_HANDLED       (EVENT_TRACE_GROUP_IMAGE | 0x93)\n#define PERFINFO_LOG_TYPE_LDR_HANDLE_NEW_DESCRIPTORS        (EVENT_TRACE_GROUP_IMAGE | 0x94) // 148\n#define PERFINFO_LOG_TYPE_LDR_NEW_DESCRIPTORS_HANDLED       (EVENT_TRACE_GROUP_IMAGE | 0x95)\n#define PERFINFO_LOG_TYPE_LDR_DLLMAIN_EXIT                  (EVENT_TRACE_GROUP_IMAGE | 0x96)\n\n#define PERFINFO_LOG_TYPE_LDR_FIND_DLL                      (EVENT_TRACE_GROUP_IMAGE | 0xA0) // 160\n#define PERFINFO_LOG_TYPE_LDR_VIEW_MAPPED                   (EVENT_TRACE_GROUP_IMAGE | 0xA1)\n#define PERFINFO_LOG_TYPE_LDR_LOCK_RELEASE                  (EVENT_TRACE_GROUP_IMAGE | 0xA2)\n#define PERFINFO_LOG_TYPE_LDR_DLLMAIN_ENTER                 (EVENT_TRACE_GROUP_IMAGE | 0xA3)\n#define PERFINFO_LOG_TYPE_LDR_ERROR                         (EVENT_TRACE_GROUP_IMAGE | 0xA4) // 164\n\n#define PERFINFO_LOG_TYPE_LDR_VIEW_MAPPING                  (EVENT_TRACE_GROUP_IMAGE | 0xA5) // 165\n#define PERFINFO_LOG_TYPE_LDR_SNAPPING                      (EVENT_TRACE_GROUP_IMAGE | 0xA6)\n#define PERFINFO_LOG_TYPE_LDR_SNAPPED                       (EVENT_TRACE_GROUP_IMAGE | 0xA7)\n#define PERFINFO_LOG_TYPE_LDR_LOADING                       (EVENT_TRACE_GROUP_IMAGE | 0xA8)\n#define PERFINFO_LOG_TYPE_LDR_LOADED                        (EVENT_TRACE_GROUP_IMAGE | 0xA9)\n#define PERFINFO_LOG_TYPE_LDR_FOUND_KNOWN_DLL               (EVENT_TRACE_GROUP_IMAGE | 0xAA) // 170\n#define PERFINFO_LOG_TYPE_LDR_ABNORMAL                      (EVENT_TRACE_GROUP_IMAGE | 0xAB)\n#define PERFINFO_LOG_TYPE_LDR_PLACEHOLDER                   (EVENT_TRACE_GROUP_IMAGE | 0xAC)\n#define PERFINFO_LOG_TYPE_LDR_RDY_TO_INIT                   (EVENT_TRACE_GROUP_IMAGE | 0xAD)\n#define PERFINFO_LOG_TYPE_LDR_RDY_TO_RUN                    (EVENT_TRACE_GROUP_IMAGE | 0xAE) // 174\n\n\n#define PERFINFO_LOG_TYPE_LDR_NEW_DLL_LOAD                  (EVENT_TRACE_GROUP_IMAGE | 0xB0) // 176\n#define PERFINFO_LOG_TYPE_LDR_NEW_DLL_AS_DATA               (EVENT_TRACE_GROUP_IMAGE | 0xB1) // 177\n\n#define PERFINFO_LOG_TYPE_LDR_EXTERNAL_PATH                 (EVENT_TRACE_GROUP_IMAGE | 0xC0) // 192\n#define PERFINFO_LOG_TYPE_LDR_GENERATED_PATH                (EVENT_TRACE_GROUP_IMAGE | 0xC1)\n\n#define PERFINFO_LOG_TYPE_LDR_APISET_RESOLVING              (EVENT_TRACE_GROUP_IMAGE | 0xD0) // 208\n#define PERFINFO_LOG_TYPE_LDR_APISET_HOSTED                 (EVENT_TRACE_GROUP_IMAGE | 0xD1) // 209\n#define PERFINFO_LOG_TYPE_LDR_APISET_UNHOSTED               (EVENT_TRACE_GROUP_IMAGE | 0xD2) // 210\n#define PERFINFO_LOG_TYPE_LDR_APISET_UNRESOLVED             (EVENT_TRACE_GROUP_IMAGE | 0xD3) // 211\n\n#define PERFINFO_LOG_TYPE_LDR_SEARCH_SECURITY               (EVENT_TRACE_GROUP_IMAGE | 0xD4) // 212\n#define PERFINFO_LOG_TYPE_LDR_SEARCH_PATH_SECURITY          (EVENT_TRACE_GROUP_IMAGE | 0xD5) // 213\n\n//\n// Event types for Thread\n//\n\n#define WMI_LOG_TYPE_THREAD_CREATE                  (EVENT_TRACE_GROUP_THREAD | EVENT_TRACE_TYPE_START)\n#define WMI_LOG_TYPE_THREAD_DELETE                  (EVENT_TRACE_GROUP_THREAD | EVENT_TRACE_TYPE_END)\n#define WMI_LOG_TYPE_THREAD_DC_START                (EVENT_TRACE_GROUP_THREAD | EVENT_TRACE_TYPE_DC_START)\n#define WMI_LOG_TYPE_THREAD_DC_END                  (EVENT_TRACE_GROUP_THREAD | EVENT_TRACE_TYPE_DC_END)\n\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x20)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x21)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x22)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x23)\n#define PERFINFO_LOG_TYPE_CONTEXTSWAP               (EVENT_TRACE_GROUP_THREAD | 0x24)\n#define PERFINFO_LOG_TYPE_CONTEXTSWAP_BATCH         (EVENT_TRACE_GROUP_THREAD | 0x25)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x26)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x27)\n// Reserved                                         (EVENT_TRACE_GROUP_THREAD | 0x28)\n#define PERFINFO_LOG_TYPE_SPINLOCK                  (EVENT_TRACE_GROUP_THREAD | 0x29)\n#define PERFINFO_LOG_TYPE_QUEUE                     (EVENT_TRACE_GROUP_THREAD | 0x2A)\n#define PERFINFO_LOG_TYPE_RESOURCE                  (EVENT_TRACE_GROUP_THREAD | 0x2B)\n#define PERFINFO_LOG_TYPE_PUSHLOCK                  (EVENT_TRACE_GROUP_THREAD | 0x2C)\n#define PERFINFO_LOG_TYPE_WAIT_SINGLE               (EVENT_TRACE_GROUP_THREAD | 0x2D)\n#define PERFINFO_LOG_TYPE_WAIT_MULTIPLE             (EVENT_TRACE_GROUP_THREAD | 0x2E)\n#define PERFINFO_LOG_TYPE_DELAY_EXECUTION           (EVENT_TRACE_GROUP_THREAD | 0x2F)\n#define PERFINFO_LOG_TYPE_THREAD_SET_PRIORITY       (EVENT_TRACE_GROUP_THREAD | 0x30)\n#define PERFINFO_LOT_TYPE_THREAD_SET_BASE_PRIORITY  (EVENT_TRACE_GROUP_THREAD | 0x31)\n#define PERFINFO_LOG_TYPE_THREAD_SET_BASE_PRIORITY  (EVENT_TRACE_GROUP_THREAD | 0x31)\n#define PERFINFO_LOG_TYPE_READY_THREAD              (EVENT_TRACE_GROUP_THREAD | 0x32)\n#define PERFINFO_LOG_TYPE_THREAD_SET_PAGE_PRIORITY  (EVENT_TRACE_GROUP_THREAD | 0x33)\n#define PERFINFO_LOG_TYPE_THREAD_SET_IO_PRIORITY    (EVENT_TRACE_GROUP_THREAD | 0x34)\n#define PERFINFO_LOG_TYPE_THREAD_SET_AFFINITY       (EVENT_TRACE_GROUP_THREAD | 0x35)\n#define PERFINFO_LOG_TYPE_WORKER_THREAD_ITEM        (EVENT_TRACE_GROUP_THREAD | 0x39)\n#define PERFINFO_LOG_TYPE_DFSS_START_NEW_INTERVAL   (EVENT_TRACE_GROUP_THREAD | 0x3A)\n#define PERFINFO_LOG_TYPE_DFSS_PROCESS_IDLE_ONLY_QUEUE (EVENT_TRACE_GROUP_THREAD | 0x3B)\n#define PERFINFO_LOG_TYPE_ANTI_STARVATION_BOOST     (EVENT_TRACE_GROUP_THREAD | 0x3C)\n#define PERFINFO_LOG_TYPE_THREAD_MIGRATION          (EVENT_TRACE_GROUP_THREAD | 0x3D)\n#define PERFINFO_LOG_TYPE_KQUEUE_ENQUEUE            (EVENT_TRACE_GROUP_THREAD | 0x3E)\n#define PERFINFO_LOG_TYPE_KQUEUE_DEQUEUE            (EVENT_TRACE_GROUP_THREAD | 0x3F)\n#define PERFINFO_LOG_TYPE_WORKER_THREAD_ITEM_START  (EVENT_TRACE_GROUP_THREAD | 0x40)\n#define PERFINFO_LOG_TYPE_WORKER_THREAD_ITEM_END    (EVENT_TRACE_GROUP_THREAD | 0x41)\n#define PERFINFO_LOG_TYPE_AUTO_BOOST_SET_FLOOR      (EVENT_TRACE_GROUP_THREAD | 0x42)\n#define PERFINFO_LOG_TYPE_AUTO_BOOST_CLEAR_FLOOR    (EVENT_TRACE_GROUP_THREAD | 0x43)\n#define PERFINFO_LOG_TYPE_AUTO_BOOST_NO_ENTRIES     (EVENT_TRACE_GROUP_THREAD | 0x44)\n#define PERFINFO_LOG_TYPE_THREAD_SUBPROCESSTAG_CHANGED (EVENT_TRACE_GROUP_THREAD | 0x45)\n\n//\n// Event types for Network subsystem (TCPIP/UDPIP)\n//\n\n#define WMI_LOG_TYPE_TCPIP_SEND                     (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_SEND)\n#define WMI_LOG_TYPE_TCPIP_RECEIVE                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_RECEIVE)\n#define WMI_LOG_TYPE_TCPIP_CONNECT                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_CONNECT)\n#define WMI_LOG_TYPE_TCPIP_DISCONNECT               (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_DISCONNECT)\n#define WMI_LOG_TYPE_TCPIP_RETRANSMIT               (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_RETRANSMIT)\n#define WMI_LOG_TYPE_TCPIP_ACCEPT                   (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_ACCEPT)\n#define WMI_LOG_TYPE_TCPIP_RECONNECT                (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_RECONNECT)\n#define WMI_LOG_TYPE_TCPIP_FAIL                     (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_CONNFAIL)\n#define WMI_LOG_TYPE_TCPIP_TCPCOPY                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_COPY_TCP)\n#define WMI_LOG_TYPE_TCPIP_ARPCOPY                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_COPY_ARP)\n#define WMI_LOG_TYPE_TCPIP_FULLACK                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_ACKFULL)\n#define WMI_LOG_TYPE_TCPIP_PARTACK                  (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_ACKPART)\n#define WMI_LOG_TYPE_TCPIP_DUPACK                   (EVENT_TRACE_GROUP_TCPIP | EVENT_TRACE_TYPE_ACKDUP)\n\n#define WMI_LOG_TYPE_UDP_SEND                       (EVENT_TRACE_GROUP_UDPIP | EVENT_TRACE_TYPE_SEND)\n#define WMI_LOG_TYPE_UDP_RECEIVE                    (EVENT_TRACE_GROUP_UDPIP | EVENT_TRACE_TYPE_RECEIVE)\n#define WMI_LOG_TYPE_UDP_FAIL                       (EVENT_TRACE_GROUP_UDPIP | EVENT_TRACE_TYPE_CONNFAIL)\n\n//\n// Network events with IPV6\n//\n#define WMI_LOG_TYPE_TCPIP_SEND_IPV6                (EVENT_TRACE_GROUP_TCPIP | 0x1A)\n#define WMI_LOG_TYPE_TCPIP_RECEIVE_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x1B)\n#define WMI_LOG_TYPE_TCPIP_CONNECT_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x1C)\n#define WMI_LOG_TYPE_TCPIP_DISCONNECT_IPV6          (EVENT_TRACE_GROUP_TCPIP | 0x1D)\n#define WMI_LOG_TYPE_TCPIP_RETRANSMIT_IPV6          (EVENT_TRACE_GROUP_TCPIP | 0x1E)\n#define WMI_LOG_TYPE_TCPIP_ACCEPT_IPV6              (EVENT_TRACE_GROUP_TCPIP | 0x1F)\n#define WMI_LOG_TYPE_TCPIP_RECONNECT_IPV6           (EVENT_TRACE_GROUP_TCPIP | 0x20)\n#define WMI_LOG_TYPE_TCPIP_FAIL_IPV6                (EVENT_TRACE_GROUP_TCPIP | 0x21)\n#define WMI_LOG_TYPE_TCPIP_TCPCOPY_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x22)\n#define WMI_LOG_TYPE_TCPIP_ARPCOPY_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x23)\n#define WMI_LOG_TYPE_TCPIP_FULLACK_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x24)\n#define WMI_LOG_TYPE_TCPIP_PARTACK_IPV6             (EVENT_TRACE_GROUP_TCPIP | 0x25)\n#define WMI_LOG_TYPE_TCPIP_DUPACK_IPV6              (EVENT_TRACE_GROUP_TCPIP | 0x26)\n\n#define WMI_LOG_TYPE_UDP_SEND_IPV6                  (EVENT_TRACE_GROUP_UDPIP | 0x1A)\n#define WMI_LOG_TYPE_UDP_RECEIVE_IPV6               (EVENT_TRACE_GROUP_UDPIP | 0x1B)\n\n//\n// Event types for IO subsystem\n//\n\n#define WMI_LOG_TYPE_IO_READ                        (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_READ)\n#define WMI_LOG_TYPE_IO_WRITE                       (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_WRITE)\n#define WMI_LOG_TYPE_IO_READ_INIT                   (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_READ_INIT)\n#define WMI_LOG_TYPE_IO_WRITE_INIT                  (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_WRITE_INIT)\n#define WMI_LOG_TYPE_IO_FLUSH                       (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_FLUSH)\n#define WMI_LOG_TYPE_IO_FLUSH_INIT                  (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_FLUSH_INIT)\n#define WMI_LOG_TYPE_IO_REDIRECTED_INIT             (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_IO_REDIRECTED_INIT)\n\n#define PERFINFO_LOG_TYPE_DRIVER_INIT                       (EVENT_TRACE_GROUP_IO | 0x20)\n#define PERFINFO_LOG_TYPE_DRIVER_INIT_COMPLETE              (EVENT_TRACE_GROUP_IO | 0x21)\n#define PERFINFO_LOG_TYPE_DRIVER_MAJORFUNCTION_CALL         (EVENT_TRACE_GROUP_IO | 0x22)\n#define PERFINFO_LOG_TYPE_DRIVER_MAJORFUNCTION_RETURN       (EVENT_TRACE_GROUP_IO | 0x23)\n#define PERFINFO_LOG_TYPE_DRIVER_COMPLETIONROUTINE_CALL     (EVENT_TRACE_GROUP_IO | 0x24)\n#define PERFINFO_LOG_TYPE_DRIVER_COMPLETIONROUTINE_RETURN   (EVENT_TRACE_GROUP_IO | 0x25)\n#define PERFINFO_LOG_TYPE_DRIVER_ADD_DEVICE_CALL            (EVENT_TRACE_GROUP_IO | 0x26)\n#define PERFINFO_LOG_TYPE_DRIVER_ADD_DEVICE_RETURN          (EVENT_TRACE_GROUP_IO | 0x27)\n#define PERFINFO_LOG_TYPE_DRIVER_STARTIO_CALL               (EVENT_TRACE_GROUP_IO | 0x28)\n#define PERFINFO_LOG_TYPE_DRIVER_STARTIO_RETURN             (EVENT_TRACE_GROUP_IO | 0x29)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2a)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2b)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2c)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2d)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2e)\n// Reserved                                                 (EVENT_TRACE_GROUP_IO | 0x2f)\n#define PERFINFO_LOG_TYPE_PREFETCH_ACTION                   (EVENT_TRACE_GROUP_IO | 0x30)\n#define PERFINFO_LOG_TYPE_PREFETCH_REQUEST                  (EVENT_TRACE_GROUP_IO | 0x31)\n#define PERFINFO_LOG_TYPE_PREFETCH_READLIST                 (EVENT_TRACE_GROUP_IO | 0x32)\n#define PERFINFO_LOG_TYPE_PREFETCH_READ                     (EVENT_TRACE_GROUP_IO | 0x33)\n#define PERFINFO_LOG_TYPE_DRIVER_COMPLETE_REQUEST           (EVENT_TRACE_GROUP_IO | 0x34)\n#define PERFINFO_LOG_TYPE_DRIVER_COMPLETE_REQUEST_RETURN    (EVENT_TRACE_GROUP_IO | 0x35)\n#define PERFINFO_LOG_TYPE_BOOT_PREFETCH_INFORMATION         (EVENT_TRACE_GROUP_IO | 0x36)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_READ                   (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_READ)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_WRITE                  (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_WRITE)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_FLUSH                  (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_FLUSH)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_READ_INIT              (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_READ_INIT)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_WRITE_INIT             (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_WRITE_INIT)\n#define PERFINFO_LOG_TYPE_OPTICAL_IO_FLUSH_INIT             (EVENT_TRACE_GROUP_IO | EVENT_TRACE_TYPE_OPTICAL_IO_FLUSH_INIT)\n\n//\n// Event types for Memory subsystem\n//\n#define WMI_LOG_TYPE_PAGE_FAULT_TRANSITION         (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_TF)\n#define WMI_LOG_TYPE_PAGE_FAULT_DEMAND_ZERO        (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_DZF)\n#define WMI_LOG_TYPE_PAGE_FAULT_COPY_ON_WRITE      (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_COW)\n#define WMI_LOG_TYPE_PAGE_FAULT_GUARD_PAGE         (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_GPF)\n#define WMI_LOG_TYPE_PAGE_FAULT_HARD_PAGE_FAULT    (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_HPF)\n#define WMI_LOG_TYPE_PAGE_FAULT_ACCESS_VIOLATION   (EVENT_TRACE_GROUP_MEMORY | EVENT_TRACE_TYPE_MM_AV)\n\n#define PERFINFO_LOG_TYPE_HARDFAULT                (EVENT_TRACE_GROUP_MEMORY | 0x20)\n#define PERFINFO_LOG_TYPE_REMOVEPAGEBYCOLOR        (EVENT_TRACE_GROUP_MEMORY | 0x21)\n#define PERFINFO_LOG_TYPE_REMOVEPAGEFROMLIST       (EVENT_TRACE_GROUP_MEMORY | 0x22)\n#define PERFINFO_LOG_TYPE_PAGEINMEMORY             (EVENT_TRACE_GROUP_MEMORY | 0x23)\n#define PERFINFO_LOG_TYPE_INSERTINFREELIST         (EVENT_TRACE_GROUP_MEMORY | 0x24)\n#define PERFINFO_LOG_TYPE_INSERTINMODIFIEDLIST     (EVENT_TRACE_GROUP_MEMORY | 0x25)\n#define PERFINFO_LOG_TYPE_INSERTINLIST             (EVENT_TRACE_GROUP_MEMORY | 0x26)\n#define PERFINFO_LOG_TYPE_INSERTATFRONT            (EVENT_TRACE_GROUP_MEMORY | 0x28)\n#define PERFINFO_LOG_TYPE_UNLINKFROMSTANDBY        (EVENT_TRACE_GROUP_MEMORY | 0x29)\n#define PERFINFO_LOG_TYPE_UNLINKFFREEORZERO        (EVENT_TRACE_GROUP_MEMORY | 0x2a)\n#define PERFINFO_LOG_TYPE_WORKINGSETMANAGER        (EVENT_TRACE_GROUP_MEMORY | 0x2b)\n#define PERFINFO_LOG_TYPE_TRIMPROCESS              (EVENT_TRACE_GROUP_MEMORY | 0x2c)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x2d)\n#define PERFINFO_LOG_TYPE_ZEROSHARECOUNT           (EVENT_TRACE_GROUP_MEMORY | 0x2e)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x2f)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x30)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x31)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x32)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x33)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x34)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x35)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x36)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x37)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x38)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x39)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x3a)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x3b)\n#define PERFINFO_LOG_TYPE_WSINFOPROCESS            (EVENT_TRACE_GROUP_MEMORY | 0x3c)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x3d)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x3e)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x3f)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x40)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x41)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x42)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x43)\n// Reserved                                        (EVENT_TRACE_GROUP_MEMORY | 0x44)\n#define PERFINFO_LOG_TYPE_FAULTADDR_WITH_IP        (EVENT_TRACE_GROUP_MEMORY | 0x45)\n#define PERFINFO_LOG_TYPE_TRIMSESSION              (EVENT_TRACE_GROUP_MEMORY | 0x46)\n#define PERFINFO_LOG_TYPE_MEMORYSNAPLITE           (EVENT_TRACE_GROUP_MEMORY | 0x47)\n#define PERFINFO_LOG_TYPE_PFMAPPED_SECTION_RUNDOWN (EVENT_TRACE_GROUP_MEMORY | 0x48)\n#define PERFINFO_LOG_TYPE_PFMAPPED_SECTION_CREATE  (EVENT_TRACE_GROUP_MEMORY | 0x49)\n#define PERFINFO_LOG_TYPE_WSINFOSESSION            (EVENT_TRACE_GROUP_MEMORY | 0x4a)\n#define PERFINFO_LOG_TYPE_CREATE_SESSION           (EVENT_TRACE_GROUP_MEMORY | 0x4b)\n#define PERFINFO_LOG_TYPE_SESSION_RUNDOWN_DC_END   (EVENT_TRACE_GROUP_MEMORY | 0x4c)\n#define PERFINFO_LOG_TYPE_SESSION_RUNDOWN_DC_START (EVENT_TRACE_GROUP_MEMORY | 0x4d)\n#define PERFINFO_LOG_TYPE_SESSION_DELETE           (EVENT_TRACE_GROUP_MEMORY | 0x4e)\n#define PERFINFO_LOG_TYPE_PFMAPPED_SECTION_DELETE  (EVENT_TRACE_GROUP_MEMORY | 0x4f)\n\n#define PERFINFO_LOG_TYPE_VIRTUAL_ALLOC            (EVENT_TRACE_GROUP_MEMORY | 0x62)\n#define PERFINFO_LOG_TYPE_VIRTUAL_FREE             (EVENT_TRACE_GROUP_MEMORY | 0x63)\n#define PERFINFO_LOG_TYPE_HEAP_RANGE_RUNDOWN       (EVENT_TRACE_GROUP_MEMORY | 0x64)\n#define PERFINFO_LOG_TYPE_HEAP_RANGE_CREATE        (EVENT_TRACE_GROUP_MEMORY | 0x65)\n#define PERFINFO_LOG_TYPE_HEAP_RANGE_RESERVE       (EVENT_TRACE_GROUP_MEMORY | 0x66)\n#define PERFINFO_LOG_TYPE_HEAP_RANGE_RELEASE       (EVENT_TRACE_GROUP_MEMORY | 0x67)\n#define PERFINFO_LOG_TYPE_HEAP_RANGE_DESTROY       (EVENT_TRACE_GROUP_MEMORY | 0x68)\n\n#define PERFINFO_LOG_TYPE_PAGEFILE_BACK            (EVENT_TRACE_GROUP_MEMORY | 0x69)\n#define PERFINFO_LOG_TYPE_MEMINFO                  (EVENT_TRACE_GROUP_MEMORY | 0x70)\n#define PERFINFO_LOG_TYPE_CONTMEM_GENERATE         (EVENT_TRACE_GROUP_MEMORY | 0x71)\n#define PERFINFO_LOG_TYPE_FILE_STORE_FAULT         (EVENT_TRACE_GROUP_MEMORY | 0x72)\n#define PERFINFO_LOG_TYPE_INMEMORY_STORE_FAULT     (EVENT_TRACE_GROUP_MEMORY | 0x73)\n#define PERFINFO_LOG_TYPE_COMPRESSED_PAGE          (EVENT_TRACE_GROUP_MEMORY | 0x74)\n#define PERFINFO_LOG_TYPE_PAGEINMEMORY_ACTIVE      (EVENT_TRACE_GROUP_MEMORY | 0x75)\n#define PERFINFO_LOG_TYPE_PAGE_ACCESS              (EVENT_TRACE_GROUP_MEMORY | 0x76)\n#define PERFINFO_LOG_TYPE_PAGE_RELEASE             (EVENT_TRACE_GROUP_MEMORY | 0x77)\n#define PERFINFO_LOG_TYPE_PAGE_RANGE_ACCESS        (EVENT_TRACE_GROUP_MEMORY | 0x78)\n#define PERFINFO_LOG_TYPE_PAGE_RANGE_RELEASE       (EVENT_TRACE_GROUP_MEMORY | 0x79)\n#define PERFINFO_LOG_TYPE_PAGE_COMBINE             (EVENT_TRACE_GROUP_MEMORY | 0x7a)\n#define PERFINFO_LOG_TYPE_KERNEL_MEMUSAGE          (EVENT_TRACE_GROUP_MEMORY | 0x7b)\n#define PERFINFO_LOG_TYPE_MM_STATS                 (EVENT_TRACE_GROUP_MEMORY | 0x7c)\n#define PERFINFO_LOG_TYPE_MEMINFOEX_WS             (EVENT_TRACE_GROUP_MEMORY | 0x7d)\n#define PERFINFO_LOG_TYPE_MEMINFOEX_SESSIONWS      (EVENT_TRACE_GROUP_MEMORY | 0x7e)\n\n#define PERFINFO_LOG_TYPE_VIRTUAL_ROTATE           (EVENT_TRACE_GROUP_MEMORY | 0x7f)\n#define PERFINFO_LOG_TYPE_VIRTUAL_ALLOC_DC_START   (EVENT_TRACE_GROUP_MEMORY | 0x80)\n#define PERFINFO_LOG_TYPE_VIRTUAL_ALLOC_DC_END     (EVENT_TRACE_GROUP_MEMORY | 0x81)\n\n#define PERFINFO_LOG_TYPE_PAGE_ACCESS_EX           (EVENT_TRACE_GROUP_MEMORY | 0x82)\n#define PERFINFO_LOG_TYPE_REMOVEFROMWS             (EVENT_TRACE_GROUP_MEMORY | 0x83)\n#define PERFINFO_LOG_TYPE_WSSHAREABLE_RUNDOWN      (EVENT_TRACE_GROUP_MEMORY | 0x84)\n#define PERFINFO_LOG_TYPE_INMEMORYACTIVE_RUNDOWN   (EVENT_TRACE_GROUP_MEMORY | 0x85)\n\n#define PERFINFO_LOG_TYPE_MEM_RESET_INFO           (EVENT_TRACE_GROUP_MEMORY | 0x86)\n#define PERFINFO_LOG_TYPE_PFMAPPED_SECTION_OBJECT_CREATE  (EVENT_TRACE_GROUP_MEMORY | 0x87)\n#define PERFINFO_LOG_TYPE_PFMAPPED_SECTION_OBJECT_DELETE  (EVENT_TRACE_GROUP_MEMORY | 0x88)\n\n//\n//\n// Event types for Registry subsystem\n//\n#define WMI_LOG_TYPE_REG_RUNDOWNBEGIN      (EVENT_TRACE_GROUP_REGISTRY | EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN)\n#define WMI_LOG_TYPE_REG_RUNDOWNEND        (EVENT_TRACE_GROUP_REGISTRY | EVENT_TRACE_TYPE_REGKCBRUNDOWNEND)\n\n#define PERFINFO_LOG_TYPE_CMCELLREFERRED            (EVENT_TRACE_GROUP_REGISTRY | 0x20)\n#define PERFINFO_LOG_TYPE_REG_SET_VALUE             (EVENT_TRACE_GROUP_REGISTRY | 0x21)\n#define PERFINFO_LOG_TYPE_REG_COUNTERS              (EVENT_TRACE_GROUP_REGISTRY | 0x22)\n#define PERFINFO_LOG_TYPE_REG_CONFIG                (EVENT_TRACE_GROUP_REGISTRY | 0x23)\n#define PERFINFO_LOG_TYPE_REG_HIVE_INITIALIZE       (EVENT_TRACE_GROUP_REGISTRY | 0x24)\n#define PERFINFO_LOG_TYPE_REG_HIVE_DESTROY          (EVENT_TRACE_GROUP_REGISTRY | 0x25)\n#define PERFINFO_LOG_TYPE_REG_HIVE_LINK             (EVENT_TRACE_GROUP_REGISTRY | 0x26)\n#define PERFINFO_LOG_TYPE_REG_HIVE_RUNDOWN_DC_END   (EVENT_TRACE_GROUP_REGISTRY | 0x27)\n#define PERFINFO_LOG_TYPE_REG_HIVE_DIRTY            (EVENT_TRACE_GROUP_REGISTRY | 0x28)\n// Reserved\n#define PERFINFO_LOG_TYPE_REG_NOTIF_REGISTER        (EVENT_TRACE_GROUP_REGISTRY | 0x30)\n#define PERFINFO_LOG_TYPE_REG_NOTIF_DELIVER         (EVENT_TRACE_GROUP_REGISTRY | 0x31)\n\n//\n// Event types for PERF tracing specific subsystem\n//\n#define PERFINFO_LOG_TYPE_RUNDOWN_CHECKPOINT           (EVENT_TRACE_GROUP_PERFINFO | 0x20)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x21)\n#define PERFINFO_LOG_TYPE_MARK                         (EVENT_TRACE_GROUP_PERFINFO | 0x22)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x23)\n#define PERFINFO_LOG_TYPE_ASYNCMARK                    (EVENT_TRACE_GROUP_PERFINFO | 0x24)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x25)\n#define PERFINFO_LOG_TYPE_IMAGENAME                    (EVENT_TRACE_GROUP_PERFINFO | 0x26)\n#define PERFINFO_LOG_TYPE_DELAYS_CC_CAN_I_WRITE        (EVENT_TRACE_GROUP_PERFINFO | 0x27)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x28)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x29)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x2a)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x2b)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x2c)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x2d)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE              (EVENT_TRACE_GROUP_PERFINFO | 0x2e)\n#define PERFINFO_LOG_TYPE_PMC_INTERRUPT                (EVENT_TRACE_GROUP_PERFINFO | 0x2f)\n#define PERFINFO_LOG_TYPE_PMC_CONFIG                   (EVENT_TRACE_GROUP_PERFINFO | 0x30)\n// Reserved                                            (EVENT_TRACE_GROUP_PERFINFO | 0x31)\n#define PERFINFO_LOG_TYPE_MSI_INTERRUPT                (EVENT_TRACE_GROUP_PERFINFO | 0x32)\n#define PERFINFO_LOG_TYPE_SYSCALL_ENTER                (EVENT_TRACE_GROUP_PERFINFO | 0x33)\n#define PERFINFO_LOG_TYPE_SYSCALL_EXIT                 (EVENT_TRACE_GROUP_PERFINFO | 0x34)\n#define PERFINFO_LOG_TYPE_BACKTRACE                    (EVENT_TRACE_GROUP_PERFINFO | 0x35)\n#define PERFINFO_LOG_TYPE_BACKTRACE_USERSTACK          (EVENT_TRACE_GROUP_PERFINFO | 0x36)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE_CACHE        (EVENT_TRACE_GROUP_PERFINFO | 0x37)\n#define PERFINFO_LOG_TYPE_EXCEPTION_STACK              (EVENT_TRACE_GROUP_PERFINFO | 0x38)\n#define PERFINFO_LOG_TYPE_BRANCH_TRACE                 (EVENT_TRACE_GROUP_PERFINFO | 0x39)\n#define PERFINFO_LOG_TYPE_DEBUGGER_ENABLED             (EVENT_TRACE_GROUP_PERFINFO | 0x3a)\n#define PERFINFO_LOG_TYPE_DEBUGGER_EXIT                (EVENT_TRACE_GROUP_PERFINFO | 0x3b)\n#define PERFINFO_LOG_TYPE_BRANCH_TRACE_DEBUG           (EVENT_TRACE_GROUP_PERFINFO | 0x40)\n#define PERFINFO_LOG_TYPE_BRANCH_ADDRESS_DEBUG         (EVENT_TRACE_GROUP_PERFINFO | 0x41)\n#define PERFINFO_LOG_TYPE_THREADED_DPC                 (EVENT_TRACE_GROUP_PERFINFO | 0x42)\n#define PERFINFO_LOG_TYPE_INTERRUPT                    (EVENT_TRACE_GROUP_PERFINFO | 0x43)\n#define PERFINFO_LOG_TYPE_DPC                          (EVENT_TRACE_GROUP_PERFINFO | 0x44)\n#define PERFINFO_LOG_TYPE_TIMERDPC                     (EVENT_TRACE_GROUP_PERFINFO | 0x45)\n#define PERFINFO_LOG_TYPE_IOTIMER_EXPIRATION           (EVENT_TRACE_GROUP_PERFINFO | 0x46)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE_NMI          (EVENT_TRACE_GROUP_PERFINFO | 0x47)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE_SET_INTERVAL (EVENT_TRACE_GROUP_PERFINFO | 0x48)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE_DC_START     (EVENT_TRACE_GROUP_PERFINFO | 0x49)\n#define PERFINFO_LOG_TYPE_SAMPLED_PROFILE_DC_END       (EVENT_TRACE_GROUP_PERFINFO | 0x4a)\n#define PERFINFO_LOG_TYPE_SPINLOCK_DC_START            (EVENT_TRACE_GROUP_PERFINFO | 0x4b)\n#define PERFINFO_LOG_TYPE_SPINLOCK_DC_END              (EVENT_TRACE_GROUP_PERFINFO | 0x4c)\n#define PERFINFO_LOG_TYPE_ERESOURCE_DC_START           (EVENT_TRACE_GROUP_PERFINFO | 0x4d)\n#define PERFINFO_LOG_TYPE_ERESOURCE_DC_END             (EVENT_TRACE_GROUP_PERFINFO | 0x4e)\n#define PERFINFO_LOG_TYPE_CLOCK_INTERRUPT              (EVENT_TRACE_GROUP_PERFINFO | 0x4f)\n#define PERFINFO_LOG_TYPE_TIMER_EXPIRATION_START       (EVENT_TRACE_GROUP_PERFINFO | 0x50)\n#define PERFINFO_LOG_TYPE_TIMER_EXPIRATION             (EVENT_TRACE_GROUP_PERFINFO | 0x51)\n#define PERFINFO_LOG_TYPE_TIMER_SET_PERIODIC           (EVENT_TRACE_GROUP_PERFINFO | 0x52)\n#define PERFINFO_LOG_TYPE_TIMER_SET_ONE_SHOT           (EVENT_TRACE_GROUP_PERFINFO | 0x53)\n#define PERFINFO_LOG_TYPE_TIMER_SET_THREAD             (EVENT_TRACE_GROUP_PERFINFO | 0x54)\n#define PERFINFO_LOG_TYPE_TIMER_CANCEL                 (EVENT_TRACE_GROUP_PERFINFO | 0x55)\n#define PERFINFO_LOG_TYPE_TIME_ADJUSTMENT              (EVENT_TRACE_GROUP_PERFINFO | 0x56)\n#define PERFINFO_LOG_TYPE_CLOCK_MODE_SWITCH            (EVENT_TRACE_GROUP_PERFINFO | 0x57)\n#define PERFINFO_LOG_TYPE_CLOCK_TIME_UPDATE            (EVENT_TRACE_GROUP_PERFINFO | 0x58)\n#define PERFINFO_LOG_TYPE_CLOCK_DYNAMIC_TICK_VETO      (EVENT_TRACE_GROUP_PERFINFO | 0x59)\n#define PERFINFO_LOG_TYPE_CLOCK_CONFIGURATION          (EVENT_TRACE_GROUP_PERFINFO | 0x5a)\n#define PERFINFO_LOG_TYPE_IPI                          (EVENT_TRACE_GROUP_PERFINFO | 0x5b)\n#define PERFINFO_LOG_TYPE_UNEXPECTED_INTERRUPT         (EVENT_TRACE_GROUP_PERFINFO | 0x5c)\n#define PERFINFO_LOG_TYPE_IOTIMER_START                (EVENT_TRACE_GROUP_PERFINFO | 0x5d)\n#define PERFINFO_LOG_TYPE_IOTIMER_STOP                 (EVENT_TRACE_GROUP_PERFINFO | 0x5e)\n#define PERFINFO_LOG_TYPE_PASSIVE_INTERRUPT            (EVENT_TRACE_GROUP_PERFINFO | 0x5f)\n#define PERFINFO_LOG_TYPE_WDF_INTERRUPT                (EVENT_TRACE_GROUP_PERFINFO | 0x60)\n#define PERFINFO_LOG_TYPE_WDF_PASSIVE_INTERRUPT        (EVENT_TRACE_GROUP_PERFINFO | 0x61)\n#define PERFINFO_LOG_TYPE_WDF_DPC                      (EVENT_TRACE_GROUP_PERFINFO | 0x62)\n#define PERFINFO_LOG_TYPE_CPU_CACHE_FLUSH              (EVENT_TRACE_GROUP_PERFINFO | 0x63)\n#define PERFINFO_LOG_TYPE_DPC_ENQUEUE                  (EVENT_TRACE_GROUP_PERFINFO | 0x64)\n#define PERFINFO_LOG_TYPE_DPC_EXECUTION                (EVENT_TRACE_GROUP_PERFINFO | 0x65)\n#define PERFINFO_LOG_TYPE_INTERRUPT_STEERING           (EVENT_TRACE_GROUP_PERFINFO | 0x66)\n#define PERFINFO_LOG_TYPE_WDF_WORK_ITEM                (EVENT_TRACE_GROUP_PERFINFO | 0x67)\n#define PERFINFO_LOG_TYPE_KTIMER2_SET                  (EVENT_TRACE_GROUP_PERFINFO | 0x68)\n#define PERFINFO_LOG_TYPE_KTIMER2_EXPIRATION           (EVENT_TRACE_GROUP_PERFINFO | 0x69)\n#define PERFINFO_LOG_TYPE_KTIMER2_CANCEL               (EVENT_TRACE_GROUP_PERFINFO | 0x6a)\n#define PERFINFO_LOG_TYPE_KTIMER2_DISABLE              (EVENT_TRACE_GROUP_PERFINFO | 0x6b)\n#define PERFINFO_LOG_TYPE_KTIMER2_FINALIZATION         (EVENT_TRACE_GROUP_PERFINFO | 0x6c)\n#define PERFINFO_LOG_TYPE_SHOULD_YIELD_PROCESSOR       (EVENT_TRACE_GROUP_PERFINFO | 0x6d)\n\n//\n// Event types for ICE.\n//\n\n#define PERFINFO_LOG_TYPE_FUNCTION_CALL                (EVENT_TRACE_GROUP_PERFINFO | 0x80)\n#define PERFINFO_LOG_TYPE_FUNCTION_RETURN              (EVENT_TRACE_GROUP_PERFINFO | 0x81)\n#define PERFINFO_LOG_TYPE_FUNCTION_ENTER               (EVENT_TRACE_GROUP_PERFINFO | 0x82)\n#define PERFINFO_LOG_TYPE_FUNCTION_EXIT                (EVENT_TRACE_GROUP_PERFINFO | 0x83)\n#define PERFINFO_LOG_TYPE_TAILCALL                     (EVENT_TRACE_GROUP_PERFINFO | 0x84)\n#define PERFINFO_LOG_TYPE_TRAP                         (EVENT_TRACE_GROUP_PERFINFO | 0x85)\n#define PERFINFO_LOG_TYPE_SPINLOCK_ACQUIRE             (EVENT_TRACE_GROUP_PERFINFO | 0x86)\n#define PERFINFO_LOG_TYPE_SPINLOCK_RELEASE             (EVENT_TRACE_GROUP_PERFINFO | 0x87)\n#define PERFINFO_LOG_TYPE_CAP_COMMENT                  (EVENT_TRACE_GROUP_PERFINFO | 0x88)\n#define PERFINFO_LOG_TYPE_CAP_RUNDOWN                  (EVENT_TRACE_GROUP_PERFINFO | 0x89)\n\n//\n// Event types for Debugger subsystem.\n//\n\n#define PERFINFO_LOG_TYPE_DEBUG_PRINT                  (EVENT_TRACE_GROUP_DBGPRINT | 0x20)\n\n//\n// Event types for WNF facility\n//\n\n#define PERFINFO_LOG_TYPE_WNF_SUBSCRIBE                (EVENT_TRACE_GROUP_WNF | 0x20)\n#define PERFINFO_LOG_TYPE_WNF_UNSUBSCRIBE              (EVENT_TRACE_GROUP_WNF | 0x21)\n#define PERFINFO_LOG_TYPE_WNF_CALLBACK                 (EVENT_TRACE_GROUP_WNF | 0x22)\n#define PERFINFO_LOG_TYPE_WNF_PUBLISH                  (EVENT_TRACE_GROUP_WNF | 0x23)\n#define PERFINFO_LOG_TYPE_WNF_NAME_SUB_RUNDOWN         (EVENT_TRACE_GROUP_WNF | 0x24)\n\n//\n// Event types for Pool subsystem.\n//\n\n#define PERFINFO_LOG_TYPE_ALLOCATEPOOL                 (EVENT_TRACE_GROUP_POOL | 0x20)\n#define PERFINFO_LOG_TYPE_ALLOCATEPOOL_SESSION         (EVENT_TRACE_GROUP_POOL | 0x21)\n#define PERFINFO_LOG_TYPE_FREEPOOL                     (EVENT_TRACE_GROUP_POOL | 0x22)\n#define PERFINFO_LOG_TYPE_FREEPOOL_SESSION             (EVENT_TRACE_GROUP_POOL | 0x23)\n#define PERFINFO_LOG_TYPE_ADDPOOLPAGE                  (EVENT_TRACE_GROUP_POOL | 0x24)\n#define PERFINFO_LOG_TYPE_ADDPOOLPAGE_SESSION          (EVENT_TRACE_GROUP_POOL | 0x25)\n#define PERFINFO_LOG_TYPE_BIGPOOLPAGE                  (EVENT_TRACE_GROUP_POOL | 0x26)\n#define PERFINFO_LOG_TYPE_BIGPOOLPAGE_SESSION          (EVENT_TRACE_GROUP_POOL | 0x27)\n#define PERFINFO_LOG_TYPE_POOLSNAP_DC_START            (EVENT_TRACE_GROUP_POOL | 0x28)\n#define PERFINFO_LOG_TYPE_POOLSNAP_DC_END              (EVENT_TRACE_GROUP_POOL | 0x29)\n#define PERFINFO_LOG_TYPE_BIGPOOLSNAP_DC_START         (EVENT_TRACE_GROUP_POOL | 0x2a)\n#define PERFINFO_LOG_TYPE_BIGPOOLSNAP_DC_END           (EVENT_TRACE_GROUP_POOL | 0x2b)\n#define PERFINFO_LOG_TYPE_POOLSNAP_SESSION_DC_START    (EVENT_TRACE_GROUP_POOL | 0x2c)\n#define PERFINFO_LOG_TYPE_POOLSNAP_SESSION_DC_END      (EVENT_TRACE_GROUP_POOL | 0x2d)\n#define PERFINFO_LOG_TYPE_SESSIONBIGPOOLSNAP_DC_START  (EVENT_TRACE_GROUP_POOL | 0x2e)\n#define PERFINFO_LOG_TYPE_SESSIONBIGPOOLSNAP_DC_END    (EVENT_TRACE_GROUP_POOL | 0x2f)\n\n//\n// Event types for Heap subsystem\n//\n#define PERFINFO_LOG_TYPE_HEAP_CREATE                  (EVENT_TRACE_GROUP_HEAP | 0x20)\n#define PERFINFO_LOG_TYPE_HEAP_ALLOC                   (EVENT_TRACE_GROUP_HEAP | 0x21)\n#define PERFINFO_LOG_TYPE_HEAP_REALLOC                 (EVENT_TRACE_GROUP_HEAP | 0x22)\n#define PERFINFO_LOG_TYPE_HEAP_DESTROY                 (EVENT_TRACE_GROUP_HEAP | 0x23)\n#define PERFINFO_LOG_TYPE_HEAP_FREE                    (EVENT_TRACE_GROUP_HEAP | 0x24)\n#define PERFINFO_LOG_TYPE_HEAP_EXTEND                  (EVENT_TRACE_GROUP_HEAP | 0x25)\n#define PERFINFO_LOG_TYPE_HEAP_SNAPSHOT                (EVENT_TRACE_GROUP_HEAP | 0x26)\n#define PERFINFO_LOG_TYPE_HEAP_CREATE_SNAPSHOT         (EVENT_TRACE_GROUP_HEAP | 0x27)\n#define PERFINFO_LOG_TYPE_HEAP_DESTROY_SNAPSHOT        (EVENT_TRACE_GROUP_HEAP | 0x28)\n#define PERFINFO_LOG_TYPE_HEAP_EXTEND_SNAPSHOT         (EVENT_TRACE_GROUP_HEAP | 0x29)\n#define PERFINFO_LOG_TYPE_HEAP_CONTRACT                (EVENT_TRACE_GROUP_HEAP | 0x2a)\n#define PERFINFO_LOG_TYPE_HEAP_LOCK                    (EVENT_TRACE_GROUP_HEAP | 0x2b)\n#define PERFINFO_LOG_TYPE_HEAP_UNLOCK                  (EVENT_TRACE_GROUP_HEAP | 0x2c)\n#define PERFINFO_LOG_TYPE_HEAP_VALIDATE                (EVENT_TRACE_GROUP_HEAP | 0x2d)\n#define PERFINFO_LOG_TYPE_HEAP_WALK                    (EVENT_TRACE_GROUP_HEAP | 0x2e)\n\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_ALLOC          (EVENT_TRACE_GROUP_HEAP | 0x2f)\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_FREE           (EVENT_TRACE_GROUP_HEAP | 0x30)\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_ALLOC_CACHE    (EVENT_TRACE_GROUP_HEAP | 0x31)\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_FREE_CACHE     (EVENT_TRACE_GROUP_HEAP | 0x32)\n#define PERFINFO_LOG_TYPE_HEAP_COMMIT                    (EVENT_TRACE_GROUP_HEAP | 0x33)\n#define PERFINFO_LOG_TYPE_HEAP_DECOMMIT                  (EVENT_TRACE_GROUP_HEAP | 0x34)\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_INIT           (EVENT_TRACE_GROUP_HEAP | 0x35)\n#define PERFINFO_LOG_TYPE_HEAP_AFFINITY_ENABLE           (EVENT_TRACE_GROUP_HEAP | 0x36)\n//Reserved                                               (EVENT_TRACE_GROUP_HEAP | 0x37)\n#define PERFINFO_LOG_TYPE_HEAP_SUBSEGMENT_ACTIVATED      (EVENT_TRACE_GROUP_HEAP | 0x38)\n#define PERFINFO_LOG_TYPE_HEAP_AFFINITY_ASSIGN           (EVENT_TRACE_GROUP_HEAP | 0x39)\n#define PERFINFO_LOG_TYPE_HEAP_REUSE_THRESHOLD_ACTIVATED (EVENT_TRACE_GROUP_HEAP | 0x3a)\n\n//\n// Event Types for Critical Section Subsystem\n//\n\n#define PERFINFO_LOG_TYPE_CRITSEC_ENTER                (EVENT_TRACE_GROUP_CRITSEC | 0x20)\n#define PERFINFO_LOG_TYPE_CRITSEC_LEAVE                (EVENT_TRACE_GROUP_CRITSEC | 0x21)\n#define PERFINFO_LOG_TYPE_CRITSEC_COLLISION            (EVENT_TRACE_GROUP_CRITSEC | 0x22)\n#define PERFINFO_LOG_TYPE_CRITSEC_INITIALIZE           (EVENT_TRACE_GROUP_CRITSEC | 0x23)\n\n//\n// Event types for Stackwalk subsystem\n//\n\n#define PERFINFO_LOG_TYPE_STACKWALK                    (EVENT_TRACE_GROUP_STACKWALK | 0x20)\n//Reserved                                             (EVENT_TRACE_GROUP_STACKWALK | 0x21)\n#define PERFINFO_LOG_TYPE_STACKTRACE_CREATE            (EVENT_TRACE_GROUP_STACKWALK | 0x22)\n#define PERFINFO_LOG_TYPE_STACKTRACE_DELETE            (EVENT_TRACE_GROUP_STACKWALK | 0x23)\n#define PERFINFO_LOG_TYPE_STACKTRACE_RUNDOWN           (EVENT_TRACE_GROUP_STACKWALK | 0x24)\n#define PERFINFO_LOG_TYPE_STACKTRACE_KEY_KERNEL        (EVENT_TRACE_GROUP_STACKWALK | 0x25)\n#define PERFINFO_LOG_TYPE_STACKTRACE_KEY_USER          (EVENT_TRACE_GROUP_STACKWALK | 0x26)\n\n//\n// Event types for ALPC\n//\n\n#define WMI_LOG_TYPE_ALPC_SEND_MESSAGE                  (EVENT_TRACE_GROUP_ALPC | 0x21)\n#define WMI_LOG_TYPE_ALPC_RECEIVE_MESSAGE               (EVENT_TRACE_GROUP_ALPC | 0x22)\n#define WMI_LOG_TYPE_ALPC_WAIT_FOR_REPLY                (EVENT_TRACE_GROUP_ALPC | 0x23)\n#define WMI_LOG_TYPE_ALPC_WAIT_FOR_NEW_MESSAGE          (EVENT_TRACE_GROUP_ALPC | 0x24)\n#define WMI_LOG_TYPE_ALPC_UNWAIT                        (EVENT_TRACE_GROUP_ALPC | 0x25)\n#define WMI_LOG_TYPE_ALPC_CONNECT_REQUEST               (EVENT_TRACE_GROUP_ALPC | 0x26)\n#define WMI_LOG_TYPE_ALPC_CONNECT_SUCCESS               (EVENT_TRACE_GROUP_ALPC | 0x27)\n#define WMI_LOG_TYPE_ALPC_CONNECT_FAIL                  (EVENT_TRACE_GROUP_ALPC | 0x28)\n#define WMI_LOG_TYPE_ALPC_CLOSE_PORT                    (EVENT_TRACE_GROUP_ALPC | 0x29)\n\n\n//\n// Event types for Object Manager subsystem\n//\n\n#define PERFINFO_LOG_TYPE_CREATE_HANDLE                (EVENT_TRACE_GROUP_OBJECT | 0x20)\n#define PERFINFO_LOG_TYPE_CLOSE_HANDLE                 (EVENT_TRACE_GROUP_OBJECT | 0x21)\n#define PERFINFO_LOG_TYPE_DUPLICATE_HANDLE             (EVENT_TRACE_GROUP_OBJECT | 0x22)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x23)\n#define PERFINFO_LOG_TYPE_OBJECT_TYPE_DC_START         (EVENT_TRACE_GROUP_OBJECT | 0x24)\n#define PERFINFO_LOG_TYPE_OBJECT_TYPE_DC_END           (EVENT_TRACE_GROUP_OBJECT | 0x25)\n#define PERFINFO_LOG_TYPE_OBJECT_HANDLE_DC_START       (EVENT_TRACE_GROUP_OBJECT | 0x26)\n#define PERFINFO_LOG_TYPE_OBJECT_HANDLE_DC_END         (EVENT_TRACE_GROUP_OBJECT | 0x27)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x28)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x29)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2a)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2b)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2c)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2d)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2e)\n//Reserved                                             (EVENT_TRACE_GROUP_OBJECT | 0x2f)\n#define PERFINFO_LOG_TYPE_CREATE_OBJECT                (EVENT_TRACE_GROUP_OBJECT | 0x30)\n#define PERFINFO_LOG_TYPE_DELETE_OBJECT                (EVENT_TRACE_GROUP_OBJECT | 0x31)\n#define PERFINFO_LOG_TYPE_REFERENCE_OBJECT             (EVENT_TRACE_GROUP_OBJECT | 0x32)\n#define PERFINFO_LOG_TYPE_DEREFERENCE_OBJECT           (EVENT_TRACE_GROUP_OBJECT | 0x33)\n\n//\n// Event types for Power subsystem\n//\n\n#define PERFINFO_LOG_TYPE_BATTERY_LIFE_INFO            (EVENT_TRACE_GROUP_POWER | 0x20)\n#define PERFINFO_LOG_TYPE_IDLE_STATE_CHANGE            (EVENT_TRACE_GROUP_POWER | 0x21)\n#define PERFINFO_LOG_TYPE_SET_POWER_ACTION             (EVENT_TRACE_GROUP_POWER | 0x22)\n#define PERFINFO_LOG_TYPE_SET_POWER_ACTION_RET         (EVENT_TRACE_GROUP_POWER | 0x23)\n#define PERFINFO_LOG_TYPE_SET_DEVICES_STATE            (EVENT_TRACE_GROUP_POWER | 0x24)\n#define PERFINFO_LOG_TYPE_SET_DEVICES_STATE_RET        (EVENT_TRACE_GROUP_POWER | 0x25)\n#define PERFINFO_LOG_TYPE_PO_NOTIFY_DEVICE             (EVENT_TRACE_GROUP_POWER | 0x26)\n#define PERFINFO_LOG_TYPE_PO_NOTIFY_DEVICE_COMPLETE    (EVENT_TRACE_GROUP_POWER | 0x27)\n#define PERFINFO_LOG_TYPE_PO_SESSION_CALLOUT           (EVENT_TRACE_GROUP_POWER | 0x28)\n#define PERFINFO_LOG_TYPE_PO_SESSION_CALLOUT_RET       (EVENT_TRACE_GROUP_POWER | 0x29)\n#define PERFINFO_LOG_TYPE_PO_PRESLEEP                  (EVENT_TRACE_GROUP_POWER | 0x30)\n#define PERFINFO_LOG_TYPE_PO_POSTSLEEP                 (EVENT_TRACE_GROUP_POWER | 0x31)\n#define PERFINFO_LOG_TYPE_PO_CALIBRATED_PERFCOUNTER    (EVENT_TRACE_GROUP_POWER | 0x32)\n#define PERFINFO_LOG_TYPE_PPM_PERF_STATE_CHANGE        (EVENT_TRACE_GROUP_POWER | 0x33)\n#define PERFINFO_LOG_TYPE_PPM_THROTTLE_STATE_CHANGE    (EVENT_TRACE_GROUP_POWER | 0x34)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_STATE_CHANGE        (EVENT_TRACE_GROUP_POWER | 0x35)\n#define PERFINFO_LOG_TYPE_PPM_THERMAL_CONSTRAINT       (EVENT_TRACE_GROUP_POWER | 0x36)\n#define PERFINFO_LOG_TYPE_PO_SIGNAL_RESUME_UI          (EVENT_TRACE_GROUP_POWER | 0x37)\n#define PERFINFO_LOG_TYPE_PO_SIGNAL_VIDEO_ON           (EVENT_TRACE_GROUP_POWER | 0x38)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_STATE_ENTER         (EVENT_TRACE_GROUP_POWER | 0x39)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_STATE_EXIT          (EVENT_TRACE_GROUP_POWER | 0x3a)\n#define PERFINFO_LOG_TYPE_PPM_PLATFORM_IDLE_STATE_ENTER (EVENT_TRACE_GROUP_POWER | 0x3b)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_EXIT_LATENCY        (EVENT_TRACE_GROUP_POWER | 0x3c)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_PROCESSOR_SELECTION (EVENT_TRACE_GROUP_POWER | 0x3d)\n#define PERFINFO_LOG_TYPE_PPM_IDLE_PLATFORM_SELECTION  (EVENT_TRACE_GROUP_POWER | 0x3e)\n#define PERFINFO_LOG_TYPE_PPM_COORDINATED_IDLE_ENTER   (EVENT_TRACE_GROUP_POWER | 0x3f)\n#define PERFINFO_LOG_TYPE_PPM_COORDINATED_IDLE_EXIT    (EVENT_TRACE_GROUP_POWER | 0x40)\n\n//\n// Event types for MODBound subsystem\n//\n#define PERFINFO_LOG_TYPE_COWHEADER                    (EVENT_TRACE_GROUP_MODBOUND | 0x18)\n#define PERFINFO_LOG_TYPE_COWBLOB                      (EVENT_TRACE_GROUP_MODBOUND | 0x19)\n#define PERFINFO_LOG_TYPE_COWBLOB_CLOSED               (EVENT_TRACE_GROUP_MODBOUND | 0x1a)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_ENT              (EVENT_TRACE_GROUP_MODBOUND | 0x20)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_JUMP             (EVENT_TRACE_GROUP_MODBOUND | 0x21)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_RET              (EVENT_TRACE_GROUP_MODBOUND | 0x22)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_CALL             (EVENT_TRACE_GROUP_MODBOUND | 0x23)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_CALLRET          (EVENT_TRACE_GROUP_MODBOUND | 0x24)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_INT2E            (EVENT_TRACE_GROUP_MODBOUND | 0x25)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_INT2B            (EVENT_TRACE_GROUP_MODBOUND | 0x26)\n#define PERFINFO_LOG_TYPE_MODULEBOUND_FULLTRACE        (EVENT_TRACE_GROUP_MODBOUND | 0x27)\n\n//\n// Event types for the thread class scheduler\n//\n// TODO: Because MMCSS is a DLL it doesn't need to use UMGL.\n//\n#define PERFINFO_LOG_TYPE_MMCSS_START                  (0x20)\n#define PERFINFO_LOG_TYPE_MMCSS_STOP                   (0x21)\n#define PERFINFO_LOG_TYPE_MMCSS_SCHEDULER_EVENT        (0x22)\n#define PERFINFO_LOG_TYPE_MMCSS_SCHEDULER_WAKEUP       (0x23)\n#define PERFINFO_LOG_TYPE_MMCSS_SCHEDULER_SLEEP        (0x24)\n#define PERFINFO_LOG_TYPE_MMCSS_SCHEDULER_SLEEP_RESP   (0x25)\n\n//\n// Event types To be Decided if they are still needed?\n//\n\n#define PERFINFO_LOG_TYPE_DISPATCHMSG                       (EVENT_TRACE_GROUP_TBD | 0x00)\n#define PERFINFO_LOG_TYPE_GLYPHCACHE                        (EVENT_TRACE_GROUP_TBD | 0x01)\n#define PERFINFO_LOG_TYPE_GLYPHS                            (EVENT_TRACE_GROUP_TBD | 0x02)\n#define PERFINFO_LOG_TYPE_READWRITE                         (EVENT_TRACE_GROUP_TBD | 0x03)\n#define PERFINFO_LOG_TYPE_EXPLICIT_LOAD                     (EVENT_TRACE_GROUP_TBD | 0x04)\n#define PERFINFO_LOG_TYPE_IMPLICIT_LOAD                     (EVENT_TRACE_GROUP_TBD | 0x05)\n#define PERFINFO_LOG_TYPE_CHECKSUM                          (EVENT_TRACE_GROUP_TBD | 0x06)\n#define PERFINFO_LOG_TYPE_DLL_INIT                          (EVENT_TRACE_GROUP_TBD | 0x07)\n#define PERFINFO_LOG_TYPE_SERVICE_DD_START_INIT             (EVENT_TRACE_GROUP_TBD | 0x08)\n#define PERFINFO_LOG_TYPE_SERVICE_DD_DONE_INIT              (EVENT_TRACE_GROUP_TBD | 0x09)\n#define PERFINFO_LOG_TYPE_SERVICE_START_INIT                (EVENT_TRACE_GROUP_TBD | 0x0a)\n#define PERFINFO_LOG_TYPE_SERVICE_DONE_INIT                 (EVENT_TRACE_GROUP_TBD | 0x0b)\n#define PERFINFO_LOG_TYPE_SERVICE_NAME                      (EVENT_TRACE_GROUP_TBD | 0x0c)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x0d)\n#define PERFINFO_LOG_TIMED_ENTER_ROUTINE                    (EVENT_TRACE_GROUP_TBD | 0x0e)\n#define PERFINFO_LOG_TIMED_EXIT_ROUTINE                     (EVENT_TRACE_GROUP_TBD | 0x0f)\n#define PERFINFO_LOG_TYPE_CTIME_STATS                       (EVENT_TRACE_GROUP_TBD | 0x10)\n#define PERFINFO_LOG_TYPE_MARKED_DIRTY                      (EVENT_TRACE_GROUP_TBD | 0x11)\n#define PERFINFO_LOG_TYPE_MARKED_CELL_DIRTY                 (EVENT_TRACE_GROUP_TBD | 0x12)\n#define PERFINFO_LOG_TYPE_HIVE_WRITE_DIRTY                  (EVENT_TRACE_GROUP_TBD | 0x13)\n#define PERFINFO_LOG_TYPE_DUMP_HIVECELL                     (EVENT_TRACE_GROUP_TBD | 0x14)\n#define PERFINFO_LOG_TYPE_HIVE_STAT                         (EVENT_TRACE_GROUP_TBD | 0x16)\n#define PERFINFO_LOG_TYPE_CLOCKREF                          (EVENT_TRACE_GROUP_TBD | 0x17)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x18)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x19)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x1a)\n#define PERFINFO_LOG_TYPE_WMIPERFFREQUENCY                  (EVENT_TRACE_GROUP_TBD | 0x1d)\n#define PERFINFO_LOG_TYPE_CDROM_READ                        (EVENT_TRACE_GROUP_TBD | 0x1e)\n#define PERFINFO_LOG_TYPE_CDROM_READ_COMPLETE               (EVENT_TRACE_GROUP_TBD | 0x1f)\n#define PERFINFO_LOG_TYPE_KE_SET_EVENT                      (EVENT_TRACE_GROUP_TBD | 0x20)\n#define PERFINFO_LOG_TYPE_REG_PARSEKEY                      (EVENT_TRACE_GROUP_TBD | 0x21)\n#define PERFINFO_LOG_TYPE_REG_PARSEKEYEND                   (EVENT_TRACE_GROUP_TBD | 0x22)\n#define PERFINFO_LOG_TYPE_ATTACH_PROCESS                    (EVENT_TRACE_GROUP_TBD | 0x24)\n#define PERFINFO_LOG_TYPE_DETACH_PROCESS                    (EVENT_TRACE_GROUP_TBD | 0x25)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x26)\n#define PERFINFO_LOG_TYPE_KDHELP                            (EVENT_TRACE_GROUP_TBD | 0x27)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x28)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x29)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x2a)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x2b)\n#define PERFINFO_LOG_TYPE_FAILED_STKDUMP                    (EVENT_TRACE_GROUP_TBD | 0x2c)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x2d)\n// Reserved                                                 (EVENT_TRACE_GROUP_TBD | 0x2e)\n#define PERFINFO_LOG_TYPE_SYSTEM_TIME                       (EVENT_TRACE_GROUP_TBD | 0x2f)\n#define PERFINFO_LOG_TYPE_READYQUEUE                        (EVENT_TRACE_GROUP_TBD | 0x30)\n\n//\n// Event types for SplitIo\n//\n\n#define PERFINFO_LOG_TYPE_SPLITIO_VOLMGR                    (EVENT_TRACE_GROUP_SPLITIO | 0x20)\n\n//\n// Event types for ThreadPool\n//\n#define PERFINFO_LOG_TYPE_TP_CALLBACK_ENQUEUE               (EVENT_TRACE_GROUP_THREAD_POOL | 0x20)\n#define PERFINFO_LOG_TYPE_TP_CALLBACK_DEQUEUE               (EVENT_TRACE_GROUP_THREAD_POOL | 0x21)\n#define PERFINFO_LOG_TYPE_TP_CALLBACK_START                 (EVENT_TRACE_GROUP_THREAD_POOL | 0x22)\n#define PERFINFO_LOG_TYPE_TP_CALLBACK_STOP                  (EVENT_TRACE_GROUP_THREAD_POOL | 0x23)\n#define PERFINFO_LOG_TYPE_TP_CALLBACK_CANCEL                (EVENT_TRACE_GROUP_THREAD_POOL | 0x24)\n#define PERFINFO_LOG_TYPE_TP_POOL_CREATE                    (EVENT_TRACE_GROUP_THREAD_POOL | 0x25)\n#define PERFINFO_LOG_TYPE_TP_POOL_CLOSE                     (EVENT_TRACE_GROUP_THREAD_POOL | 0x26)\n#define PERFINFO_LOG_TYPE_TP_POOL_TH_MIN_SET                (EVENT_TRACE_GROUP_THREAD_POOL | 0x27)\n#define PERFINFO_LOG_TYPE_TP_POOL_TH_MAX_SET                (EVENT_TRACE_GROUP_THREAD_POOL | 0x28)\n#define PERFINFO_LOG_TYPE_TP_WORKER_NUMANODE_SWITCH         (EVENT_TRACE_GROUP_THREAD_POOL | 0x29)\n#define PERFINFO_LOG_TYPE_TP_TIMER_SET                      (EVENT_TRACE_GROUP_THREAD_POOL | 0x2a)\n#define PERFINFO_LOG_TYPE_TP_TIMER_CANCELLED                (EVENT_TRACE_GROUP_THREAD_POOL | 0x2b)\n#define PERFINFO_LOG_TYPE_TP_TIMER_SET_NTTIMER              (EVENT_TRACE_GROUP_THREAD_POOL | 0x2c)\n#define PERFINFO_LOG_TYPE_TP_TIMER_CANCEL_NTTIMER           (EVENT_TRACE_GROUP_THREAD_POOL | 0x2d)\n#define PERFINFO_LOG_TYPE_TP_TIMER_EXPIRATION_BEGIN         (EVENT_TRACE_GROUP_THREAD_POOL | 0x2e)\n#define PERFINFO_LOG_TYPE_TP_TIMER_EXPIRATION_END           (EVENT_TRACE_GROUP_THREAD_POOL | 0x2f)\n#define PERFINFO_LOG_TYPE_TP_TIMER_EXPIRATION               (EVENT_TRACE_GROUP_THREAD_POOL | 0x30)\n\n//\n// Event types for UMS\n//\n\n#define PERFINFO_LOG_TYPE_UMS_DIRECTED_SWITCH_START         (EVENT_TRACE_GROUP_UMS | 0x20)\n#define PERFINFO_LOG_TYPE_UMS_DIRECTED_SWITCH_END           (EVENT_TRACE_GROUP_UMS | 0x21)\n#define PERFINFO_LOG_TYPE_UMS_PARK                          (EVENT_TRACE_GROUP_UMS | 0x22)\n#define PERFINFO_LOG_TYPE_UMS_DISASSOCIATE                  (EVENT_TRACE_GROUP_UMS | 0x23)\n#define PERFINFO_LOG_TYPE_UMS_CONTEXT_SWITCH                (EVENT_TRACE_GROUP_UMS | 0x24)\n\n//\n// Event types for Cache manager\n//\n\n#define PERFINFO_LOG_TYPE_CC_WORKITEM_ENQUEUE               (EVENT_TRACE_GROUP_CC | 0x00)\n#define PERFINFO_LOG_TYPE_CC_WORKITEM_DEQUEUE               (EVENT_TRACE_GROUP_CC | 0x01)\n#define PERFINFO_LOG_TYPE_CC_WORKITEM_COMPLETE              (EVENT_TRACE_GROUP_CC | 0x02)\n#define PERFINFO_LOG_TYPE_CC_READ_AHEAD                     (EVENT_TRACE_GROUP_CC | 0x03)\n#define PERFINFO_LOG_TYPE_CC_WRITE_BEHIND                   (EVENT_TRACE_GROUP_CC | 0x04)\n#define PERFINFO_LOG_TYPE_CC_LAZY_WRITE_SCAN                (EVENT_TRACE_GROUP_CC | 0x05)\n#define PERFINFO_LOG_TYPE_CC_CAN_I_WRITE_FAIL               (EVENT_TRACE_GROUP_CC | 0x06)\n//#define PERFINFO_LOG_TYPE_CC_MAP_VIEW                       (EVENT_TRACE_GROUP_CC | 0x07)\n//#define PERFINFO_LOG_TYPE_CC_UNMAP_VIEW                     (EVENT_TRACE_GROUP_CC | 0x08)\n#define PERFINFO_LOG_TYPE_CC_FLUSH_CACHE                    (EVENT_TRACE_GROUP_CC | 0x09)\n#define PERFINFO_LOG_TYPE_CC_FLUSH_SECTION                  (EVENT_TRACE_GROUP_CC | 0x0a)\n#define PERFINFO_LOG_TYPE_CC_READ_AHEAD_PREFETCH            (EVENT_TRACE_GROUP_CC | 0x0b)\n#define PERFINFO_LOG_TYPE_CC_SCHEDULE_READ_AHEAD            (EVENT_TRACE_GROUP_CC | 0x0c)\n#define PERFINFO_LOG_TYPE_CC_LOGGED_STREAM_INFO             (EVENT_TRACE_GROUP_CC | 0x0d)\n#define PERFINFO_LOG_TYPE_CC_EXTRA_WRITEBEHIND_THREAD       (EVENT_TRACE_GROUP_CC | 0x0e)\n\n//\n// Data structure used for WMI Kernel Events\n//\n// **NB** the hardware events are described in software tracing, if they\n//        change in layout please update sdktools\\trace\\tracefmt\\default.tmf\n\n\n#define MAX_DEVICE_ID_LENGTH 256\n#define CONFIG_MAX_DOMAIN_NAME_LEN  134\n\ntypedef struct _CPU_CONFIG_RECORD\n{\n    ULONG ProcessorSpeed;\n    ULONG NumberOfProcessors;\n    ULONG MemorySize;               // in MBytes\n    ULONG PageSize;                 // in Bytes\n    ULONG AllocationGranularity;    // in Bytes\n    WCHAR ComputerName[MAX_DEVICE_ID_LENGTH];\n    WCHAR DomainName[CONFIG_MAX_DOMAIN_NAME_LEN];\n    ULONG_PTR HyperThreadingFlag;\n    ULONG_PTR HighestUserAddress;\n    USHORT ProcessorArchitecture;\n    USHORT ProcessorLevel;\n    USHORT ProcessorRevision;\n    BOOLEAN NxEnabled;\n    BOOLEAN PaeEnabled;\n    ULONG MemorySpeed;\n} CPU_CONFIG_RECORD, *PCPU_CONFIG_RECORD;\n\n#define CONFIG_WRITE_CACHE_ENABLED     0x00000001\n#define CONFIG_FS_NAME_LEN             16\n#define CONFIG_BOOT_DRIVE_LEN          3\n\ntypedef struct _PHYSICAL_DISK_RECORD\n{\n    ULONG DiskNumber;\n    ULONG BytesPerSector;\n    ULONG SectorsPerTrack;\n    ULONG TracksPerCylinder;\n    ULONGLONG Cylinders;\n    ULONG SCSIPortNumber;\n    ULONG SCSIPathId;\n    ULONG SCSITargetId;\n    ULONG SCSILun;\n    WCHAR Manufacturer[MAX_DEVICE_ID_LENGTH];\n\n    ULONG PartitionCount;\n    BOOLEAN WriteCacheEnabled;\n    WCHAR BootDriveLetter[CONFIG_BOOT_DRIVE_LEN];\n} PHYSICAL_DISK_RECORD, *PPHYSICAL_DISK_RECORD;\n\n//\n// Types of logical drive\n//\n#define CONFIG_DRIVE_PARTITION  0x00000001\n#define CONFIG_DRIVE_VOLUME     0x00000002\n#define CONFIG_DRIVE_EXTENT     0x00000004\n#define CONFIG_DRIVE_LETTER_LEN 4\n\ntypedef struct _LOGICAL_DISK_EXTENTS\n{\n    ULONGLONG StartingOffset;\n    ULONGLONG PartitionSize;\n    ULONG DiskNumber;           // The physical disk number where the logical drive resides\n    ULONG Size;                 // The size in bytes of the structure.\n    ULONG DriveType;            // Logical drive type partition/volume/extend-partition\n    WCHAR DriveLetterString[CONFIG_DRIVE_LETTER_LEN];\n    ULONG Pad;\n    ULONG PartitionNumber;      // The partition number where the logical drive resides\n    ULONG SectorsPerCluster;\n    ULONG BytesPerSector;\n    LONGLONG NumberOfFreeClusters;\n    LONGLONG TotalNumberOfClusters;\n    WCHAR FileSystemType[CONFIG_FS_NAME_LEN];\n    ULONG VolumeExt;            // Offset to VOLUME_DISK_EXTENTS structure\n} LOGICAL_DISK_EXTENTS, *PLOGICAL_DISK_EXTENTS;\n\ntypedef struct _OPTICAL_MEDIA_RECORD\n{\n    USHORT DiskNumber;\n    USHORT BusType;\n    USHORT DeviceType;\n    USHORT MediaType;\n    ULONGLONG StartingOffset;\n    ULONGLONG Size;\n    ULONGLONG NumberOfFreeBlocks;\n    ULONGLONG TotalNumberOfBlocks;\n    ULONGLONG NextWritableAddress;\n    ULONG NumberOfSessions;\n    ULONG NumberOfTracks;\n    ULONG BytesPerSector;\n    USHORT DiscStatus;\n    USHORT LastSessionStatus;\n    WCHAR Data[1];\n} OPTICAL_MEDIA_RECORD, *POPTICAL_MEDIA_RECORD;\n\n#define CONFIG_MAX_DNS_SERVER  4\n#define CONFIG_MAX_ADAPTER_ADDRESS_LENGTH 8\n\n//\n// Note: Data is an array of structures of type IP_ADDRESS_STRING defined in iptypes.h\n//\ntypedef struct _NIC_RECORD\n{\n    WCHAR NICName[MAX_DEVICE_ID_LENGTH];\n    ULONG Index;\n    ULONG PhysicalAddrLen;\n    WCHAR PhysicalAddr[CONFIG_MAX_ADAPTER_ADDRESS_LENGTH];\n    ULONG Size;         // Size of the Data\n    LONG IpAddress;     // IP Address offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG SubnetMask;    // subnet mask offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG DhcpServer;    // dhcp server offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG Gateway;       // gateway offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG PrimaryWinsServer; //  primary wins server offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG SecondaryWinsServer;// secondary wins server offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    LONG DnsServer[CONFIG_MAX_DNS_SERVER]; // dns server offset. Copy bytes = sizeof(IP_ADDRESS_STRING)\n    ULONG Data;                            // Offset to an array of IP_ADDRESS_STRING\n} NIC_RECORD, *PNIC_RECORD;\n\ntypedef struct _VIDEO_RECORD\n{\n    ULONG  MemorySize;\n    ULONG  XResolution;\n    ULONG  YResolution;\n    ULONG  BitsPerPixel;\n    ULONG  VRefresh;\n    WCHAR  ChipType[MAX_DEVICE_ID_LENGTH];\n    WCHAR  DACType[MAX_DEVICE_ID_LENGTH];\n    WCHAR  AdapterString[MAX_DEVICE_ID_LENGTH];\n    WCHAR  BiosString[MAX_DEVICE_ID_LENGTH];\n    WCHAR  DeviceId[MAX_DEVICE_ID_LENGTH];\n    ULONG  StateFlags;\n} VIDEO_RECORD, *PVIDEO_RECORD;\n\ntypedef struct _WMI_DPI_RECORD\n{\n    ULONG MachineDPI;\n    ULONG UserDPI;\n} WMI_DPI_RECORD, *PWMI_DPI_RECORD;\n\n//\n// Stores the ACPI Power Information\n//\ntypedef struct _WMI_POWER_RECORD\n{\n    BOOLEAN  SystemS1;\n    BOOLEAN  SystemS2;\n    BOOLEAN  SystemS3;\n    BOOLEAN  SystemS4;           // hibernate\n    BOOLEAN  SystemS5;           // off\n    BOOLEAN  AoAc;\n    CHAR     Pad2;\n    CHAR     Pad3;\n} WMI_POWER_RECORD, *PWMI_POWER_RECORD;\n\n//\n// Store the IRQ assigned to devices\n//\ntypedef struct _WMI_IRQ_RECORD\n{\n    // Bit 0 indicates CPU0, Bit 1 indicates CPU1, and so on\n    ULONG64 IRQAffinity;\n    USHORT  IRQGroup;\n    USHORT  Reserved;\n    ULONG   IRQNum;\n    ULONG   DeviceDescriptionLen;\n    WCHAR   DeviceDescription[1];\n} WMI_IRQ_RECORD, *PWMI_IRQ_RECORD;\n\ntypedef struct _WMI_PNP_RECORD_V3\n{\n    ULONG IDLength;\n    ULONG DescriptionLength;\n    ULONG FriendlyNameLength;\n    WCHAR Strings[1];         // DeviceID, Description, Friendly, each NULL-terminated\n} WMI_PNP_RECORD_V3, *PWMI_PNP_RECORD_V3;\n\ntypedef struct _WMI_PNP_RECORD_V4\n{\n    GUID ClassGuid;\n    ULONG UpperFilterCount;\n    ULONG LowerFilterCount;\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // DeviceID (unicode string)\n    // Description (unicode string)\n    // FriendlyName (unicode string)\n    // PdoName (unicode string)\n    // ServiceName (unicode string)\n    // UpperFilters (unicode string)\n    // LowerFilters (unicode string)\n} WMI_PNP_RECORD_V4, *PWMI_PNP_RECORD_V4;\n\ntypedef struct _WMI_PNP_RECORD_V5\n{\n    GUID ClassGuid;\n    ULONG UpperFilterCount;\n    ULONG LowerFilterCount;\n    ULONG DevStatus;\n    ULONG DevProblem;\n    WCHAR Strings[ANYSIZE_ARRAY];\n    // DeviceID (unicode string)\n    // Description (unicode string)\n    // FriendlyName (unicode string)\n    // PdoName (unicode string)\n    // ServiceName (unicode string)\n    // UpperFilters (unicode string)\n    // LowerFilters (unicode string)\n} WMI_PNP_RECORD_V5, *PWMI_PNP_RECORD_V5;\n\ntypedef WMI_PNP_RECORD_V5 WMI_PNP_RECORD, *PWMI_PNP_RECORD;\n\n//\n// Store the IDE Channel (Primary/Secondary) info\n//\ntypedef struct _WMI_IDE_CHANNEL_RECORD\n{\n    ULONG TargetId;\n    ULONG DeviceType;\n    ULONG DeviceTimingMode;\n    ULONG LocationInformationLen;\n    WCHAR LocationInformation[1];\n} WMI_IDE_CHANNEL_RECORD, *PWMI_IDE_CHANNEL_RECORD;\n\ntypedef struct _WMI_JOB_INFORMATION\n{\n    GUID JobId;\n    ULONG JobHandle;\n    ULONG Flags;\n    NTSTATUS Status;\n} WMI_JOB_INFORMATION, *PWMI_JOB_INFORMATION;\n\ntypedef struct _WMI_JOB_ASSIGN_PROCESS\n{\n    GUID JobId;\n    ULONG JobHandle;\n    ULONG UniqueProcessId;\n    NTSTATUS Status;\n} WMI_JOB_ASSIGN_PROCESS, *PWMI_JOB_ASSIGN_PROCESS;\n\ntypedef struct _WMI_JOB_REMOVE_PROCESS\n{\n    GUID JobId;\n    ULONG UniqueProcessId;\n    ULONG RemovalFlags;\n    NTSTATUS ExitStatus;\n} WMI_JOB_REMOVE_PROCESS, *PWMI_JOB_REMOVE_PROCESS;\n\ntypedef struct _WMI_JOB_SET_QUERY_CPU_RATE\n{\n    ULONG AllFlags;\n    ULONG Value;\n} WMI_JOB_SET_QUERY_CPU_RATE, *PWMI_JOB_SET_QUERY_CPU_RATE;\n\ntypedef struct _WMI_JOB_SET_QUERY_NET_RATE\n{\n    ULONG Flags;\n    ULONG64 MaxBandwidth;\n    UCHAR DscpTag;\n} WMI_JOB_SET_QUERY_NET_RATE, *PWMI_JOB_SET_QUERY_NET_RATE;\n\ntypedef struct _WMI_JOB_SET_QUERY_INFORMATION\n{\n    GUID JobId;\n    ULONG JobHandle;\n    ULONG JobObjectInformationClass;\n} WMI_JOB_SET_QUERY_INFORMATION, *PWMI_JOB_SET_QUERY_INFORMATION;\n\ntypedef struct _WMI_JOB_SEND_NOTIFICATION_INFORMATION\n{\n    GUID JobId;\n    ULONG NotificationId;\n} WMI_JOB_SEND_NOTIFICATION_INFORMATION, *PWMI_JOB_SEND_NOTIFICATION_INFORMATION;\n\n#define ETW_PROCESS_EVENT_FLAG_APPLICATION_ID    0x00000001\n#define ETW_PROCESS_EVENT_FLAG_WOW64             0x00000002\n#define ETW_PROCESS_EVENT_FLAG_PROTECTED         0x00000004\n#define ETW_PROCESS_EVENT_FLAG_PACKAGED          0x00000008\n\ntypedef struct _WMI_PROCESS_INFORMATION\n{\n    ULONG_PTR UniqueProcessKey;\n    ULONG ProcessId;\n    ULONG ParentId;\n    ULONG SessionId;\n    NTSTATUS ExitStatus;\n    ULONG_PTR DirectoryTableBase;\n    ULONG Flags;\n    ULONG Sid;\n    // Variable length sid\n    // FileName (ansi string)\n    // CommandLine (unicode string)\n    // PackageFullName (unicode string)\n    // PRAID (unicode string)\n} WMI_PROCESS_INFORMATION, *PWMI_PROCESS_INFORMATION;\n\ntypedef struct _WMI_PROCESS_INFORMATION64\n{\n    ULONG64 UniqueProcessKey64;\n    ULONG ProcessId;\n    ULONG ParentId;\n    ULONG SessionId;\n    NTSTATUS ExitStatus;\n    ULONG64 DirectoryTableBase;\n    ULONG Flags;\n    ULONG Sid;\n    // Variable length data\n} WMI_PROCESS_INFORMATION64, *PWMI_PROCESS_INFORMATION64;\n\ntypedef struct _WMI_THREAD_INFORMATION\n{\n    ULONG ProcessId;\n    ULONG ThreadId;\n} WMI_THREAD_INFORMATION, *PWMI_THREAD_INFORMATION;\n\ntypedef signed char SCHAR;\n\n#define ETW_THREAD_FLAG_REGISTRY_NOTIFICATION 0x00000001\n\ntypedef struct _WMI_EXTENDED_THREAD_INFORMATION\n{\n    ULONG ProcessId;\n    ULONG ThreadId;\n    PVOID StackBase;\n    PVOID StackLimit;\n    PVOID UserStackBase;\n    PVOID UserStackLimit;\n    union\n    {\n        PVOID StartAddress;\n        KAFFINITY Affinity;\n    } DUMMYUNIONNAME;\n    PVOID Win32StartAddress;\n    PVOID TebBase;\n    ULONG SubProcessTag;\n    SCHAR BasePriority;\n    UCHAR PagePriority;\n    UCHAR IoPriority;\n    UCHAR Flags;\n} WMI_EXTENDED_THREAD_INFORMATION, *PWMI_EXTENDED_THREAD_INFORMATION;\n\ntypedef struct _WMI_EXTENDED_THREAD_INFORMATION64\n{\n    ULONG ProcessId;\n    ULONG ThreadId;\n    ULONG64 StackBase64;\n    ULONG64 StackLimit64;\n    ULONG64 UserStackBase64;\n    ULONG64 UserStackLimit64;\n    union\n    {\n        ULONG64 StartAddress64;\n        ULONG64 Affinity;\n    } DUMMYUNIONNAME;\n    ULONG64 Win32StartAddress64;\n    ULONG64 TebBase64;\n    ULONG SubProcessTag;\n    SCHAR BasePriority;\n    UCHAR PagePriority;\n    UCHAR IoPriority;\n    UCHAR Flags;\n} WMI_EXTENDED_THREAD_INFORMATION64, *PWMI_EXTENDED_THREAD_INFORMATION64;\n\n//\n// SignatureLevel flags indicating if the image is embedded or catalog signed.\n//\n\n#define ETW_IMAGE_CATALOG_SIGNED   0x10\n#define ETW_IMAGE_EMBEDDED_SIGNED  0x20\n\ntypedef struct _WMI_IMAGELOAD_INFORMATION\n{\n    PVOID ImageBase;\n    SIZE_T ImageSize;\n    ULONG ProcessId;\n    ULONG ImageChecksum;\n    ULONG TimeDateStamp;\n    UCHAR SignatureLevel;\n    UCHAR SignatureType;\n    USHORT Reserved0;\n    PVOID DefaultBase;\n    ULONG Reserved1;\n    ULONG Reserved2;\n    ULONG Reserved3;\n    ULONG Reserved4;\n    WCHAR FileName[1];\n} WMI_IMAGELOAD_INFORMATION, *PWMI_IMAGELOAD_INFORMATION;\n\ntypedef struct _WMI_IMAGELOAD_INFORMATION32\n{\n    ULONG32 ImageBase32;\n    ULONG32 ImageSize32;\n    ULONG ProcessId;\n    ULONG ImageChecksum;\n    ULONG TimeDateStamp;\n    UCHAR SignatureLevel;\n    UCHAR SignatureType;\n    USHORT Reserved0;\n    ULONG32 DefaultBase32;\n    ULONG Reserved1;\n    ULONG Reserved2;\n    ULONG Reserved3;\n    ULONG Reserved4;\n    WCHAR FileName[1];\n} WMI_IMAGELOAD_INFORMATION32, *PWMI_IMAGELOAD_INFORMATION32;\n\ntypedef struct _WMI_IMAGELOAD_INFORMATION64\n{\n    ULONG64 ImageBase64;\n    ULONG64 ImageSize64;\n    ULONG ProcessId;\n    ULONG ImageChecksum;\n    ULONG TimeDateStamp;\n    UCHAR SignatureLevel;\n    UCHAR SignatureType;\n    USHORT Reserved0;\n    ULONG64 DefaultBase64;\n    ULONG Reserved1;\n    ULONG Reserved2;\n    ULONG Reserved3;\n    ULONG Reserved4;\n    WCHAR FileName[1];\n} WMI_IMAGELOAD_INFORMATION64, *PWMI_IMAGELOAD_INFORMATION64;\n\n#include <pshpack1.h>\ntypedef struct _WMI_IMAGEID_INFORMATION\n{\n    PVOID ImageBase;\n    SIZE_T ImageSize;\n    ULONG ProcessId;\n    ULONG TimeDateStamp;\n    WCHAR OriginalFileName[1];\n} WMI_IMAGEID_INFORMATION, *PWMI_IMAGEID_INFORMATION;\n\ntypedef struct _WMI_IMAGEID_INFORMATION32\n{\n    ULONG32 ImageBase32;\n    ULONG32 ImageSize32;\n    ULONG ProcessId;\n    ULONG TimeDateStamp;\n    WCHAR OriginalFileName[1];\n} WMI_IMAGEID_INFORMATION32, *PWMI_IMAGEID_INFORMATION32;\n\ntypedef struct _WMI_IMAGEID_INFORMATION64\n{\n    ULONG64 ImageBase64;\n    ULONG64 ImageSize64;\n    ULONG ProcessId;\n    ULONG TimeDateStamp;\n    WCHAR OriginalFileName[1];\n} WMI_IMAGEID_INFORMATION64, *PWMI_IMAGEID_INFORMATION64;\n#include <poppack.h>\n\n#define ETW_IO_FLAG_BACKUP              0x00000001\n#define ETW_IO_FLAG_PREFETCH            0x00000002\n#define ETW_IO_FLAG_WRITE_AGGREGATION   0x00000004\n\ntypedef struct _ETW_DISKIO_READWRITE_V2\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONG Size;\n    ULONG ResponseTime;\n    ULONGLONG ByteOffset;\n    PVOID FileObject;\n    PVOID IrpAddress;\n    ULONGLONG HighResResponseTime;\n} ETW_DISKIO_READWRITE_V2, *PETW_DISKIO_READWRITE_V2;\n\ntypedef struct _ETW_DISKIO_READWRITE_V3\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONG Size;\n    ULONG ResponseTime;\n    ULONGLONG ByteOffset;\n    PVOID FileObject;\n    PVOID IrpAddress;\n    ULONGLONG HighResResponseTime;\n    ULONG IssuingThreadId; // since WIN8\n} ETW_DISKIO_READWRITE_V3, *PETW_DISKIO_READWRITE_V3;\n\ntypedef struct _ETW_DISKIO_FLUSH_BUFFERS_V2\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONGLONG HighResResponseTime;\n    PVOID IrpAddress;\n} ETW_DISKIO_FLUSH_BUFFERS_V2, *PETW_DISKIO_FLUSH_BUFFERS_V2;\n\ntypedef struct _ETW_DISKIO_FLUSH_BUFFERS_V3\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONGLONG HighResResponseTime;\n    PVOID IrpAddress;\n    ULONG IssuingThreadId;\n} ETW_DISKIO_FLUSH_BUFFERS_V3, *PETW_DISKIO_FLUSH_BUFFERS_V3;\n\ntypedef struct _ETW_DISKIO_READWRITE_V3 WMI_DISKIO_READWRITE, *PWMI_DISKIO_READWRITE;\ntypedef struct _ETW_DISKIO_FLUSH_BUFFERS_V3 WMI_DISKIO_FLUSH_BUFFERS, *PWMI_DISKIO_FLUSH_BUFFERS;\n\ntypedef struct _WMI_DISKIO_READWRITE_INIT\n{\n    PVOID Irp;\n    ULONG IssuingThreadId;\n} WMI_DISKIO_READWRITE_INIT, *PWMI_DISKIO_READWRITE_INIT;\n\ntypedef struct _WMI_DISKIO_IO_REDIRECTED_INIT\n{\n    PVOID Irp;\n    PVOID FileKey;\n} WMI_DISKIO_IO_REDIRECTED_INIT, *PWMI_DISKIO_IO_REDIRECTED_INIT;\n\ntypedef struct _ETW_OPTICALIO_READWRITE\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONG Size;\n    ULONG Reserved;\n    ULONGLONG ByteOffset;\n    PVOID FileObject;\n    PVOID IrpAddress;\n    ULONGLONG HighResResponseTime;\n    ULONG IssuingThreadId;\n} ETW_OPTICALIO_READWRITE, *PETW_OPTICALIO_READWRITE;\n\ntypedef struct _ETW_OPTICALIO_FLUSH_BUFFERS\n{\n    ULONG DiskNumber;\n    ULONG IrpFlags;\n    ULONGLONG HighResResponseTime;\n    PVOID IrpAddress;\n    ULONG IssuingThreadId;\n} ETW_OPTICALIO_FLUSH_BUFFERS, *PETW_OPTICALIO_FLUSH_BUFFERS;\n\ntypedef struct _ETW_OPTICALIO_INIT\n{\n    PVOID Irp;\n    ULONG IssuingThreadId;\n} ETW_OPTICALIO_INIT, *PETW_OPTICALIO_INIT;\n\ntypedef struct _WMI_REGISTRY\n{\n    LONGLONG InitialTime;\n    ULONG Status;\n    union\n    {\n        ULONG Index;\n        ULONG InfoClass;\n    } DUMMYUNIONNAME;\n    PVOID Kcb;\n    WCHAR Name[1];\n} WMI_REGISTRY, *PWMI_REGISTRY;\n\ntypedef struct _WMI_TXR\n{\n    LONGLONG InitialTime;\n    GUID TxRGUID;\n    ULONG Status;\n    ULONG UowCount;\n    WCHAR Hive[1];\n} WMI_TXR, *PWMI_TXR;\n\ntypedef struct _ETW_REGNOTIF_REGISTER\n{\n    PVOID Notification;\n    PVOID Kcb;\n    UCHAR Type;\n    BOOLEAN WatchTree;\n    BOOLEAN Primary;\n} ETW_REGNOTIF_REGISTER, *PETW_REGNOTIF_REGISTER;\n\ntypedef struct _WMI_FILE_IO\n{\n    PVOID FileObject;\n    WCHAR FileName[1];\n} WMI_FILE_IO, *PWMI_FILE_IO;\n\ntypedef struct _WMI_FILE_IO_WOW64\n{\n    ULONGLONG FileObject;\n    WCHAR FileName[1];\n} WMI_FILE_IO_WOW64, *PWMI_FILE_IO_WOW64;\n\ntypedef struct _WMI_TCPIP_V4\n{\n    ULONG ProcessId;\n    ULONG TransferSize;\n    UCHAR DestinationAddress[4];\n    UCHAR SourceAddress[4];\n    USHORT DestinationPort;\n    USHORT SourcePort;\n} WMI_TCPIP_V4, *PWMI_TCPIP_V4;\n\ntypedef struct _WMI_TCPIP_V6\n{\n    ULONG ProcessId;\n    ULONG TransferSize;\n    UCHAR DestinationAddress[16];\n    UCHAR SourceAddress[16];\n    USHORT DestinationPort;\n    USHORT SourcePort;\n} WMI_TCPIP_V6, *PWMI_TCPIP_V6;\n\ntypedef struct _WMI_UDP_V4\n{\n    ULONG ProcessId;\n    USHORT TransferSize;\n    UCHAR DestinationAddress[4];\n    UCHAR SourceAddress[4];\n    USHORT DestinationPort;\n    USHORT SourcePort;\n} WMI_UDP_V4, *PWMI_UDP_V4;\n\ntypedef struct _WMI_UDP_V6\n{\n    ULONG ProcessId;\n    USHORT TransferSize;\n    UCHAR DestinationAddress[16];\n    UCHAR SourceAddress[16];\n    USHORT DestinationPort;\n    USHORT SourcePort;\n} WMI_UDP_V6, *PWMI_UDP_V6;\n\ntypedef struct _WMI_PAGE_FAULT\n{\n    PVOID VirtualAddress;\n    PVOID ProgramCounter;\n} WMI_PAGE_FAULT, *PWMI_PAGE_FAULT;\n\ntypedef struct _WMI_CONTEXTSWAP\n{\n    ULONG NewThreadId;\n    ULONG OldThreadId;\n\n    CHAR NewThreadPriority;\n    CHAR OldThreadPriority;\n    union\n    {\n        UCHAR PreviousCState;\n        UCHAR OldThreadRank;\n    } DUMMYUNIONNAME;\n    union\n    {\n        CHAR NewThreadPriorityDecrement;\n        CHAR SpareByte;\n    } DUMMYUNIONNAME2;\n    UCHAR OldThreadWaitReason;\n    CHAR OldThreadWaitMode;\n    UCHAR OldThreadState;\n    UCHAR OldThreadIdealProcessor;\n\n    ULONG NewThreadWaitTime;\n    LONG OldThreadRemainingQuantum;\n} WMI_CONTEXTSWAP, *PWMI_CONTEXTSWAP;\n\n#define WMI_SPINLOCK_EVENT_EXECUTE_DPC_BIT         6\n#define WMI_SPINLOCK_EVENT_EXECUTE_ISR_BIT         7\n#define WMI_SPINLOCK_ACQUIRE_MODE_MASK 0x3F\n\n#include <pshpack1.h>\ntypedef struct _WMI_SPINLOCK\n{\n    PVOID SpinLockAddress;\n    PVOID CallerAddress;\n    ULONG64 AcquireTime;\n    ULONG64 ReleaseTime;\n    ULONG WaitTimeInCycles;\n    ULONG SpinCount;\n    ULONG ThreadId;\n    ULONG InterruptCount;\n    UCHAR Irql;\n    UCHAR AcquireDepth;\n\n    union\n    {\n        struct\n        {\n            UCHAR AcquireMode : 6;\n            UCHAR ExecuteDpc : 1;\n            UCHAR ExecuteIsr : 1;\n        };\n\n        UCHAR Flags;\n    };\n\n    UCHAR Reserved[5];\n} WMI_SPINLOCK, *PWMI_SPINLOCK;\n#include <poppack.h>\n\n//\n// Logging every action on every instance of ERESOURCE is almost impossible.\n// Especially for highly contented or highly frequently used instances.\n//\n// Thus logging an event is done on complete release operations\n// or on excessive waits with filtering as follows:\n//\n//  1) For contention cases where the releasing thread either:\n//      1.a) Has a wait time, e.g. it was blocked before the acquire.\n//      1.b) Caused one or more other acquire attempts to be blocked.\n//      In such a case every N-th sample is logged.\n\n//  2) For a complete release (with or without contention).\n//     In this case every N-th sample is logged.\n//\n//  3) Excessive waits.\n//\n// Exact mapping and publishing WMI_RESOURCE_ACTIONs as values used\n// internally in ..\\minkernel\\ntos\\inc\\etw.h.\n//\n\n#define WMI_RESOURCE_ACTION_COMPLETE_RELEASE_EXCLUSIVE      0x00010022\n#define WMI_RESOURCE_ACTION_COMPLETE_RELEASE_SHARED         0x00010042\n#define WMI_RESOURCE_ACTION_WAIT_EXCESSIVE_FOR_EXCLUSIVE    0x00010224\n#define WMI_RESOURCE_ACTION_WAIT_EXCESSIVE_FOR_SHARED       0x00010244\n\ntypedef struct _WMI_RESOURCE\n{\n    ULONG64 AcquireTime;\n    ULONG64 HoldTime;\n    ULONG64 WaitTime;\n    ULONG MaxRecursionDepth;\n    ULONG ThreadId;\n    PVOID Resource;\n    ULONG Action;\n    ULONG ContentionDelta;\n} WMI_RESOURCE, *PWMI_RESOURCE;\n\n//\n// Only log wait-events for KQUEUE and PUSHLOCK objects. Full tracing generates\n// way too much data and also significantly affects performance.\n//\n// Also note that full tracing for PUSHLOCK objects is impossible as some routines\n// are defined inline in ex.h and are already compiled into drivers.\n//\n\n#define WMI_QUEUE_ACTION_WAIT_FOR_ITEM          1\n\ntypedef struct _WMI_QUEUE {\n    PVOID Queue;\n    ULONG ThreadId;\n    UCHAR Action;\n} WMI_QUEUE, *PWMI_QUEUE;\n\n#define WMI_PUSHLOCK_ACTION_WAIT_FOR_EXCLUSIVE  1\n#define WMI_PUSHLOCK_ACTION_WAIT_FOR_SHARED     2\n\ntypedef struct _WMI_PUSHLOCK\n{\n    PVOID PushLock;\n    ULONG ThreadId;\n    UCHAR Action;\n} WMI_PUSHLOCK, *PWMI_PUSHLOCK;\n\ntypedef struct _WMI_WAIT_SINGLE\n{\n    ULONG ThreadId;\n    PVOID Object;\n    UCHAR ObjectType;\n} WMI_WAIT_SINGLE, *PWMI_WAIT_SINGLE;\n\ntypedef struct _WMI_WAIT_OBJECT_RECORD\n{\n    PVOID Object;\n    UCHAR ObjectType;\n} WMI_WAIT_OBJECT_RECORD, *PWMI_WAIT_OBJECT_RECORD;\n\n#define WMI_WAIT_MULTIPLE_MAX_OBJECTS       64\n\n#define WMI_WAIT_MULTIPLE_WAIT_ANY          1\n#define WMI_WAIT_MULTIPLE_WAIT_ALL          2\n\ntypedef struct _WMI_WAIT_MULTIPLE\n{\n    ULONG ThreadId;\n    UCHAR WaitType;\n    UCHAR ObjectCount;\n    WMI_WAIT_OBJECT_RECORD ObjectRecord[WMI_WAIT_MULTIPLE_MAX_OBJECTS];\n} WMI_WAIT_MULTIPLE, *PWMI_WAIT_MULTIPLE;\n\n#define WMI_WAIT_MULTIPLE_HEADER_SIZE (sizeof(PVOID) + sizeof(UCHAR))\n\ntypedef struct _WMI_DELAY_EXECUTION\n{\n    ULONG     ThreadId;\n    ULONGLONG Delta;\n} WMI_DELAY_EXECUTION, *PWMI_DELAY_EXECUTION;\n\n//\n// Scheduler events.\n//\ntypedef struct _ETW_READY_THREAD_EVENT\n{\n    ULONG ThreadId;\n    UCHAR AdjustReason;\n    SCHAR AdjustIncrement;\n    union\n    {\n        struct\n        {\n            UCHAR ExecutingDpc : 1;\n            UCHAR KernelStackNotResident : 1;\n            UCHAR ProcessOutOfMemory : 1;\n            UCHAR DirectSwitchAttempt : 1;\n            UCHAR Reserved : 4;\n        } DUMMYSTRUCTNAME;\n        UCHAR Flags;\n    } DUMMYUNIONNAME;\n    UCHAR SpareByte;\n} ETW_READY_THREAD_EVENT, *PETW_READY_THREAD_EVENT;\n\n//\n// Kernel Queue events.\n//\ntypedef struct _ETW_KQUEUE_ENQUEUE_EVENT\n{\n    PVOID Entry;\n    ULONG ThreadId;\n} ETW_KQUEUE_ENQUEUE_EVENT, *PETW_KQUEUE_ENQUEUE_EVENT;\n\ntypedef struct _ETW_KQUEUE_DEQUEUE_EVENT\n{\n    ULONG ThreadId;\n    ULONG EntryCount;\n    PVOID Entries[ANYSIZE_ARRAY];\n} ETW_KQUEUE_DEQUEUE_EVENT, *PETW_KQUEUE_DEQUEUE_EVENT;\n\n//\n// Anti-starvation boost by BalanceSetmanager event.\n//\n\ntypedef struct _ETW_ANTI_STARVATION_BOOST_EVENT\n{\n    ULONG ThreadId;\n    USHORT ProcessorIndex;\n    SCHAR OldPriority;\n    UCHAR SpareByte;\n} ETW_ANTI_STARVATION_BOOST_EVENT, *PETW_ANTI_STARVATION_BOOST_EVENT;\n\n//\n// AutoBoost priority-inversion avoidance events.\n//\ntypedef struct _ETW_AUTOBOOST_SET_PRIORITY_FLOOR_EVENT\n{\n    PVOID Lock;\n    ULONG ThreadId;\n    SCHAR NewCpuPriorityFloor;\n    SCHAR OldCpuPriority;\n    union\n    {\n        struct\n        {\n            SCHAR NewIoPriorityFloor : 4;\n            SCHAR OldIoPriority : 4;\n        };\n        SCHAR IoPriorities;\n    };\n\n    union\n    {\n        struct\n        {\n            UCHAR ExecutingDpc : 1;\n            UCHAR WakeupBoost : 1;\n            UCHAR BoostedOutstandingIrps : 1;\n            UCHAR Reserved : 5;\n        };\n        UCHAR Flags;\n    };\n} ETW_AUTOBOOST_SET_PRIORITY_FLOOR_EVENT, *PETW_AUTOBOOST_SET_PRIORITY_FLOOR_EVENT;\n\ntypedef struct _ETW_AUTOBOOST_CLEAR_PRIORITY_FLOOR_EVENT\n{\n    PVOID Lock;\n    ULONG ThreadId;\n    union\n    {\n        //\n        // The order of bits in this field must be the same as the bitmap field\n        // in KLOCK_ENTRY.\n        //\n        struct\n        {\n            USHORT IoBoost : 1;\n            USHORT CpuBoostsBitmap : 15;\n        };\n        USHORT BoostBitmap;\n    };\n    USHORT Reserved;\n} ETW_AUTOBOOST_CLEAR_PRIORITY_FLOOR_EVENT, *PETW_AUTOBOOST_CLEAR_PRIORITY_FLOOR_EVENT;\n\ntypedef struct _ETW_AUTOBOOST_NO_ENTRIES_EVENT\n{\n    PVOID Lock;\n    ULONG ThreadId;\n} ETW_AUTOBOOST_NO_ENTRIES_EVENT, *PETW_AUTOBOOST_NO_ENTRIES_EVENT;\n\n//\n// Priority and affinity change events.\n//\ntypedef struct _ETW_PRIORITY_EVENT\n{\n    ULONG ThreadId;\n    SCHAR OldPriority;\n    SCHAR NewPriority;\n    SCHAR DynamicPriority; // SetBasePriority events only\n    SCHAR Reserved;\n} ETW_PRIORITY_EVENT, *PETW_PRIORITY_EVENT;\n\ntypedef struct _ETW_THREAD_AFFINITY_EVENT\n{\n    KAFFINITY Mask;\n    ULONG ThreadId;\n    USHORT Group;\n    USHORT Reserved;\n} ETW_THREAD_AFFINITY_EVENT, *PETW_THREAD_AFFINITY_EVENT;\n\ntypedef struct _ETW_DEBUG_PRINT_EVENT\n{\n    ULONG Component;\n    ULONG Level;\n    CHAR Message[1];\n} ETW_DEBUG_PRINT_EVENT, *PETW_DEBUG_PRINT_EVENT;\n\n//\n// Note that BIGPOOL mask is carefully chosen to avoid conflict, and\n// this is only for instrumentation. So, there is possibility that\n// mask is used by pool component at future.\n//\n\n#define ETW_POOLTRACE_BIGPOOL_MASK  0x10000000\n\ntypedef struct _ETW_POOL_EVENT\n{\n    ULONG PoolType;\n    ULONG Tag;\n    SIZE_T NumberOfBytes;\n    PVOID Entry;\n} ETW_POOL_EVENT, *PETW_POOL_EVENT;\n\n//\n// Object Manager events\n//\n\n#define ETW_KERNEL_HANDLE_MASK 0x80000000\n\ntypedef struct _ETW_CREATE_HANDLE_EVENT\n{\n    PVOID Object;\n    ULONG Handle;\n    USHORT ObjectType;\n} ETW_CREATE_HANDLE_EVENT, *PETW_CREATE_HANDLE_EVENT;\n\ntypedef ETW_CREATE_HANDLE_EVENT ETW_CLOSE_HANDLE_EVENT, *PETW_CLOSE_HANDLE_EVENT;\n\n#include <pshpack1.h>\ntypedef struct _ETW_DUPLICATE_HANDLE_EVENT\n{\n    PVOID Object;\n    ULONG SourceHandle;\n    ULONG TargetHandle;\n    ULONG TargetProcessId;\n    USHORT ObjectType;\n    ULONG SourceProcessId;\n} ETW_DUPLICATE_HANDLE_EVENT, *PETW_DUPLICATE_HANDLE_EVENT;\n#include <poppack.h>\n\ntypedef struct _ETW_OBJECT_TYPE_EVENT\n{\n    USHORT ObjectType;\n    USHORT Reserved;\n    WCHAR Name[ANYSIZE_ARRAY];\n} ETW_OBJECT_TYPE_EVENT, *PETW_OBJECT_TYPE_EVENT;\n\ntypedef struct _ETW_OBJECT_HANDLE_EVENT\n{\n    PVOID Object;\n    ULONG ProcessId;\n    ULONG Handle;\n    USHORT ObjectType;\n} ETW_OBJECT_HANDLE_EVENT, *PETW_OBJECT_HANDLE_EVENT;\n\ntypedef struct _ETW_REFDEREF_OBJECT_EVENT\n{\n    PVOID Object;\n    ULONG Tag;\n    ULONG Count;\n} ETW_REFDEREF_OBJECT_EVENT, *PETW_REFDEREF_OBJECT_EVENT;\n\ntypedef struct _ETW_CREATEDELETE_OBJECT_EVENT\n{\n    PVOID Object;\n    USHORT ObjectType;\n} ETW_CREATEDELETE_OBJECT_EVENT, *PETW_CREATEDELETE_OBJECT_EVENT;\n\n//\n// Wake Counter events\n//\ntypedef struct _ETW_WAKE_COUNTER_EVENT\n{\n    PVOID Object;\n    ULONG_PTR Tag;\n    ULONG ProcessId;\n    LONG Count;\n} ETW_WAKE_COUNTER_EVENT, *PETW_WAKE_COUNTER_EVENT;\n\n//\n// Heap events\n//\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_COMMON\n{\n    SYSTEM_TRACE_HEADER Header;    // Header\n    PVOID Handle;                  // Handle of Heap\n} ETW_HEAP_EVENT_COMMON, *PETW_HEAP_EVENT_COMMON;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_ALLOC\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    SIZE_T Size;                    // Size of allocation in bytes\n    PVOID Address;                  // Address of Allocation\n    ULONG Source;                   // Type ie Lookaside, Lowfrag or main path\n\n} ETW_HEAP_EVENT_ALLOC, *PETW_HEAP_EVENT_ALLOC;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_FREE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    PVOID Address;                  // Address to free\n    ULONG Source;                   // Type ie Lookaside, Lowfrag or main path\n\n} ETW_HEAP_EVENT_FREE, *PETW_HEAP_EVENT_FREE;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_REALLOC\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    PVOID NewAddress;               // New Address returned to user\n    PVOID OldAddress;               // Old Address got from user\n    SIZE_T NewSize;                 // New Size in bytes\n    SIZE_T OldSize;                 // Old Size in bytes\n    ULONG Source;                   // Type ie Lookaside, Lowfrag or main path\n} ETW_HEAP_EVENT_REALLOC, *PETW_HEAP_EVENT_REALLOC;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_EXPANSION\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    SIZE_T CommittedSize;           // Memory Size in bytes actually committed\n    PVOID Address;                  // Address of free block or segment\n    SIZE_T FreeSpace;               // Total free Space in Heap\n    SIZE_T CommittedSpace;          // Memory Committed\n    SIZE_T ReservedSpace;           // Memory reserved\n    ULONG NoOfUCRs;                 // Number of uncommitted ranges\n    SIZE_T AllocatedSpace;          // Memory allocated\n} ETW_HEAP_EVENT_EXPANSION, *PETW_HEAP_EVENT_EXPANSION;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_CONTRACTION\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    SIZE_T DeCommitSize;            // The size of DeCommitted Block\n    PVOID DeCommitAddress;          // Address of the Decommitted block\n    SIZE_T FreeSpace;               // Total free Space in Heap in bytes\n    SIZE_T CommittedSpace;          // Memory Committed in bytes\n    SIZE_T ReservedSpace;           // Memory reserved in bytes\n    ULONG NoOfUCRs;                 // Number of UnCommitted Ranges\n    SIZE_T AllocatedSpace;          // Memory allocated\n\n} ETW_HEAP_EVENT_CONTRACTION, *PETW_HEAP_EVENT_CONTRACTION;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_CREATE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    ULONG Flags;                    // Flags passed while creating heap.\n    SIZE_T ReserveSize;\n    SIZE_T CommitSize;\n    SIZE_T AllocatedSize;\n} ETW_HEAP_EVENT_CREATE, *PETW_HEAP_EVENT_CREATE;\n#include <poppack.h>\n\n#define HEAP_LOG_CREATE_HEAP 1\n#define HEAP_LOG_FIND_AND_COMMIT_PAGES 2\n#define HEAP_LOG_INITIALIZE_SEGMENT 3\n#define HEAP_LOG_EXTEND_HEAP 4\n#define HEAP_LOG_DECOMMIT_FREE_BLOCK 5\n#define HEAP_LOG_DECOMMIT_FREE_BLOCK2 6\n#define HEAP_LOG_DECOMMIT_BLOCK 7\n#define HEAP_LOG_COMMIT_BLOCK 8\n#define HEAP_LOG_ALLOCATE_HEAP 9\n#define HEAP_LOG_COMMIT_AND_INITIALIZE_PAGES 10\n#define HEAP_LOG_ALLOCATE_SEGMENT_HEAP 11\n#define HEAP_LOG_ALLOCATE_NEW_SEGMENT 12\n#define HEAP_LOG_DECOMMIT_PAGE_RANGE 13\n\ntypedef struct _HEAP_EVENT_COMMIT_DECOMMIT\n{\n    PVOID  HeapHandle;\n    PVOID  Block;\n    SIZE_T Size;\n    ULONG  Caller;\n} HEAP_EVENT_COMMIT_DECOMMIT, *PHEAP_EVENT_COMMIT_DECOMMIT;\n\ntypedef struct _HEAP_COMMIT_DECOMMIT\n{\n    SYSTEM_TRACE_HEADER Header;\n    HEAP_EVENT_COMMIT_DECOMMIT Event;\n} HEAP_COMMIT_DECOMMIT, *PHEAP_COMMIT_DECOMMIT;\n\ntypedef struct _HEAP_EVENT_SUBSEGMENT_ALLOC_FREE\n{\n    PVOID HeapHandle;\n    PVOID  SubSegment;\n    SIZE_T SubSegmentSize;\n    SIZE_T BlockSize;\n} HEAP_EVENT_SUBSEGMENT_ALLOC_FREE, *PHEAP_EVENT_SUBSEGMENT_ALLOC_FREE;\n\ntypedef struct _HEAP_SUBSEGMENT_FREE\n{\n    SYSTEM_TRACE_HEADER Header;\n    HEAP_EVENT_SUBSEGMENT_ALLOC_FREE Event;\n} HEAP_SUBSEGMENT_FREE, *PHEAP_SUBSEGMENT_FREE;\n\ntypedef struct _HEAP_SUBSEGMENT_ALLOC\n{\n    SYSTEM_TRACE_HEADER Header;\n    HEAP_EVENT_SUBSEGMENT_ALLOC_FREE Event;\n} HEAP_SUBSEGMENT_ALLOC, *PHEAP_SUBSEGMENT_ALLOC;\n\n#include <pshpack1.h>\ntypedef struct _HEAP_SUBSEGMENT_INIT\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n    PVOID SubSegment;\n    SIZE_T BlockSize;\n    SIZE_T BlockCount;\n    ULONG AffinityIndex;\n} HEAP_SUBSEGMENT_INIT, *PHEAP_SUBSEGMENT_INIT;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _HEAP_AFFINITY_MANAGER_ENABLE\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n    ULONG BucketIndex;\n} HEAP_AFFINITY_MANAGER_ENABLE, *PHEAP_AFFINITY_MANAGER_ENABLE;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _HEAP_AFFINITY_SLOT_ASSIGN\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n    PVOID SubSegment;\n    ULONG SlotIndex;\n} HEAP_AFFINITY_SLOT_ASSIGN, *PHEAP_AFFINITY_SLOT_ASSIGN;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _HEAP_REUSE_THRESHOLD_ACTIVATED\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n    PVOID SubSegment;\n    ULONG BucketIndex;\n} HEAP_REUSE_THRESHOLD_ACTIVATED, *PHEAP_REUSE_THRESHOLD_ACTIVATED;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _HEAP_SUBSEGMENT_ACTIVATED\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n    PVOID SubSegment;\n} HEAP_SUBSEGMENT_ACTIVATED, *PHEAP_SUBSEGMENT_ACTIVATED;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_SNAPSHOT\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;               // Handle of Heap\n    SIZE_T FreeSpace;               // Total free Space in Heap in bytes\n    SIZE_T CommittedSpace;          // Memory Committed in bytes\n    SIZE_T ReservedSpace;           // Memory reserved in bytes\n    ULONG Flags;                    // Flags passed while creating heap.\n    ULONG ProcessId;\n    SIZE_T LargeUCRSpace;\n    ULONG FreeListLength;\n    ULONG UCRLength;\n    SIZE_T AllocatedSpace;          // Total allocated space in heap, in bytes\n} ETW_HEAP_EVENT_SNAPSHOT, *PETW_HEAP_EVENT_SNAPSHOT;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_RUNDOWN_RANGE\n{\n    PVOID Address;\n    SIZE_T Size;\n} ETW_HEAP_EVENT_RUNDOWN_RANGE, *PETW_HEAP_EVENT_RUNDOWN_RANGE;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _ETW_HEAP_EVENT_RUNDOWN\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID HeapHandle;\n    ULONG Flags;\n    ULONG ProcessId;\n    ULONG RangeCount;\n    ULONG Reserved;   // for padding\n    ETW_HEAP_EVENT_RUNDOWN_RANGE Ranges[1];\n} ETW_HEAP_EVENT_RUNDOWN, *PETW_HEAP_EVENT_RUNDOWN;\n#include <poppack.h>\n\ntypedef struct _HEAP_EVENT_RANGE_CREATE\n{\n    PVOID HeapHandle;\n    SIZE_T FirstRangeSize;\n    ULONG Flags;\n} HEAP_EVENT_RANGE_CREATE, *PHEAP_EVENT_RANGE_CREATE;\n\ntypedef struct _HEAP_EVENT_RANGE\n{\n    PVOID HeapHandle;\n    PVOID Address;\n    SIZE_T Size;\n} HEAP_EVENT_RANGE, *PHEAP_EVENT_RANGE;\n\ntypedef struct _HEAP_RANGE_CREATE\n{\n    SYSTEM_TRACE_HEADER Header;\n    HEAP_EVENT_RANGE_CREATE Event;\n} HEAP_RANGE_CREATE, *PHEAP_RANGE_CREATE;\n\ntypedef struct _HEAP_RANGE_DESTROY\n{\n    SYSTEM_TRACE_HEADER Header;\n    PVOID HeapHandle;\n} HEAP_RANGE_DESTROY, *PHEAP_RANGE_DESTROY;\n\ntypedef struct _HEAP_RANGE_LOG\n{\n    SYSTEM_TRACE_HEADER Header;\n    HEAP_EVENT_RANGE Range;\n} HEAP_RANGE_LOG, *PHEAP_RANGE_LOG;\n\ntypedef struct _ETW_CRITSEC_EVENT_COLLISION\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    ULONG       LockCount;          // Lock Count\n    ULONG       SpinCount;          // Spin Count\n    PVOID       OwningThread;       // Thread having Lock\n    PVOID       Address;            // Address of Critical Section\n} ETW_CRITSEC_EVENT_COLLISION, *PETW_CRITSEC_EVENT_COLLISION;\n\ntypedef struct _ETW_CRITSEC_EVENT_INIT\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID       SpinCount;          // Spin Count\n    PVOID       Address;            // Address of Critical Section\n} ETW_CRITSEC_EVENT_INIT, *PETW_CRITSEC_EVENT_INIT;\n\ntypedef struct _STACK_WALK_EVENT_DATA\n{\n    ULONGLONG   TimeStamp;\n    ULONG       ProcessId;\n    ULONG       ThreadId;\n    PVOID       Addresses[1];          //Address of captured Stack address\n} STACK_WALK_EVENT_DATA, *PSTACK_WALK_EVENT_DATA;\n\ntypedef struct _LOAD_DLL_EVENT_DATA\n{\n    WCHAR ImageName[1];\n} LOAD_DLL_EVENT_DATA, *PLOAD_DLL_EVENT_DATA;\n\ntypedef struct _CM_PERF_COUNTERS\n{\n    ULONGLONG       OpenedKeys;                 // number of kcbs in the system\n    ULONGLONG       DelayCloseKCBs;             // number of kcbs in delay close\n    ULONGLONG       PrivateAllocPages;          // number of pages used by the private allocator for kcbs\n    ULONGLONG       PrivateAllocFree;           // number of fixed size allocations which are currently free\n    ULONGLONG       PrivateAllocUsed;           // number of fixed size allocations which are currently in use\n    ULONGLONG       LookupCacheHit;             // cache hit\n    ULONGLONG       LookupCacheMissFound;       // cache miss but key was opened from the hive\n    ULONGLONG       LookupCacheMissNotFound;    // cache miss; key does not exist\n    ULONGLONG       ViewMap;                    // number of times we mapped a view\n    ULONGLONG       ViewUnMap;                  // number of times we mapped a view\n    ULONGLONG       HiveShrink;                 // number of times we have shrunk a hive\n} CM_PERF_COUNTERS, *PCM_PERF_COUNTERS;\n\n//\n// The class scheduler events\n//\ntypedef struct _CI_LOG_SCHEDULER_EVENT\n{\n    EVENT_TRACE_HEADER Header;     // Header\n    ULONG ProcessId;               // Process id of the the thread being scheduled\n    ULONG ThreadId;                // Thread id of the thread being scheduled\n    ULONG Priority;                // Scheduling priority\n    ULONG TaskIndex;               // Task index the thread being scheduled linked to.\n} CI_LOG_SCHEDULER_EVENT, *PCI_LOG_SCHEDULER_EVENT;\n\ntypedef struct _CI_LOG_SCHEDULER_WAKEUP\n{\n    EVENT_TRACE_HEADER Header; // Header\n    ULONG Reason;\n} CI_LOG_SCHEDULER_WAKEUP, *PCI_LOG_SCHEDULER_WAKEUP;\n\ntypedef struct _CI_LOG_SCHEDULER_SLEEP\n{\n    EVENT_TRACE_HEADER Header; // Header\n} CI_LOG_SCHEDULER_SLEEP, *PCI_LOG_SCHEDULER_SLEEP;\n\ntypedef struct _CI_LOG_SCHEDULER_SLEEP_RESPONSE\n{\n    EVENT_TRACE_HEADER Header; // Header\n} CI_LOG_SCHEDULER_SLEEP_RESPONSE, *PCI_LOG_SCHEDULER_SLEEP_RESPONSE;\n\ntypedef struct _CI_LOG_MMCSS_START\n{\n    EVENT_TRACE_HEADER Header; // Header\n} CI_LOG_MMCSS_START, *PCI_LOG_MMCSS_START;\n\ntypedef struct _CI_LOG_MMCSS_STOP\n{\n    EVENT_TRACE_HEADER Header; // Header\n} CI_LOG_MMCSS_STOP, *PCI_LOG_MMCSS_STOP;\n\n//\n// UMS events.\n//\n#define UMS_ETW_DIRECTED_SWITCH_START_VOLATILE (0x1)\n\ntypedef struct _ETW_UMS_EVENT_DIRECTED_SWITCH_START\n{\n    ULONG ProcessId;\n    ULONG ScheduledThreadId;\n    ULONG PrimaryThreadId;\n    ULONG SwitchFlags;\n} ETW_UMS_EVENT_DIRECTED_SWITCH_START, *PETW_UMS_EVENT_DIRECTED_SWITCH_START;\n\n#define UMS_ETW_DIRECTED_SWITCH_END_FAST (0x1)\n\ntypedef struct _ETW_UMS_EVENT_DIRECTED_SWITCH_END\n{\n    ULONG ProcessId;\n    ULONG ScheduledThreadId;\n    ULONG PrimaryThreadId;\n    ULONG SwitchFlags;\n} ETW_UMS_EVENT_DIRECTED_SWITCH_END, *PETW_UMS_EVENT_DIRECTED_SWITCH_END;\n\n#define UMS_ETW_PARK_VOLATILE (0x1)\n#define UMS_ETW_PARK_PRIMARY_PRESENT (0x2)\n#define UMS_ETW_PARK_PRIMARY_DELIVERED_CONTEXT (0x4)\n\ntypedef struct _ETW_UMS_EVENT_PARK\n{\n    ULONG ProcessId;\n    ULONG ScheduledThreadId;\n    ULONG ParkFlags;\n} ETW_UMS_EVENT_PARK, *PETW_UMS_EVENT_PARK;\n\ntypedef struct _ETW_UMS_EVENT_DISASSOCIATE\n{\n    ULONG ProcessId;\n    ULONG ScheduledThreadId;\n    ULONG PrimaryThreadId;\n    ULONG UmsApcControlFlags;\n    NTSTATUS Status;\n} ETW_UMS_EVENT_DISASSOCIATE, *PETW_UMS_EVENT_DISASSOCIATE;\n\ntypedef struct _ETW_UMS_EVENT_CONTEXT_SWITCH\n{\n    SYSTEM_TRACE_HEADER Header;\n    ULONG ScheduledThreadId;\n    ULONG SwitchCount;\n    ULONG KernelYieldCount;\n    ULONG MixedYieldCount;\n    ULONG YieldCount;          // Used to determine event size; needs to be the last field.\n} ETW_UMS_EVENT_CONTEXT_SWITCH, *PETW_UMS_EVENT_CONTEXT_SWITCH;\n\n//\n// For ETW_SET_TIMER_EVENT, Period must always be defined as the last member as\n// the same structure is used for periodic and one-shot timers.  In the latter\n// case, the payload size is truncated to ignore the period field.\n//\ntypedef struct _ETW_SET_TIMER_EVENT\n{\n    ULONG64 ExpectedDueTime;\n    ULONG_PTR TimerAddress;\n    USHORT TargetProcessorGroup;\n    UCHAR TargetProcessorIndex;\n    UCHAR Flags;\n    ULONG Period;\n    UCHAR EncodedDelay;\n    UCHAR Reserved0;\n    USHORT Reserved1;\n} ETW_SET_TIMER_EVENT, *PETW_SET_TIMER_EVENT;\n\ntypedef struct _ETW_CANCEL_TIMER_EVENT\n{\n    ULONG_PTR TimerAddress;\n} ETW_CANCEL_TIMER_EVENT, *PETW_CANCEL_TIMER_EVENT;\n\ntypedef struct _ETW_TIMER_EXPIRATION_EVENT\n{\n    ULONG64 ExpectedDueTime;\n    ULONG_PTR TimerAddress;\n    ULONG_PTR DeferredRoutine;\n    UCHAR EncodedDelay;\n} ETW_TIMER_EXPIRATION_EVENT, *PETW_TIMER_EXPIRATION_EVENT;\n\ntypedef struct _ETW_TIMER_EXPIRATION_START_EVENT\n{\n    ULONG64 InterruptTime;\n} ETW_TIMER_EXPIRATION_START_EVENT, *PETW_TIMER_EXPIRATION_START_EVENT;\n\n#define ETW_KTIMER2_HAS_CALLBACK        0x01\n#define ETW_KTIMER2_PERIODIC            0x02\n#define ETW_KTIMER2_IDLE_RESILIENT      0x04\n#define ETW_KTIMER2_HIGH_RESOLUTION     0x08\n#define ETW_KTIMER2_NO_WAKE             0x10\n#define ETW_KTIMER2_NO_WAKE_FINITE      0x20\n\n//\n// Define timer events.\n//\n\n#define ETW_TIMER_COALESCABLE       0x01\n#define ETW_TIMER_DPC               0x02\n#define ETW_TIMER_IDLE_RESILIENT    ETW_KTIMER2_IDLE_RESILIENT\n#define ETW_TIMER_HIGH_RESOLUTION   ETW_KTIMER2_HIGH_RESOLUTION\n#define ETW_TIMER_NO_WAKE           ETW_KTIMER2_NO_WAKE\n\ntypedef struct _ETW_SET_KTIMER2_EVENT\n{\n    ULONG64 DueTime;\n    ULONG64 MaximumDueTime;\n    ULONG64 Period;\n    ULONG_PTR TimerKey;\n    ULONG_PTR Callback;\n    ULONG_PTR CallbackContextKey;\n    UCHAR Flags;\n} ETW_SET_KTIMER2_EVENT, *PETW_SET_KTIMER2_EVENT;\n\ntypedef ETW_SET_KTIMER2_EVENT ETW_KTIMER2_EXPIRATION_EVENT, *PETW_KTIMER2_EXPIRATION_EVENT;\n\ntypedef struct _ETW_CANCEL_KTIMER2_EVENT\n{\n    ULONG_PTR TimerKey;\n} ETW_CANCEL_KTIMER2_EVENT, *PETW_CANCEL_KTIMER2_EVENT;\n\n#define ETW_DISABLE_KTIMER2_CANCEL                  0x1\n#define ETW_DISABLE_KTIMER2_WAIT                    0x2\n#define ETW_DISABLE_KTIMER2_DELAYED                 0x4\n#define ETW_DISABLE_KTIMER2_HAS_DISABLE_CALLBACK    0x8\n\ntypedef struct _ETW_DISABLE_KTIMER2_EVENT\n{\n    ULONG_PTR TimerKey;\n    ULONG_PTR DisableCallback;\n    ULONG_PTR DisableContextKey;\n    UCHAR Flags;\n} ETW_DISABLE_KTIMER2_EVENT, *PETW_DISABLE_KTIMER2_EVENT;\n\ntypedef struct _ETW_FINALIZE_KTIMER2_EVENT\n{\n    ULONG_PTR TimerKey;\n    ULONG_PTR DisableCallback;\n    ULONG_PTR DisableContextKey;\n} ETW_FINALIZE_KTIMER2_EVENT, *PETW_FINALIZE_KTIMER2_EVENT;\n\n//\n// Clock event definitions.\n//\ntypedef enum _PERFINFO_DYNAMIC_TICK_VETO_REASON\n{\n    DynamicTickVetoNone = 0,\n    DynamicTickVetoProcBusy,\n    DynamicTickVetoSoftwareTimer,\n    DynamicTickVetoClockConstraint,\n    DynamicTickVetoClockOutOfSync,\n    DynamicTickVetoClockUpdateFailed,\n    DynamicTickVetoMax\n} PERFINFO_DYNAMIC_TICK_VETO_REASON, *PPERFINFO_DYNAMIC_TICK_VETO_REASON;\n\ntypedef enum _PERFINFO_DYNAMIC_TICK_DISABLE_REASON\n{\n    DynamicTickDisableReasonNone = 0,\n    DynamicTickDisableReasonBcdOverride,\n    DynamicTickDisableReasonNoHwSupport,\n    DynamicTickDisableReasonEmOverride,\n    DynamicTickDisableReasonMax\n} PERFINFO_DYNAMIC_TICK_DISABLE_REASON, *PPERFINFO_DYNAMIC_TICK_DISABLE_REASON;\n\ntypedef struct _ETW_CLOCK_CONFIGURATION_EVENT\n{\n    ULONG KnownType;\n    ULONG Capabilities;\n    PERFINFO_DYNAMIC_TICK_DISABLE_REASON DisableReason;\n} ETW_CLOCK_CONFIGURATION_EVENT, *PETW_CLOCK_CONFIGURATION_EVENT;\n\ntypedef struct _ETW_CLOCK_TIME_UPDATE\n{\n    ULONG64 InterruptTime;\n    ULONG ClockOwner;\n} ETW_CLOCK_TIME_UPDATE, *PETW_CLOCK_TIME_UPDATE;\n\ntypedef struct _ETW_CLOCK_STATE_CHANGE_EVENT\n{\n    UCHAR NewState;\n    UCHAR PrevState;\n    UCHAR Reserved[6];\n    union\n    {\n        struct\n        {\n            ULONG64 DeliveredIncrement;\n            ULONG64 RequestedIncrement;\n        };\n        ULONG64 NextClockUpdateTime;\n    };\n} ETW_CLOCK_STATE_CHANGE_EVENT, *PETW_CLOCK_STATE_CHANGE_EVENT;\n\n//\n// DFSS Events\n//\ntypedef struct _ETW_PER_SESSION_QUOTA\n{\n    ULONG SessionId;\n    ULONG CpuShareWeight;\n    LONGLONG CapturedWeightData;\n    ULONG64 CyclesAccumulated;\n} ETW_PER_SESSION_QUOTA, *PETW_PER_SESSION_QUOTA;\n\ntypedef struct _ETW_DFSS_START_NEW_INTERVAL\n{\n    ULONG CurrentGeneration;\n    ULONG SessionCount;\n    ULONG64 TotalCycleCredit;\n    ULONG64 TotalCyclesAccumulated;\n    ETW_PER_SESSION_QUOTA SessionQuota[1];\n} ETW_DFSS_START_NEW_INTERVAL, *PETW_DFSS_START_NEW_INTERVAL;\n\ntypedef struct _ETW_DFSS_RELEASE_THREAD_ON_IDLE\n{\n    ULONG CurrentGeneration;\n    ULONG SessionSelectedToRun;\n    ULONG64 CycleBaseAllowance;\n    LONG64 CyclesRemaining;\n} ETW_DFSS_RELEASE_THREAD_ON_IDLE, *PETW_DFSS_RELEASE_THREAD_ON_IDLE;\n\ntypedef struct _ETW_CPU_CACHE_FLUSH_EVENT\n{\n    PVOID Address;\n    SIZE_T Bytes;\n    BOOLEAN Clean;\n    BOOLEAN FullFlush;\n    BOOLEAN Rectangle;\n    BOOLEAN Reserved0;\n    ULONG Reserved1;\n} ETW_CPU_CACHE_FLUSH_EVENT, *PETW_CPU_CACHE_FLUSH_EVENT;\n\nDEFINE_GUID( /* 2b88b710-1c93-4f7c-b06c-655ecc50decc */\n    EtwSecondaryDumpDataGuid,\n    0x2b88b710,\n    0x1c93,\n    0x4f7c,\n    0xb0, 0x6c, 0x65, 0x5e, 0xcc, 0x50, 0xde, 0xcc\n    );\n\n//\n// CKCL Name and Guid\n//\n#define CKCL_NAMEW              L\"Circular Kernel Context Logger\"\n#define CKCL_NAMEA              \"Circular Kernel Context Logger\"\n\nDEFINE_GUID( /* 54dea73a-ed1f-42a4-af71-3e63d056f174 */\n    CKCLGuid,\n    0x54dea73a,\n    0xed1f,\n    0x42a4,\n    0xaf, 0x71, 0x3e, 0x63, 0xd0, 0x56, 0xf1, 0x74\n    );\n\n//\n// Audit Session Name and Guid\n//\n#define AUDIT_LOGGER_NAMEW      L\"Eventlog-Security\"\n#define AUDIT_LOGGER_NAMEA      \"Eventlog-Security\"\n\nDEFINE_GUID( /* 0e66e20b-b802-ba6a-9272-31199d0ed295 */\n    AuditLoggerGuid,\n    0x0e66e20b,\n    0xb802,\n    0xba6a,\n    0x92, 0x72, 0x31, 0x19, 0x9d, 0x0e, 0xd2, 0x95\n    );\n\n//\n// Security Provider (LSASS) Guid\n//\nDEFINE_GUID( /* 54849625-5478-4994-a5ba-3e3b0328c30d */\n    SecurityProviderGuid,\n    0x54849625,\n    0x5478,\n    0x4994,\n    0xa5, 0xba, 0x3e, 0x3b, 0x03, 0x28, 0xc3, 0x0d\n    );\n\nDEFINE_GUID( /* 472496cf-0daf-4f7c-ac2e-3f8457ecc6bb */\n    PrivateLoggerSecurityGuid,\n    0x472496cf,\n    0x0daf,\n    0x4f7c,\n    0xac, 0x2e, 0x3f, 0x84, 0x57, 0xec, 0xc6, 0xbb\n    );\n\n//\n// Spare guids for Perf/System events.\n//\n\nDEFINE_GUID( /* e8908abc-aa84-11d2-9a93-00805f85d7c6 */\n    GlobalLoggerGuid,\n    0xe8908abc,\n    0xaa84,\n    0x11d2,\n    0x9a, 0x93, 0x00, 0x80, 0x5f, 0x85, 0xd7, 0xc6\n    );\n\nDEFINE_GUID( /* 8d40301f-ab4a-11d2-9a93-00805f85d7c6 */\n    GenericMessageGuid,\n    0x8d40301f,\n    0xab4a,\n    0x11d2,\n    0x9a, 0x93, 0x00, 0x80, 0x5f, 0x85, 0xd7, 0xc6\n    );\n\nDEFINE_GUID( /* 398191dc-2da7-11d3-8b98-00805f85d7c6 */\n    TraceErrorGuid,\n    0x398191dc,\n    0x2da7,\n    0x11d3,\n    0x8b, 0x98, 0x00, 0x80, 0x5f, 0x85, 0xd7, 0xc6\n    );\n\nDEFINE_GUID( /* 3d6fa8d2-fe05-11d0-9dda-00c04fd7ba7c */ /* Not used */\n    HardFaultGuid,\n    0x3d6fa8d2,\n    0xfe05,\n    0x11d0,\n    0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c\n    );\n\nDEFINE_GUID( /* 44608a51-1851-4456-98b2-b300e931ee41 */\n    WmiEventLoggerGuid,\n    0x44608a51,\n    0x1851,\n    0x4456,\n    0x98, 0xb2, 0xb3, 0x00, 0xe9, 0x31, 0xee, 0x41\n    );\n\nDEFINE_GUID( /* 13976D09-A327-438c-950B-7F03192815C7  */\n    DbgPrintGuid,\n    0x13976d09,\n    0xa327,\n    0x438c,\n    0x95, 0xb, 0x7f, 0x3, 0x19, 0x28, 0x15, 0xc7\n    );\n\nDEFINE_GUID( /* D56CA431-61BF-4904-A621-00E0381E4DDE */\n    DriverVerifierGuid,\n    0xd56ca431,\n    0x61bf,\n    0x4904,\n    0xa6, 0x21, 0x0, 0xe0, 0x38, 0x1e, 0x4d, 0xde\n    );\n\nDEFINE_GUID( /* 78d14f17-0105-46d7-bfff-6fbea2f3f358 */\n    ApplicationVerifierGuid,\n    0x78d14f17,\n    0x0105,\n    0x46d7,\n    0xbf, 0xff, 0x6f, 0xbe, 0xa2, 0xf3, 0xf3, 0x58\n    );\n\nDEFINE_GUID( /* 3282fc76-feed-498e-8aa7-e70f459d430e */\n    JobGuid,\n    0x3282fc76,\n    0xfeed,\n    0x498e,\n    0x8a, 0xa7, 0xe7, 0x0f, 0x45, 0x9d, 0x43, 0x0e\n    );\n\nDEFINE_GUID( /* 99134383-5248-43fc-834b-529454e75df3 */\n    EventTraceSpare1,\n    0x99134383,\n    0x5248,\n    0x43fc,\n    0x83, 0x4b, 0x52, 0x94, 0x54, 0xe7, 0x5d, 0xf3\n    );\n\nDEFINE_GUID( /* 42695762-ea50-497a-9068-5cbbb35e0b95 */\n    WnfGuid,\n    0x42695762,\n    0xea50,\n    0x497a,\n    0x90, 0x68, 0x5c, 0xbb, 0xb3, 0x5e, 0x0b, 0x95\n    );\n\nDEFINE_GUID( /* 3BEEF58A-6E0F-445D-B2A4-37AB737BD47E */\n    UmglThreadGuid,\n    0x3beef58a,\n    0x6e0f,\n    0x445d, 0xb2, 0xa4, 0x37, 0xab, 0x73, 0x7b, 0xd4, 0x7e\n    );\n\n////\n//// DefaultTraceSecurityGuid. Specifies the default event tracing security\n////\n//DEFINE_GUID( /* 0811c1af-7a07-4a06-82ed-869455cdf713 */\n//    DefaultTraceSecurityGuid,\n//    0x0811c1af,\n//    0x7a07,\n//    0x4a06,\n//    0x82, 0xed, 0x86, 0x94, 0x55, 0xcd, 0xf7, 0x13\n//    );\n\nDEFINE_GUID( /* 3d6fa8d4-fe05-11d0-9dda-00c04fd7ba7c */\n    DiskIoGuid,\n    0x3d6fa8d4,\n    0xfe05,\n    0x11d0,\n    0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c\n    );\n\nDEFINE_GUID( /* B3E675D7-2554-4f18-830B-2762732560DE */\n    ImageIdGuid,\n    0xb3e675d7,\n    0x2554,\n    0x4f18,\n    0x83, 0xb, 0x27, 0x62, 0x73, 0x25, 0x60, 0xde\n    );\n\nDEFINE_GUID( /* 0268a8b6-74fd-4302-9dd0-6e8f1795c0cf */\n    PoolGuid,\n    0x0268a8b6,\n    0x74fd,\n    0x4302,\n    0x9d, 0xd0, 0x6e, 0x8f, 0x17, 0x95, 0xc0, 0xcf\n    );\n\nDEFINE_GUID( /* ce1dbfb4-137e-4da6-87b0-3f59aa102cbc */\n    PerfinfoGuid,\n    0xce1dbfb4,\n    0x137e,\n    0x4da6,\n    0x87, 0xb0, 0x3f, 0x59, 0xaa, 0x10, 0x2c, 0xbc\n    );\n\nDEFINE_GUID( /* 222962ab-6180-4b88-a825-346b75f2a24a */\n    HeapGuid,\n    0x222962ab,\n    0x6180,\n    0x4b88,\n    0xa8, 0x25, 0x34, 0x6b, 0x75, 0xf2, 0xa2, 0x4a\n    );\n\nDEFINE_GUID( /* d781ca11-61c0-4387-b83d-af52d3d2dd6a */\n    HeapRangeGuid,\n    0xd781ca11,\n    0x61c0,\n    0x4387,\n    0xb8, 0x3d, 0xaf, 0x52, 0xd3, 0xd2, 0xdd, 0x6a\n    );\n\nDEFINE_GUID( /* 05867806-c246-43ef-a147-e17d2bdb1496 */\n    HeapSummaryGuid,\n    0x05867806,\n    0xc246,\n    0x43ef,\n    0xa1, 0x47, 0xe1, 0x7d, 0x2b, 0xdb, 0x14, 0x96\n    );\n\nDEFINE_GUID( /* 3AC66736-CC59-4cff-8115-8DF50E39816B */\n    CritSecGuid,\n    0x3ac66736,\n    0xcc59,\n    0x4cff,\n    0x81, 0x15, 0x8d, 0xf5, 0xe, 0x39, 0x81, 0x6b\n    );\n\nDEFINE_GUID( /* DEF2FE46-7BD6-4b80-bd94-F57FE20D0CE3 */\n    StackWalkGuid,\n    0xdef2fe46,\n    0x7bd6,\n    0x4b80,\n    0xbd, 0x94, 0xf5, 0x7f, 0xe2, 0xd, 0xc, 0xe3\n    );\n\nDEFINE_GUID( /* 45d8cccd-539f-4b72-a8b7-5c683142609a */\n    ALPCGuid,\n    0x45d8cccd,\n    0x539f,\n    0x4b72,\n    0xa8, 0xb7, 0x5c, 0x68, 0x31, 0x42, 0x60, 0x9a\n    );\n\nDEFINE_GUID( /* 6A399AE0-4BC6-4DE9-870B-3657F8947E7E */\n    RTLostEventsGuid,\n    0x6a399ae0,\n    0x4bc6,\n    0x4de9,\n    0x87, 0x0b, 0x36, 0x57, 0xf8, 0x94, 0x7e, 0x7e\n    );\n\nDEFINE_GUID( /* E21D2142-DF90-4d93-BBD9-30E63D5A4AD6 */\n    NtdllTraceGuid,\n    0xe21d2142,\n    0xdf90,\n    0x4d93,\n    0xbb, 0xd9, 0x30, 0xe6, 0x3d, 0x5a, 0x4a, 0xd6\n    );\n\nDEFINE_GUID(\n    UserLoaderGuid, /* b059b83f-d946-4b13-87ca-4292839dc2f2 */\n    0xb059b83f,\n    0xd946,\n    0x4b13, 0x87, 0xca, 0x42, 0x92, 0x83, 0x9d, 0xc2, 0xf2\n    );\n\nDEFINE_GUID( /* d3de60b2-a663-45d5-9826-a0a5949d2cb0 */\n    LoadMUIDllGuid,\n    0xd3de60b2,\n    0xa663,\n    0x45d5,\n    0x98, 0x26, 0xa0, 0xa5, 0x94, 0x9d, 0x2c, 0xb0\n    );\n\nDEFINE_GUID( /* 89497f50-effe-4440-8cf2-ce6b1cdcaca7 */\n    ObjectGuid,\n    0x89497f50,\n    0xeffe,\n    0x4440,\n    0x8c, 0xf2, 0xce, 0x6b, 0x1c, 0xdc, 0xac, 0xa7\n    );\n\nDEFINE_GUID( /* a9152f00-3f58-4bee-92a1-70c7d079d5dd */\n    ModBoundGuid,\n    0xa9152f00,\n    0x3f58,\n    0x4bee,\n    0x92, 0xa1, 0x70, 0xc7, 0xd0, 0x79, 0xd5, 0xdd\n    );\n\nDEFINE_GUID( /* 3d6fa8d0-fe05-11d0-9dda-00c04fd7ba7c */\n    ProcessGuid,\n    0x3d6fa8d0,\n    0xfe05,\n    0x11d0,\n    0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c\n    );\n\nDEFINE_GUID( /* E43445E0-0903-48c3-B878-FF0FCCEBDD04 */\n    PowerGuid,\n    0xe43445e0,\n    0x903,\n    0x48c3,\n    0xb8, 0x78, 0xff, 0xf, 0xcc, 0xeb, 0xdd, 0x4\n    );\n\nDEFINE_GUID( /* F8F10121-B617-4A56-868B-9dF1B27FE32C */\n    MmcssGuid,\n    0xf8f10121,\n    0xb617,\n    0x4a56,\n    0x86, 0x8b, 0x9d, 0xf1, 0xb2, 0x7f, 0xe3, 0x2c\n    );\n\nDEFINE_GUID( /* b2d14872-7c5b-463d-8419-ee9bf7d23e04 */\n    DpcGuid,\n    0xb2d14872,\n    0x7c5b,\n    0x463d,\n    0x84, 0x19, 0xee, 0x9b, 0xf7, 0xd2, 0x3e, 0x04\n    );\n\nDEFINE_GUID( /* d837ca92-12b9-44a5-ad6a-3a65b3578aa8 */\n    SplitIoGuid,\n    0xd837ca92,\n    0x12b9,\n    0x44a5,\n    0xad, 0x6a, 0x3a, 0x65, 0xb3, 0x57, 0x8a, 0xa8\n    );\n\nDEFINE_GUID( /* c861d0e2-a2c1-4d36-9f9c-970bab943a12 */\n    ThreadPoolGuid,\n    0xc861d0e2,\n    0xa2c1,\n    0x4d36,\n    0x9f, 0x9c, 0x97, 0x0b, 0xab, 0x94, 0x3a, 0x12\n    );\n\nDEFINE_GUID( /* bddad2c1-52d1-4aea-94d6-b3ca9236f62e */\n    UmsTraceGuid,\n    0xbddad2c1,\n    0x52d1,\n    0x4aea,\n    0x94, 0xd6, 0xb3, 0xca, 0x92, 0x36, 0xf6, 0x2e\n    );\n\nDEFINE_GUID( /* 9aec974b-5b8e-4118-9b92-3186d8002ce5 */\n    UmsEventGuid,\n    0x9aec974b,\n    0x5b8e,\n    0x4118,\n    0x9b, 0x92, 0x31, 0x86, 0xd8, 0x00, 0x2c, 0xe5\n    );\n\nDEFINE_GUID( /* 7f2a405c-69b5-4bf9-a1f5-30e8f1afab5e */\n    HypervisorTraceGuid,\n    0x7f2a405c,\n    0x69b5,\n    0x4bf9,\n    0xa1, 0xf5, 0x30, 0xe8, 0xf1, 0xaf, 0xab, 0x5e\n    );\n\nDEFINE_GUID( /* 2ce9a149-effe-42f0-a635-a1d39e26c8f2 */\n    HypervisorXTraceGuid,\n    0x2ce9a149,\n    0xeffe,\n    0x42f0,\n    0xa6, 0x35, 0xa1, 0xd3, 0x9e, 0x26, 0xc8, 0xf2\n    );\n\nDEFINE_GUID( /* 2d9f3a42-01d4-4733-97f7-041e8021dc84 */\n    LegacyEventLogGuid,\n    0x2d9f3a42,\n    0x01d4,\n    0x4733,\n    0x97, 0xf7, 0x04, 0x1e, 0x80, 0x21, 0xdc, 0x84\n    );\n\nDEFINE_GUID( /* 3b9c9951-3480-4220-9377-9c8e5184f5cd */\n    KernelRundownGuid,\n    0x3b9c9951,\n    0x3480,\n    0x4220,\n    0x93, 0x77, 0x9c, 0x8e, 0x51, 0x84, 0xf5, 0xcd\n    );\n\nDEFINE_GUID(  /* 2a6e185b-90de-4fc5-826c-9f44e608a427 */\n    SessionNotificationGuid,\n    0x2a6e185b,\n    0x90de,\n    0x4fc5,\n    0x82, 0x6c, 0x9f, 0x44, 0xe6, 0x08, 0xa4, 0x27\n    );\n\n//DEFINE_GUID(  /* 9e814aad-3204-11d2-9a82-006008a86939 */\n//    SystemTraceControlGuid,\n//    0x9e814aad,\n//    0x3204,\n//    0x11d2, 0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39\n//    );\n\nDEFINE_GUID( /* 7687a439-f752-45b8-b741-321aec0f8df9 */\n    CcGuid,\n    0x7687a439,\n    0xf752,\n    0x45b8,\n    0xb7, 0x41, 0x32, 0x1a, 0xec, 0x0f, 0x8d, 0xf9\n    );\n\nDEFINE_GUID( /* 00000000-0000-0000-0000-000000000000 */\n    NullGuid,\n    0x00000000,\n    0x0000,\n    0x0000,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n    );\n\nDEFINE_GUID(  /* 305fc87b-002a-5e26-d297-60223012ca9c */\n    UserDiagnosticGuid,\n    0x305fc87b,\n    0x002a,\n    0x5e26, 0xd2, 0x97, 0x60, 0x22, 0x30, 0x12, 0xca, 0x9c\n    );\n\nDEFINE_GUID(  /* e46eead8-0c54-4489-9898-8fa79d059e0e */\n    WerSvcTriggerGuid,\n    0xe46eead8,\n    0x0c54,\n    0x4489,\n    0x98, 0x98, 0x8f, 0xa7, 0x9d, 0x05, 0x9e, 0x0e\n    );\n\n///\n// EventTraceGuid is used to identify a event tracing session\n//\n//DEFINE_GUID( /* 68fdd900-4a3e-11d1-84f4-0000f80464e3 */\n//    EventTraceGuid,\n//    0x68fdd900,\n//    0x4a3e,\n//    0x11d1,\n//    0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3\n//    );\n//\n//\n// EventTraceConfigGuid. Used to report system configuration records\n//\n//DEFINE_GUID( /* 01853a65-418f-4f36-aefc-dc0f1d2fd235 */\n//    EventTraceConfigGuid,\n//    0x01853a65,\n//    0x418f,\n//    0x4f36,\n//    0xae, 0xfc, 0xdc, 0x0f, 0x1d, 0x2f, 0xd2, 0x35\n//    );\n\nDEFINE_GUID( /* 90cbdc39-4a3e-11d1-84f4-0000f80464e3 */\n    FileIoGuid,\n    0x90cbdc39,\n    0x4a3e,\n    0x11d1,\n    0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3\n    );\n\nDEFINE_GUID( /* 2cb15d1d-5fc1-11d2-abe1-00a0c911f518 */\n    ImageLoadGuid,\n    0x2cb15d1d,\n    0x5fc1,\n    0x11d2,\n    0xab, 0xe1, 0x00, 0xa0, 0xc9, 0x11, 0xf5, 0x18\n    );\n\nDEFINE_GUID( /* 3d6fa8d3-fe05-11d0-9dda-00c04fd7ba7c */\n    PageFaultGuid,\n    0x3d6fa8d3,\n    0xfe05,\n    0x11d0,\n    0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c\n    );\n\nDEFINE_GUID( /* AE53722E-C863-11d2-8659-00C04FA321A1 */\n    RegistryGuid,\n    0xae53722e,\n    0xc863,\n    0x11d2,\n    0x86, 0x59, 0x0, 0xc0, 0x4f, 0xa3, 0x21, 0xa1\n    );\n\nDEFINE_GUID( /* 9a280ac0-c8e0-11d1-84e2-00c04fb998a2 */\n    TcpIpGuid,\n    0x9a280ac0,\n    0xc8e0,\n    0x11d1,\n    0x84, 0xe2, 0x00, 0xc0, 0x4f, 0xb9, 0x98, 0xa2\n    );\n\nDEFINE_GUID( /* 3d6fa8d1-fe05-11d0-9dda-00c04fd7ba7c */\n    ThreadGuid,\n    0x3d6fa8d1,\n    0xfe05,\n    0x11d0,\n    0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c\n    );\n\nDEFINE_GUID( /* bf3a50c5-a9c9-4988-a005-2df0b7c80f80 */\n    UdpIpGuid,\n    0xbf3a50c5,\n    0xa9c9,\n    0x4988,\n    0xa0, 0x05, 0x2d, 0xf0, 0xb7, 0xc8, 0x0f, 0x80\n    );\n\n//\n// ThreadPool Events\n//    If you change these structures, may need to update some users of these\n//    structures.\n//    Avoid inner structure padding\n//\n\ntypedef struct _ETW_TP_EVENT_CALLBACK_ENQUEUE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    PVOID TaskId;                   // Task Identifier\n    PVOID Callback;                 // Callback Function\n    PVOID Context;                  // Callback Context\n    PVOID SubProcessTag;            // Sub-components in a process\n    // SubProcessTag must be the last field or update users\n} ETW_TP_EVENT_CALLBACK_ENQUEUE, *PETW_TP_EVENT_CALLBACK_ENQUEUE;\n\n//\n// Use the same struct for Enqueue and Dequeue\n//\n\ntypedef ETW_TP_EVENT_CALLBACK_ENQUEUE ETW_TP_EVENT_CALLBACK_DEQUEUE, *PETW_TP_EVENT_CALLBACK_DEQUEUE;\n\ntypedef struct _ETW_TP_EVENT_CALLBACK_START\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    PVOID TaskId;                   // Task Identifier\n    PVOID Callback;                 // Callback Function\n    PVOID Context;                  // Callback Context\n    PVOID SubProcessTag;            // Sub-components in a process\n    // SubProcessTag must be the last field or update users\n\n} ETW_TP_EVENT_CALLBACK_START, *PETW_TP_EVENT_CALLBACK_START;\n\n//\n// Use the same struct for Start and Stop\n//\n\ntypedef ETW_TP_EVENT_CALLBACK_START ETW_TP_EVENT_CALLBACK_STOP, *PETW_TP_EVENT_CALLBACK_STOP;\n\ntypedef struct _ETW_TP_EVENT_CALLBACK_CANCEL\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    PVOID TaskId;                   // Task Identifier\n    PVOID Callback;                 // Callback Function\n    PVOID Context;                  // Callback Context\n    PVOID SubProcessTag;            // Sub-components in a process\n    ULONG CancelCount;              // Number of callbacks cancelled\n    // CancelCount must be the last field or update users\n\n} ETW_TP_EVENT_CALLBACK_CANCEL, *PETW_TP_EVENT_CALLBACK_CANCEL;\n\ntypedef struct _ETW_TP_EVENT_POOL_CREATE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    // PoolId must be the last field or update users\n\n} ETW_TP_EVENT_POOL_CREATE, *PETW_TP_EVENT_POOL_CREATE;\n\ntypedef struct _ETW_TP_EVENT_POOL_CLOSE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    // PoolId must be the last field or update users\n\n} ETW_TP_EVENT_POOL_CLOSE, *PETW_TP_EVENT_POOL_CLOSE;\n\ntypedef struct _ETW_TP_EVENT_POOL_TH_MIN_SET\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    ULONG ThreadNum;                // New limit on number of threads\n    // ThreadNum must be the last field or update users\n\n} ETW_TP_EVENT_POOL_TH_MIN_SET, *PETW_TP_EVENT_POOL_TH_MIN_SET;\n\ntypedef struct _ETW_TP_EVENT_POOL_TH_MAX_SET\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    ULONG ThreadNum;                // New limit on number of threads\n    // ThreadNum must be the last field or update users\n\n} ETW_TP_EVENT_POOL_TH_MAX_SET, *PETW_TP_EVENT_POOL_TH_MAX_SET;\n\ntypedef struct _ETW_TP_EVENT_WORKER_NUMANODE_SWITCH\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID PoolId;                   // Pool Identifier\n    ULONG CurrentNode;              // Thread's current numa node\n    ULONG NextNode;                 // The node the thread is moving to\n    USHORT CurrentGroup;            // Thread's current group\n    USHORT NextGroup;               // The group the thread is moving to\n    ULONG CurrentWorkerCount;       // Current node's worker count\n    ULONG NextWorkerCount;          // Next node's worker count\n    // NextWorkerCount must be the last field or update users\n\n} ETW_TP_EVENT_WORKER_NUMANODE_SWITCH, *PETW_TP_EVENT_WORKER_NUMANODE_SWITCH;\n\n#include <pshpack1.h>\ntypedef struct _ETW_TP_EVENT_TIMER_SET\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LONG64 DueTime;                 // Due time\n    PVOID SubQueue;                 // Sub Queue to be inserted\n    PVOID Timer;                    // Timer to be set\n    ULONG Period;                   // period of the timer\n    ULONG WindowLength;             // Tolerate period\n    ULONG Absolute;                 // An absolute timer or relative timer\n} ETW_TP_EVENT_TIMER_SET, *PETW_TP_EVENT_TIMER_SET;\n\ntypedef struct _ETW_TP_EVENT_TIMER_CANCELLED\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID SubQueue;                 // Sub Queue containing the timer\n    PVOID Timer;                    // Timer to be cancelled\n} ETW_TP_EVENT_TIMER_CANCELLED, *PETW_TP_EVENT_TIMER_CANCELLED;\n\ntypedef struct _ETW_TP_EVENT_TIMER_SET_NTTIMER\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LONG64 DueTime;                 // Due time\n    PVOID SubQueue;                 // Sub Queue to be inserted\n    ULONG TolerableDelay;           // Tolerance\n} ETW_TP_EVENT_TIMER_SET_NTTIMER, *PETW_TP_EVENT_TIMER_SET_NTTIMER;\n\ntypedef struct _ETW_TP_EVENT_TIMER_CANCEL_NTTIMER\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID SubQueue;                 // Sub Queue to be cancelled\n} ETW_TP_EVENT_TIMER_CANCEL_NTTIMER, *PETW_TP_EVENT_TIMER_CANCEL_NTTIMER;\n\ntypedef struct _ETW_TP_EVENT_TIMER_EXPIRATION_BEGIN\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID SubQueue;                 // Sub Queue to be expired\n} ETW_TP_EVENT_TIMER_EXPIRATION_BEGIN, *PETW_TP_EVENT_TIMER_EXPIRATION_BEGIN;\n\ntypedef struct _ETW_TP_EVENT_TIMER_EXPIRATION_END\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    PVOID SubQueue;                 // Sub Queue to be expired\n} ETW_TP_EVENT_TIMER_EXPIRATION_END, *PETW_TP_EVENT_TIMER_EXPIRATION_END;\n\ntypedef struct _ETW_TP_EVENT_TIMER_EXPIRATION\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LONG64 DueTime;                 // Due time\n    PVOID SubQueue;                 // Sub Queue containing the timer\n    PVOID Timer;                    // Timer to be expired\n    ULONG Period;                   // period of the timer\n    ULONG WindowLength;             // Tolerate period\n} ETW_TP_EVENT_TIMER_EXPIRATION, *PETW_TP_EVENT_TIMER_EXPIRATION;\n#include <poppack.h>\n\n//\n// Thread SubProcessTag Changed Event\n//\n\ntypedef struct _ETW_THREAD_EVENT_SUBPROCESSTAG\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    ULONG OldTag;\n    ULONG NewTag;\n} ETW_THREAD_EVENT_SUBPROCESSTAG, *PETW_THREAD_EVENT_SUBPROCESSTAG;\n\n//\n// WNF Events\n//\ntypedef struct _ETW_WNF_EVENT_SUBSCRIBE\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LARGE_INTEGER StateName;        // State name\n    PVOID Subscription;             // User Subscription\n    PVOID NameSub;                  // Name Subscription\n    PVOID Callback;                 // Callback function\n    ULONG RefCount;                 // Name Subscription Refcount\n    ULONG DeliveryFlags;            // Requested Deliveries\n} ETW_WNF_EVENT_SUBSCRIBE, *PETW_WNF_EVENT_SUBSCRIBE;\n\ntypedef ETW_WNF_EVENT_SUBSCRIBE ETW_WNF_EVENT_UNSUBSCRIBE, *PETW_WNF_EVENT_UNSUBSCRIBE;\n\ntypedef struct _ETW_WNF_EVENT_CALLBACK\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LARGE_INTEGER StateName;        // State name\n    PVOID Subscription;             // User Subscription\n    PVOID NameSub;                  // Name Subscription\n    PVOID Callback;                 // Callback function\n    ULONG ChangeStamp;              // Change Stamp\n    ULONG DeliveryFlags;            // Delivery types\n    ULONG Return;                   // Return status from callback\n} ETW_WNF_EVENT_CALLBACK, *PETW_WNF_EVENT_CALLBACK;\n\ntypedef struct _ETW_WNF_EVENT_PUBLISH\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LARGE_INTEGER StateName;        // State name\n    ULONG DataLength;               // Length of State Data\n} ETW_WNF_EVENT_PUBLISH, *PETW_WNF_EVENT_PUBLISH;\n\ntypedef struct _ETW_WNF_EVENT_NAME_SUB_RUNDOWN\n{\n    SYSTEM_TRACE_HEADER Header;     // Header\n    LARGE_INTEGER StateName;        // State name\n    PVOID NameSub;                  // Name Subscription\n} ETW_WNF_EVENT_NAME_SUB_RUNDOWN, *PETW_WNF_EVENT_NAME_SUB_RUNDOWN;\n\n//\n// Data structures of events\n//\n#define PERFINFO_THREAD_SWAPABLE      0\n#define PERFINFO_THREAD_NONSWAPABLE   1\n\ntypedef struct _PERFINFO_MARK_EVENT\n{\n    ULONG  TranId;\n    UCHAR  Level;\n    UCHAR  AppId;\n    USHORT OpId;\n    WCHAR  Text[1];\n} PERFINFO_MARK_EVENT, *PPERFINFO_MARK_EVENT;\n\n//\n// Structures for Driver hooks\n//\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_DRIVER_MAJORFUNCTION\n{\n    ULONG MajorFunction;\n    ULONG MinorFunction;\n    PVOID RoutineAddr;\n    PVOID FileNamePointer;\n    PVOID Irp;\n    ULONG UniqMatchId;\n} PERFINFO_DRIVER_MAJORFUNCTION, *PPERFINFO_DRIVER_MAJORFUNCTION;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_DRIVER_MAJORFUNCTION_RET\n{\n    PVOID Irp;\n    ULONG UniqMatchId;\n} PERFINFO_DRIVER_MAJORFUNCTION_RET, *PPERFINFO_DRIVER_MAJORFUNCTION_RET;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_DRIVER_COMPLETE_REQUEST\n{\n    //\n    // Driver major function routine address for the \"current\" stack location\n    // on the IRP when it was completed. It is used to identify which driver\n    // was processing the IRP when the IRP got completed.\n    //\n\n    PVOID RoutineAddr;\n\n    //\n    // Irp field and UniqMatchId is used to match COMPLETE_REQUEST\n    // and COMPLETE_REQUEST_RET logged for an IRP completion.\n    //\n\n    PVOID Irp;\n    ULONG UniqMatchId;\n\n} PERFINFO_DRIVER_COMPLETE_REQUEST, *PPERFINFO_DRIVER_COMPLETE_REQUEST;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_DRIVER_COMPLETE_REQUEST_RET\n{\n    //\n    // Irp field and UniqMatchId is used to match COMPLETE_REQUEST\n    // and COMPLETE_REQUEST_RET logged for an IRP completion.\n    //\n    PVOID Irp;\n    ULONG UniqMatchId;\n} PERFINFO_DRIVER_COMPLETE_REQUEST_RET, *PPERFINFO_DRIVER_COMPLETE_REQUEST_RET;\n#include <poppack.h>\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_DRIVER_COMPLETIONROUTINE\n{\n    PVOID Routine;\n    PVOID IrpPtr;\n    ULONG UniqMatchId;\n} PERFINFO_DRIVER_COMPLETIONROUTINE, *PPERFINFO_DRIVER_COMPLETIONROUTINE;\n#include <poppack.h>\n\n//\n// Power hooks\n//\ntypedef struct _PERFINFO_BATTERY_LIFE_INFO\n{\n    ULONG RemainingCapacity;\n    ULONG Rate;\n} PERFINFO_BATTERY_LIFE_INFO, *PPERFINFO_BATTERY_LIFE_INFO;\n\ntypedef struct _PERFINFO_IDLE_STATE_CHANGE\n{\n    ULONG State;\n    ULONG Throttle;\n    ULONG Direction;\n} PERFINFO_IDLE_STATE_CHANGE, *PPERFINFO_IDLE_STATE_CHANGE;\n\n//\n// This structure is logged when PopSetPowerAction is called to start\n// propagating a new power action (e.g. standby/hibernate/shutdown)\n//\ntypedef struct _PERFINFO_SET_POWER_ACTION\n{\n    //\n    // This field is used to match SET_POWER_ACTION_RET entry.\n    //\n    PVOID Trigger;\n    ULONG PowerAction;\n    ULONG LightestState;\n} PERFINFO_SET_POWER_ACTION, *PPERFINFO_SET_POWER_ACTION;\n\n//\n// This structure is logged when PopSetPowerAction completes.\n//\ntypedef struct _PERFINFO_SET_POWER_ACTION_RET\n{\n    PVOID Trigger;\n    NTSTATUS Status;\n} PERFINFO_SET_POWER_ACTION_RET, *PPERFINFO_SET_POWER_ACTION_RET;\n\n//\n// This structure is logged when PopSetDevicesSystemState is called to\n// propagate a system state to all devices.\n//\ntypedef struct _PERFINFO_SET_DEVICES_STATE\n{\n    ULONG SystemState;\n    BOOLEAN Waking;\n    BOOLEAN Shutdown;\n    UCHAR IrpMinor;\n} PERFINFO_SET_DEVICES_STATE, *PPERFINFO_SET_DEVICES_STATE;\n\n//\n// This structure is logged when PopSetDevicesSystemState is done.\n//\ntypedef struct _PERFINFO_SET_DEVICES_STATE_RET\n{\n    NTSTATUS Status;\n} PERFINFO_SET_DEVICES_STATE_RET, *PPERFINFO_SET_DEVICES_STATE_RET;\n\n//\n// This structure is logged when PopNotifyDevice calls into a driver\n// to set the power state of a device.\n//\ntypedef struct _PERFINFO_PO_NOTIFY_DEVICE\n{\n    //\n    // This field is used to match notification and completion log\n    // entries for a device.\n    //\n\n    PVOID Irp;\n\n    //\n    // Base address of the driver that owns this device.\n    //\n\n    PVOID DriverStart;\n\n    //\n    // Device node properties.\n    //\n\n    UCHAR OrderLevel;\n\n    //\n    // Major and minor IRP codes for the request made to the driver.\n    //\n\n    UCHAR MajorFunction;\n    UCHAR MinorFunction;\n\n    //\n    // Type of power irp\n    //\n    POWER_STATE_TYPE Type;\n    POWER_STATE      State;\n\n    //\n    // Length of the device name in characters excluding terminating NUL,\n    // and the device name itself. Depending on how much fits into our\n    // stack buffer, this is the *last* part of the device name.\n    //\n\n    ULONG DeviceNameLength;\n    WCHAR DeviceName[1];\n\n} PERFINFO_PO_NOTIFY_DEVICE, *PPERFINFO_PO_NOTIFY_DEVICE;\n\n//\n// This structure is logged when a PopNotifyDevice processing for a\n// particular device completes.\n//\n\ntypedef struct _PERFINFO_PO_NOTIFY_DEVICE_COMPLETE\n{\n    //\n    // This field is used to match notification and completion log\n    // entries for a device.\n    //\n\n    PVOID Irp;\n\n    //\n    // Status with which the notify power IRP was completed.\n    //\n\n    NTSTATUS Status;\n\n} PERFINFO_PO_NOTIFY_DEVICE_COMPLETE, *PPERFINFO_PO_NOTIFY_DEVICE_COMPLETE;\n\n//\n// This structure is logged around every win32 state callout\n//\ntypedef struct _PERFINFO_PO_SESSION_CALLOUT\n{\n    POWER_ACTION SystemAction;\n    SYSTEM_POWER_STATE MinSystemState;\n    ULONG Flags;\n    ULONG PowerStateTask;\n} PERFINFO_PO_SESSION_CALLOUT, *PPERFINFO_PO_SESSION_CALLOUT;\n\ntypedef struct _PERFINFO_PO_PRESLEEP\n{\n    LARGE_INTEGER PerformanceCounter;\n    LARGE_INTEGER PerformanceFrequency;\n} PERFINFO_PO_PRESLEEP, *PPERFINFO_PO_PRESLEEP;\n\ntypedef struct _PERFINFO_PO_POSTSLEEP\n{\n    LARGE_INTEGER PerformanceCounter;\n} PERFINFO_PO_POSTSLEEP, *PPERFINFO_PO_POSTSLEEP;\n\ntypedef struct _PERFINFO_PO_CALIBRATED_PERFCOUNTER\n{\n    LARGE_INTEGER PerformanceCounter;\n} PERFINFO_PO_CALIBRATED_PERFCOUNTER, *PPERFINFO_PO_CALIBRATED_PERFCOUNTER;\n\ntypedef struct _PERFINFO_BOOT_PHASE_START\n{\n    LONG Phase;\n} PERFINFO_BOOT_PHASE_START, *PPERFINFO_BOOT_PHASE_START;\n\ntypedef struct _PERFINFO_BOOT_PREFETCH_INFORMATION\n{\n    LONG Action;\n    NTSTATUS Status;\n    LONG Pages;\n} PERFINFO_BOOT_PREFETCH_INFORMATION, *PPERFINFO_BOOT_PREFETCH_INFORMATION;\n\ntypedef struct _PERFINFO_PO_SESSION_CALLOUT_RET\n{\n    NTSTATUS Status;\n} PERFINFO_PO_SESSION_CALLOUT_RET, *PPERFINFO_PO_SESSION_CALLOUT_RET;\n\ntypedef struct _PERFINFO_PPM_IDLE_STATE_CHANGE\n{\n    ULONG NewState;\n    ULONG OldState;\n    ULONG64 Processors;\n} PERFINFO_PPM_IDLE_STATE_CHANGE, *PPERFINFO_PPM_IDLE_STATE_CHANGE;\n\n//\n// Flags related to each processor idle entry.\n//\n// DUE_INTERRUPT: Idle duration hint is based on next expected h/w interrupt.\n// When not set, it indicates the the idle duration hint was based on the next\n// due s/w timer.\n//\n// IR_RETRY: The idle transition follows a failed previous attempt to pick the\n// optimal idle state with an IR based hint.\n//\n// IR_ENABLED: Idle-resiliency was enabled during the idle transition.\n//\n// PLATFORM_ENTER: The idle entry was part of a platform idle transition.\n//\n// LOCK_PROCESSORS: The idle transition required locking at least one other\n// processor.\n//\n// CONSTRAINT_PLATFORM: The idle entry was capable of a platform idle\n// transition.\n//\n// CONSTRAINT_NI: The idle transition is capable of entering a non-interruptible\n// idle state.\n//\n// OVERRIDE_ENABLED: The idle transition had force-idle override enabled.\n//\n// MEASURING_EXIT_LATENCY: Exit latency measurement is engaged during the idle\n// transition.\n//\n// WAKE_REQUESTED: Idle transition was accompanied with a request to wake\n// another processor.\n//\n// IPI_CLOCK_OWNER: Idle transition was on non clock owner and observed to be\n// the last processor to be going idle. It send an IPI to clock owner to wake\n// it up.\n//\n// PLATFORM_HINT_OVERRIDE: Idle duration hint is based on global platform idle\n// hint.\n//\n\n#define PERFINFO_PPM_IDLE_FLAG_DUE_INTERRUPT          (1 << 0)\n#define PERFINFO_PPM_IDLE_FLAG_IR_RETRY               (1 << 1)\n#define PERFINFO_PPM_IDLE_FLAG_IR_ENABLED             (1 << 2)\n#define PERFINFO_PPM_IDLE_FLAG_CLOCK_OWNER            (1 << 3)\n#define PERFINFO_PPM_IDLE_FLAG_PLATFORM_ENTER         (1 << 4)\n#define PERFINFO_PPM_IDLE_FLAG_LOCK_PROCESSORS        (1 << 5)\n#define PERFINFO_PPM_IDLE_FLAG_CONSTRAINT_NI          (1 << 6)\n#define PERFINFO_PPM_IDLE_FLAG_CONSTRAINT_PLATFORM    (1 << 7)\n#define PERFINFO_PPM_IDLE_FLAG_OVERRIDE_ENABLED       (1 << 8)\n#define PERFINFO_PPM_IDLE_FLAG_MEASURING_EXIT_LATENCY (1 << 9)\n#define PERFINFO_PPM_IDLE_FLAG_WAKE_REQUESTED         (1 << 10)\n#define PERFINFO_PPM_IDLE_FLAG_IPI_CLOCK_OWNER        (1 << 11)\n#define PERFINFO_PPM_IDLE_FLAG_PLATFORM_HINT_OVERRIDE (1 << 12)\n#define PERFINFO_PPM_IDLE_FLAG_DURATION_EXPIRATION    (1 << 13)\n\ntypedef struct _PERFINFO_PPM_IDLE_STATE_ENTER\n{\n    ULONG State;\n    union\n    {\n        struct\n        {\n            USHORT Properties;\n            UCHAR ExpectedWakeReason;\n            UCHAR Reserved;\n        };\n        ULONG Flags;\n    };\n\n    ULONG64 ExpectedDuration;\n} PERFINFO_PPM_IDLE_STATE_ENTER, *PPERFINFO_PPM_IDLE_STATE_ENTER;\n\ntypedef struct _PERFINFO_PPM_IDLE_STATE_EXIT\n{\n    ULONG State;\n    ULONG Status;\n} PERFINFO_PPM_IDLE_STATE_EXIT, *PPERFINFO_PPM_IDLE_STATE_EXIT;\n\ntypedef struct _PERFINFO_PPM_STATE_SELECTION\n{\n    ULONG SelectedState;\n    ULONG VetoedStates;\n    _Field_size_(VetoedStates) ULONG VetoReason[ANYSIZE_ARRAY];\n} PERFINFO_PPM_STATE_SELECTION, *PPERFINFO_PPM_STATE_SELECTION;\n\n#define PERFINFO_PPM_IDLE_VETO_PREREGISTERED_VETO     (0x80000000)\n#define PERFINFO_PPM_IDLE_VETO_WRONG_INITIATOR        (0x80000001)\n#define PERFINFO_PPM_IDLE_VETO_SYSTEM_LATENCY         (0x80000002)\n#define PERFINFO_PPM_IDLE_VETO_IDLE_DURATION          (0x80000003)\n#define PERFINFO_PPM_IDLE_VETO_DEVICE_DEPENDENCY      (0x80000004)\n#define PERFINFO_PPM_IDLE_VETO_PROCESSOR_DEPENDENCY   (0x80000005)\n#define PERFINFO_PPM_IDLE_VETO_PLATFORM_ONLY          (0x80000006)\n#define PERFINFO_PPM_IDLE_VETO_INTERRUPTIBLE          (0x80000007)\n#define PERFINFO_PPM_IDLE_VETO_LEGACY_OVEERIDE        (0x80000008)\n#define PERFINFO_PPM_IDLE_VETO_C_STATE_CHECK          (0x80000009)\n#define PERFINFO_PPM_IDLE_VETO_NO_C_STATE             (0x8000000a)\n#define PERFINFO_PPM_IDLE_VETO_COORDINATED_DEPENDENCY (0x8000000b)\n#define PERFINFO_PPM_IDLE_VETO_DISABLED_IN_MENU       (0xfffffffe)\n#define PERFINFO_PPM_IDLE_VETO_ACTIVE_PROCESSOR       (0xffffffff)\n\n#define PERFINFO_PPM_IDLE_NON_INTERRUPTIBLE   (1 << 0)\n#define PERFINFO_PPM_IDLE_ALL_PROC_LOCKED     (1 << 1)\n#define PERFINFO_PPM_IDLE_EXIT_SAMPLE_INVALID (1 << 2)\n\ntypedef struct _PERFINFO_PPM_IDLE_EXIT_LATENCY\n{\n    ULONG Flags;\n    ULONG PlatformState;\n    ULONG ProcessorState;\n    ULONG ReturnLatency;\n    ULONG TotalLatency;\n} PERFINFO_PPM_IDLE_EXIT_LATENCY, *PPERFINFO_PPM_IDLE_EXIT_LATENCY;\n\n#define PERFINFO_PPM_FREQUENCY_VOLTAGE_STATE   1\n#define PERFINFO_PPM_STOPCLOCK_THROTTLE_STATE  2\n\ntypedef struct _PERFINFO_PPM_PERF_STATE_CHANGE\n{\n  ULONG Type;\n  ULONG NewState;\n  ULONG OldState;\n  NTSTATUS Result;\n  ULONG64 Processors;\n} PERFINFO_PPM_PERF_STATE_CHANGE, *PPERFINFO_PPM_PERF_STATE_CHANGE;\n\ntypedef struct _PERFINFO_PPM_THERMAL_CONSTRAINT{\n  ULONG Constraint;\n  ULONG64 Processors;\n} PERFINFO_PPM_THERMAL_CONSTRAINT, *PPERFINFO_PPM_THERMAL_CONSTRAINT;\n\n//\n// File Name related hooks\n//\n\ntypedef struct _PERFINFO_FILEOBJECT_INFORMATION\n{\n    PVOID FileObject;\n} PERFINFO_FILEOBJECT_INFORMATION, *PPERFINFO_FILEOBJECT_INFORMATION;\n\ntypedef struct _PERFINFO_FILENAME_SAME_INFORMATION\n{\n    PVOID OldFile;\n    PVOID NewFile;\n} PERFINFO_FILENAME_SAME_INFORMATION, *PPERFINFO_FILENAME_SAME_INFORMATION;\n\ntypedef struct _PERFINFO_PFMAPPED_SECTION_INFORMATION\n{\n    PVOID RangeBase;\n    PVOID RangeEnd;\n    ULONG CreatingProcessId;\n} PERFINFO_PFMAPPED_SECTION_INFORMATION, *PPERFINFO_PFMAPPED_SECTION_INFORMATION;\n\ntypedef struct _PERFINFO_PFMAPPED_SECTION_OBJECT_INFORMATION\n{\n    PVOID SectionObject;\n    PVOID RangeBase;\n} PERFINFO_PFMAPPED_SECTION_OBJECT_INFORMATION, *PPERFINFO_PFMAPPED_SECTION_OBJECT_INFORMATION;\n\n//\n// Sample profile\n//\ntypedef struct _PERFINFO_SAMPLED_PROFILE_INFORMATION\n{\n    PVOID InstructionPointer;\n    ULONG ThreadId;\n    USHORT Count;\n    union {\n        struct {\n            UCHAR ExecutingDpc : 1;\n            UCHAR ExecutingIsr : 1;\n            UCHAR Reserved : 1;\n            UCHAR Priority : 5;\n        } DUMMYSTRUCTNAME;\n        UCHAR Flags;\n    } DUMMYUNIONNAME;\n    UCHAR Rank;\n} PERFINFO_SAMPLED_PROFILE_INFORMATION, *PPERFINFO_SAMPLED_PROFILE_INFORMATION;\n\n#define  PERFINFO_SAMPLED_PROFILE_CACHE_MAX 20\ntypedef struct _PERFINFO_SAMPLED_PROFILE_CACHE\n{\n    ULONG Entries;\n    PERFINFO_SAMPLED_PROFILE_INFORMATION Sample[PERFINFO_SAMPLED_PROFILE_CACHE_MAX];\n} PERFINFO_SAMPLED_PROFILE_CACHE, *PPERFINFO_SAMPLED_PROFILE_CACHE;\n\ntypedef struct _PERFINFO_SAMPLED_PROFILE_CONFIG\n{\n    ULONG Source;\n    ULONG NewInterval;\n    ULONG OldInterval;\n} PERFINFO_SAMPLED_PROFILE_CONFIG, *PPERFINFO_SAMPLED_PROFILE_CONFIG;\n\ntypedef struct _PERFINFO_PMC_SAMPLE_INFORMATION\n{\n    PVOID InstructionPointer;\n    ULONG ThreadId;\n    USHORT ProfileSource;\n    USHORT Reserved;\n} PERFINFO_PMC_SAMPLE_INFORMATION, *PPERFINFO_PMC_SAMPLE_INFORMATION;\n\ntypedef struct _PERFINFO_DPC_INFORMATION\n{\n    ULONGLONG InitialTime;\n    PVOID DpcRoutine;\n} PERFINFO_DPC_INFORMATION, *PPERFINFO_DPC_INFORMATION;\n\ntypedef struct _PERFINFO_DPC_ENQUEUE_INFORMATION\n{\n    ULONG_PTR Key;\n    LONG DpcQueueDepth;\n    ULONG DpcCount;\n    ULONG TargetProcessorIndex;\n    UCHAR Importance;\n    UCHAR Reserved[3];\n} PERFINFO_DPC_ENQUEUE_INFORMATION, *PPERFINFO_DPC_ENQUEUE_INFORMATION;\n\ntypedef struct _PERFINFO_DPC_EXECUTION_INFORMATION\n{\n    PVOID DpcRoutine;\n    ULONG_PTR Key;\n} PERFINFO_DPC_EXECUTION_INFORMATION, *PPERFINFO_DPC_EXECUTION_INFORMATION;\n\ntypedef struct _PERFINFO_YIELD_PROCESSOR_INFORMATION\n{\n    ULONG YieldReason;\n    ULONG DpcWatchdogCount;\n    ULONG DpcTimeCount;\n} PERFINFO_YIELD_PROCESSOR_INFORMATION, *PPERFINFO_YIELD_PROCESSOR_INFORMATION;\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_INTERRUPT_INFORMATION\n{\n    ULONGLONG InitialTime;\n    PVOID ServiceRoutine;\n    UCHAR ReturnValue;\n    USHORT Vector;\n    UCHAR Reserved;\n} PERFINFO_INTERRUPT_INFORMATION, *PPERFINFO_INTERRUPT_INFORMATION;\n#include <poppack.h>\n\n#define PERFINFO_CLOCK_INTERRUPT_CLOCK_OWNER 0x0001\n#define PERFINFO_CLOCK_INTERRUPT_TIMER_PENDING 0x0008\n\ntypedef struct _PERFINFO_CLOCK_INTERRUPT_INFORMATION\n{\n    ULONG64 InterruptTime;\n    SHORT Flags;\n} PERFINFO_CLOCK_INTERRUPT_INFORMATION, *PPERFINFO_CLOCK_INTERRUPT_INFORMATION;\n\n#define PERFINFO_IPI_APC_REQUEST 0x1\n#define PERFINFO_IPI_DPC_REQUEST 0x2\n\n//\n// Spinlock\n//\n#include <pshpack1.h>\ntypedef struct _PERFINFO_SPINLOCK_CONFIG\n{\n    ULONG SpinLockSpinThreshold;\n    ULONG SpinLockContentionSampleRate;\n    ULONG SpinLockAcquireSampleRate;\n    ULONG SpinLockHoldThreshold;\n} PERFINFO_SPINLOCK_CONFIG, *PPERFINFO_SPINLOCK_CONFIG;\n#include <poppack.h>\n\n//\n// Stores Executive Resource sampling parameters.\n//\n//  Note: NumberOfExcessiveTimeouts uses counting units of 4 (four) seconds.\n//      It inherits the granularity of ExResourceTimeoutCount used in\n//      ...\\ntos\\ex\\resource.c.\n//      The later, takes a reg-key settable timeout with a default value of\n//      30 days used to trigger a debug spew for excessive waits on the checked\n//      builds: 648000 * 4 seconds = 2592000 seconds = 30 days.\n//\n//          HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\\n//          ResourceTimeoutCount (REG_DWORD), Default: 0x9E340 (648000)\n//\ntypedef struct _PERFINFO_EXECUTIVE_RESOURCE_CONFIG\n{\n    ULONG ReleaseSamplingRate;\n    ULONG ContentionSamplingRate;\n    ULONG NumberOfExcessiveTimeouts;\n} PERFINFO_EXECUTIVE_RESOURCE_CONFIG, *PPERFINFO_EXECUTIVE_RESOURCE_CONFIG;\n\n//\n// MM related hooks\n//\n\n#define NTWMI_BITSIZE(type) (sizeof(type) * 8)\n\ntypedef struct _PERFINFO_SESSIONCREATE_INFORMATION\n{\n    ULONG_PTR UniqueSessionId;\n    ULONG SessionId;\n} PERFINFO_SESSIONCREATE_INFORMATION, *PPERFINFO_SESSIONCREATE_INFORMATION;\n\ntypedef struct _PERFINFO_PAGE_RANGE_IDENTITY\n{\n    struct\n    {\n        ULONGLONG UseDescription : 4;       // MMPFNUSE_*\n        ULONGLONG UniqueKey : 48;           // Used for SessionVAs/AWE/LargePages.\n        ULONGLONG Reserved : 12;\n    };\n    union\n    {\n        PVOID ProtoPteAddress;              // Used for large page PFMapped sections.\n        ULONG_PTR PageFrameIndex;           // Used for DriverLocked/UserPhysical Mdls.\n        PVOID VirtualAddress;               // Used otherwise.\n    };\n    SIZE_T PageCount;                       // Number of pages.\n} PERFINFO_PAGE_RANGE_IDENTITY, *PPERFINFO_PAGE_RANGE_IDENTITY;\n\n#define PERFINFO_MM_KERNELMEMORY_USAGE_TYPE_BITS 5\n\ntypedef enum _PERFINFO_KERNELMEMORY_USAGE_TYPE\n{\n    PerfInfoMemUsagePfnMetadata,\n    PerfInfoMemUsageMax\n} PERFINFO_KERNELMEMORY_USAGE_TYPE, *PPERFINFO_KERNELMEMORY_USAGE_TYPE;\n\nC_ASSERT(PerfInfoMemUsageMax <= (1 << PERFINFO_MM_KERNELMEMORY_USAGE_TYPE_BITS));\n\ntypedef struct _PERFINFO_KERNELMEMORY_RANGE_USAGE\n{\n    ULONG UsageType : PERFINFO_MM_KERNELMEMORY_USAGE_TYPE_BITS;\n    ULONG Spare: (NTWMI_BITSIZE (ULONG) - PERFINFO_MM_KERNELMEMORY_USAGE_TYPE_BITS);\n    PVOID VirtualAddress;               // Starting VA (where meaningful).\n    SIZE_T PageCount;                   // Number of pages.\n} PERFINFO_KERNELMEMORY_RANGE_USAGE, *PPERFINFO_KERNELMEMORY_RANGE_USAGE;\n\n#define PERFINFO_MM_STAT_TYPE_BITS 6\n\ntypedef enum _PERFINFO_MM_STAT\n{\n    PerfInfoMMStatNotUsed,\n    PerfInfoMMStatAggregatePageCombine,\n    PerfInfoMMStatIterationPageCombine,\n    PerfInfoMMStatMax\n} PERFINFO_MM_STAT, *PPERFINFO_MM_STAT;\n\nC_ASSERT(PerfInfoMMStatMax <= (1 << PERFINFO_MM_STAT_TYPE_BITS));\n\n//\n// This is logged as part of the end rundown.\n// PerfTrack traces can be mined for this low-overhead information logged with\n// MemInfo classic.\n//\n\ntypedef struct _PERFINFO_PAGECOMBINE_AGGREGATE_STAT\n{\n    ULONG StatType : PERFINFO_MM_STAT_TYPE_BITS;   // Value one of PERFINFO_MM_STATS\n    ULONG Spare: (NTWMI_BITSIZE (ULONG) - PERFINFO_MM_STAT_TYPE_BITS);\n\n    //\n    // The following provide average stats for a scan.\n    //\n\n    ULONG CombineScanCount;\n    ULONGLONG PagesScanned;\n    ULONGLONG PagesCombined;\n\n    //\n    // These help compute the memory saved.\n    //\n\n    LONG CombinedBlocksInUse;                // Count of CombinedPTEs in use.\n    LONG SumCombinedBlocksReferenceCount;    // Sum of the referencecounts of combined PTEs.\n} PERFINFO_PAGECOMBINE_AGGREGATE_STAT, *PPERFINFO_PAGECOMBINE_AGGREGATE_STAT;\n\n//\n// This is logged subsequent to each combine scan. Logged with MemInfo classic.\n//\n\ntypedef struct _PERFINFO_PAGECOMBINE_ITERATION_STAT\n{\n    ULONG StatType : PERFINFO_MM_STAT_TYPE_BITS;   // Value of type PERFINFO_MM_STATS\n    ULONG Spare : (NTWMI_BITSIZE (ULONG) - PERFINFO_MM_STAT_TYPE_BITS);\n\n    ULONG PagesScanned;\n    ULONG PagesCombined;\n} PERFINFO_PAGECOMBINE_ITERATION_STAT, *PPERFINFO_PAGECOMBINE_ITERATION_STAT;\n\n//\n// NOTE: Hard Fault event starts with InitialTime (LARGE_INTEGER)\n//       not shown in the structure.\n//\n\ntypedef struct _PERFINFO_HARDPAGEFAULT_INFORMATION\n{\n    LARGE_INTEGER ReadOffset;\n    PVOID VirtualAddress;\n    PVOID FileObject;\n    ULONG ThreadId;\n    ULONG ByteCount;\n} PERFINFO_HARDPAGEFAULT_INFORMATION, *PPERFINFO_HARDPAGEFAULT_INFORMATION;\n\n//\n// The first four fields of this data structure mirror PROCESS_VIRTUAL_ALLOC_INFO.\n//\n\ntypedef struct _PERFINFO_VIRTUAL_ALLOC\n{\n    PVOID CapturedBase;\n    SIZE_T CapturedRegionSize;\n    ULONG ProcessId;\n    ULONG Flags;\n} PERFINFO_VIRTUAL_ALLOC, *PPERFINFO_VIRTUAL_ALLOC;\n\ntypedef struct _PERFINFO_VAD_ROTATE_INFO\n{\n    PVOID BaseAddress;\n    SIZE_T SizeInBytes;\n    union\n    {\n        struct\n        {\n            ULONG Direction : 4;\n            ULONG Spare : (NTWMI_BITSIZE (ULONG) - 4);\n        };\n        ULONG Flags;\n    };\n} PERFINFO_VAD_ROTATE_INFO, *PPERFINFO_VAD_ROTATE_INFO;\n\ntypedef enum _PERFINFO_MEM_RESET_INFO_TYPE\n{\n    PerfInfoMemReset,\n    PerfInfoMemResetUndo,\n    PerfInfoMemResetUndoFailed,\n    PerfInfoMemResetMax\n} PERFINFO_MEM_RESET_INFO_TYPE, *PPERFINFO_MEM_RESET_INFO_TYPE;\n\ntypedef struct _PERFINFO_MEM_RESET_INFO\n{\n    PVOID BaseAddress;\n    SIZE_T SizeInBytes;\n    union\n    {\n        struct\n        {\n            ULONG TypeInfo : 2;\n            ULONG Spare : (NTWMI_BITSIZE (ULONG) - 2);\n        };\n        ULONG Flags;\n    };\n} PERFINFO_MEM_RESET_INFO, *PPERFINFO_MEM_RESET_INFO;\n\n//\n// Cache manager\n//\n\n#define PERFINFO_CC_WORKQUEUE_FAST_TEARDOWN       0x000000001\n#define PERFINFO_CC_WORKQUEUE_EXPRESS             0x000000002\n#define PERFINFO_CC_WORKQUEUE_REGULAR             0x000000003\n#define PERFINFO_CC_WORKQUEUE_POST_TICK           0x000000004\n#define PERFINFO_CC_WORKQUEUE_ASYNC_READ          0x000000005\n#define PERFINFO_CC_WORKQUEUE_COMP_ASYNC_READ     0x000000006\n\ntypedef struct _PERFINFO_CC_WORKITEM_ENQUEUE\n{\n    ULONG_PTR WorkItemKey;\n    ULONG_PTR FileObjectKey;\n    UCHAR QueueType;\n    UCHAR WorkItemType;\n    BOOLEAN Requeue;\n    UCHAR Reserved;\n} PERFINFO_CC_WORKITEM_ENQUEUE, *PPERFINFO_CC_WORKITEM_ENQUEUE;\n\ntypedef struct _PERFINFO_CC_WORKITEM_DEQUEUE\n{\n    ULONG_PTR WorkItemKey;\n} PERFINFO_CC_WORKITEM_DEQUEUE, *PPERFINFO_CC_WORKITEM_DEQUEUE;\n\ntypedef struct _PERFINFO_CC_WORKITEM_COMPLETE\n{\n    ULONG_PTR WorkItemKey;\n} PERFINFO_CC_WORKITEM_COMPLETE, *PPERFINFO_CC_WORKITEM_COMPLETE;\n\n#define PERFINFO_CC_WORKITEM_TYPE_READAHEAD         0x000000001\n#define PERFINFO_CC_WORKITEM_TYPE_WRITEBEHIND       0x000000002\n#define PERFINFO_CC_WORKITEM_TYPE_LAZYWRITESCAN     0x000000003\n#define PERFINFO_CC_WORKITEM_TYPE_EVENT_SET         0x000000004\n\ntypedef struct _PERFINFO_CC_READ_AHEAD\n{\n    ULONG_PTR WorkItemKey;\n    ULONGLONG FileOffset;\n    ULONG Size;\n    ULONG PagePriority;\n    ULONG DetectedPattern;\n    ULONG Reserved;\n} PERFINFO_CC_READ_AHEAD_COMPLETE, *PPERFINFO_CC_READ_AHEAD_COMPLETE;\n\ntypedef struct _PERFINFO_CC_SCHEDULE_READ_AHEAD\n{\n    ULONG_PTR WorkItemKey;\n    ULONG_PTR FileObjectKey;\n    ULONGLONG FileOffset;                   //app read offset\n    ULONG Length;                           //app read length\n\n    ULONG ReadAheadUnit;\n    ULONG ReadAheadLength;\n    ULONGLONG ReadAheadOffset;\n    ULONGLONG ReadAheadBeyondLastByte;      //high water mark\n    UCHAR ReadPattern;\n    ULONG SequentialReadCount;\n    ULONG SharedCacheMapFlags;\n    ULONG ReadAheadSettingsChanged : 1;\n    ULONG ReadAheadActive : 1;\n} PERFINFO_CC_SCHEDULE_READ_AHEAD, *PPERFINFO_CC_SCHEDULE_READ_AHEAD;\n\ntypedef struct _PERFINFO_CC_LAZY_WRITE_SCAN\n{\n    ULONG_PTR WorkItemKey;\n    ULONG ReasonForFlush;\n    ULONG PagesToWrite;\n    SIZE_T TotalDirtyPages;\n    SIZE_T AvailablePages;\n    SIZE_T DirtyPageThreshold;\n    SIZE_T NumberOfMappedVacbs;\n    SIZE_T TopDirtyPageThreshold;\n    SIZE_T BottomDirtyPageThreshold;\n    SIZE_T AverageAvailablePages;\n    SIZE_T AverageDirtyPages;\n    SIZE_T ConsecutiveWorklessLazywriteScans;\n} PERFINFO_CC_LAZY_WRITE_SCAN, *PPERFINFO_CC_LAZY_WRITE_SCAN;\n\ntypedef struct _PERFINFO_CC_CAN_WRITE_FAIL\n{\n    ULONG_PTR FileObjectKey;\n    SIZE_T TotalDirtyPages;\n    SIZE_T DirtyPageThreshold;\n    ULONG BytesToWrite;\n} PERFINFO_CC_CAN_WRITE_FAIL, *PPERFINFO_CC_CAN_WRITE_FAIL;\n\ntypedef struct _PERFINFO_CC_FLUSH_SECTION\n{\n    ULONG_PTR WorkItemKey;\n    ULONG_PTR FileObjectKey;\n    ULONGLONG Offset;\n    ULONG Length;\n    ULONG MmFlushFlags;\n} PERFINFO_CC_FLUSH_SECTION, *PPERFINFO_CC_FLUSH_SECTION;\n\n#define PERFINFO_CC_FLUSH_DATA_IS_LAZY_WRITER       0x000000001\n#define PERFINFO_CC_FLUSH_DATA_FAST_LAZY_WRITE      0x000000002\n#define PERFINFO_CC_FLUSH_DATA_FORCE_FULL_FLUSH     0x000000004\n\n//\n//  Reason for lazy write scan\n//  Note: These SHOULD be the same values as Cc's corresponding\n//        reason codes in minkernel/ntos/inc/cache.h file.\n//\n\n#define PERFINFO_CC_NOTIFY_LOW_MEMORY               0x000000001\n#define PERFINFO_CC_NOTIFY_POWER                    0x000000002\n#define PERFINFO_CC_NOTIFY_PERIODIC_SCAN            0x000000004\n#define PERFINFO_CC_NOTIFY_WAITING_TEARDOWN         0x000000008\n#define PERFINFO_CC_NOTIFY_FLUSH_DURING_COALESCING  0x000000010\n\ntypedef struct _PERFINFO_CC_FLUSH_CACHE\n{\n    ULONG_PTR WorkItemKey;\n    ULONG_PTR FileObjectKey;\n    ULONGLONG Offset;\n    ULONG Length;\n    ULONG SharedCacheMapFlags;\n    ULONG Flags;\n    ULONG Reserved;\n} PERFINFO_CC_FLUSH_CACHE, *PPERFINFO_CC_FLUSH_CACHE;\n\ntypedef struct _PERFINFO_CC_LOGGED_STREAM_INFO\n{\n    ULONG_PTR FileObjectKey;\n    ULONG ReasonForFlush;\n    ULONG PagesToWrite;\n    SIZE_T DirtyLoggedPages;\n    SIZE_T DirtyLoggedPageThreshold;\n    LARGE_INTEGER LargestLsnForLWS;\n} PERFINFO_CC_LOGGED_STREAM_INFO, *PPERFINFO_CC_LOGGED_STREAM_INFO;\n\n//\n//  Thread Action being logged\n//\n\n#define PERFINFO_CC_EXTRA_WB_THREAD_ADD             0x000000001\n#define PERFINFO_CC_EXTRA_WB_THREAD_REMOVE          0x000000002\n\ntypedef struct _PERFINFO_CC_EXTRA_WB_THREAD_INFO\n{\n    ULONG ThreadAction;\n    ULONG ActiveExtraWBThreads;\n    SIZE_T TotalDirtyPages;\n    SIZE_T DirtyPageThreshold;\n    SIZE_T AvailablePages;\n} PERFINFO_CC_EXTRA_WB_THREAD_INFO, *PPERFINFO_CC_EXTRA_WB_THREAD_INFO;\n\n//\n// Image backed by pagefile event.\n//\n\ntypedef struct _PERFINFO_IMAGELOAD_IN_PAGEFILE_INFO\n{\n    PVOID FileObject;\n    ULONG DeviceCharacteristics;\n    USHORT FileCharacteristics;\n    union {\n        USHORT Flags;\n        struct {\n            USHORT ActiveDataReference : 1;\n            USHORT DeviceEjectable     : 1;\n            USHORT WritableHandles     : 1;\n        } DUMMYSTRUCTNAME;\n    } Flags;\n} PERFINFO_IMAGELOAD_IN_PAGEFILE_INFO, *PPERFINFO_IMAGELOAD_IN_PAGEFILE_INFO;\n\n//\n// System call events\n//\ntypedef struct _PERFINFO_SYSCALL_ENTER_DATA\n{\n    PVOID SysCallAddr;\n} PERFINFO_SYSCALL_ENTER_DATA, *PPERFINFO_SYSCALL_ENTER_DATA;\n\ntypedef struct _PERFINFO_SYSCALL_EXIT_DATA\n{\n    NTSTATUS ReturnValue;\n} PERFINFO_SYSCALL_EXIT_DATA, *PPERFINFO_SYSCALL_EXIT_DATA;\n\n//\n// SetMark\n//\ntypedef struct _PERFINFO_MARK_INFORMATION\n{\n    char Name[1];\n} PERFINFO_MARK_INFORMATION, *PPERFINFO_MARK_INFORMATION;\n\n//\n// File system operations.\n//\n// Since these are also logged using event descriptors, it is important to\n// watch padding in the structure due to alignment or specify the appropriate\n// pack pragma.\n//\n\ntypedef struct _PERFINFO_FILE_CREATE\n{\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG IssuingThreadId;\n    ULONG Options;\n    ULONG Attributes;\n    ULONG ShareAccess;\n    WCHAR OpenPath[1];\n} PERFINFO_FILE_CREATE, *PPERFINFO_FILE_CREATE;\n\ntypedef struct _PERFINFO_FILE_INFORMATION\n{\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG_PTR FileKey;\n    ULONG_PTR ExtraInformation;\n    ULONG IssuingThreadId;\n    ULONG InfoClass;\n} PERFINFO_FILE_INFORMATION, *PPERFINFO_FILE_INFORMATION;\n\ntypedef struct _PERFINFO_FILE_DIRENUM\n{\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG_PTR FileKey;\n    ULONG IssuingThreadId;\n    ULONG Length;\n    ULONG InfoClass;\n    ULONG FileIndex;\n    WCHAR FileName[1];\n} PERFINFO_FILE_DIRENUM, *PPERFINFO_FILE_DIRENUM;\n\ntypedef struct _PERFINFO_FILE_PATH_OPERATION\n{\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG_PTR FileKey;\n    ULONG_PTR ExtraInformation;\n    ULONG IssuingThreadId;\n    ULONG InfoClass;\n    WCHAR Path[1];\n} PERFINFO_FILE_PATH_OPERATION, *PPERFINFO_FILE_PATH_OPERATION;\n\n#include <pshpack1.h>\n\n#define PERFINFO_FILE_READ_WRITE_FLAG_MDL   0x1\n\ntypedef struct _PERFINFO_FILE_READ_WRITE\n{\n    ULONGLONG Offset;\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG_PTR FileKey;\n    ULONG IssuingThreadId;\n    ULONG Size;\n    ULONG Flags;\n    ULONG ExtraFlags;\n} PERFINFO_FILE_READ_WRITE, *PPERFINFO_FILE_READ_WRITE;\n\ntypedef struct _PERFINFO_FILE_SIMPLE_OPERATION\n{\n    ULONG_PTR Irp;\n    ULONG_PTR FileObject;\n    ULONG_PTR FileKey;\n    ULONG IssuingThreadId;\n} PERFINFO_FILE_SIMPLE_OPERATION, *PPERFINFO_FILE_SIMPLE_OPERATION;\n\ntypedef struct _PERFINFO_FILE_OPERATION_END\n{\n    ULONG_PTR Irp;\n    ULONG_PTR ExtraInformation;\n    NTSTATUS Status;\n} PERFINFO_FILE_OPERATION_END, *PPERFINFO_FILE_OPERATION_END;\n\ntypedef struct _PERFINFO_FLT_OPERATION\n{\n    PVOID RoutineAddr;\n    PVOID FileObject;\n    PVOID FsContext;\n    PVOID IrpPtr;\n    PVOID CbdPtr;\n    LONG MajorFunction;\n} PERFINFO_FLT_OPERATION, *PPERFINFO_FLT_OPERATION;\n\ntypedef struct _PERFINFO_FLT_OPERATION_STATUS\n{\n    PVOID RoutineAddr;\n    PVOID FileObject;\n    PVOID FsContext;\n    PVOID IrpPtr;\n    PVOID CbdPtr;\n    LONG MajorFunction;\n    NTSTATUS Status;\n} PERFINFO_FLT_OPERATION_STATUS, *PPERFINFO_FLT_OPERATION_STATUS;\n\n#include <poppack.h>\n//\n// MemInfo event. This structure should parallel SYSTEM_MEMORY_LIST_INFORMATION.\n//\n\n#define PERFINFO_PAGE_PRIORITY_LEVELS           8\n\ntypedef struct _PERFINFO_MEMORY_INFORMATION\n{\n    SIZE_T ZeroPageCount;\n    SIZE_T FreePageCount;\n    SIZE_T ModifiedPageCount;\n    SIZE_T ModifiedNoWritePageCount;\n    SIZE_T BadPageCount;\n    SIZE_T PageCountByPriority[PERFINFO_PAGE_PRIORITY_LEVELS];\n    SIZE_T RepurposedPagesByPriority[PERFINFO_PAGE_PRIORITY_LEVELS];\n    SIZE_T ModifiedPageCountPageFile;\n} PERFINFO_MEMORY_INFORMATION, *PPERFINFO_MEMORY_INFORMATION;\n\ntypedef struct _PERFINFO_SYSTEM_MEMORY_INFORMATION\n{\n    SIZE_T PagedPoolCommitPageCount;\n    SIZE_T NonPagedPoolPageCount;\n    SIZE_T MdlPageCount;\n    SIZE_T CommitPageCount;\n} PERFINFO_SYSTEM_MEMORY_INFORMATION, *PPERFINFO_SYSTEM_MEMORY_INFORMATION;\n\n//\n// Used for MemInfoWS/MemInfoSessionWs event.\n//\n\n#include <pshpack1.h>\ntypedef struct _PERFINFO_WORKINGSET_ENTRY\n{\n    union\n    {\n        ULONG UniqueProcessId;\n        ULONG SessionId;\n    };\n    SIZE_T WorkingSetPageCount;\n    SIZE_T CommitPageCount;\n    union\n    {\n        SIZE_T PagedPoolPageCount;       // Used for SessionWs.\n        SIZE_T VirtualSizeInPages;       // Used for ProcessWs.\n    };\n    SIZE_T PrivateWorkingSetPageCount;\n    SIZE_T StoreSizeInPages;\n    SIZE_T StoredPageCount;\n    SIZE_T CommitDebtInPages;\n    SIZE_T SharedCommitInPages;\n} PERFINFO_WORKINGSET_ENTRY, *PPERFINFO_WORKINGSET_ENTRY;\n\ntypedef struct _PERFINFO_WORKINGSET_INFORMATION\n{\n    ULONG Count;\n    PERFINFO_WORKINGSET_ENTRY WsEntry[1];\n} PERFINFO_WORKINGSET_INFORMATION, *PPERFINFO_WORKINGSET_INFORMATION;\n#include <poppack.h>\n\n//\n// Contiguous page generation event.\n//\ntypedef struct _PERFINFO_CONTIGUOUS_PAGE_GENERATE\n{\n    ULONGLONG ThreadId;\n    ULONGLONG NumberOfBytes;\n} PERFINFO_CONTIGUOUS_PAGE_GENERATE, *PPERFINFO_CONTIGUOUS_PAGE_GENERATE;\n\n//\n// Debugger (debug event) events\n//\ntypedef enum _PERFINFO_DEBUG_EVENT_REASON\n{\n    PerfInfoDebugEventReceived = 1,\n    PerfInfoDebugEventContinued,\n    PerfInfoDebugEventMax\n} PERFINFO_DEBUG_EVENT_REASON, *PPERFINFO_DEBUG_EVENT_REASON;\n\ntypedef struct _PERFINFO_DEBUG_EVENT\n{\n    ULONG ProcessId;\n    ULONG ThreadId;\n    PERFINFO_DEBUG_EVENT_REASON Reason;\n} PERFINFO_DEBUG_EVENT, *PPERFINFO_DEBUG_EVENT;\n\n//\n// Compressed Context Swap events\n//\n\n/*\n\n    1) packets of 2- 4- and 8-byte are used to store context switch event\n       according to the content of the event. (cf. ccswap.c)\n    2) a local cache of thread ids and the base priorities are stored in each\n       buffer so that a short index can be used to log the thread id of the\n       switching-out thread.\n\n*/\n\n//\n// Number of bits allocated for the necessary fields:\n//\n#define PERFINFO_CCSWAP_BIT_TYPE        2   // packet type\n#define PERFINFO_CCSWAP_BIT_TID         4   // size of the tid table\n#define PERFINFO_CCSWAP_BIT_STATE_WR    6   // store state+wait reason\n#define PERFINFO_CCSWAP_BIT_PRIORITY    5   // full priority in 'full' packet\n#define PERFINFO_CCSWAP_BIT_PRI_INC     3   // priority increment in 'lite' packet\n\n//\n// The following are the number of bits left after allocating bits for\n// the necessary fields.  These bits are used to store time deltas.  If the\n// value of a time delta is too big for a short format, the longer format\n// is used.\n//\n\n#define PERFINFO_CCSWAP_BIT_FULL_TS     30\nC_ASSERT (PERFINFO_CCSWAP_BIT_FULL_TS == (32 - PERFINFO_CCSWAP_BIT_TYPE));\n\n#define PERFINFO_CCSWAP_BIT_SHORT_TS    14\nC_ASSERT(PERFINFO_CCSWAP_BIT_SHORT_TS == (16 - PERFINFO_CCSWAP_BIT_TYPE));\n\n#define PERFINFO_CCSWAP_BIT_SMALL_TS    17\nC_ASSERT (PERFINFO_CCSWAP_BIT_SMALL_TS ==\n          (32 - PERFINFO_CCSWAP_BIT_TYPE - PERFINFO_CCSWAP_BIT_TID - PERFINFO_CCSWAP_BIT_PRI_INC - PERFINFO_CCSWAP_BIT_STATE_WR));\n\n#define PERFINFO_CCSWAP_BIT_WAIT_TIME   17\nC_ASSERT (PERFINFO_CCSWAP_BIT_WAIT_TIME ==\n          (32 - PERFINFO_CCSWAP_BIT_TID - PERFINFO_CCSWAP_BIT_STATE_WR - PERFINFO_CCSWAP_BIT_PRIORITY));\n\n//\n// size of the tid table:\n//\n#define PERFINFO_CCSWAP_MAX_TID         (1<<PERFINFO_CCSWAP_BIT_TID)\n\n//\n// the packet type. it must fit into the bit-field of the length\n// PERFINFO_CCSWAP_BIT_TYPE\n//\ntypedef enum _PERFINFO_CCSWAP_TYPE\n{\n    PerfCSwapIdleShort,\n    PerfCSwapIdle,\n    PerfCSwapLite,\n    PerfCSwapFull\n} PERFINFO_CCSWAP_TYPE;\n\n//\n// Compact context switch buffer structure:\n//\n//    0 +-----------------------------------+\n//      | First Time Stamp                  |\n//      |                                   |\n//    8 |-----------------------------------|\n//      | 16 entry thread id table          |\n//        ...\n//      |                                   |\n//   72 |-----------------------------------|\n//      | 16 entry base priority table      |\n//      |                                   |\n//   88 |-----------------------------------|\n//      | variable-length data packets      |\n//        ...\n//\n//\ntypedef struct _PERFINFO_CCSWAP_BUFFER\n{\n    LONGLONG FirstTimeStamp;\n    ULONG   TidTable[PERFINFO_CCSWAP_MAX_TID];\n    SCHAR   ThreadBasePriority[PERFINFO_CCSWAP_MAX_TID];\n} PERFINFO_CCSWAP_BUFFER, *PPERFINFO_CCSWAP_BUFFER;\n\n//\n// 2 byte PerfCSwapIdleShort data: Idle thread switching out with small time delta\n//\n//  0  2              15\n//  |--|--------------|\n// type|short time delta\n//\n\ntypedef struct _PERFINFO_CCSWAP_IDLE_SHORT\n{\n    USHORT  DataType            : PERFINFO_CCSWAP_BIT_TYPE;\n    USHORT  TimeDelta           : PERFINFO_CCSWAP_BIT_SHORT_TS;\n} PERFINFO_CCSWAP_IDLE_SHORT, *PPERFINFO_CCSWAP_IDLE_SHORT;\n\n//\n// 4 byte PerfCSwapIdle data: Idle thread switching out with large time delta\n//\n//  0  2                              32\n//  |--|------------------------------|\n// type| full time delta\n//\n\ntypedef struct _PERFINFO_CCSWAP_IDLE\n{\n    ULONG   DataType            : PERFINFO_CCSWAP_BIT_TYPE;\n    ULONG   TimeDelta           : PERFINFO_CCSWAP_BIT_FULL_TS;\n} PERFINFO_CCSWAP_IDLE, *PPERFINFO_CCSWAP_IDLE;\n\n//\n// 4 byte PerfCSwapLite data: Non-idle thread with no wait time, and priority\n// increment from base less than 8\n//\n//  0  2    6   9      15                32\n//  |--|----|---|------|-----------------|\n// type|tid |pri|st+wr |time delta\n//\n\ntypedef struct _PERFINFO_CCSWAP_LITE\n{\n    ULONG   DataType            : PERFINFO_CCSWAP_BIT_TYPE;\n    ULONG   OldThreadIdIndex    : PERFINFO_CCSWAP_BIT_TID;\n    ULONG   OldThreadPriInc     : PERFINFO_CCSWAP_BIT_PRI_INC;\n    ULONG   OldThreadStateWr    : PERFINFO_CCSWAP_BIT_STATE_WR;\n    ULONG   TimeDelta           : PERFINFO_CCSWAP_BIT_SMALL_TS;\n} PERFINFO_CCSWAP_LITE, *PPERFINFO_CCSWAP_LITE;\n\n//\n// 8 byte PerfCSwapFull data: all others.\n//\n//  0                                 32   36     42    47                64\n//  |--|------------------------------|----|------|-----|-----------------|\n// type| full time delta              |tid |st+wr |pri. | wait time\n//\n\ntypedef struct _PERFINFO_CCSWAP\n{\n    ULONG   DataType            : PERFINFO_CCSWAP_BIT_TYPE;\n    ULONG   TimeDelta           : PERFINFO_CCSWAP_BIT_FULL_TS;\n    ULONG   OldThreadIdIndex    : PERFINFO_CCSWAP_BIT_TID;\n    ULONG   OldThreadStateWr    : PERFINFO_CCSWAP_BIT_STATE_WR;\n    ULONG   OldThreadPriority   : PERFINFO_CCSWAP_BIT_PRIORITY;\n    ULONG   NewThreadWaitTime   : PERFINFO_CCSWAP_BIT_WAIT_TIME;\n} PERFINFO_CCSWAP, *PPERFINFO_CCSWAP;\n\n//\n// Process Perf Counters\n//\n\ntypedef struct _PERFINFO_PROCESS_PERFCTR\n{\n    ULONG  ProcessId;\n    ULONG  PageFaultCount;\n    ULONG  HandleCount;\n    ULONG  Reserved;\n\n    SIZE_T PeakVirtualSize;\n    SIZE_T PeakWorkingSetSize;\n    SIZE_T PeakPagefileUsage;\n    SIZE_T QuotaPeakPagedPoolUsage;\n    SIZE_T QuotaPeakNonPagedPoolUsage;\n\n    SIZE_T VirtualSize;\n    SIZE_T WorkingSetSize;\n    SIZE_T PagefileUsage;\n    SIZE_T QuotaPagedPoolUsage;\n    SIZE_T QuotaNonPagedPoolUsage;\n    SIZE_T PrivatePageCount;\n\n} PERFINFO_PROCESS_PERFCTR, *PPERFINFO_PROCESS_PERFCTR;\n\n//\n// Process Perf Counters structures defined for cross platform post processing.\n//\ntypedef struct _PERFINFO_PROCESS_PERFCTR32\n{\n    ULONG ProcessId;\n    ULONG PageFaultCount;\n    ULONG HandleCount;\n    ULONG Reserved;\n\n    ULONG32 PeakVirtualSize;\n    ULONG32 PeakWorkingSetSize;\n    ULONG32 PeakPagefileUsage;\n    ULONG32 QuotaPeakPagedPoolUsage;\n    ULONG32 QuotaPeakNonPagedPoolUsage;\n\n    ULONG32 VirtualSize;\n    ULONG32 WorkingSetSize;\n    ULONG32 PagefileUsage;\n    ULONG32 QuotaPagedPoolUsage;\n    ULONG32 QuotaNonPagedPoolUsage;\n    ULONG32 PrivatePageCount;\n\n} PERFINFO_PROCESS_PERFCTR32, *PPERFINFO_PROCESS_PERFCTR32;\n\ntypedef struct _PERFINFO_PROCESS_PERFCTR64\n{\n    ULONG ProcessId;\n    ULONG PageFaultCount;\n    ULONG HandleCount;\n    ULONG Reserved;\n\n    ULONG64 PeakVirtualSize;\n    ULONG64 PeakWorkingSetSize;\n    ULONG64 PeakPagefileUsage;\n    ULONG64 QuotaPeakPagedPoolUsage;\n    ULONG64 QuotaPeakNonPagedPoolUsage;\n\n    ULONG64 VirtualSize;\n    ULONG64 WorkingSetSize;\n    ULONG64 PagefileUsage;\n    ULONG64 QuotaPagedPoolUsage;\n    ULONG64 QuotaNonPagedPoolUsage;\n    ULONG64 PrivatePageCount;\n\n} PERFINFO_PROCESS_PERFCTR64, *PPERFINFO_PROCESS_PERFCTR64;\n\n//\n// Process In Swap structure.\n//\n\ntypedef struct _PERFINFO_PROCESS_INSWAP\n{\n    ULONG_PTR DirectoryTableBase;\n    ULONG ProcessId;\n} PERFINFO_PROCESS_INSWAP, *PPERFINFO_PROCESS_INSWAP;\n\n//\n// I/O Timer structure.\n//\n\ntypedef struct _PERFINFO_IO_TIMER\n{\n    PVOID DeviceObject;\n    PVOID RoutineAddress;\n} PERFINFO_IO_TIMER, *PPERFINFO_IO_TIMER;\n\n//\n// Keywords for Kernel Tracelogging Process Provider.\n//\n\n#define TLG_KERNEL_PSPROV_KEYWORD_PROCESS   0x00000001\n#define TLG_KERNEL_PSPROV_KEYWORD_UTC       0x00000002\n\n//\n// Logger configuration and running statistics. This structure is used\n//\n\ntypedef struct _WMI_LOGGER_INFORMATION\n{\n    WNODE_HEADER Wnode;                 // Had to do this since wmium.h comes later\n    ULONG BufferSize;                   // buffer size for logging (in kbytes)\n    ULONG MinimumBuffers;               // minimum to preallocate\n    ULONG MaximumBuffers;               // maximum buffers allowed\n    ULONG MaximumFileSize;              // maximum logfile size (in MBytes)\n    ULONG LogFileMode;                  // sequential, circular\n    ULONG FlushTimer;                   // buffer flush timer, in seconds\n    ULONG EnableFlags;                  // trace enable flags\n    union\n    {\n        LONG  AgeLimit;                 // aging decay time, in minutes\n        LONG FlushThreshold;            // Number of buffers to fill before flushing\n    } DUMMYUNIONNAME;\n    ULONG Wow;                          // TRUE if the logger started under WOW64\n    union\n    {\n        HANDLE  LogFileHandle;          // handle to logfile\n        ULONG64 LogFileHandle64;\n    } DUMMYUNIONNAME2;\n    union\n    {\n        ULONG NumberOfBuffers;          // no of buffers in use\n        ULONG InstanceCount;            // Number of Provider Instances\n    } DUMMYUNIONNAME3;\n    union\n    {\n        ULONG FreeBuffers;              // no of buffers free\n        ULONG InstanceId;               // Current Provider's Id for UmLogger\n    } DUMMYUNIONNAME4;\n    union\n    {\n        ULONG EventsLost;               // event records lost\n        ULONG NumberOfProcessors;       // Passed on to UmLogger\n    } DUMMYUNIONNAME5;\n    ULONG BuffersWritten;               // no of buffers written to file\n    union\n    {\n        ULONG LogBuffersLost;           // no of logfile write failures\n        ULONG Flags;                    // internal flags\n    } DUMMYUNIONNAME6;\n\n    ULONG RealTimeBuffersLost;          // no of rt delivery failures\n    union\n    {\n        HANDLE  LoggerThreadId;         // thread id of Logger\n        ULONG64 LoggerThreadId64;       // thread is of Logger\n    } DUMMYUNIONNAME7;\n    union\n    {\n        UNICODE_STRING LogFileName;     // used only in WIN64\n        UNICODE_STRING64 LogFileName64; // Logfile name: only in WIN32\n    } DUMMYUNIONNAME8;\n\n    // mandatory data provided by caller\n    union\n    {\n        UNICODE_STRING LoggerName;      // Logger instance name in WIN64\n        UNICODE_STRING64 LoggerName64;  // Logger Instance name in WIN32\n    } DUMMYUNIONNAME9;\n\n    ULONG RealTimeConsumerCount;        // Number of rt consumers\n    ULONG SpareUlong;\n\n    union\n    {\n        PVOID   LoggerExtension;\n        ULONG64 LoggerExtension64;\n    } DUMMYUNIONNAME10;\n} WMI_LOGGER_INFORMATION, *PWMI_LOGGER_INFORMATION;\n\n#define ETW_SYSTEM_EVENT_VERSION_MASK        0x000000FF\n#define ETW_GET_SYSTEM_EVENT_VERSION(X)      ((X) & ETW_SYSTEM_EVENT_VERSION_MASK)\n\n#define ETW_SYSTEM_EVENT_V1                  0x000000001\n#define ETW_SYSTEM_EVENT_V2                  0x000000002\n#define ETW_SYSTEM_EVENT_V3                  0x000000003\n#define ETW_SYSTEM_EVENT_V4                  0x000000004\n#define ETW_SYSTEM_EVENT_V5                  0x000000005\n#define ETW_SYSTEM_EVENT_V6                  0x000000006\n\n//\n// Following flags denotes what Fields actually contains\n//\n#define ETW_NT_TRACE_TYPE_MASK               0x0000FF00\n\n#define ETW_NT_FLAGS_TRACE_HEADER            0x00000100   // Event Trace Header (Old)\n#define ETW_NT_FLAGS_TRACE_MESSAGE           0x00000200   // Trace Message\n#define ETW_NT_FLAGS_TRACE_EVENT             0x00000300   // Event Header (New)\n#define ETW_NT_FLAGS_TRACE_SYSTEM            0x00000400   // Events using SystemHeader\n#define ETW_NT_FLAGS_TRACE_SECURITY          0x00000500   // Events from security provider (LSA)\n#define ETW_NT_FLAGS_TRACE_MARK              0x00000600   // Mark to KernelLogger or CKCL\n#define ETW_NT_FLAGS_TRACE_EVENT_NOREG       0x00000700   // Event Header without registration handle\n#define ETW_NT_FLAGS_TRACE_INSTANCE          0x00000800   // Event Instance Header (Old)\n\n#define ETW_NT_FLAGS_USE_NATIVE_HEADER       0x40000000   // Use native header for WOW64\n#define ETW_NT_FLAGS_WOW64_CALL              0x80000000   // For use by WOW (Internal)\n\n#define ETW_NT_FLAGS_TRACE_RUNDOWN_V2 (ETW_NT_FLAGS_TRACE_SYSTEM_V2 | ETW_NT_FLAGS_USE_NATIVE_HEADER)  // Rundown and SysConfig events\n#define ETW_NT_FLAGS_TRACE_RUNDOWN_V3 (ETW_NT_FLAGS_TRACE_SYSTEM_V3 | ETW_NT_FLAGS_USE_NATIVE_HEADER)  // Rundown and SysConfig events\n#define ETW_NT_FLAGS_TRACE_RUNDOWN_V4 (ETW_NT_FLAGS_TRACE_SYSTEM_V4 | ETW_NT_FLAGS_USE_NATIVE_HEADER)  // Rundown and SysConfig events\n#define ETW_NT_FLAGS_TRACE_RUNDOWN_V5 (ETW_NT_FLAGS_TRACE_SYSTEM_V5 | ETW_NT_FLAGS_USE_NATIVE_HEADER)  // Rundown and SysConfig events\n\n#define ETW_NT_FLAGS_TRACE_RUNDOWN           ETW_NT_FLAGS_TRACE_RUNDOWN_V2\n\n//\n// Flags used to control stack tracing when logging system\n// events from user mode (e.g. Heap, CritSect, ThreadPool)\n//\n#define ETW_USER_FRAMES_TO_SKIP_MASK         0x000F0000\n#define ETW_USER_FRAMES_TO_SKIP_SHIFT        16\n\n#define ETW_SKIP_USER_FRAMES(X)              ((X) << ETW_USER_FRAMES_TO_SKIP_SHIFT)\n#define ETW_USER_EVENT_WITH_STACKWALK(X)     (ETW_NT_FLAGS_TRACE_SYSTEM_V2| ETW_SKIP_USER_FRAMES(X))\n\n#define ETW_NT_FLAGS_TRACE_SYSTEM_V1         (ETW_NT_FLAGS_TRACE_SYSTEM | ETW_SYSTEM_EVENT_V1)\n#define ETW_NT_FLAGS_TRACE_SYSTEM_V2         (ETW_NT_FLAGS_TRACE_SYSTEM | ETW_SYSTEM_EVENT_V2)\n#define ETW_NT_FLAGS_TRACE_SYSTEM_V3         (ETW_NT_FLAGS_TRACE_SYSTEM | ETW_SYSTEM_EVENT_V3)\n#define ETW_NT_FLAGS_TRACE_SYSTEM_V4         (ETW_NT_FLAGS_TRACE_SYSTEM | ETW_SYSTEM_EVENT_V4)\n#define ETW_NT_FLAGS_TRACE_SYSTEM_V5         (ETW_NT_FLAGS_TRACE_SYSTEM | ETW_SYSTEM_EVENT_V5)\n\n// Constants for UMGL (User Mode Global Logging).\n//\n// N.B. There is enough space reserved in UserSharedData\n//      to support up to 16 providers, but to avoid needless\n//      scanning MAX_PROVIDERS constant is currently set to 8.\n//\n// N.B. Heap and CritSec providers can be controlled with IFEO\n//      making the indexes fixed.\n#define ETW_UMGL_INDEX_HEAP             0\n#define ETW_UMGL_INDEX_CRITSEC          1\n#define ETW_UMGL_INDEX_LDR              2\n#define ETW_UMGL_INDEX_THREAD_POOL      3\n#define ETW_UMGL_INDEX_HEAPRANGE        4\n#define ETW_UMGL_INDEX_HEAPSUMMARY      5\n#define ETW_UMGL_INDEX_UMS              6\n#define ETW_UMGL_INDEX_WNF              7\n#define ETW_UMGL_INDEX_THREAD           8\n#define ETW_UMGL_INDEX_SPARE2           9\n#define ETW_UMGL_INDEX_SPARE3           10\n#define ETW_UMGL_INDEX_SPARE4           11\n#define ETW_UMGL_INDEX_SPARE5           12\n#define ETW_UMGL_INDEX_SPARE6           13\n#define ETW_UMGL_INDEX_SPARE7           14\n#define ETW_UMGL_INDEX_SPARE8           15\n\n#define ETW_UMGL_MAX_PROVIDERS          9\n\ntypedef struct _ETW_UMGL_KEY\n{\n    UCHAR LoggerId;\n    UCHAR Flags;\n} ETW_UMGL_KEY, *PETW_UMGL_KEY;\n\n#define UMGL_LOGGER_ID(Index)               (((PETW_UMGL_KEY)(&USER_SHARED_DATA->UserModeGlobalLogger[Index]))->LoggerId)\n#define UMGL_LOGGER_FLAGS(Index)            (((PETW_UMGL_KEY)(&USER_SHARED_DATA->UserModeGlobalLogger[Index]))->Flags)\n#define IS_UMGL_LOGGING_ENABLED(Index)      (UMGL_LOGGER_ID(Index) != 0)\n#define IS_UMGL_FLAG_ENABLED(Index, Flag)   ((UMGL_LOGGER_FLAGS(Index) & Flag) != 0)\n\n#define IS_HEAP_LOGGING_ENABLED()           (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_HEAP) && (NtCurrentPeb()->HeapTracingEnabled != FALSE))\n#define IS_HEAP_RANGE_LOGGING_ENABLED()     (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_HEAPRANGE))\n#define HEAP_LOGGER_ID                      (UMGL_LOGGER_ID(ETW_UMGL_INDEX_HEAP))\n\n#define IS_CRITSEC_LOGGING_ENABLED()        (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_CRITSEC) && (NtCurrentPeb()->CritSecTracingEnabled != FALSE))\n#define CRITSEC_LOGGER_ID                   (UMGL_LOGGER_ID(ETW_UMGL_INDEX_CRITSEC))\n#define IS_LOADER_LOGGING_ENABLED_FLAG(Flag) (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_LDR) && ((UMGL_LOGGER_FLAGS(ETW_UMGL_INDEX_LDR) & Flag) != 0) )\n#define IS_PER_PROCESS_LOADER_LOGGING_ENABLED_FLAG(Flag) (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_LDR) && (NtCurrentPeb()->LibLoaderTracingEnabled != FALSE) && ((UMGL_LOGGER_FLAGS(ETW_UMGL_INDEX_LDR) & Flag) != 0) )\n#define IS_GLOBAL_LOADER_LOGGING_ENABLED()  (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_LDR))\n#define LOADER_LOGGER_ID                    (UMGL_LOGGER_ID(ETW_UMGL_INDEX_LDR))\n#define HEAPRANGE_LOGGER_ID                 (UMGL_LOGGER_ID(ETW_UMGL_INDEX_HEAPRANGE))\n#define IS_THREAD_POOL_LOGGING_ENABLED()    (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_THREAD_POOL))\n#define THREAD_POOL_LOGGER_ID               (UMGL_LOGGER_ID(ETW_UMGL_INDEX_THREAD_POOL))\n#define IS_UMS_LOGGING_ENABLED()            (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_UMS))\n#define UMS_LOGGER_ID                       (UMGL_LOGGER_ID(ETW_UMGL_INDEX_UMS))\n#define HEAPSUMMARY_LOGGER_ID               (UMGL_LOGGER_ID(ETW_UMGL_INDEX_HEAPSUMMARY))\n#define IS_HEAPSUMMARY_LOGGING_ENABLED()    (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_HEAPSUMMARY))\n#define WNF_LOGGER_ID                       (UMGL_LOGGER_ID(ETW_UMGL_INDEX_WNF))\n#define IS_WNF_LOGGING_ENABLED()            (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_WNF))\n#define UMGL_THREAD_LOGGER_ID               (UMGL_LOGGER_ID(ETW_UMGL_INDEX_THREAD))\n#define IS_UMGL_THREAD_LOGGING_ENABLED()    (IS_UMGL_LOGGING_ENABLED(ETW_UMGL_INDEX_THREAD))\n\n//\n// Flags used by user mode loader logging to UMGL.\n//\n#define ETW_UMGL_LDR_MUI_VERBOSE_FLAG 0x0001\n#define ETW_UMGL_LDR_MUI_TEST_FLAG    0x0002\n#define ETW_UMGL_LDR_RELOCATION_FLAG  0x0004\n#define ETW_UMGL_LDR_NEW_DLL_FLAG   0x0010\n#define ETW_UMGL_LDR_TEST_FLAG      0x0020\n#define ETW_UMGL_LDR_SECURITY_FLAG  0x0040\n\n//\n// Constants for heap log\n//\n#define MEMORY_FROM_LOOKASIDE                   1       //Activity from LookAside\n#define MEMORY_FROM_LOWFRAG                     2       //Activity from Low Frag Heap\n#define MEMORY_FROM_MAINPATH                    3       //Activity from Main Code Path\n#define MEMORY_FROM_SLOWPATH                    4       //Activity from Slow C\n#define MEMORY_FROM_INVALID                     5\n#define MEMORY_FROM_SEGMENT_HEAP                6       //Activity from segment heap.\n\n#define EVENT_HEADER_EVENT64      ((USHORT)(((TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE) >> 16) | TRACE_HEADER_TYPE_EVENT_HEADER64))\n#define EVENT_HEADER_EVENT32      ((USHORT)(((TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE) >> 16) | TRACE_HEADER_TYPE_EVENT_HEADER32))\n#define EVENT_HEADER_ERROR        ((USHORT)(((TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE) >> 16) | TRACE_HEADER_TYPE_ERROR))\n#define TRACE_HEADER_FULL32       (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_FULL_HEADER32 << 16))\n#define TRACE_HEADER_FULL64       (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_FULL_HEADER64 << 16))\n#define TRACE_HEADER_INSTANCE32   (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_INSTANCE32 << 16))\n#define TRACE_HEADER_INSTANCE64   (TRACE_HEADER_FLAG | TRACE_HEADER_EVENT_TRACE | (TRACE_HEADER_TYPE_INSTANCE64 << 16))\n\n#ifdef _WIN64\n#define EVENT_HEADER_EVENT      EVENT_HEADER_EVENT64\n#define TRACE_HEADER_FULL       TRACE_HEADER_FULL64\n#define TRACE_HEADER_INSTANCE   TRACE_HEADER_INSTANCE64\n#else\n#define EVENT_HEADER_EVENT      EVENT_HEADER_EVENT32\n#define TRACE_HEADER_FULL       TRACE_HEADER_FULL32\n#define TRACE_HEADER_INSTANCE   TRACE_HEADER_INSTANCE32\n#endif\n\n#define PREPARE_ETW_TRACE_HEADER_GUID(Header, EventStruct, EventType, EventGuid, LoggerId) \\\n    (Header)->Size = sizeof(EventStruct); \\\n    (Header)->Class.Type = (EventType); \\\n    RtlCopyMemory(&((Header)->Guid), (EventGuid), sizeof(*(EventGuid))); \\\n\n// Used with OpenTrace(), prevents conversion of TimeStamps to UTC\n#define EVENT_TRACE_USE_RAWTIMESTAMP 0x00000002\n// Used with OpenTrace(), retrieves event from file as is.\n#define EVENT_TRACE_GET_RAWEVENT 0x00000100\n// Used with OpenTrace() to ReadBehind a live logger session.\n#define EVENT_TRACE_READ_BEHIND 0x00000200\n// Used in EventCallbacks to indicate that the InstanceId field is a sequence number.\n#define EVENT_TRACE_USE_SEQUENCE  0x0004\n// Kernel Event Version is used to indicate if any kernel event has changed.\n#define ETW_KERNEL_EVENT_VERSION 60\n\ntypedef struct _ETW_KERNEL_HEADER_EXTENSION\n{\n    PERFINFO_GROUPMASK GroupMasks;\n    ULONG Version;\n} ETW_KERNEL_HEADER_EXTENSION, *PETW_KERNEL_HEADER_EXTENSION;\n\n#define ETW_SET_MARK_WITH_FLUSH 0x00000001\n\ntypedef struct _ETW_SET_MARK_INFORMATION\n{\n    ULONG Flag;\n    WCHAR Mark[1];\n} ETW_SET_MARK_INFORMATION, *PETW_SET_MARK_INFORMATION;\n\n//\n// Data Block structure for ETW notification\n//\ntypedef enum _ETW_NOTIFICATION_TYPE\n{\n    EtwNotificationTypeNoReply = 1,     // No data block reply\n    EtwNotificationTypeLegacyEnable,    // Enable notification for RegisterTraceGuids\n    EtwNotificationTypeEnable,          // Enable notification for EventRegister\n    EtwNotificationTypePrivateLogger,   // Private logger notification for ETW\n    EtwNotificationTypePerflib,         // PERFLIB V2 counter data request/delivery block\n    EtwNotificationTypeAudio,           // Private notification for audio policy\n    EtwNotificationTypeSession,         // Session related ETW notifications\n    EtwNotificationTypeReserved,        // For internal use (test)\n    EtwNotificationTypeCredentialUI,    // Private notification for media center elevation detection\n    EtwNotificationTypeInProcSession,   // Private in-proc session related ETW notifications\n    EtwNotificationTypeMax\n} ETW_NOTIFICATION_TYPE;\n\n#define ETW_MAX_DATA_BLOCK_BUFFER_SIZE (65536)\n\ntypedef struct _ETW_NOTIFICATION_HEADER\n{\n    ETW_NOTIFICATION_TYPE NotificationType; // Notification type\n    ULONG                 NotificationSize; // Notification size in bytes\n    ULONG                 Offset;           // Offset to the next notification\n    BOOLEAN               ReplyRequested;   // Reply Requested\n    ULONG                 Timeout;          // Timeout in milliseconds when requesting reply\n    union\n    {\n        ULONG             ReplyCount;       // Out to sender: the number of notifications sent\n        ULONG             NotifyeeCount;    // Out to notifyee: the order during notification\n    };\n    ULONGLONG             Reserved2;\n    ULONG                 TargetPID;\n    ULONG                 SourcePID;\n    GUID                  DestinationGuid;  // Destination GUID\n    GUID                  SourceGuid;       // Source GUID\n} ETW_NOTIFICATION_HEADER, *PETW_NOTIFICATION_HEADER;\n\ntypedef ULONG (NTAPI *PETW_NOTIFICATION_CALLBACK)(\n    _In_ PETW_NOTIFICATION_HEADER NotificationHeader,\n    _In_ PVOID Context\n    );\n\ntypedef enum _ETW_SESSION_NOTIFICATION_TYPE\n{\n    EtwSessionNotificationMediaChanged = 1,\n    EtwSessionNotificationSessionTerminated,\n    EtwSessionNotificationLogfileError,\n    EtwSessionNotificationRealtimeError,\n    EtwSessionNotificationSessionStarted,\n    EtwSessionNotificationMax\n} ETW_SESSION_NOTIFICATION_TYPE;\n\ntypedef struct _ETW_SESSION_NOTIFICATION_PACKET\n{\n    ETW_NOTIFICATION_HEADER NotificationHeader;\n    ETW_SESSION_NOTIFICATION_TYPE Type;\n    NTSTATUS Status;\n    TRACEHANDLE TraceHandle;\n    ULONG Reserved[2];\n} ETW_SESSION_NOTIFICATION_PACKET, *PETW_SESSION_NOTIFICATION_PACKET;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#ifndef EVENT_DESCRIPTOR_DEF\n#define EVENT_DESCRIPTOR_DEF\ntypedef struct _EVENT_DESCRIPTOR\n{\n    USHORT Id;\n    UCHAR Version;\n    UCHAR Channel;\n    UCHAR Level;\n    UCHAR Opcode;\n    USHORT Task;\n    ULONGLONG Keyword;\n} EVENT_DESCRIPTOR, *PEVENT_DESCRIPTOR;\ntypedef const EVENT_DESCRIPTOR* PCEVENT_DESCRIPTOR;\n#endif\n\nNTSYSAPI\nULONG\nNTAPI\nEtwSetMark(\n    _In_opt_ TRACEHANDLE TraceHandle,\n    _In_ PETW_SET_MARK_INFORMATION MarkInfo,\n    _In_ ULONG Size\n    );\n\ntypedef struct _EVENT_DATA_DESCRIPTOR EVENT_DATA_DESCRIPTOR, *PEVENT_DATA_DESCRIPTOR;\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteFull(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ USHORT EventProperty,\n    _In_opt_ LPCGUID ActivityId,\n    _In_opt_ LPCGUID RelatedActivityId,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\n//NTSYSAPI\n//ULONG\n//NTAPI\n//EtwEventRegister(\n//    _In_ LPCGUID ProviderId,\n//    _In_opt_ PENABLECALLBACK EnableCallback,\n//    _In_opt_ PVOID CallbackContext,\n//    _Out_ PREGHANDLE RegHandle\n//    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventUnregister(\n    _In_ REGHANDLE RegHandle\n    );\n\ntypedef enum _EVENT_INFO_CLASS EVENT_INFO_CLASS;\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventSetInformation(\n    _In_ REGHANDLE RegHandle,\n    _In_ EVENT_INFO_CLASS InformationClass,\n    _In_reads_bytes_(InformationLength) PVOID EventInformation,\n    _In_ ULONG InformationLength\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwRegisterSecurityProvider(\n    VOID\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nEtwEventProviderEnabled(\n    _In_ REGHANDLE RegHandle,\n    _In_ UCHAR Level,\n    _In_ ULONGLONG Keyword\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nEtwEventEnabled(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWrite(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteTransfer(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_opt_ LPCGUID ActivityId,\n    _In_opt_ LPCGUID RelatedActivityId,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteString(\n    _In_ REGHANDLE RegHandle,\n    _In_ UCHAR Level,\n    _In_ ULONGLONG Keyword,\n    _In_ PCWSTR String\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteEx(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ ULONG64 Filter,\n    _In_ ULONG Flags,\n    _In_opt_ LPCGUID ActivityId,\n    _In_opt_ LPCGUID RelatedActivityId,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteStartScenario(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteEndScenario(\n    _In_ REGHANDLE RegHandle,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwWriteUMSecurityEvent(\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ USHORT EventProperty,\n    _In_ ULONG UserDataCount,\n    _In_opt_ PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventWriteNoRegistration(\n    _In_ LPCGUID ProviderId,\n    _In_ PCEVENT_DESCRIPTOR EventDescriptor,\n    _In_ ULONG UserDataCount,\n    _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEventActivityIdControl(\n    _In_ ULONG ControlCode,\n    _Inout_ LPGUID ActivityId\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwNotificationRegister(\n    _In_ LPCGUID Guid,\n    _In_ ULONG Type,\n    _In_ PETW_NOTIFICATION_CALLBACK Callback,\n    _In_opt_ PVOID Context,\n    _Out_ PREGHANDLE RegHandle\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwNotificationUnregister(\n    _In_ REGHANDLE RegHandle,\n    _Out_opt_ PVOID * Context\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwSendNotification(\n    _In_ PETW_NOTIFICATION_HEADER DataBlock,\n    _In_ ULONG ReceiveDataBlockSize,\n    _Inout_ PVOID ReceiveDataBlock,\n    _Out_ PULONG ReplyReceived,\n    _Out_ PULONG ReplySizeNeeded\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwReplyNotification(\n    _In_ PETW_NOTIFICATION_HEADER Notification\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwEnumerateProcessRegGuids(\n    _Out_writes_bytes_opt_(OutBufferSize) PVOID OutBuffer,\n    _In_ ULONG OutBufferSize,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nEtwQueryRealtimeConsumer(\n    _In_ TRACEHANDLE TraceHandle,\n    _Out_ PULONG EventsLostCount,\n    _Out_ PULONG BuffersLostCount\n    );\n#endif\n\n// public TRACE_PROVIDER_INSTANCE_INFO\ntypedef struct _ETW_TRACE_PROVIDER_INSTANCE_INFO\n{\n    ULONG NextOffset;\n    ULONG EnableCount;\n    ULONG Pid;\n    ULONG Flags;\n} ETW_TRACE_PROVIDER_INSTANCE_INFO, *PETW_TRACE_PROVIDER_INSTANCE_INFO;\n\n// public TRACE_GUID_INFO\ntypedef struct _ETW_TRACE_GUID_INFO\n{\n    ULONG InstanceCount;\n    ULONG Reserved;\n    //ETW_TRACE_PROVIDER_INSTANCE_INFO Instances[1];\n} ETW_TRACE_GUID_INFO, *PETW_TRACE_GUID_INFO;\n\n// rev\ntypedef enum _ETWTRACECONTROLCODE\n{\n    EtwStartLoggerCode = 1, // inout WMI_LOGGER_INFORMATION\n    EtwStopLoggerCode = 2, // inout WMI_LOGGER_INFORMATION\n    EtwQueryLoggerCode = 3, // inout WMI_LOGGER_INFORMATION\n    EtwUpdateLoggerCode = 4, // inout WMI_LOGGER_INFORMATION\n    EtwFlushLoggerCode = 5, // inout WMI_LOGGER_INFORMATION\n    EtwIncrementLoggerFile = 6, // inout WMI_LOGGER_INFORMATION\n    EtwRealtimeTransition = 7, // inout WMI_LOGGER_INFORMATION\n    // reserved\n    EtwRealtimeConnectCode = 11,\n    EtwActivityIdCreate = 12,\n    EtwWdiScenarioCode = 13,\n    EtwRealtimeDisconnectCode = 14, // in HANDLE\n    EtwRegisterGuidsCode = 15,\n    EtwReceiveNotification = 16,\n    EtwSendDataBlock = 17, // ETW_ENABLE_NOTIFICATION_PACKET // ETW_SESSION_NOTIFICATION_PACKET\n    EtwSendReplyDataBlock = 18,\n    EtwReceiveReplyDataBlock = 19,\n    EtwWdiSemUpdate = 20,\n    EtwEnumTraceGuidList = 21, // out GUID[]\n    EtwGetTraceGuidInfo = 22, // in GUID, out ETW_TRACE_GUID_INFO\n    EtwEnumerateTraceGuids = 23, // out TRACE_GUID_PROPERTIES[]\n    EtwRegisterSecurityProv = 24,\n    EtwReferenceTimeCode = 25, // in ULONG LoggerId, out ETW_REF_CLOCK\n    EtwTrackBinaryCode = 26, // in HANDLE\n    EtwAddNotificationEvent = 27,\n    EtwUpdateDisallowList = 28,\n    EtwSetEnableAllKeywordsCode = 29,\n    EtwSetProviderTraitsCode = 30,\n    EtwUseDescriptorTypeCode = 31,\n    EtwEnumTraceGroupList = 32,\n    EtwGetTraceGroupInfo = 33,\n    EtwGetDisallowList = 34,\n    EtwSetCompressionSettings = 35,\n    EtwGetCompressionSettings = 36,\n    EtwUpdatePeriodicCaptureState = 37,\n    EtwGetPrivateSessionTraceHandle = 38,\n    EtwRegisterPrivateSession = 39,\n    EtwQuerySessionDemuxObject = 40,\n    EtwSetProviderBinaryTracking = 41,\n    EtwMaxLoggers = 42, // out ULONG\n    EtwMaxPmcCounter = 43, // out ULONG\n    EtwQueryUsedProcessorCount = 44, // ULONG // since WIN11\n    EtwGetPmcOwnership = 45,\n    EtwGetPmcSessions = 46,\n} ETWTRACECONTROLCODE;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTraceControl(\n    _In_ ETWTRACECONTROLCODE FunctionCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_ PULONG ReturnLength\n    );\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_XP)\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtTraceEvent(\n    _In_opt_ HANDLE TraceHandle,\n    _In_ ULONG Flags,\n    _In_ ULONG FieldSize,\n    _In_ PVOID Fields\n    );\n#endif\n\n// private\ntypedef struct _TELEMETRY_COVERAGE_POINT\n{\n    PWSTR Name;\n    ULONG Hash;\n    ULONG LastCoveredRound;\n    ULONG Flags;\n} TELEMETRY_COVERAGE_POINT, *PTELEMETRY_COVERAGE_POINT;\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS3)\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nEtwCheckCoverage(\n    _Inout_ PTELEMETRY_COVERAGE_POINT CoveragePoint\n    );\n#endif\n\n//\n// Data consumer apis (deprecated starting with Vista)\n//\n// WMI functionality was moved to ETW.\n//\n\nNTSYSAPI\nULONG\nNTAPI\nWmiOpenBlock(\n    _In_ LPCGUID Guid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PHANDLE DataBlockHandle\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiCloseBlock(\n    _In_ HANDLE DataBlockHandle\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQueryAllDataA(\n    _In_ HANDLE DataBlockHandle,\n    _Inout_ PULONG BufferLength,\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQueryAllDataW(\n    _In_ HANDLE DataBlockHandle,\n    _Inout_ PULONG BufferLength,\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQueryAllDataMultipleA(\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_ ULONG HandleCount,\n    _Inout_ PULONG InOutBufferSize,\n    _Out_writes_bytes_(*InOutBufferSize) PVOID OutBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQueryAllDataMultipleW(\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_ ULONG HandleCount,\n    _Inout_ PULONG InOutBufferSize,\n    _Out_writes_bytes_(*InOutBufferSize) PVOID OutBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQuerySingleInstanceA(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCSTR InstanceName,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_to_opt_(*BufferSize, *BufferSize) PVOID Buffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQuerySingleInstanceW(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCWSTR InstanceName,\n    _Inout_ PULONG BufferSize,\n    _Out_writes_bytes_to_opt_(*BufferSize, *BufferSize) PVOID Buffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQuerySingleInstanceMultipleW(\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_reads_(HandleCount) PCWSTR* InstanceNames,\n    _In_ ULONG HandleCount,\n    _Inout_ PULONG InOutBufferSize,\n    _Out_writes_bytes_to_opt_(*InOutBufferSize, *InOutBufferSize) PVOID OutBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQuerySingleInstanceMultipleA(\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_reads_(HandleCount) PCSTR* InstanceNames,\n    _In_ ULONG HandleCount,\n    _Inout_ PULONG InOutBufferSize,\n    _Out_writes_bytes_to_opt_(*InOutBufferSize, *InOutBufferSize) PVOID OutBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiSetSingleInstanceA(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCSTR InstanceName,\n    _In_ ULONG Reserved,\n    _In_ ULONG ValueBufferSize,\n    _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiSetSingleInstanceW(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCWSTR InstanceName,\n    _In_ ULONG Reserved,\n    _In_ ULONG ValueBufferSize,\n    _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiSetSingleItemA(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCSTR InstanceName,\n    _In_ ULONG DataItemId,\n    _In_ ULONG Reserved,\n    _In_ ULONG ValueBufferSize,\n    _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiSetSingleItemW(\n    _In_ HANDLE DataBlockHandle,\n    _In_ PCWSTR InstanceName,\n    _In_ ULONG DataItemId,\n    _In_ ULONG Reserved,\n    _In_ ULONG ValueBufferSize,\n    _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiExecuteMethodA(\n    _In_ HANDLE MethodDataBlockHandle,\n    _In_ PCSTR MethodInstanceName,\n    _In_ ULONG MethodId,\n    _In_ ULONG InputBufferSize,\n    _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer,\n    _Inout_opt_ PULONG OutputBufferSize,\n    _Out_writes_bytes_opt_(*OutputBufferSize) PVOID OutputBuffer\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiExecuteMethodW(\n    _In_ HANDLE MethodDataBlockHandle,\n    _In_ PCWSTR MethodInstanceName,\n    _In_ ULONG MethodId,\n    _In_ ULONG InputBufferSize,\n    _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer,\n    _Inout_opt_ PULONG OutputBufferSize,\n    _Out_writes_bytes_opt_(*OutputBufferSize) PVOID OutputBuffer\n    );\n\n// Enable or disable a trace logging guid.\n#define NOTIFICATION_TRACE_FLAG 0x00010000\n// Enable or disable a trace direct callback.\n// The callback is invoked immediately via a separate thread.\n#define NOTIFICATION_CALLBACK_DIRECT 0x00000004\n// Set this flag (and only this flag) when you want to only check if the\n// caller has permission to receive events for the guid.\n#define NOTIFICATION_CHECK_ACCESS 0x00000008\n// Enable lightweight notification.\n#define NOTIFICATION_LIGHTWEIGHT_FLAG 0x00000020\n\n// Event notification callback function prototype\n_Function_class_(NOTIFICATIONCALLBACK)\ntypedef void (WINAPI NOTIFICATIONCALLBACK)(\n    _In_ PWNODE_HEADER Wnode,\n    _In_ ULONG_PTR NotificationContext\n    );\ntypedef NOTIFICATIONCALLBACK* PNOTIFICATIONCALLBACK;\n\n// {B48D49A1-E777-11d0-A50C-00A0C9062910}\nDEFINE_GUID(GUID_REGISTRATION_CHANGE_NOTIFICATION,0xb48d49a1, 0xe777, 0x11d0, 0xa5, 0xc, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10);\n// {B48D49A2-E777-11d0-A50C-00A0C9062910}\nDEFINE_GUID(GUID_MOF_RESOURCE_ADDED_NOTIFICATION,0xb48d49a2, 0xe777, 0x11d0, 0xa5, 0xc, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10);\n// {B48D49A3-E777-11d0-A50C-00A0C9062910}\nDEFINE_GUID(GUID_MOF_RESOURCE_REMOVED_NOTIFICATION,0xb48d49a3, 0xe777, 0x11d0, 0xa5, 0xc, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10);\n\nNTSYSAPI\nULONG\nNTAPI\nWmiNotificationRegistrationA(\n    _In_ PCGUID Guid,\n    _In_ BOOLEAN Enable,\n    _In_ PVOID DeliveryInfo,\n    _In_ ULONG_PTR DeliveryContext,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiNotificationRegistrationW(\n    _In_ PCGUID Guid,\n    _In_ BOOLEAN Enable,\n    _In_ PVOID DeliveryInfo,\n    _In_ ULONG_PTR DeliveryContext,\n    _In_ ULONG Flags\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiEnumerateGuids(\n    _Out_writes_opt_(*GuidCount) PGUID GuidList,\n    _Inout_ PULONG GuidCount\n    );\n\ntypedef struct _MOFRESOURCEINFOA\n{\n    PSTR ImagePath;        // Path to image containing MOF resource\n    PSTR ResourceName;     // Name of resource in image\n    ULONG ResourceSize;    // Number of bytes in resource\n    PUCHAR ResourceBuffer;\n} MOFRESOURCEINFOA, *PMOFRESOURCEINFOA;\n\n#ifdef UNICODE\ntypedef struct _MOFRESOURCEINFOW MOFRESOURCEINFO, *PMOFRESOURCEINFO;\n#else\ntypedef struct _MOFRESOURCEINFOA MOFRESOURCEINFO, *PMOFRESOURCEINFO;\n#endif\n\n//\n// When set the guid can be opened and accessed\n#define MOFCI_RESERVED0  0x00000001\n#define MOFCI_RESERVED1  0x00000002\n#define MOFCI_RESERVED2  0x00000004\n\ntypedef struct _MOFRESOURCEINFOW\n{\n    LPWSTR ImagePath;      // Path to image containing MOF resource\n    LPWSTR ResourceName;   // Name of resource in image\n    ULONG ResourceSize;    // Number of bytes in resource\n    PUCHAR ResourceBuffer; // Reserved\n} MOFRESOURCEINFOW, *PMOFRESOURCEINFOW;\n\nNTSYSAPI\nULONG\nNTAPI\nWmiMofEnumerateResourcesW(\n    _In_ HANDLE MofResourceHandle,\n    _Out_ PULONG MofResourceCount,\n    _Outptr_result_buffer_(*MofResourceCount) PMOFRESOURCEINFOW *MofResourceInfo\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiMofEnumerateResourcesA(\n    _In_ HANDLE MofResourceHandle,\n    _Out_ PULONG MofResourceCount,\n    _Outptr_result_buffer_(*MofResourceCount) PMOFRESOURCEINFOA *MofResourceInfo\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiFileHandleToInstanceNameA(\n    _In_ HANDLE DataBlockHandle,\n    _In_ HANDLE FileHandle,\n    _Inout_ PULONG NumberCharacters,\n    _Out_writes_(*NumberCharacters) CHAR *InstanceNames\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiFileHandleToInstanceNameW(\n    _In_ HANDLE DataBlockHandle,\n    _In_ HANDLE FileHandle,\n    _Inout_ PULONG NumberCharacters,\n    _Out_writes_(*NumberCharacters) WCHAR *InstanceNames\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiDevInstToInstanceNameA(\n    _Out_writes_opt_(InstanceNameLength) PSTR InstanceName,\n    _In_ ULONG InstanceNameLength,\n    _In_ PCSTR DevInst,\n    _In_ ULONG InstanceIndex\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiDevInstToInstanceNameW(\n    _Out_writes_opt_(InstanceNameLength) PWSTR InstanceName,\n    _In_ ULONG InstanceNameLength,\n    _In_ PCWSTR DevInst,\n    _In_ ULONG InstanceIndex\n    );\n\ntypedef struct _WMIGUIDINFORMATION\n{\n    ULONG Size;\n    BOOLEAN IsExpensive;\n    BOOLEAN IsEventOnly;\n} WMIGUIDINFORMATION, *PWMIGUIDINFORMATION;\n\nNTSYSAPI\nULONG\nNTAPI\nWmiQueryGuidInformation(\n    _In_ HANDLE GuidHandle,\n    _Out_ PWMIGUIDINFORMATION GuidInfo\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiReceiveNotificationsW(\n    _In_ ULONG HandleCount,\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_ NOTIFICATIONCALLBACK Callback,\n    _In_ ULONG_PTR DeliveryContext\n    );\n\nNTSYSAPI\nULONG\nNTAPI\nWmiReceiveNotificationsA(\n    _In_ ULONG HandleCount,\n    _In_reads_(HandleCount) PHANDLE HandleList,\n    _In_ NOTIFICATIONCALLBACK Callback,\n    _In_ ULONG_PTR DeliveryContext\n    );\n\n#ifdef UNICODE\n#define WmiQuerySingleInstanceMultiple WmiQuerySingleInstanceMultipleW\n#define WmiSetSingleInstance WmiSetSingleInstanceW\n#define WmiSetSingleItem WmiSetSingleItemW\n#define WmiNotificationRegistration WmiNotificationRegistrationW\n#define WmiMofEnumerateResources WmiMofEnumerateResourcesW\n#define WmiExecuteMethod WmiExecuteMethodW\n#define WmiFileHandleToInstanceName WmiFileHandleToInstanceNameW\n#define WmiDevInstToInstanceName WmiDevInstToInstanceNameW\n#define WmiReceiveNotifications WmiReceiveNotificationsW\n#else\n#define WmiQuerySingleInstanceMultiple WmiQuerySingleInstanceMultipleA\n#define WmiSetSingleInstance WmiSetSingleInstanceA\n#define WmiSetSingleItem WmiSetSingleItemA\n#define WmiNotificationRegistration WmiNotificationRegistrationA\n#define WmiMofEnumerateResources WmiMofEnumerateResourcesA\n#define WmiExecuteMethod WmiExecuteMethodA\n#define WmiFileHandleToInstanceName WmiFileHandleToInstanceNameA\n#define WmiDevInstToInstanceName WmiDevInstToInstanceNameA\n#define WmiReceiveNotifications WmiReceiveNotificationsA\n#endif\n\n#define WmiInsertTimestamp(WnodeHeader) \\\n    GetSystemTimeAsFileTime((PFILETIME)&((PWNODE_HEADER)(WnodeHeader))->TimeStamp)\n\nNTSYSAPI\nVOID\nNTAPI\nWmiFreeBuffer(\n    _In_ PVOID Buffer\n    );\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntwow64.h",
    "content": "/*\n * Windows on Windows support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTWOW64_H\n#define _NTWOW64_H\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#ifdef __has_include\n#if __has_include (\"ntxcapi.h\")\n#include \"ntxcapi.h\"\n#endif // __has_include\n#endif // __has_include\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#define WOW64_SYSTEM_DIRECTORY \"SysWOW64\"\n#define WOW64_SYSTEM_DIRECTORY_U L\"SysWOW64\"\n#define WOW64_X86_TAG \" (x86)\"\n#define WOW64_X86_TAG_U L\" (x86)\"\n\n// In USER_SHARED_DATA\ntypedef enum _WOW64_SHARED_INFORMATION\n{\n    SharedNtdll32LdrInitializeThunk,\n    SharedNtdll32KiUserExceptionDispatcher,\n    SharedNtdll32KiUserApcDispatcher,\n    SharedNtdll32KiUserCallbackDispatcher,\n    SharedNtdll32ExpInterlockedPopEntrySListFault,\n    SharedNtdll32ExpInterlockedPopEntrySListResume,\n    SharedNtdll32ExpInterlockedPopEntrySListEnd,\n    SharedNtdll32RtlUserThreadStart,\n    SharedNtdll32pQueryProcessDebugInformationRemote,\n    SharedNtdll32BaseAddress,\n    SharedNtdll32LdrSystemDllInitBlock,\n    Wow64SharedPageEntriesCount\n} WOW64_SHARED_INFORMATION;\n\n// 32-bit definitions\n\n#define WOW64_POINTER(Type) ULONG\n\ntypedef struct _RTL_BALANCED_NODE32\n{\n    union\n    {\n        WOW64_POINTER(struct _RTL_BALANCED_NODE *) Children[2];\n        struct\n        {\n            WOW64_POINTER(struct _RTL_BALANCED_NODE *) Left;\n            WOW64_POINTER(struct _RTL_BALANCED_NODE *) Right;\n        };\n    };\n    union\n    {\n        WOW64_POINTER(UCHAR) Red : 1;\n        WOW64_POINTER(UCHAR) Balance : 2;\n        WOW64_POINTER(ULONG_PTR) ParentValue;\n    };\n} RTL_BALANCED_NODE32, *PRTL_BALANCED_NODE32;\n\ntypedef struct _RTL_RB_TREE32\n{\n    WOW64_POINTER(PRTL_BALANCED_NODE) Root;\n    WOW64_POINTER(PRTL_BALANCED_NODE) Min;\n} RTL_RB_TREE32, *PRTL_RB_TREE32;\n\ntypedef struct _PEB_LDR_DATA32\n{\n    ULONG Length;\n    BOOLEAN Initialized;\n    WOW64_POINTER(HANDLE) SsHandle;\n    LIST_ENTRY32 InLoadOrderModuleList;\n    LIST_ENTRY32 InMemoryOrderModuleList;\n    LIST_ENTRY32 InInitializationOrderModuleList;\n    WOW64_POINTER(PVOID) EntryInProgress;\n    BOOLEAN ShutdownInProgress;\n    WOW64_POINTER(HANDLE) ShutdownThreadId;\n} PEB_LDR_DATA32, *PPEB_LDR_DATA32;\n\ntypedef struct _LDR_SERVICE_TAG_RECORD32\n{\n    WOW64_POINTER(struct _LDR_SERVICE_TAG_RECORD *) Next;\n    ULONG ServiceTag;\n} LDR_SERVICE_TAG_RECORD32, *PLDR_SERVICE_TAG_RECORD32;\n\ntypedef struct _LDRP_CSLIST32\n{\n    WOW64_POINTER(PSINGLE_LIST_ENTRY) Tail;\n} LDRP_CSLIST32, *PLDRP_CSLIST32;\n\ntypedef struct _LDR_DDAG_NODE32\n{\n    LIST_ENTRY32 Modules;\n    WOW64_POINTER(PLDR_SERVICE_TAG_RECORD) ServiceTagList;\n    ULONG LoadCount;\n    ULONG LoadWhileUnloadingCount;\n    ULONG LowestLink;\n    union\n    {\n        LDRP_CSLIST32 Dependencies;\n        SINGLE_LIST_ENTRY32 RemovalLink;\n    };\n    LDRP_CSLIST32 IncomingDependencies;\n    LDR_DDAG_STATE State;\n    SINGLE_LIST_ENTRY32 CondenseLink;\n    ULONG PreorderNumber;\n} LDR_DDAG_NODE32, *PLDR_DDAG_NODE32;\n\n#define LDR_DATA_TABLE_ENTRY_SIZE_WINXP_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, DdagNode)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN7_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, BaseNameHashValue)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN8_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, ImplicitPathOptions)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN10_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, SigningLevel)\n#define LDR_DATA_TABLE_ENTRY_SIZE_WIN11_32 sizeof(LDR_DATA_TABLE_ENTRY32)\n\ntypedef struct _LDR_DATA_TABLE_ENTRY32\n{\n    LIST_ENTRY32 InLoadOrderLinks;\n    LIST_ENTRY32 InMemoryOrderLinks;\n    union\n    {\n        LIST_ENTRY32 InInitializationOrderLinks;\n        LIST_ENTRY32 InProgressLinks;\n    };\n    WOW64_POINTER(PVOID) DllBase;\n    WOW64_POINTER(PVOID) EntryPoint;\n    ULONG SizeOfImage;\n    UNICODE_STRING32 FullDllName;\n    UNICODE_STRING32 BaseDllName;\n    union\n    {\n        UCHAR FlagGroup[4];\n        ULONG Flags;\n        struct\n        {\n            ULONG PackagedBinary : 1;\n            ULONG MarkedForRemoval : 1;\n            ULONG ImageDll : 1;\n            ULONG LoadNotificationsSent : 1;\n            ULONG TelemetryEntryProcessed : 1;\n            ULONG ProcessStaticImport : 1;\n            ULONG InLegacyLists : 1;\n            ULONG InIndexes : 1;\n            ULONG ShimDll : 1;\n            ULONG InExceptionTable : 1;\n            ULONG ReservedFlags1 : 2;\n            ULONG LoadInProgress : 1;\n            ULONG LoadConfigProcessed : 1;\n            ULONG EntryProcessed : 1;\n            ULONG ProtectDelayLoad : 1;\n            ULONG ReservedFlags3 : 2;\n            ULONG DontCallForThreads : 1;\n            ULONG ProcessAttachCalled : 1;\n            ULONG ProcessAttachFailed : 1;\n            ULONG CorDeferredValidate : 1;\n            ULONG CorImage : 1;\n            ULONG DontRelocate : 1;\n            ULONG CorILOnly : 1;\n            ULONG ChpeImage : 1;\n            ULONG ReservedFlags5 : 2;\n            ULONG Redirected : 1;\n            ULONG ReservedFlags6 : 2;\n            ULONG CompatDatabaseProcessed : 1;\n        };\n    };\n    USHORT ObsoleteLoadCount;\n    USHORT TlsIndex;\n    LIST_ENTRY32 HashLinks;\n    ULONG TimeDateStamp;\n    WOW64_POINTER(struct _ACTIVATION_CONTEXT *) EntryPointActivationContext;\n    WOW64_POINTER(PVOID) Lock;\n    WOW64_POINTER(PLDR_DDAG_NODE) DdagNode;\n    LIST_ENTRY32 NodeModuleLink;\n    WOW64_POINTER(struct _LDRP_LOAD_CONTEXT *) LoadContext;\n    WOW64_POINTER(PVOID) ParentDllBase;\n    WOW64_POINTER(PVOID) SwitchBackContext;\n    RTL_BALANCED_NODE32 BaseAddressIndexNode;\n    RTL_BALANCED_NODE32 MappingInfoIndexNode;\n    WOW64_POINTER(ULONG_PTR) OriginalBase;\n    LARGE_INTEGER LoadTime;\n    ULONG BaseNameHashValue;\n    LDR_DLL_LOAD_REASON LoadReason;\n    ULONG ImplicitPathOptions;\n    ULONG ReferenceCount;\n    ULONG DependentLoadFlags;\n    UCHAR SigningLevel; // since REDSTONE2\n    ULONG CheckSum; // since 22H1\n    WOW64_POINTER(PVOID) ActivePatchImageBase;\n    LDR_HOT_PATCH_STATE HotPatchState;\n} LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32;\n\ntypedef struct _CURDIR32\n{\n    UNICODE_STRING32 DosPath;\n    WOW64_POINTER(HANDLE) Handle;\n} CURDIR32, *PCURDIR32;\n\ntypedef struct _RTL_DRIVE_LETTER_CURDIR32\n{\n    USHORT Flags;\n    USHORT Length;\n    ULONG TimeStamp;\n    STRING32 DosPath;\n} RTL_DRIVE_LETTER_CURDIR32, *PRTL_DRIVE_LETTER_CURDIR32;\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS32\n{\n    ULONG MaximumLength;\n    ULONG Length;\n\n    ULONG Flags;\n    ULONG DebugFlags;\n\n    WOW64_POINTER(HANDLE) ConsoleHandle;\n    ULONG ConsoleFlags;\n    WOW64_POINTER(HANDLE) StandardInput;\n    WOW64_POINTER(HANDLE) StandardOutput;\n    WOW64_POINTER(HANDLE) StandardError;\n\n    CURDIR32 CurrentDirectory;\n    UNICODE_STRING32 DllPath;\n    UNICODE_STRING32 ImagePathName;\n    UNICODE_STRING32 CommandLine;\n    WOW64_POINTER(PVOID) Environment;\n\n    ULONG StartingX;\n    ULONG StartingY;\n    ULONG CountX;\n    ULONG CountY;\n    ULONG CountCharsX;\n    ULONG CountCharsY;\n    ULONG FillAttribute;\n\n    ULONG WindowFlags;\n    ULONG ShowWindowFlags;\n    UNICODE_STRING32 WindowTitle;\n    UNICODE_STRING32 DesktopInfo;\n    UNICODE_STRING32 ShellInfo;\n    UNICODE_STRING32 RuntimeData;\n    RTL_DRIVE_LETTER_CURDIR32 CurrentDirectories[RTL_MAX_DRIVE_LETTERS];\n\n    WOW64_POINTER(ULONG_PTR) EnvironmentSize;\n    WOW64_POINTER(ULONG_PTR) EnvironmentVersion;\n    WOW64_POINTER(PVOID) PackageDependencyData;\n    ULONG ProcessGroupId;\n    ULONG LoaderThreads;\n\n    UNICODE_STRING32 RedirectionDllName; // REDSTONE4\n    UNICODE_STRING32 HeapPartitionName; // 19H1\n    WOW64_POINTER(ULONGLONG) DefaultThreadpoolCpuSetMasks;\n    ULONG DefaultThreadpoolCpuSetMaskCount;\n    ULONG DefaultThreadpoolThreadMaximum;\n} RTL_USER_PROCESS_PARAMETERS32, *PRTL_USER_PROCESS_PARAMETERS32;\n\ntypedef struct _LEAP_SECOND_DATA *PLEAP_SECOND_DATA;\n\ntypedef struct _PEB32\n{\n    BOOLEAN InheritedAddressSpace;\n    BOOLEAN ReadImageFileExecOptions;\n    BOOLEAN BeingDebugged;\n    union\n    {\n        BOOLEAN BitField;\n        struct\n        {\n            BOOLEAN ImageUsesLargePages : 1;\n            BOOLEAN IsProtectedProcess : 1;\n            BOOLEAN IsImageDynamicallyRelocated : 1;\n            BOOLEAN SkipPatchingUser32Forwarders : 1;\n            BOOLEAN IsPackagedProcess : 1;\n            BOOLEAN IsAppContainer : 1;\n            BOOLEAN IsProtectedProcessLight : 1;\n            BOOLEAN IsLongPathAwareProcess : 1;\n        };\n    };\n    WOW64_POINTER(HANDLE) Mutant;\n\n    WOW64_POINTER(PVOID) ImageBaseAddress;\n    WOW64_POINTER(PPEB_LDR_DATA) Ldr;\n    WOW64_POINTER(PRTL_USER_PROCESS_PARAMETERS) ProcessParameters;\n    WOW64_POINTER(PVOID) SubSystemData;\n    WOW64_POINTER(PVOID) ProcessHeap;\n    WOW64_POINTER(PRTL_CRITICAL_SECTION) FastPebLock;\n    WOW64_POINTER(PVOID) AtlThunkSListPtr;\n    WOW64_POINTER(PVOID) IFEOKey;\n    union\n    {\n        ULONG CrossProcessFlags;\n        struct\n        {\n            ULONG ProcessInJob : 1;\n            ULONG ProcessInitializing : 1;\n            ULONG ProcessUsingVEH : 1;\n            ULONG ProcessUsingVCH : 1;\n            ULONG ProcessUsingFTH : 1;\n            ULONG ReservedBits0 : 27;\n        };\n    };\n    union\n    {\n        WOW64_POINTER(PVOID) KernelCallbackTable;\n        WOW64_POINTER(PVOID) UserSharedInfoPtr;\n    };\n    ULONG SystemReserved;\n    ULONG AtlThunkSListPtr32;\n    WOW64_POINTER(PVOID) ApiSetMap;\n    ULONG TlsExpansionCounter;\n    WOW64_POINTER(PVOID) TlsBitmap;\n    ULONG TlsBitmapBits[2];\n    WOW64_POINTER(PVOID) ReadOnlySharedMemoryBase;\n    WOW64_POINTER(PVOID) SharedData;\n    WOW64_POINTER(PVOID *) ReadOnlyStaticServerData;\n    WOW64_POINTER(PVOID) AnsiCodePageData;\n    WOW64_POINTER(PVOID) OemCodePageData;\n    WOW64_POINTER(PVOID) UnicodeCaseTableData;\n\n    ULONG NumberOfProcessors;\n    ULONG NtGlobalFlag;\n\n    LARGE_INTEGER CriticalSectionTimeout;\n    WOW64_POINTER(SIZE_T) HeapSegmentReserve;\n    WOW64_POINTER(SIZE_T) HeapSegmentCommit;\n    WOW64_POINTER(SIZE_T) HeapDeCommitTotalFreeThreshold;\n    WOW64_POINTER(SIZE_T) HeapDeCommitFreeBlockThreshold;\n\n    ULONG NumberOfHeaps;\n    ULONG MaximumNumberOfHeaps;\n    WOW64_POINTER(PVOID *) ProcessHeaps;\n\n    WOW64_POINTER(PVOID) GdiSharedHandleTable;\n    WOW64_POINTER(PVOID) ProcessStarterHelper;\n    ULONG GdiDCAttributeList;\n\n    WOW64_POINTER(PRTL_CRITICAL_SECTION) LoaderLock;\n\n    ULONG OSMajorVersion;\n    ULONG OSMinorVersion;\n    USHORT OSBuildNumber;\n    USHORT OSCSDVersion;\n    ULONG OSPlatformId;\n    ULONG ImageSubsystem;\n    ULONG ImageSubsystemMajorVersion;\n    ULONG ImageSubsystemMinorVersion;\n    WOW64_POINTER(ULONG_PTR) ActiveProcessAffinityMask;\n    GDI_HANDLE_BUFFER32 GdiHandleBuffer;\n    WOW64_POINTER(PVOID) PostProcessInitRoutine;\n\n    WOW64_POINTER(PVOID) TlsExpansionBitmap;\n    ULONG TlsExpansionBitmapBits[32];\n\n    ULONG SessionId;\n\n    ULARGE_INTEGER AppCompatFlags;\n    ULARGE_INTEGER AppCompatFlagsUser;\n    WOW64_POINTER(PVOID) pShimData;\n    WOW64_POINTER(PVOID) AppCompatInfo;\n\n    UNICODE_STRING32 CSDVersion;\n\n    WOW64_POINTER(PACTIVATION_CONTEXT_DATA) ActivationContextData;\n    WOW64_POINTER(PVOID) ProcessAssemblyStorageMap;\n    WOW64_POINTER(PACTIVATION_CONTEXT_DATA) SystemDefaultActivationContextData;\n    WOW64_POINTER(PVOID) SystemAssemblyStorageMap;\n\n    WOW64_POINTER(SIZE_T) MinimumStackCommit;\n\n    WOW64_POINTER(PVOID) SparePointers[2]; // 19H1 (previously FlsCallback to FlsHighIndex)\n    WOW64_POINTER(PVOID) PatchLoaderData;\n    WOW64_POINTER(PVOID) ChpeV2ProcessInfo; // _CHPEV2_PROCESS_INFO\n\n    ULONG AppModelFeatureState;\n    ULONG SpareUlongs[2];\n\n    USHORT ActiveCodePage;\n    USHORT OemCodePage;\n    USHORT UseCaseMapping;\n    USHORT UnusedNlsField;\n\n    WOW64_POINTER(PVOID) WerRegistrationData;\n    WOW64_POINTER(PVOID) WerShipAssertPtr;\n\n    union\n    {\n        WOW64_POINTER(PVOID) pContextData; // WIN7\n        WOW64_POINTER(PVOID) pUnused; // WIN10\n        WOW64_POINTER(PVOID) EcCodeBitMap; // WIN11\n    };\n\n    WOW64_POINTER(PVOID) pImageHeaderHash;\n    union\n    {\n        ULONG TracingFlags;\n        struct\n        {\n            ULONG HeapTracingEnabled : 1;\n            ULONG CritSecTracingEnabled : 1;\n            ULONG LibLoaderTracingEnabled : 1;\n            ULONG SpareTracingBits : 29;\n        };\n    };\n    ULONGLONG CsrServerReadOnlySharedMemoryBase;\n    WOW64_POINTER(PVOID) TppWorkerpListLock;\n    LIST_ENTRY32 TppWorkerpList;\n    WOW64_POINTER(PVOID) WaitOnAddressHashTable[128];\n    WOW64_POINTER(PVOID) TelemetryCoverageHeader; // REDSTONE3\n    ULONG CloudFileFlags;\n    ULONG CloudFileDiagFlags; // REDSTONE4\n    CHAR PlaceholderCompatibilityMode;\n    CHAR PlaceholderCompatibilityModeReserved[7];\n    WOW64_POINTER(PLEAP_SECOND_DATA) LeapSecondData; // REDSTONE5\n    union\n    {\n        ULONG LeapSecondFlags;\n        struct\n        {\n            ULONG SixtySecondEnabled : 1;\n            ULONG Reserved : 31;\n        };\n    };\n    ULONG NtGlobalFlag2;\n    ULONGLONG ExtendedFeatureDisableMask; // since WIN11\n} PEB32, *PPEB32;\n\n//static_assert(sizeof(PEB32) == 0x460, \"sizeof(PEB32) is incorrect\"); // REDSTONE3\n//static_assert(sizeof(PEB32) == 0x470, \"sizeof(PEB32) is incorrect\"); // REDSTONE5\nstatic_assert(sizeof(PEB32) == 0x488, \"sizeof(PEB32) is incorrect\"); // WIN11\n\n// Note: Use PhGetProcessPeb32 instead. (dmex)\n//#define WOW64_GET_PEB32(peb64) \\\n//    ((PPEB32)RtlOffsetToPointer((peb64), ALIGN_UP_BY(sizeof(PEB), PAGE_SIZE)))\n\n#define GDI_BATCH_BUFFER_SIZE 310\n\ntypedef struct _GDI_TEB_BATCH32\n{\n    ULONG Offset;\n    WOW64_POINTER(ULONG_PTR) HDC;\n    ULONG Buffer[GDI_BATCH_BUFFER_SIZE];\n} GDI_TEB_BATCH32, *PGDI_TEB_BATCH32;\n\ntypedef struct _TEB32\n{\n    NT_TIB32 NtTib;\n\n    WOW64_POINTER(PVOID) EnvironmentPointer;\n    CLIENT_ID32 ClientId;\n    WOW64_POINTER(PVOID) ActiveRpcHandle;\n    WOW64_POINTER(PVOID) ThreadLocalStoragePointer;\n    WOW64_POINTER(PPEB) ProcessEnvironmentBlock;\n\n    ULONG LastErrorValue;\n    ULONG CountOfOwnedCriticalSections;\n    WOW64_POINTER(PVOID) CsrClientThread;\n    WOW64_POINTER(PVOID) Win32ThreadInfo;\n    ULONG User32Reserved[26];\n    ULONG UserReserved[5];\n    WOW64_POINTER(PVOID) WOW32Reserved;\n    LCID CurrentLocale;\n    ULONG FpSoftwareStatusRegister;\n    WOW64_POINTER(PVOID) ReservedForDebuggerInstrumentation[16];\n    WOW64_POINTER(PVOID) SystemReserved1[36];\n    UCHAR WorkingOnBehalfTicket[8];\n    NTSTATUS ExceptionCode;\n\n    WOW64_POINTER(PVOID) ActivationContextStackPointer;\n    WOW64_POINTER(ULONG_PTR) InstrumentationCallbackSp;\n    WOW64_POINTER(ULONG_PTR) InstrumentationCallbackPreviousPc;\n    WOW64_POINTER(ULONG_PTR) InstrumentationCallbackPreviousSp;\n    BOOLEAN InstrumentationCallbackDisabled;\n    UCHAR SpareBytes[23];\n    ULONG TxFsContext;\n\n    GDI_TEB_BATCH32 GdiTebBatch;\n    CLIENT_ID32 RealClientId;\n    WOW64_POINTER(HANDLE) GdiCachedProcessHandle;\n    ULONG GdiClientPID;\n    ULONG GdiClientTID;\n    WOW64_POINTER(PVOID) GdiThreadLocalInfo;\n    WOW64_POINTER(ULONG_PTR) Win32ClientInfo[62];\n    WOW64_POINTER(PVOID) glDispatchTable[233];\n    WOW64_POINTER(ULONG_PTR) glReserved1[29];\n    WOW64_POINTER(PVOID) glReserved2;\n    WOW64_POINTER(PVOID) glSectionInfo;\n    WOW64_POINTER(PVOID) glSection;\n    WOW64_POINTER(PVOID) glTable;\n    WOW64_POINTER(PVOID) glCurrentRC;\n    WOW64_POINTER(PVOID) glContext;\n\n    NTSTATUS LastStatusValue;\n    UNICODE_STRING32 StaticUnicodeString;\n    WCHAR StaticUnicodeBuffer[261];\n\n    WOW64_POINTER(PVOID) DeallocationStack;\n    WOW64_POINTER(PVOID) TlsSlots[64];\n    LIST_ENTRY32 TlsLinks;\n\n    WOW64_POINTER(PVOID) Vdm;\n    WOW64_POINTER(PVOID) ReservedForNtRpc;\n    WOW64_POINTER(PVOID) DbgSsReserved[2];\n\n    ULONG HardErrorMode;\n    WOW64_POINTER(PVOID) Instrumentation[9];\n    GUID ActivityId;\n\n    WOW64_POINTER(PVOID) SubProcessTag;\n    WOW64_POINTER(PVOID) PerflibData;\n    WOW64_POINTER(PVOID) EtwTraceData;\n    WOW64_POINTER(PVOID) WinSockData;\n    ULONG GdiBatchCount;\n\n    union\n    {\n        PROCESSOR_NUMBER CurrentIdealProcessor;\n        ULONG IdealProcessorValue;\n        struct\n        {\n            UCHAR ReservedPad0;\n            UCHAR ReservedPad1;\n            UCHAR ReservedPad2;\n            UCHAR IdealProcessor;\n        };\n    };\n\n    ULONG GuaranteedStackBytes;\n    WOW64_POINTER(PVOID) ReservedForPerf;\n    WOW64_POINTER(PVOID) ReservedForOle;\n    ULONG WaitingOnLoaderLock;\n    WOW64_POINTER(PVOID) SavedPriorityState;\n    WOW64_POINTER(ULONG_PTR) ReservedForCodeCoverage;\n    WOW64_POINTER(PVOID) ThreadPoolData;\n    WOW64_POINTER(PVOID *) TlsExpansionSlots;\n\n    ULONG MuiGeneration;\n    ULONG IsImpersonating;\n    WOW64_POINTER(PVOID) NlsCache;\n    WOW64_POINTER(PVOID) pShimData;\n    USHORT HeapVirtualAffinity;\n    USHORT LowFragHeapDataSlot;\n    WOW64_POINTER(HANDLE) CurrentTransactionHandle;\n    WOW64_POINTER(PTEB_ACTIVE_FRAME) ActiveFrame;\n    WOW64_POINTER(PVOID) FlsData;\n\n    WOW64_POINTER(PVOID) PreferredLanguages;\n    WOW64_POINTER(PVOID) UserPrefLanguages;\n    WOW64_POINTER(PVOID) MergedPrefLanguages;\n    ULONG MuiImpersonation;\n\n    union\n    {\n        USHORT CrossTebFlags;\n        USHORT SpareCrossTebBits : 16;\n    };\n    union\n    {\n        USHORT SameTebFlags;\n        struct\n        {\n            USHORT SafeThunkCall : 1;\n            USHORT InDebugPrint : 1;\n            USHORT HasFiberData : 1;\n            USHORT SkipThreadAttach : 1;\n            USHORT WerInShipAssertCode : 1;\n            USHORT RanProcessInit : 1;\n            USHORT ClonedThread : 1;\n            USHORT SuppressDebugMsg : 1;\n            USHORT DisableUserStackWalk : 1;\n            USHORT RtlExceptionAttached : 1;\n            USHORT InitialThread : 1;\n            USHORT SessionAware : 1;\n            USHORT LoadOwner : 1;\n            USHORT LoaderWorker : 1;\n            USHORT SpareSameTebBits : 2;\n        };\n    };\n\n    WOW64_POINTER(PVOID) TxnScopeEnterCallback;\n    WOW64_POINTER(PVOID) TxnScopeExitCallback;\n    WOW64_POINTER(PVOID) TxnScopeContext;\n    ULONG LockCount;\n    LONG WowTebOffset;\n    WOW64_POINTER(PVOID) ResourceRetValue;\n    WOW64_POINTER(PVOID) ReservedForWdf;\n    ULONGLONG ReservedForCrt;\n    GUID EffectiveContainerId;\n} TEB32, *PTEB32;\n\nstatic_assert(FIELD_OFFSET(TEB32, ProcessEnvironmentBlock) == 0x030, \"FIELD_OFFSET(TEB32, ProcessEnvironmentBlock) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, ExceptionCode) == 0x1a4, \"FIELD_OFFSET(TEB32, ExceptionCode) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, StaticUnicodeBuffer) == 0xc00, \"FIELD_OFFSET(TEB32, StaticUnicodeBuffer) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, TlsLinks) == 0xf10, \"FIELD_OFFSET(TEB32, TlsLinks) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, TlsExpansionSlots) == 0xf94, \"FIELD_OFFSET(TEB32, TlsExpansionSlots) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, FlsData) == 0xfb4, \"FIELD_OFFSET(TEB32, FlsData) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, MuiImpersonation) == 0xfc4, \"FIELD_OFFSET(TEB32, MuiImpersonation) is incorrect\");\nstatic_assert(FIELD_OFFSET(TEB32, EffectiveContainerId) == 0xff0, \"FIELD_OFFSET(TEB32, EffectiveContainerId) is incorrect\");\nstatic_assert(sizeof(TEB32) == 0x1000, \"sizeof(TEB32) is incorrect\");\n\n// Conversion\n\nFORCEINLINE VOID UStr32ToUStr(\n    _Out_ PUNICODE_STRING Destination,\n    _In_ PCUNICODE_STRING32 Source\n    )\n{\n    Destination->Length = Source->Length;\n    Destination->MaximumLength = Source->MaximumLength;\n    Destination->Buffer = (PWCH)UlongToPtr(Source->Buffer);\n}\n\nFORCEINLINE VOID UStrToUStr32(\n    _Out_ PUNICODE_STRING32 Destination,\n    _In_ PCUNICODE_STRING Source\n    )\n{\n    Destination->Length = Source->Length;\n    Destination->MaximumLength = Source->MaximumLength;\n    Destination->Buffer = PtrToUlong(Source->Buffer);\n}\n\n// The Wow64Info structure follows the PEB32/TEB32 structures and is shared between 32-bit and 64-bit modules inside a Wow64 process.\n// from SDK/10.0.10240.0/um/minwin/wow64t.h (dmex)\n//\n// Page size on x86 NT\n//\n#define PAGE_SIZE_X86NT 0x1000\n#define PAGE_SHIFT_X86NT 12L\n#define WOW64_SPLITS_PER_PAGE (PAGE_SIZE_X86NT / PAGE_SIZE_X86NT)\n\n//\n// Convert the number of native pages to sub x86-pages\n//\n#define Wow64GetNumberOfX86Pages(NativePages) \\\n    ((NativePages) * (PAGE_SIZE_X86NT >> PAGE_SHIFT_X86NT))\n\n//\n// Macro to round to the nearest page size\n//\n#define WOW64_ROUND_TO_PAGES(Size) \\\n    (((ULONG_PTR)(Size) + PAGE_SIZE_X86NT - 1) & ~(PAGE_SIZE_X86NT - 1))\n\n//\n// Get number of native pages\n//\n#define WOW64_BYTES_TO_PAGES(Size) \\\n    (((ULONG)(Size) >> WOW64_ROUND_TO_PAGES) + (((ULONG)(Size) & (PAGE_SIZE_X86NT - 1)) != 0))\n\n//\n// Get the 32-bit TEB without doing a memory reference.\n//\n#define WOW64_GET_TEB32(teb64) ((PTEB32)(((ULONG_PTR)(teb64)) + ((ULONG_PTR)WOW64_ROUND_TO_PAGES(sizeof(TEB)))))\n#define WOW64_TEB32_POINTER_ADDRESS(teb64) ((PVOID)&(((PTEB)(teb64))->NtTib.ExceptionList))\n\n//\n// Get the 32-bit execute options.\n//\ntypedef union _WOW64_EXECUTE_OPTIONS\n{\n    ULONG Flags;\n    struct\n    {\n        ULONG StackReserveSize : 8;\n        ULONG StackCommitSize : 4;\n        ULONG Deprecated0 : 1;\n        ULONG DisableWowAssert : 1;\n        ULONG DisableTurboDispatch : 1;\n        ULONG Unused : 13;\n        ULONG Reserved0 : 1;\n        ULONG Reserved1 : 1;\n        ULONG Reserved2 : 1;\n        ULONG Reserved3 : 1;\n    };\n} WOW64_EXECUTE_OPTIONS, *PWOW64_EXECUTE_OPTIONS;\n\n#define WOW64_CPUFLAGS_MSFT64           0x00000001\n#define WOW64_CPUFLAGS_SOFTWARE         0x00000002\n#define WOW64_CPUFLAGS_IA64             0x00000004\n\ntypedef struct _WOW64INFO\n{\n    ULONG NativeSystemPageSize;\n    ULONG CpuFlags;\n    WOW64_EXECUTE_OPTIONS Wow64ExecuteFlags;\n    ULONG InstrumentationCallback;\n} WOW64INFO, *PWOW64INFO;\n\ntypedef struct _PEB32_WITH_WOW64INFO\n{\n    PEB32 Peb32;\n    WOW64INFO Wow64Info;\n} PEB32_WITH_WOW64INFO, *PPEB32_WITH_WOW64INFO;\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#ifdef _M_X64\n\nFORCEINLINE\nTEB32*\nPOINTER_UNSIGNED\nWow64CurrentGuestTeb(\n    VOID\n    )\n{\n    TEB* POINTER_UNSIGNED Teb;\n    TEB32* POINTER_UNSIGNED Teb32;\n\n    Teb = NtCurrentTeb();\n\n    if (Teb->WowTebOffset == 0)\n    {\n        //\n        // Not running under or over WoW, so there is no \"guest teb\"\n        //\n\n        return NULL;\n    }\n\n    if (Teb->WowTebOffset < 0)\n    {\n        //\n        // Was called while running under WoW. The current teb is the guest teb.\n        //\n\n        Teb32 = (PTEB32)Teb;\n\n#if defined(RTL_ASSERT)\n        RTL_ASSERT(&Teb32->WowTebOffset == &Teb->WowTebOffset);\n#endif\n    }\n    else\n    {\n        //\n        // Called by the WoW Host, so calculate the position of the guest teb\n        // relative to the current (host) teb.\n        //\n\n        Teb32 = (PTEB32)RtlOffsetToPointer(Teb, Teb->WowTebOffset);\n    }\n\n#if defined(RTL_ASSERT)\n    RTL_ASSERT(Teb32->NtTib.Self == PtrToUlong(Teb32));\n#endif\n\n    return Teb32;\n}\n\nFORCEINLINE\nVOID*\nPOINTER_UNSIGNED\nWow64CurrentNativeTeb(\n    VOID\n    )\n{\n    TEB* POINTER_UNSIGNED Teb;\n    VOID* POINTER_UNSIGNED HostTeb;\n\n    Teb = NtCurrentTeb();\n\n    if (Teb->WowTebOffset >= 0)\n    {\n        //\n        // Not running under WoW, so it it either not running on WoW at all, or\n        // it is the host. Return the current teb as native teb.\n        //\n\n        HostTeb = (PVOID)Teb;\n    }\n    else\n    {\n        //\n        // Called while running under WoW Host, so calculate the position of the\n        // host teb relative to the current (guest) teb.\n        //\n\n        HostTeb = (PVOID)RtlOffsetToPointer(Teb, Teb->WowTebOffset);\n    }\n\n#if defined(RTL_ASSERT)\n    RTL_ASSERT((((PTEB32)HostTeb)->NtTib.Self == PtrToUlong(HostTeb)) || ((ULONG_PTR)((PTEB)HostTeb)->NtTib.Self == (ULONG_PTR)HostTeb));\n#endif\n\n    return HostTeb;\n}\n\n#define NtCurrentTeb32() (Wow64CurrentGuestTeb())\n#define NtCurrentPeb32()  ((PPEB32)(UlongToPtr((NtCurrentTeb32()->ProcessEnvironmentBlock))))\n\n#define Wow64GetNativeTebField(teb, field) (((ULONG)(teb) == ((PTEB32)(teb))->NtTib.Self) ? (((PTEB32)(teb))->##field) : (((PTEB)(teb))->##field) )\n#define Wow64SetNativeTebField(teb, field, value) { if ((ULONG)(teb) == ((PTEB32)(teb))->NtTib.Self) {(((PTEB32)(teb))->##field) = (value);} else {(((PTEB)(teb))->##field) = (value);} }\n\n#endif // _M_X64\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntxcapi.h",
    "content": "/*\n * Exception support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _NTXCAPI_H\n#define _NTXCAPI_H\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nRtlDispatchException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord\n    );\n\n_Analysis_noreturn_\nNTSYSAPI\nDECLSPEC_NORETURN\nVOID\nNTAPI\nRtlRaiseStatus(\n    _In_ NTSTATUS Status\n    );\n\n/**\n * Raises an exception in the calling thread.\n *\n * @param ExceptionRecord A pointer to an EXCEPTION_RECORD structure that contains the exception information. You must specify the ExceptionAddress and ExceptionCode members.\n * @return This function does not return a value.\n * @see https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-raiseexception\n */\nNTSYSAPI\nVOID\nNTAPI\nRtlRaiseException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_20H1)\n// rev\nNTSYSAPI\nVOID\nNTAPI\nRtlRaiseExceptionForReturnAddressHijack(\n    VOID\n    );\n\n// rev\n_Analysis_noreturn_\nNTSYSAPI\nDECLSPEC_NORETURN\nVOID\nNTAPI\nRtlRaiseNoncontinuableException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord\n    );\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10_20H1\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtContinue(\n    _In_ PCONTEXT ContextRecord,\n    _In_ BOOLEAN TestAlert\n    );\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\ntypedef enum _KCONTINUE_TYPE\n{\n    KCONTINUE_UNWIND,\n    KCONTINUE_RESUME,\n    KCONTINUE_LONGJUMP,\n    KCONTINUE_SET,\n    KCONTINUE_LAST,\n} KCONTINUE_TYPE;\n\ntypedef struct _KCONTINUE_ARGUMENT\n{\n    KCONTINUE_TYPE ContinueType;\n    ULONG ContinueFlags;\n    ULONGLONG Reserved[2];\n} KCONTINUE_ARGUMENT, *PKCONTINUE_ARGUMENT;\n\n#define KCONTINUE_FLAG_TEST_ALERT 0x00000001 // wbenny\n#define KCONTINUE_FLAG_DELIVER_APC 0x00000002 // wbenny\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtContinueEx(\n    _In_ PCONTEXT ContextRecord,\n    _In_ PVOID ContinueArgument // PKCONTINUE_ARGUMENT and BOOLEAN are valid\n    );\n\n//FORCEINLINE\n//NTSTATUS\n//NtContinue(\n//    _In_ PCONTEXT ContextRecord,\n//    _In_ BOOLEAN TestAlert\n//    )\n//{\n//    return NtContinueEx(ContextRecord, (PCONTINUE_ARGUMENT)TestAlert);\n//}\n#endif // PHNT_VERSION >= PHNT_WINDOWS_10\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nNtRaiseException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord,\n    _In_ BOOLEAN FirstChance\n    );\n\n_Analysis_noreturn_\nNTSYSAPI\nDECLSPEC_NORETURN\nVOID\nNTAPI\nRtlAssert(\n    _In_ PVOID VoidFailedAssertion,\n    _In_ PVOID VoidFileName,\n    _In_ ULONG LineNumber,\n    _In_opt_ PSTR MutableMessage\n    );\n\n#define RTL_ASSERT(exp) \\\n    ((!(exp)) ? (RtlAssert((PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL), FALSE) : TRUE)\n#define RTL_ASSERTMSG(msg, exp) \\\n    ((!(exp)) ? (RtlAssert((PVOID)#exp, (PVOID)__FILE__, __LINE__, msg), FALSE) : TRUE)\n#define RTL_SOFT_ASSERT(_exp) \\\n    ((!(_exp)) ? (DbgPrint(\"%s(%d): Soft assertion failed\\n   Expression: %s\\n\", __FILE__, __LINE__, #_exp), FALSE) : TRUE)\n#define RTL_SOFT_ASSERTMSG(_msg, _exp) \\\n    ((!(_exp)) ? (DbgPrint(\"%s(%d): Soft assertion failed\\n   Expression: %s\\n   Message: %s\\n\", __FILE__, __LINE__, #_exp, (_msg)), FALSE) : TRUE)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/ntzwapi.h",
    "content": "#ifndef _NTZWAPI_H\n#define _NTZWAPI_H\n\n// This file was automatically generated. Do not edit.\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAcceptConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ PVOID PortContext,\n    _In_ PPORT_MESSAGE ConnectionRequest,\n    _In_ BOOLEAN AcceptConnection,\n    _Inout_opt_ PPORT_VIEW ServerView,\n    _Out_opt_ PREMOTE_PORT_VIEW ClientView\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheck(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckByType(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_reads_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckByTypeAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_ PACCESS_MASK GrantedAccess,\n    _Out_ PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckByTypeResultList(\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_reads_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,\n    _Inout_ PULONG PrivilegeSetLength,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckByTypeResultListAndAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAccessCheckByTypeResultListAndAuditAlarmByHandle(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ HANDLE ClientToken,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_opt_ PSID PrincipalSelfSid,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ AUDIT_EVENT_TYPE AuditType,\n    _In_ ULONG Flags,\n    _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList,\n    _In_ ULONG ObjectTypeListLength,\n    _In_ PGENERIC_MAPPING GenericMapping,\n    _In_ BOOLEAN ObjectCreation,\n    _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess,\n    _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAcquireCMFViewOwnership(\n    _Out_ PULONGLONG TimeStamp,\n    _Out_ PBOOLEAN tokenTaken,\n    _In_ BOOLEAN replaceExisting\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAcquireCrossVmMutant(\n    _In_ HANDLE CrossVmMutant,\n    _In_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAcquireProcessActivityReference(\n    _Out_ PHANDLE ActivityReferenceHandle,\n    _In_ HANDLE ParentProcessHandle,\n    _Reserved_ PROCESS_ACTIVITY_TYPE Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAddAtom(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAddAtomEx(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAddBootEntry(\n    _In_ PBOOT_ENTRY BootEntry,\n    _Out_opt_ PULONG Id\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAddDriverEntry(\n    _In_ PEFI_DRIVER_ENTRY DriverEntry,\n    _Out_opt_ PULONG Id\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAdjustGroupsToken(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN ResetToDefault,\n    _In_opt_ PTOKEN_GROUPS NewState,\n    _In_opt_ ULONG BufferLength,\n    _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_GROUPS PreviousState,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAdjustPrivilegesToken(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN DisableAllPrivileges,\n    _In_opt_ PTOKEN_PRIVILEGES NewState,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_PRIVILEGES PreviousState,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAdjustTokenClaimsAndDeviceGroups(\n    _In_ HANDLE TokenHandle,\n    _In_ BOOLEAN UserResetToDefault,\n    _In_ BOOLEAN DeviceResetToDefault,\n    _In_ BOOLEAN DeviceGroupsResetToDefault,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION NewUserState,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION NewDeviceState,\n    _In_opt_ PTOKEN_GROUPS NewDeviceGroupsState,\n    _In_ ULONG UserBufferLength,\n    _Out_writes_bytes_to_opt_(UserBufferLength, *UserReturnLength) PTOKEN_SECURITY_ATTRIBUTES_INFORMATION PreviousUserState,\n    _In_ ULONG DeviceBufferLength,\n    _Out_writes_bytes_to_opt_(DeviceBufferLength, *DeviceReturnLength) PTOKEN_SECURITY_ATTRIBUTES_INFORMATION PreviousDeviceState,\n    _In_ ULONG DeviceGroupsBufferLength,\n    _Out_writes_bytes_to_opt_(DeviceGroupsBufferLength, *DeviceGroupsReturnBufferLength) PTOKEN_GROUPS PreviousDeviceGroups,\n    _Out_opt_ PULONG UserReturnLength,\n    _Out_opt_ PULONG DeviceReturnLength,\n    _Out_opt_ PULONG DeviceGroupsReturnBufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlertMultipleThreadByThreadId(\n    _In_ PHANDLE MultipleThreadId,\n    _In_ ULONG Count,\n    _In_ PVOID Boost,\n    _In_ ULONG BoostCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlertResumeThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlertThread(\n    _In_ HANDLE ThreadHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlertThreadByThreadId(\n    _In_ HANDLE ThreadId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlertThreadByThreadIdEx(\n    _In_ HANDLE ThreadId,\n    _In_opt_ PRTL_SRWLOCK Lock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateLocallyUniqueId(\n    _Out_ PLUID Luid\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateReserveObject(\n    _Out_ PHANDLE MemoryReserveHandle,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ MEMORY_RESERVE_TYPE Type\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateUserPhysicalPages(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PSIZE_T NumberOfPages,\n    _Out_writes_(*NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateUserPhysicalPagesEx(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PULONG_PTR NumberOfPages,\n    _Out_writes_(*NumberOfPages) PULONG_PTR UserPfnArray,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateUuids(\n    _Out_ PULARGE_INTEGER Time,\n    _Out_ PULONG Range,\n    _Out_ PULONG Sequence,\n    _Out_ PCHAR Seed\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*RegionSize) _Writable_bytes_(*RegionSize) _Post_readable_byte_size_(*RegionSize)) PVOID *BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAllocateVirtualMemoryEx(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*RegionSize) _Writable_bytes_(*RegionSize) _Post_readable_byte_size_(*RegionSize)) PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcAcceptConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ HANDLE ConnectionPortHandle,\n    _In_ ULONG Flags,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_opt_ PVOID PortContext,\n    _In_reads_bytes_(ConnectionRequest->u1.s1.TotalLength) PPORT_MESSAGE ConnectionRequest,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,\n    _In_ BOOLEAN AcceptConnection\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCancelMessage(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_ PALPC_CONTEXT_ATTR MessageContext\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_ ULONG Flags,\n    _In_opt_ PSID RequiredServerSid,\n    _Inout_updates_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ConnectionMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcConnectPortEx(\n    _Out_ PHANDLE PortHandle,\n    _In_ POBJECT_ATTRIBUTES ConnectionPortObjectAttributes,\n    _In_opt_ POBJECT_ATTRIBUTES ClientPortObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,\n    _In_ ULONG Flags,\n    _In_opt_ PSECURITY_DESCRIPTOR ServerSecurityRequirements,\n    _Inout_updates_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ConnectionMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCreatePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCreatePortSection(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_opt_ HANDLE SectionHandle,\n    _In_ SIZE_T SectionSize,\n    _Out_ PALPC_HANDLE AlpcSectionHandle,\n    _Out_ PSIZE_T ActualSectionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCreateResourceReserve(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ SIZE_T MessageSize,\n    _Out_ PALPC_HANDLE ResourceId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCreateSectionView(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _Inout_ PALPC_DATA_VIEW_ATTR ViewAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcCreateSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _Inout_ PALPC_SECURITY_ATTR SecurityAttribute\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcDeletePortSection(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE SectionHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcDeleteResourceReserve(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ResourceId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcDeleteSectionView(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ PVOID ViewBase\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcDeleteSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ContextHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcDisconnectPort(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcImpersonateClientContainerOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcImpersonateClientOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ PVOID Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcOpenSenderProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _Reserved_ ULONG Flags,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcOpenSenderThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _Reserved_ ULONG Flags,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcQueryInformation(\n    _In_opt_ HANDLE PortHandle,\n    _In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,\n    _Inout_updates_bytes_to_(Length, *ReturnLength) PVOID PortInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcQueryInformationMessage(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE PortMessage,\n    _In_ ALPC_MESSAGE_INFORMATION_CLASS MessageInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ReturnLength) PVOID MessageInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcRevokeSecurityContext(\n    _In_ HANDLE PortHandle,\n    _Reserved_ ULONG Flags,\n    _In_ ALPC_HANDLE ContextHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcSendWaitReceivePort(\n    _In_ HANDLE PortHandle,\n    _In_ ULONG Flags,\n    _In_reads_bytes_opt_(SendMessage->u1.s1.TotalLength) PPORT_MESSAGE SendMessage,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,\n    _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PPORT_MESSAGE ReceiveMessage,\n    _Inout_opt_ PSIZE_T BufferLength,\n    _Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAlpcSetInformation(\n    _In_ HANDLE PortHandle,\n    _In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,\n    _In_reads_bytes_opt_(Length) PVOID PortInformation,\n    _In_ ULONG Length\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwApphelpCacheControl(\n    _In_ ULONG ServiceClass,\n    _Inout_opt_ PVOID ServiceContext // AHC_SERVICE_DATA\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAreMappedFilesTheSame(\n    _In_ PVOID File1MappedAsAnImage,\n    _In_ PVOID File2MappedAsFile\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAssignProcessToJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ HANDLE ProcessHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwAssociateWaitCompletionPacket(\n    _In_ HANDLE WaitCompletionPacketHandle,\n    _In_ HANDLE IoCompletionHandle,\n    _In_ HANDLE TargetObjectHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation,\n    _Out_opt_ PBOOLEAN AlreadySignaled\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCallbackReturn(\n    _In_reads_bytes_opt_(OutputLength) PVOID OutputBuffer,\n    _In_ ULONG OutputLength,\n    _In_ NTSTATUS Status\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCallEnclave(\n    _In_ PENCLAVE_ROUTINE Routine,\n    _In_ PVOID Reserved,              // reserved for dispatch (RtlEnclaveCallDispatch)\n    _In_ ULONG Flags,                 // ENCLAVE_CALL_FLAG_*\n    _Inout_ PVOID* RoutineParamReturn // input routine parameter, output routine return value\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelIoFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelIoFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ PIO_STATUS_BLOCK IoRequestToCancel,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelSynchronousIoFile(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ PIO_STATUS_BLOCK IoRequestToCancel,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelTimer(\n    _In_ HANDLE TimerHandle,\n    _Out_opt_ PBOOLEAN CurrentState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelTimer2(\n    _In_ HANDLE TimerHandle,\n    _In_ PT2_CANCEL_PARAMETERS Parameters\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCancelWaitCompletionPacket(\n    _In_ HANDLE WaitCompletionPacketHandle,\n    _In_ BOOLEAN RemoveSignaledPacket\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwChangeProcessState(\n    _In_ HANDLE ProcessStateChangeHandle,\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESS_STATE_CHANGE_TYPE StateChangeType,\n    _In_opt_ _Reserved_ PVOID ExtendedInformation,\n    _In_opt_ _Reserved_ SIZE_T ExtendedInformationLength,\n    _In_opt_ _Reserved_ ULONG64 Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwChangeThreadState(\n    _In_ HANDLE ThreadStateChangeHandle,\n    _In_ HANDLE ThreadHandle,\n    _In_ THREAD_STATE_CHANGE_TYPE StateChangeType,\n    _In_opt_ PVOID ExtendedInformation,\n    _In_opt_ SIZE_T ExtendedInformationLength,\n    _In_opt_ ULONG64 Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwClearEvent(\n    _In_ HANDLE EventHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwClose(\n    _In_ _Post_ptr_invalid_ HANDLE Handle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCloseObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ BOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCommitComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCommitEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCommitRegistryTransaction(\n    _In_ HANDLE RegistryTransactionHandle,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCommitTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ BOOLEAN Wait\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompactKeys(\n    _In_ ULONG Count,\n    _In_reads_(Count) HANDLE KeyArray[]\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompareObjects(\n    _In_ HANDLE FirstObjectHandle,\n    _In_ HANDLE SecondObjectHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompareSigningLevels(\n    _In_ SE_SIGNING_LEVEL FirstSigningLevel,\n    _In_ SE_SIGNING_LEVEL SecondSigningLevel\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompareTokens(\n    _In_ HANDLE FirstTokenHandle,\n    _In_ HANDLE SecondTokenHandle,\n    _Out_ PBOOLEAN Equal\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompleteConnectPort(\n    _In_ HANDLE PortHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCompressKey(\n    _In_ HANDLE KeyHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,\n    _Inout_opt_ PPORT_VIEW ClientView,\n    _Inout_opt_ PREMOTE_PORT_VIEW ServerView,\n    _Out_opt_ PULONG MaxMessageLength,\n    _Inout_updates_bytes_to_opt_(*ConnectionInformationLength, *ConnectionInformationLength) PVOID ConnectionInformation,\n    _Inout_opt_ PULONG ConnectionInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwContinue(\n    _In_ PCONTEXT ContextRecord,\n    _In_ BOOLEAN TestAlert\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwContinueEx(\n    _In_ PCONTEXT ContextRecord,\n    _In_ PVOID ContinueArgument // PKCONTINUE_ARGUMENT and BOOLEAN are valid\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwConvertBetweenAuxiliaryCounterAndPerformanceCounter(\n    _In_ BOOLEAN ConvertAuxiliaryToPerformanceCounter,\n    _In_ PULONG64 PerformanceOrAuxiliaryCounterValue,\n    _Out_ PULONG64 ConvertedValue,\n    _Out_opt_ PULONG64 ConversionError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCopyFileChunk(\n    _In_ HANDLE SourceHandle,\n    _In_ HANDLE DestinationHandle,\n    _In_opt_ HANDLE EventHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG Length,\n    _In_ PLARGE_INTEGER SourceOffset,\n    _In_ PLARGE_INTEGER DestOffset,\n    _In_opt_ PULONG SourceKey,\n    _In_opt_ PULONG DestKey,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateCpuPartition(\n    _Out_ PHANDLE CpuPartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateCrossVmEvent(\n    _Out_ PHANDLE CrossVmEvent,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG CrossVmEventFlags,\n    _In_ LPCGUID VMID,\n    _In_ LPCGUID ServiceID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateCrossVmMutant(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG CrossVmEventFlags,\n    _In_ LPCGUID VMID,\n    _In_ LPCGUID ServiceID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateDebugObject(\n    _Out_ PHANDLE DebugObjectHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateDirectoryObject(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateDirectoryObjectEx(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ShadowDirectoryHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateEnclave(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID* BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _In_ SIZE_T Size,\n    _In_ SIZE_T InitialCommitment,\n    _In_ ULONG EnclaveType,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_opt_ PULONG EnclaveError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateEnlistment(\n    _Out_ PHANDLE EnlistmentHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ HANDLE TransactionHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG CreateOptions,\n    _In_ NOTIFICATION_MASK NotificationMask,\n    _In_opt_ PVOID EnlistmentKey\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateEvent(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ EVENT_TYPE EventType,\n    _In_ BOOLEAN InitialState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateEventPair(\n    _Out_ PHANDLE EventPairHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_opt_ PLARGE_INTEGER AllocationSize,\n    _In_ ULONG FileAttributes,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG CreateDisposition,\n    _In_ ULONG CreateOptions,\n    _In_reads_bytes_opt_(EaLength) PVOID EaBuffer,\n    _In_ ULONG EaLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateIoCompletion(\n    _Out_ PHANDLE IoCompletionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG NumberOfConcurrentThreads\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateIoRing(\n    _Out_ PHANDLE IoRingHandle,\n    _In_ ULONG CreateParametersLength,\n    _In_ PVOID CreateParameters,\n    _In_ ULONG OutputParametersLength,\n    _Out_ PVOID OutputParameters\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateIRTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ PVOID Reserved,\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateJobObject(\n    _Out_ PHANDLE JobHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateJobSet(\n    _In_ ULONG NumJob,\n    _In_reads_(NumJob) PJOB_SET_ARRAY UserJobSet,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateKey(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG TitleIndex,\n    _In_opt_ PCUNICODE_STRING Class,\n    _In_ ULONG CreateOptions,\n    _Out_opt_ PULONG Disposition\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateKeyedEvent(\n    _Out_ PHANDLE KeyedEventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateKeyTransacted(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Reserved_ ULONG TitleIndex,\n    _In_opt_ PCUNICODE_STRING Class,\n    _In_ ULONG CreateOptions,\n    _In_ HANDLE TransactionHandle,\n    _Out_opt_ PULONG Disposition\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateLowBoxToken(\n    _Out_ PHANDLE TokenHandle,\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ PSID PackageSid,\n    _In_ ULONG CapabilityCount,\n    _In_reads_opt_(CapabilityCount) PSID_AND_ATTRIBUTES Capabilities,\n    _In_ ULONG HandleCount,\n    _In_reads_opt_(HandleCount) HANDLE *Handles\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateMailslotFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CreateOptions,\n    _In_ ULONG MailslotQuota,\n    _In_ ULONG MaximumMessageSize,\n    _In_ PLARGE_INTEGER ReadTimeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateMutant(\n    _Out_ PHANDLE MutantHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ BOOLEAN InitialOwner\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateNamedPipeFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG CreateDisposition,\n    _In_ ULONG CreateOptions,\n    _In_ ULONG NamedPipeType,\n    _In_ ULONG ReadMode,\n    _In_ ULONG CompletionMode,\n    _In_ ULONG MaximumInstances,\n    _In_ ULONG InboundQuota,\n    _In_ ULONG OutboundQuota,\n    _In_ PLARGE_INTEGER DefaultTimeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreatePagingFile(\n    _In_ PCUNICODE_STRING PageFileName,\n    _In_ PLARGE_INTEGER MinimumSize,\n    _In_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG Priority\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreatePartition(\n    _In_opt_ HANDLE ParentPartitionHandle,\n    _Out_ PHANDLE PartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG PreferredNode\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreatePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG MaxConnectionInfoLength,\n    _In_ ULONG MaxMessageLength,\n    _In_opt_ ULONG MaxPoolUsage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreatePrivateNamespace(\n    _Out_ PHANDLE NamespaceHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ParentProcess,\n    _In_ BOOLEAN InheritObjectTable,\n    _In_opt_ HANDLE SectionHandle,\n    _In_opt_ HANDLE DebugPort,\n    _In_opt_ HANDLE TokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateProcessEx(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ParentProcess,\n    _In_ ULONG Flags, // PROCESS_CREATE_FLAGS_*\n    _In_opt_ HANDLE SectionHandle,\n    _In_opt_ HANDLE DebugPort,\n    _In_opt_ HANDLE TokenHandle,\n    _Reserved_ ULONG Reserved // JobMemberLevel\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateProcessStateChange(\n    _Out_ PHANDLE ProcessStateChangeHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ _Reserved_ ULONG64 Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateProfile(\n    _Out_ PHANDLE ProfileHandle,\n    _In_opt_ HANDLE Process,\n    _In_ PVOID ProfileBase,\n    _In_ SIZE_T ProfileSize,\n    _In_ ULONG BucketSize,\n    _In_reads_bytes_(BufferSize) PULONG Buffer,\n    _In_ ULONG BufferSize,\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _In_ KAFFINITY Affinity\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateProfileEx(\n    _Out_ PHANDLE ProfileHandle,\n    _In_opt_ HANDLE Process,\n    _In_ PVOID ProfileBase,\n    _In_ SIZE_T ProfileSize,\n    _In_ ULONG BucketSize,\n    _In_reads_bytes_(BufferSize) PULONG Buffer,\n    _In_ ULONG BufferSize,\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _In_ USHORT GroupCount,\n    _In_reads_(GroupCount) PGROUP_AFFINITY GroupAffinity\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateRegistryTransaction(\n    _Out_ HANDLE *RegistryTransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjAttributes,\n    _Reserved_ ULONG CreateOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateResourceManager(\n    _Out_ PHANDLE ResourceManagerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE TmHandle,\n    _In_ LPGUID RmGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ PCUNICODE_STRING Description\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateSection(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG SectionPageProtection,\n    _In_ ULONG AllocationAttributes,\n    _In_opt_ HANDLE FileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateSectionEx(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PLARGE_INTEGER MaximumSize,\n    _In_ ULONG SectionPageProtection,\n    _In_ ULONG AllocationAttributes,\n    _In_opt_ HANDLE FileHandle,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateSemaphore(\n    _Out_ PHANDLE SemaphoreHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ LONG InitialCount,\n    _In_ LONG MaximumCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateSymbolicLinkObject(\n    _Out_ PHANDLE LinkHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ PCUNICODE_STRING LinkTarget\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _Out_ PCLIENT_ID ClientId,\n    _In_ PCONTEXT ThreadContext,\n    _In_ PINITIAL_TEB InitialTeb,\n    _In_ BOOLEAN CreateSuspended\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateThreadEx(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ProcessHandle,\n    _In_ PUSER_THREAD_START_ROUTINE StartRoutine,\n    _In_opt_ PVOID Argument,\n    _In_ ULONG CreateFlags, // THREAD_CREATE_FLAGS_*\n    _In_ SIZE_T ZeroBits,\n    _In_ SIZE_T StackSize,\n    _In_ SIZE_T MaximumStackSize,\n    _In_opt_ PPS_ATTRIBUTE_LIST AttributeList\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateThreadStateChange(\n    _Out_ PHANDLE ThreadStateChangeHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ ULONG64 Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TIMER_TYPE TimerType\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateTimer2(\n    _Out_ PHANDLE TimerHandle,\n    _In_opt_ PVOID Reserved1,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG Attributes, // TIMER_TYPE\n    _In_ ACCESS_MASK DesiredAccess\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateToken(\n    _Out_ PHANDLE TokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TOKEN_TYPE Type,\n    _In_ PLUID AuthenticationId,\n    _In_ PLARGE_INTEGER ExpirationTime,\n    _In_ PTOKEN_USER User,\n    _In_ PTOKEN_GROUPS Groups,\n    _In_ PTOKEN_PRIVILEGES Privileges,\n    _In_opt_ PTOKEN_OWNER Owner,\n    _In_ PTOKEN_PRIMARY_GROUP PrimaryGroup,\n    _In_opt_ PTOKEN_DEFAULT_DACL DefaultDacl,\n    _In_ PTOKEN_SOURCE Source\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateTokenEx(\n    _Out_ PHANDLE TokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ TOKEN_TYPE Type,\n    _In_ PLUID AuthenticationId,\n    _In_ PLARGE_INTEGER ExpirationTime,\n    _In_ PTOKEN_USER User,\n    _In_ PTOKEN_GROUPS Groups,\n    _In_ PTOKEN_PRIVILEGES Privileges,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION UserAttributes,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION DeviceAttributes,\n    _In_opt_ PTOKEN_GROUPS DeviceGroups,\n    _In_opt_ PTOKEN_MANDATORY_POLICY MandatoryPolicy,\n    _In_opt_ PTOKEN_OWNER Owner,\n    _In_ PTOKEN_PRIMARY_GROUP PrimaryGroup,\n    _In_opt_ PTOKEN_DEFAULT_DACL DefaultDacl,\n    _In_ PTOKEN_SOURCE Source\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateTransaction(\n    _Out_ PHANDLE TransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ LPGUID Uow,\n    _In_opt_ HANDLE TmHandle,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ ULONG IsolationLevel,\n    _In_opt_ ULONG IsolationFlags,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_opt_ PCUNICODE_STRING Description\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateTransactionManager(\n    _Out_ PHANDLE TmHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCUNICODE_STRING LogFileName,\n    _In_opt_ ULONG CreateOptions,\n    _In_opt_ ULONG CommitStrength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateUserProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK ProcessDesiredAccess,\n    _In_ ACCESS_MASK ThreadDesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ProcessObjectAttributes,\n    _In_opt_ PCOBJECT_ATTRIBUTES ThreadObjectAttributes,\n    _In_ ULONG ProcessFlags, // PROCESS_CREATE_FLAGS_*\n    _In_ ULONG ThreadFlags, // THREAD_CREATE_FLAGS_*\n    _In_opt_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,\n    _Inout_ PPS_CREATE_INFO CreateInfo,\n    _In_opt_ PPS_ATTRIBUTE_LIST AttributeList\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateWaitablePort(\n    _Out_ PHANDLE PortHandle,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG MaxConnectionInfoLength,\n    _In_ ULONG MaxMessageLength,\n    _In_opt_ ULONG MaxPoolUsage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateWaitCompletionPacket(\n    _Out_ PHANDLE WaitCompletionPacketHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateWnfStateName(\n    _Out_ PWNF_STATE_NAME StateName,\n    _In_ WNF_STATE_NAME_LIFETIME NameLifetime,\n    _In_ WNF_DATA_SCOPE DataScope,\n    _In_ BOOLEAN PersistData,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_ ULONG MaximumStateSize,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwCreateWorkerFactory(\n    _Out_ PHANDLE WorkerFactoryHandleReturn,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE CompletionPortHandle,\n    _In_ HANDLE WorkerProcessHandle,\n    _In_ PVOID StartRoutine,\n    _In_opt_ PVOID StartParameter,\n    _In_opt_ ULONG MaxThreadCount,\n    _In_opt_ SIZE_T StackReserve,\n    _In_opt_ SIZE_T StackCommit\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDebugActiveProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE DebugObjectHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDebugContinue(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ PCLIENT_ID ClientId,\n    _In_ NTSTATUS ContinueStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDelayExecution(\n    _In_ BOOLEAN Alertable,\n    _In_ PLARGE_INTEGER DelayInterval\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteAtom(\n    _In_ RTL_ATOM Atom\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteBootEntry(\n    _In_ ULONG Id\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteDriverEntry(\n    _In_ ULONG Id\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteFile(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteKey(\n    _In_ HANDLE KeyHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ BOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeletePrivateNamespace(\n    _In_ HANDLE NamespaceHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ const VOID* ExplicitScope\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeleteWnfStateName(\n    _In_ PCWNF_STATE_NAME StateName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDeviceIoControlFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG IoControlCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDirectGraphicsCall(\n    _In_ ULONG InputBufferLength,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDisableLastKnownGood(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDisplayString(\n    _In_ PCUNICODE_STRING String\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDrawText(\n    _In_ PCUNICODE_STRING Text\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDuplicateObject(\n    _In_ HANDLE SourceProcessHandle,\n    _In_ HANDLE SourceHandle,\n    _In_opt_ HANDLE TargetProcessHandle,\n    _Out_opt_ PHANDLE TargetHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Options\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwDuplicateToken(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ BOOLEAN EffectiveOnly,\n    _In_ TOKEN_TYPE Type,\n    _Out_ PHANDLE NewTokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnableLastKnownGood(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateBootEntries(\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateDriverEntries(\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateKey(\n    _In_ HANDLE KeyHandle,\n    _In_ ULONG Index,\n    _In_ KEY_INFORMATION_CLASS KeyInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateSystemEnvironmentValuesEx(\n    _In_ ULONG InformationClass, // SYSTEM_ENVIRONMENT_INFORMATION_CLASS\n    _Out_ PVOID Buffer,\n    _Inout_ PULONG BufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateTransactionObject(\n    _In_opt_ HANDLE RootObjectHandle,\n    _In_ KTMOBJECT_TYPE QueryType,\n    _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,\n    _In_ ULONG ObjectCursorLength,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwEnumerateValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ ULONG Index,\n    _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyValueInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwExtendSection(\n    _In_ HANDLE SectionHandle,\n    _Inout_ PLARGE_INTEGER NewSectionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFilterBootOption(\n    _In_ FILTER_BOOT_OPTION_OPERATION FilterOperation,\n    _In_ ULONG ObjectType,\n    _In_ ULONG ElementType,\n    _In_reads_bytes_opt_(DataSize) PVOID Data,\n    _In_ ULONG DataSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFilterToken(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PTOKEN_GROUPS SidsToDisable,\n    _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete,\n    _In_opt_ PTOKEN_GROUPS RestrictedSids,\n    _Out_ PHANDLE NewTokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFilterTokenEx(\n    _In_ HANDLE ExistingTokenHandle,\n    _In_ ULONG Flags,\n    _In_opt_ PTOKEN_GROUPS SidsToDisable,\n    _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete,\n    _In_opt_ PTOKEN_GROUPS RestrictedSids,\n    _In_ ULONG DisableUserClaimsCount,\n    _In_opt_ PCUNICODE_STRING UserClaimsToDisable,\n    _In_ ULONG DisableDeviceClaimsCount,\n    _In_opt_ PCUNICODE_STRING DeviceClaimsToDisable,\n    _In_opt_ PTOKEN_GROUPS DeviceGroupsToDisable,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION RestrictedUserAttributes,\n    _In_opt_ PTOKEN_SECURITY_ATTRIBUTES_INFORMATION RestrictedDeviceAttributes,\n    _In_opt_ PTOKEN_GROUPS RestrictedDeviceGroups,\n    _Out_ PHANDLE NewTokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFindAtom(\n    _In_reads_bytes_opt_(Length) PCWSTR AtomName,\n    _In_ ULONG Length,\n    _Out_opt_ PRTL_ATOM Atom\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushBuffersFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushBuffersFileEx(\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Flags,\n    _In_reads_bytes_(ParametersSize) PVOID Parameters,\n    _In_ ULONG ParametersSize,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushInstallUILanguage(\n    _In_ LANGID InstallUILanguage,\n    _In_ ULONG SetComittedFlag\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushInstructionCache(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushKey(\n    _In_ HANDLE KeyHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushProcessWriteBuffers(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _Out_ PIO_STATUS_BLOCK IoStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFlushWriteBuffer(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFreeUserPhysicalPages(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PULONG_PTR NumberOfPages,\n    _In_reads_(*NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFreeVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG FreeType\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFreezeRegistry(\n    _In_ ULONG TimeOutInSeconds\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFreezeTransactions(\n    _In_ PLARGE_INTEGER FreezeTimeout,\n    _In_ PLARGE_INTEGER ThawTimeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwFsControlFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG FsControlCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetCachedSigningLevel(\n    _In_ HANDLE File,\n    _Out_ PULONG Flags,\n    _Out_ PSE_SIGNING_LEVEL SigningLevel,\n    _Out_writes_bytes_to_opt_(*ThumbprintSize, *ThumbprintSize) PUCHAR Thumbprint,\n    _Inout_opt_ PULONG ThumbprintSize,\n    _Out_opt_ PULONG ThumbprintAlgorithm\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetCompleteWnfStateSubscription(\n    _In_opt_ PWNF_STATE_NAME OldDescriptorStateName,\n    _In_opt_ ULONG64 *OldSubscriptionId,\n    _In_opt_ ULONG OldDescriptorEventMask,\n    _In_opt_ ULONG OldDescriptorStatus,\n    _Out_writes_bytes_(DescriptorSize) PWNF_DELIVERY_DESCRIPTOR NewDeliveryDescriptor,\n    _In_ ULONG DescriptorSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetContextThread(\n    _In_ HANDLE ThreadHandle,\n    _Inout_ PCONTEXT ThreadContext\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nZwGetCurrentProcessorNumber(\n    VOID\n    );\n\nNTSYSCALLAPI\nULONG\nNTAPI\nZwGetCurrentProcessorNumberEx(\n    _Out_opt_ PPROCESSOR_NUMBER ProcessorNumber\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetDevicePowerState(\n    _In_ HANDLE Device,\n    _Out_ PDEVICE_POWER_STATE State\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetMUIRegistryInfo(\n    _In_ ULONG Flags,\n    _Inout_ PULONG DataSize,\n    _Out_ PVOID Data\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetNextProcess(\n    _In_opt_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE NewProcessHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetNextThread(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _In_ ULONG Flags,\n    _Out_ PHANDLE NewThreadHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetNlsSectionPtr(\n    _In_ ULONG SectionType,\n    _In_ ULONG SectionData,\n    _In_ PVOID ContextData,\n    _Out_ PVOID *SectionPointer,\n    _Out_ PULONG SectionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetNotificationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,\n    _In_ ULONG NotificationLength,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _Out_opt_ PULONG ReturnLength,\n    _In_ ULONG Asynchronous,\n    _In_opt_ ULONG_PTR AsynchronousContext\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetPlugPlayEvent(\n    _In_ HANDLE EventHandle,\n    _In_opt_ PVOID Context,\n    _Out_writes_bytes_(EventBufferSize) PPLUGPLAY_EVENT_BLOCK EventBlock,\n    _In_ ULONG EventBufferSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwGetWriteWatch(\n    _In_ HANDLE ProcessHandle,\n    _In_ ULONG Flags,\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize,\n    _Out_writes_(*EntriesInUserAddressArray) PVOID *UserAddressArray,\n    _Inout_ PULONG_PTR EntriesInUserAddressArray,\n    _Out_ PULONG Granularity\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwImpersonateAnonymousToken(\n    _In_ HANDLE ThreadHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwImpersonateClientOfPort(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwImpersonateThread(\n    _In_ HANDLE ServerThreadHandle,\n    _In_ HANDLE ClientThreadHandle,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwInitializeEnclave(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_reads_bytes_(EnclaveInformationLength) PVOID EnclaveInformation,\n    _In_ ULONG EnclaveInformationLength,\n    _Out_opt_ PULONG EnclaveError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwInitializeNlsFiles(\n    _Out_ PVOID *BaseAddress,\n    _Out_ PLCID DefaultLocaleId,\n    _Out_ PLARGE_INTEGER DefaultCasingTableSize,\n    _Out_opt_ PULONG CurrentNLSVersion\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwInitializeRegistry(\n    _In_ USHORT BootCondition\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwInitiatePowerAction(\n    _In_ POWER_ACTION SystemAction,\n    _In_ SYSTEM_POWER_STATE LightestSystemState,\n    _In_ ULONG Flags, // POWER_ACTION_* flags\n    _In_ BOOLEAN Asynchronous\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwIsProcessInJob(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ HANDLE JobHandle\n    );\n\nNTSYSCALLAPI\nBOOLEAN\nNTAPI\nZwIsSystemResumeAutomatic(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwIsUILanguageComitted(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwListenPort(\n    _In_ HANDLE PortHandle,\n    _Out_ PPORT_MESSAGE ConnectionRequest\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadDriver(\n    _In_ PCUNICODE_STRING DriverServiceName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadEnclaveData(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _In_ ULONG Protect,\n    _In_reads_bytes_(PageInformationLength) PVOID PageInformation,\n    _In_ ULONG PageInformationLength,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten,\n    _Out_opt_ PULONG EnclaveError\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadKey(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadKey2(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadKey3(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags,\n    _In_reads_(ExtendedParameterCount) PCM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount,\n    _In_opt_ ACCESS_MASK DesiredAccess,\n    _Out_opt_ PHANDLE RootHandle,\n    _Reserved_ PVOID Reserved\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLoadKeyEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ POBJECT_ATTRIBUTES SourceFile,\n    _In_ ULONG Flags,\n    _In_opt_ HANDLE TrustClassKey,\n    _In_opt_ HANDLE Event,\n    _In_opt_ ACCESS_MASK DesiredAccess,\n    _Out_opt_ PHANDLE RootHandle,\n    _Reserved_ PVOID Reserved // previously PIO_STATUS_BLOCK\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLockFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PLARGE_INTEGER ByteOffset,\n    _In_ PLARGE_INTEGER Length,\n    _In_ ULONG Key,\n    _In_ BOOLEAN FailImmediately,\n    _In_ BOOLEAN ExclusiveLock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLockProductActivationKeys(\n    _Inout_opt_ ULONG *pPrivateVer,\n    _Out_opt_ ULONG *pSafeMode\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLockRegistryKey(\n    _In_ HANDLE KeyHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwLockVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG MapType\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMakePermanentObject(\n    _In_ HANDLE Handle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMakeTemporaryObject(\n    _In_ HANDLE Handle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwManageHotPatch(\n    _In_ HOT_PATCH_INFORMATION_CLASS HotPatchInformationClass,\n    _Out_writes_bytes_opt_(HotPatchInformationLength) PVOID HotPatchInformation,\n    _In_ ULONG HotPatchInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwManagePartition(\n    _In_ HANDLE TargetHandle,\n    _In_opt_ HANDLE SourceHandle,\n    _In_ PARTITION_INFORMATION_CLASS PartitionInformationClass,\n    _Inout_updates_bytes_(PartitionInformationLength) PVOID PartitionInformation,\n    _In_ ULONG PartitionInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMapCMFModule(\n    _In_ ULONG What,\n    _In_ ULONG Index,\n    _Out_opt_ PULONG CacheIndexOut,\n    _Out_opt_ PULONG CacheFlagsOut,\n    _Out_opt_ PULONG ViewSizeOut,\n    _Out_opt_ PVOID *BaseAddress\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMapUserPhysicalPages(\n    _In_ PVOID VirtualAddress,\n    _In_ SIZE_T NumberOfPages,\n    _In_reads_opt_(NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMapUserPhysicalPagesScatter(\n    _In_reads_(NumberOfPages) PVOID *VirtualAddresses,\n    _In_ SIZE_T NumberOfPages,\n    _In_reads_opt_(NumberOfPages) PULONG_PTR UserPfnArray\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMapViewOfSection(\n    _In_ HANDLE SectionHandle,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*ViewSize) _Writable_bytes_(*ViewSize) _Post_readable_byte_size_(*ViewSize)) PVOID *BaseAddress,\n    _In_ ULONG_PTR ZeroBits,\n    _In_ SIZE_T CommitSize,\n    _Inout_opt_ PLARGE_INTEGER SectionOffset,\n    _Inout_ PSIZE_T ViewSize,\n    _In_ SECTION_INHERIT InheritDisposition,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwMapViewOfSectionEx(\n    _In_ HANDLE SectionHandle,\n    _In_ HANDLE ProcessHandle,\n    _Inout_ _At_(*BaseAddress, _Readable_bytes_(*ViewSize) _Writable_bytes_(*ViewSize) _Post_readable_byte_size_(*ViewSize)) PVOID *BaseAddress,\n    _Inout_opt_ PLARGE_INTEGER SectionOffset,\n    _Inout_ PSIZE_T ViewSize,\n    _In_ ULONG AllocationType,\n    _In_ ULONG PageProtection,\n    _Inout_updates_opt_(ExtendedParameterCount) PMEM_EXTENDED_PARAMETER ExtendedParameters,\n    _In_ ULONG ExtendedParameterCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwModifyBootEntry(\n    _In_ PBOOT_ENTRY BootEntry\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwModifyDriverEntry(\n    _In_ PEFI_DRIVER_ENTRY DriverEntry\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwNotifyChangeDirectoryFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer, // FILE_NOTIFY_INFORMATION\n    _In_ ULONG Length,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwNotifyChangeDirectoryFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _In_opt_ DIRECTORY_NOTIFY_INFORMATION_CLASS DirectoryNotifyInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwNotifyChangeKey(\n    _In_ HANDLE KeyHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _Out_writes_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _In_ BOOLEAN Asynchronous\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwNotifyChangeMultipleKeys(\n    _In_ HANDLE MasterKeyHandle,\n    _In_opt_ ULONG Count,\n    _In_reads_opt_(Count) OBJECT_ATTRIBUTES SubordinateObjects[],\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG CompletionFilter,\n    _In_ BOOLEAN WatchTree,\n    _Out_writes_bytes_opt_(BufferSize) PVOID Buffer,\n    _In_ ULONG BufferSize,\n    _In_ BOOLEAN Asynchronous\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwNotifyChangeSession(\n    _In_ HANDLE SessionHandle,\n    _In_ ULONG ChangeSequenceNumber,\n    _In_ PLARGE_INTEGER ChangeTimeStamp,\n    _In_ IO_SESSION_EVENT Event,\n    _In_ IO_SESSION_STATE NewState,\n    _In_ IO_SESSION_STATE PreviousState,\n    _In_reads_bytes_opt_(PayloadSize) PVOID Payload,\n    _In_ ULONG PayloadSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenCpuPartition(\n    _Out_ PHANDLE CpuPartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenDirectoryObject(\n    _Out_ PHANDLE DirectoryHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenEnlistment(\n    _Out_ PHANDLE EnlistmentHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ LPGUID EnlistmentGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenEvent(\n    _Out_ PHANDLE EventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenEventPair(\n    _Out_ PHANDLE EventPairHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenFile(\n    _Out_ PHANDLE FileHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ ULONG ShareAccess,\n    _In_ ULONG OpenOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenIoCompletion(\n    _Out_ PHANDLE IoCompletionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenJobObject(\n    _Out_ PHANDLE JobHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenKey(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenKeyedEvent(\n    _Out_ PHANDLE KeyedEventHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenKeyEx(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG OpenOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenKeyTransacted(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ HANDLE TransactionHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenKeyTransactedEx(\n    _Out_ PHANDLE KeyHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ ULONG OpenOptions,\n    _In_ HANDLE TransactionHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenMutant(\n    _Out_ PHANDLE MutantHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ PCUNICODE_STRING ObjectTypeName,\n    _In_ PCUNICODE_STRING ObjectName,\n    _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ACCESS_MASK GrantedAccess,\n    _In_opt_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN ObjectCreation,\n    _In_ BOOLEAN AccessGranted,\n    _Out_ PBOOLEAN GenerateOnClose\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenPartition(\n    _Out_ PHANDLE PartitionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenPrivateNamespace(\n    _Out_ PHANDLE NamespaceHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenProcess(\n    _Out_ PHANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCLIENT_ID ClientId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenProcessToken(\n    _In_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _Out_ PHANDLE TokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenProcessTokenEx(\n    _In_ HANDLE ProcessHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG HandleAttributes,\n    _Out_ PHANDLE TokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenRegistryTransaction(\n    _Out_ HANDLE *RegistryTransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenResourceManager(\n    _Out_ PHANDLE ResourceManagerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ HANDLE TmHandle,\n    _In_opt_ LPGUID ResourceManagerGuid,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenSection(\n    _Out_ PHANDLE SectionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenSemaphore(\n    _Out_ PHANDLE SemaphoreHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenSession(\n    _Out_ PHANDLE SessionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenSymbolicLinkObject(\n    _Out_ PHANDLE LinkHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenThread(\n    _Out_ PHANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCLIENT_ID ClientId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenThreadToken(\n    _In_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ BOOLEAN OpenAsSelf,\n    _Out_ PHANDLE TokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenThreadTokenEx(\n    _In_ HANDLE ThreadHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ BOOLEAN OpenAsSelf,\n    _In_ ULONG HandleAttributes,\n    _Out_ PHANDLE TokenHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenTimer(\n    _Out_ PHANDLE TimerHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PCOBJECT_ATTRIBUTES ObjectAttributes\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenTransaction(\n    _Out_ PHANDLE TransactionHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_ LPGUID Uow,\n    _In_opt_ HANDLE TmHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwOpenTransactionManager(\n    _Out_ PHANDLE TmHandle,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _In_opt_ PCUNICODE_STRING LogFileName,\n    _In_opt_ LPGUID TmIdentity,\n    _In_opt_ ULONG OpenOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPlugPlayControl(\n    _In_ PLUGPLAY_CONTROL_CLASS PnPControlClass,\n    _Inout_updates_bytes_(PnPControlDataLength) PVOID PnPControlData,\n    _In_ ULONG PnPControlDataLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPowerInformation(\n    _In_ POWER_INFORMATION_LEVEL InformationLevel,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrepareComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrepareEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrePrepareComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrePrepareEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrivilegeCheck(\n    _In_ HANDLE ClientToken,\n    _Inout_ PPRIVILEGE_SET RequiredPrivileges,\n    _Out_ PBOOLEAN Result\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrivilegedServiceAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_ PCUNICODE_STRING ServiceName,\n    _In_ HANDLE ClientToken,\n    _In_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN AccessGranted\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPrivilegeObjectAuditAlarm(\n    _In_ PCUNICODE_STRING SubsystemName,\n    _In_opt_ PVOID HandleId,\n    _In_ HANDLE ClientToken,\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ PPRIVILEGE_SET Privileges,\n    _In_ BOOLEAN AccessGranted\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPropagationComplete(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ ULONG RequestCookie,\n    _In_ ULONG BufferLength,\n    _In_ PVOID Buffer\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPropagationFailed(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ ULONG RequestCookie,\n    _In_ NTSTATUS PropStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwProtectVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG NewProtection,\n    _Out_ PULONG OldProtection\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPssCaptureVaSpaceBulk(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ PNTPSS_MEMORY_BULK_INFORMATION BulkInformation,\n    _In_ SIZE_T BulkInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwPulseEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryAttributesFile(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PFILE_BASIC_INFORMATION FileInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryAuxiliaryCounterFrequency(\n    _Out_ PULONG64 AuxiliaryCounterFrequency\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryBootEntryOrder(\n    _Out_writes_opt_(*Count) PULONG Ids,\n    _Inout_ PULONG Count\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryBootOptions(\n    _Out_writes_bytes_opt_(*BootOptionsLength) PBOOT_OPTIONS BootOptions,\n    _Inout_ PULONG BootOptionsLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDefaultLocale(\n    _In_ BOOLEAN UserProfile,\n    _Out_ PLCID DefaultLocaleId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDefaultUILanguage(\n    _Out_ LANGID *DefaultUILanguageId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDirectoryFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_opt_ PCUNICODE_STRING FileName,\n    _In_ BOOLEAN RestartScan\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDirectoryFileEx(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass,\n    _In_ ULONG QueryFlags,\n    _In_opt_ PCUNICODE_STRING FileName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDirectoryObject(\n    _In_ HANDLE DirectoryHandle,\n    _Out_writes_bytes_opt_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_ BOOLEAN RestartScan,\n    _Inout_ PULONG Context,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryDriverEntryOrder(\n    _Out_writes_opt_(*Count) PULONG Ids,\n    _Inout_ PULONG Count\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryEaFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_reads_bytes_opt_(EaListLength) PVOID EaList,\n    _In_ ULONG EaListLength,\n    _In_opt_ PULONG EaIndex,\n    _In_ BOOLEAN RestartScan\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryEvent(\n    _In_ HANDLE EventHandle,\n    _In_ EVENT_INFORMATION_CLASS EventInformationClass,\n    _Out_writes_bytes_(EventInformationLength) PVOID EventInformation,\n    _In_ ULONG EventInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryFullAttributesFile(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationAtom(\n    _In_ RTL_ATOM Atom,\n    _In_ ATOM_INFORMATION_CLASS AtomInformationClass,\n    _Out_writes_bytes_(AtomInformationLength) PVOID AtomInformation,\n    _In_ ULONG AtomInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationByName(\n    _In_ POBJECT_ATTRIBUTES ObjectAttributes,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationCpuPartition(\n    _In_ HANDLE CpuPartitionHandle,\n    _In_ ULONG CpuPartitionInformationClass,\n    _Out_writes_bytes_opt_(CpuPartitionInformationLength) PVOID CpuPartitionInformation,\n    _In_ ULONG CpuPartitionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,\n    _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,\n    _In_ ULONG EnlistmentInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationJobObject(\n    _In_opt_ HANDLE JobHandle,\n    _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,\n    _Out_writes_bytes_(JobObjectInformationLength) PVOID JobObjectInformation,\n    _In_ ULONG JobObjectInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationPort(\n    _In_ HANDLE PortHandle,\n    _In_ PORT_INFORMATION_CLASS PortInformationClass,\n    _Out_writes_bytes_to_(Length, *ReturnLength) PVOID PortInformation,\n    _In_ ULONG Length,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,\n    _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,\n    _In_ ULONG ResourceManagerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ THREADINFOCLASS ThreadInformationClass,\n    _Out_writes_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationToken(\n    _In_ HANDLE TokenHandle,\n    _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,\n    _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation,\n    _In_ ULONG TokenInformationLength,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,\n    _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,\n    _In_ ULONG TransactionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationTransactionManager(\n    _In_ HANDLE TransactionManagerHandle,\n    _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,\n    _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,\n    _In_ ULONG TransactionManagerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInformationWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _In_ WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    _Out_writes_bytes_(WorkerFactoryInformationLength) PVOID WorkerFactoryInformation,\n    _In_ ULONG WorkerFactoryInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryInstallUILanguage(\n    _Out_ LANGID *InstallUILanguageId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryIntervalProfile(\n    _In_ KPROFILE_SOURCE ProfileSource,\n    _Out_ PULONG Interval\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _In_ IO_COMPLETION_INFORMATION_CLASS IoCompletionInformationClass,\n    _Out_writes_bytes_(IoCompletionInformationLength) PVOID IoCompletionInformation,\n    _In_ ULONG IoCompletionInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryIoRingCapabilities(\n    _In_ SIZE_T IoRingCapabilitiesLength,\n    _Out_ PVOID IoRingCapabilities\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryKey(\n    _In_ HANDLE KeyHandle,\n    _In_ KEY_INFORMATION_CLASS KeyInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryLicenseValue(\n    _In_ PCUNICODE_STRING ValueName,\n    _Out_opt_ PULONG Type,\n    _Out_writes_bytes_to_opt_(DataSize, *ResultDataSize) PVOID Data,\n    _In_ ULONG DataSize,\n    _Out_ PULONG ResultDataSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryMultipleValueKey(\n    _In_ HANDLE KeyHandle,\n    _Inout_updates_(EntryCount) PKEY_VALUE_ENTRY ValueEntries,\n    _In_ ULONG EntryCount,\n    _Out_writes_bytes_(*BufferLength) PVOID ValueBuffer,\n    _Inout_ PULONG BufferLength,\n    _Out_opt_ PULONG RequiredBufferLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryMutant(\n    _In_ HANDLE MutantHandle,\n    _In_ MUTANT_INFORMATION_CLASS MutantInformationClass,\n    _Out_writes_bytes_(MutantInformationLength) PVOID MutantInformation,\n    _In_ ULONG MutantInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryObject(\n    _In_opt_ HANDLE Handle,\n    _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation,\n    _In_ ULONG ObjectInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryOpenSubKeys(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _Out_ PULONG HandleCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryOpenSubKeysEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ ULONG BufferLength,\n    _Out_writes_bytes_opt_(BufferLength) PVOID Buffer,\n    _Out_ PULONG RequiredSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryPerformanceCounter(\n    _Out_ PLARGE_INTEGER PerformanceCounter,\n    _Out_opt_ PLARGE_INTEGER PerformanceFrequency\n    );\n\nNTSYSCALLAPI\nLOGICAL\nNTAPI\nZwQueryPortInformationProcess(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryQuotaInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_ BOOLEAN ReturnSingleEntry,\n    _In_reads_bytes_opt_(SidListLength) PVOID SidList,\n    _In_ ULONG SidListLength,\n    _In_opt_ PSID StartSid,\n    _In_ BOOLEAN RestartScan\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySection(\n    _In_ HANDLE SectionHandle,\n    _In_ SECTION_INFORMATION_CLASS SectionInformationClass,\n    _Out_writes_bytes_(SectionInformationLength) PVOID SectionInformation,\n    _In_ SIZE_T SectionInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySecurityAttributesToken(\n    _In_ HANDLE TokenHandle,\n    _In_reads_opt_(NumberOfAttributes) PCUNICODE_STRING Attributes,\n    _In_ ULONG NumberOfAttributes,\n    _Out_writes_bytes_(Length) PVOID Buffer, // PTOKEN_SECURITY_ATTRIBUTES_INFORMATION\n    _In_ ULONG Length,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySecurityObject(\n    _In_ HANDLE Handle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _Out_writes_bytes_to_opt_(Length, *LengthNeeded) PSECURITY_DESCRIPTOR SecurityDescriptor,\n    _In_ ULONG Length,\n    _Out_ PULONG LengthNeeded\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySecurityPolicy(\n    _In_ PCUNICODE_STRING Policy,\n    _In_ PCUNICODE_STRING KeyName,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_ SECURE_SETTING_VALUE_TYPE ValueType,\n    _Out_writes_bytes_opt_(*ValueSize) PVOID Value,\n    _Inout_ PULONG ValueSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySemaphore(\n    _In_ HANDLE SemaphoreHandle,\n    _In_ SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass,\n    _Out_writes_bytes_(SemaphoreInformationLength) PVOID SemaphoreInformation,\n    _In_ ULONG SemaphoreInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySymbolicLinkObject(\n    _In_ HANDLE LinkHandle,\n    _Inout_ PUNICODE_STRING LinkTarget,\n    _Out_opt_ PULONG ReturnedLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySystemEnvironmentValue(\n    _In_ PCUNICODE_STRING VariableName,\n    _Out_writes_bytes_(ValueLength) PWSTR VariableValue,\n    _In_ USHORT ValueLength,\n    _Out_opt_ PUSHORT ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySystemEnvironmentValueEx(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCGUID VendorGuid,\n    _Out_writes_bytes_opt_(*BufferLength) PVOID Buffer,\n    _Inout_ PULONG BufferLength,\n    _Out_opt_ PULONG Attributes // EFI_VARIABLE_*\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _Out_writes_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySystemInformationEx(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_reads_bytes_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQuerySystemTime(\n    _Out_ PLARGE_INTEGER SystemTime\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryTimer(\n    _In_ HANDLE TimerHandle,\n    _In_ TIMER_INFORMATION_CLASS TimerInformationClass,\n    _Out_writes_bytes_(TimerInformationLength) PVOID TimerInformation,\n    _In_ ULONG TimerInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryTimerResolution(\n    _Out_ PULONG MaximumTime,\n    _Out_ PULONG MinimumTime,\n    _Out_ PULONG CurrentTime\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\n    _Out_writes_bytes_to_opt_(Length, *ResultLength) PVOID KeyValueInformation,\n    _In_ ULONG Length,\n    _Out_ PULONG ResultLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    _Out_writes_bytes_(MemoryInformationLength) PVOID MemoryInformation,\n    _In_ SIZE_T MemoryInformationLength,\n    _Out_opt_ PSIZE_T ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryVolumeInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID FsInformation,\n    _In_ ULONG Length,\n    _In_ FSINFOCLASS FsInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_opt_ const VOID* ExplicitScope,\n    _Out_ PWNF_CHANGE_STAMP ChangeStamp,\n    _Out_writes_bytes_opt_(*BufferSize) PVOID Buffer,\n    _Inout_ PULONG BufferSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueryWnfStateNameInformation(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_ WNF_STATE_NAME_INFORMATION NameInfoClass,\n    _In_opt_ const VOID* ExplicitScope,\n    _Out_writes_bytes_(InfoBufferSize) PVOID InfoBuffer,\n    _In_ ULONG InfoBufferSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueueApcThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueueApcThreadEx(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ HANDLE ReserveHandle, // NtAllocateReserveObject // QUEUE_USER_APC_SPECIAL_USER_APC\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwQueueApcThreadEx2(\n    _In_ HANDLE ThreadHandle,\n    _In_opt_ HANDLE ReserveHandle, // NtAllocateReserveObject\n    _In_ ULONG ApcFlags, // QUEUE_USER_APC_FLAGS\n    _In_ PPS_APC_ROUTINE ApcRoutine, // RtlDispatchAPC\n    _In_opt_ PVOID ApcArgument1,\n    _In_opt_ PVOID ApcArgument2,\n    _In_opt_ PVOID ApcArgument3\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRaiseException(\n    _In_ PEXCEPTION_RECORD ExceptionRecord,\n    _In_ PCONTEXT ContextRecord,\n    _In_ BOOLEAN FirstChance\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRaiseHardError(\n    _In_ NTSTATUS ErrorStatus,\n    _In_ ULONG NumberOfParameters,\n    _In_ ULONG UnicodeStringParameterMask,\n    _In_reads_(NumberOfParameters) PULONG_PTR Parameters,\n    _In_ ULONG ValidResponseOptions,\n    _Out_ PULONG Response\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _Out_writes_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadFileScatter(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PFILE_SEGMENT_ELEMENT SegmentArray,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadOnlyEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadRequestData(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ ULONG DataEntryIndex,\n    _Out_writes_bytes_to_(BufferSize, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _Out_opt_ PSIZE_T NumberOfBytesRead\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToRead,\n    _Out_opt_ PSIZE_T NumberOfBytesRead\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReadVirtualMemoryEx(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToRead,\n    _Out_opt_ PSIZE_T NumberOfBytesRead,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRecoverEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PVOID EnlistmentKey\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRecoverResourceManager(\n    _In_ HANDLE ResourceManagerHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRecoverTransactionManager(\n    _In_ HANDLE TransactionManagerHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRegisterProtocolAddressInformation(\n    _In_ HANDLE ResourceManager,\n    _In_ PCRM_PROTOCOL_ID ProtocolId,\n    _In_ ULONG ProtocolInformationSize,\n    _In_ PVOID ProtocolInformation,\n    _In_opt_ ULONG CreateOptions\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRegisterThreadTerminatePort(\n    _In_ HANDLE PortHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReleaseCMFViewOwnership(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReleaseKeyedEvent(\n    _In_opt_ HANDLE KeyedEventHandle,\n    _In_ PVOID KeyValue,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReleaseMutant(\n    _In_ HANDLE MutantHandle,\n    _Out_opt_ PLONG PreviousCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReleaseSemaphore(\n    _In_ HANDLE SemaphoreHandle,\n    _In_ LONG ReleaseCount,\n    _Out_opt_ PLONG PreviousCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReleaseWorkerFactoryWorker(\n    _In_ HANDLE WorkerFactoryHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRemoveIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _Out_ PVOID *KeyContext,\n    _Out_ PVOID *ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRemoveIoCompletionEx(\n    _In_ HANDLE IoCompletionHandle,\n    _Out_writes_to_(Count, *NumEntriesRemoved) PFILE_IO_COMPLETION_INFORMATION IoCompletionInformation,\n    _In_ ULONG Count,\n    _Out_ PULONG NumEntriesRemoved,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _In_ BOOLEAN Alertable\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRemoveProcessDebug(\n    _In_ HANDLE ProcessHandle,\n    _In_ HANDLE DebugObjectHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRenameKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING NewName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRenameTransactionManager(\n    _In_ PCUNICODE_STRING LogFileName,\n    _In_ LPGUID ExistingTransactionManagerGuid\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplaceKey(\n    _In_ POBJECT_ATTRIBUTES NewFile,\n    _In_ HANDLE TargetHandle,\n    _In_ POBJECT_ATTRIBUTES OldFile\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplacePartitionUnit(\n    _In_ PCUNICODE_STRING TargetInstancePath,\n    _In_ PCUNICODE_STRING SpareInstancePath,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplyPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplyWaitReceivePort(\n    _In_ HANDLE PortHandle,\n    _Out_opt_ PVOID *PortContext,\n    _In_reads_bytes_opt_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage,\n    _Out_ PPORT_MESSAGE ReceiveMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplyWaitReceivePortEx(\n    _In_ HANDLE PortHandle,\n    _Out_opt_ PVOID *PortContext,\n    _In_reads_bytes_opt_(ReplyMessage->u1.s1.TotalLength) PPORT_MESSAGE ReplyMessage,\n    _Out_ PPORT_MESSAGE ReceiveMessage,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwReplyWaitReplyPort(\n    _In_ HANDLE PortHandle,\n    _Inout_ PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRequestPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(RequestMessage->u1.s1.TotalLength) PPORT_MESSAGE RequestMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRequestWaitReplyPort(\n    _In_ HANDLE PortHandle,\n    _In_reads_bytes_(RequestMessage->u1.s1.TotalLength) PPORT_MESSAGE RequestMessage,\n    _Out_ PPORT_MESSAGE ReplyMessage\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRequestWakeupLatency(\n    _In_ LATENCY_TIME latency\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwResetEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwResetWriteWatch(\n    _In_ HANDLE ProcessHandle,\n    _In_ PVOID BaseAddress,\n    _In_ SIZE_T RegionSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRestoreKey(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwResumeProcess(\n    _In_ HANDLE ProcessHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwResumeThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRevertContainerImpersonation(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRollbackComplete(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRollbackEnlistment(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRollbackRegistryTransaction(\n    _In_ HANDLE RegistryTransactionHandle,\n    _Reserved_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRollbackTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ BOOLEAN Wait\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwRollforwardTransactionManager(\n    _In_ HANDLE TransactionManagerHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSaveKey(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSaveKeyEx(\n    _In_ HANDLE KeyHandle,\n    _In_ HANDLE FileHandle,\n    _In_ ULONG Format\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSaveMergedKeys(\n    _In_ HANDLE HighPrecedenceKeyHandle,\n    _In_ HANDLE LowPrecedenceKeyHandle,\n    _In_ HANDLE FileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSecureConnectPort(\n    _Out_ PHANDLE PortHandle,\n    _In_ PCUNICODE_STRING PortName,\n    _In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,\n    _Inout_opt_ PPORT_VIEW ClientView,\n    _In_opt_ PSID RequiredServerSid,\n    _Inout_opt_ PREMOTE_PORT_VIEW ServerView,\n    _Out_opt_ PULONG MaxMessageLength,\n    _Inout_updates_bytes_to_opt_(*ConnectionInformationLength, *ConnectionInformationLength) PVOID ConnectionInformation,\n    _Inout_opt_ PULONG ConnectionInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSerializeBoot(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetBootEntryOrder(\n    _In_reads_(Count) PULONG Ids,\n    _In_ ULONG Count\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetBootOptions(\n    _In_ PBOOT_OPTIONS BootOptions,\n    _In_ ULONG FieldsToChange\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetCachedSigningLevel(\n    _In_ ULONG Flags,\n    _In_ SE_SIGNING_LEVEL InputSigningLevel,\n    _In_reads_(SourceFileCount) PHANDLE SourceFiles,\n    _In_ ULONG SourceFileCount,\n    _In_opt_ HANDLE TargetFile\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetCachedSigningLevel2(\n    _In_ ULONG Flags,\n    _In_ SE_SIGNING_LEVEL InputSigningLevel,\n    _In_reads_(SourceFileCount) PHANDLE SourceFiles,\n    _In_ ULONG SourceFileCount,\n    _In_opt_ HANDLE TargetFile,\n    _In_opt_ SE_SET_FILE_CACHE_INFORMATION* CacheInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetContextThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ PCONTEXT ThreadContext\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetDebugFilterState(\n    _In_ ULONG ComponentId,\n    _In_ ULONG Level,\n    _In_ BOOLEAN State\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetDefaultHardErrorPort(\n    _In_ HANDLE DefaultHardErrorPort\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetDefaultLocale(\n    _In_ BOOLEAN UserProfile,\n    _In_ LCID DefaultLocaleId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetDefaultUILanguage(\n    _In_ LANGID DefaultUILanguageId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetDriverEntryOrder(\n    _In_reads_(Count) PULONG Ids,\n    _In_ ULONG Count\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetEaFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetEvent(\n    _In_ HANDLE EventHandle,\n    _Out_opt_ PLONG PreviousState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetEventBoostPriority(\n    _In_ HANDLE EventHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetEventEx(\n    _In_ HANDLE ThreadId,\n    _In_opt_ PRTL_SRWLOCK Lock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetHighWaitLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationCpuPartition(\n    _In_ HANDLE CpuPartitionHandle,\n    _In_ ULONG CpuPartitionInformationClass,\n    _In_reads_bytes_(CpuPartitionInformationLength) PVOID CpuPartitionInformation,\n    _In_ ULONG CpuPartitionInformationLength,\n    _Reserved_ PVOID,\n    _Reserved_ ULONG,\n    _Reserved_ ULONG\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationDebugObject(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ DEBUGOBJECTINFOCLASS DebugObjectInformationClass,\n    _In_reads_bytes_(DebugInformationLength) PVOID DebugInformation,\n    _In_ ULONG DebugInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationEnlistment(\n    _In_opt_ HANDLE EnlistmentHandle,\n    _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,\n    _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,\n    _In_ ULONG EnlistmentInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID FileInformation,\n    _In_ ULONG Length,\n    _In_ FILE_INFORMATION_CLASS FileInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationIoRing(\n    _In_ HANDLE IoRingHandle,\n    _In_ ULONG IoRingInformationClass,\n    _In_ ULONG IoRingInformationLength,\n    _In_ PVOID IoRingInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,\n    _In_reads_bytes_(JobObjectInformationLength) PVOID JobObjectInformation,\n    _In_ ULONG JobObjectInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationKey(\n    _In_ HANDLE KeyHandle,\n    _In_ KEY_SET_INFORMATION_CLASS KeySetInformationClass,\n    _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation,\n    _In_ ULONG KeySetInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationObject(\n    _In_ HANDLE Handle,\n    _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    _In_reads_bytes_(ObjectInformationLength) PVOID ObjectInformation,\n    _In_ ULONG ObjectInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationProcess(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _In_reads_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationResourceManager(\n    _In_ HANDLE ResourceManagerHandle,\n    _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,\n    _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,\n    _In_ ULONG ResourceManagerInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationSymbolicLink(\n    _In_ HANDLE LinkHandle,\n    _In_ SYMBOLIC_LINK_INFO_CLASS SymbolicLinkInformationClass,\n    _In_reads_bytes_(SymbolicLinkInformationLength) PVOID SymbolicLinkInformation,\n    _In_ ULONG SymbolicLinkInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationThread(\n    _In_ HANDLE ThreadHandle,\n    _In_ THREADINFOCLASS ThreadInformationClass,\n    _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation,\n    _In_ ULONG ThreadInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationToken(\n    _In_ HANDLE TokenHandle,\n    _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,\n    _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation,\n    _In_ ULONG TokenInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationTransaction(\n    _In_ HANDLE TransactionHandle,\n    _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,\n    _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation,\n    _In_ ULONG TransactionInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationTransactionManager(\n    _In_opt_ HANDLE TmHandle,\n    _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,\n    _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,\n    _In_ ULONG TransactionManagerInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_ VIRTUAL_MEMORY_INFORMATION_CLASS VmInformationClass,\n    _In_ SIZE_T NumberOfEntries,\n    _In_reads_(NumberOfEntries) PVOID VirtualAddresses,\n    _In_reads_bytes_(VmInformationLength) PVOID VmInformation,\n    _In_ ULONG VmInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetInformationWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _In_ WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    _In_reads_bytes_(WorkerFactoryInformationLength) PVOID WorkerFactoryInformation,\n    _In_ ULONG WorkerFactoryInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetIntervalProfile(\n    _In_ ULONG Interval,\n    _In_ KPROFILE_SOURCE Source\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetIoCompletion(\n    _In_ HANDLE IoCompletionHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetIoCompletionEx(\n    _In_ HANDLE IoCompletionHandle,\n    _In_ HANDLE IoCompletionPacketHandle,\n    _In_opt_ PVOID KeyContext,\n    _In_opt_ PVOID ApcContext,\n    _In_ NTSTATUS IoStatus,\n    _In_ ULONG_PTR IoStatusInformation\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetIRTimer(\n    _In_ HANDLE TimerHandle,\n    _In_opt_ PLARGE_INTEGER DueTime\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetLdtEntries(\n    _In_ ULONG Selector0,\n    _In_ ULONG Entry0Low,\n    _In_ ULONG Entry0Hi,\n    _In_ ULONG Selector1,\n    _In_ ULONG Entry1Low,\n    _In_ ULONG Entry1Hi\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetLowWaitHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetQuotaInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSecurityObject(\n    _In_ HANDLE Handle,\n    _In_ SECURITY_INFORMATION SecurityInformation,\n    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSystemEnvironmentValue(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCUNICODE_STRING VariableValue\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSystemEnvironmentValueEx(\n    _In_ PCUNICODE_STRING VariableName,\n    _In_ PCGUID VendorGuid,\n    _In_reads_bytes_opt_(BufferLength) PVOID Buffer,\n    _In_ ULONG BufferLength, // 0 = delete variable\n    _In_ ULONG Attributes // EFI_VARIABLE_*\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSystemInformation(\n    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    _In_reads_bytes_opt_(SystemInformationLength) PVOID SystemInformation,\n    _In_ ULONG SystemInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSystemPowerState(\n    _In_ POWER_ACTION SystemAction,\n    _In_ SYSTEM_POWER_STATE LightestSystemState,\n    _In_ ULONG Flags // POWER_ACTION_* flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetSystemTime(\n    _In_opt_ PLARGE_INTEGER SystemTime,\n    _Out_opt_ PLARGE_INTEGER PreviousTime\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetThreadExecutionState(\n    _In_ EXECUTION_STATE NewFlags, // ES_* flags\n    _Out_ EXECUTION_STATE *PreviousFlags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetTimer(\n    _In_ HANDLE TimerHandle,\n    _In_ PLARGE_INTEGER DueTime,\n    _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine,\n    _In_opt_ PVOID TimerContext,\n    _In_ BOOLEAN ResumeTimer,\n    _In_opt_ LONG Period,\n    _Out_opt_ PBOOLEAN PreviousState\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetTimer2(\n    _In_ HANDLE TimerHandle,\n    _In_ PLARGE_INTEGER DueTime,\n    _In_opt_ PLARGE_INTEGER Period,\n    _In_ PT2_SET_PARAMETERS Parameters\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetTimerEx(\n    _In_ HANDLE TimerHandle,\n    _In_ TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,\n    _Inout_updates_bytes_opt_(TimerSetInformationLength) PVOID TimerSetInformation,\n    _In_ ULONG TimerSetInformationLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetTimerResolution(\n    _In_ ULONG DesiredTime,\n    _In_ BOOLEAN SetResolution,\n    _Out_ PULONG ActualTime\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetUuidSeed(\n    _In_ PCHAR Seed\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetValueKey(\n    _In_ HANDLE KeyHandle,\n    _In_ PCUNICODE_STRING ValueName,\n    _In_opt_ ULONG TitleIndex,\n    _In_ ULONG Type,\n    _In_reads_bytes_opt_(DataSize) PVOID Data,\n    _In_ ULONG DataSize\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetVolumeInformationFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID FsInformation,\n    _In_ ULONG Length,\n    _In_ FSINFOCLASS FsInformationClass\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSetWnfProcessNotificationEvent(\n    _In_ HANDLE NotificationEvent\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwShutdownSystem(\n    _In_ SHUTDOWN_ACTION Action\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwShutdownWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _Inout_ volatile LONG *PendingWorkerCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSignalAndWaitForSingleObject(\n    _In_ HANDLE SignalHandle,\n    _In_ HANDLE WaitHandle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSinglePhaseReject(\n    _In_ HANDLE EnlistmentHandle,\n    _In_opt_ PLARGE_INTEGER TmVirtualClock\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwStartProfile(\n    _In_ HANDLE ProfileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwStopProfile(\n    _In_ HANDLE ProfileHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSubmitIoRing(\n    _In_ HANDLE IoRingHandle,\n    _In_ ULONG Flags,\n    _In_opt_ ULONG WaitOperations,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSubscribeWnfStateChange(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_opt_ WNF_CHANGE_STAMP ChangeStamp,\n    _In_ ULONG EventMask,\n    _Out_opt_ PULONG64 SubscriptionId\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSuspendProcess(\n    _In_ HANDLE ProcessHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSuspendThread(\n    _In_ HANDLE ThreadHandle,\n    _Out_opt_ PULONG PreviousSuspendCount\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwSystemDebugControl(\n    _In_ SYSDBG_COMMAND Command,\n    _Inout_updates_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTerminateEnclave(\n    _In_ PVOID BaseAddress,\n    _In_ ULONG Flags // TERMINATE_ENCLAVE_FLAG_*\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTerminateJobObject(\n    _In_ HANDLE JobHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTerminateProcess(\n    _In_opt_ HANDLE ProcessHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTerminateThread(\n    _In_opt_ HANDLE ThreadHandle,\n    _In_ NTSTATUS ExitStatus\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTestAlert(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwThawRegistry(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwThawTransactions(\n    VOID\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTraceControl(\n    _In_ ETWTRACECONTROLCODE FunctionCode,\n    _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,\n    _In_ ULONG InputBufferLength,\n    _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,\n    _In_ ULONG OutputBufferLength,\n    _Out_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTraceEvent(\n    _In_opt_ HANDLE TraceHandle,\n    _In_ ULONG Flags,\n    _In_ ULONG FieldSize,\n    _In_ PVOID Fields\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwTranslateFilePath(\n    _In_ PFILE_PATH InputFilePath,\n    _In_ ULONG OutputType,\n    _Out_writes_bytes_opt_(*OutputFilePathLength) PFILE_PATH OutputFilePath,\n    _Inout_opt_ PULONG OutputFilePathLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUmsThreadYield(\n    _In_ PVOID SchedulerParam\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnloadDriver(\n    _In_ PCUNICODE_STRING DriverServiceName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnloadKey(\n    _In_ POBJECT_ATTRIBUTES TargetKey\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnloadKey2(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnloadKeyEx(\n    _In_ POBJECT_ATTRIBUTES TargetKey,\n    _In_opt_ HANDLE Event\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnlockFile(\n    _In_ HANDLE FileHandle,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PLARGE_INTEGER ByteOffset,\n    _In_ PLARGE_INTEGER Length,\n    _In_ ULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnlockVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _Inout_ PVOID *BaseAddress,\n    _Inout_ PSIZE_T RegionSize,\n    _In_ ULONG MapType\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnmapViewOfSection(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnmapViewOfSectionEx(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_ ULONG Flags\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUnsubscribeWnfStateChange(\n    _In_ PCWNF_STATE_NAME StateName\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwUpdateWnfStateData(\n    _In_ PCWNF_STATE_NAME StateName,\n    _In_reads_bytes_opt_(Length) const VOID* Buffer,\n    _In_opt_ ULONG Length,\n    _In_opt_ PCWNF_TYPE_ID TypeId,\n    _In_opt_ const VOID* ExplicitScope,\n    _In_ WNF_CHANGE_STAMP MatchingChangeStamp,\n    _In_ LOGICAL CheckStamp\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwVdmControl(\n    _In_ VDMSERVICECLASS Service,\n    _Inout_ PVOID ServiceData\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForAlertByThreadId(\n    _In_opt_ PVOID Address,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForDebugEvent(\n    _In_ HANDLE DebugObjectHandle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout,\n    _Out_ PDBGUI_WAIT_STATE_CHANGE WaitStateChange\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForKeyedEvent(\n    _In_opt_ HANDLE KeyedEventHandle,\n    _In_ PVOID KeyValue,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForMultipleObjects(\n    _In_ ULONG Count,\n    _In_reads_(Count) HANDLE Handles[],\n    _In_ WAIT_TYPE WaitType,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForMultipleObjects32(\n    _In_ ULONG Count,\n    _In_reads_(Count) LONG Handles[],\n    _In_ WAIT_TYPE WaitType,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForSingleObject(\n    _In_ HANDLE Handle,\n    _In_ BOOLEAN Alertable,\n    _In_opt_ PLARGE_INTEGER Timeout\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitForWorkViaWorkerFactory(\n    _In_ HANDLE WorkerFactoryHandle,\n    _Out_writes_to_(Count, *PacketsReturned) PFILE_IO_COMPLETION_INFORMATION MiniPackets,\n    _In_ ULONG Count,\n    _Out_ PULONG PacketsReturned,\n    _In_ PVOID DeferredWork\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitHighEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWaitLowEventPair(\n    _In_ HANDLE EventPairHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWorkerFactoryWorkerReady(\n    _In_ HANDLE WorkerFactoryHandle\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWow64QueryInformationProcess64(\n    _In_ HANDLE ProcessHandle,\n    _In_ PROCESSINFOCLASS ProcessInformationClass,\n    _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation,\n    _In_ ULONG ProcessInformationLength,\n    _Out_opt_ PULONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWow64QueryVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _In_ MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    _Out_writes_bytes_(MemoryInformationLength) PVOID MemoryInformation,\n    _In_ ULONGLONG MemoryInformationLength,\n    _Out_opt_ PULONGLONG ReturnLength\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWow64ReadVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _Out_writes_bytes_to_(NumberOfBytesToRead, *NumberOfBytesRead) PVOID Buffer,\n    _In_ ULONGLONG NumberOfBytesToRead,\n    _Out_opt_ PULONGLONG NumberOfBytesRead\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWow64WriteVirtualMemory64(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ ULONGLONG BaseAddress,\n    _In_reads_bytes_(NumberOfBytesToWrite) PVOID Buffer,\n    _In_ ULONGLONG NumberOfBytesToWrite,\n    _Out_opt_ PULONGLONG NumberOfBytesWritten\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWriteFile(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_reads_bytes_(Length) PVOID Buffer,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWriteFileGather(\n    _In_ HANDLE FileHandle,\n    _In_opt_ HANDLE Event,\n    _In_opt_ PIO_APC_ROUTINE ApcRoutine,\n    _In_opt_ PVOID ApcContext,\n    _Out_ PIO_STATUS_BLOCK IoStatusBlock,\n    _In_ PFILE_SEGMENT_ELEMENT SegmentArray,\n    _In_ ULONG Length,\n    _In_opt_ PLARGE_INTEGER ByteOffset,\n    _In_opt_ PULONG Key\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWriteRequestData(\n    _In_ HANDLE PortHandle,\n    _In_ PPORT_MESSAGE Message,\n    _In_ ULONG DataEntryIndex,\n    _In_reads_bytes_(BufferSize) PVOID Buffer,\n    _In_ SIZE_T BufferSize,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwWriteVirtualMemory(\n    _In_ HANDLE ProcessHandle,\n    _In_opt_ PVOID BaseAddress,\n    _In_reads_bytes_(NumberOfBytesToWrite) PVOID Buffer,\n    _In_ SIZE_T NumberOfBytesToWrite,\n    _Out_opt_ PSIZE_T NumberOfBytesWritten\n    );\n\nNTSYSCALLAPI\nNTSTATUS\nNTAPI\nZwYieldExecution(\n    VOID\n    );\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/phnt.h",
    "content": "/*\n * NT Header annotations\n *\n * This file is part of System Informer.\n */\n\n#ifndef _PHNT_H\n#define _PHNT_H\n\n// This header file provides access to NT APIs.\n\n// Definitions are annotated to indicate their source. If a definition is not annotated, it has been\n// retrieved from an official Microsoft source (NT headers, DDK headers, winnt.h).\n\n// * \"winbase\" indicates that a definition has been reconstructed from a Win32-ized NT definition in\n//   winbase.h.\n// * \"rev\" indicates that a definition has been reverse-engineered.\n// * \"dbg\" indicates that a definition has been obtained from a debug message or assertion in a\n//   checked build of the kernel or file.\n\n// Reliability:\n// 1. No annotation.\n// 2. dbg.\n// 3. symbols, private. Types may be incorrect.\n// 4. winbase. Names and types may be incorrect.\n// 5. rev.\n\n// Mode\n#define PHNT_MODE_KERNEL 0\n#define PHNT_MODE_USER 1\n\n// Version\n#define PHNT_WINDOWS_ANCIENT 0\n#define PHNT_WINDOWS_XP 51 // August, 2001\n#define PHNT_WINDOWS_SERVER_2003 52 // April, 2003\n#define PHNT_WINDOWS_VISTA 60 // November, 2006\n#define PHNT_WINDOWS_7 61 // July, 2009\n#define PHNT_WINDOWS_8 62 // August, 2012\n#define PHNT_WINDOWS_8_1 63 // August, 2013\n#define PHNT_WINDOWS_10 100 // July, 2015            // Version 1507, Build 10240\n#define PHNT_WINDOWS_10_TH2 101 // November, 2015    // Version 1511, Build 10586\n#define PHNT_WINDOWS_10_RS1 102 // August, 2016      // Version 1607, Build 14393\n#define PHNT_WINDOWS_10_RS2 103 // April, 2017       // Version 1703, Build 15063\n#define PHNT_WINDOWS_10_RS3 104 // October, 2017     // Version 1709, Build 16299\n#define PHNT_WINDOWS_10_RS4 105 // April, 2018       // Version 1803, Build 17134\n#define PHNT_WINDOWS_10_RS5 106 // November, 2018    // Version 1809, Build 17763\n#define PHNT_WINDOWS_10_19H1 107 // May, 2019        // Version 1903, Build 18362\n#define PHNT_WINDOWS_10_19H2 108 // November, 2019   // Version 1909, Build 18363\n#define PHNT_WINDOWS_10_20H1 109 // May, 2020        // Version 2004, Build 19041\n#define PHNT_WINDOWS_10_20H2 110 // October, 2020    // Build 19042\n#define PHNT_WINDOWS_10_21H1 111 // May, 2021        // Build 19043\n#define PHNT_WINDOWS_10_21H2 112 // November, 2021   // Build 19044\n#define PHNT_WINDOWS_10_22H2 113 // October, 2022    // Build 19045\n#define PHNT_WINDOWS_11 114 // October, 2021         // Build 22000\n#define PHNT_WINDOWS_11_22H2 115 // September, 2022  // Build 22621\n#define PHNT_WINDOWS_11_23H2 116 // October, 2023    // Build 22631\n#define PHNT_WINDOWS_11_24H2 117 // October, 2024    // Build 26100\n#define PHNT_WINDOWS_NEW ULONG_MAX\n\n#ifndef PHNT_MODE\n#define PHNT_MODE PHNT_MODE_USER\n#endif\n\n#ifndef PHNT_VERSION\n#define PHNT_VERSION PHNT_WINDOWS_NEW\n#endif\n\n//\n// Options\n//\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n//#ifndef PHNT_NO_INLINE_INIT_STRING\n//#define PHNT_NO_INLINE_INIT_STRING\n//#endif // !PHNT_NO_INLINE_INIT_STRING\n#ifndef PHNT_INLINE_TYPEDEFS\n#define PHNT_INLINE_TYPEDEFS\n#endif // !PHNT_INLINE_TYPEDEFS\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\nEXTERN_C_START\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#include \"phnt_ntdef.h\"\n#include \"ntnls.h\"\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\n#include \"ntkeapi.h\"\n#include \"ntldr.h\"\n#include \"ntexapi.h\"\n\n#include \"ntbcd.h\"\n#include \"ntmmapi.h\"\n#include \"ntobapi.h\"\n#include \"ntpsapi.h\"\n\n#if (PHNT_MODE != PHNT_MODE_KERNEL)\n#include \"ntdbg.h\"\n#include \"ntimage.h\"\n#include \"ntioapi.h\"\n#include <ntlsa.h>\n#include \"ntlpcapi.h\"\n#include \"ntmisc.h\"\n#include \"ntpfapi.h\"\n#include \"ntpnpapi.h\"\n#include \"ntpoapi.h\"\n#include \"ntregapi.h\"\n#include \"ntrtl.h\"\n#include \"ntsam.h\"\n#include \"ntseapi.h\"\n#include \"nttmapi.h\"\n#include \"nttp.h\"\n#include \"ntuser.h\"\n#include \"ntwmi.h\"\n#include \"ntwow64.h\"\n#include \"ntxcapi.h\"\n#include \"ntzwapi.h\"\n#endif // (PHNT_MODE != PHNT_MODE_KERNEL)\n\nEXTERN_C_END\n\nstatic_assert(__alignof(LARGE_INTEGER) == 8, \"Windows headers require the default packing option. Changing the packing can lead to memory corruption.\");\nstatic_assert(__alignof(PROCESS_CYCLE_TIME_INFORMATION) == 8, \"PHNT headers require the default packing option. Changing the packing can lead to memory corruption.\");\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/phnt_ntdef.h",
    "content": "/*\n * Native definition support\n *\n * This file is part of System Informer.\n */\n\n#ifndef _PHNT_NTDEF_H\n#define _PHNT_NTDEF_H\n\n#ifndef _NTDEF_\n#define _NTDEF_\n\n// This header file provides basic NT types not included in Win32. If you have included winnt.h\n// (perhaps indirectly), you must use this file instead of ntdef.h.\n\n#ifndef NOTHING\n#define NOTHING\n#endif\n\n//\n// Basic types\n//\n\ntypedef struct _QUAD\n{\n    union\n    {\n        __int64 UseThisFieldToCopy;\n        double DoNotUseThisField;\n    };\n} QUAD, *PQUAD;\n\n// This isn't in NT, but it's useful.\ntypedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _QUAD_PTR\n{\n    ULONG_PTR DoNotUseThisField1;\n    ULONG_PTR DoNotUseThisField2;\n} QUAD_PTR, *PQUAD_PTR;\n\ntypedef ULONG LOGICAL;\ntypedef ULONG *PLOGICAL;\n\ntypedef _Return_type_success_(return >= 0) LONG NTSTATUS;\ntypedef NTSTATUS *PNTSTATUS;\n\n//\n// Cardinal types\n//\n\ntypedef char CCHAR;\ntypedef short CSHORT;\ntypedef ULONG CLONG;\n\ntypedef CCHAR *PCCHAR;\ntypedef CSHORT *PCSHORT;\ntypedef CLONG *PCLONG;\n\ntypedef PCSTR PCSZ;\n\ntypedef PVOID* PPVOID;\ntypedef CONST VOID *PCVOID;\n\n//\n// Specific\n//\n\ntypedef UCHAR KIRQL, *PKIRQL;\ntypedef LONG KPRIORITY, *PKPRIORITY;\ntypedef USHORT RTL_ATOM, *PRTL_ATOM;\n\ntypedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;\n\ntypedef struct _LARGE_INTEGER_128\n{\n    LONGLONG QuadPart[2];\n} LARGE_INTEGER_128, *PLARGE_INTEGER_128;\n\ntypedef struct _ULARGE_INTEGER_128\n{\n    ULONGLONG QuadPart[2];\n} ULARGE_INTEGER_128, *PULARGE_INTEGER_128;\n\n//\n// Limits\n//\n\n#define MINCHAR     0x80        // winnt\n#define MAXCHAR     0x7f        // winnt\n#define MINSHORT    0x8000      // winnt\n#define MAXSHORT    0x7fff      // winnt\n#define MINLONG     0x80000000  // winnt\n#define MAXLONG     0x7fffffff  // winnt\n#define MAXUCHAR    0xff        // winnt\n#define MAXUSHORT   0xffff      // winnt\n#define MAXULONG    0xffffffff  // winnt\n\n//\n// NT status macros\n//\n\n#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1)\n#define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2)\n#define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3)\n\n#define NT_CUSTOMER_SHIFT 29\n#define NT_CUSTOMER(Status) ((((ULONG)(Status)) >> NT_CUSTOMER_SHIFT) & 1)\n\n#define NT_FACILITY_MASK 0xfff\n#define NT_FACILITY_SHIFT 16\n#define NT_FACILITY(Status) ((((ULONG)(Status)) >> NT_FACILITY_SHIFT) & NT_FACILITY_MASK)\n\n#define NT_NTWIN32(Status) (NT_FACILITY(Status) == FACILITY_NTWIN32)\n#define WIN32_FROM_NTSTATUS(Status) (((ULONG)(Status)) & 0xffff)\n\n//\n// Functions\n//\n\n#if defined(_WIN64)\n#define FASTCALL\n#else\n#define FASTCALL __fastcall\n#endif\n\n#if defined(_WIN64)\n#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)\n#else\n#define POINTER_ALIGNMENT\n#endif\n\n#if defined(_WIN64) || defined(_M_ALPHA)\n#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)\n#define MEMORY_ALLOCATION_ALIGNMENT 16\n#else\n#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)\n#define MEMORY_ALLOCATION_ALIGNMENT 8\n#endif\n\n#ifndef DECLSPEC_NOALIAS\n#if _MSC_VER < 1900\n#define DECLSPEC_NOALIAS\n#else\n#define DECLSPEC_NOALIAS __declspec(noalias)\n#endif\n#endif\n\n#ifndef DECLSPEC_IMPORT\n#define DECLSPEC_IMPORT __declspec(dllimport)\n#endif\n\n#ifndef DECLSPEC_EXPORT\n#define DECLSPEC_EXPORT __declspec(dllexport)\n#endif\n\n//\n// Synchronization enumerations\n//\n\ntypedef enum _EVENT_TYPE\n{\n    NotificationEvent,\n    SynchronizationEvent\n} EVENT_TYPE;\n\ntypedef enum _TIMER_TYPE\n{\n    NotificationTimer,\n    SynchronizationTimer\n} TIMER_TYPE;\n\ntypedef enum _WAIT_TYPE\n{\n    WaitAll,\n    WaitAny,\n    WaitNotification,\n    WaitDequeue,\n    WaitDpc,\n} WAIT_TYPE;\n\n//\n// Strings\n//\n\ntypedef struct _STRING\n{\n    USHORT Length;\n    USHORT MaximumLength;\n    _Field_size_bytes_part_opt_(MaximumLength, Length) PCHAR Buffer;\n} STRING, *PSTRING, ANSI_STRING, *PANSI_STRING, OEM_STRING, *POEM_STRING;\n\ntypedef STRING UTF8_STRING;\ntypedef PSTRING PUTF8_STRING;\n\ntypedef const STRING *PCSTRING;\ntypedef const ANSI_STRING *PCANSI_STRING;\ntypedef const OEM_STRING *PCOEM_STRING;\ntypedef const STRING *PCUTF8_STRING;\n\ntypedef struct _UNICODE_STRING\n{\n    USHORT Length;\n    USHORT MaximumLength;\n    _Field_size_bytes_part_opt_(MaximumLength, Length) PWCH Buffer;\n} UNICODE_STRING, *PUNICODE_STRING;\n\ntypedef const UNICODE_STRING *PCUNICODE_STRING;\n\n#ifdef __cplusplus\nextern \"C++\"\n{\ntemplate <size_t N> char _RTL_CONSTANT_STRING_type_check(const char  (&s)[N]);\ntemplate <size_t N> char _RTL_CONSTANT_STRING_type_check(const WCHAR (&s)[N]);\n// __typeof would be desirable here instead of sizeof.\ntemplate <size_t N> class _RTL_CONSTANT_STRING_remove_const_template_class;\ntemplate <> class _RTL_CONSTANT_STRING_remove_const_template_class<sizeof(char)>  {public: typedef  char T; };\ntemplate <> class _RTL_CONSTANT_STRING_remove_const_template_class<sizeof(WCHAR)> {public: typedef WCHAR T; };\n#define _RTL_CONSTANT_STRING_remove_const_macro(s) \\\n    (const_cast<_RTL_CONSTANT_STRING_remove_const_template_class<sizeof((s)[0])>::T*>(s))\n}\n#else\nchar _RTL_CONSTANT_STRING_type_check(const void *s);\n#define _RTL_CONSTANT_STRING_remove_const_macro(s) (s)\n#endif\n#define RTL_CONSTANT_STRING(s) \\\n{ \\\n    sizeof( s ) - sizeof( (s)[0] ), \\\n    sizeof( s ) / sizeof(_RTL_CONSTANT_STRING_type_check(s)), \\\n    _RTL_CONSTANT_STRING_remove_const_macro(s) \\\n}\n\n#define DECLARE_CONST_UNICODE_STRING(_var, _str) \\\nconst WCHAR _var ## _buffer[] = _str; \\\nconst UNICODE_STRING _var = { sizeof(_str) - sizeof(WCHAR), sizeof(_str), (PWCH) _var ## _buffer }\n\n#define DECLARE_GLOBAL_CONST_UNICODE_STRING(_var, _str) \\\nextern const DECLSPEC_SELECTANY UNICODE_STRING _var = RTL_CONSTANT_STRING(_str)\n\n#define DECLARE_UNICODE_STRING_SIZE(_var, _size) \\\nWCHAR _var ## _buffer[_size]; \\\nUNICODE_STRING _var = { 0, (_size) * sizeof(WCHAR) , _var ## _buffer }\n\n//\n// Balanced tree node\n//\n\n#ifndef RTL_BALANCED_NODE_RESERVED_PARENT_MASK\n#define RTL_BALANCED_NODE_RESERVED_PARENT_MASK 3\n#endif\n\ntypedef struct _RTL_BALANCED_NODE\n{\n    union\n    {\n        struct _RTL_BALANCED_NODE *Children[2];\n        struct\n        {\n            struct _RTL_BALANCED_NODE *Left;\n            struct _RTL_BALANCED_NODE *Right;\n        } DUMMYSTRUCTNAME;\n    } DUMMYUNIONNAME;\n    union\n    {\n        UCHAR Red : 1;\n        UCHAR Balance : 2;\n        ULONG_PTR ParentValue;\n    } DUMMYUNIONNAME2;\n} RTL_BALANCED_NODE, *PRTL_BALANCED_NODE;\n\n#ifndef RTL_BALANCED_NODE_GET_PARENT_POINTER\n#define RTL_BALANCED_NODE_GET_PARENT_POINTER(Node) \\\n    ((PRTL_BALANCED_NODE)((Node)->ParentValue & ~RTL_BALANCED_NODE_RESERVED_PARENT_MASK))\n#endif\n\n//\n// Portability\n//\n\ntypedef struct _SINGLE_LIST_ENTRY32\n{\n    ULONG Next;\n} SINGLE_LIST_ENTRY32, *PSINGLE_LIST_ENTRY32;\n\ntypedef struct _STRING32\n{\n    USHORT Length;\n    USHORT MaximumLength;\n    ULONG Buffer;\n} STRING32, *PSTRING32;\n\ntypedef STRING32 UNICODE_STRING32, *PUNICODE_STRING32;\ntypedef STRING32 ANSI_STRING32, *PANSI_STRING32;\n\ntypedef const STRING32 *PCUNICODE_STRING32;\ntypedef const STRING32 *PCANSI_STRING32;\n\ntypedef struct _STRING64\n{\n    USHORT Length;\n    USHORT MaximumLength;\n    ULONGLONG Buffer;\n} STRING64, *PSTRING64;\n\ntypedef STRING64 UNICODE_STRING64, *PUNICODE_STRING64;\ntypedef STRING64 ANSI_STRING64, *PANSI_STRING64;\n\ntypedef const STRING64 *PCUNICODE_STRING64;\ntypedef const STRING64 *PCANSI_STRING64;\n\n//\n// Object attributes\n//\n\n#define OBJ_PROTECT_CLOSE                   0x00000001L\n#define OBJ_INHERIT                         0x00000002L\n#define OBJ_AUDIT_OBJECT_CLOSE              0x00000004L\n#define OBJ_NO_RIGHTS_UPGRADE               0x00000008L\n#define OBJ_PERMANENT                       0x00000010L\n#define OBJ_EXCLUSIVE                       0x00000020L\n#define OBJ_CASE_INSENSITIVE                0x00000040L\n#define OBJ_OPENIF                          0x00000080L\n#define OBJ_OPENLINK                        0x00000100L\n#define OBJ_KERNEL_HANDLE                   0x00000200L\n#define OBJ_FORCE_ACCESS_CHECK              0x00000400L\n#define OBJ_IGNORE_IMPERSONATED_DEVICEMAP   0x00000800L\n#define OBJ_DONT_REPARSE                    0x00001000L\n#define OBJ_VALID_ATTRIBUTES                0x00001FF2L\n\ntypedef struct _OBJECT_ATTRIBUTES\n{\n    ULONG Length;\n    HANDLE RootDirectory;\n    PCUNICODE_STRING ObjectName;\n    ULONG Attributes;\n    PVOID SecurityDescriptor; // PSECURITY_DESCRIPTOR;\n    PVOID SecurityQualityOfService; // PSECURITY_QUALITY_OF_SERVICE\n} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;\n\ntypedef const OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;\n\n#define InitializeObjectAttributes(p, n, a, r, s) { \\\n    (p)->Length = sizeof(OBJECT_ATTRIBUTES); \\\n    (p)->RootDirectory = r; \\\n    (p)->Attributes = a; \\\n    (p)->ObjectName = n; \\\n    (p)->SecurityDescriptor = s; \\\n    (p)->SecurityQualityOfService = NULL; \\\n    }\n\n#define InitializeObjectAttributesEx(p, n, a, r, s, q) { \\\n    (p)->Length = sizeof(OBJECT_ATTRIBUTES); \\\n    (p)->RootDirectory = r; \\\n    (p)->Attributes = a; \\\n    (p)->ObjectName = n; \\\n    (p)->SecurityDescriptor = s; \\\n    (p)->SecurityQualityOfService = q; \\\n    }\n\n#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) { sizeof(OBJECT_ATTRIBUTES), NULL, n, a, NULL, NULL }\n#define RTL_INIT_OBJECT_ATTRIBUTES(n, a) RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)\n\n#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\\\')\n#define OBJ_NAME_ALTPATH_SEPARATOR ((WCHAR)L'/')\n\n//\n// Portability\n//\n\ntypedef struct _OBJECT_ATTRIBUTES64\n{\n    ULONG Length;\n    ULONG64 RootDirectory;\n    ULONG64 ObjectName;\n    ULONG Attributes;\n    ULONG64 SecurityDescriptor;\n    ULONG64 SecurityQualityOfService;\n} OBJECT_ATTRIBUTES64, *POBJECT_ATTRIBUTES64;\n\ntypedef const OBJECT_ATTRIBUTES64 *PCOBJECT_ATTRIBUTES64;\n\ntypedef struct _OBJECT_ATTRIBUTES32\n{\n    ULONG Length;\n    ULONG RootDirectory;\n    ULONG ObjectName;\n    ULONG Attributes;\n    ULONG SecurityDescriptor;\n    ULONG SecurityQualityOfService;\n} OBJECT_ATTRIBUTES32, *POBJECT_ATTRIBUTES32;\n\ntypedef const OBJECT_ATTRIBUTES32 *PCOBJECT_ATTRIBUTES32;\n\n//\n// Product types\n//\n\ntypedef enum _NT_PRODUCT_TYPE\n{\n    NtProductWinNt = 1,\n    NtProductLanManNt,\n    NtProductServer\n} NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;\n\ntypedef enum _SUITE_TYPE\n{\n    SmallBusiness,\n    Enterprise,\n    BackOffice,\n    CommunicationServer,\n    TerminalServer,\n    SmallBusinessRestricted,\n    EmbeddedNT,\n    DataCenter,\n    SingleUserTS,\n    Personal,\n    Blade,\n    EmbeddedRestricted,\n    SecurityAppliance,\n    StorageServer,\n    ComputeServer,\n    WHServer,\n    PhoneNT,\n    MaxSuiteType\n} SUITE_TYPE;\n\n//\n// Specific\n//\n\ntypedef struct _CLIENT_ID\n{\n    HANDLE UniqueProcess;\n    HANDLE UniqueThread;\n} CLIENT_ID, *PCLIENT_ID;\n\ntypedef struct _CLIENT_ID32\n{\n    ULONG UniqueProcess;\n    ULONG UniqueThread;\n} CLIENT_ID32, *PCLIENT_ID32;\n\ntypedef struct _CLIENT_ID64\n{\n    ULONGLONG UniqueProcess;\n    ULONGLONG UniqueThread;\n} CLIENT_ID64, *PCLIENT_ID64;\n\n#include <pshpack4.h>\n\ntypedef struct _KSYSTEM_TIME\n{\n    ULONG LowPart;\n    LONG High1Time;\n    LONG High2Time;\n} KSYSTEM_TIME, *PKSYSTEM_TIME;\n\n#include <poppack.h>\n\n#ifndef AFFINITY_MASK\n#define AFFINITY_MASK(n) ((KAFFINITY)1 << (n))\n#endif\n\n#ifndef FlagOn\n#define FlagOn(_F, _SF) ((_F) & (_SF))\n#endif\n#ifndef BooleanFlagOn\n#define BooleanFlagOn(F, SF) ((BOOLEAN)(((F) & (SF)) != 0))\n#endif\n#ifndef SetFlag\n#define SetFlag(_F, _SF) ((_F) |= (_SF))\n#endif\n#ifndef ClearFlag\n#define ClearFlag(_F, _SF) ((_F) &= ~(_SF))\n#endif\n\n#ifndef Add2Ptr\n#define Add2Ptr(P,I) ((PVOID)((PUCHAR)(P) + (I)))\n#endif\n#ifndef PtrOffset\n#define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))\n#endif\n\n#ifndef ALIGN_UP_BY\n#define ALIGN_UP_BY(Address, Align) (((ULONG_PTR)(Address) + (Align) - 1) & ~((Align) - 1))\n#endif\n#ifndef ALIGN_UP_POINTER_BY\n#define ALIGN_UP_POINTER_BY(Pointer, Align) ((PVOID)ALIGN_UP_BY(Pointer, Align))\n#endif\n#ifndef ALIGN_UP\n#define ALIGN_UP(Address, Type) ALIGN_UP_BY(Address, sizeof(Type))\n#endif\n#ifndef ALIGN_UP_POINTER\n#define ALIGN_UP_POINTER(Pointer, Type) ((PVOID)ALIGN_UP(Pointer, Type))\n#endif\n#ifndef ALIGN_DOWN_BY\n#define ALIGN_DOWN_BY(Address, Align) ((ULONG_PTR)(Address) & ~((ULONG_PTR)(Align) - 1))\n#endif\n#ifndef ALIGN_DOWN_POINTER_BY\n#define ALIGN_DOWN_POINTER_BY(Pointer, Align) ((PVOID)ALIGN_DOWN_BY(Pointer, Align))\n#endif\n#ifndef ALIGN_DOWN\n#define ALIGN_DOWN(Address, Type) ALIGN_DOWN_BY(Address, sizeof(Type))\n#endif\n#ifndef ALIGN_DOWN_POINTER\n#define ALIGN_DOWN_POINTER(Pointer, Type) ((PVOID)ALIGN_DOWN(Pointer, Type))\n#endif\n#ifndef IS_ALIGNED\n#define IS_ALIGNED(Pointer, Alignment) ((((ULONG_PTR)(Pointer)) & ((Alignment) - 1)) == 0)\n#endif\n\n#ifndef PAGE_SIZE\n#define PAGE_SIZE 0x1000\n#endif\n#ifndef PAGE_MASK\n#define PAGE_MASK 0xFFF\n#endif\n#ifndef PAGE_SHIFT\n#define PAGE_SHIFT 0xC\n#endif\n\n#ifndef BYTE_OFFSET\n#define BYTE_OFFSET(Address) ((SIZE_T)((ULONG_PTR)(Address) & PAGE_MASK))\n#endif\n#ifndef PAGE_ALIGN\n#define PAGE_ALIGN(Address) ((PVOID)((ULONG_PTR)(Address) & ~PAGE_MASK))\n#endif\n#ifndef PAGE_OFFSET\n#define PAGE_OFFSET(p) ((PAGE_MASK) & (ULONG_PTR)(p))\n#endif\n\n#ifndef ADDRESS_AND_SIZE_TO_SPAN_PAGES\n#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Address, Size) ((BYTE_OFFSET(Address) + ((SIZE_T)(Size)) + PAGE_MASK) >> PAGE_SHIFT)\n#endif\n#ifndef ROUND_TO_SIZE\n#define ROUND_TO_SIZE(Size, Alignment) ((((ULONG_PTR)(Size))+((Alignment)-1)) & ~(ULONG_PTR)((Alignment)-1))\n#endif\n#ifndef ROUND_TO_PAGES\n#define ROUND_TO_PAGES(Size) (((ULONG_PTR)(Size) + PAGE_MASK) & ~PAGE_MASK)\n#endif\n#ifndef BYTES_TO_PAGES\n#define BYTES_TO_PAGES(Size) (((Size) >> PAGE_SHIFT) + (((Size) & PAGE_MASK) != 0))\n#endif\n\n#endif // _NTDEF_\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/phnt_windows.h",
    "content": "/*\n * Win32 definition support\n *\n * This file is part of System Informer.\n */\n\n#ifndef _PHNT_WINDOWS_H\n#define _PHNT_WINDOWS_H\n\n// This header file provides access to Win32, plus NTSTATUS values and some access mask values.\n\n#ifndef UNICODE\n#define UNICODE\n#endif\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#ifndef __cplusplus\n#ifndef CINTERFACE\n#define CINTERFACE\n#endif\n\n#ifndef COBJMACROS\n#define COBJMACROS\n#endif\n#endif\n\n#ifndef NOMINMAX\n#define NOMINMAX\n#endif\n\n#ifndef INT_ERROR\n#define INT_ERROR (-1)\n#endif\n\n#ifndef ULONG64_MAX\n#define ULONG64_MAX 0xffffffffffffffffui64\n#endif\n\n#ifndef SIZE_T_MAX\n#ifdef _WIN64\n#define SIZE_T_MAX 0xffffffffffffffffui64\n#else\n#define SIZE_T_MAX 0xffffffffUL\n#endif\n#endif\n\n#ifndef MAXLONGLONG\n// The Windows SDK basetsd.h is missing the MAXLONGLONG definition. (dmex)\n#define MAXLONGLONG (0x7fffffffffffffff)\n#endif\n\n#ifndef MINLONGLONG\n// The Windows SDK basetsd.h references non-existent MAXLONGLONG definition\n// and breaks MINLONGLONG or in other cases results in a definition of zero. (dmex)\n#define MINLONGLONG ((LONGLONG)~MAXLONGLONG)\n#endif\n\n#ifndef ENABLE_RTL_NUMBER_OF_V2\n#define ENABLE_RTL_NUMBER_OF_V2\n#endif\n\n#ifndef INITGUID\n#define INITGUID\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifndef WIN32_NO_STATUS\n#define WIN32_NO_STATUS\n#endif\n\n#ifndef COM_NO_WINDOWS_H\n#define COM_NO_WINDOWS_H\n#endif\n\n#ifndef STRICT_TYPED_ITEMIDS\n#define STRICT_TYPED_ITEMIDS\n#endif\n\n#ifndef __cplusplus\n// This is needed to workaround C17 preprocessor errors when using legacy versions of the Windows SDK. (dmex)\n#ifndef MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS\n#define MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS 0\n#endif\n#endif\n\n#ifdef __cplusplus\n#define RTL_ADDRESS_OF(v) (&const_cast<char&>(reinterpret_cast<const volatile char&>(v))) // _ADDRESSOF() macro\n#else\n#define RTL_ADDRESS_OF(v) (&(v))\n#endif\n\n#include <windows.h>\n#include <windowsx.h>\n#undef WIN32_NO_STATUS\n#include <ntstatus.h>\n#include <winioctl.h>\n#include <evntrace.h>\n#include <minidumpapiset.h>\n#include <objbase.h>\n\n#ifdef COM_NO_WINDOWS_H\n#include <ole2.h>\n#endif\n\ntypedef DOUBLE *PDOUBLE;\ntypedef GUID *PGUID;\n\n// Desktop access rights\n#define DESKTOP_ALL_ACCESS \\\n    (DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | \\\n    DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | \\\n    DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS | \\\n    STANDARD_RIGHTS_REQUIRED)\n#define DESKTOP_GENERIC_READ \\\n    (DESKTOP_ENUMERATE | DESKTOP_READOBJECTS | STANDARD_RIGHTS_READ)\n#define DESKTOP_GENERIC_WRITE \\\n    (DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_HOOKCONTROL | \\\n    DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_WRITEOBJECTS | \\\n    STANDARD_RIGHTS_WRITE)\n#define DESKTOP_GENERIC_EXECUTE \\\n    (DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_EXECUTE)\n\n// Window station access rights\n#define WINSTA_GENERIC_READ \\\n    (WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_READATTRIBUTES | \\\n    WINSTA_READSCREEN | STANDARD_RIGHTS_READ)\n#define WINSTA_GENERIC_WRITE \\\n    (WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | \\\n    STANDARD_RIGHTS_WRITE)\n#define WINSTA_GENERIC_EXECUTE \\\n    (WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | STANDARD_RIGHTS_EXECUTE)\n\n// WMI access rights\n#define WMIGUID_GENERIC_READ \\\n    (WMIGUID_QUERY | WMIGUID_NOTIFICATION | WMIGUID_READ_DESCRIPTION | \\\n    STANDARD_RIGHTS_READ)\n#define WMIGUID_GENERIC_WRITE \\\n    (WMIGUID_SET | TRACELOG_CREATE_REALTIME | TRACELOG_CREATE_ONDISK | \\\n    STANDARD_RIGHTS_WRITE)\n#define WMIGUID_GENERIC_EXECUTE \\\n    (WMIGUID_EXECUTE | TRACELOG_GUID_ENABLE | TRACELOG_LOG_EVENT | \\\n    TRACELOG_ACCESS_REALTIME | TRACELOG_REGISTER_GUIDS | \\\n    STANDARD_RIGHTS_EXECUTE)\n\n// Note: Some parts of the Windows Runtime, COM or third party hooks are returning\n// S_FALSE and null pointers on errors when S_FALSE is a success code. (dmex)\n#define HR_SUCCESS(hr) (((HRESULT)(hr)) == S_OK)\n#define HR_FAILED(hr) (((HRESULT)(hr)) != S_OK)\n\n// Note: The CONTAINING_RECORD macro doesn't support UBSan and generates false positives,\n// we redefine the macro with FIELD_OFFSET as a workaround until the WinSDK is fixed (dmex)\n#undef CONTAINING_RECORD\n#define CONTAINING_RECORD(address, type, field) \\\n    ((type *)((ULONG_PTR)(address) - UFIELD_OFFSET(type, field)))\n\n#ifndef __PCGUID_DEFINED__\n#define __PCGUID_DEFINED__\ntypedef const GUID* PCGUID;\n#endif\n\n#ifndef GUID_NULL\nDEFINE_GUID(GUID_NULL, 0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n#endif\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/smbios.h",
    "content": "/*\n * Definitions that describe SMBIOS - https://www.dmtf.org/standards/smbios\n *\n * This file is part of System Informer.\n */\n\n#ifndef _SMBIOS_H\n#define _SMBIOS_H\n\ntypedef struct RAW_SMBIOS_DATA\n{\n    UCHAR Used20CallingMethod;\n    UCHAR SMBIOSMajorVersion;\n    UCHAR SMBIOSMinorVersion;\n    UCHAR DmiRevision;\n    ULONG Length;\n    UCHAR SMBIOSTableData[ANYSIZE_ARRAY];\n} RAW_SMBIOS_DATA, *PRAW_SMBIOS_DATA;\n\n#include <pshpack1.h>\n\n#define SMBIOS_INVALID_HANDLE  ((USHORT)0x0FFFF)\n#define SMBIOS_INVALID_STRING  ((UCHAR)0)\n#define SMBIOS_STRING_TABLE(x) (PVOID)((ULONG_PTR)x + x->Length)\n\n#define SMBIOS_PROBE_STATUS_OTHER                     ((UCHAR)1)\n#define SMBIOS_PROBE_STATUS_UNKNOWN                   ((UCHAR)2)\n#define SMBIOS_PROBE_STATUS_OK                        ((UCHAR)3)\n#define SMBIOS_PROBE_STATUS_NON_CRITICAL              ((UCHAR)4)\n#define SMBIOS_PROBE_STATUS_CRITICAL                  ((UCHAR)5)\n#define SMBIOS_PROBE_STATUS_NON_RECOVERABLE           ((UCHAR)6)\n\n#define SMBIOS_MEMORY_ERROR_TYPE_OTHER                ((UCHAR)1)\n#define SMBIOS_MEMORY_ERROR_TYPE_UNKNOWN              ((UCHAR)2)\n#define SMBIOS_MEMORY_ERROR_TYPE_OK                   ((UCHAR)3)\n#define SMBIOS_MEMORY_ERROR_TYPE_BAD_READ             ((UCHAR)4)\n#define SMBIOS_MEMORY_ERROR_TYPE_PARITY               ((UCHAR)5)\n#define SMBIOS_MEMORY_ERROR_TYPE_SINGLE_BIT           ((UCHAR)6)\n#define SMBIOS_MEMORY_ERROR_TYPE_DOUBLE_BIT           ((UCHAR)7)\n#define SMBIOS_MEMORY_ERROR_TYPE_MULTI_BIT            ((UCHAR)8)\n#define SMBIOS_MEMORY_ERROR_TYPE_NIBBLE               ((UCHAR)9)\n#define SMBIOS_MEMORY_ERROR_TYPE_CHECKSUM             ((UCHAR)10)\n#define SMBIOS_MEMORY_ERROR_TYPE_CRC                  ((UCHAR)11)\n#define SMBIOS_MEMORY_ERROR_TYPE_CORRECTED_SINGLE_BIT ((UCHAR)12)\n#define SMBIOS_MEMORY_ERROR_TYPE_CORRECTED            ((UCHAR)13)\n#define SMBIOS_MEMORY_ERROR_TYPE_UNCORRECTABLE        ((UCHAR)14)\n\n#define SMBIOS_MEMORY_ERROR_GRANULARITY_OTHER         ((UCHAR)1)\n#define SMBIOS_MEMORY_ERROR_GRANULARITY_UNKNOWN       ((UCHAR)2)\n#define SMBIOS_MEMORY_ERROR_GRANULARITY_DEVICE        ((UCHAR)3)\n#define SMBIOS_MEMORY_ERROR_GRANULARITY_PARTITION     ((UCHAR)4)\n\n#define SMBIOS_MEMORY_ERROR_OPERATION_OTHER           ((UCHAR)1)\n#define SMBIOS_MEMORY_ERROR_OPERATION_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_MEMORY_ERROR_OPERATION_READ            ((UCHAR)3)\n#define SMBIOS_MEMORY_ERROR_OPERATION_WRITE           ((UCHAR)4)\n#define SMBIOS_MEMORY_ERROR_OPERATION_PARTIAL_WRITE   ((UCHAR)5)\n\ntypedef struct _SMBIOS_ENTRY_POINT_2_1\n{\n    UCHAR Signature[4];             // _SM_ (ASCII)\n    UCHAR Checksum;\n    UCHAR Length;\n    UCHAR MajorVersion;\n    UCHAR MinorVersion;\n    USHORT MaximumStructureSize;\n    UCHAR EntryPointRevision;\n    UCHAR Reserved[5];\n    UCHAR Signature2[5];           // _DMI_ (ASCII)\n    UCHAR IntermediateChecksum;\n    USHORT StructureTableLength;\n    ULONG StructureTableAddress;\n    USHORT NumberStructures;\n    UCHAR Revision;\n} SMBIOS_ENTRY_POINT_2_1, *PSMBIOS_ENTRY_POINT_2_1;\n\nC_ASSERT(sizeof(SMBIOS_ENTRY_POINT_2_1) == 0X1F);\n\ntypedef struct _SMBIOS_ENTRY_POINT_3_0\n{\n    UCHAR Signature[5];             // _SM3_ (ASCII)\n    UCHAR Checksum;\n    UCHAR Length;\n    UCHAR MajorVersion;\n    UCHAR MinorVersion;\n    UCHAR DocumentRevision;\n    UCHAR EntryPointRevision;\n    UCHAR Reserved;\n    ULONG MaximumStructureSize;\n    ULONGLONG StructureTableAddress;\n} SMBIOS_ENTRY_POINT_3_0, *PSMBIOS_ENTRY_POINT_3_0;\n\nC_ASSERT(sizeof(SMBIOS_ENTRY_POINT_3_0) == 0x18);\n\ntypedef struct _SMBIOS_HEADER\n{\n    UCHAR Type;\n    UCHAR Length;\n    USHORT Handle;\n} SMBIOS_HEADER, *PSMBIOS_HEADER;\n\nC_ASSERT(sizeof(SMBIOS_HEADER) == 4);\n\ntypedef struct _SMBIOS_GENERIC\n{\n    UCHAR Type;\n    UCHAR Length;\n    USHORT Handle;\n    UCHAR Data[ANYSIZE_ARRAY];\n} SMBIOS_GENERIC, *PSMBIOS_GENERIC;\n\n//\n// Platform Firmware Information (Type 0)\n//\n\n#define SMBIOS_FIRMWARE_INFORMATION_TYPE ((UCHAR)0)\n\ntypedef struct _SMBIOS_FIRMWARE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR Vendor;                  // string\n    UCHAR Version;                 // string\n    USHORT StartingAddressSegment;\n    UCHAR ReleaseDate;             // string\n    UCHAR RomSize;\n    ULONGLONG Characteristics;     // SMBIOS_FIRMWARE_FLAG_*\n    // 2.4+\n    USHORT Characteristics2;       // SMBIOS_FIRMWARE_FLAG_2_*\n    UCHAR MajorRelease;\n    UCHAR MinorRelease;\n    UCHAR ControllerMajorRelease;\n    UCHAR ControllerMinorRelease;\n    // 3.1+\n    union\n    {\n        struct\n        {\n            USHORT Unit : 2;       // SMBIOS_FIRMWARE_ROM_UNIT_*\n            USHORT Size : 14;\n        };\n\n        USHORT Value;\n    } RomSize2;\n} SMBIOS_FIRMWARE_INFORMATION, *PSMBIOS_FIRMWARE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_FIRMWARE_INFORMATION) == 0x1A);\n\n#define SMBIOS_FIRMWARE_FLAG_RESERVED_0                   0x0000000000000001UL\n#define SMBIOS_FIRMWARE_FLAG_RESERVED_1                   0x0000000000000002UL\n#define SMBIOS_FIRMWARE_FLAG_UNKNOWN                      0x0000000000000004UL\n#define SMBIOS_FIRMWARE_FLAG_NOT_SUPPORTED                0x0000000000000008UL\n#define SMBIOS_FIRMWARE_FLAG_ISA_SUPPORTED                0x0000000000000010UL\n#define SMBIOS_FIRMWARE_FLAG_MCA_SUPPORTED                0x0000000000000020UL\n#define SMBIOS_FIRMWARE_FLAG_EISA_SUPPORTED               0x0000000000000040UL\n#define SMBIOS_FIRMWARE_FLAG_PCI_SUPPORTED                0x0000000000000080UL\n#define SMBIOS_FIRMWARE_FLAG_PCMCIA_SUPPORTED             0x0000000000000100UL\n#define SMBIOS_FIRMWARE_FLAG_PNP_SUPPORTED                0x0000000000000200UL\n#define SMBIOS_FIRMWARE_FLAG_APM_SUPPORTED                0x0000000000000400UL\n#define SMBIOS_FIRMWARE_FLAG_UPGRADE_SUPPORTED            0x0000000000000800UL\n#define SMBIOS_FIRMWARE_FLAG_SHADOWING_SUPPORTED          0x0000000000001000UL\n#define SMBIOS_FIRMWARE_FLAG_VL_VESA_SUPPORTED            0x0000000000002000UL\n#define SMBIOS_FIRMWARE_FLAG_ESCD_SUPPORTED               0x0000000000004000UL\n#define SMBIOS_FIRMWARE_FLAG_BOOT_FROM_CD_SUPPORTED       0x0000000000008000UL\n#define SMBIOS_FIRMWARE_FLAG_SELECTABLE_BOOT_SUPPORTED    0x0000000000010000UL\n#define SMBIOS_FIRMWARE_FLAG_ROM_SOCKETED                 0x0000000000020000UL\n#define SMBIOS_FIRMWARE_FLAG_PCMCIA_BOOT_SUPPORTED        0x0000000000040000UL\n#define SMBIOS_FIRMWARE_FLAG_EDD_SUPPORTED                0x0000000000080000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_NEC_9800_SUPPORTED    0x0000000000100000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_TOSHIBA_SUPPORTED     0x0000000000200000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_5_25_360KB_SUPPORTED  0x0000000000400000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_5_25_1_2_MB_SUPPORTED 0x0000000000800000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_3_5_720KB_SUPPORTED   0x0000000001000000UL\n#define SMBIOS_FIRMWARE_FLAG_FLOPPY_3_5_2_88MB_SUPPORTED  0x0000000002000000UL\n#define SMBIOS_FIRMWARE_FLAG_PRINT_SCREEN_SUPPORTED       0x0000000004000000UL\n#define SMBIOS_FIRMWARE_FLAG_8042_KEYBOARD_SUPPORTED      0x0000000008000000UL\n#define SMBIOS_FIRMWARE_FLAG_SERIAL_SUPPORTED             0x0000000010000000UL\n#define SMBIOS_FIRMWARE_FLAG_PRINTER_SUPPORTED            0x0000000020000000UL\n#define SMBIOS_FIRMWARE_FLAG_CGA_VIDEO_SUPPORTED          0x0000000040000000UL\n#define SMBIOS_FIRMWARE_FLAG_NEC_PC_98                    0x0000000080000000UL\n#define SMBIOS_FIRMWARE_FLAG_PLATFORM_RESERVED            0x0000FFFF00000000UL\n#define SMBIOS_FIRMWARE_FLAG_SYSTEM_RESERVED              0xFFFF000000000000UL\n\n#define SMBIOS_FIRMWARE_FLAG_2_ACPI_SUPPORTED                 ((USHORT)0x0001)\n#define SMBIOS_FIRMWARE_FLAG_2_USB_LEGACY_SUPPORTED           ((USHORT)0x0002)\n#define SMBIOS_FIRMWARE_FLAG_2_AGP_SUPPORTED                  ((USHORT)0x0004)\n#define SMBIOS_FIRMWARE_FLAG_2_I20_BOOT_SUPPORTED             ((USHORT)0x0008)\n#define SMBIOS_FIRMWARE_FLAG_2_LS_120_BOOT_SUPPORTED          ((USHORT)0x0010)\n#define SMBIOS_FIRMWARE_FLAG_2_ZIP_BOOT_SUPPORTED             ((USHORT)0x0020)\n#define SMBIOS_FIRMWARE_FLAG_2_1394_BOOT_SUPPORTED            ((USHORT)0x0040)\n#define SMBIOS_FIRMWARE_FLAG_2_SMART_BATTERY_SUPPORTED        ((USHORT)0x0080)\n#define SMBIOS_FIRMWARE_FLAG_2_BIOS_BOOT_SUPPORTED            ((USHORT)0x0100)\n#define SMBIOS_FIRMWARE_FLAG_2_FN_KEY_NET_BOOT_SUPPORTED      ((USHORT)0x0200)\n#define SMBIOS_FIRMWARE_FLAG_2_CONTENT_DISTRIBUTION_SUPPORTED ((USHORT)0x0400)\n#define SMBIOS_FIRMWARE_FLAG_2_UEFI_SUPPORTED                 ((USHORT)0x0800)\n#define SMBIOS_FIRMWARE_FLAG_2_MANUFACTURING_MODE_ENABLED     ((USHORT)0x1000)\n#define SMBIOS_FIRMWARE_FLAG_2_RESERVED                       ((USHORT)0xE000)\n\n#define SMBIOS_FIRMWARE_ROM_UNIT_MB         0\n#define SMBIOS_FIRMWARE_ROM_UNIT_GB         1\n#define SMBIOS_FIRMWARE_ROM_UNIT_RESERVED_1 2\n#define SMBIOS_FIRMWARE_ROM_UNIT_RESERVED_2 3\n\n//\n// System Information (Type 1)\n//\n\n#define SMBIOS_SYSTEM_INFORMATION_TYPE ((UCHAR)1)\n\ntypedef struct _SMBIOS_SYSTEM_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR Manufacturer; // string\n    UCHAR ProductName;  // string\n    UCHAR Version;      // string\n    UCHAR SerialNumber; // string\n    // 2.1+\n    GUID UniqueID;\n    UCHAR WakeUpType;   // SMBIOS_SYSTEM_WAKE_UP_TYPE\n    // 2.4+\n    UCHAR SKUNumber;    // string\n    UCHAR Family;       // string\n} SMBIOS_SYSTEM_INFORMATION, *PSMBIOS_SYSTEM_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_INFORMATION) == 0x1B);\n\n#define SMBIOS_SYSTEM_WAKE_UP_TYPE_RESERVED     ((UCHAR)0)\n#define SMBIOS_SYSTEM_WAKE_UP_TYPE_OTHER        ((UCHAR)1)\n#define SMBIOS_SYSTEM_WAKE_UP_UNKNOWN           ((UCHAR)2)\n#define SMBIOS_SYSTEM_WAKE_UP_APM_TIMER         ((UCHAR)3)\n#define SMBIOS_SYSTEM_WAKE_UP_MODEM_RING        ((UCHAR)4)\n#define SMBIOS_SYSTEM_WAKE_UP_LAN_REMOTE        ((UCHAR)5)\n#define SMBIOS_SYSTEM_WAKE_UP_POWER_SWITCH      ((UCHAR)6)\n#define SMBIOS_SYSTEM_WAKE_UP_PCI_PME           ((UCHAR)7)\n#define SMBIOS_SYSTEM_WAKE_UP_AC_POWER_RESTORED ((UCHAR)8)\n\n//\n// Baseboard (or Module) Information (Type 2)\n//\n\n#define SMBIOS_BASEBOARD_INFORMATION_TYPE ((UCHAR)2)\n\ntypedef struct _SMBIOS_BASEBOARD_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR Manufacturer;            // string\n    UCHAR Product;                 // string\n    UCHAR Version;                 // string\n    UCHAR SerialNumber;            // string\n    UCHAR AssetTag;                // string\n    UCHAR Features;                // SMBIOS_BASEBOARD_FEATURE_*\n    UCHAR Location;                // string\n    USHORT ChassisHandle;\n    UCHAR BoardType;               // SMBIOS_BASEBOARD_TYPE_*\n    UCHAR NumberOfHandles;\n    USHORT Handles[ANYSIZE_ARRAY]; // Contained object handles (processors, ports, memory, etc.)\n} SMBIOS_BASEBOARD_INFORMATION, *PSMBIOS_BASEBOARD_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_BASEBOARD_INFORMATION) == 0x11);\n\n#define SMBIOS_BASEBOARD_FEATURE_HOSTING_BOARD           ((UCHAR)0x01)\n#define SMBIOS_BASEBOARD_FEATURE_REQUIRES_DAUGHTER_BOARD ((UCHAR)0x02)\n#define SMBIOS_BASEBOARD_FEATURE_REMOVABLE_BOARD         ((UCHAR)0x04)\n#define SMBIOS_BASEBOARD_FEATURE_REPLACEABLE_BOARD       ((UCHAR)0x08)\n#define SMBIOS_BASEBOARD_FEATURE_HOT_SWAP_BOARD          ((UCHAR)0x10)\n#define SMBIOS_BASEBOARD_FEATURE_RESERVED                ((UCHAR)0xE0)\n\n#define SMBIOS_BASEBOARD_TYPE_UNKNOWN                    ((UCHAR)1)\n#define SMBIOS_BASEBOARD_TYPE_OTHER                      ((UCHAR)2)\n#define SMBIOS_BASEBOARD_TYPE_SERVER_BLADE               ((UCHAR)3)\n#define SMBIOS_BASEBOARD_TYPE_CONNECTIVITY_SWITCH        ((UCHAR)4)\n#define SMBIOS_BASEBOARD_TYPE_SYSTEM_MANAGEMENT_MODULE   ((UCHAR)5)\n#define SMBIOS_BASEBOARD_TYPE_PROCESSOR_MODULE           ((UCHAR)6)\n#define SMBIOS_BASEBOARD_TYPE_IO_MODULE                  ((UCHAR)7)\n#define SMBIOS_BASEBOARD_TYPE_MEMORY_MODULE              ((UCHAR)8)\n#define SMBIOS_BASEBOARD_TYPE_DAUGHTER_BOARD             ((UCHAR)9)\n#define SMBIOS_BASEBOARD_TYPE_MOTHERBOARD                ((UCHAR)10)\n#define SMBIOS_BASEBOARD_TYPE_PROCESSOR_MEMORY_MODULE    ((UCHAR)11)\n#define SMBIOS_BASEBOARD_TYPE_PROCESSOR_IO_MODULE        ((UCHAR)12)\n#define SMBIOS_BASEBOARD_TYPE_INTERCONNECT               ((UCHAR)13)\n\n//\n// System Enclosure or Chassis (Type 3)\n//\n\n#define SMBIOS_CHASSIS_INFORMATION_TYPE ((UCHAR)3)\n\ntypedef struct _SMBIOS_CHASSIS_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR Manufacturer;       // string\n    union\n    {\n        struct\n        {\n            UCHAR Type : 7;   // SMBIOS_CHASSIS_TYPE_*\n            UCHAR Locked : 1;\n        };\n\n        UCHAR Value;\n    } Chassis;\n\n    UCHAR Version;            // string\n    UCHAR SerialNumber;       // string\n    UCHAR AssetTag;           // string\n    // 2.1+\n    UCHAR BootUpState;        // SMBIOS_CHASSIS_STATE_*\n    UCHAR PowerSupplyState;   // SMBIOS_CHASSIS_STATE_*\n    UCHAR ThermalState;       // SMBIOS_CHASSIS_STATE_*\n    UCHAR SecurityState;      // SMBIOS_CHASSIS_SECURITY_STATE_*\n    // 2.3+\n    ULONG OEMDefined;\n    UCHAR Height;\n    UCHAR NumberOfPowerCords;\n    UCHAR ElementCount;\n    UCHAR ElementLength;\n    UCHAR Elements[ANYSIZE_ARRAY]; // ElementCount * ElementLength, SMBIOS_CHASSIS_CONTAINED_ELEMENT\n    // 2.7+\n    // SMBIOS_CHASSIS_INFORMATION_EX\n} SMBIOS_CHASSIS_INFORMATION, *PSMBIOS_CHASSIS_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_CHASSIS_INFORMATION) == 0x16);\n\ntypedef struct _SMBIOS_CHASSIS_INFORMATION_EX\n{\n    // 2.7+\n    UCHAR SKUNumber; // string\n} SMBIOS_CHASSIS_INFORMATION_EX, *PSMBIOS_CHASSIS_INFORMATION_EX;\n\ntypedef struct _SMBIOS_CHASSIS_CONTAINED_ELEMENT\n{\n    // 2.3+\n    union\n    {\n        struct\n        {\n            UCHAR Type : 7;   // SMBIOS_*_INFORMATION_TYPE or SM_BIOS_BASEBOARD_TYPE_*\n            UCHAR Select : 1; // 1 = SMBIOS_*_INFORMATION_TYPE, 0 = SM_BIOS_BASEBOARD_TYPE_*\n        };\n\n        UCHAR Value;\n    } Type;\n\n    UCHAR ElementMinimum;\n    UCHAR ElementMaximum;\n} SMBIOS_CHASSIS_CONTAINED_ELEMENT, *PSMBIOS_CHASSIS_CONTAINED_ELEMENT;\n\nC_ASSERT(sizeof(SMBIOS_CHASSIS_CONTAINED_ELEMENT) == 0x3);\n\n#define SMBIOS_CHASSIS_TYPE_OTHER               1\n#define SMBIOS_CHASSIS_TYPE_UNKNOWN             2\n#define SMBIOS_CHASSIS_TYPE_DESKTOP             3\n#define SMBIOS_CHASSIS_TYPE_LOW_PROFILE_DESKTOP 4\n#define SMBIOS_CHASSIS_TYPE_PIZZA_BOX           5\n#define SMBIOS_CHASSIS_TYPE_MINI_TOWER          6\n#define SMBIOS_CHASSIS_TYPE_TOWER               7\n#define SMBIOS_CHASSIS_TYPE_PORTABLE            8\n#define SMBIOS_CHASSIS_TYPE_LAPTOP              9\n#define SMBIOS_CHASSIS_TYPE_NOTEBOOK            10\n#define SMBIOS_CHASSIS_TYPE_HAND_HELD           11\n#define SMBIOS_CHASSIS_TYPE_DOCKING_STATION     12\n#define SMBIOS_CHASSIS_TYPE_ALL_IN_ONE          13\n#define SMBIOS_CHASSIS_TYPE_SUB_NOTEBOOK        14\n#define SMBIOS_CHASSIS_TYPE_SPACE_SAVING        15\n#define SMBIOS_CHASSIS_TYPE_LUNCH_BOX           16\n#define SMBIOS_CHASSIS_TYPE_MAIN_SERVER         17\n#define SMBIOS_CHASSIS_TYPE_EXPANSION           18\n#define SMBIOS_CHASSIS_TYPE_SUB                 19\n#define SMBIOS_CHASSIS_TYPE_BUS_EXPANSION       20\n#define SMBIOS_CHASSIS_TYPE_PERIPHERAL          21\n#define SMBIOS_CHASSIS_TYPE_RAID                22\n#define SMBIOS_CHASSIS_TYPE_RACK_MOUNT          23\n#define SMBIOS_CHASSIS_TYPE_SEALED_CASE_PC      24\n#define SMBIOS_CHASSIS_TYPE_MULTI_SYSTEM        25\n#define SMBIOS_CHASSIS_TYPE_COMPACT_PCI         26\n#define SMBIOS_CHASSIS_TYPE_ADVANCED_TCA        27\n#define SMBIOS_CHASSIS_TYPE_BLADE               28\n#define SMBIOS_CHASSIS_TYPE_BLADE_ENCLOSURE     29\n#define SMBIOS_CHASSIS_TYPE_TABLET              30\n#define SMBIOS_CHASSIS_TYPE_CONVERTIBLE         31\n#define SMBIOS_CHASSIS_TYPE_DETACHABLE          32\n#define SMBIOS_CHASSIS_TYPE_IOT_GATEWAY         33\n#define SMBIOS_CHASSIS_TYPE_EMBEDDED_PC         34\n#define SMBIOS_CHASSIS_TYPE_MINI_PC             35\n#define SMBIOS_CHASSIS_TYPE_STICK_PC            36\n\n#define SMBIOS_CHASSIS_STATE_OTHER           ((UCHAR)1)\n#define SMBIOS_CHASSIS_STATE_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_CHASSIS_STATE_SAFE            ((UCHAR)3)\n#define SMBIOS_CHASSIS_STATE_WARNING         ((UCHAR)4)\n#define SMBIOS_CHASSIS_STATE_CRITICAL        ((UCHAR)5)\n#define SMBIOS_CHASSIS_STATE_NON_RECOVERABLE ((UCHAR)6)\n\n#define SMBIOS_CHASSIS_SECURITY_STATE_OTHER      ((UCHAR)1)\n#define SMBIOS_CHASSIS_SECURITY_STATE_UNKNOWN    ((UCHAR)2)\n#define SMBIOS_CHASSIS_SECURITY_STATE_NONE       ((UCHAR)3)\n#define SMBIOS_CHASSIS_SECURITY_STATE_LOCKED_OUT ((UCHAR)4)\n#define SMBIOS_CHASSIS_SECURITY_STATE_ENABLED    ((UCHAR)5)\n\n//\n// Processor Information (Type 4)\n//\n\n#define SMBIOS_PROCESSOR_INFORMATION_TYPE ((UCHAR)4)\n\ntypedef struct _SMBIOS_PROCESSOR_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR SocketDesignation; // string\n    UCHAR Type;              // SMBIOS_PROCESSOR_TYPE_*\n    UCHAR Family;            // SMBIOS_PROCESSOR_FAMILY_*\n    UCHAR Manufacturer;      // string\n    ULONGLONG Identifier;\n    UCHAR Version;           // string\n\n    union\n    {\n        struct\n        {\n            UCHAR Capable5000mV : 1; // 5V\n            UCHAR Capable3500mV : 1; // 3.3V\n            UCHAR Capable2900mV : 1; // 2.9V\n            UCHAR Reserved : 4;\n            UCHAR Mode : 1;          // 0 = Legacy Mode\n        };\n\n        UCHAR Value;\n    } Voltage;\n\n    USHORT ExternalClock;\n    USHORT MaxSpeed;\n    USHORT CurrentSpeed;\n\n    union\n    {\n        struct\n        {\n            UCHAR Status : 3;    // SMBIOS_PROCESSOR_STATUS_*\n            UCHAR Reserved : 3;\n            UCHAR Populated : 1;\n            UCHAR Reserved2 : 1;\n        };\n\n        UCHAR Value;\n    } Status;\n\n    UCHAR Upgrade;          // SMBIOS_PROCESSOR_UPGRADE_*\n    // 2.1+\n    USHORT L1CacheHandle;\n    USHORT L2CacheHandle;\n    USHORT L3CacheHandle;\n    // 2.3+\n    UCHAR SerialNumber;     // string\n    UCHAR AssetTag;         // string\n    UCHAR PartNumber;       // string\n    // 2.5+\n    UCHAR CoreCount;\n    UCHAR CoresEnabled;\n    UCHAR ThreadCount;\n    USHORT Characteristics; // SMBIOS_PROCESSOR_FLAG_*\n    // 2.6+\n    USHORT Family2;         // SMBIOS_PROCESSOR_FAMILY_*\n    // 3.0+\n    USHORT CoreCount2;\n    USHORT CoresEnabled2;\n    USHORT ThreadCount2;\n    // 3.6+\n    USHORT ThreadsEnabled;\n    // 3.8+\n    UCHAR SocketType;       // string\n} SMBIOS_PROCESSOR_INFORMATION, *PSMBIOS_PROCESSOR_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_PROCESSOR_INFORMATION) == 0x33);\n\n#define SMBIOS_PROCESSOR_TYPE_OTHER   ((UCHAR)1)\n#define SMBIOS_PROCESSOR_TYPE_UNKNOWN ((UCHAR)2)\n#define SMBIOS_PROCESSOR_TYPE_CENTRAL ((UCHAR)3)\n#define SMBIOS_PROCESSOR_TYPE_MATH    ((UCHAR)4)\n#define SMBIOS_PROCESSOR_TYPE_DSP     ((UCHAR)5)\n#define SMBIOS_PROCESSOR_TYPE_VIDEO   ((UCHAR)6)\n\n#define SMBIOS_PROCESSOR_FAMILY_OTHER 1\n#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2\n#define SMBIOS_PROCESSOR_FAMILY_8086 3\n#define SMBIOS_PROCESSOR_FAMILY_80286 4\n#define SMBIOS_PROCESSOR_FAMILY_INTEL386_PROCESSOR 5\n#define SMBIOS_PROCESSOR_FAMILY_INTEL486_PROCESSOR 6\n#define SMBIOS_PROCESSOR_FAMILY_8087 7\n#define SMBIOS_PROCESSOR_FAMILY_80287 8\n#define SMBIOS_PROCESSOR_FAMILY_80387 9\n#define SMBIOS_PROCESSOR_FAMILY_80487 10\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PENTIUM_PROCESSOR 11\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_PRO_PROCESSOR 12\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_II_PROCESSOR 13\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_PROCESSOR_WITH_MMX_TECHNOLOGY 14\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CELERON_PROCESSOR 15\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_II_XEON_PROCESSOR 16\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_III_PROCESSOR 17\n#define SMBIOS_PROCESSOR_FAMILY_M1_FAMILY 18\n#define SMBIOS_PROCESSOR_FAMILY_M2_FAMILY 19\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CELERON_M_PROCESSOR 20\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PENTIUM_4_HT_PROCESSOR 21\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PROCESSOR 22\n// 23 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_AMD_DURON_PROCESSOR_FAMILY 24\n#define SMBIOS_PROCESSOR_FAMILY_K5_FAMILY 25\n#define SMBIOS_PROCESSOR_FAMILY_K6_FAMILY 26\n#define SMBIOS_PROCESSOR_FAMILY_K6_2 27\n#define SMBIOS_PROCESSOR_FAMILY_K6_3 28\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_PROCESSOR_FAMILY 29\n#define SMBIOS_PROCESSOR_FAMILY_AMD29000_FAMILY 30\n#define SMBIOS_PROCESSOR_FAMILY_K6_2_PLUS 31\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_FAMILY 32\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_601 33\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_603 34\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_603_PLUS 35\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_604 36\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_620 37\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_X704 38\n#define SMBIOS_PROCESSOR_FAMILY_POWER_PC_750 39\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_DUO_PROCESSOR 40\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_DUO_MOBILE_PROCESSOR 41\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_SOLO_MOBILE_PROCESSOR 42\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_ATOM_PROCESSOR 43\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_M_PROCESSOR 44\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_M3_PROCESSOR 45\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_M5_PROCESSOR 46\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_M7_PROCESSOR 47\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_FAMILY 48\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21064 49\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21066 50\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21164 51\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21164PC 52\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21164A 53\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21264 54\n#define SMBIOS_PROCESSOR_FAMILY_ALPHA_21364 55\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_II_ULTRA_DUAL_CORE_MOBILE_M_PROCESSOR_FAMILY 56\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_II_DUAL_CORE_MOBILE_M_PROCESSOR_FAMILY 57\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_II_DUAL_CORE_M_PROCESSOR_FAMILY 58\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_6100_SERIES_PROCESSOR 59\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_4100_SERIES_PROCESSOR 60\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_6200_SERIES_PROCESSOR 61\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_4200_SERIES_PROCESSOR 62\n#define SMBIOS_PROCESSOR_FAMILY_AMD_FX_SERIES_PROCESSOR 63\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_FAMILY 64\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_R4000 65\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_R4200 66\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_R4400 67\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_R4600 68\n#define SMBIOS_PROCESSOR_FAMILY_MIPS_R10000 69\n#define SMBIOS_PROCESSOR_FAMILY_AMD_C_SERIES_PROCESSOR 70\n#define SMBIOS_PROCESSOR_FAMILY_AMD_E_SERIES_PROCESSOR 71\n#define SMBIOS_PROCESSOR_FAMILY_AMD_A_SERIES_PROCESSOR 72\n#define SMBIOS_PROCESSOR_FAMILY_AMD_G_SERIES_PROCESSOR 73\n#define SMBIOS_PROCESSOR_FAMILY_AMD_Z_SERIES_PROCESSOR 74\n#define SMBIOS_PROCESSOR_FAMILY_AMD_R_SERIES_PROCESSOR 75\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_4300_SERIES_PROCESSOR 76\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_6300_SERIES_PROCESSOR 77\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_3300_SERIES_PROCESSOR 78\n#define SMBIOS_PROCESSOR_FAMILY_AMD_FIREPRO_SERIES_PROCESSOR 79\n#define SMBIOS_PROCESSOR_FAMILY_SPARC_FAMILY 80\n#define SMBIOS_PROCESSOR_FAMILY_SUPERSPARC 81\n#define SMBIOS_PROCESSOR_FAMILY_MICROSPARC_II 82\n#define SMBIOS_PROCESSOR_FAMILY_MICROSPARC_IIep 83\n#define SMBIOS_PROCESSOR_FAMILY_ULTRASPARC 84\n#define SMBIOS_PROCESSOR_FAMILY_ULTRASPARC_II 85\n#define SMBIOS_PROCESSOR_FAMILY_ULTRASPARC_Iii 86\n#define SMBIOS_PROCESSOR_FAMILY_ULTRASPARC_III 87\n#define SMBIOS_PROCESSOR_FAMILY_ULTRASPARC_IIIi 88\n// 89-95 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_68040_FAMILY 96\n#define SMBIOS_PROCESSOR_FAMILY_68XXX 97\n#define SMBIOS_PROCESSOR_FAMILY_68000 98\n#define SMBIOS_PROCESSOR_FAMILY_68010 99\n#define SMBIOS_PROCESSOR_FAMILY_68020 100\n#define SMBIOS_PROCESSOR_FAMILY_68030 101\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_X4_QUAD_CORE_PROCESSOR_FAMILY 102\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_X1000_SERIES_PROCESSOR 103\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_X2000_SERIES_APU 104\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_A_SERIES_PROCESSOR 105\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_X3000_SERIES_APU 106\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ZEN_PROCESSOR_FAMILY 107\n// 108-111 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_HOBBIT_FAMILY 112\n// 113-119 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_CRUSOE_TM5000_FAMILY 120\n#define SMBIOS_PROCESSOR_FAMILY_CRUSOE_TM3000_FAMILY 121\n#define SMBIOS_PROCESSOR_FAMILY_EFFICEON_TM8000_FAMILY 122\n// 123-127 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_WEITEK 128\n// 129 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_ITANIUM_PROCESSOR 130\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_64_PROCESSOR_FAMILY 131\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_PROCESSOR_FAMILY 132\n#define SMBIOS_PROCESSOR_FAMILY_AMD_SEMPRON_PROCESSOR_FAMILY 133\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_64_MOBILE_TECHNOLOGY 134\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_AMD_OPTERON_PROCESSOR_FAMILY 135\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_64_X2_DUAL_CORE_PROCESSOR_FAMILY 136\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_64_X2_MOBILE_TECHNOLOGY 137\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_AMD_OPTERON_PROCESSOR_FAMILY 138\n#define SMBIOS_PROCESSOR_FAMILY_THIRD_GENERATION_AMD_OPTERON_PROCESSOR_FAMILY 139\n#define SMBIOS_PROCESSOR_FAMILY_AMD_PHENOM_FX_QUAD_CORE_PROCESSOR_FAMILY 140\n#define SMBIOS_PROCESSOR_FAMILY_AMD_PHENOM_X4_QUAD_CORE_PROCESSOR_FAMILY 141\n#define SMBIOS_PROCESSOR_FAMILY_AMD_PHENOM_X2_DUAL_CORE_PROCESSOR_FAMILY 142\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_X2_DUAL_CORE_PROCESSOR_FAMILY 143\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_FAMILY 144\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_8500 145\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_8000 146\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_7300LC 147\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_7200 148\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_7100LC 149\n#define SMBIOS_PROCESSOR_FAMILY_PA_RISC_7100 150\n// 151-159 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_V30_FAMILY 160\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_3200_SERIES 161\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_3000_SERIES 162\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_5300_SERIES 163\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_5100_SERIES 164\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_5000_SERIES 165\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_LV 166\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_ULV 167\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_7100_SERIES 168\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_5400_SERIES 169\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR 170\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_5200_SERIES 171\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_7200_SERIES 172\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_7300_SERIES 173\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_7400_SERIES 174\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_INTEL_XEON_PROCESSOR_7400_SERIES 175\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_III_XEON_PROCESSOR 176\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_III_PROCESSOR_WITH_INTEL_SPEEDSTEP_TECHNOLOGY 177\n#define SMBIOS_PROCESSOR_FAMILY_PENTIUM_4_PROCESSOR 178\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_XEON_PROCESSOR 179\n#define SMBIOS_PROCESSOR_FAMILY_AS400_FAMILY 180\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_XEON_PROCESSOR_MP 181\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_XP_PROCESSOR_FAMILY 182\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_MP_PROCESSOR_FAMILY 183\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_ITANIUM_2_PROCESSOR 184\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PENTIUM_M_PROCESSOR 185\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CELERON_D_PROCESSOR 186\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PENTIUM_D_PROCESSOR 187\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_PENTIUM_PROCESSOR_EXTREME_EDITION 188\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_SOLO_PROCESSOR 189\n#define SMBIOS_PROCESSOR_FAMILY_RESERVED 190\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_DUO_PROCESSOR 191\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_SOLO_PROCESSOR 192\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_EXTREME_PROCESSOR 193\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_QUAD_PROCESSOR 194\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_EXTREME_MOBILE_PROCESSOR 195\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_DUO_MOBILE_PROCESSOR 196\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_2_SOLO_MOBILE_PROCESSOR 197\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_I7_PROCESSOR 198\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_CELERO_PROCESSOR 199\n#define SMBIOS_PROCESSOR_FAMILY_IBM390_FAMILY 200\n#define SMBIOS_PROCESSOR_FAMILY_G4 201\n#define SMBIOS_PROCESSOR_FAMILY_G5 202\n#define SMBIOS_PROCESSOR_FAMILY_ESA_390_G6 203\n#define SMBIOS_PROCESSOR_FAMILY_Z_ARCHITECTURE_BASE 204\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_I5_PROCESSOR 205\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_I3_PROCESSOR 206\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_I9_PROCESSOR 207\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_XEON_D_PROCESSOR_FAMILY 208\n// 209 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_VIA_C7_M_PROCESSOR_FAMILY 210\n#define SMBIOS_PROCESSOR_FAMILY_VIA_C7_D_PROCESSOR_FAMILY 211\n#define SMBIOS_PROCESSOR_FAMILY_VIA_C7_PROCESSOR_FAMILY 212\n#define SMBIOS_PROCESSOR_FAMILY_VIA_EDEN_PROCESSOR_FAMILY 213\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_INTEL_XEON_PROCESSOR 214\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_3XXX_SERIES 215\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_3XXX_SERIES 216\n#define SMBIOS_PROCESSOR_FAMILY_VIA_NANO_PROCESSOR_FAMILY 217\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_5XXX_SERIES 218\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_5XXX_SERIES 219\n// 220 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_INTEL_XEON_PROCESSOR_7XXX_SERIES 221\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_INTEL_XEON_PROCESSOR_7XXX_SERIES 222\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_INTEL_XEON_PROCESSOR_7XXX_SERIES 223\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_INTEL_XEON_PROCESSOR_3400_SERIES 224\n// 225-227 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_AMD_OPTERON_3000_SERIES_PROCESSOR 228\n#define SMBIOS_PROCESSOR_FAMILY_AMD_SEMPRON_II_PROCESSOR 229\n#define SMBIOS_PROCESSOR_FAMILY_EMBEDDED_AMD_OPTERON_QUAD_CORE_PROCESSOR_FAMILY 230\n#define SMBIOS_PROCESSOR_FAMILY_AMD_PHENOM_TRIPLE_CORE_PROCESSOR_FAMILY 231\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_ULTRA_DUAL_CORE_MOBILE_PROCESSOR_FAMILY 232\n#define SMBIOS_PROCESSOR_FAMILY_AMD_TURION_DUAL_CORE_MOBILE_PROCESSOR_FAMILY 233\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_DUAL_CORE_PROCESSOR_FAMILY 234\n#define SMBIOS_PROCESSOR_FAMILY_AMD_SEMPRON_SI_PROCESSOR_FAMILY 235\n#define SMBIOS_PROCESSOR_FAMILY_AMD_PHENOM_II_PROCESSOR_FAMILY 236\n#define SMBIOS_PROCESSOR_FAMILY_AMD_ATHLON_II_PROCESSOR_FAMILY 237\n#define SMBIOS_PROCESSOR_FAMILY_SIX_CORE_AMD_OPTERON_PROCESSOR_FAMILY 238\n#define SMBIOS_PROCESSOR_FAMILY_AMD_SEMPRON_M_PROCESSOR_FAMILY 239\n// 240-249 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_I860 250\n#define SMBIOS_PROCESSOR_FAMILY_I960 251\n// 252-253 - Available for assignment\n#define SMBIOS_PROCESSOR_FAMILY_USE_2ND_FIELD 254\n// 255 RESERVED\n// 256-511 - Available for assignment, except for:\n#define SMBIOS_PROCESSOR_FAMILY_ARMV7 256\n#define SMBIOS_PROCESSOR_FAMILY_ARMV8 257\n#define SMBIOS_PROCESSOR_FAMILY_ARMV9 258\n// 259 - Reserved for future use by ARM\n#define SMBIOS_PROCESSOR_FAMILY_SH_3 260\n#define SMBIOS_PROCESSOR_FAMILY_SH_4 261\n#define SMBIOS_PROCESSOR_FAMILY_ARM 280\n#define SMBIOS_PROCESSOR_FAMILY_STRONGARM 281\n#define SMBIOS_PROCESSOR_FAMILY_6X86 300\n#define SMBIOS_PROCESSOR_FAMILY_MEDIAGX 301\n#define SMBIOS_PROCESSOR_FAMILY_MII 302\n#define SMBIOS_PROCESSOR_FAMILY_WINCHIP 320\n#define SMBIOS_PROCESSOR_FAMILY_DSP 350\n#define SMBIOS_PROCESSOR_FAMILY_VIDEO_PROCESSOR 500\n// 512-767 - Available for assignment, except for:\n#define SMBIOS_PROCESSOR_FAMILY_RISC_V_RV32 512\n#define SMBIOS_PROCESSOR_FAMILY_RISC_V_RV64 513\n#define SMBIOS_PROCESSOR_FAMILY_RISC_V_RV128 514\n#define SMBIOS_PROCESSOR_FAMILY_LOONGARCH 600\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_1_PROCESSOR_FAMILY 601\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_2_PROCESSOR_FAMILY 602\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3_PROCESSOR_FAMILY 603\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_2K_PROCESSOR_FAMILY 604\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3A_PROCESSOR_FAMILY 605\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3B_PROCESSOR_FAMILY 606\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3C_PROCESSOR_FAMILY 607\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3D_PROCESSOR_FAMILY 608\n#define SMBIOS_PROCESSOR_FAMILY_LOONGSON_3E_PROCESSOR_FAMILY 609\n#define SMBIOS_PROCESSOR_FAMILY_DUAL_CORE_LOONGSON_2K_PROCESSOR_2XXX_SERIES 610\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_LOONGSON_3A_PROCESSOR_5XXX_SERIES 620\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_LOONGSON_3A_PROCESSOR_5XXX_SERIES 621\n#define SMBIOS_PROCESSOR_FAMILY_QUAD_CORE_LOONGSON_3B_PROCESSOR_5XXX_SERIES 622\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_LOONGSON_3B_PROCESSOR_5XXX_SERIES 623\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_LOONGSON_3C_PROCESSOR_5XXX_SERIES 624\n#define SMBIOS_PROCESSOR_FAMILY_MULTI_CORE_LOONGSON_3D_PROCESSOR_5XXX_SERIES 625\n// 768-1023 - Available for assignment, except for:\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_3 768\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_5 769\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_7 770\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_9 771\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_ULTRA_3 772\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_ULTRA_5 773\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_ULTRA_7 774\n#define SMBIOS_PROCESSOR_FAMILY_INTEL_CORE_ULTRA_9 775\n// 1024-65533 - Available for assignment\n// 65534–65535 - RESERVED\n\n#define SMBIOS_PROCESSOR_STATUS_UNKNOWN              0\n#define SMBIOS_PROCESSOR_STATUS_ENABLED              1\n#define SMBIOS_PROCESSOR_STATUS_DISABLED_BY_USER     2\n#define SMBIOS_PROCESSOR_STATUS_DISABLED_BY_FIRMWARE 3\n#define SMBIOS_PROCESSOR_STATUS_IDLE                 4\n#define SMBIOS_PROCESSOR_STATUS_RESERVED_5           5\n#define SMBIOS_PROCESSOR_STATUS_RESERVED_6           6\n#define SMBIOS_PROCESSOR_STATUS_OTHER                7\n\n#define SMBIOS_PROCESSOR_UPGRADE_OTHER 1\n#define SMBIOS_PROCESSOR_UPGRADE_UNKNOWN 2\n#define SMBIOS_PROCESSOR_UPGRADE_DAUGHTER_BOARD 3\n#define SMBIOS_PROCESSOR_UPGRADE_ZIF_SOCKET 4\n#define SMBIOS_PROCESSOR_UPGRADE_REPLACEABLE_PIGGY_BACK 5\n#define SMBIOS_PROCESSOR_UPGRADE_NONE 6\n#define SMBIOS_PROCESSOR_UPGRADE_LIF_SOCKET 7\n#define SMBIOS_PROCESSOR_UPGRADE_SLOT_1 8\n#define SMBIOS_PROCESSOR_UPGRADE_SLOT_2 9\n#define SMBIOS_PROCESSOR_UPGRADE_370_PIN_SOCKET 10\n#define SMBIOS_PROCESSOR_UPGRADE_SLOT_A 11\n#define SMBIOS_PROCESSOR_UPGRADE_SLOT_M 12\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_423 13\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_A 14 // (Socket 462)\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_478 15\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_754 16\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_940 17\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_939 18\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_MPGA604 19\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA771 20\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA775 21\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_S1 22\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_AM2 23\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_F 24 // (1207)\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1366 25\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_G34 26\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_AM3 27\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_C32 28\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1156 29\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1567 30\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_PGA988A 31\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1288 32\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_RPGA988B 33\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1023 34\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1224 35\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1155 36\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1356 37\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA2011 38\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_FS1 39\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_FS2 40\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_FM1 41\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_FM2 42\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA2011_3 43\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1356_3 44\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1150 45\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1168 46\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1234 47\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1364 48\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_AM4 49\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1151 50\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1356 51\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1440 52\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1515 53\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA3647_1 54\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_SP3 55\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_SP3R2 56\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA2066 57\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1392 58\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1510 59\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1528 60\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA4189 61\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1200 62\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA4677 63\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1700 64\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1744 65\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1781 66\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1211 67\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA2422 68\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1211 69\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA2422 70\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA5773 71\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA5773 72\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_AM5 73\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_SP5 74\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_SP6 75\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA883 76\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1190 77\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA4129 78\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA4710 79\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA7529 80\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1964 81\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA1792 82\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA2049 83\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA2551 84\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_LGA1851 85\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA2114 86\n#define SMBIOS_PROCESSOR_UPGRADE_SOCKET_BGA2833 87\n#define SMBIOS_PROCESSOR_UPGRADE_INVALID 255\n\n#define SMBIOS_PROCESSOR_FLAG_RESERVED                  ((USHORT)0x0001)\n#define SMBIOS_PROCESSOR_FLAG_UNKNOWN                   ((USHORT)0x0002)\n#define SMBIOS_PROCESSOR_FLAG_64_BIT_CAPABLE            ((USHORT)0x0004)\n#define SMBIOS_PROCESSOR_FLAG_MILT_CORE                 ((USHORT)0x0008)\n#define SMBIOS_PROCESSOR_FLAG_HARDWARE_THREADED         ((USHORT)0x0010)\n#define SMBIOS_PROCESSOR_FLAG_EXECUTE_PROTECTION        ((USHORT)0x0020)\n#define SMBIOS_PROCESSOR_FLAG_ENHANCED_VIRTUALIZATION   ((USHORT)0x0040)\n#define SMBIOS_PROCESSOR_FLAG_POWER_PERFORMANCE_CONTROL ((USHORT)0x0080)\n#define SMBIOS_PROCESSOR_FLAG_128_BIT_CAPABLE           ((USHORT)0x0100)\n#define SMBIOS_PROCESSOR_FLAG_ARM64_SOC                 ((USHORT)0x0200)\n#define SMBIOS_PROCESSOR_FLAG_RESERVED_2                ((USHORT)0xFC00)\n\n//\n// Memory Controller Information (Type 5, Obsolete)\n//\n\n#define SMBIOS_MEMORY_CONTROLLER_INFORMATION_TYPE ((UCHAR)5)\n\ntypedef struct _SMBIOS_MEMORY_CONTROLLER_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR ErrorDetectionMethod;        // SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_*\n    UCHAR ErrorCorrectionCapabilities; // SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_*\n    UCHAR SupportedInterleave;         // SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_*\n    UCHAR CurrentInterleave;           // SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_*\n    UCHAR MaximumModuleSize;           // 2^n\n    USHORT SupportedSpeeds;            // SMBIOS_MEMORY_CONTROLLER_SPEEDS_*\n    USHORT SupportedTypes;             // SMBIOS_MEMORY_MODULE_TYPE_*\n\n    union\n    {\n        struct\n        {\n            UCHAR Requires5000mV : 1; // 5V\n            UCHAR Requires3500mV : 1; // 3.3V\n            UCHAR Requires2900mV : 1; // 2.9V\n            UCHAR Reserved : 5;\n        };\n\n        UCHAR Value;\n    } ModuleVoltage;\n\n    UCHAR NumberOfSlots;\n    USHORT SlotHandles[ANYSIZE_ARRAY];\n    // 2.1+\n    // SMBIOS_MEMORY_CONTROLLER_INFORMATION_EX\n} SMBIOS_MEMORY_CONTROLLER_INFORMATION, *PSMBIOS_MEMORY_CONTROLLER_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_CONTROLLER_INFORMATION) == 0x11);\n\ntypedef struct _SMBIOS_MEMORY_CONTROLLER_INFORMATION_EX\n{\n    UCHAR EnabledErrorCorrectionCapabilities; // SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_*\n} SMBIOS_MEMORY_CONTROLLER_INFORMATION_EX, *PSMBIOS_MEMORY_CONTROLLER_INFORMATION_EX;\n\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_OTHER        ((UCHAR)1)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_UNKNOWN      ((UCHAR)2)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_NONE         ((UCHAR)3)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_8_BIT_PARITY ((UCHAR)4)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_32_BIT_ECC   ((UCHAR)5)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_64_BIT_ECC   ((UCHAR)6)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_128_BIT_ECC  ((UCHAR)7)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_DETECTION_CRC          ((UCHAR)8)\n\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_OTHER       ((UCHAR)0x01)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_UNKNOWN     ((UCHAR)0x02)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_SINGLE_BIT  ((UCHAR)0x04)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_DOUBLE_BIT  ((UCHAR)0x10)\n#define SMBIOS_MEMORY_CONTROLLER_ERROR_CORRECTION_SCRUBBING   ((UCHAR)0x20)\n\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_OTHER             ((UCHAR)1)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_UNKNOWN           ((UCHAR)2)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_ONE_WAY           ((UCHAR)3)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_TWO_WAY           ((UCHAR)4)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_FOUR_WAY          ((UCHAR)5)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_EIGHT_WAY         ((UCHAR)6)\n#define SMBIOS_MEMORY_CONTROLLER_INTERLEAVE_SIXTEEN_WAY       ((UCHAR)7)\n\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_OTHER                 ((USHORT)0x0001)\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_UNKNOWN               ((USHORT)0x0002)\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_70NS                  ((USHORT)0x0004)\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_60NS                  ((USHORT)0x0008)\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_50NS                  ((USHORT)0x0010)\n#define SMBIOS_MEMORY_CONTROLLER_SPEEDS_RESERVED              ((USHORT)0xFFE0)\n\n//\n// Memory Module Information (Type 6, Obsolete)\n//\n\n#define SMBIOS_MEMORY_MODULE_INFORMATION_TYPE ((UCHAR)6)\n\ntypedef union _SMBIOS_MEMORY_MODULE_SIZE\n{\n    struct\n    {\n        UCHAR Size : 7;\n        UCHAR DoubleBank : 1;\n    };\n\n    UCHAR Value; // SMBIOS_MEMORY_MODULE_SIZE_VALUE_*\n} SMBIOS_MEMORY_MODULE_SIZE, *PSMBIOS_MEMORY_MODULE_SIZE;\n\n#define SMBIOS_MEMORY_MODULE_SIZE_VALUE_NOT_DETERMINABLE ((UCHAR)0x7D)\n#define SMBIOS_MEMORY_MODULE_SIZE_VALUE_NOT_ENABLED      ((UCHAR)0x7E)\n#define SMBIOS_MEMORY_MODULE_SIZE_VALUE_NOT_INSTALLED    ((UCHAR)0x7F)\n\ntypedef struct _SMBIOS_MEMORY_MODULE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR SocketDesignation; // string\n    UCHAR BankConnections;\n    UCHAR CurrentSpeed;\n    USHORT MemoryType;       // SMBIOS_MEMORY_MODULE_TYPE_*\n    SMBIOS_MEMORY_MODULE_SIZE InstalledSize;\n    SMBIOS_MEMORY_MODULE_SIZE EnabledSize;\n\n    union\n    {\n        struct\n        {\n            UCHAR UncorrectableErrors : 1;\n            UCHAR CorrectableErrors : 1;\n            UCHAR SeeEventLog : 1;\n            UCHAR Reserved : 5;\n        };\n\n        UCHAR Value;\n    } ErrorStatus;\n} SMBIOS_MEMORY_MODULE_INFORMATION, *PSMBIOS_MEMORY_MODULE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_MODULE_INFORMATION) == 0xC);\n\n#define SMBIOS_MEMORY_MODULE_TYPE_OTHER          ((USHORT)0x0001)\n#define SMBIOS_MEMORY_MODULE_TYPE_UNKNOWN        ((USHORT)0x0002)\n#define SMBIOS_MEMORY_MODULE_TYPE_STANDARD       ((USHORT)0x0004)\n#define SMBIOS_MEMORY_MODULE_TYPE_FAST_PAGE_MODE ((USHORT)0x0008)\n#define SMBIOS_MEMORY_MODULE_TYPE_EDO            ((USHORT)0x0010)\n#define SMBIOS_MEMORY_MODULE_TYPE_PARITY         ((USHORT)0x0020)\n#define SMBIOS_MEMORY_MODULE_TYPE_ECC            ((USHORT)0x0040)\n#define SMBIOS_MEMORY_MODULE_TYPE_SIMM           ((USHORT)0x0080)\n#define SMBIOS_MEMORY_MODULE_TYPE_DIMM           ((USHORT)0x0100)\n#define SMBIOS_MEMORY_MODULE_TYPE_BURST_EDO      ((USHORT)0x0200)\n#define SMBIOS_MEMORY_MODULE_TYPE_SDRAM          ((USHORT)0x0400)\n#define SMBIOS_MEMORY_MODULE_TYPE_RESERVED       ((USHORT)0xF800)\n\n//\n// Cache Information (Type 7)\n//\n\n#define SMBIOS_CACHE_INFORMATION_TYPE ((UCHAR)7)\n\ntypedef union _SMBIOS_CACHE_USHORT\n{\n    struct\n    {\n        USHORT Size : 15;\n        USHORT Granularity : 1; // 0 = 1K, 1 = 64K\n    };\n\n    USHORT Value;\n} SMBIOS_CACHE_USHORT;\n\ntypedef union _SMBIOS_CACHE_ULONG\n{\n    struct\n    {\n        ULONG Size : 31;\n        ULONG Granularity : 1; // 0 = 1K, 1 = 64K\n    };\n\n    ULONG Value;\n} SMBIOS_CACHE_ULONG;\n\ntypedef struct _SMBIOS_CACHE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR SocketDesignation;      // string\n\n    union\n    {\n        struct\n        {\n            USHORT Level : 3;     // L1 through L8\n            USHORT Socketed : 1;\n            USHORT Reserved : 1;\n            USHORT Location : 2;  // SMBIOS_CACHE_LOCATION_*\n            USHORT Enabled : 1;\n            USHORT Mode : 2;      // SMBIOS_CACHE_MODE_*\n            USHORT Reserved2 : 6;\n        };\n\n        USHORT Value;\n    } Configuration;\n\n    SMBIOS_CACHE_USHORT MaximumSize;\n    SMBIOS_CACHE_USHORT InstalledSize;\n    USHORT SupportedSRAM;         // SMBIOS_CACHE_SUPPORTED_SRAM_*\n    USHORT CurrentSRAM;           // SMBIOS_CACHE_SUPPORTED_SRAM_*\n    // 2.1+\n    UCHAR Speed;\n    UCHAR ErrorCorrectionType;    // SMBIOS_CACHE_ERROR_CORRECTION_*\n    UCHAR SystemCacheType;        // SMBIOS_CACHE_SYSTEM_CACHE_*\n    UCHAR Associativity;          // SMBIOS_CACHE_ASSOCIATIVITY_*\n    // 3.1+\n    SMBIOS_CACHE_ULONG MaximumSize2;\n    SMBIOS_CACHE_ULONG InstalledSize2;\n} SMBIOS_CACHE_INFORMATION, *PSMBIOS_CACHE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_CACHE_INFORMATION) == 0x1B);\n\n#define SMBIOS_CACHE_LOCATION_INTERNAL                ((USHORT)0)\n#define SMBIOS_CACHE_LOCATION_EXTERNAL                ((USHORT)1)\n#define SMBIOS_CACHE_LOCATION_RESERVED                ((USHORT)2)\n#define SMBIOS_CACHE_LOCATION_UNKNOWN                 ((USHORT)3)\n\n#define SMBIOS_CACHE_MODE_WRITE_THROUGH              ((USHORT)0)\n#define SMBIOS_CACHE_MODE_WRITE_BACK                 ((USHORT)1)\n#define SMBIOS_CACHE_MODE_VARIES_WITH_MEMORY_ADDRESS ((USHORT)2)\n#define SMBIOS_CACHE_MODE_UNKNOWN                    ((USHORT)3)\n\n#define SMBIOS_CACHE_SUPPORTED_SRAM_OTHER            ((USHORT)0x0001)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_UNKNOWN          ((USHORT)0x0002)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_NON_BURST        ((USHORT)0x0004)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_BURST            ((USHORT)0x0008)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_PIPELINE_BURST   ((USHORT)0x0010)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_SYNCHRONOUS      ((USHORT)0x0020)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_ASYNCHRONOUS     ((USHORT)0x0040)\n#define SMBIOS_CACHE_SUPPORTED_SRAM_RESERVED         ((USHORT)0xFF80)\n\n#define SMBIOS_CACHE_ERROR_CORRECTION_OTHER          ((UCHAR)1)\n#define SMBIOS_CACHE_ERROR_CORRECTION_UNKNOWN        ((UCHAR)2)\n#define SMBIOS_CACHE_ERROR_CORRECTION_NONE           ((UCHAR)3)\n#define SMBIOS_CACHE_ERROR_CORRECTION_PARITY         ((UCHAR)4)\n#define SMBIOS_CACHE_ERROR_CORRECTION_SINGLE_BIT_ECC ((UCHAR)5)\n#define SMBIOS_CACHE_ERROR_CORRECTION_MULTI_BIT_ECC  ((UCHAR)6)\n\n#define SMBIOS_CACHE_SYSTEM_CACHE_OTHER              ((UCHAR)1)\n#define SMBIOS_CACHE_SYSTEM_CACHE_UNKNOWN            ((UCHAR)2)\n#define SMBIOS_CACHE_SYSTEM_CACHE_INSTRUCTION        ((UCHAR)3)\n#define SMBIOS_CACHE_SYSTEM_CACHE_DATA               ((UCHAR)4)\n#define SMBIOS_CACHE_SYSTEM_CACHE_UNIFIED            ((UCHAR)5)\n\n#define SMBIOS_CACHE_ASSOCIATIVITY_OTHER             ((UCHAR)1)\n#define SMBIOS_CACHE_ASSOCIATIVITY_UNKNOWN           ((UCHAR)2)\n#define SMBIOS_CACHE_ASSOCIATIVITY_DIRECT_MAPPED     ((UCHAR)3)\n#define SMBIOS_CACHE_ASSOCIATIVITY_2_WAY             ((UCHAR)4)\n#define SMBIOS_CACHE_ASSOCIATIVITY_4_WAY             ((UCHAR)5)\n#define SMBIOS_CACHE_ASSOCIATIVITY_FULL              ((UCHAR)6)\n#define SMBIOS_CACHE_ASSOCIATIVITY_8_WAY             ((UCHAR)7)\n#define SMBIOS_CACHE_ASSOCIATIVITY_16_WAY            ((UCHAR)8)\n#define SMBIOS_CACHE_ASSOCIATIVITY_12_WAY            ((UCHAR)9)\n#define SMBIOS_CACHE_ASSOCIATIVITY_24_WAY            ((UCHAR)10)\n#define SMBIOS_CACHE_ASSOCIATIVITY_32_WAY            ((UCHAR)11)\n#define SMBIOS_CACHE_ASSOCIATIVITY_48_WAY            ((UCHAR)12)\n#define SMBIOS_CACHE_ASSOCIATIVITY_64_WAY            ((UCHAR)13)\n#define SMBIOS_CACHE_ASSOCIATIVITY_20_WAY            ((UCHAR)14)\n\n//\n// Port Connector Information (Type 8)\n//\n\n#define SMBIOS_PORT_CONNECTOR_INFORMATION_TYPE ((UCHAR)8)\n\ntypedef struct _SMBIOS_PORT_CONNECTOR_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR InternalReferenceDesignator; // string\n    UCHAR InternalConnectorType;       // SMBIOS_PORT_CONNECTOR_TYPE_*\n    UCHAR ExternalReferenceDesignator; // string\n    UCHAR ExternalConnectorType;       // SMBIOS_PORT_CONNECTOR_TYPE_*\n    UCHAR PortType;                    // SMBIOS_PORT_CONNECTOR_PORT_TYPE_*\n} SMBIOS_PORT_CONNECTOR_INFORMATION, *PSMBIOS_PORT_CONNECTOR_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_PORT_CONNECTOR_INFORMATION) == 0x9);\n\n#define SMBIOS_PORT_CONNECTOR_TYPE_NONE                    ((UCHAR)0)\n#define SMBIOS_PORT_CONNECTOR_TYPE_CENTRONICS              ((UCHAR)1)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MINI_CENTRONICS         ((UCHAR)2)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PROPRIETARY             ((UCHAR)3)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_25_PIN_MALE          ((UCHAR)4)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_25_PIN_FEMALE        ((UCHAR)5)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_15_PIN_MALE          ((UCHAR)6)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_15_PIN_FEMALE        ((UCHAR)7)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_9_PIN_MALE           ((UCHAR)8)\n#define SMBIOS_PORT_CONNECTOR_TYPE_DB_9_PIN_FEMALE         ((UCHAR)9)\n#define SMBIOS_PORT_CONNECTOR_TYPE_RJ_11                   ((UCHAR)10)\n#define SMBIOS_PORT_CONNECTOR_TYPE_RJ_54                   ((UCHAR)11)\n#define SMBIOS_PORT_CONNECTOR_TYPE_50_PIN_MINI_SCSI        ((UCHAR)12)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MINI_DIN                ((UCHAR)13)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MICRO_DIN               ((UCHAR)14)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PS2                     ((UCHAR)15)\n#define SMBIOS_PORT_CONNECTOR_TYPE_INFRARED                ((UCHAR)16)\n#define SMBIOS_PORT_CONNECTOR_TYPE_HP_HIL                  ((UCHAR)17)\n#define SMBIOS_PORT_CONNECTOR_TYPE_USB                     ((UCHAR)18)\n#define SMBIOS_PORT_CONNECTOR_TYPE_SSA_SCSI                ((UCHAR)19)\n#define SMBIOS_PORT_CONNECTOR_TYPE_CIRCULAR_DIN_8_MALE     ((UCHAR)20)\n#define SMBIOS_PORT_CONNECTOR_TYPE_CIRCULAR_DIN_8_FEMALE   ((UCHAR)21)\n#define SMBIOS_PORT_CONNECTOR_TYPE_ON_BOARD_IDE            ((UCHAR)22)\n#define SMBIOS_PORT_CONNECTOR_TYPE_ON_BOARD_FLOPPY         ((UCHAR)23)\n#define SMBIOS_PORT_CONNECTOR_TYPE_9_PIN_DIAL_INLINE       ((UCHAR)24)\n#define SMBIOS_PORT_CONNECTOR_TYPE_25_PIN_DIAL_INLINE      ((UCHAR)25)\n#define SMBIOS_PORT_CONNECTOR_TYPE_50_PIN_DIAL_INLINE      ((UCHAR)26)\n#define SMBIOS_PORT_CONNECTOR_TYPE_68_PIN_DIAL_INLINE      ((UCHAR)27)\n#define SMBIOS_PORT_CONNECTOR_TYPE_ON_BOARD_INPUT_CD_ROM   ((UCHAR)28)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MINI_CENTRONICS_TYPE_14 ((UCHAR)29)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MINI_CENTRONICS_TYPE_26 ((UCHAR)30)\n#define SMBIOS_PORT_CONNECTOR_TYPE_MINI_JACK               ((UCHAR)31)\n#define SMBIOS_PORT_CONNECTOR_TYPE_BNC                     ((UCHAR)32)\n#define SMBIOS_PORT_CONNECTOR_TYPE_1394                    ((UCHAR)33)\n#define SMBIOS_PORT_CONNECTOR_TYPE_SAS_SATA                ((UCHAR)34)\n#define SMBIOS_PORT_CONNECTOR_TYPE_USB_TYPE_C              ((UCHAR)35)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PC_98                   ((UCHAR)160)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PC_98_HIRESO            ((UCHAR)161)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PC_H98                  ((UCHAR)162)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PC_98_NOTE              ((UCHAR)163)\n#define SMBIOS_PORT_CONNECTOR_TYPE_PC_98_FULL              ((UCHAR)164)\n#define SMBIOS_PORT_CONNECTOR_TYPE_OTHER                   ((UCHAR)255)\n\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_NONE               ((UCHAR)0)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PARALLEL_XT_AT     ((UCHAR)1)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PARALLEL_PS2       ((UCHAR)2)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PARALLEL_ECP       ((UCHAR)3)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PARALLEL_EPP       ((UCHAR)4)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PARALLEL_ECP_EPP   ((UCHAR)5)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SERIAL_XT_AT       ((UCHAR)6)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SERIAL_16450       ((UCHAR)7)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SERIAL_16550       ((UCHAR)8)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SERIAL_16550A      ((UCHAR)9)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SCSI               ((UCHAR)10)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_MIDI               ((UCHAR)11)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_JOY_STICK          ((UCHAR)12)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_KEYBOARD           ((UCHAR)13)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_MOUSE              ((UCHAR)14)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SSA_SCSI           ((UCHAR)15)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_USB                ((UCHAR)16)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_FIRE_WIRE          ((UCHAR)17)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PCMCIA_TYPE_I      ((UCHAR)18)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PCMCIA_TYPE_II     ((UCHAR)19)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PCMCIA_TYPE_III    ((UCHAR)20)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_CARD_BUS           ((UCHAR)21)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_ACCESS_BUS         ((UCHAR)22)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SCSI_II            ((UCHAR)23)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SCSI_WIDE          ((UCHAR)24)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PC_98              ((UCHAR)25)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PC_98_HIRESO       ((UCHAR)26)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_PC_98H             ((UCHAR)27)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_VIDEO              ((UCHAR)28)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_AUDIO              ((UCHAR)29)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_MODEM              ((UCHAR)30)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_NETWORK            ((UCHAR)31)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SATA               ((UCHAR)32)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_SAS                ((UCHAR)33)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_MFDP               ((UCHAR)34)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_THUNDERBOLT        ((UCHAR)35)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_8251               ((UCHAR)160)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_8251_FIFO          ((UCHAR)161)\n#define SMBIOS_PORT_CONNECTOR_PORT_TYPE_8251_OTHER         ((UCHAR)255)\n\n//\n// System Slots (Type 9)\n//\n\n#define SMBIOS_SYSTEM_SLOT_INFORMATION_TYPE ((UCHAR)9)\n\ntypedef struct _SMBIOS_SYSTEM_SLOT_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR SocketDesignation; // string\n    UCHAR Type;              // SMBIOS_SYSTEM_SLOT_TYPE_*\n    UCHAR BusWidth;          // SMBIOS_SYSTEM_SLOT_BUS_WIDTH_*\n    UCHAR CurrentUsage;      // SMBIOS_SYSTEM_SLOT_USAGE_*\n    UCHAR Length;            // SMBIOS_SYSTEM_SLOT_LENGTH_*\n    USHORT Identifier;\n    UCHAR Characteristics;   // SMBIOS_SYSTEM_SLOT_FLAG_*\n    // 2.1+\n    UCHAR Characteristics2;  // SMBIOS_SYSTEM_SLOT_FLAG_2_*\n    // 2.6+\n    USHORT SegmentGroup;\n    UCHAR BusNumber;\n\n    union\n    {\n        struct\n        {\n            UCHAR FunctionNumber : 3;\n            UCHAR DeviceNumber : 5;\n        };\n\n        UCHAR Value;\n    } DeviceFunctionNumber;\n\n    // 3.2+\n    UCHAR BusWidthBase;\n    UCHAR PeerGroupingCount;\n    UCHAR PeerGroups[ANYSIZE_ARRAY];\n    // 3.4+\n    // SMBIOS_SYSTEM_SLOT_INFORMATION_EX\n} SMBIOS_SYSTEM_SLOT_INFORMATION, *PSMBIOS_SYSTEM_SLOT_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_SLOT_INFORMATION) == 0x14);\n\ntypedef struct _SMBIOS_SYSTEM_SLOT_INFORMATION_EX\n{\n    UCHAR Information;\n    UCHAR PhysicalWidth;\n    USHORT Pitch;\n    UCHAR Height;        // SMBIOS_SYSTEM_SLOT_HEIGHT_*\n} SMBIOS_SYSTEM_SLOT_INFORMATION_EX, *PSMBIOS_SYSTEM_SLOT_INFORMATION_EX;\n\n#define SMBIOS_SYSTEM_SLOT_TYPE_OTHER                                             ((UCHAR)1)\n#define SMBIOS_SYSTEM_SLOT_TYPE_UNKNOWN                                           ((UCHAR)2)\n#define SMBIOS_SYSTEM_SLOT_TYPE_ISA                                               ((UCHAR)3)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MCA                                               ((UCHAR)4)\n#define SMBIOS_SYSTEM_SLOT_TYPE_EISA                                              ((UCHAR)5)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI                                               ((UCHAR)6)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCMCIA                                            ((UCHAR)7)\n#define SMBIOS_SYSTEM_SLOT_TYPE_VL_VESA                                           ((UCHAR)8)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PROPRIETARY                                       ((UCHAR)9)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PROCESSOR_CARD_SLOT                               ((UCHAR)10)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PROPRIETARY_MEMORY_CARD_SLOT                      ((UCHAR)11)\n#define SMBIOS_SYSTEM_SLOT_TYPE_IO_RISER_CARD_SLOT                                ((UCHAR)12)\n#define SMBIOS_SYSTEM_SLOT_TYPE_NUBUS                                             ((UCHAR)13)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_66MHZ_CAPABLE                                 ((UCHAR)14)\n#define SMBIOS_SYSTEM_SLOT_TYPE_AGP                                               ((UCHAR)15)\n#define SMBIOS_SYSTEM_SLOT_TYPE_AGP_2X                                            ((UCHAR)16)\n#define SMBIOS_SYSTEM_SLOT_TYPE_AGP_4X                                            ((UCHAR)17)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_X                                             ((UCHAR)18)\n#define SMBIOS_SYSTEM_SLOT_TYPE_AGP_8X                                            ((UCHAR)19)\n#define SMBIOS_SYSTEM_SLOT_TYPE_M_2_SOCKET_1_DP_MECHANICAL_KEY_A                  ((UCHAR)20)\n#define SMBIOS_SYSTEM_SLOT_TYPE_M_2_SOCKET_1_SD_MECHANICAL_KEY_E                  ((UCHAR)21)\n#define SMBIOS_SYSTEM_SLOT_TYPE_M_2_SOCKET_2_MECHANICAL_KEY_B                     ((UCHAR)22)\n#define SMBIOS_SYSTEM_SLOT_TYPE_M_2_SOCKET_3_MECHANICAL_KEY_M                     ((UCHAR)23)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_TYPE_I                                        ((UCHAR)24)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_TYPE_II                                       ((UCHAR)25)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_TYPE_III_STANDARD_CONNECTOR                   ((UCHAR)26)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_TYPE_III_HE_CONNECTOR                         ((UCHAR)27)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_TYPE_IV                                       ((UCHAR)28)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_3_0_TYPE_A                                    ((UCHAR)29)\n#define SMBIOS_SYSTEM_SLOT_TYPE_MXM_3_0_TYPE_B                                    ((UCHAR)30)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_SFF_8639_U_2                    ((UCHAR)31)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_SFF_8639_U_2                    ((UCHAR)32)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_MINI_52_PIN_CEM_2_0_WITH_KEEP_OUTS    ((UCHAR)33)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_MINI_52_PIN_CEM_2_0_WITHOUT_KEEP_OUTS ((UCHAR)34)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_MINI_76_PIN_CEM_2_0                   ((UCHAR)35)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_SFF_8639_U_2                    ((UCHAR)36)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_SFF_8639_U_2                    ((UCHAR)37)\n#define SMBIOS_SYSTEM_SLOT_TYPE_OCP_NIC_3_0_SMALL_FORM_FACTOR_SFF                 ((UCHAR)38)\n#define SMBIOS_SYSTEM_SLOT_TYPE_OCP_NIC_3_0_LARGE_FORM_FACTOR_LFF                 ((UCHAR)39)\n#define SMBIOS_SYSTEM_SLOT_TYPE_OCP_NIC_PRIOR_TO_3_0                              ((UCHAR)40)\n#define SMBIOS_SYSTEM_SLOT_TYPE_CXL_FLEXBUS_1_0                                   ((UCHAR)48)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PC_98_C20                                         ((UCHAR)160)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PC_98_C24                                         ((UCHAR)161)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PC_98_E                                           ((UCHAR)162)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PC_98_LOCAL_BUS                                   ((UCHAR)163)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PC_98_CARD                                        ((UCHAR)164)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS                                       ((UCHAR)165)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_X1                                    ((UCHAR)166)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_X2                                    ((UCHAR)167)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_X4                                    ((UCHAR)168)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_X8                                    ((UCHAR)169)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_X16                                   ((UCHAR)170)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2                                 ((UCHAR)171)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_X1                              ((UCHAR)172)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_X2                              ((UCHAR)173)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_X4                              ((UCHAR)174)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_X8                              ((UCHAR)175)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_2_X16                             ((UCHAR)176)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3                                 ((UCHAR)177)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_X1                              ((UCHAR)178)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_X2                              ((UCHAR)179)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_X4                              ((UCHAR)180)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_X8                              ((UCHAR)181)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_3_X16                             ((UCHAR)182)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4                                 ((UCHAR)183)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_X1                              ((UCHAR)184)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_X2                              ((UCHAR)185)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_X4                              ((UCHAR)186)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_X8                              ((UCHAR)187)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_4_X16                             ((UCHAR)188)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5                                 ((UCHAR)189)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_X1                              ((UCHAR)190)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_X2                              ((UCHAR)191)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_X4                              ((UCHAR)192)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_X8                              ((UCHAR)193)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_5_X16                             ((UCHAR)194)\n#define SMBIOS_SYSTEM_SLOT_TYPE_PCI_EXPRESS_GEN_6                                 ((UCHAR)195)\n#define SMBIOS_SYSTEM_SLOT_TYPE_EDSFF_E1_S_E1_L                                   ((UCHAR)196)\n#define SMBIOS_SYSTEM_SLOT_TYPE_EDSFF_E3_S_E3_L                                   ((UCHAR)197)\n\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_OTHER                                        ((UCHAR)1)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_UNKNOWN                                      ((UCHAR)2)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_8_BIT                                        ((UCHAR)3)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_16_BIT                                       ((UCHAR)4)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_32_BIT                                       ((UCHAR)5)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_64_BIT                                       ((UCHAR)6)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_128_BIT                                      ((UCHAR)7)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_1X_OR_1X                                     ((UCHAR)8)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_2X_OR_2X                                     ((UCHAR)9)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_4X_OR_4X                                     ((UCHAR)10)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_8X_OR_8X                                     ((UCHAR)11)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_12X_OR_12X                                   ((UCHAR)12)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_16X_OR_16X                                   ((UCHAR)13)\n#define SMBIOS_SYSTEM_SLOT_BUS_WIDTH_32X_OR_32X                                   ((UCHAR)14)\n\n#define SMBIOS_SYSTEM_SLOT_USAGE_OTHER                                            ((UCHAR)1)\n#define SMBIOS_SYSTEM_SLOT_USAGE_UNKNOWN                                          ((UCHAR)2)\n#define SMBIOS_SYSTEM_SLOT_USAGE_AVAILABLE                                        ((UCHAR)3)\n#define SMBIOS_SYSTEM_SLOT_USAGE_IN_USE                                           ((UCHAR)4)\n#define SMBIOS_SYSTEM_SLOT_USAGE_UNAVAILABLE                                      ((UCHAR)5)\n\n#define SMBIOS_SYSTEM_SLOT_LENGTH_OTHER                                           ((UCHAR)1)\n#define SMBIOS_SYSTEM_SLOT_LENGTH_UNKNOWN                                         ((UCHAR)2)\n#define SMBIOS_SYSTEM_SLOT_LENGTH_SHORT                                           ((UCHAR)3)\n#define SMBIOS_SYSTEM_SLOT_LENGTH_LONG                                            ((UCHAR)4)\n#define SMBIOS_SYSTEM_SLOT_LENGTH_2_5_DRIVE                                       ((UCHAR)5)\n#define SMBIOS_SYSTEM_SLOT_LENGTH_3_4_DRIVE                                       ((UCHAR)6)\n\n#define SMBIOS_SYSTEM_SLOT_FLAG_UNKNOWN                                           ((UCHAR)0x01)\n#define SMBIOS_SYSTEM_SLOT_FLAG_5000MV                                            ((UCHAR)0x02)\n#define SMBIOS_SYSTEM_SLOT_FLAG_3300MV                                            ((UCHAR)0x04)\n#define SMBIOS_SYSTEM_SLOT_FLAG_SHARED                                            ((UCHAR)0x08)\n#define SMBIOS_SYSTEM_SLOT_FLAG_CARD_16                                           ((UCHAR)0x10)\n#define SMBIOS_SYSTEM_SLOT_FLAG_CARD_BUS                                          ((UCHAR)0x20)\n#define SMBIOS_SYSTEM_SLOT_FLAG_CARD_ZOOM_VIDEO                                   ((UCHAR)0x40)\n#define SMBIOS_SYSTEM_SLOT_FLAG_CARD_MODEN_RING_RESUME                            ((UCHAR)0x80)\n\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_PME_SIGNAL                                      ((UCHAR)0x01)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_HOT_PLUG                                        ((UCHAR)0x02)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_SMBUS_SIGNAL                                    ((UCHAR)0x04)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_PCIE_BIFURCATION                                ((UCHAR)0x08)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_SURPRISE_REMOVAL                                ((UCHAR)0x10)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_FLEXBUS_CLX_1                                   ((UCHAR)0x20)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_FLEXBUS_CLX_2                                   ((UCHAR)0x40)\n#define SMBIOS_SYSTEM_SLOT_FLAG_2_FLEXBUS_CLX_4                                   ((UCHAR)0x80)\n\n#define SMBIOS_SYSTEM_SLOT_HEIGHT_NOT_APPLICABLE                                  ((UCHAR)0)\n#define SMBIOS_SYSTEM_SLOT_HEIGHT_OTHER                                           ((UCHAR)1)\n#define SMBIOS_SYSTEM_SLOT_HEIGHT_UNKNOWN                                         ((UCHAR)2)\n#define SMBIOS_SYSTEM_SLOT_HEIGHT_FULL_HEIGHT                                     ((UCHAR)3)\n#define SMBIOS_SYSTEM_SLOT_HEIGHT_LOW_PROFILE                                     ((UCHAR)4)\n\n//\n// On Board Devices Information (Type 10, Obsolete)\n//\n\n#define SMBIOS_ON_BOARD_DEVICE_INFORMATION_TYPE ((UCHAR)10)\n\ntypedef struct _SMBIOS_ON_BOARD_DEVICE_ENTRY\n{\n    union\n    {\n        struct\n        {\n            UCHAR Type : 7; // SMBIOS_ON_BOARD_DEVICE_TYPE_*\n            UCHAR Enabled : 1;\n        };\n\n        UCHAR Value;\n    } Device;\n    UCHAR Description; // string\n} SMBIOS_ON_BOARD_DEVICE_ENTRY, *PSMBIOS_ON_BOARD_DEVICE_ENTRY;\n\ntypedef struct _SMBIOS_ON_BOARD_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    SMBIOS_ON_BOARD_DEVICE_ENTRY Devices[ANYSIZE_ARRAY]; // (Header.Length - 4) / 2\n} SMBIOS_ON_BOARD_DEVICE_INFORMATION, *PSMBIOS_ON_BOARD_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_ON_BOARD_DEVICE_INFORMATION) == 0x6);\n\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_OTHER           ((UCHAR)1)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_VIDEO           ((UCHAR)3)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_SCSI_CONTROLLER ((UCHAR)4)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_ETHERNET        ((UCHAR)5)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_TOKEN_RING      ((UCHAR)6)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_SOUND           ((UCHAR)7)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_PATA_CONTROLLER ((UCHAR)8)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_SATA_CONTROLLER ((UCHAR)9)\n#define SMBIOS_ON_BOARD_DEVICE_TYPE_SAS_CONTROLLER  ((UCHAR)10)\n\n#define SMBIOS_OEM_STRING_INFORMATION_TYPE ((UCHAR)11)\n\n//\n// OEM Strings (Type 11)\n//\n\ntypedef struct _SMBIOS_OEM_STRING_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR Count;\n} SMBIOS_OEM_STRING_INFORMATION, *PSMBIOS_OEM_STRING_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_OEM_STRING_INFORMATION) == 0x5);\n\n//\n// System Configuration Options (Type 12)\n//\n\n#define SMBIOS_SYSTEM_CONFIGURATION_OPTION_INFORMATION_TYPE ((UCHAR)12)\n\ntypedef struct _SMBIOS_SYSTEM_CONFIGURATION_OPTION_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR Count;\n} SMBIOS_SYSTEM_CONFIGURATION_OPTION_INFORMATION, *PSMBIOS_SYSTEM_CONFIGURATION_OPTION_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_CONFIGURATION_OPTION_INFORMATION) == 0x5);\n\n//\n// Firmware Language Information (Type 13)\n//\n\n#define SMBIOS_FIRMWARE_LANGUAGE_INFORMATION_TYPE ((UCHAR)13)\n\ntypedef struct _SMBIOS_FIRMWARE_LANGUAGE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    UCHAR InstallableLanguages;\n\n    union\n    {\n        struct\n        {\n            // 2.1+\n            UCHAR AbbreviatedFormat : 1;\n            UCHAR Reserved : 7;\n        };\n\n        UCHAR Value;\n    } Flags;\n\n    UCHAR Reserved[15];\n    UCHAR CurrentLanguage; // string\n} SMBIOS_FIRMWARE_LANGUAGE_INFORMATION, *PSMBIOS_FIRMWARE_LANGUAGE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_FIRMWARE_LANGUAGE_INFORMATION) == 0x16);\n\n//\n// Group Associations (Type 14)\n//\n\n#define SMBIOS_GROUP_ASSOCIATION_INFORMATION_TYPE ((UCHAR)14)\n\ntypedef struct _SMBIOS_GROUP_ASSOCIATION_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    UCHAR Name;        // string\n    UCHAR ItemType;\n    USHORT ItemHandle;\n} SMBIOS_GROUP_ASSOCIATION_INFORMATION, *PSMBIOS_GROUP_ASSOCIATION_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_GROUP_ASSOCIATION_INFORMATION) == 0x8);\n\n//\n// System Event Log (Type 15)\n//\n\n#define SMBIOS_SYSTEM_EVENT_LOG_INFORMATION_TYPE ((UCHAR)15)\n\ntypedef struct _SMBIOS_SYSTEM_EVENT_LOG_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.0+\n    USHORT AreaLength;\n    USHORT HeaderStartOffset;\n    USHORT DataStartOffset;\n    UCHAR AccessMethod;\n\n    union\n    {\n        struct\n        {\n            UCHAR Valid : 1;\n            UCHAR Full : 1;\n            UCHAR Reserved : 6;\n        };\n\n        UCHAR Value;\n    } Status;\n\n    ULONG ChangeToken;\n    ULONG AccessMethodAddress;\n    // 2.1+\n    UCHAR HeaderFormat;\n    UCHAR NumberOfDescriptors;\n    UCHAR LengthOfDescriptors;\n    UCHAR Descriptors[ANYSIZE_ARRAY];\n} SMBIOS_SYSTEM_EVENT_LOG_INFORMATION, *PSMBIOS_SYSTEM_EVENT_LOG_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_EVENT_LOG_INFORMATION) == 0x18);\n\n//\n// Physical Memory Array (Type 16)\n//\n\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_INFORMATION_TYPE ((UCHAR)16)\n\ntypedef struct _SMBIOS_PHYSICAL_MEMORY_ARRAY_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    UCHAR Location;        // SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_*\n    UCHAR Use;             // SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_*\n    UCHAR ErrorCorrection; // SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_*\n    ULONG MaximumCapacity;\n    USHORT ErrorInformationHandle;\n    USHORT NumberOfMemoryDevices;\n    // 2.7+\n    ULONGLONG ExtendedMaximumCapacity;\n} SMBIOS_PHYSICAL_MEMORY_ARRAY_INFORMATION, *PSMBIOS_PHYSICAL_MEMORY_ARRAY_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_PHYSICAL_MEMORY_ARRAY_INFORMATION) == 0x17);\n\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_OTHER                  ((UCHAR)1)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_UNKNOWN                ((UCHAR)2)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_MOTHERBOARD            ((UCHAR)3)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_ISA                    ((UCHAR)4)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_EISA                   ((UCHAR)5)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PCI                    ((UCHAR)6)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_MCA                    ((UCHAR)7)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PCMCIA                 ((UCHAR)8)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PROPRIETARY            ((UCHAR)9)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_NUBUS                  ((UCHAR)10)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PC_98_C20              ((UCHAR)160)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PC_98_C24              ((UCHAR)161)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PC_98_E                ((UCHAR)162)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PC_98_LOCAL_BUS        ((UCHAR)163)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_LOCATION_PC_98_CXL              ((UCHAR)164)\n\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_OTHER                       ((UCHAR)1)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_UNKNOWN                     ((UCHAR)2)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_SYSTEM                      ((UCHAR)3)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_VIDEO                       ((UCHAR)4)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_FLASH                       ((UCHAR)5)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_NON_VOLATILE                ((UCHAR)6)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_USE_CACHE                       ((UCHAR)7)\n\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_OTHER          ((UCHAR)1)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_UNKNOWN        ((UCHAR)2)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_NONE           ((UCHAR)3)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_PARITY         ((UCHAR)4)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_SINGLE_BIT_ECC ((UCHAR)5)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_MULTI_BIT_ECC  ((UCHAR)6)\n#define SMBIOS_PHYSICAL_MEMORY_ARRAY_ERROR_CORRECTION_CRC            ((UCHAR)7)\n\n//\n// Memory Device (Type 17)\n//\n\n#define SMBIOS_MEMORY_DEVICE_INFORMATION_TYPE ((UCHAR)17)\n\ntypedef struct _SMBIOS_MEMORY_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    USHORT PhysicalArrayHandle;\n    USHORT MemoryErrorInformationHandle;\n    USHORT TotalWidth;\n    USHORT DataWidth;\n\n    union\n    {\n        struct\n        {\n            USHORT Size : 15;\n            USHORT Granularity : 1; // 0 = megabytes, 1 = kilobytes\n        };\n\n        USHORT Value;\n    } Size;\n\n    UCHAR FormFactor;        // SMBIOS_MEMORY_DEVICE_FORM_FACTOR_*\n    UCHAR DeviceSet;\n    UCHAR DeviceLocator;     // string\n    UCHAR BankLocator;       // string\n    UCHAR MemoryType;        // SMBIOS_MEMORY_DEVICE_TYPE_*\n    USHORT TypeDetail;       // SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_*\n    USHORT Speed;\n    // 2.3+\n    UCHAR Manufacturer;      // string\n    UCHAR SerialNumber;      // string\n    UCHAR AssetTag;          // string\n    UCHAR PartNumber;        // string\n    // 2.6+\n\n    union\n    {\n        struct\n        {\n            UCHAR Rank : 4;\n            UCHAR Reserved : 4;\n        };\n\n        UCHAR Value;\n    } Attributes;\n\n    // 2.7+\n    ULONG ExtendedSize;\n    USHORT ConfiguredSpeed;\n    // 2.8+\n    USHORT MinimumVoltage;\n    USHORT MaximumVoltage;\n    USHORT ConfiguredVoltage;\n    // 3.2+\n    UCHAR Technology;        // SMBIOS_MEMORY_DEVICE_TECHNOLOGY_*\n    USHORT ModeCapabilities; // SMBIOS_MEMORY_DEVICE_MODE_*\n    UCHAR FirmwareVersion;   // string\n    USHORT ModuleManufacturerID;\n    USHORT ModuleProductID;\n    USHORT SubsystemControllerManufacturerID;\n    USHORT SubsystemControllerProductID;\n    ULONGLONG NonVolatileSize;\n    ULONGLONG VolatileSize;\n    ULONGLONG CacheSize;\n    ULONGLONG LogicalSize;\n    // 3.3+\n    ULONG ExtendedSpeed;\n    ULONG ExtendedConfiguredSpeed;\n    // 3.7+\n    USHORT PMIC0ManufacturerID;\n    USHORT PMIC0Revision;\n    USHORT RCDManufacturerID;\n    USHORT RCDRevision;\n} SMBIOS_MEMORY_DEVICE_INFORMATION, *PSMBIOS_MEMORY_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_DEVICE_INFORMATION) == 0x64);\n\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_OTHER                ((UCHAR)1)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_UNKNOWN              ((UCHAR)2)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_SIMM                 ((UCHAR)3)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_SIP                  ((UCHAR)4)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_CHIP                 ((UCHAR)5)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_DIP                  ((UCHAR)6)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_ZIP                  ((UCHAR)7)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_PROPRIETARY          ((UCHAR)8)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_DIMM                 ((UCHAR)9)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_TSOP                 ((UCHAR)10)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_ROW_OF_CHIPS         ((UCHAR)11)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_RIMM                 ((UCHAR)12)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_SODIMM               ((UCHAR)13)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_SRIMM                ((UCHAR)14)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_FB_DIMM              ((UCHAR)15)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_DIE                  ((UCHAR)16)\n#define SMBIOS_MEMORY_DEVICE_FORM_FACTOR_CAMM                 ((UCHAR)17)\n\n#define SMBIOS_MEMORY_DEVICE_TYPE_OTHER                       ((UCHAR)1)\n#define SMBIOS_MEMORY_DEVICE_TYPE_UNKNOWN                     ((UCHAR)2)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DRAM                        ((UCHAR)3)\n#define SMBIOS_MEMORY_DEVICE_TYPE_EDRAM                       ((UCHAR)4)\n#define SMBIOS_MEMORY_DEVICE_TYPE_VRAM                        ((UCHAR)5)\n#define SMBIOS_MEMORY_DEVICE_TYPE_SRAM                        ((UCHAR)6)\n#define SMBIOS_MEMORY_DEVICE_TYPE_RAM                         ((UCHAR)7)\n#define SMBIOS_MEMORY_DEVICE_TYPE_ROM                         ((UCHAR)8)\n#define SMBIOS_MEMORY_DEVICE_TYPE_FLASH                       ((UCHAR)9)\n#define SMBIOS_MEMORY_DEVICE_TYPE_EEPROM                      ((UCHAR)10)\n#define SMBIOS_MEMORY_DEVICE_TYPE_FEPROM                      ((UCHAR)11)\n#define SMBIOS_MEMORY_DEVICE_TYPE_EPROM                       ((UCHAR)12)\n#define SMBIOS_MEMORY_DEVICE_TYPE_CDRAM                       ((UCHAR)13)\n#define SMBIOS_MEMORY_DEVICE_TYPE_3DRAM                       ((UCHAR)14)\n#define SMBIOS_MEMORY_DEVICE_TYPE_SDRAM                       ((UCHAR)15)\n#define SMBIOS_MEMORY_DEVICE_TYPE_SGRAM                       ((UCHAR)16)\n#define SMBIOS_MEMORY_DEVICE_TYPE_RDRAM                       ((UCHAR)17)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR                         ((UCHAR)18)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR2                        ((UCHAR)19)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR2_FB_DIMM                ((UCHAR)20)\n// 21-23 reserved\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR3                        ((UCHAR)24)\n#define SMBIOS_MEMORY_DEVICE_TYPE_FBD2                        ((UCHAR)25)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR4                        ((UCHAR)26)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LPDDR                       ((UCHAR)27)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LPDDR2                      ((UCHAR)28)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LPDDR3                      ((UCHAR)29)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LPDDR4                      ((UCHAR)30)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LOCAL_NON_VOLATILE          ((UCHAR)31)\n#define SMBIOS_MEMORY_DEVICE_TYPE_HBM                         ((UCHAR)32)\n#define SMBIOS_MEMORY_DEVICE_TYPE_HBM2                        ((UCHAR)33)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DDR5                        ((UCHAR)34)\n#define SMBIOS_MEMORY_DEVICE_TYPE_LPDDR5                      ((UCHAR)35)\n#define SMBIOS_MEMORY_DEVICE_TYPE_HBM3                        ((UCHAR)36)\n\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_RESERVED             ((USHORT)0x0001)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_OTHER                ((USHORT)0x0002)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_UNKNOWN              ((USHORT)0x0004)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_FAST_PAGED           ((USHORT)0x0008)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_STATIC_COL           ((USHORT)0x0010)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_PSEUDO_STATIC        ((USHORT)0x0020)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_RAMBUS               ((USHORT)0x0040)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_SYNCHRONOUS          ((USHORT)0x0080)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_CMOS                 ((USHORT)0x0100)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_EDO                  ((USHORT)0x0200)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_WINDOW_DRAM          ((USHORT)0x0400)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_CACHE_DRAM           ((USHORT)0x0800)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_NON_VOLATILE         ((USHORT)0x1000)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_BUFFERED             ((USHORT)0x2000)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_UNBUFFERED           ((USHORT)0x4000)\n#define SMBIOS_MEMORY_DEVICE_TYPE_DETAIL_LRDIMM               ((USHORT)0x8000)\n\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_OTHER                 ((UCHAR)1)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_UNKNOWN               ((UCHAR)2)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_DRAM                  ((UCHAR)3)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_NVDIMM_N              ((UCHAR)4)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_NVDIMM_F              ((UCHAR)5)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_NVDIMM_P              ((UCHAR)6)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_INTEL_OPTANE          ((UCHAR)7)\n#define SMBIOS_MEMORY_DEVICE_TECHNOLOGY_MRDIMM                ((UCHAR)8)\n\n#define SMBIOS_MEMORY_DEVICE_MODE_RESERVED                    ((USHORT)0x0001)\n#define SMBIOS_MEMORY_DEVICE_MODE_OTHER                       ((USHORT)0x0002)\n#define SMBIOS_MEMORY_DEVICE_MODE_UNKNOWN                     ((USHORT)0x0004)\n#define SMBIOS_MEMORY_DEVICE_MODE_VOLATILE                    ((USHORT)0x0008)\n#define SMBIOS_MEMORY_DEVICE_MODE_BYTE_ACCESSIBLE_PERSISTENT  ((USHORT)0x0010)\n#define SMBIOS_MEMORY_DEVICE_MODE_BLOCK_ACCESSIBLE_PERSISTENT ((USHORT)0x0020)\n#define SMBIOS_MEMORY_DEVICE_MODE_RESERVED2                   ((USHORT)0xFFC0)\n\n//\n// 32-Bit Memory Error Information (Type 18)\n//\n\n#define SMBIOS_32_BIT_MEMORY_ERROR_INFORMATION_TYPE ((UCHAR)18)\n\ntypedef struct _SMBIOS_32_BIT_MEMORY_ERROR_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    UCHAR Type;        // SMBIOS_MEMORY_ERROR_TYPE_*\n    UCHAR Granularity; // SMBIOS_MEMORY_ERROR_GRANULARITY_*\n    UCHAR Operation;   // SMBIOS_MEMORY_ERROR_OPERATION_*\n    ULONG VendorSyndrome;\n    ULONG ArrayErrorAddress;\n    ULONG DeviceErrorAddress;\n    ULONG ErrorResolution;\n} SMBIOS_32_BIT_MEMORY_ERROR_INFORMATION, *PSMBIOS_32_BIT_MEMORY_ERROR_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_32_BIT_MEMORY_ERROR_INFORMATION) == 0x17);\n\n//\n// Memory Array Mapped Address (Type 19)\n//\n\n#define SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS_INFORMATION_TYPE ((UCHAR)19)\n\ntypedef struct _SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    ULONG StartingAddress;\n    ULONG EndingAddress;\n    USHORT ArrayHandle;\n    UCHAR PartitionWidth;\n    // 2.7+\n    ULONGLONG ExtendedStartingAddress;\n    ULONGLONG ExtendedEndingAddress;\n} SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS_INFORMATION, *PSMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS_INFORMATION) == 0x1F);\n\n//\n// Memory Device Mapped Address (Type 20)\n//\n\n#define SMBIOS_MEMORY_DEVICE_MAPPED_ADDRESS_INFORMATION_TYPE ((UCHAR)20)\n\ntypedef struct _SMBIOS_MEMORY_DEVICE_MAPPED_ADDRESS_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    ULONG StartingAddress;\n    ULONG EndingAddress;\n    USHORT DeviceHandle;\n    USHORT ArrayMappedAddressHandle;\n    UCHAR PartitionRowPosition;\n    UCHAR InterleavePosition;\n    UCHAR InterleavedDataDepth;\n    // 2.7+\n    ULONGLONG ExtendedStartingAddress;\n    ULONGLONG ExtendedEndingAddress;\n} SMBIOS_MEMORY_DEVICE_MAPPED_ADDRESS_INFORMATION, *PSMBIOS_MEMORY_DEVICE_MAPPED_ADDRESS_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_DEVICE_MAPPED_ADDRESS_INFORMATION) == 0x23);\n\n//\n// Built-in Pointing Device (Type 21)\n//\n\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INFORMATION_TYPE ((UCHAR)21)\n\ntypedef struct _SMBIOS_BUILT_IN_POINTING_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    UCHAR PointerType;      // SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_*\n    UCHAR PointerInterface; // SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_*\n    UCHAR PointerButtons;\n} SMBIOS_BUILT_IN_POINTING_DEVICE_INFORMATION, *PSMBIOS_BUILT_IN_POINTING_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_BUILT_IN_POINTING_DEVICE_INFORMATION) == 0x7);\n\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_OTHER          ((UCHAR)1)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_UNKNOWN        ((UCHAR)2)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_MOUSE          ((UCHAR)3)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_TRACK_BALL     ((UCHAR)4)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_TRACK_POINT    ((UCHAR)5)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_GLIDE_POINT    ((UCHAR)6)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_TOUCH_PAD      ((UCHAR)7)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_TOUCH_SCREEN   ((UCHAR)8)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_TYPE_OPTICAL_SENSOR ((UCHAR)9)\n\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_OTHER     ((UCHAR)1)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_UNKNOWN   ((UCHAR)2)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_SERIAL    ((UCHAR)3)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_PS2       ((UCHAR)4)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_INFRARED  ((UCHAR)5)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_HP_HIL    ((UCHAR)6)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_BUS_MOUSE ((UCHAR)7)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_ADB       ((UCHAR)8)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_DB_9      ((UCHAR)160)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_MICRO_DIN ((UCHAR)161)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_USB       ((UCHAR)162)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_I2C       ((UCHAR)163)\n#define SMBIOS_BUILT_IN_POINTING_DEVICE_INTERFACE_SPI       ((UCHAR)164)\n\n//\n// Portable Battery (Type 22)\n//\n\n#define SMBIOS_PORTABLE_BATTERY_INFORMATION_TYPE ((UCHAR)22)\n\ntypedef struct _SMBIOS_PORTABLE_BATTERY_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.1+\n    UCHAR Location;             // string\n    UCHAR Manufacturer;         // string\n    UCHAR ManufactureDate;      // string\n    UCHAR SerialNumber;         // string\n    UCHAR DeviceName;           // string\n    UCHAR DeviceChemistry;      // SMBIOS_PORTABLE_BATTERY_CHEMISTRY_*\n    USHORT DesignCapacity;\n    USHORT DesignVoltage;\n    UCHAR SBDSVersionNumber;    // string\n    UCHAR MaximumError;\n    // 2.2+\n    USHORT SBDSSerialNumber;\n\n    union\n    {\n        struct\n        {\n            USHORT Day : 5;\n            USHORT Month : 4;\n            USHORT Year : 7;  // Biased by 1980\n        };\n\n        USHORT Value;\n    } SBDSManufactureDate;\n\n    UCHAR SBDSDeviceChemistry;  // string\n    UCHAR DesignCapacityMultiplier;\n    ULONG OEMSpecific;\n} SMBIOS_PORTABLE_BATTERY_INFORMATION, *PSMBIOS_PORTABLE_BATTERY_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_PORTABLE_BATTERY_INFORMATION) == 0x1A);\n\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_OTHER           ((UCHAR)1)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_LEAD_ACID       ((UCHAR)3)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_NICKEL_CADMIUM  ((UCHAR)4)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_NICKEL_METAL    ((UCHAR)5)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_LITHIUM_ION     ((UCHAR)6)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_ZINC_AIR        ((UCHAR)7)\n#define SMBIOS_PORTABLE_BATTERY_CHEMISTRY_LITHIUM_POLYMER ((UCHAR)8)\n\n//\n// System Reset (Type 23)\n//\n\n#define SMBIOS_SYSTEM_RESET_INFORMATION_TYPE ((UCHAR)23)\n\ntypedef struct _SMBIOS_SYSTEM_RESET_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n\n    union\n    {\n        struct\n        {\n            UCHAR UserEnabled : 1;\n            UCHAR WatchdogReset : 2;   // SMBIOS_SYSTEM_RESET_WATCHDOG_*\n            UCHAR WatchdogAction : 2;  // SMBIOS_SYSTEM_RESET_WATCHDOG_*\n            UCHAR WatchdogExists : 1;\n            UCHAR Reserved : 2;\n        };\n\n        UCHAR Value;\n    } Capabilities;\n\n    USHORT ResetCount;\n    USHORT ResetLimit;\n    USHORT TimerInterval;\n    USHORT Timeout;\n} SMBIOS_SYSTEM_RESET_INFORMATION, *PSMBIOS_SYSTEM_RESET_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_RESET_INFORMATION) == 0xD);\n\n#define SMBIOS_SYSTEM_RESET_WATCHDOG_RESERVED         ((UCHAR)0)\n#define SMBIOS_SYSTEM_RESET_WATCHDOG_OPERATING_SYSTEM ((UCHAR)1)\n#define SMBIOS_SYSTEM_RESET_WATCHDOG_SYSTEM_UTILITES  ((UCHAR)2)\n#define SMBIOS_SYSTEM_RESET_WATCHDOG_DO_NOT_REBOOT    ((UCHAR)3)\n\n//\n// Hardware Security (Type 24)\n//\n\n#define SMBIOS_HARDWARE_SECURITY_INFORMATION_TYPE ((UCHAR)24)\n\ntypedef struct _SMBIOS_HARDWARE_SECURITY_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n\n    union\n    {\n        struct\n        {\n            UCHAR FrontPanelReset : 2;       // SMBIOS_HARDWARE_SECURITY_SETTING_*\n            UCHAR AdministratorPassword : 2; // SMBIOS_HARDWARE_SECURITY_SETTING_*\n            UCHAR KeyboardPassword : 2;      // SMBIOS_HARDWARE_SECURITY_SETTING_*\n            UCHAR PowerOnPassword : 2;       // SMBIOS_HARDWARE_SECURITY_SETTING_*\n        };\n\n        UCHAR Value;\n    } HardwareSecuritySettings;\n} SMBIOS_HARDWARE_SECURITY_INFORMATION, *PSMBIOS_HARDWARE_SECURITY_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_HARDWARE_SECURITY_INFORMATION) == 0x5);\n\n#define SMBIOS_HARDWARE_SECURITY_SETTING_DISABLED        ((UCHAR)0)\n#define SMBIOS_HARDWARE_SECURITY_SETTING_ENABLED         ((UCHAR)1)\n#define SMBIOS_HARDWARE_SECURITY_SETTING_NOT_IMPLEMENTED ((UCHAR)2)\n#define SMBIOS_HARDWARE_SECURITY_SETTING_UNKNOWN         ((UCHAR)3)\n\n//\n// System Power Controls (Type 25)\n//\n\n#define SMBIOS_SYSTEM_POWER_CONTROLS_INFORMATION_TYPE ((UCHAR)25)\n\ntypedef struct _SMBIOS_SYSTEM_POWER_CONTROLS_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    UCHAR Month;\n    UCHAR Day;\n    UCHAR Hour;\n    UCHAR Minute;\n    UCHAR Second;\n} SMBIOS_SYSTEM_POWER_CONTROLS_INFORMATION, *PSMBIOS_SYSTEM_POWER_CONTROLS_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_POWER_CONTROLS_INFORMATION) == 0x9);\n\n//\n// Voltage Probe (Type 26)\n//\n\n#define SMBIOS_VOLTAGE_PROBE_INFORMATION_TYPE ((UCHAR)26)\n\ntypedef struct _SMBIOS_VOLTAGE_PROBE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    UCHAR Description; // string\n\n    union\n    {\n        struct\n        {\n            UCHAR Location : 5; // SMBIOS_VOLTAGE_PROBE_LOCATION_*\n            UCHAR Status : 3;   // SMBIOS_PROBE_STATUS_*\n        };\n\n        UCHAR Value;\n    } LocationAndStatus;\n\n    USHORT MaximumValue;\n    USHORT MinimumValue;\n    USHORT Resolution;\n    USHORT Tolerance;\n    USHORT Accuracy;\n    ULONG OEMDefined;\n    USHORT NominalValue;\n} SMBIOS_VOLTAGE_PROBE_INFORMATION, *PSMBIOS_VOLTAGE_PROBE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_VOLTAGE_PROBE_INFORMATION) == 0x16);\n\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_OTHER                    ((UCHAR)1)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_UNKNOWN                  ((UCHAR)2)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_PROCESSOR                ((UCHAR)3)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_DISK                     ((UCHAR)4)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_PERIPHERAL_BAY           ((UCHAR)5)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_SYSTEM_MANAGEMENT_MODULE ((UCHAR)6)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_MOTHERBOARD              ((UCHAR)7)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_MEMORY_MODULE            ((UCHAR)8)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_PROCESSOR_MODULE         ((UCHAR)9)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_POWER_UNIT               ((UCHAR)10)\n#define SMBIOS_VOLTAGE_PROBE_LOCATION_ADD_IN_CARD              ((UCHAR)11)\n\n//\n// Cooling Device (Type 27)\n//\n\n#define SMBIOS_COOLING_DEVICE_INFORMATION_TYPE ((UCHAR)27)\n\ntypedef struct _SMBIOS_COOLING_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    USHORT TemperatureProbeHandle;\n\n    union\n    {\n        struct\n        {\n            UCHAR DeviceType : 5; // SMBIOS_COOLING_DEVICE_TYPE_*\n            UCHAR Status : 3;     // SMBIOS_COOLING_DEVICE_STATUS_*\n        };\n\n        UCHAR Value;\n    } DeviceTypeAndStatus;\n\n    UCHAR CoolingUnitGroup;\n    ULONG OEMDefined;\n    USHORT NominalSpeed;\n    // 2.7+\n    UCHAR Description; // string\n} SMBIOS_COOLING_DEVICE_INFORMATION, *PSMBIOS_COOLING_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_COOLING_DEVICE_INFORMATION) == 0xF);\n\n#define SMBIOS_COOLING_DEVICE_TYPE_OTHER                    ((UCHAR)1)\n#define SMBIOS_COOLING_DEVICE_TYPE_UNKNOWN                  ((UCHAR)2)\n#define SMBIOS_COOLING_DEVICE_TYPE_FAN                      ((UCHAR)3)\n#define SMBIOS_COOLING_DEVICE_TYPE_CENTRIFUGAL_BLOWER       ((UCHAR)4)\n#define SMBIOS_COOLING_DEVICE_TYPE_CHIP_FAN                 ((UCHAR)5)\n#define SMBIOS_COOLING_DEVICE_TYPE_CABINET_FAN              ((UCHAR)6)\n#define SMBIOS_COOLING_DEVICE_TYPE_POWER_SUPPLY_FAN         ((UCHAR)7)\n#define SMBIOS_COOLING_DEVICE_TYPE_HEAT_PIPE                ((UCHAR)8)\n#define SMBIOS_COOLING_DEVICE_TYPE_INTEGRATED_REFRIGERATION ((UCHAR)9)\n#define SMBIOS_COOLING_DEVICE_TYPE_ACTIVE_COOLING           ((UCHAR)10)\n#define SMBIOS_COOLING_DEVICE_TYPE_PASSIVE_COOLING          ((UCHAR)11)\n\n#define SMBIOS_COOLING_DEVICE_STATUS_OTHER                  ((UCHAR)1)\n#define SMBIOS_COOLING_DEVICE_STATUS_UNKNOWN                ((UCHAR)2)\n#define SMBIOS_COOLING_DEVICE_STATUS_OK                     ((UCHAR)3)\n#define SMBIOS_COOLING_DEVICE_STATUS_NON_CRITICAL           ((UCHAR)4)\n#define SMBIOS_COOLING_DEVICE_STATUS_CRITICAL               ((UCHAR)5)\n#define SMBIOS_COOLING_DEVICE_STATUS_NON_RECOVERABLE        ((UCHAR)6)\n\n//\n// Temperature Probe (Type 28)\n//\n\n#define SMBIOS_TEMPERATURE_PROBE_INFORMATION_TYPE ((UCHAR)28)\n\ntypedef struct _SMBIOS_TEMPERATURE_PROBE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    UCHAR Description; // string\n\n    union\n    {\n        struct\n        {\n            UCHAR Location : 5; // SMBIOS_TEMPERATURE_PROBE_LOCATION_*\n            UCHAR Status : 3;   // SMBIOS_PROBE_STATUS_*\n        };\n\n        UCHAR Value;\n    } LocationAndStatus;\n\n    SHORT MaximumValue;\n    SHORT MinimumValue;\n    USHORT Resolution;\n    USHORT Tolerance;\n    USHORT Accuracy;\n    ULONG OEMDefined;\n    SHORT NominalValue;\n} SMBIOS_TEMPERATURE_PROBE_INFORMATION, *PSMBIOS_TEMPERATURE_PROBE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_TEMPERATURE_PROBE_INFORMATION) == 0x16);\n\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_OTHER                    ((UCHAR)1)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_UNKNOWN                  ((UCHAR)2)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_PROCESSOR                ((UCHAR)3)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_DISK                     ((UCHAR)4)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_PERIPHERAL_BAY           ((UCHAR)5)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_SYSTEM_MANAGEMENT_MODULE ((UCHAR)6)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_MOTHERBOARD              ((UCHAR)7)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_MEMORY_MODULE            ((UCHAR)8)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_PROCESSOR_MODULE         ((UCHAR)9)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_POWER_UNIT               ((UCHAR)10)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_ADD_IN_CARD              ((UCHAR)11)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_FRONT_PANEL_BOARD        ((UCHAR)12)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_BACK_PANEL_BOARD         ((UCHAR)13)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_POWER_SYSTEM_BOARD       ((UCHAR)14)\n#define SMBIOS_TEMPERATURE_PROBE_LOCATION_DRIVE_BACK_PLANE         ((UCHAR)15)\n\n//\n// Electrical Current Probe (Type 29)\n//\n\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_INFORMATION_TYPE ((UCHAR)29)\n\ntypedef struct _SMBIOS_ELECTRICAL_CURRENT_PROBE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    UCHAR Description; // string\n\n    union\n    {\n        struct\n        {\n            UCHAR Location : 5; // SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_*\n            UCHAR Status : 3;   // SMBIOS_PROBE_STATUS_*\n        };\n\n        UCHAR Value;\n    } LocationAndStatus;\n\n    USHORT MaximumValue;\n    USHORT MinimumValue;\n    USHORT Resolution;\n    USHORT Tolerance;\n    USHORT Accuracy;\n    ULONG OEMDefined;\n    USHORT NominalValue;\n} SMBIOS_ELECTRICAL_CURRENT_PROBE_INFORMATION, *PSMBIOS_ELECTRICAL_CURRENT_PROBE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_ELECTRICAL_CURRENT_PROBE_INFORMATION) == 0x16);\n\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_OTHER                    ((UCHAR)1)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_UNKNOWN                  ((UCHAR)2)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_PROCESSOR                ((UCHAR)3)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_DISK                     ((UCHAR)4)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_PERIPHERAL_BAY           ((UCHAR)5)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_SYSTEM_MANAGEMENT_MODULE ((UCHAR)6)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_MOTHERBOARD              ((UCHAR)7)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_MEMORY_MODULE            ((UCHAR)8)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_PROCESSOR_MODULE         ((UCHAR)9)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_POWER_UNIT               ((UCHAR)10)\n#define SMBIOS_ELECTRICAL_CURRENT_PROBE_LOCATION_ADD_IN_CARD              ((UCHAR)11)\n\n//\n// Out-of-Band Remote Access (Type 30)\n//\n\n#define SMBIOS_OUT_OF_BAND_REMOTE_ACCESS_INFORMATION_TYPE ((UCHAR)30)\n\ntypedef struct _SMBIOS_OUT_OF_BAND_REMOTE_ACCESS_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.2+\n    UCHAR Manufacturer; // string\n\n    union\n    {\n        struct\n        {\n            UCHAR InboundEnabled : 1;\n            UCHAR OutboundEnabled : 1;\n            UCHAR Reserved : 6;\n        };\n\n        UCHAR Value;\n    } Connections;\n} SMBIOS_OUT_OF_BAND_REMOTE_ACCESS_INFORMATION, *PSMBIOS_OUT_OF_BAND_REMOTE_ACCESS_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_OUT_OF_BAND_REMOTE_ACCESS_INFORMATION) == 0x6);\n\n//\n// Boot Integrity Services (BIS) Entry Point (Type 31)\n//\n\n#define SMBIOS_BOOT_INTEGRITY_SERVICES_ENTRY_POINT ((UCHAR)31)\n\n//\n// Structure type 31 (decimal) is reserved for use by the Boot Integrity Services (BIS).\n// See the Boot Integrity Services API Specification for details.\n//\n\n//\n// System Boot Information (Type 32)\n//\n\n#define SMBIOS_SYSTEM_BOOT_INFORMATION_TYPE ((UCHAR)32)\n\ntypedef struct _SMBIOS_SYSTEM_BOOT_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Reserved[6];\n    UCHAR BootStatus;  // SMBIOS_SYSTEM_BOOT_STATUS_*\n} SMBIOS_SYSTEM_BOOT_INFORMATION, *PSMBIOS_SYSTEM_BOOT_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_BOOT_INFORMATION) == 0xB);\n\n#define SMBIOS_SYSTEM_BOOT_STATUS_NO_ERROR                                    ((UCHAR)0)\n#define SMBIOS_SYSTEM_BOOT_STATUS_NO_BOOTABLE_MEDIA                           ((UCHAR)1)\n#define SMBIOS_SYSTEM_BOOT_STATUS_OPERATING_SYSTEM_FAILED_TO_LOAD             ((UCHAR)2)\n#define SMBIOS_SYSTEM_BOOT_STATUS_FIRMWARE_DETECTED_HARDWARE_FAILURE          ((UCHAR)3)\n#define SMBIOS_SYSTEM_BOOT_STATUS_OPERATING_SYSTEM_DETECTED_HARDWARE_FAILURE  ((UCHAR)4)\n#define SMBIOS_SYSTEM_BOOT_STATUS_USER_REQUESTED_BOOT                         ((UCHAR)5)\n#define SMBIOS_SYSTEM_BOOT_STATUS_SECURITY_VIOLATION                          ((UCHAR)6)\n#define SMBIOS_SYSTEM_BOOT_STATUS_PREVIOUSLY_REQUESTED_IMAGE                  ((UCHAR)7)\n#define SMBIOS_SYSTEM_BOOT_STATUS_WATCHDOG_EXPIRED                            ((UCHAR)8)\n// 9-127 specification reserved\n// 128-191 OEM reserved\n// 192-255 product specific\n\n//\n// 64-Bit Memory Error Information (Type 33)\n//\n\n#define SMBIOS_64_BIT_MEMORY_ERROR_INFORMATION_TYPE ((UCHAR)33)\n\ntypedef struct _SMBIOS_64_BIT_MEMORY_ERROR_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Type;        // SMBIOS_MEMORY_ERROR_TYPE_*\n    UCHAR Granularity; // SMBIOS_MEMORY_ERROR_GRANULARITY_*\n    UCHAR Operation;   // SMBIOS_MEMORY_ERROR_OPERATION_*\n    ULONG VendorSyndrome;\n    ULONGLONG ArrayErrorAddress;\n    ULONGLONG DeviceErrorAddress;\n    ULONG ErrorResolution;\n} SMBIOS_64_BIT_MEMORY_ERROR_INFORMATION, *PSMBIOS_64_BIT_MEMORY_ERROR_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_64_BIT_MEMORY_ERROR_INFORMATION) == 0x1F);\n\n//\n// Management Device (Type 34)\n//\n\n#define SMBIOS_MANAGEMENT_DEVICE_INFORMATION_TYPE ((UCHAR)34)\n\ntypedef struct _SMBIOS_MANAGEMENT_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Description; // string\n    UCHAR DeviceType;  // SMBIOS_MANAGEMENT_DEVICE_TYPE_*\n    ULONG Address;\n    UCHAR AddressType; // SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_*\n} SMBIOS_MANAGEMENT_DEVICE_INFORMATION, *PSMBIOS_MANAGEMENT_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MANAGEMENT_DEVICE_INFORMATION) == 0xB);\n\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_OTHER           ((UCHAR)1)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_LM75            ((UCHAR)3)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_LM78            ((UCHAR)4)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_LM79            ((UCHAR)5)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_LM80            ((UCHAR)6)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_LM81            ((UCHAR)7)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_ADM9240         ((UCHAR)8)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_DS1780          ((UCHAR)9)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_1617            ((UCHAR)10)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_GL518SM         ((UCHAR)11)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_W83781D         ((UCHAR)12)\n#define SMBIOS_MANAGEMENT_DEVICE_TYPE_HT82H791        ((UCHAR)13)\n\n#define SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_OTHER   ((UCHAR)1)\n#define SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_UNKNOWN ((UCHAR)2)\n#define SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_IO_PORT ((UCHAR)3)\n#define SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_MEMORY  ((UCHAR)4)\n#define SMBIOS_MANAGEMENT_DEVICE_ADDRESS_TYPE_SMBUS   ((UCHAR)5)\n\n//\n// Management Device Component (Type 35)\n//\n\n#define SMBIOS_MANAGEMENT_DEVICE_COMPONENT_INFORMATION_TYPE ((UCHAR)35)\n\ntypedef struct _SMBIOS_MANAGEMENT_DEVICE_COMPONENT_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Description; // string\n    USHORT ManagementDeviceHandle;\n    USHORT ComponentHandle;\n    USHORT ThresholdHandle;\n} SMBIOS_MANAGEMENT_DEVICE_COMPONENT_INFORMATION, *PSMBIOS_MANAGEMENT_DEVICE_COMPONENT_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MANAGEMENT_DEVICE_COMPONENT_INFORMATION) == 0xB);\n\n//\n// Management Device Threshold Data (Type 36)\n//\n\n#define SMBIOS_MANAGEMENT_DEVICE_THRESHOLD_INFORMATION_TYPE ((UCHAR)36)\n\ntypedef struct _SMBIOS_MANAGEMENT_DEVICE_THRESHOLD_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    USHORT LowerThresholdNonCritical;\n    USHORT UpperThresholdNonCritical;\n    USHORT LowerThresholdCritical;\n    USHORT UpperThresholdCritical;\n    USHORT LowerThresholdNonRecoverable;\n    USHORT UpperThresholdNonRecoverable;\n} SMBIOS_MANAGEMENT_DEVICE_THRESHOLD_INFORMATION, *PSMBIOS_MANAGEMENT_DEVICE_THRESHOLD_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MANAGEMENT_DEVICE_THRESHOLD_INFORMATION) == 0x10);\n\n//\n// Memory Channel (Type 37)\n//\n\n#define SMBIOS_MEMORY_CHANNEL_INFORMATION_TYPE ((UCHAR)37)\n\ntypedef struct _SMBIOS_MEMORY_CHANNEL_ENTRY\n{\n    UCHAR Load;\n    USHORT Handle;\n} SMBIOS_MEMORY_CHANNEL_ENTRY, *PSMBIOS_MEMORY_CHANNEL_ENTRY;\n\ntypedef struct _SMBIOS_MEMORY_CHANNEL_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Type;         // SMBIOS_MEMORY_CHANNEL_TYPE_*\n    UCHAR MaximumLoad;\n    UCHAR Count;\n    SMBIOS_MEMORY_CHANNEL_ENTRY Entries[ANYSIZE_ARRAY];\n} SMBIOS_MEMORY_CHANNEL_INFORMATION, *PSMBIOS_MEMORY_CHANNEL_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MEMORY_CHANNEL_INFORMATION) == 0xA);\n\n#define SMBIOS_MEMORY_CHANNEL_TYPE_OTHER     ((UCHAR)1)\n#define SMBIOS_MEMORY_CHANNEL_TYPE_UNKNOWN   ((UCHAR)2)\n#define SMBIOS_MEMORY_CHANNEL_TYPE_RAMBUS    ((UCHAR)3)\n#define SMBIOS_MEMORY_CHANNEL_TYPE_SYNC_LINK ((UCHAR)4)\n\n//\n// IPMI Device Information (Type 38)\n//\n\n#define SMBIOS_IPMI_DEVICE_INFORMATION_TYPE ((UCHAR)38)\n\ntypedef struct _SMBIOS_IPMI_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3+\n    UCHAR Type; // SMBIOS_IPMI_INTERFACE_TYPE_*\n\n    union\n    {\n        struct\n        {\n            UCHAR Minor : 4;\n            UCHAR Major : 4;\n        };\n\n        UCHAR Value;\n    } SpecificationRevision;\n\n    UCHAR I2CTargetAddress;\n    UCHAR NVStorageDeviceAddress;\n    ULONGLONG BaseAddress;\n\n    union\n    {\n        struct\n        {\n            UCHAR InterruptTriggerMode : 1; // 1 = level, 0 = edge\n            UCHAR InterruptPolarity : 1;    // 1 = active high, 0 = active low\n            UCHAR Reserved : 1;\n            UCHAR InterruptInfo : 1;        // 1 = specified, 0 = not specified\n            UCHAR LSBAddress : 1;           // address bit 0 value\n            UCHAR Reserved2 : 1;\n            UCHAR RegisterSpacing : 2;      // SMBIOS_IPMI_REGISTER_SPACING_*\n        };\n\n        UCHAR Value;\n    } Info;\n\n    UCHAR InterruptNumber;\n} SMBIOS_IPMI_DEVICE_INFORMATION, *PSMBIOS_IPMI_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_IPMI_DEVICE_INFORMATION) == 0x12);\n\n#define SMBIOS_IPMI_INTERFACE_TYPE_UNKONWN      ((UCHAR)0)\n#define SMBIOS_IPMI_INTERFACE_TYPE_KCS          ((UCHAR)1)\n#define SMBIOS_IPMI_INTERFACE_TYPE_SMIC         ((UCHAR)2)\n#define SMBIOS_IPMI_INTERFACE_TYPE_BT           ((UCHAR)3)\n#define SMBIOS_IPMI_INTERFACE_TYPE_SSIF         ((UCHAR)4)\n\n#define SMBIOS_IPMI_REGISTER_SPACING_SUCCESSIVE ((UCHAR)0)\n#define SMBIOS_IPMI_REGISTER_SPACING_32_BIT     ((UCHAR)1)\n#define SMBIOS_IPMI_REGISTER_SPACING_16_BIT     ((UCHAR)2)\n#define SMBIOS_IPMI_REGISTER_SPACING_RESERVED   ((UCHAR)3)\n\n//\n// System Power Supply (Type 39)\n//\n\n#define SMBIOS_SYSTEM_POWER_SUPPLY_INFORMATION_TYPE ((UCHAR)39)\n\ntypedef struct _SMBIOS_SYSTEM_POWER_SUPPLY_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.3.1+\n    UCHAR PowerUnitGroup;\n    UCHAR Location;          // string\n    UCHAR DeviceName;        // string\n    UCHAR Manufacturer;      // string\n    UCHAR SerialNumber;      // string\n    UCHAR AssetTag;          // string\n    UCHAR ModelPartNumber;   // string\n    UCHAR Revision;          // string\n    USHORT MaxPowerCapacity;\n\n    union\n    {\n        struct\n        {\n            USHORT HostSwappable : 1;\n            USHORT Present : 1;\n            USHORT Unplugged : 1;\n            USHORT RangeSwitching : 4; // SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_*\n            USHORT Status : 3;         // SMBIOS_POWER_SUPPLY_STATUS_*\n            USHORT Type : 4;           // SMBIOS_POWER_SUPPLY_TYPE_*\n            USHORT Reserved : 2;\n        };\n\n        USHORT Value;\n    } Characteristics;\n\n    USHORT InputVoltageProbeHandle;\n    USHORT CoolingDeviceHandle;\n    USHORT InputCurrentProbeHandle;\n} SMBIOS_SYSTEM_POWER_SUPPLY_INFORMATION, *PSMBIOS_SYSTEM_POWER_SUPPLY_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_SYSTEM_POWER_SUPPLY_INFORMATION) == 0x16);\n\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_OTHER          ((USHORT)1)\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_UNKNOWN        ((USHORT)2)\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_MANUAL         ((USHORT)3)\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_AUTO_SWITCH    ((USHORT)4)\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_WIDE_RANGE     ((USHORT)5)\n#define SMBIOS_POWER_SUPPLY_RANGE_SWITCHING_NOT_APPLICABLE ((USHORT)6)\n\n#define SMBIOS_POWER_SUPPLY_STATUS_OTHER                   ((USHORT)1)\n#define SMBIOS_POWER_SUPPLY_STATUS_UNKNOWN                 ((USHORT)2)\n#define SMBIOS_POWER_SUPPLY_STATUS_OK                      ((USHORT)3)\n#define SMBIOS_POWER_SUPPLY_STATUS_NON_CRITICAL            ((USHORT)4)\n#define SMBIOS_POWER_SUPPLY_STATUS_CRITICAL                ((USHORT)5)\n\n#define SMBIOS_POWER_SUPPLY_TYPE_OTHER                      ((USHORT)1)\n#define SMBIOS_POWER_SUPPLY_TYPE_UNKNOWN                    ((USHORT)2)\n#define SMBIOS_POWER_SUPPLY_TYPE_LINEAR                     ((USHORT)3)\n#define SMBIOS_POWER_SUPPLY_TYPE_SWITCHING                  ((USHORT)4)\n#define SMBIOS_POWER_SUPPLY_TYPE_BATTERY                    ((USHORT)5)\n#define SMBIOS_POWER_SUPPLY_TYPE_UPS                        ((USHORT)6)\n#define SMBIOS_POWER_SUPPLY_TYPE_CONVERTER                  ((USHORT)7)\n#define SMBIOS_POWER_SUPPLY_TYPE_REGULATOR                  ((USHORT)8)\n\n//\n// Additional Information (Type 40)\n//\n\n#define SMBIOS_ADDITIONAL_INFORMATION_TYPE ((UCHAR)40)\n\ntypedef struct _SMBIOS_ADDITIONAL_ENTRY\n{\n    UCHAR Length;\n    USHORT ReferencedHandle;\n    UCHAR ReferencedOffset;\n    UCHAR String; // string\n    UCHAR Value[ANYSIZE_ARRAY];\n} SMBIOS_ADDITIONAL_ENTRY, *PSMBIOS_ADDITIONAL_ENTRY;\n\ntypedef struct _SMBIOS_ADDITIONAL_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.6+\n    UCHAR Count;\n    SMBIOS_ADDITIONAL_ENTRY Entries[ANYSIZE_ARRAY];\n} SMBIOS_ADDITIONAL_INFORMATION, *PSMBIOS_ADDITIONAL_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_ADDITIONAL_INFORMATION) == 0xB);\n\n//\n// Onboard Devices Extended Information (Type 41)\n//\n\n#define SMBIOS_ONBOARD_DEVICE_INFORMATION_TYPE ((UCHAR)41)\n\ntypedef struct _SMBIOS_ONBOARD_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.6+\n    UCHAR ReferenceDesignation; // string\n\n    union\n    {\n        struct\n        {\n            UCHAR Type : 7;     // SMBIOS_ONBOARD_DEVICE_TYPE_*\n            UCHAR Enabled : 1;\n        };\n\n        UCHAR Value;\n    } DeviceType;\n\n    UCHAR DeviceTypeInstance;\n    USHORT SegmentGroupNumber;\n    UCHAR BusNumber;\n\n    union\n    {\n        struct\n        {\n            UCHAR FunctionNumber : 3;\n            UCHAR DeviceNumber : 5;\n        };\n\n        UCHAR Value;\n    } DeviceFunctionNumber;\n\n} SMBIOS_ONBOARD_DEVICE_INFORMATION, *PSMBIOS_ONBOARD_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_ONBOARD_DEVICE_INFORMATION) == 0xB);\n\n#define SMBIOS_ONBOARD_DEVICE_TYPE_OTHER        ((UCHAR)1)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_UNKNOWN      ((UCHAR)2)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_VIDEO        ((UCHAR)3)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_SCSI         ((UCHAR)4)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_ETHERNET     ((UCHAR)5)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_TOKEN_RING   ((UCHAR)6)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_SOUND        ((UCHAR)7)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_PATA         ((UCHAR)8)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_SATA         ((UCHAR)9)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_SAS          ((UCHAR)10)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_WIRELESS_LAN ((UCHAR)11)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_BLUETOOTH    ((UCHAR)12)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_WWAN         ((UCHAR)13)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_EMMC         ((UCHAR)14)\n#define SMBIOS_ONBOARD_DEIVCE_TYPE_NVME         ((UCHAR)15)\n#define SMBIOS_ONBOARD_DEVICE_TYPE_UFS          ((UCHAR)16)\n\n//\n// Management Controller Host Interface (Type 42)\n//\n\n#define SMBIOS_MCHI_INFORMATION_TYPE ((UCHAR)42)\n\ntypedef struct _SMBIOS_MCHI_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.6+\n    UCHAR Type;   // SMBIOS_MCHI_TYPE_*\n    UCHAR Length;\n    UCHAR Data[ANYSIZE_ARRAY];\n    // SMBIOS_MCHI_PROTOCOL_RECORDS\n} SMBIOS_MCHI_INFORMATION, *PSMBIOS_MCHI_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_MCHI_INFORMATION) == 0x7);\n\ntypedef struct _SMBIOS_MCHI_PROTOCOL_RECORD\n{\n    UCHAR Type;   // SMBIOS_MCHI_PROTOCOL_TYPE_*\n    UCHAR Length;\n    UCHAR Data[ANYSIZE_ARRAY];\n} SMBIOS_MCHI_PROTOCOL_RECORD, *PSMBIOS_MCHI_PROTOCOL_RECORD;\n\nC_ASSERT(sizeof(SMBIOS_MCHI_PROTOCOL_RECORD) == 0x3);\n\ntypedef struct _SMBIOS_MCHI_PROTOCOL_RECORDS\n{\n    UCHAR Count;\n    SMBIOS_MCHI_PROTOCOL_RECORD Records[ANYSIZE_ARRAY];\n} SMBIOS_MCHI_PROTOCOL_RECORDS, *PSMBIOS_MCHI_PROTOCOL_RECORDS;\n\nC_ASSERT(sizeof(SMBIOS_MCHI_PROTOCOL_RECORDS) == 0x4);\n\n// 0-63 MCTP host interfaces\n#define SMBIOS_MCHI_TYPE_NETWORK_INTERFACE ((UCHAR)64)\n#define SMBIOS_MCHI_TYPE_OEM_DEFINED       ((UCHAR)240)\n\n#define SMBIOS_MCHI_PROTOCOL_TYPE_RESERVED_0      ((UCHAR)0)\n#define SMBIOS_MCHI_PROTOCOL_TYPE_RESERVED_1      ((UCHAR)1)\n#define SMBIOS_MCHI_PROTOCOL_TYPE_IPMI            ((UCHAR)2)\n#define SMBIOS_MCHI_PROTOCOL_TYPE_MCTP            ((UCHAR)3)\n#define SMBIOS_MCHI_PROTOCOL_TYPE_REFRESH_OVER_IP ((UCHAR)4)\n#define SMBIOS_MCHI_PROTOCOL_TYPE_OEM_DEFINED     ((UCHAR)240)\n\n//\n// TPM Device (Type 43)\n//\n\n#define SMBIOS_TPM_DEVICE_INFORMATION_TYPE ((UCHAR)43)\n\ntypedef struct _SMBIOS_TPM_DEVICE_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.6+\n    UCHAR VendorID[4];\n    UCHAR MajorSpecVersion;\n    UCHAR MinorSpecVersion;\n    ULONG FirmwareVersion1;\n    ULONG FirmwareVersion2;\n    UCHAR Description;         // string\n    ULONGLONG Characteristics; // SMBIOS_TPM_DEVICE_*\n    ULONG OEMDefined;\n} SMBIOS_TPM_DEVICE_INFORMATION, *PSMBIOS_TPM_DEVICE_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_TPM_DEVICE_INFORMATION) == 0x1F);\n\n#define SMBIOS_TPM_DEVICE_RESERVED_0                          0x0000000000000001ULL\n#define SMBIOS_TPM_DEVICE_RESERVED_1                          0x0000000000000002ULL\n#define SMBIOS_TPM_DEVICE_CONFIGURABLE_VIA_FIRMWARE_UPDATE    0x0000000000000004ULL\n#define SMBIOS_TPM_DEVICE_CONFIGURABLE_VIA_SOFTWARE_UPDATE    0x0000000000000008ULL\n#define SMBIOS_TPM_DEVICE_CONFIGURABLE_VIA_PROPRIETARY_UPDATE 0x0000000000000010ULL\n#define SMBIOS_TPM_DEIVCE_RESERVED                            0xFFFFFFFFFFFFFFE0ULL\n\n//\n// Processor Additional Information (Type 44)\n//\n\n#define SMBIOS_PROCESSOR_ADDITIONAL_INFORMATION_TYPE ((UCHAR)44)\n\ntypedef struct _SMBIOS_PROCESSOR_SPECIFIC_BLOCK\n{\n    UCHAR Length;\n    UCHAR Type;   // SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_*\n    UCHAR Data[ANYSIZE_ARRAY];\n} SMBIOS_PROCESSOR_SPECIFIC_BLOCK, *PSMBIOS_PROCESSOR_SPECIFIC_BLOCK;\n\nC_ASSERT(sizeof(SMBIOS_PROCESSOR_SPECIFIC_BLOCK) == 0x3);\n\ntypedef struct _SMBIOS_PROCESSOR_ADDITIONAL_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 2.6+\n    USHORT Handle;\n    SMBIOS_PROCESSOR_SPECIFIC_BLOCK Blocks[ANYSIZE_ARRAY];\n} SMBIOS_PROCESSOR_ADDITIONAL_INFORMATION, *PSMBIOS_PROCESSOR_ADDITIONAL_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_PROCESSOR_ADDITIONAL_INFORMATION) == 0x9);\n\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_X86         ((UCHAR)1)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_X64         ((UCHAR)2)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_IA64        ((UCHAR)3)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_ARM32       ((UCHAR)4)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_ARM64       ((UCHAR)5)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_RISCV32     ((UCHAR)6)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_RISCV64     ((UCHAR)7)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_RISCV128    ((UCHAR)8)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_LOONGARCH32 ((UCHAR)9)\n#define SMBIOS_PROCESSOR_ARCHITECTURE_TYPE_LOONGARCH64 ((UCHAR)10)\n\n//\n// Firmware Inventory Information (Type 45)\n//\n\n#define SMBIOS_FIRMWARE_INVENTORY_INFORMATION_TYPE ((UCHAR)45)\n\ntypedef struct _SMBIOS_FIRMWARE_INVENTORY_INFORMATION\n{\n    SMBIOS_HEADER Header;\n    // 3.5+\n    UCHAR ComponentName;          // string\n    UCHAR Version;                // string\n    UCHAR VersionFormat;\n    UCHAR Identifier;             // string\n    UCHAR IdentifierFormat;\n    UCHAR ReleaseDate;            // string\n    UCHAR Manufacturer;           // string\n    UCHAR LowestSupportedVersion; // string\n    ULONGLONG ImageSize;\n    USHORT Characteristics;       // SMBIOS_FIRMWARE_INVENTORY_FLAG_*\n    UCHAR State;                  // SMBIOS_FIRMWARE_INVENTORY_STATE_*\n    UCHAR AssociatedComponents;\n    USHORT AssociatedComponentHandles[ANYSIZE_ARRAY];\n} SMBIOS_FIRMWARE_INVENTORY_INFORMATION, *PSMBIOS_FIRMWARE_INVENTORY_INFORMATION;\n\nC_ASSERT(sizeof(SMBIOS_FIRMWARE_INVENTORY_INFORMATION) == 0x1A);\n\n#define SMBIOS_FIRMWARE_INVENTORY_FLAG_UPDATABLE        0x00000001UL\n#define SMBIOS_FIRMWARE_INVENTORY_FLAG_WRITE_PROTECTED  0x00000002UL\n#define SMBIOS_FIRMWARE_INVENTORY_FLAG_RESERVED         0xFFFFFFFCUL\n\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_OTHER           ((UCHAR)1)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_UNKNOWN         ((UCHAR)2)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_DISABLED        ((UCHAR)3)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_ENABLED         ((UCHAR)4)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_ABSENT          ((UCHAR)5)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_STANDBY_OFFLINE ((UCHAR)6)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_STANDBY_SPARE   ((UCHAR)7)\n#define SMBIOS_FIRMWARE_INVENTORY_STATE_OFFLINE         ((UCHAR)8)\n\n//\n// String Property (Type 46)\n//\n\n#define SMBIOS_STRING_PROPERTY_TYPE ((UCHAR)46)\n\ntypedef struct _SMBIOS_STRING_PROPERTY\n{\n    SMBIOS_HEADER Header;\n    // 3.5+\n    USHORT Identifier;   // SMBIOS_STRING_PROPERTY_ID_*\n    UCHAR String;        // string\n    USHORT ParentHandle;\n} SMBIOS_STRING_PROPERTY, *PSMBIOS_STRING_PROPERTY;\n\nC_ASSERT(sizeof(SMBIOS_STRING_PROPERTY) == 0x9);\n\n#define SMBIOS_STRING_PROPERTY_ID_RESERVED          ((UCHAR)1)\n#define SMBIOS_STRING_PROPERTY_ID_UEIF_DEVICE_PATH  ((UCHAR)2)\n\n//\n// Inactive (Type 126)\n//\n\n#define SMBIOS_INACTIVE_TYPE     ((UCHAR)126)\n\ntypedef struct _SMBIOS_INACTIVE\n{\n    SMBIOS_HEADER Header;\n} SMBIOS_INACTIVE, *PSMBIOS_INACTIVE;\n\nC_ASSERT(sizeof(SMBIOS_INACTIVE) == 0x4);\n\n//\n// End-of-Table (Type 127)\n//\n\n#define SMBIOS_END_OF_TABLE_TYPE ((UCHAR)127)\n\ntypedef struct _SMBIOS_END_OF_TABLE\n{\n    SMBIOS_HEADER Header;\n} SMBIOS_END_OF_TABLE, *PSMBIOS_END_OF_TABLE;\n\nC_ASSERT(sizeof(SMBIOS_END_OF_TABLE) == 0x4);\n\n#include <poppack.h>\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/subprocesstag.h",
    "content": "/*\n * Subprocess tag information\n *\n * This file is part of System Informer.\n */\n\n#ifndef _SUBPROCESSTAG_H\n#define _SUBPROCESSTAG_H\n\ntypedef enum _TAG_INFO_LEVEL\n{\n    eTagInfoLevelNameFromTag = 1, // TAG_INFO_NAME_FROM_TAG\n    eTagInfoLevelNamesReferencingModule, // TAG_INFO_NAMES_REFERENCING_MODULE\n    eTagInfoLevelNameTagMapping, // TAG_INFO_NAME_TAG_MAPPING\n    eTagInfoLevelMax\n} TAG_INFO_LEVEL;\n\ntypedef enum _TAG_TYPE\n{\n    eTagTypeService = 1,\n    eTagTypeMax\n} TAG_TYPE;\n\ntypedef struct _TAG_INFO_NAME_FROM_TAG_IN_PARAMS\n{\n    ULONG ProcessId;\n    ULONG ServiceTag;\n} TAG_INFO_NAME_FROM_TAG_IN_PARAMS, *PTAG_INFO_NAME_FROM_TAG_IN_PARAMS;\n\ntypedef struct _TAG_INFO_NAME_FROM_TAG_OUT_PARAMS\n{\n    ULONG TagType;\n    PCWSTR Name;\n} TAG_INFO_NAME_FROM_TAG_OUT_PARAMS, *PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS;\n\ntypedef struct _TAG_INFO_NAME_FROM_TAG\n{\n    TAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams;\n    TAG_INFO_NAME_FROM_TAG_OUT_PARAMS OutParams;\n} TAG_INFO_NAME_FROM_TAG, *PTAG_INFO_NAME_FROM_TAG;\n\ntypedef struct _TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS\n{\n    ULONG ProcessId;\n    PCWSTR ModuleName;\n} TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS, *PTAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS;\n\ntypedef struct _TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS\n{\n    ULONG TagType;\n    PCWSTR Names;\n} TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS, *PTAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS;\n\ntypedef struct _TAG_INFO_NAMES_REFERENCING_MODULE\n{\n    TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS InParams;\n    TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS OutParams;\n} TAG_INFO_NAMES_REFERENCING_MODULE, *PTAG_INFO_NAMES_REFERENCING_MODULE;\n\ntypedef struct _TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS\n{\n    ULONG ProcessId;\n} TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS, *PTAG_INFO_NAME_TAG_MAPPING_IN_PARAMS;\n\ntypedef struct _TAG_INFO_NAME_TAG_MAPPING_ELEMENT\n{\n    ULONG TagType;\n    ULONG Tag;\n    PCWSTR Name;\n    PCWSTR GroupName;\n} TAG_INFO_NAME_TAG_MAPPING_ELEMENT, *PTAG_INFO_NAME_TAG_MAPPING_ELEMENT;\n\ntypedef struct _TAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS\n{\n    ULONG Count;\n    PTAG_INFO_NAME_TAG_MAPPING_ELEMENT NameTagMappingElements;\n} TAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS, *PTAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS;\n\ntypedef struct _TAG_INFO_NAME_TAG_MAPPING\n{\n    TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS InParams;\n    PTAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS pOutParams;\n} TAG_INFO_NAME_TAG_MAPPING, *PTAG_INFO_NAME_TAG_MAPPING;\n\n_Must_inspect_result_\nNTSYSAPI\nULONG\nNTAPI\nI_QueryTagInformation(\n    _In_opt_ PCWSTR MachineName,\n    _In_ TAG_INFO_LEVEL InfoLevel,\n    _Inout_ PVOID TagInfo\n    );\n\ntypedef _Function_class_(QUERY_TAG_INFORMATION)\nULONG NTAPI QUERY_TAG_INFORMATION(\n    _In_opt_ PCWSTR MachineName,\n    _In_ TAG_INFO_LEVEL InfoLevel,\n    _Inout_ PVOID TagInfo\n    );\ntypedef QUERY_TAG_INFORMATION *PQUERY_TAG_INFORMATION;\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/usermgr.h",
    "content": "/*\n * User Manager service API definitions.\n *\n * This file is part of System Informer.\n */\n\n#ifndef _USERMGR_H\n#define _USERMGR_H\n\n// private\ntypedef struct _SESSION_USER_CONTEXT\n{\n    ULONGLONG ContextToken;\n    ULONG SessionId;\n    ULONG Reserved;\n} SESSION_USER_CONTEXT, *PSESSION_USER_CONTEXT;\n\n// private\ntypedef struct _CRED_PROV_CREDENTIAL\n{\n    ULONG Flags;\n    ULONG AuthenticationPackage;\n    ULONG Size;\n    PVOID Information;\n} CRED_PROV_CREDENTIAL, *PCRED_PROV_CREDENTIAL;\n\n#define USERMGRAPI DECLSPEC_IMPORT\n\n// Contexts\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// rev\nUSERMGRAPI\nVOID\nWINAPI\nUMgrFreeSessionUsers(\n    _In_ _Post_invalid_ PSESSION_USER_CONTEXT SessionUsers\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrEnumerateSessionUsers(\n    _Out_ PULONG Count,\n    _Outptr_ PSESSION_USER_CONTEXT *SessionUsers\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserContext(\n    _In_ HANDLE TokenHandle,\n    _Out_ PULONGLONG ContextToken\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserContextFromSid(\n    _In_ PCWSTR SidString,\n    _Out_ PULONGLONG ContextToken\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserContextFromName(\n    _In_ PCWSTR UserName,\n    _Out_ PULONGLONG ContextToken\n    );\n\n#endif\n\n// Tokens\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryDefaultAccountToken(\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQuerySessionUserToken(\n    _In_ ULONG SessionId,\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserToken(\n    _In_ ULONGLONG Context,\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserTokenFromSid(\n    _In_ PCWSTR SidString,\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrQueryUserTokenFromName(\n    _In_ PCWSTR UserName,\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrGetConstrainedUserToken(\n    _In_opt_ HANDLE InputTokenHandle,\n    _In_ ULONGLONG Context,\n    _In_opt_ PSECURITY_CAPABILITIES Capabilities,\n    _Out_ _Ret_maybenull_ PHANDLE OutputTokenHandle\n    );\n\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_TH2)\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrChangeSessionUserToken(\n    _In_ HANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrGetImpersonationTokenForContext(\n    _In_ HANDLE InputTokenHandle,\n    _In_ ULONGLONG Context,\n    _Out_ PHANDLE OutputTokenHandle\n    );\n\n#endif\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10_RS1)\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrGetSessionActiveShellUserToken(\n    _In_ ULONG SessionId,\n    _Out_ PHANDLE TokenHandle\n    );\n\n#endif\n\n// Single-session SKU\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrOpenProcessTokenForQuery(\n    _In_ ULONG ProcessId,\n    _Out_ PHANDLE TokenHandle\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrOpenProcessHandleForAccess(\n    _In_ ACCESS_MASK DesiredAccess,\n    _In_ ULONG ProcessId,\n    _Out_ PHANDLE ProcessHandle\n    );\n\n#endif\n\n// Credentials\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_10)\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrFreeUserCredentials(\n    _In_ PCRED_PROV_CREDENTIAL Credentials\n    );\n\n// rev\nUSERMGRAPI\nHRESULT\nWINAPI\nUMgrGetCachedCredentials(\n    _In_ PSID Sid,\n    _Outptr_ PCRED_PROV_CREDENTIAL *Credentials\n    );\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/phnt/winsta.h",
    "content": "/*\n * Window Station Support functions\n *\n * This file is part of System Informer.\n */\n\n#ifndef _WINSTA_H\n#define _WINSTA_H\n\n// Specifies the current server.\n#define WINSTATION_CURRENT_SERVER         ((HANDLE)NULL)\n#define WINSTATION_CURRENT_SERVER_HANDLE  ((HANDLE)NULL)\n#define WINSTATION_CURRENT_SERVER_NAME    (NULL)\n\n// Specifies the current session (SessionId)\n#define WINSTATION_CURRENT_SESSION ((ULONG)-1)\n\n// Specifies any-session (SessionId)\n#define WINSTATION_ANY_SESSION ((ULONG)-2)\n\n// Access rights\n\n#define WINSTATION_QUERY 0x00000001 // WinStationQueryInformation\n#define WINSTATION_SET 0x00000002 // WinStationSetInformation\n#define WINSTATION_RESET 0x00000004 // WinStationReset\n#define WINSTATION_VIRTUAL 0x00000008 //read/write direct data\n#define WINSTATION_SHADOW 0x00000010 // WinStationShadow\n#define WINSTATION_LOGON 0x00000020 // logon to WinStation\n#define WINSTATION_LOGOFF 0x00000040 // WinStationLogoff\n#define WINSTATION_MSG 0x00000080 // WinStationMsg\n#define WINSTATION_CONNECT 0x00000100 // WinStationConnect\n#define WINSTATION_DISCONNECT 0x00000200 // WinStationDisconnect\n#define WINSTATION_GUEST_ACCESS WINSTATION_LOGON\n\n#define WINSTATION_CURRENT_GUEST_ACCESS (WINSTATION_VIRTUAL | WINSTATION_LOGOFF)\n#define WINSTATION_USER_ACCESS (WINSTATION_GUEST_ACCESS | WINSTATION_QUERY | WINSTATION_CONNECT)\n#define WINSTATION_CURRENT_USER_ACCESS \\\n    (WINSTATION_SET | WINSTATION_RESET | WINSTATION_VIRTUAL | \\\n    WINSTATION_LOGOFF | WINSTATION_DISCONNECT)\n#define WINSTATION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | WINSTATION_QUERY | \\\n    WINSTATION_SET | WINSTATION_RESET | WINSTATION_VIRTUAL | \\\n    WINSTATION_SHADOW | WINSTATION_LOGON | WINSTATION_MSG | \\\n    WINSTATION_CONNECT | WINSTATION_DISCONNECT)\n\n#define WDPREFIX_LENGTH 12\n#define CALLBACK_LENGTH 50\n#define DLLNAME_LENGTH 32\n#define CDNAME_LENGTH 32\n#define WDNAME_LENGTH 32\n#define PDNAME_LENGTH 32\n#define DEVICENAME_LENGTH 128\n#define MODEMNAME_LENGTH DEVICENAME_LENGTH\n#define STACK_ADDRESS_LENGTH 128\n#define MAX_BR_NAME 65\n#define DIRECTORY_LENGTH 256\n#define INITIALPROGRAM_LENGTH 256\n#define USERNAME_LENGTH 20\n#define DOMAIN_LENGTH 17\n#define PASSWORD_LENGTH 14\n#define NASISPECIFICNAME_LENGTH 14\n#define NASIUSERNAME_LENGTH 47\n#define NASIPASSWORD_LENGTH 24\n#define NASISESSIONNAME_LENGTH 16\n#define NASIFILESERVER_LENGTH 47\n\n#define CLIENTDATANAME_LENGTH 7\n#define CLIENTNAME_LENGTH 20\n#define CLIENTADDRESS_LENGTH 30\n#define IMEFILENAME_LENGTH 32\n#define CLIENTLICENSE_LENGTH 32\n#define CLIENTMODEM_LENGTH 40\n#define CLIENT_PRODUCT_ID_LENGTH 32\n#define MAX_COUNTER_EXTENSIONS 2\n#define WINSTATIONNAME_LENGTH 32\n\n#define TERMSRV_TOTAL_SESSIONS 1\n#define TERMSRV_DISC_SESSIONS 2\n#define TERMSRV_RECON_SESSIONS 3\n#define TERMSRV_CURRENT_ACTIVE_SESSIONS 4\n#define TERMSRV_CURRENT_DISC_SESSIONS 5\n#define TERMSRV_PENDING_SESSIONS 6\n#define TERMSRV_SUCC_TOTAL_LOGONS 7\n#define TERMSRV_SUCC_LOCAL_LOGONS 8\n#define TERMSRV_SUCC_REMOTE_LOGONS 9\n#define TERMSRV_SUCC_SESSION0_LOGONS 10\n#define TERMSRV_CURRENT_TERMINATING_SESSIONS 11\n#define TERMSRV_CURRENT_LOGGEDON_SESSIONS 12\n\ntypedef RTL_TIME_ZONE_INFORMATION TS_TIME_ZONE_INFORMATION, *PTS_TIME_ZONE_INFORMATION;\n\ntypedef WCHAR WINSTATIONNAME[WINSTATIONNAME_LENGTH + 1];\n\n// Variable length data descriptor (not needed)\ntypedef struct _VARDATA_WIRE\n{\n    USHORT Size;\n    USHORT Offset;\n} VARDATA_WIRE, *PVARDATA_WIRE;\n\ntypedef enum _WINSTATIONSTATECLASS\n{\n    State_Active = 0,\n    State_Connected = 1,\n    State_ConnectQuery = 2,\n    State_Shadow = 3,\n    State_Disconnected = 4,\n    State_Idle = 5,\n    State_Listen = 6,\n    State_Reset = 7,\n    State_Down = 8,\n    State_Init = 9\n} WINSTATIONSTATECLASS;\n\ntypedef struct _SESSIONIDW\n{\n    union\n    {\n        ULONG SessionId;\n        ULONG LogonId;\n    };\n    WINSTATIONNAME WinStationName;\n    WINSTATIONSTATECLASS State;\n} SESSIONIDW, *PSESSIONIDW;\n\n// private\ntypedef enum _WINSTATIONINFOCLASS\n{\n    WinStationCreateData, // q: WINSTATIONCREATE\n    WinStationConfiguration, // qs: WINSTACONFIGWIRE + USERCONFIG\n    WinStationPdParams, // qs: PDPARAMS\n    WinStationWd, // q: WDCONFIG\n    WinStationPd, // q: PDCONFIG2 + PDPARAMS\n    WinStationPrinter, // qs: Not supported.\n    WinStationClient, // q: WINSTATIONCLIENT\n    WinStationModules, // q:\n    WinStationInformation, // q: WINSTATIONINFORMATION\n    WinStationTrace, // qs:\n    WinStationBeep, // s: // 10\n    WinStationEncryptionOff, // s:\n    WinStationEncryptionPerm,\n    WinStationNtSecurity, // s: (open secure desktop ctrl+alt+del)\n    WinStationUserToken, // q: WINSTATIONUSERTOKEN\n    WinStationUnused1,\n    WinStationVideoData, // q: WINSTATIONVIDEODATA\n    WinStationInitialProgram, // s: (set current process as initial program)\n    WinStationCd, // q: CDCONFIG\n    WinStationSystemTrace, // qs:\n    WinStationVirtualData, // q: // 20\n    WinStationClientData, // WINSTATIONCLIENTDATA\n    WinStationSecureDesktopEnter, // qs:\n    WinStationSecureDesktopExit, // qs:\n    WinStationLoadBalanceSessionTarget, // q: ULONG\n    WinStationLoadIndicator, // q: WINSTATIONLOADINDICATORDATA\n    WinStationShadowInfo, // qs: WINSTATIONSHADOW\n    WinStationDigProductId, // WINSTATIONPRODID\n    WinStationLockedState, // BOOL\n    WinStationRemoteAddress, // WINSTATIONREMOTEADDRESS\n    WinStationIdleTime, // ULONG // 30\n    WinStationLastReconnectType, // ULONG\n    WinStationDisallowAutoReconnect, // qs: BOOLEAN\n    WinStationMprNotifyInfo,\n    WinStationExecSrvSystemPipe, // WCHAR[48]\n    WinStationSmartCardAutoLogon, // BOOLEAN\n    WinStationIsAdminLoggedOn, // BOOLEAN\n    WinStationReconnectedFromId, // ULONG\n    WinStationEffectsPolicy, // ULONG\n    WinStationType, // ULONG\n    WinStationInformationEx, // WINSTATIONINFORMATIONEX // 40\n    WinStationValidationInfo\n} WINSTATIONINFOCLASS;\n\n/**\n * Retrieves general information used to create the terminal server session (protocol) to which the station belongs.\n */\ntypedef struct _WINSTATIONCREATE\n{\n    ULONG fEnableWinStation : 1;\n    ULONG MaxInstanceCount;\n} WINSTATIONCREATE, *PWINSTATIONCREATE;\n\ntypedef struct _WINSTACONFIGWIRE\n{\n    WCHAR Comment[61]; // The WinStation descriptive comment.\n    CHAR OEMId[4]; // Value identifying the OEM implementor of the TermService Listener to which this session (WinStation) belongs. This can be any value defined by the implementer (OEM) of the listener.\n    VARDATA_WIRE UserConfig; // VARDATA_WIRE structure defining the size and offset of the variable-length user configuration data succeeding it.\n    VARDATA_WIRE NewFields; // VARDATA_WIRE structure defining the size and offset of the variable-length new data succeeding it. This field is not used and is a placeholder for any new data, if and when added.\n} WINSTACONFIGWIRE, *PWINSTACONFIGWIRE;\n\ntypedef enum _CALLBACKCLASS\n{\n    Callback_Disable,\n    Callback_Roving,\n    Callback_Fixed\n} CALLBACKCLASS;\n\n// The SHADOWCLASS enumeration is used to indicate the shadow-related settings for a session running on a terminal server.\ntypedef enum _SHADOWCLASS\n{\n    Shadow_Disable, // Shadowing is disabled.\n    Shadow_EnableInputNotify, // Permission is asked first from the session being shadowed. The shadower is also permitted keyboard and mouse input.\n    Shadow_EnableInputNoNotify, // Permission is not asked first from the session being shadowed. The shadower is also permitted keyboard and mouse input.\n    Shadow_EnableNoInputNotify, // Permission is asked first from the session being shadowed. The shadower is not permitted keyboard and mouse input and MUST observe the shadowed session.\n    Shadow_EnableNoInputNoNotify // Permission is not asked first from the session being shadowed. The shadower is not permitted keyboard and mouse input and MUST observe the shadowed session.\n} SHADOWCLASS;\n\n// For a specific terminal server session, the USERCONFIG structure indicates the user and session configuration.\n// https://msdn.microsoft.com/en-us/library/cc248610.aspx\ntypedef struct _USERCONFIG\n{\n    ULONG fInheritAutoLogon : 1;\n    ULONG fInheritResetBroken : 1;\n    ULONG fInheritReconnectSame : 1;\n    ULONG fInheritInitialProgram : 1;\n    ULONG fInheritCallback : 1;\n    ULONG fInheritCallbackNumber : 1;\n    ULONG fInheritShadow : 1;\n    ULONG fInheritMaxSessionTime : 1;\n    ULONG fInheritMaxDisconnectionTime : 1;\n    ULONG fInheritMaxIdleTime : 1;\n    ULONG fInheritAutoClient : 1;\n    ULONG fInheritSecurity : 1;\n    ULONG fPromptForPassword : 1;\n    ULONG fResetBroken : 1;\n    ULONG fReconnectSame : 1;\n    ULONG fLogonDisabled : 1;\n    ULONG fWallPaperDisabled : 1;\n    ULONG fAutoClientDrives : 1;\n    ULONG fAutoClientLpts : 1;\n    ULONG fForceClientLptDef : 1;\n    ULONG fRequireEncryption : 1;\n    ULONG fDisableEncryption : 1;\n    ULONG fUnused1 : 1;\n    ULONG fHomeDirectoryMapRoot : 1;\n    ULONG fUseDefaultGina : 1;\n    ULONG fCursorBlinkDisabled : 1;\n    ULONG fPublishedApp : 1;\n    ULONG fHideTitleBar : 1;\n    ULONG fMaximize : 1;\n    ULONG fDisableCpm : 1;\n    ULONG fDisableCdm : 1;\n    ULONG fDisableCcm : 1;\n    ULONG fDisableLPT : 1;\n    ULONG fDisableClip : 1;\n    ULONG fDisableExe : 1;\n    ULONG fDisableCam : 1;\n    ULONG fDisableAutoReconnect : 1;\n    ULONG ColorDepth : 3;\n    ULONG fInheritColorDepth : 1;\n    ULONG fErrorInvalidProfile : 1;\n    ULONG fPasswordIsScPin : 1;\n    ULONG fDisablePNPRedir : 1;\n    WCHAR UserName[USERNAME_LENGTH + 1];\n    WCHAR Domain[DOMAIN_LENGTH + 1];\n    WCHAR Password[PASSWORD_LENGTH + 1];\n    WCHAR WorkDirectory[DIRECTORY_LENGTH + 1];\n    WCHAR InitialProgram[INITIALPROGRAM_LENGTH + 1];\n    WCHAR CallbackNumber[CALLBACK_LENGTH + 1];\n    CALLBACKCLASS Callback;\n    SHADOWCLASS Shadow;\n    ULONG MaxConnectionTime;\n    ULONG MaxDisconnectionTime;\n    ULONG MaxIdleTime;\n    ULONG KeyboardLayout;\n    BYTE MinEncryptionLevel;\n    WCHAR NWLogonServer[NASIFILESERVER_LENGTH + 1];\n    WCHAR PublishedName[MAX_BR_NAME];\n    WCHAR WFProfilePath[DIRECTORY_LENGTH + 1];\n    WCHAR WFHomeDir[DIRECTORY_LENGTH + 1];\n    WCHAR WFHomeDirDrive[4];\n} USERCONFIG, *PUSERCONFIG;\n\ntypedef enum _SDCLASS\n{\n    SdNone = 0,\n    SdConsole,\n    SdNetwork,\n    SdAsync,\n    SdOemTransport\n} SDCLASS;\n\ntypedef WCHAR DEVICENAME[DEVICENAME_LENGTH + 1];\ntypedef WCHAR MODEMNAME[MODEMNAME_LENGTH + 1];\ntypedef WCHAR NASISPECIFICNAME[NASISPECIFICNAME_LENGTH + 1];\ntypedef WCHAR NASIUSERNAME[NASIUSERNAME_LENGTH + 1];\ntypedef WCHAR NASIPASSWORD[NASIPASSWORD_LENGTH + 1];\ntypedef WCHAR NASISESIONNAME[NASISESSIONNAME_LENGTH + 1];\ntypedef WCHAR NASIFILESERVER[NASIFILESERVER_LENGTH + 1];\ntypedef WCHAR WDNAME[WDNAME_LENGTH + 1];\ntypedef WCHAR WDPREFIX[WDPREFIX_LENGTH + 1];\ntypedef WCHAR CDNAME[CDNAME_LENGTH + 1];\ntypedef WCHAR DLLNAME[DLLNAME_LENGTH + 1];\ntypedef WCHAR PDNAME[PDNAME_LENGTH + 1];\n\ntypedef struct _NETWORKCONFIG\n{\n    LONG LanAdapter;\n    DEVICENAME NetworkName;\n    ULONG Flags;\n} NETWORKCONFIG, *PNETWORKCONFIG;\n\ntypedef enum _FLOWCONTROLCLASS\n{\n    FlowControl_None,\n    FlowControl_Hardware,\n    FlowControl_Software\n} FLOWCONTROLCLASS;\n\ntypedef enum _RECEIVEFLOWCONTROLCLASS\n{\n    ReceiveFlowControl_None,\n    ReceiveFlowControl_RTS,\n    ReceiveFlowControl_DTR,\n} RECEIVEFLOWCONTROLCLASS;\n\ntypedef enum _TRANSMITFLOWCONTROLCLASS\n{\n    TransmitFlowControl_None,\n    TransmitFlowControl_CTS,\n    TransmitFlowControl_DSR,\n} TRANSMITFLOWCONTROLCLASS;\n\ntypedef enum _ASYNCCONNECTCLASS\n{\n    Connect_CTS,\n    Connect_DSR,\n    Connect_RI,\n    Connect_DCD,\n    Connect_FirstChar,\n    Connect_Perm,\n} ASYNCCONNECTCLASS;\n\ntypedef struct _FLOWCONTROLCONFIG\n{\n    ULONG fEnableSoftwareTx : 1;\n    ULONG fEnableSoftwareRx : 1;\n    ULONG fEnableDTR : 1;\n    ULONG fEnableRTS : 1;\n    CHAR XonChar;\n    CHAR XoffChar;\n    FLOWCONTROLCLASS Type;\n    RECEIVEFLOWCONTROLCLASS HardwareReceive;\n    TRANSMITFLOWCONTROLCLASS HardwareTransmit;\n} FLOWCONTROLCONFIG, *PFLOWCONTROLCONFIG;\n\ntypedef struct _CONNECTCONFIG\n{\n    ASYNCCONNECTCLASS Type;\n    ULONG fEnableBreakDisconnect : 1;\n} CONNECTCONFIG, *PCONNECTCONFIG;\n\ntypedef struct _ASYNCCONFIG\n{\n    DEVICENAME DeviceName;\n    MODEMNAME ModemName;\n    ULONG BaudRate;\n    ULONG Parity;\n    ULONG StopBits;\n    ULONG ByteSize;\n    ULONG fEnableDsrSensitivity : 1;\n    ULONG fConnectionDriver : 1;\n    FLOWCONTROLCONFIG FlowControl;\n    CONNECTCONFIG Connect;\n} ASYNCCONFIG, *PASYNCCONFIG;\n\ntypedef struct _NASICONFIG\n{\n    NASISPECIFICNAME SpecificName;\n    NASIUSERNAME UserName;\n    NASIPASSWORD PassWord;\n    NASISESIONNAME SessionName;\n    NASIFILESERVER FileServer;\n    BOOLEAN GlobalSession;\n} NASICONFIG, *PNASICONFIG;\n\ntypedef struct _OEMTDCONFIG\n{\n    LONG Adapter;\n    DEVICENAME DeviceName;\n    ULONG Flags;\n} OEMTDCONFIG, *POEMTDCONFIG;\n\n// Retrieves transport protocol driver parameters.\ntypedef struct _PDPARAMS\n{\n    SDCLASS SdClass; // Stack driver class. Indicates which one of the union's structures is valid.\n    union\n    {\n        NETWORKCONFIG Network; // Configuration of network drivers. Used if SdClass is SdNetwork.\n        ASYNCCONFIG Async; // Configuration of async (modem) driver. Used if SdClass is SdAsync.\n        NASICONFIG Nasi; // Reserved.\n        OEMTDCONFIG OemTd; // Configuration of OEM transport driver. Used if SdClass is SdOemTransport.\n    };\n} PDPARAMS, *PPDPARAMS;\n\n// The WinStation (session) driver configuration.\ntypedef struct _WDCONFIG\n{\n    WDNAME WdName; // The descriptive name of the WinStation driver.\n    DLLNAME WdDLL; // The driver's image name.\n    DLLNAME WsxDLL; // Used by the Terminal Services service to communicate with the WinStation driver.\n    ULONG WdFlag; // Driver flags.\n    ULONG WdInputBufferLength; // Length, in bytes, of the input buffer used by the driver. Defaults to 2048.\n    DLLNAME CfgDLL; // Configuration DLL used by Terminal Services administrative tools for configuring the driver.\n    WDPREFIX WdPrefix; // Used as the prefix of the WinStation name generated for the connected sessions with this WinStation driver.\n} WDCONFIG, *PWDCONFIG;\n\n// The protocol driver's software configuration.\ntypedef struct _PDCONFIG2\n{\n    PDNAME PdName;\n    SDCLASS SdClass;\n    DLLNAME PdDLL;\n    ULONG PdFlag;\n    ULONG OutBufLength;\n    ULONG OutBufCount;\n    ULONG OutBufDelay;\n    ULONG InteractiveDelay;\n    ULONG PortNumber;\n    ULONG KeepAliveTimeout;\n} PDCONFIG2, *PPDCONFIG2;\n\n// WinStationClient\ntypedef struct _WINSTATIONCLIENT\n{\n    ULONG fTextOnly : 1;\n    ULONG fDisableCtrlAltDel : 1;\n    ULONG fMouse : 1;\n    ULONG fDoubleClickDetect : 1;\n    ULONG fINetClient : 1;\n    ULONG fPromptForPassword : 1;\n    ULONG fMaximizeShell : 1;\n    ULONG fEnableWindowsKey : 1;\n    ULONG fRemoteConsoleAudio : 1;\n    ULONG fPasswordIsScPin : 1;\n    ULONG fNoAudioPlayback : 1;\n    ULONG fUsingSavedCreds : 1;\n    WCHAR ClientName[CLIENTNAME_LENGTH + 1];\n    WCHAR Domain[DOMAIN_LENGTH + 1];\n    WCHAR UserName[USERNAME_LENGTH + 1];\n    WCHAR Password[PASSWORD_LENGTH + 1];\n    WCHAR WorkDirectory[DIRECTORY_LENGTH + 1];\n    WCHAR InitialProgram[INITIALPROGRAM_LENGTH + 1];\n    ULONG SerialNumber;\n    BYTE EncryptionLevel;\n    ULONG ClientAddressFamily;\n    WCHAR ClientAddress[CLIENTADDRESS_LENGTH + 1];\n    USHORT HRes;\n    USHORT VRes;\n    USHORT ColorDepth;\n    USHORT ProtocolType;\n    ULONG KeyboardLayout;\n    ULONG KeyboardType;\n    ULONG KeyboardSubType;\n    ULONG KeyboardFunctionKey;\n    WCHAR ImeFileName[IMEFILENAME_LENGTH + 1];\n    WCHAR ClientDirectory[DIRECTORY_LENGTH + 1];\n    WCHAR ClientLicense[CLIENTLICENSE_LENGTH + 1];\n    WCHAR ClientModem[CLIENTMODEM_LENGTH + 1];\n    ULONG ClientBuildNumber;\n    ULONG ClientHardwareId;\n    USHORT ClientProductId;\n    USHORT OutBufCountHost;\n    USHORT OutBufCountClient;\n    USHORT OutBufLength;\n    WCHAR AudioDriverName[9];\n    TS_TIME_ZONE_INFORMATION ClientTimeZone;\n    ULONG ClientSessionId;\n    WCHAR ClientDigProductId[CLIENT_PRODUCT_ID_LENGTH];\n    ULONG PerformanceFlags;\n    ULONG ActiveInputLocale;\n} WINSTATIONCLIENT, *PWINSTATIONCLIENT;\n\ntypedef struct _TSHARE_COUNTERS\n{\n    ULONG Reserved;\n} TSHARE_COUNTERS, *PTSHARE_COUNTERS;\n\ntypedef struct _PROTOCOLCOUNTERS\n{\n    ULONG WdBytes;\n    ULONG WdFrames;\n    ULONG WaitForOutBuf;\n    ULONG Frames;\n    ULONG Bytes;\n    ULONG CompressedBytes;\n    ULONG CompressFlushes;\n    ULONG Errors;\n    ULONG Timeouts;\n    ULONG AsyncFramingError;\n    ULONG AsyncOverrunError;\n    ULONG AsyncOverflowError;\n    ULONG AsyncParityError;\n    ULONG TdErrors;\n    USHORT ProtocolType;\n    USHORT Length;\n    union\n    {\n        TSHARE_COUNTERS TShareCounters;\n        ULONG Reserved[100];\n    } Specific;\n} PROTOCOLCOUNTERS, *PPROTOCOLCOUNTERS;\n\ntypedef struct _THINWIRECACHE\n{\n    ULONG CacheReads;\n    ULONG CacheHits;\n} THINWIRECACHE, *PTHINWIRECACHE;\n\n#define MAX_THINWIRECACHE 4\n\ntypedef struct _RESERVED_CACHE\n{\n    THINWIRECACHE ThinWireCache[MAX_THINWIRECACHE];\n} RESERVED_CACHE, *PRESERVED_CACHE;\n\ntypedef struct _TSHARE_CACHE\n{\n    ULONG Reserved;\n} TSHARE_CACHE, *PTSHARE_CACHE;\n\ntypedef struct CACHE_STATISTICS\n{\n    USHORT ProtocolType;\n    USHORT Length;\n    union\n    {\n        RESERVED_CACHE ReservedCacheStats;\n        TSHARE_CACHE TShareCacheStats;\n        ULONG Reserved[20];\n    } Specific;\n} CACHE_STATISTICS, *PCACHE_STATISTICS;\n\ntypedef struct _PROTOCOLSTATUS\n{\n    PROTOCOLCOUNTERS Output;\n    PROTOCOLCOUNTERS Input;\n    CACHE_STATISTICS Cache;\n    ULONG AsyncSignal;\n    ULONG AsyncSignalMask;\n} PROTOCOLSTATUS, *PPROTOCOLSTATUS;\n\n// Retrieves information on the session.\ntypedef struct _WINSTATIONINFORMATION\n{\n    WINSTATIONSTATECLASS ConnectState;\n    WINSTATIONNAME WinStationName;\n    ULONG LogonId;\n    LARGE_INTEGER ConnectTime;\n    LARGE_INTEGER DisconnectTime;\n    LARGE_INTEGER LastInputTime;\n    LARGE_INTEGER LogonTime;\n    PROTOCOLSTATUS Status;\n    WCHAR Domain[DOMAIN_LENGTH + 1];\n    WCHAR UserName[USERNAME_LENGTH + 1];\n    LARGE_INTEGER CurrentTime;\n} WINSTATIONINFORMATION, *PWINSTATIONINFORMATION;\n\n// Retrieves the user's token in the session. Caller requires WINSTATION_ALL_ACCESS permission.\ntypedef struct _WINSTATIONUSERTOKEN\n{\n    HANDLE ProcessId;\n    HANDLE ThreadId;\n    HANDLE UserToken;\n} WINSTATIONUSERTOKEN, *PWINSTATIONUSERTOKEN;\n\n// Retrieves resolution and color depth of the session.\ntypedef struct _WINSTATIONVIDEODATA\n{\n    USHORT HResolution;\n    USHORT VResolution;\n    USHORT fColorDepth;\n} WINSTATIONVIDEODATA, *PWINSTATIONVIDEODATA;\n\ntypedef enum _CDCLASS\n{\n    CdNone, // No connection driver.\n    CdModem, // Connection driver is a modem.\n    CdClass_Maximum,\n} CDCLASS;\n\n// Connection driver configuration. It is used for connecting via modem to a server.\ntypedef struct _CDCONFIG\n{\n    CDCLASS CdClass; // Connection driver type.\n    CDNAME CdName; // Connection driver descriptive name.\n    DLLNAME CdDLL; // Connection driver image name.\n    ULONG CdFlag; // Connection driver flags. Connection driver specific.\n} CDCONFIG, *PCDCONFIG;\n\n// The name has the following form:\n// name syntax : xxxyyyy<null>\ntypedef CHAR CLIENTDATANAME[CLIENTDATANAME_LENGTH + 1];\ntypedef CHAR* PCLIENTDATANAME;\n\ntypedef struct _WINSTATIONCLIENTDATA\n{\n    CLIENTDATANAME DataName; // Identifies the type of data sent in this WINSTATIONCLIENTDATA structure. The definition is dependent on the caller and on the client receiving it. This MUST be a data name following a format similar to that of the CLIENTDATANAME data type.\n    BOOLEAN fUnicodeData; // TRUE indicates data is in Unicode format; FALSE otherwise.\n} WINSTATIONCLIENTDATA, *PWINSTATIONCLIENTDATA;\n\ntypedef enum _LOADFACTORTYPE\n{\n    ErrorConstraint, // An error occurred while obtaining constraint data.\n    PagedPoolConstraint, // The amount of paged pool is the constraint.\n    NonPagedPoolConstraint, // The amount of non-paged pool is the constraint.\n    AvailablePagesConstraint, // The amount of available pages is the constraint.\n    SystemPtesConstraint, // The number of system page table entries (PTEs) is the constraint.\n    CPUConstraint // CPU usage is the constraint.\n} LOADFACTORTYPE;\n\n// The WINSTATIONLOADINDICATORDATA structure defines data used for the load balancing of a server.\ntypedef struct _WINSTATIONLOADINDICATORDATA\n{\n    ULONG RemainingSessionCapacity; // The estimated number of additional sessions that can be supported given the CPU constraint.\n    LOADFACTORTYPE LoadFactor; // Indicates the most constrained current resource.\n    ULONG TotalSessions; // The total number of sessions.\n    ULONG DisconnectedSessions; // The number of disconnected sessions.\n    LARGE_INTEGER IdleCPU; // This is always set to 0.\n    LARGE_INTEGER TotalCPU; // This is always set to 0.\n    ULONG RawSessionCapacity; // The raw number of sessions capacity.\n    ULONG reserved[9]; // Reserved.\n} WINSTATIONLOADINDICATORDATA, *PWINSTATIONLOADINDICATORDATA;\n\ntypedef enum _SHADOWSTATECLASS\n{\n    State_NoShadow, // No shadow operations are currently being performed on this session.\n    State_Shadowing, // The session is shadowing a different session. The current session is referred to as a shadow client.\n    State_Shadowed // The session is being shadowed by a different session. The current session is referred to as a shadow target.\n} SHADOWSTATECLASS;\n\n#define PROTOCOL_CONSOLE 0\n#define PROTOCOL_OTHERS 1\n#define PROTOCOL_RDP 2\n\n// Retrieves the current shadow state of a session.\ntypedef struct _WINSTATIONSHADOW\n{\n    SHADOWSTATECLASS ShadowState; // Specifies the current state of shadowing.\n    SHADOWCLASS ShadowClass; // Specifies the type of shadowing.\n    ULONG SessionId; // Specifies the session ID of the session.\n    ULONG ProtocolType; // Specifies the type of protocol on the session. Can be one of PROTOCOL_* values.\n} WINSTATIONSHADOW, *PWINSTATIONSHADOW;\n\n// Retrieves the client product ID and current product ID of the session.\ntypedef struct _WINSTATIONPRODID\n{\n    WCHAR DigProductId[CLIENT_PRODUCT_ID_LENGTH];\n    WCHAR ClientDigProductId[CLIENT_PRODUCT_ID_LENGTH];\n    WCHAR OuterMostDigProductId[CLIENT_PRODUCT_ID_LENGTH];\n    ULONG CurrentSessionId;\n    ULONG ClientSessionId;\n    ULONG OuterMostSessionId;\n} WINSTATIONPRODID, *PWINSTATIONPRODID;\n\n// Retrieves the remote IP address of the terminal server client in the session.\ntypedef struct _WINSTATIONREMOTEADDRESS\n{\n    USHORT sin_family;\n    union\n    {\n        struct\n        {\n            USHORT sin_port;\n            ULONG sin_addr;\n            UCHAR sin_zero[8];\n        } ipv4;\n        struct\n        {\n            USHORT sin6_port;\n            ULONG sin6_flowinfo;\n            USHORT sin6_addr[8];\n            ULONG sin6_scope_id;\n        } ipv6;\n    };\n} WINSTATIONREMOTEADDRESS, *PWINSTATIONREMOTEADDRESS;\n\n// WinStationInformationEx\n\n// private\ntypedef struct _WINSTATIONINFORMATIONEX_LEVEL1\n{\n    ULONG SessionId;\n    WINSTATIONSTATECLASS SessionState;\n    LONG SessionFlags;\n    WINSTATIONNAME WinStationName;\n    WCHAR UserName[USERNAME_LENGTH + 1];\n    WCHAR DomainName[DOMAIN_LENGTH + 1];\n    LARGE_INTEGER LogonTime;\n    LARGE_INTEGER ConnectTime;\n    LARGE_INTEGER DisconnectTime;\n    LARGE_INTEGER LastInputTime;\n    LARGE_INTEGER CurrentTime;\n    PROTOCOLSTATUS ProtocolStatus;\n} WINSTATIONINFORMATIONEX_LEVEL1, *PWINSTATIONINFORMATIONEX_LEVEL1;\n\n// private\ntypedef struct _WINSTATIONINFORMATIONEX_LEVEL2\n{\n    ULONG SessionId;\n    WINSTATIONSTATECLASS SessionState;\n    LONG SessionFlags;\n    WINSTATIONNAME WinStationName;\n    WCHAR SamCompatibleUserName[USERNAME_LENGTH + 1];\n    WCHAR SamCompatibleDomainName[DOMAIN_LENGTH + 1];\n    LARGE_INTEGER LogonTime;\n    LARGE_INTEGER ConnectTime;\n    LARGE_INTEGER DisconnectTime;\n    LARGE_INTEGER LastInputTime;\n    LARGE_INTEGER CurrentTime;\n    PROTOCOLSTATUS ProtocolStatus;\n    WCHAR UserName[257];\n    WCHAR DomainName[256];\n} WINSTATIONINFORMATIONEX_LEVEL2, *PWINSTATIONINFORMATIONEX_LEVEL2;\n\n// private\ntypedef union _WINSTATIONINFORMATIONEX_LEVEL\n{\n    WINSTATIONINFORMATIONEX_LEVEL1 WinStationInfoExLevel1;\n    WINSTATIONINFORMATIONEX_LEVEL2 WinStationInfoExLevel2;\n} WINSTATIONINFORMATIONEX_LEVEL, *PWINSTATIONINFORMATIONEX_LEVEL;\n\n// private\ntypedef struct _WINSTATIONINFORMATIONEX\n{\n    ULONG Level;\n    WINSTATIONINFORMATIONEX_LEVEL Data;\n} WINSTATIONINFORMATIONEX, *PWINSTATIONINFORMATIONEX;\n\n#define TS_PROCESS_INFO_MAGIC_NT4 0x23495452\n\ntypedef struct _TS_PROCESS_INFORMATION_NT4\n{\n    ULONG MagicNumber;\n    ULONG LogonId;\n    PVOID ProcessSid;\n    ULONG Pad;\n} TS_PROCESS_INFORMATION_NT4, *PTS_PROCESS_INFORMATION_NT4;\n\n#define SIZEOF_TS4_SYSTEM_THREAD_INFORMATION 64\n#define SIZEOF_TS4_SYSTEM_PROCESS_INFORMATION 136\n\ntypedef struct _TS_SYS_PROCESS_INFORMATION\n{\n    ULONG NextEntryOffset;\n    ULONG NumberOfThreads;\n    LARGE_INTEGER SpareLi1;\n    LARGE_INTEGER SpareLi2;\n    LARGE_INTEGER CycleTime;\n    LARGE_INTEGER CreateTime;\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER KernelTime;\n    UNICODE_STRING ImageName;\n    KPRIORITY BasePriority;\n    ULONG UniqueProcessId;\n    ULONG InheritedFromUniqueProcessId;\n    ULONG HandleCount;\n    ULONG SessionId;\n    ULONG UniqueProcessKey;\n    SIZE_T PeakVirtualSize;\n    SIZE_T VirtualSize;\n    ULONG PageFaultCount;\n    ULONG PeakWorkingSetSize;\n    ULONG WorkingSetSize;\n    SIZE_T QuotaPeakPagedPoolUsage;\n    SIZE_T QuotaPagedPoolUsage;\n    SIZE_T QuotaPeakNonPagedPoolUsage;\n    SIZE_T QuotaNonPagedPoolUsage;\n    SIZE_T PagefileUsage;\n    SIZE_T PeakPagefileUsage;\n    SIZE_T PrivatePageCount;\n} TS_SYS_PROCESS_INFORMATION, *PTS_SYS_PROCESS_INFORMATION;\n\ntypedef struct _TS_ALL_PROCESSES_INFO\n{\n    PTS_SYS_PROCESS_INFORMATION pTsProcessInfo;\n    ULONG SizeOfSid;\n    PSID pSid;\n} TS_ALL_PROCESSES_INFO, *PTS_ALL_PROCESSES_INFO;\n\ntypedef struct _TS_COUNTER_HEADER\n{\n    DWORD dwCounterID;\n    BOOLEAN bResult;\n} TS_COUNTER_HEADER, *PTS_COUNTER_HEADER;\n\ntypedef struct _TS_COUNTER\n{\n    TS_COUNTER_HEADER CounterHead;\n    DWORD dwValue;\n    LARGE_INTEGER StartTime;\n} TS_COUNTER, *PTS_COUNTER;\n\n// Flags for WinStationShutdownSystem\n#define WSD_LOGOFF 0x1\n#define WSD_SHUTDOWN 0x2\n#define WSD_REBOOT 0x4\n#define WSD_POWEROFF 0x8\n\n// Flags for WinStationWaitSystemEvent\n#define WEVENT_NONE 0x0\n#define WEVENT_CREATE 0x1\n#define WEVENT_DELETE 0x2\n#define WEVENT_RENAME 0x4\n#define WEVENT_CONNECT 0x8\n#define WEVENT_DISCONNECT 0x10\n#define WEVENT_LOGON 0x20\n#define WEVENT_LOGOFF 0x40\n#define WEVENT_STATECHANGE 0x80\n#define WEVENT_LICENSE 0x100\n#define WEVENT_ALL 0x7fffffff\n#define WEVENT_FLUSH 0x80000000\n\n// Hotkey modifiers for WinStationShadow\n#define KBDSHIFT 0x1\n#define KBDCTRL 0x2\n#define KBDALT 0x4\n\n// begin_rev\n// Flags for WinStationRegisterConsoleNotification\n#define WNOTIFY_ALL_SESSIONS 0x1\n// end_rev\n\n// In the functions below, memory returned can be freed using LocalFree. NULL can be specified for\n// server handles to indicate the local server. -1 can be specified for session IDs to indicate the\n// current session ID.\n\n#define LOGONID_CURRENT (-1)\n#define SERVERNAME_CURRENT ((PWSTR)NULL)\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationFreeMemory(\n    _In_ PVOID Buffer\n    );\n\n// rev\nNTSYSAPI\nHANDLE\nNTAPI\nWinStationOpenServerW(\n    _In_opt_ PCWSTR ServerName\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationCloseServer(\n    _In_ HANDLE ServerHandle\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationServerPing(\n    _In_opt_ HANDLE ServerHandle\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetTermSrvCountersValue(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG Count,\n    _Inout_ PTS_COUNTER Counters // set counter IDs before calling\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationShutdownSystem(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG ShutdownFlags // WSD_*\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationWaitSystemEvent(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG EventMask, // WEVENT_*\n    _Out_ PULONG EventFlags\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationRegisterConsoleNotification(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ HWND WindowHandle,\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationUnRegisterConsoleNotification(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ HWND WindowHandle\n    );\n\n// Sessions\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationEnumerateW(\n    _In_opt_ HANDLE ServerHandle,\n    _Out_ PSESSIONIDW *SessionIds,\n    _Out_ PULONG Count\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationQueryInformationW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ WINSTATIONINFOCLASS WinStationInformationClass,\n    _Out_writes_bytes_(WinStationInformationLength) PVOID pWinStationInformation,\n    _In_ ULONG WinStationInformationLength,\n    _Out_ PULONG pReturnLength\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationSetInformationW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ WINSTATIONINFOCLASS WinStationInformationClass,\n    _In_reads_bytes_(WinStationInformationLength) PVOID pWinStationInformation,\n    _In_ ULONG WinStationInformationLength\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationQueryCurrentSessionInformation(\n    _In_ WINSTATIONINFOCLASS WinStationInformationClass,\n    _In_reads_bytes_(WinStationInformationLength) PVOID pWinStationInformation,\n    _In_ ULONG WinStationInformationLength\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationNameFromLogonIdW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _Out_writes_(WINSTATIONNAME_LENGTH + 1) PWSTR pWinStationName\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nLogonIdFromWinStationNameW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ PCWSTR pWinStationName,\n    _Out_ PULONG SessionId\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationSendMessageW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ PCWSTR Title,\n    _In_ ULONG TitleLength,\n    _In_ PCWSTR Message,\n    _In_ ULONG MessageLength,\n    _In_ ULONG Style,\n    _In_ ULONG Timeout,\n    _Out_ PULONG Response,\n    _In_ BOOLEAN DoNotWait\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationConnectW(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ ULONG TargetSessionId,\n    _In_opt_ PCWSTR pPassword,\n    _In_ BOOLEAN bWait\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationDisconnect(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ BOOLEAN bWait\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationReset(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ BOOLEAN bWait\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationShadow(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ PCWSTR TargetServerName,\n    _In_ ULONG TargetSessionId,\n    _In_ UCHAR HotKeyVk,\n    _In_ USHORT HotkeyModifiers // KBD*\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationShadowStop(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ BOOLEAN bWait // ignored\n    );\n\n// Processes\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationEnumerateProcesses(\n    _In_opt_ HANDLE ServerHandle,\n    _Out_ PVOID *Processes\n    );\n\n#define WINSTATION_PROCESS_LEVEL 0\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetAllProcesses(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG Level,\n    _Out_ PULONG NumberOfProcesses,\n    _Out_ PTS_ALL_PROCESSES_INFO *Processes\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationFreeGAPMemory(\n    _In_ ULONG Level,\n    _In_ PTS_ALL_PROCESSES_INFO Processes,\n    _In_ ULONG NumberOfProcesses\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationTerminateProcess(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG ProcessId,\n    _In_ ULONG ExitCode\n    );\n\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetProcessSid(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG ProcessId,\n    _In_ FILETIME ProcessStartTime,\n    _Out_ PVOID pProcessUserSid,\n    _Inout_ PULONG dwSidSize\n    );\n\n// Services isolation\n\n#if (PHNT_VERSION >= PHNT_WINDOWS_VISTA)\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationSwitchToServicesSession(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationRevertFromServicesSession(\n    VOID\n    );\n\n#endif\n\n// Misc.\nNTSYSAPI\nBOOLEAN\nNTAPI\n_WinStationWaitForConnect(\n    VOID\n    );\n\n// rev\nNTSYSAPI\nHANDLE\nNTAPI\nWinStationVirtualOpen(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ PCSTR Name\n    );\n\n// rev\nNTSYSAPI\nHANDLE\nNTAPI\nWinStationVirtualOpenEx(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ PCSTR Name,\n    _In_ ULONG Flags\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationIsCurrentSessionRemoteable(\n    _Out_ PBOOLEAN IsRemoteable\n    );\n\nEXTERN_C DECLSPEC_SELECTANY CONST GUID PROPERTY_TYPE_GET_MONITOR_CONFIG = { 0x865D5285, 0xF70A, 0x4ECF, { 0x8B, 0x28, 0x51, 0x2F, 0xE0, 0xAA, 0x2D, 0x53 } };\nEXTERN_C DECLSPEC_SELECTANY CONST GUID PROPERTY_TYPE_CORRELATIONID_GUID = { 0x9A363F8E, 0x1902, 0x40DA, { 0xA2, 0xCC, 0x56, 0x4F, 0x09, 0x40, 0xAD, 0xE3 } };\n\ntypedef struct _TS_PROPERTY_INFORMATION\n{\n    ULONG Length;\n    PVOID Buffer;\n} TS_PROPERTY_INFORMATION, *PTS_PROPERTY_INFORMATION;\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetConnectionProperty(\n    _In_ ULONG SessionId,\n    _In_ PCGUID PropertyType,\n    _Out_ PTS_PROPERTY_INFORMATION PropertyBuffer\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationFreePropertyValue(\n    _In_ PVOID PropertyBuffer\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationIsSessionRemoteable(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _Out_ PBOOLEAN IsRemote\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationSetAutologonPassword(\n    _In_ PCSTR KeyName,\n    _In_ PCSTR Password\n    );\n\ntypedef enum _SessionType\n{\n    SESSIONTYPE_UNKNOWN = 0,\n    SESSIONTYPE_SERVICES,\n    SESSIONTYPE_LISTENER,\n    SESSIONTYPE_REGULARDESKTOP,\n    SESSIONTYPE_ALTERNATESHELL,\n    SESSIONTYPE_REMOTEAPP,\n    SESSIONTYPE_MEDIACENTEREXT\n} SESSIONTYPE;\n\n// rev\ntypedef struct _TS_USER_SESSION\n{\n    ULONG Version;\n    ULONG SessionId;\n    ULONG Unknown;\n    SESSIONTYPE State;\n    ULONG field5;\n} TS_USER_SESSION, *PTS_USER_SESSION;\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetAllUserSessions(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ PSID Sid,\n    _Out_ PVOID* Processes, // LocalFree\n    _Out_ PULONG NumberOfProcesses\n    );\n\n// rev\ntypedef struct _TS_SESSION_VIRTUAL_ADDRESS\n{\n  USHORT AddressFamily;\n  USHORT AddressLength;\n  BYTE Address[20];\n} TS_SESSION_VIRTUAL_ADDRESS, *PTS_SESSION_VIRTUAL_ADDRESS;\ntypedef USHORT ADDRESS_FAMILY;\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationQuerySessionVirtualIP(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _In_ ADDRESS_FAMILY Family,\n    _Out_ TS_SESSION_VIRTUAL_ADDRESS* SessionVirtualIP\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetDeviceId(\n    _In_opt_ HANDLE ServerHandle,\n    _In_ ULONG SessionId,\n    _Out_ PCHAR* Buffer, // CHAR DeviceId[MAX_PATH + 1];\n    _In_ SIZE_T BufferLength\n    );\n\n// rev\nNTSYSAPI\nBOOLEAN\nNTAPI\nWinStationGetLoggedOnCount(\n    _Out_ PULONG LoggedOnUserCount,\n    _Out_ PULONG LoggedOnDeviceCount\n    );\n\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/Memory.c",
    "content": "/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Memory Management\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include <phnt/phnt_windows.h>\n#include <phnt/phnt.h>\n\n#include \"Memory.h\"\n\nstatic HANDLE _threadscan_memory_heap = NULL;\n\nstatic\n_Ret_notnull_\nHANDLE\nthreadscan_memory_init(VOID)\n{\n    HANDLE hHeap;\n\n    /* Initialize private heap */\n    hHeap = RtlCreateHeap(HEAP_NO_SERIALIZE | HEAP_GROWABLE, NULL, 0, 0, NULL, NULL);\n    if (hHeap == NULL)\n    {\n        //DETOUR_TRACE(\"RtlCreateHeap failed, fallback to use process default heap\\n\");\n        hHeap = NtCurrentPeb()->ProcessHeap;\n    }\n\n    return hHeap;\n}\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\nthreadscan_memory_alloc(\n    _In_ SIZE_T Size)\n{\n    /*\n     * threadscan_memory_alloc is called BEFORE any other threadscan_memory_* functions,\n     * and only one thread that owning pending transaction could reach here,\n     * so it's safe to do the initialzation here and not use a lock.\n     */\n    if (_threadscan_memory_heap == NULL)\n    {\n        _threadscan_memory_heap = threadscan_memory_init();\n    }\n\n    return RtlAllocateHeap(_threadscan_memory_heap, 0, Size);\n}\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\nthreadscan_memory_realloc(\n    _Frees_ptr_opt_ PVOID BaseAddress,\n    _In_ SIZE_T Size)\n{\n    return RtlReAllocateHeap(_threadscan_memory_heap, 0, BaseAddress, Size);\n}\n\nBOOL\nthreadscan_memory_free(\n    _Frees_ptr_ PVOID BaseAddress)\n{\n    return RtlFreeHeap(_threadscan_memory_heap, 0, BaseAddress);\n}\n\nBOOL\nthreadscan_memory_initialize(VOID)\n{\n    if (_threadscan_memory_heap == NULL)\n    {\n        _threadscan_memory_heap = threadscan_memory_init();\n        return _threadscan_memory_heap != NULL;\n    }\n\n    return FALSE;\n}\n\nBOOL\nthreadscan_memory_uninitialize(VOID)\n{\n    if (_threadscan_memory_heap != NULL && _threadscan_memory_heap != NtCurrentPeb()->ProcessHeap)\n    {\n        _threadscan_memory_heap = RtlDestroyHeap(_threadscan_memory_heap);\n        return _threadscan_memory_heap == NULL;\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/Memory.h",
    "content": "#pragma once\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\nthreadscan_memory_alloc(\n    _In_ SIZE_T Size);\n\n_Must_inspect_result_\n_Ret_maybenull_\n_Post_writable_byte_size_(Size)\nPVOID\nthreadscan_memory_realloc(\n    _Frees_ptr_opt_ PVOID BaseAddress,\n    _In_ SIZE_T Size);\n\nBOOL\nthreadscan_memory_free(\n    _Frees_ptr_ PVOID BaseAddress);\n\nBOOL\nthreadscan_memory_initialize(VOID);\n\nBOOL\nthreadscan_memory_uninitialize(VOID);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/Thread.c",
    "content": "/*\n * KNSoft.SlimDetours (https://github.com/KNSoft/KNSoft.SlimDetours) Thread management\n * Copyright (c) KNSoft.org (https://github.com/KNSoft). All rights reserved.\n * Licensed under the MIT license.\n */\n\n#include <phnt/phnt_windows.h>\n#include <phnt/phnt.h>\n\n#include \"Thread.h\"\n\n#include \"Memory.h\"\n\n#define THREAD_ACCESS (THREAD_QUERY_LIMITED_INFORMATION | THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT)\n\nstatic HANDLE s_Handles[32];\n\nNTSTATUS\nthreadscan_thread_suspend(\n    _Outptr_result_maybenull_ PHANDLE* SuspendedHandles,\n    _Out_ PULONG SuspendedHandleCount,\n    _In_ ULONG ThreadIdToSkip)\n{\n    NTSTATUS Status;\n    PHANDLE Buffer = s_Handles;\n    ULONG BufferCapacity = ARRAYSIZE(s_Handles);\n    ULONG SuspendedCount = 0;\n    HANDLE CurrentTID = (HANDLE)(ULONG_PTR)NtCurrentThreadId();\n    BOOL ClosePrevThread = FALSE;\n    HANDLE ThreadHandle = NULL;\n\n    while (TRUE)\n    {\n        HANDLE NextThreadHandle;\n        Status = NtGetNextThread(NtCurrentProcess(), ThreadHandle, THREAD_ACCESS, 0, 0, &NextThreadHandle);\n        if (ClosePrevThread)\n        {\n            NtClose(ThreadHandle);\n        }\n\n        if (!NT_SUCCESS(Status))\n        {\n            if (Status == STATUS_NO_MORE_ENTRIES)\n            {\n                Status = STATUS_SUCCESS;\n            }\n            break;\n        }\n\n        ThreadHandle = NextThreadHandle;\n        ClosePrevThread = TRUE;\n\n        THREAD_BASIC_INFORMATION BasicInformation;\n        if (!NT_SUCCESS(NtQueryInformationThread(ThreadHandle,\n            ThreadBasicInformation,\n            &BasicInformation,\n            sizeof(BasicInformation),\n            NULL)))\n        {\n            continue;\n        }\n\n        if (BasicInformation.ClientId.UniqueThread == CurrentTID ||\n            BasicInformation.ClientId.UniqueThread == (HANDLE)(ULONG_PTR)ThreadIdToSkip)\n        {\n            continue;\n        }\n\n        if (!NT_SUCCESS(NtSuspendThread(ThreadHandle, NULL)))\n        {\n            continue;\n        }\n\n        ClosePrevThread = FALSE;\n\n        Status = STATUS_SUCCESS;\n        if (SuspendedCount >= BufferCapacity)\n        {\n            BufferCapacity *= 2;\n\n            PHANDLE p;\n            if (Buffer == s_Handles)\n            {\n                p = (PHANDLE)threadscan_memory_alloc(BufferCapacity * sizeof(HANDLE));\n                if (p)\n                {\n                    RtlCopyMemory(p, Buffer, SuspendedCount * sizeof(HANDLE));\n                }\n            } else\n            {\n                p = (PHANDLE)threadscan_memory_realloc(Buffer, BufferCapacity * sizeof(HANDLE));\n            }\n\n            if (p)\n            {\n                Buffer = p;\n            }\n            else\n            {\n                Status = STATUS_NO_MEMORY;\n            }\n        }\n\n        if (!NT_SUCCESS(Status))\n        {\n            NtResumeThread(ThreadHandle, NULL);\n            NtClose(ThreadHandle);\n            break;\n        }\n\n        // Perform a synchronous operation to make sure the thread really is suspended.\n        // https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743\n        CONTEXT cxt;\n        cxt.ContextFlags = CONTEXT_CONTROL;\n        NtGetContextThread(ThreadHandle, &cxt);\n\n        Buffer[SuspendedCount++] = ThreadHandle;\n    }\n\n    if (!NT_SUCCESS(Status))\n    {\n        for (UINT i = 0; i < SuspendedCount; ++i)\n        {\n            NtResumeThread(Buffer[i], NULL);\n            NtClose(Buffer[i]);\n        }\n\n        if (Buffer != s_Handles)\n        {\n            threadscan_memory_free(Buffer);\n        }\n\n        Buffer = NULL;\n        SuspendedCount = 0;\n    }\n\n    *SuspendedHandles = Buffer;\n    *SuspendedHandleCount = SuspendedCount;\n\n    return Status;\n}\n\nVOID\nthreadscan_thread_resume(\n    _In_reads_(SuspendedHandleCount) PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount)\n{\n    ULONG i;\n\n    for (i = 0; i < SuspendedHandleCount; i++)\n    {\n        NtResumeThread(SuspendedHandles[i], NULL);\n    }\n}\n\nVOID\nthreadscan_thread_free(\n    _In_reads_(SuspendedHandleCount) _Frees_ptr_ PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount)\n{\n    ULONG i;\n\n    for (i = 0; i < SuspendedHandleCount; i++)\n    {\n        NtClose(SuspendedHandles[i]);\n    }\n\n    if (SuspendedHandles != s_Handles)\n    {\n        threadscan_memory_free(SuspendedHandles);\n    }\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/Thread.h",
    "content": "#pragma once\n\nNTSTATUS\nthreadscan_thread_suspend(\n    _Outptr_result_maybenull_ PHANDLE* SuspendedHandles,\n    _Out_ PULONG SuspendedHandleCount,\n    _In_ ULONG ThreadIdToSkip);\n\nVOID\nthreadscan_thread_resume(\n    _In_reads_(SuspendedHandleCount) PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount);\n\nVOID\nthreadscan_thread_free(\n    _In_reads_(SuspendedHandleCount) _Frees_ptr_ PHANDLE SuspendedHandles,\n    _In_ ULONG SuspendedHandleCount);\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/ThreadsCallStackIterate.c",
    "content": "#include <phnt/phnt_windows.h>\n#include <phnt/phnt.h>\n\n#include \"ThreadsCallStackIterate.h\"\n\n#include \"Thread.h\"\n#include \"Memory.h\"\n\n#if defined(_X86_)\n#define CONTEXT_PC Eip\n#define CONTEXT_SP Esp\n#elif defined(_AMD64_)\n#define CONTEXT_PC Rip\n#define CONTEXT_SP Rsp\n#elif defined(_ARM64_)\n#define CONTEXT_PC Pc\n#define CONTEXT_SP Sp\n#endif\n\n#if defined(_AMD64_) || defined(_ARM64_)\n\nstatic BOOL ThreadCallStackIterate(\n    HANDLE threadHandle,\n    ThreadCallStackIterCallback callback,\n    void* userData,\n    BOOL* abort) {\n    CONTEXT context;\n    context.ContextFlags = CONTEXT_ALL;\n    NTSTATUS status = NtGetContextThread(threadHandle, &context);\n    if (!NT_SUCCESS(status)) {\n        // Continue to the next thread if we can't get the context.\n        return TRUE;\n    }\n\n    if (*abort || !callback(threadHandle, (void*)context.CONTEXT_PC, userData)) {\n        // If aborted or the callback returns FALSE, we stop iterating.\n        return FALSE;\n    }\n\n    THREAD_BASIC_INFORMATION threadInfo;\n    if (!NT_SUCCESS(NtQueryInformationThread(\n        threadHandle,\n        ThreadBasicInformation,\n        &threadInfo,\n        sizeof(threadInfo),\n        NULL\n    ))) {\n        // Continue to the next thread if we can't get the thread information.\n        return TRUE;\n    }\n\n    DWORD64 stackBase = (DWORD64)threadInfo.TebBaseAddress->NtTib.StackBase;\n    DWORD64 stackLimit = (DWORD64)threadInfo.TebBaseAddress->NtTib.StackLimit;\n\n    DWORD64 lastStackLimit = stackLimit;\n\n    BOOL firstIteration = TRUE;\n\n    // References:\n    // http://www.nynaeve.net/Code/StackWalk64.cpp\n    // https://blog.s-schoener.com/2025-01-24-stack-walking-generated-code/\n    // Implementation references:\n    // https://chromium.googlesource.com/chromium/src/base/+/refs/heads/main/profiler/native_unwinder_win.cc\n    // https://chromium.googlesource.com/chromium/src/base/+/refs/heads/main/profiler/win32_stack_frame_unwinder.cc\n    // https://github.com/dotnet/runtime/blob/15bcd62bb240635f8f5ce4b7a4b3a07bb65e5ac3/src/coreclr/vm/stackwalk.cpp#L470\n    while (TRUE) {\n        DWORD64 imageBase;\n        RUNTIME_FUNCTION* function = RtlLookupFunctionEntry(context.CONTEXT_PC, &imageBase, NULL);\n\n        DWORD64 prevPc = context.CONTEXT_PC;\n        DWORD64 prevSp = context.CONTEXT_SP;\n\n        // If there is no function entry, then this is a leaf function.\n        if (!function) {\n            if (!firstIteration) {\n                // In theory we shouldn't get here, as it means we've\n                // encountered a function without unwind information below the\n                // top of the stack, which is forbidden by the Microsoft x64\n                // calling convention.\n                break;\n            }\n\n#if defined(_AMD64_)\n            // For X64, return address is at RSP.\n            context.Rip = *(DWORD64*)context.Rsp;\n            context.Rsp += sizeof(DWORD64);\n#elif defined(_ARM64_)\n            // For leaf function on Windows ARM64, return address is at LR(X30).\n            // Add CONTEXT_UNWOUND_TO_CALL flag to avoid unwind ambiguity for\n            // tailcall on ARM64, because padding after tailcall is not\n            // guaranteed.\n            context.Pc = context.Lr;\n            context.ContextFlags |= CONTEXT_UNWOUND_TO_CALL;\n#else\n#error Unsupported Windows 64-bit Architecture\n#endif\n        } else {\n            void* handlerData;\n            DWORD64 establisherFrame;\n            RtlVirtualUnwind(UNW_FLAG_NHANDLER, imageBase, context.CONTEXT_PC, function, &context, &handlerData, &establisherFrame, NULL);\n        }\n\n        if (context.CONTEXT_PC == 0) {\n            break;\n        }\n\n        if (context.CONTEXT_PC == prevPc && context.CONTEXT_SP == prevSp) {\n            // We are likely in a loop, stop iterating.\n            break;\n        }\n\n        // Check if the stack pointer is within the stack limits.\n        if (context.CONTEXT_SP < lastStackLimit ||\n            context.CONTEXT_SP > stackBase - sizeof(DWORD64)) {\n            // Stack pointer is out of bounds, stop iterating.\n            break;\n        }\n\n        if (*abort || !callback(threadHandle, (void*)context.CONTEXT_PC, userData)) {\n            // If aborted or the callback returns FALSE, we stop iterating.\n            return FALSE;\n        }\n\n#if defined(_ARM64_)\n        // The stack pointer can be re-used by ARM64 leaf frames. Example call\n        // stack excerpt:\n        //\n        // 0:000> k\n        // ...\n        // 2c 0000007c`1792ed30 00007ff8`e0108014     ntdll!KiUserCallbackDispatcherReturn\n        // 2d 0000007c`1792eda0 00007ff8`e2c6bd48     win32u!NtUserPeekMessage+0x4\n        // 2e 0000007c`1792eda0 00007ff8`e2c64410     user32!_PeekMessage+0x30\n        // 2f 0000007c`1792ee10 00007ff8`e2c648c0     user32!DialogBox2+0x1c8\n        // ...\n        lastStackLimit = context.CONTEXT_SP;\n#else\n        // For x64, the stack pointer should never be re-used.\n        lastStackLimit = context.CONTEXT_SP + sizeof(DWORD64);\n#endif\n\n        firstIteration = FALSE;\n    }\n\n    return TRUE;\n}\n\ntypedef struct {\n    ThreadCallStackIterCallback callback;\n    void* userData;\n    BOOL abort;\n    HANDLE eventWorkerReady;\n    HANDLE eventWorkerStart;\n    HANDLE eventWorkerDone;\n    HANDLE* suspendedHandles;\n    ULONG suspendedHandleCount;\n} WorkerThreadParam;\n\nstatic DWORD CALLBACK WorkerThread(LPVOID lpParameter) {\n    WorkerThreadParam* param = (WorkerThreadParam*)lpParameter;\n\n    ThreadCallStackIterCallback callback = param->callback;\n    void* userData = param->userData;\n    BOOL* abort = &param->abort;\n    HANDLE eventWorkerReady = param->eventWorkerReady;\n    HANDLE eventWorkerStart = param->eventWorkerStart;\n    HANDLE eventWorkerDone = param->eventWorkerDone;\n\n    SetEvent(eventWorkerReady);\n    WaitForSingleObject(eventWorkerStart, INFINITE);\n\n    HANDLE* suspendedHandles = param->suspendedHandles;\n    ULONG suspendedHandleCount = param->suspendedHandleCount;\n\n    for (ULONG i = 0; i < suspendedHandleCount; i++) {\n        if (!ThreadCallStackIterate(suspendedHandles[i], callback, userData, abort)) {\n            break;\n        }\n    }\n\n    SetEvent(eventWorkerDone);\n\n    return 0;\n}\n\nstatic BOOL ThreadsCallStackIterateImpl(\n    ThreadCallStackIterCallback callback,\n    void* userData,\n    DWORD timeout) {\n    BOOL result = FALSE;\n    HANDLE workerThread = NULL;\n    WorkerThreadParam workerThreadParam = {\n        .callback = callback,\n        .userData = userData,\n        .abort = FALSE,\n        .eventWorkerReady = CreateEvent(NULL, FALSE, FALSE, NULL),\n        .eventWorkerStart = CreateEvent(NULL, FALSE, FALSE, NULL),\n        .eventWorkerDone = CreateEvent(NULL, FALSE, FALSE, NULL),\n    };\n\n    if (!workerThreadParam.eventWorkerReady ||\n        !workerThreadParam.eventWorkerStart ||\n        !workerThreadParam.eventWorkerDone) {\n        goto exit;\n    }\n\n    DWORD workerThreadId;\n    workerThread = CreateThread(\n        NULL, // default security attributes\n        0,    // default stack size\n        WorkerThread,\n        &workerThreadParam,\n        0,    // default creation flags\n        &workerThreadId\n    );\n    if (!workerThread) {\n        goto exit;\n    }\n\n    WaitForSingleObject(workerThreadParam.eventWorkerReady, INFINITE);\n\n    // Do the bare minimum when threads are suspended to avoid deadlocks.\n    // For that reason, the worker thread is created before that.\n    NTSTATUS status = threadscan_thread_suspend(\n        &workerThreadParam.suspendedHandles, &workerThreadParam.suspendedHandleCount, workerThreadId);\n    if (!NT_SUCCESS(status)) {\n        workerThreadParam.abort = TRUE;\n        workerThreadParam.suspendedHandles = NULL;\n        workerThreadParam.suspendedHandleCount = 0;\n    }\n\n    SetEvent(workerThreadParam.eventWorkerStart);\n\n    // There are mainly two reasons for a timeout:\n    // * The callback is taking too long for the given timeout.\n    // * One of the suspended threads is holding a lock which prevents stack walking, see:\n    //   https://devblogs.microsoft.com/oldnewthing/20250411-00/?p=111066\n    //   Once threads are resumed, it should be able to proceed.\n    if (!workerThreadParam.abort &&\n        WaitForSingleObject(workerThreadParam.eventWorkerDone, timeout) != WAIT_OBJECT_0) {\n        workerThreadParam.abort = TRUE;\n    }\n\n    if (!workerThreadParam.abort) {\n        result = TRUE;\n    }\n\n    if (workerThreadParam.suspendedHandles) {\n        threadscan_thread_resume(workerThreadParam.suspendedHandles, workerThreadParam.suspendedHandleCount);\n    }\n\n    WaitForSingleObject(workerThread, INFINITE);\n\nexit:\n    if (workerThreadParam.suspendedHandles) {\n        threadscan_thread_free(workerThreadParam.suspendedHandles, workerThreadParam.suspendedHandleCount);\n    }\n\n    if (workerThread) {\n        CloseHandle(workerThread);\n    }\n\n    if (workerThreadParam.eventWorkerReady) {\n        CloseHandle(workerThreadParam.eventWorkerReady);\n    }\n\n    if (workerThreadParam.eventWorkerStart) {\n        CloseHandle(workerThreadParam.eventWorkerStart);\n    }\n\n    if (workerThreadParam.eventWorkerDone) {\n        CloseHandle(workerThreadParam.eventWorkerDone);\n    }\n\n    return result;\n}\n\n#elif defined(_X86_)\n\nstatic BOOL ThreadCallStackIterate(\n    HANDLE threadHandle,\n    ThreadCallStackIterCallback callback,\n    void* userData) {\n    CONTEXT context;\n    context.ContextFlags = CONTEXT_CONTROL;\n    NTSTATUS status = NtGetContextThread(threadHandle, &context);\n    if (!NT_SUCCESS(status)) {\n        // Continue to the next thread if we can't get the context.\n        return TRUE;\n    }\n\n    if (!callback(threadHandle, (void*)context.Eip, userData)) {\n        // If the callback returns FALSE, we stop iterating.\n        return FALSE;\n    }\n\n    THREAD_BASIC_INFORMATION threadInfo;\n    if (!NT_SUCCESS(NtQueryInformationThread(\n        threadHandle,\n        ThreadBasicInformation,\n        &threadInfo,\n        sizeof(threadInfo),\n        NULL\n    ))) {\n        // Continue to the next thread if we can't get the thread information.\n        return TRUE;\n    }\n\n    DWORD stackBase = (DWORD)threadInfo.TebBaseAddress->NtTib.StackBase;\n    DWORD stackLimit = (DWORD)threadInfo.TebBaseAddress->NtTib.StackLimit;\n\n    DWORD lastStackLimit = stackLimit;\n\n    // Walk the stack using the frame-pointer stored in the RBP register.\n    // NOTE: Requires the binary to be compiled with frame-pointers.\n    struct frame {\n        struct frame* prev;\n        DWORD retAddr;\n    };\n\n    struct frame* frame = (struct frame*)context.Ebp;\n\n    while ((DWORD)frame >= lastStackLimit &&\n        (DWORD)frame <= stackBase - sizeof(struct frame)) {\n        lastStackLimit = (DWORD)frame + sizeof(struct frame);\n\n        DWORD callpc = frame->retAddr;\n        if (callpc == 0) {\n            break;\n        }\n\n        if (!callback(threadHandle, (void*)callpc, userData)) {\n            // If the callback returns FALSE, we stop iterating.\n            return FALSE;\n        }\n\n        frame = frame->prev;\n    }\n\n    return TRUE;\n}\n\nstatic BOOL ThreadsCallStackIterateImpl(\n    ThreadCallStackIterCallback callback,\n    void* userData,\n    DWORD timeout) {\n    BOOL result = TRUE;\n    DWORD startTime = GetTickCount();\n    HANDLE* suspendedHandles = NULL;\n    ULONG suspendedHandleCount = 0;\n    NTSTATUS status = threadscan_thread_suspend(&suspendedHandles, &suspendedHandleCount, 0);\n    if (NT_SUCCESS(status) && suspendedHandles) {\n        for (ULONG i = 0; i < suspendedHandleCount; i++) {\n            if (!ThreadCallStackIterate(suspendedHandles[i], callback, userData)) {\n                // If the callback returns FALSE, we stop iterating.\n                break;\n            }\n\n            DWORD elapsedTime = GetTickCount() - startTime;\n            if (elapsedTime >= timeout) {\n                result = FALSE;\n                break;\n            }\n        }\n\n        threadscan_thread_resume(suspendedHandles, suspendedHandleCount);\n    }\n\n    return result;\n}\n\n#endif\n\nBOOL ThreadsCallStackInitialize() {\n    return threadscan_memory_initialize();\n}\n\nBOOL ThreadsCallStackIterate(\n    ThreadCallStackIterCallback callback,\n    void* userData,\n    DWORD timeout) {\n    return ThreadsCallStackIterateImpl(callback, userData, timeout);\n}\n\nvoid ThreadsCallStackCleanup() {\n    threadscan_memory_uninitialize();\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/ThreadsCallStackIterate.h",
    "content": "#pragma once\n\nBOOL ThreadsCallStackInitialize();\n\ntypedef BOOL(*ThreadCallStackIterCallback)(\n    HANDLE threadHandle,\n    void* stackFrameAddress,\n    void* userData);\n\n// Iterates over the call stacks of all threads and calls the callback for each\n// stack frame address. The callback should return TRUE to continue iterating\n// or FALSE to stop iterating. The callback might be called from a different\n// thread than the one that called this function.\n//\n// The function will suspend all threads and resume them after the iteration is\n// done. Therefore, the callback must be careful not to acquire any locks,\n// including indirectly by e.g. using the process heap.\nBOOL ThreadsCallStackIterate(\n    ThreadCallStackIterCallback callback,\n    void* userData,\n    DWORD timeout);\n\nvoid ThreadsCallStackCleanup();\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/ThreadsCallStackWaitForRegions.c",
    "content": "#include <windows.h>\n\n#include \"ThreadsCallStackWaitForRegions.h\"\n\n#include \"ThreadsCallStackIterate.h\"\n\ntypedef struct {\n    const ThreadCallStackRegionInfo* regionInfos;\n    DWORD regionInfosCount;\n    BOOL found;\n} ThreadCallStackIterateParam;\n\nstatic BOOL ThreadCallStackIterateProc(HANDLE threadHandle, void* stackFrameAddress, void* userData) {\n    ThreadCallStackIterateParam* param = (ThreadCallStackIterateParam*)userData;\n\n    const ThreadCallStackRegionInfo* regionInfos = param->regionInfos;\n    DWORD regionInfosCount = param->regionInfosCount;\n\n    for (DWORD i = 0; i < regionInfosCount; i++) {\n        DWORD_PTR address = regionInfos[i].address;\n        DWORD_PTR size = regionInfos[i].size;\n        if ((DWORD_PTR)stackFrameAddress >= address &&\n            (DWORD_PTR)stackFrameAddress < address + size) {\n            param->found = TRUE;\n            return FALSE; // Stop iterating\n        }\n    }\n\n    return TRUE; // Continue iterating\n}\n\nBOOL ThreadsCallStackWaitForRegions(\n    const ThreadCallStackRegionInfo* regionInfos,\n    DWORD regionInfosCount,\n    DWORD maxIterations,\n    DWORD timeoutPerIteration) {\n    ThreadCallStackIterateParam param = {\n        .regionInfos = regionInfos,\n        .regionInfosCount = regionInfosCount,\n    };\n    BOOL result = FALSE;\n\n    ThreadsCallStackInitialize();\n\n    for (DWORD i = 0; i < maxIterations; i++) {\n        DWORD startTime = GetTickCount();\n\n        param.found = FALSE;\n        if (ThreadsCallStackIterate(ThreadCallStackIterateProc, &param, timeoutPerIteration) && !param.found) {\n            result = TRUE;\n            break;\n        }\n\n        if (i < maxIterations - 1) {\n            DWORD elapsedTime = GetTickCount() - startTime;\n            if (elapsedTime < timeoutPerIteration) {\n                Sleep(timeoutPerIteration - elapsedTime);\n            }\n        }\n    }\n\n    ThreadsCallStackCleanup();\n\n    return result;\n}\n"
  },
  {
    "path": "src/windhawk/engine/libraries/thread-call-stack-scanner/ThreadsCallStackWaitForRegions.h",
    "content": "#pragma once\n\ntypedef struct {\n    DWORD_PTR address;\n    DWORD_PTR size;\n} ThreadCallStackRegionInfo;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Iterates over the call stacks of all threads and waits until no address is\n// within any of the specified regions. Can be used to wait for a specific\n// module to stop executing in order to safely unload it.\nBOOL ThreadsCallStackWaitForRegions(\n    const ThreadCallStackRegionInfo* regionInfos,\n    DWORD regionInfosCount,\n    DWORD maxIterations,\n    DWORD timeoutPerIteration);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/libraries/wow64pp/wow64pp.hpp",
    "content": "/*\n * Copyright 2017 - 2018 Justas Masiulis\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 */\n\n#ifndef WOW64PP_HPP\n#define WOW64PP_HPP\n\n#if !(defined _M_IX86) && !(defined __i386__)\n#error wow64pp is designed for x86 only\n#endif\n\n#define WIN32_LEAN_AND_MEAN\n#define NOMINMAX\n#include <windows.h>\n\n#include <cstring>  // memcpy\n#include <expected>\n#include <memory>\n#include <optional>\n#include <string_view>\n#include <system_error>\n\n// The following macros are used to initialize static variables once in a\n// thread-safe manner while avoiding TLS, which is what MSVC uses for static\n// variables.\n#ifdef WOW64PP_AVOID_TLS\n//  Similar to:\n//  static T var_name = initializer;\n#define WOW64PP_STATIC_INIT_ONCE_TRIVIAL(T, var_name, initializer) \\\n    static constinit T var_name;                                   \\\n    do {                                                           \\\n        static_assert(std::is_trivially_destructible_v<T>);        \\\n        static std::once_flag static_init_once_flag_;              \\\n        std::call_once(static_init_once_flag_,                     \\\n                       []() { var_name = initializer; });          \\\n    } while (0)\n#else\n#define WOW64PP_STATIC_INIT_ONCE_TRIVIAL(T, var_name, initializer) \\\n    static T var_name = initializer;\n#endif\n\nnamespace wow64pp {\n\ntypedef LONG NTSTATUS;\n\nnamespace defs {\n\nusing NtWow64QueryInformationProcess64T =\n    NTSTATUS(__stdcall*)(HANDLE ProcessHandle,\n                         std::uint32_t ProcessInformationClass,\n                         void* ProcessInformation,\n                         std::uint32_t ProcessInformationLength,\n                         std::uint32_t* ReturnLength);\n\nusing NtWow64ReadVirtualMemory64T =\n    NTSTATUS(__stdcall*)(HANDLE ProcessHandle,\n                         std::uint64_t BaseAddress,\n                         void* Buffer,\n                         std::uint64_t Size,\n                         std::uint64_t* NumberOfBytesRead);\n\nstruct LIST_ENTRY_64 {\n    std::uint64_t Flink;\n    std::uint64_t Blink;\n};\n\nstruct UNICODE_STRING_64 {\n    std::uint16_t Length;\n    std::uint16_t MaximumLength;\n    std::uint64_t Buffer;\n};\n\nstruct PROCESS_BASIC_INFORMATION_64 {\n    std::uint64_t unused_1_;\n    std::uint64_t PebBaseAddress;\n    std::uint64_t unused_2_[4];\n};\n\nstruct PEB_64 {\n    std::uint8_t unused_1_[4];\n    std::uint64_t unused_2_[2];\n    std::uint64_t Ldr;\n};\n\nstruct PEB_LDR_DATA_64 {\n    std::uint32_t Length;\n    std::uint32_t Initialized;\n    std::uint64_t SsHandle;\n    LIST_ENTRY_64 InLoadOrderModuleList;\n};\n\nstruct LDR_DATA_TABLE_ENTRY_64 {\n    LIST_ENTRY_64 InLoadOrderLinks;\n    LIST_ENTRY_64 InMemoryOrderLinks;\n    LIST_ENTRY_64 InInitializationOrderLinks;\n    std::uint64_t DllBase;\n    std::uint64_t EntryPoint;\n    union {\n        std::uint32_t SizeOfImage;\n        std::uint64_t dummy_;\n    };\n    UNICODE_STRING_64 FullDllName;\n    UNICODE_STRING_64 BaseDllName;\n};\n\n}  // namespace defs\n\nnamespace detail {\n\ninline std::error_code get_last_error() noexcept {\n    return std::error_code(static_cast<int>(GetLastError()),\n                           std::system_category());\n}\n\n[[noreturn]] inline void throw_error_code(const std::error_code& ec) {\n    throw std::system_error(ec);\n}\n\n[[noreturn]] inline void throw_error_code(const std::error_code& ec,\n                                          const char* message) {\n    throw std::system_error(ec, message);\n}\n\n[[noreturn]] inline void throw_last_error(const char* message) {\n    throw std::system_error(get_last_error(), message);\n}\n\ninline void throw_if_failed(const char* message, NTSTATUS status) {\n    if (status < 0) {\n        throw std::system_error(std::error_code(status, std::system_category()),\n                                message);\n    }\n}\n\ninline HANDLE self_handle() {\n    HANDLE h;\n\n    if (!DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),\n                         GetCurrentProcess(), &h, 0, 0,\n                         DUPLICATE_SAME_ACCESS)) {\n        throw_last_error(\"failed to duplicate current process handle\");\n    }\n\n    return h;\n}\n\ninline HANDLE self_handle(std::error_code& ec) noexcept {\n    HANDLE h;\n\n    if (!DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),\n                         GetCurrentProcess(), &h, 0, 0,\n                         DUPLICATE_SAME_ACCESS)) {\n        ec = get_last_error();\n        return nullptr;\n    }\n\n    ec.clear();\n    return h;\n}\n\ntemplate <typename F>\ninline F native_ntdll_function(const char* name) {\n    const auto ntdll_addr = GetModuleHandleW(L\"ntdll.dll\");\n    if (!ntdll_addr) {\n        throw_last_error(\"GetModuleHandle() failed\");\n    }\n\n    auto f = reinterpret_cast<F>(GetProcAddress(ntdll_addr, name));\n    if (!f) {\n        throw_last_error(\"failed to get address of ntdll function\");\n    }\n\n    return f;\n}\n\ntemplate <typename F>\ninline F native_ntdll_function(const char* name, std::error_code& ec) noexcept {\n    const auto ntdll_addr = GetModuleHandleW(L\"ntdll.dll\");\n    if (!ntdll_addr) {\n        ec = get_last_error();\n        return nullptr;\n    }\n\n    const auto f = reinterpret_cast<F>(GetProcAddress(ntdll_addr, name));\n    if (!f) {\n        ec = get_last_error();\n        return nullptr;\n    }\n\n    ec.clear();\n    return f;\n}\n\ntemplate <typename FunctionType, const char* FunctionName>\ninline FunctionType get_cached_native_ntdll_function(\n    std::error_code& ec) noexcept {\n    using function_result_t = std::expected<FunctionType, std::error_code>;\n    WOW64PP_STATIC_INIT_ONCE_TRIVIAL(\n        function_result_t, function_result, ([]() -> function_result_t {\n            std::error_code ec;\n            const auto function =\n                native_ntdll_function<FunctionType>(FunctionName, ec);\n            if (ec)\n                return std::unexpected(ec);\n            return function;\n        }()));\n    if (!function_result.has_value()) {\n        ec = function_result.error();\n        return nullptr;\n    }\n\n    ec.clear();\n    return *function_result;\n}\n\ninline defs::NtWow64QueryInformationProcess64T\nget_cached_nt_wow64_query_information_process_64(std::error_code& ec) noexcept {\n    static constexpr char function_name[] = \"NtWow64QueryInformationProcess64\";\n    return get_cached_native_ntdll_function<\n        defs::NtWow64QueryInformationProcess64T, function_name>(ec);\n}\n\ninline defs::NtWow64ReadVirtualMemory64T\nget_cached_nt_wow64_read_virtual_memory_64(std::error_code& ec) noexcept {\n    static constexpr char function_name[] = \"NtWow64ReadVirtualMemory64\";\n    return get_cached_native_ntdll_function<defs::NtWow64ReadVirtualMemory64T,\n                                            function_name>(ec);\n}\n\ninline std::uint64_t peb_address() {\n    std::error_code ec;\n    const auto NtWow64QueryInformationProcess64 =\n        get_cached_nt_wow64_query_information_process_64(ec);\n    if (ec) {\n        throw_error_code(ec);\n    }\n\n    defs::PROCESS_BASIC_INFORMATION_64 pbi;\n    const auto hres =\n        NtWow64QueryInformationProcess64(GetCurrentProcess(),\n                                         0,  // ProcessBasicInformation\n                                         &pbi, sizeof(pbi), nullptr);\n    throw_if_failed(\"NtWow64QueryInformationProcess64() failed\", hres);\n\n    return pbi.PebBaseAddress;\n}\n\ninline std::uint64_t peb_address(std::error_code& ec) noexcept {\n    const auto NtWow64QueryInformationProcess64 =\n        get_cached_nt_wow64_query_information_process_64(ec);\n    if (ec) {\n        return 0;\n    }\n\n    defs::PROCESS_BASIC_INFORMATION_64 pbi;\n    const auto hres =\n        NtWow64QueryInformationProcess64(GetCurrentProcess(),\n                                         0,  // ProcessBasicInformation\n                                         &pbi, sizeof(pbi), nullptr);\n    if (hres < 0) {\n        ec = get_last_error();\n    }\n\n    return pbi.PebBaseAddress;\n}\n\ntemplate <typename P>\ninline void read_memory(std::uint64_t address,\n                        P* buffer,\n                        std::size_t size = sizeof(P)) {\n    if (address + size - 1 <= std::numeric_limits<std::uint32_t>::max()) {\n        std::memcpy(\n            buffer,\n            reinterpret_cast<const void*>(static_cast<std::uint32_t>(address)),\n            size);\n        return;\n    }\n\n    std::error_code ec;\n    const auto NtWow64ReadVirtualMemory64 =\n        get_cached_nt_wow64_read_virtual_memory_64(ec);\n    if (ec) {\n        throw_error_code(ec);\n    }\n\n    HANDLE h_self = self_handle();\n    auto hres =\n        NtWow64ReadVirtualMemory64(h_self, address, buffer, size, nullptr);\n    CloseHandle(h_self);\n    throw_if_failed(\"NtWow64ReadVirtualMemory64() failed\", hres);\n}\n\ntemplate <typename P>\ninline void read_memory(std::uint64_t address,\n                        P* buffer,\n                        std::size_t size,\n                        std::error_code& ec) noexcept {\n    if (address + size - 1 <= std::numeric_limits<std::uint32_t>::max()) {\n        std::memcpy(\n            buffer,\n            reinterpret_cast<const void*>(static_cast<std::uint32_t>(address)),\n            size);\n        return;\n    }\n\n    const auto NtWow64ReadVirtualMemory64 =\n        get_cached_nt_wow64_read_virtual_memory_64(ec);\n    if (ec) {\n        return;\n    }\n\n    HANDLE h_self = self_handle(ec);\n    if (ec) {\n        return;\n    }\n\n    auto hres =\n        NtWow64ReadVirtualMemory64(h_self, address, buffer, size, nullptr);\n    CloseHandle(h_self);\n    if (hres < 0) {\n        ec = get_last_error();\n    }\n}\n\ntemplate <typename T>\ninline T read_memory(std::uint64_t address) {\n    alignas(T) std::byte buffer[sizeof(T)];\n    read_memory(address, &buffer, sizeof(T));\n    return *static_cast<T*>(static_cast<void*>(&buffer));\n}\n\ntemplate <typename T>\ninline T read_memory(std::uint64_t address, std::error_code& ec) noexcept {\n    alignas(T) std::byte buffer[sizeof(T)];\n    read_memory(address, &buffer, sizeof(T), ec);\n    return *static_cast<T*>(static_cast<void*>(&buffer));\n}\n\n}  // namespace detail\n\n/** \\brief An equivalent of winapi GetModuleHandle function.\n *   \\param[in] module_name The name of the module to get the handle of.\n *   \\return    The handle to the module as a 64 bit integer.\n *   \\exception Throws std::system_error on failure.\n */\ninline std::uint64_t module_handle(std::string_view module_name) {\n    const auto ldr_base =\n        detail::read_memory<defs::PEB_64>(detail::peb_address()).Ldr;\n\n    const auto last_entry =\n        ldr_base + offsetof(defs::PEB_LDR_DATA_64, InLoadOrderModuleList);\n\n    defs::LDR_DATA_TABLE_ENTRY_64 head;\n    head.InLoadOrderLinks.Flink =\n        detail::read_memory<defs::PEB_LDR_DATA_64>(ldr_base)\n            .InLoadOrderModuleList.Flink;\n\n    do {\n        try {\n            detail::read_memory(head.InLoadOrderLinks.Flink, &head);\n        } catch (std::system_error&) {\n            continue;\n        }\n\n        const auto other_module_name_len =\n            head.BaseDllName.Length / sizeof(wchar_t);\n        if (other_module_name_len != module_name.length()) {\n            continue;\n        }\n\n        auto other_module_name =\n            std::make_unique<wchar_t[]>(other_module_name_len);\n        detail::read_memory(head.BaseDllName.Buffer, other_module_name.get(),\n                            head.BaseDllName.Length);\n\n        if (std::equal(begin(module_name), end(module_name),\n                       other_module_name.get())) {\n            return head.DllBase;\n        }\n    } while (head.InLoadOrderLinks.Flink != last_entry);\n\n    throw std::system_error(\n        std::error_code(ERROR_MOD_NOT_FOUND, std::system_category()),\n        \"Could not get x64 module handle\");\n}\n\n/** \\brief An equivalent of winapi GetModuleHandle function.\n *   \\param[in] module_name The name of the module to get the handle of.\n *   \\param[out] ec An error code that will be set in case of failure\n *   \\return    The handle to the module as a 64 bit integer.\n *   \\exception Does not throw.\n */\ninline std::uint64_t module_handle(std::string_view module_name,\n                                   std::error_code& ec) noexcept {\n    const auto ldr_base =\n        detail::read_memory<defs::PEB_64>(detail::peb_address(ec), ec).Ldr;\n    if (ec) {\n        return 0;\n    }\n\n    const auto last_entry =\n        ldr_base + offsetof(defs::PEB_LDR_DATA_64, InLoadOrderModuleList);\n\n    defs::LDR_DATA_TABLE_ENTRY_64 head;\n    head.InLoadOrderLinks.Flink =\n        detail::read_memory<defs::PEB_LDR_DATA_64>(ldr_base, ec)\n            .InLoadOrderModuleList.Flink;\n    if (ec) {\n        return 0;\n    }\n\n    do {\n        detail::read_memory(head.InLoadOrderLinks.Flink, &head, sizeof(head),\n                            ec);\n        if (ec) {\n            continue;\n        }\n\n        const auto other_module_name_len =\n            head.BaseDllName.Length / sizeof(wchar_t);\n        if (other_module_name_len != module_name.length()) {\n            continue;\n        }\n\n        auto other_module_name =\n            std::make_unique<wchar_t[]>(other_module_name_len);\n        detail::read_memory(head.BaseDllName.Buffer, other_module_name.get(),\n                            head.BaseDllName.Length, ec);\n        if (ec) {\n            continue;\n        }\n\n        if (std::equal(begin(module_name), end(module_name),\n                       other_module_name.get())) {\n            ec.clear();\n            return head.DllBase;\n        }\n    } while (head.InLoadOrderLinks.Flink != last_entry);\n\n    if (!ec) {\n        ec = std::error_code(ERROR_MOD_NOT_FOUND, std::system_category());\n    }\n\n    return 0;\n}\n\nnamespace detail {\n\ninline IMAGE_EXPORT_DIRECTORY image_export_dir(std::uint64_t ntdll_base) {\n    const auto e_lfanew = read_memory<IMAGE_DOS_HEADER>(ntdll_base).e_lfanew;\n\n    const auto idd_virtual_addr =\n        read_memory<IMAGE_NT_HEADERS64>(ntdll_base + e_lfanew)\n            .OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]\n            .VirtualAddress;\n\n    if (!idd_virtual_addr) {\n        throw std::runtime_error(\n            \"IMAGE_EXPORT_DIRECTORY::VirtualAddress was 0\");\n    }\n\n    return read_memory<IMAGE_EXPORT_DIRECTORY>(ntdll_base + idd_virtual_addr);\n}\n\ninline IMAGE_EXPORT_DIRECTORY image_export_dir(std::uint64_t ntdll_base,\n                                               std::error_code& ec) noexcept {\n    const auto e_lfanew =\n        read_memory<IMAGE_DOS_HEADER>(ntdll_base, ec).e_lfanew;\n    if (ec) {\n        return {};\n    }\n\n    const auto idd_virtual_addr =\n        read_memory<IMAGE_NT_HEADERS64>(ntdll_base + e_lfanew, ec)\n            .OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]\n            .VirtualAddress;\n    if (ec) {\n        return {};\n    }\n\n    if (idd_virtual_addr == 0) {\n        ec = std::error_code(ERROR_PROC_NOT_FOUND, std::system_category());\n        return {};\n    }\n\n    return read_memory<IMAGE_EXPORT_DIRECTORY>(ntdll_base + idd_virtual_addr,\n                                               ec);\n}\n\ninline std::uint64_t ldr_procedure_address() {\n    const auto ntdll_base = module_handle(\"ntdll.dll\");\n\n    const auto ied = image_export_dir(ntdll_base);\n\n    auto rva_table = std::make_unique<std::uint32_t[]>(ied.NumberOfFunctions);\n    read_memory(ntdll_base + ied.AddressOfFunctions, rva_table.get(),\n                sizeof(std::uint32_t) * ied.NumberOfFunctions);\n\n    auto ord_table = std::make_unique<std::uint16_t[]>(ied.NumberOfFunctions);\n    read_memory(ntdll_base + ied.AddressOfNameOrdinals, ord_table.get(),\n                sizeof(std::uint16_t) * ied.NumberOfFunctions);\n\n    auto name_table = std::make_unique<std::uint32_t[]>(ied.NumberOfNames);\n    read_memory(ntdll_base + ied.AddressOfNames, name_table.get(),\n                sizeof(std::uint32_t) * ied.NumberOfNames);\n\n    const char to_find[] = \"LdrGetProcedureAddress\";\n    char buffer[std::size(to_find)] = \"\";\n\n    const std::size_t n =\n        (ied.NumberOfFunctions > ied.NumberOfNames ? ied.NumberOfNames\n                                                   : ied.NumberOfFunctions);\n    for (std::size_t i = 0; i < n; ++i) {\n        read_memory(ntdll_base + name_table[i], &buffer);\n\n        if (std::equal(std::begin(to_find), std::end(to_find), buffer)) {\n            return ntdll_base + rva_table[ord_table[i]];\n        }\n    }\n\n    throw std::system_error(\n        std::error_code(ERROR_PROC_NOT_FOUND, std::system_category()),\n        \"could find x64 LdrGetProcedureAddress()\");\n}\n\ninline std::uint64_t ldr_procedure_address(std::error_code& ec) noexcept {\n    const auto ntdll_base = module_handle(\"ntdll.dll\", ec);\n    if (ec) {\n        return 0;\n    }\n\n    const auto ied = image_export_dir(ntdll_base, ec);\n    if (ec) {\n        return 0;\n    }\n\n    auto rva_table = std::make_unique<std::uint32_t[]>(ied.NumberOfFunctions);\n    read_memory(ntdll_base + ied.AddressOfFunctions, rva_table.get(),\n                sizeof(std::uint32_t) * ied.NumberOfFunctions, ec);\n    if (ec) {\n        return 0;\n    }\n\n    auto ord_table = std::make_unique<std::uint16_t[]>(ied.NumberOfFunctions);\n    read_memory(ntdll_base + ied.AddressOfNameOrdinals, ord_table.get(),\n                sizeof(std::uint16_t) * ied.NumberOfFunctions, ec);\n    if (ec) {\n        return 0;\n    }\n\n    auto name_table = std::make_unique<std::uint32_t[]>(ied.NumberOfNames);\n    read_memory(ntdll_base + ied.AddressOfNames, name_table.get(),\n                sizeof(std::uint32_t) * ied.NumberOfNames, ec);\n    if (ec) {\n        return 0;\n    }\n\n    const char to_find[] = \"LdrGetProcedureAddress\";\n    char buffer[std::size(to_find)] = \"\";\n\n    const std::size_t n = ied.NumberOfFunctions > ied.NumberOfNames\n                              ? ied.NumberOfNames\n                              : ied.NumberOfFunctions;\n\n    for (std::size_t i = 0; i < n; ++i) {\n        read_memory(ntdll_base + name_table[i], &buffer, sizeof(buffer), ec);\n        if (ec) {\n            continue;\n        }\n\n        if (std::equal(std::begin(to_find), std::end(to_find), buffer)) {\n            ec.clear();\n            return ntdll_base + rva_table[ord_table[i]];\n        }\n    }\n\n    ec = std::error_code(ERROR_PROC_NOT_FOUND, std::system_category());\n    return 0;\n}\n\n#pragma code_seg(push, r1, \".text\")\n__declspec(allocate(\".text\"))  //\ninline static const std::uint8_t call_function_x64_shellcode[] = {\n    // clang-format off\n\n    0x55,             // push ebp\n    0x89, 0xE5,       // mov ebp, esp\n\n    0x83, 0xE4, 0xF0, // and esp, 0xFFFFFFF0\n\n    // enter 64 bit mode\n    0x6A, 0x33, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x83, 0x04, 0x24, 0x05, 0xCB,\n\n    0x67, 0x48, 0x8B, 0x4D, 16, // mov rcx, [ebp + 16]\n    0x67, 0x48, 0x8B, 0x55, 24, // mov rdx, [ebp + 24]\n    0x67, 0x4C, 0x8B, 0x45, 32, // mov r8,  [ebp + 32]\n    0x67, 0x4C, 0x8B, 0x4D, 40, // mov r9,  [ebp + 40]\n\n    0x67, 0x48, 0x8B, 0x45, 48, // mov rax, [ebp + 48] args count\n\n    0xA8, 0x01,             // test al, 1\n    0x75, 0x04,             // jne _no_adjust\n    0x48, 0x83, 0xEC, 0x08, // sub rsp, 8\n    // _no adjust:\n        0x57,                                     // push rdi\n        0x67, 0x48, 0x8B, 0x7D, 0x38,             // mov rdi, [ebp + 56]\n        0x48, 0x85, 0xC0,                         // je _ls_e\n        0x74, 0x16, 0x48, 0x8D, 0x7C, 0xC7, 0xF8, // lea rdi, [rdi+rax*8-8]\n    // _ls:\n        0x48, 0x85, 0xC0,       // test rax, rax\n        0x74, 0x0C,             // je _ls_e\n        0xFF, 0x37,             // push [rdi]\n        0x48, 0x83, 0xEF, 0x08, // sub rdi, 8\n        0x48, 0x83, 0xE8, 0x01, // sub rax, 1\n        0xEB, 0xEF,             // jmp _ls\n    // _ls_e:\n    0x67, 0x8B, 0x7D, 0x40,       // mov edi, [ebp + 64]\n    0x48, 0x83, 0xEC, 0x20,       // sub rsp, 0x20\n    0x67, 0xFF, 0x55, 0x08,       // call [ebp + 0x8]\n    0x67, 0x48, 0x89, 0x07,       // mov [edi], rax\n    0x67, 0x48, 0x8B, 0x4D, 0x30, // mov rcx, [ebp+48]\n    0x48, 0x8D, 0x64, 0xCC, 0x20, // lea rsp, [rsp+rcx*8+0x20]\n    0x5F,                         // pop rdi\n\n    // exit 64 bit mode\n    0xE8, 0, 0, 0, 0, 0xC7, 0x44, 0x24, 4, 0x23, 0, 0, 0, 0x83, 4, 0x24, 0xD, 0xCB,\n\n    0x66, 0x8C, 0xD8, // mov ax, ds\n    0x8E, 0xD0,       // mov ss, eax\n\n    0x89, 0xEC, // mov esp, ebp\n    0x5D,       // pop ebp\n    0xC3        // ret\n\n    // clang-format on\n};\n#pragma code_seg(pop, r1)\n\ntemplate <class... Args>\ninline std::uint64_t call_function_x64(std::uint64_t func,\n                                       Args... args) noexcept {\n    std::uint64_t arr_args[sizeof...(args) > 4 ? sizeof...(args) : 4] = {\n        (std::uint64_t)(args)...};\n\n    using my_fn_sig = void(__cdecl*)(\n        std::uint64_t, std::uint64_t, std::uint64_t, std::uint64_t,\n        std::uint64_t, std::uint64_t, std::uint64_t, std::uint32_t);\n\n    std::uint64_t ret;\n    reinterpret_cast<my_fn_sig>(&call_function_x64_shellcode)(\n        func, arr_args[0], arr_args[1], arr_args[2], arr_args[3],\n        sizeof...(Args) > 4 ? (sizeof...(Args) - 4) : 0,\n        reinterpret_cast<std::uint64_t>(arr_args + 4),\n        reinterpret_cast<std::uint32_t>(&ret));\n\n    return ret;\n}\n\ninline std::uint64_t* find_import_ptr_64(HMODULE module,\n                                         const char* module_name,\n                                         const char* import_name) noexcept {\n    IMAGE_DOS_HEADER* dos_header = reinterpret_cast<IMAGE_DOS_HEADER*>(module);\n    IMAGE_NT_HEADERS64* nt_header = reinterpret_cast<IMAGE_NT_HEADERS64*>(\n        reinterpret_cast<std::byte*>(dos_header) + dos_header->e_lfanew);\n\n    if (!nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]\n             .VirtualAddress) {\n        return nullptr;\n    }\n\n    std::byte* image_base = reinterpret_cast<std::byte*>(module);\n    IMAGE_IMPORT_DESCRIPTOR* import_descriptor =\n        reinterpret_cast<IMAGE_IMPORT_DESCRIPTOR*>(\n            image_base + nt_header->OptionalHeader\n                             .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]\n                             .VirtualAddress);\n\n    while (import_descriptor->OriginalFirstThunk) {\n        if (_stricmp(reinterpret_cast<const char*>(image_base +\n                                                   import_descriptor->Name),\n                     module_name) == 0) {\n            IMAGE_THUNK_DATA64* original_first_think =\n                reinterpret_cast<IMAGE_THUNK_DATA64*>(\n                    image_base + import_descriptor->OriginalFirstThunk);\n            IMAGE_THUNK_DATA64* first_think =\n                reinterpret_cast<IMAGE_THUNK_DATA64*>(\n                    image_base + import_descriptor->FirstThunk);\n\n            while (std::uint64_t iter = original_first_think->u1.Function) {\n                if (!IMAGE_SNAP_BY_ORDINAL64(iter)) {\n                    if (reinterpret_cast<std::uint64_t>(import_name) &\n                        ~0xFFFF) {\n                        if (strcmp(\n                                reinterpret_cast<const char*>(\n                                    image_base + iter + sizeof(std::uint16_t)),\n                                import_name) == 0) {\n                            return &first_think->u1.Function;\n                        }\n                    }\n                } else if ((reinterpret_cast<std::uint64_t>(import_name) &\n                            ~0xFFFF) == 0 &&\n                           IMAGE_ORDINAL64(iter) ==\n                               IMAGE_ORDINAL64(reinterpret_cast<std::uint64_t>(\n                                   import_name))) {\n                    return &first_think->u1.Function;\n                }\n\n                original_first_think++;\n                first_think++;\n            }\n        }\n\n        import_descriptor++;\n    }\n\n    return nullptr;\n}\n\n// The native 64-bit code and data are placed in a separate section to make sure\n// they're separated from the rest of the code. This has several benefits:\n// * VirtualProtect can be used upon initialization without affecting running\n//   code.\n// * Better control of the order of the contents of the section.\n// * Having the contents aligned to the page size is important for ARM64 due to\n//   the compiler-generated IPC code.\n\n#pragma code_seg(push, r1, \".text64\")\n#pragma warning(push)\n#pragma warning(disable : 4200)  // Structures with zero length arrays.\n__declspec(allocate(\".text64\"))  //\ninline static struct {\n    std::uint64_t original;\n    std::uint8_t hook[];\n} wow64_system_service_ex = {\n    0xD4200000D4200000,\n    {\n        // clang-format off\n\n        // Native ARM64 hook, compiled from the native_64_shellcode project.\n        0xff, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xff, 0x83, 0x01, 0xd1,\n        0x08, 0x00, 0x00, 0x90, 0x02, 0x21, 0x00, 0x91, 0x1f, 0xa8, 0x3f, 0x71, 0xe0, 0x00, 0x00, 0x54,\n        0x48, 0x80, 0x5f, 0xf8, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x83, 0x01, 0x91, 0xfd, 0x7b, 0xc1, 0xa8,\n        0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x3b, 0x00, 0xf9, 0x33, 0x00, 0x40, 0xb9,\n        0x49, 0x20, 0x00, 0x58, 0x68, 0x02, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, 0x20, 0x01, 0x00, 0x54,\n        0x48, 0x80, 0x5f, 0xf8, 0x40, 0xfd, 0x81, 0x52, 0x00, 0x01, 0x3f, 0xd6, 0xf3, 0x3b, 0x40, 0xf9,\n        0xff, 0x83, 0x01, 0x91, 0xfd, 0x7b, 0xc1, 0xa8, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6,\n        0x69, 0xaa, 0x40, 0xa9, 0x00, 0x00, 0x80, 0x92, 0x68, 0x0e, 0x40, 0xf9, 0x6a, 0x00, 0x00, 0xb5,\n        0x20, 0x01, 0x3f, 0xd6, 0xe8, 0x00, 0x00, 0x14, 0x5f, 0x05, 0x00, 0xf1, 0x81, 0x00, 0x00, 0x54,\n        0x00, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, 0xe3, 0x00, 0x00, 0x14, 0x5f, 0x09, 0x00, 0xf1,\n        0x81, 0x00, 0x00, 0x54, 0x00, 0x05, 0x40, 0xa9, 0x20, 0x01, 0x3f, 0xd6, 0xde, 0x00, 0x00, 0x14,\n        0x5f, 0x0d, 0x00, 0xf1, 0xa1, 0x00, 0x00, 0x54, 0x02, 0x09, 0x40, 0xf9, 0x00, 0x05, 0x40, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0xd8, 0x00, 0x00, 0x14, 0x5f, 0x11, 0x00, 0xf1, 0xa1, 0x00, 0x00, 0x54,\n        0x02, 0x0d, 0x41, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0x20, 0x01, 0x3f, 0xd6, 0xd2, 0x00, 0x00, 0x14,\n        0x5f, 0x15, 0x00, 0xf1, 0xc1, 0x00, 0x00, 0x54, 0x04, 0x11, 0x40, 0xf9, 0x02, 0x0d, 0x41, 0xa9,\n        0x00, 0x05, 0x40, 0xa9, 0x20, 0x01, 0x3f, 0xd6, 0xcb, 0x00, 0x00, 0x14, 0x5f, 0x19, 0x00, 0xf1,\n        0xc1, 0x00, 0x00, 0x54, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0x00, 0x05, 0x40, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0xc4, 0x00, 0x00, 0x14, 0x5f, 0x1d, 0x00, 0xf1, 0xe1, 0x00, 0x00, 0x54,\n        0x06, 0x19, 0x40, 0xf9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0x00, 0x05, 0x40, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0xbc, 0x00, 0x00, 0x14, 0x5f, 0x21, 0x00, 0xf1, 0xe1, 0x00, 0x00, 0x54,\n        0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0x00, 0x05, 0x40, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0xb4, 0x00, 0x00, 0x14, 0x5f, 0x25, 0x00, 0xf1, 0x21, 0x01, 0x00, 0x54,\n        0x0a, 0x21, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0x00, 0x05, 0x40, 0xa9, 0xea, 0x03, 0x00, 0xf9, 0x20, 0x01, 0x3f, 0xd6, 0xaa, 0x00, 0x00, 0x14,\n        0x5f, 0x29, 0x00, 0xf1, 0x21, 0x01, 0x00, 0x54, 0x0a, 0x2d, 0x44, 0xa9, 0x06, 0x1d, 0x43, 0xa9,\n        0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0xa0, 0x00, 0x00, 0x14, 0x5f, 0x2d, 0x00, 0xf1, 0x61, 0x01, 0x00, 0x54,\n        0x0a, 0x29, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x0b, 0x00, 0xf9, 0x0a, 0x2d, 0x44, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x94, 0x00, 0x00, 0x14, 0x5f, 0x31, 0x00, 0xf1, 0x61, 0x01, 0x00, 0x54,\n        0x0a, 0x2d, 0x45, 0xa9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x88, 0x00, 0x00, 0x14, 0x5f, 0x35, 0x00, 0xf1, 0xa1, 0x01, 0x00, 0x54,\n        0x0a, 0x31, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x13, 0x00, 0xf9, 0x0a, 0x2d, 0x45, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x01, 0xa9,\n        0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9, 0x20, 0x01, 0x3f, 0xd6, 0x7a, 0x00, 0x00, 0x14,\n        0x5f, 0x39, 0x00, 0xf1, 0xa1, 0x01, 0x00, 0x54, 0x0a, 0x2d, 0x46, 0xa9, 0x06, 0x1d, 0x43, 0xa9,\n        0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0xea, 0x2f, 0x02, 0xa9, 0x0a, 0x2d, 0x45, 0xa9,\n        0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x6c, 0x00, 0x00, 0x14, 0x5f, 0x3d, 0x00, 0xf1, 0xe1, 0x01, 0x00, 0x54,\n        0x0a, 0x39, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x1b, 0x00, 0xf9, 0x0a, 0x2d, 0x46, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x02, 0xa9,\n        0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x5c, 0x00, 0x00, 0x14, 0x5f, 0x41, 0x00, 0xf1, 0xe1, 0x01, 0x00, 0x54,\n        0x0a, 0x2d, 0x47, 0xa9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x2f, 0x03, 0xa9, 0x0a, 0x2d, 0x46, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x02, 0xa9,\n        0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x4c, 0x00, 0x00, 0x14, 0x5f, 0x45, 0x00, 0xf1, 0x21, 0x02, 0x00, 0x54,\n        0x0a, 0x41, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x23, 0x00, 0xf9, 0x0a, 0x2d, 0x47, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x03, 0xa9,\n        0x0a, 0x2d, 0x46, 0xa9, 0xea, 0x2f, 0x02, 0xa9, 0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9,\n        0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9, 0x20, 0x01, 0x3f, 0xd6, 0x3a, 0x00, 0x00, 0x14,\n        0x5f, 0x49, 0x00, 0xf1, 0x21, 0x02, 0x00, 0x54, 0x0a, 0x2d, 0x48, 0xa9, 0x06, 0x1d, 0x43, 0xa9,\n        0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9, 0xea, 0x2f, 0x04, 0xa9, 0x0a, 0x2d, 0x47, 0xa9,\n        0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x03, 0xa9, 0x0a, 0x2d, 0x46, 0xa9, 0xea, 0x2f, 0x02, 0xa9,\n        0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x28, 0x00, 0x00, 0x14, 0x5f, 0x4d, 0x00, 0xf1, 0x61, 0x02, 0x00, 0x54,\n        0x0a, 0x49, 0x40, 0xf9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x2b, 0x00, 0xf9, 0x0a, 0x2d, 0x48, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x04, 0xa9,\n        0x0a, 0x2d, 0x47, 0xa9, 0xea, 0x2f, 0x03, 0xa9, 0x0a, 0x2d, 0x46, 0xa9, 0xea, 0x2f, 0x02, 0xa9,\n        0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x14, 0x00, 0x00, 0x14, 0x5f, 0x51, 0x00, 0xf1, 0x41, 0x02, 0x00, 0x54,\n        0x0a, 0x2d, 0x49, 0xa9, 0x06, 0x1d, 0x43, 0xa9, 0x04, 0x15, 0x42, 0xa9, 0x02, 0x0d, 0x41, 0xa9,\n        0xea, 0x2f, 0x05, 0xa9, 0x0a, 0x2d, 0x48, 0xa9, 0x00, 0x05, 0x40, 0xa9, 0xea, 0x2f, 0x04, 0xa9,\n        0x0a, 0x2d, 0x47, 0xa9, 0xea, 0x2f, 0x03, 0xa9, 0x0a, 0x2d, 0x46, 0xa9, 0xea, 0x2f, 0x02, 0xa9,\n        0x0a, 0x2d, 0x45, 0xa9, 0xea, 0x2f, 0x01, 0xa9, 0x0a, 0x2d, 0x44, 0xa9, 0xea, 0x2f, 0x00, 0xa9,\n        0x20, 0x01, 0x3f, 0xd6, 0x28, 0x00, 0x80, 0xd2, 0x68, 0x02, 0x02, 0xa9, 0x00, 0x00, 0x80, 0x52,\n        0xf3, 0x3b, 0x40, 0xf9, 0xff, 0x83, 0x01, 0x91, 0xfd, 0x7b, 0xc1, 0xa8, 0xff, 0x43, 0x00, 0x91,\n        0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x23, 0x82, 0x90, 0x43, 0xbe, 0xe9, 0xe3, 0x89,\n\n        // clang-format on\n    },\n};\n#pragma warning(pop)\n#pragma code_seg(pop, r1)\n\n#pragma code_seg(push, r1, \".text\")\n__declspec(allocate(\".text\"))  //\ninline static const std::uint8_t shellcode_syscall_via_fastcall[] = {\n    // clang-format off\n    0x89, 0xC8,        // mov eax, ecx\n    0xFF, 0xD2,        // call edx\n    0xC2, 0x04, 0x00,  // ret 4\n    // clang-format on\n};\n#pragma code_seg(pop, r1)\n\nstruct CALL_FUNCTION_ARM64_DATA {\n    std::error_code ec;\n    void** pp_wow64_transition = nullptr;\n    std::uint64_t* pp_wow64_system_service_ex = nullptr;\n    std::uint64_t p_wow64_system_service_ex_original = 0;\n    CRITICAL_SECTION critical_section;\n    int call_count = 0;\n};\n\ninline CALL_FUNCTION_ARM64_DATA\nmake_initial_call_function_arm64_data() noexcept {\n    std::error_code ec;\n    void** pp_wow64_transition =\n        native_ntdll_function<void**>(\"Wow64Transition\", ec);\n    if (ec) {\n        return CALL_FUNCTION_ARM64_DATA{.ec = ec};\n    }\n\n    const auto wow64cpu_base = module_handle(\"xtajit.dll\", ec);\n    if (ec) {\n        return CALL_FUNCTION_ARM64_DATA{.ec = ec};\n    }\n\n    // Looks like the module is always mapped in the 32-bit address space.\n    //\n    // \"[...] the address of wow64cpu!KiFastSystemCall is held in the 32-bit TEB\n    // (Thread Environment Block) via member WOW32Reserved\"\n    // https://cloud.google.com/blog/topics/threat-intelligence/wow64-subsystem-internals-and-hooking-techniques/\n    if (wow64cpu_base > std::numeric_limits<std::uint32_t>::max()) {\n        return CALL_FUNCTION_ARM64_DATA{\n            .ec = std::error_code(ERROR_INDEX_OUT_OF_BOUNDS,\n                                  std::system_category())};\n    }\n\n    std::uint64_t* pp_wow64_system_service_ex =\n        find_import_ptr_64(reinterpret_cast<HMODULE>(wow64cpu_base),\n                           \"wow64.dll\", \"Wow64SystemServiceEx\");\n    if (!pp_wow64_system_service_ex) {\n        return CALL_FUNCTION_ARM64_DATA{\n            .ec =\n                std::error_code(ERROR_PROC_NOT_FOUND, std::system_category())};\n    }\n\n    std::uint64_t p_wow64_system_service_ex_original =\n        *pp_wow64_system_service_ex;\n\n    DWORD dwOldProtect;\n    VirtualProtect(&wow64_system_service_ex.original,\n                   sizeof(wow64_system_service_ex.original), PAGE_READWRITE,\n                   &dwOldProtect);\n    wow64_system_service_ex.original = p_wow64_system_service_ex_original;\n    VirtualProtect(&wow64_system_service_ex.original,\n                   sizeof(wow64_system_service_ex.original), dwOldProtect,\n                   &dwOldProtect);\n\n    CRITICAL_SECTION critical_section;\n    InitializeCriticalSection(&critical_section);\n\n    return CALL_FUNCTION_ARM64_DATA{\n        .pp_wow64_transition = pp_wow64_transition,\n        .pp_wow64_system_service_ex = pp_wow64_system_service_ex,\n        .p_wow64_system_service_ex_original =\n            p_wow64_system_service_ex_original,\n        .critical_section = critical_section,\n    };\n}\n\ninline CALL_FUNCTION_ARM64_DATA* get_call_function_arm64_data() noexcept {\n    WOW64PP_STATIC_INIT_ONCE_TRIVIAL(std::optional<CALL_FUNCTION_ARM64_DATA>,\n                                     function_result,\n                                     make_initial_call_function_arm64_data());\n    return &*function_result;\n}\n\ntemplate <class... Args>\ninline std::uint64_t call_function_arm64(std::error_code& ec,\n                                         std::uint64_t func,\n                                         Args... args) noexcept {\n    CALL_FUNCTION_ARM64_DATA* data = get_call_function_arm64_data();\n    ec = data->ec;\n    if (ec) {\n        return 0xFFFFFFFFFFFFFFFF;\n    }\n\n    // Some unique SystemCallNumber (bits 1-12), zero ServiceTableIndex (13-16\n    // bits), zero TurboThunkNumber (bits 17-21).\n    std::uint32_t syscall_num = 0x0FEA;\n\n    std::uint64_t arr_args[sizeof...(args) > 1 ? sizeof...(args) : 1] = {\n        (std::uint64_t)(args)...};\n\n    struct {\n        std::uint64_t signature;\n        std::uint64_t func;\n        std::uint64_t args_count;\n        std::uint64_t args;\n        std::uint64_t called;\n        std::uint64_t ret;\n    } wow64_system_service_ex_param{\n        .signature = 0x89E3E9BE43908223,\n        .func = func,\n        .args_count = sizeof...(Args),\n        .args = reinterpret_cast<std::uint64_t>(arr_args),\n    };\n\n    void** pp_wow64_transition = data->pp_wow64_transition;\n    std::uint64_t* pp_wow64_system_service_ex =\n        data->pp_wow64_system_service_ex;\n    std::uint64_t p_wow64_system_service_ex_original =\n        data->p_wow64_system_service_ex_original;\n\n    EnterCriticalSection(&data->critical_section);\n    if (data->call_count == 0) {\n        DWORD dwOldProtect;\n        VirtualProtect(pp_wow64_system_service_ex,\n                       sizeof(*pp_wow64_system_service_ex), PAGE_READWRITE,\n                       &dwOldProtect);\n        *pp_wow64_system_service_ex =\n            reinterpret_cast<std::uint64_t>(wow64_system_service_ex.hook);\n        VirtualProtect(pp_wow64_system_service_ex,\n                       sizeof(*pp_wow64_system_service_ex), dwOldProtect,\n                       &dwOldProtect);\n    }\n    data->call_count++;\n    LeaveCriticalSection(&data->critical_section);\n\n    using shellcode_syscall_via_fastcall_sig =\n        void(__fastcall*)(std::uint32_t, void*, void*);\n\n    reinterpret_cast<shellcode_syscall_via_fastcall_sig>(\n        &shellcode_syscall_via_fastcall)(syscall_num, *pp_wow64_transition,\n                                         &wow64_system_service_ex_param);\n\n    EnterCriticalSection(&data->critical_section);\n    data->call_count--;\n    if (data->call_count == 0) {\n        DWORD dwOldProtect;\n        VirtualProtect(pp_wow64_system_service_ex,\n                       sizeof(*pp_wow64_system_service_ex), PAGE_READWRITE,\n                       &dwOldProtect);\n        *pp_wow64_system_service_ex = p_wow64_system_service_ex_original;\n        VirtualProtect(pp_wow64_system_service_ex,\n                       sizeof(*pp_wow64_system_service_ex), dwOldProtect,\n                       &dwOldProtect);\n    }\n    LeaveCriticalSection(&data->critical_section);\n\n    if (!wow64_system_service_ex_param.called) {\n        __fastfail(FAST_FAIL_FATAL_APP_EXIT);\n    }\n\n    return wow64_system_service_ex_param.ret;\n}\n\ninline std::uint16_t get_native_machine(std::error_code& ec) noexcept {\n    using native_machine_result_t =\n        std::expected<std::uint16_t, std::error_code>;\n    WOW64PP_STATIC_INIT_ONCE_TRIVIAL(\n        native_machine_result_t, native_machine,\n        ([]() -> native_machine_result_t {\n            using is_wow64_process2_t =\n                BOOL(WINAPI*)(HANDLE hProcess, USHORT * pProcessMachine,\n                              USHORT * pNativeMachine);\n\n            is_wow64_process2_t is_wow64_process2 = nullptr;\n            const auto kernel32_addr = GetModuleHandleW(L\"kernel32.dll\");\n            if (kernel32_addr) {\n                is_wow64_process2 = reinterpret_cast<is_wow64_process2_t>(\n                    GetProcAddress(kernel32_addr, \"IsWow64Process2\"));\n            }\n\n            if (is_wow64_process2) {\n                std::uint16_t process_machine = 0;\n                std::uint16_t native_machine = 0;\n                if (is_wow64_process2(GetCurrentProcess(), &process_machine,\n                                      &native_machine)) {\n                    return native_machine;\n                }\n\n                return std::unexpected(get_last_error());\n            }\n\n            BOOL is_wow64_process = FALSE;\n            if (IsWow64Process(GetCurrentProcess(), &is_wow64_process)) {\n                // Assume AMD64 if WOW64 process, not sure if it can be anything\n                // else in this case.\n                return is_wow64_process ? IMAGE_FILE_MACHINE_AMD64\n                                        : IMAGE_FILE_MACHINE_I386;\n            }\n\n            return std::unexpected(get_last_error());\n        }()));\n    if (!native_machine.has_value()) {\n        ec = native_machine.error();\n        return IMAGE_FILE_MACHINE_UNKNOWN;\n    }\n\n    ec.clear();\n    return *native_machine;\n}\n\n}  // namespace detail\n\n/** \\brief Calls a 64 bit function from 32 bit process\n *   \\param[out] ec An error code that will be set in case of failure.\n *   \\param[in] func The address of 64 bit function to be called.\n *   \\param[in] args... The arguments for the function to be called.\n *   \\return    The return value of the called function.\n *   \\exception Does not throw.\n */\ntemplate <class... Args>\ninline std::uint64_t call_function(std::error_code& ec,\n                                   std::uint64_t func,\n                                   Args... args) noexcept {\n    auto native_machine = detail::get_native_machine(ec);\n    if (ec) {\n        return 0;\n    }\n\n    switch (native_machine) {\n        case IMAGE_FILE_MACHINE_AMD64:\n            return detail::call_function_x64(func, args...);\n        case IMAGE_FILE_MACHINE_ARM64:\n            return detail::call_function_arm64(ec, func, args...);\n        default:\n            ec = std::error_code(ERROR_NOT_SUPPORTED, std::system_category());\n            return 0;\n    }\n}\n\n/** \\brief Calls a 64 bit function from 32 bit process\n *   \\param[in] func The address of 64 bit function to be called.\n *   \\param[in] args... The arguments for the function to be called.\n *   \\return    The return value of the called function.\n *   \\exception Throws std::system_error on failure.\n */\ntemplate <class... Args>\ninline std::uint64_t call_function(std::uint64_t func, Args... args) {\n    std::error_code ec;\n    std::uint64_t result = call_function(ec, func, args...);\n    if (ec) {\n        detail::throw_error_code(ec);\n    }\n\n    return result;\n}\n\n/** \\brief Use to pass pointers as arguments to call_function.\n *   \\param[in] ptr The pointer.\n *   \\return    The 64 bit integer argument.\n *   \\exception Does not throw.\n */\ntemplate <typename T>\ninline std::uint64_t ptr_to_uint64(T* ptr) noexcept {\n    static_assert(sizeof(ptr) == sizeof(std::uint32_t),\n                  \"expecting 32-bit pointers\");\n\n    // Without the double casting, the pointer is sign extended, not zero\n    // extended, which leads to invalid addresses with /LARGEADDRESSAWARE.\n    return static_cast<std::uint64_t>(reinterpret_cast<std::uint32_t>(ptr));\n}\n\n/** \\brief Use to pass handles as arguments to call_function.\n *   \\param[in] ptr The handle.\n *   \\return    The 64 bit integer argument.\n *   \\exception Does not throw.\n */\ninline std::uint64_t handle_to_uint64(HANDLE handle) noexcept {\n    static_assert(sizeof(handle) == sizeof(std::int32_t),\n                  \"expecting 32-bit handles\");\n\n    // Sign-extension is required for pseudo handles such as the handle returned\n    // from GetCurrentProcess().\n    // \"64-bit versions of Windows use 32-bit handles for interoperability [...]\n    // it is safe to [...] sign-extend the handle (when passing it from 32-bit\n    // to 64-bit).\"\n    // https://docs.microsoft.com/en-us/windows/win32/winprog64/interprocess-communication\n    return static_cast<std::uint64_t>(reinterpret_cast<std::int32_t>(handle));\n}\n\nnamespace detail {\n\ninline std::uint64_t get_cached_ldr_procedure_address(\n    std::error_code& ec) noexcept {\n    using ldr_result_t = std::expected<std::uint64_t, std::error_code>;\n    WOW64PP_STATIC_INIT_ONCE_TRIVIAL(\n        ldr_result_t, ldr_result, ([]() -> ldr_result_t {\n            std::error_code ec;\n            const auto ldr_result = ldr_procedure_address(ec);\n            if (ec)\n                return std::unexpected(ec);\n            return ldr_result;\n        }()));\n    if (!ldr_result.has_value()) {\n        ec = ldr_result.error();\n        return 0;\n    }\n\n    ec.clear();\n    return *ldr_result;\n}\n\n}  // namespace detail\n\n/** \\brief An equivalent of winapi GetProcAddress function.\n *   \\param[in] hmodule The handle to the module in which to search for the\n                procedure.\n *   \\param[in] procedure_name The name of the procedure to be searched for.\n *   \\return    The address of the exported function or variable.\n *   \\exception Throws std::system_error on failure.\n */\ninline std::uint64_t import(std::uint64_t hmodule,\n                            std::string_view procedure_name) {\n    std::error_code ec;\n    const auto ldr_procedure_address_base =\n        detail::get_cached_ldr_procedure_address(ec);\n    if (ec) {\n        detail::throw_error_code(ec);\n    }\n\n    defs::UNICODE_STRING_64 unicode_fun_name{\n        .Length = static_cast<std::uint16_t>(procedure_name.size()),\n        .MaximumLength = static_cast<std::uint16_t>(procedure_name.size()),\n        .Buffer = ptr_to_uint64(procedure_name.data()),\n    };\n\n    std::uint64_t ret = 0;\n    auto fn_ret =\n        call_function(ldr_procedure_address_base, hmodule,\n                      ptr_to_uint64(&unicode_fun_name), 0, ptr_to_uint64(&ret));\n    if (fn_ret) {\n        throw std::system_error(\n            std::error_code(static_cast<int>(fn_ret), std::system_category()),\n            \"call_function(ldr_procedure_address_base...) failed\");\n    }\n\n    return ret;\n}\n\n/** \\brief An equivalent of winapi GetProcAddress function.\n *   \\param[in]  hmodule The handle to the module in which to search for the\n                 procedure.\n *   \\param[in]  procedure_name The name of the procedure to be searched for.\n *   \\param[out] ec An error code that will be set in case of failure\n *   \\return     The address of the exported function or variable.\n *   \\exception  Does not throw.\n */\ninline std::uint64_t import(std::uint64_t hmodule,\n                            std::string_view procedure_name,\n                            std::error_code& ec) noexcept {\n    const auto ldr_procedure_address_base =\n        detail::get_cached_ldr_procedure_address(ec);\n    if (ec) {\n        return 0;\n    }\n\n    defs::UNICODE_STRING_64 unicode_fun_name{\n        .Length = static_cast<std::uint16_t>(procedure_name.size()),\n        .MaximumLength = static_cast<std::uint16_t>(procedure_name.size()),\n        .Buffer = ptr_to_uint64(procedure_name.data()),\n    };\n\n    std::uint64_t ret = 0;\n    auto fn_ret =\n        call_function(ec, ldr_procedure_address_base, hmodule,\n                      ptr_to_uint64(&unicode_fun_name), 0, ptr_to_uint64(&ret));\n    if (ec) {\n        return 0;\n    }\n\n    if (fn_ret) {\n        ec = std::error_code(static_cast<int>(fn_ret), std::system_category());\n        return 0;\n    }\n\n    return ret;\n}\n\n}  // namespace wow64pp\n\n#endif  // WOW64PP_HPP\n"
  },
  {
    "path": "src/windhawk/engine/logger.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"logger.h\"\n#include \"storage_manager.h\"\n#include \"var_init_once.h\"\n\nnamespace {\n\nLogger::Verbosity GetVerbosityFromConfig() {\n    try {\n        auto settings = StorageManager::GetInstance().GetAppConfig(L\"Settings\");\n        int verbosity = settings->GetInt(L\"LoggingVerbosity\").value_or(0);\n\n        switch (verbosity) {\n            case static_cast<int>(Logger::Verbosity::kOff):\n                return Logger::Verbosity::kOff;\n\n            case static_cast<int>(Logger::Verbosity::kOn):\n                return Logger::Verbosity::kOn;\n\n            case static_cast<int>(Logger::Verbosity::kVerbose):\n                return Logger::Verbosity::kVerbose;\n        }\n    } catch (const std::exception&) {\n        // Ignore and use default settings. We can't log it, anyway.\n    }\n\n    return Logger::kDefaultVerbosity;\n}\n\n}  // namespace\n\nLogger::ScopedThreadVerbosity::ScopedThreadVerbosity(Verbosity verbosity) {\n    m_inUse = GetInstance().SetThreadVerbosity(verbosity);\n}\n\nLogger::ScopedThreadVerbosity::~ScopedThreadVerbosity() {\n    if (m_inUse) {\n        GetInstance().ResetThreadVerbosity();\n    }\n}\n\nLogger::Logger(Verbosity initialVerbosity)\n    : m_initialVerbosity(initialVerbosity), LoggerBase(initialVerbosity) {}\n\n// static\nLogger& Logger::GetInstance() {\n    STATIC_INIT_ONCE(Logger, s, GetVerbosityFromConfig());\n    return *s;\n}\n\nbool Logger::ShouldLog(Verbosity verbosity) {\n    auto& threadVerbosity = GetThreadVerbosity();\n    return threadVerbosity ? *threadVerbosity >= verbosity\n                           : m_initialVerbosity >= verbosity;\n}\n\n// static\nstd::optional<Logger::Verbosity>& Logger::GetThreadVerbosity() {\n    STATIC_INIT_ONCE(ThreadLocal<std::optional<Verbosity>>, s);\n    return *s;\n}\n\nbool Logger::SetThreadVerbosity(Verbosity verbosity) {\n    auto& threadVerbosity = GetThreadVerbosity();\n    if (threadVerbosity) {\n        // Only one ScopedThreadVerbosity is supported at a time.\n        return false;\n    }\n\n    threadVerbosity = verbosity;\n\n    std::lock_guard guard(m_threadVerbosityMutex);\n\n    m_threadVerbosityCount++;\n\n    if (GetVerbosity() < verbosity) {\n        SetVerbosity(verbosity);\n    }\n\n    return true;\n}\n\nvoid Logger::ResetThreadVerbosity() {\n    auto& threadVerbosity = GetThreadVerbosity();\n    threadVerbosity.reset();\n\n    std::lock_guard guard(m_threadVerbosityMutex);\n\n    if (--m_threadVerbosityCount == 0) {\n        SetVerbosity(m_initialVerbosity);\n    }\n}\n"
  },
  {
    "path": "src/windhawk/engine/logger.h",
    "content": "#pragma once\n\n#include \"logger_base.h\"\n\nclass Logger : public LoggerBase {\n   public:\n    // Use to temporarily change the verbosity of the current thread.\n    class ScopedThreadVerbosity {\n       public:\n        ScopedThreadVerbosity(Verbosity verbosity);\n        ~ScopedThreadVerbosity();\n\n        ScopedThreadVerbosity(const ScopedThreadVerbosity&) = delete;\n        ScopedThreadVerbosity(ScopedThreadVerbosity&&) = delete;\n        ScopedThreadVerbosity& operator=(const ScopedThreadVerbosity&) = delete;\n        ScopedThreadVerbosity& operator=(ScopedThreadVerbosity&&) = delete;\n\n       private:\n        bool m_inUse = false;\n    };\n\n    Logger(Verbosity initialVerbosity);\n\n    static Logger& GetInstance();\n\n    bool ShouldLog(Verbosity verbosity);\n\n   private:\n    static std::optional<Verbosity>& GetThreadVerbosity();\n    bool SetThreadVerbosity(Verbosity verbosity);\n    void ResetThreadVerbosity();\n\n    const std::atomic<Verbosity> m_initialVerbosity;\n    std::mutex m_threadVerbosityMutex;\n    int m_threadVerbosityCount = 0;\n};\n\n#define LOG_WITH_VERBOSITY(verbosity, message, ...)                          \\\n    do {                                                                     \\\n        auto& inst = Logger::GetInstance();                                  \\\n        if (inst.GetVerbosity() >= verbosity && inst.ShouldLog(verbosity)) { \\\n            inst.LogLine(L\"[WH] [%S]: \" message L\"\\n\", __FUNCTION__,         \\\n                         __VA_ARGS__);                                       \\\n        }                                                                    \\\n    } while (0)\n\n#define LOG(message, ...) \\\n    LOG_WITH_VERBOSITY(Logger::Verbosity::kOn, message, __VA_ARGS__)\n#define VERBOSE(message, ...) \\\n    LOG_WITH_VERBOSITY(Logger::Verbosity::kVerbose, message, __VA_ARGS__)\n"
  },
  {
    "path": "src/windhawk/engine/main.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"all_processes_injector.h\"\n#include \"customization_session.h\"\n#include \"dll_inject.h\"\n#include \"logger.h\"\n#include \"no_destructor.h\"\n#include \"storage_manager.h\"\n\nHINSTANCE g_hDllInst;\n\nBOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {\n    switch (fdwReason) {\n        case DLL_PROCESS_ATTACH:\n            g_hDllInst = hinstDLL;\n            break;\n\n        case DLL_THREAD_ATTACH:\n        case DLL_THREAD_DETACH:\n            break;\n\n        case DLL_PROCESS_DETACH:\n            // From the documentation: If the process is terminating (the\n            // lpvReserved parameter is non-NULL), all threads in the process\n            // except the current thread either have exited already or have been\n            // explicitly terminated by a call to the ExitProcess function.\n            if (lpvReserved) {\n                NoDestructorIfTerminatingBase::SetProcessTerminating();\n            }\n            break;\n    }\n\n    return TRUE;\n}\n\nbool LazyInitialize() {\n    try {\n        // Make sure we can get an instance.\n        // If not, this call will throw an exception.\n        StorageManager::GetInstance();\n        return true;\n    } catch (const std::exception& e) {\n        LOG(L\"Initialization failed: %S\", e.what());\n        return false;\n    }\n}\n\n// Exported\nBOOL InjectInit(const DllInject::LOAD_LIBRARY_REMOTE_DATA* pInjData) {\n    if (!LazyInitialize()) {\n        return FALSE;\n    }\n\n    VERBOSE(L\"Running InjectInit\");\n\n    if (WaitForSingleObject(pInjData->hSessionManagerProcess, 0) ==\n        WAIT_OBJECT_0) {\n        VERBOSE(L\"Session manager process is no longer running\");\n        return FALSE;\n    }\n\n    // Acquire handles to make sure we'll close them and not the caller, since\n    // we return TRUE from now on.\n    wil::unique_process_handle sessionManagerProcess(\n        pInjData->hSessionManagerProcess);\n    wil::unique_mutex_nothrow sessionMutex(pInjData->hSessionMutex);\n\n    try {\n        CustomizationSession::Start(\n            pInjData->bRunningFromAPC, pInjData->bThreadAttachExempt,\n            std::move(sessionManagerProcess), std::move(sessionMutex));\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n\n    return TRUE;\n}\n\n// Exported\nHANDLE GlobalHookSessionStart() {\n// Only used by the x86 background process.\n#ifdef _M_IX86\n    if (!LazyInitialize()) {\n        return nullptr;\n    }\n\n    VERBOSE(L\"Running GlobalHookSessionStart\");\n\n    try {\n        return static_cast<HANDLE>(new AllProcessesInjector());\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n#endif  // _M_IX86\n\n    return nullptr;\n}\n\n// Exported\nBOOL GlobalHookSessionHandleNewProcesses(HANDLE hSession) {\n#ifdef _M_IX86\n    if (!LazyInitialize()) {\n        return FALSE;\n    }\n\n    // VERBOSE(L\"Running GlobalHookSessionHandleNewProcesses\");\n\n    auto allProcessInjector = static_cast<AllProcessesInjector*>(hSession);\n    allProcessInjector->InjectIntoNewProcesses();\n    return TRUE;\n#else\n\treturn FALSE;\n#endif  // _M_IX86\n}\n\n// Exported\nBOOL GlobalHookSessionEnd(HANDLE hSession) {\n#ifdef _M_IX86\n    if (!LazyInitialize()) {\n        return FALSE;\n    }\n\n    VERBOSE(L\"Running GlobalHookSessionEnd\");\n\n    auto allProcessInjector = static_cast<AllProcessesInjector*>(hSession);\n    delete allProcessInjector;\n\n    return TRUE;\n#else\n    return FALSE;\n#endif  // _M_IX86\n}\n"
  },
  {
    "path": "src/windhawk/engine/mod.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"customization_session.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"mod.h\"\n#include \"process_lists.h\"\n#include \"session_private_namespace.h\"\n#include \"storage_manager.h\"\n#include \"symbol_enum.h\"\n#include \"version.h\"\n\nextern HINSTANCE g_hDllInst;\n\nnamespace {\n\nconst PCWSTR emptySettingStringValue = L\"\";\n\nclass ModDebugLoggingScope {\n   public:\n    ModDebugLoggingScope(PCSTR funcName)\n        : m_funcName(funcName),\n          m_scopedThreadVerbosity(Logger::Verbosity::kVerbose) {\n        if (m_funcName) {\n            VERBOSE(L\">>> Entering %S\", m_funcName);\n        }\n    }\n\n    ~ModDebugLoggingScope() {\n        if (m_funcName) {\n            VERBOSE(L\"<<< Exiting %S\", m_funcName);\n        }\n    }\n\n    ModDebugLoggingScope(const ModDebugLoggingScope&) = delete;\n    ModDebugLoggingScope(ModDebugLoggingScope&&) = delete;\n    ModDebugLoggingScope& operator=(const ModDebugLoggingScope&) = delete;\n    ModDebugLoggingScope& operator=(ModDebugLoggingScope&&) = delete;\n\n   private:\n    PCSTR m_funcName;\n    Logger::ScopedThreadVerbosity m_scopedThreadVerbosity;\n};\n\nclass ModDebugLoggingScopeHelper {\n   public:\n    ModDebugLoggingScopeHelper(bool debugLoggingEnabled, PCSTR funcName) {\n        if (debugLoggingEnabled) {\n            m_modDebugLoggingScope.emplace(funcName);\n        }\n    }\n\n   private:\n    std::optional<ModDebugLoggingScope> m_modDebugLoggingScope;\n};\n\n// Causes all events to be logged in that scope. Prints \"entering\" and \"exiting\"\n// messages on start/end.\n#define MOD_DEBUG_LOGGING_SCOPE() \\\n    ModDebugLoggingScopeHelper(m_debugLoggingEnabled, __FUNCTION__)\n\n// Same as above, but without the \"entering\" and \"exiting\" messages.\n#define MOD_DEBUG_LOGGING_SCOPE_QUIET() \\\n    ModDebugLoggingScopeHelper(m_debugLoggingEnabled, nullptr)\n\nclass CrossModMutex {\n   public:\n    CrossModMutex(PCWSTR mutexIdentifier) {\n        try {\n            m_mutex.reset(CreateSymbolLoadLockMutex(mutexIdentifier, FALSE));\n        } catch (const std::exception& e) {\n            LOG(L\"%S\", e.what());\n        }\n    }\n\n    operator bool() const { return !!m_mutex; }\n\n    bool Acquire(DWORD milliseconds = INFINITE) {\n        m_mutexLock = m_mutex.acquire(nullptr, milliseconds);\n        return !!m_mutexLock;\n    }\n\n   private:\n    HANDLE CreateSymbolLoadLockMutex(PCWSTR mutexIdentifier,\n                                     BOOL initialOwner) {\n        DWORD dwSessionManagerProcessId =\n            CustomizationSession::GetSessionManagerProcessId();\n\n        WCHAR sessionPrivateNamespaceName\n            [SessionPrivateNamespace::kPrivateNamespaceMaxLen + 1];\n        SessionPrivateNamespace::MakeName(sessionPrivateNamespaceName,\n                                          dwSessionManagerProcessId);\n\n        std::wstring mutexName = sessionPrivateNamespaceName;\n        mutexName += L'\\\\';\n        mutexName += mutexIdentifier;\n\n        wil::unique_hlocal secDesc;\n        THROW_IF_WIN32_BOOL_FALSE(\n            Functions::GetFullAccessSecurityDescriptor(&secDesc, nullptr));\n\n        SECURITY_ATTRIBUTES secAttr{\n            .nLength = sizeof(secAttr),\n            .lpSecurityDescriptor = secDesc.get(),\n            .bInheritHandle = FALSE,\n        };\n\n        wil::unique_mutex_nothrow mutex(\n            CreateMutex(&secAttr, initialOwner, mutexName.c_str()));\n        THROW_LAST_ERROR_IF_NULL(mutex);\n\n        return mutex.release();\n    }\n\n    wil::unique_mutex_nothrow m_mutex;\n    wil::mutex_release_scope_exit m_mutexLock;\n};\n\nstd::wstring GenerateModInstanceId(PCWSTR modName) {\n    DWORD sessionManagerProcessId =\n        CustomizationSession::GetSessionManagerProcessId();\n\n    FILETIME sessionManagerProcessCreationTime =\n        CustomizationSession::GetSessionManagerProcessCreationTime();\n\n    return std::to_wstring(sessionManagerProcessId) + L\"_\" +\n           std::to_wstring(\n               wil::filetime::to_int64(sessionManagerProcessCreationTime)) +\n           L\"_\" + std::to_wstring(GetCurrentProcessId()) + L\"_\" + modName;\n}\n\nvoid SetModMetadataValue(wil::unique_hfile& metadataFile,\n                         PCWSTR value,\n                         PCWSTR metadataCategory,\n                         PCWSTR modInstanceId) {\n    if (!value) {\n        metadataFile.reset();\n        return;\n    }\n\n    auto& storageManager = StorageManager::GetInstance();\n\n    if (!metadataFile) {\n        metadataFile = storageManager.CreateModMetadataFile(metadataCategory,\n                                                            modInstanceId);\n    }\n\n    std::filesystem::path fullProcessImageName =\n        wil::QueryFullProcessImageName<std::wstring>(GetCurrentProcess());\n    std::wstring fullValue =\n        fullProcessImageName.filename().native() + L'|' + value;\n\n    storageManager.SetModMetadataValue(metadataFile, fullValue.c_str());\n}\n\nbool DoesArchitectureMatchPatternPart(std::wstring_view patternPart) {\n#if defined(_M_IX86)\n    if (patternPart == L\"x86\") {\n        return true;\n    }\n#elif defined(_M_X64)\n    // For now, x86-64 matches both x64 and ARM64.\n    if (patternPart == L\"x86-64\" || patternPart == L\"amd64\") {\n        return true;\n    }\n#elif defined(_M_ARM64)\n    // For now, x86-64 matches both x64 and ARM64.\n    if (patternPart == L\"x86-64\" || patternPart == L\"arm64\") {\n        return true;\n    }\n#else\n#error \"Unsupported architecture\"\n#endif\n\n    return false;\n}\n\nbool DoesArchitectureMatchPattern(std::wstring_view pattern) {\n    for (const auto& patternPart :\n         Functions::SplitStringToViews(pattern, L'|')) {\n        if (DoesArchitectureMatchPatternPart(patternPart)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nstd::wstring GetModVersion(PCWSTR modName) {\n    auto settings =\n        StorageManager::GetInstance().GetModConfig(modName, nullptr);\n\n    return settings->GetString(L\"Version\").value_or(L\"-\");\n}\n\n// Temporary compatibility code.\nbool ShouldUseCompatDemangling(wil::zwstring_view modName) {\n    struct {\n        std::wstring_view modNamePrefix;\n        std::vector<std::wstring_view> versions;\n    } compatMods[] = {\n        {L\"start-menu-all-apps\", {L\"1.0\", L\"1.0.1\"}},\n        {L\"taskbar-button-click\", {L\"1.0\", L\"1.0.1\"}},\n        {L\"taskbar-clock-customization\",\n         {L\"1.0\", L\"1.0.1\", L\"1.0.2\", L\"1.0.3\", L\"1.0.4\", L\"1.0.5\"}},\n        {L\"taskbar-grouping\", {L\"1.0\"}},\n        {L\"taskbar-icon-size\", {L\"1.0\", L\"1.0.1\", L\"1.0.2\"}},\n        {L\"taskbar-labels\", {L\"1.0\", L\"1.0.1\", L\"1.0.2\", L\"1.0.3\"}},\n        {L\"taskbar-thumbnail-reorder\", {L\"1.0\", L\"1.0.1\", L\"1.0.2\"}},\n    };\n\n    for (const auto& compatMod : compatMods) {\n        if (modName == compatMod.modNamePrefix ||\n            (modName.starts_with(L\"local@\") &&\n             modName.substr(6).starts_with(compatMod.modNamePrefix))) {\n            auto modVersion = GetModVersion(modName.c_str());\n            if (modVersion == L\"-\") {\n                return true;\n            }\n\n            for (const auto& compatModVersion : compatMod.versions) {\n                if (modVersion == compatModVersion) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    }\n\n    return false;\n}\n\nbool IsModBanned(wil::zwstring_view modName) {\n    bool banned = false;\n\n#if defined(_M_IX86)\n    constexpr std::wstring_view kX86 =\n        L\"Not loading an incompatible mod: \"\n        L\"https://github.com/ramensoftware/windhawk-mods/issues/1878\";\n\n    struct {\n        std::wstring_view modName;\n        std::vector<std::wstring_view> versions;\n        std::wstring_view reason;\n    } incompatibleMods[] = {\n        // Incompatible with 32-bit programs, caused by a missing calling\n        // convention.\n        // https://github.com/ramensoftware/windhawk-mods/issues/1878\n        {L\"no-hidden-cursor\", {L\"1.0.0\"}, kX86},\n        {L\"no-focus-rectangle\", {L\"1.0.0\", L\"1.0.1\", L\"1.0.2\"}, kX86},\n        {L\"disable-office-hotkeys\", {L\"1.0.0\"}, kX86},\n        {L\"disable-feedback-hub-hotkey\", {L\"1.0.0\"}, kX86},\n    };\n\n    std::wstring_view reason;\n\n    for (const auto& incompatibleMod : incompatibleMods) {\n        if (modName == incompatibleMod.modName) {\n            auto modVersion = GetModVersion(modName.c_str());\n            if (modVersion == L\"-\") {\n                banned = true;\n                reason = incompatibleMod.reason;\n                break;\n            }\n\n            for (const auto& compatModVersion : incompatibleMod.versions) {\n                if (modVersion == compatModVersion) {\n                    banned = true;\n                    reason = incompatibleMod.reason;\n                    break;\n                }\n            }\n\n            break;\n        }\n    }\n\n    if (banned && !reason.empty()) {\n        LOG(L\"%.*s\", wil::safe_cast<int>(reason.length()), reason.data());\n    }\n#endif  // defined(_M_IX86)\n\n    return banned;\n}\n\nwil::unique_hmodule SetModShimsLibraryIfNeeded(HMODULE mod) {\n    constexpr WCHAR kShimLibraryFileName[] = L\"windhawk-mod-shim.dll\";\n    wil::unique_hmodule shimModule;\n\n    auto patchFunction = [](void* patchTarget, void* newCallTarget) {\n#if defined(_M_X64)\n#pragma pack(push, 1)\n        // 64-bit indirect absolute jump.\n        typedef struct _JMP_ABS {\n            UINT8 opcode0;  // FF25 00000000: JMP [+6]\n            UINT8 opcode1;\n            UINT32 dummy;\n            UINT64 address;  // Absolute destination address\n        } JMP_ABS, *PJMP_ABS;\n#pragma pack(pop)\n\n        JMP_ABS* pJmp = (JMP_ABS*)patchTarget;\n\n        DWORD dwOldProtect;\n        THROW_IF_WIN32_BOOL_FALSE(VirtualProtect(\n            pJmp, sizeof(*pJmp), PAGE_EXECUTE_READWRITE, &dwOldProtect));\n\n        pJmp->opcode0 = 0xFF;\n        pJmp->opcode1 = 0x25;\n        pJmp->dummy = 0x00000000;\n        pJmp->address = (UINT64)newCallTarget;\n\n        THROW_IF_WIN32_BOOL_FALSE(\n            VirtualProtect(pJmp, sizeof(*pJmp), dwOldProtect, &dwOldProtect));\n#elif defined(_M_IX86)\n#pragma pack(push, 1)\n        // 32-bit direct relative jump/call.\n        typedef struct _JMP_REL {\n            UINT8 opcode;    // E9/E8 xxxxxxxx: JMP/CALL +5+xxxxxxxx\n            UINT32 operand;  // Relative destination address\n        } JMP_REL, *PJMP_REL, CALL_REL;\n#pragma pack(pop)\n\n        JMP_REL* pJmp = (JMP_REL*)patchTarget;\n\n        DWORD dwOldProtect;\n        THROW_IF_WIN32_BOOL_FALSE(VirtualProtect(\n            pJmp, sizeof(*pJmp), PAGE_EXECUTE_READWRITE, &dwOldProtect));\n\n        pJmp->opcode = 0xE9;\n        pJmp->operand = (UINT32)((BYTE*)newCallTarget -\n                                 ((BYTE*)patchTarget + sizeof(JMP_REL)));\n\n        THROW_IF_WIN32_BOOL_FALSE(\n            VirtualProtect(pJmp, sizeof(*pJmp), dwOldProtect, &dwOldProtect));\n#elif defined(_M_ARM64)\n#pragma pack(push, 1)\n        // 64-bit indirect absolute jump.\n        typedef struct _JMP_ABS {\n            UINT32 cmd1;     // ldr x9, +8\n            UINT32 cmd2;     // br x9\n            UINT64 address;  // Absolute destination address\n        } JMP_ABS, *PJMP_ABS;\n#pragma pack(pop)\n\n        JMP_ABS* pJmp = (JMP_ABS*)patchTarget;\n\n        DWORD dwOldProtect;\n        THROW_IF_WIN32_BOOL_FALSE(VirtualProtect(\n            pJmp, sizeof(*pJmp), PAGE_EXECUTE_READWRITE, &dwOldProtect));\n\n        pJmp->cmd1 = 0x58000049;  // ldr x9, +8\n        pJmp->cmd2 = 0xd61f0120;  // br x9\n        pJmp->address = (UINT64)newCallTarget;\n\n        THROW_IF_WIN32_BOOL_FALSE(\n            VirtualProtect(pJmp, sizeof(*pJmp), dwOldProtect, &dwOldProtect));\n\n        FlushInstructionCache(GetCurrentProcess(), pJmp, sizeof(*pJmp));\n#else\n#error \"Unsupported architecture\"\n#endif\n    };\n\n#if defined(_M_X64) || defined(_M_ARM64)\n    // WindhawkUtils::HookSymbols(\n    //     HINSTANCE__*, WindhawkUtils::SYMBOL_HOOK const*, unsigned long long)\n    auto* hookSymbolsOld1 = GetProcAddress(\n        mod,\n        R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_11SYMBOL_HOOKEy)\");\n\n    // WindhawkUtils::HookSymbols(\n    //     HINSTANCE__*, WindhawkUtils::SYMBOL_HOOK const*, unsigned long long,\n    //     tagWH_FIND_SYMBOL_OPTIONS const*)\n    auto* hookSymbolsOld2 = GetProcAddress(\n        mod,\n        R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_11SYMBOL_HOOKEyPK25tagWH_FIND_SYMBOL_OPTIONS)\");\n\n    // HookSymbols(HINSTANCE__*, SYMBOL_HOOK const*, unsigned long long)\n    auto* localHookSymbols =\n        GetProcAddress(mod, R\"(_Z11HookSymbolsP11HINSTANCE__PK11SYMBOL_HOOKy)\");\n\n    // HookSymbolsWithOnlineCacheFallback(\n    //     HINSTANCE__*, SYMBOL_HOOK const*, unsigned long long)\n    auto* localHookSymbolsWithOnlineCacheFallback = GetProcAddress(\n        mod,\n        R\"(_Z34HookSymbolsWithOnlineCacheFallbackP11HINSTANCE__PK11SYMBOL_HOOKy)\");\n\n    // CmwfHookSymbols(\n    //     HINSTANCE__*, CMWF_SYMBOL_HOOK const*, unsigned long long)\n    auto* localCmwfHookSymbols = GetProcAddress(\n        mod, R\"(_Z15CmwfHookSymbolsP11HINSTANCE__PK16CMWF_SYMBOL_HOOKy)\");\n\n    if (!hookSymbolsOld1 && !hookSymbolsOld2 && !localHookSymbols &&\n        !localHookSymbolsWithOnlineCacheFallback && !localCmwfHookSymbols) {\n        return nullptr;\n    }\n\n    auto& storageManager = StorageManager::GetInstance();\n\n    auto libraryPath = storageManager.GetModsPath() / kShimLibraryFileName;\n\n    shimModule.reset(LoadLibraryEx(libraryPath.c_str(), nullptr,\n                                   LOAD_WITH_ALTERED_SEARCH_PATH));\n    if (!shimModule) {\n        return nullptr;\n    }\n\n    if (hookSymbolsOld1 || localHookSymbols ||\n        localHookSymbolsWithOnlineCacheFallback) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_17SYMBOL_HOOK_OLD_1Ey)\");\n        if (newCallTarget) {\n            if (hookSymbolsOld1) {\n                patchFunction(hookSymbolsOld1, newCallTarget);\n            }\n\n            if (localHookSymbols) {\n                patchFunction(localHookSymbols, newCallTarget);\n            }\n\n            if (localHookSymbolsWithOnlineCacheFallback) {\n                patchFunction(localHookSymbolsWithOnlineCacheFallback,\n                              newCallTarget);\n            }\n        }\n    }\n\n    if (hookSymbolsOld2) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_17SYMBOL_HOOK_OLD_2EyPKNS_29tagWH_FIND_SYMBOL_OPTIONS_OLDE)\");\n        if (newCallTarget) {\n            patchFunction(hookSymbolsOld2, newCallTarget);\n        }\n    }\n\n    if (localCmwfHookSymbols) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_Z15CmwfHookSymbolsP11HINSTANCE__PK16CMWF_SYMBOL_HOOKy)\");\n        if (newCallTarget) {\n            patchFunction(localCmwfHookSymbols, newCallTarget);\n        }\n    }\n#elif defined(_M_IX86)\n    // WindhawkUtils::HookSymbols(\n    //     HINSTANCE__*, WindhawkUtils::SYMBOL_HOOK const*, unsigned int)\n    auto* hookSymbolsOld1 = GetProcAddress(\n        mod,\n        R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_11SYMBOL_HOOKEj)\");\n\n    // WindhawkUtils::HookSymbols(\n    //     HINSTANCE__*, WindhawkUtils::SYMBOL_HOOK const*, unsigned int,\n    //     tagWH_FIND_SYMBOL_OPTIONS const*)\n    auto* hookSymbolsOld2 = GetProcAddress(\n        mod,\n        R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_11SYMBOL_HOOKEjPK25tagWH_FIND_SYMBOL_OPTIONS)\");\n\n    // HookSymbols(HINSTANCE__*, SYMBOL_HOOK const*, unsigned int)\n    auto* localHookSymbols =\n        GetProcAddress(mod, R\"(_Z11HookSymbolsP11HINSTANCE__PK11SYMBOL_HOOKj)\");\n\n    // CmwfHookSymbols(\n    //     HINSTANCE__*, CMWF_SYMBOL_HOOK const*, unsigned int)\n    auto* localCmwfHookSymbols = GetProcAddress(\n        mod, R\"(_Z15CmwfHookSymbolsP11HINSTANCE__PK16CMWF_SYMBOL_HOOKj)\");\n\n    if (!hookSymbolsOld1 && !hookSymbolsOld2 && !localHookSymbols &&\n        !localCmwfHookSymbols) {\n        return nullptr;\n    }\n\n    auto& storageManager = StorageManager::GetInstance();\n\n    auto libraryPath = storageManager.GetModsPath() / kShimLibraryFileName;\n\n    shimModule.reset(LoadLibraryEx(libraryPath.c_str(), nullptr,\n                                   LOAD_WITH_ALTERED_SEARCH_PATH));\n    if (!shimModule) {\n        return nullptr;\n    }\n\n    if (hookSymbolsOld1 || localHookSymbols) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_17SYMBOL_HOOK_OLD_1Ej)\");\n        if (newCallTarget) {\n            if (hookSymbolsOld1) {\n                patchFunction(hookSymbolsOld1, newCallTarget);\n            }\n\n            if (localHookSymbols) {\n                patchFunction(localHookSymbols, newCallTarget);\n            }\n        }\n    }\n\n    if (hookSymbolsOld2) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_ZN13WindhawkUtils11HookSymbolsEP11HINSTANCE__PKNS_17SYMBOL_HOOK_OLD_2EjPKNS_29tagWH_FIND_SYMBOL_OPTIONS_OLDE)\");\n        if (newCallTarget) {\n            patchFunction(hookSymbolsOld2, newCallTarget);\n        }\n    }\n\n    if (localCmwfHookSymbols) {\n        void* newCallTarget = GetProcAddress(\n            shimModule.get(),\n            R\"(_Z15CmwfHookSymbolsP11HINSTANCE__PK16CMWF_SYMBOL_HOOKj)\");\n        if (newCallTarget) {\n            patchFunction(localCmwfHookSymbols, newCallTarget);\n        }\n    }\n#else\n#error \"Unsupported architecture\"\n#endif\n\n    return shimModule;\n}\n\n// Checks whether the module is CHPE, ARM64EC or ARM64X.\nbool IsHybridModule(const IMAGE_DOS_HEADER* dosHeader,\n                    const IMAGE_NT_HEADERS* ntHeader) {\n    auto* opt = &ntHeader->OptionalHeader;\n\n    if (opt->NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG ||\n        !opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress) {\n        return false;\n    }\n\n    DWORD directorySize =\n        opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size;\n\n    auto* cfg =\n        (const IMAGE_LOAD_CONFIG_DIRECTORY*)((const char*)dosHeader +\n                                             opt->DataDirectory\n                                                 [IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]\n                                                     .VirtualAddress);\n\n    constexpr DWORD kMinSize =\n        offsetof(IMAGE_LOAD_CONFIG_DIRECTORY, CHPEMetadataPointer) +\n        sizeof(IMAGE_LOAD_CONFIG_DIRECTORY::CHPEMetadataPointer);\n\n    if (directorySize < kMinSize || cfg->Size < kMinSize) {\n        return false;\n    }\n\n    return cfg->CHPEMetadataPointer != 0;\n}\n\nclass HookSymbolsSession {\n   public:\n    HookSymbolsSession(LoadedMod* loadedMod,\n                       HMODULE module,\n                       const WH_SYMBOL_HOOK* symbolHooks,\n                       size_t symbolHooksCount)\n        : m_loadedMod(loadedMod), m_module(module) {\n        CalculateHookSymbolsInitialParams();\n\n        std::transform(symbolHooks, symbolHooks + symbolHooksCount,\n                       std::back_inserter(m_symbolHooksUnresolved),\n                       [](auto& elem) { return &elem; });\n    }\n\n    bool OnSymbolResolved(std::wstring_view symbol, void* address) {\n        auto it = std::find_if(\n            m_symbolHooksUnresolved.begin(), m_symbolHooksUnresolved.end(),\n            [&symbol](const auto* symbolHook) {\n                for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                    auto hookSymbol =\n                        std::wstring_view(symbolHook->symbols[s].string,\n                                          symbolHook->symbols[s].length);\n                    if (hookSymbol == symbol) {\n                        return true;\n                    }\n                }\n                return false;\n            });\n        if (it == m_symbolHooksUnresolved.end()) {\n            return false;\n        }\n\n        const auto* symbolHook = *it;\n\n        if (symbolHook->hookFunction) {\n            m_pendingHooks.emplace_back(address, symbolHook->hookFunction,\n                                        symbolHook->pOriginalFunction);\n            VERBOSE(L\"To be hooked %p: %.*s\", address,\n                    wil::safe_cast<int>(symbol.length()), symbol.data());\n        } else {\n            if (symbolHook->pOriginalFunction) {\n                *symbolHook->pOriginalFunction = address;\n            }\n            VERBOSE(L\"Found %p: %.*s\", address,\n                    wil::safe_cast<int>(symbol.length()), symbol.data());\n        }\n\n        m_newSystemCacheStr += m_cacheSep;\n        m_newSystemCacheStr += symbol;\n        m_newSystemCacheStr += m_cacheSep;\n        m_newSystemCacheStr +=\n            std::to_wstring((ULONG_PTR)address - (ULONG_PTR)m_module);\n\n        m_symbolHooksUnresolved.erase(it);\n        return true;\n    }\n\n    enum class ResolveSymbolsFromCacheResult {\n        kSuccess,\n        kError,\n        kNoCache,\n        kCachedErrorForThrottle,\n    };\n\n    ResolveSymbolsFromCacheResult ResolveSymbolsFromCache(\n        std::optional<ULONGLONG> cachedErrorForThrottleMaxTime) {\n        std::wstring cacheBuffer;\n        try {\n            auto symbolCache =\n                StorageManager::GetInstance().GetModWritableConfig(\n                    m_loadedMod->GetModName(), L\"SymbolCache\", false);\n            cacheBuffer =\n                symbolCache->GetString(m_cacheStrKey.c_str()).value_or(L\"\");\n            if (cacheBuffer.empty()) {\n                return ResolveSymbolsFromCacheResult::kNoCache;\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"%S\", e.what());\n            return ResolveSymbolsFromCacheResult::kError;\n        }\n\n        VERBOSE(L\"Using symbol cache %.*s: %.*s\",\n                wil::safe_cast<int>(m_cacheStrKey.length()),\n                m_cacheStrKey.data(), wil::safe_cast<int>(cacheBuffer.length()),\n                cacheBuffer.data());\n\n        if (cacheBuffer.starts_with(kErrorCachePrefix)) {\n            auto cacheBufferWithoutPrefix =\n                std::wstring_view(cacheBuffer).substr(kErrorCachePrefix.size());\n            auto cacheBufferParts = Functions::SplitStringToViews(\n                cacheBufferWithoutPrefix, kErrorCacheSep);\n            if (cacheBufferParts.size() < 4 ||\n                cacheBufferParts[0] != std::wstring_view(&kErrorCacheVer, 1)) {\n                return ResolveSymbolsFromCacheResult::kNoCache;\n            }\n\n            if (cacheBufferParts[1] !=\n                    std::to_wstring(\n                        CustomizationSession::GetSessionManagerProcessId()) ||\n                cacheBufferParts[2] !=\n                    std::to_wstring(wil::filetime::to_int64(\n                        CustomizationSession::\n                            GetSessionManagerProcessCreationTime()))) {\n                return ResolveSymbolsFromCacheResult::kNoCache;\n            }\n\n            ULONGLONG errorTime = std::wcstoull(\n                std::wstring(cacheBufferParts[3]).c_str(), nullptr, 10);\n\n            ULONGLONG currentTime =\n                wil::filetime::to_int64(wil::filetime::get_system_time());\n\n            if (cachedErrorForThrottleMaxTime &&\n                currentTime - errorTime <= *cachedErrorForThrottleMaxTime) {\n                return ResolveSymbolsFromCacheResult::kCachedErrorForThrottle;\n            }\n\n            return ResolveSymbolsFromCacheResult::kNoCache;\n        }\n\n        if (!ResolveSymbolsFromCacheString(cacheBuffer)) {\n            return ResolveSymbolsFromCacheResult::kNoCache;\n        }\n\n        return ResolveSymbolsFromCacheResult::kSuccess;\n    }\n\n    bool ResolveSymbolsFromCacheString(std::wstring_view cache) {\n        auto cacheParts = Functions::SplitStringToViews(cache, m_cacheSep);\n        return ResolveSymbolsFromCacheStringParts(cacheParts);\n    }\n\n    bool ResolveSymbolsFromCacheStringParts(\n        std::vector<std::wstring_view>& cacheParts) {\n        // In the new format, cacheParts[1] and cacheParts[2] are\n        // ignored and act like comments.\n        if (cacheParts.size() < 3 ||\n            cacheParts[0] != std::wstring_view(&kCacheVer, 1)) {\n            return false;\n        }\n\n        for (size_t i = 3; i + 1 < cacheParts.size(); i += 2) {\n            const auto& symbol = cacheParts[i];\n            const auto& address = cacheParts[i + 1];\n            if (address.length() == 0) {\n                continue;\n            }\n\n            void* addressPtr =\n                (void*)(std::wcstoull(std::wstring(address).c_str(), nullptr,\n                                      10) +\n                        (ULONG_PTR)m_module);\n\n            OnSymbolResolved(symbol, addressPtr);\n        }\n\n        std::erase_if(m_symbolHooksUnresolved, [this, &cacheParts](\n                                                   const auto* symbolHook) {\n            if (!symbolHook->optional) {\n                return false;\n            }\n\n            size_t noAddressMatchCount = 0;\n            for (size_t j = 3; j + 1 < cacheParts.size(); j += 2) {\n                const auto& symbol = cacheParts[j];\n                const auto& address = cacheParts[j + 1];\n                if (address.length() != 0) {\n                    continue;\n                }\n\n                for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                    auto hookSymbol =\n                        std::wstring_view(symbolHook->symbols[s].string,\n                                          symbolHook->symbols[s].length);\n                    if (hookSymbol == symbol) {\n                        noAddressMatchCount++;\n                        break;\n                    }\n                }\n            }\n\n            if (noAddressMatchCount != symbolHook->symbolsCount) {\n                return false;\n            }\n\n            VERBOSE(L\"Optional symbol doesn't exist (from cache)\");\n            for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                auto hookSymbol =\n                    std::wstring_view(symbolHook->symbols[s].string,\n                                      symbolHook->symbols[s].length);\n                VERBOSE(L\"    %.*s\", wil::safe_cast<int>(hookSymbol.length()),\n                        hookSymbol.data());\n            }\n\n            for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                auto hookSymbol =\n                    std::wstring_view(symbolHook->symbols[s].string,\n                                      symbolHook->symbols[s].length);\n                m_newSystemCacheStr += m_cacheSep;\n                m_newSystemCacheStr += hookSymbol;\n                m_newSystemCacheStr += m_cacheSep;\n            }\n\n            return true;  // Mark for removal.\n        });\n\n        return true;\n    }\n\n    bool UpdateSymbolsCache() {\n        try {\n            auto symbolCache =\n                StorageManager::GetInstance().GetModWritableConfig(\n                    m_loadedMod->GetModName(), L\"SymbolCache\", true);\n            symbolCache->SetString(m_cacheStrKey.c_str(),\n                                   m_newSystemCacheStr.c_str());\n            return true;\n        } catch (const std::exception& e) {\n            LOG(L\"%S\", e.what());\n        }\n\n        return false;\n    }\n\n    bool UpdateSymbolsCacheWithErrorForThrottle() {\n        auto errorForThrottleCacheStr = std::wstring(kErrorCachePrefix);\n        errorForThrottleCacheStr += kErrorCacheVer;\n\n        errorForThrottleCacheStr += kErrorCacheSep;\n        errorForThrottleCacheStr +=\n            std::to_wstring(CustomizationSession::GetSessionManagerProcessId());\n\n        errorForThrottleCacheStr += kErrorCacheSep;\n        errorForThrottleCacheStr += std::to_wstring(wil::filetime::to_int64(\n            CustomizationSession::GetSessionManagerProcessCreationTime()));\n\n        errorForThrottleCacheStr += kErrorCacheSep;\n        errorForThrottleCacheStr += std::to_wstring(\n            wil::filetime::to_int64(wil::filetime::get_system_time()));\n\n        errorForThrottleCacheStr += kErrorCacheSep;\n        errorForThrottleCacheStr += m_moduleFileName;\n        errorForThrottleCacheStr += L'-';\n        errorForThrottleCacheStr += m_timeStamp;\n        errorForThrottleCacheStr += L'-';\n        errorForThrottleCacheStr += m_imageSize;\n\n        try {\n            auto symbolCache =\n                StorageManager::GetInstance().GetModWritableConfig(\n                    m_loadedMod->GetModName(), L\"SymbolCache\", true);\n            symbolCache->SetString(m_cacheStrKey.c_str(),\n                                   errorForThrottleCacheStr.c_str());\n            return true;\n        } catch (const std::exception& e) {\n            LOG(L\"%S\", e.what());\n        }\n\n        return false;\n    }\n\n    void MarkUnresolvedSymbolsAsMissing() {\n        std::erase_if(m_symbolHooksUnresolved, [this](const auto* symbolHook) {\n            VERBOSE(L\"Unresolved symbol%s\",\n                    symbolHook->optional ? L\" (optional)\" : L\"\");\n            for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                auto hookSymbol =\n                    std::wstring_view(symbolHook->symbols[s].string,\n                                      symbolHook->symbols[s].length);\n                VERBOSE(L\"    %.*s\", wil::safe_cast<int>(hookSymbol.length()),\n                        hookSymbol.data());\n            }\n\n            if (!symbolHook->optional) {\n                return false;\n            }\n\n            for (size_t s = 0; s < symbolHook->symbolsCount; s++) {\n                auto hookSymbol =\n                    std::wstring_view(symbolHook->symbols[s].string,\n                                      symbolHook->symbols[s].length);\n                m_newSystemCacheStr += m_cacheSep;\n                m_newSystemCacheStr += hookSymbol;\n                m_newSystemCacheStr += m_cacheSep;\n            }\n\n            return true;  // Mark for removal.\n        });\n    }\n\n    bool IsTargetModuleHybrid() const { return m_isHybridModule; }\n\n    const std::wstring& GetCacheStrKey() const { return m_cacheStrKey; }\n\n    const std::wstring& GetTargetModuleFileName() const {\n        return m_moduleFileName;\n    }\n\n    bool AreAllSymbolsResolved() const {\n        return m_symbolHooksUnresolved.empty();\n    }\n\n    void ApplyPendingHooks() {\n        VERBOSE(L\"Applying hooks\");\n\n        for (const auto& hook : m_pendingHooks) {\n            m_loadedMod->SetFunctionHook(hook.targetFunction, hook.hookFunction,\n                                         hook.originalFunction);\n        }\n\n        m_pendingHooks.clear();\n    }\n\n   private:\n    void CalculateHookSymbolsInitialParams() {\n        HMODULE module = m_module;\n\n        std::filesystem::path modulePath =\n            wil::GetModuleFileName<std::wstring>(module);\n        auto moduleFileName = modulePath.filename().wstring();\n        LCMapStringEx(\n            LOCALE_NAME_USER_DEFAULT, LCMAP_LOWERCASE, &moduleFileName[0],\n            wil::safe_cast<int>(moduleFileName.length()), &moduleFileName[0],\n            wil::safe_cast<int>(moduleFileName.length()), nullptr, nullptr, 0);\n\n        VERBOSE(L\"Module: %p\", module);\n        VERBOSE(L\"Path: %s\", modulePath.c_str());\n        VERBOSE(L\"Version: %S\", Functions::GetModuleVersion(module).c_str());\n\n        IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)module;\n        IMAGE_NT_HEADERS* ntHeader =\n            (IMAGE_NT_HEADERS*)((BYTE*)dosHeader + dosHeader->e_lfanew);\n        auto timeStamp = std::to_wstring(ntHeader->FileHeader.TimeDateStamp);\n        auto imageSize = std::to_wstring(ntHeader->OptionalHeader.SizeOfImage);\n\n        bool isHybridModule = IsHybridModule(dosHeader, ntHeader);\n\n        std::wstring cacheStrKey;\n\n        constexpr WCHAR currentArch[] =\n#if defined(_M_IX86)\n            L\"x86\";\n#elif defined(_M_X64)\n            L\"x86-64\";\n#elif defined(_M_ARM64)\n            L\"arm64\";\n#else\n#error \"Unsupported architecture\"\n#endif\n\n        GUID pdbGuid;\n        DWORD pdbAge;\n        if (Functions::ModuleGetPDBInfo(module, &pdbGuid, &pdbAge)) {\n            constexpr size_t kMaxPdbIdentifierLength =\n                sizeof(\"AAAAAAAABBBBCCCCDDDDEEEEEEEEEEEE12345678\") - 1;\n            WCHAR pdbIdentifier[kMaxPdbIdentifierLength + 1];\n            swprintf_s(pdbIdentifier,\n                       L\"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x\",\n                       pdbGuid.Data1, pdbGuid.Data2, pdbGuid.Data3,\n                       pdbGuid.Data4[0], pdbGuid.Data4[1], pdbGuid.Data4[2],\n                       pdbGuid.Data4[3], pdbGuid.Data4[4], pdbGuid.Data4[5],\n                       pdbGuid.Data4[6], pdbGuid.Data4[7], pdbAge);\n\n            cacheStrKey = L\"pdb_\";\n            cacheStrKey += pdbIdentifier;\n            if (isHybridModule) {\n                cacheStrKey += L\"_hybrid-\";\n                cacheStrKey += currentArch;\n            }\n        } else {\n            cacheStrKey = L\"pe_\";\n            cacheStrKey += currentArch;\n            cacheStrKey += L'_';\n            cacheStrKey += timeStamp;\n            cacheStrKey += L'_';\n            cacheStrKey += imageSize;\n            cacheStrKey += L'_';\n            cacheStrKey += moduleFileName;\n            if (isHybridModule) {\n                cacheStrKey += L\"_hybrid\";\n            }\n        }\n\n        m_isHybridModule = isHybridModule;\n        m_cacheSep = isHybridModule ? L';' : L'#';\n        m_moduleFileName = std::move(moduleFileName);\n        m_timeStamp = std::move(timeStamp);\n        m_imageSize = std::move(imageSize);\n        m_cacheStrKey = std::move(cacheStrKey);\n\n        m_newSystemCacheStr = kCacheVer;\n        m_newSystemCacheStr += m_cacheSep;\n        m_newSystemCacheStr += Functions::ReplaceAll(\n            m_moduleFileName, std::wstring_view(&m_cacheSep, 1), L\"%sep%\");\n        m_newSystemCacheStr += m_cacheSep;\n        m_newSystemCacheStr += m_timeStamp;\n        m_newSystemCacheStr += L'-';\n        m_newSystemCacheStr += m_imageSize;\n    }\n\n    struct PendingHook {\n        void* targetFunction;\n        void* hookFunction;\n        void** originalFunction;\n    };\n\n    static constexpr WCHAR kCacheVer = L'1';\n    static constexpr std::wstring_view kErrorCachePrefix = L\"error:\"sv;\n    static constexpr WCHAR kErrorCacheVer = L'1';\n    static constexpr WCHAR kErrorCacheSep = L'#';\n\n    LoadedMod* m_loadedMod;\n    HMODULE m_module;\n    bool m_isHybridModule;\n    WCHAR m_cacheSep;\n    std::wstring m_moduleFileName;\n    std::wstring m_timeStamp;\n    std::wstring m_imageSize;\n    std::wstring m_cacheStrKey;\n    std::wstring m_newSystemCacheStr;\n    std::vector<const WH_SYMBOL_HOOK*> m_symbolHooksUnresolved;\n    std::vector<PendingHook> m_pendingHooks;\n};\n\nstd::wstring GetWindowsVersionForLogging() {\n    static const std::wstring result = []() {\n        ULONG majorVersion = 0;\n        ULONG minorVersion = 0;\n        ULONG buildNumber = 0;\n        Functions::GetNtVersionNumbers(&majorVersion, &minorVersion,\n                                       &buildNumber);\n\n        WCHAR buildNumberReg[32] = L\"\";\n        DWORD buildNumberRegSize = sizeof(buildNumberReg);\n        RegGetValue(HKEY_LOCAL_MACHINE,\n                    L\"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\",\n                    L\"CurrentBuild\", RRF_RT_REG_SZ, nullptr, buildNumberReg,\n                    &buildNumberRegSize);\n\n        DWORD buildRevisionReg = 0;\n        DWORD buildRevisionRegSize = sizeof(buildRevisionReg);\n        RegGetValue(HKEY_LOCAL_MACHINE,\n                    L\"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\", L\"UBR\",\n                    RRF_RT_REG_DWORD, nullptr, &buildRevisionReg,\n                    &buildRevisionRegSize);\n\n        std::wstring result;\n        result += std::to_wstring(majorVersion);\n        result += L'.';\n        result += std::to_wstring(minorVersion);\n        result += L'.';\n        result += std::to_wstring(buildNumber);\n        result += L\" (\";\n        result += buildNumberReg;\n        result += L'.';\n        result += std::to_wstring(buildRevisionReg);\n        result += L')';\n\n        return result;\n    }();\n\n    return result;\n}\n\n}  // namespace\n\nLoadedMod::LoadedMod(PCWSTR modName,\n                     PCWSTR modInstanceId,\n                     PCWSTR libraryPath,\n                     bool loadedOnStartup,\n                     bool loggingEnabled,\n                     bool debugLoggingEnabled)\n    : m_modName(modName),\n      m_modInstanceId(modInstanceId),\n      m_loadedOnStartup(loadedOnStartup),\n      m_loggingEnabled(loggingEnabled),\n      m_debugLoggingEnabled(debugLoggingEnabled),\n      m_compatDemangling(ShouldUseCompatDemangling(m_modName)) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    VERBOSE(L\"Windows %s\", GetWindowsVersionForLogging().c_str());\n#if defined(_M_IX86)\n#define WINDHAWK_ARCH L\"x86\"\n#elif defined(_M_X64)\n#define WINDHAWK_ARCH L\"x86-64\"\n#elif defined(_M_ARM64)\n#define WINDHAWK_ARCH L\"ARM64\"\n#else\n#error \"Unsupported architecture\"\n#endif\n    VERBOSE(L\"Windhawk v\" VER_FILE_VERSION_WSTR L\" \" WINDHAWK_ARCH);\n#undef WINDHAWK_ARCH\n    VERBOSE(L\"Mod id: %s\", m_modName.c_str());\n    VERBOSE(L\"Mod version: %s\", GetModVersion(m_modName.c_str()).c_str());\n\n    m_modModule.reset(\n        LoadLibraryEx(libraryPath, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH));\n    THROW_LAST_ERROR_IF_NULL(m_modModule);\n\n    VERBOSE(L\"Mod base address: %p\", m_modModule.get());\n\n    LoadedMod** pModPtr = reinterpret_cast<LoadedMod**>(\n        GetProcAddress(m_modModule.get(), \"InternalWhModPtr\"));\n    if (pModPtr) {\n        *pModPtr = this;\n    } else {\n        LOG(L\"Mod %s: InternalWhModPtr not found\", m_modName.c_str());\n    }\n\n    try {\n        m_modShimLibrary = SetModShimsLibraryIfNeeded(m_modModule.get());\n    } catch (const std::exception& e) {\n        LOG(L\"Mod %s: %S\", m_modName.c_str(), e.what());\n    }\n}\n\nLoadedMod::~LoadedMod() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MH_STATUS status =\n        MH_RemoveHookEx(reinterpret_cast<ULONG_PTR>(this), MH_ALL_HOOKS);\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_RemoveHookEx returned %d\", m_modName.c_str(),\n            status);\n    }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n}\n\nbool LoadedMod::Initialize() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (m_initialized) {\n        throw std::logic_error(\"Already initialized\");\n    }\n\n    SetTask(L\"Initializing...\");\n\n    using WH_MOD_INIT_T = BOOL(__cdecl*)();\n    auto pWH_ModInit = reinterpret_cast<WH_MOD_INIT_T>(\n        GetProcAddress(m_modModule.get(), \"_Z10Wh_ModInitv\"));\n    if (pWH_ModInit) {\n        m_initialized = pWH_ModInit();\n    } else {\n        m_initialized = true;\n    }\n\n    SetTask(nullptr);\n\n    return m_initialized;\n}\n\nvoid LoadedMod::AfterInit() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    using WH_MOD_AFTER_INIT_T = void(__cdecl*)();\n    auto pWH_ModAfterInit = reinterpret_cast<WH_MOD_AFTER_INIT_T>(\n        GetProcAddress(m_modModule.get(), \"_Z15Wh_ModAfterInitv\"));\n    if (pWH_ModAfterInit) {\n        pWH_ModAfterInit();\n    }\n}\n\nvoid LoadedMod::BeforeUninit() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    SetTask(L\"Uninitializing...\");\n\n    using WH_MOD_BEFORE_UNINIT_T = void(__cdecl*)();\n    auto pWH_ModBeforeUninit = reinterpret_cast<WH_MOD_BEFORE_UNINIT_T>(\n        GetProcAddress(m_modModule.get(), \"_Z18Wh_ModBeforeUninitv\"));\n    if (pWH_ModBeforeUninit) {\n        pWH_ModBeforeUninit();\n    }\n\n    m_uninitializing = true;\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MH_STATUS status =\n        MH_QueueDisableHookEx(reinterpret_cast<ULONG_PTR>(this), MH_ALL_HOOKS);\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_QueueDisableHookEx returned %d\",\n            m_modName.c_str(), status);\n    }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n}\n\nvoid LoadedMod::Uninitialize() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    using WH_MOD_UNINIT_T = void(__cdecl*)();\n    auto pWH_ModUninit = reinterpret_cast<WH_MOD_UNINIT_T>(\n        GetProcAddress(m_modModule.get(), \"_Z12Wh_ModUninitv\"));\n    if (pWH_ModUninit) {\n        pWH_ModUninit();\n    }\n}\n\nvoid LoadedMod::EnableLogging(bool enable) {\n    m_loggingEnabled = enable;\n}\n\nvoid LoadedMod::EnableDebugLogging(bool enable) {\n    m_debugLoggingEnabled = enable;\n}\n\nbool LoadedMod::SettingsChanged(bool* reload) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    *reload = false;\n\n    using WH_MOD_SETTINGS_CHANGED_EX_T = BOOL(__cdecl*)(BOOL*);\n    auto pWH_ModSettingsChangedEx =\n        reinterpret_cast<WH_MOD_SETTINGS_CHANGED_EX_T>(\n            GetProcAddress(m_modModule.get(), \"_Z21Wh_ModSettingsChangedPi\"));\n    if (pWH_ModSettingsChangedEx) {\n        BOOL bReload = FALSE;\n        bool result = pWH_ModSettingsChangedEx(&bReload);\n        *reload = bReload;\n        return result;\n    }\n\n    using WH_MOD_SETTINGS_CHANGED_T = void(__cdecl*)();\n    auto pWH_ModSettingsChanged = reinterpret_cast<WH_MOD_SETTINGS_CHANGED_T>(\n        GetProcAddress(m_modModule.get(), \"_Z21Wh_ModSettingsChangedv\"));\n    if (pWH_ModSettingsChanged) {\n        pWH_ModSettingsChanged();\n        return true;\n    }\n\n    return true;\n}\n\nPCWSTR LoadedMod::GetModName() {\n    return m_modName.c_str();\n}\n\nHMODULE LoadedMod::GetModModuleHandle() {\n    return m_modModule.get();\n}\n\nBOOL LoadedMod::IsLogEnabled() {\n    return m_loggingEnabled || m_debugLoggingEnabled;\n}\n\nvoid LoadedMod::Log(PCWSTR format, va_list args) {\n    va_list argsCopy;\n    va_copy(argsCopy, args);  // https://stackoverflow.com/q/55274350\n    WCHAR logFormatted[1025];\n    _vsnwprintf_s(logFormatted, _TRUNCATE, format, args);\n    va_end(argsCopy);\n\n    Logger::GetInstance().LogLine(L\"[WH] [%s] %s\\n\", m_modName.c_str(),\n                                  logFormatted);\n}\n\nint LoadedMod::GetIntValue(PCWSTR valueName, int defaultValue) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", false);\n        int value = settings->GetInt(valueName).value_or(defaultValue);\n        VERBOSE(L\"value: %d\", value);\n        return value;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return defaultValue;\n}\n\nBOOL LoadedMod::SetIntValue(PCWSTR valueName, int value) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n    VERBOSE(L\"value: %d\", value);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", true);\n        settings->SetInt(valueName, value);\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nsize_t LoadedMod::GetStringValue(PCWSTR valueName,\n                                 PWSTR stringBuffer,\n                                 size_t bufferChars) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    if (bufferChars == 0) {\n        return 0;\n    }\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", false);\n        auto value = settings->GetString(valueName).value_or(L\"\");\n        if (value.length() <= bufferChars - 1) {\n            wcscpy_s(stringBuffer, bufferChars, value.c_str());\n            VERBOSE(L\"value: %s\", value.c_str());\n            return value.length();\n        } else {\n            LOG(L\"Buffer size too small: %zu < %zu\",\n                bufferChars - 1 < value.length());\n        }\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    stringBuffer[0] = L'\\0';\n    return 0;\n}\n\nBOOL LoadedMod::SetStringValue(PCWSTR valueName, PCWSTR value) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n    VERBOSE(L\"value: %s\", value);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", true);\n        settings->SetString(valueName, value);\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nsize_t LoadedMod::GetBinaryValue(PCWSTR valueName,\n                                 void* buffer,\n                                 size_t bufferSize) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", false);\n        auto value =\n            settings->GetBinary(valueName).value_or(std::vector<BYTE>{});\n        if (value.size() <= bufferSize) {\n            memcpy(buffer, value.data(), value.size());\n            return value.size();\n        } else {\n            LOG(L\"Buffer size too small: %zu < %zu\", bufferSize, value.size());\n        }\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return 0;\n}\n\nBOOL LoadedMod::SetBinaryValue(PCWSTR valueName,\n                               const void* buffer,\n                               size_t bufferSize) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", true);\n        settings->SetBinary(valueName, reinterpret_cast<const BYTE*>(buffer),\n                            bufferSize);\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nBOOL LoadedMod::DeleteValue(PCWSTR valueName) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        auto settings = StorageManager::GetInstance().GetModWritableConfig(\n            m_modName.c_str(), L\"LocalStorage\", true);\n        settings->Remove(valueName);\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nsize_t LoadedMod::GetModStoragePath(PWSTR pathBuffer, size_t bufferChars) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (bufferChars == 0) {\n        return 0;\n    }\n\n    try {\n        auto modStoragePath =\n            StorageManager::GetInstance().GetModStoragePath(m_modName.c_str());\n        const auto& value = modStoragePath.native();\n        if (value.length() <= bufferChars - 1) {\n            wcscpy_s(pathBuffer, bufferChars, value.c_str());\n            VERBOSE(L\"value: %s\", value.c_str());\n            return value.length();\n        } else {\n            LOG(L\"Buffer size too small: %zu < %zu\",\n                bufferChars - 1 < value.length());\n        }\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    pathBuffer[0] = L'\\0';\n    return FALSE;\n}\n\nint LoadedMod::GetIntSetting(PCWSTR valueName, va_list args) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        va_list argsCopy;\n        va_copy(argsCopy, args);  // https://stackoverflow.com/q/55274350\n        std::wstring valueNameFormatted(_vscwprintf(valueName, argsCopy),\n                                        L'\\0');\n        va_end(argsCopy);\n        vswprintf_s(valueNameFormatted.data(), valueNameFormatted.length() + 1,\n                    valueName, args);\n\n        VERBOSE(L\"valueNameFormatted: %s\", valueNameFormatted.c_str());\n\n        auto settings = StorageManager::GetInstance().GetModConfig(\n            m_modName.c_str(), L\"Settings\");\n        int value = settings->GetInt(valueNameFormatted.c_str()).value_or(0);\n        VERBOSE(L\"value: %d\", value);\n        return value;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return 0;\n}\n\nPCWSTR LoadedMod::GetStringSetting(PCWSTR valueName, va_list args) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"valueName: %s\", valueName);\n\n    try {\n        va_list argsCopy;\n        va_copy(argsCopy, args);  // https://stackoverflow.com/q/55274350\n        std::wstring valueNameFormatted(_vscwprintf(valueName, argsCopy),\n                                        L'\\0');\n        va_end(argsCopy);\n        vswprintf_s(valueNameFormatted.data(), valueNameFormatted.length() + 1,\n                    valueName, args);\n\n        VERBOSE(L\"valueNameFormatted: %s\", valueNameFormatted.c_str());\n\n        auto settings = StorageManager::GetInstance().GetModConfig(\n            m_modName.c_str(), L\"Settings\");\n        auto value =\n            settings->GetString(valueNameFormatted.c_str()).value_or(L\"\");\n\n        auto valueAllocated = std::make_unique<WCHAR[]>(value.length() + 1);\n        wcscpy_s(valueAllocated.get(), value.length() + 1, value.c_str());\n        VERBOSE(L\"value: %s\", valueAllocated.get());\n        return valueAllocated.release();\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return emptySettingStringValue;\n}\n\nvoid LoadedMod::FreeStringSetting(PCWSTR string) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (string != emptySettingStringValue) {\n        delete[] string;\n    }\n}\n\nBOOL LoadedMod::SetFunctionHook(void* targetFunction,\n                                void* hookFunction,\n                                void** originalFunction) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"Target: %p\", targetFunction);\n    VERBOSE(L\"Hook: %p\", hookFunction);\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    if (m_uninitializing) {\n        VERBOSE(L\"Uninitializing, not allowed to set hooks\");\n        return FALSE;\n    }\n\n    MH_STATUS status =\n        MH_CreateHookEx(reinterpret_cast<ULONG_PTR>(this), targetFunction,\n                        hookFunction, originalFunction);\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_CreateHookEx returned %d\", m_modName.c_str(),\n            status);\n        return FALSE;\n    }\n\n    status =\n        MH_QueueEnableHookEx(reinterpret_cast<ULONG_PTR>(this), targetFunction);\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_QueueEnableHookEx returned %d\",\n            m_modName.c_str(), status);\n        return FALSE;\n    }\n\n    return TRUE;\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n    // For testing without a hooking engine.\n    LOG(L\"Mod %s error: No hooking engine\", m_modName.c_str());\n    return FALSE;\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n}\n\nBOOL LoadedMod::RemoveFunctionHook(void* targetFunction) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"Target: %p\", targetFunction);\n\n    if (!m_initialized) {\n        VERBOSE(L\"Not initialized, not allowed to remove hooks\");\n        return FALSE;\n    }\n\n    if (m_uninitializing) {\n        VERBOSE(L\"Uninitializing, not allowed to remove hooks\");\n        return FALSE;\n    }\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MH_STATUS status = MH_QueueDisableHookEx(reinterpret_cast<ULONG_PTR>(this),\n                                             targetFunction);\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_QueueDisableHookEx returned %d\",\n            m_modName.c_str(), status);\n        return FALSE;\n    }\n\n    return TRUE;\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n    // For testing without a hooking engine.\n    LOG(L\"Mod %s error: No hooking engine\", m_modName.c_str());\n    return FALSE;\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n}\n\nBOOL LoadedMod::ApplyHookOperations() {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (!m_initialized) {\n        VERBOSE(L\"Not initialized, not allowed to apply hooks\");\n        return FALSE;\n    }\n\n    if (m_uninitializing) {\n        VERBOSE(L\"Uninitializing, not allowed to apply hooks\");\n        return FALSE;\n    }\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MH_STATUS status = MH_ApplyQueuedEx(reinterpret_cast<ULONG_PTR>(this));\n    if (status != MH_OK) {\n        LOG(L\"Mod %s error: MH_ApplyQueuedEx returned %d\", m_modName.c_str(),\n            status);\n    }\n\n    MH_STATUS removeDisabledHooksStatus =\n        MH_RemoveDisabledHooksEx(reinterpret_cast<ULONG_PTR>(this));\n    if (removeDisabledHooksStatus != MH_OK) {\n        LOG(L\"Mod %s error: MH_RemoveDisabledHooksEx returned %d\",\n            m_modName.c_str(), removeDisabledHooksStatus);\n    }\n\n    return status == MH_OK;\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n    // For testing without a hooking engine.\n    LOG(L\"Mod %s error: No hooking engine\", m_modName.c_str());\n    return FALSE;\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n}\n\nHANDLE LoadedMod::FindFirstSymbol(HMODULE hModule,\n                                  PCWSTR symbolServer,\n                                  BYTE* findData) {\n    WH_FIND_SYMBOL_OPTIONS options = {\n        .optionsSize = sizeof(options),\n        .symbolServer = symbolServer,\n    };\n    WH_FIND_SYMBOL newFindData;\n    HANDLE findHandle = FindFirstSymbol4(hModule, &options, &newFindData);\n    if (!findHandle) {\n        return nullptr;\n    }\n\n    struct {\n        PCWSTR symbol;\n        void* address;\n    }* findDataOldStruct = (decltype(findDataOldStruct))findData;\n\n    findDataOldStruct->symbol = newFindData.symbol;\n    findDataOldStruct->address = newFindData.address;\n\n    return findHandle;\n}\n\nHANDLE LoadedMod::FindFirstSymbol2(HMODULE hModule,\n                                   PCWSTR symbolServer,\n                                   WH_FIND_SYMBOL* findData) {\n    WH_FIND_SYMBOL_OPTIONS options = {\n        .optionsSize = sizeof(options),\n        .symbolServer = symbolServer,\n    };\n    return FindFirstSymbol4(hModule, &options, findData);\n}\n\nHANDLE LoadedMod::FindFirstSymbol3(HMODULE hModule,\n                                   const BYTE* options,\n                                   WH_FIND_SYMBOL* findData) {\n    struct {\n        PCWSTR symbolServer;\n        BOOL noUndecoratedSymbols;\n    }* optionsOldStruct = (decltype(optionsOldStruct))options;\n\n    WH_FIND_SYMBOL_OPTIONS optionsNewStruct = {\n        .optionsSize = sizeof(optionsNewStruct),\n        .symbolServer =\n            optionsOldStruct ? optionsOldStruct->symbolServer : nullptr,\n        .noUndecoratedSymbols =\n            optionsOldStruct && optionsOldStruct->noUndecoratedSymbols,\n    };\n    return FindFirstSymbol4(hModule, &optionsNewStruct, findData);\n}\n\nHANDLE LoadedMod::FindFirstSymbol4(HMODULE hModule,\n                                   const WH_FIND_SYMBOL_OPTIONS* options,\n                                   WH_FIND_SYMBOL* findData) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (options && options->optionsSize != sizeof(WH_FIND_SYMBOL_OPTIONS)) {\n        struct WH_FIND_SYMBOL_OPTIONS_V1 {\n            size_t optionsSize;\n            PCWSTR symbolServer;\n            BOOL noUndecoratedSymbols;\n        };\n        static_assert(\n            sizeof(WH_FIND_SYMBOL_OPTIONS) == sizeof(WH_FIND_SYMBOL_OPTIONS_V1),\n            \"Struct was updated, update this code too\");\n\n        LOG(L\"Unsupported options->optionsSize value: %zu\",\n            options->optionsSize);\n        return nullptr;\n    }\n\n    try {\n        HMODULE moduleBase = hModule;\n        if (!moduleBase) {\n            moduleBase = GetModuleHandle(nullptr);\n        }\n\n        std::filesystem::path modulePath =\n            wil::GetModuleFileName<std::wstring>(moduleBase);\n\n        VERBOSE(L\"Module: %p%s\", moduleBase, !hModule ? L\" (main)\" : L\"\");\n        VERBOSE(L\"Path: %s\", modulePath.c_str());\n        VERBOSE(L\"Version: %S\",\n                Functions::GetModuleVersion(moduleBase).c_str());\n\n        std::wstring moduleName = modulePath.filename();\n        LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_LOWERCASE, &moduleName[0],\n                      wil::safe_cast<int>(moduleName.length()), &moduleName[0],\n                      wil::safe_cast<int>(moduleName.length()), nullptr,\n                      nullptr, 0);\n\n        SetTask((L\"Loading symbols... (\" + moduleName + L\")\").c_str());\n\n        auto activityStatusCleanup = wil::scope_exit(\n            [this] { SetTask(m_initialized ? nullptr : L\"Initializing...\"); });\n\n        SymbolEnum::Callbacks callbacks;\n\n        bool canceled = false;\n        DWORD lastQueryCancelTick = GetTickCount();\n\n        callbacks.queryCancel = [this, &canceled, &lastQueryCancelTick]() {\n            if (canceled) {\n                return true;\n            }\n\n            DWORD tick = GetTickCount();\n            if (tick - lastQueryCancelTick < 1000) {\n                return false;\n            }\n\n            lastQueryCancelTick = tick;\n\n            try {\n                if (!Mod::ShouldLoadInRunningProcess(m_modName.c_str()) ||\n                    CustomizationSession::IsEndingSoon()) {\n                    canceled = true;\n                    return true;\n                }\n            } catch (const std::exception& e) {\n                LOG(L\"%S\", e.what());\n            }\n\n            return false;\n        };\n\n        callbacks.notifyProgress = [this, &moduleName](int progress) {\n            try {\n                std::wstring status = L\"Loading symbols... \" +\n                                      std::to_wstring(progress) + L\"% (\" +\n                                      moduleName + L\")\";\n                SetTask(status.c_str());\n            } catch (const std::exception& e) {\n                LOG(L\"%S\", e.what());\n            }\n        };\n\n        SymbolEnum::UndecorateMode undecorateMode =\n            SymbolEnum::UndecorateMode::Default;\n        if (options && options->noUndecoratedSymbols) {\n            undecorateMode = SymbolEnum::UndecorateMode::None;\n        } else if (m_compatDemangling) {\n            undecorateMode = SymbolEnum::UndecorateMode::OldVersionCompatible;\n        }\n\n        std::unique_ptr<SymbolEnum> symbolEnum;\n        if (options && options->symbolServer && !*options->symbolServer) {\n            // No symbol server, no lock needed.\n            symbolEnum = std::make_unique<SymbolEnum>(\n                modulePath.c_str(), hModule, L\"\", undecorateMode);\n        } else {\n            std::optional<CrossModMutex> symbolLoadLock;\n\n            GUID pdbGuid;\n            DWORD pdbAge;\n            if (Functions::ModuleGetPDBInfo(moduleBase, &pdbGuid, &pdbAge)) {\n                constexpr size_t kMaxPdbIdentifierLength =\n                    sizeof(\"AAAAAAAABBBBCCCCDDDDEEEEEEEEEEEE12345678\") - 1;\n                WCHAR mutexIdentifier[sizeof(\"SymbolLoadLockMutex-\") - 1 +\n                                      kMaxPdbIdentifierLength + 1];\n                swprintf_s(\n                    mutexIdentifier,\n                    L\"SymbolLoadLockMutex-%08X%04X%04X%02X%02X%02X%02X%02X%\"\n                    L\"02X%02X%02X%x\",\n                    pdbGuid.Data1, pdbGuid.Data2, pdbGuid.Data3,\n                    pdbGuid.Data4[0], pdbGuid.Data4[1], pdbGuid.Data4[2],\n                    pdbGuid.Data4[3], pdbGuid.Data4[4], pdbGuid.Data4[5],\n                    pdbGuid.Data4[6], pdbGuid.Data4[7], pdbAge);\n\n                symbolLoadLock.emplace(mutexIdentifier);\n                if (!*symbolLoadLock) {\n                    symbolLoadLock.reset();\n                }\n            }\n\n            // If lock is not acquired, try loading a local symbol file first.\n            // If it fails, wait for the lock before proceeding with the symbol\n            // server to avoid multiple processes downloading the same file.\n            if (symbolLoadLock &&\n                !symbolLoadLock->Acquire(/*milliseconds=*/0)) {\n                try {\n                    // Try loading a local symbol file first.\n                    symbolEnum = std::make_unique<SymbolEnum>(\n                        modulePath.c_str(), hModule, L\"\", undecorateMode);\n                } catch (const std::exception& e) {\n                    VERBOSE(L\"Failed to load local symbol file: %S\", e.what());\n\n                    SetTask((L\"Waiting for symbols... (\" + moduleName + L\")\")\n                                .c_str());\n\n                    symbolLoadLock->Acquire();\n\n                    // In case the mod was disabled, abort without starting the\n                    // symbol server flow.\n                    if (!Mod::ShouldLoadInRunningProcess(m_modName.c_str()) ||\n                        CustomizationSession::IsEndingSoon()) {\n                        VERBOSE(L\"Aborting symbol loading\");\n                        return nullptr;\n                    }\n\n                    SetTask(\n                        (L\"Loading symbols... (\" + moduleName + L\")\").c_str());\n                }\n            }\n\n            if (!symbolEnum) {\n                symbolEnum = std::make_unique<SymbolEnum>(\n                    modulePath.c_str(), hModule,\n                    options ? options->symbolServer : nullptr, undecorateMode,\n                    std::move(callbacks));\n            }\n        }\n\n        if (!FindNextSymbol2(symbolEnum.get(), findData)) {\n            VERBOSE(L\"No symbols found\");\n            return nullptr;\n        }\n\n        return symbolEnum.release();\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return nullptr;\n}\n\nBOOL LoadedMod::FindNextSymbol(HANDLE symSearch, BYTE* findData) {\n    WH_FIND_SYMBOL newFindData;\n    if (!FindNextSymbol2(symSearch, &newFindData)) {\n        return FALSE;\n    }\n\n    struct {\n        PCWSTR symbol;\n        void* address;\n    }* findDataOldStruct = (decltype(findDataOldStruct))findData;\n\n    findDataOldStruct->symbol = newFindData.symbol;\n    findDataOldStruct->address = newFindData.address;\n\n    return TRUE;\n}\n\nBOOL LoadedMod::FindNextSymbol2(HANDLE symSearch, WH_FIND_SYMBOL* findData) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE_QUIET();\n\n    try {\n        auto symbolEnum = static_cast<SymbolEnum*>(symSearch);\n\n        auto symbol = symbolEnum->GetNextSymbol();\n        if (!symbol) {\n            return FALSE;\n        }\n\n        findData->address = symbol->address;\n        findData->symbol =\n            symbol->nameUndecorated ? symbol->nameUndecorated : L\"\";\n        findData->symbolDecorated = symbol->name ? symbol->name : L\"\";\n\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nvoid LoadedMod::FindCloseSymbol(HANDLE symSearch) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    auto symbolEnum = static_cast<SymbolEnum*>(symSearch);\n    delete symbolEnum;\n}\n\nBOOL LoadedMod::HookSymbols(HMODULE module,\n                            const WH_SYMBOL_HOOK* symbolHooks,\n                            size_t symbolHooksCount,\n                            const WH_HOOK_SYMBOLS_OPTIONS* options) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    struct WH_HOOK_SYMBOLS_OPTIONS_CURRENT {\n        size_t optionsSize;\n        PCWSTR symbolServer;\n        BOOL noUndecoratedSymbols;\n        PCWSTR onlineCacheUrl;\n    };\n    static_assert(sizeof(WH_HOOK_SYMBOLS_OPTIONS) ==\n                      sizeof(WH_HOOK_SYMBOLS_OPTIONS_CURRENT),\n                  \"Struct was updated, update this code too\");\n\n    struct WH_HOOK_SYMBOLS_OPTIONS_V1 {\n        size_t optionsSize;\n        PCWSTR symbolServer;\n        BOOL noUndecoratedSymbols;\n    };\n\n    WH_HOOK_SYMBOLS_OPTIONS optionsResolved;\n\n    switch (options ? options->optionsSize : 0) {\n        case sizeof(WH_HOOK_SYMBOLS_OPTIONS):\n            optionsResolved = *options;\n            break;\n\n        case sizeof(WH_HOOK_SYMBOLS_OPTIONS_V1): {\n            const WH_HOOK_SYMBOLS_OPTIONS_V1* optionsV1 =\n                reinterpret_cast<const WH_HOOK_SYMBOLS_OPTIONS_V1*>(options);\n            optionsResolved = {\n                .optionsSize = sizeof(optionsResolved),\n                .symbolServer = optionsV1->symbolServer,\n                .noUndecoratedSymbols = optionsV1->noUndecoratedSymbols,\n            };\n            break;\n        }\n\n        case 0:\n            optionsResolved = {\n                .optionsSize = sizeof(optionsResolved),\n            };\n            break;\n\n        default:\n            LOG(L\"Unsupported options->optionsSize value: %zu\",\n                options->optionsSize);\n            return FALSE;\n    }\n\n    if (!module) {\n        LOG(L\"Module handle is null\");\n        return FALSE;\n    }\n\n    if (symbolHooksCount == 0) {\n        return TRUE;\n    }\n\n    if (!symbolHooks) {\n        LOG(L\"symbolHooks is null\");\n        return FALSE;\n    }\n\n    std::optional<CrossModMutex> symbolLoadLock;\n\n    try {\n        auto hookSymbolsSession =\n            HookSymbolsSession(this, module, symbolHooks, symbolHooksCount);\n\n#if !defined(_M_ARM64)\n        if (hookSymbolsSession.IsTargetModuleHybrid()) {\n            auto settings = StorageManager::GetInstance().GetModWritableConfig(\n                m_modName.c_str(), L\"LocalStorage\", false);\n\n            // By default, hybrid modules are not supported on non-ARM64\n            // architectures. A large amount of the code in such modules is\n            // ARM64EC, which is not supported by the hooking engine.\n            //\n            // Currently, as a temporary escape hatch, a mod can set the value\n            // below to customize this behavior.\n            switch (\n                settings->GetInt(L\"hook_symbols_non_arm64_hybrid_modules_mode\")\n                    .value_or(0)) {\n                default:\n                    LOG(L\"Hybrid modules are currently only supported on \"\n                        L\"ARM64\");\n                    return FALSE;\n\n                case 1:\n                    // Proceed as usual.\n                    break;\n\n                case 2:\n                    // Do nothing but return TRUE, can be useful for mods which\n                    // can provide partial functionality without the symbol\n                    // hooks.\n                    return TRUE;\n            }\n        }\n#endif\n\n        // Disable throttling when logging is enabled, to help with\n        // troubleshooting.\n        //\n        // If the mod is loaded on startup, allow cached errors for throttling\n        // to prevent the mod from trying to load symbols again and again for\n        // each newly created process in case of an error.\n        //\n        // If the mod is loaded later, allow cached errors for throttling for a\n        // shorter time, so that the mod can try to load symbols again after\n        // disabling and re-enabling the mod.\n        std::optional<ULONGLONG> cachedErrorForThrottleMaxTime =\n            (m_loggingEnabled || m_debugLoggingEnabled)\n                ? std::nullopt\n                : std::make_optional(m_loadedOnStartup\n                                         ? 4 * wil::filetime_duration::one_hour\n                                         : wil::filetime_duration::one_minute);\n\n        switch (hookSymbolsSession.ResolveSymbolsFromCache(\n            cachedErrorForThrottleMaxTime)) {\n            case HookSymbolsSession::ResolveSymbolsFromCacheResult::kSuccess:\n                if (hookSymbolsSession.AreAllSymbolsResolved()) {\n                    hookSymbolsSession.ApplyPendingHooks();\n                    return TRUE;\n                }\n                break;\n\n            case HookSymbolsSession::ResolveSymbolsFromCacheResult::\n                kCachedErrorForThrottle:\n                VERBOSE(L\"Returning FALSE due to a previous failure\");\n                return FALSE;\n        }\n\n        VERBOSE(L\"Couldn't resolve all symbols from local cache\");\n\n        SetTask((L\"Waiting for symbols... (\" +\n                 hookSymbolsSession.GetTargetModuleFileName() + L\")\")\n                    .c_str());\n\n        auto activityStatusCleanup = wil::scope_exit(\n            [this] { SetTask(m_initialized ? nullptr : L\"Initializing...\"); });\n\n        std::wstring mutexIdentieir = L\"SymbolGetOnlineCacheMutex_\";\n        mutexIdentieir += m_modName;\n        mutexIdentieir += L'_';\n        mutexIdentieir += hookSymbolsSession.GetCacheStrKey();\n\n        // At this point, if the mod is loaded into multiple processes, all of\n        // them will try to use the online cache. Use a cross-mod mutex, and\n        // hopefully the first mod to acquire it will get and store the online\n        // cache. Then, the other processes will be able to use it without\n        // having to go online too.\n        symbolLoadLock.emplace(mutexIdentieir.c_str());\n        if (!*symbolLoadLock || !symbolLoadLock->Acquire()) {\n            symbolLoadLock.reset();\n        }\n\n        SetTask((L\"Loading symbols... (\" +\n                 hookSymbolsSession.GetTargetModuleFileName() + L\")\")\n                    .c_str());\n\n        if (symbolLoadLock) {\n            // Retry resolving symbols from cache after acquiring the lock.\n            switch (hookSymbolsSession.ResolveSymbolsFromCache(\n                cachedErrorForThrottleMaxTime)) {\n                case HookSymbolsSession::ResolveSymbolsFromCacheResult::\n                    kSuccess:\n                    if (hookSymbolsSession.AreAllSymbolsResolved()) {\n                        hookSymbolsSession.ApplyPendingHooks();\n                        return TRUE;\n                    }\n                    break;\n\n                case HookSymbolsSession::ResolveSymbolsFromCacheResult::\n                    kCachedErrorForThrottle:\n                    VERBOSE(L\"Returning FALSE due to a previous failure\");\n                    return FALSE;\n            }\n        } else {\n            LOG(L\"Couldn't acquire the symbol load lock\");\n        }\n\n        auto scopeUpdateSymbolsCacheWithErrorForThrottle =\n            wil::scope_exit([&hookSymbolsSession]() {\n                hookSymbolsSession.UpdateSymbolsCacheWithErrorForThrottle();\n            });\n\n        auto applyHooksAndUpdateCache =\n            [&hookSymbolsSession,\n             &scopeUpdateSymbolsCacheWithErrorForThrottle]() {\n                hookSymbolsSession.ApplyPendingHooks();\n                hookSymbolsSession.UpdateSymbolsCache();\n                scopeUpdateSymbolsCacheWithErrorForThrottle.release();\n            };\n\n        auto onlineCache =\n            HookSymbolsGetOnlineCache(optionsResolved.onlineCacheUrl,\n                                      hookSymbolsSession.GetCacheStrKey())\n                .value_or(L\"\");\n        if (!onlineCache.empty()) {\n            const auto& cacheStrKey = hookSymbolsSession.GetCacheStrKey();\n            VERBOSE(\n                L\"Using online symbol cache %.*s: %.*s\",\n                wil::safe_cast<int>(cacheStrKey.length()), cacheStrKey.data(),\n                wil::safe_cast<int>(onlineCache.length()), onlineCache.data());\n\n            hookSymbolsSession.ResolveSymbolsFromCacheString(onlineCache);\n            if (hookSymbolsSession.AreAllSymbolsResolved()) {\n                applyHooksAndUpdateCache();\n                return TRUE;\n            }\n        }\n\n        VERBOSE(L\"Couldn't resolve all symbols from online cache\");\n\n        WH_FIND_SYMBOL findSymbol;\n        WH_FIND_SYMBOL_OPTIONS findFirstSymbolOptions = {\n            .optionsSize = sizeof(findFirstSymbolOptions),\n            .symbolServer = optionsResolved.symbolServer,\n            .noUndecoratedSymbols = optionsResolved.noUndecoratedSymbols,\n        };\n        HANDLE findSymbolHandle =\n            FindFirstSymbol4(module, &findFirstSymbolOptions, &findSymbol);\n        if (!findSymbolHandle) {\n            return FALSE;\n        }\n\n        // Prefer closing the handle on function exit, not earlier. Closing the\n        // handle unloads the MSDIA library, and that was observed to cause\n        // hangs if Application Verifier is used. Example:\n        // https://github.com/ramensoftware/windhawk-mods/issues/920\n        // By closing the handle on function exit, at least the symbol offsets\n        // will be written to cache, so symbols will just be loaded from cache\n        // on the next try.\n        auto findSymbolHandleScopeClose = wil::scope_exit(\n            [this, findSymbolHandle]() { FindCloseSymbol(findSymbolHandle); });\n\n        do {\n            PCWSTR symbol = optionsResolved.noUndecoratedSymbols\n                                ? findSymbol.symbolDecorated\n                                : findSymbol.symbol;\n            if (!symbol || !hookSymbolsSession.OnSymbolResolved(\n                               symbol, findSymbol.address)) {\n                continue;\n            }\n\n            if (hookSymbolsSession.AreAllSymbolsResolved()) {\n                break;\n            }\n        } while (FindNextSymbol2(findSymbolHandle, &findSymbol));\n\n        if (!hookSymbolsSession.AreAllSymbolsResolved()) {\n            hookSymbolsSession.MarkUnresolvedSymbolsAsMissing();\n            if (!hookSymbolsSession.AreAllSymbolsResolved()) {\n                return FALSE;\n            }\n        }\n\n        applyHooksAndUpdateCache();\n        return TRUE;\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return FALSE;\n}\n\nBOOL LoadedMod::Disasm(void* address, WH_DISASM_RESULT* result) {\n#if defined(_M_ARM64)\n    int rc = aarch64_decompose_and_disassemble(\n        reinterpret_cast<ULONG_PTR>(address),\n        *reinterpret_cast<DWORD*>(address), result->text, sizeof(result->text));\n    if (rc) {\n        LOG(L\"Mod %s error: aarch64_decompose_and_disassemble returned %d\",\n            m_modName.c_str(), rc);\n        return FALSE;\n    }\n\n    result->length = sizeof(DWORD);\n\n    return TRUE;\n#else\n#if defined(_M_IX86)\n    auto machineMode = ZYDIS_MACHINE_MODE_LEGACY_32;\n#elif defined(_M_X64)\n    auto machineMode = ZYDIS_MACHINE_MODE_LONG_64;\n#else\n#error \"Unsupported architecture\"\n#endif\n\n    ZydisDisassembledInstruction instruction;\n    ZyanStatus status = ZydisDisassembleIntel(\n        /* machine_mode:    */ machineMode,\n        /* runtime_address: */ (ZyanU64)address,\n        /* buffer:          */ address,\n        /* length:          */ ZYDIS_MAX_INSTRUCTION_LENGTH,\n        /* instruction:     */ &instruction);\n    if (!ZYAN_SUCCESS(status)) {\n        LOG(L\"Mod %s error: ZydisDisassembleIntel returned %u\",\n            m_modName.c_str(), status);\n        return FALSE;\n    }\n\n    result->length = instruction.info.length;\n    strcpy_s(result->text, instruction.text);\n\n    return TRUE;\n#endif  // defined(_M_ARM64)\n}\n\nconst WH_URL_CONTENT* LoadedMod::GetUrlContent(\n    PCWSTR url,\n    const WH_GET_URL_CONTENT_OPTIONS* options) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n    VERBOSE(L\"URL: %s\", url);\n    VERBOSE(L\"Target file path: %s\", options && options->targetFilePath\n                                         ? options->targetFilePath\n                                         : L\"(none)\");\n\n    if (options && options->optionsSize != sizeof(WH_GET_URL_CONTENT_OPTIONS)) {\n        struct WH_GET_URL_CONTENT_OPTIONS_V1 {\n            size_t optionsSize;\n            PCWSTR targetFilePath;\n        };\n        static_assert(sizeof(WH_GET_URL_CONTENT_OPTIONS) ==\n                          sizeof(WH_GET_URL_CONTENT_OPTIONS_V1),\n                      \"Struct was updated, update this code too\");\n\n        LOG(L\"Unsupported options->optionsSize value: %zu\",\n            options->optionsSize);\n        return nullptr;\n    }\n\n    // Avoid having winhttp.dll in the import table, since it might not be\n    // available in all cases, e.g. sandboxed processes.\n    using WinHttpCloseHandle_t = decltype(&WinHttpCloseHandle);\n    using WinHttpOpen_t = decltype(&WinHttpOpen);\n    using WinHttpConnect_t = decltype(&WinHttpConnect);\n    using WinHttpQueryHeaders_t = decltype(&WinHttpQueryHeaders);\n    using WinHttpReceiveResponse_t = decltype(&WinHttpReceiveResponse);\n    using WinHttpSendRequest_t = decltype(&WinHttpSendRequest);\n    using WinHttpOpenRequest_t = decltype(&WinHttpOpenRequest);\n    using WinHttpQueryDataAvailable_t = decltype(&WinHttpQueryDataAvailable);\n    using WinHttpReadData_t = decltype(&WinHttpReadData);\n    using WinHttpCrackUrl_t = decltype(&WinHttpCrackUrl);\n\n    class WinHttpFunctions {\n       public:\n        wil::unique_hmodule module;\n\n        WinHttpCloseHandle_t CloseHandle;\n        WinHttpOpen_t Open;\n        WinHttpConnect_t Connect;\n        WinHttpQueryHeaders_t QueryHeaders;\n        WinHttpReceiveResponse_t ReceiveResponse;\n        WinHttpSendRequest_t SendRequest;\n        WinHttpOpenRequest_t OpenRequest;\n        WinHttpQueryDataAvailable_t QueryDataAvailable;\n        WinHttpReadData_t ReadData;\n        WinHttpCrackUrl_t CrackUrl;\n\n        WinHttpFunctions() {\n            wil::unique_hmodule winhttpModule{LoadLibraryEx(\n                L\"winhttp.dll\", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32)};\n            if (!winhttpModule) {\n                LOG(L\"Failed to load winhttp.dll\");\n                return;\n            }\n\n            HMODULE moduleRaw = winhttpModule.get();\n\n            CloseHandle = reinterpret_cast<WinHttpCloseHandle_t>(\n                GetProcAddress(moduleRaw, \"WinHttpCloseHandle\"));\n            Open = reinterpret_cast<WinHttpOpen_t>(\n                GetProcAddress(moduleRaw, \"WinHttpOpen\"));\n            Connect = reinterpret_cast<WinHttpConnect_t>(\n                GetProcAddress(moduleRaw, \"WinHttpConnect\"));\n            QueryHeaders = reinterpret_cast<WinHttpQueryHeaders_t>(\n                GetProcAddress(moduleRaw, \"WinHttpQueryHeaders\"));\n            ReceiveResponse = reinterpret_cast<WinHttpReceiveResponse_t>(\n                GetProcAddress(moduleRaw, \"WinHttpReceiveResponse\"));\n            SendRequest = reinterpret_cast<WinHttpSendRequest_t>(\n                GetProcAddress(moduleRaw, \"WinHttpSendRequest\"));\n            OpenRequest = reinterpret_cast<WinHttpOpenRequest_t>(\n                GetProcAddress(moduleRaw, \"WinHttpOpenRequest\"));\n            QueryDataAvailable = reinterpret_cast<WinHttpQueryDataAvailable_t>(\n                GetProcAddress(moduleRaw, \"WinHttpQueryDataAvailable\"));\n            ReadData = reinterpret_cast<WinHttpReadData_t>(\n                GetProcAddress(moduleRaw, \"WinHttpReadData\"));\n            CrackUrl = reinterpret_cast<WinHttpCrackUrl_t>(\n                GetProcAddress(moduleRaw, \"WinHttpCrackUrl\"));\n\n            if (!CloseHandle || !Open || !Connect || !QueryHeaders ||\n                !ReceiveResponse || !SendRequest || !OpenRequest ||\n                !QueryDataAvailable || !ReadData || !CrackUrl) {\n                LOG(L\"Failed to get all winhttp.dll functions\");\n                return;\n            }\n\n            module = std::move(winhttpModule);\n        }\n    };\n\n    STATIC_INIT_ONCE(WinHttpFunctions, winhttp, );\n\n    if (!winhttp->module) {\n        LOG(L\"WinHttp functions are not available\");\n        return nullptr;\n    }\n\n    try {\n        wil::unique_hfile targetFile;\n        PCWSTR targetFilePath = options ? options->targetFilePath : nullptr;\n        if (targetFilePath) {\n            targetFile.reset(CreateFile(targetFilePath, GENERIC_WRITE,\n                                        FILE_SHARE_READ, nullptr, CREATE_ALWAYS,\n                                        FILE_ATTRIBUTE_NORMAL, nullptr));\n            THROW_LAST_ERROR_IF(!targetFile);\n        }\n\n        URL_COMPONENTS urlComp = {sizeof(urlComp)};\n        urlComp.dwHostNameLength = (DWORD)-1;\n        urlComp.dwUrlPathLength = (DWORD)-1;\n        THROW_IF_WIN32_BOOL_FALSE(winhttp->CrackUrl(url, 0, 0, &urlComp));\n\n        HINTERNET session{winhttp->Open(L\"Windhawk/\" VER_FILE_VERSION_WSTR,\n                                        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,\n                                        WINHTTP_NO_PROXY_NAME,\n                                        WINHTTP_NO_PROXY_BYPASS, 0)};\n        THROW_LAST_ERROR_IF_NULL(session);\n\n        auto sessionCleanup = wil::scope_exit(\n            [winhttp, session] { winhttp->CloseHandle(session); });\n\n        HINTERNET connect{winhttp->Connect(\n            session,\n            std::wstring(urlComp.lpszHostName, urlComp.dwHostNameLength)\n                .c_str(),\n            urlComp.nPort, 0)};\n        THROW_LAST_ERROR_IF_NULL(connect);\n\n        auto connectCleanup = wil::scope_exit(\n            [winhttp, connect] { winhttp->CloseHandle(connect); });\n\n        HINTERNET request{winhttp->OpenRequest(\n            connect, L\"GET\",\n            std::wstring(urlComp.lpszUrlPath, urlComp.dwUrlPathLength).c_str(),\n            nullptr, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES,\n            urlComp.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE\n                                                     : 0)};\n        THROW_LAST_ERROR_IF_NULL(request);\n\n        auto requestCleanup = wil::scope_exit(\n            [winhttp, request] { winhttp->CloseHandle(request); });\n\n        THROW_IF_WIN32_BOOL_FALSE(\n            winhttp->SendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0,\n                                 WINHTTP_NO_REQUEST_DATA, 0, 0, 0));\n\n        THROW_IF_WIN32_BOOL_FALSE(winhttp->ReceiveResponse(request, nullptr));\n\n        DWORD statusCode = 0;\n        DWORD statusCodeSize = sizeof(statusCode);\n        THROW_IF_WIN32_BOOL_FALSE(winhttp->QueryHeaders(\n            request, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,\n            WINHTTP_HEADER_NAME_BY_INDEX, &statusCode, &statusCodeSize,\n            WINHTTP_NO_HEADER_INDEX));\n\n        auto content = std::make_unique<WH_URL_CONTENT>();\n        content->statusCode = statusCode;\n\n        std::string chunk;\n        std::vector<std::string> chunks;\n        DWORD downloaded = 0;\n        size_t downloadedTotal = 0;\n        do {\n            DWORD size = 0;\n            THROW_IF_WIN32_BOOL_FALSE(\n                winhttp->QueryDataAvailable(request, &size));\n\n            if (size == 0) {\n                break;\n            }\n\n            chunk.resize(size);\n            THROW_IF_WIN32_BOOL_FALSE(winhttp->ReadData(\n                request, (PVOID)chunk.data(), size, &downloaded));\n\n            if (targetFile) {\n                DWORD written = 0;\n                THROW_IF_WIN32_BOOL_FALSE(WriteFile(targetFile.get(),\n                                                    chunk.data(), downloaded,\n                                                    &written, nullptr));\n                THROW_WIN32_IF(ERROR_WRITE_FAULT, written != downloaded);\n            } else {\n                chunk.resize(downloaded);\n                chunks.push_back(std::move(chunk));\n                chunk.clear();\n            }\n\n            downloadedTotal += downloaded;\n        } while (downloaded > 0);\n\n        if (targetFile) {\n            content->data = nullptr;\n        } else {\n            auto data = std::make_unique<char[]>(downloadedTotal + 1);\n            size_t dataIter = 0;\n            for (const auto& chunk : chunks) {\n                std::copy(chunk.begin(), chunk.end(), data.get() + dataIter);\n                dataIter += chunk.size();\n            }\n            data[dataIter] = '\\0';\n            content->data = data.release();\n        }\n\n        content->length = downloadedTotal;\n\n        return content.release();\n    } catch (const std::exception& e) {\n        LogFunctionError(e);\n    }\n\n    return nullptr;\n}\n\nvoid LoadedMod::FreeUrlContent(const WH_URL_CONTENT* content) {\n    auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE();\n\n    if (content) {\n        delete[] content->data;\n        delete content;\n    }\n}\n\nstd::optional<std::wstring> LoadedMod::HookSymbolsGetOnlineCache(\n    PCWSTR onlineCacheBaseUrl,\n    std::wstring_view cacheStrKey) {\n    std::wstring onlineCacheUrl;\n    if (onlineCacheBaseUrl) {\n        onlineCacheUrl = onlineCacheBaseUrl;\n        if (!onlineCacheUrl.empty() && onlineCacheUrl.back() != L'/') {\n            onlineCacheUrl += L'/';\n        }\n    } else if (!m_modName.starts_with(L\"local@\")) {\n        onlineCacheUrl =\n            L\"https://ramensoftware.github.io/windhawk-mod-symbol-cache/\";\n        onlineCacheUrl += m_modName;\n        onlineCacheUrl += L'/';\n    }\n\n    if (onlineCacheUrl.empty()) {\n        VERBOSE(L\"Skipping online symbol cache\");\n        return std::wstring();\n    }\n\n    onlineCacheUrl += cacheStrKey;\n    onlineCacheUrl += L\".txt\";\n\n    // Keep trying shortly after launch in case it takes some time for internet\n    // connectivity to be established on startup.\n    ULONGLONG sessionCreationTime = wil::filetime::to_int64(\n        CustomizationSession::GetSessionManagerProcessCreationTime());\n\n    for (int i = 0;; i++) {\n        if (i > 0) {\n            ULONGLONG now =\n                wil::filetime::to_int64(wil::filetime::get_system_time());\n            if (now < sessionCreationTime ||\n                now > sessionCreationTime +\n                          wil::filetime_duration::one_second * 30) {\n                break;\n            }\n\n            // In case the mod was disabled, abort.\n            if (!Mod::ShouldLoadInRunningProcess(m_modName.c_str()) ||\n                CustomizationSession::IsEndingSoon()) {\n                VERBOSE(L\"Aborting getting online symbol cache\");\n                return std::nullopt;\n            }\n\n            Sleep(5000);\n\n            VERBOSE(L\"Getting online symbol cache (attempt %d)\", i + 1);\n        } else {\n            VERBOSE(L\"Getting online symbol cache\");\n        }\n\n        const WH_URL_CONTENT* onlineCacheUrlContent =\n            GetUrlContent(onlineCacheUrl.c_str(), nullptr);\n        if (!onlineCacheUrlContent) {\n            LOG(L\"Couldn't contact the online cache server\");\n            continue;\n        }\n\n        auto scopeFreeUrlContent =\n            wil::scope_exit([this, onlineCacheUrlContent]() {\n                FreeUrlContent(onlineCacheUrlContent);\n            });\n\n        if (onlineCacheUrlContent->statusCode == 200) {\n            return std::wstring(\n                onlineCacheUrlContent->data,\n                onlineCacheUrlContent->data + onlineCacheUrlContent->length);\n        }\n\n        if (onlineCacheUrlContent->statusCode == 404) {\n            VERBOSE(L\"Online cache not found\");\n            return std::wstring();\n        }\n\n        LOG(L\"Online cache server returned status %d\",\n            onlineCacheUrlContent->statusCode);\n    }\n\n    VERBOSE(\n        L\"In case of a firewall, you can open cmd manually and run the \"\n        L\"following command, then disable and re-enable the mod:\");\n    VERBOSE(\n        LR\"(for /f \"delims=\" %%I in ('curl -f %s') do @reg add \"HKLM\\SOFTWARE\\Windhawk\\Engine\\ModsWritable\\%s\\SymbolCache\" /t REG_SZ /v %.*s /d \"%%I\" /f)\",\n        onlineCacheUrl.c_str(), m_modName.c_str(),\n        wil::safe_cast<int>(cacheStrKey.length()), cacheStrKey.data());\n\n    return std::nullopt;\n}\n\nvoid LoadedMod::SetTask(PCWSTR task) {\n    try {\n        SetModMetadataValue(m_modTaskFile, task, L\"mod-task\",\n                            m_modInstanceId.c_str());\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n}\n\nvoid LoadedMod::LogFunctionError(const std::exception& e) {\n    LOG(L\"Mod %s error: %S\", m_modName.c_str(), e.what());\n}\n\nMod::Mod(PCWSTR modName)\n    : m_modName(modName), m_modInstanceId(GenerateModInstanceId(modName)) {\n    SetStatus(L\"Pending...\");\n}\n\nbool Mod::Load(bool loadedOnStartup) {\n    if (m_loadedMod) {\n        throw std::logic_error(\"Already loaded\");\n    }\n\n    if (IsModBanned(m_modName)) {\n        return false;\n    }\n\n    auto setStatusOnExit = wil::scope_exit(\n        [this] { SetStatus(m_loadedMod ? L\"Loaded\" : L\"Unloaded\"); });\n\n    auto& storageManager = StorageManager::GetInstance();\n    auto settings = storageManager.GetModConfig(m_modName.c_str(), nullptr);\n\n    m_libraryFileName = settings->GetString(L\"LibraryFileName\").value_or(L\"\");\n    if (m_libraryFileName.empty()) {\n        throw std::runtime_error(\"Missing LibraryFileName value\");\n    }\n\n    auto libraryPath = storageManager.GetModsPath() / m_libraryFileName;\n\n    m_settingsChangeTime = settings->GetInt(L\"SettingsChangeTime\").value_or(0);\n\n    bool loggingEnabled = settings->GetInt(L\"LoggingEnabled\").value_or(0);\n    bool debugLoggingEnabled =\n        settings->GetInt(L\"DebugLoggingEnabled\").value_or(0);\n\n    m_loadedMod = std::make_unique<LoadedMod>(\n        m_modName.c_str(), m_modInstanceId.c_str(), libraryPath.c_str(),\n        loadedOnStartup, loggingEnabled, debugLoggingEnabled);\n\n    SetStatus(L\"Loading...\");\n\n    if (!m_loadedMod->Initialize()) {\n        m_loadedMod.reset();\n        return false;\n    }\n\n    return true;\n}\n\nvoid Mod::AfterInit() {\n    if (m_loadedMod) {\n        m_loadedMod->AfterInit();\n    }\n}\n\nvoid Mod::BeforeUninit() {\n    if (m_loadedMod) {\n        m_loadedMod->BeforeUninit();\n    }\n}\n\nvoid Mod::Uninitialize() {\n    if (m_loadedMod) {\n        m_loadedMod->Uninitialize();\n    }\n}\n\nbool Mod::ApplyChangedSettings(bool* reload) {\n    *reload = false;\n\n    auto& storageManager = StorageManager::GetInstance();\n    auto settings = storageManager.GetModConfig(m_modName.c_str(), nullptr);\n\n    if (settings->GetString(L\"LibraryFileName\").value_or(L\"\") !=\n        m_libraryFileName) {\n        *reload = true;\n        return true;\n    }\n\n    int oldSettingsChangeTime = m_settingsChangeTime;\n    m_settingsChangeTime = settings->GetInt(L\"SettingsChangeTime\").value_or(0);\n\n    if (m_settingsChangeTime != oldSettingsChangeTime) {\n        if (!m_loadedMod) {\n            *reload = true;\n            return true;\n        }\n\n        if (!m_loadedMod->SettingsChanged(reload)) {\n            return false;\n        }\n    }\n\n    if (m_loadedMod) {\n        m_loadedMod->EnableLogging(\n            settings->GetInt(L\"LoggingEnabled\").value_or(0));\n\n        m_loadedMod->EnableDebugLogging(\n            settings->GetInt(L\"DebugLoggingEnabled\").value_or(0));\n    }\n\n    return true;\n}\n\nvoid Mod::Unload() {\n    m_loadedMod.reset();\n    SetStatus(L\"Unloaded\");\n}\n\nHMODULE Mod::GetLoadedModModuleHandle() {\n    return m_loadedMod ? m_loadedMod->GetModModuleHandle() : nullptr;\n}\n\n// static\nbool Mod::ShouldLoadInRunningProcess(PCWSTR modName) {\n    auto settings =\n        StorageManager::GetInstance().GetModConfig(modName, nullptr);\n\n    if (settings->GetInt(L\"Disabled\").value_or(0)) {\n        return false;\n    }\n\n    auto architecturePattern =\n        settings->GetString(L\"Architecture\").value_or(L\"\");\n    if (!architecturePattern.empty() &&\n        !DoesArchitectureMatchPattern(architecturePattern)) {\n        return false;\n    }\n\n    bool patternsMatchCriticalSystemProcesses =\n        settings->GetInt(L\"PatternsMatchCriticalSystemProcesses\").value_or(0);\n\n    std::wstring processPath = wil::GetModuleFileName<std::wstring>();\n\n    bool includeExcludeCustomOnly =\n        settings->GetInt(L\"IncludeExcludeCustomOnly\").value_or(0);\n\n    bool matchPatternExplicitOnly =\n        !patternsMatchCriticalSystemProcesses &&\n        (Functions::DoesPathMatchPattern(processPath,\n                                         ProcessLists::kCriticalProcesses) ||\n         Functions::DoesPathMatchPattern(\n             processPath, ProcessLists::kCriticalProcessesForMods));\n\n    bool include =\n        (!includeExcludeCustomOnly &&\n         Functions::DoesPathMatchPattern(\n             processPath, settings->GetString(L\"Include\").value_or(L\"\"),\n             matchPatternExplicitOnly)) ||\n        Functions::DoesPathMatchPattern(\n            processPath, settings->GetString(L\"IncludeCustom\").value_or(L\"\"),\n            matchPatternExplicitOnly);\n\n    if (!include) {\n        return false;\n    }\n\n    bool exclude =\n        (!includeExcludeCustomOnly &&\n         Functions::DoesPathMatchPattern(\n             processPath, settings->GetString(L\"Exclude\").value_or(L\"\"))) ||\n        Functions::DoesPathMatchPattern(\n            processPath, settings->GetString(L\"ExcludeCustom\").value_or(L\"\"));\n\n    return !exclude;\n}\n\nvoid Mod::SetStatus(PCWSTR status) {\n    try {\n        SetModMetadataValue(m_modStatusFile, status, L\"mod-status\",\n                            m_modInstanceId.c_str());\n    } catch (const std::exception& e) {\n        LOG(L\"%S\", e.what());\n    }\n}\n"
  },
  {
    "path": "src/windhawk/engine/mod.h",
    "content": "#pragma once\n\n#include \"mods_api.h\"\n\nclass LoadedMod {\n   public:\n    LoadedMod(PCWSTR modName,\n              PCWSTR modInstanceId,\n              PCWSTR libraryPath,\n              bool loadedOnStartup,\n              bool loggingEnabled,\n              bool debugLoggingEnabled);\n    ~LoadedMod();\n\n    // Disallow copy and move - we assume that the pointer of the class won't\n    // change.\n    LoadedMod(const LoadedMod&) = delete;\n    LoadedMod& operator=(const LoadedMod&) = delete;\n\n    bool Initialize();\n    void AfterInit();\n    void BeforeUninit();\n    void Uninitialize();\n    void EnableLogging(bool enable);\n    void EnableDebugLogging(bool enable);\n    bool SettingsChanged(bool* reload);\n\n    PCWSTR GetModName();\n    HMODULE GetModModuleHandle();\n\n    BOOL IsLogEnabled();\n    void Log(PCWSTR format, va_list args);\n\n    int GetIntValue(PCWSTR valueName, int defaultValue);\n    BOOL SetIntValue(PCWSTR valueName, int value);\n    size_t GetStringValue(PCWSTR valueName,\n                          PWSTR stringBuffer,\n                          size_t bufferChars);\n    BOOL SetStringValue(PCWSTR valueName, PCWSTR value);\n    size_t GetBinaryValue(PCWSTR valueName, void* buffer, size_t bufferSize);\n    BOOL SetBinaryValue(PCWSTR valueName,\n                        const void* buffer,\n                        size_t bufferSize);\n    BOOL DeleteValue(PCWSTR valueName);\n\n    size_t GetModStoragePath(PWSTR pathBuffer, size_t bufferChars);\n\n    int GetIntSetting(PCWSTR valueName, va_list args);\n    PCWSTR GetStringSetting(PCWSTR valueName, va_list args);\n    void FreeStringSetting(PCWSTR string);\n\n    BOOL SetFunctionHook(void* targetFunction,\n                         void* hookFunction,\n                         void** originalFunction);\n    BOOL RemoveFunctionHook(void* targetFunction);\n    BOOL ApplyHookOperations();\n\n    HANDLE FindFirstSymbol(HMODULE hModule,\n                           PCWSTR symbolServer,\n                           BYTE* findData);\n    HANDLE FindFirstSymbol2(HMODULE hModule,\n                            PCWSTR symbolServer,\n                            WH_FIND_SYMBOL* findData);\n    HANDLE FindFirstSymbol3(HMODULE hModule,\n                            const BYTE* options,\n                            WH_FIND_SYMBOL* findData);\n    HANDLE FindFirstSymbol4(HMODULE hModule,\n                            const WH_FIND_SYMBOL_OPTIONS* options,\n                            WH_FIND_SYMBOL* findData);\n    BOOL FindNextSymbol(HANDLE symSearch, BYTE* findData);\n    BOOL FindNextSymbol2(HANDLE symSearch, WH_FIND_SYMBOL* findData);\n    void FindCloseSymbol(HANDLE symSearch);\n\n    BOOL HookSymbols(HMODULE module,\n                     const WH_SYMBOL_HOOK* symbolHooks,\n                     size_t symbolHooksCount,\n                     const WH_HOOK_SYMBOLS_OPTIONS* options);\n\n    BOOL Disasm(void* address, WH_DISASM_RESULT* result);\n\n    const WH_URL_CONTENT* GetUrlContent(\n        PCWSTR url,\n        const WH_GET_URL_CONTENT_OPTIONS* options);\n    void FreeUrlContent(const WH_URL_CONTENT* content);\n\n   private:\n    std::optional<std::wstring> HookSymbolsGetOnlineCache(\n        PCWSTR onlineCacheBaseUrl,\n        std::wstring_view cacheStrKey);\n\n    void SetTask(PCWSTR task);\n    void LogFunctionError(const std::exception& e);\n\n    std::wstring m_modName;\n    std::wstring m_modInstanceId;\n    wil::unique_hfile m_modTaskFile;\n    bool m_loadedOnStartup;\n    std::atomic<bool> m_loggingEnabled = false;\n    std::atomic<bool> m_debugLoggingEnabled = false;\n    std::atomic<bool> m_initialized = false;\n    std::atomic<bool> m_uninitializing = false;\n\n    // Temporary compatibility flag.\n    const bool m_compatDemangling = false;\n\n    // Temporary compatibility shim library.\n    wil::unique_hmodule m_modShimLibrary;\n\n    wil::unique_hmodule m_modModule;\n};\n\nclass Mod {\n   public:\n    Mod(PCWSTR modName);\n\n    bool Load(bool loadedOnStartup);\n    void AfterInit();\n    void BeforeUninit();\n    void Uninitialize();\n    bool ApplyChangedSettings(bool* reload);\n    void Unload();\n\n    HMODULE GetLoadedModModuleHandle();\n\n    static bool ShouldLoadInRunningProcess(PCWSTR modName);\n\n   private:\n    void SetStatus(PCWSTR status);\n\n    std::wstring m_modName;\n    std::wstring m_modInstanceId;\n    wil::unique_hfile m_modStatusFile;\n    std::wstring m_libraryFileName;\n    int m_settingsChangeTime = 0;\n    std::unique_ptr<LoadedMod> m_loadedMod;\n};\n"
  },
  {
    "path": "src/windhawk/engine/mods_api.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"mod.h\"\n#include \"mods_api.h\"\n\nBOOL InternalWh_IsLogEnabled(void* mod) {\n    return static_cast<LoadedMod*>(mod)->IsLogEnabled();\n}\n\nvoid InternalWh_Log(void* mod, PCWSTR format, va_list args) {\n    static_cast<LoadedMod*>(mod)->Log(format, args);\n}\n\nint InternalWh_GetIntValue(void* mod, PCWSTR valueName, int defaultValue) {\n    return static_cast<LoadedMod*>(mod)->GetIntValue(valueName, defaultValue);\n}\n\nBOOL InternalWh_SetIntValue(void* mod, PCWSTR valueName, int value) {\n    return static_cast<LoadedMod*>(mod)->SetIntValue(valueName, value);\n}\n\nsize_t InternalWh_GetStringValue(void* mod,\n                                 PCWSTR valueName,\n                                 PWSTR stringBuffer,\n                                 size_t bufferChars) {\n    return static_cast<LoadedMod*>(mod)->GetStringValue(valueName, stringBuffer,\n                                                        bufferChars);\n}\n\nBOOL InternalWh_SetStringValue(void* mod, PCWSTR valueName, PCWSTR value) {\n    return static_cast<LoadedMod*>(mod)->SetStringValue(valueName, value);\n}\n\nsize_t InternalWh_GetBinaryValue(void* mod,\n                                 PCWSTR valueName,\n                                 void* buffer,\n                                 size_t bufferSize) {\n    return static_cast<LoadedMod*>(mod)->GetBinaryValue(valueName, buffer,\n                                                        bufferSize);\n}\n\nBOOL InternalWh_SetBinaryValue(void* mod,\n                               PCWSTR valueName,\n                               const void* buffer,\n                               size_t bufferSize) {\n    return static_cast<LoadedMod*>(mod)->SetBinaryValue(valueName, buffer,\n                                                        bufferSize);\n}\n\nBOOL InternalWh_DeleteValue(void* mod, PCWSTR valueName) {\n    return static_cast<LoadedMod*>(mod)->DeleteValue(valueName);\n}\n\nsize_t InternalWh_GetModStoragePath(void* mod,\n                                    PWSTR pathBuffer,\n                                    size_t bufferChars) {\n    return static_cast<LoadedMod*>(mod)->GetModStoragePath(pathBuffer,\n                                                           bufferChars);\n}\n\nint InternalWh_GetIntSetting(void* mod, PCWSTR valueName, va_list args) {\n    return static_cast<LoadedMod*>(mod)->GetIntSetting(valueName, args);\n}\n\nPCWSTR InternalWh_GetStringSetting(void* mod, PCWSTR valueName, va_list args) {\n    return static_cast<LoadedMod*>(mod)->GetStringSetting(valueName, args);\n}\n\nvoid InternalWh_FreeStringSetting(void* mod, PCWSTR string) {\n    static_cast<LoadedMod*>(mod)->FreeStringSetting(string);\n}\n\nBOOL InternalWh_SetFunctionHook(void* mod,\n                                void* targetFunction,\n                                void* hookFunction,\n                                void** originalFunction) {\n    return static_cast<LoadedMod*>(mod)->SetFunctionHook(\n        targetFunction, hookFunction, originalFunction);\n}\n\nBOOL InternalWh_RemoveFunctionHook(void* mod, void* targetFunction) {\n    return static_cast<LoadedMod*>(mod)->RemoveFunctionHook(targetFunction);\n}\n\nBOOL InternalWh_ApplyHookOperations(void* mod) {\n    return static_cast<LoadedMod*>(mod)->ApplyHookOperations();\n}\n\nHANDLE InternalWh_FindFirstSymbol(void* mod,\n                                  HMODULE hModule,\n                                  PCWSTR symbolServer,\n                                  BYTE* findData) {\n    return static_cast<LoadedMod*>(mod)->FindFirstSymbol(hModule, symbolServer,\n                                                         findData);\n}\n\nHANDLE InternalWh_FindFirstSymbol2(void* mod,\n                                   HMODULE hModule,\n                                   PCWSTR symbolServer,\n                                   WH_FIND_SYMBOL* findData) {\n    return static_cast<LoadedMod*>(mod)->FindFirstSymbol2(hModule, symbolServer,\n                                                          findData);\n}\n\nHANDLE InternalWh_FindFirstSymbol3(void* mod,\n                                   HMODULE hModule,\n                                   const BYTE* options,\n                                   WH_FIND_SYMBOL* findData) {\n    return static_cast<LoadedMod*>(mod)->FindFirstSymbol3(hModule, options,\n                                                          findData);\n}\n\nHANDLE InternalWh_FindFirstSymbol4(void* mod,\n                                   HMODULE hModule,\n                                   const WH_FIND_SYMBOL_OPTIONS* options,\n                                   WH_FIND_SYMBOL* findData) {\n    return static_cast<LoadedMod*>(mod)->FindFirstSymbol4(hModule, options,\n                                                          findData);\n}\n\nBOOL InternalWh_FindNextSymbol(void* mod, HANDLE symSearch, BYTE* findData) {\n    return static_cast<LoadedMod*>(mod)->FindNextSymbol(symSearch, findData);\n}\n\nBOOL InternalWh_FindNextSymbol2(void* mod,\n                                HANDLE symSearch,\n                                WH_FIND_SYMBOL* findData) {\n    return static_cast<LoadedMod*>(mod)->FindNextSymbol2(symSearch, findData);\n}\n\nvoid InternalWh_FindCloseSymbol(void* mod, HANDLE symSearch) {\n    static_cast<LoadedMod*>(mod)->FindCloseSymbol(symSearch);\n}\n\nBOOL InternalWh_HookSymbols(void* mod,\n                            HMODULE module,\n                            const WH_SYMBOL_HOOK* symbolHooks,\n                            size_t symbolHooksCount,\n                            const WH_HOOK_SYMBOLS_OPTIONS* options) {\n    return static_cast<LoadedMod*>(mod)->HookSymbols(module, symbolHooks,\n                                                     symbolHooksCount, options);\n}\n\nBOOL InternalWh_Disasm(void* mod, void* address, WH_DISASM_RESULT* result) {\n    return static_cast<LoadedMod*>(mod)->Disasm(address, result);\n}\n\nconst WH_URL_CONTENT* InternalWh_GetUrlContent(\n    void* mod,\n    PCWSTR url,\n    const WH_GET_URL_CONTENT_OPTIONS* options) {\n    return static_cast<LoadedMod*>(mod)->GetUrlContent(url, options);\n}\n\nvoid InternalWh_FreeUrlContent(void* mod, const WH_URL_CONTENT* content) {\n    static_cast<LoadedMod*>(mod)->FreeUrlContent(content);\n}\n"
  },
  {
    "path": "src/windhawk/engine/mods_api.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#ifndef WH_EDITING\n#include \"mods_api_internal.h\"\n#define WH_INTERNAL(x) (x)\n#define WH_INTERNAL_OR(x, y) (x)\n#else\n#define WH_INTERNAL(x)\n#define WH_INTERNAL_OR(x, y) (y)\n#endif\n\ntypedef struct tagWH_FIND_SYMBOL_OPTIONS {\n    // Must be set to `sizeof(WH_FIND_SYMBOL_OPTIONS)`.\n    size_t optionsSize;\n    // The symbol server to query. Set to `NULL` to query the Microsoft public\n    // symbol server.\n    PCWSTR symbolServer;\n    // Set to `TRUE` to only retrieve decorated symbols, making the enumeration\n    // faster. Can be especially useful for very large modules such as Chrome or\n    // Firefox.\n    BOOL noUndecoratedSymbols;\n} WH_FIND_SYMBOL_OPTIONS;\n\ntypedef struct tagWH_FIND_SYMBOL {\n    void* address;\n    PCWSTR symbol;\n    PCWSTR symbolDecorated;  // Since Windhawk v1.0\n} WH_FIND_SYMBOL;\n\ntypedef struct tagWH_HOOK_SYMBOLS_OPTIONS {\n    // Must be set to `sizeof(WH_HOOK_SYMBOLS_OPTIONS)`.\n    size_t optionsSize;\n    // Same as for `WH_FIND_SYMBOL_OPTIONS`.\n    PCWSTR symbolServer;\n    // Same as for `WH_FIND_SYMBOL_OPTIONS`.\n    BOOL noUndecoratedSymbols;\n    // The online cache URL that will be used before downloading the symbols.\n    // Set to `NULL` to use the default online cache URL. Set to an empty string\n    // to disable the online cache.\n    PCWSTR onlineCacheUrl;\n} WH_HOOK_SYMBOLS_OPTIONS;\n\ntypedef struct tagWH_DISASM_RESULT {\n    // The length of the decoded instruction.\n    size_t length;\n    // The textual, human-readable representation of the instruction.\n    char text[96];\n} WH_DISASM_RESULT;\n\ntypedef struct tagWH_GET_URL_CONTENT_OPTIONS {\n    // Must be set to `sizeof(WH_GET_URL_CONTENT_OPTIONS)`.\n    size_t optionsSize;\n    // The path to the file to which the content will be written. If set, the\n    // data will be written to the file and the `data` field of the returned\n    // struct will be `NULL`. If this field is `NULL`, the content will be\n    // returned in the `data` field.\n    PCWSTR targetFilePath;\n} WH_GET_URL_CONTENT_OPTIONS;\n\ntypedef struct tagWH_URL_CONTENT {\n    const char* data;\n    size_t length;\n    int statusCode;\n} WH_URL_CONTENT;\n\n// Definitions for mods.\n#ifdef WH_MOD\n\n// Placeholder values for the editor, will be defined when the mod is compiled.\n#ifdef WH_EDITING\n#define WH_MOD_ID L\"mod-id-placeholder\"\n#define WH_MOD_VERSION L\"1.0\"\n#endif\n\n#ifndef WH_EDITING\n#define Wh_Log(message, ...)                                       \\\n    do {                                                           \\\n        if (InternalWh_IsLogEnabled(InternalWhModPtr)) {           \\\n            InternalWh_Log_Wrapper(L\"[%d:%S]: \" message, __LINE__, \\\n                                   __FUNCTION__, ##__VA_ARGS__);   \\\n        }                                                          \\\n    } while (0)\n#else\n/**\n * @brief Logs a message. If logging is enabled, the message can be viewed in\n *     the editor log output window. The arguments are only evaluated if logging\n *     is enabled.\n * @param message The message to be logged. It can optionally contain embedded\n *     printf-style format specifiers that are replaced by the values specified\n *     in subsequent additional arguments and formatted as requested.\n * @return None.\n */\ninline void Wh_Log(PCWSTR message, ...) {}\n#endif\n\n/**\n * @brief Retrieves an integer value from the mod's local storage.\n * @param valueName The name of the value to retrieve.\n * @param defaultValue The default value to be returned as a fallback.\n * @return The retrieved integer value. If the value doesn't exist or in case of\n *     an error, the provided default value is returned.\n */\ninline int Wh_GetIntValue(PCWSTR valueName, int defaultValue) {\n    return WH_INTERNAL_OR(\n        InternalWh_GetIntValue(InternalWhModPtr, valueName, defaultValue), 0);\n}\n\n/**\n * @brief Stores an integer value in the mod's local storage.\n * @param valueName The name of the value to store.\n * @param value The value to store.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_SetIntValue(PCWSTR valueName, int value) {\n    return WH_INTERNAL_OR(\n        InternalWh_SetIntValue(InternalWhModPtr, valueName, value), FALSE);\n}\n\n/**\n * @brief Retrieves a string value from the mod's local storage.\n * @param valueName The name of the value to retrieve.\n * @param stringBuffer The buffer that will receive the text, terminated with a\n *     null character.\n * @param bufferChars The length of `stringBuffer`, in characters. The buffer\n *     must be large enough to include the terminating null character.\n * @return The number of characters copied to the buffer, not including the\n *     terminating null character. If the value doesn't exist, if the buffer is\n *     not large enough, or in case of an error, an empty string is returned.\n */\ninline size_t Wh_GetStringValue(PCWSTR valueName,\n                                PWSTR stringBuffer,\n                                size_t bufferChars) {\n    return WH_INTERNAL_OR(InternalWh_GetStringValue(InternalWhModPtr, valueName,\n                                                    stringBuffer, bufferChars),\n                          0);\n}\n\n/**\n * @brief Stores a string value in the mod's local storage.\n * @param valueName The name of the value to store.\n * @param value A null-terminated string containing the value to store.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_SetStringValue(PCWSTR valueName, PCWSTR value) {\n    return WH_INTERNAL_OR(\n        InternalWh_SetStringValue(InternalWhModPtr, valueName, value), FALSE);\n}\n\n/**\n * @brief Retrieves a binary value (raw bytes) from the mod's local storage.\n * @param valueName The name of the value to retrieve.\n * @param buffer The buffer that will receive the value.\n * @param bufferSize The length of the buffer, in bytes.\n * @return The number of bytes copied to the buffer. If the value doesn't exist,\n *     if the buffer is not large enough, or in case of an error, no data is\n *     copied and the return value is zero.\n */\ninline size_t Wh_GetBinaryValue(PCWSTR valueName,\n                                void* buffer,\n                                size_t bufferSize) {\n    return WH_INTERNAL_OR(InternalWh_GetBinaryValue(InternalWhModPtr, valueName,\n                                                    buffer, bufferSize),\n                          0);\n}\n\n/**\n * @brief Stores a binary value (raw bytes) in the mod's local storage.\n * @param valueName The name of the value to store.\n * @param buffer An array of bytes containing the value to store.\n * @param bufferSize The size of the array of bytes.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_SetBinaryValue(PCWSTR valueName,\n                              const void* buffer,\n                              size_t bufferSize) {\n    return WH_INTERNAL_OR(InternalWh_SetBinaryValue(InternalWhModPtr, valueName,\n                                                    buffer, bufferSize),\n                          FALSE);\n}\n\n/**\n * @brief Deletes a value from the mod's local storage.\n * @since Windhawk v1.5\n * @param valueName The name of the value to delete.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_DeleteValue(PCWSTR valueName) {\n    return WH_INTERNAL_OR(InternalWh_DeleteValue(InternalWhModPtr, valueName),\n                          FALSE);\n}\n\n/**\n * @brief Retrieves the mod's storage directory path. The directory can be used\n *     by the mod to store any necessary files. The directory will be removed\n *     when the mod is removed.\n * @param pathBuffer The buffer that will receive the path, terminated with a\n *     null character.\n * @param bufferChars The length of `pathBuffer`, in characters. The buffer must\n *     be large enough to include the terminating null character.\n * @return The number of characters copied to the buffer, not including the\n *     terminating null character. If the buffer is not large enough or in case\n *     of an error, an empty string is returned.\n */\ninline size_t Wh_GetModStoragePath(PWSTR pathBuffer, size_t bufferChars) {\n    return WH_INTERNAL_OR(\n        InternalWh_GetModStoragePath(InternalWhModPtr, pathBuffer, bufferChars),\n        0);\n}\n\n/**\n * @brief Retrieves an integer value from the mod's user settings.\n * @param valueName The name of the value to retrieve. It can optionally contain\n *     embedded printf-style format specifiers that are replaced by the values\n *     specified in subsequent additional arguments and formatted as requested.\n * @return The retrieved integer value. If the value doesn't exist or in case of\n *     an error, the return value is zero.\n */\ninline int Wh_GetIntSetting(PCWSTR valueName, ...) {\n    va_list args;\n    va_start(args, valueName);\n    int result = WH_INTERNAL_OR(\n        InternalWh_GetIntSetting(InternalWhModPtr, valueName, args), 0);\n    va_end(args);\n    return result;\n}\n\n/**\n * @brief Retrieves a string value from the mod's user settings. When no longer\n *     needed, free the memory with `Wh_FreeStringSetting`.\n * @param valueName The name of the value to retrieve. It can optionally contain\n *     embedded printf-style format specifiers that are replaced by the values\n *     specified in subsequent additional arguments and formatted as requested.\n * @return The retrieved string value. If the value doesn't exist or in case of\n *     an error, an empty string is returned.\n */\ninline PCWSTR Wh_GetStringSetting(PCWSTR valueName, ...) {\n    va_list args;\n    va_start(args, valueName);\n    PCWSTR result = WH_INTERNAL_OR(\n        InternalWh_GetStringSetting(InternalWhModPtr, valueName, args), L\"\");\n    va_end(args);\n    return result;\n}\n\n/**\n * @brief Frees a string returned by `Wh_GetStringSetting`.\n * @param string The string to free.\n * @return None.\n */\ninline void Wh_FreeStringSetting(PCWSTR string) {\n    WH_INTERNAL(InternalWh_FreeStringSetting(InternalWhModPtr, string));\n}\n\n/**\n * @brief Registers a hook for the specified target function. Can't be called\n *     after `Wh_ModBeforeUninit` returns. Registered hook operations can be\n *     applied with `Wh_ApplyHookOperations`.\n * @param targetFunction A pointer to the target function, which will be\n *     overridden by the detour function.\n * @param hookFunction A pointer to the detour function, which will override the\n *     target function.\n * @param originalFunction A pointer to the trampoline function, which will be\n *     used to call the original target function. Can be `NULL`.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_SetFunctionHook(void* targetFunction,\n                               void* hookFunction,\n                               void** originalFunction) {\n    return WH_INTERNAL_OR(\n        InternalWh_SetFunctionHook(InternalWhModPtr, targetFunction,\n                                   hookFunction, originalFunction),\n        FALSE);\n}\n\n/**\n * @brief Registers a hook to be removed for the specified target function.\n *     Can't be called before `Wh_ModInit` returns or after `Wh_ModBeforeUninit`\n *     returns. Registered hook operations can be applied with\n *     `Wh_ApplyHookOperations`.\n * @since Windhawk v1.0\n * @param targetFunction A pointer to the target function, for which the hook\n *     will be removed.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_RemoveFunctionHook(void* targetFunction) {\n    return WH_INTERNAL_OR(\n        InternalWh_RemoveFunctionHook(InternalWhModPtr, targetFunction), FALSE);\n}\n\n/**\n * @brief Applies hook operations registered by `Wh_SetFunctionHook` and\n *     `Wh_RemoveFunctionHook`. Called automatically by Windhawk after\n *     `Wh_ModInit`. Can't be called before `Wh_ModInit` returns or after\n *     `Wh_ModBeforeUninit` returns. Note: This function is very slow, avoid\n *     using it if possible. Ideally, all hooks should be set in `Wh_ModInit`\n *     and this function should never be used.\n * @since Windhawk v1.0\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_ApplyHookOperations() {\n    return WH_INTERNAL_OR(InternalWh_ApplyHookOperations(InternalWhModPtr),\n                          FALSE);\n}\n\n/**\n * @brief Returns information about the first symbol for the specified module\n *     handle.\n * @since `options` param since v1.4\n * @param hModule A handle to the loaded module whose information is being\n *     requested. If this parameter is `NULL`, the module of the current process\n *     (.exe file) is used.\n * @param options Can be used to customize the symbol enumeration. Pass `NULL`\n *     to use the default options.\n * @param findData A pointer to a structure to receive the symbol information.\n * @return A search handle used in a subsequent call to `Wh_FindNextSymbol` or\n *     `Wh_FindCloseSymbol`. If no symbols are found or in case of an error, the\n *     return value is `NULL`.\n */\ninline HANDLE Wh_FindFirstSymbol(HMODULE hModule,\n                                 const WH_FIND_SYMBOL_OPTIONS* options,\n                                 WH_FIND_SYMBOL* findData) {\n    return WH_INTERNAL_OR(InternalWh_FindFirstSymbol4(InternalWhModPtr, hModule,\n                                                      options, findData),\n                          NULL);\n}\n\n/**\n * @brief Returns information about the next symbol for the specified search\n *     handle, continuing an enumeration from a previous call to\n *     `Wh_FindFirstSymbol`.\n * @param symSearch A search handle returned by a previous call to\n *     `Wh_FindFirstSymbol`.\n * @param findData A pointer to a structure to receive the symbol information.\n * @return A boolean value indicating whether symbol information was retrieved.\n *     If no more symbols are found or in case of an error, the return value is\n *     `FALSE`.\n */\ninline BOOL Wh_FindNextSymbol(HANDLE symSearch, WH_FIND_SYMBOL* findData) {\n    return WH_INTERNAL_OR(\n        InternalWh_FindNextSymbol2(InternalWhModPtr, symSearch, findData),\n        FALSE);\n}\n\n/**\n * @brief Closes a file search handle opened by `Wh_FindFirstSymbol`.\n * @param symSearch The search handle. If symSearch is `NULL`, the function does\n *     nothing.\n * @return None.\n */\ninline void Wh_FindCloseSymbol(HANDLE symSearch) {\n    WH_INTERNAL(InternalWh_FindCloseSymbol(InternalWhModPtr, symSearch));\n}\n\n/**\n * @brief Disassembles an instruction and formats it to human-readable text.\n * @since Windhawk v1.2\n * @param address The address of the instruction to disassemble.\n * @param result A pointer to a structure to receive the disassembly\n *     information.\n * @return A boolean value indicating whether the function succeeded.\n */\ninline BOOL Wh_Disasm(void* address, WH_DISASM_RESULT* result) {\n    return WH_INTERNAL_OR(InternalWh_Disasm(InternalWhModPtr, address, result),\n                          FALSE);\n}\n\n/**\n * @brief Retrieves the content of a URL. When no longer needed, call\n *     `Wh_FreeUrlContent` to free the content.\n * @since Windhawk v1.5\n * @param url The URL to retrieve.\n * @param options The options for the URL content retrieval. Pass `NULL` to use\n *     the default options.\n * @return The retrieved content. In case of an error, `NULL` is returned.\n */\ninline const WH_URL_CONTENT* Wh_GetUrlContent(\n    PCWSTR url,\n    const WH_GET_URL_CONTENT_OPTIONS* options) {\n    return WH_INTERNAL_OR(\n        InternalWh_GetUrlContent(InternalWhModPtr, url, options), NULL);\n}\n\n/**\n * @brief Frees the content of a URL returned by `Wh_GetUrlContent`.\n * @since Windhawk v1.5\n * @param content The content to free. If `NULL`, the function does nothing.\n * @return None.\n */\ninline void Wh_FreeUrlContent(const WH_URL_CONTENT* content) {\n    WH_INTERNAL(InternalWh_FreeUrlContent(InternalWhModPtr, content));\n}\n\n#undef WH_INTERNAL\n#undef WH_INTERNAL_OR\n\n#endif  // WH_MOD\n"
  },
  {
    "path": "src/windhawk/engine/mods_api_internal.h",
    "content": "#pragma once\n\n#include <windows.h>\n\ntypedef struct tagWH_FIND_SYMBOL_OPTIONS WH_FIND_SYMBOL_OPTIONS;\ntypedef struct tagWH_FIND_SYMBOL WH_FIND_SYMBOL;\ntypedef struct tagWH_SYMBOL_HOOK {\n    const struct {\n        PCWSTR string;\n        size_t length;\n    }* symbols;\n    size_t symbolsCount;\n    void** pOriginalFunction;\n    void* hookFunction;\n    bool optional;\n} WH_SYMBOL_HOOK;\ntypedef struct tagWH_HOOK_SYMBOLS_OPTIONS WH_HOOK_SYMBOLS_OPTIONS;\ntypedef struct tagWH_DISASM_RESULT WH_DISASM_RESULT;\ntypedef struct tagWH_GET_URL_CONTENT_OPTIONS WH_GET_URL_CONTENT_OPTIONS;\ntypedef struct tagWH_URL_CONTENT WH_URL_CONTENT;\n\n// Internal functions, do not call directly.\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nBOOL InternalWh_IsLogEnabled(void* mod);\nvoid InternalWh_Log(void* mod, PCWSTR format, va_list args);\n\nint InternalWh_GetIntValue(void* mod, PCWSTR valueName, int defaultValue);\nBOOL InternalWh_SetIntValue(void* mod, PCWSTR valueName, int value);\nsize_t InternalWh_GetStringValue(void* mod,\n                                 PCWSTR valueName,\n                                 PWSTR stringBuffer,\n                                 size_t bufferChars);\nBOOL InternalWh_SetStringValue(void* mod, PCWSTR valueName, PCWSTR value);\nsize_t InternalWh_GetBinaryValue(void* mod,\n                                 PCWSTR valueName,\n                                 void* buffer,\n                                 size_t bufferSize);\nBOOL InternalWh_SetBinaryValue(void* mod,\n                               PCWSTR valueName,\n                               const void* buffer,\n                               size_t bufferSize);\nBOOL InternalWh_DeleteValue(void* mod, PCWSTR valueName);\n\nsize_t InternalWh_GetModStoragePath(void* mod,\n                                    PWSTR pathBuffer,\n                                    size_t bufferChars);\n\nint InternalWh_GetIntSetting(void* mod, PCWSTR valueName, va_list args);\nPCWSTR InternalWh_GetStringSetting(void* mod, PCWSTR valueName, va_list args);\nvoid InternalWh_FreeStringSetting(void* mod, PCWSTR string);\n\nBOOL InternalWh_SetFunctionHook(void* mod,\n                                void* targetFunction,\n                                void* hookFunction,\n                                void** originalFunction);\nBOOL InternalWh_RemoveFunctionHook(void* mod, void* targetFunction);\nBOOL InternalWh_ApplyHookOperations(void* mod);\n\nHANDLE InternalWh_FindFirstSymbol4(void* mod,\n                                   HMODULE hModule,\n                                   const WH_FIND_SYMBOL_OPTIONS* options,\n                                   WH_FIND_SYMBOL* findData);\nBOOL InternalWh_FindNextSymbol2(void* mod,\n                                HANDLE symSearch,\n                                WH_FIND_SYMBOL* findData);\nvoid InternalWh_FindCloseSymbol(void* mod, HANDLE symSearch);\n\nBOOL InternalWh_HookSymbols(void* mod,\n                            HMODULE module,\n                            const WH_SYMBOL_HOOK* symbolHooks,\n                            size_t symbolHooksCount,\n                            const WH_HOOK_SYMBOLS_OPTIONS* options);\n\nBOOL InternalWh_Disasm(void* mod, void* address, WH_DISASM_RESULT* result);\n\nconst WH_URL_CONTENT* InternalWh_GetUrlContent(\n    void* mod,\n    PCWSTR url,\n    const WH_GET_URL_CONTENT_OPTIONS* options);\nvoid InternalWh_FreeUrlContent(void* mod, const WH_URL_CONTENT* content);\n\n#ifdef __cplusplus\n}\n#endif\n\n// Internal definitions for mods.\n#ifdef WH_MOD\n\ninline void* InternalWhModPtr;\n\ninline void InternalWh_Log_Wrapper(PCWSTR format, ...) {\n    va_list args;\n    va_start(args, format);\n    InternalWh_Log(InternalWhModPtr, format, args);\n    va_end(args);\n}\n\ninline BOOL InternalWh_HookSymbols_Wrapper(\n    HMODULE module,\n    const WH_SYMBOL_HOOK* symbolHooks,\n    size_t symbolHooksCount,\n    const WH_HOOK_SYMBOLS_OPTIONS* options) {\n    return InternalWh_HookSymbols(InternalWhModPtr, module, symbolHooks,\n                                  symbolHooksCount, options);\n}\n\n#endif  // WH_MOD\n"
  },
  {
    "path": "src/windhawk/engine/mods_manager.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"logger.h\"\n#include \"mods_manager.h\"\n#include \"storage_manager.h\"\n\nnamespace {\n\nDWORD GetModuleSizeOfImage(HMODULE module) {\n    IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)module;\n    IMAGE_NT_HEADERS* ntHeader =\n        (IMAGE_NT_HEADERS*)((BYTE*)dosHeader + dosHeader->e_lfanew);\n    return ntHeader->OptionalHeader.SizeOfImage;\n}\n\n}  // namespace\n\nModsManager::ModsManager() {\n    StorageManager::GetInstance().EnumMods([this](PCWSTR modName) {\n        try {\n            if (Mod::ShouldLoadInRunningProcess(modName)) {\n                auto result = m_mods.emplace(modName, modName);\n                if (!result.second) {\n                    throw std::logic_error(\n                        \"A mod with that name is already loaded\");\n                }\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) initializing failed: %S\", modName, e.what());\n        }\n    });\n\n    for (auto& [name, mod] : m_mods) {\n        try {\n            mod.Load(/*loadedOnStartup=*/true);\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) loading failed: %S\", name.c_str(), e.what());\n        }\n    }\n}\n\nModsManager::~ModsManager() {\n    std::vector<ThreadCallStackRegionInfo> regions;\n\n    for (auto& [name, mod] : m_mods) {\n        try {\n            mod.Uninitialize();\n\n            if (HMODULE module = mod.GetLoadedModModuleHandle()) {\n                regions.push_back({\n                    .address = reinterpret_cast<DWORD_PTR>(module),\n                    .size = GetModuleSizeOfImage(module),\n                });\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) Uninitialize failed: %S\", name.c_str(), e.what());\n        }\n    }\n\n    if (!regions.empty()) {\n        ThreadsCallStackWaitForRegions(\n            regions.data(), static_cast<DWORD>(regions.size()), 200, 400);\n    }\n}\n\nvoid ModsManager::AfterInit() {\n    for (auto& [name, mod] : m_mods) {\n        try {\n            mod.AfterInit();\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) AfterInit failed: %S\", name.c_str(), e.what());\n        }\n    }\n}\n\nvoid ModsManager::BeforeUninit() {\n    for (auto& [name, mod] : m_mods) {\n        try {\n            mod.BeforeUninit();\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) BeforeUninit failed: %S\", name.c_str(), e.what());\n        }\n    }\n}\n\nvoid ModsManager::ReloadModsAndSettings() {\n    std::unordered_set<std::wstring> modsToKeepLoaded;\n    std::unordered_set<std::wstring> modsToKeepUnloaded;\n    std::vector<std::wstring> modsToLoad;\n\n    StorageManager::GetInstance().EnumMods([this, &modsToKeepLoaded,\n                                            &modsToKeepUnloaded,\n                                            &modsToLoad](PCWSTR modName) {\n        try {\n            bool shouldBeLoaded = Mod::ShouldLoadInRunningProcess(modName);\n            if (!shouldBeLoaded) {\n                return;\n            }\n\n            auto it = m_mods.find(modName);\n            if (it != m_mods.end()) {\n                auto& loadedMod = it->second;\n\n                bool reload = false;\n                if (!loadedMod.ApplyChangedSettings(&reload)) {\n                    modsToKeepUnloaded.emplace(modName);\n                } else if (reload) {\n                    modsToLoad.emplace_back(modName);\n                } else {\n                    modsToKeepLoaded.emplace(modName);\n                }\n            } else {\n                modsToLoad.emplace_back(modName);\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) reloading failed: %S\", modName, e.what());\n        }\n    });\n\n    for (auto& [name, mod] : m_mods) {\n        if (!modsToKeepLoaded.contains(name)) {\n            try {\n                mod.BeforeUninit();\n            } catch (const std::exception& e) {\n                LOG(L\"Mod (%s) BeforeUninit failed: %S\", name.c_str(),\n                    e.what());\n            }\n        }\n    }\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    MH_STATUS status = MH_ApplyQueuedEx(MH_ALL_IDENTS);\n    if (status != MH_OK) {\n        LOG(L\"MH_ApplyQueuedEx failed with %d\", status);\n    }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n\n    std::vector<ThreadCallStackRegionInfo> regions;\n\n    for (auto& [name, mod] : m_mods) {\n        if (!modsToKeepLoaded.contains(name)) {\n            try {\n                mod.Uninitialize();\n\n                if (HMODULE module = mod.GetLoadedModModuleHandle()) {\n                    regions.push_back({\n                        .address = reinterpret_cast<DWORD_PTR>(module),\n                        .size = GetModuleSizeOfImage(module),\n                    });\n                }\n            } catch (const std::exception& e) {\n                LOG(L\"Mod (%s) Uninitialize failed: %S\", name.c_str(),\n                    e.what());\n            }\n        }\n    }\n\n    if (!regions.empty()) {\n        ThreadsCallStackWaitForRegions(\n            regions.data(), static_cast<DWORD>(regions.size()), 200, 400);\n    }\n\n    for (auto it = m_mods.begin(); it != m_mods.end();) {\n        auto& [name, mod] = *it;\n        if (modsToKeepLoaded.contains(name)) {\n            ++it;\n        } else if (modsToKeepUnloaded.contains(name)) {\n            mod.Unload();\n            ++it;\n        } else {\n            it = m_mods.erase(it);\n        }\n    }\n\n    for (const auto& modName : modsToLoad) {\n        try {\n            auto result = m_mods.emplace(modName, modName.c_str());\n            if (!result.second) {\n                throw std::logic_error(\n                    \"A mod with that name is already loaded\");\n            }\n        } catch (const std::exception& e) {\n            LOG(L\"Mod (%s) initializing failed: %S\", modName.c_str(), e.what());\n        }\n    }\n\n    for (const auto& modName : modsToLoad) {\n        auto i = m_mods.find(modName);\n        if (i != m_mods.end()) {\n            auto& loadedMod = i->second;\n            try {\n                loadedMod.Load(/*loadedOnStartup=*/false);\n            } catch (const std::exception& e) {\n                LOG(L\"Mod (%s) loading failed: %S\", modName.c_str(), e.what());\n            }\n        }\n    }\n\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n    status = MH_ApplyQueuedEx(MH_ALL_IDENTS);\n    if (status != MH_OK) {\n        LOG(L\"MH_ApplyQueuedEx failed with %d\", status);\n    }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n\n    for (const auto& modName : modsToLoad) {\n        auto i = m_mods.find(modName);\n        if (i != m_mods.end()) {\n            auto& loadedMod = i->second;\n            try {\n                loadedMod.AfterInit();\n            } catch (const std::exception& e) {\n                LOG(L\"Mod (%s) AfterInit failed: %S\", modName.c_str(),\n                    e.what());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/windhawk/engine/mods_manager.h",
    "content": "#pragma once\n\n#include \"mod.h\"\n\nclass ModsManager {\n   public:\n    ModsManager();\n    ~ModsManager();\n\n    ModsManager(const ModsManager&) = delete;\n    ModsManager& operator=(const ModsManager&) = delete;\n\n    void AfterInit();\n    void BeforeUninit();\n    void ReloadModsAndSettings();\n\n   private:\n    std::unordered_map<std::wstring, Mod> m_mods;\n};\n"
  },
  {
    "path": "src/windhawk/engine/new_process_injector.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"dll_inject.h\"\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"new_process_injector.h\"\n#include \"process_lists.h\"\n#include \"session_private_namespace.h\"\n#include \"storage_manager.h\"\n\n// This static pointer is used in the hook procedure.\n// As a result, only one instance of the class can be used at any given time.\n\n// static\nstd::atomic<NewProcessInjector*> NewProcessInjector::m_pThis;\n\nnamespace {\n\nHANDLE CreateProcessInitAPCMutex(HANDLE sessionManagerProcess,\n                                 DWORD processId,\n                                 BOOL initialOwner) {\n    DWORD dwSessionManagerProcessId = GetProcessId(sessionManagerProcess);\n    THROW_LAST_ERROR_IF(dwSessionManagerProcessId == 0);\n\n    WCHAR szMutexName[SessionPrivateNamespace::kPrivateNamespaceMaxLen +\n                      sizeof(\"\\\\ProcessInitAPCMutex-pid=1234567890\")];\n    int mutexNamePos = SessionPrivateNamespace::MakeName(\n        szMutexName, dwSessionManagerProcessId);\n    swprintf_s(szMutexName + mutexNamePos,\n               ARRAYSIZE(szMutexName) - mutexNamePos,\n               L\"\\\\ProcessInitAPCMutex-pid=%u\", processId);\n\n    wil::unique_hlocal secDesc;\n    THROW_IF_WIN32_BOOL_FALSE(\n        Functions::GetFullAccessSecurityDescriptor(&secDesc, nullptr));\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    wil::unique_mutex_nothrow mutex(\n        CreateMutex(&secAttr, initialOwner, szMutexName));\n    THROW_LAST_ERROR_IF_NULL(mutex);\n\n    return mutex.release();\n}\n\n}  // namespace\n\nNewProcessInjector::NewProcessInjector(HANDLE hSessionManagerProcess)\n    : m_sessionManagerProcess(hSessionManagerProcess) {\n    NewProcessInjector* pNullptr = nullptr;\n    if (!m_pThis.compare_exchange_strong(pNullptr, this)) {\n        throw std::logic_error(\n            \"Only one instance is supported at any given time\");\n    }\n\n    bool createProcessInternalWHooked = false;\n\n    // Try kernelbase.dll first.\n    HMODULE hKernelBase = GetModuleHandle(L\"kernelbase.dll\");\n    if (hKernelBase) {\n        CreateProcessInternalW_t pCreateProcessInternalW =\n            reinterpret_cast<CreateProcessInternalW_t>(\n                GetProcAddress(hKernelBase, \"CreateProcessInternalW\"));\n        if (pCreateProcessInternalW) {\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n            if (MH_CreateHook(\n                    pCreateProcessInternalW, CreateProcessInternalW_Hook,\n                    reinterpret_cast<void**>(\n                        &m_originalCreateProcessInternalW)) == MH_OK) {\n                MH_QueueEnableHook(pCreateProcessInternalW);\n                createProcessInternalWHooked = true;\n            }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n        }\n    }\n\n    if (!createProcessInternalWHooked) {\n        // Try kernel32.dll next.\n        HMODULE hKernel32 = GetModuleHandle(L\"kernel32.dll\");\n        if (hKernel32) {\n            CreateProcessInternalW_t pCreateProcessInternalW =\n                reinterpret_cast<CreateProcessInternalW_t>(\n                    GetProcAddress(hKernel32, \"CreateProcessInternalW\"));\n            if (pCreateProcessInternalW) {\n#ifdef WH_HOOKING_ENGINE_MINHOOK\n                if (MH_CreateHook(\n                        pCreateProcessInternalW, CreateProcessInternalW_Hook,\n                        reinterpret_cast<void**>(\n                            &m_originalCreateProcessInternalW)) == MH_OK) {\n                    MH_QueueEnableHook(pCreateProcessInternalW);\n                    createProcessInternalWHooked = true;\n                }\n#elif WH_HOOKING_ENGINE == WH_HOOKING_ENGINE_NONE\n// For testing without a hooking engine.\n#else\n#error \"Unsupported hooking engine\"\n#endif  // WH_HOOKING_ENGINE\n            }\n        }\n    }\n\n    if (!createProcessInternalWHooked) {\n        LOG(L\"Failed to hook CreateProcessInternalW\");\n    }\n\n    auto settings = StorageManager::GetInstance().GetAppConfig(L\"Settings\");\n    m_includePattern = settings->GetString(L\"Include\").value_or(L\"\");\n    m_excludePattern = settings->GetString(L\"Exclude\").value_or(L\"\");\n    m_threadAttachExemptPattern =\n        settings->GetString(L\"ThreadAttachExempt\").value_or(L\"\");\n\n    if (!settings->GetInt(L\"InjectIntoCriticalProcesses\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kCriticalProcesses;\n    }\n\n    if (!settings->GetInt(L\"InjectIntoIncompatiblePrograms\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kIncompatiblePrograms;\n    }\n\n    if (!settings->GetInt(L\"InjectIntoGames\").value_or(0)) {\n        if (!m_excludePattern.empty()) {\n            m_excludePattern += L'|';\n        }\n\n        m_excludePattern += ProcessLists::kGames;\n    }\n}\n\nNewProcessInjector::~NewProcessInjector() {\n    while (m_hookProcCallCounter > 0) {\n        Sleep(10);\n    }\n\n    NewProcessInjector* pThis = this;\n    if (!m_pThis.compare_exchange_strong(pThis, nullptr)) {\n        LOG(L\"compare_exchange_strong() failed, something is very wrong\");\n    }\n}\n\n// static\nBOOL WINAPI NewProcessInjector::CreateProcessInternalW_Hook(\n    HANDLE hUserToken,\n    LPCWSTR lpApplicationName,\n    LPWSTR lpCommandLine,\n    LPSECURITY_ATTRIBUTES lpProcessAttributes,\n    LPSECURITY_ATTRIBUTES lpThreadAttributes,\n    BOOL bInheritHandles,\n    DWORD dwCreationFlags,\n    LPVOID lpEnvironment,\n    LPCWSTR lpCurrentDirectory,\n    LPSTARTUPINFOW lpStartupInfo,\n    LPPROCESS_INFORMATION lpProcessInformation,\n    PHANDLE hRestrictedUserToken) {\n    NewProcessInjector* pThis = m_pThis;\n\n    ++(pThis->m_hookProcCallCounter);\n\n    BOOL bRet;\n\n    __try {\n        DWORD dwNewCreationFlags = dwCreationFlags | CREATE_SUSPENDED;\n\n        bRet = pThis->m_originalCreateProcessInternalW(\n            hUserToken, lpApplicationName, lpCommandLine, lpProcessAttributes,\n            lpThreadAttributes, bInheritHandles, dwNewCreationFlags,\n            lpEnvironment, lpCurrentDirectory, lpStartupInfo,\n            lpProcessInformation, hRestrictedUserToken);\n\n        DWORD dwError = GetLastError();\n\n        if (bRet) {\n            pThis->HandleCreatedProcess(lpProcessInformation);\n\n            if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n                ResumeThread(lpProcessInformation->hThread);\n            }\n\n            VERBOSE(\n                L\"New process %u from CreateProcessInternalW(\\\"%s\\\", \\\"%s\\\")\",\n                lpProcessInformation->dwProcessId,\n                lpApplicationName ? lpApplicationName : L\"(NULL)\",\n                lpCommandLine ? lpCommandLine : L\"(NULL)\");\n        }\n\n        SetLastError(dwError);\n    } __finally {\n        --(pThis->m_hookProcCallCounter);\n    }\n\n    return bRet;\n}\n\nvoid NewProcessInjector::HandleCreatedProcess(\n    LPPROCESS_INFORMATION lpProcessInformation) {\n    try {\n        auto processImageName = wil::QueryFullProcessImageName<std::wstring>(\n            lpProcessInformation->hProcess);\n\n        if (ShouldSkipNewProcess(processImageName)) {\n            VERBOSE(L\"Skipping excluded process %u\",\n                    lpProcessInformation->dwProcessId);\n            return;\n        }\n\n        bool threadAttachExempt = ShouldAttachExemptThread(processImageName);\n\n        wil::unique_mutex_nothrow mutex(CreateProcessInitAPCMutex(\n            m_sessionManagerProcess, lpProcessInformation->dwProcessId, FALSE));\n        if (GetLastError() == ERROR_ALREADY_EXISTS) {\n            // Make sure the main thread doesn't begin execution before the\n            // APC is queued.\n            THROW_LAST_ERROR_IF(WaitForSingleObject(mutex.get(), INFINITE) ==\n                                WAIT_FAILED);\n            ReleaseMutex(mutex.get());\n            return;\n        }\n\n        DllInject::DllInject(\n            lpProcessInformation->hProcess, lpProcessInformation->hThread,\n            m_sessionManagerProcess, mutex.get(), threadAttachExempt);\n        VERBOSE(L\"DllInject succeeded for new process %u\",\n                lpProcessInformation->dwProcessId);\n    } catch (const std::exception& e) {\n        LOG(L\"Error for new process %u: %S\", lpProcessInformation->dwProcessId,\n            e.what());\n    }\n}\n\nbool NewProcessInjector::ShouldSkipNewProcess(\n    std::wstring_view processImageName) const {\n    return Functions::DoesPathMatchPattern(processImageName,\n                                           m_excludePattern) &&\n           !Functions::DoesPathMatchPattern(processImageName, m_includePattern);\n}\n\nbool NewProcessInjector::ShouldAttachExemptThread(\n    std::wstring_view processImageName) const {\n    return Functions::DoesPathMatchPattern(processImageName,\n                                           m_threadAttachExemptPattern);\n}\n"
  },
  {
    "path": "src/windhawk/engine/new_process_injector.h",
    "content": "#pragma once\n\nclass NewProcessInjector {\n   public:\n    NewProcessInjector(HANDLE hSessionManagerProcess);\n    ~NewProcessInjector();\n\n    // Disable copying and moving to keep using the same counter variable.\n    NewProcessInjector(const NewProcessInjector&) = delete;\n    NewProcessInjector(NewProcessInjector&&) noexcept = delete;\n    NewProcessInjector& operator=(const NewProcessInjector&) = delete;\n    NewProcessInjector& operator=(NewProcessInjector&&) noexcept = delete;\n\n   private:\n    using CreateProcessInternalW_t =\n        BOOL(WINAPI*)(HANDLE hUserToken,\n                      LPCWSTR lpApplicationName,\n                      LPWSTR lpCommandLine,\n                      LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                      LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                      BOOL bInheritHandles,\n                      DWORD dwCreationFlags,\n                      LPVOID lpEnvironment,\n                      LPCWSTR lpCurrentDirectory,\n                      LPSTARTUPINFOW lpStartupInfo,\n                      LPPROCESS_INFORMATION lpProcessInformation,\n                      PHANDLE hRestrictedUserToken);\n\n    static BOOL WINAPI\n    CreateProcessInternalW_Hook(HANDLE hUserToken,\n                                LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation,\n                                PHANDLE hRestrictedUserToken);\n    void HandleCreatedProcess(LPPROCESS_INFORMATION lpProcessInformation);\n    bool ShouldSkipNewProcess(std::wstring_view processImageName) const;\n    bool ShouldAttachExemptThread(std::wstring_view processImageName) const;\n\n    // Limited to a single instance at a time.\n    static std::atomic<NewProcessInjector*> m_pThis;\n\n    HANDLE m_sessionManagerProcess;\n    CreateProcessInternalW_t m_originalCreateProcessInternalW = nullptr;\n    std::atomic<int> m_hookProcCallCounter = 0;\n    std::wstring m_includePattern;\n    std::wstring m_excludePattern;\n    std::wstring m_threadAttachExemptPattern;\n};\n"
  },
  {
    "path": "src/windhawk/engine/no_destructor.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"no_destructor.h\"\n\n// static\nstd::atomic<bool> NoDestructorIfTerminatingBase::m_is_terminating = false;\n"
  },
  {
    "path": "src/windhawk/engine/no_destructor.h",
    "content": "// Copyright 2018 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Based on:\n// https://github.com/chromium/chromium/blob/4808fbec01e831578da940a4ef323b5ab20ae057/base/no_destructor.h\n// The main difference is that NoDestructorIfTerminating only skips destruction\n// if the process is terminating.\n\n#pragma once\n\n// Helper type to create a function-local static variable of type `T` when `T`\n// has a non-trivial destructor. Storing a `T` in a `base::NoDestructor<T>` will\n// prevent `~T()` from running, even when the variable goes out of scope.\n//\n// Useful when a variable has static storage duration but its type has a\n// non-trivial destructor. Chromium bans global constructors and destructors:\n// using a function-local static variable prevents the former, while using\n// `base::NoDestructor<T>` prevents the latter.\n//\n// ## Caveats\n//\n// - Must not be used for locals or fields; by definition, this does not run\n//   destructors, and this will likely lead to memory leaks and other\n//   surprising and undesirable behaviour.\n//\n// - If `T` is not constexpr constructible, must be a function-local static\n//   variable, since a global `NoDestructor<T>` will still generate a static\n//   initializer.\n//\n// - If `T` is constinit constructible, may be used as a global, but mark the\n//   global `constinit`.\n//\n// - If the data is rarely used, consider creating it on demand rather than\n//   caching it for the lifetime of the program. Though `base::NoDestructor<T>`\n//   does not heap allocate, the compiler still reserves space in bss for\n//   storing `T`, which costs memory at runtime.\n//\n// - If `T` is trivially destructible, do not use `base::NoDestructor<T>`:\n//\n//     const uint64_t GetUnstableSessionSeed() {\n//       // No need to use `base::NoDestructor<T>` as `uint64_t` is trivially\n//       // destructible and does not require a global destructor.\n//       static const uint64_t kSessionSeed = base::RandUint64();\n//       return kSessionSeed;\n//     }\n//\n// ## Example Usage\n//\n// const std::string& GetDefaultText() {\n//   // Required since `static const std::string` requires a global destructor.\n//   static const base::NoDestructor<std::string> s(\"Hello world!\");\n//   return *s;\n// }\n//\n// More complex initialization using a lambda:\n//\n// const std::string& GetRandomNonce() {\n//   // `nonce` is initialized with random data the first time this function is\n//   // called, but its value is fixed thereafter.\n//   static const base::NoDestructor<std::string> nonce([] {\n//     std::string s(16);\n//     crypto::RandString(s.data(), s.size());\n//     return s;\n//   }());\n//   return *nonce;\n// }\n//\n// ## Thread safety\n//\n// Initialisation of function-local static variables is thread-safe since C++11.\n// The standard guarantees that:\n//\n// - function-local static variables will be initialised the first time\n//   execution passes through the declaration.\n//\n// - if another thread's execution concurrently passes through the declaration\n//   in the middle of initialisation, that thread will wait for the in-progress\n//   initialisation to complete.\n\nclass NoDestructorIfTerminatingBase {\n   public:\n    static void SetProcessTerminating() { m_is_terminating = true; }\n\n   protected:\n    static std::atomic<bool> m_is_terminating;\n};\n\ntemplate <typename T>\nclass NoDestructorIfTerminating : public NoDestructorIfTerminatingBase {\n   public:\n    static_assert(!(std::is_trivially_constructible_v<T> &&\n                    std::is_trivially_destructible_v<T>),\n                  \"T is trivially constructible and destructible; please use a \"\n                  \"constinit object of type T directly instead\");\n\n    static_assert(\n        !std::is_trivially_destructible_v<T>,\n        \"T is trivially destructible; please use a function-local static \"\n        \"of type T directly instead\");\n\n    // Not constexpr; just write static constexpr T x = ...; if the value should\n    // be a constexpr.\n    template <typename... Args>\n    explicit NoDestructorIfTerminating(Args&&... args) {\n        new (storage_) T(std::forward<Args>(args)...);\n    }\n\n    // Allows copy and move construction of the contained type, to allow\n    // construction from an initializer list, e.g. for std::vector.\n    explicit NoDestructorIfTerminating(const T& x) { new (storage_) T(x); }\n    explicit NoDestructorIfTerminating(T&& x) {\n        new (storage_) T(std::move(x));\n    }\n\n    NoDestructorIfTerminating(const NoDestructorIfTerminating&) = delete;\n    NoDestructorIfTerminating& operator=(const NoDestructorIfTerminating&) =\n        delete;\n\n    ~NoDestructorIfTerminating() {\n        if (!m_is_terminating) {\n            reinterpret_cast<T*>(storage_)->~T();\n        }\n    }\n\n    const T& operator*() const { return *get(); }\n    T& operator*() { return *get(); }\n\n    const T* operator->() const { return get(); }\n    T* operator->() { return get(); }\n\n    const T* get() const { return reinterpret_cast<const T*>(storage_); }\n    T* get() { return reinterpret_cast<T*>(storage_); }\n\n   private:\n    alignas(T) char storage_[sizeof(T)];\n\n#if defined(LEAK_SANITIZER)\n    // TODO(crbug.com/40562930): This is a hack to work around the fact\n    // that LSan doesn't seem to treat NoDestructor as a root for reachability\n    // analysis. This means that code like this:\n    //   static base::NoDestructor<std::vector<int>> v({1, 2, 3});\n    // is considered a leak. Using the standard leak sanitizer annotations to\n    // suppress leaks doesn't work: std::vector is implicitly constructed before\n    // calling the base::NoDestructor constructor.\n    //\n    // Unfortunately, I haven't been able to demonstrate this issue in simpler\n    // reproductions: until that's resolved, hold an explicit pointer to the\n    // placement-new'd object in leak sanitizer mode to help LSan realize that\n    // objects allocated by the contained type are still reachable.\n    T* storage_ptr_ = reinterpret_cast<T*>(storage_);\n#endif  // defined(LEAK_SANITIZER)\n};\n"
  },
  {
    "path": "src/windhawk/engine/process_lists.h",
    "content": "#pragma once\n\nnamespace ProcessLists {\n\n// Based on:\n// https://www.elastic.co/guide/en/security/current/unusual-parent-child-relationship.html\n// https://github.com/elastic/security-docs/blob/9e98d789cb7b8d8fe98a3c3dec5012c4e1f22e99/docs/detections/prebuilt-rules/rule-details/unusual-parent-child-relationship.asciidoc\ninline constexpr WCHAR kCriticalProcesses[] =\n    LR\"(%systemroot%\\system32\\autochk.exe|)\"\n    LR\"(%systemroot%\\syswow64\\autochk.exe|)\"\n    LR\"(%systemroot%\\system32\\chkdsk.exe|)\"\n    LR\"(%systemroot%\\syswow64\\chkdsk.exe|)\"\n    // LR\"(%systemroot%\\system32\\conhost.exe|)\"\n    LR\"(%systemroot%\\system32\\consent.exe|)\"\n    LR\"(%systemroot%\\system32\\csrss.exe|)\"\n    // LR\"(%systemroot%\\system32\\dllhost.exe|)\"\n    // LR\"(%systemroot%\\syswow64\\dllhost.exe|)\"\n    LR\"(%systemroot%\\system32\\doskey.exe|)\"\n    LR\"(%systemroot%\\syswow64\\doskey.exe|)\"\n    LR\"(%systemroot%\\system32\\dwm.exe|)\"\n    LR\"(%systemroot%\\system32\\fontdrvhost.exe|)\"\n    LR\"(%systemroot%\\system32\\logonui.exe|)\"\n    LR\"(%systemroot%\\system32\\lsaiso.exe|)\"\n    LR\"(%systemroot%\\system32\\lsass.exe|)\"\n    // LR\"(%systemroot%\\system32\\runtimebroker.exe|)\"\n    LR\"(%systemroot%\\system32\\searchindexer.exe|)\"\n    LR\"(%systemroot%\\syswow64\\searchindexer.exe|)\"\n    LR\"(%systemroot%\\system32\\searchprotocolhost.exe|)\"\n    LR\"(%systemroot%\\syswow64\\searchprotocolhost.exe|)\"\n    LR\"(%systemroot%\\system32\\services.exe|)\"\n    LR\"(%systemroot%\\system32\\setupcl.exe|)\"\n    LR\"(%systemroot%\\system32\\smss.exe|)\"\n    LR\"(%systemroot%\\system32\\spoolsv.exe|)\"\n    // LR\"(%systemroot%\\system32\\svchost.exe|)\"\n    // LR\"(%systemroot%\\syswow64\\svchost.exe|)\"\n    LR\"(%systemroot%\\system32\\taskhostw.exe|)\"\n    // LR\"(%systemroot%\\system32\\userinit.exe|)\"\n    // LR\"(%systemroot%\\syswow64\\userinit.exe|)\"\n    // LR\"(%systemroot%\\system32\\werfault.exe|)\"\n    // LR\"(%systemroot%\\syswow64\\werfault.exe|)\"\n    LR\"(%systemroot%\\system32\\werfaultsecure.exe|)\"\n    LR\"(%systemroot%\\syswow64\\werfaultsecure.exe|)\"\n    LR\"(%systemroot%\\system32\\wermgr.exe|)\"\n    LR\"(%systemroot%\\syswow64\\wermgr.exe|)\"\n    LR\"(%systemroot%\\system32\\wininit.exe|)\"\n    // LR\"(%systemroot%\\system32\\winlogon.exe|)\"\n    LR\"(%systemroot%\\system32\\winrshost.exe|)\"\n    LR\"(%systemroot%\\syswow64\\winrshost.exe|)\"\n    LR\"(%systemroot%\\system32\\wbem\\wmiprvse.exe|)\"\n    LR\"(%systemroot%\\syswow64\\wbem\\wmiprvse.exe|)\"\n    LR\"(%systemroot%\\system32\\wsmprovhost.exe|)\"\n    LR\"(%systemroot%\\syswow64\\wsmprovhost.exe)\";\n\ninline constexpr WCHAR kCriticalProcessesForMods[] =\n    LR\"(%systemroot%\\system32\\svchost.exe|)\"\n    LR\"(%systemroot%\\syswow64\\svchost.exe|)\"\n    LR\"(%systemroot%\\system32\\werfault.exe|)\"\n    LR\"(%systemroot%\\syswow64\\werfault.exe|)\"\n    LR\"(%systemroot%\\system32\\winlogon.exe)\";\n\ninline constexpr WCHAR kIncompatiblePrograms[] =\n    LR\"(%ProgramFiles%\\Oracle\\VirtualBox\\*|)\"\n    LR\"(%ProgramFiles(X86)%\\Oracle\\VirtualBox\\*)\";\n\n#define ALL_PROGRAM_FILES(folder) \\\n    LR\"(?:\\Program Files\\)\" folder LR\"(\\*|?:\\Program Files (x86)\\)\" folder LR\"(\\*|)\"\n\ninline constexpr WCHAR kGames[] =\n    ALL_PROGRAM_FILES(L\"2K Games\")\n    ALL_PROGRAM_FILES(L\"Activision\")\n    ALL_PROGRAM_FILES(L\"Battle.net\")\n    ALL_PROGRAM_FILES(L\"Bethesda Softworks\")\n    ALL_PROGRAM_FILES(L\"Bethesda.net Launcher\")\n    ALL_PROGRAM_FILES(L\"Blizzard Entertainment\")\n    ALL_PROGRAM_FILES(L\"EA Games\")\n    ALL_PROGRAM_FILES(L\"EA\")\n    ALL_PROGRAM_FILES(L\"EasyAntiCheat_EOS\")\n    ALL_PROGRAM_FILES(L\"Electronic Arts\")\n    ALL_PROGRAM_FILES(L\"Epic Games\")\n    ALL_PROGRAM_FILES(L\"GOG Galaxy\")\n    ALL_PROGRAM_FILES(L\"Google\\\\Play Games\")\n    ALL_PROGRAM_FILES(L\"Google\\\\Play Games Services\")\n    ALL_PROGRAM_FILES(L\"Grinding Gear Games\")\n    ALL_PROGRAM_FILES(L\"Microsoft Games\")\n    ALL_PROGRAM_FILES(L\"Origin Games\")\n    ALL_PROGRAM_FILES(L\"Paradox Interactive\")\n    ALL_PROGRAM_FILES(L\"Riot Games\")\n    ALL_PROGRAM_FILES(L\"Rockstar Games\")\n    ALL_PROGRAM_FILES(L\"Square Enix\")\n    ALL_PROGRAM_FILES(L\"Steam\")\n    ALL_PROGRAM_FILES(L\"Ubisoft\")\n    ALL_PROGRAM_FILES(L\"Valve\")\n    ALL_PROGRAM_FILES(L\"Wargaming.net\")\n    LR\"(?:\\Epic Games\\*|)\"\n    LR\"(?:\\Games\\*|)\"\n    LR\"(?:\\Riot Games\\*|)\"\n    LR\"(?:\\WindowsApps\\Microsoft.MinecraftUWP_*\\*|)\"\n    LR\"(?:\\WindowsApps\\Microsoft.SunriseBaseGame_*\\*|)\"\n    LR\"(*\\steamapps\\common\\*)\";\n\n#undef ALL_PROGRAM_FILES\n\n}  // namespace ProcessLists\n"
  },
  {
    "path": "src/windhawk/engine/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by rsrc.rc\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        101\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/rsrc.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE 9, 1\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE  \nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE  \nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE  \nBEGIN\n    \"#include \"\"rsrc.rc2\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n#include \"rsrc.rc2\"\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "src/windhawk/engine/session_private_namespace.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"session_private_namespace.h\"\n\nnamespace {\n\nwil::unique_boundary_descriptor BuildBoundaryDescriptor(PCWSTR descriptorName) {\n    wil::unique_boundary_descriptor boundaryDesc(\n        CreateBoundaryDescriptor(descriptorName, 0));\n    THROW_LAST_ERROR_IF_NULL(boundaryDesc);\n\n    {\n        wil::unique_sid pSID;\n        SID_IDENTIFIER_AUTHORITY SIDWorldAuth = SECURITY_WORLD_SID_AUTHORITY;\n        THROW_IF_WIN32_BOOL_FALSE(AllocateAndInitializeSid(\n            &SIDWorldAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSID));\n\n        THROW_IF_WIN32_BOOL_FALSE(\n            AddSIDToBoundaryDescriptor(boundaryDesc.addressof(), pSID.get()));\n    }\n\n    {\n        wil::unique_sid pSID;\n        SID_IDENTIFIER_AUTHORITY SIDMandatoryLabelAuth =\n            SECURITY_MANDATORY_LABEL_AUTHORITY;\n        THROW_IF_WIN32_BOOL_FALSE(AllocateAndInitializeSid(\n            &SIDMandatoryLabelAuth, 1, SECURITY_MANDATORY_MEDIUM_RID, 0, 0, 0,\n            0, 0, 0, 0, &pSID));\n\n        THROW_IF_WIN32_BOOL_FALSE(AddIntegrityLabelToBoundaryDescriptor(\n            boundaryDesc.addressof(), pSID.get()));\n    }\n\n    return boundaryDesc;\n}\n\n}  // namespace\n\nnamespace SessionPrivateNamespace {\n\nint MakeName(WCHAR szPrivateNamespaceName[kPrivateNamespaceMaxLen + 1],\n             DWORD dwSessionManagerProcessId) noexcept {\n    static_assert(kPrivateNamespaceMaxLen + 1 ==\n                  sizeof(\"WindhawkSession1234567890\"));\n    return swprintf_s(szPrivateNamespaceName, kPrivateNamespaceMaxLen + 1,\n                      L\"WindhawkSession%u\", dwSessionManagerProcessId);\n}\n\nwil::unique_private_namespace_destroy Create(DWORD dwSessionManagerProcessId) {\n    WCHAR szPrivateNamespaceName[kPrivateNamespaceMaxLen + 1];\n    MakeName(szPrivateNamespaceName, dwSessionManagerProcessId);\n\n    // Note: We use the private namespace name as the boundary name too. We want\n    // both the boundary (the actual isolation) and the namespace (the name for\n    // that isolation) to be unique for the session manager process.\n    //\n    // * Boundary: If not unique, it will prevent other session managers from\n    //   creating their own private namespaces, and will generally prevent\n    //   isolation for multiple Windhawk versions running simultaneously.\n    // * Namespace: If not unique, different Windhawk engine versions loaded in\n    //   the same process won't be able to operate simultaneously.\n    wil::unique_boundary_descriptor boundaryDesc(\n        BuildBoundaryDescriptor(szPrivateNamespaceName));\n\n    wil::unique_hlocal secDesc;\n    THROW_IF_WIN32_BOOL_FALSE(\n        Functions::GetFullAccessSecurityDescriptor(&secDesc, nullptr));\n\n    SECURITY_ATTRIBUTES secAttr = {sizeof(SECURITY_ATTRIBUTES)};\n    secAttr.lpSecurityDescriptor = secDesc.get();\n    secAttr.bInheritHandle = FALSE;\n\n    wil::unique_private_namespace_destroy privateNamespace(\n        CreatePrivateNamespace(&secAttr, (void*)boundaryDesc.get(),\n                               szPrivateNamespaceName));\n    THROW_LAST_ERROR_IF_NULL(privateNamespace);\n\n    return privateNamespace;\n}\n\nwil::unique_private_namespace_close Open(DWORD dwSessionManagerProcessId) {\n    WCHAR szPrivateNamespaceName[kPrivateNamespaceMaxLen + 1];\n    MakeName(szPrivateNamespaceName, dwSessionManagerProcessId);\n\n    // Note: We use the private namespace name as the boundary name too. See the\n    // note at Create().\n    wil::unique_boundary_descriptor boundaryDesc(\n        BuildBoundaryDescriptor(szPrivateNamespaceName));\n\n    wil::unique_private_namespace_close privateNamespace(OpenPrivateNamespace(\n        (void*)boundaryDesc.get(), szPrivateNamespaceName));\n    THROW_LAST_ERROR_IF_NULL(privateNamespace);\n\n    return privateNamespace;\n}\n\n}  // namespace SessionPrivateNamespace\n"
  },
  {
    "path": "src/windhawk/engine/session_private_namespace.h",
    "content": "#pragma once\n\nnamespace SessionPrivateNamespace {\n\nconstexpr size_t kPrivateNamespaceMaxLen =\n    sizeof(\"WindhawkSession1234567890\") - 1;\n\nint MakeName(WCHAR szPrivateNamespaceName[kPrivateNamespaceMaxLen + 1],\n             DWORD dwSessionManagerProcessId) noexcept;\nwil::unique_private_namespace_destroy Create(DWORD dwSessionManagerProcessId);\nwil::unique_private_namespace_close Open(DWORD dwSessionManagerProcessId);\n\n}  // namespace SessionPrivateNamespace\n"
  },
  {
    "path": "src/windhawk/engine/stdafx.cpp",
    "content": "#include \"stdafx.h\"\n"
  },
  {
    "path": "src/windhawk/engine/stdafx.h",
    "content": "#pragma once\n\n#define WINVER _WIN32_WINNT_WIN7\n#define _WIN32_WINNT _WIN32_WINNT_WIN7\n#define _WIN32_IE _WIN32_IE_IE80\n#define NTDDI_VERSION NTDDI_WIN7\n\n#define WIN32_LEAN_AND_MEAN\n#define NOMINMAX\n#include <windows.h>\n\n#include <dbghelp.h>\n#include <ntsecapi.h>\n#include <sddl.h>\n#include <shlobj.h>\n#include <tlhelp32.h>\n#include <winhttp.h>\n\n// STL\n\n#include <atomic>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <exception>\n#include <filesystem>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <new>\n#include <optional>\n#include <ranges>\n#include <stdexcept>\n#include <string>\n#include <tuple>\n#include <type_traits>\n#include <unordered_map>\n#include <unordered_set>\n#include <utility>\n#include <variant>\n#include <vector>\n\nusing namespace std::string_view_literals;\n\n// Libraries\n\n#include <dia/dia2.h>\n#include <dia/diacreate.h>\n\n#include <thread-call-stack-scanner/ThreadsCallStackWaitForRegions.h>\n\n#define TLS_NO_DEBUG\n#include <ThreadLocal.h>\n\n#include <wil/stl.h>  // must be included before other wil includes\n\n#include <wil/com.h>\n#include <wil/resource.h>\n#include <wil/result.h>\n#include <wil/safecast.h>\n#include <wil/win32_helpers.h>\n\n#ifdef _M_IX86\n#include <wow64pp/wow64pp.hpp>\n#endif\n\n// Disasm engine\n\n#if defined(_M_IX86) || defined(_M_X64)\n#include <Zydis/Zydis.h>\n#elif defined(_M_ARM64)\n#include <binaryninja-arm64-disassembler/decompose_and_disassemble.h>\n#endif\n\n// Hooking engine\n\n#if 0\n#define WH_HOOKING_ENGINE_MINHOOK\n#include <MinHook/include/MinHook.h>\n#elif 1\n#define WH_HOOKING_ENGINE_MINHOOK\n#define WH_HOOKING_ENGINE_MINHOOK_DETOURS\n#include <MinHook-Detours/MinHook.h>\n#else\n#error \"This option is only for testing\"\n#endif\n"
  },
  {
    "path": "src/windhawk/engine/storage_manager.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"storage_manager.h\"\n#include \"var_init_once.h\"\n\nextern HINSTANCE g_hDllInst;\n\nnamespace {\n\nstd::filesystem::path PathFromStorage(\n    const PortableSettings& storage,\n    PCWSTR valueName,\n    const std::filesystem::path& baseFolderPath) {\n    auto storedPath = storage.GetString(valueName).value_or(L\"\");\n    if (storedPath.empty()) {\n        throw std::runtime_error(\"Missing path value\");\n    }\n\n#ifndef _WIN64\n    BOOL isWow64;\n    if (IsWow64Process(GetCurrentProcess(), &isWow64) && isWow64) {\n        // Get the native Program Files path regardless of the current process\n        // architecture.\n        storedPath =\n            Functions::ReplaceAll(storedPath, L\"%ProgramFiles%\",\n                                  L\"%ProgramW6432%\", /*ignoreCase=*/true);\n    }\n#endif  // _WIN64\n\n    auto expandedPath =\n        wil::ExpandEnvironmentStrings<std::wstring>(storedPath.c_str());\n\n    // Some processes, e.g. csrss.exe, have a limited amount of environment\n    // variables set. Specifically, we need %ProgramData%, so if it's missing,\n    // replace it manually.\n    if (GetEnvironmentVariable(L\"ProgramData\", nullptr, 0) == 0 &&\n        GetLastError() == ERROR_ENVVAR_NOT_FOUND) {\n        bool replaced = false;\n\n        // Avoid having shell32.dll in the import table, since it might not be\n        // available in all cases, e.g. sandboxed processes.\n        using SHGetKnownFolderPath_t = decltype(&SHGetKnownFolderPath);\n\n        LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(\n            SHGetKnownFolderPath_t, pSHGetKnownFolderPath, L\"shell32.dll\",\n            LOAD_LIBRARY_SEARCH_SYSTEM32, \"SHGetKnownFolderPath\");\n\n        if (pSHGetKnownFolderPath) {\n            PWSTR programData;\n            HRESULT hr = pSHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr,\n                                               &programData);\n            if (SUCCEEDED(hr)) {\n                expandedPath = Functions::ReplaceAll(\n                    expandedPath, L\"%ProgramData%\", programData,\n                    /*ignoreCase=*/true);\n                replaced = true;\n            }\n\n            // Avoid having ole32.dll in the import table, since it might not\n            // be available in all cases, e.g. sandboxed processes.\n            using CoTaskMemFree_t = decltype(&CoTaskMemFree);\n\n            LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(\n                CoTaskMemFree_t, pCoTaskMemFree, L\"ole32.dll\",\n                LOAD_LIBRARY_SEARCH_SYSTEM32, \"CoTaskMemFree\");\n\n            if (pCoTaskMemFree) {\n                pCoTaskMemFree(programData);\n            }\n        }\n\n        // If SHGetKnownFolderPath failed, try to get the system drive from\n        // environment variables.\n        if (!replaced) {\n            std::wstring systemDrive;\n            if (SUCCEEDED(\n                    wil::GetEnvironmentVariable(L\"SystemDrive\", systemDrive)) &&\n                !systemDrive.empty()) {\n                expandedPath = Functions::ReplaceAll(\n                    expandedPath, L\"%ProgramData%\",\n                    systemDrive + L\"\\\\ProgramData\", /*ignoreCase=*/true);\n                replaced = true;\n            }\n        }\n\n        // If all else fails, replace %ProgramData% with a hardcoded path.\n        if (!replaced) {\n            expandedPath = Functions::ReplaceAll(expandedPath, L\"%ProgramData%\",\n                                                 L\"C:\\\\ProgramData\",\n                                                 /*ignoreCase=*/true);\n        }\n    }\n\n    return (baseFolderPath / expandedPath).lexically_normal();\n}\n\n}  // namespace\n\n// static\nStorageManager& StorageManager::GetInstance() {\n    STATIC_INIT_ONCE(NoDestructorIfTerminating<StorageManager>, s);\n    return **s;\n}\n\nstd::unique_ptr<PortableSettings> StorageManager::GetAppConfig(PCWSTR section) {\n    if (portableStorage) {\n        const auto& iniFileSettingsPath = std::get<IniFilePath>(settingsPath);\n        return std::make_unique<IniFileSettings>(\n            iniFileSettingsPath.path.c_str(), section, false);\n    } else {\n        const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n        std::wstring subKey = registrySettingsPath.subKey + L'\\\\' + section;\n        return std::make_unique<RegistrySettings>(registrySettingsPath.hKey,\n                                                  subKey.c_str(), false);\n    }\n}\n\nstd::unique_ptr<PortableSettings> StorageManager::GetModConfig(PCWSTR modName,\n                                                               PCWSTR section) {\n    if (portableStorage) {\n        std::wstring iniFileName = modName;\n        iniFileName += L\".ini\";\n        auto modConfigPath = appDataPath / L\"Mods\" / iniFileName;\n        return std::make_unique<IniFileSettings>(\n            modConfigPath.c_str(), section ? section : L\"Mod\", false);\n    } else {\n        const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n        std::wstring subKey =\n            registrySettingsPath.subKey + L\"\\\\Mods\\\\\" + modName;\n        if (section) {\n            subKey += L\"\\\\\";\n            subKey += section;\n        }\n\n        return std::make_unique<RegistrySettings>(registrySettingsPath.hKey,\n                                                  subKey.c_str(), false);\n    }\n}\n\nstd::unique_ptr<PortableSettings> StorageManager::GetModWritableConfig(\n    PCWSTR modName,\n    PCWSTR section,\n    bool write) {\n    if (portableStorage) {\n        auto modsWritablePath = appDataPath / L\"ModsWritable\";\n\n        if (write && !std::filesystem::is_directory(modsWritablePath)) {\n            std::error_code ec;\n            std::filesystem::create_directories(modsWritablePath, ec);\n        }\n\n        std::wstring iniFileName = modName;\n        iniFileName += L\".ini\";\n        auto modConfigPath = modsWritablePath / iniFileName;\n        return std::make_unique<IniFileSettings>(\n            modConfigPath.c_str(), section ? section : L\"Mod\", write);\n    } else {\n        const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n        std::wstring subKey =\n            registrySettingsPath.subKey + L\"\\\\ModsWritable\\\\\" + modName;\n        if (section) {\n            subKey += L\"\\\\\";\n            subKey += section;\n        }\n\n        return std::make_unique<RegistrySettings>(registrySettingsPath.hKey,\n                                                  subKey.c_str(), write);\n    }\n}\n\nvoid StorageManager::EnumMods(std::function<void(PCWSTR)> enumCallback) {\n    if (portableStorage) {\n        IniFilesEnumMods(std::move(enumCallback));\n    } else {\n        RegistryEnumMods(std::move(enumCallback));\n    }\n}\n\nstd::filesystem::path StorageManager::GetModStoragePath(PCWSTR modName) {\n    auto modStoragePath =\n        appDataPath / L\"ModsWritable\" / L\"mod-storage\" / modName;\n\n    if (!std::filesystem::is_directory(modStoragePath)) {\n        std::error_code ec;\n        std::filesystem::create_directories(modStoragePath, ec);\n    }\n\n    return modStoragePath;\n}\n\nstd::filesystem::path StorageManager::GetModMetadataPath(\n    PCWSTR metadataCategory) {\n    return appDataPath / L\"ModsWritable\" / metadataCategory;\n}\n\nwil::unique_hfile StorageManager::CreateModMetadataFile(PCWSTR metadataCategory,\n                                                        PCWSTR modInstanceId) {\n    auto metadataCategoryPath = GetModMetadataPath(metadataCategory);\n\n    if (!std::filesystem::is_directory(metadataCategoryPath)) {\n        std::error_code ec;\n        std::filesystem::create_directories(metadataCategoryPath, ec);\n    }\n\n    auto metadataFilePath = metadataCategoryPath / modInstanceId;\n\n    wil::unique_hfile file(CreateFile(\n        metadataFilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, nullptr,\n        CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,\n        nullptr));\n    THROW_LAST_ERROR_IF(!file);\n\n    return file;\n}\n\nvoid StorageManager::SetModMetadataValue(wil::unique_hfile& file,\n                                         PCWSTR value) {\n    THROW_LAST_ERROR_IF(SetFilePointer(file.get(), 0, nullptr, FILE_BEGIN) ==\n                        INVALID_SET_FILE_POINTER);\n    THROW_IF_WIN32_BOOL_FALSE(SetEndOfFile(file.get()));\n\n    DWORD dwNumberOfBytesWritten;\n    THROW_IF_WIN32_BOOL_FALSE(WriteFile(\n        file.get(), value, wil::safe_cast<DWORD>(wcslen(value) * sizeof(WCHAR)),\n        &dwNumberOfBytesWritten, nullptr));\n}\n\nstd::filesystem::path StorageManager::GetEnginePath(USHORT machine) {\n    std::filesystem::path libraryPath =\n        wil::GetModuleFileName<std::wstring>(g_hDllInst);\n\n    auto folderPath = libraryPath.parent_path();\n\n    if (machine == IMAGE_FILE_MACHINE_UNKNOWN) {\n        // Use current architecture.\n#if defined(_M_IX86)\n        machine = IMAGE_FILE_MACHINE_I386;\n#elif defined(_M_X64)\n        machine = IMAGE_FILE_MACHINE_AMD64;\n#elif defined(_M_ARM64)\n        machine = IMAGE_FILE_MACHINE_ARM64;\n#else\n#error \"Unsupported architecture\"\n#endif\n    }\n\n    PCWSTR newFolderName;\n    switch (machine) {\n        case IMAGE_FILE_MACHINE_I386:\n            newFolderName = L\"32\";\n            break;\n\n        case IMAGE_FILE_MACHINE_AMD64:\n            newFolderName = L\"64\";\n            break;\n\n        case IMAGE_FILE_MACHINE_ARM64:\n            newFolderName = L\"arm64\";\n            break;\n\n        default:\n            throw std::logic_error(\"Unknown architecture\");\n    }\n\n    return folderPath.parent_path() / newFolderName;\n}\n\nstd::filesystem::path StorageManager::GetModsPath(USHORT machine) {\n    if (machine == IMAGE_FILE_MACHINE_UNKNOWN) {\n        // Use current architecture.\n#if defined(_M_IX86)\n        machine = IMAGE_FILE_MACHINE_I386;\n#elif defined(_M_X64)\n        machine = IMAGE_FILE_MACHINE_AMD64;\n#elif defined(_M_ARM64)\n        machine = IMAGE_FILE_MACHINE_ARM64;\n#else\n#error \"Unsupported architecture\"\n#endif\n    }\n\n    PCWSTR folderName;\n    switch (machine) {\n        case IMAGE_FILE_MACHINE_I386:\n            folderName = L\"32\";\n            break;\n\n        case IMAGE_FILE_MACHINE_AMD64:\n            folderName = L\"64\";\n            break;\n\n        case IMAGE_FILE_MACHINE_ARM64:\n            folderName = L\"arm64\";\n            break;\n\n        default:\n            throw std::logic_error(\"Unknown architecture\");\n    }\n\n    return appDataPath / L\"Mods\" / folderName;\n}\n\nstd::filesystem::path StorageManager::GetSymbolsPath() {\n    return appDataPath / L\"Symbols\";\n}\n\nStorageManager::StorageManager() {\n    std::filesystem::path dllPath =\n        wil::GetModuleFileName<std::wstring>(g_hDllInst);\n\n    std::filesystem::path iniFileFolder = dllPath.parent_path().parent_path();\n    std::filesystem::path iniFilePath = iniFileFolder / L\"engine.ini\";\n\n    if (!std::filesystem::is_regular_file(iniFilePath)) {\n        throw std::runtime_error(\"engine.ini not found\");\n    }\n\n    auto storage = IniFileSettings(iniFilePath.c_str(), L\"Storage\", false);\n\n    appDataPath = PathFromStorage(storage, L\"AppDataPath\", iniFileFolder);\n\n    if (!std::filesystem::is_directory(appDataPath)) {\n        std::error_code ec;\n        std::filesystem::create_directories(appDataPath, ec);\n    }\n\n    portableStorage = storage.GetInt(L\"Portable\").value_or(0);\n    if (portableStorage) {\n        settingsPath = IniFilePath{appDataPath / L\"settings.ini\"};\n    } else {\n        std::wstring registryKey =\n            storage.GetString(L\"RegistryKey\").value_or(L\"\");\n        if (registryKey.empty()) {\n            throw std::runtime_error(\"Missing RegistryKey value\");\n        }\n\n        auto firstBackslash = registryKey.find(L'\\\\');\n        if (firstBackslash == registryKey.npos) {\n            throw std::runtime_error(\"Invalid RegistryKey value\");\n        }\n\n        HKEY hkey;\n\n        std::wstring baseKey = registryKey.substr(0, firstBackslash);\n        if (baseKey == L\"HKEY_CURRENT_USER\" || baseKey == L\"HKCU\") {\n            hkey = HKEY_CURRENT_USER;\n        } else if (baseKey == L\"HKEY_USERS\" || baseKey == L\"HKU\") {\n            hkey = HKEY_USERS;\n        } else if (baseKey == L\"HKEY_LOCAL_MACHINE\" || baseKey == L\"HKLM\") {\n            hkey = HKEY_LOCAL_MACHINE;\n        } else {\n            throw std::runtime_error(\"Unsupported RegistryKey value\");\n        }\n\n        std::wstring subKey = registryKey.substr(firstBackslash + 1);\n\n        settingsPath = RegistryPath{hkey, std::move(subKey)};\n    }\n}\n\nStorageManager::~StorageManager() = default;\n\nvoid StorageManager::RegistryEnumMods(\n    std::function<void(PCWSTR)> enumCallback) {\n    const auto& registrySettingsPath = std::get<RegistryPath>(settingsPath);\n    std::wstring subKey = registrySettingsPath.subKey + L\"\\\\Mods\";\n\n    wil::unique_hkey hModsKey;\n    LSTATUS error =\n        RegCreateKeyEx(registrySettingsPath.hKey, subKey.c_str(), 0, nullptr, 0,\n                       KEY_READ | KEY_WOW64_64KEY, nullptr, &hModsKey, nullptr);\n    THROW_IF_WIN32_ERROR(error);\n\n    std::wstring subKeyName;\n    DWORD dwMaxSubKeyLen;\n    bool shouldUpdateMaxSubKeyLen = true;\n\n    DWORD dwIndex = 0;\n    while (true) {\n        if (shouldUpdateMaxSubKeyLen) {\n            error = RegQueryInfoKey(hModsKey.get(), nullptr, nullptr, nullptr,\n                                    nullptr, &dwMaxSubKeyLen, nullptr, nullptr,\n                                    nullptr, nullptr, nullptr, nullptr);\n            THROW_IF_WIN32_ERROR(error);\n\n            subKeyName.resize(wil::safe_cast<size_t>(dwMaxSubKeyLen) + 1);\n\n            shouldUpdateMaxSubKeyLen = false;\n        }\n\n        DWORD dwSubKeyLen = dwMaxSubKeyLen + 1;\n\n        error = RegEnumKeyEx(hModsKey.get(), dwIndex, &subKeyName[0],\n                             &dwSubKeyLen, nullptr, nullptr, nullptr, nullptr);\n        if (error == ERROR_NO_MORE_ITEMS) {\n            break;\n        }\n\n        if (error == ERROR_MORE_DATA) {\n            shouldUpdateMaxSubKeyLen = true;\n            continue;  // perhaps value was updated, try again\n        }\n\n        THROW_IF_WIN32_ERROR(error);\n\n        enumCallback(subKeyName.c_str());\n\n        dwIndex++;\n    }\n}\n\nvoid StorageManager::IniFilesEnumMods(\n    std::function<void(PCWSTR)> enumCallback) {\n    auto modsConfigPath = appDataPath / L\"Mods\";\n\n    if (!std::filesystem::exists(modsConfigPath)) {\n        return;\n    }\n\n    for (const auto& p : std::filesystem::directory_iterator(modsConfigPath)) {\n        if (!p.is_regular_file()) {\n            continue;\n        }\n\n        if (p.path().extension() == L\".ini\") {\n            enumCallback(p.path().stem().c_str());\n        }\n    }\n}\n\nStorageManager::ModConfigChangeNotification::ModConfigChangeNotification() {\n    auto& storageManager = GetInstance();\n\n    if (storageManager.portableStorage) {\n        auto modsPath = storageManager.appDataPath / L\"Mods\";\n\n        if (!std::filesystem::is_directory(modsPath)) {\n            std::error_code ec;\n            std::filesystem::create_directories(modsPath, ec);\n        }\n\n        auto findHandle = wil::unique_hfind_change(FindFirstChangeNotification(\n            modsPath.c_str(), FALSE,\n            FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE));\n        THROW_LAST_ERROR_IF(!findHandle);\n\n        monitoringState = IniFileState{std::move(findHandle)};\n    } else {\n        const auto& registrySettingsPath =\n            std::get<RegistryPath>(storageManager.settingsPath);\n        std::wstring subKey = registrySettingsPath.subKey + L\"\\\\Mods\";\n\n        wil::unique_hkey key;\n        THROW_IF_WIN32_ERROR(RegCreateKeyEx(\n            registrySettingsPath.hKey, subKey.c_str(), 0, nullptr, 0,\n            KEY_NOTIFY | KEY_WOW64_64KEY, nullptr, &key, nullptr));\n\n        wil::unique_event_nothrow changeHandle(\n            CreateEvent(nullptr, FALSE, FALSE, nullptr));\n        THROW_LAST_ERROR_IF_NULL(changeHandle);\n\n        DWORD regNotifyChangeKeyValueFlags =\n            REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET;\n        if (Functions::IsWindowsVersionOrGreaterWithBuildNumber(6, 2, 0)) {\n            regNotifyChangeKeyValueFlags |= REG_NOTIFY_THREAD_AGNOSTIC;\n        }\n\n        THROW_IF_WIN32_ERROR(RegNotifyChangeKeyValue(\n            key.get(), TRUE, regNotifyChangeKeyValueFlags, changeHandle.get(),\n            TRUE));\n\n        monitoringState =\n            RegistryState{std::move(key), regNotifyChangeKeyValueFlags,\n                          std::move(changeHandle)};\n    }\n}\n\nHANDLE StorageManager::ModConfigChangeNotification::GetHandle() {\n    auto& storageManager = GetInstance();\n\n    if (storageManager.portableStorage) {\n        return std::get<IniFileState>(monitoringState).handle.get();\n    } else {\n        return std::get<RegistryState>(monitoringState).eventHandle.get();\n    }\n}\n\nvoid StorageManager::ModConfigChangeNotification::ContinueMonitoring() {\n    auto& storageManager = GetInstance();\n\n    if (storageManager.portableStorage) {\n        THROW_IF_WIN32_BOOL_FALSE(FindNextChangeNotification(\n            std::get<IniFileState>(monitoringState).handle.get()));\n    } else {\n        auto& regState = std::get<RegistryState>(monitoringState);\n        THROW_IF_WIN32_ERROR(RegNotifyChangeKeyValue(\n            regState.key.get(), TRUE, regState.regNotifyChangeKeyValueFlags,\n            regState.eventHandle.get(), TRUE));\n    }\n}\n\nbool StorageManager::ModConfigChangeNotification::CanMonitorAcrossThreads() {\n    auto& storageManager = GetInstance();\n\n    if (storageManager.portableStorage) {\n        return true;\n    } else {\n        auto& regState = std::get<RegistryState>(monitoringState);\n        return regState.regNotifyChangeKeyValueFlags &\n               REG_NOTIFY_THREAD_AGNOSTIC;\n    }\n}\n"
  },
  {
    "path": "src/windhawk/engine/storage_manager.h",
    "content": "#pragma once\n\n#include \"no_destructor.h\"\n#include \"portable_settings.h\"\n\nclass StorageManager {\n   public:\n    StorageManager(const StorageManager&) = delete;\n    StorageManager(StorageManager&&) = delete;\n    StorageManager& operator=(const StorageManager&) = delete;\n    StorageManager& operator=(StorageManager&&) = delete;\n\n    static StorageManager& GetInstance();\n\n    std::unique_ptr<PortableSettings> GetAppConfig(PCWSTR section);\n    std::unique_ptr<PortableSettings> GetModConfig(PCWSTR modName,\n                                                   PCWSTR section);\n    std::unique_ptr<PortableSettings> GetModWritableConfig(PCWSTR modName,\n                                                           PCWSTR section,\n                                                           bool write);\n    void EnumMods(std::function<void(PCWSTR)> enumCallback);\n\n    std::filesystem::path GetModStoragePath(PCWSTR modName);\n\n    std::filesystem::path GetModMetadataPath(PCWSTR metadataCategory);\n    wil::unique_hfile CreateModMetadataFile(PCWSTR metadataCategory,\n                                            PCWSTR modInstanceId);\n    void SetModMetadataValue(wil::unique_hfile& file, PCWSTR value);\n\n    std::filesystem::path GetEnginePath(\n        USHORT machine = IMAGE_FILE_MACHINE_UNKNOWN);\n    std::filesystem::path GetModsPath(\n        USHORT machine = IMAGE_FILE_MACHINE_UNKNOWN);\n    std::filesystem::path GetSymbolsPath();\n\n    class ModConfigChangeNotification {\n       public:\n        ModConfigChangeNotification();\n\n        HANDLE GetHandle();\n        void ContinueMonitoring();\n        bool CanMonitorAcrossThreads();\n\n       private:\n        struct RegistryState {\n            wil::unique_hkey key;\n            DWORD regNotifyChangeKeyValueFlags;\n            wil::unique_event_nothrow eventHandle;\n        };\n\n        struct IniFileState {\n            wil::unique_hfind_change handle;\n        };\n\n        std::variant<std::monostate, RegistryState, IniFileState>\n            monitoringState;\n    };\n\n   private:\n    friend class NoDestructorIfTerminating<StorageManager>;\n\n    StorageManager();\n    ~StorageManager();\n\n    void RegistryEnumMods(std::function<void(PCWSTR)> enumCallback);\n    void IniFilesEnumMods(std::function<void(PCWSTR)> enumCallback);\n\n    struct RegistryPath {\n        HKEY hKey = 0;\n        std::wstring subKey;\n    };\n\n    struct IniFilePath {\n        std::wstring path;\n    };\n\n    bool portableStorage;\n    std::filesystem::path appDataPath;\n    std::variant<std::monostate, RegistryPath, IniFilePath> settingsPath;\n};\n"
  },
  {
    "path": "src/windhawk/engine/symbol_enum.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"functions.h\"\n#include \"logger.h\"\n#include \"storage_manager.h\"\n#include \"symbol_enum.h\"\n#include \"var_init_once.h\"\n\nvoid MySysFreeString(BSTR bstrString) {\n    // Avoid having oleaut32.dll in the import table, since it might not be\n    // available in all cases, e.g. sandboxed processes.\n    using SysFreeString_t = decltype(&SysFreeString);\n\n    LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(\n        SysFreeString_t, pSysFreeString, L\"oleaut32.dll\",\n        LOAD_LIBRARY_SEARCH_SYSTEM32, \"SysFreeString\");\n\n    if (!pSysFreeString) {\n        LOG(L\"Failed to get SysFreeString, skipping\");\n        return;\n    }\n\n    pSysFreeString(bstrString);\n}\n\nnamespace {\n\nThreadLocal<SymbolEnum::Callbacks*> g_symbolServerCallbacks;\n\nstd::wstring GetSymbolsSearchPath(PCWSTR symbolServer) {\n    PCWSTR defaultSymbolServer = L\"https://msdl.microsoft.com/download/symbols\";\n\n    std::wstring symSearchPath = L\"srv*\";\n    symSearchPath += StorageManager::GetInstance().GetSymbolsPath();\n    symSearchPath += L'*';\n    symSearchPath += symbolServer ? symbolServer : defaultSymbolServer;\n\n    return symSearchPath;\n}\n\nvoid LogSymbolServerEvent(PCSTR msg) {\n    // Trim leading and trailing whitespace and control characters (mainly \\b\n    // which is used for console output).\n\n    PCSTR p = msg;\n    while (*p != '\\0' && (isspace(*p) || iscntrl(*p))) {\n        p++;\n    }\n\n    if (*p == '\\0') {\n        return;\n    }\n\n    size_t len = strlen(p);\n    while (len > 0 && (isspace(p[len - 1]) || iscntrl(p[len - 1]))) {\n        len--;\n    }\n\n    VERBOSE(L\"%.*S\", wil::safe_cast<int>(len), p);\n}\n\nint PercentFromSymbolServerEvent(PCSTR msg) {\n    size_t msgLen = strlen(msg);\n    while (msgLen > 0 && isspace(msg[msgLen - 1])) {\n        msgLen--;\n    }\n\n    constexpr char suffix[] = \" percent\";\n    constexpr size_t suffixLen = ARRAYSIZE(suffix) - 1;\n\n    if (msgLen <= suffixLen ||\n        strncmp(suffix, msg + msgLen - suffixLen, suffixLen) != 0) {\n        return -1;\n    }\n\n    char percentStr[] = \"000\";\n    int digitsCount = 0;\n\n    for (size_t i = 1; i <= 3; i++) {\n        if (i > msgLen - suffixLen) {\n            break;\n        }\n\n        char p = msg[msgLen - suffixLen - i];\n        if (p < '0' || p > '9') {\n            break;\n        }\n\n        percentStr[3 - i] = p;\n        digitsCount++;\n    }\n\n    if (digitsCount == 0) {\n        return -1;\n    }\n\n    int percent = (percentStr[0] - '0') * 100 + (percentStr[1] - '0') * 10 +\n                  (percentStr[2] - '0');\n    if (percent > 100) {\n        return -1;\n    }\n\n    return percent;\n}\n\nBOOL CALLBACK SymbolServerCallback(UINT_PTR action,\n                                   ULONG64 data,\n                                   ULONG64 context) {\n    SymbolEnum::Callbacks* callbacks = g_symbolServerCallbacks;\n    if (!callbacks) {\n        return FALSE;\n    }\n\n    switch (action) {\n        case SSRVACTION_QUERYCANCEL: {\n            if (callbacks->queryCancel) {\n                ULONG64* doCancel = (ULONG64*)data;\n                *doCancel = callbacks->queryCancel();\n                return TRUE;\n            }\n            return FALSE;\n        }\n\n        case SSRVACTION_EVENT: {\n            IMAGEHLP_CBA_EVENT* evt = (IMAGEHLP_CBA_EVENT*)data;\n            LogSymbolServerEvent(evt->desc);\n            int percent = PercentFromSymbolServerEvent(evt->desc);\n            if (percent >= 0 && callbacks->notifyProgress) {\n                callbacks->notifyProgress(percent);\n            }\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstruct DiaLoadCallback : public IDiaLoadCallback2 {\n    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,\n                                             void** ppvObject) override {\n        if (riid == __uuidof(IUnknown) || riid == __uuidof(IDiaLoadCallback)) {\n            *ppvObject = static_cast<IDiaLoadCallback*>(this);\n            return S_OK;\n        } else if (riid == __uuidof(IDiaLoadCallback2)) {\n            *ppvObject = static_cast<IDiaLoadCallback2*>(this);\n            return S_OK;\n        }\n        return E_NOINTERFACE;\n    }\n\n    ULONG STDMETHODCALLTYPE AddRef() override {\n        return 2;  // On stack\n    }\n\n    ULONG STDMETHODCALLTYPE Release() override {\n        return 1;  // On stack\n    }\n\n    HRESULT STDMETHODCALLTYPE NotifyDebugDir(BOOL fExecutable,\n                                             DWORD cbData,\n                                             BYTE* pbData) override {\n        // VERBOSE(L\"Debug directory found in %s file\",\n        //         fExecutable ? L\"exe\" : L\"dbg\");\n        return S_OK;\n    }\n\n    HRESULT STDMETHODCALLTYPE NotifyOpenDBG(LPCOLESTR dbgPath,\n                                            HRESULT resultCode) override {\n        VERBOSE(L\"Opened dbg file %s: %s (%08X)\", dbgPath,\n                resultCode == S_OK ? L\"success\" : L\"error\", resultCode);\n        return S_OK;\n    }\n\n    HRESULT STDMETHODCALLTYPE NotifyOpenPDB(LPCOLESTR pdbPath,\n                                            HRESULT resultCode) override {\n        VERBOSE(L\"Opened pdb file %s: %s (%08X)\", pdbPath,\n                resultCode == S_OK ? L\"success\" : L\"error\", resultCode);\n        return S_OK;\n    }\n\n    // Only use explicitly specified search paths, restrict all but symbol\n    // server access:\n    HRESULT STDMETHODCALLTYPE RestrictRegistryAccess() override {\n        return E_FAIL;\n    }\n    HRESULT STDMETHODCALLTYPE RestrictSymbolServerAccess() override {\n        return S_OK;\n    }\n    HRESULT STDMETHODCALLTYPE RestrictOriginalPathAccess() override {\n        return E_FAIL;\n    }\n    HRESULT STDMETHODCALLTYPE RestrictReferencePathAccess() override {\n        return E_FAIL;\n    }\n    HRESULT STDMETHODCALLTYPE RestrictDBGAccess() override { return E_FAIL; }\n    HRESULT STDMETHODCALLTYPE RestrictSystemRootAccess() override {\n        return E_FAIL;\n    }\n};\n\nHMODULE WINAPI MsdiaLoadLibraryExWHook(LPCWSTR lpLibFileName,\n                                       HANDLE hFile,\n                                       DWORD dwFlags) {\n    if (wcscmp(lpLibFileName, L\"SYMSRV.DLL\") != 0) {\n        return LoadLibraryExW(lpLibFileName, hFile, dwFlags);\n    }\n\n    try {\n        auto enginePath = StorageManager::GetInstance().GetEnginePath();\n\n        DWORD dwNewFlags = dwFlags;\n        dwNewFlags |= LOAD_WITH_ALTERED_SEARCH_PATH;\n\n        // Strip flags incompatible with LOAD_WITH_ALTERED_SEARCH_PATH.\n        dwNewFlags &= ~LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR;\n        dwNewFlags &= ~LOAD_LIBRARY_SEARCH_APPLICATION_DIR;\n        dwNewFlags &= ~LOAD_LIBRARY_SEARCH_USER_DIRS;\n        dwNewFlags &= ~LOAD_LIBRARY_SEARCH_SYSTEM32;\n        dwNewFlags &= ~LOAD_LIBRARY_SEARCH_DEFAULT_DIRS;\n\n        auto symsrvPath = enginePath / L\"symsrv_windhawk.dll\";\n        HMODULE symsrvModule =\n            LoadLibraryExW(symsrvPath.c_str(), hFile, dwNewFlags);\n        if (!symsrvModule) {\n            DWORD error = GetLastError();\n            LOG(L\"Couldn't load symsrv: %u\", error);\n            SetLastError(error);\n            return symsrvModule;\n        }\n\n        PSYMBOLSERVERSETOPTIONSPROC pSymbolServerSetOptions =\n            reinterpret_cast<PSYMBOLSERVERSETOPTIONSPROC>(\n                GetProcAddress(symsrvModule, \"SymbolServerSetOptions\"));\n        if (pSymbolServerSetOptions) {\n            pSymbolServerSetOptions(SSRVOPT_UNATTENDED, TRUE);\n            pSymbolServerSetOptions(SSRVOPT_CALLBACK,\n                                    (ULONG_PTR)SymbolServerCallback);\n            pSymbolServerSetOptions(SSRVOPT_TRACE, TRUE);\n        } else {\n            LOG(L\"Couldn't find SymbolServerSetOptions\");\n        }\n\n        return symsrvModule;\n    } catch (const std::exception& e) {\n        LOG(L\"Couldn't load symsrv: %S\", e.what());\n        SetLastError(ERROR_MOD_NOT_FOUND);\n        return nullptr;\n    }\n}\n\ntemplate <typename IMAGE_NT_HEADERS_T, typename IMAGE_LOAD_CONFIG_DIRECTORY_T>\nstd::optional<std::span<const SymbolEnum::IMAGE_CHPE_RANGE_ENTRY>>\nGetChpeRanges(const IMAGE_DOS_HEADER* dosHeader,\n              const IMAGE_NT_HEADERS_T* ntHeader) {\n    auto* opt = &ntHeader->OptionalHeader;\n\n    if (opt->NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG ||\n        !opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress) {\n        return std::nullopt;\n    }\n\n    DWORD directorySize =\n        opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size;\n\n    auto* cfg =\n        (const IMAGE_LOAD_CONFIG_DIRECTORY_T*)((const char*)dosHeader +\n                                               opt->DataDirectory\n                                                   [IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]\n                                                       .VirtualAddress);\n\n    constexpr DWORD kMinSize =\n        offsetof(IMAGE_LOAD_CONFIG_DIRECTORY_T, CHPEMetadataPointer) +\n        sizeof(IMAGE_LOAD_CONFIG_DIRECTORY_T::CHPEMetadataPointer);\n\n    if (directorySize < kMinSize || cfg->Size < kMinSize) {\n        return std::nullopt;\n    }\n\n    if (!cfg->CHPEMetadataPointer) {\n        return std::nullopt;\n    }\n\n    // Either IMAGE_CHPE_METADATA_X86 or IMAGE_ARM64EC_METADATA.\n    const void* metadata =\n        (const char*)dosHeader + cfg->CHPEMetadataPointer - opt->ImageBase;\n\n    ULONG codeMapRva = ((const ULONG*)metadata)[1];\n    ULONG codeMapCount = ((const ULONG*)metadata)[2];\n\n    auto* codeMap =\n        (const SymbolEnum::IMAGE_CHPE_RANGE_ENTRY*)((const char*)dosHeader +\n                                                    codeMapRva);\n\n    return std::span(codeMap, codeMapCount);\n}\n\n}  // namespace\n\nSymbolEnum::SymbolEnum(HMODULE moduleBase,\n                       PCWSTR symbolServer,\n                       UndecorateMode undecorateMode,\n                       Callbacks callbacks) {\n    if (!moduleBase) {\n        moduleBase = GetModuleHandle(nullptr);\n    }\n\n    std::wstring modulePath = wil::GetModuleFileName<std::wstring>(moduleBase);\n\n    SymbolEnum(modulePath.c_str(), moduleBase, symbolServer, undecorateMode,\n               std::move(callbacks));\n}\n\nSymbolEnum::SymbolEnum(PCWSTR modulePath,\n                       HMODULE moduleBase,\n                       PCWSTR symbolServer,\n                       UndecorateMode undecorateMode,\n                       Callbacks callbacks)\n    : m_moduleBase(moduleBase), m_undecorateMode(undecorateMode) {\n    InitModuleInfo(moduleBase);\n\n    wil::com_ptr<IDiaDataSource> diaSource = LoadMsdia();\n\n    std::wstring symSearchPath = GetSymbolsSearchPath(symbolServer);\n\n    g_symbolServerCallbacks = &callbacks;\n    auto msdiaCallbacksCleanup =\n        wil::scope_exit([] { g_symbolServerCallbacks = nullptr; });\n\n    DiaLoadCallback diaLoadCallback;\n    THROW_IF_FAILED(diaSource->loadDataForExe(modulePath, symSearchPath.c_str(),\n                                              &diaLoadCallback));\n\n    wil::com_ptr<IDiaSession> diaSession;\n    THROW_IF_FAILED(diaSource->openSession(&diaSession));\n\n    THROW_IF_FAILED(diaSession->get_globalScope(&m_diaGlobal));\n\n    THROW_IF_FAILED(\n        m_diaGlobal->findChildren(kSymTags[0], nullptr, nsNone, &m_diaSymbols));\n}\n\nstd::optional<SymbolEnum::Symbol> SymbolEnum::GetNextSymbol() {\n    while (true) {\n        wil::com_ptr<IDiaSymbol> diaSymbol;\n        ULONG count = 0;\n        HRESULT hr = m_diaSymbols->Next(1, &diaSymbol, &count);\n        THROW_IF_FAILED(hr);\n\n        if (hr == S_FALSE || count == 0) {\n            m_symTagIndex++;\n            if (m_symTagIndex < ARRAYSIZE(kSymTags)) {\n                THROW_IF_FAILED(m_diaGlobal->findChildren(\n                    kSymTags[m_symTagIndex], nullptr, nsNone, &m_diaSymbols));\n                continue;\n            }\n\n            return std::nullopt;\n        }\n\n        DWORD currentSymbolRva;\n        hr = diaSymbol->get_relativeVirtualAddress(&currentSymbolRva);\n        THROW_IF_FAILED(hr);\n        if (hr == S_FALSE) {\n            continue;  // no RVA\n        }\n\n        hr = diaSymbol->get_name(&m_currentSymbolName);\n        THROW_IF_FAILED(hr);\n        if (hr == S_FALSE) {\n            m_currentSymbolName.reset();  // no name\n        }\n\n        PCWSTR currentSymbolNameUndecoratedPrefix1 = L\"\";\n        PCWSTR currentSymbolNameUndecoratedPrefix2 = L\"\";\n\n        // Temporary compatibility code.\n        if (m_undecorateMode == UndecorateMode::OldVersionCompatible) {\n            // get_undecoratedName uses 0x20800 as flags:\n            // * UNDNAME_32_BIT_DECODE (0x800)\n            // * UNDNAME_NO_PTR64 (0x20000)\n            // For some reason, the old msdia version still included ptr64 in\n            // the output. For compatibility, use get_undecoratedNameEx and\n            // don't pass this flag.\n            constexpr DWORD kUndname32BitDecode = 0x800;\n            hr = diaSymbol->get_undecoratedNameEx(\n                kUndname32BitDecode, &m_currentSymbolNameUndecorated);\n        } else if (m_undecorateMode == UndecorateMode::Default) {\n            hr =\n                diaSymbol->get_undecoratedName(&m_currentSymbolNameUndecorated);\n        } else {\n            m_currentSymbolNameUndecorated.reset();\n            hr = S_OK;\n        }\n        THROW_IF_FAILED(hr);\n        if (hr == S_FALSE) {\n            m_currentSymbolNameUndecorated.reset();  // no name\n        } else if (m_currentSymbolNameUndecorated) {\n            // For hybrid binaries, add an arch=x\\ prefix.\n            if (m_moduleInfo.isHybrid) {\n                bool is32Bit =\n                    m_moduleInfo.magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC;\n                for (const auto& range : m_moduleInfo.chpeRanges) {\n                    ULONG start = is32Bit ? (range.StartOffset & ~1)\n                                          : (range.StartOffset & ~3);\n                    if (currentSymbolRva < start ||\n                        currentSymbolRva >= start + range.Length) {\n                        continue;\n                    }\n\n                    if (is32Bit) {\n                        constexpr PCWSTR prefixes[] = {\n#if defined(_M_IX86)\n                            L\"\",\n#else\n                            L\"arch=x86\\\\\",\n#endif\n#if defined(_M_ARM64)\n                            L\"\",\n#else\n                            L\"arch=ARM64\\\\\",\n#endif\n                        };\n                        currentSymbolNameUndecoratedPrefix1 =\n                            prefixes[range.StartOffset & 1];\n                    } else {\n                        constexpr PCWSTR prefixes[] = {\n#if defined(_M_ARM64)\n                            L\"\",\n#else\n                            L\"arch=ARM64\\\\\",\n#endif\n                            L\"arch=ARM64EC\\\\\",\n#if defined(_M_X64)\n                            L\"\",\n#else\n                            L\"arch=x64\\\\\",\n#endif\n                            L\"arch=3\\\\\",\n                        };\n                        currentSymbolNameUndecoratedPrefix1 =\n                            prefixes[range.StartOffset & 3];\n                    }\n\n                    break;\n                }\n            }\n\n            // For ARM64EC binaries, functions with native and ARM64EC versions\n            // have the same undecorated names. The only difference between them\n            // is the \"$$h\" tag. This tag is mentioned here:\n            // https://learn.microsoft.com/en-us/cpp/build/reference/decorated-names?view=msvc-170\n            // An example from comctl32.dll version 6.10.22621.4825:\n            // Decorated, native:\n            // ??1CLink@@UEAA@XZ\n            // Decorated, ARM64EC:\n            // ??1CLink@@$$hUEAA@XZ\n            // Undecorated (in both cases):\n            // public: virtual __cdecl CLink::~CLink(void)\n            //\n            // To be able to disambiguate between these two undecorated names,\n            // we add a prefix to the ARM64EC undecorated name. In the above\n            // example, it becomes:\n            // tag=ARM64EC\\public: virtual __cdecl CLink::~CLink(void)\n            //\n            // The \"\\\" symbol was chosen after looking for an ASCII character\n            // that's not being used in symbol names. It looks like the only\n            // three such characters in the ASCII range of 0x21-0x7E are: \" ; \\.\n            // Note: The # character doesn't seem to be used outside of ARM64\n            // symbols, but it's being used extensively as an ARM64-related\n            // marker in hybrid binaries.\n            //\n            // Below is a simplistic check that only checks that the \"$$h\"\n            // string is present in the symbol name. Hopefully it's good enough\n            // so that full parsing of the decorated name is not needed.\n            bool isArm64Ec =\n                m_currentSymbolName &&\n                wcsstr(m_currentSymbolName.get(), L\"$$h\") != nullptr;\n            if (isArm64Ec) {\n                currentSymbolNameUndecoratedPrefix2 = L\"tag=ARM64EC\\\\\";\n            }\n        }\n\n        PCWSTR currentSymbolNameUndecorated;\n        if (!*currentSymbolNameUndecoratedPrefix1 &&\n            !*currentSymbolNameUndecoratedPrefix2) {\n            currentSymbolNameUndecorated = m_currentSymbolNameUndecorated.get();\n        } else {\n            m_currentSymbolNameUndecoratedWithPrefixes =\n                currentSymbolNameUndecoratedPrefix1;\n            m_currentSymbolNameUndecoratedWithPrefixes +=\n                currentSymbolNameUndecoratedPrefix2;\n            m_currentSymbolNameUndecoratedWithPrefixes +=\n                m_currentSymbolNameUndecorated.get();\n            currentSymbolNameUndecorated =\n                m_currentSymbolNameUndecoratedWithPrefixes.c_str();\n        }\n\n        return SymbolEnum::Symbol{\n            reinterpret_cast<void*>(reinterpret_cast<BYTE*>(m_moduleBase) +\n                                    currentSymbolRva),\n            m_currentSymbolName.get(), currentSymbolNameUndecorated};\n    }\n}\n\nvoid SymbolEnum::InitModuleInfo(HMODULE module) {\n    auto* dosHeader = (const IMAGE_DOS_HEADER*)module;\n    auto* ntHeader =\n        (const IMAGE_NT_HEADERS*)((const char*)dosHeader + dosHeader->e_lfanew);\n    WORD magic = ntHeader->OptionalHeader.Magic;\n\n    std::optional<std::span<const IMAGE_CHPE_RANGE_ENTRY>> chpeRanges;\n    switch (magic) {\n        case IMAGE_NT_OPTIONAL_HDR32_MAGIC:\n            chpeRanges = GetChpeRanges<IMAGE_NT_HEADERS32,\n                                       IMAGE_LOAD_CONFIG_DIRECTORY32>(\n                dosHeader, (const IMAGE_NT_HEADERS32*)ntHeader);\n            break;\n\n        case IMAGE_NT_OPTIONAL_HDR64_MAGIC:\n            chpeRanges = GetChpeRanges<IMAGE_NT_HEADERS64,\n                                       IMAGE_LOAD_CONFIG_DIRECTORY64>(\n                dosHeader, (const IMAGE_NT_HEADERS64*)ntHeader);\n            break;\n    }\n\n    m_moduleInfo.magic = magic;\n\n    if (chpeRanges) {\n        m_moduleInfo.isHybrid = true;\n        m_moduleInfo.chpeRanges.assign(chpeRanges->begin(), chpeRanges->end());\n    } else {\n        m_moduleInfo.isHybrid = false;\n    }\n}\n\nwil::com_ptr<IDiaDataSource> SymbolEnum::LoadMsdia() {\n    auto enginePath = StorageManager::GetInstance().GetEnginePath();\n    auto msdiaPath = enginePath / L\"msdia140_windhawk.dll\";\n\n    m_msdiaModule.reset(LoadLibraryEx(msdiaPath.c_str(), nullptr,\n                                      LOAD_WITH_ALTERED_SEARCH_PATH));\n    THROW_LAST_ERROR_IF_NULL(m_msdiaModule);\n\n    // msdia loads symsrv.dll by using the following call:\n    // LoadLibraryExW(L\"SYMSRV.DLL\");\n    // This is problematic for the following reasons:\n    // * If another file named symsrv.dll is already loaded,\n    //   it will be used instead.\n    // * If not, the library loading search path doesn't include our folder\n    //   by default.\n    // Especially due to the first point, we patch msdia in memory to use\n    // the full path to our copy of symsrv.dll.\n    // Also, to prevent from other msdia instances to load our version of\n    // symsrv, we name it differently.\n\n    void** msdiaLoadLibraryExWPtr = Functions::FindImportPtr(\n        m_msdiaModule.get(), \"kernel32.dll\", \"LoadLibraryExW\");\n\n    DWORD dwOldProtect;\n    THROW_IF_WIN32_BOOL_FALSE(VirtualProtect(msdiaLoadLibraryExWPtr,\n                                             sizeof(*msdiaLoadLibraryExWPtr),\n                                             PAGE_READWRITE, &dwOldProtect));\n    *msdiaLoadLibraryExWPtr = MsdiaLoadLibraryExWHook;\n    THROW_IF_WIN32_BOOL_FALSE(VirtualProtect(msdiaLoadLibraryExWPtr,\n                                             sizeof(*msdiaLoadLibraryExWPtr),\n                                             dwOldProtect, &dwOldProtect));\n\n    wil::com_ptr<IDiaDataSource> diaSource;\n    THROW_IF_FAILED(NoRegCoCreate(msdiaPath.c_str(), CLSID_DiaSource,\n                                  IID_PPV_ARGS(&diaSource)));\n\n    // Decrements the reference count incremented by NoRegCoCreate.\n    FreeLibrary(m_msdiaModule.get());\n\n    return diaSource;\n}\n"
  },
  {
    "path": "src/windhawk/engine/symbol_enum.h",
    "content": "#pragma once\n\nvoid MySysFreeString(BSTR bstrString);\n\nusing my_unique_bstr =\n    wil::unique_any<BSTR, decltype(&MySysFreeString), MySysFreeString>;\n\nclass SymbolEnum {\n   public:\n    enum class UndecorateMode {\n        Default = 0,\n        OldVersionCompatible,\n        None,\n    };\n\n    struct Callbacks {\n        std::function<bool()> queryCancel;\n        std::function<void(int)> notifyProgress;\n    };\n\n    SymbolEnum(HMODULE moduleBase,\n               PCWSTR symbolServer,\n               UndecorateMode undecorateMode,\n               Callbacks callbacks = {});\n    SymbolEnum(PCWSTR modulePath,\n               HMODULE moduleBase,\n               PCWSTR symbolServer,\n               UndecorateMode undecorateMode,\n               Callbacks callbacks = {});\n\n    struct Symbol {\n        void* address;\n        PCWSTR name;\n        PCWSTR nameUndecorated;\n    };\n\n    std::optional<Symbol> GetNextSymbol();\n\n    // https://ntdoc.m417z.com/image_chpe_range_entry\n    typedef struct _IMAGE_CHPE_RANGE_ENTRY {\n        union {\n            ULONG StartOffset;\n            struct {\n                ULONG NativeCode : 1;\n                ULONG AddressBits : 31;\n            } DUMMYSTRUCTNAME;\n        } DUMMYUNIONNAME;\n\n        ULONG Length;\n    } IMAGE_CHPE_RANGE_ENTRY, *PIMAGE_CHPE_RANGE_ENTRY;\n\n   private:\n    void InitModuleInfo(HMODULE module);\n    wil::com_ptr<IDiaDataSource> LoadMsdia();\n\n    static constexpr enum SymTagEnum kSymTags[] = {\n        SymTagPublicSymbol,\n        SymTagFunction,\n        SymTagData,\n    };\n\n    struct ModuleInfo {\n        WORD magic;\n        bool isHybrid;\n        std::vector<IMAGE_CHPE_RANGE_ENTRY> chpeRanges;\n    };\n\n    HMODULE m_moduleBase;\n    UndecorateMode m_undecorateMode;\n    ModuleInfo m_moduleInfo;\n    wil::unique_hmodule m_msdiaModule;\n    wil::com_ptr<IDiaSymbol> m_diaGlobal;\n    wil::com_ptr<IDiaEnumSymbols> m_diaSymbols;\n    size_t m_symTagIndex = 0;\n    my_unique_bstr m_currentSymbolName;\n    my_unique_bstr m_currentSymbolNameUndecorated;\n    std::wstring m_currentSymbolNameUndecoratedWithPrefixes;\n};\n"
  },
  {
    "path": "src/windhawk/engine/var_init_once.h",
    "content": "#pragma once\n\n// The following macros are used to initialize static variables once in a\n// thread-safe manner while avoiding TLS, which is what MSVC uses for static\n// variables.\n\n// Similar to:\n// static T var_name(...);\n#define STATIC_INIT_ONCE(T, var_name, ...)                                 \\\n    T* var_name;                                                           \\\n    do {                                                                   \\\n        static alignas(T) char static_init_once_storage_[sizeof(T)];       \\\n        static std::once_flag static_init_once_flag_;                      \\\n        std::call_once(static_init_once_flag_, []() {                      \\\n            new (static_init_once_storage_) T(__VA_ARGS__);                \\\n            if constexpr (!std::is_trivially_destructible_v<T>) {          \\\n                std::atexit([]() {                                         \\\n                    reinterpret_cast<T*>(static_init_once_storage_)->~T(); \\\n                });                                                        \\\n            }                                                              \\\n        });                                                                \\\n        var_name = reinterpret_cast<T*>(static_init_once_storage_);        \\\n    } while (0)\n\n// Similar to:\n// static T var_name = initializer;\n#define STATIC_INIT_ONCE_TRIVIAL(T, var_name, initializer)  \\\n    static constinit T var_name;                            \\\n    do {                                                    \\\n        static_assert(std::is_trivially_destructible_v<T>); \\\n        static std::once_flag static_init_once_flag_;       \\\n        std::call_once(static_init_once_flag_,              \\\n                       []() { var_name = initializer; });   \\\n    } while (0)\n\n// Similar to:\n// static T ptr = (T)GetProcAddress(GetModuleHandle(module_name), proc_name);\n#define GET_PROC_ADDRESS_ONCE(T, ptr, module_name, proc_name)          \\\n    static T ptr;                                                      \\\n    do {                                                               \\\n        static_assert(std::is_trivially_destructible_v<T>);            \\\n        static std::once_flag get_proc_address_once_flag_;             \\\n        std::call_once(get_proc_address_once_flag_, []() {             \\\n            HMODULE get_proc_address_once_module_ =                    \\\n                GetModuleHandle(module_name);                          \\\n            if (get_proc_address_once_module_) {                       \\\n                ptr = (T)GetProcAddress(get_proc_address_once_module_, \\\n                                        proc_name);                    \\\n            }                                                          \\\n        });                                                            \\\n    } while (0)\n\n// Similar to:\n// static T ptr =\n//     (T)GetProcAddress(LoadLibraryEx(module_name, nullptr, flags), proc_name);\n#define LOAD_LIBRARY_GET_PROC_ADDRESS_ONCE(T, ptr, module_name, flags,         \\\n                                           proc_name)                          \\\n    static T ptr;                                                              \\\n    do {                                                                       \\\n        static_assert(std::is_trivially_destructible_v<T>);                    \\\n        static std::once_flag get_proc_address_once_flag_;                     \\\n        std::call_once(get_proc_address_once_flag_, []() {                     \\\n            static HMODULE get_proc_address_once_module_ =                     \\\n                LoadLibraryEx(module_name, nullptr, flags);                    \\\n            if (get_proc_address_once_module_) {                               \\\n                ptr = (T)GetProcAddress(get_proc_address_once_module_,         \\\n                                        proc_name);                            \\\n                if (!ptr) {                                                    \\\n                    FreeLibrary(get_proc_address_once_module_);                \\\n                } else {                                                       \\\n                    std::atexit(                                               \\\n                        []() { FreeLibrary(get_proc_address_once_module_); }); \\\n                }                                                              \\\n            }                                                                  \\\n        });                                                                    \\\n    } while (0)\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/Tracelogging.h",
    "content": "#pragma once\n//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Defines a series of macros and types that simplify authoring and consumption of tracelogging, telemetry, and activities.\n\n#ifndef __WIL_TRACELOGGING_H_INCLUDED\n/// @cond\n#define __WIL_TRACELOGGING_H_INCLUDED\n/// @endcond\n\n#ifdef _KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\n// Note that we avoid pulling in STL's memory header from TraceLogging.h through Resource.h as we have\n// TraceLogging customers who are still on older versions of STL (without std::shared_ptr<>).\n/// @cond\n#define RESOURCE_SUPPRESS_STL\n/// @endcond\n#ifndef __WIL_RESULT_INCLUDED\n#include <wil/result.h>\n#endif\n#undef RESOURCE_SUPPRESS_STL\n#include <winmeta.h>\n#include <TraceLoggingProvider.h>\n#include <TraceLoggingActivity.h>\n#ifndef __WIL_TRACELOGGING_CONFIG_H\n#include <wil/traceloggingconfig.h>\n#endif\n#ifndef TRACELOGGING_SUPPRESS_NEW\n#include <new>\n#endif\n\n#pragma warning(push)\n#pragma warning(disable : 26135) // Missing locking annotation, Caller failing to hold lock\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wmicrosoft-template-shadow\"\n#endif\n\n/// @cond\n#ifndef __TRACELOGGING_TEST_HOOK_ERROR\n#define __TRACELOGGING_TEST_HOOK_ERROR(failure)\n#define __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure)\n#define __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, hr)\n#define __TRACELOGGING_TEST_HOOK_ACTIVITY_START()\n#define __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, hr)\n#define __TRACELOGGING_TEST_HOOK_SET_ENABLED false\n#define __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters)\n#define __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS 5000\n#endif\n\n// For use only within wil/TraceLogging.h:\n#define _wiltlg_STRINGIZE(x) _wiltlg_STRINGIZE_imp(x)\n#define _wiltlg_STRINGIZE_imp(x) #x\n#define _wiltlg_LSTRINGIZE(x) _wiltlg_LSTRINGIZE_imp1(x)\n#define _wiltlg_LSTRINGIZE_imp1(x) _wiltlg_LSTRINGIZE_imp2(#x)\n#define _wiltlg_LSTRINGIZE_imp2(s) L\"\" #s\n\n/*\nMacro __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2):\nThis macro defines a storage link association between two names for use by the\nTlgReflector static analysis tool.\n*/\n#define __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2) \\\n    __annotation(L\"_TlgProviderLink:|\" _wiltlg_LSTRINGIZE(__LINE__) L\"|Key|\" _wiltlg_LSTRINGIZE(name1) L\"=\" _wiltlg_LSTRINGIZE(name2))\n\n// Utility macro for writing relevant fields from a wil::FailureInfo structure into a TraceLoggingWrite\n// statement.  Most fields are relevant for telemetry or for simple ETW, but there are a few additional\n// fields reported via ETW.\n\n#define __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) \\\n    TraceLoggingUInt32((failure).hr, \"hresult\", \"Failure error code\"), \\\n        TraceLoggingString((failure).pszFile, \"fileName\", \"Source code file name where the error occurred\"), \\\n        TraceLoggingUInt32((failure).uLineNumber, \"lineNumber\", \"Line number within the source code file where the error occurred\"), \\\n        TraceLoggingString((failure).pszModule, \"module\", \"Name of the binary where the error occurred\"), \\\n        TraceLoggingUInt32( \\\n            static_cast<DWORD>((failure).type), \\\n            \"failureType\", \\\n            \"Indicates what type of failure was observed (exception, returned error, logged error or fail fast\"), \\\n        TraceLoggingWideString((failure).pszMessage, \"message\", \"Custom message associated with the failure (if any)\"), \\\n        TraceLoggingUInt32((failure).threadId, \"threadId\", \"Identifier of the thread the error occurred on\"), \\\n        TraceLoggingString((failure).pszCallContext, \"callContext\", \"List of telemetry activities containing this error\"), \\\n        TraceLoggingUInt32( \\\n            (failure).callContextOriginating.contextId, \\\n            \"originatingContextId\", \\\n            \"Identifier for the oldest telemetry activity containing this error\"), \\\n        TraceLoggingString( \\\n            (failure).callContextOriginating.contextName, \\\n            \"originatingContextName\", \\\n            \"Name of the oldest telemetry activity containing this error\"), \\\n        TraceLoggingWideString( \\\n            (failure).callContextOriginating.contextMessage, \\\n            \"originatingContextMessage\", \\\n            \"Custom message associated with the oldest telemetry activity containing this error (if any)\"), \\\n        TraceLoggingUInt32( \\\n            (failure).callContextCurrent.contextId, \"currentContextId\", \"Identifier for the newest telemetry activity containing this error\"), \\\n        TraceLoggingString( \\\n            (failure).callContextCurrent.contextName, \"currentContextName\", \"Name of the newest telemetry activity containing this error\"), \\\n        TraceLoggingWideString( \\\n            (failure).callContextCurrent.contextMessage, \\\n            \"currentContextMessage\", \\\n            \"Custom message associated with the newest telemetry activity containing this error (if any)\")\n\n#define __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) \\\n    __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure), \\\n        TraceLoggingUInt32(static_cast<DWORD>((failure).failureId), \"failureId\", \"Identifier assigned to this failure\"), \\\n        TraceLoggingUInt32( \\\n            static_cast<DWORD>((failure).cFailureCount), \"failureCount\", \"Number of failures seen within the binary where the error occurred\"), \\\n        TraceLoggingString((failure).pszFunction, \"function\", \"Name of the function where the error occurred\")\n\n// Activity Start Event (ALL)\n#define __ACTIVITY_START_PARAMS() \\\n    TraceLoggingStruct(1, \"wilActivity\"), \\\n        TraceLoggingUInt32(::GetCurrentThreadId(), \"threadId\", \"Identifier of the thread the activity was run on\")\n\n// Activity Stop Event (SUCCESSFUL or those WITHOUT full failure info -- just hr)\n// Also utilized for intermediate stop events (a successful call to 'Stop()' from a Split activity\n#define __ACTIVITY_STOP_PARAMS(hr) \\\n    TraceLoggingStruct(2, \"wilActivity\"), TraceLoggingUInt32(hr, \"hresult\", \"Failure error code\"), \\\n        TraceLoggingUInt32(::GetCurrentThreadId(), \"threadId\", \"Identifier of the thread the activity was run on\")\n\n// Activity Stop Event (FAILED with full failure info)\n#define __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(14, \"wilActivity\"), \\\n        __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)\n#define __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(17, \"wilActivity\"), \\\n        __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)\n\n// \"ActivityError\" tagged event (all distinct FAILURES occurring within the outer activity scope)\n#define __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(14, \"wilActivity\"), \\\n        __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)\n#define __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(17, \"wilActivity\"), \\\n        __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)\n\n// \"ActivityFailure\" tagged event (only comes through on TELEMETRY for CallContext activities that have FAILED)\n#define __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(14, \"wilActivity\"), \\\n        __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)\n#define __ACTIVITY_FAILURE_TELEMETRY_PARAMS(hr, contextName, contextMessage) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(4, \"wilActivity\"), \\\n        TraceLoggingUInt32(hr, \"hresult\", \"Failure error code\"), \\\n        TraceLoggingUInt32(::GetCurrentThreadId(), \"threadId\", \"Identifier of the thread the activity was run on\"), \\\n        TraceLoggingString(contextName, \"currentContextName\", \"Name of the activity containing this error\"), \\\n        TraceLoggingWideString(contextMessage, \"currentContextMessage\", \"Custom message for the activity containing this error (if any)\")\n\n// \"FallbackError\" events (all FAILURE events happening outside of ANY activity context)\n#define __RESULT_TELEMETRY_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(14, \"wilResult\"), \\\n        __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)\n#define __RESULT_TRACELOGGING_FAILURE_PARAMS(failure) \\\n    TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingStruct(17, \"wilResult\"), \\\n        __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)\n/// @endcond\n\nnamespace wil\n{\nenum class ActivityOptions\n{\n    None = 0,\n    TelemetryOnFailure = 0x1,\n    TraceLoggingOnFailure = 0x2\n};\nDEFINE_ENUM_FLAG_OPERATORS(ActivityOptions)\n\ntemplate <typename ActivityTraceLoggingType, ActivityOptions options, UINT64 keyword, UINT8 level, UINT64 privacyTag, typename TlgReflectorTag>\nclass ActivityBase;\n\n/// @cond\nnamespace details\n{\n    // Lazy static initialization helper for holding a singleton telemetry class to maintain\n    // the provider handle.\n\n    template <class T>\n    class static_lazy\n    {\n    public:\n        void __cdecl cleanup() WI_NOEXCEPT\n        {\n            void* pVoid;\n            BOOL pending;\n\n            // If object is being constructed on another thread, wait until construction completes.\n            // Need a memory barrier here (see get() and ~Completer below) so use the result that we\n            // get from InitOnceBeginInitialize(..., &pVoid, ...)\n            if (::InitOnceBeginInitialize(&m_initOnce, INIT_ONCE_CHECK_ONLY, &pending, &pVoid) && !pending)\n            {\n                static_cast<T*>(pVoid)->~T();\n            }\n        }\n\n        T* get(void(__cdecl* cleanupFunc)(void)) WI_NOEXCEPT\n        {\n            void* pVoid{};\n            BOOL pending;\n            if (::InitOnceBeginInitialize(&m_initOnce, 0, &pending, &pVoid) && pending)\n            {\n                // Don't do anything non-trivial from DllMain, fail fast.\n                // Some 3rd party code in IE calls shell functions this way, so we can only enforce\n                // this in DEBUG.\n#ifdef DEBUG\n                FAIL_FAST_IMMEDIATE_IF_IN_LOADER_CALLOUT();\n#endif\n\n                Completer completer(this);\n                pVoid = &m_storage;\n                ::new (pVoid) T();\n                atexit(cleanupFunc); // ignore failure (that's what the C runtime does, too)\n                completer.Succeed();\n            }\n            return static_cast<T*>(pVoid);\n        }\n\n    private:\n        INIT_ONCE m_initOnce;\n        alignas(T) BYTE m_storage[sizeof(T)];\n        struct Completer\n        {\n            static_lazy* m_pSelf;\n            DWORD m_flags;\n\n            explicit Completer(static_lazy* pSelf) WI_NOEXCEPT : m_pSelf(pSelf), m_flags(INIT_ONCE_INIT_FAILED)\n            {\n            }\n            void Succeed() WI_NOEXCEPT\n            {\n                m_flags = 0;\n            }\n\n            ~Completer() WI_NOEXCEPT\n            {\n                if (m_flags == 0)\n                {\n                    reinterpret_cast<T*>(&m_pSelf->m_storage)->Create();\n                }\n                ::InitOnceComplete(&m_pSelf->m_initOnce, m_flags, &m_pSelf->m_storage);\n            }\n        };\n    };\n\n    // This class serves as a simple RAII wrapper around CallContextInfo.  It presumes that\n    // the contextName parameter is always a static string, but copies or allocates the\n    // contextMessage as needed.\n\n    class StoredCallContextInfo : public wil::CallContextInfo\n    {\n    public:\n        StoredCallContextInfo() WI_NOEXCEPT\n        {\n            // Suppress '-Wnontrivial-memcall' with 'static_cast'\n            ::ZeroMemory(static_cast<void*>(this), sizeof(*this));\n        }\n\n        StoredCallContextInfo(StoredCallContextInfo&& other) WI_NOEXCEPT : StoredCallContextInfo()\n        {\n            operator=(wistd::move(other));\n        }\n\n        StoredCallContextInfo& operator=(StoredCallContextInfo&& other) WI_NOEXCEPT\n        {\n            contextId = other.contextId;\n            contextName = other.contextName;\n            ClearMessage();\n            contextMessage = other.contextMessage;\n            other.contextMessage = nullptr;\n            m_ownsMessage = other.m_ownsMessage;\n            other.m_ownsMessage = false;\n            return *this;\n        }\n\n        StoredCallContextInfo(StoredCallContextInfo const& other) WI_NOEXCEPT : m_ownsMessage(false)\n        {\n            contextId = other.contextId;\n            contextName = other.contextName;\n            if (other.m_ownsMessage)\n            {\n                AssignMessage(other.contextMessage);\n            }\n            else\n            {\n                contextMessage = other.contextMessage;\n            }\n        }\n\n        StoredCallContextInfo(_In_opt_ PCSTR staticContextName) WI_NOEXCEPT : m_ownsMessage(false)\n        {\n            contextId = 0;\n            contextName = staticContextName;\n            contextMessage = nullptr;\n        }\n\n        StoredCallContextInfo(PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n            : StoredCallContextInfo(staticContextName)\n        {\n            SetMessage(formatString, argList);\n        }\n\n        void SetMessage(_Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            wchar_t loggingMessage[2048];\n            PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);\n            ClearMessage();\n            AssignMessage(loggingMessage);\n        }\n\n        void SetMessage(_In_opt_ PCWSTR message)\n        {\n            ClearMessage();\n            contextMessage = message;\n        }\n\n        void SetMessageCopy(_In_opt_ PCWSTR message)\n        {\n            ClearMessage();\n            if (message != nullptr)\n            {\n                AssignMessage(message);\n            }\n        }\n\n        void ClearMessage()\n        {\n            if (m_ownsMessage)\n            {\n                WIL_FreeMemory(const_cast<PWSTR>(contextMessage));\n                m_ownsMessage = false;\n            }\n            contextMessage = nullptr;\n        }\n\n        ~StoredCallContextInfo()\n        {\n            ClearMessage();\n        }\n\n        StoredCallContextInfo& operator=(StoredCallContextInfo const&) = delete;\n\n    private:\n        void AssignMessage(PCWSTR message)\n        {\n            auto length = wcslen(message);\n            if (length > 0)\n            {\n                auto sizeBytes = (length + 1) * sizeof(wchar_t);\n                contextMessage = static_cast<PCWSTR>(WIL_AllocateMemory(sizeBytes));\n                if (contextMessage != nullptr)\n                {\n                    m_ownsMessage = true;\n                    memcpy_s(const_cast<PWSTR>(contextMessage), sizeBytes, message, sizeBytes);\n                }\n            }\n        }\n\n        bool m_ownsMessage;\n    };\n\n    template <typename TActivity>\n    void SetRelatedActivityId(TActivity&)\n    {\n    }\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n    template <typename ActivityTraceLoggingType, ActivityOptions options, UINT64 keyword, UINT8 level, UINT64 privacyTag, typename TlgReflectorTag>\n    void SetRelatedActivityId(wil::ActivityBase<ActivityTraceLoggingType, options, keyword, level, privacyTag, TlgReflectorTag>& activity)\n    {\n        GUID capturedRelatedId;\n        EventActivityIdControl(EVENT_ACTIVITY_CTRL_GET_ID, &capturedRelatedId);\n        activity.SetRelatedActivityId(capturedRelatedId);\n    }\n#endif\n\n    typedef wistd::integral_constant<char, 0> tag_start;\n    typedef wistd::integral_constant<char, 1> tag_start_cv;\n} // namespace details\n/// @endcond\n\n// This class acts as a simple RAII class returned by a call to ContinueOnCurrentThread() for an activity\n// or by a call to WatchCurrentThread() on a provider.  The result is meant to be a stack local variable\n// whose scope controls the lifetime of an error watcher on the given thread.  That error watcher re-directs\n// errors occurrent within the object's lifetime to the associated provider or activity.\n\nclass ActivityThreadWatcher\n{\npublic:\n    ActivityThreadWatcher() WI_NOEXCEPT : m_callbackHolder(nullptr, nullptr, false)\n    {\n    }\n\n    ActivityThreadWatcher(_In_ details::IFailureCallback* pCallback, PCSTR staticContextName) WI_NOEXCEPT\n        : m_callContext(staticContextName),\n          m_callbackHolder(pCallback, &m_callContext)\n    {\n    }\n\n    ActivityThreadWatcher(\n        _In_ details::IFailureCallback* pCallback, PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        : ActivityThreadWatcher(pCallback, staticContextName)\n    {\n        m_callContext.SetMessage(formatString, argList);\n    }\n\n    // Uses the supplied StoredCallContextInfo rather than producing one itself\n    ActivityThreadWatcher(_In_ details::IFailureCallback* pCallback, _In_ details::StoredCallContextInfo const& callContext) WI_NOEXCEPT\n        : m_callContext(callContext),\n          m_callbackHolder(pCallback, &m_callContext)\n    {\n    }\n\n    ActivityThreadWatcher(ActivityThreadWatcher&& other) WI_NOEXCEPT : m_callContext(wistd::move(other.m_callContext)),\n                                                                       m_callbackHolder(wistd::move(other.m_callbackHolder))\n    {\n        m_callbackHolder.SetCallContext(&m_callContext);\n    }\n\n    ActivityThreadWatcher(ActivityThreadWatcher const&) = delete;\n    ActivityThreadWatcher& operator=(ActivityThreadWatcher const&) = delete;\n\n    void SetMessage(_Printf_format_string_ PCSTR formatString, ...)\n    {\n        va_list argList;\n        va_start(argList, formatString);\n        m_callContext.SetMessage(formatString, argList);\n        va_end(argList);\n    }\n\n    void SetMessage(_In_opt_ PCWSTR message)\n    {\n        m_callContext.SetMessage(message);\n    }\n\n    void SetMessageCopy(_In_opt_ PCWSTR message)\n    {\n        m_callContext.SetMessageCopy(message);\n    }\n\nprivate:\n    details::StoredCallContextInfo m_callContext;\n    details::ThreadFailureCallbackHolder m_callbackHolder;\n};\n\n// This is the base-class implementation of a TraceLogging class.  TraceLogging classes are defined with\n// BEGIN_TRACELOGGING_CLASS and automatically derive from this class\n\nenum class ErrorReportingType\n{\n    None = 0,\n    Telemetry,\n    TraceLogging\n};\n\nclass TraceLoggingProvider : public details::IFailureCallback\n{\npublic:\n    // Only one instance of each of these derived classes should be created\n    TraceLoggingProvider(_In_ TraceLoggingProvider const&) = delete;\n    TraceLoggingProvider& operator=(TraceLoggingProvider const&) = delete;\n    void* operator new(size_t) = delete;\n    void* operator new[](size_t) = delete;\n\nprotected:\n    // This can be overridden to provide specific initialization code for any individual provider.\n    // It will be ran once when the single static singleton instance of this class is created.\n    virtual void Initialize() WI_NOEXCEPT\n    {\n    }\n\n    // This method can be overridden by a provider to more tightly control what happens in the event\n    // of a failure in a CallContext activity, WatchCurrentThread() object, or attributed to a specific failure.\n    virtual void OnErrorReported(bool alreadyReported, FailureInfo const& failure) WI_NOEXCEPT\n    {\n        if (!alreadyReported && WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry))\n        {\n            if (m_errorReportingType == ErrorReportingType::Telemetry)\n            {\n                ReportTelemetryFailure(failure);\n            }\n            else if (m_errorReportingType == ErrorReportingType::TraceLogging)\n            {\n                ReportTraceLoggingFailure(failure);\n            }\n        }\n    }\n\npublic:\n    WI_NODISCARD TraceLoggingHProvider Provider_() const WI_NOEXCEPT\n    {\n        return m_providerHandle;\n    }\n\nprotected:\n    TraceLoggingProvider() WI_NOEXCEPT\n    {\n    }\n\n    virtual ~TraceLoggingProvider() WI_NOEXCEPT\n    {\n        if (m_ownsProviderHandle)\n        {\n            TraceLoggingUnregister(m_providerHandle);\n        }\n    }\n\n    WI_NODISCARD bool IsEnabled_(\n        UCHAR eventLevel /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */,\n        ULONGLONG eventKeywords /* MICROSOFT_KEYWORD_XXX */) const WI_NOEXCEPT\n    {\n        return ((m_providerHandle != nullptr) && TraceLoggingProviderEnabled(m_providerHandle, eventLevel, eventKeywords)) ||\n               __TRACELOGGING_TEST_HOOK_SET_ENABLED;\n    }\n\n    void SetErrorReportingType_(ErrorReportingType type)\n    {\n        m_errorReportingType = type;\n    }\n\n    static bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT\n    {\n        static long volatile s_lastFailureSeen = -1;\n        auto wasSeen = (s_lastFailureSeen == failureId);\n        s_lastFailureSeen = failureId;\n        return wasSeen;\n    }\n\n    void ReportTelemetryFailure(FailureInfo const& failure) WI_NOEXCEPT\n    {\n        __TRACELOGGING_TEST_HOOK_ERROR(failure);\n        TraceLoggingWrite(\n            m_providerHandle,\n            \"FallbackError\",\n            TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance),\n            TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY),\n            TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n            __RESULT_TELEMETRY_FAILURE_PARAMS(failure));\n    }\n\n    void ReportTraceLoggingFailure(FailureInfo const& failure) WI_NOEXCEPT\n    {\n        TraceLoggingWrite(\n            m_providerHandle, \"FallbackError\", TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __RESULT_TRACELOGGING_FAILURE_PARAMS(failure));\n    }\n\n    // Helper function for TraceLoggingError.\n    // It prints out a trace message for debug purposes. The message does not go into the telemetry.\n    void ReportTraceLoggingError(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n    {\n        if (IsEnabled_(WINEVENT_LEVEL_ERROR, 0))\n        {\n            wchar_t loggingMessage[2048];\n            details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);\n            TraceLoggingWrite(\n                m_providerHandle,\n                \"TraceLoggingError\",\n                TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                TraceLoggingWideString(loggingMessage, \"traceLoggingMessage\"));\n        }\n    }\n\n    // Helper function for TraceLoggingInfo.\n    // It prints out a trace message for debug purposes. The message does not go into the telemetry.\n    void ReportTraceLoggingMessage(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n    {\n        if (IsEnabled_(WINEVENT_LEVEL_VERBOSE, 0))\n        {\n            wchar_t loggingMessage[2048];\n            details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);\n            TraceLoggingWrite(\n                m_providerHandle,\n                \"TraceLoggingInfo\",\n                TraceLoggingLevel(WINEVENT_LEVEL_VERBOSE),\n                TraceLoggingWideString(loggingMessage, \"traceLoggingMessage\"));\n        }\n    }\n\n    void Register(TraceLoggingHProvider const providerHandle, TLG_PENABLECALLBACK callback = nullptr) WI_NOEXCEPT\n    {\n        // taking over the lifetime and management of providerHandle\n        m_providerHandle = providerHandle;\n        m_ownsProviderHandle = true;\n        TraceLoggingRegisterEx(providerHandle, callback, nullptr);\n        InternalInitialize();\n    }\n\n    void AttachProvider(TraceLoggingHProvider const providerHandle) WI_NOEXCEPT\n    {\n        m_providerHandle = providerHandle;\n        m_ownsProviderHandle = false;\n        InternalInitialize();\n    }\n\nprivate:\n    // IFailureCallback\n    bool NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT override\n    {\n        if (!WasAlreadyReportedToTelemetry(failure.failureId))\n        {\n            OnErrorReported(false, failure);\n        }\n        return true;\n    }\n\n    void InternalInitialize()\n    {\n        m_errorReportingType = ErrorReportingType::Telemetry;\n        Initialize();\n    }\n\n    TraceLoggingHProvider m_providerHandle{};\n    bool m_ownsProviderHandle{};\n    ErrorReportingType m_errorReportingType{};\n};\n\ntemplate <\n    typename TraceLoggingType,\n    UINT64 keyword = 0,\n    UINT8 level = WINEVENT_LEVEL_VERBOSE,\n    typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type\nclass BasicActivity : public _TlgActivityBase<BasicActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>\n{\n    using BaseTy = _TlgActivityBase<BasicActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>;\n    friend BaseTy;\n\n    void OnStarted()\n    {\n    }\n\n    void OnStopped()\n    {\n    }\n\npublic:\n    BasicActivity()\n    {\n    }\n\n    BasicActivity(BasicActivity&& rhs) : BaseTy(wistd::move(rhs))\n    {\n    }\n\n    BasicActivity& operator=(BasicActivity&& rhs)\n    {\n        BaseTy::operator=(wistd::move(rhs));\n        return *this;\n    }\n\n    /*\n    Returns a handle to the TraceLogging provider associated with this activity.\n    */\n    WI_NODISCARD TraceLoggingHProvider Provider() const\n    {\n        return TraceLoggingType::Provider();\n    }\n\n    /*\n    Sets the related (parent) activity.\n    May only be called once. If used, must be called before starting the activity.\n    */\n    template <typename ActivityTy>\n    void SetRelatedActivity(_In_ const ActivityTy& relatedActivity)\n    {\n        this->SetRelatedId(*relatedActivity.Id());\n    }\n\n    /*\n    Sets the related (parent) activity.\n    May only be called once. If used, must be called before starting the activity.\n    */\n    void SetRelatedActivityId(_In_ const GUID& relatedActivityId)\n    {\n        this->SetRelatedId(relatedActivityId);\n    }\n\n    /*\n    Sets the related (parent) activity.\n    May only be called once. If used, must be called before starting the activity.\n    */\n    void SetRelatedActivityId(_In_ const GUID* relatedActivityId)\n    {\n        __FAIL_FAST_IMMEDIATE_ASSERT__(relatedActivityId != NULL);\n        this->SetRelatedId(*relatedActivityId);\n    }\n};\n\ntemplate <\n    typename TraceLoggingType,\n    UINT64 keyword = 0,\n    UINT8 level = WINEVENT_LEVEL_VERBOSE,\n    typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type\nclass BasicThreadActivity\n    : public _TlgActivityBase<BasicThreadActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>\n{\n    using BaseTy = _TlgActivityBase<BasicThreadActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>;\n    friend BaseTy;\n\n    void OnStarted()\n    {\n        this->PushThreadActivityId();\n    }\n\n    void OnStopped()\n    {\n        this->PopThreadActivityId();\n    }\n\npublic:\n    BasicThreadActivity()\n    {\n    }\n\n    BasicThreadActivity(BasicThreadActivity&& rhs) : BaseTy(wistd::move(rhs))\n    {\n    }\n\n    BasicThreadActivity& operator=(BasicThreadActivity&& rhs)\n    {\n        BaseTy::operator=(wistd::move(rhs));\n        return *this;\n    }\n\n    /*\n    Returns a handle to the TraceLogging provider associated with this activity.\n    */\n    WI_NODISCARD TraceLoggingHProvider Provider() const\n    {\n        return TraceLoggingType::Provider();\n    }\n};\n\n/// @cond\n#define __WI_TraceLoggingWriteTagged(activity, name, ...) \\\n    __pragma(warning(push)) __pragma(warning(disable : 4127)) do \\\n    { \\\n        _tlgActivityDecl(activity) \\\n            TraceLoggingWriteActivity(TraceLoggingType::Provider(), (name), _tlgActivityRef(activity).Id(), NULL, ##__VA_ARGS__); \\\n    } \\\n    while (0) \\\n    __pragma(warning(pop)) /// @endcond\n\n// This is the ultimate base class implementation for all activities.  Activity classes are defined with\n// DEFINE_TRACELOGGING_ACTIVITY, DEFINE_CALLCONTEXT_ACTIVITY, DEFINE_TELEMETRY_ACTIVITY and others\n\ntemplate <typename ActivityTraceLoggingType, ActivityOptions options = ActivityOptions::None, UINT64 keyword = 0, UINT8 level = WINEVENT_LEVEL_VERBOSE, UINT64 privacyTag = 0, typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType>\nclass ActivityBase : public details::IFailureCallback\n{\npublic:\n    typedef ActivityTraceLoggingType TraceLoggingType;\n\n    static UINT64 const Keyword = keyword;\n    static UINT8 const Level = level;\n    static UINT64 const PrivacyTag = privacyTag;\n\n    ActivityBase(PCSTR contextName, bool shouldWatchErrors = false) WI_NOEXCEPT\n        : m_activityData(contextName),\n          m_pActivityData(&m_activityData),\n          m_callbackHolder(this, m_activityData.GetCallContext(), shouldWatchErrors)\n    {\n    }\n\n    ActivityBase(ActivityBase&& other, bool shouldWatchErrors) WI_NOEXCEPT\n        : m_activityData(wistd::move(other.m_activityData)),\n          m_sharedActivityData(wistd::move(other.m_sharedActivityData)),\n          m_callbackHolder(this, nullptr, shouldWatchErrors)\n    {\n        m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData;\n        m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());\n        other.m_pActivityData = &other.m_activityData;\n        if (other.m_callbackHolder.IsWatching())\n        {\n            other.m_callbackHolder.StopWatching();\n        }\n    }\n\n    ActivityBase(ActivityBase&& other) WI_NOEXCEPT : ActivityBase(wistd::move(other), other.m_callbackHolder.IsWatching())\n    {\n    }\n\n    ActivityBase(ActivityBase const& other) WI_NOEXCEPT\n        : m_activityData(),\n          m_pActivityData(&m_activityData),\n          m_callbackHolder(this, nullptr, false) // false = do not automatically watch for failures\n    {\n        operator=(other);\n    }\n\n    ActivityBase& operator=(ActivityBase&& other) WI_NOEXCEPT\n    {\n        m_activityData = wistd::move(other.m_activityData);\n        m_sharedActivityData = wistd::move(other.m_sharedActivityData);\n        m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData;\n        m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());\n        m_callbackHolder.SetWatching(other.m_callbackHolder.IsWatching());\n        other.m_pActivityData = &other.m_activityData;\n        if (other.m_callbackHolder.IsWatching())\n        {\n            other.m_callbackHolder.StopWatching();\n        }\n        return *this;\n    }\n\n    ActivityBase& operator=(ActivityBase const& other) WI_NOEXCEPT\n    {\n        if (m_callbackHolder.IsWatching())\n        {\n            m_callbackHolder.StopWatching();\n        }\n\n        if (other.m_sharedActivityData)\n        {\n            m_pActivityData = other.m_pActivityData;\n            m_sharedActivityData = other.m_sharedActivityData;\n        }\n        else if (m_sharedActivityData.create(wistd::move(other.m_activityData)))\n        {\n            // Locking should not be required as the first copy should always take place on the owning\n            // thread...\n            m_pActivityData = m_sharedActivityData.get();\n            other.m_sharedActivityData = m_sharedActivityData;\n            other.m_pActivityData = m_pActivityData;\n            other.m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());\n        }\n        m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());\n        return *this;\n    }\n\n    // These calls all result in setting a message to associate with any failures that might occur while\n    // running the activity.  For example, you could associate a filename with a call context activity\n    // so that the file name is only reported if the activity fails with the failure.\n\n    void SetMessage(_In_ _Printf_format_string_ PCSTR formatString, ...)\n    {\n        va_list argList;\n        va_start(argList, formatString);\n        auto lock = LockExclusive();\n        GetCallContext()->SetMessage(formatString, argList);\n        va_end(argList);\n    }\n\n    void SetMessage(_In_opt_ PCWSTR message)\n    {\n        auto lock = LockExclusive();\n        GetCallContext()->SetMessage(message);\n    }\n\n    void SetMessageCopy(_In_opt_ PCWSTR message)\n    {\n        auto lock = LockExclusive();\n        GetCallContext()->SetMessageCopy(message);\n    }\n\n    // This call stops watching for errors on the thread that the activity was originally\n    // created on.  Use it when moving the activity into a thread-agnostic class or moving\n    // an activity across threads.\n\n    void IgnoreCurrentThread() WI_NOEXCEPT\n    {\n        if (m_callbackHolder.IsWatching())\n        {\n            m_callbackHolder.StopWatching();\n        }\n    }\n\n    // Call this API to retrieve an RAII object to watch events on the current thread.  The returned\n    // object should only be used on the stack.\n\n    WI_NODISCARD ActivityThreadWatcher ContinueOnCurrentThread() WI_NOEXCEPT\n    {\n        if (IsRunning())\n        {\n            return ActivityThreadWatcher(this, *m_pActivityData->GetCallContext());\n        }\n        return ActivityThreadWatcher();\n    }\n\n    // This is the 'default' Stop routine that accepts an HRESULT and completes the activity...\n\n    void Stop(HRESULT hr = S_OK) WI_NOEXCEPT\n    {\n        bool stopActivity;\n        HRESULT hrLocal;\n        {\n            auto lock = LockExclusive();\n            stopActivity = m_pActivityData->SetStopResult(hr, &hrLocal);\n        }\n        if (stopActivity)\n        {\n            ReportStopActivity(hrLocal);\n        }\n        else\n        {\n            __WI_TraceLoggingWriteTagged(\n                *this,\n                \"ActivityIntermediateStop\",\n                TraceLoggingKeyword(Keyword),\n                TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance),\n                __ACTIVITY_STOP_PARAMS(hr));\n        }\n        IgnoreCurrentThread();\n    }\n\n    // IFailureCallback\n\n    bool NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT override\n    {\n        // We always report errors to the ETW stream, but we hold-back the telemetry keyword if we've already reported this error\n        // to this particular telemetry provider.\n\n        __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure);\n\n        if (WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry))\n        {\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunused-value\"\n#endif\n#pragma warning(push)\n#pragma warning(disable : 6319)\n            if (false, WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure) && !WasAlreadyReportedToTelemetry(failure.failureId))\n            {\n                __WI_TraceLoggingWriteTagged(\n                    *this,\n                    \"ActivityError\",\n                    TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY),\n                    TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                    __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure));\n            }\n            else if (false, WI_IsFlagSet(options, ActivityOptions::TraceLoggingOnFailure))\n            {\n                __WI_TraceLoggingWriteTagged(\n                    *this,\n                    \"ActivityError\",\n                    TraceLoggingKeyword(0),\n                    TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                    __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure));\n            }\n            else\n            {\n                __WI_TraceLoggingWriteTagged(\n                    *this,\n                    \"ActivityError\",\n                    TraceLoggingKeyword(Keyword),\n                    TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                    __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure));\n            }\n#pragma warning(pop)\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n        }\n\n        auto lock = LockExclusive();\n        m_pActivityData->NotifyFailure(failure);\n        return true;\n    }\n\n    // This is the base TraceLoggingActivity<> contract...  we implement it so that this class\n    // can be used by all of the activity macros and we re-route the request as needed.\n    //\n    // The contract required by the TraceLogging Activity macros is:\n    // - activity.Keyword    // compile-time constant\n    // - activity.Level      // compile-time constant\n    // - activity.PrivacyTag // compile-time constant\n    // - activity.Provider()\n    // - activity.Id()\n    // - activity.zInternalRelatedId()\n    // - activity.zInternalStart()\n    // - activity.zInternalStop()\n    // In addition, for TlgReflector to work correctly, it must be possible for\n    // TlgReflector to statically map from typeof(activity) to hProvider.\n\n    WI_NODISCARD GUID const* zInternalRelatedId() const WI_NOEXCEPT\n    {\n        return m_pActivityData->zInternalRelatedId();\n    }\n\n    void zInternalStart() WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->zInternalStart();\n    }\n\n    void zInternalStop() WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->zInternalStop();\n    }\n\n    static TraceLoggingHProvider Provider() WI_NOEXCEPT\n    {\n        return ActivityTraceLoggingType::Provider();\n    }\n\n    WI_NODISCARD GUID const* Id() const WI_NOEXCEPT\n    {\n        return m_pActivityData->Id();\n    }\n\n    WI_NODISCARD GUID const* providerGuid() const WI_NOEXCEPT\n    {\n        return m_pActivityData->providerGuid();\n    }\n\n    template <class OtherTy>\n    void SetRelatedActivity(OtherTy const& relatedActivity) WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->SetRelatedActivityId(relatedActivity.Id());\n    }\n\n    void SetRelatedActivityId(_In_ const GUID& relatedActivityId) WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->SetRelatedActivityId(&relatedActivityId);\n    }\n\n    void SetRelatedActivityId(_In_ const GUID* relatedActivityId) WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->SetRelatedActivityId(relatedActivityId);\n    }\n\n    WI_NODISCARD inline bool IsRunning() const WI_NOEXCEPT\n    {\n        return m_pActivityData->NeedsStopped();\n    }\n\nprotected:\n    virtual void StopActivity() WI_NOEXCEPT = 0;\n    virtual bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT = 0;\n\n    void EnsureWatchingCurrentThread()\n    {\n        if (!m_callbackHolder.IsWatching())\n        {\n            m_callbackHolder.StartWatching();\n        }\n    }\n\n    void SetStopResult(HRESULT hr, _Out_opt_ HRESULT* phr = nullptr) WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->SetStopResult(hr, phr);\n    }\n\n    void IncrementExpectedStopCount() WI_NOEXCEPT\n    {\n        auto lock = LockExclusive();\n        m_pActivityData->IncrementExpectedStopCount();\n    }\n\n    // Locking should not be required on these accessors as we only use this at reporting (which will only happen from\n    // the final stop)\n\n    FailureInfo const* GetFailureInfo() WI_NOEXCEPT\n    {\n        return m_pActivityData->GetFailureInfo();\n    }\n\n    WI_NODISCARD inline HRESULT GetResult() const WI_NOEXCEPT\n    {\n        return m_pActivityData->GetResult();\n    }\n\n    WI_NODISCARD details::StoredCallContextInfo* GetCallContext() const WI_NOEXCEPT\n    {\n        return m_pActivityData->GetCallContext();\n    }\n\n    // Think of this routine as the destructor -- since we need to call virtual derived methods, we can't use it as\n    // a destructor without a pure virtual method call, so we have the derived class call it in its destructor...\n\n    void Destroy() WI_NOEXCEPT\n    {\n        bool fStop = true;\n        if (m_sharedActivityData)\n        {\n            // The lock unifies the 'unique()' check and the 'reset()' of any non-unique activity so that we\n            // can positively identify the final release of the internal data\n\n            auto lock = LockExclusive();\n            if (!m_sharedActivityData.unique())\n            {\n                fStop = false;\n                m_sharedActivityData.reset();\n            }\n        }\n\n        if (fStop && m_pActivityData->NeedsStopped())\n        {\n            ReportStopActivity(m_pActivityData->SetUnhandledException());\n        }\n    }\n\nprivate:\n    void ReportStopActivity(HRESULT hr) WI_NOEXCEPT\n    {\n        if (FAILED(hr) &&\n            WI_AreAllFlagsClear(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA)) &&\n            WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure))\n        {\n            wil::FailureInfo const* pFailure = GetFailureInfo();\n            if (pFailure != nullptr)\n            {\n                __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, pFailure->hr);\n                auto& failure = *pFailure;\n                __WI_TraceLoggingWriteTagged(\n                    *this,\n                    \"ActivityFailure\",\n                    TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY),\n                    TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                    __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure));\n            }\n            else\n            {\n                __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(nullptr, hr);\n                __WI_TraceLoggingWriteTagged(\n                    *this,\n                    \"ActivityFailure\",\n                    TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY),\n                    TraceLoggingLevel(WINEVENT_LEVEL_ERROR),\n                    __ACTIVITY_FAILURE_TELEMETRY_PARAMS(\n                        hr, m_pActivityData->GetCallContext()->contextName, m_pActivityData->GetCallContext()->contextMessage));\n            }\n        }\n\n        StopActivity();\n    }\n\n    rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT\n    {\n        // We only need to lock when we're sharing....\n        return (m_sharedActivityData ? m_sharedActivityData->LockExclusive() : rwlock_release_exclusive_scope_exit());\n    }\n\n    template <typename ActivityTraceLoggingTypeOther, typename TlgReflectorTagOther = _TlgReflectorTag_Param0IsProviderType>\n    class ActivityData : public _TlgActivityBase<ActivityData<ActivityTraceLoggingTypeOther, TlgReflectorTagOther>, keyword, level>\n    {\n        using BaseTy = _TlgActivityBase<ActivityData<ActivityTraceLoggingTypeOther, TlgReflectorTagOther>, keyword, level>;\n        friend BaseTy;\n        void OnStarted()\n        {\n        }\n        void OnStopped()\n        {\n        }\n\n        // SFINAE dispatching on presence of ActivityTraceLoggingTypeOther::CreateActivityId(_Out_ GUID& childActivityId, _In_opt_ const GUID* relatedActivityId)\n        template <typename ProviderType>\n        auto CreateActivityIdByProviderType(int, _Out_ GUID& childActivityId)\n            -> decltype(ProviderType::CreateActivityId(childActivityId, this->GetRelatedId()), (void)0)\n        {\n            ProviderType::CreateActivityId(childActivityId, this->GetRelatedId());\n        }\n\n        template <typename ProviderType>\n        auto CreateActivityIdByProviderType(long, _Out_ GUID& childActivityId) -> void\n        {\n            EventActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, &childActivityId);\n        }\n\n        void CreateActivityId(_Out_ GUID& childActivityId)\n        {\n            CreateActivityIdByProviderType<ActivityTraceLoggingTypeOther>(0, childActivityId);\n        }\n\n    public:\n        ActivityData(_In_opt_ PCSTR contextName = nullptr) WI_NOEXCEPT : BaseTy(),\n                                                                         m_callContext(contextName),\n                                                                         m_result(S_OK),\n                                                                         m_stopCountExpected(1)\n        {\n        }\n\n        ActivityData(ActivityData&& other) WI_NOEXCEPT : BaseTy(wistd::move(other)),\n                                                         m_callContext(wistd::move(other.m_callContext)),\n                                                         m_result(other.m_result),\n                                                         m_failure(wistd::move(other.m_failure)),\n                                                         m_stopCountExpected(other.m_stopCountExpected)\n        {\n        }\n\n        ActivityData& operator=(ActivityData&& other) WI_NOEXCEPT\n        {\n            BaseTy::operator=(wistd::move(other));\n            m_callContext = wistd::move(other.m_callContext);\n            m_result = other.m_result;\n            m_failure = wistd::move(other.m_failure);\n            m_stopCountExpected = other.m_stopCountExpected;\n            return *this;\n        }\n\n        ActivityData(ActivityData const& other) = delete;\n        ActivityData& operator=(ActivityData const& other) = delete;\n\n        // returns true if the event was reported to telemetry\n        void NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT\n        {\n            if ((failure.hr != m_failure.GetFailureInfo().hr) && // don't replace with the same error (likely propagation up the stack)\n                ((failure.hr != m_result) ||\n                 SUCCEEDED(m_result))) // don't replace if we've already got the current explicitly supplied failure code\n            {\n                m_failure.SetFailureInfo(failure);\n            }\n        }\n\n        rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT\n        {\n            return m_lock.lock_exclusive();\n        }\n\n        static TraceLoggingHProvider Provider()\n        {\n            return ActivityTraceLoggingTypeOther::Provider();\n        }\n\n        WI_NODISCARD bool NeedsStopped() const WI_NOEXCEPT\n        {\n            return BaseTy::IsStarted();\n        }\n\n        void SetRelatedActivityId(const GUID* relatedId)\n        {\n            this->SetRelatedId(*relatedId);\n        }\n\n        bool SetStopResult(HRESULT hr, _Out_opt_ HRESULT* phr) WI_NOEXCEPT\n        {\n            // We must be expecting at least one Stop -- otherwise the caller is calling Stop() more times\n            // than it can (normally once, or +1 for each call to Split())\n            __FAIL_FAST_IMMEDIATE_ASSERT__(m_stopCountExpected >= 1);\n            if (SUCCEEDED(m_result))\n            {\n                m_result = hr;\n            }\n            if (phr != nullptr)\n            {\n                *phr = m_result;\n            }\n            return ((--m_stopCountExpected) == 0);\n        }\n\n        HRESULT SetUnhandledException() WI_NOEXCEPT\n        {\n            HRESULT hr = m_failure.GetFailureInfo().hr;\n            SetStopResult(FAILED(hr) ? hr : HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), &hr);\n            return hr;\n        }\n\n        void IncrementExpectedStopCount() WI_NOEXCEPT\n        {\n            m_stopCountExpected++;\n        }\n\n        WI_NODISCARD FailureInfo const* GetFailureInfo() const WI_NOEXCEPT\n        {\n            return (FAILED(m_result) && (m_result == m_failure.GetFailureInfo().hr)) ? &m_failure.GetFailureInfo() : nullptr;\n        }\n\n        WI_NODISCARD inline HRESULT GetResult() const WI_NOEXCEPT\n        {\n            return m_result;\n        }\n\n        details::StoredCallContextInfo* GetCallContext() WI_NOEXCEPT\n        {\n            return &m_callContext;\n        }\n\n    private:\n        details::StoredCallContextInfo m_callContext;\n        HRESULT m_result;\n        StoredFailureInfo m_failure;\n        int m_stopCountExpected;\n        wil::srwlock m_lock;\n    };\n\n    mutable ActivityData<ActivityTraceLoggingType, TlgReflectorTag> m_activityData;\n    mutable ActivityData<ActivityTraceLoggingType, TlgReflectorTag>* m_pActivityData;\n    mutable details::shared_object<ActivityData<ActivityTraceLoggingType, TlgReflectorTag>> m_sharedActivityData;\n    mutable details::ThreadFailureCallbackHolder m_callbackHolder;\n};\n\n} // namespace wil\n\n// Internal MACRO implementation of Activities.\n// Do NOT use these macros directly.\n/// @cond\n#define __WI_TraceLoggingWriteStart(activity, name, ...) \\\n    __pragma(warning(push)) __pragma(warning(disable : 4127)) do \\\n    { \\\n        _tlgActivityDecl(activity); \\\n        using _tlg_Activity_t = wistd::remove_reference_t<decltype(activity)>; \\\n        static constexpr const UINT64 _tlgActivity_Keyword = _tlg_Activity_t::Keyword; \\\n        static constexpr const UINT8 _tlgActivity_Level = _tlg_Activity_t::Level; \\\n        static constexpr const UINT64 _tlgActivityPrivacyTag = _tlg_Activity_t::PrivacyTag; \\\n        static_assert( \\\n            _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, ##__VA_ARGS__)), \\\n            \"Do not use TraceLoggingKeyword in TraceLoggingWriteStart. Keywords for START events are \" \\\n            \"specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>.\"); \\\n        static_assert( \\\n            _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, ##__VA_ARGS__)), \\\n            \"Do not use TraceLoggingLevel in TraceLoggingWriteStart. The Level for START events is \" \\\n            \"specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>.\"); \\\n        _tlgActivityRef(activity).zInternalStart(); \\\n        TraceLoggingWriteActivity( \\\n            TraceLoggingType::Provider(), \\\n            (name), \\\n            _tlgActivityRef(activity).Id(), \\\n            _tlgActivityRef(activity).zInternalRelatedId(), \\\n            TraceLoggingOpcode(1 /* WINEVENT_OPCODE_START */), \\\n            TraceLoggingKeyword(_tlgActivity_Keyword), \\\n            TraceLoggingLevel(_tlgActivity_Level), \\\n            TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \\\n            TraceLoggingDescription(\"~^\" _wiltlg_LSTRINGIZE(activity) L\"^~\"), \\\n            ##__VA_ARGS__); \\\n    } \\\n    while (0) \\\n    __pragma(warning(pop))\n\n#define __WRITE_ACTIVITY_START(EventId, ...) \\\n    __TRACELOGGING_TEST_HOOK_ACTIVITY_START(); \\\n    __WI_TraceLoggingWriteStart(*this, #EventId, __ACTIVITY_START_PARAMS(), ##__VA_ARGS__); \\\n    EnsureWatchingCurrentThread()\n\n#define __WI_TraceLoggingWriteStop(activity, name, ...) \\\n    __pragma(warning(push)) __pragma(warning(disable : 4127)) do \\\n    { \\\n        _tlgActivityDecl(activity); \\\n        using _tlg_Activity_t = wistd::remove_reference_t<decltype(activity)>; \\\n        static constexpr const UINT64 _tlgActivity_Keyword = _tlg_Activity_t::Keyword; \\\n        static constexpr const UINT8 _tlgActivity_Level = _tlg_Activity_t::Level; \\\n        static constexpr const UINT64 _tlgActivityPrivacyTag = _tlg_Activity_t::PrivacyTag; \\\n        static_assert( \\\n            _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, ##__VA_ARGS__)), \\\n            \"Do not use TraceLoggingKeyword in TraceLoggingWriteStop. Keywords for STOP events are \" \\\n            \"specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>.\"); \\\n        static_assert( \\\n            _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, ##__VA_ARGS__)), \\\n            \"Do not use TraceLoggingLevel in TraceLoggingWriteStop. The Level for STOP events is \" \\\n            \"specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>.\"); \\\n        _tlgActivityRef(activity).zInternalStop(); \\\n        TraceLoggingWriteActivity( \\\n            TraceLoggingType::Provider(), \\\n            (name), \\\n            _tlgActivityRef(activity).Id(), \\\n            NULL, \\\n            TraceLoggingOpcode(2 /* WINEVENT_OPCODE_STOP */), \\\n            TraceLoggingKeyword(_tlgActivity_Keyword), \\\n            TraceLoggingLevel(_tlgActivity_Level), \\\n            TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \\\n            TraceLoggingDescription(\"~^\" _wiltlg_LSTRINGIZE(activity) L\"^~\"), \\\n            ##__VA_ARGS__); \\\n    } \\\n    while (0) \\\n    __pragma(warning(pop))\n\n#define __WRITE_ACTIVITY_STOP(EventId, ...) \\\n    wil::FailureInfo const* pFailure = GetFailureInfo(); \\\n    if (pFailure != nullptr) \\\n    { \\\n        __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, pFailure->hr); \\\n        auto& failure = *pFailure; \\\n        if (false, WI_IsAnyFlagSet(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA))) \\\n        { \\\n            __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure), ##__VA_ARGS__); \\\n        } \\\n        else \\\n        { \\\n            __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure), ##__VA_ARGS__); \\\n        } \\\n    } \\\n    else \\\n    { \\\n        __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(nullptr, GetResult()); \\\n        __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_PARAMS(GetResult()), ##__VA_ARGS__); \\\n    } \\\n    IgnoreCurrentThread();\n\n// optional params are:  KeyWord, Level, PrivacyTags, Options\n#define __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, ...) \\\n    class ActivityClassName final : public wil::ActivityBase<TraceLoggingType, ##__VA_ARGS__> \\\n    { \\\n    protected: \\\n        void StopActivity() WI_NOEXCEPT override \\\n        { \\\n            __WRITE_ACTIVITY_STOP(ActivityClassName); \\\n        } \\\n        bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT override \\\n        { \\\n            return TraceLoggingType::WasAlreadyReportedToTelemetry(failureId); \\\n        } \\\n\\\n    public: \\\n        static bool IsEnabled() WI_NOEXCEPT \\\n        { \\\n            return TraceLoggingType::IsEnabled(); \\\n        } \\\n        ~ActivityClassName() WI_NOEXCEPT \\\n        { \\\n            ActivityBase::Destroy(); \\\n        } \\\n        ActivityClassName(ActivityClassName const& other) WI_NOEXCEPT : ActivityBase(other) \\\n        { \\\n        } \\\n        ActivityClassName(ActivityClassName&& other) WI_NOEXCEPT : ActivityBase(wistd::move(other)) \\\n        { \\\n        } \\\n        ActivityClassName(ActivityClassName&& other, bool shouldWatchErrors) WI_NOEXCEPT \\\n            : ActivityBase(wistd::move(other), shouldWatchErrors) \\\n        { \\\n        } \\\n        ActivityClassName& operator=(ActivityClassName const& other) WI_NOEXCEPT \\\n        { \\\n            ActivityBase::operator=(other); \\\n            return *this; \\\n        } \\\n        ActivityClassName& operator=(ActivityClassName&& other) WI_NOEXCEPT \\\n        { \\\n            auto localActivity(wistd::move(*this)); \\\n            ActivityBase::operator=(wistd::move(other)); \\\n            return *this; \\\n        } \\\n        WI_NODISCARD explicit operator bool() const WI_NOEXCEPT \\\n        { \\\n            return IsRunning(); \\\n        } \\\n        void StopWithResult(HRESULT hr) \\\n        { \\\n            ActivityBase::Stop(hr); \\\n        } \\\n        template <typename... TArgs> \\\n        void StopWithResult(HRESULT hr, TArgs&&... args) \\\n        { \\\n            SetStopResult(hr); \\\n            Stop(wistd::forward<TArgs>(args)...); \\\n        } \\\n        void Stop(HRESULT hr = S_OK) WI_NOEXCEPT \\\n        { \\\n            ActivityBase::Stop(hr); \\\n        } \\\n        void StartActivity() WI_NOEXCEPT \\\n        { \\\n            __WRITE_ACTIVITY_START(ActivityClassName); \\\n        } \\\n        void StartRelatedActivity() WI_NOEXCEPT \\\n        { \\\n            wil::details::SetRelatedActivityId(*this); \\\n            StartActivity(); \\\n        } \\\n        void StartActivityWithCorrelationVector(PCSTR correlationVector) WI_NOEXCEPT \\\n        { \\\n            __WRITE_ACTIVITY_START(ActivityClassName, TraceLoggingString(correlationVector, \"__TlgCV__\")); \\\n        } \\\n        WI_NODISCARD ActivityClassName Split() WI_NOEXCEPT \\\n        { \\\n            __FAIL_FAST_IMMEDIATE_ASSERT__(IsRunning()); \\\n            IncrementExpectedStopCount(); \\\n            return ActivityClassName(*this); \\\n        } \\\n        WI_NODISCARD ActivityClassName TransferToCurrentThread() WI_NOEXCEPT \\\n        { \\\n            return ActivityClassName(wistd::move(*this), IsRunning()); \\\n        } \\\n        WI_NODISCARD ActivityClassName TransferToMember() WI_NOEXCEPT \\\n        { \\\n            return ActivityClassName(wistd::move(*this), false); \\\n        }\n\n#define __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) \\\nprivate: \\\n    template <typename... TArgs> \\\n    ActivityClassName(wil::details::tag_start, TArgs&&... args) WI_NOEXCEPT : ActivityBase(#ActivityClassName) \\\n    { \\\n        StartActivity(wistd::forward<TArgs>(args)...); \\\n        __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(\"this\", ActivityClassName); \\\n    } \\\n    template <typename... TArgs> \\\n    ActivityClassName(wil::details::tag_start_cv, _In_opt_ PCSTR correlationVector, TArgs&&... args) WI_NOEXCEPT \\\n        : ActivityBase(#ActivityClassName) \\\n    { \\\n        StartActivityWithCorrelationVector(correlationVector, wistd::forward<TArgs>(args)...); \\\n        __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(\"this\", ActivityClassName); \\\n    } \\\n\\\npublic: \\\n    ActivityClassName() WI_NOEXCEPT : ActivityBase(#ActivityClassName, false) \\\n    { \\\n    } \\\n    template <typename... TArgs> \\\n    WI_NODISCARD static ActivityClassName Start(TArgs&&... args) \\\n    { \\\n        return ActivityClassName(wil::details::tag_start(), wistd::forward<TArgs>(args)...); \\\n    } \\\n    template <typename... TArgs> \\\n    WI_NODISCARD static ActivityClassName StartWithCorrelationVector(_In_ PCSTR correlationVector, TArgs&&... args) \\\n    { \\\n        return ActivityClassName(wil::details::tag_start_cv(), correlationVector, wistd::forward<TArgs>(args)...); \\\n    }\n\n#define __IMPLEMENT_CALLCONTEXT_CLASS(ActivityClassName) \\\nprotected: \\\n    ActivityClassName(_In_opt_ void**, PCSTR contextName, _In_ _Printf_format_string_ PCSTR formatString, _In_opt_ va_list argList) : \\\n        ActivityBase(contextName) \\\n    { \\\n        GetCallContext()->SetMessage(formatString, argList); \\\n        StartActivity(); \\\n    } \\\n    ActivityClassName(_In_opt_ void**, PCSTR contextName) : ActivityBase(contextName) \\\n    { \\\n        StartActivity(); \\\n    } \\\n\\\npublic: \\\n    ActivityClassName(PCSTR contextName) : ActivityBase(contextName, false) \\\n    { \\\n    } \\\n    ActivityClassName(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT : ActivityClassName(contextName) \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        GetCallContext()->SetMessage(formatString, argList); \\\n    } \\\n    WI_NODISCARD static ActivityClassName Start(PCSTR contextName) WI_NOEXCEPT \\\n    { \\\n        return ActivityClassName(static_cast<void**>(__nullptr), contextName); \\\n    } \\\n    WI_NODISCARD static ActivityClassName Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        return ActivityClassName(static_cast<void**>(__nullptr), contextName, formatString, argList); \\\n    }\n\n#define __END_TRACELOGGING_ACTIVITY_CLASS() \\\n    } \\\n    ;\n/// @endcond\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \\\n    void EventId() \\\n    { \\\n        __WI_TraceLoggingWriteTagged(*this, #EventId, _GENERIC_PARTB_FIELDS_ENABLED, ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \\\n    void EventId() \\\n    { \\\n        __WI_TraceLoggingWriteTagged(*this, #EventId, ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \\\n    void EventId(PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, #EventId, _GENERIC_PARTB_FIELDS_ENABLED, TraceLoggingString(correlationVector, \"__TlgCV__\"), ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \\\n    void EventId(PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingString(correlationVector, \"__TlgCV__\"), ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    void EventId(T1&& varName1) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    void EventId(T1&& varName1) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, #EventId, TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    void EventId(T1&& varName1, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    void EventId(T1&& varName1, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    void EventId(T1&& varName1, T2&& varName2) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    void EventId(T1&& varName1, T2&& varName2) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    void EventId(T1&& varName1, T2&& varName2, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    void EventId(T1&& varName1, T2&& varName2, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, PCSTR correlationVector) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9) \\\n    { \\\n        __WI_TraceLoggingWriteTagged( \\\n            *this, \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, ##__VA_ARGS__)\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, ##__VA_ARGS__)\n#define DEFINE_TAGGED_TRACELOGGING_EVENT_STRING(EventId, varName, ...) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, ##__VA_ARGS__)\n\n// Internal MACRO implementation of TraceLogging classes.\n// Do NOT use these macros directly.\n/// @cond\n#define __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingProviderOwnerClassName) \\\npublic: \\\n    typedef TraceLoggingProviderOwnerClassName TraceLoggingType; \\\n    static bool IsEnabled( \\\n        UCHAR eventLevel = 0 /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */, \\\n        ULONGLONG eventKeywords = 0 /* MICROSOFT_KEYWORD_XXX */) WI_NOEXCEPT \\\n    { \\\n        return Instance()->IsEnabled_(eventLevel, eventKeywords); \\\n    } \\\n    static TraceLoggingHProvider Provider() WI_NOEXCEPT \\\n    { \\\n        return static_cast<TraceLoggingProvider*>(Instance())->Provider_(); \\\n    } \\\n    static void SetTelemetryEnabled(bool) WI_NOEXCEPT \\\n    { \\\n    } \\\n    static void SetErrorReportingType(wil::ErrorReportingType type) WI_NOEXCEPT \\\n    { \\\n        return Instance()->SetErrorReportingType_(type); \\\n    } \\\n    static void __stdcall FallbackTelemetryCallback(bool alreadyReported, wil::FailureInfo const& failure) WI_NOEXCEPT \\\n    { \\\n        return Instance()->OnErrorReported(alreadyReported, failure); \\\n    } \\\n    WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread(PCSTR contextName) WI_NOEXCEPT \\\n    { \\\n        return wil::ActivityThreadWatcher(Instance(), contextName); \\\n    } \\\n    WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread( \\\n        PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        return wil::ActivityThreadWatcher(Instance(), contextName, formatString, argList); \\\n    } \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(CallContext, wil::ActivityOptions::TelemetryOnFailure) \\\n    __IMPLEMENT_CALLCONTEXT_CLASS(CallContext); \\\n    __END_TRACELOGGING_ACTIVITY_CLASS(); \\\n    static CallContext Start(PCSTR contextName) WI_NOEXCEPT \\\n    { \\\n        return CallContext(contextName, __nullptr, __nullptr); \\\n    } \\\n    static CallContext Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        return CallContext(contextName, formatString, argList); \\\n    } \\\n    static void TraceLoggingInfo(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        return Instance()->ReportTraceLoggingMessage(formatString, argList); \\\n    } \\\n    static void TraceLoggingError(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \\\n    { \\\n        va_list argList; \\\n        va_start(argList, formatString); \\\n        return Instance()->ReportTraceLoggingError(formatString, argList); \\\n    } \\\n\\\nprivate: \\\n    TraceLoggingHProvider Provider_() const WI_NOEXCEPT = delete; \\\n    TraceLoggingClassName() WI_NOEXCEPT{}; \\\n\\\nprotected: \\\n    static TraceLoggingClassName* Instance() WI_NOEXCEPT \\\n    { \\\n        static wil::details::static_lazy<TraceLoggingClassName> wrapper; \\\n        return wrapper.get([]() { \\\n            wrapper.cleanup(); \\\n        }); \\\n    } \\\n    friend class wil::details::static_lazy<TraceLoggingClassName>;\n\n#define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \\\nprivate: \\\n    struct StaticHandle \\\n    { \\\n        TraceLoggingHProvider handle; \\\n        StaticHandle() WI_NOEXCEPT \\\n        { \\\n            TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \\\n            _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \\\n            handle = &__hInner; \\\n        } \\\n    } m_staticHandle; \\\n\\\nprotected: \\\n    void Create() WI_NOEXCEPT \\\n    { \\\n        Register(m_staticHandle.handle); \\\n    } \\\n\\\npublic:\n\n#define __IMPLEMENT_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())\n\n#define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \\\nprivate: \\\n    struct StaticHandle \\\n    { \\\n        TraceLoggingHProvider handle; \\\n        StaticHandle() WI_NOEXCEPT \\\n        { \\\n            TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \\\n            _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \\\n            handle = &__hInner; \\\n        } \\\n    } m_staticHandle; \\\n    static VOID NTAPI Callback( \\\n        _In_ const GUID* SourceId, \\\n        ULONG ControlCode, \\\n        UCHAR Level, \\\n        ULONGLONG MatchAnyKeyword, \\\n        ULONGLONG MatchAllKeyword, \\\n        _In_opt_ EVENT_FILTER_DESCRIPTOR* FilterData, \\\n        void* CallbackContext); \\\n\\\nprotected: \\\n    void Create() WI_NOEXCEPT \\\n    { \\\n        Register(m_staticHandle.handle, &TraceLoggingClassName::Callback); \\\n    } \\\n\\\npublic:\n\n#define __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \\\nprivate: \\\n    struct StaticHandle \\\n    { \\\n        TraceLoggingHProvider handle; \\\n        StaticHandle() WI_NOEXCEPT \\\n        { \\\n            TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId); \\\n            _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \\\n            handle = &__hInner; \\\n        } \\\n    } m_staticHandle; \\\n\\\nprotected: \\\n    void Create() WI_NOEXCEPT \\\n    { \\\n        Register(m_staticHandle.handle); \\\n    } \\\n\\\npublic:\n/// @endcond\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT(EventId, ...) \\\n    static void EventId() \\\n    { \\\n        TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, _GENERIC_PARTB_FIELDS_ENABLED, ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT(EventId, ...) \\\n    static void EventId() \\\n    { \\\n        TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \\\n    static void EventId(PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), #EventId, _GENERIC_PARTB_FIELDS_ENABLED, TraceLoggingString(correlationVector, \"__TlgCV__\"), ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \\\n    static void EventId(PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, TraceLoggingString(correlationVector, \"__TlgCV__\"), ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    static void EventId(T1&& varName1) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    static void EventId(T1&& varName1) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    static void EventId(T1&& varName1, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \\\n    template <typename T1> \\\n    static void EventId(T1&& varName1, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    static void EventId(T1&& varName1, T2&& varName2) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    static void EventId(T1&& varName1, T2&& varName2) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    static void EventId(T1&& varName1, T2&& varName2, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \\\n    template <typename T1, typename T2> \\\n    static void EventId(T1&& varName1, T2&& varName2, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \\\n    template <typename T1, typename T2, typename T3> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    static void EventId(T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM9( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM9( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM9_CV( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM9_CV( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9, PCSTR correlationVector) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            TraceLoggingString(correlationVector, \"__TlgCV__\"), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#ifdef _GENERIC_PARTB_FIELDS_ENABLED\n#define DEFINE_TRACELOGGING_EVENT_PARAM10( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    VarType10, \\\n    varName10, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9, T10&& varName10) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            TraceLoggingValue(static_cast<VarType10>(wistd::forward<T10>(varName10)), _wiltlg_STRINGIZE(varName10)), \\\n            _GENERIC_PARTB_FIELDS_ENABLED, \\\n            ##__VA_ARGS__); \\\n    }\n#else\n#define DEFINE_TRACELOGGING_EVENT_PARAM10( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    VarType10, \\\n    varName10, \\\n    ...) \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> \\\n    static void EventId( \\\n        T1&& varName1, T2&& varName2, T3&& varName3, T4&& varName4, T5&& varName5, T6&& varName6, T7&& varName7, T8&& varName8, T9&& varName9, T10&& varName10) \\\n    { \\\n        TraceLoggingWrite( \\\n            TraceLoggingType::Provider(), \\\n            #EventId, \\\n            TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \\\n            TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \\\n            TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \\\n            TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \\\n            TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \\\n            TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \\\n            TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \\\n            TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \\\n            TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \\\n            TraceLoggingValue(static_cast<VarType10>(wistd::forward<T10>(varName10)), _wiltlg_STRINGIZE(varName10)), \\\n            ##__VA_ARGS__); \\\n    }\n#endif\n\n#define DEFINE_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, ##__VA_ARGS__)\n#define DEFINE_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, ##__VA_ARGS__)\n#define DEFINE_TRACELOGGING_EVENT_STRING(EventId, varName, ...) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, ##__VA_ARGS__)\n\n// Declaring a pure TraceLogging class\n// To declare a tracelogging class, declare your class derived from wil::TraceLoggingProvider, populate the uuid\n// attribute of the class with the GUID of your provider, and then include the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY\n// macro within your class.\n//\n// If you want to register a provider using a callback to log events, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK\n// Additionally your tracelogging class will have to implement a static Callback method. See the declaration within __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB.\n//\n// If you don't need or use telemetry, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY.\n// This prevents telemetry from enabling your provider even if you're not using telemetry.\n\n#define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName)\n\n#define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName)\n\n#define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \\\n    IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())\n#define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK(TraceLoggingClassName, ProviderName, ProviderId) \\\n    IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())\n#define IMPLEMENT_TRACELOGGING_CLASS_WITH_WINDOWS_CORE_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \\\n    IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionWindowsCoreTelemetry())\n#define IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId)\n\n#ifndef WIL_HIDE_DEPRECATED_1612\nWIL_WARN_DEPRECATED_1612_PRAGMA(\"IMPLEMENT_TRACELOGGING_CLASS\")\n// DEPRECATED: Use IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY\n#define IMPLEMENT_TRACELOGGING_CLASS IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY\n#endif\n\n// [Optional] Externally using a Tracelogging class\n// Use TraceLoggingProviderWrite to directly use the trace logging provider externally from the class in code.\n// This is recommended only for simple TraceLogging events.  Telemetry events and activities are better defined\n// within your Tracelogging class using one of the macros below.\n\n#define TraceLoggingProviderWrite(TraceLoggingClassName, EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, ##__VA_ARGS__)\n\n#define TraceLoggingProviderWriteTelemetry(TraceLoggingClassName, EventId, ...) \\\n    TraceLoggingWrite( \\\n        TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), ##__VA_ARGS__)\n\n#define TraceLoggingProviderWriteMeasure(TraceLoggingClassName, EventId, ...) \\\n    TraceLoggingWrite( \\\n        TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), ##__VA_ARGS__)\n\n#define TraceLoggingProviderWriteCriticalData(TraceLoggingClassName, EventId, ...) \\\n    TraceLoggingWrite( \\\n        TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), ##__VA_ARGS__)\n\n// [Optional] Custom Events\n// Use these macros to define a Custom Event for a Provider.  Use the TraceLoggingClassWrite or TraceLoggingClassWriteTelemetry\n// from within a custom event to issue the event.  Methods will be a no-op (and not be called) if the provider is not\n// enabled.\n\n#define TraceLoggingClassWrite(EventId, ...) TraceLoggingWrite(TraceLoggingType::Provider(), EventId, ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteTelemetry(EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteMeasure(EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteCriticalData(EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), ##__VA_ARGS__)\n\n#define DEFINE_EVENT_METHOD(MethodName) \\\n    template <typename... TArgs> \\\n    static void MethodName(TArgs&&... args) WI_NOEXCEPT \\\n    { \\\n        if (IsEnabled()) \\\n        { \\\n            Instance()->MethodName##_(wistd::forward<TArgs>(args)...); \\\n        } \\\n    } \\\n    void MethodName##_\n\n// [Optional] Simple Events\n// Use these macros to define very simple telemetry events for a Provider.  The events can\n// be TELEMETRY events or TRACELOGGING events.\n\n// To comply with the General Data Protection Regulations (GDPR), all collected Asimov events must\n// be tagged with a Privacy Data Type per release and per event instance.  Starting with 19H1,\n// events will not be uploaded unless they are tagged in code or in DataGrid.  Tagging in code is\n// preferred and only the \"compliant\" macro variants (which supply a privacy data type) are\n// supported outside of the Windows codebase.\n//\n// [Microsoft Internal] See also: https://osgwiki.com/wiki/Privacy_Data_Type_-_Tagging_in_Code\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_TELEMETRY_EVENT(EventId) DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n\n#define DEFINE_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n\n#define DEFINE_TELEMETRY_EVENT_CV(EventId) DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TELEMETRY_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n\n#define DEFINE_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_CV(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_CV(EventId, PrivacyTag, EventTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV( \\\n        EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM3_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    EventTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// [Optional] Simple Events\n// Use these macros to define very simple measure events for a Provider.\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_MEASURES_EVENT(EventId) DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n\n#define DEFINE_MEASURES_EVENT_CV(EventId) DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_MEASURES_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n\n#define DEFINE_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_MEASURES_EVENT_STRING(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM9( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM9( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        VarType9, \\\n        varName9, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM10( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9, \\\n    VarType10, \\\n    varName10) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM10( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        VarType9, \\\n        varName9, \\\n        VarType10, \\\n        varName10, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_MEASURES_EVENT_CV(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_CV(EventId, PrivacyTag, EventTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV( \\\n        EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM3_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    EventTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM9_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    EventTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM9_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        VarType9, \\\n        varName9, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n\n#define DEFINE_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// [Optional] Simple Events\n// Use these macros to define very simple critical data events for a Provider.\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_CRITICAL_DATA_EVENT(EventId) \\\n    DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n\n#define DEFINE_CRITICAL_DATA_EVENT_CV(EventId) \\\n    DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_CRITICAL_DATA_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n\n#define DEFINE_CRITICAL_DATA_EVENT_UINT32(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_CRITICAL_DATA_EVENT_STRING(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag, EventTag) \\\n    DEFINE_TRACELOGGING_EVENT_CV( \\\n        EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM1_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM3_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM4_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM5_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM6_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM7_CV( \\\n    EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM8_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    EventTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM9_CV( \\\n    EventId, \\\n    PrivacyTag, \\\n    EventTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9) \\\n    DEFINE_TRACELOGGING_EVENT_PARAM9_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        VarType9, \\\n        varName9, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag), \\\n        TraceLoggingEventTag(EventTag))\n\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// Custom Activities\n// For these you pair the appropriate BEGIN and END macros to define your activity.  Within the pair\n// you can use the (TODO: LIST MACRO NAMES) macros to add behavior.\n\n// [optional] params are:  Options, Keyword, Level, PrivacyTag\n#define BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, ...) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, ##__VA_ARGS__) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// [optional] param is: Level, PrivacyTag\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#endif\n#define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// [optional] param is: Level\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#endif\n#define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// [optional] param is: Level\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#endif\n#define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// [optional] param is: Level\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#endif\n#define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// [optional] param is: Level\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#endif\n#define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n#define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    __BEGIN_TRACELOGGING_ACTIVITY_CLASS( \\\n        ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level, PrivacyTag) \\\n    __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)\n\n// Use to end ALL activity class definitions\n#define END_ACTIVITY_CLASS() __END_TRACELOGGING_ACTIVITY_CLASS()\n\n// Simple Activities\n// For these you just use the appropriate macro to define the KIND of activity you want and specify\n// the name (for tracelogging you can give other options)\n\n// [optional] params are:  Options, Keyword, Level\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define DEFINE_CUSTOM_ACTIVITY(ActivityClassName, ...) \\\n    BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, ##__VA_ARGS__) \\\n    END_ACTIVITY_CLASS()\n\n#define DEFINE_TRACELOGGING_ACTIVITY(ActivityClassName) \\\n    BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_TRACELOGGING_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \\\n    BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    END_ACTIVITY_CLASS()\n\n#define DEFINE_CALLCONTEXT_ACTIVITY(ActivityClassName) \\\n    BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_CALLCONTEXT_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \\\n    BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    END_ACTIVITY_CLASS()\n\n#define DEFINE_TELEMETRY_ACTIVITY(ActivityClassName) \\\n    BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \\\n    BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    END_ACTIVITY_CLASS()\n#endif\n\n#define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY(ActivityClassName, PrivacyTag) \\\n    BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    END_ACTIVITY_CLASS()\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define DEFINE_MEASURES_ACTIVITY(ActivityClassName) \\\n    BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \\\n    BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    END_ACTIVITY_CLASS()\n#endif\n\n#define DEFINE_COMPLIANT_MEASURES_ACTIVITY(ActivityClassName, PrivacyTag) \\\n    BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_COMPLIANT_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    END_ACTIVITY_CLASS()\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n#define DEFINE_CRITICAL_DATA_ACTIVITY(ActivityClassName) \\\n    BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \\\n    BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \\\n    END_ACTIVITY_CLASS()\n#endif\n\n#define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY(ActivityClassName, PrivacyTag) \\\n    BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \\\n    END_ACTIVITY_CLASS()\n#define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \\\n    END_ACTIVITY_CLASS()\n\n// [Optional] Custom Start or Stop Events for Activities\n// Use these macros to define custom start or custom stop methods for an activity.  Any activity can\n// have multiple start or stop methods.  To add custom start or stop events, define a StartActivity instance\n// method or a Stop instance method within the BEGIN/END pair of a custom activity.  Within that function, use\n// TraceLoggingClassWriteStart or TraceLoggingClassWriteStop.\n\n// Params:  (EventId, ...)\n#define TraceLoggingClassWriteStart __WRITE_ACTIVITY_START\n#define TraceLoggingClassWriteStop __WRITE_ACTIVITY_STOP\n\n// [Optional] Custom Tagged Events for Activities\n// Use these macros to define a Custom Tagged Event for a Custom Activity.  Use the\n// TraceLoggingClassWriteTagged or TraceLoggingClassWriteTaggedTelemetry macros from within a custom event\n// to write the event.\n\n#define TraceLoggingClassWriteTagged(EventId, ...) __WI_TraceLoggingWriteTagged(*this, #EventId, ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteTaggedTelemetry(EventId, ...) \\\n    __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteTaggedMeasure(EventId, ...) \\\n    __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), ##__VA_ARGS__)\n\n#define TraceLoggingClassWriteTaggedCriticalData(EventId, ...) \\\n    __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), ##__VA_ARGS__)\n\n// [Optional] Simple Tagged Events for Activities\n// Use these methods to define very simple tagged events for a Custom Activity.\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_TAGGED_TELEMETRY_EVENT(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n\n#define DEFINE_TAGGED_TELEMETRY_EVENT_CV(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))\n\n#define DEFINE_TAGGED_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_TAGGED_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_TAGGED_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// [Optional] Simple Tagged Events for Activities\n// Use these methods to define very simple tagged measures events for a Custom Activity.\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_TAGGED_MEASURES_EVENT(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n\n#define DEFINE_TAGGED_MEASURES_EVENT_CV(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n#define DEFINE_TAGGED_MEASURES_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))\n\n#define DEFINE_TAGGED_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_TAGGED_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_TAGGED_MEASURES_EVENT_STRING(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// [Optional] Simple Tagged Events for Activities\n// Use these methods to define very simple tagged CRITICAL_DATA events for a Custom Activity.\n\n#ifndef DISABLE_NONCOMPLIANT_TELEMETRY\n\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM9( \\\n    EventId, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8, \\\n    VarType9, \\\n    varName9) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        VarType9, \\\n        varName9, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_CV(EventId) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8_CV( \\\n    EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))\n\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_UINT32(EventId, varName) \\\n    DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName)\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName)\n#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_STRING(EventId, varName) \\\n    DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName)\n\n#endif\n\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1( \\\n        EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2( \\\n        EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3( \\\n        EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7( \\\n    EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8( \\\n    EventId, \\\n    PrivacyTag, \\\n    VarType1, \\\n    varName1, \\\n    VarType2, \\\n    varName2, \\\n    VarType3, \\\n    varName3, \\\n    VarType4, \\\n    varName4, \\\n    VarType5, \\\n    varName5, \\\n    VarType6, \\\n    varName6, \\\n    VarType7, \\\n    varName7, \\\n    VarType8, \\\n    varName8) \\\n    DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8( \\\n        EventId, \\\n        VarType1, \\\n        varName1, \\\n        VarType2, \\\n        varName2, \\\n        VarType3, \\\n        varName3, \\\n        VarType4, \\\n        varName4, \\\n        VarType5, \\\n        varName5, \\\n        VarType6, \\\n        varName6, \\\n        VarType7, \\\n        varName7, \\\n        VarType8, \\\n        varName8, \\\n        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), \\\n        TelemetryPrivacyDataTag(PrivacyTag))\n\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)\n#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) \\\n    DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)\n\n// Thread Activities [deprecated]\n// These are desktop only and are not recommended by the fundamentals team.  These activities lag behind regular activities in\n// their ability to use CallContext or to be cross-thread portable, so their usage should be limited.\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \\\n    class ActivityClassName final : public _TlgActivityBase<ActivityClassName, keyword, level> \\\n    { \\\n        static const UINT64 PrivacyTag = 0; \\\n        friend class _TlgActivityBase<ActivityClassName, keyword, level>; \\\n        void OnStarted() \\\n        { \\\n            PushThreadActivityId(); \\\n        } \\\n        void OnStopped() \\\n        { \\\n            PopThreadActivityId(); \\\n        } \\\n\\\n    public: \\\n        ActivityClassName() : m_result(S_OK) \\\n        { \\\n        } \\\n\\\n    private: \\\n        template <typename... TArgs> \\\n        ActivityClassName(_In_ void**, TArgs&&... args) : m_result(S_OK) \\\n        { \\\n            StartActivity(wistd::forward<TArgs>(args)...); \\\n        } \\\n\\\n    protected: \\\n        void EnsureWatchingCurrentThread() \\\n        { \\\n        } \\\n        void IgnoreCurrentThread() \\\n        { \\\n        } \\\n        wil::FailureInfo const* GetFailureInfo() \\\n        { \\\n            return (FAILED(m_result) && (m_cache.GetFailure() != nullptr) && (m_result == m_cache.GetFailure()->hr)) \\\n                       ? m_cache.GetFailure() \\\n                       : nullptr; \\\n        } \\\n        HRESULT GetResult() \\\n        { \\\n            return m_result; \\\n        } \\\n\\\n    public: \\\n        ~ActivityClassName() \\\n        { \\\n            Stop(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); \\\n        } \\\n        ActivityClassName(ActivityClassName&&) = default; \\\n        WI_NODISCARD TraceLoggingHProvider Provider() const \\\n        { \\\n            return TraceLoggingType::Provider(); \\\n        } \\\n        void Stop(HRESULT hr = S_OK) \\\n        { \\\n            if (IsStarted()) \\\n            { \\\n                m_result = hr; \\\n                TRACELOGGING_WRITE_ACTIVITY_STOP(ActivityClassName); \\\n            } \\\n        } \\\n        template <typename... TArgs> \\\n        void StopWithResult(HRESULT hr, TArgs&&... args) \\\n        { \\\n            m_result = hr; \\\n            Stop(wistd::forward<TArgs>(args)...); \\\n        } \\\n        template <typename... TArgs> \\\n        static ActivityClassName Start(TArgs&&... args) \\\n        { \\\n            return ActivityClassName(static_cast<void**>(__nullptr), wistd::forward<TArgs>(args)...); \\\n        } \\\n        void StartActivity() \\\n        { \\\n            TRACELOGGING_WRITE_ACTIVITY_START(ActivityClassName); \\\n        }\n\n#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, WINEVENT_LEVEL_VERBOSE)\n\n#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, level)\n\n#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, WINEVENT_LEVEL_VERBOSE)\n\n#define END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() \\\nprivate: \\\n    HRESULT m_result; \\\n    wil::ThreadFailureCache m_cache; \\\n    } \\\n    ;\n\n#define BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, MICROSOFT_KEYWORD_TELEMETRY)\n\n#define END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS() END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()\n\n#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \\\n    END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()\n\n#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD(ActivityClassName, keyword) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \\\n    END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()\n\n#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_LEVEL(ActivityClassName, level) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \\\n    END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()\n\n#define DEFINE_TRACELOGGING_THREAD_ACTIVITY(ActivityClassName) \\\n    BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \\\n    END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()\n\n#define DEFINE_TELEMETRY_THREAD_ACTIVITY(ActivityClassName) \\\n    BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \\\n    END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS()\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n\n// [deprecated]\n// DO NOT USE these concepts\n// These should be removed post RI/FI cycle...\n\n#define DEFINE_TRACELOGGING_METHOD DEFINE_EVENT_METHOD\n#define BEGIN_DEFINE_TELEMETRY_ACTIVITY_CLASS BEGIN_TELEMETRY_ACTIVITY_CLASS\n#define END_DEFINE_TELEMETRY_ACTIVITY_CLASS END_ACTIVITY_CLASS\n#define BEGIN_DEFINE_TRACELOGGING_ACTIVITY_CLASS BEGIN_TRACELOGGING_ACTIVITY_CLASS\n#define END_DEFINE_TRACELOGGING_ACTIVITY_CLASS END_ACTIVITY_CLASS\n#define TELEMETRY_WRITE_ACTIVITY_START TraceLoggingClassWriteStart\n#define TRACELOGGING_WRITE_ACTIVITY_START TraceLoggingClassWriteStart\n#define TELEMETRY_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop\n#define TRACELOGGING_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop\n#define WRITE_TRACELOGGING_EVENT TraceLoggingClassWrite\n#define WRITE_TELEMETRY_EVENT TraceLoggingClassWriteTelemetry\n#define TRACELOGGING_WRITE_TAGGED_EVENT TraceLoggingClassWriteTagged\n#define TELEMETRY_WRITE_TAGGED_EVENT TraceLoggingClassWriteTaggedTelemetry\n\n/// @cond\n// [deprecated]\n// DO NOT USE these concepts\n// These should be removed post RI/FI cycle...\n#define __DEFINE_EVENT DEFINE_TRACELOGGING_EVENT\n#define __DEFINE_EVENT_PARAM1 DEFINE_TRACELOGGING_EVENT_PARAM1\n#define __DEFINE_EVENT_PARAM2 DEFINE_TRACELOGGING_EVENT_PARAM2\n#define __DEFINE_EVENT_PARAM3 DEFINE_TRACELOGGING_EVENT_PARAM3\n#define __DEFINE_EVENT_PARAM4 DEFINE_TRACELOGGING_EVENT_PARAM4\n#define __DEFINE_EVENT_PARAM5 DEFINE_TRACELOGGING_EVENT_PARAM5\n#define __DEFINE_EVENT_PARAM6 DEFINE_TRACELOGGING_EVENT_PARAM6\n#define __DEFINE_EVENT_PARAM7 DEFINE_TRACELOGGING_EVENT_PARAM7\n#define __DEFINE_EVENT_UINT32 DEFINE_TRACELOGGING_EVENT_UINT32\n#define __DEFINE_EVENT_BOOL DEFINE_TRACELOGGING_EVENT_BOOL\n#define __DEFINE_EVENT_STRING DEFINE_TRACELOGGING_EVENT_STRING\n\n// [deprecated]\n// DO NOT USE these concepts\n// These should be removed post RI/FI cycle...\n#define __DEFINE_TAGGED_EVENT DEFINE_TAGGED_TRACELOGGING_EVENT\n#define __DEFINE_TAGGED_EVENT_PARAM1 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1\n#define __DEFINE_TAGGED_EVENT_PARAM2 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2\n#define __DEFINE_TAGGED_EVENT_PARAM3 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3\n#define __DEFINE_TAGGED_EVENT_PARAM4 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4\n#define __DEFINE_TAGGED_EVENT_PARAM5 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5\n#define __DEFINE_TAGGED_EVENT_PARAM6 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6\n#define __DEFINE_TAGGED_EVENT_PARAM7 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7\n#define __DEFINE_TAGGED_EVENT_UINT32 DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32\n#define __DEFINE_TAGGED_EVENT_BOOL DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL\n#define __DEFINE_TAGGED_EVENT_STRING DEFINE_TAGGED_TRACELOGGING_EVENT_STRING\n/// @endcond\n\ntemplate <typename T>\nclass ActivityErrorTracer\n{\npublic:\n    ActivityErrorTracer(T const&)\n    {\n    }\n};\n\nusing TelemetryBase = wil::TraceLoggingProvider;\n\n#define TRACELOGGING_WRITE_EVENT(TraceLoggingClassName, EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, ##__VA_ARGS__)\n\n#define TELEMETRY_WRITE_EVENT(EventId, ...) \\\n    TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), ##__VA_ARGS__)\n\n#define DEFINE_TAGGED_EVENT_METHOD(MethodName) \\\npublic: \\\n    void MethodName\n\n#define DEFINE_ACTIVITY_START(...) void StartActivity(__VA_ARGS__)\n\n#define DEFINE_ACTIVITY_STOP(...) void Stop(__VA_ARGS__)\n\n#define DECLARE_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \\\n    class TraceLoggingClassName : public wil::TraceLoggingProvider \\\n    { \\\n        IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId); \\\n    };\n\n#define IMPLEMENT_TELEMETRY_CLASS(TelemetryClassName, TraceLoggingClassName) \\\n    __IMPLEMENT_TRACELOGGING_CLASS_BASE(TelemetryClassName, TraceLoggingClassName) \\\nprotected: \\\n    void Create() \\\n    { \\\n        AttachProvider(TraceLoggingClassName::Provider()); \\\n        __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(TelemetryClassName, TraceLoggingClassName); \\\n    } \\\n\\\npublic:\n\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n#ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER\n#pragma detect_mismatch(\"ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch\", \"1\")\n#else\n#pragma detect_mismatch(\"ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch\", \"0\")\n#endif\n\n    class ApiTelemetryLogger : public wil::TraceLoggingProvider\n    {\n        // {fb7fcbc6-7156-5a5b-eabd-0be47b14f453}\n        IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(\n            ApiTelemetryLogger,\n            \"Microsoft.Windows.ApiTelemetry\",\n            (0xfb7fcbc6, 0x7156, 0x5a5b, 0xea, 0xbd, 0x0b, 0xe4, 0x7b, 0x14, 0xf4, 0x53));\n\n    public:\n        // Used to store of list of APIs (with namespace, class, custom and call count data per API).\n        // This is public so that it can be unit tested.\n        class ApiDataList\n        {\n        public:\n            struct ApiData\n            {\n                PCWSTR className = nullptr;\n                PCWSTR apiName = nullptr;\n                PCSTR specialization = nullptr;\n                volatile long* counterReference = nullptr;\n                wistd::unique_ptr<ApiData> next;\n\n                ApiData(PCWSTR className_, PCWSTR apiName_, PCSTR specialization_, volatile long* counterReference_) :\n                    className(className_), apiName(apiName_), specialization(specialization_), counterReference(counterReference_)\n                {\n                }\n            };\n\n            // Inserts a new Api call counter into the list, keeping the list sorted by className\n            void Insert(PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference)\n            {\n                wistd::unique_ptr<ApiData> newApiData(new (std::nothrow) ApiData(className, apiName, specialization, counterReference));\n                if (newApiData)\n                {\n                    auto lock = m_lock.lock_exclusive();\n\n                    // Insert the new ApiData, keeping the list sorted by className.\n                    wistd::unique_ptr<ApiData>* currentNode = &m_root;\n                    while (*currentNode)\n                    {\n                        wistd::unique_ptr<ApiData>& node = *currentNode;\n                        if (wcscmp(className, node->className) <= 0)\n                        {\n                            break;\n                        }\n                        currentNode = &(node->next);\n                    }\n                    newApiData->next.reset(currentNode->release());\n                    currentNode->reset(newApiData.release());\n                }\n            }\n\n            // For each distinct namespace, calls the provided flushCallback function.\n            // After returning, it will have deleted all ApiData elements, and zeroed the *counterReference stored in each ApiData.\n            void Flush(wistd::function<void(PCWSTR, PCWSTR, PCSTR, UINT32*, UINT16)> flushCallback)\n            {\n                wistd::unique_ptr<ApiData> root;\n                if (m_root)\n                {\n                    auto lock = m_lock.lock_exclusive();\n                    root.swap(m_root);\n                }\n\n                while (root)\n                {\n                    // First find the number of characters we need to allocate for each string, and the number of items in the counter array to allocate\n                    size_t totalApiListLength = 1;         // Init to 1 to account for null terminator\n                    size_t totalSpecializationsLength = 1; // Init to 1 to account for null terminator\n                    UINT16 numCounts = 0;\n\n                    ProcessSingleNamespace(&root, [&](wistd::unique_ptr<ApiData>& node) {\n                        // Get the length needed for the class string\n                        const wchar_t* strAfterNamespace = GetClassStringPointer(node->className);\n                        size_t classStrLen = wcslen(strAfterNamespace ? strAfterNamespace : node->className);\n\n                        totalApiListLength += (classStrLen + wcslen(node->apiName) + 1); // We add 1 to account for the comma delimiter\n                        if (node->specialization)\n                        {\n                            totalSpecializationsLength += strlen(node->specialization) + 1; // We add 1 to account for the comma delimiter\n                        }\n                        else\n                        {\n                            totalSpecializationsLength += 2; // '-' plus comma delimiter\n                        }\n                        numCounts++;\n                    });\n\n                    // Fill arrays with the API data, and then pass it to the callback function\n                    wistd::unique_ptr<wchar_t[]> apiList(new (std::nothrow) wchar_t[totalApiListLength]);\n                    wistd::unique_ptr<char[]> specializationList(new (std::nothrow) char[totalSpecializationsLength]);\n                    wistd::unique_ptr<UINT32[]> countArray(new (std::nothrow) UINT32[numCounts]);\n                    size_t nameSpaceLength = GetNameSpaceLength(root->className) + 1;\n                    wistd::unique_ptr<wchar_t[]> nameSpace(new (std::nothrow) wchar_t[nameSpaceLength]);\n                    if (!apiList || !specializationList || !countArray || !nameSpace)\n                    {\n                        return;\n                    }\n\n                    ZeroMemory(apiList.get(), totalApiListLength * sizeof(wchar_t));\n                    ZeroMemory(specializationList.get(), totalSpecializationsLength * sizeof(char));\n                    ZeroMemory(countArray.get(), numCounts * sizeof(UINT32));\n                    ZeroMemory(nameSpace.get(), nameSpaceLength * sizeof(wchar_t));\n\n                    StringCchCopyNW(nameSpace.get(), STRSAFE_MAX_CCH, root->className, nameSpaceLength - 1);\n\n                    int countArrayIndex = 0;\n\n                    wistd::unique_ptr<ApiData>* lastNamespaceNode = ProcessSingleNamespace(&root, [&](wistd::unique_ptr<ApiData>& node) {\n                        countArray[countArrayIndex] = static_cast<UINT32>(::InterlockedExchangeNoFence(node->counterReference, 0));\n\n                        // Prepend the portion of the apiName group string that's after the '.'. So for example, if the\n                        // className is \"Windows.System.Launcher\", then we prepend \"Launcher.\" to the apiName string.\n                        const wchar_t* strAfterNamespace = GetClassStringPointer(node->className);\n                        if (strAfterNamespace)\n                        {\n                            FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, strAfterNamespace + 1));\n                            FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L\".\"));\n                        }\n\n                        FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, node->apiName));\n                        if (node->specialization)\n                        {\n                            FAIL_FAST_IF(\n                                strncat_s(specializationList.get(), totalSpecializationsLength, node->specialization, strlen(node->specialization)) !=\n                                0);\n                        }\n                        else\n                        {\n                            FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, \"-\", 1) != 0);\n                        }\n\n                        if (countArrayIndex != (numCounts - 1))\n                        {\n                            FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L\",\"));\n                            FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, \",\", 1) != 0);\n                        }\n\n                        countArrayIndex++;\n                    });\n\n                    // Call the callback function with the data we've collected for this namespace\n                    flushCallback(nameSpace.get(), apiList.get(), specializationList.get(), countArray.get(), numCounts);\n\n                    if (*lastNamespaceNode)\n                    {\n                        // Delete everything from the current root to the lastNamespaceNode\n                        // (inclusive), considering the possibility that they are the same. Continue\n                        // processing from the node following lastNamespaceNode, if any. root will\n                        // be made to point to that.\n                        auto newRoot = wistd::move((*lastNamespaceNode)->next);\n                        const auto toDelete = wistd::move(root);\n                        root = wistd::move(newRoot);\n                    }\n                    else\n                    {\n                        root.reset();\n                    }\n                }\n            }\n\n        private:\n            static wistd::unique_ptr<ApiData>* ProcessSingleNamespace(\n                wistd::unique_ptr<ApiData>* root, wistd::function<void(wistd::unique_ptr<ApiData>&)> workerCallback)\n            {\n                wistd::unique_ptr<ApiData>* currentNode = root;\n                while (*currentNode)\n                {\n                    wistd::unique_ptr<ApiData>& node = *currentNode;\n\n                    workerCallback(node);\n\n                    // Check if our next node would be a new namespace; if so, then break out\n                    if (node->next && !IsSameNameSpace(node->className, node->next->className))\n                    {\n                        break;\n                    }\n\n                    currentNode = &(node->next);\n                }\n\n                return currentNode;\n            }\n\n            static bool IsSameNameSpace(PCWSTR namespaceClass1, PCWSTR namespaceClass2)\n            {\n                return (wcsncmp(namespaceClass1, namespaceClass2, GetNameSpaceLength(namespaceClass2) + 1) == 0);\n            }\n\n            static size_t GetNameSpaceLength(PCWSTR nameSpaceClass)\n            {\n                const wchar_t* strAfterNamespace = GetClassStringPointer(nameSpaceClass);\n                return (strAfterNamespace ? (strAfterNamespace - nameSpaceClass) : wcslen(nameSpaceClass));\n            }\n\n            static const wchar_t* GetClassStringPointer(PCWSTR nameSpaceClass)\n            {\n                // Note: Usage of wcsrchr can cause build errors in some components, so we implement a way of getting the pointer\n                // to the 'class' portion of the string ourselves.\n                int retIndex = 0;\n                while (nameSpaceClass[retIndex] != '\\0')\n                {\n                    retIndex++;\n                }\n                while (retIndex > 0 && nameSpaceClass[retIndex] != '.')\n                {\n                    retIndex--;\n                }\n                return (retIndex != 0 ? &(nameSpaceClass[retIndex]) : nullptr);\n            }\n\n            wistd::unique_ptr<ApiData> m_root;\n            wil::srwlock m_lock;\n        };\n\n    public:\n        // Initializes an entry that holds the className.apiName, along with a counter for that className.apiName.\n        // The counterReference passed to this should later be passed to LogApiInfo.\n        //\n        // A separate entry will be created for each apiName that has a distinct specialization value.\n        //\n        // This function only needs to be called once for each API, although it doesn't hurt if it gets called more than once.\n        //\n        // The apiName, className, and specialization parameters should be compile time constants. specialization can be null.\n        DEFINE_EVENT_METHOD(InitApiData)\n        (PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference)\n        {\n            // TODO: Validate that apiName and className are a compile-time constants; validate that specialization is\n            // either compile-time constant or nullptr; validate that counterReference points to static variable.\n            // Can do this by making sure address is <= (GetModuleHandle() + DLL size).\n            m_apiDataList.Insert(className, apiName, specialization, counterReference);\n        }\n\n        // Fires a telemetry event that contains the method call apiName that has been logged by the component,\n        // since the last FireEvent() call, or since the component was loaded.\n        DEFINE_EVENT_METHOD(FireEvent)()\n        {\n            m_apiDataList.Flush([](PCWSTR nameSpace, PCWSTR apiList, PCSTR specializationList, UINT32* countArray, UINT16 numCounters) {\n                if (::wil::details::IsDebuggerPresent())\n                {\n                    TraceLoggingWrite(\n                        Provider(),\n                        \"ApiCallCountsWithDebuggerPresent\",\n                        TraceLoggingValue(nameSpace, \"Namespace\"),\n                        TraceLoggingValue(apiList, \"ApiDataList\"),\n                        TraceLoggingValue(specializationList, \"CustomList\"),\n                        TraceLoggingUInt32Array(countArray, numCounters, \"HitCounts\"),\n                        TraceLoggingBoolean(TRUE, \"UTCReplace_AppSessionGuid\"),\n                        TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA));\n                }\n                else\n                {\n                    TraceLoggingWrite(\n                        Provider(),\n                        \"ApiCallCounts\",\n                        TraceLoggingValue(nameSpace, \"Namespace\"),\n                        TraceLoggingValue(apiList, \"ApiDataList\"),\n                        TraceLoggingValue(specializationList, \"CustomList\"),\n                        TraceLoggingUInt32Array(countArray, numCounters, \"HitCounts\"),\n                        TraceLoggingBoolean(TRUE, \"UTCReplace_AppSessionGuid\"),\n                        TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES));\n                }\n\n                __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters);\n            });\n\n            if (m_fireEventDelay < c_fireEventDelayLimit)\n            {\n                // Double the exponential backoff timer, until it reaches the maximum\n                m_fireEventDelay *= 2;\n                if (m_fireEventDelay > c_fireEventDelayLimit)\n                {\n                    m_fireEventDelay = c_fireEventDelayLimit;\n                }\n            }\n\n            ScheduleFireEventCallback();\n        }\n\n        // Used to declare that the component will handle calling FireEvent() in its own suspend handler.\n        // This optimizes the frequency at which the event will be fired.\n        DEFINE_EVENT_METHOD(UsingOwnSuspendHandler)()\n        {\n            m_fireEventDelay = c_fireEventDelayLimit;\n            ScheduleFireEventCallback();\n        }\n\n    private:\n        void Initialize() WI_NOEXCEPT override\n        {\n#ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER\n            m_fireEventDelay = c_fireEventDelayLimit;\n\n            PPSM_APPSTATE_REGISTRATION psmReg;\n            BOOLEAN quiesced;\n            PsmRegisterAppStateChangeNotification(\n                [](BOOLEAN quiesced, PVOID, HANDLE) {\n                    if (quiesced)\n                    {\n                        FireEvent();\n                    }\n                },\n                StateChangeCategoryApplication,\n                0,\n                nullptr,\n                &quiesced,\n                &psmReg);\n#else\n            m_fireEventDelay = __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS;\n#endif\n            m_fireEventThreadPoolTimer.reset(::CreateThreadpoolTimer(&FireEventCallback, nullptr, nullptr));\n            ScheduleFireEventCallback();\n        }\n\n        static void __stdcall FireEventCallback(PTP_CALLBACK_INSTANCE, PVOID, PTP_TIMER)\n        {\n            FireEvent();\n        }\n\n        ~ApiTelemetryLogger() WI_NOEXCEPT override\n        {\n            FireEvent();\n\n            // release handle to thread pool timer instead of its destructor being call, if process is being terminated and dll is\n            // not being unloaded dynamically destruction of threadpool timer is considered invalid during process termination\n            if (ProcessShutdownInProgress())\n            {\n                m_fireEventThreadPoolTimer.release();\n            }\n        }\n\n        void ScheduleFireEventCallback()\n        {\n            // do not schedule thread pool timer callback, if process is being terminated and dll is not being unloaded dynamically\n            if (m_fireEventThreadPoolTimer && !ProcessShutdownInProgress())\n            {\n                // Note this will override any pending scheduled callback\n                FILETIME dueTime{};\n                *reinterpret_cast<PLONGLONG>(&dueTime) = -static_cast<LONGLONG>(m_fireEventDelay) * 10000;\n                SetThreadpoolTimer(m_fireEventThreadPoolTimer.get(), &dueTime, 0, 0);\n            }\n        }\n\n        ApiDataList m_apiDataList;\n        wil::unique_threadpool_timer m_fireEventThreadPoolTimer;\n\n        // The timer used to determine when to fire the next telemetry event (when it's fired based on a timer).\n        UINT m_fireEventDelay{};\n        DWORD const c_fireEventDelayLimit = 20 * 60 * 1000; // 20 minutes\n    };\n} // namespace details\n/// @endcond\n} // namespace wil\n\n// Insert WI_LOG_API_USE near the top of a WinRT method to log that a method was called.\n// The parameter should be the method name, for example:\n//  - WI_LOG_API_USE(L\"LaunchUriAsync\");\n//\n// To log that the WinRT method reached a certain line of code, pass an override string:\n//  - WI_LOG_API_USE(L\"LaunchUriAsync\", \"PointA\");\n//\n// If the class name can't be obtained at runtime, or if instrumenting a non-WinRT API, use the below macro,\n// and pass the fully qualified class name (in the case of WinRT), or a string identifying the group of the non-WinRT API:\n//  - WI_LOG_CLASS_API_USE(RuntimeClass_Windows_System_Launcher, L\"LaunchUriAsync\");\n//\n// Note: If the component can have a suspend handler, the following line should be added before including TraceLogging.h:\n//  - #define WIL_API_TELEMETRY_SUSPEND_HANDLER\n// This will optimize the component's ability to upload telemetry, as it will upload on suspend. It will also disable\n// frequent telemetry upload early in process execution.\n//\n// Alternatively, a component can call wil::details:ApiTelemetryLogger::FireEvent() from it's own suspend handler.\n// If this is done, then in DLLMain it should also call wil::details::ApiTelemetryLogger::UsingOwnSuspendHandler().\n//\n// Note: In your DLLMain method, please also add following code snippet\n//\n//      wil::details::g_processShutdownInProgress = (lpReserved == nullptr);\n//\n// Adding this code snippet ensures that during process termination, thread pool timer\n// destructor or SetThreadPoolTimer methods are not called, because they are invalid to call\n// when dll is not getting dynamically unloaded. Skipping this code block will result in a continuable\n// exception being thrown if process is getting terminated and dll in which ApiTelemetryLogger is not getting dynamically\n// unloaded. For more details about lpReserved parameter, please refer to MSDN.\n\n/// @cond\n#define __WI_LOG_CLASS_API_USE3(className, apiName, specialization) \\\n    do \\\n    { \\\n        static volatile long __wil_apiCallCounter = 0; \\\n        if (1 == ::InterlockedIncrementNoFence(&__wil_apiCallCounter)) \\\n        { \\\n            ::wil::details::ApiTelemetryLogger::InitApiData(className, apiName, specialization, &__wil_apiCallCounter); \\\n        } \\\n    } while (0, 0)\n#define __WI_LOG_CLASS_API_USE2(className, apiName) __WI_LOG_CLASS_API_USE3(className, apiName, nullptr)\n#define __WI_LOG_API_USE2(apiName, specialization) __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, specialization)\n#define __WI_LOG_API_USE1(apiName) __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, nullptr)\n/// @endcond\n\n#define WI_LOG_CLASS_API_USE(...) WI_MACRO_DISPATCH(__WI_LOG_CLASS_API_USE, ##__VA_ARGS__)\n\n#define WI_LOG_API_USE(...) WI_MACRO_DISPATCH(__WI_LOG_API_USE, ##__VA_ARGS__)\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#pragma warning(pop)\n#endif // __WIL_TRACELOGGING_H_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/_version.txt",
    "content": "https://github.com/microsoft/wil/tree/v1.0.250325.1\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/com.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Smart pointers and other thin usability pattern wrappers over COM patterns.\n#ifndef __WIL_COM_INCLUDED\n#define __WIL_COM_INCLUDED\n\n#include <WeakReference.h>\n#include <combaseapi.h>\n#include \"result.h\"\n#include \"win32_helpers.h\"\n#include \"resource.h\" // last to ensure _COMBASEAPI_H_ protected definitions are available\n\n#if WIL_USE_STL && WI_HAS_INCLUDE(<tuple>, 1) // Tuple is C++11... assume available\n#include <tuple>\n#endif\n#if WIL_USE_STL && WI_HAS_INCLUDE(<type_traits>, 1) // Type traits is old... assume available\n#include <type_traits>\n#endif\n\n// Forward declaration within WIL (see https://msdn.microsoft.com/en-us/library/br244983.aspx)\n/// @cond\nnamespace Microsoft\n{\nnamespace WRL\n{\n    template <typename T>\n    class ComPtr;\n}\n} // namespace Microsoft\n/// @endcond\n\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    // We can't directly use wistd::is_convertible as it returns TRUE for an ambiguous conversion.\n    // Adding is_abstract to the mix, enables us to allow conversion for interfaces, but deny it for\n    // classes (where the multiple inheritance causes ambiguity).\n    // NOTE:    I've reached out to vcsig on this topic and it turns out that __is_convertible_to should NEVER\n    //          return true for ambiguous conversions.  This was a bug in our compiler that has since been fixed.\n    //          Eventually, once that fix propagates we can move to a more efficient __is_convertible_to without\n    //          the added complexity.\n    template <class TFrom, class TTo>\n    struct is_com_convertible\n        : wistd::bool_constant<__is_convertible_to(TFrom, TTo) && (__is_abstract(TFrom) || wistd::is_same<TFrom, TTo>::value)>\n    {\n    };\n\n    using tag_com_query = wistd::integral_constant<char, 0>;\n    using tag_try_com_query = wistd::integral_constant<char, 1>;\n    using tag_com_copy = wistd::integral_constant<char, 2>;\n    using tag_try_com_copy = wistd::integral_constant<char, 3>;\n\n    class default_query_policy\n    {\n    public:\n        template <typename T>\n        inline static HRESULT query(_In_ T* ptr, REFIID riid, _COM_Outptr_ void** result)\n        {\n            return ptr->QueryInterface(riid, result);\n        }\n\n        template <typename T, typename TResult>\n        inline static HRESULT query(_In_ T* ptr, _COM_Outptr_ TResult** result)\n        {\n            return query_dispatch(ptr, typename details::is_com_convertible<T*, TResult*>::type(), result);\n        }\n\n    private:\n        template <typename T, typename TResult>\n        inline static HRESULT query_dispatch(_In_ T* ptr, wistd::true_type, _COM_Outptr_ TResult** result) // convertible\n        {\n            *result = ptr;\n            (*result)->AddRef();\n            return S_OK;\n        }\n\n        template <typename T, typename TResult>\n        inline static HRESULT query_dispatch(_In_ T* ptr, wistd::false_type, _COM_Outptr_ TResult** result) // not convertible\n        {\n            auto hr = ptr->QueryInterface(IID_PPV_ARGS(result));\n            __analysis_assume(SUCCEEDED(hr) || (*result == nullptr));\n            return hr;\n        }\n    };\n\n    template <typename T>\n    struct query_policy_helper\n    {\n        using type = default_query_policy;\n    };\n\n    class weak_query_policy\n    {\n    public:\n        inline static HRESULT query(_In_ IWeakReference* ptr, REFIID riid, _COM_Outptr_ void** result)\n        {\n            WI_ASSERT_MSG(riid != __uuidof(IWeakReference), \"Cannot resolve a weak reference to IWeakReference\");\n            *result = nullptr;\n\n            IInspectable* temp;\n            HRESULT hr = ptr->Resolve(__uuidof(IInspectable), &temp);\n            if (SUCCEEDED(hr))\n            {\n                if (temp == nullptr)\n                {\n                    return E_NOT_SET;\n                }\n                hr = temp->QueryInterface(riid, result);\n                __analysis_assume(SUCCEEDED(hr) || (*result == nullptr));\n                temp->Release();\n            }\n\n            return hr;\n        }\n\n        template <typename TResult>\n        inline static HRESULT query(_In_ IWeakReference* ptr, _COM_Outptr_ TResult** result)\n        {\n            static_assert(!wistd::is_same<IWeakReference, TResult>::value, \"Cannot resolve a weak reference to IWeakReference\");\n            return query_dispatch(ptr, wistd::is_base_of<IInspectable, TResult>(), result);\n        }\n\n    private:\n        template <typename TResult>\n        static HRESULT query_dispatch(_In_ IWeakReference* ptr, wistd::true_type, _COM_Outptr_ TResult** result)\n        {\n            auto hr = ptr->Resolve(__uuidof(TResult), reinterpret_cast<IInspectable**>(result));\n            if (SUCCEEDED(hr) && (*result == nullptr))\n            {\n                hr = E_NOT_SET;\n            }\n            __analysis_assume(SUCCEEDED(hr) || (*result == nullptr));\n            return hr;\n        }\n\n        template <typename TResult>\n        static HRESULT query_dispatch(_In_ IWeakReference* ptr, wistd::false_type, _COM_Outptr_ TResult** result)\n        {\n            return query(ptr, IID_PPV_ARGS(result));\n        }\n    };\n\n    template <>\n    struct query_policy_helper<IWeakReference>\n    {\n        using type = weak_query_policy;\n    };\n\n#if (NTDDI_VERSION >= NTDDI_WINBLUE)\n    class agile_query_policy\n    {\n    public:\n        inline static HRESULT query(_In_ IAgileReference* ptr, REFIID riid, _COM_Outptr_ void** result)\n        {\n            WI_ASSERT_MSG(riid != __uuidof(IAgileReference), \"Cannot resolve a agile reference to IAgileReference\");\n            auto hr = ptr->Resolve(riid, result);\n            __analysis_assume(SUCCEEDED(hr) || (*result == nullptr)); // IAgileReference::Resolve not annotated correctly\n            return hr;\n        }\n\n        template <typename TResult>\n        static HRESULT query(_In_ IAgileReference* ptr, _COM_Outptr_ TResult** result)\n        {\n            static_assert(!wistd::is_same<IAgileReference, TResult>::value, \"Cannot resolve a agile reference to IAgileReference\");\n            return query(ptr, __uuidof(TResult), reinterpret_cast<void**>(result));\n        }\n    };\n\n    template <>\n    struct query_policy_helper<IAgileReference>\n    {\n        using type = agile_query_policy;\n    };\n#endif\n\n    template <typename T>\n    using query_policy_t = typename query_policy_helper<typename wistd::remove_pointer<T>::type>::type;\n\n} // namespace details\n/// @endcond\n\n//! Represents the base template type that implements com_ptr, com_weak_ref, and com_agile_ref.\n//! See @ref page_comptr for more background.  See @ref page_query for more information on querying with WIL.\n//! @tparam T               Represents the type being held by the com_ptr_t.\n//!                         For com_ptr, this will always be the interface being represented.  For com_weak_ref, this will always\n//!                         be IWeakReference.  For com_agile_ref, this will always be IAgileReference.\n//! @tparam err_policy      Represents the error policy for the class (error codes, exceptions, or fail fast; see @ref page_errors)\ntemplate <typename T, typename err_policy = err_exception_policy>\nclass com_ptr_t\n{\nprivate:\n    using element_type_reference = typename wistd::add_lvalue_reference<T>::type;\n    using query_policy = details::query_policy_t<T>;\n\npublic:\n    //! The function return result (HRESULT or void) for the given err_policy (see @ref page_errors).\n    using result = typename err_policy::result;\n    //! The template type `T` being held by the com_ptr_t.\n    using element_type = T;\n    //! A pointer to the template type `T` being held by the com_ptr_t (what `get()` returns).\n    using pointer = T*;\n\n    //! @name Constructors\n    //! @{\n\n    //! Default constructor (holds nullptr).\n    com_ptr_t() WI_NOEXCEPT : m_ptr(nullptr)\n    {\n    }\n\n    //! Implicit construction from nullptr_t (holds nullptr).\n    com_ptr_t(wistd::nullptr_t) WI_NOEXCEPT : com_ptr_t()\n    {\n    }\n\n    //! Implicit construction from a compatible raw interface pointer (AddRef's the parameter).\n    com_ptr_t(pointer ptr) WI_NOEXCEPT : m_ptr(ptr)\n    {\n        if (m_ptr)\n        {\n            m_ptr->AddRef();\n        }\n    }\n\n    //! Copy-construction from a like `com_ptr_t` (copies and AddRef's the parameter).\n    com_ptr_t(const com_ptr_t& other) WI_NOEXCEPT : com_ptr_t(other.get())\n    {\n    }\n\n    //! Copy-construction from a convertible `com_ptr_t` (copies and AddRef's the parameter).\n    template <class U, typename err, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t(const com_ptr_t<U, err>& other) WI_NOEXCEPT : com_ptr_t(static_cast<pointer>(other.get()))\n    {\n    }\n\n    //! Move construction from a like `com_ptr_t` (avoids AddRef/Release by moving from the parameter).\n    com_ptr_t(com_ptr_t&& other) WI_NOEXCEPT : m_ptr(other.detach())\n    {\n    }\n\n    //! Move construction from a compatible `com_ptr_t` (avoids AddRef/Release by moving from the parameter).\n    template <class U, typename err, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t(com_ptr_t<U, err>&& other) WI_NOEXCEPT : m_ptr(other.detach())\n    {\n    }\n    //! @}\n\n    //! Destructor (releases the pointer).\n    ~com_ptr_t() WI_NOEXCEPT\n    {\n        if (m_ptr)\n        {\n            m_ptr->Release();\n        }\n    }\n\n    //! @name Assignment operators\n    //! @{\n\n    //! Assign to nullptr (releases the current pointer, holds nullptr).\n    com_ptr_t& operator=(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        reset();\n        return *this;\n    }\n\n    //! Assign a compatible raw interface pointer (releases current pointer, copies and AddRef's the parameter).\n    com_ptr_t& operator=(pointer other) WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = other;\n        if (m_ptr)\n        {\n            m_ptr->AddRef();\n        }\n        if (ptr)\n        {\n            ptr->Release();\n        }\n        return *this;\n    }\n\n    //! Assign a like `com_ptr_t` (releases current pointer, copies and AddRef's the parameter).\n    com_ptr_t& operator=(const com_ptr_t& other) WI_NOEXCEPT\n    {\n        return operator=(other.get());\n    }\n\n    //! Assign a convertible `com_ptr_t` (releases current pointer, copies and AddRef's the parameter).\n    template <class U, typename err, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t& operator=(const com_ptr_t<U, err>& other) WI_NOEXCEPT\n    {\n        return operator=(static_cast<pointer>(other.get()));\n    }\n\n    //! Move assign from a like `com_ptr_t` (releases current pointer, avoids AddRef/Release by moving the parameter).\n    com_ptr_t& operator=(com_ptr_t&& other) WI_NOEXCEPT\n    {\n        attach(other.detach());\n        return *this;\n    }\n\n    //! Move assignment from a compatible `com_ptr_t` (releases current pointer, avoids AddRef/Release by moving from the\n    //! parameter).\n    template <class U, typename err, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t& operator=(com_ptr_t<U, err>&& other) WI_NOEXCEPT\n    {\n        attach(other.detach());\n        return *this;\n    }\n    //! @}\n\n    //! @name Modifiers\n    //! @{\n\n    //! Swap pointers with an another named com_ptr_t object.\n    template <typename err>\n    void swap(com_ptr_t<T, err>& other) WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = other.m_ptr;\n        other.m_ptr = ptr;\n    }\n\n    //! Swap pointers with a rvalue reference to another com_ptr_t object.\n    template <typename err>\n    void swap(com_ptr_t<T, err>&& other) WI_NOEXCEPT\n    {\n        swap(other);\n    }\n\n    //! Releases the pointer and sets it to nullptr.\n    void reset() WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = nullptr;\n        if (ptr)\n        {\n            ptr->Release();\n        }\n    }\n\n    //! Releases the pointer and sets it to nullptr.\n    void reset(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    //! Takes ownership of a compatible raw interface pointer (releases pointer, copies but DOES NOT AddRef the parameter).\n    void attach(pointer other) WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = other;\n        if (ptr)\n        {\n            ULONG ref = ptr->Release();\n            WI_ASSERT_MSG(((other != ptr) || (ref > 0)), \"Bug: Attaching the same already assigned, destructed pointer\");\n        }\n    }\n\n    //! Relinquishes ownership and returns the internal interface pointer (DOES NOT release the detached pointer, sets class\n    //! pointer to null).\n    WI_NODISCARD pointer detach() WI_NOEXCEPT\n    {\n        auto temp = m_ptr;\n        m_ptr = nullptr;\n        return temp;\n    }\n\n    //! Returns the address of the internal pointer (releases ownership of the pointer BEFORE returning the address).\n    //! The pointer is explicitly released to prevent accidental leaks of the pointer.  Coding standards generally indicate that\n    //! there is little valid `_Inout_` use of `IInterface**`, making this safe to do under typical use.\n    //! @see addressof\n    //! ~~~~\n    //! STDAPI GetMuffin(IMuffin **muffin);\n    //! wil::com_ptr<IMuffin> myMuffin;\n    //! THROW_IF_FAILED(GetMuffin(myMuffin.put()));\n    //! ~~~~\n    pointer* put() WI_NOEXCEPT\n    {\n        reset();\n        return &m_ptr;\n    }\n\n    //! Returns the address of the internal pointer casted to void** (releases ownership of the pointer BEFORE returning the\n    //! address).\n    //! @see put\n    void** put_void() WI_NOEXCEPT\n    {\n        return reinterpret_cast<void**>(put());\n    }\n\n    //! Returns the address of the internal pointer casted to IUnknown** (releases ownership of the pointer BEFORE returning the address).\n    //! @see put\n    ::IUnknown** put_unknown() WI_NOEXCEPT\n    {\n        return reinterpret_cast<::IUnknown**>(put());\n    }\n\n    //! Returns the address of the internal pointer (releases ownership of the pointer BEFORE returning the address).\n    //! The pointer is explicitly released to prevent accidental leaks of the pointer.  Coding standards generally indicate that\n    //! there is little valid `_Inout_` use of `IInterface**`, making this safe to do under typical use.  Since this behavior is\n    //! not always immediately apparent, prefer to scope variables as close to use as possible (generally avoiding use of the same\n    //! com_ptr variable in successive calls to receive an output interface).\n    //! @see addressof\n    pointer* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    //! Returns the address of the internal pointer (does not release the pointer; should not be used for `_Out_` parameters)\n    pointer* addressof() WI_NOEXCEPT\n    {\n        return &m_ptr;\n    }\n    //! @}\n\n    //! @name Inspection\n    //! @{\n\n    //! Returns the address of the const internal pointer (does not release the pointer)\n    WI_NODISCARD const pointer* addressof() const WI_NOEXCEPT\n    {\n        return &m_ptr;\n    }\n\n    //! Returns 'true' if the pointer is assigned (NOT nullptr)\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_ptr != nullptr);\n    }\n\n    //! Returns the pointer\n    WI_NODISCARD pointer get() const WI_NOEXCEPT\n    {\n        return m_ptr;\n    }\n\n    //! Allows direct calls against the pointer (AV on internal nullptr)\n    WI_NODISCARD pointer operator->() const WI_NOEXCEPT\n    {\n        return m_ptr;\n    }\n\n    //! Dereferences the pointer (AV on internal nullptr)\n    WI_NODISCARD element_type_reference operator*() const WI_NOEXCEPT\n    {\n        return *m_ptr;\n    }\n    //! @}\n\n    //! @name Query helpers\n    //! * Retrieves the requested interface\n    //! * AV if the pointer is null\n    //! * Produce an error if the requested interface is unsupported\n    //!\n    //! See @ref page_query for more information\n    //! @{\n\n    //! Query and return a smart pointer matching the interface specified by 'U':  `auto foo = m_ptr.query<IFoo>();`.\n    //! See @ref page_query for more information.\n    //!\n    //! This method is the primary method that should be used to query a com_ptr in exception-based or fail-fast based code.\n    //! Error-code returning code should use @ref query_to so that the returned HRESULT can be examined.  In the following\n    //! examples, `m_ptr` is an exception-based or fail-fast based com_ptr, com_weak_ref, or com_agile_ref:\n    //! ~~~~\n    //! auto foo = ptr.query<IFoo>();\n    //! foo->Method1();\n    //! foo->Method2();\n    //! ~~~~\n    //! For simple single-method calls, this method allows removing the temporary that holds the com_ptr:\n    //! ~~~~\n    //! ptr.query<IFoo>()->Method1();\n    //! ~~~~\n    //! @tparam U Represents the interface being queried\n    //! @return A `com_ptr_t` pointer to the given interface `U`.  The pointer is guaranteed not null.  The returned\n    //!         `com_ptr_t` type will be @ref com_ptr or @ref com_ptr_failfast (matching the error handling form of the\n    //!         pointer being queried (exception based or fail-fast).\n    template <class U>\n    WI_NODISCARD inline com_ptr_t<U, err_policy> query() const\n    {\n        static_assert(wistd::is_same<void, result>::value, \"query requires exceptions or fail fast; use try_query or query_to\");\n        return com_ptr_t<U, err_policy>(m_ptr, details::tag_com_query());\n    }\n\n    //! Query for the interface of the given out parameter `U`:  `ptr.query_to(&foo);`.\n    //! See @ref page_query for more information.\n    //!\n    //! For fail-fast and exception-based behavior this routine should primarily be used to write to out parameters and @ref query\n    //! should be used to perform most queries.  For error-code based code, this routine is the primary method that should be used\n    //! to query a com_ptr.\n    //!\n    //! Error-code based samples:\n    //! ~~~~\n    //! // class member being queried:\n    //! wil::com_ptr_nothrow<IUnknown> m_ptr;\n    //!\n    //! // simple query example:\n    //! wil::com_ptr_nothrow<IFoo> foo;\n    //! RETURN_IF_FAILED(m_ptr.query_to(&foo));\n    //! foo->FooMethod1();\n    //!\n    //! // output parameter example:\n    //! HRESULT GetFoo(_COM_Outptr_ IFoo** fooPtr)\n    //! {\n    //!     RETURN_IF_FAILED(m_ptr.query_to(fooPtr));\n    //!     return S_OK;\n    //! }\n    //! ~~~~\n    //! Exception or fail-fast samples:\n    //! ~~~~\n    //! // class member being queried\n    //! wil::com_ptr<IUnknown> m_ptr;\n    //!\n    //! void GetFoo(_COM_Outptr_ IFoo** fooPtr)\n    //! {\n    //!     m_ptr.query_to(fooPtr);\n    //! }\n    //! ~~~~\n    //! @tparam U           Represents the interface being queried (type of the output parameter).  This interface does not need\n    //!                     to be specified directly.  Rely upon template type deduction to pick up the type from the output\n    //!                     parameter.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure.\n    //! @return             For the nothrow (error code-based) classes (@ref com_ptr_nothrow, @ref com_weak_ref_nothrow,\n    //!                     @ref com_agile_ref_nothrow) this method returns an `HRESULT` indicating whether the query was\n    //!                     successful.  Exception-based and fail-fast based classes do not return a value (void).\n    template <class U>\n    result query_to(_COM_Outptr_ U** ptrResult) const\n    {\n        // Prefast cannot see through the error policy + query_policy mapping and as a result fires 6388 and 28196 for this\n        // function. Suppression is also not working. Wrapping this entire function in #pragma warning(disable: 6388 28196) does\n        // not stop all of the prefast errors from being emitted.\n#if defined(_PREFAST_)\n        *ptrResult = nullptr;\n        return err_policy::HResult(E_NOINTERFACE);\n#else\n        return err_policy::HResult(query_policy::query(m_ptr, ptrResult));\n#endif\n    }\n\n    //! Query for the requested interface using the iid, ppv pattern:  `ptr.query_to(riid, ptr);`.\n    //! See @ref page_query for more information.\n    //!\n    //! This method is built to implement an API boundary that exposes a returned pointer to a caller through the REFIID and\n    //! void** pointer pattern (like QueryInterface).  This pattern should not be used outside of that pattern (through\n    //! IID_PPV_ARGS) as it is less efficient than the typed version of @ref query_to which can elide the QueryInterface in favor\n    //! of AddRef when the types are convertible.\n    //! ~~~~\n    //! // class member being queried:\n    //! wil::com_ptr_nothrow<IUnknown> m_ptr;\n    //!\n    //! // output parameter example:\n    //! HRESULT GetFoo(REFIID riid, _COM_Outptr_ void** ptrResult)\n    //! {\n    //!     RETURN_IF_FAILED(m_ptr.query_to(riid, ptrResult));\n    //!     return S_OK;\n    //! }\n    //! ~~~~\n    //! @param riid         The interface to query for.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure.\n    //! @return             For the nothrow (error code-based) classes (@ref com_ptr_nothrow, @ref com_weak_ref_nothrow,\n    //!                     @ref com_agile_ref_nothrow) this method returns an `HRESULT` indicating whether the query was\n    //!                     successful.  Exception-based and fail-fast based classes do not return a value (void).\n    result query_to(REFIID riid, _COM_Outptr_ void** ptrResult) const\n    {\n        // Prefast cannot see through the error policy + query_policy mapping and as a result and as a result fires 6388 and 28196\n        // for this function. Suppression is also not working. Wrapping this entire function in #pragma warning(disable: 6388\n        // 28196) does not stop the prefast errors from being emitted.\n#if defined(_PREFAST_)\n        *ptrResult = nullptr;\n        return err_policy::HResult(E_NOINTERFACE);\n#else\n        return err_policy::HResult(query_policy::query(m_ptr, riid, ptrResult));\n#endif\n    }\n    //! @}\n\n    //! @name Try query helpers\n    //! * Attempts to retrieves the requested interface\n    //! * AV if the pointer is null\n    //! * Produce null if the requested interface is unsupported\n    //! * bool returns 'true' when query was successful\n    //!\n    //! See @ref page_query for more information.\n    //! @{\n\n    //! Attempt a query and return a smart pointer matching the interface specified by 'U':  `auto foo = m_ptr.try_query<IFoo>();`\n    //! (null result when interface is unsupported).\n    //! See @ref page_query for more information.\n    //!\n    //! This method can be used to query a com_ptr for an interface when it's known that support for that interface is\n    //! optional (failing the query should not produce an error).  The caller must examine the returned pointer to see\n    //! if it's null before using it:\n    //! ~~~~\n    //! auto foo = ptr.try_query<IFoo>();\n    //! if (foo)\n    //! {\n    //!     foo->Method1();\n    //!     foo->Method2();\n    //! }\n    //! ~~~~\n    //! @tparam U   Represents the interface being queried\n    //! @return     A `com_ptr_t` pointer to the given interface `U`.  The returned pointer will be null if the interface is\n    //!             not supported.  The returned `com_ptr_t` will have the same error handling policy (exceptions, failfast or\n    //!             error codes) as the pointer being queried.\n    template <class U>\n    WI_NODISCARD inline com_ptr_t<U, err_policy> try_query() const\n    {\n        return com_ptr_t<U, err_policy>(m_ptr, details::tag_try_com_query());\n    }\n\n    //! Attempts to query for the interface matching the given output parameter; returns a bool indicating if the query was\n    //! successful (non-null).\n    //! See @ref page_query for more information.\n    //!\n    //! This method can be used to perform a query against a non-null interface when it's known that support for that interface is\n    //! optional (failing the query should not produce an error).  The caller must examine the returned bool before using the\n    //! returned pointer.\n    //! ~~~~\n    //! wil::com_ptr_nothrow<IFoo> foo;\n    //! if (ptr.try_query_to(&foo))\n    //! {\n    //!     foo->Method1();\n    //!     foo->Method2();\n    //! }\n    //! ~~~~\n    //! @param ptrResult    The pointer to query for.  The interface to query is deduced from the type of this out parameter; do\n    //!                     not specify the type directly to the template.\n    //! @return             A `bool` indicating `true` of the query was successful (the returned parameter is non-null).\n    template <class U>\n    _Success_return_ bool try_query_to(_COM_Outptr_ U** ptrResult) const\n    {\n        return SUCCEEDED(query_policy::query(m_ptr, ptrResult));\n    }\n\n    //! Attempts a query for the requested interface using the iid, ppv pattern:  `ptr.try_query_to(riid, ptr);`.\n    //! See @ref page_query for more information.\n    //!\n    //! This method is built to implement an API boundary that exposes a returned pointer to a caller through the REFIID and\n    //! void** pointer pattern (like QueryInterface).  The key distinction is that this routine does not produce an error if the\n    //! request isn't fulfilled, so it's appropriate for `_COM_Outptr_result_maybenull_` cases.  This pattern should not be used\n    //! outside of that pattern (through IID_PPV_ARGS) as it is less efficient than the typed version of @ref try_query_to which\n    //! can elide the QueryInterface in favor of AddRef when the types are convertible.  The caller must examine the returned bool\n    //! before using the returned pointer.\n    //! ~~~~\n    //! // class member being queried:\n    //! wil::com_ptr_nothrow<IUnknown> m_ptr;\n    //!\n    //! // output parameter example (result may be null):\n    //! HRESULT GetFoo(REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult)\n    //! {\n    //!     m_ptr.try_query_to(riid, ptrResult);\n    //!     return S_OK;\n    //! }\n    //! ~~~~\n    //! @param riid         The interface to query for.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure.\n    //! @return             A `bool` indicating `true` of the query was successful (the returned parameter is non-null).\n    _Success_return_ bool try_query_to(REFIID riid, _COM_Outptr_ void** ptrResult) const\n    {\n        return SUCCEEDED(query_policy::query(m_ptr, riid, ptrResult));\n    }\n    //! @}\n\n    //! @name Copy helpers\n    //! * Retrieves the requested interface\n    //! * Succeeds with null if the pointer is null\n    //! * Produce an error if the requested interface is unsupported\n    //!\n    //! See @ref page_query for more information.\n    //! @{\n\n    //! Query and return a smart pointer matching the interface specified by 'U':  `auto foo = m_ptr.copy<IFoo>();` (succeeds and\n    //! returns a null ptr if the queried pointer is null).\n    //! See @ref page_query for more information.\n    //!\n    //! This method is identical to @ref query with the exception that it can be used when the pointer is null.  When used\n    //! against a null pointer, the returned pointer will always be null and an error will not be produced.  Like query it will\n    //! produce an error for a non-null pointer that does not support the requested interface.\n    //! @tparam U Represents the interface being queried\n    //! @return A `com_ptr_t` pointer to the given interface `U`.  The pointer will be null ONLY if the pointer being queried is\n    //!         null.  The returned `com_ptr_t` type will be @ref com_ptr or @ref com_ptr_failfast (matching the error handling\n    //!         form of the pointer being queried (exception based or fail-fast).\n    template <class U>\n    WI_NODISCARD inline com_ptr_t<U, err_policy> copy() const\n    {\n        static_assert(wistd::is_same<void, result>::value, \"copy requires exceptions or fail fast; use the try_copy or copy_to method\");\n        return com_ptr_t<U, err_policy>(m_ptr, details::tag_com_copy());\n    }\n\n    //! Query for the interface of the given out parameter `U`:  `ptr.copy_to(&foo);` (succeeds and returns null ptr if the\n    //! queried pointer is null).\n    //! See @ref page_query for more information.\n    //!\n    //! This method is identical to @ref query_to with the exception that it can be used when the pointer is null.  When used\n    //! against a null pointer, the returned pointer will always be null and an error will not be produced.  Like query_to it will\n    //! produce an error for a non-null pointer that does not support the requested interface.\n    //! @tparam U           Represents the interface being queried (type of the output parameter).  This interface does not need\n    //!                     to be specified directly.  Rely upon template type deduction to pick up the type from the output\n    //!                     parameter.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure OR assigned null when the source pointer is null.\n    //! @return             For the nothrow (error code-based) classes (@ref com_ptr_nothrow, @ref com_weak_ref_nothrow,\n    //!                     @ref com_agile_ref_nothrow) this method returns an `HRESULT` indicating whether the query was\n    //!                     successful.  Copying a null value is considered success. Exception-based and fail-fast based classes\n    //!                     do not return a value (void).\n    template <class U>\n    result copy_to(_COM_Outptr_result_maybenull_ U** ptrResult) const\n    {\n        if (m_ptr)\n        {\n            // Prefast cannot see through the error policy + query_policy mapping and as a result and as a result fires 6388 and\n            // 28196 for this function. Suppression is also not working. Wrapping this entire function in #pragma warning(disable:\n            // 6388 28196) does not stop the prefast errors from being emitted.\n#if defined(_PREFAST_)\n            *ptrResult = nullptr;\n            return err_policy::HResult(E_NOINTERFACE);\n#else\n            return err_policy::HResult(query_policy::query(m_ptr, ptrResult));\n#endif\n        }\n        *ptrResult = nullptr;\n        return err_policy::OK();\n    }\n\n    //! Query for the requested interface using the iid, ppv pattern:  `ptr.copy_to(riid, ptr);`. (succeeds and returns null ptr\n    //! if the queried pointer is null).\n    //! See @ref page_query for more information.\n    //!\n    //! Identical to the corresponding @ref query_to method with the exception that it can be used when the pointer is null.  When\n    //! used against a null pointer, the returned pointer will always be null and an error will not be produced.  Like query_to it\n    //! will produce an error for a non-null pointer that does not support the requested interface.\n    //! @param riid         The interface to query for.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure OR assigned null when the source pointer is null.\n    //! @return             For the nothrow (error code-based) classes (@ref com_ptr_nothrow, @ref com_weak_ref_nothrow,\n    //!                     @ref com_agile_ref_nothrow) this method returns an `HRESULT` indicating whether the query was\n    //!                     successful.  Copying a null value is considered success.  Exception-based and fail-fast based classes\n    //!                     do not return a value (void).\n    result copy_to(REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult) const\n    {\n        if (m_ptr)\n        {\n            // Prefast cannot see through the error policy + query_policy mapping and as a result and as a result fires 6388 and\n            // 28196 for this function. Suppression is also not working. Wrapping this entire function in #pragma warning(disable:\n            // 6388 28196) does not stop the prefast errors from being emitted.\n#if defined(_PREFAST_)\n            *ptrResult = nullptr;\n            return err_policy::HResult(E_NOINTERFACE);\n#else\n            return err_policy::HResult(query_policy::query(m_ptr, riid, ptrResult));\n#endif\n        }\n        *ptrResult = nullptr;\n        return err_policy::OK();\n    }\n    //! @}\n\n    //! @name Try copy helpers\n    //! * Attempts to retrieves the requested interface\n    //! * Successfully produces null if the queried pointer is already null\n    //! * Produce null if the requested interface is unsupported\n    //! * bool returns 'false' ONLY when the queried pointer is not null and the requested interface is unsupported\n    //!\n    //! See @ref page_query for more information.\n    //! @{\n\n    //! Attempt a query and return a smart pointer matching the interface specified by 'U':  `auto foo = m_ptr.try_query<IFoo>();`\n    //! (null result when interface is unsupported or queried pointer is null).\n    //! See @ref page_query for more information.\n    //!\n    //! Identical to the corresponding @ref try_query method with the exception that it can be used when the pointer is null.\n    //! When used against a null pointer, the returned pointer will always be null and an error will not be produced.\n    //! @tparam U   Represents the interface being queried\n    //! @return     A `com_ptr_t` pointer to the given interface `U`.  The returned pointer will be null if the interface was\n    //!             not supported or the pointer being queried is null.  The returned `com_ptr_t` will have the same error\n    //!             handling policy (exceptions, failfast or error codes) as the pointer being queried.\n    template <class U>\n    WI_NODISCARD inline com_ptr_t<U, err_policy> try_copy() const\n    {\n        return com_ptr_t<U, err_policy>(m_ptr, details::tag_try_com_copy());\n    }\n\n    //! Attempts to query for the interface matching the given output parameter; returns a bool indicating if the query was\n    //! successful (returns `false` if the pointer is null).\n    //! See @ref page_query for more information.\n    //!\n    //! Identical to the corresponding @ref try_query_to method with the exception that it can be used when the pointer is null.\n    //! When used against a null pointer, the returned pointer will be null and the return value will be `false`.\n    //! @param ptrResult    The pointer to query for.  The interface to query is deduced from the type of this out parameter; do\n    //!                     not specify the type directly to the template.\n    //! @return             A `bool` indicating `true` of the query was successful (the returned parameter is non-null).\n    template <class U>\n    _Success_return_ bool try_copy_to(_COM_Outptr_result_maybenull_ U** ptrResult) const\n    {\n        if (m_ptr)\n        {\n            return SUCCEEDED(query_policy::query(m_ptr, ptrResult));\n        }\n        *ptrResult = nullptr;\n        return false;\n    }\n\n    //! Attempts a query for the requested interface using the iid, ppv pattern:  `ptr.try_query_to(riid, ptr);` (returns `false`\n    //! if the pointer is null)\n    //! See @ref page_query for more information.\n    //!\n    //! Identical to the corresponding @ref try_query_to method with the exception that it can be used when the pointer is null.\n    //! When used against a null pointer, the returned pointer will be null and the return value will be `false`.\n    //! @param riid         The interface to query for.\n    //! @param ptrResult    The output pointer that will receive the newly queried interface.  This pointer will be assigned null\n    //!                     on failure or if the source pointer being queried is null.\n    //! @return             A `bool` indicating `true` of the query was successful (the returned parameter is non-null).  Querying\n    //!                     a null pointer will return `false` with a null result.\n    _Success_return_ bool try_copy_to(REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult) const\n    {\n        if (m_ptr)\n        {\n            return SUCCEEDED(query_policy::query(m_ptr, riid, ptrResult));\n        }\n        *ptrResult = nullptr;\n        return false;\n    }\n    //! @}\n\n    //! @name WRL compatibility\n    //! @{\n\n    //! Copy construct from a compatible WRL ComPtr<T>.\n    template <class U, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t(const Microsoft::WRL::ComPtr<U>& other) WI_NOEXCEPT : com_ptr_t(static_cast<pointer>(other.Get()))\n    {\n    }\n\n    //! Move construct from a compatible WRL ComPtr<T>.\n    template <class U, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t(Microsoft::WRL::ComPtr<U>&& other) WI_NOEXCEPT : m_ptr(other.Detach())\n    {\n    }\n\n    //! Assign from a compatible WRL ComPtr<T>.\n    template <class U, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t& operator=(const Microsoft::WRL::ComPtr<U>& other) WI_NOEXCEPT\n    {\n        return operator=(static_cast<pointer>(other.Get()));\n    }\n\n    //! Move assign from a compatible WRL ComPtr<T>.\n    template <class U, class = wistd::enable_if_t<__is_convertible_to(U*, pointer)>>\n    com_ptr_t& operator=(Microsoft::WRL::ComPtr<U>&& other) WI_NOEXCEPT\n    {\n        attach(other.Detach());\n        return *this;\n    }\n\n    //! Swap pointers with a WRL ComPtr<T> to the same interface.\n    void swap(Microsoft::WRL::ComPtr<T>& other) WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = other.Detach();\n        other.Attach(ptr);\n    }\n\n    //! Swap pointers with a rvalue reference to a WRL ComPtr<T> to the same interface.\n    void swap(Microsoft::WRL::ComPtr<T>&& other) WI_NOEXCEPT\n    {\n        swap(other);\n    }\n    //! @}  // WRL compatibility\n\npublic:\n    // Internal Helpers\n    /// @cond\n    template <class U>\n    inline com_ptr_t(_In_ U* ptr, details::tag_com_query) : m_ptr(nullptr)\n    {\n        err_policy::HResult(details::query_policy_t<U>::query(ptr, &m_ptr));\n    }\n\n    template <class U>\n    inline com_ptr_t(_In_ U* ptr, details::tag_try_com_query) WI_NOEXCEPT : m_ptr(nullptr)\n    {\n        details::query_policy_t<U>::query(ptr, &m_ptr);\n    }\n\n    template <class U>\n    inline com_ptr_t(_In_opt_ U* ptr, details::tag_com_copy) : m_ptr(nullptr)\n    {\n        if (ptr)\n        {\n            err_policy::HResult(details::query_policy_t<U>::query(ptr, &m_ptr));\n        }\n    }\n\n    template <class U>\n    inline com_ptr_t(_In_opt_ U* ptr, details::tag_try_com_copy) WI_NOEXCEPT : m_ptr(nullptr)\n    {\n        if (ptr)\n        {\n            details::query_policy_t<U>::query(ptr, &m_ptr);\n        }\n    }\n    /// @endcond\n\nprivate:\n    pointer m_ptr;\n};\n\n// Error-policy driven forms of com_ptr\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! COM pointer, errors throw exceptions (see @ref com_ptr_t for details)\ntemplate <typename T>\nusing com_ptr = com_ptr_t<T, err_exception_policy>;\n#endif\n\n//! COM pointer, errors return error codes (see @ref com_ptr_t for details)\ntemplate <typename T>\nusing com_ptr_nothrow = com_ptr_t<T, err_returncode_policy>;\n\n//! COM pointer, errors fail-fast (see @ref com_ptr_t for details)\ntemplate <typename T>\nusing com_ptr_failfast = com_ptr_t<T, err_failfast_policy>;\n\n// Global operators / swap\n\n//! Swaps the given com pointers that have different error handling.\n//! Note that there are also corresponding versions to allow you to swap any wil com_ptr<T> with a WRL ComPtr<T>.\ntemplate <typename T, typename ErrLeft, typename ErrRight>\ninline void swap(com_ptr_t<T, ErrLeft>& left, com_ptr_t<T, ErrRight>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\n//! Swaps the given com pointers that have the same error handling.\ntemplate <typename T, typename Err>\ninline void swap(com_ptr_t<T, Err>& left, com_ptr_t<T, Err>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\n//! Compare two com pointers.\n//! Compares the two raw com pointers for equivalence.  Does NOT compare object identity with a QI for IUnknown.\n//!\n//! Note that documentation for all of the various comparators has not been generated to reduce global function\n//! clutter, but ALL standard comparison operators are supported between wil com_ptr<T> objects, nullptr_t, and\n//! WRL ComPtr<T>.\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator==(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() == right.get());\n}\n\n// We don't document all of the global comparison operators (reduce clutter)\n/// @cond\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator<(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() < right.get());\n}\n\ntemplate <typename TLeft, typename ErrLeft>\ninline bool operator==(const com_ptr_t<TLeft, ErrLeft>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    return (left.get() == nullptr);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator!=(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left == right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator>=(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator>(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight, typename ErrRight>\ninline bool operator<=(const com_ptr_t<TLeft, ErrLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\ntemplate <typename TRight, typename ErrRight>\ninline bool operator==(wistd::nullptr_t, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (right.get() == nullptr);\n}\n\ntemplate <typename TLeft, typename ErrLeft>\ninline bool operator!=(const com_ptr_t<TLeft, ErrLeft>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    return (!(left == nullptr));\n}\n\ntemplate <typename TRight, typename ErrRight>\ninline bool operator!=(wistd::nullptr_t, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(right == nullptr));\n}\n\n// WRL ComPtr support\n\ntemplate <typename T, typename ErrLeft>\ninline void swap(com_ptr_t<T, ErrLeft>& left, Microsoft::WRL::ComPtr<T>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator==(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() == right.Get());\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator<(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() < right.Get());\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator!=(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    return (!(left == right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator>=(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator>(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator<=(const com_ptr_t<TLeft, ErrLeft>& left, const Microsoft::WRL::ComPtr<TRight>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\ntemplate <typename T, typename ErrRight>\ninline void swap(Microsoft::WRL::ComPtr<T>& left, com_ptr_t<T, ErrRight>& right) WI_NOEXCEPT\n{\n    right.swap(left);\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator==(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.Get() == right.get());\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator<(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.Get() < right.get());\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator!=(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left == right));\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator>=(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator>(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator<=(const Microsoft::WRL::ComPtr<TLeft>& left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\n// raw COM pointer support\n//\n// Use these for convenience and to avoid unnecessary AddRef/Release cyles when using raw\n// pointers to access STL containers. Specify std::less<> to benefit from operator<.\n//\n// Example: std::set<wil::com_ptr<IUnknown>, std::less<>> set;\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator==(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() == right);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator<(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left.get() < right);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator!=(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    return (!(left == right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator>=(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator>(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename TLeft, typename ErrLeft, typename TRight>\ninline bool operator<=(const com_ptr_t<TLeft, ErrLeft>& left, TRight* right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator==(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left == right.get());\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator<(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    static_assert(\n        __is_convertible_to(TLeft*, TRight*) || __is_convertible_to(TRight*, TLeft*),\n        \"comparison operator requires left and right pointers to be compatible\");\n    return (left < right.get());\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator!=(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left == right));\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator>=(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator>(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename TLeft, typename TRight, typename ErrRight>\ninline bool operator<=(TLeft* left, const com_ptr_t<TRight, ErrRight>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\n// suppress documentation of every single comparison operator\n/// @endcond\n\n//! An overloaded function that retrieves the raw com pointer from a raw pointer, wil::com_ptr_t<T>, WRL ComPtr<T>, or\n//! Platform::Object^.  This function is primarily useful by library or helper code.  It allows code to be written to accept a\n//! forwarding reference template that can be used as an input com pointer.  That input com pointer is allowed to be any of:\n//! * Raw Pointer:  `T* com_raw_ptr(T* ptr)`\n//! * Wil com_ptr:  `T* com_raw_ptr(const wil::com_ptr_t<T, err>& ptr)`\n//! * WRL ComPtr:   `T* com_raw_ptr(const Microsoft::WRL::ComPtr<T>& ptr)`\n//! * C++/CX hat:   `IInspectable* com_raw_ptr(Platform::Object^ ptr)`\n//!\n//! Which in turn allows code like the following to be written:\n//! ~~~~\n//! template <typename U, typename T>\n//! void com_query_to(T&& ptrSource, _COM_Outptr_ U** ptrResult)\n//! {\n//!     auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n//!     // decltype(raw) has the type of the inner pointer and raw is guaranteed to be a raw com pointer\n//! ~~~~\ntemplate <typename T>\nT* com_raw_ptr(T* ptr)\n{\n    return ptr;\n}\n\n/// @cond\ntemplate <typename T, typename err>\nT* com_raw_ptr(const wil::com_ptr_t<T, err>& ptr)\n{\n    return ptr.get();\n}\n\ntemplate <typename T>\nT* com_raw_ptr(const Microsoft::WRL::ComPtr<T>& ptr)\n{\n    return ptr.Get();\n}\n\n// clang-format off\n#ifdef __cplusplus_winrt\n\ntemplate <typename T>\ninline IInspectable* com_raw_ptr(T^ ptr)\n{\n    return reinterpret_cast<IInspectable*>(static_cast<::Platform::Object^>(ptr));\n}\n\n#endif\n// clang-format on\n/// @endcond\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Constructs a `com_ptr` from a raw pointer.\n//! This avoids having to restate the interface in pre-C++20.\n//! Starting in C++20, you can write `wil::com_ptr(p)` directly.\n//! ~~~\n//! void example(ILongNamedThing* thing)\n//! {\n//!    callback([thing = wil::make_com_ptr(thing)] { /* do something */ });\n//! }\n//! ~~~\ntemplate <typename T>\ncom_ptr<T> make_com_ptr(T* p)\n{\n    return p;\n}\n#endif\n\n//! Constructs a `com_ptr_nothrow` from a raw pointer.\n//! This avoids having to restate the interface in pre-C++20.\n//! Starting in C++20, you can write `wil::com_ptr_nothrow(p)` directly.\n//! ~~~\n//! void example(ILongNamedThing* thing)\n//! {\n//!    callback([thing = wil::make_com_ptr_nothrow(thing)] { /* do something */ });\n//! }\n//! ~~~\ntemplate <typename T>\ncom_ptr_nothrow<T> make_com_ptr_nothrow(T* p)\n{\n    return p;\n}\n\n//! Constructs a `com_ptr_failfast` from a raw pointer.\n//! This avoids having to restate the interface in pre-C++20.\n//! Starting in C++20, you can write `wil::com_ptr_failfast(p)` directly.\n//! ~~~\n//! void example(ILongNamedThing* thing)\n//! {\n//!    callback([thing = wil::make_com_ptr_failfast(thing)] { /* do something */ });\n//! }\n//! ~~~\ntemplate <typename T>\ncom_ptr_failfast<T> make_com_ptr_failfast(T* p)\n{\n    return p;\n}\n\n//! @name Stand-alone query helpers\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * Retrieves the requested interface\n//! * AV if the source pointer is null\n//! * Produce an error if the requested interface is unsupported\n//!\n//! See @ref page_query for more information\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the specified interface and returns an exception-based wil::com_ptr to that interface (exception if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer is guaranteed not null.\ntemplate <typename U, typename T>\ninline com_ptr<U> com_query(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr<U>(raw, details::tag_com_query());\n}\n#endif\n\n//! Queries for the specified interface and returns a fail-fast-based wil::com_ptr_failfast to that interface (fail-fast if\n//! unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer is guaranteed not null.\ntemplate <typename U, typename T>\ninline com_ptr_failfast<U> com_query_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_failfast<U>(raw, details::tag_com_query());\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the interface specified by the type of the output parameter (throws an exception if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer is guaranteed not null.\ntemplate <typename U, typename T>\n_Success_true_ void com_query_to(T&& ptrSource, _COM_Outptr_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    THROW_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n    __analysis_assume(*ptrResult != nullptr);\n}\n#endif\n\n//! Queries for the interface specified by the type of the output parameter (fail-fast if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer is guaranteed not null.\ntemplate <typename U, typename T>\n_Success_true_ void com_query_to_failfast(T&& ptrSource, _COM_Outptr_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    FAIL_FAST_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n    __analysis_assume(*ptrResult != nullptr);\n}\n\n//! Queries for the interface specified by the type of the output parameter (returns an error if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null upon failure.\n//! @return             Returns an HRESULT representing whether the query succeeded.\ntemplate <typename U, typename T>\nHRESULT com_query_to_nothrow(T&& ptrSource, _COM_Outptr_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    auto hr = details::query_policy_t<decltype(raw)>::query(raw, ptrResult);\n    __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr));\n    return hr;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the interface specified by the given REFIID parameter (throws an exception if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer is guaranteed not null.\ntemplate <typename T>\n_Success_true_ void com_query_to(T&& ptrSource, REFIID riid, _COM_Outptr_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    THROW_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n    __analysis_assume(*ptrResult != nullptr);\n}\n#endif\n\n//! Queries for the interface specified by the given REFIID parameter (fail-fast if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer is guaranteed not null.\ntemplate <typename T>\n_Success_true_ void com_query_to_failfast(T&& ptrSource, REFIID riid, _COM_Outptr_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    FAIL_FAST_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n    __analysis_assume(*ptrResult != nullptr);\n}\n\n//! Queries for the interface specified by the given REFIID parameter (returns an error if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null upon failure.\ntemplate <typename T>\nHRESULT com_query_to_nothrow(T&& ptrSource, REFIID riid, _COM_Outptr_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    auto hr = details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult);\n    __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr));\n    return hr;\n}\n//! @}\n\n//! @name Stand-alone try query helpers\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * Attempts to retrieves the requested interface\n//! * AV if the source pointer is null\n//! * Produce null if the requested interface is unsupported\n//! * bool returns 'true' when query was successful (non-null return result)\n//!\n//! See @ref page_query for more information.\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Attempts a query for the specified interface and returns an exception-based wil::com_ptr to that interface (returns null if\n//! unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer is null if the requested\n//! interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr<U> try_com_query(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr<U>(raw, details::tag_try_com_query());\n}\n#endif\n\n//! Attempts a query for the specified interface and returns an fail-fast wil::com_ptr_failfast to that interface (returns null if\n//! unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr_failfast<U>` pointer to the given interface `U`.  The returned pointer is null if the\n//!                     requested interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr_failfast<U> try_com_query_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_failfast<U>(raw, details::tag_try_com_query());\n}\n\n//! Attempts a query for the specified interface and returns an error-code-based wil::com_ptr_nothrow to that interface (returns\n//! null if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr_nothrow<U>` pointer to the given interface `U`.  The returned pointer is null if the\n//!                     requested interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr_nothrow<U> try_com_query_nothrow(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_nothrow<U>(raw, details::tag_try_com_query());\n}\n\n//! Attempts a query for the interface specified by the type of the output parameter (returns `false` if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null.\n//! @param ptrResult    Represents the output pointer to populate.  If the interface is unsupported, the returned pointer will be\n//!                     null.\n//! @return             A bool value representing whether the query was successful (non-null return result).\ntemplate <typename U, typename T>\n_Success_return_ bool try_com_query_to(T&& ptrSource, _COM_Outptr_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return (SUCCEEDED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult)));\n}\n\n//! Attempts a query for the interface specified by the type of the output parameter (returns `false` if unsupported).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), should not be null.\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  If the interface is unsupported, the returned pointer will be\n//!                     null.\n//! @return             A bool value representing whether the query was successful (non-null return result).\ntemplate <typename T>\n_Success_return_ bool try_com_query_to(T&& ptrSource, REFIID riid, _COM_Outptr_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return (SUCCEEDED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult)));\n}\n//! @}\n\n//! @name Stand-alone copy helpers\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * Retrieves the requested interface\n//! * Succeeds with null if the source pointer is null\n//! * Produce an error if the requested interface is unsupported\n//!\n//! See @ref page_query for more information\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the specified interface and returns an exception-based wil::com_ptr to that interface (exception if unsupported,\n//! preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer will be null only if the\n//!                     source is null.\ntemplate <class U, typename T>\ninline com_ptr<U> com_copy(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr<U>(raw, details::tag_com_copy());\n}\n#endif\n\n//! Queries for the specified interface and returns a fail-fast-based wil::com_ptr_failfast to that interface (fail-fast if\n//! unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer will be null only if the\n//!                     source is null.\ntemplate <class U, typename T>\ninline com_ptr_failfast<U> com_copy_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_failfast<U>(raw, details::tag_com_copy());\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the interface specified by the type of the output parameter (throws an exception if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null only if the source is null.\ntemplate <typename U, typename T>\n_Success_true_ void com_copy_to(T&& ptrSource, _COM_Outptr_result_maybenull_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        THROW_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n        return;\n    }\n    *ptrResult = nullptr;\n}\n#endif\n\n//! Queries for the interface specified by the type of the output parameter (fail-fast if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null only if the source is null.\ntemplate <typename U, typename T>\n_Success_true_ void com_copy_to_failfast(T&& ptrSource, _COM_Outptr_result_maybenull_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        FAIL_FAST_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n        return;\n    }\n    *ptrResult = nullptr;\n}\n\n//! Queries for the interface specified by the type of the output parameter (returns an error if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null upon failure or if the\n//!                     source is null.\n//! @return             Returns an HRESULT representing whether the query succeeded (returns S_OK if the source is null).\ntemplate <typename U, typename T>\nHRESULT com_copy_to_nothrow(T&& ptrSource, _COM_Outptr_result_maybenull_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        RETURN_HR(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return S_OK;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Queries for the interface specified by the given REFIID parameter (throws an exception if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null only if the source is null.\ntemplate <typename T>\n_Success_true_ void com_copy_to(T&& ptrSource, REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        THROW_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n        return;\n    }\n    *ptrResult = nullptr;\n}\n#endif\n\n//! Queries for the interface specified by the given REFIID parameter (fail-fast if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null only if the source is null.\ntemplate <typename T>\n_Success_true_ void com_copy_to_failfast(T&& ptrSource, REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        FAIL_FAST_IF_FAILED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n        return;\n    }\n    *ptrResult = nullptr;\n}\n\n//! Queries for the interface specified by the given REFIID parameter (returns an error if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  The returned pointer will be null upon failure or if the\n//!                     source is null.\n//! @return             Returns an HRESULT representing whether the query succeeded (returns S_OK if the source is null).\ntemplate <typename T>\nHRESULT com_copy_to_nothrow(T&& ptrSource, REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        RETURN_HR(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return S_OK;\n}\n//! @}\n\n//! @name Stand-alone try copy helpers\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * Attempts to retrieves the requested interface\n//! * Succeeds with null if the source pointer is null\n//! * Produce null if the requested interface is unsupported\n//! * bool returns 'true' when query was successful (non-null return result)\n//!\n//! See @ref page_query for more information.\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Attempts a query for the specified interface and returns an exception-based wil::com_ptr to that interface (returns null if\n//! unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr<U>` pointer to the given interface `U`.  The returned pointer is null if the requested\n//!                     interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr<U> try_com_copy(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr<U>(raw, details::tag_try_com_copy());\n}\n#endif\n\n//! Attempts a query for the specified interface and returns an fail-fast wil::com_ptr_failfast to that interface (returns null if\n//! unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr_failfast<U>` pointer to the given interface `U`.  The returned pointer is null if the\n//!                     requested interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr_failfast<U> try_com_copy_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_failfast<U>(raw, details::tag_try_com_copy());\n}\n\n//! Attempts a query for the specified interface and returns an error-code-based wil::com_ptr_nothrow to that interface (returns\n//! null if unsupported, preserves null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null\n//! @tparam U           Represents the interface being queried\n//! @return             A `wil::com_ptr_nothrow<U>` pointer to the given interface `U`.  The returned pointer is null if the\n//!                     requested interface was not supported.\ntemplate <class U, typename T>\ninline com_ptr_nothrow<U> try_com_copy_nothrow(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    return com_ptr_nothrow<U>(raw, details::tag_try_com_copy());\n}\n\n//! Attempts a query for the interface specified by the type of the output parameter (returns `false` if unsupported, preserves\n//! null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null.\n//! @param ptrResult    Represents the output pointer to populate.  If the interface is unsupported, the returned pointer will be\n//!                     null.\n//! @return             A bool value representing whether the query was successful (non-null return result).\ntemplate <typename U, typename T>\n_Success_return_ bool try_com_copy_to(T&& ptrSource, _COM_Outptr_result_maybenull_ U** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        return SUCCEEDED(details::query_policy_t<decltype(raw)>::query(raw, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return false;\n}\n\n//! Attempts a query for the interface specified by the type of the output parameter (returns `false` if unsupported, preserves\n//! null).\n//! See @ref page_query for more information.\n//! @param ptrSource    The pointer to query (may be a raw interface pointer, wil com_ptr, or WRL ComPtr), may be null.\n//! @param riid         The interface to query for\n//! @param ptrResult    Represents the output pointer to populate.  If the interface is unsupported, the returned pointer will be\n//!                     null.\n//! @return             A bool value representing whether the query was successful (non-null return result).\ntemplate <typename T>\n_Success_return_ bool try_com_copy_to(T&& ptrSource, REFIID riid, _COM_Outptr_result_maybenull_ void** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        return SUCCEEDED(details::query_policy_t<decltype(raw)>::query(raw, riid, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return false;\n}\n//! @}\n\n// clang-format off\n#ifdef __cplusplus_winrt\n//! @name Stand-alone helpers to query for CX ref (\"hat\") types from ABI COM types.\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * Retrieves the requested C++/CX interface or ref class.\n//! * Preserves null if the source pointer is null\n//! * Produce an error if the requested interface is unsupported\n//!\n//! See @ref page_query for more information\n//! @{\n\ntemplate <typename T>\n::Platform::Object^ cx_object_from_abi(T&& ptr) WI_NOEXCEPT\n{\n    IInspectable* const inspectable = com_raw_ptr(wistd::forward<T>(ptr));\n    return reinterpret_cast<::Platform::Object^>(inspectable);\n}\n\ntemplate <typename U, typename T>\ninline U^ cx_safe_cast(T&& ptrSource)\n{\n    return safe_cast<U^>(cx_object_from_abi(wistd::forward<T>(ptrSource)));\n}\n\ntemplate <typename U, typename T>\ninline U^ cx_dynamic_cast(T&& ptrSource) WI_NOEXCEPT\n{\n    return dynamic_cast<U^>(cx_object_from_abi(wistd::forward<T>(ptrSource)));\n}\n//! @}\n#endif\n// clang-format on\n\n//*****************************************************************************\n// Agile References\n//*****************************************************************************\n\n#if (NTDDI_VERSION >= NTDDI_WINBLUE)\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Agile reference to a COM interface, errors throw exceptions (see @ref com_ptr_t and @ref com_agile_query for details)\nusing com_agile_ref = com_ptr<IAgileReference>;\n#endif\n//! Agile reference to a COM interface, errors return error codes (see @ref com_ptr_t and @ref com_agile_query_nothrow for\n//! details)\nusing com_agile_ref_nothrow = com_ptr_nothrow<IAgileReference>;\n//! Agile reference to a COM interface, errors fail fast (see @ref com_ptr_t and @ref com_agile_query_failfast for details)\nusing com_agile_ref_failfast = com_ptr_failfast<IAgileReference>;\n\n//! @name Create agile reference helpers\n//! * Attempts to retrieve an agile reference to the requested interface (see\n//!   [RoGetAgileReference](https://msdn.microsoft.com/en-us/library/dn269839.aspx))\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * `query` methods AV if the source pointer is null\n//! * `copy` methods succeed with null if the source pointer is null\n//! * Accept optional [AgileReferenceOptions](https://msdn.microsoft.com/en-us/library/dn269836.aspx)\n//!\n//! See @ref page_query for more information on resolving an agile ref\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! return a com_agile_ref representing the given source pointer (throws an exception on failure)\ntemplate <typename T>\ncom_agile_ref com_agile_query(T&& ptrSource, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_agile_ref agileRef;\n    THROW_IF_FAILED(::RoGetAgileReference(options, __uuidof(raw), raw, &agileRef));\n    return agileRef;\n}\n#endif\n\n//! return a com_agile_ref_failfast representing the given source pointer (fail-fast on failure)\ntemplate <typename T>\ncom_agile_ref_failfast com_agile_query_failfast(T&& ptrSource, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_agile_ref_failfast agileRef;\n    FAIL_FAST_IF_FAILED(::RoGetAgileReference(options, __uuidof(raw), raw, &agileRef));\n    return agileRef;\n}\n\n//! return a com_agile_ref_nothrow representing the given source pointer (returns an HRESULT on failure)\ntemplate <typename T>\nHRESULT com_agile_query_nothrow(T&& ptrSource, _COM_Outptr_ IAgileReference** ptrResult, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    auto hr = ::RoGetAgileReference(options, __uuidof(raw), raw, ptrResult);\n    __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr));\n    return hr;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! return a com_agile_ref representing the given source pointer (throws an exception on failure, source maybe null)\ntemplate <typename T>\ncom_agile_ref com_agile_copy(T&& ptrSource, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_agile_ref agileRef;\n    if (raw)\n    {\n        THROW_IF_FAILED(::RoGetAgileReference(options, __uuidof(raw), raw, &agileRef));\n    }\n    return agileRef;\n}\n#endif\n\n//! return a com_agile_ref_failfast representing the given source pointer (fail-fast on failure, source maybe null)\ntemplate <typename T>\ncom_agile_ref_failfast com_agile_copy_failfast(T&& ptrSource, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_agile_ref_failfast agileRef;\n    if (raw)\n    {\n        FAIL_FAST_IF_FAILED(::RoGetAgileReference(options, __uuidof(raw), raw, &agileRef));\n    }\n    return agileRef;\n}\n\n//! return an agile ref (com_agile_ref_XXX or other representation) representing the given source pointer (return error on\n//! failure, source maybe null)\ntemplate <typename T>\nHRESULT com_agile_copy_nothrow(T&& ptrSource, _COM_Outptr_result_maybenull_ IAgileReference** ptrResult, AgileReferenceOptions options = AGILEREFERENCE_DEFAULT)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        RETURN_HR(::RoGetAgileReference(options, __uuidof(raw), raw, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return S_OK;\n}\n//! @}\n#endif\n\n//*****************************************************************************\n// Weak References\n//*****************************************************************************\n\nnamespace details\n{\n    template <typename T>\n    HRESULT GetWeakReference(T* ptr, _COM_Outptr_ IWeakReference** weakReference)\n    {\n        static_assert(!wistd::is_same<IWeakReference, T>::value, \"Cannot get an IWeakReference to an IWeakReference\");\n\n        *weakReference = nullptr;\n        com_ptr_nothrow<IWeakReferenceSource> source;\n        HRESULT hr = ptr->QueryInterface(IID_PPV_ARGS(&source));\n        if (SUCCEEDED(hr))\n        {\n            hr = source->GetWeakReference(weakReference);\n        }\n        return hr;\n    }\n} // namespace details\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Weak reference to a COM interface, errors throw exceptions (see @ref com_ptr_t and @ref com_weak_query for details)\nusing com_weak_ref = com_ptr<IWeakReference>;\n#endif\n//! Weak reference to a COM interface, errors return error codes (see @ref com_ptr_t and @ref com_weak_query_nothrow for details)\nusing com_weak_ref_nothrow = com_ptr_nothrow<IWeakReference>;\n//! Weak reference to a COM interface, errors fail fast (see @ref com_ptr_t and @ref com_weak_query_failfast for details)\nusing com_weak_ref_failfast = com_ptr_failfast<IWeakReference>;\n\n//! @name Create weak reference helpers\n//! * Attempts to retrieve a weak reference to the requested interface (see WRL's similar\n//!   [WeakRef](https://msdn.microsoft.com/en-us/library/br244853.aspx))\n//! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr\n//! * `query` methods AV if the source pointer is null\n//! * `copy` methods succeed with null if the source pointer is null\n//!\n//! See @ref page_query for more information on resolving a weak ref\n//! @{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! return a com_weak_ref representing the given source pointer (throws an exception on failure)\ntemplate <typename T>\ncom_weak_ref com_weak_query(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_weak_ref weakRef;\n    THROW_IF_FAILED(details::GetWeakReference(raw, &weakRef));\n    return weakRef;\n}\n#endif\n\n//! return a com_weak_ref_failfast representing the given source pointer (fail-fast on failure)\ntemplate <typename T>\ncom_weak_ref_failfast com_weak_query_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_weak_ref_failfast weakRef;\n    FAIL_FAST_IF_FAILED(details::GetWeakReference(raw, &weakRef));\n    return weakRef;\n}\n\n//! return a com_weak_ref_nothrow representing the given source pointer (returns an HRESULT on failure)\ntemplate <typename T>\nHRESULT com_weak_query_nothrow(T&& ptrSource, _COM_Outptr_ IWeakReference** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    auto hr = details::GetWeakReference(raw, ptrResult);\n    __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr));\n    return hr;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! return a com_weak_ref representing the given source pointer (throws an exception on failure, source maybe null)\ntemplate <typename T>\ncom_weak_ref com_weak_copy(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_weak_ref weakRef;\n    if (raw)\n    {\n        THROW_IF_FAILED(details::GetWeakReference(raw, &weakRef));\n    }\n    return weakRef;\n}\n#endif\n\n//! return a com_weak_ref_failfast representing the given source pointer (fail-fast on failure, source maybe null)\ntemplate <typename T>\ncom_weak_ref_failfast com_weak_copy_failfast(T&& ptrSource)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    com_weak_ref_failfast weakRef;\n    if (raw)\n    {\n        FAIL_FAST_IF_FAILED(details::GetWeakReference(raw, &weakRef));\n    }\n    return weakRef;\n}\n\n//! return a com_weak_ref_failfast representing the given source pointer (fail-fast on failure, source maybe null)\ntemplate <typename T>\nHRESULT com_weak_copy_nothrow(T&& ptrSource, _COM_Outptr_result_maybenull_ IWeakReference** ptrResult)\n{\n    auto raw = com_raw_ptr(wistd::forward<T>(ptrSource));\n    if (raw)\n    {\n        RETURN_HR(details::GetWeakReference(raw, ptrResult));\n    }\n    *ptrResult = nullptr;\n    return S_OK;\n}\n\n//! @}\n\n#pragma region COM Object Helpers\n\ntemplate <typename T>\ninline bool is_agile(T&& ptrSource)\n{\n    wil::com_ptr_nothrow<IAgileObject> agileObject;\n    return SUCCEEDED(com_raw_ptr(wistd::forward<T>(ptrSource))->QueryInterface(IID_PPV_ARGS(&agileObject)));\n}\n\n/** constructs a COM object using an CLSID on a specific interface or IUnknown.*/\ntemplate <typename Interface = IUnknown, typename error_policy = err_exception_policy>\nwil::com_ptr_t<Interface, error_policy> CoCreateInstance(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    wil::com_ptr_t<Interface, error_policy> result;\n    error_policy::HResult(::CoCreateInstance(rclsid, nullptr, dwClsContext, IID_PPV_ARGS(&result)));\n    return result;\n}\n\n/** constructs a COM object using the class as the identifier (that has an associated CLSID) on a specific interface or\nIUnknown. */\ntemplate <typename Class, typename Interface = IUnknown, typename error_policy = err_exception_policy>\nwil::com_ptr_t<Interface, error_policy> CoCreateInstance(DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoCreateInstance<Interface, error_policy>(__uuidof(Class), dwClsContext);\n}\n\n/** constructs a COM object using an CLSID on a specific interface or IUnknown. */\ntemplate <typename Interface = IUnknown>\nwil::com_ptr_failfast<Interface> CoCreateInstanceFailFast(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT\n{\n    return CoCreateInstance<Interface, err_failfast_policy>(rclsid, dwClsContext);\n}\n\n/** constructs a COM object using the class as the identifier (that has an associated CLSID) on a specific interface or\nIUnknown. */\ntemplate <typename Class, typename Interface = IUnknown>\nwil::com_ptr_failfast<Interface> CoCreateInstanceFailFast(DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT\n{\n    return CoCreateInstanceFailFast<Interface>(__uuidof(Class), dwClsContext);\n}\n\n/** constructs a COM object using an CLSID on a specific interface or IUnknown.\nNote, failures are reported as a null result, the HRESULT is lost. */\ntemplate <typename Interface = IUnknown>\nwil::com_ptr_nothrow<Interface> CoCreateInstanceNoThrow(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT\n{\n    return CoCreateInstance<Interface, err_returncode_policy>(rclsid, dwClsContext);\n}\n\n/** constructs a COM object using the class as the identifier (that has an associated CLSID) on a specific interface or\nIUnknown.  Note, failures are reported as a null result, the HRESULT is lost. */\ntemplate <typename Class, typename Interface = IUnknown>\nwil::com_ptr_nothrow<Interface> CoCreateInstanceNoThrow(DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT\n{\n    return CoCreateInstanceNoThrow<Interface>(__uuidof(Class), dwClsContext);\n}\n\n/** constructs a COM object class factory using an CLSID on IClassFactory or a specific interface. */\ntemplate <typename Interface = IClassFactory, typename error_policy = err_exception_policy>\nwil::com_ptr_t<Interface, error_policy> CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    wil::com_ptr_t<Interface, error_policy> result;\n    error_policy::HResult(CoGetClassObject(rclsid, dwClsContext, nullptr, IID_PPV_ARGS(&result)));\n    return result;\n}\n\n/** constructs a COM object class factory using the class as the identifier (that has an associated CLSID)\non IClassFactory or a specific interface. */\ntemplate <typename Class, typename Interface = IClassFactory, typename error_policy = err_exception_policy>\nwil::com_ptr_t<Interface, error_policy> CoGetClassObject(DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoGetClassObject<Interface, error_policy>(__uuidof(Class), dwClsContext);\n}\n\n/** constructs a COM object class factory using an CLSID on IClassFactory or a specific interface. */\ntemplate <typename Interface = IClassFactory>\nwil::com_ptr_failfast<Interface> CoGetClassObjectFailFast(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoGetClassObject<Interface, err_failfast_policy>(rclsid, dwClsContext);\n}\n\n/** constructs a COM object class factory using the class as the identifier (that has an associated CLSID)\non IClassFactory or a specific interface. */\ntemplate <typename Class, typename Interface = IClassFactory>\nwil::com_ptr_failfast<Interface> CoGetClassObjectFailFast(DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoGetClassObjectFailFast<Interface>(__uuidof(Class), dwClsContext);\n}\n\n/** constructs a COM object class factory using an CLSID on IClassFactory or a specific interface.\nNote, failures are reported as a null result, the HRESULT is lost. */\ntemplate <typename Interface = IClassFactory>\nwil::com_ptr_nothrow<Interface> CoGetClassObjectNoThrow(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoGetClassObject<Interface, err_returncode_policy>(rclsid, dwClsContext);\n}\n\n/** constructs a COM object class factory using the class as the identifier (that has an associated CLSID)\non IClassFactory or a specific interface.\nNote, failures are reported as a null result, the HRESULT is lost. */\ntemplate <typename Class, typename Interface = IClassFactory>\nwil::com_ptr_nothrow<Interface> CoGetClassObjectNoThrow(DWORD dwClsContext = CLSCTX_INPROC_SERVER)\n{\n    return CoGetClassObjectNoThrow<Interface>(__uuidof(Class), dwClsContext);\n}\n\n#if __cpp_lib_apply && WIL_USE_STL && WI_HAS_INCLUDE(<type_traits>, 1)\n/// @cond\nnamespace details\n{\n    template <typename error_policy, typename... Results>\n    auto CoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx) noexcept\n    {\n        MULTI_QI multiQis[sizeof...(Results)]{};\n        const IID* iids[sizeof...(Results)]{&__uuidof(Results)...};\n\n        static_assert(sizeof...(Results) > 0);\n\n        for (auto i = 0U; i < sizeof...(Results); ++i)\n        {\n            multiQis[i].pIID = iids[i];\n        }\n\n        const auto hr = CoCreateInstanceEx(clsid, nullptr, clsCtx, nullptr, ARRAYSIZE(multiQis), multiQis);\n\n        std::tuple<wil::com_ptr_t<Results, error_policy>...> resultTuple;\n\n        std::apply(\n            [i = 0, &multiQis](auto&... a) mutable {\n                (a.attach(reinterpret_cast<typename std::remove_reference<decltype(a)>::type::pointer>(multiQis[i++].pItf)), ...);\n            },\n            resultTuple);\n        return std::tuple<HRESULT, decltype(resultTuple)>(hr, std::move(resultTuple));\n    }\n\n    template <typename error_policy, typename... Results>\n    auto com_multi_query(IUnknown* obj)\n    {\n        MULTI_QI multiQis[sizeof...(Results)]{};\n        const IID* iids[sizeof...(Results)]{&__uuidof(Results)...};\n\n        static_assert(sizeof...(Results) > 0);\n\n        for (auto i = 0U; i < sizeof...(Results); ++i)\n        {\n            multiQis[i].pIID = iids[i];\n        }\n\n        std::tuple<wil::com_ptr_t<Results, error_policy>...> resultTuple{};\n\n        wil::com_ptr_nothrow<IMultiQI> multiQi;\n        auto hr = obj->QueryInterface(IID_PPV_ARGS(&multiQi));\n        if (SUCCEEDED(hr))\n        {\n            hr = multiQi->QueryMultipleInterfaces(ARRAYSIZE(multiQis), multiQis);\n            std::apply(\n                [i = 0, &multiQis](auto&... a) mutable {\n                    (a.attach(reinterpret_cast<typename std::remove_reference<decltype(a)>::type::pointer>(multiQis[i++].pItf)), ...);\n                },\n                resultTuple);\n        }\n        return std::tuple<HRESULT, decltype(resultTuple)>{hr, std::move(resultTuple)};\n    }\n} // namespace details\n/// @endcond\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n// CoCreateInstanceEx can be used to improve performance by requesting multiple interfaces\n// from an object at create time. This is most useful for out of process (OOP) servers, saving\n// and RPC per extra interface requested.\ntemplate <typename... Results>\nauto CoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER)\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_exception_policy, Results...>(clsid, clsCtx);\n    THROW_IF_FAILED(error);\n    THROW_HR_IF(E_NOINTERFACE, error == CO_S_NOTALLINTERFACES);\n    return result;\n}\n\ntemplate <typename... Results>\nauto TryCoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER)\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_exception_policy, Results...>(clsid, clsCtx);\n    return result;\n}\n#endif\n\n// Returns [error, result] where result is a tuple with each of the requested interfaces.\ntemplate <typename... Results>\nauto CoCreateInstanceExNoThrow(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_returncode_policy, Results...>(clsid, clsCtx);\n    if (SUCCEEDED(error) && (error == CO_S_NOTALLINTERFACES))\n    {\n        return std::tuple<HRESULT, decltype(result)>{E_NOINTERFACE, {}};\n    }\n    return std::tuple<HRESULT, decltype(result)>{error, result};\n}\n\ntemplate <typename... Results>\nauto TryCoCreateInstanceExNoThrow(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_returncode_policy, Results...>(clsid, clsCtx);\n    return result;\n}\n\ntemplate <typename... Results>\nauto CoCreateInstanceExFailFast(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_failfast_policy, Results...>(clsid, clsCtx);\n    FAIL_FAST_IF_FAILED(error);\n    FAIL_FAST_HR_IF(E_NOINTERFACE, error == CO_S_NOTALLINTERFACES);\n    return result;\n}\n\ntemplate <typename... Results>\nauto TryCoCreateInstanceExFailFast(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept\n{\n    auto [error, result] = details::CoCreateInstanceEx<err_failfast_policy, Results...>(clsid, clsCtx);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename... Results>\nauto com_multi_query(IUnknown* obj)\n{\n    auto [error, result] = details::com_multi_query<err_exception_policy, Results...>(obj);\n    THROW_IF_FAILED(error);\n    THROW_HR_IF(E_NOINTERFACE, error == S_FALSE);\n    return result;\n}\n\ntemplate <typename... Results>\nauto try_com_multi_query(IUnknown* obj)\n{\n    auto [error, result] = details::com_multi_query<err_exception_policy, Results...>(obj);\n    return result;\n}\n#endif\n\n#endif // __cpp_lib_apply && WI_HAS_INCLUDE(<type_traits>, 1)\n\n#pragma endregion\n\n#pragma region Stream helpers\n\n/** Read data from a stream into a buffer.\nReads up to a certain number of bytes into a buffer. Returns the amount of data written, which\nmay be less than the amount requested if the stream ran out.\n@code\nIStream* source = // ...\nULONG dataBlob = 0;\nsize_t read = 0;\nRETURN_IF_FAILED(wil::stream_read_partial_nothrow(source, &dataBlob, sizeof(dataBlob), &read));\nif (read != sizeof(dataBlob))\n{\n    // end of stream, probably\n}\nelse if (dataBlob == 0x8675309)\n{\n    DoThing(dataBlob);\n}\n@endcode\n@param stream The stream from which to read at most `size` bytes.\n@param data A buffer into which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n@param wrote The amount, in bytes, of data read from `stream` into `data`\n*/\ninline HRESULT stream_read_partial_nothrow(\n    _In_ ISequentialStream* stream, _Out_writes_bytes_to_(size, *wrote) void* data, unsigned long size, unsigned long* wrote)\n{\n    RETURN_HR(stream->Read(data, size, wrote));\n}\n\n/** Read an exact number of bytes from a stream into a buffer.\nFails if the stream didn't read all the bytes requested.\n~~~~\nIStream* source = // ...\nULONG dataBlob = 0;\nRETURN_IF_FAILED(wil::stream_read_nothrow(source, &dataBlob, sizeof(dataBlob)));\nif (dataBlob == 0x8675309)\n{\n    DoThing(dataBlob);\n}\n~~~~\n@param stream The stream from which to read at most `size` bytes.\n@param data A buffer into which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n@return The underlying stream read result, or HRESULT_FROM_WIN32(ERROR_INVALID_DATA) if the stream\n    did not read the complete buffer.\n*/\ninline HRESULT stream_read_nothrow(_In_ ISequentialStream* stream, _Out_writes_bytes_all_(size) void* data, unsigned long size)\n{\n    unsigned long didRead;\n    RETURN_IF_FAILED(stream_read_partial_nothrow(stream, data, size, &didRead));\n    RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), didRead != size);\n\n    return S_OK;\n}\n\n/** Read from a stream into a POD type.\nFails if the stream didn't have enough bytes.\n~~~~\nIStream* source = // ...\nMY_HEADER header{};\nRETURN_IF_FAILED(wil::stream_read_nothrow(source, &header));\nif (header.Version == 0x8675309)\n{\n    ConsumeOldHeader(stream, header);\n}\n~~~~\n@param stream The stream from which to read at most `size` bytes.\n@param pThing The POD data type to read from the stream.\n@return The underlying stream read result, or HRESULT_FROM_WIN32(ERROR_INVALID_DATA) if the stream\n    did not read the complete buffer.\n*/\ntemplate <typename T>\nHRESULT stream_read_nothrow(_In_ ISequentialStream* stream, _Out_ T* pThing)\n{\n    static_assert(__is_pod(T), \"Type must be POD.\");\n    return stream_read_nothrow(stream, pThing, sizeof(T));\n}\n\n/** Write an exact number of bytes to a stream from a buffer.\nFails if the stream didn't read write the bytes requested.\n~~~~\nIStream* source = // ...\nULONG dataBlob = 0x8675309;\nRETURN_IF_FAILED(wil::stream_write_nothrow(source, &dataBlob, sizeof(dataBlob)));\n~~~~\n@param stream The stream to which to write at most `size` bytes.\n@param data A buffer from which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n*/\ninline HRESULT stream_write_nothrow(_In_ ISequentialStream* stream, _In_reads_bytes_(size) const void* data, unsigned long size)\n{\n    unsigned long wrote;\n    RETURN_IF_FAILED(stream->Write(data, size, &wrote));\n    RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), wrote != size);\n\n    return S_OK;\n}\n\n/** Write a POD type to a stream.\nFails if not all the bytes were written.\n~~~~\nIStream* source = // ...\nMY_HEADER header { 0x8675309, HEADER_FLAG_1 | HEADER_FLAG_2 };\nRETURN_IF_FAILED(wil::stream_write_nothrow(source, header));\n\nULONGLONG value = 16;\nRETURN_IF_FAILED(wil::stream_write_nothrow(source, value));\n~~~~\n@param stream The stream to which to write `thing`\n@param thing The POD data type to write to the stream.\n*/\ntemplate <typename T>\ninline HRESULT stream_write_nothrow(_In_ ISequentialStream* stream, const T& thing)\n{\n    return stream_write_nothrow(stream, wistd::addressof(thing), sizeof(thing));\n}\n\n/** Retrieve the size of this stream, in bytes\n~~~~\nIStream* source = // ...\nULONGLONG size;\nRETURN_IF_FAILED(wil::stream_size_nothrow(source, &size));\nRETURN_HR_IF(E_INVALIDARG, size > ULONG_MAX);\n~~~~\n@param stream The stream whose size is to be returned in `value`\n@param value The size, in bytes, reported by `stream`\n*/\ninline HRESULT stream_size_nothrow(_In_ IStream* stream, _Out_ unsigned long long* value)\n{\n    STATSTG st{};\n    RETURN_IF_FAILED(stream->Stat(&st, STATFLAG_NONAME));\n    *value = st.cbSize.QuadPart;\n\n    return S_OK;\n}\n\n/** Seek a stream to a relative offset or absolute position\n~~~~\nIStream* source = // ...\nunsigned long long landed;\nRETURN_IF_FAILED(wil::stream_seek_nothrow(source, 16, STREAM_SEEK_CUR, &landed));\nRETURN_IF_FAILED(wil::stream_seek_nothrow(source, -5, STREAM_SEEK_END));\nRETURN_IF_FAILED(wil::stream_seek_nothrow(source, LLONG_MAX, STREAM_SEEK_CUR));\n~~~~\n@param stream The stream to seek\n@param offset The position, in bytes from the current position, to seek\n@param from The starting point from which to seek, from the STREAM_SEEK_* set of values\n@param value Optionally receives the new absolute position from the stream\n*/\ninline HRESULT stream_seek_nothrow(_In_ IStream* stream, long long offset, unsigned long from, _Out_opt_ unsigned long long* value = nullptr)\n{\n    LARGE_INTEGER amount{};\n    ULARGE_INTEGER landed{};\n    amount.QuadPart = offset;\n    RETURN_IF_FAILED(stream->Seek(amount, from, value ? &landed : nullptr));\n    assign_to_opt_param(value, landed.QuadPart);\n\n    return S_OK;\n}\n\n/** Seek a stream to an absolute offset\n~~~~\nIStream* source = // ...\nRETURN_HR(wil::stream_set_position_nothrow(source, 16));\n~~~~\n@param stream The stream whose size is to be returned in `value`\n@param offset The position, in bytes from the start of the stream, to seek to\n@param value Optionally receives the new absolute position from the stream\n*/\ninline HRESULT stream_set_position_nothrow(_In_ IStream* stream, unsigned long long offset, _Out_opt_ unsigned long long* value = nullptr)\n{\n    // IStream::Seek(..., _SET) interprets the first parameter as an unsigned value.\n    return stream_seek_nothrow(stream, static_cast<long long>(offset), STREAM_SEEK_SET, value);\n}\n\n/** Seek a relative amount in a stream\n~~~~\nIStream* source = // ...\nRETURN_IF_FAILED(wil::stream_seek_from_current_position_nothrow(source, -16));\n\nULONGLONG newPosition;\nRETURN_IF_FAILED(wil::stream_seek_from_current_position_nothrow(source, 16, &newPosition));\n~~~~\n@param stream The stream whose location is to be moved\n@param amount The offset, in bytes, to seek the stream.\n@param value Set to the new absolute steam position, in bytes\n*/\ninline HRESULT stream_seek_from_current_position_nothrow(_In_ IStream* stream, long long amount, _Out_opt_ unsigned long long* value = nullptr)\n{\n    return stream_seek_nothrow(stream, amount, STREAM_SEEK_CUR, value);\n}\n\n/** Determine the current byte position in the stream\n~~~~\nIStream* source = // ...\nULONGLONG currentPos;\nRETURN_IF_FAILED(wil::stream_get_position_nothrow(source, &currentPos));\n~~~~\n@param stream The stream whose location is to be moved\n@param position Set to the current absolute steam position, in bytes\n*/\ninline HRESULT stream_get_position_nothrow(_In_ IStream* stream, _Out_ unsigned long long* position)\n{\n    return stream_seek_from_current_position_nothrow(stream, 0, position);\n}\n\n/** Moves the stream to absolute position 0\n~~~~\nIStream* source = // ...\nRETURN_IF_FAILED(wil::stream_reset_nothrow(source));\n~~~~\n@param stream The stream whose location is to be moved\n*/\ninline HRESULT stream_reset_nothrow(_In_ IStream* stream)\n{\n    return stream_set_position_nothrow(stream, 0);\n}\n\n/** Copy data from one stream to another, returning the final amount copied.\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nULONGLONG copied;\nRETURN_IF_FAILED(wil::stream_copy_bytes_nothrow(source, target, sizeof(MyType), &copied));\nif (copied < sizeof(MyType))\n{\n    DoSomethingAboutPartialCopy();\n}\n~~~~\n@param source The stream from which to copy at most `amount` bytes\n@param target The steam to which to copy at most `amount` bytes\n@param amount The maximum number of bytes to copy from `source` to `target`\n@param pCopied If non-null, set to the number of bytes copied between the two.\n*/\ninline HRESULT stream_copy_bytes_nothrow(\n    _In_ IStream* source, _In_ IStream* target, unsigned long long amount, _Out_opt_ unsigned long long* pCopied = nullptr)\n{\n    ULARGE_INTEGER toCopy{};\n    ULARGE_INTEGER copied{};\n    toCopy.QuadPart = amount;\n    RETURN_IF_FAILED(source->CopyTo(target, toCopy, nullptr, &copied));\n    assign_to_opt_param(pCopied, copied.QuadPart);\n\n    return S_OK;\n}\n\n/** Copy all data from one stream to another, returning the final amount copied.\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nULONGLONG copied;\nRETURN_IF_FAILED(wil::stream_copy_all_nothrow(source, target, &copied));\nif (copied < 8)\n{\n   DoSomethingAboutPartialCopy();\n}\n~~~~\n@param source The stream from which to copy all content\n@param target The steam to which to copy all content\n@param pCopied If non-null, set to the number of bytes copied between the two.\n*/\ninline HRESULT stream_copy_all_nothrow(_In_ IStream* source, _In_ IStream* target, _Out_opt_ unsigned long long* pCopied = nullptr)\n{\n    return stream_copy_bytes_nothrow(source, target, ULLONG_MAX, pCopied);\n}\n\n/** Copies an exact amount of data from one stream to another, failing otherwise\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nRETURN_IF_FAILED(wil::stream_copy_all_nothrow(source, target, 16));\n~~~~\n@param source The stream from which to copy at most `amount` bytes\n@param target The steam to which to copy at most `amount` bytes\n@param amount The number of bytes to copy from `source` to `target`\n*/\ninline HRESULT stream_copy_exact_nothrow(_In_ IStream* source, _In_ IStream* target, unsigned long long amount)\n{\n    unsigned long long copied;\n    RETURN_IF_FAILED(stream_copy_bytes_nothrow(source, target, ULLONG_MAX, &copied));\n    RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), copied != amount);\n\n    return S_OK;\n}\n\n//! Controls behavior when reading a zero-length string from a stream\nenum class empty_string_options\n{\n    //! Zero-length strings are returned as nullptr\n    returns_null,\n\n    //! Zero-length strings are allocated and returned with zero characters\n    returns_empty,\n};\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n\n/** Read a string from a stream and returns an allocated copy\nDeserializes strings in streams written by both IStream_WriteStr and wil::stream_write_string[_nothrow]. The format\nis a single 16-bit quantity, followed by that many wchar_ts. The returned string is allocated with CoTaskMemAlloc.\nReturns a zero-length (but non-null) string if the stream contained a zero-length string.\n@code\nIStream* source = // ...\nwil::unique_cotaskmem_string content;\nRETURN_IF_FAILED(wil::stream_read_string_nothrow(source, &content));\nif (wcscmp(content.get(), L\"waffles\") == 0)\n{\n    // Waffles!\n}\n@endcode\n@param source The stream from which to read a string\n@param value Set to point to the allocated result of reading a string from `source`\n@param options Controls behavior when reading a zero-length string from a stream\n*/\ninline HRESULT stream_read_string_nothrow(\n    _In_ ISequentialStream* source,\n    _When_(options == empty_string_options::returns_empty, _Outptr_result_z_)\n        _When_(options == empty_string_options::returns_null, _Outptr_result_maybenull_z_) wchar_t** value,\n    empty_string_options options = empty_string_options::returns_empty)\n{\n    unsigned short cch;\n    RETURN_IF_FAILED(stream_read_nothrow(source, &cch));\n\n    if ((cch == 0) && (options == empty_string_options::returns_null))\n    {\n        *value = nullptr;\n    }\n    else\n    {\n        auto allocated = make_unique_cotaskmem_nothrow<wchar_t[]>(static_cast<size_t>(cch) + 1);\n        RETURN_IF_NULL_ALLOC(allocated);\n        RETURN_IF_FAILED(stream_read_nothrow(source, allocated.get(), static_cast<unsigned long>(cch) * sizeof(wchar_t)));\n        allocated[cch] = 0;\n\n        *value = allocated.release();\n    }\n\n    return S_OK;\n}\n\n#endif // __WIL_OBJBASE_H\n\n/** Write a string to a stream\nSerializes a string into a stream by putting its length and then the wchar_ts in the string\ninto the stream.  Zero-length strings have their length but no data written. This is the\nform expected by IStream_ReadStr and wil::string_read_stream.\n@code\nIStream* target = // ...\nRETURN_IF_FAILED(wil::stream_write_string_nothrow(target, L\"Waffles\", 3));\n// Produces wchar_t[] { 0x3, L'W', L'a', L'f' };\n@endcode\n@param target The stream to which to write a string\n@param source The string to write. Can be null if `writeLength` is zero\n@param writeLength The number of characters to write from source into `target`\n*/\ninline HRESULT stream_write_string_nothrow(_In_ ISequentialStream* target, _In_reads_opt_(writeLength) const wchar_t* source, _In_ size_t writeLength)\n{\n    FAIL_FAST_IF(writeLength > USHRT_MAX);\n\n    RETURN_IF_FAILED(stream_write_nothrow(target, static_cast<unsigned short>(writeLength)));\n\n    if (writeLength > 0)\n    {\n        RETURN_IF_FAILED(stream_write_nothrow(target, source, static_cast<unsigned short>(writeLength) * sizeof(wchar_t)));\n    }\n\n    return S_OK;\n}\n\n/** Write a string to a stream\nSerializes a string into a stream by putting its length and then the wchar_ts in the string\ninto the stream.  Zero-length strings have their length but no data written. This is the\nform expected by IStream_ReadStr and wil::string_read_stream.\n@code\nIStream* target = // ...\nRETURN_IF_FAILED(wil::stream_write_string_nothrow(target, L\"Waffles\"));\n// Produces wchar_t[] { 0x3, L'W', L'a', L'f', L'f', L'l', L'e', L's' };\n@endcode\n@param target The stream to which to write a string\n@param source The string to write. When nullptr, a zero-length string is written.\n*/\ninline HRESULT stream_write_string_nothrow(_In_ ISequentialStream* target, _In_opt_z_ const wchar_t* source)\n{\n    return stream_write_string_nothrow(target, source, source ? wcslen(source) : 0);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n\n/** Read data from a stream into a buffer.\n@code\nIStream* source = // ...\nULONG dataBlob = 0;\nauto read = wil::stream_read_partial(source, &dataBlob, sizeof(dataBlob));\nif (read != sizeof(dataBlob))\n{\n    // end of stream, probably\n}\nelse if (dataBlob == 0x8675309)\n{\n    DoThing(dataBlob);\n}\n@endcode\n@param stream The stream from which to read at most `size` bytes.\n@param data A buffer into which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n@return The amount, in bytes, of data read from `stream` into `data`\n*/\ninline unsigned long stream_read_partial(_In_ ISequentialStream* stream, _Out_writes_bytes_to_(size, return) void* data, unsigned long size)\n{\n    unsigned long didRead;\n    THROW_IF_FAILED(stream_read_partial_nothrow(stream, data, size, &didRead));\n\n    return didRead;\n}\n\n/** Read an exact number of bytes from a stream into a buffer.\nFails if the stream didn't read all the bytes requested by throwing HRESULT_FROM_WIN32(ERROR_INVALID_DATA).\n~~~~\nIStream* source = // ...\nULONG dataBlob = 0;\nwil::stream_read(source, &dataBlob, sizeof(dataBlob));\nif (dataBlob == 0x8675309)\n{\n    DoThing(dataBlob);\n}\n~~~~\n@param stream The stream from which to read at most `size` bytes.\n@param data A buffer into which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n*/\ninline void stream_read(_In_ ISequentialStream* stream, _Out_writes_bytes_all_(size) void* data, unsigned long size)\n{\n    THROW_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), stream_read_partial(stream, data, size) != size);\n}\n\n/** Read from a stream into a POD type.\nFails if the stream didn't have enough bytes by throwing HRESULT_FROM_WIN32(ERROR_INVALID_DATA).\n~~~~\nIStream* source = // ...\nMY_HEADER header = wil::stream_read<MY_HEADER>(source);\nif (header.Version == 0x8675309)\n{\n    ConsumeOldHeader(stream, header);\n}\n~~~~\n@param stream The stream from which to read at most `sizeof(T)` bytes.\n@return An instance of `T` read from the stream\n*/\ntemplate <typename T>\nT stream_read(_In_ ISequentialStream* stream)\n{\n    static_assert(__is_pod(T), \"Read type must be POD\");\n    T temp{};\n    stream_read(stream, &temp, sizeof(temp));\n\n    return temp;\n}\n\n/** Write an exact number of bytes to a stream from a buffer.\nFails if the stream didn't read write the bytes requested.\n~~~~\nIStream* source = // ...\nULONG dataBlob = 0;\nwil::stream_write(source, dataBlob, sizeof(dataBlob));\n~~~~\n@param stream The stream to which to write at most `size` bytes.\n@param data A buffer from which up to `size` bytes will be read\n@param size The size, in bytes, of the buffer pointed to by `data`\n*/\ninline void stream_write(_In_ ISequentialStream* stream, _In_reads_bytes_(size) const void* data, unsigned long size)\n{\n    THROW_IF_FAILED(stream_write_nothrow(stream, data, size));\n}\n\n/** Write a POD type to a stream.\nFails if the stream didn't accept the entire size.\n~~~~\nIStream* target = // ...\n\nMY_HEADER header { 0x8675309, HEADER_FLAG_1 | HEADER_FLAG_2 };\nwil::stream_write(target, header)\n\nwil::stream_write<ULONGLONG>(target, 16);\n~~~~\n@param stream The stream to which to write `thing`\n@param thing The POD data type to write to the stream.\n*/\ntemplate <typename T>\ninline void stream_write(_In_ ISequentialStream* stream, const T& thing)\n{\n    stream_write(stream, wistd::addressof(thing), sizeof(thing));\n}\n\n/** Retrieve the size of this stream, in bytes\n~~~~\nIStream* source = // ...\nULONGLONG size = wil::stream_size(source);\n~~~~\n@param stream The stream whose size is to be returned in `value`\n@return The size, in bytes, reported by `stream`\n*/\ninline unsigned long long stream_size(_In_ IStream* stream)\n{\n    unsigned long long size;\n    THROW_IF_FAILED(stream_size_nothrow(stream, &size));\n\n    return size;\n}\n\n/** Seek a stream to an absolute offset\n~~~~\nIStream* source = // ...\nwil::stream_set_position(source, sizeof(HEADER));\n~~~~\n@param stream The stream whose size is to be returned in `value`\n@param offset The offset, in bytes, to seek the stream.\n@return The new absolute stream position, in bytes\n*/\ninline unsigned long long stream_set_position(_In_ IStream* stream, unsigned long long offset)\n{\n    unsigned long long landed;\n    THROW_IF_FAILED(stream_set_position_nothrow(stream, offset, &landed));\n    return landed;\n}\n\n/** Seek a relative amount in a stream\n~~~~\nIStream* source = // ...\nULONGLONG newPosition = wil::stream_seek_from_current_position(source, 16);\n~~~~\n@param stream The stream whose location is to be moved\n@param amount The offset, in bytes, to seek the stream.\n@return The new absolute stream position, in bytes\n*/\ninline unsigned long long stream_seek_from_current_position(_In_ IStream* stream, long long amount)\n{\n    unsigned long long landed;\n    THROW_IF_FAILED(stream_seek_from_current_position_nothrow(stream, amount, &landed));\n\n    return landed;\n}\n\n/** Determine the current byte position in the stream\n~~~~\nIStream* source = // ...\nULONGLONG currentPos = wil::stream_get_position(source);\n~~~~\n@param stream The stream whose location is to be moved\n@return The current position reported by `stream`\n*/\ninline unsigned long long stream_get_position(_In_ IStream* stream)\n{\n    return stream_seek_from_current_position(stream, 0);\n}\n\n/** Moves the stream to absolute position 0\n~~~~\nIStream* source = // ...\nwil::stream_reset(source);\nASSERT(wil::stream_get_position(source) == 0);\n~~~~\n@param stream The stream whose location is to be moved\n*/\ninline void stream_reset(_In_ IStream* stream)\n{\n    stream_set_position(stream, 0);\n}\n\n/** Copy data from one stream to another\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nULONGLONG copied = ;\nif (wil::stream_copy_bytes(source, target, sizeof(Header)) < sizeof(Header))\n{\n   DoSomethingAboutPartialCopy();\n}\n~~~~\n@param source The stream from which to copy at most `amount` bytes\n@param target The steam to which to copy at most `amount` bytes\n@param amount The maximum number of bytes to copy from `source` to `target`\n@return The number of bytes copied between the two streams\n*/\ninline unsigned long long stream_copy_bytes(_In_ IStream* source, _In_ IStream* target, unsigned long long amount)\n{\n    unsigned long long copied;\n    THROW_IF_FAILED(stream_copy_bytes_nothrow(source, target, amount, &copied));\n\n    return copied;\n}\n\n/** Copy all data from one stream to another\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nULONGLONG copied = wil::stream_copy_all(source, target);\n~~~~\n@param source The stream from which to copy all content\n@param target The steam to which to copy all content\n@return The number of bytes copied between the two.\n*/\ninline unsigned long long stream_copy_all(_In_ IStream* source, _In_ IStream* target)\n{\n    return stream_copy_bytes(source, target, ULLONG_MAX);\n}\n\n/** Copies an exact amount of data from one stream to another, failing otherwise\n~~~~\nIStream* source = // ...\nIStream* target = // ...\nwil::stream_copy_all_nothrow(source, target, sizeof(SOMETHING));\n~~~~\n@param source The stream from which to copy at most `amount` bytes\n@param target The steam to which to copy at most `amount` bytes\n@param amount The number of bytes to copy from `source` to `target`\n*/\ninline void stream_copy_exact(_In_ IStream* source, _In_ IStream* target, unsigned long long amount)\n{\n    THROW_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), stream_copy_bytes(source, target, amount) != amount);\n}\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n\n/** Read a string from a stream and returns an allocated copy\nDeserializes strings in streams written by both IStream_WriteStr and wil::stream_write_string[_nothrow]. The format\nis a single 16-bit quantity, followed by that many wchar_ts. The returned string is allocated with CoTaskMemAlloc.\nReturns a zero-length (but non-null) string if the stream contained a zero-length string.\n@code\nIStream* source = // ...\nwil::unique_cotaskmem_string content = wil::stream_read_string(source);\nif (wcscmp(content.get(), L\"waffles\") == 0)\n{\n    // Waffles!\n}\n@endcode\n@param source The stream from which to read a string\n@param options Controls the behavior when reading a zero-length string\n@return An non-null string (but possibly zero length) string read from `source`\n*/\ninline wil::unique_cotaskmem_string stream_read_string(_In_ ISequentialStream* source, empty_string_options options = empty_string_options::returns_empty)\n{\n    wil::unique_cotaskmem_string result;\n    THROW_IF_FAILED(stream_read_string_nothrow(source, &result, options));\n\n    return result;\n}\n\n#endif // __WIL_OBJBASE_H\n\n/** Write a string to a stream\nSerializes a string into a stream by putting its length and then the wchar_ts in the string\ninto the stream.  Zero-length strings have their length but no data written. This is the\nform expected by IStream_ReadStr and wil::string_read_stream.\n~~~~\nIStream* target = // ...\nwil::stream_write_string(target, L\"Waffles\", 3);\n~~~~\n@param target The stream to which to write a string\n@param source The string to write. Can be null if `toWriteCch` is zero\n@param toWriteCch The number of characters to write from source into `target`\n*/\ninline void stream_write_string(_In_ ISequentialStream* target, _In_reads_opt_(toWriteCch) const wchar_t* source, _In_ size_t toWriteCch)\n{\n    THROW_IF_FAILED(stream_write_string_nothrow(target, source, toWriteCch));\n}\n\n/** Write a string to a stream\nSerializes a string into a stream by putting its length and then the wchar_ts in the string\ninto the stream.  Zero-length strings have their length but no data written.This is the\nform expected by IStream_ReadStr and wil::string_read_stream.\n~~~~\nIStream* target = // ...\nwil::stream_write_string(target, L\"Waffles\");\n~~~~\n@param target The stream to which to write a string\n@param source The string to write. When nullptr, a zero-length string is written.\n*/\ninline void stream_write_string(_In_ ISequentialStream* target, _In_opt_z_ const wchar_t* source)\n{\n    THROW_IF_FAILED(stream_write_string_nothrow(target, source, source ? wcslen(source) : 0));\n}\n\n/** Saves and restores the position of a stream\nUseful for potentially reading data from a stream, or being able to read ahead, then reset\nback to where one left off, such as conditionally reading content from a stream.\n@code\nvoid MaybeConsumeStream(IStream* stream)\n{\n    // On error, reset the read position in the stream to where we left off\n    auto saver = wil::stream_position_saver(stream);\n    auto header = wil::stream_read<MY_HEADER>(stream);\n    for (ULONG i = 0; i < header.Count; ++i)\n    {\n        ProcessElement(wil::stream_read<MY_ELEMENT>(stream));\n    }\n}\n@endcode\n*/\nclass stream_position_saver\n{\npublic:\n    //! Constructs a saver from the current position of this stream\n    //! @param stream The stream instance whose position is to be saved.\n    explicit stream_position_saver(_In_opt_ IStream* stream) :\n        m_stream(stream), m_position(stream ? stream_get_position(stream) : 0)\n    {\n    }\n\n    ~stream_position_saver()\n    {\n        if (m_stream)\n        {\n            LOG_IF_FAILED(stream_set_position_nothrow(m_stream.get(), m_position));\n        }\n    }\n\n    /** Updates the current position in the stream\n    @code\n    // Read a size marker from the stream, then advance that much.\n    IStream* stream1 = // ...\n    auto saver = wil::stream_position_saver(stream1);\n    auto size = wil::stream_read<long>(stream1);\n    wil::stream_seek_from_current_position(stream, size);\n    saver.update();\n    @endcode\n    */\n    void update()\n    {\n        m_position = stream_get_position(m_stream.get());\n    }\n\n    //! Returns the current position being saved for the stream\n    //! @returns The position, in bytes, being saved for the stream\n    WI_NODISCARD unsigned long long position() const\n    {\n        return m_position;\n    }\n\n    /** Resets the position saver to manage a new stream\n    Reverts the position of any stream this saver is currently holding a place for.\n    ~~~~\n    IStream* stream1 = // ...\n    IStream* stream2 = // ...\n    auto saver = wil::stream_position_saver(stream1);\n    if (wil::stream_read<MyType>(stream1).Flags != 0)\n    {\n        saver.reset(stream2); // position in stream1 is reverted, now holding stream2\n    }\n    ~~~~\n    @param stream The stream whose position is to be saved\n    */\n    void reset(_In_ IStream* stream)\n    {\n        reset();\n\n        m_stream = stream;\n        m_position = wil::stream_get_position(m_stream.get());\n    }\n\n    /** Resets the position of the stream\n    ~~~~\n    IStream* stream1 = // ...\n    auto saver = wil::stream_position_saver(stream1);\n    MyType mt = wil::stream_read<MyType>(stream1);\n    if (mt.Flags & MyTypeFlags::Extended)\n    {\n        saver.reset();\n        ProcessExtended(stream1, wil::stream_read<MyTypeExtended>(stream1));\n    }\n    else\n    {\n        ProcessStandard(stream1, mt);\n    }\n    ~~~~\n    */\n    void reset()\n    {\n        if (m_stream)\n        {\n            wil::stream_set_position(m_stream.get(), m_position);\n        }\n    }\n\n    /** Stops saving the position of the stream\n    @code\n    // The stream has either a standard or extended header, followed by interesting content.\n    // Read either one, leaving the stream after the headers have been read off. On failure,\n    // the stream's position is restored.\n    std::pair<MyType, MyTypeExtended> get_headers(_In_ IStream* source)\n    {\n        auto saver = wil::stream_position_saver(stream1);\n        MyType mt = wil::stream_read<MyType>(stream1);\n        MyTypeExtended mte{};\n        if (mt.Flags & MyTypeFlags::Extended)\n        {\n            mte = wil::stream_read<MyTypeExtended>(stream1);\n        }\n        saver.dismiss();\n        return { mt, mte };\n    }\n    @endcode\n    */\n    void dismiss()\n    {\n        m_stream.reset();\n    }\n\n    stream_position_saver(stream_position_saver&&) = default;\n    stream_position_saver& operator=(stream_position_saver&&) = default;\n\n    stream_position_saver(const stream_position_saver&) = delete;\n    void operator=(const stream_position_saver&) = delete;\n\nprivate:\n    com_ptr<IStream> m_stream;\n    unsigned long long m_position;\n};\n#endif            // WIL_ENABLE_EXCEPTIONS\n#pragma endregion // stream helpers\n\n#if defined(__IObjectWithSite_INTERFACE_DEFINED__) || defined(WIL_DOXYGEN)\n/// @cond\nnamespace details\n{\n    inline void __stdcall SetSiteNull(IObjectWithSite* objWithSite)\n    {\n        objWithSite->SetSite(nullptr); // break the cycle\n    }\n} // namespace details\n/// @endcond\n\nusing unique_set_site_null_call = wil::unique_com_call<IObjectWithSite, decltype(details::SetSiteNull), details::SetSiteNull>;\n\n/** RAII support for managing the site chain. This function sets the site pointer on an object and return an object\nthat resets it on destruction to break the cycle.\nNote, this does not preserve the existing site if there is one (an uncommon case) so only use this when that is not required.\n~~~\nauto cleanup = wil::com_set_site(execCommand.get(), serviceProvider->GetAsSite());\n~~~\nInclude ocidl.h before wil/com.h to use this.\n*/\nWI_NODISCARD inline unique_set_site_null_call com_set_site(_In_opt_ IUnknown* obj, _In_opt_ IUnknown* site)\n{\n    wil::com_ptr_nothrow<IObjectWithSite> objWithSite;\n    if (site && wil::try_com_copy_to(obj, &objWithSite))\n    {\n        objWithSite->SetSite(site);\n    }\n    return unique_set_site_null_call(objWithSite.get());\n}\n\n/** Iterate over each object in a site chain. Useful for debugging site issues, here is sample use.\n~~~\nvoid OutputDebugSiteChainWatchWindowText(IUnknown* site)\n{\n    OutputDebugStringW(L\"Copy and paste these entries into the Visual Studio Watch Window\\n\");\n    wil::for_each_site(site, [](IUnknown* site)\n    {\n        wchar_t msg[64];\n        StringCchPrintfW(msg, ARRAYSIZE(msg), L\"((IUnknown*)0x%p)->__vfptr[0]\\n\", site);\n        OutputDebugStringW(msg);\n    });\n}\n~~~\n*/\n\ntemplate <typename TLambda>\nvoid for_each_site(_In_opt_ IUnknown* siteInput, TLambda&& callback)\n{\n    wil::com_ptr_nothrow<IUnknown> site(siteInput);\n    while (site)\n    {\n        callback(site.get());\n        auto objWithSite = site.try_query<IObjectWithSite>();\n        site.reset();\n        if (objWithSite)\n        {\n            objWithSite->GetSite(IID_PPV_ARGS(&site));\n        }\n    }\n}\n\n#endif // __IObjectWithSite_INTERFACE_DEFINED__\n\n#if __cpp_deduction_guides >= 201703L\n#ifdef WIL_ENABLE_EXCEPTIONS\n/// @cond\nnamespace details\n{\n    template <typename>\n    struct com_enumerator_next_traits;\n\n    template <typename Itf, typename T, typename Ret>\n    struct com_enumerator_next_traits<Ret (__stdcall Itf::*)(ULONG, T*, ULONG*)>\n    {\n        using Interface = Itf;\n        using Result = T;\n    };\n\n    template <typename Itf, typename T, typename Ret>\n    struct com_enumerator_next_traits<Ret (__stdcall Itf::*)(ULONG, T*, ULONG*) noexcept>\n    {\n        using Interface = Itf;\n        using Result = T;\n    };\n\n    template <typename T>\n    struct has_next\n    {\n        template <typename U = T>\n        static auto test(int) -> decltype(wistd::declval<U>()->Next(0, nullptr, nullptr), wistd::true_type{});\n\n        template <typename>\n        static auto test(...) -> wistd::false_type;\n\n        static constexpr bool value = decltype(test<T>(0))::value;\n    };\n\n    template <typename T>\n    constexpr bool has_next_v = has_next<T>::value;\n\n    template <typename T>\n    struct You_must_specify_Smart_Output_type_explicitly\n    {\n        // If you get this error, you must specify a smart pointer type to receive the enumerated objects.\n        // We deduce the enumerator's output type (the type of the second parameter to the Next method).\n        // If that type is a COM pointer type (IFoo*), then we use wil::com_ptr<IFoo>. Otherwise, you must explicitly\n        // specify a smart-object type to receive the enumerated objects as it is not obvious how to handle disposing\n        // of an enumerated object.\n        // For example, if you have an enumerator that enumerates BSTRs, you must specify wil::unique_bstr as the\n        // smart pointer type to receive the enumerated BSTRs.\n        // auto it = wil::com_iterator<wil::unique_bstr>(pEnumBStr);\n        static_assert(\n            wistd::is_same_v<T, void>,\n            \"Couldn't deduce a smart pointer type for the enumerator's output. You must explicitly specify a smart-object type to receive the enumerated objects.\");\n    };\n\n    template <typename Interface>\n    struct com_enumerator_traits\n    {\n        using Result = typename com_enumerator_next_traits<decltype(&Interface::Next)>::Result;\n\n        // If the result is a COM pointer type (IFoo*), then we use wil::com_ptr<IFoo>.\n        // Otherwise, you must explicitly specify a smart output type.\n        using smart_result = wistd::conditional_t<\n            wistd::is_pointer_v<Result> && wistd::is_base_of_v<::IUnknown, wistd::remove_pointer_t<Result>>,\n            wil::com_ptr<wistd::remove_pointer_t<Result>>,\n            You_must_specify_Smart_Output_type_explicitly<Interface>>;\n    };\n} // namespace details\n/// @endcond\n\ntemplate <typename TStoredType, typename IEnumType>\nstruct com_iterator\n{\n    using TActualStoredType =\n        wistd::conditional_t<wistd::is_same_v<TStoredType, void>, typename wil::details::com_enumerator_traits<IEnumType>::smart_result, TStoredType>;\n\n    wil::com_ptr<IEnumType> m_enum{};\n    TActualStoredType m_currentValue{};\n\n    using smart_result = TActualStoredType;\n    com_iterator(com_iterator&&) = default;\n    com_iterator(com_iterator const&) = default;\n    com_iterator& operator=(com_iterator&&) = default;\n    com_iterator& operator=(com_iterator const&) = default;\n\n    com_iterator(IEnumType* enumPtr) : m_enum(enumPtr)\n    {\n        FetchNext();\n    }\n\n    auto operator->()\n    {\n        return wistd::addressof(m_currentValue);\n    }\n\n    auto& operator*()\n    {\n        return m_currentValue;\n    }\n\n    const auto& operator*() const\n    {\n        return m_currentValue;\n    }\n\n    com_iterator& operator++()\n    {\n        // If we're already at the end, don't try to advance. Otherwise, use Next to advance.\n        if (m_enum)\n        {\n            FetchNext();\n        }\n\n        return *this;\n    }\n\n    bool operator!=(com_iterator const& other) const\n    {\n        return !(*this == other);\n    }\n\n    bool operator==(com_iterator const& other) const\n    {\n        return (m_enum.get() == other.m_enum.get());\n    }\n\nprivate:\n    void FetchNext()\n    {\n        if (m_enum)\n        {\n            // we cannot say m_currentValue = {} because com_ptr has 2 operator= overloads: one for T* and one for nullptr_t\n            m_currentValue = TActualStoredType{};\n            auto hr = m_enum->Next(1, &m_currentValue, nullptr);\n            if (hr == S_FALSE)\n            {\n                m_enum = nullptr;\n            }\n            else\n            {\n                THROW_IF_FAILED_MSG(hr, \"Failed to get next\");\n            }\n        }\n    }\n};\n\n// CTAD for com_iterator\n\ntemplate <typename IEnumType>\ncom_iterator(IEnumType*) -> com_iterator<void, IEnumType>;\n\ntemplate <typename TStoredType = void, typename IEnumXxx, wistd::enable_if_t<wil::details::has_next_v<IEnumXxx*>, int> = 0>\nWI_NODISCARD auto make_range(IEnumXxx* enumPtr)\n{\n    using TActualStoredType =\n        wistd::conditional_t<wistd::is_same_v<TStoredType, void>, typename wil::details::com_enumerator_traits<IEnumXxx>::smart_result, TStoredType>;\n\n    struct iterator_range\n    {\n\n        static_assert(!wistd::is_same_v<TActualStoredType, void>, \"You must specify a type to receive the enumerated objects.\");\n\n        // the stored type must be constructible from the output type of the enumerator\n        static_assert(\n            wistd::is_constructible_v<TActualStoredType, typename wil::details::com_enumerator_traits<IEnumXxx>::Result>,\n            \"The type you specified cannot be converted to the enumerator's output type.\");\n\n        using enumerator_type = com_iterator<TActualStoredType, IEnumXxx>;\n\n        wil::com_ptr<IEnumXxx> m_enumerator{};\n        iterator_range(IEnumXxx* enumPtr) : m_enumerator(enumPtr)\n        {\n        }\n\n        WI_NODISCARD auto begin()\n        {\n            return enumerator_type(m_enumerator.get());\n        }\n\n        WI_NODISCARD constexpr auto end() const noexcept\n        {\n            return enumerator_type(nullptr);\n        }\n    };\n\n    return iterator_range(enumPtr);\n}\n\ntemplate <typename TEnum, typename = wistd::enable_if_t<wil::details::has_next_v<TEnum*>>>\nauto make_range(const wil::com_ptr<TEnum>& e)\n{\n    using Enumerated = typename wil::details::com_enumerator_traits<TEnum>::smart_result;\n    return wil::make_range<Enumerated>(e.get());\n}\n\n#ifdef __IShellItemArray_INTERFACE_DEFINED__\ninline auto make_range(IShellItemArray* sia)\n{\n    wil::com_ptr<IEnumShellItems> enumShellItems;\n    THROW_IF_FAILED(sia->EnumItems(&enumShellItems));\n    return make_range(enumShellItems);\n}\n\ninline auto make_range(const wil::com_ptr<IShellItemArray>& sia)\n{\n    return make_range(sia.get());\n}\n#endif // __IShellItemArray_INTERFACE_DEFINED__\n\n#endif // __cpp_deduction_guides >= 201703L\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\nnamespace details\n{\n    inline void CoDisableCallCancellationNull()\n    {\n        (void)::CoDisableCallCancellation(nullptr);\n    }\n} // namespace details\n\n/** RAII support for making cross-apartment (or cross process) COM calls with a timeout applied to them.\n * When this is active any timed out calls will fail with an RPC error code such as RPC_E_CALL_CANCELED.\n * This is a shared timeout that applies to all calls made on the current thread for the lifetime of\n * the wil::com_timeout object.\n * A periodic timer is used to cancel calls that have been blocked too long.  If multiple blocking calls\n * are made, and multiple are timing out, then there may be a total delay of (timeoutInMilliseconds * N)\n * where N is the number of calls.\n~~~\n{\n  auto timeout = wil::com_timeout(5000);\n  remote_object->BlockingCOMCall();\n  remote_object->AnotherBlockingCOMCall();\n}\n~~~\n*/\ntemplate <typename err_policy>\nclass com_timeout_t\n{\npublic:\n    com_timeout_t(DWORD timeoutInMilliseconds) : m_threadId(GetCurrentThreadId())\n    {\n        const HRESULT cancelEnablementResult = CoEnableCallCancellation(nullptr);\n        err_policy::HResult(cancelEnablementResult);\n        if (SUCCEEDED(cancelEnablementResult))\n        {\n            m_ensureDisable.activate();\n\n            m_timer.reset(CreateThreadpoolTimer(&com_timeout_t::timer_callback, this, nullptr));\n            err_policy::LastErrorIfFalse(static_cast<bool>(m_timer));\n            if (m_timer)\n            {\n                FILETIME ft = filetime::get_system_time();\n                ft = filetime::add(ft, filetime::convert_msec_to_100ns(timeoutInMilliseconds));\n                SetThreadpoolTimer(m_timer.get(), &ft, timeoutInMilliseconds, 0);\n            }\n        }\n    }\n\n    bool timed_out() const\n    {\n        return m_timedOut;\n    }\n\n    operator bool() const noexcept\n    {\n        // All construction calls must succeed to provide us with a non-null m_timer value.\n        return static_cast<bool>(m_timer);\n    }\n\nprivate:\n    // Disable use of new as this class should only be declared on the stack, never the heap.\n    void* operator new(size_t) = delete;\n    void* operator new[](size_t) = delete;\n\n    // not copyable or movable because the timer_callback receives \"this\"\n    com_timeout_t(com_timeout_t const&) = delete;\n    void operator=(com_timeout_t const&) = delete;\n\n    static void __stdcall timer_callback(PTP_CALLBACK_INSTANCE /*instance*/, PVOID context, PTP_TIMER /*timer*/)\n    {\n        // The timer is waited upon during destruction so it is safe to rely on the this pointer in context.\n        com_timeout_t* self = static_cast<com_timeout_t*>(context);\n        if (SUCCEEDED(CoCancelCall(self->m_threadId, 0)))\n        {\n            self->m_timedOut = true;\n        }\n    }\n\n    wil::unique_call<decltype(&details::CoDisableCallCancellationNull), details::CoDisableCallCancellationNull, false> m_ensureDisable{};\n    DWORD m_threadId{};\n    bool m_timedOut{};\n\n    // The threadpool timer goes last so that it destructs first, waiting until the timer callback has completed.\n    wil::unique_threadpool_timer_nocancel m_timer;\n};\n\n// Error-policy driven forms of com_timeout\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! COM timeout, errors throw exceptions (see @ref com_timeout_t for details)\nusing com_timeout = com_timeout_t<err_exception_policy>;\n#endif\n\n//! COM timeout, errors return error codes (see @ref com_timeout_t for details)\nusing com_timeout_nothrow = com_timeout_t<err_returncode_policy>;\n\n//! COM timeout, errors fail-fast (see @ref com_timeout_t for details)\nusing com_timeout_failfast = com_timeout_t<err_failfast_policy>;\n\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n} // namespace wil\n\n#endif\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/com_apartment_variable.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Smart pointers and other thin usability pattern wrappers over COM patterns.\n#ifndef __WIL_COM_APARTMENT_VARIABLE_INCLUDED\n#define __WIL_COM_APARTMENT_VARIABLE_INCLUDED\n\n#include <any>\n#include <objidl.h>\n#include <roapi.h>\n#include <type_traits>\n#include <unordered_map>\n#include <winrt/Windows.Foundation.h>\n\n#include \"com.h\"\n#include \"cppwinrt.h\"\n#include \"result_macros.h\"\n#include \"win32_helpers.h\"\n\n#ifndef WIL_ENABLE_EXCEPTIONS\n#error This header requires exceptions\n#endif\n\nnamespace wil\n{\n// Determine if apartment variables are supported in the current process context.\n// Prior to build 22365, the APIs needed to create apartment variables (e.g. RoGetApartmentIdentifier)\n// failed for unpackaged processes. For MS people, see http://task.ms/31861017 for details.\n// APIs needed to implement apartment variables did not work in non-packaged processes.\ninline bool are_apartment_variables_supported()\n{\n    unsigned long long apartmentId{};\n    return RoGetApartmentIdentifier(&apartmentId) != HRESULT_FROM_WIN32(ERROR_API_UNAVAILABLE);\n}\n\n// COM will implicitly rundown the apartment registration when it invokes a handler\n// and blocks calling unregister when executing the callback. So be careful to release()\n// this when callback is invoked to avoid a double free of the cookie.\nusing unique_apartment_shutdown_registration =\n    unique_any<APARTMENT_SHUTDOWN_REGISTRATION_COOKIE, decltype(&::RoUnregisterForApartmentShutdown), ::RoUnregisterForApartmentShutdown>;\n\nstruct apartment_variable_platform\n{\n    static unsigned long long GetApartmentId()\n    {\n        unsigned long long apartmentId{};\n        FAIL_FAST_IF_FAILED(RoGetApartmentIdentifier(&apartmentId));\n        return apartmentId;\n    }\n\n    static auto RegisterForApartmentShutdown(IApartmentShutdown* observer)\n    {\n        unsigned long long id{};\n        shutdown_type cookie;\n        THROW_IF_FAILED(RoRegisterForApartmentShutdown(observer, &id, cookie.put()));\n        return cookie;\n    }\n\n    static void UnRegisterForApartmentShutdown(APARTMENT_SHUTDOWN_REGISTRATION_COOKIE cookie)\n    {\n        FAIL_FAST_IF_FAILED(RoUnregisterForApartmentShutdown(cookie));\n    }\n\n    static auto CoInitializeEx(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/)\n    {\n        return wil::CoInitializeEx(coinitFlags);\n    }\n\n    // disable the test hook\n    inline static constexpr unsigned long AsyncRundownDelayForTestingRaces = INFINITE;\n\n    using shutdown_type = wil::unique_apartment_shutdown_registration;\n};\n\nenum class apartment_variable_leak_action\n{\n    fail_fast,\n    ignore\n};\n\n// \"pins\" the current module in memory by incrementing the module reference count and leaking that.\ninline void ensure_module_stays_loaded()\n{\n    static INIT_ONCE s_initLeakModule{}; // avoiding magic statics\n    wil::init_once_failfast(s_initLeakModule, []() {\n        HMODULE result{};\n        FAIL_FAST_IF(!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, L\"\", &result));\n        return S_OK;\n    });\n}\n\n/// @cond\nnamespace details\n{\n    // For the address of data, you can detect global variables by the ability to resolve the module from the address.\n    inline bool IsGlobalVariable(const void* moduleAddress) noexcept\n    {\n        wil::unique_hmodule moduleHandle;\n        return GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, static_cast<PCWSTR>(moduleAddress), &moduleHandle) != FALSE;\n    }\n\n    struct any_maker_base\n    {\n        std::any (*adapter)(void*);\n        void* inner;\n\n        WI_NODISCARD std::any operator()() const\n        {\n            return adapter(inner);\n        }\n    };\n\n    template <typename T>\n    struct any_maker : any_maker_base\n    {\n        any_maker()\n        {\n            adapter = [](auto) -> std::any {\n                return T{};\n            };\n        }\n\n        any_maker(T (*maker)())\n        {\n            adapter = [](auto maker) -> std::any {\n                return reinterpret_cast<T (*)()>(maker)();\n            };\n            inner = reinterpret_cast<void*>(maker);\n        }\n\n        template <typename F>\n        any_maker(F&& f)\n        {\n            adapter = [](auto maker) -> std::any {\n                return reinterpret_cast<F*>(maker)[0]();\n            };\n            inner = std::addressof(f);\n        }\n    };\n\n    template <apartment_variable_leak_action leak_action = apartment_variable_leak_action::fail_fast, typename test_hook = apartment_variable_platform>\n    struct apartment_variable_base\n    {\n        inline static winrt::slim_mutex s_lock;\n\n        struct apartment_variable_storage\n        {\n            apartment_variable_storage(apartment_variable_storage&& other) noexcept = default;\n            apartment_variable_storage(const apartment_variable_storage& other) = delete;\n\n            apartment_variable_storage(typename test_hook::shutdown_type&& cookie_) : cookie(std::move(cookie_))\n            {\n            }\n\n            winrt::apartment_context context;\n            typename test_hook::shutdown_type cookie;\n            // Variables are stored using the address of the apartment_variable_base<> as the key.\n            std::unordered_map<apartment_variable_base<leak_action, test_hook>*, std::any> variables;\n        };\n\n        // Apartment id -> variables storage.\n        inline static wil::object_without_destructor_on_shutdown<std::unordered_map<unsigned long long, apartment_variable_storage>> s_apartmentStorage;\n\n        constexpr apartment_variable_base() = default;\n        ~apartment_variable_base()\n        {\n            // Global variables (object with static storage duration)\n            // are run down when the process is shutting down or when the\n            // dll is unloaded. At these points it is not possible to start\n            // an async operation and the work performed is not needed,\n            // the apartments with variable have been run down already.\n            const auto isGlobal = details::IsGlobalVariable(this);\n            if (!isGlobal)\n            {\n                clear_all_apartments_async();\n            }\n\n            if constexpr (leak_action == apartment_variable_leak_action::fail_fast)\n            {\n                if (isGlobal && !ProcessShutdownInProgress())\n                {\n                    // If you hit this fail fast it means the storage in s_apartmentStorage will be leaked.\n                    // For apartment variables used in .exes, this is expected and\n                    // this fail fast should be disabled using\n                    // wil::apartment_variable<T, wil::apartment_variable_leak_action::ignore>\n                    //\n                    // For DLLs, if this is expected, disable this fail fast using\n                    // wil::apartment_variable<T, wil::apartment_variable_leak_action::ignore>\n                    //\n                    // Use of apartment variables in DLLs only loaded by COM will never hit this case\n                    // as COM will unload DLLs before apartments are rundown,\n                    // providing the opportunity to empty s_apartmentStorage.\n                    //\n                    // But DLLs loaded and unloaded to call DLL entry points (outside of COM) may\n                    // create variable storage that can't be cleaned up as the DLL lifetime is\n                    // shorter that the COM lifetime. In these cases either\n                    // 1) accept the leaks and disable the fail fast as describe above\n                    // 2) disable module unloading by calling wil::ensure_module_stays_loaded\n                    // 3) CoCreate an object from this DLL to make COM aware of the DLL\n                    FAIL_FAST_IF(!s_apartmentStorage.get().empty());\n                }\n            }\n        }\n\n        // non-copyable, non-assignable\n        apartment_variable_base(apartment_variable_base const&) = delete;\n        void operator=(apartment_variable_base const&) = delete;\n\n        // get current value or throw if no value has been set\n        std::any& get_existing()\n        {\n            auto any = get_if();\n            if (!any)\n            {\n                THROW_HR(E_NOT_SET);\n            }\n\n            return *any;\n        }\n\n        static apartment_variable_storage* get_current_apartment_variable_storage()\n        {\n            auto storage = s_apartmentStorage.get().find(test_hook::GetApartmentId());\n            if (storage != s_apartmentStorage.get().end())\n            {\n                return &storage->second;\n            }\n            return nullptr;\n        }\n\n        apartment_variable_storage* ensure_current_apartment_variables()\n        {\n            auto variables = get_current_apartment_variable_storage();\n            if (variables)\n            {\n                return variables;\n            }\n\n            struct ApartmentObserver : public winrt::implements<ApartmentObserver, IApartmentShutdown>\n            {\n                void STDMETHODCALLTYPE OnUninitialize(unsigned long long apartmentId) noexcept override\n                {\n                    // This code runs at apartment rundown so be careful to avoid deadlocks by\n                    // extracting the variables under the lock then release them outside.\n                    auto variables = [apartmentId]() {\n                        auto lock = winrt::slim_lock_guard(s_lock);\n                        return s_apartmentStorage.get().extract(apartmentId);\n                    }();\n                    WI_ASSERT(variables.key() == apartmentId);\n                    // The system implicitly releases the shutdown observer\n                    // after invoking the callback and does not allow calling unregister\n                    // in the callback. So release the reference to the registration.\n                    variables.mapped().cookie.release();\n                }\n            };\n            auto shutdownRegistration = test_hook::RegisterForApartmentShutdown(winrt::make<ApartmentObserver>().get());\n            return &s_apartmentStorage.get()\n                        .insert({test_hook::GetApartmentId(), apartment_variable_storage(std::move(shutdownRegistration))})\n                        .first->second;\n        }\n\n        // get current value or custom-construct one on demand\n        template <typename T>\n        std::any& get_or_create(any_maker<T>&& creator)\n        {\n            apartment_variable_storage* variable_storage = nullptr;\n\n            { // scope for lock\n                auto lock = winrt::slim_lock_guard(s_lock);\n                variable_storage = ensure_current_apartment_variables();\n\n                auto variable = variable_storage->variables.find(this);\n                if (variable != variable_storage->variables.end())\n                {\n                    return variable->second;\n                }\n            } // drop the lock\n\n            // create the object outside the lock to avoid reentrant deadlock\n            auto value = creator();\n\n            auto insert_lock = winrt::slim_lock_guard(s_lock);\n            // The insertion may fail if creator() recursively caused itself to be created,\n            // in which case we return the existing object and the falsely-created one is discarded.\n            return variable_storage->variables.insert({this, std::move(value)}).first->second;\n        }\n\n        // get pointer to current value or nullptr if no value has been set\n        std::any* get_if()\n        {\n            auto lock = winrt::slim_lock_guard(s_lock);\n\n            if (auto variable_storage = get_current_apartment_variable_storage())\n            {\n                auto variable = variable_storage->variables.find(this);\n                if (variable != variable_storage->variables.end())\n                {\n                    return &(variable->second);\n                }\n            }\n            return nullptr;\n        }\n\n        // replace or create the current value, fail fasts if the value is not already stored\n        void set(std::any value)\n        {\n            // release value, with the swapped value, outside of the lock\n            {\n                auto lock = winrt::slim_lock_guard(s_lock);\n                auto storage = s_apartmentStorage.get().find(test_hook::GetApartmentId());\n                FAIL_FAST_IF(storage == s_apartmentStorage.get().end());\n                auto& variable_storage = storage->second;\n                auto variable = variable_storage.variables.find(this);\n                FAIL_FAST_IF(variable == variable_storage.variables.end());\n                variable->second.swap(value);\n            }\n        }\n\n        // remove any current value\n        void clear()\n        {\n            auto lock = winrt::slim_lock_guard(s_lock);\n            if (auto variable_storage = get_current_apartment_variable_storage())\n            {\n                variable_storage->variables.erase(this);\n                if (variable_storage->variables.size() == 0)\n                {\n                    s_apartmentStorage.get().erase(test_hook::GetApartmentId());\n                }\n            }\n        }\n\n        winrt::Windows::Foundation::IAsyncAction clear_all_apartments_async()\n        {\n            // gather all the apartments that hold objects we need to destruct\n            // (do not gather the objects themselves, because the apartment might\n            // destruct before we get around to it, and we should let the apartment\n            // destruct the object while it still can).\n\n            std::vector<winrt::apartment_context> contexts;\n            { // scope for lock\n                auto lock = winrt::slim_lock_guard(s_lock);\n                for (auto& [id, storage] : s_apartmentStorage.get())\n                {\n                    auto variable = storage.variables.find(this);\n                    if (variable != storage.variables.end())\n                    {\n                        contexts.push_back(storage.context);\n                    }\n                }\n            }\n\n            if (contexts.empty())\n            {\n                co_return;\n            }\n\n            wil::unique_mta_usage_cookie mta_reference; // need to extend the MTA due to async cleanup\n            FAIL_FAST_IF_FAILED(CoIncrementMTAUsage(mta_reference.put()));\n\n            // From a background thread hop into each apartment to run down the object\n            // if it's still there.\n            co_await winrt::resume_background();\n\n            // This hook enables testing the case where execution of this method loses the race with\n            // apartment rundown by other means.\n            if constexpr (test_hook::AsyncRundownDelayForTestingRaces != INFINITE)\n            {\n                Sleep(test_hook::AsyncRundownDelayForTestingRaces);\n            }\n\n            for (auto&& context : contexts)\n            {\n                try\n                {\n                    co_await context;\n                    clear();\n                }\n                catch (winrt::hresult_error const& e)\n                {\n                    // Ignore failure if apartment ran down before we could clean it up.\n                    // The object already ran down as part of apartment cleanup.\n                    if ((e.code() != RPC_E_SERVER_DIED_DNE) && (e.code() != RPC_E_DISCONNECTED))\n                    {\n                        throw;\n                    }\n                }\n                catch (...)\n                {\n                    FAIL_FAST();\n                }\n            }\n        }\n\n        static const auto& storage()\n        {\n            return s_apartmentStorage.get();\n        }\n\n        static size_t current_apartment_variable_count()\n        {\n            auto lock = winrt::slim_lock_guard(s_lock);\n            if (auto variable_storage = get_current_apartment_variable_storage())\n            {\n                return variable_storage->variables.size();\n            }\n            return 0;\n        }\n    };\n} // namespace details\n/// @endcond\n\n// Apartment variables enable storing COM objects safely in globals\n// (objects with static storage duration) by creating a unique copy\n// in each apartment and managing their lifetime based on apartment rundown\n// notifications.\n// They can also be used for automatic or dynamic storage duration but those\n// cases are less common.\n// This type is also useful for storing references to apartment affine objects.\n//\n// Note, that apartment variables hosted in a COM DLL need to integrate with\n// the DllCanUnloadNow() function to include the ref counts contributed by\n// C++ WinRT objects. This is automatic for DLLs that host C++ WinRT objects\n// but WRL projects will need to be updated to call winrt::get_module_lock().\n\ntemplate <typename T, apartment_variable_leak_action leak_action = apartment_variable_leak_action::fail_fast, typename test_hook = wil::apartment_variable_platform>\nstruct apartment_variable : details::apartment_variable_base<leak_action, test_hook>\n{\n    using base = details::apartment_variable_base<leak_action, test_hook>;\n\n    constexpr apartment_variable() = default;\n\n    // Get current value or throw if no value has been set.\n    T& get_existing()\n    {\n        return std::any_cast<T&>(base::get_existing());\n    }\n\n    // Get current value or default-construct one on demand.\n    T& get_or_create()\n    {\n        return std::any_cast<T&>(base::get_or_create(details::any_maker<T>()));\n    }\n\n    // Get current value or custom-construct one on demand.\n    template <typename F>\n    T& get_or_create(F&& f)\n    {\n        return std::any_cast<T&>(base::get_or_create(details::any_maker<T>(std::forward<F>(f))));\n    }\n\n    // get pointer to current value or nullptr if no value has been set\n    T* get_if()\n    {\n        return std::any_cast<T>(base::get_if());\n    }\n\n    // replace or create the current value, fail fasts if the value is not already stored\n    template <typename V>\n    void set(V&& value)\n    {\n        return base::set(std::forward<V>(value));\n    }\n\n    // Clear the value in the current apartment.\n    using base::clear;\n\n    // Asynchronously clear the value in all apartments it is present in.\n    using base::clear_all_apartments_async;\n\n    // For testing only.\n    // 1) To observe the state of the storage in the debugger assign this to\n    // a temporary variable (const&) and watch its contents.\n    // 2) Use this to test the implementation.\n    using base::storage;\n    // For testing only. The number of variables in the current apartment.\n    using base::current_apartment_variable_count;\n};\n} // namespace wil\n\n#endif // __WIL_COM_APARTMENT_VARIABLE_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/common.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Common Helpers: Provides broadly applicable, dependency-free pure C++ helpers, macros and type traits.\n#ifndef __WIL_COMMON_INCLUDED\n#define __WIL_COMMON_INCLUDED\n\n#if defined(_KERNEL_MODE) && !defined(__WIL_MIN_KERNEL)\n// This define indicates that the WIL usage is in a kernel mode context where\n// a high degree of WIL functionality is desired.\n//\n// Use (sparingly) to change behavior based on whether WIL is being used in kernel\n// mode or user mode.\n#define WIL_KERNEL_MODE\n#endif\n\n// Defining WIL_HIDE_DEPRECATED will hide everything deprecated.\n// Each wave of deprecation will add a new WIL_HIDE_DEPRECATED_YYMM number that can be used to lock deprecation at\n// a particular point, allowing components to avoid backslide and catch up to the current independently.\n/// @cond\n#ifdef WIL_HIDE_DEPRECATED\n#define WIL_HIDE_DEPRECATED_1809\n#endif\n#ifdef WIL_HIDE_DEPRECATED_1809\n#define WIL_HIDE_DEPRECATED_1612\n#endif\n#ifdef WIL_HIDE_DEPRECATED_1612\n#define WIL_HIDE_DEPRECATED_1611\n#endif\n/// @endcond\n\n// Implementation side note: ideally the deprecation would be done with the function-level declspec\n// as it allows you to utter the error text when used.  The declspec works, but doing it selectively with\n// a macro makes intellisense deprecation comments not work.  So we just use the #pragma deprecation.\n/// @cond\n#ifdef WIL_WARN_DEPRECATED\n#define WIL_WARN_DEPRECATED_1809\n#endif\n#ifdef WIL_WARN_DEPRECATED_1809\n#define WIL_WARN_DEPRECATED_1612\n#endif\n#ifdef WIL_WARN_DEPRECATED_1612\n#define WIL_WARN_DEPRECATED_1611\n#endif\n#ifdef WIL_WARN_DEPRECATED_1809\n#define WIL_WARN_DEPRECATED_1809_PRAGMA(...) __pragma(deprecated(__VA_ARGS__))\n#else\n#define WIL_WARN_DEPRECATED_1809_PRAGMA(...)\n#endif\n#ifdef WIL_WARN_DEPRECATED_1611\n#define WIL_WARN_DEPRECATED_1611_PRAGMA(...) __pragma(deprecated(__VA_ARGS__))\n#else\n#define WIL_WARN_DEPRECATED_1611_PRAGMA(...)\n#endif\n#ifdef WIL_WARN_DEPRECATED_1612\n#define WIL_WARN_DEPRECATED_1612_PRAGMA(...) __pragma(deprecated(__VA_ARGS__))\n#else\n#define WIL_WARN_DEPRECATED_1612_PRAGMA(...)\n#endif\n/// @endcond\n\n/// @cond\n#if defined(_MSVC_LANG)\n#define __WI_SUPPRESS_BREAKING_WARNINGS_S __pragma(warning(push)) __pragma(warning(disable : 4127 26498 4245 26814))\n#define __WI_SUPPRESS_BREAKING_WARNINGS_E __pragma(warning(pop))\n#define __WI_SUPPRESS_NULLPTR_ANALYSIS __pragma(warning(suppress : 28285 6504))\n#define __WI_SUPPRESS_NONINIT_ANALYSIS __pragma(warning(suppress : 26495))\n#define __WI_SUPPRESS_NOEXCEPT_ANALYSIS __pragma(warning(suppress : 26439))\n#else\n#define __WI_SUPPRESS_BREAKING_WARNINGS_S\n#define __WI_SUPPRESS_BREAKING_WARNINGS_E\n#define __WI_SUPPRESS_NULLPTR_ANALYSIS\n#define __WI_SUPPRESS_NONINIT_ANALYSIS\n#define __WI_SUPPRESS_NOEXCEPT_ANALYSIS\n#endif\n/// @endcond\n\n#include <sal.h>\n\n// Some SAL remapping / decoration to better support Doxygen.  Macros that look like function calls can\n// confuse Doxygen when they are used to decorate a function or variable.  We simplify some of these to\n// basic macros without the function for common use cases.\n/// @cond\n#define _Success_return_ _Success_(return)\n#define _Success_true_ _Success_(true)\n#define __declspec_noinline_ __declspec(noinline)\n#define __declspec_selectany_ __declspec(selectany)\n/// @endcond\n\n//! @defgroup macrobuilding Macro Composition\n//! The following macros are building blocks primarily intended for authoring other macros.\n//! @{\n\n//! Re-state a macro value (indirection for composition)\n#define WI_FLATTEN(...) __VA_ARGS__\n\n/// @cond\n#define __WI_PASTE_imp(a, b) a##b\n/// @endcond\n\n//! This macro is for use in other macros to paste two tokens together, such as a constant and the __LINE__ macro.\n#define WI_PASTE(a, b) __WI_PASTE_imp(a, b)\n\n/// @cond\n#define __WI_HAS_VA_OPT_IMPL(F, T, ...) T\n#define __WI_HAS_VA_OPT_(...) __WI_HAS_VA_OPT_IMPL(__VA_OPT__(0, ) 1, 0)\n/// @endcond\n\n//! Evaluates to '1' when support for '__VA_OPT__' is available, else '0'\n#define WI_HAS_VA_OPT __WI_HAS_VA_OPT_(unused)\n\n/// @cond\n// clang-format off\n#define __WI_ARGS_COUNT1(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, \\\n                         A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, \\\n                         A60, A61, A62, A63, A64, A65, A66, A67, A68, A69, A70, A71, A72, A73, A74, A75, A76, A77, A78, A79, A80, A81, A82, A83, A84, A85, A86, A87, A88, A89, \\\n                         A90, A91, A92, A93, A94, A95, A96, A97, A98, A99, count, ...) count\n#define __WI_ARGS_COUNT0(...) WI_FLATTEN(__WI_ARGS_COUNT1(__VA_ARGS__, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, \\\n                         79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50,  49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \\\n                         39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))\n#define __WI_ARGS_COUNT_PREFIX(...) 0, __VA_ARGS__\n// clang-format on\n/// @endcond\n\n//! This variadic macro returns the number of arguments passed to it (up to 99).\n#if WI_HAS_VA_OPT\n#define WI_ARGS_COUNT(...) __WI_ARGS_COUNT0(0 __VA_OPT__(, __VA_ARGS__))\n#else\n#define WI_ARGS_COUNT(...) __WI_ARGS_COUNT0(__WI_ARGS_COUNT_PREFIX(__VA_ARGS__))\n#endif\n\n/// @cond\n#define __WI_FOR_imp0(fn)\n#define __WI_FOR_imp1(fn, arg) fn(arg)\n#define __WI_FOR_imp2(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp1(fn, __VA_ARGS__))\n#define __WI_FOR_imp3(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp2(fn, __VA_ARGS__))\n#define __WI_FOR_imp4(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp3(fn, __VA_ARGS__))\n#define __WI_FOR_imp5(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp4(fn, __VA_ARGS__))\n#define __WI_FOR_imp6(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp5(fn, __VA_ARGS__))\n#define __WI_FOR_imp7(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp6(fn, __VA_ARGS__))\n#define __WI_FOR_imp8(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp7(fn, __VA_ARGS__))\n#define __WI_FOR_imp9(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp8(fn, __VA_ARGS__))\n#define __WI_FOR_imp10(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp9(fn, __VA_ARGS__))\n#define __WI_FOR_imp11(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp10(fn, __VA_ARGS__))\n#define __WI_FOR_imp12(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp11(fn, __VA_ARGS__))\n#define __WI_FOR_imp13(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp12(fn, __VA_ARGS__))\n#define __WI_FOR_imp14(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp13(fn, __VA_ARGS__))\n#define __WI_FOR_imp15(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp14(fn, __VA_ARGS__))\n#define __WI_FOR_imp16(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp15(fn, __VA_ARGS__))\n#define __WI_FOR_imp17(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp16(fn, __VA_ARGS__))\n#define __WI_FOR_imp18(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp17(fn, __VA_ARGS__))\n#define __WI_FOR_imp19(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp18(fn, __VA_ARGS__))\n#define __WI_FOR_imp20(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp19(fn, __VA_ARGS__))\n#define __WI_FOR_imp21(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp20(fn, __VA_ARGS__))\n#define __WI_FOR_imp22(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp21(fn, __VA_ARGS__))\n#define __WI_FOR_imp23(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp22(fn, __VA_ARGS__))\n#define __WI_FOR_imp24(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp23(fn, __VA_ARGS__))\n#define __WI_FOR_imp25(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp24(fn, __VA_ARGS__))\n#define __WI_FOR_imp26(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp25(fn, __VA_ARGS__))\n#define __WI_FOR_imp27(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp26(fn, __VA_ARGS__))\n#define __WI_FOR_imp28(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp27(fn, __VA_ARGS__))\n#define __WI_FOR_imp29(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp28(fn, __VA_ARGS__))\n#define __WI_FOR_imp30(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp29(fn, __VA_ARGS__))\n#define __WI_FOR_imp31(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp30(fn, __VA_ARGS__))\n#define __WI_FOR_imp32(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp31(fn, __VA_ARGS__))\n#define __WI_FOR_imp33(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp32(fn, __VA_ARGS__))\n#define __WI_FOR_imp34(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp33(fn, __VA_ARGS__))\n#define __WI_FOR_imp35(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp34(fn, __VA_ARGS__))\n#define __WI_FOR_imp36(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp35(fn, __VA_ARGS__))\n#define __WI_FOR_imp37(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp36(fn, __VA_ARGS__))\n#define __WI_FOR_imp38(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp37(fn, __VA_ARGS__))\n#define __WI_FOR_imp39(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp38(fn, __VA_ARGS__))\n#define __WI_FOR_imp40(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp39(fn, __VA_ARGS__))\n#define __WI_FOR_imp41(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp40(fn, __VA_ARGS__))\n#define __WI_FOR_imp42(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp41(fn, __VA_ARGS__))\n#define __WI_FOR_imp43(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp42(fn, __VA_ARGS__))\n#define __WI_FOR_imp44(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp43(fn, __VA_ARGS__))\n#define __WI_FOR_imp45(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp44(fn, __VA_ARGS__))\n#define __WI_FOR_imp46(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp45(fn, __VA_ARGS__))\n#define __WI_FOR_imp47(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp46(fn, __VA_ARGS__))\n#define __WI_FOR_imp48(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp47(fn, __VA_ARGS__))\n#define __WI_FOR_imp49(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp48(fn, __VA_ARGS__))\n#define __WI_FOR_imp50(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp49(fn, __VA_ARGS__))\n#define __WI_FOR_imp51(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp50(fn, __VA_ARGS__))\n#define __WI_FOR_imp52(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp51(fn, __VA_ARGS__))\n#define __WI_FOR_imp53(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp52(fn, __VA_ARGS__))\n#define __WI_FOR_imp54(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp53(fn, __VA_ARGS__))\n#define __WI_FOR_imp55(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp54(fn, __VA_ARGS__))\n#define __WI_FOR_imp56(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp55(fn, __VA_ARGS__))\n#define __WI_FOR_imp57(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp56(fn, __VA_ARGS__))\n#define __WI_FOR_imp58(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp57(fn, __VA_ARGS__))\n#define __WI_FOR_imp59(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp58(fn, __VA_ARGS__))\n#define __WI_FOR_imp60(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp59(fn, __VA_ARGS__))\n#define __WI_FOR_imp61(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp60(fn, __VA_ARGS__))\n#define __WI_FOR_imp62(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp61(fn, __VA_ARGS__))\n#define __WI_FOR_imp63(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp62(fn, __VA_ARGS__))\n#define __WI_FOR_imp64(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp63(fn, __VA_ARGS__))\n#define __WI_FOR_imp65(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp64(fn, __VA_ARGS__))\n#define __WI_FOR_imp66(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp65(fn, __VA_ARGS__))\n#define __WI_FOR_imp67(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp66(fn, __VA_ARGS__))\n#define __WI_FOR_imp68(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp67(fn, __VA_ARGS__))\n#define __WI_FOR_imp69(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp68(fn, __VA_ARGS__))\n#define __WI_FOR_imp70(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp69(fn, __VA_ARGS__))\n#define __WI_FOR_imp71(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp70(fn, __VA_ARGS__))\n#define __WI_FOR_imp72(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp71(fn, __VA_ARGS__))\n#define __WI_FOR_imp73(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp72(fn, __VA_ARGS__))\n#define __WI_FOR_imp74(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp73(fn, __VA_ARGS__))\n#define __WI_FOR_imp75(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp74(fn, __VA_ARGS__))\n#define __WI_FOR_imp76(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp75(fn, __VA_ARGS__))\n#define __WI_FOR_imp77(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp76(fn, __VA_ARGS__))\n#define __WI_FOR_imp78(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp77(fn, __VA_ARGS__))\n#define __WI_FOR_imp79(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp78(fn, __VA_ARGS__))\n#define __WI_FOR_imp80(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp79(fn, __VA_ARGS__))\n#define __WI_FOR_imp81(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp80(fn, __VA_ARGS__))\n#define __WI_FOR_imp82(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp81(fn, __VA_ARGS__))\n#define __WI_FOR_imp83(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp82(fn, __VA_ARGS__))\n#define __WI_FOR_imp84(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp83(fn, __VA_ARGS__))\n#define __WI_FOR_imp85(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp84(fn, __VA_ARGS__))\n#define __WI_FOR_imp86(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp85(fn, __VA_ARGS__))\n#define __WI_FOR_imp87(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp86(fn, __VA_ARGS__))\n#define __WI_FOR_imp88(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp87(fn, __VA_ARGS__))\n#define __WI_FOR_imp89(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp88(fn, __VA_ARGS__))\n#define __WI_FOR_imp90(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp89(fn, __VA_ARGS__))\n#define __WI_FOR_imp91(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp90(fn, __VA_ARGS__))\n#define __WI_FOR_imp92(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp91(fn, __VA_ARGS__))\n#define __WI_FOR_imp93(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp92(fn, __VA_ARGS__))\n#define __WI_FOR_imp94(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp93(fn, __VA_ARGS__))\n#define __WI_FOR_imp95(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp94(fn, __VA_ARGS__))\n#define __WI_FOR_imp96(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp95(fn, __VA_ARGS__))\n#define __WI_FOR_imp97(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp96(fn, __VA_ARGS__))\n#define __WI_FOR_imp98(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp97(fn, __VA_ARGS__))\n#define __WI_FOR_imp99(fn, arg, ...) fn(arg) WI_FLATTEN(__WI_FOR_imp98(fn, __VA_ARGS__))\n\n#define __WI_FOR_imp(n, fnAndArgs) WI_PASTE(__WI_FOR_imp, n) fnAndArgs\n/// @endcond\n\n//! Iterates through each of the given arguments invoking the specified macro against each one.\n#define WI_FOREACH(fn, ...) __WI_FOR_imp(WI_ARGS_COUNT(__VA_ARGS__), (fn, ##__VA_ARGS__))\n\n//! Dispatches a single macro name to separate macros based on the number of arguments passed to it.\n#define WI_MACRO_DISPATCH(name, ...) WI_PASTE(WI_PASTE(name, WI_ARGS_COUNT(__VA_ARGS__)), (__VA_ARGS__))\n\n//! @} // Macro composition helpers\n\n#if !defined(__cplusplus) || defined(__WIL_MIN_KERNEL)\n\n#define WI_ODR_PRAGMA(NAME, TOKEN)\n#define WI_NOEXCEPT\n\n#else\n#pragma warning(push)\n#pragma warning(disable : 4714) // __forceinline not honored\n\n// DO NOT add *any* further includes to this file -- there should be no dependencies from its usage\n#include \"wistd_type_traits.h\"\n\n//! This macro inserts ODR violation protection; the macro allows it to be compatible with straight \"C\" code\n#define WI_ODR_PRAGMA(NAME, TOKEN) __pragma(detect_mismatch(\"ODR_violation_\" NAME \"_mismatch\", TOKEN))\n\n#ifdef WIL_KERNEL_MODE\nWI_ODR_PRAGMA(\"WIL_KERNEL_MODE\", \"1\")\n#else\nWI_ODR_PRAGMA(\"WIL_KERNEL_MODE\", \"0\")\n#endif\n\n#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(WIL_SUPPRESS_EXCEPTIONS)\n/** This define is automatically set when exceptions are enabled within wil.\nIt is automatically defined when your code is compiled with exceptions enabled (via checking for the built-in\n_CPPUNWIND or __EXCEPTIONS flag) unless you explicitly define WIL_SUPPRESS_EXCEPTIONS ahead of including your first wil\nheader.  All exception-based WIL methods and classes are included behind:\n~~~~\n#ifdef WIL_ENABLE_EXCEPTIONS\n// code\n#endif\n~~~~\nThis enables exception-free code to directly include WIL headers without worrying about exception-based\nroutines suddenly becoming available. */\n#define WIL_ENABLE_EXCEPTIONS\n#endif\n\n/// @cond\n#if defined(WIL_EXCEPTION_MODE)\nstatic_assert(WIL_EXCEPTION_MODE <= 2, \"Invalid exception mode\");\n#elif !defined(WIL_LOCK_EXCEPTION_MODE)\n#define WIL_EXCEPTION_MODE 0 // default, can link exception-based and non-exception based libraries together\n#pragma detect_mismatch(\"ODR_violation_WIL_EXCEPTION_MODE_mismatch\", \"0\")\n#elif defined(WIL_ENABLE_EXCEPTIONS)\n#define WIL_EXCEPTION_MODE 1 // new code optimization:  ONLY support linking libraries together that have exceptions enabled\n#pragma detect_mismatch(\"ODR_violation_WIL_EXCEPTION_MODE_mismatch\", \"1\")\n#else\n#define WIL_EXCEPTION_MODE 2 // old code optimization:  ONLY support linking libraries that are NOT using exceptions\n#pragma detect_mismatch(\"ODR_violation_WIL_EXCEPTION_MODE_mismatch\", \"2\")\n#endif\n/// @endcond\n\n#if WIL_EXCEPTION_MODE == 1 && !defined(WIL_ENABLE_EXCEPTIONS)\n#error Must enable exceptions when WIL_EXCEPTION_MODE == 1\n#endif\n\n#ifdef WIL_DOXYGEN\n/** This define is used to control whether or not WIL assumes safe access to the STL.\nThis define can be set manually (1 to enable, 0 to disable), otherwise heuristics will be applied in an attempt to\ndeduce whether or not the STL is available and can be safely used.\n */\n#define WIL_USE_STL 1\n#elif !defined(WIL_USE_STL)\n#if !defined(WIL_ENABLE_EXCEPTIONS) || !defined(__has_include)\n// Assume it's not safe to use the STL when:\n//      * Exceptions are not enabled, OR\n//      * We can't check for header presence\n#define WIL_USE_STL 0\n#else\n// Check for several STL headers that have been around since the dawn of time\n#if __has_include(<algorithm>) && __has_include(<exception>) && __has_include(<iterator>) && __has_include(<new>) && \\\n    __has_include(<string>) && __has_include(<utility>) && __has_include(<vector>)\n#define WIL_USE_STL 1\n#else\n#define WIL_USE_STL 0\n#endif\n#endif\n#endif\n\n/// @cond\n#ifndef WIL_ITERATOR_DEBUG_LEVEL\n// NOTE: See the definition of 'RESULT_DEBUG' for commentary on the use of 'WIL_KERNEL_MODE' below\n#if (DBG || defined(DEBUG) || defined(_DEBUG)) && (defined(WIL_KERNEL_MODE) || !defined(NDEBUG))\n#define WIL_ITERATOR_DEBUG_LEVEL 2\n#else\n#define WIL_ITERATOR_DEBUG_LEVEL 0\n#endif\n#endif\n\n#if (WIL_ITERATOR_DEBUG_LEVEL < 0) || (WIL_ITERATOR_DEBUG_LEVEL > 2)\n#error Invalid value for 'WIL_ITERATOR_DEBUG_LEVEL'; valid values are 0-2\n#endif\n\n// To allow code with mis-matching iterator debug levels to link together without fear of ODR issues, we place iterators whose\n// definitions differ based on the definition of WIL_ITERATOR_DEBUG_LEVEL in different namespaces\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n#define __WI_ITR_NAMESPACE WI_PASTE(itr, WIL_ITERATOR_DEBUG_LEVEL)\n#define __WI_ITR_NAMESPACE_BEGIN \\\n    inline namespace __WI_ITR_NAMESPACE \\\n    {\n#define __WI_ITR_NAMESPACE_END }\n#else\n#define __WI_ITR_NAMESPACE\n#define __WI_ITR_NAMESPACE_BEGIN\n#define __WI_ITR_NAMESPACE_END\n#endif\n/// @endcond\n\n// block for documentation only\n#if defined(WIL_DOXYGEN)\n/** This define can be explicitly set to disable exception usage within wil.\nNormally this define is never needed as the WIL_ENABLE_EXCEPTIONS macro is enabled automatically by looking\nat _CPPUNWIND.  If your code compiles with exceptions enabled, but does not want to enable the exception-based\nclasses and methods from WIL, define this macro ahead of including the first WIL header. */\n#define WIL_SUPPRESS_EXCEPTIONS\n\n/** This define can be explicitly set to lock the process exception mode to WIL_ENABLE_EXCEPTIONS.\nLocking the exception mode provides optimizations to exception barriers, staging hooks and DLL load costs as it eliminates the\nneed to do copy-on-write initialization of various function pointers and the necessary indirection that's done within WIL to avoid\nODR violations when linking libraries together with different exception handling semantics. */\n#define WIL_LOCK_EXCEPTION_MODE\n\n/** This define explicit sets the exception mode for the process to control optimizations.\nThree exception modes are available:\n0)  This is the default.  This enables a binary to link both exception-based and non-exception based libraries together that use\n    WIL.  This adds overhead to exception barriers, DLL copy on write pages and indirection through function pointers to avoid ODR\n    violations when linking libraries together with different exception handling semantics.\n1)  Prefer this setting when it can be used.  This locks the binary to only supporting libraries which were built with exceptions\n    enabled.\n2)  This locks the binary to libraries built without exceptions. */\n#define WIL_EXCEPTION_MODE\n\n/**This define controls the degree of runtime checking for various iterator types defined by WIL.\nThis option roughly follows the behavior of the MSVC STL's `_ITERATOR_DEBUG_LEVEL` define, with similar available values. The\nprimary difference (besides being two disjoint values) is that `WIL_ITERATOR_DEBUG_LEVEL` will raise a failfast exception when a\ncheck fails as opposed to the invalid parameter handler that the STL invokes. There are three definitions allowed:\n0)  This will disable all additional runtime checks for the various iterator types. This is the default when building as 'Release'\n1)  This enables checks only for unsafe iterator use. This includes things like attempting to increment an iterator past the end,\n    dereference an end iterator, dereference invalidated iterators, etc.\n2)  This enables all checks enabled by level 1 plus some additional checks to try and catch invalid iterator use. The specific\n    checks enabled by this level will vary between iterator types. This is the default when building as 'Debug'\n*/\n#define WIL_ITERATOR_DEBUG_LEVEL 0\n#endif\n\n/// @cond\n// Until we'll have C++17 enabled in our code base, we're falling back to SAL\n#define WI_NODISCARD __WI_LIBCPP_NODISCARD_ATTRIBUTE\n\n#define __R_ENABLE_IF_IS_CLASS(ptrType) wistd::enable_if_t<wistd::is_class<ptrType>::value, void*> = nullptr\n#define __R_ENABLE_IF_IS_NOT_CLASS(ptrType) wistd::enable_if_t<!wistd::is_class<ptrType>::value, void*> = nullptr\n\n// Uses the __has_include macro, if available. Otherwise uses a user-provided fallback. E.g. the fallback could always\n// default to true or false, or it could do something like a C++ standard version check\n#ifdef __has_include\n#define WI_HAS_INCLUDE(header, fallback) __has_include(header)\n#else\n#define WI_HAS_INCLUDE(header, fallback) (fallback)\n#endif\n/// @endcond\n\n//! @defgroup bitwise Bitwise Inspection and Manipulation\n//! Bitwise helpers to improve readability and reduce the error rate of bitwise operations.\n//! Several macros have been constructed to assist with bitwise inspection and manipulation.  These macros exist\n//! for two primary purposes:\n//!\n//! 1. To improve the readability of bitwise comparisons and manipulation.\n//!\n//!    The macro names are the more concise, readable form of what's being done and do not require that any flags\n//!    or variables be specified multiple times for the comparisons.\n//!\n//! 2. To reduce the error rate associated with bitwise operations.\n//!\n//!    The readability improvements naturally lend themselves to this by cutting down the number of concepts.\n//!    Using `WI_IsFlagSet(var, MyEnum::Flag)` rather than `((var & MyEnum::Flag) == MyEnum::Flag)` removes the comparison\n//!    operator and repetition in the flag value.\n//!\n//!    Additionally, these macros separate single flag operations (which tend to be the most common) from multi-flag\n//!    operations so that compile-time errors are generated for bitwise operations which are likely incorrect,\n//!    such as:  `WI_IsFlagSet(var, MyEnum::None)` or `WI_IsFlagSet(var, MyEnum::ValidMask)`.\n//!\n//! Note that the single flag helpers should be used when a compile-time constant single flag is being manipulated.  These\n//! helpers provide compile-time errors on misuse and should be preferred over the multi-flag helpers.  The multi-flag helpers\n//! should be used when multiple flags are being used simultaneously or when the flag values are not compile-time constants.\n//!\n//! Common example usage (manipulation of flag variables):\n//! ~~~~\n//! WI_SetFlag(m_flags, MyFlags::Foo);                              // Set a single flag in the given variable\n//! WI_SetAllFlags(m_flags, MyFlags::Foo | MyFlags::Bar);           // Set one or more flags\n//! WI_ClearFlagIf(m_flags, MyFlags::Bar, isBarClosed);             // Conditionally clear a single flag based upon a bool\n//! WI_ClearAllFlags(m_flags, MyFlags::Foo | MyFlags::Bar);         // Clear one or more flags from the given variable\n//! WI_ToggleFlag(m_flags, MyFlags::Foo);                           // Toggle (change to the opposite value) a single flag\n//! WI_UpdateFlag(m_flags, MyFlags::Bar, isBarClosed);              // Sets or Clears a single flag from the given variable based\n//!                                                                 // upon a bool value\n//! WI_UpdateFlagsInMask(m_flags, flagsMask, newFlagValues);        // Sets or Clears the flags in flagsMask to the masked values\n//!                                                                 // from newFlagValues\n//! ~~~~\n//! Common example usage (inspection of flag variables):\n//! ~~~~\n//! if (WI_IsFlagSet(m_flags, MyFlags::Foo))                        // Is a single flag set in the given variable?\n//! if (WI_IsAnyFlagSet(m_flags, MyFlags::Foo | MyFlags::Bar))      // Is at least one flag from the given mask set?\n//! if (WI_AreAllFlagsClear(m_flags, MyFlags::Foo | MyFlags::Bar))  // Are all flags in the given list clear?\n//! if (WI_IsSingleFlagSet(m_flags))                                // Is *exactly* one flag set in the given variable?\n//! ~~~~\n//! @{\n\n//! Returns the unsigned type of the same width and numeric value as the given enum\n#define WI_EnumValue(val) static_cast<::wil::integral_from_enum<decltype(val)>>(val)\n//! Validates that exactly ONE bit is set in compile-time constant `flag`\n#define WI_StaticAssertSingleBitSet(flag) \\\n    static_cast<decltype(flag)>(::wil::details::verify_single_flag_helper<static_cast<unsigned long long>(WI_EnumValue(flag))>::value)\n\n//! @name Bitwise manipulation macros\n//! @{\n\n//! Set zero or more bitflags specified by `flags` in the variable `var`.\n#define WI_SetAllFlags(var, flags) ((var) |= (flags))\n//! Set a single compile-time constant `flag` in the variable `var`.\n#define WI_SetFlag(var, flag) WI_SetAllFlags(var, WI_StaticAssertSingleBitSet(flag))\n//! Conditionally sets a single compile-time constant `flag` in the variable `var` only if `condition` is true.\n#define WI_SetFlagIf(var, flag, condition) \\\n    do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            WI_SetFlag(var, flag); \\\n        } \\\n    } while ((void)0, 0)\n\n//! Clear zero or more bitflags specified by `flags` from the variable `var`.\n#define WI_ClearAllFlags(var, flags) ((var) &= ~(flags))\n//! Clear a single compile-time constant `flag` from the variable `var`.\n#define WI_ClearFlag(var, flag) WI_ClearAllFlags(var, WI_StaticAssertSingleBitSet(flag))\n//! Conditionally clear a single compile-time constant `flag` in the variable `var` only if `condition` is true.\n#define WI_ClearFlagIf(var, flag, condition) \\\n    do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            WI_ClearFlag(var, flag); \\\n        } \\\n    } while ((void)0, 0)\n\n//! Changes a single compile-time constant `flag` in the variable `var` to be set if `isFlagSet` is true or cleared if `isFlagSet`\n//! is false.\n#define WI_UpdateFlag(var, flag, isFlagSet) (wil::verify_bool(isFlagSet) ? WI_SetFlag(var, flag) : WI_ClearFlag(var, flag))\n//! Changes only the flags specified by `flagsMask` in the variable `var` to match the corresponding flags in `newFlags`.\n#define WI_UpdateFlagsInMask(var, flagsMask, newFlags) wil::details::UpdateFlagsInMaskHelper(var, flagsMask, newFlags)\n\n//! Toggles (XOR the value) of multiple bitflags specified by `flags` in the variable `var`.\n#define WI_ToggleAllFlags(var, flags) ((var) ^= (flags))\n//! Toggles (XOR the value) of a single compile-time constant `flag` in the variable `var`.\n#define WI_ToggleFlag(var, flag) WI_ToggleAllFlags(var, WI_StaticAssertSingleBitSet(flag))\n//! @}      // bitwise manipulation macros\n\n//! @name Bitwise inspection macros\n//! @{\n\n//! Evaluates as true if every bitflag specified in `flags` is set within `val`.\n#define WI_AreAllFlagsSet(val, flags) wil::details::AreAllFlagsSetHelper(val, flags)\n//! Evaluates as true if one or more bitflags specified in `flags` are set within `val`.\n#define WI_IsAnyFlagSet(val, flags) \\\n    (static_cast<decltype((val) & (flags))>(WI_EnumValue(val) & WI_EnumValue(flags)) != static_cast<decltype((val) & (flags))>(0))\n//! Evaluates as true if a single compile-time constant `flag` is set within `val`.\n#define WI_IsFlagSet(val, flag) WI_IsAnyFlagSet(val, WI_StaticAssertSingleBitSet(flag))\n\n//! Evaluates as true if every bitflag specified in `flags` is clear within `val`.\n#define WI_AreAllFlagsClear(val, flags) \\\n    (static_cast<decltype((val) & (flags))>(WI_EnumValue(val) & WI_EnumValue(flags)) == static_cast<decltype((val) & (flags))>(0))\n//! Evaluates as true if one or more bitflags specified in `flags` are clear within `val`.\n#define WI_IsAnyFlagClear(val, flags) (!wil::details::AreAllFlagsSetHelper(val, flags))\n//! Evaluates as true if a single compile-time constant `flag` is clear within `val`.\n#define WI_IsFlagClear(val, flag) WI_AreAllFlagsClear(val, WI_StaticAssertSingleBitSet(flag))\n\n//! Evaluates as true if exactly one bit (any bit) is set within `val`.\n#define WI_IsSingleFlagSet(val) wil::details::IsSingleFlagSetHelper(val)\n//! Evaluates as true if exactly one bit from within the specified `mask` is set within `val`.\n#define WI_IsSingleFlagSetInMask(val, mask) wil::details::IsSingleFlagSetHelper((val) & (mask))\n//! Evaluates as true if exactly one bit (any bit) is set within `val` or if there are no bits set within `val`.\n#define WI_IsClearOrSingleFlagSet(val) wil::details::IsClearOrSingleFlagSetHelper(val)\n//! Evaluates as true if exactly one bit from within the specified `mask` is set within `val` or if there are no bits from `mask`\n//! set within `val`.\n#define WI_IsClearOrSingleFlagSetInMask(val, mask) wil::details::IsClearOrSingleFlagSetHelper((val) & (mask))\n//! @}      // bitwise inspection macros\n\n//! @}      // group bitwise\n\n#if defined(WIL_DOXYGEN)\n/** This macro provides a C++ header with a guaranteed initialization function.\nNormally, were a global object's constructor used for this purpose, the optimizer/linker might throw\nthe object away if it's unreferenced (which throws away the side-effects that the initialization function\nwas trying to achieve).  Using this macro forces linker inclusion of a variable that's initialized by the\nprovided function to elide that optimization.\n//!\nThis functionality is primarily provided as a building block for header-based libraries (such as WIL)\nto be able to layer additional functionality into other libraries by their mere inclusion.  Alternative models\nof initialization should be used whenever they are available.\n~~~~\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\nWI_HEADER_INITIALIZATION_FUNCTION(InitializeDesktopFamilyApis, []\n{\n    g_pfnGetModuleName              = GetCurrentModuleName;\n    g_pfnFailFastInLoaderCallout    = FailFastInLoaderCallout;\n    return 1;\n});\n#endif\n~~~~\nThe above example is used within WIL to decide whether or not the library containing WIL is allowed to use\ndesktop APIs.  Building this functionality as `#IFDEF`s within functions would create ODR violations, whereas\ndoing it with global function pointers and header initialization allows a runtime determination. */\n#define WI_HEADER_INITIALIZATION_FUNCTION(name, fn)\n#elif defined(_M_IX86)\n#define WI_HEADER_INITIALIZATION_FUNCTION(name, fn) \\\n    extern \"C\" \\\n    { \\\n        __declspec(selectany) unsigned char g_header_init_##name = static_cast<unsigned char>(fn()); \\\n    } \\\n    __pragma(comment(linker, \"/INCLUDE:_g_header_init_\" #name))\n#elif defined(_M_IA64) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_ARM64)\n#define WI_HEADER_INITIALIZATION_FUNCTION(name, fn) \\\n    extern \"C\" \\\n    { \\\n        __declspec(selectany) unsigned char g_header_init_##name = static_cast<unsigned char>(fn()); \\\n    } \\\n    __pragma(comment(linker, \"/INCLUDE:g_header_init_\" #name))\n#else\n#error linker pragma must include g_header_init variation\n#endif\n\n// Keep the misspelled name for backward compatibility.\n#define WI_HEADER_INITITALIZATION_FUNCTION(name, fn) WI_HEADER_INITIALIZATION_FUNCTION(name, fn)\n\n/** All Windows Implementation Library classes and functions are located within the \"wil\" namespace.\nThe 'wil' namespace is an intentionally short name as the intent is for code to be able to reference\nthe namespace directly (example: `wil::srwlock lock;`) without a using statement.  Resist adding a using\nstatement for wil to avoid introducing potential name collisions between wil and other namespaces. */\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    template <typename T>\n    class pointer_range\n    {\n    public:\n        pointer_range(T begin_, T end_) : m_begin(begin_), m_end(end_)\n        {\n        }\n        WI_NODISCARD T begin() const\n        {\n            return m_begin;\n        }\n        WI_NODISCARD T end() const\n        {\n            return m_end;\n        }\n\n    private:\n        T m_begin;\n        T m_end;\n    };\n} // namespace details\n/// @endcond\n\n/** Enables using range-based for between a begin and end object pointer.\n~~~~\nfor (auto& obj : make_range(objPointerBegin, objPointerEnd)) { }\n~~~~ */\ntemplate <typename T>\ndetails::pointer_range<T> make_range(T begin, T end)\n{\n    return details::pointer_range<T>(begin, end);\n}\n\n/** Enables using range-based for on a range when given the base pointer and the number of objects in the range.\n~~~~\nfor (auto& obj : make_range(objPointer, objCount)) { }\n~~~~ */\ntemplate <typename T>\ndetails::pointer_range<T> make_range(T begin, size_t count)\n{\n    return details::pointer_range<T>(begin, begin + count);\n}\n\n//! @defgroup outparam Output Parameters\n//! Improve the conciseness of assigning values to optional output parameters.\n//! @{\n\n/** Assign the given value to an optional output parameter.\nMakes code more concise by removing trivial `if (outParam)` blocks. */\ntemplate <typename T>\ninline void assign_to_opt_param(_Out_opt_ T* outParam, T val)\n{\n    if (outParam != nullptr)\n    {\n        *outParam = val;\n    }\n}\n\n/** Assign NULL to an optional output pointer parameter.\nMakes code more concise by removing trivial `if (outParam)` blocks. */\ntemplate <typename T>\ninline void assign_null_to_opt_param(_Out_opt_ T* outParam)\n{\n    if (outParam != nullptr)\n    {\n        *outParam = nullptr;\n    }\n}\n//! @}      // end output parameter helpers\n\n/** Performs a logical or of the given variadic template parameters allowing indirect compile-time boolean evaluation.\nExample usage:\n~~~~\ntemplate <unsigned int... Rest>\nstruct FeatureRequiredBy\n{\n    static const bool enabled = wil::variadic_logical_or<WilFeature<Rest>::enabled...>::value;\n};\n~~~~ */\ntemplate <bool...>\nstruct variadic_logical_or;\n/// @cond\ntemplate <>\nstruct variadic_logical_or<> : wistd::false_type\n{\n};\ntemplate <bool... Rest>\nstruct variadic_logical_or<true, Rest...> : wistd::true_type\n{\n};\ntemplate <bool... Rest>\nstruct variadic_logical_or<false, Rest...> : variadic_logical_or<Rest...>::type\n{\n};\n/// @endcond\n\n/// @cond\nnamespace details\n{\n    template <unsigned long long flag>\n    struct verify_single_flag_helper\n    {\n        static_assert((flag != 0) && ((flag & (flag - 1)) == 0), \"Single flag expected, zero or multiple flags found\");\n        static const unsigned long long value = flag;\n    };\n} // namespace details\n/// @endcond\n\n//! @defgroup typesafety Type Validation\n//! Helpers to validate variable types to prevent accidental, but allowed type conversions.\n//! These helpers are most useful when building macros that accept a particular type.  Putting these functions around the types\n//! accepted prior to pushing that type through to a function (or using it within the macro) allows the macro to add an additional\n//! layer of type safety that would ordinarily be stripped away by C++ implicit conversions.  This system is extensively used in\n//! the error handling helper macros to validate the types given to various macro parameters.\n//! @{\n\n/** Verify that `val` can be evaluated as a logical bool.\nOther types will generate an intentional compilation error.  Allowed types for a logical bool are bool, BOOL,\nboolean, BOOLEAN, and classes with an explicit bool cast.\n@param val The logical bool expression\n@return A C++ bool representing the evaluation of `val`. */\ntemplate <typename T, __R_ENABLE_IF_IS_CLASS(T)>\n_Post_satisfies_(return == static_cast<bool>(val)) inline constexpr bool verify_bool(const T& val) WI_NOEXCEPT\n{\n    return static_cast<bool>(val);\n}\n\ntemplate <typename T, __R_ENABLE_IF_IS_NOT_CLASS(T)>\ninline constexpr bool verify_bool(T /*val*/) WI_NOEXCEPT\n{\n    static_assert(!wistd::is_same<T, T>::value, \"Wrong Type: bool/BOOL/BOOLEAN/boolean expected\");\n    return false;\n}\n\ntemplate <>\n_Post_satisfies_(return == val) inline constexpr bool verify_bool<bool>(bool val) WI_NOEXCEPT\n{\n    return val;\n}\n\ntemplate <>\n_Post_satisfies_(return == (val != 0)) inline constexpr bool verify_bool<int>(int val) WI_NOEXCEPT\n{\n    return (val != 0);\n}\n\ntemplate <>\n_Post_satisfies_(return == (val != 0)) inline constexpr bool verify_bool<unsigned char>(unsigned char val) WI_NOEXCEPT\n{\n    return (val != 0);\n}\n\n/** Verify that `val` is a Win32 BOOL value.\nOther types (including other logical bool expressions) will generate an intentional compilation error.  Note that this will\naccept any `int` value as long as that is the underlying typedef behind `BOOL`.\n@param val The Win32 BOOL returning expression\n@return A Win32 BOOL representing the evaluation of `val`. */\ntemplate <typename T>\n_Post_satisfies_(return == val) inline constexpr int verify_BOOL(T val) WI_NOEXCEPT\n{\n    // Note: Written in terms of 'int' as BOOL is actually:  typedef int BOOL;\n    static_assert((wistd::is_same<T, int>::value), \"Wrong Type: BOOL expected\");\n    return val;\n}\n\n/** Verify that `hr` is an HRESULT value.\nOther types will generate an intentional compilation error.  Note that this will accept any `long` value as that is the\nunderlying typedef behind HRESULT.\n\nNote that occasionally you might run into an HRESULT which is directly defined with a `#define`, such as:\n~~~~\n#define UIA_E_NOTSUPPORTED   0x80040204\n~~~~\nThough this looks like an `HRESULT`, this is actually an `unsigned long` (the hex specification forces this).  When\nthese are encountered and they are NOT in the public SDK (have not yet shipped to the public), then you should change\ntheir definition to match the manner in which `HRESULT` constants are defined in winerror.h:\n~~~~\n#define E_NOTIMPL            _HRESULT_TYPEDEF_(0x80004001L)\n~~~~\nWhen these are encountered in the public SDK, their type should not be changed and you should use a static_cast\nto use this value in a macro that utilizes `verify_hresult`, for example:\n~~~~\nRETURN_HR_IF(static_cast<HRESULT>(UIA_E_NOTSUPPORTED), (patternId != UIA_DragPatternId));\n~~~~\n@param hr The HRESULT returning expression\n@return An HRESULT representing the evaluation of `val`. */\ntemplate <typename T>\n_Post_satisfies_(return == hr) inline constexpr long verify_hresult(T hr) WI_NOEXCEPT\n{\n    // Note: Written in terms of 'long' as HRESULT is actually:  typedef _Return_type_success_(return >= 0) long HRESULT\n    static_assert(wistd::is_same<T, long>::value, \"Wrong Type: HRESULT expected\");\n    return hr;\n}\n\n/** Verify that `status` is an NTSTATUS value.\nOther types will generate an intentional compilation error.  Note that this will accept any `long` value as that is the\nunderlying typedef behind NTSTATUS.\n//!\nNote that occasionally you might run into an NTSTATUS which is directly defined with a `#define`, such as:\n@code\n#define STATUS_NOT_SUPPORTED             0x1\n@endcode\nThough this looks like an `NTSTATUS`, this is actually an `unsigned long` (the hex specification forces this).  When\nthese are encountered and they are NOT in the public SDK (have not yet shipped to the public), then you should change\ntheir definition to match the manner in which `NTSTATUS` constants are defined in ntstatus.h:\n@code\n#define STATUS_NOT_SUPPORTED             ((NTSTATUS)0xC00000BBL)\n@endcode\nWhen these are encountered in the public SDK, their type should not be changed and you should use a static_cast\nto use this value in a macro that utilizes `verify_ntstatus`, for example:\n@code\nNT_RETURN_IF_FALSE(static_cast<NTSTATUS>(STATUS_NOT_SUPPORTED), (dispatch->Version == HKE_V1_0));\n@endcode\n@param status The NTSTATUS returning expression\n@return An NTSTATUS representing the evaluation of `val`. */\ntemplate <typename T>\n_Post_satisfies_(return == status) inline long verify_ntstatus(T status) WI_NOEXCEPT\n{\n    // Note: Written in terms of 'long' as NTSTATUS is actually:  typedef _Return_type_success_(return >= 0) long NTSTATUS\n    static_assert(wistd::is_same<T, long>::value, \"Wrong Type: NTSTATUS expected\");\n    return status;\n}\n\n/** Verify that `error` is a Win32 error code.\nOther types will generate an intentional compilation error. Note that this will accept any `long` value as that is\nthe underlying type used for WIN32 error codes, as well as any `DWORD` (`unsigned long`) value since this is the type\ncommonly used when manipulating Win32 error codes.\n@param error The Win32 error code returning expression\n@return An Win32 error code representing the evaluation of `error`. */\ntemplate <typename T>\n_Post_satisfies_(return == error) inline T verify_win32(T error) WI_NOEXCEPT\n{\n    // Note: Win32 error code are defined as 'long' (#define ERROR_SUCCESS 0L), but are more frequently used as DWORD (unsigned\n    // long). This accept both types.\n    static_assert(\n        wistd::is_same<T, long>::value || wistd::is_same<T, unsigned long>::value,\n        \"Wrong Type: Win32 error code (long / unsigned long) expected\");\n    return error;\n}\n/// @}      // end type validation routines\n\n/// @cond\n// Implementation details for macros and helper functions... do not use directly.\nnamespace details\n{\n    // Use size-specific casts to avoid sign extending numbers -- avoid warning C4310: cast truncates constant value\n#define __WI_MAKE_UNSIGNED(val) \\\n    (__pragma(warning(push)) __pragma(warning(disable : 4310 4309))( \\\n        sizeof(val) == 1   ? static_cast<unsigned char>(val) \\\n        : sizeof(val) == 2 ? static_cast<unsigned short>(val) \\\n        : sizeof(val) == 4 ? static_cast<unsigned long>(val) \\\n                           : static_cast<unsigned long long>(val)) __pragma(warning(pop)))\n#define __WI_IS_UNSIGNED_SINGLE_FLAG_SET(val) ((val) && !((val) & ((val) - 1)))\n#define __WI_IS_SINGLE_FLAG_SET(val) __WI_IS_UNSIGNED_SINGLE_FLAG_SET(__WI_MAKE_UNSIGNED(val))\n\n    template <typename TVal, typename TFlags>\n    __forceinline constexpr bool AreAllFlagsSetHelper(TVal val, TFlags flags)\n    {\n        return ((val & flags) == static_cast<decltype(val & flags)>(flags));\n    }\n\n    template <typename TVal>\n    __forceinline constexpr bool IsSingleFlagSetHelper(TVal val)\n    {\n        return __WI_IS_SINGLE_FLAG_SET(val);\n    }\n\n    template <typename TVal>\n    __forceinline constexpr bool IsClearOrSingleFlagSetHelper(TVal val)\n    {\n        return ((val == static_cast<wistd::remove_reference_t<TVal>>(0)) || IsSingleFlagSetHelper(val));\n    }\n\n    template <typename TVal, typename TMask, typename TFlags>\n    __forceinline constexpr void UpdateFlagsInMaskHelper(_Inout_ TVal& val, TMask mask, TFlags flags)\n    {\n        val = static_cast<wistd::remove_reference_t<TVal>>((val & ~mask) | (flags & mask));\n    }\n\n    template <long>\n    struct variable_size;\n\n    template <>\n    struct variable_size<1>\n    {\n        using type = unsigned char;\n    };\n\n    template <>\n    struct variable_size<2>\n    {\n        using type = unsigned short;\n    };\n\n    template <>\n    struct variable_size<4>\n    {\n        using type = unsigned long;\n    };\n\n    template <>\n    struct variable_size<8>\n    {\n        using type = unsigned long long;\n    };\n\n    template <typename T>\n    struct variable_size_mapping\n    {\n        using type = typename variable_size<sizeof(T)>::type;\n    };\n} // namespace details\n/// @endcond\n\n/** Defines the unsigned type of the same width (1, 2, 4, or 8 bytes) as the given type.\nThis allows code to generically convert any enum class to it's corresponding underlying type. */\ntemplate <typename T>\nusing integral_from_enum = typename details::variable_size_mapping<T>::type;\n\n//! Declares a name that intentionally hides a name from an outer scope.\n//! Use this to prevent accidental use of a parameter or lambda captured variable.\nusing hide_name = void(struct hidden_name);\n} // namespace wil\n\n#pragma warning(pop)\n\n#endif // __cplusplus\n#endif // __WIL_COMMON_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/coroutine.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Types and helpers for using C++ coroutines.\n#ifndef __WIL_COROUTINE_INCLUDED\n#define __WIL_COROUTINE_INCLUDED\n\n/*\n * A wil::task<T> / com_task<T> is a coroutine with the following characteristics:\n *\n * - T must be a copyable object, movable object, reference, or void.\n * - The coroutine may be awaited at most once. The second await will crash.\n * - The coroutine may be abandoned (allowed to destruct without co_await),\n *   in which case unobserved exceptions are fatal.\n * - By default, wil::task resumes on an arbitrary thread.\n * - By default, wil::com_task resumes in the same COM apartment.\n * - task.resume_any_thread() allows resumption on any thread.\n * - task.resume_same_apartment() forces resumption in the same COM apartment.\n *\n * The wil::task and wil::com_task are intended to supplement PPL and C++/WinRT,\n * not to replace them. It provides coroutine implementations for scenarios that PPL\n * and C++/WinRT do not support, but it does not support everything that PPL and\n * C++/WinRT do.\n *\n * The implementation is optimized on the assumption that the coroutine is\n * awaited only once, and that the coroutine is discarded after completion.\n * To ensure proper usage, the task object is move-only, and\n * co_await takes ownership of the task. See further discussion below.\n *\n * Comparison with PPL and C++/WinRT:\n *\n * |                                                     | PPL       | C++/WinRT | wil::*task    |\n * |-----------------------------------------------------|-----------|-----------|---------------|\n * | T can be non-constructible                          | No        | Yes       | Yes           |\n * | T can be void                                       | Yes       | Yes       | Yes           |\n * | T can be reference                                  | No        | No        | Yes           |\n * | T can be WinRT object                               | Yes       | Yes       | Yes           |\n * | T can be non-WinRT object                           | Yes       | No        | Yes           |\n * | T can be move-only                                  | No        | No        | Yes           |\n * | Coroutine can be cancelled                          | Yes       | Yes       | No            |\n * | Coroutine can throw arbitrary exceptions            | Yes       | No        | Yes           |\n * | Can co_await more than once                         | Yes       | No        | No            |\n * | Can have multiple clients waiting for completion    | Yes       | No        | No            |\n * | co_await resumes in same COM context                | Sometimes | Yes       | You choose [1]|\n * | Can force co_await to resume in same context        | Yes       | N/A       | Yes [1]       |\n * | Can force co_await to resume in any thread          | Yes       | No        | Yes           |\n * | Can change coroutine's resumption model             | No        | No        | Yes           |\n * | Can wait synchronously                              | Yes       | Yes       | Yes [2]       |\n * | Can be consumed by non-C++ languages                | No        | Yes       | No            |\n * | Implementation is small and efficient               | No        | Yes       | Yes           |\n * | Can abandon coroutine (fail to co_await)            | Yes       | Yes       | Yes           |\n * | Exception in abandoned coroutine                    | Crash     | Ignored   | Crash         |\n * | Coroutine starts automatically                      | Yes       | Yes       | Yes           |\n * | Coroutine starts synchronously                      | No        | Yes       | Yes           |\n * | Integrates with C++/WinRT coroutine callouts        | No        | Yes       | No            |\n *\n * [1] Resumption in the same COM apartment requires that you include COM headers.\n * [2] Synchronous waiting requires that you include <synchapi.h> (usually via <windows.h>).\n *\n * You can include the COM headers and/or synchapi.h headers, and then\n * re-include this header file to activate the features dependent upon\n * those headers.\n *\n * Examples:\n *\n * Implement a coroutine that returns a move-only non-WinRT type\n * and which resumes on an arbitrary thread.\n *\n * wil::task<wil::unique_cotaskmem_string> GetNameAsync()\n * {\n *     co_await resume_background(); // do work on BG thread\n *     wil::unique_cotaskmem_string name;\n *     THROW_IF_FAILED(GetNameSlow(&name));\n *     co_return name; // awaiter will resume on arbitrary thread\n * }\n *\n * Consumers:\n *\n * winrt::IAsyncAction UpdateNameAsync()\n * {\n *     // wil::task resumes on an arbitrary thread.\n *     auto name = co_await GetNameAsync();\n *     // could be on any thread now\n *     co_await SendNameAsync(name.get());\n * }\n *\n * winrt::IAsyncAction UpdateNameAsync()\n * {\n *     // override default behavior of wil::task and\n *     // force it to resume in the same COM apartment.\n *     auto name = co_await GetNameAsync().resume_same_apartment();\n *     // so we are still on the UI thread\n *     NameElement().Text(winrt::hstring(name.get()));\n * }\n *\n * Conversely, a coroutine that returns a\n * wil::com_task<T> defaults to resuming in the same\n * COM apartment, but you can allow it to resume on any thread\n * by doing co_await GetNameAsync().resume_any_thread().\n *\n * There is no harm in doing resume_same_apartment() / resume_any_thread() for a\n * task that already defaults to resuming in that manner. In fact, awaiting the\n * task directly is just a shorthand for awaiting the corresponding\n * resume_whatever() method.\n *\n * Alternatively, you can just convert between wil::task<T> and wil::com_task<T>\n * to change the default resumption context.\n *\n * co_await wil::com_task(GetNameAsync()); // now defaults to resume_same_apartment();\n *\n * You can store the task in a variable, but since it is a move-only\n * object, you will have to use std::move in order to transfer ownership out of\n * an lvalue.\n *\n * winrt::IAsyncAction SomethingAsync()\n * {\n *     wil::com_task<int> task;\n *     switch (source)\n *     {\n *     // Some of these might return wil::task<int>,\n *     // but assigning to a wil::com_task<int> will make\n *     // the task resume in the same COM apartment.\n *     case widget: task = GetValueFromWidgetAsync(); break;\n *     case gadget: task = GetValueFromGadgetAsync(); break;\n *     case doodad: task = GetValueFromDoodadAsync(); break;\n *     default:     FAIL_FAST(); // unknown source\n *     }\n *     auto value = co_await std::move(task); // **** need std::move\n *     DoSomethingWith(value);\n * }\n *\n * You can wait synchronously by calling get(). The usual caveats\n * about synchronous waits on STA threads apply.\n *\n * auto value = GetValueFromWidgetAsync().get();\n *\n * auto task = GetValueFromWidgetAsync();\n * auto value = std::move(task).get(); // **** need std::move\n */\n\n// Detect which version of the coroutine standard we have.\n/// @cond\n#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED)\n#include <experimental/coroutine>\n#define __WI_COROUTINE_NAMESPACE ::std::experimental\n#elif defined(__cpp_impl_coroutine)\n#include <coroutine>\n#define __WI_COROUTINE_NAMESPACE ::std\n#else\n#error You must compile with C++20 coroutine support to use coroutine.h.\n#endif\n/// @endcond\n\n#include <atomic>\n#include <exception>\n#include <utility>\n#include <wil/wistd_memory.h>\n#include <wil/wistd_type_traits.h>\n#include <wil/result_macros.h>\n\nnamespace wil\n{\n// There are three general categories of T that you can\n// use with a task. We give them these names:\n//\n// T = void (\"void category\")\n// T = some kind of reference (\"reference category\")\n// T = non-void non-reference (\"object category\")\n//\n// Take care that the implementation supports all three categories.\n//\n// There is a sub-category of object category for move-only types.\n// We designed our task to be co_awaitable only once, so that\n// it can contain a move-only type. Any transfer of T as an\n// object category must be done as an rvalue reference.\ntemplate <typename T>\nstruct task;\n\ntemplate <typename T>\nstruct com_task;\n} // namespace wil\n\n/// @cond\nnamespace wil::details::coro\n{\n// task and com_task are convertible to each other.  However, not\n// all consumers of this header have COM enabled.  Support for saving\n// COM thread-local error information and restoring it on the resuming\n// thread is enabled using these function pointers.  If COM is not\n// available then they are null and do not get called.  If COM is\n// enabled then they are filled in with valid pointers and get used.\n__declspec(selectany) void*(__stdcall* g_pfnCaptureRestrictedErrorInformation)() WI_PFN_NOEXCEPT = nullptr;\n__declspec(selectany) void(__stdcall* g_pfnRestoreRestrictedErrorInformation)(void* restricted_error) WI_PFN_NOEXCEPT = nullptr;\n__declspec(selectany) void(__stdcall* g_pfnDestroyRestrictedErrorInformation)(void* restricted_error) WI_PFN_NOEXCEPT = nullptr;\n\ntemplate <typename T>\nstruct task_promise;\n\n// Unions may not contain references, C++/CX types, or void.\n// To work around that, we put everything inside a result_wrapper\n// struct, and put the struct in the union. For void,\n// we create a special empty structure.\n//\n// get_value returns rvalue reference to T for object\n// category, or just T itself for void and reference\n// category.\n//\n// We take advantage of the reference collapsing rules\n// so that T&& = T if T is reference category.\n\ntemplate <typename T>\nstruct result_wrapper\n{\n    T value;\n    T get_value()\n    {\n        return wistd::forward<T>(value);\n    }\n};\n\ntemplate <>\nstruct result_wrapper<void>\n{\n    void get_value()\n    {\n    }\n};\n\n// The result_holder is basically a\n// std::variant<std::monotype, T, std::exception_ptr>\n// but with these extra quirks:\n// * The only valid transition is monotype -> something-else.\n//   Consequently, it does not have valueless_by_exception.\n\ntemplate <typename T>\nstruct result_holder\n{\n    // The content of the result_holder\n    // depends on the result_status:\n    //\n    // empty: No active member.\n    // value: Active member is wrap.\n    // error: Active member is error.\n    enum class result_status\n    {\n        empty,\n        value,\n        error\n    };\n\n    result_status status{result_status::empty};\n    union variant\n    {\n        variant()\n        {\n        }\n        ~variant()\n        {\n        }\n        result_wrapper<T> wrap;\n        std::exception_ptr error;\n    } result;\n\n    // The restricted error information is lit up when COM headers are\n    // included.  If COM is not available then this will remain null.\n    // This error information is thread-local so we must save it on suspend\n    // and restore it on resume so that it propagates to the correct\n    // thread.  It will then be available if the exception proves fatal.\n    //\n    // This object is non-copyable so we do not need to worry about\n    // supporting AddRef on the restricted error information.\n    void* restricted_error{nullptr};\n\n    // emplace_value will be called with\n    //\n    // * no parameters (void category)\n    // * The reference type T (reference category)\n    // * Some kind of reference to T (object category)\n    //\n    // Set the status after constructing the object.\n    // That way, if object construction throws an exception,\n    // the holder remains empty.\n    template <typename... Args>\n    void emplace_value(Args&&... args)\n    {\n        WI_ASSERT(status == result_status::empty);\n        new (wistd::addressof(result.wrap)) result_wrapper<T>{wistd::forward<Args>(args)...};\n        status = result_status::value;\n    }\n\n    void unhandled_exception() noexcept\n    {\n        if (g_pfnCaptureRestrictedErrorInformation)\n        {\n            WI_ASSERT(restricted_error == nullptr);\n            restricted_error = g_pfnCaptureRestrictedErrorInformation();\n        }\n\n        WI_ASSERT(status == result_status::empty);\n        new (wistd::addressof(result.error)) std::exception_ptr(std::current_exception());\n        status = result_status::error;\n    }\n\n    T get_value()\n    {\n        if (status == result_status::value)\n        {\n            return result.wrap.get_value();\n        }\n\n        WI_ASSERT(status == result_status::error);\n        if (restricted_error && g_pfnRestoreRestrictedErrorInformation)\n        {\n            g_pfnRestoreRestrictedErrorInformation(restricted_error);\n        }\n        std::rethrow_exception(wistd::exchange(result.error, {}));\n    }\n\n    result_holder() = default;\n    result_holder(result_holder const&) = delete;\n    void operator=(result_holder const&) = delete;\n\n    ~result_holder() noexcept(false)\n    {\n        if (restricted_error && g_pfnDestroyRestrictedErrorInformation)\n        {\n            g_pfnDestroyRestrictedErrorInformation(restricted_error);\n            restricted_error = nullptr;\n        }\n\n        switch (status)\n        {\n        case result_status::value:\n            result.wrap.~result_wrapper();\n            break;\n        case result_status::error:\n            // Rethrow unobserved exception. Delete this line to\n            // discard unobserved exceptions.\n            if (result.error)\n                std::rethrow_exception(result.error);\n            result.error.~exception_ptr();\n        }\n    }\n};\n\n// Most of the work is done in the promise_base,\n// It is a CRTP-like base class for task_promise<void> and\n// task_promise<non-void> because the language forbids\n// a single promise from containing both return_value and\n// return_void methods (even if one of them is deleted by SFINAE).\ntemplate <typename T>\nstruct promise_base\n{\n    // The coroutine state remains alive as long as the coroutine is\n    // still running (hasn't reached final_suspend) or the associated\n    // task has not yet abandoned the coroutine (either finished awaiting\n    // or destructed without awaiting).\n    //\n    // This saves an allocation, but does mean that the local\n    // frame of the coroutine will remain allocated (with the\n    // coroutine's imbound parameters still live) until all\n    // references are destroyed. To force the promise_base to be\n    // destroyed after co_await, we make the promise_base a\n    // move-only object and require co_await to be given an rvalue reference.\n\n    // Special values for m_waiting.\n    static void* running_ptr()\n    {\n        return nullptr;\n    }\n    static void* completed_ptr()\n    {\n        return reinterpret_cast<void*>(1);\n    }\n    static void* abandoned_ptr()\n    {\n        return reinterpret_cast<void*>(2);\n    }\n\n    // The awaiting coroutine is resumed by calling the\n    // m_resumer with the m_waiting. If the resumer is null,\n    // then the m_waiting is assumed to be the address of a\n    // coroutine_handle<>, which is resumed synchronously.\n    // Externalizing the resumer allows unused awaiters to be\n    // removed by the linker and removes a hard dependency on COM.\n    // Using nullptr to represent the default resumer avoids a\n    // CFG check.\n\n    void(__stdcall* m_resumer)(void*);\n    std::atomic<void*> m_waiting{running_ptr()};\n    result_holder<T> m_holder;\n\n    // Make it easier to access our CRTP derived class.\n    using Promise = task_promise<T>;\n    auto as_promise() noexcept\n    {\n        return static_cast<Promise*>(this);\n    }\n\n    // Make it easier to access the coroutine handle.\n    auto as_handle() noexcept\n    {\n        return __WI_COROUTINE_NAMESPACE::coroutine_handle<Promise>::from_promise(*as_promise());\n    }\n\n    auto get_return_object() noexcept\n    {\n        // let the compiler construct the task / com_task from the promise.\n        return as_promise();\n    }\n\n    void destroy()\n    {\n        as_handle().destroy();\n    }\n\n    // The client lost interest in the coroutine, either because they are discarding\n    // the result without awaiting (risky!), or because they have finished awaiting.\n    // Discarding the result without awaiting is risky because any exception in the coroutine\n    // will be unobserved and result in a crash. If you want to disallow it, then\n    // raise an exception if waiting == running_ptr.\n    void abandon()\n    {\n        auto waiting = m_waiting.exchange(abandoned_ptr(), std::memory_order_acq_rel);\n        if (waiting != running_ptr())\n            destroy();\n    }\n\n    __WI_COROUTINE_NAMESPACE::suspend_never initial_suspend() noexcept\n    {\n        return {};\n    }\n\n    template <typename... Args>\n    void emplace_value(Args&&... args)\n    {\n        m_holder.emplace_value(wistd::forward<Args>(args)...);\n    }\n\n    void unhandled_exception() noexcept\n    {\n        m_holder.unhandled_exception();\n    }\n\n    void resume_waiting_coroutine(void* waiting) const\n    {\n        if (m_resumer)\n        {\n            m_resumer(waiting);\n        }\n        else\n        {\n            __WI_COROUTINE_NAMESPACE::coroutine_handle<>::from_address(waiting).resume();\n        }\n    }\n\n    auto final_suspend() noexcept\n    {\n        struct awaiter : __WI_COROUTINE_NAMESPACE::suspend_always\n        {\n            promise_base& self;\n            void await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<>) const noexcept\n            {\n                // Need acquire so we can read from m_resumer.\n                // Need release so that the results are published in the case that nobody\n                // is awaiting right now, so that the eventual awaiter (possibly on another thread)\n                // can read the results.\n                auto waiting = self.m_waiting.exchange(completed_ptr(), std::memory_order_acq_rel);\n                if (waiting == abandoned_ptr())\n                {\n                    self.destroy();\n                }\n                else if (waiting != running_ptr())\n                {\n                    WI_ASSERT(waiting != completed_ptr());\n                    self.resume_waiting_coroutine(waiting);\n                }\n            };\n        };\n        return awaiter{{}, *this};\n    }\n\n    // The remaining methods are used by the awaiters.\n    bool client_await_ready()\n    {\n        // Need acquire in case the coroutine has already completed,\n        // so we can read the results. This matches the release in\n        // the final_suspend's await_suspend.\n        auto waiting = m_waiting.load(std::memory_order_acquire);\n        WI_ASSERT((waiting == running_ptr()) || (waiting == completed_ptr()));\n        return waiting != running_ptr();\n    }\n\n    auto client_await_suspend(void* waiting, void(__stdcall* resumer)(void*))\n    {\n        // \"waiting\" needs to be a pointer to an object. We reserve the first 16\n        // pseudo-pointers as sentinels.\n        WI_ASSERT(reinterpret_cast<uintptr_t>(waiting) > 16);\n\n        m_resumer = resumer;\n\n        // Acquire to ensure that we can read the results of the return value, if the coroutine is completed.\n        // Release to ensure that our resumption state is published, if the coroutine is not completed.\n        auto previous = m_waiting.exchange(waiting, std::memory_order_acq_rel);\n\n        // Suspend if the coroutine is still running.\n        // Otherwise, the coroutine is completed: Nobody will resume us, so we will have to resume ourselves.\n        WI_ASSERT((previous == running_ptr()) || (previous == completed_ptr()));\n        return previous == running_ptr();\n    }\n\n    T client_await_resume()\n    {\n        return m_holder.get_value();\n    }\n};\n\ntemplate <typename T>\nstruct task_promise : promise_base<T>\n{\n    template <typename U>\n    void return_value(U&& value)\n    {\n        this->emplace_value(wistd::forward<U>(value));\n    }\n\n    template <typename Dummy = void>\n    wistd::enable_if_t<!wistd::is_reference_v<T>, Dummy> return_value(T const& value)\n    {\n        this->emplace_value(value);\n    }\n};\n\ntemplate <>\nstruct task_promise<void> : promise_base<void>\n{\n    void return_void()\n    {\n        this->emplace_value();\n    }\n};\n\ntemplate <typename T>\nstruct promise_deleter\n{\n    void operator()(promise_base<T>* promise) const noexcept\n    {\n        promise->abandon();\n    }\n};\n\ntemplate <typename T>\nusing promise_ptr = wistd::unique_ptr<promise_base<T>, promise_deleter<T>>;\n\ntemplate <typename T>\nstruct agile_awaiter\n{\n    agile_awaiter(promise_ptr<T>&& initial) : promise(wistd::move(initial))\n    {\n    }\n\n    promise_ptr<T> promise;\n\n    bool await_ready()\n    {\n        return promise->client_await_ready();\n    }\n\n    auto await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle)\n    {\n        // Use the default resumer.\n        return promise->client_await_suspend(handle.address(), nullptr);\n    }\n\n    T await_resume()\n    {\n        return promise->client_await_resume();\n    }\n};\n\ntemplate <typename T>\nstruct task_base\n{\n    auto resume_any_thread() && noexcept\n    {\n        return agile_awaiter<T>{wistd::move(promise)};\n    }\n\n    // You must #include <ole2.h> before <wil/coroutine.h> to enable apartment-aware awaiting.\n    auto resume_same_apartment() && noexcept;\n\n    // Compiler error message metaprogramming: Tell people that they\n    // need to use std::move() if they try to co_await an lvalue.\n    struct cannot_await_lvalue_use_std_move\n    {\n        void await_ready()\n        {\n        }\n    };\n    cannot_await_lvalue_use_std_move operator co_await() & = delete;\n\n    // You must #include <synchapi.h> (usually via <windows.h>) to enable synchronous waiting.\n    decltype(auto) get() &&;\n\nprotected:\n    task_base(task_promise<T>* initial = nullptr) noexcept : promise(initial)\n    {\n    }\n\n    template <typename D>\n    D& assign(D* self, task_base&& other) noexcept\n    {\n        static_cast<task_base&>(*this) = wistd::move(other);\n        return *self;\n    }\n\nprivate:\n    promise_ptr<T> promise;\n\n    static void __stdcall wake_by_address(void* completed);\n};\n} // namespace wil::details::coro\n/// @endcond\n\nnamespace wil\n{\n// Must write out both classes separately\n// Cannot use deduction guides with alias template type prior to C++20.\ntemplate <typename T>\nstruct task : details::coro::task_base<T>\n{\n    using base = details::coro::task_base<T>;\n    // Constructing from task_promise<T>* cannot be explicit because get_return_object relies on implicit conversion.\n    task(details::coro::task_promise<T>* initial = nullptr) noexcept : base(initial)\n    {\n    }\n    explicit task(base&& other) noexcept : base(wistd::move(other))\n    {\n    }\n    task& operator=(base&& other) noexcept\n    {\n        return base::assign(this, wistd::move(other));\n    }\n\n    using base::operator co_await;\n\n    auto operator co_await() && noexcept\n    {\n        return wistd::move(*this).resume_any_thread();\n    }\n};\n\ntemplate <typename T>\nstruct com_task : details::coro::task_base<T>\n{\n    using base = details::coro::task_base<T>;\n    // Constructing from task_promise<T>* cannot be explicit because get_return_object relies on implicit conversion.\n    com_task(details::coro::task_promise<T>* initial = nullptr) noexcept : base(initial)\n    {\n    }\n    explicit com_task(base&& other) noexcept : base(wistd::move(other))\n    {\n    }\n    com_task& operator=(base&& other) noexcept\n    {\n        return base::assign(this, wistd::move(other));\n    }\n\n    using base::operator co_await;\n\n    auto operator co_await() && noexcept\n    {\n        // You must #include <ole2.h> before <wil/coroutine.h> to enable non-agile awaiting.\n        return wistd::move(*this).resume_same_apartment();\n    }\n};\n\ntemplate <typename T>\ntask(com_task<T>&&) -> task<T>;\ntemplate <typename T>\ncom_task(task<T>&&) -> com_task<T>;\n} // namespace wil\n\ntemplate <typename T, typename... Args>\nstruct __WI_COROUTINE_NAMESPACE::coroutine_traits<wil::task<T>, Args...>\n{\n    using promise_type = wil::details::coro::task_promise<T>;\n};\n\ntemplate <typename T, typename... Args>\nstruct __WI_COROUTINE_NAMESPACE::coroutine_traits<wil::com_task<T>, Args...>\n{\n    using promise_type = wil::details::coro::task_promise<T>;\n};\n\n#endif // __WIL_COROUTINE_INCLUDED\n\n// Can re-include this header after including synchapi.h (usually via windows.h) to enable synchronous wait.\n#if defined(_SYNCHAPI_H_) && !defined(__WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED)\n#define __WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED\n\nnamespace wil::details::coro\n{\ntemplate <typename T>\ndecltype(auto) task_base<T>::get() &&\n{\n    if (!promise->client_await_ready())\n    {\n        bool completed = false;\n        if (promise->client_await_suspend(&completed, wake_by_address))\n        {\n            bool pending = false;\n            while (!completed)\n            {\n                WaitOnAddress(&completed, &pending, sizeof(pending), INFINITE);\n            }\n        }\n    }\n    return std::exchange(promise, {})->client_await_resume();\n}\n\ntemplate <typename T>\nvoid __stdcall task_base<T>::wake_by_address(void* completed)\n{\n    *reinterpret_cast<bool*>(completed) = true;\n    WakeByAddressSingle(completed);\n}\n} // namespace wil::details::coro\n#endif // __WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED\n\n// Can re-include this header after including COM header files to enable non-agile tasks.\n#if defined(_COMBASEAPI_H_) && defined(_THREADPOOLAPISET_H_) && !defined(__WIL_COROUTINE_NON_AGILE_INCLUDED)\n#define __WIL_COROUTINE_NON_AGILE_INCLUDED\n#include <ctxtcall.h>\n#include <wil/com.h>\n#include <roerrorapi.h>\n\nnamespace wil::details::coro\n{\ninline void* __stdcall CaptureRestrictedErrorInformation() noexcept\n{\n    IRestrictedErrorInfo* restrictedError = nullptr;\n    (void)GetRestrictedErrorInfo(&restrictedError);\n    return restrictedError; // the returned object includes a strong reference\n}\n\ninline void __stdcall RestoreRestrictedErrorInformation(_In_ void* restricted_error) noexcept\n{\n    (void)SetRestrictedErrorInfo(static_cast<IRestrictedErrorInfo*>(restricted_error));\n}\n\ninline void __stdcall DestroyRestrictedErrorInformation(_In_ void* restricted_error) noexcept\n{\n    static_cast<IUnknown*>(restricted_error)->Release();\n}\n\nstruct apartment_info\n{\n    APTTYPE aptType{};\n    APTTYPEQUALIFIER aptTypeQualifier{};\n\n    void load()\n    {\n        if (FAILED(CoGetApartmentType(&aptType, &aptTypeQualifier)))\n        {\n            // If COM is not initialized, then act as if we are running\n            // on the implicit MTA.\n            aptType = APTTYPE_MTA;\n            aptTypeQualifier = APTTYPEQUALIFIER_IMPLICIT_MTA;\n        }\n    }\n};\n\n// apartment_resumer resumes a coroutine in a captured apartment.\nstruct apartment_resumer\n{\n    static auto as_self(void* p)\n    {\n        return reinterpret_cast<apartment_resumer*>(p);\n    }\n\n    static bool is_sta()\n    {\n        apartment_info info;\n        info.load();\n        switch (info.aptType)\n        {\n        case APTTYPE_STA:\n        case APTTYPE_MAINSTA:\n            return true;\n        case APTTYPE_NA:\n            return info.aptTypeQualifier == APTTYPEQUALIFIER_NA_ON_STA || info.aptTypeQualifier == APTTYPEQUALIFIER_NA_ON_MAINSTA;\n        default:\n            return false;\n        }\n    }\n\n    static wil::com_ptr<IContextCallback> current_context()\n    {\n        wil::com_ptr<IContextCallback> context;\n        // This will fail if COM is not initialized. Treat as implicit MTA.\n        // Do not use IID_PPV_ARGS to avoid ambiguity between ::IUnknown and winrt::IUnknown.\n        CoGetObjectContext(__uuidof(IContextCallback), reinterpret_cast<void**>(&context));\n        return context;\n    }\n\n    __WI_COROUTINE_NAMESPACE::coroutine_handle<> waiter;\n    wil::com_ptr<IContextCallback> context{nullptr};\n    apartment_info info{};\n    HRESULT resume_result = S_OK;\n\n    void capture_context(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle)\n    {\n        waiter = handle;\n        info.load();\n        context = current_context();\n        if (context == nullptr)\n        {\n            __debugbreak();\n        }\n    }\n\n    static void __stdcall resume_in_context(void* parameter)\n    {\n        auto self = as_self(parameter);\n        if (self->context == nullptr || self->context == current_context())\n        {\n            self->context = nullptr; // removes the context cleanup from the resume path\n            self->waiter();\n        }\n        else if (is_sta())\n        {\n            submit_threadpool_callback(resume_context, self);\n        }\n        else\n        {\n            self->resume_context_sync();\n        }\n    }\n\n    static void submit_threadpool_callback(PTP_SIMPLE_CALLBACK callback, void* context)\n    {\n        THROW_IF_WIN32_BOOL_FALSE(TrySubmitThreadpoolCallback(callback, context, nullptr));\n    }\n\n    static void CALLBACK resume_context(PTP_CALLBACK_INSTANCE /*instance*/, void* parameter)\n    {\n        as_self(parameter)->resume_context_sync();\n    }\n\n    void resume_context_sync()\n    {\n        ComCallData data{};\n        data.pUserDefined = this;\n        // The call to resume_apartment_callback will destruct the context.\n        // Capture into a local so we don't destruct it while it's in use.\n        // This also removes the context cleanup from the resume path.\n        auto local_context = wistd::move(context);\n        auto result =\n            local_context->ContextCallback(resume_apartment_callback, &data, IID_ICallbackWithNoReentrancyToApplicationSTA, 5, nullptr);\n        if (FAILED(result))\n        {\n            // Unable to resume on the correct apartment.\n            // Resume on the wrong apartment, but tell the coroutine why.\n            resume_result = result;\n            waiter();\n        }\n    }\n\n    static HRESULT CALLBACK resume_apartment_callback(ComCallData* data) noexcept\n    {\n        as_self(data->pUserDefined)->waiter();\n        return S_OK;\n    }\n\n    void check()\n    {\n        THROW_IF_FAILED(resume_result);\n    }\n};\n\n// The COM awaiter captures the COM context when the co_await begins.\n// When the co_await completes, it uses that COM context to resume execution.\n// This follows the same algorithm employed by C++/WinRT, which has features like\n// avoiding stack buildup and proper handling of the neutral apartment.\n// It does, however, introduce fail-fast code paths if thread pool tasks cannot\n// be submitted. (Those fail-fasts could be removed by preallocating the tasks,\n// but that means paying an up-front cost for something that may never end up used,\n// as well as introducing extra cleanup code in the fast-path.)\ntemplate <typename T>\nstruct com_awaiter : agile_awaiter<T>\n{\n    com_awaiter(promise_ptr<T>&& initial) : agile_awaiter<T>(wistd::move(initial))\n    {\n    }\n    apartment_resumer resumer;\n\n    auto await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle)\n    {\n        resumer.capture_context(handle);\n        return this->promise->client_await_suspend(wistd::addressof(resumer), apartment_resumer::resume_in_context);\n    }\n\n    decltype(auto) await_resume()\n    {\n        resumer.check();\n        return agile_awaiter<T>::await_resume();\n    }\n};\n\ntemplate <typename T>\nauto task_base<T>::resume_same_apartment() && noexcept\n{\n    return com_awaiter<T>{wistd::move(promise)};\n}\n} // namespace wil::details::coro\n\n// This section is lit up when COM headers are available.  Initialize the global function\n// pointers such that error information can be saved and restored across thread boundaries.\nWI_HEADER_INITIALIZATION_FUNCTION(CoroutineRestrictedErrorInitialize, [] {\n    ::wil::details::coro::g_pfnCaptureRestrictedErrorInformation = ::wil::details::coro::CaptureRestrictedErrorInformation;\n    ::wil::details::coro::g_pfnRestoreRestrictedErrorInformation = ::wil::details::coro::RestoreRestrictedErrorInformation;\n    ::wil::details::coro::g_pfnDestroyRestrictedErrorInformation = ::wil::details::coro::DestroyRestrictedErrorInformation;\n    return 1;\n})\n\n#endif // __WIL_COROUTINE_NON_AGILE_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: support for interoperability between WIL and C++/WinRT exception-to-HRESULT logic.\n#ifndef __WIL_CPPWINRT_INCLUDED\n#define __WIL_CPPWINRT_INCLUDED\n\n#include \"common.h\"\n#include <windows.h>\n#include <unknwn.h>\n#include <inspectable.h>\n#include <hstring.h>\n\n// WIL and C++/WinRT use two different exception types for communicating HRESULT failures. Thus, both libraries need to\n// understand how to translate these exception types into the correct HRESULT values at the ABI boundary. Prior to\n// C++/WinRT \"2.0\" this was accomplished by injecting the WINRT_EXTERNAL_CATCH_CLAUSE macro - that WIL defines below -\n// into its exception handler (winrt::to_hresult). Starting with C++/WinRT \"2.0\" this mechanism has shifted to a global\n// function pointer - winrt_to_hresult_handler - that WIL sets automatically when this header is included and\n// 'CPPWINRT_SUPPRESS_STATIC_INITIALIZERS' is not defined.\n\n/// @cond\nnamespace wil::details\n{\n// Since the C++/WinRT version macro is a string...\n// For example: \"2.0.221104.6\"\ninline constexpr int version_from_string(const char* versionString)\n{\n    int result = 0;\n    while ((*versionString >= '0') && (*versionString <= '9'))\n    {\n        result = result * 10 + (*versionString - '0');\n        ++versionString;\n    }\n\n    return result;\n}\n\ninline constexpr int major_version_from_string(const char* versionString)\n{\n    return version_from_string(versionString);\n}\n\ninline constexpr int minor_version_from_string(const char* versionString)\n{\n    int dotCount = 0;\n    while ((*versionString != '\\0'))\n    {\n        if (*versionString == '.')\n        {\n            ++dotCount;\n        }\n\n        ++versionString;\n        if (dotCount == 2)\n        {\n            return version_from_string(versionString);\n        }\n    }\n\n    return 0;\n}\n} // namespace wil::details\n/// @endcond\n\n#ifdef CPPWINRT_VERSION\n// Prior to C++/WinRT \"2.0\" this header needed to be included before 'winrt/base.h' so that our definition of\n// 'WINRT_EXTERNAL_CATCH_CLAUSE' would get picked up in the implementation of 'winrt::to_hresult'. This is no longer\n// problematic, so only emit an error when using a version of C++/WinRT prior to 2.0\nstatic_assert(::wil::details::major_version_from_string(CPPWINRT_VERSION) >= 2, \"Please include wil/cppwinrt.h before including any C++/WinRT headers\");\n#endif\n\n// NOTE: Will eventually be removed once C++/WinRT 2.0 use can be assumed\n/// @cond\n#ifdef WINRT_EXTERNAL_CATCH_CLAUSE\n#define __WI_CONFLICTING_WINRT_EXTERNAL_CATCH_CLAUSE 1\n#else\n#define WINRT_EXTERNAL_CATCH_CLAUSE \\\n    catch (const wil::ResultException& e) \\\n    { \\\n        return winrt::hresult_error(e.GetErrorCode(), winrt::to_hstring(e.what())).to_abi(); \\\n    }\n#endif\n/// @endcond\n\n#include \"result_macros.h\"\n#include <winrt/base.h>\n\n#if __WI_CONFLICTING_WINRT_EXTERNAL_CATCH_CLAUSE\nstatic_assert(::wil::details::major_version_from_string(CPPWINRT_VERSION) >= 2, \"C++/WinRT external catch clause already defined outside of WIL\");\n#endif\n\n/// @cond\n// In C++/WinRT 2.0 and beyond, this function pointer exists. In earlier versions it does not. It's much easier to avoid\n// linker errors than it is to SFINAE on variable existence, so we declare the variable here, but are careful not to\n// use it unless the version of C++/WinRT is high enough\nextern std::int32_t(__stdcall* winrt_to_hresult_handler)(void*) noexcept;\n\n// The same is true with this function pointer as well, except that the version must be 2.X or higher.\nextern void(__stdcall* winrt_throw_hresult_handler)(uint32_t, char const*, char const*, void*, winrt::hresult const) noexcept;\n/// @endcond\n\n/// @cond\nnamespace wil::details\n{\ninline void MaybeGetExceptionString(\n    const winrt::hresult_error& exception,\n    _Out_writes_opt_(debugStringChars) PWSTR debugString,\n    _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars)\n{\n    if (debugString)\n    {\n        StringCchPrintfW(debugString, debugStringChars, L\"winrt::hresult_error: %ls\", exception.message().c_str());\n    }\n}\n\ninline HRESULT __stdcall ResultFromCaughtException_CppWinRt(\n    _Inout_updates_opt_(debugStringChars) PWSTR debugString,\n    _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n    _Inout_ bool* isNormalized) noexcept\n{\n    if (g_pfnResultFromCaughtException)\n    {\n        try\n        {\n            throw;\n        }\n        catch (const ResultException& exception)\n        {\n            *isNormalized = true;\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return exception.GetErrorCode();\n        }\n        catch (const winrt::hresult_error& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return exception.to_abi();\n        }\n        catch (const std::bad_alloc& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_OUTOFMEMORY;\n        }\n        catch (const std::out_of_range& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_BOUNDS;\n        }\n        catch (const std::invalid_argument& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_INVALIDARG;\n        }\n        catch (...)\n        {\n            auto hr = RecognizeCaughtExceptionFromCallback(debugString, debugStringChars);\n            if (FAILED(hr))\n            {\n                return hr;\n            }\n        }\n    }\n    else\n    {\n        try\n        {\n            throw;\n        }\n        catch (const ResultException& exception)\n        {\n            *isNormalized = true;\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return exception.GetErrorCode();\n        }\n        catch (const winrt::hresult_error& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return exception.to_abi();\n        }\n        catch (const std::bad_alloc& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_OUTOFMEMORY;\n        }\n        catch (const std::out_of_range& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_BOUNDS;\n        }\n        catch (const std::invalid_argument& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return E_INVALIDARG;\n        }\n        catch (const std::exception& exception)\n        {\n            MaybeGetExceptionString(exception, debugString, debugStringChars);\n            return HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION);\n        }\n        catch (...)\n        {\n            // Fall through to returning 'S_OK' below\n        }\n    }\n\n    // Tell the caller that we were unable to map the exception by succeeding...\n    return S_OK;\n}\n} // namespace wil::details\n/// @endcond\n\nnamespace wil\n{\ninline std::int32_t __stdcall winrt_to_hresult(void* returnAddress) noexcept\n{\n    // C++/WinRT only gives us the return address (caller), so pass along an empty 'DiagnosticsInfo' since we don't\n    // have accurate file/line/etc. information\n    return static_cast<std::int32_t>(\n        details::ReportFailure_CaughtException<FailureType::Return>(__R_DIAGNOSTICS_RA(DiagnosticsInfo{}, returnAddress)));\n}\n\ninline void __stdcall winrt_throw_hresult(\n    uint32_t lineNumber, char const* fileName, char const* functionName, void* returnAddress, winrt::hresult const result) noexcept\n{\n    void* callerReturnAddress{nullptr};\n    PCSTR code{nullptr};\n    wil::details::ReportFailure_Hr<FailureType::Log>(__R_FN_CALL_FULL __R_COMMA result);\n}\n\ninline void WilInitialize_CppWinRT()\n{\n    details::g_pfnResultFromCaughtException_CppWinRt = details::ResultFromCaughtException_CppWinRt;\n    if constexpr (details::major_version_from_string(CPPWINRT_VERSION) >= 2)\n    {\n        WI_ASSERT(winrt_to_hresult_handler == nullptr);\n        winrt_to_hresult_handler = winrt_to_hresult;\n\n        if constexpr (details::minor_version_from_string(CPPWINRT_VERSION) >= 210122)\n        {\n            WI_ASSERT(winrt_throw_hresult_handler == nullptr);\n            winrt_throw_hresult_handler = winrt_throw_hresult;\n        }\n    }\n}\n\n/// @cond\nnamespace details\n{\n#ifndef CPPWINRT_SUPPRESS_STATIC_INITIALIZERS\n    WI_ODR_PRAGMA(\"CPPWINRT_SUPPRESS_STATIC_INITIALIZERS\", \"0\")\n    WI_HEADER_INITIALIZATION_FUNCTION(WilInitialize_CppWinRT, [] {\n        ::wil::WilInitialize_CppWinRT();\n        return 1;\n    });\n#else\n    WI_ODR_PRAGMA(\"CPPWINRT_SUPPRESS_STATIC_INITIALIZERS\", \"1\")\n#endif\n} // namespace details\n/// @endcond\n\n// Provides an overload of verify_hresult so that the WIL macros can recognize winrt::hresult as a valid \"hresult\" type.\ninline long verify_hresult(winrt::hresult hr) noexcept\n{\n    return hr;\n}\n\n// Provides versions of get_abi and put_abi for genericity that directly use HSTRING for convenience.\ntemplate <typename T>\nauto get_abi(T const& object) noexcept\n{\n    return winrt::get_abi(object);\n}\n\ninline auto get_abi(winrt::hstring const& object) noexcept\n{\n    return static_cast<HSTRING>(winrt::get_abi(object));\n}\n\ninline auto str_raw_ptr(const winrt::hstring& str) noexcept\n{\n    return str.c_str();\n}\n\ntemplate <typename T>\nauto put_abi(T& object) noexcept\n{\n    return winrt::put_abi(object);\n}\n\ninline auto put_abi(winrt::hstring& object) noexcept\n{\n    return reinterpret_cast<HSTRING*>(winrt::put_abi(object));\n}\n\ninline ::IUnknown* com_raw_ptr(const winrt::Windows::Foundation::IUnknown& ptr) noexcept\n{\n    return static_cast<::IUnknown*>(winrt::get_abi(ptr));\n}\n\n// Needed to power wil::cx_object_from_abi that requires IInspectable\ninline ::IInspectable* com_raw_ptr(const winrt::Windows::Foundation::IInspectable& ptr) noexcept\n{\n    return static_cast<::IInspectable*>(winrt::get_abi(ptr));\n}\n\n// Taken from the docs.microsoft.com article\ntemplate <typename T>\nT convert_from_abi(::IUnknown* from)\n{\n    T to{nullptr}; // `T` is a projected type.\n    winrt::check_hresult(from->QueryInterface(winrt::guid_of<T>(), winrt::put_abi(to)));\n    return to;\n}\n\n// For obtaining an object from an interop method on the factory. Example:\n// winrt::InputPane inputPane = wil::capture_interop<winrt::InputPane>(&IInputPaneInterop::GetForWindow, hwnd);\n// If the method produces something different from the factory type:\n// winrt::IAsyncAction action = wil::capture_interop<winrt::IAsyncAction, winrt::AccountsSettingsPane>(&IAccountsSettingsPaneInterop::ShowAddAccountForWindow, hwnd);\ntemplate <typename WinRTResult, typename WinRTFactory = WinRTResult, typename Interface, typename... InterfaceArgs, typename... Args>\nauto capture_interop(HRESULT (__stdcall Interface::*method)(InterfaceArgs...), Args&&... args)\n{\n    auto interop = winrt::get_activation_factory<WinRTFactory, Interface>();\n    return winrt::capture<WinRTResult>(interop, method, std::forward<Args>(args)...);\n}\n\n// For obtaining an object from an interop method on an instance. Example:\n// winrt::UserActivitySession session = wil::capture_interop<winrt::UserActivitySession>(activity, &IUserActivityInterop::CreateSessionForWindow, hwnd);\ntemplate <typename WinRTResult, typename Interface, typename... InterfaceArgs, typename... Args>\nauto capture_interop(winrt::Windows::Foundation::IUnknown const& o, HRESULT (__stdcall Interface::*method)(InterfaceArgs...), Args&&... args)\n{\n    return winrt::capture<WinRTResult>(o.as<Interface>(), method, std::forward<Args>(args)...);\n}\n\n/** Holds a reference to the host C++/WinRT module to prevent it from being unloaded.\nNormally, this is done by being in an IAsyncOperation coroutine or by holding a strong\nreference to a C++/WinRT object hosted in the same module, but if you have neither,\nyou will need to hold a reference explicitly. For the WRL equivalent, see wrl_module_reference.\n\nThis can be used as a base, which permits EBO:\n@code\nstruct NonWinrtObject : wil::winrt_module_reference\n{\n    int value;\n};\n\n// DLL will not be unloaded as long as NonWinrtObject is still alive.\nauto p = std::make_unique<NonWinrtObject>();\n@endcode\n\nOr it can be used as a member (with [[no_unique_address]] to avoid\noccupying any memory):\n@code\nstruct NonWinrtObject\n{\n    int value;\n\n    [[no_unique_address]] wil::winrt_module_reference module_ref;\n};\n\n// DLL will not be unloaded as long as NonWinrtObject is still alive.\nauto p = std::make_unique<NonWinrtObject>();\n@endcode\n\nIf using it to prevent the host DLL from unloading while a thread\nor threadpool work item is still running, create the object before\nstarting the thread, and pass it to the thread. This avoids a race\ncondition where the host DLL could get unloaded before the thread starts.\n@code\nstd::thread([module_ref = wil::winrt_module_reference()]() { do_background_work(); });\n\n// Don't do this (race condition)\nstd::thread([]() { wil::winrt_module_reference module_ref; do_background_work(); }); // WRONG\n@endcode\n\nAlso useful in coroutines that neither capture DLL-hosted COM objects, nor are themselves\nDLL-hosted COM objects. (If the coroutine returns IAsyncAction or captures a get_strong()\nof its containing WinRT class, then the IAsyncAction or strong reference will itself keep\na strong reference to the host module.)\n@code\nwinrt::fire_and_forget ContinueBackgroundWork()\n{\n    // prevent DLL from unloading while we are running on a background thread.\n    // Do this before switching to the background thread.\n    wil::winrt_module_reference module_ref;\n\n    co_await winrt::resume_background();\n    do_background_work();\n};\n@endcode\n*/\nstruct [[nodiscard]] winrt_module_reference\n{\n    winrt_module_reference()\n    {\n        ++winrt::get_module_lock();\n    }\n\n    winrt_module_reference(winrt_module_reference const&) : winrt_module_reference()\n    {\n    }\n\n    ~winrt_module_reference()\n    {\n        --winrt::get_module_lock();\n    }\n};\n\n/** Implements a C++/WinRT class where some interfaces are conditionally supported.\n@code\n// Assume the existence of a class \"Version2\" which says whether\n// the IMyThing2 interface should be supported.\nstruct Version2 { static bool IsEnabled(); };\n\n// Declare implementation class which conditionally supports IMyThing2.\nstruct MyThing : wil::winrt_conditionally_implements<MyThingT<MyThing>,\n                     Version2, IMyThing2>\n{\n    // implementation goes here\n};\n\n@endcode\n\nIf `Version2::IsEnabled()` returns `false`, then the `QueryInterface`\nfor `IMyThing2` will fail.\n\nAny interface not listed as conditional is assumed to be enabled unconditionally.\n\nYou can add additional Version / Interface pairs to the template parameter list.\nInterfaces may be conditionalized on at most one Version class. If you need a\ncomplex conditional, create a new helper class.\n\n@code\n// Helper class for testing two Versions.\nstruct Version2_or_greater {\n    static bool IsEnabled() { return Version2::IsEnabled() || Version3::IsEnabled(); }\n};\n\n// This implementation supports IMyThing2 if either Version2 or Version3 is enabled,\n// and supports IMyThing3 only if Version3 is enabled.\nstruct MyThing : wil::winrt_conditionally_implements<MyThingT<MyThing>,\nVersion2_or_greater, IMyThing2, Version3, IMyThing3>\n{\n    // implementation goes here\n};\n@endcode\n*/\ntemplate <typename Implements, typename... Rest>\nstruct winrt_conditionally_implements : Implements\n{\n    using Implements::Implements;\n\n    void* find_interface(winrt::guid const& iid) const noexcept override\n    {\n        static_assert(sizeof...(Rest) % 2 == 0, \"Extra template parameters should come in groups of two\");\n        if (is_enabled<0, std::tuple<Rest...>>(iid))\n        {\n            return Implements::find_interface(iid);\n        }\n        return nullptr;\n    }\n\nprivate:\n    template <std::size_t index, typename Tuple>\n    static bool is_enabled(winrt::guid const& iid)\n    {\n        if constexpr (index >= std::tuple_size_v<Tuple>)\n        {\n            return true;\n        }\n        else\n        {\n            check_no_duplicates<1, index + 1, Tuple>();\n            return (iid == winrt::guid_of<std::tuple_element_t<index + 1, Tuple>>()) ? std::tuple_element_t<index, Tuple>::IsEnabled()\n                                                                                     : is_enabled<index + 2, Tuple>(iid);\n        }\n    }\n\n    template <std::size_t index, std::size_t upto, typename Tuple>\n    static constexpr void check_no_duplicates()\n    {\n        if constexpr (index < upto)\n        {\n            static_assert(\n                !std::is_same_v<std::tuple_element_t<index, Tuple>, std::tuple_element_t<upto, Tuple>>,\n                \"Duplicate interfaces found in winrt_conditionally_implements\");\n            check_no_duplicates<index + 2, upto, Tuple>();\n        }\n    }\n};\n} // namespace wil\n\n#endif // __WIL_CPPWINRT_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt_authoring.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers that make authoring C++/WinRT components easier.\n\nnamespace wil\n{\n#ifndef __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED\n/// @cond\n#define __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED\nnamespace details\n{\n    template <typename T>\n    struct single_threaded_property_storage\n    {\n        T m_value{};\n        single_threaded_property_storage() = default;\n        single_threaded_property_storage(const T& value) : m_value(value)\n        {\n        }\n        operator T&()\n        {\n            return m_value;\n        }\n        operator T const&() const\n        {\n            return m_value;\n        }\n        template <typename Q>\n        auto operator=(Q&& q)\n        {\n            m_value = wistd::forward<Q>(q);\n            return *this;\n        }\n    };\n} // namespace details\n/// @endcond\n\ntemplate <typename T>\nstruct single_threaded_property\n    : std::conditional_t<std::is_scalar_v<T> || std::is_final_v<T>, wil::details::single_threaded_property_storage<T>, T>\n{\n    single_threaded_property() = default;\n    template <typename... TArgs>\n    single_threaded_property(TArgs&&... value) : base_type(std::forward<TArgs>(value)...)\n    {\n    }\n\n    using base_type =\n        std::conditional_t<std::is_scalar_v<T> || std::is_final_v<T>, wil::details::single_threaded_property_storage<T>, T>;\n\n    T operator()() const\n    {\n        return *this;\n    }\n\n    // This is the only setter exposed. We don't expose `operator()(Q&& q)`,\n    // since that is what C++/WinRT uses to implement public setters. Since\n    // single_threaded_property is intended for readonly properties, we\n    // don't want to expose that.\n    //\n    // To set the value of this property *internally* (within your\n    // implementation), use this `operator=`:\n    //\n    //     MyProperty = 42;\n    //     // MyProperty(42); // won't work\n    //\n    // For settable properties, use single_threaded_rw_property<T> instead.\n    template <typename Q>\n    auto& operator=(Q&& q)\n    {\n        static_cast<base_type&>(*this) = std::forward<Q>(q);\n        return *this;\n    }\n};\n\ntemplate <typename T>\nstruct single_threaded_rw_property : single_threaded_property<T>\n{\n    using base_type = single_threaded_property<T>;\n    template <typename... TArgs>\n    single_threaded_rw_property(TArgs&&... value) : base_type(std::forward<TArgs>(value)...)\n    {\n    }\n\n    using base_type::operator();\n\n    // needed in lieu of deducing-this\n    template <typename Q>\n    auto& operator()(Q&& q)\n    {\n        return *this = std::forward<Q>(q);\n    }\n\n    // needed in lieu of deducing-this\n    template <typename Q>\n    auto& operator=(Q&& q)\n    {\n        base_type::operator=(std::forward<Q>(q));\n        return *this;\n    }\n};\n\n#endif // __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED\n\n#if (!defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION) && defined(WINRT_Windows_Foundation_H)) || \\\n    defined(WIL_DOXYGEN) // WinRT / XAML helpers\n/// @cond\n#define __WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION\nnamespace details\n{\n    template <typename T>\n    struct event_base\n    {\n        winrt::event_token operator()(const T& handler)\n        {\n            return m_handler.add(handler);\n        }\n\n        auto operator()(const winrt::event_token& token) noexcept\n        {\n            return m_handler.remove(token);\n        }\n\n        template <typename... TArgs>\n        auto invoke(TArgs&&... args)\n        {\n            return m_handler(std::forward<TArgs>(args)...);\n        }\n\n    private:\n        winrt::event<T> m_handler;\n    };\n} // namespace details\n/// @endcond\n\n/**\n * @brief A default event handler that maps to\n * [Windows.Foundation.EventHandler](https://docs.microsoft.com/uwp/api/windows.foundation.eventhandler-1).\n * @tparam T The event data type.\n */\ntemplate <typename T>\nstruct untyped_event : wil::details::event_base<winrt::Windows::Foundation::EventHandler<T>>\n{\n};\n\n/**\n * @brief A default event handler that maps to\n * [Windows.Foundation.TypedEventHandler](https://docs.microsoft.com/uwp/api/windows.foundation.typedeventhandler-2).\n * @tparam T The event data type.\n * @details Usage example:\n * @code\n *         // In IDL, this corresponds to:\n *         //   event Windows.Foundation.TypedEventHandler<ModalPage, String> OkClicked;\n *         wil::typed_event<MarkupSample::ModalPage, winrt::hstring> OkClicked;\n * @endcode\n */\ntemplate <typename TSender, typename TArgs>\nstruct typed_event : wil::details::event_base<winrt::Windows::Foundation::TypedEventHandler<TSender, TArgs>>\n{\n};\n\n#endif // !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION) && defined(WINRT_Windows_Foundation_H)\n\n#if (!defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA) && (defined(WINRT_Microsoft_UI_Xaml_Data_H) || defined(WINRT_Windows_UI_Xaml_Data_H))) || \\\n    defined(WIL_DOXYGEN) // INotifyPropertyChanged helpers\n/// @cond\n#define __WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA\nnamespace details\n{\n#ifdef WINRT_Microsoft_UI_Xaml_Data_H\n    using Xaml_Data_PropertyChangedEventHandler = winrt::Microsoft::UI::Xaml::Data::PropertyChangedEventHandler;\n    using Xaml_Data_PropertyChangedEventArgs = winrt::Microsoft::UI::Xaml::Data::PropertyChangedEventArgs;\n#elif defined(WINRT_Windows_UI_Xaml_Data_H)\n    using Xaml_Data_PropertyChangedEventHandler = winrt::Windows::UI::Xaml::Data::PropertyChangedEventHandler;\n    using Xaml_Data_PropertyChangedEventArgs = winrt::Windows::UI::Xaml::Data::PropertyChangedEventArgs;\n#endif\n} // namespace details\n/// @endcond\n\n/**\n * @brief Helper base class to inherit from to have a simple implementation of\n * [INotifyPropertyChanged](https://docs.microsoft.com/uwp/api/windows.ui.xaml.data.inotifypropertychanged).\n * @tparam T CRTP type\n * @details When you declare your class, make this class a base class and pass your class as a template parameter:\n * @code\n * struct MyPage : MyPageT<MyPage>, wil::notify_property_changed_base<MyPage>\n * {\n *     wil::single_threaded_notifying_property<int> MyInt;\n *     MyPage() : INIT_NOTIFYING_PROPERTY(MyInt, 42) { }\n *     // or\n *     WIL_NOTIFYING_PROPERTY(int, MyInt, 42);\n * };\n * @endcode\n */\ntemplate <typename T, typename Xaml_Data_PropertyChangedEventHandler = wil::details::Xaml_Data_PropertyChangedEventHandler, typename Xaml_Data_PropertyChangedEventArgs = wil::details::Xaml_Data_PropertyChangedEventArgs>\nstruct notify_property_changed_base\n{\n    using Type = T;\n    auto PropertyChanged(Xaml_Data_PropertyChangedEventHandler const& value)\n    {\n        return m_propertyChanged.add(value);\n    }\n\n    void PropertyChanged(winrt::event_token const& token)\n    {\n        m_propertyChanged.remove(token);\n    }\n\n    Type& self()\n    {\n        return *static_cast<Type*>(this);\n    }\n\n    /**\n     * @brief Raises a property change notification event\n     * @param name The name of the property\n     * @return\n     * @details Usage example\\n\n     * C++\n     * @code\n     * void MyPage::DoSomething()\n     * {\n     *     // modify MyInt\n     *     // MyInt = ...\n     *\n     *     // now send a notification to update the bound UI elements\n     *     RaisePropertyChanged(L\"MyInt\");\n     * }\n     * @endcode\n     */\n    auto RaisePropertyChanged(std::wstring_view name)\n    {\n        return m_propertyChanged(self(), Xaml_Data_PropertyChangedEventArgs{name});\n    }\n\nprotected:\n    winrt::event<Xaml_Data_PropertyChangedEventHandler> m_propertyChanged;\n};\n\n/**\n * @brief Implements a property type with notifications\n * @tparam T the property type\n * @details Use the INIT_NOTIFY_PROPERTY macro to initialize this property in your class constructor. This will set up the\n *          right property name, and bind it to the `notify_property_changed_base` implementation.\n */\ntemplate <typename T, typename Xaml_Data_PropertyChangedEventHandler = wil::details::Xaml_Data_PropertyChangedEventHandler, typename Xaml_Data_PropertyChangedEventArgs = wil::details::Xaml_Data_PropertyChangedEventArgs>\nstruct single_threaded_notifying_property : single_threaded_rw_property<T>\n{\n    using Type = T;\n    using base_type = single_threaded_rw_property<T>;\n    using base_type::operator();\n\n    template <typename Q>\n    auto& operator()(Q&& q)\n    {\n        return *this = std::forward<Q>(q);\n    }\n\n    template <typename Q>\n    auto& operator=(Q&& q)\n    {\n        if (q != this->operator()())\n        {\n            static_cast<base_type&>(*this) = std::forward<Q>(q);\n            if (auto strong = m_sender.get(); (m_npc != nullptr) && (strong != nullptr))\n            {\n                (*m_npc)(strong, Xaml_Data_PropertyChangedEventArgs{m_name});\n            }\n        }\n        return *this;\n    }\n\n    template <typename... TArgs>\n    single_threaded_notifying_property(\n        winrt::event<Xaml_Data_PropertyChangedEventHandler>* npc,\n        const winrt::Windows::Foundation::IInspectable& sender,\n        std::wstring_view name,\n        TArgs&&... args) :\n        single_threaded_rw_property<T>(std::forward<TArgs...>(args)...), m_name(name), m_npc(npc), m_sender(sender)\n    {\n    }\n\n    single_threaded_notifying_property(const single_threaded_notifying_property&) = default;\n    single_threaded_notifying_property(single_threaded_notifying_property&&) = default;\n    std::wstring_view Name() const noexcept\n    {\n        return m_name;\n    }\n\nprivate:\n    std::wstring_view m_name;\n    winrt::event<Xaml_Data_PropertyChangedEventHandler>* m_npc;\n    winrt::weak_ref<winrt::Windows::Foundation::IInspectable> m_sender;\n};\n\n/**\n * @def WIL_NOTIFYING_PROPERTY\n * @brief use this to stamp out a property that calls RaisePropertyChanged upon changing its value. This is a zero-storage\n *        alternative to wil::single_threaded_notifying_property<T>.\n * @details You can pass an initializer list for the initial property value in the variadic arguments to this macro.\n */\n#define WIL_NOTIFYING_PROPERTY(type, name, ...) \\\n    type m_##name{__VA_ARGS__}; \\\n    auto name() const noexcept \\\n    { \\\n        return m_##name; \\\n    } \\\n    auto& name(type value) \\\n    { \\\n        if (m_##name != value) \\\n        { \\\n            m_##name = std::move(value); \\\n            RaisePropertyChanged(L\"\" #name); \\\n        } \\\n        return *this; \\\n    }\n\n/**\n * @def INIT_NOTIFYING_PROPERTY\n * @brief use this to initialize a wil::single_threaded_notifying_property in your class constructor.\n */\n#define INIT_NOTIFYING_PROPERTY(NAME, VALUE) NAME(&m_propertyChanged, *this, L\"\" #NAME, VALUE)\n\n#endif // !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA) && (defined(WINRT_Microsoft_UI_Xaml_Data_H) || defined(WINRT_Windows_UI_Xaml_Data_H))\n} // namespace wil\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt_helpers.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for common patterns and tasks when using C++/WinRT.\n\n#ifndef __WIL_CPPWINRT_HELPERS_DEFINED\n#define __WIL_CPPWINRT_HELPERS_DEFINED\n\n/// @cond\nnamespace wil::details\n{\nstruct dispatcher_RunAsync\n{\n    template <typename Dispatcher, typename... Args>\n    static void Schedule(Dispatcher const& dispatcher, Args&&... args)\n    {\n        dispatcher.RunAsync(std::forward<Args>(args)...);\n    }\n};\n\nstruct dispatcher_TryEnqueue\n{\n    template <typename Dispatcher, typename... Args>\n    static void Schedule(Dispatcher const& dispatcher, Args&&... args)\n    {\n        dispatcher.TryEnqueue(std::forward<Args>(args)...);\n    }\n};\n\ntemplate <typename Dispatcher>\nstruct dispatcher_traits;\n} // namespace wil::details\n\n#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED)\n#include <experimental/coroutine>\nnamespace wil::details\n{\ntemplate <typename T = void>\nusing coroutine_handle = std::experimental::coroutine_handle<T>;\n}\n#elif defined(__cpp_impl_coroutine)\n#include <coroutine>\n#if (__cpp_lib_coroutine >= 201902L)\nnamespace wil::details\n{\ntemplate <typename T = void>\nusing coroutine_handle = std::coroutine_handle<T>;\n}\n#endif // __cpp_lib_coroutine\n#endif // __cpp_impl_coroutine\n/// @endcond\n\n#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) || \\\n    (defined(__cpp_impl_coroutine) && defined(__cpp_lib_coroutine) && (__cpp_lib_coroutine >= 201902L))\n/// @cond\nnamespace wil::details\n{\nstruct dispatched_handler_state\n{\n    details::coroutine_handle<> handle{};\n    bool orphaned = false;\n};\n\nstruct dispatcher_handler\n{\n    dispatcher_handler(dispatched_handler_state* state) : m_state(state)\n    {\n    }\n    dispatcher_handler(dispatcher_handler&& other) noexcept : m_state(std::exchange(other.m_state, {}))\n    {\n    }\n\n    ~dispatcher_handler()\n    {\n        if (m_state && m_state->handle)\n        {\n            m_state->orphaned = true;\n            Complete();\n        }\n    }\n    void operator()()\n    {\n        Complete();\n    }\n\n    void Complete()\n    {\n        auto state = std::exchange(m_state, nullptr);\n        std::exchange(state->handle, {}).resume();\n    }\n\n    dispatched_handler_state* m_state;\n};\n} // namespace wil::details\n/// @endcond\n\nnamespace wil\n{\n//! Resumes coroutine execution on the thread associated with the dispatcher, or throws\n//! an exception (from an arbitrary thread) if unable. Supported dispatchers are\n//! Windows.System.DispatcherQueue, Microsoft.System.DispatcherQueue,\n//! Microsoft.UI.Dispatching.DispatcherQueue, and Windows.UI.Core.CoreDispatcher,\n//! but you must include the corresponding <winrt/Namespace.h> header before including\n//! wil/cppwinrt_helpers.h. It is okay to include wil/cppwinrt_helpers.h multiple times:\n//! support will be enabled for any winrt/Namespace.h headers that were included since\n//! the previous inclusion of wil/cppwinrt_headers.h.\ntemplate <typename Dispatcher>\n[[nodiscard]] auto resume_foreground(\n    Dispatcher const& dispatcher,\n    typename details::dispatcher_traits<Dispatcher>::Priority priority = details::dispatcher_traits<Dispatcher>::Priority::Normal)\n{\n    using Traits = details::dispatcher_traits<Dispatcher>;\n    using Priority = typename Traits::Priority;\n    using Handler = typename Traits::Handler;\n\n    struct awaitable\n    {\n        awaitable(Dispatcher const& dispatcher, Priority priority) noexcept : m_dispatcher(dispatcher), m_priority(priority)\n        {\n        }\n        bool await_ready() const noexcept\n        {\n            return false;\n        }\n\n        void await_suspend(details::coroutine_handle<> handle)\n        {\n            m_state.handle = handle;\n            Handler handler{details::dispatcher_handler(&m_state)};\n            try\n            {\n                // The return value of Schedule is not reliable. Use the dispatcher_handler destructor\n                // to detect whether the work item failed to run.\n                Traits::Scheduler::Schedule(m_dispatcher, m_priority, handler);\n            }\n            catch (...)\n            {\n                m_state.handle = nullptr; // the exception will resume the coroutine, so the handler shouldn't do it\n                throw;\n            }\n        }\n\n        void await_resume() const\n        {\n            if (m_state.orphaned)\n            {\n                throw winrt::hresult_error(static_cast<winrt::hresult>(0x800701ab)); // HRESULT_FROM_WIN32(ERROR_NO_TASK_QUEUE)\n            }\n        }\n\n    private:\n        Dispatcher const& m_dispatcher;\n        Priority const m_priority;\n        details::dispatched_handler_state m_state;\n    };\n    return awaitable{dispatcher, priority};\n}\n} // namespace wil\n#endif // Coroutines are supported\n\n#endif // __WIL_CPPWINRT_HELPERS_DEFINED\n\n/// @cond\n#if defined(WINRT_Windows_UI_Core_H) && !defined(__WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS)\n#define __WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS\nnamespace wil::details\n{\ntemplate <>\nstruct dispatcher_traits<winrt::Windows::UI::Core::CoreDispatcher>\n{\n    using Priority = winrt::Windows::UI::Core::CoreDispatcherPriority;\n    using Handler = winrt::Windows::UI::Core::DispatchedHandler;\n    using Scheduler = dispatcher_RunAsync;\n};\n} // namespace wil::details\n#endif // __WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS\n\n#if defined(WINRT_Windows_System_H) && !defined(__WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS)\n#define __WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS\nnamespace wil::details\n{\ntemplate <>\nstruct dispatcher_traits<winrt::Windows::System::DispatcherQueue>\n{\n    using Priority = winrt::Windows::System::DispatcherQueuePriority;\n    using Handler = winrt::Windows::System::DispatcherQueueHandler;\n    using Scheduler = dispatcher_TryEnqueue;\n};\n} // namespace wil::details\n#endif // __WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS\n\n#if defined(WINRT_Microsoft_System_H) && !defined(__WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS)\n#define __WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS\nnamespace wil::details\n{\ntemplate <>\nstruct dispatcher_traits<winrt::Microsoft::System::DispatcherQueue>\n{\n    using Priority = winrt::Microsoft::System::DispatcherQueuePriority;\n    using Handler = winrt::Microsoft::System::DispatcherQueueHandler;\n    using Scheduler = dispatcher_TryEnqueue;\n};\n} // namespace wil::details\n#endif // __WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS\n\n#if defined(WINRT_Microsoft_UI_Dispatching_H) && !defined(__WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS)\n#define __WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS\nnamespace wil::details\n{\ntemplate <>\nstruct dispatcher_traits<winrt::Microsoft::UI::Dispatching::DispatcherQueue>\n{\n    using Priority = winrt::Microsoft::UI::Dispatching::DispatcherQueuePriority;\n    using Handler = winrt::Microsoft::UI::Dispatching::DispatcherQueueHandler;\n    using Scheduler = dispatcher_TryEnqueue;\n};\n} // namespace wil::details\n#endif // __WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS\n/// @endcond\n\n#if (defined(WINRT_Windows_Foundation_Collections_H) && !defined(__WIL_CPPWINRT_WINDOWS_FOUNDATION_COLLECTION_HELPERS)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_CPPWINRT_WINDOWS_FOUNDATION_COLLECTION_HELPERS\n/// @endcond\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    template <typename T>\n    struct is_winrt_vector_like\n    {\n    private:\n        template <\n            typename U,\n            typename = decltype(std::declval<U>().GetMany(std::declval<U>().Size(), winrt::array_view<decltype(std::declval<U>().GetAt(0))>{}))>\n        static constexpr bool get_value(int)\n        {\n            return true;\n        }\n        template <typename>\n        static constexpr bool get_value(...)\n        {\n            return false;\n        }\n\n    public:\n        static constexpr bool value = get_value<T>(0);\n    };\n\n    template <typename T>\n    struct is_winrt_iterator_like\n    {\n    private:\n        template <typename U, typename = decltype(std::declval<U>().GetMany(winrt::array_view<decltype(std::declval<U>().Current())>{}))>\n        static constexpr bool get_value(int)\n        {\n            return true;\n        }\n        template <typename>\n        static constexpr bool get_value(...)\n        {\n            return false;\n        }\n\n    public:\n        static constexpr bool value = get_value<T>(0);\n    };\n\n    template <typename T>\n    constexpr T empty() noexcept\n    {\n        if constexpr (std::is_base_of_v<winrt::Windows::Foundation::IUnknown, T>)\n        {\n            return nullptr;\n        }\n        else\n        {\n            return {};\n        }\n    }\n} // namespace details\n/// @endcond\n\n/** Converts C++ / WinRT vectors, iterators, and iterables to std::vector by requesting the\ncollection's data in bulk. This can be more efficient in terms of IPC cost than iteratively\nprocessing the collection.\n@code\nwinrt::IVector<winrt::hstring> collection = GetCollection();\nstd::vector<winrt::hstring> allData = wil::to_vector(collection); // read all data from collection\nfor (winrt::hstring const& item : allData)\n{\n    // use item\n}\n@endcode\nCan be used for IVector<T>, IVectorView<T>, IIterable<T>, IIterator<T>, and any type or\ninterface that C++/WinRT projects those interfaces for (PropertySet, IMap<T,K>, etc.)\nIterable-only types fetch content in units of 64. When used with an iterator, the returned\nvector contains the iterator's current position and any others after it.\n*/\ntemplate <typename TSrc>\nauto to_vector(TSrc const& src)\n{\n    if constexpr (details::is_winrt_vector_like<TSrc>::value)\n    {\n        using T = decltype(src.GetAt(0));\n        std::vector<T> result;\n        if (auto expected = src.Size())\n        {\n            result.resize(expected + 1, details::empty<T>());\n            auto actual = src.GetMany(0, result);\n            if (actual > expected)\n            {\n                throw winrt::hresult_changed_state();\n            }\n            result.resize(actual, details::empty<T>());\n        }\n        return result;\n    }\n    else if constexpr (details::is_winrt_iterator_like<TSrc>::value)\n    {\n        using T = decltype(src.Current());\n        std::vector<T> result;\n        constexpr uint32_t chunkSize = 64;\n        while (true)\n        {\n            auto const lastSize = result.size();\n            result.resize(lastSize + chunkSize, details::empty<T>());\n            auto fetched = src.GetMany({result.data() + lastSize, result.data() + lastSize + chunkSize});\n            if (fetched < chunkSize)\n            {\n                result.resize(lastSize + fetched, details::empty<T>());\n                break;\n            }\n        }\n        return result;\n    }\n    else\n    {\n        return to_vector(src.First());\n    }\n}\n} // namespace wil\n#endif\n\n#if (defined(WINRT_Windows_UI_H) && defined(_WINDOWS_UI_INTEROP_H_) && !defined(__WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS\n/// @endcond\n#if !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__) && !defined(MIDL_NS_PREFIX)\n#pragma push_macro(\"ABI\")\n#undef ABI\n#define ABI\n#endif\n\nnamespace wil\n{\n#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_WIN10_CU)\n//! The following methods require that you include both <winrt/Windows.UI.h>\n//! <Windows.UI.Interop.h> before including wil/cppwinrt_helpers.h, and that NTDDI_VERSION\n//! is at least NTDDI_WIN10_CU. It is okay to include wil/cppwinrt_helpers.h multiple times:\n//! support will be enabled for any headers that were included since the previous inclusion\n//! of wil/cppwinrt_headers.h.\ninline winrt::Windows::UI::WindowId GetWindowIdFromWindow(HWND hwnd)\n{\n    ABI::Windows::UI::WindowId abiWindowId;\n    winrt::check_hresult(::GetWindowIdFromWindow(hwnd, &abiWindowId));\n    return winrt::Windows::UI::WindowId{abiWindowId.Value};\n}\n\ninline HWND GetWindowFromWindowId(winrt::Windows::UI::WindowId windowId)\n{\n    HWND hwnd;\n    winrt::check_hresult(::GetWindowFromWindowId({windowId.Value}, &hwnd));\n    return hwnd;\n}\n#endif /*defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_WIN10_CU)*/\n} // namespace wil\n\n#if !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__) && !defined(MIDL_NS_PREFIX)\n#pragma pop_macro(\"ABI\")\n#endif\n#endif // __WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt_notifiable_module_lock.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Utilities for implementing OOP COM server with cppwinrt only\n\n#ifndef __WIL_CPPWINRT_NOTIFIABLE_MODULE_LOCK_INCLUDED\n#define __WIL_CPPWINRT_NOTIFIABLE_MODULE_LOCK_INCLUDED\n\n#ifdef WINRT_BASE_H\n#error You must include this header before including any winrt header\n#endif\n\n#ifndef WINRT_CUSTOM_MODULE_LOCK\n#error You must define 'WINRT_CUSTOM_MODULE_LOCK' at the project level\n#endif\n\n#include <atomic>\n#include <cstdint>\n\nnamespace wil\n{\n// Adopted from cppwinrt\nstruct notifiable_module_lock_base\n{\n    notifiable_module_lock_base() = default;\n\n    notifiable_module_lock_base(uint32_t count) : m_count(count)\n    {\n    }\n\n    uint32_t operator=(uint32_t count) noexcept\n    {\n        return m_count = count;\n    }\n\n    uint32_t operator++() noexcept\n    {\n        return m_count.fetch_add(1, std::memory_order_relaxed) + 1;\n    }\n\n    uint32_t operator--() noexcept\n    {\n        auto const remaining = m_count.fetch_sub(1, std::memory_order_release) - 1;\n\n        if (remaining == 0)\n        {\n            std::atomic_thread_fence(std::memory_order_acquire);\n            if (notifier) // Protect against callback not being set yet\n            {\n                notifier();\n            }\n        }\n        else if (remaining < 0)\n        {\n            abort();\n        }\n\n        return remaining;\n    }\n\n    operator uint32_t() const noexcept\n    {\n        return m_count;\n    }\n\n    template <typename Func>\n    void set_notifier(Func&& func)\n    {\n        notifier = std::forward<Func>(func);\n    }\n\n    void set_notifier(std::nullptr_t) noexcept\n    {\n        notifier = nullptr;\n    }\n\nprivate:\n    std::atomic<int32_t> m_count{0};\n    std::function<void()> notifier{};\n};\n\nstruct notifiable_module_lock final : notifiable_module_lock_base\n{\n    static notifiable_module_lock& instance() noexcept\n    {\n        static notifiable_module_lock lock;\n        return lock;\n    }\n};\n} // namespace wil\n\n#ifndef WIL_CPPWINRT_COM_SERVER_CUSTOM_MODULE_LOCK\n\nnamespace winrt\n{\nauto& get_module_lock()\n{\n    return wil::notifiable_module_lock::instance();\n}\n} // namespace winrt\n\n#endif\n\n#endif"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt_register_com_server.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Utilities for making managing COM server easier\n\n#ifndef __WIL_CPPWINRT_REGISTER_COM_SERVER_INCLUDED\n#define __WIL_CPPWINRT_REGISTER_COM_SERVER_INCLUDED\n\n#include <winrt/base.h>\n#include <wil/resource.h>\n#include <wil/cppwinrt.h>\n#include <vector>\n\nnamespace wil::details\n{\ntemplate <typename T>\nstruct CppWinRTClassFactory : winrt::implements<CppWinRTClassFactory<T>, IClassFactory, winrt::no_module_lock>\n{\n    HRESULT __stdcall CreateInstance(IUnknown* outer, GUID const& iid, void** result) noexcept final\n    try\n    {\n        *result = nullptr;\n\n        if (outer)\n        {\n            return CLASS_E_NOAGGREGATION;\n        }\n        return winrt::make_self<T>().as(iid, result);\n    }\n    CATCH_RETURN()\n\n    HRESULT __stdcall LockServer(BOOL) noexcept final\n    {\n        return S_OK;\n    }\n};\n\ntemplate <typename T = void, typename... Rest>\nvoid register_com_server(std::vector<wil::unique_com_class_object_cookie>& registrations)\n{\n    DWORD registration{};\n    winrt::check_hresult(CoRegisterClassObject(\n        winrt::guid_of<T>(), winrt::make<CppWinRTClassFactory<T>>().get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &registration));\n    // This emplace_back is no-throw as wil::register_com_server already reserves enough capacity\n    registrations.emplace_back(registration);\n    register_com_server<Rest...>(registrations);\n}\n\ntemplate <>\nvoid register_com_server<void>(std::vector<unique_com_class_object_cookie>&)\n{\n}\n} // namespace wil::details\n\nnamespace wil\n{\ntemplate <typename T, typename... Rest>\n[[nodiscard]] std::vector<wil::unique_com_class_object_cookie> register_com_server()\n{\n    std::vector<wil::unique_com_class_object_cookie> registrations;\n    registrations.reserve(sizeof...(Rest) + 1);\n    details::register_com_server<T, Rest...>(registrations);\n    // C++17 doesn't provide guaranteed copy elision, but the copy should be elided nonetheless.\n    return registrations;\n}\n} // namespace wil\n\n#endif"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/cppwinrt_wrl.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Provides interoperability between C++/WinRT types and the WRL Module system.\n#ifndef __WIL_CPPWINRT_WRL_INCLUDED\n#define __WIL_CPPWINRT_WRL_INCLUDED\n\n#include \"cppwinrt.h\"\n#include <winrt/base.h>\n\n#include \"result_macros.h\"\n#include <wrl/module.h>\n\n// wil::wrl_factory_for_winrt_com_class provides interopability between a\n// C++/WinRT class and the WRL Module system, allowing the winrt class to be\n// CoCreatable.\n//\n// Usage:\n//   - In your cpp, add:\n//         CoCreatableCppWinRtClass(className)\n//\n//   - In the dll.cpp (or equivalent) for the module containing your class, add:\n//         CoCreatableClassWrlCreatorMapInclude(className)\n//\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    template <typename TCppWinRTClass>\n    class module_count_wrapper : public TCppWinRTClass\n    {\n    public:\n        module_count_wrapper()\n        {\n            if (auto modulePtr = ::Microsoft::WRL::GetModuleBase())\n            {\n                modulePtr->IncrementObjectCount();\n            }\n        }\n\n        virtual ~module_count_wrapper()\n        {\n            if (auto modulePtr = ::Microsoft::WRL::GetModuleBase())\n            {\n                modulePtr->DecrementObjectCount();\n            }\n        }\n    };\n} // namespace details\n/// @endcond\n\ntemplate <typename TCppWinRTClass>\nclass wrl_factory_for_winrt_com_class : public ::Microsoft::WRL::ClassFactory<>\n{\npublic:\n    IFACEMETHODIMP CreateInstance(_In_opt_ ::IUnknown* unknownOuter, REFIID riid, _COM_Outptr_ void** object) noexcept\n    try\n    {\n        *object = nullptr;\n        RETURN_HR_IF(CLASS_E_NOAGGREGATION, unknownOuter != nullptr);\n\n        return winrt::make<details::module_count_wrapper<TCppWinRTClass>>().as(riid, object);\n    }\n    CATCH_RETURN()\n};\n} // namespace wil\n\n#define CoCreatableCppWinRtClass(className) \\\n    CoCreatableClassWithFactory(className, ::wil::wrl_factory_for_winrt_com_class<className>)\n\n#endif // __WIL_CPPWINRT_WRL_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/filesystem.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for interfacing with the Windows filesystem APIs.\n#ifndef __WIL_FILESYSTEM_INCLUDED\n#define __WIL_FILESYSTEM_INCLUDED\n\n#ifdef _KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\n#include <new>\n#include <combaseapi.h> // Needed for CoTaskMemFree() used in output of some helpers.\n#include <winbase.h>    // LocalAlloc\n#include <PathCch.h>\n#include \"wistd_type_traits.h\"\n#include \"result.h\"\n#include \"win32_helpers.h\"\n#include \"resource.h\"\n\n#if WIL_USE_STL\n#include <iterator>\n#endif\n\nnamespace wil\n{\n//! Determines if a path is an extended length path that can be used to access paths longer than MAX_PATH.\ninline bool is_extended_length_path(_In_ PCWSTR path)\n{\n    return wcsncmp(path, L\"\\\\\\\\?\\\\\", 4) == 0;\n}\n\n#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)\n//! Find the last segment of a path. Matches the behavior of shlwapi!PathFindFileNameW()\n//! note, does not support streams being specified like PathFindFileNameW(), is that a bug or a feature?\ninline PCWSTR find_last_path_segment(_In_ PCWSTR path)\n{\n    auto const pathLength = wcslen(path);\n    // If there is a trailing slash ignore that in the search.\n    auto const limitedLength = ((pathLength > 0) && (path[pathLength - 1] == L'\\\\')) ? (pathLength - 1) : pathLength;\n\n    PCWSTR result = nullptr;\n    auto const offset = FindStringOrdinal(FIND_FROMEND, path, static_cast<int>(limitedLength), L\"\\\\\", 1, TRUE);\n    if (offset == -1)\n    {\n        result = path + pathLength; // null terminator\n    }\n    else\n    {\n        result = path + offset + 1; // just past the slash\n    }\n    return result;\n}\n#endif\n\n//! Determine if the file name is one of the special \".\" or \"..\" names.\ninline bool path_is_dot_or_dotdot(_In_ PCWSTR fileName)\n{\n    return ((fileName[0] == L'.') && ((fileName[1] == L'\\0') || ((fileName[1] == L'.') && (fileName[2] == L'\\0'))));\n}\n\n//! Returns the drive number, if it has one. Returns true if there is a drive number, false otherwise. Supports regular and\n//! extended length paths.\ninline bool try_get_drive_letter_number(_In_ PCWSTR path, _Out_ int* driveNumber)\n{\n    if (path[0] == L'\\\\' && path[1] == L'\\\\' && path[2] == L'?' && path[3] == L'\\\\')\n    {\n        path += 4;\n    }\n    if (path[0] && (path[1] == L':'))\n    {\n        if ((path[0] >= L'a') && (path[0] <= L'z'))\n        {\n            *driveNumber = path[0] - L'a';\n            return true;\n        }\n        else if ((path[0] >= L'A') && (path[0] <= L'Z'))\n        {\n            *driveNumber = path[0] - L'A';\n            return true;\n        }\n    }\n    *driveNumber = -1;\n    return false;\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7)\n\n// PathCch.h APIs are only in desktop API for now.\n\n// Compute the substring in the input value that is the parent folder path.\n// returns:\n//      true + parentPathLength - path has a parent starting at the beginning path and of parentPathLength length.\n//      false, no parent path, the input is a root path.\ninline bool try_get_parent_path_range(_In_ PCWSTR path, _Out_ size_t* parentPathLength)\n{\n    *parentPathLength = 0;\n    bool hasParent = false;\n    PCWSTR rootEnd = nullptr;\n    if (SUCCEEDED(PathCchSkipRoot(path, &rootEnd)) && (*rootEnd != L'\\0'))\n    {\n        auto const lastSegment = find_last_path_segment(path);\n        *parentPathLength = lastSegment - path;\n        hasParent = (*parentPathLength != 0);\n    }\n    return hasParent;\n}\n\n// Creates directories for the specified path, creating parent paths\n// as needed.\ninline HRESULT CreateDirectoryDeepNoThrow(PCWSTR path) WI_NOEXCEPT\n{\n    if (::CreateDirectoryW(path, nullptr) == FALSE)\n    {\n        DWORD lastError = ::GetLastError();\n        if (lastError == ERROR_PATH_NOT_FOUND)\n        {\n            size_t parentLength{};\n            if (try_get_parent_path_range(path, &parentLength))\n            {\n                wistd::unique_ptr<wchar_t[]> parent(new (std::nothrow) wchar_t[parentLength + 1]);\n                RETURN_IF_NULL_ALLOC(parent.get());\n                RETURN_IF_FAILED(StringCchCopyNW(parent.get(), parentLength + 1, path, parentLength));\n                RETURN_IF_FAILED(CreateDirectoryDeepNoThrow(parent.get())); // recurs\n            }\n            if (::CreateDirectoryW(path, nullptr) == FALSE)\n            {\n                lastError = ::GetLastError();\n                if (lastError != ERROR_ALREADY_EXISTS)\n                {\n                    RETURN_WIN32(lastError);\n                }\n            }\n        }\n        else if (lastError != ERROR_ALREADY_EXISTS)\n        {\n            RETURN_WIN32(lastError);\n        }\n    }\n    return S_OK;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline void CreateDirectoryDeep(PCWSTR path)\n{\n    THROW_IF_FAILED(CreateDirectoryDeepNoThrow(path));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n//! A strongly typed version of the Win32 API GetFullPathNameW.\n//! Return a path in an allocated buffer for handling long paths.\n//! Optionally return the pointer to the file name part.\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT GetFullPathNameW(PCWSTR file, string_type& path, _Outptr_opt_ PCWSTR* filePart = nullptr)\n{\n    wil::assign_null_to_opt_param(filePart);\n    const auto hr = AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        path, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNull) -> HRESULT {\n            // Note that GetFullPathNameW() is not limited to MAX_PATH\n            // but it does take a fixed size buffer.\n            *valueLengthNeededWithNull = ::GetFullPathNameW(file, static_cast<DWORD>(valueLength), value, nullptr);\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNull == 0);\n            WI_ASSERT((*value != L'\\0') == (*valueLengthNeededWithNull < valueLength));\n            if (*valueLengthNeededWithNull < valueLength)\n            {\n                (*valueLengthNeededWithNull)++; // it fit, account for the null\n            }\n            return S_OK;\n        });\n    if (SUCCEEDED(hr) && filePart)\n    {\n        *filePart = wil::find_last_path_segment(details::string_maker<string_type>::get(path));\n    }\n    return hr;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! A strongly typed version of the Win32 API of GetFullPathNameW.\n//! Return a path in an allocated buffer for handling long paths.\n//! Optionally return the pointer to the file name part.\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type GetFullPathNameW(PCWSTR file, _Outptr_opt_ PCWSTR* filePart = nullptr)\n{\n    string_type result{};\n    THROW_IF_FAILED((GetFullPathNameW<string_type, stackBufferLength>(file, result, filePart)));\n    return result;\n}\n#endif\n\nenum class RemoveDirectoryOptions\n{\n    None = 0,\n    KeepRootDirectory = 0x1,\n    RemoveReadOnly = 0x2,\n};\nDEFINE_ENUM_FLAG_OPERATORS(RemoveDirectoryOptions);\n\n/// @cond\nnamespace details\n{\n    // Reparse points should not be traversed in most recursive walks of the file system,\n    // unless allowed through the appropriate reparse tag.\n    inline bool CanRecurseIntoDirectory(const FILE_ATTRIBUTE_TAG_INFO& info)\n    {\n        return (\n            WI_IsFlagSet(info.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) &&\n            (WI_IsFlagClear(info.FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT) ||\n             (IsReparseTagDirectory(info.ReparseTag) || (info.ReparseTag == IO_REPARSE_TAG_WCI))));\n    }\n} // namespace details\n/// @endcond\n\n// Retrieve a handle to a directory only if it is safe to recurse into.\ninline wil::unique_hfile TryCreateFileCanRecurseIntoDirectory(\n    PCWSTR path, PWIN32_FIND_DATAW fileFindData, DWORD access = GENERIC_READ | /*DELETE*/ 0x00010000L, DWORD share = FILE_SHARE_READ)\n{\n    wil::unique_hfile result(\n        CreateFileW(path, access, share, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr));\n    if (result)\n    {\n        FILE_ATTRIBUTE_TAG_INFO fati{};\n        if (GetFileInformationByHandleEx(result.get(), FileAttributeTagInfo, &fati, sizeof(fati)) &&\n            details::CanRecurseIntoDirectory(fati))\n        {\n            if (fileFindData)\n            {\n                // Refresh the found file's data now that we have secured the directory from external manipulation.\n                fileFindData->dwFileAttributes = fati.FileAttributes;\n                fileFindData->dwReserved0 = fati.ReparseTag;\n            }\n        }\n        else\n        {\n            result.reset();\n        }\n    }\n\n    return result;\n}\n\n// If inputPath is a non-normalized name be sure to pass an extended length form to ensure\n// it can be addressed and deleted.\ninline HRESULT RemoveDirectoryRecursiveNoThrow(\n    PCWSTR inputPath, RemoveDirectoryOptions options = RemoveDirectoryOptions::None, HANDLE deleteHandle = INVALID_HANDLE_VALUE) WI_NOEXCEPT\n{\n    wil::unique_hlocal_string path;\n    PATHCCH_OPTIONS combineOptions = PATHCCH_NONE;\n\n    if (is_extended_length_path(inputPath))\n    {\n        path = wil::make_hlocal_string_nothrow(inputPath);\n        RETURN_IF_NULL_ALLOC(path);\n        // PathAllocCombine will convert extended length paths to regular paths if shorter than\n        // MAX_PATH, avoid that behavior to provide access inputPath with non-normalized names.\n        combineOptions = PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH;\n    }\n    else\n    {\n        // For regular paths normalize here to get consistent results when searching and deleting.\n        RETURN_IF_FAILED(wil::GetFullPathNameW(inputPath, path));\n        combineOptions = PATHCCH_ALLOW_LONG_PATHS;\n    }\n\n    wil::unique_hlocal_string searchPath;\n    RETURN_IF_FAILED(::PathAllocCombine(path.get(), L\"*\", combineOptions, &searchPath));\n\n    WIN32_FIND_DATAW fd{};\n    wil::unique_hfind findHandle(::FindFirstFileW(searchPath.get(), &fd));\n    RETURN_LAST_ERROR_IF(!findHandle);\n\n    for (;;)\n    {\n        // skip \".\" and \"..\"\n        if (!(WI_IsFlagSet(fd.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY) && path_is_dot_or_dotdot(fd.cFileName)))\n        {\n            // Need to form an extended length path to provide the ability to delete paths > MAX_PATH\n            // and files with non-normalized names (dots or spaces at the end).\n            wil::unique_hlocal_string pathToDelete;\n            RETURN_IF_FAILED(::PathAllocCombine(\n                path.get(), fd.cFileName, PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH | PATHCCH_DO_NOT_NORMALIZE_SEGMENTS, &pathToDelete));\n            if (WI_IsFlagSet(fd.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY))\n            {\n                // Get a handle to the directory to delete, preventing it from being replaced to prevent writes which could be\n                // used to bypass permission checks, and verify that it is not a name surrogate (e.g. symlink, mount point, etc).\n                wil::unique_hfile recursivelyDeletableDirectoryHandle = TryCreateFileCanRecurseIntoDirectory(pathToDelete.get(), &fd);\n                if (recursivelyDeletableDirectoryHandle)\n                {\n                    RemoveDirectoryOptions localOptions = options;\n                    RETURN_IF_FAILED(RemoveDirectoryRecursiveNoThrow(\n                        pathToDelete.get(),\n                        WI_ClearFlag(localOptions, RemoveDirectoryOptions::KeepRootDirectory),\n                        recursivelyDeletableDirectoryHandle.get()));\n                }\n                else if (WI_IsFlagSet(fd.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))\n                {\n                    // This is a directory reparse point that should not be recursed. Delete it without traversing into it.\n                    RETURN_IF_WIN32_BOOL_FALSE(::RemoveDirectoryW(pathToDelete.get()));\n                }\n                else\n                {\n                    // Failed to grab a handle to the file or to read its attributes. This is not safe to recurse.\n                    RETURN_WIN32(::GetLastError());\n                }\n            }\n            else\n            {\n                // Try a DeleteFile.  Some errors may be recoverable.\n                if (!::DeleteFileW(pathToDelete.get()))\n                {\n                    // Fail for anything other than ERROR_ACCESS_DENIED with option to RemoveReadOnly available\n                    bool potentiallyFixableReadOnlyProblem =\n                        WI_IsFlagSet(options, RemoveDirectoryOptions::RemoveReadOnly) && ::GetLastError() == ERROR_ACCESS_DENIED;\n                    RETURN_LAST_ERROR_IF(!potentiallyFixableReadOnlyProblem);\n\n                    // Fail if the file does not have read-only set, likely just an ACL problem\n                    DWORD fileAttr = ::GetFileAttributesW(pathToDelete.get());\n                    RETURN_LAST_ERROR_IF(!WI_IsFlagSet(fileAttr, FILE_ATTRIBUTE_READONLY));\n\n                    // Remove read-only flag, setting to NORMAL if completely empty\n                    WI_ClearFlag(fileAttr, FILE_ATTRIBUTE_READONLY);\n                    if (fileAttr == 0)\n                    {\n                        fileAttr = FILE_ATTRIBUTE_NORMAL;\n                    }\n\n                    // Set the new attributes and try to delete the file again, returning any failure\n                    ::SetFileAttributesW(pathToDelete.get(), fileAttr);\n                    RETURN_IF_WIN32_BOOL_FALSE(::DeleteFileW(pathToDelete.get()));\n                }\n            }\n        }\n\n        if (!::FindNextFileW(findHandle.get(), &fd))\n        {\n            auto const err = ::GetLastError();\n            if (err == ERROR_NO_MORE_FILES)\n            {\n                break;\n            }\n            RETURN_WIN32(err);\n        }\n    }\n\n    if (WI_IsFlagClear(options, RemoveDirectoryOptions::KeepRootDirectory))\n    {\n        if (deleteHandle != INVALID_HANDLE_VALUE)\n        {\n#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)\n            // DeleteFile and RemoveDirectory use POSIX delete, falling back to non-POSIX on most errors. Do the same here.\n            FILE_DISPOSITION_INFO_EX fileInfoEx{};\n            fileInfoEx.Flags = FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS;\n            if (!SetFileInformationByHandle(deleteHandle, FileDispositionInfoEx, &fileInfoEx, sizeof(fileInfoEx)))\n            {\n                auto const err = ::GetLastError();\n                // The real error we're looking for is STATUS_CANNOT_DELETE, but that's mapped to ERROR_ACCESS_DENIED.\n                if (err != ERROR_ACCESS_DENIED)\n                {\n#endif\n                    FILE_DISPOSITION_INFO fileInfo{};\n                    fileInfo.DeleteFile = TRUE;\n                    RETURN_IF_WIN32_BOOL_FALSE(SetFileInformationByHandle(deleteHandle, FileDispositionInfo, &fileInfo, sizeof(fileInfo)));\n#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)\n                }\n                else\n                {\n                    RETURN_WIN32(err);\n                }\n            }\n#endif\n        }\n        else\n        {\n            RETURN_IF_WIN32_BOOL_FALSE(::RemoveDirectoryW(path.get()));\n        }\n    }\n    return S_OK;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline void RemoveDirectoryRecursive(PCWSTR path, RemoveDirectoryOptions options = RemoveDirectoryOptions::None)\n{\n    THROW_IF_FAILED(RemoveDirectoryRecursiveNoThrow(path, options));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n// Range based for that supports Win32 structures that use NextEntryOffset as the basis of traversing\n// a result buffer that contains data. This is used in the following FileIO calls:\n// FileStreamInfo, FILE_STREAM_INFO\n// FileIdBothDirectoryInfo, FILE_ID_BOTH_DIR_INFO\n// FileFullDirectoryInfo, FILE_FULL_DIR_INFO\n// FileIdExtdDirectoryInfo, FILE_ID_EXTD_DIR_INFO\n// ReadDirectoryChangesW, FILE_NOTIFY_INFORMATION\n\ntemplate <typename T>\nstruct next_entry_offset_iterator\n{\n    // Fulfill std::iterator_traits requirements\n    using difference_type = ptrdiff_t;\n    using value_type = T;\n    using pointer = const T*;\n    using reference = const T&;\n#if WIL_USE_STL\n    using iterator_category = ::std::forward_iterator_tag;\n#endif\n\n    next_entry_offset_iterator(T* iterable = __nullptr) : current_(iterable)\n    {\n    }\n\n    // range based for requires operator!=, operator++ and operator* to do its work\n    // on the type returned from begin() and end(), provide those here.\n    WI_NODISCARD bool operator!=(const next_entry_offset_iterator& other) const\n    {\n        return current_ != other.current_;\n    }\n\n    next_entry_offset_iterator& operator++()\n    {\n        current_ = (current_->NextEntryOffset != 0)\n                       ? reinterpret_cast<T*>(reinterpret_cast<unsigned char*>(current_) + current_->NextEntryOffset)\n                       : __nullptr;\n        return *this;\n    }\n\n    next_entry_offset_iterator operator++(int)\n    {\n        auto copy = *this;\n        ++(*this);\n        return copy;\n    }\n\n    WI_NODISCARD reference operator*() const WI_NOEXCEPT\n    {\n        return *current_;\n    }\n    WI_NODISCARD pointer operator->() const WI_NOEXCEPT\n    {\n        return current_;\n    }\n\n    next_entry_offset_iterator<T> begin()\n    {\n        return *this;\n    }\n    next_entry_offset_iterator<T> end()\n    {\n        return next_entry_offset_iterator<T>();\n    }\n\n    T* current_;\n};\n\ntemplate <typename T>\nnext_entry_offset_iterator<T> create_next_entry_offset_iterator(T* p)\n{\n    return next_entry_offset_iterator<T>(p);\n}\n\n#pragma region Folder Watcher\n// Example use in exception based code:\n// auto watcher = wil::make_folder_watcher(folder.Path().c_str(), true, wil::allChangeEvents, []()\n//     {\n//         // respond\n//     });\n//\n// Example use in result code based code:\n// wil::unique_folder_watcher watcher;\n// THROW_IF_FAILED(watcher.create(folder, true, wil::allChangeEvents, []()\n//     {\n//         // respond\n//     }));\n\nenum class FolderChangeEvent : DWORD\n{\n    ChangesLost = 0, // requires special handling, reset state as events were lost\n    Added = FILE_ACTION_ADDED,\n    Removed = FILE_ACTION_REMOVED,\n    Modified = FILE_ACTION_MODIFIED,\n    RenameOldName = FILE_ACTION_RENAMED_OLD_NAME,\n    RenameNewName = FILE_ACTION_RENAMED_NEW_NAME,\n};\n\nenum class FolderChangeEvents : DWORD\n{\n    None = 0,\n    FileName = FILE_NOTIFY_CHANGE_FILE_NAME,\n    DirectoryName = FILE_NOTIFY_CHANGE_DIR_NAME,\n    Attributes = FILE_NOTIFY_CHANGE_ATTRIBUTES,\n    FileSize = FILE_NOTIFY_CHANGE_SIZE,\n    LastWriteTime = FILE_NOTIFY_CHANGE_LAST_WRITE,\n    Security = FILE_NOTIFY_CHANGE_SECURITY,\n    All = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |\n          FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY\n};\nDEFINE_ENUM_FLAG_OPERATORS(FolderChangeEvents);\n\n/// @cond\nnamespace details\n{\n    struct folder_watcher_state\n    {\n        folder_watcher_state(wistd::function<void()>&& callback) : m_callback(wistd::move(callback))\n        {\n        }\n        wistd::function<void()> m_callback;\n        // Order is important, need to close the thread pool wait before the change handle.\n        unique_hfind_change m_findChangeHandle;\n        unique_threadpool_wait m_threadPoolWait;\n    };\n\n    inline void delete_folder_watcher_state(_In_opt_ folder_watcher_state* storage)\n    {\n        delete storage;\n    }\n\n    typedef resource_policy<folder_watcher_state*, decltype(&details::delete_folder_watcher_state), details::delete_folder_watcher_state, details::pointer_access_none>\n        folder_watcher_state_resource_policy;\n} // namespace details\n/// @endcond\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass folder_watcher_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit folder_watcher_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructors\n    folder_watcher_t(PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void()>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions; use the create method\");\n        create(folderToWatch, isRecursive, filter, wistd::move(callback));\n    }\n\n    result create(PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void()>&& callback)\n    {\n        return err_policy::HResult(create_common(folderToWatch, isRecursive, filter, wistd::move(callback)));\n    }\n\nprivate:\n    // Factored into a standalone function to support Clang which does not support conversion of stateless lambdas\n    // to __stdcall\n    static void __stdcall callback(PTP_CALLBACK_INSTANCE /*Instance*/, void* context, TP_WAIT* pThreadPoolWait, TP_WAIT_RESULT /*result*/)\n    {\n        auto watcherState = static_cast<details::folder_watcher_state*>(context);\n        watcherState->m_callback();\n\n        // Rearm the wait. Should not fail with valid parameters.\n        FindNextChangeNotification(watcherState->m_findChangeHandle.get());\n        SetThreadpoolWait(pThreadPoolWait, watcherState->m_findChangeHandle.get(), __nullptr);\n    }\n\n    // This function exists to avoid template expansion of this code based on err_policy.\n    HRESULT create_common(PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void()>&& callback)\n    {\n        wistd::unique_ptr<details::folder_watcher_state> watcherState(new (std::nothrow)\n                                                                          details::folder_watcher_state(wistd::move(callback)));\n        RETURN_IF_NULL_ALLOC(watcherState);\n\n        watcherState->m_findChangeHandle.reset(FindFirstChangeNotificationW(folderToWatch, isRecursive, static_cast<DWORD>(filter)));\n        RETURN_LAST_ERROR_IF(!watcherState->m_findChangeHandle);\n\n        watcherState->m_threadPoolWait.reset(CreateThreadpoolWait(&folder_watcher_t::callback, watcherState.get(), __nullptr));\n        RETURN_LAST_ERROR_IF(!watcherState->m_threadPoolWait);\n        this->reset(watcherState.release()); // no more failures after this, pass ownership\n        SetThreadpoolWait(this->get()->m_threadPoolWait.get(), this->get()->m_findChangeHandle.get(), __nullptr);\n        return S_OK;\n    }\n};\n\ntypedef unique_any_t<folder_watcher_t<details::unique_storage<details::folder_watcher_state_resource_policy>, err_returncode_policy>> unique_folder_watcher_nothrow;\n\ninline unique_folder_watcher_nothrow make_folder_watcher_nothrow(\n    PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void()>&& callback) WI_NOEXCEPT\n{\n    unique_folder_watcher_nothrow watcher;\n    watcher.create(folderToWatch, isRecursive, filter, wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<folder_watcher_t<details::unique_storage<details::folder_watcher_state_resource_policy>, err_exception_policy>> unique_folder_watcher;\n\ninline unique_folder_watcher make_folder_watcher(\n    PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void()>&& callback)\n{\n    return unique_folder_watcher(folderToWatch, isRecursive, filter, wistd::move(callback));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#pragma endregion\n\n#pragma region Folder Reader\n\n// Example use for throwing:\n// auto reader = wil::make_folder_change_reader(folder.Path().c_str(), true, wil::FolderChangeEvents::All,\n//     [](wil::FolderChangeEvent event, PCWSTR fileName)\n//     {\n//          switch (event)\n//          {\n//          case wil::FolderChangeEvent::ChangesLost: break;\n//          case wil::FolderChangeEvent::Added:    break;\n//          case wil::FolderChangeEvent::Removed:  break;\n//          case wil::FolderChangeEvent::Modified: break;\n//          case wil::FolderChangeEvent::RenamedOldName: break;\n//          case wil::FolderChangeEvent::RenamedNewName: break;\n//      });\n//\n// Example use for non throwing:\n// wil::unique_folder_change_reader_nothrow reader;\n// THROW_IF_FAILED(reader.create(folder, true, wil::FolderChangeEvents::All,\n//     [](wil::FolderChangeEvent event, PCWSTR fileName)\n//     {\n//         // handle changes\n//     }));\n//\n\n/// @cond\nnamespace details\n{\n    struct folder_change_reader_state\n    {\n        folder_change_reader_state(bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback) :\n            m_callback(wistd::move(callback)), m_isRecursive(isRecursive), m_filter(filter)\n        {\n        }\n\n        ~folder_change_reader_state()\n        {\n            if (m_tpIo != __nullptr)\n            {\n                TP_IO* tpIo = m_tpIo;\n\n                // Indicate to the callback function that this object is being torn\n                // down.\n\n                {\n                    auto autoLock = m_cancelLock.lock_exclusive();\n                    m_tpIo = __nullptr;\n                }\n\n                // Cancel IO to terminate the file system monitoring operation.\n\n                if (m_folderHandle)\n                {\n                    BOOL cancelRes = CancelIoEx(m_folderHandle.get(), &m_overlapped);\n\n                    // no pending operation to cancel. Maybe StartIo returned\n                    // an error?\n                    if (!(cancelRes == FALSE && ::GetLastError() == ERROR_NOT_FOUND))\n                    {\n                        DWORD bytesTransferredIgnored = 0;\n                        GetOverlappedResult(m_folderHandle.get(), &m_overlapped, &bytesTransferredIgnored, TRUE);\n                    }\n                }\n\n                // Wait for callbacks to complete.\n                //\n                // N.B. This is a blocking call and must not be made within a\n                //      callback or within a lock which is taken inside the\n                //      callback.\n\n                WaitForThreadpoolIoCallbacks(tpIo, TRUE);\n                CloseThreadpoolIo(tpIo);\n            }\n        }\n\n        HRESULT StartIo()\n        {\n            // Unfortunately we have to handle ref-counting of IOs on behalf of the\n            // thread pool.\n            StartThreadpoolIo(m_tpIo);\n            HRESULT hr =\n                ReadDirectoryChangesW(\n                    m_folderHandle.get(), m_readBuffer, sizeof(m_readBuffer), m_isRecursive, static_cast<DWORD>(m_filter), __nullptr, &m_overlapped, __nullptr)\n                    ? S_OK\n                    : HRESULT_FROM_WIN32(::GetLastError());\n            if (FAILED(hr))\n            {\n                // This operation does not have the usual semantic of returning\n                // ERROR_IO_PENDING.\n                // WI_ASSERT(hr != HRESULT_FROM_WIN32(ERROR_IO_PENDING));\n\n                // If the operation failed for whatever reason, ensure the TP\n                // ref counts are accurate.\n\n                CancelThreadpoolIo(m_tpIo);\n            }\n            return hr;\n        }\n\n        // void (wil::FolderChangeEvent event, PCWSTR fileName)\n        wistd::function<void(FolderChangeEvent, PCWSTR)> m_callback;\n        unique_handle m_folderHandle;\n        BOOL m_isRecursive = FALSE;\n        FolderChangeEvents m_filter = FolderChangeEvents::None;\n        OVERLAPPED m_overlapped{};\n        TP_IO* m_tpIo = __nullptr;\n        srwlock m_cancelLock;\n        unsigned char m_readBuffer[4096]{}; // Consider alternative buffer sizes. With 512 byte buffer i was not able to observe overflow.\n    };\n\n    inline void delete_folder_change_reader_state(_In_opt_ folder_change_reader_state* storage)\n    {\n        delete storage;\n    }\n\n    typedef resource_policy<folder_change_reader_state*, decltype(&details::delete_folder_change_reader_state), details::delete_folder_change_reader_state, details::pointer_access_none>\n        folder_change_reader_state_resource_policy;\n} // namespace details\n/// @endcond\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass folder_change_reader_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit folder_change_reader_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructors\n    folder_change_reader_t(\n        PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions; use the create method\");\n        create(folderToWatch, isRecursive, filter, wistd::move(callback));\n    }\n\n    result create(PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback)\n    {\n        return err_policy::HResult(create_common(folderToWatch, isRecursive, filter, wistd::move(callback)));\n    }\n\n    wil::unique_hfile& folder_handle()\n    {\n        return this->get()->m_folderHandle;\n    }\n\nprivate:\n    // Factored into a standalone function to support Clang which does not support conversion of stateless lambdas\n    // to __stdcall\n    static void __stdcall callback(\n        PTP_CALLBACK_INSTANCE /* Instance */, void* context, void* /*overlapped*/, ULONG result, ULONG_PTR /* BytesTransferred */, TP_IO* /* Io */)\n    {\n        auto readerState = static_cast<details::folder_change_reader_state*>(context);\n        // WI_ASSERT(overlapped == &readerState->m_overlapped);\n\n        if (result == ERROR_SUCCESS)\n        {\n            for (auto const& info :\n                 create_next_entry_offset_iterator(reinterpret_cast<FILE_NOTIFY_INFORMATION*>(readerState->m_readBuffer)))\n            {\n                wchar_t relativeFileName[MAX_PATH];\n                StringCchCopyNW(\n                    relativeFileName, ARRAYSIZE(relativeFileName), info.FileName, info.FileNameLength / sizeof(info.FileName[0]));\n\n                readerState->m_callback(static_cast<FolderChangeEvent>(info.Action), relativeFileName);\n            }\n        }\n        else if (result == ERROR_NOTIFY_ENUM_DIR)\n        {\n            readerState->m_callback(FolderChangeEvent::ChangesLost, __nullptr);\n        }\n        else\n        {\n            // No need to requeue\n            return;\n        }\n\n        // If the lock is held non-shared or the TP IO is nullptr, this\n        // structure is being torn down. Otherwise, monitor for further\n        // changes.\n        auto autoLock = readerState->m_cancelLock.try_lock_shared();\n        if (autoLock && readerState->m_tpIo)\n        {\n            readerState->StartIo(); // ignoring failure here\n        }\n    }\n\n    // This function exists to avoid template expansion of this code based on err_policy.\n    HRESULT create_common(\n        PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback)\n    {\n        wistd::unique_ptr<details::folder_change_reader_state> readerState(\n            new (std::nothrow) details::folder_change_reader_state(isRecursive, filter, wistd::move(callback)));\n        RETURN_IF_NULL_ALLOC(readerState);\n\n        readerState->m_folderHandle.reset(CreateFileW(\n            folderToWatch,\n            FILE_LIST_DIRECTORY,\n            FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,\n            __nullptr,\n            OPEN_EXISTING,\n            FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,\n            __nullptr));\n        RETURN_LAST_ERROR_IF(!readerState->m_folderHandle);\n\n        readerState->m_tpIo =\n            CreateThreadpoolIo(readerState->m_folderHandle.get(), &folder_change_reader_t::callback, readerState.get(), __nullptr);\n        RETURN_LAST_ERROR_IF_NULL(readerState->m_tpIo);\n        RETURN_IF_FAILED(readerState->StartIo());\n        this->reset(readerState.release());\n        return S_OK;\n    }\n};\n\ntypedef unique_any_t<folder_change_reader_t<details::unique_storage<details::folder_change_reader_state_resource_policy>, err_returncode_policy>> unique_folder_change_reader_nothrow;\n\ninline unique_folder_change_reader_nothrow make_folder_change_reader_nothrow(\n    PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback) WI_NOEXCEPT\n{\n    unique_folder_change_reader_nothrow watcher;\n    watcher.create(folderToWatch, isRecursive, filter, wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<folder_change_reader_t<details::unique_storage<details::folder_change_reader_state_resource_policy>, err_exception_policy>> unique_folder_change_reader;\n\ninline unique_folder_change_reader make_folder_change_reader(\n    PCWSTR folderToWatch, bool isRecursive, FolderChangeEvents filter, wistd::function<void(FolderChangeEvent, PCWSTR)>&& callback)\n{\n    return unique_folder_change_reader(folderToWatch, isRecursive, filter, wistd::move(callback));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n#pragma endregion\n\n//! Dos and VolumeGuid paths are always extended length paths with the \\\\?\\ prefix.\nenum class VolumePrefix\n{\n    Dos = VOLUME_NAME_DOS,         // Extended Dos Device path form, e.g. \\\\?\\C:\\Users\\Chris\\AppData\\Local\\Temp\\wil8C31.tmp\n    VolumeGuid = VOLUME_NAME_GUID, // \\\\?\\Volume{588fb606-b95b-4eae-b3cb-1e49861aaf18}\\Users\\Chris\\AppData\\Local\\Temp\\wil8C31.tmp\n    // The following are special paths which can't be used with Win32 APIs, but are useful in other scenarios.\n    None = VOLUME_NAME_NONE, // Path without the volume root, e.g. \\Users\\Chris\\AppData\\Local\\Temp\\wil8C31.tmp\n    NtObjectName = VOLUME_NAME_NT, // Unique name used by Object Manager, e.g. \\Device\\HarddiskVolume4\\Users\\Chris\\AppData\\Local\\Temp\\wil8C31.tmp\n};\nenum class PathOptions\n{\n    Normalized = FILE_NAME_NORMALIZED,\n    Opened = FILE_NAME_OPENED,\n};\nDEFINE_ENUM_FLAG_OPERATORS(PathOptions);\n\n/**  A strongly typed version of the Win32 API GetFinalPathNameByHandleW.\nGet the full path name in different forms\nUse this instead + VolumePrefix::None instead of GetFileInformationByHandleEx(FileNameInfo) to\nget that path form. */\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT GetFinalPathNameByHandleW(\n    HANDLE fileHandle,\n    string_type& path,\n    wil::VolumePrefix volumePrefix = wil::VolumePrefix::Dos,\n    wil::PathOptions options = wil::PathOptions::Normalized)\n{\n    return AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        path, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNull) -> HRESULT {\n            *valueLengthNeededWithNull = ::GetFinalPathNameByHandleW(\n                fileHandle, value, static_cast<DWORD>(valueLength), static_cast<DWORD>(volumePrefix) | static_cast<DWORD>(options));\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNull == 0);\n            WI_ASSERT((*value != L'\\0') == (*valueLengthNeededWithNull < valueLength));\n            if (*valueLengthNeededWithNull < valueLength)\n            {\n                (*valueLengthNeededWithNull)++; // it fit, account for the null\n            }\n            return S_OK;\n        });\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** A strongly typed version of the Win32 API GetFinalPathNameByHandleW.\nGet the full path name in different forms. Use this + VolumePrefix::None\ninstead of GetFileInformationByHandleEx(FileNameInfo) to get that path form. */\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type GetFinalPathNameByHandleW(\n    HANDLE fileHandle, wil::VolumePrefix volumePrefix = wil::VolumePrefix::Dos, wil::PathOptions options = wil::PathOptions::Normalized)\n{\n    string_type result{};\n    THROW_IF_FAILED((GetFinalPathNameByHandleW<string_type, stackBufferLength>(fileHandle, result, volumePrefix, options)));\n    return result;\n}\n#endif\n\n//! A strongly typed version of the Win32 API of GetCurrentDirectoryW.\n//! Return a path in an allocated buffer for handling long paths.\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT GetCurrentDirectoryW(string_type& path)\n{\n    return AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        path, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNull) -> HRESULT {\n            *valueLengthNeededWithNull = ::GetCurrentDirectoryW(static_cast<DWORD>(valueLength), value);\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNull == 0);\n            WI_ASSERT((*value != L'\\0') == (*valueLengthNeededWithNull < valueLength));\n            if (*valueLengthNeededWithNull < valueLength)\n            {\n                (*valueLengthNeededWithNull)++; // it fit, account for the null\n            }\n            return S_OK;\n        });\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! A strongly typed version of the Win32 API of GetCurrentDirectoryW.\n//! Return a path in an allocated buffer for handling long paths.\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type GetCurrentDirectoryW()\n{\n    string_type result{};\n    THROW_IF_FAILED((GetCurrentDirectoryW<string_type, stackBufferLength>(result)));\n    return result;\n}\n#endif\n\n// TODO: add support for these and other similar APIs.\n// GetShortPathNameW()\n// GetLongPathNameW()\n// GetTempDirectory()\n\n/// @cond\nnamespace details\n{\n    template <FILE_INFO_BY_HANDLE_CLASS infoClass>\n    struct MapInfoClassToInfoStruct; // failure to map is a usage error caught by the compiler\n#define MAP_INFOCLASS_TO_STRUCT(InfoClass, InfoStruct, IsFixed, Extra) \\\n    template <> \\\n    struct MapInfoClassToInfoStruct<InfoClass> \\\n    { \\\n        typedef InfoStruct type; \\\n        static bool const isFixed = IsFixed; \\\n        static size_t const extraSize = Extra; \\\n    };\n\n    MAP_INFOCLASS_TO_STRUCT(FileBasicInfo, FILE_BASIC_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileStandardInfo, FILE_STANDARD_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileNameInfo, FILE_NAME_INFO, false, 64);\n    MAP_INFOCLASS_TO_STRUCT(FileRenameInfo, FILE_RENAME_INFO, false, 64);\n    MAP_INFOCLASS_TO_STRUCT(FileDispositionInfo, FILE_DISPOSITION_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileAllocationInfo, FILE_ALLOCATION_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileEndOfFileInfo, FILE_END_OF_FILE_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileStreamInfo, FILE_STREAM_INFO, false, 64);\n    MAP_INFOCLASS_TO_STRUCT(FileCompressionInfo, FILE_COMPRESSION_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileAttributeTagInfo, FILE_ATTRIBUTE_TAG_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileIdBothDirectoryInfo, FILE_ID_BOTH_DIR_INFO, false, 8192);\n    MAP_INFOCLASS_TO_STRUCT(FileIdBothDirectoryRestartInfo, FILE_ID_BOTH_DIR_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileIoPriorityHintInfo, FILE_IO_PRIORITY_HINT_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileRemoteProtocolInfo, FILE_REMOTE_PROTOCOL_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileFullDirectoryInfo, FILE_FULL_DIR_INFO, false, 8192);\n    MAP_INFOCLASS_TO_STRUCT(FileFullDirectoryRestartInfo, FILE_FULL_DIR_INFO, true, 0);\n#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)\n    MAP_INFOCLASS_TO_STRUCT(FileStorageInfo, FILE_STORAGE_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileAlignmentInfo, FILE_ALIGNMENT_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileIdInfo, FILE_ID_INFO, true, 0);\n    MAP_INFOCLASS_TO_STRUCT(FileIdExtdDirectoryInfo, FILE_ID_EXTD_DIR_INFO, false, 8192);\n    MAP_INFOCLASS_TO_STRUCT(FileIdExtdDirectoryRestartInfo, FILE_ID_EXTD_DIR_INFO, true, 0);\n#endif\n\n    // Type unsafe version used in the implementation to avoid template bloat.\n    inline HRESULT GetFileInfo(HANDLE fileHandle, FILE_INFO_BY_HANDLE_CLASS infoClass, size_t allocationSize, _Outptr_result_maybenull_ void** result)\n    {\n        *result = nullptr;\n\n        wistd::unique_ptr<char[]> resultHolder(new (std::nothrow) char[allocationSize]);\n        RETURN_IF_NULL_ALLOC(resultHolder);\n\n        for (;;)\n        {\n            if (GetFileInformationByHandleEx(fileHandle, infoClass, resultHolder.get(), static_cast<DWORD>(allocationSize)))\n            {\n                *result = resultHolder.release();\n                break;\n            }\n            else\n            {\n                DWORD const lastError = ::GetLastError();\n                if (lastError == ERROR_MORE_DATA)\n                {\n                    allocationSize *= 2;\n                    resultHolder.reset(new (std::nothrow) char[allocationSize]);\n                    RETURN_IF_NULL_ALLOC(resultHolder);\n                }\n                else if (lastError == ERROR_NO_MORE_FILES) // for folder enumeration cases\n                {\n                    break;\n                }\n                else if (lastError == ERROR_INVALID_PARAMETER) // operation not supported by file system\n                {\n                    return HRESULT_FROM_WIN32(lastError);\n                }\n                else if ((lastError == ERROR_HANDLE_EOF) && (infoClass == FileStreamInfo))\n                {\n                    break;\n                }\n                else\n                {\n                    RETURN_WIN32(lastError);\n                }\n            }\n        }\n        return S_OK;\n    }\n} // namespace details\n/// @endcond\n\n/** Get file information for a variable sized structure, returns an HRESULT.\n~~~\nwistd::unique_ptr<FILE_NAME_INFO> fileNameInfo;\nRETURN_IF_FAILED(GetFileInfoNoThrow<FileNameInfo>(fileHandle, fileNameInfo));\n~~~\n*/\ntemplate <FILE_INFO_BY_HANDLE_CLASS infoClass, typename wistd::enable_if<!details::MapInfoClassToInfoStruct<infoClass>::isFixed, int>::type = 0>\nHRESULT GetFileInfoNoThrow(HANDLE fileHandle, wistd::unique_ptr<typename details::MapInfoClassToInfoStruct<infoClass>::type>& result) WI_NOEXCEPT\n{\n    void* rawResult;\n    HRESULT hr = details::GetFileInfo(\n        fileHandle,\n        infoClass,\n        sizeof(typename details::MapInfoClassToInfoStruct<infoClass>::type) + details::MapInfoClassToInfoStruct<infoClass>::extraSize,\n        &rawResult);\n    result.reset(static_cast<typename details::MapInfoClassToInfoStruct<infoClass>::type*>(rawResult));\n    RETURN_HR_IF_EXPECTED(hr, hr == E_INVALIDARG); // operation not supported by file system\n    RETURN_IF_FAILED(hr);\n    return S_OK;\n}\n\n/** Get file information for a fixed sized structure, returns an HRESULT.\n~~~\nFILE_BASIC_INFO fileBasicInfo;\nRETURN_IF_FAILED(GetFileInfoNoThrow<FileBasicInfo>(fileHandle, &fileBasicInfo));\n~~~\n*/\ntemplate <FILE_INFO_BY_HANDLE_CLASS infoClass, typename wistd::enable_if<details::MapInfoClassToInfoStruct<infoClass>::isFixed, int>::type = 0>\nHRESULT GetFileInfoNoThrow(HANDLE fileHandle, _Out_ typename details::MapInfoClassToInfoStruct<infoClass>::type* result) WI_NOEXCEPT\n{\n    const HRESULT hr =\n        GetFileInformationByHandleEx(fileHandle, infoClass, result, sizeof(*result)) ? S_OK : HRESULT_FROM_WIN32(::GetLastError());\n    RETURN_HR_IF_EXPECTED(hr, hr == E_INVALIDARG); // operation not supported by file system\n    RETURN_IF_FAILED(hr);\n    return S_OK;\n}\n\n// Verifies that the given file path is not a hard or a soft link. If the file is present at the path, returns\n// a handle to it without delete permissions to block an attacker from swapping the file.\ninline HRESULT CreateFileAndEnsureNotLinked(PCWSTR path, wil::unique_hfile& fileHandle)\n{\n    // Open handles to the original path and to the final path and compare each file's information\n    // to verify they are the same file. If they are different, the file is a soft link.\n    fileHandle.reset(CreateFileW(\n        path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr));\n    RETURN_LAST_ERROR_IF(!fileHandle);\n    BY_HANDLE_FILE_INFORMATION fileInfo;\n    RETURN_IF_WIN32_BOOL_FALSE(GetFileInformationByHandle(fileHandle.get(), &fileInfo));\n\n    // Open a handle without the reparse point flag to get the final path in case it is a soft link.\n    wil::unique_hfile finalPathHandle(CreateFileW(path, 0, 0, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr));\n    RETURN_LAST_ERROR_IF(!finalPathHandle);\n    BY_HANDLE_FILE_INFORMATION finalFileInfo;\n    RETURN_IF_WIN32_BOOL_FALSE(GetFileInformationByHandle(finalPathHandle.get(), &finalFileInfo));\n    finalPathHandle.reset();\n\n    // The low and high indices and volume serial number uniquely identify a file. These must match if they are the same file.\n    const bool isSoftLink =\n        ((fileInfo.nFileIndexLow != finalFileInfo.nFileIndexLow) || (fileInfo.nFileIndexHigh != finalFileInfo.nFileIndexHigh) ||\n         (fileInfo.dwVolumeSerialNumber != finalFileInfo.dwVolumeSerialNumber));\n\n    // Return failure if it is a soft link or a hard link (number of links greater than 1).\n    RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), (isSoftLink || fileInfo.nNumberOfLinks > 1));\n\n    return S_OK;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Get file information for a fixed sized structure, throws on failure.\n~~~\nauto fileBasicInfo = GetFileInfo<FileBasicInfo>(fileHandle);\n~~~\n*/\ntemplate <FILE_INFO_BY_HANDLE_CLASS infoClass, typename wistd::enable_if<details::MapInfoClassToInfoStruct<infoClass>::isFixed, int>::type = 0>\ntypename details::MapInfoClassToInfoStruct<infoClass>::type GetFileInfo(HANDLE fileHandle)\n{\n    typename details::MapInfoClassToInfoStruct<infoClass>::type result{};\n    THROW_IF_FAILED(GetFileInfoNoThrow<infoClass>(fileHandle, &result));\n    return result;\n}\n\n/** Get file information for a variable sized structure, throws on failure.\n~~~\nauto fileBasicInfo = GetFileInfo<FileNameInfo>(fileHandle);\n~~~\n*/\ntemplate <FILE_INFO_BY_HANDLE_CLASS infoClass, typename wistd::enable_if<!details::MapInfoClassToInfoStruct<infoClass>::isFixed, int>::type = 0>\nwistd::unique_ptr<typename details::MapInfoClassToInfoStruct<infoClass>::type> GetFileInfo(HANDLE fileHandle)\n{\n    wistd::unique_ptr<typename details::MapInfoClassToInfoStruct<infoClass>::type> result;\n    THROW_IF_FAILED(GetFileInfoNoThrow<infoClass>(fileHandle, result));\n    return result;\n}\n\n// Helpers to make the CreateFileW API easier to use.\n// https://learn.microsoft.com/windows/win32/api/fileapi/nf-fileapi-createfilew\n\nstruct file_and_error_result\n{\n    file_and_error_result(HANDLE file_handle, DWORD error) : file(file_handle), last_error(error)\n    {\n    }\n\n    wil::unique_hfile file;\n    DWORD last_error{};\n};\n\n/** Non-throwing open existing using OPEN_EXISTING, returns handle and error code.\n~~~\nauto [handle, error] = wil::try_open_file(filePath.c_str());\n~~~\n*/\ninline file_and_error_result try_open_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    bool inheritHandle = false) noexcept\n{\n    SECURITY_ATTRIBUTES secAttributes{sizeof(secAttributes)};\n    secAttributes.bInheritHandle = inheritHandle;\n    auto handle = CreateFileW(path, dwDesiredAccess, dwShareMode, &secAttributes, OPEN_EXISTING, dwFlagsAndAttributes, nullptr);\n    return {handle, ::GetLastError()};\n}\n\n/** open existing using OPEN_EXISTING, throws on error.\n~~~\nauto handle = wil::open_file(filePath.c_str());\n~~~\n*/\ninline wil::unique_hfile open_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    bool inheritHandle = false)\n{\n    auto result = try_open_file(path, dwDesiredAccess, dwShareMode, dwFlagsAndAttributes, inheritHandle);\n    THROW_WIN32_IF(result.last_error, !result.file.is_valid());\n    return wistd::move(result.file);\n}\n\n/// @cond\nnamespace details\n{\n    template <DWORD dwCreateDisposition>\n    file_and_error_result create_file(\n        PCWSTR path, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) noexcept\n    {\n        auto handle = CreateFileW(\n            path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreateDisposition, dwFlagsAndAttributes, hTemplateFile);\n        return {handle, ::GetLastError()};\n    }\n} // namespace details\n/// @endcond\n\n/** create using CREATE_NEW, returns handle and error code.\n~~~\nauto [handle, error] = wil::try_create_new_file(filePath.c_str());\n~~~\n*/\ninline file_and_error_result try_create_new_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr) noexcept\n{\n    return details::create_file<CREATE_NEW>(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n}\n\n/** create using OPEN_ALWAYS, returns handle and error code.\n~~~\nauto [handle, error] = wil::try_open_or_create_file(filePath.c_str());\n~~~\n*/\ninline file_and_error_result try_open_or_create_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr) noexcept\n{\n    return details::create_file<OPEN_ALWAYS>(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n}\n\n/** create using CREATE_ALWAYS, returns handle and error code.\n~~~\nauto [handle, error] = wil::try_open_or_truncate_existing_file(filePath.c_str());\n~~~\n*/\ninline file_and_error_result try_open_or_truncate_existing_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr) noexcept\n{\n    return details::create_file<CREATE_ALWAYS>(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n}\n\n/** create using TRUNCATE_EXISTING, returns handle and error code.\n~~~\nauto [handle, error] = wil::try_truncate_existing_file(filePath.c_str());\n~~~\n*/\ninline file_and_error_result try_truncate_existing_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr) noexcept\n{\n    return details::create_file<TRUNCATE_EXISTING>(\n        path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n}\n\n/** create using CREATE_NEW, returns the file handle, throws on error.\n~~~\nauto handle = wil::create_new_file(filePath.c_str());\n~~~\n*/\ninline wil::unique_hfile create_new_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr)\n{\n    auto result = try_create_new_file(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n    THROW_WIN32_IF(result.last_error, !result.file.is_valid());\n    return wistd::move(result.file);\n}\n\n/** create using OPEN_ALWAYS, returns the file handle, throws on error.\n~~~\nauto handle = wil::open_or_create_file(filePath.c_str());\n~~~\n*/\ninline wil::unique_hfile open_or_create_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr)\n{\n    auto result = try_open_or_create_file(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n    THROW_WIN32_IF(result.last_error, !result.file.is_valid());\n    return wistd::move(result.file);\n}\n\n/** create using CREATE_ALWAYS, returns the file handle, throws on error.\n~~~\nauto handle = wil::open_or_truncate_existing_file(filePath.c_str());\n~~~\n*/\ninline wil::unique_hfile open_or_truncate_existing_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr)\n{\n    auto result = try_open_or_truncate_existing_file(\n        path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n    THROW_WIN32_IF(result.last_error, !result.file.is_valid());\n    return wistd::move(result.file);\n}\n\n/** create using TRUNCATE_EXISTING, returns the file handle, throws on error.\n~~~\nauto handle = wil::truncate_existing_file(filePath.c_str());\n~~~\n*/\ninline wil::unique_hfile truncate_existing_file(\n    PCWSTR path,\n    DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,\n    DWORD dwShareMode = FILE_SHARE_READ,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes = nullptr,\n    DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL,\n    HANDLE hTemplateFile = nullptr)\n{\n    auto result =\n        try_truncate_existing_file(path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, hTemplateFile);\n    THROW_WIN32_IF(result.last_error, !result.file.is_valid());\n    return wistd::move(result.file);\n}\n\n#endif // WIL_ENABLE_EXCEPTIONS\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7)\n} // namespace wil\n\n#ifndef WIL_NO_FILE_TYPE_OPERATORS\ninline bool operator==(const FILE_ID_128& left, const FILE_ID_128& right)\n{\n    return memcmp(&left, &right, sizeof(left)) == 0;\n}\n\ninline bool operator!=(const FILE_ID_128& left, const FILE_ID_128& right)\n{\n    return !operator==(left, right);\n}\n#endif\n\n#endif // __WIL_FILESYSTEM_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/nt_result_macros.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: supporting file defining a family of macros and functions designed to uniformly handle errors\n//! across return codes, fail fast, exceptions and logging for NTSTATUS values.\n#ifndef __WIL_NT_RESULTMACROS_INCLUDED\n#define __WIL_NT_RESULTMACROS_INCLUDED\n\n#include \"result_macros.h\"\n\n// Helpers for return macros\n/// @cond\n#define __NT_RETURN_NTSTATUS(status, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        NTSTATUS __status = (status); \\\n        if (FAILED_NTSTATUS(__status)) \\\n        { \\\n            __R_FN(Return_NtStatus)(__R_INFO(str) __status); \\\n        } \\\n        return __status; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __NT_RETURN_NTSTATUS_MSG(status, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        NTSTATUS __status = (status); \\\n        if (FAILED_NTSTATUS(__status)) \\\n        { \\\n            __R_FN(Return_NtStatusMsg)(__R_INFO(str) __status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n        } \\\n        return __status; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n/// @endcond\n\n//*****************************************************************************\n// Macros for returning failures as NTSTATUS\n//*****************************************************************************\n\n// Always returns a known result (NTSTATUS) - always logs failures\n#define NT_RETURN_NTSTATUS(status) __NT_RETURN_NTSTATUS(wil::verify_ntstatus(status), #status)\n\n// Always returns a known failure (NTSTATUS) - always logs a var-arg message on failure\n#define NT_RETURN_NTSTATUS_MSG(status, fmt, ...) \\\n    __NT_RETURN_NTSTATUS_MSG(wil::verify_ntstatus(status), #status, fmt, ##__VA_ARGS__)\n\n// Conditionally returns failures (NTSTATUS) - always logs failures\n#define NT_RETURN_IF_NTSTATUS_FAILED(status) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __statusRet = wil::verify_ntstatus(status); \\\n        if (FAILED_NTSTATUS(__statusRet)) \\\n        { \\\n            __NT_RETURN_NTSTATUS(__statusRet, #status); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n// Conditionally returns failures (NTSTATUS) - always logs a var-arg message on failure\n#define NT_RETURN_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __statusRet = wil::verify_ntstatus(status); \\\n        if (FAILED_NTSTATUS(__statusRet)) \\\n        { \\\n            __NT_RETURN_NTSTATUS_MSG(__statusRet, #status, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n//*****************************************************************************\n// Macros to catch and convert exceptions on failure\n//*****************************************************************************\n\n// Use these macros *within* a catch (...) block to handle exceptions\n#define NT_RETURN_CAUGHT_EXCEPTION() return __R_FN(Nt_Return_CaughtException)(__R_INFO_ONLY(nullptr))\n#define NT_RETURN_CAUGHT_EXCEPTION_MSG(fmt, ...) \\\n    return __R_FN(Nt_Return_CaughtExceptionMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Use these macros in place of a catch block to handle exceptions\n#define NT_CATCH_RETURN() \\\n    catch (...) \\\n    { \\\n        NT_RETURN_CAUGHT_EXCEPTION(); \\\n    }\n#define NT_CATCH_RETURN_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        NT_RETURN_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n    }\n\nnamespace wil\n{\n//*****************************************************************************\n// Public Helpers that catch -- mostly only enabled when exceptions are enabled\n//*****************************************************************************\n\n// StatusFromCaughtException is a function that is meant to be called from within a catch(...) block.  Internally\n// it re-throws and catches the exception to convert it to an NTSTATUS.  If an exception is of an unrecognized type\n// the function will fail fast.\n//\n// try\n// {\n//     // Code\n// }\n// catch (...)\n// {\n//     status = wil::StatusFromCaughtException();\n// }\n_Always_(_Post_satisfies_(return < 0)) __declspec(noinline) inline NTSTATUS StatusFromCaughtException() WI_NOEXCEPT\n{\n    bool isNormalized = false;\n    NTSTATUS status = STATUS_SUCCESS;\n    if (details::g_pfnResultFromCaughtExceptionInternal)\n    {\n        status = details::g_pfnResultFromCaughtExceptionInternal(nullptr, 0, &isNormalized).status;\n    }\n    if (FAILED_NTSTATUS(status))\n    {\n        return status;\n    }\n\n    // Caller bug: an unknown exception was thrown\n    __WIL_PRIVATE_FAIL_FAST_HR_IF(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), g_fResultFailFastUnknownExceptions);\n    return wil::details::HrToNtStatus(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));\n}\n\n/// @cond\nnamespace details\n{\n    template <FailureType>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(\n        __R_FN_PARAMS_FULL, SupportedExceptions supported = SupportedExceptions::Default);\n    template <FailureType>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList);\n\n    namespace __R_NS_NAME\n    {\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_METHOD(NTSTATUS, Nt_Return_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportStatus_CaughtException<FailureType::Return>(__R_DIRECT_FN_CALL_ONLY);\n        }\n\n        __R_DIRECT_METHOD(NTSTATUS, Nt_Return_CaughtExceptionMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportStatus_CaughtExceptionMsg<FailureType::Return>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n#endif\n    } // namespace __R_NS_NAME\n\n    template <FailureType T>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048];\n        message[0] = L'\\0';\n        return ReportFailure_CaughtExceptionCommon<T>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status;\n    }\n\n    template <>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException<FailureType::FailFast>(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048];\n        message[0] = L'\\0';\n        RESULT_NORETURN_RESULT(\n            ReportFailure_CaughtExceptionCommon<FailureType::FailFast>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status);\n    }\n\n    template <>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException<FailureType::Exception>(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048];\n        message[0] = L'\\0';\n        RESULT_NORETURN_RESULT(\n            ReportFailure_CaughtExceptionCommon<FailureType::Exception>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        return ReportFailure_CaughtExceptionCommon<T>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).status;\n    }\n\n    template <>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon<FailureType::FailFast>(\n                                   __R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default)\n                                   .status);\n    }\n\n    template <>\n    __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon<FailureType::Exception>(\n                                   __R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default)\n                                   .status);\n    }\n} // namespace details\n/// @endcond\n} // namespace wil\n\n#endif // __WIL_NT_RESULTMACROS_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/registry.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for reading and writing values to/from the registry.\n#ifndef __WIL_REGISTRY_INCLUDED\n#define __WIL_REGISTRY_INCLUDED\n\n#ifdef _KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\n#include <winreg.h>\n#include <new.h> // new(std::nothrow)\n#include \"registry_helpers.h\"\n#include \"resource.h\"\n\n// wil registry does not require the use of the STL or C++ exceptions (see _nothrow functions)\n// wil registry natively supports std::vector and std::wstring when preferring those types\n// wil registry uses the __WIL_WINREG_STL define to enable support for wil::shared_* types (defined in resource.h)\n\nnamespace wil\n{\n//! Functions and classes that support reading and writing values to/from the registry.\nnamespace reg\n{\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    /**\n     * @brief Opens a new HKEY to the specified path - see RegOpenKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of the registry subkey to be opened.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param access The requested access desired for the opened key\n     * @return A wil::unique_hkey containing the resulting opened HKEY\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline ::wil::unique_hkey open_unique_key(HKEY key, _In_opt_ PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read)\n    {\n        const reg_view_details::reg_view regview{key};\n        ::wil::unique_hkey return_value;\n        regview.open_key(subKey, &return_value, access);\n        return return_value;\n    }\n\n    /**\n     * @brief Creates a new HKEY to the specified path - see RegCreateKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of a subkey that this function opens or creates.\n     *        Note: this cannot be null (see the above referenced API documentation)\n     * @param access The requested access desired for the opened key\n     * @return A wil::unique_hkey or wil::shared_hkey containing the resulting opened HKEY\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline ::wil::unique_hkey create_unique_key(HKEY key, PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read)\n    {\n        const reg_view_details::reg_view regview{key};\n        ::wil::unique_hkey return_value;\n        regview.create_key(subKey, &return_value, access);\n        return return_value;\n    }\n\n#if defined(__WIL_WINREG_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Opens a new HKEY to the specified path - see RegOpenKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of the registry subkey to be opened.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param access The requested access desired for the opened key\n     * @return A wil::shared_hkey containing the resulting opened HKEY\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline ::wil::shared_hkey open_shared_key(HKEY key, _In_opt_ PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read)\n    {\n        const reg_view_details::reg_view regview{key};\n        ::wil::shared_hkey return_value;\n        regview.open_key(subKey, &return_value, access);\n        return return_value;\n    }\n\n    /**\n     * @brief Creates a new HKEY to the specified path - see RegCreateKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of a subkey that this function opens or creates.\n     *        Note: this cannot be null (see the above referenced API documentation)\n     * @param access The requested access desired for the opened key\n     * @return A wil::shared_hkey or wil::shared_hkey containing the resulting opened HKEY\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline ::wil::shared_hkey create_shared_key(HKEY key, PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read)\n    {\n        const reg_view_details::reg_view regview{key};\n        ::wil::shared_hkey return_value;\n        regview.create_key(subKey, &return_value, access);\n        return return_value;\n    }\n#endif // #if defined(__WIL_WINREG_STL)\n#endif // #if defined(WIL_ENABLE_EXCEPTIONS)\n\n    /**\n     * @brief Opens a new HKEY to the specified path - see RegOpenKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of the registry subkey to be opened.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param[out] hkey A reference to a wil::unique_hkey to receive the opened HKEY\n     * @param access The requested access desired for the opened key\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT open_unique_key_nothrow(\n        HKEY key, _In_opt_ PCWSTR subKey, ::wil::unique_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.open_key(subKey, hkey.put(), access);\n    }\n\n    /**\n     * @brief Creates a new HKEY to the specified path - see RegCreateKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of a subkey that this function opens or creates.\n     *        Note: this cannot be null (see the above referenced API documentation)\n     * @param[out] hkey A reference to a wil::unique_hkey to receive the opened HKEY\n     * @param access The requested access desired for the opened key\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT create_unique_key_nothrow(\n        HKEY key, PCWSTR subKey, ::wil::unique_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.create_key(subKey, hkey.put(), access);\n    }\n\n#if defined(__WIL_WINREG_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Opens a new HKEY to the specified path - see RegOpenKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of the registry subkey to be opened.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param[out] hkey A reference to a wil::shared_hkey to receive the opened HKEY\n     * @param access The requested access desired for the opened key\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT open_shared_key_nothrow(\n        HKEY key, _In_opt_ PCWSTR subKey, ::wil::shared_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.open_key(subKey, hkey.put(), access);\n    }\n\n    /**\n     * @brief Creates a new HKEY to the specified path - see RegCreateKeyExW\n     * @param key An open or well-known registry key\n     * @param subKey The name of a subkey that this function opens or creates.\n     *        Note: this cannot be null (see the above referenced API documentation)\n     * @param[out] hkey A reference to a wil::shared_hkey to receive the opened HKEY\n     * @param access The requested access desired for the opened key\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT create_shared_key_nothrow(\n        HKEY key, PCWSTR subKey, ::wil::shared_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.create_key(subKey, hkey.put(), access);\n    }\n#endif // #define __WIL_WINREG_STL\n\n    //\n    //  wil::key_iterator and wil::value_iterator objects enable enumerating registry keys and values.\n    //\n    // Examples of usage when std::wstring is included:\n    //\n    //     for (const auto& key_data : wil::make_range(wil::reg::key_iterator{hkey}, wil::reg::key_iterator{}))\n    //     {\n    //         key_data.name; // the std::wstring of the enumerated key\n    //     }\n    //\n    //     for (const auto& value_data : wil::make_range(wil::reg::value_iterator{hkey}, wil::reg::value_iterator{}))\n    //     {\n    //         value_data.name; // the std::wstring of the enumerated value\n    //         value_data.type; // the REG_ type of the enumerated value\n    //     }\n    //\n    // When std::wstring is not included, wil::unique_process_heap_string can be used instead:\n    //\n    //     for (const auto& key_data : wil::make_range(wil::reg::key_heap_string_iterator{hkey}, wil::reg::key_heap_string_iterator{}))\n    //     {\n    //         key_data.name.get(); // the PCWSTR of the enumerated key\n    //     }\n    //\n    //     for (const auto& value_data : wil::make_range(wil::reg::value_heap_string_iterator{hkey}, wil::reg::value_heap_string_iterator{}))\n    //     {\n    //         value_data.name.get(); // the PCWSTR of the enumerated value\n    //         value_data.type; // the REG_ type of the enumerated value\n    //     }\n    //\n    // When not using exceptions, can manually walk the iterator using wil::unique_process_heap_string:\n    //\n    //     auto iterate_keys = wil::reg::key_heap_string_nothrow_iterator{hkey};\n    //     for (const auto& key_data : wil::make_range(iterate_keys, wil::reg::key_heap_string_nothrow_iterator{}))\n    //     {\n    //         key_data.name.get(); // the PCWSTR of the enumerated key\n    //     }\n    //     if (FAILED(iterate_keys.last_error()))\n    //     {\n    //         // the HRESULT last_error() returns the registry error that prevented enumeration\n    //     }\n    //\n    //     auto iterate_values = wil::reg::value_heap_string_nothrow_iterator{hkey};\n    //     for (const auto& value_data : wil::make_range(iterate_values, wil::reg::value_heap_string_nothrow_iterator{}))\n    //     {\n    //         value_data.name.get(); // the PCWSTR of the enumerated value\n    //         value_data.type; // the REG_ type of the enumerated value\n    //     }\n    //     if (FAILED(iterate_values.last_error()))\n    //     {\n    //         // the HRESULT last_error() returns the registry error that prevented enumeration\n    //     }\n    //\n#if defined(WIL_ENABLE_EXCEPTIONS)\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    using key_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::std::wstring>>;\n    using value_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::std::wstring>>;\n#endif\n\n#if defined(__WIL_OLEAUTO_H_) || defined(WIL_DOXYGEN)\n    using key_bstr_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::wil::unique_bstr>>;\n    using value_bstr_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::wil::unique_bstr>>;\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n    using key_heap_string_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::wil::unique_process_heap_string>>;\n    using value_heap_string_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::wil::unique_process_heap_string>>;\n\n#endif // #if defined(WIL_ENABLE_EXCEPTIONS)\n\n    // no-throw versions of applicable registry iterators\n#if defined(__WIL_OLEAUTO_H_) || defined(WIL_DOXYGEN)\n    using key_bstr_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::key_iterator_data<::wil::unique_bstr>>;\n    using value_bstr_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::value_iterator_data<::wil::unique_bstr>>;\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n    using key_heap_string_nothrow_iterator =\n        ::wil::reg::iterator_nothrow_t<::wil::reg::key_iterator_data<::wil::unique_process_heap_string>>;\n    using value_heap_string_nothrow_iterator =\n        ::wil::reg::iterator_nothrow_t<::wil::reg::value_iterator_data<::wil::unique_process_heap_string>>;\n\n    /**\n     * @brief Queries for number of sub-keys\n     * @param key The HKEY to query for number of sub-keys\n     * @param[out] numSubKeys A pointer to a DWORD to receive the returned count\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_child_key_count_nothrow(HKEY key, _Out_ DWORD* numSubKeys) WI_NOEXCEPT\n    {\n        RETURN_IF_WIN32_ERROR(RegQueryInfoKeyW(\n            key,\n            nullptr, // null class\n            nullptr, // null class character count,\n            nullptr, // null reserved\n            numSubKeys,\n            nullptr,   // null max subkey length\n            nullptr,   // null max class length\n            nullptr,   // null value count\n            nullptr,   // null max value name length\n            nullptr,   // null max value length\n            nullptr,   // null security descriptor\n            nullptr)); // null last write filetime\n        return S_OK;\n    }\n\n    inline HRESULT get_child_key_count_nothrow(HKEY key, _Out_ uint32_t* numSubKeys) WI_NOEXCEPT\n    {\n        DWORD subKeys{};\n        RETURN_IF_FAILED(::wil::reg::get_child_key_count_nothrow(key, &subKeys));\n        *numSubKeys = subKeys;\n        return S_OK;\n    }\n\n    /**\n     * @brief Queries for number of values\n     * @param key The HKEY to query for number of values\n     * @param[out] numSubValues A pointer to a DWORD to receive the returned count\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_child_value_count_nothrow(HKEY key, _Out_ DWORD* numSubValues) WI_NOEXCEPT\n    {\n        RETURN_IF_WIN32_ERROR(RegQueryInfoKeyW(\n            key,\n            nullptr, // null class\n            nullptr, // null class char count,\n            nullptr, // null reserved\n            nullptr, // null subkey count\n            nullptr, // null max subkey length\n            nullptr, // null max class length\n            numSubValues,\n            nullptr,   // null max value name length\n            nullptr,   // null max value length\n            nullptr,   // null security descriptor\n            nullptr)); // null last write filetime\n        return S_OK;\n    }\n\n    inline HRESULT get_child_value_count_nothrow(HKEY key, _Out_ uint32_t* numSubValues) WI_NOEXCEPT\n    {\n        DWORD subValues{};\n        RETURN_IF_FAILED(::wil::reg::get_child_value_count_nothrow(key, &subValues));\n        *numSubValues = subValues;\n        return S_OK;\n    }\n\n    /**\n     * @brief Queries for the filetime when the registry key was last written\n     * @param key The HKEY to query for number of values\n     * @param[out] lastModified A pointer to a FILETIME to receive the last write time\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline HRESULT get_last_write_filetime_nothrow(HKEY key, _Out_ FILETIME* lastModified) WI_NOEXCEPT\n    {\n        RETURN_IF_WIN32_ERROR(RegQueryInfoKeyW(\n            key,\n            nullptr, // null class\n            nullptr, // null class char count,\n            nullptr, // null reserved\n            nullptr, // null subkey count\n            nullptr, // null max subkey length\n            nullptr, // null max class length\n            nullptr, // null value count\n            nullptr, // null max value name length\n            nullptr, // null max value length\n            nullptr, // null security descriptor\n            lastModified));\n        return S_OK;\n    }\n\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    /**\n     * @brief Queries for number of sub-keys\n     * @param key The HKEY to query for number of sub-keys\n     * @return The queried number of sub-keys if succeeded\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline uint32_t get_child_key_count(HKEY key)\n    {\n        uint32_t numSubKeys{};\n        THROW_IF_FAILED(::wil::reg::get_child_key_count_nothrow(key, &numSubKeys));\n        return numSubKeys;\n    }\n\n    /**\n     * @brief Queries for number of values\n     * @param key The HKEY to query for number of values\n     * @return The queried number of value if succeeded\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline uint32_t get_child_value_count(HKEY key)\n    {\n        uint32_t numSubValues{};\n        THROW_IF_FAILED(::wil::reg::get_child_value_count_nothrow(key, &numSubValues));\n        return numSubValues;\n    }\n\n    /**\n     * @brief Queries for the filetime when the registry key was last written\n     * @param key The HKEY to query for number of values\n     * @return The queried filetime if succeeded\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline FILETIME get_last_write_filetime(HKEY key)\n    {\n        FILETIME lastModified{};\n        THROW_IF_FAILED(::wil::reg::get_last_write_filetime_nothrow(key, &lastModified));\n        return lastModified;\n    }\n#endif // #if defined(WIL_ENABLE_EXCEPTIONS)\n\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    //\n    // template <typename T>\n    // void set_value(...)\n    //\n    //  - Writes a value to a specified key and subkey, deducing the type from the given data\n    //  - Throws a std::exception on failure (including wil::ResultException)\n    //\n    // Examples of usage (the template type does not need to be explicitly specified)\n    //     wil::reg::set_value(key, L\"subkey\", L\"dword_value_name\", 0); // writes a REG_DWORD\n    //     wil::reg::set_value(key, L\"subkey\", L\"qword_value_name\", 0ull); // writes a REG_QWORD\n    //     wil::reg::set_value(key, L\"subkey\", L\"string_value_name\", L\"hello\"); // writes a REG_SZ\n    //\n    // A subkey is not required if the key is opened where this should write the value:\n    //     wil::reg::set_value(key, L\"dword_value_name\", 0); // writes a REG_DWORD\n    //     wil::reg::set_value(key, L\"qword_value_name\", 0ull); // writes a REG_QWORD\n    //     wil::reg::set_value(key, L\"string_value_name\", L\"hello\"); // writes a REG_SZ\n    //\n    // Example usage writing a vector of wstrings to a REG_MULTI_SZ\n    //     std::vector<std::wstring> data { L\"string1\", L\"string2\", L\"string3\" };\n    //     wil::reg::set_value(key, L\"multi_string_value_name\", data);\n    //     wil::reg::set_value(key, L\"multi_string_value_name\", data);\n    //\n    // Example of usage writing directly to a registry value from a raw byte vector\n    //  - notice the registry type is required, not implied\n    //     std::vector<BYTE> data { 0x00, 0xff, 0xee, 0xdd, 0xcc };\n    //     wil::reg::set_value_binary(key, L\"binary_value_name\", REG_BINARY, data);\n    //     wil::reg::set_value_binary(key, L\"binary_value_name\", REG_BINARY, data);\n    //\n\n    /**\n     * @brief Writes a value to a specified key and subkey, deducing the type from the given data.\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The data (of type T) to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    template <typename T>\n    void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const T& data)\n    {\n        const reg_view_details::reg_view regview{key};\n        regview.set_value(subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a value under a specified key, the registry type based off the templated type passed as data\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The data (of type T) to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    template <typename T>\n    void set_value(HKEY key, _In_opt_ PCWSTR value_name, const T& data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a null-terminated string value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        const reg_view_details::reg_view regview{key};\n        regview.set_value(subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a null-terminated string value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_DWORD value from a uint32_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 32-bit value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t data)\n    {\n        ::wil::reg::set_value(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_DWORD value from a uint32_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 32-bit value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_dword(HKEY key, _In_opt_ PCWSTR value_name, uint32_t data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_QWORD value from a uint64_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 64-bit value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint64_t data)\n    {\n        ::wil::reg::set_value(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_QWORD value from a uint64_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 64-bit value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_qword(HKEY key, _In_opt_ PCWSTR value_name, uint64_t data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        ::wil::reg::set_value(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_string(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_EXPAND_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated, unexpanded string value to write to the specified registry value. For example, `%PATH%`.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        const reg_view_details::reg_view regview{key};\n        regview.set_value(subkey, value_name, data, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Writes a REG_EXPAND_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated, unexpanded string value to write to the specified registry value. For example, `%PATH%`.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data)\n    {\n        ::wil::reg::set_value_expanded_string(key, nullptr, value_name, data);\n    }\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief The generic set_value template function to write a REG_MULTI_SZ value from a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data A std::vector<std::wstring> to write to the specified registry value.\n     *        Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data)\n    {\n        const auto multiStringWcharVector(reg_view_details::get_multistring_from_wstrings(::std::begin(data), ::std::end(data)));\n        const reg_view_details::reg_view regview{key};\n        regview.set_value(subkey, value_name, multiStringWcharVector, REG_MULTI_SZ);\n    }\n\n    /**\n     * @brief The generic set_value template function to write a REG_MULTI_SZ value from a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data A std::vector<std::wstring> to write to the specified registry value.\n     *        Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value(HKEY key, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_MULTI_SZ value from a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data A std::vector<std::wstring> to write to the specified registry value.\n     *        Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data)\n    {\n        ::wil::reg::set_value(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_MULTI_SZ value from a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data A std::vector<std::wstring> to write to the specified registry value.\n     *        Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_multistring(HKEY key, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data)\n    {\n        ::wil::reg::set_value(key, nullptr, value_name, data);\n    }\n#endif\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Writes a registry value of the specified type from a `std::vector<uint8_t>`/`std::vector<BYTE>`\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param type The registry type for the specified registry value - see RegSetKeyValueW\n     * @param data A `std::vector<uint8_t>`/`std::vector<BYTE>` to write to the specified registry value.\n     *        The vector contents will be directly marshaled to the specified value.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, const ::std::vector<uint8_t>& data)\n    {\n        const reg_view_details::reg_view regview{key};\n        regview.set_value(subkey, value_name, data, type);\n    }\n\n    /**\n     * @brief Writes a registry value of the specified type from a `std::vector<uint8_t>`/`std::vector<BYTE>`\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param type The registry type for the specified registry value - see RegSetKeyValueW\n     * @param data A `std::vector<uint8_t>`/`std::vector<BYTE>` to write to the specified registry value.\n     *        The vector contents will be directly marshaled to the specified value.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures\n     */\n    inline void set_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, const ::std::vector<uint8_t>& data)\n    {\n        ::wil::reg::set_value_binary(key, nullptr, value_name, type, data);\n    }\n#endif\n#endif\n\n    //\n    // template <typename T>\n    // HRESULT set_value_nothrow(...)\n    //\n    //  - Writes a value under a specified key\n    //  - The type of registry value is determined by the template type T of data given\n    //  - Returns an HRESULT error code indicating success or failure (does not throw C++ exceptions)\n    //\n    // Examples of usage (the template type does not need to be explicitly specified)\n    //     hr = wil::reg::set_value_nothrow(key, L\"subkey\", L\"dword_value_name\", 0); // writes a REG_DWORD\n    //     hr = wil::reg::set_value_nothrow(key, L\"subkey\", L\"qword_value_name\", 0ull); // writes a REG_QWORD\n    //     hr = wil::reg::set_value_nothrow(key, L\"subkey\", L\"string_value_name\", L\"hello\"); // writes a REG_SZ\n    //\n    // A subkey is not required if the key is opened where this should write the value:\n    //     hr = wil::reg::set_value_nothrow(key, L\"dword_value_name\", 0); // writes a REG_DWORD\n    //     hr = wil::reg::set_value_nothrow(key, L\"qword_value_name\", 0ull); // writes a REG_QWORD\n    //     hr = wil::reg::set_value_nothrow(key, L\"string_value_name\", L\"hello\"); // writes a REG_SZ\n    //\n    // Example of usage writing a REG_MULTI_SZ\n    //     std::vector<std::wstring> multisz_data { L\"string1\", L\"string2\", L\"string3\" };\n    //     hr = wil::reg::set_value_nothrow(key, L\"multi_string_value_name\", multisz_data);\n    //\n    // Values can be written directly from a vector of bytes - the registry type must be specified; e.g.:\n    //     std::vector<BYTE> data { 0x00, 0xff, 0xee, 0xdd, 0xcc };\n    //     hr = wil::reg::set_value_binary_nothrow(key, L\"binary_value_name\", REG_BINARY, data);\n    //\n    /**\n     * @brief Writes a value to a specified key and subkey, deducing the type from the given data.\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The data (of type T) to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename T>\n    HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const T& data) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.set_value(subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a value under a specified key, the registry type based off the templated type passed as data\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The data (of type T) to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename T>\n    HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, const T& data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a null-terminated string value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.set_value(subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a null-terminated string value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_DWORD value from a uint32_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 32-bit value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_DWORD value from a uint32_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 32-bit value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint32_t data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_QWORD value from a uint64_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 64-bit value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint64_t data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_QWORD value from a uint64_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The 64-bit value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint64_t data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, subkey, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data);\n    }\n\n    /**\n     * @brief Writes a REG_EXPAND_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.set_value(subkey, value_name, data, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Writes a REG_EXPAND_SZ value from a null-terminated string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param data The null-terminated string value to write to the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_expanded_string_nothrow(key, nullptr, value_name, data);\n    }\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Writes raw bytes into a registry value under a specified key of the specified type\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param type The registry type for the specified registry value to write to - see RegSetValue\n     * @param value A ::wil::unique_cotaskmem_array_ptr<BYTE> holding the bytes to write into the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_binary_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, const ::wil::unique_cotaskmem_array_ptr<uint8_t>& value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        RETURN_IF_FAILED(regview.set_value<::wil::unique_cotaskmem_array_ptr<uint8_t>>(subkey, value_name, value, type));\n        return S_OK;\n    }\n\n    /**\n     * @brief Writes raw bytes into a registry value under a specified key of the specified type\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to write to the unnamed default registry value.\n     * @param type The registry type for the specified registry value to write to - see RegSetValue\n     * @param value A ::wil::unique_cotaskmem_array_ptr<BYTE> holding the bytes to write into the specified registry value\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT set_value_binary_nothrow(\n        HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, const ::wil::unique_cotaskmem_array_ptr<uint8_t>& value) WI_NOEXCEPT\n    {\n        return ::wil::reg::set_value_binary_nothrow(key, nullptr, value_name, type, value);\n    }\n#endif\n\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    //\n    // template <typename T>\n    // T get_value(...)\n    //\n    //  - Reads a value under a specified key.\n    //  - Requires a type T to be specified.\n    //  - Throws a std::exception on failure (including wil::ResultException), including registry value not found.\n    //    If you don't want an exception when the value does not exist, use try_get_value(...)\n    //\n    // Examples of usage (ensure the code handles a possible std::exception that will be thrown on all errors)\n    //     uint32_t dword_value = wil::reg::get_value<uint32_t>(key, L\"subkey\", L\"dword_value_name\");\n    //     uint64_t qword_value = wil::reg::get_value<uint64_t>(key, L\"subkey\", L\"qword_value_name);\n    //     std::wstring string_value = wil::reg::get_value<std::wstring>(key, L\"subkey\", L\"string_value_name\");\n    //\n    // A subkey is not required if the key is opened where this should write the value:\n    //     uint32_t dword_value = wil::reg::get_value<uint32_t>(key, L\"dword_value_name\");\n    //     uint64_t qword_value = wil::reg::get_value<uint64_t>(key, L\"qword_value_name);\n    //     std::wstring string_value = wil::reg::get_value<std::wstring>(key, L\"string_value_name\");\n    //\n    // The template type does not need to be specified if using functions written for a targeted type\n    //     uint32_t dword_value = wil::reg::get_value_dword(key, L\"dword_value_name\");\n    //     uint64_t qword_value = wil::reg::get_value_qword(key, L\"qword_value_name\");\n    //     std::wstring string_value = wil::reg::get_value_string(key, L\"string_value_name\");\n    //\n    // Values with REG_EXPAND_SZ can be read into each of the string types; e.g.:\n    //     std::wstring expanded_string_value = wil::reg::get_value_expanded_string(key, L\"string_value_name_with_environment_variables\");\n    //\n    // Values can be read directly into a vector of bytes - the registry type must be specified; e.g.:\n    //     std::vector<BYTE> data = wil::reg::get_value_binary(key, L\"binary_value_name\", REG_BINARY);\n    //\n    // Multi-string values can be read into a vector<wstring>; e.g.:\n    //     std::vector<std::wstring> multi_string_value = wil::reg::get_value_multistring(key, L\"multi_string_value_name\");\n    //     for (const auto& sub_string_value : multi_string_value)\n    //     {\n    //         // can read each string parsed from the multi-string\n    //         PCWSTR string_value = sub_string_value.c_str();\n    //     }\n    //\n    // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated get_value_string and get_value_expanded_string functions\n    // Where the template type is the type to receive the string value\n    // The default template type is std::wstring, available if the caller has included the STL <string> header\n    //\n    // Reading a bstr can be stored in a wil::shared_bstr or wil::unique_bstr - wil::shared_bstr has a c'tor taking a wil::unique_bstr\n    //     wil::unique_bstr unique_value { wil::reg::get_value_string<::wil::unique_bstr>(key, L\"string_value_name\") };\n    //     wil::shared_bstr shared_value { wil::reg::get_value_string<::wil::shared_bstr>(key, L\"string_value_name\") };\n    //\n    // Reading a cotaskmem string can be stored in a wil::unique_cotaskmem_string or wil::shared_cotaskmem_string\n    //     wil::unique_cotaskmem_string unique_value { wil::reg::get_value_string<wil::unique_cotaskmem_string>(key, L\"string_value_name\") };\n    //     wil::shared_cotaskmem_string shared_value { wil::reg::get_value_string<wil::shared_cotaskmem_string>(key, L\"string_value_name\") };\n    //\n    // Blocking get_value_string template types that are not already specialized - this gives a much friendlier compiler error message\n    template <typename T>\n    T get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for get_value_string\");\n    }\n\n    template <typename T>\n    T get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for get_value_string\");\n    }\n\n    template <typename T>\n    T get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for get_value_expanded_string\");\n    }\n\n    template <typename T>\n    T get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for get_value_expanded_string\");\n    }\n\n    /**\n     * @brief Reads a value from a specified key and subkey, deducing registry type from the type parameter T.\n     * @tparam T The type to read (the registry value type is deduced from T)\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type T\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <typename T>\n    T get_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        T return_value{};\n        const reg_view_details::reg_view regview{key};\n        regview.get_value<T>(subkey, value_name, return_value);\n        return return_value;\n    }\n\n    /**\n     * @brief Reads a value under a specified key, deducing registry type from the type parameter T.\n     * @tparam T The type to read (the registry value type is deduced from T)\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type T\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <typename T>\n    T get_value(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<T>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_DWORD value, returning a uint32_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The uint32_t value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline uint32_t get_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<uint32_t>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_DWORD value, returning a uint32_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The uint32_t value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline uint32_t get_value_dword(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<uint32_t>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_QWORD value, returning a uint64_t\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The uint64_t value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline uint64_t get_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<uint64_t>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_QWORD value, returning a uint64_t\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The uint64_t value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline uint64_t get_value_qword(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<uint64_t>(key, nullptr, value_name);\n    }\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::wstring get_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::wstring>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::wstring get_value_string(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::wstring>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::std::wstring get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::wstring>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::std::wstring get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::wstring>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::wstring get_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::std::wstring value;\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, value, REG_EXPAND_SZ);\n        return value;\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::wstring get_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value_expanded_string(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::std::wstring get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value_expanded_string(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a std::wstring\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A std::wstring created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::std::wstring get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value_expanded_string(key, nullptr, value_name);\n    }\n#endif\n\n#if defined(__WIL_OLEAUTO_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::unique_bstr\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_bstr created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_bstr get_value_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::unique_bstr>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::unique_bstr\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_bstr created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_bstr get_value_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::unique_bstr>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_bstr created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_bstr get_value_expanded_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::wil::unique_bstr value;\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, value, REG_EXPAND_SZ);\n        return value;\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_bstr created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_bstr get_value_expanded_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value_expanded_string<::wil::unique_bstr>(key, nullptr, value_name);\n    }\n\n#if defined(__WIL_OLEAUTO_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::shared_bstr\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_bstr created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_bstr get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::shared_bstr>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::shared_bstr\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_bstr created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_bstr get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::shared_bstr>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_bstr created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_bstr get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::wil::shared_bstr value;\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, value, REG_EXPAND_SZ);\n        return value;\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::shared_bstr\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_bstr created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_bstr get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value_expanded_string<::wil::shared_bstr>(key, nullptr, value_name);\n    }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::unique_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_cotaskmem_string created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_cotaskmem_string get_value_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::unique_cotaskmem_string>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::unique_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_cotaskmem_string created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_cotaskmem_string get_value_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::unique_cotaskmem_string>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::unique_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_cotaskmem_string created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_cotaskmem_string get_value_expanded_string<::wil::unique_cotaskmem_string>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::wil::unique_cotaskmem_string value;\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, value, REG_EXPAND_SZ);\n        return value;\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::unique_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::unique_cotaskmem_string created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::unique_cotaskmem_string get_value_expanded_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return wil::reg::get_value_expanded_string<::wil::unique_cotaskmem_string>(key, nullptr, value_name);\n    }\n\n#if defined(__WIL_OBJBASE_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::shared_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_cotaskmem_string created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_cotaskmem_string get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::shared_cotaskmem_string>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value, returning a wil::shared_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_cotaskmem_string created from the string value read from the registry\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_cotaskmem_string get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::wil::shared_cotaskmem_string>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::shared_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_cotaskmem_string created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_cotaskmem_string get_value_expanded_string<::wil::shared_cotaskmem_string>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::wil::shared_cotaskmem_string value;\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, value, REG_EXPAND_SZ);\n        return value;\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value, returning a wil::shared_cotaskmem_string\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A wil::shared_cotaskmem_string created from the string value read from the registry,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    template <>\n    inline ::wil::shared_cotaskmem_string get_value_expanded_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return wil::reg::get_value_expanded_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name);\n    }\n#endif // #if defined(__WIL_OBJBASE_H_STL)\n#endif // defined(__WIL_OBJBASE_H_)\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a registry value of the specified type, returning a std::vector<BYTE>\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @return A std::vector<BYTE> containing the bytes of the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::vector<uint8_t> get_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type)\n    {\n        ::std::vector<uint8_t> return_value{};\n        const reg_view_details::reg_view regview{key};\n        regview.get_value(subkey, value_name, return_value, type);\n        return return_value;\n    }\n\n    /**\n     * @brief Reads a registry value of the specified type, returning a std::vector<BYTE>\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @return A std::vector<BYTE> containing the bytes of the specified registry value\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     */\n    inline ::std::vector<uint8_t> get_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type)\n    {\n        return ::wil::reg::get_value_binary(key, nullptr, value_name, type);\n    }\n#endif\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_MULTI_SZ value, returning a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     *\n     * @remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character\n     *         e.g. a REG_MULTI_SZ of L\"string1\\0\\0string2\\0\\0string3\\0\\0\"\n     *              returns a vector of size 5: L\"string1\", empty-string, L\"string2\", empty-string, L\"string3\"\n     */\n    template <>\n    inline ::std::vector<::std::wstring> get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::std::vector<::std::wstring> return_value;\n        ::std::vector<uint8_t> rawData{::wil::reg::get_value_binary(key, subkey, value_name, REG_MULTI_SZ)};\n        if (!rawData.empty())\n        {\n            auto* const begin = reinterpret_cast<wchar_t*>(rawData.data());\n            auto* const end = begin + rawData.size() / sizeof(wchar_t);\n            return_value = ::wil::reg::reg_view_details::get_wstring_vector_from_multistring(begin, end);\n        }\n\n        return return_value;\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value, returning a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     *\n     * @remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character\n     *         e.g. a REG_MULTI_SZ of L\"string1\\0\\0string2\\0\\0string3\\0\\0\"\n     *              returns a vector of size 5: L\"string1\", empty-string, L\"string2\", empty-string, L\"string3\"\n     */\n    template <>\n    inline ::std::vector<::std::wstring> get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value, returning a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     *\n     * @remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character\n     *         e.g. a REG_MULTI_SZ of L\"string1\\0\\0string2\\0\\0string3\\0\\0\"\n     *              returns a vector of size 5: L\"string1\", empty-string, L\"string2\", empty-string, L\"string3\"\n     */\n    inline ::std::vector<::std::wstring> get_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value, returning a std::vector<std::wstring>\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks.\n     * @exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found\n     *\n     * @remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character\n     *         e.g. a REG_MULTI_SZ of L\"string1\\0\\0string2\\0\\0string3\\0\\0\"\n     *              returns a vector of size 5: L\"string1\", empty-string, L\"string2\", empty-string, L\"string3\"\n     */\n    inline ::std::vector<::std::wstring> get_value_multistring(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, nullptr, value_name);\n    }\n#endif\n\n#if (WIL_USE_STL && (__cpp_lib_optional >= 201606L)) || defined(WIL_DOXYGEN)\n    //\n    // template <typename T>\n    // void try_get_value(...)\n    //\n    //  - Reads a value under a specified key and subkey, deducing registry type from the type parameter T.\n    //  - throws a std::exception on failure (including wil::ResultException), except if the registry value was not found\n    //    returns a std::nullopt if the registry value is not found\n    //\n    // Examples using the returned std::optional<uint32_t>\n    //  - Caller should ensure the code handles a possible std::exception that will be thrown on all errors except value not found\n    //\n    //     std::optional<uint32_t> opt_dword_value = wil::reg::try_get_value<uint32_t>(key, L\"dword_value_name\");\n    //     if (opt_dword_value.has_value())\n    //     {\n    //         // opt_dword_value.value() returns the uint32_t read from the registry\n    //     }\n    //     else\n    //     {\n    //         // the registry value did not exist\n    //     }\n    //     // if the caller wants to apply a default value of 0, they can call value_or()\n    //     uint32_t opt_dword_value = wil::reg::try_get_value<uint32_t>(key, L\"dword_value_name\").value_or(0);\n    //\n    // Examples using the returned std::optional<std::wstring>\n    //     std::optional<std::wstring> opt_string_value = wil::reg::try_get_value_string(key, L\"string_value_name\");\n    //     if (opt_string_value.has_value())\n    //     {\n    //         // opt_string_value.value() returns the std::wstring read from the registry\n    //         // the below avoids copying the std::wstring as value() here returns a std::wstring&\n    //         PCWSTR string_value = opt_string_value.value().c_str();\n    //     }\n    //     else\n    //     {\n    //         // the registry value did not exist\n    //     }\n    //\n    //     // if the caller wants to apply a default value of L\"default\", they can call value_or()\n    //     // note that std::optional only attempts to construct a std::wstring for L\"default\" if the std::optional is empty (std::nullopt)\n    //     // thus only allocating a new std::wstring for the default value when it's needed\n    //     std::optional<std::wstring> opt_string_value = wil::reg::try_get_value_string(key, L\"string_value_name\").value_or(L\"default\");\n    //\n    // Examples of usage:\n    //     std::optional<uint32_t> opt_dword_value = wil::reg::try_get_value<uint32_t>(key, L\"subkey\", L\"dword_value_name\");\n    //     std::optional<uint64_t> opt_qword_value = wil::reg::try_get_value<uint64_t>(key, L\"subkey\", L\"qword_value_name);\n    //     std::optional<std::wstring> opt_string_value = wil::reg::try_get_value<std::wstring>(key, L\"subkey\", L\"string_value_name\");\n    //\n    // A subkey is not required if the key is opened where this should write the value; e.g.\n    //     std::optional<uint32_t> opt_dword_value = wil::reg::try_get_value<uint32_t>(key, L\"dword_value_name\");\n    //     std::optional<uint64_t> opt_qword_value = wil::reg::try_get_value<uint64_t>(key, L\"qword_value_name);\n    //     std::optional<std::wstring> opt_string_value = wil::reg::try_get_value<std::wstring>(key, L\"string_value_name\");\n    //\n    // The template type does not need to be specified if using functions written for a targeted type; e.g.\n    //     std::optional<uint32_t> opt_dword_value = wil::reg::try_get_value_dword(key, L\"dword_value_name\");\n    //     std::optional<uint64_t> opt_qword_value = wil::reg::try_get_value_qword(key, L\"qword_value_name\");\n    //     std::optional<std::wstring> opt_string_value = wil::reg::try_get_value_string(key, L\"string_value_name\");\n    //\n    // Values with REG_EXPAND_SZ can be read into each of the string types; e.g.:\n    //     std::optional<std::wstring> opt_expanded_string_value = wil::reg::try_get_value_expanded_string(key, L\"string_value_name_with_environment_variables\");\n    //\n    // Values can be read directly into a vector of bytes - the registry type must be specified; e.g.:\n    //     std::optional<std::vector<BYTE>> opt_data = wil::reg::try_get_value_binary(key, L\"binary_value_name\", REG_BINARY);\n    //\n    // Multi-string values can be read into a std::vector<std::wstring>; e.g.:\n    //     std::optional<::std::vector<::std::wstring>> try_get_value_multistring(key, L\"multi_string_value_name\");\n    //     See the definition of try_get_value_multistring before for usage guidance\n    //\n    // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated try_get_value_string and try_get_value_expanded_string functions\n    // Where the template type is the type to receive the string value\n    // The default template type is std::wstring, available if the caller has included the STL <string> header\n    //\n    // Reading a bstr is returned in a std::optional<wil::shared_bstr> - because wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional\n    //     std::optional<wil::shared_bstr> shared_value { wil::reg::try_get_value_string<::wil::shared_bstr>(key, L\"string_value_name\") };\n    //\n    // Reading a cotaskmem string is returned in a std::optional<wil::shared_cotaskmem_string> - because wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional\n    //     std::optional<wil::shared_cotaskmem_string> opt_shared_value { wil::reg::try_get_value_string<wil::shared_cotaskmem_string>(key, L\"string_value_name\") };\n    //\n    // Blocking try_get_value_string template types that are not already specialized - this gives a much friendlier compiler error message\n    template <typename T>\n    ::std::optional<T> try_get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for try_get_value_string\");\n    }\n\n    template <typename T>\n    ::std::optional<T> try_get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for try_get_value_string\");\n    }\n\n    template <typename T>\n    ::std::optional<T> try_get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for try_get_value_expanded_string\");\n    }\n\n    template <typename T>\n    ::std::optional<T> try_get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/)\n    {\n        static_assert(sizeof(T) != sizeof(T), \"Unsupported type for try_get_value_expanded_string\");\n    }\n\n    /**\n     * @brief Attempts to read a value under a specified key and subkey, returning in a std::optional, deducing registry type from\n     *        the type parameter T.\n     * @tparam T The type to read, which will be placed into a std::optional (the registry value type is deduced from T)\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value (of type T) read from the registry value, in a std::optional<T>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <typename T>\n    ::std::optional<T> try_get_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n#if defined(__WIL_OLEAUTO_H_)\n        // not allowing unique types with try_get_value: wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional\n        static_assert(!wistd::is_same_v<T, ::wil::unique_bstr>, \"try_get with wil::unique_bstr is disabled\");\n#endif // #if defined(__WIL_OLEAUTO_H_)\n#if defined(__WIL_OBJBASE_H_)\n        // not allowing unique types with try_get_value: wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional\n        static_assert(!wistd::is_same_v<T, ::wil::unique_cotaskmem_string>, \"try_get with wil::unique_cotaskmem_string is disabled\");\n#endif // #if defined(__WIL_OBJBASE_H_)\n\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<T>(subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a value under a specified key, returning the value in a std::optional, deducing registry type from\n     *        the type parameter T.\n     * @tparam T The type to read, which will be placed into a std::optional (the registry value type is deduced from T)\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value (of type T) read from the registry value, in a std::optional<T>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <typename T>\n    ::std::optional<T> try_get_value(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n#if defined(__WIL_OLEAUTO_H_)\n        // not allowing unique types with try_get_value: wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional\n        static_assert(!wistd::is_same_v<T, ::wil::unique_bstr>, \"try_get with wil::unique_bstr is disabled\");\n#endif // #if defined(__WIL_OLEAUTO_H_)\n#if defined(__WIL_OBJBASE_H_)\n        // not allowing unique types with try_get_value: wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional\n        static_assert(!wistd::is_same_v<T, ::wil::unique_cotaskmem_string>, \"try_get with wil::unique_cotaskmem_string is disabled\");\n#endif // #if defined(__WIL_OBJBASE_H_)\n\n        return ::wil::reg::try_get_value<T>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_DWORD value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<uint32_t> try_get_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<uint32_t>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_DWORD value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<uint32_t> try_get_value_dword(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<uint32_t>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_QWORD value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<uint64_t> try_get_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<uint64_t>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_QWORD value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<uint64_t> try_get_value_qword(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<uint64_t>(key, nullptr, value_name);\n    }\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Attempts to read a value under a specified key requiring the specified type, returning the raw bytes in a\n     *        std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @return The raw bytes read from the registry value stored in a std::optional<std::vector<BYTE>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::vector<uint8_t>> try_get_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::std::vector<uint8_t>>(subkey, value_name, type);\n    }\n\n    /**\n     * @brief Attempts to read a value under a specified key requiring the specified type, returning the raw bytes in a\n     *        std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @return The raw bytes read from the registry value stored in a std::optional<std::vector<BYTE>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::vector<uint8_t>> try_get_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type)\n    {\n        return ::wil::reg::try_get_value_binary(key, nullptr, value_name, type);\n    }\n#endif\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::wstring> try_get_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::std::wstring>(subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::wstring> try_get_value_string(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_string(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::wstring> try_get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_string(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value, in a std::optional.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::wstring> try_get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_string(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<std::wstring>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::wstring> try_get_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::std::wstring>(subkey, value_name, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<std::wstring>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::wstring> try_get_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_expanded_string(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<std::wstring>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::wstring> try_get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_expanded_string(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<std::wstring>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::wstring> try_get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_expanded_string(key, nullptr, value_name);\n    }\n#endif\n\n#if defined(__WIL_OLEAUTO_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_bstr>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_bstr> try_get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::wil::shared_bstr>(subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_bstr>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_bstr> try_get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_string<::wil::shared_bstr>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_bstr>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_bstr> try_get_value_expanded_string<::wil::shared_bstr>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::wil::shared_bstr>(subkey, value_name, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_bstr>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_bstr> try_get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_expanded_string<::wil::shared_bstr>(key, nullptr, value_name);\n    }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n\n#if defined(__WIL_OBJBASE_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_cotaskmem_string>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_string<::wil::shared_cotaskmem_string>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::wil::shared_cotaskmem_string>(subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_cotaskmem_string>\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<:wil::shared_cotaskmem_string>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_expanded_string<::wil::shared_cotaskmem_string>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        const reg_view_details::reg_view regview{key};\n        return regview.try_get_value<::wil::shared_cotaskmem_string>(subkey, value_name, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value of the template type std::optional<wil::shared_cotaskmem_string>,\n     *         with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_expanded_string<::wil::shared_cotaskmem_string>(\n        HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value_expanded_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name);\n    }\n#endif // defined(__WIL_OBJBASE_H_STL)\n\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n    /**\n     * @brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value marshaled to a std::optional<std::vector<std::wstring>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::vector<::std::wstring>> try_get_value<::std::vector<::std::wstring>>(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        ::std::vector<::std::wstring> value;\n        const auto hr = ::wil::ResultFromException([&] {\n            value = ::wil::reg::get_value_multistring(key, subkey, value_name);\n        });\n        if (SUCCEEDED(hr))\n        {\n            return value;\n        }\n\n        if (!::wil::reg::is_registry_not_found(hr))\n        {\n            THROW_HR(HRESULT_FROM_WIN32(hr));\n        }\n\n        return ::std::nullopt;\n    }\n\n    /**\n     * @brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value marshaled to a std::optional<std::vector<std::wstring>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    template <>\n    inline ::std::optional<::std::vector<::std::wstring>> try_get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, nullptr, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value marshaled to a std::optional<std::vector<std::wstring>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::vector<::std::wstring>> try_get_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, subkey, value_name);\n    }\n\n    /**\n     * @brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be updated.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @return The value read from the registry value marshaled to a std::optional<std::vector<std::wstring>>.\n     *         Returns std::nullopt if the value does not exist.\n     * @exception std::exception (including wil::ResultException) will be thrown on failures except value not found\n     */\n    inline ::std::optional<::std::vector<::std::wstring>> try_get_value_multistring(HKEY key, _In_opt_ PCWSTR value_name)\n    {\n        return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, nullptr, value_name);\n    }\n#endif\n#endif\n#endif\n\n    //\n    // template <typename T>\n    // HRESULT get_value_nothrow(...)\n    //\n    //  - Reads a value from under a specified key\n    //  - The required type of registry value being read from is determined by the template type T\n    //  - Returns an HRESULT error code indicating success or failure (does not throw C++ exceptions)\n    //\n    // Examples of usage (the template type does not need to be explicitly specified)\n    //     uint32_t dword_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"subkey\", L\"dword_value_name\", &dword_value); // reads a REG_DWORD\n    //     uint64_t qword_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"subkey\", L\"qword_value_name\", &qword_value); // reads a REG_QWORD\n    //     wil::unique_bstr string_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"subkey\", L\"string_value_name\", string_value); // reads a REG_SZ\n    //\n    // A subkey is not required if the key is opened where this should write the value:\n    //     hr = wil::reg::get_value_nothrow(key, L\"dword_value_name\", &dword_value); // reads a REG_DWORD\n    //     hr = wil::reg::get_value_nothrow(key, L\"qword_value_name\", &qword_value); // reads a REG_QWORD\n    //     hr = wil::reg::get_value_nothrow(key, L\"string_value_name\", string_value); // reads a REG_SZ\n    //\n    // Can also specify the registry type in the function name:\n    //     hr = wil::reg::get_value_dword_nothrow(key, L\"dword_value_name\", &dword_value); // reads a REG_DWORD\n    //     hr = wil::reg::get_value_qword_nothrow(key, L\"qword_value_name\", &qword_value); // reads a REG_QWORD\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", string_value); // reads a REG_SZ\n    //\n    // Example storing directly into a WCHAR array - note will return the required number of bytes if the supplied array is too small\n    //     WCHAR string_value[100]{};\n    //     uint32_t requiredBytes{};\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", string_value, &requiredBytes);\n    //\n    // Example of usage writing a REG_MULTI_SZ\n    //     wil::unique_cotaskmem_array_ptr<wil::unique_cotaskmem_string> string_values{};\n    //     hr = wil::reg::get_value_multistring_nothrow(key, L\"multi_string_value_name\", string_values);\n    //\n    // Values can be written directly from a vector of bytes - the registry type must be specified; e.g.:\n    //     wil::unique_cotaskmem_array_ptr<BYTE> raw_value{};\n    //     hr = wil::reg::get_value_binary_nothrow(key, L\"binary_value_name\", REG_BINARY, raw_value);\n    //\n    // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated get_value_string_nothrow and get_value_expanded_string_nothrow functions\n    // Where the template type is the type to receive the string value\n    // The default template type is std::wstring, available if the caller has included the STL <string> header\n    //\n    // Example storing a string in a wil::unique_bstr, wil::shared_bstr, wil::unique_cotaskmem_string, or wil::shared_cotaskmem_string\n    /// - These string types are passed by reference, not by pointer, because the wil types overload the & operator\n    //\n    //     wil::unique_bstr bstr_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"string_value_name\", bstr_value);\n    //     // or can specify explicitly reading a string into a wil::unique_bstr type\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", bstr_value);\n    //\n    //     wil::shared_bstr shared_bstr_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"string_value_name\", shared_bstr_value);\n    //     // or can specify explicitly reading a string into a wil::shared_bstr type\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", shared_bstr_value);\n    //\n    //     wil::unique_cotaskmem_string string_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"string_value_name\", string_value);\n    //     // or can specify explicitly reading a string into a wil::unique_cotaskmem_string type\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", string_value);\n    //\n    //     wil::shared_cotaskmem_string shared_string_value{};\n    //     hr = wil::reg::get_value_nothrow(key, L\"string_value_name\", shared_string_value);\n    //     // or can specify explicitly reading a string into a wil::shared_cotaskmem_string type\n    //     hr = wil::reg::get_value_string_nothrow(key, L\"string_value_name\", shared_string_value);\n    //\n\n    /**\n     * @brief Reads a value under a specified key, the registry type based off the templated type passed as data\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A pointer-to-T receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename T, wistd::enable_if_t<!wistd::is_same_v<T, wchar_t>>* = nullptr>\n    HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ T* return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value<T>(subkey, value_name, *return_value);\n    }\n\n    /**\n     * @brief Reads a value under a specified key, the registry type based off the templated type passed as data\n     * @tparam T The type of the data being set (the registry value type is deduced from T).\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A pointer-to-T receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename T, wistd::enable_if_t<!wistd::is_same_v<T, wchar_t>>* = nullptr>\n    HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ T* return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @param[out] requiredBytes An optional pointer to a unsigned 32-bit value to receive the required bytes of the string in the\n     *             registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length, typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length], _Out_opt_ DwordType* requiredBytes) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value_char_array(subkey, value_name, return_value, REG_SZ, requiredBytes);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @param[out] requiredBytes An optional pointer to an unsigned 32-bit value to receive the required bytes of the string to be\n     *             read\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length, typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length], _Out_opt_ DwordType* requiredBytes) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow<Length>(key, nullptr, value_name, return_value, requiredBytes);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        constexpr uint32_t* null_out_param = nullptr;\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value_char_array(subkey, value_name, return_value, REG_SZ, null_out_param);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow<Length>(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow<Length>(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow<Length>(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_DWORD value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A pointer to an unsigned 32-bit value receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ DwordType* return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_DWORD value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A pointer to an unsigned 32-bit value receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ DwordType* return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_QWORD value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A uint64_t receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename QwordType, wistd::enable_if_t<wistd::is_same_v<QwordType, uint64_t> || wistd::is_same_v<QwordType, unsigned long long>>* = nullptr>\n    HRESULT get_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ QwordType* return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_QWORD value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A uint64_t receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <typename QwordType, wistd::enable_if_t<wistd::is_same_v<QwordType, uint64_t> || wistd::is_same_v<QwordType, unsigned long long>>* = nullptr>\n    HRESULT get_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ QwordType* return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OLEAUTO_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value(subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value.addressof());\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OLEAUTO_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value(subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value.addressof());\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value);\n    }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return_value.reset();\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value(subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OBJBASE_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return_value.reset();\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value(subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n#endif // #if defined(__WIL_OBJBASE_H_STL)\n#endif // defined(__WIL_OBJBASE_H_)\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads the raw bytes from a registry value under a specified key of the specified type\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<BYTE> receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_binary_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, ::wil::unique_cotaskmem_array_ptr<uint8_t>& return_value) WI_NOEXCEPT\n    {\n        // zero the vector if it already had a buffer\n        for (auto& byte_value : return_value)\n        {\n            byte_value = 0x00;\n        }\n        const reg_view_details::reg_view_nothrow regview{key};\n        RETURN_IF_FAILED(regview.get_value<::wil::unique_cotaskmem_array_ptr<uint8_t>>(subkey, value_name, return_value, type));\n        return S_OK;\n    }\n\n    /**\n     * @brief Reads the raw bytes from a registry value under a specified key of the specified type\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param type The registry type for the specified registry value to read from - see RegGetValueW\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<BYTE> receiving the value read from the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_binary_nothrow(\n        HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, ::wil::unique_cotaskmem_array_ptr<uint8_t>& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_binary_nothrow(key, nullptr, value_name, type, return_value);\n    }\n#endif // #if defined(__WIL_OBJBASE_H_)\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @param[out] requiredBytes An optional pointer to a uint32_t to receive the required bytes of the string to be read\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length, typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_expanded_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length], _Out_opt_ DwordType* requiredBytes) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value_char_array(subkey, value_name, return_value, REG_EXPAND_SZ, requiredBytes);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @param[out] requiredBytes An optional pointer to a uint32_t to receive the required bytes of the string to be read\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length, typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n    HRESULT get_value_expanded_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length], _Out_opt_ DwordType* requiredBytes) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow<Length>(key, nullptr, value_name, return_value, requiredBytes);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        constexpr uint32_t* null_out_param = nullptr;\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value_char_array(subkey, value_name, return_value, REG_EXPAND_SZ, null_out_param);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @tparam Length The length of the WCHAR array passed as an OUT parameter\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A WCHAR array receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     *             Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    template <size_t Length>\n    HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length]) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow<Length>(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OLEAUTO_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value<::wil::unique_bstr>(subkey, value_name, return_value, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_bstr receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OLEAUTO_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value<::wil::shared_bstr>(subkey, value_name, return_value, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_bstr receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value);\n    }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value<::wil::unique_cotaskmem_string>(subkey, value_name, return_value, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value);\n    }\n\n#if defined(__WIL_OBJBASE_H_STL) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(\n        HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        const reg_view_details::reg_view_nothrow regview{key};\n        return regview.get_value<::wil::shared_cotaskmem_string>(subkey, value_name, return_value, REG_EXPAND_SZ);\n    }\n\n    /**\n     * @brief Reads a REG_EXPAND_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry,\n     *             with environment variables expanded, as though passed through ExpandEnvironmentStringsW.\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value);\n    }\n#endif // #if defined(__WIL_OBJBASE_H_STL)\n#endif // defined(__WIL_OBJBASE_H_)\n\n#if defined(__WIL_OBJBASE_H_) || defined(WIL_DOXYGEN)\n    /**\n     * @brief Reads a REG_MULTI_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from\n     *             the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(\n        HKEY key,\n        _In_opt_ PCWSTR subkey,\n        _In_opt_ PCWSTR value_name,\n        ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT\n    {\n        ::wil::unique_cotaskmem_array_ptr<uint8_t> rawData;\n        RETURN_IF_FAILED(::wil::reg::get_value_binary_nothrow(key, subkey, value_name, REG_MULTI_SZ, rawData));\n        if (!rawData.empty())\n        {\n            auto* const begin = reinterpret_cast<wchar_t*>(rawData.data());\n            auto* const end = begin + rawData.size() / sizeof(wchar_t);\n            ::wil::reg::reg_view_details::get_cotaskmemstring_array_from_multistring_nothrow(begin, end, return_value);\n        }\n        return S_OK;\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from\n     *             the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_nothrow(\n        HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param subkey The name of the subkey to append to `key`.\n     *        If `nullptr`, then `key` is used without modification.\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from\n     *             the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_multistring_nothrow(\n        HKEY key,\n        _In_opt_ PCWSTR subkey,\n        _In_opt_ PCWSTR value_name,\n        ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value);\n    }\n\n    /**\n     * @brief Reads a REG_MULTI_SZ value under a specified key\n     * @param key An open or well-known registry key\n     * @param value_name The name of the registry value whose data is to be read.\n     *        Can be nullptr to read from the unnamed default registry value.\n     * @param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from\n     *             the registry\n     * @return HRESULT error code indicating success or failure (does not throw C++ exceptions)\n     */\n    inline HRESULT get_value_multistring_nothrow(\n        HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT\n    {\n        return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value);\n    }\n#endif // #if defined(__WIL_OBJBASE_H_)\n} // namespace reg\n\n// unique_registry_watcher/unique_registry_watcher_nothrow/unique_registry_watcher_failfast\n// These classes make it easy to execute a provided function when a\n// registry key changes (optionally recursively). Specify the key\n// either as a root key + path, or an open registry handle as wil::unique_hkey\n// or a raw HKEY value (that will be duplicated).\n//\n// Example use with exceptions base error handling:\n// auto watcher = wil::make_registry_watcher(HKEY_CURRENT_USER, L\"Software\\\\MyApp\", true, wil::RegistryChangeKind changeKind[]\n//     {\n//          if (changeKind == RegistryChangeKind::Delete)\n//          {\n//              watcher.reset();\n//          }\n//         // invalidate cached registry data here\n//     });\n//\n// Example use with error code base error handling:\n// auto watcher = wil::make_registry_watcher_nothrow(HKEY_CURRENT_USER, L\"Software\\\\MyApp\", true, wil::RegistryChangeKind[]\n//     {\n//         // invalidate cached registry data here\n//     });\n// RETURN_IF_NULL_ALLOC(watcher);\n\nenum class RegistryChangeKind\n{\n    Modify = 0,\n    Delete = 1,\n};\n\n/// @cond\nnamespace details\n{\n    struct registry_watcher_state\n    {\n        registry_watcher_state(unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback) :\n            m_callback(wistd::move(callback)), m_keyToWatch(wistd::move(keyToWatch)), m_isRecursive(isRecursive)\n        {\n        }\n        wistd::function<void(RegistryChangeKind)> m_callback;\n        unique_hkey m_keyToWatch;\n        unique_event_nothrow m_eventHandle;\n\n        // While not strictly needed since this is ref counted the thread pool wait\n        // should be last to ensure that the other members are valid\n        // when it is destructed as it will reference them.\n        unique_threadpool_wait m_threadPoolWait;\n        bool m_isRecursive;\n\n        volatile long m_refCount = 1;\n        srwlock m_lock;\n\n        // Returns true if the ref-count can be increased from a non zero value,\n        // false it was zero implying that the object is in or on the way to the destructor.\n        // In this case ReleaseFromCallback() should not be called.\n        bool TryAddRef()\n        {\n            return ::InterlockedIncrement(&m_refCount) > 1;\n        }\n\n        void Release()\n        {\n            auto lock = m_lock.lock_exclusive();\n            if (0 == ::InterlockedDecrement(&m_refCount))\n            {\n                lock.reset(); // leave the lock before deleting it.\n                delete this;\n            }\n        }\n\n        void ReleaseFromCallback(bool rearm)\n        {\n            auto lock = m_lock.lock_exclusive();\n            if (0 == ::InterlockedDecrement(&m_refCount))\n            {\n                // Destroy the thread pool wait now to avoid the wait that would occur in the\n                // destructor. That wait would cause a deadlock since we are doing this from the callback.\n                ::CloseThreadpoolWait(m_threadPoolWait.release());\n                lock.reset(); // leave the lock before deleting it.\n                delete this;\n                // Sleep(1); // Enable for testing to find use after free bugs.\n            }\n            else if (rearm)\n            {\n                ::SetThreadpoolWait(m_threadPoolWait.get(), m_eventHandle.get(), nullptr);\n            }\n        }\n    };\n\n    inline void delete_registry_watcher_state(_In_opt_ registry_watcher_state* watcherStorage)\n    {\n        watcherStorage->Release();\n    }\n\n    typedef resource_policy<registry_watcher_state*, decltype(&details::delete_registry_watcher_state), details::delete_registry_watcher_state, details::pointer_access_none>\n        registry_watcher_state_resource_policy;\n} // namespace details\n/// @endcond\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass registry_watcher_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit registry_watcher_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructors\n    registry_watcher_t(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions; use the create method\");\n        create(rootKey, subKey, isRecursive, wistd::move(callback));\n    }\n\n    registry_watcher_t(unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions; use the create method\");\n        create(wistd::move(keyToWatch), isRecursive, wistd::move(callback));\n    }\n\n    // Pass a root key, sub key pair or use an empty string to use rootKey as the key to watch.\n    result create(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n    {\n        // Most use will want to create the key, consider adding an option for open as a future design change.\n        unique_hkey keyToWatch;\n        HRESULT hr = HRESULT_FROM_WIN32(RegCreateKeyExW(rootKey, subKey, 0, nullptr, 0, KEY_NOTIFY, nullptr, &keyToWatch, nullptr));\n        if (FAILED(hr))\n        {\n            return err_policy::HResult(hr);\n        }\n        return err_policy::HResult(create_common(wistd::move(keyToWatch), isRecursive, wistd::move(callback)));\n    }\n\n    result create(unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n    {\n        return err_policy::HResult(create_common(wistd::move(keyToWatch), isRecursive, wistd::move(callback)));\n    }\n\nprivate:\n    // Factored into a standalone function to support Clang which does not support conversion of stateless lambdas\n    // to __stdcall\n    static void __stdcall callback(PTP_CALLBACK_INSTANCE, void* context, TP_WAIT*, TP_WAIT_RESULT)\n    {\n#ifndef __WIL_REGISTRY_CHANGE_CALLBACK_TEST\n#define __WIL_REGISTRY_CHANGE_CALLBACK_TEST\n#endif\n        __WIL_REGISTRY_CHANGE_CALLBACK_TEST\n        const auto watcherState = static_cast<details::registry_watcher_state*>(context);\n        if (watcherState->TryAddRef())\n        {\n            // using auto reset event so don't need to manually reset.\n\n            // failure here is a programming error.\n            const LSTATUS error = RegNotifyChangeKeyValue(\n                watcherState->m_keyToWatch.get(),\n                watcherState->m_isRecursive,\n                REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_THREAD_AGNOSTIC,\n                watcherState->m_eventHandle.get(),\n                TRUE);\n\n            // Call the client before re-arming to ensure that multiple callbacks don't\n            // run concurrently.\n            switch (error)\n            {\n            case ERROR_SUCCESS:\n            case ERROR_ACCESS_DENIED:\n                // Normal modification: send RegistryChangeKind::Modify and re-arm.\n                watcherState->m_callback(RegistryChangeKind::Modify);\n                watcherState->ReleaseFromCallback(true);\n                break;\n\n            case ERROR_KEY_DELETED:\n                // Key deleted, send RegistryChangeKind::Delete, do not re-arm.\n                watcherState->m_callback(RegistryChangeKind::Delete);\n                watcherState->ReleaseFromCallback(false);\n                break;\n\n            case ERROR_HANDLE_REVOKED:\n                // Handle revoked.  This can occur if the user session ends before\n                // the watcher shuts-down.  Disarm silently since there is generally no way to respond.\n                watcherState->ReleaseFromCallback(false);\n                break;\n\n            default:\n                FAIL_FAST_HR(HRESULT_FROM_WIN32(error));\n            }\n        }\n    }\n\n    // This function exists to avoid template expansion of this code based on err_policy.\n    HRESULT create_common(unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n    {\n        wistd::unique_ptr<details::registry_watcher_state> watcherState(\n            new (std::nothrow) details::registry_watcher_state(wistd::move(keyToWatch), isRecursive, wistd::move(callback)));\n        RETURN_IF_NULL_ALLOC(watcherState);\n        RETURN_IF_FAILED(watcherState->m_eventHandle.create());\n        RETURN_IF_WIN32_ERROR(RegNotifyChangeKeyValue(\n            watcherState->m_keyToWatch.get(),\n            watcherState->m_isRecursive,\n            REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_THREAD_AGNOSTIC,\n            watcherState->m_eventHandle.get(),\n            TRUE));\n\n        watcherState->m_threadPoolWait.reset(CreateThreadpoolWait(&registry_watcher_t::callback, watcherState.get(), nullptr));\n        RETURN_LAST_ERROR_IF(!watcherState->m_threadPoolWait);\n        storage_t::reset(watcherState.release()); // no more failures after this, pass ownership\n        SetThreadpoolWait(storage_t::get()->m_threadPoolWait.get(), storage_t::get()->m_eventHandle.get(), nullptr);\n        return S_OK;\n    }\n};\n\ntypedef unique_any_t<registry_watcher_t<details::unique_storage<details::registry_watcher_state_resource_policy>, err_returncode_policy>> unique_registry_watcher_nothrow;\ntypedef unique_any_t<registry_watcher_t<details::unique_storage<details::registry_watcher_state_resource_policy>, err_failfast_policy>> unique_registry_watcher_failfast;\n\ninline unique_registry_watcher_nothrow make_registry_watcher_nothrow(\n    HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback) WI_NOEXCEPT\n{\n    unique_registry_watcher_nothrow watcher;\n    watcher.create(rootKey, subKey, isRecursive, wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\ninline unique_registry_watcher_nothrow make_registry_watcher_nothrow(\n    unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback) WI_NOEXCEPT\n{\n    unique_registry_watcher_nothrow watcher;\n    watcher.create(wistd::move(keyToWatch), isRecursive, wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\ninline unique_registry_watcher_failfast make_registry_watcher_failfast(\n    HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n{\n    return unique_registry_watcher_failfast(rootKey, subKey, isRecursive, wistd::move(callback));\n}\n\ninline unique_registry_watcher_failfast make_registry_watcher_failfast(\n    unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n{\n    return unique_registry_watcher_failfast(wistd::move(keyToWatch), isRecursive, wistd::move(callback));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<registry_watcher_t<details::unique_storage<details::registry_watcher_state_resource_policy>, err_exception_policy>> unique_registry_watcher;\n\ninline unique_registry_watcher make_registry_watcher(\n    HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n{\n    return unique_registry_watcher(rootKey, subKey, isRecursive, wistd::move(callback));\n}\n\ninline unique_registry_watcher make_registry_watcher(unique_hkey&& keyToWatch, bool isRecursive, wistd::function<void(RegistryChangeKind)>&& callback)\n{\n    return unique_registry_watcher(wistd::move(keyToWatch), isRecursive, wistd::move(callback));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n} // namespace wil\n\n#endif\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/registry_helpers.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for iterating over keys and values in the registry.\n#ifndef __WIL_REGISTRY_HELPERS_INCLUDED\n#define __WIL_REGISTRY_HELPERS_INCLUDED\n\n#include \"common.h\"\n\n#if WIL_USE_STL\n#include <functional>\n#include <iterator>\n#include <string>\n#include <vector>\n\n#if (__WI_LIBCPP_STD_VER >= 17) && WI_HAS_INCLUDE(<optional>, 1) // Assume present if C++17 or later\n#include <optional>\n#endif\n#endif\n\n#include <stdint.h>\n#include <Windows.h>\n#include \"resource.h\"\n\n#ifdef _KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\nnamespace wil\n{\nnamespace reg\n{\n    /**\n     * @brief Helper function to translate registry return values if the value was not found\n     * @param hr HRESULT to test from registry APIs\n     * @return boolean if the HRESULT indicates the registry value was not found\n     */\n    constexpr bool is_registry_not_found(HRESULT hr) WI_NOEXCEPT\n    {\n        return (hr == __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) || (hr == __HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND));\n    }\n\n    /**\n     * @brief Helper function to translate registry return values if the buffer was too small\n     * @param hr HRESULT to test from registry APIs\n     * @return boolean if the HRESULT indicates the buffer was too small for the value being read\n     */\n    constexpr bool is_registry_buffer_too_small(HRESULT hr) WI_NOEXCEPT\n    {\n        return hr == __HRESULT_FROM_WIN32(ERROR_MORE_DATA);\n    }\n\n    // Access rights for opening registry keys. See https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights.\n    enum class key_access\n    {\n        // Open key for reading.\n        read,\n\n        // Open key for reading and writing. Equivalent to KEY_ALL_ACCESS.\n        readwrite,\n    };\n\n    /// @cond\n    namespace reg_view_details\n    {\n        constexpr DWORD get_value_flags_from_value_type(DWORD type) WI_NOEXCEPT\n        {\n            switch (type)\n            {\n            case REG_DWORD:\n                return RRF_RT_REG_DWORD;\n            case REG_QWORD:\n                return RRF_RT_REG_QWORD;\n            case REG_SZ:\n                return RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_NOEXPAND;\n            case REG_EXPAND_SZ:\n                return RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ;\n            case REG_MULTI_SZ:\n                return RRF_RT_REG_MULTI_SZ;\n            case REG_BINARY:\n                return RRF_RT_REG_BINARY;\n                // the caller can directly specify their own flags if they need to\n            default:\n                return type;\n            }\n        }\n\n        constexpr DWORD get_access_flags(key_access access) WI_NOEXCEPT\n        {\n            switch (access)\n            {\n            case key_access::read:\n                return KEY_READ;\n            case key_access::readwrite:\n                return KEY_ALL_ACCESS;\n            }\n            FAIL_FAST();\n            RESULT_NORETURN_RESULT(0);\n        }\n\n        /**\n         * @brief A utility function that walks a contiguous wchar_t container looking for strings within a multi-string\n         * @tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual\n         *         strings\n         * @tparam Fn A callback function to be called each time a string is found - given the [begin, end] iterators referencing\n         *         the found string\n         * @param first An iterator referencing to the beginning of the target container (like a std::begin iterator)\n         * @param last An iterator referencing one-past-the-end of the target container (like a std::end iterator)\n         * @param func A callback function to be called each time a string is found - given the [begin, end] iterators referencing\n         *             the found string\n         */\n        template <class InputIt, class Fn>\n        void walk_multistring(const InputIt& first, const InputIt& last, Fn func)\n        {\n            auto current = first;\n            const auto end_iterator = last;\n            const auto last_null = (end_iterator - 1);\n            while (current != end_iterator)\n            {\n                // hand rolling ::std::find(current, end_iterator, L'\\0');\n                // as this may be called when <algorithm> isn't available\n                auto next = current;\n                while (next != end_iterator && *next != L'\\0')\n                {\n                    ++next;\n                }\n\n                if (next != end_iterator)\n                {\n                    // don't add an empty string for the final 2nd-null-terminator\n                    if (next != last_null)\n                    {\n                        // call the function provided with the [begin, end] pair referencing a string found\n                        func(current, next);\n                    }\n                    current = next + 1;\n                }\n                else\n                {\n                    current = next;\n                }\n            }\n        }\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n        /**\n         * @brief A translation function taking iterators referencing std::wstring objects and returns a corresponding\n         *        std::vector<wchar_t> to be written to a MULTI_SZ registry value. The translation follows the rules for how\n         *        MULTI_SZ registry values should be formatted, notably how null characters should be embedded within the returned\n         *        vector\n         * @tparam InputIt An iterator type that references a container that holds std::wstring objects to translate into a\n         *         wchar_t buffer\n         * @param first An iterator referencing to the beginning of the target container (like a std::begin iterator)\n         * @param last An iterator referencing one-past-the-end of the target container (like a std::end iterator)\n         * @return A std::vector<wchar_t> with the raw wchar_t buffer of bytes prepared to write to a MULTI_SZ registry value\n         */\n        template <class InputIt>\n        ::std::vector<wchar_t> get_multistring_from_wstrings(const InputIt& first, const InputIt& last)\n        {\n            ::std::vector<wchar_t> multistring;\n\n            if (first == last)\n            {\n                multistring.push_back(L'\\0');\n                multistring.push_back(L'\\0');\n                return multistring;\n            }\n\n            for (const auto& wstr : ::wil::make_range(first, last))\n            {\n                multistring.insert(multistring.end(), ::std::begin(wstr), ::std::end(wstr));\n                multistring.push_back(L'\\0');\n            }\n\n            // double-null-terminate the last string\n            multistring.push_back(L'\\0');\n            return multistring;\n        }\n\n        /**\n         * @brief A translation function taking iterators referencing wchar_t characters and returns extracted individual\n         *        std::wstring objects. The translation follows the rules for how MULTI_SZ registry value can be formatted,\n         *        notably with embedded null characters. Note that this conversion avoids returning empty std::wstring objects\n         *        even though the input may contain contiguous null wchar_t values\n         * @tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual\n         *         strings\n         * @param first An iterator referencing to the beginning of the target container (like a std::begin iterator)\n         * @param last An iterator referencing one-past-the-end of the target container (like a std::end iterator)\n         * @return A std::vector<std::wstring> of the extracted strings from the input container of wchar_t characters\n         */\n        template <class InputIt>\n        ::std::vector<::std::wstring> get_wstring_vector_from_multistring(const InputIt& first, const InputIt& last)\n        {\n            if (last - first < 3)\n            {\n                // it doesn't have the required 2 terminating null characters - return an empty string\n                return ::std::vector<::std::wstring>(1);\n            }\n\n            ::std::vector<::std::wstring> strings;\n            walk_multistring(first, last, [&](const InputIt& string_first, const InputIt& string_last) {\n                strings.emplace_back(string_first, string_last);\n            });\n            return strings;\n        }\n#endif\n\n#if defined(__WIL_OBJBASE_H_)\n        template <size_t C>\n        void get_multistring_bytearray_from_strings_nothrow(const PCWSTR data[C], ::wil::unique_cotaskmem_array_ptr<BYTE>& multistring) WI_NOEXCEPT\n        {\n            constexpr uint8_t nullTermination[2]{0x00, 0x00};\n\n            size_t total_array_length_bytes = 0;\n            for (size_t i = 0; i < C; ++i)\n            {\n                total_array_length_bytes += wcslen(data[i]) * sizeof(wchar_t);\n                total_array_length_bytes += sizeof(wchar_t); // plus one for the null-terminator\n            }\n            total_array_length_bytes += sizeof(wchar_t); // plus one for the ending double-null-terminator\n\n            *multistring.addressof() = static_cast<uint8_t*>(::CoTaskMemAlloc(total_array_length_bytes));\n            if (!multistring.get())\n            {\n                multistring.reset();\n                return;\n            }\n            *multistring.size_address() = total_array_length_bytes;\n\n            size_t array_offset = 0;\n            for (size_t i = 0; i < C; ++i)\n            {\n                const auto string_length_bytes = wcslen(data[i]) * sizeof(wchar_t);\n                memcpy(multistring.get() + array_offset, data[i], string_length_bytes);\n                array_offset += string_length_bytes;\n\n                static_assert(sizeof(nullTermination) == sizeof(wchar_t), \"null terminator must be a wchar\");\n                memcpy(multistring.get() + array_offset, nullTermination, sizeof(nullTermination));\n                array_offset += sizeof(nullTermination);\n            }\n\n            // double-null-terminate the last string\n            memcpy(multistring.get() + array_offset, nullTermination, sizeof(nullTermination));\n        }\n\n        /**\n         * @brief A translation function taking iterators referencing wchar_t characters and returns extracted individual\n         *        wil::unique_cotaskmem_string objects. The translation follows the rules for how MULTI_SZ registry value can be\n         *        formatted, notably with embedded null characters. Note that this conversion avoids returning empty\n         *        wil::unique_cotaskmem_string objects even though the input may contain contiguous null wchar_t values\n         * @tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual\n         *         strings\n         * @param first An iterator referencing to the beginning of the target container (like a std::begin iterator)\n         * @param last An iterator referencing one-past-the-end of the target container (like a std::end iterator)\n         * @param cotaskmem_array The [out] wil::unique_cotaskmem_array_ptr<wil::unique_cotaskmem_string> to contain the array of\n         *         strings. A wil::unique_cotaskmem_array_ptr<wil::unique_cotaskmem_string> of the extracted strings from the\n         *         input container of wchar_t characters. An empty wil::unique_cotaskmem_array_ptr should be translated as out-of\n         *         memory as there should always be at least one wil::unique_cotaskmem_string\n         */\n        template <class InputIt>\n        void get_cotaskmemstring_array_from_multistring_nothrow(\n            const InputIt& first, const InputIt& last, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& cotaskmem_array) WI_NOEXCEPT\n        {\n            if (last - first < 3)\n            {\n                // it doesn't have the required 2 terminating null characters - return an empty string\n                *cotaskmem_array.addressof() = static_cast<PWSTR*>(::CoTaskMemAlloc(sizeof(PWSTR) * 1));\n                if (cotaskmem_array)\n                {\n                    auto new_string = ::wil::make_cotaskmem_string_nothrow(L\"\");\n                    if (new_string)\n                    {\n                        *cotaskmem_array.size_address() = 1;\n                        cotaskmem_array[0] = new_string.release();\n                    }\n                    else\n                    {\n                        // oom will return an empty array\n                        cotaskmem_array.reset();\n                    }\n                }\n                else\n                {\n                    // oom will return an empty array\n                    cotaskmem_array.reset();\n                }\n                return;\n            }\n\n            // we must first count the # of strings for the array\n            size_t arraySize = 0;\n            walk_multistring(first, last, [&](const InputIt&, const InputIt&) {\n                ++arraySize;\n            });\n\n            // allocate the array size necessary to hold all the unique_cotaskmem_strings\n            *cotaskmem_array.addressof() = static_cast<PWSTR*>(::CoTaskMemAlloc(sizeof(PWSTR) * arraySize));\n            if (!cotaskmem_array)\n            {\n                // oom will return an empty array\n                cotaskmem_array.reset();\n                return;\n            }\n\n            *cotaskmem_array.size_address() = arraySize;\n            ZeroMemory(cotaskmem_array.data(), sizeof(PWSTR) * arraySize);\n\n            size_t arrayOffset = 0;\n            walk_multistring(first, last, [&](const InputIt& string_first, const InputIt& string_last) {\n                FAIL_FAST_IF(arrayOffset >= arraySize);\n                const auto stringSize = string_last - string_first;\n                auto new_string = ::wil::make_cotaskmem_string_nothrow(&(*string_first), stringSize);\n                if (!new_string)\n                {\n                    // oom will return an empty array\n                    cotaskmem_array.reset();\n                    return;\n                }\n                cotaskmem_array[arrayOffset] = new_string.release();\n                ++arrayOffset;\n            });\n        }\n#endif // #if defined(__WIL_OBJBASE_H_)\n\n        namespace reg_value_type_info\n        {\n            // supports_prepare_buffer is used to determine if the input buffer to read a registry value should be prepared\n            // before the first call to the registry read API\n            template <typename T>\n            constexpr bool supports_prepare_buffer() WI_NOEXCEPT\n            {\n                return false;\n            }\n            template <typename T>\n            HRESULT prepare_buffer(T&) WI_NOEXCEPT\n            {\n                // no-op in the default case\n                return S_OK;\n            }\n\n            // supports_resize_buffer_bytes is used to determine if the input buffer to read a registry value can be resized\n            // for those cases if the error from the registry read API indicates it needs a larger buffer\n            template <typename T>\n            constexpr bool supports_resize_buffer_bytes() WI_NOEXCEPT\n            {\n                return false;\n            }\n            template <typename T>\n            constexpr HRESULT resize_buffer_bytes(T&, DWORD) WI_NOEXCEPT\n            {\n                return E_NOTIMPL;\n            }\n\n            // supports_trim_buffer is used to determine if the input buffer to read a registry value must be trimmed\n            // after the registry read API has successfully written into the supplied buffer\n            // note that currently only std::wstring requires this as it cannot have embedded nulls\n            template <typename T>\n            constexpr bool supports_trim_buffer() WI_NOEXCEPT\n            {\n                return false;\n            }\n            // if called for a type that does not support trimming, will return a zero-length\n            template <typename T>\n            constexpr size_t trim_buffer(T&) WI_NOEXCEPT\n            {\n                return 0;\n            }\n\n            constexpr void* get_buffer(const int32_t& value) WI_NOEXCEPT\n            {\n                return const_cast<int32_t*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(int32_t) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(int32_t));\n            }\n\n            constexpr void* get_buffer(const uint32_t& value) WI_NOEXCEPT\n            {\n                return const_cast<uint32_t*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(uint32_t) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(uint32_t));\n            }\n\n            constexpr void* get_buffer(const long& value) WI_NOEXCEPT\n            {\n                return const_cast<long*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(long) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(long));\n            }\n\n            constexpr void* get_buffer(const unsigned long& value) WI_NOEXCEPT\n            {\n                return const_cast<unsigned long*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(unsigned long) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(unsigned long));\n            }\n\n            constexpr void* get_buffer(const int64_t& value) WI_NOEXCEPT\n            {\n                return const_cast<int64_t*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(int64_t) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(int64_t));\n            }\n\n            constexpr void* get_buffer(const uint64_t& value) WI_NOEXCEPT\n            {\n                return const_cast<uint64_t*>(&value);\n            }\n\n            constexpr DWORD get_buffer_size_bytes(uint64_t) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(sizeof(uint64_t));\n            }\n\n            constexpr void* get_buffer(PCWSTR value) WI_NOEXCEPT\n            {\n                return const_cast<wchar_t*>(value);\n            }\n\n            inline DWORD get_buffer_size_bytes(PCWSTR value) WI_NOEXCEPT\n            {\n                if (!value)\n                {\n                    return 0;\n                }\n                // including the last null buffer space in the returned buffer-size-bytes\n                // as the registry API we call guarantees null termination\n                return static_cast<DWORD>((::wcslen(value) + 1) * sizeof(wchar_t));\n            }\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n            inline void* get_buffer(const ::std::vector<uint8_t>& buffer) WI_NOEXCEPT\n            {\n                return const_cast<uint8_t*>(buffer.data());\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::std::vector<uint8_t>& value) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(value.size());\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<::std::vector<uint8_t>>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(::std::vector<uint8_t>& value) WI_NOEXCEPT\n            try\n            {\n                // resize the initial vector to at least 1 byte\n                // this is needed so we can detect when the registry value exists\n                // but the value has zero-bytes\n                if (value.empty())\n                {\n                    value.resize(1);\n                }\n                // zero out the buffer if pre-allocated\n                for (auto& string_char : value)\n                {\n                    string_char = 0x00;\n                }\n                return S_OK;\n            }\n            CATCH_RETURN();\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::std::vector<uint8_t>>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::std::vector<uint8_t>& buffer, DWORD byteSize) WI_NOEXCEPT\n            try\n            {\n                buffer.resize(byteSize);\n                return S_OK;\n            }\n            CATCH_RETURN();\n\n            // std::vector<wchar_t> does not implement resize_buffer_bytes\n            // because these support functions are only needed for set_value\n            // from the return of get_multistring_from_wstrings\n            inline void* get_buffer(const ::std::vector<wchar_t>& value) WI_NOEXCEPT\n            {\n                return const_cast<wchar_t*>(value.data());\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::std::vector<wchar_t>& value) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(value.size()) * sizeof(wchar_t);\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<::std::vector<wchar_t>>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(::std::vector<wchar_t>& value) WI_NOEXCEPT\n            {\n                // zero out the buffer if pre-allocated\n                for (auto& string_char : value)\n                {\n                    string_char = L'\\0';\n                }\n                return S_OK;\n            }\n#endif\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n            inline void* get_buffer(const ::std::wstring& string) WI_NOEXCEPT\n            {\n                return const_cast<wchar_t*>(string.data());\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::std::wstring& string) WI_NOEXCEPT\n            {\n                // including the last null buffer space in the returned buffer-size-bytes\n                // as the registry API we call guarantees null termination\n                return static_cast<DWORD>((string.size() + 1) * sizeof(wchar_t));\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<::std::wstring>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(::std::wstring& string) WI_NOEXCEPT\n            {\n                // zero out the buffer if pre-allocated\n                for (auto& string_char : string)\n                {\n                    string_char = L'\\0';\n                }\n                return S_OK;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::std::wstring>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::std::wstring& string, DWORD byteSize) WI_NOEXCEPT\n            try\n            {\n                string.resize(byteSize / sizeof(wchar_t));\n                return S_OK;\n            }\n            CATCH_RETURN();\n\n            template <>\n            constexpr bool supports_trim_buffer<::std::wstring>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline size_t trim_buffer(::std::wstring& buffer) WI_NOEXCEPT\n            {\n                // remove any embedded null characters\n                const auto offset = buffer.find_first_of(L'\\0');\n                if (offset != ::std::wstring::npos)\n                {\n                    buffer.resize(offset);\n                }\n                return buffer.size();\n            }\n#endif\n\n#if defined(__WIL_OLEAUTO_H_)\n            inline void* get_buffer(const BSTR& value) WI_NOEXCEPT\n            {\n                return value;\n            }\n\n            inline DWORD get_buffer_size_bytes(const BSTR& value) WI_NOEXCEPT\n            {\n                auto length = ::SysStringLen(value);\n                if (length > 0)\n                {\n                    // SysStringLen does not count the null-terminator\n                    // including the last null buffer space in the returned buffer-size-bytes\n                    // as the registry API we call guarantees null termination\n                    length += 1;\n                }\n                return length * sizeof(WCHAR);\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<BSTR>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(const BSTR& value) WI_NOEXCEPT\n            {\n                if (value)\n                {\n                    // zero out the buffer if pre-allocated\n                    for (auto& string_char : ::wil::make_range(value, get_buffer_size_bytes(value) / sizeof(WCHAR)))\n                    {\n                        string_char = L'\\0';\n                    }\n                }\n                return S_OK;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<BSTR>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            // transferringOwnership is only set to false if this is a 'shallow' copy of the BSTR\n            // and the caller maintained ownership of the original BSTR.\n            inline HRESULT resize_buffer_bytes(BSTR& string, DWORD byteSize, bool transferringOwnership = true) WI_NOEXCEPT\n            {\n                // copy the original BSTR to copy from later if needed\n                const BSTR original_string = string;\n                const DWORD original_string_length = string == nullptr ? 0 : ::SysStringLen(string);\n\n                // SysStringLen doesn't count the null-terminator, but our buffer size does\n                const bool original_string_length_too_small = (original_string_length + 1) < byteSize / sizeof(WCHAR);\n                if (original_string_length_too_small)\n                {\n                    // pass a null BSTR value because SysAllocStringLen will copy the contents of the original BSTR,\n                    // but in this case it's not long enough to copy the new length to be allocated\n                    string = nullptr;\n                }\n\n                // convert bytes to length (number of WCHAR's)\n                DWORD length_to_alloc = byteSize / sizeof(WCHAR);\n                // SysAllocStringLen adds a null, so subtract a wchar_t from the input length\n                length_to_alloc = length_to_alloc > 0 ? length_to_alloc - 1 : length_to_alloc;\n                const BSTR new_bstr{::SysAllocStringLen(string, length_to_alloc)};\n                RETURN_IF_NULL_ALLOC(new_bstr);\n\n                // copy back the original BSTR if it was too small for SysAllocStringLen\n                // also assuming that both lengths are greater than zero\n                const DWORD sourceLengthToCopy = original_string_length < length_to_alloc ? original_string_length : length_to_alloc;\n                if (sourceLengthToCopy > 0 && original_string_length_too_small)\n                {\n                    ::memcpy_s(new_bstr, length_to_alloc * sizeof(WCHAR), original_string, sourceLengthToCopy * sizeof(WCHAR));\n                }\n\n                // if not transferring ownership, the caller will still own the original BSTR\n                if (transferringOwnership)\n                {\n                    ::SysFreeString(string);\n                }\n\n                string = new_bstr;\n                return S_OK;\n            }\n\n            inline void* get_buffer(const ::wil::unique_bstr& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::wil::unique_bstr& value) WI_NOEXCEPT\n            {\n                return get_buffer_size_bytes(value.get());\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<::wil::unique_bstr>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(const ::wil::unique_bstr& value) WI_NOEXCEPT\n            {\n                if (value)\n                {\n                    // zero out the buffer if pre-allocated\n                    for (auto& string_char : ::wil::make_range(value.get(), get_buffer_size_bytes(value) / sizeof(WCHAR)))\n                    {\n                        string_char = L'\\0';\n                    }\n                }\n                return S_OK;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::unique_bstr>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::unique_bstr& string, DWORD byteSize) WI_NOEXCEPT\n            {\n                BSTR temp_bstr = string.get();\n\n                // not transferring ownership of the BSTR within 'string' to resize_buffer_bytes()\n                // resize_buffer_bytes() will overwrite temp_bstr with a newly-allocated BSTR\n                constexpr bool transferringOwnership = false;\n                RETURN_IF_FAILED(resize_buffer_bytes(temp_bstr, byteSize, transferringOwnership));\n\n                // if succeeded in creating a new BSTR, move ownership of the new BSTR into string\n                string.reset(temp_bstr);\n                return S_OK;\n            }\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n#if defined(__WIL_OLEAUTO_H_STL)\n            inline void* get_buffer(const ::wil::shared_bstr& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::wil::shared_bstr& value) WI_NOEXCEPT\n            {\n                return get_buffer_size_bytes(value.get());\n            }\n\n            template <>\n            constexpr bool supports_prepare_buffer<::wil::shared_bstr>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT prepare_buffer(const ::wil::shared_bstr& value) WI_NOEXCEPT\n            {\n                if (value)\n                {\n                    // zero out the buffer if pre-allocated\n                    for (auto& string_char : ::wil::make_range(value.get(), get_buffer_size_bytes(value) / sizeof(WCHAR)))\n                    {\n                        string_char = L'\\0';\n                    }\n                }\n                return S_OK;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::shared_bstr>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::shared_bstr& string, DWORD byteSize) WI_NOEXCEPT\n            {\n                BSTR temp_bstr = string.get();\n\n                // not transferring ownership of the BSTR within 'string' to resize_buffer_bytes()\n                // resize_buffer_bytes() will overwrite temp_bstr with a newly-allocated BSTR\n                constexpr bool transferringOwnership = false;\n                RETURN_IF_FAILED(resize_buffer_bytes(temp_bstr, byteSize, transferringOwnership));\n\n                // if succeeded in creating a new BSTR, move ownership of the new BSTR into string\n                string.reset(temp_bstr);\n                return S_OK;\n            }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n\n#if defined(__WIL_OBJBASE_H_)\n            inline void* get_buffer(const ::wil::unique_cotaskmem_string& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            constexpr DWORD get_buffer_size_bytes(const ::wil::unique_cotaskmem_string&) WI_NOEXCEPT\n            {\n                // wil::unique_cotaskmem_string does not intrinsically track its internal buffer size\n                // thus the caller must track the buffer size it requested to be allocated\n                return 0;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::unique_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::unique_cotaskmem_string& string, DWORD byteSize) WI_NOEXCEPT\n            {\n                // convert bytes to length (number of WCHAR's)\n                size_t length = byteSize / sizeof(wchar_t);\n                // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length\n                length = length > 0 ? length - 1 : length;\n                auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_cotaskmem_string>(string.get(), length);\n                RETURN_IF_NULL_ALLOC(new_string.get());\n\n                string = ::wistd::move(new_string);\n                return S_OK;\n            }\n\n            inline void* get_buffer(const ::wil::unique_cotaskmem_array_ptr<uint8_t>& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            inline DWORD get_buffer_size_bytes(const ::wil::unique_cotaskmem_array_ptr<uint8_t>& value) WI_NOEXCEPT\n            {\n                return static_cast<DWORD>(value.size());\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::unique_cotaskmem_array_ptr<uint8_t>>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::unique_cotaskmem_array_ptr<uint8_t>& arrayValue, DWORD byteSize) WI_NOEXCEPT\n            {\n                ::wil::unique_cotaskmem_array_ptr<uint8_t> tempValue;\n                *tempValue.addressof() = static_cast<uint8_t*>(::CoTaskMemAlloc(byteSize));\n                RETURN_IF_NULL_ALLOC(tempValue.get());\n                *tempValue.size_address() = byteSize;\n\n                const auto bytesToCopy = arrayValue.size() < byteSize ? arrayValue.size() : byteSize;\n                CopyMemory(tempValue.get(), arrayValue.get(), bytesToCopy);\n\n                arrayValue = ::wistd::move(tempValue);\n                return S_OK;\n            }\n#endif // #if defined(__WIL_OBJBASE_H_)\n\n#if defined(__WIL_OBJBASE_H_STL)\n            inline void* get_buffer(const ::wil::shared_cotaskmem_string& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            constexpr DWORD get_buffer_size_bytes(const ::wil::shared_cotaskmem_string&) WI_NOEXCEPT\n            {\n                // wil::shared_cotaskmem_string does not intrinsically track its internal buffer size\n                // thus the caller must track the buffer size it requested to be allocated\n                return 0;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::shared_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::shared_cotaskmem_string& string, DWORD byteSize) WI_NOEXCEPT\n            {\n                // convert bytes to length (number of WCHAR's)\n                size_t length = byteSize / sizeof(WCHAR);\n                // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length\n                length = length > 0 ? length - 1 : length;\n                auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_cotaskmem_string>(string.get(), length);\n                RETURN_IF_NULL_ALLOC(new_string.get());\n\n                string = ::wistd::move(new_string);\n                return S_OK;\n            }\n#endif // #if defined(__WIL_OBJBASE_H_STL)\n\n            inline void* get_buffer(const ::wil::unique_process_heap_string& value) WI_NOEXCEPT\n            {\n                return value.get();\n            }\n\n            constexpr DWORD get_buffer_size_bytes(const ::wil::unique_process_heap_string&) WI_NOEXCEPT\n            {\n                // wil::unique_process_heap_string does not intrinsically track its internal buffer size\n                // thus the caller must track the buffer size it requested to be allocated\n                return 0;\n            }\n\n            template <>\n            constexpr bool supports_resize_buffer_bytes<::wil::unique_process_heap_string>() WI_NOEXCEPT\n            {\n                return true;\n            }\n            inline HRESULT resize_buffer_bytes(::wil::unique_process_heap_string& string, DWORD byteSize) WI_NOEXCEPT\n            {\n                // convert bytes to length (number of WCHAR's)\n                size_t length = byteSize / sizeof(wchar_t);\n                // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length\n                length = length > 0 ? length - 1 : length;\n                auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_process_heap_string>(string.get(), length);\n                RETURN_IF_NULL_ALLOC(new_string.get());\n\n                string = ::wistd::move(new_string);\n                return S_OK;\n            }\n\n            // constexpr expressions to determining the get* and set* registry value types\n            // for all supported types T to read/write values\n            template <typename T>\n            DWORD get_value_type() WI_NOEXCEPT\n            {\n                static_assert(sizeof(T) != sizeof(T), \"Unsupported type for get_value_type\");\n            }\n\n            template <typename T>\n            DWORD set_value_type() WI_NOEXCEPT\n            {\n                static_assert(sizeof(T) != sizeof(T), \"Unsupported type for set_value_type\");\n            }\n\n            template <>\n            constexpr DWORD get_value_type<int32_t>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_DWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<int32_t>() WI_NOEXCEPT\n            {\n                return REG_DWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<uint32_t>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_DWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<uint32_t>() WI_NOEXCEPT\n            {\n                return REG_DWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<long>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_DWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<long>() WI_NOEXCEPT\n            {\n                return REG_DWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<unsigned long>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_DWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<unsigned long>() WI_NOEXCEPT\n            {\n                return REG_DWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<int64_t>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_QWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<int64_t>() WI_NOEXCEPT\n            {\n                return REG_QWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<uint64_t>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_QWORD);\n            }\n            template <>\n            constexpr DWORD set_value_type<uint64_t>() WI_NOEXCEPT\n            {\n                return REG_QWORD;\n            }\n\n            template <>\n            constexpr DWORD get_value_type<PCWSTR>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n            template <>\n            constexpr DWORD set_value_type<PCWSTR>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n            template <>\n            constexpr DWORD get_value_type<::std::wstring>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const ::std::wstring>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n#endif\n\n#if defined(__WIL_OLEAUTO_H_)\n            template <>\n            constexpr DWORD get_value_type<BSTR>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n            template <>\n            constexpr DWORD get_value_type<::wil::unique_bstr>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const BSTR>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const ::wil::unique_bstr>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n#endif // #if defined(__WIL_OLEAUTO_H_)\n\n#if defined(__WIL_OLEAUTO_H_STL)\n\n            template <>\n            constexpr DWORD get_value_type<::wil::shared_bstr>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const ::wil::shared_bstr>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n#endif // #if defined(__WIL_OLEAUTO_H_STL)\n\n#if defined(__WIL_OBJBASE_H_)\n            template <>\n            constexpr DWORD get_value_type<::wil::unique_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const ::wil::unique_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n#endif // defined(__WIL_OBJBASE_H_)\n\n#if defined(__WIL_OBJBASE_H_STL)\n            template <>\n            constexpr DWORD get_value_type<::wil::shared_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return get_value_flags_from_value_type(REG_SZ);\n            }\n\n            template <>\n            constexpr DWORD set_value_type<const ::wil::shared_cotaskmem_string>() WI_NOEXCEPT\n            {\n                return REG_SZ;\n            }\n#endif // #if defined(__WIL_OBJBASE_H_STL)\n        } // namespace reg_value_type_info\n\n        template <typename err_policy = ::wil::err_exception_policy>\n        class reg_view_t\n        {\n        public:\n            explicit reg_view_t(HKEY key) WI_NOEXCEPT : m_key(key)\n            {\n            }\n            ~reg_view_t() WI_NOEXCEPT = default;\n            reg_view_t(const reg_view_t&) = delete;\n            reg_view_t& operator=(const reg_view_t&) = delete;\n            reg_view_t(reg_view_t&&) = delete;\n            reg_view_t& operator=(reg_view_t&&) = delete;\n\n            typename err_policy::result open_key(\n                _In_opt_ _In_opt_ PCWSTR subKey, _Out_ HKEY* hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) const\n            {\n                constexpr DWORD zero_options{0};\n                return err_policy::HResult(\n                    HRESULT_FROM_WIN32(::RegOpenKeyExW(m_key, subKey, zero_options, get_access_flags(access), hkey)));\n            }\n\n            typename err_policy::result create_key(PCWSTR subKey, _Out_ HKEY* hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) const\n            {\n                *hkey = nullptr;\n\n                constexpr DWORD zero_reserved{0};\n                constexpr PWSTR null_class{nullptr};\n                constexpr DWORD zero_options{0};\n                constexpr SECURITY_ATTRIBUTES* null_security_attributes{nullptr};\n                DWORD disposition{0};\n                return err_policy::HResult(HRESULT_FROM_WIN32(::RegCreateKeyExW(\n                    m_key, subKey, zero_reserved, null_class, zero_options, get_access_flags(access), null_security_attributes, hkey, &disposition)));\n            }\n\n            typename err_policy::result delete_tree(_In_opt_ PCWSTR sub_key) const\n            {\n                auto hr = HRESULT_FROM_WIN32(::RegDeleteTreeW(m_key, sub_key));\n                if (::wil::reg::is_registry_not_found(hr))\n                {\n                    hr = S_OK;\n                }\n                return err_policy::HResult(hr);\n            }\n\n            typename err_policy::result delete_value(_In_opt_ PCWSTR value_name) const\n            {\n                return err_policy::HResult(HRESULT_FROM_WIN32(::RegDeleteValueW(m_key, value_name)));\n            }\n\n            template <typename R>\n            typename err_policy::result get_value(\n                _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, R& return_value, DWORD type = reg_value_type_info::get_value_type<R>()) const\n            {\n                return get_value_with_type(subkey, value_name, return_value, type);\n            }\n\n            // typename D supports unsigned 32-bit values; i.e. allows the caller to pass a DWORD* as well as uint32_t*\n            template <size_t Length, typename DwordType, wistd::enable_if_t<wistd::is_same_v<DwordType, uint32_t> || wistd::is_same_v<DwordType, unsigned long>>* = nullptr>\n            typename err_policy::result get_value_char_array(\n                _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR (&return_value)[Length], DWORD type, _Out_opt_ DwordType* requiredBytes) const\n            {\n                constexpr DwordType zero_value{0ul};\n                ::wil::assign_to_opt_param(requiredBytes, zero_value);\n                DWORD data_size_bytes{Length * sizeof(WCHAR)};\n                const auto hr = HRESULT_FROM_WIN32(::RegGetValueW(\n                    m_key, subkey, value_name, ::wil::reg::reg_view_details::get_value_flags_from_value_type(type), nullptr, return_value, &data_size_bytes));\n                if (SUCCEEDED(hr) || ::wil::reg::is_registry_buffer_too_small(hr))\n                {\n                    const DwordType updated_value{data_size_bytes};\n                    ::wil::assign_to_opt_param(requiredBytes, updated_value);\n                }\n                return err_policy::HResult(hr);\n            }\n\n#if (WIL_USE_STL && (__cpp_lib_optional >= 201606L)) || defined(WIL_DOXYGEN)\n            // intended for err_exception_policy as err_returncode_policy will not get an error code\n            template <typename R>\n            ::std::optional<R> try_get_value(\n                _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, DWORD type = reg_value_type_info::get_value_type<R>()) const\n            {\n                R value{};\n                const auto hr = get_value_with_type<R, ::wil::err_returncode_policy>(subkey, value_name, value, type);\n                if (SUCCEEDED(hr))\n                {\n                    return ::std::optional(::wistd::move(value));\n                }\n\n                if (::wil::reg::is_registry_not_found(hr))\n                {\n                    return ::std::nullopt;\n                }\n\n                // throw if exception policy\n                err_policy::HResult(hr);\n                return ::std::nullopt;\n            }\n#endif\n\n            template <typename R>\n            typename err_policy::result set_value(\n                _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const R& value, DWORD type = reg_value_type_info::set_value_type<R>()) const\n            {\n                return set_value_with_type(subkey, value_name, value, type);\n            }\n\n        private:\n            const HKEY m_key{};\n\n            template <typename R>\n            typename err_policy::result set_value_with_type(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const R& value, DWORD type) const\n            {\n                return err_policy::HResult(HRESULT_FROM_WIN32(::RegSetKeyValueW(\n                    m_key,\n                    subkey,\n                    value_name,\n                    type,\n                    static_cast<uint8_t*>(reg_value_type_info::get_buffer(value)),\n                    reg_value_type_info::get_buffer_size_bytes(value))));\n            }\n\n            template <typename R, typename get_value_with_type_policy = err_policy>\n            typename get_value_with_type_policy::result get_value_with_type(\n                _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, R& return_value, DWORD type = reg_value_type_info::get_value_type<R>()) const\n            {\n                if\n#if defined(__cpp_if_constexpr)\n                    constexpr\n#endif\n                    (reg_value_type_info::supports_prepare_buffer<R>())\n\n                {\n                    const auto prepare_buffer_hr = reg_value_type_info::prepare_buffer(return_value);\n                    if (FAILED(prepare_buffer_hr))\n                    {\n                        return get_value_with_type_policy::HResult(prepare_buffer_hr);\n                    }\n                }\n\n                // get_buffer_size_bytes should include the null terminator when used for strings.\n                DWORD bytes_allocated{reg_value_type_info::get_buffer_size_bytes(return_value)};\n                HRESULT get_value_hresult = S_OK;\n                for (;;)\n                {\n                    constexpr DWORD* null_type{nullptr};\n                    DWORD data_size_bytes{bytes_allocated};\n                    get_value_hresult = HRESULT_FROM_WIN32(::RegGetValueW(\n                        m_key,\n                        subkey,\n                        value_name,\n                        get_value_flags_from_value_type(type),\n                        null_type,\n                        reg_value_type_info::get_buffer(return_value),\n                        &data_size_bytes));\n\n                    // some return types we can grow as needed - e.g. when writing to a std::wstring\n                    // only compile and resize_buffer for those types that support dynamically growing the buffer\n                    if\n#if defined(__cpp_if_constexpr)\n                        constexpr\n#endif\n                        (reg_value_type_info::supports_resize_buffer_bytes<R>())\n                    {\n                        // Attempt to grow the buffer with the data_size_bytes returned from GetRegValueW\n                        // GetRegValueW will indicate the caller allocate the returned number of bytes in one of two cases:\n                        // 1. returns ERROR_MORE_DATA\n                        // 2. returns ERROR_SUCCESS when we gave it a nullptr for the out buffer\n                        const bool shouldReallocate =\n                            (::wil::reg::is_registry_buffer_too_small(get_value_hresult)) ||\n                            (SUCCEEDED(get_value_hresult) && (reg_value_type_info::get_buffer(return_value) == nullptr) &&\n                             (data_size_bytes > 0));\n                        if (shouldReallocate)\n                        {\n                            // verify if resize_buffer succeeded allocation\n                            const auto resize_buffer_hr = reg_value_type_info::resize_buffer_bytes(return_value, data_size_bytes);\n                            if (FAILED(resize_buffer_hr))\n                            {\n                                // if resize fails, return this error back to the caller\n                                return get_value_with_type_policy::HResult(resize_buffer_hr);\n                            }\n\n                            // if it resize succeeds, continue the for loop to try again\n                            bytes_allocated = data_size_bytes;\n                            continue;\n                        }\n\n                        // if the RegGetValueW call succeeded with a non-null [out] param,\n                        // and the type supports resize_buffer_bytes\n                        // and the bytes we allocated don't match data_size_bytes returned from RegGetValueW\n                        // resize the buffer to match what RegGetValueW returned\n                        if (SUCCEEDED(get_value_hresult))\n                        {\n                            const auto current_byte_size = reg_value_type_info::get_buffer_size_bytes(return_value);\n                            if (current_byte_size != data_size_bytes)\n                            {\n                                // verify if resize_buffer_bytes succeeded allocation\n                                const auto resize_buffer_hr = reg_value_type_info::resize_buffer_bytes(return_value, data_size_bytes);\n                                if (FAILED(resize_buffer_hr))\n                                {\n                                    // if resize fails, return this error back to the caller\n                                    return get_value_with_type_policy::HResult(resize_buffer_hr);\n                                }\n                            }\n                        }\n                    }\n\n                    // we don't need to reallocate and retry the call to RegGetValueW so breaking out of the loop\n                    break;\n                }\n\n                // some types (generally string types) require trimming its internal buffer after RegGetValueW successfully wrote into its buffer\n                if\n#if defined(__cpp_if_constexpr)\n                    constexpr\n#endif\n                    (reg_value_type_info::supports_trim_buffer<R>())\n\n                {\n                    if (SUCCEEDED(get_value_hresult))\n                    {\n                        reg_value_type_info::trim_buffer(return_value);\n                    }\n                }\n\n                return get_value_with_type_policy::HResult(get_value_hresult);\n            }\n        };\n\n        using reg_view_nothrow = ::wil::reg::reg_view_details::reg_view_t<::wil::err_returncode_policy>;\n#if defined(WIL_ENABLE_EXCEPTIONS)\n        using reg_view = ::wil::reg::reg_view_details::reg_view_t<::wil::err_exception_policy>;\n#endif // #if defined(WIL_ENABLE_EXCEPTIONS)\n    } // namespace reg_view_details\n      /// @endcond\n\n    /// @cond\n    namespace reg_iterator_details\n    {\n        constexpr uint32_t iterator_end_offset = 0xffffffff;\n        constexpr size_t iterator_default_buffer_length = 32;\n        constexpr size_t iterator_max_keyname_length = 255;\n        constexpr size_t iterator_max_valuename_length = 16383;\n\n        // function overloads to allow *_enumerator objects to be constructed from all 3 types of HKEY representatives\n        inline HKEY get_hkey(HKEY h) WI_NOEXCEPT\n        {\n            return h;\n        }\n        inline HKEY get_hkey(const ::wil::unique_hkey& h) WI_NOEXCEPT\n        {\n            return h.get();\n        }\n#if defined(__WIL_WINREG_STL)\n        inline HKEY get_hkey(const ::wil::shared_hkey& h) WI_NOEXCEPT\n        {\n            return h.get();\n        }\n#endif // #if defined(__WIL_WINREG_STL)\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n        // overloads for some of the below string functions - specific for std::wstring\n        // these overloads must be declared before the template functions below, as some of those template functions\n        // reference these overload functions\n        inline void clear_name(::std::wstring& name, size_t) WI_NOEXCEPT\n        {\n            name.assign(name.size(), L'\\0');\n        }\n        inline ::std::wstring copy_name(const ::std::wstring& str, size_t length) WI_NOEXCEPT\n        {\n            try\n            {\n                // guarantee that the copied string has the specified internal length\n                // i.e., the same length assumptions hold when the string is copied\n                ::std::wstring tempString(length, L'0');\n                tempString.assign(str);\n                return tempString;\n            }\n            catch (...)\n            {\n                return {};\n            }\n        }\n        inline bool can_derive_length(const ::std::wstring& name) WI_NOEXCEPT\n        {\n            return !name.empty();\n        }\n#endif\n\n        // string manipulation functions needed for iterator functions\n        template <typename T>\n        PWSTR address_of_name(const T& name) WI_NOEXCEPT\n        {\n            return static_cast<PWSTR>(::wil::reg::reg_view_details::reg_value_type_info::get_buffer(name));\n        }\n\n        template <typename T>\n        bool can_derive_length(const T& name) WI_NOEXCEPT\n        {\n            return static_cast<bool>(address_of_name(name));\n        }\n\n        template <typename T>\n        bool compare_name(const T& name, PCWSTR comparand) WI_NOEXCEPT\n        {\n            if (!can_derive_length(name) || !comparand)\n            {\n                return false;\n            }\n            return 0 == wcscmp(address_of_name(name), comparand);\n        }\n\n        template <typename T>\n        void clear_name(const T& name, size_t length) WI_NOEXCEPT\n        {\n            if (can_derive_length(name) && length > 0)\n            {\n                memset(address_of_name(name), 0, length * sizeof(wchar_t));\n            }\n        }\n\n        // failure returns zero\n        template <typename T>\n        size_t resize_name_cch(T& name, size_t current_length, size_t new_length) WI_NOEXCEPT\n        {\n            if (new_length > current_length)\n            {\n                if (FAILED(::wil::reg::reg_view_details::reg_value_type_info::resize_buffer_bytes(\n                        name, static_cast<DWORD>(new_length * sizeof(wchar_t)))))\n                {\n                    return 0;\n                }\n                current_length = new_length;\n                // fall through to clear the newly allocated buffer\n                // and return the new length\n            }\n\n            // continue to use the existing buffer since the requested length is less than or equals to the current length\n            clear_name(name, current_length);\n            return current_length;\n        }\n\n        template <typename T>\n        T copy_name(const T& name, size_t length) WI_NOEXCEPT\n        {\n            if (!can_derive_length(name))\n            {\n                return {};\n            }\n            return ::wil::make_unique_string_nothrow<T>(address_of_name(name), length);\n        }\n\n#if defined(__WIL_OLEAUTO_H_)\n        inline ::wil::unique_bstr copy_name(const ::wil::unique_bstr& name, size_t length) WI_NOEXCEPT\n        {\n            if (!can_derive_length(name))\n            {\n                return {};\n            }\n\n            // SysAllocStringLen adds a null, so subtract a wchar_t from the input length\n            length = length > 0 ? length - 1 : length;\n            return ::wil::unique_bstr{::SysAllocStringLen(name.get(), static_cast<UINT>(length))};\n        }\n#endif // #if defined(__WIL_OLEAUTO_H_)\n    } // namespace reg_iterator_details\n      /// @endcond\n\n    // forward declaration to allow friend-ing the template iterator class\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    template <typename T>\n    class iterator_t;\n#endif\n    template <typename T>\n    class iterator_nothrow_t;\n\n    // all methods must be noexcept - to be usable with any iterator type (throwing or non-throwing)\n    template <typename T>\n    class key_iterator_data\n    {\n    public:\n        T name{};\n\n        key_iterator_data(HKEY key = nullptr) WI_NOEXCEPT : m_hkey{key}\n        {\n        }\n        ~key_iterator_data() WI_NOEXCEPT = default;\n\n        key_iterator_data(const key_iterator_data& rhs) WI_NOEXCEPT\n        {\n            // might return null/empty string on failure\n            name = ::wil::reg::reg_iterator_details::copy_name(rhs.name, rhs.m_name_length);\n            m_hkey = rhs.m_hkey;\n            m_index = rhs.m_index;\n            m_name_length = ::wil::reg::reg_iterator_details::can_derive_length(name) ? rhs.m_name_length : 0;\n        }\n        key_iterator_data& operator=(const key_iterator_data& rhs) WI_NOEXCEPT\n        {\n            if (&rhs != this)\n            {\n                key_iterator_data temp(rhs);\n                *this = ::wistd::move(temp);\n            }\n            return *this;\n        }\n\n        key_iterator_data(key_iterator_data&& rhs) WI_NOEXCEPT : name{wistd::move(rhs.name)},\n                                                                 m_hkey{wistd::move(rhs.m_hkey)},\n                                                                 m_index{wistd::move(rhs.m_index)},\n                                                                 m_name_length{wistd::move(rhs.m_name_length)}\n        {\n            // once name is moved, we must reset m_name_length as name is now empty\n            rhs.m_name_length = 0;\n        }\n        key_iterator_data& operator=(key_iterator_data&& rhs) WI_NOEXCEPT\n        {\n            if (&rhs != this)\n            {\n                name = ::wistd::move(rhs.name);\n                m_hkey = ::wistd::move(rhs.m_hkey);\n                m_index = ::wistd::move(rhs.m_index);\n                m_name_length = ::wistd::move(rhs.m_name_length);\n                // once name is moved, we must reset m_name_length as name is now empty\n                rhs.m_name_length = 0;\n            }\n            return *this;\n        }\n\n        // Case-sensitive comparison\n        bool operator==(PCWSTR comparand) const WI_NOEXCEPT\n        {\n            return ::wil::reg::reg_iterator_details::compare_name(name, comparand);\n        }\n\n    private:\n#if defined(WIL_ENABLE_EXCEPTIONS)\n        friend class ::wil::reg::iterator_t<key_iterator_data>;\n#endif\n        friend class ::wil::reg::iterator_nothrow_t<key_iterator_data>;\n\n        bool at_end() const WI_NOEXCEPT\n        {\n            return m_index == ::wil::reg::reg_iterator_details::iterator_end_offset;\n        }\n\n        void make_end_iterator() WI_NOEXCEPT\n        {\n            ::wil::reg::reg_iterator_details::clear_name(name, m_name_length);\n            m_index = ::wil::reg::reg_iterator_details::iterator_end_offset;\n        }\n\n        bool resize(size_t new_length) WI_NOEXCEPT\n        {\n            // if resize fails, will return 0\n            m_name_length = ::wil::reg::reg_iterator_details::resize_name_cch(name, m_name_length, new_length);\n            return m_name_length > 0;\n        }\n\n        HRESULT enumerate_current_index() WI_NOEXCEPT\n        {\n            FAIL_FAST_IF(at_end());\n\n            auto string_length = static_cast<DWORD>(m_name_length) > 0\n                                     ? static_cast<DWORD>(m_name_length)\n                                     : static_cast<DWORD>(::wil::reg::reg_iterator_details::iterator_default_buffer_length);\n            for (;;)\n            {\n                if (!resize(string_length))\n                {\n                    RETURN_HR(E_OUTOFMEMORY);\n                }\n\n                const auto error = ::RegEnumKeyExW(\n                    m_hkey,                                                                                 // hKey\n                    m_index,                                                                                // dwIndex\n                    string_length == 0 ? nullptr : ::wil::reg::reg_iterator_details::address_of_name(name), // lpName\n                    &string_length,                                                                         // lpcchName\n                    nullptr,                                                                                // lpReserved\n                    nullptr,                                                                                // lpClass\n                    nullptr,                                                                                // lpcchClass\n                    nullptr);                                                                               // lpftLastWriteTime\n\n                if (error == ERROR_SUCCESS)\n                {\n                    // string_length returned from RegEnumKeyExW does not include the null terminator\n                    ++string_length;\n                    // if the string type supports resize, we must resize it to the returned string size\n                    // to ensure continuity of the string type with the actual string size\n                    if (::wil::reg::reg_view_details::reg_value_type_info::supports_resize_buffer_bytes<T>())\n                    {\n                        RETURN_IF_FAILED(::wil::reg::reg_view_details::reg_value_type_info::resize_buffer_bytes(\n                            name, string_length * sizeof(WCHAR)));\n                        m_name_length = string_length;\n                    }\n                    if (::wil::reg::reg_view_details::reg_value_type_info::supports_trim_buffer<T>())\n                    {\n                        m_name_length = ::wil::reg::reg_view_details::reg_value_type_info::trim_buffer(name);\n                    }\n                    break;\n                }\n                if (error == ERROR_NO_MORE_ITEMS)\n                {\n                    make_end_iterator();\n                    break;\n                }\n                if (error == ERROR_MORE_DATA)\n                {\n                    // if our default wasn't big enough, resize to either half max or max length and try again\n                    if (string_length < reg_iterator_details::iterator_max_keyname_length / 2)\n                    {\n                        string_length = reg_iterator_details::iterator_max_keyname_length / 2;\n                    }\n                    else if (string_length < reg_iterator_details::iterator_max_keyname_length + 1)\n                    {\n                        string_length = reg_iterator_details::iterator_max_keyname_length + 1; // plus one for null\n                    }\n                    else\n                    {\n                        // if we're already at max length, we can't grow anymore, so we'll just return the error\n                        break;\n                    }\n                    continue;\n                }\n                // any other error will fail\n                RETURN_WIN32(error);\n            }\n            return S_OK;\n        }\n\n        HKEY m_hkey{};\n        uint32_t m_index = ::wil::reg::reg_iterator_details::iterator_end_offset;\n        size_t m_name_length{};\n    };\n\n    // all methods must be noexcept - to be usable with any iterator type (throwing or non-throwing)\n    template <typename T>\n    class value_iterator_data\n    {\n    public:\n        T name{};\n        DWORD type = REG_NONE;\n\n        value_iterator_data(HKEY key = nullptr) WI_NOEXCEPT : m_hkey{key}\n        {\n        }\n        ~value_iterator_data() WI_NOEXCEPT = default;\n\n        value_iterator_data(const value_iterator_data& rhs) WI_NOEXCEPT\n        {\n            // might return null/empty string on failure\n            name = ::wil::reg::reg_iterator_details::copy_name(rhs.name, rhs.m_name_length);\n            type = rhs.type;\n            m_hkey = rhs.m_hkey;\n            m_index = rhs.m_index;\n            m_name_length = ::wil::reg::reg_iterator_details::can_derive_length(name) ? rhs.m_name_length : 0;\n        }\n        value_iterator_data& operator=(const value_iterator_data& rhs) WI_NOEXCEPT\n        {\n            if (&rhs != this)\n            {\n                value_iterator_data temp(rhs);\n                *this = ::wistd::move(temp);\n            }\n            return *this;\n        }\n\n        value_iterator_data(value_iterator_data&&) WI_NOEXCEPT = default;\n        value_iterator_data& operator=(value_iterator_data&& rhs) WI_NOEXCEPT = default;\n\n        bool at_end() const WI_NOEXCEPT\n        {\n            return m_index == ::wil::reg::reg_iterator_details::iterator_end_offset;\n        }\n\n    private:\n#if defined(WIL_ENABLE_EXCEPTIONS)\n        friend class ::wil::reg::iterator_t<value_iterator_data>;\n#endif\n        friend class ::wil::reg::iterator_nothrow_t<value_iterator_data>;\n\n        void make_end_iterator() WI_NOEXCEPT\n        {\n            ::wil::reg::reg_iterator_details::clear_name(name, m_name_length);\n            m_index = ::wil::reg::reg_iterator_details::iterator_end_offset;\n        }\n\n        bool resize(size_t new_length)\n        {\n            // if resize fails, will return 0\n            m_name_length = ::wil::reg::reg_iterator_details::resize_name_cch(name, m_name_length, new_length);\n            return m_name_length > 0;\n        }\n\n        HRESULT enumerate_current_index() WI_NOEXCEPT\n        {\n            FAIL_FAST_IF(at_end());\n\n            auto string_length = static_cast<DWORD>(m_name_length) > 0\n                                     ? static_cast<DWORD>(m_name_length)\n                                     : static_cast<DWORD>(::wil::reg::reg_iterator_details::iterator_default_buffer_length);\n            for (;;)\n            {\n                if (!resize(string_length))\n                {\n                    RETURN_HR(E_OUTOFMEMORY);\n                }\n\n                const auto error = ::RegEnumValueW(\n                    m_hkey,                                                                                 // hKey\n                    m_index,                                                                                // dwIndex\n                    string_length == 0 ? nullptr : ::wil::reg::reg_iterator_details::address_of_name(name), // lpValueName\n                    &string_length,                                                                         // lpcchValueName\n                    nullptr,                                                                                // lpReserved\n                    &type,                                                                                  // lpType\n                    nullptr,                                                                                // lpData\n                    nullptr);                                                                               // lpcbData\n\n                if (error == ERROR_SUCCESS)\n                {\n                    // string_length returned from RegEnumValueW does not include the null terminator\n                    ++string_length;\n                    // if the string type supports resize, we must resize it to the returned string size\n                    // to ensure continuity of the string type with the actual string size\n                    if (::wil::reg::reg_view_details::reg_value_type_info::supports_resize_buffer_bytes<T>())\n                    {\n                        RETURN_IF_FAILED(::wil::reg::reg_view_details::reg_value_type_info::resize_buffer_bytes(\n                            name, string_length * sizeof(WCHAR)));\n                        m_name_length = string_length;\n                    }\n                    if (::wil::reg::reg_view_details::reg_value_type_info::supports_trim_buffer<T>())\n                    {\n                        m_name_length = ::wil::reg::reg_view_details::reg_value_type_info::trim_buffer(name);\n                    }\n                    break;\n                }\n                if (error == ERROR_NO_MORE_ITEMS)\n                {\n                    make_end_iterator();\n                    break;\n                }\n                if (error == ERROR_MORE_DATA)\n                {\n                    if (string_length == ::wil::reg::reg_iterator_details::iterator_max_valuename_length + 1)\n                    {\n                        // this is the max size, so we can't grow anymore, so we'll just return the error\n                        break;\n                    }\n\n                    // resize and try again - growing exponentially up to the max\n                    string_length *= 2;\n                    if (string_length > ::wil::reg::reg_iterator_details::iterator_max_valuename_length + 1)\n                    {\n                        string_length = ::wil::reg::reg_iterator_details::iterator_max_valuename_length + 1;\n                    }\n                    continue;\n                }\n\n                // any other error will fail\n                RETURN_WIN32(error);\n            }\n            return S_OK;\n        }\n\n        HKEY m_hkey{};\n        uint32_t m_index = ::wil::reg::reg_iterator_details::iterator_end_offset;\n        size_t m_name_length{};\n    };\n\n#if defined(WIL_ENABLE_EXCEPTIONS)\n    template <typename T>\n    class iterator_t\n    {\n    public:\n        // defining iterator_traits allows STL <algorithm> functions to be used with this iterator class.\n        // Notice this is a forward_iterator\n        // - does not support random-access (e.g. vector::iterator)\n        // - does not support bidirectional access (e.g. list::iterator)\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n        using iterator_category = ::std::forward_iterator_tag;\n#endif\n        using value_type = T;\n        using difference_type = size_t;\n        using distance_type = size_t;\n        using pointer = T*;\n        using reference = T&;\n\n        iterator_t() WI_NOEXCEPT = default;\n        ~iterator_t() WI_NOEXCEPT = default;\n\n        iterator_t(HKEY hkey) : m_data(hkey)\n        {\n            if (hkey != nullptr)\n            {\n                m_data.m_index = 0;\n                THROW_IF_FAILED(m_data.enumerate_current_index());\n            }\n        }\n\n        iterator_t(const iterator_t&) = default;\n        iterator_t& operator=(const iterator_t&) = default;\n        iterator_t(iterator_t&&) WI_NOEXCEPT = default;\n        iterator_t& operator=(iterator_t&&) WI_NOEXCEPT = default;\n\n        // operator support\n        const T& operator*() const\n        {\n            FAIL_FAST_IF(m_data.at_end());\n            return m_data;\n        }\n        const T& operator*()\n        {\n            FAIL_FAST_IF(m_data.at_end());\n            return m_data;\n        }\n        const T* operator->() const\n        {\n            FAIL_FAST_IF(m_data.at_end());\n            return &m_data;\n        }\n        const T* operator->()\n        {\n            FAIL_FAST_IF(m_data.at_end());\n            return &m_data;\n        }\n\n        bool operator==(const iterator_t& rhs) const WI_NOEXCEPT\n        {\n            if (m_data.at_end() || rhs.m_data.at_end())\n            {\n                // if either is not initialized (or end), both must not be initialized (or end) to be equal\n                return m_data.m_index == rhs.m_data.m_index;\n            }\n            return m_data.m_hkey == rhs.m_data.m_hkey && m_data.m_index == rhs.m_data.m_index;\n        }\n\n        bool operator!=(const iterator_t& rhs) const WI_NOEXCEPT\n        {\n            return !(*this == rhs);\n        }\n\n        // pre-increment\n        iterator_t& operator++()\n        {\n            this->operator+=(1);\n            return *this;\n        }\n        const iterator_t& operator++() const\n        {\n            this->operator+=(1);\n            return *this;\n        }\n\n        // increment by integer\n        iterator_t& operator+=(size_t offset)\n        {\n            uint32_t newIndex = m_data.m_index + static_cast<uint32_t>(offset);\n            if (newIndex < m_data.m_index)\n            {\n                // fail on integer overflow\n                THROW_HR(E_INVALIDARG);\n            }\n            if (newIndex == ::wil::reg::reg_iterator_details::iterator_end_offset)\n            {\n                // fail if this creates an end iterator\n                THROW_HR(E_INVALIDARG);\n            }\n\n            // iterate by the integer offset\n            for (size_t count = 0; count < offset; ++count)\n            {\n                ++m_data.m_index;\n                THROW_IF_FAILED(m_data.enumerate_current_index());\n            }\n            return *this;\n        }\n\n        // not supporting post-increment - which would require copy-construction\n        iterator_t operator++(int) = delete;\n\n    private:\n        // container based on the class template type\n        T m_data{};\n    };\n#endif\n\n    template <typename T>\n    class iterator_nothrow_t\n    {\n    public:\n        iterator_nothrow_t() WI_NOEXCEPT = default;\n        ~iterator_nothrow_t() WI_NOEXCEPT = default;\n\n        iterator_nothrow_t(HKEY hkey) WI_NOEXCEPT : m_data(hkey)\n        {\n            if (hkey != nullptr)\n            {\n                m_data.m_index = 0;\n                m_last_error = m_data.enumerate_current_index();\n            }\n        }\n\n        iterator_nothrow_t(const iterator_nothrow_t&) WI_NOEXCEPT = default;\n        iterator_nothrow_t& operator=(const iterator_nothrow_t&) WI_NOEXCEPT = default;\n        iterator_nothrow_t(iterator_nothrow_t&&) WI_NOEXCEPT = default;\n        iterator_nothrow_t& operator=(iterator_nothrow_t&&) WI_NOEXCEPT = default;\n\n        bool at_end() const WI_NOEXCEPT\n        {\n            return m_data.at_end();\n        }\n\n        HRESULT last_error() const WI_NOEXCEPT\n        {\n            return m_last_error;\n        }\n\n        HRESULT move_next() WI_NOEXCEPT\n        {\n            const auto newIndex = m_data.m_index + 1;\n            if (newIndex < m_data.m_index)\n            {\n                // fail on integer overflow\n                m_last_error = E_INVALIDARG;\n            }\n            else if (newIndex == ::wil::reg::reg_iterator_details::iterator_end_offset)\n            {\n                // fail if this creates an end iterator\n                m_last_error = E_INVALIDARG;\n            }\n            else\n            {\n                m_data.m_index = newIndex;\n                m_last_error = m_data.enumerate_current_index();\n            }\n\n            if (FAILED(m_last_error))\n            {\n                // on failure, set the iterator to an end iterator\n                m_data.make_end_iterator();\n            }\n\n            return m_last_error;\n        }\n\n        // operator support\n        const T& operator*() const WI_NOEXCEPT\n        {\n            return m_data;\n        }\n        const T& operator*() WI_NOEXCEPT\n        {\n            return m_data;\n        }\n        const T* operator->() const WI_NOEXCEPT\n        {\n            return &m_data;\n        }\n        const T* operator->() WI_NOEXCEPT\n        {\n            return &m_data;\n        }\n        bool operator==(const iterator_nothrow_t& rhs) const WI_NOEXCEPT\n        {\n            if (m_data.at_end() || rhs.m_data.at_end())\n            {\n                // if either is not initialized (or end), both must not be initialized (or end) to be equal\n                return m_data.m_index == rhs.m_data.m_index;\n            }\n            return m_data.m_hkey == rhs.m_data.m_hkey && m_data.m_index == rhs.m_data.m_index;\n        }\n\n        bool operator!=(const iterator_nothrow_t& rhs) const WI_NOEXCEPT\n        {\n            return !(*this == rhs);\n        }\n\n        iterator_nothrow_t& operator++() WI_NOEXCEPT\n        {\n            move_next();\n            return *this;\n        }\n        const iterator_nothrow_t& operator++() const WI_NOEXCEPT\n        {\n            move_next();\n            return *this;\n        }\n\n    private:\n        // container based on the class template type\n        T m_data{};\n        HRESULT m_last_error{};\n    };\n\n} // namespace reg\n} // namespace wil\n#endif // __WIL_REGISTRY_HELPERS_INCLUDED"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/resource.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Resource Wrappers (RAII): Provides a family of smart pointer patterns and resource wrappers to enable customers to\n//! consistently use RAII in all code.\n\n#include \"result_macros.h\"\n#include \"wistd_functional.h\"\n#include \"wistd_memory.h\"\n\n#if WIL_USE_STL\n#include <iterator>\n#endif\n\n#pragma warning(push)\n#pragma warning(disable : 26135 26110) // Missing locking annotation, Caller failing to hold lock\n#pragma warning(disable : 4714)        // __forceinline not honored\n\n#ifndef __WIL_RESOURCE\n#define __WIL_RESOURCE\n\n/// @cond\n// stdint.h and intsafe.h have conflicting definitions, so it's not safe to include either to pick up our dependencies,\n// so the definitions we need are copied below\n#ifdef _WIN64\n#define __WI_SIZE_MAX 0xffffffffffffffffULL // UINT64_MAX\n#else                                       /* _WIN64 */\n#define __WI_SIZE_MAX 0xffffffffUL          // UINT32_MAX\n#endif                                      /* _WIN64 */\n/// @endcond\n\n// Forward declaration\n/// @cond\nnamespace Microsoft\n{\nnamespace WRL\n{\n    template <typename T>\n    class ComPtr;\n}\n} // namespace Microsoft\n/// @endcond\n\nnamespace wil\n{\n//! This type copies the current value of GetLastError at construction and resets the last error\n//! to that value when it is destroyed.\n//!\n//! This is useful in library code that runs during a value's destructor. If the library code could\n//! inadvertently change the value of GetLastError (by calling a Win32 API or similar), it should\n//! instantiate a value of this type before calling the library function in order to preserve the\n//! GetLastError value the user would expect.\n//!\n//! This construct exists to hide kernel mode/user mode differences in wil library code.\n//!\n//! Example usage:\n//!\n//!     if (!CreateFile(...))\n//!     {\n//!         auto lastError = wil::last_error_context();\n//!         WriteFile(g_hlog, logdata);\n//!     }\n//!\nclass last_error_context\n{\n#ifndef WIL_KERNEL_MODE\n    bool m_dismissed = false;\n    DWORD m_error = 0;\n\npublic:\n    last_error_context() WI_NOEXCEPT : last_error_context(::GetLastError())\n    {\n    }\n\n    explicit last_error_context(DWORD error) WI_NOEXCEPT : m_error(error)\n    {\n    }\n\n    last_error_context(last_error_context&& other) WI_NOEXCEPT\n    {\n        operator=(wistd::move(other));\n    }\n\n    last_error_context& operator=(last_error_context&& other) WI_NOEXCEPT\n    {\n        m_dismissed = wistd::exchange(other.m_dismissed, true);\n        m_error = other.m_error;\n\n        return *this;\n    }\n\n    ~last_error_context() WI_NOEXCEPT\n    {\n        if (!m_dismissed)\n        {\n            ::SetLastError(m_error);\n        }\n    }\n\n    //! last_error_context doesn't own a concrete resource, so therefore\n    //! it just disarms its destructor and returns void.\n    void release() WI_NOEXCEPT\n    {\n        WI_ASSERT(!m_dismissed);\n        m_dismissed = true;\n    }\n\n    WI_NODISCARD auto value() const WI_NOEXCEPT\n    {\n        return m_error;\n    }\n#else\npublic:\n    void release() WI_NOEXCEPT\n    {\n    }\n#endif // WIL_KERNEL_MODE\n};\n\n/// @cond\nnamespace details\n{\n    typedef wistd::integral_constant<size_t, 0> pointer_access_all;       // get(), release(), addressof(), and '&' are available\n    typedef wistd::integral_constant<size_t, 1> pointer_access_noaddress; // get() and release() are available\n    typedef wistd::integral_constant<size_t, 2> pointer_access_none;      // the raw pointer is not available\n\n    template <bool is_fn_ptr, typename close_fn_t, close_fn_t close_fn, typename pointer_storage_t>\n    struct close_invoke_helper\n    {\n        __forceinline static void close(pointer_storage_t value) WI_NOEXCEPT\n        {\n            wistd::invoke(close_fn, value);\n        }\n        inline static void close_reset(pointer_storage_t value) WI_NOEXCEPT\n        {\n            auto preserveError = last_error_context();\n            wistd::invoke(close_fn, value);\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn, typename pointer_storage_t>\n    struct close_invoke_helper<true, close_fn_t, close_fn, pointer_storage_t>\n    {\n        __forceinline static void close(pointer_storage_t value) WI_NOEXCEPT\n        {\n            close_fn(value);\n        }\n        inline static void close_reset(pointer_storage_t value) WI_NOEXCEPT\n        {\n            auto preserveError = last_error_context();\n            close_fn(value);\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn, typename pointer_storage_t>\n    using close_invoker =\n        close_invoke_helper<wistd::is_pointer_v<close_fn_t> ? wistd::is_function_v<wistd::remove_pointer_t<close_fn_t>> : false, close_fn_t, close_fn, pointer_storage_t>;\n\n    template <\n        typename pointer_t,                             // The handle type\n        typename close_fn_t,                            // The handle close function type\n        close_fn_t close_fn,                            //      * and function pointer\n        typename pointer_access_t = pointer_access_all, // all, noaddress or none to control pointer method access\n        typename pointer_storage_t = pointer_t, // The type used to store the handle (usually the same as the handle itself)\n        typename invalid_t = pointer_t,         // The invalid handle value type\n        invalid_t invalid = invalid_t{},        //      * and its value (default ZERO value)\n        typename pointer_invalid_t = wistd::nullptr_t> // nullptr_t if the invalid handle value is compatible with nullptr, otherwise pointer\n    struct resource_policy : close_invoker<close_fn_t, close_fn, pointer_storage_t>\n    {\n        typedef pointer_storage_t pointer_storage;\n        typedef pointer_t pointer;\n        typedef pointer_invalid_t pointer_invalid;\n        typedef pointer_access_t pointer_access;\n        __forceinline static pointer_storage invalid_value()\n        {\n            return (pointer)invalid;\n        }\n        __forceinline static bool is_valid(pointer_storage value) WI_NOEXCEPT\n        {\n            return (static_cast<pointer>(value) != (pointer)invalid);\n        }\n    };\n\n    // This class provides the pointer storage behind the implementation of unique_any_t utilizing the given\n    // resource_policy.  It is separate from unique_any_t to allow a type-specific specialization class to plug\n    // into the inheritance chain between unique_any_t and unique_storage.  This allows classes like unique_event\n    // to be a unique_any formed class, but also expose methods like SetEvent directly.\n\n    template <typename Policy>\n    class unique_storage\n    {\n    protected:\n        typedef Policy policy;\n        typedef typename policy::pointer_storage pointer_storage;\n        typedef typename policy::pointer pointer;\n        typedef unique_storage<policy> base_storage;\n\n    public:\n        unique_storage() WI_NOEXCEPT : m_ptr(policy::invalid_value())\n        {\n        }\n\n        explicit unique_storage(pointer_storage ptr) WI_NOEXCEPT : m_ptr(ptr)\n        {\n        }\n\n        unique_storage(unique_storage&& other) WI_NOEXCEPT : m_ptr(wistd::move(other.m_ptr))\n        {\n            other.m_ptr = policy::invalid_value();\n        }\n\n        ~unique_storage() WI_NOEXCEPT\n        {\n            if (policy::is_valid(m_ptr))\n            {\n                policy::close(m_ptr);\n            }\n        }\n\n        WI_NODISCARD bool is_valid() const WI_NOEXCEPT\n        {\n            return policy::is_valid(m_ptr);\n        }\n\n        void reset(pointer_storage ptr = policy::invalid_value()) WI_NOEXCEPT\n        {\n            if (policy::is_valid(m_ptr))\n            {\n                policy::close_reset(m_ptr);\n            }\n            m_ptr = ptr;\n        }\n\n        void reset(wistd::nullptr_t) WI_NOEXCEPT\n        {\n            static_assert(\n                wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n                \"reset(nullptr): valid only for handle types using nullptr as the invalid value\");\n            reset();\n        }\n\n        WI_NODISCARD pointer get() const WI_NOEXCEPT\n        {\n            return static_cast<pointer>(m_ptr);\n        }\n\n        pointer_storage release() WI_NOEXCEPT\n        {\n            static_assert(\n                !wistd::is_same<typename policy::pointer_access, pointer_access_none>::value,\n                \"release(): the raw handle value is not available for this resource class\");\n            auto ptr = m_ptr;\n            m_ptr = policy::invalid_value();\n            return ptr;\n        }\n\n        pointer_storage* addressof() WI_NOEXCEPT\n        {\n            static_assert(\n                wistd::is_same<typename policy::pointer_access, pointer_access_all>::value,\n                \"addressof(): the address of the raw handle is not available for this resource class\");\n            return &m_ptr;\n        }\n\n    protected:\n        void replace(unique_storage&& other) WI_NOEXCEPT\n        {\n            reset(other.m_ptr);\n            other.m_ptr = policy::invalid_value();\n        }\n\n    private:\n        pointer_storage m_ptr;\n    };\n\n    // Determines if it is safe to deallocate a resource without destructing the object\n    template <typename T>\n    struct needs_destruction\n    {\n        template <typename U>\n        static auto invoke(int) -> wistd::bool_constant<sizeof(U) >= 0>; // Always true, but SFINAE's if incomplete type\n        template <typename U>\n        static auto invoke(float) -> wistd::false_type;\n\n        // A type needs destruction if:\n        //      1.  It is a complete type,\n        //      2.  It can be destructed, and\n        //      3.  It's not trivially destructible\n        // Note that we need the \"complete type\" check because some places use an undefined struct as a type-safe\n        // resource type (e.g. 'typedef struct tagSERIALIZEDPROPSTORAGE SERIALIZEDPROPSTORAGE')\n        static constexpr const bool value = wistd::conjunction_v<\n            decltype(invoke<wistd::remove_extent_t<T>>(0)),\n            wistd::is_destructible<wistd::remove_extent_t<T>>,\n            wistd::negation<wistd::is_trivially_destructible<wistd::remove_extent_t<T>>>>;\n    };\n\n    template <typename T>\n    constexpr bool needs_destruction_v = needs_destruction<T>::value;\n\n    // A pass-through type that statically asserts that the specified type does not need destruction. Useful when\n    // specifying template arguments for various unique_* types where the destructor won't run\n    template <typename T>\n    struct ensure_trivially_destructible\n    {\n        // NOTE: Temporary opt-out for existing code that uses these types incorrectly\n#ifndef WIL_DISABLE_UNIQUE_PTR_DESTRUCTOR_CHECKS\n        // If this static_assert fires, it means you've used a type that is not trivially destructible as a template\n        // argument to a wil::unique* type that will not invoke that object's destructor\n        static_assert(!needs_destruction_v<T>, \"Resource type has a non-trivial destructor, but is used in a context where its destructor will not be run\");\n#endif\n        using type = T;\n    };\n\n    template <typename T>\n    using ensure_trivially_destructible_t = typename ensure_trivially_destructible<T>::type;\n} // namespace details\n/// @endcond\n\n// This class when paired with unique_storage and an optional type-specific specialization class implements\n// the same interface as STL's unique_ptr<> for resource handle types.  It is a non-copyable, yet movable class\n// supporting attach (reset), detach (release), retrieval (get()).\n\ntemplate <typename storage_t>\nclass unique_any_t : public storage_t\n{\npublic:\n    typedef typename storage_t::policy policy;\n    typedef typename policy::pointer_storage pointer_storage;\n    typedef typename policy::pointer pointer;\n\n    unique_any_t(unique_any_t const&) = delete;\n    unique_any_t& operator=(unique_any_t const&) = delete;\n\n    // Note that the default constructor really shouldn't be needed (taken care of by the forwarding constructor below), but\n    // the forwarding constructor causes an internal compiler error when the class is used in a C++ array.  Defining the default\n    // constructor independent of the forwarding constructor removes the compiler limitation.\n    unique_any_t() = default;\n\n    // forwarding constructor: forwards all 'explicit' and multi-arg constructors to the base class\n    template <typename arg1, typename... args_t>\n    explicit unique_any_t(arg1&& first, args_t&&... args)\n        __WI_NOEXCEPT_((wistd::is_nothrow_constructible_v<storage_t, arg1, args_t...>)) :\n        storage_t(wistd::forward<arg1>(first), wistd::forward<args_t>(args)...)\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_access, details::pointer_access_none>::value ||\n                wistd::is_same<typename policy::pointer_access, details::pointer_access_all>::value ||\n                wistd::is_same<typename policy::pointer_access, details::pointer_access_noaddress>::value,\n            \"pointer_access policy must be a known pointer_access* integral type\");\n    }\n\n    unique_any_t(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n            \"nullptr constructor: valid only for handle types using nullptr as the invalid value\");\n    }\n\n    unique_any_t(unique_any_t&& other) WI_NOEXCEPT : storage_t(wistd::move(other))\n    {\n    }\n\n    unique_any_t& operator=(unique_any_t&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            // cast to base_storage to 'skip' calling the (optional) specialization class that provides handle-specific functionality\n            storage_t::replace(wistd::move(static_cast<typename storage_t::base_storage&>(other)));\n        }\n        return (*this);\n    }\n\n    unique_any_t& operator=(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n            \"nullptr assignment: valid only for handle types using nullptr as the invalid value\");\n        storage_t::reset();\n        return (*this);\n    }\n\n    void swap(unique_any_t& other) WI_NOEXCEPT\n    {\n        unique_any_t self(wistd::move(*this));\n        operator=(wistd::move(other));\n        other = wistd::move(self);\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return storage_t::is_valid();\n    }\n\n    //!\n    //! ~~~\n    //! BOOL OpenOrCreateWaffle(PCWSTR name, HWAFFLE* handle);\n    //! wil::unique_any<HWAFFLE, decltype(&::CloseWaffle), ::CloseWaffle> waffle;\n    //! RETURN_IF_WIN32_BOOL_FALSE(OpenOrCreateWaffle(L\"tasty.yum\", waffle.put()));\n    //! ~~~\n    pointer_storage* put() WI_NOEXCEPT\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_access, details::pointer_access_all>::value,\n            \"operator & is not available for this handle\");\n        storage_t::reset();\n        return storage_t::addressof();\n    }\n\n    pointer_storage* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    WI_NODISCARD pointer get() const WI_NOEXCEPT\n    {\n        static_assert(\n            !wistd::is_same<typename policy::pointer_access, details::pointer_access_none>::value,\n            \"get(): the raw handle value is not available for this resource class\");\n        return storage_t::get();\n    }\n\n    // The following functions are publicly exposed by their inclusion in the unique_storage base class\n\n    // explicit unique_any_t(pointer_storage ptr) WI_NOEXCEPT\n    // void reset(pointer_storage ptr = policy::invalid_value()) WI_NOEXCEPT\n    // void reset(wistd::nullptr_t) WI_NOEXCEPT\n    // pointer_storage release() WI_NOEXCEPT                                        // not exposed for some resource types\n    // pointer_storage *addressof() WI_NOEXCEPT                                     // not exposed for some resource types\n};\n\ntemplate <typename policy>\nvoid swap(unique_any_t<policy>& left, unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\ntemplate <typename policy>\nbool operator==(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (left.get() == right.get());\n}\n\ntemplate <typename policy>\nbool operator==(const unique_any_t<policy>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename unique_any_t<policy>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !left;\n}\n\ntemplate <typename policy>\nbool operator==(wistd::nullptr_t, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename unique_any_t<policy>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !right;\n}\n\ntemplate <typename policy>\nbool operator!=(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (!(left.get() == right.get()));\n}\n\ntemplate <typename policy>\nbool operator!=(const unique_any_t<policy>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename unique_any_t<policy>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !!left;\n}\n\ntemplate <typename policy>\nbool operator!=(wistd::nullptr_t, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename unique_any_t<policy>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !!right;\n}\n\ntemplate <typename policy>\nbool operator<(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (left.get() < right.get());\n}\n\ntemplate <typename policy>\nbool operator>=(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename policy>\nbool operator>(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename policy>\nbool operator<=(const unique_any_t<policy>& left, const unique_any_t<policy>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\n// unique_any provides a template alias for easily building a unique_any_t from a unique_storage class with the given\n// template parameters for resource_policy.\n\ntemplate <\n    typename pointer,                                      // The handle type\n    typename close_fn_t,                                   // The handle close function type\n    close_fn_t close_fn,                                   //      * and function pointer\n    typename pointer_access = details::pointer_access_all, // all, noaddress or none to control pointer method access\n    typename pointer_storage = pointer,          // The type used to store the handle (usually the same as the handle itself)\n    typename invalid_t = pointer,                // The invalid handle value type\n    invalid_t invalid = invalid_t{},             //      * and its value (default ZERO value)\n    typename pointer_invalid = wistd::nullptr_t> // nullptr_t if the invalid handle value is compatible with nullptr, otherwise pointer\nusing unique_any =\n    unique_any_t<details::unique_storage<details::resource_policy<pointer, close_fn_t, close_fn, pointer_access, pointer_storage, invalid_t, invalid, pointer_invalid>>>;\n\n/// @cond\nnamespace details\n{\n    template <typename TLambda>\n    class lambda_call\n    {\n    public:\n        lambda_call(const lambda_call&) = delete;\n        lambda_call& operator=(const lambda_call&) = delete;\n        lambda_call& operator=(lambda_call&& other) = delete;\n\n        explicit lambda_call(TLambda&& lambda) WI_NOEXCEPT : m_lambda(wistd::move(lambda))\n        {\n            static_assert(wistd::is_same<decltype(lambda()), void>::value, \"scope_exit lambdas must not have a return value\");\n            static_assert(\n                !wistd::is_lvalue_reference<TLambda>::value && !wistd::is_rvalue_reference<TLambda>::value,\n                \"scope_exit should only be directly used with a lambda\");\n        }\n\n        lambda_call(lambda_call&& other) WI_NOEXCEPT : m_lambda(wistd::move(other.m_lambda)), m_call(other.m_call)\n        {\n            other.m_call = false;\n        }\n\n        ~lambda_call() WI_NOEXCEPT\n        {\n            reset();\n        }\n\n        // Ensures the scope_exit lambda will not be called\n        void release() WI_NOEXCEPT\n        {\n            m_call = false;\n        }\n\n        // Executes the scope_exit lambda immediately if not yet run; ensures it will not run again\n        void reset() WI_NOEXCEPT\n        {\n            if (m_call)\n            {\n                m_call = false;\n                m_lambda();\n            }\n        }\n\n        // Returns true if the scope_exit lambda is still going to be executed\n        WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n        {\n            return m_call;\n        }\n\n    protected:\n        TLambda m_lambda;\n        bool m_call = true;\n    };\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n    template <typename TLambda>\n    class lambda_call_log\n    {\n    public:\n        lambda_call_log(const lambda_call_log&) = delete;\n        lambda_call_log& operator=(const lambda_call_log&) = delete;\n        lambda_call_log& operator=(lambda_call_log&& other) = delete;\n\n        explicit lambda_call_log(void* address, const DiagnosticsInfo& info, TLambda&& lambda) WI_NOEXCEPT\n            : m_address(address),\n              m_info(info),\n              m_lambda(wistd::move(lambda))\n        {\n            static_assert(wistd::is_same<decltype(lambda()), void>::value, \"scope_exit lambdas must return 'void'\");\n            static_assert(\n                !wistd::is_lvalue_reference<TLambda>::value && !wistd::is_rvalue_reference<TLambda>::value,\n                \"scope_exit should only be directly used with a lambda\");\n        }\n\n        lambda_call_log(lambda_call_log&& other) WI_NOEXCEPT : m_address(other.m_address),\n                                                               m_info(other.m_info),\n                                                               m_lambda(wistd::move(other.m_lambda)),\n                                                               m_call(other.m_call)\n        {\n            other.m_call = false;\n        }\n\n        ~lambda_call_log() WI_NOEXCEPT\n        {\n            reset();\n        }\n\n        // Ensures the scope_exit lambda will not be called\n        void release() WI_NOEXCEPT\n        {\n            m_call = false;\n        }\n\n        // Executes the scope_exit lambda immediately if not yet run; ensures it will not run again\n        void reset() WI_NOEXCEPT\n        {\n            if (m_call)\n            {\n                m_call = false;\n                try\n                {\n                    m_lambda();\n                }\n                catch (...)\n                {\n                    ReportFailure_CaughtException<FailureType::Log>(__R_DIAGNOSTICS(m_info), m_address);\n                }\n            }\n        }\n\n        // Returns true if the scope_exit lambda is still going to be executed\n        WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n        {\n            return m_call;\n        }\n\n    private:\n        void* m_address;\n        DiagnosticsInfo m_info;\n        TLambda m_lambda;\n        bool m_call = true;\n    };\n#endif // WIL_ENABLE_EXCEPTIONS\n} // namespace details\n/// @endcond\n\n/** Returns an object that executes the given lambda when destroyed.\nCapture the object with 'auto'; use reset() to execute the lambda early or release() to avoid\nexecution.  Exceptions thrown in the lambda will fail-fast; use scope_exit_log to avoid. */\ntemplate <typename TLambda>\nWI_NODISCARD inline auto scope_exit(TLambda&& lambda) WI_NOEXCEPT\n{\n    return details::lambda_call<TLambda>(wistd::forward<TLambda>(lambda));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Returns an object that executes the given lambda when destroyed; logs exceptions.\nCapture the object with 'auto'; use reset() to execute the lambda early or release() to avoid\nexecution.  Exceptions thrown in the lambda will be caught and logged without being propagated. */\ntemplate <typename TLambda>\nWI_NODISCARD inline __declspec(noinline) auto scope_exit_log(const DiagnosticsInfo& diagnostics, TLambda&& lambda) WI_NOEXCEPT\n{\n    return details::lambda_call_log<TLambda>(_ReturnAddress(), diagnostics, wistd::forward<TLambda>(lambda));\n}\n#endif\n\n// Forward declaration...\ntemplate <typename T, typename err_policy>\nclass com_ptr_t;\n\n//! Type traits class that identifies the inner type of any smart pointer.\ntemplate <typename Ptr>\nstruct smart_pointer_details\n{\n    typedef typename Ptr::pointer pointer;\n};\n\n/// @cond\ntemplate <typename T>\nstruct smart_pointer_details<Microsoft::WRL::ComPtr<T>>\n{\n    typedef T* pointer;\n};\n/// @endcond\n\n/** Generically detaches a raw pointer from any smart pointer.\nCaller takes ownership of the returned raw pointer; calls the correct release(), detach(),\nor Detach() method based on the smart pointer type */\ntemplate <typename TSmartPointer>\nWI_NODISCARD typename TSmartPointer::pointer detach_from_smart_pointer(TSmartPointer& smartPtr)\n{\n    return smartPtr.release();\n}\n\n/// @cond\n// Generically detaches a raw pointer from any smart pointer\ntemplate <typename T, typename err>\nWI_NODISCARD T* detach_from_smart_pointer(wil::com_ptr_t<T, err>& smartPtr)\n{\n    return smartPtr.detach();\n}\n\n// Generically detaches a raw pointer from any smart pointer\ntemplate <typename T>\nWI_NODISCARD T* detach_from_smart_pointer(Microsoft::WRL::ComPtr<T>& smartPtr)\n{\n    return smartPtr.Detach();\n}\n\ntemplate <typename T, typename err>\nclass com_ptr_t; // forward\nnamespace details\n{\n    // The first two attach_to_smart_pointer() overloads are ambiguous when passed a com_ptr_t.\n    // To solve that use this functions return type to eliminate the reset form for com_ptr_t.\n    template <typename T, typename err>\n    wistd::false_type use_reset(wil::com_ptr_t<T, err>*)\n    {\n        return wistd::false_type();\n    }\n    template <typename T>\n    wistd::true_type use_reset(T*)\n    {\n        return wistd::true_type();\n    }\n} // namespace details\n/// @endcond\n\n/** Generically attach a raw pointer to a compatible smart pointer.\nCalls the correct reset(), attach(), or Attach() method based on samrt pointer type. */\ntemplate <typename TSmartPointer, typename EnableResetForm = wistd::enable_if_t<decltype(details::use_reset(static_cast<TSmartPointer*>(nullptr)))::value>>\nvoid attach_to_smart_pointer(TSmartPointer& smartPtr, typename TSmartPointer::pointer rawPtr)\n{\n    smartPtr.reset(rawPtr);\n}\n\n/// @cond\n\n// Generically attach a raw pointer to a compatible smart pointer.\ntemplate <typename T, typename err>\nvoid attach_to_smart_pointer(wil::com_ptr_t<T, err>& smartPtr, T* rawPtr)\n{\n    smartPtr.attach(rawPtr);\n}\n\n// Generically attach a raw pointer to a compatible smart pointer.\ntemplate <typename T>\nvoid attach_to_smart_pointer(Microsoft::WRL::ComPtr<T>& smartPtr, T* rawPtr)\n{\n    smartPtr.Attach(rawPtr);\n}\n/// @endcond\n\n//! @ingroup outparam\n/** Detach a smart pointer resource to an optional output pointer parameter.\nAvoids cluttering code with nullptr tests; works generically for any smart pointer */\ntemplate <typename T, typename TSmartPointer>\ninline void detach_to_opt_param(_Out_opt_ T* outParam, TSmartPointer&& smartPtr)\n{\n    if (outParam)\n    {\n        *outParam = detach_from_smart_pointer(smartPtr);\n    }\n}\n\n/// @cond\nnamespace details\n{\n    template <typename T>\n    struct out_param_t\n    {\n        typedef typename wil::smart_pointer_details<T>::pointer pointer;\n        T& wrapper;\n        pointer pRaw;\n        bool replace = true;\n\n        out_param_t(_Inout_ T& output) : wrapper(output), pRaw(nullptr)\n        {\n        }\n\n        out_param_t(out_param_t&& other) WI_NOEXCEPT : wrapper(other.wrapper), pRaw(other.pRaw)\n        {\n            WI_ASSERT(other.replace);\n            other.replace = false;\n        }\n\n        operator pointer*()\n        {\n            WI_ASSERT(replace);\n            return &pRaw;\n        }\n\n        ~out_param_t()\n        {\n            if (replace)\n            {\n                attach_to_smart_pointer(wrapper, pRaw);\n            }\n        }\n\n        out_param_t(out_param_t const& other) = delete;\n        out_param_t& operator=(out_param_t const& other) = delete;\n    };\n\n    template <typename Tcast, typename T>\n    struct out_param_ptr_t\n    {\n        typedef typename wil::smart_pointer_details<T>::pointer pointer;\n        T& wrapper;\n        pointer pRaw;\n        bool replace = true;\n\n        out_param_ptr_t(_Inout_ T& output) : wrapper(output), pRaw(nullptr)\n        {\n        }\n\n        out_param_ptr_t(out_param_ptr_t&& other) WI_NOEXCEPT : wrapper(other.wrapper), pRaw(other.pRaw)\n        {\n            WI_ASSERT(other.replace);\n            other.replace = false;\n        }\n\n        operator Tcast()\n        {\n            WI_ASSERT(replace);\n            return reinterpret_cast<Tcast>(&pRaw);\n        }\n\n        ~out_param_ptr_t()\n        {\n            if (replace)\n            {\n                attach_to_smart_pointer(wrapper, pRaw);\n            }\n        }\n\n        out_param_ptr_t(out_param_ptr_t const& other) = delete;\n        out_param_ptr_t& operator=(out_param_ptr_t const& other) = delete;\n    };\n} // namespace details\n/// @endcond\n\n/** Use to retrieve raw out parameter pointers into smart pointers that do not support the '&' operator.\nThis avoids multi-step handling of a raw resource to establish the smart pointer.\nExample: `GetFoo(out_param(foo));` */\ntemplate <typename T>\ndetails::out_param_t<T> out_param(T& p)\n{\n    return details::out_param_t<T>(p);\n}\n\n/** Use to retrieve raw out parameter pointers (with a required cast) into smart pointers that do not support the '&' operator.\nUse only when the smart pointer's &handle is not equal to the output type a function requires, necessitating a cast.\nExample: `wil::out_param_ptr<PSECURITY_DESCRIPTOR*>(securityDescriptor)` */\ntemplate <typename Tcast, typename T>\ndetails::out_param_ptr_t<Tcast, T> out_param_ptr(T& p)\n{\n    return details::out_param_ptr_t<Tcast, T>(p);\n}\n\n/** Use unique_struct to define an RAII type for a trivial struct that references resources that must be cleaned up.\nUnique_struct wraps a trivial struct using a custom clean up function and, optionally, custom initializer function. If no custom\ninitialier function is defined in the template then ZeroMemory is used.\nUnique_struct is modeled off of std::unique_ptr. However, unique_struct inherits from the defined type instead of managing the\nstruct through a private member variable.\n\nIf the type you're wrapping is a system type, you can share the code by declaring it in this file (Resource.h). Submit pull\nrequests to [GitHub](https://github.com/microsoft/wil/). Otherwise, if the type is local to your project, declare it locally.\n@tparam struct_t The struct you want to manage\n@tparam close_fn_t The type of the function to clean up the struct. Takes one parameter: a pointer of struct_t. Return values are\n        ignored.\n@tparam close_fn The function of type close_fn_t. This is called in the destructor and reset functions.\n@tparam init_fn_t Optional:The type of the function to initialize the struct.  Takes one parameter: a pointer of struct_t. Return\n        values are ignored.\n@tparam init_fn Optional:The function of type init_fn_t. This is called in the constructor, reset, and release functions. The\n        default is ZeroMemory to initialize the struct.\n\nDefined using the default zero memory initializer\n~~~\ntypedef wil::unique_struct<PROPVARIANT, decltype(&::PropVariantClear), ::PropVariantClear> unique_prop_variant_default_init;\n\nunique_prop_variant_default_init propvariant;\nSomeFunction(&propvariant);\n~~~\n\nDefined using a custom initializer\n~~~\ntypedef wil::unique_struct<PROPVARIANT, decltype(&::PropVariantClear), ::PropVariantClear, decltype(&::PropVariantInit),\n    ::PropVariantInit> unique_prop_variant;\n\nunique_prop_variant propvariant;\nSomeFunction(&propvariant);\n~~~\n*/\ntemplate <typename struct_t, typename close_fn_t, close_fn_t close_fn, typename init_fn_t = wistd::nullptr_t, init_fn_t init_fn = wistd::nullptr_t()>\nclass unique_struct : public struct_t\n{\n    using closer = details::close_invoker<close_fn_t, close_fn, struct_t*>;\n\npublic:\n    //! Initializes the managed struct using the user-provided initialization function, or ZeroMemory if no function is specified\n    unique_struct()\n    {\n        call_init(use_default_init_fn());\n    }\n\n    //! Takes ownership of the struct by doing a shallow copy. Must explicitly be type struct_t\n    explicit unique_struct(const struct_t& other) WI_NOEXCEPT : struct_t(other)\n    {\n    }\n\n    //! Initializes the managed struct by taking the ownership of the other managed struct\n    //! Then resets the other managed struct by calling the custom close function\n    unique_struct(unique_struct&& other) WI_NOEXCEPT : struct_t(other.release())\n    {\n    }\n\n    //! Resets this managed struct by calling the custom close function and takes ownership of the other managed struct\n    //! Then resets the other managed struct by calling the custom close function\n    unique_struct& operator=(unique_struct&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset(other.release());\n        }\n        return *this;\n    }\n\n    //! Calls the custom close function\n    ~unique_struct() WI_NOEXCEPT\n    {\n        closer::close(this);\n    }\n\n    void reset(const unique_struct&) = delete;\n\n    //! Resets this managed struct by calling the custom close function and begins management of the other struct\n    void reset(const struct_t& other) WI_NOEXCEPT\n    {\n        closer::close_reset(this);\n        struct_t::operator=(other);\n    }\n\n    //! Resets this managed struct by calling the custom close function\n    //! Then initializes this managed struct using the user-provided initialization function, or ZeroMemory if no function is\n    //! specified\n    void reset() WI_NOEXCEPT\n    {\n        closer::close(this);\n        call_init(use_default_init_fn());\n    }\n\n    void swap(struct_t&) = delete;\n\n    //! Swaps the managed structs\n    void swap(unique_struct& other) WI_NOEXCEPT\n    {\n        struct_t self(*this);\n        struct_t::operator=(other);\n        *(other.addressof()) = self;\n    }\n\n    //! Returns the managed struct\n    //! Then initializes this managed struct using the user-provided initialization function, or ZeroMemory if no function is\n    //! specified\n    struct_t release() WI_NOEXCEPT\n    {\n        struct_t value(*this);\n        call_init(use_default_init_fn());\n        return value;\n    }\n\n    //! Returns address of the managed struct\n    struct_t* addressof() WI_NOEXCEPT\n    {\n        return this;\n    }\n\n    //! Resets this managed struct by calling the custom close function\n    //! Then initializes this managed struct using the user-provided initialization function, or ZeroMemory if no function is\n    //! specified.\n    //! Returns address of the managed struct\n    struct_t* reset_and_addressof() WI_NOEXCEPT\n    {\n        reset();\n        return this;\n    }\n\n    unique_struct(const unique_struct&) = delete;\n    unique_struct& operator=(const unique_struct&) = delete;\n    unique_struct& operator=(const struct_t&) = delete;\n\nprivate:\n    typedef typename wistd::is_same<init_fn_t, wistd::nullptr_t>::type use_default_init_fn;\n\n    void call_init(wistd::true_type)\n    {\n        // Suppress '-Wnontrivial-memcall' with 'static_cast'\n        RtlZeroMemory(static_cast<void*>(this), sizeof(*this));\n    }\n\n    void call_init(wistd::false_type)\n    {\n        init_fn(this);\n    }\n};\n\nstruct empty_deleter\n{\n    template <typename T>\n    void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T) const\n    {\n        static_assert(\n            !details::needs_destruction_v<T>,\n            \"Resource type has a non-trivial destructor, but is used in a context where its destructor will not be run\");\n    }\n};\n\n/** unique_any_array_ptr is a RAII type for managing conformant arrays that need to be freed and have elements that may need to be\nfreed. The intended use for this RAII type would be to capture out params from API like IPropertyValue::GetStringArray. This class\nalso maintains the size of the array, so it can iterate over the members and deallocate them before it deallocates the base array\npointer.\n\nIf the type you're wrapping is a system type, you can share the code by declaring it in this file (Resource.h). Send pull requests\nto [GitHub](https://github.com/microsoft/wil/). Otherwise, if the type is local to your project, declare it locally.\n\n@tparam ValueType: The type of array you want to manage.\n@tparam ArrayDeleter: The type of the function to clean up the array. Takes one parameter of type T[] or T*. Return values are\n        ignored. This is called in the destructor and reset functions.\n@tparam ElementDeleter: The type of the function to clean up the array elements. Takes one parameter of type T. Return values are\n        ignored. This is called in the destructor and reset functions.\n\n~~~\nvoid GetSomeArray(_Out_ size_t*, _Out_ NOTMYTYPE**);\n\nstruct not_my_deleter\n{\nvoid operator()(NOTMYTYPE p) const\n{\ndestroy(p);\n}\n};\n\nwil::unique_any_array_ptr<NOTMYTYPE, ::CoTaskMemFree, not_my_deleter> myArray;\nGetSomeArray(myArray.size_address(), &myArray);\n~~~ */\ntemplate <typename ValueType, typename ArrayDeleter, typename ElementDeleter = empty_deleter>\nclass unique_any_array_ptr\n{\npublic:\n    typedef ValueType value_type;\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    typedef ValueType* pointer;\n    typedef const ValueType* const_pointer;\n    typedef ValueType& reference;\n    typedef const ValueType& const_reference;\n\n    typedef ValueType* iterator;\n    typedef const ValueType* const_iterator;\n\n    unique_any_array_ptr() = default;\n    unique_any_array_ptr(const unique_any_array_ptr&) = delete;\n    unique_any_array_ptr& operator=(const unique_any_array_ptr&) = delete;\n\n    unique_any_array_ptr(wistd::nullptr_t) WI_NOEXCEPT\n    {\n    }\n\n    unique_any_array_ptr& operator=(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        reset();\n        return *this;\n    }\n\n    unique_any_array_ptr(pointer ptr, size_t size) WI_NOEXCEPT : m_ptr(ptr), m_size(size)\n    {\n    }\n\n    unique_any_array_ptr(unique_any_array_ptr&& other) WI_NOEXCEPT : m_ptr(other.m_ptr), m_size(other.m_size)\n    {\n        other.m_ptr = nullptr;\n        other.m_size = size_type{};\n    }\n\n    unique_any_array_ptr& operator=(unique_any_array_ptr&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n            swap(other);\n        }\n        return *this;\n    }\n\n    ~unique_any_array_ptr() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    void swap(unique_any_array_ptr& other) WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        auto size = m_size;\n        m_ptr = other.m_ptr;\n        m_size = other.m_size;\n        other.m_ptr = ptr;\n        other.m_size = size;\n    }\n\n    WI_NODISCARD iterator begin() WI_NOEXCEPT\n    {\n        return (iterator(m_ptr));\n    }\n\n    WI_NODISCARD const_iterator begin() const WI_NOEXCEPT\n    {\n        return (const_iterator(m_ptr));\n    }\n\n    WI_NODISCARD iterator end() WI_NOEXCEPT\n    {\n        return (iterator(m_ptr + m_size));\n    }\n\n    WI_NODISCARD const_iterator end() const WI_NOEXCEPT\n    {\n        return (const_iterator(m_ptr + m_size));\n    }\n\n    WI_NODISCARD const_iterator cbegin() const WI_NOEXCEPT\n    {\n        return (begin());\n    }\n\n    WI_NODISCARD const_iterator cend() const WI_NOEXCEPT\n    {\n        return (end());\n    }\n\n    WI_NODISCARD size_type size() const WI_NOEXCEPT\n    {\n        return (m_size);\n    }\n\n    WI_NODISCARD bool empty() const WI_NOEXCEPT\n    {\n        return (size() == size_type{});\n    }\n\n    WI_NODISCARD reference operator[](size_type position)\n    {\n        WI_ASSERT(position < m_size);\n        _Analysis_assume_(position < m_size);\n        return (m_ptr[position]);\n    }\n\n    WI_NODISCARD const_reference operator[](size_type position) const\n    {\n        WI_ASSERT(position < m_size);\n        _Analysis_assume_(position < m_size);\n        return (m_ptr[position]);\n    }\n\n    WI_NODISCARD reference front()\n    {\n        WI_ASSERT(!empty());\n        return (m_ptr[0]);\n    }\n\n    WI_NODISCARD const_reference front() const\n    {\n        WI_ASSERT(!empty());\n        return (m_ptr[0]);\n    }\n\n    WI_NODISCARD reference back()\n    {\n        WI_ASSERT(!empty());\n        return (m_ptr[m_size - 1]);\n    }\n\n    WI_NODISCARD const_reference back() const\n    {\n        WI_ASSERT(!empty());\n        return (m_ptr[m_size - 1]);\n    }\n\n    WI_NODISCARD ValueType* data() WI_NOEXCEPT\n    {\n        return (m_ptr);\n    }\n\n    WI_NODISCARD const ValueType* data() const WI_NOEXCEPT\n    {\n        return (m_ptr);\n    }\n\n    WI_NODISCARD pointer get() const WI_NOEXCEPT\n    {\n        return m_ptr;\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_ptr != pointer());\n    }\n\n    pointer release() WI_NOEXCEPT\n    {\n        auto result = m_ptr;\n        m_ptr = nullptr;\n        m_size = size_type{};\n        return result;\n    }\n\n    void reset() WI_NOEXCEPT\n    {\n        if (m_ptr)\n        {\n            reset_array(ElementDeleter());\n            ArrayDeleter()(m_ptr);\n            m_ptr = nullptr;\n            m_size = size_type{};\n        }\n    }\n\n    void reset(pointer ptr, size_t size) WI_NOEXCEPT\n    {\n        reset();\n        m_ptr = ptr;\n        m_size = size;\n    }\n\n    pointer* addressof() WI_NOEXCEPT\n    {\n        return &m_ptr;\n    }\n\n    pointer* put() WI_NOEXCEPT\n    {\n        reset();\n        return addressof();\n    }\n\n    pointer* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    size_type* size_address() WI_NOEXCEPT\n    {\n        return &m_size;\n    }\n\n    template <typename TSize>\n    struct size_address_ptr\n    {\n        unique_any_array_ptr& wrapper;\n        TSize size{};\n        bool replace = true;\n\n        size_address_ptr(_Inout_ unique_any_array_ptr& output) : wrapper(output)\n        {\n        }\n\n        size_address_ptr(size_address_ptr&& other) WI_NOEXCEPT : wrapper(other.wrapper), size(other.size)\n        {\n            WI_ASSERT(other.replace);\n            other.replace = false;\n        }\n\n        operator TSize*()\n        {\n            WI_ASSERT(replace);\n            return &size;\n        }\n\n        ~size_address_ptr()\n        {\n            if (replace)\n            {\n                *wrapper.size_address() = static_cast<size_type>(size);\n            }\n        }\n\n        size_address_ptr(size_address_ptr const& other) = delete;\n        size_address_ptr& operator=(size_address_ptr const& other) = delete;\n    };\n\n    template <typename T>\n    size_address_ptr<T> size_address() WI_NOEXCEPT\n    {\n        return size_address_ptr<T>(*this);\n    }\n\nprivate:\n    pointer m_ptr = nullptr;\n    size_type m_size{};\n\n    void reset_array(const empty_deleter&)\n    {\n    }\n\n    template <typename T>\n    void reset_array(const T& deleter)\n    {\n        for (auto& element : make_range(m_ptr, m_size))\n        {\n            deleter(element);\n        }\n    }\n};\n\n// forward declaration\ntemplate <typename T, typename err_policy>\nclass com_ptr_t;\n\n/// @cond\nnamespace details\n{\n    template <typename UniqueAnyType>\n    struct unique_any_array_deleter\n    {\n        template <typename T>\n        void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const\n        {\n            UniqueAnyType::policy::close_reset(p);\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn>\n    struct unique_struct_array_deleter\n    {\n        template <typename T>\n        void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T& p) const\n        {\n            close_invoker<close_fn_t, close_fn, T*>::close(&p);\n        }\n    };\n\n    struct com_unknown_deleter\n    {\n        template <typename T>\n        void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const\n        {\n            if (p)\n            {\n                p->Release();\n            }\n        }\n    };\n\n    template <class T>\n    struct element_traits\n    {\n        typedef empty_deleter deleter;\n        typedef T type;\n    };\n\n    template <typename storage_t>\n    struct element_traits<unique_any_t<storage_t>>\n    {\n        typedef unique_any_array_deleter<unique_any_t<storage_t>> deleter;\n        typedef typename unique_any_t<storage_t>::pointer type;\n    };\n\n    template <typename T, typename err_policy>\n    struct element_traits<com_ptr_t<T, err_policy>>\n    {\n        typedef com_unknown_deleter deleter;\n        typedef T* type;\n    };\n\n    template <typename struct_t, typename close_fn_t, close_fn_t close_fn, typename init_fn_t, init_fn_t init_fn>\n    struct element_traits<unique_struct<struct_t, close_fn_t, close_fn, init_fn_t, init_fn>>\n    {\n        typedef unique_struct_array_deleter<close_fn_t, close_fn> deleter;\n        typedef struct_t type;\n    };\n} // namespace details\n/// @endcond\n\ntemplate <typename T, typename ArrayDeleter>\nusing unique_array_ptr =\n    unique_any_array_ptr<typename details::element_traits<T>::type, ArrayDeleter, typename details::element_traits<T>::deleter>;\n\n/** Adapter for single-parameter 'free memory' for `wistd::unique_ptr`.\nThis struct provides a standard wrapper for calling a platform function to deallocate memory held by a\n`wistd::unique_ptr`, making declaring them as easy as declaring wil::unique_any<>.\n\nConsider this adapter in preference to `wil::unique_any<>` when the returned type is really a pointer or an\narray of items; `wistd::unique_ptr<>` exposes `operator->()` and `operator[]` for array-typed things safely.\n@code\nEXTERN_C VOID WINAPI MyDllFreeMemory(void* p);\nEXTERN_C HRESULT MyDllGetString(_Outptr_ PWSTR* pString);\nEXTERN_C HRESULT MyDllGetThing(_In_ PCWSTR pString, _Outptr_ PMYSTRUCT* ppThing);\ntemplate<typename T>\nusing unique_mydll_ptr = wistd::unique_ptr<T, wil::function_deleter<decltype(&MyDllFreeMemory), MyDllFreeMemory>>;\nHRESULT Test()\n{\nunique_mydll_ptr<WCHAR[]> dllString;\nunique_mydll_ptr<MYSTRUCT> thing;\nRETURN_IF_FAILED(MyDllGetString(wil::out_param(dllString)));\nRETURN_IF_FAILED(MyDllGetThing(dllString.get(), wil::out_param(thing)));\nif (thing->Member)\n{\n// ...\n}\nreturn S_OK;\n}\n@endcode\n*/\ntemplate <typename Q, Q TDeleter>\nstruct function_deleter\n{\n    template <typename T>\n    void operator()(_Frees_ptr_opt_ T* toFree) const\n    {\n        TDeleter(toFree);\n    }\n};\n\n/** Use unique_com_token to define an RAII type for a token-based resource that is managed by a COM interface.\nBy comparison, unique_any_t has the requirement that the close function must be static. This works for functions\nsuch as CloseHandle(), but for any resource cleanup function that relies on a more complex interface,\nunique_com_token can be used.\n\n@tparam interface_t A COM interface pointer that will manage this resource type.\n@tparam token_t The token type that relates to the COM interface management functions.\n@tparam close_fn_t The type of the function that is called when the resource is destroyed.\n@tparam close_fn The function used to destroy the associated resource. This function should have the signature\n        void(interface_t* source, token_t token).\n@tparam invalid_token Optional:An invalid token value. Defaults to default-constructed token_t().\n\nExample\n~~~\nvoid __stdcall MyInterfaceCloseFunction(IMyInterface* source, DWORD token)\n{\nsource->MyCloseFunction(token);\n}\nusing unique_my_interface_token =\n    wil::unique_com_token<IMyInterface, DWORD, decltype(MyInterfaceCloseFunction), MyInterfaceCloseFunction, 0xFFFFFFFF>;\n~~~ */\ntemplate <typename interface_t, typename token_t, typename close_fn_t, close_fn_t close_fn, token_t invalid_token = token_t()>\nclass unique_com_token\n{\npublic:\n    unique_com_token() = default;\n\n    unique_com_token(_In_opt_ interface_t* source, token_t token = invalid_token) WI_NOEXCEPT\n    {\n        reset(source, token);\n    }\n\n    unique_com_token(unique_com_token&& other) WI_NOEXCEPT : m_source(other.m_source), m_token(other.m_token)\n    {\n        other.m_source = nullptr;\n        other.m_token = invalid_token;\n    }\n\n    unique_com_token& operator=(unique_com_token&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n            m_source = other.m_source;\n            m_token = other.m_token;\n\n            other.m_source = nullptr;\n            other.m_token = invalid_token;\n        }\n        return *this;\n    }\n\n    ~unique_com_token() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    //! Determine if the underlying source and token are valid\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_token != invalid_token) && m_source;\n    }\n\n    //! Associates a new source and releases the existing token if valid\n    void associate(_In_opt_ interface_t* source) WI_NOEXCEPT\n    {\n        reset(source, invalid_token);\n    }\n\n    //! Assigns a new source and token\n    void reset(_In_opt_ interface_t* source, token_t token) WI_NOEXCEPT\n    {\n        WI_ASSERT(source || (token == invalid_token));\n\n        // Determine if we need to call the close function on our previous token.\n        if (m_token != invalid_token)\n        {\n            if ((m_source != source) || (m_token != token))\n            {\n                wistd::invoke(close_fn, m_source, m_token);\n            }\n        }\n\n        m_token = token;\n\n        // Assign our new source and manage the reference counts\n        if (m_source != source)\n        {\n            auto oldSource = m_source;\n            m_source = source;\n\n            if (m_source)\n            {\n                m_source->AddRef();\n            }\n\n            if (oldSource)\n            {\n                oldSource->Release();\n            }\n        }\n    }\n\n    //! Assigns a new token without modifying the source; associate must be called first\n    void reset(token_t token) WI_NOEXCEPT\n    {\n        reset(m_source, token);\n    }\n\n    //! Closes the token and the releases the reference to the source\n    void reset() WI_NOEXCEPT\n    {\n        reset(nullptr, invalid_token);\n    }\n\n    //! Exchanges values with another managed token\n    void swap(unique_com_token& other) WI_NOEXCEPT\n    {\n        wistd::swap_wil(m_source, other.m_source);\n        wistd::swap_wil(m_token, other.m_token);\n    }\n\n    //! Releases the held token to the caller without closing it and releases the reference to the source.\n    //! Requires that the associated COM interface be kept alive externally or the released token may be invalidated\n    token_t release() WI_NOEXCEPT\n    {\n        auto token = m_token;\n        m_token = invalid_token;\n        reset();\n        return token;\n    }\n\n    //! Returns address of the managed token; associate must be called first\n    token_t* addressof() WI_NOEXCEPT\n    {\n        WI_ASSERT(m_source);\n        return &m_token;\n    }\n\n    //! Releases the held token and allows attaching a new token; associate must be called first\n    token_t* put() WI_NOEXCEPT\n    {\n        reset(invalid_token);\n        return addressof();\n    }\n\n    //! Releases the held token and allows attaching a new token; associate must be called first\n    token_t* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    //! Retrieves the token\n    WI_NODISCARD token_t get() const WI_NOEXCEPT\n    {\n        return m_token;\n    }\n\n    unique_com_token(const unique_com_token&) = delete;\n    unique_com_token& operator=(const unique_com_token&) = delete;\n\nprivate:\n    interface_t* m_source = nullptr;\n    token_t m_token = invalid_token;\n};\n\n/** Use unique_com_call to define an RAII type that demands a particular parameter-less method be called on a COM interface.\nThis allows implementing an RAII type that can call a Close() method (think IClosable) or a SetSite(nullptr)\nmethod (think IObjectWithSite) or some other method when a basic interface call is required as part of the RAII contract.\nsee wil::com_set_site in wil/com.h for the IObjectWithSite support.\n\n@tparam interface_t A COM interface pointer that provides context to make the call.\n@tparam close_fn_t The type of the function that is called to invoke the method.\n@tparam close_fn The function used to invoke the interface method.  This function should have the signature\n        void(interface_t* source).\n\nExample\n~~~\nvoid __stdcall CloseIClosable(IClosable* source)\n{\nsource->Close();\n}\nusing unique_closable_call = wil::unique_com_call<IClosable, decltype(CloseIClosable), CloseIClosable>;\n~~~ */\ntemplate <typename interface_t, typename close_fn_t, close_fn_t close_fn>\nclass unique_com_call\n{\npublic:\n    unique_com_call() = default;\n\n    explicit unique_com_call(_In_opt_ interface_t* ptr) WI_NOEXCEPT\n    {\n        reset(ptr);\n    }\n\n    unique_com_call(unique_com_call&& other) WI_NOEXCEPT\n    {\n        m_ptr = other.m_ptr;\n        other.m_ptr = nullptr;\n    }\n\n    unique_com_call& operator=(unique_com_call&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n            m_ptr = other.m_ptr;\n            other.m_ptr = nullptr;\n        }\n        return *this;\n    }\n\n    ~unique_com_call() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    //! Assigns an interface to make a given call on\n    void reset(_In_opt_ interface_t* ptr = nullptr) WI_NOEXCEPT\n    {\n        if (ptr != m_ptr)\n        {\n            auto oldSource = m_ptr;\n            m_ptr = ptr;\n            if (m_ptr)\n            {\n                m_ptr->AddRef();\n            }\n            if (oldSource)\n            {\n                details::close_invoker<close_fn_t, close_fn, interface_t*>::close(oldSource);\n                oldSource->Release();\n            }\n        }\n    }\n\n    //! Exchanges values with another class\n    void swap(unique_com_call& other) WI_NOEXCEPT\n    {\n        wistd::swap_wil(m_ptr, other.m_ptr);\n    }\n\n    //! Cancel the interface call that this class was expected to make\n    void release() WI_NOEXCEPT\n    {\n        auto ptr = m_ptr;\n        m_ptr = nullptr;\n        if (ptr)\n        {\n            ptr->Release();\n        }\n    }\n\n    //! Returns true if the call this class was expected to make is still outstanding\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_ptr != nullptr);\n    }\n\n    //! Returns address of the internal interface\n    interface_t** addressof() WI_NOEXCEPT\n    {\n        return &m_ptr;\n    }\n\n    //! Releases the held interface (first performing the interface call if required)\n    //! and allows attaching a new interface\n    interface_t** put() WI_NOEXCEPT\n    {\n        reset();\n        return addressof();\n    }\n\n    //! Releases the held interface (first performing the interface call if required)\n    //! and allows attaching a new interface\n    interface_t** operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    unique_com_call(const unique_com_call&) = delete;\n    unique_com_call& operator=(const unique_com_call&) = delete;\n\nprivate:\n    interface_t* m_ptr = nullptr;\n};\n\n/** Use unique_call to define an RAII type that demands a particular parameter-less global function be called.\nThis allows implementing a RAII types that can call methods like CoUninitialize.\n\n@tparam close_fn_t The type of the function that is called to invoke the call.\n@tparam close_fn The function used to invoke the call.  This function should have the signature void().\n@tparam default_value Determines whether the unique_call is active or inactive when default-constructed or reset.\n\nExample\n~~~\nvoid __stdcall CoUninitializeFunction()\n{\n::CoUninitialize();\n}\nusing unique_couninitialize_call = wil::unique_call<decltype(CoUninitializeFunction), CoUninitializeFunction>;\n~~~ */\ntemplate <typename close_fn_t, close_fn_t close_fn, bool default_value = true>\nclass unique_call\n{\npublic:\n    unique_call() = default;\n\n    explicit unique_call(bool call) WI_NOEXCEPT : m_call(call)\n    {\n    }\n\n    unique_call(unique_call&& other) WI_NOEXCEPT\n    {\n        m_call = other.m_call;\n        other.m_call = false;\n    }\n\n    unique_call& operator=(unique_call&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n            m_call = other.m_call;\n            other.m_call = false;\n        }\n        return *this;\n    }\n\n    ~unique_call() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    //! Assigns a new ptr and token\n    void reset() WI_NOEXCEPT\n    {\n        auto call = m_call;\n        m_call = false;\n        if (call)\n        {\n            close_fn();\n        }\n    }\n\n    //! Exchanges values with raii class\n    void swap(unique_call& other) WI_NOEXCEPT\n    {\n        wistd::swap_wil(m_call, other.m_call);\n    }\n\n    //! Make the interface call that was expected of this class\n    void activate() WI_NOEXCEPT\n    {\n        m_call = true;\n    }\n\n    //! Do not make the interface call that was expected of this class\n    void release() WI_NOEXCEPT\n    {\n        m_call = false;\n    }\n\n    //! Returns true if the call that was expected is still outstanding\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return m_call;\n    }\n\n    unique_call(const unique_call&) = delete;\n    unique_call& operator=(const unique_call&) = delete;\n\nprivate:\n    bool m_call = default_value;\n};\n\n// str_raw_ptr is an overloaded function that retrieves a const pointer to the first character in a string's buffer.\n// Overloads in this file support any string that is implicitly convertible to a PCWSTR, HSTRING, and any unique_any_t\n// that points to any other supported type (this covers unique_hstring, unique_cotaskmem_string, and similar).\n// An overload for std::wstring is available in stl.h.\ninline PCWSTR str_raw_ptr(PCWSTR str)\n{\n    return str;\n}\n\ntemplate <typename T>\nPCWSTR str_raw_ptr(const unique_any_t<T>& ua)\n{\n    return str_raw_ptr(ua.get());\n}\n\n#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n/// @cond\nnamespace details\n{\n    // Forward declaration\n    template <typename string_type>\n    struct string_maker;\n\n    // Concatenate any number of strings together and store it in an automatically allocated string.  If a string is present\n    // in the input buffer, it is overwritten.\n    template <typename string_type>\n    HRESULT str_build_nothrow(string_type& result, _In_reads_(strCount) PCWSTR* strList, size_t strCount)\n    {\n        size_t lengthRequiredWithoutNull{};\n        for (auto& string : make_range(strList, strCount))\n        {\n            lengthRequiredWithoutNull += string ? wcslen(string) : 0;\n        }\n\n        details::string_maker<string_type> maker;\n        RETURN_IF_FAILED(maker.make(nullptr, lengthRequiredWithoutNull));\n\n        auto buffer = maker.buffer();\n        auto bufferEnd = buffer + lengthRequiredWithoutNull + 1;\n        for (auto& string : make_range(strList, strCount))\n        {\n            if (string)\n            {\n                RETURN_IF_FAILED(StringCchCopyExW(buffer, (bufferEnd - buffer), string, &buffer, nullptr, STRSAFE_IGNORE_NULLS));\n            }\n        }\n\n        result = maker.release();\n        return S_OK;\n    }\n\n    // NOTE: 'Strings' must all be PCWSTR, or convertible to PCWSTR, but C++ doesn't allow us to express that cleanly\n    template <typename string_type, typename... Strings>\n    HRESULT str_build_nothrow(string_type& result, Strings... strings)\n    {\n        PCWSTR localStrings[] = {strings...};\n        return str_build_nothrow(result, localStrings, sizeof...(Strings));\n    }\n} // namespace details\n/// @endcond\n\n// Concatenate any number of strings together and store it in an automatically allocated string.  If a string is present\n// in the input buffer, the remaining strings are appended to it.\ntemplate <typename string_type, typename... strings>\nHRESULT str_concat_nothrow(string_type& buffer, const strings&... str)\n{\n    static_assert(sizeof...(str) > 0, \"attempting to concatenate no strings\");\n    return details::str_build_nothrow(buffer, details::string_maker<string_type>::get(buffer), str_raw_ptr(str)...);\n}\n#endif // !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n// Concatenate any number of strings together and store it in an automatically allocated string.\ntemplate <typename string_type, typename... arguments>\nstring_type str_concat(arguments&&... args)\n{\n    string_type result{};\n    THROW_IF_FAILED(str_concat_nothrow(result, wistd::forward<arguments>(args)...));\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n// Concatenate any number of strings together and store it in an automatically allocated string.\ntemplate <typename string_type, typename... arguments>\nstring_type str_concat_failfast(arguments&&... args)\n{\n    string_type result{};\n    FAIL_FAST_IF_FAILED(str_concat_nothrow(result, wistd::forward<arguments>(args)...));\n    return result;\n}\n\n#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n/// @cond\nnamespace details\n{\n    // Wraps StringCchPrintFExW and stores it in an automatically allocated string.  Takes a buffer followed by the same format\n    // arguments that StringCchPrintfExW takes.\n    template <typename string_type>\n    HRESULT str_vprintf_nothrow(string_type& result, _Printf_format_string_ PCWSTR pszFormat, va_list& argsVL)\n    {\n        size_t lengthRequiredWithoutNull = _vscwprintf(pszFormat, argsVL);\n\n        string_maker<string_type> maker;\n        RETURN_IF_FAILED(maker.make(nullptr, lengthRequiredWithoutNull));\n\n        auto buffer = maker.buffer();\n        RETURN_IF_FAILED(\n            StringCchVPrintfExW(buffer, lengthRequiredWithoutNull + 1, nullptr, nullptr, STRSAFE_NULL_ON_FAILURE, pszFormat, argsVL));\n\n        result = maker.release();\n        return S_OK;\n    }\n} // namespace details\n/// @endcond\n\n// Wraps StringCchPrintFExW and stores it in an automatically allocated string.  Takes a buffer followed by the same format\n// arguments that StringCchPrintfExW takes.\ntemplate <typename string_type>\nHRESULT str_printf_nothrow(string_type& result, _Printf_format_string_ PCWSTR pszFormat, ...)\n{\n    va_list argsVL;\n    va_start(argsVL, pszFormat);\n    auto hr = details::str_vprintf_nothrow(result, pszFormat, argsVL);\n    va_end(argsVL);\n    return hr;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n// Wraps StringCchPrintFExW and stores it in an automatically allocated string.  Takes a buffer followed by the same format\n// arguments that StringCchPrintfExW takes.\ntemplate <typename string_type>\nstring_type str_printf(_Printf_format_string_ PCWSTR pszFormat, ...)\n{\n    string_type result{};\n    va_list argsVL;\n    va_start(argsVL, pszFormat);\n    auto hr = details::str_vprintf_nothrow(result, pszFormat, argsVL);\n    va_end(argsVL);\n    THROW_IF_FAILED(hr);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n// Wraps StringCchPrintFExW and stores it in an automatically allocated string.  Takes a buffer followed by the same format\n// arguments that StringCchPrintfExW takes.\ntemplate <typename string_type>\nstring_type str_printf_failfast(_Printf_format_string_ PCWSTR pszFormat, ...)\n{\n    string_type result{};\n    va_list argsVL;\n    va_start(argsVL, pszFormat);\n    auto hr = details::str_vprintf_nothrow(result, pszFormat, argsVL);\n    va_end(argsVL);\n    FAIL_FAST_IF_FAILED(hr);\n    return result;\n}\n#endif // !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n\n} // namespace wil\n#endif // __WIL_RESOURCE\n\n// Hash deferral function for unique_any_t\n#if ((defined(_UNORDERED_SET_) || defined(_UNORDERED_MAP_)) && !defined(__WIL_RESOURCE_UNIQUE_HASH)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_RESOURCE_UNIQUE_HASH\n/// @endcond\nnamespace std\n{\ntemplate <typename storage_t>\nstruct hash<wil::unique_any_t<storage_t>>\n{\n    WI_NODISCARD size_t operator()(wil::unique_any_t<storage_t> const& val) const\n    {\n        return (hash<typename wil::unique_any_t<storage_t>::pointer>()(val.get()));\n    }\n};\n} // namespace std\n#endif\n\n// shared_any and weak_any implementation using <memory> STL header\n#if (defined(_MEMORY_) && defined(WIL_ENABLE_EXCEPTIONS) && !defined(WIL_RESOURCE_STL) && !defined(RESOURCE_SUPPRESS_STL)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define WIL_RESOURCE_STL\n/// @endcond\nnamespace wil\n{\n\ntemplate <typename storage_t>\nclass weak_any;\n\n/// @cond\nnamespace details\n{\n    // This class provides the pointer storage behind the implementation of shared_any_t utilizing the given\n    // resource_policy.  It is separate from shared_any_t to allow a type-specific specialization class to plug\n    // into the inheritance chain between shared_any_t and shared_storage.  This allows classes like shared_event\n    // to be a shared_any formed class, but also expose methods like SetEvent directly.\n\n    template <typename UniqueT>\n    class shared_storage\n    {\n    protected:\n        typedef UniqueT unique_t;\n        typedef typename unique_t::policy policy;\n        typedef typename policy::pointer_storage pointer_storage;\n        typedef typename policy::pointer pointer;\n        typedef shared_storage<unique_t> base_storage;\n\n    public:\n        shared_storage() = default;\n\n        explicit shared_storage(pointer_storage ptr)\n        {\n            if (policy::is_valid(ptr))\n            {\n                m_ptr = std::make_shared<unique_t>(unique_t(ptr)); // unique_t on the stack to prevent leak on throw\n            }\n        }\n\n        shared_storage(unique_t&& other)\n        {\n            if (other)\n            {\n                m_ptr = std::make_shared<unique_t>(wistd::move(other));\n            }\n        }\n\n        shared_storage(const shared_storage& other) WI_NOEXCEPT : m_ptr(other.m_ptr)\n        {\n        }\n\n        shared_storage& operator=(const shared_storage& other) WI_NOEXCEPT\n        {\n            m_ptr = other.m_ptr;\n            return *this;\n        }\n\n        shared_storage(shared_storage&& other) WI_NOEXCEPT : m_ptr(wistd::move(other.m_ptr))\n        {\n        }\n\n        shared_storage(std::shared_ptr<unique_t> const& ptr) : m_ptr(ptr)\n        {\n        }\n\n        WI_NODISCARD bool is_valid() const WI_NOEXCEPT\n        {\n            return (m_ptr && m_ptr->is_valid());\n        }\n\n        void reset(pointer_storage ptr = policy::invalid_value())\n        {\n            if (policy::is_valid(ptr))\n            {\n                m_ptr = std::make_shared<unique_t>(unique_t(ptr)); // unique_t on the stack to prevent leak on throw\n            }\n            else\n            {\n                m_ptr = nullptr;\n            }\n        }\n\n        void reset(unique_t&& other)\n        {\n            m_ptr = std::make_shared<unique_t>(wistd::move(other));\n        }\n\n        void reset(wistd::nullptr_t) WI_NOEXCEPT\n        {\n            static_assert(\n                wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n                \"reset(nullptr): valid only for handle types using nullptr as the invalid value\");\n            reset();\n        }\n\n        template <\n            typename allow_t = typename policy::pointer_access,\n            typename wistd::enable_if<!wistd::is_same<allow_t, details::pointer_access_none>::value, int>::type = 0>\n        WI_NODISCARD pointer get() const WI_NOEXCEPT\n        {\n            return (m_ptr ? m_ptr->get() : policy::invalid_value());\n        }\n\n        template <\n            typename allow_t = typename policy::pointer_access,\n            typename wistd::enable_if<wistd::is_same<allow_t, details::pointer_access_all>::value, int>::type = 0>\n        pointer_storage* addressof()\n        {\n            if (!m_ptr)\n            {\n                m_ptr = std::make_shared<unique_t>();\n            }\n            return m_ptr->addressof();\n        }\n\n        WI_NODISCARD long int use_count() const WI_NOEXCEPT\n        {\n            return m_ptr.use_count();\n        }\n\n    protected:\n        void replace(shared_storage&& other) WI_NOEXCEPT\n        {\n            m_ptr = wistd::move(other.m_ptr);\n        }\n\n    private:\n        template <typename storage_t>\n        friend class ::wil::weak_any;\n\n        std::shared_ptr<unique_t> m_ptr;\n    };\n} // namespace details\n/// @endcond\n\n// This class when paired with shared_storage and an optional type-specific specialization class implements\n// the same interface as STL's shared_ptr<> for resource handle types.  It is both copyable and movable, supporting\n// weak references and automatic closure of the handle upon release of the last shared_any.\n\ntemplate <typename storage_t>\nclass shared_any_t : public storage_t\n{\npublic:\n    typedef typename storage_t::policy policy;\n    typedef typename policy::pointer_storage pointer_storage;\n    typedef typename policy::pointer pointer;\n    typedef typename storage_t::unique_t unique_t;\n\n    // default and forwarding constructor: forwards default, all 'explicit' and multi-arg constructors to the base class\n    template <typename... args_t>\n    explicit shared_any_t(args_t&&... args) __WI_NOEXCEPT_((wistd::is_nothrow_constructible_v<storage_t, args_t...>)) :\n        storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    shared_any_t(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n            \"nullptr constructor: valid only for handle types using nullptr as the invalid value\");\n    }\n\n    shared_any_t(shared_any_t&& other) WI_NOEXCEPT : storage_t(wistd::move(other))\n    {\n    }\n\n    shared_any_t(const shared_any_t& other) WI_NOEXCEPT : storage_t(other)\n    {\n    }\n\n    shared_any_t& operator=(shared_any_t&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            storage_t::replace(wistd::move(static_cast<typename storage_t::base_storage&>(other)));\n        }\n        return (*this);\n    }\n\n    shared_any_t& operator=(const shared_any_t& other) WI_NOEXCEPT\n    {\n        storage_t::operator=(other);\n        return (*this);\n    }\n\n    shared_any_t(unique_t&& other) : storage_t(wistd::move(other))\n    {\n    }\n\n    shared_any_t& operator=(unique_t&& other)\n    {\n        storage_t::reset(wistd::move(other));\n        return (*this);\n    }\n\n    shared_any_t& operator=(wistd::nullptr_t) WI_NOEXCEPT\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_invalid, wistd::nullptr_t>::value,\n            \"nullptr assignment: valid only for handle types using nullptr as the invalid value\");\n        storage_t::reset();\n        return (*this);\n    }\n\n    void swap(shared_any_t& other) WI_NOEXCEPT\n    {\n        shared_any_t self(wistd::move(*this));\n        operator=(wistd::move(other));\n        other = wistd::move(self);\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return storage_t::is_valid();\n    }\n\n    pointer_storage* put()\n    {\n        static_assert(\n            wistd::is_same<typename policy::pointer_access, details::pointer_access_all>::value,\n            \"operator & is not available for this handle\");\n        storage_t::reset();\n        return storage_t::addressof();\n    }\n\n    pointer_storage* operator&()\n    {\n        return put();\n    }\n\n    WI_NODISCARD pointer get() const WI_NOEXCEPT\n    {\n        static_assert(\n            !wistd::is_same<typename policy::pointer_access, details::pointer_access_none>::value,\n            \"get(): the raw handle value is not available for this resource class\");\n        return storage_t::get();\n    }\n\n    // The following functions are publicly exposed by their inclusion in the base class\n\n    // void reset(pointer_storage ptr = policy::invalid_value()) WI_NOEXCEPT\n    // void reset(wistd::nullptr_t) WI_NOEXCEPT\n    // pointer_storage *addressof() WI_NOEXCEPT                                // (note: not exposed for opaque resource types)\n};\n\ntemplate <typename unique_t>\nvoid swap(shared_any_t<unique_t>& left, shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\ntemplate <typename unique_t>\nbool operator==(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (left.get() == right.get());\n}\n\ntemplate <typename unique_t>\nbool operator==(const shared_any_t<unique_t>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename shared_any_t<unique_t>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !left;\n}\n\ntemplate <typename unique_t>\nbool operator==(wistd::nullptr_t, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename shared_any_t<unique_t>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !right;\n}\n\ntemplate <typename unique_t>\nbool operator!=(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (!(left.get() == right.get()));\n}\n\ntemplate <typename unique_t>\nbool operator!=(const shared_any_t<unique_t>& left, wistd::nullptr_t) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename shared_any_t<unique_t>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !!left;\n}\n\ntemplate <typename unique_t>\nbool operator!=(wistd::nullptr_t, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    static_assert(\n        wistd::is_same<typename shared_any_t<unique_t>::policy::pointer_invalid, wistd::nullptr_t>::value,\n        \"the resource class does not use nullptr as an invalid value\");\n    return !!right;\n}\n\ntemplate <typename unique_t>\nbool operator<(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (left.get() < right.get());\n}\n\ntemplate <typename unique_t>\nbool operator>=(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (!(left < right));\n}\n\ntemplate <typename unique_t>\nbool operator>(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (right < left);\n}\n\ntemplate <typename unique_t>\nbool operator<=(const shared_any_t<unique_t>& left, const shared_any_t<unique_t>& right) WI_NOEXCEPT\n{\n    return (!(right < left));\n}\n\n// This class provides weak_ptr<> support for shared_any<>, bringing the same weak reference counting and lock() acquire semantics\n// to shared_any.\n\ntemplate <typename SharedT>\nclass weak_any\n{\npublic:\n    typedef SharedT shared_t;\n\n    weak_any() WI_NOEXCEPT\n    {\n    }\n\n    weak_any(const shared_t& other) WI_NOEXCEPT : m_weakPtr(other.m_ptr)\n    {\n    }\n\n    weak_any(const weak_any& other) WI_NOEXCEPT : m_weakPtr(other.m_weakPtr)\n    {\n    }\n\n    weak_any& operator=(const weak_any& right) WI_NOEXCEPT\n    {\n        m_weakPtr = right.m_weakPtr;\n        return (*this);\n    }\n\n    weak_any& operator=(const shared_t& right) WI_NOEXCEPT\n    {\n        m_weakPtr = right.m_ptr;\n        return (*this);\n    }\n\n    void reset() WI_NOEXCEPT\n    {\n        m_weakPtr.reset();\n    }\n\n    void swap(weak_any& other) WI_NOEXCEPT\n    {\n        m_weakPtr.swap(other.m_weakPtr);\n    }\n\n    WI_NODISCARD bool expired() const WI_NOEXCEPT\n    {\n        return m_weakPtr.expired();\n    }\n\n    WI_NODISCARD shared_t lock() const WI_NOEXCEPT\n    {\n        return shared_t(m_weakPtr.lock());\n    }\n\nprivate:\n    std::weak_ptr<typename shared_t::unique_t> m_weakPtr;\n};\n\ntemplate <typename shared_t>\nvoid swap(weak_any<shared_t>& left, weak_any<shared_t>& right) WI_NOEXCEPT\n{\n    left.swap(right);\n}\n\ntemplate <typename unique_t>\nusing shared_any = shared_any_t<details::shared_storage<unique_t>>;\n\n} // namespace wil\n#endif\n\n#if (defined(WIL_RESOURCE_STL) && (defined(_UNORDERED_SET_) || defined(_UNORDERED_MAP_)) && !defined(__WIL_RESOURCE_SHARED_HASH)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_RESOURCE_SHARED_HASH\n/// @endcond\nnamespace std\n{\ntemplate <typename storage_t>\nstruct hash<wil::shared_any_t<storage_t>>\n{\n    WI_NODISCARD size_t operator()(wil::shared_any_t<storage_t> const& val) const\n    {\n        return (hash<typename wil::shared_any_t<storage_t>::pointer>()(val.get()));\n    }\n};\n} // namespace std\n#endif\n\nnamespace wil\n{\n\n#if (defined(__NOTHROW_T_DEFINED) && !defined(__WIL__NOTHROW_T_DEFINED)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__NOTHROW_T_DEFINED\n/// @endcond\n/** Provides `std::make_unique()` semantics for resources allocated in a context that may not throw upon allocation failure.\n`wil::make_unique_nothrow()` is identical to `std::make_unique()` except for the following:\n- It returns `wistd::unique_ptr`, rather than `std::unique_ptr`\n- It returns an empty (null) `wistd::unique_ptr` upon allocation failure, rather than throwing an exception\n\nNote that `wil::make_unique_nothrow()` is not marked WI_NOEXCEPT as it may be used to create an exception-based class that may\nthrow in its constructor.\n~~~\nauto foo = wil::make_unique_nothrow<Foo>(fooConstructorParam1, fooConstructorParam2);\nif (foo)\n{\nfoo->Bar();\n}\n~~~\n*/\ntemplate <class _Ty, class... _Types>\ninline typename wistd::enable_if<!wistd::is_array<_Ty>::value, wistd::unique_ptr<_Ty>>::type make_unique_nothrow(_Types&&... _Args)\n{\n    return (wistd::unique_ptr<_Ty>(new (std::nothrow) _Ty(wistd::forward<_Types>(_Args)...)));\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated in a context that may not throw upon allocation failure.\nSee the overload of `wil::make_unique_nothrow()` for non-array types for more details.\n~~~\nconst size_t size = 42;\nauto foos = wil::make_unique_nothrow<Foo[]>(size); // the default constructor will be called on each Foo object\nif (foos)\n{\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\nelem.Bar();\n}\n}\n~~~\n*/\ntemplate <class _Ty>\ninline typename wistd::enable_if<wistd::is_array<_Ty>::value && wistd::extent<_Ty>::value == 0, wistd::unique_ptr<_Ty>>::type make_unique_nothrow(\n    size_t _Size)\n{\n    typedef typename wistd::remove_extent<_Ty>::type _Elem;\n    return (wistd::unique_ptr<_Ty>(new (std::nothrow) _Elem[_Size]()));\n}\n\ntemplate <class _Ty, class... _Types>\ntypename wistd::enable_if<wistd::extent<_Ty>::value != 0, void>::type make_unique_nothrow(_Types&&...) = delete;\n\n#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n/** Provides `std::make_unique()` semantics for resources allocated in a context that must fail fast upon allocation failure.\nSee the overload of `wil::make_unique_nothrow()` for non-array types for more details.\n~~~\nauto foo = wil::make_unique_failfast<Foo>(fooConstructorParam1, fooConstructorParam2);\nfoo->Bar();\n~~~\n*/\ntemplate <class _Ty, class... _Types>\ninline typename wistd::enable_if<!wistd::is_array<_Ty>::value, wistd::unique_ptr<_Ty>>::type make_unique_failfast(_Types&&... _Args)\n{\n#pragma warning(suppress : 28193) // temporary must be inspected (it is within the called function)\n    return (wistd::unique_ptr<_Ty>(FAIL_FAST_IF_NULL_ALLOC(new (std::nothrow) _Ty(wistd::forward<_Types>(_Args)...))));\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated in a context that must fail fast upon allocation\nfailure. See the overload of `wil::make_unique_nothrow()` for non-array types for more details.\n~~~\nconst size_t size = 42;\nauto foos = wil::make_unique_nothrow<Foo[]>(size); // the default constructor will be called on each Foo object\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\nelem.Bar();\n}\n~~~\n*/\ntemplate <class _Ty>\ninline typename wistd::enable_if<wistd::is_array<_Ty>::value && wistd::extent<_Ty>::value == 0, wistd::unique_ptr<_Ty>>::type make_unique_failfast(\n    size_t _Size)\n{\n    typedef typename wistd::remove_extent<_Ty>::type _Elem;\n#pragma warning(suppress : 28193) // temporary must be inspected (it is within the called function)\n    return (wistd::unique_ptr<_Ty>(FAIL_FAST_IF_NULL_ALLOC(new (std::nothrow) _Elem[_Size]())));\n}\n\ntemplate <class _Ty, class... _Types>\ntypename wistd::enable_if<wistd::extent<_Ty>::value != 0, void>::type make_unique_failfast(_Types&&...) = delete;\n#endif // !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n#endif // __WIL__NOTHROW_T_DEFINED\n\n#if (defined(_WINBASE_) && !defined(__WIL_WINBASE_) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_\nnamespace details\n{\n    inline void __stdcall SetEvent(HANDLE h) WI_NOEXCEPT\n    {\n        __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::SetEvent(h));\n    }\n\n    inline void __stdcall ResetEvent(HANDLE h) WI_NOEXCEPT\n    {\n        __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::ResetEvent(h));\n    }\n\n    inline void __stdcall CloseHandle(HANDLE h) WI_NOEXCEPT\n    {\n        __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::CloseHandle(h));\n    }\n\n    inline void __stdcall ReleaseSemaphore(_In_ HANDLE h) WI_NOEXCEPT\n    {\n        __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::ReleaseSemaphore(h, 1, nullptr));\n    }\n\n    inline void __stdcall ReleaseMutex(_In_ HANDLE h) WI_NOEXCEPT\n    {\n        __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::ReleaseMutex(h));\n    }\n\n    inline void __stdcall CloseTokenLinkedToken(_In_ TOKEN_LINKED_TOKEN* linkedToken) WI_NOEXCEPT\n    {\n        if (linkedToken->LinkedToken && (linkedToken->LinkedToken != INVALID_HANDLE_VALUE))\n        {\n            __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(::CloseHandle(linkedToken->LinkedToken));\n        }\n    }\n\n    enum class PendingCallbackCancellationBehavior\n    {\n        Cancel,\n        Wait,\n        NoWait,\n    };\n\n    template <PendingCallbackCancellationBehavior cancellationBehavior>\n    struct DestroyThreadPoolWait\n    {\n        static void Destroy(_In_ PTP_WAIT threadPoolWait) WI_NOEXCEPT\n        {\n            ::SetThreadpoolWait(threadPoolWait, nullptr, nullptr);\n            ::WaitForThreadpoolWaitCallbacks(threadPoolWait, (cancellationBehavior == PendingCallbackCancellationBehavior::Cancel));\n            ::CloseThreadpoolWait(threadPoolWait);\n        }\n    };\n\n    template <>\n    struct DestroyThreadPoolWait<PendingCallbackCancellationBehavior::NoWait>\n    {\n        static void Destroy(_In_ PTP_WAIT threadPoolWait) WI_NOEXCEPT\n        {\n            ::CloseThreadpoolWait(threadPoolWait);\n        }\n    };\n\n    template <PendingCallbackCancellationBehavior cancellationBehavior>\n    struct DestroyThreadPoolWork\n    {\n        static void Destroy(_In_ PTP_WORK threadpoolWork) WI_NOEXCEPT\n        {\n            ::WaitForThreadpoolWorkCallbacks(threadpoolWork, (cancellationBehavior == PendingCallbackCancellationBehavior::Cancel));\n            ::CloseThreadpoolWork(threadpoolWork);\n        }\n    };\n\n    template <>\n    struct DestroyThreadPoolWork<PendingCallbackCancellationBehavior::NoWait>\n    {\n        static void Destroy(_In_ PTP_WORK threadpoolWork) WI_NOEXCEPT\n        {\n            ::CloseThreadpoolWork(threadpoolWork);\n        }\n    };\n\n    // Non-RTL implementation for threadpool_t parameter of DestroyThreadPoolTimer<>\n    struct SystemThreadPoolMethods\n    {\n        static void WINAPI SetThreadpoolTimer(_Inout_ PTP_TIMER Timer, _In_opt_ PFILETIME DueTime, _In_ DWORD Period, _In_ DWORD WindowLength) WI_NOEXCEPT\n        {\n            ::SetThreadpoolTimer(Timer, DueTime, Period, WindowLength);\n        }\n        static void WaitForThreadpoolTimerCallbacks(_Inout_ PTP_TIMER Timer, _In_ BOOL CancelPendingCallbacks) WI_NOEXCEPT\n        {\n            ::WaitForThreadpoolTimerCallbacks(Timer, CancelPendingCallbacks);\n        }\n        static void CloseThreadpoolTimer(_Inout_ PTP_TIMER Timer) WI_NOEXCEPT\n        {\n            ::CloseThreadpoolTimer(Timer);\n        }\n    };\n\n    // SetThreadpoolTimer(timer, nullptr, 0, 0) will cancel any pending callbacks,\n    // then CloseThreadpoolTimer will asynchronusly close the timer if a callback is running.\n    template <typename threadpool_t, PendingCallbackCancellationBehavior cancellationBehavior>\n    struct DestroyThreadPoolTimer\n    {\n        static void Destroy(_In_ PTP_TIMER threadpoolTimer) WI_NOEXCEPT\n        {\n            threadpool_t::SetThreadpoolTimer(threadpoolTimer, nullptr, 0, 0);\n#pragma warning(suppress : 4127) // conditional expression is constant\n            if (cancellationBehavior != PendingCallbackCancellationBehavior::NoWait)\n            {\n                threadpool_t::WaitForThreadpoolTimerCallbacks(\n                    threadpoolTimer, (cancellationBehavior == PendingCallbackCancellationBehavior::Cancel));\n            }\n            threadpool_t::CloseThreadpoolTimer(threadpoolTimer);\n        }\n    };\n\n    // PendingCallbackCancellationBehavior::NoWait explicitly does not block waiting for\n    // callbacks when destructing.\n    template <typename threadpool_t>\n    struct DestroyThreadPoolTimer<threadpool_t, PendingCallbackCancellationBehavior::NoWait>\n    {\n        static void Destroy(_In_ PTP_TIMER threadpoolTimer) WI_NOEXCEPT\n        {\n            threadpool_t::CloseThreadpoolTimer(threadpoolTimer);\n        }\n    };\n\n    template <PendingCallbackCancellationBehavior cancellationBehavior>\n    struct DestroyThreadPoolIo\n    {\n        static void Destroy(_In_ PTP_IO threadpoolIo) WI_NOEXCEPT\n        {\n            ::WaitForThreadpoolIoCallbacks(threadpoolIo, (cancellationBehavior == PendingCallbackCancellationBehavior::Cancel));\n            ::CloseThreadpoolIo(threadpoolIo);\n        }\n    };\n\n    template <>\n    struct DestroyThreadPoolIo<PendingCallbackCancellationBehavior::NoWait>\n    {\n        static void Destroy(_In_ PTP_IO threadpoolIo) WI_NOEXCEPT\n        {\n            ::CloseThreadpoolIo(threadpoolIo);\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn>\n    struct handle_invalid_resource_policy\n        : resource_policy<HANDLE, close_fn_t, close_fn, details::pointer_access_all, HANDLE, INT_PTR, -1, HANDLE>\n    {\n        __forceinline static bool is_valid(HANDLE ptr) WI_NOEXCEPT\n        {\n            return ((ptr != INVALID_HANDLE_VALUE) && (ptr != nullptr));\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn>\n    struct handle_null_resource_policy : resource_policy<HANDLE, close_fn_t, close_fn>\n    {\n        __forceinline static bool is_valid(HANDLE ptr) WI_NOEXCEPT\n        {\n            return ((ptr != nullptr) && (ptr != INVALID_HANDLE_VALUE));\n        }\n    };\n\n    template <typename close_fn_t, close_fn_t close_fn>\n    struct handle_null_only_resource_policy : resource_policy<HANDLE, close_fn_t, close_fn>\n    {\n        __forceinline static bool is_valid(HANDLE ptr) WI_NOEXCEPT\n        {\n            return (ptr != nullptr);\n        }\n    };\n\n    typedef resource_policy<HANDLE, decltype(&details::CloseHandle), details::CloseHandle, details::pointer_access_all> handle_resource_policy;\n} // namespace details\n/// @endcond\n\ntemplate <typename close_fn_t, close_fn_t close_fn>\nusing unique_any_handle_invalid =\n    unique_any_t<details::unique_storage<details::handle_invalid_resource_policy<close_fn_t, close_fn>>>;\n\ntemplate <typename close_fn_t, close_fn_t close_fn>\nusing unique_any_handle_null = unique_any_t<details::unique_storage<details::handle_null_resource_policy<close_fn_t, close_fn>>>;\n\ntemplate <typename close_fn_t, close_fn_t close_fn>\nusing unique_any_handle_null_only =\n    unique_any_t<details::unique_storage<details::handle_null_only_resource_policy<close_fn_t, close_fn>>>;\n\ntypedef unique_any_handle_invalid<decltype(&::CloseHandle), ::CloseHandle> unique_hfile;\ntypedef unique_any_handle_null<decltype(&::CloseHandle), ::CloseHandle> unique_handle;\ntypedef unique_any_handle_invalid<decltype(&::FindClose), ::FindClose> unique_hfind;\ntypedef unique_any<HMODULE, decltype(&::FreeLibrary), ::FreeLibrary> unique_hmodule;\ntypedef unique_any_handle_null_only<decltype(&::CloseHandle), ::CloseHandle> unique_process_handle;\n\ntypedef unique_struct<TOKEN_LINKED_TOKEN, decltype(&details::CloseTokenLinkedToken), details::CloseTokenLinkedToken> unique_token_linked_token;\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)\ntypedef unique_any<PSID, decltype(&::FreeSid), ::FreeSid> unique_sid;\ntypedef unique_any_handle_null_only<decltype(&::DeleteBoundaryDescriptor), ::DeleteBoundaryDescriptor> unique_boundary_descriptor;\n\n/// @cond\nnamespace details\n{\n    template <ULONG flags>\n    inline void __stdcall ClosePrivateNamespaceHelper(HANDLE h) WI_NOEXCEPT\n    {\n        ::ClosePrivateNamespace(h, flags);\n    }\n} // namespace details\n/// @endcond\n\ntemplate <ULONG flags = 0>\nusing unique_private_namespace =\n    unique_any_handle_null_only<void(__stdcall*)(HANDLE) WI_PFN_NOEXCEPT, &details::ClosePrivateNamespaceHelper<flags>>;\n\nusing unique_private_namespace_close = unique_private_namespace<>;\nusing unique_private_namespace_destroy = unique_private_namespace<PRIVATE_NAMESPACE_FLAG_DESTROY>;\n#endif\n\nusing unique_tool_help_snapshot = unique_hfile;\n\ntypedef unique_any<PTP_WAIT, void (*)(PTP_WAIT), details::DestroyThreadPoolWait<details::PendingCallbackCancellationBehavior::Cancel>::Destroy> unique_threadpool_wait;\ntypedef unique_any<PTP_WAIT, void (*)(PTP_WAIT), details::DestroyThreadPoolWait<details::PendingCallbackCancellationBehavior::Wait>::Destroy> unique_threadpool_wait_nocancel;\ntypedef unique_any<PTP_WAIT, void (*)(PTP_WAIT), details::DestroyThreadPoolWait<details::PendingCallbackCancellationBehavior::NoWait>::Destroy> unique_threadpool_wait_nowait;\ntypedef unique_any<PTP_WORK, void (*)(PTP_WORK), details::DestroyThreadPoolWork<details::PendingCallbackCancellationBehavior::Cancel>::Destroy> unique_threadpool_work;\ntypedef unique_any<PTP_WORK, void (*)(PTP_WORK), details::DestroyThreadPoolWork<details::PendingCallbackCancellationBehavior::Wait>::Destroy> unique_threadpool_work_nocancel;\ntypedef unique_any<PTP_WORK, void (*)(PTP_WORK), details::DestroyThreadPoolWork<details::PendingCallbackCancellationBehavior::NoWait>::Destroy> unique_threadpool_work_nowait;\ntypedef unique_any<PTP_TIMER, void (*)(PTP_TIMER), details::DestroyThreadPoolTimer<details::SystemThreadPoolMethods, details::PendingCallbackCancellationBehavior::Cancel>::Destroy>\n    unique_threadpool_timer;\ntypedef unique_any<PTP_TIMER, void (*)(PTP_TIMER), details::DestroyThreadPoolTimer<details::SystemThreadPoolMethods, details::PendingCallbackCancellationBehavior::Wait>::Destroy>\n    unique_threadpool_timer_nocancel;\ntypedef unique_any<PTP_TIMER, void (*)(PTP_TIMER), details::DestroyThreadPoolTimer<details::SystemThreadPoolMethods, details::PendingCallbackCancellationBehavior::NoWait>::Destroy>\n    unique_threadpool_timer_nowait;\ntypedef unique_any<PTP_IO, void (*)(PTP_IO), details::DestroyThreadPoolIo<details::PendingCallbackCancellationBehavior::Cancel>::Destroy> unique_threadpool_io;\ntypedef unique_any<PTP_IO, void (*)(PTP_IO), details::DestroyThreadPoolIo<details::PendingCallbackCancellationBehavior::Wait>::Destroy> unique_threadpool_io_nocancel;\ntypedef unique_any<PTP_IO, void (*)(PTP_IO), details::DestroyThreadPoolIo<details::PendingCallbackCancellationBehavior::NoWait>::Destroy> unique_threadpool_io_nowait;\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\ntypedef unique_any_handle_invalid<decltype(&::FindCloseChangeNotification), ::FindCloseChangeNotification> unique_hfind_change;\n#endif\n\ntypedef unique_any<HANDLE, decltype(&details::SetEvent), details::SetEvent, details::pointer_access_noaddress> event_set_scope_exit;\ntypedef unique_any<HANDLE, decltype(&details::ResetEvent), details::ResetEvent, details::pointer_access_noaddress> event_reset_scope_exit;\n\n// Guarantees a SetEvent on the given event handle when the returned object goes out of scope\n// Note: call SetEvent early with the reset() method on the returned object or abort the call with the release() method\nWI_NODISCARD inline event_set_scope_exit SetEvent_scope_exit(HANDLE hEvent) WI_NOEXCEPT\n{\n    __FAIL_FAST_ASSERT__(hEvent != nullptr);\n    return event_set_scope_exit(hEvent);\n}\n\n// Guarantees a ResetEvent on the given event handle when the returned object goes out of scope\n// Note: call ResetEvent early with the reset() method on the returned object or abort the call with the release() method\nWI_NODISCARD inline event_reset_scope_exit ResetEvent_scope_exit(HANDLE hEvent) WI_NOEXCEPT\n{\n    __FAIL_FAST_ASSERT__(hEvent != nullptr);\n    return event_reset_scope_exit(hEvent);\n}\n\n// Checks to see if the given *manual reset* event is currently signaled.  The event must not be an auto-reset event.\n// Use when the event will only be set once (cancellation-style) or will only be reset by the polling thread\ninline bool event_is_signaled(HANDLE hEvent) WI_NOEXCEPT\n{\n    auto status = ::WaitForSingleObjectEx(hEvent, 0, FALSE);\n    // Fast fail will trip for wait failures, auto-reset events, or when the event is being both Set and Reset\n    // from a thread other than the polling thread (use event_wait directly for those cases).\n    __FAIL_FAST_ASSERT__(\n        (status == WAIT_TIMEOUT) || ((status == WAIT_OBJECT_0) && (WAIT_OBJECT_0 == ::WaitForSingleObjectEx(hEvent, 0, FALSE))));\n    return (status == WAIT_OBJECT_0);\n}\n\n// Waits on the given handle for the specified duration\ninline bool handle_wait(HANDLE hEvent, DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) WI_NOEXCEPT\n{\n    DWORD status = ::WaitForSingleObjectEx(hEvent, dwMilliseconds, bAlertable);\n    __FAIL_FAST_ASSERT__((status == WAIT_TIMEOUT) || (status == WAIT_OBJECT_0) || (bAlertable && (status == WAIT_IO_COMPLETION)));\n    return (status == WAIT_OBJECT_0);\n}\n\nenum class EventOptions\n{\n    None = 0x0,\n    ManualReset = 0x1,\n    Signaled = 0x2\n};\nDEFINE_ENUM_FLAG_OPERATORS(EventOptions);\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass event_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit event_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructor to create an unnamed event\n    event_t(EventOptions options)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(options);\n    }\n\n    void ResetEvent() const WI_NOEXCEPT\n    {\n        details::ResetEvent(storage_t::get());\n    }\n\n    void SetEvent() const WI_NOEXCEPT\n    {\n        details::SetEvent(storage_t::get());\n    }\n\n    // Guarantees a SetEvent on the given event handle when the returned object goes out of scope\n    // Note: call SetEvent early with the reset() method on the returned object or abort the call with the release() method\n    WI_NODISCARD event_set_scope_exit SetEvent_scope_exit() const WI_NOEXCEPT\n    {\n        return wil::SetEvent_scope_exit(storage_t::get());\n    }\n\n    // Guarantees a ResetEvent on the given event handle when the returned object goes out of scope\n    // Note: call ResetEvent early with the reset() method on the returned object or abort the call with the release() method\n    WI_NODISCARD event_reset_scope_exit ResetEvent_scope_exit() const WI_NOEXCEPT\n    {\n        return wil::ResetEvent_scope_exit(storage_t::get());\n    }\n\n    // Checks if a *manual reset* event is currently signaled.  The event must not be an auto-reset event.\n    // Use when the event will only be set once (cancellation-style) or will only be reset by the polling thread\n    WI_NODISCARD bool is_signaled() const WI_NOEXCEPT\n    {\n        return wil::event_is_signaled(storage_t::get());\n    }\n\n    // Basic WaitForSingleObject on the event handle with the given timeout\n    bool wait(DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) const WI_NOEXCEPT\n    {\n        return wil::handle_wait(storage_t::get(), dwMilliseconds, bAlertable);\n    }\n\n    // Tries to create a named event -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_create(EventOptions options, PCWSTR name, _In_opt_ LPSECURITY_ATTRIBUTES securityAttributes = nullptr, _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        auto handle = ::CreateEventExW(\n            securityAttributes,\n            name,\n            (WI_IsFlagSet(options, EventOptions::ManualReset) ? CREATE_EVENT_MANUAL_RESET : 0) |\n                (WI_IsFlagSet(options, EventOptions::Signaled) ? CREATE_EVENT_INITIAL_SET : 0),\n            EVENT_ALL_ACCESS);\n        if (!handle)\n        {\n            assign_to_opt_param(alreadyExists, false);\n            return false;\n        }\n        assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS));\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_event_nothrow, void with exceptions for shared_event and unique_event\n    result create(\n        EventOptions options = EventOptions::None,\n        PCWSTR name = nullptr,\n        _In_opt_ LPSECURITY_ATTRIBUTES securityAttributes = nullptr,\n        _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        return err_policy::LastErrorIfFalse(try_create(options, name, securityAttributes, alreadyExists));\n    }\n\n    // Tries to open the named event -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | EVENT_MODIFY_STATE, bool inheritHandle = false)\n    {\n        auto handle = ::OpenEventW(desiredAccess, inheritHandle, name);\n        if (handle == nullptr)\n        {\n            return false;\n        }\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_event_nothrow, void with exceptions for shared_event and unique_event\n    result open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | EVENT_MODIFY_STATE, bool inheritHandle = false)\n    {\n        return err_policy::LastErrorIfFalse(try_open(name, desiredAccess, inheritHandle));\n    }\n};\n\ntypedef unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_returncode_policy>> unique_event_nothrow;\ntypedef unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_failfast_policy>> unique_event_failfast;\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_exception_policy>> unique_event;\n#endif\n\n#ifndef WIL_NO_SLIM_EVENT\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && \\\n    ((_WIN32_WINNT >= _WIN32_WINNT_WIN8) || (__WIL_RESOURCE_ENABLE_QUIRKS && (_WIN32_WINNT >= _WIN32_WINNT_WIN7)))\nenum class SlimEventType\n{\n    AutoReset,\n    ManualReset,\n};\n\n/** A lean and mean event class.\nThis class provides a very similar API to `wil::unique_event` but doesn't require a kernel object.\n\nThe two variants of this class are:\n- `wil::slim_event_auto_reset`\n- `wil::slim_event_manual_reset`\n\nIn addition, `wil::slim_event_auto_reset` has the alias `wil::slim_event`.\n\nSome key differences to `wil::unique_event` include:\n- There is no 'create()' function, as initialization occurs in the constructor and can't fail.\n- The move functions have been deleted.\n- For auto-reset events, the `is_signaled()` function doesn't reset the event. (Use `ResetEvent()` instead.)\n- The `ResetEvent()` function returns the previous state of the event.\n- To create a manual reset event, use `wil::slim_event_manual_reset'.\n~~~~\nwil::slim_event finished;\nstd::thread doStuff([&finished] () {\n    Sleep(10);\n    finished.SetEvent();\n});\nfinished.wait();\n\nstd::shared_ptr<wil::slim_event> CreateSharedEvent(bool startSignaled)\n{\n    return std::make_shared<wil::slim_event>(startSignaled);\n}\n~~~~ */\ntemplate <SlimEventType Type>\nclass slim_event_t\n{\npublic:\n    slim_event_t() WI_NOEXCEPT = default;\n\n    slim_event_t(bool isSignaled) WI_NOEXCEPT : m_isSignaled(isSignaled ? TRUE : FALSE)\n    {\n    }\n\n    // Cannot change memory location.\n    slim_event_t(const slim_event_t&) = delete;\n    slim_event_t(slim_event_t&&) = delete;\n    slim_event_t& operator=(const slim_event_t&) = delete;\n    slim_event_t& operator=(slim_event_t&&) = delete;\n\n    // Returns the previous state of the event.\n    bool ResetEvent() WI_NOEXCEPT\n    {\n        return !!InterlockedExchange(&m_isSignaled, FALSE);\n    }\n\n    void SetEvent() WI_NOEXCEPT\n    {\n        // FYI: 'WakeByAddress*' invokes a full memory barrier.\n        WriteRelease(&m_isSignaled, TRUE);\n\n#pragma warning(suppress : 4127) // conditional expression is constant\n        if (Type == SlimEventType::AutoReset)\n        {\n            WakeByAddressSingle(&m_isSignaled);\n        }\n        else\n        {\n            WakeByAddressAll(&m_isSignaled);\n        }\n    }\n\n    // Checks if the event is currently signaled.\n    // Note: Unlike Win32 auto-reset event objects, this will not reset the event.\n    WI_NODISCARD bool is_signaled() const WI_NOEXCEPT\n    {\n        return !!ReadAcquire(&m_isSignaled);\n    }\n\n    bool wait(DWORD timeoutMilliseconds) WI_NOEXCEPT\n    {\n        if (timeoutMilliseconds == 0)\n        {\n            return TryAcquireEvent();\n        }\n        else if (timeoutMilliseconds == INFINITE)\n        {\n            return wait();\n        }\n\n        UINT64 startTime{};\n        QueryUnbiasedInterruptTime(&startTime);\n\n        UINT64 elapsedTimeMilliseconds = 0;\n\n        while (!TryAcquireEvent())\n        {\n            if (elapsedTimeMilliseconds >= timeoutMilliseconds)\n            {\n                return false;\n            }\n\n            DWORD newTimeout = static_cast<DWORD>(timeoutMilliseconds - elapsedTimeMilliseconds);\n\n            if (!WaitForSignal(newTimeout))\n            {\n                return false;\n            }\n\n            UINT64 currTime;\n            QueryUnbiasedInterruptTime(&currTime);\n\n            elapsedTimeMilliseconds = (currTime - startTime) / static_cast<UINT64>(10 * 1000);\n        }\n\n        return true;\n    }\n\n    bool wait() WI_NOEXCEPT\n    {\n        while (!TryAcquireEvent())\n        {\n            if (!WaitForSignal(INFINITE))\n            {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\nprivate:\n    bool TryAcquireEvent() WI_NOEXCEPT\n    {\n#pragma warning(suppress : 4127) // conditional expression is constant\n        if (Type == SlimEventType::AutoReset)\n        {\n            return ResetEvent();\n        }\n        else\n        {\n            return is_signaled();\n        }\n    }\n\n    bool WaitForSignal(DWORD timeoutMilliseconds) WI_NOEXCEPT\n    {\n        LONG falseValue = FALSE;\n        BOOL waitResult = WaitOnAddress(&m_isSignaled, &falseValue, sizeof(m_isSignaled), timeoutMilliseconds);\n        __FAIL_FAST_ASSERT__(waitResult || ::GetLastError() == ERROR_TIMEOUT);\n        return !!waitResult;\n    }\n\n    LONG m_isSignaled = FALSE;\n};\n\n/** An event object that will atomically revert to an unsignaled state anytime a `wait()` call succeeds (i.e. returns true). */\nusing slim_event_auto_reset = slim_event_t<SlimEventType::AutoReset>;\n\n/** An event object that once signaled remains that way forever, unless `ResetEvent()` is called. */\nusing slim_event_manual_reset = slim_event_t<SlimEventType::ManualReset>;\n\n/** An alias for `wil::slim_event_auto_reset`. */\nusing slim_event = slim_event_auto_reset;\n\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN8)\n#endif // WIL_NO_SLIM_EVENT\n\ntypedef unique_any<HANDLE, decltype(&details::ReleaseMutex), details::ReleaseMutex, details::pointer_access_none> mutex_release_scope_exit;\n\nWI_NODISCARD inline mutex_release_scope_exit ReleaseMutex_scope_exit(_In_ HANDLE hMutex) WI_NOEXCEPT\n{\n    __FAIL_FAST_ASSERT__(hMutex != nullptr);\n    return mutex_release_scope_exit(hMutex);\n}\n\n// For efficiency, avoid using mutexes when an srwlock or condition variable will do.\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass mutex_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit mutex_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructor to create a mutex (prefer unnamed (nullptr) for the name)\n    mutex_t(_In_opt_ PCWSTR name)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(name);\n    }\n\n    void ReleaseMutex() const WI_NOEXCEPT\n    {\n        details::ReleaseMutex(storage_t::get());\n    }\n\n    WI_NODISCARD mutex_release_scope_exit ReleaseMutex_scope_exit() const WI_NOEXCEPT\n    {\n        return wil::ReleaseMutex_scope_exit(storage_t::get());\n    }\n\n    WI_NODISCARD mutex_release_scope_exit\n    acquire(_Out_opt_ DWORD* pStatus = nullptr, DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) const WI_NOEXCEPT\n    {\n        auto handle = storage_t::get();\n        DWORD status = ::WaitForSingleObjectEx(handle, dwMilliseconds, bAlertable);\n        assign_to_opt_param(pStatus, status);\n        __FAIL_FAST_ASSERT__(\n            (status == WAIT_TIMEOUT) || (status == WAIT_OBJECT_0) || (status == WAIT_ABANDONED) ||\n            (bAlertable && (status == WAIT_IO_COMPLETION)));\n        return mutex_release_scope_exit(((status == WAIT_OBJECT_0) || (status == WAIT_ABANDONED)) ? handle : nullptr);\n    }\n\n    // Tries to create a named mutex -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_create(\n        _In_opt_ PCWSTR name,\n        DWORD dwFlags = 0,\n        DWORD desiredAccess = MUTEX_ALL_ACCESS,\n        _In_opt_ PSECURITY_ATTRIBUTES mutexAttributes = nullptr,\n        _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        auto handle = ::CreateMutexExW(mutexAttributes, name, dwFlags, desiredAccess);\n        if (handle == nullptr)\n        {\n            assign_to_opt_param(alreadyExists, false);\n            return false;\n        }\n        assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS));\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_mutex_nothrow, void with exceptions for shared_mutex and unique_mutex\n    result create(\n        _In_opt_ PCWSTR name = nullptr,\n        DWORD dwFlags = 0,\n        DWORD desiredAccess = MUTEX_ALL_ACCESS,\n        _In_opt_ PSECURITY_ATTRIBUTES mutexAttributes = nullptr,\n        _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        return err_policy::LastErrorIfFalse(try_create(name, dwFlags, desiredAccess, mutexAttributes, alreadyExists));\n    }\n\n    // Tries to open a named mutex -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | MUTEX_MODIFY_STATE, bool inheritHandle = false)\n    {\n        auto handle = ::OpenMutexW(desiredAccess, inheritHandle, name);\n        if (handle == nullptr)\n        {\n            return false;\n        }\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_mutex_nothrow, void with exceptions for shared_mutex and unique_mutex\n    result open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | MUTEX_MODIFY_STATE, bool inheritHandle = false)\n    {\n        return err_policy::LastErrorIfFalse(try_open(name, desiredAccess, inheritHandle));\n    }\n};\n\ntypedef unique_any_t<mutex_t<details::unique_storage<details::handle_resource_policy>, err_returncode_policy>> unique_mutex_nothrow;\ntypedef unique_any_t<mutex_t<details::unique_storage<details::handle_resource_policy>, err_failfast_policy>> unique_mutex_failfast;\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<mutex_t<details::unique_storage<details::handle_resource_policy>, err_exception_policy>> unique_mutex;\n#endif\n\ntypedef unique_any<HANDLE, decltype(&details::ReleaseSemaphore), details::ReleaseSemaphore, details::pointer_access_none> semaphore_release_scope_exit;\n\nWI_NODISCARD inline semaphore_release_scope_exit ReleaseSemaphore_scope_exit(_In_ HANDLE hSemaphore) WI_NOEXCEPT\n{\n    __FAIL_FAST_ASSERT__(hSemaphore != nullptr);\n    return semaphore_release_scope_exit(hSemaphore);\n}\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass semaphore_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit semaphore_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Note that for custom-constructors the type given the constructor has to match exactly as not all implicit conversions will make it through the\n    // forwarding constructor.  This constructor, for example, uses 'int' instead of 'LONG' as the count to ease that particular issue (const numbers are int by default).\n    explicit semaphore_t(\n        int initialCount,\n        int maximumCount,\n        _In_opt_ PCWSTR name = nullptr,\n        DWORD desiredAccess = SEMAPHORE_ALL_ACCESS,\n        _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(initialCount, maximumCount, name, desiredAccess, pSemaphoreAttributes);\n    }\n\n    void ReleaseSemaphore(long nReleaseCount = 1, _In_opt_ long* pnPreviousCount = nullptr) WI_NOEXCEPT\n    {\n        long nPreviousCount = 0;\n        __FAIL_FAST_ASSERT__(::ReleaseSemaphore(storage_t::get(), nReleaseCount, &nPreviousCount));\n        assign_to_opt_param(pnPreviousCount, nPreviousCount);\n    }\n\n    WI_NODISCARD semaphore_release_scope_exit ReleaseSemaphore_scope_exit() WI_NOEXCEPT\n    {\n        return wil::ReleaseSemaphore_scope_exit(storage_t::get());\n    }\n\n    WI_NODISCARD semaphore_release_scope_exit\n    acquire(_Out_opt_ DWORD* pStatus = nullptr, DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) WI_NOEXCEPT\n    {\n        auto handle = storage_t::get();\n        DWORD status = ::WaitForSingleObjectEx(handle, dwMilliseconds, bAlertable);\n        assign_to_opt_param(pStatus, status);\n        __FAIL_FAST_ASSERT__((status == WAIT_TIMEOUT) || (status == WAIT_OBJECT_0) || (bAlertable && (status == WAIT_IO_COMPLETION)));\n        return semaphore_release_scope_exit((status == WAIT_OBJECT_0) ? handle : nullptr);\n    }\n\n    // Tries to create a named event -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_create(\n        LONG lInitialCount,\n        LONG lMaximumCount,\n        _In_opt_ PCWSTR name,\n        DWORD desiredAccess = SEMAPHORE_ALL_ACCESS,\n        _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr,\n        _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        auto handle = ::CreateSemaphoreExW(pSemaphoreAttributes, lInitialCount, lMaximumCount, name, 0, desiredAccess);\n        if (handle == nullptr)\n        {\n            assign_to_opt_param(alreadyExists, false);\n            return false;\n        }\n        assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS));\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_semaphore_nothrow, void with exceptions for shared_event and unique_event\n    result create(\n        LONG lInitialCount,\n        LONG lMaximumCount,\n        _In_opt_ PCWSTR name = nullptr,\n        DWORD desiredAccess = SEMAPHORE_ALL_ACCESS,\n        _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr,\n        _Out_opt_ bool* alreadyExists = nullptr)\n    {\n        return err_policy::LastErrorIfFalse(\n            try_create(lInitialCount, lMaximumCount, name, desiredAccess, pSemaphoreAttributes, alreadyExists));\n    }\n\n    // Tries to open the named semaphore -- returns false if unable to do so (gle may still be inspected with return=false)\n    bool try_open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, bool inheritHandle = false)\n    {\n        auto handle = ::OpenSemaphoreW(desiredAccess, inheritHandle, name);\n        if (handle == nullptr)\n        {\n            return false;\n        }\n        storage_t::reset(handle);\n        return true;\n    }\n\n    // Returns HRESULT for unique_semaphore_nothrow, void with exceptions for shared_semaphore and unique_semaphore\n    result open(_In_ PCWSTR name, DWORD desiredAccess = SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, bool inheritHandle = false)\n    {\n        return err_policy::LastErrorIfFalse(try_open(name, desiredAccess, inheritHandle));\n    }\n};\n\ntypedef unique_any_t<semaphore_t<details::unique_storage<details::handle_resource_policy>, err_returncode_policy>> unique_semaphore_nothrow;\ntypedef unique_any_t<semaphore_t<details::unique_storage<details::handle_resource_policy>, err_failfast_policy>> unique_semaphore_failfast;\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<semaphore_t<details::unique_storage<details::handle_resource_policy>, err_exception_policy>> unique_semaphore;\n#endif\n\ntypedef unique_any<SRWLOCK*, decltype(&::ReleaseSRWLockExclusive), ::ReleaseSRWLockExclusive, details::pointer_access_noaddress> rwlock_release_exclusive_scope_exit;\ntypedef unique_any<SRWLOCK*, decltype(&::ReleaseSRWLockShared), ::ReleaseSRWLockShared, details::pointer_access_noaddress> rwlock_release_shared_scope_exit;\n\nWI_NODISCARD inline rwlock_release_exclusive_scope_exit AcquireSRWLockExclusive(_Inout_ SRWLOCK* plock) WI_NOEXCEPT\n{\n    ::AcquireSRWLockExclusive(plock);\n    return rwlock_release_exclusive_scope_exit(plock);\n}\n\nWI_NODISCARD inline rwlock_release_shared_scope_exit AcquireSRWLockShared(_Inout_ SRWLOCK* plock) WI_NOEXCEPT\n{\n    ::AcquireSRWLockShared(plock);\n    return rwlock_release_shared_scope_exit(plock);\n}\n\nWI_NODISCARD inline rwlock_release_exclusive_scope_exit TryAcquireSRWLockExclusive(_Inout_ SRWLOCK* plock) WI_NOEXCEPT\n{\n    return rwlock_release_exclusive_scope_exit(::TryAcquireSRWLockExclusive(plock) ? plock : nullptr);\n}\n\nWI_NODISCARD inline rwlock_release_shared_scope_exit TryAcquireSRWLockShared(_Inout_ SRWLOCK* plock) WI_NOEXCEPT\n{\n    return rwlock_release_shared_scope_exit(::TryAcquireSRWLockShared(plock) ? plock : nullptr);\n}\n\nclass srwlock\n{\npublic:\n    srwlock(const srwlock&) = delete;\n    srwlock(srwlock&&) = delete;\n    srwlock& operator=(const srwlock&) = delete;\n    srwlock& operator=(srwlock&&) = delete;\n\n    srwlock() = default;\n\n    WI_NODISCARD rwlock_release_exclusive_scope_exit lock_exclusive() WI_NOEXCEPT\n    {\n        return wil::AcquireSRWLockExclusive(&m_lock);\n    }\n\n    WI_NODISCARD rwlock_release_exclusive_scope_exit try_lock_exclusive() WI_NOEXCEPT\n    {\n        return wil::TryAcquireSRWLockExclusive(&m_lock);\n    }\n\n    WI_NODISCARD rwlock_release_shared_scope_exit lock_shared() WI_NOEXCEPT\n    {\n        return wil::AcquireSRWLockShared(&m_lock);\n    }\n\n    WI_NODISCARD rwlock_release_shared_scope_exit try_lock_shared() WI_NOEXCEPT\n    {\n        return wil::TryAcquireSRWLockShared(&m_lock);\n    }\n\nprivate:\n    SRWLOCK m_lock = SRWLOCK_INIT;\n};\n\ntypedef unique_any<CRITICAL_SECTION*, decltype(&::LeaveCriticalSection), ::LeaveCriticalSection, details::pointer_access_noaddress> cs_leave_scope_exit;\n\nWI_NODISCARD inline cs_leave_scope_exit EnterCriticalSection(_Inout_ CRITICAL_SECTION* pcs) WI_NOEXCEPT\n{\n    ::EnterCriticalSection(pcs);\n    return cs_leave_scope_exit(pcs);\n}\n\nWI_NODISCARD inline cs_leave_scope_exit TryEnterCriticalSection(_Inout_ CRITICAL_SECTION* pcs) WI_NOEXCEPT\n{\n    return cs_leave_scope_exit(::TryEnterCriticalSection(pcs) ? pcs : nullptr);\n}\n\n// Critical sections are worse than srwlocks in performance and memory usage (their only unique attribute\n// being recursive acquisition). Prefer srwlocks over critical sections when you don't need recursive acquisition.\nclass critical_section\n{\npublic:\n    critical_section(const critical_section&) = delete;\n    critical_section(critical_section&&) = delete;\n    critical_section& operator=(const critical_section&) = delete;\n    critical_section& operator=(critical_section&&) = delete;\n\n    critical_section(ULONG spincount = 0) WI_NOEXCEPT\n    {\n        // Initialization will not fail without invalid params...\n        ::InitializeCriticalSectionEx(&m_cs, spincount, 0);\n    }\n\n    ~critical_section() WI_NOEXCEPT\n    {\n        ::DeleteCriticalSection(&m_cs);\n    }\n\n    WI_NODISCARD cs_leave_scope_exit lock() WI_NOEXCEPT\n    {\n        return wil::EnterCriticalSection(&m_cs);\n    }\n\n    WI_NODISCARD cs_leave_scope_exit try_lock() WI_NOEXCEPT\n    {\n        return wil::TryEnterCriticalSection(&m_cs);\n    }\n\nprivate:\n    CRITICAL_SECTION m_cs;\n};\n\nclass condition_variable\n{\npublic:\n    condition_variable(const condition_variable&) = delete;\n    condition_variable(condition_variable&&) = delete;\n    condition_variable& operator=(const condition_variable&) = delete;\n    condition_variable& operator=(condition_variable&&) = delete;\n\n    condition_variable() = default;\n\n    void notify_one() WI_NOEXCEPT\n    {\n        ::WakeConditionVariable(&m_cv);\n    }\n\n    void notify_all() WI_NOEXCEPT\n    {\n        ::WakeAllConditionVariable(&m_cv);\n    }\n\n    void wait(const cs_leave_scope_exit& lock) WI_NOEXCEPT\n    {\n        wait_for(lock, INFINITE);\n    }\n\n    void wait(const rwlock_release_exclusive_scope_exit& lock) WI_NOEXCEPT\n    {\n        wait_for(lock, INFINITE);\n    }\n\n    void wait(const rwlock_release_shared_scope_exit& lock) WI_NOEXCEPT\n    {\n        wait_for(lock, INFINITE);\n    }\n\n    bool wait_for(const cs_leave_scope_exit& lock, DWORD timeoutMs) WI_NOEXCEPT\n    {\n        bool result = !!::SleepConditionVariableCS(&m_cv, lock.get(), timeoutMs);\n        __FAIL_FAST_ASSERT__(result || ::GetLastError() == ERROR_TIMEOUT);\n        return result;\n    }\n\n    bool wait_for(const rwlock_release_exclusive_scope_exit& lock, DWORD timeoutMs) WI_NOEXCEPT\n    {\n        bool result = !!::SleepConditionVariableSRW(&m_cv, lock.get(), timeoutMs, 0);\n        __FAIL_FAST_ASSERT__(result || ::GetLastError() == ERROR_TIMEOUT);\n        return result;\n    }\n\n    bool wait_for(const rwlock_release_shared_scope_exit& lock, DWORD timeoutMs) WI_NOEXCEPT\n    {\n        bool result = !!::SleepConditionVariableSRW(&m_cv, lock.get(), timeoutMs, CONDITION_VARIABLE_LOCKMODE_SHARED);\n        __FAIL_FAST_ASSERT__(result || ::GetLastError() == ERROR_TIMEOUT);\n        return result;\n    }\n\nprivate:\n    CONDITION_VARIABLE m_cv = CONDITION_VARIABLE_INIT;\n};\n\n/// @cond\nnamespace details\n{\n    template <typename string_class>\n    struct string_allocator\n    {\n        static void* allocate(size_t /*size*/) WI_NOEXCEPT\n        {\n            static_assert(\n                !wistd::is_same<string_class, string_class>::value,\n                \"This type did not provide a string_allocator, add a specialization of string_allocator to support your type.\");\n            return nullptr;\n        }\n    };\n} // namespace details\n/// @endcond\n\n// This string helper does not support the ansi wil string helpers\ntemplate <typename string_type>\nPCWSTR string_get_not_null(const string_type& string)\n{\n    return string ? string.get() : L\"\";\n}\n\n#ifndef MAKE_UNIQUE_STRING_MAX_CCH\n#define MAKE_UNIQUE_STRING_MAX_CCH 2147483647 // max buffer size, in characters, that we support (same as INT_MAX)\n#endif\n\n/** Copies a string (up to the given length) into memory allocated with a specified allocator returning null on failure.\nUse `wil::make_unique_string_nothrow()` for string resources returned from APIs that must satisfy a memory allocation contract\nthat requires use of a specific allocator and free function (CoTaskMemAlloc/CoTaskMemFree, LocalAlloc/LocalFree,\nGlobalAlloc/GlobalFree, etc.).\n~~~\nauto str = wil::make_unique_string_nothrow<wil::unique_cotaskmem_string>(L\"a string of words\", 8);\nRETURN_IF_NULL_ALLOC(str);\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n\nauto str = wil::make_unique_string_nothrow<unique_hlocal_string>(L\"a string\");\nRETURN_IF_NULL_ALLOC(str);\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n\nNOTE: If source is not null terminated, then length MUST be equal to or less than the size\n      of the buffer pointed to by source.\n~~~\n*/\ntemplate <typename string_type>\nstring_type make_unique_string_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) const wchar_t* source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    // guard against invalid parameters (null source with -1 length)\n    FAIL_FAST_IF(!source && (length == static_cast<size_t>(-1)));\n\n    // When the source string exists, calculate the number of characters to copy up to either\n    // 1) the length that is given\n    // 2) the length of the source string. When the source does not exist, use the given length\n    //    for calculating both the size of allocated buffer and the number of characters to copy.\n    size_t lengthToCopy = length;\n    if (source)\n    {\n        size_t maxLength = length < MAKE_UNIQUE_STRING_MAX_CCH ? length : MAKE_UNIQUE_STRING_MAX_CCH;\n        PCWSTR endOfSource = source;\n        while (maxLength && (*endOfSource != L'\\0'))\n        {\n            endOfSource++;\n            maxLength--;\n        }\n        lengthToCopy = endOfSource - source;\n    }\n\n    if (length == static_cast<size_t>(-1))\n    {\n        length = lengthToCopy;\n    }\n    const size_t allocatedBytes = (length + 1) * sizeof(*source);\n    auto result = static_cast<PWSTR>(details::string_allocator<string_type>::allocate(allocatedBytes));\n\n    if (result)\n    {\n        if (source)\n        {\n            const size_t bytesToCopy = lengthToCopy * sizeof(*source);\n            memcpy_s(result, allocatedBytes, source, bytesToCopy);\n            result[lengthToCopy] = L'\\0'; // ensure the copied string is zero terminated\n        }\n        else\n        {\n            *result = L'\\0'; // ensure null terminated in the \"reserve space\" use case.\n        }\n        result[length] = L'\\0'; // ensure the final char of the buffer is zero terminated\n    }\n    return string_type(result);\n}\n#ifndef WIL_NO_ANSI_STRINGS\ntemplate <typename string_type>\nstring_type make_unique_ansistring_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    if (length == static_cast<size_t>(-1))\n    {\n        // guard against invalid parameters (null source with -1 length)\n        FAIL_FAST_IF(!source);\n        length = strlen(source);\n    }\n    const size_t cb = (length + 1) * sizeof(*source);\n    auto result = static_cast<PSTR>(details::string_allocator<string_type>::allocate(cb));\n    if (result)\n    {\n        if (source)\n        {\n            memcpy_s(result, cb, source, cb - sizeof(*source));\n        }\n        else\n        {\n            *result = '\\0'; // ensure null terminated in the \"reserve space\" use case.\n        }\n        result[length] = '\\0'; // ensure zero terminated\n    }\n    return string_type(result);\n}\n#endif // WIL_NO_ANSI_STRINGS\n\n/** Copies a given string into memory allocated with a specified allocator that will fail fast on failure.\nThe use of variadic templates parameters supports the 2 forms of make_unique_string, see those for more details.\n*/\ntemplate <typename string_type>\nstring_type make_unique_string_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    auto result(make_unique_string_nothrow<string_type>(source, length));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifndef WIL_NO_ANSI_STRINGS\ntemplate <typename string_type>\nstring_type make_unique_ansistring_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    auto result(make_unique_ansistring_nothrow<string_type>(source, length));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_NO_ANSI_STRINGS\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Copies a given string into memory allocated with a specified allocator that will throw on failure.\nThe use of variadic templates parameters supports the 2 forms of make_unique_string, see those for more details.\n*/\ntemplate <typename string_type>\nstring_type make_unique_string(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    auto result(make_unique_string_nothrow<string_type>(source, length));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#ifndef WIL_NO_ANSI_STRINGS\ntemplate <typename string_type>\nstring_type make_unique_ansistring(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    auto result(make_unique_ansistring_nothrow<string_type>(source, length));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_NO_ANSI_STRINGS\n#endif // WIL_ENABLE_EXCEPTIONS\n\n/// @cond\nnamespace details\n{\n    // string_maker abstracts creating a string for common string types. This form supports the\n    // wil::unique_xxx_string types. Specializations of other types like HSTRING and std::wstring\n    // are found in wil/winrt.h and wil/stl.h.\n    // This design supports creating the string in a single step or using two phase construction.\n\n    template <typename string_type>\n    struct string_maker\n    {\n        HRESULT make(\n            _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n                _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) const wchar_t* source,\n            size_t length)\n        {\n            m_value = make_unique_string_nothrow<string_type>(source, length);\n            return m_value ? S_OK : E_OUTOFMEMORY;\n        }\n\n        wchar_t* buffer()\n        {\n            WI_ASSERT(m_value.get());\n            return m_value.get();\n        }\n\n        // By default, assume string_type is a null-terminated string and therefore does not require trimming.\n        HRESULT trim_at_existing_null(size_t /* length */)\n        {\n            return S_OK;\n        }\n\n        string_type release()\n        {\n            return wistd::move(m_value);\n        }\n\n        // Utility to abstract access to the null terminated m_value of all string types.\n        static PCWSTR get(const string_type& value)\n        {\n            return value.get();\n        }\n\n    private:\n        string_type m_value; // a wil::unique_xxx_string type.\n    };\n\n    struct SecureZeroData\n    {\n        void* pointer;\n        size_t sizeBytes;\n        SecureZeroData(void* pointer_, size_t sizeBytes_ = 0) WI_NOEXCEPT\n        {\n            pointer = pointer_;\n            sizeBytes = sizeBytes_;\n        }\n        WI_NODISCARD operator void*() const WI_NOEXCEPT\n        {\n            return pointer;\n        }\n        static void Close(SecureZeroData data) WI_NOEXCEPT\n        {\n            ::SecureZeroMemory(data.pointer, data.sizeBytes);\n        }\n    };\n} // namespace details\n/// @endcond\n\ntypedef unique_any<void*, decltype(&details::SecureZeroData::Close), details::SecureZeroData::Close, details::pointer_access_all, details::SecureZeroData> secure_zero_memory_scope_exit;\n\nWI_NODISCARD inline secure_zero_memory_scope_exit SecureZeroMemory_scope_exit(_In_reads_bytes_(sizeBytes) void* pSource, size_t sizeBytes)\n{\n    return secure_zero_memory_scope_exit(details::SecureZeroData(pSource, sizeBytes));\n}\n\nWI_NODISCARD inline secure_zero_memory_scope_exit SecureZeroMemory_scope_exit(_In_ PWSTR initializedString)\n{\n    return SecureZeroMemory_scope_exit(static_cast<void*>(initializedString), wcslen(initializedString) * sizeof(initializedString[0]));\n}\n\n/// @cond\nnamespace details\n{\n    inline void __stdcall FreeProcessHeap(_Pre_opt_valid_ _Frees_ptr_opt_ void* p)\n    {\n        ::HeapFree(::GetProcessHeap(), 0, p);\n    }\n\n    struct heap_allocator\n    {\n        static _Ret_opt_bytecap_(size) void* allocate(size_t size) WI_NOEXCEPT\n        {\n            return ::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, size);\n        }\n    };\n} // namespace details\n/// @endcond\n\nstruct process_heap_deleter\n{\n    template <typename T>\n    void operator()(_Pre_valid_ _Frees_ptr_ T* p) const\n    {\n        details::FreeProcessHeap(p);\n    }\n};\n\nstruct virtualalloc_deleter\n{\n    template <typename T>\n    void operator()(_Pre_valid_ _Frees_ptr_ T* p) const\n    {\n        ::VirtualFree(p, 0, MEM_RELEASE);\n    }\n};\n\nstruct mapview_deleter\n{\n    template <typename T>\n    void operator()(_Pre_valid_ _Frees_ptr_ T* p) const\n    {\n        ::UnmapViewOfFile(p);\n    }\n};\n\n/** Manages a typed pointer allocated with VirtualAlloc\nA specialization of wistd::unique_ptr<> that frees via VirtualFree(p, 0, MEM_RELEASE).\n*/\ntemplate <typename T = void>\nusing unique_virtualalloc_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, virtualalloc_deleter>;\n\n/** Manages a typed pointer allocated with MapViewOfFile\nA specialization of wistd::unique_ptr<> that frees via UnmapViewOfFile(p).\n*/\ntemplate <typename T = void>\nusing unique_mapview_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, mapview_deleter>;\n\n#endif // __WIL_WINBASE_\n\n#if (defined(__WIL_WINBASE_) && defined(__NOTHROW_T_DEFINED) && !defined(__WIL_WINBASE_NOTHROW_T_DEFINED)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_NOTHROW_T_DEFINED\n/// @endcond\n\n// unique_event_watcher, unique_event_watcher_nothrow, unique_event_watcher_failfast\n//\n// Clients must include <new> or <new.h> to enable use of this class as it uses new(std::nothrow).\n// This is to avoid the dependency on those headers that some clients can't tolerate.\n//\n// These classes makes it easy to execute a provided function when an event\n// is signaled. It will create the event handle for you, take ownership of one\n// or duplicate a handle provided. It supports the ability to signal the\n// event using SetEvent() and SetEvent_scope_exit();\n//\n// This can be used to support producer-consumer pattern\n// where a producer updates some state then signals the event when done.\n// The consumer will consume that state in the callback provided to unique_event_watcher.\n//\n// Note, multiple signals may coalesce into a single callback.\n//\n// Example use of throwing version:\n// auto globalStateWatcher = wil::make_event_watcher([]\n//     {\n//         currentState = GetGlobalState();\n//     });\n//\n// UpdateGlobalState(value);\n// globalStateWatcher.SetEvent(); // signal observers so they can update\n//\n// Example use of non-throwing version:\n// auto globalStateWatcher = wil::make_event_watcher_nothrow([]\n//     {\n//         currentState = GetGlobalState();\n//     });\n// RETURN_IF_NULL_ALLOC(globalStateWatcher);\n//\n// UpdateGlobalState(value);\n// globalStateWatcher.SetEvent(); // signal observers so they can update\n\n/// @cond\nnamespace details\n{\n    struct event_watcher_state\n    {\n        event_watcher_state(unique_event_nothrow&& eventHandle, wistd::function<void()>&& callback) :\n            m_callback(wistd::move(callback)), m_event(wistd::move(eventHandle))\n        {\n        }\n        wistd::function<void()> m_callback;\n        unique_event_nothrow m_event;\n        // The thread pool must be last to ensure that the other members are valid\n        // when it is destructed as it will reference them.\n        unique_threadpool_wait m_threadPoolWait;\n    };\n\n    inline void delete_event_watcher_state(_In_opt_ event_watcher_state* watcherStorage)\n    {\n        delete watcherStorage;\n    }\n\n    typedef resource_policy<event_watcher_state*, decltype(&delete_event_watcher_state), delete_event_watcher_state, details::pointer_access_none> event_watcher_state_resource_policy;\n} // namespace details\n/// @endcond\n\ntemplate <typename storage_t, typename err_policy = err_exception_policy>\nclass event_watcher_t : public storage_t\n{\npublic:\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit event_watcher_t(args_t&&... args) WI_NOEXCEPT : storage_t(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    // HRESULT or void error handling...\n    typedef typename err_policy::result result;\n\n    // Exception-based constructors\n    template <typename from_err_policy>\n    event_watcher_t(\n        unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, from_err_policy>>&& eventHandle,\n        wistd::function<void()>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(wistd::move(eventHandle), wistd::move(callback));\n    }\n\n    event_watcher_t(_In_ HANDLE eventHandle, wistd::function<void()>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(eventHandle, wistd::move(callback));\n    }\n\n    event_watcher_t(wistd::function<void()>&& callback)\n    {\n        static_assert(wistd::is_same<void, result>::value, \"this constructor requires exceptions or fail fast; use the create method\");\n        create(wistd::move(callback));\n    }\n\n    template <typename event_err_policy>\n    result create(\n        unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, event_err_policy>>&& eventHandle,\n        wistd::function<void()>&& callback)\n    {\n        return err_policy::HResult(create_take_hevent_ownership(eventHandle.release(), wistd::move(callback)));\n    }\n\n    // Creates the event that you will be watching.\n    result create(wistd::function<void()>&& callback)\n    {\n        unique_event_nothrow eventHandle;\n        HRESULT hr = eventHandle.create(EventOptions::ManualReset); // auto-reset is supported too.\n        if (FAILED(hr))\n        {\n            return err_policy::HResult(hr);\n        }\n        return err_policy::HResult(create_take_hevent_ownership(eventHandle.release(), wistd::move(callback)));\n    }\n\n    // Input is an event handler that is duplicated into this class.\n    result create(_In_ HANDLE eventHandle, wistd::function<void()>&& callback)\n    {\n        unique_event_nothrow ownedHandle;\n        if (!DuplicateHandle(GetCurrentProcess(), eventHandle, GetCurrentProcess(), &ownedHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))\n        {\n            return err_policy::LastError();\n        }\n        return err_policy::HResult(create_take_hevent_ownership(ownedHandle.release(), wistd::move(callback)));\n    }\n\n    // Provide access to the inner event and the very common SetEvent() method on it.\n    WI_NODISCARD unique_event_nothrow const& get_event() const WI_NOEXCEPT\n    {\n        return storage_t::get()->m_event;\n    }\n    void SetEvent() const WI_NOEXCEPT\n    {\n        storage_t::get()->m_event.SetEvent();\n    }\n\nprivate:\n    // Had to move this from a Lambda so it would compile in C++/CLI (which thought the Lambda should be a managed function for some reason).\n    static void CALLBACK wait_callback(PTP_CALLBACK_INSTANCE, void* context, TP_WAIT* pThreadPoolWait, TP_WAIT_RESULT)\n    {\n        auto pThis = static_cast<details::event_watcher_state*>(context);\n        // Manual events must be re-set to avoid missing the last notification.\n        pThis->m_event.ResetEvent();\n        // Call the client before re-arming to ensure that multiple callbacks don't\n        // run concurrently.\n        pThis->m_callback();\n        SetThreadpoolWait(pThreadPoolWait, pThis->m_event.get(), nullptr); // valid params ensure success\n    }\n\n    // To avoid template expansion (if unique_event/unique_event_nothrow forms were used) this base\n    // create function takes a raw handle and assumes its ownership, even on failure.\n    HRESULT create_take_hevent_ownership(_In_ HANDLE rawHandleOwnershipTaken, wistd::function<void()>&& callback)\n    {\n        __FAIL_FAST_ASSERT__(rawHandleOwnershipTaken != nullptr); // invalid parameter\n        unique_event_nothrow eventHandle(rawHandleOwnershipTaken);\n        wistd::unique_ptr<details::event_watcher_state> watcherState(\n            new (std::nothrow) details::event_watcher_state(wistd::move(eventHandle), wistd::move(callback)));\n        RETURN_IF_NULL_ALLOC(watcherState);\n\n        watcherState->m_threadPoolWait.reset(CreateThreadpoolWait(wait_callback, watcherState.get(), nullptr));\n        RETURN_LAST_ERROR_IF(!watcherState->m_threadPoolWait);\n        storage_t::reset(watcherState.release()); // no more failures after this, pass ownership\n        SetThreadpoolWait(storage_t::get()->m_threadPoolWait.get(), storage_t::get()->m_event.get(), nullptr);\n        return S_OK;\n    }\n};\n\ntypedef unique_any_t<event_watcher_t<details::unique_storage<details::event_watcher_state_resource_policy>, err_returncode_policy>> unique_event_watcher_nothrow;\ntypedef unique_any_t<event_watcher_t<details::unique_storage<details::event_watcher_state_resource_policy>, err_failfast_policy>> unique_event_watcher_failfast;\n\ntemplate <typename err_policy>\nunique_event_watcher_nothrow make_event_watcher_nothrow(\n    unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_policy>>&& eventHandle,\n    wistd::function<void()>&& callback) WI_NOEXCEPT\n{\n    unique_event_watcher_nothrow watcher;\n    watcher.create(wistd::move(eventHandle), wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\ninline unique_event_watcher_nothrow make_event_watcher_nothrow(_In_ HANDLE eventHandle, wistd::function<void()>&& callback) WI_NOEXCEPT\n{\n    unique_event_watcher_nothrow watcher;\n    watcher.create(eventHandle, wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\ninline unique_event_watcher_nothrow make_event_watcher_nothrow(wistd::function<void()>&& callback) WI_NOEXCEPT\n{\n    unique_event_watcher_nothrow watcher;\n    watcher.create(wistd::move(callback));\n    return watcher; // caller must test for success using if (watcher)\n}\n\ntemplate <typename err_policy>\nunique_event_watcher_failfast make_event_watcher_failfast(\n    unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_policy>>&& eventHandle,\n    wistd::function<void()>&& callback)\n{\n    return unique_event_watcher_failfast(wistd::move(eventHandle), wistd::move(callback));\n}\n\ninline unique_event_watcher_failfast make_event_watcher_failfast(_In_ HANDLE eventHandle, wistd::function<void()>&& callback)\n{\n    return unique_event_watcher_failfast(eventHandle, wistd::move(callback));\n}\n\ninline unique_event_watcher_failfast make_event_watcher_failfast(wistd::function<void()>&& callback)\n{\n    return unique_event_watcher_failfast(wistd::move(callback));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntypedef unique_any_t<event_watcher_t<details::unique_storage<details::event_watcher_state_resource_policy>, err_exception_policy>> unique_event_watcher;\n\ntemplate <typename err_policy>\nunique_event_watcher make_event_watcher(\n    unique_any_t<event_t<details::unique_storage<details::handle_resource_policy>, err_policy>>&& eventHandle,\n    wistd::function<void()>&& callback)\n{\n    return unique_event_watcher(wistd::move(eventHandle), wistd::move(callback));\n}\n\ninline unique_event_watcher make_event_watcher(_In_ HANDLE eventHandle, wistd::function<void()>&& callback)\n{\n    return unique_event_watcher(eventHandle, wistd::move(callback));\n}\n\ninline unique_event_watcher make_event_watcher(wistd::function<void()>&& callback)\n{\n    return unique_event_watcher(wistd::move(callback));\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#endif // __WIL_WINBASE_NOTHROW_T_DEFINED\n\n#if (defined(__WIL_WINBASE_) && !defined(__WIL_WINBASE_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_STL\n/// @endcond\ntypedef shared_any_t<event_t<details::shared_storage<unique_event>>> shared_event;\ntypedef shared_any_t<mutex_t<details::shared_storage<unique_mutex>>> shared_mutex;\ntypedef shared_any_t<semaphore_t<details::shared_storage<unique_semaphore>>> shared_semaphore;\ntypedef shared_any<unique_hfile> shared_hfile;\ntypedef shared_any<unique_handle> shared_handle;\ntypedef shared_any<unique_hfind> shared_hfind;\ntypedef shared_any<unique_hmodule> shared_hmodule;\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\ntypedef shared_any<unique_threadpool_wait> shared_threadpool_wait;\ntypedef shared_any<unique_threadpool_wait_nocancel> shared_threadpool_wait_nocancel;\ntypedef shared_any<unique_threadpool_work> shared_threadpool_work;\ntypedef shared_any<unique_threadpool_work_nocancel> shared_threadpool_work_nocancel;\n\ntypedef shared_any<unique_hfind_change> shared_hfind_change;\n#endif\n\ntypedef weak_any<shared_event> weak_event;\ntypedef weak_any<shared_mutex> weak_mutex;\ntypedef weak_any<shared_semaphore> weak_semaphore;\ntypedef weak_any<shared_hfile> weak_hfile;\ntypedef weak_any<shared_handle> weak_handle;\ntypedef weak_any<shared_hfind> weak_hfind;\ntypedef weak_any<shared_hmodule> weak_hmodule;\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\ntypedef weak_any<shared_threadpool_wait> weak_threadpool_wait;\ntypedef weak_any<shared_threadpool_wait_nocancel> weak_threadpool_wait_nocancel;\ntypedef weak_any<shared_threadpool_work> weak_threadpool_work;\ntypedef weak_any<shared_threadpool_work_nocancel> weak_threadpool_work_nocancel;\n\ntypedef weak_any<shared_hfind_change> weak_hfind_change;\n#endif\n\n#endif // __WIL_WINBASE_STL\n\n#if (defined(_HEAPAPI_H_) && !defined(__WIL__WIL_HEAP_API) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WIL_HEAP_API\n/// @endcond\n\ntemplate <typename T = void>\nusing unique_process_heap_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, process_heap_deleter>;\ntypedef unique_any<void*, decltype(&details::FreeProcessHeap), details::FreeProcessHeap> unique_process_heap;\ntypedef unique_any<PWSTR, decltype(&details::FreeProcessHeap), details::FreeProcessHeap> unique_process_heap_string;\n\n#ifndef WIL_NO_ANSI_STRINGS\ntypedef unique_any<PSTR, decltype(&wil::details::FreeProcessHeap), wil::details::FreeProcessHeap> unique_process_heap_ansistring;\n#endif // WIL_NO_ANSI_STRINGS\n\n/// @cond\nnamespace details\n{\n    template <>\n    struct string_allocator<wil::unique_process_heap_string> : heap_allocator\n    {\n    };\n\n#ifndef WIL_NO_ANSI_STRINGS\n    template <>\n    struct string_allocator<unique_process_heap_ansistring> : heap_allocator\n    {\n    };\n#endif\n} // namespace details\n/// @endcond\n\ninline auto make_process_heap_string_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_nothrow<unique_process_heap_string>(source, length);\n}\n\ninline auto make_process_heap_string_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_failfast<unique_process_heap_string>(source, length);\n}\n\n#ifndef WIL_NO_ANSI_STRINGS\ninline auto make_process_heap_ansistring_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_ansistring_nothrow<unique_process_heap_ansistring>(source, length);\n}\n\ninline auto make_process_heap_ansistring_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_ansistring_failfast<unique_process_heap_ansistring>(source, length);\n}\n#endif // WIL_NO_ANSI_STRINGS\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline auto make_process_heap_string(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    return make_unique_string<unique_process_heap_string>(source, length);\n}\n\n#ifndef WIL_NO_ANSI_STRINGS\ninline auto make_process_heap_ansistring(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    return make_unique_ansistring<unique_process_heap_ansistring>(source, length);\n}\n#endif // WIL_NO_ANSI_STRINGS\n#endif // WIL_ENABLE_EXCEPTIONS\n#endif // _HEAPAPI_H_\n\n#if (defined(__WIL_WINBASE_) && defined(__NOTHROW_T_DEFINED) && !defined(__WIL_WINBASE_NOTHROW_T_DEFINED_STL) && defined(WIL_RESOURCE_STL) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_NOTHROW_T_DEFINED_STL\n/// @endcond\ntypedef shared_any_t<event_watcher_t<details::shared_storage<unique_event_watcher>>> shared_event_watcher;\ntypedef weak_any<shared_event_watcher> weak_event_watcher;\n#endif // __WIL_WINBASE_NOTHROW_T_DEFINED_STL\n\n#if (defined(__WIL_WINBASE_) && !defined(__WIL_WINBASE_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_DESKTOP\nnamespace details\n{\n    inline void __stdcall DestroyPrivateObjectSecurity(_Pre_opt_valid_ _Frees_ptr_opt_ PSECURITY_DESCRIPTOR pObjectDescriptor) WI_NOEXCEPT\n    {\n        ::DestroyPrivateObjectSecurity(&pObjectDescriptor);\n    }\n} // namespace details\n/// @endcond\n\nusing hlocal_deleter = function_deleter<decltype(&::LocalFree), LocalFree>;\n\ntemplate <typename T = void>\nusing unique_hlocal_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, hlocal_deleter>;\n\ntemplate <typename T>\nusing unique_hlocal_array_ptr = wil::unique_array_ptr<T, wil::hlocal_deleter>;\n\n/** Provides `std::make_unique()` semantics for resources allocated with `LocalAlloc()` in a context that may not throw upon\nallocation failure. Use `wil::make_unique_hlocal_nothrow()` for resources returned from APIs that must satisfy a memory allocation\ncontract that requires the use of `LocalAlloc()` / `LocalFree()`. Use `wil::make_unique_nothrow()` when `LocalAlloc()` is not\nrequired.\n\nAllocations are initialized with placement new and will call constructors (if present), but this does not guarantee\ninitialization.\n\nNote that `wil::make_unique_hlocal_nothrow()` is not marked WI_NOEXCEPT as it may be used to create an exception-based class that\nmay throw in its constructor.\n@code\nauto foo = wil::make_unique_hlocal_nothrow<Foo>();\nif (foo)\n{\n// initialize allocated Foo object as appropriate\n}\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_ptr<T>>::type make_unique_hlocal_nothrow(Args&&... args)\n{\n    unique_hlocal_ptr<T> sp(static_cast<T*>(::LocalAlloc(LMEM_FIXED, sizeof(T))));\n    if (sp)\n    {\n        // use placement new to initialize memory from the previous allocation\n        new (sp.get()) T(wistd::forward<Args>(args)...);\n    }\n    return sp;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `LocalAlloc()` in a context that may not throw upon\nallocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal_nothrow<Foo[]>(size);\nif (foos)\n{\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_ptr<T>>::type make_unique_hlocal_nothrow(\n    size_t size)\n{\n    typedef typename wistd::remove_extent<T>::type E;\n    FAIL_FAST_IF((__WI_SIZE_MAX / sizeof(E)) < size);\n    size_t allocSize = sizeof(E) * size;\n    unique_hlocal_ptr<T> sp(static_cast<E*>(::LocalAlloc(LMEM_FIXED, allocSize)));\n    if (sp)\n    {\n        // use placement new to initialize memory from the previous allocation;\n        // note that array placement new cannot be used as the standard allows for operator new[]\n        // to consume overhead in the allocation for internal bookkeeping\n        for (auto& elem : make_range(static_cast<E*>(sp.get()), size))\n        {\n            new (&elem) E();\n        }\n    }\n    return sp;\n}\n\n/** Provides `std::make_unique()` semantics for resources allocated with `LocalAlloc()` in a context that must fail fast upon\nallocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_hlocal_failfast<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_ptr<T>>::type make_unique_hlocal_failfast(Args&&... args)\n{\n    unique_hlocal_ptr<T> result(make_unique_hlocal_nothrow<T>(wistd::forward<Args>(args)...));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `LocalAlloc()` in a context that must fail fast\nupon allocation failure.\nSee the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal_failfast<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_ptr<T>>::type make_unique_hlocal_failfast(\n    size_t size)\n{\n    unique_hlocal_ptr<T> result(make_unique_hlocal_nothrow<T>(size));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Provides `std::make_unique()` semantics for resources allocated with `LocalAlloc()`.\nSee the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_hlocal<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_ptr<T>>::type make_unique_hlocal(Args&&... args)\n{\n    unique_hlocal_ptr<T> result(make_unique_hlocal_nothrow<T>(wistd::forward<Args>(args)...));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `LocalAlloc()`.\nSee the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_ptr<T>>::type make_unique_hlocal(size_t size)\n{\n    unique_hlocal_ptr<T> result(make_unique_hlocal_nothrow<T>(size));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntypedef unique_any<HLOCAL, decltype(&::LocalFree), ::LocalFree> unique_hlocal;\ntypedef unique_any<PWSTR, decltype(&::LocalFree), ::LocalFree> unique_hlocal_string;\n#ifndef WIL_NO_ANSI_STRINGS\ntypedef unique_any<PSTR, decltype(&::LocalFree), ::LocalFree> unique_hlocal_ansistring;\n#endif // WIL_NO_ANSI_STRINGS\n\n/// @cond\nnamespace details\n{\n    struct localalloc_allocator\n    {\n        static _Ret_opt_bytecap_(size) void* allocate(size_t size) WI_NOEXCEPT\n        {\n            return ::LocalAlloc(LMEM_FIXED, size);\n        }\n    };\n\n    template <>\n    struct string_allocator<unique_hlocal_string> : localalloc_allocator\n    {\n    };\n#ifndef WIL_NO_ANSI_STRINGS\n    template <>\n    struct string_allocator<unique_hlocal_ansistring> : localalloc_allocator\n    {\n    };\n#endif // WIL_NO_ANSI_STRINGS\n} // namespace details\n/// @endcond\n\ninline auto make_hlocal_string_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_nothrow<unique_hlocal_string>(source, length);\n}\n\ninline auto make_hlocal_string_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_failfast<unique_hlocal_string>(source, length);\n}\n\n#ifndef WIL_NO_ANSI_STRINGS\ninline auto make_hlocal_ansistring_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_ansistring_nothrow<unique_hlocal_ansistring>(source, length);\n}\n\ninline auto make_hlocal_ansistring_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_ansistring_failfast<unique_hlocal_ansistring>(source, length);\n}\n#endif\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline auto make_hlocal_string(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    return make_unique_string<unique_hlocal_string>(source, length);\n}\n\n#ifndef WIL_NO_ANSI_STRINGS\ninline auto make_hlocal_ansistring(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    return make_unique_ansistring<unique_hlocal_ansistring>(source, length);\n}\n#endif // WIL_NO_ANSI_STRINGS\n#endif // WIL_ENABLE_EXCEPTIONS\n\nstruct hlocal_secure_deleter\n{\n    template <typename T>\n    void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const\n    {\n        if (p)\n        {\n#pragma warning(suppress : 26006 26007)            // LocalSize() ensures proper buffer length\n            ::SecureZeroMemory(p, ::LocalSize(p)); // this is safe since LocalSize() returns 0 on failure\n            ::LocalFree(p);\n        }\n    }\n};\n\ntemplate <typename T = void>\nusing unique_hlocal_secure_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, hlocal_secure_deleter>;\n\n/** Provides `std::make_unique()` semantics for secure resources allocated with `LocalAlloc()` in a context that may not throw\nupon allocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_hlocal_secure_nothrow<Foo>();\nif (foo)\n{\n// initialize allocated Foo object as appropriate\n}\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure_nothrow(Args&&... args)\n{\n    return unique_hlocal_secure_ptr<T>(make_unique_hlocal_nothrow<T>(wistd::forward<Args>(args)...).release());\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `LocalAlloc()` in a context that may not\nthrow upon allocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal_secure_nothrow<Foo[]>(size);\nif (foos)\n{\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure_nothrow(\n    size_t size)\n{\n    return unique_hlocal_secure_ptr<T>(make_unique_hlocal_nothrow<T>(size).release());\n}\n\n/** Provides `std::make_unique()` semantics for secure resources allocated with `LocalAlloc()` in a context that must fail fast\nupon allocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_hlocal_secure_failfast<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure_failfast(Args&&... args)\n{\n    unique_hlocal_secure_ptr<T> result(make_unique_hlocal_secure_nothrow<T>(wistd::forward<Args>(args)...));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `LocalAlloc()` in a context that must fail\nfast upon allocation failure. See the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal_secure_failfast<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure_failfast(\n    size_t size)\n{\n    unique_hlocal_secure_ptr<T> result(make_unique_hlocal_secure_nothrow<T>(size));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Provides `std::make_unique()` semantics for secure resources allocated with `LocalAlloc()`.\nSee the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_hlocal_secure<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure(Args&&... args)\n{\n    unique_hlocal_secure_ptr<T> result(make_unique_hlocal_secure_nothrow<T>(wistd::forward<Args>(args)...));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `LocalAlloc()`.\nSee the overload of `wil::make_unique_hlocal_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_hlocal_secure<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_hlocal_secure_ptr<T>>::type make_unique_hlocal_secure(\n    size_t size)\n{\n    unique_hlocal_secure_ptr<T> result(make_unique_hlocal_secure_nothrow<T>(size));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntypedef unique_hlocal_secure_ptr<wchar_t[]> unique_hlocal_string_secure;\n\n/** Copies a given string into secure memory allocated with `LocalAlloc()` in a context that may not throw upon allocation\nfailure. See the overload of `wil::make_hlocal_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_hlocal_string_secure_nothrow(L\"a string\");\nRETURN_IF_NULL_ALLOC(str);\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n~~~\n*/\ninline auto make_hlocal_string_secure_nothrow(_In_ PCWSTR source) WI_NOEXCEPT\n{\n    return unique_hlocal_string_secure(make_hlocal_string_nothrow(source).release());\n}\n\n/** Copies a given string into secure memory allocated with `LocalAlloc()` in a context that must fail fast upon allocation\nfailure. See the overload of `wil::make_hlocal_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_hlocal_string_secure_failfast(L\"a string\");\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n~~~\n*/\ninline auto make_hlocal_string_secure_failfast(_In_ PCWSTR source) WI_NOEXCEPT\n{\n    unique_hlocal_string_secure result(make_hlocal_string_secure_nothrow(source));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Copies a given string into secure memory allocated with `LocalAlloc()`.\nSee the overload of `wil::make_hlocal_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_hlocal_string_secure(L\"a string\");\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n~~~\n*/\ninline auto make_hlocal_string_secure(_In_ PCWSTR source)\n{\n    unique_hlocal_string_secure result(make_hlocal_string_secure_nothrow(source));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif\n\nusing hglobal_deleter = function_deleter<decltype(&::GlobalFree), ::GlobalFree>;\n\ntemplate <typename T = void>\nusing unique_hglobal_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, hglobal_deleter>;\n\ntypedef unique_any<HGLOBAL, decltype(&::GlobalFree), ::GlobalFree> unique_hglobal;\ntypedef unique_any<PWSTR, decltype(&::GlobalFree), ::GlobalFree> unique_hglobal_string;\n#ifndef WIL_NO_ANSI_STRINGS\ntypedef unique_any<PSTR, decltype(&::GlobalFree), ::GlobalFree> unique_hglobal_ansistring;\n#endif // WIL_NO_ANSI_STRINGS\n\n/// @cond\nnamespace details\n{\n    template <>\n    struct string_allocator<unique_hglobal_string>\n    {\n        static _Ret_opt_bytecap_(size) void* allocate(size_t size) WI_NOEXCEPT\n        {\n            return ::GlobalAlloc(GPTR, size);\n        }\n    };\n} // namespace details\n/// @endcond\n\ntypedef unique_any_handle_null<decltype(&::HeapDestroy), ::HeapDestroy> unique_hheap;\ntypedef unique_any<DWORD, decltype(&::TlsFree), ::TlsFree, details::pointer_access_all, DWORD, DWORD, TLS_OUT_OF_INDEXES, DWORD> unique_tls;\ntypedef unique_any<PSECURITY_DESCRIPTOR, decltype(&::LocalFree), ::LocalFree> unique_hlocal_security_descriptor;\ntypedef unique_any<PSECURITY_DESCRIPTOR, decltype(&details::DestroyPrivateObjectSecurity), details::DestroyPrivateObjectSecurity> unique_private_security_descriptor;\n\n#if (defined(_WINUSER_) && !defined(__WIL__WINUSER_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WINUSER_\n/// @endcond\ntypedef unique_any<HACCEL, decltype(&::DestroyAcceleratorTable), ::DestroyAcceleratorTable> unique_haccel;\ntypedef unique_any<HCURSOR, decltype(&::DestroyCursor), ::DestroyCursor> unique_hcursor;\ntypedef unique_any<HWND, decltype(&::DestroyWindow), ::DestroyWindow> unique_hwnd;\n#if !defined(NOUSER) && !defined(NOWH)\ntypedef unique_any<HHOOK, decltype(&::UnhookWindowsHookEx), ::UnhookWindowsHookEx> unique_hhook;\n#endif\n#if !defined(NOWINABLE)\ntypedef unique_any<HWINEVENTHOOK, decltype(&::UnhookWinEvent), ::UnhookWinEvent> unique_hwineventhook;\n#endif\n#if !defined(NOCLIPBOARD)\nusing unique_close_clipboard_call = unique_call<decltype(::CloseClipboard), &::CloseClipboard>;\n\ninline unique_close_clipboard_call open_clipboard(HWND hwnd)\n{\n    return unique_close_clipboard_call{OpenClipboard(hwnd) != FALSE};\n}\n#endif\n#endif // __WIL__WINUSER_\n\n#if !defined(NOGDI) && !defined(NODESKTOP)\ntypedef unique_any<HDESK, decltype(&::CloseDesktop), ::CloseDesktop> unique_hdesk;\ntypedef unique_any<HWINSTA, decltype(&::CloseWindowStation), ::CloseWindowStation> unique_hwinsta;\n#endif // !defined(NOGDI) && !defined(NODESKTOP)\n\n#endif\n#if (defined(__WIL_WINBASE_DESKTOP) && !defined(__WIL_WINBASE_DESKTOP_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINBASE_DESKTOP_STL\n/// @endcond\ntypedef shared_any<unique_hheap> shared_hheap;\ntypedef shared_any<unique_hlocal> shared_hlocal;\ntypedef shared_any<unique_tls> shared_tls;\ntypedef shared_any<unique_hlocal_security_descriptor> shared_hlocal_security_descriptor;\ntypedef shared_any<unique_private_security_descriptor> shared_private_security_descriptor;\ntypedef shared_any<unique_haccel> shared_haccel;\ntypedef shared_any<unique_hcursor> shared_hcursor;\n#if !defined(NOGDI) && !defined(NODESKTOP)\ntypedef shared_any<unique_hdesk> shared_hdesk;\ntypedef shared_any<unique_hwinsta> shared_hwinsta;\n#endif // !defined(NOGDI) && !defined(NODESKTOP)\ntypedef shared_any<unique_hwnd> shared_hwnd;\n#if !defined(NOUSER) && !defined(NOWH)\ntypedef shared_any<unique_hhook> shared_hhook;\n#endif\n#if !defined(NOWINABLE)\ntypedef shared_any<unique_hwineventhook> shared_hwineventhook;\n#endif\n\ntypedef weak_any<shared_hheap> weak_hheap;\ntypedef weak_any<shared_hlocal> weak_hlocal;\ntypedef weak_any<shared_tls> weak_tls;\ntypedef weak_any<shared_hlocal_security_descriptor> weak_hlocal_security_descriptor;\ntypedef weak_any<shared_private_security_descriptor> weak_private_security_descriptor;\ntypedef weak_any<shared_haccel> weak_haccel;\ntypedef weak_any<shared_hcursor> weak_hcursor;\n#if !defined(NOGDI) && !defined(NODESKTOP)\ntypedef weak_any<shared_hdesk> weak_hdesk;\ntypedef weak_any<shared_hwinsta> weak_hwinsta;\n#endif // !defined(NOGDI) && !defined(NODESKTOP)\ntypedef weak_any<shared_hwnd> weak_hwnd;\n#if !defined(NOUSER) && !defined(NOWH)\ntypedef weak_any<shared_hhook> weak_hhook;\n#endif\n#if !defined(NOWINABLE)\ntypedef weak_any<shared_hwineventhook> weak_hwineventhook;\n#endif\n#endif // __WIL_WINBASE_DESKTOP_STL\n\n#if (defined(_COMBASEAPI_H_) && !defined(__WIL__COMBASEAPI_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__COMBASEAPI_H_\n/// @endcond\n#if (NTDDI_VERSION >= NTDDI_WIN8)\ntypedef unique_any<CO_MTA_USAGE_COOKIE, decltype(&::CoDecrementMTAUsage), ::CoDecrementMTAUsage> unique_mta_usage_cookie;\n#endif\n\ntypedef unique_any<DWORD, decltype(&::CoRevokeClassObject), ::CoRevokeClassObject> unique_com_class_object_cookie;\n\n/// @cond\nnamespace details\n{\n    inline void __stdcall MultiQiCleanup(_In_ MULTI_QI* multiQi)\n    {\n        if (multiQi->pItf)\n        {\n            multiQi->pItf->Release();\n            multiQi->pItf = nullptr;\n        }\n    }\n} // namespace details\n/// @endcond\n\n//! A type that calls CoRevertToSelf on destruction (or reset()).\nusing unique_coreverttoself_call = unique_call<decltype(&::CoRevertToSelf), ::CoRevertToSelf>;\n\n//! Calls CoImpersonateClient and fail-fasts if it fails; returns an RAII object that reverts\nWI_NODISCARD inline unique_coreverttoself_call CoImpersonateClient_failfast()\n{\n    FAIL_FAST_IF_FAILED(::CoImpersonateClient());\n    return unique_coreverttoself_call();\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\nWI_NODISCARD inline unique_coreverttoself_call CoImpersonateClient()\n{\n    THROW_IF_FAILED(::CoImpersonateClient());\n    return unique_coreverttoself_call();\n}\n#endif\n\ntypedef unique_struct<MULTI_QI, decltype(&details::MultiQiCleanup), details::MultiQiCleanup> unique_multi_qi;\n#endif // __WIL__COMBASEAPI_H_\n#if (defined(__WIL__COMBASEAPI_H_) && !defined(__WIL__COMBASEAPI_H__STL) && defined(WIL_RESOURCE_STL) && (NTDDI_VERSION >= NTDDI_WIN8)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__COMBASEAPI_H__STL\n/// @endcond\ntypedef shared_any<unique_mta_usage_cookie> shared_mta_usage_cookie;\ntypedef weak_any<shared_mta_usage_cookie> weak_mta_usage_cookie;\n#endif // __WIL__COMBASEAPI_H__STL\n\n#if (defined(_COMBASEAPI_H_) && !defined(__WIL__COMBASEAPI_H_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__COMBASEAPI_H_APP\n/// @endcond\n//! A type that calls CoUninitialize on destruction (or reset()).\nusing unique_couninitialize_call = unique_call<decltype(&::CoUninitialize), ::CoUninitialize>;\n\n//! Calls CoInitializeEx and fail-fasts if it fails; returns an RAII object that reverts\nWI_NODISCARD inline unique_couninitialize_call CoInitializeEx_failfast(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/)\n{\n    FAIL_FAST_IF_FAILED(::CoInitializeEx(nullptr, coinitFlags));\n    return {};\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\nWI_NODISCARD inline unique_couninitialize_call CoInitializeEx(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/)\n{\n    THROW_IF_FAILED(::CoInitializeEx(nullptr, coinitFlags));\n    return {};\n}\n#endif\n#endif // __WIL__COMBASEAPI_H_APP\n\n#if (defined(__ROAPI_H_) && !defined(__WIL__ROAPI_H_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) && (NTDDI_VERSION >= NTDDI_WIN8)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__ROAPI_H_APP\n/// @endcond\n\ntypedef unique_any<RO_REGISTRATION_COOKIE, decltype(&::RoRevokeActivationFactories), ::RoRevokeActivationFactories> unique_ro_registration_cookie;\n\n//! A type that calls RoUninitialize on destruction (or reset()).\n//! Use as a replacement for Windows::Foundation::Uninitialize.\nusing unique_rouninitialize_call = unique_call<decltype(&::RoUninitialize), ::RoUninitialize>;\n\n//! Calls RoInitialize and fail-fasts if it fails; returns an RAII object that reverts\n//! Use as a replacement for Windows::Foundation::Initialize\nWI_NODISCARD inline unique_rouninitialize_call RoInitialize_failfast(RO_INIT_TYPE initType = RO_INIT_MULTITHREADED)\n{\n    FAIL_FAST_IF_FAILED(::RoInitialize(initType));\n    return unique_rouninitialize_call();\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Calls RoInitialize and throws an exception if it fails; returns an RAII object that reverts\n//! Use as a replacement for Windows::Foundation::Initialize\nWI_NODISCARD inline unique_rouninitialize_call RoInitialize(RO_INIT_TYPE initType = RO_INIT_MULTITHREADED)\n{\n    THROW_IF_FAILED(::RoInitialize(initType));\n    return unique_rouninitialize_call();\n}\n#endif\n#endif // __WIL__ROAPI_H_APP\n\n#if (defined(__WINSTRING_H_) && !defined(__WIL__WINSTRING_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WINSTRING_H_\n/// @endcond\ntypedef unique_any<HSTRING, decltype(&::WindowsDeleteString), ::WindowsDeleteString> unique_hstring;\n\ntemplate <>\ninline unique_hstring make_unique_string_nothrow<unique_hstring>(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length) WI_NOEXCEPT\n{\n    WI_ASSERT(source != nullptr); // the HSTRING version of this function does not support this case\n    if (length == static_cast<size_t>(-1))\n    {\n        length = wcslen(source);\n    }\n\n    unique_hstring result;\n    ::WindowsCreateString(source, static_cast<UINT32>(length), &result);\n    return result;\n}\n\ntypedef unique_any<HSTRING_BUFFER, decltype(&::WindowsDeleteStringBuffer), ::WindowsDeleteStringBuffer> unique_hstring_buffer;\n\n/** Promotes an hstring_buffer to an HSTRING.\nWhen an HSTRING_BUFFER object is promoted to a real string it must not be passed to WindowsDeleteString. The caller owns the\nHSTRING afterwards.\n~~~\nHRESULT Type::MakePath(_Out_ HSTRING* path)\n{\n    wchar_t* bufferStorage = nullptr;\n    wil::unique_hstring_buffer theBuffer;\n    RETURN_IF_FAILED(::WindowsPreallocateStringBuffer(65, &bufferStorage, &theBuffer));\n    RETURN_IF_FAILED(::PathCchCombine(bufferStorage, 65, m_foo, m_bar));\n    RETURN_IF_FAILED(wil::make_hstring_from_buffer_nothrow(wistd::move(theBuffer), path)));\n    return S_OK;\n}\n~~~\n*/\ninline HRESULT make_hstring_from_buffer_nothrow(unique_hstring_buffer&& source, _Out_ HSTRING* promoted)\n{\n    HRESULT hr = ::WindowsPromoteStringBuffer(source.get(), promoted);\n    if (SUCCEEDED(hr))\n    {\n        source.release();\n    }\n    return hr;\n}\n\n//! A fail-fast variant of `make_hstring_from_buffer_nothrow`\ninline unique_hstring make_hstring_from_buffer_failfast(unique_hstring_buffer&& source)\n{\n    unique_hstring result;\n    FAIL_FAST_IF_FAILED(make_hstring_from_buffer_nothrow(wistd::move(source), &result));\n    return result;\n}\n\n#if defined WIL_ENABLE_EXCEPTIONS\n/** Promotes an hstring_buffer to an HSTRING.\nWhen an HSTRING_BUFFER object is promoted to a real string it must not be passed to WindowsDeleteString. The caller owns the\nHSTRING afterwards.\n~~~\nwil::unique_hstring Type::Make()\n{\n    wchar_t* bufferStorage = nullptr;\n    wil::unique_hstring_buffer theBuffer;\n    THROW_IF_FAILED(::WindowsPreallocateStringBuffer(65, &bufferStorage, &theBuffer));\n    THROW_IF_FAILED(::PathCchCombine(bufferStorage, 65, m_foo, m_bar));\n    return wil::make_hstring_from_buffer(wistd::move(theBuffer));\n}\n~~~\n*/\ninline unique_hstring make_hstring_from_buffer(unique_hstring_buffer&& source)\n{\n    unique_hstring result;\n    THROW_IF_FAILED(make_hstring_from_buffer_nothrow(wistd::move(source), &result));\n    return result;\n}\n#endif\n\n/// @cond\nnamespace details\n{\n    template <>\n    struct string_maker<unique_hstring>\n    {\n        string_maker() = default;\n        string_maker(const string_maker&) = delete;\n        void operator=(const string_maker&) = delete;\n        string_maker& operator=(string_maker&& source) WI_NOEXCEPT\n        {\n            m_value = wistd::move(source.m_value);\n            m_bufferHandle = wistd::move(source.m_bufferHandle);\n            m_charBuffer = wistd::exchange(source.m_charBuffer, nullptr);\n            return *this;\n        }\n\n        HRESULT make(\n            _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n                _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) const wchar_t* source,\n            size_t length)\n        {\n            if (source)\n            {\n                RETURN_IF_FAILED(WindowsCreateString(source, static_cast<UINT32>(length), &m_value));\n                m_charBuffer = nullptr;\n                m_bufferHandle.reset(); // do this after WindowsCreateString so we can trim_at_existing_null() from our own buffer\n            }\n            else\n            {\n                // Need to set it to the empty string to support the empty string case.\n                m_value.reset();\n                RETURN_IF_FAILED(WindowsPreallocateStringBuffer(static_cast<UINT32>(length), &m_charBuffer, &m_bufferHandle));\n            }\n            return S_OK;\n        }\n\n        WI_NODISCARD wchar_t* buffer()\n        {\n            WI_ASSERT(m_charBuffer != nullptr);\n            return m_charBuffer;\n        }\n        WI_NODISCARD const wchar_t* buffer() const\n        {\n            return m_charBuffer;\n        }\n\n        HRESULT trim_at_existing_null(size_t length)\n        {\n            return make(buffer(), length);\n        }\n\n        unique_hstring release()\n        {\n            m_charBuffer = nullptr;\n            if (m_bufferHandle)\n            {\n                return make_hstring_from_buffer_failfast(wistd::move(m_bufferHandle));\n            }\n            return wistd::move(m_value);\n        }\n\n        static PCWSTR get(const wil::unique_hstring& value)\n        {\n            return WindowsGetStringRawBuffer(value.get(), nullptr);\n        }\n\n    private:\n        unique_hstring m_value;\n        unique_hstring_buffer m_bufferHandle;\n        wchar_t* m_charBuffer = nullptr;\n    };\n} // namespace details\n/// @endcond\n\n// str_raw_ptr is an overloaded function that retrieves a const pointer to the first character in a string's buffer.\n// This is the overload for HSTRING.  Other overloads available above.\ninline PCWSTR str_raw_ptr(HSTRING str)\n{\n    return WindowsGetStringRawBuffer(str, nullptr);\n}\n\ninline PCWSTR str_raw_ptr(const unique_hstring& str)\n{\n    return str_raw_ptr(str.get());\n}\n\n#endif // __WIL__WINSTRING_H_\n#if (defined(__WIL__WINSTRING_H_) && !defined(__WIL__WINSTRING_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WINSTRING_H_STL\n/// @endcond\ntypedef shared_any<unique_hstring> shared_hstring;\ntypedef shared_any<unique_hstring_buffer> shared_hstring_buffer;\ntypedef weak_any<shared_hstring> weak_hstring;\ntypedef weak_any<shared_hstring_buffer> weak_hstring_buffer;\n#endif // __WIL__WINSTRING_H_STL\n\n#if (defined(_WINREG_) && !defined(__WIL_WINREG_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINREG_\n/// @endcond\ntypedef unique_any<HKEY, decltype(&::RegCloseKey), ::RegCloseKey> unique_hkey;\n#endif // __WIL_WINREG_\n#if (defined(__WIL_WINREG_) && !defined(__WIL_WINREG_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINREG_STL\n/// @endcond\ntypedef shared_any<unique_hkey> shared_hkey;\ntypedef weak_any<shared_hkey> weak_hkey;\n#endif // __WIL_WINREG_STL\n\n#if (defined(__propidl_h__) && !defined(_WIL__propidl_h__) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define _WIL__propidl_h__\n/// @endcond\n// if language extensions (/Za) disabled, PropVariantInit will not exist, PROPVARIANT has forward declaration only\n#if defined(_MSC_EXTENSIONS)\nusing unique_prop_variant =\n    wil::unique_struct<PROPVARIANT, decltype(&::PropVariantClear), ::PropVariantClear, decltype(&::PropVariantInit), ::PropVariantInit>;\n#endif\n#endif // _WIL__propidl_h__\n\n#if (defined(_OLEAUTO_H_) && !defined(__WIL_OLEAUTO_H_) && !defined(WIL_KERNEL_MODE) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OLEAUTO_H_\n/// @endcond\nusing unique_variant = wil::unique_struct<VARIANT, decltype(&::VariantClear), ::VariantClear, decltype(&::VariantInit), ::VariantInit>;\ntypedef unique_any<BSTR, decltype(&::SysFreeString), ::SysFreeString> unique_bstr;\n\ninline wil::unique_bstr make_bstr_nothrow(PCWSTR source) WI_NOEXCEPT\n{\n    return wil::unique_bstr(::SysAllocString(source));\n}\n\ninline wil::unique_bstr make_bstr_failfast(PCWSTR source) WI_NOEXCEPT\n{\n    return wil::unique_bstr(FAIL_FAST_IF_NULL_ALLOC(::SysAllocString(source)));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline wil::unique_bstr make_bstr(PCWSTR source)\n{\n    wil::unique_bstr result(make_bstr_nothrow(source));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ninline wil::unique_variant make_variant_bstr_nothrow(PCWSTR source) WI_NOEXCEPT\n{\n    wil::unique_variant result{};\n    V_UNION(result.addressof(), bstrVal) = ::SysAllocString(source);\n    if (V_UNION(result.addressof(), bstrVal) != nullptr)\n    {\n        V_VT(result.addressof()) = VT_BSTR;\n    }\n    return result;\n}\n\ninline wil::unique_variant make_variant_bstr_failfast(PCWSTR source) WI_NOEXCEPT\n{\n    auto result{make_variant_bstr_nothrow(source)};\n    FAIL_FAST_HR_IF(E_OUTOFMEMORY, V_VT(result.addressof()) == VT_EMPTY);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline wil::unique_variant make_variant_bstr(PCWSTR source)\n{\n    auto result{make_variant_bstr_nothrow(source)};\n    THROW_HR_IF(E_OUTOFMEMORY, V_VT(result.addressof()) == VT_EMPTY);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#endif // __WIL_OLEAUTO_H_\n#if (defined(__WIL_OLEAUTO_H_) && !defined(__WIL_OLEAUTO_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OLEAUTO_H_STL\n/// @endcond\ntypedef shared_any<unique_bstr> shared_bstr;\ntypedef weak_any<shared_bstr> weak_bstr;\n#endif // __WIL_OLEAUTO_H_STL\n\n#if ((defined(_WININET_) || defined(_DUBINET_)) && !defined(__WIL_WININET_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WININET_\n/// @endcond\ntypedef unique_any<HINTERNET, decltype(&::InternetCloseHandle), ::InternetCloseHandle> unique_hinternet;\n#endif // __WIL_WININET_\n#if (defined(__WIL_WININET_) && !defined(__WIL_WININET_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WININET_STL\n/// @endcond\ntypedef shared_any<unique_hinternet> shared_hinternet;\ntypedef weak_any<shared_hinternet> weak_hinternet;\n#endif // __WIL_WININET_STL\n\n#if (defined(_WINHTTPX_) && !defined(__WIL_WINHTTP_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINHTTP_\n/// @endcond\ntypedef unique_any<HINTERNET, decltype(&::WinHttpCloseHandle), ::WinHttpCloseHandle> unique_winhttp_hinternet;\n#endif // __WIL_WINHTTP_\n#if (defined(__WIL_WINHTTP_) && !defined(__WIL_WINHTTP_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINHTTP_STL\n/// @endcond\ntypedef shared_any<unique_winhttp_hinternet> shared_winhttp_hinternet;\ntypedef weak_any<shared_winhttp_hinternet> weak_winhttp_hinternet;\n#endif // __WIL_WINHTTP_STL\n\n#if (defined(_WINSOCKAPI_) && !defined(__WIL_WINSOCKAPI_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINSOCKAPI_\n/// @endcond\ntypedef unique_any<SOCKET, int(WINAPI*)(SOCKET), ::closesocket, details::pointer_access_all, SOCKET, SOCKET, INVALID_SOCKET, SOCKET> unique_socket;\n#endif // __WIL_WINSOCKAPI_\n#if (defined(__WIL_WINSOCKAPI_) && !defined(__WIL_WINSOCKAPI_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINSOCKAPI_STL\n/// @endcond\ntypedef shared_any<unique_socket> shared_socket;\ntypedef weak_any<shared_socket> weak_socket;\n#endif // __WIL_WINSOCKAPI_STL\n\n#if (defined(_WINGDI_) && !defined(__WIL_WINGDI_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(NOGDI) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINGDI_\n/// @endcond\nstruct window_dc\n{\n    HDC dc;\n    HWND hwnd;\n    window_dc(HDC dc_, HWND hwnd_ = nullptr) WI_NOEXCEPT\n    {\n        dc = dc_;\n        hwnd = hwnd_;\n    }\n    WI_NODISCARD operator HDC() const WI_NOEXCEPT\n    {\n        return dc;\n    }\n    static void close(window_dc wdc) WI_NOEXCEPT\n    {\n        ::ReleaseDC(wdc.hwnd, wdc.dc);\n    }\n};\ntypedef unique_any<HDC, decltype(&window_dc::close), window_dc::close, details::pointer_access_all, window_dc> unique_hdc_window;\n\nstruct paint_dc\n{\n    HWND hwnd;\n    PAINTSTRUCT ps;\n    paint_dc(HDC hdc = nullptr)\n    {\n        ::ZeroMemory(this, sizeof(*this));\n        ps.hdc = hdc;\n    }\n    WI_NODISCARD operator HDC() const WI_NOEXCEPT\n    {\n        return ps.hdc;\n    }\n    static void close(paint_dc pdc) WI_NOEXCEPT\n    {\n        ::EndPaint(pdc.hwnd, &pdc.ps);\n    }\n};\ntypedef unique_any<HDC, decltype(&paint_dc::close), paint_dc::close, details::pointer_access_all, paint_dc> unique_hdc_paint;\n\nstruct select_result\n{\n    HGDIOBJ hgdi;\n    HDC hdc;\n    select_result(HGDIOBJ hgdi_, HDC hdc_ = nullptr) WI_NOEXCEPT\n    {\n        hgdi = hgdi_;\n        hdc = hdc_;\n    }\n    WI_NODISCARD operator HGDIOBJ() const WI_NOEXCEPT\n    {\n        return hgdi;\n    }\n    static void close(select_result sr) WI_NOEXCEPT\n    {\n        ::SelectObject(sr.hdc, sr.hgdi);\n    }\n};\ntypedef unique_any<HGDIOBJ, decltype(&select_result::close), select_result::close, details::pointer_access_all, select_result> unique_select_object;\n\ninline unique_hdc_window GetDC(HWND hwnd) WI_NOEXCEPT\n{\n    return unique_hdc_window(window_dc(::GetDC(hwnd), hwnd));\n}\n\ninline unique_hdc_window GetWindowDC(HWND hwnd) WI_NOEXCEPT\n{\n    return unique_hdc_window(window_dc(::GetWindowDC(hwnd), hwnd));\n}\n\ninline unique_hdc_paint BeginPaint(HWND hwnd, _Out_opt_ PPAINTSTRUCT pPaintStruct = nullptr) WI_NOEXCEPT\n{\n    paint_dc pdc;\n    pdc.hwnd = hwnd;\n    HDC hdc = ::BeginPaint(hwnd, &pdc.ps);\n    assign_to_opt_param(pPaintStruct, pdc.ps);\n    return (hdc == nullptr) ? unique_hdc_paint() : unique_hdc_paint(pdc);\n}\n\ninline unique_select_object SelectObject(HDC hdc, HGDIOBJ gdiobj) WI_NOEXCEPT\n{\n    return unique_select_object(select_result(::SelectObject(hdc, gdiobj), hdc));\n}\n\ntypedef unique_any<HGDIOBJ, decltype(&::DeleteObject), ::DeleteObject> unique_hgdiobj;\ntypedef unique_any<HPEN, decltype(&::DeleteObject), ::DeleteObject> unique_hpen;\ntypedef unique_any<HBRUSH, decltype(&::DeleteObject), ::DeleteObject> unique_hbrush;\ntypedef unique_any<HFONT, decltype(&::DeleteObject), ::DeleteObject> unique_hfont;\ntypedef unique_any<HBITMAP, decltype(&::DeleteObject), ::DeleteObject> unique_hbitmap;\ntypedef unique_any<HRGN, decltype(&::DeleteObject), ::DeleteObject> unique_hrgn;\ntypedef unique_any<HPALETTE, decltype(&::DeleteObject), ::DeleteObject> unique_hpalette;\ntypedef unique_any<HDC, decltype(&::DeleteDC), ::DeleteDC> unique_hdc;\ntypedef unique_any<HICON, decltype(&::DestroyIcon), ::DestroyIcon> unique_hicon;\n#if !defined(NOMENUS)\ntypedef unique_any<HMENU, decltype(&::DestroyMenu), ::DestroyMenu> unique_hmenu;\n#endif // !defined(NOMENUS)\n#endif // __WIL_WINGDI_\n#if (defined(__WIL_WINGDI_) && !defined(__WIL_WINGDI_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINGDI_STL\n/// @endcond\ntypedef shared_any<unique_hgdiobj> shared_hgdiobj;\ntypedef shared_any<unique_hpen> shared_hpen;\ntypedef shared_any<unique_hbrush> shared_hbrush;\ntypedef shared_any<unique_hfont> shared_hfont;\ntypedef shared_any<unique_hbitmap> shared_hbitmap;\ntypedef shared_any<unique_hrgn> shared_hrgn;\ntypedef shared_any<unique_hpalette> shared_hpalette;\ntypedef shared_any<unique_hdc> shared_hdc;\ntypedef shared_any<unique_hicon> shared_hicon;\n#if !defined(NOMENUS)\ntypedef shared_any<unique_hmenu> shared_hmenu;\n#endif // !defined(NOMENUS)\n\ntypedef weak_any<shared_hgdiobj> weak_hgdiobj;\ntypedef weak_any<shared_hpen> weak_hpen;\ntypedef weak_any<shared_hbrush> weak_hbrush;\ntypedef weak_any<shared_hfont> weak_hfont;\ntypedef weak_any<shared_hbitmap> weak_hbitmap;\ntypedef weak_any<shared_hrgn> weak_hrgn;\ntypedef weak_any<shared_hpalette> weak_hpalette;\ntypedef weak_any<shared_hdc> weak_hdc;\ntypedef weak_any<shared_hicon> weak_hicon;\n#if !defined(NOMENUS)\ntypedef weak_any<shared_hmenu> weak_hmenu;\n#endif // !defined(NOMENUS)\n#endif // __WIL_WINGDI_STL\n\n#if (defined(_INC_WTSAPI) && !defined(__WIL_WTSAPI)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WTSAPI\n/// @endcond\ntemplate <typename T>\nusing unique_wtsmem_ptr =\n    wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, function_deleter<decltype(&WTSFreeMemory), WTSFreeMemory>>;\n#endif // __WIL_WTSAPI\n\n#if (defined(_INC_WTSAPI) && !defined(__WIL_WTSAPI_WTSVIRTUALCHANNELCLOSE)) || defined(WIL_DOXYGEN)\n#define __WIL_WTSAPI_WTSVIRTUALCHANNELCLOSE\ntypedef unique_any_handle_null<decltype(&::WTSVirtualChannelClose), ::WTSVirtualChannelClose> unique_channel_handle;\n#endif // __WIL_WTSAPI_WTSVIRTUALCHANNELCLOSE\n\n#if (defined(_WINSCARD_H_) && !defined(__WIL_WINSCARD_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINSCARD_H_\n/// @endcond\ntypedef unique_any<SCARDCONTEXT, decltype(&::SCardReleaseContext), ::SCardReleaseContext> unique_scardctx;\n#endif // __WIL_WINSCARD_H_\n#if (defined(__WIL_WINSCARD_H_) && !defined(__WIL_WINSCARD_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINSCARD_H_STL\n/// @endcond\ntypedef shared_any<unique_scardctx> shared_scardctx;\ntypedef weak_any<shared_scardctx> weak_scardctx;\n#endif // __WIL_WINSCARD_H_STL\n\n#if (defined(__WINCRYPT_H__) && !defined(__WIL__WINCRYPT_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WINCRYPT_H__\nnamespace details\n{\n    inline void __stdcall CertCloseStoreNoParam(_Pre_opt_valid_ _Frees_ptr_opt_ HCERTSTORE hCertStore) WI_NOEXCEPT\n    {\n        ::CertCloseStore(hCertStore, 0);\n    }\n\n    inline void __stdcall CryptReleaseContextNoParam(_Pre_opt_valid_ _Frees_ptr_opt_ HCRYPTPROV hCryptCtx) WI_NOEXCEPT\n    {\n        ::CryptReleaseContext(hCryptCtx, 0);\n    }\n} // namespace details\n/// @endcond\n\nstruct cert_context_t\n    : details::unique_storage<details::resource_policy<PCCERT_CONTEXT, decltype(&::CertFreeCertificateContext), ::CertFreeCertificateContext>>\n{\n    // forward all base class constructors...\n    template <typename... args_t>\n    explicit cert_context_t(args_t&&... args) WI_NOEXCEPT : unique_storage(wistd::forward<args_t>(args)...)\n    {\n    }\n\n    /** A wrapper around CertEnumCertificatesInStore.\n    CertEnumCertificatesInStore takes ownership of its second parameter in an unclear fashion,\n    making it error-prone to use in combination with unique_cert_context. This wrapper helps\n    manage the resource correctly while ensuring the GetLastError state set by CertEnumCertificatesInStore.\n    is not lost. See MSDN for more information on `CertEnumCertificatesInStore`.\n    ~~~~\n    void MyMethod(HCERTSTORE certStore)\n    {\n        wil::unique_cert_context enumCert;\n        while (enumCert.CertEnumCertificatesInStore(certStore))\n        {\n            UseTheCertToDoTheThing(enumCert);\n        }\n    }\n    ~~~~\n    @param certStore A handle of a certificate store.\n    @return 'true' if a certificate was enumerated by this call, false otherwise.\n    */\n    bool CertEnumCertificatesInStore(HCERTSTORE certStore) WI_NOEXCEPT\n    {\n        reset(::CertEnumCertificatesInStore(certStore, release()));\n        return is_valid();\n    }\n};\n\n// Warning - ::CertEnumCertificatesInStore takes ownership of its parameter. Prefer the\n// .CertEnumCertificatesInStore method of the unique_cert_context or else use .release\n// when calling ::CertEnumCertificatesInStore directly.\ntypedef unique_any_t<cert_context_t> unique_cert_context;\ntypedef unique_any<PCCERT_CHAIN_CONTEXT, decltype(&::CertFreeCertificateChain), ::CertFreeCertificateChain> unique_cert_chain_context;\ntypedef unique_any<HCERTSTORE, decltype(&details::CertCloseStoreNoParam), details::CertCloseStoreNoParam> unique_hcertstore;\ntypedef unique_any<HCRYPTPROV, decltype(&details::CryptReleaseContextNoParam), details::CryptReleaseContextNoParam> unique_hcryptprov;\ntypedef unique_any<HCRYPTKEY, decltype(&::CryptDestroyKey), ::CryptDestroyKey> unique_hcryptkey;\ntypedef unique_any<HCRYPTHASH, decltype(&::CryptDestroyHash), ::CryptDestroyHash> unique_hcrypthash;\ntypedef unique_any<HCRYPTMSG, decltype(&::CryptMsgClose), ::CryptMsgClose> unique_hcryptmsg;\n#endif // __WIL__WINCRYPT_H__\n#if (defined(__WIL__WINCRYPT_H__) && !defined(__WIL__WINCRYPT_H__STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__WINCRYPT_H__STL\n/// @endcond\ntypedef shared_any<unique_cert_context> shared_cert_context;\ntypedef shared_any<unique_cert_chain_context> shared_cert_chain_context;\ntypedef shared_any<unique_hcertstore> shared_hcertstore;\ntypedef shared_any<unique_hcryptprov> shared_hcryptprov;\ntypedef shared_any<unique_hcryptkey> shared_hcryptkey;\ntypedef shared_any<unique_hcrypthash> shared_hcrypthash;\ntypedef shared_any<unique_hcryptmsg> shared_hcryptmsg;\n\ntypedef weak_any<shared_cert_context> weak_cert_context;\ntypedef weak_any<shared_cert_chain_context> weak_cert_chain_context;\ntypedef weak_any<shared_hcertstore> weak_hcertstore;\ntypedef weak_any<shared_hcryptprov> weak_hcryptprov;\ntypedef weak_any<shared_hcryptkey> weak_hcryptkey;\ntypedef weak_any<shared_hcrypthash> weak_hcrypthash;\ntypedef weak_any<shared_hcryptmsg> weak_hcryptmsg;\n#endif // __WIL__WINCRYPT_H__STL\n\n#if (defined(__NCRYPT_H__) && !defined(__WIL_NCRYPT_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NCRYPT_H__\n/// @endcond\nusing ncrypt_deleter = function_deleter<decltype(&::NCryptFreeBuffer), NCryptFreeBuffer>;\n\ntemplate <typename T>\nusing unique_ncrypt_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, ncrypt_deleter>;\n\ntypedef unique_any<NCRYPT_PROV_HANDLE, decltype(&::NCryptFreeObject), ::NCryptFreeObject> unique_ncrypt_prov;\ntypedef unique_any<NCRYPT_KEY_HANDLE, decltype(&::NCryptFreeObject), ::NCryptFreeObject> unique_ncrypt_key;\ntypedef unique_any<NCRYPT_SECRET_HANDLE, decltype(&::NCryptFreeObject), ::NCryptFreeObject> unique_ncrypt_secret;\n#endif // __WIL_NCRYPT_H__\n#if (defined(__WIL_NCRYPT_H__) && !defined(__WIL_NCRYPT_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NCRYPT_H_STL\n/// @endcond\ntypedef shared_any<unique_ncrypt_prov> shared_ncrypt_prov;\ntypedef shared_any<unique_ncrypt_key> shared_ncrypt_key;\ntypedef shared_any<unique_ncrypt_secret> shared_ncrypt_secret;\n\ntypedef weak_any<shared_ncrypt_prov> weak_ncrypt_prov;\ntypedef weak_any<shared_ncrypt_key> weak_ncrypt_key;\ntypedef weak_any<shared_ncrypt_secret> weak_ncrypt_secret;\n#endif // __WIL_NCRYPT_H_STL\n\n#if (defined(__BCRYPT_H__) && !defined(__WIL_BCRYPT_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_BCRYPT_H__\nnamespace details\n{\n    inline void __stdcall BCryptCloseAlgorithmProviderNoFlags(_Pre_opt_valid_ _Frees_ptr_opt_ BCRYPT_ALG_HANDLE hAlgorithm) WI_NOEXCEPT\n    {\n        if (hAlgorithm)\n        {\n            ::BCryptCloseAlgorithmProvider(hAlgorithm, 0);\n        }\n    }\n} // namespace details\n/// @endcond\n\nusing bcrypt_deleter = function_deleter<decltype(&::BCryptFreeBuffer), BCryptFreeBuffer>;\n\ntemplate <typename T>\nusing unique_bcrypt_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, bcrypt_deleter>;\n\ntypedef unique_any<BCRYPT_ALG_HANDLE, decltype(&details::BCryptCloseAlgorithmProviderNoFlags), details::BCryptCloseAlgorithmProviderNoFlags> unique_bcrypt_algorithm;\ntypedef unique_any<BCRYPT_HASH_HANDLE, decltype(&::BCryptDestroyHash), ::BCryptDestroyHash> unique_bcrypt_hash;\ntypedef unique_any<BCRYPT_KEY_HANDLE, decltype(&::BCryptDestroyKey), ::BCryptDestroyKey> unique_bcrypt_key;\ntypedef unique_any<BCRYPT_SECRET_HANDLE, decltype(&::BCryptDestroySecret), ::BCryptDestroySecret> unique_bcrypt_secret;\n#endif // __WIL_BCRYPT_H__\n#if (defined(__WIL_BCRYPT_H__) && !defined(__WIL_BCRYPT_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_BCRYPT_H_STL\n/// @endcond\ntypedef shared_any<unique_bcrypt_algorithm> shared_bcrypt_algorithm;\ntypedef shared_any<unique_bcrypt_hash> shared_bcrypt_hash;\ntypedef shared_any<unique_bcrypt_key> shared_bcrypt_key;\ntypedef shared_any<unique_bcrypt_secret> shared_bcrypt_secret;\n\ntypedef weak_any<shared_bcrypt_algorithm> weak_bcrypt_algorithm;\ntypedef weak_any<shared_bcrypt_hash> weak_bcrypt_hash;\ntypedef weak_any<unique_bcrypt_key> weak_bcrypt_key;\ntypedef weak_any<shared_bcrypt_secret> weak_bcrypt_secret;\n#endif // __WIL_BCRYPT_H_STL\n\n#if (defined(__RPCNDR_H__) && !defined(__WIL__RPCNDR_H__) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__RPCNDR_H__\n/// @endcond\n\n//! Function deleter for use with pointers allocated by MIDL_user_allocate\nusing midl_deleter = function_deleter<decltype(&::MIDL_user_free), MIDL_user_free>;\n\n//! Unique-ptr holding a type allocated by MIDL_user_alloc or returned from an RPC invocation\ntemplate <typename T = void>\nusing unique_midl_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, midl_deleter>;\n\n//! Unique-ptr for strings allocated by MIDL_user_alloc\nusing unique_midl_string = unique_midl_ptr<wchar_t>;\n#ifndef WIL_NO_ANSI_STRINGS\nusing unique_midl_ansistring = unique_midl_ptr<char>;\n#endif\n\n/// @cond\nnamespace details\n{\n    struct midl_allocator\n    {\n        static _Ret_opt_bytecap_(size) void* allocate(size_t size) WI_NOEXCEPT\n        {\n            return ::MIDL_user_allocate(size);\n        }\n    };\n\n    // Specialization to support construction of unique_midl_string instances\n    template <>\n    struct string_allocator<unique_midl_string> : midl_allocator\n    {\n    };\n\n#ifndef WIL_NO_ANSI_STRINGS\n    template <>\n    struct string_allocator<unique_midl_ansistring> : midl_allocator\n    {\n    };\n#endif\n} // namespace details\n/// @endcond\n#endif // __WIL__RPCNDR_H__\n\n#if (defined(_OBJBASE_H_) && !defined(__WIL_OBJBASE_H_) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OBJBASE_H_\n/// @endcond\nusing cotaskmem_deleter = function_deleter<decltype(&::CoTaskMemFree), ::CoTaskMemFree>;\n\ntemplate <typename T = void>\nusing unique_cotaskmem_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, cotaskmem_deleter>;\n\ntemplate <typename T>\nusing unique_cotaskmem_array_ptr = unique_array_ptr<T, cotaskmem_deleter>;\n\n/** Provides `std::make_unique()` semantics for resources allocated with `CoTaskMemAlloc()` in a context that may not throw upon\nallocation failure. Use `wil::make_unique_cotaskmem_nothrow()` for resources returned from APIs that must satisfy a memory\nallocation contract that requires the use of `CoTaskMemAlloc()` / `CoTaskMemFree()`. Use `wil::make_unique_nothrow()` when\n`CoTaskMemAlloc()` is not required.\n\nAllocations are initialized with placement new and will call constructors (if present), but this does not guarantee\ninitialization.\n\nNote that `wil::make_unique_cotaskmem_nothrow()` is not marked WI_NOEXCEPT as it may be used to create an exception-based class\nthat may throw in its constructor.\n@code\nauto foo = wil::make_unique_cotaskmem_nothrow<Foo>();\nif (foo)\n{\n// initialize allocated Foo object as appropriate\n}\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem_nothrow(Args&&... args)\n{\n    unique_cotaskmem_ptr<T> sp(static_cast<T*>(::CoTaskMemAlloc(sizeof(T))));\n    if (sp)\n    {\n        // use placement new to initialize memory from the previous allocation\n        new (sp.get()) T(wistd::forward<Args>(args)...);\n    }\n    return sp;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `CoTaskMemAlloc()` in a context that may not throw\nupon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem_nothrow<Foo[]>(size);\nif (foos)\n{\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem_nothrow(\n    size_t size)\n{\n    typedef typename wistd::remove_extent<T>::type E;\n    FAIL_FAST_IF((__WI_SIZE_MAX / sizeof(E)) < size);\n    size_t allocSize = sizeof(E) * size;\n    unique_cotaskmem_ptr<T> sp(static_cast<E*>(::CoTaskMemAlloc(allocSize)));\n    if (sp)\n    {\n        // use placement new to initialize memory from the previous allocation;\n        // note that array placement new cannot be used as the standard allows for operator new[]\n        // to consume overhead in the allocation for internal bookkeeping\n        for (auto& elem : make_range(static_cast<E*>(sp.get()), size))\n        {\n            new (&elem) E();\n        }\n    }\n    return sp;\n}\n\n/** Provides `std::make_unique()` semantics for resources allocated with `CoTaskMemAlloc()` in a context that must fail fast upon\nallocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_cotaskmem_failfast<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem_failfast(Args&&... args)\n{\n    unique_cotaskmem_ptr<T> result(make_unique_cotaskmem_nothrow<T>(wistd::forward<Args>(args)...));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `CoTaskMemAlloc()` in a context that must fail fast\nupon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem_failfast<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem_failfast(\n    size_t size)\n{\n    unique_cotaskmem_ptr<T> result(make_unique_cotaskmem_nothrow<T>(size));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Provides `std::make_unique()` semantics for resources allocated with `CoTaskMemAlloc()`.\nSee the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_cotaskmem<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem(Args&&... args)\n{\n    unique_cotaskmem_ptr<T> result(make_unique_cotaskmem_nothrow<T>(wistd::forward<Args>(args)...));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for array resources allocated with `CoTaskMemAlloc()`.\nSee the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_ptr<T>>::type make_unique_cotaskmem(size_t size)\n{\n    unique_cotaskmem_ptr<T> result(make_unique_cotaskmem_nothrow<T>(size));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntypedef unique_any<void*, decltype(&::CoTaskMemFree), ::CoTaskMemFree> unique_cotaskmem;\ntypedef unique_any<PWSTR, decltype(&::CoTaskMemFree), ::CoTaskMemFree> unique_cotaskmem_string;\n#ifndef WIL_NO_ANSI_STRINGS\ntypedef unique_any<PSTR, decltype(&::CoTaskMemFree), ::CoTaskMemFree> unique_cotaskmem_ansistring;\n#endif // WIL_NO_ANSI_STRINGS\n\n/// @cond\nnamespace details\n{\n    struct cotaskmem_allocator\n    {\n        static _Ret_opt_bytecap_(size) void* allocate(size_t size) WI_NOEXCEPT\n        {\n            return ::CoTaskMemAlloc(size);\n        }\n    };\n\n    template <>\n    struct string_allocator<unique_cotaskmem_string> : cotaskmem_allocator\n    {\n    };\n\n#ifndef WIL_NO_ANSI_STRINGS\n    template <>\n    struct string_allocator<unique_cotaskmem_ansistring> : cotaskmem_allocator\n    {\n    };\n#endif // WIL_NO_ANSI_STRINGS\n} // namespace details\n/// @endcond\n\ninline auto make_cotaskmem_string_nothrow(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_nothrow<unique_cotaskmem_string>(source, length);\n}\n\ninline auto make_cotaskmem_string_failfast(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1)) WI_NOEXCEPT\n{\n    return make_unique_string_failfast<unique_cotaskmem_string>(source, length);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ninline auto make_cotaskmem_string(\n    _When_((source != nullptr) && length != static_cast<size_t>(-1), _In_reads_(length))\n        _When_((source != nullptr) && length == static_cast<size_t>(-1), _In_z_) PCWSTR source,\n    size_t length = static_cast<size_t>(-1))\n{\n    return make_unique_string<unique_cotaskmem_string>(source, length);\n}\n\n#endif // WIL_ENABLE_EXCEPTIONS\n#endif // __WIL_OBJBASE_H_\n#if (defined(__WIL_OBJBASE_H_) && !defined(__WIL_OBJBASE_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OBJBASE_H_STL\n/// @endcond\ntypedef shared_any<unique_cotaskmem> shared_cotaskmem;\ntypedef weak_any<shared_cotaskmem> weak_cotaskmem;\ntypedef shared_any<unique_cotaskmem_string> shared_cotaskmem_string;\ntypedef weak_any<shared_cotaskmem_string> weak_cotaskmem_string;\n#endif // __WIL_OBJBASE_H_STL\n\n#if (defined(__WIL_OBJBASE_H_) && defined(__WIL_WINBASE_) && !defined(__WIL_OBJBASE_AND_WINBASE_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OBJBASE_AND_WINBASE_H_\n/// @endcond\n\nstruct cotaskmem_secure_deleter\n{\n    template <typename T>\n    void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const\n    {\n        if (p)\n        {\n            IMalloc* malloc;\n            if (SUCCEEDED(::CoGetMalloc(1, &malloc)))\n            {\n                size_t const size = malloc->GetSize(p);\n                if (size != static_cast<size_t>(-1))\n                {\n                    ::SecureZeroMemory(p, size);\n                }\n                malloc->Release();\n            }\n            ::CoTaskMemFree(p);\n        }\n    }\n};\n\ntemplate <typename T = void>\nusing unique_cotaskmem_secure_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, cotaskmem_secure_deleter>;\n\n/** Provides `std::make_unique()` semantics for secure resources allocated with `CoTaskMemAlloc()` in a context that may not throw\nupon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_cotaskmem_secure_nothrow<Foo>();\nif (foo)\n{\n// initialize allocated Foo object as appropriate\n}\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure_nothrow(\n    Args&&... args)\n{\n    return unique_cotaskmem_secure_ptr<T>(make_unique_cotaskmem_nothrow<T>(wistd::forward<Args>(args)...).release());\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `CoTaskMemAlloc()` in a context that may not\nthrow upon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem_secure_nothrow<Foo[]>(size);\nif (foos)\n{\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure_nothrow(\n    size_t size)\n{\n    return unique_cotaskmem_secure_ptr<T>(make_unique_cotaskmem_nothrow<T>(size).release());\n}\n\n/** Provides `std::make_unique()` semantics for secure resources allocated with `CoTaskMemAlloc()` in a context that must fail\nfast upon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_cotaskmem_secure_failfast<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure_failfast(\n    Args&&... args)\n{\n    unique_cotaskmem_secure_ptr<T> result(make_unique_cotaskmem_secure_nothrow<T>(wistd::forward<Args>(args)...));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `CoTaskMemAlloc()` in a context that must\nfail fast upon allocation failure. See the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more\ndetails.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem_secure_failfast<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure_failfast(\n    size_t size)\n{\n    unique_cotaskmem_secure_ptr<T> result(make_unique_cotaskmem_secure_nothrow<T>(size));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Provides `std::make_unique()` semantics for secure resources allocated with `CoTaskMemAlloc()`.\nSee the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nauto foo = wil::make_unique_cotaskmem_secure<Foo>();\n// initialize allocated Foo object as appropriate\n@endcode\n*/\ntemplate <typename T, typename... Args>\ninline typename wistd::enable_if<!wistd::is_array<T>::value, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure(Args&&... args)\n{\n    unique_cotaskmem_secure_ptr<T> result(make_unique_cotaskmem_secure_nothrow<T>(wistd::forward<Args>(args)...));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n\n/** Provides `std::make_unique()` semantics for secure array resources allocated with `CoTaskMemAlloc()`.\nSee the overload of `wil::make_unique_cotaskmem_nothrow()` for non-array types for more details.\n@code\nconst size_t size = 42;\nauto foos = wil::make_unique_cotaskmem_secure<Foo[]>(size);\nfor (auto& elem : wil::make_range(foos.get(), size))\n{\n// initialize allocated Foo objects as appropriate\n}\n@endcode\n*/\ntemplate <typename T>\ninline typename wistd::enable_if<wistd::is_array<T>::value && wistd::extent<T>::value == 0, unique_cotaskmem_secure_ptr<T>>::type make_unique_cotaskmem_secure(\n    size_t size)\n{\n    unique_cotaskmem_secure_ptr<T> result(make_unique_cotaskmem_secure_nothrow<T>(size));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntypedef unique_cotaskmem_secure_ptr<wchar_t[]> unique_cotaskmem_string_secure;\n\n/** Copies a given string into secure memory allocated with `CoTaskMemAlloc()` in a context that may not throw upon allocation\nfailure. See the overload of `wil::make_cotaskmem_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_cotaskmem_string_secure_nothrow(L\"a string\");\nif (str)\n{\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n}\n~~~\n*/\ninline unique_cotaskmem_string_secure make_cotaskmem_string_secure_nothrow(_In_ PCWSTR source) WI_NOEXCEPT\n{\n    return unique_cotaskmem_string_secure(make_cotaskmem_string_nothrow(source).release());\n}\n\n/** Copies a given string into secure memory allocated with `CoTaskMemAlloc()` in a context that must fail fast upon allocation\nfailure. See the overload of `wil::make_cotaskmem_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_cotaskmem_string_secure_failfast(L\"a string\");\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n~~~\n*/\ninline unique_cotaskmem_string_secure make_cotaskmem_string_secure_failfast(_In_ PCWSTR source) WI_NOEXCEPT\n{\n    unique_cotaskmem_string_secure result(make_cotaskmem_string_secure_nothrow(source));\n    FAIL_FAST_IF_NULL_ALLOC(result);\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Copies a given string into secure memory allocated with `CoTaskMemAlloc()`.\nSee the overload of `wil::make_cotaskmem_string_nothrow()` with supplied length for more details.\n~~~\nauto str = wil::make_cotaskmem_string_secure(L\"a string\");\nstd::wcout << L\"This is \" << str.get() << std::endl; // prints \"This is a string\"\n~~~\n*/\ninline unique_cotaskmem_string_secure make_cotaskmem_string_secure(_In_ PCWSTR source)\n{\n    unique_cotaskmem_string_secure result(make_cotaskmem_string_secure_nothrow(source));\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif\n#endif // __WIL_OBJBASE_AND_WINBASE_H_\n\n#if (defined(_OLE2_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(__WIL_OLE2_H_) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_OLE2_H_\n/// @endcond\ntypedef unique_struct<STGMEDIUM, decltype(&::ReleaseStgMedium), ::ReleaseStgMedium> unique_stg_medium;\nstruct unique_hglobal_locked : public unique_any<void*, decltype(&::GlobalUnlock), ::GlobalUnlock>\n{\n    unique_hglobal_locked() = delete;\n\n    explicit unique_hglobal_locked(HGLOBAL global) : unique_any<void*, decltype(&::GlobalUnlock), ::GlobalUnlock>(global)\n    {\n        // GlobalLock returns a pointer to the associated global memory block and that's what callers care about.\n        m_globalMemory = GlobalLock(global);\n        if (!m_globalMemory)\n        {\n            release();\n        }\n    }\n\n    explicit unique_hglobal_locked(STGMEDIUM& medium) : unique_hglobal_locked(medium.hGlobal)\n    {\n    }\n\n    WI_NODISCARD pointer get() const\n    {\n        return m_globalMemory;\n    }\n\nprivate:\n    pointer m_globalMemory;\n};\n\n//! A type that calls OleUninitialize on destruction (or reset()).\n//! Use as a replacement for Windows::Foundation::Uninitialize.\nusing unique_oleuninitialize_call = unique_call<decltype(&::OleUninitialize), ::OleUninitialize>;\n\n//! Calls RoInitialize and fail-fasts if it fails; returns an RAII object that reverts\n//! Use as a replacement for Windows::Foundation::Initialize\n_Check_return_ inline unique_oleuninitialize_call OleInitialize_failfast()\n{\n    FAIL_FAST_IF_FAILED(::OleInitialize(nullptr));\n    return unique_oleuninitialize_call();\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Calls RoInitialize and throws an exception if it fails; returns an RAII object that reverts\n//! Use as a replacement for Windows::Foundation::Initialize\n_Check_return_ inline unique_oleuninitialize_call OleInitialize()\n{\n    THROW_IF_FAILED(::OleInitialize(nullptr));\n    return unique_oleuninitialize_call();\n}\n#endif\n#endif // __WIL_OLE2_H_\n\n#if (defined(_INC_COMMCTRL) && !defined(__WIL_INC_COMMCTRL) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_COMMCTRL\n/// @endcond\ntypedef unique_any<HIMAGELIST, decltype(&::ImageList_Destroy), ::ImageList_Destroy> unique_himagelist;\n#endif // __WIL_INC_COMMCTRL\n#if (defined(__WIL_INC_COMMCTRL) && !defined(__WIL_INC_COMMCTRL_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_COMMCTRL_STL\n/// @endcond\ntypedef shared_any<unique_himagelist> shared_himagelist;\ntypedef weak_any<shared_himagelist> weak_himagelist;\n#endif // __WIL_INC_COMMCTRL_STL\n\n#if (defined(_UXTHEME_H_) && !defined(__WIL_INC_UXTHEME) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_UXTHEME\n/// @endcond\ntypedef unique_any<HTHEME, decltype(&::CloseThemeData), ::CloseThemeData> unique_htheme;\n#endif // __WIL_INC_UXTHEME\n\n#pragma warning(push)\n#pragma warning(disable : 4995)\n#if (defined(_INC_USERENV) && !defined(__WIL_INC_USERENV) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_USERENV\n/// @endcond\ntypedef unique_any<void*, decltype(&::DestroyEnvironmentBlock), ::DestroyEnvironmentBlock> unique_environment_block;\n#endif // __WIL_INC_USERENV\n#pragma warning(pop)\n\n#if (defined(__WINEVT_H__) && !defined(__WIL_INC_EVT_HANDLE) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PKG_EVENTLOGSERVICE) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_EVT_HANDLE\n/// @endcond\ntypedef unique_any<EVT_HANDLE, decltype(&::EvtClose), ::EvtClose> unique_evt_handle;\n#endif // __WIL_INC_EVT_HANDLE\n\n#if (defined(_WINSVC_) && !defined(__WIL_HANDLE_H_WINSVC) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_HANDLE_H_WINSVC\n/// @endcond\ntypedef unique_any<SC_HANDLE, decltype(&::CloseServiceHandle), ::CloseServiceHandle> unique_schandle;\n#endif // __WIL_HANDLE_H_WINSVC\n#if (defined(__WIL_HANDLE_H_WINSVC) && !defined(__WIL_HANDLE_H_WINSVC_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_HANDLE_H_WINSVC_STL\n/// @endcond\ntypedef shared_any<unique_schandle> shared_schandle;\ntypedef weak_any<shared_schandle> weak_schandle;\n#endif // __WIL_HANDLE_H_WINSVC_STL\n\n#if (defined(_INC_STDIO) && !defined(__WIL_INC_STDIO) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_STDIO\n/// @endcond\ntypedef unique_any<FILE*, decltype(&::_pclose), ::_pclose> unique_pipe;\ntypedef unique_any<FILE*, decltype(&::fclose), ::fclose> unique_file;\n#endif // __WIL_INC_STDIO\n#if (defined(__WIL_INC_STDIO) && !defined(__WIL__INC_STDIO_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__INC_STDIO_STL\n/// @endcond\ntypedef shared_any<unique_pipe> shared_pipe;\ntypedef weak_any<shared_pipe> weak_pipe;\ntypedef shared_any<unique_file> shared_file;\ntypedef weak_any<unique_file> weak_file;\n#endif // __WIL__INC_STDIO_STL\n\n#if (defined(_INC_LOCALE) && !defined(__WIL_INC_LOCALE) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_INC_LOCALE\n/// @endcond\ntypedef unique_any<_locale_t, decltype(&::_free_locale), ::_free_locale> unique_locale;\n#endif // __WIL_INC_LOCALE\n#if (defined(__WIL_INC_LOCALE) && !defined(__WIL__INC_LOCALE_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__INC_LOCALE_STL\n/// @endcond\ntypedef shared_any<unique_locale> shared_locale;\ntypedef weak_any<unique_locale> weak_locale;\n#endif // __WIL__INC_LOCALE_STL\n\n#if (defined(_NTLSA_) && !defined(__WIL_NTLSA_) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NTLSA_\n/// @endcond\ntypedef unique_any<LSA_HANDLE, decltype(&::LsaClose), ::LsaClose> unique_hlsa;\n\nusing lsa_freemem_deleter = function_deleter<decltype(&::LsaFreeMemory), LsaFreeMemory>;\n\ntemplate <typename T>\nusing unique_lsamem_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, lsa_freemem_deleter>;\n#endif // _NTLSA_\n#if (defined(_NTLSA_) && !defined(__WIL_NTLSA_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NTLSA_STL\n/// @endcond\ntypedef shared_any<unique_hlsa> shared_hlsa;\ntypedef weak_any<shared_hlsa> weak_hlsa;\n#endif // _NTLSA_\n\n#if (defined(_LSALOOKUP_) && !defined(__WIL_LSALOOKUP_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_LSALOOKUP_\n/// @endcond\ntypedef unique_any<LSA_HANDLE, decltype(&::LsaLookupClose), ::LsaLookupClose> unique_hlsalookup;\n\nusing lsalookup_freemem_deleter = function_deleter<decltype(&::LsaLookupFreeMemory), LsaLookupFreeMemory>;\n\ntemplate <typename T>\nusing unique_lsalookupmem_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, lsalookup_freemem_deleter>;\n#endif // _LSALOOKUP_\n#if (defined(_LSALOOKUP_) && !defined(__WIL_LSALOOKUP_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_LSALOOKUP_STL\n/// @endcond\ntypedef shared_any<unique_hlsalookup> shared_hlsalookup;\ntypedef weak_any<shared_hlsalookup> weak_hlsalookup;\n#endif // _LSALOOKUP_\n\n#if (defined(_NTLSA_IFS_) && !defined(__WIL_HANDLE_H_NTLSA_IFS_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_HANDLE_H_NTLSA_IFS_\n/// @endcond\nusing lsa_deleter = function_deleter<decltype(&::LsaFreeReturnBuffer), LsaFreeReturnBuffer>;\n\ntemplate <typename T>\nusing unique_lsa_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, lsa_deleter>;\n#endif // __WIL_HANDLE_H_NTLSA_IFS_\n\n#if (defined(__WERAPI_H__) && !defined(__WIL_WERAPI_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WERAPI_H__\n/// @endcond\ntypedef unique_any<HREPORT, decltype(&WerReportCloseHandle), WerReportCloseHandle> unique_wer_report;\n#endif\n\n#if (defined(__MIDLES_H__) && !defined(__WIL_MIDLES_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_MIDLES_H__\n/// @endcond\ntypedef unique_any<handle_t, decltype(&::MesHandleFree), ::MesHandleFree> unique_rpc_pickle;\n#endif\n#if (defined(__WIL_MIDLES_H__) && !defined(__WIL_MIDLES_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_MIDLES_H_STL\n/// @endcond\ntypedef shared_any<unique_rpc_pickle> shared_rpc_pickle;\ntypedef weak_any<shared_rpc_pickle> weak_rpc_pickle;\n#endif\n\n#if (defined(__RPCDCE_H__) && !defined(__WIL_RPCDCE_H__) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_RPCDCE_H__\nnamespace details\n{\n    inline void __stdcall WpRpcBindingFree(_Pre_opt_valid_ _Frees_ptr_opt_ RPC_BINDING_HANDLE binding)\n    {\n        ::RpcBindingFree(&binding);\n    }\n\n    inline void __stdcall WpRpcBindingVectorFree(_Pre_opt_valid_ _Frees_ptr_opt_ RPC_BINDING_VECTOR* bindingVector)\n    {\n        ::RpcBindingVectorFree(&bindingVector);\n    }\n\n    inline void __stdcall WpRpcStringFree(_Pre_opt_valid_ _Frees_ptr_opt_ RPC_WSTR wstr)\n    {\n        ::RpcStringFreeW(&wstr);\n    }\n} // namespace details\n/// @endcond\n\ntypedef unique_any<RPC_BINDING_HANDLE, decltype(&details::WpRpcBindingFree), details::WpRpcBindingFree> unique_rpc_binding;\ntypedef unique_any<RPC_BINDING_VECTOR*, decltype(&details::WpRpcBindingVectorFree), details::WpRpcBindingVectorFree> unique_rpc_binding_vector;\ntypedef unique_any<RPC_WSTR, decltype(&details::WpRpcStringFree), details::WpRpcStringFree> unique_rpc_wstr;\n#endif\n#if (defined(__WIL_RPCDCE_H__) && !defined(__WIL_RPCDCE_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_RPCDCE_H_STL\n/// @endcond\ntypedef shared_any<unique_rpc_binding> shared_rpc_binding;\ntypedef weak_any<shared_rpc_binding> weak_rpc_binding;\ntypedef shared_any<unique_rpc_binding_vector> shared_rpc_binding_vector;\ntypedef weak_any<shared_rpc_binding_vector> weak_rpc_binding_vector;\ntypedef shared_any<unique_rpc_wstr> shared_rpc_wstr;\ntypedef weak_any<unique_rpc_wstr> weak_rpc_wstr;\n#endif\n\n#if (defined(_WCMAPI_H) && !defined(__WIL_WCMAPI_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WCMAPI_H_\n/// @endcond\nusing wcm_deleter = function_deleter<decltype(&::WcmFreeMemory), WcmFreeMemory>;\n\ntemplate <typename T>\nusing unique_wcm_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, wcm_deleter>;\n#endif\n\n#if (defined(_NETIOAPI_H_) && defined(_WS2IPDEF_) && defined(MIB_INVALID_TEREDO_PORT_NUMBER) && !defined(__WIL_NETIOAPI_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NETIOAPI_H_\n/// @endcond\ntypedef unique_any<PMIB_IF_TABLE2, decltype(&::FreeMibTable), ::FreeMibTable> unique_mib_iftable;\n#endif\n#if (defined(__WIL_NETIOAPI_H_) && !defined(__WIL_NETIOAPI_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_NETIOAPI_H_STL\n/// @endcond\ntypedef shared_any<unique_mib_iftable> shared_mib_iftable;\ntypedef weak_any<shared_mib_iftable> weak_mib_iftable;\n#endif\n\n#if (defined(_WLAN_WLANAPI_H) && !defined(__WIL_WLAN_WLANAPI_H) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WLAN_WLANAPI_H\n/// @endcond\nusing wlan_deleter = function_deleter<decltype(&::WlanFreeMemory), ::WlanFreeMemory>;\n\ntemplate <typename T>\nusing unique_wlan_ptr = wistd::unique_ptr<details::ensure_trivially_destructible_t<T>, wlan_deleter>;\n\n/// @cond\nnamespace details\n{\n    inline void __stdcall CloseWlanHandle(_In_ HANDLE hClientHandle)\n    {\n        ::WlanCloseHandle(hClientHandle, nullptr);\n    }\n} // namespace details\n/// @endcond\n\ntypedef unique_any<HANDLE, decltype(&details::CloseWlanHandle), details::CloseWlanHandle, details::pointer_access_all, HANDLE, INT_PTR, -1> unique_wlan_handle;\n#endif\n#if (defined(__WIL_WLAN_WLANAPI_H) && !defined(__WIL_WLAN_WLANAPI_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WLAN_WLANAPI_H_STL\n/// @endcond\ntypedef shared_any<unique_wlan_handle> shared_wlan_handle;\ntypedef weak_any<shared_wlan_handle> weak_wlan_handle;\n#endif\n\n#if (defined(_HPOWERNOTIFY_DEF_) && !defined(__WIL_HPOWERNOTIFY_DEF_H_) && !defined(WIL_KERNEL_MODE)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_HPOWERNOTIFY_DEF_H_\n/// @endcond\ntypedef unique_any<HPOWERNOTIFY, decltype(&::UnregisterPowerSettingNotification), ::UnregisterPowerSettingNotification> unique_hpowernotify;\n#endif\n\n#if (defined(__WIL_WINBASE_DESKTOP) && defined(SID_DEFINED) && !defined(__WIL_PSID_DEF_H_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_PSID_DEF_H_\n/// @endcond\ntypedef unique_any<PSID, decltype(&details::FreeProcessHeap), details::FreeProcessHeap> unique_process_heap_psid;\ntypedef unique_any<PSID, decltype(&::LocalFree), ::LocalFree> unique_any_psid;\n#if defined(_OBJBASE_H_) || defined(WIL_DOXYGEN)\ntypedef unique_any<PSID, decltype(&::CoTaskMemFree), ::CoTaskMemFree> unique_cotaskmem_psid;\n#endif\n#endif\n\n#if (defined(_PROCESSTHREADSAPI_H_) && !defined(__WIL_PROCESSTHREADSAPI_H_DESK_SYS) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && !defined(WIL_KERNEL_MODE)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_PROCESSTHREADSAPI_H_DESK_SYS\nnamespace details\n{\n    inline void __stdcall CloseProcessInformation(_In_ PROCESS_INFORMATION* p)\n    {\n        if (p->hProcess)\n        {\n            CloseHandle(p->hProcess);\n        }\n\n        if (p->hThread)\n        {\n            CloseHandle(p->hThread);\n        }\n    }\n} // namespace details\n/// @endcond\n\n/** Manages the outbound parameter containing handles returned by `CreateProcess()` and related methods.\n~~~\nunique_process_information process;\nCreateProcessW(..., CREATE_SUSPENDED, ..., &process);\nTHROW_LAST_ERROR_IF(ResumeThread(process.hThread) == -1);\nTHROW_LAST_ERROR_IF(WaitForSingleObject(process.hProcess, INFINITE) != WAIT_OBJECT_0);\n~~~\n*/\nusing unique_process_information =\n    unique_struct<PROCESS_INFORMATION, decltype(&details::CloseProcessInformation), details::CloseProcessInformation>;\n#endif\n\n#if (defined(_PROCESSENV_) && !defined(__WIL__PROCESSENV_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL__PROCESSENV_\n/// @endcond\n/** Manages lifecycle of an environment-strings block.\n@code\nwil::unique_environstrings_ptr env { ::GetEnvironmentStringsW() };\nconst wchar_t *nextVar = env.get();\nwhile (nextVar && *nextVar)\n{\n    // consume 'nextVar'\n    nextVar += wcslen(nextVar) + 1;\n}\n@endcode\n*/\nusing unique_environstrings_ptr =\n    wistd::unique_ptr<wchar_t, function_deleter<decltype(&::FreeEnvironmentStringsW), FreeEnvironmentStringsW>>;\n\n#ifndef WIL_NO_ANSI_STRINGS\n//! ANSI equivalent to unique_environstrings_ptr;\nusing unique_environansistrings_ptr =\n    wistd::unique_ptr<char, function_deleter<decltype(&::FreeEnvironmentStringsA), FreeEnvironmentStringsA>>;\n#endif\n#endif\n\n#if (defined(_APPMODEL_H_) && !defined(__WIL_APPMODEL_H_) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_APPMODEL_H_\n/// @endcond\ntypedef unique_any<PACKAGE_INFO_REFERENCE, decltype(&::ClosePackageInfo), ::ClosePackageInfo> unique_package_info_reference;\n#if NTDDI_VERSION >= NTDDI_WIN10_CO\ntypedef unique_any<PACKAGEDEPENDENCY_CONTEXT, decltype(&::RemovePackageDependency), ::RemovePackageDependency> unique_package_dependency_context;\n#endif // NTDDI_VERSION >= NTDDI_WIN10_CO\n#endif // __WIL_APPMODEL_H_\n#if (defined(__WIL_APPMODEL_H_) && !defined(__WIL_APPMODEL_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_APPMODEL_H_STL\n/// @endcond\ntypedef shared_any<unique_package_info_reference> shared_package_info_reference;\ntypedef weak_any<shared_package_info_reference> weak_package_info_reference;\n#if NTDDI_VERSION >= NTDDI_WIN10_CO\ntypedef shared_any<unique_package_dependency_context> shared_package_dependency_context;\ntypedef weak_any<shared_package_dependency_context> weak_package_dependency_context;\n#endif // NTDDI_VERSION >= NTDDI_WIN10_CO\n#endif // __WIL_APPMODEL_H_STL\n\n#if (defined(MSIXDYNAMICDEPENDENCY_H) && !defined(__WIL_MSIXDYNAMICDEPENDENCY_H)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_MSIXDYNAMICDEPENDENCY_H\n/// @endcond\ntypedef unique_any<MDD_PACKAGEDEPENDENCY_CONTEXT, decltype(&::MddRemovePackageDependency), ::MddRemovePackageDependency> unique_mdd_package_dependency_context;\n#endif // __WIL_MSIXDYNAMICDEPENDENCY_H\n#if (defined(MSIXDYNAMICDEPENDENCY_H) && !defined(__WIL_MSIXDYNAMICDEPENDENCY_H_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_MSIXDYNAMICDEPENDENCY_H_STL\n/// @endcond\ntypedef shared_any<unique_mdd_package_dependency_context> shared_mdd_package_dependency_context;\ntypedef weak_any<shared_mdd_package_dependency_context> weak_mdd_package_dependency_context;\n#endif // __WIL_MSIXDYNAMICDEPENDENCY_H_STL\n\n#if (defined(_APISETLIBLOADER_) && !defined(__WIL_APISETLIBLOADER_)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_APISETLIBLOADER_\n/// @endcond\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)\ntypedef unique_any<DLL_DIRECTORY_COOKIE, decltype(&::RemoveDllDirectory), ::RemoveDllDirectory> unique_dll_directory_cookie;\n#endif\n#endif // __WIL_APISETLIBLOADER_\n#if (defined(_APISETLIBLOADER_) && !defined(__WIL_APISETLIBLOADER_STL) && defined(WIL_RESOURCE_STL)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_APISETLIBLOADER_STL\n/// @endcond\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)\ntypedef shared_any<unique_dll_directory_cookie> shared_dll_directory_cookie;\ntypedef weak_any<shared_dll_directory_cookie> weak_dll_directory_cookie;\n#endif\n#endif // __WIL_APISETLIBLOADER_STL\n\n#if (defined(WDFAPI) && !defined(__WIL_WDFAPI)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WDFAPI\nnamespace details\n{\n    template <typename TWDFOBJECT>\n    using wdf_object_resource_policy = resource_policy<TWDFOBJECT, decltype(&::WdfObjectDelete), &::WdfObjectDelete>;\n}\n/// @endcond\n\ntemplate <typename TWDFOBJECT>\nusing unique_wdf_any = unique_any_t<details::unique_storage<details::wdf_object_resource_policy<TWDFOBJECT>>>;\n\nusing unique_wdf_object = unique_wdf_any<WDFOBJECT>;\nusing unique_wdf_queue = unique_wdf_any<WDFQUEUE>;\n\nusing unique_wdf_timer = unique_wdf_any<WDFTIMER>;\nusing unique_wdf_work_item = unique_wdf_any<WDFWORKITEM>;\n\nusing unique_wdf_memory = unique_wdf_any<WDFMEMORY>;\n\nusing unique_wdf_dma_enabler = unique_wdf_any<WDFDMAENABLER>;\nusing unique_wdf_dma_transaction = unique_wdf_any<WDFDMATRANSACTION>;\nusing unique_wdf_common_buffer = unique_wdf_any<WDFCOMMONBUFFER>;\n\nusing unique_wdf_key = unique_wdf_any<WDFKEY>;\nusing unique_wdf_string = unique_wdf_any<WDFSTRING>;\nusing unique_wdf_collection = unique_wdf_any<WDFCOLLECTION>;\n\nusing wdf_wait_lock_release_scope_exit =\n    unique_any<WDFWAITLOCK, decltype(&::WdfWaitLockRelease), ::WdfWaitLockRelease, details::pointer_access_none>;\n\n#if defined(WIL_KERNEL_MODE)\nusing unique_wdf_device_init = unique_any<WDFDEVICE_INIT*, decltype(&::WdfDeviceInitFree), ::WdfDeviceInitFree>;\n#endif\n\nWI_NODISCARD inline _IRQL_requires_max_(PASSIVE_LEVEL)\n_Acquires_lock_(lock)\nwdf_wait_lock_release_scope_exit acquire_wdf_wait_lock(WDFWAITLOCK lock) WI_NOEXCEPT\n{\n    ::WdfWaitLockAcquire(lock, nullptr);\n    return wdf_wait_lock_release_scope_exit(lock);\n}\n\nWI_NODISCARD inline _IRQL_requires_max_(APC_LEVEL)\n_When_(return, _Acquires_lock_(lock))\nwdf_wait_lock_release_scope_exit try_acquire_wdf_wait_lock(WDFWAITLOCK lock) WI_NOEXCEPT\n{\n    LONGLONG timeout = 0;\n    NTSTATUS status = ::WdfWaitLockAcquire(lock, &timeout);\n    if (status == STATUS_SUCCESS)\n    {\n        return wdf_wait_lock_release_scope_exit(lock);\n    }\n    else\n    {\n        return wdf_wait_lock_release_scope_exit();\n    }\n}\n\nusing wdf_spin_lock_release_scope_exit =\n    unique_any<WDFSPINLOCK, decltype(&::WdfSpinLockRelease), ::WdfSpinLockRelease, details::pointer_access_none>;\n\nWI_NODISCARD inline _IRQL_requires_max_(DISPATCH_LEVEL)\n_IRQL_raises_(DISPATCH_LEVEL)\n_Acquires_lock_(lock)\nwdf_spin_lock_release_scope_exit acquire_wdf_spin_lock(WDFSPINLOCK lock) WI_NOEXCEPT\n{\n    ::WdfSpinLockAcquire(lock);\n    return wdf_spin_lock_release_scope_exit(lock);\n}\n\n/// @cond\nnamespace details\n{\n    template <typename TWDFLOCK>\n    using unique_wdf_lock_storage = unique_storage<wdf_object_resource_policy<TWDFLOCK>>;\n\n    class unique_wdf_spin_lock_storage : public unique_wdf_lock_storage<WDFSPINLOCK>\n    {\n        using wdf_lock_storage_t = unique_wdf_lock_storage<WDFSPINLOCK>;\n\n    public:\n        using pointer = wdf_lock_storage_t::pointer;\n\n        // Forward all base class constructors, but have it be explicit.\n        template <typename... args_t>\n        explicit unique_wdf_spin_lock_storage(args_t&&... args) WI_NOEXCEPT : wdf_lock_storage_t(wistd::forward<args_t>(args)...)\n        {\n        }\n\n        NTSTATUS create(_In_opt_ WDF_OBJECT_ATTRIBUTES* attributes = WDF_NO_OBJECT_ATTRIBUTES)\n        {\n            return ::WdfSpinLockCreate(attributes, out_param(*this));\n        }\n\n        WI_NODISCARD\n        _IRQL_requires_max_(DISPATCH_LEVEL)\n        _IRQL_raises_(DISPATCH_LEVEL)\n        wdf_spin_lock_release_scope_exit acquire() WI_NOEXCEPT\n        {\n            return wil::acquire_wdf_spin_lock(wdf_lock_storage_t::get());\n        }\n    };\n\n    class unique_wdf_wait_lock_storage : public unique_wdf_lock_storage<WDFWAITLOCK>\n    {\n        using wdf_lock_storage_t = unique_wdf_lock_storage<WDFWAITLOCK>;\n\n    public:\n        using pointer = wdf_lock_storage_t::pointer;\n\n        // Forward all base class constructors, but have it be explicit.\n        template <typename... args_t>\n        explicit unique_wdf_wait_lock_storage(args_t&&... args) WI_NOEXCEPT : wdf_lock_storage_t(wistd::forward<args_t>(args)...)\n        {\n        }\n\n        NTSTATUS create(_In_opt_ WDF_OBJECT_ATTRIBUTES* attributes = WDF_NO_OBJECT_ATTRIBUTES)\n        {\n            return ::WdfWaitLockCreate(attributes, out_param(*this));\n        }\n\n        WI_NODISCARD\n        _IRQL_requires_max_(PASSIVE_LEVEL)\n        wdf_wait_lock_release_scope_exit acquire() WI_NOEXCEPT\n        {\n            return wil::acquire_wdf_wait_lock(wdf_lock_storage_t::get());\n        }\n\n        WI_NODISCARD\n        _IRQL_requires_max_(APC_LEVEL)\n        wdf_wait_lock_release_scope_exit try_acquire() WI_NOEXCEPT\n        {\n            return wil::try_acquire_wdf_wait_lock(wdf_lock_storage_t::get());\n        }\n    };\n} // namespace details\n/// @endcond\n\nusing unique_wdf_wait_lock = unique_any_t<details::unique_wdf_wait_lock_storage>;\nusing unique_wdf_spin_lock = unique_any_t<details::unique_wdf_spin_lock_storage>;\n\n//! unique_wdf_object_reference is a RAII type for managing WDF object references acquired using\n//! the WdfObjectReference* family of APIs. The behavior of this class is exactly identical to\n//! wil::unique_any but a few methods have some WDF-object-reference-specific enhancements.\n//!\n//! * The constructor takes not only a WDFOBJECT-compatible type or a wil::unique_wdf_any, but\n//!   optionally also a tag with which the reference was acquired.\n//! * A get_tag() method is provided to retrieve the tag.\n//! * reset() is similar to the constructor in that it also optionally takes a tag.\n//! * release() optionally takes an out-param that returns the tag.\n//!\n//! These subtle differences make it impossible to reuse the wil::unique_any_t template for its implementation.\ntemplate <typename wdf_object_t>\nclass unique_wdf_object_reference\n{\npublic:\n    unique_wdf_object_reference() WI_NOEXCEPT = default;\n\n    //! Wrap a WDF object reference that has already been acquired into this RAII type. If you\n    //! want to acquire a new reference instead, use WI_WdfObjectReferenceIncrement.\n    explicit unique_wdf_object_reference(wdf_object_t wdfObject, void* tag = nullptr) WI_NOEXCEPT : m_wdfObject(wdfObject), m_tag(tag)\n    {\n    }\n\n    //! This is similar to the constructor that takes a raw WDF handle but is enlightened to\n    //! take a const-ref to a wil::unique_wdf_any<> instead, obviating the need to call .get()\n    //! on it. As with the other constructor, the expectation is that the raw reference has\n    //! already been acquired and ownership is being transferred into this RAII object.\n    explicit unique_wdf_object_reference(const wil::unique_wdf_any<wdf_object_t>& wdfObject, void* tag = nullptr) WI_NOEXCEPT\n        : unique_wdf_object_reference(wdfObject.get(), tag)\n    {\n    }\n\n    unique_wdf_object_reference(const unique_wdf_object_reference&) = delete;\n    unique_wdf_object_reference& operator=(const unique_wdf_object_reference&) = delete;\n\n    unique_wdf_object_reference(unique_wdf_object_reference&& other) : m_wdfObject(other.m_wdfObject), m_tag(other.m_tag)\n    {\n        other.m_wdfObject = WDF_NO_HANDLE;\n        other.m_tag = nullptr;\n    }\n\n    unique_wdf_object_reference& operator=(unique_wdf_object_reference&& other)\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset(other.m_wdfObject, other.m_tag);\n            other.m_wdfObject = WDF_NO_HANDLE;\n            other.m_tag = nullptr;\n        }\n\n        return *this;\n    }\n\n    ~unique_wdf_object_reference() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return m_wdfObject != WDF_NO_HANDLE;\n    }\n\n    WI_NODISCARD wdf_object_t get() const WI_NOEXCEPT\n    {\n        return m_wdfObject;\n    }\n\n    WI_NODISCARD void* get_tag() const WI_NOEXCEPT\n    {\n        return m_tag;\n    }\n\n    //! Replaces the current instance (releasing it if it exists) with a new WDF object\n    //! reference that has already been acquired by the caller.\n    void reset(wdf_object_t wdfObject = WDF_NO_HANDLE, void* tag = nullptr) WI_NOEXCEPT\n    {\n        if (m_wdfObject != WDF_NO_HANDLE)\n        {\n            // We don't use WdfObjectDereferenceActual because there is no way to provide the\n            // correct __LINE__ and __FILE__, but if you use RAII all the way, you shouldn't have to\n            // worry about where it was released, only where it was acquired.\n            WdfObjectDereferenceWithTag(m_wdfObject, m_tag);\n        }\n\n        m_wdfObject = wdfObject;\n        m_tag = tag;\n    }\n\n    void reset(const wil::unique_wdf_any<wdf_object_t>& wdfObject, void* tag = nullptr) WI_NOEXCEPT\n    {\n        reset(wdfObject.get(), tag);\n    }\n\n    wdf_object_t release(_Outptr_opt_ void** tag = nullptr) WI_NOEXCEPT\n    {\n        const auto wdfObject = m_wdfObject;\n        wil::assign_to_opt_param(tag, m_tag);\n        m_wdfObject = WDF_NO_HANDLE;\n        m_tag = nullptr;\n        return wdfObject;\n    }\n\n    void swap(unique_wdf_object_reference& other) WI_NOEXCEPT\n    {\n        wistd::swap_wil(m_wdfObject, other.m_wdfObject);\n        wistd::swap_wil(m_tag, other.m_tag);\n    }\n\n    //! Drops the current reference if any, and returns a pointer to a WDF handle which can\n    //! receive a newly referenced WDF handle. The tag is assumed to be nullptr. If a different\n    //! tag needs to be used, a temporary variable will need to be used to receive the WDF\n    //! handle and a unique_wdf_object_reference will need to be constructed with it.\n    //!\n    //! The quintessential use-case for this method is WdfIoQueueFindRequest.\n    wdf_object_t* put() WI_NOEXCEPT\n    {\n        reset();\n        return &m_wdfObject;\n    }\n\n    wdf_object_t* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\nprivate:\n    wdf_object_t m_wdfObject = WDF_NO_HANDLE;\n    void* m_tag = nullptr;\n};\n\n// Increment the ref-count on a WDF object and return a unique_wdf_object_reference for it. Use\n// WI_WdfObjectReferenceIncrement to automatically use the call-site source location. Use this\n// function only if the call-site source location is obtained from elsewhere (i.e., plumbed\n// through other abstractions).\ntemplate <typename wdf_object_t>\nWI_NODISCARD inline unique_wdf_object_reference<wdf_object_t> wdf_object_reference_increment(\n    wdf_object_t wdfObject, PVOID tag, LONG lineNumber, PCSTR fileName) WI_NOEXCEPT\n{\n    // Parameter is incorrectly marked as non-const, so the const-cast is required.\n    ::WdfObjectReferenceActual(wdfObject, tag, lineNumber, const_cast<char*>(fileName));\n    return unique_wdf_object_reference<wdf_object_t>{wdfObject, tag};\n}\n\ntemplate <typename wdf_object_t>\nWI_NODISCARD inline unique_wdf_object_reference<wdf_object_t> wdf_object_reference_increment(\n    const wil::unique_wdf_any<wdf_object_t>& wdfObject, PVOID tag, LONG lineNumber, PCSTR fileName) WI_NOEXCEPT\n{\n    return wdf_object_reference_increment(wdfObject.get(), tag, lineNumber, fileName);\n}\n\n// A macro so that we can capture __LINE__ and __FILE__.\n#define WI_WdfObjectReferenceIncrement(wdfObject, tag) wil::wdf_object_reference_increment(wdfObject, tag, __LINE__, __FILE__)\n\n//! wdf_request_completer is a unique_any-like RAII class for managing completion of a\n//! WDFREQUEST. On destruction or explicit reset() it completes the WDFREQUEST with parameters\n//! (status, information, priority boost) previously set using methods on this class.\n//!\n//! This class does not use the unique_any_t template primarily because the release() and put()\n//! methods need to return a WDFREQUEST/WDFREQUEST*, as opposed to the internal storage type.\nclass wdf_request_completer\n{\npublic:\n    explicit wdf_request_completer(WDFREQUEST wdfRequest = WDF_NO_HANDLE) WI_NOEXCEPT : m_wdfRequest(wdfRequest)\n    {\n    }\n\n    wdf_request_completer(const wdf_request_completer&) = delete;\n    wdf_request_completer& operator=(const wdf_request_completer&) = delete;\n\n    wdf_request_completer(wdf_request_completer&& other) WI_NOEXCEPT : m_wdfRequest(other.m_wdfRequest),\n                                                                       m_status(other.m_status),\n                                                                       m_information(other.m_information),\n#if defined(WIL_KERNEL_MODE)\n                                                                       m_priorityBoost(other.m_priorityBoost),\n#endif\n                                                                       m_completionFlags(other.m_completionFlags)\n    {\n        clear_state(other);\n    }\n\n    wdf_request_completer& operator=(wdf_request_completer&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n            m_wdfRequest = other.m_wdfRequest;\n            m_status = other.m_status;\n            m_information = other.m_information;\n#if defined(WIL_KERNEL_MODE)\n            m_priorityBoost = other.m_priorityBoost;\n#endif\n            m_completionFlags = other.m_completionFlags;\n            clear_state(other);\n        }\n\n        return *this;\n    }\n\n    ~wdf_request_completer() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    WI_NODISCARD WDFREQUEST get() const WI_NOEXCEPT\n    {\n        return m_wdfRequest;\n    }\n\n    //! Set the NTSTATUS value with with the WDFREQUEST will be completed when the RAII object\n    //! goes out of scope or .reset() is called explicitly. Calling this method does *not*\n    //! complete the request right away. No effect if this object currently does not have\n    //! ownership of a WDFREQUEST. The expected usage pattern is that set_status() is called\n    //! only after ownership of a WDFREQUEST is transferred to this object.\n    void set_status(NTSTATUS status) WI_NOEXCEPT\n    {\n        // The contract is that this method has no effect if we currently do not have a\n        // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is\n        // attached, not by explicitly checking for that condition here.\n\n        m_status = status;\n    }\n\n    //! Set the IO_STATUS_BLOCK.Information value with which the WDFREQUEST will be completed.\n    //! Note that the Information value is not stored directly in the WDFREQUEST using\n    //! WdfRequestSetInformation. It is only used at the time of completion. No effect if this\n    //! object currently does not have ownership of a WDFREQUEST. The expected usage pattern is\n    //! that set_information() is called only after ownership of a WDFREQUEST is transferred to\n    //! this object.\n    void set_information(ULONG_PTR information) WI_NOEXCEPT\n    {\n        // The contract is that this method has no effect if we currently do not have a\n        // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is\n        // attached, not by explicitly checking for that condition here.\n\n        m_completionFlags.informationSet = 1;\n        m_information = information;\n    }\n\n#if defined(WIL_KERNEL_MODE)\n    //! Set the priority boost with which the WDFREQUEST will be completed. If this method is\n    //! called, the WDFREQUEST will eventually be completed with\n    //! WdfRequestCompleteWithPriorityBoost. No effect if this object currently does not have\n    //! ownership of a WDFREQUEST. The expected usage pattern is that set_priority_boost() is\n    //! called only after ownership of a WDFREQUEST is transferred to this object.\n    void set_priority_boost(CCHAR priorityBoost) WI_NOEXCEPT\n    {\n        // The contract is that this method has no effect if we currently do not have a\n        // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is\n        // attached, not by explicitly checking for that condition here.\n\n        m_completionFlags.priorityBoostSet = 1;\n        m_priorityBoost = priorityBoost;\n    }\n#endif\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return m_wdfRequest != WDF_NO_HANDLE;\n    }\n\n    WDFREQUEST* put() WI_NOEXCEPT\n    {\n        reset();\n        return &m_wdfRequest;\n    }\n\n    WDFREQUEST* operator&() WI_NOEXCEPT\n    {\n        return put();\n    }\n\n    //! Relinquishes completion responsibility for the WDFREQUEST. Note that any state\n    //! (information, priority boost, status) set on this object is lost. This design choice was\n    //! made because it is atypical to set an information or priority boost value upfront; they\n    //! are typically set at the point where the request is going to be completed. Hence a\n    //! use-case wherein release() is called will typically not have set an information or\n    //! priority boost.\n    WDFREQUEST release() WI_NOEXCEPT\n    {\n        const auto wdfRequest = m_wdfRequest;\n        clear_state(*this);\n        return wdfRequest;\n    }\n\n    void swap(wdf_request_completer& other) WI_NOEXCEPT\n    {\n        wistd::swap_wil(m_wdfRequest, other.m_wdfRequest);\n        wistd::swap_wil(m_information, other.m_information);\n        wistd::swap_wil(m_status, other.m_status);\n#if defined(WIL_KERNEL_MODE)\n        wistd::swap_wil(m_priorityBoost, other.m_priorityBoost);\n#endif\n        wistd::swap_wil(m_completionFlags, other.m_completionFlags);\n    }\n\n    void reset(WDFREQUEST newWdfRequest = WDF_NO_HANDLE)\n    {\n        if (m_wdfRequest != WDF_NO_HANDLE)\n        {\n            // We try to match the usage patterns that the driver would have typically used in the\n            // various scenarios. For instance, if the driver has set the information field, we'll\n            // call WdfRequestCompleteWithInformation instead of calling WdfRequestSetInformation\n            // followed by WdfRequestComplete.\n\n#if defined(WIL_KERNEL_MODE)\n            if (m_completionFlags.priorityBoostSet)\n            {\n                if (m_completionFlags.informationSet)\n                {\n                    WdfRequestSetInformation(m_wdfRequest, m_information);\n                }\n\n                WdfRequestCompleteWithPriorityBoost(m_wdfRequest, m_status, m_priorityBoost);\n            }\n            else\n#endif\n                if (m_completionFlags.informationSet)\n            {\n                WdfRequestCompleteWithInformation(m_wdfRequest, m_status, m_information);\n            }\n            else\n            {\n                WdfRequestComplete(m_wdfRequest, m_status);\n            }\n        }\n\n        // We call clear_state unconditionally just in case some parameters (status,\n        // information, etc.) were set prior to attaching a WDFREQUEST to this object. Those\n        // parameters are not considered relevant to the WDFREQUEST being attached to this\n        // object now.\n        clear_state(*this, newWdfRequest);\n    }\n\nprivate:\n    static void clear_state(wdf_request_completer& completer, WDFREQUEST newWdfRequest = WDF_NO_HANDLE) WI_NOEXCEPT\n    {\n        completer.m_wdfRequest = newWdfRequest;\n        completer.m_status = STATUS_UNSUCCESSFUL;\n        completer.m_information = 0;\n#if defined(WIL_KERNEL_MODE)\n        completer.m_priorityBoost = 0;\n#endif\n        completer.m_completionFlags = {};\n    }\n\n    // Members are ordered in decreasing size to minimize padding.\n\n    WDFREQUEST m_wdfRequest = WDF_NO_HANDLE;\n\n    // This will not be used unless m_completionFlags.informationSet is set.\n    ULONG_PTR m_information = 0;\n\n    // There is no reasonably default NTSTATUS value. Callers are expected to explicitly set a\n    // status value at the point where it is decided that the request needs to be completed.\n    NTSTATUS m_status = STATUS_UNSUCCESSFUL;\n\n// UMDF does not support WdfRequestCompleteWithPriorityBoost.\n#if defined(WIL_KERNEL_MODE)\n    // This will not be used unless m_completionFlags.priorityBoostSet is set.\n    CCHAR m_priorityBoost = 0;\n#endif\n\n    struct\n    {\n        UINT8 informationSet : 1;\n#if defined(WIL_KERNEL_MODE)\n        UINT8 priorityBoostSet : 1;\n#endif\n    } m_completionFlags = {};\n};\n#endif\n\n#if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && defined(_CFGMGR32_H_) && (WINVER >= _WIN32_WINNT_WIN8) && !defined(__WIL_CFGMGR32_H_)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_CFGMGR32_H_\n/// @endcond\ntypedef unique_any<HCMNOTIFICATION, decltype(&::CM_Unregister_Notification), ::CM_Unregister_Notification> unique_hcmnotification;\n#endif\n\n#if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && defined(_SWDEVICE_H_) && (WINVER >= _WIN32_WINNT_WIN8) && !defined(__WIL_SWDEVICE_H_)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_SWDEVICE_H_\n/// @endcond\ntypedef unique_any<HSWDEVICE, decltype(&::SwDeviceClose), ::SwDeviceClose> unique_hswdevice;\n#endif\n\n#if defined(WIL_KERNEL_MODE) && (defined(_WDMDDK_) || defined(_NTDDK_)) && !defined(__WIL_RESOURCE_WDM)\n#define __WIL_RESOURCE_WDM\n\n/// @cond\nnamespace details\n{\n    struct kspin_lock_saved_irql\n    {\n        PKSPIN_LOCK spinLock = nullptr;\n        KIRQL savedIrql = PASSIVE_LEVEL;\n\n        kspin_lock_saved_irql() = default;\n\n        kspin_lock_saved_irql(PKSPIN_LOCK /* spinLock */)\n        {\n            // This constructor exists simply to allow conversion of the pointer type to\n            // pointer_storage type when constructing an invalid instance. The spinLock pointer\n            // is expected to be nullptr.\n        }\n\n        // Exists to satisfy the interconvertibility requirement for pointer_storage and\n        // pointer.\n        WI_NODISCARD explicit operator PKSPIN_LOCK() const\n        {\n            return spinLock;\n        }\n\n        _IRQL_requires_(DISPATCH_LEVEL)\n        static void Release(_In_ _IRQL_restores_ const kspin_lock_saved_irql& spinLockSavedIrql)\n        {\n            KeReleaseSpinLock(spinLockSavedIrql.spinLock, spinLockSavedIrql.savedIrql);\n        }\n    };\n\n    // On some architectures KeReleaseSpinLockFromDpcLevel is a macro, and we need a thunk\n    // function we can take the address of.\n    inline _IRQL_requires_min_(DISPATCH_LEVEL)\n    void __stdcall ReleaseSpinLockFromDpcLevel(_Inout_ PKSPIN_LOCK spinLock) WI_NOEXCEPT\n    {\n        KeReleaseSpinLockFromDpcLevel(spinLock);\n    }\n} // namespace details\n/// @endcond\n\nusing kspin_lock_guard =\n    unique_any<PKSPIN_LOCK, decltype(details::kspin_lock_saved_irql::Release), &details::kspin_lock_saved_irql::Release, details::pointer_access_none, details::kspin_lock_saved_irql>;\n\nusing kspin_lock_at_dpc_guard =\n    unique_any<PKSPIN_LOCK, decltype(details::ReleaseSpinLockFromDpcLevel), &details::ReleaseSpinLockFromDpcLevel, details::pointer_access_none>;\n\nWI_NODISCARD\ninline _IRQL_requires_max_(DISPATCH_LEVEL)\n_IRQL_saves_\n_IRQL_raises_(DISPATCH_LEVEL)\nkspin_lock_guard acquire_kspin_lock(_In_ PKSPIN_LOCK spinLock)\n{\n    details::kspin_lock_saved_irql spinLockSavedIrql;\n    KeAcquireSpinLock(spinLock, &spinLockSavedIrql.savedIrql);\n    spinLockSavedIrql.spinLock = spinLock;\n    return kspin_lock_guard(spinLockSavedIrql);\n}\n\nWI_NODISCARD\ninline _IRQL_requires_min_(DISPATCH_LEVEL)\nkspin_lock_at_dpc_guard acquire_kspin_lock_at_dpc(_In_ PKSPIN_LOCK spinLock)\n{\n    KeAcquireSpinLockAtDpcLevel(spinLock);\n    return kspin_lock_at_dpc_guard(spinLock);\n}\n\nclass kernel_spin_lock\n{\npublic:\n    kernel_spin_lock() WI_NOEXCEPT\n    {\n        ::KeInitializeSpinLock(&m_kSpinLock);\n    }\n\n    ~kernel_spin_lock() = default;\n\n    // Cannot change memory location.\n    kernel_spin_lock(const kernel_spin_lock&) = delete;\n    kernel_spin_lock& operator=(const kernel_spin_lock&) = delete;\n    kernel_spin_lock(kernel_spin_lock&&) = delete;\n    kernel_spin_lock& operator=(kernel_spin_lock&&) = delete;\n\n    WI_NODISCARD\n    _IRQL_requires_max_(DISPATCH_LEVEL)\n    _IRQL_saves_\n    _IRQL_raises_(DISPATCH_LEVEL)\n    kspin_lock_guard acquire() WI_NOEXCEPT\n    {\n        return acquire_kspin_lock(&m_kSpinLock);\n    }\n\n    WI_NODISCARD\n    _IRQL_requires_min_(DISPATCH_LEVEL)\n    kspin_lock_at_dpc_guard acquire_at_dpc() WI_NOEXCEPT\n    {\n        return acquire_kspin_lock_at_dpc(&m_kSpinLock);\n    }\n\nprivate:\n    KSPIN_LOCK m_kSpinLock;\n};\n\n/// @cond\nnamespace details\n{\n    template <EVENT_TYPE eventType>\n    class kernel_event_t\n    {\n    public:\n        explicit kernel_event_t(bool isSignaled = false) WI_NOEXCEPT\n        {\n            ::KeInitializeEvent(&m_kernelEvent, static_cast<EVENT_TYPE>(eventType), isSignaled ? TRUE : FALSE);\n        }\n\n        // Cannot change memory location.\n        kernel_event_t(const kernel_event_t&) = delete;\n        kernel_event_t(kernel_event_t&&) = delete;\n        kernel_event_t& operator=(const kernel_event_t&) = delete;\n        kernel_event_t& operator=(kernel_event_t&&) = delete;\n\n        // Get the underlying KEVENT structure for more advanced usages like\n        // KeWaitForMultipleObjects or KeWaitForSingleObject with non-default parameters.\n        PRKEVENT get() WI_NOEXCEPT\n        {\n            return &m_kernelEvent;\n        }\n\n        void clear() WI_NOEXCEPT\n        {\n            // The most common use-case is to clear the event with no interest in its previous\n            // value. Hence, that is the functionality we provide by default. If the previous\n            // value is required, one may .get() the underlying event object and call\n            // ::KeResetEvent().\n            ::KeClearEvent(&m_kernelEvent);\n        }\n\n        // Returns the previous state of the event.\n        bool set(KPRIORITY increment = IO_NO_INCREMENT) WI_NOEXCEPT\n        {\n            return ::KeSetEvent(&m_kernelEvent, increment, FALSE) ? true : false;\n        }\n\n        // Checks if the event is currently signaled. Does not change the state of the event.\n        WI_NODISCARD bool is_signaled() const WI_NOEXCEPT\n        {\n            return ::KeReadStateEvent(const_cast<PRKEVENT>(&m_kernelEvent)) ? true : false;\n        }\n\n        // Return true if the wait was satisfied. Time is specified in 100ns units, relative\n        // (negative) or absolute (positive). For more details, see the documentation of\n        // KeWaitForSingleObject.\n        bool wait(LONGLONG waitTime) WI_NOEXCEPT\n        {\n            LARGE_INTEGER duration;\n            duration.QuadPart = waitTime;\n            return wait_for_single_object(&duration);\n        }\n\n        // Waits indefinitely for the event to be signaled.\n        void wait() WI_NOEXCEPT\n        {\n            wait_for_single_object(nullptr);\n        }\n\n    private:\n        bool wait_for_single_object(_In_opt_ LARGE_INTEGER* waitDuration) WI_NOEXCEPT\n        {\n            auto status = ::KeWaitForSingleObject(&m_kernelEvent, Executive, KernelMode, FALSE, waitDuration);\n\n            // We specified Executive and non-alertable, which means some of the return values are\n            // not possible.\n            WI_ASSERT((status == STATUS_SUCCESS) || (status == STATUS_TIMEOUT));\n            return (status == STATUS_SUCCESS);\n        }\n\n        KEVENT m_kernelEvent;\n    };\n} // namespace details\n/// @endcond\n\nusing kernel_event_auto_reset = details::kernel_event_t<SynchronizationEvent>;\nusing kernel_event_manual_reset = details::kernel_event_t<NotificationEvent>;\nusing kernel_event = kernel_event_auto_reset; // For parity with the default for other WIL event types.\n\n/**\nRAII class and lock-guards for a kernel FAST_MUTEX.\n*/\n\nusing fast_mutex_guard = unique_any<FAST_MUTEX*, decltype(::ExReleaseFastMutex), &::ExReleaseFastMutex, details::pointer_access_none>;\n\nWI_NODISCARD\ninline _IRQL_requires_max_(APC_LEVEL)\nfast_mutex_guard acquire_fast_mutex(FAST_MUTEX* fastMutex) WI_NOEXCEPT\n{\n    ::ExAcquireFastMutex(fastMutex);\n    return fast_mutex_guard(fastMutex);\n}\n\nWI_NODISCARD\ninline _IRQL_requires_max_(APC_LEVEL)\nfast_mutex_guard try_acquire_fast_mutex(FAST_MUTEX* fastMutex) WI_NOEXCEPT\n{\n    if (::ExTryToAcquireFastMutex(fastMutex))\n    {\n        return fast_mutex_guard(fastMutex);\n    }\n    else\n    {\n        return fast_mutex_guard();\n    }\n}\n\nclass fast_mutex\n{\npublic:\n    fast_mutex() WI_NOEXCEPT\n    {\n        ::ExInitializeFastMutex(&m_fastMutex);\n    }\n\n    ~fast_mutex() WI_NOEXCEPT = default;\n\n    // Cannot change memory location.\n    fast_mutex(const fast_mutex&) = delete;\n    fast_mutex& operator=(const fast_mutex&) = delete;\n    fast_mutex(fast_mutex&&) = delete;\n    fast_mutex& operator=(fast_mutex&&) = delete;\n\n    // Calls ExAcquireFastMutex. Returned wil::unique_any object calls ExReleaseFastMutex on\n    // destruction.\n    WI_NODISCARD\n    _IRQL_requires_max_(APC_LEVEL)\n    fast_mutex_guard acquire() WI_NOEXCEPT\n    {\n        return acquire_fast_mutex(&m_fastMutex);\n    }\n\n    // Calls ExTryToAcquireFastMutex. Returned wil::unique_any may be empty. If non-empty, it\n    // calls ExReleaseFastMutex on destruction.\n    WI_NODISCARD\n    _IRQL_requires_max_(APC_LEVEL)\n    fast_mutex_guard try_acquire() WI_NOEXCEPT\n    {\n        return try_acquire_fast_mutex(&m_fastMutex);\n    }\n\nprivate:\n    FAST_MUTEX m_fastMutex;\n};\n\n/// @cond\nnamespace details\n{\n    _IRQL_requires_max_(APC_LEVEL)\n    inline void release_fast_mutex_with_critical_region(FAST_MUTEX* fastMutex) WI_NOEXCEPT\n    {\n        ::ExReleaseFastMutexUnsafe(fastMutex);\n        ::KeLeaveCriticalRegion();\n    }\n} // namespace details\n/// @endcond\n\nusing fast_mutex_with_critical_region_guard =\n    unique_any<FAST_MUTEX*, decltype(details::release_fast_mutex_with_critical_region), &details::release_fast_mutex_with_critical_region, details::pointer_access_none>;\n\nWI_NODISCARD\ninline _IRQL_requires_max_(APC_LEVEL)\nfast_mutex_with_critical_region_guard acquire_fast_mutex_with_critical_region(FAST_MUTEX* fastMutex) WI_NOEXCEPT\n{\n    ::KeEnterCriticalRegion();\n    ::ExAcquireFastMutexUnsafe(fastMutex);\n    return fast_mutex_with_critical_region_guard(fastMutex);\n}\n\n// A FAST_MUTEX lock class that calls KeEnterCriticalRegion and then ExAcquireFastMutexUnsafe.\n// Returned wil::unique_any lock-guard calls ExReleaseFastMutexUnsafe and KeLeaveCriticalRegion\n// on destruction. This is useful if calling code wants to stay at PASSIVE_LEVEL.\nclass fast_mutex_with_critical_region\n{\npublic:\n    fast_mutex_with_critical_region() WI_NOEXCEPT\n    {\n        ::ExInitializeFastMutex(&m_fastMutex);\n    }\n\n    ~fast_mutex_with_critical_region() WI_NOEXCEPT = default;\n\n    // Cannot change memory location.\n    fast_mutex_with_critical_region(const fast_mutex_with_critical_region&) = delete;\n    fast_mutex_with_critical_region& operator=(const fast_mutex_with_critical_region&) = delete;\n    fast_mutex_with_critical_region(fast_mutex_with_critical_region&&) = delete;\n    fast_mutex_with_critical_region& operator=(fast_mutex_with_critical_region&&) = delete;\n\n    WI_NODISCARD\n    _IRQL_requires_max_(APC_LEVEL)\n    fast_mutex_with_critical_region_guard acquire() WI_NOEXCEPT\n    {\n        return acquire_fast_mutex_with_critical_region(&m_fastMutex);\n    }\n\nprivate:\n    FAST_MUTEX m_fastMutex;\n};\n\n//! A type that calls KeLeaveCriticalRegion on destruction (or reset()).\nusing unique_leave_critical_region_call = unique_call<decltype(&::KeLeaveCriticalRegion), ::KeLeaveCriticalRegion>;\n\n//! Disables user APCs and normal kernel APCs; returns an RAII object that reverts\nWI_NODISCARD inline unique_leave_critical_region_call enter_critical_region()\n{\n    KeEnterCriticalRegion();\n    return {};\n}\n\n//! A type that calls KeLeaveGuardedRegion on destruction (or reset()).\nusing unique_leave_guarded_region_call = unique_call<decltype(&::KeLeaveGuardedRegion), ::KeLeaveGuardedRegion>;\n\n//! Disables all APCs; returns an RAII object that reverts\nWI_NODISCARD inline unique_leave_guarded_region_call enter_guarded_region()\n{\n    KeEnterGuardedRegion();\n    return {};\n}\n\n//! WDM version of EX_PUSH_LOCK is available starting with Windows 10 1809\n#if (NTDDI_VERSION >= NTDDI_WIN10_RS5)\n/// @cond\nnamespace details\n{\n    _IRQL_requires_max_(APC_LEVEL)\n    inline void release_push_lock_exclusive(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT\n    {\n        ::ExReleasePushLockExclusive(pushLock);\n        ::KeLeaveCriticalRegion();\n    }\n\n    _IRQL_requires_max_(APC_LEVEL)\n    inline void release_push_lock_shared(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT\n    {\n        ::ExReleasePushLockShared(pushLock);\n        ::KeLeaveCriticalRegion();\n    }\n} // namespace details\n/// @endcond\n\nusing push_lock_exclusive_guard =\n    unique_any<EX_PUSH_LOCK*, decltype(&details::release_push_lock_exclusive), &details::release_push_lock_exclusive, details::pointer_access_noaddress>;\n\nusing push_lock_shared_guard =\n    unique_any<EX_PUSH_LOCK*, decltype(&details::release_push_lock_shared), &details::release_push_lock_shared, details::pointer_access_noaddress>;\n\nWI_NODISCARD\ninline _IRQL_requires_max_(APC_LEVEL)\npush_lock_exclusive_guard acquire_push_lock_exclusive(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT\n{\n    ::KeEnterCriticalRegion();\n    ::ExAcquirePushLockExclusive(pushLock);\n    return push_lock_exclusive_guard(pushLock);\n}\n\nWI_NODISCARD\ninline _IRQL_requires_max_(APC_LEVEL)\npush_lock_shared_guard acquire_push_lock_shared(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT\n{\n    ::KeEnterCriticalRegion();\n    ::ExAcquirePushLockShared(pushLock);\n    return push_lock_shared_guard(pushLock);\n}\n\nclass push_lock\n{\npublic:\n    push_lock() WI_NOEXCEPT\n    {\n        ::ExInitializePushLock(&m_pushLock);\n    }\n\n    ~push_lock() WI_NOEXCEPT = default;\n\n    // Cannot change memory location.\n    push_lock(const push_lock&) = delete;\n    push_lock& operator=(const push_lock&) = delete;\n    push_lock(push_lock&&) = delete;\n    push_lock& operator=(push_lock&&) = delete;\n\n    WI_NODISCARD\n    _IRQL_requires_max_(APC_LEVEL)\n    push_lock_exclusive_guard acquire_exclusive() WI_NOEXCEPT\n    {\n        return acquire_push_lock_exclusive(&m_pushLock);\n    }\n\n    WI_NODISCARD\n    _IRQL_requires_max_(APC_LEVEL)\n    push_lock_shared_guard acquire_shared() WI_NOEXCEPT\n    {\n        return acquire_push_lock_shared(&m_pushLock);\n    }\n\nprivate:\n    EX_PUSH_LOCK m_pushLock;\n};\n#endif\n\n/// @cond\nnamespace details\n{\n    // Define a templated type for pool functions in order to satisfy overload resolution below\n    template <typename pointer, ULONG tag>\n    struct pool_helpers\n    {\n        static inline _IRQL_requires_max_(DISPATCH_LEVEL)\n        void __stdcall FreePoolWithTag(pointer value) WI_NOEXCEPT\n        {\n            if (value)\n            {\n                ExFreePoolWithTag(value, tag);\n            }\n        }\n    };\n} // namespace details\n/// @endcond\n\ntemplate <typename pointer, ULONG tag = 0>\nusing unique_tagged_pool_ptr =\n    unique_any<pointer, decltype(details::pool_helpers<pointer, tag>::FreePoolWithTag), &details::pool_helpers<pointer, tag>::FreePoolWithTag>;\n\n// For use with IRPs that need to be IoFreeIrp'ed when done, typically allocated using IoAllocateIrp.\nusing unique_allocated_irp = wil::unique_any<PIRP, decltype(&::IoFreeIrp), ::IoFreeIrp, details::pointer_access_noaddress>;\nusing unique_io_workitem =\n    wil::unique_any<PIO_WORKITEM, decltype(&::IoFreeWorkItem), ::IoFreeWorkItem, details::pointer_access_noaddress>;\n\n#endif // __WIL_RESOURCE_WDM\n\n#if defined(WIL_KERNEL_MODE) && (defined(_WDMDDK_) || defined(_ZWAPI_)) && !defined(__WIL_RESOURCE_ZWAPI)\n#define __WIL_RESOURCE_ZWAPI\n\nusing unique_kernel_handle = wil::unique_any<HANDLE, decltype(&::ZwClose), ::ZwClose>;\n\n#endif // __WIL_RESOURCE_ZWAPI\n\n#if (defined(WINTRUST_H) && defined(SOFTPUB_H) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(__WIL_WINTRUST)) || \\\n    defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_WINTRUST\nnamespace details\n{\n    inline void __stdcall CloseWintrustData(_Inout_ WINTRUST_DATA* wtData) WI_NOEXCEPT\n    {\n        GUID guidV2 = WINTRUST_ACTION_GENERIC_VERIFY_V2;\n        wtData->dwStateAction = WTD_STATEACTION_CLOSE;\n        WinVerifyTrust(static_cast<HWND>(INVALID_HANDLE_VALUE), &guidV2, wtData);\n    }\n} // namespace details\n/// @endcond\ntypedef wil::unique_struct<WINTRUST_DATA, decltype(&details::CloseWintrustData), details::CloseWintrustData> unique_wintrust_data;\n#endif // __WIL_WINTRUST\n\n#if (defined(MSCAT_H) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(__WIL_MSCAT)) || defined(WIL_DOXYGEN)\n/// @cond\n#define __WIL_MSCAT\nnamespace details\n{\n    inline void __stdcall CryptCATAdminReleaseContextNoFlags(_Pre_opt_valid_ _Frees_ptr_opt_ HCATADMIN handle) WI_NOEXCEPT\n    {\n        CryptCATAdminReleaseContext(handle, 0);\n    }\n} // namespace details\n/// @endcond\ntypedef wil::unique_any<HCATADMIN, decltype(&details::CryptCATAdminReleaseContextNoFlags), details::CryptCATAdminReleaseContextNoFlags> unique_hcatadmin;\n\n#if defined(WIL_RESOURCE_STL)\ntypedef shared_any<unique_hcatadmin> shared_hcatadmin;\nstruct hcatinfo_deleter\n{\n    hcatinfo_deleter(wil::shared_hcatadmin handle) WI_NOEXCEPT : m_hCatAdmin(wistd::move(handle))\n    {\n    }\n    void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ HCATINFO handle) const WI_NOEXCEPT\n    {\n        CryptCATAdminReleaseCatalogContext(m_hCatAdmin.get(), handle, 0);\n    }\n    wil::shared_hcatadmin m_hCatAdmin;\n};\n// This stores HCATINFO, i.e. HANDLE (void *)\ntypedef wistd::unique_ptr<void, hcatinfo_deleter> unique_hcatinfo;\n\n/// @cond\nnamespace details\n{\n    class crypt_catalog_enumerator\n    {\n        wil::unique_hcatinfo m_hCatInfo;\n        const BYTE* m_hash;\n        DWORD m_hashLen;\n        bool m_initialized = false;\n\n        struct ref\n        {\n            explicit ref(crypt_catalog_enumerator& r) WI_NOEXCEPT : m_r(r)\n            {\n            }\n\n            WI_NODISCARD operator HCATINFO() const WI_NOEXCEPT\n            {\n                return m_r.current();\n            }\n\n            wil::unique_hcatinfo move_from_unique_hcatinfo() WI_NOEXCEPT\n            {\n                wil::unique_hcatinfo info(wistd::move(m_r.m_hCatInfo));\n                return info;\n            }\n\n            WI_NODISCARD bool operator==(wistd::nullptr_t) const WI_NOEXCEPT\n            {\n                return m_r.m_hCatInfo == nullptr;\n            }\n\n            WI_NODISCARD bool operator!=(wistd::nullptr_t) const WI_NOEXCEPT\n            {\n                return !(*this == nullptr);\n            }\n\n        private:\n            crypt_catalog_enumerator& m_r;\n        };\n\n        struct iterator\n        {\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n            // muse be input_iterator_tag as use of one instance invalidates the other.\n            typedef ::std::input_iterator_tag iterator_category;\n#endif\n\n            explicit iterator(crypt_catalog_enumerator* r) WI_NOEXCEPT : m_r(r)\n            {\n            }\n\n            iterator(const iterator&) = default;\n            iterator(iterator&&) = default;\n            iterator& operator=(const iterator&) = default;\n            iterator& operator=(iterator&&) = default;\n\n            WI_NODISCARD bool operator==(const iterator& rhs) const WI_NOEXCEPT\n            {\n                if (rhs.m_r == m_r)\n                {\n                    return true;\n                }\n\n                return (*this == nullptr) && (rhs == nullptr);\n            }\n\n            WI_NODISCARD bool operator!=(const iterator& rhs) const WI_NOEXCEPT\n            {\n                return !(rhs == *this);\n            }\n\n            WI_NODISCARD bool operator==(wistd::nullptr_t) const WI_NOEXCEPT\n            {\n                return nullptr == m_r || nullptr == m_r->current();\n            }\n\n            WI_NODISCARD bool operator!=(wistd::nullptr_t) const WI_NOEXCEPT\n            {\n                return !(*this == nullptr);\n            }\n\n            iterator& operator++() WI_NOEXCEPT\n            {\n                if (m_r != nullptr)\n                {\n                    m_r->next();\n                }\n\n                return *this;\n            }\n\n            WI_NODISCARD ref operator*() const WI_NOEXCEPT\n            {\n                return ref(*m_r);\n            }\n\n        private:\n            crypt_catalog_enumerator* m_r;\n        };\n\n        shared_hcatadmin& hcatadmin() WI_NOEXCEPT\n        {\n            return m_hCatInfo.get_deleter().m_hCatAdmin;\n        }\n\n        bool move_next() WI_NOEXCEPT\n        {\n            HCATINFO prevCatInfo = m_hCatInfo.release();\n            m_hCatInfo.reset(::CryptCATAdminEnumCatalogFromHash(hcatadmin().get(), const_cast<BYTE*>(m_hash), m_hashLen, 0, &prevCatInfo));\n            return !!m_hCatInfo;\n        }\n\n        HCATINFO next() WI_NOEXCEPT\n        {\n            if (m_initialized && m_hCatInfo)\n            {\n                move_next();\n            }\n\n            return current();\n        }\n\n        HCATINFO init() WI_NOEXCEPT\n        {\n            if (!m_initialized)\n            {\n                m_initialized = true;\n                move_next();\n            }\n\n            return current();\n        }\n\n        HCATINFO current() WI_NOEXCEPT\n        {\n            return m_hCatInfo.get();\n        }\n\n    public:\n        crypt_catalog_enumerator(wil::shared_hcatadmin& hCatAdmin, const BYTE* hash, DWORD hashLen) WI_NOEXCEPT\n            : m_hCatInfo(nullptr, hCatAdmin),\n              m_hash(hash),\n              m_hashLen(hashLen)\n        // , m_initialized(false) // redundant\n        {\n        }\n\n        WI_NODISCARD iterator begin() WI_NOEXCEPT\n        {\n            init();\n            return iterator(this);\n        }\n\n        WI_NODISCARD iterator end() const WI_NOEXCEPT\n        {\n            return iterator(nullptr);\n        }\n\n        crypt_catalog_enumerator(crypt_catalog_enumerator&&) = default;\n        crypt_catalog_enumerator& operator=(crypt_catalog_enumerator&&) = default;\n\n        crypt_catalog_enumerator(const crypt_catalog_enumerator&) = delete;\n        crypt_catalog_enumerator& operator=(const crypt_catalog_enumerator&) = delete;\n    };\n} // namespace details\n/// @endcond\n\n/** Use to enumerate catalogs containing a hash with a range-based for.\nThis avoids handling a raw resource to call CryptCATAdminEnumCatalogFromHash correctly.\nExample:\n`for (auto&& cat : wil::make_catalog_enumerator(hCatAdmin, hash, hashLen))\n { CryptCATCatalogInfoFromContext(cat, &catInfo, 0); }` */\ninline details::crypt_catalog_enumerator make_crypt_catalog_enumerator(\n    wil::shared_hcatadmin& hCatAdmin, _In_count_(hashLen) const BYTE* hash, DWORD hashLen) WI_NOEXCEPT\n{\n    return details::crypt_catalog_enumerator(hCatAdmin, hash, hashLen);\n}\n\ntemplate <size_t Size>\ndetails::crypt_catalog_enumerator make_crypt_catalog_enumerator(wil::shared_hcatadmin& hCatAdmin, const BYTE (&hash)[Size]) WI_NOEXCEPT\n{\n    static_assert(Size <= static_cast<size_t>(0xffffffffUL), \"Array size truncated\");\n    return details::crypt_catalog_enumerator(hCatAdmin, hash, static_cast<DWORD>(Size));\n}\n\n#endif // WI_RESOURCE_STL\n\n#endif // __WIL_MSCAT\n\n#if !defined(__WIL_RESOURCE_LOCK_ENFORCEMENT)\n/// @cond\n#define __WIL_RESOURCE_LOCK_ENFORCEMENT\n/// @endcond\n\n/// @cond\nnamespace details\n{\n    // Only those lock types specialized by lock_proof_traits will allow either a write_lock_required or\n    // read_lock_required to be constructed. The allows_exclusive value indicates if the type represents an exclusive,\n    // write-safe lock acquisition, or a shared, read-only lock acquisition.\n    template <typename T>\n    struct lock_proof_traits\n    {\n    };\n\n    // Base for specializing lock_proof_traits where the lock type is shared\n    struct shared_lock_proof\n    {\n        static constexpr bool allows_shared = true;\n    };\n\n    // Base for specializing lock_proof_traits where the lock type is exclusive (super-set of shared_lock_proof)\n    struct exclusive_lock_proof : shared_lock_proof\n    {\n        static constexpr bool allows_exclusive = true;\n    };\n} // namespace details\n/// @endcond\n\n/**\nFunctions that need an exclusive lock use can use write_lock_required as a parameter to enforce lock\nsafety at compile time. Similarly, read_lock_required may stand as a parameter where shared ownership\nof a lock is required. These are empty structs that will never be used, other than passing them on to\nanother function that requires them.\n\nThese types are implicitly convertible from various lock holding types, enabling callers to provide them as\nproof of the lock that they hold.\n\nThe following example is intentionally contrived to demonstrate multiple use cases:\n  - Methods that require only shared/read access\n  - Methods that require only exclusive write access\n  - Methods that pass their proof-of-lock to a helper\n~~~\n    class RemoteControl\n    {\n    public:\n        void VolumeUp();\n        int GetVolume();\n    private:\n        int GetCurrentVolume(wil::read_lock_required);\n        void AdjustVolume(int delta, wil::write_lock_required);\n        void SetNewVolume(int newVolume, wil::write_lock_required);\n\n        int m_currentVolume = 0;\n        wil::srwlock m_lock;\n    };\n\n    void RemoteControl::VolumeUp()\n    {\n        auto writeLock = m_lock.lock_exclusive();\n        AdjustVolume(1, writeLock);\n    }\n\n    int RemoteControl::GetVolume()\n    {\n        auto readLock = m_lock.lock_shared();\n        return GetCurrentVolume(readLock);\n    }\n\n    int RemoteControl::GetCurrentVolume(wil::read_lock_required)\n    {\n        return m_currentVolume;\n    }\n\n    void AdjustVolume(int delta, wil::write_lock_required lockProof)\n    {\n        const auto currentVolume = GetCurrentVolume(lockProof);\n        SetNewVolume(currentVolume + delta, lockProof);\n    }\n\n    void RemoteControl::SetNewVolume(int newVolume, wil::write_lock_required)\n    {\n        m_currentVolume = newVolume;\n    }\n~~~\n\nIn this design it is impossible to not meet the \"lock must be held\" precondition and the function parameter types\nhelp you understand which one.\n\nCases not handled:\n  - Functions that need the lock held, but fail to specify this fact by requiring a lock required parameter need\n    to be found via code inspection.\n  - Recursively taking a lock, when it is already held, is not avoided in this pattern\n    - Readers will learn to be suspicious of acquiring a lock in functions with lock required parameters.\n  - Designs with multiple locks, that must be careful to take them in the same order every time, are not helped\n    by this pattern.\n  - Locking the wrong object\n  - Use of a std::lock type that has not actually be secured yet (such as by std::try_to_lock or std::defer_lock)\n    - or use of a lock type that had been acquired but has since been released, reset, or otherwise unlocked\n\nThese utility types are not fool-proof against all lock misuse, anti-patterns, or other complex yet valid\nscenarios. However on the net, their usage in typical cases can assist in creating clearer, self-documenting\ncode that catches the common issues of forgetting to hold a lock or forgetting whether a lock is required to\ncall another method safely.\n*/\nstruct write_lock_required\n{\n    /**\n    Construct a new write_lock_required object for use as proof that an exclusive lock has been acquired.\n    */\n    template <typename TLockProof>\n    write_lock_required(const TLockProof&, wistd::enable_if_t<details::lock_proof_traits<TLockProof>::allows_exclusive, int> = 0)\n    {\n    }\n\n    write_lock_required() = delete; // No default construction\n};\n\n/**\nStands as proof that a shared lock has been acquired. See write_lock_required for more information.\n*/\nstruct read_lock_required\n{\n    /**\n    Construct a new read_lock_required object for use as proof that a shared lock has been acquired.\n    */\n    template <typename TLockProof>\n    read_lock_required(const TLockProof&, wistd::enable_if_t<details::lock_proof_traits<TLockProof>::allows_shared, int> = 0)\n    {\n    }\n\n    /**\n    Uses a prior write_lock_required object to construct a read_lock_required object as proof that at shared lock\n    has been acquired. (Exclusive locks held are presumed to suffice for proof of a read lock)\n    */\n    read_lock_required(const write_lock_required&)\n    {\n    }\n\n    read_lock_required() = delete; // No default construction\n};\n#endif // __WIL_RESOURCE_LOCK_ENFORCEMENT\n\n#if defined(__WIL_WINBASE_) && !defined(__WIL__RESOURCE_LOCKPROOF_WINBASE) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT)\n#define __WIL__RESOURCE_LOCKPROOF_WINBASE\n\n/// @cond\nnamespace details\n{\n    // Specializations for srwlock\n    template <>\n    struct lock_proof_traits<rwlock_release_shared_scope_exit> : shared_lock_proof\n    {\n    };\n\n    template <>\n    struct lock_proof_traits<rwlock_release_exclusive_scope_exit> : exclusive_lock_proof\n    {\n    };\n\n    // Specialization for critical_section\n    template <>\n    struct lock_proof_traits<cs_leave_scope_exit> : exclusive_lock_proof\n    {\n    };\n} // namespace details\n/// @endcond\n\n#endif //__WIL__RESOURCE_LOCKPROOF_WINBASE\n\n#if defined(_MUTEX_) && !defined(__WIL__RESOURCE_LOCKPROOF_MUTEX) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT)\n#define __WIL__RESOURCE_LOCKPROOF_MUTEX\n\n/// @cond\nnamespace details\n{\n    template <typename TMutex>\n    struct lock_proof_traits<std::unique_lock<TMutex>> : exclusive_lock_proof\n    {\n    };\n\n    template <typename TMutex>\n    struct lock_proof_traits<std::lock_guard<TMutex>> : exclusive_lock_proof\n    {\n    };\n} // namespace details\n/// @endcond\n\n#endif //__WIL__RESOURCE_LOCKPROOF_MUTEX\n\n#if defined(_SHARED_MUTEX_) && !defined(__WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT)\n#define __WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX\n\n/// @cond\nnamespace details\n{\n    template <typename TMutex>\n    struct lock_proof_traits<std::shared_lock<TMutex>> : shared_lock_proof\n    {\n    };\n} // namespace details\n/// @endcond\n\n#endif //__WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX\n\n} // namespace wil\n\n#pragma warning(pop)\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/result.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: a family of macros and functions designed to uniformly handle and report errors across return\n//! codes, fail fast, exceptions and logging.\n#ifndef __WIL_RESULT_INCLUDED\n#define __WIL_RESULT_INCLUDED\n\n// Most functionality is picked up from result_macros.h.  This file specifically provides higher level processing of errors when\n// they are encountered by the underlying macros.\n#include \"result_macros.h\"\n\n// Note that we avoid pulling in STL's memory header from Result.h through Resource.h as we have\n// Result.h customers who are still on older versions of STL (without std::shared_ptr<>).\n#ifndef RESOURCE_SUPPRESS_STL\n#define RESOURCE_SUPPRESS_STL\n#include \"resource.h\"\n#undef RESOURCE_SUPPRESS_STL\n#else\n#include \"resource.h\"\n#endif\n\n#ifdef WIL_KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\n// The updated behavior of running init-list ctors during placement new is proper & correct, disable the warning that requests developers verify they want it\n#pragma warning(push)\n#pragma warning(disable : 4351)\n\nnamespace wil\n{\n// WARNING: EVERYTHING in this namespace must be handled WITH CARE as the entities defined within\n//          are used as an in-proc ABI contract between binaries that utilize WIL.  Making changes\n//          that add v-tables or change the storage semantics of anything herein needs to be done\n//          with care and respect to versioning.\n///@cond\nnamespace details_abi\n{\n#define __WI_SEMAHPORE_VERSION L\"_p0\"\n\n    // This class uses named semaphores to be able to stash a numeric value (including a pointer\n    // for retrieval from within any module in a process).  This is a very specific need of a\n    // header-based library that should not be generally used.\n    //\n    // Notes for use:\n    // * Data members must be stable unless __WI_SEMAHPORE_VERSION is changed\n    // * The class must not reference module code (v-table, function pointers, etc)\n    // * Use of this class REQUIRES that there be a MUTEX held around the semaphore manipulation\n    //   and tests as it doesn't attempt to handle thread contention on the semaphore while manipulating\n    //   the count.\n    // * This class supports storing a 31-bit number of a single semaphore or a 62-bit number across\n    //   two semaphores and directly supports pointers.\n\n    class SemaphoreValue\n    {\n    public:\n        SemaphoreValue() = default;\n        SemaphoreValue(const SemaphoreValue&) = delete;\n        SemaphoreValue& operator=(const SemaphoreValue&) = delete;\n\n        SemaphoreValue(SemaphoreValue&& other) WI_NOEXCEPT : m_semaphore(wistd::move(other.m_semaphore)),\n                                                             m_semaphoreHigh(wistd::move(other.m_semaphoreHigh))\n        {\n            static_assert(sizeof(m_semaphore) == sizeof(HANDLE), \"unique_any must be a direct representation of the HANDLE to be used across module\");\n        }\n\n        void Destroy()\n        {\n            m_semaphore.reset();\n            m_semaphoreHigh.reset();\n        }\n\n        template <typename T>\n        HRESULT CreateFromValue(PCWSTR name, T value)\n        {\n            return CreateFromValueInternal(name, (sizeof(value) > sizeof(unsigned long)), static_cast<unsigned __int64>(value));\n        }\n\n        HRESULT CreateFromPointer(PCWSTR name, void* pointer)\n        {\n            ULONG_PTR value = reinterpret_cast<ULONG_PTR>(pointer);\n            FAIL_FAST_IMMEDIATE_IF(WI_IsAnyFlagSet(value, 0x3));\n            return CreateFromValue(name, value >> 2);\n        }\n\n        template <typename T>\n        static HRESULT TryGetValue(PCWSTR name, _Out_ T* value, _Out_opt_ bool* retrieved = nullptr)\n        {\n            *value = static_cast<T>(0);\n            unsigned __int64 value64 = 0;\n            __WIL_PRIVATE_RETURN_IF_FAILED(TryGetValueInternal(name, (sizeof(T) > sizeof(unsigned long)), &value64, retrieved));\n            *value = static_cast<T>(value64);\n            return S_OK;\n        }\n\n        static HRESULT TryGetPointer(PCWSTR name, _Outptr_result_maybenull_ void** pointer)\n        {\n            *pointer = nullptr;\n            ULONG_PTR value = 0;\n            __WIL_PRIVATE_RETURN_IF_FAILED(TryGetValue(name, &value));\n            *pointer = reinterpret_cast<void*>(value << 2);\n            return S_OK;\n        }\n\n    private:\n        HRESULT CreateFromValueInternal(PCWSTR name, bool is64Bit, unsigned __int64 value)\n        {\n            WI_ASSERT(!m_semaphore && !m_semaphoreHigh); // call Destroy first\n\n            // This routine only supports 31 bits when semahporeHigh is not supplied or 62 bits when the value\n            // is supplied.  It's a programming error to use it when either of these conditions are not true.\n\n            FAIL_FAST_IMMEDIATE_IF(\n                (!is64Bit && WI_IsAnyFlagSet(value, 0xFFFFFFFF80000000)) || (is64Bit && WI_IsAnyFlagSet(value, 0xC000000000000000)));\n\n            wchar_t localName[MAX_PATH];\n            WI_VERIFY_SUCCEEDED(StringCchCopyW(localName, ARRAYSIZE(localName), name));\n            WI_VERIFY_SUCCEEDED(StringCchCatW(localName, ARRAYSIZE(localName), __WI_SEMAHPORE_VERSION));\n\n            const unsigned long highPart = static_cast<unsigned long>(value >> 31);\n            const unsigned long lowPart = static_cast<unsigned long>(value & 0x000000007FFFFFFF);\n\n            // We set the count of the semaphore equal to the max (the value we're storing).  The only exception to that\n            // is ZERO, where you can't create a semaphore of value ZERO, where we push the max to one and use a count of ZERO.\n\n            __WIL_PRIVATE_RETURN_IF_FAILED(\n                m_semaphore.create(static_cast<LONG>(lowPart), static_cast<LONG>((lowPart > 0) ? lowPart : 1), localName));\n            if (is64Bit)\n            {\n                WI_VERIFY_SUCCEEDED(StringCchCatW(localName, ARRAYSIZE(localName), L\"h\"));\n                __WIL_PRIVATE_RETURN_IF_FAILED(\n                    m_semaphoreHigh.create(static_cast<LONG>(highPart), static_cast<LONG>((highPart > 0) ? highPart : 1), localName));\n            }\n\n            return S_OK;\n        }\n\n        static HRESULT GetValueFromSemaphore(HANDLE semaphore, _Out_ LONG* count)\n        {\n            // First we consume a single count from the semaphore.  This will work in all cases other\n            // than the case where the count we've recorded is ZERO which will TIMEOUT.\n\n            DWORD result = ::WaitForSingleObject(semaphore, 0);\n            __WIL_PRIVATE_RETURN_LAST_ERROR_IF(result == WAIT_FAILED);\n            __WIL_PRIVATE_RETURN_HR_IF(E_UNEXPECTED, !((result == WAIT_OBJECT_0) || (result == WAIT_TIMEOUT)));\n\n            LONG value = 0;\n            if (result == WAIT_OBJECT_0)\n            {\n                // We were able to wait.  To establish our count, all we have to do is release that count\n                // back to the semaphore and observe the value that we released.\n\n                __WIL_PRIVATE_RETURN_IF_WIN32_BOOL_FALSE(::ReleaseSemaphore(semaphore, 1, &value));\n                value++; // we waited first, so our actual value is one more than the old value\n\n                // Make sure the value is correct by validating that we have no more posts.\n                BOOL expectedFailure = ::ReleaseSemaphore(semaphore, 1, nullptr);\n                __WIL_PRIVATE_RETURN_HR_IF(E_UNEXPECTED, expectedFailure || (::GetLastError() != ERROR_TOO_MANY_POSTS));\n            }\n            else\n            {\n                WI_ASSERT(result == WAIT_TIMEOUT);\n\n                // We know at this point that the value is ZERO.  We'll do some verification to ensure that\n                // this address is right by validating that we have one and only one more post that we could use.\n\n                LONG expected = 0;\n                __WIL_PRIVATE_RETURN_IF_WIN32_BOOL_FALSE(::ReleaseSemaphore(semaphore, 1, &expected));\n                __WIL_PRIVATE_RETURN_HR_IF(E_UNEXPECTED, expected != 0);\n\n                const BOOL expectedFailure = ::ReleaseSemaphore(semaphore, 1, nullptr);\n                __WIL_PRIVATE_RETURN_HR_IF(E_UNEXPECTED, expectedFailure || (::GetLastError() != ERROR_TOO_MANY_POSTS));\n\n                result = ::WaitForSingleObject(semaphore, 0);\n                __WIL_PRIVATE_RETURN_LAST_ERROR_IF(result == WAIT_FAILED);\n                __WIL_PRIVATE_RETURN_HR_IF(E_UNEXPECTED, result != WAIT_OBJECT_0);\n            }\n\n            *count = value;\n            return S_OK;\n        }\n\n        static HRESULT TryGetValueInternal(PCWSTR name, bool is64Bit, _Out_ unsigned __int64* value, _Out_opt_ bool* retrieved)\n        {\n            assign_to_opt_param(retrieved, false);\n            *value = 0;\n\n            wchar_t localName[MAX_PATH];\n            WI_VERIFY_SUCCEEDED(StringCchCopyW(localName, ARRAYSIZE(localName), name));\n            WI_VERIFY_SUCCEEDED(StringCchCatW(localName, ARRAYSIZE(localName), __WI_SEMAHPORE_VERSION));\n\n            wil::unique_semaphore_nothrow semaphoreLow(::OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, FALSE, localName));\n            if (!semaphoreLow)\n            {\n                __WIL_PRIVATE_RETURN_HR_IF(S_OK, (::GetLastError() == ERROR_FILE_NOT_FOUND));\n                __WIL_PRIVATE_RETURN_LAST_ERROR();\n            }\n\n            LONG countLow = 0;\n            LONG countHigh = 0;\n\n            __WIL_PRIVATE_RETURN_IF_FAILED(GetValueFromSemaphore(semaphoreLow.get(), &countLow));\n\n            if (is64Bit)\n            {\n                WI_VERIFY_SUCCEEDED(StringCchCatW(localName, ARRAYSIZE(localName), L\"h\"));\n                wil::unique_semaphore_nothrow semaphoreHigh(::OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, FALSE, localName));\n                __WIL_PRIVATE_RETURN_LAST_ERROR_IF_NULL(semaphoreHigh);\n\n                __WIL_PRIVATE_RETURN_IF_FAILED(GetValueFromSemaphore(semaphoreHigh.get(), &countHigh));\n            }\n\n            WI_ASSERT((countLow >= 0) && (countHigh >= 0));\n\n            const unsigned __int64 newValueHigh = (static_cast<unsigned __int64>(countHigh) << 31);\n            const unsigned __int64 newValueLow = static_cast<unsigned __int64>(countLow);\n\n            assign_to_opt_param(retrieved, true);\n            *value = (newValueHigh | newValueLow);\n            return S_OK;\n        }\n\n        wil::unique_semaphore_nothrow m_semaphore;\n        wil::unique_semaphore_nothrow m_semaphoreHigh;\n    };\n\n    template <typename T>\n    class ProcessLocalStorageData\n    {\n    public:\n        ProcessLocalStorageData(unique_mutex_nothrow&& mutex, SemaphoreValue&& value) :\n            m_mutex(wistd::move(mutex)), m_value(wistd::move(value)), m_data()\n        {\n            static_assert(sizeof(m_mutex) == sizeof(HANDLE), \"unique_any must be equivalent to the handle size to safely use across module\");\n        }\n\n        T* GetData()\n        {\n            WI_ASSERT(m_mutex);\n            return &m_data;\n        }\n\n        void Release()\n        {\n            if (ProcessShutdownInProgress())\n            {\n                // There are no other threads to contend with.\n                m_refCount = m_refCount - 1;\n                if (m_refCount == 0)\n                {\n                    m_data.ProcessShutdown();\n                }\n            }\n            else\n            {\n                auto lock = m_mutex.acquire();\n                m_refCount = m_refCount - 1;\n                if (m_refCount == 0)\n                {\n                    // We must explicitly destroy our semaphores while holding the mutex\n                    m_value.Destroy();\n                    lock.reset();\n\n                    this->~ProcessLocalStorageData();\n                    ::HeapFree(::GetProcessHeap(), 0, this);\n                }\n            }\n        }\n\n        static HRESULT Acquire(PCSTR staticNameWithVersion, _Outptr_result_nullonfailure_ ProcessLocalStorageData<T>** data)\n        {\n            *data = nullptr;\n\n            // NOTE: the '0' in SM0 below is intended as the VERSION number.  Changes to this class require\n            //       that this value be revised.\n\n            const DWORD size = static_cast<DWORD>(sizeof(ProcessLocalStorageData<T>));\n            wchar_t name[MAX_PATH];\n            WI_VERIFY(SUCCEEDED(StringCchPrintfW(\n                name, ARRAYSIZE(name), L\"Local\\\\SM0:%lu:%lu:%hs\", ::GetCurrentProcessId(), size, staticNameWithVersion)));\n\n            unique_mutex_nothrow mutex;\n            mutex.reset(::CreateMutexExW(nullptr, name, 0, MUTEX_ALL_ACCESS));\n\n            // This will fail in some environments and will be fixed with deliverable 12394134\n            RETURN_LAST_ERROR_IF_EXPECTED(!mutex);\n            auto lock = mutex.acquire();\n\n            void* pointer = nullptr;\n            __WIL_PRIVATE_RETURN_IF_FAILED(SemaphoreValue::TryGetPointer(name, &pointer));\n            if (pointer)\n            {\n                *data = reinterpret_cast<ProcessLocalStorageData<T>*>(pointer);\n                (*data)->m_refCount = (*data)->m_refCount + 1;\n            }\n            else\n            {\n                __WIL_PRIVATE_RETURN_IF_FAILED(MakeAndInitialize(\n                    name, wistd::move(mutex), data)); // Assumes mutex handle ownership on success ('lock' will still be released)\n            }\n\n            return S_OK;\n        }\n\n    private:\n        volatile long m_refCount = 1;\n        unique_mutex_nothrow m_mutex;\n        SemaphoreValue m_value;\n        T m_data;\n\n        static HRESULT MakeAndInitialize(\n            PCWSTR name, unique_mutex_nothrow&& mutex, _Outptr_result_nullonfailure_ ProcessLocalStorageData<T>** data)\n        {\n            *data = nullptr;\n\n            const DWORD size = static_cast<DWORD>(sizeof(ProcessLocalStorageData<T>));\n\n            unique_process_heap_ptr<void> dataAlloc(details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, size));\n            __WIL_PRIVATE_RETURN_IF_NULL_ALLOC(dataAlloc);\n\n            SemaphoreValue semaphoreValue;\n            __WIL_PRIVATE_RETURN_IF_FAILED(semaphoreValue.CreateFromPointer(name, dataAlloc.get()));\n\n            new (dataAlloc.get()) ProcessLocalStorageData<T>(wistd::move(mutex), wistd::move(semaphoreValue));\n            *data = static_cast<ProcessLocalStorageData<T>*>(dataAlloc.release());\n\n            return S_OK;\n        }\n    };\n\n    template <typename T>\n    class ProcessLocalStorage\n    {\n    public:\n        ProcessLocalStorage(PCSTR staticNameWithVersion) WI_NOEXCEPT : m_staticNameWithVersion(staticNameWithVersion)\n        {\n        }\n\n        ~ProcessLocalStorage() WI_NOEXCEPT\n        {\n            if (m_data)\n            {\n                m_data->Release();\n            }\n        }\n\n        T* GetShared() WI_NOEXCEPT\n        {\n            if (!m_data)\n            {\n                ProcessLocalStorageData<T>* localTemp = nullptr;\n                if (SUCCEEDED(ProcessLocalStorageData<T>::Acquire(m_staticNameWithVersion, &localTemp)) && !m_data)\n                {\n                    m_data = localTemp;\n                }\n            }\n            return m_data ? m_data->GetData() : nullptr;\n        }\n\n    private:\n        PCSTR m_staticNameWithVersion = nullptr;\n        ProcessLocalStorageData<T>* m_data = nullptr;\n    };\n\n    template <typename T>\n    class ThreadLocalStorage\n    {\n    public:\n        ThreadLocalStorage(const ThreadLocalStorage&) = delete;\n        ThreadLocalStorage& operator=(const ThreadLocalStorage&) = delete;\n\n        ThreadLocalStorage() = default;\n\n        ~ThreadLocalStorage() WI_NOEXCEPT\n        {\n            for (auto& entry : m_hashArray)\n            {\n                Node* pNode = entry;\n                while (pNode != nullptr)\n                {\n                    auto pCurrent = pNode;\n#pragma warning(push)\n#pragma warning(disable : 6001) // https://github.com/microsoft/wil/issues/164\n                    pNode = pNode->pNext;\n#pragma warning(pop)\n                    pCurrent->~Node();\n                    ::HeapFree(::GetProcessHeap(), 0, pCurrent);\n                }\n                entry = nullptr;\n            }\n        }\n\n        // Note: Can return nullptr even when (shouldAllocate == true) upon allocation failure\n        T* GetLocal(bool shouldAllocate = false) WI_NOEXCEPT\n        {\n            DWORD const threadId = ::GetCurrentThreadId();\n            size_t const index = (threadId % ARRAYSIZE(m_hashArray));\n            for (auto pNode = m_hashArray[index]; pNode != nullptr; pNode = pNode->pNext)\n            {\n                if (pNode->threadId == threadId)\n                {\n                    return &pNode->value;\n                }\n            }\n\n            if (shouldAllocate)\n            {\n                if (auto pNewRaw = details::ProcessHeapAlloc(0, sizeof(Node)))\n                {\n                    auto pNew = new (pNewRaw) Node{threadId};\n\n                    Node* pFirst;\n                    do\n                    {\n                        pFirst = m_hashArray[index];\n                        pNew->pNext = pFirst;\n                    } while (::InterlockedCompareExchangePointer(reinterpret_cast<PVOID volatile*>(m_hashArray + index), pNew, pFirst) !=\n                             pFirst);\n\n                    return &pNew->value;\n                }\n            }\n            return nullptr;\n        }\n\n    private:\n        struct Node\n        {\n            DWORD threadId = 0xffffffffu;\n            Node* pNext = nullptr;\n            T value{};\n        };\n\n        Node* volatile m_hashArray[10]{};\n    };\n\n    struct ThreadLocalFailureInfo\n    {\n        // ABI contract (carry size to facilitate additive change without re-versioning)\n        unsigned short size;\n        unsigned char reserved1[2]; // packing, reserved\n        // When this failure was seen\n        unsigned int sequenceId;\n\n        // Information about the failure\n        HRESULT hr;\n        PCSTR fileName;\n        unsigned short lineNumber;\n        unsigned char failureType; // FailureType\n        unsigned char reserved2;   // packing, reserved\n        PCSTR modulePath;\n        void* returnAddress;\n        void* callerReturnAddress;\n        PCWSTR message;\n\n        // The allocation (LocalAlloc) where structure strings point\n        void* stringBuffer;\n        size_t stringBufferSize;\n\n        // NOTE: Externally Managed:  Must not have constructor or destructor\n\n        void Clear()\n        {\n            ::HeapFree(::GetProcessHeap(), 0, stringBuffer);\n            stringBuffer = nullptr;\n            stringBufferSize = 0;\n        }\n\n        void Set(const FailureInfo& info, unsigned int newSequenceId)\n        {\n            sequenceId = newSequenceId;\n\n            hr = info.hr;\n            fileName = nullptr;\n            lineNumber = static_cast<unsigned short>(info.uLineNumber);\n            failureType = static_cast<unsigned char>(info.type);\n            modulePath = nullptr;\n            returnAddress = info.returnAddress;\n            callerReturnAddress = info.callerReturnAddress;\n            message = nullptr;\n\n            size_t neededSize = details::ResultStringSize(info.pszFile) + details::ResultStringSize(info.pszModule) +\n                                details::ResultStringSize(info.pszMessage);\n\n            if (!stringBuffer || (stringBufferSize < neededSize))\n            {\n                auto newBuffer = details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, neededSize);\n                if (newBuffer)\n                {\n                    ::HeapFree(::GetProcessHeap(), 0, stringBuffer);\n                    stringBuffer = newBuffer;\n                    stringBufferSize = neededSize;\n                }\n            }\n\n            if (stringBuffer)\n            {\n                unsigned char* pBuffer = static_cast<unsigned char*>(stringBuffer);\n                unsigned char* pBufferEnd = pBuffer + stringBufferSize;\n\n                pBuffer = details::WriteResultString(pBuffer, pBufferEnd, info.pszFile, &fileName);\n                pBuffer = details::WriteResultString(pBuffer, pBufferEnd, info.pszModule, &modulePath);\n                pBuffer = details::WriteResultString(pBuffer, pBufferEnd, info.pszMessage, &message);\n                ZeroMemory(pBuffer, pBufferEnd - pBuffer);\n            }\n        }\n\n        void Get(FailureInfo& info) const\n        {\n            ::ZeroMemory(&info, sizeof(info));\n\n            info.failureId = sequenceId;\n            info.hr = hr;\n            info.pszFile = fileName;\n            info.uLineNumber = lineNumber;\n            info.type = static_cast<FailureType>(failureType);\n            info.pszModule = modulePath;\n            info.returnAddress = returnAddress;\n            info.callerReturnAddress = callerReturnAddress;\n            info.pszMessage = message;\n        }\n    };\n\n    struct ThreadLocalData\n    {\n        // ABI contract (carry size to facilitate additive change without re-versioning)\n        unsigned short size = sizeof(ThreadLocalData);\n\n        // Subscription information\n        unsigned int threadId = 0;\n        volatile long* failureSequenceId = nullptr; // backpointer to the global ID\n\n        // Information about thread errors\n        unsigned int latestSubscribedFailureSequenceId = 0;\n\n        // The last (N) observed errors\n        ThreadLocalFailureInfo* errors = nullptr;\n        unsigned short errorAllocCount = 0;\n        unsigned short errorCurrentIndex = 0;\n\n        // NOTE: Externally Managed:  Must allow ZERO init construction\n\n        ~ThreadLocalData()\n        {\n            Clear();\n        }\n\n        void Clear()\n        {\n            for (auto& error : make_range(errors, errorAllocCount))\n            {\n                error.Clear();\n            }\n            ::HeapFree(::GetProcessHeap(), 0, errors);\n            errorAllocCount = 0;\n            errorCurrentIndex = 0;\n            errors = nullptr;\n        }\n\n        bool EnsureAllocated(bool create = true)\n        {\n            if (!errors && create)\n            {\n                const unsigned short errorCount = 5;\n                errors = reinterpret_cast<ThreadLocalFailureInfo*>(\n                    details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, errorCount * sizeof(ThreadLocalFailureInfo)));\n                if (errors)\n                {\n                    errorAllocCount = errorCount;\n                    errorCurrentIndex = 0;\n                    for (auto& error : make_range(errors, errorAllocCount))\n                    {\n                        error.size = sizeof(ThreadLocalFailureInfo);\n                    }\n                }\n            }\n            return (errors != nullptr);\n        }\n\n        void SetLastError(const wil::FailureInfo& info)\n        {\n            const bool hasListener = (latestSubscribedFailureSequenceId > 0);\n\n            if (!EnsureAllocated(hasListener))\n            {\n                // We either couldn't allocate or we haven't yet allocated and nobody\n                // was listening, so we ignore.\n                return;\n            }\n\n            if (hasListener)\n            {\n                // When we have listeners, we can throw away any updates to the last seen error\n                // code within the same listening context presuming it's an update of the existing\n                // error with the same code.\n\n                for (auto& error : make_range(errors, errorAllocCount))\n                {\n                    if ((error.sequenceId > latestSubscribedFailureSequenceId) && (error.hr == info.hr))\n                    {\n                        return;\n                    }\n                }\n            }\n\n            // Otherwise we create a new failure...\n\n            errorCurrentIndex = (errorCurrentIndex + 1) % errorAllocCount;\n            errors[errorCurrentIndex].Set(info, ::InterlockedIncrementNoFence(failureSequenceId));\n        }\n\n        WI_NODISCARD bool GetLastError(_Inout_ wil::FailureInfo& info, unsigned int minSequenceId, HRESULT matchRequirement) const\n        {\n            if (!errors)\n            {\n                return false;\n            }\n\n            // If the last error we saw doesn't meet the filter requirement or if the last error was never\n            // set, then we couldn't return a result at all...\n            auto& lastFailure = errors[errorCurrentIndex];\n            if (minSequenceId >= lastFailure.sequenceId)\n            {\n                return false;\n            }\n\n            // With no result filter, we just go to the last error and report it\n            if (matchRequirement == S_OK)\n            {\n                lastFailure.Get(info);\n                return true;\n            }\n\n            // Find the oldest result matching matchRequirement and passing minSequenceId\n            ThreadLocalFailureInfo* find = nullptr;\n            for (auto& error : make_range(errors, errorAllocCount))\n            {\n                if ((error.hr == matchRequirement) && (error.sequenceId > minSequenceId))\n                {\n                    if (!find || (error.sequenceId < find->sequenceId))\n                    {\n                        find = &error;\n                    }\n                }\n            }\n            if (find)\n            {\n                find->Get(info);\n                return true;\n            }\n\n            return false;\n        }\n\n        bool GetCaughtExceptionError(\n            _Inout_ wil::FailureInfo& info,\n            unsigned int minSequenceId,\n            _In_opt_ const DiagnosticsInfo* diagnostics,\n            HRESULT matchRequirement,\n            void* returnAddress)\n        {\n            // First attempt to get the last error and then see if it matches the error returned from\n            // the last caught exception.  If it does, then we're good to go and we return that last error.\n\n            FailureInfo last = {};\n            if (GetLastError(last, minSequenceId, matchRequirement) && (last.hr == ResultFromCaughtException()))\n            {\n                info = last;\n                return true;\n            }\n\n            // The last error didn't match or we never had one... we need to create one -- we do so by logging\n            // our current request and then using the last error.\n\n            DiagnosticsInfo source;\n            if (diagnostics)\n            {\n                source = *diagnostics;\n            }\n\n            // NOTE:  FailureType::Log as it's only informative (no action) and SupportedExceptions::All as it's not a barrier, only recognition.\n            wchar_t message[2048]{};\n            const HRESULT hr = details::ReportFailure_CaughtExceptionCommon<FailureType::Log>(\n                                   __R_DIAGNOSTICS_RA(source, returnAddress), message, ARRAYSIZE(message), SupportedExceptions::All)\n                                   .hr;\n\n            // Now that the exception was logged, we should be able to fetch it.\n            return GetLastError(info, minSequenceId, hr);\n        }\n    };\n\n    struct ProcessLocalData\n    {\n        // ABI contract (carry size to facilitate additive change without re-versioning)\n        unsigned short size = sizeof(ProcessLocalData);\n\n        // Failure Information\n        volatile long failureSequenceId = 1;         // process global variable\n        ThreadLocalStorage<ThreadLocalData> threads; // list of allocated threads\n\n        void ProcessShutdown()\n        {\n        }\n    };\n\n    __declspec(selectany) ProcessLocalStorage<ProcessLocalData>* g_pProcessLocalData = nullptr;\n\n    __declspec(noinline) inline ThreadLocalData* GetThreadLocalDataCache(bool allocate = true)\n    {\n        ThreadLocalData* result = nullptr;\n        if (g_pProcessLocalData)\n        {\n            auto processData = g_pProcessLocalData->GetShared();\n            if (processData)\n            {\n                result = processData->threads.GetLocal(allocate);\n                if (result && !result->failureSequenceId)\n                {\n                    result->failureSequenceId = &(processData->failureSequenceId);\n                }\n            }\n        }\n        return result;\n    }\n\n    __forceinline ThreadLocalData* GetThreadLocalData(bool allocate = true)\n    {\n        return GetThreadLocalDataCache(allocate);\n    }\n\n} // namespace details_abi\n/// @endcond\n\n/** Returns a sequence token that can be used with wil::GetLastError to limit errors to those that occur after this token was\nretrieved. General usage pattern:  use wil::GetCurrentErrorSequenceId to cache a token, execute your code, on failure use\nwil::GetLastError with the token to provide information on the error that occurred while executing your code.  Prefer to use\nwil::ThreadErrorContext over this approach when possible.  */\ninline long GetCurrentErrorSequenceId()\n{\n    auto data = details_abi::GetThreadLocalData();\n    if (data)\n    {\n        // someone is interested -- make sure we can store errors\n        data->EnsureAllocated();\n        return *data->failureSequenceId;\n    }\n\n    return 0;\n}\n\n/** Caches failure information for later retrieval from GetLastError.\nMost people will never need to do this explicitly as failure information is automatically made available per-thread across a\nprocess when errors are encountered naturally through the WIL macros. */\ninline void SetLastError(const wil::FailureInfo& info)\n{\n    static volatile unsigned int lastThread = 0;\n    auto threadId = ::GetCurrentThreadId();\n    if (lastThread != threadId)\n    {\n        static volatile long depth = 0;\n        if (::InterlockedIncrementNoFence(&depth) < 4)\n        {\n            lastThread = threadId;\n            auto data = details_abi::GetThreadLocalData(false); // false = avoids allocation if not already present\n            if (data)\n            {\n                data->SetLastError(info);\n            }\n            lastThread = 0;\n        }\n        ::InterlockedDecrementNoFence(&depth);\n    }\n}\n\n/** Retrieves failure information for the current thread with the given filters.\nThis API can be used to retrieve information about the last WIL failure that occurred on the current thread.\nThis error crosses DLL boundaries as long as the error occurred in the current process.  Passing a minSequenceId\nrestricts the error returned to one that occurred after the given sequence ID.  Passing matchRequirement also filters\nthe returned result to the given error code. */\ninline bool GetLastError(_Inout_ wil::FailureInfo& info, unsigned int minSequenceId = 0, HRESULT matchRequirement = S_OK)\n{\n    auto data = details_abi::GetThreadLocalData(false); // false = avoids allocation if not already present\n    if (data)\n    {\n        return data->GetLastError(info, minSequenceId, matchRequirement);\n    }\n    return false;\n}\n\n/** Retrieves failure information when within a catch block for the current thread with the given filters.\nWhen unable to retrieve the exception information (when WIL hasn't yet seen it), this will attempt (best effort) to\ndiscover information about the exception and will attribute that information to the given DiagnosticsInfo position.\nSee GetLastError for capabilities and filtering. */\ninline __declspec(noinline) bool GetCaughtExceptionError(\n    _Inout_ wil::FailureInfo& info, unsigned int minSequenceId = 0, const DiagnosticsInfo* diagnostics = nullptr, HRESULT matchRequirement = S_OK)\n{\n    auto data = details_abi::GetThreadLocalData();\n    if (data)\n    {\n        return data->GetCaughtExceptionError(info, minSequenceId, diagnostics, matchRequirement, _ReturnAddress());\n    }\n    return false;\n}\n\n/** Use this class to manage retrieval of information about an error occurring in the requested code.\nConstruction of this class sets a point in time after which you can use the GetLastError class method to retrieve\nthe origination of the last error that occurred on this thread since the class was created. */\nclass ThreadErrorContext\n{\npublic:\n    ThreadErrorContext() : m_data(details_abi::GetThreadLocalData())\n    {\n        if (m_data)\n        {\n            m_sequenceIdLast = m_data->latestSubscribedFailureSequenceId;\n            m_sequenceIdStart = *m_data->failureSequenceId;\n            m_data->latestSubscribedFailureSequenceId = m_sequenceIdStart;\n        }\n    }\n\n    ~ThreadErrorContext()\n    {\n        if (m_data)\n        {\n            m_data->latestSubscribedFailureSequenceId = m_sequenceIdLast;\n        }\n    }\n\n    /** Retrieves the origination of the last error that occurred since this class was constructed.\n    The optional parameter allows the failure information returned to be filtered to a specific\n    result. */\n    inline bool GetLastError(FailureInfo& info, HRESULT matchRequirement = S_OK)\n    {\n        if (m_data)\n        {\n            return m_data->GetLastError(info, m_sequenceIdStart, matchRequirement);\n        }\n        return false;\n    }\n\n    /** Retrieves the origin of the current exception (within a catch block) since this class was constructed.\n    See @ref GetCaughtExceptionError for more information */\n    inline __declspec(noinline) bool GetCaughtExceptionError(\n        _Inout_ wil::FailureInfo& info, const DiagnosticsInfo* diagnostics = nullptr, HRESULT matchRequirement = S_OK)\n    {\n        if (m_data)\n        {\n            return m_data->GetCaughtExceptionError(info, m_sequenceIdStart, diagnostics, matchRequirement, _ReturnAddress());\n        }\n        return false;\n    }\n\nprivate:\n    details_abi::ThreadLocalData* m_data;\n    unsigned long m_sequenceIdStart{};\n    unsigned long m_sequenceIdLast{};\n};\n\nenum class WilInitializeCommand\n{\n    Create,\n    Destroy,\n};\n\n/// @cond\nnamespace details\n{\n    struct IFailureCallback\n    {\n        virtual bool NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT = 0;\n    };\n\n    class ThreadFailureCallbackHolder;\n\n    __declspec(selectany) details_abi::ThreadLocalStorage<ThreadFailureCallbackHolder*>* g_pThreadFailureCallbacks = nullptr;\n\n    class ThreadFailureCallbackHolder\n    {\n    public:\n        ThreadFailureCallbackHolder(\n            _In_opt_ IFailureCallback* pCallbackParam, _In_opt_ CallContextInfo* pCallContext = nullptr, bool watchNow = true) WI_NOEXCEPT\n            : m_ppThreadList(nullptr),\n              m_pCallback(pCallbackParam),\n              m_pNext(nullptr),\n              m_threadId(0),\n              m_pCallContext(pCallContext)\n        {\n            if (watchNow)\n            {\n                StartWatching();\n            }\n        }\n\n        ThreadFailureCallbackHolder(ThreadFailureCallbackHolder&& other) WI_NOEXCEPT : m_ppThreadList(nullptr),\n                                                                                       m_pCallback(other.m_pCallback),\n                                                                                       m_pNext(nullptr),\n                                                                                       m_threadId(0),\n                                                                                       m_pCallContext(other.m_pCallContext)\n        {\n            if (other.m_threadId != 0)\n            {\n                other.StopWatching();\n                StartWatching();\n            }\n        }\n\n        ~ThreadFailureCallbackHolder() WI_NOEXCEPT\n        {\n            if (m_threadId != 0)\n            {\n                StopWatching();\n            }\n        }\n\n        void SetCallContext(_In_opt_ CallContextInfo* pCallContext)\n        {\n            m_pCallContext = pCallContext;\n        }\n\n        CallContextInfo* CallContextInfo()\n        {\n            return m_pCallContext;\n        }\n\n        void StartWatching()\n        {\n            // out-of balance Start/Stop calls?\n            __FAIL_FAST_IMMEDIATE_ASSERT__(m_threadId == 0);\n\n            m_ppThreadList = g_pThreadFailureCallbacks ? g_pThreadFailureCallbacks->GetLocal(true)\n                                                       : nullptr; // true = allocate thread list if missing\n            if (m_ppThreadList)\n            {\n                m_pNext = *m_ppThreadList;\n                *m_ppThreadList = this;\n                m_threadId = ::GetCurrentThreadId();\n            }\n        }\n\n        void StopWatching()\n        {\n            if (m_threadId != ::GetCurrentThreadId())\n            {\n                // The thread-specific failure holder cannot be stopped on a different thread than it was started on or the\n                // internal book-keeping list will be corrupted.  To fix this change the telemetry pattern in the calling code\n                // to match one of the patterns available here:\n                //    https://microsoft.sharepoint.com/teams/osg_development/Shared%20Documents/Windows%20TraceLogging%20Helpers.docx\n\n                WI_USAGE_ERROR(\"MEMORY CORRUPTION: Calling code is leaking an activity thread-watcher and releasing it on another thread\");\n            }\n\n            m_threadId = 0;\n\n            while (*m_ppThreadList != nullptr)\n            {\n                if (*m_ppThreadList == this)\n                {\n                    *m_ppThreadList = m_pNext;\n                    break;\n                }\n                m_ppThreadList = &((*m_ppThreadList)->m_pNext);\n            }\n            m_ppThreadList = nullptr;\n        }\n\n        WI_NODISCARD bool IsWatching() const\n        {\n            return (m_threadId != 0);\n        }\n\n        void SetWatching(bool shouldWatch)\n        {\n            if (shouldWatch && !IsWatching())\n            {\n                StartWatching();\n            }\n            else if (!shouldWatch && IsWatching())\n            {\n                StopWatching();\n            }\n        }\n\n        static bool GetThreadContext(\n            _Inout_ FailureInfo* pFailure,\n            _In_opt_ ThreadFailureCallbackHolder* pCallback,\n            _Out_writes_(callContextStringLength) _Post_z_ PSTR callContextString,\n            _Pre_satisfies_(callContextStringLength > 0) size_t callContextStringLength)\n        {\n            *callContextString = '\\0';\n            bool foundContext = false;\n            if (pCallback != nullptr)\n            {\n                foundContext = GetThreadContext(pFailure, pCallback->m_pNext, callContextString, callContextStringLength);\n\n                if (pCallback->m_pCallContext != nullptr)\n                {\n                    auto& context = *pCallback->m_pCallContext;\n\n                    // We generate the next telemetry ID only when we've found an error (avoid always incrementing)\n                    if (context.contextId == 0)\n                    {\n                        context.contextId = ::InterlockedIncrementNoFence(&s_telemetryId);\n                    }\n\n                    if (pFailure->callContextOriginating.contextId == 0)\n                    {\n                        pFailure->callContextOriginating = context;\n                    }\n\n                    pFailure->callContextCurrent = context;\n\n                    auto callContextStringEnd = callContextString + callContextStringLength;\n                    callContextString += strlen(callContextString);\n\n                    if ((callContextStringEnd - callContextString) > 2) // room for at least the slash + null\n                    {\n                        *callContextString++ = '\\\\';\n                        auto nameSizeBytes = strlen(context.contextName) + 1;\n                        size_t remainingBytes = static_cast<size_t>(callContextStringEnd - callContextString);\n                        auto copyBytes = (nameSizeBytes < remainingBytes) ? nameSizeBytes : remainingBytes;\n                        memcpy_s(callContextString, remainingBytes, context.contextName, copyBytes);\n                        *(callContextString + (copyBytes - 1)) = '\\0';\n                    }\n\n                    return true;\n                }\n            }\n            return foundContext;\n        }\n\n        static void GetContextAndNotifyFailure(\n            _Inout_ FailureInfo* pFailure,\n            _Out_writes_(callContextStringLength) _Post_z_ PSTR callContextString,\n            _Pre_satisfies_(callContextStringLength > 0) size_t callContextStringLength) WI_NOEXCEPT\n        {\n            *callContextString = '\\0';\n            bool reportedTelemetry = false;\n\n            ThreadFailureCallbackHolder** ppListeners = g_pThreadFailureCallbacks ? g_pThreadFailureCallbacks->GetLocal() : nullptr;\n            if ((ppListeners != nullptr) && (*ppListeners != nullptr))\n            {\n                callContextString[0] = '\\0';\n                if (GetThreadContext(pFailure, *ppListeners, callContextString, callContextStringLength))\n                {\n                    pFailure->pszCallContext = callContextString;\n                }\n\n                auto pNode = *ppListeners;\n                do\n                {\n                    reportedTelemetry |= pNode->m_pCallback->NotifyFailure(*pFailure);\n                    pNode = pNode->m_pNext;\n                } while (pNode != nullptr);\n            }\n\n            if (g_pfnTelemetryCallback != nullptr)\n            {\n                // If the telemetry was requested to be suppressed,\n                // pretend like it has already been reported to the fallback callback\n                g_pfnTelemetryCallback(reportedTelemetry || WI_IsFlagSet(pFailure->flags, FailureFlags::RequestSuppressTelemetry), *pFailure);\n            }\n        }\n\n        ThreadFailureCallbackHolder(ThreadFailureCallbackHolder const&) = delete;\n        ThreadFailureCallbackHolder& operator=(ThreadFailureCallbackHolder const&) = delete;\n\n    private:\n        static long volatile s_telemetryId;\n\n        ThreadFailureCallbackHolder** m_ppThreadList;\n        IFailureCallback* m_pCallback;\n        ThreadFailureCallbackHolder* m_pNext;\n        DWORD m_threadId;\n        wil::CallContextInfo* m_pCallContext;\n    };\n\n    __declspec(selectany) long volatile ThreadFailureCallbackHolder::s_telemetryId = 1;\n\n    template <typename TLambda>\n    class ThreadFailureCallbackFn final : public IFailureCallback\n    {\n    public:\n        explicit ThreadFailureCallbackFn(_In_opt_ CallContextInfo* pContext, _Inout_ TLambda&& errorFunction) WI_NOEXCEPT\n            : m_errorFunction(wistd::move(errorFunction)),\n              m_callbackHolder(this, pContext)\n        {\n        }\n\n        ThreadFailureCallbackFn(_Inout_ ThreadFailureCallbackFn&& other) WI_NOEXCEPT\n            : m_errorFunction(wistd::move(other.m_errorFunction)),\n              m_callbackHolder(this, other.m_callbackHolder.CallContextInfo())\n        {\n        }\n\n        bool NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT override\n        {\n            return m_errorFunction(failure);\n        }\n\n    private:\n        ThreadFailureCallbackFn(_In_ ThreadFailureCallbackFn const&);\n        ThreadFailureCallbackFn& operator=(_In_ ThreadFailureCallbackFn const&);\n\n        TLambda m_errorFunction;\n        ThreadFailureCallbackHolder m_callbackHolder;\n    };\n\n    // returns true if telemetry was reported for this error\n    inline void __stdcall GetContextAndNotifyFailure(\n        _Inout_ FailureInfo* pFailure,\n        _Out_writes_(callContextStringLength) _Post_z_ PSTR callContextString,\n        _Pre_satisfies_(callContextStringLength > 0) size_t callContextStringLength) WI_NOEXCEPT\n    {\n        ThreadFailureCallbackHolder::GetContextAndNotifyFailure(pFailure, callContextString, callContextStringLength);\n\n        // Update the process-wide failure cache\n        wil::SetLastError(*pFailure);\n    }\n\n    template <typename T, typename... TCtorArgs>\n    void InitGlobalWithStorage(WilInitializeCommand state, void* storage, T*& global, TCtorArgs&&... args)\n    {\n        if ((state == WilInitializeCommand::Create) && !global)\n        {\n            global = ::new (storage) T(wistd::forward<TCtorArgs>(args)...);\n        }\n        else if ((state == WilInitializeCommand::Destroy) && global)\n        {\n            global->~T();\n            global = nullptr;\n        }\n    }\n} // namespace details\n/// @endcond\n\n/** Modules that cannot use CRT-based static initialization may call this method from their entrypoint\n    instead. Disable the use of CRT-based initializers by defining RESULT_SUPPRESS_STATIC_INITIALIZERS\n    while compiling this header.  Linking together libraries that disagree on this setting and calling\n    this method will behave correctly. It may be necessary to recompile all statically linked libraries\n    with the RESULT_SUPPRESS_... setting to eliminate all \"LNK4201 - CRT section exists, but...\" errors.\n*/\ninline void WilInitialize_Result(WilInitializeCommand state)\n{\n    static unsigned char s_processLocalData[sizeof(*details_abi::g_pProcessLocalData)];\n    static unsigned char s_threadFailureCallbacks[sizeof(*details::g_pThreadFailureCallbacks)];\n\n    details::InitGlobalWithStorage(state, s_processLocalData, details_abi::g_pProcessLocalData, \"WilError_03\");\n    details::InitGlobalWithStorage(state, s_threadFailureCallbacks, details::g_pThreadFailureCallbacks);\n\n    if (state == WilInitializeCommand::Create)\n    {\n        details::g_pfnGetContextAndNotifyFailure = details::GetContextAndNotifyFailure;\n    }\n}\n\n/// @cond\nnamespace details\n{\n#ifndef RESULT_SUPPRESS_STATIC_INITIALIZERS\n    __declspec(selectany) ::wil::details_abi::ProcessLocalStorage<::wil::details_abi::ProcessLocalData> g_processLocalData(\"WilError_03\");\n    __declspec(selectany) ::wil::details_abi::ThreadLocalStorage<ThreadFailureCallbackHolder*> g_threadFailureCallbacks;\n\n    WI_HEADER_INITIALIZATION_FUNCTION(InitializeResultHeader, [] {\n        g_pfnGetContextAndNotifyFailure = GetContextAndNotifyFailure;\n        ::wil::details_abi::g_pProcessLocalData = &g_processLocalData;\n        g_pThreadFailureCallbacks = &g_threadFailureCallbacks;\n        return 1;\n    });\n#endif\n} // namespace details\n/// @endcond\n\n// This helper functions much like scope_exit -- give it a lambda and get back a local object that can be used to\n// catch all errors happening in your module through all WIL error handling mechanisms.  The lambda will be called\n// once for each error throw, error return, or error catch that is handled while the returned object is still in\n// scope.  Usage:\n//\n// auto monitor = wil::ThreadFailureCallback([](wil::FailureInfo const &failure)\n// {\n//     // Write your code that logs or cares about failure details here...\n//     // It has access to HRESULT, filename, line number, etc through the failure param.\n// });\n//\n// As long as the returned 'monitor' object remains in scope, the lambda will continue to receive callbacks for any\n// failures that occur in this module on the calling thread.  Note that this will guarantee that the lambda will run\n// for any failure that is through any of the WIL macros (THROW_XXX, RETURN_XXX, LOG_XXX, etc).\n\ntemplate <typename TLambda>\ninline wil::details::ThreadFailureCallbackFn<TLambda> ThreadFailureCallback(_Inout_ TLambda&& fnAtExit) WI_NOEXCEPT\n{\n    return wil::details::ThreadFailureCallbackFn<TLambda>(nullptr, wistd::forward<TLambda>(fnAtExit));\n}\n\n// Much like ThreadFailureCallback, this class will receive WIL failure notifications from the time it's instantiated\n// until the time that it's destroyed.  At any point during that time you can ask for the last failure that was seen\n// by any of the WIL macros (RETURN_XXX, THROW_XXX, LOG_XXX, etc) on the current thread.\n//\n// This class is most useful when utilized as a member of an RAII class that's dedicated to providing logging or\n// telemetry.  In the destructor of that class, if the operation had not been completed successfully (it goes out of\n// scope due to early return or exception unwind before success is acknowledged) then details about the last failure\n// can be retrieved and appropriately logged.\n//\n// Usage:\n//\n// class MyLogger\n// {\n// public:\n//     MyLogger() : m_fComplete(false) {}\n//     ~MyLogger()\n//     {\n//         if (!m_fComplete)\n//         {\n//             FailureInfo *pFailure = m_cache.GetFailure();\n//             if (pFailure != nullptr)\n//             {\n//                 // Log information about pFailure (pFileure->hr, pFailure->pszFile, pFailure->uLineNumber, etc)\n//             }\n//             else\n//             {\n//                 // It's possible that you get stack unwind from an exception that did NOT come through WIL\n//                 // like (std::bad_alloc from the STL).  Use a reasonable default like: HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION).\n//             }\n//         }\n//     }\n//     void Complete() { m_fComplete = true; }\n// private:\n//     bool m_fComplete;\n//     ThreadFailureCache m_cache;\n// };\n\nclass ThreadFailureCache final : public details::IFailureCallback\n{\npublic:\n    ThreadFailureCache() : m_callbackHolder(this)\n    {\n    }\n\n    ThreadFailureCache(ThreadFailureCache&& rhs) WI_NOEXCEPT : m_failure(wistd::move(rhs.m_failure)), m_callbackHolder(this)\n    {\n    }\n\n    ThreadFailureCache& operator=(ThreadFailureCache&& rhs) WI_NOEXCEPT\n    {\n        m_failure = wistd::move(rhs.m_failure);\n        return *this;\n    }\n\n    void WatchCurrentThread()\n    {\n        m_callbackHolder.StartWatching();\n    }\n\n    void IgnoreCurrentThread()\n    {\n        m_callbackHolder.StopWatching();\n    }\n\n    FailureInfo const* GetFailure()\n    {\n        return (FAILED(m_failure.GetFailureInfo().hr) ? &(m_failure.GetFailureInfo()) : nullptr);\n    }\n\n    bool NotifyFailure(FailureInfo const& failure) WI_NOEXCEPT override\n    {\n        // When we \"cache\" a failure, we bias towards trying to find the origin of the last HRESULT\n        // generated, so we ignore subsequent failures on the same error code (assuming propagation).\n\n        if (failure.hr != m_failure.GetFailureInfo().hr)\n        {\n            m_failure.SetFailureInfo(failure);\n        }\n        return false;\n    }\n\nprivate:\n    StoredFailureInfo m_failure;\n    details::ThreadFailureCallbackHolder m_callbackHolder;\n};\n\n} // namespace wil\n\n#pragma warning(pop)\n\n#endif\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/result_macros.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: supporting file defining a family of macros and functions designed to uniformly handle errors\n//! across return codes, fail fast, exceptions and logging.\n#ifndef __WIL_RESULTMACROS_INCLUDED\n#define __WIL_RESULTMACROS_INCLUDED\n\n// WARNING:\n// Code within this scope must satisfy both C99 and C++\n\n#include \"common.h\"\n\n#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n#include <Windows.h>\n#endif\n\n// Setup the debug behavior. For kernel-mode, we ignore NDEBUG because that gets set automatically\n// for driver projects. We mimic the behavior of NT_ASSERT which checks only for DBG.\n// RESULT_NO_DEBUG is provided as an opt-out mechanism.\n#ifndef RESULT_DEBUG\n#if (DBG || defined(DEBUG) || defined(_DEBUG)) && !defined(RESULT_NO_DEBUG) && (defined(WIL_KERNEL_MODE) || !defined(NDEBUG))\n#define RESULT_DEBUG\n#endif\n#endif\n\n/// @cond\n#if defined(_PREFAST_)\n#define __WI_ANALYSIS_ASSUME(_exp) _Analysis_assume_(_exp)\n#else\n#ifdef RESULT_DEBUG\n#define __WI_ANALYSIS_ASSUME(_exp) ((void)0)\n#else\n// NOTE: Clang does not currently handle __noop correctly and will fail to compile if the argument is not copy\n//       constructible. Therefore, use 'sizeof' for syntax validation. We don't do this universally for all compilers\n//       since lambdas are not allowed in unevaluated contexts prior to C++20, which does not appear to affect __noop\n#if !defined(_MSC_VER) || defined(__clang__)\n#define __WI_ANALYSIS_ASSUME(_exp) ((void)sizeof(!(_exp))) // Validate syntax on non-debug builds\n#else\n#define __WI_ANALYSIS_ASSUME(_exp) __noop(_exp)\n#endif\n#endif\n#endif // _PREFAST_\n\n//*****************************************************************************\n// Assert Macros\n//*****************************************************************************\n\n#ifdef RESULT_DEBUG\n#if defined(__clang__) && defined(_WIN32)\n// Clang currently mis-handles '__annotation' for 32-bit - https://bugs.llvm.org/show_bug.cgi?id=41890\n#define __WI_ASSERT_FAIL_ANNOTATION(msg) (void)0\n#else\n#define __WI_ASSERT_FAIL_ANNOTATION(msg) __annotation(L\"Debug\", L\"AssertFail\", msg)\n#endif\n\n#define WI_ASSERT_FAIL(msg) __WI_ASSERT_FAIL_ANNOTATION(L\"\" msg), DbgRaiseAssertionFailure()\n#define WI_ASSERT(condition) (__WI_ANALYSIS_ASSUME(condition), ((!(condition)) ? (WI_ASSERT_FAIL(#condition), FALSE) : TRUE))\n#define WI_ASSERT_MSG(condition, msg) \\\n    (__WI_ANALYSIS_ASSUME(condition), ((!(condition)) ? (__WI_ASSERT_FAIL_ANNOTATION(L##msg), DbgRaiseAssertionFailure(), FALSE) : TRUE))\n#define WI_ASSERT_NOASSUME WI_ASSERT\n#define WI_ASSERT_MSG_NOASSUME WI_ASSERT_MSG\n#define WI_VERIFY WI_ASSERT\n#define WI_VERIFY_MSG WI_ASSERT_MSG\n#define WI_VERIFY_SUCCEEDED(condition) WI_ASSERT(SUCCEEDED(condition))\n#else\n#define WI_ASSERT_FAIL(msg)\n#define WI_ASSERT(condition) (__WI_ANALYSIS_ASSUME(condition), 0)\n#define WI_ASSERT_MSG(condition, msg) (__WI_ANALYSIS_ASSUME(condition), 0)\n#define WI_ASSERT_NOASSUME(condition) ((void)0)\n#define WI_ASSERT_MSG_NOASSUME(condition, msg) ((void)0)\n#define WI_VERIFY(condition) (__WI_ANALYSIS_ASSUME(condition), ((condition) ? TRUE : FALSE))\n#define WI_VERIFY_MSG(condition, msg) (__WI_ANALYSIS_ASSUME(condition), ((condition) ? TRUE : FALSE))\n#define WI_VERIFY_SUCCEEDED(condition) (__WI_ANALYSIS_ASSUME(SUCCEEDED(condition)), ((SUCCEEDED(condition)) ? TRUE : FALSE))\n#endif // RESULT_DEBUG\n\n#if !defined(_NTDEF_)\ntypedef _Return_type_success_(return >= 0) LONG NTSTATUS;\n#endif\n#ifndef STATUS_SUCCESS\n#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)\n#endif\n#ifndef STATUS_UNSUCCESSFUL\n#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)\n#endif\n#ifndef __NTSTATUS_FROM_WIN32\n#define __NTSTATUS_FROM_WIN32(x) \\\n    ((NTSTATUS)(x) <= 0 ? ((NTSTATUS)(x)) : ((NTSTATUS)(((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | ERROR_SEVERITY_ERROR)))\n#endif\n\n#ifndef WIL_AllocateMemory\n#ifdef _KERNEL_MODE\n#define WIL_AllocateMemory(SIZE) ExAllocatePoolWithTag(NonPagedPoolNx, SIZE, 'LIW')\nWI_ODR_PRAGMA(\"WIL_AllocateMemory\", \"2\")\n#else\n#define WIL_AllocateMemory(SIZE) HeapAlloc(GetProcessHeap(), 0, SIZE)\nWI_ODR_PRAGMA(\"WIL_AllocateMemory\", \"1\")\n#endif\n#else\nWI_ODR_PRAGMA(\"WIL_AllocateMemory\", \"0\")\n#endif\n\n#ifndef WIL_FreeMemory\n#ifdef _KERNEL_MODE\n#define WIL_FreeMemory(MEM) ExFreePoolWithTag(MEM, 'LIW')\nWI_ODR_PRAGMA(\"WIL_FreeMemory\", \"2\")\n#else\n#define WIL_FreeMemory(MEM) HeapFree(GetProcessHeap(), 0, MEM)\nWI_ODR_PRAGMA(\"WIL_FreeMemory\", \"1\")\n#endif\n#else\nWI_ODR_PRAGMA(\"WIL_FreeMemory\", \"0\")\n#endif\n\n// It would appear as though the C++17 \"noexcept is part of the type system\" update in MSVC has \"infected\" the behavior\n// when compiling with C++14 (the default...), however the updated behavior for decltype understanding noexcept is _not_\n// present... So, work around it\n#if __cpp_noexcept_function_type >= 201510L\n#define WI_PFN_NOEXCEPT WI_NOEXCEPT\n#else\n#define WI_PFN_NOEXCEPT\n#endif\n/// @endcond\n\n#if defined(__cplusplus) && !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n\n#include <strsafe.h>\n#include <intrin.h> // provides the _ReturnAddress() intrinsic\n#include <new.h>    // provides 'operator new', 'std::nothrow', etc.\n#if defined(WIL_ENABLE_EXCEPTIONS) && !defined(WIL_SUPPRESS_NEW)\n#include <new> // provides std::bad_alloc in the windows and public CRT headers\n#endif\n\n#pragma warning(push)\n#pragma warning(disable : 4714 6262) // __forceinline not honored, stack size\n\n//*****************************************************************************\n// Behavioral setup (error handling macro configuration)\n//*****************************************************************************\n// Set any of the following macros to the values given below before including Result.h to\n// control the error handling macro's trade-offs between diagnostics and performance\n\n// RESULT_DIAGNOSTICS_LEVEL\n// This define controls the level of diagnostic instrumentation that is built into the binary as a\n// byproduct of using the macros.  The amount of diagnostic instrumentation that is supplied is\n// a trade-off between diagnosibility of issues and code size and performance.  The modes are:\n//      0   - No diagnostics, smallest & fastest (subject to tail-merge)\n//      1   - No diagnostics, unique call sites for each macro (defeat's tail-merge)\n//      2   - Line number\n//      3   - Line number + source filename\n//      4   - Line number + source filename + function name\n//      5   - Line number + source filename + function name + code within the macro\n// By default, mode 3 is used in free builds and mode 5 is used in checked builds.  Note that the\n// _ReturnAddress() will always be available through all modes when possible.\n\n// RESULT_INCLUDE_CALLER_RETURNADDRESS\n// This controls whether or not the _ReturnAddress() of the function that includes the macro will\n// be reported to telemetry.  Note that this is in addition to the _ReturnAddress() of the actual\n// macro position (which is always reported).  The values are:\n//      0   - The address is not included\n//      1   - The address is included\n// The default value is '1'.\n\n// RESULT_INLINE_ERROR_TESTS\n// For conditional macros (other than RETURN_XXX), this controls whether branches will be evaluated\n// within the call containing the macro or will be forced into the function called by the macros.\n// Pushing branching into the called function reduces code size and the number of unique branches\n// evaluated, but increases the instruction count executed per macro.\n//      0   - Branching will not happen inline to the macros\n//      1   - Branching is pushed into the calling function via __forceinline\n// The default value is '1'.  Note that XXX_MSG functions are always effectively mode '0' due to the\n// compiler's unwillingness to inline var-arg functions.\n\n// RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST\n// RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST\n// RESULT_INLINE_ERROR_TESTS_FAIL_FAST\n// These defines are identical to those above in form/function, but only applicable to fail fast error\n// handling allowing a process to have different diagnostic information and performance characteristics\n// for fail fast than for other error handling given the different reporting infrastructure (Watson\n// vs Telemetry).\n\n// Set the default diagnostic mode\n// Note that RESULT_DEBUG_INFO and RESULT_SUPPRESS_DEBUG_INFO are older deprecated models of controlling mode\n/// @cond\n#ifndef RESULT_DIAGNOSTICS_LEVEL\n#if (defined(RESULT_DEBUG) || defined(RESULT_DEBUG_INFO)) && !defined(RESULT_SUPPRESS_DEBUG_INFO)\n#define RESULT_DIAGNOSTICS_LEVEL 5\n#else\n#define RESULT_DIAGNOSTICS_LEVEL 3\n#endif\n#endif\n#ifndef RESULT_INCLUDE_CALLER_RETURNADDRESS\n#define RESULT_INCLUDE_CALLER_RETURNADDRESS 1\n#endif\n#ifndef RESULT_INLINE_ERROR_TESTS\n#define RESULT_INLINE_ERROR_TESTS 1\n#endif\n#ifndef RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST\n#define RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST RESULT_DIAGNOSTICS_LEVEL\n#endif\n#ifndef RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST\n#define RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST RESULT_INCLUDE_CALLER_RETURNADDRESS\n#endif\n#ifndef RESULT_INLINE_ERROR_TESTS_FAIL_FAST\n#define RESULT_INLINE_ERROR_TESTS_FAIL_FAST RESULT_INLINE_ERROR_TESTS\n#endif\n/// @endcond\n\n//*****************************************************************************\n// Win32 specific error macros\n//*****************************************************************************\n\n#define FAILED_WIN32(win32err) ((win32err) != 0)\n#define SUCCEEDED_WIN32(win32err) ((win32err) == 0)\n\n//*****************************************************************************\n// NT_STATUS specific error macros\n//*****************************************************************************\n\n#define FAILED_NTSTATUS(status) (((NTSTATUS)(status)) < 0)\n#define SUCCEEDED_NTSTATUS(status) (((NTSTATUS)(status)) >= 0)\n\n//*****************************************************************************\n// Testing helpers - redefine to run unit tests against fail fast\n//*****************************************************************************\n/// @cond\n#ifndef RESULT_NORETURN\n#define RESULT_NORETURN __declspec(noreturn)\n#endif\n#ifndef RESULT_NORETURN_NULL\n#define RESULT_NORETURN_NULL _Ret_notnull_\n#endif\n#ifndef RESULT_NORETURN_RESULT\n#define RESULT_NORETURN_RESULT(expr) (void)(expr);\n#endif\n/// @endcond\n\n//*****************************************************************************\n// Helpers to setup the macros and functions used below... do not directly use.\n//*****************************************************************************\n\n/// @cond\n#define __R_DIAGNOSTICS(diagnostics) diagnostics.returnAddress, diagnostics.line, diagnostics.file, nullptr, nullptr\n#define __R_DIAGNOSTICS_RA(diagnostics, address) \\\n    diagnostics.returnAddress, diagnostics.line, diagnostics.file, nullptr, nullptr, address\n#define __R_FN_PARAMS_FULL \\\n    _In_opt_ void *callerReturnAddress, unsigned int lineNumber, _In_opt_ PCSTR fileName, _In_opt_ PCSTR functionName, \\\n        _In_opt_ PCSTR code, void *returnAddress\n#define __R_FN_LOCALS_FULL_RA \\\n    void* callerReturnAddress = nullptr; \\\n    unsigned int lineNumber = 0; \\\n    PCSTR fileName = nullptr; \\\n    PCSTR functionName = nullptr; \\\n    PCSTR code = nullptr; \\\n    void* returnAddress = _ReturnAddress();\n// NOTE: This BEGINs the common macro handling (__R_ prefix) for non-fail fast handled cases\n//       This entire section will be repeated below for fail fast (__RFF_ prefix).\n#define __R_COMMA ,\n#define __R_FN_CALL_FULL callerReturnAddress, lineNumber, fileName, functionName, code, returnAddress\n#define __R_FN_CALL_FULL_RA callerReturnAddress, lineNumber, fileName, functionName, code, _ReturnAddress()\n// The following macros assemble the varying amount of data we want to collect from the macros, treating it uniformly\n#if (RESULT_DIAGNOSTICS_LEVEL >= 2) // line number\n#define __R_IF_LINE(term) term\n#define __R_IF_NOT_LINE(term)\n#define __R_IF_COMMA ,\n#define __R_LINE_VALUE static_cast<unsigned short>(__LINE__)\n#else\n#define __R_IF_LINE(term)\n#define __R_IF_NOT_LINE(term) term\n#define __R_IF_COMMA\n#define __R_LINE_VALUE static_cast<unsigned short>(0)\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL >= 3) // line number + file name\n#define __R_IF_FILE(term) term\n#define __R_IF_NOT_FILE(term)\n#define __R_FILE_VALUE __FILE__\n#else\n#define __R_IF_FILE(term)\n#define __R_IF_NOT_FILE(term) term\n#define __R_FILE_VALUE nullptr\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL >= 4) // line number + file name + function name\n#define __R_IF_FUNCTION(term) term\n#define __R_IF_NOT_FUNCTION(term)\n#else\n#define __R_IF_FUNCTION(term)\n#define __R_IF_NOT_FUNCTION(term) term\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL >= 5) // line number + file name + function name + macro code\n#define __R_IF_CODE(term) term\n#define __R_IF_NOT_CODE(term)\n#else\n#define __R_IF_CODE(term)\n#define __R_IF_NOT_CODE(term) term\n#endif\n#if (RESULT_INCLUDE_CALLER_RETURNADDRESS == 1)\n#define __R_IF_CALLERADDRESS(term) term\n#define __R_IF_NOT_CALLERADDRESS(term)\n#define __R_CALLERADDRESS_VALUE _ReturnAddress()\n#else\n#define __R_IF_CALLERADDRESS(term)\n#define __R_IF_NOT_CALLERADDRESS(term) term\n#define __R_CALLERADDRESS_VALUE nullptr\n#endif\n#if (RESULT_INCLUDE_CALLER_RETURNADDRESS == 1) || (RESULT_DIAGNOSTICS_LEVEL >= 2)\n#define __R_IF_TRAIL_COMMA ,\n#else\n#define __R_IF_TRAIL_COMMA\n#endif\n// Assemble the varying amounts of data into a single macro\n#define __R_INFO_ONLY(CODE) \\\n    __R_IF_CALLERADDRESS(_ReturnAddress() __R_IF_COMMA) \\\n    __R_IF_LINE(__R_LINE_VALUE) \\\n    __R_IF_FILE(__R_COMMA __R_FILE_VALUE) __R_IF_FUNCTION(__R_COMMA __FUNCTION__) __R_IF_CODE(__R_COMMA CODE)\n#define __R_INFO(CODE) __R_INFO_ONLY(CODE) __R_IF_TRAIL_COMMA\n#define __R_INFO_NOFILE_ONLY(CODE) \\\n    __R_IF_CALLERADDRESS(_ReturnAddress() __R_IF_COMMA) \\\n    __R_IF_LINE(__R_LINE_VALUE) __R_IF_FILE(__R_COMMA \"wil\") __R_IF_FUNCTION(__R_COMMA __FUNCTION__) __R_IF_CODE(__R_COMMA CODE)\n#define __R_INFO_NOFILE(CODE) __R_INFO_NOFILE_ONLY(CODE) __R_IF_TRAIL_COMMA\n#define __R_FN_PARAMS_ONLY \\\n    __R_IF_CALLERADDRESS(void* callerReturnAddress __R_IF_COMMA) \\\n    __R_IF_LINE(unsigned int lineNumber) \\\n    __R_IF_FILE(__R_COMMA _In_opt_ PCSTR fileName) \\\n    __R_IF_FUNCTION(__R_COMMA _In_opt_ PCSTR functionName) __R_IF_CODE(__R_COMMA _In_opt_ PCSTR code)\n#define __R_FN_PARAMS __R_FN_PARAMS_ONLY __R_IF_TRAIL_COMMA\n#define __R_FN_CALL_ONLY \\\n    __R_IF_CALLERADDRESS(callerReturnAddress __R_IF_COMMA) \\\n    __R_IF_LINE(lineNumber) __R_IF_FILE(__R_COMMA fileName) __R_IF_FUNCTION(__R_COMMA functionName) __R_IF_CODE(__R_COMMA code)\n#define __R_FN_CALL __R_FN_CALL_ONLY __R_IF_TRAIL_COMMA\n#define __R_FN_LOCALS \\\n    __R_IF_NOT_CALLERADDRESS(void* callerReturnAddress = nullptr;) \\\n    __R_IF_NOT_LINE(unsigned int lineNumber = 0;) \\\n    __R_IF_NOT_FILE(PCSTR fileName = nullptr;) \\\n    __R_IF_NOT_FUNCTION(PCSTR functionName = nullptr;) __R_IF_NOT_CODE(PCSTR code = nullptr;)\n#define __R_FN_LOCALS_RA \\\n    __R_IF_NOT_CALLERADDRESS(void* callerReturnAddress = nullptr;) \\\n    __R_IF_NOT_LINE(unsigned int lineNumber = 0;) \\\n    __R_IF_NOT_FILE(PCSTR fileName = nullptr;) \\\n    __R_IF_NOT_FUNCTION(PCSTR functionName = nullptr;) \\\n    __R_IF_NOT_CODE(PCSTR code = nullptr;) void* returnAddress = _ReturnAddress();\n#define __R_FN_UNREFERENCED \\\n    __R_IF_CALLERADDRESS((void)callerReturnAddress;) \\\n    __R_IF_LINE((void)lineNumber;) __R_IF_FILE((void)fileName;) __R_IF_FUNCTION((void)functionName;) __R_IF_CODE((void)code;)\n// 1) Direct Methods\n//      * Called Directly by Macros\n//      * Always noinline\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#define __R_DIRECT_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RetType MethodName\n#define __R_DIRECT_NORET_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RESULT_NORETURN RetType MethodName\n#else\n#define __R_DIRECT_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __R_DIRECT_NORET_METHOD(RetType, MethodName) inline __declspec(noinline) RESULT_NORETURN RetType MethodName\n#endif\n#define __R_DIRECT_FN_PARAMS __R_FN_PARAMS\n#define __R_DIRECT_FN_PARAMS_ONLY __R_FN_PARAMS_ONLY\n#define __R_DIRECT_FN_CALL __R_FN_CALL_FULL_RA __R_COMMA\n#define __R_DIRECT_FN_CALL_ONLY __R_FN_CALL_FULL_RA\n// 2) Internal Methods\n//      * Only called by Conditional routines\n//      * 'inline' when (RESULT_INLINE_ERROR_TESTS = 0 and RESULT_DIAGNOSTICS_LEVEL != 1), otherwise noinline (directly called by code when branching is forceinlined)\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL == 1 and RESULT_INLINE_ERROR_TESTS = 1)\n#if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#define __R_INTERNAL_NOINLINE_METHOD(MethodName) inline __declspec(noinline) void MethodName\n#define __R_INTERNAL_NOINLINE_NORET_METHOD(MethodName) inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __R_INTERNAL_INLINE_METHOD(MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) void MethodName\n#define __R_INTERNAL_INLINE_NORET_METHOD(MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __R_CALL_INTERNAL_INLINE_METHOD(MethodName) MethodName<optimizerCounter>\n#else\n#define __R_INTERNAL_NOINLINE_METHOD(MethodName) inline void MethodName\n#define __R_INTERNAL_NOINLINE_NORET_METHOD(MethodName) inline RESULT_NORETURN void MethodName\n#define __R_INTERNAL_INLINE_METHOD(MethodName) inline __declspec(noinline) void MethodName\n#define __R_INTERNAL_INLINE_NORET_METHOD(MethodName) inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __R_CALL_INTERNAL_INLINE_METHOD(MethodName) MethodName\n#endif\n#define __R_CALL_INTERNAL_NOINLINE_METHOD(MethodName) MethodName\n#define __R_INTERNAL_NOINLINE_FN_PARAMS __R_FN_PARAMS void* returnAddress __R_COMMA\n#define __R_INTERNAL_NOINLINE_FN_PARAMS_ONLY __R_FN_PARAMS void* returnAddress\n#define __R_INTERNAL_NOINLINE_FN_CALL __R_FN_CALL_FULL __R_COMMA\n#define __R_INTERNAL_NOINLINE_FN_CALL_ONLY __R_FN_CALL_FULL\n#define __R_INTERNAL_INLINE_FN_PARAMS __R_FN_PARAMS\n#define __R_INTERNAL_INLINE_FN_PARAMS_ONLY __R_FN_PARAMS_ONLY\n#define __R_INTERNAL_INLINE_FN_CALL __R_FN_CALL_FULL_RA __R_COMMA\n#define __R_INTERNAL_INLINE_FN_CALL_ONLY __R_FN_CALL_FULL_RA\n#if (RESULT_INLINE_ERROR_TESTS == 0)\n#define __R_INTERNAL_METHOD __R_INTERNAL_NOINLINE_METHOD\n#define __R_INTERNAL_NORET_METHOD __R_INTERNAL_NOINLINE_NORET_METHOD\n#define __R_CALL_INTERNAL_METHOD __R_CALL_INTERNAL_NOINLINE_METHOD\n#define __R_INTERNAL_FN_PARAMS __R_INTERNAL_NOINLINE_FN_PARAMS\n#define __R_INTERNAL_FN_PARAMS_ONLY __R_INTERNAL_NOINLINE_FN_PARAMS_ONLY\n#define __R_INTERNAL_FN_CALL __R_INTERNAL_NOINLINE_FN_CALL\n#define __R_INTERNAL_FN_CALL_ONLY __R_INTERNAL_NOINLINE_FN_CALL_ONLY\n#else\n#define __R_INTERNAL_METHOD __R_INTERNAL_INLINE_METHOD\n#define __R_INTERNAL_NORET_METHOD __R_INTERNAL_INLINE_NORET_METHOD\n#define __R_CALL_INTERNAL_METHOD __R_CALL_INTERNAL_INLINE_METHOD\n#define __R_INTERNAL_FN_PARAMS __R_INTERNAL_INLINE_FN_PARAMS\n#define __R_INTERNAL_FN_PARAMS_ONLY __R_INTERNAL_INLINE_FN_PARAMS_ONLY\n#define __R_INTERNAL_FN_CALL __R_INTERNAL_INLINE_FN_CALL\n#define __R_INTERNAL_FN_CALL_ONLY __R_INTERNAL_INLINE_FN_CALL_ONLY\n#endif\n// 3) Conditional Methods\n//      * Called Directly by Macros\n//      * May be noinline or __forceinline depending upon (RESULT_INLINE_ERROR_TESTS)\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#define __R_CONDITIONAL_NOINLINE_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RetType MethodName\n#define __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __R_CONDITIONAL_INLINE_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    __forceinline RetType MethodName\n#define __R_CONDITIONAL_INLINE_TEMPLATE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __R_CONDITIONAL_PARTIAL_TEMPLATE unsigned int optimizerCounter __R_COMMA\n#else\n#define __R_CONDITIONAL_NOINLINE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __R_CONDITIONAL_INLINE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __R_CONDITIONAL_INLINE_TEMPLATE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __R_CONDITIONAL_PARTIAL_TEMPLATE\n#endif\n#define __R_CONDITIONAL_NOINLINE_FN_CALL __R_FN_CALL _ReturnAddress() __R_COMMA\n#define __R_CONDITIONAL_NOINLINE_FN_CALL_ONLY __R_FN_CALL _ReturnAddress()\n#define __R_CONDITIONAL_INLINE_FN_CALL __R_FN_CALL\n#define __R_CONDITIONAL_INLINE_FN_CALL_ONLY __R_FN_CALL_ONLY\n#if (RESULT_INLINE_ERROR_TESTS == 0)\n#define __R_CONDITIONAL_METHOD __R_CONDITIONAL_NOINLINE_METHOD\n#define __R_CONDITIONAL_TEMPLATE_METHOD __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD\n#define __R_CONDITIONAL_FN_CALL __R_CONDITIONAL_NOINLINE_FN_CALL\n#define __R_CONDITIONAL_FN_CALL_ONLY __R_CONDITIONAL_NOINLINE_FN_CALL_ONLY\n#else\n#define __R_CONDITIONAL_METHOD __R_CONDITIONAL_INLINE_METHOD\n#define __R_CONDITIONAL_TEMPLATE_METHOD __R_CONDITIONAL_INLINE_TEMPLATE_METHOD\n#define __R_CONDITIONAL_FN_CALL __R_CONDITIONAL_INLINE_FN_CALL\n#define __R_CONDITIONAL_FN_CALL_ONLY __R_CONDITIONAL_INLINE_FN_CALL_ONLY\n#endif\n#define __R_CONDITIONAL_FN_PARAMS __R_FN_PARAMS\n#define __R_CONDITIONAL_FN_PARAMS_ONLY __R_FN_PARAMS_ONLY\n// Macro call-site helpers\n#define __R_NS_ASSEMBLE2(ri, rd) in##ri##diag##rd // Differing internal namespaces eliminate ODR violations between modes\n#define __R_NS_ASSEMBLE(ri, rd) __R_NS_ASSEMBLE2(ri, rd)\n#define __R_NS_NAME __R_NS_ASSEMBLE(RESULT_INLINE_ERROR_TESTS, RESULT_DIAGNOSTICS_LEVEL)\n#define __R_NS wil::details::__R_NS_NAME\n#if (RESULT_DIAGNOSTICS_LEVEL == 1)\n#define __R_FN(MethodName) __R_NS::MethodName<__COUNTER__>\n#else\n#define __R_FN(MethodName) __R_NS::MethodName\n#endif\n// NOTE: This ENDs the common macro handling (__R_ prefix) for non-fail fast handled cases\n//       This entire section is repeated below for fail fast (__RFF_ prefix).  For ease of editing this section, the\n//       process is to copy/paste, and search and replace (__R_ -> __RFF_), (RESULT_DIAGNOSTICS_LEVEL -> RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST),\n//       (RESULT_INLINE_ERROR_TESTS -> RESULT_INLINE_ERROR_TESTS_FAIL_FAST) and (RESULT_INCLUDE_CALLER_RETURNADDRESS -> RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST)\n#define __RFF_COMMA ,\n#define __RFF_FN_CALL_FULL callerReturnAddress, lineNumber, fileName, functionName, code, returnAddress\n#define __RFF_FN_CALL_FULL_RA callerReturnAddress, lineNumber, fileName, functionName, code, _ReturnAddress()\n// The following macros assemble the varying amount of data we want to collect from the macros, treating it uniformly\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST >= 2) // line number\n#define __RFF_IF_LINE(term) term\n#define __RFF_IF_NOT_LINE(term)\n#define __RFF_IF_COMMA ,\n#else\n#define __RFF_IF_LINE(term)\n#define __RFF_IF_NOT_LINE(term) term\n#define __RFF_IF_COMMA\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST >= 3) // line number + file name\n#define __RFF_IF_FILE(term) term\n#define __RFF_IF_NOT_FILE(term)\n#else\n#define __RFF_IF_FILE(term)\n#define __RFF_IF_NOT_FILE(term) term\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST >= 4) // line number + file name + function name\n#define __RFF_IF_FUNCTION(term) term\n#define __RFF_IF_NOT_FUNCTION(term)\n#else\n#define __RFF_IF_FUNCTION(term)\n#define __RFF_IF_NOT_FUNCTION(term) term\n#endif\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST >= 5) // line number + file name + function name + macro code\n#define __RFF_IF_CODE(term) term\n#define __RFF_IF_NOT_CODE(term)\n#else\n#define __RFF_IF_CODE(term)\n#define __RFF_IF_NOT_CODE(term) term\n#endif\n#if (RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST == 1)\n#define __RFF_IF_CALLERADDRESS(term) term\n#define __RFF_IF_NOT_CALLERADDRESS(term)\n#else\n#define __RFF_IF_CALLERADDRESS(term)\n#define __RFF_IF_NOT_CALLERADDRESS(term) term\n#endif\n#if (RESULT_INCLUDE_CALLER_RETURNADDRESS_FAIL_FAST == 1) || (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST >= 2)\n#define __RFF_IF_TRAIL_COMMA ,\n#else\n#define __RFF_IF_TRAIL_COMMA\n#endif\n// Assemble the varying amounts of data into a single macro\n#define __RFF_INFO_ONLY(CODE) \\\n    __RFF_IF_CALLERADDRESS(_ReturnAddress() __RFF_IF_COMMA) \\\n    __RFF_IF_LINE(__R_LINE_VALUE) \\\n    __RFF_IF_FILE(__RFF_COMMA __R_FILE_VALUE) __RFF_IF_FUNCTION(__RFF_COMMA __FUNCTION__) __RFF_IF_CODE(__RFF_COMMA CODE)\n#define __RFF_INFO(CODE) __RFF_INFO_ONLY(CODE) __RFF_IF_TRAIL_COMMA\n#define __RFF_INFO_NOFILE_ONLY(CODE) \\\n    __RFF_IF_CALLERADDRESS(_ReturnAddress() __RFF_IF_COMMA) \\\n    __RFF_IF_LINE(__R_LINE_VALUE) \\\n    __RFF_IF_FILE(__RFF_COMMA \"wil\") __RFF_IF_FUNCTION(__RFF_COMMA __FUNCTION__) __RFF_IF_CODE(__RFF_COMMA CODE)\n#define __RFF_INFO_NOFILE(CODE) __RFF_INFO_NOFILE_ONLY(CODE) __RFF_IF_TRAIL_COMMA\n#define __RFF_FN_PARAMS_ONLY \\\n    __RFF_IF_CALLERADDRESS(void* callerReturnAddress __RFF_IF_COMMA) \\\n    __RFF_IF_LINE(unsigned int lineNumber) \\\n    __RFF_IF_FILE(__RFF_COMMA _In_opt_ PCSTR fileName) \\\n    __RFF_IF_FUNCTION(__RFF_COMMA _In_opt_ PCSTR functionName) __RFF_IF_CODE(__RFF_COMMA _In_opt_ PCSTR code)\n#define __RFF_FN_PARAMS __RFF_FN_PARAMS_ONLY __RFF_IF_TRAIL_COMMA\n#define __RFF_FN_CALL_ONLY \\\n    __RFF_IF_CALLERADDRESS(callerReturnAddress __RFF_IF_COMMA) \\\n    __RFF_IF_LINE(lineNumber) \\\n    __RFF_IF_FILE(__RFF_COMMA fileName) __RFF_IF_FUNCTION(__RFF_COMMA functionName) __RFF_IF_CODE(__RFF_COMMA code)\n#define __RFF_FN_CALL __RFF_FN_CALL_ONLY __RFF_IF_TRAIL_COMMA\n#define __RFF_FN_LOCALS \\\n    __RFF_IF_NOT_CALLERADDRESS(void* callerReturnAddress = nullptr;) \\\n    __RFF_IF_NOT_LINE(unsigned int lineNumber = 0;) \\\n    __RFF_IF_NOT_FILE(PCSTR fileName = nullptr;) \\\n    __RFF_IF_NOT_FUNCTION(PCSTR functionName = nullptr;) __RFF_IF_NOT_CODE(PCSTR code = nullptr;)\n#define __RFF_FN_UNREFERENCED \\\n    __RFF_IF_CALLERADDRESS(callerReturnAddress;) \\\n    __RFF_IF_LINE(lineNumber;) __RFF_IF_FILE(fileName;) __RFF_IF_FUNCTION(functionName;) __RFF_IF_CODE(code;)\n// 1) Direct Methods\n//      * Called Directly by Macros\n//      * Always noinline\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#define __RFF_DIRECT_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RetType MethodName\n#define __RFF_DIRECT_NORET_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RESULT_NORETURN RetType MethodName\n#else\n#define __RFF_DIRECT_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __RFF_DIRECT_NORET_METHOD(RetType, MethodName) inline __declspec(noinline) RESULT_NORETURN RetType MethodName\n#endif\n#define __RFF_DIRECT_FN_PARAMS __RFF_FN_PARAMS\n#define __RFF_DIRECT_FN_PARAMS_ONLY __RFF_FN_PARAMS_ONLY\n#define __RFF_DIRECT_FN_CALL __RFF_FN_CALL_FULL_RA __RFF_COMMA\n#define __RFF_DIRECT_FN_CALL_ONLY __RFF_FN_CALL_FULL_RA\n// 2) Internal Methods\n//      * Only called by Conditional routines\n//      * 'inline' when (RESULT_INLINE_ERROR_TESTS_FAIL_FAST = 0 and RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST != 1), otherwise noinline (directly called by code when branching is forceinlined)\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1 and RESULT_INLINE_ERROR_TESTS_FAIL_FAST = 1)\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#define __RFF_INTERNAL_NOINLINE_METHOD(MethodName) inline __declspec(noinline) void MethodName\n#define __RFF_INTERNAL_NOINLINE_NORET_METHOD(MethodName) inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __RFF_INTERNAL_INLINE_METHOD(MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) void MethodName\n#define __RFF_INTERNAL_INLINE_NORET_METHOD(MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __RFF_CALL_INTERNAL_INLINE_METHOD(MethodName) MethodName<optimizerCounter>\n#else\n#define __RFF_INTERNAL_NOINLINE_METHOD(MethodName) inline void MethodName\n#define __RFF_INTERNAL_NOINLINE_NORET_METHOD(MethodName) inline RESULT_NORETURN void MethodName\n#define __RFF_INTERNAL_INLINE_METHOD(MethodName) inline __declspec(noinline) void MethodName\n#define __RFF_INTERNAL_INLINE_NORET_METHOD(MethodName) inline __declspec(noinline) RESULT_NORETURN void MethodName\n#define __RFF_CALL_INTERNAL_INLINE_METHOD(MethodName) MethodName\n#endif\n#define __RFF_CALL_INTERNAL_NOINLINE_METHOD(MethodName) MethodName\n#define __RFF_INTERNAL_NOINLINE_FN_PARAMS __RFF_FN_PARAMS void* returnAddress __RFF_COMMA\n#define __RFF_INTERNAL_NOINLINE_FN_PARAMS_ONLY __RFF_FN_PARAMS void* returnAddress\n#define __RFF_INTERNAL_NOINLINE_FN_CALL __RFF_FN_CALL_FULL __RFF_COMMA\n#define __RFF_INTERNAL_NOINLINE_FN_CALL_ONLY __RFF_FN_CALL_FULL\n#define __RFF_INTERNAL_INLINE_FN_PARAMS __RFF_FN_PARAMS\n#define __RFF_INTERNAL_INLINE_FN_PARAMS_ONLY __RFF_FN_PARAMS_ONLY\n#define __RFF_INTERNAL_INLINE_FN_CALL __RFF_FN_CALL_FULL_RA __RFF_COMMA\n#define __RFF_INTERNAL_INLINE_FN_CALL_ONLY __RFF_FN_CALL_FULL_RA\n#if (RESULT_INLINE_ERROR_TESTS_FAIL_FAST == 0)\n#define __RFF_INTERNAL_METHOD __RFF_INTERNAL_NOINLINE_METHOD\n#define __RFF_INTERNAL_NORET_METHOD __RFF_INTERNAL_NOINLINE_NORET_METHOD\n#define __RFF_CALL_INTERNAL_METHOD __RFF_CALL_INTERNAL_NOINLINE_METHOD\n#define __RFF_INTERNAL_FN_PARAMS __RFF_INTERNAL_NOINLINE_FN_PARAMS\n#define __RFF_INTERNAL_FN_PARAMS_ONLY __RFF_INTERNAL_NOINLINE_FN_PARAMS_ONLY\n#define __RFF_INTERNAL_FN_CALL __RFF_INTERNAL_NOINLINE_FN_CALL\n#define __RFF_INTERNAL_FN_CALL_ONLY __RFF_INTERNAL_NOINLINE_FN_CALL_ONLY\n#else\n#define __RFF_INTERNAL_METHOD __RFF_INTERNAL_INLINE_METHOD\n#define __RFF_INTERNAL_NORET_METHOD __RFF_INTERNAL_INLINE_NORET_METHOD\n#define __RFF_CALL_INTERNAL_METHOD __RFF_CALL_INTERNAL_INLINE_METHOD\n#define __RFF_INTERNAL_FN_PARAMS __RFF_INTERNAL_INLINE_FN_PARAMS\n#define __RFF_INTERNAL_FN_PARAMS_ONLY __RFF_INTERNAL_INLINE_FN_PARAMS_ONLY\n#define __RFF_INTERNAL_FN_CALL __RFF_INTERNAL_INLINE_FN_CALL\n#define __RFF_INTERNAL_FN_CALL_ONLY __RFF_INTERNAL_INLINE_FN_CALL_ONLY\n#endif\n// 3) Conditional Methods\n//      * Called Directly by Macros\n//      * May be noinline or __forceinline depending upon (RESULT_INLINE_ERROR_TESTS_FAIL_FAST)\n//      * May be template-driven to create unique call sites if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#define __RFF_CONDITIONAL_NOINLINE_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    inline __declspec(noinline) RetType MethodName\n#define __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __RFF_CONDITIONAL_INLINE_METHOD(RetType, MethodName) \\\n    template <unsigned int optimizerCounter> \\\n    __forceinline RetType MethodName\n#define __RFF_CONDITIONAL_INLINE_TEMPLATE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __RFF_CONDITIONAL_PARTIAL_TEMPLATE unsigned int optimizerCounter __RFF_COMMA\n#else\n#define __RFF_CONDITIONAL_NOINLINE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RetType, MethodName) inline __declspec(noinline) RetType MethodName\n#define __RFF_CONDITIONAL_INLINE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __RFF_CONDITIONAL_INLINE_TEMPLATE_METHOD(RetType, MethodName) __forceinline RetType MethodName\n#define __RFF_CONDITIONAL_PARTIAL_TEMPLATE\n#endif\n#define __RFF_CONDITIONAL_NOINLINE_FN_CALL __RFF_FN_CALL _ReturnAddress() __RFF_COMMA\n#define __RFF_CONDITIONAL_NOINLINE_FN_CALL_ONLY __RFF_FN_CALL _ReturnAddress()\n#define __RFF_CONDITIONAL_INLINE_FN_CALL __RFF_FN_CALL\n#define __RFF_CONDITIONAL_INLINE_FN_CALL_ONLY __RFF_FN_CALL_ONLY\n#if (RESULT_INLINE_ERROR_TESTS_FAIL_FAST == 0)\n#define __RFF_CONDITIONAL_METHOD __RFF_CONDITIONAL_NOINLINE_METHOD\n#define __RFF_CONDITIONAL_TEMPLATE_METHOD __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD\n#define __RFF_CONDITIONAL_FN_CALL __RFF_CONDITIONAL_NOINLINE_FN_CALL\n#define __RFF_CONDITIONAL_FN_CALL_ONLY __RFF_CONDITIONAL_NOINLINE_FN_CALL_ONLY\n#else\n#define __RFF_CONDITIONAL_METHOD __RFF_CONDITIONAL_INLINE_METHOD\n#define __RFF_CONDITIONAL_TEMPLATE_METHOD __RFF_CONDITIONAL_INLINE_TEMPLATE_METHOD\n#define __RFF_CONDITIONAL_FN_CALL __RFF_CONDITIONAL_INLINE_FN_CALL\n#define __RFF_CONDITIONAL_FN_CALL_ONLY __RFF_CONDITIONAL_INLINE_FN_CALL_ONLY\n#endif\n#define __RFF_CONDITIONAL_FN_PARAMS __RFF_FN_PARAMS\n#define __RFF_CONDITIONAL_FN_PARAMS_ONLY __RFF_FN_PARAMS_ONLY\n// Macro call-site helpers\n#define __RFF_NS_ASSEMBLE2(ri, rd) in##ri##diag##rd // Differing internal namespaces eliminate ODR violations between modes\n#define __RFF_NS_ASSEMBLE(ri, rd) __RFF_NS_ASSEMBLE2(ri, rd)\n#define __RFF_NS_NAME __RFF_NS_ASSEMBLE(RESULT_INLINE_ERROR_TESTS_FAIL_FAST, RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST)\n#define __RFF_NS wil::details::__RFF_NS_NAME\n#if (RESULT_DIAGNOSTICS_LEVEL_FAIL_FAST == 1)\n#define __RFF_FN(MethodName) __RFF_NS::MethodName<__COUNTER__>\n#else\n#define __RFF_FN(MethodName) __RFF_NS::MethodName\n#endif\n// end-of-repeated fail-fast handling macros\n\n// Force the compiler to evaluate a call to 'wprintf' to verify the format string & args and produce warnings if there\n// are any issues. The short-circuit 'and' will prevent the call and strings used from making it into the binary.\n// Note that this requires using a string literal for the format string. If you don't, you'll get the following compiler\n// error: error C2146: syntax error: missing ')' before identifier '...'\n#if !defined(wprintf) && !defined(WIL_NO_MSG_FORMAT_CHECKS)\n#define __WI_CHECK_MSG_FMT(fmt, ...) (0 && ::wprintf(L\"\" fmt, ##__VA_ARGS__)) ? nullptr : fmt, ##__VA_ARGS__\n#else\n#define __WI_CHECK_MSG_FMT(fmt, ...) fmt, ##__VA_ARGS__\n#endif\n\n// Helpers for return macros\n#define __RETURN_HR_MSG(hr, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        if (FAILED(__hr)) \\\n        { \\\n            __R_FN(Return_HrMsg)(__R_INFO(str) __hr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n        } \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR_MSG_FAIL(hr, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        __R_FN(Return_HrMsg)(__R_INFO(str) __hr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_WIN32_MSG(err, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __err = (err); \\\n        if (FAILED_WIN32(__err)) \\\n        { \\\n            return __R_FN(Return_Win32Msg)(__R_INFO(str) __err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n        } \\\n        return S_OK; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_WIN32_MSG_FAIL(err, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __err = (err); \\\n        return __R_FN(Return_Win32Msg)(__R_INFO(str) __err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_GLE_MSG_FAIL(str, fmt, ...) \\\n    return __R_FN(Return_GetLastErrorMsg)(__R_INFO(str) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define __RETURN_NTSTATUS_MSG(status, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __status = (status); \\\n        if (FAILED_NTSTATUS(__status)) \\\n        { \\\n            return __R_FN(Return_NtStatusMsg)(__R_INFO(str) __status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n        } \\\n        return S_OK; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_NTSTATUS_MSG_FAIL(status, str, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __status = (status); \\\n        return __R_FN(Return_NtStatusMsg)(__R_INFO(str) __status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__)); \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR(hr, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        if (FAILED(__hr)) \\\n        { \\\n            __R_FN(Return_Hr)(__R_INFO(str) __hr); \\\n        } \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR_NOFILE(hr, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        if (FAILED(__hr)) \\\n        { \\\n            __R_FN(Return_Hr)(__R_INFO_NOFILE(str) __hr); \\\n        } \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR_FAIL(hr, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        __R_FN(Return_Hr)(__R_INFO(str) __hr); \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR_FAIL_SUPPRESS_TELEMETRY(hr, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        __R_FN(Return_HrSuppressTelemetry)(__R_INFO(str) __hr); \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_HR_FAIL_NOFILE(hr, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const HRESULT __hr = (hr); \\\n        __R_FN(Return_Hr)(__R_INFO_NOFILE(str) __hr); \\\n        return __hr; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_WIN32(err, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __err = (err); \\\n        if (FAILED_WIN32(__err)) \\\n        { \\\n            return __R_FN(Return_Win32)(__R_INFO(str) __err); \\\n        } \\\n        return S_OK; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_WIN32_FAIL(err, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __err = (err); \\\n        return __R_FN(Return_Win32)(__R_INFO(str) __err); \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_GLE_FAIL(str) return __R_FN(Return_GetLastError)(__R_INFO_ONLY(str))\n#define __RETURN_GLE_FAIL_NOFILE(str) return __R_FN(Return_GetLastError)(__R_INFO_NOFILE_ONLY(str))\n#define __RETURN_NTSTATUS(status, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __status = (status); \\\n        if (FAILED_NTSTATUS(__status)) \\\n        { \\\n            return __R_FN(Return_NtStatus)(__R_INFO(str) __status); \\\n        } \\\n        return S_OK; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __RETURN_NTSTATUS_FAIL(status, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __status = (status); \\\n        return __R_FN(Return_NtStatus)(__R_INFO(str) __status); \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n/// @endcond\n\n//*****************************************************************************\n// Macros for returning failures as HRESULTs\n//*****************************************************************************\n\n// Always returns a known result (HRESULT) - always logs failures\n#define RETURN_HR(hr) __RETURN_HR(wil::verify_hresult(hr), #hr)\n#define RETURN_LAST_ERROR() __RETURN_GLE_FAIL(nullptr)\n#define RETURN_WIN32(win32err) __RETURN_WIN32(win32err, #win32err)\n#define RETURN_NTSTATUS(status) __RETURN_NTSTATUS(status, #status)\n\n// Conditionally returns failures (HRESULT) - always logs failures\n#define RETURN_IF_FAILED(hr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            __RETURN_HR_FAIL(__hrRet, #hr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_BOOL_FALSE(win32BOOL) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __boolRet = wil::verify_BOOL(win32BOOL); \\\n        if (!__boolRet) \\\n        { \\\n            __RETURN_GLE_FAIL(#win32BOOL); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_ERROR(win32err) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __errRet = (win32err); \\\n        if (FAILED_WIN32(__errRet)) \\\n        { \\\n            __RETURN_WIN32_FAIL(__errRet, #win32err); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NULL_ALLOC(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_HR_FAIL(E_OUTOFMEMORY, #ptr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF(hr, condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __RETURN_HR(wil::verify_hresult(hr), #condition); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF_NULL(hr, ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_HR(wil::verify_hresult(hr), #ptr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF(condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __RETURN_GLE_FAIL(#condition); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF_NULL(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_GLE_FAIL(#ptr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NTSTATUS_FAILED(status) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __statusRet = (status); \\\n        if (FAILED_NTSTATUS(__statusRet)) \\\n        { \\\n            __RETURN_NTSTATUS_FAIL(__statusRet, #status); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n// Always returns a known failure (HRESULT) - always logs a var-arg message on failure\n#define RETURN_HR_MSG(hr, fmt, ...) __RETURN_HR_MSG(wil::verify_hresult(hr), #hr, fmt, ##__VA_ARGS__)\n#define RETURN_LAST_ERROR_MSG(fmt, ...) __RETURN_GLE_MSG_FAIL(nullptr, fmt, ##__VA_ARGS__)\n#define RETURN_WIN32_MSG(win32err, fmt, ...) __RETURN_WIN32_MSG(win32err, #win32err, fmt, ##__VA_ARGS__)\n#define RETURN_NTSTATUS_MSG(status, fmt, ...) __RETURN_NTSTATUS_MSG(status, #status, fmt, ##__VA_ARGS__)\n\n// Conditionally returns failures (HRESULT) - always logs a var-arg message on failure\n#define RETURN_IF_FAILED_MSG(hr, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            __RETURN_HR_MSG_FAIL(__hrRet, #hr, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_BOOL_FALSE_MSG(win32BOOL, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (!wil::verify_BOOL(win32BOOL)) \\\n        { \\\n            __RETURN_GLE_MSG_FAIL(#win32BOOL, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_ERROR_MSG(win32err, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __errRet = (win32err); \\\n        if (FAILED_WIN32(__errRet)) \\\n        { \\\n            __RETURN_WIN32_MSG_FAIL(__errRet, #win32err, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NULL_ALLOC_MSG(ptr, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_HR_MSG_FAIL(E_OUTOFMEMORY, #ptr, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF_MSG(hr, condition, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __RETURN_HR_MSG(wil::verify_hresult(hr), #condition, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF_NULL_MSG(hr, ptr, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_HR_MSG(wil::verify_hresult(hr), #ptr, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF_MSG(condition, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __RETURN_GLE_MSG_FAIL(#condition, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF_NULL_MSG(ptr, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_GLE_MSG_FAIL(#ptr, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __statusRet = (status); \\\n        if (FAILED_NTSTATUS(__statusRet)) \\\n        { \\\n            __RETURN_NTSTATUS_MSG_FAIL(__statusRet, #status, fmt, ##__VA_ARGS__); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n// Conditionally returns failures (HRESULT) - use for failures that are expected in common use - failures are not logged - macros are only for control flow pattern\n#define RETURN_IF_FAILED_EXPECTED(hr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            return __hrRet; \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_BOOL_FALSE_EXPECTED(win32BOOL) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (!wil::verify_BOOL(win32BOOL)) \\\n        { \\\n            return wil::details::GetLastErrorFailHr(); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_WIN32_ERROR_EXPECTED(win32err) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const DWORD __errRet = (win32err); \\\n        if (FAILED_WIN32(__errRet)) \\\n        { \\\n            return __HRESULT_FROM_WIN32(__errRet); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NULL_ALLOC_EXPECTED(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            return E_OUTOFMEMORY; \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF_EXPECTED(hr, condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            return wil::verify_hresult(hr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_HR_IF_NULL_EXPECTED(hr, ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            return wil::verify_hresult(hr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF_EXPECTED(condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            return wil::details::GetLastErrorFailHr(); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_LAST_ERROR_IF_NULL_EXPECTED(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            return wil::details::GetLastErrorFailHr(); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define RETURN_IF_NTSTATUS_FAILED_EXPECTED(status) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const NTSTATUS __statusRet = (status); \\\n        if (FAILED_NTSTATUS(__statusRet)) \\\n        { \\\n            return wil::details::NtStatusToHr(__statusRet); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n/// @cond\n#define __WI_OR_IS_EXPECTED_HRESULT(e) || (__hrRet == wil::verify_hresult(e))\n/// @endcond\n#define RETURN_IF_FAILED_WITH_EXPECTED(hr, hrExpected, ...) \\\n    do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            if ((__hrRet == wil::verify_hresult(hrExpected)) WI_FOREACH(__WI_OR_IS_EXPECTED_HRESULT, ##__VA_ARGS__)) \\\n            { \\\n                return __hrRet; \\\n            } \\\n            __RETURN_HR_FAIL(__hrRet, #hr); \\\n        } \\\n    } while ((void)0, 0)\n\n// Always logs failed HR, if expected, telemetry will be called with 'alreadyReported'\n#define RETURN_IF_FAILED_SUPPRESS_TELEMETRY_IF_EXPECTED(hr, hrExpected, ...) \\\n    do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            if ((__hrRet == wil::verify_hresult(hrExpected)) WI_FOREACH(__WI_OR_IS_EXPECTED_HRESULT, ##__VA_ARGS__)) \\\n            { \\\n                __RETURN_HR_FAIL_SUPPRESS_TELEMETRY(__hrRet, #hr); \\\n            } \\\n            __RETURN_HR_FAIL(__hrRet, #hr); \\\n        } \\\n    } while ((void)0, 0)\n\n//*****************************************************************************\n// Macros for logging failures (ignore or pass-through)\n//*****************************************************************************\n\n// Always logs a known failure\n#define LOG_HR(hr) __R_FN(Log_Hr)(__R_INFO(#hr) wil::verify_hresult(hr))\n#define LOG_LAST_ERROR() __R_FN(Log_GetLastError)(__R_INFO_ONLY(nullptr))\n#define LOG_WIN32(win32err) __R_FN(Log_Win32)(__R_INFO(#win32err) win32err)\n#define LOG_NTSTATUS(status) __R_FN(Log_NtStatus)(__R_INFO(#status) status)\n\n// Conditionally logs failures - returns parameter value\n#define LOG_IF_FAILED(hr) __R_FN(Log_IfFailed)(__R_INFO(#hr) wil::verify_hresult(hr))\n#define LOG_IF_WIN32_BOOL_FALSE(win32BOOL) __R_FN(Log_IfWin32BoolFalse)(__R_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL))\n#define LOG_IF_WIN32_ERROR(win32err) __R_FN(Log_IfWin32Error)(__R_INFO(#win32err) win32err)\n#define LOG_IF_NULL_ALLOC(ptr) __R_FN(Log_IfNullAlloc)(__R_INFO(#ptr) ptr)\n#define LOG_HR_IF(hr, condition) __R_FN(Log_HrIf)(__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition))\n#define LOG_HR_IF_NULL(hr, ptr) __R_FN(Log_HrIfNull)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr)\n#define LOG_LAST_ERROR_IF(condition) __R_FN(Log_GetLastErrorIf)(__R_INFO(#condition) wil::verify_bool(condition))\n#define LOG_LAST_ERROR_IF_NULL(ptr) __R_FN(Log_GetLastErrorIfNull)(__R_INFO(#ptr) ptr)\n#define LOG_IF_NTSTATUS_FAILED(status) __R_FN(Log_IfNtStatusFailed)(__R_INFO(#status) status)\n\n// Alternatives for SUCCEEDED(hr) and FAILED(hr) that conditionally log failures\n#define SUCCEEDED_LOG(hr) SUCCEEDED(LOG_IF_FAILED(hr))\n#define FAILED_LOG(hr) FAILED(LOG_IF_FAILED(hr))\n#define SUCCEEDED_WIN32_LOG(win32err) SUCCEEDED_WIN32(LOG_IF_WIN32_ERROR(win32err))\n#define FAILED_WIN32_LOG(win32err) FAILED_WIN32(LOG_IF_WIN32_ERROR(win32err))\n#define SUCCEEDED_NTSTATUS_LOG(status) SUCCEEDED_NTSTATUS(LOG_IF_NTSTATUS_FAILED(status))\n#define FAILED_NTSTATUS_LOG(status) FAILED_NTSTATUS(LOG_IF_NTSTATUS_FAILED(status))\n\n// Alternatives for NT_SUCCESS(x) that conditionally logs failures\n#define NT_SUCCESS_LOG(status) NT_SUCCESS(LOG_IF_NTSTATUS_FAILED(status))\n\n// Always logs a known failure - logs a var-arg message on failure\n#define LOG_HR_MSG(hr, fmt, ...) __R_FN(Log_HrMsg)(__R_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_LAST_ERROR_MSG(fmt, ...) __R_FN(Log_GetLastErrorMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_WIN32_MSG(win32err, fmt, ...) \\\n    __R_FN(Log_Win32Msg)(__R_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_NTSTATUS_MSG(status, fmt, ...) \\\n    __R_FN(Log_NtStatusMsg)(__R_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Conditionally logs failures - returns parameter value - logs a var-arg message on failure\n#define LOG_IF_FAILED_MSG(hr, fmt, ...) \\\n    __R_FN(Log_IfFailedMsg)(__R_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_IF_WIN32_BOOL_FALSE_MSG(win32BOOL, fmt, ...) \\\n    __R_FN(Log_IfWin32BoolFalseMsg)(__R_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_IF_WIN32_ERROR_MSG(win32err, fmt, ...) \\\n    __R_FN(Log_IfWin32ErrorMsg)(__R_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_IF_NULL_ALLOC_MSG(ptr, fmt, ...) \\\n    __R_FN(Log_IfNullAllocMsg)(__R_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_HR_IF_MSG(hr, condition, fmt, ...) \\\n    __R_FN(Log_HrIfMsg) \\\n    (__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_HR_IF_NULL_MSG(hr, ptr, fmt, ...) \\\n    __R_FN(Log_HrIfNullMsg)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_LAST_ERROR_IF_MSG(condition, fmt, ...) \\\n    __R_FN(Log_GetLastErrorIfMsg)(__R_INFO(#condition) wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_LAST_ERROR_IF_NULL_MSG(ptr, fmt, ...) \\\n    __R_FN(Log_GetLastErrorIfNullMsg)(__R_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define LOG_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) \\\n    __R_FN(Log_IfNtStatusFailedMsg)(__R_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n/// @cond\n#define __WI_COMMA_EXPECTED_HRESULT(e) , wil::verify_hresult(e)\n/// @endcond\n#define LOG_IF_FAILED_WITH_EXPECTED(hr, hrExpected, ...) \\\n    __R_FN(Log_IfFailedWithExpected) \\\n    (__R_INFO(#hr) wil::verify_hresult(hr), \\\n     WI_ARGS_COUNT(__VA_ARGS__) + 1, \\\n     wil::verify_hresult(hrExpected) WI_FOREACH(__WI_COMMA_EXPECTED_HRESULT, ##__VA_ARGS__))\n\n//*****************************************************************************\n// Macros to fail fast the process on failures\n//*****************************************************************************\n\n// Always fail fast a known failure\n#define FAIL_FAST_HR(hr) __RFF_FN(FailFast_Hr)(__RFF_INFO(#hr) wil::verify_hresult(hr))\n#define FAIL_FAST_LAST_ERROR() __RFF_FN(FailFast_GetLastError)(__RFF_INFO_ONLY(nullptr))\n#define FAIL_FAST_WIN32(win32err) __RFF_FN(FailFast_Win32)(__RFF_INFO(#win32err) win32err)\n#define FAIL_FAST_NTSTATUS(status) __RFF_FN(FailFast_NtStatus)(__RFF_INFO(#status) status)\n\n// Conditionally fail fast failures - returns parameter value\n#define FAIL_FAST_IF_FAILED(hr) __RFF_FN(FailFast_IfFailed)(__RFF_INFO(#hr) wil::verify_hresult(hr))\n#define FAIL_FAST_IF_WIN32_BOOL_FALSE(win32BOOL) \\\n    __RFF_FN(FailFast_IfWin32BoolFalse)(__RFF_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL))\n#define FAIL_FAST_IF_WIN32_ERROR(win32err) __RFF_FN(FailFast_IfWin32Error)(__RFF_INFO(#win32err) win32err)\n#define FAIL_FAST_IF_NULL_ALLOC(ptr) __RFF_FN(FailFast_IfNullAlloc)(__RFF_INFO(#ptr) ptr)\n#define FAIL_FAST_HR_IF(hr, condition) \\\n    __RFF_FN(FailFast_HrIf)(__RFF_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition))\n#define FAIL_FAST_HR_IF_NULL(hr, ptr) __RFF_FN(FailFast_HrIfNull)(__RFF_INFO(#ptr) wil::verify_hresult(hr), ptr)\n#define FAIL_FAST_LAST_ERROR_IF(condition) __RFF_FN(FailFast_GetLastErrorIf)(__RFF_INFO(#condition) wil::verify_bool(condition))\n#define FAIL_FAST_LAST_ERROR_IF_NULL(ptr) __RFF_FN(FailFast_GetLastErrorIfNull)(__RFF_INFO(#ptr) ptr)\n#define FAIL_FAST_IF_NTSTATUS_FAILED(status) __RFF_FN(FailFast_IfNtStatusFailed)(__RFF_INFO(#status) status)\n\n// Always fail fast a known failure - fail fast a var-arg message on failure\n#define FAIL_FAST_HR_MSG(hr, fmt, ...) \\\n    __RFF_FN(FailFast_HrMsg)(__RFF_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_LAST_ERROR_MSG(fmt, ...) \\\n    __RFF_FN(FailFast_GetLastErrorMsg)(__RFF_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_WIN32_MSG(win32err, fmt, ...) \\\n    __RFF_FN(FailFast_Win32Msg)(__RFF_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_NTSTATUS_MSG(status, fmt, ...) \\\n    __RFF_FN(FailFast_NtStatusMsg)(__RFF_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Conditionally fail fast failures - returns parameter value - fail fast a var-arg message on failure\n#define FAIL_FAST_IF_FAILED_MSG(hr, fmt, ...) \\\n    __RFF_FN(FailFast_IfFailedMsg)(__RFF_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_IF_WIN32_BOOL_FALSE_MSG(win32BOOL, fmt, ...) \\\n    __RFF_FN(FailFast_IfWin32BoolFalseMsg) \\\n    (__RFF_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_IF_WIN32_ERROR_MSG(win32err, fmt, ...) \\\n    __RFF_FN(FailFast_IfWin32ErrorMsg)(__RFF_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_IF_NULL_ALLOC_MSG(ptr, fmt, ...) \\\n    __RFF_FN(FailFast_IfNullAllocMsg)(__RFF_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_HR_IF_MSG(hr, condition, fmt, ...) \\\n    __RFF_FN(FailFast_HrIfMsg) \\\n    (__RFF_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_HR_IF_NULL_MSG(hr, ptr, fmt, ...) \\\n    __RFF_FN(FailFast_HrIfNullMsg)(__RFF_INFO(#ptr) wil::verify_hresult(hr), ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_LAST_ERROR_IF_MSG(condition, fmt, ...) \\\n    __RFF_FN(FailFast_GetLastErrorIfMsg) \\\n    (__RFF_INFO(#condition) wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_LAST_ERROR_IF_NULL_MSG(ptr, fmt, ...) \\\n    __RFF_FN(FailFast_GetLastErrorIfNullMsg)(__RFF_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) \\\n    __RFF_FN(FailFast_IfNtStatusFailedMsg)(__RFF_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Always fail fast a known failure\n#ifndef FAIL_FAST\n#define FAIL_FAST() __RFF_FN(FailFast_Unexpected)(__RFF_INFO_ONLY(nullptr))\n#endif\n\n// Conditionally fail fast failures - returns parameter value\n#define FAIL_FAST_IF(condition) __RFF_FN(FailFast_If)(__RFF_INFO(#condition) wil::verify_bool(condition))\n#define FAIL_FAST_IF_NULL(ptr) __RFF_FN(FailFast_IfNull)(__RFF_INFO(#ptr) ptr)\n\n// Always fail fast a known failure - fail fast a var-arg message on failure\n#define FAIL_FAST_MSG(fmt, ...) __RFF_FN(FailFast_UnexpectedMsg)(__RFF_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Conditionally fail fast failures - returns parameter value - fail fast a var-arg message on failure\n#define FAIL_FAST_IF_MSG(condition, fmt, ...) \\\n    __RFF_FN(FailFast_IfMsg)(__RFF_INFO(#condition) wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_IF_NULL_MSG(ptr, fmt, ...) \\\n    __RFF_FN(FailFast_IfNullMsg)(__RFF_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Immediate fail fast (no telemetry - use rarely / only when *already* in an undefined state)\n#define FAIL_FAST_IMMEDIATE() __RFF_FN(FailFastImmediate_Unexpected)()\n\n// Conditional immediate fail fast (no telemetry - use rarely / only when *already* in an undefined state)\n#define FAIL_FAST_IMMEDIATE_IF_FAILED(hr) __RFF_FN(FailFastImmediate_IfFailed)(wil::verify_hresult(hr))\n#define FAIL_FAST_IMMEDIATE_IF(condition) __RFF_FN(FailFastImmediate_If)(wil::verify_bool(condition))\n#define FAIL_FAST_IMMEDIATE_IF_NULL(ptr) __RFF_FN(FailFastImmediate_IfNull)(ptr)\n#define FAIL_FAST_IMMEDIATE_IF_NTSTATUS_FAILED(status) __RFF_FN(FailFastImmediate_IfNtStatusFailed)(status)\n\n// Specializations\n#define FAIL_FAST_IMMEDIATE_IF_IN_LOADER_CALLOUT() \\\n    do \\\n    { \\\n        if (wil::details::g_pfnFailFastInLoaderCallout != nullptr) \\\n        { \\\n            wil::details::g_pfnFailFastInLoaderCallout(); \\\n        } \\\n    } while ((void)0, 0)\n\n// Like 'FAIL_FAST_IF', but raises an assertion failure first for easier debugging\n#define WI_FAIL_FAST_ASSERT(condition) \\\n    do \\\n    { \\\n        if (!wil::verify_bool(condition)) \\\n        { \\\n            WI_ASSERT_FAIL(#condition); \\\n            __RFF_FN(FailFast_Unexpected)(__RFF_INFO_ONLY(#condition)); \\\n        } \\\n    } while (0, 0)\n#define WI_FAIL_FAST_ASSERT_MSG(condition, msg) \\\n    do \\\n    { \\\n        if (!wil::verify_bool(condition)) \\\n        { \\\n            WI_ASSERT_FAIL(msg); \\\n            __RFF_FN(FailFast_UnexpectedMsg)(__RFF_INFO(#condition) __WI_CHECK_MSG_FMT(msg)); \\\n        } \\\n    } while (0, 0)\n\n//*****************************************************************************\n// Macros to throw exceptions on failure\n//*****************************************************************************\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n\n// Always throw a known failure\n#define THROW_HR(hr) __R_FN(Throw_Hr)(__R_INFO(#hr) wil::verify_hresult(hr))\n#define THROW_LAST_ERROR() __R_FN(Throw_GetLastError)(__R_INFO_ONLY(nullptr))\n#define THROW_WIN32(win32err) __R_FN(Throw_Win32)(__R_INFO(#win32err) win32err)\n#define THROW_EXCEPTION(exception) wil::details::ReportFailure_CustomException(__R_INFO(#exception) exception)\n#define THROW_NTSTATUS(status) __R_FN(Throw_NtStatus)(__R_INFO(#status) status)\n\n// Conditionally throw failures - returns parameter value\n#define THROW_IF_FAILED(hr) __R_FN(Throw_IfFailed)(__R_INFO(#hr) wil::verify_hresult(hr))\n#define THROW_IF_WIN32_BOOL_FALSE(win32BOOL) __R_FN(Throw_IfWin32BoolFalse)(__R_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL))\n#define THROW_IF_WIN32_ERROR(win32err) __R_FN(Throw_IfWin32Error)(__R_INFO(#win32err) win32err)\n#define THROW_IF_NULL_ALLOC(ptr) __R_FN(Throw_IfNullAlloc)(__R_INFO(#ptr) ptr)\n#define THROW_HR_IF(hr, condition) __R_FN(Throw_HrIf)(__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition))\n#define THROW_HR_IF_NULL(hr, ptr) __R_FN(Throw_HrIfNull)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr)\n#define THROW_WIN32_IF(win32err, condition) \\\n    __R_FN(Throw_Win32If)(__R_INFO(#condition) wil::verify_win32(win32err), wil::verify_bool(condition))\n#define THROW_LAST_ERROR_IF(condition) __R_FN(Throw_GetLastErrorIf)(__R_INFO(#condition) wil::verify_bool(condition))\n#define THROW_LAST_ERROR_IF_NULL(ptr) __R_FN(Throw_GetLastErrorIfNull)(__R_INFO(#ptr) ptr)\n#define THROW_IF_NTSTATUS_FAILED(status) __R_FN(Throw_IfNtStatusFailed)(__R_INFO(#status) status)\n\n// Always throw a known failure - throw a var-arg message on failure\n#define THROW_HR_MSG(hr, fmt, ...) \\\n    __R_FN(Throw_HrMsg)(__R_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_LAST_ERROR_MSG(fmt, ...) __R_FN(Throw_GetLastErrorMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_WIN32_MSG(win32err, fmt, ...) \\\n    __R_FN(Throw_Win32Msg)(__R_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_EXCEPTION_MSG(exception, fmt, ...) \\\n    wil::details::ReportFailure_CustomExceptionMsg(__R_INFO(#exception) exception, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_NTSTATUS_MSG(status, fmt, ...) \\\n    __R_FN(Throw_NtStatusMsg)(__R_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Conditionally throw failures - returns parameter value - throw a var-arg message on failure\n#define THROW_IF_FAILED_MSG(hr, fmt, ...) \\\n    __R_FN(Throw_IfFailedMsg)(__R_INFO(#hr) wil::verify_hresult(hr), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_IF_WIN32_BOOL_FALSE_MSG(win32BOOL, fmt, ...) \\\n    __R_FN(Throw_IfWin32BoolFalseMsg)(__R_INFO(#win32BOOL) wil::verify_BOOL(win32BOOL), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_IF_WIN32_ERROR_MSG(win32err, fmt, ...) \\\n    __R_FN(Throw_IfWin32ErrorMsg)(__R_INFO(#win32err) win32err, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_IF_NULL_ALLOC_MSG(ptr, fmt, ...) \\\n    __R_FN(Throw_IfNullAllocMsg)(__R_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_HR_IF_MSG(hr, condition, fmt, ...) \\\n    __R_FN(Throw_HrIfMsg) \\\n    (__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_HR_IF_NULL_MSG(hr, ptr, fmt, ...) \\\n    __R_FN(Throw_HrIfNullMsg)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_WIN32_IF_MSG(win32err, condition, fmt, ...) \\\n    __R_FN(Throw_Win32IfMsg) \\\n    (__R_INFO(#condition) wil::verify_win32(win32err), wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_LAST_ERROR_IF_MSG(condition, fmt, ...) \\\n    __R_FN(Throw_GetLastErrorIfMsg)(__R_INFO(#condition) wil::verify_bool(condition), __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_LAST_ERROR_IF_NULL_MSG(ptr, fmt, ...) \\\n    __R_FN(Throw_GetLastErrorIfNullMsg)(__R_INFO(#ptr) ptr, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) \\\n    __R_FN(Throw_IfNtStatusFailedMsg)(__R_INFO(#status) status, __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n//*****************************************************************************\n// Macros to catch and convert exceptions on failure\n//*****************************************************************************\n\n// Use these macros *within* a catch (...) block to handle exceptions\n#define RETURN_CAUGHT_EXCEPTION() return __R_FN(Return_CaughtException)(__R_INFO_ONLY(nullptr))\n#define RETURN_CAUGHT_EXCEPTION_MSG(fmt, ...) \\\n    return __R_FN(Return_CaughtExceptionMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define RETURN_CAUGHT_EXCEPTION_EXPECTED() return wil::ResultFromCaughtException()\n#define LOG_CAUGHT_EXCEPTION() __R_FN(Log_CaughtException)(__R_INFO_ONLY(nullptr))\n#define LOG_CAUGHT_EXCEPTION_MSG(fmt, ...) \\\n    __R_FN(Log_CaughtExceptionMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define FAIL_FAST_CAUGHT_EXCEPTION() __R_FN(FailFast_CaughtException)(__R_INFO_ONLY(nullptr))\n#define FAIL_FAST_CAUGHT_EXCEPTION_MSG(fmt, ...) \\\n    __R_FN(FailFast_CaughtExceptionMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n#define THROW_NORMALIZED_CAUGHT_EXCEPTION() __R_FN(Throw_CaughtException)(__R_INFO_ONLY(nullptr))\n#define THROW_NORMALIZED_CAUGHT_EXCEPTION_MSG(fmt, ...) \\\n    __R_FN(Throw_CaughtExceptionMsg)(__R_INFO(nullptr) __WI_CHECK_MSG_FMT(fmt, ##__VA_ARGS__))\n\n// Use these macros in place of a catch block to handle exceptions\n#define CATCH_RETURN() \\\n    catch (...) \\\n    { \\\n        RETURN_CAUGHT_EXCEPTION(); \\\n    }\n#define CATCH_RETURN_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        RETURN_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n    }\n#define CATCH_RETURN_EXPECTED() \\\n    catch (...) \\\n    { \\\n        RETURN_CAUGHT_EXCEPTION_EXPECTED(); \\\n    }\n#define CATCH_LOG() \\\n    catch (...) \\\n    { \\\n        LOG_CAUGHT_EXCEPTION(); \\\n    }\n// Use CATCH_LOG_RETURN instead of CATCH_LOG in a function-try block around a destructor.  CATCH_LOG in this specific case has an\n// implicit throw at the end of scope. Due to a bug (DevDiv 441931), Warning 4297 (function marked noexcept throws exception) is\n// detected even when the throwing code is unreachable, such as the end of scope after a return, in function-level catch.\n#define CATCH_LOG_RETURN() \\\n    catch (...) \\\n    { \\\n        __pragma(warning(suppress : 4297)); \\\n        LOG_CAUGHT_EXCEPTION(); \\\n        return; \\\n    }\n#define CATCH_LOG_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        LOG_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n    }\n// Likewise use CATCH_LOG_RETURN_MSG instead of CATCH_LOG_MSG in function-try blocks around destructors.\n#define CATCH_LOG_RETURN_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        __pragma(warning(suppress : 4297)); \\\n        LOG_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n        return; \\\n    }\n#define CATCH_FAIL_FAST() \\\n    catch (...) \\\n    { \\\n        FAIL_FAST_CAUGHT_EXCEPTION(); \\\n    }\n#define CATCH_FAIL_FAST_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        FAIL_FAST_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n    }\n#define CATCH_THROW_NORMALIZED() \\\n    catch (...) \\\n    { \\\n        THROW_NORMALIZED_CAUGHT_EXCEPTION(); \\\n    }\n#define CATCH_THROW_NORMALIZED_MSG(fmt, ...) \\\n    catch (...) \\\n    { \\\n        THROW_NORMALIZED_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); \\\n    }\n#define CATCH_LOG_RETURN_HR(hr) \\\n    catch (...) \\\n    { \\\n        LOG_CAUGHT_EXCEPTION(); \\\n        return hr; \\\n    }\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\n// Use this macro to supply diagnostics information to wil::ResultFromException\n#define WI_DIAGNOSTICS_INFO wil::DiagnosticsInfo(__R_CALLERADDRESS_VALUE, __R_LINE_VALUE, __R_FILE_VALUE)\n#define WI_DIAGNOSTICS_NAME(name) wil::DiagnosticsInfo(__R_CALLERADDRESS_VALUE, __R_LINE_VALUE, __R_FILE_VALUE, name)\n\n//*****************************************************************************\n// Usage Error Macros\n//*****************************************************************************\n\n#ifndef WI_USAGE_ASSERT_STOP\n#define WI_USAGE_ASSERT_STOP(condition) WI_ASSERT(condition)\n#endif\n#ifdef RESULT_DEBUG\n#define WI_USAGE_ERROR(msg, ...) \\\n    do \\\n    { \\\n        LOG_HR_MSG(HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE), msg, ##__VA_ARGS__); \\\n        WI_USAGE_ASSERT_STOP(false); \\\n    } while ((void)0, 0)\n#define WI_USAGE_ERROR_FORWARD(msg, ...) \\\n    do \\\n    { \\\n        ReportFailure_ReplaceMsg<FailureType::Log>(__R_FN_CALL_FULL, HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE), msg, ##__VA_ARGS__); \\\n        WI_USAGE_ASSERT_STOP(false); \\\n    } while ((void)0, 0)\n#else\n#define WI_USAGE_ERROR(msg, ...) \\\n    do \\\n    { \\\n        LOG_HR(HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE)); \\\n        WI_USAGE_ASSERT_STOP(false); \\\n    } while ((void)0, 0)\n#define WI_USAGE_ERROR_FORWARD(msg, ...) \\\n    do \\\n    { \\\n        ReportFailure_Hr<FailureType::Log>(__R_FN_CALL_FULL, HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE)); \\\n        WI_USAGE_ASSERT_STOP(false); \\\n    } while ((void)0, 0)\n#endif\n#define WI_USAGE_VERIFY(condition, msg, ...) \\\n    do \\\n    { \\\n        const auto __passed = wil::verify_bool(condition); \\\n        if (!__passed) \\\n        { \\\n            WI_USAGE_ERROR(msg, ##__VA_ARGS__); \\\n        } \\\n    } while ((void)0, 0)\n#define WI_USAGE_VERIFY_FORWARD(condition, msg, ...) \\\n    do \\\n    { \\\n        const auto __passed = wil::verify_bool(condition); \\\n        if (!__passed) \\\n        { \\\n            WI_USAGE_ERROR_FORWARD(msg, ##__VA_ARGS__); \\\n        } \\\n    } while ((void)0, 0)\n#ifdef RESULT_DEBUG\n#define WI_USAGE_ASSERT(condition, msg, ...) WI_USAGE_VERIFY(condition, msg, ##__VA_ARGS__)\n#else\n#define WI_USAGE_ASSERT(condition, msg, ...)\n#endif\n\n//*****************************************************************************\n// Internal Error Macros - DO NOT USE - these are for internal WIL use only to reduce sizes of binaries that use WIL\n//*****************************************************************************\n/// @cond\n#ifdef RESULT_DEBUG\n#define __WIL_PRIVATE_RETURN_IF_FAILED(hr) RETURN_IF_FAILED(hr)\n#define __WIL_PRIVATE_RETURN_HR_IF(hr, cond) RETURN_HR_IF(hr, cond)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR_IF(cond) RETURN_LAST_ERROR_IF(cond)\n#define __WIL_PRIVATE_RETURN_IF_WIN32_BOOL_FALSE(win32BOOL) RETURN_IF_WIN32_BOOL_FALSE(win32BOOL)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR_IF_NULL(ptr) RETURN_LAST_ERROR_IF_NULL(ptr)\n#define __WIL_PRIVATE_RETURN_IF_NULL_ALLOC(ptr) RETURN_IF_NULL_ALLOC(ptr)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR() RETURN_LAST_ERROR()\n#define __WIL_PRIVATE_FAIL_FAST_HR_IF(hr, condition) FAIL_FAST_HR_IF(hr, condition)\n#define __WIL_PRIVATE_FAIL_FAST_HR(hr) FAIL_FAST_HR(hr)\n#define __WIL_PRIVATE_LOG_HR(hr) LOG_HR(hr)\n#else\n#define __WIL_PRIVATE_RETURN_IF_FAILED(hr) \\\n    do \\\n    { \\\n        const auto __hrRet = wil::verify_hresult(hr); \\\n        if (FAILED(__hrRet)) \\\n        { \\\n            __RETURN_HR_FAIL_NOFILE(__hrRet, #hr); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_HR_IF(hr, cond) \\\n    do \\\n    { \\\n        if (wil::verify_bool(cond)) \\\n        { \\\n            __RETURN_HR_NOFILE(wil::verify_hresult(hr), #cond); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR_IF(cond) \\\n    do \\\n    { \\\n        if (wil::verify_bool(cond)) \\\n        { \\\n            __RETURN_GLE_FAIL_NOFILE(#cond); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_IF_WIN32_BOOL_FALSE(win32BOOL) \\\n    do \\\n    { \\\n        const BOOL __boolRet = wil::verify_BOOL(win32BOOL); \\\n        if (!__boolRet) \\\n        { \\\n            __RETURN_GLE_FAIL_NOFILE(#win32BOOL); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR_IF_NULL(ptr) \\\n    do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_GLE_FAIL_NOFILE(#ptr); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_IF_NULL_ALLOC(ptr) \\\n    do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __RETURN_HR_FAIL_NOFILE(E_OUTOFMEMORY, #ptr); \\\n        } \\\n    } while ((void)0, 0)\n#define __WIL_PRIVATE_RETURN_LAST_ERROR() __RETURN_GLE_FAIL_NOFILE(nullptr)\n#define __WIL_PRIVATE_FAIL_FAST_HR_IF(hr, condition) \\\n    __RFF_FN(FailFast_HrIf)(__RFF_INFO_NOFILE(#condition) wil::verify_hresult(hr), wil::verify_bool(condition))\n#define __WIL_PRIVATE_FAIL_FAST_HR(hr) __RFF_FN(FailFast_Hr)(__RFF_INFO_NOFILE(#hr) wil::verify_hresult(hr))\n#define __WIL_PRIVATE_LOG_HR(hr) __R_FN(Log_Hr)(__R_INFO_NOFILE(#hr) wil::verify_hresult(hr))\n#endif\n/// @endcond\n\nnamespace wil\n{\n// Indicates the kind of message / failure type that was used to produce a given error\nenum class FailureType\n{\n    Exception, // THROW_...\n    Return,    // RETURN_..._LOG or RETURN_..._MSG\n    Log,       // LOG_...\n    FailFast   // FAIL_FAST_...\n};\n\nenum class FailureFlags\n{\n    None = 0x00,\n    RequestFailFast = 0x01,\n    RequestSuppressTelemetry = 0x02,\n    RequestDebugBreak = 0x04,\n    NtStatus = 0x08,\n};\nDEFINE_ENUM_FLAG_OPERATORS(FailureFlags);\n\n/** Use with functions and macros that allow customizing which kinds of exceptions are handled.\nThis is used with methods like wil::ResultFromException and wil::ResultFromExceptionDebug. */\nenum class SupportedExceptions\n{\n    Default,      //!< [Default] all well known exceptions (honors g_fResultFailFastUnknownExceptions).\n    Known,        //!< [Known] all well known exceptions (including std::exception).\n    All,          //!< [All] all exceptions, known or otherwise.\n    None,         //!< [None] no exceptions at all, an exception will fail-fast where thrown.\n    Thrown,       //!< [Thrown] exceptions thrown by wil only (Platform::Exception^ or ResultException).\n    ThrownOrAlloc //!< [ThrownOrAlloc] exceptions thrown by wil (Platform::Exception^ or ResultException) or std::bad_alloc.\n};\n\n// Represents the call context information about a given failure\n// No constructors, destructors or virtual members should be contained within\nstruct CallContextInfo\n{\n    long contextId;        // incrementing ID for this call context (unique across an individual module load within process)\n    PCSTR contextName;     // the explicit name given to this context\n    PCWSTR contextMessage; // [optional] Message that can be associated with the call context\n};\n\n// Represents all context information about a given failure\n// No constructors, destructors or virtual members should be contained within\nstruct FailureInfo\n{\n    FailureType type;\n    FailureFlags flags;\n    HRESULT hr;\n    NTSTATUS status;\n    long failureId;    // incrementing ID for this specific failure (unique across an individual module load within process)\n    PCWSTR pszMessage; // Message is only present for _MSG logging (it's the Sprintf message)\n    DWORD threadId;    // the thread this failure was originally encountered on\n    PCSTR pszCode;     // [debug only] Capture code from the macro\n    PCSTR pszFunction; // [debug only] The function name\n    PCSTR pszFile;\n    unsigned int uLineNumber;\n    int cFailureCount;                      // How many failures of 'type' have been reported in this module so far\n    PCSTR pszCallContext;                   // General breakdown of the call context stack that generated this failure\n    CallContextInfo callContextOriginating; // The outermost (first seen) call context\n    CallContextInfo callContextCurrent;     // The most recently seen call context\n    PCSTR pszModule;                        // The module where the failure originated\n    void* returnAddress;                    // The return address to the point that called the macro\n    void* callerReturnAddress;              // The return address of the function that includes the macro\n};\n\n//! Created automatically from using WI_DIAGNOSTICS_INFO to provide diagnostics to functions.\n//! Note that typically wil hides diagnostics from users under the covers by passing them automatically to functions as parameters\n//! hidden behind a macro.  In some cases, the user needs to directly supply these, so this class provides the mechanism for that.\n//! We only use this for user-passed content as it can't be directly controlled by RESULT_DIAGNOSTICS_LEVEL to ensure there are no\n//! ODR violations (though that variable still controls what parameters within this structure would be available).\nstruct DiagnosticsInfo\n{\n    void* returnAddress = nullptr;\n    PCSTR file = nullptr;\n    PCSTR name = nullptr;\n    unsigned short line = 0;\n\n    DiagnosticsInfo() = default;\n\n    __forceinline DiagnosticsInfo(void* returnAddress_, unsigned short line_, PCSTR file_) :\n        returnAddress(returnAddress_), file(file_), line(line_)\n    {\n    }\n\n    __forceinline DiagnosticsInfo(void* returnAddress_, unsigned short line_, PCSTR file_, PCSTR name_) :\n        returnAddress(returnAddress_), file(file_), name(name_), line(line_)\n    {\n    }\n};\n\nenum class ErrorReturn\n{\n    Auto,\n    None\n};\n\n/// @cond\nnamespace details\n{\n    // 'FARPROC' is declared in such a way that it cannot safely be assumed cast-able to other function pointer types.\n    // This function helps alleviate warnings that can arise from this\n    template <typename FuncPtr>\n    inline FuncPtr GetProcAddress(_In_ HMODULE module, _In_ LPCSTR procName) WI_NOEXCEPT\n    {\n        return reinterpret_cast<FuncPtr>(reinterpret_cast<void (*)()>(::GetProcAddress(module, procName)));\n    }\n} // namespace details\n/// @endcond\n\n// [optionally] Plug in error logging\n// Note:  This callback is deprecated.  Please use SetResultTelemetryFallback for telemetry or\n// SetResultLoggingCallback for observation.\nextern \"C\" __declspec(selectany) void(__stdcall* g_pfnResultLoggingCallback)(\n    _Inout_ wil::FailureInfo* pFailure,\n    _Inout_updates_opt_z_(cchDebugMessage) PWSTR pszDebugMessage,\n    _Pre_satisfies_(cchDebugMessage > 0) size_t cchDebugMessage) WI_PFN_NOEXCEPT = nullptr;\n\n// [optional]\n// This can be explicitly set to control whether or not error messages will be output to OutputDebugString.  It can also\n// be set directly from within the debugger to force console logging for debugging purposes.\n__declspec(selectany) bool g_fResultOutputDebugString = true;\n\n// [optionally] Allows application to specify a debugger to detect whether a debugger is present.\n// Useful for processes that can only be debugged under kernel debuggers where IsDebuggerPresent returns\n// false.\n__declspec(selectany) bool(__stdcall* g_pfnIsDebuggerPresent)() WI_PFN_NOEXCEPT = nullptr;\n\n// [optionally] Allows forcing WIL to believe a debugger is present. Useful for when a kernel debugger is attached and ::IsDebuggerPresent returns false\n__declspec(selectany) bool g_fIsDebuggerPresent = false;\n\n// [optionally] Plug in additional exception-type support (return S_OK when *unable* to remap the exception)\n__declspec(selectany) HRESULT(__stdcall* g_pfnResultFromCaughtException)() WI_PFN_NOEXCEPT = nullptr;\n\n// [optionally] Use to configure fast fail of unknown exceptions (turn them off).\n__declspec(selectany) bool g_fResultFailFastUnknownExceptions = true;\n\n// [optionally] Set to false to a configure all THROW_XXX macros in C++/CX to throw ResultException rather than Platform::Exception^\n__declspec(selectany) bool g_fResultThrowPlatformException = true;\n\n// [optionally] Set to false to a configure all CATCH_ and CAUGHT_ macros to NOT support (fail-fast) std::exception based exceptions (other than std::bad_alloc and wil::ResultException)\n__declspec(selectany) bool g_fResultSupportStdException = true;\n\n// [optionally] Set to true to cause a debug break to occur on a result failure\n__declspec(selectany) bool g_fBreakOnFailure = false;\n\n// [optionally] customize failfast behavior\n__declspec(selectany) bool(__stdcall* g_pfnWilFailFast)(const wil::FailureInfo& info) WI_PFN_NOEXCEPT = nullptr;\n\n/// @cond\nnamespace details\n{\n    // True if g_pfnResultLoggingCallback is set (allows cutting off backwards compat calls to the function)\n    __declspec(selectany) bool g_resultMessageCallbackSet = false;\n\n    // On Desktop/System WINAPI family: convert NTSTATUS error codes to friendly name strings.\n    __declspec(selectany) void(__stdcall* g_pfnFormatNtStatusMsg)(NTSTATUS, PWSTR, DWORD) = nullptr;\n\n    _Success_(true)\n    _Ret_range_(dest, destEnd)\n    inline PWSTR LogStringPrintf(\n        _Out_writes_to_ptr_(destEnd) _Always_(_Post_z_) PWSTR dest,\n        _Pre_satisfies_(destEnd >= dest) PCWSTR destEnd,\n        _In_ _Printf_format_string_ PCWSTR format,\n        ...)\n    {\n        va_list argList;\n        va_start(argList, format);\n        StringCchVPrintfW(dest, (destEnd - dest), format, argList);\n        return (destEnd == dest) ? dest : (dest + wcslen(dest));\n    }\n} // namespace details\n/// @endcond\n\n// This call generates the default logging string that makes its way to OutputDebugString for\n// any particular failure.  This string is also used to associate a failure with a PlatformException^ which\n// only allows a single string to be associated with the exception.\ninline HRESULT GetFailureLogString(\n    _Out_writes_(cchDest) _Always_(_Post_z_) PWSTR pszDest,\n    _Pre_satisfies_(cchDest > 0) _In_ size_t cchDest,\n    _In_ FailureInfo const& failure) WI_NOEXCEPT\n{\n    // This function was lenient to empty strings at one point and some callers became dependent on this behavior\n    if ((cchDest == 0) || (pszDest == nullptr))\n    {\n        return S_OK;\n    }\n\n    pszDest[0] = L'\\0';\n\n    // Call the logging callback (if present) to allow them to generate the debug string that will be pushed to the console\n    // or the platform exception object if the caller desires it.\n    if ((g_pfnResultLoggingCallback != nullptr) && details::g_resultMessageCallbackSet)\n    {\n        // older-form callback was a non-const FailureInfo*; conceptually this is const as callers should not be modifying\n        g_pfnResultLoggingCallback(const_cast<FailureInfo*>(&failure), pszDest, cchDest);\n    }\n\n    // The callback only optionally needs to supply the debug string -- if the callback didn't populate it, yet we still want\n    // it for OutputDebugString or exception message, then generate the default string.\n    if (pszDest[0] == L'\\0')\n    {\n        PCSTR pszType = \"\";\n        switch (failure.type)\n        {\n        case FailureType::Exception:\n            pszType = \"Exception\";\n            break;\n        case FailureType::Return:\n            if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus))\n            {\n                pszType = \"ReturnNt\";\n            }\n            else\n            {\n                pszType = \"ReturnHr\";\n            }\n            break;\n        case FailureType::Log:\n            if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus))\n            {\n                pszType = \"LogNt\";\n            }\n            else\n            {\n                pszType = \"LogHr\";\n            }\n            break;\n        case FailureType::FailFast:\n            pszType = \"FailFast\";\n            break;\n        }\n\n        wchar_t szErrorText[256]{};\n        LONG errorCode = 0;\n\n        if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus))\n        {\n            errorCode = failure.status;\n            if (wil::details::g_pfnFormatNtStatusMsg)\n            {\n                wil::details::g_pfnFormatNtStatusMsg(failure.status, szErrorText, ARRAYSIZE(szErrorText));\n            }\n        }\n        else\n        {\n            errorCode = failure.hr;\n            FormatMessageW(\n                FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\n                nullptr,\n                failure.hr,\n                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n                szErrorText,\n                ARRAYSIZE(szErrorText),\n                nullptr);\n        }\n\n        // %FILENAME(%LINE): %TYPE(%count) tid(%threadid) %HRESULT %SystemMessage\n        //     %Caller_MSG [%CODE(%FUNCTION)]\n\n        PWSTR dest = pszDest;\n        PCWSTR destEnd = (pszDest + cchDest);\n\n        if (failure.pszFile != nullptr)\n        {\n            dest = details::LogStringPrintf(\n                dest, destEnd, L\"%hs(%u)\\\\%hs!%p: \", failure.pszFile, failure.uLineNumber, failure.pszModule, failure.returnAddress);\n        }\n        else\n        {\n            dest = details::LogStringPrintf(dest, destEnd, L\"%hs!%p: \", failure.pszModule, failure.returnAddress);\n        }\n\n        if (failure.callerReturnAddress != nullptr)\n        {\n            dest = details::LogStringPrintf(dest, destEnd, L\"(caller: %p) \", failure.callerReturnAddress);\n        }\n\n        dest = details::LogStringPrintf(\n            dest, destEnd, L\"%hs(%d) tid(%x) %08X %ws\", pszType, failure.cFailureCount, ::GetCurrentThreadId(), errorCode, szErrorText);\n\n        if ((failure.pszMessage != nullptr) || (failure.pszCallContext != nullptr) || (failure.pszFunction != nullptr))\n        {\n            dest = details::LogStringPrintf(dest, destEnd, L\"    \");\n            if (failure.pszMessage != nullptr)\n            {\n                dest = details::LogStringPrintf(dest, destEnd, L\"Msg:[%ws] \", failure.pszMessage);\n            }\n            if (failure.pszCallContext != nullptr)\n            {\n                dest = details::LogStringPrintf(dest, destEnd, L\"CallContext:[%hs] \", failure.pszCallContext);\n            }\n\n            if (failure.pszCode != nullptr)\n            {\n                dest = details::LogStringPrintf(dest, destEnd, L\"[%hs(%hs)]\\n\", failure.pszFunction, failure.pszCode);\n            }\n            else if (failure.pszFunction != nullptr)\n            {\n                dest = details::LogStringPrintf(dest, destEnd, L\"[%hs]\\n\", failure.pszFunction);\n            }\n            else\n            {\n                dest = details::LogStringPrintf(dest, destEnd, L\"\\n\");\n            }\n        }\n    }\n\n    // Explicitly choosing to return success in the event of truncation... Current callers\n    // depend upon it or it would be eliminated.\n    return S_OK;\n}\n\n/// @cond\nnamespace details\n{\n    //! Interface used to wrap up code (generally a lambda or other functor) to run in an exception-managed context where\n    //! exceptions or errors can be observed and logged.\n    struct IFunctor\n    {\n        virtual HRESULT Run() = 0;\n    };\n\n    //! Used to provide custom behavior when an exception is encountered while executing IFunctor\n    struct IFunctorHost\n    {\n        virtual HRESULT Run(IFunctor& functor) = 0;\n        virtual HRESULT ExceptionThrown(void* returnAddress) = 0;\n    };\n\n    __declspec(noinline) inline HRESULT NtStatusToHr(NTSTATUS status) WI_NOEXCEPT;\n    __declspec(noinline) inline NTSTATUS HrToNtStatus(HRESULT) WI_NOEXCEPT;\n\n    struct ResultStatus\n    {\n        enum class Kind : unsigned int\n        {\n            HResult,\n            NtStatus\n        };\n\n        static ResultStatus FromResult(const HRESULT _hr)\n        {\n            return {_hr, wil::details::HrToNtStatus(_hr), Kind::HResult};\n        }\n        static ResultStatus FromStatus(const NTSTATUS _status)\n        {\n            return {wil::details::NtStatusToHr(_status), _status, Kind::NtStatus};\n        }\n        static ResultStatus FromFailureInfo(const FailureInfo& _failure)\n        {\n            return {_failure.hr, _failure.status, WI_IsFlagSet(_failure.flags, FailureFlags::NtStatus) ? Kind::NtStatus : Kind::HResult};\n        }\n        HRESULT hr = S_OK;\n        NTSTATUS status = STATUS_SUCCESS;\n        Kind kind = Kind::NtStatus;\n    };\n\n    // Fallback telemetry provider callback (set with wil::SetResultTelemetryFallback)\n    __declspec(selectany) void(__stdcall* g_pfnTelemetryCallback)(bool alreadyReported, wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr;\n\n    // Result.h plug-in (WIL use only)\n    __declspec(selectany) void(__stdcall* g_pfnNotifyFailure)(_Inout_ FailureInfo* pFailure) WI_PFN_NOEXCEPT = nullptr;\n    __declspec(selectany) void(__stdcall* g_pfnGetContextAndNotifyFailure)(\n        _Inout_ FailureInfo* pFailure,\n        _Out_writes_(callContextStringLength) _Post_z_ PSTR callContextString,\n        _Pre_satisfies_(callContextStringLength > 0) size_t callContextStringLength) WI_PFN_NOEXCEPT = nullptr;\n\n    // Observe all errors flowing through the system with this callback (set with wil::SetResultLoggingCallback); use with custom logging\n    __declspec(selectany) void(__stdcall* g_pfnLoggingCallback)(wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr;\n\n    // Desktop/System Only:  Module fetch function (automatically setup)\n    __declspec(selectany) PCSTR(__stdcall* g_pfnGetModuleName)() WI_PFN_NOEXCEPT = nullptr;\n\n    // Desktop/System Only:  Retrieve address offset and modulename\n    __declspec(selectany) bool(__stdcall* g_pfnGetModuleInformation)(\n        void* address, _Out_opt_ unsigned int* addressOffset, _Out_writes_bytes_opt_(size) char* name, size_t size) WI_PFN_NOEXCEPT = nullptr;\n\n    // Called with the expectation that the program will terminate when called inside of a loader callout.\n    // Desktop/System Only: Automatically setup when building Windows (BUILD_WINDOWS defined)\n    __declspec(selectany) void(__stdcall* g_pfnFailFastInLoaderCallout)() WI_PFN_NOEXCEPT = nullptr;\n\n    // Called to translate an NTSTATUS value to a Win32 error code\n    // Desktop/System Only: Automatically setup when building Windows (BUILD_WINDOWS defined)\n    __declspec(selectany) ULONG(__stdcall* g_pfnRtlNtStatusToDosErrorNoTeb)(NTSTATUS) WI_PFN_NOEXCEPT = nullptr;\n\n    // Desktop/System Only: Call to DebugBreak\n    __declspec(selectany) void(__stdcall* g_pfnDebugBreak)() WI_PFN_NOEXCEPT = nullptr;\n\n    // Called to determine whether or not termination is happening\n    // Desktop/System Only: Automatically setup when building Windows (BUILD_WINDOWS defined)\n    __declspec(selectany) BOOLEAN(__stdcall* g_pfnDllShutdownInProgress)() WI_PFN_NOEXCEPT = nullptr;\n    __declspec(selectany) bool g_processShutdownInProgress = false;\n\n    // On Desktop/System WINAPI family: dynalink RaiseFailFastException because we may encounter modules\n    // that do not have RaiseFailFastException in kernelbase.  UWP apps will directly link.\n    __declspec(selectany) void(__stdcall* g_pfnRaiseFailFastException)(PEXCEPTION_RECORD, PCONTEXT, DWORD) = nullptr;\n\n    // Exception-based compiled additions\n    __declspec(selectany) HRESULT(__stdcall* g_pfnRunFunctorWithExceptionFilter)(IFunctor& functor, IFunctorHost& host, void* returnAddress) = nullptr;\n    __declspec(selectany) void(__stdcall* g_pfnRethrow)() = nullptr;\n    __declspec(selectany) void(__stdcall* g_pfnThrowResultException)(const FailureInfo& failure) = nullptr;\n    extern \"C\" __declspec(selectany) ResultStatus(__stdcall* g_pfnResultFromCaughtExceptionInternal)(\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n        _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr;\n\n    // C++/WinRT additions\n    extern \"C\" __declspec(selectany) HRESULT(__stdcall* g_pfnResultFromCaughtException_CppWinRt)(\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n        _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr;\n\n    // C++/cx compiled additions\n    extern \"C\" __declspec(selectany) void(__stdcall* g_pfnThrowPlatformException)(FailureInfo const& failure, PCWSTR debugString) = nullptr;\n    extern \"C\" __declspec(selectany) _Always_(_Post_satisfies_(return < 0)) HRESULT(__stdcall* g_pfnResultFromCaughtException_WinRt)(\n        _Inout_updates_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n        _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr;\n    __declspec(selectany) _Always_(_Post_satisfies_(return < 0)) HRESULT(__stdcall* g_pfnResultFromKnownExceptions_WinRt)(\n        const DiagnosticsInfo& diagnostics, void* returnAddress, SupportedExceptions supported, IFunctor& functor) = nullptr;\n\n    // Plugin to call RoOriginateError (WIL use only)\n    __declspec(selectany) void(__stdcall* g_pfnOriginateCallback)(wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr;\n\n    // Plugin to call RoFailFastWithErrorContext (WIL use only)\n    __declspec(selectany) void(__stdcall* g_pfnFailfastWithContextCallback)(wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr;\n\n    // Allocate and disown the allocation so that Appverifier does not complain about a false leak\n    inline PVOID ProcessHeapAlloc(_In_ DWORD flags, _In_ size_t size) WI_NOEXCEPT\n    {\n        const HANDLE processHeap = ::GetProcessHeap();\n        const PVOID allocation = ::HeapAlloc(processHeap, flags, size);\n\n        static bool fetchedRtlDisownModuleHeapAllocation = false;\n        static NTSTATUS(__stdcall * pfnRtlDisownModuleHeapAllocation)(HANDLE, PVOID) WI_PFN_NOEXCEPT = nullptr;\n\n        if (pfnRtlDisownModuleHeapAllocation)\n        {\n            (void)pfnRtlDisownModuleHeapAllocation(processHeap, allocation);\n        }\n        else if (!fetchedRtlDisownModuleHeapAllocation)\n        {\n            if (auto ntdllModule = ::GetModuleHandleW(L\"ntdll.dll\"))\n            {\n                pfnRtlDisownModuleHeapAllocation =\n                    details::GetProcAddress<decltype(pfnRtlDisownModuleHeapAllocation)>(ntdllModule, \"RtlDisownModuleHeapAllocation\");\n            }\n            fetchedRtlDisownModuleHeapAllocation = true;\n\n            if (pfnRtlDisownModuleHeapAllocation)\n            {\n                (void)pfnRtlDisownModuleHeapAllocation(processHeap, allocation);\n            }\n        }\n\n        return allocation;\n    }\n\n    enum class ReportFailureOptions\n    {\n        None = 0x00,\n        ForcePlatformException = 0x01,\n        MayRethrow = 0x02,\n    };\n    DEFINE_ENUM_FLAG_OPERATORS(ReportFailureOptions);\n\n    template <typename TFunctor>\n    using functor_return_type = decltype((*static_cast<TFunctor*>(nullptr))());\n\n    template <typename TFunctor>\n    struct functor_wrapper_void : public IFunctor\n    {\n        TFunctor&& functor;\n        functor_wrapper_void(TFunctor&& functor_) : functor(wistd::forward<TFunctor>(functor_))\n        {\n        }\n#pragma warning(push)\n#pragma warning(disable : 4702) // https://github.com/Microsoft/wil/issues/2\n        HRESULT Run() override\n        {\n            functor();\n            return S_OK;\n        }\n#pragma warning(pop)\n    };\n\n    template <typename TFunctor>\n    struct functor_wrapper_HRESULT : public IFunctor\n    {\n        TFunctor&& functor;\n        functor_wrapper_HRESULT(TFunctor& functor_) : functor(wistd::forward<TFunctor>(functor_))\n        {\n        }\n        HRESULT Run() override\n        {\n            return functor();\n        }\n    };\n\n    template <typename TFunctor, typename TReturn>\n    struct functor_wrapper_other : public IFunctor\n    {\n        TFunctor&& functor;\n        TReturn& retVal;\n        functor_wrapper_other(TFunctor& functor_, TReturn& retval_) : functor(wistd::forward<TFunctor>(functor_)), retVal(retval_)\n        {\n        }\n#pragma warning(push)\n#pragma warning(disable : 4702) // https://github.com/Microsoft/wil/issues/2\n        HRESULT Run() override\n        {\n            retVal = functor();\n            return S_OK;\n        }\n#pragma warning(pop)\n    };\n\n    struct tag_return_void : public wistd::integral_constant<size_t, 0>\n    {\n        template <typename TFunctor>\n        using functor_wrapper = functor_wrapper_void<TFunctor>;\n    };\n\n    struct tag_return_HRESULT : public wistd::integral_constant<size_t, 1>\n    {\n        template <typename TFunctor>\n        using functor_wrapper = functor_wrapper_HRESULT<TFunctor>;\n    };\n\n    struct tag_return_other : public wistd::integral_constant<size_t, 2>\n    {\n        template <typename TFunctor, typename TReturn>\n        using functor_wrapper = functor_wrapper_other<TFunctor, TReturn>;\n    };\n\n    // type-trait to help discover the return type of a functor for tag/dispatch.\n\n    template <ErrorReturn errorReturn, typename T>\n    struct return_type\n    {\n        using type = tag_return_other;\n    };\n\n    template <>\n    struct return_type<ErrorReturn::Auto, HRESULT>\n    {\n        using type = tag_return_HRESULT;\n    };\n\n    template <>\n    struct return_type<ErrorReturn::Auto, void>\n    {\n        using type = tag_return_void;\n    };\n\n    template <>\n    struct return_type<ErrorReturn::None, void>\n    {\n        using type = tag_return_void;\n    };\n\n    template <ErrorReturn errorReturn, typename Functor>\n    using functor_tag = typename return_type<errorReturn, functor_return_type<Functor>>::type;\n\n    // Forward declarations to enable use of fail fast and reporting internally...\n    namespace __R_NS_NAME\n    {\n        _Post_satisfies_(return == hr) __R_DIRECT_METHOD(HRESULT, Log_Hr)(__R_DIRECT_FN_PARAMS HRESULT hr) WI_NOEXCEPT;\n        _Post_satisfies_(return == hr)\n            __R_DIRECT_METHOD(HRESULT, Log_HrMsg)(__R_DIRECT_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT;\n        _Post_satisfies_(return == err)\n            __R_DIRECT_METHOD(DWORD, Log_Win32Msg)(__R_DIRECT_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT;\n    } // namespace __R_NS_NAME\n    namespace __RFF_NS_NAME\n    {\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_Unexpected)(__RFF_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT;\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_If)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT;\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_HrIf)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) WI_NOEXCEPT;\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_IfFalse)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT;\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFastImmediate_If)(bool condition) WI_NOEXCEPT;\n    } // namespace __RFF_NS_NAME\n\n    RESULT_NORETURN inline void __stdcall WilFailFast(const FailureInfo& info);\n    inline void LogFailure(\n        __R_FN_PARAMS_FULL,\n        FailureType type,\n        const ResultStatus& resultPair,\n        _In_opt_ PCWSTR message,\n        bool fWantDebugString,\n        _Out_writes_(debugStringSizeChars) _Post_z_ PWSTR debugString,\n        _Pre_satisfies_(debugStringSizeChars > 0) size_t debugStringSizeChars,\n        _Out_writes_(callContextStringSizeChars) _Post_z_ PSTR callContextString,\n        _Pre_satisfies_(callContextStringSizeChars > 0) size_t callContextStringSizeChars,\n        FailureFlags flags,\n        _Out_ FailureInfo* failure) WI_NOEXCEPT;\n\n    __declspec(noinline) inline void ReportFailure(\n        __R_FN_PARAMS_FULL,\n        FailureType type,\n        const ResultStatus& resultPair,\n        _In_opt_ PCWSTR message = nullptr,\n        ReportFailureOptions options = ReportFailureOptions::None);\n    template <FailureType, bool = false>\n    __declspec(noinline) inline void ReportFailure_Base(\n        __R_FN_PARAMS_FULL,\n        const ResultStatus& resultPair,\n        _In_opt_ PCWSTR message = nullptr,\n        ReportFailureOptions options = ReportFailureOptions::None,\n        FailureFlags flags = FailureFlags::None);\n    template <FailureType>\n    inline void ReportFailure_ReplaceMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, ...);\n    __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr);\n    template <FailureType>\n    __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr, FailureFlags flags = FailureFlags::None);\n    template <FailureType>\n    __declspec(noinline) inline HRESULT ReportFailure_CaughtException(\n        __R_FN_PARAMS_FULL, SupportedExceptions supported = SupportedExceptions::Default);\n\n//*****************************************************************************\n// Fail fast helpers (for use only internally to WIL)\n//*****************************************************************************\n\n/// @cond\n#define __FAIL_FAST_ASSERT__(condition) \\\n    do \\\n    { \\\n        if (!(condition)) \\\n        { \\\n            __RFF_FN(FailFast_Unexpected)(__RFF_INFO_ONLY(#condition)); \\\n        } \\\n    } while ((void)0, 0)\n#define __FAIL_FAST_IMMEDIATE_ASSERT__(condition) \\\n    do \\\n    { \\\n        if (!(condition)) \\\n        { \\\n            wil::FailureInfo failure{}; \\\n            wil::details::WilFailFast(failure); \\\n        } \\\n    } while ((void)0, 0)\n#define __FAIL_FAST_ASSERT_WIN32_BOOL_FALSE__(condition) \\\n    __RFF_FN(FailFast_IfWin32BoolFalse)(__RFF_INFO(#condition) wil::verify_BOOL(condition))\n\n    // A simple ref-counted buffer class.  The interface is very similar to shared_ptr<>, only it manages\n    // an allocated buffer and maintains the size.\n\n    class shared_buffer\n    {\n    public:\n        shared_buffer() WI_NOEXCEPT : m_pCopy(nullptr), m_size(0)\n        {\n        }\n\n        shared_buffer(shared_buffer const& other) WI_NOEXCEPT : m_pCopy(nullptr), m_size(0)\n        {\n            assign(other.m_pCopy, other.m_size);\n        }\n\n        shared_buffer(shared_buffer&& other) WI_NOEXCEPT : m_pCopy(other.m_pCopy), m_size(other.m_size)\n        {\n            other.m_pCopy = nullptr;\n            other.m_size = 0;\n        }\n\n        ~shared_buffer() WI_NOEXCEPT\n        {\n            reset();\n        }\n\n        shared_buffer& operator=(shared_buffer const& other) WI_NOEXCEPT\n        {\n            if (this != wistd::addressof(other))\n            {\n                assign(other.m_pCopy, other.m_size);\n            }\n            return *this;\n        }\n\n        shared_buffer& operator=(shared_buffer&& other) WI_NOEXCEPT\n        {\n            if (this != wistd::addressof(other))\n            {\n                reset();\n                m_pCopy = other.m_pCopy;\n                m_size = other.m_size;\n                other.m_pCopy = nullptr;\n                other.m_size = 0;\n            }\n            return *this;\n        }\n\n        void reset() WI_NOEXCEPT\n        {\n            if (m_pCopy != nullptr)\n            {\n                if (0 == ::InterlockedDecrementRelease(m_pCopy))\n                {\n                    WIL_FreeMemory(m_pCopy);\n                }\n                m_pCopy = nullptr;\n                m_size = 0;\n            }\n        }\n\n        bool create(_In_reads_bytes_opt_(cbData) void const* pData, size_t cbData) WI_NOEXCEPT\n        {\n            if (cbData == 0)\n            {\n                reset();\n                return true;\n            }\n\n            long* pCopyRefCount = reinterpret_cast<long*>(WIL_AllocateMemory(sizeof(long) + cbData));\n            if (pCopyRefCount == nullptr)\n            {\n                return false;\n            }\n\n            *pCopyRefCount = 0;\n            if (pData != nullptr)\n            {\n                memcpy_s(pCopyRefCount + 1, cbData, pData, cbData); // +1 to advance past sizeof(long) counter\n            }\n            assign(pCopyRefCount, cbData);\n            return true;\n        }\n\n        bool create(size_t cbData) WI_NOEXCEPT\n        {\n            return create(nullptr, cbData);\n        }\n\n        WI_NODISCARD void* get(_Out_opt_ size_t* pSize = nullptr) const WI_NOEXCEPT\n        {\n            if (pSize != nullptr)\n            {\n                *pSize = m_size;\n            }\n            return (m_pCopy == nullptr) ? nullptr : (m_pCopy + 1);\n        }\n\n        WI_NODISCARD size_t size() const WI_NOEXCEPT\n        {\n            return m_size;\n        }\n\n        WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n        {\n            return (m_pCopy != nullptr);\n        }\n\n        WI_NODISCARD bool unique() const WI_NOEXCEPT\n        {\n            return ((m_pCopy != nullptr) && (*m_pCopy == 1));\n        }\n\n    private:\n        long* m_pCopy; // pointer to allocation: refcount + data\n        size_t m_size; // size of the data from m_pCopy\n\n        void assign(_In_opt_ long* pCopy, size_t cbSize) WI_NOEXCEPT\n        {\n            reset();\n            if (pCopy != nullptr)\n            {\n                m_pCopy = pCopy;\n                m_size = cbSize;\n                ::InterlockedIncrementNoFence(m_pCopy);\n            }\n        }\n    };\n\n    inline shared_buffer make_shared_buffer_nothrow(_In_reads_bytes_opt_(countBytes) void* pData, size_t countBytes) WI_NOEXCEPT\n    {\n        shared_buffer buffer;\n        buffer.create(pData, countBytes);\n        return buffer;\n    }\n\n    inline shared_buffer make_shared_buffer_nothrow(size_t countBytes) WI_NOEXCEPT\n    {\n        shared_buffer buffer;\n        buffer.create(countBytes);\n        return buffer;\n    }\n\n    // A small mimic of the STL shared_ptr class, but unlike shared_ptr, a pointer is not attached to the class, but is\n    // always simply contained within (it cannot be attached or detached).\n\n    template <typename object_t>\n    class shared_object\n    {\n    public:\n        shared_object() WI_NOEXCEPT : m_pCopy(nullptr)\n        {\n        }\n\n        shared_object(shared_object const& other) WI_NOEXCEPT : m_pCopy(other.m_pCopy)\n        {\n            if (m_pCopy != nullptr)\n            {\n                ::InterlockedIncrementNoFence(&m_pCopy->m_refCount);\n            }\n        }\n\n        shared_object(shared_object&& other) WI_NOEXCEPT : m_pCopy(other.m_pCopy)\n        {\n            other.m_pCopy = nullptr;\n        }\n\n        ~shared_object() WI_NOEXCEPT\n        {\n            reset();\n        }\n\n        shared_object& operator=(shared_object const& other) WI_NOEXCEPT\n        {\n            if (this != wistd::addressof(other))\n            {\n                reset();\n                m_pCopy = other.m_pCopy;\n                if (m_pCopy != nullptr)\n                {\n                    ::InterlockedIncrementNoFence(&m_pCopy->m_refCount);\n                }\n            }\n            return *this;\n        }\n\n        shared_object& operator=(shared_object&& other) WI_NOEXCEPT\n        {\n            if (this != wistd::addressof(other))\n            {\n                reset();\n                m_pCopy = other.m_pCopy;\n                other.m_pCopy = nullptr;\n            }\n            return *this;\n        }\n\n        void reset() WI_NOEXCEPT\n        {\n            if (m_pCopy != nullptr)\n            {\n                if (0 == ::InterlockedDecrementRelease(&m_pCopy->m_refCount))\n                {\n                    delete m_pCopy;\n                }\n                m_pCopy = nullptr;\n            }\n        }\n\n        bool create()\n        {\n            RefAndObject* pObject = new (std::nothrow) RefAndObject();\n            if (pObject == nullptr)\n            {\n                return false;\n            }\n            reset();\n            m_pCopy = pObject;\n            return true;\n        }\n\n        template <typename param_t>\n        bool create(param_t&& param1)\n        {\n            RefAndObject* pObject = new (std::nothrow) RefAndObject(wistd::forward<param_t>(param1));\n            if (pObject == nullptr)\n            {\n                return false;\n            }\n            reset();\n            m_pCopy = pObject;\n            return true;\n        }\n\n        WI_NODISCARD object_t* get() const WI_NOEXCEPT\n        {\n            return (m_pCopy == nullptr) ? nullptr : &m_pCopy->m_object;\n        }\n\n        WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n        {\n            return (m_pCopy != nullptr);\n        }\n\n        WI_NODISCARD bool unique() const WI_NOEXCEPT\n        {\n            return ((m_pCopy != nullptr) && (m_pCopy->m_refCount == 1));\n        }\n\n        WI_NODISCARD object_t* operator->() const WI_NOEXCEPT\n        {\n            return get();\n        }\n\n    private:\n        struct RefAndObject\n        {\n            long m_refCount;\n            object_t m_object;\n\n            RefAndObject() : m_refCount(1), m_object()\n            {\n            }\n\n            template <typename param_t>\n            RefAndObject(param_t&& param1) : m_refCount(1), m_object(wistd::forward<param_t>(param1))\n            {\n            }\n        };\n\n        RefAndObject* m_pCopy;\n    };\n\n    // The following functions are basically the same, but are kept separated to:\n    // 1) Provide a unique count and last error code per-type\n    // 2) Avoid merging the types to allow easy debugging (breakpoints, conditional breakpoints based\n    //      upon count of errors from a particular type, etc)\n    __WI_PUSH_WARNINGS\n#if __clang_major__ >= 13\n    __WI_CLANG_DISABLE_WARNING(-Wunused-but-set-variable) // s_hrErrorLast used for debugging. We intentionally only assign to it\n#endif\n    __WI_MSVC_DISABLE_WARNING(4746) // s_hrErrorLast' is subject to /volatile:<iso|ms> setting; consider using __iso_volatile_load/store intrinsic functions\n\n    __declspec(noinline) inline int RecordException(HRESULT hr) WI_NOEXCEPT\n    {\n        static HRESULT volatile s_hrErrorLast = S_OK;\n        static long volatile s_cErrorCount = 0;\n        s_hrErrorLast = hr;\n        return ::InterlockedIncrementNoFence(&s_cErrorCount);\n    }\n\n    __declspec(noinline) inline int RecordReturn(HRESULT hr) WI_NOEXCEPT\n    {\n        static HRESULT volatile s_hrErrorLast = S_OK;\n        static long volatile s_cErrorCount = 0;\n        s_hrErrorLast = hr;\n        return ::InterlockedIncrementNoFence(&s_cErrorCount);\n    }\n\n    __declspec(noinline) inline int RecordLog(HRESULT hr) WI_NOEXCEPT\n    {\n        static HRESULT volatile s_hrErrorLast = S_OK;\n        static long volatile s_cErrorCount = 0;\n        s_hrErrorLast = hr;\n        return ::InterlockedIncrementNoFence(&s_cErrorCount);\n    }\n\n    __declspec(noinline) inline int RecordFailFast(HRESULT hr) WI_NOEXCEPT\n    {\n        static HRESULT volatile s_hrErrorLast = S_OK;\n        s_hrErrorLast = hr;\n        return 1;\n    }\n    __WI_POP_WARNINGS\n\n    inline RESULT_NORETURN void __stdcall WilRaiseFailFastException(_In_ PEXCEPTION_RECORD er, _In_opt_ PCONTEXT cr, _In_ DWORD flags)\n    {\n        // if we managed to load the pointer either through WilDynamicRaiseFailFastException (PARTITION_DESKTOP etc.)\n        // or via direct linkage (e.g. UWP apps), then use it.\n        if (g_pfnRaiseFailFastException)\n        {\n            g_pfnRaiseFailFastException(er, cr, flags);\n        }\n        // if not, as a best effort, we are just going to call the intrinsic.\n        __fastfail(FAST_FAIL_FATAL_APP_EXIT);\n    }\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n    inline bool __stdcall GetModuleInformation(\n        _In_opt_ void* address, _Out_opt_ unsigned int* addressOffset, _Out_writes_bytes_opt_(size) char* name, size_t size) WI_NOEXCEPT\n    {\n        HMODULE hModule = nullptr;\n        if (address && !GetModuleHandleExW(\n                           GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,\n                           reinterpret_cast<PCWSTR>(address),\n                           &hModule))\n        {\n            assign_to_opt_param(addressOffset, 0U);\n            return false;\n        }\n        if (addressOffset)\n        {\n            *addressOffset =\n                address ? static_cast<unsigned int>(static_cast<unsigned char*>(address) - reinterpret_cast<unsigned char*>(hModule))\n                        : 0;\n        }\n        if (name)\n        {\n            char modulePath[MAX_PATH];\n            if (!GetModuleFileNameA(hModule, modulePath, ARRAYSIZE(modulePath)))\n            {\n                return false;\n            }\n\n            PCSTR start = modulePath + strlen(modulePath);\n            while ((start > modulePath) && (*(start - 1) != '\\\\'))\n            {\n                start--;\n            }\n            StringCchCopyA(name, size, start);\n        }\n        return true;\n    }\n\n    __WI_PUSH_WARNINGS\n    __WI_MSVC_DISABLE_WARNING(4746) // s_fModuleValid' is subject to /volatile:<iso|ms> setting; consider using __iso_volatile_load/store intrinsic functions\n    inline PCSTR __stdcall GetCurrentModuleName() WI_NOEXCEPT\n    {\n        static char s_szModule[64] = {};\n        static volatile bool s_fModuleValid = false;\n        if (!s_fModuleValid) // Races are acceptable\n        {\n            GetModuleInformation(reinterpret_cast<void*>(&RecordFailFast), nullptr, s_szModule, ARRAYSIZE(s_szModule));\n            s_fModuleValid = true;\n        }\n        return s_szModule;\n    }\n    __WI_POP_WARNINGS\n\n    inline void __stdcall DebugBreak() WI_NOEXCEPT\n    {\n        ::DebugBreak();\n    }\n\n    inline void __stdcall WilDynamicLoadRaiseFailFastException(_In_ PEXCEPTION_RECORD er, _In_ PCONTEXT cr, _In_ DWORD flags)\n    {\n        auto k32handle = GetModuleHandleW(L\"kernelbase.dll\");\n        _Analysis_assume_(k32handle != nullptr);\n        auto pfnRaiseFailFastException =\n            details::GetProcAddress<decltype(WilDynamicLoadRaiseFailFastException)*>(k32handle, \"RaiseFailFastException\");\n        if (pfnRaiseFailFastException)\n        {\n            pfnRaiseFailFastException(er, cr, flags);\n        }\n    }\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n    inline bool __stdcall GetModuleInformationFromAddress(\n        _In_opt_ void* address, _Out_opt_ unsigned int* addressOffset, _Out_writes_bytes_opt_(size) char* buffer, size_t size) WI_NOEXCEPT\n    {\n        if (size > 0)\n        {\n            assign_to_opt_param(buffer, '\\0');\n        }\n        if (addressOffset)\n        {\n            *addressOffset = 0;\n        }\n        if (g_pfnGetModuleInformation)\n        {\n            return g_pfnGetModuleInformation(address, addressOffset, buffer, size);\n        }\n        return false;\n    }\n\n    __declspec(noinline) inline HRESULT NtStatusToHr(NTSTATUS status) WI_NOEXCEPT\n    {\n        // The following conversions are the only known incorrect mappings in RtlNtStatusToDosErrorNoTeb\n        if (SUCCEEDED_NTSTATUS(status))\n        {\n            // All successful status codes have only one hresult equivalent, S_OK\n            return S_OK;\n        }\n        if (status == static_cast<NTSTATUS>(STATUS_NO_MEMORY))\n        {\n            // RtlNtStatusToDosErrorNoTeb maps STATUS_NO_MEMORY to the less popular of two Win32 no memory error codes resulting in an unexpected mapping\n            return E_OUTOFMEMORY;\n        }\n\n        if (g_pfnRtlNtStatusToDosErrorNoTeb != nullptr)\n        {\n            DWORD err = g_pfnRtlNtStatusToDosErrorNoTeb(status);\n\n            // ERROR_MR_MID_NOT_FOUND indicates a bug in the originator of the error (failure to add a mapping to the Win32 error codes).\n            // There are known instances of this bug which are unlikely to be fixed soon, and it's always possible that additional instances\n            // could be added in the future. In these cases, it's better to use HRESULT_FROM_NT rather than returning a meaningless error.\n            if ((err != 0) && (err != ERROR_MR_MID_NOT_FOUND))\n            {\n                return __HRESULT_FROM_WIN32(err);\n            }\n        }\n\n        return HRESULT_FROM_NT(status);\n    }\n\n    __declspec(noinline) inline NTSTATUS HrToNtStatus(HRESULT hr) WI_NOEXCEPT\n    {\n        // Constants taken from ntstatus.h\n        static constexpr NTSTATUS WIL_STATUS_INVALID_PARAMETER = 0xC000000D;\n        static constexpr NTSTATUS WIL_STATUS_INTERNAL_ERROR = 0xC00000E5;\n        static constexpr NTSTATUS WIL_STATUS_INTEGER_OVERFLOW = 0xC0000095;\n        static constexpr NTSTATUS WIL_STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A;\n        static constexpr NTSTATUS WIL_STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034;\n        static constexpr NTSTATUS WIL_STATUS_NOT_IMPLEMENTED = 0xC0000002;\n        static constexpr NTSTATUS WIL_STATUS_BUFFER_OVERFLOW = 0x80000005;\n        static constexpr NTSTATUS WIL_STATUS_IMPLEMENTATION_LIMIT = 0xC000042B;\n        static constexpr NTSTATUS WIL_STATUS_NO_MORE_MATCHES = 0xC0000273;\n        static constexpr NTSTATUS WIL_STATUS_ILLEGAL_CHARACTER = 0xC0000161;\n        static constexpr NTSTATUS WIL_STATUS_UNDEFINED_CHARACTER = 0xC0000163;\n        static constexpr NTSTATUS WIL_STATUS_BUFFER_TOO_SMALL = 0xC0000023;\n        static constexpr NTSTATUS WIL_STATUS_DISK_FULL = 0xC000007F;\n        static constexpr NTSTATUS WIL_STATUS_OBJECT_NAME_INVALID = 0xC0000033;\n        static constexpr NTSTATUS WIL_STATUS_DLL_NOT_FOUND = 0xC0000135;\n        static constexpr NTSTATUS WIL_STATUS_REVISION_MISMATCH = 0xC0000059;\n        static constexpr NTSTATUS WIL_STATUS_XML_PARSE_ERROR = 0xC000A083;\n        static constexpr HRESULT WIL_E_FAIL = 0x80004005;\n\n        NTSTATUS status = STATUS_SUCCESS;\n\n        switch (hr)\n        {\n        case S_OK:\n            status = STATUS_SUCCESS;\n            break;\n        case E_INVALIDARG:\n            status = WIL_STATUS_INVALID_PARAMETER;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR):\n            status = WIL_STATUS_INTERNAL_ERROR;\n            break;\n        case E_OUTOFMEMORY:\n            status = STATUS_NO_MEMORY;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW):\n            status = WIL_STATUS_INTEGER_OVERFLOW;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND):\n            status = WIL_STATUS_OBJECT_PATH_NOT_FOUND;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND):\n            status = WIL_STATUS_OBJECT_NAME_NOT_FOUND;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION):\n            status = WIL_STATUS_NOT_IMPLEMENTED;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_MORE_DATA):\n            status = WIL_STATUS_BUFFER_OVERFLOW;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_IMPLEMENTATION_LIMIT):\n            status = WIL_STATUS_IMPLEMENTATION_LIMIT;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_NO_MORE_MATCHES):\n            status = WIL_STATUS_NO_MORE_MATCHES;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_ILLEGAL_CHARACTER):\n            status = WIL_STATUS_ILLEGAL_CHARACTER;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_UNDEFINED_CHARACTER):\n            status = WIL_STATUS_UNDEFINED_CHARACTER;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER):\n            status = WIL_STATUS_BUFFER_TOO_SMALL;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_DISK_FULL):\n            status = WIL_STATUS_DISK_FULL;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_INVALID_NAME):\n            status = WIL_STATUS_OBJECT_NAME_INVALID;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND):\n            status = WIL_STATUS_DLL_NOT_FOUND;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_OLD_WIN_VERSION):\n            status = WIL_STATUS_REVISION_MISMATCH;\n            break;\n        case WIL_E_FAIL:\n            status = STATUS_UNSUCCESSFUL;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_XML_PARSE_ERROR):\n            status = WIL_STATUS_XML_PARSE_ERROR;\n            break;\n        case __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION):\n            status = STATUS_NONCONTINUABLE_EXCEPTION;\n            break;\n        default:\n            if ((hr & FACILITY_NT_BIT) != 0)\n            {\n                status = (hr & ~FACILITY_NT_BIT);\n            }\n            else if (HRESULT_FACILITY(hr) == FACILITY_WIN32)\n            {\n                status = __NTSTATUS_FROM_WIN32(HRESULT_CODE(hr));\n            }\n            else if (HRESULT_FACILITY(hr) == FACILITY_SSPI)\n            {\n                status =\n                    ((NTSTATUS)(hr) <= 0 ? ((NTSTATUS)(hr))\n                                         : ((NTSTATUS)(((hr) & 0x0000FFFF) | (FACILITY_SSPI << 16) | ERROR_SEVERITY_ERROR)));\n            }\n            else\n            {\n                status = WIL_STATUS_INTERNAL_ERROR;\n            }\n            break;\n        }\n        return status;\n    }\n\n    // The following set of functions all differ only based upon number of arguments.  They are unified in their handling\n    // of data from each of the various error-handling types (fast fail, exceptions, etc.).\n    _Post_equals_last_error_ inline DWORD GetLastErrorFail(__R_FN_PARAMS_FULL) WI_NOEXCEPT\n    {\n        __R_FN_UNREFERENCED;\n        auto err = ::GetLastError();\n        if (SUCCEEDED_WIN32(err))\n        {\n            // This function should only be called when GetLastError() is set to a FAILURE.\n            // If you hit this assert (or are reviewing this failure telemetry), then there are one of three issues:\n            //  1) Your code is using a macro (such as RETURN_IF_WIN32_BOOL_FALSE()) on a function that does not actually\n            //      set the last error (consult MSDN).\n            //  2) Your macro check against the error is not immediately after the API call.  Pushing it later can result\n            //      in another API call between the previous one and the check resetting the last error.\n            //  3) The API you're calling has a bug in it and does not accurately set the last error (there are a few\n            //      examples here, such as SendMessageTimeout() that don't accurately set the last error).\n            //      [MSFT internal] For these, please send mail to 'wildisc' when found and work-around with win32errorhelpers.\n\n            WI_USAGE_ERROR_FORWARD(\"CALLER BUG: Macro usage error detected.  GetLastError() does not have an error.\");\n            return ERROR_ASSERTION_FAILURE;\n        }\n        return err;\n    }\n\n    inline __declspec(noinline) DWORD GetLastErrorFail() WI_NOEXCEPT\n    {\n        __R_FN_LOCALS_FULL_RA;\n        return GetLastErrorFail(__R_FN_CALL_FULL);\n    }\n\n    _Translates_last_error_to_HRESULT_\n    inline HRESULT GetLastErrorFailHr(__R_FN_PARAMS_FULL) WI_NOEXCEPT\n    {\n        return HRESULT_FROM_WIN32(GetLastErrorFail(__R_FN_CALL_FULL));\n    }\n\n    _Translates_last_error_to_HRESULT_\n    inline __declspec(noinline) HRESULT GetLastErrorFailHr() WI_NOEXCEPT\n    {\n        __R_FN_LOCALS_FULL_RA;\n        return GetLastErrorFailHr(__R_FN_CALL_FULL);\n    }\n\n    inline void PrintLoggingMessage(\n        _Out_writes_(cchDest) _Post_z_ PWSTR pszDest,\n        _Pre_satisfies_(cchDest > 0) size_t cchDest,\n        _In_opt_ _Printf_format_string_ PCSTR formatString,\n        _In_opt_ va_list argList) WI_NOEXCEPT\n    {\n        if (formatString == nullptr)\n        {\n            pszDest[0] = L'\\0';\n        }\n        else if (argList == nullptr)\n        {\n            StringCchPrintfW(pszDest, cchDest, L\"%hs\", formatString);\n        }\n        else\n        {\n            wchar_t szFormatWide[2048];\n            StringCchPrintfW(szFormatWide, ARRAYSIZE(szFormatWide), L\"%hs\", formatString);\n            StringCchVPrintfW(pszDest, cchDest, szFormatWide, argList);\n        }\n    }\n\n#pragma warning(push)\n#pragma warning(disable : __WARNING_RETURNING_BAD_RESULT)\n    // NOTE: The following two functions are unfortunate copies of strsafe.h functions that have been copied to reduce the friction associated with using\n    // Result.h and ResultException.h in a build that does not have WINAPI_PARTITION_DESKTOP defined (where these are conditionally enabled).\n\n    inline HRESULT WilStringLengthWorkerA(\n        _In_reads_or_z_(cchMax) PCNZCH psz,\n        _In_ _In_range_(<=, STRSAFE_MAX_CCH) size_t cchMax,\n        _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n    {\n        HRESULT hr = S_OK;\n        size_t cchOriginalMax = cchMax;\n        while (cchMax && (*psz != '\\0'))\n        {\n            psz++;\n            cchMax--;\n        }\n        if (cchMax == 0)\n        {\n            // the string is longer than cchMax\n            hr = STRSAFE_E_INVALID_PARAMETER;\n        }\n        if (pcchLength)\n        {\n            if (SUCCEEDED(hr))\n            {\n                *pcchLength = cchOriginalMax - cchMax;\n            }\n            else\n            {\n                *pcchLength = 0;\n            }\n        }\n        return hr;\n    }\n\n    _Must_inspect_result_\n    inline HRESULT StringCchLengthA(\n        _In_reads_or_z_(cchMax) PCNZCH psz,\n        _In_ _In_range_(1, STRSAFE_MAX_CCH) size_t cchMax,\n        _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t* pcchLength)\n    {\n        HRESULT hr = S_OK;\n        if ((psz == nullptr) || (cchMax > STRSAFE_MAX_CCH))\n        {\n            hr = STRSAFE_E_INVALID_PARAMETER;\n        }\n        else\n        {\n            hr = WilStringLengthWorkerA(psz, cchMax, pcchLength);\n        }\n        if (FAILED(hr) && pcchLength)\n        {\n            *pcchLength = 0;\n        }\n        return hr;\n    }\n#pragma warning(pop)\n\n    _Post_satisfies_(cchDest > 0 && cchDest <= cchMax) inline HRESULT\n        WilStringValidateDestA(_In_reads_opt_(cchDest) PCNZCH /*pszDest*/, _In_ size_t cchDest, _In_ const size_t cchMax)\n    {\n        HRESULT hr = S_OK;\n        if ((cchDest == 0) || (cchDest > cchMax))\n        {\n            hr = STRSAFE_E_INVALID_PARAMETER;\n        }\n        return hr;\n    }\n\n    inline HRESULT WilStringVPrintfWorkerA(\n        _Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,\n        _In_ _In_range_(1, STRSAFE_MAX_CCH) size_t cchDest,\n        _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength,\n        _In_ _Printf_format_string_ STRSAFE_LPCSTR pszFormat,\n        _In_ va_list argList)\n    {\n        HRESULT hr = S_OK;\n        int iRet{};\n\n        // leave the last space for the null terminator\n        size_t cchMax = cchDest - 1;\n        size_t cchNewDestLength = 0;\n#undef STRSAFE_USE_SECURE_CRT\n#define STRSAFE_USE_SECURE_CRT 1\n#if (STRSAFE_USE_SECURE_CRT == 1) && !defined(STRSAFE_LIB_IMPL)\n        iRet = _vsnprintf_s(pszDest, cchDest, cchMax, pszFormat, argList);\n#else\n#pragma warning(push)\n#pragma warning(disable : __WARNING_BANNED_API_USAGE) // \"STRSAFE not included\"\n        iRet = _vsnprintf(pszDest, cchMax, pszFormat, argList);\n#pragma warning(pop)\n#endif\n        // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));\n\n        if ((iRet < 0) || (((size_t)iRet) > cchMax))\n        {\n            // need to null terminate the string\n            pszDest += cchMax;\n            *pszDest = '\\0';\n\n            cchNewDestLength = cchMax;\n\n            // we have truncated pszDest\n            hr = STRSAFE_E_INSUFFICIENT_BUFFER;\n        }\n        else if (((size_t)iRet) == cchMax)\n        {\n            // need to null terminate the string\n            pszDest += cchMax;\n            *pszDest = '\\0';\n\n            cchNewDestLength = cchMax;\n        }\n        else\n        {\n            cchNewDestLength = (size_t)iRet;\n        }\n\n        if (pcchNewDestLength)\n        {\n            *pcchNewDestLength = cchNewDestLength;\n        }\n\n        return hr;\n    }\n\n    inline HRESULT StringCchPrintfA(\n        _Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,\n        _In_ size_t cchDest,\n        _In_ _Printf_format_string_ STRSAFE_LPCSTR pszFormat,\n        ...)\n    {\n        HRESULT hr;\n        hr = wil::details::WilStringValidateDestA(pszDest, cchDest, STRSAFE_MAX_CCH);\n        if (SUCCEEDED(hr))\n        {\n            va_list argList;\n            va_start(argList, pszFormat);\n            hr = wil::details::WilStringVPrintfWorkerA(pszDest, cchDest, nullptr, pszFormat, argList);\n            va_end(argList);\n        }\n        else if (cchDest > 0)\n        {\n            *pszDest = '\\0';\n        }\n        return hr;\n    }\n\n    _Ret_range_(sizeof(char), (psz == nullptr) ? sizeof(char) : (_String_length_(psz) + sizeof(char)))\n    inline size_t ResultStringSize(_In_opt_ PCSTR psz)\n    {\n        return (psz == nullptr) ? sizeof(char) : (strlen(psz) + sizeof(char));\n    }\n\n    _Ret_range_(sizeof(wchar_t), (psz == nullptr) ? sizeof(wchar_t) : ((_String_length_(psz) + 1) * sizeof(wchar_t)))\n    inline size_t ResultStringSize(_In_opt_ PCWSTR psz)\n    {\n        return (psz == nullptr) ? sizeof(wchar_t) : (wcslen(psz) + 1) * sizeof(wchar_t);\n    }\n\n    template <typename TString>\n    _Ret_range_(pStart, pEnd)\n    inline unsigned char* WriteResultString(\n        _Pre_satisfies_(pStart <= pEnd) _When_((pStart == pEnd) || (pszString == nullptr) || (pszString[0] == 0), _In_opt_) _When_(\n            (pStart != pEnd) && (pszString != nullptr) && (pszString[0] != 0),\n            _Out_writes_bytes_opt_(_String_length_(pszString) * sizeof(pszString[0]))) unsigned char* pStart,\n        _Pre_satisfies_(pEnd >= pStart) unsigned char* pEnd,\n        _In_opt_z_ TString pszString,\n        _Outptr_result_maybenull_z_ TString* ppszBufferString)\n    {\n        // No space? Null string? Do nothing.\n        if ((pStart == pEnd) || !pszString || !*pszString)\n        {\n            assign_null_to_opt_param(ppszBufferString);\n            return pStart;\n        }\n\n        // Treats the range pStart--pEnd as a memory buffer into which pszString is copied. A pointer to\n        // the start of the copied string is placed into ppszStringBuffer. If the buffer isn't big enough,\n        // do nothing, and tell the caller nothing was written.\n        size_t const stringSize = ResultStringSize(pszString);\n        size_t const bufferSize = pEnd - pStart;\n        if (bufferSize < stringSize)\n        {\n            assign_null_to_opt_param(ppszBufferString);\n            return pStart;\n        }\n\n        memcpy_s(pStart, bufferSize, pszString, stringSize);\n        assign_to_opt_param(\n            ppszBufferString,\n            reinterpret_cast<TString>(\n                pStart)); // lgtm[cpp/incorrect-string-type-conversion] False positive - The query is misinterpreting a buffer (char *) with a MBS string, the cast to TString is expected.\n        return pStart + stringSize;\n    }\n\n    _Ret_range_(0, (cchMax > 0) ? cchMax - 1 : 0)\n    inline size_t UntrustedStringLength(_In_ PCSTR psz, _In_ size_t cchMax)\n    {\n        size_t cbLength;\n        return SUCCEEDED(wil::details::StringCchLengthA(psz, cchMax, &cbLength)) ? cbLength : 0;\n    }\n    _Ret_range_(0, (cchMax > 0) ? cchMax - 1 : 0)\n    inline size_t UntrustedStringLength(_In_ PCWSTR psz, _In_ size_t cchMax)\n    {\n        size_t cbLength;\n        return SUCCEEDED(::StringCchLengthW(psz, cchMax, &cbLength)) ? cbLength : 0;\n    }\n\n    template <typename TString>\n    _Ret_range_(pStart, pEnd)\n    inline unsigned char* GetResultString(\n        _In_reads_to_ptr_opt_(pEnd) unsigned char* pStart, _Pre_satisfies_(pEnd >= pStart) unsigned char* pEnd, _Out_ TString* ppszBufferString)\n    {\n        size_t cchLen = UntrustedStringLength(reinterpret_cast<TString>(pStart), (pEnd - pStart) / sizeof((*ppszBufferString)[0]));\n        *ppszBufferString = (cchLen > 0) ? reinterpret_cast<TString>(pStart) : nullptr;\n        auto pReturn = (wistd::min)(pEnd, pStart + ((cchLen + 1) * sizeof((*ppszBufferString)[0])));\n        __analysis_assume((pReturn >= pStart) && (pReturn <= pEnd));\n        return pReturn;\n    }\n} // namespace details\n/// @endcond\n\n//*****************************************************************************\n// WIL result handling initializers\n//\n// Generally, callers do not need to manually initialize WIL. This header creates\n// the appropriate .CRT init section pieces through global objects to ensure that\n// WilInitialize... is called before DllMain or main().\n//\n// Certain binaries do not link with the CRT or do not support .CRT-section based\n// initializers. Those binaries must link only with other static libraries that\n// also set RESULT_SUPPRESS_STATIC_INITIALIZERS to ensure no .CRT inits are left,\n// and they should call one of the WilInitialize_ResultMacros_??? methods during\n// their initialization phase.  Skipping this initialization path is OK as well,\n// but results in a slightly degraded experience with result reporting.\n//\n// Calling WilInitialize_ResultMacros_DesktopOrSystem_SuppressPrivateApiUse provides:\n// - The name of the current module in wil::FailureInfo::pszModule\n// - The name of the returning-to module during wil/staging.h failures\n//*****************************************************************************\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n//! Call this method to initialize WIL manually in a module where RESULT_SUPPRESS_STATIC_INITIALIZERS is required. WIL will\n//! only use publicly documented APIs.\ninline void WilInitialize_ResultMacros_DesktopOrSystem_SuppressPrivateApiUse()\n{\n    details::g_pfnGetModuleName = details::GetCurrentModuleName;\n    details::g_pfnGetModuleInformation = details::GetModuleInformation;\n    details::g_pfnDebugBreak = details::DebugBreak;\n    details::g_pfnRaiseFailFastException = wil::details::WilDynamicLoadRaiseFailFastException;\n}\n\n/// @cond\nnamespace details\n{\n#ifndef RESULT_SUPPRESS_STATIC_INITIALIZERS\n#if !defined(BUILD_WINDOWS) || defined(WIL_SUPPRESS_PRIVATE_API_USE)\n    WI_HEADER_INITIALIZATION_FUNCTION(WilInitialize_ResultMacros_DesktopOrSystem_SuppressPrivateApiUse, [] {\n        ::wil::WilInitialize_ResultMacros_DesktopOrSystem_SuppressPrivateApiUse();\n        return 1;\n    });\n#endif\n#endif\n} // namespace details\n/// @endcond\n#else  // !WINAPI_PARTITION_DESKTOP, !WINAPI_PARTITION_SYSTEM, explicitly assume these modules can direct link\nnamespace details\n{\n    WI_HEADER_INITIALIZATION_FUNCTION(WilInitialize_ResultMacros_AppOnly, [] {\n        g_pfnRaiseFailFastException = ::RaiseFailFastException;\n        return 1;\n    });\n} // namespace details\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n//*****************************************************************************\n// Public Error Handling Helpers\n//*****************************************************************************\n\n//! Call this method to determine if process shutdown is in progress (allows avoiding work during dll unload).\ninline bool ProcessShutdownInProgress()\n{\n    return (details::g_processShutdownInProgress || (details::g_pfnDllShutdownInProgress ? details::g_pfnDllShutdownInProgress() : false));\n}\n\n/** Use this object to wrap an object that wants to prevent its destructor from being run when the process is shutting down,\nbut the hosting DLL doesn't support CRT initializers (such as kernelbase.dll).  The hosting DLL is responsible for calling\nConstruct() and Destroy() to manually run the constructor and destructor during DLL load & unload.\nUpon process shutdown a method (ProcessShutdown()) is called that must be implemented on the object, otherwise the destructor is\ncalled as is typical. */\ntemplate <class T>\nclass manually_managed_shutdown_aware_object\n{\npublic:\n    manually_managed_shutdown_aware_object() = default;\n    manually_managed_shutdown_aware_object(manually_managed_shutdown_aware_object const&) = delete;\n    void operator=(manually_managed_shutdown_aware_object const&) = delete;\n\n    void construct()\n    {\n        void* var = &m_raw;\n        ::new (var) T();\n    }\n\n    void destroy()\n    {\n        if (ProcessShutdownInProgress())\n        {\n            get().ProcessShutdown();\n        }\n        else\n        {\n            (&get())->~T();\n        }\n    }\n\n    //! Retrieves a reference to the contained object\n    T& get() WI_NOEXCEPT\n    {\n        return *reinterpret_cast<T*>(&m_raw);\n    }\n\nprivate:\n    alignas(T) unsigned char m_raw[sizeof(T)];\n};\n\n/** Use this object to wrap an object that wants to prevent its destructor from being run when the process is shutting down.\nUpon process shutdown a method (ProcessShutdown()) is called that must be implemented on the object, otherwise the destructor is\ncalled as is typical. */\ntemplate <class T>\nclass shutdown_aware_object\n{\npublic:\n    shutdown_aware_object()\n    {\n        m_object.construct();\n    }\n\n    ~shutdown_aware_object()\n    {\n        m_object.destroy();\n    }\n\n    shutdown_aware_object(shutdown_aware_object const&) = delete;\n    void operator=(shutdown_aware_object const&) = delete;\n\n    //! Retrieves a reference to the contained object\n    T& get() WI_NOEXCEPT\n    {\n        return m_object.get();\n    }\n\nprivate:\n    manually_managed_shutdown_aware_object<T> m_object;\n};\n\n/** Use this object to wrap an object that wants to prevent its destructor from being run when the process is shutting down. */\ntemplate <class T>\nclass object_without_destructor_on_shutdown\n{\npublic:\n    object_without_destructor_on_shutdown()\n    {\n        void* var = &m_raw;\n        ::new (var) T();\n    }\n\n    ~object_without_destructor_on_shutdown()\n    {\n        if (!ProcessShutdownInProgress())\n        {\n            get().~T();\n        }\n    }\n\n    object_without_destructor_on_shutdown(object_without_destructor_on_shutdown const&) = delete;\n    void operator=(object_without_destructor_on_shutdown const&) = delete;\n\n    //! Retrieves a reference to the contained object\n    T& get() WI_NOEXCEPT\n    {\n        return *reinterpret_cast<T*>(&m_raw);\n    }\n\nprivate:\n    alignas(T) unsigned char m_raw[sizeof(T)]{};\n};\n\n/** Forward your DLLMain to this function so that WIL can have visibility into whether a DLL unload is because\nof termination or normal unload.  Note that when g_pfnDllShutdownInProgress is set, WIL attempts to make this\ndetermination on its own without this callback.  Suppressing private APIs requires use of this. */\ninline void DLLMain(HINSTANCE, DWORD reason, _In_opt_ LPVOID reserved)\n{\n    if (!details::g_processShutdownInProgress)\n    {\n        if ((reason == DLL_PROCESS_DETACH) && (reserved != nullptr))\n        {\n            details::g_processShutdownInProgress = true;\n        }\n    }\n}\n\n// [optionally] Plug in fallback telemetry reporting\n// Normally, the callback is owned by including ResultLogging.h in the including module.  Alternatively a module\n// could re-route fallback telemetry to any ONE specific provider by calling this method.\ninline void SetResultTelemetryFallback(_In_opt_ decltype(details::g_pfnTelemetryCallback) callbackFunction)\n{\n    // Only ONE telemetry provider can own the fallback telemetry callback.\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (details::g_pfnTelemetryCallback == nullptr) || (callbackFunction == nullptr) ||\n        (details::g_pfnTelemetryCallback == callbackFunction));\n    details::g_pfnTelemetryCallback = callbackFunction;\n}\n\n// [optionally] Plug in result logging (do not use for telemetry)\n// This provides the ability for a module to hook all failures flowing through the system for inspection\n// and/or logging.\ninline void SetResultLoggingCallback(_In_opt_ decltype(details::g_pfnLoggingCallback) callbackFunction)\n{\n    // Only ONE function can own the result logging callback\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (details::g_pfnLoggingCallback == nullptr) || (callbackFunction == nullptr) ||\n        (details::g_pfnLoggingCallback == callbackFunction));\n    details::g_pfnLoggingCallback = callbackFunction;\n}\n\n// [optionally] Plug in custom result messages\n// There are some purposes that require translating the full information that is known about a failure\n// into a message to be logged (either through the console for debugging OR as the message attached\n// to a Platform::Exception^).  This callback allows a module to format the string itself away from the\n// default.\ninline void SetResultMessageCallback(_In_opt_ decltype(wil::g_pfnResultLoggingCallback) callbackFunction)\n{\n    // Only ONE function can own the result message callback\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (g_pfnResultLoggingCallback == nullptr) || (callbackFunction == nullptr) || (g_pfnResultLoggingCallback == callbackFunction));\n    details::g_resultMessageCallbackSet = true;\n    g_pfnResultLoggingCallback = callbackFunction;\n}\n\n// [optionally] Plug in exception remapping\n// A module can plug a callback in using this function to setup custom exception handling to allow any\n// exception type to be converted into an HRESULT from exception barriers.\ninline void SetResultFromCaughtExceptionCallback(_In_opt_ decltype(wil::g_pfnResultFromCaughtException) callbackFunction)\n{\n    // Only ONE function can own the exception conversion\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (g_pfnResultFromCaughtException == nullptr) || (callbackFunction == nullptr) ||\n        (g_pfnResultFromCaughtException == callbackFunction));\n    g_pfnResultFromCaughtException = callbackFunction;\n}\n\n// [optionally] Plug in exception remapping\n// This provides the ability for a module to call RoOriginateError in case of a failure.\n// Normally, the callback is owned by including result_originate.h in the including module.  Alternatively a module\n// could re-route error origination callback to its own implementation.\ninline void SetOriginateErrorCallback(_In_opt_ decltype(details::g_pfnOriginateCallback) callbackFunction)\n{\n    // Only ONE function can own the error origination callback\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (details::g_pfnOriginateCallback == nullptr) || (callbackFunction == nullptr) ||\n        (details::g_pfnOriginateCallback == callbackFunction));\n    details::g_pfnOriginateCallback = callbackFunction;\n}\n\n// [optionally] Plug in failfast callback\n// This provides the ability for a module to call RoFailFastWithErrorContext in the failfast handler -if- there is stowed\n// exception data available.  Normally, the callback is owned by including result_originate.h in the including module.\n// Alternatively a module could re-route to its own implementation.\ninline void SetFailfastWithContextCallback(_In_opt_ decltype(details::g_pfnFailfastWithContextCallback) callbackFunction)\n{\n    // Only ONE function can own the failfast with context callback\n    __FAIL_FAST_IMMEDIATE_ASSERT__(\n        (details::g_pfnFailfastWithContextCallback == nullptr) || (callbackFunction == nullptr) ||\n        (details::g_pfnFailfastWithContextCallback == callbackFunction));\n    details::g_pfnFailfastWithContextCallback = callbackFunction;\n}\n\n// A RAII wrapper around the storage of a FailureInfo struct (which is normally meant to be consumed\n// on the stack or from the caller).  The storage of FailureInfo needs to copy some data internally\n// for lifetime purposes.\n\nclass StoredFailureInfo\n{\npublic:\n    StoredFailureInfo() WI_NOEXCEPT\n    {\n        ::ZeroMemory(&m_failureInfo, sizeof(m_failureInfo));\n    }\n\n    StoredFailureInfo(FailureInfo const& other) WI_NOEXCEPT\n    {\n        SetFailureInfo(other);\n    }\n\n    WI_NODISCARD FailureInfo const& GetFailureInfo() const WI_NOEXCEPT\n    {\n        return m_failureInfo;\n    }\n\n    void SetFailureInfo(FailureInfo const& failure) WI_NOEXCEPT\n    {\n        m_failureInfo = failure;\n\n        size_t const cbNeed = details::ResultStringSize(failure.pszMessage) + details::ResultStringSize(failure.pszCode) +\n                              details::ResultStringSize(failure.pszFunction) + details::ResultStringSize(failure.pszFile) +\n                              details::ResultStringSize(failure.pszCallContext) + details::ResultStringSize(failure.pszModule) +\n                              details::ResultStringSize(failure.callContextCurrent.contextName) +\n                              details::ResultStringSize(failure.callContextCurrent.contextMessage) +\n                              details::ResultStringSize(failure.callContextOriginating.contextName) +\n                              details::ResultStringSize(failure.callContextOriginating.contextMessage);\n\n        if (!m_spStrings.unique() || (m_spStrings.size() < cbNeed))\n        {\n            m_spStrings.reset();\n            m_spStrings.create(cbNeed);\n        }\n\n        size_t cbAlloc;\n        unsigned char* pBuffer = static_cast<unsigned char*>(m_spStrings.get(&cbAlloc));\n        unsigned char* pBufferEnd = (pBuffer != nullptr) ? pBuffer + cbAlloc : nullptr;\n\n        if (pBuffer)\n        {\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszMessage, &m_failureInfo.pszMessage);\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszCode, &m_failureInfo.pszCode);\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszFunction, &m_failureInfo.pszFunction);\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszFile, &m_failureInfo.pszFile);\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszCallContext, &m_failureInfo.pszCallContext);\n            pBuffer = details::WriteResultString(pBuffer, pBufferEnd, failure.pszModule, &m_failureInfo.pszModule);\n            pBuffer = details::WriteResultString(\n                pBuffer, pBufferEnd, failure.callContextCurrent.contextName, &m_failureInfo.callContextCurrent.contextName);\n            pBuffer = details::WriteResultString(\n                pBuffer, pBufferEnd, failure.callContextCurrent.contextMessage, &m_failureInfo.callContextCurrent.contextMessage);\n            pBuffer = details::WriteResultString(\n                pBuffer, pBufferEnd, failure.callContextOriginating.contextName, &m_failureInfo.callContextOriginating.contextName);\n            pBuffer = details::WriteResultString(\n                pBuffer, pBufferEnd, failure.callContextOriginating.contextMessage, &m_failureInfo.callContextOriginating.contextMessage);\n            ZeroMemory(pBuffer, pBufferEnd - pBuffer);\n        }\n    }\n\n    // Relies upon generated copy constructor and assignment operator\n\nprotected:\n    FailureInfo m_failureInfo;\n    details::shared_buffer m_spStrings;\n};\n\n#if defined(WIL_ENABLE_EXCEPTIONS) || defined(WIL_FORCE_INCLUDE_RESULT_EXCEPTION)\n\n//! This is WIL's default exception class thrown from all THROW_XXX macros (outside of c++/cx).\n//! This class stores all of the FailureInfo context that is available when the exception is thrown.  It's also caught by\n//! exception guards for automatic conversion to HRESULT.\n//!\n//! In c++/cx, Platform::Exception^ is used instead of this class (unless @ref wil::g_fResultThrowPlatformException has been\n//! changed).\nclass ResultException : public std::exception\n{\npublic:\n    //! Constructs a new ResultException from an existing FailureInfo.\n    ResultException(const FailureInfo& failure) WI_NOEXCEPT : m_failure(failure)\n    {\n    }\n\n    //! Constructs a new exception type from a given HRESULT (use only for constructing custom exception types).\n    ResultException(_Pre_satisfies_(hr < 0) HRESULT hr) WI_NOEXCEPT : m_failure(CustomExceptionFailureInfo(hr))\n    {\n    }\n\n    //! Returns the failed HRESULT that this exception represents.\n    WI_NODISCARD _Always_(_Post_satisfies_(return < 0)) HRESULT GetErrorCode() const WI_NOEXCEPT\n    {\n        HRESULT const hr = m_failure.GetFailureInfo().hr;\n        __analysis_assume(hr < 0);\n        return hr;\n    }\n\n    //! Returns the failed NTSTATUS that this exception represents.\n    WI_NODISCARD _Always_(_Post_satisfies_(return < 0)) NTSTATUS GetStatusCode() const WI_NOEXCEPT\n    {\n        NTSTATUS const status = m_failure.GetFailureInfo().status;\n        __analysis_assume(status < 0);\n        return status;\n    }\n\n    //! Get a reference to the stored FailureInfo.\n    WI_NODISCARD FailureInfo const& GetFailureInfo() const WI_NOEXCEPT\n    {\n        return m_failure.GetFailureInfo();\n    }\n\n    //! Sets the stored FailureInfo (use primarily only when constructing custom exception types).\n    void SetFailureInfo(FailureInfo const& failure) WI_NOEXCEPT\n    {\n        m_failure.SetFailureInfo(failure);\n    }\n\n    //! Provides a string representing the FailureInfo from this exception.\n    WI_NODISCARD inline const char* __CLR_OR_THIS_CALL what() const WI_NOEXCEPT override\n    {\n#if !defined(NONLS) && !defined(NOAPISET)\n        if (!m_what)\n        {\n            wchar_t message[2048];\n            GetFailureLogString(message, ARRAYSIZE(message), m_failure.GetFailureInfo());\n\n            int len = WideCharToMultiByte(CP_ACP, 0, message, -1, nullptr, 0, nullptr, nullptr);\n            if (!m_what.create(len))\n            {\n                // Allocation failed, return placeholder string.\n                return \"WIL Exception\";\n            }\n\n            WideCharToMultiByte(CP_ACP, 0, message, -1, static_cast<char*>(m_what.get()), len, nullptr, nullptr);\n        }\n        return static_cast<const char*>(m_what.get());\n#else\n        if (!m_what)\n        {\n            wchar_t message[2048];\n            GetFailureLogString(message, ARRAYSIZE(message), m_failure.GetFailureInfo());\n\n            char messageA[1024];\n            wil::details::StringCchPrintfA(messageA, ARRAYSIZE(messageA), \"%ws\", message);\n            m_what.create(messageA, strlen(messageA) + sizeof(*messageA));\n        }\n        return static_cast<const char*>(m_what.get());\n#endif\n    }\n\n    // Relies upon auto-generated copy constructor and assignment operator\nprotected:\n    StoredFailureInfo m_failure;           //!< The failure information for this exception\n    mutable details::shared_buffer m_what; //!< The on-demand generated what() string\n\n    //! Use to produce a custom FailureInfo from an HRESULT (use only when constructing custom exception types).\n    static FailureInfo CustomExceptionFailureInfo(HRESULT hr) WI_NOEXCEPT\n    {\n        FailureInfo fi = {};\n        fi.type = FailureType::Exception;\n        fi.hr = hr;\n        return fi;\n    }\n};\n#endif\n\n//*****************************************************************************\n// Public Helpers that catch -- mostly only enabled when exceptions are enabled\n//*****************************************************************************\n\n// ResultFromCaughtException is a function that is meant to be called from within a catch(...) block.  Internally\n// it re-throws and catches the exception to convert it to an HRESULT.  If an exception is of an unrecognized type\n// the function will fail fast.\n//\n// try\n// {\n//     // Code\n// }\n// catch (...)\n// {\n//     hr = wil::ResultFromCaughtException();\n// }\n_Always_(_Post_satisfies_(return < 0)) __declspec(noinline) inline HRESULT ResultFromCaughtException() WI_NOEXCEPT\n{\n    bool isNormalized = false;\n    HRESULT hr = S_OK;\n    if (details::g_pfnResultFromCaughtExceptionInternal)\n    {\n        hr = details::g_pfnResultFromCaughtExceptionInternal(nullptr, 0, &isNormalized).hr;\n    }\n    if (FAILED(hr))\n    {\n        return hr;\n    }\n\n    // Caller bug: an unknown exception was thrown\n    __WIL_PRIVATE_FAIL_FAST_HR_IF(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), g_fResultFailFastUnknownExceptions);\n    return __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION);\n}\n\n//! Identical to 'throw;', but can be called from error-code neutral code to rethrow in code that *may* be running under an\n//! exception context\ninline void RethrowCaughtException()\n{\n    // We always want to rethrow the exception under normal circumstances.  Ordinarily, we could actually guarantee\n    // this as we should be able to rethrow if we caught an exception, but if we got here in the middle of running\n    // dynamic initializers, then it's possible that we haven't yet setup the rethrow function pointer, thus the\n    // runtime check without the noreturn annotation.\n\n    if (details::g_pfnRethrow)\n    {\n        details::g_pfnRethrow();\n    }\n}\n\n//! Identical to 'throw ResultException(failure);', but can be referenced from error-code neutral code\ninline void ThrowResultException(const FailureInfo& failure)\n{\n    if (details::g_pfnThrowResultException)\n    {\n        details::g_pfnThrowResultException(failure);\n    }\n}\n\n/// @cond\nnamespace details\n{\n#ifdef WIL_ENABLE_EXCEPTIONS\n    //*****************************************************************************\n    // Private helpers to catch and propagate exceptions\n    //*****************************************************************************\n\n    RESULT_NORETURN inline void TerminateAndReportError(_In_opt_ PEXCEPTION_POINTERS)\n    {\n        // This is an intentional fail-fast that was caught by an exception guard with WIL.  Look back up the callstack to\n        // determine the source of the actual exception being thrown.  The exception guard used by the calling code did not expect\n        // this exception type to be thrown or is specifically requesting fail-fast for this class of exception.\n\n        FailureInfo failure{};\n        WilFailFast(failure);\n    }\n\n    inline void MaybeGetExceptionString(\n        const ResultException& exception,\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars)\n    {\n        if (debugString)\n        {\n            GetFailureLogString(debugString, debugStringChars, exception.GetFailureInfo());\n        }\n    }\n\n    inline void MaybeGetExceptionString(\n        const std::exception& exception,\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars)\n    {\n        if (debugString)\n        {\n            StringCchPrintfW(debugString, debugStringChars, L\"std::exception: %hs\", exception.what());\n        }\n    }\n\n    inline HRESULT ResultFromKnownException(const ResultException& exception, const DiagnosticsInfo& diagnostics, void* returnAddress)\n    {\n        wchar_t message[2048]{};\n        MaybeGetExceptionString(exception, message, ARRAYSIZE(message));\n        auto hr = exception.GetErrorCode();\n        wil::details::ReportFailure_Base<FailureType::Log>(\n            __R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message);\n        return hr;\n    }\n\n    inline HRESULT ResultFromKnownException(const std::bad_alloc& exception, const DiagnosticsInfo& diagnostics, void* returnAddress)\n    {\n        wchar_t message[2048]{};\n        MaybeGetExceptionString(exception, message, ARRAYSIZE(message));\n        constexpr auto hr = E_OUTOFMEMORY;\n        wil::details::ReportFailure_Base<FailureType::Log>(\n            __R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message);\n        return hr;\n    }\n\n    inline HRESULT ResultFromKnownException(const std::exception& exception, const DiagnosticsInfo& diagnostics, void* returnAddress)\n    {\n        wchar_t message[2048]{};\n        MaybeGetExceptionString(exception, message, ARRAYSIZE(message));\n        constexpr auto hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION);\n        ReportFailure_Base<FailureType::Log>(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message);\n        return hr;\n    }\n\n    inline HRESULT ResultFromKnownException_CppWinRT(const DiagnosticsInfo& diagnostics, void* returnAddress)\n    {\n        if (g_pfnResultFromCaughtException_CppWinRt)\n        {\n            wchar_t message[2048]{};\n            bool ignored;\n            auto hr = g_pfnResultFromCaughtException_CppWinRt(message, ARRAYSIZE(message), &ignored);\n            if (FAILED(hr))\n            {\n                ReportFailure_Base<FailureType::Log>(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message);\n                return hr;\n            }\n        }\n\n        // Indicate that this either isn't a C++/WinRT exception or a handler isn't configured by returning success\n        return S_OK;\n    }\n\n    inline HRESULT RecognizeCaughtExceptionFromCallback(\n        _Inout_updates_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars)\n    {\n        HRESULT hr = g_pfnResultFromCaughtException();\n\n        // If we still don't know the error -- or we would like to get the debug string for the error (if possible) we\n        // rethrow and catch std::exception.\n\n        if (SUCCEEDED(hr) || debugString)\n        {\n            try\n            {\n                throw;\n            }\n            catch (std::exception& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                if (SUCCEEDED(hr))\n                {\n                    hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION);\n                }\n            }\n            catch (...)\n            {\n                // Fall through to returning 'hr' below\n            }\n        }\n\n        return hr;\n    }\n\n    // clang-format off\n#ifdef __cplusplus_winrt\n    inline Platform::String^ GetPlatformExceptionMessage(Platform::Exception^ exception)\n    {\n        struct RawExceptionData_Partial\n        {\n            PCWSTR description;\n            PCWSTR restrictedErrorString;\n        };\n\n        auto exceptionPtr = reinterpret_cast<void*>(static_cast<::Platform::Object^>(exception));\n        auto exceptionInfoPtr = reinterpret_cast<ULONG_PTR*>(exceptionPtr) - 1;\n        auto partial = reinterpret_cast<RawExceptionData_Partial*>(*exceptionInfoPtr);\n\n        Platform::String^ message = exception->Message;\n\n        PCWSTR errorString = partial->restrictedErrorString;\n        PCWSTR messageString = reinterpret_cast<PCWSTR>(message ? message->Data() : nullptr);\n\n        // An old Platform::Exception^ bug that did not actually expose the error string out of the exception\n        // message.  We do it by hand here if the message associated with the strong does not contain the\n        // message that was originally attached to the string (in the fixed version it will).\n\n        if ((errorString && *errorString && messageString) && (wcsstr(messageString, errorString) == nullptr))\n        {\n            return ref new Platform::String(reinterpret_cast<_Null_terminated_ const __wchar_t*>(errorString));\n        }\n        return message;\n    }\n\n    inline void MaybeGetExceptionString(\n        _In_ Platform::Exception^ exception,\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars)\n    {\n        if (debugString)\n        {\n            auto message = GetPlatformExceptionMessage(exception);\n            auto messageString = !message ? L\"(null Message)\" : reinterpret_cast<PCWSTR>(message->Data());\n            StringCchPrintfW(debugString, debugStringChars, L\"Platform::Exception^: %ws\", messageString);\n        }\n    }\n\n    inline HRESULT ResultFromKnownException(\n        Platform::Exception^ exception, const DiagnosticsInfo& diagnostics, void* returnAddress)\n    {\n        wchar_t message[2048];\n        message[0] = L'\\0';\n        MaybeGetExceptionString(exception, message, ARRAYSIZE(message));\n        auto hr = exception->HResult;\n        wil::details::ReportFailure_Base<FailureType::Log>(\n            __R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message);\n        return hr;\n    }\n\n    inline HRESULT __stdcall ResultFromCaughtException_WinRt(\n        _Inout_updates_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n        _Inout_ bool* isNormalized) WI_NOEXCEPT\n    {\n        if (g_pfnResultFromCaughtException)\n        {\n            try\n            {\n                throw;\n            }\n            catch (const ResultException& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return exception.GetErrorCode();\n            }\n            catch (Platform::Exception^ exception)\n            {\n                *isNormalized = true;\n                // We need to call __abi_translateCurrentException so that the CX runtime will pull the originated error\n                // information out of the exception object and place it back into thread-local storage.\n                __abi_translateCurrentException(false);\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return exception->HResult;\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return E_OUTOFMEMORY;\n            }\n            catch (...)\n            {\n                auto hr = RecognizeCaughtExceptionFromCallback(debugString, debugStringChars);\n                if (FAILED(hr))\n                {\n                    return hr;\n                }\n            }\n        }\n        else\n        {\n            try\n            {\n                throw;\n            }\n            catch (const ResultException& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return exception.GetErrorCode();\n            }\n            catch (Platform::Exception^ exception)\n            {\n                *isNormalized = true;\n                // We need to call __abi_translateCurrentException so that the CX runtime will pull the originated error\n                // information out of the exception object and place it back into thread-local storage.\n                __abi_translateCurrentException(false);\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return exception->HResult;\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return E_OUTOFMEMORY;\n            }\n            catch (std::exception& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION);\n            }\n            catch (...)\n            {\n                // Fall through to returning 'S_OK' below\n            }\n        }\n\n        // Tell the caller that we were unable to map the exception by succeeding...\n        return S_OK;\n    }\n\n    // WinRT supporting version to execute a functor and catch known exceptions.\n    inline HRESULT __stdcall ResultFromKnownExceptions_WinRt(\n        const DiagnosticsInfo& diagnostics, void* returnAddress, SupportedExceptions supported, IFunctor& functor)\n    {\n        WI_ASSERT(supported != SupportedExceptions::Default);\n\n        switch (supported)\n        {\n        case SupportedExceptions::Known:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (Platform::Exception^ exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (std::exception& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (...)\n            {\n                auto hr = ResultFromKnownException_CppWinRT(diagnostics, returnAddress);\n                if (FAILED(hr))\n                {\n                    return hr;\n                }\n\n                // Unknown exception\n                throw;\n            }\n            break;\n\n        case SupportedExceptions::ThrownOrAlloc:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (Platform::Exception^ exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            break;\n\n        case SupportedExceptions::Thrown:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (Platform::Exception^ exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            break;\n        }\n\n        WI_ASSERT(false);\n        return S_OK;\n    }\n\n    inline void __stdcall ThrowPlatformException(FailureInfo const& failure, LPCWSTR debugString)\n    {\n        throw Platform::Exception::CreateException(\n            failure.hr, ref new Platform::String(reinterpret_cast<_Null_terminated_ const __wchar_t*>(debugString)));\n    }\n\n#if !defined(RESULT_SUPPRESS_STATIC_INITIALIZERS)\n    WI_HEADER_INITIALIZATION_FUNCTION(InitializeWinRt, [] {\n        g_pfnResultFromCaughtException_WinRt = ResultFromCaughtException_WinRt;\n        g_pfnResultFromKnownExceptions_WinRt = ResultFromKnownExceptions_WinRt;\n        g_pfnThrowPlatformException = ThrowPlatformException;\n        return 1;\n    });\n#endif\n#endif\n    // clang-format on\n\n    inline void __stdcall Rethrow()\n    {\n        throw;\n    }\n\n    inline void __stdcall ThrowResultExceptionInternal(const FailureInfo& failure)\n    {\n        throw ResultException(failure);\n    }\n\n    __declspec(noinline) inline ResultStatus __stdcall ResultFromCaughtExceptionInternal(\n        _Out_writes_opt_(debugStringChars) PWSTR debugString,\n        _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars,\n        _Out_ bool* isNormalized) WI_NOEXCEPT\n    {\n        if (debugString)\n        {\n            *debugString = L'\\0';\n        }\n        *isNormalized = false;\n\n        if (details::g_pfnResultFromCaughtException_CppWinRt != nullptr)\n        {\n            const auto hr = details::g_pfnResultFromCaughtException_CppWinRt(debugString, debugStringChars, isNormalized);\n            if (FAILED(hr))\n            {\n                return ResultStatus::FromResult(hr);\n            }\n        }\n\n        if (details::g_pfnResultFromCaughtException_WinRt != nullptr)\n        {\n            const auto hr = details::g_pfnResultFromCaughtException_WinRt(debugString, debugStringChars, isNormalized);\n            return ResultStatus::FromResult(hr);\n        }\n\n        if (g_pfnResultFromCaughtException)\n        {\n            try\n            {\n                throw;\n            }\n            catch (const ResultException& exception)\n            {\n                *isNormalized = true;\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return ResultStatus::FromFailureInfo(exception.GetFailureInfo());\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return ResultStatus::FromResult(E_OUTOFMEMORY);\n            }\n            catch (...)\n            {\n                auto hr = RecognizeCaughtExceptionFromCallback(debugString, debugStringChars);\n                if (FAILED(hr))\n                {\n                    return ResultStatus::FromResult(hr);\n                }\n            }\n        }\n        else\n        {\n            try\n            {\n                throw;\n            }\n            catch (const ResultException& exception)\n            {\n                *isNormalized = true;\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return ResultStatus::FromFailureInfo(exception.GetFailureInfo());\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return ResultStatus::FromResult(E_OUTOFMEMORY);\n            }\n            catch (std::exception& exception)\n            {\n                MaybeGetExceptionString(exception, debugString, debugStringChars);\n                return ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));\n            }\n            catch (...)\n            {\n                // Fall through to returning 'S_OK' below\n            }\n        }\n\n        // Tell the caller that we were unable to map the exception by succeeding...\n        return ResultStatus::FromResult(S_OK);\n    }\n\n    // Runs the given functor, converting any exceptions of the supported types that are known to HRESULTs and returning\n    // that HRESULT.  Does NOT attempt to catch unknown exceptions (which propagate).  Primarily used by SEH exception\n    // handling techniques to stop at the point the exception is thrown.\n    inline HRESULT ResultFromKnownExceptions(const DiagnosticsInfo& diagnostics, void* returnAddress, SupportedExceptions supported, IFunctor& functor)\n    {\n        if (supported == SupportedExceptions::Default)\n        {\n            supported = g_fResultSupportStdException ? SupportedExceptions::Known : SupportedExceptions::ThrownOrAlloc;\n        }\n\n        if ((details::g_pfnResultFromKnownExceptions_WinRt != nullptr) &&\n            ((supported == SupportedExceptions::Known) || (supported == SupportedExceptions::Thrown) ||\n             (supported == SupportedExceptions::ThrownOrAlloc)))\n        {\n            return details::g_pfnResultFromKnownExceptions_WinRt(diagnostics, returnAddress, supported, functor);\n        }\n\n        switch (supported)\n        {\n        case SupportedExceptions::Known:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (std::exception& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (...)\n            {\n                auto hr = ResultFromKnownException_CppWinRT(diagnostics, returnAddress);\n                if (FAILED(hr))\n                {\n                    return hr;\n                }\n\n                // Unknown exception\n                throw;\n            }\n\n        case SupportedExceptions::ThrownOrAlloc:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n            catch (const std::bad_alloc& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n\n        case SupportedExceptions::Thrown:\n            try\n            {\n                return functor.Run();\n            }\n            catch (const ResultException& exception)\n            {\n                return ResultFromKnownException(exception, diagnostics, returnAddress);\n            }\n\n        case SupportedExceptions::All:\n            try\n            {\n                return functor.Run();\n            }\n            catch (...)\n            {\n                return wil::details::ReportFailure_CaughtException<FailureType::Log>(\n                    __R_DIAGNOSTICS_RA(diagnostics, returnAddress), supported);\n            }\n\n        case SupportedExceptions::None:\n            return functor.Run();\n\n        case SupportedExceptions::Default:\n            WI_ASSERT(false);\n        }\n\n        WI_ASSERT(false);\n        return S_OK;\n    }\n\n    inline HRESULT ResultFromExceptionSeh(\n        const DiagnosticsInfo& diagnostics, void* returnAddress, SupportedExceptions supported, IFunctor& functor) WI_NOEXCEPT\n    {\n        __try\n        {\n            return wil::details::ResultFromKnownExceptions(diagnostics, returnAddress, supported, functor);\n        }\n        __except (wil::details::TerminateAndReportError(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH)\n        {\n            WI_ASSERT(false);\n            RESULT_NORETURN_RESULT(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));\n        }\n    }\n\n    __declspec(noinline) inline HRESULT ResultFromException(const DiagnosticsInfo& diagnostics, SupportedExceptions supported, IFunctor& functor) WI_NOEXCEPT\n    {\n#ifdef RESULT_DEBUG\n        // We can't do debug SEH handling if the caller also wants a shot at mapping the exceptions\n        // themselves or if the caller doesn't want to fail-fast unknown exceptions\n        if ((g_pfnResultFromCaughtException == nullptr) && g_fResultFailFastUnknownExceptions)\n        {\n            return wil::details::ResultFromExceptionSeh(diagnostics, _ReturnAddress(), supported, functor);\n        }\n#endif\n        try\n        {\n            return functor.Run();\n        }\n        catch (...)\n        {\n            return wil::details::ReportFailure_CaughtException<FailureType::Log>(__R_DIAGNOSTICS(diagnostics), _ReturnAddress(), supported);\n        }\n    }\n\n    __declspec(noinline) inline HRESULT ResultFromExceptionDebug(\n        const DiagnosticsInfo& diagnostics, SupportedExceptions supported, IFunctor& functor) WI_NOEXCEPT\n    {\n        return wil::details::ResultFromExceptionSeh(diagnostics, _ReturnAddress(), supported, functor);\n    }\n\n    // Exception guard -- catch exceptions and log them (or handle them with a custom callback)\n    // WARNING: may throw an exception...\n    inline HRESULT __stdcall RunFunctorWithExceptionFilter(IFunctor& functor, IFunctorHost& host, void* returnAddress)\n    {\n        try\n        {\n            return host.Run(functor);\n        }\n        catch (...)\n        {\n            // Note that the host may choose to re-throw, throw a normalized exception, return S_OK and eat the exception or\n            // return the remapped failure.\n            return host.ExceptionThrown(returnAddress);\n        }\n    }\n\n    WI_HEADER_INITIALIZATION_FUNCTION(InitializeResultExceptions, [] {\n        g_pfnRunFunctorWithExceptionFilter = RunFunctorWithExceptionFilter;\n        g_pfnRethrow = Rethrow;\n        g_pfnThrowResultException = ThrowResultExceptionInternal;\n        g_pfnResultFromCaughtExceptionInternal = ResultFromCaughtExceptionInternal;\n        return 1;\n    });\n}\n/// @endcond\n\n//! A lambda-based exception guard that can vary the supported exception types.\n//! This function accepts a lambda and diagnostics information as its parameters and executes that lambda\n//! under a try/catch(...) block.  All exceptions are caught and the function reports the exception information\n//! and diagnostics to telemetry on failure.  An HRESULT is returned that maps to the exception.\n//!\n//! Note that an overload exists that does not report failures to telemetry at all.  This version should be preferred\n//! to that version.  Also note that neither of these versions are preferred over using try catch blocks to accomplish\n//! the same thing as they will be more efficient.\n//! ~~~~\n//! return wil::ResultFromException(WI_DIAGNOSTICS_INFO, [&]\n//! {\n//!     // exception-based code\n//!     // telemetry is reported with full exception information\n//! });\n//! ~~~~\n//! @param diagnostics  Always pass WI_DIAGNOSTICS_INFO as the first parameter\n//! @param supported    What kind of exceptions you want to support\n//! @param functor      A lambda that accepts no parameters; any return value is ignored\n//! @return             S_OK on success (no exception thrown) or an error based upon the exception thrown\ntemplate <typename Functor>\n__forceinline HRESULT ResultFromException(const DiagnosticsInfo& diagnostics, SupportedExceptions supported, Functor&& functor) WI_NOEXCEPT\n{\n    static_assert(details::functor_tag<ErrorReturn::None, Functor>::value != details::tag_return_other::value, \"Functor must return void or HRESULT\");\n    typename details::functor_tag<ErrorReturn::None, Functor>::template functor_wrapper<Functor> functorObject(\n        wistd::forward<Functor>(functor));\n\n    return wil::details::ResultFromException(diagnostics, supported, functorObject);\n}\n\n//! A lambda-based exception guard.\n//! This overload uses SupportedExceptions::Known by default.  See @ref ResultFromException for more detailed information.\ntemplate <typename Functor>\n__forceinline HRESULT ResultFromException(const DiagnosticsInfo& diagnostics, Functor&& functor) WI_NOEXCEPT\n{\n    return ResultFromException(diagnostics, SupportedExceptions::Known, wistd::forward<Functor>(functor));\n}\n\n//! A lambda-based exception guard that does not report failures to telemetry.\n//! This function accepts a lambda as it's only parameter and executes that lambda under a try/catch(...) block.\n//! All exceptions are caught and the function returns an HRESULT mapping to the exception.\n//!\n//! This version (taking only a lambda) does not report failures to telemetry.  An overload with the same name\n//! can be utilized by passing `WI_DIAGNOSTICS_INFO` as the first parameter and the lambda as the second parameter\n//! to report failure information to telemetry.\n//! ~~~~\n//! hr = wil::ResultFromException([&]\n//! {\n//!     // exception-based code\n//!     // the conversion of exception to HRESULT doesn't report telemetry\n//! });\n//!\n//! hr = wil::ResultFromException(WI_DIAGNOSTICS_INFO, [&]\n//! {\n//!     // exception-based code\n//!     // telemetry is reported with full exception information\n//! });\n//! ~~~~\n//! @param functor  A lambda that accepts no parameters; any return value is ignored\n//! @return         S_OK on success (no exception thrown) or an error based upon the exception thrown\ntemplate <typename Functor>\ninline HRESULT ResultFromException(Functor&& functor) WI_NOEXCEPT\ntry\n{\n    static_assert(details::functor_tag<ErrorReturn::None, Functor>::value == details::tag_return_void::value, \"Functor must return void\");\n    typename details::functor_tag<ErrorReturn::None, Functor>::template functor_wrapper<Functor> functorObject(\n        wistd::forward<Functor>(functor));\n\n    functorObject.Run();\n    return S_OK;\n}\ncatch (...)\n{\n    return ResultFromCaughtException();\n}\n\n//! A lambda-based exception guard that can identify the origin of unknown exceptions and can vary the supported exception types.\n//! Functionally this is nearly identical to the corresponding @ref ResultFromException function with the exception\n//! that it utilizes structured exception handling internally to be able to terminate at the point where a unknown\n//! exception is thrown, rather than after that unknown exception has been unwound.  Though less efficient, this leads\n//! to a better debugging experience when analyzing unknown exceptions.\n//!\n//! For example:\n//! ~~~~\n//! hr = wil::ResultFromExceptionDebug(WI_DIAGNOSTICS_INFO, [&]\n//! {\n//!     FunctionWhichMayThrow();\n//! });\n//! ~~~~\n//! Assume FunctionWhichMayThrow() has a bug in it where it accidentally does a `throw E_INVALIDARG;`.  This ends up\n//! throwing a `long` as an exception object which is not what the caller intended.  The normal @ref ResultFromException\n//! would fail-fast when this is encountered, but it would do so AFTER FunctionWhichMayThrow() is already off of the\n//! stack and has been unwound.  Because SEH is used for ResultFromExceptionDebug, the fail-fast occurs with everything\n//! leading up to and including the `throw INVALIDARG;` still on the stack (and easily debuggable).\n//!\n//! The penalty paid for using this, however, is efficiency.  It's far less efficient as a general pattern than either\n//! using ResultFromException directly or especially using try with CATCH_ macros directly.  Still it's helpful to deploy\n//! selectively to isolate issues a component may be having with unknown/unhandled exceptions.\n//!\n//! The ability to vary the SupportedExceptions that this routine provides adds the ability to track down unexpected\n//! exceptions not falling into the supported category easily through fail-fast.  For example, by not supporting any\n//! exception, you can use this function to quickly add an exception guard that will fail-fast any exception at the point\n//! the exception occurs (the throw) in a codepath where the origination of unknown exceptions need to be tracked down.\n//!\n//! This will fail-fast and stop on std::exception based exceptions (but not Platform::Exception^ or wil::ResultException).\n//! Using this can help isolate where an unexpected exception is being generated from.\n//! @param diagnostics  Always pass WI_DIAGNOSTICS_INFO as the first parameter\n//! @param supported    What kind of exceptions you want to support\n//! @param functor      A lambda that accepts no parameters; any return value is ignored\n//! @return             S_OK on success (no exception thrown) or an error based upon the exception thrown\ntemplate <typename Functor>\n__forceinline HRESULT ResultFromExceptionDebug(const DiagnosticsInfo& diagnostics, SupportedExceptions supported, Functor&& functor) WI_NOEXCEPT\n{\n    static_assert(details::functor_tag<ErrorReturn::None, Functor>::value == details::tag_return_void::value, \"Functor must return void\");\n    typename details::functor_tag<ErrorReturn::None, Functor>::template functor_wrapper<Functor> functorObject(\n        wistd::forward<Functor>(functor));\n\n    return wil::details::ResultFromExceptionDebug(diagnostics, supported, functorObject);\n}\n\n//! A lambda-based exception guard that can identify the origin of unknown exceptions.\n//! This overload uses SupportedExceptions::Known by default.  See @ref ResultFromExceptionDebug for more detailed information.\ntemplate <typename Functor>\n__forceinline HRESULT ResultFromExceptionDebug(const DiagnosticsInfo& diagnostics, Functor&& functor) WI_NOEXCEPT\n{\n    static_assert(details::functor_tag<ErrorReturn::None, Functor>::value == details::tag_return_void::value, \"Functor must return void\");\n    typename details::functor_tag<ErrorReturn::None, Functor>::template functor_wrapper<Functor> functorObject(\n        wistd::forward<Functor>(functor));\n\n    return wil::details::ResultFromExceptionDebug(diagnostics, SupportedExceptions::Known, functorObject);\n}\n\n//! A fail-fast based exception guard.\n//! Technically this is an overload of @ref ResultFromExceptionDebug that uses SupportedExceptions::None by default.  Any uncaught\n//! exception that makes it back to this guard would result in a fail-fast at the point the exception is thrown.\ntemplate <typename Functor>\n__forceinline void FailFastException(const DiagnosticsInfo& diagnostics, Functor&& functor) WI_NOEXCEPT\n{\n    static_assert(details::functor_tag<ErrorReturn::None, Functor>::value == details::tag_return_void::value, \"Functor must return void\");\n    typename details::functor_tag<ErrorReturn::None, Functor>::template functor_wrapper<Functor> functorObject(\n        wistd::forward<Functor>(functor));\n\n    wil::details::ResultFromExceptionDebug(diagnostics, SupportedExceptions::None, functorObject);\n}\n\n/// @cond\nnamespace details\n{\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\n    // Exception guard -- catch exceptions and log them (or handle them with a custom callback)\n    // WARNING: may throw an exception...\n    inline __declspec(noinline) HRESULT RunFunctor(IFunctor& functor, IFunctorHost& host)\n    {\n        if (g_pfnRunFunctorWithExceptionFilter)\n        {\n            return g_pfnRunFunctorWithExceptionFilter(functor, host, _ReturnAddress());\n        }\n\n        return host.Run(functor);\n    }\n\n    // Returns true if a debugger should be considered to be connected.\n    // Modules can force this on through setting g_fIsDebuggerPresent explicitly (useful for live debugging),\n    // they can provide a callback function by setting g_pfnIsDebuggerPresent (useful for kernel debbugging),\n    // and finally the user-mode check (IsDebuggerPrsent) is checked. IsDebuggerPresent is a fast call\n    inline bool IsDebuggerPresent()\n    {\n        return g_fIsDebuggerPresent ||\n               ((g_pfnIsDebuggerPresent != nullptr) ? g_pfnIsDebuggerPresent() : (::IsDebuggerPresent() != FALSE));\n    }\n\n    //*****************************************************************************\n    // Shared Reporting -- all reporting macros bubble up through this codepath\n    //*****************************************************************************\n\n    inline void LogFailure(\n        __R_FN_PARAMS_FULL,\n        FailureType type,\n        const ResultStatus& resultPair,\n        _In_opt_ PCWSTR message,\n        bool fWantDebugString,\n        _Out_writes_(debugStringSizeChars) _Post_z_ PWSTR debugString,\n        _Pre_satisfies_(debugStringSizeChars > 0) size_t debugStringSizeChars,\n        _Out_writes_(callContextStringSizeChars) _Post_z_ PSTR callContextString,\n        _Pre_satisfies_(callContextStringSizeChars > 0) size_t callContextStringSizeChars,\n        FailureFlags flags,\n        _Out_ FailureInfo* failure) WI_NOEXCEPT\n    {\n        debugString[0] = L'\\0';\n        callContextString[0] = L'\\0';\n\n        static long volatile s_failureId = 0;\n\n        failure->hr = resultPair.hr;\n        failure->status = resultPair.status;\n\n        int failureCount = 0;\n        switch (type)\n        {\n        case FailureType::Exception:\n            failureCount = RecordException(failure->hr);\n            break;\n        case FailureType::Return:\n            failureCount = RecordReturn(failure->hr);\n            break;\n        case FailureType::Log:\n            if (SUCCEEDED(failure->hr))\n            {\n                // If you hit this assert (or are reviewing this failure telemetry), then most likely you are trying to log\n                // success using one of the WIL macros.  Example:\n                //      LOG_HR(S_OK);\n                // Instead, use one of the forms that conditionally logs based upon the error condition:\n                //      LOG_IF_FAILED(hr);\n\n                WI_USAGE_ERROR_FORWARD(\"CALLER BUG: Macro usage error detected.  Do not LOG_XXX success.\");\n                failure->hr = __HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE);\n                failure->status = wil::details::HrToNtStatus(failure->hr);\n            }\n            failureCount = RecordLog(failure->hr);\n            break;\n        case FailureType::FailFast:\n            failureCount = RecordFailFast(failure->hr);\n            break;\n        };\n\n        failure->type = type;\n        failure->flags = flags;\n        WI_SetFlagIf(failure->flags, FailureFlags::NtStatus, resultPair.kind == ResultStatus::Kind::NtStatus);\n        failure->failureId = ::InterlockedIncrementNoFence(&s_failureId);\n        failure->pszMessage = ((message != nullptr) && (message[0] != L'\\0')) ? message : nullptr;\n        failure->threadId = ::GetCurrentThreadId();\n        failure->pszFile = fileName;\n        failure->uLineNumber = lineNumber;\n        failure->cFailureCount = failureCount;\n        failure->pszCode = code;\n        failure->pszFunction = functionName;\n        failure->returnAddress = returnAddress;\n        failure->callerReturnAddress = callerReturnAddress;\n        failure->pszCallContext = nullptr;\n        ::ZeroMemory(&failure->callContextCurrent, sizeof(failure->callContextCurrent));\n        ::ZeroMemory(&failure->callContextOriginating, sizeof(failure->callContextOriginating));\n        failure->pszModule = (g_pfnGetModuleName != nullptr) ? g_pfnGetModuleName() : nullptr;\n\n        // Process failure notification / adjustments\n        if (details::g_pfnNotifyFailure)\n        {\n            details::g_pfnNotifyFailure(failure);\n        }\n\n        // Completes filling out failure, notifies thread-based callbacks and the telemetry callback\n        if (details::g_pfnGetContextAndNotifyFailure)\n        {\n            details::g_pfnGetContextAndNotifyFailure(failure, callContextString, callContextStringSizeChars);\n        }\n\n        // Allow hooks to inspect the failure before acting upon it\n        if (details::g_pfnLoggingCallback)\n        {\n            details::g_pfnLoggingCallback(*failure);\n        }\n\n        // If the hook is enabled then it will be given the opportunity to call RoOriginateError to greatly improve the diagnostic experience\n        // for uncaught exceptions.  In cases where we will be throwing a C++/CX Platform::Exception we should avoid originating because the\n        // CX runtime will be doing that for us.  fWantDebugString is only set to true when the caller will be throwing a Platform::Exception.\n        if (details::g_pfnOriginateCallback && !fWantDebugString && WI_IsFlagClear(failure->flags, FailureFlags::RequestSuppressTelemetry))\n        {\n            details::g_pfnOriginateCallback(*failure);\n        }\n\n        if (SUCCEEDED(failure->hr))\n        {\n            // Caller bug: Leaking a success code into a failure-only function\n            FAIL_FAST_IMMEDIATE_IF(type != FailureType::FailFast);\n            failure->hr = E_UNEXPECTED;\n            failure->status = wil::details::HrToNtStatus(failure->hr);\n        }\n\n        bool const fUseOutputDebugString = IsDebuggerPresent() && g_fResultOutputDebugString &&\n                                           WI_IsFlagClear(failure->flags, FailureFlags::RequestSuppressTelemetry);\n\n        // We need to generate the logging message if:\n        // * We're logging to OutputDebugString\n        // * OR the caller asked us to (generally for attaching to a C++/CX exception)\n        if (fWantDebugString || fUseOutputDebugString)\n        {\n            // Call the logging callback (if present) to allow them to generate the debug string that will be pushed to the\n            // console or the platform exception object if the caller desires it.\n            if ((g_pfnResultLoggingCallback != nullptr) && !g_resultMessageCallbackSet)\n            {\n                g_pfnResultLoggingCallback(failure, debugString, debugStringSizeChars);\n            }\n\n            // The callback only optionally needs to supply the debug string -- if the callback didn't populate it, yet we still\n            // want it for OutputDebugString or exception message, then generate the default string.\n            if (debugString[0] == L'\\0')\n            {\n                GetFailureLogString(debugString, debugStringSizeChars, *failure);\n            }\n\n            if (fUseOutputDebugString)\n            {\n                ::OutputDebugStringW(debugString);\n            }\n        }\n        else\n        {\n            // [deprecated behavior]\n            // This callback was at one point *always* called for all failures, so we continue to call it for failures even when\n            // we don't need to generate the debug string information (when the callback was supplied directly).  We can avoid\n            // this if the caller used the explicit function (through g_resultMessageCallbackSet)\n            if ((g_pfnResultLoggingCallback != nullptr) && !g_resultMessageCallbackSet)\n            {\n                g_pfnResultLoggingCallback(failure, nullptr, 0);\n            }\n        }\n\n        if ((WI_IsFlagSet(failure->flags, FailureFlags::RequestDebugBreak) || g_fBreakOnFailure) && (g_pfnDebugBreak != nullptr))\n        {\n            g_pfnDebugBreak();\n        }\n    }\n\n    inline RESULT_NORETURN void __stdcall WilFailFast(const wil::FailureInfo& failure)\n    {\n        if (g_pfnWilFailFast)\n        {\n            g_pfnWilFailFast(failure);\n        }\n\n#ifdef RESULT_RAISE_FAST_FAIL_EXCEPTION\n        // Use of this macro is an ODR violation - use the callback instead.  This will be removed soon.\n        RESULT_RAISE_FAST_FAIL_EXCEPTION;\n#endif\n\n        // Before we fail fast in this method, give the [optional] RoFailFastWithErrorContext a try.\n        if (g_pfnFailfastWithContextCallback)\n        {\n            g_pfnFailfastWithContextCallback(failure);\n        }\n\n        // parameter 0 is the !analyze code (FAST_FAIL_FATAL_APP_EXIT)\n        EXCEPTION_RECORD er{};\n        er.NumberParameters = 1;                                            // default to be safe, see below\n        er.ExceptionCode = static_cast<DWORD>(STATUS_STACK_BUFFER_OVERRUN); // 0xC0000409\n        er.ExceptionFlags = EXCEPTION_NONCONTINUABLE;\n        er.ExceptionInformation[0] = FAST_FAIL_FATAL_APP_EXIT; // see winnt.h, generated from minkernel\\published\\base\\ntrtl_x.w\n        if (failure.returnAddress == nullptr) // FailureInfo does not have _ReturnAddress, have RaiseFailFastException generate it\n        {\n            // passing ExceptionCode 0xC0000409 and one param with FAST_FAIL_APP_EXIT will use existing\n            // !analyze functionality to crawl the stack looking for the HRESULT\n            // don't pass a 0 HRESULT in param 1 because that will result in worse bucketing.\n            WilRaiseFailFastException(&er, nullptr, FAIL_FAST_GENERATE_EXCEPTION_ADDRESS);\n        }\n        else // use FailureInfo caller address\n        {\n            // parameter 1 is the failing HRESULT\n            // parameter 2 is the line number.  This is never used for bucketing (due to code churn causing re-bucketing) but is available in the dump's\n            // exception record to aid in failure locality. Putting it here prevents it from being poisoned in triage dumps.\n            er.NumberParameters = 3;\n            er.ExceptionInformation[1] = failure.hr;\n            er.ExceptionInformation[2] = failure.uLineNumber;\n            er.ExceptionAddress = failure.returnAddress;\n            WilRaiseFailFastException(&er, nullptr, 0 /* do not generate exception address */);\n        }\n    }\n\n    template <FailureType T>\n    inline __declspec(noinline) void ReportFailure_Return(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options, FailureFlags flags)\n    {\n        bool needPlatformException =\n            ((T == FailureType::Exception) && WI_IsFlagClear(options, ReportFailureOptions::MayRethrow) &&\n             (g_pfnThrowPlatformException != nullptr) &&\n             (g_fResultThrowPlatformException || WI_IsFlagSet(options, ReportFailureOptions::ForcePlatformException)));\n\n        FailureInfo failure;\n        wchar_t debugString[2048];\n        char callContextString[1024];\n\n        LogFailure(\n            __R_FN_CALL_FULL,\n            T,\n            resultPair,\n            message,\n            needPlatformException,\n            debugString,\n            ARRAYSIZE(debugString),\n            callContextString,\n            ARRAYSIZE(callContextString),\n            flags,\n            &failure);\n\n        if (WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast))\n        {\n            WilFailFast(failure);\n        }\n    }\n\n    template <FailureType T, bool SuppressAction>\n    inline __declspec(noinline) void ReportFailure_Base(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options, FailureFlags flags)\n    {\n        ReportFailure_Return<T>(__R_FN_CALL_FULL, resultPair, message, options, flags);\n    }\n\n    template <FailureType T>\n    inline __declspec(noinline) RESULT_NORETURN void ReportFailure_NoReturn(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options)\n    {\n        bool needPlatformException =\n            ((T == FailureType::Exception) && WI_IsFlagClear(options, ReportFailureOptions::MayRethrow) &&\n             (g_pfnThrowPlatformException != nullptr) &&\n             (g_fResultThrowPlatformException || WI_IsFlagSet(options, ReportFailureOptions::ForcePlatformException)));\n\n        FailureInfo failure;\n        wchar_t debugString[2048];\n        char callContextString[1024];\n\n        LogFailure(\n            __R_FN_CALL_FULL,\n            T,\n            resultPair,\n            message,\n            needPlatformException,\n            debugString,\n            ARRAYSIZE(debugString),\n            callContextString,\n            ARRAYSIZE(callContextString),\n            FailureFlags::None,\n            &failure);\n        __WI_SUPPRESS_BREAKING_WARNINGS_S\n        if ((T == FailureType::FailFast) || WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast))\n        {\n            WilFailFast(const_cast<FailureInfo&>(failure));\n        }\n        else\n        {\n            if (needPlatformException)\n            {\n                g_pfnThrowPlatformException(failure, debugString);\n            }\n\n            if (WI_IsFlagSet(options, ReportFailureOptions::MayRethrow))\n            {\n                RethrowCaughtException();\n            }\n\n            ThrowResultException(failure);\n\n            // Wil was instructed to throw, but doesn't have any capability to do so (global function pointers are not setup)\n            WilFailFast(const_cast<FailureInfo&>(failure));\n        }\n        __WI_SUPPRESS_BREAKING_WARNINGS_E\n    }\n\n    template <>\n    inline __declspec(noinline) RESULT_NORETURN void ReportFailure_Base<FailureType::FailFast, false>(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options, FailureFlags)\n    {\n        ReportFailure_NoReturn<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, message, options);\n    }\n\n    template <>\n    inline __declspec(noinline) RESULT_NORETURN void ReportFailure_Base<FailureType::Exception, false>(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options, FailureFlags)\n    {\n        ReportFailure_NoReturn<FailureType::Exception>(__R_FN_CALL_FULL, resultPair, message, options);\n    }\n\n    __declspec(noinline) inline void ReportFailure(\n        __R_FN_PARAMS_FULL, FailureType type, const ResultStatus& resultPair, _In_opt_ PCWSTR message, ReportFailureOptions options)\n    {\n        switch (type)\n        {\n        case FailureType::Exception:\n            ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, resultPair, message, options);\n            break;\n        case FailureType::FailFast:\n            ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, message, options);\n            break;\n        case FailureType::Log:\n            ReportFailure_Base<FailureType::Log>(__R_FN_CALL_FULL, resultPair, message, options);\n            break;\n        case FailureType::Return:\n            ReportFailure_Base<FailureType::Return>(__R_FN_CALL_FULL, resultPair, message, options);\n            break;\n        }\n    }\n\n    template <FailureType T>\n    inline ResultStatus ReportFailure_CaughtExceptionCommon(\n        __R_FN_PARAMS_FULL,\n        _Inout_updates_(debugStringChars) PWSTR debugString,\n        _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars,\n        SupportedExceptions supported)\n    {\n        bool isNormalized = false;\n        auto length = wcslen(debugString);\n        WI_ASSERT(length < debugStringChars);\n        ResultStatus resultPair;\n        if (details::g_pfnResultFromCaughtExceptionInternal)\n        {\n            resultPair = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized);\n        }\n\n        const bool known = (FAILED(resultPair.hr));\n        if (!known)\n        {\n            resultPair = ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));\n        }\n\n        ReportFailureOptions options = ReportFailureOptions::ForcePlatformException;\n        WI_SetFlagIf(options, ReportFailureOptions::MayRethrow, isNormalized);\n\n        if ((supported == SupportedExceptions::None) || ((supported == SupportedExceptions::Known) && !known) ||\n            ((supported == SupportedExceptions::Thrown) && !isNormalized) ||\n            ((supported == SupportedExceptions::Default) && !known && g_fResultFailFastUnknownExceptions))\n        {\n            // By default WIL will issue a fail fast for unrecognized exception types.  Wil recognizes any std::exception or\n            // wil::ResultException based types and Platform::Exception^, so there aren't too many valid exception types which\n            // could cause this.  Those that are valid, should be handled by remapping the exception callback.  Those that are not\n            // valid should be found and fixed (meaningless accidents like 'throw hr;'). The caller may also be requesting\n            // non-default behavior to fail-fast more frequently (primarily for debugging unknown exceptions).\n            ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, debugString, options);\n        }\n        else\n        {\n            ReportFailure_Base<T>(__R_FN_CALL_FULL, resultPair, debugString, options);\n        }\n\n        return resultPair;\n    }\n\n    template <FailureType T>\n    inline ResultStatus RESULT_NORETURN ReportFailure_CaughtExceptionCommonNoReturnBase(\n        __R_FN_PARAMS_FULL,\n        _Inout_updates_(debugStringChars) PWSTR debugString,\n        _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars,\n        SupportedExceptions supported)\n    {\n        bool isNormalized = false;\n        const auto length = wcslen(debugString);\n        WI_ASSERT(length < debugStringChars);\n        ResultStatus resultPair;\n        if (details::g_pfnResultFromCaughtExceptionInternal)\n        {\n            resultPair = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized);\n        }\n\n        const bool known = (FAILED(resultPair.hr));\n        if (!known)\n        {\n            resultPair = ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));\n        }\n\n        ReportFailureOptions options = ReportFailureOptions::ForcePlatformException;\n        WI_SetFlagIf(options, ReportFailureOptions::MayRethrow, isNormalized);\n\n        if ((supported == SupportedExceptions::None) || ((supported == SupportedExceptions::Known) && !known) ||\n            ((supported == SupportedExceptions::Thrown) && !isNormalized) ||\n            ((supported == SupportedExceptions::Default) && !known && g_fResultFailFastUnknownExceptions))\n        {\n            // By default WIL will issue a fail fast for unrecognized exception types.  Wil recognizes any std::exception or\n            // wil::ResultException based types and Platform::Exception^, so there aren't too many valid exception types which\n            // could cause this.  Those that are valid, should be handled by remapping the exception callback.  Those that are not\n            // valid should be found and fixed (meaningless accidents like 'throw hr;'). The caller may also be requesting\n            // non-default behavior to fail-fast more frequently (primarily for debugging unknown exceptions).\n            ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, debugString, options);\n        }\n        else\n        {\n            ReportFailure_Base<T>(__R_FN_CALL_FULL, resultPair, debugString, options);\n        }\n\n        RESULT_NORETURN_RESULT(resultPair);\n    }\n\n    template <>\n    inline RESULT_NORETURN ResultStatus ReportFailure_CaughtExceptionCommon<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL,\n        _Inout_updates_(debugStringChars) PWSTR debugString,\n        _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars,\n        SupportedExceptions supported)\n    {\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommonNoReturnBase<FailureType::FailFast>(\n            __R_FN_CALL_FULL, debugString, debugStringChars, supported));\n    }\n\n    template <>\n    inline RESULT_NORETURN ResultStatus ReportFailure_CaughtExceptionCommon<FailureType::Exception>(\n        __R_FN_PARAMS_FULL,\n        _Inout_updates_(debugStringChars) PWSTR debugString,\n        _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars,\n        SupportedExceptions supported)\n    {\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommonNoReturnBase<FailureType::Exception>(\n            __R_FN_CALL_FULL, debugString, debugStringChars, supported));\n    }\n\n    template <FailureType T>\n    inline void ReportFailure_Msg(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        ReportFailure_Base<T>(__R_FN_CALL_FULL, resultPair, message);\n    }\n\n    template <>\n    inline RESULT_NORETURN void ReportFailure_Msg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, message);\n    }\n\n    template <>\n    inline RESULT_NORETURN void ReportFailure_Msg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, resultPair, message);\n    }\n\n    template <FailureType T>\n    inline void ReportFailure_ReplaceMsg(__R_FN_PARAMS_FULL, HRESULT hr, PCSTR formatString, ...)\n    {\n        va_list argList;\n        va_start(argList, formatString);\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr, FailureFlags flags)\n    {\n        ReportFailure_Base<T>(\n            __R_FN_CALL_FULL, ResultStatus::FromResult(hr), nullptr /*message*/, ReportFailureOptions::None /*options*/, flags);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN void ReportFailure_Hr<FailureType::FailFast>(__R_FN_PARAMS_FULL, HRESULT hr, FailureFlags)\n    {\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN void ReportFailure_Hr<FailureType::Exception>(__R_FN_PARAMS_FULL, HRESULT hr, FailureFlags)\n    {\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n    }\n\n    __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr)\n    {\n        switch (type)\n        {\n        case FailureType::Exception:\n            ReportFailure_Hr<FailureType::Exception>(__R_FN_CALL_FULL, hr);\n            break;\n        case FailureType::FailFast:\n            ReportFailure_Hr<FailureType::FailFast>(__R_FN_CALL_FULL, hr);\n            break;\n        case FailureType::Log:\n            ReportFailure_Hr<FailureType::Log>(__R_FN_CALL_FULL, hr);\n            break;\n        case FailureType::Return:\n            ReportFailure_Hr<FailureType::Return>(__R_FN_CALL_FULL, hr);\n            break;\n        }\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline HRESULT ReportFailure_Win32(__R_FN_PARAMS_FULL, DWORD err)\n    {\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        return hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32<FailureType::FailFast>(__R_FN_PARAMS_FULL, DWORD err)\n    {\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32<FailureType::Exception>(__R_FN_PARAMS_FULL, DWORD err)\n    {\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline DWORD ReportFailure_GetLastError(__R_FN_PARAMS_FULL)\n    {\n        const auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        ::SetLastError(err);\n        return err;\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN DWORD ReportFailure_GetLastError<FailureType::FailFast>(__R_FN_PARAMS_FULL)\n    {\n        const auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(err);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN DWORD ReportFailure_GetLastError<FailureType::Exception>(__R_FN_PARAMS_FULL)\n    {\n        const auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        const auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(err);\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline HRESULT ReportFailure_GetLastErrorHr(__R_FN_PARAMS_FULL)\n    {\n        const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Base<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        return hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHr<FailureType::FailFast>(__R_FN_PARAMS_FULL)\n    {\n        const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHr<FailureType::Exception>(__R_FN_PARAMS_FULL)\n    {\n        const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr));\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline HRESULT ReportFailure_NtStatus(__R_FN_PARAMS_FULL, NTSTATUS status)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Base<T>(__R_FN_CALL_FULL, resultPair);\n        return resultPair.hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatus<FailureType::FailFast>(__R_FN_PARAMS_FULL, NTSTATUS status)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair);\n        RESULT_NORETURN_RESULT(resultPair.hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatus<FailureType::Exception>(__R_FN_PARAMS_FULL, NTSTATUS status)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Base<FailureType::Exception>(__R_FN_CALL_FULL, resultPair);\n        RESULT_NORETURN_RESULT(resultPair.hr);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline HRESULT ReportFailure_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048]{};\n        return ReportFailure_CaughtExceptionCommon<T>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr;\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN HRESULT\n    ReportFailure_CaughtException<FailureType::FailFast>(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048]{};\n        RESULT_NORETURN_RESULT(\n            ReportFailure_CaughtExceptionCommon<FailureType::FailFast>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN HRESULT\n    ReportFailure_CaughtException<FailureType::Exception>(__R_FN_PARAMS_FULL, SupportedExceptions supported)\n    {\n        wchar_t message[2048]{};\n        RESULT_NORETURN_RESULT(\n            ReportFailure_CaughtExceptionCommon<FailureType::Exception>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline void ReportFailure_HrMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN void ReportFailure_HrMsg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        ReportFailure_Msg<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN void ReportFailure_HrMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        ReportFailure_Msg<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline HRESULT ReportFailure_Win32Msg(__R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        return hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32Msg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_Win32_to_HRESULT_(err)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32Msg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline DWORD ReportFailure_GetLastErrorMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        ::SetLastError(err);\n        return err;\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN DWORD\n    ReportFailure_GetLastErrorMsg<FailureType::FailFast>(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(err);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN DWORD ReportFailure_GetLastErrorMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto err = GetLastErrorFail(__R_FN_CALL_FULL);\n        auto hr = __HRESULT_FROM_WIN32(err);\n        ReportFailure_Msg<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(err);\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline HRESULT ReportFailure_GetLastErrorHrMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        return hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHrMsg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Msg<FailureType::FailFast>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_last_error_to_HRESULT_\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHrMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL);\n        ReportFailure_Msg<FailureType::Exception>(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList);\n        RESULT_NORETURN_RESULT(hr);\n    }\n\n    template <FailureType T>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline HRESULT ReportFailure_NtStatusMsg(\n        __R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Msg<T>(__R_FN_CALL_FULL, resultPair, formatString, argList);\n        return resultPair.hr;\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatusMsg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Msg<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, formatString, argList);\n        RESULT_NORETURN_RESULT(resultPair.hr);\n    }\n\n    template <>\n    _Success_(true)\n    _Translates_NTSTATUS_to_HRESULT_(status)\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatusMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        const auto resultPair = ResultStatus::FromStatus(status);\n        ReportFailure_Msg<FailureType::Exception>(__R_FN_CALL_FULL, resultPair, formatString, argList);\n        RESULT_NORETURN_RESULT(resultPair.hr);\n    }\n\n    template <FailureType T>\n    __declspec(noinline) inline HRESULT ReportFailure_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        return ReportFailure_CaughtExceptionCommon<T>(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).hr;\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_CaughtExceptionMsg<FailureType::FailFast>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon<FailureType::FailFast>(\n                                   __R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default)\n                                   .hr);\n    }\n\n    template <>\n    __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_CaughtExceptionMsg<FailureType::Exception>(\n        __R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList)\n    {\n        // Pre-populate the buffer with our message, the exception message will be added to it...\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n        StringCchCatW(message, ARRAYSIZE(message), L\" -- \");\n        RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon<FailureType::Exception>(\n                                   __R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default)\n                                   .hr);\n    }\n\n    //*****************************************************************************\n    // Support for throwing custom exception types\n    //*****************************************************************************\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n    inline HRESULT GetErrorCode(_In_ ResultException& exception) WI_NOEXCEPT\n    {\n        return exception.GetErrorCode();\n    }\n\n    inline void SetFailureInfo(_In_ FailureInfo const& failure, _Inout_ ResultException& exception) WI_NOEXCEPT\n    {\n        return exception.SetFailureInfo(failure);\n    }\n\n    // clang-format off\n#ifdef __cplusplus_winrt\n    inline HRESULT GetErrorCode(_In_ Platform::Exception^ exception) WI_NOEXCEPT\n    {\n        return exception->HResult;\n    }\n\n    inline void SetFailureInfo(_In_ FailureInfo const&, _Inout_ Platform::Exception^ exception) WI_NOEXCEPT\n    {\n        // no-op -- once a PlatformException^ is created, we can't modify the message, but this function must\n        // exist to distinguish this from ResultException\n    }\n#endif\n    // clang-format on\n\n    template <typename T>\n    RESULT_NORETURN inline void ReportFailure_CustomExceptionHelper(_Inout_ T& exception, __R_FN_PARAMS_FULL, _In_opt_ PCWSTR message = nullptr)\n    {\n        // When seeing the error: \"cannot convert parameter 1 from 'XXX' to 'wil::ResultException &'\"\n        // Custom exceptions must be based upon either ResultException or Platform::Exception^ to be used with ResultException.h.\n        // This compilation error indicates an attempt to throw an incompatible exception type.\n        const HRESULT hr = GetErrorCode(exception);\n\n        FailureInfo failure;\n        wchar_t debugString[2048];\n        char callContextString[1024];\n\n        LogFailure(\n            __R_FN_CALL_FULL,\n            FailureType::Exception,\n            ResultStatus::FromResult(hr),\n            message,\n            false, // false = does not need debug string\n            debugString,\n            ARRAYSIZE(debugString),\n            callContextString,\n            ARRAYSIZE(callContextString),\n            FailureFlags::None,\n            &failure);\n\n        if (WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast))\n        {\n            WilFailFast(failure);\n        }\n\n        // push the failure info context into the custom exception class\n        SetFailureInfo(failure, exception);\n\n        throw exception;\n    }\n\n    template <typename T>\n    __declspec(noinline) RESULT_NORETURN inline void ReportFailure_CustomException(__R_FN_PARAMS _In_ T exception)\n    {\n        __R_FN_LOCALS_RA;\n        ReportFailure_CustomExceptionHelper(exception, __R_FN_CALL_FULL);\n    }\n\n    template <typename T>\n    __declspec(noinline) RESULT_NORETURN inline void ReportFailure_CustomExceptionMsg(\n        __R_FN_PARAMS _In_ T exception, _In_ _Printf_format_string_ PCSTR formatString, ...)\n    {\n        va_list argList;\n        va_start(argList, formatString);\n        wchar_t message[2048];\n        PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList);\n\n        __R_FN_LOCALS_RA;\n        ReportFailure_CustomExceptionHelper(exception, __R_FN_CALL_FULL, message);\n    }\n#endif\n\n    namespace __R_NS_NAME\n    {\n        //*****************************************************************************\n        // Return Macros\n        //*****************************************************************************\n\n        __R_DIRECT_METHOD(void, Return_Hr)(__R_DIRECT_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Return>(__R_DIRECT_FN_CALL hr);\n        }\n\n        __R_DIRECT_METHOD(void, Return_HrSuppressTelemetry)(__R_DIRECT_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            const FailureFlags flags = FailureFlags::RequestSuppressTelemetry;\n            wil::details::ReportFailure_Hr<FailureType::Return>(__R_DIRECT_FN_CALL hr, flags);\n        }\n\n        _Success_(true)\n        _Translates_Win32_to_HRESULT_(err)\n        __R_DIRECT_METHOD(HRESULT, Return_Win32)(__R_DIRECT_FN_PARAMS DWORD err) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_Win32<FailureType::Return>(__R_DIRECT_FN_CALL err);\n        }\n\n        _Success_(true)\n        _Translates_last_error_to_HRESULT_\n        __R_DIRECT_METHOD(HRESULT, Return_GetLastError)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_GetLastErrorHr<FailureType::Return>(__R_DIRECT_FN_CALL_ONLY);\n        }\n\n        _Success_(true)\n        _Translates_NTSTATUS_to_HRESULT_(status)\n        __R_DIRECT_METHOD(HRESULT, Return_NtStatus)(__R_DIRECT_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_NtStatus<FailureType::Return>(__R_DIRECT_FN_CALL status);\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_METHOD(HRESULT, Return_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_CaughtException<FailureType::Return>(__R_DIRECT_FN_CALL_ONLY);\n        }\n#endif\n\n        __R_DIRECT_METHOD(void, Return_HrMsg)\n        (__R_DIRECT_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Return>(__R_DIRECT_FN_CALL hr, formatString, argList);\n        }\n\n        _Success_(true)\n        _Translates_Win32_to_HRESULT_(err)\n        __R_DIRECT_METHOD(HRESULT, Return_Win32Msg)\n        (__R_DIRECT_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_Win32Msg<FailureType::Return>(__R_DIRECT_FN_CALL err, formatString, argList);\n        }\n\n        _Success_(true)\n        _Translates_last_error_to_HRESULT_\n        __R_DIRECT_METHOD(HRESULT, Return_GetLastErrorMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_GetLastErrorHrMsg<FailureType::Return>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n\n        _Success_(true)\n        _Translates_NTSTATUS_to_HRESULT_(status)\n        __R_DIRECT_METHOD(HRESULT, Return_NtStatusMsg)\n        (__R_DIRECT_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_NtStatusMsg<FailureType::Return>(__R_DIRECT_FN_CALL status, formatString, argList);\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_METHOD(HRESULT, Return_CaughtExceptionMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_CaughtExceptionMsg<FailureType::Return>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n#endif\n\n        //*****************************************************************************\n        // Log Macros\n        //*****************************************************************************\n\n        _Post_satisfies_(return == hr) __R_DIRECT_METHOD(HRESULT, Log_Hr)(__R_DIRECT_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Log>(__R_DIRECT_FN_CALL hr);\n            return hr;\n        }\n\n        _Post_satisfies_(return == err) __R_DIRECT_METHOD(DWORD, Log_Win32)(__R_DIRECT_FN_PARAMS DWORD err) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::Log>(__R_DIRECT_FN_CALL err);\n            return err;\n        }\n\n        __R_DIRECT_METHOD(DWORD, Log_GetLastError)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_GetLastError<FailureType::Log>(__R_DIRECT_FN_CALL_ONLY);\n        }\n\n        _Post_satisfies_(return == status) __R_DIRECT_METHOD(NTSTATUS, Log_NtStatus)(__R_DIRECT_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::Log>(__R_DIRECT_FN_CALL status);\n            return status;\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_METHOD(HRESULT, Log_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_CaughtException<FailureType::Log>(__R_DIRECT_FN_CALL_ONLY);\n        }\n#endif\n\n        __R_INTERNAL_METHOD(_Log_Hr)(__R_INTERNAL_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Log>(__R_INTERNAL_FN_CALL hr);\n        }\n\n        __R_INTERNAL_METHOD(_Log_GetLastError)(__R_INTERNAL_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastError<FailureType::Log>(__R_INTERNAL_FN_CALL_ONLY);\n        }\n\n        __R_INTERNAL_METHOD(_Log_Win32)(__R_INTERNAL_FN_PARAMS DWORD err) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::Log>(__R_INTERNAL_FN_CALL err);\n        }\n\n        __R_INTERNAL_METHOD(_Log_NullAlloc)(__R_INTERNAL_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Log>(__R_INTERNAL_FN_CALL E_OUTOFMEMORY);\n        }\n\n        __R_INTERNAL_METHOD(_Log_NtStatus)(__R_INTERNAL_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::Log>(__R_INTERNAL_FN_CALL status);\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == hr) __R_CONDITIONAL_METHOD(HRESULT, Log_IfFailed)(__R_CONDITIONAL_FN_PARAMS HRESULT hr)\n        {\n            if (FAILED(hr))\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == hr) __R_CONDITIONAL_NOINLINE_METHOD(HRESULT, Log_IfFailedWithExpected)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, unsigned int expectedCount, ...) WI_NOEXCEPT\n        {\n            va_list args;\n            va_start(args, expectedCount);\n\n            if (FAILED(hr))\n            {\n                unsigned int expectedIndex;\n                for (expectedIndex = 0; expectedIndex < expectedCount; ++expectedIndex)\n                {\n                    if (hr == va_arg(args, HRESULT))\n                    {\n                        break;\n                    }\n                }\n\n                if (expectedIndex == expectedCount)\n                {\n                    __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n                }\n            }\n\n            va_end(args);\n            return hr;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == ret) __R_CONDITIONAL_METHOD(BOOL, Log_IfWin32BoolFalse)(__R_CONDITIONAL_FN_PARAMS BOOL ret)\n        {\n            if (!ret)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return ret;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == err) __R_CONDITIONAL_METHOD(DWORD, Log_IfWin32Error)(__R_CONDITIONAL_FN_PARAMS DWORD err)\n        {\n            if (FAILED_WIN32(err))\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Win32)(__R_CONDITIONAL_FN_CALL err);\n            }\n            return err;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == handle) __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleInvalid)(__R_CONDITIONAL_FN_PARAMS HANDLE handle)\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == handle) __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleNull)(__R_CONDITIONAL_FN_PARAMS HANDLE handle)\n        {\n            if (handle == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer)\n            __R_CONDITIONAL_TEMPLATE_METHOD(PointerT, Log_IfNullAlloc)(__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_NullAlloc)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Log_IfNullAlloc)(__R_CONDITIONAL_FN_PARAMS const PointerT& pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_NullAlloc)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_METHOD(bool, Log_HrIf)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition)\n        {\n            if (condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == condition)\n            __R_CONDITIONAL_METHOD(bool, Log_HrIfFalse)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition)\n        {\n            if (!condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer)\n            __R_CONDITIONAL_TEMPLATE_METHOD(PointerT, Log_HrIfNull)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Log_HrIfNull)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIf)(__R_CONDITIONAL_FN_PARAMS bool condition)\n        {\n            if (condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == condition)\n            __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIfFalse)(__R_CONDITIONAL_FN_PARAMS bool condition)\n        {\n            if (!condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer)\n            __R_CONDITIONAL_TEMPLATE_METHOD(PointerT, Log_GetLastErrorIfNull)(__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Log_GetLastErrorIfNull)(__R_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == status)\n            __R_CONDITIONAL_METHOD(NTSTATUS, Log_IfNtStatusFailed)(__R_CONDITIONAL_FN_PARAMS NTSTATUS status)\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                __R_CALL_INTERNAL_METHOD(_Log_NtStatus)(__R_CONDITIONAL_FN_CALL status);\n            }\n            return status;\n        }\n\n        _Post_satisfies_(return == hr)\n            __R_DIRECT_METHOD(HRESULT, Log_HrMsg)(__R_DIRECT_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Log>(__R_DIRECT_FN_CALL hr, formatString, argList);\n            return hr;\n        }\n\n        _Post_satisfies_(return == err)\n            __R_DIRECT_METHOD(DWORD, Log_Win32Msg)(__R_DIRECT_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::Log>(__R_DIRECT_FN_CALL err, formatString, argList);\n            return err;\n        }\n\n        __R_DIRECT_METHOD(DWORD, Log_GetLastErrorMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_GetLastErrorMsg<FailureType::Log>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n\n        _Post_satisfies_(return == status) __R_DIRECT_METHOD(NTSTATUS, Log_NtStatusMsg)(\n            __R_DIRECT_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::Log>(__R_DIRECT_FN_CALL status, formatString, argList);\n            return status;\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_METHOD(HRESULT, Log_CaughtExceptionMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            return wil::details::ReportFailure_CaughtExceptionMsg<FailureType::Log>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n#endif\n\n        __R_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Log>(__R_INTERNAL_NOINLINE_FN_CALL hr, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastErrorMsg<FailureType::Log>(__R_INTERNAL_NOINLINE_FN_CALL formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_METHOD(_Log_Win32Msg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::Log>(__R_INTERNAL_NOINLINE_FN_CALL err, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_METHOD(_Log_NullAllocMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Log>(__R_INTERNAL_NOINLINE_FN_CALL E_OUTOFMEMORY, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_METHOD(_Log_NtStatusMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::Log>(__R_INTERNAL_NOINLINE_FN_CALL status, formatString, argList);\n        }\n\n        _Post_satisfies_(return == hr) __R_CONDITIONAL_NOINLINE_METHOD(HRESULT, Log_IfFailedMsg)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED(hr))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == ret) __R_CONDITIONAL_NOINLINE_METHOD(BOOL, Log_IfWin32BoolFalseMsg)(\n            __R_CONDITIONAL_FN_PARAMS BOOL ret, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!ret)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return ret;\n        }\n\n        _Post_satisfies_(return == err) __R_CONDITIONAL_NOINLINE_METHOD(DWORD, Log_IfWin32ErrorMsg)(\n            __R_CONDITIONAL_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED_WIN32(err))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_Win32Msg)(__R_CONDITIONAL_NOINLINE_FN_CALL err, formatString, argList);\n            }\n            return err;\n        }\n\n        _Post_satisfies_(return == handle) __R_CONDITIONAL_NOINLINE_METHOD(HANDLE, Log_IfHandleInvalidMsg)(\n            __R_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        _Post_satisfies_(return == handle) __R_CONDITIONAL_NOINLINE_METHOD(HANDLE, Log_IfHandleNullMsg)(\n            __R_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (handle == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(PointerT, Log_IfNullAllocMsg)(\n            __R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_NullAllocMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Log_IfNullAllocMsg)(\n            __R_CONDITIONAL_FN_PARAMS const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_NullAllocMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_NOINLINE_METHOD(bool, Log_HrIfMsg)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_NOINLINE_METHOD(bool, Log_HrIfFalseMsg)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(PointerT, Log_HrIfNullMsg)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Log_HrIfNullMsg)(\n            __R_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_NOINLINE_METHOD(bool, Log_GetLastErrorIfMsg)(\n            __R_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) __R_CONDITIONAL_NOINLINE_METHOD(bool, Log_GetLastErrorIfFalseMsg)(\n            __R_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(PointerT, Log_GetLastErrorIfNullMsg)(\n            __R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Log_GetLastErrorIfNullMsg)(\n            __R_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == status) __R_CONDITIONAL_NOINLINE_METHOD(NTSTATUS, Log_IfNtStatusFailedMsg)(\n            __R_CONDITIONAL_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Log_NtStatusMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL status, formatString, argList);\n            }\n            return status;\n        }\n    } // namespace __R_NS_NAME\n\n    namespace __RFF_NS_NAME\n    {\n        //*****************************************************************************\n        // FailFast Macros\n        //*****************************************************************************\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_Hr)(__RFF_DIRECT_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::FailFast>(__RFF_DIRECT_FN_CALL hr);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_Win32)(__RFF_DIRECT_FN_PARAMS DWORD err) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::FailFast>(__RFF_DIRECT_FN_CALL err);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_GetLastError)(__RFF_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_GetLastError<FailureType::FailFast>(__RFF_DIRECT_FN_CALL_ONLY);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_NtStatus)(__RFF_DIRECT_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::FailFast>(__RFF_DIRECT_FN_CALL status);\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_CaughtException)(__RFF_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_CaughtException<FailureType::FailFast>(__RFF_DIRECT_FN_CALL_ONLY);\n        }\n#endif\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_Hr)(__RFF_INTERNAL_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL hr);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_GetLastError)(__RFF_INTERNAL_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_GetLastError<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL_ONLY);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_Win32)(__RFF_INTERNAL_FN_PARAMS DWORD err) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL err);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_NullAlloc)(__RFF_INTERNAL_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL E_OUTOFMEMORY);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_NtStatus)(__RFF_INTERNAL_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL status);\n        }\n\n        _Post_satisfies_(return == hr) _When_(FAILED(hr), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(HRESULT, FailFast_IfFailed)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr) WI_NOEXCEPT\n        {\n            if (FAILED(hr))\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Hr)(__RFF_CONDITIONAL_FN_CALL hr);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == ret) _When_(!ret, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(BOOL, FailFast_IfWin32BoolFalse)(__RFF_CONDITIONAL_FN_PARAMS BOOL ret) WI_NOEXCEPT\n        {\n            if (!ret)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return ret;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        _Post_satisfies_(return == err) _When_(FAILED_WIN32(err), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(DWORD, FailFast_IfWin32Error)(__RFF_CONDITIONAL_FN_PARAMS DWORD err)\n        {\n            if (FAILED_WIN32(err))\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Win32)(__RFF_CONDITIONAL_FN_CALL err);\n            }\n            return err;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == INVALID_HANDLE_VALUE, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(HANDLE, FailFast_IfHandleInvalid)(__RFF_CONDITIONAL_FN_PARAMS HANDLE handle) WI_NOEXCEPT\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(RESULT_NORETURN_NULL HANDLE, FailFast_IfHandleNull)\n        (__RFF_CONDITIONAL_FN_PARAMS HANDLE handle) WI_NOEXCEPT\n        {\n            if (handle == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNullAlloc)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_NullAlloc)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNullAlloc)(__RFF_CONDITIONAL_FN_PARAMS const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_NullAlloc)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_HrIf)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Hr)(__RFF_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_HrIfFalse)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Hr)(__RFF_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_HrIfNull)\n        (__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Hr)(__RFF_CONDITIONAL_FN_CALL hr);\n            }\n            return pointer;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_HrIfNull)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Hr)(__RFF_CONDITIONAL_FN_CALL hr);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_GetLastErrorIf)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_GetLastErrorIfFalse)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_GetLastErrorIfNull)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_GetLastErrorIfNull)(__RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_GetLastError)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        _Post_satisfies_(return == status) _When_(FAILED_NTSTATUS(status), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(NTSTATUS, FailFast_IfNtStatusFailed)(__RFF_CONDITIONAL_FN_PARAMS NTSTATUS status) WI_NOEXCEPT\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_NtStatus)(__RFF_CONDITIONAL_FN_CALL status);\n            }\n            return status;\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_HrMsg)\n        (__RFF_DIRECT_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL hr, formatString, argList);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_Win32Msg)\n        (__RFF_DIRECT_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL err, formatString, argList);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_GetLastErrorMsg)\n        (__RFF_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_GetLastErrorMsg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL formatString, argList);\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_NtStatusMsg)\n        (__RFF_DIRECT_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL status, formatString, argList);\n        }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_CaughtExceptionMsg)\n        (__RFF_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_CaughtExceptionMsg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL formatString, argList);\n        }\n#endif\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_HrMsg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL hr, formatString, argList);\n        }\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_GetLastErrorMsg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_GetLastErrorMsg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL formatString, argList);\n        }\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_Win32Msg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL err, formatString, argList);\n        }\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_NullAllocMsg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL E_OUTOFMEMORY, formatString, argList);\n        }\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_NtStatusMsg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL status, formatString, argList);\n        }\n\n        _Post_satisfies_(return == hr) _When_(FAILED(hr), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(HRESULT, FailFast_IfFailedMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED(hr))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_HrMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == ret) _When_(!ret, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(BOOL, FailFast_IfWin32BoolFalseMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS BOOL ret, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!ret)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return ret;\n        }\n\n        _Post_satisfies_(return == err) _When_(FAILED_WIN32(err), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(DWORD, FailFast_IfWin32ErrorMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED_WIN32(err))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_Win32Msg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL err, formatString, argList);\n            }\n            return err;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == INVALID_HANDLE_VALUE, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(HANDLE, FailFast_IfHandleInvalidMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(RESULT_NORETURN_NULL HANDLE, FailFast_IfHandleNullMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (handle == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNullAllocMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_NullAllocMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, FailFast_IfNullAllocMsg)(\n            __RFF_CONDITIONAL_FN_PARAMS const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_NullAllocMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_HrIfMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_HrMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_HrIfFalseMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_HrMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_HrIfNullMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_HrMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, FailFast_HrIfNullMsg)(\n            __RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_HrMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_GetLastErrorIfMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_GetLastErrorIfFalseMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_GetLastErrorIfNullMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, FailFast_GetLastErrorIfNullMsg)(\n            __RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_GetLastErrorMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == status) _When_(FAILED_NTSTATUS(status), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(NTSTATUS, FailFast_IfNtStatusFailedMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_NtStatusMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL status, formatString, argList);\n            }\n            return status;\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_Unexpected)(__RFF_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::FailFast>(__RFF_DIRECT_FN_CALL E_UNEXPECTED);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFast_Unexpected)(__RFF_INTERNAL_FN_PARAMS_ONLY) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::FailFast>(__RFF_INTERNAL_FN_CALL E_UNEXPECTED);\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_If)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Unexpected)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFast_IfFalse)(__RFF_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Unexpected)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNull)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Unexpected)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNull)(\n            __RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFast_Unexpected)(__RFF_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFast_UnexpectedMsg)\n        (__RFF_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::FailFast>(__RFF_DIRECT_FN_CALL E_UNEXPECTED, formatString, argList);\n        }\n\n        __RFF_INTERNAL_NOINLINE_NORET_METHOD(_FailFast_UnexpectedMsg)\n        (__RFF_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT\n        {\n            __RFF_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::FailFast>(__RFF_INTERNAL_NOINLINE_FN_CALL E_UNEXPECTED, formatString, argList);\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_IfMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_UnexpectedMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_METHOD(bool, FailFast_IfFalseMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_UnexpectedMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNullMsg)\n        (__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_UnexpectedMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, FailFast_IfNullMsg)(\n            __RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __RFF_CALL_INTERNAL_NOINLINE_METHOD(_FailFast_UnexpectedMsg)\n                (__RFF_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n        }\n\n        //*****************************************************************************\n        // FailFast Immediate Macros\n        //*****************************************************************************\n\n        __RFF_DIRECT_NORET_METHOD(void, FailFastImmediate_Unexpected)() WI_NOEXCEPT\n        {\n            __fastfail(FAST_FAIL_FATAL_APP_EXIT);\n        }\n\n        __RFF_INTERNAL_NORET_METHOD(_FailFastImmediate_Unexpected)() WI_NOEXCEPT\n        {\n            __fastfail(FAST_FAIL_FATAL_APP_EXIT);\n        }\n\n        _Post_satisfies_(return == hr) _When_(FAILED(hr), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(HRESULT, FailFastImmediate_IfFailed)(HRESULT hr) WI_NOEXCEPT\n        {\n            if (FAILED(hr))\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFastImmediate_If)(bool condition) WI_NOEXCEPT\n        {\n            if (condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(bool, FailFastImmediate_IfFalse)(bool condition) WI_NOEXCEPT\n        {\n            if (!condition)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n            return condition;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFastImmediate_IfNull)\n        (_Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n            return pointer;\n        }\n\n        // Should be decorated WI_NOEXCEPT, but conflicts with forceinline.\n        template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFastImmediate_IfNull)(_In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n        }\n\n        _Post_satisfies_(return == status) _When_(FAILED_NTSTATUS(status), _Analysis_noreturn_)\n        __RFF_CONDITIONAL_METHOD(NTSTATUS, FailFastImmediate_IfNtStatusFailed)(NTSTATUS status) WI_NOEXCEPT\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                __RFF_CALL_INTERNAL_METHOD(_FailFastImmediate_Unexpected)();\n            }\n            return status;\n        }\n    } // namespace __RFF_NS_NAME\n\n    namespace __R_NS_NAME\n    {\n        //*****************************************************************************\n        // Exception Macros\n        //*****************************************************************************\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n        __R_DIRECT_NORET_METHOD(void, Throw_Hr)(__R_DIRECT_FN_PARAMS HRESULT hr)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Exception>(__R_DIRECT_FN_CALL hr);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_Win32)(__R_DIRECT_FN_PARAMS DWORD err)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::Exception>(__R_DIRECT_FN_CALL err);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_GetLastError)(__R_DIRECT_FN_PARAMS_ONLY)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastError<FailureType::Exception>(__R_DIRECT_FN_CALL_ONLY);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_NtStatus)(__R_DIRECT_FN_PARAMS NTSTATUS status)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::Exception>(__R_DIRECT_FN_CALL status);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_CaughtException<FailureType::Exception>(__R_DIRECT_FN_CALL_ONLY);\n        }\n\n        __R_INTERNAL_NORET_METHOD(_Throw_Hr)(__R_INTERNAL_FN_PARAMS HRESULT hr)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Exception>(__R_INTERNAL_FN_CALL hr);\n        }\n\n        __R_INTERNAL_NORET_METHOD(_Throw_GetLastError)(__R_INTERNAL_FN_PARAMS_ONLY)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastError<FailureType::Exception>(__R_INTERNAL_FN_CALL_ONLY);\n        }\n\n        __R_INTERNAL_NORET_METHOD(_Throw_Win32)(__R_INTERNAL_FN_PARAMS DWORD err)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32<FailureType::Exception>(__R_INTERNAL_FN_CALL err);\n        }\n\n        __R_INTERNAL_NORET_METHOD(_Throw_NullAlloc)(__R_INTERNAL_FN_PARAMS_ONLY)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Hr<FailureType::Exception>(__R_INTERNAL_FN_CALL E_OUTOFMEMORY);\n        }\n\n        __R_INTERNAL_NORET_METHOD(_Throw_NtStatus)(__R_INTERNAL_FN_PARAMS NTSTATUS status)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatus<FailureType::Exception>(__R_INTERNAL_FN_CALL status);\n        }\n\n        _Post_satisfies_(return == hr) _When_(FAILED(hr), _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(HRESULT, Throw_IfFailed)(__R_CONDITIONAL_FN_PARAMS HRESULT hr)\n        {\n            if (FAILED(hr))\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == ret) _When_(!ret, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(BOOL, Throw_IfWin32BoolFalse)(__R_CONDITIONAL_FN_PARAMS BOOL ret)\n        {\n            if (!ret)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return ret;\n        }\n\n        _Post_satisfies_(return == err) _When_(FAILED_WIN32(err), _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(DWORD, Throw_IfWin32Error)(__R_CONDITIONAL_FN_PARAMS DWORD err)\n        {\n            if (FAILED_WIN32(err))\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Win32)(__R_CONDITIONAL_FN_CALL err);\n            }\n            return err;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == INVALID_HANDLE_VALUE, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(HANDLE, Throw_IfHandleInvalid)(__R_CONDITIONAL_FN_PARAMS HANDLE handle)\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(RESULT_NORETURN_NULL HANDLE, Throw_IfHandleNull)(__R_CONDITIONAL_FN_PARAMS HANDLE handle)\n        {\n            if (handle == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return handle;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_IfNullAlloc)\n        (__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_NullAlloc)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Throw_IfNullAlloc)(__R_CONDITIONAL_FN_PARAMS const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_NullAlloc)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(bool, Throw_HrIf)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition)\n        {\n            if (condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(bool, Throw_HrIfFalse)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition)\n        {\n            if (!condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_HrIfNull)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Throw_HrIfNull)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Hr)(__R_CONDITIONAL_FN_CALL hr);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(bool, Throw_Win32If)(__R_CONDITIONAL_FN_PARAMS DWORD err, bool condition)\n        {\n            if (condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_Win32)(__R_CONDITIONAL_FN_CALL err);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(bool, Throw_GetLastErrorIf)(__R_CONDITIONAL_FN_PARAMS bool condition)\n        {\n            if (condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(bool, Throw_GetLastErrorIfFalse)(__R_CONDITIONAL_FN_PARAMS bool condition)\n        {\n            if (!condition)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_GetLastErrorIfNull)\n        (__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __R_CONDITIONAL_TEMPLATE_METHOD(void, Throw_GetLastErrorIfNull)(__R_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer)\n        {\n            if (pointer == nullptr)\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_GetLastError)(__R_CONDITIONAL_FN_CALL_ONLY);\n            }\n        }\n\n        _Post_satisfies_(return == status) _When_(FAILED_NTSTATUS(status), _Analysis_noreturn_)\n        __R_CONDITIONAL_METHOD(NTSTATUS, Throw_IfNtStatusFailed)(__R_CONDITIONAL_FN_PARAMS NTSTATUS status)\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                __R_CALL_INTERNAL_METHOD(_Throw_NtStatus)(__R_CONDITIONAL_FN_CALL status);\n            }\n            return status;\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_HrMsg)\n        (__R_DIRECT_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Exception>(__R_DIRECT_FN_CALL hr, formatString, argList);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_Win32Msg)\n        (__R_DIRECT_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::Exception>(__R_DIRECT_FN_CALL err, formatString, argList);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_GetLastErrorMsg)(__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...)\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastErrorMsg<FailureType::Exception>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_NtStatusMsg)\n        (__R_DIRECT_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::Exception>(__R_DIRECT_FN_CALL status, formatString, argList);\n        }\n\n        __R_DIRECT_NORET_METHOD(void, Throw_CaughtExceptionMsg)\n        (__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...)\n        {\n            va_list argList;\n            va_start(argList, formatString);\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_CaughtExceptionMsg<FailureType::Exception>(__R_DIRECT_FN_CALL formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_NORET_METHOD(_Throw_HrMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Exception>(__R_INTERNAL_NOINLINE_FN_CALL hr, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_NORET_METHOD(_Throw_GetLastErrorMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_GetLastErrorMsg<FailureType::Exception>(__R_INTERNAL_NOINLINE_FN_CALL formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_NORET_METHOD(_Throw_Win32Msg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_Win32Msg<FailureType::Exception>(__R_INTERNAL_NOINLINE_FN_CALL err, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_NORET_METHOD(_Throw_NullAllocMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS _Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_HrMsg<FailureType::Exception>(__R_INTERNAL_NOINLINE_FN_CALL E_OUTOFMEMORY, formatString, argList);\n        }\n\n        __R_INTERNAL_NOINLINE_NORET_METHOD(_Throw_NtStatusMsg)\n        (__R_INTERNAL_NOINLINE_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList)\n        {\n            __R_FN_LOCALS;\n            wil::details::ReportFailure_NtStatusMsg<FailureType::Exception>(__R_INTERNAL_NOINLINE_FN_CALL status, formatString, argList);\n        }\n\n        _Post_satisfies_(return == hr) _When_(FAILED(hr), _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(HRESULT, Throw_IfFailedMsg)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (FAILED(hr))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return hr;\n        }\n\n        _Post_satisfies_(return == ret) _When_(!ret, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(BOOL, Throw_IfWin32BoolFalseMsg)\n        (__R_CONDITIONAL_FN_PARAMS BOOL ret, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (!ret)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return ret;\n        }\n\n        _Post_satisfies_(return == err) _When_(FAILED_WIN32(err), _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(DWORD, Throw_IfWin32ErrorMsg)\n        (__R_CONDITIONAL_FN_PARAMS DWORD err, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (FAILED_WIN32(err))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_Win32Msg)(__R_CONDITIONAL_NOINLINE_FN_CALL err, formatString, argList);\n            }\n            return err;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == INVALID_HANDLE_VALUE, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(HANDLE, Throw_IfHandleInvalidMsg)\n        (__R_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (handle == INVALID_HANDLE_VALUE)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        _Post_satisfies_(return == handle) _When_(handle == 0, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(RESULT_NORETURN_NULL HANDLE, Throw_IfHandleNullMsg)\n        (__R_CONDITIONAL_FN_PARAMS HANDLE handle, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (handle == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return handle;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_IfNullAllocMsg)\n        (__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_NullAllocMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Throw_IfNullAllocMsg)\n        (__R_CONDITIONAL_FN_PARAMS const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_NullAllocMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL_ONLY, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_HrIfMsg)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_HrIfFalseMsg)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_HrIfNullMsg)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Throw_HrIfNullMsg)\n        (__R_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_HrMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL hr, formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_Win32IfMsg)\n        (__R_CONDITIONAL_FN_PARAMS DWORD err, bool condition, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_Win32Msg)(__R_CONDITIONAL_NOINLINE_FN_CALL err, formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_GetLastErrorIfMsg)\n        (__R_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        _Post_satisfies_(return == condition) _When_(!condition, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_GetLastErrorIfFalseMsg)\n        (__R_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (!condition)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return condition;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)>\n        _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, Throw_GetLastErrorIfNullMsg)\n        (__R_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n            return pointer;\n        }\n\n        template <__R_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)>\n        __WI_SUPPRESS_NULLPTR_ANALYSIS _When_(pointer == nullptr, _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_TEMPLATE_METHOD(void, Throw_GetLastErrorIfNullMsg)\n        (__R_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (pointer == nullptr)\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_GetLastErrorMsg)(__R_CONDITIONAL_NOINLINE_FN_CALL formatString, argList);\n            }\n        }\n\n        _Post_satisfies_(return == status) _When_(FAILED_NTSTATUS(status), _Analysis_noreturn_)\n        __R_CONDITIONAL_NOINLINE_METHOD(NTSTATUS, Throw_IfNtStatusFailedMsg)\n        (__R_CONDITIONAL_FN_PARAMS NTSTATUS status, _Printf_format_string_ PCSTR formatString, ...)\n        {\n            if (FAILED_NTSTATUS(status))\n            {\n                va_list argList;\n                va_start(argList, formatString);\n                __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_NtStatusMsg)\n                (__R_CONDITIONAL_NOINLINE_FN_CALL status, formatString, argList);\n            }\n            return status;\n        }\n#endif // WIL_ENABLE_EXCEPTIONS\n\n    } // namespace __R_NS_NAME\n} // namespace details\n/// @endcond\n\n//*****************************************************************************\n// Error Handling Policies to switch between error-handling style\n//*****************************************************************************\n// The following policies are used as template policies for components that can support exception, fail-fast, and\n// error-code based modes.\n\n// Use for classes which should return HRESULTs as their error-handling policy\n// Intentionally removed logging from this policy as logging is more useful at the caller.\nstruct err_returncode_policy\n{\n    using result = HRESULT;\n\n    __forceinline static HRESULT Win32BOOL(BOOL fReturn)\n    {\n        RETURN_IF_WIN32_BOOL_FALSE_EXPECTED(fReturn);\n        return S_OK;\n    }\n    __forceinline static HRESULT Win32Handle(HANDLE h, _Out_ HANDLE* ph)\n    {\n        *ph = h;\n        RETURN_LAST_ERROR_IF_NULL_EXPECTED(h);\n        return S_OK;\n    }\n    _Post_satisfies_(return == hr) __forceinline static HRESULT HResult(HRESULT hr)\n    {\n        return hr;\n    }\n    __forceinline static HRESULT LastError()\n    {\n        return wil::details::GetLastErrorFailHr();\n    }\n    __forceinline static HRESULT LastErrorIfFalse(bool condition)\n    {\n        RETURN_LAST_ERROR_IF_EXPECTED(!condition);\n        return S_OK;\n    }\n    _Post_satisfies_(return == S_OK) __forceinline static HRESULT OK()\n    {\n        return S_OK;\n    }\n};\n\n// Use for classes which fail-fast on errors\nstruct err_failfast_policy\n{\n    typedef _Return_type_success_(true) void result;\n    __forceinline static result Win32BOOL(BOOL fReturn)\n    {\n        FAIL_FAST_IF_WIN32_BOOL_FALSE(fReturn);\n    }\n    __forceinline static result Win32Handle(HANDLE h, _Out_ HANDLE* ph)\n    {\n        *ph = h;\n        FAIL_FAST_LAST_ERROR_IF_NULL(h);\n    }\n    _When_(FAILED(hr), _Analysis_noreturn_)\n    __forceinline static result HResult(HRESULT hr)\n    {\n        FAIL_FAST_IF_FAILED(hr);\n    }\n    __forceinline static result LastError()\n    {\n        FAIL_FAST_LAST_ERROR();\n    }\n    __forceinline static result LastErrorIfFalse(bool condition)\n    {\n        if (!condition)\n        {\n            FAIL_FAST_LAST_ERROR();\n        }\n    }\n    __forceinline static result OK()\n    {\n    }\n};\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n// Use for classes which should return through exceptions as their error-handling policy\nstruct err_exception_policy\n{\n    typedef _Return_type_success_(true) void result;\n    __forceinline static result Win32BOOL(BOOL fReturn)\n    {\n        THROW_IF_WIN32_BOOL_FALSE(fReturn);\n    }\n    __forceinline static result Win32Handle(HANDLE h, _Out_ HANDLE* ph)\n    {\n        *ph = h;\n        THROW_LAST_ERROR_IF_NULL(h);\n    }\n    _When_(FAILED(hr), _Analysis_noreturn_)\n    __forceinline static result HResult(HRESULT hr)\n    {\n        THROW_IF_FAILED(hr);\n    }\n    __forceinline static result LastError()\n    {\n        THROW_LAST_ERROR();\n    }\n    __forceinline static result LastErrorIfFalse(bool condition)\n    {\n        if (!condition)\n        {\n            THROW_LAST_ERROR();\n        }\n    }\n    __forceinline static result OK()\n    {\n    }\n};\n#else\n// NOTE: A lot of types use 'err_exception_policy' as a default template argument and therefore it must be defined\n// (MSVC is permissive about this, but other compilers are not). This will still cause compilation errors at\n// template instantiation time since this type lacks required member functions. An alternative would be to have some\n// 'default_err_policy' alias that would be something like 'err_failfast_policy' when exceptions are not available,\n// but that may have unexpected side effects when compiling code that expects to be using exceptions\nstruct err_exception_policy\n{\n};\n#endif\n\n} // namespace wil\n\n#pragma warning(pop)\n\n#endif // defined(__cplusplus) && !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE)\n#endif // __WIL_RESULTMACROS_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/result_originate.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: supporting file enabling the originating of errors to produce better crash dumps\n\n// Note: When origination is enabled by including this file, origination is done as part of the RETURN_* and THROW_* macros.\n// Before originating a new error we will observe whether there is already an error payload associated with the current thread. If\n// there is, and the HRESULTs match, then a new error will not be originated.  Otherwise we will overwrite it with a new\n// origination.  The ABI boundary for WinRT APIs will check the per-thread error information.  The act of checking the error\n// clears it, so there should be minimal risk of failing to originate distinct errors simply because the HRESULTs match.\n//\n// For THROW_ macros we will examine the thread-local error storage once per throw.  So typically once, with additional calls if\n// the exception is caught and re-thrown.\n//\n// For RETURN_ macros we will have to examine the thread-local error storage once per frame as the call stack unwinds.  Because\n// error conditions -should- be uncommon the performance impact of checking TLS should be minimal.  The more expensive part is\n// originating the error because it must capture the entire stack and some additional data.\n\n#ifndef __WIL_RESULT_ORIGINATE_INCLUDED\n#define __WIL_RESULT_ORIGINATE_INCLUDED\n\n#include \"result.h\"\n#include <OleAuto.h> // RestrictedErrorInfo uses BSTRs :(\n#include <winstring.h>\n#include \"resource.h\"\n#include \"com.h\"\n#include <roerrorapi.h>\n\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    // Note: The name must begin with \"Raise\" so that the !analyze auto-bucketing will ignore this stack frame.  Otherwise this line of code gets all the blame.\n    inline void __stdcall RaiseRoOriginateOnWilExceptions(wil::FailureInfo const& failure) WI_NOEXCEPT\n    {\n        if ((failure.type == FailureType::Return) || (failure.type == FailureType::Exception))\n        {\n            bool shouldOriginate = true;\n\n            wil::com_ptr_nothrow<IRestrictedErrorInfo> restrictedErrorInformation;\n            if (GetRestrictedErrorInfo(&restrictedErrorInformation) == S_OK)\n            {\n                // This thread already has an error origination payload.  Don't originate again if it has the same HRESULT that we\n                // are observing right now.\n                wil::unique_bstr descriptionUnused;\n                HRESULT existingHr = failure.hr;\n                wil::unique_bstr restrictedDescriptionUnused;\n                wil::unique_bstr capabilitySidUnused;\n                if (SUCCEEDED(restrictedErrorInformation->GetErrorDetails(\n                        &descriptionUnused, &existingHr, &restrictedDescriptionUnused, &capabilitySidUnused)))\n                {\n                    shouldOriginate = (failure.hr != existingHr);\n                }\n            }\n\n            if (shouldOriginate)\n            {\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n                wil::unique_hmodule errorModule;\n                if (GetModuleHandleExW(0, L\"api-ms-win-core-winrt-error-l1-1-1.dll\", &errorModule))\n                {\n                    auto pfn = details::GetProcAddress<decltype(&::RoOriginateErrorW)>(errorModule.get(), \"RoOriginateErrorW\");\n                    if (pfn != nullptr)\n                    {\n                        pfn(failure.hr, 0, failure.pszMessage);\n                    }\n                }\n#else  // DESKTOP | SYSTEM\n                ::RoOriginateErrorW(failure.hr, 0, failure.pszMessage);\n#endif // DESKTOP | SYSTEM\n            }\n            else if (restrictedErrorInformation)\n            {\n                // GetRestrictedErrorInfo returns ownership of the error information.  If we aren't originating, and an error was\n                // already present, then we need to restore the error information for later observation.\n                SetRestrictedErrorInfo(restrictedErrorInformation.get());\n            }\n        }\n    }\n\n    // This method will check for the presence of stowed exception data on the current thread.  If such data exists, and the\n    // HRESULT matches the current failure, then we will call RoFailFastWithErrorContext.  RoFailFastWithErrorContext in this\n    // situation will result in -VASTLY- improved crash bucketing.  It is hard to express just how much better.  In other cases we\n    // just return and the calling method fails fast the same way it always has.\n    inline void __stdcall FailfastWithContextCallback(wil::FailureInfo const& failure) WI_NOEXCEPT\n    {\n        wil::com_ptr_nothrow<IRestrictedErrorInfo> restrictedErrorInformation;\n        if (GetRestrictedErrorInfo(&restrictedErrorInformation) == S_OK)\n        {\n            wil::unique_bstr descriptionUnused;\n            HRESULT existingHr = failure.hr;\n            wil::unique_bstr restrictedDescriptionUnused;\n            wil::unique_bstr capabilitySidUnused;\n            if (SUCCEEDED(restrictedErrorInformation->GetErrorDetails(\n                    &descriptionUnused, &existingHr, &restrictedDescriptionUnused, &capabilitySidUnused)) &&\n                (existingHr == failure.hr))\n            {\n                // GetRestrictedErrorInfo returns ownership of the error information.  We want it to be available for\n                // RoFailFastWithErrorContext so we must restore it via SetRestrictedErrorInfo first.\n                SetRestrictedErrorInfo(restrictedErrorInformation.get());\n                RoFailFastWithErrorContext(existingHr);\n            }\n            else\n            {\n                // The error didn't match the current failure.  Put it back in thread-local storage even though we aren't failing\n                // fast in this method, so it is available in the debugger just-in-case.\n                SetRestrictedErrorInfo(restrictedErrorInformation.get());\n            }\n        }\n    }\n} // namespace details\n/// @endcond\n} // namespace wil\n\n// Automatically call RoOriginateError upon error origination by including this file\nWI_HEADER_INITIALIZATION_FUNCTION(ResultStowedExceptionInitialize, [] {\n    ::wil::SetOriginateErrorCallback(::wil::details::RaiseRoOriginateOnWilExceptions);\n    ::wil::SetFailfastWithContextCallback(::wil::details::FailfastWithContextCallback);\n    return 1;\n})\n\n#endif // __WIL_RESULT_ORIGINATE_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/rpc_helpers.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for invoking RPC functions and translating structured exceptions to HRESULTs or C++ exceptions\n#ifndef __WIL_RPC_HELPERS_INCLUDED\n#define __WIL_RPC_HELPERS_INCLUDED\n\n#include \"result.h\"\n#include \"resource.h\"\n#include \"wistd_functional.h\"\n#include \"wistd_type_traits.h\"\n\nnamespace wil\n{\n\n/// @cond\nnamespace details\n{\n    // This call-adapter template converts a void-returning 'wistd::invoke' into\n    // an HRESULT-returning 'wistd::invoke' that emits S_OK. It can be eliminated\n    // with 'if constexpr' when C++17 is in wide use.\n    template <typename TReturnType>\n    struct call_adapter\n    {\n        template <typename... TArgs>\n        static HRESULT call(TArgs&&... args)\n        {\n            return wistd::invoke(wistd::forward<TArgs>(args)...);\n        }\n    };\n\n    template <>\n    struct call_adapter<void>\n    {\n        template <typename... TArgs>\n        static HRESULT call(TArgs&&... args)\n        {\n            wistd::invoke(wistd::forward<TArgs>(args)...);\n            return S_OK;\n        }\n    };\n\n    // Some RPC exceptions are already HRESULTs. Others are in the regular Win32\n    // error space. If the incoming exception code isn't an HRESULT, wrap it.\n    constexpr HRESULT map_rpc_exception(DWORD code)\n    {\n        return IS_ERROR(code) ? code : __HRESULT_FROM_WIN32(code);\n    }\n} // namespace details\n/// @endcond\n\n/** Invokes an RPC method, mapping structured exceptions to HRESULTs\nFailures encountered by the RPC infrastructure (such as server crashes, authentication\nerrors, client parameter issues, etc.) are emitted by raising a structured exception from\nwithin the RPC machinery. This method wraps the requested call in the usual RpcTryExcept,\nRpcTryCatch, and RpcEndExcept sequence then maps the exceptions to HRESULTs for the usual\nflow control machinery to use.\n\nMany RPC methods are defined as returning HRESULT themselves, where the HRESULT indicates\nthe result of the _work_. HRESULTs returned by a successful completion of the _call_ are\nreturned as-is.\n\nRPC methods that have a return type of 'void' are mapped to returning S_OK when the _call_\ncompletes successfully.\n\nFor example, consider an RPC interface method defined in idl as:\n~~~\nHRESULT GetKittenState([in, ref, string] const wchar_t* name, [out, retval] KittenState** state);\n~~~\nTo call this method, use:\n~~~\nwil::unique_rpc_binding binding = // typically gotten elsewhere;\nwil::unique_midl_ptr<KittenState> state;\nHRESULT hr = wil::invoke_rpc_nothrow(GetKittenState, binding.get(), L\"fluffy\", state.put());\nRETURN_IF_FAILED(hr);\n~~~\n*/\ntemplate <typename... TCall>\nHRESULT invoke_rpc_nothrow(TCall&&... args) WI_NOEXCEPT\n{\n    RpcTryExcept\n    {\n        // Note: this helper type can be removed with C++17 enabled via\n        // 'if constexpr(wistd::is_same_v<void, result_t>)'\n        using result_t = typename wistd::__invoke_of<TCall...>::type;\n        RETURN_IF_FAILED(details::call_adapter<result_t>::call(wistd::forward<TCall>(args)...));\n        return S_OK;\n    }\n    RpcExcept(RpcExceptionFilter(RpcExceptionCode()))\n    {\n        RETURN_HR(details::map_rpc_exception(RpcExceptionCode()));\n    }\n    RpcEndExcept\n}\n\n/** Invokes an RPC method, mapping structured exceptions to HRESULTs\nFailures encountered by the RPC infrastructure (such as server crashes, authentication\nerrors, client parameter issues, etc.) are emitted by raising a structured exception from\nwithin the RPC machinery. This method wraps the requested call in the usual RpcTryExcept,\nRpcTryCatch, and RpcEndExcept sequence then maps the exceptions to HRESULTs for the usual\nflow control machinery to use.\n\nSome RPC methods return results (such as a state enumeration or other value) directly in\ntheir signature. This adapter writes that result into a caller-provided object then\nreturns S_OK.\n\nFor example, consider an RPC interface method defined in idl as:\n~~~\nGUID GetKittenId([in, ref, string] const wchar_t* name);\n~~~\nTo call this method, use:\n~~~\nwil::unique_rpc_binding binding = // typically gotten elsewhere;\nGUID id;\nHRESULT hr = wil::invoke_rpc_result_nothrow(id, GetKittenId, binding.get(), L\"fluffy\");\nRETURN_IF_FAILED(hr);\n~~~\n*/\ntemplate <typename TResult, typename... TCall>\nHRESULT invoke_rpc_result_nothrow(TResult& result, TCall&&... args) WI_NOEXCEPT\n{\n    RpcTryExcept\n    {\n        result = wistd::invoke(wistd::forward<TCall>(args)...);\n        return S_OK;\n    }\n    RpcExcept(RpcExceptionFilter(RpcExceptionCode()))\n    {\n        RETURN_HR(details::map_rpc_exception(RpcExceptionCode()));\n    }\n    RpcEndExcept\n}\n\n/// @cond\nnamespace details\n{\n    // Provides an adapter around calling the context-handle-close method on an\n    // RPC interface, which itself is an RPC call.\n    template <typename TStorage, typename close_fn_t, close_fn_t close_fn>\n    struct rpc_closer_t\n    {\n        static void Close(TStorage arg) WI_NOEXCEPT\n        {\n            LOG_IF_FAILED(invoke_rpc_nothrow(close_fn, &arg));\n        }\n    };\n} // namespace details\n/// @endcond\n\n/** Manages explicit RPC context handles\nExplicit RPC context handles are used in many RPC interfaces. Most interfaces with\ncontext handles have an explicit `FooClose([in, out] CONTEXT*)` method that lets\nthe server close out the context handle. As the close method itself is an RPC call,\nit can fail and raise a structured exception.\n\nThis type routes the context-handle-specific `Close` call through the `invoke_rpc_nothrow`\nhelper, ensuring correct cleanup and lifecycle management.\n@code\n// Assume the interface has two methods:\n// HRESULT OpenFoo([in] handle_t binding, [out] FOO_CONTEXT*);\n// HRESULT UseFoo([in] FOO_CONTEXT context;\n// void CloseFoo([in, out] PFOO_CONTEXT);\nusing unique_foo_context = wil::unique_rpc_context_handle<FOO_CONTEXT, decltype(&CloseFoo), CloseFoo>;\nunique_foo_context context;\nRETURN_IF_FAILED(wil::invoke_rpc_nothrow(OpenFoo, m_binding.get(), context.put()));\nRETURN_IF_FAILED(wil::invoke_rpc_nothrow(UseFoo, context.get()));\ncontext.reset();\n@endcode\n*/\ntemplate <typename TContext, typename close_fn_t, close_fn_t close_fn>\nusing unique_rpc_context_handle =\n    unique_any<TContext, decltype(&details::rpc_closer_t<TContext, close_fn_t, close_fn>::Close), details::rpc_closer_t<TContext, close_fn_t, close_fn>::Close>;\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Invokes an RPC method, mapping structured exceptions to C++ exceptions\nSee `wil::invoke_rpc_nothrow` for additional information.  Failures during the _call_\nand those returned by the _method_ are mapped to HRESULTs and thrown inside a\nwil::ResultException. Using the example RPC method provided above:\n@code\nwil::unique_midl_ptr<KittenState> state;\nwil::invoke_rpc(GetKittenState, binding.get(), L\"fluffy\", state.put());\n// use 'state'\n@endcode\n*/\ntemplate <typename... TCall>\nvoid invoke_rpc(TCall&&... args)\n{\n    THROW_IF_FAILED(invoke_rpc_nothrow(wistd::forward<TCall>(args)...));\n}\n\n/** Invokes an RPC method, mapping structured exceptions to C++ exceptions\nSee `wil::invoke_rpc_result_nothrow` for additional information. Failures during the\n_call_ are mapped to HRESULTs and thrown inside a `wil::ResultException`. Using the\nexample RPC method provided above:\n@code\nGUID id = wil::invoke_rpc_result(GetKittenId, binding.get());\n// use 'id'\n@endcode\n*/\ntemplate <typename... TCall>\nauto invoke_rpc_result(TCall&&... args)\n{\n    using result_t = typename wistd::__invoke_of<TCall...>::type;\n    result_t result{};\n    THROW_IF_FAILED(invoke_rpc_result_nothrow(result, wistd::forward<TCall>(args)...));\n    return result;\n}\n#endif\n} // namespace wil\n\n#endif\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/safecast.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Type independent wrappers around the various intsafe.h functions\n#ifndef __WIL_SAFECAST_INCLUDED\n#define __WIL_SAFECAST_INCLUDED\n\n#include \"result_macros.h\"\n#include <intsafe.h>\n#include \"wistd_config.h\"\n#include \"wistd_type_traits.h\"\n\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    // Default error case for undefined conversions in intsafe.h\n    template <typename OldT, typename NewT>\n    constexpr wistd::nullptr_t intsafe_conversion = nullptr;\n\n    // is_known_safe_static_cast_v determines if a conversion is known to be safe or not. Known\n    // safe conversions can be handled by static_cast, this includes conversions between the same\n    // type, when the new type is larger than the old type but is not a signed to unsigned\n    // conversion, and when the two types are the same size and signed/unsigned. All other\n    // conversions will be assumed to be potentially unsafe, and the conversion must be handled\n    // by intsafe and checked.\n    template <typename NewT, typename OldT>\n    constexpr bool is_known_safe_static_cast_v =\n        (sizeof(NewT) > sizeof(OldT) && !(wistd::is_signed_v<OldT> && wistd::is_unsigned_v<NewT>)) ||\n        (sizeof(NewT) == sizeof(OldT) &&\n         ((wistd::is_signed_v<NewT> && wistd::is_signed_v<OldT>) || (wistd::is_unsigned_v<NewT> && wistd::is_unsigned_v<OldT>)));\n\n    // Helper template to determine that NewT and OldT are both integral types. The safe_cast\n    // operation only supports conversions between integral types.\n    template <typename NewT, typename OldT>\n    constexpr bool both_integral_v = wistd::is_integral<NewT>::value && wistd::is_integral<OldT>::value;\n\n    // Helper template to determine that the cast from OldT to NewT is going to sign extend the\n    // value.  This is only true when the size of NewT is larger than OldT and OldT is signed.\n    template <typename NewT, typename OldT>\n    constexpr bool is_sign_extending_cast_v =\n        (sizeof(NewT) >= sizeof(OldT)) && both_integral_v<NewT, OldT> && wistd::is_signed_v<OldT>;\n\n    // Note on native wchar_t (__wchar_t):\n    //      Intsafe.h does not currently handle native wchar_t. When compiling with /Zc:wchar_t-, this is fine as wchar_t is\n    //      typedef'd to unsigned short. However, when compiling with /Zc:wchar_t or wchar_t as a native type, the lack of\n    //      support for native wchar_t in intsafe.h becomes an issue. To work around this, we treat native wchar_t as an\n    //      unsigned short when passing it to intsafe.h, because the two on the Windows platform are the same size and\n    //      share the same range according to MSDN. If the cast is to a native wchar_t, the result from intsafe.h is cast\n    //      to a native wchar_t.\n\n    // Intsafe does not have a defined conversion for native wchar_t\n    template <typename NewT, typename OldT>\n    constexpr bool neither_native_wchar_v = !wistd::is_same<NewT, __wchar_t>::value && !wistd::is_same<OldT, __wchar_t>::value;\n\n    // Check to see if the cast is a conversion to native wchar_t\n    template <typename NewT, typename OldT>\n    constexpr bool is_cast_to_wchar_v = wistd::is_same<NewT, __wchar_t>::value && !wistd::is_same<OldT, __wchar_t>::value;\n\n    // Check to see if the cast is a conversion from native wchar_t\n    template <typename NewT, typename OldT>\n    constexpr bool is_cast_from_wchar_v = !wistd::is_same<NewT, __wchar_t>::value && wistd::is_same<OldT, __wchar_t>::value;\n\n    // Validate the conversion to be performed has a defined mapping to an intsafe conversion\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_intsafe_cast_v = intsafe_conversion<OldT, NewT> != nullptr;\n\n    // True when the conversion is between integral types and can be handled by static_cast\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_safe_static_cast_v = both_integral_v<NewT, OldT> && is_known_safe_static_cast_v<NewT, OldT>;\n\n    // True when the conversion is between integral types, does not involve native wchar, has\n    // a mapped intsafe conversion, and is unsafe.\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_unsafe_cast_no_wchar_v =\n        both_integral_v<NewT, OldT> && !is_known_safe_static_cast_v<NewT, OldT> && neither_native_wchar_v<NewT, OldT> &&\n        is_supported_intsafe_cast_v<NewT, OldT>;\n\n    // True when the conversion is between integral types, is a cast to native wchar_t, has\n    // a mapped intsafe conversion, and is unsafe.\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_unsafe_cast_to_wchar_v =\n        both_integral_v<NewT, OldT> && !is_known_safe_static_cast_v<NewT, OldT> && is_cast_to_wchar_v<NewT, OldT> &&\n        is_supported_intsafe_cast_v<unsigned short, OldT>;\n\n    // True when the conversion is between integral types, is a cast from native wchar_t, has\n    // a mapped intsafe conversion, and is unsafe.\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_unsafe_cast_from_wchar_v =\n        both_integral_v<NewT, OldT> && !is_known_safe_static_cast_v<NewT, OldT> && is_cast_from_wchar_v<NewT, OldT> &&\n        is_supported_intsafe_cast_v<NewT, unsigned short>;\n\n    // True when the conversion is supported and unsafe, and may or may not involve\n    // native wchar_t.\n    template <typename NewT, typename OldT>\n    constexpr bool is_supported_unsafe_cast_v =\n        is_supported_unsafe_cast_no_wchar_v<NewT, OldT> || is_supported_unsafe_cast_to_wchar_v<NewT, OldT> ||\n        is_supported_unsafe_cast_from_wchar_v<NewT, OldT>;\n\n    // True when T is any one of the primitive types that the variably sized types are defined as.\n    template <typename T>\n    constexpr bool is_potentially_variably_sized_type_v =\n        wistd::is_same<T, int>::value || wistd::is_same<T, unsigned int>::value || wistd::is_same<T, long>::value ||\n        wistd::is_same<T, unsigned long>::value || wistd::is_same<T, __int64>::value || wistd::is_same<T, unsigned __int64>::value;\n\n    // True when either type is potentially variably sized (e.g. size_t, ptrdiff_t)\n    template <typename OldT, typename NewT>\n    constexpr bool is_potentially_variably_sized_cast_v =\n        is_potentially_variably_sized_type_v<OldT> || is_potentially_variably_sized_type_v<NewT>;\n\n    // Mappings of all conversions defined in intsafe.h to intsafe_conversion\n    // Note: Uppercase types (UINT, DWORD, SIZE_T, etc) and architecture dependent types resolve\n    // to the base types. The base types are used since they do not vary based on architecture.\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, char> = LongLongToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, int> = LongLongToInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, long> = LongLongToLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, short> = LongLongToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, signed char> = LongLongToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned __int64> = LongLongToULongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned char> = LongLongToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned int> = LongLongToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned long> = LongLongToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned short> = LongLongToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, char> = IntToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, short> = IntToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, signed char> = IntToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, unsigned __int64> = IntToULongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, unsigned char> = IntToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, unsigned int> = IntToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, unsigned long> = IntToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<int, unsigned short> = IntToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, char> = LongToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, int> = LongToInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, short> = LongToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, signed char> = LongToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, unsigned __int64> = LongToULongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, unsigned char> = LongToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, unsigned int> = LongToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, unsigned long> = LongToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<long, unsigned short> = LongToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, char> = ShortToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, signed char> = ShortToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, unsigned __int64> = ShortToULongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, unsigned char> = ShortToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, unsigned int> = ShortToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, unsigned long> = ShortToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<short, unsigned short> = ShortToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<signed char, unsigned __int64> = Int8ToULongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<signed char, unsigned char> = Int8ToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<signed char, unsigned int> = Int8ToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<signed char, unsigned long> = Int8ToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<signed char, unsigned short> = Int8ToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, __int64> = ULongLongToLongLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, char> = ULongLongToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, int> = ULongLongToInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, long> = ULongLongToLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, short> = ULongLongToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, signed char> = ULongLongToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, unsigned char> = ULongLongToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, unsigned int> = ULongLongToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, unsigned long> = ULongLongToULong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned __int64, unsigned short> = ULongLongToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned char, char> = UInt8ToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned char, signed char> = UIntToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, char> = UIntToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, int> = UIntToInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, long> = UIntToLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, short> = UIntToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, signed char> = UIntToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, unsigned char> = UIntToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned int, unsigned short> = UIntToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, char> = ULongToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, int> = ULongToInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, long> = ULongToLong;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, short> = ULongToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, signed char> = ULongToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, unsigned char> = ULongToUChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, unsigned int> = ULongToUInt;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned long, unsigned short> = ULongToUShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned short, char> = UShortToChar;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned short, short> = UShortToShort;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned short, signed char> = UShortToInt8;\n    template <>\n    __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<unsigned short, unsigned char> = UShortToUChar;\n} // namespace details\n/// @endcond\n\n// Unsafe conversion where failure results in fail fast.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_no_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast_failfast(const OldT var)\n{\n    NewT newVar;\n    FAIL_FAST_IF_FAILED((details::intsafe_conversion<OldT, NewT>(var, &newVar)));\n    return newVar;\n}\n\n// Unsafe conversion where failure results in fail fast.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_from_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast_failfast(const OldT var)\n{\n    NewT newVar;\n    FAIL_FAST_IF_FAILED((details::intsafe_conversion<unsigned short, NewT>(static_cast<unsigned short>(var), &newVar)));\n    return newVar;\n}\n\n// Unsafe conversion where failure results in fail fast.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_to_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast_failfast(const OldT var)\n{\n    unsigned short newVar;\n    FAIL_FAST_IF_FAILED((details::intsafe_conversion<OldT, unsigned short>(var, &newVar)));\n    return static_cast<__wchar_t>(newVar);\n}\n\n// This conversion is always safe, therefore a static_cast is fine.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_safe_static_cast_v<NewT, OldT>, int> = 0>\nNewT safe_cast_failfast(const OldT var)\n{\n    return static_cast<NewT>(var);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n// Unsafe conversion where failure results in a thrown exception.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_no_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast(const OldT var)\n{\n    NewT newVar;\n    THROW_IF_FAILED((details::intsafe_conversion<OldT, NewT>(var, &newVar)));\n    return newVar;\n}\n\n// Unsafe conversion where failure results in a thrown exception.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_from_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast(const OldT var)\n{\n    NewT newVar;\n    THROW_IF_FAILED((details::intsafe_conversion<unsigned short, NewT>(static_cast<unsigned short>(var), &newVar)));\n    return newVar;\n}\n\n// Unsafe conversion where failure results in a thrown exception.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_to_wchar_v<NewT, OldT>, int> = 0>\nNewT safe_cast(const OldT var)\n{\n    unsigned short newVar;\n    THROW_IF_FAILED((details::intsafe_conversion<OldT, unsigned short>(var, &newVar)));\n    return static_cast<__wchar_t>(newVar);\n}\n\n// This conversion is always safe, therefore a static_cast is fine.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_safe_static_cast_v<NewT, OldT>, int> = 0>\nNewT safe_cast(const OldT var)\n{\n    return static_cast<NewT>(var);\n}\n#endif\n\n// This conversion is unsafe, therefore the two parameter version of safe_cast_nothrow must be used\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_v<NewT, OldT>, int> = 0>\nNewT safe_cast_nothrow(const OldT /*var*/)\n{\n    static_assert(!wistd::is_same_v<NewT, NewT>, \"This cast has the potential to fail, use the two parameter safe_cast_nothrow instead\");\n}\n\n// This conversion is always safe, therefore a static_cast is fine.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_safe_static_cast_v<NewT, OldT>, int> = 0>\nNewT safe_cast_nothrow(const OldT var)\n{\n    return static_cast<NewT>(var);\n}\n\n// Unsafe conversion where an HRESULT is returned. It is up to the callee to check and handle the HRESULT\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_no_wchar_v<NewT, OldT>, int> = 0>\nHRESULT safe_cast_nothrow(const OldT var, NewT* newTResult)\n{\n    return details::intsafe_conversion<OldT, NewT>(var, newTResult);\n}\n\n// Unsafe conversion where an HRESULT is returned. It is up to the callee to check and handle the HRESULT\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_from_wchar_v<NewT, OldT>, int> = 0>\nHRESULT safe_cast_nothrow(const OldT var, NewT* newTResult)\n{\n    return details::intsafe_conversion<unsigned short, NewT>(static_cast<unsigned short>(var), newTResult);\n}\n\n// Unsafe conversion where an HRESULT is returned. It is up to the callee to check and handle the HRESULT\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_unsafe_cast_to_wchar_v<NewT, OldT>, int> = 0>\nHRESULT safe_cast_nothrow(const OldT var, NewT* newTResult)\n{\n    return details::intsafe_conversion<OldT, unsigned short>(var, reinterpret_cast<unsigned short*>(newTResult));\n}\n\n// This conversion is always safe, therefore a static_cast is fine. If it can be determined the conversion\n// does not involve a variably sized type, then the compilation will fail and say the single parameter version\n// of safe_cast_nothrow should be used instead.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_supported_safe_static_cast_v<NewT, OldT>, int> = 0>\nHRESULT safe_cast_nothrow(const OldT var, NewT* newTResult)\n{\n    static_assert(\n        details::is_potentially_variably_sized_cast_v<OldT, NewT>,\n        \"This cast is always safe; use safe_cast_nothrow<T>(value) to avoid unnecessary error handling.\");\n    *newTResult = static_cast<NewT>(var);\n    return S_OK;\n}\n\n// This conversion takes a signed integer value and grows it with the upper bits set to zero.  This is\n// useful when the resulting value is cast to a pointer type as it prevents the upper bits from being fill\n// which would adjust the pointed-to address.\n//\n// For example:\n//      wil::safe_zero_extending_cast<ULONG_PTR>(-1)\n// will return 0x00000000`FFFFFFFF on a 64-bit system.\ntemplate <typename NewT, typename OldT, wistd::enable_if_t<details::is_sign_extending_cast_v<NewT, OldT>, int> = 0>\nNewT safe_zero_extending_cast(const OldT var)\n{\n    // The first cast is to an unsigned type of the same size as the original.  The second cast is to the\n    // larger type.  Being an unsigned cast, the upper bits are zeroed out.\n    using unsigned_old_t = wistd::make_unsigned_t<OldT>;\n    return static_cast<NewT>(static_cast<unsigned_old_t>(var));\n}\n} // namespace wil\n\n#endif // __WIL_SAFECAST_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/stl.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Windows STL helpers: custom allocators for STL containers\n#ifndef __WIL_STL_INCLUDED\n#define __WIL_STL_INCLUDED\n\n#include \"common.h\"\n#include \"resource.h\"\n#include <memory>\n#include <string>\n#include <vector>\n#include <utility>\n#if (__WI_LIBCPP_STD_VER >= 17) && WI_HAS_INCLUDE(<string_view>, 1) // Assume present if C++17\n#include <string_view>\n#endif\n\n/// @cond\n#ifndef WI_STL_FAIL_FAST_IF\n#define WI_STL_FAIL_FAST_IF FAIL_FAST_IF\n#endif\n/// @endcond\n\n#if defined(WIL_ENABLE_EXCEPTIONS)\n\nnamespace wil\n{\n/** Secure allocator for STL containers.\nThe `wil::secure_allocator` allocator calls `SecureZeroMemory` before deallocating\nmemory. This provides a mechanism for secure STL containers such as `wil::secure_vector`,\n`wil::secure_string`, and `wil::secure_wstring`. */\ntemplate <typename T>\nstruct secure_allocator : public std::allocator<T>\n{\n    template <typename Other>\n    struct rebind\n    {\n        using other = secure_allocator<Other>;\n    };\n\n    secure_allocator() : std::allocator<T>()\n    {\n    }\n\n    ~secure_allocator() = default;\n\n    secure_allocator(const secure_allocator& a) : std::allocator<T>(a)\n    {\n    }\n\n    template <class U>\n    secure_allocator(const secure_allocator<U>& a) : std::allocator<T>(a)\n    {\n    }\n\n    T* allocate(size_t n)\n    {\n        return std::allocator<T>::allocate(n);\n    }\n\n    void deallocate(T* p, size_t n)\n    {\n        SecureZeroMemory(p, sizeof(T) * n);\n        std::allocator<T>::deallocate(p, n);\n    }\n};\n\n//! `wil::secure_vector` will be securely zeroed before deallocation.\ntemplate <typename Type>\nusing secure_vector = std::vector<Type, secure_allocator<Type>>;\n//! `wil::secure_wstring` will be securely zeroed before deallocation.\nusing secure_wstring = std::basic_string<wchar_t, std::char_traits<wchar_t>, wil::secure_allocator<wchar_t>>;\n//! `wil::secure_string` will be securely zeroed before deallocation.\nusing secure_string = std::basic_string<char, std::char_traits<char>, wil::secure_allocator<char>>;\n\n/// @cond\nnamespace details\n{\n    template <>\n    struct string_maker<std::wstring>\n    {\n        HRESULT make(_In_reads_opt_(length) PCWSTR source, size_t length) WI_NOEXCEPT\n        try\n        {\n            m_value = source ? std::wstring(source, length) : std::wstring(length, L'\\0');\n            return S_OK;\n        }\n        catch (...)\n        {\n            return E_OUTOFMEMORY;\n        }\n\n        wchar_t* buffer()\n        {\n            return &m_value[0];\n        }\n\n        HRESULT trim_at_existing_null(size_t length)\n        {\n            m_value.erase(length);\n            return S_OK;\n        }\n\n        std::wstring release()\n        {\n            return std::wstring(std::move(m_value));\n        }\n\n        static PCWSTR get(const std::wstring& value)\n        {\n            return value.c_str();\n        }\n\n    private:\n        std::wstring m_value;\n    };\n} // namespace details\n/// @endcond\n\n// str_raw_ptr is an overloaded function that retrieves a const pointer to the first character in a string's buffer.\n// This is the overload for std::wstring.  Other overloads available in resource.h.\ninline PCWSTR str_raw_ptr(const std::wstring& str)\n{\n    return str.c_str();\n}\n\n#if __cpp_lib_string_view >= 201606L\n/**\n    zstring_view. A zstring_view is identical to a std::string_view except it is always nul-terminated (unless empty).\n    * zstring_view can be used for storing string literals without \"forgetting\" the length or that it is nul-terminated.\n    * A zstring_view can be converted implicitly to a std::string_view because it is always safe to use a nul-terminated\n      string_view as a plain string view.\n    * A zstring_view can be constructed from a std::string because the data in std::string is nul-terminated.\n*/\ntemplate <class TChar>\nclass basic_zstring_view : public std::basic_string_view<TChar>\n{\n    using size_type = typename std::basic_string_view<TChar>::size_type;\n\npublic:\n    constexpr basic_zstring_view() noexcept = default;\n    constexpr basic_zstring_view(const basic_zstring_view&) noexcept = default;\n    constexpr basic_zstring_view& operator=(const basic_zstring_view&) noexcept = default;\n\n    constexpr basic_zstring_view(const TChar* pStringData, size_type stringLength) noexcept :\n        std::basic_string_view<TChar>(pStringData, stringLength)\n    {\n        if (pStringData[stringLength] != 0)\n        {\n            WI_STL_FAIL_FAST_IF(true);\n        }\n    }\n\n    template <size_t stringArrayLength>\n    constexpr basic_zstring_view(const TChar (&stringArray)[stringArrayLength]) noexcept :\n        std::basic_string_view<TChar>(&stringArray[0], length_n(&stringArray[0], stringArrayLength))\n    {\n    }\n\n    // Construct from nul-terminated char ptr. To prevent this from overshadowing array construction,\n    // we disable this constructor if the value is an array (including string literal).\n    template <typename TPtr, std::enable_if_t<std::is_convertible<TPtr, const TChar*>::value && !std::is_array<TPtr>::value>* = nullptr>\n    constexpr basic_zstring_view(TPtr&& pStr) noexcept : std::basic_string_view<TChar>(std::forward<TPtr>(pStr))\n    {\n    }\n\n    constexpr basic_zstring_view(const std::basic_string<TChar>& str) noexcept :\n        std::basic_string_view<TChar>(&str[0], str.size())\n    {\n    }\n\n    // basic_string_view [] precondition won't let us read view[view.size()]; so we define our own.\n    WI_NODISCARD constexpr const TChar& operator[](size_type idx) const noexcept\n    {\n        WI_ASSERT(idx <= this->size() && this->data() != nullptr);\n        return this->data()[idx];\n    }\n\n    WI_NODISCARD constexpr const TChar* c_str() const noexcept\n    {\n        WI_ASSERT(this->data() == nullptr || this->data()[this->size()] == 0);\n        return this->data();\n    }\n\nprivate:\n    // Bounds-checked version of char_traits::length, like strnlen. Requires that the input contains a null terminator.\n    static constexpr size_type length_n(_In_reads_opt_(buf_size) const TChar* str, size_type buf_size) noexcept\n    {\n        const std::basic_string_view<TChar> view(str, buf_size);\n        auto pos = view.find_first_of(TChar());\n        if (pos == view.npos)\n        {\n            WI_STL_FAIL_FAST_IF(true);\n        }\n        return pos;\n    }\n\n    // The following basic_string_view methods must not be allowed because they break the nul-termination.\n    using std::basic_string_view<TChar>::swap;\n    using std::basic_string_view<TChar>::remove_suffix;\n};\n\nusing zstring_view = basic_zstring_view<char>;\nusing zwstring_view = basic_zstring_view<wchar_t>;\n\ninline namespace literals\n{\n    constexpr zstring_view operator\"\"_zv(const char* str, std::size_t len) noexcept\n    {\n        return zstring_view(str, len);\n    }\n\n    constexpr zwstring_view operator\"\"_zv(const wchar_t* str, std::size_t len) noexcept\n    {\n        return zwstring_view(str, len);\n    }\n} // namespace literals\n\n#endif // __cpp_lib_string_view >= 201606L\n\n} // namespace wil\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#endif // __WIL_STL_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/token_helpers.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Helpers for using tokens and impersonation\n#ifndef __WIL_TOKEN_HELPERS_INCLUDED\n#define __WIL_TOKEN_HELPERS_INCLUDED\n\n#ifdef _KERNEL_MODE\n#error This header is not supported in kernel-mode.\n#endif\n\n#include \"resource.h\"\n#include <new>\n#include <lmcons.h> // for UNLEN and DNLEN\n#include <processthreadsapi.h>\n\n// for GetUserNameEx()\n/// @cond\n#ifndef SECURITY_WIN32\n#define SECURITY_WIN32\n#endif\n/// @endcond\n#include <Security.h>\n\nnamespace wil\n{\n/// @cond\nnamespace details\n{\n    // Template specialization for TOKEN_INFORMATION_CLASS, add more mappings here as needed\n    // TODO: The mapping should be reversed to be MapTokenInfoClassToStruct since there may\n    // be an info class value that uses the same structure. That is the case for the file\n    // system information.\n    template <typename T>\n    struct MapTokenStructToInfoClass;\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_ACCESS_INFORMATION>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenAccessInformation;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_APPCONTAINER_INFORMATION>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenAppContainerSid;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_DEFAULT_DACL>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenDefaultDacl;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_GROUPS_AND_PRIVILEGES>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenGroupsAndPrivileges;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_MANDATORY_LABEL>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenIntegrityLevel;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_OWNER>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenOwner;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_PRIMARY_GROUP>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenPrimaryGroup;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_PRIVILEGES>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenPrivileges;\n        static constexpr bool FixedSize = false;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_USER>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenUser;\n        static constexpr bool FixedSize = false;\n    };\n\n    // fixed size cases\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_ELEVATION_TYPE>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenElevationType;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_MANDATORY_POLICY>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenMandatoryPolicy;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_ORIGIN>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenOrigin;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_SOURCE>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenSource;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_STATISTICS>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenStatistics;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_TYPE>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenType;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<SECURITY_IMPERSONATION_LEVEL>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenImpersonationLevel;\n        static constexpr bool FixedSize = true;\n    };\n    template <>\n    struct MapTokenStructToInfoClass<TOKEN_ELEVATION>\n    {\n        static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenElevation;\n        static constexpr bool FixedSize = true;\n    };\n\n    struct token_info_deleter\n    {\n        template <typename T>\n        void operator()(T* p) const\n        {\n            static_assert(wistd::is_trivially_destructible_v<T>, \"do not use with nontrivial types\");\n            ::operator delete(p);\n        }\n    };\n} // namespace details\n/// @endcond\n\nenum class OpenThreadTokenAs\n{\n    Current,\n    Self\n};\n\n/** Open the active token.\nOpens either the current thread token (if impersonating) or the current process token. Returns a token the caller\ncan use with methods like get_token_information<> below. By default, the token is opened for TOKEN_QUERY and as the\neffective user.\n\nConsider using GetCurrentThreadEffectiveToken() instead of this method when eventually calling get_token_information.\nThis method returns a real handle to the effective token, but GetCurrentThreadEffectiveToken() is a Pseudo-handle\nand much easier to manage.\n~~~~\nwil::unique_handle theToken;\nRETURN_IF_FAILED(wil::open_current_access_token_nothrow(&theToken));\n~~~~\nCallers who want more access to the token (such as to duplicate or modify the token) can pass\nany mask of the token rights.\n~~~~\nwil::unique_handle theToken;\nRETURN_IF_FAILED(wil::open_current_access_token_nothrow(&theToken, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES));\n~~~~\nServices impersonating their clients may need to request that the active token is opened on the\nbehalf of the service process to perform certain operations. Opening a token for impersonation access\nor privilege-adjustment are examples of uses.\n~~~~\nwil::unique_handle callerToken;\nRETURN_IF_FAILED(wil::open_current_access_token_nothrow(&theToken, TOKEN_QUERY | TOKEN_IMPERSONATE, OpenThreadTokenAs::Self));\n~~~~\n@param tokenHandle Receives the token opened during the operation. Must be CloseHandle'd by the caller, or\n            (preferably) stored in a wil::unique_handle\n@param access Bits from the TOKEN_* access mask which are passed to OpenThreadToken/OpenProcessToken\n@param openAs Current to use current thread security context, or Self to use process security context.\n*/\ninline HRESULT open_current_access_token_nothrow(\n    _Out_ HANDLE* tokenHandle, unsigned long access = TOKEN_QUERY, OpenThreadTokenAs openAs = OpenThreadTokenAs::Current)\n{\n    HRESULT hr =\n        (OpenThreadToken(GetCurrentThread(), access, (openAs == OpenThreadTokenAs::Self), tokenHandle)\n             ? S_OK\n             : HRESULT_FROM_WIN32(::GetLastError()));\n    if (hr == HRESULT_FROM_WIN32(ERROR_NO_TOKEN))\n    {\n        hr = (OpenProcessToken(GetCurrentProcess(), access, tokenHandle) ? S_OK : HRESULT_FROM_WIN32(::GetLastError()));\n    }\n    return hr;\n}\n\n//! Current thread or process token, consider using GetCurrentThreadEffectiveToken() instead.\ninline wil::unique_handle open_current_access_token_failfast(unsigned long access = TOKEN_QUERY, OpenThreadTokenAs openAs = OpenThreadTokenAs::Current)\n{\n    HANDLE rawTokenHandle;\n    FAIL_FAST_IF_FAILED(open_current_access_token_nothrow(&rawTokenHandle, access, openAs));\n    return wil::unique_handle(rawTokenHandle);\n}\n\n// Exception based function to open current thread/process access token and acquire pointer to it\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Current thread or process token, consider using GetCurrentThreadEffectiveToken() instead.\ninline wil::unique_handle open_current_access_token(unsigned long access = TOKEN_QUERY, OpenThreadTokenAs openAs = OpenThreadTokenAs::Current)\n{\n    HANDLE rawTokenHandle;\n    THROW_IF_FAILED(open_current_access_token_nothrow(&rawTokenHandle, access, openAs));\n    return wil::unique_handle(rawTokenHandle);\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)\n\n// Returns tokenHandle or the effective thread token if tokenHandle is null.\n// Note, this returns an token handle who's lifetime is managed independently\n// and it may be a pseudo token, don't free it!\ninline HANDLE GetCurrentThreadEffectiveTokenWithOverride(HANDLE tokenHandle)\n{\n    return tokenHandle ? tokenHandle : GetCurrentThreadEffectiveToken();\n}\n\n/** Fetches information about a token.\nSee GetTokenInformation on MSDN for what this method can return. For variable sized structs the information\nis returned to the caller as a wil::unique_tokeninfo_ptr<T> (like TOKEN_ORIGIN, TOKEN_USER, TOKEN_ELEVATION, etc.). For\nfixed sized, the struct is returned directly.\nThe caller must have access to read the information from the provided token. This method works with both real\n(e.g. OpenCurrentAccessToken) and pseudo (e.g. GetCurrentThreadToken) token handles.\n@code\n// Retrieve the TOKEN_USER structure for the current process\nwil::unique_tokeninfo_ptr<TOKEN_USER> user;\nRETURN_IF_FAILED(wil::get_token_information_nothrow(user, GetCurrentProcessToken()));\nRETURN_IF_FAILED(ConsumeSid(user->User.Sid));\n@endcode\nNot specifying the token handle is the same as specifying 'nullptr' and retrieves information about the effective token.\n@code\nwil::unique_tokeninfo_ptr<TOKEN_PRIVILEGES> privileges;\nRETURN_IF_FAILED(wil::get_token_information_nothrow(privileges));\nfor (auto const& privilege : wil::GetRange(privileges->Privileges, privileges->PrivilegeCount))\n{\n    RETURN_IF_FAILED(ConsumePrivilege(privilege));\n}\n@endcode\n@param tokenInfo Receives a pointer to a structure containing the results of GetTokenInformation for the requested\n        type. The type of `<T>` selects which TOKEN_INFORMATION_CLASS will be used.\n@param tokenHandle Specifies which token will be queried. When nullptr, the thread's effective current token is used.\n@return S_OK on success, a FAILED hresult containing the win32 error from querying the token otherwise.\n*/\n\ntemplate <typename Q>\nusing unique_tokeninfo_ptr = wistd::unique_ptr<Q, details::token_info_deleter>;\n\ntemplate <typename T, wistd::enable_if_t<!details::MapTokenStructToInfoClass<T>::FixedSize>* = nullptr>\ninline HRESULT get_token_information_nothrow(unique_tokeninfo_ptr<T>& tokenInfo, HANDLE tokenHandle = nullptr)\n{\n    tokenInfo.reset();\n    tokenHandle = GetCurrentThreadEffectiveTokenWithOverride(tokenHandle);\n\n    DWORD tokenInfoSize = 0;\n    const auto infoClass = details::MapTokenStructToInfoClass<T>::infoClass;\n    RETURN_LAST_ERROR_IF(\n        !((!GetTokenInformation(tokenHandle, infoClass, nullptr, 0, &tokenInfoSize)) && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)));\n    unique_tokeninfo_ptr<T> tokenInfoClose{static_cast<T*>(::operator new(tokenInfoSize, std::nothrow))};\n    RETURN_IF_NULL_ALLOC(tokenInfoClose);\n    RETURN_IF_WIN32_BOOL_FALSE(GetTokenInformation(tokenHandle, infoClass, tokenInfoClose.get(), tokenInfoSize, &tokenInfoSize));\n    tokenInfo = wistd::move(tokenInfoClose);\n\n    return S_OK;\n}\n\ntemplate <typename T, wistd::enable_if_t<details::MapTokenStructToInfoClass<T>::FixedSize>* = nullptr>\ninline HRESULT get_token_information_nothrow(_Out_ T* tokenInfo, HANDLE tokenHandle = nullptr)\n{\n    *tokenInfo = {};\n    tokenHandle = GetCurrentThreadEffectiveTokenWithOverride(tokenHandle);\n\n    DWORD tokenInfoSize = sizeof(T);\n    const auto infoClass = details::MapTokenStructToInfoClass<T>::infoClass;\n    RETURN_IF_WIN32_BOOL_FALSE(GetTokenInformation(tokenHandle, infoClass, tokenInfo, tokenInfoSize, &tokenInfoSize));\n\n    return S_OK;\n}\n\n/// @cond\nnamespace details\n{\n    template <typename T, typename policy, wistd::enable_if_t<!details::MapTokenStructToInfoClass<T>::FixedSize>* = nullptr>\n    unique_tokeninfo_ptr<T> GetTokenInfoWrap(HANDLE token = nullptr)\n    {\n        unique_tokeninfo_ptr<T> temp;\n        policy::HResult(get_token_information_nothrow(temp, token));\n        return temp;\n    }\n\n    template <typename T, typename policy, wistd::enable_if_t<details::MapTokenStructToInfoClass<T>::FixedSize>* = nullptr>\n    T GetTokenInfoWrap(HANDLE token = nullptr)\n    {\n        T temp{};\n        policy::HResult(get_token_information_nothrow(&temp, token));\n        return temp;\n    }\n} // namespace details\n/// @endcond\n\n//! A variant of get_token_information<T> that fails-fast on errors retrieving the token\ntemplate <typename T>\ninline auto get_token_information_failfast(HANDLE token = nullptr)\n{\n    return details::GetTokenInfoWrap<T, err_failfast_policy>(token);\n}\n\n//! Overload of GetTokenInformationNoThrow that retrieves a token linked from the provided token\ninline HRESULT get_token_information_nothrow(unique_token_linked_token& tokenInfo, HANDLE tokenHandle = nullptr)\n{\n    static_assert(sizeof(tokenInfo) == sizeof(TOKEN_LINKED_TOKEN), \"confusing size mismatch\");\n    tokenHandle = GetCurrentThreadEffectiveTokenWithOverride(tokenHandle);\n\n    DWORD tokenInfoSize = 0;\n    RETURN_IF_WIN32_BOOL_FALSE(\n        ::GetTokenInformation(tokenHandle, TokenLinkedToken, tokenInfo.reset_and_addressof(), sizeof(tokenInfo), &tokenInfoSize));\n    return S_OK;\n}\n\n/** Retrieves the linked-token information for a token.\nFails-fast if the link information cannot be retrieved.\n~~~~\nauto link = get_linked_token_information_failfast(GetCurrentThreadToken());\nauto tokenUser = get_token_information<TOKEN_USER>(link.LinkedToken);\n~~~~\n@param token Specifies the token to query. Pass nullptr to use the current effective thread token\n@return unique_token_linked_token containing a handle to the linked token\n*/\ninline unique_token_linked_token get_linked_token_information_failfast(HANDLE token = nullptr)\n{\n    unique_token_linked_token tokenInfo;\n    FAIL_FAST_IF_FAILED(get_token_information_nothrow(tokenInfo, token));\n    return tokenInfo;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Fetches information about a token.\nSee get_token_information_nothrow for full details.\n@code\nauto user = wil::get_token_information<TOKEN_USER>(GetCurrentProcessToken());\nConsumeSid(user->User.Sid);\n@endcode\nPass 'nullptr' (or omit the parameter) as tokenHandle to retrieve information about the effective token.\n@code\nauto privs = wil::get_token_information<TOKEN_PRIVILEGES>(privileges);\nfor (auto& priv : wil::make_range(privs->Privileges, privs->Privilieges + privs->PrivilegeCount))\n{\n    if (priv.Attributes & SE_PRIVILEGE_ENABLED)\n    {\n        // ...\n    }\n}\n@endcode\n@return A pointer to a structure containing the results of GetTokenInformation for the requested  type. The type of\n            `<T>` selects which TOKEN_INFORMATION_CLASS will be used.\n@param token Specifies which token will be queried. When nullptr or not set, the thread's effective current token is used.\n*/\ntemplate <typename T>\ninline auto get_token_information(HANDLE token = nullptr)\n{\n    return details::GetTokenInfoWrap<T, err_exception_policy>(token);\n}\n\n/** Retrieves the linked-token information for a token.\nThrows an exception if the link information cannot be retrieved.\n~~~~\nauto link = get_linked_token_information(GetCurrentThreadToken());\nauto tokenUser = get_token_information<TOKEN_USER>(link.LinkedToken);\n~~~~\n@param token Specifies the token to query. Pass nullptr to use the current effective thread token\n@return unique_token_linked_token containing a handle to the linked token\n*/\ninline unique_token_linked_token get_linked_token_information(HANDLE token = nullptr)\n{\n    unique_token_linked_token tokenInfo;\n    THROW_IF_FAILED(get_token_information_nothrow(tokenInfo, token));\n    return tokenInfo;\n}\n#endif\n#endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8\n\n/// @cond\nnamespace details\n{\n    inline void RevertImpersonateToken(_In_ _Post_ptr_invalid_ HANDLE oldToken)\n    {\n        FAIL_FAST_IMMEDIATE_IF(!::SetThreadToken(nullptr, oldToken));\n\n        if (oldToken)\n        {\n            ::CloseHandle(oldToken);\n        }\n    }\n} // namespace details\n/// @endcond\n\nusing unique_token_reverter =\n    wil::unique_any<HANDLE, decltype(&details::RevertImpersonateToken), details::RevertImpersonateToken, details::pointer_access_none, HANDLE, INT_PTR, -1, HANDLE>;\n\n/** Temporarily impersonates a token on this thread.\nThis method sets a new token on a thread, restoring the current token when the returned object\nis destroyed. Useful for impersonating other tokens or running as 'self,' especially in services.\n~~~~\nHRESULT OpenFileAsSessionuser(PCWSTR filePath, DWORD session, _Out_ HANDLE* opened)\n{\n    wil::unique_handle userToken;\n    RETURN_IF_WIN32_BOOL_FALSE(QueryUserToken(session, &userToken));\n\n    wil::unique_token_reverter reverter;\n    RETURN_IF_FAILED(wil::impersonate_token_nothrow(userToken.get(), reverter));\n\n    wil::unique_hfile userFile(::CreateFile(filePath, ...));\n    RETURN_LAST_ERROR_IF(!userFile && (::GetLastError() != ERROR_FILE_NOT_FOUND));\n\n    *opened = userFile.release();\n    return S_OK;\n}\n~~~~\n@param token A token to impersonate, or 'nullptr' to run as the process identity.\n@param reverter An RAII object that, on success, will revert the impersonation when it goes out of scope.\n*/\ninline HRESULT impersonate_token_nothrow(HANDLE token, unique_token_reverter& reverter)\n{\n    wil::unique_handle currentToken;\n\n    // Get the token for the current thread. If there wasn't one, the reset will clear it as well\n    if (!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &currentToken))\n    {\n        RETURN_LAST_ERROR_IF(::GetLastError() != ERROR_NO_TOKEN);\n    }\n\n    // Update the current token\n    RETURN_IF_WIN32_BOOL_FALSE(::SetThreadToken(nullptr, token));\n\n    reverter.reset(currentToken.release()); // Ownership passed\n    return S_OK;\n}\n\n/** Temporarily clears any impersonation on this thread.\nThis method resets the current thread's token to nullptr, indicating that it is not impersonating\nany user. Useful for elevating to whatever identity a service or higher-privilege process might\nbe capable of running under.\n~~~~\nHRESULT DeleteFileRetryAsSelf(PCWSTR filePath)\n{\n    if (!::DeleteFile(filePath))\n    {\n        RETURN_LAST_ERROR_IF(::GetLastError() != ERROR_ACCESS_DENIED);\n        wil::unique_token_reverter reverter;\n        RETURN_IF_FAILED(wil::run_as_self_nothrow(reverter));\n        RETURN_IF_FAILED(TakeOwnershipOfFile(filePath));\n        RETURN_IF_FAILED(GrantDeleteAccess(filePath));\n        RETURN_IF_WIN32_BOOL_FALSE(::DeleteFile(filePath));\n    }\n    return S_OK;\n}\n~~~~\n*/\ninline HRESULT run_as_self_nothrow(unique_token_reverter& reverter)\n{\n    return impersonate_token_nothrow(nullptr, reverter);\n}\n\ninline unique_token_reverter impersonate_token_failfast(HANDLE token)\n{\n    unique_token_reverter oldToken;\n    FAIL_FAST_IF_FAILED(impersonate_token_nothrow(token, oldToken));\n    return oldToken;\n}\n\ninline unique_token_reverter run_as_self_failfast()\n{\n    return impersonate_token_failfast(nullptr);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Temporarily impersonates a token on this thread.\nThis method sets a new token on a thread, restoring the current token when the returned object\nis destroyed. Useful for impersonating other tokens or running as 'self,' especially in services.\n~~~~\nwil::unique_hfile OpenFileAsSessionuser(_In_z_ const wchar_t* filePath, DWORD session)\n{\n    wil::unique_handle userToken;\n    THROW_IF_WIN32_BOOL_FALSE(QueryUserToken(session, &userToken));\n\n    auto priorToken = wil::impersonate_token(userToken.get());\n\n    wil::unique_hfile userFile(::CreateFile(filePath, ...));\n    THROW_LAST_ERROR_IF(::GetLastError() != ERROR_FILE_NOT_FOUND);\n\n    return userFile;\n}\n~~~~\n@param token A token to impersonate, or 'nullptr' to run as the process identity.\n*/\ninline unique_token_reverter impersonate_token(HANDLE token = nullptr)\n{\n    unique_token_reverter oldToken;\n    THROW_IF_FAILED(impersonate_token_nothrow(token, oldToken));\n    return oldToken;\n}\n\n/** Temporarily clears any impersonation on this thread.\nThis method resets the current thread's token to nullptr, indicating that it is not impersonating\nany user. Useful for elevating to whatever identity a service or higher-privilege process might\nbe capable of running under.\n~~~~\nvoid DeleteFileRetryAsSelf(_In_z_ const wchar_t* filePath)\n{\n    if (!::DeleteFile(filePath) && (::GetLastError() == ERROR_ACCESS_DENIED))\n    {\n        auto priorToken = wil::run_as_self();\n        TakeOwnershipOfFile(filePath);\n        GrantDeleteAccess(filePath);\n        ::DeleteFile(filePath);\n    }\n}\n~~~~\n*/\ninline unique_token_reverter run_as_self()\n{\n    return impersonate_token(nullptr);\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n/// @cond\nnamespace details\n{\n    template <size_t AuthorityCount>\n    struct static_sid_t\n    {\n        BYTE Revision;\n        BYTE SubAuthorityCount;\n        SID_IDENTIFIER_AUTHORITY IdentifierAuthority;\n        DWORD SubAuthority[AuthorityCount];\n\n        PSID get()\n        {\n            return reinterpret_cast<PSID>(this);\n        }\n\n        template <size_t other>\n        static_sid_t& operator=(const static_sid_t<other>& source)\n        {\n            static_assert(other <= AuthorityCount, \"Cannot assign from a larger static sid to a smaller one\");\n\n            if (&this->Revision != &source.Revision)\n            {\n                memcpy(this, &source, sizeof(source));\n            }\n\n            return *this;\n        }\n    };\n} // namespace details\n/// @endcond\n\n/** Returns a structure containing a Revision 1 SID initialized with the authorities provided\nReplaces AllocateAndInitializeSid by constructing a structure laid out like a PSID, but\nreturned like a value. The resulting object is suitable for use with any method taking PSID,\npassed by \"&the_sid\" or via \"the_sid.get()\"\n@code\n// Change the owner of the key to administrators\nauto systemSid = wil::make_static_sid(SECURITY_NT_AUTHORITY, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS);\nRETURN_IF_WIN32_ERROR(\n    SetNamedSecurityInfo(keyPath, SE_REGISTRY_KEY, OWNER_SECURITY_INFORMATION, &systemSid, nullptr, nullptr, nullptr));\n@endcode\n*/\ntemplate <typename... Ts>\nconstexpr auto make_static_sid(const SID_IDENTIFIER_AUTHORITY& authority, Ts&&... subAuthorities)\n{\n    using sid_t = details::static_sid_t<sizeof...(subAuthorities)>;\n\n    static_assert(sizeof...(subAuthorities) <= SID_MAX_SUB_AUTHORITIES, \"too many sub authorities\");\n    static_assert(offsetof(sid_t, Revision) == offsetof(_SID, Revision), \"layout mismatch\");\n    static_assert(offsetof(sid_t, SubAuthorityCount) == offsetof(_SID, SubAuthorityCount), \"layout mismatch\");\n    static_assert(offsetof(sid_t, IdentifierAuthority) == offsetof(_SID, IdentifierAuthority), \"layout mismatch\");\n    static_assert(offsetof(sid_t, SubAuthority) == offsetof(_SID, SubAuthority), \"layout mismatch\");\n\n    return sid_t{SID_REVISION, sizeof...(subAuthorities), authority, {static_cast<DWORD>(subAuthorities)...}};\n}\n\n//! Variant of static_sid that defaults to the NT authority\ntemplate <typename... Ts>\nconstexpr auto make_static_nt_sid(Ts&&... subAuthorities)\n{\n    return make_static_sid(SECURITY_NT_AUTHORITY, wistd::forward<Ts>(subAuthorities)...);\n}\n\n/** Determines whether a specified security identifier (SID) is enabled in an access token.\nThis function determines whether a security identifier, described by a given set of subauthorities, is enabled\nin the given access token. Note that only up to eight subauthorities can be passed to this function.\n~~~~\nbool IsGuest()\n{\n    return wil::test_token_membership(nullptr, SECURITY_NT_AUTHORITY, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_GUESTS));\n}\n~~~~\n@param result This will be set to true if and only if a security identifier described by the given set of subauthorities is\n       enabled in the given access token.\n@param token A handle to an access token. The handle must have TOKEN_QUERY access to the token, and must be an impersonation\n       token. If token is nullptr, test_token_membership uses the impersonation token of the calling thread. If the thread is not\n       impersonating, the function duplicates the thread's primary token to create an impersonation token.\n@param sidAuthority A reference to a SID_IDENTIFIER_AUTHORITY structure. This structure provides the top-level identifier\n       authority value to set in the SID.\n@param subAuthorities Up to 15 subauthority values to place in the SID (this is a systemwide limit)\n@return S_OK on success, a FAILED hresult containing the win32 error from creating the SID or querying the token otherwise.\n*/\ntemplate <typename... Ts>\nHRESULT test_token_membership_nothrow(_Out_ bool* result, _In_opt_ HANDLE token, const SID_IDENTIFIER_AUTHORITY& sidAuthority, Ts&&... subAuthorities)\n{\n    *result = false;\n    auto tempSid = make_static_sid(sidAuthority, wistd::forward<Ts>(subAuthorities)...);\n    BOOL isMember;\n    RETURN_IF_WIN32_BOOL_FALSE(CheckTokenMembership(token, &tempSid, &isMember));\n\n    *result = (isMember != FALSE);\n\n    return S_OK;\n}\n\n#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)\n/** Determine whether a token represents an app container\nThis method uses the passed in token and emits a boolean indicating that\nwhether TokenIsAppContainer is true.\n~~~~\nHRESULT OnlyIfAppContainer()\n{\nbool isAppContainer;\nRETURN_IF_FAILED(wil::get_token_is_app_container_nothrow(nullptr, isAppContainer));\nRETURN_HR_IF(E_ACCESSDENIED, !isAppContainer);\nRETURN_HR(...);\n}\n~~~~\n@param token A token to get info about, or 'nullptr' to run as the current thread.\n@param value The result of the operation; `true` if the token represents an app container, `false` otherwise.\n*/\ninline HRESULT get_token_is_app_container_nothrow(_In_opt_ HANDLE token, bool& value)\n{\n    DWORD isAppContainer = 0;\n    DWORD returnLength = 0;\n    RETURN_IF_WIN32_BOOL_FALSE(::GetTokenInformation(\n        token ? token : GetCurrentThreadEffectiveToken(), TokenIsAppContainer, &isAppContainer, sizeof(isAppContainer), &returnLength));\n\n    value = (isAppContainer != 0);\n\n    return S_OK;\n}\n\n//! A variant of get_token_is_app_container_nothrow that fails-fast on errors retrieving the token information\ninline bool get_token_is_app_container_failfast(HANDLE token = nullptr)\n{\n    bool value = false;\n    FAIL_FAST_IF_FAILED(get_token_is_app_container_nothrow(token, value));\n\n    return value;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! A variant of get_token_is_app_container_nothrow that throws on errors retrieving the token information\ninline bool get_token_is_app_container(HANDLE token = nullptr)\n{\n    bool value = false;\n    THROW_IF_FAILED(get_token_is_app_container_nothrow(token, value));\n\n    return value;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n#endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8\n\ntemplate <typename... Ts>\nbool test_token_membership_failfast(_In_opt_ HANDLE token, const SID_IDENTIFIER_AUTHORITY& sidAuthority, Ts&&... subAuthorities)\n{\n    bool result;\n    FAIL_FAST_IF_FAILED(test_token_membership_nothrow(&result, token, sidAuthority, wistd::forward<Ts>(subAuthorities)...));\n    return result;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename... Ts>\nbool test_token_membership(_In_opt_ HANDLE token, const SID_IDENTIFIER_AUTHORITY& sidAuthority, Ts&&... subAuthorities)\n{\n    bool result;\n    THROW_IF_FAILED(test_token_membership_nothrow(&result, token, sidAuthority, wistd::forward<Ts>(subAuthorities)...));\n    return result;\n}\n#endif\n\n} // namespace wil\n\n#endif // __WIL_TOKEN_HELPERS_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/traceloggingconfig.h",
    "content": "#pragma once\n//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Various definitions for use in conjunction with TraceLogging APIs\n\n#ifndef __WIL_TRACELOGGING_CONFIG_H\n/// @cond\n#define __WIL_TRACELOGGING_CONFIG_H\n/// @endcond\n\n// Configuration macro for use in TRACELOGGING_DEFINE_PROVIDER. The definition\n// in this file configures the provider as a normal (non-telemetry) provider.\n#define TraceLoggingOptionMicrosoftTelemetry() // Empty definition for TraceLoggingOptionMicrosoftTelemetry\n\n// Configuration macro for use in TRACELOGGING_DEFINE_PROVIDER. The definition\n// in this file configures the provider as a normal (non-telemetry) provider.\n#define TraceLoggingOptionWindowsCoreTelemetry() // Empty definition for TraceLoggingOptionWindowsCoreTelemetry\n\n// Event privacy tags. Use the PDT macro values for the tag parameter, e.g.:\n// TraceLoggingWrite(...,\n//   TelemetryPrivacyDataTag(PDT_BrowsingHistory | PDT_ProductAndServiceUsage),\n//   ...);\n#define TelemetryPrivacyDataTag(tag) TraceLoggingUInt64((tag), \"PartA_PrivTags\")\n#define PDT_BrowsingHistory 0x0000000000000002u\n#define PDT_DeviceConnectivityAndConfiguration 0x0000000000000800u\n#define PDT_InkingTypingAndSpeechUtterance 0x0000000000020000u\n#define PDT_ProductAndServicePerformance 0x0000000001000000u\n#define PDT_ProductAndServiceUsage 0x0000000002000000u\n#define PDT_SoftwareSetupAndInventory 0x0000000080000000u\n\n// Event categories specified via keywords, e.g.:\n// TraceLoggingWrite(...,\n//     TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),\n//     ...);\n#define MICROSOFT_KEYWORD_CRITICAL_DATA 0x0000800000000000 // Bit 47\n#define MICROSOFT_KEYWORD_MEASURES 0x0000400000000000      // Bit 46\n#define MICROSOFT_KEYWORD_TELEMETRY 0x0000200000000000     // Bit 45\n#define MICROSOFT_KEYWORD_RESERVED_44 0x0000100000000000   // Bit 44 (reserved for future assignment)\n\n// Event categories specified via event tags, e.g.:\n// TraceLoggingWrite(...,\n//     TraceLoggingEventTag(MICROSOFT_EVENTTAG_REALTIME_LATENCY),\n//     ...);\n#define MICROSOFT_EVENTTAG_DROP_USER_IDS 0x00008000\n#define MICROSOFT_EVENTTAG_AGGREGATE 0x00010000\n#define MICROSOFT_EVENTTAG_DROP_PII_EXCEPT_IP 0x00020000\n#define MICROSOFT_EVENTTAG_COSTDEFERRED_LATENCY 0x00040000\n#define MICROSOFT_EVENTTAG_CORE_DATA 0x00080000\n#define MICROSOFT_EVENTTAG_INJECT_XTOKEN 0x00100000\n#define MICROSOFT_EVENTTAG_REALTIME_LATENCY 0x00200000\n#define MICROSOFT_EVENTTAG_NORMAL_LATENCY 0x00400000\n#define MICROSOFT_EVENTTAG_CRITICAL_PERSISTENCE 0x00800000\n#define MICROSOFT_EVENTTAG_NORMAL_PERSISTENCE 0x01000000\n#define MICROSOFT_EVENTTAG_DROP_PII 0x02000000\n#define MICROSOFT_EVENTTAG_HASH_PII 0x04000000\n#define MICROSOFT_EVENTTAG_MARK_PII 0x08000000\n\n// Field categories specified via field tags, e.g.:\n// TraceLoggingWrite(...,\n//     TraceLoggingString(szUser, \"UserName\", \"User's name\", MICROSOFT_FIELDTAG_HASH_PII),\n//     ...);\n#define MICROSOFT_FIELDTAG_DROP_PII 0x04000000\n#define MICROSOFT_FIELDTAG_HASH_PII 0x08000000\n#endif // __WIL_TRACELOGGING_CONFIG_H"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/win32_helpers.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Various types and helpers for interfacing with various Win32 APIs\n#ifndef __WIL_WIN32_HELPERS_INCLUDED\n#define __WIL_WIN32_HELPERS_INCLUDED\n\n#include <minwindef.h>    // FILETIME, HINSTANCE\n#include <sysinfoapi.h>   // GetSystemTimeAsFileTime\n#include <libloaderapi.h> // GetProcAddress\n#include <Psapi.h>        // GetModuleFileNameExW (macro), K32GetModuleFileNameExW\n#include <winreg.h>\n#include <objbase.h>\n\n#include \"common.h\"\n\n#if WIL_USE_STL\n#include <string>\n#if (__WI_LIBCPP_STD_VER >= 17) && WI_HAS_INCLUDE(<string_view>, 1) // Assume present if C++17\n#include <string_view>\n#endif\n#if (__WI_LIBCPP_STD_VER >= 20)\n#if WI_HAS_INCLUDE(<bit>, 1) // Assume present if C++20\n#include <bit>\n#endif\n#if WI_HAS_INCLUDE(<compare>, 1) // Assume present if C++20\n#include <compare>\n#endif\n#endif\n#endif\n\n/// @cond\n#if __cpp_lib_bit_cast >= 201806L\n#define __WI_CONSTEXPR_BIT_CAST constexpr\n#else\n#define __WI_CONSTEXPR_BIT_CAST inline\n#endif\n/// @endcond\n\n#include \"result.h\"\n#include \"resource.h\"\n#include \"wistd_functional.h\"\n#include \"wistd_type_traits.h\"\n\nEXTERN_C IMAGE_DOS_HEADER __ImageBase;\n\n/// @cond\nnamespace wistd\n{\n#if WIL_USE_STL && (__cpp_lib_three_way_comparison >= 201907L)\n\nusing weak_ordering = std::weak_ordering;\n\n#else\n\nstruct weak_ordering\n{\n    static const weak_ordering less;\n    static const weak_ordering equivalent;\n    static const weak_ordering greater;\n\n    [[nodiscard]] friend constexpr bool operator==(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value == 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator!=(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value != 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator<(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value < 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator>(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value > 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator<=(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value <= 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator>=(const weak_ordering left, std::nullptr_t) noexcept\n    {\n        return left.m_value >= 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator==(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right == 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator!=(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right != 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator<(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right > 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator>(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right < 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator<=(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right >= 0;\n    }\n\n    [[nodiscard]] friend constexpr bool operator>=(std::nullptr_t, const weak_ordering right) noexcept\n    {\n        return right <= 0;\n    }\n\n    signed char m_value;\n};\n\ninline constexpr weak_ordering weak_ordering::less{static_cast<signed char>(-1)};\ninline constexpr weak_ordering weak_ordering::equivalent{static_cast<signed char>(0)};\ninline constexpr weak_ordering weak_ordering::greater{static_cast<signed char>(1)};\n\n#endif\n} // namespace wistd\n/// @endcond\n\nnamespace wil\n{\n//! Strictly a function of the file system but this is the value for all known file system, NTFS, FAT.\n//! CDFs has a limit of 254.\nconstexpr size_t max_path_segment_length = 255;\n\n//! Character length not including the null, MAX_PATH (260) includes the null.\nconstexpr size_t max_path_length = 259;\n\n//! 32743 Character length not including the null. This is a system defined limit.\n//! The 24 is for the expansion of the roots from \"C:\" to \"\\Device\\HarddiskVolume4\"\n//! It will be 25 when there are more than 9 disks.\nconstexpr size_t max_extended_path_length = 0x7FFF - 24;\n\n//! For {guid} string form. Includes space for the null terminator.\nconstexpr size_t guid_string_buffer_length = 39;\n\n//! For {guid} string form. Not including the null terminator.\nconstexpr size_t guid_string_length = 38;\n\n#pragma region String and identifier comparisons\n// Using CompareStringOrdinal functions:\n//\n// Indentifiers require a locale-less (ordinal), and often case-insensitive, comparison (filenames, registry keys, XML node names,\n// etc). DO NOT use locale-sensitive (lexical) comparisons for resource identifiers (e.g.wcs*() functions in the CRT).\n\n#if WIL_USE_STL && (__cpp_lib_string_view >= 201606L)\n/// @cond\nnamespace details\n{\n    [[nodiscard]] inline int CompareStringOrdinal(std::wstring_view left, std::wstring_view right, bool caseInsensitive) WI_NOEXCEPT\n    {\n        // Casting from size_t (unsigned) to int (signed) should be safe from overrun to a negative,\n        // merely truncating the string.  CompareStringOrdinal should be resilient to negatives.\n        return ::CompareStringOrdinal(\n            left.data(), static_cast<int>(left.size()), right.data(), static_cast<int>(right.size()), caseInsensitive);\n    }\n} // namespace details\n/// @endcond\n\n[[nodiscard]] inline wistd::weak_ordering compare_string_ordinal(std::wstring_view left, std::wstring_view right, bool caseInsensitive) WI_NOEXCEPT\n{\n    switch (wil::details::CompareStringOrdinal(left, right, caseInsensitive))\n    {\n    case CSTR_LESS_THAN:\n        return wistd::weak_ordering::less;\n    case CSTR_GREATER_THAN:\n        return wistd::weak_ordering::greater;\n    default:\n        return wistd::weak_ordering::equivalent;\n    }\n}\n#endif\n\n#pragma endregion\n\n#pragma region FILETIME helpers\n// FILETIME duration values. FILETIME is in 100 nanosecond units.\nnamespace filetime_duration\n{\n    long long const one_millisecond = 10000LL;\n    long long const one_second = 10000000LL;\n    long long const one_minute = 10000000LL * 60;        // 600000000    or 600000000LL\n    long long const one_hour = 10000000LL * 60 * 60;     // 36000000000  or 36000000000LL\n    long long const one_day = 10000000LL * 60 * 60 * 24; // 864000000000 or 864000000000LL\n}; // namespace filetime_duration\n\nnamespace filetime\n{\n    constexpr unsigned long long to_int64(const FILETIME& ft) WI_NOEXCEPT\n    {\n#if __cpp_lib_bit_cast >= 201806L\n        return std::bit_cast<unsigned long long>(ft);\n#else\n        // Cannot reinterpret_cast FILETIME* to unsigned long long*\n        // due to alignment differences.\n        return (static_cast<unsigned long long>(ft.dwHighDateTime) << 32) + ft.dwLowDateTime;\n#endif\n    }\n\n    __WI_CONSTEXPR_BIT_CAST FILETIME from_int64(unsigned long long i64) WI_NOEXCEPT\n    {\n#if __cpp_lib_bit_cast >= 201806L\n        return std::bit_cast<FILETIME>(i64);\n#else\n        static_assert(sizeof(i64) == sizeof(FILETIME), \"sizes don't match\");\n        static_assert(__alignof(unsigned long long) >= __alignof(FILETIME), \"alignment not compatible with type pun\");\n        return *reinterpret_cast<FILETIME*>(&i64);\n#endif\n    }\n\n    __WI_CONSTEXPR_BIT_CAST FILETIME add(_In_ FILETIME const& ft, long long delta100ns) WI_NOEXCEPT\n    {\n        return from_int64(to_int64(ft) + delta100ns);\n    }\n\n    constexpr bool is_empty(const FILETIME& ft) WI_NOEXCEPT\n    {\n        return (ft.dwHighDateTime == 0) && (ft.dwLowDateTime == 0);\n    }\n\n    inline FILETIME get_system_time() WI_NOEXCEPT\n    {\n        FILETIME ft;\n        GetSystemTimeAsFileTime(&ft);\n        return ft;\n    }\n\n    /// Convert time as units of 100 nanoseconds to milliseconds. Fractional milliseconds are truncated.\n    constexpr unsigned long long convert_100ns_to_msec(unsigned long long time100ns) WI_NOEXCEPT\n    {\n        return time100ns / filetime_duration::one_millisecond;\n    }\n\n    /// Convert time as milliseconds to units of 100 nanoseconds.\n    constexpr unsigned long long convert_msec_to_100ns(unsigned long long timeMsec) WI_NOEXCEPT\n    {\n        return timeMsec * filetime_duration::one_millisecond;\n    }\n\n#if (defined(_APISETREALTIME_) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7)) || defined(WIL_DOXYGEN)\n    /// Returns the current unbiased interrupt-time count, in units of 100 nanoseconds. The unbiased interrupt-time count does not\n    /// include time the system spends in sleep or hibernation.\n    ///\n    /// This API avoids prematurely shortcircuiting timing loops due to system sleep/hibernation.\n    ///\n    /// This is equivalent to GetTickCount64() except it returns units of 100 nanoseconds instead of milliseconds, and it doesn't\n    /// include time the system spends in sleep or hibernation.\n    /// For example\n    ///\n    ///     start = GetTickCount64();\n    ///     hibernate();\n    ///     ...wake from hibernation 30 minutes later...;\n    ///     elapsed = GetTickCount64() - start;\n    ///     // elapsed = 30min\n    ///\n    /// Do the same using unbiased interrupt-time and elapsed is 0 (or nearly so).\n    ///\n    /// @note This is identical to QueryUnbiasedInterruptTime() but returns the value as a return value (rather than an out\n    ///       parameter).\n    /// @see https://msdn.microsoft.com/en-us/library/windows/desktop/ee662307(v=vs.85).aspx\n    inline unsigned long long QueryUnbiasedInterruptTimeAs100ns() WI_NOEXCEPT\n    {\n        ULONGLONG now{};\n        QueryUnbiasedInterruptTime(&now);\n        return now;\n    }\n\n    /// Returns the current unbiased interrupt-time count, in units of milliseconds. The unbiased interrupt-time count does not\n    /// include time the system spends in sleep or hibernation.\n    /// @see QueryUnbiasedInterruptTimeAs100ns\n    inline unsigned long long QueryUnbiasedInterruptTimeAsMSec() WI_NOEXCEPT\n    {\n        return convert_100ns_to_msec(QueryUnbiasedInterruptTimeAs100ns());\n    }\n#endif // _APISETREALTIME_\n} // namespace filetime\n#pragma endregion\n\n#pragma region RECT helpers\ntemplate <typename rect_type>\nconstexpr auto rect_width(rect_type const& rect)\n{\n    return rect.right - rect.left;\n}\n\ntemplate <typename rect_type>\nconstexpr auto rect_height(rect_type const& rect)\n{\n    return rect.bottom - rect.top;\n}\n\ntemplate <typename rect_type>\nconstexpr auto rect_is_empty(rect_type const& rect)\n{\n    return (rect.left >= rect.right) || (rect.top >= rect.bottom);\n}\n\ntemplate <typename rect_type, typename point_type>\nconstexpr auto rect_contains_point(rect_type const& rect, point_type const& point)\n{\n    return (point.x >= rect.left) && (point.x < rect.right) && (point.y >= rect.top) && (point.y < rect.bottom);\n}\n\ntemplate <typename rect_type, typename length_type>\nconstexpr rect_type rect_from_size(length_type x, length_type y, length_type width, length_type height)\n{\n    rect_type rect;\n    rect.left = x;\n    rect.top = y;\n    rect.right = x + width;\n    rect.bottom = y + height;\n    return rect;\n}\n#pragma endregion\n\n// Use to adapt Win32 APIs that take a fixed size buffer into forms that return\n// an allocated buffer. Supports many types of string representation.\n// See comments below on the expected behavior of the callback.\n// Adjust stackBufferLength based on typical result sizes to optimize use and\n// to test the boundary cases.\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT AdaptFixedSizeToAllocatedResult(string_type& result, wistd::function<HRESULT(PWSTR, size_t, size_t*)> callback) WI_NOEXCEPT\n{\n    details::string_maker<string_type> maker;\n\n    wchar_t value[stackBufferLength]{};\n    size_t valueLengthNeededWithNull{}; // callback returns the number of characters needed including the null terminator.\n    RETURN_IF_FAILED_EXPECTED(callback(value, ARRAYSIZE(value), &valueLengthNeededWithNull));\n    WI_ASSERT(valueLengthNeededWithNull > 0);\n    if (valueLengthNeededWithNull <= ARRAYSIZE(value))\n    {\n        // Success case as described above, make() adds the space for the null.\n        RETURN_IF_FAILED(maker.make(value, valueLengthNeededWithNull - 1));\n    }\n    else\n    {\n        // Did not fit in the stack allocated buffer, need to do 2 phase construction.\n        // May need to loop more than once if external conditions cause the value to change.\n        size_t bufferLength;\n        do\n        {\n            bufferLength = valueLengthNeededWithNull;\n            // bufferLength includes the null so subtract that as make() will add space for it.\n            RETURN_IF_FAILED(maker.make(nullptr, bufferLength - 1));\n\n            RETURN_IF_FAILED_EXPECTED(callback(maker.buffer(), bufferLength, &valueLengthNeededWithNull));\n            WI_ASSERT(valueLengthNeededWithNull > 0);\n\n            // If the value shrunk, then adjust the string to trim off the excess buffer.\n            if (valueLengthNeededWithNull < bufferLength)\n            {\n                RETURN_IF_FAILED(maker.trim_at_existing_null(valueLengthNeededWithNull - 1));\n            }\n        } while (valueLengthNeededWithNull > bufferLength);\n    }\n    result = maker.release();\n    return S_OK;\n}\n\n/** Expands the '%' quoted environment variables in 'input' using ExpandEnvironmentStringsW(); */\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT ExpandEnvironmentStringsW(_In_ PCWSTR input, string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            *valueLengthNeededWithNul = ::ExpandEnvironmentStringsW(input, value, static_cast<DWORD>(valueLength));\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNul == 0);\n            return S_OK;\n        });\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n/** Searches for a specified file in a specified path using ExpandEnvironmentStringsW(); */\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT SearchPathW(_In_opt_ PCWSTR path, _In_ PCWSTR fileName, _In_opt_ PCWSTR extension, string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            *valueLengthNeededWithNul = ::SearchPathW(path, fileName, extension, static_cast<DWORD>(valueLength), value, nullptr);\n\n            if (*valueLengthNeededWithNul == 0)\n            {\n                // ERROR_FILE_NOT_FOUND is an expected return value for SearchPathW\n                const HRESULT searchResult = HRESULT_FROM_WIN32(::GetLastError());\n                RETURN_HR_IF_EXPECTED(searchResult, searchResult == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));\n                RETURN_IF_FAILED(searchResult);\n            }\n\n            // AdaptFixedSizeToAllocatedResult expects that the length will always include the NUL.\n            // If the result is copied to the buffer, SearchPathW returns the length of copied string, WITHOUT the NUL.\n            // If the buffer is too small to hold the result, SearchPathW returns the length of the required buffer WITH the nul.\n            if (*valueLengthNeededWithNul < valueLength)\n            {\n                (*valueLengthNeededWithNul)++; // It fit, account for the null.\n            }\n            return S_OK;\n        });\n}\n\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT QueryFullProcessImageNameW(HANDLE processHandle, _In_ DWORD flags, string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            DWORD lengthToUse = static_cast<DWORD>(valueLength);\n            BOOL const success = ::QueryFullProcessImageNameW(processHandle, flags, value, &lengthToUse);\n            RETURN_LAST_ERROR_IF((success == FALSE) && (::GetLastError() != ERROR_INSUFFICIENT_BUFFER));\n\n            // On success, return the amount used; on failure, try doubling\n            *valueLengthNeededWithNul = success ? (static_cast<size_t>(lengthToUse) + 1) : (static_cast<size_t>(lengthToUse) * 2);\n            return S_OK;\n        });\n}\n\n/** Expands environment strings and checks path existence with SearchPathW */\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT ExpandEnvAndSearchPath(_In_ PCWSTR input, string_type& result) WI_NOEXCEPT\n{\n    wil::unique_cotaskmem_string expandedName;\n    RETURN_IF_FAILED((wil::ExpandEnvironmentStringsW<string_type, stackBufferLength>(input, expandedName)));\n\n    // ERROR_FILE_NOT_FOUND is an expected return value for SearchPathW\n    const HRESULT searchResult = (wil::SearchPathW<string_type, stackBufferLength>(nullptr, expandedName.get(), nullptr, result));\n    RETURN_HR_IF_EXPECTED(searchResult, searchResult == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));\n    RETURN_IF_FAILED(searchResult);\n\n    return S_OK;\n}\n#endif\n\n/** Looks up the environment variable 'key' and fails if it is not found. */\ntemplate <typename string_type, size_t initialBufferLength = 128>\ninline HRESULT GetEnvironmentVariableW(_In_ PCWSTR key, string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, initialBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            // If the function succeeds, the return value is the number of characters stored in the buffer\n            // pointed to by lpBuffer, not including the terminating null character.\n            //\n            // If lpBuffer is not large enough to hold the data, the return value is the buffer size, in\n            // characters, required to hold the string and its terminating null character and the contents of\n            // lpBuffer are undefined.\n            //\n            // If the function fails, the return value is zero. If the specified environment variable was not\n            // found in the environment block, GetLastError returns ERROR_ENVVAR_NOT_FOUND.\n\n            ::SetLastError(ERROR_SUCCESS);\n\n            *valueLengthNeededWithNul = ::GetEnvironmentVariableW(key, value, static_cast<DWORD>(valueLength));\n            RETURN_LAST_ERROR_IF_EXPECTED((*valueLengthNeededWithNul == 0) && (::GetLastError() != ERROR_SUCCESS));\n            if (*valueLengthNeededWithNul < valueLength)\n            {\n                (*valueLengthNeededWithNul)++; // It fit, account for the null.\n            }\n            return S_OK;\n        });\n}\n\n/** Looks up the environment variable 'key' and returns null if it is not found. */\ntemplate <typename string_type, size_t initialBufferLength = 128>\nHRESULT TryGetEnvironmentVariableW(_In_ PCWSTR key, string_type& result) WI_NOEXCEPT\n{\n    const auto hr = wil::GetEnvironmentVariableW<string_type, initialBufferLength>(key, result);\n    RETURN_HR_IF(hr, FAILED(hr) && (hr != HRESULT_FROM_WIN32(ERROR_ENVVAR_NOT_FOUND)));\n    return S_OK;\n}\n\n/** Retrieves the fully qualified path for the file containing the specified module loaded\nby a given process. Note GetModuleFileNameExW is a macro.*/\ntemplate <typename string_type, size_t initialBufferLength = 128>\nHRESULT GetModuleFileNameExW(_In_opt_ HANDLE process, _In_opt_ HMODULE module, string_type& path) WI_NOEXCEPT\n{\n    auto adapter = [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n        DWORD copiedCount{};\n        size_t valueUsedWithNul{};\n        bool copyFailed{};\n        bool copySucceededWithNoTruncation{};\n        if (process != nullptr)\n        {\n            // GetModuleFileNameExW truncates and provides no error or other indication it has done so.\n            // The only way to be sure it didn't truncate is if it didn't need the whole buffer. The\n            // count copied to the buffer includes the nul-character as well.\n            copiedCount = ::GetModuleFileNameExW(process, module, value, static_cast<DWORD>(valueLength));\n            valueUsedWithNul = static_cast<size_t>(copiedCount) + 1;\n            copyFailed = (0 == copiedCount);\n            copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength - 1);\n        }\n        else\n        {\n            // In cases of insufficient buffer, GetModuleFileNameW will return a value equal to lengthWithNull\n            // and set the last error to ERROR_INSUFFICIENT_BUFFER. The count returned does not include\n            // the nul-character\n            copiedCount = ::GetModuleFileNameW(module, value, static_cast<DWORD>(valueLength));\n            valueUsedWithNul = static_cast<size_t>(copiedCount) + 1;\n            copyFailed = (0 == copiedCount);\n            copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength);\n        }\n\n        RETURN_LAST_ERROR_IF(copyFailed);\n\n        // When the copy truncated, request another try with more space.\n        *valueLengthNeededWithNul = copySucceededWithNoTruncation ? valueUsedWithNul : (valueLength * 2);\n\n        return S_OK;\n    };\n\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, initialBufferLength>(path, wistd::move(adapter));\n}\n\n/** Retrieves the fully qualified path for the file that contains the specified module.\nThe module must have been loaded by the current process. The path returned will use the\nsame format that was specified when the module was loaded. Therefore, the path can be a\nlong or short file name, and can have the prefix '\\\\?\\'. */\ntemplate <typename string_type, size_t initialBufferLength = 128>\nHRESULT GetModuleFileNameW(HMODULE module, string_type& path) WI_NOEXCEPT\n{\n    return wil::GetModuleFileNameExW<string_type, initialBufferLength>(nullptr, module, path);\n}\n\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT GetSystemDirectoryW(string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            *valueLengthNeededWithNul = ::GetSystemDirectoryW(value, static_cast<DWORD>(valueLength));\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNul == 0);\n            if (*valueLengthNeededWithNul < valueLength)\n            {\n                (*valueLengthNeededWithNul)++; // it fit, account for the null\n            }\n            return S_OK;\n        });\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\ntemplate <typename string_type, size_t stackBufferLength = 256>\nHRESULT GetWindowsDirectoryW(string_type& result) WI_NOEXCEPT\n{\n    return wil::AdaptFixedSizeToAllocatedResult<string_type, stackBufferLength>(\n        result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT {\n            *valueLengthNeededWithNul = ::GetWindowsDirectoryW(value, static_cast<DWORD>(valueLength));\n            RETURN_LAST_ERROR_IF(*valueLengthNeededWithNul == 0);\n            if (*valueLengthNeededWithNul < valueLength)\n            {\n                (*valueLengthNeededWithNul)++; // it fit, account for the null\n            }\n            return S_OK;\n        });\n}\n#endif\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Expands the '%' quoted environment variables in 'input' using ExpandEnvironmentStringsW(); */\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type ExpandEnvironmentStringsW(_In_ PCWSTR input)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::ExpandEnvironmentStringsW<string_type, stackBufferLength>(input, result)));\n    return result;\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n/** Searches for a specified file in a specified path using SearchPathW*/\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type TrySearchPathW(_In_opt_ PCWSTR path, _In_ PCWSTR fileName, PCWSTR _In_opt_ extension)\n{\n    string_type result{};\n    HRESULT searchHR = wil::SearchPathW<string_type, stackBufferLength>(path, fileName, extension, result);\n    THROW_HR_IF(searchHR, FAILED(searchHR) && (searchHR != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)));\n    return result;\n}\n#endif\n\n/** Looks up the environment variable 'key' and fails if it is not found. */\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t initialBufferLength = 128>\nstring_type GetEnvironmentVariableW(_In_ PCWSTR key)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::GetEnvironmentVariableW<string_type, initialBufferLength>(key, result)));\n    return result;\n}\n\n/** Looks up the environment variable 'key' and returns null if it is not found. */\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t initialBufferLength = 128>\nstring_type TryGetEnvironmentVariableW(_In_ PCWSTR key)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::TryGetEnvironmentVariableW<string_type, initialBufferLength>(key, result)));\n    return result;\n}\n\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t initialBufferLength = 128>\nstring_type GetModuleFileNameW(HMODULE module = nullptr /* current process module */)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::GetModuleFileNameW<string_type, initialBufferLength>(module, result)));\n    return result;\n}\n\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t initialBufferLength = 128>\nstring_type GetModuleFileNameExW(HANDLE process, HMODULE module)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::GetModuleFileNameExW<string_type, initialBufferLength>(process, module, result)));\n    return result;\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type GetWindowsDirectoryW()\n{\n    string_type result;\n    THROW_IF_FAILED((wil::GetWindowsDirectoryW<string_type, stackBufferLength>(result)));\n    return result;\n}\n#endif\n\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type GetSystemDirectoryW()\n{\n    string_type result;\n    THROW_IF_FAILED((wil::GetSystemDirectoryW<string_type, stackBufferLength>(result)));\n    return result;\n}\n\ntemplate <typename string_type = wil::unique_cotaskmem_string, size_t stackBufferLength = 256>\nstring_type QueryFullProcessImageNameW(HANDLE processHandle = GetCurrentProcess(), DWORD flags = 0)\n{\n    string_type result{};\n    THROW_IF_FAILED((wil::QueryFullProcessImageNameW<string_type, stackBufferLength>(processHandle, flags, result)));\n    return result;\n}\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n// Lookup a DWORD value under HKLM\\...\\Image File Execution Options\\<current process name>\ninline DWORD GetCurrentProcessExecutionOption(PCWSTR valueName, DWORD defaultValue = 0)\n{\n    auto filePath = wil::GetModuleFileNameW<wil::unique_cotaskmem_string>();\n    if (auto lastSlash = wcsrchr(filePath.get(), L'\\\\'))\n    {\n        const auto fileName = lastSlash + 1;\n        auto keyPath = wil::str_concat<wil::unique_cotaskmem_string>(\n            LR\"(SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\)\", fileName);\n        DWORD value{}, sizeofValue = sizeof(value);\n        if (::RegGetValueW(\n                HKEY_LOCAL_MACHINE,\n                keyPath.get(),\n                valueName,\n#ifdef RRF_SUBKEY_WOW6464KEY\n                RRF_RT_REG_DWORD | RRF_SUBKEY_WOW6464KEY,\n#else\n                RRF_RT_REG_DWORD,\n#endif\n                nullptr,\n                &value,\n                &sizeofValue) == ERROR_SUCCESS)\n        {\n            return value;\n        }\n    }\n    return defaultValue;\n}\n\n#ifndef DebugBreak // Some code defines 'DebugBreak' to garbage to force build breaks in release builds\n// Waits for a debugger to attach to the current process based on registry configuration.\n//\n// Example:\n//     HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\explorer.exe\n//         WaitForDebuggerPresent=1\n//\n// REG_DWORD value of\n//     missing or 0 -> don't break\n//     1 -> wait for the debugger, continue execution once it is attached\n//     2 -> wait for the debugger, break here once attached.\ninline void WaitForDebuggerPresent(bool checkRegistryConfig = true)\n{\n    for (;;)\n    {\n        auto configValue = checkRegistryConfig ? GetCurrentProcessExecutionOption(L\"WaitForDebuggerPresent\") : 1;\n        if (configValue == 0)\n        {\n            return; // not configured, don't wait\n        }\n\n        if (IsDebuggerPresent())\n        {\n            if (configValue == 2)\n            {\n                DebugBreak(); // debugger attached, SHIFT+F11 to return to the caller\n            }\n            return; // debugger now attached, continue executing\n        }\n        Sleep(500);\n    }\n}\n#endif\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n#endif\n\n/** Retrieve the HINSTANCE for the current DLL or EXE using this symbol that\nthe linker provides for every module. This avoids the need for a global HINSTANCE variable\nand provides access to this value for static libraries. */\ninline HINSTANCE GetModuleInstanceHandle() WI_NOEXCEPT\n{\n    return reinterpret_cast<HINSTANCE>(&__ImageBase);\n}\n\n// GetModuleHandleExW was added to the app partition in version 22000 of the SDK\n#if defined(NTDDI_WIN10_CO) ? WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) \\\n                            : WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n// Use this in threads that can outlive the object or API call that created them.\n// Without this COM, or the API caller, can unload the DLL, resulting in a crash.\n// It is very important that this be the first object created in the thread proc\n// as when this runs down the thread exits and no destructors of objects created before\n// it will run.\n[[nodiscard]] inline auto get_module_reference_for_thread() noexcept\n{\n    HMODULE thisModule{};\n    FAIL_FAST_IF(!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, L\"\", &thisModule));\n    return wil::scope_exit([thisModule] {\n        FreeLibraryAndExitThread(thisModule, 0);\n    });\n}\n#endif\n\n/// @cond\nnamespace details\n{\n    class init_once_completer\n    {\n        INIT_ONCE& m_once;\n        unsigned long m_flags = INIT_ONCE_INIT_FAILED;\n\n    public:\n        init_once_completer(_In_ INIT_ONCE& once) WI_NOEXCEPT : m_once(once)\n        {\n        }\n\n#pragma warning(push)\n#pragma warning(disable : 4702) // https://github.com/Microsoft/wil/issues/2\n        void success() WI_NOEXCEPT\n        {\n            m_flags = 0;\n        }\n#pragma warning(pop)\n\n        ~init_once_completer() WI_NOEXCEPT\n        {\n            ::InitOnceComplete(&m_once, m_flags, nullptr);\n        }\n    };\n} // namespace details\n/// @endcond\n\n/** Performs one-time initialization\nSimplifies using the Win32 INIT_ONCE structure to perform one-time initialization. The provided `func` is invoked\nat most once.\n~~~~\nINIT_ONCE g_init{};\nComPtr<IFoo> g_foo;\nHRESULT MyMethod()\n{\n    bool winner = false;\n    RETURN_IF_FAILED(wil::init_once_nothrow(g_init, []\n    {\n        ComPtr<IFoo> foo;\n        RETURN_IF_FAILED(::CoCreateInstance(..., IID_PPV_ARGS(&foo));\n        RETURN_IF_FAILED(foo->Startup());\n        g_foo = foo;\n    }, &winner);\n    if (winner)\n    {\n        RETURN_IF_FAILED(g_foo->Another());\n    }\n    return S_OK;\n}\n~~~~\nSee MSDN for more information on `InitOnceExecuteOnce`.\n@param initOnce The INIT_ONCE structure to use as context for initialization.\n@param func A function that will be invoked to perform initialization. If this fails, the init call\n        fails and the once-init is not marked as initialized. A later caller could attempt to\n        initialize it a second time.\n@param callerCompleted Set to 'true' if this was the call that caused initialization, false otherwise.\n*/\ntemplate <typename T>\nHRESULT init_once_nothrow(_Inout_ INIT_ONCE& initOnce, T func, _Out_opt_ bool* callerCompleted = nullptr) WI_NOEXCEPT\n{\n    BOOL pending = FALSE;\n    wil::assign_to_opt_param(callerCompleted, false);\n\n    __WIL_PRIVATE_RETURN_IF_WIN32_BOOL_FALSE(InitOnceBeginInitialize(&initOnce, 0, &pending, nullptr));\n\n    if (pending)\n    {\n        details::init_once_completer completion(initOnce);\n        __WIL_PRIVATE_RETURN_IF_FAILED(func());\n        completion.success();\n        wil::assign_to_opt_param(callerCompleted, true);\n    }\n\n    return S_OK;\n}\n\n//! Similar to init_once_nothrow, but fails-fast if the initialization step failed. The 'callerComplete' value is\n//! returned to the caller instead of being an out-parameter.\ntemplate <typename T>\nbool init_once_failfast(_Inout_ INIT_ONCE& initOnce, T&& func) WI_NOEXCEPT\n{\n    bool callerCompleted;\n\n    FAIL_FAST_IF_FAILED(init_once_nothrow(initOnce, wistd::forward<T>(func), &callerCompleted));\n\n    return callerCompleted;\n};\n\n//! Returns 'true' if this `init_once` structure has finished initialization, false otherwise.\ninline bool init_once_initialized(_Inout_ INIT_ONCE& initOnce) WI_NOEXCEPT\n{\n    BOOL pending = FALSE;\n    return ::InitOnceBeginInitialize(&initOnce, INIT_ONCE_CHECK_ONLY, &pending, nullptr) && !pending;\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n/** Performs one-time initialization\nSimplifies using the Win32 INIT_ONCE structure to perform one-time initialization. The provided `func` is invoked\nat most once.\n~~~~\nINIT_ONCE g_init{};\nComPtr<IFoo> g_foo;\nvoid MyMethod()\n{\n    bool winner = wil::init_once(g_init, []\n    {\n        ComPtr<IFoo> foo;\n        THROW_IF_FAILED(::CoCreateInstance(..., IID_PPV_ARGS(&foo));\n        THROW_IF_FAILED(foo->Startup());\n        g_foo = foo;\n    });\n    if (winner)\n    {\n        THROW_IF_FAILED(g_foo->Another());\n    }\n}\n~~~~\nSee MSDN for more information on `InitOnceExecuteOnce`.\n@param initOnce The INIT_ONCE structure to use as context for initialization.\n@param func A function that will be invoked to perform initialization. If this fails, the init call\n        fails and the once-init is not marked as initialized. A later caller could attempt to\n        initialize it a second time.\n@returns 'true' if this was the call that caused initialization, false otherwise.\n*/\ntemplate <typename T>\nbool init_once(_Inout_ INIT_ONCE& initOnce, T func)\n{\n    BOOL pending = FALSE;\n\n    THROW_IF_WIN32_BOOL_FALSE(::InitOnceBeginInitialize(&initOnce, 0, &pending, nullptr));\n\n    if (pending)\n    {\n        details::init_once_completer completion(initOnce);\n        func();\n        completion.success();\n        return true;\n    }\n    else\n    {\n        return false;\n    }\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#if WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS) && (__cpp_lib_string_view >= 201606L)\n/// @cond\nnamespace details\n{\n    template <typename RangeT>\n    struct deduce_char_type_from_string_range\n    {\n        template <typename T = RangeT>\n        static auto deduce(T& range)\n        {\n            using std::begin;\n            return (*begin(range))[0];\n        }\n\n        using type = decltype(deduce(wistd::declval<RangeT&>()));\n    };\n\n    template <typename RangeT>\n    using deduce_char_type_from_string_range_t = typename deduce_char_type_from_string_range<RangeT>::type;\n\n    // Internal helper span-like type for passing arrays as an iterable collection\n    template <typename T>\n    struct iterable_span\n    {\n        T* pointer;\n        size_t size;\n\n        constexpr T* begin() const noexcept\n        {\n            return pointer;\n        }\n\n        constexpr T* end() const noexcept\n        {\n            return pointer + size;\n        }\n    };\n} // namespace details\n/// @endcond\n\n//! Flags that control the behavior of `ArgvToCommandLine`\nenum class ArgvToCommandLineFlags : uint8_t\n{\n    None = 0,\n\n    //! By default, arguments are only surrounded by quotes when necessary (i.e. the argument contains a space). When\n    //! this flag is specified, all arguments are surrounded with quotes, regardless of whether or not they contain\n    //! space(s). This is an optimization as it means that we are not required to search for spaces in each argument and\n    //! we don't need to potentially go back and insert a quotation character in the middle of the string after we've\n    //! already written part of the argument to the result. That said, wrapping all arguments with quotes can have some\n    //! adverse effects with some applications, most notably cmd.exe, which do their own command line processing.\n    ForceQuotes = 0x01 << 0,\n\n    //! `CommandLineToArgvW` has an \"optimization\" that assumes that the first argument is the path to an executable.\n    //! Because valid NTFS paths cannot contain quotation characters, `CommandLineToArgvW` disables its quote escaping\n    //! logic for the first argument. By default, `ArgvToCommandLine` aims to ensure that an argv array can \"round trip\"\n    //! to a string and back, meaning it tries to replicate this logic in reverse. This flag disables this logic and\n    //! escapes backslashes and quotes the same for all arguments, including the first one. This is useful if the output\n    //! string is only an intermediate command line string (e.g. if the executable path is prepended later).\n    FirstArgumentIsNotPath = 0x01 << 1,\n};\nDEFINE_ENUM_FLAG_OPERATORS(ArgvToCommandLineFlags);\n\n//! Performs the reverse operation of CommandLineToArgvW.\n//! Converts an argv array to a command line string that is guaranteed to \"round trip\" with CommandLineToArgvW. That is,\n//! a call to wil::ArgvToCommandLine followed by a call to ArgvToCommandLineW will produce the same array that was\n//! passed to wil::ArgvToCommandLine. Note that the reverse is not true. I.e. calling ArgvToCommandLineW followed by\n//! wil::ArgvToCommandLine will not produce the original string due to the optionality of of quotes in the command line\n//! string. This functionality is useful in a number of scenarios, most notably:\n//!     1.  When implementing a \"driver\" application. That is, an application that consumes some command line arguments,\n//!         translates others into new arguments, and preserves the rest, \"forwarding\" the resulting command line to a\n//!         separate application.\n//!     2.  When reading command line arguments from some data storage, e.g. from a JSON array, which then need to get\n//!         compiled into a command line string that's used for creating a new process.\n//! Unlike CommandLineToArgvW, this function accepts both \"narrow\" and \"wide\" strings to support calling both\n//! CreateProcessW and CreateProcessA with the result. See the values in @ref wil::ArgvToCommandLineFlags for more\n//! information on how to control the behavior of this function as well as scenarios when you may want to use each one.\ntemplate <typename RangeT, typename CharT = details::deduce_char_type_from_string_range_t<RangeT>>\ninline std::basic_string<CharT> ArgvToCommandLine(RangeT&& range, ArgvToCommandLineFlags flags = ArgvToCommandLineFlags::None)\n{\n    using string_type = std::basic_string<CharT>;\n    using string_view_type = std::basic_string_view<CharT>;\n\n    // Somewhat of a hack to avoid the fact that we can't conditionalize a string literal on a template\n    static constexpr const CharT empty_string[] = {'\\0'};\n    static constexpr const CharT single_quote_string[] = {'\"', '\\0'};\n    static constexpr const CharT space_string[] = {' ', '\\0'};\n    static constexpr const CharT quoted_space_string[] = {'\"', ' ', '\"', '\\0'};\n\n    static constexpr const CharT search_string_no_space[] = {'\\\\', '\"', '\\0'};\n    static constexpr const CharT search_string_with_space[] = {'\\\\', '\"', ' ', '\\t', '\\0'};\n\n    const bool forceQuotes = WI_IsFlagSet(flags, ArgvToCommandLineFlags::ForceQuotes);\n    const CharT* const initialSearchString = forceQuotes ? search_string_no_space : search_string_with_space;\n    const CharT* prefix = forceQuotes ? single_quote_string : empty_string;\n    const CharT* const nextPrefix = forceQuotes ? quoted_space_string : space_string;\n\n    string_type result;\n    int index = 0;\n    for (auto&& strRaw : range)\n    {\n        auto currentIndex = index++;\n        result += prefix;\n\n        const CharT* searchString = initialSearchString;\n\n        // Info just in case we need to come back and insert quotes\n        auto startPos = result.size();\n        bool terminateWithQuotes = false; // With forceQuotes == true, this is baked into the prefix\n\n        // We need to escape any quotes and CONDITIONALLY any backslashes\n        string_view_type str(strRaw);\n        size_t pos = 0;\n        while (pos < str.size())\n        {\n            auto nextPos = str.find_first_of(searchString, pos);\n            if ((nextPos != str.npos) && ((str[nextPos] == ' ') || (str[nextPos] == '\\t')))\n            {\n                // Insert the quote now since we'll need to otherwise stomp over data we're about to write\n                // NOTE: By updating the search string here, we don't need to worry about manually inserting the\n                // character later since we'll just include it in our next iteration\n                WI_ASSERT(!forceQuotes);               // Otherwise, shouldn't be part of our search string\n                searchString = search_string_no_space; // We're already adding a quote; don't do it again\n                result.insert(startPos, 1, '\"');\n                terminateWithQuotes = true;\n            }\n\n            result.append(str, pos, nextPos - pos);\n            pos = nextPos;\n            if (pos == str.npos)\n                break;\n\n            if (str[pos] == '\"')\n            {\n                // Kinda easy case; just escape the quotes, *unless* this is the first argument and we assume a path\n                if ((currentIndex > 0) || WI_IsFlagSet(flags, ArgvToCommandLineFlags::FirstArgumentIsNotPath))\n                {\n                    result.append({'\\\\', '\"'}); // Escape case\n                }\n                else\n                {\n                    // Realistically, this likely signals a bug since paths cannot contain quotes. That said, the\n                    // behavior of CommandLineToArgvW is to just preserve \"interior\" quotes, so we do that.\n                    // NOTE: 'CommandLineToArgvW' treats \"interior\" quotes as terminating quotes when the executable\n                    // path begins with a quote, even if the next character is not a space. This assert won't catch all\n                    // of such issues as we may detect a space, and therefore the need to surroud the argument with\n                    // quotes, later in the string; this is best effort. Such arguments wouldn't be valid and are not\n                    // representable anyway\n                    WI_ASSERT((pos > 0) && !WI_IsFlagSet(flags, ArgvToCommandLineFlags::ForceQuotes) && !terminateWithQuotes);\n                    result.push_back('\"'); // Not escaping case\n                }\n                ++pos; // Skip past quote on next search\n            }\n            else if (str[pos] == '\\\\')\n            {\n                // More complex case... Only need to escape if followed by 0+ backslashes and then either a quote or\n                // the end of the string and we're adding quotes\n                nextPos = str.find_first_not_of(L'\\\\', pos);\n\n                // NOTE: This is an optimization taking advantage of the fact that doing a double append of 1+\n                // backslashes will be functionally equivalent to escaping each one. This copies all of the backslashes\n                // once. We _might_ do it again later\n                result.append(str, pos, nextPos - pos);\n\n                // If this is the first argument and is being interpreted as a path, we never escape slashes\n                if ((currentIndex == 0) && !WI_IsFlagSet(flags, ArgvToCommandLineFlags::FirstArgumentIsNotPath))\n                {\n                    pos = nextPos;\n                    continue;\n                }\n\n                if ((nextPos != str.npos) && (str[nextPos] != L'\"'))\n                {\n                    // Simplest case... don't need to escape when followed by a non-quote character\n                    pos = nextPos;\n                    continue;\n                }\n\n                // If this is the end of the string and we're not appending a quotation to the end, we're in the\n                // same boat as the above where we don't need to escape\n                if ((nextPos == str.npos) && !forceQuotes && !terminateWithQuotes)\n                {\n                    pos = nextPos;\n                    continue;\n                }\n\n                // Otherwise, we need to escape all backslashes. See above; this can be done with another append\n                result.append(str, pos, nextPos - pos);\n                pos = nextPos;\n                if (pos != str.npos)\n                {\n                    // Must be followed by a quote; make sure we escape it, too. NOTE: We should have already early\n                    // exited if this argument is being interpreted as an executable path\n                    WI_ASSERT(str[pos] == '\"');\n                    result.append({'\\\\', '\"'});\n                    ++pos;\n                }\n            }\n            else\n            {\n                // Otherwise space, which we handled above\n                WI_ASSERT((str[pos] == ' ') || (str[pos] == '\\t'));\n            }\n        }\n\n        if (terminateWithQuotes)\n        {\n            result.push_back('\"');\n        }\n\n        prefix = nextPrefix;\n    }\n\n    // NOTE: We optimize the force quotes case by including them in the prefix string. We're not appending a prefix\n    // anymore, so we need to make sure we close off the string\n    if (forceQuotes)\n    {\n        result.push_back(L'\\\"');\n    }\n\n    return result;\n}\n\ntemplate <typename CharT>\ninline std::basic_string<wistd::remove_cv_t<CharT>> ArgvToCommandLine(\n    int argc, CharT* const* argv, ArgvToCommandLineFlags flags = ArgvToCommandLineFlags::None)\n{\n    return ArgvToCommandLine(details::iterable_span<CharT* const>{argv, static_cast<size_t>(argc)}, flags);\n}\n#endif\n} // namespace wil\n\n// Macro for calling GetProcAddress(), with type safety for C++ clients\n// using the type information from the specified function.\n// The return value is automatically cast to match the function prototype of the input function.\n//\n// Sample usage:\n//\n// auto sendMail = GetProcAddressByFunctionDeclaration(hinstMAPI, MAPISendMailW);\n// if (sendMail)\n// {\n//    sendMail(0, 0, pmm, MAPI_USE_DEFAULT, 0);\n// }\n//  Declaration\n#define GetProcAddressByFunctionDeclaration(hinst, fn) reinterpret_cast<decltype(::fn)*>(GetProcAddress(hinst, #fn))\n\n#endif // __WIL_WIN32_HELPERS_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/win32_result_macros.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! WIL Error Handling Helpers: supporting file defining a family of macros and functions designed to uniformly handle errors\n//! across return codes, fail fast, exceptions and logging for Win32 error codes.\n#ifndef __WIL_WIN32_RESULTMACROS_INCLUDED\n#define __WIL_WIN32_RESULTMACROS_INCLUDED\n\n#include \"result_macros.h\"\n\n// Helpers for return macros\n/// @cond\n#define __WIN32_RETURN_WIN32(error, str) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __error = (error); \\\n        if (FAILED_WIN32(__error)) \\\n        { \\\n            __R_FN(Return_Win32)(__R_INFO(str) __error); \\\n        } \\\n        return __error; \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define __WIN32_RETURN_GLE_FAIL(str) return __R_FN(Win32_Return_GetLastError)(__R_INFO_ONLY(str))\n\nFORCEINLINE long __WIN32_FROM_HRESULT(HRESULT hr)\n{\n    if (SUCCEEDED(hr))\n    {\n        return ERROR_SUCCESS;\n    }\n    return HRESULT_FACILITY(hr) == FACILITY_WIN32 ? HRESULT_CODE(hr) : hr;\n}\n/// @endcond\n\n//*****************************************************************************\n// Macros for returning failures as WIN32 error codes\n//*****************************************************************************\n\n// Always returns a known result (WIN32 error code) - always logs failures\n#define WIN32_RETURN_WIN32(error) __WIN32_RETURN_WIN32(wil::verify_win32(error), #error)\n#define WIN32_RETURN_LAST_ERROR() __WIN32_RETURN_GLE_FAIL(nullptr)\n\n// Conditionally returns failures (WIN32 error code) - always logs failures\n#define WIN32_RETURN_IF_WIN32_ERROR(error) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __errorRet = wil::verify_win32(error); \\\n        if (FAILED_WIN32(__errorRet)) \\\n        { \\\n            __WIN32_RETURN_WIN32(__errorRet, #error); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_WIN32_IF(error, condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __WIN32_RETURN_WIN32(wil::verify_win32(error), #condition); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_WIN32_IF_NULL(error, ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __WIN32_RETURN_WIN32(wil::verify_win32(error), #ptr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_LAST_ERROR_IF(condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            __WIN32_RETURN_GLE_FAIL(#condition); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_LAST_ERROR_IF_NULL(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            __WIN32_RETURN_GLE_FAIL(#ptr); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n// Conditionally returns failures (WIN32 error code) - use for failures that are expected in common use - failures are not logged - macros are only for control flow pattern\n#define WIN32_RETURN_IF_WIN32_ERROR_EXPECTED(error) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        const auto __errorRet = wil::verify_win32(error); \\\n        if (FAILED_WIN32(__errorRet)) \\\n        { \\\n            return __errorRet; \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_WIN32_IF_EXPECTED(error, condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            return wil::verify_win32(error); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_WIN32_IF_NULL_EXPECTED(error, ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            return wil::verify_win32(error); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_LAST_ERROR_IF_EXPECTED(condition) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if (wil::verify_bool(condition)) \\\n        { \\\n            return wil::verify_win32(wil::details::GetLastErrorFail()); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n#define WIN32_RETURN_LAST_ERROR_IF_NULL_EXPECTED(ptr) \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_S do \\\n    { \\\n        if ((ptr) == nullptr) \\\n        { \\\n            return wil::verify_win32(wil::details::GetLastErrorFail()); \\\n        } \\\n    } \\\n    __WI_SUPPRESS_BREAKING_WARNINGS_E while ((void)0, 0)\n\n//*****************************************************************************\n// Macros to catch and convert exceptions on failure\n//*****************************************************************************\n\n// Use these macros *within* a catch (...) block to handle exceptions\n#define WIN32_RETURN_CAUGHT_EXCEPTION() return __R_FN(Win32_Return_CaughtException)(__R_INFO_ONLY(nullptr))\n\n// Use these macros in place of a catch block to handle exceptions\n#define WIN32_CATCH_RETURN() \\\n    catch (...) \\\n    { \\\n        WIN32_RETURN_CAUGHT_EXCEPTION(); \\\n    }\n\nnamespace wil\n{\n//*****************************************************************************\n// Public Helpers that catch -- mostly only enabled when exceptions are enabled\n//*****************************************************************************\n\n// Win32ErrorFromCaughtException is a function that is meant to be called from within a catch(...) block. Internally\n// it re-throws and catches the exception to convert it to a WIN32 error code. If an exception is of an unrecognized type\n// the function will fail fast.\n//\n// try\n// {\n//     // Code\n// }\n// catch (...)\n// {\n//     status = wil::Win32ErrorFromCaughtException();\n// }\n_Always_(_Post_satisfies_(return > 0)) __declspec(noinline) inline long Win32ErrorFromCaughtException() WI_NOEXCEPT\n{\n    return __WIN32_FROM_HRESULT(ResultFromCaughtException());\n}\n\n/// @cond\nnamespace details::__R_NS_NAME\n{\n#ifdef WIL_ENABLE_EXCEPTIONS\n    __R_DIRECT_METHOD(long, Win32_Return_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n    {\n        __R_FN_LOCALS;\n        return __WIN32_FROM_HRESULT(wil::details::ReportFailure_CaughtException<FailureType::Return>(__R_DIRECT_FN_CALL_ONLY));\n    }\n#endif\n\n    __R_DIRECT_METHOD(long, Win32_Return_GetLastError)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT\n    {\n        __R_FN_LOCALS;\n        return __WIN32_FROM_HRESULT(wil::details::ReportFailure_GetLastErrorHr<FailureType::Return>(__R_DIRECT_FN_CALL_ONLY));\n    }\n} // namespace details::__R_NS_NAME\n/// @endcond\n} // namespace wil\n\n#endif // __WIL_WIN32_RESULTMACROS_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/windowing.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n#ifndef __WIL_WINDOWING_INCLUDED\n#define __WIL_WINDOWING_INCLUDED\n\n#include <WinUser.h>\n#include <exception>\n\n#include \"common.h\"\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\nnamespace wil\n{\nnamespace details\n{\n    template <typename T>\n    struct always_false : wistd::false_type\n    {\n    };\n\n    template <typename TCallback>\n    BOOL __stdcall EnumWindowsCallbackNoThrow(HWND hwnd, LPARAM lParam)\n    {\n        auto pCallback = reinterpret_cast<TCallback*>(lParam);\n#if __cpp_if_constexpr >= 201606L\n        using result_t = decltype((*pCallback)(hwnd));\n        if constexpr (wistd::is_void_v<result_t>)\n        {\n            (*pCallback)(hwnd);\n            return TRUE;\n        }\n        else if constexpr (wistd::is_same_v<result_t, HRESULT>)\n        {\n            // NB: this works for both HRESULT and NTSTATUS as both S_OK and ERROR_SUCCESS are 0\n            return (S_OK == (*pCallback)(hwnd)) ? TRUE : FALSE;\n        }\n        else if constexpr (std::is_same_v<result_t, bool>)\n        {\n            return (*pCallback)(hwnd) ? TRUE : FALSE;\n        }\n        else\n        {\n            static_assert(details::always_false<TCallback>::value, \"Callback must return void, bool, or HRESULT\");\n        }\n#else\n        return (*pCallback)(hwnd);\n#endif\n    }\n\n    template <typename TEnumApi, typename TCallback>\n    void DoEnumWindowsNoThrow(TEnumApi&& enumApi, TCallback&& callback) noexcept\n    {\n        enumApi(EnumWindowsCallbackNoThrow<TCallback>, reinterpret_cast<LPARAM>(&callback));\n    }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n    template <typename TCallback>\n    struct EnumWindowsCallbackData\n    {\n        std::exception_ptr exception;\n        TCallback* pCallback;\n    };\n\n    template <typename TCallback>\n    BOOL __stdcall EnumWindowsCallback(HWND hwnd, LPARAM lParam)\n    {\n        auto pCallbackData = reinterpret_cast<EnumWindowsCallbackData<TCallback>*>(lParam);\n        try\n        {\n            auto pCallback = pCallbackData->pCallback;\n#if __cpp_if_constexpr >= 201606L\n            using result_t = decltype((*pCallback)(hwnd));\n            if constexpr (std::is_void_v<result_t>)\n            {\n                (*pCallback)(hwnd);\n                return TRUE;\n            }\n            else if constexpr (std::is_same_v<result_t, HRESULT>)\n            {\n                // NB: this works for both HRESULT and NTSTATUS as both S_OK and ERROR_SUCCESS are 0\n                return (S_OK == (*pCallback)(hwnd)) ? TRUE : FALSE;\n            }\n            else if constexpr (std::is_same_v<result_t, bool>)\n            {\n                return (*pCallback)(hwnd) ? TRUE : FALSE;\n            }\n            else\n            {\n                static_assert(details::always_false<TCallback>::value, \"Callback must return void, bool, or HRESULT\");\n            }\n#else\n            return (*pCallback)(hwnd);\n#endif\n        }\n        catch (...)\n        {\n            pCallbackData->exception = std::current_exception();\n            return FALSE;\n        }\n    };\n\n    template <typename TEnumApi, typename TCallback>\n    void DoEnumWindows(TEnumApi&& enumApi, TCallback&& callback)\n    {\n        EnumWindowsCallbackData<TCallback> callbackData = {nullptr, &callback};\n        enumApi(EnumWindowsCallback<TCallback>, reinterpret_cast<LPARAM>(&callbackData));\n        if (callbackData.exception)\n        {\n            std::rethrow_exception(callbackData.exception);\n        }\n    }\n#endif\n} // namespace details\n\ntemplate <typename TCallback>\nvoid for_each_window_nothrow(TCallback&& callback) noexcept\n{\n    details::DoEnumWindowsNoThrow(&EnumWindows, wistd::forward<TCallback>(callback));\n}\n\ntemplate <typename TCallback>\nvoid for_each_thread_window_nothrow(_In_ DWORD threadId, TCallback&& callback) noexcept\n{\n    auto boundEnumThreadWindows = [threadId](WNDENUMPROC enumproc, LPARAM lParam) noexcept -> BOOL {\n        return EnumThreadWindows(threadId, enumproc, lParam);\n    };\n    details::DoEnumWindowsNoThrow(boundEnumThreadWindows, wistd::forward<TCallback>(callback));\n}\n\ntemplate <typename TCallback>\nvoid for_each_child_window_nothrow(_In_ HWND hwndParent, TCallback&& callback) noexcept\n{\n    auto boundEnumChildWindows = [hwndParent](WNDENUMPROC enumproc, LPARAM lParam) noexcept -> BOOL {\n        return EnumChildWindows(hwndParent, enumproc, lParam);\n    };\n    details::DoEnumWindowsNoThrow(boundEnumChildWindows, wistd::forward<TCallback>(callback));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename TCallback>\nvoid for_each_window(TCallback&& callback)\n{\n    details::DoEnumWindows(&EnumWindows, wistd::forward<TCallback>(callback));\n}\n\ntemplate <typename TCallback>\nvoid for_each_thread_window(_In_ DWORD threadId, TCallback&& callback)\n{\n    auto boundEnumThreadWindows = [threadId](WNDENUMPROC enumproc, LPARAM lParam) noexcept -> BOOL {\n        return EnumThreadWindows(threadId, enumproc, lParam);\n    };\n    details::DoEnumWindows(boundEnumThreadWindows, wistd::forward<TCallback>(callback));\n}\n\ntemplate <typename TCallback>\nvoid for_each_child_window(_In_ HWND hwndParent, TCallback&& callback)\n{\n    auto boundEnumChildWindows = [hwndParent](WNDENUMPROC enumproc, LPARAM lParam) noexcept -> BOOL {\n        return EnumChildWindows(hwndParent, enumproc, lParam);\n    };\n    details::DoEnumWindows(boundEnumChildWindows, wistd::forward<TCallback>(callback));\n}\n#endif\n\n} // namespace wil\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#endif // __WIL_WINDOWING_INCLUDED"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/winrt.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Various types and functions for working with the Windows Runtime\n#ifndef __WIL_WINRT_INCLUDED\n#define __WIL_WINRT_INCLUDED\n\n#include <hstring.h>\n#include <wrl/client.h>\n#include <wrl/implements.h>\n#include <wrl/async.h>\n#include <wrl/wrappers/corewrappers.h>\n#include \"result.h\"\n#include \"com.h\"\n#include \"resource.h\"\n#include <windows.foundation.h>\n#include <windows.foundation.collections.h>\n\n#ifdef __cplusplus_winrt\n#include <collection.h> // bring in the CRT iterator for support for C++ CX code\n#endif\n\n/// @cond\n#if WIL_USE_STL\n#include <functional>\n#include <iterator>\n#include <vector>\n#endif\n/// @endcond\n\n// This enables this code to be used in code that uses the ABI prefix or not.\n// Code using the public SDK and C++ CX code has the ABI prefix, windows internal\n// is built in a way that does not.\n/// @cond\n#if !defined(MIDL_NS_PREFIX) && !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__)\n// Internal .idl files use the namespace without the ABI prefix. Macro out ABI for that case\n#pragma push_macro(\"ABI\")\n#undef ABI\n#define ABI\n#endif\n/// @endcond\n\nnamespace wil\n{\n// time_t is the number of 1 - second intervals since January 1, 1970.\nconstexpr long long SecondsToStartOf1970 = 0x2b6109100;\nconstexpr long long HundredNanoSecondsInSecond = 10000000LL;\n\ninline __time64_t DateTime_to_time_t(ABI::Windows::Foundation::DateTime dateTime)\n{\n    // DateTime is the number of 100 - nanosecond intervals since January 1, 1601.\n    return (dateTime.UniversalTime / HundredNanoSecondsInSecond - SecondsToStartOf1970);\n}\n\ninline ABI::Windows::Foundation::DateTime time_t_to_DateTime(__time64_t timeT)\n{\n    ABI::Windows::Foundation::DateTime dateTime;\n    dateTime.UniversalTime = (timeT + SecondsToStartOf1970) * HundredNanoSecondsInSecond;\n    return dateTime;\n}\n\n#pragma region HSTRING Helpers\n/// @cond\nnamespace details\n{\n    // hstring_compare is used to assist in HSTRING comparison of two potentially non-similar string types. E.g.\n    // comparing a raw HSTRING with WRL's HString/HStringReference/etc. The consumer can optionally inhibit the\n    // deduction of array sizes by providing 'true' for the 'InhibitStringArrays' template argument. This is\n    // generally done in scenarios where the consumer cannot guarantee that the input argument types are perfectly\n    // preserved from end-to-end. E.g. if a single function in the execution path captures an array as const T&,\n    // then it is impossible to differentiate const arrays (where we generally do want to deduce length) from\n    // non-const arrays (where we generally do not want to deduce length). The consumer can also optionally choose\n    // to perform case-insensitive comparison by providing 'true' for the 'IgnoreCase' template argument.\n    template <bool InhibitStringArrays, bool IgnoreCase>\n    struct hstring_compare\n    {\n        // get_buffer returns the string buffer and length for the supported string types\n        static const wchar_t* get_buffer(HSTRING hstr, UINT32* length) WI_NOEXCEPT\n        {\n            return ::WindowsGetStringRawBuffer(hstr, length);\n        }\n\n        static const wchar_t* get_buffer(const Microsoft::WRL::Wrappers::HString& hstr, UINT32* length) WI_NOEXCEPT\n        {\n            return hstr.GetRawBuffer(length);\n        }\n\n        static const wchar_t* get_buffer(const Microsoft::WRL::Wrappers::HStringReference& hstr, UINT32* length) WI_NOEXCEPT\n        {\n            return hstr.GetRawBuffer(length);\n        }\n\n        static const wchar_t* get_buffer(const unique_hstring& str, UINT32* length) WI_NOEXCEPT\n        {\n            return ::WindowsGetStringRawBuffer(str.get(), length);\n        }\n\n        template <bool..., bool Enable = InhibitStringArrays>\n        static wistd::enable_if_t<Enable, const wchar_t*> get_buffer(const wchar_t* str, UINT32* length) WI_NOEXCEPT\n        {\n            str = (str != nullptr) ? str : L\"\";\n            *length = static_cast<UINT32>(wcslen(str));\n            return str;\n        }\n\n        template <typename StringT, bool..., bool Enable = !InhibitStringArrays>\n        static wistd::enable_if_t<\n            wistd::conjunction<wistd::is_pointer<StringT>, wistd::is_same<wistd::decay_t<wistd::remove_pointer_t<StringT>>, wchar_t>, wistd::bool_constant<Enable>>::value,\n            const wchar_t*>\n        get_buffer(StringT str, UINT32* length) WI_NOEXCEPT\n        {\n            str = (str != nullptr) ? str : L\"\";\n            *length = static_cast<UINT32>(wcslen(str));\n            return str;\n        }\n\n        template <size_t Size, bool..., bool Enable = !InhibitStringArrays>\n        static wistd::enable_if_t<Enable, const wchar_t*> get_buffer(const wchar_t (&str)[Size], UINT32* length) WI_NOEXCEPT\n        {\n            *length = Size - 1;\n            return str;\n        }\n\n        template <size_t Size, bool..., bool Enable = !InhibitStringArrays>\n        static wistd::enable_if_t<Enable, const wchar_t*> get_buffer(wchar_t (&str)[Size], UINT32* length) WI_NOEXCEPT\n        {\n            *length = static_cast<UINT32>(wcslen(str));\n            return str;\n        }\n\n        // Overload for std::wstring, or at least things that behave like std::wstring, without adding a dependency\n        // on STL headers\n        template <typename StringT>\n        static wistd::enable_if_t<\n            wistd::conjunction_v<\n                wistd::is_constructible<StringT, wchar_t*>,\n                wistd::is_convertible<decltype(wistd::declval<StringT>().data()), const wchar_t*>,\n                wistd::is_same<typename StringT::size_type, decltype(wistd::declval<StringT>().size())>>,\n            const wchar_t*>\n        get_buffer(const StringT& str, UINT32* length) WI_NOEXCEPT\n        {\n            *length = static_cast<UINT32>(str.size());\n            const wchar_t* ret = str.data();\n            return ret ? ret : L\"\";\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto compare(LhsT&& lhs, RhsT&& rhs)\n            -> decltype(get_buffer(lhs, wistd::declval<UINT32*>()), get_buffer(rhs, wistd::declval<UINT32*>()), int())\n        {\n            UINT32 lhsLength;\n            UINT32 rhsLength;\n            auto lhsBuffer = get_buffer(wistd::forward<LhsT>(lhs), &lhsLength);\n            auto rhsBuffer = get_buffer(wistd::forward<RhsT>(rhs), &rhsLength);\n\n            const auto result = ::CompareStringOrdinal(lhsBuffer, lhsLength, rhsBuffer, rhsLength, IgnoreCase ? TRUE : FALSE);\n            WI_ASSERT(result != 0);\n\n            return result;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto equals(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) == CSTR_EQUAL;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto not_equals(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) != CSTR_EQUAL;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto less(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) == CSTR_LESS_THAN;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto less_equals(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) != CSTR_GREATER_THAN;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto greater(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) == CSTR_GREATER_THAN;\n        }\n\n        template <typename LhsT, typename RhsT>\n        static auto greater_equals(LhsT&& lhs, RhsT&& rhs) WI_NOEXCEPT\n            -> decltype(compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)), bool())\n        {\n            return compare(wistd::forward<LhsT>(lhs), wistd::forward<RhsT>(rhs)) != CSTR_LESS_THAN;\n        }\n    };\n} // namespace details\n/// @endcond\n\n//! Detects if one or more embedded null is present in an HSTRING.\ninline bool HasEmbeddedNull(_In_opt_ HSTRING value)\n{\n    BOOL hasEmbeddedNull = FALSE;\n    (void)WindowsStringHasEmbeddedNull(value, &hasEmbeddedNull);\n    return hasEmbeddedNull != FALSE;\n}\n\n/** TwoPhaseHStringConstructor help using the 2 phase constructor pattern for HSTRINGs.\n@code\nauto stringConstructor = wil::TwoPhaseHStringConstructor::Preallocate(size);\nRETURN_IF_NULL_ALLOC(stringConstructor.Get());\n\nRETURN_IF_FAILED(stream->Read(stringConstructor.Get(), stringConstructor.ByteSize(), &bytesRead));\n\n// Validate stream contents, sizes must match, string must be null terminated.\nRETURN_IF_FAILED(stringConstructor.Validate(bytesRead));\n\nwil::unique_hstring string { stringConstructor.Promote() };\n@endcode\n\nSee also wil::unique_hstring_buffer.\n*/\nstruct TwoPhaseHStringConstructor\n{\n    TwoPhaseHStringConstructor() = delete;\n    TwoPhaseHStringConstructor(const TwoPhaseHStringConstructor&) = delete;\n    void operator=(const TwoPhaseHStringConstructor&) = delete;\n\n    TwoPhaseHStringConstructor(TwoPhaseHStringConstructor&& other) WI_NOEXCEPT\n    {\n        m_characterLength = other.m_characterLength;\n        other.m_characterLength = 0;\n        m_maker = wistd::move(other.m_maker);\n    }\n\n    static TwoPhaseHStringConstructor Preallocate(UINT32 characterLength)\n    {\n        return TwoPhaseHStringConstructor{characterLength};\n    }\n\n    //! Returns the HSTRING after it has been populated like Detach() or release(); be sure to put this in a RAII type to manage\n    //! its lifetime.\n    HSTRING Promote()\n    {\n        m_characterLength = 0;\n        return m_maker.release().release();\n    }\n\n    ~TwoPhaseHStringConstructor() = default;\n\n    WI_NODISCARD explicit operator PCWSTR() const\n    {\n        // This is set by WindowsPromoteStringBuffer() which must be called to\n        // construct this object via the static method Preallocate().\n        return m_maker.buffer();\n    }\n\n    //! Returns a pointer for the buffer so it can be populated\n    WI_NODISCARD wchar_t* Get() const\n    {\n        return const_cast<wchar_t*>(m_maker.buffer());\n    }\n    //! Used to validate range of buffer when populating.\n    WI_NODISCARD ULONG ByteSize() const\n    {\n        return m_characterLength * sizeof(wchar_t);\n    }\n\n    /** Ensure that the size of the data provided is consistent with the pre-allocated buffer.\n    It seems that WindowsPreallocateStringBuffer() provides the null terminator in the buffer\n    (based on testing) so this can be called before populating the buffer.\n    */\n    WI_NODISCARD HRESULT Validate(ULONG bytesRead) const\n    {\n        // Null termination is required for the buffer before calling WindowsPromoteStringBuffer().\n        RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_INVALID_DATA), (bytesRead != ByteSize()) || (Get()[m_characterLength] != L'\\0'));\n        return S_OK;\n    }\n\nprivate:\n    TwoPhaseHStringConstructor(UINT32 characterLength) : m_characterLength(characterLength)\n    {\n        (void)m_maker.make(nullptr, characterLength);\n    }\n\n    UINT32 m_characterLength;\n    details::string_maker<unique_hstring> m_maker;\n};\n\n//! A transparent less-than comparison function object that enables comparison of various string types intended for\n//! use with associative containers (such as `std::set`, `std::map`, etc.) that use\n//! `Microsoft::WRL::Wrappers::HString` as the key type. This removes the need for the consumer to explicitly\n//! create an `HString` object when using lookup functions such as `find`, `lower_bound`, etc. For example, the\n//! following scenarios would all work exactly as you would expect them to:\n//! ~~~\n//! std::map<HString, int, wil::hstring_less> map;\n//! const wchar_t constArray[] = L\"foo\";\n//! wchar_t nonConstArray[MAX_PATH] = L\"foo\";\n//!\n//! HString key;\n//! THROW_IF_FAILED(key.Set(constArray));\n//! map.emplace(std::move(key), 42);\n//!\n//! HString str;\n//! wil::unique_hstring uniqueStr;\n//! THROW_IF_FAILED(str.Set(L\"foo\"));\n//! THROW_IF_FAILED(str.CopyTo(&uniqueStr));\n//!\n//! // All of the following return an iterator to the pair { L\"foo\", 42 }\n//! map.find(str);\n//! map.find(str.Get());\n//! map.find(HStringReference(constArray));\n//! map.find(uniqueStr);\n//! map.find(std::wstring(constArray));\n//! map.find(constArray);\n//! map.find(nonConstArray);\n//! map.find(static_cast<const wchar_t*>(constArray));\n//! ~~~\n//! The first four calls in the example above use `WindowsGetStringRawBuffer` (or equivalent) to get the string\n//! buffer and length for the comparison. The fifth example uses `std::wstring::c_str` and `std::wstring::length`\n//! for getting these two values. The remaining three examples use only the string buffer and call `wcslen` for the\n//! length. That is, the length is *not* deduced for either array. This is because argument types are not always\n//! perfectly preserved by container functions and in fact are often captured as const references making it\n//! impossible to differentiate const arrays - where we can safely deduce length - from non const arrays - where we\n//! cannot safely deduce length since the buffer may be larger than actually needed (e.g. creating a\n//! `char[MAX_PATH]` array, but only filling it with 10 characters). The implications of this behavior is that\n//! string literals that contain embedded null characters will only include the part of the buffer up to the first\n//! null character. For example, the following example will result in all calls to `find` returning an end\n//! iterator.\n//! ~~~\n//! std::map<HString, int, wil::hstring_less> map;\n//! const wchar_t constArray[] = L\"foo\\0bar\";\n//! wchar_t nonConstArray[MAX_PATH] = L\"foo\\0bar\";\n//!\n//! // Create the key with the embedded null character\n//! HString key;\n//! THROW_IF_FAILED(key.Set(constArray));\n//! map.emplace(std::move(key), 42);\n//!\n//! // All of the following return map.end() since they look for the string \"foo\"\n//! map.find(constArray);\n//! map.find(nonConstArray);\n//! map.find(static_cast<const wchar_t*>(constArray));\n//! ~~~\n//! In order to search using a string literal that contains embedded null characters, a simple alternative is to\n//! first create an `HStringReference` and use that for the function call:\n//! ~~~\n//! // HStringReference's constructor *will* deduce the length of const arrays\n//! map.find(HStringReference(constArray));\n//! ~~~\nstruct hstring_less\n{\n    using is_transparent = void;\n\n    template <typename LhsT, typename RhsT>\n    WI_NODISCARD auto operator()(const LhsT& lhs, const RhsT& rhs) const\n        WI_NOEXCEPT->decltype(details::hstring_compare<true, false>::less(lhs, rhs))\n    {\n        return details::hstring_compare<true, false>::less(lhs, rhs);\n    }\n};\n\n//! A transparent less-than comparison function object whose behavior is equivalent to that of @ref hstring_less\n//! with the one difference that comparisons are case-insensitive. That is, the following example will correctly\n//! find the inserted value:\n//! ~~~\n//! std::map<HString, int, wil::hstring_insensitive_less> map;\n//!\n//! HString key;\n//! THROW_IF_FAILED(key.Set(L\"foo\"));\n//! map.emplace(std::move(key), 42);\n//!\n//! // All of the following return an iterator to the pair { L\"foo\", 42 }\n//! map.find(L\"FOo\");\n//! map.find(HStringReference(L\"fOo\"));\n//! map.find(HStringReference(L\"fOO\").Get());\n//! ~~~\nstruct hstring_insensitive_less\n{\n    using is_transparent = void;\n\n    template <typename LhsT, typename RhsT>\n    WI_NODISCARD auto operator()(const LhsT& lhs, const RhsT& rhs) const\n        WI_NOEXCEPT->decltype(details::hstring_compare<true, true>::less(lhs, rhs))\n    {\n        return details::hstring_compare<true, true>::less(lhs, rhs);\n    }\n};\n\n#pragma endregion\n\n/// @cond\nnamespace details\n{\n    // MapToSmartType<T>::type is used to map a raw type into an RAII expression\n    // of it. This is needed when lifetime management of the type is needed, for example\n    // when holding them as a value produced in an iterator.\n    // This type has a common set of methods used to abstract the access to the value\n    // that is similar to ComPtr<> and the WRL Wrappers: Get(), GetAddressOf() and other operators.\n    // Clients of the smart type must use those to access the value.\n\n    // TODO: Having the base definition defined will result in creating leaks if a type\n    // that needs resource management (e.g. PROPVARIANT) that has not specialized is used.\n    //\n    // One fix is to use std::is_enum to cover that case and leave the base definition undefined.\n    // That base should use static_assert to inform clients how to fix the lack of specialization.\n    template <typename T, typename Enable = void>\n    struct MapToSmartType\n    {\n#pragma warning(push)\n#pragma warning(disable : 4702) // https://github.com/Microsoft/wil/issues/2\n        struct type             // T holder\n        {\n            type() = default;\n            type(T&& value) : m_value(wistd::forward<T>(value))\n            {\n            }\n            WI_NODISCARD operator T() const\n            {\n                return m_value;\n            }\n            type& operator=(T&& value)\n            {\n                m_value = wistd::forward<T>(value);\n                return *this;\n            }\n            WI_NODISCARD T Get() const\n            {\n                return m_value;\n            }\n\n            // Returning T&& to support move only types\n            // In case of absence of T::operator=(T&&) a call to T::operator=(const T&) will happen\n            T&& Get()\n            {\n                return wistd::move(m_value);\n            }\n\n            WI_NODISCARD HRESULT CopyTo(T* result) const\n            {\n                *result = m_value;\n                return S_OK;\n            }\n            T* GetAddressOf()\n            {\n                return &m_value;\n            }\n            T* ReleaseAndGetAddressOf()\n            {\n                return &m_value;\n            }\n            T* operator&()\n            {\n                return &m_value;\n            }\n            T m_value{};\n        };\n#pragma warning(pop)\n    };\n\n    // IUnknown * derived -> Microsoft::WRL::ComPtr<>\n    template <typename T>\n    struct MapToSmartType<T, typename wistd::enable_if<wistd::is_base_of<IUnknown, typename wistd::remove_pointer<T>::type>::value>::type>\n    {\n        typedef Microsoft::WRL::ComPtr<typename wistd::remove_pointer<T>::type> type;\n    };\n\n    // HSTRING -> Microsoft::WRL::Wrappers::HString\n    template <>\n    struct MapToSmartType<HSTRING, void>\n    {\n        class HStringWithRelease : public Microsoft::WRL::Wrappers::HString\n        {\n        public:\n            // Unlike all other WRL types HString does not have ReleaseAndGetAddressOf and\n            // GetAddressOf() has non-standard behavior, calling Release().\n            HSTRING* ReleaseAndGetAddressOf() WI_NOEXCEPT\n            {\n                Release();\n                return &hstr_;\n            }\n        };\n        typedef HStringWithRelease type;\n    };\n\n    // WinRT interfaces like IVector<>, IAsyncOperation<> and IIterable<> can be templated\n    // on a runtime class (instead of an interface or primitive type). In these cases the objects\n    // produced by those interfaces implement an interface defined by the runtime class default interface.\n    //\n    // These templates deduce the type of the produced interface or pass through\n    // the type unmodified in the non runtime class case.\n    //\n    // for example:\n    //      IAsyncOperation<StorageFile*> -> IAsyncOperation<IStorageFile*>\n\n    // For IVector<T>, IVectorView<T>.\n    template <typename VectorType>\n    struct MapVectorResultType\n    {\n        template <typename TVector, typename TResult>\n        static TResult PeekGetAtType(HRESULT (STDMETHODCALLTYPE TVector::*)(unsigned, TResult*));\n        typedef decltype(PeekGetAtType(&VectorType::GetAt)) type;\n    };\n\n    // For IIterator<T>.\n    template <typename T>\n    struct MapIteratorResultType\n    {\n        template <typename TIterable, typename TResult>\n        static TResult PeekCurrentType(HRESULT (STDMETHODCALLTYPE TIterable::*)(TResult*));\n        typedef decltype(PeekCurrentType(&ABI::Windows::Foundation::Collections::IIterator<T>::get_Current)) type;\n    };\n\n    // For IAsyncOperation<T>.\n    template <typename T>\n    struct MapAsyncOpResultType\n    {\n        template <typename TAsyncOperation, typename TResult>\n        static TResult PeekGetResultsType(HRESULT (STDMETHODCALLTYPE TAsyncOperation::*)(TResult*));\n        typedef decltype(PeekGetResultsType(&ABI::Windows::Foundation::IAsyncOperation<T>::GetResults)) type;\n    };\n\n    // For IAsyncOperationWithProgress<T, P>.\n    template <typename T, typename P>\n    struct MapAsyncOpProgressResultType\n    {\n        template <typename TAsyncOperation, typename TResult>\n        static TResult PeekGetResultsType(HRESULT (STDMETHODCALLTYPE TAsyncOperation::*)(TResult*));\n        typedef decltype(PeekGetResultsType(&ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>::GetResults)) type;\n    };\n\n    // No support for IAsyncActionWithProgress<P> none of these (currently) use\n    // a runtime class for the progress type.\n} // namespace details\n/// @endcond\n#pragma region C++ iterators for WinRT collections for use with range based for and STL algorithms\n\n/** Range base for and STL algorithms support for WinRT ABI collection types, IVector<T>, IVectorView<T>, IIterable<T>\nsimilar to support provided by <collection.h> for C++ CX. Three error handling policies are supported.\n@code\nComPtr<CollectionType> collection = GetCollection(); // can be IVector<HSTRING>, IVectorView<HSTRING> or IIterable<HSTRING>\n\nfor (auto const& element : wil::get_range(collection.Get()))                // exceptions\nfor (auto const& element : wil::get_range_nothrow(collection.Get(), &hr))   // error code\nfor (auto const& element : wil::get_range_failfast(collection.Get()))       // fail fast\n{\n   // use element\n}\n@endcode\nStandard algorithm example:\n@code\nComPtr<IVectorView<StorageFile*>> files = GetFiles();\nauto fileRange = wil::get_range_nothrow(files.Get());\nauto itFound = std::find_if(fileRange.begin(), fileRange.end(), [](ComPtr<IStorageFile> file) -> bool\n{\n     return true; // first element in range\n});\n@endcode\n*/\n#pragma region exception and fail fast based IVector<>/IVectorView<>\n\ntemplate <typename VectorType, typename err_policy = err_exception_policy>\nclass vector_range\n{\npublic:\n    typedef typename details::MapVectorResultType<VectorType>::type TResult;\n    typedef typename details::MapToSmartType<TResult>::type TSmart;\n\n    vector_range() = delete;\n\n    explicit vector_range(_In_ VectorType* vector) : m_v(vector)\n    {\n    }\n\n    class vector_iterator\n    {\n    public:\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n        // could be random_access_iterator_tag but missing some features\n        typedef ::std::bidirectional_iterator_tag iterator_category;\n#endif\n        typedef TSmart value_type;\n        typedef ptrdiff_t difference_type;\n        typedef const TSmart* pointer;\n        typedef const TSmart& reference;\n\n        // for begin()\n        vector_iterator(VectorType* v, unsigned int pos) : m_v(v), m_i(pos)\n        {\n        }\n\n        // for end()\n        vector_iterator() : m_v(nullptr), m_i(-1)\n        {\n        }\n\n        vector_iterator(const vector_iterator& other)\n        {\n            m_v = other.m_v;\n            m_i = other.m_i;\n            err_policy::HResult(other.m_element.CopyTo(m_element.GetAddressOf()));\n        }\n\n        vector_iterator& operator=(const vector_iterator& other)\n        {\n            if (this != wistd::addressof(other))\n            {\n                m_v = other.m_v;\n                m_i = other.m_i;\n                err_policy::HResult(other.m_element.CopyTo(m_element.ReleaseAndGetAddressOf()));\n            }\n            return *this;\n        }\n\n        reference operator*()\n        {\n            err_policy::HResult(m_v->GetAt(m_i, m_element.ReleaseAndGetAddressOf()));\n            return m_element;\n        }\n\n        pointer operator->()\n        {\n            err_policy::HResult(m_v->GetAt(m_i, m_element.ReleaseAndGetAddressOf()));\n            return wistd::addressof(m_element);\n        }\n\n        vector_iterator& operator++()\n        {\n            ++m_i;\n            return *this;\n        }\n\n        vector_iterator& operator--()\n        {\n            --m_i;\n            return *this;\n        }\n\n        vector_iterator operator++(int)\n        {\n            vector_iterator old(*this);\n            ++*this;\n            return old;\n        }\n\n        vector_iterator operator--(int)\n        {\n            vector_iterator old(*this);\n            --*this;\n            return old;\n        }\n\n        vector_iterator& operator+=(int n)\n        {\n            m_i += n;\n            return *this;\n        }\n\n        vector_iterator& operator-=(int n)\n        {\n            m_i -= n;\n            return *this;\n        }\n\n        WI_NODISCARD vector_iterator operator+(int n) const\n        {\n            vector_iterator ret(*this);\n            ret += n;\n            return ret;\n        }\n\n        WI_NODISCARD vector_iterator operator-(int n) const\n        {\n            vector_iterator ret(*this);\n            ret -= n;\n            return ret;\n        }\n\n        WI_NODISCARD ptrdiff_t operator-(const vector_iterator& other) const\n        {\n            return m_i - other.m_i;\n        }\n\n        WI_NODISCARD bool operator==(const vector_iterator& other) const\n        {\n            return m_i == other.m_i;\n        }\n\n        WI_NODISCARD bool operator!=(const vector_iterator& other) const\n        {\n            return m_i != other.m_i;\n        }\n\n        WI_NODISCARD bool operator<(const vector_iterator& other) const\n        {\n            return m_i < other.m_i;\n        }\n\n        WI_NODISCARD bool operator>(const vector_iterator& other) const\n        {\n            return m_i > other.m_i;\n        }\n\n        WI_NODISCARD bool operator<=(const vector_iterator& other) const\n        {\n            return m_i <= other.m_i;\n        }\n\n        WI_NODISCARD bool operator>=(const vector_iterator& other) const\n        {\n            return m_i >= other.m_i;\n        }\n\n    private:\n        VectorType* m_v; // weak, collection must outlive iterators.\n        unsigned int m_i;\n        TSmart m_element;\n    };\n\n    vector_iterator begin()\n    {\n        return vector_iterator(m_v, 0);\n    }\n\n    vector_iterator end()\n    {\n        unsigned int size;\n        err_policy::HResult(m_v->get_Size(&size));\n        return vector_iterator(m_v, size);\n    }\n\nprivate:\n    VectorType* m_v; // weak, collection must outlive iterators.\n};\n#pragma endregion\n\n#pragma region error code based IVector<>/IVectorView<>\n\n__WI_ITR_NAMESPACE_BEGIN\n\ntemplate <typename VectorType>\nclass vector_range_nothrow\n{\npublic:\n    typedef typename details::MapVectorResultType<VectorType>::type TResult;\n    typedef typename details::MapToSmartType<TResult>::type TSmart;\n\n    vector_range_nothrow() = delete;\n    vector_range_nothrow(const vector_range_nothrow&) = delete;\n    vector_range_nothrow& operator=(const vector_range_nothrow&) = delete;\n\n    vector_range_nothrow(vector_range_nothrow&& other) WI_NOEXCEPT : m_v(other.m_v),\n                                                                     m_size(other.m_size),\n                                                                     m_result(other.m_result),\n                                                                     m_resultStorage(other.m_resultStorage),\n                                                                     m_currentElement(wistd::move(other.m_currentElement))\n    {\n    }\n\n    vector_range_nothrow(_In_ VectorType* vector, HRESULT* result = nullptr) :\n        m_v(vector), m_result(result ? result : &m_resultStorage)\n    {\n        *m_result = m_v->get_Size(&m_size);\n    }\n\n    class vector_iterator_nothrow\n    {\n    public:\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n        // must be input_iterator_tag as use (via ++, --, etc.) of one invalidates the other.\n        typedef ::std::input_iterator_tag iterator_category;\n#endif\n        typedef TSmart value_type;\n        typedef ptrdiff_t difference_type;\n        typedef const TSmart* pointer;\n        typedef const TSmart& reference;\n\n        vector_iterator_nothrow() = delete;\n        vector_iterator_nothrow(vector_range_nothrow<VectorType>* range, unsigned int pos) :\n            m_range(range),\n            m_i(pos)\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            ,\n            m_version(range->m_version)\n#endif\n        {\n        }\n\n        WI_NODISCARD reference operator*() const\n        {\n            return *this->operator->();\n        }\n\n        WI_NODISCARD pointer operator->() const\n        {\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            WI_FAIL_FAST_ASSERT_MSG(m_version == m_range->m_version, \"Dereferencing an out-of-date vector_iterator_nothrow\");\n            WI_FAIL_FAST_ASSERT_MSG(SUCCEEDED(*m_range->m_result), \"Dereferencing a vector_iterator_nothrow in a failed state\");\n            WI_FAIL_FAST_ASSERT_MSG(m_i < m_range->m_size, \"Dereferencing an 'end' iterator\");\n#endif\n            return wistd::addressof(m_range->m_currentElement);\n        }\n\n        vector_iterator_nothrow& operator++()\n        {\n            return *this += 1;\n        }\n\n        vector_iterator_nothrow& operator--()\n        {\n            return *this += -1;\n        }\n\n        vector_iterator_nothrow operator++(int)\n        {\n            vector_iterator_nothrow old(*this);\n            ++*this;\n            return old;\n        }\n\n        vector_iterator_nothrow operator--(int)\n        {\n            vector_iterator_nothrow old(*this);\n            --*this;\n            return old;\n        }\n\n        vector_iterator_nothrow& operator+=(int n)\n        {\n#if WIL_ITERATOR_DEBUG_LEVEL == 2\n            // This is _technically_ safe because we are not reading the out-of-date cached value, however having two active\n            // copies of iterators is generally a sign of problematic code with a bug waiting to happen\n            WI_FAIL_FAST_ASSERT_MSG(\n                m_version == m_range->m_version, \"Incrementing/decrementing an out-of-date copy of a vector_iterator_nothrow\");\n#endif\n            m_i += n;\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            // NOTE: 'm_i' is unsigned, hence the single check for increment/decrement\n            WI_FAIL_FAST_ASSERT_MSG(m_i <= m_range->m_size, \"Incrementing/decrementing a vector_iterator_nothrow out of range\");\n#endif\n            m_range->get_at_current(m_i);\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            m_version = m_range->m_version;\n#endif\n            return *this;\n        }\n\n        vector_iterator_nothrow& operator-=(int n)\n        {\n            return *this += -n;\n        }\n\n        WI_NODISCARD bool operator==(vector_iterator_nothrow const& other) const\n        {\n            return FAILED(*m_range->m_result) || (m_i == other.m_i);\n        }\n\n        WI_NODISCARD bool operator!=(vector_iterator_nothrow const& other) const\n        {\n            return !operator==(other);\n        }\n\n    private:\n        vector_range_nothrow<VectorType>* m_range;\n        unsigned int m_i = 0;\n\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n        // For checked iterator support; must match the version in 'm_range'\n        int m_version = 0;\n#endif\n    };\n\n    vector_iterator_nothrow begin()\n    {\n        // NOTE: Calling 'begin()' more than once is explicitly allowed as a way to reset the range, however because state is\n        // shared between all iterators, this invalidates previously created iterators\n        get_at_current(0);\n        return vector_iterator_nothrow(this, 0);\n    }\n\n    vector_iterator_nothrow end()\n    {\n        return vector_iterator_nothrow(this, m_size);\n    }\n\n    // Note, the error code is observed in operator!= and operator==, it always\n    // returns \"equal\" in the failed state to force the compare to the end\n    // iterator to return false and stop the loop.\n    //\n    // Is this ok for the general case?\n    void get_at_current(unsigned int i)\n    {\n        if (SUCCEEDED(*m_result) && (i < m_size))\n        {\n            *m_result = m_v->GetAt(i, m_currentElement.ReleaseAndGetAddressOf());\n\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            ++m_version;\n#endif\n        }\n    }\n\nprivate:\n    VectorType* m_v; // weak, collection must outlive iterators.\n    unsigned int m_size;\n\n    // This state is shared by vector_iterator_nothrow instances. this means\n    // use of one iterator invalidates the other.\n    HRESULT* m_result;\n    HRESULT m_resultStorage = S_OK; // for the case where the caller does not provide the location to store the result\n    TSmart m_currentElement;\n\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n    // For checked iterator support\n    int m_version = 0;\n#endif\n};\n\n__WI_ITR_NAMESPACE_END\n\n#pragma endregion\n\n#pragma region exception and fail fast based IIterable<>\n\ntemplate <typename T, typename err_policy = err_exception_policy>\nclass iterable_range\n{\npublic:\n    typedef typename details::MapIteratorResultType<T>::type TResult;\n    typedef typename details::MapToSmartType<TResult>::type TSmart;\n\n    explicit iterable_range(_In_ ABI::Windows::Foundation::Collections::IIterable<T>* iterable) : m_iterable(iterable)\n    {\n    }\n\n    class iterable_iterator\n    {\n    public:\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n        typedef ::std::forward_iterator_tag iterator_category;\n#endif\n        typedef TSmart value_type;\n        typedef ptrdiff_t difference_type;\n        typedef const TSmart* pointer;\n        typedef const TSmart& reference;\n\n        iterable_iterator() : m_i(-1)\n        {\n        }\n\n        // for begin()\n        explicit iterable_iterator(_In_ ABI::Windows::Foundation::Collections::IIterable<T>* iterable)\n        {\n            err_policy::HResult(iterable->First(&m_iterator));\n            boolean hasCurrent;\n            err_policy::HResult(m_iterator->get_HasCurrent(&hasCurrent));\n            m_i = hasCurrent ? 0 : -1;\n        }\n\n        // for end()\n        iterable_iterator(int /*currentIndex*/) : m_i(-1)\n        {\n        }\n\n        iterable_iterator(const iterable_iterator& other)\n        {\n            m_iterator = other.m_iterator;\n            m_i = other.m_i;\n            err_policy::HResult(other.m_element.CopyTo(m_element.GetAddressOf()));\n        }\n\n        iterable_iterator& operator=(const iterable_iterator& other)\n        {\n            if (this != wistd::addressof(other))\n            {\n                m_iterator = other.m_iterator;\n                m_i = other.m_i;\n                err_policy::HResult(other.m_element.CopyTo(m_element.ReleaseAndGetAddressOf()));\n            }\n            return *this;\n        }\n\n        WI_NODISCARD bool operator==(iterable_iterator const& other) const\n        {\n            return m_i == other.m_i;\n        }\n\n        WI_NODISCARD bool operator!=(iterable_iterator const& other) const\n        {\n            return !operator==(other);\n        }\n\n        reference operator*()\n        {\n            err_policy::HResult(m_iterator->get_Current(m_element.ReleaseAndGetAddressOf()));\n            return m_element;\n        }\n\n        pointer operator->()\n        {\n            err_policy::HResult(m_iterator->get_Current(m_element.ReleaseAndGetAddressOf()));\n            return wistd::addressof(m_element);\n        }\n\n        iterable_iterator& operator++()\n        {\n            boolean hasCurrent;\n            err_policy::HResult(m_iterator->MoveNext(&hasCurrent));\n            if (hasCurrent)\n            {\n                m_i++;\n            }\n            else\n            {\n                m_i = -1;\n            }\n            return *this;\n        }\n\n        iterable_iterator operator++(int)\n        {\n            iterable_iterator old(*this);\n            ++*this;\n            return old;\n        }\n\n    private:\n        Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IIterator<T>> m_iterator;\n        int m_i;\n        TSmart m_element;\n    };\n\n    iterable_iterator begin()\n    {\n        return iterable_iterator(m_iterable);\n    }\n\n    iterable_iterator end()\n    {\n        return iterable_iterator();\n    }\n\nprivate:\n    // weak, collection must outlive iterators.\n    ABI::Windows::Foundation::Collections::IIterable<T>* m_iterable;\n};\n#pragma endregion\n\n#if (WIL_USE_STL && defined(WIL_ENABLE_EXCEPTIONS)) || defined(WIL_DOXYGEN)\n/** Converts WinRT vectors to std::vector by requesting the collection's data in a single\noperation. This can be more efficient in terms of IPC cost than iteratively processing it.\n@code\nComPtr<IVector<IPropertyValue*>> values = GetValues();\nstd::vector<ComPtr<IPropertyValue>> allData = wil::to_vector(values);\nfor (ComPtr<IPropertyValue> const& item : allData)\n{\n    // use item\n}\n@endcode\nCan be used for ABI::Windows::Foundation::Collections::IVector<T> and\nABI::Windows::Foundation::Collections::IVectorView<T>\n*/\ntemplate <typename VectorType>\nauto to_vector(VectorType* src)\n{\n    using TResult = typename details::MapVectorResultType<VectorType>::type;\n    using TSmart = typename details::MapToSmartType<TResult>::type;\n    static_assert(sizeof(TResult) == sizeof(TSmart), \"result and smart sizes are different\");\n    std::vector<TSmart> output;\n    UINT32 expected = 0;\n    THROW_IF_FAILED(src->get_Size(&expected));\n    if (expected > 0)\n    {\n        output.resize(expected + 1);\n        UINT32 fetched = 0;\n        THROW_IF_FAILED(src->GetMany(0, static_cast<UINT32>(output.size()), reinterpret_cast<TResult*>(output.data()), &fetched));\n        THROW_HR_IF(E_CHANGED_STATE, fetched > expected);\n        output.resize(fetched);\n    }\n    return output;\n}\n#endif\n\n#pragma region error code base IIterable<>\n\n__WI_ITR_NAMESPACE_BEGIN\n\ntemplate <typename T>\nclass iterable_range_nothrow\n{\npublic:\n    typedef typename details::MapIteratorResultType<T>::type TResult;\n    typedef typename details::MapToSmartType<TResult>::type TSmart;\n\n    iterable_range_nothrow() = delete;\n    iterable_range_nothrow(const iterable_range_nothrow&) = delete;\n    iterable_range_nothrow& operator=(const iterable_range_nothrow&) = delete;\n    iterable_range_nothrow& operator=(iterable_range_nothrow&&) = delete;\n\n    iterable_range_nothrow(iterable_range_nothrow&& other) WI_NOEXCEPT : m_iterator(wistd::move(other.m_iterator)),\n                                                                         m_element(wistd::move(other.m_element)),\n                                                                         m_resultStorage(other.m_resultStorage)\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n        ,\n                                                                         m_index(other.m_index)\n#endif\n    {\n        if (other.m_result == &other.m_resultStorage)\n        {\n            m_result = &m_resultStorage;\n        }\n        else\n        {\n            m_result = other.m_result;\n        }\n    }\n\n    iterable_range_nothrow(_In_ ABI::Windows::Foundation::Collections::IIterable<T>* iterable, HRESULT* result = nullptr) :\n        m_result(result ? result : &m_resultStorage)\n    {\n        *m_result = iterable->First(&m_iterator);\n        if (SUCCEEDED(*m_result))\n        {\n            boolean hasCurrent;\n            *m_result = m_iterator->get_HasCurrent(&hasCurrent);\n            if (SUCCEEDED(*m_result) && hasCurrent)\n            {\n                *m_result = m_iterator->get_Current(m_element.ReleaseAndGetAddressOf());\n                if (FAILED(*m_result))\n                {\n                    m_iterator = nullptr; // release the iterator if no elements are found\n                }\n            }\n            else\n            {\n                m_iterator = nullptr; // release the iterator if no elements are found\n            }\n        }\n    }\n\n    class iterable_iterator_nothrow\n    {\n    public:\n#if WIL_USE_STL || defined(WIL_DOXYGEN)\n        // muse be input_iterator_tag as use of one instance invalidates the other.\n        typedef ::std::input_iterator_tag iterator_category;\n#endif\n        typedef TSmart value_type;\n        typedef ptrdiff_t difference_type;\n        typedef const TSmart* pointer;\n        typedef const TSmart& reference;\n\n        iterable_iterator_nothrow(_In_ iterable_range_nothrow* range, int currentIndex) : m_range(range), m_i(currentIndex)\n        {\n        }\n\n        WI_NODISCARD bool operator==(iterable_iterator_nothrow const& other) const\n        {\n            return FAILED(*m_range->m_result) || (m_i == other.m_i);\n        }\n\n        WI_NODISCARD bool operator!=(iterable_iterator_nothrow const& other) const\n        {\n            return !operator==(other);\n        }\n\n        WI_NODISCARD reference operator*() const WI_NOEXCEPT\n        {\n            return *this->operator->();\n        }\n\n        WI_NODISCARD pointer operator->() const WI_NOEXCEPT\n        {\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            WI_FAIL_FAST_ASSERT_MSG(SUCCEEDED(*m_range->m_result), \"Dereferencing an iterable_iterator_nothrow in a failed state\");\n            WI_FAIL_FAST_ASSERT_MSG(m_i >= 0, \"Dereferencing an 'end' iterator\");\n            WI_FAIL_FAST_ASSERT_MSG(m_i == m_range->m_index, \"Dereferencing an out-of-date iterable_iterator_nothrow\");\n#endif\n            return wistd::addressof(m_range->m_element);\n        }\n\n        iterable_iterator_nothrow& operator++()\n        {\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            // Failing this check is always bad because the iterator object we hold always advances forward\n            WI_FAIL_FAST_ASSERT_MSG(m_i >= 0, \"Incrementing an end iterator\");\n            WI_FAIL_FAST_ASSERT_MSG(m_i == m_range->m_index, \"Incrementing an out-of-date copy of an iterable_iterator_nothrow\");\n#endif\n            boolean hasCurrent;\n            *m_range->m_result = m_range->m_iterator->MoveNext(&hasCurrent);\n            if (SUCCEEDED(*m_range->m_result) && hasCurrent)\n            {\n                *m_range->m_result = m_range->m_iterator->get_Current(m_range->m_element.ReleaseAndGetAddressOf());\n                if (SUCCEEDED(*m_range->m_result))\n                {\n                    m_i++;\n                }\n                else\n                {\n                    m_i = -1;\n                }\n            }\n            else\n            {\n                m_i = -1;\n            }\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n            m_range->m_index = m_i;\n#endif\n            return *this;\n        }\n\n        iterable_iterator_nothrow operator++(int)\n        {\n            iterable_iterator_nothrow old(*this);\n            ++*this;\n            return old;\n        }\n\n    private:\n        iterable_range_nothrow* m_range;\n        int m_i;\n    };\n\n    iterable_iterator_nothrow begin()\n    {\n#if WIL_ITERATOR_DEBUG_LEVEL == 2\n        // The IIterator we hold only advances forward; we can't reset it back to the beginning. Calling this method more than\n        // once will very likely lead to unexpected behavior.\n        WI_FAIL_FAST_ASSERT_MSG(m_index == 0, \"Calling begin() on an already advanced iterable_range_nothrow\");\n#endif\n        return iterable_iterator_nothrow(this, this->m_iterator ? 0 : -1);\n    }\n\n    iterable_iterator_nothrow end()\n    {\n        return iterable_iterator_nothrow(this, -1);\n    }\n\nprivate:\n    Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IIterator<T>> m_iterator;\n    // This state is shared by all iterator instances\n    // so use of one iterator can invalidate another's ability to dereference\n    // that is allowed for input iterators.\n    TSmart m_element;\n    HRESULT* m_result;\n    HRESULT m_resultStorage = S_OK;\n\n#if WIL_ITERATOR_DEBUG_LEVEL > 0\n    // For checked iterator support\n    int m_index = 0;\n#endif\n};\n\n__WI_ITR_NAMESPACE_END\n\n#pragma endregion\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename T>\nvector_range<ABI::Windows::Foundation::Collections::IVector<T>> get_range(ABI::Windows::Foundation::Collections::IVector<T>* v)\n{\n    return vector_range<ABI::Windows::Foundation::Collections::IVector<T>>(v);\n}\n\ntemplate <typename T>\nvector_range<ABI::Windows::Foundation::Collections::IVectorView<T>> get_range(ABI::Windows::Foundation::Collections::IVectorView<T>* v)\n{\n    return vector_range<ABI::Windows::Foundation::Collections::IVectorView<T>>(v);\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntemplate <typename T>\nvector_range<ABI::Windows::Foundation::Collections::IVector<T>, err_failfast_policy> get_range_failfast(\n    ABI::Windows::Foundation::Collections::IVector<T>* v)\n{\n    return vector_range<ABI::Windows::Foundation::Collections::IVector<T>, err_failfast_policy>(v);\n}\n\ntemplate <typename T>\nvector_range<ABI::Windows::Foundation::Collections::IVectorView<T>, err_failfast_policy> get_range_failfast(\n    ABI::Windows::Foundation::Collections::IVectorView<T>* v)\n{\n    return vector_range<ABI::Windows::Foundation::Collections::IVectorView<T>, err_failfast_policy>(v);\n}\n\ntemplate <typename T>\nvector_range_nothrow<ABI::Windows::Foundation::Collections::IVector<T>> get_range_nothrow(\n    ABI::Windows::Foundation::Collections::IVector<T>* v, HRESULT* result = nullptr)\n{\n    return vector_range_nothrow<ABI::Windows::Foundation::Collections::IVector<T>>(v, result);\n}\n\ntemplate <typename T>\nvector_range_nothrow<ABI::Windows::Foundation::Collections::IVectorView<T>> get_range_nothrow(\n    ABI::Windows::Foundation::Collections::IVectorView<T>* v, HRESULT* result = nullptr)\n{\n    return vector_range_nothrow<ABI::Windows::Foundation::Collections::IVectorView<T>>(v, result);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename T>\niterable_range<T> get_range(ABI::Windows::Foundation::Collections::IIterable<T>* v)\n{\n    return iterable_range<T>(v);\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\ntemplate <typename T>\niterable_range<T, err_failfast_policy> get_range_failfast(ABI::Windows::Foundation::Collections::IIterable<T>* v)\n{\n    return iterable_range<T, err_failfast_policy>(v);\n}\n\ntemplate <typename T>\niterable_range_nothrow<T> get_range_nothrow(ABI::Windows::Foundation::Collections::IIterable<T>* v, HRESULT* result = nullptr)\n{\n    return iterable_range_nothrow<T>(v, result);\n}\n#pragma endregion\n} // namespace wil\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n\n#pragma region Global operator functions\n#if defined(MIDL_NS_PREFIX) || defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__)\nnamespace ABI\n{\n#endif\nnamespace Windows\n{\n    namespace Foundation\n    {\n        namespace Collections\n        {\n            template <typename X>\n            typename wil::vector_range<IVector<X>>::vector_iterator begin(IVector<X>* v)\n            {\n                return typename wil::vector_range<IVector<X>>::vector_iterator(v, 0);\n            }\n\n            template <typename X>\n            typename wil::vector_range<IVector<X>>::vector_iterator end(IVector<X>* v)\n            {\n                unsigned int size;\n                THROW_IF_FAILED(v->get_Size(&size));\n                return typename wil::vector_range<IVector<X>>::vector_iterator(v, size);\n            }\n\n            template <typename X>\n            typename wil::vector_range<IVectorView<X>>::vector_iterator begin(IVectorView<X>* v)\n            {\n                return typename wil::vector_range<IVectorView<X>>::vector_iterator(v, 0);\n            }\n\n            template <typename X>\n            typename wil::vector_range<IVectorView<X>>::vector_iterator end(IVectorView<X>* v)\n            {\n                unsigned int size;\n                THROW_IF_FAILED(v->get_Size(&size));\n                return typename wil::vector_range<IVectorView<X>>::vector_iterator(v, size);\n            }\n\n            template <typename X>\n            typename wil::iterable_range<X>::iterable_iterator begin(IIterable<X>* i)\n            {\n                return typename wil::iterable_range<X>::iterable_iterator(i);\n            }\n\n            template <typename X>\n            typename wil::iterable_range<X>::iterable_iterator end(IIterable<X>*)\n            {\n                return typename wil::iterable_range<X>::iterable_iterator();\n            }\n        } // namespace Collections\n    } // namespace Foundation\n} // namespace Windows\n#if defined(MIDL_NS_PREFIX) || defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__)\n} // namespace ABI\n#endif\n#pragma endregion\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\nnamespace wil\n{\n#pragma region WinRT Async API helpers\n\n/// @cond\nnamespace details\n{\n    template <typename TResult, typename TFunc, typename... Args, typename wistd::enable_if<wistd::is_same<HRESULT, TResult>::value, int>::type = 0>\n    HRESULT CallAndHandleErrorsWithReturnType(TFunc&& func, Args&&... args)\n    {\n        return wistd::forward<TFunc>(func)(wistd::forward<Args>(args)...);\n    }\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n    template <typename TResult, typename TFunc, typename... Args, typename wistd::enable_if<wistd::is_same<void, TResult>::value, int>::type = 0>\n    HRESULT CallAndHandleErrorsWithReturnType(TFunc&& func, Args&&... args)\n    {\n        try\n        {\n            wistd::forward<TFunc>(func)(wistd::forward<Args>(args)...);\n        }\n        CATCH_RETURN();\n        return S_OK;\n    }\n#endif\n\n    template <typename TFunc, typename... Args>\n    HRESULT CallAndHandleErrors(TFunc&& func, Args&&... args)\n    {\n        return CallAndHandleErrorsWithReturnType<decltype(wistd::forward<TFunc>(func)(wistd::forward<Args>(args)...))>(\n            wistd::forward<TFunc>(func), wistd::forward<Args>(args)...);\n    }\n\n    // Get the last type of a template parameter pack.\n    // usage:\n    //     LastType<int, bool>::type boolValue;\n    template <typename... Ts>\n    struct LastType\n    {\n        template <typename T, typename... OtherTs>\n        struct LastTypeOfTs\n        {\n            typedef typename LastTypeOfTs<OtherTs...>::type type;\n        };\n\n        template <typename T>\n        struct LastTypeOfTs<T>\n        {\n            typedef T type;\n        };\n\n        template <typename... OtherTs>\n        static typename LastTypeOfTs<OtherTs...>::type LastTypeOfTsFunc()\n        {\n        }\n        typedef decltype(LastTypeOfTsFunc<Ts...>()) type;\n    };\n\n    // Takes a member function that has an out param like F(..., IAsyncAction**) or F(..., IAsyncOperation<bool>**)\n    // and returns IAsyncAction* or IAsyncOperation<bool>*.\n    template <typename I, typename... P>\n    typename wistd::remove_pointer<typename LastType<P...>::type>::type GetReturnParamPointerType(HRESULT (STDMETHODCALLTYPE I::*)(P...));\n\n    // Use to determine the result type of the async action/operation interfaces or example\n    // decltype(GetAsyncResultType(action.get())) returns void\n    void GetAsyncResultType(ABI::Windows::Foundation::IAsyncAction*);\n    template <typename P>\n    void GetAsyncResultType(ABI::Windows::Foundation::IAsyncActionWithProgress<P>*);\n    template <typename T>\n    typename wil::details::MapAsyncOpResultType<T>::type GetAsyncResultType(ABI::Windows::Foundation::IAsyncOperation<T>*);\n    template <typename T, typename P>\n    typename wil::details::MapAsyncOpProgressResultType<T, P>::type GetAsyncResultType(\n        ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*);\n\n    // Use to determine the result type of the async action/operation interfaces or example\n    // decltype(GetAsyncDelegateType(action.get())) returns void\n    ABI::Windows::Foundation::IAsyncActionCompletedHandler* GetAsyncDelegateType(ABI::Windows::Foundation::IAsyncAction*);\n    template <typename P>\n    ABI::Windows::Foundation::IAsyncActionWithProgressCompletedHandler<P>* GetAsyncDelegateType(\n        ABI::Windows::Foundation::IAsyncActionWithProgress<P>*);\n    template <typename T>\n    ABI::Windows::Foundation::IAsyncOperationCompletedHandler<T>* GetAsyncDelegateType(ABI::Windows::Foundation::IAsyncOperation<T>*);\n    template <typename T, typename P>\n    ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<T, P>* GetAsyncDelegateType(\n        ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*);\n\n    template <typename TBaseAgility, typename TIOperation, typename TFunction>\n    HRESULT RunWhenCompleteAction(_In_ TIOperation operation, TFunction&& func) WI_NOEXCEPT\n    {\n        using namespace Microsoft::WRL;\n        typedef wistd::remove_pointer_t<decltype(GetAsyncDelegateType(operation))> TIDelegate;\n\n        auto callback = Callback<Implements<RuntimeClassFlags<ClassicCom>, TIDelegate, TBaseAgility>>(\n            [func = wistd::forward<TFunction>(func)](TIOperation operation, ABI::Windows::Foundation::AsyncStatus status) mutable -> HRESULT {\n                HRESULT hr = S_OK;\n                if (status != ABI::Windows::Foundation::AsyncStatus::Completed) // avoid a potentially costly marshaled QI / call if we completed successfully\n                {\n                    // QI to the IAsyncInfo interface.  While all operations implement this, it is\n                    // possible that the stub has disconnected, causing the QI to fail.\n                    ComPtr<ABI::Windows::Foundation::IAsyncInfo> asyncInfo;\n                    hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo));\n                    if (SUCCEEDED(hr))\n                    {\n                        // Save the error code result in a temporary variable to allow us\n                        // to also retrieve the result of the COM call.  If the stub has\n                        // disconnected, this call may fail.\n                        HRESULT errorCode = E_UNEXPECTED;\n                        hr = asyncInfo->get_ErrorCode(&errorCode);\n                        if (SUCCEEDED(hr))\n                        {\n                            // Return the operations error code to the caller.\n                            hr = errorCode;\n                        }\n                    }\n                }\n\n                return CallAndHandleErrors(func, hr);\n            });\n        RETURN_IF_NULL_ALLOC(callback);\n        return operation->put_Completed(callback.Get());\n    }\n\n    template <typename TBaseAgility, typename TIOperation, typename TFunction>\n    HRESULT RunWhenComplete(_In_ TIOperation operation, TFunction&& func) WI_NOEXCEPT\n    {\n        using namespace Microsoft::WRL;\n        using namespace ABI::Windows::Foundation::Internal;\n\n        typedef wistd::remove_pointer_t<decltype(GetAsyncDelegateType(operation))> TIDelegate;\n\n        auto callback = Callback<Implements<RuntimeClassFlags<ClassicCom>, TIDelegate, TBaseAgility>>(\n            [func = wistd::forward<TFunction>(func)](TIOperation operation, ABI::Windows::Foundation::AsyncStatus status) mutable -> HRESULT {\n                typename details::MapToSmartType<typename GetAbiType<typename wistd::remove_pointer<TIOperation>::type::TResult_complex>::type>::type result;\n\n                HRESULT hr = S_OK;\n                // avoid a potentially costly marshaled QI / call if we completed successfully\n                if (status == ABI::Windows::Foundation::AsyncStatus::Completed)\n                {\n                    hr = operation->GetResults(result.GetAddressOf());\n                }\n                else\n                {\n                    // QI to the IAsyncInfo interface.  While all operations implement this, it is\n                    // possible that the stub has disconnected, causing the QI to fail.\n                    ComPtr<ABI::Windows::Foundation::IAsyncInfo> asyncInfo;\n                    hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo));\n                    if (SUCCEEDED(hr))\n                    {\n                        // Save the error code result in a temporary variable to allow us\n                        // to also retrieve the result of the COM call.  If the stub has\n                        // disconnected, this call may fail.\n                        HRESULT errorCode = E_UNEXPECTED;\n                        hr = asyncInfo->get_ErrorCode(&errorCode);\n                        if (SUCCEEDED(hr))\n                        {\n                            // Return the operations error code to the caller.\n                            hr = errorCode;\n                        }\n                    }\n                }\n\n                return CallAndHandleErrors(func, hr, result.Get());\n            });\n        RETURN_IF_NULL_ALLOC(callback);\n        return operation->put_Completed(callback.Get());\n    }\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n    template <typename TIOperation>\n    HRESULT WaitForCompletion(_In_ TIOperation operation, COWAIT_FLAGS flags, DWORD timeoutValue, _Out_opt_ bool* timedOut) WI_NOEXCEPT\n    {\n        typedef wistd::remove_pointer_t<decltype(GetAsyncDelegateType(operation))> TIDelegate;\n\n        class CompletionDelegate\n            : public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::Delegate>, TIDelegate, Microsoft::WRL::FtmBase>\n        {\n        public:\n            HRESULT RuntimeClassInitialize()\n            {\n                RETURN_HR(m_completedEventHandle.create());\n            }\n\n            HRESULT STDMETHODCALLTYPE Invoke(_In_ TIOperation, ABI::Windows::Foundation::AsyncStatus status) override\n            {\n                m_status = status;\n                m_completedEventHandle.SetEvent();\n                return S_OK;\n            }\n\n            WI_NODISCARD HANDLE GetEvent() const\n            {\n                return m_completedEventHandle.get();\n            }\n\n            WI_NODISCARD ABI::Windows::Foundation::AsyncStatus GetStatus() const\n            {\n                return m_status;\n            }\n\n        private:\n            volatile ABI::Windows::Foundation::AsyncStatus m_status = ABI::Windows::Foundation::AsyncStatus::Started;\n            wil::unique_event_nothrow m_completedEventHandle;\n        };\n\n        WI_ASSERT(timedOut || (timeoutValue == INFINITE));\n        assign_to_opt_param(timedOut, false);\n\n        Microsoft::WRL::ComPtr<CompletionDelegate> completedDelegate;\n        RETURN_IF_FAILED(Microsoft::WRL::MakeAndInitialize<CompletionDelegate>(&completedDelegate));\n        RETURN_IF_FAILED(operation->put_Completed(completedDelegate.Get()));\n\n        HANDLE handles[] = {completedDelegate->GetEvent()};\n        DWORD dwHandleIndex;\n        HRESULT hr = CoWaitForMultipleHandles(flags, timeoutValue, ARRAYSIZE(handles), handles, &dwHandleIndex);\n\n        // If the caller is listening for timedOut, and we actually timed out, set the bool and return S_OK. Otherwise, fail.\n        if (timedOut && (hr == RPC_S_CALLPENDING))\n        {\n            *timedOut = true;\n            return S_OK;\n        }\n        RETURN_IF_FAILED(hr);\n\n        if (completedDelegate->GetStatus() != ABI::Windows::Foundation::AsyncStatus::Completed)\n        {\n            // QI to the IAsyncInfo interface.  While all operations implement this, it is\n            // possible that the stub has disconnected, causing the QI to fail.\n            Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncInfo> asyncInfo;\n            hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo));\n            if (SUCCEEDED(hr))\n            {\n                // Save the error code result in a temporary variable to allow us\n                // to also retrieve the result of the COM call.  If the stub has\n                // disconnected, this call may fail.\n                HRESULT errorCode = E_UNEXPECTED;\n                hr = asyncInfo->get_ErrorCode(&errorCode);\n                if (SUCCEEDED(hr))\n                {\n                    // Return the operations error code to the caller.\n                    hr = errorCode;\n                }\n            }\n            return hr; // leave it to the caller to log failures.\n        }\n        return S_OK;\n    }\n\n    template <typename TIOperation, typename TIResults>\n    HRESULT WaitForCompletion(_In_ TIOperation operation, _Out_ TIResults result, COWAIT_FLAGS flags, DWORD timeoutValue, _Out_opt_ bool* timedOut) WI_NOEXCEPT\n    {\n        RETURN_IF_FAILED_EXPECTED(details::WaitForCompletion(operation, flags, timeoutValue, timedOut));\n        return operation->GetResults(result);\n    }\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n} // namespace details\n/// @endcond\n\n/** Set the completion callback for an async operation to run a caller provided function.\nOnce complete the function is called with the error code result of the operation\nand the async operation result (if applicable).\nThe function parameter list must be (HRESULT hr) for actions,\n(HRESULT hr, IResultInterface* object) for operations that produce interfaces,\nand (HRESULT hr, TResult value) for operations that produce value types.\n~~~\nrun_when_complete(getFileOp.Get(), [](HRESULT hr, IStorageFile* file) -> void\n{\n\n});\n~~~\nfor an agile callback use Microsoft::WRL::FtmBase\n~~~\nrun_when_complete<FtmBase>(getFileOp.Get(), [](HRESULT hr, IStorageFile* file) -> void\n{\n\n});\n~~~\nUsing the non throwing form:\n~~~\nhr = run_when_complete_nothrow<StorageFile*>(getFileOp.Get(), [](HRESULT hr, IStorageFile* file) -> HRESULT\n{\n\n});\n~~~\n*/\n\n//! Run a function when an async operation completes. Use Microsoft::WRL::FtmBase for TAgility to make the completion handler\n//! agile and run on the async thread.\ntemplate <typename TAgility = IUnknown, typename TFunc>\nHRESULT run_when_complete_nothrow(_In_ ABI::Windows::Foundation::IAsyncAction* operation, TFunc&& func) WI_NOEXCEPT\n{\n    return details::RunWhenCompleteAction<TAgility>(operation, wistd::forward<TFunc>(func));\n}\n\ntemplate <typename TAgility = IUnknown, typename TResult, typename TFunc, typename TAsyncResult = typename wil::details::MapAsyncOpResultType<TResult>::type>\nHRESULT run_when_complete_nothrow(_In_ ABI::Windows::Foundation::IAsyncOperation<TResult>* operation, TFunc&& func) WI_NOEXCEPT\n{\n    return details::RunWhenComplete<TAgility>(operation, wistd::forward<TFunc>(func));\n}\n\ntemplate <typename TAgility = IUnknown, typename TResult, typename TProgress, typename TFunc, typename TAsyncResult = typename wil::details::MapAsyncOpProgressResultType<TResult, TProgress>::type>\nHRESULT run_when_complete_nothrow(_In_ ABI::Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>* operation, TFunc&& func) WI_NOEXCEPT\n{\n    return details::RunWhenComplete<TAgility>(operation, wistd::forward<TFunc>(func));\n}\n\ntemplate <typename TAgility = IUnknown, typename TProgress, typename TFunc>\nHRESULT run_when_complete_nothrow(_In_ ABI::Windows::Foundation::IAsyncActionWithProgress<TProgress>* operation, TFunc&& func) WI_NOEXCEPT\n{\n    return details::RunWhenCompleteAction<TAgility>(operation, wistd::forward<TFunc>(func));\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Run a function when an async operation completes. Use Microsoft::WRL::FtmBase for TAgility to make the completion handler\n//! agile and run on the async thread.\ntemplate <typename TAgility = IUnknown, typename TFunc>\nvoid run_when_complete(_In_ ABI::Windows::Foundation::IAsyncAction* operation, TFunc&& func)\n{\n    THROW_IF_FAILED((details::RunWhenCompleteAction<TAgility>(operation, wistd::forward<TFunc>(func))));\n}\n\ntemplate <typename TAgility = IUnknown, typename TResult, typename TFunc, typename TAsyncResult = typename wil::details::MapAsyncOpResultType<TResult>::type>\nvoid run_when_complete(_In_ ABI::Windows::Foundation::IAsyncOperation<TResult>* operation, TFunc&& func)\n{\n    THROW_IF_FAILED((details::RunWhenComplete<TAgility>(operation, wistd::forward<TFunc>(func))));\n}\n\ntemplate <typename TAgility = IUnknown, typename TResult, typename TProgress, typename TFunc, typename TAsyncResult = typename wil::details::MapAsyncOpProgressResultType<TResult, TProgress>::type>\nvoid run_when_complete(_In_ ABI::Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>* operation, TFunc&& func)\n{\n    THROW_IF_FAILED((details::RunWhenComplete<TAgility>(operation, wistd::forward<TFunc>(func))));\n}\n\ntemplate <typename TAgility = IUnknown, typename TProgress, typename TFunc>\nvoid run_when_complete(_In_ ABI::Windows::Foundation::IAsyncActionWithProgress<TProgress>* operation, TFunc&& func)\n{\n    THROW_IF_FAILED((details::RunWhenCompleteAction<TAgility>(operation, wistd::forward<TFunc>(func))));\n}\n#endif\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n/** Wait for an asynchronous operation to complete (or be canceled).\nUse to synchronously wait on async operations on background threads.\nDo not call from UI threads or STA threads as reentrancy will result.\n~~~\nComPtr<IAsyncOperation<StorageFile*>> op;\nTHROW_IF_FAILED(storageFileStatics->GetFileFromPathAsync(HStringReference(path).Get(), &op));\nauto file = wil::wait_for_completion(op.Get());\n~~~\n*/\ntemplate <typename TAsync = ABI::Windows::Foundation::IAsyncAction>\ninline HRESULT wait_for_completion_nothrow(_In_ TAsync* operation, COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, flags, INFINITE, nullptr);\n}\n\n// These forms return the result from the async operation\n\ntemplate <typename TResult>\nHRESULT wait_for_completion_nothrow(\n    _In_ ABI::Windows::Foundation::IAsyncOperation<TResult>* operation,\n    _Out_ typename wil::details::MapAsyncOpResultType<TResult>::type* result,\n    COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, result, flags, INFINITE, nullptr);\n}\n\ntemplate <typename TResult, typename TProgress>\nHRESULT wait_for_completion_nothrow(\n    _In_ ABI::Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>* operation,\n    _Out_ typename wil::details::MapAsyncOpProgressResultType<TResult, TProgress>::type* result,\n    COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, result, flags, INFINITE, nullptr);\n}\n\n// Same as above, but allows caller to specify a timeout value.\n// On timeout, S_OK is returned, with timedOut set to true.\n\ntemplate <typename TAsync = ABI::Windows::Foundation::IAsyncAction>\ninline HRESULT wait_for_completion_or_timeout_nothrow(\n    _In_ TAsync* operation, DWORD timeoutValue, _Out_ bool* timedOut, COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, flags, timeoutValue, timedOut);\n}\n\ntemplate <typename TResult>\nHRESULT wait_for_completion_or_timeout_nothrow(\n    _In_ ABI::Windows::Foundation::IAsyncOperation<TResult>* operation,\n    _Out_ typename wil::details::MapAsyncOpResultType<TResult>::type* result,\n    DWORD timeoutValue,\n    _Out_ bool* timedOut,\n    COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, result, flags, timeoutValue, timedOut);\n}\n\ntemplate <typename TResult, typename TProgress>\nHRESULT wait_for_completion_or_timeout_nothrow(\n    _In_ ABI::Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>* operation,\n    _Out_ typename wil::details::MapAsyncOpProgressResultType<TResult, TProgress>::type* result,\n    DWORD timeoutValue,\n    _Out_ bool* timedOut,\n    COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS) WI_NOEXCEPT\n{\n    return details::WaitForCompletion(operation, result, flags, timeoutValue, timedOut);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Wait for an asynchronous operation to complete (or be canceled).\ntemplate <typename TAsync = ABI::Windows::Foundation::IAsyncAction>\ninline void wait_for_completion(_In_ TAsync* operation, COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS)\n{\n    THROW_IF_FAILED(details::WaitForCompletion(operation, flags, INFINITE, nullptr));\n}\n\ntemplate <typename TResult, typename TReturn = typename wil::details::MapToSmartType<typename wil::details::MapAsyncOpResultType<TResult>::type>::type>\nTReturn wait_for_completion(_In_ ABI::Windows::Foundation::IAsyncOperation<TResult>* operation, COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS)\n{\n    TReturn result;\n    THROW_IF_FAILED(details::WaitForCompletion(operation, result.GetAddressOf(), flags, INFINITE, nullptr));\n    return result;\n}\n\ntemplate <\n    typename TResult,\n    typename TProgress,\n    typename TReturn = typename wil::details::MapToSmartType<typename wil::details::MapAsyncOpProgressResultType<TResult, TProgress>::type>::type>\nTReturn wait_for_completion(_In_ ABI::Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>* operation, COWAIT_FLAGS flags = COWAIT_DISPATCH_CALLS)\n{\n    TReturn result;\n    THROW_IF_FAILED(details::WaitForCompletion(operation, result.GetAddressOf(), flags, INFINITE, nullptr));\n    return result;\n}\n\n/** Similar to WaitForCompletion but this function encapsulates the creation of the async operation\nmaking usage simpler.\n~~~\nComPtr<ILauncherStatics> launcher; // inited somewhere\nauto result = call_and_wait_for_completion(launcher.Get(), &ILauncherStatics::LaunchUriAsync, uri.Get());\n~~~\n*/\ntemplate <typename I, typename... P, typename... Args>\nauto call_and_wait_for_completion(I* object, HRESULT (STDMETHODCALLTYPE I::*func)(P...), Args&&... args)\n{\n    Microsoft::WRL::ComPtr<typename wistd::remove_pointer<typename wistd::remove_pointer<typename details::LastType<P...>::type>::type>::type> op;\n    THROW_IF_FAILED((object->*func)(wistd::forward<Args>(args)..., &op));\n    return wil::wait_for_completion(op.Get());\n}\n#endif\n#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)\n\n#pragma endregion\n\n#pragma region WinRT object construction\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Get a WinRT activation factory object, usually using a IXXXStatics interface.\ntemplate <typename TInterface>\ncom_ptr<TInterface> GetActivationFactory(PCWSTR runtimeClass)\n{\n    com_ptr<TInterface> result;\n    THROW_IF_FAILED(RoGetActivationFactory(Microsoft::WRL::Wrappers::HStringReference(runtimeClass).Get(), IID_PPV_ARGS(&result)));\n    return result;\n}\n\n//! Get a WinRT object.\ntemplate <typename TInterface>\ncom_ptr<TInterface> ActivateInstance(PCWSTR runtimeClass)\n{\n    com_ptr<IInspectable> result;\n    THROW_IF_FAILED(RoActivateInstance(Microsoft::WRL::Wrappers::HStringReference(runtimeClass).Get(), &result));\n    return result.query<TInterface>();\n}\n#endif\n#pragma endregion\n\n#pragma region Async production helpers\n\n/// @cond\nnamespace details\n{\n    template <typename TResult>\n    class SyncAsyncOp WrlFinal : public Microsoft::WRL::RuntimeClass<\n                                     ABI::Windows::Foundation::IAsyncOperation<TResult>,\n                                     Microsoft::WRL::AsyncBase<ABI::Windows::Foundation::IAsyncOperationCompletedHandler<TResult>>>\n    {\n        // typedef typename MapToSmartType<TResult>::type TSmart;\n        using RuntimeClassT = typename SyncAsyncOp::RuntimeClassT;\n        InspectableClass(__super::z_get_rc_name_impl(), TrustLevel::BaseTrust);\n\n    public:\n        HRESULT RuntimeClassInitialize(const TResult& op)\n        {\n            m_result = op;\n            return S_OK;\n        }\n\n        IFACEMETHODIMP put_Completed(ABI::Windows::Foundation::IAsyncOperationCompletedHandler<TResult>* competed) override\n        {\n            competed->Invoke(this, ABI::Windows::Foundation::AsyncStatus::Completed);\n            return S_OK;\n        }\n\n        IFACEMETHODIMP get_Completed(ABI::Windows::Foundation::IAsyncOperationCompletedHandler<TResult>** competed) override\n        {\n            *competed = nullptr;\n            return S_OK;\n        }\n\n        IFACEMETHODIMP GetResults(TResult* result) override\n        {\n            *result = m_result;\n            return S_OK;\n        }\n\n        HRESULT OnStart() override\n        {\n            return S_OK;\n        }\n        void OnClose() override\n        {\n        }\n        void OnCancel() override\n        {\n        }\n\n    private:\n        // needs to be MapToSmartType<TResult>::type to hold non trial types\n        TResult m_result{};\n    };\n\n    extern const __declspec(selectany) wchar_t SyncAsyncActionName[] = L\"SyncActionAction\";\n\n    class SyncAsyncActionOp WrlFinal : public Microsoft::WRL::RuntimeClass<\n                                           ABI::Windows::Foundation::IAsyncAction,\n                                           Microsoft::WRL::AsyncBase<\n                                               ABI::Windows::Foundation::IAsyncActionCompletedHandler,\n                                               Microsoft::WRL::Details::Nil,\n                                               Microsoft::WRL::AsyncResultType::SingleResult\n#ifndef _WRL_DISABLE_CAUSALITY_\n                                               ,\n                                               Microsoft::WRL::AsyncCausalityOptions<SyncAsyncActionName>\n#endif\n                                               >>\n    {\n        InspectableClass(InterfaceName_Windows_Foundation_IAsyncAction, TrustLevel::BaseTrust);\n\n    public:\n        IFACEMETHODIMP put_Completed(ABI::Windows::Foundation::IAsyncActionCompletedHandler* competed) override\n        {\n            competed->Invoke(this, ABI::Windows::Foundation::AsyncStatus::Completed);\n            return S_OK;\n        }\n\n        IFACEMETHODIMP get_Completed(ABI::Windows::Foundation::IAsyncActionCompletedHandler** competed) override\n        {\n            *competed = nullptr;\n            return S_OK;\n        }\n\n        IFACEMETHODIMP GetResults() override\n        {\n            return S_OK;\n        }\n\n        HRESULT OnStart() override\n        {\n            return S_OK;\n        }\n        void OnClose() override\n        {\n        }\n        void OnCancel() override\n        {\n        }\n    };\n} // namespace details\n/// @endcond\n\n//! Creates a WinRT async operation object that implements IAsyncOperation<TResult>. Use mostly for testing and for mocking APIs.\ntemplate <typename TResult>\nHRESULT make_synchronous_async_operation_nothrow(ABI::Windows::Foundation::IAsyncOperation<TResult>** result, const TResult& value)\n{\n    return Microsoft::WRL::MakeAndInitialize<details::SyncAsyncOp<TResult>>(result, value);\n}\n\n//! Creates a WinRT async operation object that implements IAsyncAction. Use mostly for testing and for mocking APIs.\ninline HRESULT make_synchronous_async_action_nothrow(ABI::Windows::Foundation::IAsyncAction** result)\n{\n    return Microsoft::WRL::MakeAndInitialize<details::SyncAsyncActionOp>(result);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n//! Creates a WinRT async operation object that implements IAsyncOperation<TResult>. Use mostly for testing and for mocking APIs.\n// TODO: map TRealResult and TSmartResult into SyncAsyncOp.\ntemplate <typename TResult, typename TRealResult = typename details::MapAsyncOpResultType<TResult>::type, typename TSmartResult = typename details::MapToSmartType<TRealResult>::type>\nvoid make_synchronous_async_operation(ABI::Windows::Foundation::IAsyncOperation<TResult>** result, const TResult& value)\n{\n    THROW_IF_FAILED((Microsoft::WRL::MakeAndInitialize<details::SyncAsyncOp<TResult>>(result, value)));\n}\n\n//! Creates a WinRT async operation object that implements IAsyncAction. Use mostly for testing and for mocking APIs.\ninline void make_synchronous_async_action(ABI::Windows::Foundation::IAsyncAction** result)\n{\n    THROW_IF_FAILED((Microsoft::WRL::MakeAndInitialize<details::SyncAsyncActionOp>(result)));\n}\n#endif\n#pragma endregion\n\n#pragma region EventRegistrationToken RAII wrapper\n\n// unique_winrt_event_token[_cx] is an RAII wrapper around EventRegistrationToken. When the unique_winrt_event_token[_cx] is\n// destroyed, the event is automatically unregistered. Declare a wil::unique_winrt_event_token[_cx]<T> at the scope the event\n// should be registered for (often they are tied to object lifetime), where T is the type of the event sender\n//     wil::unique_winrt_event_token_cx<Windows::UI::Xaml::Controls::Button> m_token;\n//\n// Macros have been defined to register for handling the event and then returning an unique_winrt_event_token[_cx]. These\n// macros simply hide the function references for adding and removing the event.\n//     C++/CX  m_token = WI_MakeUniqueWinRtEventTokenCx(ExampleEventName, sender, handler);\n//     ABI     m_token = WI_MakeUniqueWinRtEventToken(ExampleEventName, sender, handler, &m_token);                 // Exception and failfast\n//     ABI     RETURN_IF_FAILED(WI_MakeUniqueWinRtEventTokenNoThrow(ExampleEventName, sender, handler, &m_token));  // No throw variant\n//\n// When the wrapper is destroyed, the handler will be unregistered. You can explicitly unregister the handler prior.\n//     m_token.reset();\n//\n// You can release the EventRegistrationToken from being managed by the wrapper by calling .release()\n//     m_token.release();  // DANGER: no longer being managed\n//\n// If you just need the value of the EventRegistrationToken you can call .get()\n//     m_token.get();\n//\n// See \"onecore\\shell\\tests\\wil\\UniqueWinRTEventTokenTests.cpp\" for more examples of usage in ABI and C++/CX.\n\n// clang-format off\n#ifdef __cplusplus_winrt\nnamespace details\n{\n    template <typename T>\n    struct remove_reference\n    {\n        typedef T type;\n    };\n    template <typename T>\n    struct remove_reference<T^>\n    {\n        typedef T type;\n    };\n} // namespace details\n\ntemplate <typename T>\nclass unique_winrt_event_token_cx\n{\n    using removal_func = void (T::*)(Windows::Foundation::EventRegistrationToken);\n    using static_removal_func = void(__cdecl*)(Windows::Foundation::EventRegistrationToken);\n\npublic:\n    unique_winrt_event_token_cx() = default;\n\n    unique_winrt_event_token_cx(Windows::Foundation::EventRegistrationToken token, T^ sender, removal_func removalFunction) WI_NOEXCEPT\n        : m_token(token),\n          m_weakSender(sender),\n          m_removalFunction(removalFunction)\n    {\n    }\n\n    unique_winrt_event_token_cx(Windows::Foundation::EventRegistrationToken token, static_removal_func removalFunction) WI_NOEXCEPT\n        : m_token(token),\n          m_staticRemovalFunction(removalFunction)\n    {\n    }\n\n    unique_winrt_event_token_cx(const unique_winrt_event_token_cx&) = delete;\n    unique_winrt_event_token_cx& operator=(const unique_winrt_event_token_cx&) = delete;\n\n    unique_winrt_event_token_cx(unique_winrt_event_token_cx&& other) WI_NOEXCEPT\n        : m_token(other.m_token),\n          m_weakSender(wistd::move(other.m_weakSender)),\n          m_removalFunction(other.m_removalFunction),\n          m_staticRemovalFunction(other.m_staticRemovalFunction)\n    {\n        other.m_token = {};\n        other.m_weakSender = nullptr;\n        other.m_removalFunction = nullptr;\n        other.m_staticRemovalFunction = nullptr;\n    }\n\n    unique_winrt_event_token_cx& operator=(unique_winrt_event_token_cx&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n\n            wistd::swap_wil(m_token, other.m_token);\n            wistd::swap_wil(m_weakSender, other.m_weakSender);\n            wistd::swap_wil(m_removalFunction, other.m_removalFunction);\n            wistd::swap_wil(m_staticRemovalFunction, other.m_staticRemovalFunction);\n        }\n\n        return *this;\n    }\n\n    ~unique_winrt_event_token_cx() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_token.Value != 0);\n    }\n\n    WI_NODISCARD Windows::Foundation::EventRegistrationToken get() const WI_NOEXCEPT\n    {\n        return m_token;\n    }\n\n    void reset() noexcept\n    {\n        if (m_token.Value != 0)\n        {\n            if (m_staticRemovalFunction)\n            {\n                (*m_staticRemovalFunction)(m_token);\n            }\n            else\n            {\n                auto resolvedSender = [&]() {\n                    try\n                    {\n                        return m_weakSender.Resolve<T>();\n                    }\n                    catch (...)\n                    {\n                        // Ignore RPC or other failures that are unavoidable in some cases\n                        // matching wil::unique_winrt_event_token and winrt::event_revoker\n                        return static_cast<T^>(nullptr);\n                    }\n                }();\n                if (resolvedSender)\n                {\n                    (resolvedSender->*m_removalFunction)(m_token);\n                }\n            }\n            release();\n        }\n    }\n\n    // Stops the wrapper from managing resource and returns the EventRegistrationToken.\n    Windows::Foundation::EventRegistrationToken release() WI_NOEXCEPT\n    {\n        auto token = m_token;\n        m_token = {};\n        m_weakSender = nullptr;\n        m_removalFunction = nullptr;\n        m_staticRemovalFunction = nullptr;\n        return token;\n    }\n\nprivate:\n    Windows::Foundation::EventRegistrationToken m_token = {};\n    Platform::WeakReference m_weakSender;\n    removal_func m_removalFunction = nullptr;\n    static_removal_func m_staticRemovalFunction = nullptr;\n};\n\n#endif\n// clang-format on\n\ntemplate <typename T>\nclass unique_winrt_event_token\n{\n    using removal_func = HRESULT (__stdcall T::*)(::EventRegistrationToken);\n\npublic:\n    unique_winrt_event_token() = default;\n\n    unique_winrt_event_token(::EventRegistrationToken token, T* sender, removal_func removalFunction) WI_NOEXCEPT\n        : m_token(token),\n          m_removalFunction(removalFunction)\n    {\n        m_weakSender = wil::com_weak_query_failfast(sender);\n    }\n\n    unique_winrt_event_token(const unique_winrt_event_token&) = delete;\n    unique_winrt_event_token& operator=(const unique_winrt_event_token&) = delete;\n\n    unique_winrt_event_token(unique_winrt_event_token&& other) WI_NOEXCEPT : m_token(other.m_token),\n                                                                             m_weakSender(wistd::move(other.m_weakSender)),\n                                                                             m_removalFunction(other.m_removalFunction)\n    {\n        other.m_token = {};\n        other.m_removalFunction = nullptr;\n    }\n\n    unique_winrt_event_token& operator=(unique_winrt_event_token&& other) WI_NOEXCEPT\n    {\n        if (this != wistd::addressof(other))\n        {\n            reset();\n\n            wistd::swap_wil(m_token, other.m_token);\n            wistd::swap_wil(m_weakSender, other.m_weakSender);\n            wistd::swap_wil(m_removalFunction, other.m_removalFunction);\n        }\n\n        return *this;\n    }\n\n    ~unique_winrt_event_token() WI_NOEXCEPT\n    {\n        reset();\n    }\n\n    WI_NODISCARD explicit operator bool() const WI_NOEXCEPT\n    {\n        return (m_token.value != 0);\n    }\n\n    WI_NODISCARD ::EventRegistrationToken get() const WI_NOEXCEPT\n    {\n        return m_token;\n    }\n\n    void reset() WI_NOEXCEPT\n    {\n        if (m_token.value != 0)\n        {\n            // If T cannot be QI'ed from the weak object then T is not a COM interface.\n            auto resolvedSender = m_weakSender.try_query<T>();\n            if (resolvedSender)\n            {\n                FAIL_FAST_IF_FAILED((resolvedSender.get()->*m_removalFunction)(m_token));\n            }\n            release();\n        }\n    }\n\n    // Stops the wrapper from managing resource and returns the EventRegistrationToken.\n    ::EventRegistrationToken release() WI_NOEXCEPT\n    {\n        auto token = m_token;\n        m_token = {};\n        m_weakSender = nullptr;\n        m_removalFunction = nullptr;\n        return token;\n    }\n\nprivate:\n    ::EventRegistrationToken m_token = {};\n    wil::com_weak_ref_failfast m_weakSender;\n    removal_func m_removalFunction = nullptr;\n};\n\n/// @cond\nnamespace details\n{\n    // clang-format off\n#ifdef __cplusplus_winrt\n\n    // Handles registration of the event handler to the subscribing object and then wraps the EventRegistrationToken in unique_winrt_event_token.\n    // Not intended to be directly called. Use the WI_MakeUniqueWinRtEventTokenCx macro to abstract away specifying the functions that handle addition and removal.\n    template <typename T, typename addition_func, typename removal_func, typename handler>\n    inline wil::unique_winrt_event_token_cx<T> make_unique_winrt_event_token_cx(\n        T^ sender, addition_func additionFunc, removal_func removalFunc, handler^ h)\n    {\n        auto rawToken = (sender->*additionFunc)(h);\n        wil::unique_winrt_event_token_cx<T> temp(rawToken, sender, removalFunc);\n        return temp;\n    }\n\n    template <typename T, typename addition_func, typename removal_func, typename handler>\n    inline wil::unique_winrt_event_token_cx<T> make_unique_winrt_static_event_token_cx(\n        addition_func additionFunc, removal_func removalFunc, handler^ h)\n    {\n        auto rawToken = (*additionFunc)(h);\n        wil::unique_winrt_event_token_cx<T> temp(rawToken, removalFunc);\n        return temp;\n    }\n\n#endif // __cplusplus_winrt\n    // clang-format on\n\n    // Handles registration of the event handler to the subscribing object and then wraps the EventRegistrationToken in unique_winrt_event_token.\n    // Not intended to be directly called. Use the WI_MakeUniqueWinRtEventToken macro to abstract away specifying the functions that handle addition and removal.\n    template <typename err_policy = wil::err_returncode_policy, typename T, typename addition_func, typename removal_func, typename handler>\n    inline auto make_unique_winrt_event_token(\n        T* sender, addition_func additionFunc, removal_func removalFunc, handler h, wil::unique_winrt_event_token<T>* token_reference)\n    {\n        ::EventRegistrationToken rawToken;\n        err_policy::HResult((sender->*additionFunc)(h, &rawToken));\n        *token_reference = wil::unique_winrt_event_token<T>(rawToken, sender, removalFunc);\n        return err_policy::OK();\n    }\n\n    // Overload make function to allow for returning the constructed object when not using HRESULT based code.\n    template <typename err_policy = wil::err_returncode_policy, typename T, typename addition_func, typename removal_func, typename handler>\n    inline typename wistd::enable_if<!wistd::is_same<err_policy, wil::err_returncode_policy>::value, wil::unique_winrt_event_token<T>>::type make_unique_winrt_event_token(\n        T* sender, addition_func additionFunc, removal_func removalFunc, handler h)\n    {\n        ::EventRegistrationToken rawToken;\n        err_policy::HResult((sender->*additionFunc)(h, &rawToken));\n        return wil::unique_winrt_event_token<T>(rawToken, sender, removalFunc);\n    }\n\n} // namespace details\n/// @endcond\n\n// Helper macros to abstract function names for event addition and removal.\n#ifdef __cplusplus_winrt\n\n#define WI_MakeUniqueWinRtEventTokenCx(_event, _object, _handler) \\\n    wil::details::make_unique_winrt_event_token_cx( \\\n        _object, \\\n        &wil::details::remove_reference<decltype(_object)>::type::##_event## ::add, \\\n        &wil::details::remove_reference<decltype(_object)>::type::##_event## ::remove, \\\n        _handler)\n\n#define WI_MakeUniqueWinRtStaticEventTokenCx(_event, _baseType, _handler) \\\n    wil::details::make_unique_winrt_static_event_token_cx<_baseType>( \\\n        &##_baseType## ::##_event## ::add, &##_baseType## ::##_event## ::remove, _handler)\n\n#endif // __cplusplus_winrt\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n\n#define WI_MakeUniqueWinRtEventToken(_event, _object, _handler) \\\n    wil::details::make_unique_winrt_event_token<wil::err_exception_policy>( \\\n        _object, \\\n        &wistd::remove_pointer<decltype(_object)>::type::add_##_event, \\\n        &wistd::remove_pointer<decltype(_object)>::type::remove_##_event, \\\n        _handler)\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\n#define WI_MakeUniqueWinRtEventTokenNoThrow(_event, _object, _handler, _token_reference) \\\n    wil::details::make_unique_winrt_event_token( \\\n        _object, \\\n        &wistd::remove_pointer<decltype(_object)>::type::add_##_event, \\\n        &wistd::remove_pointer<decltype(_object)>::type::remove_##_event, \\\n        _handler, \\\n        _token_reference)\n\n#define WI_MakeUniqueWinRtEventTokenFailFast(_event, _object, _handler) \\\n    wil::details::make_unique_winrt_event_token<wil::err_failfast_policy>( \\\n        _object, \\\n        &wistd::remove_pointer<decltype(_object)>::type::add_##_event, \\\n        &wistd::remove_pointer<decltype(_object)>::type::remove_##_event, \\\n        _handler)\n\n#pragma endregion // EventRegistrationToken RAII wrapper\n\n} // namespace wil\n\n#if (NTDDI_VERSION >= NTDDI_WINBLUE)\n/// @cond\ntemplate <>\nstruct ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::IAsyncAction*>\n    : ABI::Windows::Foundation::IAsyncOperation_impl<ABI::Windows::Foundation::IAsyncAction*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperation<IAsyncAction*>\";\n    }\n};\n\ntemplate <typename P>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Foundation::IAsyncAction*, P>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgress_impl<ABI::Windows::Foundation::IAsyncAction*, P>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgress<IAsyncAction*,P>\";\n    }\n};\n\ntemplate <typename T>\nstruct ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::IAsyncOperation<T>*>\n    : ABI::Windows::Foundation::IAsyncOperation_impl<ABI::Windows::Foundation::IAsyncOperation<T>*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperation<IAsyncOperation<T>*>\";\n    }\n};\n\ntemplate <typename T, typename P>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Foundation::IAsyncOperation<T>*, P>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgress_impl<ABI::Windows::Foundation::IAsyncOperation<T>*, P>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgress<IAsyncOperation<T>*,P>\";\n    }\n};\n\ntemplate <typename T, typename P>\nstruct ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*>\n    : ABI::Windows::Foundation::IAsyncOperation_impl<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperation<IAsyncOperationWithProgress<T,P>*>\";\n    }\n};\n\ntemplate <typename T, typename P, typename Z>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*, Z>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgress_impl<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*, Z>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgress<IAsyncOperationWithProgress<T,P>*,Z>\";\n    }\n};\n\ntemplate <>\nstruct ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::IAsyncAction*>\n    : ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::IAsyncAction*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationCompletedHandler<IAsyncAction*>\";\n    }\n};\n\ntemplate <typename P>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Foundation::IAsyncAction*, P>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler_impl<ABI::Windows::Foundation::IAsyncAction*, P>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgressCompletedHandler<IAsyncAction*,P>\";\n    }\n};\n\ntemplate <typename T>\nstruct ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::IAsyncOperation<T>*>\n    : ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::IAsyncOperation<T>*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationCompletedHandler<IAsyncOperation<T>*>\";\n    }\n};\n\ntemplate <typename T, typename P>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Foundation::IAsyncOperation<T>*, P>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler_impl<ABI::Windows::Foundation::IAsyncOperation<T>*, P>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgressCompletedHandler<IAsyncOperation<T>*,P>\";\n    }\n};\n\ntemplate <typename T, typename P>\nstruct ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*>\n    : ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationCompletedHandler<IAsyncOperationWithProgress<T>*>\";\n    }\n};\n\ntemplate <typename T, typename P, typename Z>\nstruct ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*, Z>\n    : ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler_impl<ABI::Windows::Foundation::IAsyncOperationWithProgress<T, P>*, Z>\n{\n    static const wchar_t* z_get_rc_name_impl()\n    {\n        return L\"IAsyncOperationWithProgressCompletedHandler<IAsyncOperationWithProgress<T,P>*,Z>\";\n    }\n};\n/// @endcond\n#endif // NTDDI_VERSION >= NTDDI_WINBLUE\n\n#if !defined(MIDL_NS_PREFIX) && !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__)\n// Internal .idl files use the namespace without the ABI prefix. Macro out ABI for that case\n#pragma pop_macro(\"ABI\")\n#endif\n\n#if WIL_USE_STL\n\nnamespace std\n{\n//! Specialization of `std::less` for `Microsoft::WRL::Wrappers::HString` that uses `hstring_less` for the\n//! comparison function object.\ntemplate <>\nstruct less<Microsoft::WRL::Wrappers::HString> : public wil::hstring_less\n{\n};\n\n//! Specialization of `std::less` for `wil::unique_hstring` that uses `hstring_less` for the comparison function\n//! object.\ntemplate <>\nstruct less<wil::unique_hstring> : public wil::hstring_less\n{\n};\n} // namespace std\n\n#endif\n\n#endif // __WIL_WINRT_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/wistd_config.h",
    "content": "// -*- C++ -*-\n//===--------------------------- __config ---------------------------------===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is dual licensed under the MIT and the University of Illinois Open\n// Source Licenses. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n// STL common functionality\n//\n// Some aspects of STL are core language concepts that should be used from all C++ code, regardless\n// of whether exceptions are enabled in the component.  Common library code that expects to be used\n// from exception-free components want these concepts, but including STL headers directly introduces\n// friction as it requires components not using STL to declare their STL version.  Doing so creates\n// ambiguity around whether STL use is safe in a particular component and implicitly brings in\n// a long list of headers (including <new>) which can create further ambiguity around throwing new\n// support (some routines pulled in may expect it).  Secondarily, pulling in these headers also has\n// the potential to create naming conflicts or other implied dependencies.\n//\n// To promote the use of these core language concepts outside of STL-based binaries, this file is\n// selectively pulling those concepts *directly* from corresponding STL headers.  The corresponding\n// \"std::\" namespace STL functions and types should be preferred over these in code that is bound to\n// STL.  The implementation and naming of all functions are taken directly from STL, instead using\n// \"wistd\" (Windows Implementation std) as the namespace.\n//\n// Routines in this namespace should always be considered a reflection of the *current* STL implementation\n// of those routines.  Updates from STL should be taken, but no \"bugs\" should be fixed here.\n//\n// New, exception-based code should not use this namespace, but instead should prefer the std:: implementation.\n// Only code that is not exception-based and libraries that expect to be utilized across both exception\n// and non-exception based code should utilize this functionality.\n\n// This header mimics libc++'s '__config' header to the extent necessary to get the wistd::* definitions compiling. Note\n// that this has a few key differences since libc++'s MSVC compatibility is currently not functional and a bit behind\n\n#ifndef _WISTD_CONFIG_H_\n#define _WISTD_CONFIG_H_\n\n// DO NOT add *any* additional includes to this file -- there should be no dependencies from its usage\n#include <cstddef> // For size_t and other necessary types\n\n/// @cond\n#if defined(_MSC_VER) && !defined(__clang__)\n#if !defined(__WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)\n#define __WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER\n#endif\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER\n#pragma GCC system_header\n#endif\n\n#ifdef __GNUC__\n#define __WI_GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)\n// The __WI_GNUC_VER_NEW macro better represents the new GCC versioning scheme\n// introduced in GCC 5.0.\n#define __WI_GNUC_VER_NEW (__WI_GNUC_VER * 10 + __GNUC_PATCHLEVEL__)\n#else\n#define __WI_GNUC_VER 0\n#define __WI_GNUC_VER_NEW 0\n#endif\n\n// _MSVC_LANG is the more accurate way to get the C++ version in MSVC\n#if defined(_MSVC_LANG) && (_MSVC_LANG > __cplusplus)\n#define __WI_CPLUSPLUS _MSVC_LANG\n#else\n#define __WI_CPLUSPLUS __cplusplus\n#endif\n\n#ifndef __WI_LIBCPP_STD_VER\n#if __WI_CPLUSPLUS <= 201103L\n#define __WI_LIBCPP_STD_VER 11\n#elif __WI_CPLUSPLUS <= 201402L\n#define __WI_LIBCPP_STD_VER 14\n#elif __WI_CPLUSPLUS <= 201703L\n#define __WI_LIBCPP_STD_VER 17\n#elif __WI_CPLUSPLUS <= 202002L\n#define __WI_LIBCPP_STD_VER 20\n#elif __WI_CPLUSPLUS <= 202302L\n#define __WI_LIBCPP_STD_VER 23\n#else\n#define __WI_LIBCPP_STD_VER 24 // Newer standard or prerelease standard\n#endif\n#endif // __WI_LIBCPP_STD_VER\n\n#if __WI_CPLUSPLUS < 201103L\n#define __WI_LIBCPP_CXX03_LANG\n#endif\n\n#if defined(__ELF__)\n#define __WI_LIBCPP_OBJECT_FORMAT_ELF 1\n#elif defined(__MACH__)\n#define __WI_LIBCPP_OBJECT_FORMAT_MACHO 1\n#elif defined(_WIN32)\n#define __WI_LIBCPP_OBJECT_FORMAT_COFF 1\n#elif defined(__wasm__)\n#define __WI_LIBCPP_OBJECT_FORMAT_WASM 1\n#else\n#error Unknown object file format\n#endif\n\n#if defined(__clang__)\n#define __WI_LIBCPP_COMPILER_CLANG\n#elif defined(__GNUC__)\n#define __WI_LIBCPP_COMPILER_GCC\n#elif defined(_MSC_VER)\n#define __WI_LIBCPP_COMPILER_MSVC\n#elif defined(__IBMCPP__)\n#define __WI_LIBCPP_COMPILER_IBM\n#endif\n\n#if defined(__WI_LIBCPP_COMPILER_MSVC)\n#define __WI_PUSH_WARNINGS __pragma(warning(push))\n#define __WI_POP_WARNINGS __pragma(warning(pop))\n#elif defined(__WI_LIBCPP_COMPILER_CLANG)\n#define __WI_PUSH_WARNINGS __pragma(clang diagnostic push)\n#define __WI_POP_WARNINGS __pragma(clang diagnostic pop)\n#else\n#define __WI_PUSH_WARNINGS\n#define __WI_POP_WARNINGS\n#endif\n\n#ifdef __WI_LIBCPP_COMPILER_MSVC\n#define __WI_MSVC_DISABLE_WARNING(id) __pragma(warning(disable : id))\n#else\n#define __WI_MSVC_DISABLE_WARNING(id)\n#endif\n\n#ifdef __WI_LIBCPP_COMPILER_CLANG\n#define __WI_CLANG_DISABLE_WARNING(warning) __pragma(clang diagnostic ignored #warning)\n#else\n#define __WI_CLANG_DISABLE_WARNING(warning)\n#endif\n\n// NOTE: MSVC, which is what we primarily target, is severely underrepresented in libc++ and checks such as\n// __has_feature(...) are always false for MSVC, even when the feature being tested _is_ present in MSVC. Therefore, we\n// instead modify all checks to be __WI_HAS_FEATURE_IS_UNION, etc., which provides the correct value for MSVC and falls\n// back to the __has_feature(...), etc. value otherwise. We intentionally leave '__has_feature', etc. undefined for MSVC\n// so that we don't accidentally use the incorrect behavior\n#ifndef __WI_LIBCPP_COMPILER_MSVC\n\n#ifndef __has_feature\n#define __has_feature(__x) 0\n#endif\n\n// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by\n// the compiler and '1' otherwise.\n#ifndef __is_identifier\n#define __is_identifier(__x) 1\n#endif\n\n#ifndef __has_cpp_attribute\n#define __has_cpp_attribute(__x) 0\n#endif\n\n#ifndef __has_attribute\n#define __has_attribute(__x) 0\n#endif\n\n#ifndef __has_builtin\n#define __has_builtin(__x) 0\n#endif\n\n#if __has_feature(cxx_alignas)\n#define __WI_ALIGNAS_TYPE(x) alignas(x)\n#define __WI_ALIGNAS(x) alignas(x)\n#else\n#define __WI_ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))\n#define __WI_ALIGNAS(x) __attribute__((__aligned__(x)))\n#endif\n\n#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \\\n    (!defined(__WI_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions\n#define __WI_LIBCPP_EXPLICIT explicit\n#else\n#define __WI_LIBCPP_EXPLICIT\n#endif\n\n#if __has_feature(cxx_attributes)\n#define __WI_LIBCPP_NORETURN [[noreturn]]\n#else\n#define __WI_LIBCPP_NORETURN __attribute__((noreturn))\n#endif\n\n#define __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS\n#define __WI_LIBCPP_SUPPRESS_NOEXCEPT_ANALYSIS\n\n// The __WI_LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other\n// NODISCARD macros to the correct attribute.\n#if __has_cpp_attribute(nodiscard)\n#define __WI_LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]]\n#elif defined(__WI_LIBCPP_COMPILER_CLANG) && !defined(__WI_LIBCPP_CXX03_LANG)\n#define __WI_LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]]\n#else\n// We can't use GCC's [[gnu::warn_unused_result]] and\n// __attribute__((warn_unused_result)), because GCC does not silence them via\n// (void) cast.\n#define __WI_LIBCPP_NODISCARD_ATTRIBUTE\n#endif\n\n#define __WI_HAS_FEATURE_IS_UNION __has_feature(is_union)\n#define __WI_HAS_FEATURE_IS_CLASS __has_feature(is_class)\n#define __WI_HAS_FEATURE_IS_ENUM __has_feature(is_enum)\n#define __WI_HAS_FEATURE_IS_CONVERTIBLE_TO __has_feature(is_convertible_to)\n#define __WI_HAS_FEATURE_IS_EMPTY __has_feature(is_empty)\n#define __WI_HAS_FEATURE_IS_POLYMORPHIC __has_feature(is_polymorphic)\n#define __WI_HAS_FEATURE_HAS_VIRTUAL_DESTRUCTOR __has_feature(has_virtual_destructor)\n#define __WI_HAS_FEATURE_REFERENCE_QUALIFIED_FUNCTIONS __has_feature(cxx_reference_qualified_functions)\n#define __WI_HAS_FEATURE_IS_CONSTRUCTIBLE __has_feature(is_constructible)\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE __has_feature(is_trivially_constructible)\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_ASSIGNABLE __has_feature(is_trivially_assignable)\n#define __WI_HAS_FEATURE_HAS_TRIVIAL_DESTRUCTOR __has_feature(has_trivial_destructor)\n#define __WI_HAS_FEATURE_NOEXCEPT __has_feature(cxx_noexcept)\n#define __WI_HAS_FEATURE_IS_POD __has_feature(is_pod)\n#define __WI_HAS_FEATURE_IS_STANDARD_LAYOUT __has_feature(is_standard_layout)\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_COPYABLE __has_feature(is_trivially_copyable)\n#define __WI_HAS_FEATURE_IS_TRIVIAL __has_feature(is_trivial)\n#define __WI_HAS_FEATURE_HAS_TRIVIAL_CONSTRUCTOR __has_feature(has_trivial_constructor) || (__WI_GNUC_VER >= 403)\n#define __WI_HAS_FEATURE_HAS_NOTHROW_CONSTRUCTOR __has_feature(has_nothrow_constructor) || (__WI_GNUC_VER >= 403)\n#define __WI_HAS_FEATURE_HAS_NOTHROW_COPY __has_feature(has_nothrow_copy) || (__WI_GNUC_VER >= 403)\n#define __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN __has_feature(has_nothrow_assign) || (__WI_GNUC_VER >= 403)\n\n#if !(__has_feature(cxx_noexcept))\n#define __WI_LIBCPP_HAS_NO_NOEXCEPT\n#endif\n\n#if !__is_identifier(__has_unique_object_representations) || __WI_GNUC_VER >= 700\n#define __WI_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS\n#endif\n\n#if !(__has_feature(cxx_variadic_templates))\n#define __WI_LIBCPP_HAS_NO_VARIADICS\n#endif\n\n#if __has_feature(is_literal) || __WI_GNUC_VER >= 407\n#define __WI_LIBCPP_IS_LITERAL(T) __is_literal(T)\n#endif\n\n#if __has_feature(underlying_type) || __WI_GNUC_VER >= 407\n#define __WI_LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)\n#endif\n\n#if __has_feature(is_final) || __WI_GNUC_VER >= 407\n#define __WI_LIBCPP_HAS_IS_FINAL\n#endif\n\n#if __has_feature(is_base_of) || defined(__GNUC__) && __WI_GNUC_VER >= 403\n#define __WI_LIBCPP_HAS_IS_BASE_OF\n#endif\n\n#if __is_identifier(__is_aggregate) && (__WI_GNUC_VER_NEW < 7001)\n#define __WI_LIBCPP_HAS_NO_IS_AGGREGATE\n#endif\n\n#if !(__has_feature(cxx_rtti)) && !defined(__WI_LIBCPP_NO_RTTI)\n#define __WI_LIBCPP_NO_RTTI\n#endif\n\n#if !(__has_feature(cxx_variable_templates))\n#define __WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES\n#endif\n\n#if !(__has_feature(cxx_relaxed_constexpr))\n#define __WI_LIBCPP_HAS_NO_CXX14_CONSTEXPR\n#endif\n\n#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700\n#define __WI_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF\n#endif\n\n#if __has_attribute(__no_sanitize__) && !defined(__WI_LIBCPP_COMPILER_GCC)\n#define __WI_LIBCPP_NO_CFI __attribute__((__no_sanitize__(\"cfi\")))\n#else\n#define __WI_LIBCPP_NO_CFI\n#endif\n\n#define __WI_LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__))\n\n#if __has_attribute(internal_linkage)\n#define __WI_LIBCPP_INTERNAL_LINKAGE __attribute__((internal_linkage))\n#else\n#define __WI_LIBCPP_INTERNAL_LINKAGE __WI_LIBCPP_ALWAYS_INLINE\n#endif\n\n#else\n\n// NOTE: Much of the following assumes a decently recent version of MSVC. Past versions can be supported, but will need\n//       to be updated to contain the proper _MSC_VER check\n#define __WI_ALIGNAS_TYPE(x) alignas(x)\n#define __WI_ALIGNAS(x) alignas(x)\n#define __alignof__ __alignof\n\n#define __WI_LIBCPP_EXPLICIT explicit\n#define __WI_LIBCPP_NORETURN [[noreturn]]\n#define __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS __pragma(warning(suppress : 26495))\n#define __WI_LIBCPP_SUPPRESS_NOEXCEPT_ANALYSIS __pragma(warning(suppress : 26439))\n\n#if __WI_LIBCPP_STD_VER > 14\n#define __WI_LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]]\n#else\n#define __WI_LIBCPP_NODISCARD_ATTRIBUTE _Check_return_\n#endif\n\n#define __WI_HAS_FEATURE_IS_UNION 1\n#define __WI_HAS_FEATURE_IS_CLASS 1\n#define __WI_HAS_FEATURE_IS_ENUM 1\n#define __WI_HAS_FEATURE_IS_CONVERTIBLE_TO 1\n#define __WI_HAS_FEATURE_IS_EMPTY 1\n#define __WI_HAS_FEATURE_IS_POLYMORPHIC 1\n#define __WI_HAS_FEATURE_HAS_VIRTUAL_DESTRUCTOR 1\n#define __WI_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS 1\n#define __WI_HAS_FEATURE_REFERENCE_QUALIFIED_FUNCTIONS 1\n#define __WI_HAS_FEATURE_IS_CONSTRUCTIBLE 1\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE 1\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_ASSIGNABLE 1\n#define __WI_HAS_FEATURE_HAS_TRIVIAL_DESTRUCTOR 1\n#define __WI_HAS_FEATURE_NOEXCEPT 1\n#define __WI_HAS_FEATURE_IS_POD 1\n#define __WI_HAS_FEATURE_IS_STANDARD_LAYOUT 1\n#define __WI_HAS_FEATURE_IS_TRIVIALLY_COPYABLE 1\n#define __WI_HAS_FEATURE_IS_TRIVIAL 1\n#define __WI_HAS_FEATURE_HAS_TRIVIAL_CONSTRUCTOR 1\n#define __WI_HAS_FEATURE_HAS_NOTHROW_CONSTRUCTOR 1\n#define __WI_HAS_FEATURE_HAS_NOTHROW_COPY 1\n#define __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN 1\n#define __WI_HAS_FEATURE_IS_DESTRUCTIBLE 1\n\n#if !defined(_CPPRTTI) && !defined(__WI_LIBCPP_NO_RTTI)\n#define __WI_LIBCPP_NO_RTTI\n#endif\n\n#define __WI_LIBCPP_IS_LITERAL(T) __is_literal_type(T)\n#define __WI_LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)\n#define __WI_LIBCPP_HAS_IS_FINAL\n#define __WI_LIBCPP_HAS_IS_BASE_OF\n\n#if __WI_LIBCPP_STD_VER < 14\n#define __WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES\n#endif\n\n#define __WI_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF\n#define __WI_LIBCPP_NO_CFI\n\n#define __WI_LIBCPP_ALWAYS_INLINE __forceinline\n#define __WI_LIBCPP_INTERNAL_LINKAGE\n\n#endif\n\n#ifndef _WIN32\n\n#ifdef __LITTLE_ENDIAN__\n#if __LITTLE_ENDIAN__\n#define __WI_LIBCPP_LITTLE_ENDIAN\n#endif // __LITTLE_ENDIAN__\n#endif // __LITTLE_ENDIAN__\n\n#ifdef __BIG_ENDIAN__\n#if __BIG_ENDIAN__\n#define __WI_LIBCPP_BIG_ENDIAN\n#endif // __BIG_ENDIAN__\n#endif // __BIG_ENDIAN__\n\n#ifdef __BYTE_ORDER__\n#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#define __WI_LIBCPP_LITTLE_ENDIAN\n#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n#define __WI_LIBCPP_BIG_ENDIAN\n#endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n#endif // __BYTE_ORDER__\n\n#if !defined(__WI_LIBCPP_LITTLE_ENDIAN) && !defined(__WI_LIBCPP_BIG_ENDIAN)\n#include <endian.h>\n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#define __WI_LIBCPP_LITTLE_ENDIAN\n#elif __BYTE_ORDER == __BIG_ENDIAN\n#define __WI_LIBCPP_BIG_ENDIAN\n#else // __BYTE_ORDER == __BIG_ENDIAN\n#error unable to determine endian\n#endif\n#endif // !defined(__WI_LIBCPP_LITTLE_ENDIAN) && !defined(__WI_LIBCPP_BIG_ENDIAN)\n\n#else // _WIN32\n\n#define __WI_LIBCPP_LITTLE_ENDIAN\n\n#endif // _WIN32\n\n#ifdef __WI_LIBCPP_HAS_NO_CONSTEXPR\n#define __WI_LIBCPP_CONSTEXPR\n#else\n#define __WI_LIBCPP_CONSTEXPR constexpr\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_CXX14_CONSTEXPR)\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr\n#else\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX11\n#endif\n\n#if __WI_LIBCPP_STD_VER > 14 && !defined(__WI_LIBCPP_HAS_NO_CXX14_CONSTEXPR)\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr\n#else\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX14\n#endif\n\n#if __WI_LIBCPP_STD_VER > 17 && !defined(__WI_LIBCPP_HAS_NO_CXX14_CONSTEXPR)\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr\n#else\n#define __WI_LIBCPP_CONSTEXPR_AFTER_CXX17\n#endif\n\n#if !defined(__WI_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && (__WI_LIBCPP_STD_VER > 17 || defined(__WI_LIBCPP_ENABLE_NODISCARD))\n#define __WI_LIBCPP_NODISCARD_AFTER_CXX17 __WI_LIBCPP_NODISCARD_ATTRIBUTE\n#else\n#define __WI_LIBCPP_NODISCARD_AFTER_CXX17\n#endif\n\n#if __WI_LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L)\n#define __WI_LIBCPP_INLINE_VAR inline\n#else\n#define __WI_LIBCPP_INLINE_VAR\n#endif\n\n#ifdef __WI_LIBCPP_CXX03_LANG\n#define __WI_LIBCPP_HAS_NO_UNICODE_CHARS\n#define __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n#endif\n\n#ifndef __SIZEOF_INT128__\n#define __WI_LIBCPP_HAS_NO_INT128\n#endif\n\n#if !__WI_HAS_FEATURE_NOEXCEPT && !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT)\n#define __WI_LIBCPP_HAS_NO_NOEXCEPT\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_NOEXCEPT\n#define WI_NOEXCEPT noexcept\n#define __WI_NOEXCEPT_(x) noexcept(x)\n#else\n#define WI_NOEXCEPT throw()\n#define __WI_NOEXCEPT_(x)\n#endif\n\n#if defined(__WI_LIBCPP_OBJECT_FORMAT_COFF)\n#define __WI_LIBCPP_HIDDEN\n#define __WI_LIBCPP_TEMPLATE_VIS\n#endif // defined(__WI_LIBCPP_OBJECT_FORMAT_COFF)\n\n#ifndef __WI_LIBCPP_HIDDEN\n#if !defined(__WI_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)\n#define __WI_LIBCPP_HIDDEN __attribute__((__visibility__(\"hidden\")))\n#else\n#define __WI_LIBCPP_HIDDEN\n#endif\n#endif\n\n#ifndef __WI_LIBCPP_TEMPLATE_VIS\n#if !defined(__WI_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && !defined(__WI_LIBCPP_COMPILER_MSVC)\n#if __has_attribute(__type_visibility__)\n#define __WI_LIBCPP_TEMPLATE_VIS __attribute__((__type_visibility__(\"default\")))\n#else\n#define __WI_LIBCPP_TEMPLATE_VIS __attribute__((__visibility__(\"default\")))\n#endif\n#else\n#define __WI_LIBCPP_TEMPLATE_VIS\n#endif\n#endif\n\n#define __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_HIDDEN __WI_LIBCPP_INTERNAL_LINKAGE\n\nnamespace wistd // (\"Windows Implementation\" std)\n{\nusing nullptr_t = decltype(__nullptr);\n\ntemplate <class _T1, class _T2 = _T1>\nstruct __less\n{\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T1& __x, const _T1& __y) const\n    {\n        return __x < __y;\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T1& __x, const _T2& __y) const\n    {\n        return __x < __y;\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T2& __x, const _T1& __y) const\n    {\n        return __x < __y;\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T2& __x, const _T2& __y) const\n    {\n        return __x < __y;\n    }\n};\n\ntemplate <class _T1>\nstruct __less<_T1, _T1>\n{\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T1& __x, const _T1& __y) const\n    {\n        return __x < __y;\n    }\n};\n\ntemplate <class _T1>\nstruct __less<const _T1, _T1>\n{\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T1& __x, const _T1& __y) const\n    {\n        return __x < __y;\n    }\n};\n\ntemplate <class _T1>\nstruct __less<_T1, const _T1>\n{\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(\n        const _T1& __x, const _T1& __y) const\n    {\n        return __x < __y;\n    }\n};\n\n// These are added to wistd to enable use of min/max without having to use the windows.h min/max\n// macros that some clients might not have access to. Note: the STL versions of these have debug\n// checking for the less than operator and support for iterators that these implementations lack.\n// Use the STL versions when you require use of those features.\n\n// min\n\ntemplate <class _Tp, class _Compare>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 const _Tp&(min)(const _Tp& __a, const _Tp& __b, _Compare __comp)\n{\n    return __comp(__b, __a) ? __b : __a;\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 const _Tp&(min)(const _Tp& __a, const _Tp& __b)\n{\n    return (min)(__a, __b, __less<_Tp>());\n}\n\n// max\n\ntemplate <class _Tp, class _Compare>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 const _Tp&(max)(const _Tp& __a, const _Tp& __b, _Compare __comp)\n{\n    return __comp(__a, __b) ? __b : __a;\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 const _Tp&(max)(const _Tp& __a, const _Tp& __b)\n{\n    return (max)(__a, __b, __less<_Tp>());\n}\n\ntemplate <class _Arg, class _Result>\nstruct __WI_LIBCPP_TEMPLATE_VIS unary_function\n{\n    using argument_type = _Arg;\n    using result_type = _Result;\n};\n\ntemplate <class _Arg1, class _Arg2, class _Result>\nstruct __WI_LIBCPP_TEMPLATE_VIS binary_function\n{\n    using first_argument_type = _Arg1;\n    using second_argument_type = _Arg2;\n    using result_type = _Result;\n};\n} // namespace wistd\n/// @endcond\n\n#endif // _WISTD_CONFIG_H_\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/wistd_functional.h",
    "content": "// -*- C++ -*-\n//===------------------------ functional ----------------------------------===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is dual licensed under the MIT and the University of Illinois Open\n// Source Licenses. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n// STL common functionality\n//\n// Some aspects of STL are core language concepts that should be used from all C++ code, regardless\n// of whether exceptions are enabled in the component.  Common library code that expects to be used\n// from exception-free components want these concepts, but including STL headers directly introduces\n// friction as it requires components not using STL to declare their STL version.  Doing so creates\n// ambiguity around whether STL use is safe in a particular component and implicitly brings in\n// a long list of headers (including <new>) which can create further ambiguity around throwing new\n// support (some routines pulled in may expect it).  Secondarily, pulling in these headers also has\n// the potential to create naming conflicts or other implied dependencies.\n//\n// To promote the use of these core language concepts outside of STL-based binaries, this file is\n// selectively pulling those concepts *directly* from corresponding STL headers.  The corresponding\n// \"std::\" namespace STL functions and types should be preferred over these in code that is bound to\n// STL.  The implementation and naming of all functions are taken directly from STL, instead using\n// \"wistd\" (Windows Implementation std) as the namespace.\n//\n// Routines in this namespace should always be considered a reflection of the *current* STL implementation\n// of those routines.  Updates from STL should be taken, but no \"bugs\" should be fixed here.\n//\n// New, exception-based code should not use this namespace, but instead should prefer the std:: implementation.\n// Only code that is not exception-based and libraries that expect to be utilized across both exception\n// and non-exception based code should utilize this functionality.\n\n#ifndef _WISTD_FUNCTIONAL_H_\n#define _WISTD_FUNCTIONAL_H_\n\n// DO NOT add *any* additional includes to this file -- there should be no dependencies from its usage\n#include \"wistd_memory.h\"\n#include <intrin.h> // For __fastfail\n#include <new.h>    // For placement new\n\n#if !defined(__WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)\n#pragma GCC system_header\n#endif\n\n#pragma warning(push)\n#pragma warning(disable : 4324)\n#pragma warning(disable : 4800)\n\n/// @cond\nnamespace wistd // (\"Windows Implementation\" std)\n{\n// wistd::function\n//\n// All of the code below is in direct support of wistd::function.  This class is identical to std::function\n// with the following exceptions:\n//\n// 1) It never allocates and is safe to use from exception-free code (custom allocators are not supported)\n// 2) It's slightly bigger on the stack (64 bytes, rather than 24 for 32bit)\n// 3) There is an explicit static-assert if a lambda becomes too large to hold in the internal buffer (rather than an allocation)\n\ntemplate <class _Ret>\nstruct __invoke_void_return_wrapper\n{\n#ifndef __WI_LIBCPP_CXX03_LANG\n    template <class... _Args>\n    static _Ret __call(_Args&&... __args)\n    {\n        return __invoke(wistd::forward<_Args>(__args)...);\n    }\n#else\n    template <class _Fn>\n    static _Ret __call(_Fn __f)\n    {\n        return __invoke(__f);\n    }\n\n    template <class _Fn, class _A0>\n    static _Ret __call(_Fn __f, _A0& __a0)\n    {\n        return __invoke(__f, __a0);\n    }\n\n    template <class _Fn, class _A0, class _A1>\n    static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1)\n    {\n        return __invoke(__f, __a0, __a1);\n    }\n\n    template <class _Fn, class _A0, class _A1, class _A2>\n    static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2)\n    {\n        return __invoke(__f, __a0, __a1, __a2);\n    }\n#endif\n};\n\ntemplate <>\nstruct __invoke_void_return_wrapper<void>\n{\n#ifndef __WI_LIBCPP_CXX03_LANG\n    template <class... _Args>\n    static void __call(_Args&&... __args)\n    {\n        (void)__invoke(wistd::forward<_Args>(__args)...);\n    }\n#else\n    template <class _Fn>\n    static void __call(_Fn __f)\n    {\n        __invoke(__f);\n    }\n\n    template <class _Fn, class _A0>\n    static void __call(_Fn __f, _A0& __a0)\n    {\n        __invoke(__f, __a0);\n    }\n\n    template <class _Fn, class _A0, class _A1>\n    static void __call(_Fn __f, _A0& __a0, _A1& __a1)\n    {\n        __invoke(__f, __a0, __a1);\n    }\n\n    template <class _Fn, class _A0, class _A1, class _A2>\n    static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2)\n    {\n        __invoke(__f, __a0, __a1, __a2);\n    }\n#endif\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//                                FUNCTION\n//==============================================================================\n\n// bad_function_call\n\n__WI_LIBCPP_NORETURN inline __WI_LIBCPP_INLINE_VISIBILITY void __throw_bad_function_call()\n{\n    __fastfail(7); // FAST_FAIL_FATAL_APP_EXIT\n}\n\ntemplate <class _Fp>\nclass __WI_LIBCPP_TEMPLATE_VIS function; // undefined\n\nnamespace __function\n{\n\n    template <class _Rp>\n    struct __maybe_derive_from_unary_function\n    {\n    };\n\n    template <class _Rp, class _A1>\n    struct __maybe_derive_from_unary_function<_Rp(_A1)> : public unary_function<_A1, _Rp>\n    {\n    };\n\n    template <class _Rp>\n    struct __maybe_derive_from_binary_function\n    {\n    };\n\n    template <class _Rp, class _A1, class _A2>\n    struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> : public binary_function<_A1, _A2, _Rp>\n    {\n    };\n\n    template <class _Fp>\n    __WI_LIBCPP_INLINE_VISIBILITY bool __not_null(_Fp const&)\n    {\n        return true;\n    }\n\n    template <class _Fp>\n    __WI_LIBCPP_INLINE_VISIBILITY bool __not_null(_Fp* __ptr)\n    {\n        return __ptr;\n    }\n\n    template <class _Ret, class _Class>\n    __WI_LIBCPP_INLINE_VISIBILITY bool __not_null(_Ret _Class::* __ptr)\n    {\n        return __ptr;\n    }\n\n    template <class _Fp>\n    __WI_LIBCPP_INLINE_VISIBILITY bool __not_null(function<_Fp> const& __f)\n    {\n        return !!__f;\n    }\n\n} // namespace __function\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n\nnamespace __function\n{\n\n    template <class _Fp>\n    class __base;\n\n    template <class _Rp, class... _ArgTypes>\n    class __base<_Rp(_ArgTypes...)>\n    {\n        __base(const __base&);\n        __base& operator=(const __base&);\n\n    public:\n        __WI_LIBCPP_INLINE_VISIBILITY __base()\n        {\n        }\n        __WI_LIBCPP_INLINE_VISIBILITY virtual ~__base()\n        {\n        }\n        virtual void __clone(__base*) const = 0;\n        virtual void __move(__base*) = 0;\n        virtual void destroy() WI_NOEXCEPT = 0;\n        virtual _Rp operator()(_ArgTypes&&...) = 0;\n    };\n\n    template <class _FD, class _FB>\n    class __func;\n\n    template <class _Fp, class _Rp, class... _ArgTypes>\n    class __func<_Fp, _Rp(_ArgTypes...)> : public __base<_Rp(_ArgTypes...)>\n    {\n        _Fp __f_;\n\n    public:\n        __WI_LIBCPP_INLINE_VISIBILITY\n        explicit __func(_Fp&& __f) : __f_(wistd::move(__f))\n        {\n        }\n\n        __WI_LIBCPP_INLINE_VISIBILITY\n        explicit __func(const _Fp& __f) : __f_(__f)\n        {\n        }\n\n        virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;\n        virtual void __move(__base<_Rp(_ArgTypes...)>*);\n        virtual void destroy() WI_NOEXCEPT;\n        virtual _Rp operator()(_ArgTypes&&... __arg);\n    };\n\n    template <class _Fp, class _Rp, class... _ArgTypes>\n    void __func<_Fp, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const\n    {\n        ::new (__p) __func(__f_);\n    }\n\n    template <class _Fp, class _Rp, class... _ArgTypes>\n    void __func<_Fp, _Rp(_ArgTypes...)>::__move(__base<_Rp(_ArgTypes...)>* __p)\n    {\n        ::new (__p) __func(wistd::move(__f_));\n    }\n\n    template <class _Fp, class _Rp, class... _ArgTypes>\n    void __func<_Fp, _Rp(_ArgTypes...)>::destroy() WI_NOEXCEPT\n    {\n        __f_.~_Fp();\n    }\n\n    template <class _Fp, class _Rp, class... _ArgTypes>\n    _Rp __func<_Fp, _Rp(_ArgTypes...)>::operator()(_ArgTypes&&... __arg)\n    {\n        typedef __invoke_void_return_wrapper<_Rp> _Invoker;\n        return _Invoker::__call(__f_, wistd::forward<_ArgTypes>(__arg)...);\n    }\n\n    // 'wistd::function' is most similar to 'inplace_function' in that it _only_ permits holding function objects\n    // that can fit within its internal buffer. Therefore, we expand this size to accommodate space for at least 12\n    // pointers (__base vtable takes an additional one).\n    constexpr const size_t __buffer_size = 13 * sizeof(void*);\n\n} // namespace __function\n\n// NOTE: The extra 'alignas' here is to work around the x86 compiler bug mentioned in\n// https://github.com/microsoft/STL/issues/1533 to force alignment on the stack\ntemplate <class _Rp, class... _ArgTypes>\nclass __WI_LIBCPP_TEMPLATE_VIS __WI_ALIGNAS(typename aligned_storage<__function::__buffer_size>::type) function<_Rp(_ArgTypes...)>\n    : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,\n      public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>\n{\n    using __base = __function::__base<_Rp(_ArgTypes...)>;\n    __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS\n    typename aligned_storage<__function::__buffer_size>::type __buf_;\n    __base* __f_;\n\n    __WI_LIBCPP_NO_CFI static __base* __as_base(void* p)\n    {\n        return static_cast<__base*>(p);\n    }\n\n    template <class _Fp, bool>\n    struct __callable_imp\n    {\n        static const bool value = is_same<void, _Rp>::value || is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type, _Rp>::value;\n    };\n\n    template <class _Fp>\n    struct __callable_imp<_Fp, false>\n    {\n        static constexpr bool value = false;\n    };\n\n    template <class _Fp>\n    struct __callable\n    {\n        static const bool value =\n            __callable_imp<_Fp, __lazy_and<integral_constant<bool, !is_same<__uncvref_t<_Fp>, function>::value>, __invokable<_Fp&, _ArgTypes...>>::value>::value;\n    };\n\n    template <class _Fp>\n    using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type;\n\npublic:\n    using result_type = _Rp;\n\n    // construct/copy/destroy:\n    __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function() WI_NOEXCEPT : __f_(0)\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    function(nullptr_t) WI_NOEXCEPT : __f_(0)\n    {\n    }\n    function(const function&);\n    function(function&&);\n    template <class _Fp, class = _EnableIfCallable<_Fp>>\n    function(_Fp);\n\n    function& operator=(const function&);\n    function& operator=(function&&);\n    function& operator=(nullptr_t) WI_NOEXCEPT;\n    template <class _Fp, class = _EnableIfCallable<_Fp>>\n    function& operator=(_Fp&&);\n\n    ~function();\n\n    // function modifiers:\n    void swap(function&);\n\n    // function capacity:\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_EXPLICIT operator bool() const WI_NOEXCEPT\n    {\n        return __f_;\n    }\n\n    // deleted overloads close possible hole in the type system\n    template <class _R2, class... _ArgTypes2>\n    bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;\n    template <class _R2, class... _ArgTypes2>\n    bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;\n\npublic:\n    // function invocation:\n    _Rp operator()(_ArgTypes...) const;\n\n    // NOTE: type_info is very compiler specific, and on top of that, we're operating in a namespace other than\n    // 'std' so all functions requiring RTTI have been removed\n};\n\ntemplate <class _Rp, class... _ArgTypes>\n__WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function<_Rp(_ArgTypes...)>::function(const function& __f)\n{\n    if (__f.__f_ == nullptr)\n        __f_ = 0;\n    else\n    {\n        __f_ = __as_base(&__buf_);\n        __f.__f_->__clone(__f_);\n    }\n}\n\ntemplate <class _Rp, class... _ArgTypes>\n__WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS __WI_LIBCPP_SUPPRESS_NOEXCEPT_ANALYSIS function<_Rp(_ArgTypes...)>::function(function&& __f)\n{\n    if (__f.__f_ == nullptr)\n        __f_ = 0;\n    else\n    {\n        __f_ = __as_base(&__buf_);\n        __f.__f_->__move(__f_);\n        __f.__f_->destroy();\n        __f.__f_ = 0;\n    }\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ntemplate <class _Fp, class>\n__WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function<_Rp(_ArgTypes...)>::function(_Fp __f) : __f_(nullptr)\n{\n    if (__function::__not_null(__f))\n    {\n        typedef __function::__func<_Fp, _Rp(_ArgTypes...)> _FF;\n        static_assert(\n            sizeof(_FF) <= sizeof(__buf_),\n            \"The sizeof(wistd::function) has grown too large for the reserved buffer (12 pointers).  Refactor to reduce size of the capture.\");\n        __f_ = ::new (static_cast<void*>(&__buf_)) _FF(wistd::move(__f));\n    }\n}\n\ntemplate <class _Rp, class... _ArgTypes>\nfunction<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(const function& __f)\n{\n    *this = nullptr;\n    if (__f.__f_)\n    {\n        __f_ = __as_base(&__buf_);\n        __f.__f_->__clone(__f_);\n    }\n    return *this;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\nfunction<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(function&& __f)\n{\n    *this = nullptr;\n    if (__f.__f_)\n    {\n        __f_ = __as_base(&__buf_);\n        __f.__f_->__move(__f_);\n        __f.__f_->destroy();\n        __f.__f_ = 0;\n    }\n    return *this;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\nfunction<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(nullptr_t) WI_NOEXCEPT\n{\n    __base* __t = __f_;\n    __f_ = 0;\n    if (__t)\n        __t->destroy();\n    return *this;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ntemplate <class _Fp, class>\nfunction<_Rp(_ArgTypes...)>& function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)\n{\n    *this = nullptr;\n    if (__function::__not_null(__f))\n    {\n        typedef __function::__func<typename decay<_Fp>::type, _Rp(_ArgTypes...)> _FF;\n        static_assert(\n            sizeof(_FF) <= sizeof(__buf_),\n            \"The sizeof(wistd::function) has grown too large for the reserved buffer (12 pointers).  Refactor to reduce size of the capture.\");\n        __f_ = ::new (static_cast<void*>(&__buf_)) _FF(wistd::move(__f));\n    }\n\n    return *this;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\nfunction<_Rp(_ArgTypes...)>::~function()\n{\n    if (__f_)\n        __f_->destroy();\n}\n\ntemplate <class _Rp, class... _ArgTypes>\nvoid function<_Rp(_ArgTypes...)>::swap(function& __f)\n{\n    if (wistd::addressof(__f) == this)\n        return;\n    if (__f_ && __f.__f_)\n    {\n        typename aligned_storage<sizeof(__buf_)>::type __tempbuf;\n        __base* __t = __as_base(&__tempbuf);\n        __f_->__move(__t);\n        __f_->destroy();\n        __f_ = 0;\n        __f.__f_->__move(__as_base(&__buf_));\n        __f.__f_->destroy();\n        __f.__f_ = 0;\n        __f_ = __as_base(&__buf_);\n        __t->__move(__as_base(&__f.__buf_));\n        __t->destroy();\n        __f.__f_ = __as_base(&__f.__buf_);\n    }\n    else if (__f_)\n    {\n        __f_->__move(__as_base(&__f.__buf_));\n        __f_->destroy();\n        __f_ = 0;\n        __f.__f_ = __as_base(&__f.__buf_);\n    }\n    else if (__f.__f_)\n    {\n        __f.__f_->__move(__as_base(&__buf_));\n        __f.__f_->destroy();\n        __f.__f_ = 0;\n        __f_ = __as_base(&__buf_);\n    }\n}\n\ntemplate <class _Rp, class... _ArgTypes>\n_Rp function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const\n{\n    if (__f_ == nullptr)\n        __throw_bad_function_call();\n    return (*__f_)(wistd::forward<_ArgTypes>(__arg)...);\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) WI_NOEXCEPT\n{\n    return !__f;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) WI_NOEXCEPT\n{\n    return !__f;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) WI_NOEXCEPT\n{\n    return (bool)__f;\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) WI_NOEXCEPT\n{\n    return (bool)__f;\n}\n\n// Provide both 'swap_wil' and 'swap' since we now have two ADL scenarios that we need to work\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY void swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y)\n{\n    return __x.swap(__y);\n}\n\ntemplate <class _Rp, class... _ArgTypes>\ninline __WI_LIBCPP_INLINE_VISIBILITY void swap_wil(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y)\n{\n    return __x.swap(__y);\n}\n\n// std::invoke\ntemplate <class _Fn, class... _Args>\ntypename __invoke_of<_Fn, _Args...>::type invoke(_Fn&& __f, _Args&&... __args)\n    __WI_NOEXCEPT_((__nothrow_invokable<_Fn, _Args...>::value))\n{\n    return wistd::__invoke(wistd::forward<_Fn>(__f), wistd::forward<_Args>(__args)...);\n}\n\n#else // __WI_LIBCPP_CXX03_LANG\n\n#error wistd::function and wistd::invoke not implemented for pre-C++11\n\n#endif\n} // namespace wistd\n/// @endcond\n\n#pragma warning(pop)\n\n#endif // _WISTD_FUNCTIONAL_H_\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/wistd_memory.h",
    "content": "// -*- C++ -*-\n//===-------------------------- memory ------------------------------------===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is dual licensed under the MIT and the University of Illinois Open\n// Source Licenses. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n// STL common functionality\n//\n// Some aspects of STL are core language concepts that should be used from all C++ code, regardless\n// of whether exceptions are enabled in the component.  Common library code that expects to be used\n// from exception-free components want these concepts, but including STL headers directly introduces\n// friction as it requires components not using STL to declare their STL version.  Doing so creates\n// ambiguity around whether STL use is safe in a particular component and implicitly brings in\n// a long list of headers (including <new>) which can create further ambiguity around throwing new\n// support (some routines pulled in may expect it).  Secondarily, pulling in these headers also has\n// the potential to create naming conflicts or other implied dependencies.\n//\n// To promote the use of these core language concepts outside of STL-based binaries, this file is\n// selectively pulling those concepts *directly* from corresponding STL headers.  The corresponding\n// \"std::\" namespace STL functions and types should be preferred over these in code that is bound to\n// STL.  The implementation and naming of all functions are taken directly from STL, instead using\n// \"wistd\" (Windows Implementation std) as the namespace.\n//\n// Routines in this namespace should always be considered a reflection of the *current* STL implementation\n// of those routines.  Updates from STL should be taken, but no \"bugs\" should be fixed here.\n//\n// New, exception-based code should not use this namespace, but instead should prefer the std:: implementation.\n// Only code that is not exception-based and libraries that expect to be utilized across both exception\n// and non-exception based code should utilize this functionality.\n\n#ifndef _WISTD_MEMORY_H_\n#define _WISTD_MEMORY_H_\n\n// DO NOT add *any* additional includes to this file -- there should be no dependencies from its usage\n#include \"wistd_type_traits.h\"\n\n#if !defined(__WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)\n#pragma GCC system_header\n#endif\n\n/// @cond\nnamespace wistd // (\"Windows Implementation\" std)\n{\n// allocator_traits\n\ntemplate <class _Tp, class = void>\nstruct __has_pointer_type : false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __has_pointer_type<_Tp, typename __void_t<typename _Tp::pointer>::type> : true_type\n{\n};\n\nnamespace __pointer_type_imp\n{\n\n    template <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value>\n    struct __pointer_type\n    {\n        using type = typename _Dp::pointer;\n    };\n\n    template <class _Tp, class _Dp>\n    struct __pointer_type<_Tp, _Dp, false>\n    {\n        using type = _Tp*;\n    };\n\n} // namespace __pointer_type_imp\n\ntemplate <class _Tp, class _Dp>\nstruct __pointer_type\n{\n    using type = typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type;\n};\n\ntemplate <class _Tp, int _Idx, bool _CanBeEmptyBase = is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value>\nstruct __compressed_pair_elem\n{\n    using _ParamT = _Tp;\n    using reference = _Tp&;\n    using const_reference = const _Tp&;\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_()\n    {\n    }\n\n    template <class _Up, class = typename enable_if<!is_same<__compressed_pair_elem, typename decay<_Up>::type>::value>::type>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr explicit __compressed_pair_elem(_Up&& __u) : __value_(wistd::forward<_Up>(__u))\n    {\n    }\n\n    // NOTE: Since we have not added 'tuple' to 'wistd', the 'piecewise' constructor has been removed\n#else\n    __WI_LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_()\n    {\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    __compressed_pair_elem(_ParamT __p) : __value_(wistd::forward<_ParamT>(__p))\n    {\n    }\n#endif\n\n    __WI_LIBCPP_INLINE_VISIBILITY reference __get() WI_NOEXCEPT\n    {\n        return __value_;\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY const_reference __get() const WI_NOEXCEPT\n    {\n        return __value_;\n    }\n\nprivate:\n    _Tp __value_;\n};\n\ntemplate <class _Tp, int _Idx>\nstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp\n{\n    using _ParamT = _Tp;\n    using reference = _Tp&;\n    using const_reference = const _Tp&;\n    using __value_type = _Tp;\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default;\n\n    template <class _Up, class = typename enable_if<!is_same<__compressed_pair_elem, typename decay<_Up>::type>::value>::type>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr explicit __compressed_pair_elem(_Up&& __u) : __value_type(wistd::forward<_Up>(__u))\n    {\n    }\n\n    // NOTE: Since we have not added 'tuple' to 'wistd', the 'piecewise' constructor has been removed\n#else\n    __WI_LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_type()\n    {\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    __compressed_pair_elem(_ParamT __p) : __value_type(wistd::forward<_ParamT>(__p))\n    {\n    }\n#endif\n\n    __WI_LIBCPP_INLINE_VISIBILITY reference __get() WI_NOEXCEPT\n    {\n        return *this;\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY const_reference __get() const WI_NOEXCEPT\n    {\n        return *this;\n    }\n};\n\n// Tag used to construct the second element of the compressed pair.\nstruct __second_tag\n{\n};\n\ntemplate <class _T1, class _T2>\nclass __declspec(empty_bases) __compressed_pair : private __compressed_pair_elem<_T1, 0>, private __compressed_pair_elem<_T2, 1>\n{\n    using _Base1 = __compressed_pair_elem<_T1, 0>;\n    using _Base2 = __compressed_pair_elem<_T2, 1>;\n\n    // NOTE: This static assert should never fire because __compressed_pair\n    // is *almost never* used in a scenario where it's possible for T1 == T2.\n    // (The exception is wistd::function where it is possible that the function\n    //  object and the allocator have the same type).\n    static_assert(\n        (!is_same<_T1, _T2>::value),\n        \"__compressed_pair cannot be instantated when T1 and T2 are the same type; \"\n        \"The current implementation is NOT ABI-compatible with the previous \"\n        \"implementation for this configuration\");\n\npublic:\n#ifndef __WI_LIBCPP_CXX03_LANG\n    template <\n        bool _Dummy = true,\n        class = typename enable_if<__dependent_type<is_default_constructible<_T1>, _Dummy>::value && __dependent_type<is_default_constructible<_T2>, _Dummy>::value>::type>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair()\n    {\n    }\n\n    template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type, __compressed_pair>::value, bool>::type = true>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr explicit __compressed_pair(_Tp&& __t) : _Base1(wistd::forward<_Tp>(__t)), _Base2()\n    {\n    }\n\n    template <class _Tp>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair(__second_tag, _Tp&& __t) :\n        _Base1(), _Base2(wistd::forward<_Tp>(__t))\n    {\n    }\n\n    template <class _U1, class _U2>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair(_U1&& __t1, _U2&& __t2) :\n        _Base1(wistd::forward<_U1>(__t1)), _Base2(wistd::forward<_U2>(__t2))\n    {\n    }\n\n    // NOTE: Since we have not added 'tuple' to 'wistd', the 'piecewise' constructor has been removed\n#else\n    __WI_LIBCPP_INLINE_VISIBILITY\n    __compressed_pair()\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1 __t1) : _Base1(wistd::forward<_T1>(__t1))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    __compressed_pair(__second_tag, _T2 __t2) : _Base1(), _Base2(wistd::forward<_T2>(__t2))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    __compressed_pair(_T1 __t1, _T2 __t2) : _Base1(wistd::forward<_T1>(__t1)), _Base2(wistd::forward<_T2>(__t2))\n    {\n    }\n#endif\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    typename _Base1::reference first() WI_NOEXCEPT\n    {\n        return static_cast<_Base1&>(*this).__get();\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY typename _Base1::const_reference first() const WI_NOEXCEPT\n    {\n        return static_cast<_Base1 const&>(*this).__get();\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    typename _Base2::reference second() WI_NOEXCEPT\n    {\n        return static_cast<_Base2&>(*this).__get();\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY typename _Base2::const_reference second() const WI_NOEXCEPT\n    {\n        return static_cast<_Base2 const&>(*this).__get();\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    void swap(__compressed_pair& __x) __WI_NOEXCEPT_(__is_nothrow_swappable<_T1>::value&& __is_nothrow_swappable<_T2>::value)\n    {\n        using wistd::swap_wil;\n        swap_wil(first(), __x.first());\n        swap_wil(second(), __x.second());\n    }\n};\n\n// Provide both 'swap_wil' and 'swap' since we now have two ADL scenarios that we need to work\ntemplate <class _T1, class _T2>\ninline __WI_LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)\n    __WI_NOEXCEPT_(__is_nothrow_swappable<_T1>::value&& __is_nothrow_swappable<_T2>::value)\n{\n    __x.swap(__y);\n}\n\ntemplate <class _T1, class _T2>\ninline __WI_LIBCPP_INLINE_VISIBILITY void swap_wil(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)\n    __WI_NOEXCEPT_(__is_nothrow_swappable<_T1>::value&& __is_nothrow_swappable<_T2>::value)\n{\n    __x.swap(__y);\n}\n\n// default_delete\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS default_delete\n{\n    static_assert(!is_function<_Tp>::value, \"default_delete cannot be instantiated for function types\");\n#ifndef __WI_LIBCPP_CXX03_LANG\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr default_delete() WI_NOEXCEPT = default;\n#else\n    __WI_LIBCPP_INLINE_VISIBILITY default_delete()\n    {\n    }\n#endif\n    template <class _Up>\n    __WI_LIBCPP_INLINE_VISIBILITY default_delete(\n        const default_delete<_Up>&, typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = nullptr) WI_NOEXCEPT\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const WI_NOEXCEPT\n    {\n        static_assert(sizeof(_Tp) > 0, \"default_delete can not delete incomplete type\");\n        static_assert(!is_void<_Tp>::value, \"default_delete can not delete incomplete type\");\n        delete __ptr;\n    }\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS default_delete<_Tp[]>\n{\nprivate:\n    template <class _Up>\n    struct _EnableIfConvertible : enable_if<is_convertible<_Up (*)[], _Tp (*)[]>::value>\n    {\n    };\n\npublic:\n#ifndef __WI_LIBCPP_CXX03_LANG\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr default_delete() WI_NOEXCEPT = default;\n#else\n    __WI_LIBCPP_INLINE_VISIBILITY default_delete()\n    {\n    }\n#endif\n\n    template <class _Up>\n    __WI_LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, typename _EnableIfConvertible<_Up>::type* = nullptr) WI_NOEXCEPT\n    {\n    }\n\n    template <class _Up>\n    __WI_LIBCPP_INLINE_VISIBILITY typename _EnableIfConvertible<_Up>::type operator()(_Up* __ptr) const WI_NOEXCEPT\n    {\n        static_assert(sizeof(_Tp) > 0, \"default_delete can not delete incomplete type\");\n        static_assert(!is_void<_Tp>::value, \"default_delete can not delete void type\");\n        delete[] __ptr;\n    }\n};\n\n#ifndef __WI_LIBCPP_CXX03_LANG\ntemplate <class _Deleter>\nstruct __unique_ptr_deleter_sfinae\n{\n    static_assert(!is_reference<_Deleter>::value, \"incorrect specialization\");\n    using __lval_ref_type = const _Deleter&;\n    using __good_rval_ref_type = _Deleter&&;\n    using __enable_rval_overload = true_type;\n};\n\ntemplate <class _Deleter>\nstruct __unique_ptr_deleter_sfinae<_Deleter const&>\n{\n    using __lval_ref_type = const _Deleter&;\n    using __bad_rval_ref_type = const _Deleter&&;\n    using __enable_rval_overload = false_type;\n};\n\ntemplate <class _Deleter>\nstruct __unique_ptr_deleter_sfinae<_Deleter&>\n{\n    using __lval_ref_type = _Deleter&;\n    using __bad_rval_ref_type = _Deleter&&;\n    using __enable_rval_overload = false_type;\n};\n#endif // !defined(__WI_LIBCPP_CXX03_LANG)\n\ntemplate <class _Tp, class _Dp = default_delete<_Tp>>\nclass __WI_LIBCPP_TEMPLATE_VIS unique_ptr\n{\npublic:\n    using element_type = _Tp;\n    using deleter_type = _Dp;\n    using pointer = typename __pointer_type<_Tp, deleter_type>::type;\n\n    static_assert(!is_rvalue_reference<deleter_type>::value, \"the specified deleter type cannot be an rvalue reference\");\n\nprivate:\n    __compressed_pair<pointer, deleter_type> __ptr_;\n\n    struct __nat\n    {\n        int __for_bool_;\n    };\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n    using _DeleterSFINAE = __unique_ptr_deleter_sfinae<_Dp>;\n\n    template <bool _Dummy>\n    using _LValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;\n\n    template <bool _Dummy>\n    using _GoodRValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;\n\n    template <bool _Dummy>\n    using _BadRValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;\n\n    template <bool _Dummy, class _Deleter = typename __dependent_type<__identity<deleter_type>, _Dummy>::type>\n    using _EnableIfDeleterDefaultConstructible =\n        typename enable_if<is_default_constructible<_Deleter>::value && !is_pointer<_Deleter>::value>::type;\n\n    template <class _ArgType>\n    using _EnableIfDeleterConstructible = typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;\n\n    template <class _UPtr, class _Up>\n    using _EnableIfMoveConvertible =\n        typename enable_if<is_convertible<typename _UPtr::pointer, pointer>::value && !is_array<_Up>::value>::type;\n\n    template <class _UDel>\n    using _EnableIfDeleterConvertible =\n        typename enable_if<(is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)>::type;\n\n    template <class _UDel>\n    using _EnableIfDeleterAssignable = typename enable_if<is_assignable<_Dp&, _UDel&&>::value>::type;\n\npublic:\n    template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr unique_ptr() WI_NOEXCEPT : __ptr_(pointer())\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr unique_ptr(nullptr_t) WI_NOEXCEPT : __ptr_(pointer())\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>>\n    __WI_LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) WI_NOEXCEPT : __ptr_(__p)\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, _LValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(__p, __d)\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(__p, wistd::move(__d))\n    {\n        static_assert(!is_reference<deleter_type>::value, \"rvalue deleter bound to reference\");\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete;\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(unique_ptr&& __u) WI_NOEXCEPT : __ptr_(__u.release(), wistd::forward<deleter_type>(__u.get_deleter()))\n    {\n    }\n\n    template <class _Up, class _Ep, class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, class = _EnableIfDeleterConvertible<_Ep>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr<_Up, _Ep>&& __u) WI_NOEXCEPT\n        : __ptr_(__u.release(), wistd::forward<_Ep>(__u.get_deleter()))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr& operator=(unique_ptr&& __u) WI_NOEXCEPT\n    {\n        reset(__u.release());\n        __ptr_.second() = wistd::forward<deleter_type>(__u.get_deleter());\n        return *this;\n    }\n\n    template <class _Up, class _Ep, class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, class = _EnableIfDeleterAssignable<_Ep>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) WI_NOEXCEPT\n    {\n        reset(__u.release());\n        __ptr_.second() = wistd::forward<_Ep>(__u.get_deleter());\n        return *this;\n    }\n\n#else  // __WI_LIBCPP_CXX03_LANG\nprivate:\n    unique_ptr(unique_ptr&);\n    template <class _Up, class _Ep>\n    unique_ptr(unique_ptr<_Up, _Ep>&);\n\n    unique_ptr& operator=(unique_ptr&);\n    template <class _Up, class _Ep>\n    unique_ptr& operator=(unique_ptr<_Up, _Ep>&);\n\npublic:\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr() : __ptr_(pointer())\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n        static_assert(is_default_constructible<deleter_type>::value, \"unique_ptr::deleter_type is not default constructible\");\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(nullptr_t) : __ptr_(pointer())\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    explicit unique_ptr(pointer __p) : __ptr_(wistd::move(__p))\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    operator __rv<unique_ptr>()\n    {\n        return __rv<unique_ptr>(*this);\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(__rv<unique_ptr> __u) : __ptr_(__u->release(), wistd::forward<deleter_type>(__u->get_deleter()))\n    {\n    }\n\n    template <class _Up, class _Ep>\n    __WI_LIBCPP_INLINE_VISIBILITY typename enable_if<\n        !is_array<_Up>::value && is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && is_assignable<deleter_type&, _Ep&>::value,\n        unique_ptr&>::type\n    operator=(unique_ptr<_Up, _Ep> __u)\n    {\n        reset(__u.release());\n        __ptr_.second() = wistd::forward<_Ep>(__u.get_deleter());\n        return *this;\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(pointer __p, deleter_type __d) : __ptr_(wistd::move(__p), wistd::move(__d))\n    {\n    }\n#endif // __WI_LIBCPP_CXX03_LANG\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    ~unique_ptr()\n    {\n        reset();\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr& operator=(nullptr_t) WI_NOEXCEPT\n    {\n        reset();\n        return *this;\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const\n    {\n        return *__ptr_.first();\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY pointer operator->() const WI_NOEXCEPT\n    {\n        return __ptr_.first();\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY pointer get() const WI_NOEXCEPT\n    {\n        return __ptr_.first();\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    deleter_type& get_deleter() WI_NOEXCEPT\n    {\n        return __ptr_.second();\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY const deleter_type& get_deleter() const WI_NOEXCEPT\n    {\n        return __ptr_.second();\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_EXPLICIT operator bool() const WI_NOEXCEPT\n    {\n        return __ptr_.first() != nullptr;\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    pointer release() WI_NOEXCEPT\n    {\n        pointer __t = __ptr_.first();\n        __ptr_.first() = pointer();\n        return __t;\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    void reset(pointer __p = pointer()) WI_NOEXCEPT\n    {\n        pointer __tmp = __ptr_.first();\n        __ptr_.first() = __p;\n        if (__tmp)\n            __ptr_.second()(__tmp);\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    void swap(unique_ptr& __u) WI_NOEXCEPT\n    {\n        __ptr_.swap(__u.__ptr_);\n    }\n};\n\ntemplate <class _Tp, class _Dp>\nclass __WI_LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp>\n{\npublic:\n    using element_type = _Tp;\n    using deleter_type = _Dp;\n    using pointer = typename __pointer_type<_Tp, deleter_type>::type;\n\nprivate:\n    __compressed_pair<pointer, deleter_type> __ptr_;\n\n    template <class _From>\n    struct _CheckArrayPointerConversion : is_same<_From, pointer>\n    {\n    };\n\n    template <class _FromElem>\n    struct _CheckArrayPointerConversion<_FromElem*>\n        : integral_constant<\n              bool,\n              is_same<_FromElem*, pointer>::value ||\n                  (is_same<pointer, element_type*>::value && is_convertible<_FromElem (*)[], element_type (*)[]>::value)>\n    {\n    };\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n    using _DeleterSFINAE = __unique_ptr_deleter_sfinae<_Dp>;\n\n    template <bool _Dummy>\n    using _LValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;\n\n    template <bool _Dummy>\n    using _GoodRValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;\n\n    template <bool _Dummy>\n    using _BadRValRefType = typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;\n\n    template <bool _Dummy, class _Deleter = typename __dependent_type<__identity<deleter_type>, _Dummy>::type>\n    using _EnableIfDeleterDefaultConstructible =\n        typename enable_if<is_default_constructible<_Deleter>::value && !is_pointer<_Deleter>::value>::type;\n\n    template <class _ArgType>\n    using _EnableIfDeleterConstructible = typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;\n\n    template <class _Pp>\n    using _EnableIfPointerConvertible = typename enable_if<_CheckArrayPointerConversion<_Pp>::value>::type;\n\n    template <class _UPtr, class _Up, class _ElemT = typename _UPtr::element_type>\n    using _EnableIfMoveConvertible = typename enable_if<\n        is_array<_Up>::value && is_same<pointer, element_type*>::value && is_same<typename _UPtr::pointer, _ElemT*>::value &&\n        is_convertible<_ElemT (*)[], element_type (*)[]>::value>::type;\n\n    template <class _UDel>\n    using _EnableIfDeleterConvertible =\n        typename enable_if<(is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)>::type;\n\n    template <class _UDel>\n    using _EnableIfDeleterAssignable = typename enable_if<is_assignable<_Dp&, _UDel&&>::value>::type;\n\npublic:\n    template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr unique_ptr() WI_NOEXCEPT : __ptr_(pointer())\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>>\n    __WI_LIBCPP_INLINE_VISIBILITY constexpr unique_ptr(nullptr_t) WI_NOEXCEPT : __ptr_(pointer())\n    {\n    }\n\n    template <class _Pp, bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy>, class = _EnableIfPointerConvertible<_Pp>>\n    __WI_LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_Pp __p) WI_NOEXCEPT : __ptr_(__p)\n    {\n    }\n\n    template <class _Pp, bool _Dummy = true, class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>, class = _EnableIfPointerConvertible<_Pp>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(__p, __d)\n    {\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(nullptr, __d)\n    {\n    }\n\n    template <class _Pp, bool _Dummy = true, class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>, class = _EnableIfPointerConvertible<_Pp>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(__p, wistd::move(__d))\n    {\n        static_assert(!is_reference<deleter_type>::value, \"rvalue deleter bound to reference\");\n    }\n\n    template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) WI_NOEXCEPT : __ptr_(nullptr, wistd::move(__d))\n    {\n        static_assert(!is_reference<deleter_type>::value, \"rvalue deleter bound to reference\");\n    }\n\n    template <class _Pp, bool _Dummy = true, class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>, class = _EnableIfPointerConvertible<_Pp>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete;\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(unique_ptr&& __u) WI_NOEXCEPT : __ptr_(__u.release(), wistd::forward<deleter_type>(__u.get_deleter()))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr& operator=(unique_ptr&& __u) WI_NOEXCEPT\n    {\n        reset(__u.release());\n        __ptr_.second() = wistd::forward<deleter_type>(__u.get_deleter());\n        return *this;\n    }\n\n    template <class _Up, class _Ep, class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, class = _EnableIfDeleterConvertible<_Ep>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr<_Up, _Ep>&& __u) WI_NOEXCEPT\n        : __ptr_(__u.release(), wistd::forward<_Ep>(__u.get_deleter()))\n    {\n    }\n\n    template <class _Up, class _Ep, class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, class = _EnableIfDeleterAssignable<_Ep>>\n    __WI_LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) WI_NOEXCEPT\n    {\n        reset(__u.release());\n        __ptr_.second() = wistd::forward<_Ep>(__u.get_deleter());\n        return *this;\n    }\n\n#else // __WI_LIBCPP_CXX03_LANG\nprivate:\n    template <class _Up>\n    explicit unique_ptr(_Up);\n\n    unique_ptr(unique_ptr&);\n    template <class _Up>\n    unique_ptr(unique_ptr<_Up>&);\n\n    unique_ptr& operator=(unique_ptr&);\n    template <class _Up>\n    unique_ptr& operator=(unique_ptr<_Up>&);\n\n    template <class _Up>\n    unique_ptr(\n        _Up __u,\n        typename conditional<is_reference<deleter_type>::value, deleter_type, typename add_lvalue_reference<const deleter_type>::type>::type,\n        typename enable_if<is_convertible<_Up, pointer>::value, __nat>::type = __nat());\n\npublic:\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr() : __ptr_(pointer())\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(nullptr_t) : __ptr_(pointer())\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    explicit unique_ptr(pointer __p) : __ptr_(__p)\n    {\n        static_assert(!is_pointer<deleter_type>::value, \"unique_ptr constructed with null function pointer deleter\");\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(pointer __p, deleter_type __d) : __ptr_(__p, wistd::forward<deleter_type>(__d))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(nullptr_t, deleter_type __d) : __ptr_(pointer(), wistd::forward<deleter_type>(__d))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    operator __rv<unique_ptr>()\n    {\n        return __rv<unique_ptr>(*this);\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr(__rv<unique_ptr> __u) : __ptr_(__u->release(), wistd::forward<deleter_type>(__u->get_deleter()))\n    {\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr& operator=(__rv<unique_ptr> __u)\n    {\n        reset(__u->release());\n        __ptr_.second() = wistd::forward<deleter_type>(__u->get_deleter());\n        return *this;\n    }\n\n#endif // __WI_LIBCPP_CXX03_LANG\n\npublic:\n    __WI_LIBCPP_INLINE_VISIBILITY\n    ~unique_ptr()\n    {\n        reset();\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    unique_ptr& operator=(nullptr_t) WI_NOEXCEPT\n    {\n        reset();\n        return *this;\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const\n    {\n        return __ptr_.first()[__i];\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY pointer get() const WI_NOEXCEPT\n    {\n        return __ptr_.first();\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    deleter_type& get_deleter() WI_NOEXCEPT\n    {\n        return __ptr_.second();\n    }\n\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY const deleter_type& get_deleter() const WI_NOEXCEPT\n    {\n        return __ptr_.second();\n    }\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_EXPLICIT operator bool() const WI_NOEXCEPT\n    {\n        return __ptr_.first() != nullptr;\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    pointer release() WI_NOEXCEPT\n    {\n        pointer __t = __ptr_.first();\n        __ptr_.first() = pointer();\n        return __t;\n    }\n\n    template <class _Pp>\n    __WI_LIBCPP_INLINE_VISIBILITY typename enable_if<_CheckArrayPointerConversion<_Pp>::value>::type reset(_Pp __p) WI_NOEXCEPT\n    {\n        pointer __tmp = __ptr_.first();\n        __ptr_.first() = __p;\n        if (__tmp)\n            __ptr_.second()(__tmp);\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    void reset(nullptr_t = nullptr) WI_NOEXCEPT\n    {\n        pointer __tmp = __ptr_.first();\n        __ptr_.first() = nullptr;\n        if (__tmp)\n            __ptr_.second()(__tmp);\n    }\n\n    __WI_LIBCPP_INLINE_VISIBILITY\n    void swap(unique_ptr& __u) WI_NOEXCEPT\n    {\n        __ptr_.swap(__u.__ptr_);\n    }\n};\n\n// Provide both 'swap_wil' and 'swap' since we now have two ADL scenarios that we need to work\ntemplate <class _Tp, class _Dp>\ninline __WI_LIBCPP_INLINE_VISIBILITY typename enable_if<__is_swappable<_Dp>::value, void>::type swap(\n    unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) WI_NOEXCEPT\n{\n    __x.swap(__y);\n}\n\ntemplate <class _Tp, class _Dp>\ninline __WI_LIBCPP_INLINE_VISIBILITY typename enable_if<__is_swappable<_Dp>::value, void>::type swap_wil(\n    unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) WI_NOEXCEPT\n{\n    __x.swap(__y);\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    return __x.get() == __y.get();\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    return !(__x == __y);\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    typedef typename unique_ptr<_T1, _D1>::pointer _P1;\n    typedef typename unique_ptr<_T2, _D2>::pointer _P2;\n    typedef typename common_type<_P1, _P2>::type _Vp;\n    return less<_Vp>()(__x.get(), __y.get());\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    return __y < __x;\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    return !(__y < __x);\n}\n\ntemplate <class _T1, class _D1, class _T2, class _D2>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)\n{\n    return !(__x < __y);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) WI_NOEXCEPT\n{\n    return !__x;\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) WI_NOEXCEPT\n{\n    return !__x;\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) WI_NOEXCEPT\n{\n    return static_cast<bool>(__x);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) WI_NOEXCEPT\n{\n    return static_cast<bool>(__x);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<(const unique_ptr<_T1, _D1>& __x, nullptr_t)\n{\n    typedef typename unique_ptr<_T1, _D1>::pointer _P1;\n    return less<_P1>()(__x.get(), nullptr);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<(nullptr_t, const unique_ptr<_T1, _D1>& __x)\n{\n    typedef typename unique_ptr<_T1, _D1>::pointer _P1;\n    return less<_P1>()(nullptr, __x.get());\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>(const unique_ptr<_T1, _D1>& __x, nullptr_t)\n{\n    return nullptr < __x;\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>(nullptr_t, const unique_ptr<_T1, _D1>& __x)\n{\n    return __x < nullptr;\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t)\n{\n    return !(nullptr < __x);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x)\n{\n    return !(__x < nullptr);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t)\n{\n    return !(__x < nullptr);\n}\n\ntemplate <class _T1, class _D1>\ninline __WI_LIBCPP_INLINE_VISIBILITY bool operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x)\n{\n    return !(nullptr < __x);\n}\n\n#ifdef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp, class _Dp>\ninline __WI_LIBCPP_INLINE_VISIBILITY unique_ptr<_Tp, _Dp> move(unique_ptr<_Tp, _Dp>& __t)\n{\n    return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp>>(__t));\n}\n\n#endif\n} // namespace wistd\n/// @endcond\n\n#endif // _WISTD_MEMORY_H_\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/wistd_type_traits.h",
    "content": "// -*- C++ -*-\n//===------------------------ type_traits ---------------------------------===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is dual licensed under the MIT and the University of Illinois Open\n// Source Licenses. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n// STL common functionality\n//\n// Some aspects of STL are core language concepts that should be used from all C++ code, regardless\n// of whether exceptions are enabled in the component.  Common library code that expects to be used\n// from exception-free components want these concepts, but including <type_traits> directly introduces\n// friction as it requires components not using STL to declare their STL version.  Doing so creates\n// ambiguity around whether STL use is safe in a particular component and implicitly brings in\n// a long list of headers (including <new>) which can create further ambiguity around throwing new\n// support (some routines pulled in may expect it).  Secondarily, pulling in these headers also has\n// the potential to create naming conflicts or other implied dependencies.\n//\n// To promote the use of these core language concepts outside of STL-based binaries, this file is\n// selectively pulling those concepts *directly* from corresponding STL headers.  The corresponding\n// \"std::\" namespace STL functions and types should be preferred over these in code that is bound to\n// STL.  The implementation and naming of all functions are taken directly from STL, instead using\n// \"wistd\" (Windows Implementation std) as the namespace.\n//\n// Routines in this namespace should always be considered a reflection of the *current* STL implementation\n// of those routines.  Updates from STL should be taken, but no \"bugs\" should be fixed here.\n//\n// New, exception-based code should not use this namespace, but instead should prefer the std:: implementation.\n// Only code that is not exception-based and libraries that expect to be utilized across both exception\n// and non-exception based code should utilize this functionality.\n\n#ifndef _WISTD_TYPE_TRAITS_H_\n#define _WISTD_TYPE_TRAITS_H_\n\n// DO NOT add *any* additional includes to this file -- there should be no dependencies from its usage\n#include \"wistd_config.h\"\n\n#if !defined(__WI_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)\n#pragma GCC system_header\n#endif\n\n/// @cond\nnamespace wistd // (\"Windows Implementation\" std)\n{\ntemplate <class _T1, class _T2>\nstruct __WI_LIBCPP_TEMPLATE_VIS pair;\ntemplate <class _Tp>\nclass __WI_LIBCPP_TEMPLATE_VIS reference_wrapper;\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS hash;\n\ntemplate <class>\nstruct __void_t\n{\n    typedef void type;\n};\n\ntemplate <class _Tp>\nstruct __identity\n{\n    typedef _Tp type;\n};\n\ntemplate <class _Tp, bool>\nstruct __WI_LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp\n{\n};\n\ntemplate <bool _Bp, class _If, class _Then>\nstruct __WI_LIBCPP_TEMPLATE_VIS conditional\n{\n    typedef _If type;\n};\ntemplate <class _If, class _Then>\nstruct __WI_LIBCPP_TEMPLATE_VIS conditional<false, _If, _Then>\n{\n    typedef _Then type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <bool _Bp, class _If, class _Then>\nusing conditional_t = typename conditional<_Bp, _If, _Then>::type;\n#endif\n\ntemplate <bool, class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS __lazy_enable_if{};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS __lazy_enable_if<true, _Tp>\n{\n    typedef typename _Tp::type type;\n};\n\ntemplate <bool, class _Tp = void>\nstruct __WI_LIBCPP_TEMPLATE_VIS enable_if{};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS enable_if<true, _Tp>\n{\n    typedef _Tp type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <bool _Bp, class _Tp = void>\nusing enable_if_t = typename enable_if<_Bp, _Tp>::type;\n#endif\n\n// addressof\n#ifndef __WI_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_CONSTEXPR_AFTER_CXX14 __WI_LIBCPP_NO_CFI __WI_LIBCPP_INLINE_VISIBILITY _Tp* addressof(_Tp& __x) WI_NOEXCEPT\n{\n    return __builtin_addressof(__x);\n}\n\n#else\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_NO_CFI __WI_LIBCPP_INLINE_VISIBILITY _Tp* addressof(_Tp& __x) WI_NOEXCEPT\n{\n    return reinterpret_cast<_Tp*>(const_cast<char*>(&reinterpret_cast<const volatile char&>(__x)));\n}\n\n#endif // __WI_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF\n\n#if !defined(__WI_LIBCPP_CXX03_LANG)\ntemplate <class _Tp>\n_Tp* addressof(const _Tp&&) WI_NOEXCEPT = delete;\n#endif\n\nstruct __two\n{\n    char __lx[2];\n};\n\n// helper class:\n\ntemplate <class _Tp, _Tp __v>\nstruct __WI_LIBCPP_TEMPLATE_VIS integral_constant\n{\n    static __WI_LIBCPP_CONSTEXPR const _Tp value = __v;\n    typedef _Tp value_type;\n    typedef integral_constant type;\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR operator value_type() const WI_NOEXCEPT\n    {\n        return value;\n    }\n#if __WI_LIBCPP_STD_VER > 11\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_INLINE_VISIBILITY constexpr value_type operator()() const WI_NOEXCEPT\n    {\n        return value;\n    }\n#endif\n};\n\ntemplate <class _Tp, _Tp __v>\n__WI_LIBCPP_CONSTEXPR const _Tp integral_constant<_Tp, __v>::value;\n\n#if !defined(__WI_LIBCPP_CXX03_LANG)\ntemplate <bool __b>\nusing bool_constant = integral_constant<bool, __b>;\n#define __WI_LIBCPP_BOOL_CONSTANT(__b) bool_constant<(__b)>\n#else\n#define __WI_LIBCPP_BOOL_CONSTANT(__b) integral_constant<bool, (__b)>\n#endif\n\ntypedef __WI_LIBCPP_BOOL_CONSTANT(true) true_type;\ntypedef __WI_LIBCPP_BOOL_CONSTANT(false) false_type;\n\n#if !defined(__WI_LIBCPP_CXX03_LANG)\n\n// __lazy_and\n\ntemplate <bool _Last, class... _Preds>\nstruct __lazy_and_impl;\n\ntemplate <class... _Preds>\nstruct __lazy_and_impl<false, _Preds...> : false_type\n{\n};\n\ntemplate <>\nstruct __lazy_and_impl<true> : true_type\n{\n};\n\ntemplate <class _Pred>\nstruct __lazy_and_impl<true, _Pred> : integral_constant<bool, _Pred::type::value>\n{\n};\n\ntemplate <class _Hp, class... _Tp>\nstruct __lazy_and_impl<true, _Hp, _Tp...> : __lazy_and_impl<_Hp::type::value, _Tp...>\n{\n};\n\ntemplate <class _P1, class... _Pr>\nstruct __lazy_and : __lazy_and_impl<_P1::type::value, _Pr...>\n{\n};\n\n// __lazy_or\n\ntemplate <bool _List, class... _Preds>\nstruct __lazy_or_impl;\n\ntemplate <class... _Preds>\nstruct __lazy_or_impl<true, _Preds...> : true_type\n{\n};\n\ntemplate <>\nstruct __lazy_or_impl<false> : false_type\n{\n};\n\ntemplate <class _Hp, class... _Tp>\nstruct __lazy_or_impl<false, _Hp, _Tp...> : __lazy_or_impl<_Hp::type::value, _Tp...>\n{\n};\n\ntemplate <class _P1, class... _Pr>\nstruct __lazy_or : __lazy_or_impl<_P1::type::value, _Pr...>\n{\n};\n\n// __lazy_not\n\ntemplate <class _Pred>\nstruct __lazy_not : integral_constant<bool, !_Pred::type::value>\n{\n};\n\n// __and_\ntemplate <class...>\nstruct __and_;\ntemplate <>\nstruct __and_<> : true_type\n{\n};\n\ntemplate <class _B0>\nstruct __and_<_B0> : _B0\n{\n};\n\ntemplate <class _B0, class _B1>\nstruct __and_<_B0, _B1> : conditional<_B0::value, _B1, _B0>::type\n{\n};\n\ntemplate <class _B0, class _B1, class _B2, class... _Bn>\nstruct __and_<_B0, _B1, _B2, _Bn...> : conditional<_B0::value, __and_<_B1, _B2, _Bn...>, _B0>::type\n{\n};\n\n// __or_\ntemplate <class...>\nstruct __or_;\ntemplate <>\nstruct __or_<> : false_type\n{\n};\n\ntemplate <class _B0>\nstruct __or_<_B0> : _B0\n{\n};\n\ntemplate <class _B0, class _B1>\nstruct __or_<_B0, _B1> : conditional<_B0::value, _B0, _B1>::type\n{\n};\n\ntemplate <class _B0, class _B1, class _B2, class... _Bn>\nstruct __or_<_B0, _B1, _B2, _Bn...> : conditional<_B0::value, _B0, __or_<_B1, _B2, _Bn...>>::type\n{\n};\n\n// __not_\ntemplate <class _Tp>\nstruct __not_ : conditional<_Tp::value, false_type, true_type>::type\n{\n};\n\n#endif // !defined(__WI_LIBCPP_CXX03_LANG)\n\n// is_const\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_const : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_const<_Tp const> : public true_type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_const_v = is_const<_Tp>::value;\n#endif\n\n// is_volatile\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_volatile : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_volatile<_Tp volatile> : public true_type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_volatile_v = is_volatile<_Tp>::value;\n#endif\n\n// remove_const\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_const\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_const<const _Tp>\n{\n    typedef _Tp type;\n};\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_const_t = typename remove_const<_Tp>::type;\n#endif\n\n// remove_volatile\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_volatile\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_volatile<volatile _Tp>\n{\n    typedef _Tp type;\n};\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_volatile_t = typename remove_volatile<_Tp>::type;\n#endif\n\n// remove_cv\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_cv\n{\n    typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;\n};\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_cv_t = typename remove_cv<_Tp>::type;\n#endif\n\n// is_void\n\ntemplate <class _Tp>\nstruct __libcpp_is_void : public false_type\n{\n};\ntemplate <>\nstruct __libcpp_is_void<void> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_void : public __libcpp_is_void<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_void_v = is_void<_Tp>::value;\n#endif\n\n// __is_nullptr_t\n\ntemplate <class _Tp>\nstruct __is_nullptr_t_impl : public false_type\n{\n};\ntemplate <>\nstruct __is_nullptr_t_impl<nullptr_t> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS __is_nullptr_t : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_null_pointer : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_null_pointer_v = is_null_pointer<_Tp>::value;\n#endif\n#endif\n\n// is_integral\n\ntemplate <class _Tp>\nstruct __libcpp_is_integral : public false_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<bool> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<char> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<signed char> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<unsigned char> : public true_type\n{\n};\n#ifdef _MSC_VER\ntemplate <>\nstruct __libcpp_is_integral<__wchar_t> : public true_type\n{\n};\n#else\ntemplate <>\nstruct __libcpp_is_integral<wchar_t> : public true_type\n{\n};\n#endif\n#ifndef __WI_LIBCPP_HAS_NO_UNICODE_CHARS\ntemplate <>\nstruct __libcpp_is_integral<char16_t> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<char32_t> : public true_type\n{\n};\n#endif // __WI_LIBCPP_HAS_NO_UNICODE_CHARS\ntemplate <>\nstruct __libcpp_is_integral<short> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<unsigned short> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<int> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<unsigned int> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<long> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<unsigned long> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<long long> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<unsigned long long> : public true_type\n{\n};\n#ifndef __WI_LIBCPP_HAS_NO_INT128\ntemplate <>\nstruct __libcpp_is_integral<__int128_t> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_integral<__uint128_t> : public true_type\n{\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_integral : public __libcpp_is_integral<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_integral_v = is_integral<_Tp>::value;\n#endif\n\n// is_floating_point\n\ntemplate <class _Tp>\nstruct __libcpp_is_floating_point : public false_type\n{\n};\ntemplate <>\nstruct __libcpp_is_floating_point<float> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_floating_point<double> : public true_type\n{\n};\ntemplate <>\nstruct __libcpp_is_floating_point<long double> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_floating_point : public __libcpp_is_floating_point<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_floating_point_v = is_floating_point<_Tp>::value;\n#endif\n\n// is_array\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_array : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_array<_Tp[]> : public true_type\n{\n};\ntemplate <class _Tp, size_t _Np>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_array<_Tp[_Np]> : public true_type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_array_v = is_array<_Tp>::value;\n#endif\n\n// is_pointer\n\ntemplate <class _Tp>\nstruct __libcpp_is_pointer : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __libcpp_is_pointer<_Tp*> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_pointer : public __libcpp_is_pointer<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_pointer_v = is_pointer<_Tp>::value;\n#endif\n\n// is_reference\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_lvalue_reference : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_lvalue_reference<_Tp&> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_rvalue_reference : public false_type\n{\n};\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_rvalue_reference<_Tp&&> : public true_type\n{\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_reference : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_reference<_Tp&> : public true_type\n{\n};\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_reference<_Tp&&> : public true_type\n{\n};\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_reference_v = is_reference<_Tp>::value;\n\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_lvalue_reference_v = is_lvalue_reference<_Tp>::value;\n\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_rvalue_reference_v = is_rvalue_reference<_Tp>::value;\n#endif\n// is_union\n\n#if __WI_HAS_FEATURE_IS_UNION || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_union : public integral_constant<bool, __is_union(_Tp)>\n{\n};\n\n#else\n\ntemplate <class _Tp>\nstruct __libcpp_union : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_union : public __libcpp_union<typename remove_cv<_Tp>::type>\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_union_v = is_union<_Tp>::value;\n#endif\n\n// is_class\n\n#if __WI_HAS_FEATURE_IS_CLASS || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_class : public integral_constant<bool, __is_class(_Tp)>\n{\n};\n\n#else\n\nnamespace __is_class_imp\n{\n    template <class _Tp>\n    char __test(int _Tp::*);\n    template <class _Tp>\n    __two __test(...);\n} // namespace __is_class_imp\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_class\n    : public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value>\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_class_v = is_class<_Tp>::value;\n#endif\n\n// is_same\n\ntemplate <class _Tp, class _Up>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_same : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_same<_Tp, _Tp> : public true_type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp, class _Up>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_same_v = is_same<_Tp, _Up>::value;\n#endif\n\n// is_function\n\nnamespace __libcpp_is_function_imp\n{\n    struct __dummy_type\n    {\n    };\n    template <class _Tp>\n    char __test(_Tp*);\n    template <class _Tp>\n    char __test(__dummy_type);\n    template <class _Tp>\n    __two __test(...);\n    template <class _Tp>\n    _Tp& __source(int);\n    template <class _Tp>\n    __dummy_type __source(...);\n} // namespace __libcpp_is_function_imp\n\ntemplate <class _Tp, bool = is_class<_Tp>::value || is_union<_Tp>::value || is_void<_Tp>::value || is_reference<_Tp>::value || __is_nullptr_t<_Tp>::value>\nstruct __libcpp_is_function\n    : public integral_constant<bool, sizeof(__libcpp_is_function_imp::__test<_Tp>(__libcpp_is_function_imp::__source<_Tp>(0))) == 1>\n{\n};\ntemplate <class _Tp>\nstruct __libcpp_is_function<_Tp, true> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_function : public __libcpp_is_function<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_function_v = is_function<_Tp>::value;\n#endif\n\n// is_member_function_pointer\n\n// template <class _Tp> struct            __libcpp_is_member_function_pointer             : public false_type {};\n// template <class _Tp, class _Up> struct __libcpp_is_member_function_pointer<_Tp _Up::*> : public is_function<_Tp> {};\n//\n\ntemplate <class _Mp, bool _IsMemberFunctionPtr, bool _IsMemberObjectPtr>\nstruct __member_pointer_traits_imp\n{ // forward declaration; specializations later\n};\n\ntemplate <class _Tp>\nstruct __libcpp_is_member_function_pointer : public false_type\n{\n};\n\ntemplate <class _Ret, class _Class>\nstruct __libcpp_is_member_function_pointer<_Ret _Class::*> : public is_function<_Ret>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_member_function_pointer\n    : public __libcpp_is_member_function_pointer<typename remove_cv<_Tp>::type>::type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_member_function_pointer_v = is_member_function_pointer<_Tp>::value;\n#endif\n\n// is_member_pointer\n\ntemplate <class _Tp>\nstruct __libcpp_is_member_pointer : public false_type\n{\n};\ntemplate <class _Tp, class _Up>\nstruct __libcpp_is_member_pointer<_Tp _Up::*> : public true_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_member_pointer : public __libcpp_is_member_pointer<typename remove_cv<_Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_member_pointer_v = is_member_pointer<_Tp>::value;\n#endif\n\n// is_member_object_pointer\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_member_object_pointer\n    : public integral_constant<bool, is_member_pointer<_Tp>::value && !is_member_function_pointer<_Tp>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_member_object_pointer_v = is_member_object_pointer<_Tp>::value;\n#endif\n\n// is_enum\n\n#if __WI_HAS_FEATURE_IS_ENUM || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_enum : public integral_constant<bool, __is_enum(_Tp)>\n{\n};\n\n#else\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_enum\n    : public integral_constant<\n          bool,\n          !is_void<_Tp>::value && !is_integral<_Tp>::value && !is_floating_point<_Tp>::value && !is_array<_Tp>::value &&\n              !is_pointer<_Tp>::value && !is_reference<_Tp>::value && !is_member_pointer<_Tp>::value && !is_union<_Tp>::value &&\n              !is_class<_Tp>::value && !is_function<_Tp>::value>\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_enum_v = is_enum<_Tp>::value;\n#endif\n\n// is_arithmetic\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_arithmetic : public integral_constant<bool, is_integral<_Tp>::value || is_floating_point<_Tp>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_arithmetic_v = is_arithmetic<_Tp>::value;\n#endif\n\n// is_fundamental\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_fundamental\n    : public integral_constant<bool, is_void<_Tp>::value || __is_nullptr_t<_Tp>::value || is_arithmetic<_Tp>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_fundamental_v = is_fundamental<_Tp>::value;\n#endif\n\n// is_scalar\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_scalar\n    : public integral_constant<bool, is_arithmetic<_Tp>::value || is_member_pointer<_Tp>::value || is_pointer<_Tp>::value || __is_nullptr_t<_Tp>::value || is_enum<_Tp>::value>\n{\n};\n\ntemplate <>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_scalar<nullptr_t> : public true_type\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_scalar_v = is_scalar<_Tp>::value;\n#endif\n\n// is_object\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_object\n    : public integral_constant<bool, is_scalar<_Tp>::value || is_array<_Tp>::value || is_union<_Tp>::value || is_class<_Tp>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_object_v = is_object<_Tp>::value;\n#endif\n\n// is_compound\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_compound : public integral_constant<bool, !is_fundamental<_Tp>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_compound_v = is_compound<_Tp>::value;\n#endif\n\n// __is_referenceable  [defns.referenceable]\n\nstruct __is_referenceable_impl\n{\n    template <class _Tp>\n    static _Tp& __test(int);\n    template <class _Tp>\n    static __two __test(...);\n};\n\ntemplate <class _Tp>\nstruct __is_referenceable : integral_constant<bool, !is_same<decltype(__is_referenceable_impl::__test<_Tp>(0)), __two>::value>{};\n\n// add_const\n\ntemplate <class _Tp, bool = is_reference<_Tp>::value || is_function<_Tp>::value || is_const<_Tp>::value>\nstruct __add_const\n{\n    typedef _Tp type;\n};\n\ntemplate <class _Tp>\nstruct __add_const<_Tp, false>\n{\n    typedef const _Tp type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_const\n{\n    typedef typename __add_const<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_const_t = typename add_const<_Tp>::type;\n#endif\n\n// add_volatile\n\ntemplate <class _Tp, bool = is_reference<_Tp>::value || is_function<_Tp>::value || is_volatile<_Tp>::value>\nstruct __add_volatile\n{\n    typedef _Tp type;\n};\n\ntemplate <class _Tp>\nstruct __add_volatile<_Tp, false>\n{\n    typedef volatile _Tp type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_volatile\n{\n    typedef typename __add_volatile<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_volatile_t = typename add_volatile<_Tp>::type;\n#endif\n\n// add_cv\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_cv\n{\n    typedef typename add_const<typename add_volatile<_Tp>::type>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_cv_t = typename add_cv<_Tp>::type;\n#endif\n\n// remove_reference\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_reference\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_reference<_Tp&>\n{\n    typedef _Tp type;\n};\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_reference<_Tp&&>\n{\n    typedef _Tp type;\n};\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_reference_t = typename remove_reference<_Tp>::type;\n#endif\n\n// add_lvalue_reference\n\ntemplate <class _Tp, bool = __is_referenceable<_Tp>::value>\nstruct __add_lvalue_reference_impl\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __add_lvalue_reference_impl<_Tp, true>\n{\n    typedef _Tp& type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_lvalue_reference\n{\n    typedef typename __add_lvalue_reference_impl<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp, bool = __is_referenceable<_Tp>::value>\nstruct __add_rvalue_reference_impl\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __add_rvalue_reference_impl<_Tp, true>\n{\n    typedef _Tp&& type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_rvalue_reference\n{\n    typedef typename __add_rvalue_reference_impl<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;\n#endif\n\n#endif // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n// MSVC has issues compiling some source code that uses the libc++ definition of 'declval'\n#ifdef _MSC_VER\ntemplate <typename _Tp>\ntypename add_rvalue_reference<_Tp>::type declval() WI_NOEXCEPT;\n#else\ntemplate <class _Tp>\n_Tp&& __declval(int);\ntemplate <class _Tp>\n_Tp __declval(long);\n\ntemplate <class _Tp>\ndecltype(__declval<_Tp>(0)) declval() WI_NOEXCEPT;\n#endif\n\n#else // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\ntypename add_lvalue_reference<_Tp>::type declval();\n\n#endif // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n// __uncvref\n\ntemplate <class _Tp>\nstruct __uncvref\n{\n    typedef typename remove_cv<typename remove_reference<_Tp>::type>::type type;\n};\n\ntemplate <class _Tp>\nstruct __unconstref\n{\n    typedef typename remove_const<typename remove_reference<_Tp>::type>::type type;\n};\n\n#ifndef __WI_LIBCPP_CXX03_LANG\ntemplate <class _Tp>\nusing __uncvref_t = typename __uncvref<_Tp>::type;\n#endif\n\n// __is_same_uncvref\n\ntemplate <class _Tp, class _Up>\nstruct __is_same_uncvref : is_same<typename __uncvref<_Tp>::type, typename __uncvref<_Up>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 17\n// remove_cvref - same as __uncvref\ntemplate <class _Tp>\nstruct remove_cvref : public __uncvref<_Tp>\n{\n};\n\ntemplate <class _Tp>\nusing remove_cvref_t = typename remove_cvref<_Tp>::type;\n#endif\n\nstruct __any\n{\n    __any(...);\n};\n\n// remove_pointer\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_pointer\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_pointer<_Tp*>\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const>\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* volatile>\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const volatile>\n{\n    typedef _Tp type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_pointer_t = typename remove_pointer<_Tp>::type;\n#endif\n\n// add_pointer\n\ntemplate <class _Tp, bool = __is_referenceable<_Tp>::value || is_same<typename remove_cv<_Tp>::type, void>::value>\nstruct __add_pointer_impl\n{\n    typedef typename remove_reference<_Tp>::type* type;\n};\ntemplate <class _Tp>\nstruct __add_pointer_impl<_Tp, false>\n{\n    typedef _Tp type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS add_pointer\n{\n    typedef typename __add_pointer_impl<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing add_pointer_t = typename add_pointer<_Tp>::type;\n#endif\n\n// type_identity\n#if __WI_LIBCPP_STD_VER > 17\ntemplate <class _Tp>\nstruct type_identity\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nusing type_identity_t = typename type_identity<_Tp>::type;\n#endif\n\n// is_signed\n\ntemplate <class _Tp, bool = is_integral<_Tp>::value>\nstruct __libcpp_is_signed_impl : public __WI_LIBCPP_BOOL_CONSTANT(_Tp(-1) < _Tp(0)){};\n\ntemplate <class _Tp>\nstruct __libcpp_is_signed_impl<_Tp, false> : public true_type\n{\n}; // floating point\n\ntemplate <class _Tp, bool = is_arithmetic<_Tp>::value>\nstruct __libcpp_is_signed : public __libcpp_is_signed_impl<_Tp>\n{\n};\n\ntemplate <class _Tp>\nstruct __libcpp_is_signed<_Tp, false> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_signed : public __libcpp_is_signed<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_signed_v = is_signed<_Tp>::value;\n#endif\n\n// is_unsigned\n\ntemplate <class _Tp, bool = is_integral<_Tp>::value>\nstruct __libcpp_is_unsigned_impl : public __WI_LIBCPP_BOOL_CONSTANT(_Tp(0) < _Tp(-1)){};\n\ntemplate <class _Tp>\nstruct __libcpp_is_unsigned_impl<_Tp, false> : public false_type\n{\n}; // floating point\n\ntemplate <class _Tp, bool = is_arithmetic<_Tp>::value>\nstruct __libcpp_is_unsigned : public __libcpp_is_unsigned_impl<_Tp>\n{\n};\n\ntemplate <class _Tp>\nstruct __libcpp_is_unsigned<_Tp, false> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_unsigned : public __libcpp_is_unsigned<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_unsigned_v = is_unsigned<_Tp>::value;\n#endif\n\n// rank\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS rank : public integral_constant<size_t, 0>\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS rank<_Tp[]> : public integral_constant<size_t, rank<_Tp>::value + 1>\n{\n};\ntemplate <class _Tp, size_t _Np>\nstruct __WI_LIBCPP_TEMPLATE_VIS rank<_Tp[_Np]> : public integral_constant<size_t, rank<_Tp>::value + 1>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR size_t rank_v = rank<_Tp>::value;\n#endif\n\n// extent\n\ntemplate <class _Tp, unsigned _Ip = 0>\nstruct __WI_LIBCPP_TEMPLATE_VIS extent : public integral_constant<size_t, 0>\n{\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS extent<_Tp[], 0> : public integral_constant<size_t, 0>\n{\n};\ntemplate <class _Tp, unsigned _Ip>\nstruct __WI_LIBCPP_TEMPLATE_VIS extent<_Tp[], _Ip> : public integral_constant<size_t, extent<_Tp, _Ip - 1>::value>\n{\n};\ntemplate <class _Tp, size_t _Np>\nstruct __WI_LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], 0> : public integral_constant<size_t, _Np>\n{\n};\ntemplate <class _Tp, size_t _Np, unsigned _Ip>\nstruct __WI_LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], _Ip> : public integral_constant<size_t, extent<_Tp, _Ip - 1>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp, unsigned _Ip = 0>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR size_t extent_v = extent<_Tp, _Ip>::value;\n#endif\n\n// remove_extent\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_extent\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_extent<_Tp[]>\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp, size_t _Np>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_extent<_Tp[_Np]>\n{\n    typedef _Tp type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_extent_t = typename remove_extent<_Tp>::type;\n#endif\n\n// remove_all_extents\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_all_extents\n{\n    typedef _Tp type;\n};\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[]>\n{\n    typedef typename remove_all_extents<_Tp>::type type;\n};\ntemplate <class _Tp, size_t _Np>\nstruct __WI_LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[_Np]>\n{\n    typedef typename remove_all_extents<_Tp>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing remove_all_extents_t = typename remove_all_extents<_Tp>::type;\n#endif\n\n// decay\n\ntemplate <class _Up, bool>\nstruct __decay\n{\n    typedef typename remove_cv<_Up>::type type;\n};\n\ntemplate <class _Up>\nstruct __decay<_Up, true>\n{\npublic:\n    typedef typename conditional<\n        is_array<_Up>::value,\n        typename remove_extent<_Up>::type*,\n        typename conditional<is_function<_Up>::value, typename add_pointer<_Up>::type, typename remove_cv<_Up>::type>::type>::type type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS decay\n{\nprivate:\n    typedef typename remove_reference<_Tp>::type _Up;\n\npublic:\n    typedef typename __decay<_Up, __is_referenceable<_Up>::value>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing decay_t = typename decay<_Tp>::type;\n#endif\n\n// is_abstract\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_abstract : public integral_constant<bool, __is_abstract(_Tp)>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_abstract_v = is_abstract<_Tp>::value;\n#endif\n\n// is_final\n\n#if defined(__WI_LIBCPP_HAS_IS_FINAL)\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS __libcpp_is_final : public integral_constant<bool, __is_final(_Tp)>\n{\n};\n#else\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS __libcpp_is_final : public false_type\n{\n};\n#endif\n\n#if defined(__WI_LIBCPP_HAS_IS_FINAL) && __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_final : public integral_constant<bool, __is_final(_Tp)>\n{\n};\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_final_v = is_final<_Tp>::value;\n#endif\n\n// is_aggregate\n#if __WI_LIBCPP_STD_VER > 14 && !defined(__WI_LIBCPP_HAS_NO_IS_AGGREGATE)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_aggregate : public integral_constant<bool, __is_aggregate(_Tp)>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_aggregate_v = is_aggregate<_Tp>::value;\n#endif\n\n#endif // __WI_LIBCPP_STD_VER > 14 && !defined(__WI_LIBCPP_HAS_NO_IS_AGGREGATE)\n\n// is_base_of\n\n#ifdef __WI_LIBCPP_HAS_IS_BASE_OF\n\ntemplate <class _Bp, class _Dp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_base_of : public integral_constant<bool, __is_base_of(_Bp, _Dp)>\n{\n};\n\n#else // __WI_LIBCPP_HAS_IS_BASE_OF\n\nnamespace __is_base_of_imp\n{\n    template <class _Tp>\n    struct _Dst\n    {\n        _Dst(const volatile _Tp&);\n    };\n    template <class _Tp>\n    struct _Src\n    {\n        operator const volatile _Tp&();\n        template <class _Up>\n        operator const _Dst<_Up>&();\n    };\n    template <size_t>\n    struct __one\n    {\n        typedef char type;\n    };\n    template <class _Bp, class _Dp>\n    typename __one<sizeof(_Dst<_Bp>(declval<_Src<_Dp>>()))>::type __test(int);\n    template <class _Bp, class _Dp>\n    __two __test(...);\n} // namespace __is_base_of_imp\n\ntemplate <class _Bp, class _Dp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_base_of\n    : public integral_constant<bool, is_class<_Bp>::value && sizeof(__is_base_of_imp::__test<_Bp, _Dp>(0)) == 2>\n{\n};\n\n#endif // __WI_LIBCPP_HAS_IS_BASE_OF\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Bp, class _Dp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_base_of_v = is_base_of<_Bp, _Dp>::value;\n#endif\n\n// is_convertible\n\n#if __WI_HAS_FEATURE_IS_CONVERTIBLE_TO && !defined(__WI_LIBCPP_USE_IS_CONVERTIBLE_FALLBACK)\n\ntemplate <class _T1, class _T2>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_convertible\n    : public integral_constant<bool, __is_convertible_to(_T1, _T2) && !is_abstract<_T2>::value>\n{\n};\n\n#else // __WI_HAS_FEATURE_IS_CONVERTIBLE_TO\n\nnamespace __is_convertible_imp\n{\n    template <class _Tp>\n    void __test_convert(_Tp);\n\n    template <class _From, class _To, class = void>\n    struct __is_convertible_test : public false_type\n    {\n    };\n\n    template <class _From, class _To>\n    struct __is_convertible_test<_From, _To, decltype(__is_convertible_imp::__test_convert<_To>(declval<_From>()))> : public true_type\n    {\n    };\n\n    template <class _Tp, bool _IsArray = is_array<_Tp>::value, bool _IsFunction = is_function<_Tp>::value, bool _IsVoid = is_void<_Tp>::value>\n    struct __is_array_function_or_void\n    {\n        enum\n        {\n            value = 0\n        };\n    };\n    template <class _Tp>\n    struct __is_array_function_or_void<_Tp, true, false, false>\n    {\n        enum\n        {\n            value = 1\n        };\n    };\n    template <class _Tp>\n    struct __is_array_function_or_void<_Tp, false, true, false>\n    {\n        enum\n        {\n            value = 2\n        };\n    };\n    template <class _Tp>\n    struct __is_array_function_or_void<_Tp, false, false, true>\n    {\n        enum\n        {\n            value = 3\n        };\n    };\n} // namespace __is_convertible_imp\n\ntemplate <class _Tp, unsigned = __is_convertible_imp::__is_array_function_or_void<typename remove_reference<_Tp>::type>::value>\nstruct __is_convertible_check\n{\n    static const size_t __v = 0;\n};\n\ntemplate <class _Tp>\nstruct __is_convertible_check<_Tp, 0>\n{\n    static const size_t __v = sizeof(_Tp);\n};\n\ntemplate <\n    class _T1,\n    class _T2,\n    unsigned _T1_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T1>::value,\n    unsigned _T2_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T2>::value>\nstruct __is_convertible\n    : public integral_constant<\n          bool,\n          __is_convertible_imp::__is_convertible_test<_T1, _T2>::value\n#if defined(__WI_LIBCPP_HAS_NO_RVALUE_REFERENCES)\n              && !(!is_function<_T1>::value && !is_reference<_T1>::value && is_reference<_T2>::value &&\n                   (!is_const<typename remove_reference<_T2>::type>::value || is_volatile<typename remove_reference<_T2>::type>::value) &&\n                   (is_same<typename remove_cv<_T1>::type, typename remove_cv<typename remove_reference<_T2>::type>::type>::value ||\n                    is_base_of<typename remove_reference<_T2>::type, _T1>::value))\n#endif\n          >{};\n\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 0, 1> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 1, 1> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 2, 1> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 3, 1> : public false_type{};\n\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 0, 2> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 1, 2> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 2, 2> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 3, 2> : public false_type{};\n\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 0, 3> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 1, 3> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 2, 3> : public false_type{};\ntemplate <class _T1, class _T2>\nstruct __is_convertible<_T1, _T2, 3, 3> : public true_type{};\n\ntemplate <class _T1, class _T2>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_convertible : public __is_convertible<_T1, _T2>\n{\n    static const size_t __complete_check1 = __is_convertible_check<_T1>::__v;\n    static const size_t __complete_check2 = __is_convertible_check<_T2>::__v;\n};\n\n#endif // __WI_HAS_FEATURE_IS_CONVERTIBLE_TO\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _From, class _To>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_convertible_v = is_convertible<_From, _To>::value;\n#endif\n\n// is_empty\n\n#if __WI_HAS_FEATURE_IS_EMPTY || (__WI_GNUC_VER >= 407)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_empty : public integral_constant<bool, __is_empty(_Tp)>\n{\n};\n\n#else // __WI_HAS_FEATURE_IS_EMPTY\n\ntemplate <class _Tp>\nstruct __is_empty1 : public _Tp\n{\n    double __lx;\n};\n\nstruct __is_empty2\n{\n    double __lx;\n};\n\ntemplate <class _Tp, bool = is_class<_Tp>::value>\nstruct __libcpp_empty : public integral_constant<bool, sizeof(__is_empty1<_Tp>) == sizeof(__is_empty2)>\n{\n};\n\ntemplate <class _Tp>\nstruct __libcpp_empty<_Tp, false> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_empty : public __libcpp_empty<_Tp>\n{\n};\n\n#endif // __WI_HAS_FEATURE_IS_EMPTY\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_empty_v = is_empty<_Tp>::value;\n#endif\n\n// is_polymorphic\n\n#if __WI_HAS_FEATURE_IS_POLYMORPHIC\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_polymorphic : public integral_constant<bool, __is_polymorphic(_Tp)>\n{\n};\n\n#else\n\ntemplate <typename _Tp>\nchar& __is_polymorphic_impl(typename enable_if<sizeof((_Tp*)dynamic_cast<const volatile void*>(declval<_Tp*>())) != 0, int>::type);\ntemplate <typename _Tp>\n__two& __is_polymorphic_impl(...);\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_polymorphic : public integral_constant<bool, sizeof(__is_polymorphic_impl<_Tp>(0)) == 1>\n{\n};\n\n#endif // __WI_HAS_FEATURE_IS_POLYMORPHIC\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_polymorphic_v = is_polymorphic<_Tp>::value;\n#endif\n\n// has_virtual_destructor\n\n#if __WI_HAS_FEATURE_HAS_VIRTUAL_DESTRUCTOR || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS has_virtual_destructor : public integral_constant<bool, __has_virtual_destructor(_Tp)>\n{\n};\n\n#else\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS has_virtual_destructor : public false_type\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool has_virtual_destructor_v = has_virtual_destructor<_Tp>::value;\n#endif\n\n// has_unique_object_representations\n\n#if __WI_LIBCPP_STD_VER > 14 && defined(__WI_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS has_unique_object_representations\n    : public integral_constant<bool, __has_unique_object_representations(remove_cv_t<remove_all_extents_t<_Tp>>)>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool has_unique_object_representations_v = has_unique_object_representations<_Tp>::value;\n#endif\n\n#endif\n\n// alignment_of\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS alignment_of : public integral_constant<size_t, __alignof__(_Tp)>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR size_t alignment_of_v = alignment_of<_Tp>::value;\n#endif\n\n// aligned_storage\n\ntemplate <class _Hp, class _Tp>\nstruct __type_list\n{\n    typedef _Hp _Head;\n    typedef _Tp _Tail;\n};\n\nstruct __nat\n{\n#ifndef __WI_LIBCPP_CXX03_LANG\n    __nat() = delete;\n    __nat(const __nat&) = delete;\n    __nat& operator=(const __nat&) = delete;\n    ~__nat() = delete;\n#endif\n};\n\ntemplate <class _Tp>\nstruct __align_type\n{\n    static const size_t value = alignment_of<_Tp>::value;\n    typedef _Tp type;\n};\n\nstruct __struct_double\n{\n    long double __lx;\n};\nstruct __struct_double4\n{\n    double __lx[4];\n};\n\ntypedef __type_list<\n    __align_type<unsigned char>,\n    __type_list<\n        __align_type<unsigned short>,\n        __type_list<\n            __align_type<unsigned int>,\n            __type_list<\n                __align_type<unsigned long>,\n                __type_list<\n                    __align_type<unsigned long long>,\n                    __type_list<__align_type<double>, __type_list<__align_type<long double>, __type_list<__align_type<__struct_double>, __type_list<__align_type<__struct_double4>, __type_list<__align_type<int*>, __nat>>>>>>>>>>\n    __all_types;\n\ntemplate <class _TL, size_t _Align>\nstruct __find_pod;\n\ntemplate <class _Hp, size_t _Align>\nstruct __find_pod<__type_list<_Hp, __nat>, _Align>\n{\n    typedef typename conditional<_Align == _Hp::value, typename _Hp::type, void>::type type;\n};\n\ntemplate <class _Hp, class _Tp, size_t _Align>\nstruct __find_pod<__type_list<_Hp, _Tp>, _Align>\n{\n    typedef typename conditional<_Align == _Hp::value, typename _Hp::type, typename __find_pod<_Tp, _Align>::type>::type type;\n};\n\ntemplate <size_t _Align>\nstruct __has_pod_with_align : public integral_constant<bool, !is_same<typename __find_pod<__all_types, _Align>::type, void>::value>\n{\n};\n\ntemplate <class _TL, size_t _Len>\nstruct __find_max_align;\n\ntemplate <class _Hp, size_t _Len>\nstruct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value>\n{\n};\n\ntemplate <size_t _Len, size_t _A1, size_t _A2>\nstruct __select_align\n{\nprivate:\n    static const size_t __min = _A2 < _A1 ? _A2 : _A1;\n    static const size_t __max = _A1 < _A2 ? _A2 : _A1;\n\npublic:\n    static const size_t value = _Len < __max ? __min : __max;\n};\n\ntemplate <class _Hp, class _Tp, size_t _Len>\nstruct __find_max_align<__type_list<_Hp, _Tp>, _Len>\n    : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value>\n{\n};\n\ntemplate <size_t _Len, size_t _Align, bool = __has_pod_with_align<_Align>::value>\nstruct __aligned_storage\n{\n    typedef typename __find_pod<__all_types, _Align>::type _Aligner;\n    static_assert(!is_void<_Aligner>::value, \"\");\n    union type\n    {\n        _Aligner __align;\n        unsigned char __data[(_Len + _Align - 1) / _Align * _Align];\n    };\n};\n\n#define __WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \\\n    template <size_t _Len> \\\n    struct __aligned_storage<_Len, n, false> \\\n    { \\\n        struct __WI_ALIGNAS(n) type \\\n        { \\\n            unsigned char __lx[(_Len + n - 1) / n * n]; \\\n        }; \\\n    }\n\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000);\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000);\n// PE/COFF does not support alignment beyond 8192 (=0x2000)\n#if !defined(__WI_LIBCPP_OBJECT_FORMAT_COFF)\n__WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000);\n#endif // !defined(__WI_LIBCPP_OBJECT_FORMAT_COFF)\n\n#undef __WI_CREATE_ALIGNED_STORAGE_SPECIALIZATION\n\ntemplate <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>\nstruct __WI_LIBCPP_TEMPLATE_VIS aligned_storage : public __aligned_storage<_Len, _Align>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>\nusing aligned_storage_t = typename aligned_storage<_Len, _Align>::type;\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_VARIADICS\n\n// aligned_union\n\ntemplate <size_t _I0, size_t... _In>\nstruct __static_max;\n\ntemplate <size_t _I0>\nstruct __static_max<_I0>\n{\n    static const size_t value = _I0;\n};\n\ntemplate <size_t _I0, size_t _I1, size_t... _In>\nstruct __static_max<_I0, _I1, _In...>\n{\n    static const size_t value = _I0 >= _I1 ? __static_max<_I0, _In...>::value : __static_max<_I1, _In...>::value;\n};\n\ntemplate <size_t _Len, class _Type0, class... _Types>\nstruct aligned_union\n{\n    static const size_t alignment_value = __static_max<__alignof__(_Type0), __alignof__(_Types)...>::value;\n    static const size_t __len = __static_max<_Len, sizeof(_Type0), sizeof(_Types)...>::value;\n    typedef typename aligned_storage<__len, alignment_value>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <size_t _Len, class... _Types>\nusing aligned_union_t = typename aligned_union<_Len, _Types...>::type;\n#endif\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Tp>\nstruct __numeric_type\n{\n    static void __test(...);\n    static float __test(float);\n    static double __test(char);\n    static double __test(int);\n    static double __test(unsigned);\n    static double __test(long);\n    static double __test(unsigned long);\n    static double __test(long long);\n    static double __test(unsigned long long);\n    static double __test(double);\n    static long double __test(long double);\n\n    typedef decltype(__test(declval<_Tp>())) type;\n    static const bool value = !is_same<type, void>::value;\n};\n\ntemplate <>\nstruct __numeric_type<void>\n{\n    static const bool value = true;\n};\n\n// __promote\n\ntemplate <class _A1, class _A2 = void, class _A3 = void, bool = __numeric_type<_A1>::value && __numeric_type<_A2>::value && __numeric_type<_A3>::value>\nclass __promote_imp\n{\npublic:\n    static const bool value = false;\n};\n\ntemplate <class _A1, class _A2, class _A3>\nclass __promote_imp<_A1, _A2, _A3, true>\n{\nprivate:\n    typedef typename __promote_imp<_A1>::type __type1;\n    typedef typename __promote_imp<_A2>::type __type2;\n    typedef typename __promote_imp<_A3>::type __type3;\n\npublic:\n    typedef decltype(__type1() + __type2() + __type3()) type;\n    static const bool value = true;\n};\n\ntemplate <class _A1, class _A2>\nclass __promote_imp<_A1, _A2, void, true>\n{\nprivate:\n    typedef typename __promote_imp<_A1>::type __type1;\n    typedef typename __promote_imp<_A2>::type __type2;\n\npublic:\n    typedef decltype(__type1() + __type2()) type;\n    static const bool value = true;\n};\n\ntemplate <class _A1>\nclass __promote_imp<_A1, void, void, true>\n{\npublic:\n    typedef typename __numeric_type<_A1>::type type;\n    static const bool value = true;\n};\n\ntemplate <class _A1, class _A2 = void, class _A3 = void>\nclass __promote : public __promote_imp<_A1, _A2, _A3>\n{\n};\n\n// make_signed / make_unsigned\n\ntypedef __type_list<\n    signed char,\n    __type_list<\n        signed short,\n        __type_list<\n            signed int,\n            __type_list<\n                signed long,\n                __type_list<\n                    signed long long,\n#ifndef __WI_LIBCPP_HAS_NO_INT128\n                    __type_list<\n                        __int128_t,\n#endif\n                        __nat\n#ifndef __WI_LIBCPP_HAS_NO_INT128\n                        >\n#endif\n                    >>>>>\n    __signed_types;\n\ntypedef __type_list<\n    unsigned char,\n    __type_list<\n        unsigned short,\n        __type_list<\n            unsigned int,\n            __type_list<\n                unsigned long,\n                __type_list<\n                    unsigned long long,\n#ifndef __WI_LIBCPP_HAS_NO_INT128\n                    __type_list<\n                        __uint128_t,\n#endif\n                        __nat\n#ifndef __WI_LIBCPP_HAS_NO_INT128\n                        >\n#endif\n                    >>>>>\n    __unsigned_types;\n\ntemplate <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)>\nstruct __find_first;\n\ntemplate <class _Hp, class _Tp, size_t _Size>\nstruct __find_first<__type_list<_Hp, _Tp>, _Size, true>\n{\n    typedef _Hp type;\n};\n\ntemplate <class _Hp, class _Tp, size_t _Size>\nstruct __find_first<__type_list<_Hp, _Tp>, _Size, false>\n{\n    typedef typename __find_first<_Tp, _Size>::type type;\n};\n\ntemplate <class _Tp, class _Up, bool = is_const<typename remove_reference<_Tp>::type>::value, bool = is_volatile<typename remove_reference<_Tp>::type>::value>\nstruct __apply_cv\n{\n    typedef _Up type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp, _Up, true, false>\n{\n    typedef const _Up type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp, _Up, false, true>\n{\n    typedef volatile _Up type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp, _Up, true, true>\n{\n    typedef const volatile _Up type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp&, _Up, false, false>\n{\n    typedef _Up& type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp&, _Up, true, false>\n{\n    typedef const _Up& type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp&, _Up, false, true>\n{\n    typedef volatile _Up& type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __apply_cv<_Tp&, _Up, true, true>\n{\n    typedef const volatile _Up& type;\n};\n\ntemplate <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>\nstruct __make_signed{};\n\ntemplate <class _Tp>\nstruct __make_signed<_Tp, true>\n{\n    typedef typename __find_first<__signed_types, sizeof(_Tp)>::type type;\n};\n\ntemplate <>\nstruct __make_signed<bool, true>{};\ntemplate <>\nstruct __make_signed<signed short, true>\n{\n    typedef short type;\n};\ntemplate <>\nstruct __make_signed<unsigned short, true>\n{\n    typedef short type;\n};\ntemplate <>\nstruct __make_signed<signed int, true>\n{\n    typedef int type;\n};\ntemplate <>\nstruct __make_signed<unsigned int, true>\n{\n    typedef int type;\n};\ntemplate <>\nstruct __make_signed<signed long, true>\n{\n    typedef long type;\n};\ntemplate <>\nstruct __make_signed<unsigned long, true>\n{\n    typedef long type;\n};\ntemplate <>\nstruct __make_signed<signed long long, true>\n{\n    typedef long long type;\n};\ntemplate <>\nstruct __make_signed<unsigned long long, true>\n{\n    typedef long long type;\n};\n#ifndef __WI_LIBCPP_HAS_NO_INT128\ntemplate <>\nstruct __make_signed<__int128_t, true>\n{\n    typedef __int128_t type;\n};\ntemplate <>\nstruct __make_signed<__uint128_t, true>\n{\n    typedef __int128_t type;\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS make_signed\n{\n    typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing make_signed_t = typename make_signed<_Tp>::type;\n#endif\n\ntemplate <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>\nstruct __make_unsigned{};\n\ntemplate <class _Tp>\nstruct __make_unsigned<_Tp, true>\n{\n    typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type;\n};\n\ntemplate <>\nstruct __make_unsigned<bool, true>{};\ntemplate <>\nstruct __make_unsigned<signed short, true>\n{\n    typedef unsigned short type;\n};\ntemplate <>\nstruct __make_unsigned<unsigned short, true>\n{\n    typedef unsigned short type;\n};\ntemplate <>\nstruct __make_unsigned<signed int, true>\n{\n    typedef unsigned int type;\n};\ntemplate <>\nstruct __make_unsigned<unsigned int, true>\n{\n    typedef unsigned int type;\n};\ntemplate <>\nstruct __make_unsigned<signed long, true>\n{\n    typedef unsigned long type;\n};\ntemplate <>\nstruct __make_unsigned<unsigned long, true>\n{\n    typedef unsigned long type;\n};\ntemplate <>\nstruct __make_unsigned<signed long long, true>\n{\n    typedef unsigned long long type;\n};\ntemplate <>\nstruct __make_unsigned<unsigned long long, true>\n{\n    typedef unsigned long long type;\n};\n#ifndef __WI_LIBCPP_HAS_NO_INT128\ntemplate <>\nstruct __make_unsigned<__int128_t, true>\n{\n    typedef __uint128_t type;\n};\ntemplate <>\nstruct __make_unsigned<__uint128_t, true>\n{\n    typedef __uint128_t type;\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS make_unsigned\n{\n    typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing make_unsigned_t = typename make_unsigned<_Tp>::type;\n#endif\n\n#ifdef __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Tp, class _Up = void, class _Vp = void>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type\n{\npublic:\n    typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp>::type type;\n};\n\ntemplate <>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<void, void, void>\n{\npublic:\n    typedef void type;\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<_Tp, void, void>\n{\npublic:\n    typedef typename common_type<_Tp, _Tp>::type type;\n};\n\ntemplate <class _Tp, class _Up>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up, void>\n{\n    typedef typename decay<decltype(true ? declval<_Tp>() : declval<_Up>())>::type type;\n};\n\n#else // __WI_LIBCPP_HAS_NO_VARIADICS\n\n// bullet 1 - sizeof...(Tp) == 0\n\ntemplate <class... _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type{};\n\n// bullet 2 - sizeof...(Tp) == 1\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<_Tp> : public common_type<_Tp, _Tp>\n{\n};\n\n// bullet 3 - sizeof...(Tp) == 2\n\ntemplate <class _Tp, class _Up, class = void>\nstruct __common_type2_imp\n{\n};\n\ntemplate <class _Tp, class _Up>\nstruct __common_type2_imp<_Tp, _Up, typename __void_t<decltype(true ? declval<_Tp>() : declval<_Up>())>::type>\n{\n    typedef typename decay<decltype(true ? declval<_Tp>() : declval<_Up>())>::type type;\n};\n\ntemplate <class _Tp, class _Up, class _DTp = typename decay<_Tp>::type, class _DUp = typename decay<_Up>::type>\nusing __common_type2 =\n    typename conditional<is_same<_Tp, _DTp>::value && is_same<_Up, _DUp>::value, __common_type2_imp<_Tp, _Up>, common_type<_DTp, _DUp>>::type;\n\ntemplate <class _Tp, class _Up>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up> : __common_type2<_Tp, _Up>\n{\n};\n\n// bullet 4 - sizeof...(Tp) > 2\n\ntemplate <class... Tp>\nstruct __common_types;\n\ntemplate <class, class = void>\nstruct __common_type_impl\n{\n};\n\ntemplate <class _Tp, class _Up>\nstruct __common_type_impl<__common_types<_Tp, _Up>, typename __void_t<typename common_type<_Tp, _Up>::type>::type>\n{\n    typedef typename common_type<_Tp, _Up>::type type;\n};\n\ntemplate <class _Tp, class _Up, class... _Vp>\nstruct __common_type_impl<__common_types<_Tp, _Up, _Vp...>, typename __void_t<typename common_type<_Tp, _Up>::type>::type>\n    : __common_type_impl<__common_types<typename common_type<_Tp, _Up>::type, _Vp...>>\n{\n};\n\ntemplate <class _Tp, class _Up, class... _Vp>\nstruct __WI_LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up, _Vp...> : __common_type_impl<__common_types<_Tp, _Up, _Vp...>>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class... _Tp>\nusing common_type_t = typename common_type<_Tp...>::type;\n#endif\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n\n// is_assignable\n\ntemplate <typename, typename _Tp>\nstruct __select_2nd\n{\n    typedef _Tp type;\n};\n\ntemplate <class _Tp, class _Arg>\ntypename __select_2nd<decltype((declval<_Tp>() = declval<_Arg>())), true_type>::type __is_assignable_test(int);\n\ntemplate <class, class>\nfalse_type __is_assignable_test(...);\n\ntemplate <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value>\nstruct __is_assignable_imp : public decltype((__is_assignable_test<_Tp, _Arg>(0)))\n{\n};\n\ntemplate <class _Tp, class _Arg>\nstruct __is_assignable_imp<_Tp, _Arg, true> : public false_type\n{\n};\n\ntemplate <class _Tp, class _Arg>\nstruct is_assignable : public __is_assignable_imp<_Tp, _Arg>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp, class _Arg>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_assignable_v = is_assignable<_Tp, _Arg>::value;\n#endif\n\n// is_copy_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_copy_assignable\n    : public is_assignable<typename add_lvalue_reference<_Tp>::type, typename add_lvalue_reference<typename add_const<_Tp>::type>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_copy_assignable_v = is_copy_assignable<_Tp>::value;\n#endif\n\n// is_move_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_move_assignable\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n    : public is_assignable<typename add_lvalue_reference<_Tp>::type, typename add_rvalue_reference<_Tp>::type>\n{\n};\n#else\n    : public is_copy_assignable<_Tp>\n{\n};\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_move_assignable_v = is_move_assignable<_Tp>::value;\n#endif\n\n// is_destructible\n\n#if __WI_HAS_FEATURE_IS_DESTRUCTIBLE\n\ntemplate <class _Tp>\nstruct is_destructible : public integral_constant<bool, __is_destructible(_Tp)>\n{\n};\n\n#else\n\n//  if it's a reference, return true\n//  if it's a function, return false\n//  if it's   void,     return false\n//  if it's an array of unknown bound, return false\n//  Otherwise, return \"std::declval<_Up&>().~_Up()\" is well-formed\n//    where _Up is remove_all_extents<_Tp>::type\n\ntemplate <class>\nstruct __is_destructible_apply\n{\n    typedef int type;\n};\n\ntemplate <typename _Tp>\nstruct __is_destructor_wellformed\n{\n    template <typename _Tp1>\n    static char __test(typename __is_destructible_apply<decltype(declval<_Tp1&>().~_Tp1())>::type);\n\n    template <typename _Tp1>\n    static __two __test(...);\n\n    static const bool value = sizeof(__test<_Tp>(12)) == sizeof(char);\n};\n\ntemplate <class _Tp, bool>\nstruct __destructible_imp;\n\ntemplate <class _Tp>\nstruct __destructible_imp<_Tp, false>\n    : public integral_constant<bool, __is_destructor_wellformed<typename remove_all_extents<_Tp>::type>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __destructible_imp<_Tp, true> : public true_type\n{\n};\n\ntemplate <class _Tp, bool>\nstruct __destructible_false;\n\ntemplate <class _Tp>\nstruct __destructible_false<_Tp, false> : public __destructible_imp<_Tp, is_reference<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __destructible_false<_Tp, true> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct is_destructible : public __destructible_false<_Tp, is_function<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct is_destructible<_Tp[]> : public false_type\n{\n};\n\ntemplate <>\nstruct is_destructible<void> : public false_type\n{\n};\n\n#endif // __WI_HAS_FEATURE_IS_DESTRUCTIBLE\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_destructible_v = is_destructible<_Tp>::value;\n#endif\n\n// move\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR typename remove_reference<_Tp>::type&& move(_Tp&& __t) WI_NOEXCEPT\n{\n    typedef typename remove_reference<_Tp>::type _Up;\n    return static_cast<_Up&&>(__t);\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR _Tp&& forward(typename remove_reference<_Tp>::type& __t) WI_NOEXCEPT\n{\n    return static_cast<_Tp&&>(__t);\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR _Tp&& forward(typename remove_reference<_Tp>::type&& __t) WI_NOEXCEPT\n{\n    static_assert(!is_lvalue_reference<_Tp>::value, \"can not forward an rvalue as an lvalue\");\n    return static_cast<_Tp&&>(__t);\n}\n\ntemplate <class _T1, class _T2 = _T1>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR_AFTER_CXX17 _T1 exchange(_T1& __obj, _T2&& __new_value)\n{\n    _T1 __old_value = wistd::move(__obj);\n    __obj = wistd::forward<_T2>(__new_value);\n    return __old_value;\n}\n\n#else // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY _Tp& move(_Tp& __t)\n{\n    return __t;\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY const _Tp& move(const _Tp& __t)\n{\n    return __t;\n}\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY _Tp& forward(typename remove_reference<_Tp>::type& __t) WI_NOEXCEPT\n{\n    return __t;\n}\n\ntemplate <class _T1, class _T2 = _T1>\ninline __WI_LIBCPP_INLINE_VISIBILITY _T1 exchange(_T1& __obj, const _T2& __new_value)\n{\n    _T1 __old_value = __obj;\n    __obj = __new_value;\n    return __old_value;\n}\n\ntemplate <class _Tp>\nclass __rv\n{\n    typedef typename remove_reference<_Tp>::type _Trr;\n    _Trr& t_;\n\npublic:\n    __WI_LIBCPP_INLINE_VISIBILITY\n    _Trr* operator->()\n    {\n        return &t_;\n    }\n    __WI_LIBCPP_INLINE_VISIBILITY\n    explicit __rv(_Trr& __t) : t_(__t)\n    {\n    }\n};\n\n#endif // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp = void>\n#else\ntemplate <class _Tp>\n#endif\nstruct __WI_LIBCPP_TEMPLATE_VIS less : binary_function<_Tp, _Tp, bool>\n{\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 __WI_LIBCPP_INLINE_VISIBILITY bool operator()(\n        const _Tp& __x, const _Tp& __y) const\n    {\n        return __x < __y;\n    }\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <>\nstruct __WI_LIBCPP_TEMPLATE_VIS less<void>\n{\n    template <class _T1, class _T2>\n    __WI_LIBCPP_NODISCARD_ATTRIBUTE __WI_LIBCPP_CONSTEXPR_AFTER_CXX11 __WI_LIBCPP_INLINE_VISIBILITY auto operator()(_T1&& __t, _T2&& __u) const\n        __WI_NOEXCEPT_(noexcept(wistd::forward<_T1>(__t) < wistd::forward<_T2>(__u)))\n            -> decltype(wistd::forward<_T1>(__t) < wistd::forward<_T2>(__u))\n    {\n        return wistd::forward<_T1>(__t) < wistd::forward<_T2>(__u);\n    }\n    typedef void is_transparent;\n};\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY typename decay<_Tp>::type __decay_copy(_Tp&& __t)\n{\n    return wistd::forward<_Tp>(__t);\n}\n\n#else\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY typename decay<_Tp>::type __decay_copy(const _Tp& __t)\n{\n    return wistd::forward<_Tp>(__t);\n}\n\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\n#if __WI_HAS_FEATURE_REFERENCE_QUALIFIED_FUNCTIONS || (defined(__WI_GNUC_VER) && __WI_GNUC_VER >= 409)\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...)&, true, false>\n{\n    typedef _Class& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...)&, true, false>\n{\n    typedef _Class& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false>\n{\n    typedef _Class const& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&, true, false>\n{\n    typedef _Class const& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false>\n{\n    typedef _Class volatile& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&, true, false>\n{\n    typedef _Class volatile& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false>\n{\n    typedef _Class const volatile& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&, true, false>\n{\n    typedef _Class const volatile& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...)&&, true, false>\n{\n    typedef _Class&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...)&&, true, false>\n{\n    typedef _Class&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false>\n{\n    typedef _Class const&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&&, true, false>\n{\n    typedef _Class const&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false>\n{\n    typedef _Class volatile&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&&, true, false>\n{\n    typedef _Class volatile&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false>\n{\n    typedef _Class const volatile&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param...);\n};\n\ntemplate <class _Rp, class _Class, class... _Param>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&&, true, false>\n{\n    typedef _Class const volatile&& _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_Param..., ...);\n};\n\n#endif // __WI_HAS_FEATURE_REFERENCE_QUALIFIED_FUNCTIONS || __WI_GNUC_VER >= 409\n\n#else // __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)();\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(...);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...), true, false>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2, ...);\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)();\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(...);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const, true, false>\n{\n    typedef _Class const _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2, ...);\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)();\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(...);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) volatile, true, false>\n{\n    typedef _Class volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2, ...);\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)();\n};\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(...);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0);\n};\n\ntemplate <class _Rp, class _Class, class _P0>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, ...);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2);\n};\n\ntemplate <class _Rp, class _Class, class _P0, class _P1, class _P2>\nstruct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const volatile, true, false>\n{\n    typedef _Class const volatile _ClassType;\n    typedef _Rp _ReturnType;\n    typedef _Rp(_FnType)(_P0, _P1, _P2, ...);\n};\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Rp, class _Class>\nstruct __member_pointer_traits_imp<_Rp _Class::*, false, true>\n{\n    typedef _Class _ClassType;\n    typedef _Rp _ReturnType;\n};\n\ntemplate <class _Mp>\nstruct __member_pointer_traits\n    : public __member_pointer_traits_imp<typename remove_cv<_Mp>::type, is_member_function_pointer<_Mp>::value, is_member_object_pointer<_Mp>::value>\n{\n    //     typedef ... _ClassType;\n    //     typedef ... _ReturnType;\n    //     typedef ... _FnType;\n};\n\ntemplate <class _DecayedFp>\nstruct __member_pointer_class_type\n{\n};\n\ntemplate <class _Ret, class _ClassType>\nstruct __member_pointer_class_type<_Ret _ClassType::*>\n{\n    typedef _ClassType type;\n};\n\n// result_of\n\ntemplate <class _Callable>\nclass result_of;\n\n#ifdef __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Fn, bool, bool>\nclass __result_of\n{\n};\n\ntemplate <class _Fn>\nclass __result_of<_Fn(), true, false>\n{\npublic:\n    typedef decltype(declval<_Fn>()()) type;\n};\n\ntemplate <class _Fn, class _A0>\nclass __result_of<_Fn(_A0), true, false>\n{\npublic:\n    typedef decltype(declval<_Fn>()(declval<_A0>())) type;\n};\n\ntemplate <class _Fn, class _A0, class _A1>\nclass __result_of<_Fn(_A0, _A1), true, false>\n{\npublic:\n    typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>())) type;\n};\n\ntemplate <class _Fn, class _A0, class _A1, class _A2>\nclass __result_of<_Fn(_A0, _A1, _A2), true, false>\n{\npublic:\n    typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>(), declval<_A2>())) type;\n};\n\ntemplate <class _Mp, class _Tp, bool _IsMemberFunctionPtr>\nstruct __result_of_mp;\n\n// member function pointer\n\ntemplate <class _Mp, class _Tp>\nstruct __result_of_mp<_Mp, _Tp, true> : public __identity<typename __member_pointer_traits<_Mp>::_ReturnType>\n{\n};\n\n// member data pointer\n\ntemplate <class _Mp, class _Tp, bool>\nstruct __result_of_mdp;\n\ntemplate <class _Rp, class _Class, class _Tp>\nstruct __result_of_mdp<_Rp _Class::*, _Tp, false>\n{\n    typedef typename __apply_cv<decltype(*declval<_Tp>()), _Rp>::type& type;\n};\n\ntemplate <class _Rp, class _Class, class _Tp>\nstruct __result_of_mdp<_Rp _Class::*, _Tp, true>\n{\n    typedef typename __apply_cv<_Tp, _Rp>::type& type;\n};\n\ntemplate <class _Rp, class _Class, class _Tp>\nstruct __result_of_mp<_Rp _Class::*, _Tp, false>\n    : public __result_of_mdp<_Rp _Class::*, _Tp, is_base_of<_Class, typename remove_reference<_Tp>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _Tp>\nclass __result_of<_Fn(_Tp), false, true> // _Fn must be member pointer\n    : public __result_of_mp<typename remove_reference<_Fn>::type, _Tp, is_member_function_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _Tp, class _A0>\nclass __result_of<_Fn(_Tp, _A0), false, true> // _Fn must be member pointer\n    : public __result_of_mp<typename remove_reference<_Fn>::type, _Tp, is_member_function_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _Tp, class _A0, class _A1>\nclass __result_of<_Fn(_Tp, _A0, _A1), false, true> // _Fn must be member pointer\n    : public __result_of_mp<typename remove_reference<_Fn>::type, _Tp, is_member_function_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _Tp, class _A0, class _A1, class _A2>\nclass __result_of<_Fn(_Tp, _A0, _A1, _A2), false, true> // _Fn must be member pointer\n    : public __result_of_mp<typename remove_reference<_Fn>::type, _Tp, is_member_function_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\n// result_of\n\ntemplate <class _Fn>\nclass __WI_LIBCPP_TEMPLATE_VIS result_of<_Fn()>\n    : public __result_of<\n          _Fn(),\n          is_class<typename remove_reference<_Fn>::type>::value ||\n              is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,\n          is_member_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _A0>\nclass __WI_LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0)>\n    : public __result_of<\n          _Fn(_A0),\n          is_class<typename remove_reference<_Fn>::type>::value ||\n              is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,\n          is_member_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _A0, class _A1>\nclass __WI_LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0, _A1)>\n    : public __result_of<\n          _Fn(_A0, _A1),\n          is_class<typename remove_reference<_Fn>::type>::value ||\n              is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,\n          is_member_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\ntemplate <class _Fn, class _A0, class _A1, class _A2>\nclass __WI_LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0, _A1, _A2)>\n    : public __result_of<\n          _Fn(_A0, _A1, _A2),\n          is_class<typename remove_reference<_Fn>::type>::value ||\n              is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,\n          is_member_pointer<typename remove_reference<_Fn>::type>::value>\n{\n};\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n\n// template <class T, class... Args> struct is_constructible;\n\nnamespace __is_construct\n{\n    struct __nat\n    {\n    };\n} // namespace __is_construct\n\n#if !defined(__WI_LIBCPP_CXX03_LANG) && (!__WI_HAS_FEATURE_IS_CONSTRUCTIBLE || defined(__WI_LIBCPP_TESTING_FALLBACK_IS_CONSTRUCTIBLE))\n\ntemplate <class _Tp, class... _Args>\nstruct __libcpp_is_constructible;\n\ntemplate <class _To, class _From>\nstruct __is_invalid_base_to_derived_cast\n{\n    static_assert(is_reference<_To>::value, \"Wrong specialization\");\n    using _RawFrom = __uncvref_t<_From>;\n    using _RawTo = __uncvref_t<_To>;\n    static const bool value =\n        __lazy_and<__lazy_not<is_same<_RawFrom, _RawTo>>, is_base_of<_RawFrom, _RawTo>, __lazy_not<__libcpp_is_constructible<_RawTo, _From>>>::value;\n};\n\ntemplate <class _To, class _From>\nstruct __is_invalid_lvalue_to_rvalue_cast : false_type\n{\n    static_assert(is_reference<_To>::value, \"Wrong specialization\");\n};\n\ntemplate <class _ToRef, class _FromRef>\nstruct __is_invalid_lvalue_to_rvalue_cast<_ToRef&&, _FromRef&>\n{\n    using _RawFrom = __uncvref_t<_FromRef>;\n    using _RawTo = __uncvref_t<_ToRef>;\n    static const bool value =\n        __lazy_and<__lazy_not<is_function<_RawTo>>, __lazy_or<is_same<_RawFrom, _RawTo>, is_base_of<_RawTo, _RawFrom>>>::value;\n};\n\nstruct __is_constructible_helper\n{\n    template <class _To>\n    static void __eat(_To);\n\n    // This overload is needed to work around a Clang bug that disallows\n    // static_cast<T&&>(e) for non-reference-compatible types.\n    // Example: static_cast<int&&>(declval<double>());\n    // NOTE: The static_cast implementation below is required to support\n    //  classes with explicit conversion operators.\n    template <class _To, class _From, class = decltype(__eat<_To>(declval<_From>()))>\n    static true_type __test_cast(int);\n\n    template <class _To, class _From, class = decltype(static_cast<_To>(declval<_From>()))>\n    static integral_constant<bool, !__is_invalid_base_to_derived_cast<_To, _From>::value && !__is_invalid_lvalue_to_rvalue_cast<_To, _From>::value> __test_cast(\n        long);\n\n    template <class, class>\n    static false_type __test_cast(...);\n\n    template <class _Tp, class... _Args, class = decltype(_Tp(declval<_Args>()...))>\n    static true_type __test_nary(int);\n    template <class _Tp, class...>\n    static false_type __test_nary(...);\n\n    template <class _Tp, class _A0, class = decltype(::new _Tp(declval<_A0>()))>\n    static is_destructible<_Tp> __test_unary(int);\n    template <class, class>\n    static false_type __test_unary(...);\n};\n\ntemplate <class _Tp, bool = is_void<_Tp>::value>\nstruct __is_default_constructible : decltype(__is_constructible_helper::__test_nary<_Tp>(0))\n{\n};\n\ntemplate <class _Tp>\nstruct __is_default_constructible<_Tp, true> : false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __is_default_constructible<_Tp[], false> : false_type\n{\n};\n\ntemplate <class _Tp, size_t _Nx>\nstruct __is_default_constructible<_Tp[_Nx], false> : __is_default_constructible<typename remove_all_extents<_Tp>::type>\n{\n};\n\ntemplate <class _Tp, class... _Args>\nstruct __libcpp_is_constructible\n{\n    static_assert(sizeof...(_Args) > 1, \"Wrong specialization\");\n    typedef decltype(__is_constructible_helper::__test_nary<_Tp, _Args...>(0)) type;\n};\n\ntemplate <class _Tp>\nstruct __libcpp_is_constructible<_Tp> : __is_default_constructible<_Tp>\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __libcpp_is_constructible<_Tp, _A0> : public decltype(__is_constructible_helper::__test_unary<_Tp, _A0>(0))\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __libcpp_is_constructible<_Tp&, _A0> : public decltype(__is_constructible_helper::__test_cast<_Tp&, _A0>(0))\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __libcpp_is_constructible<_Tp&&, _A0> : public decltype(__is_constructible_helper::__test_cast<_Tp&&, _A0>(0))\n{\n};\n\n#endif\n\n#if __WI_HAS_FEATURE_IS_CONSTRUCTIBLE\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible : public integral_constant<bool, __is_constructible(_Tp, _Args...)>\n{\n};\n#elif !defined(__WI_LIBCPP_CXX03_LANG)\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible : public __libcpp_is_constructible<_Tp, _Args...>::type\n{\n};\n#else\n// template <class T> struct is_constructible0;\n\n//      main is_constructible0 test\n\ntemplate <class _Tp>\ndecltype((_Tp(), true_type())) __is_constructible0_test(_Tp&);\n\nfalse_type __is_constructible0_test(__any);\n\ntemplate <class _Tp, class _A0>\ndecltype((_Tp(declval<_A0>()), true_type())) __is_constructible1_test(_Tp&, _A0&);\n\ntemplate <class _A0>\nfalse_type __is_constructible1_test(__any, _A0&);\n\ntemplate <class _Tp, class _A0, class _A1>\ndecltype((_Tp(declval<_A0>(), declval<_A1>()), true_type())) __is_constructible2_test(_Tp&, _A0&, _A1&);\n\ntemplate <class _A0, class _A1>\nfalse_type __is_constructible2_test(__any, _A0&, _A1&);\n\ntemplate <class _Tp, class _A0, class _A1, class _A2>\ndecltype((_Tp(declval<_A0>(), declval<_A1>(), declval<_A2>()), true_type())) __is_constructible3_test(_Tp&, _A0&, _A1&, _A2&);\n\ntemplate <class _A0, class _A1, class _A2>\nfalse_type __is_constructible3_test(__any, _A0&, _A1&, _A2&);\n\ntemplate <bool, class _Tp>\nstruct __is_constructible0_imp // false, _Tp is not a scalar\n    : public common_type<decltype(__is_constructible0_test(declval<_Tp&>()))>::type\n{\n};\n\ntemplate <bool, class _Tp, class _A0>\nstruct __is_constructible1_imp // false, _Tp is not a scalar\n    : public common_type<decltype(__is_constructible1_test(declval<_Tp&>(), declval<_A0&>()))>::type\n{\n};\n\ntemplate <bool, class _Tp, class _A0, class _A1>\nstruct __is_constructible2_imp // false, _Tp is not a scalar\n    : public common_type<decltype(__is_constructible2_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>()))>::type\n{\n};\n\ntemplate <bool, class _Tp, class _A0, class _A1, class _A2>\nstruct __is_constructible3_imp // false, _Tp is not a scalar\n    : public common_type<decltype(__is_constructible3_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>(), declval<_A2>()))>::type\n{\n};\n\n//      handle scalars and reference types\n\n//      Scalars are default constructible, references are not\n\ntemplate <class _Tp>\nstruct __is_constructible0_imp<true, _Tp> : public is_scalar<_Tp>\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __is_constructible1_imp<true, _Tp, _A0> : public is_convertible<_A0, _Tp>\n{\n};\n\ntemplate <class _Tp, class _A0, class _A1>\nstruct __is_constructible2_imp<true, _Tp, _A0, _A1> : public false_type\n{\n};\n\ntemplate <class _Tp, class _A0, class _A1, class _A2>\nstruct __is_constructible3_imp<true, _Tp, _A0, _A1, _A2> : public false_type\n{\n};\n\n//      Treat scalars and reference types separately\n\ntemplate <bool, class _Tp>\nstruct __is_constructible0_void_check : public __is_constructible0_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, _Tp>\n{\n};\n\ntemplate <bool, class _Tp, class _A0>\nstruct __is_constructible1_void_check : public __is_constructible1_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, _Tp, _A0>\n{\n};\n\ntemplate <bool, class _Tp, class _A0, class _A1>\nstruct __is_constructible2_void_check\n    : public __is_constructible2_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, _Tp, _A0, _A1>\n{\n};\n\ntemplate <bool, class _Tp, class _A0, class _A1, class _A2>\nstruct __is_constructible3_void_check\n    : public __is_constructible3_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, _Tp, _A0, _A1, _A2>\n{\n};\n\n//      If any of T or Args is void, is_constructible should be false\n\ntemplate <class _Tp>\nstruct __is_constructible0_void_check<true, _Tp> : public false_type\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __is_constructible1_void_check<true, _Tp, _A0> : public false_type\n{\n};\n\ntemplate <class _Tp, class _A0, class _A1>\nstruct __is_constructible2_void_check<true, _Tp, _A0, _A1> : public false_type\n{\n};\n\ntemplate <class _Tp, class _A0, class _A1, class _A2>\nstruct __is_constructible3_void_check<true, _Tp, _A0, _A1, _A2> : public false_type\n{\n};\n\n//      is_constructible entry point\n\ntemplate <class _Tp, class _A0 = __is_construct::__nat, class _A1 = __is_construct::__nat, class _A2 = __is_construct::__nat>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible\n    : public __is_constructible3_void_check<\n          is_void<_Tp>::value || is_abstract<_Tp>::value || is_function<_Tp>::value || is_void<_A0>::value || is_void<_A1>::value || is_void<_A2>::value,\n          _Tp,\n          _A0,\n          _A1,\n          _A2>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible<_Tp, __is_construct::__nat, __is_construct::__nat>\n    : public __is_constructible0_void_check<is_void<_Tp>::value || is_abstract<_Tp>::value || is_function<_Tp>::value, _Tp>\n{\n};\n\ntemplate <class _Tp, class _A0>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible<_Tp, _A0, __is_construct::__nat>\n    : public __is_constructible1_void_check<is_void<_Tp>::value || is_abstract<_Tp>::value || is_function<_Tp>::value || is_void<_A0>::value, _Tp, _A0>\n{\n};\n\ntemplate <class _Tp, class _A0, class _A1>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_constructible<_Tp, _A0, _A1, __is_construct::__nat>\n    : public __is_constructible2_void_check<is_void<_Tp>::value || is_abstract<_Tp>::value || is_function<_Tp>::value || is_void<_A0>::value || is_void<_A1>::value, _Tp, _A0, _A1>\n{\n};\n\n//      Array types are default constructible if their element type\n//      is default constructible\n\ntemplate <class _Ap, size_t _Np>\nstruct __is_constructible0_imp<false, _Ap[_Np]> : public is_constructible<typename remove_all_extents<_Ap>::type>\n{\n};\n\ntemplate <class _Ap, size_t _Np, class _A0>\nstruct __is_constructible1_imp<false, _Ap[_Np], _A0> : public false_type\n{\n};\n\ntemplate <class _Ap, size_t _Np, class _A0, class _A1>\nstruct __is_constructible2_imp<false, _Ap[_Np], _A0, _A1> : public false_type\n{\n};\n\ntemplate <class _Ap, size_t _Np, class _A0, class _A1, class _A2>\nstruct __is_constructible3_imp<false, _Ap[_Np], _A0, _A1, _A2> : public false_type\n{\n};\n\n//      Incomplete array types are not constructible\n\ntemplate <class _Ap>\nstruct __is_constructible0_imp<false, _Ap[]> : public false_type\n{\n};\n\ntemplate <class _Ap, class _A0>\nstruct __is_constructible1_imp<false, _Ap[], _A0> : public false_type\n{\n};\n\ntemplate <class _Ap, class _A0, class _A1>\nstruct __is_constructible2_imp<false, _Ap[], _A0, _A1> : public false_type\n{\n};\n\ntemplate <class _Ap, class _A0, class _A1, class _A2>\nstruct __is_constructible3_imp<false, _Ap[], _A0, _A1, _A2> : public false_type\n{\n};\n\n#endif // __WI_HAS_FEATURE_IS_CONSTRUCTIBLE\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(__WI_LIBCPP_HAS_NO_VARIADICS)\ntemplate <class _Tp, class... _Args>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_constructible_v = is_constructible<_Tp, _Args...>::value;\n#endif\n\n// is_default_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_default_constructible : public is_constructible<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_default_constructible_v = is_default_constructible<_Tp>::value;\n#endif\n\n// is_copy_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_copy_constructible\n    : public is_constructible<_Tp, typename add_lvalue_reference<typename add_const<_Tp>::type>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_copy_constructible_v = is_copy_constructible<_Tp>::value;\n#endif\n\n// is_move_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_move_constructible\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n    : public is_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>\n#else\n    : public is_copy_constructible<_Tp>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_move_constructible_v = is_move_constructible<_Tp>::value;\n#endif\n\n// is_trivially_constructible\n\n#ifndef __WI_LIBCPP_HAS_NO_VARIADICS\n\n#if __WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE || __WI_GNUC_VER >= 501\n\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible : integral_constant<bool, __is_trivially_constructible(_Tp, _Args...)>\n{\n};\n\n#else // !__WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE\n\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible : false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp>\n#if __WI_HAS_FEATURE_HAS_TRIVIAL_CONSTRUCTOR\n    : integral_constant<bool, __has_trivial_constructor(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&&>\n#else\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp>\n#endif\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\n#endif // !__WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE\n\n#else // __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Tp, class _A0 = __is_construct::__nat, class _A1 = __is_construct::__nat>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible : false_type\n{\n};\n\n#if __WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE || __WI_GNUC_VER >= 501\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, __is_construct::__nat, __is_construct::__nat>\n    : integral_constant<bool, __is_trivially_constructible(_Tp)>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp, __is_construct::__nat>\n    : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp)>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&, __is_construct::__nat>\n    : integral_constant<bool, __is_trivially_constructible(_Tp, const _Tp&)>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&, __is_construct::__nat>\n    : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp&)>\n{\n};\n\n#else // !__WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, __is_construct::__nat, __is_construct::__nat>\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp, __is_construct::__nat>\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&, __is_construct::__nat>\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&, __is_construct::__nat>\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\n#endif // !__WI_HAS_FEATURE_IS_TRIVIALLY_CONSTRUCTIBLE\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(__WI_LIBCPP_HAS_NO_VARIADICS)\ntemplate <class _Tp, class... _Args>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_constructible_v = is_trivially_constructible<_Tp, _Args...>::value;\n#endif\n\n// is_trivially_default_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_default_constructible : public is_trivially_constructible<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_default_constructible_v = is_trivially_default_constructible<_Tp>::value;\n#endif\n\n// is_trivially_copy_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_copy_constructible\n    : public is_trivially_constructible<_Tp, typename add_lvalue_reference<const _Tp>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_copy_constructible_v = is_trivially_copy_constructible<_Tp>::value;\n#endif\n\n// is_trivially_move_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_move_constructible\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n    : public is_trivially_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>\n#else\n    : public is_trivially_copy_constructible<_Tp>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_move_constructible_v = is_trivially_move_constructible<_Tp>::value;\n#endif\n\n// is_trivially_assignable\n\n#if __WI_HAS_FEATURE_IS_TRIVIALLY_ASSIGNABLE || __WI_GNUC_VER >= 501\n\ntemplate <class _Tp, class _Arg>\nstruct is_trivially_assignable : integral_constant<bool, __is_trivially_assignable(_Tp, _Arg)>\n{\n};\n\n#else // !__WI_HAS_FEATURE_IS_TRIVIALLY_ASSIGNABLE\n\ntemplate <class _Tp, class _Arg>\nstruct is_trivially_assignable : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct is_trivially_assignable<_Tp&, _Tp> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct is_trivially_assignable<_Tp&, _Tp&> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct is_trivially_assignable<_Tp&, const _Tp&> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\nstruct is_trivially_assignable<_Tp&, _Tp&&> : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n\n#endif // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n#endif // !__WI_HAS_FEATURE_IS_TRIVIALLY_ASSIGNABLE\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp, class _Arg>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_assignable_v = is_trivially_assignable<_Tp, _Arg>::value;\n#endif\n\n// is_trivially_copy_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_copy_assignable\n    : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, typename add_lvalue_reference<typename add_const<_Tp>::type>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<_Tp>::value;\n#endif\n\n// is_trivially_move_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_move_assignable : public is_trivially_assignable<\n                                                                   typename add_lvalue_reference<_Tp>::type,\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n                                                                   typename add_rvalue_reference<_Tp>::type>\n#else\n                                                                   typename add_lvalue_reference<_Tp>::type>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v = is_trivially_move_assignable<_Tp>::value;\n#endif\n\n// is_trivially_destructible\n\n#if __WI_HAS_FEATURE_HAS_TRIVIAL_DESTRUCTOR || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_destructible\n    : public integral_constant<bool, is_destructible<_Tp>::value&& __has_trivial_destructor(_Tp)>\n{\n};\n\n#else\n\ntemplate <class _Tp>\nstruct __libcpp_trivial_destructor : public integral_constant<bool, is_scalar<_Tp>::value || is_reference<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_destructible : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_destructible<_Tp[]> : public false_type\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_destructible_v = is_trivially_destructible<_Tp>::value;\n#endif\n\n// is_nothrow_constructible\n\n#if 0\n    template <class _Tp, class... _Args>\n    struct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible\n        : public integral_constant<bool, __is_nothrow_constructible(_Tp(_Args...))>\n    {\n    };\n\n#else\n\n#ifndef __WI_LIBCPP_HAS_NO_VARIADICS\n\n#if !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT) || (__WI_GNUC_VER >= 407 && __cplusplus >= 201103L)\n\ntemplate <bool, bool, class _Tp, class... _Args>\nstruct __libcpp_is_nothrow_constructible;\n\ntemplate <class _Tp, class... _Args>\nstruct __libcpp_is_nothrow_constructible</*is constructible*/ true, /*is reference*/ false, _Tp, _Args...>\n    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>\n{\n};\n\ntemplate <class _Tp>\nvoid __implicit_conversion_to(_Tp) noexcept\n{\n}\n\ntemplate <class _Tp, class _Arg>\nstruct __libcpp_is_nothrow_constructible</*is constructible*/ true, /*is reference*/ true, _Tp, _Arg>\n    : public integral_constant<bool, noexcept(__implicit_conversion_to<_Tp>(declval<_Arg>()))>\n{\n};\n\ntemplate <class _Tp, bool _IsReference, class... _Args>\nstruct __libcpp_is_nothrow_constructible</*is constructible*/ false, _IsReference, _Tp, _Args...> : public false_type\n{\n};\n\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible\n    : __libcpp_is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, is_reference<_Tp>::value, _Tp, _Args...>\n{\n};\n\ntemplate <class _Tp, size_t _Ns>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp[_Ns]>\n    : __libcpp_is_nothrow_constructible<is_constructible<_Tp>::value, is_reference<_Tp>::value, _Tp>\n{\n};\n\n#else // !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT)\n\ntemplate <class _Tp, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible : false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_CONSTRUCTOR\n    : integral_constant<bool, __has_nothrow_constructor(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&&>\n#else\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp>\n#endif\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, const _Tp&>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\n#endif // !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT)\n\n#else // __WI_LIBCPP_HAS_NO_VARIADICS\n\ntemplate <class _Tp, class _A0 = __is_construct::__nat, class _A1 = __is_construct::__nat>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible : false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, __is_construct::__nat, __is_construct::__nat>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_CONSTRUCTOR\n    : integral_constant<bool, __has_nothrow_constructor(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp, __is_construct::__nat>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, const _Tp&, __is_construct::__nat>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&, __is_construct::__nat>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_COPY\n    : integral_constant<bool, __has_nothrow_copy(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n#endif\n{\n};\n\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n#endif // __has_feature(is_nothrow_constructible)\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(__WI_LIBCPP_HAS_NO_VARIADICS)\ntemplate <class _Tp, class... _Args>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_constructible_v = is_nothrow_constructible<_Tp, _Args...>::value;\n#endif\n\n// is_nothrow_default_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_default_constructible : public is_nothrow_constructible<_Tp>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_default_constructible_v = is_nothrow_default_constructible<_Tp>::value;\n#endif\n\n// is_nothrow_copy_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_copy_constructible\n    : public is_nothrow_constructible<_Tp, typename add_lvalue_reference<typename add_const<_Tp>::type>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_copy_constructible_v = is_nothrow_copy_constructible<_Tp>::value;\n#endif\n\n// is_nothrow_move_constructible\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_move_constructible\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n    : public is_nothrow_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>\n#else\n    : public is_nothrow_copy_constructible<_Tp>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v = is_nothrow_move_constructible<_Tp>::value;\n#endif\n\n// is_nothrow_assignable\n\n#if !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT) || (__WI_GNUC_VER >= 407 && __cplusplus >= 201103L)\n\ntemplate <bool, class _Tp, class _Arg>\nstruct __libcpp_is_nothrow_assignable;\n\ntemplate <class _Tp, class _Arg>\nstruct __libcpp_is_nothrow_assignable<false, _Tp, _Arg> : public false_type\n{\n};\n\ntemplate <class _Tp, class _Arg>\nstruct __libcpp_is_nothrow_assignable<true, _Tp, _Arg> : public integral_constant<bool, noexcept(declval<_Tp>() = declval<_Arg>())>\n{\n};\n\ntemplate <class _Tp, class _Arg>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_assignable\n    : public __libcpp_is_nothrow_assignable<is_assignable<_Tp, _Arg>::value, _Tp, _Arg>\n{\n};\n\n#else // !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT)\n\ntemplate <class _Tp, class _Arg>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_assignable : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, _Tp>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN\n    : integral_constant<bool, __has_nothrow_assign(_Tp)>\n{\n};\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, _Tp&>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN\n    : integral_constant<bool, __has_nothrow_assign(_Tp)>\n{\n};\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n#endif\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, const _Tp&>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN\n    : integral_constant<bool, __has_nothrow_assign(_Tp)>\n{\n};\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n#endif\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\nstruct is_nothrow_assignable<_Tp&, _Tp&&>\n#if __WI_HAS_FEATURE_HAS_NOTHROW_ASSIGN\n    : integral_constant<bool, __has_nothrow_assign(_Tp)>\n{\n};\n#else\n    : integral_constant<bool, is_scalar<_Tp>::value>\n{\n};\n#endif\n\n#endif // __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\n#endif // !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT)\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp, class _Arg>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_assignable_v = is_nothrow_assignable<_Tp, _Arg>::value;\n#endif\n\n// is_nothrow_copy_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_copy_assignable\n    : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, typename add_lvalue_reference<typename add_const<_Tp>::type>::type>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<_Tp>::value;\n#endif\n\n// is_nothrow_move_assignable\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_move_assignable : public is_nothrow_assignable<\n                                                                 typename add_lvalue_reference<_Tp>::type,\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n                                                                 typename add_rvalue_reference<_Tp>::type>\n#else\n                                                                 typename add_lvalue_reference<_Tp>::type>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_move_assignable_v = is_nothrow_move_assignable<_Tp>::value;\n#endif\n\n// is_nothrow_destructible\n\n#if !defined(__WI_LIBCPP_HAS_NO_NOEXCEPT) || (__WI_GNUC_VER >= 407 && __cplusplus >= 201103L)\n\ntemplate <bool, class _Tp>\nstruct __libcpp_is_nothrow_destructible;\n\ntemplate <class _Tp>\nstruct __libcpp_is_nothrow_destructible<false, _Tp> : public false_type\n{\n};\n\ntemplate <class _Tp>\nstruct __libcpp_is_nothrow_destructible<true, _Tp> : public integral_constant<bool, noexcept(declval<_Tp>().~_Tp())>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible : public __libcpp_is_nothrow_destructible<is_destructible<_Tp>::value, _Tp>\n{\n};\n\ntemplate <class _Tp, size_t _Ns>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp[_Ns]> : public is_nothrow_destructible<_Tp>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp&> : public true_type\n{\n};\n\n#ifndef __WI_LIBCPP_HAS_NO_RVALUE_REFERENCES\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp&&> : public true_type\n{\n};\n\n#endif\n\n#else\n\ntemplate <class _Tp>\nstruct __libcpp_nothrow_destructor : public integral_constant<bool, is_scalar<_Tp>::value || is_reference<_Tp>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible : public __libcpp_nothrow_destructor<typename remove_all_extents<_Tp>::type>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp[]> : public false_type\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_nothrow_destructible_v = is_nothrow_destructible<_Tp>::value;\n#endif\n\n// is_pod\n\n#if __WI_HAS_FEATURE_IS_POD || (__WI_GNUC_VER >= 403)\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_pod : public integral_constant<bool, __is_pod(_Tp)>\n{\n};\n\n#else\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_pod\n    : public integral_constant<\n          bool,\n          is_trivially_default_constructible<_Tp>::value && is_trivially_copy_constructible<_Tp>::value &&\n              is_trivially_copy_assignable<_Tp>::value && is_trivially_destructible<_Tp>::value>\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_pod_v = is_pod<_Tp>::value;\n#endif\n\n// is_literal_type;\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_literal_type\n#ifdef __WI_LIBCPP_IS_LITERAL\n    : public integral_constant<bool, __WI_LIBCPP_IS_LITERAL(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value || is_reference<typename remove_all_extents<_Tp>::type>::value>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_literal_type_v = is_literal_type<_Tp>::value;\n#endif\n\n// is_standard_layout;\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_standard_layout\n#if __WI_HAS_FEATURE_IS_STANDARD_LAYOUT || (__WI_GNUC_VER >= 407)\n    : public integral_constant<bool, __is_standard_layout(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_standard_layout_v = is_standard_layout<_Tp>::value;\n#endif\n\n// is_trivially_copyable;\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivially_copyable\n#if __WI_HAS_FEATURE_IS_TRIVIALLY_COPYABLE\n    : public integral_constant<bool, __is_trivially_copyable(_Tp)>\n#elif __WI_GNUC_VER >= 501\n    : public integral_constant<bool, !is_volatile<_Tp>::value && __is_trivially_copyable(_Tp)>\n#else\n    : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivially_copyable_v = is_trivially_copyable<_Tp>::value;\n#endif\n\n// is_trivial;\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_trivial\n#if __WI_HAS_FEATURE_IS_TRIVIAL || __WI_GNUC_VER >= 407\n    : public integral_constant<bool, __is_trivial(_Tp)>\n#else\n    : integral_constant<bool, is_trivially_copyable<_Tp>::value && is_trivially_default_constructible<_Tp>::value>\n#endif\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11 && !defined(__WI_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR __WI_LIBCPP_CONSTEXPR bool is_trivial_v = is_trivial<_Tp>::value;\n#endif\n\ntemplate <class _Tp>\nstruct __is_reference_wrapper_impl : public false_type\n{\n};\ntemplate <class _Tp>\nstruct __is_reference_wrapper_impl<reference_wrapper<_Tp>> : public true_type\n{\n};\ntemplate <class _Tp>\nstruct __is_reference_wrapper : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type>\n{\n};\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type, class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>\nusing __enable_if_bullet1 =\n    typename enable_if<is_member_function_pointer<_DecayFp>::value && is_base_of<_ClassT, _DecayA0>::value>::type;\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type>\nusing __enable_if_bullet2 =\n    typename enable_if<is_member_function_pointer<_DecayFp>::value && __is_reference_wrapper<_DecayA0>::value>::type;\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type, class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>\nusing __enable_if_bullet3 =\n    typename enable_if<is_member_function_pointer<_DecayFp>::value && !is_base_of<_ClassT, _DecayA0>::value && !__is_reference_wrapper<_DecayA0>::value>::type;\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type, class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>\nusing __enable_if_bullet4 =\n    typename enable_if<is_member_object_pointer<_DecayFp>::value && is_base_of<_ClassT, _DecayA0>::value>::type;\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type>\nusing __enable_if_bullet5 =\n    typename enable_if<is_member_object_pointer<_DecayFp>::value && __is_reference_wrapper<_DecayA0>::value>::type;\n\ntemplate <class _Fp, class _A0, class _DecayFp = typename decay<_Fp>::type, class _DecayA0 = typename decay<_A0>::type, class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>\nusing __enable_if_bullet6 =\n    typename enable_if<is_member_object_pointer<_DecayFp>::value && !is_base_of<_ClassT, _DecayA0>::value && !__is_reference_wrapper<_DecayA0>::value>::type;\n\n// __invoke forward declarations\n\n// fall back - none of the bullets\n\n#define __WI_LIBCPP_INVOKE_RETURN(...) \\\n    __WI_NOEXCEPT_(__WI_NOEXCEPT_(__VA_ARGS__))->decltype(__VA_ARGS__) \\\n    { \\\n        return __VA_ARGS__; \\\n    }\n\ntemplate <class... _Args>\nauto __invoke(__any, _Args&&... __args) -> __nat;\n\ntemplate <class... _Args>\nauto __invoke_constexpr(__any, _Args&&... __args) -> __nat;\n\n// bullets 1, 2 and 3\n\ntemplate <class _Fp, class _A0, class... _Args, class = __enable_if_bullet1<_Fp, _A0>>\ninline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n    __WI_LIBCPP_INVOKE_RETURN((wistd::forward<_A0>(__a0).*__f)(wistd::forward<_Args>(__args)...))\n\n        template <class _Fp, class _A0, class... _Args, class = __enable_if_bullet1<_Fp, _A0>>\n        inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR auto __invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n            __WI_LIBCPP_INVOKE_RETURN((wistd::forward<_A0>(__a0).*__f)(wistd::forward<_Args>(__args)...))\n\n                template <class _Fp, class _A0, class... _Args, class = __enable_if_bullet2<_Fp, _A0>>\n                inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n                    __WI_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(wistd::forward<_Args>(__args)...))\n\n                        template <class _Fp, class _A0, class... _Args, class = __enable_if_bullet2<_Fp, _A0>>\n                        inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR\n    auto __invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n        __WI_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(wistd::forward<_Args>(__args)...))\n\n            template <class _Fp, class _A0, class... _Args, class = __enable_if_bullet3<_Fp, _A0>>\n            inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n                __WI_LIBCPP_INVOKE_RETURN(((*wistd::forward<_A0>(__a0)).*__f)(wistd::forward<_Args>(__args)...))\n\n                    template <class _Fp, class _A0, class... _Args, class = __enable_if_bullet3<_Fp, _A0>>\n                    inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR\n    auto __invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&&... __args)\n        __WI_LIBCPP_INVOKE_RETURN(((*wistd::forward<_A0>(__a0)).*__f)(wistd::forward<_Args>(__args)...))\n\n    // bullets 4, 5 and 6\n\n    template <class _Fp, class _A0, class = __enable_if_bullet4<_Fp, _A0>>\n    inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0) __WI_LIBCPP_INVOKE_RETURN(wistd::forward<_A0>(__a0).*__f)\n\n        template <class _Fp, class _A0, class = __enable_if_bullet4<_Fp, _A0>>\n        inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR\n    auto __invoke_constexpr(_Fp&& __f, _A0&& __a0) __WI_LIBCPP_INVOKE_RETURN(wistd::forward<_A0>(__a0).*__f)\n\n        template <class _Fp, class _A0, class = __enable_if_bullet5<_Fp, _A0>>\n        inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0) __WI_LIBCPP_INVOKE_RETURN(__a0.get().*__f)\n\n            template <class _Fp, class _A0, class = __enable_if_bullet5<_Fp, _A0>>\n            inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR\n    auto __invoke_constexpr(_Fp&& __f, _A0&& __a0) __WI_LIBCPP_INVOKE_RETURN(__a0.get().*__f)\n\n        template <class _Fp, class _A0, class = __enable_if_bullet6<_Fp, _A0>>\n        inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _A0&& __a0)\n            __WI_LIBCPP_INVOKE_RETURN((*wistd::forward<_A0>(__a0)).*__f)\n\n                template <class _Fp, class _A0, class = __enable_if_bullet6<_Fp, _A0>>\n                inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR auto __invoke_constexpr(_Fp&& __f, _A0&& __a0)\n                    __WI_LIBCPP_INVOKE_RETURN((*wistd::forward<_A0>(__a0)).*__f)\n\n    // bullet 7\n\n    template <class _Fp, class... _Args>\n    inline __WI_LIBCPP_INLINE_VISIBILITY auto __invoke(_Fp&& __f, _Args&&... __args)\n        __WI_LIBCPP_INVOKE_RETURN(wistd::forward<_Fp>(__f)(wistd::forward<_Args>(__args)...))\n\n            template <class _Fp, class... _Args>\n            inline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR auto __invoke_constexpr(_Fp&& __f, _Args&&... __args)\n                __WI_LIBCPP_INVOKE_RETURN(wistd::forward<_Fp>(__f)(wistd::forward<_Args>(__args)...))\n\n#undef __WI_LIBCPP_INVOKE_RETURN\n\n    // __invokable\n\n    template <class _Ret, class _Fp, class... _Args>\n    struct __invokable_r\n{\n    // FIXME: Check that _Ret, _Fp, and _Args... are all complete types, cv void,\n    // or incomplete array types as required by the standard.\n    using _Result = decltype(__invoke(declval<_Fp>(), declval<_Args>()...));\n\n    using type =\n        typename conditional<!is_same<_Result, __nat>::value, typename conditional<is_void<_Ret>::value, true_type, is_convertible<_Result, _Ret>>::type, false_type>::type;\n    static const bool value = type::value;\n};\n\ntemplate <class _Fp, class... _Args>\nusing __invokable = __invokable_r<void, _Fp, _Args...>;\n\ntemplate <bool _IsInvokable, bool _IsCVVoid, class _Ret, class _Fp, class... _Args>\nstruct __nothrow_invokable_r_imp\n{\n    static const bool value = false;\n};\n\ntemplate <class _Ret, class _Fp, class... _Args>\nstruct __nothrow_invokable_r_imp<true, false, _Ret, _Fp, _Args...>\n{\n    typedef __nothrow_invokable_r_imp _ThisT;\n\n    template <class _Tp>\n    static void __test_noexcept(_Tp) noexcept;\n\n    static const bool value = noexcept(_ThisT::__test_noexcept<_Ret>(__invoke(declval<_Fp>(), declval<_Args>()...)));\n};\n\ntemplate <class _Ret, class _Fp, class... _Args>\nstruct __nothrow_invokable_r_imp<true, true, _Ret, _Fp, _Args...>\n{\n    static const bool value = noexcept(__invoke(declval<_Fp>(), declval<_Args>()...));\n};\n\ntemplate <class _Ret, class _Fp, class... _Args>\nusing __nothrow_invokable_r =\n    __nothrow_invokable_r_imp<__invokable_r<_Ret, _Fp, _Args...>::value, is_void<_Ret>::value, _Ret, _Fp, _Args...>;\n\ntemplate <class _Fp, class... _Args>\nusing __nothrow_invokable = __nothrow_invokable_r_imp<__invokable<_Fp, _Args...>::value, true, void, _Fp, _Args...>;\n\ntemplate <class _Fp, class... _Args>\nstruct __invoke_of : public enable_if<__invokable<_Fp, _Args...>::value, typename __invokable_r<void, _Fp, _Args...>::_Result>\n{\n};\n\n// result_of\n\ntemplate <class _Fp, class... _Args>\nclass __WI_LIBCPP_TEMPLATE_VIS result_of<_Fp(_Args...)> : public __invoke_of<_Fp, _Args...>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing result_of_t = typename result_of<_Tp>::type;\n#endif\n\n#if __WI_LIBCPP_STD_VER > 14\n\n// invoke_result\n\ntemplate <class _Fn, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS invoke_result : __invoke_of<_Fn, _Args...>\n{\n};\n\ntemplate <class _Fn, class... _Args>\nusing invoke_result_t = typename invoke_result<_Fn, _Args...>::type;\n\n// is_invocable\n\ntemplate <class _Fn, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_invocable : integral_constant<bool, __invokable<_Fn, _Args...>::value>\n{\n};\n\ntemplate <class _Ret, class _Fn, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_invocable_r : integral_constant<bool, __invokable_r<_Ret, _Fn, _Args...>::value>\n{\n};\n\ntemplate <class _Fn, class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;\n\ntemplate <class _Ret, class _Fn, class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_invocable_r_v = is_invocable_r<_Ret, _Fn, _Args...>::value;\n\n// is_nothrow_invocable\n\ntemplate <class _Fn, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_invocable : integral_constant<bool, __nothrow_invokable<_Fn, _Args...>::value>\n{\n};\n\ntemplate <class _Ret, class _Fn, class... _Args>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_invocable_r : integral_constant<bool, __nothrow_invokable_r<_Ret, _Fn, _Args...>::value>\n{\n};\n\ntemplate <class _Fn, class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_nothrow_invocable_v = is_nothrow_invocable<_Fn, _Args...>::value;\n\ntemplate <class _Ret, class _Fn, class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_nothrow_invocable_r_v = is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value;\n\n#endif // __WI_LIBCPP_STD_VER > 14\n\n#endif // !defined(__WI_LIBCPP_CXX03_LANG)\n\ntemplate <class _Tp>\nstruct __is_swappable;\ntemplate <class _Tp>\nstruct __is_nothrow_swappable;\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY\n#ifndef __WI_LIBCPP_CXX03_LANG\n    typename enable_if<is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value>::type\n#else\n    void\n#endif\n    swap_wil(_Tp& __x, _Tp& __y) __WI_NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value&& is_nothrow_move_assignable<_Tp>::value)\n{\n    _Tp __t(wistd::move(__x));\n    __x = wistd::move(__y);\n    __y = wistd::move(__t);\n}\n\ntemplate <class _ForwardIterator1, class _ForwardIterator2>\ninline __WI_LIBCPP_INLINE_VISIBILITY _ForwardIterator2 swap_ranges_wil(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)\n{\n    for (; __first1 != __last1; ++__first1, (void)++__first2)\n        swap_wil(*__first1, *__first2);\n    return __first2;\n}\n\ntemplate <class _Tp, size_t _Np>\ninline __WI_LIBCPP_INLINE_VISIBILITY typename enable_if<__is_swappable<_Tp>::value>::type swap_wil(_Tp (&__a)[_Np], _Tp (&__b)[_Np])\n    __WI_NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)\n{\n    wistd::swap_ranges_wil(__a, __a + _Np, __b);\n}\n\ntemplate <class _ForwardIterator1, class _ForwardIterator2>\ninline __WI_LIBCPP_INLINE_VISIBILITY void iter_swap_wil(_ForwardIterator1 __a, _ForwardIterator2 __b)\n    //                                  __WI_NOEXCEPT_(__WI_NOEXCEPT_(swap_wil(*__a, *__b)))\n    __WI_NOEXCEPT_(__WI_NOEXCEPT_(swap_wil(*declval<_ForwardIterator1>(), *declval<_ForwardIterator2>())))\n{\n    swap_wil(*__a, *__b);\n}\n\n// __swappable\n\nnamespace __detail\n{\n    // ALL generic swap overloads MUST already have a declaration available at this point.\n\n    template <class _Tp, class _Up = _Tp, bool _NotVoid = !is_void<_Tp>::value && !is_void<_Up>::value>\n    struct __swappable_with\n    {\n        template <class _LHS, class _RHS>\n        static decltype(swap_wil(declval<_LHS>(), declval<_RHS>())) __test_swap(int);\n        template <class, class>\n        static __nat __test_swap(long);\n\n        // Extra parens are needed for the C++03 definition of decltype.\n        typedef decltype((__test_swap<_Tp, _Up>(0))) __swap1;\n        typedef decltype((__test_swap<_Up, _Tp>(0))) __swap2;\n\n        static const bool value = !is_same<__swap1, __nat>::value && !is_same<__swap2, __nat>::value;\n    };\n\n    template <class _Tp, class _Up>\n    struct __swappable_with<_Tp, _Up, false> : false_type\n    {\n    };\n\n    template <class _Tp, class _Up = _Tp, bool _Swappable = __swappable_with<_Tp, _Up>::value>\n    struct __nothrow_swappable_with\n    {\n        static const bool value =\n#ifndef __WI_LIBCPP_HAS_NO_NOEXCEPT\n            noexcept(swap_wil(declval<_Tp>(), declval<_Up>())) && noexcept(swap_wil(declval<_Up>(), declval<_Tp>()));\n#else\n            false;\n#endif\n    };\n\n    template <class _Tp, class _Up>\n    struct __nothrow_swappable_with<_Tp, _Up, false> : false_type\n    {\n    };\n\n} // namespace __detail\n\ntemplate <class _Tp>\nstruct __is_swappable : public integral_constant<bool, __detail::__swappable_with<_Tp&>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __is_nothrow_swappable : public integral_constant<bool, __detail::__nothrow_swappable_with<_Tp&>::value>\n{\n};\n\n#if __WI_LIBCPP_STD_VER > 14\n\ntemplate <class _Tp, class _Up>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_swappable_with : public integral_constant<bool, __detail::__swappable_with<_Tp, _Up>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_swappable\n    : public conditional<__is_referenceable<_Tp>::value, is_swappable_with<typename add_lvalue_reference<_Tp>::type, typename add_lvalue_reference<_Tp>::type>, false_type>::type\n{\n};\n\ntemplate <class _Tp, class _Up>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_swappable_with\n    : public integral_constant<bool, __detail::__nothrow_swappable_with<_Tp, _Up>::value>\n{\n};\n\ntemplate <class _Tp>\nstruct __WI_LIBCPP_TEMPLATE_VIS is_nothrow_swappable\n    : public conditional<__is_referenceable<_Tp>::value, is_nothrow_swappable_with<typename add_lvalue_reference<_Tp>::type, typename add_lvalue_reference<_Tp>::type>, false_type>::type\n{\n};\n\ntemplate <class _Tp, class _Up>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_swappable_with_v = is_swappable_with<_Tp, _Up>::value;\n\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_swappable_v = is_swappable<_Tp>::value;\n\ntemplate <class _Tp, class _Up>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with<_Tp, _Up>::value;\n\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<_Tp>::value;\n\n#endif // __WI_LIBCPP_STD_VER > 14\n\n#ifdef __WI_LIBCPP_UNDERLYING_TYPE\n\ntemplate <class _Tp>\nstruct underlying_type\n{\n    typedef __WI_LIBCPP_UNDERLYING_TYPE(_Tp) type;\n};\n\n#if __WI_LIBCPP_STD_VER > 11\ntemplate <class _Tp>\nusing underlying_type_t = typename underlying_type<_Tp>::type;\n#endif\n\n#else // __WI_LIBCPP_UNDERLYING_TYPE\n\ntemplate <class _Tp, bool _Support = false>\nstruct underlying_type\n{\n    static_assert(\n        _Support,\n        \"The underlying_type trait requires compiler \"\n        \"support. Either no such support exists or \"\n        \"libc++ does not know how to use it.\");\n};\n\n#endif // __WI_LIBCPP_UNDERLYING_TYPE\n\ntemplate <class _Tp, bool = is_enum<_Tp>::value>\nstruct __sfinae_underlying_type\n{\n    typedef typename underlying_type<_Tp>::type type;\n    typedef decltype(((type)1) + 0) __promoted_type;\n};\n\ntemplate <class _Tp>\nstruct __sfinae_underlying_type<_Tp, false>\n{\n};\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR int __convert_to_integral(int __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR unsigned __convert_to_integral(unsigned __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR long __convert_to_integral(long __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR unsigned long __convert_to_integral(unsigned long __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR long long __convert_to_integral(long long __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR unsigned long long __convert_to_integral(unsigned long long __val)\n{\n    return __val;\n}\n\ntemplate <typename _Fp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_Fp>::value, long long>::type __convert_to_integral(_Fp __val)\n{\n    return __val;\n}\n\n#ifndef __WI_LIBCPP_HAS_NO_INT128\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR __int128_t __convert_to_integral(__int128_t __val)\n{\n    return __val;\n}\n\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR __uint128_t __convert_to_integral(__uint128_t __val)\n{\n    return __val;\n}\n#endif\n\ntemplate <class _Tp>\ninline __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_CONSTEXPR typename __sfinae_underlying_type<_Tp>::__promoted_type __convert_to_integral(_Tp __val)\n{\n    return __val;\n}\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n\ntemplate <class _Tp>\nstruct __has_operator_addressof_member_imp\n{\n    template <class _Up>\n    static auto __test(int) -> typename __select_2nd<decltype(declval<_Up>().operator&()), true_type>::type;\n    template <class>\n    static auto __test(long) -> false_type;\n\n    static const bool value = decltype(__test<_Tp>(0))::value;\n};\n\ntemplate <class _Tp>\nstruct __has_operator_addressof_free_imp\n{\n    template <class _Up>\n    static auto __test(int) -> typename __select_2nd<decltype(operator&(declval<_Up>())), true_type>::type;\n    template <class>\n    static auto __test(long) -> false_type;\n\n    static const bool value = decltype(__test<_Tp>(0))::value;\n};\n\ntemplate <class _Tp>\nstruct __has_operator_addressof\n    : public integral_constant<bool, __has_operator_addressof_member_imp<_Tp>::value || __has_operator_addressof_free_imp<_Tp>::value>\n{\n};\n\n#endif // __WI_LIBCPP_CXX03_LANG\n\n#ifndef __WI_LIBCPP_CXX03_LANG\n\ntemplate <class...>\nusing void_t = void;\n\n#ifndef __WI_LIBCPP_HAS_NO_VARIADICS\ntemplate <class... _Args>\nstruct conjunction : __and_<_Args...>\n{\n};\ntemplate <class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool conjunction_v = conjunction<_Args...>::value;\n\ntemplate <class... _Args>\nstruct disjunction : __or_<_Args...>\n{\n};\ntemplate <class... _Args>\n__WI_LIBCPP_INLINE_VAR constexpr bool disjunction_v = disjunction<_Args...>::value;\n\ntemplate <class _Tp>\nstruct negation : __not_<_Tp>\n{\n};\ntemplate <class _Tp>\n__WI_LIBCPP_INLINE_VAR constexpr bool negation_v = negation<_Tp>::value;\n#endif // __WI_LIBCPP_HAS_NO_VARIADICS\n#endif // __WI_LIBCPP_CXX03_LANG\n\n// These traits are used in __tree and __hash_table\n#ifndef __WI_LIBCPP_CXX03_LANG\nstruct __extract_key_fail_tag\n{\n};\nstruct __extract_key_self_tag\n{\n};\nstruct __extract_key_first_tag\n{\n};\n\ntemplate <class _ValTy, class _Key, class _RawValTy = typename __unconstref<_ValTy>::type>\nstruct __can_extract_key : conditional<is_same<_RawValTy, _Key>::value, __extract_key_self_tag, __extract_key_fail_tag>::type\n{\n};\n\ntemplate <class _Pair, class _Key, class _First, class _Second>\nstruct __can_extract_key<_Pair, _Key, pair<_First, _Second>>\n    : conditional<is_same<typename remove_const<_First>::type, _Key>::value, __extract_key_first_tag, __extract_key_fail_tag>::type\n{\n};\n\n// __can_extract_map_key uses true_type/false_type instead of the tags.\n// It returns true if _Key != _ContainerValueTy (the container is a map not a set)\n// and _ValTy == _Key.\ntemplate <class _ValTy, class _Key, class _ContainerValueTy, class _RawValTy = typename __unconstref<_ValTy>::type>\nstruct __can_extract_map_key : integral_constant<bool, is_same<_RawValTy, _Key>::value>\n{\n};\n\n// This specialization returns __extract_key_fail_tag for non-map containers\n// because _Key == _ContainerValueTy\ntemplate <class _ValTy, class _Key, class _RawValTy>\nstruct __can_extract_map_key<_ValTy, _Key, _Key, _RawValTy> : false_type\n{\n};\n\n#endif\n\n#if __WI_LIBCPP_STD_VER > 17\nenum class endian\n{\n    little = 0xDEAD,\n    big = 0xFACE,\n#if defined(__WI_LIBCPP_LITTLE_ENDIAN)\n    native = little\n#elif defined(__WI_LIBCPP_BIG_ENDIAN)\n    native = big\n#else\n    native = 0xCAFE\n#endif\n};\n#endif\n} // namespace wistd\n/// @endcond\n\n#endif // _WISTD_TYPE_TRAITS_H_\n"
  },
  {
    "path": "src/windhawk/shared/libraries/wil/wrl.h",
    "content": "//*********************************************************\n//\n//    Copyright (c) Microsoft. All rights reserved.\n//    This code is licensed under the MIT License.\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n//    ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n//    TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n//    PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//\n//*********************************************************\n//! @file\n//! Windows Runtime Library Helpers: helpers for constructing RuntimeClass based objects and agile WRL Callback objects\n#ifndef __WIL_WRL_INCLUDED\n#define __WIL_WRL_INCLUDED\n\n#include <wrl.h>\n#include \"result.h\"\n#include \"common.h\"       // wistd type_traits helpers\n#include <libloaderapi.h> // GetModuleHandleW\n\n/// @cond\nEXTERN_C IMAGE_DOS_HEADER __ImageBase;\n/// @endcond\n\nnamespace wil\n{\n\n#ifdef WIL_ENABLE_EXCEPTIONS\n#pragma region Object construction helpers that throw exceptions\n\n/** Used to construct a RuntimeClass based object that uses 2 phase construction.\nConstruct a RuntimeClass based object that uses 2 phase construction (by implementing\nRuntimeClassInitialize() and returning error codes for failures.\n@code\n    // SomeClass uses 2 phase initialization by implementing RuntimeClassInitialize()\n    auto someClass = MakeAndInitializeOrThrow<SomeClass>(L\"input\", true);\n@endcode\n*/\ntemplate <typename T, typename... TArgs>\nMicrosoft::WRL::ComPtr<T> MakeAndInitializeOrThrow(TArgs&&... args)\n{\n    Microsoft::WRL::ComPtr<T> obj;\n    THROW_IF_FAILED(Microsoft::WRL::MakeAndInitialize<T>(&obj, Microsoft::WRL::Details::Forward<TArgs>(args)...));\n    return obj;\n}\n\n/** Used to construct an RuntimeClass based object that uses exceptions in its constructor (and does\nnot require 2 phase construction).\n@code\n    // SomeClass uses exceptions for error handling in its constructor.\n    auto someClass = MakeOrThrow<SomeClass>(L\"input\", true);\n@endcode\n*/\ntemplate <typename T, typename... TArgs>\nMicrosoft::WRL::ComPtr<T> MakeOrThrow(TArgs&&... args)\n{\n    // This is how you can detect the presence of RuntimeClassInitialize() and find dangerous use.\n    // Unfortunately this produces false positives as all RuntimeClass derived classes have\n    // a RuntimeClassInitialize() method from their base class.\n    // static_assert(!std::is_member_function_pointer<decltype(&T::RuntimeClassInitialize)>::value,\n    //    \"class has a RuntimeClassInitialize member, use MakeAndInitializeOrThrow instead\");\n    auto obj = Microsoft::WRL::Make<T>(Microsoft::WRL::Details::Forward<TArgs>(args)...);\n    THROW_IF_NULL_ALLOC(obj.Get());\n    return obj;\n}\n#pragma endregion\n\n#endif // WIL_ENABLE_EXCEPTIONS\n\n/** By default WRL Callback objects are not agile, use this to make an agile one. Replace use of Callback<> with\nMakeAgileCallback<>. Will return null on failure, translate that into E_OUTOFMEMORY using XXX_IF_NULL_ALLOC() from wil/result.h\nto test the result. */\ntemplate <typename TDelegateInterface, typename... Args>\n::Microsoft::WRL::ComPtr<TDelegateInterface> MakeAgileCallbackNoThrow(Args&&... args) WI_NOEXCEPT\n{\n    using namespace Microsoft::WRL;\n    return Callback<Implements<RuntimeClassFlags<ClassicCom>, TDelegateInterface, FtmBase>>(wistd::forward<Args>(args)...);\n}\n\n#ifdef WIL_ENABLE_EXCEPTIONS\ntemplate <typename TDelegateInterface, typename... Args>\n::Microsoft::WRL::ComPtr<TDelegateInterface> MakeAgileCallback(Args&&... args)\n{\n    auto result = MakeAgileCallbackNoThrow<TDelegateInterface, Args...>(wistd::forward<Args>(args)...);\n    THROW_IF_NULL_ALLOC(result);\n    return result;\n}\n#endif // WIL_ENABLE_EXCEPTIONS\n\n/** Holds a reference to the host WRL module to prevent it from being unloaded.\nNormally, the reference is held implicitly because you are a member function\nof a DLL-hosted COM object, or because you retain a strong reference\nto some DLL-hosted COM object, but if those do not apply to you, then you\nwill need to hold a reference explicitly. For examples (and for the C++/WinRT\nequivalent), see winrt_module_reference.\n*/\nstruct [[nodiscard]] wrl_module_reference\n{\n    wrl_module_reference()\n    {\n        if (auto modulePtr = ::Microsoft::WRL::GetModuleBase())\n        {\n            modulePtr->IncrementObjectCount();\n        }\n        else\n        {\n#ifdef GET_MODULE_HANDLE_EX_FLAG_PIN\n            // If this assertion fails, then you are using wrl_module_reference\n            // from a DLL that does not host WRL objects, and the module reference\n            // has no effect.\n            WI_ASSERT(reinterpret_cast<HMODULE>(&__ImageBase) == GetModuleHandleW(nullptr));\n#endif\n        }\n    }\n\n    wrl_module_reference(wrl_module_reference const&) : wrl_module_reference()\n    {\n    }\n\n    ~wrl_module_reference()\n    {\n        if (auto modulePtr = ::Microsoft::WRL::GetModuleBase())\n        {\n            modulePtr->DecrementObjectCount();\n        }\n    }\n};\n\n} // namespace wil\n\n#endif // __WIL_WRL_INCLUDED\n"
  },
  {
    "path": "src/windhawk/shared/logger_base.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"logger_base.h\"\n\nLoggerBase::LoggerBase(Verbosity initialVerbosity)\n    : m_verbosity(initialVerbosity) {}\n\nvoid LoggerBase::SetVerbosity(Verbosity verbosity) {\n    m_verbosity = verbosity;\n}\n\nLoggerBase::Verbosity LoggerBase::GetVerbosity() {\n    return m_verbosity;\n}\n\nvoid LoggerBase::VLogLine(PCWSTR format, va_list args) {\n    WCHAR buffer[1025];\n    int len = _vsnwprintf_s(buffer, _TRUNCATE, format, args);\n    if (len == -1) {\n        // Truncation occurred.\n        len = _countof(buffer) - 1;\n    }\n\n    while (--len >= 0 && buffer[len] == L'\\n') {\n        // Skip all newlines at the end.\n    }\n\n    // Leave only a single trailing newline.\n    if (buffer[len + 1] == L'\\n' && buffer[len + 2] == L'\\n') {\n        buffer[len + 2] = L'\\0';\n    }\n\n    OutputDebugString(buffer);\n}\n\nvoid LoggerBase::LogLine(PCWSTR format, ...) {\n    va_list args;\n    va_start(args, format);\n    VLogLine(format, args);\n    va_end(args);\n}\n"
  },
  {
    "path": "src/windhawk/shared/logger_base.h",
    "content": "#pragma once\n\nclass LoggerBase {\n   public:\n    enum class Verbosity {\n        kOff,\n        kOn,\n        kVerbose,\n    };\n\n    static constexpr auto kDefaultVerbosity = Verbosity::kOn;\n\n    LoggerBase(Verbosity initialVerbosity);\n\n    void SetVerbosity(Verbosity verbosity);\n    Verbosity GetVerbosity();\n    void VLogLine(PCWSTR format, va_list args);\n    void LogLine(PCWSTR format, ...);\n\n   private:\n    std::atomic<Verbosity> m_verbosity = kDefaultVerbosity;\n};\n"
  },
  {
    "path": "src/windhawk/shared/portable_settings.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"portable_settings.h\"\n\n// Use WIL to throw exceptions if possible.\n#ifdef THROW_WIN32\n#define PORTABLE_SETTINGS_THROW_WIN32(error) THROW_WIN32(error)\n#else\n#define PORTABLE_SETTINGS_THROW_WIN32(error) \\\n    throw PortableSettingsException(error)\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// EnumIteratorImpl\n\ntemplate <typename Type>\nclass EnumIteratorImpl {\n   public:\n    bool is_done() const { return done; }\n\n    const std::pair<std::wstring, Type>& get_item() const { return item; }\n\n    virtual void next() = 0;\n    virtual std::unique_ptr<EnumIteratorImpl> clone() const = 0;\n    virtual ~EnumIteratorImpl() = default;\n\n   protected:\n    EnumIteratorImpl() = default;\n    EnumIteratorImpl(const EnumIteratorImpl&) = default;\n    EnumIteratorImpl(EnumIteratorImpl&&) = default;\n    EnumIteratorImpl& operator=(const EnumIteratorImpl&) = default;\n    EnumIteratorImpl& operator=(EnumIteratorImpl&&) = default;\n\n    bool done = false;\n    std::pair<std::wstring, Type> item;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// EnumIterator\n\ntemplate class PortableSettings::EnumIterator<int>;\ntemplate class PortableSettings::EnumIterator<std::wstring>;\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>::EnumIterator(\n    std::unique_ptr<EnumIteratorImpl<Type>> impl)\n    : impl(std::move(impl)) {}\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>::EnumIterator(const EnumIterator& other)\n    : impl(std::move(other.impl->clone())) {}\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>::EnumIterator(EnumIterator&&) noexcept =\n    default;\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>&\nPortableSettings::EnumIterator<Type>::operator=(const EnumIterator& other) {\n    impl = other.impl->clone();\n    return *this;\n}\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>&\nPortableSettings::EnumIterator<Type>::operator=(EnumIterator&&) noexcept =\n    default;\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>::~EnumIterator() = default;\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>::operator bool() const {\n    return impl->is_done();\n}\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>&\nPortableSettings::EnumIterator<Type>::operator++() {\n    impl->next();\n    return *this;\n}\n\ntemplate <typename Type>\nPortableSettings::EnumIterator<Type>\nPortableSettings::EnumIterator<Type>::operator++(int) {\n    PortableSettings::EnumIterator copy(*this);\n    ++*this;\n    return copy;\n}\n\ntemplate <typename Type>\ntypename PortableSettings::EnumIterator<Type>::value_type\nPortableSettings::EnumIterator<Type>::operator*() const {\n    return impl->get_item();\n}\n\ntemplate <typename Type>\ntypename PortableSettings::EnumIterator<Type>::pointer\nPortableSettings::EnumIterator<Type>::operator->() const {\n    return &impl->get_item();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper functions - RegistrySettings\n\nnamespace {\nnamespace RegistrySettingsHelperFunctions {\n\nint RawItemToInt(std::wstring data, DWORD dwDataSize, DWORD dwType) {\n    int itemValue = 0;\n\n    if (dwType == REG_DWORD && dwDataSize == sizeof(DWORD)) {\n        static_assert(sizeof(int) == sizeof(DWORD));\n        memcpy(&itemValue, data.data(), sizeof(DWORD));\n    } else if (dwType == REG_SZ && (dwDataSize % sizeof(WCHAR)) == 0) {\n        DWORD nStringSize = dwDataSize / sizeof(WCHAR) - 1;\n\n        if (data[nStringSize] == L'\\0' && wcslen(data.c_str()) == nStringSize) {\n            data.resize(nStringSize);\n            long longValue = std::stol(data, nullptr, 0);\n            if (longValue > INT_MAX) {\n                itemValue = INT_MAX;\n            } else if (longValue < INT_MIN) {\n                itemValue = INT_MIN;\n            } else {\n                itemValue = wil::safe_cast<int>(longValue);\n            }\n        }\n    }\n\n    return itemValue;\n}\n\nstd::wstring RawItemToString(std::wstring data,\n                             DWORD dwDataSize,\n                             DWORD dwType) {\n    std::wstring itemValue;\n\n    if (dwType == REG_DWORD && dwDataSize == sizeof(DWORD)) {\n        static_assert(sizeof(int) == sizeof(DWORD));\n        int intValue;\n        memcpy(&intValue, data.data(), sizeof(DWORD));\n        itemValue = std::to_wstring(intValue);\n    } else if (dwType == REG_SZ && (dwDataSize % sizeof(WCHAR)) == 0) {\n        DWORD nStringSize = dwDataSize / sizeof(WCHAR) - 1;\n\n        if (data[nStringSize] == L'\\0' && wcslen(data.c_str()) == nStringSize) {\n            data.resize(nStringSize);\n            itemValue = std::move(data);\n        }\n    }\n\n    return itemValue;\n}\n\nstd::vector<BYTE> RawItemToBuffer(std::wstring data,\n                                  DWORD dwDataSize,\n                                  DWORD dwType) {\n    std::vector<BYTE> itemValue;\n\n    if (dwType == REG_BINARY) {\n        auto dataBytes = reinterpret_cast<const BYTE*>(data.data());\n        itemValue.assign(dataBytes, dataBytes + dwDataSize);\n    }\n\n    return itemValue;\n}\n\n}  // namespace RegistrySettingsHelperFunctions\n}  // namespace\n\n////////////////////////////////////////////////////////////////////////////////\n// EnumIterator - RegistrySettings\n\ntemplate <typename Type>\nclass EnumIteratorRegistryBase : public EnumIteratorImpl<Type> {\n   public:\n    EnumIteratorRegistryBase(HKEY hKey) : hKey(hKey), dwIndex(0) {}\n\n   protected:\n    std::optional<std::tuple<std::wstring, std::wstring, DWORD, DWORD>>\n    get_next_item_raw() {\n        std::wstring valueName;\n        DWORD dwValueNameSize;\n        std::wstring data;\n        DWORD dwDataSize;\n        DWORD dwType;\n        LSTATUS error;\n\n        while (true) {\n            DWORD dwMaxValueNameLen;\n            DWORD dwMaxValueLen;\n            error = RegQueryInfoKey(\n                hKey, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,\n                nullptr, &dwMaxValueNameLen, &dwMaxValueLen, nullptr, nullptr);\n            if (error != ERROR_SUCCESS) {\n                PORTABLE_SETTINGS_THROW_WIN32(error);\n            }\n\n            valueName.resize(wil::safe_cast<size_t>(dwMaxValueNameLen) + 1);\n            dwValueNameSize = dwMaxValueNameLen + 1;\n            data.resize((dwMaxValueLen + sizeof(WCHAR) - 1) / sizeof(WCHAR));\n            dwDataSize = wil::safe_cast<DWORD>(data.length() * sizeof(WCHAR));\n            error = RegEnumValue(\n                hKey, dwIndex, &valueName[0], &dwValueNameSize, nullptr,\n                &dwType, reinterpret_cast<BYTE*>(&data[0]), &dwDataSize);\n            if (error == ERROR_NO_MORE_ITEMS) {\n                return std::nullopt;\n            }\n\n            if (error == ERROR_MORE_DATA) {\n                continue;  // perhaps value was updated, try again\n            }\n\n            if (error != ERROR_SUCCESS) {\n                PORTABLE_SETTINGS_THROW_WIN32(error);\n            }\n\n            break;\n        }\n\n        dwIndex++;\n\n        valueName.resize(dwValueNameSize);\n\n        return std::make_tuple(std::move(valueName), std::move(data),\n                               dwDataSize, dwType);\n    }\n\n    HKEY hKey;\n    DWORD dwIndex;\n};\n\nclass EnumIteratorRegistryInt : public EnumIteratorRegistryBase<int> {\n   public:\n    EnumIteratorRegistryInt(HKEY hKey) : EnumIteratorRegistryBase(hKey) {\n        next();\n    }\n\n    void next() override {\n        auto result = get_next_item_raw();\n        if (!result) {\n            done = true;\n            return;\n        }\n\n        auto& [valueName, data, dwDataSize, dwType] = *result;\n\n        int itemValue = RegistrySettingsHelperFunctions::RawItemToInt(\n            std::move(data), dwDataSize, dwType);\n\n        item = {std::move(valueName), itemValue};\n    }\n\n    std::unique_ptr<EnumIteratorImpl> clone() const override {\n        return std::make_unique<EnumIteratorRegistryInt>(*this);\n    }\n};\n\nclass EnumIteratorRegistryString\n    : public EnumIteratorRegistryBase<std::wstring> {\n   public:\n    EnumIteratorRegistryString(HKEY hKey) : EnumIteratorRegistryBase(hKey) {\n        next();\n    }\n\n    void next() override {\n        auto result = get_next_item_raw();\n        if (!result) {\n            done = true;\n            return;\n        }\n\n        auto& [valueName, data, dwDataSize, dwType] = *result;\n\n        std::wstring itemValue =\n            RegistrySettingsHelperFunctions::RawItemToString(\n                std::move(data), dwDataSize, dwType);\n\n        item = {std::move(valueName), std::move(itemValue)};\n    }\n\n    std::unique_ptr<EnumIteratorImpl> clone() const override {\n        return std::make_unique<EnumIteratorRegistryString>(*this);\n    }\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// RegistrySettings\n\nRegistrySettings::RegistrySettings(HKEY hKey, PCWSTR subKey, bool write) {\n    LSTATUS error =\n        RegCreateKeyEx(hKey, subKey, 0, nullptr, 0,\n                       KEY_READ | (write ? KEY_WRITE : 0) | KEY_WOW64_64KEY,\n                       nullptr, &this->hKey, nullptr);\n    if (error != ERROR_SUCCESS) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nstd::optional<std::wstring> RegistrySettings::GetString(\n    PCWSTR valueName) const {\n    auto rawData = GetRaw(valueName);\n    if (!rawData) {\n        return std::nullopt;\n    }\n\n    return RegistrySettingsHelperFunctions::RawItemToString(\n        std::move(rawData->data), rawData->dataSize, rawData->dataType);\n}\n\nvoid RegistrySettings::SetString(PCWSTR valueName, PCWSTR string) {\n    LSTATUS error = RegSetValueEx(\n        hKey.get(), valueName, 0, REG_SZ, reinterpret_cast<const BYTE*>(string),\n        wil::safe_cast<DWORD>((wcslen(string) + 1) * sizeof(WCHAR)));\n    if (error != ERROR_SUCCESS) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nstd::optional<int> RegistrySettings::GetInt(PCWSTR valueName) const {\n    auto rawData = GetRaw(valueName);\n    if (!rawData) {\n        return std::nullopt;\n    }\n\n    return RegistrySettingsHelperFunctions::RawItemToInt(\n        std::move(rawData->data), rawData->dataSize, rawData->dataType);\n}\n\nvoid RegistrySettings::SetInt(PCWSTR valueName, int value) {\n    DWORD dwValue = static_cast<DWORD>(value);\n\n    LSTATUS error =\n        RegSetValueEx(hKey.get(), valueName, 0, REG_DWORD,\n                      reinterpret_cast<const BYTE*>(&dwValue), sizeof(DWORD));\n    if (error != ERROR_SUCCESS) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nstd::optional<std::vector<BYTE>> RegistrySettings::GetBinary(\n    PCWSTR valueName) const {\n    auto rawData = GetRaw(valueName);\n    if (!rawData) {\n        return std::nullopt;\n    }\n\n    return RegistrySettingsHelperFunctions::RawItemToBuffer(\n        std::move(rawData->data), rawData->dataSize, rawData->dataType);\n}\n\nvoid RegistrySettings::SetBinary(PCWSTR valueName,\n                                 const BYTE* buffer,\n                                 size_t bufferSize) {\n    LSTATUS error = RegSetValueEx(hKey.get(), valueName, 0, REG_BINARY, buffer,\n                                  wil::safe_cast<DWORD>(bufferSize));\n    if (error != ERROR_SUCCESS) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nvoid RegistrySettings::Remove(PCWSTR valueName) {\n    LSTATUS error = RegDeleteValue(hKey.get(), valueName);\n    if (error != ERROR_SUCCESS && error != ERROR_FILE_NOT_FOUND &&\n        error != ERROR_PATH_NOT_FOUND) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nRegistrySettings::EnumIterator<int> RegistrySettings::EnumIntValues() const {\n    return PortableSettings::EnumIterator<int>(\n        std::make_unique<EnumIteratorRegistryInt>(hKey.get()));\n}\n\nRegistrySettings::EnumIterator<std::wstring>\nRegistrySettings::EnumStringValues() const {\n    return PortableSettings::EnumIterator<std::wstring>(\n        std::make_unique<EnumIteratorRegistryString>(hKey.get()));\n}\n\n// static\nvoid RegistrySettings::RemoveSection(HKEY hKey, PCWSTR subKey) {\n    /*\n    wil::unique_hkey hKeyToDelete;\n    LSTATUS error =\n        RegOpenKeyEx(hKey, subKey, 0,\n                     DELETE | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE |\n                         KEY_SET_VALUE | KEY_WOW64_64KEY,\n                     &hKeyToDelete);\n    if (error != ERROR_FILE_NOT_FOUND && error != ERROR_PATH_NOT_FOUND) {\n        if (error != ERROR_SUCCESS) {\n            PORTABLE_SETTINGS_THROW_WIN32(error);\n        }\n\n        error = RegDeleteTree(hKeyToDelete.get(), nullptr);\n        if (error != ERROR_SUCCESS) {\n            PORTABLE_SETTINGS_THROW_WIN32(error);\n        }\n\n        hKeyToDelete.reset();\n    }\n    */\n\n    LSTATUS error = RegDeleteKeyEx(hKey, subKey, KEY_WOW64_64KEY, 0);\n    if (error != ERROR_SUCCESS && error != ERROR_FILE_NOT_FOUND &&\n        error != ERROR_PATH_NOT_FOUND) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nstd::optional<RegistrySettings::RawData> RegistrySettings::GetRaw(\n    PCWSTR valueName) const {\n    std::wstring data;\n    DWORD dataSize;\n    DWORD dataType;\n    LSTATUS error;\n\n    while (true) {\n        error = RegQueryValueEx(hKey.get(), valueName, nullptr, &dataType,\n                                nullptr, &dataSize);\n        if (error == ERROR_FILE_NOT_FOUND || error == ERROR_PATH_NOT_FOUND) {\n            return std::nullopt;\n        } else if (error != ERROR_SUCCESS) {\n            PORTABLE_SETTINGS_THROW_WIN32(error);\n        }\n\n        data.resize((dataSize + sizeof(WCHAR) - 1) / sizeof(WCHAR));\n        dataSize = wil::safe_cast<DWORD>(data.length() * sizeof(WCHAR));\n        error = RegQueryValueEx(hKey.get(), valueName, nullptr, &dataType,\n                                reinterpret_cast<BYTE*>(&data[0]), &dataSize);\n        if (error == ERROR_MORE_DATA) {\n            continue;  // perhaps value was updated, try again\n        } else if (error == ERROR_FILE_NOT_FOUND ||\n                   error == ERROR_PATH_NOT_FOUND) {\n            return std::nullopt;\n        } else if (error != ERROR_SUCCESS) {\n            PORTABLE_SETTINGS_THROW_WIN32(error);\n        }\n\n        break;\n    }\n\n    return RawData{std::move(data), dataSize, dataType};\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper functions - IniFileSettings\n\nnamespace {\nnamespace IniFileSettingsHelperFunctions {\n\nint HexDigitValue(WCHAR hexDigit) {\n    if (hexDigit >= '0' && hexDigit <= '9') {\n        return hexDigit - '0';\n    }\n\n    if (hexDigit >= 'A' && hexDigit <= 'F') {\n        return hexDigit - 'A' + 10;\n    }\n\n    if (hexDigit >= 'a' && hexDigit <= 'f') {\n        return hexDigit - 'a' + 10;\n    }\n\n    throw std::invalid_argument(\"invalid hex digit\");\n}\n\n}  // namespace IniFileSettingsHelperFunctions\n}  // namespace\n\n////////////////////////////////////////////////////////////////////////////////\n// EnumIterator - IniFileSettings\n\ntemplate <typename Type>\nclass EnumIteratorIniFileBase : public EnumIteratorImpl<Type> {\n   public:\n    EnumIteratorIniFileBase(const IniFileSettings* settings)\n        : settings(settings) {\n        for (DWORD size = 256;; size += 256) {\n            SetLastError(0);\n\n            valueNames.resize(size);\n            UINT returnedSize = GetPrivateProfileString(\n                settings->sectionName.c_str(), nullptr, nullptr, &valueNames[0],\n                size, settings->filename.c_str());\n\n            DWORD error = GetLastError();\n            if (error == ERROR_MORE_DATA) {\n                continue;  // try with a larger buffer\n            } else if (error != ERROR_SUCCESS) {\n                PORTABLE_SETTINGS_THROW_WIN32(error);\n            }\n\n            valueNames.resize(returnedSize);\n            break;\n        }\n    }\n\n   protected:\n    std::optional<std::wstring> get_next_value_name() {\n        size_t nextValueNameLen = wcslen(valueNames.c_str());\n        if (nextValueNameLen == 0) {\n            return std::nullopt;\n        }\n\n        std::wstring nextValueName = valueNames.substr(0, nextValueNameLen);\n        valueNames.erase(0, nextValueNameLen + 1);\n\n        return nextValueName;\n    }\n\n    std::optional<std::wstring> get_string(PCWSTR valueName) const {\n        return settings->GetString(valueName);\n    }\n\n    std::optional<int> get_int(PCWSTR valueName) const {\n        return settings->GetInt(valueName);\n    }\n\n    const IniFileSettings* settings;\n    std::wstring valueNames;\n};\n\nclass EnumIteratorIniFileInt : public EnumIteratorIniFileBase<int> {\n   public:\n    EnumIteratorIniFileInt(const IniFileSettings* settings)\n        : EnumIteratorIniFileBase(settings) {\n        next();\n    }\n\n    void next() override {\n        auto valueName = get_next_value_name();\n        if (!valueName) {\n            done = true;\n            return;\n        }\n\n        auto itemValue = get_int(valueName->c_str());\n        if (!itemValue) {\n            done = true;\n            return;\n        }\n\n        item = {std::move(*valueName), *itemValue};\n    }\n\n    std::unique_ptr<EnumIteratorImpl> clone() const override {\n        return std::make_unique<EnumIteratorIniFileInt>(*this);\n    }\n};\n\nclass EnumIteratorIniFileString : public EnumIteratorIniFileBase<std::wstring> {\n   public:\n    EnumIteratorIniFileString(const IniFileSettings* settings)\n        : EnumIteratorIniFileBase(settings) {\n        next();\n    }\n\n    void next() override {\n        auto valueName = get_next_value_name();\n        if (!valueName) {\n            done = true;\n            return;\n        }\n\n        auto itemValue = get_string(valueName->c_str());\n        if (!itemValue) {\n            done = true;\n            return;\n        }\n\n        item = {std::move(*valueName), std::move(*itemValue)};\n    }\n\n    std::unique_ptr<EnumIteratorImpl> clone() const override {\n        return std::make_unique<EnumIteratorIniFileString>(*this);\n    }\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// IniFileSettings\n\nIniFileSettings::IniFileSettings(PCWSTR filename,\n                                 PCWSTR sectionName,\n                                 bool write)\n    : filename(filename), sectionName(sectionName) {\n    if (write) {\n        HANDLE hFile =\n            CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, nullptr,\n                       CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);\n        if (hFile != INVALID_HANDLE_VALUE) {\n            // Write a UTF-16LE BOM to enable Unicode.\n            DWORD dwNumberOfBytesWritten;\n            WriteFile(hFile, \"\\xFF\\xFE\", 2, &dwNumberOfBytesWritten, nullptr);\n            CloseHandle(hFile);\n        }\n    }\n}\n\nstd::optional<std::wstring> IniFileSettings::GetString(PCWSTR valueName) const {\n    std::wstring itemValue;\n\n    for (DWORD size = 256;; size += 256) {\n        SetLastError(0);\n\n        itemValue.resize(size);\n        UINT returnedSize =\n            GetPrivateProfileString(sectionName.c_str(), valueName, nullptr,\n                                    &itemValue[0], size, filename.c_str());\n\n        DWORD error = GetLastError();\n        if (error == ERROR_MORE_DATA) {\n            continue;  // try with a larger buffer\n        } else if (error == ERROR_FILE_NOT_FOUND ||\n                   error == ERROR_PATH_NOT_FOUND) {\n            return std::nullopt;\n        } else if (error != ERROR_SUCCESS) {\n            PORTABLE_SETTINGS_THROW_WIN32(error);\n        }\n\n        itemValue.resize(returnedSize);\n        break;\n    }\n\n    return itemValue;\n}\n\nvoid IniFileSettings::SetString(PCWSTR valueName, PCWSTR string) {\n    std::wstring_view stringView{string};\n\n    bool canBeTrimmed =\n        !stringView.empty() &&\n        ((stringView.front() >= L'\\0' && stringView.front() <= L' ') ||\n         (stringView.back() >= L'\\0' && stringView.back() <= L' '));\n\n    bool isQuoted = stringView.length() >= 2 &&\n                    stringView.front() == stringView.back() &&\n                    (stringView.front() == L'\"' || stringView.front() == L'\\'');\n\n    bool hasNewlines = stringView.find_first_of(L\"\\r\\n\") != stringView.npos;\n\n    std::wstring stringEscaped;\n    PCWSTR stringPtr = string;\n\n    if (canBeTrimmed || isQuoted || hasNewlines) {\n        stringEscaped.reserve(stringView.length() + 2);\n\n        if (canBeTrimmed || isQuoted) {\n            stringEscaped += L'\"';\n        }\n\n        if (hasNewlines) {\n            for (PCWSTR p = string; *p != L'\\0'; p++) {\n                if (*p == L'\\r') {\n                    stringEscaped += L' ';\n                    if (p[1] == L'\\n') {\n                        p++;\n                    }\n                } else if (*p == L'\\n') {\n                    stringEscaped += L' ';\n                } else {\n                    stringEscaped += *p;\n                }\n            }\n        } else {\n            stringEscaped += stringView;\n        }\n\n        if (canBeTrimmed || isQuoted) {\n            stringEscaped += L'\"';\n        }\n\n        stringPtr = stringEscaped.c_str();\n    }\n\n    SetLastError(0);\n\n    WritePrivateProfileString(sectionName.c_str(), valueName, stringPtr,\n                              filename.c_str());\n\n    DWORD error = GetLastError();\n    if (error != ERROR_SUCCESS) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nstd::optional<int> IniFileSettings::GetInt(PCWSTR valueName) const {\n    std::optional<std::wstring> data = GetString(valueName);\n    if (!data) {\n        return std::nullopt;\n    }\n\n    long longValue = std::stol(*data, nullptr, 0);\n    if (longValue > INT_MAX) {\n        return INT_MAX;\n    } else if (longValue < INT_MIN) {\n        return INT_MIN;\n    }\n\n    return wil::safe_cast<int>(longValue);\n}\n\nvoid IniFileSettings::SetInt(PCWSTR valueName, int value) {\n    SetString(valueName, std::to_wstring(value).c_str());\n}\n\nstd::optional<std::vector<BYTE>> IniFileSettings::GetBinary(\n    PCWSTR valueName) const {\n    std::optional<std::wstring> data = GetString(valueName);\n    if (!data) {\n        return std::nullopt;\n    }\n\n    // Adapted from https://stackoverflow.com/a/3382894\n    const auto len = data->length();\n    if (len % 2 != 0) {\n        throw std::invalid_argument(\"odd length\");\n    }\n\n    std::vector<BYTE> result;\n    result.reserve(len / 2);\n    for (auto it = data->begin(); it != data->end();) {\n        int hi = IniFileSettingsHelperFunctions::HexDigitValue(*it++);\n        int lo = IniFileSettingsHelperFunctions::HexDigitValue(*it++);\n        result.push_back(hi << 4 | lo);\n    }\n\n    return result;\n}\n\nvoid IniFileSettings::SetBinary(PCWSTR valueName,\n                                const BYTE* buffer,\n                                size_t bufferSize) {\n    std::wstring binaryStr;\n    binaryStr.reserve(bufferSize * 2);\n\n    static const WCHAR hexDigits[] = L\"0123456789ABCDEF\";\n\n    for (const BYTE* p = buffer; p != buffer + bufferSize; p++) {\n        BYTE b = *p;\n        binaryStr.push_back(hexDigits[b >> 4]);\n        binaryStr.push_back(hexDigits[b & 15]);\n    }\n\n    SetString(valueName, binaryStr.c_str());\n}\n\nvoid IniFileSettings::Remove(PCWSTR valueName) {\n    SetLastError(0);\n\n    WritePrivateProfileString(sectionName.c_str(), valueName, nullptr,\n                              filename.c_str());\n\n    DWORD error = GetLastError();\n    if (error != ERROR_SUCCESS && error != ERROR_FILE_NOT_FOUND &&\n        error != ERROR_PATH_NOT_FOUND) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n\nIniFileSettings::EnumIterator<int> IniFileSettings::EnumIntValues() const {\n    return PortableSettings::EnumIterator<int>(\n        std::make_unique<EnumIteratorIniFileInt>(this));\n}\n\nIniFileSettings::EnumIterator<std::wstring> IniFileSettings::EnumStringValues()\n    const {\n    return PortableSettings::EnumIterator<std::wstring>(\n        std::make_unique<EnumIteratorIniFileString>(this));\n}\n\n// static\nvoid IniFileSettings::RemoveSection(PCWSTR filename, PCWSTR sectionName) {\n    SetLastError(0);\n\n    WritePrivateProfileString(sectionName, nullptr, nullptr, filename);\n\n    DWORD error = GetLastError();\n    if (error != ERROR_SUCCESS && error != ERROR_FILE_NOT_FOUND &&\n        error != ERROR_PATH_NOT_FOUND) {\n        PORTABLE_SETTINGS_THROW_WIN32(error);\n    }\n}\n"
  },
  {
    "path": "src/windhawk/shared/portable_settings.h",
    "content": "#pragma once\n\nclass PortableSettingsException : public std::exception {\n    DWORD error;\n    char errorMessage[sizeof(\"PortableSettingsException 1234567890\")];\n\n   public:\n    PortableSettingsException(DWORD error) : error(error) {\n        sprintf_s(errorMessage, \"PortableSettingsException %u\", error);\n    }\n\n    const char* what() const noexcept override { return errorMessage; }\n\n    DWORD error_code() const noexcept { return error; }\n};\n\ntemplate <typename Type>\nclass EnumIteratorImpl;\n\nclass PortableSettings {\n   public:\n    // Generator pattern in C++: https://stackoverflow.com/a/9060689\n    template <typename Type>\n    class EnumIterator {\n       public:\n        using iterator_category = std::input_iterator_tag;\n        using value_type = std::pair<std::wstring, Type>;\n        using difference_type = std::ptrdiff_t;\n        using pointer = const value_type*;\n        using reference = const value_type&;\n\n        EnumIterator(std::unique_ptr<EnumIteratorImpl<Type>> impl);\n        EnumIterator(const EnumIterator&);\n        EnumIterator(EnumIterator&&) noexcept;\n        EnumIterator& operator=(const EnumIterator&);\n        EnumIterator& operator=(EnumIterator&&) noexcept;\n        ~EnumIterator();\n        explicit operator bool() const;\n        EnumIterator& operator++();    // prefix increment\n        EnumIterator operator++(int);  // postfix increment\n        value_type operator*() const;\n        pointer operator->() const;\n\n       private:\n        std::unique_ptr<EnumIteratorImpl<Type>> impl;\n    };\n\n    PortableSettings(const PortableSettings&) = delete;\n    PortableSettings(PortableSettings&&) = delete;\n    PortableSettings& operator=(const PortableSettings&) = delete;\n    PortableSettings& operator=(PortableSettings&&) = delete;\n    virtual ~PortableSettings() = default;\n    virtual std::optional<std::wstring> GetString(PCWSTR valueName) const = 0;\n    virtual void SetString(PCWSTR valueName, PCWSTR string) = 0;\n    virtual std::optional<int> GetInt(PCWSTR valueName) const = 0;\n    virtual void SetInt(PCWSTR valueName, int value) = 0;\n    virtual std::optional<std::vector<BYTE>> GetBinary(\n        PCWSTR valueName) const = 0;\n    virtual void SetBinary(PCWSTR valueName,\n                           const BYTE* buffer,\n                           size_t bufferSize) = 0;\n    virtual void Remove(PCWSTR valueName) = 0;\n    virtual EnumIterator<int> EnumIntValues() const = 0;\n    virtual EnumIterator<std::wstring> EnumStringValues() const = 0;\n\n   protected:\n    PortableSettings() = default;\n};\n\nclass RegistrySettings : public PortableSettings {\n   public:\n    RegistrySettings(HKEY hKey, PCWSTR subKey, bool write);\n\n    std::optional<std::wstring> GetString(PCWSTR valueName) const override;\n    void SetString(PCWSTR valueName, PCWSTR string) override;\n    std::optional<int> GetInt(PCWSTR valueName) const override;\n    void SetInt(PCWSTR valueName, int value) override;\n    std::optional<std::vector<BYTE>> GetBinary(PCWSTR valueName) const override;\n    void SetBinary(PCWSTR valueName,\n                   const BYTE* buffer,\n                   size_t bufferSize) override;\n    void Remove(PCWSTR valueName) override;\n    EnumIterator<int> EnumIntValues() const override;\n    EnumIterator<std::wstring> EnumStringValues() const override;\n\n    static void RemoveSection(HKEY hKey, PCWSTR subKey);\n\n   private:\n    struct RawData {\n        std::wstring data;\n        DWORD dataSize;\n        DWORD dataType;\n    };\n\n    std::optional<RawData> GetRaw(PCWSTR valueName) const;\n\n    wil::unique_hkey hKey;\n};\n\nclass IniFileSettings : public PortableSettings {\n   public:\n    IniFileSettings(PCWSTR filename, PCWSTR sectionName, bool write);\n\n    std::optional<std::wstring> GetString(PCWSTR valueName) const override;\n    void SetString(PCWSTR valueName, PCWSTR string) override;\n    std::optional<int> GetInt(PCWSTR valueName) const override;\n    void SetInt(PCWSTR valueName, int value) override;\n    std::optional<std::vector<BYTE>> GetBinary(PCWSTR valueName) const override;\n    void SetBinary(PCWSTR valueName,\n                   const BYTE* buffer,\n                   size_t bufferSize) override;\n    void Remove(PCWSTR valueName) override;\n    EnumIterator<int> EnumIntValues() const override;\n    EnumIterator<std::wstring> EnumStringValues() const override;\n\n    static void RemoveSection(PCWSTR filename, PCWSTR sectionName);\n\n   private:\n    template <typename Type>\n    friend class EnumIteratorIniFileBase;\n\n    std::wstring filename;\n    std::wstring sectionName;\n};\n"
  },
  {
    "path": "src/windhawk/shared/version.h",
    "content": "#pragma once\n\n// Version\n#define VERSION_MAJOR               1\n#define VERSION_MINOR               7\n#define VERSION_REVISION            3\n#define VERSION_BUILD               0\n\n// etc.\n#define STRINGIZE2(s)               #s\n#define STRINGIZE(s)                STRINGIZE2(s)\n#define W2(x)                       L ## x\n#define W(x)                        W2(x)\n#define N(x)                        x\n#define LONG_ID(a,b,c,d)            (((a)<<24) | ((b)<<16) | ((c)<<8) | (d))\n\n#define VER_FILE_VERSION            VERSION_MAJOR,VERSION_MINOR,VERSION_REVISION,VERSION_BUILD\n\n#if VERSION_BUILD == 0\n#if VERSION_REVISION == 0 // a.b\n#define VER_FILE_VERSION_TSTR(t)    t(STRINGIZE(VERSION_MAJOR))    t(\".\") \\\n                                    t(STRINGIZE(VERSION_MINOR))\n#else // a.b.c\n#define VER_FILE_VERSION_TSTR(t)    t(STRINGIZE(VERSION_MAJOR))    t(\".\") \\\n                                    t(STRINGIZE(VERSION_MINOR))    t(\".\") \\\n                                    t(STRINGIZE(VERSION_REVISION))\n#endif // VERSION_REVISION == 0\n#else // a.b.c.d\n#define VER_FILE_VERSION_TSTR(t)    t(STRINGIZE(VERSION_MAJOR))    t(\".\") \\\n                                    t(STRINGIZE(VERSION_MINOR))    t(\".\") \\\n                                    t(STRINGIZE(VERSION_REVISION)) t(\".\") \\\n                                    t(STRINGIZE(VERSION_BUILD))\n#endif // VERSION_BUILD == 0\n\n#define VER_FILE_VERSION_STR        VER_FILE_VERSION_TSTR(N)\n#define VER_FILE_VERSION_WSTR       VER_FILE_VERSION_TSTR(W)\n\n#define VER_FILE_VERSION_LONG       LONG_ID(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD)\n"
  },
  {
    "path": "src/windhawk/windhawk.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32901.215\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"engine\", \"engine\\engine.vcxproj\", \"{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"app\", \"app\\app.vcxproj\", \"{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM64 = Debug|ARM64\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|ARM64 = Release|ARM64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Debug|x64.Build.0 = Debug|x64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|Win32.Build.0 = Release|Win32\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|x64.ActiveCfg = Release|x64\n\t\t{16DD1B11-BB29-4015-8BFD-AACD0AF63A79}.Release|x64.Build.0 = Release|x64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Debug|x64.Build.0 = Debug|x64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|Win32.Build.0 = Release|Win32\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|x64.ActiveCfg = Release|x64\n\t\t{0F288B9E-2D98-4728-8C40-CD5C1D1A95FD}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {97781E74-7298-4130-A81F-F8E0984A4661}\n\tEndGlobalSection\nEndGlobal\n"
  }
]